diff --git a/config.json b/config.json index 2a4256a0..01399bdb 100644 --- a/config.json +++ b/config.json @@ -535,7 +535,7 @@ }, { "id": "k3sctl-adapter", - "name": "K3S Control Plane", + "name": "k3s Control Plane", "providerId": "D601", "description": "k3sctl-adapter 是 UniDesk 直管的 k3s 控制平面适配微服务,连接 D601 原生 k3s/k3sctl 控制平面,并通过 k3s 标准服务路由代理 D601/D518 等节点上的代管微服务。", "repository": { diff --git a/src/components/frontend/public/app.js b/src/components/frontend/public/app.js index 4b0ad6e1..6aa11c40 100644 --- a/src/components/frontend/public/app.js +++ b/src/components/frontend/public/app.js @@ -1,41 +1,41 @@ -(()=>{var TK=Object.create;var{getPrototypeOf:EK,defineProperty:Z7,getOwnPropertyNames:ZK}=Object;var OK=Object.prototype.hasOwnProperty;function HK(u){return this[u]}var BK,VK,Pu=(u,l,f)=>{var r=u!=null&&typeof u==="object";if(r){var n=l?BK??=new WeakMap:VK??=new WeakMap,i=n.get(u);if(i)return i}f=u!=null?TK(EK(u)):{};let y=l||!u||!u.__esModule?Z7(f,"default",{value:u,enumerable:!0}):f;for(let t of ZK(u))if(!OK.call(y,t))Z7(y,t,{get:HK.bind(u,t),enumerable:!0});if(r)n.set(u,y);return y};var ir=(u,l)=>()=>(l||u((l={exports:{}}).exports,l),l.exports);var ll=((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 C7=ir((ou)=>{var Xy=Symbol.for("react.element"),DK=Symbol.for("react.portal"),XK=Symbol.for("react.fragment"),SK=Symbol.for("react.strict_mode"),YK=Symbol.for("react.profiler"),pK=Symbol.for("react.provider"),mK=Symbol.for("react.context"),PK=Symbol.for("react.forward_ref"),CK=Symbol.for("react.suspense"),MK=Symbol.for("react.memo"),RK=Symbol.for("react.lazy"),O7=Symbol.iterator;function xK(u){if(u===null||typeof u!=="object")return null;return u=O7&&u[O7]||u["@@iterator"],typeof u==="function"?u:null}var V7={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},D7=Object.assign,X7={};function l1(u,l,f){this.props=u,this.context=l,this.refs=X7,this.updater=f||V7}l1.prototype.isReactComponent={};l1.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")};l1.prototype.forceUpdate=function(u){this.updater.enqueueForceUpdate(this,u,"forceUpdate")};function S7(){}S7.prototype=l1.prototype;function d6(u,l,f){this.props=u,this.context=l,this.refs=X7,this.updater=f||V7}var e6=d6.prototype=new S7;e6.constructor=d6;D7(e6,l1.prototype);e6.isPureReactComponent=!0;var H7=Array.isArray,Y7=Object.prototype.hasOwnProperty,u8={current:null},p7={key:!0,ref:!0,__self:!0,__source:!0};function m7(u,l,f){var r,n={},i=null,y=null;if(l!=null)for(r in l.ref!==void 0&&(y=l.ref),l.key!==void 0&&(i=""+l.key),l)Y7.call(l,r)&&!p7.hasOwnProperty(r)&&(n[r]=l[r]);var t=arguments.length-2;if(t===1)n.children=f;else if(1{M7.exports=C7()});var a7=ir((Nl)=>{function i8(u,l){var f=u.length;u.push(l);u:for(;0>>1,n=u[r];if(0>>1;rA$(t,f))_A$(c,t)?(u[r]=c,u[_]=f,r=_):(u[r]=t,u[y]=f,r=y);else if(_A$(c,f))u[r]=c,u[_]=f,r=_;else break u}}return l}function A$(u,l){var f=u.sortIndex-l.sortIndex;return f!==0?f:u.id-l.id}if(typeof performance==="object"&&typeof performance.now==="function")y8=performance,Nl.unstable_now=function(){return y8.now()};else j$=Date,t8=j$.now(),Nl.unstable_now=function(){return j$.now()-t8};var y8,j$,t8,er=[],d0=[],aK=1,wr=null,Nf=3,Q$=!1,li=!1,Yy=!1,v7=typeof setTimeout==="function"?setTimeout:null,k7=typeof clearTimeout==="function"?clearTimeout:null,b7=typeof setImmediate<"u"?setImmediate:null;typeof navigator<"u"&&navigator.scheduling!==void 0&&navigator.scheduling.isInputPending!==void 0&&navigator.scheduling.isInputPending.bind(navigator.scheduling);function _8(u){for(var l=Sr(d0);l!==null;){if(l.callback===null)J$(d0);else if(l.startTime<=u)J$(d0),l.sortIndex=l.expirationTime,i8(er,l);else break;l=Sr(d0)}}function c8(u){if(Yy=!1,_8(u),!li)if(Sr(er)!==null)li=!0,j8(A8);else{var l=Sr(d0);l!==null&&F8(c8,l.startTime-u)}}function A8(u,l){li=!1,Yy&&(Yy=!1,k7(py),py=-1),Q$=!0;var f=Nf;try{_8(l);for(wr=Sr(er);wr!==null&&(!(wr.expirationTime>l)||u&&!s7());){var r=wr.callback;if(typeof r==="function"){wr.callback=null,Nf=wr.priorityLevel;var n=r(wr.expirationTime<=l);l=Nl.unstable_now(),typeof n==="function"?wr.callback=n:wr===Sr(er)&&J$(er),_8(l)}else J$(er);wr=Sr(er)}if(wr!==null)var i=!0;else{var y=Sr(d0);y!==null&&F8(c8,y.startTime-l),i=!1}return i}finally{wr=null,Nf=f,Q$=!1}}var N$=!1,F$=null,py=-1,I7=5,g7=-1;function s7(){return Nl.unstable_now()-g7u||125r?(u.sortIndex=f,i8(d0,u),Sr(er)===null&&u===Sr(d0)&&(Yy?(k7(py),py=-1):Yy=!0,F8(c8,f-r))):(u.sortIndex=n,i8(er,u),li||Q$||(li=!0,j8(A8))),u};Nl.unstable_shouldYield=s7;Nl.unstable_wrapCallback=function(u){var l=Nf;return function(){var f=Nf;Nf=l;try{return u.apply(this,arguments)}finally{Nf=f}}}});var d7=ir((qm,o7)=>{o7.exports=a7()});var uJ=ir((Ar)=>{var oK=Jl(),$r=d7();function Ju(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"),Y8=Object.prototype.hasOwnProperty,dK=/^[: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]*$/,e7={},uj={};function eK(u){if(Y8.call(uj,u))return!0;if(Y8.call(e7,u))return!1;if(dK.test(u))return uj[u]=!0;return e7[u]=!0,!1}function uG(u,l,f,r){if(f!==null&&f.type===0)return!1;switch(typeof l){case"function":case"symbol":return!0;case"boolean":if(r)return!1;if(f!==null)return!f.acceptsBooleans;return u=u.toLowerCase().slice(0,5),u!=="data-"&&u!=="aria-";default:return!1}}function lG(u,l,f,r){if(l===null||typeof l>"u"||uG(u,l,f,r))return!0;if(r)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 Df(u,l,f,r,n,i,y){this.acceptsBooleans=l===2||l===3||l===4,this.attributeName=r,this.attributeNamespace=n,this.mustUseProperty=f,this.propertyName=u,this.type=l,this.sanitizeURL=i,this.removeEmptyString=y}var cf={};"children dangerouslySetInnerHTML defaultValue defaultChecked innerHTML suppressContentEditableWarning suppressHydrationWarning style".split(" ").forEach(function(u){cf[u]=new Df(u,0,!1,u,null,!1,!1)});[["acceptCharset","accept-charset"],["className","class"],["htmlFor","for"],["httpEquiv","http-equiv"]].forEach(function(u){var l=u[0];cf[l]=new Df(l,1,!1,u[1],null,!1,!1)});["contentEditable","draggable","spellCheck","value"].forEach(function(u){cf[u]=new Df(u,2,!1,u.toLowerCase(),null,!1,!1)});["autoReverse","externalResourcesRequired","focusable","preserveAlpha"].forEach(function(u){cf[u]=new Df(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){cf[u]=new Df(u,3,!1,u.toLowerCase(),null,!1,!1)});["checked","multiple","muted","selected"].forEach(function(u){cf[u]=new Df(u,3,!0,u,null,!1,!1)});["capture","download"].forEach(function(u){cf[u]=new Df(u,4,!1,u,null,!1,!1)});["cols","rows","size","span"].forEach(function(u){cf[u]=new Df(u,6,!1,u,null,!1,!1)});["rowSpan","start"].forEach(function(u){cf[u]=new Df(u,5,!1,u.toLowerCase(),null,!1,!1)});var H4=/[\-:]([a-z])/g;function B4(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(H4,B4);cf[l]=new Df(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(H4,B4);cf[l]=new Df(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(H4,B4);cf[l]=new Df(l,1,!1,u,"http://www.w3.org/XML/1998/namespace",!1,!1)});["tabIndex","crossOrigin"].forEach(function(u){cf[u]=new Df(u,1,!1,u.toLowerCase(),null,!1,!1)});cf.xlinkHref=new Df("xlinkHref",1,!1,"xlink:href","http://www.w3.org/1999/xlink",!0,!1);["src","href","action","formAction"].forEach(function(u){cf[u]=new Df(u,1,!1,u.toLowerCase(),null,!0,!0)});function V4(u,l,f,r){var n=cf.hasOwnProperty(l)?cf[l]:null;if(n!==null?n.type!==0:r||!(2{var hT=Object.create;var{getPrototypeOf:xT,defineProperty:M7,getOwnPropertyNames:bT}=Object;var vT=Object.prototype.hasOwnProperty;function kT(u){return this[u]}var IT,gT,Cu=(u,l,f)=>{var r=u!=null&&typeof u==="object";if(r){var n=l?IT??=new WeakMap:gT??=new WeakMap,i=n.get(u);if(i)return i}f=u!=null?hT(xT(u)):{};let t=l||!u||!u.__esModule?M7(f,"default",{value:u,enumerable:!0}):f;for(let y of bT(u))if(!vT.call(t,y))M7(t,y,{get:kT.bind(u,y),enumerable:!0});if(r)n.set(u,t);return t};var yr=(u,l)=>()=>(l||u((l={exports:{}}).exports,l),l.exports);var fl=((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 d7=yr((du)=>{var Cy=Symbol.for("react.element"),sT=Symbol.for("react.portal"),aT=Symbol.for("react.fragment"),oT=Symbol.for("react.strict_mode"),dT=Symbol.for("react.profiler"),eT=Symbol.for("react.provider"),uK=Symbol.for("react.context"),lK=Symbol.for("react.forward_ref"),fK=Symbol.for("react.suspense"),rK=Symbol.for("react.memo"),nK=Symbol.for("react.lazy"),R7=Symbol.iterator;function iK(u){if(u===null||typeof u!=="object")return null;return u=R7&&u[R7]||u["@@iterator"],typeof u==="function"?u:null}var b7={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},v7=Object.assign,k7={};function $t(u,l,f){this.props=u,this.context=l,this.refs=k7,this.updater=f||b7}$t.prototype.isReactComponent={};$t.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")};$t.prototype.forceUpdate=function(u){this.updater.enqueueForceUpdate(this,u,"forceUpdate")};function I7(){}I7.prototype=$t.prototype;function y6(u,l,f){this.props=u,this.context=l,this.refs=k7,this.updater=f||b7}var c6=y6.prototype=new I7;c6.constructor=y6;v7(c6,$t.prototype);c6.isPureReactComponent=!0;var h7=Array.isArray,g7=Object.prototype.hasOwnProperty,_6={current:null},s7={key:!0,ref:!0,__self:!0,__source:!0};function a7(u,l,f){var r,n={},i=null,t=null;if(l!=null)for(r in l.ref!==void 0&&(t=l.ref),l.key!==void 0&&(i=""+l.key),l)g7.call(l,r)&&!s7.hasOwnProperty(r)&&(n[r]=l[r]);var y=arguments.length-2;if(y===1)n.children=f;else if(1{e7.exports=d7()});var _j=yr((ql)=>{function U6(u,l){var f=u.length;u.push(l);u:for(;0>>1,n=u[r];if(0>>1;rJ_(y,f))cJ_($,y)?(u[r]=$,u[c]=f,r=c):(u[r]=y,u[t]=f,r=t);else if(cJ_($,f))u[r]=$,u[c]=f,r=c;else break u}}return l}function J_(u,l){var f=u.sortIndex-l.sortIndex;return f!==0?f:u.id-l.id}if(typeof performance==="object"&&typeof performance.now==="function")J6=performance,ql.unstable_now=function(){return J6.now()};else Q_=Date,Q6=Q_.now(),ql.unstable_now=function(){return Q_.now()-Q6};var J6,Q_,Q6,tn=[],i0=[],FK=1,Kr=null,qf=3,W_=!1,$i=!1,Ry=!1,nj=typeof setTimeout==="function"?setTimeout:null,ij=typeof clearTimeout==="function"?clearTimeout:null,rj=typeof setImmediate<"u"?setImmediate:null;typeof navigator<"u"&&navigator.scheduling!==void 0&&navigator.scheduling.isInputPending!==void 0&&navigator.scheduling.isInputPending.bind(navigator.scheduling);function N6(u){for(var l=Mr(i0);l!==null;){if(l.callback===null)w_(i0);else if(l.startTime<=u)w_(i0),l.sortIndex=l.expirationTime,U6(tn,l);else break;l=Mr(i0)}}function w6(u){if(Ry=!1,N6(u),!$i)if(Mr(tn)!==null)$i=!0,L6(W6);else{var l=Mr(i0);l!==null&&T6(w6,l.startTime-u)}}function W6(u,l){$i=!1,Ry&&(Ry=!1,ij(hy),hy=-1),W_=!0;var f=qf;try{N6(l);for(Kr=Mr(tn);Kr!==null&&(!(Kr.expirationTime>l)||u&&!cj());){var r=Kr.callback;if(typeof r==="function"){Kr.callback=null,qf=Kr.priorityLevel;var n=r(Kr.expirationTime<=l);l=ql.unstable_now(),typeof n==="function"?Kr.callback=n:Kr===Mr(tn)&&w_(tn),N6(l)}else w_(tn);Kr=Mr(tn)}if(Kr!==null)var i=!0;else{var t=Mr(i0);t!==null&&T6(w6,t.startTime-l),i=!1}return i}finally{Kr=null,qf=f,W_=!1}}var L_=!1,N_=null,hy=-1,tj=5,yj=-1;function cj(){return ql.unstable_now()-yju||125r?(u.sortIndex=f,U6(i0,u),Mr(tn)===null&&u===Mr(i0)&&(Ry?(ij(hy),hy=-1):Ry=!0,T6(w6,f-r))):(u.sortIndex=n,U6(tn,u),$i||W_||($i=!0,L6(W6))),u};ql.unstable_shouldYield=cj;ql.unstable_wrapCallback=function(u){var l=qf;return function(){var f=qf;qf=l;try{return u.apply(this,arguments)}finally{qf=f}}}});var Aj=yr((PY,$j)=>{$j.exports=_j()});var FJ=yr((Fr)=>{var UK=Fl(),Ar=Aj();function Ju(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"),b6=Object.prototype.hasOwnProperty,JK=/^[: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]*$/,jj={},Fj={};function QK(u){if(b6.call(Fj,u))return!0;if(b6.call(jj,u))return!1;if(JK.test(u))return Fj[u]=!0;return jj[u]=!0,!1}function NK(u,l,f,r){if(f!==null&&f.type===0)return!1;switch(typeof l){case"function":case"symbol":return!0;case"boolean":if(r)return!1;if(f!==null)return!f.acceptsBooleans;return u=u.toLowerCase().slice(0,5),u!=="data-"&&u!=="aria-";default:return!1}}function qK(u,l,f,r){if(l===null||typeof l>"u"||NK(u,l,f,r))return!0;if(r)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 Df(u,l,f,r,n,i,t){this.acceptsBooleans=l===2||l===3||l===4,this.attributeName=r,this.attributeNamespace=n,this.mustUseProperty=f,this.propertyName=u,this.type=l,this.sanitizeURL=i,this.removeEmptyString=t}var Ff={};"children dangerouslySetInnerHTML defaultValue defaultChecked innerHTML suppressContentEditableWarning suppressHydrationWarning style".split(" ").forEach(function(u){Ff[u]=new Df(u,0,!1,u,null,!1,!1)});[["acceptCharset","accept-charset"],["className","class"],["htmlFor","for"],["httpEquiv","http-equiv"]].forEach(function(u){var l=u[0];Ff[l]=new Df(l,1,!1,u[1],null,!1,!1)});["contentEditable","draggable","spellCheck","value"].forEach(function(u){Ff[u]=new Df(u,2,!1,u.toLowerCase(),null,!1,!1)});["autoReverse","externalResourcesRequired","focusable","preserveAlpha"].forEach(function(u){Ff[u]=new Df(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){Ff[u]=new Df(u,3,!1,u.toLowerCase(),null,!1,!1)});["checked","multiple","muted","selected"].forEach(function(u){Ff[u]=new Df(u,3,!0,u,null,!1,!1)});["capture","download"].forEach(function(u){Ff[u]=new Df(u,4,!1,u,null,!1,!1)});["cols","rows","size","span"].forEach(function(u){Ff[u]=new Df(u,6,!1,u,null,!1,!1)});["rowSpan","start"].forEach(function(u){Ff[u]=new Df(u,5,!1,u.toLowerCase(),null,!1,!1)});var P8=/[\-:]([a-z])/g;function C8(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(P8,C8);Ff[l]=new Df(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(P8,C8);Ff[l]=new Df(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(P8,C8);Ff[l]=new Df(l,1,!1,u,"http://www.w3.org/XML/1998/namespace",!1,!1)});["tabIndex","crossOrigin"].forEach(function(u){Ff[u]=new Df(u,1,!1,u.toLowerCase(),null,!1,!1)});Ff.xlinkHref=new Df("xlinkHref",1,!1,"xlink:href","http://www.w3.org/1999/xlink",!0,!1);["src","href","action","formAction"].forEach(function(u){Ff[u]=new Df(u,1,!1,u.toLowerCase(),null,!0,!0)});function M8(u,l,f,r){var n=Ff.hasOwnProperty(l)?Ff[l]:null;if(n!==null?n.type!==0:r||!(2t||n[y]!==i[t]){var _=` -`+n[y].replace(" at new "," at ");return u.displayName&&_.includes("")&&(_=_.replace("",u.displayName)),_}while(1<=y&&0<=t);break}}}finally{J8=!1,Error.prepareStackTrace=f}return(u=u?u.displayName||u.name:"")?by(u):""}function fG(u){switch(u.tag){case 5:return by(u.type);case 16:return by("Lazy");case 13:return by("Suspense");case 19:return by("SuspenseList");case 0:case 2:case 15:return u=Q8(u.type,!1),u;case 11:return u=Q8(u.type.render,!1),u;case 1:return u=Q8(u.type,!0),u;default:return""}}function C8(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 i1:return"Fragment";case n1:return"Portal";case p8:return"Profiler";case D4:return"StrictMode";case m8:return"Suspense";case P8:return"SuspenseList"}if(typeof u==="object")switch(u.$$typeof){case iF:return(u.displayName||"Context")+".Consumer";case nF:return(u._context.displayName||"Context")+".Provider";case X4:var l=u.render;return u=u.displayName,u||(u=l.displayName||l.name||"",u=u!==""?"ForwardRef("+u+")":"ForwardRef"),u;case S4:return l=u.displayName||null,l!==null?l:C8(u.type)||"Memo";case un:l=u._payload,u=u._init;try{return C8(u(l))}catch(f){}}return null}function rG(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 C8(l);case 8:return l===D4?"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 Jn(u){switch(typeof u){case"boolean":case"number":case"string":case"undefined":return u;case"object":return u;default:return""}}function tF(u){var l=u.type;return(u=u.nodeName)&&u.toLowerCase()==="input"&&(l==="checkbox"||l==="radio")}function nG(u){var l=tF(u)?"checked":"value",f=Object.getOwnPropertyDescriptor(u.constructor.prototype,l),r=""+u[l];if(!u.hasOwnProperty(l)&&typeof f<"u"&&typeof f.get==="function"&&typeof f.set==="function"){var{get:n,set:i}=f;return Object.defineProperty(u,l,{configurable:!0,get:function(){return n.call(this)},set:function(y){r=""+y,i.call(this,y)}}),Object.defineProperty(u,l,{enumerable:f.enumerable}),{getValue:function(){return r},setValue:function(y){r=""+y},stopTracking:function(){u._valueTracker=null,delete u[l]}}}}function W$(u){u._valueTracker||(u._valueTracker=nG(u))}function _F(u){if(!u)return!1;var l=u._valueTracker;if(!l)return!0;var f=l.getValue(),r="";return u&&(r=tF(u)?u.checked?"true":"false":u.value),u=r,u!==f?(l.setValue(u),!0):!1}function b$(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 M8(u,l){var f=l.checked;return Bl({},l,{defaultChecked:void 0,defaultValue:void 0,value:void 0,checked:f!=null?f:u._wrapperState.initialChecked})}function fj(u,l){var f=l.defaultValue==null?"":l.defaultValue,r=l.checked!=null?l.checked:l.defaultChecked;f=Jn(l.value!=null?l.value:f),u._wrapperState={initialChecked:r,initialValue:f,controlled:l.type==="checkbox"||l.type==="radio"?l.checked!=null:l.value!=null}}function $F(u,l){l=l.checked,l!=null&&V4(u,"checked",l,!1)}function R8(u,l){$F(u,l);var f=Jn(l.value),r=l.type;if(f!=null)if(r==="number"){if(f===0&&u.value===""||u.value!=f)u.value=""+f}else u.value!==""+f&&(u.value=""+f);else if(r==="submit"||r==="reset"){u.removeAttribute("value");return}l.hasOwnProperty("value")?x8(u,l.type,f):l.hasOwnProperty("defaultValue")&&x8(u,l.type,Jn(l.defaultValue)),l.checked==null&&l.defaultChecked!=null&&(u.defaultChecked=!!l.defaultChecked)}function rj(u,l,f){if(l.hasOwnProperty("value")||l.hasOwnProperty("defaultValue")){var r=l.type;if(!(r!=="submit"&&r!=="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 x8(u,l,f){if(l!=="number"||b$(u.ownerDocument)!==u)f==null?u.defaultValue=""+u._wrapperState.initialValue:u.defaultValue!==""+f&&(u.defaultValue=""+f)}var vy=Array.isArray;function Q1(u,l,f,r){if(u=u.options,l){l={};for(var n=0;n"+l.valueOf().toString()+"";for(l=w$.firstChild;u.firstChild;)u.removeChild(u.firstChild);for(;l.firstChild;)u.appendChild(l.firstChild)}});function _t(u,l){if(l){var f=u.firstChild;if(f&&f===u.lastChild&&f.nodeType===3){f.nodeValue=l;return}}u.textContent=l}var dy={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},iG=["Webkit","ms","Moz","O"];Object.keys(dy).forEach(function(u){iG.forEach(function(l){l=l+u.charAt(0).toUpperCase()+u.substring(1),dy[l]=dy[u]})});function FF(u,l,f){return l==null||typeof l==="boolean"||l===""?"":f||typeof l!=="number"||l===0||dy.hasOwnProperty(u)&&dy[u]?(""+l).trim():l+"px"}function UF(u,l){u=u.style;for(var f in l)if(l.hasOwnProperty(f)){var r=f.indexOf("--")===0,n=FF(f,l[f],r);f==="float"&&(f="cssFloat"),r?u.setProperty(f,n):u[f]=n}}var yG=Bl({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 v8(u,l){if(l){if(yG[u]&&(l.children!=null||l.dangerouslySetInnerHTML!=null))throw Error(Ju(137,u));if(l.dangerouslySetInnerHTML!=null){if(l.children!=null)throw Error(Ju(60));if(typeof l.dangerouslySetInnerHTML!=="object"||!("__html"in l.dangerouslySetInnerHTML))throw Error(Ju(61))}if(l.style!=null&&typeof l.style!=="object")throw Error(Ju(62))}}function k8(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 I8=null;function Y4(u){return u=u.target||u.srcElement||window,u.correspondingUseElement&&(u=u.correspondingUseElement),u.nodeType===3?u.parentNode:u}var g8=null,N1=null,q1=null;function yj(u){if(u=Et(u)){if(typeof g8!=="function")throw Error(Ju(280));var l=u.stateNode;l&&(l=q3(l),g8(u.stateNode,u.type,l))}}function JF(u){N1?q1?q1.push(u):q1=[u]:N1=u}function QF(){if(N1){var u=N1,l=q1;if(q1=N1=null,yj(u),l)for(u=0;u>>=0,u===0?32:31-(NG(u)/qG|0)|0}var L$=64,K$=4194304;function ky(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 g$(u,l){var f=u.pendingLanes;if(f===0)return 0;var r=0,n=u.suspendedLanes,i=u.pingedLanes,y=f&268435455;if(y!==0){var t=y&~n;t!==0?r=ky(t):(i&=y,i!==0&&(r=ky(i)))}else y=f&~n,y!==0?r=ky(y):i!==0&&(r=ky(i));if(r===0)return 0;if(l!==0&&l!==r&&(l&n)===0&&(n=r&-r,i=l&-l,n>=i||n===16&&(i&4194240)!==0))return l;if((r&4)!==0&&(r|=f&16),l=u.entangledLanes,l!==0)for(u=u.entanglements,l&=r;0f;f++)l.push(u);return l}function zt(u,l,f){u.pendingLanes|=l,l!==536870912&&(u.suspendedLanes=0,u.pingedLanes=0),u=u.eventTimes,l=31-Cr(l),u[l]=f}function KG(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 r=u.eventTimes;for(u=u.expirationTimes;0=ut),Jj=String.fromCharCode(32),Qj=!1;function pF(u,l){switch(u){case"keyup":return aG.indexOf(l.keyCode)!==-1;case"keydown":return l.keyCode!==229;case"keypress":case"mousedown":case"focusout":return!0;default:return!1}}function mF(u){return u=u.detail,typeof u==="object"&&"data"in u?u.data:null}var y1=!1;function dG(u,l){switch(u){case"compositionend":return mF(l);case"keypress":if(l.which!==32)return null;return Qj=!0,Jj;case"textInput":return u=l.data,u===Jj&&Qj?null:u;default:return null}}function eG(u,l){if(y1)return u==="compositionend"||!h4&&pF(u,l)?(u=SF(),S$=M4=nn=null,y1=!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=r}u:{for(;f;){if(f.nextSibling){f=f.nextSibling;break u}f=f.parentNode}f=void 0}f=Wj(f)}}function RF(u,l){return u&&l?u===l?!0:u&&u.nodeType===3?!1:l&&l.nodeType===3?RF(u,l.parentNode):("contains"in u)?u.contains(l):u.compareDocumentPosition?!!(u.compareDocumentPosition(l)&16):!1:!1}function xF(){for(var u=window,l=b$();l instanceof u.HTMLIFrameElement;){try{var f=typeof l.contentWindow.location.href==="string"}catch(r){f=!1}if(f)u=l.contentWindow;else break;l=b$(u.document)}return l}function b4(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 _z(u){var l=xF(),f=u.focusedElem,r=u.selectionRange;if(l!==f&&f&&f.ownerDocument&&RF(f.ownerDocument.documentElement,f)){if(r!==null&&b4(f)){if(l=r.start,u=r.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 n=f.textContent.length,i=Math.min(r.start,n);r=r.end===void 0?i:Math.min(r.end,n),!u.extend&&i>r&&(n=r,r=i,i=n),n=wj(f,i);var y=wj(f,r);n&&y&&(u.rangeCount!==1||u.anchorNode!==n.node||u.anchorOffset!==n.offset||u.focusNode!==y.node||u.focusOffset!==y.offset)&&(l=l.createRange(),l.setStart(n.node,n.offset),u.removeAllRanges(),i>r?(u.addRange(l),u.extend(y.node,y.offset)):(l.setEnd(y.node,y.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,t1=null,u4=null,ft=null,l4=!1;function Lj(u,l,f){var r=f.window===f?f.document:f.nodeType===9?f:f.ownerDocument;l4||t1==null||t1!==b$(r)||(r=t1,("selectionStart"in r)&&b4(r)?r={start:r.selectionStart,end:r.selectionEnd}:(r=(r.ownerDocument&&r.ownerDocument.defaultView||window).getSelection(),r={anchorNode:r.anchorNode,anchorOffset:r.anchorOffset,focusNode:r.focusNode,focusOffset:r.focusOffset}),ft&&Ut(ft,r)||(ft=r,r=o$(u4,"onSelect"),0c1||(u.current=$4[c1],$4[c1]=null,c1--)}function ql(u,l){c1++,$4[c1]=u.current,u.current=l}var Qn={},Lf=qn(Qn),hf=qn(!1),ci=Qn;function G1(u,l){var f=u.type.contextTypes;if(!f)return Qn;var r=u.stateNode;if(r&&r.__reactInternalMemoizedUnmaskedChildContext===l)return r.__reactInternalMemoizedMaskedChildContext;var n={},i;for(i in f)n[i]=l[i];return r&&(u=u.stateNode,u.__reactInternalMemoizedUnmaskedChildContext=l,u.__reactInternalMemoizedMaskedChildContext=n),n}function bf(u){return u=u.childContextTypes,u!==null&&u!==void 0}function e$(){Kl(hf),Kl(Lf)}function Oj(u,l,f){if(Lf.current!==Qn)throw Error(Ju(168));ql(Lf,l),ql(hf,f)}function oF(u,l,f){var r=u.stateNode;if(l=l.childContextTypes,typeof r.getChildContext!=="function")return f;r=r.getChildContext();for(var n in r)if(!(n in l))throw Error(Ju(108,rG(u)||"Unknown",n));return Bl({},f,r)}function u3(u){return u=(u=u.stateNode)&&u.__reactInternalMemoizedMergedChildContext||Qn,ci=Lf.current,ql(Lf,u),ql(hf,hf.current),!0}function Hj(u,l,f){var r=u.stateNode;if(!r)throw Error(Ju(169));f?(u=oF(u,l,ci),r.__reactInternalMemoizedMergedChildContext=u,Kl(hf),Kl(Lf),ql(Lf,u)):Kl(hf),ql(hf,f)}var K0=null,W3=!1,E8=!1;function dF(u){K0===null?K0=[u]:K0.push(u)}function qz(u){W3=!0,dF(u)}function Wn(){if(!E8&&K0!==null){E8=!0;var u=0,l=$l;try{var f=K0;for($l=1;u>=y,n-=y,G0=1<<32-Cr(l)+n|f<E?(D=H,H=null):D=H.sibling;var h=F(U,H,q[E],W);if(h===null){H===null&&(H=D);break}u&&H&&h.alternate===null&&l(U,H),N=i(h,N,E),Z===null?z=h:Z.sibling=h,Z=h,H=D}if(E===q.length)return f(U,H),Tl&&ri(U,E),z;if(H===null){for(;EE?(D=H,H=null):D=H.sibling;var V=F(U,H,h.value,W);if(V===null){H===null&&(H=D);break}u&&H&&V.alternate===null&&l(U,H),N=i(V,N,E),Z===null?z=V:Z.sibling=V,Z=V,H=D}if(h.done)return f(U,H),Tl&&ri(U,E),z;if(H===null){for(;!h.done;E++,h=q.next())h=j(U,h.value,W),h!==null&&(N=i(h,N,E),Z===null?z=h:Z.sibling=h,Z=h);return Tl&&ri(U,E),z}for(H=r(U,H);!h.done;E++,h=q.next())h=J(H,U,E,h.value,W),h!==null&&(u&&h.alternate!==null&&H.delete(h.key===null?E:h.key),N=i(h,N,E),Z===null?z=h:Z.sibling=h,Z=h);return u&&H.forEach(function(S){return l(U,S)}),Tl&&ri(U,E),z}function L(U,N,q,W){if(typeof q==="object"&&q!==null&&q.type===i1&&q.key===null&&(q=q.props.children),typeof q==="object"&&q!==null){switch(q.$$typeof){case q$:u:{for(var z=q.key,Z=N;Z!==null;){if(Z.key===z){if(z=q.type,z===i1){if(Z.tag===7){f(U,Z.sibling),N=n(Z,q.props.children),N.return=U,U=N;break u}}else if(Z.elementType===z||typeof z==="object"&&z!==null&&z.$$typeof===un&&Dj(z)===Z.type){f(U,Z.sibling),N=n(Z,q.props),N.ref=Ry(U,Z,q),N.return=U,U=N;break u}f(U,Z);break}else l(U,Z);Z=Z.sibling}q.type===i1?(N=$i(q.props.children,U.mode,W,q.key),N.return=U,U=N):(W=h$(q.type,q.key,q.props,null,U.mode,W),W.ref=Ry(U,N,q),W.return=U,U=W)}return y(U);case n1:u:{for(Z=q.key;N!==null;){if(N.key===Z)if(N.tag===4&&N.stateNode.containerInfo===q.containerInfo&&N.stateNode.implementation===q.implementation){f(U,N.sibling),N=n(N,q.children||[]),N.return=U,U=N;break u}else{f(U,N);break}else l(U,N);N=N.sibling}N=S8(q,U.mode,W),N.return=U,U=N}return y(U);case un:return Z=q._init,L(U,N,Z(q._payload),W)}if(vy(q))return Q(U,N,q,W);if(my(q))return w(U,N,q,W);H$(U,q)}return typeof q==="string"&&q!==""||typeof q==="number"?(q=""+q,N!==null&&N.tag===6?(f(U,N.sibling),N=n(N,q),N.return=U,U=N):(f(U,N),N=X8(q,U.mode,W),N.return=U,U=N),y(U)):f(U,N)}return L}var T1=fU(!0),rU=fU(!1),r3=qn(null),n3=null,F1=null,g4=null;function s4(){g4=F1=n3=null}function a4(u){var l=r3.current;Kl(r3),u._currentValue=l}function j4(u,l,f){for(;u!==null;){var r=u.alternate;if((u.childLanes&l)!==l?(u.childLanes|=l,r!==null&&(r.childLanes|=l)):r!==null&&(r.childLanes&l)!==l&&(r.childLanes|=l),u===f)break;u=u.return}}function w1(u,l){n3=u,g4=F1=null,u=u.dependencies,u!==null&&u.firstContext!==null&&((u.lanes&l)!==0&&(xf=!0),u.firstContext=null)}function Tr(u){var l=u._currentValue;if(g4!==u)if(u={context:u,memoizedValue:l,next:null},F1===null){if(n3===null)throw Error(Ju(308));F1=u,n3.dependencies={lanes:0,firstContext:u}}else F1=F1.next=u;return l}var yi=null;function o4(u){yi===null?yi=[u]:yi.push(u)}function nU(u,l,f,r){var n=l.interleaved;return n===null?(f.next=f,o4(l)):(f.next=n.next,n.next=f),l.interleaved=f,O0(u,r)}function O0(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 ln=!1;function d4(u){u.updateQueue={baseState:u.memoizedState,firstBaseUpdate:null,lastBaseUpdate:null,shared:{pending:null,interleaved:null,lanes:0},effects:null}}function iU(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 T0(u,l){return{eventTime:u,lane:l,tag:0,payload:null,callback:null,next:null}}function An(u,l,f){var r=u.updateQueue;if(r===null)return null;if(r=r.shared,(rl&2)!==0){var n=r.pending;return n===null?l.next=l:(l.next=n.next,n.next=l),r.pending=l,O0(u,f)}return n=r.interleaved,n===null?(l.next=l,o4(r)):(l.next=n.next,n.next=l),r.interleaved=l,O0(u,f)}function m$(u,l,f){if(l=l.updateQueue,l!==null&&(l=l.shared,(f&4194240)!==0)){var r=l.lanes;r&=u.pendingLanes,f|=r,l.lanes=f,m4(u,f)}}function Xj(u,l){var{updateQueue:f,alternate:r}=u;if(r!==null&&(r=r.updateQueue,f===r)){var n=null,i=null;if(f=f.firstBaseUpdate,f!==null){do{var y={eventTime:f.eventTime,lane:f.lane,tag:f.tag,payload:f.payload,callback:f.callback,next:null};i===null?n=i=y:i=i.next=y,f=f.next}while(f!==null);i===null?n=i=l:i=i.next=l}else n=i=l;f={baseState:r.baseState,firstBaseUpdate:n,lastBaseUpdate:i,shared:r.shared,effects:r.effects},u.updateQueue=f;return}u=f.lastBaseUpdate,u===null?f.firstBaseUpdate=l:u.next=l,f.lastBaseUpdate=l}function i3(u,l,f,r){var n=u.updateQueue;ln=!1;var{firstBaseUpdate:i,lastBaseUpdate:y}=n,t=n.shared.pending;if(t!==null){n.shared.pending=null;var _=t,c=_.next;_.next=null,y===null?i=c:y.next=c,y=_;var A=u.alternate;A!==null&&(A=A.updateQueue,t=A.lastBaseUpdate,t!==y&&(t===null?A.firstBaseUpdate=c:t.next=c,A.lastBaseUpdate=_))}if(i!==null){var j=n.baseState;y=0,A=c=_=null,t=i;do{var{lane:F,eventTime:J}=t;if((r&F)===F){A!==null&&(A=A.next={eventTime:J,lane:0,tag:t.tag,payload:t.payload,callback:t.callback,next:null});u:{var Q=u,w=t;switch(F=l,J=f,w.tag){case 1:if(Q=w.payload,typeof Q==="function"){j=Q.call(J,j,F);break u}j=Q;break u;case 3:Q.flags=Q.flags&-65537|128;case 0:if(Q=w.payload,F=typeof Q==="function"?Q.call(J,j,F):Q,F===null||F===void 0)break u;j=Bl({},j,F);break u;case 2:ln=!0}}t.callback!==null&&t.lane!==0&&(u.flags|=64,F=n.effects,F===null?n.effects=[t]:F.push(t))}else J={eventTime:J,lane:F,tag:t.tag,payload:t.payload,callback:t.callback,next:null},A===null?(c=A=J,_=j):A=A.next=J,y|=F;if(t=t.next,t===null)if(t=n.shared.pending,t===null)break;else F=t,t=F.next,F.next=null,n.lastBaseUpdate=F,n.shared.pending=null}while(1);if(A===null&&(_=j),n.baseState=_,n.firstBaseUpdate=c,n.lastBaseUpdate=A,l=n.shared.interleaved,l!==null){n=l;do y|=n.lane,n=n.next;while(n!==l)}else i===null&&(n.shared.lanes=0);Fi|=y,u.lanes=y,u.memoizedState=j}}function Sj(u,l,f){if(u=l.effects,l.effects=null,u!==null)for(l=0;lf?f:4,u(!0);var r=O8.transition;O8.transition={};try{u(!1),l()}finally{$l=f,O8.transition=r}}function KU(){return Er().memoizedState}function Kz(u,l,f){var r=Fn(u);if(f={lane:r,action:f,hasEagerState:!1,eagerState:null,next:null},GU(u))zU(l,f);else if(f=nU(u,l,f,r),f!==null){var n=Vf();Mr(f,u,r,n),TU(f,l,r)}}function Gz(u,l,f){var r=Fn(u),n={lane:r,action:f,hasEagerState:!1,eagerState:null,next:null};if(GU(u))zU(l,n);else{var i=u.alternate;if(u.lanes===0&&(i===null||i.lanes===0)&&(i=l.lastRenderedReducer,i!==null))try{var y=l.lastRenderedState,t=i(y,f);if(n.hasEagerState=!0,n.eagerState=t,Rr(t,y)){var _=l.interleaved;_===null?(n.next=n,o4(l)):(n.next=_.next,_.next=n),l.interleaved=n;return}}catch(c){}finally{}f=nU(u,l,n,r),f!==null&&(n=Vf(),Mr(f,u,r,n),TU(f,l,r))}}function GU(u){var l=u.alternate;return u===Hl||l!==null&&l===Hl}function zU(u,l){rt=t3=!0;var f=u.pending;f===null?l.next=l:(l.next=f.next,f.next=l),u.pending=l}function TU(u,l,f){if((f&4194240)!==0){var r=l.lanes;r&=u.pendingLanes,f|=r,l.lanes=f,m4(u,f)}}var _3={readContext:Tr,useCallback:qf,useContext:qf,useEffect:qf,useImperativeHandle:qf,useInsertionEffect:qf,useLayoutEffect:qf,useMemo:qf,useReducer:qf,useRef:qf,useState:qf,useDebugValue:qf,useDeferredValue:qf,useTransition:qf,useMutableSource:qf,useSyncExternalStore:qf,useId:qf,unstable_isNewReconciler:!1},zz={readContext:Tr,useCallback:function(u,l){return l0().memoizedState=[u,l===void 0?null:l],u},useContext:Tr,useEffect:pj,useImperativeHandle:function(u,l,f){return f=f!==null&&f!==void 0?f.concat([u]):null,C$(4194308,4,NU.bind(null,l,u),f)},useLayoutEffect:function(u,l){return C$(4194308,4,u,l)},useInsertionEffect:function(u,l){return C$(4,2,u,l)},useMemo:function(u,l){var f=l0();return l=l===void 0?null:l,u=u(),f.memoizedState=[u,l],u},useReducer:function(u,l,f){var r=l0();return l=f!==void 0?f(l):l,r.memoizedState=r.baseState=l,u={pending:null,interleaved:null,lanes:0,dispatch:null,lastRenderedReducer:u,lastRenderedState:l},r.queue=u,u=u.dispatch=Kz.bind(null,Hl,u),[r.memoizedState,u]},useRef:function(u){var l=l0();return u={current:u},l.memoizedState=u},useState:Yj,useDebugValue:yA,useDeferredValue:function(u){return l0().memoizedState=u},useTransition:function(){var u=Yj(!1),l=u[0];return u=Lz.bind(null,u[1]),l0().memoizedState=u,[l,u]},useMutableSource:function(){},useSyncExternalStore:function(u,l,f){var r=Hl,n=l0();if(Tl){if(f===void 0)throw Error(Ju(407));f=f()}else{if(f=l(),uf===null)throw Error(Ju(349));(ji&30)!==0||$U(r,l,f)}n.memoizedState=f;var i={value:f,getSnapshot:l};return n.queue=i,pj(AU.bind(null,r,i,u),[u]),r.flags|=2048,Kt(9,cU.bind(null,r,i,f,l),void 0,null),f},useId:function(){var u=l0(),l=uf.identifierPrefix;if(Tl){var f=z0,r=G0;f=(r&~(1<<32-Cr(r)-1)).toString(32)+f,l=":"+l+"R"+f,f=wt++,0y||n[t]!==i[y]){var c=` +`+n[t].replace(" at new "," at ");return u.displayName&&c.includes("")&&(c=c.replace("",u.displayName)),c}while(1<=t&&0<=y);break}}}finally{G6=!1,Error.prepareStackTrace=f}return(u=u?u.displayName||u.name:"")?ay(u):""}function wK(u){switch(u.tag){case 5:return ay(u.type);case 16:return ay("Lazy");case 13:return ay("Suspense");case 19:return ay("SuspenseList");case 0:case 2:case 15:return u=z6(u.type,!1),u;case 11:return u=z6(u.type.render,!1),u;case 1:return u=z6(u.type,!0),u;default:return""}}function g6(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 Ut:return"Fragment";case Ft:return"Portal";case v6:return"Profiler";case R8:return"StrictMode";case k6:return"Suspense";case I6:return"SuspenseList"}if(typeof u==="object")switch(u.$$typeof){case qF:return(u.displayName||"Context")+".Consumer";case NF:return(u._context.displayName||"Context")+".Provider";case h8:var l=u.render;return u=u.displayName,u||(u=l.displayName||l.name||"",u=u!==""?"ForwardRef("+u+")":"ForwardRef"),u;case x8:return l=u.displayName||null,l!==null?l:g6(u.type)||"Memo";case y0:l=u._payload,u=u._init;try{return g6(u(l))}catch(f){}}return null}function WK(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 g6(l);case 8:return l===R8?"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 L0(u){switch(typeof u){case"boolean":case"number":case"string":case"undefined":return u;case"object":return u;default:return""}}function WF(u){var l=u.type;return(u=u.nodeName)&&u.toLowerCase()==="input"&&(l==="checkbox"||l==="radio")}function LK(u){var l=WF(u)?"checked":"value",f=Object.getOwnPropertyDescriptor(u.constructor.prototype,l),r=""+u[l];if(!u.hasOwnProperty(l)&&typeof f<"u"&&typeof f.get==="function"&&typeof f.set==="function"){var{get:n,set:i}=f;return Object.defineProperty(u,l,{configurable:!0,get:function(){return n.call(this)},set:function(t){r=""+t,i.call(this,t)}}),Object.defineProperty(u,l,{enumerable:f.enumerable}),{getValue:function(){return r},setValue:function(t){r=""+t},stopTracking:function(){u._valueTracker=null,delete u[l]}}}}function K_(u){u._valueTracker||(u._valueTracker=LK(u))}function LF(u){if(!u)return!1;var l=u._valueTracker;if(!l)return!0;var f=l.getValue(),r="";return u&&(r=WF(u)?u.checked?"true":"false":u.value),u=r,u!==f?(l.setValue(u),!0):!1}function g_(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 s6(u,l){var f=l.checked;return ml({},l,{defaultChecked:void 0,defaultValue:void 0,value:void 0,checked:f!=null?f:u._wrapperState.initialChecked})}function Jj(u,l){var f=l.defaultValue==null?"":l.defaultValue,r=l.checked!=null?l.checked:l.defaultChecked;f=L0(l.value!=null?l.value:f),u._wrapperState={initialChecked:r,initialValue:f,controlled:l.type==="checkbox"||l.type==="radio"?l.checked!=null:l.value!=null}}function TF(u,l){l=l.checked,l!=null&&M8(u,"checked",l,!1)}function a6(u,l){TF(u,l);var f=L0(l.value),r=l.type;if(f!=null)if(r==="number"){if(f===0&&u.value===""||u.value!=f)u.value=""+f}else u.value!==""+f&&(u.value=""+f);else if(r==="submit"||r==="reset"){u.removeAttribute("value");return}l.hasOwnProperty("value")?o6(u,l.type,f):l.hasOwnProperty("defaultValue")&&o6(u,l.type,L0(l.defaultValue)),l.checked==null&&l.defaultChecked!=null&&(u.defaultChecked=!!l.defaultChecked)}function Qj(u,l,f){if(l.hasOwnProperty("value")||l.hasOwnProperty("defaultValue")){var r=l.type;if(!(r!=="submit"&&r!=="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 o6(u,l,f){if(l!=="number"||g_(u.ownerDocument)!==u)f==null?u.defaultValue=""+u._wrapperState.initialValue:u.defaultValue!==""+f&&(u.defaultValue=""+f)}var oy=Array.isArray;function zt(u,l,f,r){if(u=u.options,l){l={};for(var n=0;n"+l.valueOf().toString()+"";for(l=G_.firstChild;u.firstChild;)u.removeChild(u.firstChild);for(;l.firstChild;)u.appendChild(l.firstChild)}});function U1(u,l){if(l){var f=u.firstChild;if(f&&f===u.lastChild&&f.nodeType===3){f.nodeValue=l;return}}u.textContent=l}var n1={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},TK=["Webkit","ms","Moz","O"];Object.keys(n1).forEach(function(u){TK.forEach(function(l){l=l+u.charAt(0).toUpperCase()+u.substring(1),n1[l]=n1[u]})});function EF(u,l,f){return l==null||typeof l==="boolean"||l===""?"":f||typeof l!=="number"||l===0||n1.hasOwnProperty(u)&&n1[u]?(""+l).trim():l+"px"}function OF(u,l){u=u.style;for(var f in l)if(l.hasOwnProperty(f)){var r=f.indexOf("--")===0,n=EF(f,l[f],r);f==="float"&&(f="cssFloat"),r?u.setProperty(f,n):u[f]=n}}var KK=ml({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 u8(u,l){if(l){if(KK[u]&&(l.children!=null||l.dangerouslySetInnerHTML!=null))throw Error(Ju(137,u));if(l.dangerouslySetInnerHTML!=null){if(l.children!=null)throw Error(Ju(60));if(typeof l.dangerouslySetInnerHTML!=="object"||!("__html"in l.dangerouslySetInnerHTML))throw Error(Ju(61))}if(l.style!=null&&typeof l.style!=="object")throw Error(Ju(62))}}function l8(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 f8=null;function b8(u){return u=u.target||u.srcElement||window,u.correspondingUseElement&&(u=u.correspondingUseElement),u.nodeType===3?u.parentNode:u}var r8=null,Et=null,Ot=null;function wj(u){if(u=V1(u)){if(typeof r8!=="function")throw Error(Ju(280));var l=u.stateNode;l&&(l=T$(l),r8(u.stateNode,u.type,l))}}function ZF(u){Et?Ot?Ot.push(u):Ot=[u]:Et=u}function HF(){if(Et){var u=Et,l=Ot;if(Ot=Et=null,wj(u),l)for(u=0;u>>=0,u===0?32:31-(pK(u)/SK|0)|0}var z_=64,E_=4194304;function dy(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 d_(u,l){var f=u.pendingLanes;if(f===0)return 0;var r=0,n=u.suspendedLanes,i=u.pingedLanes,t=f&268435455;if(t!==0){var y=t&~n;y!==0?r=dy(y):(i&=t,i!==0&&(r=dy(i)))}else t=f&~n,t!==0?r=dy(t):i!==0&&(r=dy(i));if(r===0)return 0;if(l!==0&&l!==r&&(l&n)===0&&(n=r&-r,i=l&-l,n>=i||n===16&&(i&4194240)!==0))return l;if((r&4)!==0&&(r|=f&16),l=u.entangledLanes,l!==0)for(u=u.entanglements,l&=r;0f;f++)l.push(u);return l}function B1(u,l,f){u.pendingLanes|=l,l!==536870912&&(u.suspendedLanes=0,u.pingedLanes=0),u=u.eventTimes,l=31-vr(l),u[l]=f}function CK(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 r=u.eventTimes;for(u=u.expirationTimes;0=t1),Zj=String.fromCharCode(32),Hj=!1;function sF(u,l){switch(u){case"keyup":return FG.indexOf(l.keyCode)!==-1;case"keydown":return l.keyCode!==229;case"keypress":case"mousedown":case"focusout":return!0;default:return!1}}function aF(u){return u=u.detail,typeof u==="object"&&"data"in u?u.data:null}var Jt=!1;function JG(u,l){switch(u){case"compositionend":return aF(l);case"keypress":if(l.which!==32)return null;return Hj=!0,Zj;case"textInput":return u=l.data,u===Zj&&Hj?null:u;default:return null}}function QG(u,l){if(Jt)return u==="compositionend"||!d8&&sF(u,l)?(u=IF(),P_=s8=A0=null,Jt=!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=r}u:{for(;f;){if(f.nextSibling){f=f.nextSibling;break u}f=f.parentNode}f=void 0}f=Vj(f)}}function uU(u,l){return u&&l?u===l?!0:u&&u.nodeType===3?!1:l&&l.nodeType===3?uU(u,l.parentNode):("contains"in u)?u.contains(l):u.compareDocumentPosition?!!(u.compareDocumentPosition(l)&16):!1:!1}function lU(){for(var u=window,l=g_();l instanceof u.HTMLIFrameElement;){try{var f=typeof l.contentWindow.location.href==="string"}catch(r){f=!1}if(f)u=l.contentWindow;else break;l=g_(u.document)}return l}function e8(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 zG(u){var l=lU(),f=u.focusedElem,r=u.selectionRange;if(l!==f&&f&&f.ownerDocument&&uU(f.ownerDocument.documentElement,f)){if(r!==null&&e8(f)){if(l=r.start,u=r.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 n=f.textContent.length,i=Math.min(r.start,n);r=r.end===void 0?i:Math.min(r.end,n),!u.extend&&i>r&&(n=r,r=i,i=n),n=Dj(f,i);var t=Dj(f,r);n&&t&&(u.rangeCount!==1||u.anchorNode!==n.node||u.anchorOffset!==n.offset||u.focusNode!==t.node||u.focusOffset!==t.offset)&&(l=l.createRange(),l.setStart(n.node,n.offset),u.removeAllRanges(),i>r?(u.addRange(l),u.extend(t.node,t.offset)):(l.setEnd(t.node,t.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,Qt=null,_8=null,c1=null,$8=!1;function pj(u,l,f){var r=f.window===f?f.document:f.nodeType===9?f:f.ownerDocument;$8||Qt==null||Qt!==g_(r)||(r=Qt,("selectionStart"in r)&&e8(r)?r={start:r.selectionStart,end:r.selectionEnd}:(r=(r.ownerDocument&&r.ownerDocument.defaultView||window).getSelection(),r={anchorNode:r.anchorNode,anchorOffset:r.anchorOffset,focusNode:r.focusNode,focusOffset:r.focusOffset}),c1&&W1(c1,r)||(c1=r,r=l$(_8,"onSelect"),0wt||(u.current=q8[wt],q8[wt]=null,wt--)}function wl(u,l){wt++,q8[wt]=u.current,u.current=l}var T0={},Tf=G0(T0),vf=G0(!1),wi=T0;function Vt(u,l){var f=u.type.contextTypes;if(!f)return T0;var r=u.stateNode;if(r&&r.__reactInternalMemoizedUnmaskedChildContext===l)return r.__reactInternalMemoizedMaskedChildContext;var n={},i;for(i in f)n[i]=l[i];return r&&(u=u.stateNode,u.__reactInternalMemoizedUnmaskedChildContext=l,u.__reactInternalMemoizedMaskedChildContext=n),n}function kf(u){return u=u.childContextTypes,u!==null&&u!==void 0}function r$(){Gl(vf),Gl(Tf)}function Rj(u,l,f){if(Tf.current!==T0)throw Error(Ju(168));wl(Tf,l),wl(vf,f)}function $U(u,l,f){var r=u.stateNode;if(l=l.childContextTypes,typeof r.getChildContext!=="function")return f;r=r.getChildContext();for(var n in r)if(!(n in l))throw Error(Ju(108,WK(u)||"Unknown",n));return ml({},f,r)}function n$(u){return u=(u=u.stateNode)&&u.__reactInternalMemoizedMergedChildContext||T0,wi=Tf.current,wl(Tf,u),wl(vf,vf.current),!0}function hj(u,l,f){var r=u.stateNode;if(!r)throw Error(Ju(169));f?(u=$U(u,l,wi),r.__reactInternalMemoizedMergedChildContext=u,Gl(vf),Gl(Tf),wl(Tf,u)):Gl(vf),wl(vf,f)}var Zn=null,K$=!1,S6=!1;function AU(u){Zn===null?Zn=[u]:Zn.push(u)}function SG(u){K$=!0,AU(u)}function z0(){if(!S6&&Zn!==null){S6=!0;var u=0,l=Al;try{var f=Zn;for(Al=1;u>=t,n-=t,Hn=1<<32-vr(l)+n|f<E?(V=H,H=null):V=H.sibling;var S=F(U,H,N[E],w);if(S===null){H===null&&(H=V);break}u&&H&&S.alternate===null&&l(U,H),q=i(S,q,E),Z===null?G=S:Z.sibling=S,Z=S,H=V}if(E===N.length)return f(U,H),El&&ji(U,E),G;if(H===null){for(;EE?(V=H,H=null):V=H.sibling;var B=F(U,H,S.value,w);if(B===null){H===null&&(H=V);break}u&&H&&B.alternate===null&&l(U,H),q=i(B,q,E),Z===null?G=B:Z.sibling=B,Z=B,H=V}if(S.done)return f(U,H),El&&ji(U,E),G;if(H===null){for(;!S.done;E++,S=N.next())S=j(U,S.value,w),S!==null&&(q=i(S,q,E),Z===null?G=S:Z.sibling=S,Z=S);return El&&ji(U,E),G}for(H=r(U,H);!S.done;E++,S=N.next())S=J(H,U,E,S.value,w),S!==null&&(u&&S.alternate!==null&&H.delete(S.key===null?E:S.key),q=i(S,q,E),Z===null?G=S:Z.sibling=S,Z=S);return u&&H.forEach(function(D){return l(U,D)}),El&&ji(U,E),G}function L(U,q,N,w){if(typeof N==="object"&&N!==null&&N.type===Ut&&N.key===null&&(N=N.props.children),typeof N==="object"&&N!==null){switch(N.$$typeof){case T_:u:{for(var G=N.key,Z=q;Z!==null;){if(Z.key===G){if(G=N.type,G===Ut){if(Z.tag===7){f(U,Z.sibling),q=n(Z,N.props.children),q.return=U,U=q;break u}}else if(Z.elementType===G||typeof G==="object"&&G!==null&&G.$$typeof===y0&&vj(G)===Z.type){f(U,Z.sibling),q=n(Z,N.props),q.ref=Iy(U,Z,N),q.return=U,U=q;break u}f(U,Z);break}else l(U,Z);Z=Z.sibling}N.type===Ut?(q=qi(N.props.children,U.mode,w,N.key),q.return=U,U=q):(w=I_(N.type,N.key,N.props,null,U.mode,w),w.ref=Iy(U,q,N),w.return=U,U=w)}return t(U);case Ft:u:{for(Z=N.key;q!==null;){if(q.key===Z)if(q.tag===4&&q.stateNode.containerInfo===N.containerInfo&&q.stateNode.implementation===N.implementation){f(U,q.sibling),q=n(q,N.children||[]),q.return=U,U=q;break u}else{f(U,q);break}else l(U,q);q=q.sibling}q=x6(N,U.mode,w),q.return=U,U=q}return t(U);case y0:return Z=N._init,L(U,q,Z(N._payload),w)}if(oy(N))return Q(U,q,N,w);if(xy(N))return W(U,q,N,w);D_(U,N)}return typeof N==="string"&&N!==""||typeof N==="number"?(N=""+N,q!==null&&q.tag===6?(f(U,q.sibling),q=n(q,N),q.return=U,U=q):(f(U,q),q=h6(N,U.mode,w),q.return=U,U=q),t(U)):f(U,q)}return L}var pt=JU(!0),QU=JU(!1),y$=G0(null),c$=null,Tt=null,r4=null;function n4(){r4=Tt=c$=null}function i4(u){var l=y$.current;Gl(y$),u._currentValue=l}function L8(u,l,f){for(;u!==null;){var r=u.alternate;if((u.childLanes&l)!==l?(u.childLanes|=l,r!==null&&(r.childLanes|=l)):r!==null&&(r.childLanes&l)!==l&&(r.childLanes|=l),u===f)break;u=u.return}}function Ht(u,l){c$=u,r4=Tt=null,u=u.dependencies,u!==null&&u.firstContext!==null&&((u.lanes&l)!==0&&(bf=!0),u.firstContext=null)}function Zr(u){var l=u._currentValue;if(r4!==u)if(u={context:u,memoizedValue:l,next:null},Tt===null){if(c$===null)throw Error(Ju(308));Tt=u,c$.dependencies={lanes:0,firstContext:u}}else Tt=Tt.next=u;return l}var Ji=null;function t4(u){Ji===null?Ji=[u]:Ji.push(u)}function NU(u,l,f,r){var n=l.interleaved;return n===null?(f.next=f,t4(l)):(f.next=n.next,n.next=f),l.interleaved=f,pn(u,r)}function pn(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 c0=!1;function y4(u){u.updateQueue={baseState:u.memoizedState,firstBaseUpdate:null,lastBaseUpdate:null,shared:{pending:null,interleaved:null,lanes:0},effects:null}}function qU(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 mn(u,l){return{eventTime:u,lane:l,tag:0,payload:null,callback:null,next:null}}function N0(u,l,f){var r=u.updateQueue;if(r===null)return null;if(r=r.shared,(cl&2)!==0){var n=r.pending;return n===null?l.next=l:(l.next=n.next,n.next=l),r.pending=l,pn(u,f)}return n=r.interleaved,n===null?(l.next=l,t4(r)):(l.next=n.next,n.next=l),r.interleaved=l,pn(u,f)}function R_(u,l,f){if(l=l.updateQueue,l!==null&&(l=l.shared,(f&4194240)!==0)){var r=l.lanes;r&=u.pendingLanes,f|=r,l.lanes=f,k8(u,f)}}function kj(u,l){var{updateQueue:f,alternate:r}=u;if(r!==null&&(r=r.updateQueue,f===r)){var n=null,i=null;if(f=f.firstBaseUpdate,f!==null){do{var t={eventTime:f.eventTime,lane:f.lane,tag:f.tag,payload:f.payload,callback:f.callback,next:null};i===null?n=i=t:i=i.next=t,f=f.next}while(f!==null);i===null?n=i=l:i=i.next=l}else n=i=l;f={baseState:r.baseState,firstBaseUpdate:n,lastBaseUpdate:i,shared:r.shared,effects:r.effects},u.updateQueue=f;return}u=f.lastBaseUpdate,u===null?f.firstBaseUpdate=l:u.next=l,f.lastBaseUpdate=l}function _$(u,l,f,r){var n=u.updateQueue;c0=!1;var{firstBaseUpdate:i,lastBaseUpdate:t}=n,y=n.shared.pending;if(y!==null){n.shared.pending=null;var c=y,$=c.next;c.next=null,t===null?i=$:t.next=$,t=c;var A=u.alternate;A!==null&&(A=A.updateQueue,y=A.lastBaseUpdate,y!==t&&(y===null?A.firstBaseUpdate=$:y.next=$,A.lastBaseUpdate=c))}if(i!==null){var j=n.baseState;t=0,A=$=c=null,y=i;do{var{lane:F,eventTime:J}=y;if((r&F)===F){A!==null&&(A=A.next={eventTime:J,lane:0,tag:y.tag,payload:y.payload,callback:y.callback,next:null});u:{var Q=u,W=y;switch(F=l,J=f,W.tag){case 1:if(Q=W.payload,typeof Q==="function"){j=Q.call(J,j,F);break u}j=Q;break u;case 3:Q.flags=Q.flags&-65537|128;case 0:if(Q=W.payload,F=typeof Q==="function"?Q.call(J,j,F):Q,F===null||F===void 0)break u;j=ml({},j,F);break u;case 2:c0=!0}}y.callback!==null&&y.lane!==0&&(u.flags|=64,F=n.effects,F===null?n.effects=[y]:F.push(y))}else J={eventTime:J,lane:F,tag:y.tag,payload:y.payload,callback:y.callback,next:null},A===null?($=A=J,c=j):A=A.next=J,t|=F;if(y=y.next,y===null)if(y=n.shared.pending,y===null)break;else F=y,y=F.next,F.next=null,n.lastBaseUpdate=F,n.shared.pending=null}while(1);if(A===null&&(c=j),n.baseState=c,n.firstBaseUpdate=$,n.lastBaseUpdate=A,l=n.shared.interleaved,l!==null){n=l;do t|=n.lane,n=n.next;while(n!==l)}else i===null&&(n.shared.lanes=0);Ti|=t,u.lanes=t,u.memoizedState=j}}function Ij(u,l,f){if(u=l.effects,l.effects=null,u!==null)for(l=0;lf?f:4,u(!0);var r=Y6.transition;Y6.transition={};try{u(!1),l()}finally{Al=f,Y6.transition=r}}function SU(){return Hr().memoizedState}function CG(u,l,f){var r=w0(u);if(f={lane:r,action:f,hasEagerState:!1,eagerState:null,next:null},XU(u))YU(l,f);else if(f=NU(u,l,f,r),f!==null){var n=Vf();kr(f,u,r,n),PU(f,l,r)}}function MG(u,l,f){var r=w0(u),n={lane:r,action:f,hasEagerState:!1,eagerState:null,next:null};if(XU(u))YU(l,n);else{var i=u.alternate;if(u.lanes===0&&(i===null||i.lanes===0)&&(i=l.lastRenderedReducer,i!==null))try{var t=l.lastRenderedState,y=i(t,f);if(n.hasEagerState=!0,n.eagerState=y,Ir(y,t)){var c=l.interleaved;c===null?(n.next=n,t4(l)):(n.next=c.next,c.next=n),l.interleaved=n;return}}catch($){}finally{}f=NU(u,l,n,r),f!==null&&(n=Vf(),kr(f,u,r,n),PU(f,l,r))}}function XU(u){var l=u.alternate;return u===Bl||l!==null&&l===Bl}function YU(u,l){_1=A$=!0;var f=u.pending;f===null?l.next=l:(l.next=f.next,f.next=l),u.pending=l}function PU(u,l,f){if((f&4194240)!==0){var r=l.lanes;r&=u.pendingLanes,f|=r,l.lanes=f,k8(u,f)}}var j$={readContext:Zr,useCallback:wf,useContext:wf,useEffect:wf,useImperativeHandle:wf,useInsertionEffect:wf,useLayoutEffect:wf,useMemo:wf,useReducer:wf,useRef:wf,useState:wf,useDebugValue:wf,useDeferredValue:wf,useTransition:wf,useMutableSource:wf,useSyncExternalStore:wf,useId:wf,unstable_isNewReconciler:!1},RG={readContext:Zr,useCallback:function(u,l){return cn().memoizedState=[u,l===void 0?null:l],u},useContext:Zr,useEffect:sj,useImperativeHandle:function(u,l,f){return f=f!==null&&f!==void 0?f.concat([u]):null,x_(4194308,4,BU.bind(null,l,u),f)},useLayoutEffect:function(u,l){return x_(4194308,4,u,l)},useInsertionEffect:function(u,l){return x_(4,2,u,l)},useMemo:function(u,l){var f=cn();return l=l===void 0?null:l,u=u(),f.memoizedState=[u,l],u},useReducer:function(u,l,f){var r=cn();return l=f!==void 0?f(l):l,r.memoizedState=r.baseState=l,u={pending:null,interleaved:null,lanes:0,dispatch:null,lastRenderedReducer:u,lastRenderedState:l},r.queue=u,u=u.dispatch=CG.bind(null,Bl,u),[r.memoizedState,u]},useRef:function(u){var l=cn();return u={current:u},l.memoizedState=u},useState:gj,useDebugValue:J4,useDeferredValue:function(u){return cn().memoizedState=u},useTransition:function(){var u=gj(!1),l=u[0];return u=PG.bind(null,u[1]),cn().memoizedState=u,[l,u]},useMutableSource:function(){},useSyncExternalStore:function(u,l,f){var r=Bl,n=cn();if(El){if(f===void 0)throw Error(Ju(407));f=f()}else{if(f=l(),nf===null)throw Error(Ju(349));(Li&30)!==0||TU(r,l,f)}n.memoizedState=f;var i={value:f,getSnapshot:l};return n.queue=i,sj(GU.bind(null,r,i,u),[u]),r.flags|=2048,Z1(9,KU.bind(null,r,i,f,l),void 0,null),f},useId:function(){var u=cn(),l=nf.identifierPrefix;if(El){var f=Bn,r=Hn;f=(r&~(1<<32-vr(r)-1)).toString(32)+f,l=":"+l+"R"+f,f=E1++,0",u=u.removeChild(u.firstChild)):typeof r.is==="string"?u=y.createElement(f,{is:r.is}):(u=y.createElement(f),f==="select"&&(y=u,r.multiple?y.multiple=!0:r.size&&(y.size=r.size))):u=y.createElementNS(u,f),u[f0]=l,u[Nt]=r,YU(u,l,!1,!1),l.stateNode=u;u:{switch(y=k8(f,r),f){case"dialog":Ll("cancel",u),Ll("close",u),n=r;break;case"iframe":case"object":case"embed":Ll("load",u),n=r;break;case"video":case"audio":for(n=0;nO1&&(l.flags|=128,r=!0,xy(i,!1),l.lanes=4194304)}else{if(!r)if(u=y3(y),u!==null){if(l.flags|=128,r=!0,f=u.updateQueue,f!==null&&(l.updateQueue=f,l.flags|=4),xy(i,!0),i.tail===null&&i.tailMode==="hidden"&&!y.alternate&&!Tl)return Wf(l),null}else 2*ml()-i.renderingStartTime>O1&&f!==1073741824&&(l.flags|=128,r=!0,xy(i,!1),l.lanes=4194304);i.isBackwards?(y.sibling=l.child,l.child=y):(f=i.last,f!==null?f.sibling=y:l.child=y,i.last=y)}if(i.tail!==null)return l=i.tail,i.rendering=l,i.tail=l.sibling,i.renderingStartTime=ml(),l.sibling=null,f=Ol.current,ql(Ol,r?f&1|2:f&1),l;return Wf(l),null;case 22:case 23:return jA(),r=l.memoizedState!==null,u!==null&&u.memoizedState!==null!==r&&(l.flags|=8192),r&&(l.mode&1)!==0?(yr&1073741824)!==0&&(Wf(l),l.subtreeFlags&6&&(l.flags|=8192)):Wf(l),null;case 24:return null;case 25:return null}throw Error(Ju(156,l.tag))}function Dz(u,l){switch(k4(l),l.tag){case 1:return bf(l.type)&&e$(),u=l.flags,u&65536?(l.flags=u&-65537|128,l):null;case 3:return E1(),Kl(hf),Kl(Lf),lA(),u=l.flags,(u&65536)!==0&&(u&128)===0?(l.flags=u&-65537|128,l):null;case 5:return uA(l),null;case 13:if(Kl(Ol),u=l.memoizedState,u!==null&&u.dehydrated!==null){if(l.alternate===null)throw Error(Ju(340));z1()}return u=l.flags,u&65536?(l.flags=u&-65537|128,l):null;case 19:return Kl(Ol),null;case 4:return E1(),null;case 10:return a4(l.type._context),null;case 22:case 23:return jA(),null;case 24:return null;default:return null}}var V$=!1,wf=!1,Xz=typeof WeakSet==="function"?WeakSet:Set,Zu=null;function U1(u,l){var f=u.ref;if(f!==null)if(typeof f==="function")try{f(null)}catch(r){Dl(u,l,r)}else f.current=null}function L4(u,l,f){try{f()}catch(r){Dl(u,l,r)}}var Ij=!1;function Sz(u,l){if(n4=s$,u=xF(),b4(u)){if("selectionStart"in u)var f={start:u.selectionStart,end:u.selectionEnd};else u:{f=(f=u.ownerDocument)&&f.defaultView||window;var r=f.getSelection&&f.getSelection();if(r&&r.rangeCount!==0){f=r.anchorNode;var{anchorOffset:n,focusNode:i}=r;r=r.focusOffset;try{f.nodeType,i.nodeType}catch(W){f=null;break u}var y=0,t=-1,_=-1,c=0,A=0,j=u,F=null;l:for(;;){for(var J;;){if(j!==f||n!==0&&j.nodeType!==3||(t=y+n),j!==i||r!==0&&j.nodeType!==3||(_=y+r),j.nodeType===3&&(y+=j.nodeValue.length),(J=j.firstChild)===null)break;F=j,j=J}for(;;){if(j===u)break l;if(F===f&&++c===n&&(t=y),F===i&&++A===r&&(_=y),(J=j.nextSibling)!==null)break;j=F,F=j.parentNode}j=J}f=t===-1||_===-1?null:{start:t,end:_}}else f=null}f=f||{start:0,end:0}}else f=null;i4={focusedElem:u,selectionRange:f},s$=!1;for(Zu=l;Zu!==null;)if(l=Zu,u=l.child,(l.subtreeFlags&1028)!==0&&u!==null)u.return=l,Zu=u;else for(;Zu!==null;){l=Zu;try{var Q=l.alternate;if((l.flags&1024)!==0)switch(l.tag){case 0:case 11:case 15:break;case 1:if(Q!==null){var{memoizedProps:w,memoizedState:L}=Q,U=l.stateNode,N=U.getSnapshotBeforeUpdate(l.elementType===l.type?w:pr(l.type,w),L);U.__reactInternalSnapshotBeforeUpdate=N}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(Ju(163))}}catch(W){Dl(l,l.return,W)}if(u=l.sibling,u!==null){u.return=l.return,Zu=u;break}Zu=l.return}return Q=Ij,Ij=!1,Q}function nt(u,l,f){var r=l.updateQueue;if(r=r!==null?r.lastEffect:null,r!==null){var n=r=r.next;do{if((n.tag&u)===u){var i=n.destroy;n.destroy=void 0,i!==void 0&&L4(l,f,i)}n=n.next}while(n!==r)}}function K3(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 r=f.create;f.destroy=r()}f=f.next}while(f!==l)}}function K4(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 PU(u){var l=u.alternate;l!==null&&(u.alternate=null,PU(l)),u.child=null,u.deletions=null,u.sibling=null,u.tag===5&&(l=u.stateNode,l!==null&&(delete l[f0],delete l[Nt],delete l[_4],delete l[Qz],delete l[Nz])),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 CU(u){return u.tag===5||u.tag===3||u.tag===4}function gj(u){u:for(;;){for(;u.sibling===null;){if(u.return===null||CU(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 G4(u,l,f){var r=u.tag;if(r===5||r===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=d$));else if(r!==4&&(u=u.child,u!==null))for(G4(u,l,f),u=u.sibling;u!==null;)G4(u,l,f),u=u.sibling}function z4(u,l,f){var r=u.tag;if(r===5||r===6)u=u.stateNode,l?f.insertBefore(u,l):f.appendChild(u);else if(r!==4&&(u=u.child,u!==null))for(z4(u,l,f),u=u.sibling;u!==null;)z4(u,l,f),u=u.sibling}var _f=null,mr=!1;function e0(u,l,f){for(f=f.child;f!==null;)MU(u,l,f),f=f.sibling}function MU(u,l,f){if(r0&&typeof r0.onCommitFiberUnmount==="function")try{r0.onCommitFiberUnmount(U3,f)}catch(t){}switch(f.tag){case 5:wf||U1(f,l);case 6:var r=_f,n=mr;_f=null,e0(u,l,f),_f=r,mr=n,_f!==null&&(mr?(u=_f,f=f.stateNode,u.nodeType===8?u.parentNode.removeChild(f):u.removeChild(f)):_f.removeChild(f.stateNode));break;case 18:_f!==null&&(mr?(u=_f,f=f.stateNode,u.nodeType===8?T8(u.parentNode,f):u.nodeType===1&&T8(u,f),jt(u)):T8(_f,f.stateNode));break;case 4:r=_f,n=mr,_f=f.stateNode.containerInfo,mr=!0,e0(u,l,f),_f=r,mr=n;break;case 0:case 11:case 14:case 15:if(!wf&&(r=f.updateQueue,r!==null&&(r=r.lastEffect,r!==null))){n=r=r.next;do{var i=n,y=i.destroy;i=i.tag,y!==void 0&&((i&2)!==0?L4(f,l,y):(i&4)!==0&&L4(f,l,y)),n=n.next}while(n!==r)}e0(u,l,f);break;case 1:if(!wf&&(U1(f,l),r=f.stateNode,typeof r.componentWillUnmount==="function"))try{r.props=f.memoizedProps,r.state=f.memoizedState,r.componentWillUnmount()}catch(t){Dl(f,l,t)}e0(u,l,f);break;case 21:e0(u,l,f);break;case 22:f.mode&1?(wf=(r=wf)||f.memoizedState!==null,e0(u,l,f),wf=r):e0(u,l,f);break;default:e0(u,l,f)}}function sj(u){var l=u.updateQueue;if(l!==null){u.updateQueue=null;var f=u.stateNode;f===null&&(f=u.stateNode=new Xz),l.forEach(function(r){var n=hz.bind(null,u,r);f.has(r)||(f.add(r),r.then(n,n))})}}function Yr(u,l){var f=l.deletions;if(f!==null)for(var r=0;rn&&(n=y),r&=~i}if(r=n,r=ml()-r,r=(120>r?120:480>r?480:1080>r?1080:1920>r?1920:3000>r?3000:4320>r?4320:1960*pz(r/1960))-r,10u?16:u,yn===null)var r=!1;else{if(u=yn,yn=null,A3=0,(rl&6)!==0)throw Error(Ju(331));var n=rl;rl|=4;for(Zu=u.current;Zu!==null;){var i=Zu,y=i.child;if((Zu.flags&16)!==0){var t=i.deletions;if(t!==null){for(var _=0;_ml()-cA?_i(u,0):$A|=f),vf(u,l)}function gU(u,l){l===0&&((u.mode&1)===0?l=1:(l=K$,K$<<=1,(K$&130023424)===0&&(K$=4194304)));var f=Vf();u=O0(u,l),u!==null&&(zt(u,l,f),vf(u,f))}function xz(u){var l=u.memoizedState,f=0;l!==null&&(f=l.retryLane),gU(u,f)}function hz(u,l){var f=0;switch(u.tag){case 13:var{stateNode:r,memoizedState:n}=u;n!==null&&(f=n.retryLane);break;case 19:r=u.stateNode;break;default:throw Error(Ju(314))}r!==null&&r.delete(l),gU(u,f)}var sU;sU=function(u,l,f){if(u!==null)if(u.memoizedProps!==l.pendingProps||hf.current)xf=!0;else{if((u.lanes&f)===0&&(l.flags&128)===0)return xf=!1,Bz(u,l,f);xf=(u.flags&131072)!==0?!0:!1}else xf=!1,Tl&&(l.flags&1048576)!==0&&eF(l,f3,l.index);switch(l.lanes=0,l.tag){case 2:var r=l.type;M$(u,l),u=l.pendingProps;var n=G1(l,Lf.current);w1(l,f),n=rA(null,l,r,u,n,f);var i=nA();return l.flags|=1,typeof n==="object"&&n!==null&&typeof n.render==="function"&&n.$$typeof===void 0?(l.tag=1,l.memoizedState=null,l.updateQueue=null,bf(r)?(i=!0,u3(l)):i=!1,l.memoizedState=n.state!==null&&n.state!==void 0?n.state:null,d4(l),n.updater=L3,l.stateNode=n,n._reactInternals=l,U4(l,r,u,f),l=N4(null,l,r,!0,i,f)):(l.tag=0,Tl&&i&&v4(l),Bf(null,l,n,f),l=l.child),l;case 16:r=l.elementType;u:{switch(M$(u,l),u=l.pendingProps,n=r._init,r=n(r._payload),l.type=r,n=l.tag=vz(r),u=pr(r,u),n){case 0:l=Q4(null,l,r,u,f);break u;case 1:l=bj(null,l,r,u,f);break u;case 11:l=xj(null,l,r,u,f);break u;case 14:l=hj(null,l,r,pr(r.type,u),f);break u}throw Error(Ju(306,r,""))}return l;case 0:return r=l.type,n=l.pendingProps,n=l.elementType===r?n:pr(r,n),Q4(u,l,r,n,f);case 1:return r=l.type,n=l.pendingProps,n=l.elementType===r?n:pr(r,n),bj(u,l,r,n,f);case 3:u:{if(DU(l),u===null)throw Error(Ju(387));r=l.pendingProps,i=l.memoizedState,n=i.element,iU(u,l),i3(l,r,null,f);var y=l.memoizedState;if(r=y.element,i.isDehydrated)if(i={element:r,isDehydrated:!1,cache:y.cache,pendingSuspenseBoundaries:y.pendingSuspenseBoundaries,transitions:y.transitions},l.updateQueue.baseState=i,l.memoizedState=i,l.flags&256){n=Z1(Error(Ju(423)),l),l=vj(u,l,r,f,n);break u}else if(r!==n){n=Z1(Error(Ju(424)),l),l=vj(u,l,r,f,n);break u}else for(tr=cn(l.stateNode.containerInfo.firstChild),_r=l,Tl=!0,Pr=null,f=rU(l,null,r,f),l.child=f;f;)f.flags=f.flags&-3|4096,f=f.sibling;else{if(z1(),r===n){l=H0(u,l,f);break u}Bf(u,l,r,f)}l=l.child}return l;case 5:return yU(l),u===null&&A4(l),r=l.type,n=l.pendingProps,i=u!==null?u.memoizedProps:null,y=n.children,y4(r,n)?y=null:i!==null&&y4(r,i)&&(l.flags|=32),VU(u,l),Bf(u,l,y,f),l.child;case 6:return u===null&&A4(l),null;case 13:return XU(u,l,f);case 4:return e4(l,l.stateNode.containerInfo),r=l.pendingProps,u===null?l.child=T1(l,null,r,f):Bf(u,l,r,f),l.child;case 11:return r=l.type,n=l.pendingProps,n=l.elementType===r?n:pr(r,n),xj(u,l,r,n,f);case 7:return Bf(u,l,l.pendingProps,f),l.child;case 8:return Bf(u,l,l.pendingProps.children,f),l.child;case 12:return Bf(u,l,l.pendingProps.children,f),l.child;case 10:u:{if(r=l.type._context,n=l.pendingProps,i=l.memoizedProps,y=n.value,ql(r3,r._currentValue),r._currentValue=y,i!==null)if(Rr(i.value,y)){if(i.children===n.children&&!hf.current){l=H0(u,l,f);break u}}else for(i=l.child,i!==null&&(i.return=l);i!==null;){var t=i.dependencies;if(t!==null){y=i.child;for(var _=t.firstContext;_!==null;){if(_.context===r){if(i.tag===1){_=T0(-1,f&-f),_.tag=2;var c=i.updateQueue;if(c!==null){c=c.shared;var A=c.pending;A===null?_.next=_:(_.next=A.next,A.next=_),c.pending=_}}i.lanes|=f,_=i.alternate,_!==null&&(_.lanes|=f),j4(i.return,f,l),t.lanes|=f;break}_=_.next}}else if(i.tag===10)y=i.type===l.type?null:i.child;else if(i.tag===18){if(y=i.return,y===null)throw Error(Ju(341));y.lanes|=f,t=y.alternate,t!==null&&(t.lanes|=f),j4(y,f,l),y=i.sibling}else y=i.child;if(y!==null)y.return=i;else for(y=i;y!==null;){if(y===l){y=null;break}if(i=y.sibling,i!==null){i.return=y.return,y=i;break}y=y.return}i=y}Bf(u,l,n.children,f),l=l.child}return l;case 9:return n=l.type,r=l.pendingProps.children,w1(l,f),n=Tr(n),r=r(n),l.flags|=1,Bf(u,l,r,f),l.child;case 14:return r=l.type,n=pr(r,l.pendingProps),n=pr(r.type,n),hj(u,l,r,n,f);case 15:return HU(u,l,l.type,l.pendingProps,f);case 17:return r=l.type,n=l.pendingProps,n=l.elementType===r?n:pr(r,n),M$(u,l),l.tag=1,bf(r)?(u=!0,u3(l)):u=!1,w1(l,f),EU(l,r,n),U4(l,r,n,f),N4(null,l,r,!0,u,f);case 19:return SU(u,l,f);case 22:return BU(u,l,f)}throw Error(Ju(156,l.tag))};function aU(u,l){return GF(u,l)}function bz(u,l,f,r){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=r,this.subtreeFlags=this.flags=0,this.deletions=null,this.childLanes=this.lanes=0,this.alternate=null}function Gr(u,l,f,r){return new bz(u,l,f,r)}function UA(u){return u=u.prototype,!(!u||!u.isReactComponent)}function vz(u){if(typeof u==="function")return UA(u)?1:0;if(u!==void 0&&u!==null){if(u=u.$$typeof,u===X4)return 11;if(u===S4)return 14}return 2}function Un(u,l){var f=u.alternate;return f===null?(f=Gr(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 h$(u,l,f,r,n,i){var y=2;if(r=u,typeof u==="function")UA(u)&&(y=1);else if(typeof u==="string")y=5;else u:switch(u){case i1:return $i(f.children,n,i,l);case D4:y=8,n|=8;break;case p8:return u=Gr(12,f,l,n|2),u.elementType=p8,u.lanes=i,u;case m8:return u=Gr(13,f,l,n),u.elementType=m8,u.lanes=i,u;case P8:return u=Gr(19,f,l,n),u.elementType=P8,u.lanes=i,u;case yF:return z3(f,n,i,l);default:if(typeof u==="object"&&u!==null)switch(u.$$typeof){case nF:y=10;break u;case iF:y=9;break u;case X4:y=11;break u;case S4:y=14;break u;case un:y=16,r=null;break u}throw Error(Ju(130,u==null?u:typeof u,""))}return l=Gr(y,f,l,n),l.elementType=u,l.type=r,l.lanes=i,l}function $i(u,l,f,r){return u=Gr(7,u,r,l),u.lanes=f,u}function z3(u,l,f,r){return u=Gr(22,u,r,l),u.elementType=yF,u.lanes=f,u.stateNode={isHidden:!1},u}function X8(u,l,f){return u=Gr(6,u,null,l),u.lanes=f,u}function S8(u,l,f){return l=Gr(4,u.children!==null?u.children:[],u.key,l),l.lanes=f,l.stateNode={containerInfo:u.containerInfo,pendingChildren:null,implementation:u.implementation},l}function kz(u,l,f,r,n){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=q8(0),this.expirationTimes=q8(-1),this.entangledLanes=this.finishedLanes=this.mutableReadLanes=this.expiredLanes=this.pingedLanes=this.suspendedLanes=this.pendingLanes=0,this.entanglements=q8(0),this.identifierPrefix=r,this.onRecoverableError=n,this.mutableSourceEagerHydrationData=null}function JA(u,l,f,r,n,i,y,t,_){return u=new kz(u,l,f,t,_),l===1?(l=1,i===!0&&(l|=8)):l=0,i=Gr(3,null,null,l),u.current=i,i.stateNode=u,i.memoizedState={element:r,isDehydrated:f,cache:null,transitions:null,pendingSuspenseBoundaries:null},d4(i),u}function Iz(u,l,f){var r=3{function lJ(){if(typeof __REACT_DEVTOOLS_GLOBAL_HOOK__>"u"||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!=="function")return;try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(lJ)}catch(u){console.error(u)}}lJ(),fJ.exports=uJ()});var nJ=ir((wA)=>{var rJ=WA();wA.createRoot=rJ.createRoot,wA.hydrateRoot=rJ.hydrateRoot;var dz});var rN=ir((Ac)=>{var JO=Jl(),QO=Symbol.for("react.element"),NO=Symbol.for("react.fragment"),qO=Object.prototype.hasOwnProperty,WO=JO.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner,wO={key:!0,ref:!0,__self:!0,__source:!0};function fN(u,l,f){var r,n={},i=null,y=null;f!==void 0&&(i=""+f),l.key!==void 0&&(i=""+l.key),l.ref!==void 0&&(y=l.ref);for(r in l)qO.call(l,r)&&!wO.hasOwnProperty(r)&&(n[r]=l[r]);if(u&&u.defaultProps)for(r in l=u.defaultProps,l)n[r]===void 0&&(n[r]=l[r]);return{$$typeof:QO,type:u,key:i,ref:y,props:n,_owner:WO.current}}Ac.Fragment=NO;Ac.jsx=fN;Ac.jsxs=fN});var iN=ir((KP,nN)=>{nN.exports=rN()});var pq=ir((Yq)=>{var cy=Jl();function mV(u,l){return u===l&&(u!==0||1/u===1/l)||u!==u&&l!==l}var PV=typeof Object.is==="function"?Object.is:mV,CV=cy.useState,MV=cy.useEffect,RV=cy.useLayoutEffect,xV=cy.useDebugValue;function hV(u,l){var f=l(),r=CV({inst:{value:f,getSnapshot:l}}),n=r[0].inst,i=r[1];return RV(function(){n.value=f,n.getSnapshot=l,A9(n)&&i({inst:n})},[u,f,l]),MV(function(){return A9(n)&&i({inst:n}),u(function(){A9(n)&&i({inst:n})})},[u]),xV(f),f}function A9(u){var l=u.getSnapshot;u=u.value;try{var f=l();return!PV(u,f)}catch(r){return!0}}function bV(u,l){return l()}var vV=typeof window>"u"||typeof window.document>"u"||typeof window.document.createElement>"u"?bV:hV;Yq.useSyncExternalStore=cy.useSyncExternalStore!==void 0?cy.useSyncExternalStore:vV});var Pq=ir((Jb,mq)=>{mq.exports=pq()});var Mq=ir((Cq)=>{var n6=Jl(),kV=Pq();function IV(u,l){return u===l&&(u!==0||1/u===1/l)||u!==u&&l!==l}var gV=typeof Object.is==="function"?Object.is:IV,sV=kV.useSyncExternalStore,aV=n6.useRef,oV=n6.useEffect,dV=n6.useMemo,eV=n6.useDebugValue;Cq.useSyncExternalStoreWithSelector=function(u,l,f,r,n){var i=aV(null);if(i.current===null){var y={hasValue:!1,value:null};i.current=y}else y=i.current;i=dV(function(){function _(J){if(!c){if(c=!0,A=J,J=r(J),n!==void 0&&y.hasValue){var Q=y.value;if(n(Q,J))return j=Q}return j=J}if(Q=j,gV(A,J))return Q;var w=r(J);if(n!==void 0&&n(Q,w))return A=J,Q;return A=J,j=w}var c=!1,A,j,F=f===void 0?null:f;return[function(){return _(l())},F===null?void 0:function(){return _(F())}]},[l,f,r,n]);var t=sV(u,i[0],i[1]);return oV(function(){y.hasValue=!0,y.value=t},[t]),eV(t),t}});var xq=ir((Nb,Rq)=>{Rq.exports=Mq()});var gn=Pu(Jl(),1);var c$="北京时间";var IK={timeZone:"Asia/Shanghai",hour12:!1},gK={timeZone:"Asia/Shanghai",hour12:!1},sK=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 f8(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 R7(u){let l=f8(u);if(!l)return null;return sK.formatToParts(l).reduce((f,r)=>{if(r.type!=="literal")f[r.type]=r.value;return f},{})}function qu(u){let l=f8(u);return l?l.toLocaleString("zh-CN",IK):"--"}function tl(u){let l=f8(u);return l?l.toLocaleTimeString("zh-CN",gK):"--"}function r8(u){let l=R7(u);if(!l)return"";let f=l.hour==="24"?"00":l.hour;return`${l.year}-${l.month}-${l.day}T${f}:${l.minute}`}function x7(u=new Date){let l=R7(u);if(!l)return"";return`${l.year}-${l.month}-${l.day}`}function h7(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,r,n,i,y,t="00"]=l,_=Date.UTC(Number(f),Number(r)-1,Number(n),Number(i)-8,Number(y),Number(t)),c=new Date(_),A=r8(c);return Number.isNaN(c.getTime())||A!==`${f}-${r}-${n}T${i}:${y}`?null:c.toISOString()}var JL=Pu(nJ(),1);var V3=Pu(Jl(),1);var iJ=Pu(Jl(),1),Ot=iJ.default.createElement;function ez({active:u=!0,label:l="正在加载"}){if(!u)return null;return Ot("span",{className:"loading-spinner-indicator",role:"status","aria-label":l,title:l,"data-testid":"loading-title-indicator"},Ot("span",{className:"loading-spinner-ring","aria-hidden":!0}))}function nl({title:u,children:l,loading:f,level:r=2,className:n="",label:i="正在加载"}){return Ot(r===3?"h3":"h2",{className:`loading-title ${f?"is-loading":""} ${n}`.trim()},Ot("span",{className:"loading-title-text"},l??u),Ot(ez,{active:Boolean(f),label:i}))}class V1 extends Error{unideskRequestError=!0;meta;constructor(u,l){super(u);this.name="UniDeskRequestError",this.meta=l}}function uT(u){return new Promise((l)=>setTimeout(l,u))}function Vt(u,l="操作失败"){return u instanceof Error?u.message:String(u||l)}function H3(u,l=500){if(u===null||u===void 0)return"";let f=typeof u==="string"?u:JSON.stringify(u),r=String(f||"").replace(/\s+/gu," ").trim();return r.length>l?`${r.slice(0,l)}...`:r}function lT(u){try{let l=typeof location<"u"&&location.origin?location.origin:"http://localhost";return new URL(u,l).toString()}catch{return u}}function yJ(u){return String(u.method||"GET").toUpperCase()}function fT(u){if(u===null||u===void 0)return!1;if(typeof u!=="object")return!1;if(typeof Blob<"u"&&u instanceof Blob)return!1;if(typeof FormData<"u"&&u instanceof FormData)return!1;if(typeof URLSearchParams<"u"&&u instanceof URLSearchParams)return!1;if(typeof ArrayBuffer<"u"&&u instanceof ArrayBuffer)return!1;return!0}function tJ(u){let l=new Headers(u.headers||{}),f=fT(u.body)?JSON.stringify(u.body):u.body;if(f&&!l.has("content-type")&&typeof f==="string")l.set("content-type","application/json");return{...u,credentials:u.credentials||"same-origin",body:f,headers:l}}function _J(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 rT(u,l){if(!u||typeof u!=="object"||Array.isArray(u))return!1;return l.some((f)=>f!==!1&&u[f]===!1)}function Ht(u,l,f,r,n={}){return{kind:u,method:f,url:lT(l),occurredAt:r.toISOString(),...n}}function Bt(u,l){if(!u)return"请求失败";return`HTTP ${u}${l?` ${l}`:""}`}function $J(u){try{return{body:u?JSON.parse(u):null,parseError:""}}catch(l){return{body:{text:u},parseError:Vt(l,"parse failed")}}}async function Tu(u,l={},f=0){let{failureFields:r=["ok"],strictJson:n=!1,retryInvalidJson:i=0,retryDelayMs:y=120,invalidJsonPrefix:t="服务返回了无效 JSON",invalidJsonPreview:_=!1,responsePreviewLength:c=500,...A}=l,j=yJ(A),F=new Date,J;try{J=await fetch(u,tJ(A))}catch(L){let U=Vt(L,"网络请求失败");throw new V1(U,Ht("network",u,j,F,{upstreamMessage:U}))}let Q=await J.text(),w=$J(Q);if(w.parseError){if(n&&j==="GET"&&f=300)?Bt(u.meta.status,u.meta.statusText):"应用请求失败",i=u.meta.status?Bt(u.meta.status):"",y=(_)=>!_||_===n||_===i,t=!y(u.message)?u.message:y(u.meta.upstreamMessage)?"":u.meta.upstreamMessage||"";return{title:n,message:t,status:u.meta.status,statusText:u.meta.statusText,method:u.meta.method,url:u.meta.url,occurredAt:nT(u.meta.occurredAt),responsePreview:u.meta.responsePreview,parseError:u.meta.parseError,structured:!0}}let r=Vt(u,l).split(/\r?\n/u);return{title:r[0]||l,message:r.slice(1).join(` -`),structured:r.length>1}}function iT(u,l="操作失败"){let f=LA(u,l),r=[f.title];if(f.message)r.push(`原因: ${f.message}`);if(f.method||f.url)r.push(`请求: ${[f.method,f.url].filter(Boolean).join(" ")}`);if(f.status)r.push(`状态: ${Bt(f.status,f.statusText)}`);if(f.occurredAt)r.push(`时间: ${f.occurredAt}`);if(f.parseError)r.push(`解析错误: ${f.parseError}`);if(f.responsePreview&&f.responsePreview!==f.message)r.push(`响应预览: ${f.responsePreview}`);return r.filter(Boolean).join(` -`)}function Ou(u,l="操作失败"){return AJ(u)?iT(u,l):Vt(u,l)}var jJ=Pu(Jl(),1);var wn=jJ.default.createElement;function Dt(u,l){return l?[wn("dt",{key:`${u}-label`},u),wn("dd",{key:u},l)]:null}function il({error:u,wide:l=!1,fallback:f="操作失败",className:r=""}){if(!u)return null;let n=LA(u,f),i=[Dt("请求",[n.method,n.url].filter(Boolean).join(" ")),Dt("状态",n.status?`HTTP ${n.status}${n.statusText?` ${n.statusText}`:""}`:""),Dt("时间",n.occurredAt),Dt("解析错误",n.parseError),Dt("响应预览",n.responsePreview)].filter(Boolean);return wn("div",{className:`form-error unidesk-error${l?" wide":""}${r?` ${r}`:""}`,role:"alert","data-testid":"unidesk-error"},wn("div",{className:"unidesk-error-title"},wn("strong",null,n.title),n.status?wn("span",{className:"unidesk-error-code"},`HTTP ${n.status}`):null),n.message?wn("pre",{className:"unidesk-error-message"},n.message):null,i.length>0?wn("dl",{className:"unidesk-error-details"},i):null)}var i0=Pu(Jl(),1),FJ=i0.default.createContext(null);function UJ({children:u}){let[l,f]=i0.default.useState([]),[r,n]=i0.default.useState(Date.now()),i=i0.default.useCallback((j,F)=>{let Q={id:`notif_${Date.now()}_${Math.random().toString(36).slice(2,8)}`,type:j,message:F,timestamp:Date.now()};f((w)=>{let L=[...w,Q];if(L.length>50)return L.slice(-50);return L})},[]),y=i0.default.useCallback((j)=>{f((F)=>F.filter((J)=>J.id!==j))},[]),t=i0.default.useCallback(()=>{f([]),n(Date.now())},[]),_=i0.default.useMemo(()=>{return l.filter((j)=>j.timestamp>r).length},[l,r]),c=_>0,A={notifications:l,addNotification:i,removeNotification:y,clearNotifications:t,unreadCount:_,hasUnread:c};return yT(FJ.Provider,{value:A},u)}var yT=i0.default.createElement;function Xf(){let u=i0.default.useContext(FJ);if(!u)throw Error("useNotification must be used within NotificationProvider");return u}var R=V3.default.createElement,{useEffect:B3}=V3.default,D1=V3.default.useState;function Kf(u,l={}){return Tu(u,{failureFields:["ok","success"],...l})}function Sf(u,l){return`${u}/microservices/baidu-netdisk/proxy${l}`}function tT(u){let l=Number(u);return Number.isFinite(l)?l.toLocaleString("zh-CN"):"--"}function Ln(u){let l=Number(u);if(!Number.isFinite(l)||l<=0)return"--";let f=["B","KB","MB","GB","TB"],r=l,n=0;while(r>=1024&&n{n?.stopPropagation?.(),f(u,l)}},"查看原始JSON")}function S1({title:u,text:l}){return R("div",{className:"empty-state"},R("strong",null,u),R("span",null,l))}function Y1({title:u,text:l,href:f,badge:r,testId:n}){return R("a",{className:"doc-link-card",href:f,target:"_blank",rel:"noreferrer","data-testid":n},R("span",null,r||"DOC"),R("strong",null,u),R("p",null,l),R("code",null,f))}function _T(u){return u?.runtime&&typeof u.runtime==="object"&&!Array.isArray(u.runtime)?u.runtime:{}}function $T(u){return u?.backend&&typeof u.backend==="object"&&!Array.isArray(u.backend)?u.backend:{}}function cT(u){return u?.repository&&typeof u.repository==="object"&&!Array.isArray(u.repository)?u.repository:{}}function AT(u){return Array.isArray(u?.files)?u.files:[]}function jT(u){return Array.isArray(u?.jobs)?u.jobs:[]}function FT(u,l){if(!u||u===l)return l;let f=u.replace(/\/+$/u,""),r=f.slice(0,f.lastIndexOf("/"))||l;return r.lengthx.id==="baidu-netdisk")||null,[n,i]=D1({loading:!1,actionLoading:!1,error:"",message:"",health:null,account:null,files:null,transfers:null,logs:null,selfTest:null,refreshedAt:null}),[y,t]=D1("/"),[_,c]=D1(null),[A,j]=D1(""),[F,J]=D1({localPath:"sample.txt",remotePath:"/sample.txt"}),[Q,w]=D1({fsId:"",localPath:"downloads/"}),{addNotification:L}=Xf(),U=n.health?.baidu?.appRoot||n.account?.rootPath||"/";B3(()=>{J((x)=>{let lu=new Set(["/sample.txt","/apps/UniDeskBaiduNetdisk/sample.txt"]);if(x.remotePath&&!lu.has(x.remotePath))return x;let _u=KA(U,"sample.txt");return x.remotePath===_u?x:{...x,remotePath:_u}})},[U]);async function N(x=y){let _u=await Kf(Sf(f,`/api/files?dir=${encodeURIComponent(x||U)}&limit=100`));i(($u)=>({...$u,files:_u}))}async function q(){let x=await Kf(Sf(f,"/api/transfers?limit=80"));i((lu)=>({...lu,transfers:x}))}async function W(){if(!r)return;i((x)=>({...x,loading:!0,error:"",message:""}));try{let x=await Kf(`${f}/microservices/baidu-netdisk/health`),lu=x?.baidu?.appRoot||U,_u=null,$u=null;if(x?.auth?.loggedIn){_u=await Kf(Sf(f,"/api/account?refresh=1"));let Wu=y&&y.startsWith(lu)?y:lu;t(Wu),$u=await Kf(Sf(f,`/api/files?dir=${encodeURIComponent(Wu)}&limit=100`))}else t(lu);let ju=await Kf(Sf(f,"/api/transfers?limit=80")),zu=await Kf(Sf(f,"/logs?limit=60"));i((Wu)=>({...Wu,loading:!1,health:x,account:_u?.account||null,files:$u,transfers:ju,logs:zu,refreshedAt:new Date}))}catch(x){i((lu)=>({...lu,loading:!1,error:Ou(x,"百度网盘服务加载失败")}))}}async function z(){i((x)=>({...x,actionLoading:!0,error:"",message:""}));try{let x=await Kf(Sf(f,"/api/auth/device/start"),{method:"POST",body:{}});c(x.session||null),i((lu)=>({...lu,actionLoading:!1,message:"设备码已生成,请扫码授权"}))}catch(x){i((lu)=>({...lu,actionLoading:!1,error:Ou(x,"创建设备码失败")}))}}async function Z(x=!1){if(!_?.id)return;if(x)i((lu)=>({...lu,actionLoading:!0,error:""}));try{let lu=await Kf(Sf(f,`/api/auth/device/status?sessionId=${encodeURIComponent(_.id)}`));if(c(lu.session||null),lu.session?.status==="succeeded")i((_u)=>({..._u,actionLoading:!1,message:"授权成功,正在刷新账号与文件列表"})),await W();else if(x)i((_u)=>({..._u,actionLoading:!1}))}catch(lu){i((_u)=>({..._u,actionLoading:!1,error:Ou(lu,"轮询登录状态失败")}))}}async function H(){i((x)=>({...x,actionLoading:!0,error:"",message:""}));try{await Kf(Sf(f,"/api/auth/logout"),{method:"POST",body:{}}),c(null),i((x)=>({...x,actionLoading:!1,account:null,files:null,message:"本地 token 已清除"})),await W()}catch(x){i((lu)=>({...lu,actionLoading:!1,error:Ou(x,"退出登录失败")}))}}async function E(x){x.preventDefault();let lu=A.trim();if(!lu)return;i((_u)=>({..._u,actionLoading:!0,error:"",message:""}));try{await Kf(Sf(f,"/api/folders"),{method:"POST",body:{path:KA(y,lu)}}),j(""),i((_u)=>({..._u,actionLoading:!1,message:"文件夹已创建"})),await N(y)}catch(_u){i(($u)=>({...$u,actionLoading:!1,error:Ou(_u,"创建文件夹失败")}))}}async function D(x){if(!x)return;i((lu)=>({...lu,actionLoading:!0,error:"",message:""}));try{await Kf(Sf(f,"/api/files/manage"),{method:"POST",body:{opera:"delete",filelist:[{path:x}],async:1}}),i((lu)=>({...lu,actionLoading:!1,message:"删除任务已提交"})),await N(y)}catch(lu){i((_u)=>({..._u,actionLoading:!1,error:Ou(lu,"删除失败")}))}}async function h(x){x.preventDefault(),i((lu)=>({...lu,actionLoading:!0,error:"",message:""}));try{await Kf(Sf(f,"/api/transfers/upload-from-path"),{method:"POST",body:F}),i((lu)=>({...lu,actionLoading:!1,message:"上传任务已入队"})),await q()}catch(lu){i((_u)=>({..._u,actionLoading:!1,error:Ou(lu,"上传任务创建失败")}))}}async function V(x){x.preventDefault(),i((lu)=>({...lu,actionLoading:!0,error:"",message:""}));try{await Kf(Sf(f,"/api/transfers/download-to-path"),{method:"POST",body:Q}),i((lu)=>({...lu,actionLoading:!1,message:"下载任务已入队"})),await q()}catch(lu){i((_u)=>({..._u,actionLoading:!1,error:Ou(lu,"下载任务创建失败")}))}}async function S(x,lu){i((_u)=>({..._u,actionLoading:!0,error:"",message:""}));try{await Kf(Sf(f,`/api/transfers/${encodeURIComponent(x)}/${lu}`),{method:"POST",body:{}}),i((_u)=>({..._u,actionLoading:!1,message:lu==="cancel"?"已请求取消任务":"任务已重新入队"})),await q()}catch(_u){i(($u)=>({...$u,actionLoading:!1,error:Ou(_u,"任务操作失败")}))}}async function p(){i((x)=>({...x,actionLoading:!0,error:"",message:"正在运行上传/下载自测..."}));try{let x=await Kf(Sf(f,"/api/self-test"),{method:"POST",body:{}});i((lu)=>({...lu,actionLoading:!1,selfTest:x,message:`上传/下载自测通过:${x.remotePath||""}`})),await N(y),await q()}catch(x){i((lu)=>({...lu,actionLoading:!1,error:Ou(x,"上传/下载自测失败")}))}}if(B3(()=>{if(!r)return;W();return},[r?.id,r?.runtime?.providerStatus]),B3(()=>{if(!_?.id||_.status!=="pending")return;let x=window.setInterval(()=>void Z(!1),Math.max(5000,Number(_.pollIntervalSeconds||5)*1000));return()=>window.clearInterval(x)},[_?.id,_?.status,_?.pollIntervalSeconds]),B3(()=>{if(!r)return;let x=window.setInterval(()=>void q(),5000);return()=>window.clearInterval(x)},[r?.id]),!r)return R(S1,{title:"Baidu Netdisk 未登记",text:"请在 config.json 的 microservices 中登记用户服务 id=baidu-netdisk"});let O=_T(r),m=cT(r),X=$T(r),v=n.health||{},T=n.account||v.auth?.account||null,Y=v.auth||{},k=AT(n.files),I=jT(n.transfers),b=T?.quota||{},o=Boolean(Y.loggedIn||T),g=Boolean(Y.configured);return R("div",{className:"baidu-netdisk-page","data-testid":"baidu-netdisk-page"},R(qi,{title:"Baidu Netdisk 工作台",eyebrow:"Containerized Storage Gateway",loading:n.loading,actions:R("div",{className:"panel-actions"},R("a",{className:"ghost-btn",href:"/docs/issue/baidu-netdisk-env-setup.md",target:"_blank",rel:"noreferrer","data-testid":"baidu-netdisk-config-doc-link"},"配置文档"),R("button",{type:"button",className:"ghost-btn",onClick:W,disabled:n.loading,"data-testid":"baidu-netdisk-refresh"},n.loading?"刷新中":"刷新"),R(V0,{title:"Baidu Netdisk 用户服务",data:r,onOpen:l,testId:"raw-baidu-netdisk-service"}))},R("div",{className:"baidu-netdisk-hero"},R("div",null,R("div",{className:"node-version-line"},R(Ni,{status:O.providerStatus==="online"?"online":"warn"},O.providerStatus||"unknown"),R("span",null,r.providerId),R(Ni,{status:X.public?"warn":"private"},X.public?"公网暴露":"仅 UniDesk frontend 代理访问")),R("p",{className:"muted paragraph"},r.description)),R("div",{className:"microservice-ref-card"},R("span",null,"Repo"),R("strong",null,m.url||"--"),R("code",null,m.commitId||"--")),R("div",{className:"microservice-ref-card"},R("span",null,"Private Backend"),R("strong",null,`${X.nodeBindHost||"--"}:${X.nodePort||"--"}`),R("code",null,`${m.composeFile||"--"} / ${m.composeService||"--"}`))),R(il,{error:n.error,wide:!0})),R("div",{className:"metric-grid"},R(X1,{label:"Health",value:v.ok?"OK":"--",hint:v.storage?.postgres||"postgres",tone:v.ok?"ok":"warn"}),R(X1,{label:"OAuth",value:g?"已配置":"待配置",hint:g?"client + secret + token key":"需要设置 UNIDESK_BAIDU_NETDISK_*",tone:g?"ok":"warn"}),R(X1,{label:"Login",value:o?"已登录":"未登录",hint:T?.username||"Device Code QR",tone:o?"ok":"warn"}),R(X1,{label:"Work Root",value:UT(U),hint:U}),R(X1,{label:"Quota",value:Ln(b.used),hint:b.total?`${b.usedPercent||0}% / ${Ln(b.total)}`:"授权后刷新"}),R(X1,{label:"Transfers",value:tT(I.length),hint:`running ${n.transfers?.counts?.running||0} / failed ${n.transfers?.counts?.failed||0}`})),R(qi,{title:"文件浏览器",eyebrow:y,className:"baidu-files-panel",loading:n.loading,actions:R("div",{className:"panel-actions inline-actions"},R("button",{type:"button",className:"ghost-btn",onClick:()=>{let x=FT(y,U);t(x),N(x)},disabled:!o||y===U},"上级"),R("button",{type:"button",className:"ghost-btn",onClick:()=>N(y),disabled:!o},"刷新文件"),R(V0,{title:"Baidu Files",data:n.files,onOpen:l,testId:"raw-baidu-files"}))},R("form",{className:"baidu-pathbar",onSubmit:(x)=>{x.preventDefault(),N(y)}},R("input",{value:y,onChange:(x)=>t(x.target.value),disabled:!o}),R("button",{type:"submit",className:"ghost-btn",disabled:!o},"打开路径")),R("form",{className:"baidu-pathbar",onSubmit:E},R("input",{value:A,onChange:(x)=>j(x.target.value),placeholder:"新文件夹名称",disabled:!o}),R("button",{type:"submit",className:"primary-btn",disabled:!o||!A.trim()},"新建文件夹")),!o?R(S1,{title:"等待授权",text:"登录后通过 /api/files 读取工作目录文件列表"}):k.length===0?R(S1,{title:"目录为空",text:"可以从 staging 目录上传文件或新建文件夹"}):R("div",{className:"table-wrap","data-testid":"baidu-netdisk-file-table"},R("table",null,R("thead",null,R("tr",null,R("th",null,"名称"),R("th",null,"类型"),R("th",null,"大小"),R("th",null,"修改时间"),R("th",null,"fs_id"),R("th",null,"操作"))),R("tbody",null,k.map((x)=>R("tr",{key:x.fsId||x.path},R("td",null,R("strong",null,x.serverFilename||x.path),R("code",null,x.path||"--")),R("td",null,R(Ni,{status:x.isDir?"queued":"private"},x.isDir?"DIR":"FILE")),R("td",null,x.isDir?"--":Ln(x.size)),R("td",null,x.serverMtime?qu(x.serverMtime*1000):"--"),R("td",null,R("code",null,x.fsId||"--")),R("td",null,R("div",{className:"inline-actions"},x.isDir?R("button",{type:"button",className:"ghost-btn",onClick:()=>{t(x.path),N(x.path)}},"打开"):R("button",{type:"button",className:"ghost-btn",onClick:()=>w((lu)=>({...lu,fsId:x.fsId}))},"填入下载"),R("button",{type:"button",className:"ghost-btn",onClick:()=>D(x.path),disabled:n.actionLoading},"删除"))))))))),R("div",{className:"baidu-netdisk-grid"},R(qi,{title:"配置与文档",eyebrow:"Deployment References",className:"baidu-docs-panel",actions:R("div",{className:"panel-actions inline-actions"},R("a",{className:"ghost-btn",href:"/docs/issue/baidu-netdisk-env-setup.md",target:"_blank",rel:"noreferrer"},"打开环境配置"),R("a",{className:"ghost-btn",href:"/docs/issue/baidu-netdisk-user-service.md",target:"_blank",rel:"noreferrer"},"打开服务方案"))},R("p",{className:"muted paragraph"},g?"OAuth 运行时变量已配置;如需轮换密钥、迁移部署或排查代理边界,可直接打开下面的项目内文档。":"首次使用请先按环境变量配置文档填入百度应用 client id / secret,然后重建 baidu-netdisk 服务并刷新本页。"),R("div",{className:"baidu-doc-grid","data-testid":"baidu-netdisk-doc-links"},R(Y1,{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"}),R(Y1,{title:"服务方案与 API",text:"说明 OAuth Device Code、根目录工作区、staging 上传下载任务和后端 API 设计。",href:"/docs/issue/baidu-netdisk-user-service.md",badge:"DESIGN"}),R(Y1,{title:"用户服务安全边界",text:"查看 UniDesk microservice 私有代理、允许路径、frontendOnly 和密钥边界规则。",href:"/docs/reference/microservices.md",badge:"REF"}),R(Y1,{title:"部署与重建流程",text:"查看 server rebuild、Compose 编排、健康检查和交付验证的长期规则。",href:"/docs/reference/deployment.md",badge:"DEPLOY"}),R(Y1,{title:"CLI 验证命令",text:"查看 microservice health/proxy、server rebuild、job status 等命令入口。",href:"/docs/reference/cli.md",badge:"CLI"}),R(Y1,{title:"百度设备码模式",text:"打开百度官方 OAuth Device Code 文档,对照扫码登录和轮询参数。",href:"https://pan.baidu.com/union/doc/fl1x114ti",badge:"OFFICIAL"}))),R(qi,{title:"设备码登录",eyebrow:"OAuth Device Code",className:"baidu-login-panel",loading:n.actionLoading,actions:R("div",{className:"panel-actions inline-actions"},R("button",{type:"button",className:"primary-btn",onClick:z,disabled:n.actionLoading||!g,"data-testid":"baidu-netdisk-start-login"},"生成二维码"),_?.id?R("button",{type:"button",className:"ghost-btn",onClick:()=>Z(!0),disabled:n.actionLoading},"检查状态"):null,o?R("button",{type:"button",className:"ghost-btn",onClick:H,disabled:n.actionLoading},"清除本地登录"):null,R(V0,{title:"Baidu Device Session",data:_||Y.latestSession,onOpen:l,testId:"raw-baidu-device-session"}))},R("div",{className:"baidu-login-card","data-testid":"baidu-netdisk-login-card"},R("div",{className:"baidu-qr-frame"},_?.qrcodeUrl?R("img",{src:_.qrcodeUrl,alt:"百度网盘设备码授权二维码","data-testid":"baidu-netdisk-qrcode"}):R(S1,{title:g?"等待二维码":"OAuth 未配置",text:g?"点击生成二维码后使用百度网盘或百度 App 扫码":"设置 client id、secret 和 token key 后重建服务"})),R("div",{className:"claudeqq-login-copy"},R("div",{className:"node-version-line"},R(Ni,{status:o?"online":_?.status==="pending"?"warn":"unknown"},o?"已登录":_?.status||"未开始"),R("span",null,_?.secondsRemaining!==void 0?`${_.secondsRemaining}s`:"--"),R("span",null,"scope basic,netdisk")),R("p",{className:"muted paragraph"},o?"access token / refresh token 已加密保存到 PostgreSQL;前端只看到脱敏登录态。":"后端使用百度 OAuth Device Code 轮询换取 token;二维码过期后重新生成即可。"),R("div",{className:"microservice-ref-card"},R("span",null,"User Code"),R("strong",null,_?.userCode||"--"),R("code",null,_?.verificationUrl||"https://openapi.baidu.com/device")),R("div",{className:"microservice-ref-card"},R("span",null,"Expires"),R("strong",null,_?.expiresAt?qu(_.expiresAt):"--"),R("code",null,_?.error||"no token exposed"))))),R(qi,{title:"账号与容量",eyebrow:n.refreshedAt?`Updated ${tl(n.refreshedAt)}`:"Account",loading:n.loading,actions:R("div",{className:"panel-actions inline-actions"},R(V0,{title:"Baidu Account",data:T,onOpen:l,testId:"raw-baidu-account"}))},T?R("div",{className:"baidu-account-card"},R("div",{className:"node-version-line"},R(Ni,{status:"online"},"connected"),R("span",null,T.baiduUid||"--"),R("span",null,`VIP ${T.vipType??"--"}`)),R("h3",null,T.username||"Baidu Netdisk"),R("p",{className:"muted paragraph"},`工作目录固定在 ${T.rootPath||U};v1 上传/下载只读写容器 staging 目录,不把大文件字节流穿过 UniDesk proxy。`),R("div",{className:"quota-bar"},R("span",{style:{width:`${Math.max(0,Math.min(100,Number(b.usedPercent||0)))}%`}})),R("div",{className:"microservice-ref-card"},R("span",null,"Quota"),R("strong",null,`${Ln(b.used)} / ${Ln(b.total)}`),R("code",null,`${b.usedPercent||0}% used`))):R(S1,{title:"尚未登录",text:"扫码授权后这里会显示账号、UID、会员状态和容量"})),R(qi,{title:"传输任务",eyebrow:"staging path jobs",className:"baidu-transfers-panel",loading:n.actionLoading,actions:R("div",{className:"panel-actions inline-actions"},R("button",{type:"button",className:"primary-btn",onClick:p,disabled:!o||n.actionLoading,"data-testid":"baidu-netdisk-self-test"},"运行自测"),R("button",{type:"button",className:"ghost-btn",onClick:q},"刷新任务"),R(V0,{title:"Baidu Transfers",data:n.transfers,onOpen:l,testId:"raw-baidu-transfers"}))},R("div",{className:"baidu-transfer-forms"},R("form",{className:"stack-form",onSubmit:h,"data-testid":"baidu-upload-form"},R("label",null,"容器 staging 文件",R("input",{value:F.localPath,onChange:(x)=>J((lu)=>({...lu,localPath:x.target.value})),placeholder:"sample.txt"})),R("label",null,"百度网盘目标路径",R("input",{value:F.remotePath,onChange:(x)=>J((lu)=>({...lu,remotePath:x.target.value})),placeholder:KA(U,"sample.txt")})),R("button",{type:"submit",className:"primary-btn",disabled:!o||n.actionLoading},"上传 staging 文件")),R("form",{className:"stack-form",onSubmit:V,"data-testid":"baidu-download-form"},R("label",null,"文件 fs_id",R("input",{value:Q.fsId,onChange:(x)=>w((lu)=>({...lu,fsId:x.target.value})),placeholder:"从文件表填入"})),R("label",null,"保存到 staging 路径",R("input",{value:Q.localPath,onChange:(x)=>w((lu)=>({...lu,localPath:x.target.value})),placeholder:"downloads/"})),R("button",{type:"submit",className:"primary-btn",disabled:!o||!Q.fsId||n.actionLoading},"下载到 staging"))),n.selfTest?R("div",{className:"baidu-account-card","data-testid":"baidu-netdisk-self-test-result"},R("div",{className:"node-version-line"},R(Ni,{status:n.selfTest.ok?"online":"warn"},n.selfTest.ok?"self-test ok":"self-test"),R("span",null,Ln(n.selfTest.sizeBytes))),R("h3",null,n.selfTest.remotePath||"Baidu self-test"),R("div",{className:"microservice-ref-card"},R("span",null,"fs_id"),R("strong",null,n.selfTest.fsId||"--"),R("code",null,n.selfTest.downloadedPath||"--")),R("div",{className:"microservice-ref-card"},R("span",null,"MD5"),R("strong",null,n.selfTest.downloadedMd5||"--"),R("code",null,n.selfTest.expectedMd5||"--")),R(V0,{title:"Baidu Self Test",data:n.selfTest,onOpen:l,testId:"raw-baidu-self-test"})):null,I.length===0?R(S1,{title:"暂无传输任务",text:"上传/下载任务会在后端容器内执行,避免大文件穿过 UniDesk proxy"}):R("div",{className:"table-wrap","data-testid":"baidu-transfer-table"},R("table",null,R("thead",null,R("tr",null,R("th",null,"状态"),R("th",null,"方向"),R("th",null,"路径"),R("th",null,"进度"),R("th",null,"时间"),R("th",null,"操作"))),R("tbody",null,I.map((x)=>R("tr",{key:x.id},R("td",null,R(Ni,{status:x.status},x.status)),R("td",null,x.direction),R("td",null,R("strong",null,x.remotePath||x.fsId||"--"),R("code",null,x.localPath||"--"),x.error?R("span",{className:"form-error"},x.error):null),R("td",null,R(JT,{percent:x.progressPercent}),R("span",{className:"muted"},`${Ln(x.bytesDone)} / ${Ln(x.sizeBytes)}`)),R("td",null,qu(x.updatedAt)),R("td",null,R("div",{className:"inline-actions"},["queued","running"].includes(x.status)?R("button",{type:"button",className:"ghost-btn",onClick:()=>S(x.id,"cancel")},"取消"):null,["failed","canceled"].includes(x.status)?R("button",{type:"button",className:"ghost-btn",onClick:()=>S(x.id,"retry")},"重试"):null,R(V0,{title:`Transfer ${x.id}`,data:x,onOpen:l}))))))))),R(qi,{title:"安全与日志",eyebrow:"redacted diagnostics",className:"baidu-wide-panel",loading:n.loading,actions:R("div",{className:"panel-actions inline-actions"},R(V0,{title:"Baidu Health",data:v,onOpen:l,testId:"raw-baidu-health"}),R(V0,{title:"Baidu Logs",data:n.logs,onOpen:l,testId:"raw-baidu-logs"}))},R("div",{className:"policy-grid"},R("article",null,R("b",null,"私有后端"),R("span",null,"4244 只在 Compose 网络 expose,浏览器经 UniDesk 同源代理访问")),R("article",null,R("b",null,"Token 加密"),R("span",null,"access/refresh token 使用 BAIDU_NETDISK_TOKEN_KEY 加密后写入 PostgreSQL")),R("article",null,R("b",null,"无浏览器大文件流"),R("span",null,"上传/下载以容器 staging 目录为边界,避免 proxy 文本通道传输大字节流"))))))}var S3=Pu(Jl(),1);var a=S3.default.createElement,{useEffect:QT}=S3.default,D3=S3.default.useState,Wi={label:"主用户私聊账号",userId:645275593};function GA(u){let l=Number(u);return Number.isFinite(l)?l.toLocaleString("zh-CN"):"--"}async function Kn(u,l={}){return Tu(u,{failureFields:["ok","success"],...l})}async function NT(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 X3({status:u,children:l}){let f=String(u||"unknown").toLowerCase();return a("span",{className:`status-badge ${f}`},l||u||"unknown")}function p1({label:u,value:l,hint:f,tone:r}){return a("article",{className:`metric-card ${r||""}`},a("div",{className:"metric-label"},u),a("div",{className:"metric-value"},l),a("div",{className:"metric-hint"},f))}function m1({title:u,eyebrow:l,actions:f,children:r,className:n,loading:i}){return a("section",{className:`panel ${n||""}`},a("div",{className:"panel-head"},a("div",null,l?a("p",{className:"panel-eyebrow"},l):null,a(nl,{title:u,loading:i})),f?a("div",{className:"panel-actions"},f):null),a("div",{className:"panel-body"},r))}function Xt({title:u,data:l,onOpen:f,testId:r}){return a("button",{type:"button",className:"ghost-btn","data-testid":r,onClick:(n)=>{n?.stopPropagation?.(),f(u,l)}},"查看原始JSON")}function St({title:u,text:l}){return a("div",{className:"empty-state"},a("strong",null,u),a("span",null,l))}function qT(u){return u?.runtime&&typeof u.runtime==="object"&&!Array.isArray(u.runtime)?u.runtime:{}}function WT(u){return u?.backend&&typeof u.backend==="object"&&!Array.isArray(u.backend)?u.backend:{}}function wT(u){return u?.repository&&typeof u.repository==="object"&&!Array.isArray(u.repository)?u.repository:{}}function Gn(u,l){return`${u}/microservices/claudeqq/proxy${l}`}function LT(u){return Array.isArray(u?.events)?u.events.slice(0,80):[]}function KT(u){return Array.isArray(u?.subscriptions)?u.subscriptions.slice(0,50):[]}function GT(u){return Array.isArray(u?.messages)?u.messages.slice(0,30):[]}function QJ(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 NJ(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 qJ({microservices:u,onRaw:l,apiBaseUrl:f="/api"}){let r=u.find((T)=>T.id==="claudeqq")||null,[n,i]=D3({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}),[y,t]=D3({targetType:"private",targetId:String(Wi.userId),message:""}),[_,c]=D3({name:"unidesk-callback",targetUrl:"",eventTypes:"message",secret:""}),[A,j]=D3(""),{addNotification:F}=Xf();async function J(){if(!r)return;i((T)=>({...T,loading:!0,error:""}));try{let[T,Y,k,I,b]=await Promise.all([NT(`${f}/microservices/claudeqq/health`),Kn(Gn(f,"/api/server/status")),Kn(Gn(f,"/api/events/recent?limit=60")),Kn(Gn(f,"/api/events/subscriptions")),Kn(Gn(f,"/api/messages/sent?limit=20"))]);if(i((o)=>({...o,loading:!1,error:"",health:T,status:Y,events:k,subscriptions:I,sent:b,refreshedAt:new Date})),!n.qrcodeFetched)Q(!1)}catch(T){i((Y)=>({...Y,loading:!1,error:Ou(T,"ClaudeQQ 加载失败")}))}}async function Q(T=!0){if(!r)return;i((Y)=>({...Y,qrLoading:!0,error:T?"":Y.error}));try{let Y=await Kn(Gn(f,"/api/napcat/login")),k=Y?.napcat?.qrcode||Y?.qrcode||null;i((I)=>({...I,qrLoading:!1,error:"",napcatLogin:Y,napcatQrcode:k,qrcodeFetched:!0,qrcodeRefreshedAt:new Date}))}catch(Y){i((k)=>({...k,qrLoading:!1,error:T||!k.napcatQrcode?Ou(Y,"NapCat 二维码加载失败"):k.error}))}}async function w(T){T.preventDefault(),j("");let Y=Number(y.targetId);if(!Number.isFinite(Y)||Y<=0||y.message.trim().length===0){i((k)=>({...k,error:"请填写 QQ 目标和消息内容"}));return}try{await Kn(Gn(f,"/api/push/text"),{method:"POST",body:JSON.stringify({userId:y.targetType==="private"?Y:void 0,groupId:y.targetType==="group"?Y:void 0,message:y.message})});let k="消息推送请求已提交";t((I)=>({...I,targetType:"private",targetId:String(Wi.userId),message:""})),j(k),F("success",k),await J()}catch(k){i((I)=>({...I,error:Ou(k,"发送失败")}))}}async function L(T){if(T.preventDefault(),j(""),_.targetUrl.trim().length===0){i((Y)=>({...Y,error:"请填写订阅回调 URL"}));return}try{await Kn(Gn(f,"/api/events/subscriptions"),{method:"POST",body:JSON.stringify({name:_.name,targetUrl:_.targetUrl,eventTypes:_.eventTypes.split(",").map((k)=>k.trim()).filter(Boolean),secret:_.secret||void 0,enabled:!0})});let Y="事件订阅已创建";j(Y),F("success",Y),await J()}catch(Y){i((k)=>({...k,error:Ou(Y,"订阅失败")}))}}async function U(T){if(!T)return;j("");try{await Kn(Gn(f,`/api/events/subscriptions/${encodeURIComponent(T)}`),{method:"DELETE"});let Y="事件订阅已删除";j(Y),F("success",Y),await J()}catch(Y){i((k)=>({...k,error:Ou(Y,"删除订阅失败")}))}}if(QT(()=>{if(!r)return;J();return},[r?.id,r?.runtime?.providerStatus]),!r)return a(St,{title:"ClaudeQQ 未登记",text:"请在 config.json 的 microservices 中登记用户服务 id=claudeqq"});let N=qT(r),q=wT(r),W=WT(r),z=n.health||{},Z=n.status||{},H=n.napcatLogin||{},E=z.napcat||Z.napcat||{},D={...H.napcat||{},...E,qrcode:n.napcatQrcode||{},webui:E.webui||H.napcat?.webui},h=H.login||{},V=n.napcatQrcode||{},S=LT(n.events),p=KT(n.subscriptions),O=GT(n.sent),m=Boolean(D.httpConnected||h.ready),X=String(D.loginState||h.state||(m?"logged_in":"unknown")),v=Boolean(V.available&&V.dataUrl);return a("div",{className:"claudeqq-page","data-testid":"claudeqq-page"},a(m1,{title:"ClaudeQQ 工作台",eyebrow:"D601 QQ Event Gateway",loading:n.loading,actions:a("div",{className:"panel-actions"},a("button",{type:"button",className:"ghost-btn",onClick:J,disabled:n.loading,"data-testid":"claudeqq-refresh-button"},n.loading?"刷新中":"刷新"),a(Xt,{title:"ClaudeQQ 用户服务",data:r,onOpen:l,testId:"raw-claudeqq-service"}))},a("div",{className:"findjob-hero"},a("div",null,a("div",{className:"node-version-line"},a(X3,{status:N.providerStatus==="online"?"online":"warn"},N.providerStatus||"unknown"),a("span",null,r.providerId),a("span",null,W.public?"公网暴露":"仅 UniDesk frontend 代理访问")),a("p",{className:"muted paragraph"},r.description)),a("div",{className:"microservice-ref-card"},a("span",null,"Repo"),a("strong",null,q.url||"--"),a("code",null,q.commitId||"--")),a("div",{className:"microservice-ref-card"},a("span",null,"D601 Docker"),a("strong",null,`${W.nodeBindHost||"--"}:${W.nodePort||"--"}`),a("code",null,`${q.composeFile||"--"} / ${q.composeService||"--"}`))),a(il,{error:n.error,wide:!0})),a("div",{className:"metric-grid"},a(p1,{label:"Health",value:z.ok||z.status==="ok"?"OK":"--",hint:"D601 /health",tone:z.ok||z.status==="ok"?"ok":"warn"}),a(p1,{label:"NapCat HTTP",value:D.httpConnected||D.http?.connected?"OK":"离线",hint:`${D.httpHost||z.napcat?.httpHost||"--"}:${D.httpPort||z.napcat?.httpPort||"--"}`}),a(p1,{label:"NapCat WS",value:D.wsConnected||D.ws?.connected?"OK":"离线",hint:`${D.wsHost||z.napcat?.wsHost||"--"}:${D.wsPort||z.napcat?.wsPort||"--"}`}),a(p1,{label:"事件缓存",value:GA(n.events?.count??S.length),hint:"recent QQ events"}),a(p1,{label:"订阅",value:GA(n.subscriptions?.count??p.length),hint:"webhook subscribers"}),a(p1,{label:"已发送",value:GA(n.sent?.count??O.length),hint:"sent message log"})),a("div",{className:"findjob-grid"},a(m1,{title:"NapCat 容器登录",eyebrow:"QR Login",className:"claudeqq-login-panel",loading:n.qrLoading,actions:a("div",{className:"panel-actions inline-actions"},a("button",{type:"button",className:"ghost-btn",onClick:()=>Q(!0),disabled:n.qrLoading,"data-testid":"claudeqq-napcat-refresh"},n.qrLoading?"刷新中":"手动刷新二维码"),a(Xt,{title:"NapCat Login",data:n.napcatLogin,onOpen:l,testId:"raw-claudeqq-napcat-login"}))},a("div",{className:"claudeqq-login-card","data-testid":"claudeqq-napcat-login"},a("div",{className:"claudeqq-qr-frame"},v?a("img",{src:V.dataUrl,alt:"NapCat QQ 登录二维码","data-testid":"claudeqq-napcat-qrcode"}):a(St,{title:"等待二维码",text:"NapCat 容器启动后会把登录二维码写入 cache/qrcode.png"})),a("div",{className:"claudeqq-login-copy"},a("div",{className:"node-version-line"},a(X3,{status:m?"online":v?"warn":"unknown"},m?"已登录":v?"待扫码":"等待二维码"),a("span",null,X),a("span",null,"D601 containerized")),a("p",{className:"muted paragraph"},m?"NapCat 已登录,ClaudeQQ 可通过容器内 HTTP/WS 链路收发 QQ 消息。":"用手机 QQ 扫描二维码授权登录。二维码只在首次加载或手动刷新时更新,D601 的 NapCat 端口仍只绑定 127.0.0.1。"),a("div",{className:"microservice-ref-card"},a("span",null,"NapCat WebUI"),a("strong",null,D.webui?.url||"http://napcat:6099/webui"),a("code",null,"local-only / proxied QR login")),a("div",{className:"microservice-ref-card"},a("span",null,"QR Source"),a("strong",null,V.modifiedAt?qu(V.modifiedAt):n.qrcodeRefreshedAt?qu(n.qrcodeRefreshedAt):"--"),a("code",null,V.file||"/napcat/cache/qrcode.png"))))),a(m1,{title:"消息推送",eyebrow:"Push API"},a("div",{className:"microservice-ref-card"},a("span",null,Wi.label),a("strong",null,String(Wi.userId)),a("code",null,"private userId / 默认推送测试目标")),a("form",{className:"stack-form",onSubmit:w,"data-testid":"claudeqq-push-form"},a("label",null,"目标类型",a("select",{value:y.targetType,onChange:(T)=>t((Y)=>({...Y,targetType:T.target.value}))},a("option",{value:"private"},"私聊 userId"),a("option",{value:"group"},"群 groupId"))),a("label",null,"QQ ID",a("input",{value:y.targetId,onChange:(T)=>t((Y)=>({...Y,targetId:T.target.value})),placeholder:String(Wi.userId)})),a("label",null,"消息内容",a("textarea",{value:y.message,onChange:(T)=>t((Y)=>({...Y,message:T.target.value})),rows:4,placeholder:"通过 ClaudeQQ 推送一条 QQ 消息"})),a("button",{type:"submit",className:"primary-btn"},"发送 QQ 消息")),a("p",{className:"muted paragraph"},`主 server 和其他用户服务可通过 UniDesk 同源代理调用 /api/push/text;当前人工推送测试默认使用 ${Wi.label} ${Wi.userId},不需要暴露 D601 后端端口。`)),a(m1,{title:"QQ 事件订阅",eyebrow:"Webhook Subscription",loading:n.loading},a("form",{className:"stack-form",onSubmit:L,"data-testid":"claudeqq-subscription-form"},a("label",null,"订阅名称",a("input",{value:_.name,onChange:(T)=>c((Y)=>({...Y,name:T.target.value}))})),a("label",null,"回调 URL",a("input",{value:_.targetUrl,onChange:(T)=>c((Y)=>({...Y,targetUrl:T.target.value})),placeholder:"http://host.docker.internal:18080/..."})),a("label",null,"事件类型",a("input",{value:_.eventTypes,onChange:(T)=>c((Y)=>({...Y,eventTypes:T.target.value})),placeholder:"message,notice"})),a("label",null,"签名密钥",a("input",{value:_.secret,onChange:(T)=>c((Y)=>({...Y,secret:T.target.value})),placeholder:"可选,生成 x-claudeqq-signature"})),a("button",{type:"submit",className:"primary-btn"},"创建订阅")),p.length===0?a(St,{title:"暂无订阅",text:"可以为 main server 或其他用户服务注册 HTTP webhook"}):a("div",{className:"table-wrap","data-testid":"claudeqq-subscription-table"},a("table",null,a("thead",null,a("tr",null,a("th",null,"名称"),a("th",null,"状态"),a("th",null,"事件"),a("th",null,"回调"),a("th",null,"最近投递"),a("th",null,"操作"))),a("tbody",null,p.map((T)=>a("tr",{key:T.id},a("td",null,a("strong",null,T.name||T.id),a("code",null,T.id||"--")),a("td",null,a(X3,{status:T.enabled?"online":"warn"},T.enabled?"enabled":"disabled")),a("td",null,Array.isArray(T.eventTypes)?T.eventTypes.join(", "):"message"),a("td",null,T.targetUrl||"--"),a("td",null,T.lastDelivery?`${T.lastDelivery.ok?"OK":"FAIL"} ${qu(T.lastDelivery.at)}`:"--"),a("td",null,a("button",{type:"button",className:"ghost-btn",onClick:()=>U(T.id)},"删除"))))))),a("div",{className:"panel-actions inline-actions"},a(Xt,{title:"ClaudeQQ Subscriptions",data:n.subscriptions,onOpen:l,testId:"raw-claudeqq-subscriptions"}))),a(m1,{title:"最近 QQ 事件",eyebrow:n.refreshedAt?`Updated ${tl(n.refreshedAt)}`:"Event Stream",loading:n.loading},S.length===0?a(St,{title:"暂无事件",text:"等待 NapCat WebSocket 上报 QQ 消息事件,或通过订阅 API 消费后续事件"}):a("div",{className:"table-wrap","data-testid":"claudeqq-event-list"},a("table",null,a("thead",null,a("tr",null,a("th",null,"时间"),a("th",null,"类型"),a("th",null,"会话"),a("th",null,"消息"),a("th",null,"ID"))),a("tbody",null,S.map((T)=>a("tr",{key:T.id},a("td",null,qu(T.receivedAt||T.timestamp)),a("td",null,a(X3,{status:T.postType||T.eventType},T.postType||T.eventType||"--")),a("td",null,NJ(T)),a("td",null,QJ(T)),a("td",null,a("code",null,T.messageId||T.id||"--"))))))),a("div",{className:"panel-actions inline-actions"},a(Xt,{title:"ClaudeQQ Events",data:n.events,onOpen:l,testId:"raw-claudeqq-events"}))),a(m1,{title:"已发送消息",eyebrow:`${O.length} Sent`,loading:n.loading},O.length===0?a(St,{title:"暂无发送记录",text:"发送日志来自 ClaudeQQ bot_workspace/messages/sent_messages.jsonl"}):a("div",{className:"table-wrap"},a("table",null,a("thead",null,a("tr",null,a("th",null,"时间"),a("th",null,"目标"),a("th",null,"消息"),a("th",null,"结果"))),a("tbody",null,O.map((T,Y)=>a("tr",{key:T.id||Y},a("td",null,qu(T.timestamp||T.sentAt||T.createdAt)),a("td",null,NJ(T)),a("td",null,QJ(T)),a("td",null,T.status||T.messageId||T.message_id||"--")))))),a("div",{className:"panel-actions inline-actions"},a(Xt,{title:"ClaudeQQ Sent Messages",data:n.sent,onOpen:l,testId:"raw-claudeqq-sent"})))))}var ht=Pu(Jl(),1);var LJ=Pu(Jl(),1),Ql=LJ.default.createElement;function KJ({markdown:u,className:l,testId:f}){let r=String(u??"").trimEnd(),n=["markdown-body",l].filter(Boolean).join(" ");return Ql("div",{className:n,"data-testid":f},GJ(r,"md"))}function GJ(u,l){let f=zT(u).split(` -`),r=[],n=0;while(n\s?/u.test(i)){let j=[];while(n\s?(.*)$/u);if(J!==null){j.push(J[1]),n+=1;continue}if(F.trim().length===0){j.push(""),n+=1;continue}break}r.push(Ql("blockquote",{key:`${l}-quote-${n}`},GJ(j.join(` -`),`${l}-quote-${n}`)));continue}if(TJ(f,n)){let j=n,F=Yt(f[n]??""),J=Yt(f[n+1]??"");n+=2;let Q=[];while(n0)Q.push(Yt(f[n]??"")),n+=1;r.push(HT(F,J,Q,`${l}-table-${j}`));continue}let _=p3(i);if(_!==null){let j=n,F=_.ordered,J=_.start,Q=[];while(nZT(L,`${l}-list-${j}-${U}`))));continue}let c=n,A=[];while(n0&&!ET(f,n))A.push(f[n].trim()),n+=1;if(A.length===0)A.push(i.trim()),n+=1;r.push(Ql("p",{key:`${l}-p-${c}`},y0(A.join(` -`),`${l}-p-${c}`)))}return r}function zT(u){return String(u||"").replace(/\r\n/gu,` +`+i.stack}return{value:u,source:l,stack:n,digest:null}}function M6(u,l,f){return{value:u,source:null,stack:f!=null?f:null,digest:l!=null?l:null}}function G8(u,l){try{console.error(l.value)}catch(f){setTimeout(function(){throw f})}}var bG=typeof WeakMap==="function"?WeakMap:Map;function MU(u,l,f){f=mn(-1,f),f.tag=3,f.payload={element:null};var r=l.value;return f.callback=function(){U$||(U$=!0,p8=r),G8(u,l)},f}function RU(u,l,f){f=mn(-1,f),f.tag=3;var r=u.type.getDerivedStateFromError;if(typeof r==="function"){var n=l.value;f.payload=function(){return r(n)},f.callback=function(){G8(u,l)}}var i=u.stateNode;return i!==null&&typeof i.componentDidCatch==="function"&&(f.callback=function(){G8(u,l),typeof r!=="function"&&(q0===null?q0=new Set([this]):q0.add(this));var t=l.stack;this.componentDidCatch(l.value,{componentStack:t!==null?t:""})}),f}function dj(u,l,f){var r=u.pingCache;if(r===null){r=u.pingCache=new bG;var n=new Set;r.set(l,n)}else n=r.get(l),n===void 0&&(n=new Set,r.set(l,n));n.has(f)||(n.add(f),u=nz.bind(null,u,l,f),l.then(u,u))}function ej(u){do{var l;if(l=u.tag===13)l=u.memoizedState,l=l!==null?l.dehydrated!==null?!0:!1:!0;if(l)return u;u=u.return}while(u!==null);return null}function uF(u,l,f,r,n){if((u.mode&1)===0)return u===l?u.flags|=65536:(u.flags|=128,f.flags|=131072,f.flags&=-52805,f.tag===1&&(f.alternate===null?f.tag=17:(l=mn(-1,1),l.tag=2,N0(f,l,1))),f.lanes|=1),u;return u.flags|=65536,u.lanes=n,u}var vG=Xn.ReactCurrentOwner,bf=!1;function mf(u,l,f,r){l.child=u===null?QU(l,null,f,r):pt(l,u.child,f,r)}function lF(u,l,f,r,n){f=f.render;var i=l.ref;if(Ht(l,n),r=j4(u,l,f,r,i,n),f=F4(),u!==null&&!bf)return l.updateQueue=u.updateQueue,l.flags&=-2053,u.lanes&=~n,Sn(u,l,n);return El&&f&&u4(l),l.flags|=1,mf(u,l,r,n),l.child}function fF(u,l,f,r,n){if(u===null){var i=f.type;if(typeof i==="function"&&!K4(i)&&i.defaultProps===void 0&&f.compare===null&&f.defaultProps===void 0)return l.tag=15,l.type=i,hU(u,l,i,r,n);return u=I_(f.type,null,r,l,l.mode,n),u.ref=l.ref,u.return=l,l.child=u}if(i=u.child,(u.lanes&n)===0){var t=i.memoizedProps;if(f=f.compare,f=f!==null?f:W1,f(t,r)&&u.ref===l.ref)return Sn(u,l,n)}return l.flags|=1,u=W0(i,r),u.ref=l.ref,u.return=l,l.child=u}function hU(u,l,f,r,n){if(u!==null){var i=u.memoizedProps;if(W1(i,r)&&u.ref===l.ref)if(bf=!1,l.pendingProps=r=i,(u.lanes&n)!==0)(u.flags&131072)!==0&&(bf=!0);else return l.lanes=u.lanes,Sn(u,l,n)}return z8(u,l,f,r,n)}function xU(u,l,f){var r=l.pendingProps,n=r.children,i=u!==null?u.memoizedState:null;if(r.mode==="hidden")if((l.mode&1)===0)l.memoizedState={baseLanes:0,cachePool:null,transitions:null},wl(Gt,cr),cr|=f;else{if((f&1073741824)===0)return u=i!==null?i.baseLanes|f:f,l.lanes=l.childLanes=1073741824,l.memoizedState={baseLanes:u,cachePool:null,transitions:null},l.updateQueue=null,wl(Gt,cr),cr|=u,null;l.memoizedState={baseLanes:0,cachePool:null,transitions:null},r=i!==null?i.baseLanes:f,wl(Gt,cr),cr|=r}else i!==null?(r=i.baseLanes|f,l.memoizedState=null):r=f,wl(Gt,cr),cr|=r;return mf(u,l,n,f),l.child}function bU(u,l){var f=l.ref;if(u===null&&f!==null||u!==null&&u.ref!==f)l.flags|=512,l.flags|=2097152}function z8(u,l,f,r,n){var i=kf(f)?wi:Tf.current;if(i=Vt(l,i),Ht(l,n),f=j4(u,l,f,r,i,n),r=F4(),u!==null&&!bf)return l.updateQueue=u.updateQueue,l.flags&=-2053,u.lanes&=~n,Sn(u,l,n);return El&&r&&u4(l),l.flags|=1,mf(u,l,f,n),l.child}function rF(u,l,f,r,n){if(kf(f)){var i=!0;n$(l)}else i=!1;if(Ht(l,n),l.stateNode===null)b_(u,l),CU(l,f,r),K8(l,f,r,n),r=!0;else if(u===null){var{stateNode:t,memoizedProps:y}=l;t.props=y;var c=t.context,$=f.contextType;typeof $==="object"&&$!==null?$=Zr($):($=kf(f)?wi:Tf.current,$=Vt(l,$));var A=f.getDerivedStateFromProps,j=typeof A==="function"||typeof t.getSnapshotBeforeUpdate==="function";j||typeof t.UNSAFE_componentWillReceiveProps!=="function"&&typeof t.componentWillReceiveProps!=="function"||(y!==r||c!==$)&&oj(l,t,r,$),c0=!1;var F=l.memoizedState;t.state=F,_$(l,r,t,n),c=l.memoizedState,y!==r||F!==c||vf.current||c0?(typeof A==="function"&&(T8(l,f,A,r),c=l.memoizedState),(y=c0||aj(l,f,y,r,F,c,$))?(j||typeof t.UNSAFE_componentWillMount!=="function"&&typeof t.componentWillMount!=="function"||(typeof t.componentWillMount==="function"&&t.componentWillMount(),typeof t.UNSAFE_componentWillMount==="function"&&t.UNSAFE_componentWillMount()),typeof t.componentDidMount==="function"&&(l.flags|=4194308)):(typeof t.componentDidMount==="function"&&(l.flags|=4194308),l.memoizedProps=r,l.memoizedState=c),t.props=r,t.state=c,t.context=$,r=y):(typeof t.componentDidMount==="function"&&(l.flags|=4194308),r=!1)}else{t=l.stateNode,qU(u,l),y=l.memoizedProps,$=l.type===l.elementType?y:hr(l.type,y),t.props=$,j=l.pendingProps,F=t.context,c=f.contextType,typeof c==="object"&&c!==null?c=Zr(c):(c=kf(f)?wi:Tf.current,c=Vt(l,c));var J=f.getDerivedStateFromProps;(A=typeof J==="function"||typeof t.getSnapshotBeforeUpdate==="function")||typeof t.UNSAFE_componentWillReceiveProps!=="function"&&typeof t.componentWillReceiveProps!=="function"||(y!==j||F!==c)&&oj(l,t,r,c),c0=!1,F=l.memoizedState,t.state=F,_$(l,r,t,n);var Q=l.memoizedState;y!==j||F!==Q||vf.current||c0?(typeof J==="function"&&(T8(l,f,J,r),Q=l.memoizedState),($=c0||aj(l,f,$,r,F,Q,c)||!1)?(A||typeof t.UNSAFE_componentWillUpdate!=="function"&&typeof t.componentWillUpdate!=="function"||(typeof t.componentWillUpdate==="function"&&t.componentWillUpdate(r,Q,c),typeof t.UNSAFE_componentWillUpdate==="function"&&t.UNSAFE_componentWillUpdate(r,Q,c)),typeof t.componentDidUpdate==="function"&&(l.flags|=4),typeof t.getSnapshotBeforeUpdate==="function"&&(l.flags|=1024)):(typeof t.componentDidUpdate!=="function"||y===u.memoizedProps&&F===u.memoizedState||(l.flags|=4),typeof t.getSnapshotBeforeUpdate!=="function"||y===u.memoizedProps&&F===u.memoizedState||(l.flags|=1024),l.memoizedProps=r,l.memoizedState=Q),t.props=r,t.state=Q,t.context=c,r=$):(typeof t.componentDidUpdate!=="function"||y===u.memoizedProps&&F===u.memoizedState||(l.flags|=4),typeof t.getSnapshotBeforeUpdate!=="function"||y===u.memoizedProps&&F===u.memoizedState||(l.flags|=1024),r=!1)}return E8(u,l,f,r,i,n)}function E8(u,l,f,r,n,i){bU(u,l);var t=(l.flags&128)!==0;if(!r&&!t)return n&&hj(l,f,!1),Sn(u,l,i);r=l.stateNode,vG.current=l;var y=t&&typeof f.getDerivedStateFromError!=="function"?null:r.render();return l.flags|=1,u!==null&&t?(l.child=pt(l,u.child,null,i),l.child=pt(l,null,y,i)):mf(u,l,y,i),l.memoizedState=r.state,n&&hj(l,f,!0),l.child}function vU(u){var l=u.stateNode;l.pendingContext?Rj(u,l.pendingContext,l.pendingContext!==l.context):l.context&&Rj(u,l.context,!1),c4(u,l.containerInfo)}function nF(u,l,f,r,n){return Dt(),f4(n),l.flags|=256,mf(u,l,f,r),l.child}var O8={dehydrated:null,treeContext:null,retryLane:0};function Z8(u){return{baseLanes:u,cachePool:null,transitions:null}}function kU(u,l,f){var r=l.pendingProps,n=Hl.current,i=!1,t=(l.flags&128)!==0,y;if((y=t)||(y=u!==null&&u.memoizedState===null?!1:(n&2)!==0),y)i=!0,l.flags&=-129;else if(u===null||u.memoizedState!==null)n|=1;if(wl(Hl,n&1),u===null){if(W8(l),u=l.memoizedState,u!==null&&(u=u.dehydrated,u!==null))return(l.mode&1)===0?l.lanes=1:u.data==="$!"?l.lanes=8:l.lanes=1073741824,null;return t=r.children,u=r.fallback,i?(r=l.mode,i=l.child,t={mode:"hidden",children:t},(r&1)===0&&i!==null?(i.childLanes=0,i.pendingProps=t):i=Z$(t,r,0,null),u=qi(u,r,f,null),i.return=l,u.return=l,i.sibling=u,l.child=i,l.child.memoizedState=Z8(f),l.memoizedState=O8,u):Q4(l,t)}if(n=u.memoizedState,n!==null&&(y=n.dehydrated,y!==null))return kG(u,l,t,r,y,n,f);if(i){i=r.fallback,t=l.mode,n=u.child,y=n.sibling;var c={mode:"hidden",children:r.children};return(t&1)===0&&l.child!==n?(r=l.child,r.childLanes=0,r.pendingProps=c,l.deletions=null):(r=W0(n,c),r.subtreeFlags=n.subtreeFlags&14680064),y!==null?i=W0(y,i):(i=qi(i,t,f,null),i.flags|=2),i.return=l,r.return=l,r.sibling=i,l.child=r,r=i,i=l.child,t=u.child.memoizedState,t=t===null?Z8(f):{baseLanes:t.baseLanes|f,cachePool:null,transitions:t.transitions},i.memoizedState=t,i.childLanes=u.childLanes&~f,l.memoizedState=O8,r}return i=u.child,u=i.sibling,r=W0(i,{mode:"visible",children:r.children}),(l.mode&1)===0&&(r.lanes=f),r.return=l,r.sibling=null,u!==null&&(f=l.deletions,f===null?(l.deletions=[u],l.flags|=16):f.push(u)),l.child=r,l.memoizedState=null,r}function Q4(u,l){return l=Z$({mode:"visible",children:l},u.mode,0,null),l.return=u,u.child=l}function p_(u,l,f,r){return r!==null&&f4(r),pt(l,u.child,null,f),u=Q4(l,l.pendingProps.children),u.flags|=2,l.memoizedState=null,u}function kG(u,l,f,r,n,i,t){if(f){if(l.flags&256)return l.flags&=-257,r=M6(Error(Ju(422))),p_(u,l,t,r);if(l.memoizedState!==null)return l.child=u.child,l.flags|=128,null;return i=r.fallback,n=l.mode,r=Z$({mode:"visible",children:r.children},n,0,null),i=qi(i,n,t,null),i.flags|=2,r.return=l,i.return=l,r.sibling=i,l.child=r,(l.mode&1)!==0&&pt(l,u.child,null,t),l.child.memoizedState=Z8(t),l.memoizedState=O8,i}if((l.mode&1)===0)return p_(u,l,t,null);if(n.data==="$!"){if(r=n.nextSibling&&n.nextSibling.dataset,r)var y=r.dgst;return r=y,i=Error(Ju(419)),r=M6(i,r,void 0),p_(u,l,t,r)}if(y=(t&u.childLanes)!==0,bf||y){if(r=nf,r!==null){switch(t&-t){case 4:n=2;break;case 16:n=8;break;case 64:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:case 4194304:case 8388608:case 16777216:case 33554432:case 67108864:n=32;break;case 536870912:n=268435456;break;default:n=0}n=(n&(r.suspendedLanes|t))!==0?0:n,n!==0&&n!==i.retryLane&&(i.retryLane=n,pn(u,n),kr(r,u,n,-1))}return T4(),r=M6(Error(Ju(421))),p_(u,l,t,r)}if(n.data==="$?")return l.flags|=128,l.child=u.child,l=iz.bind(null,u),n._reactRetry=l,null;return u=i.treeContext,_r=Q0(n.nextSibling),$r=l,El=!0,br=null,u!==null&&(Gr[zr++]=Hn,Gr[zr++]=Bn,Gr[zr++]=Wi,Hn=u.id,Bn=u.overflow,Wi=l),l=Q4(l,r.children),l.flags|=4096,l}function iF(u,l,f){u.lanes|=l;var r=u.alternate;r!==null&&(r.lanes|=l),L8(u.return,l,f)}function R6(u,l,f,r,n){var i=u.memoizedState;i===null?u.memoizedState={isBackwards:l,rendering:null,renderingStartTime:0,last:r,tail:f,tailMode:n}:(i.isBackwards=l,i.rendering=null,i.renderingStartTime=0,i.last=r,i.tail=f,i.tailMode=n)}function IU(u,l,f){var r=l.pendingProps,n=r.revealOrder,i=r.tail;if(mf(u,l,r.children,f),r=Hl.current,(r&2)!==0)r=r&1|2,l.flags|=128;else{if(u!==null&&(u.flags&128)!==0)u:for(u=l.child;u!==null;){if(u.tag===13)u.memoizedState!==null&&iF(u,f,l);else if(u.tag===19)iF(u,f,l);else if(u.child!==null){u.child.return=u,u=u.child;continue}if(u===l)break u;for(;u.sibling===null;){if(u.return===null||u.return===l)break u;u=u.return}u.sibling.return=u.return,u=u.sibling}r&=1}if(wl(Hl,r),(l.mode&1)===0)l.memoizedState=null;else switch(n){case"forwards":f=l.child;for(n=null;f!==null;)u=f.alternate,u!==null&&$$(u)===null&&(n=f),f=f.sibling;f=n,f===null?(n=l.child,l.child=null):(n=f.sibling,f.sibling=null),R6(l,!1,n,f,i);break;case"backwards":f=null,n=l.child;for(l.child=null;n!==null;){if(u=n.alternate,u!==null&&$$(u)===null){l.child=n;break}u=n.sibling,n.sibling=f,f=n,n=u}R6(l,!0,f,null,i);break;case"together":R6(l,!1,null,null,void 0);break;default:l.memoizedState=null}return l.child}function b_(u,l){(l.mode&1)===0&&u!==null&&(u.alternate=null,l.alternate=null,l.flags|=2)}function Sn(u,l,f){if(u!==null&&(l.dependencies=u.dependencies),Ti|=l.lanes,(f&l.childLanes)===0)return null;if(u!==null&&l.child!==u.child)throw Error(Ju(153));if(l.child!==null){u=l.child,f=W0(u,u.pendingProps),l.child=f;for(f.return=l;u.sibling!==null;)u=u.sibling,f=f.sibling=W0(u,u.pendingProps),f.return=l;f.sibling=null}return l.child}function IG(u,l,f){switch(l.tag){case 3:vU(l),Dt();break;case 5:wU(l);break;case 1:kf(l.type)&&n$(l);break;case 4:c4(l,l.stateNode.containerInfo);break;case 10:var r=l.type._context,n=l.memoizedProps.value;wl(y$,r._currentValue),r._currentValue=n;break;case 13:if(r=l.memoizedState,r!==null){if(r.dehydrated!==null)return wl(Hl,Hl.current&1),l.flags|=128,null;if((f&l.child.childLanes)!==0)return kU(u,l,f);return wl(Hl,Hl.current&1),u=Sn(u,l,f),u!==null?u.sibling:null}wl(Hl,Hl.current&1);break;case 19:if(r=(f&l.childLanes)!==0,(u.flags&128)!==0){if(r)return IU(u,l,f);l.flags|=128}if(n=l.memoizedState,n!==null&&(n.rendering=null,n.tail=null,n.lastEffect=null),wl(Hl,Hl.current),r)break;else return null;case 22:case 23:return l.lanes=0,xU(u,l,f)}return Sn(u,l,f)}var gU,H8,sU,aU;gU=function(u,l){for(var f=l.child;f!==null;){if(f.tag===5||f.tag===6)u.appendChild(f.stateNode);else if(f.tag!==4&&f.child!==null){f.child.return=f,f=f.child;continue}if(f===l)break;for(;f.sibling===null;){if(f.return===null||f.return===l)return;f=f.return}f.sibling.return=f.return,f=f.sibling}};H8=function(){};sU=function(u,l,f,r){var n=u.memoizedProps;if(n!==r){u=l.stateNode,Qi(An.current);var i=null;switch(f){case"input":n=s6(u,n),r=s6(u,r),i=[];break;case"select":n=ml({},n,{value:void 0}),r=ml({},r,{value:void 0}),i=[];break;case"textarea":n=d6(u,n),r=d6(u,r),i=[];break;default:typeof n.onClick!=="function"&&typeof r.onClick==="function"&&(u.onclick=f$)}u8(f,r);var t;f=null;for($ in n)if(!r.hasOwnProperty($)&&n.hasOwnProperty($)&&n[$]!=null)if($==="style"){var y=n[$];for(t in y)y.hasOwnProperty(t)&&(f||(f={}),f[t]="")}else $!=="dangerouslySetInnerHTML"&&$!=="children"&&$!=="suppressContentEditableWarning"&&$!=="suppressHydrationWarning"&&$!=="autoFocus"&&(F1.hasOwnProperty($)?i||(i=[]):(i=i||[]).push($,null));for($ in r){var c=r[$];if(y=n!=null?n[$]:void 0,r.hasOwnProperty($)&&c!==y&&(c!=null||y!=null))if($==="style")if(y){for(t in y)!y.hasOwnProperty(t)||c&&c.hasOwnProperty(t)||(f||(f={}),f[t]="");for(t in c)c.hasOwnProperty(t)&&y[t]!==c[t]&&(f||(f={}),f[t]=c[t])}else f||(i||(i=[]),i.push($,f)),f=c;else $==="dangerouslySetInnerHTML"?(c=c?c.__html:void 0,y=y?y.__html:void 0,c!=null&&y!==c&&(i=i||[]).push($,c)):$==="children"?typeof c!=="string"&&typeof c!=="number"||(i=i||[]).push($,""+c):$!=="suppressContentEditableWarning"&&$!=="suppressHydrationWarning"&&(F1.hasOwnProperty($)?(c!=null&&$==="onScroll"&&Kl("scroll",u),i||y===c||(i=[])):(i=i||[]).push($,c))}f&&(i=i||[]).push("style",f);var $=i;if(l.updateQueue=$)l.flags|=4}};aU=function(u,l,f,r){f!==r&&(l.flags|=4)};function gy(u,l){if(!El)switch(u.tailMode){case"hidden":l=u.tail;for(var f=null;l!==null;)l.alternate!==null&&(f=l),l=l.sibling;f===null?u.tail=null:f.sibling=null;break;case"collapsed":f=u.tail;for(var r=null;f!==null;)f.alternate!==null&&(r=f),f=f.sibling;r===null?l||u.tail===null?u.tail=null:u.tail.sibling=null:r.sibling=null}}function Wf(u){var l=u.alternate!==null&&u.alternate.child===u.child,f=0,r=0;if(l)for(var n=u.child;n!==null;)f|=n.lanes|n.childLanes,r|=n.subtreeFlags&14680064,r|=n.flags&14680064,n.return=u,n=n.sibling;else for(n=u.child;n!==null;)f|=n.lanes|n.childLanes,r|=n.subtreeFlags,r|=n.flags,n.return=u,n=n.sibling;return u.subtreeFlags|=r,u.childLanes=f,l}function gG(u,l,f){var r=l.pendingProps;switch(l4(l),l.tag){case 2:case 16:case 15:case 0:case 11:case 7:case 8:case 12:case 9:case 14:return Wf(l),null;case 1:return kf(l.type)&&r$(),Wf(l),null;case 3:if(r=l.stateNode,St(),Gl(vf),Gl(Tf),$4(),r.pendingContext&&(r.context=r.pendingContext,r.pendingContext=null),u===null||u.child===null)V_(l)?l.flags|=4:u===null||u.memoizedState.isDehydrated&&(l.flags&256)===0||(l.flags|=1024,br!==null&&(Y8(br),br=null));return H8(u,l),Wf(l),null;case 5:_4(l);var n=Qi(z1.current);if(f=l.type,u!==null&&l.stateNode!=null)sU(u,l,f,r,n),u.ref!==l.ref&&(l.flags|=512,l.flags|=2097152);else{if(!r){if(l.stateNode===null)throw Error(Ju(166));return Wf(l),null}if(u=Qi(An.current),V_(l)){r=l.stateNode,f=l.type;var i=l.memoizedProps;switch(r[_n]=l,r[K1]=i,u=(l.mode&1)!==0,f){case"dialog":Kl("cancel",r),Kl("close",r);break;case"iframe":case"object":case"embed":Kl("load",r);break;case"video":case"audio":for(n=0;n",u=u.removeChild(u.firstChild)):typeof r.is==="string"?u=t.createElement(f,{is:r.is}):(u=t.createElement(f),f==="select"&&(t=u,r.multiple?t.multiple=!0:r.size&&(t.size=r.size))):u=t.createElementNS(u,f),u[_n]=l,u[K1]=r,gU(u,l,!1,!1),l.stateNode=u;u:{switch(t=l8(f,r),f){case"dialog":Kl("cancel",u),Kl("close",u),n=r;break;case"iframe":case"object":case"embed":Kl("load",u),n=r;break;case"video":case"audio":for(n=0;nYt&&(l.flags|=128,r=!0,gy(i,!1),l.lanes=4194304)}else{if(!r)if(u=$$(t),u!==null){if(l.flags|=128,r=!0,f=u.updateQueue,f!==null&&(l.updateQueue=f,l.flags|=4),gy(i,!0),i.tail===null&&i.tailMode==="hidden"&&!t.alternate&&!El)return Wf(l),null}else 2*Cl()-i.renderingStartTime>Yt&&f!==1073741824&&(l.flags|=128,r=!0,gy(i,!1),l.lanes=4194304);i.isBackwards?(t.sibling=l.child,l.child=t):(f=i.last,f!==null?f.sibling=t:l.child=t,i.last=t)}if(i.tail!==null)return l=i.tail,i.rendering=l,i.tail=l.sibling,i.renderingStartTime=Cl(),l.sibling=null,f=Hl.current,wl(Hl,r?f&1|2:f&1),l;return Wf(l),null;case 22:case 23:return L4(),r=l.memoizedState!==null,u!==null&&u.memoizedState!==null!==r&&(l.flags|=8192),r&&(l.mode&1)!==0?(cr&1073741824)!==0&&(Wf(l),l.subtreeFlags&6&&(l.flags|=8192)):Wf(l),null;case 24:return null;case 25:return null}throw Error(Ju(156,l.tag))}function sG(u,l){switch(l4(l),l.tag){case 1:return kf(l.type)&&r$(),u=l.flags,u&65536?(l.flags=u&-65537|128,l):null;case 3:return St(),Gl(vf),Gl(Tf),$4(),u=l.flags,(u&65536)!==0&&(u&128)===0?(l.flags=u&-65537|128,l):null;case 5:return _4(l),null;case 13:if(Gl(Hl),u=l.memoizedState,u!==null&&u.dehydrated!==null){if(l.alternate===null)throw Error(Ju(340));Dt()}return u=l.flags,u&65536?(l.flags=u&-65537|128,l):null;case 19:return Gl(Hl),null;case 4:return St(),null;case 10:return i4(l.type._context),null;case 22:case 23:return L4(),null;case 24:return null;default:return null}}var S_=!1,Lf=!1,aG=typeof WeakSet==="function"?WeakSet:Set,Hu=null;function Kt(u,l){var f=u.ref;if(f!==null)if(typeof f==="function")try{f(null)}catch(r){pl(u,l,r)}else f.current=null}function B8(u,l,f){try{f()}catch(r){pl(u,l,r)}}var tF=!1;function oG(u,l){if(F8=e_,u=lU(),e8(u)){if("selectionStart"in u)var f={start:u.selectionStart,end:u.selectionEnd};else u:{f=(f=u.ownerDocument)&&f.defaultView||window;var r=f.getSelection&&f.getSelection();if(r&&r.rangeCount!==0){f=r.anchorNode;var{anchorOffset:n,focusNode:i}=r;r=r.focusOffset;try{f.nodeType,i.nodeType}catch(w){f=null;break u}var t=0,y=-1,c=-1,$=0,A=0,j=u,F=null;l:for(;;){for(var J;;){if(j!==f||n!==0&&j.nodeType!==3||(y=t+n),j!==i||r!==0&&j.nodeType!==3||(c=t+r),j.nodeType===3&&(t+=j.nodeValue.length),(J=j.firstChild)===null)break;F=j,j=J}for(;;){if(j===u)break l;if(F===f&&++$===n&&(y=t),F===i&&++A===r&&(c=t),(J=j.nextSibling)!==null)break;j=F,F=j.parentNode}j=J}f=y===-1||c===-1?null:{start:y,end:c}}else f=null}f=f||{start:0,end:0}}else f=null;U8={focusedElem:u,selectionRange:f},e_=!1;for(Hu=l;Hu!==null;)if(l=Hu,u=l.child,(l.subtreeFlags&1028)!==0&&u!==null)u.return=l,Hu=u;else for(;Hu!==null;){l=Hu;try{var Q=l.alternate;if((l.flags&1024)!==0)switch(l.tag){case 0:case 11:case 15:break;case 1:if(Q!==null){var{memoizedProps:W,memoizedState:L}=Q,U=l.stateNode,q=U.getSnapshotBeforeUpdate(l.elementType===l.type?W:hr(l.type,W),L);U.__reactInternalSnapshotBeforeUpdate=q}break;case 3:var N=l.stateNode.containerInfo;N.nodeType===1?N.textContent="":N.nodeType===9&&N.documentElement&&N.removeChild(N.documentElement);break;case 5:case 6:case 4:case 17:break;default:throw Error(Ju(163))}}catch(w){pl(l,l.return,w)}if(u=l.sibling,u!==null){u.return=l.return,Hu=u;break}Hu=l.return}return Q=tF,tF=!1,Q}function $1(u,l,f){var r=l.updateQueue;if(r=r!==null?r.lastEffect:null,r!==null){var n=r=r.next;do{if((n.tag&u)===u){var i=n.destroy;n.destroy=void 0,i!==void 0&&B8(l,f,i)}n=n.next}while(n!==r)}}function E$(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 r=f.create;f.destroy=r()}f=f.next}while(f!==l)}}function m8(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 oU(u){var l=u.alternate;l!==null&&(u.alternate=null,oU(l)),u.child=null,u.deletions=null,u.sibling=null,u.tag===5&&(l=u.stateNode,l!==null&&(delete l[_n],delete l[K1],delete l[N8],delete l[DG],delete l[pG])),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 dU(u){return u.tag===5||u.tag===3||u.tag===4}function yF(u){u:for(;;){for(;u.sibling===null;){if(u.return===null||dU(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 V8(u,l,f){var r=u.tag;if(r===5||r===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=f$));else if(r!==4&&(u=u.child,u!==null))for(V8(u,l,f),u=u.sibling;u!==null;)V8(u,l,f),u=u.sibling}function D8(u,l,f){var r=u.tag;if(r===5||r===6)u=u.stateNode,l?f.insertBefore(u,l):f.appendChild(u);else if(r!==4&&(u=u.child,u!==null))for(D8(u,l,f),u=u.sibling;u!==null;)D8(u,l,f),u=u.sibling}var Af=null,xr=!1;function t0(u,l,f){for(f=f.child;f!==null;)eU(u,l,f),f=f.sibling}function eU(u,l,f){if($n&&typeof $n.onCommitFiberUnmount==="function")try{$n.onCommitFiberUnmount(q$,f)}catch(y){}switch(f.tag){case 5:Lf||Kt(f,l);case 6:var r=Af,n=xr;Af=null,t0(u,l,f),Af=r,xr=n,Af!==null&&(xr?(u=Af,f=f.stateNode,u.nodeType===8?u.parentNode.removeChild(f):u.removeChild(f)):Af.removeChild(f.stateNode));break;case 18:Af!==null&&(xr?(u=Af,f=f.stateNode,u.nodeType===8?p6(u.parentNode,f):u.nodeType===1&&p6(u,f),q1(u)):p6(Af,f.stateNode));break;case 4:r=Af,n=xr,Af=f.stateNode.containerInfo,xr=!0,t0(u,l,f),Af=r,xr=n;break;case 0:case 11:case 14:case 15:if(!Lf&&(r=f.updateQueue,r!==null&&(r=r.lastEffect,r!==null))){n=r=r.next;do{var i=n,t=i.destroy;i=i.tag,t!==void 0&&((i&2)!==0?B8(f,l,t):(i&4)!==0&&B8(f,l,t)),n=n.next}while(n!==r)}t0(u,l,f);break;case 1:if(!Lf&&(Kt(f,l),r=f.stateNode,typeof r.componentWillUnmount==="function"))try{r.props=f.memoizedProps,r.state=f.memoizedState,r.componentWillUnmount()}catch(y){pl(f,l,y)}t0(u,l,f);break;case 21:t0(u,l,f);break;case 22:f.mode&1?(Lf=(r=Lf)||f.memoizedState!==null,t0(u,l,f),Lf=r):t0(u,l,f);break;default:t0(u,l,f)}}function cF(u){var l=u.updateQueue;if(l!==null){u.updateQueue=null;var f=u.stateNode;f===null&&(f=u.stateNode=new aG),l.forEach(function(r){var n=tz.bind(null,u,r);f.has(r)||(f.add(r),r.then(n,n))})}}function Rr(u,l){var f=l.deletions;if(f!==null)for(var r=0;rn&&(n=t),r&=~i}if(r=n,r=Cl()-r,r=(120>r?120:480>r?480:1080>r?1080:1920>r?1920:3000>r?3000:4320>r?4320:1960*eG(r/1960))-r,10u?16:u,j0===null)var r=!1;else{if(u=j0,j0=null,J$=0,(cl&6)!==0)throw Error(Ju(331));var n=cl;cl|=4;for(Hu=u.current;Hu!==null;){var i=Hu,t=i.child;if((Hu.flags&16)!==0){var y=i.deletions;if(y!==null){for(var c=0;cCl()-w4?Ni(u,0):q4|=f),If(u,l)}function yJ(u,l){l===0&&((u.mode&1)===0?l=1:(l=E_,E_<<=1,(E_&130023424)===0&&(E_=4194304)));var f=Vf();u=pn(u,l),u!==null&&(B1(u,l,f),If(u,f))}function iz(u){var l=u.memoizedState,f=0;l!==null&&(f=l.retryLane),yJ(u,f)}function tz(u,l){var f=0;switch(u.tag){case 13:var{stateNode:r,memoizedState:n}=u;n!==null&&(f=n.retryLane);break;case 19:r=u.stateNode;break;default:throw Error(Ju(314))}r!==null&&r.delete(l),yJ(u,f)}var cJ;cJ=function(u,l,f){if(u!==null)if(u.memoizedProps!==l.pendingProps||vf.current)bf=!0;else{if((u.lanes&f)===0&&(l.flags&128)===0)return bf=!1,IG(u,l,f);bf=(u.flags&131072)!==0?!0:!1}else bf=!1,El&&(l.flags&1048576)!==0&&jU(l,t$,l.index);switch(l.lanes=0,l.tag){case 2:var r=l.type;b_(u,l),u=l.pendingProps;var n=Vt(l,Tf.current);Ht(l,f),n=j4(null,l,r,u,n,f);var i=F4();return l.flags|=1,typeof n==="object"&&n!==null&&typeof n.render==="function"&&n.$$typeof===void 0?(l.tag=1,l.memoizedState=null,l.updateQueue=null,kf(r)?(i=!0,n$(l)):i=!1,l.memoizedState=n.state!==null&&n.state!==void 0?n.state:null,y4(l),n.updater=z$,l.stateNode=n,n._reactInternals=l,K8(l,r,u,f),l=E8(null,l,r,!0,i,f)):(l.tag=0,El&&i&&u4(l),mf(null,l,n,f),l=l.child),l;case 16:r=l.elementType;u:{switch(b_(u,l),u=l.pendingProps,n=r._init,r=n(r._payload),l.type=r,n=l.tag=cz(r),u=hr(r,u),n){case 0:l=z8(null,l,r,u,f);break u;case 1:l=rF(null,l,r,u,f);break u;case 11:l=lF(null,l,r,u,f);break u;case 14:l=fF(null,l,r,hr(r.type,u),f);break u}throw Error(Ju(306,r,""))}return l;case 0:return r=l.type,n=l.pendingProps,n=l.elementType===r?n:hr(r,n),z8(u,l,r,n,f);case 1:return r=l.type,n=l.pendingProps,n=l.elementType===r?n:hr(r,n),rF(u,l,r,n,f);case 3:u:{if(vU(l),u===null)throw Error(Ju(387));r=l.pendingProps,i=l.memoizedState,n=i.element,qU(u,l),_$(l,r,null,f);var t=l.memoizedState;if(r=t.element,i.isDehydrated)if(i={element:r,isDehydrated:!1,cache:t.cache,pendingSuspenseBoundaries:t.pendingSuspenseBoundaries,transitions:t.transitions},l.updateQueue.baseState=i,l.memoizedState=i,l.flags&256){n=Xt(Error(Ju(423)),l),l=nF(u,l,r,f,n);break u}else if(r!==n){n=Xt(Error(Ju(424)),l),l=nF(u,l,r,f,n);break u}else for(_r=Q0(l.stateNode.containerInfo.firstChild),$r=l,El=!0,br=null,f=QU(l,null,r,f),l.child=f;f;)f.flags=f.flags&-3|4096,f=f.sibling;else{if(Dt(),r===n){l=Sn(u,l,f);break u}mf(u,l,r,f)}l=l.child}return l;case 5:return wU(l),u===null&&W8(l),r=l.type,n=l.pendingProps,i=u!==null?u.memoizedProps:null,t=n.children,J8(r,n)?t=null:i!==null&&J8(r,i)&&(l.flags|=32),bU(u,l),mf(u,l,t,f),l.child;case 6:return u===null&&W8(l),null;case 13:return kU(u,l,f);case 4:return c4(l,l.stateNode.containerInfo),r=l.pendingProps,u===null?l.child=pt(l,null,r,f):mf(u,l,r,f),l.child;case 11:return r=l.type,n=l.pendingProps,n=l.elementType===r?n:hr(r,n),lF(u,l,r,n,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(r=l.type._context,n=l.pendingProps,i=l.memoizedProps,t=n.value,wl(y$,r._currentValue),r._currentValue=t,i!==null)if(Ir(i.value,t)){if(i.children===n.children&&!vf.current){l=Sn(u,l,f);break u}}else for(i=l.child,i!==null&&(i.return=l);i!==null;){var y=i.dependencies;if(y!==null){t=i.child;for(var c=y.firstContext;c!==null;){if(c.context===r){if(i.tag===1){c=mn(-1,f&-f),c.tag=2;var $=i.updateQueue;if($!==null){$=$.shared;var A=$.pending;A===null?c.next=c:(c.next=A.next,A.next=c),$.pending=c}}i.lanes|=f,c=i.alternate,c!==null&&(c.lanes|=f),L8(i.return,f,l),y.lanes|=f;break}c=c.next}}else if(i.tag===10)t=i.type===l.type?null:i.child;else if(i.tag===18){if(t=i.return,t===null)throw Error(Ju(341));t.lanes|=f,y=t.alternate,y!==null&&(y.lanes|=f),L8(t,f,l),t=i.sibling}else t=i.child;if(t!==null)t.return=i;else for(t=i;t!==null;){if(t===l){t=null;break}if(i=t.sibling,i!==null){i.return=t.return,t=i;break}t=t.return}i=t}mf(u,l,n.children,f),l=l.child}return l;case 9:return n=l.type,r=l.pendingProps.children,Ht(l,f),n=Zr(n),r=r(n),l.flags|=1,mf(u,l,r,f),l.child;case 14:return r=l.type,n=hr(r,l.pendingProps),n=hr(r.type,n),fF(u,l,r,n,f);case 15:return hU(u,l,l.type,l.pendingProps,f);case 17:return r=l.type,n=l.pendingProps,n=l.elementType===r?n:hr(r,n),b_(u,l),l.tag=1,kf(r)?(u=!0,n$(l)):u=!1,Ht(l,f),CU(l,r,n),K8(l,r,n,f),E8(null,l,r,!0,u,f);case 19:return IU(u,l,f);case 22:return xU(u,l,f)}throw Error(Ju(156,l.tag))};function _J(u,l){return XF(u,l)}function yz(u,l,f,r){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=r,this.subtreeFlags=this.flags=0,this.deletions=null,this.childLanes=this.lanes=0,this.alternate=null}function Er(u,l,f,r){return new yz(u,l,f,r)}function K4(u){return u=u.prototype,!(!u||!u.isReactComponent)}function cz(u){if(typeof u==="function")return K4(u)?1:0;if(u!==void 0&&u!==null){if(u=u.$$typeof,u===h8)return 11;if(u===x8)return 14}return 2}function W0(u,l){var f=u.alternate;return f===null?(f=Er(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 I_(u,l,f,r,n,i){var t=2;if(r=u,typeof u==="function")K4(u)&&(t=1);else if(typeof u==="string")t=5;else u:switch(u){case Ut:return qi(f.children,n,i,l);case R8:t=8,n|=8;break;case v6:return u=Er(12,f,l,n|2),u.elementType=v6,u.lanes=i,u;case k6:return u=Er(13,f,l,n),u.elementType=k6,u.lanes=i,u;case I6:return u=Er(19,f,l,n),u.elementType=I6,u.lanes=i,u;case wF:return Z$(f,n,i,l);default:if(typeof u==="object"&&u!==null)switch(u.$$typeof){case NF:t=10;break u;case qF:t=9;break u;case h8:t=11;break u;case x8:t=14;break u;case y0:t=16,r=null;break u}throw Error(Ju(130,u==null?u:typeof u,""))}return l=Er(t,f,l,n),l.elementType=u,l.type=r,l.lanes=i,l}function qi(u,l,f,r){return u=Er(7,u,r,l),u.lanes=f,u}function Z$(u,l,f,r){return u=Er(22,u,r,l),u.elementType=wF,u.lanes=f,u.stateNode={isHidden:!1},u}function h6(u,l,f){return u=Er(6,u,null,l),u.lanes=f,u}function x6(u,l,f){return l=Er(4,u.children!==null?u.children:[],u.key,l),l.lanes=f,l.stateNode={containerInfo:u.containerInfo,pendingChildren:null,implementation:u.implementation},l}function _z(u,l,f,r,n){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=O6(0),this.expirationTimes=O6(-1),this.entangledLanes=this.finishedLanes=this.mutableReadLanes=this.expiredLanes=this.pingedLanes=this.suspendedLanes=this.pendingLanes=0,this.entanglements=O6(0),this.identifierPrefix=r,this.onRecoverableError=n,this.mutableSourceEagerHydrationData=null}function G4(u,l,f,r,n,i,t,y,c){return u=new _z(u,l,f,y,c),l===1?(l=1,i===!0&&(l|=8)):l=0,i=Er(3,null,null,l),u.current=i,i.stateNode=u,i.memoizedState={element:r,isDehydrated:f,cache:null,transitions:null,pendingSuspenseBoundaries:null},y4(i),u}function $z(u,l,f){var r=3{function UJ(){if(typeof __REACT_DEVTOOLS_GLOBAL_HOOK__>"u"||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!=="function")return;try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(UJ)}catch(u){console.error(u)}}UJ(),JJ.exports=FJ()});var NJ=yr((H4)=>{var QJ=Z4();H4.createRoot=QJ.createRoot,H4.hydrateRoot=QJ.hydrateRoot;var Jz});var TN=yr((w3)=>{var SZ=Fl(),XZ=Symbol.for("react.element"),YZ=Symbol.for("react.fragment"),PZ=Object.prototype.hasOwnProperty,CZ=SZ.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner,MZ={key:!0,ref:!0,__self:!0,__source:!0};function LN(u,l,f){var r,n={},i=null,t=null;f!==void 0&&(i=""+f),l.key!==void 0&&(i=""+l.key),l.ref!==void 0&&(t=l.ref);for(r in l)PZ.call(l,r)&&!MZ.hasOwnProperty(r)&&(n[r]=l[r]);if(u&&u.defaultProps)for(r in l=u.defaultProps,l)n[r]===void 0&&(n[r]=l[r]);return{$$typeof:XZ,type:u,key:i,ref:t,props:n,_owner:CZ.current}}w3.Fragment=YZ;w3.jsx=LN;w3.jsxs=LN});var GN=yr((IP,KN)=>{KN.exports=TN()});var lw=yr((uw)=>{var wy=Fl();function rV(u,l){return u===l&&(u!==0||1/u===1/l)||u!==u&&l!==l}var nV=typeof Object.is==="function"?Object.is:rV,iV=wy.useState,tV=wy.useEffect,yV=wy.useLayoutEffect,cV=wy.useDebugValue;function _V(u,l){var f=l(),r=iV({inst:{value:f,getSnapshot:l}}),n=r[0].inst,i=r[1];return yV(function(){n.value=f,n.getSnapshot=l,K9(n)&&i({inst:n})},[u,f,l]),tV(function(){return K9(n)&&i({inst:n}),u(function(){K9(n)&&i({inst:n})})},[u]),cV(f),f}function K9(u){var l=u.getSnapshot;u=u.value;try{var f=l();return!nV(u,f)}catch(r){return!0}}function $V(u,l){return l()}var AV=typeof window>"u"||typeof window.document>"u"||typeof window.document.createElement>"u"?$V:_V;uw.useSyncExternalStore=wy.useSyncExternalStore!==void 0?wy.useSyncExternalStore:AV});var rw=yr((Mb,fw)=>{fw.exports=lw()});var iw=yr((nw)=>{var jA=Fl(),jV=rw();function FV(u,l){return u===l&&(u!==0||1/u===1/l)||u!==u&&l!==l}var UV=typeof Object.is==="function"?Object.is:FV,JV=jV.useSyncExternalStore,QV=jA.useRef,NV=jA.useEffect,qV=jA.useMemo,wV=jA.useDebugValue;nw.useSyncExternalStoreWithSelector=function(u,l,f,r,n){var i=QV(null);if(i.current===null){var t={hasValue:!1,value:null};i.current=t}else t=i.current;i=qV(function(){function c(J){if(!$){if($=!0,A=J,J=r(J),n!==void 0&&t.hasValue){var Q=t.value;if(n(Q,J))return j=Q}return j=J}if(Q=j,UV(A,J))return Q;var W=r(J);if(n!==void 0&&n(Q,W))return A=J,Q;return A=J,j=W}var $=!1,A,j,F=f===void 0?null:f;return[function(){return c(l())},F===null?void 0:function(){return c(F())}]},[l,f,r,n]);var y=JV(u,i[0],i[1]);return NV(function(){t.hasValue=!0,t.value=y},[y]),wV(y),y}});var yw=yr((hb,tw)=>{tw.exports=iw()});var li=Cu(Fl(),1);var U_="北京时间";var $K={timeZone:"Asia/Shanghai",hour12:!1},AK={timeZone:"Asia/Shanghai",hour12:!1},jK=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 A6(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 uj(u){let l=A6(u);if(!l)return null;return jK.formatToParts(l).reduce((f,r)=>{if(r.type!=="literal")f[r.type]=r.value;return f},{})}function wu(u){let l=A6(u);return l?l.toLocaleString("zh-CN",$K):"--"}function yl(u){let l=A6(u);return l?l.toLocaleTimeString("zh-CN",AK):"--"}function j6(u){let l=uj(u);if(!l)return"";let f=l.hour==="24"?"00":l.hour;return`${l.year}-${l.month}-${l.day}T${f}:${l.minute}`}function lj(u=new Date){let l=uj(u);if(!l)return"";return`${l.year}-${l.month}-${l.day}`}function fj(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,r,n,i,t,y="00"]=l,c=Date.UTC(Number(f),Number(r)-1,Number(n),Number(i)-8,Number(t),Number(y)),$=new Date(c),A=j6($);return Number.isNaN($.getTime())||A!==`${f}-${r}-${n}T${i}:${t}`?null:$.toISOString()}var pL=Cu(NJ(),1);var S$=Cu(Fl(),1);var qJ=Cu(Fl(),1),p1=qJ.default.createElement;function Qz({active:u=!0,label:l="正在加载"}){if(!u)return null;return p1("span",{className:"loading-spinner-indicator",role:"status","aria-label":l,title:l,"data-testid":"loading-title-indicator"},p1("span",{className:"loading-spinner-ring","aria-hidden":!0}))}function rl({title:u,children:l,loading:f,level:r=2,className:n="",label:i="正在加载"}){return p1(r===3?"h3":"h2",{className:`loading-title ${f?"is-loading":""} ${n}`.trim()},p1("span",{className:"loading-title-text"},l??u),p1(Qz,{active:Boolean(f),label:i}))}class Mt extends Error{unideskRequestError=!0;meta;constructor(u,l){super(u);this.name="UniDeskRequestError",this.meta=l}}function Nz(u){return new Promise((l)=>setTimeout(l,u))}function Y1(u,l="操作失败"){return u instanceof Error?u.message:String(u||l)}function D$(u,l=500){if(u===null||u===void 0)return"";let f=typeof u==="string"?u:JSON.stringify(u),r=String(f||"").replace(/\s+/gu," ").trim();return r.length>l?`${r.slice(0,l)}...`:r}function qz(u){try{let l=typeof location<"u"&&location.origin?location.origin:"http://localhost";return new URL(u,l).toString()}catch{return u}}function wJ(u){return String(u.method||"GET").toUpperCase()}function wz(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 WJ(u){let l=new Headers(u.headers||{}),f=wz(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 LJ(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 Wz(u,l){if(!u||typeof u!=="object"||Array.isArray(u))return!1;return l.some((f)=>f!==!1&&u[f]===!1)}function S1(u,l,f,r,n={}){return{kind:u,method:f,url:qz(l),occurredAt:r.toISOString(),...n}}function X1(u,l){if(!u)return"请求失败";return`HTTP ${u}${l?` ${l}`:""}`}function TJ(u){try{return{body:u?JSON.parse(u):null,parseError:""}}catch(l){return{body:{text:u},parseError:Y1(l,"parse failed")}}}async function Eu(u,l={},f=0){let{failureFields:r=["ok"],strictJson:n=!1,retryInvalidJson:i=0,retryDelayMs:t=120,invalidJsonPrefix:y="服务返回了无效 JSON",invalidJsonPreview:c=!1,responsePreviewLength:$=500,...A}=l,j=wJ(A),F=new Date,J;try{J=await fetch(u,WJ(A))}catch(L){let U=Y1(L,"网络请求失败");throw new Mt(U,S1("network",u,j,F,{upstreamMessage:U}))}let Q=await J.text(),W=TJ(Q);if(W.parseError){if(n&&j==="GET"&&f=300)?X1(u.meta.status,u.meta.statusText):"应用请求失败",i=u.meta.status?X1(u.meta.status):"",t=(c)=>!c||c===n||c===i,y=!t(u.message)?u.message:t(u.meta.upstreamMessage)?"":u.meta.upstreamMessage||"";return{title:n,message:y,status:u.meta.status,statusText:u.meta.statusText,method:u.meta.method,url:u.meta.url,occurredAt:Lz(u.meta.occurredAt),responsePreview:u.meta.responsePreview,parseError:u.meta.parseError,structured:!0}}let r=Y1(u,l).split(/\r?\n/u);return{title:r[0]||l,message:r.slice(1).join(` +`),structured:r.length>1}}function Tz(u,l="操作失败"){let f=B4(u,l),r=[f.title];if(f.message)r.push(`原因: ${f.message}`);if(f.method||f.url)r.push(`请求: ${[f.method,f.url].filter(Boolean).join(" ")}`);if(f.status)r.push(`状态: ${X1(f.status,f.statusText)}`);if(f.occurredAt)r.push(`时间: ${f.occurredAt}`);if(f.parseError)r.push(`解析错误: ${f.parseError}`);if(f.responsePreview&&f.responsePreview!==f.message)r.push(`响应预览: ${f.responsePreview}`);return r.filter(Boolean).join(` +`)}function Ou(u,l="操作失败"){return GJ(u)?Tz(u,l):Y1(u,l)}var zJ=Cu(Fl(),1);var E0=zJ.default.createElement;function P1(u,l){return l?[E0("dt",{key:`${u}-label`},u),E0("dd",{key:u},l)]:null}function nl({error:u,wide:l=!1,fallback:f="操作失败",className:r=""}){if(!u)return null;let n=B4(u,f),i=[P1("请求",[n.method,n.url].filter(Boolean).join(" ")),P1("状态",n.status?`HTTP ${n.status}${n.statusText?` ${n.statusText}`:""}`:""),P1("时间",n.occurredAt),P1("解析错误",n.parseError),P1("响应预览",n.responsePreview)].filter(Boolean);return E0("div",{className:`form-error unidesk-error${l?" wide":""}${r?` ${r}`:""}`,role:"alert","data-testid":"unidesk-error"},E0("div",{className:"unidesk-error-title"},E0("strong",null,n.title),n.status?E0("span",{className:"unidesk-error-code"},`HTTP ${n.status}`):null),n.message?E0("pre",{className:"unidesk-error-message"},n.message):null,i.length>0?E0("dl",{className:"unidesk-error-details"},i):null)}var jn=Cu(Fl(),1),EJ=jn.default.createContext(null);function OJ({children:u}){let[l,f]=jn.default.useState([]),[r,n]=jn.default.useState(Date.now()),i=jn.default.useCallback((j,F)=>{let Q={id:`notif_${Date.now()}_${Math.random().toString(36).slice(2,8)}`,type:j,message:F,timestamp:Date.now()};f((W)=>{let L=[...W,Q];if(L.length>50)return L.slice(-50);return L})},[]),t=jn.default.useCallback((j)=>{f((F)=>F.filter((J)=>J.id!==j))},[]),y=jn.default.useCallback(()=>{f([]),n(Date.now())},[]),c=jn.default.useMemo(()=>{return l.filter((j)=>j.timestamp>r).length},[l,r]),$=c>0,A={notifications:l,addNotification:i,removeNotification:t,clearNotifications:y,unreadCount:c,hasUnread:$};return Kz(EJ.Provider,{value:A},u)}var Kz=jn.default.createElement;function pf(){let u=jn.default.useContext(EJ);if(!u)throw Error("useNotification must be used within NotificationProvider");return u}var h=S$.default.createElement,{useEffect:p$}=S$.default,Rt=S$.default.useState;function Kf(u,l={}){return Eu(u,{failureFields:["ok","success"],...l})}function Sf(u,l){return`${u}/microservices/baidu-netdisk/proxy${l}`}function Gz(u){let l=Number(u);return Number.isFinite(l)?l.toLocaleString("zh-CN"):"--"}function O0(u){let l=Number(u);if(!Number.isFinite(l)||l<=0)return"--";let f=["B","KB","MB","GB","TB"],r=l,n=0;while(r>=1024&&n{n?.stopPropagation?.(),f(u,l)}},"查看原始JSON")}function xt({title:u,text:l}){return h("div",{className:"empty-state"},h("strong",null,u),h("span",null,l))}function bt({title:u,text:l,href:f,badge:r,testId:n}){return h("a",{className:"doc-link-card",href:f,target:"_blank",rel:"noreferrer","data-testid":n},h("span",null,r||"DOC"),h("strong",null,u),h("p",null,l),h("code",null,f))}function zz(u){return u?.runtime&&typeof u.runtime==="object"&&!Array.isArray(u.runtime)?u.runtime:{}}function Ez(u){return u?.backend&&typeof u.backend==="object"&&!Array.isArray(u.backend)?u.backend:{}}function Oz(u){return u?.repository&&typeof u.repository==="object"&&!Array.isArray(u.repository)?u.repository:{}}function Zz(u){return Array.isArray(u?.files)?u.files:[]}function Hz(u){return Array.isArray(u?.jobs)?u.jobs:[]}function Bz(u,l){if(!u||u===l)return l;let f=u.replace(/\/+$/u,""),r=f.slice(0,f.lastIndexOf("/"))||l;return r.lengthx.id==="baidu-netdisk")||null,[n,i]=Rt({loading:!1,actionLoading:!1,error:"",message:"",health:null,account:null,files:null,transfers:null,logs:null,selfTest:null,refreshedAt:null}),[t,y]=Rt("/"),[c,$]=Rt(null),[A,j]=Rt(""),[F,J]=Rt({localPath:"sample.txt",remotePath:"/sample.txt"}),[Q,W]=Rt({fsId:"",localPath:"downloads/"}),{addNotification:L}=pf(),U=n.health?.baidu?.appRoot||n.account?.rootPath||"/";p$(()=>{J((x)=>{let lu=new Set(["/sample.txt","/apps/UniDeskBaiduNetdisk/sample.txt"]);if(x.remotePath&&!lu.has(x.remotePath))return x;let cu=m4(U,"sample.txt");return x.remotePath===cu?x:{...x,remotePath:cu}})},[U]);async function q(x=t){let cu=await Kf(Sf(f,`/api/files?dir=${encodeURIComponent(x||U)}&limit=100`));i((_u)=>({..._u,files:cu}))}async function N(){let x=await Kf(Sf(f,"/api/transfers?limit=80"));i((lu)=>({...lu,transfers:x}))}async function w(){if(!r)return;i((x)=>({...x,loading:!0,error:"",message:""}));try{let x=await Kf(`${f}/microservices/baidu-netdisk/health`),lu=x?.baidu?.appRoot||U,cu=null,_u=null;if(x?.auth?.loggedIn){cu=await Kf(Sf(f,"/api/account?refresh=1"));let Wu=t&&t.startsWith(lu)?t:lu;y(Wu),_u=await Kf(Sf(f,`/api/files?dir=${encodeURIComponent(Wu)}&limit=100`))}else y(lu);let Fu=await Kf(Sf(f,"/api/transfers?limit=80")),zu=await Kf(Sf(f,"/logs?limit=60"));i((Wu)=>({...Wu,loading:!1,health:x,account:cu?.account||null,files:_u,transfers:Fu,logs:zu,refreshedAt:new Date}))}catch(x){i((lu)=>({...lu,loading:!1,error:Ou(x,"百度网盘服务加载失败")}))}}async function G(){i((x)=>({...x,actionLoading:!0,error:"",message:""}));try{let x=await Kf(Sf(f,"/api/auth/device/start"),{method:"POST",body:{}});$(x.session||null),i((lu)=>({...lu,actionLoading:!1,message:"设备码已生成,请扫码授权"}))}catch(x){i((lu)=>({...lu,actionLoading:!1,error:Ou(x,"创建设备码失败")}))}}async function Z(x=!1){if(!c?.id)return;if(x)i((lu)=>({...lu,actionLoading:!0,error:""}));try{let lu=await Kf(Sf(f,`/api/auth/device/status?sessionId=${encodeURIComponent(c.id)}`));if($(lu.session||null),lu.session?.status==="succeeded")i((cu)=>({...cu,actionLoading:!1,message:"授权成功,正在刷新账号与文件列表"})),await w();else if(x)i((cu)=>({...cu,actionLoading:!1}))}catch(lu){i((cu)=>({...cu,actionLoading:!1,error:Ou(lu,"轮询登录状态失败")}))}}async function H(){i((x)=>({...x,actionLoading:!0,error:"",message:""}));try{await Kf(Sf(f,"/api/auth/logout"),{method:"POST",body:{}}),$(null),i((x)=>({...x,actionLoading:!1,account:null,files:null,message:"本地 token 已清除"})),await w()}catch(x){i((lu)=>({...lu,actionLoading:!1,error:Ou(x,"退出登录失败")}))}}async function E(x){x.preventDefault();let lu=A.trim();if(!lu)return;i((cu)=>({...cu,actionLoading:!0,error:"",message:""}));try{await Kf(Sf(f,"/api/folders"),{method:"POST",body:{path:m4(t,lu)}}),j(""),i((cu)=>({...cu,actionLoading:!1,message:"文件夹已创建"})),await q(t)}catch(cu){i((_u)=>({..._u,actionLoading:!1,error:Ou(cu,"创建文件夹失败")}))}}async function V(x){if(!x)return;i((lu)=>({...lu,actionLoading:!0,error:"",message:""}));try{await Kf(Sf(f,"/api/files/manage"),{method:"POST",body:{opera:"delete",filelist:[{path:x}],async:1}}),i((lu)=>({...lu,actionLoading:!1,message:"删除任务已提交"})),await q(t)}catch(lu){i((cu)=>({...cu,actionLoading:!1,error:Ou(lu,"删除失败")}))}}async function S(x){x.preventDefault(),i((lu)=>({...lu,actionLoading:!0,error:"",message:""}));try{await Kf(Sf(f,"/api/transfers/upload-from-path"),{method:"POST",body:F}),i((lu)=>({...lu,actionLoading:!1,message:"上传任务已入队"})),await N()}catch(lu){i((cu)=>({...cu,actionLoading:!1,error:Ou(lu,"上传任务创建失败")}))}}async function B(x){x.preventDefault(),i((lu)=>({...lu,actionLoading:!0,error:"",message:""}));try{await Kf(Sf(f,"/api/transfers/download-to-path"),{method:"POST",body:Q}),i((lu)=>({...lu,actionLoading:!1,message:"下载任务已入队"})),await N()}catch(lu){i((cu)=>({...cu,actionLoading:!1,error:Ou(lu,"下载任务创建失败")}))}}async function D(x,lu){i((cu)=>({...cu,actionLoading:!0,error:"",message:""}));try{await Kf(Sf(f,`/api/transfers/${encodeURIComponent(x)}/${lu}`),{method:"POST",body:{}}),i((cu)=>({...cu,actionLoading:!1,message:lu==="cancel"?"已请求取消任务":"任务已重新入队"})),await N()}catch(cu){i((_u)=>({..._u,actionLoading:!1,error:Ou(cu,"任务操作失败")}))}}async function X(){i((x)=>({...x,actionLoading:!0,error:"",message:"正在运行上传/下载自测..."}));try{let x=await Kf(Sf(f,"/api/self-test"),{method:"POST",body:{}});i((lu)=>({...lu,actionLoading:!1,selfTest:x,message:`上传/下载自测通过:${x.remotePath||""}`})),await q(t),await N()}catch(x){i((lu)=>({...lu,actionLoading:!1,error:Ou(x,"上传/下载自测失败")}))}}if(p$(()=>{if(!r)return;w();return},[r?.id,r?.runtime?.providerStatus]),p$(()=>{if(!c?.id||c.status!=="pending")return;let x=window.setInterval(()=>void Z(!1),Math.max(5000,Number(c.pollIntervalSeconds||5)*1000));return()=>window.clearInterval(x)},[c?.id,c?.status,c?.pollIntervalSeconds]),p$(()=>{if(!r)return;let x=window.setInterval(()=>void N(),5000);return()=>window.clearInterval(x)},[r?.id]),!r)return h(xt,{title:"Baidu Netdisk 未登记",text:"请在 config.json 的 microservices 中登记用户服务 id=baidu-netdisk"});let O=zz(r),Y=Oz(r),p=Ez(r),v=n.health||{},z=n.account||v.auth?.account||null,P=v.auth||{},k=Zz(n.files),I=Hz(n.transfers),b=z?.quota||{},d=Boolean(P.loggedIn||z),g=Boolean(P.configured);return h("div",{className:"baidu-netdisk-page","data-testid":"baidu-netdisk-page"},h(Oi,{title:"Baidu Netdisk 工作台",eyebrow:"Containerized Storage Gateway",loading:n.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:w,disabled:n.loading,"data-testid":"baidu-netdisk-refresh"},n.loading?"刷新中":"刷新"),h(Yn,{title:"Baidu Netdisk 用户服务",data:r,onOpen:l,testId:"raw-baidu-netdisk-service"}))},h("div",{className:"baidu-netdisk-hero"},h("div",null,h("div",{className:"node-version-line"},h(Ei,{status:O.providerStatus==="online"?"online":"warn"},O.providerStatus||"unknown"),h("span",null,r.providerId),h(Ei,{status:p.public?"warn":"private"},p.public?"公网暴露":"仅 UniDesk frontend 代理访问")),h("p",{className:"muted paragraph"},r.description)),h("div",{className:"microservice-ref-card"},h("span",null,"Repo"),h("strong",null,Y.url||"--"),h("code",null,Y.commitId||"--")),h("div",{className:"microservice-ref-card"},h("span",null,"Private Backend"),h("strong",null,`${p.nodeBindHost||"--"}:${p.nodePort||"--"}`),h("code",null,`${Y.composeFile||"--"} / ${Y.composeService||"--"}`))),h(nl,{error:n.error,wide:!0})),h("div",{className:"metric-grid"},h(ht,{label:"Health",value:v.ok?"OK":"--",hint:v.storage?.postgres||"postgres",tone:v.ok?"ok":"warn"}),h(ht,{label:"OAuth",value:g?"已配置":"待配置",hint:g?"client + secret + token key":"需要设置 UNIDESK_BAIDU_NETDISK_*",tone:g?"ok":"warn"}),h(ht,{label:"Login",value:d?"已登录":"未登录",hint:z?.username||"Device Code QR",tone:d?"ok":"warn"}),h(ht,{label:"Work Root",value:mz(U),hint:U}),h(ht,{label:"Quota",value:O0(b.used),hint:b.total?`${b.usedPercent||0}% / ${O0(b.total)}`:"授权后刷新"}),h(ht,{label:"Transfers",value:Gz(I.length),hint:`running ${n.transfers?.counts?.running||0} / failed ${n.transfers?.counts?.failed||0}`})),h(Oi,{title:"文件浏览器",eyebrow:t,className:"baidu-files-panel",loading:n.loading,actions:h("div",{className:"panel-actions inline-actions"},h("button",{type:"button",className:"ghost-btn",onClick:()=>{let x=Bz(t,U);y(x),q(x)},disabled:!d||t===U},"上级"),h("button",{type:"button",className:"ghost-btn",onClick:()=>q(t),disabled:!d},"刷新文件"),h(Yn,{title:"Baidu Files",data:n.files,onOpen:l,testId:"raw-baidu-files"}))},h("form",{className:"baidu-pathbar",onSubmit:(x)=>{x.preventDefault(),q(t)}},h("input",{value:t,onChange:(x)=>y(x.target.value),disabled:!d}),h("button",{type:"submit",className:"ghost-btn",disabled:!d},"打开路径")),h("form",{className:"baidu-pathbar",onSubmit:E},h("input",{value:A,onChange:(x)=>j(x.target.value),placeholder:"新文件夹名称",disabled:!d}),h("button",{type:"submit",className:"primary-btn",disabled:!d||!A.trim()},"新建文件夹")),!d?h(xt,{title:"等待授权",text:"登录后通过 /api/files 读取工作目录文件列表"}):k.length===0?h(xt,{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,k.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(Ei,{status:x.isDir?"queued":"private"},x.isDir?"DIR":"FILE")),h("td",null,x.isDir?"--":O0(x.size)),h("td",null,x.serverMtime?wu(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:()=>{y(x.path),q(x.path)}},"打开"):h("button",{type:"button",className:"ghost-btn",onClick:()=>W((lu)=>({...lu,fsId:x.fsId}))},"填入下载"),h("button",{type:"button",className:"ghost-btn",onClick:()=>V(x.path),disabled:n.actionLoading},"删除"))))))))),h("div",{className:"baidu-netdisk-grid"},h(Oi,{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"},g?"OAuth 运行时变量已配置;如需轮换密钥、迁移部署或排查代理边界,可直接打开下面的项目内文档。":"首次使用请先按环境变量配置文档填入百度应用 client id / secret,然后重建 baidu-netdisk 服务并刷新本页。"),h("div",{className:"baidu-doc-grid","data-testid":"baidu-netdisk-doc-links"},h(bt,{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(bt,{title:"服务方案与 API",text:"说明 OAuth Device Code、根目录工作区、staging 上传下载任务和后端 API 设计。",href:"/docs/issue/baidu-netdisk-user-service.md",badge:"DESIGN"}),h(bt,{title:"用户服务安全边界",text:"查看 UniDesk microservice 私有代理、允许路径、frontendOnly 和密钥边界规则。",href:"/docs/reference/microservices.md",badge:"REF"}),h(bt,{title:"部署与重建流程",text:"查看 server rebuild、Compose 编排、健康检查和交付验证的长期规则。",href:"/docs/reference/deployment.md",badge:"DEPLOY"}),h(bt,{title:"CLI 验证命令",text:"查看 microservice health/proxy、server rebuild、job status 等命令入口。",href:"/docs/reference/cli.md",badge:"CLI"}),h(bt,{title:"百度设备码模式",text:"打开百度官方 OAuth Device Code 文档,对照扫码登录和轮询参数。",href:"https://pan.baidu.com/union/doc/fl1x114ti",badge:"OFFICIAL"}))),h(Oi,{title:"设备码登录",eyebrow:"OAuth Device Code",className:"baidu-login-panel",loading:n.actionLoading,actions:h("div",{className:"panel-actions inline-actions"},h("button",{type:"button",className:"primary-btn",onClick:G,disabled:n.actionLoading||!g,"data-testid":"baidu-netdisk-start-login"},"生成二维码"),c?.id?h("button",{type:"button",className:"ghost-btn",onClick:()=>Z(!0),disabled:n.actionLoading},"检查状态"):null,d?h("button",{type:"button",className:"ghost-btn",onClick:H,disabled:n.actionLoading},"清除本地登录"):null,h(Yn,{title:"Baidu Device Session",data:c||P.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"},c?.qrcodeUrl?h("img",{src:c.qrcodeUrl,alt:"百度网盘设备码授权二维码","data-testid":"baidu-netdisk-qrcode"}):h(xt,{title:g?"等待二维码":"OAuth 未配置",text:g?"点击生成二维码后使用百度网盘或百度 App 扫码":"设置 client id、secret 和 token key 后重建服务"})),h("div",{className:"claudeqq-login-copy"},h("div",{className:"node-version-line"},h(Ei,{status:d?"online":c?.status==="pending"?"warn":"unknown"},d?"已登录":c?.status||"未开始"),h("span",null,c?.secondsRemaining!==void 0?`${c.secondsRemaining}s`:"--"),h("span",null,"scope basic,netdisk")),h("p",{className:"muted paragraph"},d?"access token / refresh token 已加密保存到 PostgreSQL;前端只看到脱敏登录态。":"后端使用百度 OAuth Device Code 轮询换取 token;二维码过期后重新生成即可。"),h("div",{className:"microservice-ref-card"},h("span",null,"User Code"),h("strong",null,c?.userCode||"--"),h("code",null,c?.verificationUrl||"https://openapi.baidu.com/device")),h("div",{className:"microservice-ref-card"},h("span",null,"Expires"),h("strong",null,c?.expiresAt?wu(c.expiresAt):"--"),h("code",null,c?.error||"no token exposed"))))),h(Oi,{title:"账号与容量",eyebrow:n.refreshedAt?`Updated ${yl(n.refreshedAt)}`:"Account",loading:n.loading,actions:h("div",{className:"panel-actions inline-actions"},h(Yn,{title:"Baidu Account",data:z,onOpen:l,testId:"raw-baidu-account"}))},z?h("div",{className:"baidu-account-card"},h("div",{className:"node-version-line"},h(Ei,{status:"online"},"connected"),h("span",null,z.baiduUid||"--"),h("span",null,`VIP ${z.vipType??"--"}`)),h("h3",null,z.username||"Baidu Netdisk"),h("p",{className:"muted paragraph"},`工作目录固定在 ${z.rootPath||U};v1 上传/下载只读写容器 staging 目录,不把大文件字节流穿过 UniDesk proxy。`),h("div",{className:"quota-bar"},h("span",{style:{width:`${Math.max(0,Math.min(100,Number(b.usedPercent||0)))}%`}})),h("div",{className:"microservice-ref-card"},h("span",null,"Quota"),h("strong",null,`${O0(b.used)} / ${O0(b.total)}`),h("code",null,`${b.usedPercent||0}% used`))):h(xt,{title:"尚未登录",text:"扫码授权后这里会显示账号、UID、会员状态和容量"})),h(Oi,{title:"传输任务",eyebrow:"staging path jobs",className:"baidu-transfers-panel",loading:n.actionLoading,actions:h("div",{className:"panel-actions inline-actions"},h("button",{type:"button",className:"primary-btn",onClick:X,disabled:!d||n.actionLoading,"data-testid":"baidu-netdisk-self-test"},"运行自测"),h("button",{type:"button",className:"ghost-btn",onClick:N},"刷新任务"),h(Yn,{title:"Baidu Transfers",data:n.transfers,onOpen:l,testId:"raw-baidu-transfers"}))},h("div",{className:"baidu-transfer-forms"},h("form",{className:"stack-form",onSubmit:S,"data-testid":"baidu-upload-form"},h("label",null,"容器 staging 文件",h("input",{value:F.localPath,onChange:(x)=>J((lu)=>({...lu,localPath:x.target.value})),placeholder:"sample.txt"})),h("label",null,"百度网盘目标路径",h("input",{value:F.remotePath,onChange:(x)=>J((lu)=>({...lu,remotePath:x.target.value})),placeholder:m4(U,"sample.txt")})),h("button",{type:"submit",className:"primary-btn",disabled:!d||n.actionLoading},"上传 staging 文件")),h("form",{className:"stack-form",onSubmit:B,"data-testid":"baidu-download-form"},h("label",null,"文件 fs_id",h("input",{value:Q.fsId,onChange:(x)=>W((lu)=>({...lu,fsId:x.target.value})),placeholder:"从文件表填入"})),h("label",null,"保存到 staging 路径",h("input",{value:Q.localPath,onChange:(x)=>W((lu)=>({...lu,localPath:x.target.value})),placeholder:"downloads/"})),h("button",{type:"submit",className:"primary-btn",disabled:!d||!Q.fsId||n.actionLoading},"下载到 staging"))),n.selfTest?h("div",{className:"baidu-account-card","data-testid":"baidu-netdisk-self-test-result"},h("div",{className:"node-version-line"},h(Ei,{status:n.selfTest.ok?"online":"warn"},n.selfTest.ok?"self-test ok":"self-test"),h("span",null,O0(n.selfTest.sizeBytes))),h("h3",null,n.selfTest.remotePath||"Baidu self-test"),h("div",{className:"microservice-ref-card"},h("span",null,"fs_id"),h("strong",null,n.selfTest.fsId||"--"),h("code",null,n.selfTest.downloadedPath||"--")),h("div",{className:"microservice-ref-card"},h("span",null,"MD5"),h("strong",null,n.selfTest.downloadedMd5||"--"),h("code",null,n.selfTest.expectedMd5||"--")),h(Yn,{title:"Baidu Self Test",data:n.selfTest,onOpen:l,testId:"raw-baidu-self-test"})):null,I.length===0?h(xt,{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,I.map((x)=>h("tr",{key:x.id},h("td",null,h(Ei,{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(Vz,{percent:x.progressPercent}),h("span",{className:"muted"},`${O0(x.bytesDone)} / ${O0(x.sizeBytes)}`)),h("td",null,wu(x.updatedAt)),h("td",null,h("div",{className:"inline-actions"},["queued","running"].includes(x.status)?h("button",{type:"button",className:"ghost-btn",onClick:()=>D(x.id,"cancel")},"取消"):null,["failed","canceled"].includes(x.status)?h("button",{type:"button",className:"ghost-btn",onClick:()=>D(x.id,"retry")},"重试"):null,h(Yn,{title:`Transfer ${x.id}`,data:x,onOpen:l}))))))))),h(Oi,{title:"安全与日志",eyebrow:"redacted diagnostics",className:"baidu-wide-panel",loading:n.loading,actions:h("div",{className:"panel-actions inline-actions"},h(Yn,{title:"Baidu Health",data:v,onOpen:l,testId:"raw-baidu-health"}),h(Yn,{title:"Baidu Logs",data:n.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 P$=Cu(Fl(),1);var o=P$.default.createElement,{useEffect:Dz}=P$.default,X$=P$.default.useState,Zi={label:"主用户私聊账号",userId:645275593};function V4(u){let l=Number(u);return Number.isFinite(l)?l.toLocaleString("zh-CN"):"--"}async function Z0(u,l={}){return Eu(u,{failureFields:["ok","success"],...l})}async function pz(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 Y$({status:u,children:l}){let f=String(u||"unknown").toLowerCase();return o("span",{className:`status-badge ${f}`},l||u||"unknown")}function vt({label:u,value:l,hint:f,tone:r}){return o("article",{className:`metric-card ${r||""}`},o("div",{className:"metric-label"},u),o("div",{className:"metric-value"},l),o("div",{className:"metric-hint"},f))}function kt({title:u,eyebrow:l,actions:f,children:r,className:n,loading:i}){return o("section",{className:`panel ${n||""}`},o("div",{className:"panel-head"},o("div",null,l?o("p",{className:"panel-eyebrow"},l):null,o(rl,{title:u,loading:i})),f?o("div",{className:"panel-actions"},f):null),o("div",{className:"panel-body"},r))}function C1({title:u,data:l,onOpen:f,testId:r}){return o("button",{type:"button",className:"ghost-btn","data-testid":r,onClick:(n)=>{n?.stopPropagation?.(),f(u,l)}},"查看原始JSON")}function M1({title:u,text:l}){return o("div",{className:"empty-state"},o("strong",null,u),o("span",null,l))}function Sz(u){return u?.runtime&&typeof u.runtime==="object"&&!Array.isArray(u.runtime)?u.runtime:{}}function Xz(u){return u?.backend&&typeof u.backend==="object"&&!Array.isArray(u.backend)?u.backend:{}}function Yz(u){return u?.repository&&typeof u.repository==="object"&&!Array.isArray(u.repository)?u.repository:{}}function H0(u,l){return`${u}/microservices/claudeqq/proxy${l}`}function Pz(u){return Array.isArray(u?.events)?u.events.slice(0,80):[]}function Cz(u){return Array.isArray(u?.subscriptions)?u.subscriptions.slice(0,50):[]}function Mz(u){return Array.isArray(u?.messages)?u.messages.slice(0,30):[]}function HJ(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 BJ(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 mJ({microservices:u,onRaw:l,apiBaseUrl:f="/api"}){let r=u.find((z)=>z.id==="claudeqq")||null,[n,i]=X$({loading:!1,qrLoading:!1,error:"",health:null,status:null,napcatLogin:null,napcatQrcode:null,qrcodeFetched:!1,qrcodeRefreshedAt:null,events:null,subscriptions:null,sent:null,refreshedAt:null}),[t,y]=X$({targetType:"private",targetId:String(Zi.userId),message:""}),[c,$]=X$({name:"unidesk-callback",targetUrl:"",eventTypes:"message",secret:""}),[A,j]=X$(""),{addNotification:F}=pf();async function J(){if(!r)return;i((z)=>({...z,loading:!0,error:""}));try{let[z,P,k,I,b]=await Promise.all([pz(`${f}/microservices/claudeqq/health`),Z0(H0(f,"/api/server/status")),Z0(H0(f,"/api/events/recent?limit=60")),Z0(H0(f,"/api/events/subscriptions")),Z0(H0(f,"/api/messages/sent?limit=20"))]);if(i((d)=>({...d,loading:!1,error:"",health:z,status:P,events:k,subscriptions:I,sent:b,refreshedAt:new Date})),!n.qrcodeFetched)Q(!1)}catch(z){i((P)=>({...P,loading:!1,error:Ou(z,"ClaudeQQ 加载失败")}))}}async function Q(z=!0){if(!r)return;i((P)=>({...P,qrLoading:!0,error:z?"":P.error}));try{let P=await Z0(H0(f,"/api/napcat/login")),k=P?.napcat?.qrcode||P?.qrcode||null;i((I)=>({...I,qrLoading:!1,error:"",napcatLogin:P,napcatQrcode:k,qrcodeFetched:!0,qrcodeRefreshedAt:new Date}))}catch(P){i((k)=>({...k,qrLoading:!1,error:z||!k.napcatQrcode?Ou(P,"NapCat 二维码加载失败"):k.error}))}}async function W(z){z.preventDefault(),j("");let P=Number(t.targetId);if(!Number.isFinite(P)||P<=0||t.message.trim().length===0){i((k)=>({...k,error:"请填写 QQ 目标和消息内容"}));return}try{await Z0(H0(f,"/api/push/text"),{method:"POST",body:JSON.stringify({userId:t.targetType==="private"?P:void 0,groupId:t.targetType==="group"?P:void 0,message:t.message})});let k="消息推送请求已提交";y((I)=>({...I,targetType:"private",targetId:String(Zi.userId),message:""})),j(k),F("success",k),await J()}catch(k){i((I)=>({...I,error:Ou(k,"发送失败")}))}}async function L(z){if(z.preventDefault(),j(""),c.targetUrl.trim().length===0){i((P)=>({...P,error:"请填写订阅回调 URL"}));return}try{await Z0(H0(f,"/api/events/subscriptions"),{method:"POST",body:JSON.stringify({name:c.name,targetUrl:c.targetUrl,eventTypes:c.eventTypes.split(",").map((k)=>k.trim()).filter(Boolean),secret:c.secret||void 0,enabled:!0})});let P="事件订阅已创建";j(P),F("success",P),await J()}catch(P){i((k)=>({...k,error:Ou(P,"订阅失败")}))}}async function U(z){if(!z)return;j("");try{await Z0(H0(f,`/api/events/subscriptions/${encodeURIComponent(z)}`),{method:"DELETE"});let P="事件订阅已删除";j(P),F("success",P),await J()}catch(P){i((k)=>({...k,error:Ou(P,"删除订阅失败")}))}}if(Dz(()=>{if(!r)return;J();return},[r?.id,r?.runtime?.providerStatus]),!r)return o(M1,{title:"ClaudeQQ 未登记",text:"请在 config.json 的 microservices 中登记用户服务 id=claudeqq"});let q=Sz(r),N=Yz(r),w=Xz(r),G=n.health||{},Z=n.status||{},H=n.napcatLogin||{},E=G.napcat||Z.napcat||{},V={...H.napcat||{},...E,qrcode:n.napcatQrcode||{},webui:E.webui||H.napcat?.webui},S=H.login||{},B=n.napcatQrcode||{},D=Pz(n.events),X=Cz(n.subscriptions),O=Mz(n.sent),Y=Boolean(V.httpConnected||S.ready),p=String(V.loginState||S.state||(Y?"logged_in":"unknown")),v=Boolean(B.available&&B.dataUrl);return o("div",{className:"claudeqq-page","data-testid":"claudeqq-page"},o(kt,{title:"ClaudeQQ 工作台",eyebrow:"D601 QQ Event Gateway",loading:n.loading,actions:o("div",{className:"panel-actions"},o("button",{type:"button",className:"ghost-btn",onClick:J,disabled:n.loading,"data-testid":"claudeqq-refresh-button"},n.loading?"刷新中":"刷新"),o(C1,{title:"ClaudeQQ 用户服务",data:r,onOpen:l,testId:"raw-claudeqq-service"}))},o("div",{className:"findjob-hero"},o("div",null,o("div",{className:"node-version-line"},o(Y$,{status:q.providerStatus==="online"?"online":"warn"},q.providerStatus||"unknown"),o("span",null,r.providerId),o("span",null,w.public?"公网暴露":"仅 UniDesk frontend 代理访问")),o("p",{className:"muted paragraph"},r.description)),o("div",{className:"microservice-ref-card"},o("span",null,"Repo"),o("strong",null,N.url||"--"),o("code",null,N.commitId||"--")),o("div",{className:"microservice-ref-card"},o("span",null,"D601 Docker"),o("strong",null,`${w.nodeBindHost||"--"}:${w.nodePort||"--"}`),o("code",null,`${N.composeFile||"--"} / ${N.composeService||"--"}`))),o(nl,{error:n.error,wide:!0})),o("div",{className:"metric-grid"},o(vt,{label:"Health",value:G.ok||G.status==="ok"?"OK":"--",hint:"D601 /health",tone:G.ok||G.status==="ok"?"ok":"warn"}),o(vt,{label:"NapCat HTTP",value:V.httpConnected||V.http?.connected?"OK":"离线",hint:`${V.httpHost||G.napcat?.httpHost||"--"}:${V.httpPort||G.napcat?.httpPort||"--"}`}),o(vt,{label:"NapCat WS",value:V.wsConnected||V.ws?.connected?"OK":"离线",hint:`${V.wsHost||G.napcat?.wsHost||"--"}:${V.wsPort||G.napcat?.wsPort||"--"}`}),o(vt,{label:"事件缓存",value:V4(n.events?.count??D.length),hint:"recent QQ events"}),o(vt,{label:"订阅",value:V4(n.subscriptions?.count??X.length),hint:"webhook subscribers"}),o(vt,{label:"已发送",value:V4(n.sent?.count??O.length),hint:"sent message log"})),o("div",{className:"findjob-grid"},o(kt,{title:"NapCat 容器登录",eyebrow:"QR Login",className:"claudeqq-login-panel",loading:n.qrLoading,actions:o("div",{className:"panel-actions inline-actions"},o("button",{type:"button",className:"ghost-btn",onClick:()=>Q(!0),disabled:n.qrLoading,"data-testid":"claudeqq-napcat-refresh"},n.qrLoading?"刷新中":"手动刷新二维码"),o(C1,{title:"NapCat Login",data:n.napcatLogin,onOpen:l,testId:"raw-claudeqq-napcat-login"}))},o("div",{className:"claudeqq-login-card","data-testid":"claudeqq-napcat-login"},o("div",{className:"claudeqq-qr-frame"},v?o("img",{src:B.dataUrl,alt:"NapCat QQ 登录二维码","data-testid":"claudeqq-napcat-qrcode"}):o(M1,{title:"等待二维码",text:"NapCat 容器启动后会把登录二维码写入 cache/qrcode.png"})),o("div",{className:"claudeqq-login-copy"},o("div",{className:"node-version-line"},o(Y$,{status:Y?"online":v?"warn":"unknown"},Y?"已登录":v?"待扫码":"等待二维码"),o("span",null,p),o("span",null,"D601 containerized")),o("p",{className:"muted paragraph"},Y?"NapCat 已登录,ClaudeQQ 可通过容器内 HTTP/WS 链路收发 QQ 消息。":"用手机 QQ 扫描二维码授权登录。二维码只在首次加载或手动刷新时更新,D601 的 NapCat 端口仍只绑定 127.0.0.1。"),o("div",{className:"microservice-ref-card"},o("span",null,"NapCat WebUI"),o("strong",null,V.webui?.url||"http://napcat:6099/webui"),o("code",null,"local-only / proxied QR login")),o("div",{className:"microservice-ref-card"},o("span",null,"QR Source"),o("strong",null,B.modifiedAt?wu(B.modifiedAt):n.qrcodeRefreshedAt?wu(n.qrcodeRefreshedAt):"--"),o("code",null,B.file||"/napcat/cache/qrcode.png"))))),o(kt,{title:"消息推送",eyebrow:"Push API"},o("div",{className:"microservice-ref-card"},o("span",null,Zi.label),o("strong",null,String(Zi.userId)),o("code",null,"private userId / 默认推送测试目标")),o("form",{className:"stack-form",onSubmit:W,"data-testid":"claudeqq-push-form"},o("label",null,"目标类型",o("select",{value:t.targetType,onChange:(z)=>y((P)=>({...P,targetType:z.target.value}))},o("option",{value:"private"},"私聊 userId"),o("option",{value:"group"},"群 groupId"))),o("label",null,"QQ ID",o("input",{value:t.targetId,onChange:(z)=>y((P)=>({...P,targetId:z.target.value})),placeholder:String(Zi.userId)})),o("label",null,"消息内容",o("textarea",{value:t.message,onChange:(z)=>y((P)=>({...P,message:z.target.value})),rows:4,placeholder:"通过 ClaudeQQ 推送一条 QQ 消息"})),o("button",{type:"submit",className:"primary-btn"},"发送 QQ 消息")),o("p",{className:"muted paragraph"},`主 server 和其他用户服务可通过 UniDesk 同源代理调用 /api/push/text;当前人工推送测试默认使用 ${Zi.label} ${Zi.userId},不需要暴露 D601 后端端口。`)),o(kt,{title:"QQ 事件订阅",eyebrow:"Webhook Subscription",loading:n.loading},o("form",{className:"stack-form",onSubmit:L,"data-testid":"claudeqq-subscription-form"},o("label",null,"订阅名称",o("input",{value:c.name,onChange:(z)=>$((P)=>({...P,name:z.target.value}))})),o("label",null,"回调 URL",o("input",{value:c.targetUrl,onChange:(z)=>$((P)=>({...P,targetUrl:z.target.value})),placeholder:"http://host.docker.internal:18080/..."})),o("label",null,"事件类型",o("input",{value:c.eventTypes,onChange:(z)=>$((P)=>({...P,eventTypes:z.target.value})),placeholder:"message,notice"})),o("label",null,"签名密钥",o("input",{value:c.secret,onChange:(z)=>$((P)=>({...P,secret:z.target.value})),placeholder:"可选,生成 x-claudeqq-signature"})),o("button",{type:"submit",className:"primary-btn"},"创建订阅")),X.length===0?o(M1,{title:"暂无订阅",text:"可以为 main server 或其他用户服务注册 HTTP webhook"}):o("div",{className:"table-wrap","data-testid":"claudeqq-subscription-table"},o("table",null,o("thead",null,o("tr",null,o("th",null,"名称"),o("th",null,"状态"),o("th",null,"事件"),o("th",null,"回调"),o("th",null,"最近投递"),o("th",null,"操作"))),o("tbody",null,X.map((z)=>o("tr",{key:z.id},o("td",null,o("strong",null,z.name||z.id),o("code",null,z.id||"--")),o("td",null,o(Y$,{status:z.enabled?"online":"warn"},z.enabled?"enabled":"disabled")),o("td",null,Array.isArray(z.eventTypes)?z.eventTypes.join(", "):"message"),o("td",null,z.targetUrl||"--"),o("td",null,z.lastDelivery?`${z.lastDelivery.ok?"OK":"FAIL"} ${wu(z.lastDelivery.at)}`:"--"),o("td",null,o("button",{type:"button",className:"ghost-btn",onClick:()=>U(z.id)},"删除"))))))),o("div",{className:"panel-actions inline-actions"},o(C1,{title:"ClaudeQQ Subscriptions",data:n.subscriptions,onOpen:l,testId:"raw-claudeqq-subscriptions"}))),o(kt,{title:"最近 QQ 事件",eyebrow:n.refreshedAt?`Updated ${yl(n.refreshedAt)}`:"Event Stream",loading:n.loading},D.length===0?o(M1,{title:"暂无事件",text:"等待 NapCat WebSocket 上报 QQ 消息事件,或通过订阅 API 消费后续事件"}):o("div",{className:"table-wrap","data-testid":"claudeqq-event-list"},o("table",null,o("thead",null,o("tr",null,o("th",null,"时间"),o("th",null,"类型"),o("th",null,"会话"),o("th",null,"消息"),o("th",null,"ID"))),o("tbody",null,D.map((z)=>o("tr",{key:z.id},o("td",null,wu(z.receivedAt||z.timestamp)),o("td",null,o(Y$,{status:z.postType||z.eventType},z.postType||z.eventType||"--")),o("td",null,BJ(z)),o("td",null,HJ(z)),o("td",null,o("code",null,z.messageId||z.id||"--"))))))),o("div",{className:"panel-actions inline-actions"},o(C1,{title:"ClaudeQQ Events",data:n.events,onOpen:l,testId:"raw-claudeqq-events"}))),o(kt,{title:"已发送消息",eyebrow:`${O.length} Sent`,loading:n.loading},O.length===0?o(M1,{title:"暂无发送记录",text:"发送日志来自 ClaudeQQ bot_workspace/messages/sent_messages.jsonl"}):o("div",{className:"table-wrap"},o("table",null,o("thead",null,o("tr",null,o("th",null,"时间"),o("th",null,"目标"),o("th",null,"消息"),o("th",null,"结果"))),o("tbody",null,O.map((z,P)=>o("tr",{key:z.id||P},o("td",null,wu(z.timestamp||z.sentAt||z.createdAt)),o("td",null,BJ(z)),o("td",null,HJ(z)),o("td",null,z.status||z.messageId||z.message_id||"--")))))),o("div",{className:"panel-actions inline-actions"},o(C1,{title:"ClaudeQQ Sent Messages",data:n.sent,onOpen:l,testId:"raw-claudeqq-sent"})))))}var s1=Cu(Fl(),1);var pJ=Cu(Fl(),1),Nl=pJ.default.createElement;function SJ({markdown:u,className:l,testId:f}){let r=String(u??"").trimEnd(),n=["markdown-body",l].filter(Boolean).join(" ");return Nl("div",{className:n,"data-testid":f},XJ(r,"md"))}function XJ(u,l){let f=Rz(u).split(` +`),r=[],n=0;while(n\s?/u.test(i)){let j=[];while(n\s?(.*)$/u);if(J!==null){j.push(J[1]),n+=1;continue}if(F.trim().length===0){j.push(""),n+=1;continue}break}r.push(Nl("blockquote",{key:`${l}-quote-${n}`},XJ(j.join(` +`),`${l}-quote-${n}`)));continue}if(PJ(f,n)){let j=n,F=R1(f[n]??""),J=R1(f[n+1]??"");n+=2;let Q=[];while(n0)Q.push(R1(f[n]??"")),n+=1;r.push(kz(F,J,Q,`${l}-table-${j}`));continue}let c=M$(i);if(c!==null){let j=n,F=c.ordered,J=c.start,Q=[];while(nbz(L,`${l}-list-${j}-${U}`))));continue}let $=n,A=[];while(n0&&!xz(f,n))A.push(f[n].trim()),n+=1;if(A.length===0)A.push(i.trim()),n+=1;r.push(Nl("p",{key:`${l}-p-${$}`},Fn(A.join(` +`),`${l}-p-${$}`)))}return r}function Rz(u){return String(u||"").replace(/\r\n/gu,` `).replace(/\r/gu,` -`).trimEnd()}function zJ(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 TT(u,l){let f=u.trim();return f.length>=l.length&&f.split("").every((r)=>r===l.marker)}function zA(u){return/^(?: {4}|\t)/u.test(u)}function WJ(u,l,f){let r=l.trim().length>0?`language-${VT(l)}`:void 0;return Ql("pre",{key:f,className:"markdown-code-block"},Ql("code",{className:r},u))}function ET(u,l){let f=u[l]??"";if(f.trim().length===0)return!0;return zJ(f)!==null||zA(f)||/^(#{1,6})\s+.+$/u.test(f)||/^\s*(?:---+|\*\*\*+|___+)\s*$/u.test(f)||/^\s*>\s?/u.test(f)||TJ(u,l)||p3(f)!==null}function p3(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 ZT(u,l){let f=u.match(/^\[([ xX])\]\s+(.+)$/u);if(f!==null){let r=f[1].toLowerCase()==="x";return Ql("li",{key:l,className:"task-list-item"},Ql("input",{type:"checkbox",checked:r,readOnly:!0,tabIndex:-1}),Ql("span",null,y0(f[2],`${l}-task`)))}return Ql("li",{key:l},y0(u,l))}function TJ(u,l){let f=u[l]??"",r=u[l+1]??"";if(!f.includes("|")||!r.includes("|"))return!1;let n=Yt(f),i=Yt(r);return n.length>1&&i.length===n.length&&i.every((y)=>/^:?-{3,}:?$/u.test(y.trim()))}function Yt(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 OT(u){let l=u.trim();if(l.startsWith(":")&&l.endsWith(":"))return"center";if(l.endsWith(":"))return"right";if(l.startsWith(":"))return"left";return}function HT(u,l,f,r){let n=l.map(OT);return Ql("div",{key:r,className:"markdown-table-wrap"},Ql("table",null,Ql("thead",null,Ql("tr",null,u.map((i,y)=>Ql("th",{key:`${r}-h-${y}`,style:n[y]?{textAlign:n[y]}:void 0},y0(i,`${r}-h-${y}`))))),Ql("tbody",null,f.map((i,y)=>Ql("tr",{key:`${r}-r-${y}`},u.map((t,_)=>Ql("td",{key:`${r}-r-${y}-${_}`,style:n[_]?{textAlign:n[_]}:void 0},y0(i[_]||"",`${r}-r-${y}-${_}`))))))))}function y0(u,l,f={}){let r=[],n=/`([^`\n]+)`|\[([^\]\n]+)\]\(([^)\s]+)(?:\s+"[^"]*")?\)|(https?:\/\/[^\s<>)]+)|\*\*([^*\n]+)\*\*|__([^_\n]+)__|~~([^~\n]+)~~|\*([^*\n]+)\*|_([^_\n]+)_/gu,i=f.linkify!==!1,y=0,t=0;for(let _ of u.matchAll(n)){let c=_[0],A=_.index??0;Y3(r,u.slice(y,A),`${l}-text-${t}`),y=A+c.length;let j=`${l}-inline-${t}`;if(t+=1,_[1]!==void 0){r.push(Ql("code",{key:j},_[1]));continue}if(_[2]!==void 0&&_[3]!==void 0){if(!i){Y3(r,c,`${j}-literal`);continue}r.push(wJ(_[2],_[3],j));continue}if(_[4]!==void 0){if(!i){Y3(r,c,`${j}-literal`);continue}r.push(wJ(_[4],_[4],j));continue}let F=_[5]??_[6];if(F!==void 0){r.push(Ql("strong",{key:j},y0(F,`${j}-strong`)));continue}if(_[7]!==void 0){r.push(Ql("del",{key:j},y0(_[7],`${j}-del`)));continue}let J=_[8]??_[9];if(J!==void 0)r.push(Ql("em",{key:j},y0(J,`${j}-em`)))}return Y3(r,u.slice(y),`${l}-text-tail`),r}function Y3(u,l,f){if(l.length===0)return;l.split(` -`).forEach((n,i)=>{if(i>0)u.push(Ql("br",{key:`${f}-br-${i}`}));if(n.length>0)u.push(n)})}function wJ(u,l,f){let r=BT(l);if(r===null)return Ql("span",{key:f},u);let n=/^(?:https?:|mailto:)/iu.test(r);return Ql("a",{key:f,href:r,target:n?"_blank":void 0,rel:n?"noreferrer":void 0},y0(u,`${f}-label`,{linkify:!1}))}function BT(u){let l=String(u||"").trim();if(/^(?:https?:|mailto:)/iu.test(l))return l;if(l.startsWith("/")&&!l.startsWith("//"))return l;if(l.startsWith("#"))return l;return null}function VT(u){return String(u||"").toLowerCase().replace(/[^a-z0-9_-]+/gu,"-").replace(/^-+|-+$/gu,"")||"text"}var BA=Pu(Jl(),1);var Su=BA.default.createElement,{useEffect:DT,useRef:EJ}=BA.default;function XT(u,l){return xJ(u.toTrace(l))}function ST(u){let l=Number(u);if(!Number.isFinite(l)||l<0)return"--";let f=Math.floor(l/1000),r=Math.floor(f/3600),n=Math.floor(f%3600/60),i=f%60;if(r>0)return`${r}h ${String(n).padStart(2,"0")}m`;if(n>0)return`${n}m ${String(i).padStart(2,"0")}s`;return`${i}s`}function xr(u){let l=Number(u);return Number.isFinite(l)&&l>=0?l:null}function C1(u,l=180){let f=String(u||"").replace(/\s+/gu," ").trim();return f.length>l?`${f.slice(0,l-1)}…`:f}function YT(u){if(!u)return 0;return u.split(/\r?\n/u).length}function ZA(u){return{ran:"Ran",explored:"Explored",edited:"Edited",toolGroup:"Tool calls",plan:"Plan",message:"Message",system:"System",error:"Error"}[u]||"Message"}function OA(u){let l=Number(u||0);return Number.isFinite(l)&&l>0?`… +${Math.floor(l)} lines`:""}function pT(u){return(Array.isArray(u)?u:[]).reduce((l,f)=>Math.max(l,Number(f?.seq??0)),0)}function ZJ(u){return["explored","edited","ran"].includes(String(u?.kind||""))}function YJ(u){let l={read:0,edit:0,run:0};for(let f of u){let r=String(f?.kind||"");if(r==="explored")l.read+=1;else if(r==="edited")l.edit+=1;else if(r==="ran")l.run+=1}return l}function pJ(u){let l=YJ(u);return`${l.read} read, ${l.edit} edit, ${l.run} run`}function mJ(u){return u.replace(/^['"`([{<]+/u,"").replace(/['"`)\]}>.,;:]+$/u,"").replace(/:\d+(?::\d+)?$/u,"").trim()}function OJ(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)||[],r=[];for(let n of f){let i=mJ(n);if(i.length<2||i.includes("..."))continue;if(/^(http|https|status|method)$/iu.test(i))continue;if(!r.includes(i))r.push(i)}return r}function TA(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 HJ(u){let l="";for(let f of u){if(f.length===0)continue;if(l.length>0&&!l.endsWith(` +`).trimEnd()}function YJ(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 hz(u,l){let f=u.trim();return f.length>=l.length&&f.split("").every((r)=>r===l.marker)}function D4(u){return/^(?: {4}|\t)/u.test(u)}function VJ(u,l,f){let r=l.trim().length>0?`language-${gz(l)}`:void 0;return Nl("pre",{key:f,className:"markdown-code-block"},Nl("code",{className:r},u))}function xz(u,l){let f=u[l]??"";if(f.trim().length===0)return!0;return YJ(f)!==null||D4(f)||/^(#{1,6})\s+.+$/u.test(f)||/^\s*(?:---+|\*\*\*+|___+)\s*$/u.test(f)||/^\s*>\s?/u.test(f)||PJ(u,l)||M$(f)!==null}function M$(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 bz(u,l){let f=u.match(/^\[([ xX])\]\s+(.+)$/u);if(f!==null){let r=f[1].toLowerCase()==="x";return Nl("li",{key:l,className:"task-list-item"},Nl("input",{type:"checkbox",checked:r,readOnly:!0,tabIndex:-1}),Nl("span",null,Fn(f[2],`${l}-task`)))}return Nl("li",{key:l},Fn(u,l))}function PJ(u,l){let f=u[l]??"",r=u[l+1]??"";if(!f.includes("|")||!r.includes("|"))return!1;let n=R1(f),i=R1(r);return n.length>1&&i.length===n.length&&i.every((t)=>/^:?-{3,}:?$/u.test(t.trim()))}function R1(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 vz(u){let l=u.trim();if(l.startsWith(":")&&l.endsWith(":"))return"center";if(l.endsWith(":"))return"right";if(l.startsWith(":"))return"left";return}function kz(u,l,f,r){let n=l.map(vz);return Nl("div",{key:r,className:"markdown-table-wrap"},Nl("table",null,Nl("thead",null,Nl("tr",null,u.map((i,t)=>Nl("th",{key:`${r}-h-${t}`,style:n[t]?{textAlign:n[t]}:void 0},Fn(i,`${r}-h-${t}`))))),Nl("tbody",null,f.map((i,t)=>Nl("tr",{key:`${r}-r-${t}`},u.map((y,c)=>Nl("td",{key:`${r}-r-${t}-${c}`,style:n[c]?{textAlign:n[c]}:void 0},Fn(i[c]||"",`${r}-r-${t}-${c}`))))))))}function Fn(u,l,f={}){let r=[],n=/`([^`\n]+)`|\[([^\]\n]+)\]\(([^)\s]+)(?:\s+"[^"]*")?\)|(https?:\/\/[^\s<>)]+)|\*\*([^*\n]+)\*\*|__([^_\n]+)__|~~([^~\n]+)~~|\*([^*\n]+)\*|_([^_\n]+)_/gu,i=f.linkify!==!1,t=0,y=0;for(let c of u.matchAll(n)){let $=c[0],A=c.index??0;C$(r,u.slice(t,A),`${l}-text-${y}`),t=A+$.length;let j=`${l}-inline-${y}`;if(y+=1,c[1]!==void 0){r.push(Nl("code",{key:j},c[1]));continue}if(c[2]!==void 0&&c[3]!==void 0){if(!i){C$(r,$,`${j}-literal`);continue}r.push(DJ(c[2],c[3],j));continue}if(c[4]!==void 0){if(!i){C$(r,$,`${j}-literal`);continue}r.push(DJ(c[4],c[4],j));continue}let F=c[5]??c[6];if(F!==void 0){r.push(Nl("strong",{key:j},Fn(F,`${j}-strong`)));continue}if(c[7]!==void 0){r.push(Nl("del",{key:j},Fn(c[7],`${j}-del`)));continue}let J=c[8]??c[9];if(J!==void 0)r.push(Nl("em",{key:j},Fn(J,`${j}-em`)))}return C$(r,u.slice(t),`${l}-text-tail`),r}function C$(u,l,f){if(l.length===0)return;l.split(` +`).forEach((n,i)=>{if(i>0)u.push(Nl("br",{key:`${f}-br-${i}`}));if(n.length>0)u.push(n)})}function DJ(u,l,f){let r=Iz(l);if(r===null)return Nl("span",{key:f},u);let n=/^(?:https?:|mailto:)/iu.test(r);return Nl("a",{key:f,href:r,target:n?"_blank":void 0,rel:n?"noreferrer":void 0},Fn(u,`${f}-label`,{linkify:!1}))}function Iz(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 gz(u){return String(u||"").toLowerCase().replace(/[^a-z0-9_-]+/gu,"-").replace(/^-+|-+$/gu,"")||"text"}var C4=Cu(Fl(),1);var Su=C4.default.createElement,{useEffect:sz,useRef:CJ}=C4.default;function az(u,l){return lQ(u.toTrace(l))}function oz(u){let l=Number(u);if(!Number.isFinite(l)||l<0)return"--";let f=Math.floor(l/1000),r=Math.floor(f/3600),n=Math.floor(f%3600/60),i=f%60;if(r>0)return`${r}h ${String(n).padStart(2,"0")}m`;if(n>0)return`${n}m ${String(i).padStart(2,"0")}s`;return`${i}s`}function gr(u){let l=Number(u);return Number.isFinite(l)&&l>=0?l:null}function gt(u,l=180){let f=String(u||"").replace(/\s+/gu," ").trim();return f.length>l?`${f.slice(0,l-1)}…`:f}function dz(u){if(!u)return 0;return u.split(/\r?\n/u).length}function X4(u){return{ran:"Ran",explored:"Explored",edited:"Edited",toolGroup:"Tool calls",plan:"Plan",message:"Message",system:"System",error:"Error"}[u]||"Message"}function Y4(u){let l=Number(u||0);return Number.isFinite(l)&&l>0?`… +${Math.floor(l)} lines`:""}function ez(u){return(Array.isArray(u)?u:[]).reduce((l,f)=>Math.max(l,Number(f?.seq??0)),0)}function MJ(u){return["explored","edited","ran"].includes(String(u?.kind||""))}function gJ(u){let l={read:0,edit:0,run:0};for(let f of u){let r=String(f?.kind||"");if(r==="explored")l.read+=1;else if(r==="edited")l.edit+=1;else if(r==="ran")l.run+=1}return l}function sJ(u){let l=gJ(u);return`${l.read} read, ${l.edit} edit, ${l.run} run`}function aJ(u){return u.replace(/^['"`([{<]+/u,"").replace(/['"`)\]}>.,;:]+$/u,"").replace(/:\d+(?::\d+)?$/u,"").trim()}function RJ(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)||[],r=[];for(let n of f){let i=aJ(n);if(i.length<2||i.includes("..."))continue;if(/^(http|https|status|method)$/iu.test(i))continue;if(!r.includes(i))r.push(i)}return r}function p4(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 hJ(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 PJ(u){let l=String(u||"").replace(/\r\n/gu,` +`;l+=f}return l}function oJ(u){let l=String(u||"").replace(/\r\n/gu,` `).replace(/\r/gu,` `).trimEnd();return l.length>0?l.split(` -`):[]}function HA(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 mT(u){let l=String(u.bodyPreview||"");return/file changes status=([A-Za-z0-9_-]+)/u.exec(l)?.[1]}function PT(u){return/^item\/(?:started|completed): file changes status=/u.test(String(u||"").trim())}function CJ(u){if(String(u.kind||"")!=="edited")return!1;let l=String(u.status||""),f=String(u.title||""),r=String(u.bodyPreview||""),n=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(r))return!0;if(/^Success\. Updated the following files:/mu.test(r))return!0;if(/^diff --git /mu.test(r))return!0;return/^([AMDRCU?]{1,2})\s+\S+/mu.test(r)||n.length>0&&P3(r).length>0}function P1(u){return mJ(String(u||"").replace(/^[ab]\//u,"").trim())}function VA(u){let l=/^([AMDRCU?]{1,2})\s+(.+)$/u.exec(u);if(!l)return null;let f=P1(l[2]||"");return f.length>0?{status:l[1]||"M",path:f}:null}function DA(u){let l=/^\*\*\*\s+(Add|Update|Delete)\s+File:\s+(.+)$/u.exec(u);if(l){let r=l[1]==="Add"?"A":l[1]==="Delete"?"D":"M",n=P1(l[2]||"");return n.length>0?{status:r,path:n}:null}let f=/^\*\*\*\s+Move to:\s+(.+)$/u.exec(u);if(f){let r=P1(f[1]||"");return r.length>0?{status:"R",path:r}:null}return null}function P3(u){let l=[],f=(n,i)=>{let y=P1(i);if(y.length===0||y==="/dev/null")return;let t=l.find((_)=>_.path===y);if(t){if(t.status==="M"&&n!=="M")t.status=n;return}l.push({status:n,path:y})},r="";for(let n of PJ(u)){let i=VA(n)||DA(n);if(i!==null){f(i.status,i.path),r=i.path;continue}let y=/^diff --git a\/(.+?) b\/(.+)$/u.exec(n);if(y){let j=y[2]||y[1]||"";f("M",j),r=P1(j);continue}let t=/^\+\+\+ b\/(.+)$/u.exec(n);if(t&&t[1]!=="/dev/null"){f("M",t[1]||""),r=P1(t[1]||"");continue}if(/^new file mode /u.exec(n)&&r)f("A",r);if(/^deleted file mode /u.exec(n)&&r)f("D",r);let A=/^rename to (.+)$/u.exec(n);if(A)f("R",A[1]||"")}return l}function CT(u){if(VA(u)!==null||DA(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 XA(u){return PJ(u).map((l)=>{let f=VA(l)||DA(l);if(f!==null)return{text:l,kind:"file",path:f.path,status:f.status};return{text:l,kind:CT(l)}})}function MT(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 BJ(u,l){return`${l} ${u} line${u===1?"":"s"}`}function RT(u,l){let f=[];if(u>0)f.push(BJ(u,"Added"));if(l>0)f.push(BJ(l,"removed"));return f.join(", ")}function xT(u){for(let f=u.length-1;f>=0;f-=1){let r=String(u[f]?.status||"").trim();if(r.length>0)return r}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 hT(u){return`${u} file${u===1?"":"s"}`}function MJ(u){let l=u.length>0?u:[],f=HJ(l.map((F)=>String(F.bodyPreview||""))),n=HJ(l.map((F)=>String(F.bodyPreview||"")).filter((F)=>F.trim().length>0&&!PT(F)))||f,i=P3(n||f),y=l.map((F)=>({method:HA(F),status:mT(F),at:F.at})),t=XA(n||f),_=MT(t),c=RT(_.added,_.removed),A=i.length>0?hT(i.length):"",j=c.length>0?`${c}${A?` in ${A}`:""}`:i.length>0?A:C1(n||f||"File changes",72);return{status:xT(y),summary:j,files:i,stages:y,lines:t,addedLines:_.added,removedLines:_.removed,rawText:f}}function bT(u){let l=u[0],f=u[u.length-1]||l,r=MJ(u);return{...l,seq:Number.isFinite(Number(f?.seq))?Number(f?.seq):Number(l?.seq??0),at:f?.at||l?.at,title:r.files.length>0?`Edited ${r.summary}`:"Edited files",status:r.status,commandPreview:"",commandOmittedLines:void 0,bodyPreview:r.rawText,bodyOmittedLines:u.reduce((n,i)=>n+Number(i.bodyOmittedLines||0),0)||void 0,rawSeqs:u.flatMap((n)=>Array.isArray(n?.rawSeqs)?n.rawSeqs:[n?.seq]).filter((n)=>n!==void 0),editObservation:r}}function vT(u){let l=Array.isArray(u)?u:[],f=[],r=[],n=()=>{if(r.length===0)return;f.push(bT(r)),r=[]};for(let i of l){if(CJ(i)){if(HA(i)==="item/started"&&r.length>0)n();if(r.push(i),HA(i)==="item/completed")n();continue}n(),f.push(i)}return n(),f}function RJ(u){let l=[],f=[],r=[],n=(c,A)=>{for(let j of A)if(!c.includes(j))c.push(j)};for(let c of u){let A=String(c?.kind||""),j=[c?.commandPreview,c?.bodyPreview,c?.title].map((F)=>String(F||"")).join(` -`);if(A==="explored")n(l,OJ(j));else if(A==="edited")n(f,OJ(j));else if(A==="ran"){let F=String(c?.commandPreview||c?.title||"").trim();if(F.length>0&&!r.includes(F))r.push(C1(F,90))}}let i=u.map((c)=>Date.parse(String(c?.at||""))).filter((c)=>Number.isFinite(c)),y=i.length>=2?Math.max(0,Math.max(...i)-Math.min(...i)):0,t=u.reduce((c,A)=>c+(xr(A?.durationMs)??xr(A?.elapsedMs)??0),0),_=y>0?y:t;return{readFiles:l,editedFiles:f,runCommands:r,durationLabel:ST(_)}}function kT(u,l=3){let f=Array.isArray(u)?u:[],r=[],n=[],i=Math.max(0,l),y=new Set;for(let _=f.length-1;_>=0&&i>0;_-=1){let c=f[_];if(!ZJ(c))continue;y.add(c),i-=1}let t=()=>{if(n.length>=2){let _=YJ(n);r.push({seq:Number(n[0]?.seq??0),at:n[0]?.at||n.at(-1)?.at,kind:"toolGroup",title:pJ(n),status:`${n.length} calls`,items:n,counts:_,digest:RJ(n),rawSeqs:n.flatMap((c)=>Array.isArray(c?.rawSeqs)?c.rawSeqs:[c?.seq]).filter((c)=>c!==void 0)})}else r.push(...n);n=[]};for(let _ of f){if(ZJ(_)&&!y.has(_)){n.push(_);continue}t(),r.push(_)}return t(),r}function xJ(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:xr(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 pt(u){let l=xr(u?.state?.time?.start)??xr(u?.time?.start),f=xr(u?.state?.time?.end)??xr(u?.time?.end);return xr(u?.durationMs)??xr(u?.elapsedMs)??xr(u?.timing?.durationMs)??xr(u?.metadata?.durationMs)??(l!==null&&f!==null&&f>=l?f-l:null)??void 0}function mt(u,l){return u?.createdAt||u?.updatedAt||u?.completedAt||l||void 0}function EA(u,l){return u?.id||u?.messageId||l}function IT(u,l=1200){if(typeof u==="string")return u;if(u===void 0||u===null)return"";try{return C1(JSON.stringify(u),l)}catch{return C1(String(u),l)}}function hJ(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 m3(u,l){if(!u||typeof u!=="object"||Array.isArray(u))return"";for(let f of l){let r=u[f];if(typeof r==="string"&&r.length>0)return r;if(r!==void 0&&r!==null&&typeof r!=="object")return String(r)}return""}function VJ(u,l){if(!u||typeof u!=="object"||Array.isArray(u))return null;for(let f of l){let r=Number(u[f]);if(Number.isFinite(r))return r}return null}function bJ(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:{},r=m3(f,["command","cmd","script"]);if(r.length>0)return r;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 n=String(u?.tool||u?.title||"tool"),i=m3(f,["filePath","filepath","path"])||m3(u,["filePath","filepath","path"]),y=m3(f,["pattern","query"]),t=VJ(f,["offset"]),_=VJ(f,["limit"]),c=[n];if(y.length>0)c.push(y);if(i.length>0)c.push(i);if(t!==null)c.push(`offset=${t}`);if(_!==null)c.push(`limit=${_}`);return c.length>1?c.join(" "):n}function gT(u,l){let f=u?.part&&typeof u.part==="object"&&!Array.isArray(u.part)?u.part:{},r=String(u?.type||u?.event||u?.name||f?.type||"").toLowerCase(),n=String(f?.type||"").toLowerCase(),i=u?.at||u?.timestamp||f?.updatedAt||f?.createdAt,y=Number.isFinite(Number(u?.seq))?Number(u.seq):l;if(r==="step_start"||r==="step-start"||n==="step-start")return null;if(r==="step_finish"||r==="step-finish"||n==="step-finish")return null;if(n==="tool"||/tool|bash|command/iu.test(`${r} ${n}`)){let _=f?.state&&typeof f.state==="object"&&!Array.isArray(f.state)?f.state:{},c=bJ(f,_),A=hJ(_,f,u),j=vJ(c,String(f?.tool||f?.title||"")),F=j==="edited"?{status:String(_?.status||f?.status||u?.status||""),summary:C1(A||c,72),files:P3(A),stages:[],lines:XA(A),addedLines:0,removedLines:0,rawText:A}:void 0;return{seq:y,at:mt(f,i),kind:j,title:String(_?.title||f?.title||_?.metadata?.description||f?.tool||"OpenCode tool"),status:String(_?.status||f?.status||u?.status||""),commandPreview:c,bodyPreview:A,durationMs:pt(f),rawSeqs:[f?.id||f?.callID||u?.sessionID||y],editObservation:F}}let t=IT(f?.text??f?.content??f?.delta??u?.text??u?.content??u?.delta,3000).trim();if(t.length>0)return{seq:y,at:mt(f,i),kind:n==="reasoning"?"message":/error|failed/iu.test(`${r} ${n}`)?"error":"message",title:n==="reasoning"?"Reasoning":/error|failed/iu.test(`${r} ${n}`)?"OpenCode error":"Assistant message",status:`opencode/${r||n||"event"}`,bodyPreview:t,durationMs:pt(f),rawSeqs:[f?.id||u?.sessionID||y]};return null}function vJ(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 sT(u){let l=[],f=1;for(let r of Array.isArray(u)?u:[]){if(r?.kind&&r?.title){let t=String(r?.status||"");if(t==="opencode/step-start"||t==="opencode/step-finish")continue;l.push({...r,seq:Number.isFinite(Number(r?.seq))?Number(r.seq):f++});continue}let n=r?.createdAt||r?.updatedAt||r?.completedAt,i=String(r?.role||"assistant").toLowerCase(),y=Array.isArray(r?.parts)?r.parts:[];if(y.length===0){if(r?.part&&(r?.sessionID||String(r?.type||"").startsWith("step_")||String(r?.type||"").includes("tool"))){let t=gT(r,f);if(t!==null)l.push(t),f=Math.max(f+1,Number(t.seq)+1)}else if(r?.textPreview)l.push({seq:f++,at:n,kind:"message",title:`${i||"assistant"} message`,status:i,bodyPreview:String(r.textPreview),rawSeqs:[r?.messageId||f]});continue}for(let t of y){let _=String(t?.type||"").toLowerCase();if(_==="step-start"||_==="step-finish")continue;if(_==="text"||_==="reasoning"){let A=String(t?.textPreview||r?.textPreview||"").trim();if(A.length===0)continue;l.push({seq:f++,at:mt(t,n),kind:"message",title:_==="reasoning"?"Reasoning":i==="user"?"User message":i==="system"?"System message":"Assistant message",status:_==="reasoning"?"reasoning":i,bodyPreview:A,durationMs:pt(t),rawSeqs:[EA(t,f)]});continue}if(_==="tool"){let A=t?.state&&typeof t.state==="object"&&!Array.isArray(t.state)?t.state:{},j=bJ(t,A),F=hJ(A,t,{}),J=vJ(j,String(t?.tool||t?.title||"")),Q=J==="edited"?{status:String(A?.status||t?.status||""),summary:C1(F||j,72),files:P3(F),stages:[],lines:XA(F),addedLines:0,removedLines:0,rawText:F}:void 0;l.push({seq:f++,at:mt(t,n),kind:J,title:String(t?.title||t?.tool||"tool"),status:String(t?.status||""),commandPreview:j,bodyPreview:F,durationMs:pt(t),rawSeqs:[EA(t,f)],editObservation:Q});continue}let c=String(t?.textPreview||t?.title||_||"").trim();if(c)l.push({seq:f++,at:mt(t,n),kind:"system",title:_||"part",bodyPreview:c,status:String(t?.status||""),durationMs:pt(t),rawSeqs:[EA(t,f)]})}}return l}var kJ={source:"opencode",toTrace:sT};function aT(u){return String(u||"unknown").toLowerCase().replace(/[^a-z0-9_-]+/gu,"-")||"unknown"}function DJ(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 oT(u){if(u==="item/fileChange/outputDelta")return"delta";return u.replace(/^item\//u,"")}function dT(u,l){if(u.kind==="file"){let n=String(u.status||"M");return Su("div",{key:`${l}-${u.text}`,className:`codex-edit-diff-line file ${DJ(n)}`},Su("span",{className:`codex-edit-file-status ${DJ(n)}`},n),Su("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":"",r=u.kind==="add"||u.kind==="del"?u.text.slice(1):u.text;return Su("div",{key:`${l}-${u.text}`,className:`codex-edit-diff-line ${u.kind}`},Su("span",{className:"codex-edit-diff-sign"},f),Su("code",null,r||" "))}function eT(u,l){let f=u.lines.length>0?u.lines:u.files.map((n)=>({text:`${n.status} ${n.path}`,kind:"file",path:n.path,status:n.status})),r=Number(u.addedLines||0)+Number(u.removedLines||0)>0;return Su("div",{className:"codex-edit-observation","data-testid":"codex-edit-observation"},Su("div",{className:"codex-edit-observation-head"},Su("span",{className:"codex-edit-window-controls","aria-hidden":"true"},Su("i",null),Su("i",null),Su("i",null)),Su("strong",null,r?"git diff":"git diff --stat"),Su("code",null,u.summary||"File changes")),u.stages.length>0?Su("div",{className:"codex-edit-stage-strip"},u.stages.map((n,i)=>Su("span",{key:`${n.method}-${i}`,className:`codex-edit-stage ${aT(n.status||n.method)}`},Su("b",null,oT(n.method)),n.status?Su("em",null,n.status):null))):null,f.length>0?Su("div",{className:"codex-edit-diff",role:"list"},f.map(dT)):null,l?Su("div",{className:"codex-edit-omitted"},`${l} (查看原始JSON获取完整记录)`):null)}function XJ(u,l,f){let r=OA(f);return Su("div",{className:`codex-transcript-stream ${u}`,"data-testid":`codex-trace-${u}`},Su("span",{className:"codex-transcript-stream-label"},u),Su("pre",{className:"codex-transcript-body"},l,r?` -${r} (查看原始JSON获取完整记录)`:""))}function IJ(u,l=!1){let f=String(u.kind||"message"),r=["ran","explored","edited"].includes(f),n=OA(u.commandOmittedLines),i=OA(u.bodyOmittedLines),y=String(u.commandPreview||(r?u.title||"":"")),t=String(u.stdoutPreview||""),_=String(u.stderrPreview||""),c=t.length>0||_.length>0,A=Boolean(u.foldedReferencePrompt)&&String(u.fullPrompt||"").length>0,j=f==="edited"&&(u.editObservation!==void 0||CJ(u))?u.editObservation||MJ([u]):null;return Su("article",{key:`${u.seq}-${f}`,className:`codex-transcript-item ${f} ${l?"nested":""}`},Su("div",{className:"codex-transcript-main"},Su("div",{className:"codex-transcript-title"},Su("span",{className:"codex-output-channel"},ZA(f)),r&&j===null?null:Su("strong",null,j!==null?"File changes":String(u.title||ZA(f))),u.status?Su("code",null,String(j?.status||u.status)):null,Su("time",null,qu(u.at))),y&&j===null?Su("pre",{className:"codex-transcript-command"},y,n?` -${n}`:""):null,j!==null?eT(j,i):c?Su("div",{className:"codex-transcript-streams"},t.length>0?XJ("stdout",t,u.stdoutOmittedLines):null,_.length>0?XJ("stderr",_,u.stderrOmittedLines):null):u.bodyPreview?Su("pre",{className:"codex-transcript-body"},String(u.bodyPreview),i?` -${i} (查看原始JSON获取完整记录)`:""):null,A?Su("details",{className:"codex-initial-prompt-full","data-testid":"codex-initial-prompt-full"},Su("summary",null,Su("span",null,"引用注入已折叠,点击查看最终传入 Codex 的完整 prompt"),Su("code",null,`${u.fullPromptLines||YT(String(u.fullPrompt||""))} lines / ${u.fullPromptChars||String(u.fullPrompt||"").length} chars`)),Su("pre",{className:"codex-transcript-body codex-transcript-full-prompt","data-testid":"codex-initial-prompt-full-text"},String(u.fullPrompt||""))):null))}function uE(u){let l=Array.isArray(u.items)?u.items:[],f=u.digest&&typeof u.digest==="object"?u.digest:RJ(l);return Su("article",{key:`${u.seq}-toolGroup`,className:"codex-transcript-item toolGroup"},Su("div",{className:"codex-transcript-main"},Su("details",{className:"codex-tool-group","data-testid":"codex-tool-group"},Su("summary",null,Su("div",{className:"codex-tool-group-head"},Su("span",{className:"codex-output-channel"},ZA("toolGroup")),Su("strong",null,String(u.title||pJ(l))),Su("code",null,String(u.status||`${l.length} calls`)),Su("time",null,qu(u.at)))),Su("div",{className:"codex-tool-group-digest"},Su("span",null,`read: ${TA(Array.isArray(f.readFiles)?f.readFiles:[])}`),Su("span",null,`edit: ${TA(Array.isArray(f.editedFiles)?f.editedFiles:[])}`),Su("span",null,`run: ${TA(Array.isArray(f.runCommands)?f.runCommands:[],2)}`),Su("span",null,`duration: ${f.durationLabel||"--"}`)),Su("div",{className:"codex-tool-group-items"},l.map((r)=>IJ(r,!0))))))}function lE(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 gJ(u,l){if(l)return u;return u.flatMap((f)=>{if(String(f.kind||"")==="system"&&!lE(f))return[];if(String(f.kind||"")!=="toolGroup"||!Array.isArray(f.items))return[f];let r=gJ(f.items,l);return[{...f,items:r}]})}var fE=16;function SJ(u){return u.scrollHeight-u.scrollTop-u.clientHeight<=fE}function C3({items:u,input:l,port:f,autoScroll:r=!1,loading:n=!1,hasDetail:i=!0,emptyText:y="等待 Trace 输出...",loadingText:t="正在加载完整 Trace...",testId:_="trace-output",className:c="codex-transcript",keepRecentToolCalls:A=3,collapseTools:j=!0,showSystemEvents:F=!1}){let J=EJ(null),Q=EJ(!0),w=gJ(vT(f?XT(f,l):xJ(u)),Boolean(F)),L=j?kT(w,A):w,U=pT(w);DT(()=>{let W=J.current;if(!r||!W)return;if(!Q.current&&!SJ(W))return;W.scrollTop=W.scrollHeight,Q.current=!0},[r,w.length,U]);let q={className:c,ref:J,onScroll:(W)=>{let z=W.currentTarget;Q.current=SJ(z)},"data-testid":_};if(n&&!i)return Su("div",q,Su("div",{className:"codex-output-empty"},t));return Su("div",q,L.length===0?Su("div",{className:"codex-output-empty"},y):L.map((W)=>String(W.kind||"")==="toolGroup"?uE(W):IJ(W)))}var sJ=Pu(Jl(),1),wi=sJ.default.createElement;function M3(...u){return u.filter(Boolean).join(" ")}function aJ({title:u,children:l,actions:f,onClose:r,className:n,backdropClassName:i,bodyClassName:y,actionsClassName:t,titleId:_,testId:c,closeTestId:A,closeLabel:j="关闭",disableClose:F=!1,closeOnBackdrop:J=!0}){let Q={className:M3("raw-dialog","unidesk-dialog",n),role:"dialog","aria-modal":"true"};if(_)Q["aria-labelledby"]=_;else if(typeof u==="string")Q["aria-label"]=u;if(c)Q["data-testid"]=c;return wi("div",{className:M3("modal-backdrop","unidesk-dialog-backdrop",i),role:"presentation",onClick:(w)=>{if(J&&!F&&w.target===w.currentTarget)r()}},wi("section",Q,wi("div",{className:"raw-dialog-head unidesk-dialog-head"},wi("strong",_?{id:_}:null,u),wi("button",{type:"button",className:"ghost-btn",onClick:r,disabled:F,"data-testid":A},j)),wi("div",{className:M3("unidesk-dialog-body",y)},l),f?wi("div",{className:M3("unidesk-dialog-actions",t)},f):null))}var K=ht.default.createElement,{useEffect:Tn,useMemo:oJ,useRef:Xl}=ht.default,ku=ht.default.useState,rE=120,jQ=24,FQ=48,nE=1200;function SA(){return typeof document>"u"||document.visibilityState!=="hidden"}function Af(u,l="操作失败"){return Ou(u,l)}function br(u){let l=Number(u);if(!Number.isFinite(l)||l<0)return"--";let f=Math.floor(l/1000),r=Math.floor(f/3600),n=Math.floor(f%3600/60),i=f%60;if(r>0)return`${r}h ${String(n).padStart(2,"0")}m`;if(n>0)return`${n}m ${String(i).padStart(2,"0")}s`;return`${i}s`}function Y0(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 UQ(u,l=Date.now()){let f=Y0(u);if(f===null)return"--";let r=Math.max(0,Math.floor((l-f)/1000));if(r<1)return"刚刚";let n=Math.floor(r/86400),i=Math.floor(r%86400/3600),y=Math.floor(r%3600/60),t=r%60;if(n>0)return`${n}天${i>0?`${i}小时`:""}前`;if(i>0)return`${i}小时${y>0?`${y}分钟`:""}前`;if(y>0)return`${y}分钟${t}秒前`;return`${t}秒前`}function JQ(...u){let l="",f=-1/0;for(let r of u){let n=String(r||"");if(n.length===0)continue;let i=Y0(r);if(i!==null&&i>=f)l=n,f=i;else if(l.length===0)l=n}return l}function iE(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 MA(u,l=180){let f=String(u||"").replace(/\s+/gu," ").trim();return f.length>l?`${f.slice(0,l-1)}…`:f}async function Rl(u,l={}){return Tu(u,{strictJson:!0,retryInvalidJson:1,invalidJsonPrefix:"Code Queue 返回了无效 JSON",invalidJsonPreview:!0,responsePreviewLength:nE,...l})}function zi({status:u,children:l,title:f}){let r=String(u||"unknown").toLowerCase();return K("span",{className:`status-badge ${r}`,title:f},l||u||"unknown")}function R1({title:u,eyebrow:l,summary:f,actions:r,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-summary"},f):null),r?K("div",{className:"panel-actions"},r):null),K("div",{className:"panel-body"},n))}function QQ({title:u,data:l,onOpen:f,testId:r}){return K("button",{type:"button",className:"ghost-btn","data-testid":r,onClick:()=>f(u,l)},"查看原始JSON")}function Ti({title:u,text:l}){return K("div",{className:"empty-state"},K("strong",null,u),K("span",null,l))}function yE(u){return u?.runtime&&typeof u.runtime==="object"&&!Array.isArray(u.runtime)?u.runtime:{}}function tE(u){return u?.backend&&typeof u.backend==="object"&&!Array.isArray(u.backend)?u.backend:{}}function xl(u,l){return`${u}/microservices/code-queue/proxy${l}`}function _E(u){return`${u}/microservices/oa-event-flow/proxy/api/events/stream?tags=${encodeURIComponent("service:code-queue")}`}function gA(){return{headers:{"cache-control":"no-cache","x-unidesk-no-cache":"1"}}}function jf(u){return Array.isArray(u?.tasks)?u.tasks:[]}function zn(u){return u?.pagination&&typeof u.pagination==="object"&&!Array.isArray(u.pagination)?u.pagination:{}}function dJ(u){let l=Date.parse(String(u?.updatedAt||u?.createdAt||""));return Number.isFinite(l)?l:0}function eJ(u){return Y0(u?.queueEnteredAt)??Y0(u?.createdAt)??Y0(u?.updatedAt)??0}function $E(u,l){let f=eJ(u)-eJ(l);if(f!==0)return f;let r=(Y0(u?.createdAt)??0)-(Y0(l?.createdAt)??0);if(r!==0)return r;return String(u?.id||"").localeCompare(String(l?.id||""))}function cE(u,l=""){let f=new Map;for(let r of u)for(let n of r){let i=String(n?.id||"");if(i.length>0&&!f.has(i))f.set(i,n)}return Array.from(f.values()).sort((r,n)=>{let i=_Q(r)-_Q(n);if(i!==0)return i;let y=String(r?.id||"")===l?0:1,t=String(n?.id||"")===l?0:1;if(y!==t)return y-t;return dJ(n)-dJ(r)})}function M1(u,l=""){let f=new Map;for(let r of u)for(let n of r){let i=String(n?.id||"");if(i.length===0)continue;f.set(i,{...f.get(i)||{},...n})}return cE([Array.from(f.values())],l)}function Ct(u){return Array.isArray(u?.activeTaskIds)?u.activeTaskIds.map((l)=>String(l||"")).filter(Boolean):[String(u?.activeTaskId||"")].filter(Boolean)}var Zn="__all__",AE="(max-width: 760px)",jE="(min-width: 761px)";function kf(u){return!u||u===Zn}function FE(){return typeof window<"u"&&window.matchMedia(AE).matches}function UE(u){return kf(u)?"":`&queueId=${encodeURIComponent(u)}`}function RA(u){return String(u||"").trim().replace(/\s+/gu," ").slice(0,200)}function JE(u){let l=RA(u);return l.length===0?"":`&search=${encodeURIComponent(l)}`}function sA(u,l=""){return`${UE(u)}${JE(l)}`}function R3(u,l){return Number(u?.counts?.[l]||0)}function uQ(u,l=""){let f=new Map;for(let n of Array.isArray(u?.queues)?u.queues:[]){let i=String(n?.id||"").trim();if(i.length>0)f.set(i,{...n,name:String(n?.name||i).trim()||i})}for(let n of[String(u?.defaultQueueId||"default"),l].map((i)=>i.trim()).filter(Boolean))if(!f.has(n))f.set(n,{id:n,name:n,total:0,counts:{},activeTaskId:null,runnableTaskId:null,processing:!1});return Array.from(f.values()).sort((n,i)=>{let y=String(n?.id||"")===String(u?.defaultQueueId||"default")?0:1,t=String(i?.id||"")===String(u?.defaultQueueId||"default")?0:1;if(y!==t)return y-t;return String(n?.id||"").localeCompare(String(i?.id||""))})}function NQ(u){let l=String(u?.id||"default"),f=String(u?.name||"").trim();return f.length>0?f:l}function xA(u){let l=String(u?.id||"default"),f=NQ(u);return f===l?l:`${f} (${l})`}function Mt(u){let l=R3(u,"running")+R3(u,"judging"),f=R3(u,"queued")+R3(u,"retry_wait"),r=Number(u?.total||0),n=[xA(u),`${r} tasks`];if(l>0)n.push(`${l} running`);if(f>0)n.push(`${f} queued`);return n.join(" · ")}function h1(u,l){if(kf(l))return null;return u.find((f)=>String(f?.id||"")===l)||null}function lQ(u,l,f,r){if(kf(f)){let i=Ct(u);return String(u?.activeTaskId||i[0]||r.find((y)=>yQ(y))?.id||"")}let n=h1(l,f);return String(n?.activeTaskId||r.find((i)=>yQ(i))?.id||"")}function QE(u,l,f){if(!kf(l)){let r=h1(u,l);return String(r?.runnableTaskId||f.find((n)=>String(n?.status||"")==="queued"||String(n?.status||"")==="retry_wait")?.id||"")}return String(f.find((r)=>String(r?.status||"")==="queued"||String(r?.status||"")==="retry_wait")?.id||"")}async function NE(u,l=Zn,f=""){return Rl(xl(u,`/api/tasks/overview?limit=${jQ}&transcriptLimit=1&compact=1&selected=0${sA(l,f)}`),gA())}async function qE(u,l,f=0,r=Zn,n=""){return Rl(xl(u,`/api/tasks/overview?limit=${jQ}&transcriptLimit=3&compact=1&afterSeq=${encodeURIComponent(String(Math.max(0,f)))}&preferId=${encodeURIComponent(l)}${sA(r,n)}`),gA())}async function fQ(u,l,f,r=FQ,n=""){return Rl(xl(u,`/api/tasks/overview?limit=${encodeURIComponent(String(r))}&transcriptLimit=1&compact=1&selected=0&includeActive=0&stats=0&beforeId=${encodeURIComponent(f)}${sA(l,n)}`),gA())}async function WE(u,l){return Rl(xl(u,`/api/tasks/${encodeURIComponent(l)}/trace-summary`))}async function wE(u,l,f,r=null){let n=r===null||r===void 0||String(r).length===0?"":`&attempt=${encodeURIComponent(String(r))}`;return Rl(xl(u,`/api/tasks/${encodeURIComponent(l)}/prompt?part=${encodeURIComponent(f)}${n}`))}async function LE(u,l,f=0,r=500,n=null){let i=n===null||n===void 0||String(n).length===0?"":`&attempt=${encodeURIComponent(String(n))}`;return Rl(xl(u,`/api/tasks/${encodeURIComponent(l)}/trace-steps?afterSeq=${encodeURIComponent(String(f))}&limit=${encodeURIComponent(String(r))}${i}`))}async function KE(u,l,f){return Rl(xl(u,`/api/tasks/${encodeURIComponent(l)}/trace-step?seq=${encodeURIComponent(String(f))}`))}async function GE(u,l){return Rl(xl(u,`/api/tasks/${encodeURIComponent(l)}/read`),{method:"POST",body:{}})}async function zE(u){return Rl(xl(u,"/api/tasks/read-all"),{method:"POST",body:{}})}function TE(u){return Array.isArray(u?.output)?u.output:[]}function EE(u){return Array.isArray(u?.attempts)?u.attempts:[]}function YA(u){return u?.counts&&typeof u.counts==="object"&&!Array.isArray(u.counts)?u.counts:{}}function ZE(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 Li(u){let l=[];for(let f of u.split(/[\s,,;;]+/u)){let r=f.trim();if(/^codex_\d+_[A-Za-z0-9_-]+$/u.test(r)&&!l.includes(r))l.push(r)}return l}function OE(u,l){let f=Li(l);if(f.length===0)return u;return[`引用 Code Queue 任务 ${f.join(" ")}。后端会在入队时只注入这些任务的 initial prompt 和 final response 全文;中间执行过程不注入,如需补充核查可运行:${f.map((r)=>`bun scripts/cli.ts codex task ${r}`).join(";")}`,"","本次任务:",u].join(` -`)}function HE(u){let r=u.trimStart();if(!r.startsWith("# Code Queue 已解析引用上下文"))return{hasInjection:!1,reference:"",userPrompt:u};let n=u.length-r.length,i=u.lastIndexOf(` +`):[]}function P4(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 uE(u){let l=String(u.bodyPreview||"");return/file changes status=([A-Za-z0-9_-]+)/u.exec(l)?.[1]}function lE(u){return/^item\/(?:started|completed): file changes status=/u.test(String(u||"").trim())}function dJ(u){if(String(u.kind||"")!=="edited")return!1;let l=String(u.status||""),f=String(u.title||""),r=String(u.bodyPreview||""),n=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(r))return!0;if(/^Success\. Updated the following files:/mu.test(r))return!0;if(/^diff --git /mu.test(r))return!0;return/^([AMDRCU?]{1,2})\s+\S+/mu.test(r)||n.length>0&&h$(r).length>0}function It(u){return aJ(String(u||"").replace(/^[ab]\//u,"").trim())}function M4(u){let l=/^([AMDRCU?]{1,2})\s+(.+)$/u.exec(u);if(!l)return null;let f=It(l[2]||"");return f.length>0?{status:l[1]||"M",path:f}:null}function R4(u){let l=/^\*\*\*\s+(Add|Update|Delete)\s+File:\s+(.+)$/u.exec(u);if(l){let r=l[1]==="Add"?"A":l[1]==="Delete"?"D":"M",n=It(l[2]||"");return n.length>0?{status:r,path:n}:null}let f=/^\*\*\*\s+Move to:\s+(.+)$/u.exec(u);if(f){let r=It(f[1]||"");return r.length>0?{status:"R",path:r}:null}return null}function h$(u){let l=[],f=(n,i)=>{let t=It(i);if(t.length===0||t==="/dev/null")return;let y=l.find((c)=>c.path===t);if(y){if(y.status==="M"&&n!=="M")y.status=n;return}l.push({status:n,path:t})},r="";for(let n of oJ(u)){let i=M4(n)||R4(n);if(i!==null){f(i.status,i.path),r=i.path;continue}let t=/^diff --git a\/(.+?) b\/(.+)$/u.exec(n);if(t){let j=t[2]||t[1]||"";f("M",j),r=It(j);continue}let y=/^\+\+\+ b\/(.+)$/u.exec(n);if(y&&y[1]!=="/dev/null"){f("M",y[1]||""),r=It(y[1]||"");continue}if(/^new file mode /u.exec(n)&&r)f("A",r);if(/^deleted file mode /u.exec(n)&&r)f("D",r);let A=/^rename to (.+)$/u.exec(n);if(A)f("R",A[1]||"")}return l}function fE(u){if(M4(u)!==null||R4(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 h4(u){return oJ(u).map((l)=>{let f=M4(l)||R4(l);if(f!==null)return{text:l,kind:"file",path:f.path,status:f.status};return{text:l,kind:fE(l)}})}function rE(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 xJ(u,l){return`${l} ${u} line${u===1?"":"s"}`}function nE(u,l){let f=[];if(u>0)f.push(xJ(u,"Added"));if(l>0)f.push(xJ(l,"removed"));return f.join(", ")}function iE(u){for(let f=u.length-1;f>=0;f-=1){let r=String(u[f]?.status||"").trim();if(r.length>0)return r}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 tE(u){return`${u} file${u===1?"":"s"}`}function eJ(u){let l=u.length>0?u:[],f=hJ(l.map((F)=>String(F.bodyPreview||""))),n=hJ(l.map((F)=>String(F.bodyPreview||"")).filter((F)=>F.trim().length>0&&!lE(F)))||f,i=h$(n||f),t=l.map((F)=>({method:P4(F),status:uE(F),at:F.at})),y=h4(n||f),c=rE(y),$=nE(c.added,c.removed),A=i.length>0?tE(i.length):"",j=$.length>0?`${$}${A?` in ${A}`:""}`:i.length>0?A:gt(n||f||"File changes",72);return{status:iE(t),summary:j,files:i,stages:t,lines:y,addedLines:c.added,removedLines:c.removed,rawText:f}}function yE(u){let l=u[0],f=u[u.length-1]||l,r=eJ(u);return{...l,seq:Number.isFinite(Number(f?.seq))?Number(f?.seq):Number(l?.seq??0),at:f?.at||l?.at,title:r.files.length>0?`Edited ${r.summary}`:"Edited files",status:r.status,commandPreview:"",commandOmittedLines:void 0,bodyPreview:r.rawText,bodyOmittedLines:u.reduce((n,i)=>n+Number(i.bodyOmittedLines||0),0)||void 0,rawSeqs:u.flatMap((n)=>Array.isArray(n?.rawSeqs)?n.rawSeqs:[n?.seq]).filter((n)=>n!==void 0),editObservation:r}}function cE(u){let l=Array.isArray(u)?u:[],f=[],r=[],n=()=>{if(r.length===0)return;f.push(yE(r)),r=[]};for(let i of l){if(dJ(i)){if(P4(i)==="item/started"&&r.length>0)n();if(r.push(i),P4(i)==="item/completed")n();continue}n(),f.push(i)}return n(),f}function uQ(u){let l=[],f=[],r=[],n=($,A)=>{for(let j of A)if(!$.includes(j))$.push(j)};for(let $ of u){let A=String($?.kind||""),j=[$?.commandPreview,$?.bodyPreview,$?.title].map((F)=>String(F||"")).join(` +`);if(A==="explored")n(l,RJ(j));else if(A==="edited")n(f,RJ(j));else if(A==="ran"){let F=String($?.commandPreview||$?.title||"").trim();if(F.length>0&&!r.includes(F))r.push(gt(F,90))}}let i=u.map(($)=>Date.parse(String($?.at||""))).filter(($)=>Number.isFinite($)),t=i.length>=2?Math.max(0,Math.max(...i)-Math.min(...i)):0,y=u.reduce(($,A)=>$+(gr(A?.durationMs)??gr(A?.elapsedMs)??0),0),c=t>0?t:y;return{readFiles:l,editedFiles:f,runCommands:r,durationLabel:oz(c)}}function _E(u,l=3){let f=Array.isArray(u)?u:[],r=[],n=[],i=Math.max(0,l),t=new Set;for(let c=f.length-1;c>=0&&i>0;c-=1){let $=f[c];if(!MJ($))continue;t.add($),i-=1}let y=()=>{if(n.length>=2){let c=gJ(n);r.push({seq:Number(n[0]?.seq??0),at:n[0]?.at||n.at(-1)?.at,kind:"toolGroup",title:sJ(n),status:`${n.length} calls`,items:n,counts:c,digest:uQ(n),rawSeqs:n.flatMap(($)=>Array.isArray($?.rawSeqs)?$.rawSeqs:[$?.seq]).filter(($)=>$!==void 0)})}else r.push(...n);n=[]};for(let c of f){if(MJ(c)&&!t.has(c)){n.push(c);continue}y(),r.push(c)}return y(),r}function lQ(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:gr(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 h1(u){let l=gr(u?.state?.time?.start)??gr(u?.time?.start),f=gr(u?.state?.time?.end)??gr(u?.time?.end);return gr(u?.durationMs)??gr(u?.elapsedMs)??gr(u?.timing?.durationMs)??gr(u?.metadata?.durationMs)??(l!==null&&f!==null&&f>=l?f-l:null)??void 0}function x1(u,l){return u?.createdAt||u?.updatedAt||u?.completedAt||l||void 0}function S4(u,l){return u?.id||u?.messageId||l}function $E(u,l=1200){if(typeof u==="string")return u;if(u===void 0||u===null)return"";try{return gt(JSON.stringify(u),l)}catch{return gt(String(u),l)}}function fQ(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 R$(u,l){if(!u||typeof u!=="object"||Array.isArray(u))return"";for(let f of l){let r=u[f];if(typeof r==="string"&&r.length>0)return r;if(r!==void 0&&r!==null&&typeof r!=="object")return String(r)}return""}function bJ(u,l){if(!u||typeof u!=="object"||Array.isArray(u))return null;for(let f of l){let r=Number(u[f]);if(Number.isFinite(r))return r}return null}function rQ(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:{},r=R$(f,["command","cmd","script"]);if(r.length>0)return r;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 n=String(u?.tool||u?.title||"tool"),i=R$(f,["filePath","filepath","path"])||R$(u,["filePath","filepath","path"]),t=R$(f,["pattern","query"]),y=bJ(f,["offset"]),c=bJ(f,["limit"]),$=[n];if(t.length>0)$.push(t);if(i.length>0)$.push(i);if(y!==null)$.push(`offset=${y}`);if(c!==null)$.push(`limit=${c}`);return $.length>1?$.join(" "):n}function AE(u,l){let f=u?.part&&typeof u.part==="object"&&!Array.isArray(u.part)?u.part:{},r=String(u?.type||u?.event||u?.name||f?.type||"").toLowerCase(),n=String(f?.type||"").toLowerCase(),i=u?.at||u?.timestamp||f?.updatedAt||f?.createdAt,t=Number.isFinite(Number(u?.seq))?Number(u.seq):l;if(r==="step_start"||r==="step-start"||n==="step-start")return null;if(r==="step_finish"||r==="step-finish"||n==="step-finish")return null;if(n==="tool"||/tool|bash|command/iu.test(`${r} ${n}`)){let c=f?.state&&typeof f.state==="object"&&!Array.isArray(f.state)?f.state:{},$=rQ(f,c),A=fQ(c,f,u),j=nQ($,String(f?.tool||f?.title||"")),F=j==="edited"?{status:String(c?.status||f?.status||u?.status||""),summary:gt(A||$,72),files:h$(A),stages:[],lines:h4(A),addedLines:0,removedLines:0,rawText:A}:void 0;return{seq:t,at:x1(f,i),kind:j,title:String(c?.title||f?.title||c?.metadata?.description||f?.tool||"OpenCode tool"),status:String(c?.status||f?.status||u?.status||""),commandPreview:$,bodyPreview:A,durationMs:h1(f),rawSeqs:[f?.id||f?.callID||u?.sessionID||t],editObservation:F}}let y=$E(f?.text??f?.content??f?.delta??u?.text??u?.content??u?.delta,3000).trim();if(y.length>0)return{seq:t,at:x1(f,i),kind:n==="reasoning"?"message":/error|failed/iu.test(`${r} ${n}`)?"error":"message",title:n==="reasoning"?"Reasoning":/error|failed/iu.test(`${r} ${n}`)?"OpenCode error":"Assistant message",status:`opencode/${r||n||"event"}`,bodyPreview:y,durationMs:h1(f),rawSeqs:[f?.id||u?.sessionID||t]};return null}function nQ(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 jE(u){let l=[],f=1;for(let r of Array.isArray(u)?u:[]){if(r?.kind&&r?.title){let y=String(r?.status||"");if(y==="opencode/step-start"||y==="opencode/step-finish")continue;l.push({...r,seq:Number.isFinite(Number(r?.seq))?Number(r.seq):f++});continue}let n=r?.createdAt||r?.updatedAt||r?.completedAt,i=String(r?.role||"assistant").toLowerCase(),t=Array.isArray(r?.parts)?r.parts:[];if(t.length===0){if(r?.part&&(r?.sessionID||String(r?.type||"").startsWith("step_")||String(r?.type||"").includes("tool"))){let y=AE(r,f);if(y!==null)l.push(y),f=Math.max(f+1,Number(y.seq)+1)}else if(r?.textPreview)l.push({seq:f++,at:n,kind:"message",title:`${i||"assistant"} message`,status:i,bodyPreview:String(r.textPreview),rawSeqs:[r?.messageId||f]});continue}for(let y of t){let c=String(y?.type||"").toLowerCase();if(c==="step-start"||c==="step-finish")continue;if(c==="text"||c==="reasoning"){let A=String(y?.textPreview||r?.textPreview||"").trim();if(A.length===0)continue;l.push({seq:f++,at:x1(y,n),kind:"message",title:c==="reasoning"?"Reasoning":i==="user"?"User message":i==="system"?"System message":"Assistant message",status:c==="reasoning"?"reasoning":i,bodyPreview:A,durationMs:h1(y),rawSeqs:[S4(y,f)]});continue}if(c==="tool"){let A=y?.state&&typeof y.state==="object"&&!Array.isArray(y.state)?y.state:{},j=rQ(y,A),F=fQ(A,y,{}),J=nQ(j,String(y?.tool||y?.title||"")),Q=J==="edited"?{status:String(A?.status||y?.status||""),summary:gt(F||j,72),files:h$(F),stages:[],lines:h4(F),addedLines:0,removedLines:0,rawText:F}:void 0;l.push({seq:f++,at:x1(y,n),kind:J,title:String(y?.title||y?.tool||"tool"),status:String(y?.status||""),commandPreview:j,bodyPreview:F,durationMs:h1(y),rawSeqs:[S4(y,f)],editObservation:Q});continue}let $=String(y?.textPreview||y?.title||c||"").trim();if($)l.push({seq:f++,at:x1(y,n),kind:"system",title:c||"part",bodyPreview:$,status:String(y?.status||""),durationMs:h1(y),rawSeqs:[S4(y,f)]})}}return l}var iQ={source:"opencode",toTrace:jE};function FE(u){return String(u||"unknown").toLowerCase().replace(/[^a-z0-9_-]+/gu,"-")||"unknown"}function vJ(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 UE(u){if(u==="item/fileChange/outputDelta")return"delta";return u.replace(/^item\//u,"")}function JE(u,l){if(u.kind==="file"){let n=String(u.status||"M");return Su("div",{key:`${l}-${u.text}`,className:`codex-edit-diff-line file ${vJ(n)}`},Su("span",{className:`codex-edit-file-status ${vJ(n)}`},n),Su("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":"",r=u.kind==="add"||u.kind==="del"?u.text.slice(1):u.text;return Su("div",{key:`${l}-${u.text}`,className:`codex-edit-diff-line ${u.kind}`},Su("span",{className:"codex-edit-diff-sign"},f),Su("code",null,r||" "))}function QE(u,l){let f=u.lines.length>0?u.lines:u.files.map((n)=>({text:`${n.status} ${n.path}`,kind:"file",path:n.path,status:n.status})),r=Number(u.addedLines||0)+Number(u.removedLines||0)>0;return Su("div",{className:"codex-edit-observation","data-testid":"codex-edit-observation"},Su("div",{className:"codex-edit-observation-head"},Su("span",{className:"codex-edit-window-controls","aria-hidden":"true"},Su("i",null),Su("i",null),Su("i",null)),Su("strong",null,r?"git diff":"git diff --stat"),Su("code",null,u.summary||"File changes")),u.stages.length>0?Su("div",{className:"codex-edit-stage-strip"},u.stages.map((n,i)=>Su("span",{key:`${n.method}-${i}`,className:`codex-edit-stage ${FE(n.status||n.method)}`},Su("b",null,UE(n.method)),n.status?Su("em",null,n.status):null))):null,f.length>0?Su("div",{className:"codex-edit-diff",role:"list"},f.map(JE)):null,l?Su("div",{className:"codex-edit-omitted"},`${l} (查看原始JSON获取完整记录)`):null)}function kJ(u,l,f){let r=Y4(f);return Su("div",{className:`codex-transcript-stream ${u}`,"data-testid":`codex-trace-${u}`},Su("span",{className:"codex-transcript-stream-label"},u),Su("pre",{className:"codex-transcript-body"},l,r?` +${r} (查看原始JSON获取完整记录)`:""))}function tQ(u,l=!1){let f=String(u.kind||"message"),r=["ran","explored","edited"].includes(f),n=Y4(u.commandOmittedLines),i=Y4(u.bodyOmittedLines),t=String(u.commandPreview||(r?u.title||"":"")),y=String(u.stdoutPreview||""),c=String(u.stderrPreview||""),$=y.length>0||c.length>0,A=Boolean(u.foldedReferencePrompt)&&String(u.fullPrompt||"").length>0,j=f==="edited"&&(u.editObservation!==void 0||dJ(u))?u.editObservation||eJ([u]):null;return Su("article",{key:`${u.seq}-${f}`,className:`codex-transcript-item ${f} ${l?"nested":""}`},Su("div",{className:"codex-transcript-main"},Su("div",{className:"codex-transcript-title"},Su("span",{className:"codex-output-channel"},X4(f)),r&&j===null?null:Su("strong",null,j!==null?"File changes":String(u.title||X4(f))),u.status?Su("code",null,String(j?.status||u.status)):null,Su("time",null,wu(u.at))),t&&j===null?Su("pre",{className:"codex-transcript-command"},t,n?` +${n}`:""):null,j!==null?QE(j,i):$?Su("div",{className:"codex-transcript-streams"},y.length>0?kJ("stdout",y,u.stdoutOmittedLines):null,c.length>0?kJ("stderr",c,u.stderrOmittedLines):null):u.bodyPreview?Su("pre",{className:"codex-transcript-body"},String(u.bodyPreview),i?` +${i} (查看原始JSON获取完整记录)`:""):null,A?Su("details",{className:"codex-initial-prompt-full","data-testid":"codex-initial-prompt-full"},Su("summary",null,Su("span",null,"引用注入已折叠,点击查看最终传入 Codex 的完整 prompt"),Su("code",null,`${u.fullPromptLines||dz(String(u.fullPrompt||""))} lines / ${u.fullPromptChars||String(u.fullPrompt||"").length} chars`)),Su("pre",{className:"codex-transcript-body codex-transcript-full-prompt","data-testid":"codex-initial-prompt-full-text"},String(u.fullPrompt||""))):null))}function NE(u){let l=Array.isArray(u.items)?u.items:[],f=u.digest&&typeof u.digest==="object"?u.digest:uQ(l);return Su("article",{key:`${u.seq}-toolGroup`,className:"codex-transcript-item toolGroup"},Su("div",{className:"codex-transcript-main"},Su("details",{className:"codex-tool-group","data-testid":"codex-tool-group"},Su("summary",null,Su("div",{className:"codex-tool-group-head"},Su("span",{className:"codex-output-channel"},X4("toolGroup")),Su("strong",null,String(u.title||sJ(l))),Su("code",null,String(u.status||`${l.length} calls`)),Su("time",null,wu(u.at)))),Su("div",{className:"codex-tool-group-digest"},Su("span",null,`read: ${p4(Array.isArray(f.readFiles)?f.readFiles:[])}`),Su("span",null,`edit: ${p4(Array.isArray(f.editedFiles)?f.editedFiles:[])}`),Su("span",null,`run: ${p4(Array.isArray(f.runCommands)?f.runCommands:[],2)}`),Su("span",null,`duration: ${f.durationLabel||"--"}`)),Su("div",{className:"codex-tool-group-items"},l.map((r)=>tQ(r,!0))))))}function qE(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"&&!qE(f))return[];if(String(f.kind||"")!=="toolGroup"||!Array.isArray(f.items))return[f];let r=yQ(f.items,l);return[{...f,items:r}]})}var wE=16;function IJ(u){return u.scrollHeight-u.scrollTop-u.clientHeight<=wE}function x$({items:u,input:l,port:f,autoScroll:r=!1,loading:n=!1,hasDetail:i=!0,emptyText:t="等待 Trace 输出...",loadingText:y="正在加载完整 Trace...",testId:c="trace-output",className:$="codex-transcript",keepRecentToolCalls:A=3,collapseTools:j=!0,showSystemEvents:F=!1}){let J=CJ(null),Q=CJ(!0),W=yQ(cE(f?az(f,l):lQ(u)),Boolean(F)),L=j?_E(W,A):W,U=ez(W);sz(()=>{let w=J.current;if(!r||!w)return;if(!Q.current&&!IJ(w))return;w.scrollTop=w.scrollHeight,Q.current=!0},[r,W.length,U]);let N={className:$,ref:J,onScroll:(w)=>{let G=w.currentTarget;Q.current=IJ(G)},"data-testid":c};if(n&&!i)return Su("div",N,Su("div",{className:"codex-output-empty"},y));return Su("div",N,L.length===0?Su("div",{className:"codex-output-empty"},t):L.map((w)=>String(w.kind||"")==="toolGroup"?NE(w):tQ(w)))}var cQ=Cu(Fl(),1),Hi=cQ.default.createElement;function b$(...u){return u.filter(Boolean).join(" ")}function _Q({title:u,children:l,actions:f,onClose:r,className:n,backdropClassName:i,bodyClassName:t,actionsClassName:y,titleId:c,testId:$,closeTestId:A,closeLabel:j="关闭",disableClose:F=!1,closeOnBackdrop:J=!0}){let Q={className:b$("raw-dialog","unidesk-dialog",n),role:"dialog","aria-modal":"true"};if(c)Q["aria-labelledby"]=c;else if(typeof u==="string")Q["aria-label"]=u;if($)Q["data-testid"]=$;return Hi("div",{className:b$("modal-backdrop","unidesk-dialog-backdrop",i),role:"presentation",onClick:(W)=>{if(J&&!F&&W.target===W.currentTarget)r()}},Hi("section",Q,Hi("div",{className:"raw-dialog-head unidesk-dialog-head"},Hi("strong",c?{id:c}:null,u),Hi("button",{type:"button",className:"ghost-btn",onClick:r,disabled:F,"data-testid":A},j)),Hi("div",{className:b$("unidesk-dialog-body",t)},l),f?Hi("div",{className:b$("unidesk-dialog-actions",y)},f):null))}var T=s1.default.createElement,{useEffect:V0,useMemo:$Q,useRef:Sl}=s1.default,gu=s1.default.useState,WE=120,OQ=12,ZQ=48,LE=1200;function x4(){return typeof document>"u"||document.visibilityState!=="hidden"}function tf(u,l="操作失败"){return Ou(u,l)}function ar(u){let l=Number(u);if(!Number.isFinite(l)||l<0)return"--";let f=Math.floor(l/1000),r=Math.floor(f/3600),n=Math.floor(f%3600/60),i=f%60;if(r>0)return`${r}h ${String(n).padStart(2,"0")}m`;if(n>0)return`${n}m ${String(i).padStart(2,"0")}s`;return`${i}s`}function Rn(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 HQ(u,l=Date.now()){let f=Rn(u);if(f===null)return"--";let r=Math.max(0,Math.floor((l-f)/1000));if(r<1)return"刚刚";let n=Math.floor(r/86400),i=Math.floor(r%86400/3600),t=Math.floor(r%3600/60),y=r%60;if(n>0)return`${n}天${i>0?`${i}小时`:""}前`;if(i>0)return`${i}小时${t>0?`${t}分钟`:""}前`;if(t>0)return`${t}分钟${y}秒前`;return`${y}秒前`}function BQ(...u){let l="",f=-1/0;for(let r of u){let n=String(r||"");if(n.length===0)continue;let i=Rn(r);if(i!==null&&i>=f)l=n,f=i;else if(l.length===0)l=n}return l}function TE(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 a4(u,l=180){let f=String(u||"").replace(/\s+/gu," ").trim();return f.length>l?`${f.slice(0,l-1)}…`:f}async function vl(u,l={}){return Eu(u,{strictJson:!0,retryInvalidJson:1,invalidJsonPrefix:"Code Queue 返回了无效 JSON",invalidJsonPreview:!0,responsePreviewLength:LE,...l})}function Di({status:u,children:l,title:f}){let r=String(u||"unknown").toLowerCase();return T("span",{className:`status-badge ${r}`,title:f},l||u||"unknown")}function st({title:u,eyebrow:l,summary:f,actions:r,children:n,className:i,loading:t}){return T("section",{className:`panel ${i||""}`},T("div",{className:"panel-head"},T("div",null,l?T("p",{className:"panel-eyebrow"},l):null,T(rl,{title:u,loading:t}),f?T("div",{className:"panel-summary"},f):null),r?T("div",{className:"panel-actions"},r):null),T("div",{className:"panel-body"},n))}function mQ({title:u,data:l,onOpen:f,testId:r}){return T("button",{type:"button",className:"ghost-btn","data-testid":r,onClick:()=>f(u,l)},"查看原始JSON")}function pi({title:u,text:l}){return T("div",{className:"empty-state"},T("strong",null,u),T("span",null,l))}function KE(u){return u?.runtime&&typeof u.runtime==="object"&&!Array.isArray(u.runtime)?u.runtime:{}}function GE(u){return u?.backend&&typeof u.backend==="object"&&!Array.isArray(u.backend)?u.backend:{}}function kl(u,l){return`${u}/microservices/code-queue/proxy${l}`}function zE(u){return`${u}/microservices/oa-event-flow/proxy/api/events/stream?tags=${encodeURIComponent("service:code-queue")}`}function n2(){return{headers:{"cache-control":"no-cache","x-unidesk-no-cache":"1"}}}function Ml(u){return Array.isArray(u?.tasks)?u.tasks:[]}function B0(u){return u?.pagination&&typeof u.pagination==="object"&&!Array.isArray(u.pagination)?u.pagination:{}}function AQ(u){let l=Date.parse(String(u?.updatedAt||u?.createdAt||""));return Number.isFinite(l)?l:0}function jQ(u){return Rn(u?.queueEnteredAt)??Rn(u?.createdAt)??Rn(u?.updatedAt)??0}function EE(u,l){let f=jQ(u)-jQ(l);if(f!==0)return f;let r=(Rn(u?.createdAt)??0)-(Rn(l?.createdAt)??0);if(r!==0)return r;return String(u?.id||"").localeCompare(String(l?.id||""))}function OE(u,l=""){let f=new Map;for(let r of u)for(let n of r){let i=String(n?.id||"");if(i.length>0&&!f.has(i))f.set(i,n)}return Array.from(f.values()).sort((r,n)=>{let i=TQ(r)-TQ(n);if(i!==0)return i;let t=String(r?.id||"")===l?0:1,y=String(n?.id||"")===l?0:1;if(t!==y)return t-y;return AQ(n)-AQ(r)})}function m0(u,l=""){let f=new Map;for(let r of u)for(let n of r){let i=String(n?.id||"");if(i.length===0)continue;f.set(i,{...f.get(i)||{},...n})}return OE([Array.from(f.values())],l)}function v1(u){return Array.isArray(u?.activeTaskIds)?u.activeTaskIds.map((l)=>String(l||"")).filter(Boolean):[String(u?.activeTaskId||"")].filter(Boolean)}var p0="__all__",ZE="(max-width: 760px)",HE="(min-width: 761px)";function gf(u){return!u||u===p0}function BE(){return typeof window<"u"&&window.matchMedia(ZE).matches}function mE(u){return gf(u)?"":`&queueId=${encodeURIComponent(u)}`}function o4(u){return String(u||"").trim().replace(/\s+/gu," ").slice(0,200)}function VE(u){let l=o4(u);return l.length===0?"":`&search=${encodeURIComponent(l)}`}function i2(u,l=""){return`${mE(u)}${VE(l)}`}function v$(u,l){return Number(u?.counts?.[l]||0)}function FQ(u,l=""){let f=new Map;for(let n of Array.isArray(u?.queues)?u.queues:[]){let i=String(n?.id||"").trim();if(i.length>0)f.set(i,{...n,name:String(n?.name||i).trim()||i})}for(let n of[String(u?.defaultQueueId||"default"),l].map((i)=>i.trim()).filter(Boolean))if(!f.has(n))f.set(n,{id:n,name:n,total:0,counts:{},activeTaskId:null,runnableTaskId:null,processing:!1});return Array.from(f.values()).sort((n,i)=>{let t=String(n?.id||"")===String(u?.defaultQueueId||"default")?0:1,y=String(i?.id||"")===String(u?.defaultQueueId||"default")?0:1;if(t!==y)return t-y;return String(n?.id||"").localeCompare(String(i?.id||""))})}function VQ(u){let l=String(u?.id||"default"),f=String(u?.name||"").trim();return f.length>0?f:l}function d4(u){let l=String(u?.id||"default"),f=VQ(u);return f===l?l:`${f} (${l})`}function k1(u){let l=v$(u,"running")+v$(u,"judging"),f=v$(u,"queued")+v$(u,"retry_wait"),r=Number(u?.total||0),n=[d4(u),`${r} tasks`];if(l>0)n.push(`${l} running`);if(f>0)n.push(`${f} queued`);return n.join(" · ")}function ot(u,l){if(gf(l))return null;return u.find((f)=>String(f?.id||"")===l)||null}function UQ(u,l,f,r){if(gf(f)){let i=v1(u);return String(u?.activeTaskId||i[0]||r.find((t)=>WQ(t))?.id||"")}let n=ot(l,f);return String(n?.activeTaskId||r.find((i)=>WQ(i))?.id||"")}function DE(u,l,f){if(!gf(l)){let r=ot(u,l);return String(r?.runnableTaskId||f.find((n)=>String(n?.status||"")==="queued"||String(n?.status||"")==="retry_wait")?.id||"")}return String(f.find((r)=>String(r?.status||"")==="queued"||String(r?.status||"")==="retry_wait")?.id||"")}async function JQ(u,l=p0,f=""){return vl(kl(u,`/api/tasks/overview?limit=${OQ}&transcriptLimit=1&compact=1&selected=0&includeActive=0&stats=0&skipTrace=1${i2(l,f)}`),n2())}async function b4(u,l,f=0,r=p0,n="",i=!1,t={}){let y=t.selected===!1?"&selected=0":"",c=t.includeActive===!1?"&includeActive=0":"",$=t.stats===!1?"&stats=0":"",A=Number.isInteger(t.limit)&&t.limit>0?Math.min(500,t.limit):OQ;return vl(kl(u,`/api/tasks/overview?limit=${encodeURIComponent(String(A))}&transcriptLimit=3&compact=1&afterSeq=${encodeURIComponent(String(Math.max(0,f)))}&preferId=${encodeURIComponent(l)}${y}${c}${$}${i?"&skipTrace=1":""}${i2(r,n)}`),n2())}async function QQ(u,l,f,r=ZQ,n=""){return vl(kl(u,`/api/tasks/overview?limit=${encodeURIComponent(String(r))}&transcriptLimit=1&compact=1&selected=0&includeActive=0&stats=0&beforeId=${encodeURIComponent(f)}${i2(l,n)}`),n2())}async function pE(u,l){return vl(kl(u,`/api/tasks/${encodeURIComponent(l)}/trace-summary`))}async function SE(u,l,f,r=null){let n=r===null||r===void 0||String(r).length===0?"":`&attempt=${encodeURIComponent(String(r))}`;return vl(kl(u,`/api/tasks/${encodeURIComponent(l)}/prompt?part=${encodeURIComponent(f)}${n}`))}async function XE(u,l,f=0,r=500,n=null){let i=n===null||n===void 0||String(n).length===0?"":`&attempt=${encodeURIComponent(String(n))}`;return vl(kl(u,`/api/tasks/${encodeURIComponent(l)}/trace-steps?afterSeq=${encodeURIComponent(String(f))}&limit=${encodeURIComponent(String(r))}${i}`))}async function YE(u,l,f){return vl(kl(u,`/api/tasks/${encodeURIComponent(l)}/trace-step?seq=${encodeURIComponent(String(f))}`))}async function PE(u,l){return vl(kl(u,`/api/tasks/${encodeURIComponent(l)}/read`),{method:"POST",body:{}})}async function CE(u){return vl(kl(u,"/api/tasks/read-all"),{method:"POST",body:{}})}function ME(u){return Array.isArray(u?.output)?u.output:[]}function RE(u){return Array.isArray(u?.attempts)?u.attempts:[]}function v4(u){return u?.counts&&typeof u.counts==="object"&&!Array.isArray(u.counts)?u.counts:{}}function hE(u){return u.split(/^\s*---+\s*$/gmu).map((l)=>l.trim()).filter(Boolean)}function NQ(u){let l=Number(u);return Number.isFinite(l)?Math.max(1,Math.min(50,Math.floor(l))):1}function Bi(u){let l=[];for(let f of u.split(/[\s,,;;]+/u)){let r=f.trim();if(/^codex_\d+_[A-Za-z0-9_-]+$/u.test(r)&&!l.includes(r))l.push(r)}return l}function xE(u,l){let f=Bi(l);if(f.length===0)return u;return[`引用 Code Queue 任务 ${f.join(" ")}。后端会在入队时只注入这些任务的 initial prompt 和 final response 全文;中间执行过程不注入,如需补充核查可运行:${f.map((r)=>`bun scripts/cli.ts codex task ${r}`).join(";")}`,"","本次任务:",u].join(` +`)}function bE(u){let r=u.trimStart();if(!r.startsWith("# Code Queue 已解析引用上下文"))return{hasInjection:!1,reference:"",userPrompt:u};let n=u.length-r.length,i=u.lastIndexOf(` # 本次任务 -`);if(i0?u.split(/\r\n|\r|\n/u).length:0}function qQ(u){let l=String(u?.displayPrompt||"");if(l.length>0)return l;let f=String(u?.prompt||"");return BE(HE(f).userPrompt)}function jr(u){return u?._traceSummary&&typeof u._traceSummary==="object"&&!Array.isArray(u._traceSummary)?u._traceSummary:null}function I3(u){return u?._promptDetails&&typeof u._promptDetails==="object"&&!Array.isArray(u._promptDetails)?u._promptDetails:{}}function aA(u){let l=jr(u)?.prompt;return l&&typeof l==="object"&&!Array.isArray(l)?l:{}}function WQ(u){let l=jr(u)?.execution;return l&&typeof l==="object"&&!Array.isArray(l)?l:{}}function nQ(u){let l=Number(u);return Number.isFinite(l)&&l>=0?Math.floor(l):0}function S0(u){let l=Number(u);return Number.isFinite(l)&&l>=0?Math.floor(l):null}function wQ(u){let l=Wl(u?.traceStats);if(l&&(u?.statsSource==="oa-event-flow"||l.source==="oa-event-flow"))return l;let f=jr(u),r=Wl(f?.traceStats);if(r&&(f?.statsSource==="oa-event-flow"||r.source==="oa-event-flow"))return r;return null}function VE(u,l){let f=Wl(l?.traceStats)||Wl(l?.execution?.traceStats),r=String(l?.statsSource||l?.execution?.statsSource||"");if(f&&(r==="oa-event-flow"||f.source==="oa-event-flow"))return f;return null}function DE(u,l){return S0(wQ(u)?.[l])}function LQ(u){let l=DE(u,"stepCount");if(l!==null)return l;let f=jr(u);if(f!==null)return XE(f);return null}function XE(u){let l=Wl(u?.traceStats);if(!l||u?.statsSource!=="oa-event-flow"&&l.source!=="oa-event-flow")return null;return S0(l.stepCount)}function x3(u){if(!u||u?._traceSummaryLoaded!==!0)return!1;let l=jr(u),f=String(u?._traceSummaryUpdatedAt||l?.updatedAt||""),r=String(u?.updatedAt||"");if(r.length>0){let n=Y0(f),i=Y0(r);if(n!==null&&i!==null){if(n+10?f:qQ(u)}function KQ(u){let l=jr(u);return String(l?.finalResponse||u?.finalResponse||"").trimEnd()}function GQ(u){let f=jr(u)?.lastJudge||u?.lastJudge;return f&&typeof f==="object"&&!Array.isArray(f)?f:null}function Wl(u){return u&&typeof u==="object"&&!Array.isArray(u)?u:null}function SE(u){let l=Wl(u?.raw),f=Wl(u?.failureDetails)||Wl(l?.minimaxFailure);if(f===null)return"";let r=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",r],["errorName",f.errorName],["error",f.errorMessage],["responseContentPreview",f.responseContentPreview],["responseTextPreview",f.responseTextPreview]].filter(([,i])=>i!==void 0&&i!==null&&String(i).length>0).map(([i,y])=>`${i}: ${String(y)}`).join(` -`)}function zQ({judge:u,testId:l="codex-judge-failure-details"}){let f=SE(u);if(f.length===0)return null;return K("details",{className:"codex-judge-failure-details","data-testid":l},K("summary",null,"MiniMax failure details"),K("pre",null,f))}function YE(u){let l=jr(u)?.attempts;if(Array.isArray(l)&&l.length>0)return l;let f=WQ(u),r=KQ(u),n=GQ(u);if(Object.keys(f).length===0&&r.length===0&&n===null)return[];return[{index:Number(u?.currentAttempt||1),mode:u?.currentMode||"initial",startedAt:u?.startedAt,finishedAt:u?.finishedAt,terminalStatus:u?.status,execution:f,finalResponse:r,finalResponseChars:r.length,judge:n}]}function pE(u,l){return Wl(l?.execution)||WQ(u)}function mE(u,l,f,r){let n=jr(u),i=Number(n?.currentAttempt||u?.currentAttempt||0),y=Number(f),t=Number.isFinite(y)&&y>0&&y===i,_=JQ(u?.updatedAt,n?.updatedAt);if(t&&!l?.finishedAt&&_.length>0)return _;return String(l?.updatedAt||l?.finishedAt||r.effectiveEndAt||(t?_:"")||_||u?.finishedAt||u?.startedAt||"")}function PE(u,l){let f=String(l?.finalResponse||l?.finalResponsePreview||"");if(Object.prototype.hasOwnProperty.call(l||{},"finalResponse")||Object.prototype.hasOwnProperty.call(l||{},"finalResponsePreview"))return f.trimEnd();return f.length>0?f.trimEnd():KQ(u)}function TQ(u,l){if(Object.prototype.hasOwnProperty.call(l||{},"judge"))return Wl(l?.judge);return GQ(u)}function CE(u,l,f){if(!lZ(u))return!1;if(oA(l,f))return!1;if(l?.finishedAt)return!1;if(["succeeded","failed","canceled"].includes(String(l?.terminalStatus||"")))return!1;let r=jr(u),n=Number(r?.currentAttempt||u?.currentAttempt||0),i=Number(f);if(Number.isFinite(i)&&i>0&&Number.isFinite(n)&&n>0)return i===n;return!0}function EQ(u){return`feedback:${String(u||"latest")}`}function ME(u,l,f){let r=String(l?.feedbackPrompt||"").trimEnd(),n=String(l?.feedbackPromptPreview||r||"").trimEnd(),i=Number(l?.feedbackPromptChars||r.length||n.length||0),y=Number(l?.feedbackPromptLines||Gi(r||n));if(r.length>0||n.length>0||i>0)return{text:r,preview:n,chars:i,lines:y,source:l?.feedbackPromptSource||"judge-feedback",forAttempt:l?.feedbackPromptForAttempt||Number(f||0)+1,truncated:Boolean(l?.feedbackPromptTruncated)};let t=TQ(u,l),_=String(t?.continuePrompt||"").trimEnd();if(t?.decision==="retry"&&_.length>0)return{text:"",preview:_,chars:_.length,lines:Gi(_),source:"judge-continue-prompt",forAttempt:Number(f||0)+1,truncated:!1};return null}function RE(u){let l=aA(u);return Boolean(l.hasReferenceInjection||Number(l.referencePromptChars||0)>0||u?.referenceInjection||u?.referenceInjectionSummary)}function ZQ(u,l=null){if(l!==null&&l!==void 0){let r=(Wl(u?._traceStepsByAttempt)||{})[String(l)];return Array.isArray(r)?r:[]}return Array.isArray(u?._traceSteps)?u._traceSteps:[]}function hA(u){let f=[u?.seq,...Array.isArray(u?.rawSeqs)?u.rawSeqs:[]].map((r)=>Number(r)).filter((r)=>Number.isFinite(r));return f.length>0?Math.max(...f):0}function xE(u){return(Array.isArray(u)?u:[]).reduce((l,f)=>Math.max(l,hA(f)),0)}function hE(u,l){let f=new Map;for(let r of[...Array.isArray(u)?u:[],...Array.isArray(l)?l:[]]){let n=String(r?.seq??`${r?.title||"step"}:${r?.at||""}`);f.set(n,{...f.get(n)||{},...r})}return Array.from(f.values()).sort((r,n)=>hA(r)-hA(n))}function b1(u){return(Array.isArray(u?.summaryLines)?u.summaryLines:[]).map((l)=>String(l||""))}function bE(u){let l=String(u?.kind||"").trim().toLowerCase(),f=String(u?.status||"").trim().toLowerCase();return l==="error"||f==="error"}function g3(u){let l=String(u?.status||"").trim();if(l.length>0)return l;let f=b1(u).join(` -`);return/^(item\/[A-Za-z]+(?:\/[A-Za-z]+)?):/u.exec(f)?.[1]||""}function iQ(u){return/^item\/(?:started|completed): file changes status=/u.test(String(u||"").trim())}function vE(u){let l=b1(u);for(let r=l.length-1;r>=0;r-=1){let n=/file changes status=([A-Za-z0-9_-]+)/u.exec(l[r]||"")?.[1];if(n)return n}let f=g3(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 kE(u){if(String(u?.kind||"")!=="edited")return!1;let l=String(u?.title||""),f=String(u?.status||""),r=b1(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(r))return!0;if(/^Success\. Updated the following files:/mu.test(r))return!0;if(/^diff --git /mu.test(r))return!0;return/^([AMDRCU?]{1,2})\s+\S+/mu.test(r)}function IE(u){if(u.length<=1)return u[0];let l=u.find((i)=>g3(i)==="item/fileChange/outputDelta")||u.find((i)=>b1(i).some((y)=>!iQ(y)))||u.at(-1)||u[0],f=u.flatMap((i)=>Array.isArray(i?.rawSeqs)?i.rawSeqs:[i?.seq]).filter((i)=>i!==void 0),r=u.flatMap(b1).filter((i)=>i.trim().length>0&&!iQ(i)),n=u[u.length-1]||l;return{...l,at:l?.at||n?.at,title:String(l?.title||"Edited files"),status:vE(n),summaryLines:r.length>0?r:b1(l),rawSeqs:f}}function gE(u){let l=Array.isArray(u)?u:[],f=[],r=[],n=()=>{if(r.length>0)f.push(IE(r));r=[]};for(let i of l){if(kE(i)){if(g3(i)==="item/started"&&r.length>0)n();if(r.push(i),g3(i)==="item/completed")n();continue}n(),f.push(i)}return n(),f}function sE(u){return{...u}}function bA(u,l=null){if(l!==null&&l!==void 0){let f=Wl(u?._traceStepsLoadedByAttempt)||{};return Boolean(f[String(l)])}return Boolean(u?._traceStepsLoaded)}function vA(u){return u?._traceStepDetails&&typeof u._traceStepDetails==="object"&&!Array.isArray(u._traceStepDetails)?u._traceStepDetails:{}}function aE(u,l){let f=Number(u?.index);return Number.isFinite(f)?f:l+1}function oA(u,l){return Boolean(u?.synthetic)||Number(l)<=0}function s3(u){let l=Number(u);return Number.isFinite(l)?String(l):void 0}function oE(u){let l=u?.timing&&typeof u.timing==="object"?u.timing:{},f=String(u?.status||"");if(["queued"].includes(f))return`等待 ${br(l.queueWaitMs??l.totalElapsedMs)}`;if(["running","judging","retry_wait"].includes(f))return`耗时 ${br(l.durationMs??l.totalElapsedMs)}`;return`耗时 ${br(l.durationMs??l.totalElapsedMs)}`}function Rt(u){return String(u?.queueId||"default")}function OQ(u){return Wl(u?.queuedReason)}function HQ(u){let l=String(u?.queuedReasonLabel||"").trim();if(l.length>0)return l.toUpperCase();let f=OQ(u),r=String(f?.label||"").trim();return r.length>0?r.toUpperCase():""}function dE(u){let l=String(u?.status||"unknown");if(l!=="queued")return l;let f=HQ(u);return f.length>0?`QUEUED(${f})`:"QUEUED"}function eE(u){if(String(u?.status||"")!=="queued")return;let l=OQ(u),f=String(l?.message||"").trim(),r=HQ(u);if(f.length>0&&r.length>0)return`${r}: ${f}`;if(f.length>0)return f;return r.length>0?r:void 0}function uZ(u){return{system:"SYS",user:"YOU",assistant:"GPT",reasoning:"THINK",command:"CMD",diff:"DIFF",tool:"TOOL",error:"ERR"}[u]||u.toUpperCase()}function yQ(u){return["running","judging","retry_wait"].includes(String(u?.status||""))}function lZ(u){return String(u?.status||"")==="running"}function hr(u){return["succeeded","failed","canceled"].includes(String(u?.status||""))}function BQ(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 X0(u){if(!hr(u))return!1;if(u?.terminalUnread===!0)return!0;if(u?.terminalUnread===!1)return!1;return!u?.readAt}function Ml(u){let l=Number(u||0);return Number.isFinite(l)?l:0}function fZ(u){return Ml(u.queued)+Ml(u.retry_wait)}function rZ(u){return Ml(u.running)+Ml(u.judging)}function nZ(u,l){return Wl(u?.statistics)||Wl(l?.statistics)||{}}function iZ(u){return Array.isArray(u?.daily)?u.daily:[]}function yZ(u){return Wl(u?.totals)||{}}function dA(u,l){let f=Number(u?.[l]??0);return Number.isFinite(f)&&f>0?f:0}function pA(u,l){return u.reduce((f,r)=>Math.max(f,dA(r,l)),0)}var Ki=700,tQ=220,En=30,x1=24,xt=184,kA=xt-x1;function VQ(u,l){if(l<=1)return Ki/2;return En+u*(Ki-En*2)/(l-1)}function DQ(u,l){let f=l>0?l:1;return xt-Math.min(1,u/f)*kA}function mA(u,l,f){let r=u.length>0?u:[{[l]:0}],n=r.length>1?r:[r[0],r[0]];return n.map((i,y)=>`${VQ(y,n.length).toFixed(2)},${DQ(dA(i,l),f).toFixed(2)}`).join(" ")}function D0(u){let l=String(u||"");return/^\d{4}-\d{2}-\d{2}$/u.test(l)?l.slice(5):l||"--"}function h3(u){if(!u)return"";return`${String(u.seriesKey||"")}:${String(u.row?.date||u.index||"")}`}function tZ(u,l,f,r){let n=dA(u,r.key);return{...r,row:u,index:l,value:n,valueLabel:r.format(n),x:VQ(l,f),y:DQ(n,r.max),seriesKey:r.key}}function _Q(u){if(X0(u))return 0;return{running:1,judging:2,retry_wait:3,queued:4,succeeded:8,failed:8,canceled:8}[String(u?.status||"")]??9}function Pt(u){if(!u)return!1;if(u?._traceSummaryLoaded===!0)return!1;return u?.summaryOnly===!0||u?._metaLoaded!==!0}function _Z(u){return Boolean(u?._metaLoaded)||u?.summaryOnly===!1}function $Z(u,l,f){let r=String(u?.[f]||""),n=String(l?.[f]||"");return r.length>n.length?r:n}function IA(u,l,f){let r=Array.isArray(u?.[f])?u[f]:[],n=Array.isArray(l?.[f])?l[f]:[];if(n.length===0&&r.length>0)return r;return r.length>n.length?r:n}function $Q(u,l){let f=l?.summaryOnly===!0&&_Z(u),r={...u,...l};if(!f)return r;for(let n of["prompt","basePrompt","displayPrompt","finalResponse"])r[n]=$Z(u,l,n);for(let n of["promptHistory","attempts","output","events"])r[n]=IA(u,l,n);if(u?.referenceInjection?.items&&!l?.referenceInjection?.items)r.referenceInjection=u.referenceInjection;if(u?.referenceInjectionSummary&&!l?.referenceInjectionSummary)r.referenceInjectionSummary=u.referenceInjectionSummary;r.summaryOnly=u?.summaryOnly===!1?!1:l.summaryOnly,r._metaLoaded=u?._metaLoaded,r._detailLoaded=u?._detailLoaded,r._transcriptComplete=u?._transcriptComplete,r._transcriptPreview=Object.prototype.hasOwnProperty.call(l,"_transcriptPreview")?l._transcriptPreview:u?._transcriptPreview;for(let n of["_traceSummary","_traceSummaryLoaded","_traceSteps","_traceStepsLoaded","_traceStepsByAttempt","_traceStepsLoadedByAttempt","_traceStepsNextAfterSeqByAttempt","_traceStepDetails","_promptDetails"])if(!Object.prototype.hasOwnProperty.call(l,n)&&Object.prototype.hasOwnProperty.call(u||{},n))r[n]=u[n];return r}function cZ(u){let l=u?.selected,f=l?.task&&typeof l.task==="object"?l.task:null;if(f!==null){let n=Boolean(l?.preview);return{...f,transcript:Array.isArray(l?.transcript)?l.transcript:[],_detailLoaded:Array.isArray(l?.transcript)&&l.transcript.length>0,_transcriptComplete:Boolean(!n&&!l?.hasMore&&hr(f)),_transcriptPreview:n,_summaryLoaded:!0}}let r=jf(u)[0];return r?{...r,_summaryLoaded:!0}:null}function PA(u,l){let f=new Map;for(let r of[...Array.isArray(u)?u:[],...Array.isArray(l)?l:[]]){let n=`${Number(r?.seq??0)}:${String(r?.kind||"message")}`,i=f.get(n);if(!i){f.set(n,r);continue}let y={...i,...r};for(let[t,_]of[["bodyPreview","bodyOmittedLines"],["commandPreview","commandOmittedLines"]]){let c=String(i?.[t]||""),A=String(r?.[t]||"");if(c.length>A.length)y[t]=i[t],y[_]=i[_]}f.set(n,y)}return Array.from(f.values()).sort((r,n)=>Number(r?.seq??0)-Number(n?.seq??0))}function b3(u){return(Array.isArray(u)?u:[]).reduce((l,f)=>Math.max(l,Number(f?.seq??0)),0)}function cQ(u,l=8){let f=Array.from(new Set((Array.isArray(u)?u:[]).map((n)=>Number(n?.seq??0)).filter((n)=>Number.isFinite(n)&&n>0))).sort((n,i)=>n-i);if(f.length===0)return 0;let r=f[Math.max(0,f.length-l)]??0;return Math.max(0,r-0.001)}function AZ(u,l){let f=Array.isArray(u?.codeModels)?u.codeModels:Array.isArray(u?.codexModels)?u.codexModels:[],r=["gpt-5.5","gpt-5.4-mini","gpt-5.4","minimax-m2.7"];return Array.from(new Set([...f,...r,l].map((n)=>String(n||"").trim()).filter(Boolean)))}function jZ(u,l){let r=(Array.isArray(u?.executionProviders)?u.executionProviders:[]).map((y)=>({id:String(y?.id||"").trim(),label:String(y?.label||y?.id||"").trim(),defaultWorkdir:String(y?.defaultWorkdir||"").trim(),supportsWindowsNativeCodex:y?.supportsWindowsNativeCodex===!0,windowsNativeDefaultWorkdir:String(y?.windowsNativeDefaultWorkdir||"").trim(),kind:String(y?.kind||"").trim()})).filter((y)=>y.id.length>0),n=String(u?.mainProviderId||u?.defaultProviderId||"D601").trim()||"D601",i=new Map;for(let y of[...r,{id:n,label:`${n} (local)`,defaultWorkdir:String(u?.defaultWorkdir||"/workspace"),supportsWindowsNativeCodex:!1,windowsNativeDefaultWorkdir:"",kind:"local"},l?{id:l,label:l,defaultWorkdir:eA(u,l),supportsWindowsNativeCodex:l!==n,windowsNativeDefaultWorkdir:String(u?.windowsNativeCodexDefaultWorkdir||"/mnt/f/Work/ConStart"),kind:""}:null].filter(Boolean))if(!i.has(y.id))i.set(y.id,y);return Array.from(i.values())}function FZ(u,l){let r=(Array.isArray(u?.executionModes)?u.executionModes:[]).map((y)=>({id:String(y?.id||y?.kind||"").trim(),label:String(y?.label||y?.id||y?.kind||"").trim(),description:String(y?.description||"").trim(),defaultWorkdir:String(y?.defaultWorkdir||"").trim(),requiresProvider:y?.requiresProvider===!0,requiresWindowsCwd:y?.requiresWindowsCwd===!0})).filter((y)=>y.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(u?.windowsNativeCodexDefaultWorkdir||"/mnt/f/Work/ConStart"),requiresProvider:!0,requiresWindowsCwd:!0}],i=new Map;for(let y of[...r,...n,l?{id:l,label:l,description:"",defaultWorkdir:"",requiresProvider:l==="windows-native",requiresWindowsCwd:l==="windows-native"}:null].filter(Boolean))if(!i.has(y.id))i.set(y.id,y);return Array.from(i.values())}function v3(u,l,f){if(l!=="windows-native")return eA(u,f);let r=Array.isArray(u?.executionModes)?u.executionModes.find((i)=>String(i?.id||i?.kind||"")==="windows-native"):null,n=Array.isArray(u?.executionProviders)?u.executionProviders.find((i)=>String(i?.id||"")===f):null;return String(n?.windowsNativeDefaultWorkdir||r?.defaultWorkdir||u?.windowsNativeCodexDefaultWorkdir||"/mnt/f/Work/ConStart")}function eA(u,l){let f=String(l||"").trim(),r=u?.defaultWorkdirByProvider&&typeof u.defaultWorkdirByProvider==="object"?u.defaultWorkdirByProvider:{};if(typeof r[f]==="string"&&String(r[f]).trim().length>0)return String(r[f]).trim();let n=Array.isArray(u?.executionProviders)?u.executionProviders.find((y)=>String(y?.id||"")===f):null;if(typeof n?.defaultWorkdir==="string"&&n.defaultWorkdir.trim().length>0)return n.defaultWorkdir.trim();let i=String(u?.mainProviderId||u?.defaultProviderId||"D601");return f===i?String(u?.defaultWorkdir||"/workspace"):String(u?.remoteDefaultWorkdir||"/home/ubuntu")}function UZ(u){return LQ(u)}function JZ({task:u,selected:l,onSelect:f,onCopy:r,onReference:n,onMarkRead:i,copied:y,markingRead:t}){let _=u?.lastJudge||{},c=String(u?.id||""),A=X0(u),j=JQ(u?.updatedAt,jr(u)?.updatedAt),F=`最近更新: ${UQ(j)}`,J=UZ(u),Q=J===null?"--":String(J),w=J===null?"STEP 统计中心同步中":"STEP 来自 OA Event Flow 统计中心";return K("article",{role:"button",tabIndex:0,className:`codex-task-card ${l?"selected":""} ${A?"unread-terminal":""}`,onClick:f,onKeyDown:(L)=>{if(L.key==="Enter"||L.key===" ")L.preventDefault(),f()},"data-unread-terminal":A?"true":"false","data-testid":`codex-task-${u?.id||"unknown"}`},A?K("span",{className:"codex-unread-badge",title:"待读","aria-label":"待读","data-testid":`codex-unread-task-${c||"unknown"}`}):null,K("div",{className:"codex-task-card-head"},K("div",{className:"codex-task-status-line"},K(zi,{status:u?.status,title:eE(u)},dE(u))),K("span",{className:"mono-text"},`${u?.currentAttempt||0}/${u?.maxAttempts||0}`)),K("div",{className:"codex-task-id-row"},K("code",{title:c},c||"unknown"),K("div",{className:"codex-task-id-actions"},K("button",{type:"button",className:"codex-copy-id-btn",onClick:(L)=>{L.stopPropagation(),n(c)},"data-testid":`codex-reference-task-${c||"unknown"}`},"引用"),K("button",{type:"button",className:"codex-copy-id-btn",onClick:(L)=>{L.stopPropagation(),r(c)},"data-testid":`codex-copy-task-id-${c||"unknown"}`},y?"已复制":"复制ID"),A?K("button",{type:"button",className:"codex-copy-id-btn codex-mark-read-btn",disabled:Boolean(t),onClick:(L)=>{L.stopPropagation(),i(c)},"data-testid":`codex-mark-task-read-${c||"unknown"}`},t?"标记中":"标为已读"):null)),K("strong",null,MA(qQ(u),120)||"空任务"),K("div",{className:"codex-task-meta"},K("span",null,`queue=${Rt(u)}`),K("span",null,`provider=${u?.providerId||"D601"}`),K("span",null,`mode=${u?.executionMode||"default"}`),K("span",null,u?.model||"--"),K("span",null,oE(u))),K("div",{className:"codex-task-meta codex-task-update-meta"},K("span",{className:"codex-task-recent-update codex-task-step-count",title:w,"data-testid":`codex-task-step-count-${c||"unknown"}`},`STEP ${Q}`),K("span",{className:"codex-task-recent-update",title:j?`更新时间: ${qu(j)}`:F,"data-testid":`codex-task-recent-update-${c||"unknown"}`},F),K("span",null,qu(j||u?.updatedAt))),BQ(u)?K("div",{className:"codex-judge-line","data-testid":`codex-task-prompt-editable-${c||"unknown"}`},"queued prompt 可编辑"):null,_?.decision?K("div",{className:"codex-judge-line"},`judge=${_.decision} ${Math.round(Number(_.confidence||0)*100)}%`):null)}function CA({title:u,tasks:l,selectedId:f,onSelect:r,onCopy:n,onReference:i,onMarkRead:y,copiedTaskId:t,markingReadTaskId:_,emptyText:c}){let A=Array.isArray(l)?l:[];return K("section",{className:"codex-task-section"},K("div",{className:"codex-task-section-head"},K("span",null,u),K("code",null,String(A.length))),A.length===0?K("p",{className:"codex-task-section-empty"},c):K("div",{className:"codex-task-section-list"},A.map((j)=>K(JZ,{key:j.id,task:j,selected:f===j.id,onSelect:()=>r(j.id),onCopy:n,onReference:i,onMarkRead:y,copied:t===j.id,markingRead:_===j.id}))))}function QZ(){return K("span",{className:"codex-stats-icon","aria-hidden":"true"},K("svg",{viewBox:"0 0 36 24",focusable:"false"},K("path",{className:"grid",d:"M3 20.5H33M3 12.5H33M3 4.5H33"}),K("polyline",{className:"line tasks",points:"3,18 9,14 15,15 21,8 27,10 33,4"}),K("polyline",{className:"line retry",points:"3,20 9,17 15,18 21,13 27,14 33,9"})))}function NZ({stats:u,queueName:l,onRaw:f}){let r=iZ(u),n=yZ(u),i=r.at(-1)||{},y=pA(r,"executedTasks"),t=pA(r,"retryAttempts"),_=pA(r,"avgDurationMs"),c=r.length>0,A=Wl(u?.range)||{},[j,F]=ku(null),[J,Q]=ku(null),w=[];if(y>0)w.push(`tasks ${y}`);if(t>0)w.push(`retry ${t}`);if(_>0)w.push(`avg ${br(_)}`);let L=[{key:"executedTasks",className:"tasks",label:"执行任务",max:y,format:(E)=>`${Ml(E)} tasks`},{key:"retryAttempts",className:"retry",label:"重试次数",max:t,format:(E)=>`${Ml(E)} retries`},{key:"avgDurationMs",className:"duration",label:"平均耗时",max:_,format:(E)=>br(E)}],U=j||J,N=h3(U),q=String(U?.row?.date||""),W=U?{left:`${Math.max(8,Math.min(92,Number(U.x)/Ki*100))}%`,top:`${Math.max(14,Math.min(86,Number(U.y)/tQ*100))}%`}:void 0;Tn(()=>{F(null),Q(null)},[l,A.startDate,A.endDate,r.length]);let z=(E)=>{F(E)},Z=(E)=>{let D=h3(E);Q((h)=>h3(h)===D?null:E),F(E)},H=L.flatMap((E)=>r.map((D,h)=>{let V=tZ(D,h,r.length,E),S=h3(V),p=N===S,O=String(D?.date||`day-${h}`),m=`${D0(O)} ${E.label}: ${V.valueLabel}`;return K("g",{key:`${E.key}-${O}`,className:`stat-point-group ${E.className} ${p?"active":""}`,role:"button",tabIndex:0,"aria-label":m,"data-testid":`codex-stats-point-${E.className}-${O}`,onMouseEnter:()=>z(V),onFocus:()=>z(V),onClick:()=>Z(V),onKeyDown:(X)=>{if(X.key==="Enter"||X.key===" ")X.preventDefault(),Z(V)}},K("circle",{className:"stat-hit-point",cx:V.x,cy:V.y,r:13}),K("circle",{className:`stat-point ${E.className} ${p?"active":""}`,cx:V.x,cy:V.y,r:p?5.6:4.2}))}));return K(R1,{title:"统计曲线",eyebrow:`Daily task stats / ${l}`,className:"codex-stats-panel",summary:K("span",null,`${D0(A.startDate)} -> ${D0(A.endDate)} · ${u?.timezone||"Asia/Shanghai"}`),actions:Wl(u)?K(QQ,{title:"Code Queue Stats",data:u,onOpen:f,testId:"raw-codex-stats"}):null},K("div",{className:"codex-stats-hero","data-testid":"codex-stats-panel"},K(QZ),K("div",null,K("strong",null,`${Ml(n.executedTasks)} tasks / ${Ml(n.retryAttempts)} retries`),K("span",null,`平均完成耗时 ${br(n.avgDurationMs??void 0)} · 终态 ${Ml(n.completedTasks)} 个`))),c?K("div",{className:"codex-stats-chart","data-testid":"codex-stats-chart",onMouseLeave:()=>F(null)},K("svg",{viewBox:`0 0 ${Ki} ${tQ}`,preserveAspectRatio:"none",role:"img","aria-label":"Code Queue daily task statistics"},K("line",{className:"axis",x1:En,x2:Ki-En,y1:xt,y2:xt}),K("line",{className:"grid",x1:En,x2:Ki-En,y1:x1+kA/2,y2:x1+kA/2}),K("line",{className:"grid",x1:En,x2:Ki-En,y1:x1,y2:x1}),K("polyline",{className:"stat-line tasks",points:mA(r,"executedTasks",y)}),K("polyline",{className:"stat-line retry",points:mA(r,"retryAttempts",t)}),K("polyline",{className:"stat-line duration",points:mA(r,"avgDurationMs",_)}),U?K("g",{className:"stat-cursor-layer","data-testid":"codex-stats-active-point"},K("line",{className:"stat-cursor",x1:U.x,x2:U.x,y1:x1,y2:xt}),K("circle",{className:`stat-point-active ${U.className}`,cx:U.x,cy:U.y,r:8})):null,K("g",{className:"stat-point-layer"},H)),U?K("div",{className:"codex-stats-tooltip active",style:W,"data-testid":"codex-stats-tooltip"},K("b",null,D0(U.row?.date)),K("span",null,`${U.label} · ${U.valueLabel}`),K("code",null,`${Ml(U.row?.executedTasks)} exec / ${Ml(U.row?.retryAttempts)} retry / ${br(U.row?.avgDurationMs??void 0)}`)):null,K("div",{className:"codex-stats-legend"},K("span",{className:"tasks"},"执行任务"),K("span",{className:"retry"},"重试次数"),K("span",{className:"duration"},"平均耗时")),K("div",{className:"codex-stats-scale"},K("span",null,D0(r[0]?.date)),K("span",null,w.join(" · ")||"暂无峰值"),K("span",null,D0(r.at(-1)?.date))),K("div",{className:`codex-stats-focus ${U?"active":""}`,"data-testid":"codex-stats-focus"},U?K(ht.default.Fragment,null,K("div",null,K("strong",null,D0(U.row?.date)),K("span",null,`${U.label} · ${U.valueLabel}`)),K("div",{className:"codex-stats-focus-metrics"},K("code",null,`${Ml(U.row?.executedTasks)} exec`),K("code",null,`${Ml(U.row?.retryAttempts)} retry`),K("code",null,br(U.row?.avgDurationMs??void 0)))):K("span",null,"将鼠标悬停到曲线数据点查看明细,点击数据点可固定。"))):K(Ti,{title:"暂无统计",text:"任务开始执行后会生成按天汇总的曲线。"}),K("div",{className:"codex-stats-summary-grid"},K("article",null,K("span",null,"今日执行"),K("strong",null,String(Ml(i.executedTasks))),K("code",null,D0(i.date))),K("article",null,K("span",null,"今日重试"),K("strong",null,String(Ml(i.retryAttempts))),K("code",null,`累计 ${Ml(n.retryAttempts)}`)),K("article",null,K("span",null,"平均耗时"),K("strong",null,br(n.avgDurationMs??void 0)),K("code",null,`${Ml(n.durationSamples)} samples`))),K("div",{className:"codex-stats-daily-list","data-testid":"codex-stats-daily-list"},r.slice(-7).map((E)=>K("div",{key:String(E?.date||""),className:`codex-stats-daily-row ${q===String(E?.date||"")?"active":""}`,"data-testid":`codex-stats-day-${String(E?.date||"unknown")}`},K("span",null,D0(E?.date)),K("b",null,`${Ml(E?.executedTasks)} exec`),K("b",null,`${Ml(E?.retryAttempts)} retry`),K("code",null,br(E?.avgDurationMs??void 0))))))}function qZ({task:u,queueRows:l,busy:f,onMove:r}){let n=String(u?.id||""),i=Rt(u),[y,t]=ku(i);Tn(()=>{t(i)},[n,i]);let _=!n||f||["running","judging","retry_wait"].includes(String(u?.status||""));return K("div",{className:"codex-task-move-control","data-testid":"codex-task-queue-move-control"},K("label",null,"任务 queue",K("select",{value:y,disabled:!n||f,onChange:(c)=>t(String(c.target.value||i)),"data-testid":"codex-task-queue-move-select"},l.map((c)=>K("option",{key:String(c?.id||""),value:String(c?.id||"")},Mt(c))))),K("button",{type:"button",className:"ghost-btn",disabled:_||y===i,onClick:()=>r(y),title:_?"运行中 / judging / retry_wait 的任务不能移动;请先打断或等当前 turn 结束":"移动已创建任务到另一个 queue","data-testid":"codex-task-queue-move-button"},"移动"))}function AQ(u,l=4){let f=(Array.isArray(u)?u:[]).map((n)=>String(n||"").trim()).filter(Boolean);if(f.length===0)return"--";let r=f.slice(0,l).join(" / ");return f.length>l?`${r} +${f.length-l}`:r}function WZ({task:u,loading:l,onLoadPromptPart:f,testId:r="codex-initial-prompt-full",textTestId:n="codex-initial-prompt-full-text",baseTextTestId:i="codex-initial-prompt-base"}){let y=aA(u),t=I3(u),_=k3(u).trimEnd(),c=String(t.full?.text||""),A=RE(u),j=Number(y.promptChars||u?.promptChars||c.length),F=Number(y.basePromptLines||Gi(_)),J=Number(y.promptLines||Gi(c));return K("section",{className:"codex-progressive-card codex-progressive-prompt","data-testid":"codex-progressive-prompt"},K("div",{className:"codex-progressive-card-head"},K("span",{className:"codex-output-channel"},"Prompt"),K("strong",null,"Submitted prompt / 原始用户 prompt"),K("code",null,`${F||Gi(_)} lines / ${_.length} chars`)),K("pre",{className:"codex-prompt-full","data-testid":i},_||"空 prompt"),A?K("details",{className:"codex-reference-injection codex-progressive-full-prompt","data-testid":r,onToggle:(Q)=>{if(Q.currentTarget?.open&&!c)f?.("full")}},K("summary",null,K("span",null,"引用注入已折叠,点击按需拉取最终进入 Code agent 的完整 prompt"),K("code",null,c?`${J||Gi(c)} lines / ${c.length} chars`:`${Number.isFinite(j)&&j>0?j:"--"} chars`)),K("pre",{className:"codex-prompt-full codex-prompt-final-full","data-testid":n},c||(l?"正在按需拉取完整 prompt...":"展开后将只请求 full prompt,不拉取完整 transcript。"))):null)}function XQ({task:u,attempt:l,attemptIndex:f,loading:r,onLoadSteps:n,onLoadStep:i,testId:y="codex-execution-summary"}){let t=gE(ZQ(u,f)),_=sE(pE(u,l)),c=l?VE(u,l):wQ(u),A=vA(u),j=bA(u,f),F=S0(c?.errorCount),J=S0(c?.stepCount??c?.llmStepCount),Q=S0(c?.readCount),w=S0(c?.editCount),L=S0(c?.runCount),U=S0(c?.stepCount??c?.llmStepCount),N=J===null?"--":String(J),q=U===null?"--":String(U),W=Array.isArray(_.editedFiles)?_.editedFiles:[],z=Array.isArray(_.commands)?_.commands:[],H=oA(l,f)?` · ${String(l?.label||"recovered thread execution")}`:f?` #${f}`:"",E=mE(u,l,f,_),D=`最近更新: ${UQ(E)}`,h=CE(u,l,f);return K("details",{className:`codex-progressive-card codex-execution-summary ${h?"running":""}`,"data-testid":y,"data-attempt-index":s3(f),"data-running":h?"true":"false",onToggle:(V)=>{if(V.currentTarget?.open&&!j)n?.(f)}},K("summary",null,K("div",{className:"codex-progressive-card-head"},K("span",{className:"codex-output-channel"},"Summary"),K("strong",null,`执行过程摘要${H}`),h?K("span",{className:"codex-summary-running-pill","data-testid":`${y}-running`},"执行中"):null,K("code",{title:E?`最近更新: ${qu(E)}`:D},`${br(_.durationMs??_.totalElapsedMs)} / ${N} tools / ${D}`)),K("div",{className:"codex-execution-digest"},K("span",{title:"来自 OA Event Flow 统计中心"},`read ${Q===null?"--":Q}`),K("span",{title:"来自 OA Event Flow 统计中心"},`edit ${w===null?"--":w}`),K("span",{title:"来自 OA Event Flow 统计中心"},`run ${L===null?"--":L}`),K("span",{title:"来自 OA Event Flow 统计中心"},`STEP ${q}`),F!==null&&F>0?K("span",{className:"codex-execution-error-pill","data-testid":`${y}-error-count`},`Error ${F}`):null)),K("div",{className:"codex-execution-digest expanded"},K("span",null,`修改文件:${AQ(W,6)}`),K("span",null,`执行命令:${AQ(z,4)}`)),t.length===0?K("div",{className:"codex-output-empty"},r?"正在按需拉取步骤 summary...":"展开后将只请求执行步骤 summary,不拉取单步骤全量。"):K("div",{className:"codex-trace-step-list"},t.map((V)=>{let S=String(V?.seq??""),p=A[S],O=Array.isArray(V?.summaryLines)?V.summaryLines.slice(0,4):[],m=O.find((X)=>String(X||"").trim().length>0);return K("details",{key:S||`${V?.title}-${V?.at}`,className:`codex-trace-step ${String(V?.kind||"message")} ${bE(V)?"error":""}`,"data-testid":`codex-trace-step-${S||"unknown"}`,onToggle:(X)=>{if(X.currentTarget?.open&&!p)i?.(V?.seq)}},K("summary",null,K("span",{className:"codex-output-channel"},wZ(V?.kind)),K("strong",null,String(V?.title||"Trace step")),V?.status?K("code",null,String(V.status)):null,m?K("span",{className:"codex-trace-step-inline-summary",title:String(m)},String(m)):null,K("time",null,qu(V?.at))),K("div",{className:"codex-trace-step-summary"},O.length>0?O.map((X,v)=>K("pre",{key:`${S}-${v}`},String(X||""))):K("span",null,"无 summary")),p?.line?K(C3,{items:[p.line],autoScroll:!1,loading:!1,hasDetail:!0,emptyText:"无步骤详情",testId:`codex-trace-step-detail-${S||"unknown"}`,className:"codex-transcript codex-step-detail-transcript",collapseTools:!1}):K("div",{className:"codex-output-empty"},r?"正在按需拉取这个步骤的全量数据...":"展开后将只请求这个单步骤的全量数据。"))})))}function wZ(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 SQ({task:u,attempt:l,attemptIndex:f,testId:r="codex-final-response"}){let n=PE(u,l);if(n.length===0)return null;let i=Number(l?.finalResponseChars||n.length),y=f?` #${f}`:"";return K("section",{className:"codex-progressive-card codex-final-response","data-testid":r,"data-attempt-index":s3(f)},K("div",{className:"codex-progressive-card-head"},K("span",{className:"codex-output-channel"},"Final"),K("strong",null,`最终 response${y}`),K("code",null,`${Number.isFinite(i)?i:n.length} chars`)),K(KJ,{markdown:n,className:"codex-transcript-body codex-markdown",testId:`${r}-markdown`}))}function YQ({task:u,attempt:l,attemptIndex:f,testId:r="codex-progressive-judge"}){let n=TQ(u,l);if(!n?.decision)return null;let i=f?` #${f}`:"";return K("section",{className:"codex-progressive-card codex-progressive-judge","data-testid":r,"data-attempt-index":s3(f)},K("div",{className:"codex-progressive-card-head"},K("span",{className:"codex-output-channel"},"Judge"),K("strong",null,`完成判定${i}`),K("code",null,`${n.decision} ${Math.round(Number(n.confidence||0)*100)}%`)),K("div",{className:"codex-judge-card","data-testid":`${r}-card`},K(zi,{status:n.decision},n.decision),K("strong",null,`${Math.round(Number(n.confidence||0)*100)}% confidence`),K("p",{"data-testid":`${r}-reason`},n.reason||"--"),K(zQ,{judge:n,testId:`${r}-failure-details`}),n.continuePrompt?K("pre",{"data-testid":`${r}-continue-prompt`},String(n.continuePrompt||"")):null))}function LZ({task:u,attempt:l,attemptIndex:f,loading:r,onLoadPromptPart:n,testId:i="codex-judge-feedback-prompt"}){let y=ME(u,l,f);if(y===null)return null;let t=EQ(f),c=I3(u)[t],A=String(c?.text||"").trimEnd(),j=String(y.preview||y.text||"").trimEnd(),F=A||String(y.text||"").trimEnd(),J=Number(c?.chars||y.chars||F.length||j.length),Q=Number(c?.lines||y.lines||Gi(F||j)),w=c?.forAttempt||y.forAttempt||Number(f||0)+1;return K("details",{className:"codex-progressive-card codex-judge-feedback-prompt","data-testid":i,"data-attempt-index":s3(f),onToggle:(L)=>{if(L.currentTarget?.open&&!A)n?.("feedback",f)}},K("summary",null,K("div",{className:"codex-progressive-card-head"},K("span",{className:"codex-output-channel"},"Prompt"),K("strong",null,`judge feedback prompt #${f} -> #${w}`),K("code",null,`${Q||"--"} lines / ${Number.isFinite(J)?J:j.length} chars`)),K("p",{className:"codex-feedback-preview","data-testid":`${i}-preview`},j||"展开后按需拉取 judge feedback prompt。")),K("pre",{className:"codex-prompt-full codex-feedback-full","data-testid":`${i}-text`},F||(r?"正在按需拉取 judge feedback prompt...":"展开后将只请求这一次 judge feedback prompt。")))}function KZ({task:u,attempt:l,position:f,loading:r,onLoadPromptPart:n,onLoadSteps:i,onLoadStep:y}){let t=aE(l,f),_=f===0,c=oA(l,t),A=c?String(l?.label||"Recovered thread execution"):`Attempt ${t}`;return K("section",{className:"codex-attempt-cycle","data-testid":`codex-attempt-cycle-${t}`},K("div",{className:"codex-attempt-cycle-head"},K("span",{className:"codex-output-channel"},A),K("strong",null,String(l?.mode||(t<=1?"initial":"retry"))),l?.terminalStatus?K(zi,{status:l.terminalStatus},l.terminalStatus):null,K("code",null,`${qu(l?.startedAt)} -> ${qu(l?.finishedAt)}`)),K(XQ,{task:u,attempt:l,attemptIndex:t,loading:r,onLoadSteps:i,onLoadStep:y,testId:_?"codex-execution-summary":`codex-execution-summary-attempt-${t}`}),c?null:K(SQ,{task:u,attempt:l,attemptIndex:t,testId:_?"codex-final-response":`codex-final-response-attempt-${t}`}),c?null:K(YQ,{task:u,attempt:l,attemptIndex:t,testId:_?"codex-progressive-judge":`codex-progressive-judge-attempt-${t}`}),c?null:K(LZ,{task:u,attempt:l,attemptIndex:t,loading:r,onLoadPromptPart:n,testId:_?"codex-judge-feedback-prompt":`codex-judge-feedback-prompt-attempt-${t}`}))}function GZ({task:u,loading:l,onLoadPromptPart:f,onLoadSteps:r,onLoadStep:n}){if(!u)return K(Ti,{title:"未选择任务",text:"从左侧队列选择任务,或提交新 Codex 任务。"});let i=YE(u);return K("div",{className:"codex-transcript codex-progressive-trace","data-testid":"codex-output"},l&&!jr(u)?K("div",{className:"codex-output-empty"},"正在加载 Trace Summary..."):null,K(WZ,{task:u,loading:l,onLoadPromptPart:f}),i.length>0?i.map((y,t)=>K(KZ,{key:`${y?.index||t+1}-${y?.startedAt||t}`,task:u,attempt:y,position:t,loading:l,onLoadPromptPart:f,onLoadSteps:r,onLoadStep:n})):[K(XQ,{key:"execution",task:u,loading:l,onLoadSteps:r,onLoadStep:n}),K(SQ,{key:"final",task:u}),K(YQ,{key:"judge",task:u})])}function zZ({task:u}){let l=TE(u);if(!u||l.length===0)return K(Ti,{title:"暂无原始消息",text:"原始 Codex app-server 消息会保留在任务 JSON 中。"});return K("details",{className:"codex-raw-output"},K("summary",null,`原始 messages (${l.length})`),K("div",null,l.map((f)=>K("article",{key:`${f.seq}-${f.channel}`,className:`codex-output-line ${f.channel||"system"}`},K("div",{className:"codex-output-meta"},K("span",{className:"codex-output-channel"},uZ(String(f.channel||"system"))),K("span",null,qu(f.at)),f.method?K("code",null,f.method):null),K("pre",null,String(f.text||""))))))}function TZ({task:u}){let l=EE(u).slice().reverse();if(l.length===0)return K(Ti,{title:"尚无 attempt",text:"任务开始运行后,这里会记录 Codex 终态、传输中断和 stderr tail。"});return K("div",{className:"table-wrap codex-attempt-table"},K("table",null,K("thead",null,K("tr",null,K("th",null,"#"),K("th",null,"模式"),K("th",null,"终态"),K("th",null,"传输"),K("th",null,"退出"),K("th",null,"完成时间"))),K("tbody",null,l.map((f)=>K("tr",{key:`${f.index}-${f.startedAt}`},K("td",null,f.index),K("td",null,f.mode),K("td",null,K(zi,{status:f.terminalStatus||"unknown"},f.terminalStatus||"unknown")),K("td",null,f.transportClosedBeforeTerminal?K(zi,{status:"failed"},"closed-before-terminal"):K(zi,{status:"succeeded"},"normal")),K("td",null,`code=${f.appServerExitCode??"--"} signal=${f.appServerSignal??"--"}`),K("td",null,qu(f.finishedAt)))))))}function pQ({microservices:u,onRaw:l,apiBaseUrl:f="/api",initialTasksData:r=null,standalone:n=!1}){let i=u.find((B)=>B.id==="code-queue")||null,y=cZ(r),t=String(y?.id||""),_=new Map;if(y!==null&&t.length>0)_.set(t,{task:y,maxSeq:b3(Array.isArray(y.transcript)?y.transcript:[]),complete:Boolean(y._transcriptComplete),completeUpdatedAt:y._transcriptComplete?String(y.updatedAt||""):""});let c=typeof performance>"u"?0:performance.now(),A=Xl(t),j=Xl(0),F=Xl(0),J=Xl(0),Q=Xl(!1),w=Xl(!1),L=Xl(!1),U=Xl(null),N=Xl(new Map),q=Xl(new Map),W=Xl(new Map),z=Xl(new Map),Z=Xl(new Set),H=Xl(null),E=Xl(null),D=Xl(!1),h=Xl(!1),V=Xl(Boolean(r)),S=Xl(new Map),p=Xl(new Set),O=Xl(_),m=Xl(r),[X,v]=ku(null),[T,Y]=ku(r),[k,I]=ku(t),[b,o]=ku(y),[g,x]=ku(!1),[lu,_u]=ku(""),[$u,ju]=ku(null),[zu,Wu]=ku(!1),[P,e]=ku(!1),uu=r?.queue||{},Ku=String(uu?.mainProviderId||uu?.defaultProviderId||"D601").trim()||"D601",[s,Nu]=ku(""),[Eu,Hu]=ku(""),[vu,ul]=ku("default"),[mu,Fl]=ku(Zn),[Uf,Ef]=ku(!1),[lf,ol]=ku(""),[Zf,mf]=ku(Ku),[Au,su]=ku("default"),[Jf,pu]=ku("gpt-5.5"),[ff,rf]=ku(v3(uu,"default",Ku)||"/workspace"),[ur,nf]=ku(99),[Of,N0]=ku(1),[lr,k0]=ku(!1),[Ul,bi]=ku(!1),[fu,Bu]=ku(""),[Yu,au]=ku(""),[_l,Pl]=ku(""),[yl,Qf]=ku(!0),[Xr,Ky]=ku(()=>typeof window>"u"?!0:window.matchMedia(jE).matches),[Zl,k_]=ku(!1),[m6,zl]=ku(""),[$7,vl]=ku(""),{addNotification:fr}=Xf(),[vi,Gy]=ku(""),[ki,I_]=ku(""),[zy,g_]=ku(!1),[Pf,ar]=ku(r?{phase:"complete",taskId:t,queueMs:0,detailMs:0,totalMs:c,chunks:y?1:0,transcriptRows:Array.isArray(y?.transcript)?y.transcript.length:0,partial:Boolean(r?.selected?.hasMore||Pt(y)),completedAt:new Date}:null),[s_,Ty]=ku(r?new Date:null),[Ey,a_]=ku(!1),or=oi(jf(T)),o_=or.filter(X0),pl=T?.queue||X?.body?.queue||X?.queue||{},P6=nZ(T,pl),d_=zn(T),qr=uQ(pl,vu),an=String(vu||"default").trim()||"default",on=qr.filter((B)=>String(B?.id||"")!==an),Ii=h1(qr,mu),dn=Number((kf(mu)?pl?.total:Ii?.total)??d_.total??or.length),Zy=Ct(pl),c7=kf(mu)?Zy:[String(h1(qr,mu)?.activeTaskId||"")].filter(Boolean),gi=lQ(pl,qr,mu,or),A7=kf(mu)?YA(pl):YA(Ii||{}),Oy=YA(pl),C6=fZ(Oy),e_=Math.max(rZ(Oy),Zy.length),M6=Ml((kf(mu)?pl?.unreadTerminal:Ii?.unreadTerminal)??o_.length),I0=T?o_.length:M6,g0=kf(mu)?"All queues":xA(Ii||{id:mu,name:mu}),en=RA(lu),Cf=en.length>0,Hy=Cf?oi(jf($u)):[],R6=zn($u),dr=Cf?Hy:or,j7=dr.filter(X0),SL=dr.filter((B)=>!hr(B)).sort($E),YL=dr.filter((B)=>hr(B)&&!X0(B)),F7=Cf?R6:d_,si=Cf?Number(R6.total??Hy.length):dn,U7=F7.hasMore===!0&&String(F7.nextBeforeId||"").length>0,x6=Cf?P:Ey,pL=i?yE(i):{},mL=i?tE(i):{},h6=oJ(()=>ZE(s),[s]),q0=oJ(()=>{let B=rQ(Of);return h6.flatMap((C)=>Array.from({length:B},()=>OE(C,Eu)))},[h6,Of,Eu]),By=q0.length,J7=By>1&&!lr,PL=Ul||Zl||By===0||J7,Q7=AZ(pl,Jf),u$=jZ(pl,Zf),N7=FZ(pl,Au),CL=v3(pl,Au,Zf),b6=b?.id&&b?.activeTurnId&&String(b?.status)==="running",ML=b?.id&&!["succeeded","failed","canceled"].includes(String(b?.status||"")),RL=b?.id&&["succeeded","failed","canceled"].includes(String(b?.status||"")),ai=b?.id&&BQ(b);function Wr(B){let C=typeof B==="function"?B(m.current):B;return m.current=C,Y(C),C}function xL(B,C,d=!0){let nu=Array.from(new Set(B.map((Fu)=>String(Fu||"")).filter(Boolean)));for(let Fu of nu)if(S.current.set(Fu,C),d)p.current.add(Fu);return nu}function q7(B){for(let C of B.map((d)=>String(d||"")).filter(Boolean))S.current.delete(C),p.current.delete(C)}function l$(B){let C=String(B?.id||""),d=C?S.current.get(C):void 0;if(!d)return B;if(String(B?.status||"").length>0&&!hr(B))return S.current.delete(C),p.current.delete(C),B;return{...B,readAt:B?.readAt||d,terminalUnread:!1}}function v6(B){let C=String(B?.id||"");return C.length>0&&p.current.has(C)&&hr(B)}function oi(B,C=!0){let d=[];for(let nu of Array.isArray(B)?B:[]){let Fu=l$(nu);if(C&&v6(Fu))continue;d.push(Fu)}return d}function hL(B,C=!0){if(!B||!Array.isArray(B?.tasks))return B;let d=oi(jf(B),C),nu=zn(B);return{...B,tasks:d,pagination:B.pagination?{...nu,returned:d.length}:B.pagination}}function bL(B){let C=String(B||pl?.mainProviderId||"D601").trim()||"D601";mf(C),rf(v3(pl,Au,C))}function vL(B){let C=String(B||"default").trim()||"default",d=Zf;if(C==="windows-native"){if(!u$.find((Fu)=>Fu.id===Zf)?.supportsWindowsNativeCodex)d=String(u$.find((Fu)=>Fu.supportsWindowsNativeCodex)?.id||Zf||"D601"),mf(d)}su(C),rf(v3(pl,C,d))}function f$(B,C,d=null,nu=null){let Fu=new Set(xL(B,C));if(Fu.size===0&&nu===null&&d===null)return;Wr((Gu)=>{if(!Gu)return Gu;let wu=jf(Gu).flatMap((Ru)=>{let hu=String(Ru?.id||"");if(!Fu.has(hu)){let Al=l$(Ru);return v6(Al)?[]:[Al]}let Cu=nu&&String(nu?.id||"")===hu?nu:{},xu={...Ru,...Cu,readAt:C,terminalUnread:!1};return v6(xu)?[]:[xu]});return{...Gu,queue:d||Gu.queue,tasks:Fu.size>0?M1([wu],gi):wu}});for(let Gu of Fu){let wu=O.current.get(Gu);if(wu?.task){let Ru=nu&&String(nu?.id||"")===Gu?nu:{},hu={...wu.task,...Ru,readAt:C,terminalUnread:!1};if(O.current.set(Gu,{...wu,task:hu}),A.current===Gu)o(hu)}}}Tn(()=>{k0(!1)},[s,Of,Eu]),Tn(()=>{let B=RA(lu);F.current+=1;let C=F.current;if(!i||B.length===0){ju(null),Wu(!1),e(!1),L.current=!1;return}Wu(!0),ju(null);let d=window.setTimeout(()=>{(async()=>{try{let nu=await NE(f,mu,B);if(C!==F.current)return;ju(hL(nu))}catch(nu){if(C===F.current)ju(null),zl(Af(nu,"搜索 Codex tasks 失败"))}finally{if(C===F.current)Wu(!1)}})()},240);return()=>window.clearTimeout(d)},[i?.id,f,mu,lu]),Tn(()=>{au(b?k3(b):""),Pl(Array.isArray(b?.referenceTaskIds)?b.referenceTaskIds.join(" "):"")},[k]);function W0(B,C,d){let nu=O.current.get(B)||{},Fu=nu.task||{},Gu=Array.isArray(Fu.transcript)?Fu.transcript:[],wu=$Q(Fu,C),Ru=Object.prototype.hasOwnProperty.call(C,"transcript")?PA(Gu,Array.isArray(C.transcript)?C.transcript:[]):Gu,hu={...Fu,...wu,transcript:Ru,output:Array.isArray(wu.output)?IA(Fu,wu,"output"):Array.isArray(Fu.output)?Fu.output:[],events:Array.isArray(wu.events)?IA(Fu,wu,"events"):Array.isArray(Fu.events)?Fu.events:[]},Cu=l$(hu),xu=String(Cu?.updatedAt||""),Al=Boolean(C._transcriptComplete)&&hr(Cu),yf=Boolean(nu.complete)&&hr(Cu)&&String(nu.completeUpdatedAt||"")===xu,eu=Al||yf,dl={...nu,task:Cu,maxSeq:b3(Ru),complete:eu,completeUpdatedAt:eu?xu:""};if(O.current.set(B,dl),d===J.current&&A.current===B)o(Cu);return dl}async function di(B,C=!1,d,nu){if(!i||!B)return;let Gu=O.current.get(B)?.task;if(!C&&x3(Gu))return;let wu=B,Ru=N.current.get(wu);if(Ru){if(C||!x3(Gu))Ru.refreshAfter=!0;return Ru.promise}let hu=J.current,Cu=performance.now();if(A.current===B)x(!0);let xu={promise:Promise.resolve(),refreshAfter:!1},Al=(async()=>{try{let yf=await WE(f,B);if(hu!==J.current||A.current!==B)return;let eu=yf?.summary||{},dl=String(eu.updatedAt||"");W0(B,{id:B,status:eu.status,updatedAt:dl,startedAt:eu.startedAt,finishedAt:eu.finishedAt,currentAttempt:eu.currentAttempt,maxAttempts:eu.maxAttempts,finalResponse:eu.finalResponse,lastJudge:eu.lastJudge,lastError:eu.lastError,attempts:Array.isArray(eu.attempts)?eu.attempts:[],stepCount:eu.stepCount,llmStepCount:eu.llmStepCount,traceStats:eu.traceStats,statsSource:eu.statsSource,timing:eu.timing,_traceSummary:eu,_traceSummaryLoaded:!0,_traceSummaryUpdatedAt:dl,_detailLoaded:!0},hu),ar({phase:"complete",taskId:B,queueMs:nu??0,detailMs:performance.now()-Cu,totalMs:d===void 0?performance.now()-Cu:performance.now()-d,chunks:1,transcriptRows:Number(eu?.execution?.traceLineCount||eu?.execution?.stepCount||0),partial:!1,completedAt:new Date})}finally{let yf=Boolean(xu.refreshAfter&&A.current===B&&!x3(O.current.get(B)?.task));if(N.current.delete(wu),hu===J.current&&A.current===B)x(!1);if(yf)window.setTimeout(()=>{di(B,!0).catch((eu)=>zl(Af(eu,"自动刷新 Trace Summary 失败")))},0)}})();xu.promise=Al,N.current.set(wu,xu),await Al}async function kL(B,C=null){let d=A.current;if(!i||!d||!B)return;let nu=O.current.get(d)?.task,Fu=I3(nu),Gu=B==="feedback"||B==="judge-feedback"?EQ(C):B;if(Fu[Gu]?.text)return;let wu=`${d}:${Gu}`,Ru=q.current.get(wu);if(Ru)return Ru;let hu=J.current;if(A.current===d)x(!0);let Cu=(async()=>{try{let xu=await wE(f,d,B,C);if(hu!==J.current||A.current!==d)return;let Al=O.current.get(d)?.task,yf=I3(Al);W0(d,{...B==="full"?{prompt:String(xu?.text||""),promptChars:Number(xu?.chars||0)}:{},_promptDetails:{...yf,[Gu]:xu}},hu)}finally{if(q.current.delete(wu),hu===J.current&&A.current===d)x(!1)}})();q.current.set(wu,Cu),await Cu}async function k6(B=null,C={}){let d=A.current;if(!i||!d)return;let nu=O.current.get(d)?.task,Fu=B===null||B===void 0||String(B).length===0?"":String(B),Gu=bA(nu,Fu||null),wu=Boolean(C.force),Ru=Boolean(C.incremental);if(Gu&&!wu)return;let hu=ZQ(nu,Fu||null),Cu=Ru&&hu.length>0?xE(hu):0,xu=`${d}:${Fu||"all"}:${Cu}`,Al=W.current.get(xu);if(Al)return Al;let yf=J.current;if(A.current===d)x(!0);let eu=(async()=>{try{let dl=await LE(f,d,Cu,500,Fu||null);if(yf!==J.current||A.current!==d)return;let s0=Array.isArray(dl?.steps)?dl.steps:[],a0=Cu>0?hE(hu,s0):s0;if(Fu){let o0=O.current.get(d)?.task,ei=Wl(o0?._traceStepsByAttempt)||{},tf=Wl(o0?._traceStepsLoadedByAttempt)||{},w0=Wl(o0?._traceStepsNextAfterSeqByAttempt)||{};W0(d,{_traceStepsByAttempt:{...ei,[Fu]:a0},_traceStepsLoadedByAttempt:{...tf,[Fu]:!0},_traceStepsNextAfterSeqByAttempt:{...w0,[Fu]:dl?.nextAfterSeq}},yf)}else W0(d,{_traceSteps:a0,_traceStepsLoaded:!0,_traceStepsHasMore:Boolean(dl?.hasMore),_traceStepsNextAfterSeq:dl?.nextAfterSeq},yf)}finally{if(W.current.delete(xu),yf===J.current&&A.current===d)x(!1)}})();W.current.set(xu,eu),await eu}async function IL(B){let C=A.current,d=String(B??"");if(!i||!C||d.length===0)return;let nu=O.current.get(C)?.task;if(vA(nu)[d]?.line)return;let Gu=`${C}:${d}`,wu=z.current.get(Gu);if(wu)return wu;let Ru=J.current;if(A.current===C)x(!0);let hu=(async()=>{try{let Cu=await KE(f,C,B);if(Ru!==J.current||A.current!==C)return;let xu=O.current.get(C)?.task,Al=vA(xu);W0(C,{_traceStepDetails:{...Al,[d]:Cu}},Ru)}finally{if(z.current.delete(Gu),Ru===J.current&&A.current===C)x(!1)}})();z.current.set(Gu,hu),await hu}function gL(B){if(A.current!==B)return;let C=O.current.get(B)?.task;if(!C)return;if(bA(C,null))k6(null,{force:!0,incremental:!0}).catch((nu)=>zl(Af(nu,"增量刷新 Trace Steps 失败")));let d=Wl(C?._traceStepsLoadedByAttempt)||{};for(let nu of Object.keys(d).filter((Fu)=>d[Fu]))k6(nu,{force:!0,incremental:!0}).catch((Fu)=>zl(Af(Fu,"增量刷新 Attempt Trace Steps 失败")))}async function jm(B,C,d){if(!i||!B)return;let nu=performance.now(),Fu=J.current,Gu=O.current.get(B);if(Gu?.task){if(o(Gu.task),x(Pt(Gu.task)||!Gu.complete),!Pt(Gu.task)&&Gu.complete&&hr(Gu.task)&&String(Gu.completeUpdatedAt||"")===String(Gu.task?.updatedAt||"")){ar({phase:"complete",taskId:B,queueMs:d??0,detailMs:0,totalMs:C===void 0?0:performance.now()-C,chunks:0,transcriptRows:Array.isArray(Gu.task.transcript)?Gu.task.transcript.length:0,completedAt:new Date});return}}else x(!0);let wu=U.current;if(wu?.taskId===B&&wu.token===Fu)return wu.promise;let Ru=(async()=>{try{let hu=await Rl(xl(f,`/api/tasks/${encodeURIComponent(B)}?meta=1`));if(Fu!==J.current||A.current!==B)return;let Cu=O.current.get(B),xu=Array.isArray(Cu?.task?.transcript)?Cu.task.transcript:[],Al=hu?.task||{},yf=Boolean(Cu?.complete)&&String(Cu?.completeUpdatedAt||"")===String(Al?.updatedAt||"");W0(B,{...Al,summaryOnly:!1,_metaLoaded:!0,transcript:xu,_detailLoaded:xu.length>0,_transcriptComplete:yf},Fu);let eu=Pt(Cu?.task)||Boolean(Cu?.task?._transcriptPreview),dl=eu?0:xu.length>0?cQ(xu):0,s0=!eu&&Cu?.complete&&hr(Al)&&String(Cu?.completeUpdatedAt||"")===String(Al?.updatedAt||"")?b3(xu):dl,a0=!0,o0=0,ei=xu.length;while(a0){let tf=await Rl(xl(f,`/api/tasks/${encodeURIComponent(B)}/transcript?afterSeq=${encodeURIComponent(String(s0))}&limit=${rE}&fullText=1`));if(Fu!==J.current||A.current!==B)return;let w0=O.current.get(B),r$=Array.isArray(w0?.task?.transcript)?w0.task.transcript:[],kl=PA(r$,Array.isArray(tf?.transcript)?tf.transcript:[]);o0+=1,ei=kl.length;let n$=Boolean(!tf?.hasMore);if(W0(B,{status:tf?.status||Al.status,updatedAt:tf?.updatedAt||Al.updatedAt,transcript:kl,_detailLoaded:n$||kl.length>0,_transcriptComplete:n$,_transcriptPreview:eu&&!n$},Fu),a0=Boolean(tf?.hasMore),s0=Number(tf?.nextAfterSeq??b3(kl)),!a0)break;await new Promise((u1)=>window.setTimeout(u1,0))}ar({phase:"complete",taskId:B,queueMs:d??0,detailMs:performance.now()-nu,totalMs:C===void 0?performance.now()-nu:performance.now()-C,chunks:o0,transcriptRows:ei,completedAt:new Date})}finally{if(U.current?.taskId===B&&U.current?.token===Fu)U.current=null;if(Fu===J.current&&A.current===B)x(!1)}})();U.current={taskId:B,token:Fu,promise:Ru},await Ru}async function Mf(B=A.current,C=!0,d=mu){if(!i)return;if(!C&&h.current)return;let nu=performance.now();if(C)h.current=!0;if(C)ar({phase:"loading",taskId:String(B||A.current||""),startedAt:new Date});let Fu=j.current+1;j.current=Fu;let Gu=String(B||A.current||""),wu=Gu?O.current.get(Gu):null,Ru=Array.isArray(wu?.task?.transcript)?wu.task.transcript:[],hu=cQ(Ru),Cu=null;if(Cu=await qE(f,Gu,hu,d),Fu!==j.current){if(C)h.current=!1;return}let xu=performance.now()-nu;v(X||{});let Al=Cu?.queue||{},yf=String(Al?.activeTaskId||Ct(Al)[0]||""),eu=Cu;Wr((nr)=>{let Vy=jf(Cu),ui=jf(nr),Dy=ui.length>0?M1([ui,Vy],yf):M1([Vy],yf),i$=oi(Dy),KK=zn(Cu),y$=zn(nr),GK=ui.length>Vy.length&&(y$.hasMore===!1||String(y$.nextBeforeId||"").length>0),zK={...KK,...GK?{hasMore:y$.hasMore,nextBeforeId:y$.nextBeforeId}:{},returned:i$.length};return eu={...Cu,tasks:i$,pagination:zK},eu});let dl=jf(eu),s0=uQ(Al,vu),a0=lQ(Al,s0,d,dl),o0=QE(s0,d,dl),ei=Gu||A.current,tf=eu?.selected||null,w0=tf?.task||null,r$=Array.isArray(tf?.transcript)?tf.transcript:null,kl=ei||a0||o0||dl[0]?.id||"";if(A.current!==kl)J.current+=1;A.current=kl,I(kl);let u1=dl.find((nr)=>nr.id===kl);if(u1){let nr=O.current.get(kl);if(nr?.task)O.current.set(kl,{...nr,task:{...u1,...nr.task,status:u1.status,updatedAt:u1.updatedAt}})}if(w0?.id===kl&&r$!==null){let nr=O.current.get(kl),Vy=Array.isArray(nr?.task?.transcript)?nr.task.transcript:[],ui=PA(Vy,r$),Dy=Boolean(tf?.preview);if(W0(kl,{...w0,_summaryLoaded:!0,transcript:ui,_detailLoaded:!tf?.hasMore||ui.length>0,_transcriptComplete:!Dy&&!tf?.hasMore&&hr(w0),_transcriptPreview:Dy},J.current),x(!1),C)ar({phase:"complete",taskId:kl,queueMs:xu,detailMs:Math.max(0,performance.now()-nu-xu),totalMs:performance.now()-nu,chunks:1,transcriptRows:ui.length,partial:Boolean(Dy||tf?.hasMore||Pt(w0)),completedAt:new Date});if(Ty(new Date),C)h.current=!1;di(kl,!1,C?nu:void 0,C?xu:void 0).catch((i$)=>zl(Af(i$,"加载 Codex Trace Summary 失败")));return}if(C)ar({phase:"session",taskId:kl,queueMs:xu,totalMs:xu,startedAt:new Date(Date.now()-xu)});if(kl)di(kl,!0,C?nu:void 0,C?xu:void 0).catch((nr)=>zl(Af(nr,"加载 Codex Trace Summary 失败")));else if(J.current+=1,o(null),x(!1),C)ar({phase:"complete",taskId:"",queueMs:xu,detailMs:0,totalMs:performance.now()-nu,chunks:0,transcriptRows:0,completedAt:new Date});if(Ty(new Date),C)h.current=!1}async function W7(){if(Cf){if(!i||P||L.current)return;let C=String(R6.nextBeforeId||"");if(!C)return;L.current=!0,e(!0),zl("");try{let d=await fQ(f,mu,C,FQ,en),nu=jf(d),Fu=d?.queue||pl||{},Gu=String(Fu?.activeTaskId||Ct(Fu)[0]||gi||"");ju((wu)=>{let Ru=oi(M1([jf(wu),nu],Gu)),hu=zn(d);return{...wu||{},queue:Fu,tasks:Ru,pagination:{...hu,returned:Ru.length}}})}catch(d){zl(Af(d,"加载更多搜索结果失败"))}finally{L.current=!1,e(!1)}return}if(!i||Ey||w.current)return;let B=String(zn(T).nextBeforeId||"");if(!B)return;w.current=!0,a_(!0),zl("");try{let C=await fQ(f,mu,B),d=jf(C),nu=C?.queue||pl||{},Fu=String(nu?.activeTaskId||Ct(nu)[0]||gi||"");Wr((Gu)=>{let wu=oi(M1([jf(Gu),d],Fu)),Ru=zn(C);return{...Gu||{},queue:nu,statistics:C?.statistics||Gu?.statistics,tasks:wu,pagination:{...Ru,returned:wu.length}}})}catch(C){zl(Af(C,"加载更早 Codex tasks 失败"))}finally{w.current=!1,a_(!1)}}function sL(B){let C=B.currentTarget;if(!C||x6||!U7)return;if(C.scrollHeight-C.scrollTop-C.clientHeight<120)W7()}async function rr(B,C){k_(!0),zl("");try{await B()}catch(d){zl(Af(d,C))}finally{k_(!1)}}async function I6(B){if(!B)return;try{let C=!1;try{if(navigator.clipboard?.writeText)await navigator.clipboard.writeText(B),C=!0}catch{C=!1}if(!C){let nu=document.createElement("textarea");nu.value=B,nu.style.position="fixed",nu.style.opacity="0",document.body.appendChild(nu),nu.select(),C=document.execCommand("copy"),document.body.removeChild(nu)}if(!C)throw Error("browser clipboard rejected the copy request");Gy(B);let d=`已复制任务 ID:${B}`;vl(d),fr("success",d),window.setTimeout(()=>Gy((nu)=>nu===B?"":nu),1600)}catch(C){zl(`复制任务 ID 失败:${Af(C)}`)}}function g6(B){if(!B)return;Hu(B);let C=`已引用任务 ID:${B};提交时后端会读取并注入该任务上下文`;vl(C),fr("success",C)}async function s6(B){if(!i||!B)return;let C=new Date().toISOString();j.current+=1,f$([B],C,null,{id:B,readAt:C,terminalUnread:!1}),I_(B);let d=!1;if(await rr(async()=>{let nu=await GE(f,B),Fu=nu?.task||{id:B,readAt:new Date().toISOString(),terminalUnread:!1},Gu=String(Fu?.readAt||new Date().toISOString());f$([B],Gu,nu?.queue||null,Fu),d=!0;let wu=`已将任务 ${B} 标为已读`;vl(wu),fr("success",wu)},"标记 Codex task 已读失败"),!d)q7([B]),Mf(A.current,!1).catch((nu)=>zl(Af(nu,"刷新 Codex tasks 失败")));I_((nu)=>nu===B?"":nu)}async function aL(){if(!i||zy)return;g_(!0);let B=new Date().toISOString(),C=Array.from(new Set([...jf(m.current).filter(X0).map((nu)=>String(nu?.id||"")).filter(Boolean),...Array.from(O.current.entries()).filter(([,nu])=>X0(nu?.task)).map(([nu])=>nu)]));if(j.current+=1,C.length>0)f$(C,B);let d=!1;if(await rr(async()=>{let nu=await zE(f),Fu=String(nu?.readAt||new Date().toISOString()),Gu=jf(m.current).filter(X0).map((xu)=>String(xu?.id||"")).filter(Boolean),wu=Array.from(O.current.entries()).filter(([,xu])=>X0(xu?.task)).map(([xu])=>xu),Ru=Array.from(new Set([...C,...Gu,...wu]));f$(Ru,Fu,nu?.queue||null);let hu=Number(nu?.count||Ru.length);d=!0;let Cu=`已将 ${hu} 个已结束未读任务标为已读`;vl(Cu),fr("success",Cu)},"全部标为已读失败"),!d&&C.length>0)q7(C),Mf(A.current,!1).catch((nu)=>zl(Af(nu,"刷新 Codex tasks 失败")));g_(!1)}function oL(B){let C=B||Zn;if(Fl(C),!kf(C))ul(C);if(Wr(null),!(kf(C)?A.current:""))A.current="",J.current+=1,I(""),o(null),x(!0)}async function dL(){let B=typeof window>"u"?"":window.prompt("输入新的 Codex queue ID(字母/数字/._-,最长 64)","new-lane"),C=String(B||"").trim();if(!C)return;await rr(async()=>{let d=await Rl(xl(f,"/api/queues"),{method:"POST",body:{queueId:C}}),nu=String(d?.queue?.id||C);ul(nu),Fl(nu),Wr(null),A.current="",J.current+=1,I(""),o(null);let Fu=`已创建并切换到 queue:${nu}`;vl(Fu),fr("success",Fu),await Mf("",!0,nu)},"创建 Codex queue 失败")}async function eL(){let B=String(vu||"default").trim()||"default",C=h1(qr,B)||{id:B,name:B},d=typeof window>"u"?null:window.prompt(`输入 queue 显示名称(ID 不变:${B};留空恢复为 ID)`,NQ(C));if(d===null)return;await rr(async()=>{let nu=await Rl(xl(f,`/api/queues/${encodeURIComponent(B)}`),{method:"PATCH",body:{name:String(d)}}),Fu=nu?.queue||{id:B,name:String(d||B)};if(nu?.summary)Wr((wu)=>wu?{...wu,queue:nu.summary}:wu);let Gu=`已更新 queue 名称:${xA(Fu)}`;vl(Gu),fr("success",Gu),await Mf(A.current,!0,mu)},"修改 Codex queue 名称失败")}function uK(){if(on.length===0){vl("没有可合并的其他 queue;请先创建或选择另一个 queue。");return}let B=on.some((C)=>String(C?.id||"")===lf)?lf:"";ol(B),Ef(!0)}async function lK(){let B=an;if(on.length===0){vl("没有可合并的其他 queue;请先创建或选择另一个 queue。");return}let d=String(lf||""||"").trim();if(!d){vl("请先选择要合并的源 queue。");return}if(d===B){zl("源 queue 和目标 queue 不能相同。");return}await rr(async()=>{let nu=await Rl(xl(f,`/api/queues/${encodeURIComponent(B)}/merge`),{method:"POST",body:{sourceQueueId:d}});if(nu?.summary)Wr((wu)=>wu?{...wu,queue:nu.summary}:wu);ul(B),Fl(B),Wr(null);let Fu=Number(nu?.mergedTaskCount||0),Gu=`已将 queue=${d} 合并到 ${B},移动 ${Fu} 个任务;源 queue 已自动删除。`;vl(Gu),fr("success",Gu),Ef(!1),ol(""),await Mf(A.current,!0,B)},"合并 Codex queue 失败")}async function fK(B){if(B.preventDefault(),Q.current){vl("任务正在提交中,请等待当前请求完成,已阻止重复提交。");return}if(q0.length>1&&!lr){zl(`检测到将创建 ${q0.length} 个任务;请先勾选“确认批量入队”,避免误传多个任务。`);return}Q.current=!0,bi(!0),vl("正在提交 Code Queue 任务,请等待后端确认,输入已临时锁定。"),await rr(async()=>{if(q0.length===0)throw Error("prompt 不能为空");let C=Li(Eu),d=vu.trim()||"default",nu=[...q0],Fu=(xu)=>({prompt:xu,queueId:d,providerId:Zf,executionMode:Au,model:Jf,cwd:ff,maxAttempts:Number(ur),...C.length>0?{referenceTaskIds:C}:{}}),Gu=nu.length===1?Fu(nu[0]):{tasks:nu.map(Fu)},wu=await Rl(xl(f,nu.length===1?"/api/tasks":"/api/tasks/batch"),{method:"POST",body:Gu}),Ru=wu?.tasks?.[0]?.id||"",hu=Array.isArray(wu?.tasks)?wu.tasks.map((xu)=>String(xu?.id||"")).filter(Boolean):[],Cu=`已创建 ${hu.length||nu.length} 个任务${hu.length>0?`:${hu.join(" / ")}`:""}`;if(vl(Cu),fr("success",Cu),Nu(""),Hu(""),k0(!1),A.current=Ru,mu!==d)Wr(null);ul(d),await Mf(Ru,!0,d)},"Codex 任务入队失败"),Q.current=!1,bi(!1)}async function rK(B){if(B.preventDefault(),!b?.id)return;await rr(async()=>{await Rl(xl(f,`/api/tasks/${encodeURIComponent(b.id)}/steer`),{method:"POST",body:{prompt:fu}}),Bu(""),await Mf(b.id)},"追加 prompt 失败")}async function nK(B){B.preventDefault();let C=String(b?.id||"");if(!C||!ai)return;await rr(async()=>{let d=Li(_l),nu=await Rl(xl(f,`/api/tasks/${encodeURIComponent(C)}/edit`),{method:"POST",body:{prompt:Yu,referenceTaskIds:d}}),Fu={...nu?.task||b||{},_traceSummary:null,_traceSummaryLoaded:!1,_traceSummaryUpdatedAt:"",_promptDetails:{},_traceSteps:[],_traceStepsLoaded:!1,_traceStepsByAttempt:{},_traceStepsLoadedByAttempt:{},_traceStepsNextAfterSeqByAttempt:{},_traceStepDetails:{}};O.current.set(C,{...O.current.get(C)||{},task:Fu,complete:!1,completeUpdatedAt:""}),A.current=C,o(Fu),I(C),au(k3(Fu)),Pl(Array.isArray(Fu?.referenceTaskIds)?Fu.referenceTaskIds.join(" "):""),Wr((wu)=>{if(!wu)return wu;let Ru=jf(wu).map((hu)=>String(hu?.id||"")===C?{...hu,...Fu}:hu);return{...wu,queue:nu?.queue||wu.queue,tasks:M1([Ru],gi)}});let Gu=nu?.changed===!1?`任务 ${C} 的 prompt 未变化`:`已更新 queued 任务 ${C} 的用户 prompt`;vl(Gu),fr("success",Gu),await Mf(C,!0,mu)},"编辑 queued 任务 prompt 失败")}async function iK(){if(!b?.id)return;await rr(async()=>{await Rl(xl(f,`/api/tasks/${encodeURIComponent(b.id)}/interrupt`),{method:"POST",body:{}}),await Mf(b.id)},"打断 Codex session 失败")}async function yK(){if(!b?.id)return;await rr(async()=>{await Rl(xl(f,`/api/tasks/${encodeURIComponent(b.id)}/retry`),{method:"POST",body:{}}),await Mf(b.id)},"重新入队失败")}async function tK(B){let C=String(b?.id||""),d=String(B||"").trim();if(!C||!d)return;let nu=Rt(b);if(d===nu){vl(`任务 ${C} 已在 queue=${d}`);return}await rr(async()=>{let Gu=(await Rl(xl(f,`/api/tasks/${encodeURIComponent(C)}/move`),{method:"POST",body:{queueId:d}}))?.task||{...b,queueId:d};if(O.current.set(C,{...O.current.get(C)||{},task:Gu}),A.current=C,o(Gu),I(C),ul(d),!kf(mu))Wr(null),Fl(d);let wu=`已将任务 ${C} 从 ${nu} 移动到 ${d}`;vl(wu),fr("success",wu),await Mf(C,!0,kf(mu)?Zn:d)},"移动任务 queue 失败")}async function _K(){let B=A.current;if(!B)return;let C=performance.now();await rr(async()=>{ar({phase:"session",taskId:B,queueMs:0,totalMs:0,partial:!0,startedAt:new Date}),await di(B,!0,C,0)},"刷新 Trace Summary 失败")}function $K(B){A.current=B,J.current+=1,I(B);let C=O.current.get(B);if(C?.task)o(C.task),x(!1);else{x(!0);let d=or.find((nu)=>nu.id===B);if(d)o(d);else o(null)}Mf(B).catch((d)=>zl(Af(d,"切换 Codex session 失败")))}function a6(B){if($K(B),FE())Ky(!1)}function w7(B,C,d){if(!B||!Array.isArray(B?.tasks)||C.length===0||Object.keys(d).length===0)return B;let nu=!1,Fu=jf(B).map((Gu)=>{if(String(Gu?.id||"")!==C)return Gu;return nu=!0,l$($Q(Gu,d))});return nu?{...B,tasks:Fu}:B}function cK(B,C){Wr((d)=>w7(d,B,C)),ju((d)=>w7(d,B,C))}function AK(B,C,d){let nu=String(B?.type||"");if(nu==="queue-updated")return!0;if(nu==="trace-stats-updated"||nu==="trace-step-created")return!1;if(C.length===0)return!0;if(!d)return!0;if(B?.queueId&&String(B.queueId)!==Rt(d))return!0;if(B?.status&&String(B.status)!==String(d?.status||""))return!0;return String(B?.reason||"")!=="output"}function L7(){if(!i||!SA())return;if(H.current!==null)window.clearTimeout(H.current);H.current=window.setTimeout(()=>{H.current=null,Mf(A.current,!1).catch((B)=>zl(Af(B,"Code Queue 事件刷新失败")))},120)}function jK(B,C){if(!i||!SA()||A.current!==B)return;if(D.current=D.current||C,E.current!==null)return;E.current=window.setTimeout(()=>{E.current=null;let d=D.current;if(D.current=!1,di(B,!0).catch((nu)=>zl(Af(nu,"事件刷新 Trace Summary 失败"))),d)gL(B)},250)}function FK(B){let C=Wl(B?.payload)||B,d=Wl(C?.stats),nu=String(B?.type||C?.type||""),Fu=String(C?.subjectKind||d?.subjectKind||""),Gu=String(C?.scopeId||d?.scopeId||""),wu=String(C?.taskId||(Fu==="task"?C?.subjectId:"")||d?.taskId||B?.taskId||""),Ru=C?.attemptIndex??d?.attemptIndex,hu=Ru===null||Ru===void 0||Ru===""?null:S0(Ru),Cu=d||Wl(C?.traceStats),xu=Cu?.stepCount??Cu?.llmStepCount,Al=Cu?.outputMaxSeq;return{...C,type:nu,eventId:B?.eventId||C?.eventId,sequence:B?.sequence??C?.sequence,taskId:wu,subjectKind:Fu,scopeId:Gu,attemptIndex:hu,stepCount:xu,outputMaxSeq:Al,updatedAt:Cu?.updatedAt||C?.updatedAt||B?.createdAt,traceStats:Cu,statsSource:Cu?"oa-event-flow":C?.statsSource}}function UK(B){let C=FK(B),d=String(C?.taskId||""),nu=String(C?.scopeId||C?.traceStats?.scopeId||""),Fu=String(C?.subjectKind||C?.traceStats?.subjectKind||"")==="task-attempt"||Number(C?.attemptIndex)>0||/:attempt:\d+$/u.test(nu),Gu=nQ(C?.stepCount),wu={},Ru=d.length>0?jf(m.current).find((hu)=>String(hu?.id||"")===d):null;if(d.length>0){if(C?.status)wu.status=String(C.status);if(C?.updatedAt)wu.updatedAt=String(C.updatedAt);if(C?.queueId)wu.queueId=String(C.queueId);if(!Fu&&Number.isFinite(Number(C?.stepCount)))wu.stepCount=Gu,wu.llmStepCount=Gu;if(!Fu&&Number.isFinite(Number(C?.outputMaxSeq)))wu.outputMaxSeq=nQ(C.outputMaxSeq);if(!Fu&&Wl(C?.traceStats))wu.traceStats=C.traceStats,wu.statsSource="oa-event-flow";if(Object.keys(wu).length>0&&(O.current.has(d)||A.current===d))W0(d,wu,J.current);if(Object.keys(wu).length>0)cK(d,wu);if(A.current===d&&(C?.type==="trace-step-created"||C?.type==="task-updated"||C?.type==="trace-stats-updated")){let hu=LQ(Ru),Cu=C?.type==="trace-step-created"||C?.type==="trace-stats-updated"&&!Fu&&Number.isFinite(Number(C?.stepCount))&&(hu===null||Gu>hu);jK(d,Cu)}}if(AK(C,d,Ru))L7()}Tn(()=>{if(V.current){V.current=!1;return}rr(()=>Mf(A.current),"Code Queue 加载失败")},[i?.id,mu]),Tn(()=>{if(!i||typeof EventSource>"u")return;let B=new EventSource(_E(f),{withCredentials:!0}),C=(nu)=>{try{UK(JSON.parse(String(nu.data||"{}")))}catch(Fu){zl(Af(Fu,"解析 Code Queue 事件失败"))}},d=()=>{if(SA())L7()};return B.addEventListener("trace-step-created",C),B.addEventListener("task-updated",C),B.addEventListener("queue-updated",C),B.addEventListener("trace-stats-updated",C),document.addEventListener("visibilitychange",d),()=>{if(B.close(),document.removeEventListener("visibilitychange",d),H.current!==null)window.clearTimeout(H.current),H.current=null;if(E.current!==null)window.clearTimeout(E.current),E.current=null}},[i?.id,f,mu]),Tn(()=>{if(!i||!b||g)return;let B=String(b.id||"");if(!B)return;let C=String(b.updatedAt||"");if(x3(b))return;let d=`${B}:${C||"unknown"}:${String(b?._traceSummaryUpdatedAt||"")}`;if(Z.current.has(d))return;Z.current.add(d),di(B,!0).catch((nu)=>zl(Af(nu,"自动加载 Trace Summary 失败")))},[i?.id,b?.id,b?.updatedAt,b?.traceStats?.statsRevision,b?._traceSummaryUpdatedAt,b?._traceSummaryLoaded,g]);let JK=dr.length===0?K(Ti,{title:Cf?zu?"搜索中":"没有匹配任务":"队列为空",text:Cf?zu?`正在搜索包含“${en}”的 task...`:`未找到包含“${en}”的 task;可换个关键词或切换 queue。`:"提交一个任务后,Codex 会串行执行并保存输出。"}):[j7.length>0?K(CA,{key:"unread",title:"已结束未读",tasks:j7,selectedId:k,emptyText:"暂无已结束未读任务。",onSelect:a6,onCopy:I6,onReference:g6,onMarkRead:s6,copiedTaskId:vi,markingReadTaskId:ki}):null,K(CA,{key:"active",title:"运行 / 排队",tasks:SL,selectedId:k,emptyText:"当前没有运行或排队任务。",onSelect:a6,onCopy:I6,onReference:g6,onMarkRead:s6,copiedTaskId:vi,markingReadTaskId:ki}),K(CA,{key:"history",title:"历史 session",tasks:YL,selectedId:k,emptyText:"最近没有完成、失败或取消的 session。",onSelect:a6,onCopy:I6,onReference:g6,onMarkRead:s6,copiedTaskId:vi,markingReadTaskId:ki}),K("div",{key:"pagination",className:"codex-task-pagination","data-testid":"codex-task-pagination"},K("span",null,Cf?`搜索“${en}” · 已显示 ${dr.length} / ${Number.isFinite(si)?si:dr.length}`:`已加载 ${dr.length} / ${Number.isFinite(si)?si:dr.length}`),U7?K("button",{type:"button",className:"ghost-btn",disabled:x6,onClick:()=>void W7(),"data-testid":"codex-load-more-tasks-button"},x6?"加载中":Cf?"加载更多结果":"加载更早任务"):K("code",null,Cf?"已到结果末尾":"已到队列末尾"))],K7=(B,C=!1)=>K("label",{className:`code-queue-switcher ${C?"compact":""}`},K("span",null,C?"Queue":"查看 queue"),K("select",{value:mu,onChange:(d)=>oL(String(d.target.value||Zn)),"data-testid":B},K("option",{value:Zn},`All queues · ${Number.isFinite(dn)?dn:or.length} tasks · ${Zy.length} running`),qr.map((d)=>K("option",{key:String(d?.id||""),value:String(d?.id||"")},Mt(d))))),QK=K("div",{className:"codex-task-search","data-testid":"codex-task-search"},K("label",{htmlFor:"codex-task-search-input"},"搜索 task"),K("div",{className:"codex-task-search-row"},K("input",{id:"codex-task-search-input",type:"search",value:lu,placeholder:"关键词 / task ID / prompt",autoComplete:"off",onChange:(B)=>_u(String(B.target.value||"")),"data-testid":"codex-task-search-input"}),lu?K("button",{type:"button",className:"ghost-btn",onClick:()=>_u(""),"data-testid":"codex-task-search-clear"},"清除"):null),K("small",{"data-testid":"codex-task-search-summary"},Cf?zu?"搜索中...":`匹配 ${dr.length}/${Number.isFinite(si)?si:dr.length}`:"支持 task ID、prompt、状态、provider、模型和最近输出关键词")),NK=K("div",{className:"codex-trace-status","data-testid":"codex-trace-status-summary"},K("span",{className:"codex-trace-status-chip queued"},K("b",null,"排队"),String(C6)),K("span",{className:"codex-trace-status-chip running"},K("b",null,"运行"),String(e_)),K("span",{className:`codex-trace-status-chip unread ${I0>0?"warn":""}`},K("b",null,"结束未读"),String(I0)),K("span",{className:"codex-trace-status-chip service"},K("b",null,"服务"),`${pL.providerStatus||"unknown"} · ${i?.providerId||"D601"} · ${mL.public?"公网暴露":"仅 UniDesk frontend 代理访问"}`),K("span",{className:"codex-trace-status-chip"},K("b",null,"执行节点"),u$.map((B)=>B.id).join(" / ")),K("span",{className:"codex-trace-status-chip"},K("b",null,"执行模式"),N7.map((B)=>B.id).join(" / ")),K("span",{className:"codex-trace-status-chip"},K("b",null,"模型"),Q7.join(" / ")),K("span",{className:"codex-trace-status-chip"},K("b",null,"加载"),Pf?.phase==="complete"?iE(Pf?.totalMs):String(Pf?.phase||"idle")),K("span",{className:"codex-trace-status-chip"},K("b",null,"刷新"),s_?tl(s_):"--")),qK=K(R1,{title:b?`Trace ${String(b.id).slice(0,22)}`:"Trace 输出",eyebrow:b?`${b.status} / view=${g0} / task queue=${Rt(b)} / provider=${b.providerId||"D601"} / mode=${b.executionMode||"default"} / ${b.model} / agent loop trace`:`Agent loop trace / view=${g0}`,summary:NK,loading:g||Ey||zu||P||Pf?.phase==="loading",actions:K("div",{className:"panel-actions"},K7("code-queue-filter-select"),K("button",{type:"button",className:"ghost-btn codex-mark-all-read-btn",disabled:I0===0||Zl||zy,onClick:()=>void aL(),"data-testid":"codex-mark-all-read-button"},zy?"标记中":`全部标已读${I0>0?` (${I0})`:""}`),b?K("button",{type:"button",className:"ghost-btn",disabled:g||Zl,onClick:()=>void _K(),"data-testid":"codex-load-full-trace-button"},g?"加载中":jr(b)?"刷新 Summary":"加载 Summary"):null,K("button",{type:"button",className:"codex-session-title-toggle",onClick:()=>Ky((B)=>!B),"data-testid":"code-queue-sidebar-toggle"},Xr?"收起队列":"展开队列"),K("label",{className:"inline-check"},K("input",{type:"checkbox",checked:yl,onChange:(B)=>Qf(Boolean(B.target.checked))}),"自动滚动"),K("button",{type:"button",className:"ghost-btn",disabled:!ML||Zl,onClick:()=>void iK(),"data-testid":"codex-interrupt-button"},"打断"),K("button",{type:"button",className:"ghost-btn",disabled:!RL||Zl,onClick:()=>void yK()},"重试"),b?K(QQ,{title:"Codex Task",data:b,onOpen:l,testId:"raw-codex-task"}):null),className:"codex-output-panel"},K("div",{className:`codex-session-shell ${Xr?"":"queue-collapsed"}`},Xr?K("aside",{className:"codex-session-sidebar","data-testid":"codex-session-sidebar"},K("div",{className:"codex-session-sidebar-head"},K("div",null,K("span",null,kf(mu)?"All queues":"Queue lane"),K("strong",null,`${g0} · ${or.length}/${Number.isFinite(dn)?dn:or.length} sessions · 未读 ${I0}`)),K("button",{type:"button",className:"ghost-btn",onClick:()=>Ky(!1)},"收起")),K7("code-queue-filter-sidebar",!0),QK,K("div",{className:"codex-task-list codex-task-list-session",onScroll:sL,"data-testid":"codex-task-list-scroll"},JK)):null,K("div",{className:"codex-session-main"},K("div",{className:"codex-output-stack"},K(GZ,{task:b,loading:g,onLoadPromptPart:kL,onLoadSteps:k6,onLoadStep:IL}),K(zZ,{task:b})))));if(!i)return K(Ti,{title:"Code Queue 未登记",text:"请在 config.json 的 microservices 中登记用户服务 id=code-queue"});let G7=Number(Pf?.totalMs),z7=Number(Pf?.queueMs),T7=Number(Pf?.detailMs),E7=Number(Pf?.transcriptRows),WK=Pf?.phase==="complete"?"complete":String(Pf?.phase||"idle"),wK=h1(qr,an)||{id:an,name:an},LK=Uf?K(aJ,{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:Zl,onClose:()=>Ef(!1),actions:[K("button",{key:"cancel",type:"button",className:"ghost-btn",onClick:()=>Ef(!1),disabled:Zl,"data-testid":"codex-merge-queue-cancel"},"取消"),K("button",{key:"confirm",type:"button",className:"primary-btn",onClick:()=>void lK(),disabled:Zl||Ul||!lf,"data-testid":"codex-merge-queue-confirm"},Zl?"合并中...":"确认合并")]},K("p",{className:"codex-merge-dialog-target"},"目标 queue:",K("code",null,Mt(wK))),K("label",null,"源 queue",K("select",{value:lf,disabled:Zl||Ul,onChange:(B)=>ol(String(B.target.value||"")),"data-testid":"codex-merge-source-queue-select"},K("option",{value:""},"选择要合并进来的源 queue"),on.map((B)=>K("option",{key:String(B?.id||""),value:String(B?.id||"")},Mt(B))))),K("p",{className:"codex-merge-dialog-note"},"会把源 queue 的任务归属合并到目标 queue,并自动删除源 queue;目标 queue 会按原 queueEnteredAt/createdAt 时间顺序运行。")):null;return K("div",{className:`code-queue-page ${n?"codex-standalone-page":""}`,"data-testid":"code-queue-page","data-load-state":WK,"data-load-total-ms":Number.isFinite(G7)?String(Math.round(G7*10)/10):"","data-load-queue-ms":Number.isFinite(z7)?String(Math.round(z7*10)/10):"","data-load-detail-ms":Number.isFinite(T7)?String(Math.round(T7*10)/10):"","data-load-transcript-rows":Number.isFinite(E7)?String(E7):"","data-load-task-id":String(Pf?.taskId||k||""),"data-load-partial":Pf?.partial?"true":"false"},K(il,{error:m6,wide:!0}),LK,K("div",{className:"codex-session-stage codex-session-stage-top"},qK),K("div",{className:"code-queue-layout"},K("div",{className:"codex-left-rail"},K(R1,{title:"提交任务",eyebrow:Ul?"Submitting...":q0.length>1?`${q0.length} tasks`:"Single or Batch",className:"codex-compose-panel",loading:Ul},K("form",{className:`codex-task-form ${Ul?"is-submitting":""}`,onSubmit:fK,"data-testid":"code-queue-task-form","aria-busy":Ul?"true":"false"},K("label",null,"Prompt / 多任务用单独一行 --- 分隔",K("textarea",{value:s,rows:8,disabled:Ul,onChange:(B)=>Nu(B.target.value),placeholder:"写入 Codex 任务;多个任务之间用 --- 分隔。"})),K("label",{className:"codex-reference-field"},"引用任务 ID(可选)",K("input",{value:Eu,disabled:Ul,onChange:(B)=>Hu(B.target.value),placeholder:"codex_...;支持空格/逗号分隔多个 ID","data-testid":"codex-reference-task-id"}),Li(Eu).length>0?K("code",null,`后端将解析并注入:${Li(Eu).join(" / ")}`):null),K("div",{className:"codex-form-grid"},K("label",{className:"codex-submit-queue-field"},"Queue",K("div",{className:"codex-submit-queue-row"},K("select",{className:"codex-submit-queue-select",value:vu,disabled:Ul,onChange:(B)=>ul(String(B.target.value||"default")),"data-testid":"code-queue-id-select"},qr.map((B)=>K("option",{key:String(B?.id||""),value:String(B?.id||"")},Mt(B)))),K("button",{type:"button",className:"ghost-btn codex-rename-queue-btn",onClick:()=>void eL(),disabled:Zl||Ul||!vu,title:"修改当前 queue 的显示名称,ID 不变","data-testid":"codex-rename-queue-button"},"改名"),K("button",{type:"button",className:"ghost-btn codex-merge-queue-btn",onClick:()=>uK(),disabled:Zl||Ul||on.length===0,title:"打开独立窗口选择源 queue 并合并到当前 queue;合并后自动删除源 queue","data-testid":"codex-merge-queue-button"},"合并 queue"),K("button",{type:"button",className:"ghost-btn codex-create-queue-btn",onClick:()=>void dL(),disabled:Zl||Ul,"data-testid":"codex-create-queue-button"},"创建 queue"))),K("label",null,"模型",K("select",{value:Jf,disabled:Ul,onChange:(B)=>pu(B.target.value),"data-testid":"codex-model-select"},Q7.map((B)=>K("option",{key:B,value:B},B)))),K("label",null,"执行 Provider",K("select",{value:Zf,disabled:Ul,onChange:(B)=>bL(String(B.target.value||"D601")),"data-testid":"codex-provider-select"},u$.map((B)=>K("option",{key:B.id,value:B.id},`${B.label||B.id} · ${B.defaultWorkdir||eA(pl,B.id)}${B.supportsWindowsNativeCodex?" · Windows native":""}`)))),K("label",null,"执行模式",K("select",{value:Au,disabled:Ul,onChange:(B)=>vL(String(B.target.value||"default")),"data-testid":"codex-execution-mode-select"},N7.map((B)=>K("option",{key:B.id,value:B.id},`${B.label||B.id}${B.id==="windows-native"?" · 宿主 Codex":""}`)))),K("label",null,"工作目录",K("input",{value:ff,disabled:Ul,onChange:(B)=>rf(B.target.value),placeholder:CL||pl?.defaultWorkdir||"/workspace","data-testid":"codex-cwd-input"})),K("label",null,"最大尝试",K("input",{type:"number",min:1,max:99,value:ur,disabled:Ul,onChange:(B)=>nf(Number(B.target.value)),"data-testid":"codex-max-attempts-input"})),K("label",null,"入队份数",K("input",{type:"number",min:1,max:50,value:Of,disabled:Ul,onChange:(B)=>N0(Number(B.target.value)),"data-testid":"codex-repeat-count-input"}))),By>1?K("label",{className:`codex-batch-confirm ${lr?"confirmed":""}`,"data-testid":"codex-batch-confirm-row"},K("input",{type:"checkbox",checked:lr,disabled:Ul,onChange:(B)=>k0(Boolean(B.target.checked)),"data-testid":"codex-batch-confirm-checkbox"}),K("span",null,`确认批量入队 ${By} 个任务(prompt 分段 ${h6.length} × 入队份数 ${rQ(Of)})`)):null,Ul?K("div",{className:"codex-submit-wait","data-testid":"codex-submit-wait"},"正在提交到后端,已锁定输入以防重复提交..."):null,K("div",{className:"codex-form-actions"},K("button",{type:"button",className:"ghost-btn",disabled:Zl||Ul||s.length===0&&Eu.length===0,onClick:()=>{Nu(""),Hu(""),k0(!1);let B="已清空任务输入栏";vl(B),fr("success",B)},"data-testid":"codex-clear-input-button"},"清空输入"),K("button",{type:"submit",className:"primary-btn",disabled:PL,"data-testid":"codex-enqueue-button"},Ul?"提交中,请等待...":J7?`请确认批量入队 ${By} 个任务`:q0.length>1?`批量入队 ${q0.length} 个任务`:"入队并运行"))))),K("div",{className:"codex-main-stage"},K("div",{className:"codex-detail-grid"},K(R1,{title:"运行控制",eyebrow:ai?"Queued prompt editable":b6?"Active turn steer":"Steer when running",loading:Zl},K("div",{className:"codex-run-control-stack"},K(qZ,{task:b,queueRows:qr,busy:Zl,onMove:tK}),b?.id?K("form",{className:"codex-steer-form codex-edit-prompt-form",onSubmit:nK,"data-testid":"codex-edit-prompt-form"},K("label",null,"编辑 queued 用户 prompt",K("textarea",{value:Yu,rows:5,onChange:(B)=>au(B.target.value),placeholder:"仅 QUEUED 且尚未开始运行的任务可在这里修改原始用户 prompt。",disabled:!ai||Zl,"data-testid":"codex-edit-prompt-textarea"})),K("label",{className:"codex-reference-field"},"引用任务 ID(可选,留空会清除引用)",K("input",{value:_l,disabled:!ai||Zl,onChange:(B)=>Pl(B.target.value),placeholder:"codex_...;支持空格/逗号分隔多个 ID","data-testid":"codex-edit-reference-task-id"}),Li(_l).length>0?K("code",null,`将保留/注入:${Li(_l).join(" / ")}`):null),K("div",{className:"codex-form-actions"},K("button",{type:"button",className:"ghost-btn",disabled:!b?.id||Zl,onClick:()=>{au(b?k3(b):""),Pl(Array.isArray(b?.referenceTaskIds)?b.referenceTaskIds.join(" "):"")},"data-testid":"codex-edit-prompt-reset"},"恢复当前值"),K("button",{type:"submit",className:"primary-btn",disabled:!ai||Zl||Yu.trim().length===0,title:ai?"保存后会重写尚未运行任务的用户 prompt":"只有 QUEUED 且尚未开始的任务可编辑 prompt","data-testid":"codex-edit-prompt-submit"},"保存 queued prompt"))):null,K("form",{className:"codex-steer-form",onSubmit:rK},K("label",null,"追加 prompt",K("textarea",{value:fu,rows:4,onChange:(B)=>Bu(B.target.value),placeholder:"给正在运行的 Codex session 推入新的指令或纠偏。",disabled:!b6})),K("button",{type:"submit",className:"primary-btn",disabled:!b6||Zl||fu.trim().length===0,"data-testid":"codex-steer-button"},"推入运行中 session")))),K(R1,{title:"完成判定",eyebrow:b?.lastJudge?b.lastJudge.source:"judge",loading:g},b?.lastJudge?K("div",{className:"codex-judge-card","data-testid":"codex-task-judge-card"},K(zi,{status:b.lastJudge.decision},b.lastJudge.decision),K("strong",null,`${Math.round(Number(b.lastJudge.confidence||0)*100)}% confidence`),K("p",{"data-testid":"codex-task-judge-reason"},MA(b.lastJudge.reason||"--",180)),K(zQ,{judge:b.lastJudge,testId:"codex-task-judge-failure-details"}),b.lastJudge.continuePrompt?K("code",{"data-testid":"codex-task-judge-continue-prompt"},MA(b.lastJudge.continuePrompt,160)):null):K(Ti,{title:"尚未判定",text:"Codex turn 结束后会由 MiniMax M2.7 或 fallback judge 判定 complete/retry/fail;retry 会在已有 thread 追加继续执行 prompt。"}))),K(NZ,{stats:P6,queueName:g0,onRaw:l}),K(R1,{title:"Attempts",eyebrow:"terminal vs interruption",loading:g},K(TZ,{task:b})))))}var bt=Pu(Jl(),1);var Vu=bt.default.createElement,{useEffect:u2}=bt.default,l2=bt.default.useState,EZ=bt.default.useRef,r2=` +本次任务:`,r=l.indexOf(f);if(r===-1)return u;return l.slice(r+f.length).trimStart()}function Vi(u){return u.length>0?u.split(/\r\n|\r|\n/u).length:0}function DQ(u){let l=String(u?.displayPrompt||"");if(l.length>0)return l;let f=String(u?.prompt||"");return vE(bE(f).userPrompt)}function Ur(u){return u?._traceSummary&&typeof u._traceSummary==="object"&&!Array.isArray(u._traceSummary)?u._traceSummary:null}function o$(u){return u?._promptDetails&&typeof u._promptDetails==="object"&&!Array.isArray(u._promptDetails)?u._promptDetails:{}}function t2(u){let l=Ur(u)?.prompt;return l&&typeof l==="object"&&!Array.isArray(l)?l:{}}function pQ(u){let l=Ur(u)?.execution;return l&&typeof l==="object"&&!Array.isArray(l)?l:{}}function qQ(u){let l=Number(u);return Number.isFinite(l)&&l>=0?Math.floor(l):0}function Mn(u){let l=Number(u);return Number.isFinite(l)&&l>=0?Math.floor(l):null}function SQ(u){let l=Wl(u?.traceStats);if(l&&(u?.statsSource==="oa-event-flow"||l.source==="oa-event-flow"))return l;let f=Ur(u),r=Wl(f?.traceStats);if(r&&(f?.statsSource==="oa-event-flow"||r.source==="oa-event-flow"))return r;return null}function kE(u,l){let f=Wl(l?.traceStats)||Wl(l?.execution?.traceStats),r=String(l?.statsSource||l?.execution?.statsSource||"");if(f&&(r==="oa-event-flow"||f.source==="oa-event-flow"))return f;return null}function IE(u,l){return Mn(SQ(u)?.[l])}function XQ(u){let l=IE(u,"stepCount");if(l!==null)return l;let f=Ur(u);if(f!==null)return gE(f);return null}function gE(u){let l=Wl(u?.traceStats);if(!l||u?.statsSource!=="oa-event-flow"&&l.source!=="oa-event-flow")return null;return Mn(l.stepCount)}function k$(u){if(!u||u?._traceSummaryLoaded!==!0)return!1;let l=Ur(u),f=String(u?._traceSummaryUpdatedAt||l?.updatedAt||""),r=String(u?.updatedAt||"");if(r.length>0){let n=Rn(f),i=Rn(r);if(n!==null&&i!==null){if(n+10?f:DQ(u)}function YQ(u){let l=Ur(u);return String(l?.finalResponse||u?.finalResponse||"").trimEnd()}function PQ(u){let f=Ur(u)?.lastJudge||u?.lastJudge;return f&&typeof f==="object"&&!Array.isArray(f)?f:null}function Wl(u){return u&&typeof u==="object"&&!Array.isArray(u)?u:null}function sE(u){let l=Wl(u?.raw),f=Wl(u?.failureDetails)||Wl(l?.minimaxFailure);if(f===null)return"";let r=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",r],["errorName",f.errorName],["error",f.errorMessage],["responseContentPreview",f.responseContentPreview],["responseTextPreview",f.responseTextPreview]].filter(([,i])=>i!==void 0&&i!==null&&String(i).length>0).map(([i,t])=>`${i}: ${String(t)}`).join(` +`)}function CQ({judge:u,testId:l="codex-judge-failure-details"}){let f=sE(u);if(f.length===0)return null;return T("details",{className:"codex-judge-failure-details","data-testid":l},T("summary",null,"MiniMax failure details"),T("pre",null,f))}function aE(u){let l=Ur(u)?.attempts;if(Array.isArray(l)&&l.length>0)return l;let f=pQ(u),r=YQ(u),n=PQ(u);if(Object.keys(f).length===0&&r.length===0&&n===null)return[];return[{index:Number(u?.currentAttempt||1),mode:u?.currentMode||"initial",startedAt:u?.startedAt,finishedAt:u?.finishedAt,terminalStatus:u?.status,execution:f,finalResponse:r,finalResponseChars:r.length,judge:n}]}function oE(u,l){return Wl(l?.execution)||pQ(u)}function dE(u,l,f,r){let n=Ur(u),i=Number(n?.currentAttempt||u?.currentAttempt||0),t=Number(f),y=Number.isFinite(t)&&t>0&&t===i,c=BQ(u?.updatedAt,n?.updatedAt);if(y&&!l?.finishedAt&&c.length>0)return c;return String(l?.updatedAt||l?.finishedAt||r.effectiveEndAt||(y?c:"")||c||u?.finishedAt||u?.startedAt||"")}function eE(u,l){let f=String(l?.finalResponse||l?.finalResponsePreview||"");if(Object.prototype.hasOwnProperty.call(l||{},"finalResponse")||Object.prototype.hasOwnProperty.call(l||{},"finalResponsePreview"))return f.trimEnd();return f.length>0?f.trimEnd():YQ(u)}function MQ(u,l){if(Object.prototype.hasOwnProperty.call(l||{},"judge"))return Wl(l?.judge);return PQ(u)}function uO(u,l,f){if(!QO(u))return!1;if(y2(l,f))return!1;if(l?.finishedAt)return!1;if(["succeeded","failed","canceled"].includes(String(l?.terminalStatus||"")))return!1;let r=Ur(u),n=Number(r?.currentAttempt||u?.currentAttempt||0),i=Number(f);if(Number.isFinite(i)&&i>0&&Number.isFinite(n)&&n>0)return i===n;return!0}function RQ(u){return`feedback:${String(u||"latest")}`}function lO(u,l,f){let r=String(l?.feedbackPrompt||"").trimEnd(),n=String(l?.feedbackPromptPreview||r||"").trimEnd(),i=Number(l?.feedbackPromptChars||r.length||n.length||0),t=Number(l?.feedbackPromptLines||Vi(r||n));if(r.length>0||n.length>0||i>0)return{text:r,preview:n,chars:i,lines:t,source:l?.feedbackPromptSource||"judge-feedback",forAttempt:l?.feedbackPromptForAttempt||Number(f||0)+1,truncated:Boolean(l?.feedbackPromptTruncated)};let y=MQ(u,l),c=String(y?.continuePrompt||"").trimEnd();if(y?.decision==="retry"&&c.length>0)return{text:"",preview:c,chars:c.length,lines:Vi(c),source:"judge-continue-prompt",forAttempt:Number(f||0)+1,truncated:!1};return null}function fO(u){let l=t2(u);return Boolean(l.hasReferenceInjection||Number(l.referencePromptChars||0)>0||u?.referenceInjection||u?.referenceInjectionSummary)}function hQ(u,l=null){if(l!==null&&l!==void 0){let r=(Wl(u?._traceStepsByAttempt)||{})[String(l)];return Array.isArray(r)?r:[]}return Array.isArray(u?._traceSteps)?u._traceSteps:[]}function e4(u){let f=[u?.seq,...Array.isArray(u?.rawSeqs)?u.rawSeqs:[]].map((r)=>Number(r)).filter((r)=>Number.isFinite(r));return f.length>0?Math.max(...f):0}function rO(u){return(Array.isArray(u)?u:[]).reduce((l,f)=>Math.max(l,e4(f)),0)}function nO(u,l){let f=new Map;for(let r of[...Array.isArray(u)?u:[],...Array.isArray(l)?l:[]]){let n=String(r?.seq??`${r?.title||"step"}:${r?.at||""}`);f.set(n,{...f.get(n)||{},...r})}return Array.from(f.values()).sort((r,n)=>e4(r)-e4(n))}function dt(u){return(Array.isArray(u?.summaryLines)?u.summaryLines:[]).map((l)=>String(l||""))}function iO(u){let l=String(u?.kind||"").trim().toLowerCase(),f=String(u?.status||"").trim().toLowerCase();return l==="error"||f==="error"}function d$(u){let l=String(u?.status||"").trim();if(l.length>0)return l;let f=dt(u).join(` +`);return/^(item\/[A-Za-z]+(?:\/[A-Za-z]+)?):/u.exec(f)?.[1]||""}function wQ(u){return/^item\/(?:started|completed): file changes status=/u.test(String(u||"").trim())}function tO(u){let l=dt(u);for(let r=l.length-1;r>=0;r-=1){let n=/file changes status=([A-Za-z0-9_-]+)/u.exec(l[r]||"")?.[1];if(n)return n}let f=d$(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 yO(u){if(String(u?.kind||"")!=="edited")return!1;let l=String(u?.title||""),f=String(u?.status||""),r=dt(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(r))return!0;if(/^Success\. Updated the following files:/mu.test(r))return!0;if(/^diff --git /mu.test(r))return!0;return/^([AMDRCU?]{1,2})\s+\S+/mu.test(r)}function cO(u){if(u.length<=1)return u[0];let l=u.find((i)=>d$(i)==="item/fileChange/outputDelta")||u.find((i)=>dt(i).some((t)=>!wQ(t)))||u.at(-1)||u[0],f=u.flatMap((i)=>Array.isArray(i?.rawSeqs)?i.rawSeqs:[i?.seq]).filter((i)=>i!==void 0),r=u.flatMap(dt).filter((i)=>i.trim().length>0&&!wQ(i)),n=u[u.length-1]||l;return{...l,at:l?.at||n?.at,title:String(l?.title||"Edited files"),status:tO(n),summaryLines:r.length>0?r:dt(l),rawSeqs:f}}function _O(u){let l=Array.isArray(u)?u:[],f=[],r=[],n=()=>{if(r.length>0)f.push(cO(r));r=[]};for(let i of l){if(yO(i)){if(d$(i)==="item/started"&&r.length>0)n();if(r.push(i),d$(i)==="item/completed")n();continue}n(),f.push(i)}return n(),f}function $O(u){return{...u}}function u2(u,l=null){if(l!==null&&l!==void 0){let f=Wl(u?._traceStepsLoadedByAttempt)||{};return Boolean(f[String(l)])}return Boolean(u?._traceStepsLoaded)}function l2(u){return u?._traceStepDetails&&typeof u._traceStepDetails==="object"&&!Array.isArray(u._traceStepDetails)?u._traceStepDetails:{}}function AO(u,l){let f=Number(u?.index);return Number.isFinite(f)?f:l+1}function y2(u,l){return Boolean(u?.synthetic)||Number(l)<=0}function e$(u){let l=Number(u);return Number.isFinite(l)?String(l):void 0}function jO(u){let l=u?.timing&&typeof u.timing==="object"?u.timing:{},f=String(u?.status||"");if(["queued"].includes(f))return`等待 ${ar(l.queueWaitMs??l.totalElapsedMs)}`;if(["running","judging","retry_wait"].includes(f))return`耗时 ${ar(l.durationMs??l.totalElapsedMs)}`;return`耗时 ${ar(l.durationMs??l.totalElapsedMs)}`}function I1(u){return String(u?.queueId||"default")}function xQ(u){return Wl(u?.queuedReason)}function bQ(u){let l=String(u?.queuedReasonLabel||"").trim();if(l.length>0)return l.toUpperCase();let f=xQ(u),r=String(f?.label||"").trim();return r.length>0?r.toUpperCase():""}function FO(u){let l=String(u?.status||"unknown");if(l!=="queued")return l;let f=bQ(u);return f.length>0?`QUEUED(${f})`:"QUEUED"}function UO(u){if(String(u?.status||"")!=="queued")return;let l=xQ(u),f=String(l?.message||"").trim(),r=bQ(u);if(f.length>0&&r.length>0)return`${r}: ${f}`;if(f.length>0)return f;return r.length>0?r:void 0}function JO(u){return{system:"SYS",user:"YOU",assistant:"GPT",reasoning:"THINK",command:"CMD",diff:"DIFF",tool:"TOOL",error:"ERR"}[u]||u.toUpperCase()}function WQ(u){return["running","judging","retry_wait"].includes(String(u?.status||""))}function QO(u){return String(u?.status||"")==="running"}function sr(u){return["succeeded","failed","canceled"].includes(String(u?.status||""))}function vQ(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 Cn(u){if(!sr(u))return!1;if(u?.terminalUnread===!0)return!0;if(u?.terminalUnread===!1)return!1;return!u?.readAt}function bl(u){let l=Number(u||0);return Number.isFinite(l)?l:0}function NO(u){return bl(u.queued)+bl(u.retry_wait)}function qO(u){return bl(u.running)+bl(u.judging)}function wO(u,l){return Wl(u?.statistics)||Wl(l?.statistics)||{}}function WO(u){return Array.isArray(u?.daily)?u.daily:[]}function LO(u){return Wl(u?.totals)||{}}function c2(u,l){let f=Number(u?.[l]??0);return Number.isFinite(f)&&f>0?f:0}function k4(u,l){return u.reduce((f,r)=>Math.max(f,c2(r,l)),0)}var mi=700,LQ=220,D0=30,at=24,g1=184,f2=g1-at;function kQ(u,l){if(l<=1)return mi/2;return D0+u*(mi-D0*2)/(l-1)}function IQ(u,l){let f=l>0?l:1;return g1-Math.min(1,u/f)*f2}function I4(u,l,f){let r=u.length>0?u:[{[l]:0}],n=r.length>1?r:[r[0],r[0]];return n.map((i,t)=>`${kQ(t,n.length).toFixed(2)},${IQ(c2(i,l),f).toFixed(2)}`).join(" ")}function Pn(u){let l=String(u||"");return/^\d{4}-\d{2}-\d{2}$/u.test(l)?l.slice(5):l||"--"}function I$(u){if(!u)return"";return`${String(u.seriesKey||"")}:${String(u.row?.date||u.index||"")}`}function TO(u,l,f,r){let n=c2(u,r.key);return{...r,row:u,index:l,value:n,valueLabel:r.format(n),x:kQ(l,f),y:IQ(n,r.max),seriesKey:r.key}}function TQ(u){if(Cn(u))return 0;return{running:1,judging:2,retry_wait:3,queued:4,succeeded:8,failed:8,canceled:8}[String(u?.status||"")]??9}function b1(u){if(!u)return!1;if(u?._traceSummaryLoaded===!0)return!1;return u?.summaryOnly===!0||u?._metaLoaded!==!0}function KO(u){return Boolean(u?._metaLoaded)||u?.summaryOnly===!1}function GO(u,l,f){let r=String(u?.[f]||""),n=String(l?.[f]||"");return r.length>n.length?r:n}function r2(u,l,f){let r=Array.isArray(u?.[f])?u[f]:[],n=Array.isArray(l?.[f])?l[f]:[];if(n.length===0&&r.length>0)return r;return r.length>n.length?r:n}function KQ(u,l){let f=l?.summaryOnly===!0&&KO(u),r={...u,...l};if(!f)return r;for(let n of["prompt","basePrompt","displayPrompt","finalResponse"])r[n]=GO(u,l,n);for(let n of["promptHistory","attempts","output","events"])r[n]=r2(u,l,n);if(u?.referenceInjection?.items&&!l?.referenceInjection?.items)r.referenceInjection=u.referenceInjection;if(u?.referenceInjectionSummary&&!l?.referenceInjectionSummary)r.referenceInjectionSummary=u.referenceInjectionSummary;r.summaryOnly=u?.summaryOnly===!1?!1:l.summaryOnly,r._metaLoaded=u?._metaLoaded,r._detailLoaded=u?._detailLoaded,r._transcriptComplete=u?._transcriptComplete,r._transcriptPreview=Object.prototype.hasOwnProperty.call(l,"_transcriptPreview")?l._transcriptPreview:u?._transcriptPreview;for(let n of["_traceSummary","_traceSummaryLoaded","_traceSteps","_traceStepsLoaded","_traceStepsByAttempt","_traceStepsLoadedByAttempt","_traceStepsNextAfterSeqByAttempt","_traceStepDetails","_promptDetails"])if(!Object.prototype.hasOwnProperty.call(l,n)&&Object.prototype.hasOwnProperty.call(u||{},n))r[n]=u[n];return r}function GQ(u){let l=u?.selected,f=l?.task&&typeof l.task==="object"?l.task:null;if(f!==null){let n=Boolean(l?.preview);return{...f,transcript:Array.isArray(l?.transcript)?l.transcript:[],_detailLoaded:Array.isArray(l?.transcript)&&l.transcript.length>0,_transcriptComplete:Boolean(!n&&!l?.hasMore&&sr(f)),_transcriptPreview:n,_summaryLoaded:!0}}let r=Ml(u)[0];return r?{...r,_summaryLoaded:!0}:null}function g4(u,l){let f=new Map;for(let r of[...Array.isArray(u)?u:[],...Array.isArray(l)?l:[]]){let n=`${Number(r?.seq??0)}:${String(r?.kind||"message")}`,i=f.get(n);if(!i){f.set(n,r);continue}let t={...i,...r};for(let[y,c]of[["bodyPreview","bodyOmittedLines"],["commandPreview","commandOmittedLines"]]){let $=String(i?.[y]||""),A=String(r?.[y]||"");if($.length>A.length)t[y]=i[y],t[c]=i[c]}f.set(n,t)}return Array.from(f.values()).sort((r,n)=>Number(r?.seq??0)-Number(n?.seq??0))}function g$(u){return(Array.isArray(u)?u:[]).reduce((l,f)=>Math.max(l,Number(f?.seq??0)),0)}function zQ(u,l=8){let f=Array.from(new Set((Array.isArray(u)?u:[]).map((n)=>Number(n?.seq??0)).filter((n)=>Number.isFinite(n)&&n>0))).sort((n,i)=>n-i);if(f.length===0)return 0;let r=f[Math.max(0,f.length-l)]??0;return Math.max(0,r-0.001)}function zO(u,l){let f=Array.isArray(u?.codeModels)?u.codeModels:Array.isArray(u?.codexModels)?u.codexModels:[],r=["gpt-5.5","gpt-5.4-mini","gpt-5.4","minimax-m2.7"];return Array.from(new Set([...f,...r,l].map((n)=>String(n||"").trim()).filter(Boolean)))}function EO(u,l){let r=(Array.isArray(u?.executionProviders)?u.executionProviders:[]).map((t)=>({id:String(t?.id||"").trim(),label:String(t?.label||t?.id||"").trim(),defaultWorkdir:String(t?.defaultWorkdir||"").trim(),supportsWindowsNativeCodex:t?.supportsWindowsNativeCodex===!0,windowsNativeDefaultWorkdir:String(t?.windowsNativeDefaultWorkdir||"").trim(),kind:String(t?.kind||"").trim()})).filter((t)=>t.id.length>0),n=String(u?.mainProviderId||u?.defaultProviderId||"D601").trim()||"D601",i=new Map;for(let t of[...r,{id:n,label:`${n} (local)`,defaultWorkdir:String(u?.defaultWorkdir||"/workspace"),supportsWindowsNativeCodex:!1,windowsNativeDefaultWorkdir:"",kind:"local"},l?{id:l,label:l,defaultWorkdir:_2(u,l),supportsWindowsNativeCodex:l!==n,windowsNativeDefaultWorkdir:String(u?.windowsNativeCodexDefaultWorkdir||"/mnt/f/Work/ConStart"),kind:""}:null].filter(Boolean))if(!i.has(t.id))i.set(t.id,t);return Array.from(i.values())}function OO(u,l){let r=(Array.isArray(u?.executionModes)?u.executionModes:[]).map((t)=>({id:String(t?.id||t?.kind||"").trim(),label:String(t?.label||t?.id||t?.kind||"").trim(),description:String(t?.description||"").trim(),defaultWorkdir:String(t?.defaultWorkdir||"").trim(),requiresProvider:t?.requiresProvider===!0,requiresWindowsCwd:t?.requiresWindowsCwd===!0})).filter((t)=>t.id.length>0),n=[{id:"default",label:"默认容器/本机",description:"Code Queue 所在节点用本机 Codex;远程 Provider 用执行容器 Codex。",defaultWorkdir:"",requiresProvider:!1,requiresWindowsCwd:!1},{id:"windows-native",label:"Windows 原生 Codex",description:"启动执行容器,但容器只做 stdio relay,Codex 运行在 Provider 的 Windows 宿主。",defaultWorkdir:String(u?.windowsNativeCodexDefaultWorkdir||"/mnt/f/Work/ConStart"),requiresProvider:!0,requiresWindowsCwd:!0}],i=new Map;for(let t of[...r,...n,l?{id:l,label:l,description:"",defaultWorkdir:"",requiresProvider:l==="windows-native",requiresWindowsCwd:l==="windows-native"}:null].filter(Boolean))if(!i.has(t.id))i.set(t.id,t);return Array.from(i.values())}function s$(u,l,f){if(l!=="windows-native")return _2(u,f);let r=Array.isArray(u?.executionModes)?u.executionModes.find((i)=>String(i?.id||i?.kind||"")==="windows-native"):null,n=Array.isArray(u?.executionProviders)?u.executionProviders.find((i)=>String(i?.id||"")===f):null;return String(n?.windowsNativeDefaultWorkdir||r?.defaultWorkdir||u?.windowsNativeCodexDefaultWorkdir||"/mnt/f/Work/ConStart")}function _2(u,l){let f=String(l||"").trim(),r=u?.defaultWorkdirByProvider&&typeof u.defaultWorkdirByProvider==="object"?u.defaultWorkdirByProvider:{};if(typeof r[f]==="string"&&String(r[f]).trim().length>0)return String(r[f]).trim();let n=Array.isArray(u?.executionProviders)?u.executionProviders.find((t)=>String(t?.id||"")===f):null;if(typeof n?.defaultWorkdir==="string"&&n.defaultWorkdir.trim().length>0)return n.defaultWorkdir.trim();let i=String(u?.mainProviderId||u?.defaultProviderId||"D601");return f===i?String(u?.defaultWorkdir||"/workspace"):String(u?.remoteDefaultWorkdir||"/home/ubuntu")}function ZO(u){return XQ(u)}function HO({task:u,selected:l,onSelect:f,onCopy:r,onReference:n,onMarkRead:i,copied:t,markingRead:y}){let c=u?.lastJudge||{},$=String(u?.id||""),A=Cn(u),j=BQ(u?.updatedAt,Ur(u)?.updatedAt),F=`最近更新: ${HQ(j)}`,J=ZO(u),Q=J===null?"--":String(J),W=J===null?"STEP 统计中心同步中":"STEP 来自 OA Event Flow 统计中心";return T("article",{role:"button",tabIndex:0,className:`codex-task-card ${l?"selected":""} ${A?"unread-terminal":""}`,onClick:f,onKeyDown:(L)=>{if(L.key==="Enter"||L.key===" ")L.preventDefault(),f()},"data-unread-terminal":A?"true":"false","data-testid":`codex-task-${u?.id||"unknown"}`},A?T("span",{className:"codex-unread-badge",title:"待读","aria-label":"待读","data-testid":`codex-unread-task-${$||"unknown"}`}):null,T("div",{className:"codex-task-card-head"},T("div",{className:"codex-task-status-line"},T(Di,{status:u?.status,title:UO(u)},FO(u))),T("span",{className:"mono-text"},`${u?.currentAttempt||0}/${u?.maxAttempts||0}`)),T("div",{className:"codex-task-id-row"},T("code",{title:$},$||"unknown"),T("div",{className:"codex-task-id-actions"},T("button",{type:"button",className:"codex-copy-id-btn",onClick:(L)=>{L.stopPropagation(),n($)},"data-testid":`codex-reference-task-${$||"unknown"}`},"引用"),T("button",{type:"button",className:"codex-copy-id-btn",onClick:(L)=>{L.stopPropagation(),r($)},"data-testid":`codex-copy-task-id-${$||"unknown"}`},t?"已复制":"复制ID"),A?T("button",{type:"button",className:"codex-copy-id-btn codex-mark-read-btn",disabled:Boolean(y),onClick:(L)=>{L.stopPropagation(),i($)},"data-testid":`codex-mark-task-read-${$||"unknown"}`},y?"标记中":"标为已读"):null)),T("strong",null,a4(DQ(u),120)||"空任务"),T("div",{className:"codex-task-meta"},T("span",null,`queue=${I1(u)}`),T("span",null,`provider=${u?.providerId||"D601"}`),T("span",null,`mode=${u?.executionMode||"default"}`),T("span",null,u?.model||"--"),T("span",null,jO(u))),T("div",{className:"codex-task-meta codex-task-update-meta"},T("span",{className:"codex-task-recent-update codex-task-step-count",title:W,"data-testid":`codex-task-step-count-${$||"unknown"}`},`STEP ${Q}`),T("span",{className:"codex-task-recent-update",title:j?`更新时间: ${wu(j)}`:F,"data-testid":`codex-task-recent-update-${$||"unknown"}`},F),T("span",null,wu(j||u?.updatedAt))),vQ(u)?T("div",{className:"codex-judge-line","data-testid":`codex-task-prompt-editable-${$||"unknown"}`},"queued prompt 可编辑"):null,c?.decision?T("div",{className:"codex-judge-line"},`judge=${c.decision} ${Math.round(Number(c.confidence||0)*100)}%`):null)}function s4({title:u,tasks:l,selectedId:f,onSelect:r,onCopy:n,onReference:i,onMarkRead:t,copiedTaskId:y,markingReadTaskId:c,emptyText:$}){let A=Array.isArray(l)?l:[];return T("section",{className:"codex-task-section"},T("div",{className:"codex-task-section-head"},T("span",null,u),T("code",null,String(A.length))),A.length===0?T("p",{className:"codex-task-section-empty"},$):T("div",{className:"codex-task-section-list"},A.map((j)=>T(HO,{key:j.id,task:j,selected:f===j.id,onSelect:()=>r(j.id),onCopy:n,onReference:i,onMarkRead:t,copied:y===j.id,markingRead:c===j.id}))))}function BO(){return T("span",{className:"codex-stats-icon","aria-hidden":"true"},T("svg",{viewBox:"0 0 36 24",focusable:"false"},T("path",{className:"grid",d:"M3 20.5H33M3 12.5H33M3 4.5H33"}),T("polyline",{className:"line tasks",points:"3,18 9,14 15,15 21,8 27,10 33,4"}),T("polyline",{className:"line retry",points:"3,20 9,17 15,18 21,13 27,14 33,9"})))}function mO({stats:u,queueName:l,onRaw:f}){let r=WO(u),n=LO(u),i=r.at(-1)||{},t=k4(r,"executedTasks"),y=k4(r,"retryAttempts"),c=k4(r,"avgDurationMs"),$=r.length>0,A=Wl(u?.range)||{},[j,F]=gu(null),[J,Q]=gu(null),W=[];if(t>0)W.push(`tasks ${t}`);if(y>0)W.push(`retry ${y}`);if(c>0)W.push(`avg ${ar(c)}`);let L=[{key:"executedTasks",className:"tasks",label:"执行任务",max:t,format:(E)=>`${bl(E)} tasks`},{key:"retryAttempts",className:"retry",label:"重试次数",max:y,format:(E)=>`${bl(E)} retries`},{key:"avgDurationMs",className:"duration",label:"平均耗时",max:c,format:(E)=>ar(E)}],U=j||J,q=I$(U),N=String(U?.row?.date||""),w=U?{left:`${Math.max(8,Math.min(92,Number(U.x)/mi*100))}%`,top:`${Math.max(14,Math.min(86,Number(U.y)/LQ*100))}%`}:void 0;V0(()=>{F(null),Q(null)},[l,A.startDate,A.endDate,r.length]);let G=(E)=>{F(E)},Z=(E)=>{let V=I$(E);Q((S)=>I$(S)===V?null:E),F(E)},H=L.flatMap((E)=>r.map((V,S)=>{let B=TO(V,S,r.length,E),D=I$(B),X=q===D,O=String(V?.date||`day-${S}`),Y=`${Pn(O)} ${E.label}: ${B.valueLabel}`;return T("g",{key:`${E.key}-${O}`,className:`stat-point-group ${E.className} ${X?"active":""}`,role:"button",tabIndex:0,"aria-label":Y,"data-testid":`codex-stats-point-${E.className}-${O}`,onMouseEnter:()=>G(B),onFocus:()=>G(B),onClick:()=>Z(B),onKeyDown:(p)=>{if(p.key==="Enter"||p.key===" ")p.preventDefault(),Z(B)}},T("circle",{className:"stat-hit-point",cx:B.x,cy:B.y,r:13}),T("circle",{className:`stat-point ${E.className} ${X?"active":""}`,cx:B.x,cy:B.y,r:X?5.6:4.2}))}));return T(st,{title:"统计曲线",eyebrow:`Daily task stats / ${l}`,className:"codex-stats-panel",summary:T("span",null,`${Pn(A.startDate)} -> ${Pn(A.endDate)} · ${u?.timezone||"Asia/Shanghai"}`),actions:Wl(u)?T(mQ,{title:"Code Queue Stats",data:u,onOpen:f,testId:"raw-codex-stats"}):null},T("div",{className:"codex-stats-hero","data-testid":"codex-stats-panel"},T(BO),T("div",null,T("strong",null,`${bl(n.executedTasks)} tasks / ${bl(n.retryAttempts)} retries`),T("span",null,`平均完成耗时 ${ar(n.avgDurationMs??void 0)} · 终态 ${bl(n.completedTasks)} 个`))),$?T("div",{className:"codex-stats-chart","data-testid":"codex-stats-chart",onMouseLeave:()=>F(null)},T("svg",{viewBox:`0 0 ${mi} ${LQ}`,preserveAspectRatio:"none",role:"img","aria-label":"Code Queue daily task statistics"},T("line",{className:"axis",x1:D0,x2:mi-D0,y1:g1,y2:g1}),T("line",{className:"grid",x1:D0,x2:mi-D0,y1:at+f2/2,y2:at+f2/2}),T("line",{className:"grid",x1:D0,x2:mi-D0,y1:at,y2:at}),T("polyline",{className:"stat-line tasks",points:I4(r,"executedTasks",t)}),T("polyline",{className:"stat-line retry",points:I4(r,"retryAttempts",y)}),T("polyline",{className:"stat-line duration",points:I4(r,"avgDurationMs",c)}),U?T("g",{className:"stat-cursor-layer","data-testid":"codex-stats-active-point"},T("line",{className:"stat-cursor",x1:U.x,x2:U.x,y1:at,y2:g1}),T("circle",{className:`stat-point-active ${U.className}`,cx:U.x,cy:U.y,r:8})):null,T("g",{className:"stat-point-layer"},H)),U?T("div",{className:"codex-stats-tooltip active",style:w,"data-testid":"codex-stats-tooltip"},T("b",null,Pn(U.row?.date)),T("span",null,`${U.label} · ${U.valueLabel}`),T("code",null,`${bl(U.row?.executedTasks)} exec / ${bl(U.row?.retryAttempts)} retry / ${ar(U.row?.avgDurationMs??void 0)}`)):null,T("div",{className:"codex-stats-legend"},T("span",{className:"tasks"},"执行任务"),T("span",{className:"retry"},"重试次数"),T("span",{className:"duration"},"平均耗时")),T("div",{className:"codex-stats-scale"},T("span",null,Pn(r[0]?.date)),T("span",null,W.join(" · ")||"暂无峰值"),T("span",null,Pn(r.at(-1)?.date))),T("div",{className:`codex-stats-focus ${U?"active":""}`,"data-testid":"codex-stats-focus"},U?T(s1.default.Fragment,null,T("div",null,T("strong",null,Pn(U.row?.date)),T("span",null,`${U.label} · ${U.valueLabel}`)),T("div",{className:"codex-stats-focus-metrics"},T("code",null,`${bl(U.row?.executedTasks)} exec`),T("code",null,`${bl(U.row?.retryAttempts)} retry`),T("code",null,ar(U.row?.avgDurationMs??void 0)))):T("span",null,"将鼠标悬停到曲线数据点查看明细,点击数据点可固定。"))):T(pi,{title:"暂无统计",text:"任务开始执行后会生成按天汇总的曲线。"}),T("div",{className:"codex-stats-summary-grid"},T("article",null,T("span",null,"今日执行"),T("strong",null,String(bl(i.executedTasks))),T("code",null,Pn(i.date))),T("article",null,T("span",null,"今日重试"),T("strong",null,String(bl(i.retryAttempts))),T("code",null,`累计 ${bl(n.retryAttempts)}`)),T("article",null,T("span",null,"平均耗时"),T("strong",null,ar(n.avgDurationMs??void 0)),T("code",null,`${bl(n.durationSamples)} samples`))),T("div",{className:"codex-stats-daily-list","data-testid":"codex-stats-daily-list"},r.slice(-7).map((E)=>T("div",{key:String(E?.date||""),className:`codex-stats-daily-row ${N===String(E?.date||"")?"active":""}`,"data-testid":`codex-stats-day-${String(E?.date||"unknown")}`},T("span",null,Pn(E?.date)),T("b",null,`${bl(E?.executedTasks)} exec`),T("b",null,`${bl(E?.retryAttempts)} retry`),T("code",null,ar(E?.avgDurationMs??void 0))))))}function VO({task:u,queueRows:l,busy:f,onMove:r}){let n=String(u?.id||""),i=I1(u),[t,y]=gu(i);V0(()=>{y(i)},[n,i]);let c=!n||f||["running","judging","retry_wait"].includes(String(u?.status||""));return T("div",{className:"codex-task-move-control","data-testid":"codex-task-queue-move-control"},T("label",null,"任务 queue",T("select",{value:t,disabled:!n||f,onChange:($)=>y(String($.target.value||i)),"data-testid":"codex-task-queue-move-select"},l.map(($)=>T("option",{key:String($?.id||""),value:String($?.id||"")},k1($))))),T("button",{type:"button",className:"ghost-btn",disabled:c||t===i,onClick:()=>r(t),title:c?"运行中 / judging / retry_wait 的任务不能移动;请先打断或等当前 turn 结束":"移动已创建任务到另一个 queue","data-testid":"codex-task-queue-move-button"},"移动"))}function EQ(u,l=4){let f=(Array.isArray(u)?u:[]).map((n)=>String(n||"").trim()).filter(Boolean);if(f.length===0)return"--";let r=f.slice(0,l).join(" / ");return f.length>l?`${r} +${f.length-l}`:r}function DO({task:u,loading:l,onLoadPromptPart:f,testId:r="codex-initial-prompt-full",textTestId:n="codex-initial-prompt-full-text",baseTextTestId:i="codex-initial-prompt-base"}){let t=t2(u),y=o$(u),c=a$(u).trimEnd(),$=String(y.full?.text||""),A=fO(u),j=Number(t.promptChars||u?.promptChars||$.length),F=Number(t.basePromptLines||Vi(c)),J=Number(t.promptLines||Vi($));return T("section",{className:"codex-progressive-card codex-progressive-prompt","data-testid":"codex-progressive-prompt"},T("div",{className:"codex-progressive-card-head"},T("span",{className:"codex-output-channel"},"Prompt"),T("strong",null,"Submitted prompt / 原始用户 prompt"),T("code",null,`${F||Vi(c)} lines / ${c.length} chars`)),T("pre",{className:"codex-prompt-full","data-testid":i},c||"空 prompt"),A?T("details",{className:"codex-reference-injection codex-progressive-full-prompt","data-testid":r,onToggle:(Q)=>{if(Q.currentTarget?.open&&!$)f?.("full")}},T("summary",null,T("span",null,"引用注入已折叠,点击按需拉取最终进入 Code agent 的完整 prompt"),T("code",null,$?`${J||Vi($)} lines / ${$.length} chars`:`${Number.isFinite(j)&&j>0?j:"--"} chars`)),T("pre",{className:"codex-prompt-full codex-prompt-final-full","data-testid":n},$||(l?"正在按需拉取完整 prompt...":"展开后将只请求 full prompt,不拉取完整 transcript。"))):null)}function gQ({task:u,attempt:l,attemptIndex:f,loading:r,onLoadSteps:n,onLoadStep:i,testId:t="codex-execution-summary"}){let y=_O(hQ(u,f)),c=$O(oE(u,l)),$=l?kE(u,l):SQ(u),A=l2(u),j=u2(u,f),F=Mn($?.errorCount),J=Mn($?.stepCount??$?.llmStepCount),Q=Mn($?.readCount),W=Mn($?.editCount),L=Mn($?.runCount),U=Mn($?.stepCount??$?.llmStepCount),q=J===null?"--":String(J),N=U===null?"--":String(U),w=Array.isArray(c.editedFiles)?c.editedFiles:[],G=Array.isArray(c.commands)?c.commands:[],H=y2(l,f)?` · ${String(l?.label||"recovered thread execution")}`:f?` #${f}`:"",E=dE(u,l,f,c),V=`最近更新: ${HQ(E)}`,S=uO(u,l,f);return T("details",{className:`codex-progressive-card codex-execution-summary ${S?"running":""}`,"data-testid":t,"data-attempt-index":e$(f),"data-running":S?"true":"false",onToggle:(B)=>{if(B.currentTarget?.open&&!j)n?.(f)}},T("summary",null,T("div",{className:"codex-progressive-card-head"},T("span",{className:"codex-output-channel"},"Summary"),T("strong",null,`执行过程摘要${H}`),S?T("span",{className:"codex-summary-running-pill","data-testid":`${t}-running`},"执行中"):null,T("code",{title:E?`最近更新: ${wu(E)}`:V},`${ar(c.durationMs??c.totalElapsedMs)} / ${q} tools / ${V}`)),T("div",{className:"codex-execution-digest"},T("span",{title:"来自 OA Event Flow 统计中心"},`read ${Q===null?"--":Q}`),T("span",{title:"来自 OA Event Flow 统计中心"},`edit ${W===null?"--":W}`),T("span",{title:"来自 OA Event Flow 统计中心"},`run ${L===null?"--":L}`),T("span",{title:"来自 OA Event Flow 统计中心"},`STEP ${N}`),F!==null&&F>0?T("span",{className:"codex-execution-error-pill","data-testid":`${t}-error-count`},`Error ${F}`):null)),T("div",{className:"codex-execution-digest expanded"},T("span",null,`修改文件:${EQ(w,6)}`),T("span",null,`执行命令:${EQ(G,4)}`)),y.length===0?T("div",{className:"codex-output-empty"},r?"正在按需拉取步骤 summary...":"展开后将只请求执行步骤 summary,不拉取单步骤全量。"):T("div",{className:"codex-trace-step-list"},y.map((B)=>{let D=String(B?.seq??""),X=A[D],O=Array.isArray(B?.summaryLines)?B.summaryLines.slice(0,4):[],Y=O.find((p)=>String(p||"").trim().length>0);return T("details",{key:D||`${B?.title}-${B?.at}`,className:`codex-trace-step ${String(B?.kind||"message")} ${iO(B)?"error":""}`,"data-testid":`codex-trace-step-${D||"unknown"}`,onToggle:(p)=>{if(p.currentTarget?.open&&!X)i?.(B?.seq)}},T("summary",null,T("span",{className:"codex-output-channel"},pO(B?.kind)),T("strong",null,String(B?.title||"Trace step")),B?.status?T("code",null,String(B.status)):null,Y?T("span",{className:"codex-trace-step-inline-summary",title:String(Y)},String(Y)):null,T("time",null,wu(B?.at))),T("div",{className:"codex-trace-step-summary"},O.length>0?O.map((p,v)=>T("pre",{key:`${D}-${v}`},String(p||""))):T("span",null,"无 summary")),X?.line?T(x$,{items:[X.line],autoScroll:!1,loading:!1,hasDetail:!0,emptyText:"无步骤详情",testId:`codex-trace-step-detail-${D||"unknown"}`,className:"codex-transcript codex-step-detail-transcript",collapseTools:!1}):T("div",{className:"codex-output-empty"},r?"正在按需拉取这个步骤的全量数据...":"展开后将只请求这个单步骤的全量数据。"))})))}function pO(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 sQ({task:u,attempt:l,attemptIndex:f,testId:r="codex-final-response"}){let n=eE(u,l);if(n.length===0)return null;let i=Number(l?.finalResponseChars||n.length),t=f?` #${f}`:"";return T("section",{className:"codex-progressive-card codex-final-response","data-testid":r,"data-attempt-index":e$(f)},T("div",{className:"codex-progressive-card-head"},T("span",{className:"codex-output-channel"},"Final"),T("strong",null,`最终 response${t}`),T("code",null,`${Number.isFinite(i)?i:n.length} chars`)),T(SJ,{markdown:n,className:"codex-transcript-body codex-markdown",testId:`${r}-markdown`}))}function aQ({task:u,attempt:l,attemptIndex:f,testId:r="codex-progressive-judge"}){let n=MQ(u,l);if(!n?.decision)return null;let i=f?` #${f}`:"";return T("section",{className:"codex-progressive-card codex-progressive-judge","data-testid":r,"data-attempt-index":e$(f)},T("div",{className:"codex-progressive-card-head"},T("span",{className:"codex-output-channel"},"Judge"),T("strong",null,`完成判定${i}`),T("code",null,`${n.decision} ${Math.round(Number(n.confidence||0)*100)}%`)),T("div",{className:"codex-judge-card","data-testid":`${r}-card`},T(Di,{status:n.decision},n.decision),T("strong",null,`${Math.round(Number(n.confidence||0)*100)}% confidence`),T("p",{"data-testid":`${r}-reason`},n.reason||"--"),T(CQ,{judge:n,testId:`${r}-failure-details`}),n.continuePrompt?T("pre",{"data-testid":`${r}-continue-prompt`},String(n.continuePrompt||"")):null))}function SO({task:u,attempt:l,attemptIndex:f,loading:r,onLoadPromptPart:n,testId:i="codex-judge-feedback-prompt"}){let t=lO(u,l,f);if(t===null)return null;let y=RQ(f),$=o$(u)[y],A=String($?.text||"").trimEnd(),j=String(t.preview||t.text||"").trimEnd(),F=A||String(t.text||"").trimEnd(),J=Number($?.chars||t.chars||F.length||j.length),Q=Number($?.lines||t.lines||Vi(F||j)),W=$?.forAttempt||t.forAttempt||Number(f||0)+1;return T("details",{className:"codex-progressive-card codex-judge-feedback-prompt","data-testid":i,"data-attempt-index":e$(f),onToggle:(L)=>{if(L.currentTarget?.open&&!A)n?.("feedback",f)}},T("summary",null,T("div",{className:"codex-progressive-card-head"},T("span",{className:"codex-output-channel"},"Prompt"),T("strong",null,`judge feedback prompt #${f} -> #${W}`),T("code",null,`${Q||"--"} lines / ${Number.isFinite(J)?J:j.length} chars`)),T("p",{className:"codex-feedback-preview","data-testid":`${i}-preview`},j||"展开后按需拉取 judge feedback prompt。")),T("pre",{className:"codex-prompt-full codex-feedback-full","data-testid":`${i}-text`},F||(r?"正在按需拉取 judge feedback prompt...":"展开后将只请求这一次 judge feedback prompt。")))}function XO({task:u,attempt:l,position:f,loading:r,onLoadPromptPart:n,onLoadSteps:i,onLoadStep:t}){let y=AO(l,f),c=f===0,$=y2(l,y),A=$?String(l?.label||"Recovered thread execution"):`Attempt ${y}`;return T("section",{className:"codex-attempt-cycle","data-testid":`codex-attempt-cycle-${y}`},T("div",{className:"codex-attempt-cycle-head"},T("span",{className:"codex-output-channel"},A),T("strong",null,String(l?.mode||(y<=1?"initial":"retry"))),l?.terminalStatus?T(Di,{status:l.terminalStatus},l.terminalStatus):null,T("code",null,`${wu(l?.startedAt)} -> ${wu(l?.finishedAt)}`)),T(gQ,{task:u,attempt:l,attemptIndex:y,loading:r,onLoadSteps:i,onLoadStep:t,testId:c?"codex-execution-summary":`codex-execution-summary-attempt-${y}`}),$?null:T(sQ,{task:u,attempt:l,attemptIndex:y,testId:c?"codex-final-response":`codex-final-response-attempt-${y}`}),$?null:T(aQ,{task:u,attempt:l,attemptIndex:y,testId:c?"codex-progressive-judge":`codex-progressive-judge-attempt-${y}`}),$?null:T(SO,{task:u,attempt:l,attemptIndex:y,loading:r,onLoadPromptPart:n,testId:c?"codex-judge-feedback-prompt":`codex-judge-feedback-prompt-attempt-${y}`}))}function YO({task:u,loading:l,onLoadPromptPart:f,onLoadSteps:r,onLoadStep:n}){if(!u)return T(pi,{title:"未选择任务",text:"从左侧队列选择任务,或提交新 Codex 任务。"});let i=aE(u);return T("div",{className:"codex-transcript codex-progressive-trace","data-testid":"codex-output"},l&&!Ur(u)?T("div",{className:"codex-output-empty"},"正在加载 Trace Summary..."):null,T(DO,{task:u,loading:l,onLoadPromptPart:f}),i.length>0?i.map((t,y)=>T(XO,{key:`${t?.index||y+1}-${t?.startedAt||y}`,task:u,attempt:t,position:y,loading:l,onLoadPromptPart:f,onLoadSteps:r,onLoadStep:n})):[T(gQ,{key:"execution",task:u,loading:l,onLoadSteps:r,onLoadStep:n}),T(sQ,{key:"final",task:u}),T(aQ,{key:"judge",task:u})])}function PO({task:u}){let l=ME(u);if(!u||l.length===0)return T(pi,{title:"暂无原始消息",text:"原始 Codex app-server 消息会保留在任务 JSON 中。"});return T("details",{className:"codex-raw-output"},T("summary",null,`原始 messages (${l.length})`),T("div",null,l.map((f)=>T("article",{key:`${f.seq}-${f.channel}`,className:`codex-output-line ${f.channel||"system"}`},T("div",{className:"codex-output-meta"},T("span",{className:"codex-output-channel"},JO(String(f.channel||"system"))),T("span",null,wu(f.at)),f.method?T("code",null,f.method):null),T("pre",null,String(f.text||""))))))}function CO({task:u}){let l=RE(u).slice().reverse();if(l.length===0)return T(pi,{title:"尚无 attempt",text:"任务开始运行后,这里会记录 Codex 终态、传输中断和 stderr tail。"});return T("div",{className:"table-wrap codex-attempt-table"},T("table",null,T("thead",null,T("tr",null,T("th",null,"#"),T("th",null,"模式"),T("th",null,"终态"),T("th",null,"传输"),T("th",null,"退出"),T("th",null,"完成时间"))),T("tbody",null,l.map((f)=>T("tr",{key:`${f.index}-${f.startedAt}`},T("td",null,f.index),T("td",null,f.mode),T("td",null,T(Di,{status:f.terminalStatus||"unknown"},f.terminalStatus||"unknown")),T("td",null,f.transportClosedBeforeTerminal?T(Di,{status:"failed"},"closed-before-terminal"):T(Di,{status:"succeeded"},"normal")),T("td",null,`code=${f.appServerExitCode??"--"} signal=${f.appServerSignal??"--"}`),T("td",null,wu(f.finishedAt)))))))}function oQ({microservices:u,onRaw:l,apiBaseUrl:f="/api",initialTasksData:r=null,standalone:n=!1}){let i=u.find((m)=>m.id==="code-queue")||null,t=GQ(r),y=String(t?.id||""),c=new Map;if(t!==null&&y.length>0)c.set(y,{task:t,maxSeq:g$(Array.isArray(t.transcript)?t.transcript:[]),complete:Boolean(t._transcriptComplete),completeUpdatedAt:t._transcriptComplete?String(t.updatedAt||""):""});let $=typeof performance>"u"?0:performance.now(),A=Sl(y),j=Sl(0),F=Sl(0),J=Sl(0),Q=Sl(!1),W=Sl(!1),L=Sl(!1),U=Sl(null),q=Sl(new Map),N=Sl(new Map),w=Sl(new Map),G=Sl(new Map),Z=Sl(new Set),H=Sl(null),E=Sl(null),V=Sl(!1),S=Sl(!1),B=Sl(Boolean(r)),D=Sl(new Map),X=Sl(new Set),O=Sl(c),Y=Sl(r),[p,v]=gu(null),[z,P]=gu(r),[k,I]=gu(y),[b,d]=gu(t),[g,x]=gu(!1),[lu,cu]=gu(""),[_u,Fu]=gu(null),[zu,Wu]=gu(!1),[C,e]=gu(!1),uu=r?.queue||{},Gu=String(uu?.mainProviderId||uu?.defaultProviderId||"D601").trim()||"D601",[s,qu]=gu(""),[Zu,Bu]=gu(""),[Iu,ll]=gu("default"),[Pu,Jl]=gu(p0),[Jf,Of]=gu(!1),[yf,lf]=gu(""),[Zf,Pf]=gu(Gu),[Au,au]=gu("default"),[Qf,Yu]=gu("gpt-5.5"),[cf,_f]=gu(s$(uu,"default",Gu)||"/workspace"),[fr,$f]=gu(99),[Hf,Gn]=gu(1),[rr,dn]=gu(!1),[Ql,ei]=gu(!1),[fu,mu]=gu(""),[Xu,ou]=gu(""),[$l,Rl]=gu(""),[_l,Nf]=gu(!0),[Xr,my]=gu(()=>typeof window>"u"?!0:window.matchMedia(HE).matches),[Zl,ec]=gu(!1),[vA,Tl]=gu(""),[L7,sl]=gu(""),{addNotification:nr}=pf(),[ut,Vy]=gu(""),[lt,u_]=gu(""),[Dy,l_]=gu(!1),[Cf,Yr]=gu(r?{phase:"complete",taskId:y,queueMs:0,detailMs:0,totalMs:$,chunks:t?1:0,transcriptRows:Array.isArray(t?.transcript)?t.transcript.length:0,partial:Boolean(r?.selected?.hasMore||b1(t)),completedAt:new Date}:null),[f_,ft]=gu(r?new Date:null),[py,r_]=gu(!1),fn=l0(Ml(z)),n_=fn.filter(Cn),Pl=z?.queue||p?.body?.queue||p?.queue||{},kA=wO(z,Pl),i_=B0(z),Wr=FQ(Pl,Iu),ri=String(Iu||"default").trim()||"default",ni=Wr.filter((m)=>String(m?.id||"")!==ri),rt=ot(Wr,Pu),ii=Number((gf(Pu)?Pl?.total:rt?.total)??i_.total??fn.length),Sy=v1(Pl),T7=gf(Pu)?Sy:[String(ot(Wr,Pu)?.activeTaskId||"")].filter(Boolean),nt=UQ(Pl,Wr,Pu,fn),K7=gf(Pu)?v4(Pl):v4(rt||{}),Xy=v4(Pl),IA=NO(Xy),t_=Math.max(qO(Xy),Sy.length),gA=bl((gf(Pu)?Pl?.unreadTerminal:rt?.unreadTerminal)??n_.length),en=z?n_.length:gA,u0=gf(Pu)?"All queues":d4(rt||{id:Pu,name:Pu}),ti=o4(lu),Mf=ti.length>0,Yy=Mf?l0(Ml(_u)):[],sA=B0(_u),rn=Mf?Yy:fn,G7=rn.filter(Cn),eL=rn.filter((m)=>!sr(m)).sort(EE),uT=rn.filter((m)=>sr(m)&&!Cn(m)),z7=Mf?sA:i_,it=Mf?Number(sA.total??Yy.length):ii,E7=z7.hasMore===!0&&String(z7.nextBeforeId||"").length>0,aA=Mf?C:py,lT=i?KE(i):{},fT=i?GE(i):{},oA=$Q(()=>hE(s),[s]),zn=$Q(()=>{let m=NQ(Hf);return oA.flatMap((M)=>Array.from({length:m},()=>xE(M,Zu)))},[oA,Hf,Zu]),Py=zn.length,O7=Py>1&&!rr,rT=Ql||Zl||Py===0||O7,Z7=zO(Pl,Qf),y_=EO(Pl,Zf),H7=OO(Pl,Au),nT=s$(Pl,Au,Zf),dA=b?.id&&b?.activeTurnId&&String(b?.status)==="running",iT=b?.id&&!["succeeded","failed","canceled"].includes(String(b?.status||"")),tT=b?.id&&["succeeded","failed","canceled"].includes(String(b?.status||"")),tt=b?.id&&vQ(b);function Rf(m){let M=typeof m==="function"?m(Y.current):m;return Y.current=M,P(M),M}function yT(m,M,a=!0){let nu=Array.from(new Set(m.map((ju)=>String(ju||"")).filter(Boolean)));for(let ju of nu)if(D.current.set(ju,M),a)X.current.add(ju);return nu}function B7(m){for(let M of m.map((a)=>String(a||"")).filter(Boolean))D.current.delete(M),X.current.delete(M)}function c_(m){let M=String(m?.id||""),a=M?D.current.get(M):void 0;if(!a)return m;if(String(m?.status||"").length>0&&!sr(m))return D.current.delete(M),X.current.delete(M),m;return{...m,readAt:m?.readAt||a,terminalUnread:!1}}function eA(m){let M=String(m?.id||"");return M.length>0&&X.current.has(M)&&sr(m)}function l0(m,M=!0){let a=[];for(let nu of Array.isArray(m)?m:[]){let ju=c_(nu);if(M&&eA(ju))continue;a.push(ju)}return a}function cT(m,M=!0){if(!m||!Array.isArray(m?.tasks))return m;let a=l0(Ml(m),M),nu=B0(m);return{...m,tasks:a,pagination:m.pagination?{...nu,returned:a.length}:m.pagination}}function _T(m){let M=String(m||Pl?.mainProviderId||"D601").trim()||"D601";Pf(M),_f(s$(Pl,Au,M))}function $T(m){let M=String(m||"default").trim()||"default",a=Zf;if(M==="windows-native"){if(!y_.find((ju)=>ju.id===Zf)?.supportsWindowsNativeCodex)a=String(y_.find((ju)=>ju.supportsWindowsNativeCodex)?.id||Zf||"D601"),Pf(a)}au(M),_f(s$(Pl,M,a))}function __(m,M,a=null,nu=null){let ju=new Set(yT(m,M));if(ju.size===0&&nu===null&&a===null)return;Rf((Lu)=>{if(!Lu)return Lu;let Tu=Ml(Lu).flatMap((hu)=>{let xu=String(hu?.id||"");if(!ju.has(xu)){let tl=c_(hu);return eA(tl)?[]:[tl]}let Mu=nu&&String(nu?.id||"")===xu?nu:{},vu={...hu,...Mu,readAt:M,terminalUnread:!1};return eA(vu)?[]:[vu]});return{...Lu,queue:a||Lu.queue,tasks:ju.size>0?m0([Tu],nt):Tu}});for(let Lu of ju){let Tu=O.current.get(Lu);if(Tu?.task){let hu=nu&&String(nu?.id||"")===Lu?nu:{},xu={...Tu.task,...hu,readAt:M,terminalUnread:!1};if(O.current.set(Lu,{...Tu,task:xu}),A.current===Lu)d(xu)}}}V0(()=>{dn(!1)},[s,Hf,Zu]),V0(()=>{let m=o4(lu);F.current+=1;let M=F.current;if(!i||m.length===0){Fu(null),Wu(!1),e(!1),L.current=!1;return}Wu(!0),Fu(null);let a=window.setTimeout(()=>{(async()=>{try{let nu=await JQ(f,Pu,m);if(M!==F.current)return;Fu(cT(nu))}catch(nu){if(M===F.current)Fu(null),Tl(tf(nu,"搜索 Codex tasks 失败"))}finally{if(M===F.current)Wu(!1)}})()},240);return()=>window.clearTimeout(a)},[i?.id,f,Pu,lu]),V0(()=>{ou(b?a$(b):""),Rl(Array.isArray(b?.referenceTaskIds)?b.referenceTaskIds.join(" "):"")},[k]);function Pr(m,M,a){let nu=O.current.get(m)||{},ju=nu.task||{},Lu=Array.isArray(ju.transcript)?ju.transcript:[],Tu=KQ(ju,M),hu=Object.prototype.hasOwnProperty.call(M,"transcript")?g4(Lu,Array.isArray(M.transcript)?M.transcript:[]):Lu,xu={...ju,...Tu,transcript:hu,output:Array.isArray(Tu.output)?r2(ju,Tu,"output"):Array.isArray(ju.output)?ju.output:[],events:Array.isArray(Tu.events)?r2(ju,Tu,"events"):Array.isArray(ju.events)?ju.events:[]},Mu=c_(xu),vu=String(Mu?.updatedAt||""),tl=Boolean(M._transcriptComplete)&&sr(Mu),al=Boolean(nu.complete)&&sr(Mu)&&String(nu.completeUpdatedAt||"")===vu,ul=tl||al,ff={...nu,task:Mu,maxSeq:g$(hu),complete:ul,completeUpdatedAt:ul?vu:""};if(O.current.set(m,ff),a===J.current&&A.current===m)d(Mu);return ff}async function yi(m,M=!1,a,nu){if(!i||!m)return;let Lu=O.current.get(m)?.task;if(!M&&k$(Lu))return;let Tu=m,hu=q.current.get(Tu);if(hu){if(M||!k$(Lu))hu.refreshAfter=!0;return hu.promise}let xu=J.current,Mu=performance.now();if(A.current===m)x(!0);let vu={promise:Promise.resolve(),refreshAfter:!1},tl=(async()=>{try{let al=await pE(f,m);if(xu!==J.current||A.current!==m)return;let ul=al?.summary||{},ff=String(ul.updatedAt||"");Pr(m,{id:m,status:ul.status,updatedAt:ff,startedAt:ul.startedAt,finishedAt:ul.finishedAt,currentAttempt:ul.currentAttempt,maxAttempts:ul.maxAttempts,finalResponse:ul.finalResponse,lastJudge:ul.lastJudge,lastError:ul.lastError,attempts:Array.isArray(ul.attempts)?ul.attempts:[],stepCount:ul.stepCount,llmStepCount:ul.llmStepCount,traceStats:ul.traceStats,statsSource:ul.statsSource,timing:ul.timing,_traceSummary:ul,_traceSummaryLoaded:!0,_traceSummaryUpdatedAt:ff,_detailLoaded:!0},xu),Yr({phase:"complete",taskId:m,queueMs:nu??0,detailMs:performance.now()-Mu,totalMs:a===void 0?performance.now()-Mu:performance.now()-a,chunks:1,transcriptRows:Number(ul?.execution?.traceLineCount||ul?.execution?.stepCount||0),partial:!1,completedAt:new Date})}finally{let al=Boolean(vu.refreshAfter&&A.current===m&&!k$(O.current.get(m)?.task));if(q.current.delete(Tu),xu===J.current&&A.current===m)x(!1);if(al)window.setTimeout(()=>{yi(m,!0).catch((ul)=>Tl(tf(ul,"自动刷新 Trace Summary 失败")))},0)}})();vu.promise=tl,q.current.set(Tu,vu),await tl}async function AT(m,M=null){let a=A.current;if(!i||!a||!m)return;let nu=O.current.get(a)?.task,ju=o$(nu),Lu=m==="feedback"||m==="judge-feedback"?RQ(M):m;if(ju[Lu]?.text)return;let Tu=`${a}:${Lu}`,hu=N.current.get(Tu);if(hu)return hu;let xu=J.current;if(A.current===a)x(!0);let Mu=(async()=>{try{let vu=await SE(f,a,m,M);if(xu!==J.current||A.current!==a)return;let tl=O.current.get(a)?.task,al=o$(tl);Pr(a,{...m==="full"?{prompt:String(vu?.text||""),promptChars:Number(vu?.chars||0)}:{},_promptDetails:{...al,[Lu]:vu}},xu)}finally{if(N.current.delete(Tu),xu===J.current&&A.current===a)x(!1)}})();N.current.set(Tu,Mu),await Mu}async function u6(m=null,M={}){let a=A.current;if(!i||!a)return;let nu=O.current.get(a)?.task,ju=m===null||m===void 0||String(m).length===0?"":String(m),Lu=u2(nu,ju||null),Tu=Boolean(M.force),hu=Boolean(M.incremental);if(Lu&&!Tu)return;let xu=hQ(nu,ju||null),Mu=hu&&xu.length>0?rO(xu):0,vu=`${a}:${ju||"all"}:${Mu}`,tl=w.current.get(vu);if(tl)return tl;let al=J.current;if(A.current===a)x(!0);let ul=(async()=>{try{let ff=await XE(f,a,Mu,500,ju||null);if(al!==J.current||A.current!==a)return;let nn=Array.isArray(ff?.steps)?ff.steps:[],En=Mu>0?nO(xu,nn):nn;if(ju){let f0=O.current.get(a)?.task,yt=Wl(f0?._traceStepsByAttempt)||{},Cr=Wl(f0?._traceStepsLoadedByAttempt)||{},Lr=Wl(f0?._traceStepsNextAfterSeqByAttempt)||{};Pr(a,{_traceStepsByAttempt:{...yt,[ju]:En},_traceStepsLoadedByAttempt:{...Cr,[ju]:!0},_traceStepsNextAfterSeqByAttempt:{...Lr,[ju]:ff?.nextAfterSeq}},al)}else Pr(a,{_traceSteps:En,_traceStepsLoaded:!0,_traceStepsHasMore:Boolean(ff?.hasMore),_traceStepsNextAfterSeq:ff?.nextAfterSeq},al)}finally{if(w.current.delete(vu),al===J.current&&A.current===a)x(!1)}})();w.current.set(vu,ul),await ul}async function jT(m){let M=A.current,a=String(m??"");if(!i||!M||a.length===0)return;let nu=O.current.get(M)?.task;if(l2(nu)[a]?.line)return;let Lu=`${M}:${a}`,Tu=G.current.get(Lu);if(Tu)return Tu;let hu=J.current;if(A.current===M)x(!0);let xu=(async()=>{try{let Mu=await YE(f,M,m);if(hu!==J.current||A.current!==M)return;let vu=O.current.get(M)?.task,tl=l2(vu);Pr(M,{_traceStepDetails:{...tl,[a]:Mu}},hu)}finally{if(G.current.delete(Lu),hu===J.current&&A.current===M)x(!1)}})();G.current.set(Lu,xu),await xu}function FT(m){if(A.current!==m)return;let M=O.current.get(m)?.task;if(!M)return;if(u2(M,null))u6(null,{force:!0,incremental:!0}).catch((nu)=>Tl(tf(nu,"增量刷新 Trace Steps 失败")));let a=Wl(M?._traceStepsLoadedByAttempt)||{};for(let nu of Object.keys(a).filter((ju)=>a[ju]))u6(nu,{force:!0,incremental:!0}).catch((ju)=>Tl(tf(ju,"增量刷新 Attempt Trace Steps 失败")))}async function VY(m,M,a){if(!i||!m)return;let nu=performance.now(),ju=J.current,Lu=O.current.get(m);if(Lu?.task){if(d(Lu.task),x(b1(Lu.task)||!Lu.complete),!b1(Lu.task)&&Lu.complete&&sr(Lu.task)&&String(Lu.completeUpdatedAt||"")===String(Lu.task?.updatedAt||"")){Yr({phase:"complete",taskId:m,queueMs:a??0,detailMs:0,totalMs:M===void 0?0:performance.now()-M,chunks:0,transcriptRows:Array.isArray(Lu.task.transcript)?Lu.task.transcript.length:0,completedAt:new Date});return}}else x(!0);let Tu=U.current;if(Tu?.taskId===m&&Tu.token===ju)return Tu.promise;let hu=(async()=>{try{let xu=await vl(kl(f,`/api/tasks/${encodeURIComponent(m)}?meta=1`));if(ju!==J.current||A.current!==m)return;let Mu=O.current.get(m),vu=Array.isArray(Mu?.task?.transcript)?Mu.task.transcript:[],tl=xu?.task||{},al=Boolean(Mu?.complete)&&String(Mu?.completeUpdatedAt||"")===String(tl?.updatedAt||"");Pr(m,{...tl,summaryOnly:!1,_metaLoaded:!0,transcript:vu,_detailLoaded:vu.length>0,_transcriptComplete:al},ju);let ul=b1(Mu?.task)||Boolean(Mu?.task?._transcriptPreview),ff=ul?0:vu.length>0?zQ(vu):0,nn=!ul&&Mu?.complete&&sr(tl)&&String(Mu?.completeUpdatedAt||"")===String(tl?.updatedAt||"")?g$(vu):ff,En=!0,f0=0,yt=vu.length;while(En){let Cr=await vl(kl(f,`/api/tasks/${encodeURIComponent(m)}/transcript?afterSeq=${encodeURIComponent(String(nn))}&limit=${WE}&fullText=1`));if(ju!==J.current||A.current!==m)return;let Lr=O.current.get(m),ct=Array.isArray(Lr?.task?.transcript)?Lr.task.transcript:[],ci=g4(ct,Array.isArray(Cr?.transcript)?Cr.transcript:[]);f0+=1,yt=ci.length;let Dl=Boolean(!Cr?.hasMore);if(Pr(m,{status:Cr?.status||tl.status,updatedAt:Cr?.updatedAt||tl.updatedAt,transcript:ci,_detailLoaded:Dl||ci.length>0,_transcriptComplete:Dl,_transcriptPreview:ul&&!Dl},ju),En=Boolean(Cr?.hasMore),nn=Number(Cr?.nextAfterSeq??g$(ci)),!En)break;await new Promise((C7)=>window.setTimeout(C7,0))}Yr({phase:"complete",taskId:m,queueMs:a??0,detailMs:performance.now()-nu,totalMs:M===void 0?performance.now()-nu:performance.now()-M,chunks:f0,transcriptRows:yt,completedAt:new Date})}finally{if(U.current?.taskId===m&&U.current?.token===ju)U.current=null;if(ju===J.current&&A.current===m)x(!1)}})();U.current={taskId:m,token:ju,promise:hu},await hu}async function hf(m=A.current,M=!0,a=Pu){if(!i)return;if(!M&&S.current)return;let nu=performance.now();if(M)S.current=!0;if(M)Yr({phase:"loading",taskId:String(m||A.current||""),startedAt:new Date});let ju=j.current+1;j.current=ju;let Lu=String(m||A.current||""),Tu=Lu?O.current.get(Lu):null,hu=Array.isArray(Tu?.task?.transcript)?Tu.task.transcript:[],xu=zQ(hu),Mu=null,vu=M&&Lu.length===0;if(Mu=vu?await JQ(f,a,""):await b4(f,Lu,xu,a,"",!0,{stats:!1}),ju!==j.current){if(M)S.current=!1;return}let tl=performance.now()-nu;v(p||{});let al=Mu?.queue||{},ul=String(al?.activeTaskId||v1(al)[0]||""),ff=Mu;Rf((hl)=>{let r0=Ml(Mu),tr=Ml(hl),Tr=tr.length>0?m0([tr,r0],ul):m0([r0],ul),n0=l0(Tr),$_=B0(Mu),_i=B0(hl),i6=tr.length>r0.length&&(_i.hasMore===!1||String(_i.nextBeforeId||"").length>0),RT={...$_,...i6?{hasMore:_i.hasMore,nextBeforeId:_i.nextBeforeId}:{},returned:n0.length};return ff={...Mu,tasks:n0,pagination:RT},ff});let nn=Ml(ff),En=FQ(al,Iu),f0=UQ(al,En,a,nn),yt=DE(En,a,nn),Cr=Lu||A.current,Lr=ff?.selected||null,ct=Lr?.task||null,ci=Array.isArray(Lr?.transcript)?Lr.transcript:null,Dl=Cr||f0||yt||nn[0]?.id||"";if(A.current!==Dl)J.current+=1;A.current=Dl,I(Dl);let _t=nn.find((hl)=>hl.id===Dl);if(_t){let hl=O.current.get(Dl);if(hl?.task)O.current.set(Dl,{...hl,task:{..._t,...hl.task,status:_t.status,updatedAt:_t.updatedAt}})}if(vu&&_t){if(Pr(Dl,{..._t,_summaryLoaded:!1,transcript:[],_detailLoaded:!1,_transcriptComplete:!1,_transcriptPreview:!0},J.current),x(!0),Yr({phase:"complete",taskId:Dl,queueMs:tl,detailMs:0,totalMs:performance.now()-nu,chunks:0,transcriptRows:0,partial:!0,completedAt:new Date}),ft(new Date),M)S.current=!1;yi(Dl,!0).catch((hl)=>Tl(tf(hl,"加载 Codex Trace Summary 失败"))),b4(f,Dl,0,a,"",!1).then((hl)=>{if(ju!==j.current)return;let r0=Ml(hl),tr=GQ(hl);if(r0.length>0)Rf((Tr)=>{let n0=m0([Ml(Tr),r0],ul);return{...Tr,statistics:hl?.statistics||Tr?.statistics,tasks:l0(n0)}});if(tr?.id===A.current){let Tr=Array.isArray(tr.transcript)?tr.transcript:[];Pr(tr.id,{...tr,transcript:Tr,_summaryLoaded:!0,_detailLoaded:Tr.length>0,_transcriptPreview:Boolean(hl?.selected?.preview)},J.current)}}).catch(()=>{});return}if(ct?.id===Dl&&ci!==null){let hl=O.current.get(Dl),r0=Array.isArray(hl?.task?.transcript)?hl.task.transcript:[],tr=g4(r0,ci),Tr=Boolean(Lr?.preview);if(Pr(Dl,{...ct,_summaryLoaded:!0,transcript:tr,_detailLoaded:!Lr?.hasMore||tr.length>0,_transcriptComplete:!Tr&&!Lr?.hasMore&&sr(ct),_transcriptPreview:Tr},J.current),x(!1),M)Yr({phase:"complete",taskId:Dl,queueMs:tl,detailMs:Math.max(0,performance.now()-nu-tl),totalMs:performance.now()-nu,chunks:1,transcriptRows:tr.length,partial:Boolean(Tr||Lr?.hasMore||b1(ct)),completedAt:new Date});if(ft(new Date),M)S.current=!1;yi(Dl,!1,M?nu:void 0,M?tl:void 0).catch((n0)=>Tl(tf(n0,"加载 Codex Trace Summary 失败"))),b4(f,Lu,xu,a,"",!1).then((n0)=>{if(ju!==j.current)return;let $_=Ml(n0);if($_.length>0)Rf((_i)=>{let i6=m0([Ml(_i),$_],ul);return{..._i,tasks:l0(i6)}})}).catch(()=>{});return}if(M)Yr({phase:"session",taskId:Dl,queueMs:tl,totalMs:tl,startedAt:new Date(Date.now()-tl)});if(Dl)yi(Dl,!0,M?nu:void 0,M?tl:void 0).catch((hl)=>Tl(tf(hl,"加载 Codex Trace Summary 失败")));else if(J.current+=1,d(null),x(!1),M)Yr({phase:"complete",taskId:"",queueMs:tl,detailMs:0,totalMs:performance.now()-nu,chunks:0,transcriptRows:0,completedAt:new Date});if(ft(new Date),M)S.current=!1}async function m7(){if(Mf){if(!i||C||L.current)return;let M=String(sA.nextBeforeId||"");if(!M)return;L.current=!0,e(!0),Tl("");try{let a=await QQ(f,Pu,M,ZQ,ti),nu=Ml(a),ju=a?.queue||Pl||{},Lu=String(ju?.activeTaskId||v1(ju)[0]||nt||"");Fu((Tu)=>{let hu=l0(m0([Ml(Tu),nu],Lu)),xu=B0(a);return{...Tu||{},queue:ju,tasks:hu,pagination:{...xu,returned:hu.length}}})}catch(a){Tl(tf(a,"加载更多搜索结果失败"))}finally{L.current=!1,e(!1)}return}if(!i||py||W.current)return;let m=String(B0(z).nextBeforeId||"");if(!m)return;W.current=!0,r_(!0),Tl("");try{let M=await QQ(f,Pu,m),a=Ml(M),nu=M?.queue||Pl||{},ju=String(nu?.activeTaskId||v1(nu)[0]||nt||"");Rf((Lu)=>{let Tu=l0(m0([Ml(Lu),a],ju)),hu=B0(M);return{...Lu||{},queue:nu,statistics:M?.statistics||Lu?.statistics,tasks:Tu,pagination:{...hu,returned:Tu.length}}})}catch(M){Tl(tf(M,"加载更早 Codex tasks 失败"))}finally{W.current=!1,r_(!1)}}function UT(m){let M=m.currentTarget;if(!M||aA||!E7)return;if(M.scrollHeight-M.scrollTop-M.clientHeight<120)m7()}async function ir(m,M){ec(!0),Tl("");try{await m()}catch(a){Tl(tf(a,M))}finally{ec(!1)}}async function l6(m){if(!m)return;try{let M=!1;try{if(navigator.clipboard?.writeText)await navigator.clipboard.writeText(m),M=!0}catch{M=!1}if(!M){let nu=document.createElement("textarea");nu.value=m,nu.style.position="fixed",nu.style.opacity="0",document.body.appendChild(nu),nu.select(),M=document.execCommand("copy"),document.body.removeChild(nu)}if(!M)throw Error("browser clipboard rejected the copy request");Vy(m);let a=`已复制任务 ID:${m}`;sl(a),nr("success",a),window.setTimeout(()=>Vy((nu)=>nu===m?"":nu),1600)}catch(M){Tl(`复制任务 ID 失败:${tf(M)}`)}}function f6(m){if(!m)return;Bu(m);let M=`已引用任务 ID:${m};提交时后端会读取并注入该任务上下文`;sl(M),nr("success",M)}async function r6(m){if(!i||!m)return;let M=new Date().toISOString();j.current+=1,__([m],M,null,{id:m,readAt:M,terminalUnread:!1}),u_(m);let a=!1;if(await ir(async()=>{let nu=await PE(f,m),ju=nu?.task||{id:m,readAt:new Date().toISOString(),terminalUnread:!1},Lu=String(ju?.readAt||new Date().toISOString());__([m],Lu,nu?.queue||null,ju),a=!0;let Tu=`已将任务 ${m} 标为已读`;sl(Tu),nr("success",Tu)},"标记 Codex task 已读失败"),!a)B7([m]),hf(A.current,!1).catch((nu)=>Tl(tf(nu,"刷新 Codex tasks 失败")));u_((nu)=>nu===m?"":nu)}async function JT(){if(!i||Dy)return;l_(!0);let m=new Date().toISOString(),M=Array.from(new Set([...Ml(Y.current).filter(Cn).map((nu)=>String(nu?.id||"")).filter(Boolean),...Array.from(O.current.entries()).filter(([,nu])=>Cn(nu?.task)).map(([nu])=>nu)]));if(j.current+=1,M.length>0)__(M,m);let a=!1;if(await ir(async()=>{let nu=await CE(f),ju=String(nu?.readAt||new Date().toISOString()),Lu=Ml(Y.current).filter(Cn).map((vu)=>String(vu?.id||"")).filter(Boolean),Tu=Array.from(O.current.entries()).filter(([,vu])=>Cn(vu?.task)).map(([vu])=>vu),hu=Array.from(new Set([...M,...Lu,...Tu]));__(hu,ju,nu?.queue||null);let xu=Number(nu?.count||hu.length);a=!0;let Mu=`已将 ${xu} 个已结束未读任务标为已读`;sl(Mu),nr("success",Mu)},"全部标为已读失败"),!a&&M.length>0)B7(M),hf(A.current,!1).catch((nu)=>Tl(tf(nu,"刷新 Codex tasks 失败")));l_(!1)}function QT(m){let M=m||p0;if(Jl(M),!gf(M))ll(M);if(Rf(null),!(gf(M)?A.current:""))A.current="",J.current+=1,I(""),d(null),x(!0)}async function NT(){let m=typeof window>"u"?"":window.prompt("输入新的 Codex queue ID(字母/数字/._-,最长 64)","new-lane"),M=String(m||"").trim();if(!M)return;await ir(async()=>{let a=await vl(kl(f,"/api/queues"),{method:"POST",body:{queueId:M}}),nu=String(a?.queue?.id||M);ll(nu),Jl(nu),Rf(null),A.current="",J.current+=1,I(""),d(null);let ju=`已创建并切换到 queue:${nu}`;sl(ju),nr("success",ju),await hf("",!0,nu)},"创建 Codex queue 失败")}async function qT(){let m=String(Iu||"default").trim()||"default",M=ot(Wr,m)||{id:m,name:m},a=typeof window>"u"?null:window.prompt(`输入 queue 显示名称(ID 不变:${m};留空恢复为 ID)`,VQ(M));if(a===null)return;await ir(async()=>{let nu=await vl(kl(f,`/api/queues/${encodeURIComponent(m)}`),{method:"PATCH",body:{name:String(a)}}),ju=nu?.queue||{id:m,name:String(a||m)};if(nu?.summary)Rf((Tu)=>Tu?{...Tu,queue:nu.summary}:Tu);let Lu=`已更新 queue 名称:${d4(ju)}`;sl(Lu),nr("success",Lu),await hf(A.current,!0,Pu)},"修改 Codex queue 名称失败")}function wT(){if(ni.length===0){sl("没有可合并的其他 queue;请先创建或选择另一个 queue。");return}let m=ni.some((M)=>String(M?.id||"")===yf)?yf:"";lf(m),Of(!0)}async function WT(){let m=ri;if(ni.length===0){sl("没有可合并的其他 queue;请先创建或选择另一个 queue。");return}let a=String(yf||""||"").trim();if(!a){sl("请先选择要合并的源 queue。");return}if(a===m){Tl("源 queue 和目标 queue 不能相同。");return}await ir(async()=>{let nu=await vl(kl(f,`/api/queues/${encodeURIComponent(m)}/merge`),{method:"POST",body:{sourceQueueId:a}});if(nu?.summary)Rf((Tu)=>Tu?{...Tu,queue:nu.summary}:Tu);ll(m),Jl(m),Rf(null);let ju=Number(nu?.mergedTaskCount||0),Lu=`已将 queue=${a} 合并到 ${m},移动 ${ju} 个任务;源 queue 已自动删除。`;sl(Lu),nr("success",Lu),Of(!1),lf(""),await hf(A.current,!0,m)},"合并 Codex queue 失败")}async function LT(m){if(m.preventDefault(),Q.current){sl("任务正在提交中,请等待当前请求完成,已阻止重复提交。");return}if(zn.length>1&&!rr){Tl(`检测到将创建 ${zn.length} 个任务;请先勾选“确认批量入队”,避免误传多个任务。`);return}Q.current=!0,ei(!0),sl("正在提交 Code Queue 任务,请等待后端确认,输入已临时锁定。"),await ir(async()=>{if(zn.length===0)throw Error("prompt 不能为空");let M=Bi(Zu),a=Iu.trim()||"default",nu=[...zn],ju=(vu)=>({prompt:vu,queueId:a,providerId:Zf,executionMode:Au,model:Qf,cwd:cf,maxAttempts:Number(fr),...M.length>0?{referenceTaskIds:M}:{}}),Lu=nu.length===1?ju(nu[0]):{tasks:nu.map(ju)},Tu=await vl(kl(f,nu.length===1?"/api/tasks":"/api/tasks/batch"),{method:"POST",body:Lu}),hu=Tu?.tasks?.[0]?.id||"",xu=Array.isArray(Tu?.tasks)?Tu.tasks.map((vu)=>String(vu?.id||"")).filter(Boolean):[],Mu=`已创建 ${xu.length||nu.length} 个任务${xu.length>0?`:${xu.join(" / ")}`:""}`;if(sl(Mu),nr("success",Mu),qu(""),Bu(""),dn(!1),A.current=hu,Pu!==a)Rf(null);ll(a),await hf(hu,!0,a)},"Codex 任务入队失败"),Q.current=!1,ei(!1)}async function TT(m){if(m.preventDefault(),!b?.id)return;await ir(async()=>{await vl(kl(f,`/api/tasks/${encodeURIComponent(b.id)}/steer`),{method:"POST",body:{prompt:fu}}),mu(""),await hf(b.id)},"追加 prompt 失败")}async function KT(m){m.preventDefault();let M=String(b?.id||"");if(!M||!tt)return;await ir(async()=>{let a=Bi($l),nu=await vl(kl(f,`/api/tasks/${encodeURIComponent(M)}/edit`),{method:"POST",body:{prompt:Xu,referenceTaskIds:a}}),ju={...nu?.task||b||{},_traceSummary:null,_traceSummaryLoaded:!1,_traceSummaryUpdatedAt:"",_promptDetails:{},_traceSteps:[],_traceStepsLoaded:!1,_traceStepsByAttempt:{},_traceStepsLoadedByAttempt:{},_traceStepsNextAfterSeqByAttempt:{},_traceStepDetails:{}};O.current.set(M,{...O.current.get(M)||{},task:ju,complete:!1,completeUpdatedAt:""}),A.current=M,d(ju),I(M),ou(a$(ju)),Rl(Array.isArray(ju?.referenceTaskIds)?ju.referenceTaskIds.join(" "):""),Rf((Tu)=>{if(!Tu)return Tu;let hu=Ml(Tu).map((xu)=>String(xu?.id||"")===M?{...xu,...ju}:xu);return{...Tu,queue:nu?.queue||Tu.queue,tasks:m0([hu],nt)}});let Lu=nu?.changed===!1?`任务 ${M} 的 prompt 未变化`:`已更新 queued 任务 ${M} 的用户 prompt`;sl(Lu),nr("success",Lu),await hf(M,!0,Pu)},"编辑 queued 任务 prompt 失败")}async function GT(){if(!b?.id)return;await ir(async()=>{await vl(kl(f,`/api/tasks/${encodeURIComponent(b.id)}/interrupt`),{method:"POST",body:{}}),await hf(b.id)},"打断 Codex session 失败")}async function zT(){if(!b?.id)return;await ir(async()=>{await vl(kl(f,`/api/tasks/${encodeURIComponent(b.id)}/retry`),{method:"POST",body:{}}),await hf(b.id)},"重新入队失败")}async function ET(m){let M=String(b?.id||""),a=String(m||"").trim();if(!M||!a)return;let nu=I1(b);if(a===nu){sl(`任务 ${M} 已在 queue=${a}`);return}await ir(async()=>{let Lu=(await vl(kl(f,`/api/tasks/${encodeURIComponent(M)}/move`),{method:"POST",body:{queueId:a}}))?.task||{...b,queueId:a};if(O.current.set(M,{...O.current.get(M)||{},task:Lu}),A.current=M,d(Lu),I(M),ll(a),!gf(Pu))Rf(null),Jl(a);let Tu=`已将任务 ${M} 从 ${nu} 移动到 ${a}`;sl(Tu),nr("success",Tu),await hf(M,!0,gf(Pu)?p0:a)},"移动任务 queue 失败")}async function OT(){let m=A.current;if(!m)return;let M=performance.now();await ir(async()=>{Yr({phase:"session",taskId:m,queueMs:0,totalMs:0,partial:!0,startedAt:new Date}),await yi(m,!0,M,0)},"刷新 Trace Summary 失败")}function ZT(m){A.current=m,J.current+=1,I(m);let M=O.current.get(m);if(M?.task)d(M.task),x(!1);else{x(!0);let a=fn.find((nu)=>nu.id===m);if(a)d(a);else d(null)}hf(m).catch((a)=>Tl(tf(a,"切换 Codex session 失败")))}function n6(m){if(ZT(m),BE())my(!1)}function V7(m,M,a){if(!m||!Array.isArray(m?.tasks)||M.length===0||Object.keys(a).length===0)return m;let nu=!1,ju=Ml(m).map((Lu)=>{if(String(Lu?.id||"")!==M)return Lu;return nu=!0,c_(KQ(Lu,a))});return nu?{...m,tasks:ju}:m}function HT(m,M){Rf((a)=>V7(a,m,M)),Fu((a)=>V7(a,m,M))}function BT(m,M,a){let nu=String(m?.type||"");if(nu==="queue-updated")return!0;if(nu==="trace-stats-updated"||nu==="trace-step-created")return!1;if(M.length===0)return!0;if(!a)return!0;if(m?.queueId&&String(m.queueId)!==I1(a))return!0;if(m?.status&&String(m.status)!==String(a?.status||""))return!0;return String(m?.reason||"")!=="output"}function D7(){if(!i||!x4())return;if(H.current!==null)window.clearTimeout(H.current);H.current=window.setTimeout(()=>{H.current=null,hf(A.current,!1).catch((m)=>Tl(tf(m,"Code Queue 事件刷新失败")))},120)}function mT(m,M){if(!i||!x4()||A.current!==m)return;if(V.current=V.current||M,E.current!==null)return;E.current=window.setTimeout(()=>{E.current=null;let a=V.current;if(V.current=!1,yi(m,!0).catch((nu)=>Tl(tf(nu,"事件刷新 Trace Summary 失败"))),a)FT(m)},250)}function VT(m){let M=Wl(m?.payload)||m,a=Wl(M?.stats),nu=String(m?.type||M?.type||""),ju=String(M?.subjectKind||a?.subjectKind||""),Lu=String(M?.scopeId||a?.scopeId||""),Tu=String(M?.taskId||(ju==="task"?M?.subjectId:"")||a?.taskId||m?.taskId||""),hu=M?.attemptIndex??a?.attemptIndex,xu=hu===null||hu===void 0||hu===""?null:Mn(hu),Mu=a||Wl(M?.traceStats),vu=Mu?.stepCount??Mu?.llmStepCount,tl=Mu?.outputMaxSeq;return{...M,type:nu,eventId:m?.eventId||M?.eventId,sequence:m?.sequence??M?.sequence,taskId:Tu,subjectKind:ju,scopeId:Lu,attemptIndex:xu,stepCount:vu,outputMaxSeq:tl,updatedAt:Mu?.updatedAt||M?.updatedAt||m?.createdAt,traceStats:Mu,statsSource:Mu?"oa-event-flow":M?.statsSource}}function DT(m){let M=VT(m),a=String(M?.taskId||""),nu=String(M?.scopeId||M?.traceStats?.scopeId||""),ju=String(M?.subjectKind||M?.traceStats?.subjectKind||"")==="task-attempt"||Number(M?.attemptIndex)>0||/:attempt:\d+$/u.test(nu),Lu=qQ(M?.stepCount),Tu={},hu=a.length>0?Ml(Y.current).find((xu)=>String(xu?.id||"")===a):null;if(a.length>0){if(M?.status)Tu.status=String(M.status);if(M?.updatedAt)Tu.updatedAt=String(M.updatedAt);if(M?.queueId)Tu.queueId=String(M.queueId);if(!ju&&Number.isFinite(Number(M?.stepCount)))Tu.stepCount=Lu,Tu.llmStepCount=Lu;if(!ju&&Number.isFinite(Number(M?.outputMaxSeq)))Tu.outputMaxSeq=qQ(M.outputMaxSeq);if(!ju&&Wl(M?.traceStats))Tu.traceStats=M.traceStats,Tu.statsSource="oa-event-flow";if(Object.keys(Tu).length>0&&(O.current.has(a)||A.current===a))Pr(a,Tu,J.current);if(Object.keys(Tu).length>0)HT(a,Tu);if(A.current===a&&(M?.type==="trace-step-created"||M?.type==="task-updated"||M?.type==="trace-stats-updated")){let xu=XQ(hu),Mu=M?.type==="trace-step-created"||M?.type==="trace-stats-updated"&&!ju&&Number.isFinite(Number(M?.stepCount))&&(xu===null||Lu>xu);mT(a,Mu)}}if(BT(M,a,hu))D7()}V0(()=>{if(B.current){B.current=!1;return}ir(()=>hf(A.current),"Code Queue 加载失败")},[i?.id,Pu]),V0(()=>{if(!i||typeof EventSource>"u")return;let m=new EventSource(zE(f),{withCredentials:!0}),M=(nu)=>{try{DT(JSON.parse(String(nu.data||"{}")))}catch(ju){Tl(tf(ju,"解析 Code Queue 事件失败"))}},a=()=>{if(x4())D7()};return m.addEventListener("trace-step-created",M),m.addEventListener("task-updated",M),m.addEventListener("queue-updated",M),m.addEventListener("trace-stats-updated",M),document.addEventListener("visibilitychange",a),()=>{if(m.close(),document.removeEventListener("visibilitychange",a),H.current!==null)window.clearTimeout(H.current),H.current=null;if(E.current!==null)window.clearTimeout(E.current),E.current=null}},[i?.id,f,Pu]),V0(()=>{if(!i||!b||g)return;let m=String(b.id||"");if(!m)return;let M=String(b.updatedAt||"");if(k$(b))return;let a=`${m}:${M||"unknown"}:${String(b?._traceSummaryUpdatedAt||"")}`;if(Z.current.has(a))return;Z.current.add(a),yi(m,!0).catch((nu)=>Tl(tf(nu,"自动加载 Trace Summary 失败")))},[i?.id,b?.id,b?.updatedAt,b?.traceStats?.statsRevision,b?._traceSummaryUpdatedAt,b?._traceSummaryLoaded,g]);let pT=rn.length===0?T(pi,{title:Mf?zu?"搜索中":"没有匹配任务":"队列为空",text:Mf?zu?`正在搜索包含“${ti}”的 task...`:`未找到包含“${ti}”的 task;可换个关键词或切换 queue。`:"提交一个任务后,Codex 会串行执行并保存输出。"}):[G7.length>0?T(s4,{key:"unread",title:"已结束未读",tasks:G7,selectedId:k,emptyText:"暂无已结束未读任务。",onSelect:n6,onCopy:l6,onReference:f6,onMarkRead:r6,copiedTaskId:ut,markingReadTaskId:lt}):null,T(s4,{key:"active",title:"运行 / 排队",tasks:eL,selectedId:k,emptyText:"当前没有运行或排队任务。",onSelect:n6,onCopy:l6,onReference:f6,onMarkRead:r6,copiedTaskId:ut,markingReadTaskId:lt}),T(s4,{key:"history",title:"历史 session",tasks:uT,selectedId:k,emptyText:"最近没有完成、失败或取消的 session。",onSelect:n6,onCopy:l6,onReference:f6,onMarkRead:r6,copiedTaskId:ut,markingReadTaskId:lt}),T("div",{key:"pagination",className:"codex-task-pagination","data-testid":"codex-task-pagination"},T("span",null,Mf?`搜索“${ti}” · 已显示 ${rn.length} / ${Number.isFinite(it)?it:rn.length}`:`已加载 ${rn.length} / ${Number.isFinite(it)?it:rn.length}`),E7?T("button",{type:"button",className:"ghost-btn",disabled:aA,onClick:()=>void m7(),"data-testid":"codex-load-more-tasks-button"},aA?"加载中":Mf?"加载更多结果":"加载更早任务"):T("code",null,Mf?"已到结果末尾":"已到队列末尾"))],p7=(m,M=!1)=>T("label",{className:`code-queue-switcher ${M?"compact":""}`},T("span",null,M?"Queue":"查看 queue"),T("select",{value:Pu,onChange:(a)=>QT(String(a.target.value||p0)),"data-testid":m},T("option",{value:p0},`All queues · ${Number.isFinite(ii)?ii:fn.length} tasks · ${Sy.length} running`),Wr.map((a)=>T("option",{key:String(a?.id||""),value:String(a?.id||"")},k1(a))))),ST=T("div",{className:"codex-task-search","data-testid":"codex-task-search"},T("label",{htmlFor:"codex-task-search-input"},"搜索 task"),T("div",{className:"codex-task-search-row"},T("input",{id:"codex-task-search-input",type:"search",value:lu,placeholder:"关键词 / task ID / prompt",autoComplete:"off",onChange:(m)=>cu(String(m.target.value||"")),"data-testid":"codex-task-search-input"}),lu?T("button",{type:"button",className:"ghost-btn",onClick:()=>cu(""),"data-testid":"codex-task-search-clear"},"清除"):null),T("small",{"data-testid":"codex-task-search-summary"},Mf?zu?"搜索中...":`匹配 ${rn.length}/${Number.isFinite(it)?it:rn.length}`:"支持 task ID、prompt、状态、provider、模型和最近输出关键词")),XT=T("div",{className:"codex-trace-status","data-testid":"codex-trace-status-summary"},T("span",{className:"codex-trace-status-chip queued"},T("b",null,"排队"),String(IA)),T("span",{className:"codex-trace-status-chip running"},T("b",null,"运行"),String(t_)),T("span",{className:`codex-trace-status-chip unread ${en>0?"warn":""}`},T("b",null,"结束未读"),String(en)),T("span",{className:"codex-trace-status-chip service"},T("b",null,"服务"),`${lT.providerStatus||"unknown"} · ${i?.providerId||"D601"} · ${fT.public?"公网暴露":"仅 UniDesk frontend 代理访问"}`),T("span",{className:"codex-trace-status-chip"},T("b",null,"执行节点"),y_.map((m)=>m.id).join(" / ")),T("span",{className:"codex-trace-status-chip"},T("b",null,"执行模式"),H7.map((m)=>m.id).join(" / ")),T("span",{className:"codex-trace-status-chip"},T("b",null,"模型"),Z7.join(" / ")),T("span",{className:"codex-trace-status-chip"},T("b",null,"加载"),Cf?.phase==="complete"?TE(Cf?.totalMs):String(Cf?.phase||"idle")),T("span",{className:"codex-trace-status-chip"},T("b",null,"刷新"),f_?yl(f_):"--")),YT=T(st,{title:b?`Trace ${String(b.id).slice(0,22)}`:"Trace 输出",eyebrow:b?`${b.status} / view=${u0} / task queue=${I1(b)} / provider=${b.providerId||"D601"} / mode=${b.executionMode||"default"} / ${b.model} / agent loop trace`:`Agent loop trace / view=${u0}`,summary:XT,loading:g||py||zu||C||Cf?.phase==="loading",actions:T("div",{className:"panel-actions"},p7("code-queue-filter-select"),T("button",{type:"button",className:"ghost-btn codex-mark-all-read-btn",disabled:en===0||Zl||Dy,onClick:()=>void JT(),"data-testid":"codex-mark-all-read-button"},Dy?"标记中":`全部标已读${en>0?` (${en})`:""}`),b?T("button",{type:"button",className:"ghost-btn",disabled:g||Zl,onClick:()=>void OT(),"data-testid":"codex-load-full-trace-button"},g?"加载中":Ur(b)?"刷新 Summary":"加载 Summary"):null,T("button",{type:"button",className:"codex-session-title-toggle",onClick:()=>my((m)=>!m),"data-testid":"code-queue-sidebar-toggle"},Xr?"收起队列":"展开队列"),T("label",{className:"inline-check"},T("input",{type:"checkbox",checked:_l,onChange:(m)=>Nf(Boolean(m.target.checked))}),"自动滚动"),T("button",{type:"button",className:"ghost-btn",disabled:!iT||Zl,onClick:()=>void GT(),"data-testid":"codex-interrupt-button"},"打断"),T("button",{type:"button",className:"ghost-btn",disabled:!tT||Zl,onClick:()=>void zT()},"重试"),b?T(mQ,{title:"Codex Task",data:b,onOpen:l,testId:"raw-codex-task"}):null),className:"codex-output-panel"},T("div",{className:`codex-session-shell ${Xr?"":"queue-collapsed"}`},Xr?T("aside",{className:"codex-session-sidebar","data-testid":"codex-session-sidebar"},T("div",{className:"codex-session-sidebar-head"},T("div",null,T("span",null,gf(Pu)?"All queues":"Queue lane"),T("strong",null,`${u0} · ${fn.length}/${Number.isFinite(ii)?ii:fn.length} sessions · 未读 ${en}`)),T("button",{type:"button",className:"ghost-btn",onClick:()=>my(!1)},"收起")),p7("code-queue-filter-sidebar",!0),ST,T("div",{className:"codex-task-list codex-task-list-session",onScroll:UT,"data-testid":"codex-task-list-scroll"},pT)):null,T("div",{className:"codex-session-main"},T("div",{className:"codex-output-stack"},T(YO,{task:b,loading:g,onLoadPromptPart:AT,onLoadSteps:u6,onLoadStep:jT}),T(PO,{task:b})))));if(!i)return T(pi,{title:"Code Queue 未登记",text:"请在 config.json 的 microservices 中登记用户服务 id=code-queue"});let S7=Number(Cf?.totalMs),X7=Number(Cf?.queueMs),Y7=Number(Cf?.detailMs),P7=Number(Cf?.transcriptRows),PT=Cf?.phase==="complete"?"complete":String(Cf?.phase||"idle"),CT=ot(Wr,ri)||{id:ri,name:ri},MT=Jf?T(_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:Zl,onClose:()=>Of(!1),actions:[T("button",{key:"cancel",type:"button",className:"ghost-btn",onClick:()=>Of(!1),disabled:Zl,"data-testid":"codex-merge-queue-cancel"},"取消"),T("button",{key:"confirm",type:"button",className:"primary-btn",onClick:()=>void WT(),disabled:Zl||Ql||!yf,"data-testid":"codex-merge-queue-confirm"},Zl?"合并中...":"确认合并")]},T("p",{className:"codex-merge-dialog-target"},"目标 queue:",T("code",null,k1(CT))),T("label",null,"源 queue",T("select",{value:yf,disabled:Zl||Ql,onChange:(m)=>lf(String(m.target.value||"")),"data-testid":"codex-merge-source-queue-select"},T("option",{value:""},"选择要合并进来的源 queue"),ni.map((m)=>T("option",{key:String(m?.id||""),value:String(m?.id||"")},k1(m))))),T("p",{className:"codex-merge-dialog-note"},"会把源 queue 的任务归属合并到目标 queue,并自动删除源 queue;目标 queue 会按原 queueEnteredAt/createdAt 时间顺序运行。")):null;return T("div",{className:`code-queue-page ${n?"codex-standalone-page":""}`,"data-testid":"code-queue-page","data-load-state":PT,"data-load-total-ms":Number.isFinite(S7)?String(Math.round(S7*10)/10):"","data-load-queue-ms":Number.isFinite(X7)?String(Math.round(X7*10)/10):"","data-load-detail-ms":Number.isFinite(Y7)?String(Math.round(Y7*10)/10):"","data-load-transcript-rows":Number.isFinite(P7)?String(P7):"","data-load-task-id":String(Cf?.taskId||k||""),"data-load-partial":Cf?.partial?"true":"false"},T(nl,{error:vA,wide:!0}),MT,T("div",{className:"codex-session-stage codex-session-stage-top"},YT),T("div",{className:"code-queue-layout"},T("div",{className:"codex-left-rail"},T(st,{title:"提交任务",eyebrow:Ql?"Submitting...":zn.length>1?`${zn.length} tasks`:"Single or Batch",className:"codex-compose-panel",loading:Ql},T("form",{className:`codex-task-form ${Ql?"is-submitting":""}`,onSubmit:LT,"data-testid":"code-queue-task-form","aria-busy":Ql?"true":"false"},T("label",null,"Prompt / 多任务用单独一行 --- 分隔",T("textarea",{value:s,rows:8,disabled:Ql,onChange:(m)=>qu(m.target.value),placeholder:"写入 Codex 任务;多个任务之间用 --- 分隔。"})),T("label",{className:"codex-reference-field"},"引用任务 ID(可选)",T("input",{value:Zu,disabled:Ql,onChange:(m)=>Bu(m.target.value),placeholder:"codex_...;支持空格/逗号分隔多个 ID","data-testid":"codex-reference-task-id"}),Bi(Zu).length>0?T("code",null,`后端将解析并注入:${Bi(Zu).join(" / ")}`):null),T("div",{className:"codex-form-grid"},T("label",{className:"codex-submit-queue-field"},"Queue",T("div",{className:"codex-submit-queue-row"},T("select",{className:"codex-submit-queue-select",value:Iu,disabled:Ql,onChange:(m)=>ll(String(m.target.value||"default")),"data-testid":"code-queue-id-select"},Wr.map((m)=>T("option",{key:String(m?.id||""),value:String(m?.id||"")},k1(m)))),T("button",{type:"button",className:"ghost-btn codex-rename-queue-btn",onClick:()=>void qT(),disabled:Zl||Ql||!Iu,title:"修改当前 queue 的显示名称,ID 不变","data-testid":"codex-rename-queue-button"},"改名"),T("button",{type:"button",className:"ghost-btn codex-merge-queue-btn",onClick:()=>wT(),disabled:Zl||Ql||ni.length===0,title:"打开独立窗口选择源 queue 并合并到当前 queue;合并后自动删除源 queue","data-testid":"codex-merge-queue-button"},"合并 queue"),T("button",{type:"button",className:"ghost-btn codex-create-queue-btn",onClick:()=>void NT(),disabled:Zl||Ql,"data-testid":"codex-create-queue-button"},"创建 queue"))),T("label",null,"模型",T("select",{value:Qf,disabled:Ql,onChange:(m)=>Yu(m.target.value),"data-testid":"codex-model-select"},Z7.map((m)=>T("option",{key:m,value:m},m)))),T("label",null,"执行 Provider",T("select",{value:Zf,disabled:Ql,onChange:(m)=>_T(String(m.target.value||"D601")),"data-testid":"codex-provider-select"},y_.map((m)=>T("option",{key:m.id,value:m.id},`${m.label||m.id} · ${m.defaultWorkdir||_2(Pl,m.id)}${m.supportsWindowsNativeCodex?" · Windows native":""}`)))),T("label",null,"执行模式",T("select",{value:Au,disabled:Ql,onChange:(m)=>$T(String(m.target.value||"default")),"data-testid":"codex-execution-mode-select"},H7.map((m)=>T("option",{key:m.id,value:m.id},`${m.label||m.id}${m.id==="windows-native"?" · 宿主 Codex":""}`)))),T("label",null,"工作目录",T("input",{value:cf,disabled:Ql,onChange:(m)=>_f(m.target.value),placeholder:nT||Pl?.defaultWorkdir||"/workspace","data-testid":"codex-cwd-input"})),T("label",null,"最大尝试",T("input",{type:"number",min:1,max:99,value:fr,disabled:Ql,onChange:(m)=>$f(Number(m.target.value)),"data-testid":"codex-max-attempts-input"})),T("label",null,"入队份数",T("input",{type:"number",min:1,max:50,value:Hf,disabled:Ql,onChange:(m)=>Gn(Number(m.target.value)),"data-testid":"codex-repeat-count-input"}))),Py>1?T("label",{className:`codex-batch-confirm ${rr?"confirmed":""}`,"data-testid":"codex-batch-confirm-row"},T("input",{type:"checkbox",checked:rr,disabled:Ql,onChange:(m)=>dn(Boolean(m.target.checked)),"data-testid":"codex-batch-confirm-checkbox"}),T("span",null,`确认批量入队 ${Py} 个任务(prompt 分段 ${oA.length} × 入队份数 ${NQ(Hf)})`)):null,Ql?T("div",{className:"codex-submit-wait","data-testid":"codex-submit-wait"},"正在提交到后端,已锁定输入以防重复提交..."):null,T("div",{className:"codex-form-actions"},T("button",{type:"button",className:"ghost-btn",disabled:Zl||Ql||s.length===0&&Zu.length===0,onClick:()=>{qu(""),Bu(""),dn(!1);let m="已清空任务输入栏";sl(m),nr("success",m)},"data-testid":"codex-clear-input-button"},"清空输入"),T("button",{type:"submit",className:"primary-btn",disabled:rT,"data-testid":"codex-enqueue-button"},Ql?"提交中,请等待...":O7?`请确认批量入队 ${Py} 个任务`:zn.length>1?`批量入队 ${zn.length} 个任务`:"入队并运行"))))),T("div",{className:"codex-main-stage"},T("div",{className:"codex-detail-grid"},T(st,{title:"运行控制",eyebrow:tt?"Queued prompt editable":dA?"Active turn steer":"Steer when running",loading:Zl},T("div",{className:"codex-run-control-stack"},T(VO,{task:b,queueRows:Wr,busy:Zl,onMove:ET}),b?.id?T("form",{className:"codex-steer-form codex-edit-prompt-form",onSubmit:KT,"data-testid":"codex-edit-prompt-form"},T("label",null,"编辑 queued 用户 prompt",T("textarea",{value:Xu,rows:5,onChange:(m)=>ou(m.target.value),placeholder:"仅 QUEUED 且尚未开始运行的任务可在这里修改原始用户 prompt。",disabled:!tt||Zl,"data-testid":"codex-edit-prompt-textarea"})),T("label",{className:"codex-reference-field"},"引用任务 ID(可选,留空会清除引用)",T("input",{value:$l,disabled:!tt||Zl,onChange:(m)=>Rl(m.target.value),placeholder:"codex_...;支持空格/逗号分隔多个 ID","data-testid":"codex-edit-reference-task-id"}),Bi($l).length>0?T("code",null,`将保留/注入:${Bi($l).join(" / ")}`):null),T("div",{className:"codex-form-actions"},T("button",{type:"button",className:"ghost-btn",disabled:!b?.id||Zl,onClick:()=>{ou(b?a$(b):""),Rl(Array.isArray(b?.referenceTaskIds)?b.referenceTaskIds.join(" "):"")},"data-testid":"codex-edit-prompt-reset"},"恢复当前值"),T("button",{type:"submit",className:"primary-btn",disabled:!tt||Zl||Xu.trim().length===0,title:tt?"保存后会重写尚未运行任务的用户 prompt":"只有 QUEUED 且尚未开始的任务可编辑 prompt","data-testid":"codex-edit-prompt-submit"},"保存 queued prompt"))):null,T("form",{className:"codex-steer-form",onSubmit:TT},T("label",null,"追加 prompt",T("textarea",{value:fu,rows:4,onChange:(m)=>mu(m.target.value),placeholder:"给正在运行的 Codex session 推入新的指令或纠偏。",disabled:!dA})),T("button",{type:"submit",className:"primary-btn",disabled:!dA||Zl||fu.trim().length===0,"data-testid":"codex-steer-button"},"推入运行中 session")))),T(st,{title:"完成判定",eyebrow:b?.lastJudge?b.lastJudge.source:"judge",loading:g},b?.lastJudge?T("div",{className:"codex-judge-card","data-testid":"codex-task-judge-card"},T(Di,{status:b.lastJudge.decision},b.lastJudge.decision),T("strong",null,`${Math.round(Number(b.lastJudge.confidence||0)*100)}% confidence`),T("p",{"data-testid":"codex-task-judge-reason"},a4(b.lastJudge.reason||"--",180)),T(CQ,{judge:b.lastJudge,testId:"codex-task-judge-failure-details"}),b.lastJudge.continuePrompt?T("code",{"data-testid":"codex-task-judge-continue-prompt"},a4(b.lastJudge.continuePrompt,160)):null):T(pi,{title:"尚未判定",text:"Codex turn 结束后会由 MiniMax M2.7 或 fallback judge 判定 complete/retry/fail;retry 会在已有 thread 追加继续执行 prompt。"}))),T(mO,{stats:kA,queueName:u0,onRaw:l}),T(st,{title:"Attempts",eyebrow:"terminal vs interruption",loading:g},T(CO,{task:b})))))}var a1=Cu(Fl(),1);var Vu=a1.default.createElement,{useEffect:$2}=a1.default,A2=a1.default.useState,MO=a1.default.useRef,F2=` :root { --surfacePrimary: #ffffff; --surfaceSecondary: #f8fafc; @@ -226,64 +226,64 @@ nav .material-icons::before { display: none !important; } } -`;function f2({title:u,eyebrow:l,actions:f,children:r,className:n,loading:i}){return Vu("section",{className:`panel ${n||""}`},Vu("div",{className:"panel-head"},Vu("div",null,l?Vu("p",{className:"panel-eyebrow"},l):null,Vu(nl,{title:u,loading:i})),f?Vu("div",{className:"panel-actions"},f):null),Vu("div",{className:"panel-body"},r))}function ZZ({title:u,data:l,onOpen:f,testId:r}){return Vu("button",{type:"button",className:"ghost-btn","data-testid":r,onClick:()=>f(u,l)},"查看原始JSON")}function OZ({title:u,text:l}){return Vu("div",{className:"empty-state"},Vu("strong",null,u),Vu("span",null,l))}function mQ(u){return u?.runtime&&typeof u.runtime==="object"&&!Array.isArray(u.runtime)?u.runtime:{}}function PQ(u){return u?.backend&&typeof u.backend==="object"&&!Array.isArray(u.backend)?u.backend:{}}function CQ(u){return u?.repository&&typeof u.repository==="object"&&!Array.isArray(u.repository)?u.repository:{}}function HZ(u){return u.filter((f)=>f?.id==="filebrowser"||String(f?.id||"").startsWith("filebrowser-")).sort((f,r)=>{let n=(i)=>i.providerId==="D518"?0:i.providerId==="D601"?1:i.id==="filebrowser"?2:3;return n(f)-n(r)||String(f.id).localeCompare(String(r.id))})}function BZ(u){if(u?.providerId==="D518")return"D518";return u?.providerId||u?.name||u?.id||"Unknown"}function VZ(u,l,f="/"){let r=f.startsWith("/")?f:`/${f}`;return`${u}/microservices/${encodeURIComponent(l)}/proxy${r}`}function DZ(u,l){return`${u}/microservices/${encodeURIComponent(l)}/health`}async function XZ(u,l=16000){let f=new AbortController,r=setTimeout(()=>f.abort(),l);try{return await Tu(u,{signal:f.signal,failureFields:[!1]})}finally{clearTimeout(r)}}function MQ(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 a3(u){return u?.status==="OK"||u?.ok===!0}function SZ({service:u,active:l,health:f,onSelect:r,onRaw:n}){let i=mQ(u),y=PQ(u),t=CQ(u),_=i.container||{},c=a3(f?.body);return Vu("button",{type:"button",className:`filebrowser-target-card ${l?"active":""}`,"data-testid":`filebrowser-target-card-${u.id}`,onClick:r},Vu("span",{className:`status-badge ${c?"ok":i.providerStatus==="online"?"running":"warn"}`},c?"Health OK":i.providerStatus||"unknown"),Vu("strong",null,u.name||u.id),Vu("span",null,MQ(u)),Vu("code",null,`${y.nodeBindHost||"--"}:${y.nodePort||"--"}`),Vu("small",null,_.name?`${_.name} / ${_.state||"--"}`:`${t.composeService||"--"}`),Vu("span",{className:"filebrowser-card-raw",onClick:(A)=>{A.stopPropagation(),n(`${u.name} service`,u)}},"JSON"))}function RQ(u){try{return u?.contentDocument||u?.contentWindow?.document||null}catch{return null}}function n2(u){let l=RQ(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!==r2)f.textContent=r2;return!0}function YZ(u,l){let f=URL.createObjectURL(u),r=document.createElement("a");r.href=f,r.download=l,document.body.appendChild(r),r.click(),r.remove(),setTimeout(()=>URL.revokeObjectURL(f),2000)}function pZ(u,l){let f=RQ(u);if(f===null||f.documentElement===null)throw Error("无法访问 File Browser iframe 文档");n2(u);let r=Math.max(640,Math.ceil(u.clientWidth||f.documentElement.clientWidth||1280)),n=Math.max(480,Math.ceil(u.clientHeight||f.documentElement.clientHeight||720)),i=f.documentElement.cloneNode(!0);i.querySelectorAll("script, style, link[rel='stylesheet'], link[rel='preload'], link[rel='icon']").forEach((A)=>A.remove()),i.querySelectorAll("img").forEach((A)=>{A.removeAttribute("src"),A.removeAttribute("srcset")});let y=i.querySelector("head");if(y===null)y=f.createElement("head"),i.insertBefore(y,i.firstChild);let t=f.createElement("style");t.textContent=`${r2} -html,body{width:${r}px!important;min-height:${n}px!important;overflow:hidden!important;}`,y.appendChild(t);let _=new XMLSerializer().serializeToString(i),c=`${_}`;YZ(new Blob([c],{type:"image/svg+xml;charset=utf-8"}),l.replace(/\.png$/i,".svg"))}function xQ({microservices:u,onRaw:l,apiBaseUrl:f="/api"}){let r=HZ(Array.isArray(u)?u:[]),n=new URLSearchParams(window.location.search).get("target")||"",i=n==="filebrowser-d518"?"filebrowser":n,y=r.some((Z)=>Z.id===i)?i:r[0]?.id||"",[t,_]=l2(y),[c,A]=l2({loading:!1,refreshedAt:null,health:{},error:""}),[j,F]=l2({exporting:!1,message:"",error:""}),J=EZ(null),Q=r.find((Z)=>Z.id===t)||r[0]||null,w=mQ(Q),L=PQ(Q),U=CQ(Q),N=Q?c.health[Q.id]:null,q=Q?VZ(f,Q.id,"/"):"about:blank";u2(()=>{if(r.length===0)return;if(!t||!r.some((Z)=>Z.id===t))_(r[0].id)},[r.map((Z)=>Z.id).join(",")]),u2(()=>{let Z=0,H=setInterval(()=>{if(Z+=1,n2(J.current)||Z>=24)clearInterval(H)},500);return()=>clearInterval(H)},[q]),u2(()=>{if(r.length===0)return;let Z=!1;async function H(){A((h)=>({...h,loading:!0,error:""}));let D=await Promise.all(r.map(async(h)=>{try{let V=await XZ(DZ(f,h.id));return[h.id,{ok:!0,body:V}]}catch(V){return[h.id,{ok:!1,error:Ou(V,"File Browser health failed")}]}}));if(Z)return;A({loading:!1,refreshedAt:new Date().toISOString(),health:Object.fromEntries(D),error:""})}H();let E=setInterval(H,30000);return()=>{Z=!0,clearInterval(E)}},[r.map((Z)=>`${Z.id}:${Z.runtime?.providerStatus||""}`).join(","),f]);function W(Z){_(Z);let H=new URL(window.location.href);H.searchParams.set("target",Z),window.history.replaceState({},"",`${H.pathname}${H.search}`)}async function z(){if(j.exporting)return;F({exporting:!0,message:"",error:""});try{let Z=new Date().toISOString().replace(/[-:.TZ]/g,"").slice(0,14);await pZ(J.current,`unidesk-filebrowser-${Q?.id||"target"}-${Z}.png`),F({exporting:!1,message:"截图已导出",error:""})}catch(Z){F({exporting:!1,message:"",error:Ou(Z,"截图导出失败")})}}if(r.length===0)return Vu(OZ,{title:"File Browser 未登记",text:"请在 config.json 的 microservices 中登记 id=filebrowser 或 filebrowser-* 用户服务"});return Vu("div",{className:"filebrowser-page","data-testid":"filebrowser-page"},c.error?Vu(il,{error:c.error,wide:!0}):null,Vu(f2,{title:"文件管理器",eyebrow:"File Browser / Host Files",loading:c.loading,actions:Vu("div",{className:"panel-actions"},Q?Vu("button",{type:"button",className:"ghost-btn",onClick:z,disabled:j.exporting,"data-testid":"filebrowser-export-screenshot"},j.exporting?"导出中...":"导出截图"):null,Q?Vu("a",{className:"ghost-btn",href:q,target:"_blank",rel:"noreferrer"},"新窗口打开"):null,Q?Vu(ZZ,{title:"File Browser 当前目标",data:{service:Q,health:N},onOpen:l,testId:"raw-filebrowser-active"}):null)},Vu("div",{className:"filebrowser-hero"},Vu("div",null,Vu("span",{className:`status-badge ${a3(N?.body)?"ok":"warn"}`},a3(N?.body)?"Health OK":"Health Pending"),Vu("h3",null,Q?.name||"File Browser"),Vu("p",{className:"muted paragraph"},Q?.description||"通过 UniDesk 登录态代理访问,不开放 File Browser 公网端口。"),j.error?Vu("p",{className:"filebrowser-shot-error"},j.error):null,j.message?Vu("p",{className:"filebrowser-shot-ok"},j.message):null),Vu("div",{className:"microservice-ref-card"},Vu("span",null,"Provider"),Vu("strong",null,Q?.providerId||"--"),Vu("code",null,w.providerName||Q?.providerId||"--")),Vu("div",{className:"microservice-ref-card"},Vu("span",null,"Private Backend"),Vu("strong",null,`${L.nodeBindHost||"--"}:${L.nodePort||"--"}`),Vu("code",null,L.nodeBaseUrl||"--")),Vu("div",{className:"microservice-ref-card"},Vu("span",null,"Image"),Vu("strong",null,U.dockerfile||"filebrowser/filebrowser:v2.63.3"),Vu("code",null,U.commitId||"--")),Vu("div",{className:"microservice-ref-card"},Vu("span",null,"Mount"),Vu("strong",null,MQ(Q)),Vu("code",null,Q?.providerId==="main-server"?"/root, /var, /home":"/home, /mnt/c, /mnt/d")))),Vu(f2,{title:"浏览目标",eyebrow:`${r.length} host targets`,loading:c.loading},Vu("div",{className:"filebrowser-target-grid"},r.map((Z)=>Vu(SZ,{key:Z.id,service:Z,active:Z.id===Q?.id,health:c.health[Z.id],onSelect:()=>W(Z.id),onRaw:l})))),Vu(f2,{title:`${BZ(Q)} 文件视图`,eyebrow:N?.body?`Health ${a3(N.body)?"OK":"UNKNOWN"} / ${c.refreshedAt?tl(c.refreshedAt):"--"}`:"Embedded WebUI",className:"filebrowser-frame-panel"},Vu("div",{className:"filebrowser-frame-shell"},Vu("div",{className:"filebrowser-frame-toolbar"},Vu("span",null,"BaseURL"),Vu("code",null,`/api/microservices/${Q?.id||"filebrowser"}/proxy`),Vu("span",null,"Root"),Vu("code",null,"/srv"),Vu("span",{className:"filebrowser-compact-note"},"Compact layout injected")),Vu("iframe",{ref:J,key:q,title:`${Q?.name||"File Browser"} WebUI`,src:q,className:"filebrowser-frame","data-testid":"filebrowser-frame",onLoad:(Z)=>n2(Z.currentTarget),sandbox:"allow-downloads allow-forms allow-modals allow-same-origin allow-scripts"}))))}var uc=Pu(Jl(),1);var Uu=uc.default.createElement,{useEffect:mZ}=uc.default,PZ=uc.default.useState;function o3({status:u,children:l}){let f=String(u||"unknown").toLowerCase();return Uu("span",{className:`status-badge ${f}`},l||u||"unknown")}function On({label:u,value:l,hint:f,tone:r}){return Uu("article",{className:`metric-card ${r||""}`},Uu("div",{className:"metric-label"},u),Uu("div",{className:"metric-value"},l),Uu("div",{className:"metric-hint"},f))}function d3({title:u,eyebrow:l,actions:f,children:r,className:n,loading:i}){return Uu("section",{className:`panel ${n||""}`},Uu("div",{className:"panel-head"},Uu("div",null,l?Uu("p",{className:"panel-eyebrow"},l):null,Uu(nl,{title:u,loading:i})),f?Uu("div",{className:"panel-actions"},f):null),Uu("div",{className:"panel-body"},r))}function e3({title:u,data:l,onOpen:f,testId:r}){return Uu("button",{type:"button",className:"ghost-btn","data-testid":r,onClick:()=>f(u,l)},"查看原始JSON")}function i2({title:u,text:l}){return Uu("div",{className:"empty-state"},Uu("strong",null,u),Uu("span",null,l))}function CZ(u){return u?.runtime&&typeof u.runtime==="object"&&!Array.isArray(u.runtime)?u.runtime:{}}function MZ(u){return u?.backend&&typeof u.backend==="object"&&!Array.isArray(u.backend)?u.backend:{}}function RZ(u){return u?.repository&&typeof u.repository==="object"&&!Array.isArray(u.repository)?u.repository:{}}function Ei(u,l){let f=u&&typeof u==="object"?u[l]:void 0;return Number.isFinite(Number(f))?String(f):"--"}function xZ(u){return(Array.isArray(u?.jobs)?u.jobs:[]).slice(0,40)}function hZ(u){return(Array.isArray(u?.drafts)?u.drafts:[]).slice(0,12)}function hQ({microservices:u,onRaw:l,apiBaseUrl:f="/api"}){let r=u.find((Q)=>Q.id==="findjob")||null,[n,i]=PZ({loading:!1,error:"",health:null,summary:null,jobs:null,drafts:null,refreshedAt:null});async function y(){if(!r)return;i((Q)=>({...Q,loading:!0,error:""}));try{let[Q,w,L,U]=await Promise.all([Tu(`${f}/microservices/findjob/health`),Tu(`${f}/microservices/findjob/proxy/api/summary`),Tu(`${f}/microservices/findjob/proxy/api/jobs?__unideskArrayLimit=jobs:40`),Tu(`${f}/microservices/findjob/proxy/api/drafts`)]);i({loading:!1,error:"",health:Q,summary:w,jobs:L,drafts:U,refreshedAt:new Date})}catch(Q){i((w)=>({...w,loading:!1,error:Ou(Q,"FindJob 加载失败")}))}}if(mZ(()=>{y()},[r?.id,r?.runtime?.providerStatus]),!r)return Uu(i2,{title:"FindJob 未登记",text:"请在 config.json 的 microservices 中登记用户服务 id=findjob"});let t=CZ(r),_=RZ(r),c=MZ(r),A=n.summary||{},j=xZ(n.jobs),F=hZ(n.drafts),J=n.jobs?._unidesk?.arrayLimits?.jobs;return Uu("div",{className:"findjob-page","data-testid":"findjob-page"},Uu(d3,{title:"FindJob 工作台",eyebrow:"D601 用户服务",loading:n.loading,actions:Uu("div",{className:"panel-actions"},Uu("button",{type:"button",className:"ghost-btn",onClick:y,disabled:n.loading,"data-testid":"findjob-refresh-button"},n.loading?"刷新中":"刷新"),Uu(e3,{title:"FindJob 用户服务",data:r,onOpen:l,testId:"raw-findjob-service"}))},Uu("div",{className:"findjob-hero"},Uu("div",null,Uu("div",{className:"node-version-line"},Uu(o3,{status:t.providerStatus==="online"?"online":"warn"},t.providerStatus||"unknown"),Uu("span",null,r.providerId),Uu("span",null,c.public?"公网暴露":"仅 UniDesk frontend 代理访问")),Uu("p",{className:"muted paragraph"},r.description)),Uu("div",{className:"microservice-ref-card"},Uu("span",null,"Repo"),Uu("strong",null,_.url||"--"),Uu("code",null,_.commitId||"--")),Uu("div",{className:"microservice-ref-card"},Uu("span",null,"D601 Docker"),Uu("strong",null,`${c.nodeBindHost||"--"}:${c.nodePort||"--"}`),Uu("code",null,`${_.composeFile||"--"} / ${_.composeService||"--"}`))),Uu(il,{error:n.error,wide:!0})),Uu("div",{className:"findjob-grid"},Uu(d3,{title:"岗位指标",eyebrow:n.refreshedAt?`Updated ${tl(n.refreshedAt)}`:"Summary",loading:n.loading},Uu("div",{className:"metric-grid"},Uu(On,{label:"岗位总量",value:Ei(A,"totalJobs"),hint:"tracked jobs",tone:"ok"}),Uu(On,{label:"原始岗位",value:Ei(A,"rawJobs"),hint:"raw queue"}),Uu(On,{label:"已验证",value:Ei(A,"verifiedJobs"),hint:"verified set"}),Uu(On,{label:"优先处理",value:Ei(A,"prioritizedJobs"),hint:"prioritized"}),Uu(On,{label:"过期",value:Ei(A,"staleJobs"),hint:"stale jobs",tone:"warn"}),Uu(On,{label:"无效",value:Ei(A,"invalidJobs"),hint:"invalid jobs",tone:"warn"}),Uu(On,{label:"上海",value:Ei(A,"shanghaiJobs"),hint:"city filter"}),Uu(On,{label:"Health",value:n.health?.ok?"OK":"--",hint:"D601 /api/health"})),Uu("div",{className:"panel-actions inline-actions"},Uu(e3,{title:"FindJob Summary",data:A,onOpen:l,testId:"raw-findjob-summary"}))),Uu(d3,{title:"近期岗位",eyebrow:J?`${J.returnedLength}/${J.originalLength} Preview`:`${j.length} Preview`,loading:n.loading},j.length===0?Uu(i2,{title:"暂无岗位预览",text:"等待 D601 findjob backend 返回 /api/jobs"}):Uu("div",{className:"table-wrap findjob-job-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("th",null,"截止"),Uu("th",null,"证据"))),Uu("tbody",null,j.map((Q)=>Uu("tr",{key:Q.id},Uu("td",null,Uu(o3,{status:String(Q.priority||"").toLowerCase()||"unknown"},Q.priority||"--")),Uu("td",null,Uu(o3,{status:String(Q.status||"").toLowerCase()||"unknown"},Q.status||"--")),Uu("td",null,Q.organization_name||"--",Uu("code",null,Q.id||"--")),Uu("td",null,Q.display_title||Q.title||"--"),Uu("td",null,Q.display_city||Q.city||"--"),Uu("td",null,Q.workflow_stage||"--"),Uu("td",null,Q.deadline||"--"),Uu("td",null,Q.evidence_url?Uu("a",{href:Q.evidence_url,target:"_blank",rel:"noreferrer"},"打开"):Uu("span",{className:"muted"},"无"))))))),Uu("div",{className:"panel-actions inline-actions"},Uu(e3,{title:"FindJob Jobs Preview",data:n.jobs,onOpen:l,testId:"raw-findjob-jobs"}))),Uu(d3,{title:"草稿与报告",eyebrow:`${F.length} Drafts`,loading:n.loading},F.length===0?Uu(i2,{title:"暂无草稿",text:"D601 findjob backend 未返回 drafts"}):Uu("div",{className:"draft-list"},F.map((Q)=>Uu("article",{key:Q.id,className:"draft-card"},Uu("div",{className:"node-card-head"},Uu("strong",null,Q.id),Uu(o3,{status:Q.status},Q.status||"--")),Uu("div",{className:"docker-meta compact"},Uu("span",null,Q.workflow_stage||"--"),Uu("span",null,`jobs ${Q.counts?.jobs??0}`),Uu("span",null,`reports ${Q.counts?.reports??0}`)),Uu("span",null,Q.latestReportPath||"暂无报告"),Uu("code",null,qu(Q.updated_at||Q.updatedAt))))),Uu("div",{className:"panel-actions inline-actions"},Uu(e3,{title:"FindJob Drafts",data:n.drafts,onOpen:l,testId:"raw-findjob-drafts"})))))}var gt=Pu(Jl(),1);var M=gt.default.createElement,{useEffect:bZ}=gt.default,y2=gt.default.useState;function vt(u){let l=Number(u);return Number.isFinite(l)?`${Math.max(0,Math.min(100,l)).toFixed(1)}%`:"--"}function _2(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 $2(u,l=2){let f=Number(u);if(!Number.isFinite(f))return u===!1?"false":u===!0?"true":"--";let r=Math.abs(f);if(Number.isInteger(f)||r>=1000)return f.toLocaleString("zh-CN",{maximumFractionDigits:0});if(r>=1)return f.toLocaleString("zh-CN",{maximumFractionDigits:l});return f.toLocaleString("zh-CN",{maximumFractionDigits:Math.max(l,6)})}function It(u){if(u===null||u===void 0||u==="")return"--";if(typeof u==="boolean")return u?"true":"false";if(typeof u==="number")return $2(u,4);if(Array.isArray(u))return u.map((l)=>It(l)).join(" x ");if(typeof u==="object")return"已上报";return String(u)}function lc(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 fc(u){return u.replace(/[^a-zA-Z0-9_-]/g,"-")}function If(u){return u&&typeof u==="object"&&!Array.isArray(u)?u:{}}function kt({status:u,children:l}){let f=String(u||"unknown").toLowerCase();return M("span",{className:`status-badge ${f}`},l||u||"unknown")}function Hn({label:u,value:l,hint:f,tone:r}){return M("article",{className:`metric-card ${r||""}`},M("div",{className:"metric-label"},u),M("div",{className:"metric-value"},l),M("div",{className:"metric-hint"},f))}function t2({title:u,eyebrow:l,actions:f,children:r,className:n,loading:i}){return M("section",{className:`panel ${n||""}`},M("div",{className:"panel-head"},M("div",null,l?M("p",{className:"panel-eyebrow"},l):null,M(nl,{title:u,loading:i})),f?M("div",{className:"panel-actions"},f):null),M("div",{className:"panel-body"},r))}function v1({title:u,data:l,onOpen:f,testId:r}){return M("button",{type:"button",className:"ghost-btn","data-testid":r,onClick:(n)=>{n?.stopPropagation?.(),f(u,l)}},"查看原始JSON")}function p0({title:u,text:l}){return M("div",{className:"empty-state"},M("strong",null,u),M("span",null,l))}function vZ(u){return u?.runtime&&typeof u.runtime==="object"&&!Array.isArray(u.runtime)?u.runtime:{}}function kZ(u){return u?.backend&&typeof u.backend==="object"&&!Array.isArray(u.backend)?u.backend:{}}function IZ(u){return u?.repository&&typeof u.repository==="object"&&!Array.isArray(u.repository)?u.repository:{}}function gZ(u){return u?.counts&&typeof u.counts==="object"&&!Array.isArray(u.counts)?u.counts:{}}function sZ(u){return Array.isArray(u?.jobs)?u.jobs.slice(0,240):[]}function aZ(u){return Array.isArray(u?.projects)?u.projects.slice(0,1000):[]}function rc(u){return Array.isArray(u?.projects)?u.projects:[]}function oZ(u,l){if(Array.isArray(l?.gpu))return l.gpu;if(Array.isArray(u?.gpu))return u.gpu;return[]}function Fr(u,l){return`${u}/microservices/met-nonlinear/proxy${l}`}function bQ(u){return u.startedAt&&u.finishedAt?_2((Date.parse(u.finishedAt)-Date.parse(u.startedAt))/1000):"--"}function dZ(u){let l=u.progress||{};if(l.etaSeconds!==null&&l.etaSeconds!==void 0&&l.etaSeconds!==""){let y=Number(l.etaSeconds);if(Number.isFinite(y))return Math.max(0,y)}let f=Number(l.currentEpoch),r=Number(l.epochTarget??u.epochTarget),n=Date.parse(u.startedAt||"");if(!Number.isFinite(f)||f<=0||!Number.isFinite(r)||r<=f||!Number.isFinite(n))return null;let i=Math.max(0,(Date.now()-n)/1000);if(i<=0)return null;return Math.max(0,i/f*(r-f))}function vQ(u){let l=u.progress||{},f=Number(l.epochPerHour);if(Number.isFinite(f)&&f>0)return f;let r=Date.parse(u.startedAt||""),n=["succeeded","failed","canceled"].includes(u.status)?Date.parse(u.finishedAt||""):Date.now();if(!Number.isFinite(r)||!Number.isFinite(n)||n<=r)return null;let i=Number(l.currentEpoch??u.epochTarget);if(!Number.isFinite(i)||i<=0)return null;return i/((n-r)/3600000)}function kQ(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 IQ(u,l,f){return{name:u,path:l,depth:f,count:0,children:[],project:null}}function eZ(u){let l=IQ("","",-1);for(let r of u){let i=String(r?.projectPath||"").replace(/\\/g,"/").split("/").filter(Boolean);if(i.length===0)continue;let y=l,t=[];for(let[_,c]of i.entries()){t.push(c);let A=t.join("/"),j=y.children.find((F)=>F.path===A);if(!j)j=IQ(c,A,_),y.children.push(j);if(_===i.length-1)j.project=r;y=j}}let f=(r)=>{let n=r.children.reduce((i,y)=>i+f(y),0);return r.count=(r.project?1:0)+n,r.children.sort((i,y)=>{if(Boolean(i.project)!==Boolean(y.project))return i.project?1:-1;return i.name.localeCompare(y.name,"zh-CN",{numeric:!0,sensitivity:"base"})}),r.count};return f(l),l}function uO(u){let l=If(u.data);return If(l.project).projectPath?If(l.project):l}function lO(u){return If(If(u.data).job)}function gQ({microservices:u,onRaw:l,apiBaseUrl:f="/api"}){let r=u.find((P)=>P.id==="met-nonlinear")||null,[n,i]=y2({loading:!1,actionBusy:!1,error:"",health:null,summary:null,queue:null,projects:null,history:null,images:null,refreshedAt:null}),[y,t]=y2({loading:!1,error:"",kind:"",key:"",title:"",data:null}),[_,c]=y2(()=>({activeTab:"projects",selectedProjects:{},expandedProjectDirs:{},sourceProject:"",forkCount:1,forkEpochs:200,forkPrefix:`ui_fork_${Date.now()}`,maxConcurrency:3,targetGpuName:"2080 Ti",actionMessage:""}));function A(P){c((e)=>({...e,...P}))}async function j(P=_.activeTab){if(!r)return;i((e)=>({...e,loading:!0,error:""}));try{let e=[["health",Tu(`${f}/microservices/met-nonlinear/health`)],["summary",Tu(Fr(f,"/api/summary"))]];if(P==="projects")e.push(["projectsRoot",Tu(Fr(f,"/api/projects?root=projects&limit=500"))]),e.push(["exProjectsRoot",Tu(Fr(f,"/api/projects?root=ex_projects&limit=500"))]);if(P==="current"||P==="completed"||P==="failed")e.push(["queue",Tu(Fr(f,"/api/queue"))]);if(P==="completed"||P==="failed")e.push(["history",Tu(Fr(f,"/api/history"))]);if(P==="gpu")e.push(["images",Tu(Fr(f,"/api/images"))]);let uu=Object.fromEntries(await Promise.all(e.map(async([s,Nu])=>[s,await Nu]))),Ku={loading:!1,actionBusy:!1,error:"",health:uu.health,summary:uu.summary,refreshedAt:new Date};if(uu.projectsRoot||uu.exProjectsRoot){let{projectsRoot:s,exProjectsRoot:Nu}=uu;Ku.projects={ok:s?.ok!==!1&&Nu?.ok!==!1,roots:[{root:"projects",count:rc(s).length},{root:"ex_projects",count:rc(Nu).length}],projects:[...rc(s),...rc(Nu)]}}if(uu.queue)Ku.queue=uu.queue;if(uu.history)Ku.history=uu.history;if(uu.images)Ku.images=uu.images;i((s)=>({...s,...Ku}))}catch(e){i((uu)=>({...uu,loading:!1,actionBusy:!1,error:Ou(e,"MET Nonlinear 加载失败")}))}}async function F(P,e){i((uu)=>({...uu,actionBusy:!0,error:""})),A({actionMessage:`${P}...`});try{let uu=await e();A({actionMessage:uu||`${P}完成`}),await j()}catch(uu){i((Ku)=>({...Ku,actionBusy:!1,error:Ou(uu,`${P}失败`)}))}}async function J(){await F("保存并发设置",async()=>{await Tu(Fr(f,"/api/queue/settings"),{method:"PUT",body:JSON.stringify({maxConcurrency:Number(_.maxConcurrency),targetGpuName:_.targetGpuName})})})}function Q(){return Object.entries(_.selectedProjects).filter(([,P])=>P).map(([P])=>P)}async function w(){let P=Q();if(P.length===0)throw Error("请先选择至少一个 project");await F("加入待启动队列",async()=>{await Tu(Fr(f,"/api/queue"),{method:"POST",body:JSON.stringify({projectPaths:P,maxConcurrency:Number(_.maxConcurrency),targetGpuName:_.targetGpuName,start:!1})}),A({activeTab:"current",selectedProjects:{}})})}async function L(){let P=_.sourceProject||p[0]?.projectPath;if(!P)throw Error("请先选择源 project");await F("Fork Project",async()=>{let e=await Tu(Fr(f,"/api/projects/fork"),{method:"POST",body:JSON.stringify({sourceProject:P,count:Number(_.forkCount),epochs:Number(_.forkEpochs),prefix:_.forkPrefix})}),uu=Array.isArray(e.projectPaths)?e.projectPaths:[],Ku=uu.reduce((s,Nu)=>{return s[Nu]=!0,s},{..._.selectedProjects});return A({selectedProjects:Ku}),`已 fork ${uu.length} 个 project,并已自动勾选;请确认后点击加入待启动队列。`})}async function U(){await F("启动队列",async()=>{await Tu(Fr(f,"/api/queue/start"),{method:"POST",body:JSON.stringify({maxConcurrency:Number(_.maxConcurrency),targetGpuName:_.targetGpuName})}),A({activeTab:"current"})})}async function N(P){await F("取消任务",async()=>{await Tu(Fr(f,`/api/jobs/${encodeURIComponent(P.id)}/cancel`),{method:"POST",body:JSON.stringify({})})})}async function q(P){let e=String(P?.projectPath||"");if(!e)return;t({loading:!0,error:"",kind:"project",key:e,title:e,data:null});try{let uu=await Tu(Fr(f,`/api/projects/config?path=${encodeURIComponent(e)}`));t({loading:!1,error:"",kind:"project",key:e,title:e,data:uu})}catch(uu){t({loading:!1,error:Ou(uu,"Project 详情加载失败"),kind:"project",key:e,title:e,data:null})}}async function W(P){let e=String(P?.id||"");if(!e)return;t({loading:!0,error:"",kind:"job",key:e,title:P.projectPath||e,data:null});try{let uu=await Tu(Fr(f,`/api/jobs/${encodeURIComponent(e)}`));t({loading:!1,error:"",kind:"job",key:e,title:uu?.job?.projectPath||P.projectPath||e,data:uu})}catch(uu){t({loading:!1,error:Ou(uu,"Job 详情加载失败"),kind:"job",key:e,title:P.projectPath||e,data:null})}}if(bZ(()=>{j(_.activeTab)},[r?.id,r?.runtime?.providerStatus,_.activeTab]),!r)return M(p0,{title:"MET Nonlinear 未登记",text:"请在 config.json 的 microservices 中登记用户服务 id=met-nonlinear"});let z=vZ(r),Z=IZ(r),H=kZ(r),E=gZ(n.queue?.queue||n.summary?.queue),D=oZ(n.health,n.queue),h=n.health?.targetGpu||n.summary?.targetGpu||D.find((P)=>String(P.name||"").includes("2080")),V=n.images?.mlImage||n.health?.image||{},S=sZ(n.queue),p=aZ(n.projects),O=eZ(p),m=_.sourceProject||p[0]?.projectPath||"",X=S.filter((P)=>["staged","queued","running"].includes(P.status)),v=S.filter((P)=>P.status==="succeeded"),T=S.filter((P)=>["failed","canceled"].includes(P.status)),Y=Array.isArray(n.history?.jobs)?n.history.jobs.slice(0,120):[],k=[{id:"projects",label:"项目库",count:p.length},{id:"current",label:"当前队列",count:X.length||Number(E.staged||0)+Number(E.queued||0)+Number(E.running||0)},{id:"completed",label:"已完成",count:v.length||Number(E.succeeded||0)},{id:"failed",label:"失败诊断",count:T.length||Number(E.failed||0)+Number(E.canceled||0)},{id:"gpu",label:"GPU/镜像",count:D.length}];function I(P,e){if(P.length===0)return M(p0,{title:e==="current"?"当前队列为空":"暂无记录",text:e==="current"?"从项目库选择或 fork project 后先加入待启动队列,再启动队列。":"终态任务会显示耗时、exit code 和失败诊断。"});return M("div",{className:"table-wrap met-job-table"},M("table",null,M("thead",null,M("tr",null,M("th",null,"状态"),M("th",null,"Project"),M("th",null,"Epoch"),M("th",null,"速度"),M("th",null,"ETA/耗时"),M("th",null,"GPU"),M("th",null,"Exit"),M("th",null,"更新时间"),M("th",null,"操作"))),M("tbody",null,P.map((uu)=>{let Ku=uu.progress||{},s=["staged","queued","running"].includes(uu.status),Nu=y.kind==="job"&&y.key===uu.id;return M("tr",{key:uu.id,className:`met-click-row ${Nu?"active":""}`,onClick:()=>W(uu),"data-testid":`met-job-row-${fc(uu.id)}`},M("td",null,M(kt,{status:uu.status},kQ(uu.status))),M("td",null,M("button",{type:"button",className:"met-inline-link",onClick:(Eu)=>{Eu.stopPropagation(),W(uu)}},uu.projectPath),M("code",null,uu.id)),M("td",null,M("span",null,`${Ku.currentEpoch??"--"} / ${Ku.epochTarget??uu.epochTarget??"--"}`),M("div",{className:"met-progress"},M("span",{style:{width:vt(Ku.progressPercent)}}))),M("td",null,M("strong",null,lc(vQ(uu)))),M("td",null,uu.status==="succeeded"||uu.status==="failed"||uu.status==="canceled"?bQ(uu):uu.status==="running"?`ETA ${_2(dZ(uu))}`:"--"),M("td",null,uu.gpuName||"--"),M("td",null,uu.exitCode??"--"),M("td",null,qu(uu.updatedAt)),M("td",null,s?M("button",{type:"button",className:"ghost-btn mini",onClick:(Eu)=>{Eu.stopPropagation(),N(uu)},disabled:n.actionBusy},"取消"):null,M(v1,{title:`MET Job ${uu.id}`,data:uu,onOpen:l,testId:`raw-met-job-${uu.id}`})))}))))}function b(){return M("div",{className:"met-queue-summary","data-testid":"met-current-summary"},M(kt,{status:"staged"},`待启动 ${E.staged??0}`),M(kt,{status:"queued"},`排队中 ${E.queued??0}`),M(kt,{status:"running"},`训练中 ${E.running??0}`),M("span",null,`最大并发 ${n.summary?.queue?.maxConcurrency??n.queue?.queue?.maxConcurrency??_.maxConcurrency}`),M("span",null,`目标 GPU ${n.summary?.queue?.targetGpuName??n.queue?.queue?.targetGpuName??_.targetGpuName}`))}function o(P,e){let uu=_.expandedProjectDirs[P];return uu===void 0?e<2:Boolean(uu)}function g(P,e){let uu=o(P,e);A({expandedProjectDirs:{..._.expandedProjectDirs,[P]:!uu}})}function x(P){let e=8+Math.max(0,P.depth)*16;if(Boolean(P.project)){let s=P.project,Nu=Boolean(_.selectedProjects[s.projectPath]),Eu=y.kind==="project"&&y.key===s.projectPath;return M("div",{key:P.path,className:`met-tree-row project ${Nu?"selected":""} ${Eu?"active":""}`,style:{paddingLeft:e},onClick:()=>q(s),"data-testid":`met-project-node-${fc(s.projectPath)}`},M("div",{className:"met-tree-name"},M("input",{type:"checkbox",checked:Nu,onClick:(Hu)=>Hu.stopPropagation(),onChange:(Hu)=>A({selectedProjects:{..._.selectedProjects,[s.projectPath]:Hu.target.checked}}),"data-testid":`met-project-checkbox-${fc(s.projectPath)}`}),M("button",{type:"button",className:"met-inline-link project-path",onClick:(Hu)=>{Hu.stopPropagation(),q(s)}},P.name)),M("span",null,s.useModel||"--"),M("span",null,s.epochTrain??"--"),M("span",null,vt(s.progress?.progressPercent)),M("span",null,lc(s.progress?.epochPerHour)))}let Ku=o(P.path,P.depth);return M(gt.default.Fragment,{key:P.path},M("div",{className:"met-tree-row folder",style:{paddingLeft:e},"data-testid":`met-project-folder-${fc(P.path)}`},M("button",{type:"button",className:"met-tree-toggle",onClick:()=>g(P.path,P.depth),"aria-label":Ku?`折叠 ${P.path}`:`展开 ${P.path}`},Ku?"-":"+"),M("strong",null,P.name),M("span",{className:"met-tree-count"},`${P.count} projects`)),Ku?P.children.map((s)=>x(s)):null)}function lu(P){return M("div",{className:"met-detail-kv"},P.map((e)=>M("div",{key:e.label,className:"met-detail-kv-item"},M("span",null,e.label),M("strong",null,It(e.value)),e.hint?M("small",null,e.hint):null)))}function _u(P,e){return M("div",{className:"met-detail-section"},M("h3",null,P),lu(e))}function $u(P){if(!Array.isArray(P)||P.length===0)return M(p0,{title:"模型层未上报",text:"等待 data/model_info.json 或 compute_analysis.json 生成。"});return M("div",{className:"table-wrap met-layer-table"},M("table",null,M("thead",null,M("tr",null,M("th",null,"Layer"),M("th",null,"Type"),M("th",null,"Params"),M("th",null,"Trainable"),M("th",null,"Compute"))),M("tbody",null,P.slice(0,18).map((e,uu)=>M("tr",{key:`${e.name||"layer"}-${uu}`},M("td",null,e.name||`#${uu+1}`),M("td",null,e.type||"--"),M("td",null,$2(e.num_params)),M("td",null,e.trainable===void 0?"--":String(Boolean(e.trainable))),M("td",null,$2(e.compute?.total??e.estimated_cost?.weighted_units?.total)))))))}function ju(P){let e=Array.isArray(P)?P:[];if(e.length===0)return M(p0,{title:"data/ 暂无文件",text:"训练或评估完成后会生成 training_state、metrics、model_info 等文件。"});return M("div",{className:"met-file-chip-grid"},e.slice(0,48).map((uu)=>M("span",{key:uu},uu)),e.length>48?M("span",null,`+${e.length-48}`):null)}function zu(P){let e=String(P||"").replace(/\x1b\[[0-9;]*[A-Za-z]/g,"").split(/\r?\n/).map((uu)=>uu.trim()).filter(Boolean).slice(-12);if(e.length===0)return M(p0,{title:"暂无日志尾部",text:"该任务未上报 logTail 或日志已轮转。"});return M("div",{className:"met-log-lines"},e.map((uu,Ku)=>M("div",{key:`${Ku}-${uu.slice(0,16)}`},uu)))}function Wu(){if(y.loading)return M("section",{className:"met-detail-panel","data-testid":"met-detail-panel"},M("div",{className:"panel-head compact"},M("div",null,M("p",{className:"panel-eyebrow"},"Detail Loading"),M(nl,{title:"详情加载中",loading:!0}))),M(p0,{title:"详情加载中",text:y.title||"正在读取 D601 data/ 和 config.json"}));if(y.error)return M("section",{className:"met-detail-panel","data-testid":"met-detail-panel"},M(il,{error:y.error,wide:!0}));if(!y.data)return M("section",{className:"met-detail-panel muted","data-testid":"met-detail-panel"},M(p0,{title:"选择一个项目或任务查看详情",text:"项目库、当前队列、已完成和失败诊断中的行都可以点击;默认只展示结构化字段,原始 JSON 需显式点击按钮。"}));let P=uO(y),e=lO(y),uu=If(P.config),Ku=If(P.progress||e.progress),s=If(P.data),Nu=If(P.metrics||s.metrics||Ku.trainingInfo?.evaluation_metrics),Eu=If(s.trainingInfo||Ku.trainingInfo),Hu=If(s.trainingState),vu=If(P.model||s.model),ul=Array.isArray(vu.modelSummary)&&vu.modelSummary.length>0?vu.modelSummary:vu.computeLayers,mu=If(Eu.evaluation_metrics),Fl=y.kind==="job"?"训练任务详情":"Project 详情";return M("section",{className:"met-detail-panel","data-testid":"met-detail-panel"},M("div",{className:"panel-head compact"},M("div",null,M("p",{className:"panel-eyebrow"},y.kind==="job"?"Job + Project Detail":"Project Library Detail"),M(nl,{title:Fl}),M("code",null,P.projectPath||e.projectPath||y.title)),M("div",{className:"panel-actions"},M(v1,{title:`MET ${Fl}`,data:y.data,onOpen:l,testId:"raw-met-detail"}))),y.kind==="job"?_u("任务状态",[{label:"Job ID",value:e.id},{label:"状态",value:kQ(e.status)},{label:"GPU",value:e.gpuName},{label:"Exit Code",value:e.exitCode},{label:"耗时",value:bQ(e)},{label:"训练速度",value:lc(vQ({...e,progress:Ku}))}]):null,_u("config.json",[{label:"use_model",value:uu.use_model},{label:"epoch_train",value:uu.epoch_train},{label:"step_per_epoch",value:uu.step_per_epoch},{label:"learning_rate",value:uu.learning_rate},{label:"using_gpu",value:uu.using_gpu},{label:"use_points",value:uu.use_points},{label:"sample_rate",value:uu.sample_rate},{label:"time_clipped_s",value:uu.time_clipped_s},{label:"H_UNITS",value:uu.H_UNITS},{label:"INNER_KAN_UNITS",value:uu.INNER_KAN_UNITS},{label:"INNER_KAN_LAYERS",value:uu.INNER_KAN_LAYERS},{label:"GRID_SIZE",value:uu.GRID_SIZE},{label:"SPLINE_ORDER",value:uu.SPLINE_ORDER},{label:"USE_FAST_MODEL",value:uu.USE_FAST_MODEL},{label:"IIR_TRAINABLE",value:uu.IIR_TRAINABLE}]),_u("data/ 训练状态",[{label:"Epoch",value:`${Ku.currentEpoch??Hu.current_epoch??Hu.completed_epoch??"--"} / ${Ku.epochTarget??uu.epoch_train??"--"}`},{label:"Progress",value:vt(Ku.progressPercent)},{label:"Last Loss",value:Ku.lastLoss??Hu.loss},{label:"Last Val Loss",value:Ku.lastValLoss??Hu.val_loss},{label:"Min Loss",value:Eu.min_loss??Hu.min_loss},{label:"Min Val Loss",value:Eu.min_val_loss??Hu.min_val_loss},{label:"Log Lines",value:Ku.logLineCount},{label:"ETA",value:_2(Ku.etaSeconds??Hu.remaining_time)},{label:"训练速度",value:lc(Ku.epochPerHour??Hu.smoothed_speed)},{label:"Training Alive",value:Hu.training_alive}]),_u("模型参数",[{label:"Model Type",value:vu.modelType??uu.use_model},{label:"Total Params",value:vu.totalParams,hint:vu.totalParams===null||vu.totalParams===void 0?"未上报":"data/model_info.json"},{label:"Trainable",value:vu.trainableParams},{label:"Non-trainable",value:vu.nonTrainableParams},{label:"Compute Cost",value:vu.computeCost},{label:"Estimate Status",value:vu.estimateStatus},{label:"Unsupported Layers",value:vu.unsupportedLayerCount}]),_u("指标",[{label:"train_loss",value:Nu.train_loss??mu.train_loss},{label:"val_loss",value:Nu.val_loss??mu.val_loss},{label:"train_mae",value:Nu.train_mae??mu.train_mae},{label:"val_mae",value:Nu.val_mae??mu.val_mae},{label:"train_afmae",value:Nu.train_afmae??mu.train_afmae},{label:"val_afmae",value:Nu.val_afmae??mu.val_afmae},{label:"freq_drift_hz",value:Nu.freq_drift_hz},{label:"sens_drift_percent",value:Nu.sens_drift_percent},{label:"linearity_percent",value:Nu.linearity_percent},{label:"weights_source",value:Nu.weights_source??mu.weights_source},{label:"lr min/mean/max",value:`${It(Eu.learning_rate_min)} / ${It(Eu.learning_rate_mean)} / ${It(Eu.learning_rate_max)}`}]),M("div",{className:"met-detail-section"},M("h3",null,"模型层"),$u(ul)),M("div",{className:"met-detail-section"},M("h3",null,"data/ 文件"),ju(s.files)),y.kind==="job"?M("div",{className:"met-detail-section"},M("h3",null,"日志尾部"),zu(If(y.data).logTail)):null)}return M("div",{className:"met-page","data-testid":"met-nonlinear-page"},M(t2,{title:"MET Nonlinear 训练编排",eyebrow:"D601 GPU 用户服务",loading:n.loading||n.actionBusy,actions:M("div",{className:"panel-actions"},M("button",{type:"button",className:"ghost-btn",onClick:j,disabled:n.loading,"data-testid":"met-refresh-button"},n.loading?"刷新中":"刷新"),M(v1,{title:"MET Nonlinear 用户服务",data:r,onOpen:l,testId:"raw-met-service"}))},M("div",{className:"findjob-hero"},M("div",null,M("div",{className:"node-version-line"},M(kt,{status:z.providerStatus==="online"?"online":"warn"},z.providerStatus||"unknown"),M("span",null,r.providerId),M("span",null,H.public?"公网暴露":"仅 UniDesk frontend 代理访问")),M("p",{className:"muted paragraph"},r.description)),M("div",{className:"microservice-ref-card"},M("span",null,"Repo"),M("strong",null,Z.url||"--"),M("code",null,Z.commitId||"--")),M("div",{className:"microservice-ref-card"},M("span",null,"D601 Docker"),M("strong",null,`${H.nodeBindHost||"--"}:${H.nodePort||"--"}`),M("code",null,`${Z.composeFile||"--"} / ${Z.containerName||"--"}`))),M(il,{error:n.error,wide:!0}),_.actionMessage?M("div",{className:"met-action-log","data-testid":"met-action-message"},_.actionMessage):null),M("div",{className:"met-grid"},M(t2,{title:"核心状态",eyebrow:n.refreshedAt?`Updated ${tl(n.refreshedAt)}`:"Queue + GPU",loading:n.loading},M("div",{className:"metric-grid"},M(Hn,{label:"Staged",value:E.staged??0,hint:"加入队列未开始",tone:Number(E.staged||0)>0?"warn":""}),M(Hn,{label:"Queued",value:E.queued??0,hint:"排队等待调度",tone:Number(E.queued||0)>0?"warn":""}),M(Hn,{label:"Running",value:E.running??0,hint:`max ${n.summary?.queue?.maxConcurrency??n.queue?.queue?.maxConcurrency??"--"}`,tone:Number(E.running||0)>0?"ok":""}),M(Hn,{label:"Succeeded",value:E.succeeded??0,hint:"已完成"}),M(Hn,{label:"Failed",value:E.failed??0,hint:"需要诊断",tone:Number(E.failed||0)>0?"warn":""}),M(Hn,{label:"2080Ti Free",value:h?vt(Number(h.freeRatio)*100):"--",hint:h?`${h.memoryFreeMiB}/${h.memoryTotalMiB} MiB`:"等待 GPU 上报"}),M(Hn,{label:"ML Image",value:V.present?"READY":"MISSING",hint:V.image||"met-nonlinear-ml:tf26",tone:V.present?"ok":"warn"}),M(Hn,{label:"Health",value:n.health?.ok?"OK":"--",hint:"D601 /health"}))),M(t2,{title:"队列控制",eyebrow:"Downloader-like staging",loading:n.actionBusy},M("div",{className:"met-control-strip"},M("label",null,"最大并发",M("input",{type:"number",min:1,max:16,value:_.maxConcurrency,"data-testid":"met-max-concurrency-input",onChange:(P)=>A({maxConcurrency:P.target.value})})),M("label",null,"目标 GPU",M("input",{value:_.targetGpuName,"data-testid":"met-target-gpu-input",onChange:(P)=>A({targetGpuName:P.target.value})})),M("button",{type:"button",className:"ghost-btn",onClick:J,disabled:n.actionBusy,"data-testid":"met-save-settings-button"},"保存设置"),M("button",{type:"button",className:"primary-btn",onClick:U,disabled:n.actionBusy||Number(E.staged||0)===0,"data-testid":"met-start-queue-button"},"启动队列")),M("p",{className:"muted paragraph"},"Project 先进入待启动队列,不会立即训练;点击启动队列后才切换为排队中,并由 D601 scheduler 按最大并发和 2080Ti 显存策略调度。")),M("section",{className:"panel met-workspace"},M("div",{className:"met-tabs",role:"tablist"},k.map((P)=>M("button",{key:P.id,type:"button",className:_.activeTab===P.id?"active":"",onClick:()=>A({activeTab:P.id}),"data-testid":`met-tab-${P.id}`},`${P.label} ${P.count}`))),M("div",{className:"panel-body"},_.activeTab==="projects"?M("div",{className:"met-form-grid","data-testid":"met-projects-pane"},M("div",{className:"met-fork-card"},M("h3",null,"Fork Project"),M("label",null,"源 Project",M("select",{value:m,"data-testid":"met-source-project-select",onChange:(P)=>A({sourceProject:P.target.value})},p.map((P)=>M("option",{key:P.projectPath,value:P.projectPath},`${P.projectPath} · ${P.useModel||"model?"}`)))),M("label",null,"Fork 数量",M("input",{type:"number",min:1,max:100,value:_.forkCount,"data-testid":"met-fork-count-input",onChange:(P)=>A({forkCount:P.target.value})})),M("label",null,"训练轮数",M("input",{type:"number",min:1,max:1e5,value:_.forkEpochs,"data-testid":"met-fork-epochs-input",onChange:(P)=>A({forkEpochs:P.target.value})})),M("label",null,"目标前缀",M("input",{value:_.forkPrefix,"data-testid":"met-fork-prefix-input",onChange:(P)=>A({forkPrefix:P.target.value})})),M("button",{type:"button",className:"primary-btn",onClick:L,disabled:n.actionBusy||!m,"data-testid":"met-fork-button"},"Fork Project"),M("p",{className:"muted paragraph"},"Fork 只创建新 Project 并自动勾选,不会直接训练;需要在右侧确认后加入待启动队列。")),M("div",{className:"met-project-list"},M("div",{className:"panel-head compact"},M("div",null,M("p",{className:"panel-eyebrow"},`Existing Projects · ${(n.projects?.roots||[]).map((P)=>`${P.root} ${P.count}`).join(" / ")}`),M(nl,{title:"选择已有 Project",loading:n.loading||n.actionBusy})),M("button",{type:"button",className:"ghost-btn",onClick:w,disabled:n.actionBusy||Q().length===0,"data-testid":"met-stage-selected-button"},`加入待启动队列 (${Q().length})`)),p.length===0?M(p0,{title:"暂无 project",text:"等待 D601 返回 /api/projects"}):M("div",{className:"met-project-table","data-testid":"met-project-tree"},M("div",{className:"met-tree-header"},M("span",null,"文件树 Project"),M("span",null,"Model"),M("span",null,"Epochs"),M("span",null,"Progress"),M("span",null,"速度")),O.children.map((P)=>x(P)))),Wu()):null,_.activeTab==="current"?M("div",{"data-testid":"met-current-pane"},b(),I(X,"current"),Wu(),M("div",{className:"panel-actions inline-actions"},M(v1,{title:"MET Queue",data:n.queue,onOpen:l,testId:"raw-met-queue"}))):null,_.activeTab==="completed"?M("div",{"data-testid":"met-completed-pane"},I(v.length>0?v:Y.filter((P)=>P.status==="succeeded"),"completed"),Wu()):null,_.activeTab==="failed"?M("div",{"data-testid":"met-failed-pane"},I(T.length>0?T:Y.filter((P)=>["failed","canceled"].includes(P.status)),"failed"),Wu(),M("div",{className:"panel-actions inline-actions"},M(v1,{title:"MET History",data:n.history,onOpen:l,testId:"raw-met-history"}))):null,_.activeTab==="gpu"?M("div",{className:"met-gpu-pane","data-testid":"met-gpu-pane"},D.length===0?M(p0,{title:"暂无 GPU 上报",text:"等待 D601 met-nonlinear-ts 或 ML image 提供 nvidia-smi 数据"}):M("div",{className:"table-wrap"},M("table",null,M("thead",null,M("tr",null,M("th",null,"Index"),M("th",null,"Name"),M("th",null,"Free"),M("th",null,"Policy"))),M("tbody",null,D.map((P)=>M("tr",{key:P.index},M("td",null,P.index),M("td",null,P.name),M("td",null,`${P.memoryFreeMiB} / ${P.memoryTotalMiB} MiB`,M("div",{className:"met-progress"},M("span",{style:{width:vt(Number(P.freeRatio)*100)}}))),M("td",null,String(P.name||"").includes("2080")?"target 2080Ti, <20% 限制并发":"non-target")))))),M("div",{className:"panel-actions inline-actions"},M(v1,{title:"MET Images",data:n.images,onOpen:l,testId:"raw-met-images"}))):null))))}var ic=[{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:"project-manager",label:"Project Manager"}]},{id:"config",label:"系统配置",code:"CFG",tabs:[{id:"topology",label:"连接拓扑"},{id:"auth",label:"认证策略"},{id:"security",label:"安全边界"}]}],st=Object.fromEntries(ic.map((u)=>[u.id,u.tabs[0]?.id??""]));function fO(u){let l=String(u||"").trim();if(!l)return"";try{return decodeURIComponent(l)}catch{return l}}function nc(u){let l=String(u||"/"),[f]=l.split(/[?#]/u,1);if(f==="/")return"/";let n=`/${f.split("/").map(fO).filter(Boolean).join("/")}`;return n.endsWith("/")?n:`${n}/`}function rO(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 c2(u){return String(u||"").normalize("NFKD").replace(/[\u0300-\u036f]/gu,"").toLowerCase().replace(/[^a-z0-9]+/gu,"-").replace(/^-+|-+$/gu,"")}function sQ(u){return String(u||"").trim().toLowerCase().replace(/[\s/\\?#%]+/gu,"-").replace(/-+/gu,"-").replace(/^-+|-+$/gu,"")}function aQ(u){let l=c2(u.routeSegment||"")||sQ(u.routeSegment||"");if(l)return l;let f=c2(u.id||"");if(f)return f;let r=c2(u.label||"")||sQ(u.label||"");if(r)return r;return`route-${rO(JSON.stringify(u))}`}function A2(u,l){return`${u}:${l}`}function oQ(u){let l=u.map((_)=>{let c=aQ(_);return{..._,routeSegment:c,tabs:_.tabs.map((A)=>({...A,routeSegment:aQ(A)}))}}),f={},r={},n={},i=l.map((_)=>{let c=_.tabs[0]?.id??"";n[_.id]=c;let A=_.tabs.map((J)=>{let Q=`/${_.routeSegment}/${J.routeSegment}/`,w=[Q],L={moduleId:_.id,tabId:J.id};for(let U of w)f[nc(U)]=L;return r[A2(_.id,J.id)]=Q,{...J,canonicalPath:Q,aliases:w}}),j=`/${_.routeSegment}/`,F={moduleId:_.id,tabId:c};return f[nc(j)]=F,{..._,routeSegment:_.routeSegment,canonicalPath:j,tabs:A}}),y=i[0],t={moduleId:y?.id||"",tabId:y?.tabs[0]?.id||""};return f["/"]=t,{modules:i,moduleById:Object.fromEntries(i.map((_)=>[_.id,_])),defaultActiveTabs:n,routeMap:f,canonicalPathByTarget:r,fallbackTarget:t}}function j2(u,l){return u.routeMap[nc(l)]||u.fallbackTarget}function yc(u,l,f){return u.canonicalPathByTarget[A2(l,f)]||u.canonicalPathByTarget[A2(u.fallbackTarget.moduleId,u.fallbackTarget.tabId)]||"/"}function dQ(u,l){let f=u.routeMap[nc(l)];if(!f)return null;return yc(u,f.moduleId,f.tabId)}var cc=Pu(Jl(),1);var iu=cc.default.createElement,{useEffect:eQ,useMemo:nO}=cc.default,F2=cc.default.useState;function $c({status:u,children:l,title:f}){let r=String(u||"unknown").toLowerCase();return iu("span",{className:`status-badge ${r}`,title:f},l||u||"unknown")}function at({label:u,value:l,hint:f,tone:r}){return iu("article",{className:`metric-card ${r||""}`},iu("div",{className:"metric-label"},u),iu("div",{className:"metric-value"},l),iu("div",{className:"metric-hint"},f))}function tc({title:u,eyebrow:l,actions:f,children:r,className:n,loading:i}){return iu("section",{className:`panel ${n||""}`},iu("div",{className:"panel-head"},iu("div",null,l?iu("p",{className:"panel-eyebrow"},l):null,iu(nl,{title:u,loading:i})),f?iu("div",{className:"panel-actions"},f):null),iu("div",{className:"panel-body"},r))}function ot({title:u,data:l,onOpen:f,testId:r}){return iu("button",{type:"button",className:"ghost-btn","data-testid":r,onClick:()=>f?.(u,l)},"查看原始JSON")}function U2({title:u,text:l}){return iu("div",{className:"empty-state"},iu("strong",null,u),iu("span",null,l))}function iO(u){return u&&typeof u==="object"&&!Array.isArray(u)?u:null}function m0(u){return Array.isArray(u)?u:[]}function gf(u){let l=Number(u);return Number.isFinite(l)?l.toLocaleString("zh-CN"):"--"}function uN(u,l=140){if(u===null||u===void 0)return"--";let f=typeof u==="string"?u:JSON.stringify(u),r=String(f||"").replace(/\s+/gu," ").trim();return r.length>l?`${r.slice(0,l-1)}...`:r||"--"}function yO(u){return m0(u?.tags).map((l)=>String(l||"").trim()).filter(Boolean)}function Zi(u){let l=Number(u);return Number.isFinite(l)&&l>=0?Math.floor(l):0}function tO(u){return u?.runtime&&typeof u.runtime==="object"&&!Array.isArray(u.runtime)?u.runtime:{}}function _O(u){return u?.backend&&typeof u.backend==="object"&&!Array.isArray(u.backend)?u.backend:{}}function $O(u){return String(u||"").split(/[\s,]+/u).map((l)=>l.trim()).filter(Boolean).join(",")}function _c(u,l){return`${u}/microservices/oa-event-flow/proxy${l}`}function cO(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 AO(u){let l=String(u?.subjectKind||"trace"),f=String(u?.subjectId||u?.scopeId||"");return f?`${l}:${f}`:String(u?.scopeId||"--")}function jO({tags:u}){let l=yO({tags:u}).slice(0,6);return iu("div",{className:"oa-tag-rail"},l.length===0?iu("span",{className:"muted"},"--"):l.map((f)=>iu("code",{key:f},f)))}function FO({events:u,onRaw:l}){let f=[...m0(u)].reverse();return f.length===0?iu(U2,{title:"事件表暂无记录",text:"等待 Code Queue 或 Pipeline 按 tag 发布 OA 事件"}):iu("div",{className:"table-wrap oa-event-table-wrap"},iu("table",{className:"oa-event-table","data-testid":"oa-event-flow-event-table"},iu("thead",null,iu("tr",null,iu("th",null,"Seq"),iu("th",null,"Type"),iu("th",null,"Source"),iu("th",null,"Aggregate"),iu("th",null,"Tags"),iu("th",null,"Payload"),iu("th",null,"Created"),iu("th",null,"Raw"))),iu("tbody",null,f.map((r)=>{let n=String(r?.type||"event"),i=`${String(r?.aggregateType||"--")}:${String(r?.aggregateId||"--")}`;return iu("tr",{key:r?.eventId||r?.sequence},iu("td",null,iu("code",null,gf(r?.sequence))),iu("td",null,iu($c,{status:cO(n)},n)),iu("td",null,iu("strong",null,r?.sourceId||"--"),iu("code",null,r?.sourceKind||"--")),iu("td",null,iu("code",null,i)),iu("td",null,iu(jO,{tags:r?.tags})),iu("td",null,iu("span",{className:"oa-payload-preview"},uN(r?.payload,180))),iu("td",null,qu(r?.createdAt)),iu("td",null,iu(ot,{title:`OA Event ${r?.sequence||""}`,data:r,onOpen:l,testId:`raw-oa-event-${r?.sequence||"unknown"}`})))}))))}function UO({stats:u,onRaw:l}){let f=m0(u);return f.length===0?iu(U2,{title:"统计中心暂无投影",text:"trace-stats-snapshot / trace-step-created 进入事件流后会更新这里"}):iu("div",{className:"table-wrap oa-stats-table-wrap"},iu("table",{className:"oa-stats-table","data-testid":"oa-event-flow-stats"},iu("thead",null,iu("tr",null,iu("th",null,"Scope"),iu("th",null,"Service"),iu("th",null,"STEP"),iu("th",null,"Read"),iu("th",null,"Edit"),iu("th",null,"Run"),iu("th",null,"Error"),iu("th",null,"Output Seq"),iu("th",null,"Revision"),iu("th",null,"Updated"),iu("th",null,"Raw"))),iu("tbody",null,f.map((r)=>iu("tr",{key:r?.scopeId||`${r?.serviceId}-${r?.subjectId}`},iu("td",null,iu("strong",null,AO(r)),iu("code",null,r?.scopeId||"--")),iu("td",null,iu($c,{status:String(r?.serviceId||"unknown")==="code-queue"?"running":"queued"},r?.serviceId||"--")),iu("td",null,iu("strong",null,gf(Zi(r?.stepCount??r?.llmStepCount)))),iu("td",null,gf(Zi(r?.readCount))),iu("td",null,gf(Zi(r?.editCount))),iu("td",null,gf(Zi(r?.runCount))),iu("td",null,gf(Zi(r?.errorCount))),iu("td",null,iu("code",null,gf(Zi(r?.outputMaxSeq)))),iu("td",null,gf(Zi(r?.statsRevision))),iu("td",null,qu(r?.updatedAt)),iu("td",null,iu(ot,{title:`OA Trace Stats ${r?.scopeId||""}`,data:r,onOpen:l,testId:`raw-oa-stats-${String(r?.scopeId||"unknown").replace(/[^a-zA-Z0-9_-]/gu,"_")}`})))))))}function lN({microservices:u,onRaw:l,apiBaseUrl:f="/api"}){let r=u.find((z)=>z.id==="oa-event-flow")||null,[n,i]=F2("service:code-queue"),[y,t]=F2({loading:!1,error:"",health:null,diagnostics:null,events:[],stats:[],refreshedAt:null}),[_,c]=F2({status:"idle",message:"未连接",lastEventAt:""}),A=nO(()=>$O(n),[n]);async function j(){if(!r)return;t((z)=>({...z,loading:!0,error:""}));try{let z=A?`tags=${encodeURIComponent(A)}&`:"",[Z,H,E,D]=await Promise.all([Tu(`${f}/microservices/oa-event-flow/health`,{failureFields:[]}),Tu(_c(f,"/api/diagnostics")),Tu(_c(f,`/api/events?${z}limit=100`)),Tu(_c(f,`/api/stats/trace?${z}limit=100`))]);t({loading:!1,error:"",health:Z,diagnostics:H,events:m0(E?.events),stats:m0(D?.stats),refreshedAt:new Date})}catch(z){t((Z)=>({...Z,loading:!1,error:Ou(z,"OA Event Flow 加载失败")}))}}if(eQ(()=>{j()},[r?.id,r?.runtime?.providerStatus,A]),eQ(()=>{if(!r||typeof EventSource>"u")return;let z=A?`?tags=${encodeURIComponent(A)}`:"",Z=new EventSource(`${_c(f,"/api/events/stream")}${z}`,{withCredentials:!0});c({status:"running",message:"SSE connecting",lastEventAt:""});let H=(h)=>{c({status:"online",message:uN(h.data,120),lastEventAt:new Date().toISOString()})},E=(h)=>{try{let V=JSON.parse(String(h.data||"{}"));c({status:"online",message:String(V?.type||h.type||"event"),lastEventAt:new Date().toISOString()}),t((S)=>{let p=[...m0(S.events).filter((m)=>String(m?.eventId||"")!==String(V?.eventId||"")),V].sort((m,X)=>Number(m?.sequence||0)-Number(X?.sequence||0)).slice(-100),O=V?.type==="trace-stats-updated"&&iO(V?.payload?.stats)?[V.payload.stats,...m0(S.stats).filter((m)=>String(m?.scopeId||"")!==String(V.payload.stats.scopeId||""))].slice(0,100):S.stats;return{...S,events:p,stats:O}})}catch(V){c({status:"warn",message:Ou(V,"SSE 事件解析失败"),lastEventAt:new Date().toISOString()})}},D=()=>{c((h)=>({...h,status:"warn",message:"SSE reconnecting"}))};return Z.addEventListener("hello",H),Z.addEventListener("task-updated",E),Z.addEventListener("queue-updated",E),Z.addEventListener("trace-step-created",E),Z.addEventListener("trace-stats-snapshot",E),Z.addEventListener("trace-stats-updated",E),Z.addEventListener("trace-error",E),Z.onerror=D,()=>Z.close()},[r?.id,f,A]),!r)return iu(U2,{title:"OA Event Flow 未登记",text:"请在 config.json 的 microservices 中登记 id=oa-event-flow"});let F=tO(r),J=_O(r),Q=y.diagnostics||{},w=y.health||{},L=Q.eventCount??w.eventCount,U=Q.traceStatsCount??w.traceStatsCount,N=Q.latestSequence??w.latestSequence,q=Q.pipelineBridge||w.pipelineBridge||{},W=m0(Q.eventTypes).slice(0,8);return iu("div",{className:"oa-event-flow-page","data-testid":"oa-event-flow-page"},iu(tc,{title:"OA Event Flow 控制台",eyebrow:"Unified OA Event Bus + Stats Projection",loading:y.loading,actions:iu("div",{className:"panel-actions"},iu("button",{type:"button",className:"ghost-btn",onClick:j,disabled:y.loading,"data-testid":"oa-event-flow-refresh"},y.loading?"刷新中":"刷新"),iu(ot,{title:"OA Event Flow Service",data:r,onOpen:l,testId:"raw-oa-event-flow-service"}))},iu("div",{className:"oa-flow-hero"},iu("div",null,iu("div",{className:"node-version-line"},iu($c,{status:w?.ok||F.providerStatus==="online"?"online":"warn"},w?.ok?"HEALTH OK":F.providerStatus||"unknown"),iu($c,{status:_.status},_.status.toUpperCase()),iu("span",null,J.public?"公网暴露":"仅 UniDesk frontend 代理访问")),iu("p",{className:"muted paragraph"},"独立事件流微服务统一承载 Code Queue 与 Pipeline 的事件发布、tag 订阅、事件表审计和 Trace/STEP 统计投影。")),iu("div",{className:"oa-flow-signal"},iu("span",null,"stream"),iu("strong",null,_.message||"--"),iu("code",null,_.lastEventAt?tl(new Date(_.lastEventAt)):"waiting"))),iu(il,{error:y.error,wide:!0})),iu("div",{className:"oa-flow-metrics"},iu(at,{label:"事件总量",value:gf(L),hint:`latest seq ${gf(N)}`,tone:"ok"}),iu(at,{label:"Trace Stats",value:gf(U),hint:"oa_trace_stats 投影"}),iu(at,{label:"SSE Clients",value:gf(w?.sseClientCount??m0(Q.sseClients).length),hint:_.message||"tag subscription"}),iu(at,{label:"Pipeline Bridge",value:q?.enabled?gf(q?.insertedCount):"OFF",hint:q?.lastError||q?.lastFinishedAt||`${q?.mode||"snapshot"} service:pipeline`}),iu(at,{label:"DB",value:w?.databaseReady||Q.databaseReady?"READY":"WAIT",hint:w?.databaseLastError||Q.databaseLastError||"PostgreSQL persisted"})),iu(tc,{title:"标签订阅",eyebrow:y.refreshedAt?`Updated ${tl(y.refreshedAt)}`:"Tag Pub/Sub"},iu("div",{className:"oa-filter-bar"},iu("label",null,iu("span",null,"tags"),iu("input",{value:n,onChange:(z)=>i(z.target.value),placeholder:"service:code-queue, trace","data-testid":"oa-event-flow-tag-filter"})),iu("div",{className:"oa-filter-presets"},iu("button",{type:"button",className:"ghost-btn",onClick:()=>i("service:code-queue")},"Code Queue"),iu("button",{type:"button",className:"ghost-btn",onClick:()=>i("service:pipeline")},"Pipeline"),iu("button",{type:"button",className:"ghost-btn",onClick:()=>i("trace")},"Trace"),iu("button",{type:"button",className:"ghost-btn",onClick:()=>i("")},"All")),iu("code",null,A||"all events")),iu("div",{className:"oa-type-strip"},W.length===0?iu("span",{className:"muted"},"等待事件类型统计"):W.map((z)=>iu("span",{key:z.type,className:"data-chip"},`${z.type} ${gf(z.count)}`)))),iu("div",{className:"oa-flow-grid"},iu(tc,{title:"事件表",eyebrow:"oa_events persisted log",className:"oa-flow-wide",loading:y.loading,actions:iu(ot,{title:"OA Event Query",data:{events:y.events,diagnostics:Q},onOpen:l,testId:"raw-oa-events"})},iu(FO,{events:y.events,onRaw:l})),iu(tc,{title:"统计中心",eyebrow:"oa_trace_stats read model",className:"oa-flow-wide",loading:y.loading,actions:iu(ot,{title:"OA Trace Stats",data:y.stats,onOpen:l,testId:"raw-oa-trace-stats"})},iu(UO,{stats:y.stats,onRaw:l}))))}var hn=Pu(Jl(),1);var ru=Pu(iN(),1),yu=Pu(Jl(),1);function Sl(u){if(typeof u==="string"||typeof u==="number")return""+u;let l="";if(Array.isArray(u)){for(let f=0,r;f{}};function tN(){for(var u=0,l=arguments.length,f={},r;u=0)r=f.slice(n+1),f=f.slice(0,n);if(f&&!l.hasOwnProperty(f))throw Error("unknown type: "+f);return{type:f,name:r}})}jc.prototype=tN.prototype={constructor:jc,on:function(u,l){var f=this._,r=KO(u+"",f),n,i=-1,y=r.length;if(arguments.length<2){while(++i0)for(var f=Array(n),r=0,n,i;r=0&&(l=u.slice(0,f))!=="xmlns")u=u.slice(f+1);return J2.hasOwnProperty(l)?{space:J2[l],local:u}:u}function Q2(u){let l;while(l=u.sourceEvent)u=l;return u}function Gf(u,l){if(u=Q2(u),l===void 0)l=u.currentTarget;if(l){var f=l.ownerSVGElement||l;if(f.createSVGPoint){var r=f.createSVGPoint();return r.x=u.clientX,r.y=u.clientY,r=r.matrixTransform(l.getScreenCTM().inverse()),[r.x,r.y]}if(l.getBoundingClientRect){var n=l.getBoundingClientRect();return[u.clientX-n.left-l.clientLeft,u.clientY-n.top-l.clientTop]}}return[u.pageX,u.pageY]}function zO(){}function Bn(u){return u==null?zO:function(){return this.querySelector(u)}}function N2(u){if(typeof u!=="function")u=Bn(u);for(var l=this._groups,f=l.length,r=Array(f),n=0;n=q)q=N+1;while(!(z=L[q])&&++q=0;)if(y=r[n]){if(i&&y.compareDocumentPosition(i)^4)i.parentNode.insertBefore(y,i);i=y}return this}function B2(u){if(!u)u=mO;function l(j,F){return j&&F?u(j.__data__,F.__data__):!j-!F}for(var f=this._groups,r=f.length,n=Array(r),i=0;il?1:u>=l?0:NaN}function V2(){var u=arguments[0];return arguments[0]=this,u.apply(null,arguments),this}function D2(){return Array.from(this)}function X2(){for(var u=this._groups,l=0,f=u.length;l1?this.each((l==null?bO:typeof l==="function"?kO:vO)(u,l,f==null?"":f)):Vn(this.node(),u)}function Vn(u,l){return u.style.getPropertyValue(l)||u_(u).getComputedStyle(u,null).getPropertyValue(l)}function IO(u){return function(){delete this[u]}}function gO(u,l){return function(){this[u]=l}}function sO(u,l){return function(){var f=l.apply(this,arguments);if(f==null)delete this[u];else this[u]=f}}function C2(u,l){return arguments.length>1?this.each((l==null?IO:typeof l==="function"?sO:gO)(u,l)):this.node()[u]}function _N(u){return u.trim().split(/^|\s+/)}function M2(u){return u.classList||new $N(u)}function $N(u){this._node=u,this._names=_N(u.getAttribute("class")||"")}$N.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 cN(u,l){var f=M2(u),r=-1,n=l.length;while(++r=0)f=l.slice(r+1),l=l.slice(0,r);return{type:l,name:f}})}function JH(u){return function(){var l=this.__on;if(!l)return;for(var f=0,r=-1,n=l.length,i;f()=>u;function n_(u,{sourceEvent:l,subject:f,target:r,identifier:n,active:i,x:y,y:t,dx:_,dy:c,dispatch:A}){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:r,enumerable:!0,configurable:!0},identifier:{value:n,enumerable:!0,configurable:!0},active:{value:i,enumerable:!0,configurable:!0},x:{value:y,enumerable:!0,configurable:!0},y:{value:t,enumerable:!0,configurable:!0},dx:{value:_,enumerable:!0,configurable:!0},dy:{value:c,enumerable:!0,configurable:!0},_:{value:A}})}n_.prototype.on=function(){var u=this._.on.apply(this._,arguments);return u===this._?this:u};function ZH(u){return!u.ctrlKey&&!u.button}function OH(){return this.parentNode}function HH(u,l){return l==null?{x:u.x,y:u.y}:l}function BH(){return navigator.maxTouchPoints||"ontouchstart"in this}function i_(){var u=ZH,l=OH,f=HH,r=BH,n={},i=Oi("start","drag","end"),y=0,t,_,c,A,j=0;function F(W){W.on("mousedown.drag",J).filter(r).on("touchstart.drag",L).on("touchmove.drag",U,UN).on("touchend.drag touchcancel.drag",N).style("touch-action","none").style("-webkit-tap-highlight-color","rgba(0,0,0,0)")}function J(W,z){if(A||!u.call(this,W,z))return;var Z=q(this,l.call(this,W,z),W,z,"mouse");if(!Z)return;sl(W.view).on("mousemove.drag",Q,Hi).on("mouseup.drag",w,Hi),g1(W.view),Jc(W),c=!1,t=W.clientX,_=W.clientY,Z("start",W)}function Q(W){if(C0(W),!c){var z=W.clientX-t,Z=W.clientY-_;c=z*z+Z*Z>j}n.mouse("drag",W)}function w(W){sl(W.view).on("mousemove.drag mouseup.drag",null),f_(W.view,c),C0(W),n.mouse("end",W)}function L(W,z){if(!u.call(this,W,z))return;var Z=W.changedTouches,H=l.call(this,W,z),E=Z.length,D,h;for(D=0;D>8&15|l>>4&240,l>>4&15|l&240,(l&15)<<4|l&15,1):f===8?Qc(l>>24&255,l>>16&255,l>>8&255,(l&255)/255):f===4?Qc(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=DH.exec(u))?new sf(l[1],l[2],l[3],1):(l=XH.exec(u))?new sf(l[1]*255/100,l[2]*255/100,l[3]*255/100,1):(l=SH.exec(u))?Qc(l[1],l[2],l[3],l[4]):(l=YH.exec(u))?Qc(l[1]*255/100,l[2]*255/100,l[3]*255/100,l[4]):(l=pH.exec(u))?LN(l[1],l[2]/100,l[3]/100,1):(l=mH.exec(u))?LN(l[1],l[2]/100,l[3]/100,l[4]):JN.hasOwnProperty(u)?qN(JN[u]):u==="transparent"?new sf(NaN,NaN,NaN,0):null}function qN(u){return new sf(u>>16&255,u>>8&255,u&255,1)}function Qc(u,l,f,r){if(r<=0)u=l=f=NaN;return new sf(u,l,f,r)}function MH(u){if(!(u instanceof $_))u=kr(u);if(!u)return new sf;return u=u.rgb(),new sf(u.r,u.g,u.b,u.opacity)}function a1(u,l,f,r){return arguments.length===1?MH(u):new sf(u,l,f,r==null?1:r)}function sf(u,l,f,r){this.r=+u,this.g=+l,this.b=+f,this.opacity=+r}y_(sf,a1,l5($_,{brighter(u){return u=u==null?qc:Math.pow(qc,u),new sf(this.r*u,this.g*u,this.b*u,this.opacity)},darker(u){return u=u==null?t_:Math.pow(t_,u),new sf(this.r*u,this.g*u,this.b*u,this.opacity)},rgb(){return this},clamp(){return new sf(Vi(this.r),Vi(this.g),Vi(this.b),Wc(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:WN,formatHex:WN,formatHex8:RH,formatRgb:wN,toString:wN}));function WN(){return`#${Bi(this.r)}${Bi(this.g)}${Bi(this.b)}`}function RH(){return`#${Bi(this.r)}${Bi(this.g)}${Bi(this.b)}${Bi((isNaN(this.opacity)?1:this.opacity)*255)}`}function wN(){let u=Wc(this.opacity);return`${u===1?"rgb(":"rgba("}${Vi(this.r)}, ${Vi(this.g)}, ${Vi(this.b)}${u===1?")":`, ${u})`}`}function Wc(u){return isNaN(u)?1:Math.max(0,Math.min(1,u))}function Vi(u){return Math.max(0,Math.min(255,Math.round(u)||0))}function Bi(u){return u=Vi(u),(u<16?"0":"")+u.toString(16)}function LN(u,l,f,r){if(r<=0)u=l=f=NaN;else if(f<=0||f>=1)u=l=NaN;else if(l<=0)u=NaN;return new vr(u,l,f,r)}function GN(u){if(u instanceof vr)return new vr(u.h,u.s,u.l,u.opacity);if(!(u instanceof $_))u=kr(u);if(!u)return new vr;if(u instanceof vr)return u;u=u.rgb();var l=u.r/255,f=u.g/255,r=u.b/255,n=Math.min(l,f,r),i=Math.max(l,f,r),y=NaN,t=i-n,_=(i+n)/2;if(t){if(l===i)y=(f-r)/t+(f0&&_<1?0:y;return new vr(y,t,_,u.opacity)}function zN(u,l,f,r){return arguments.length===1?GN(u):new vr(u,l,f,r==null?1:r)}function vr(u,l,f,r){this.h=+u,this.s=+l,this.l=+f,this.opacity=+r}y_(vr,zN,l5($_,{brighter(u){return u=u==null?qc:Math.pow(qc,u),new vr(this.h,this.s,this.l*u,this.opacity)},darker(u){return u=u==null?t_:Math.pow(t_,u),new vr(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,r=f+(f<0.5?f:1-f)*l,n=2*f-r;return new sf(f5(u>=240?u-240:u+120,n,r),f5(u,n,r),f5(u<120?u+240:u-120,n,r),this.opacity)},clamp(){return new vr(KN(this.h),Nc(this.s),Nc(this.l),Wc(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=Wc(this.opacity);return`${u===1?"hsl(":"hsla("}${KN(this.h)}, ${Nc(this.s)*100}%, ${Nc(this.l)*100}%${u===1?")":`, ${u})`}`}}));function KN(u){return u=(u||0)%360,u<0?u+360:u}function Nc(u){return Math.max(0,Math.min(1,u||0))}function f5(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 r5(u,l,f,r,n){var i=u*u,y=i*u;return((1-3*u+3*i-y)*l+(4-6*i+3*y)*f+(1+3*u+3*i-3*y)*r+y*n)/6}function n5(u){var l=u.length-1;return function(f){var r=f<=0?f=0:f>=1?(f=1,l-1):Math.floor(f*l),n=u[r],i=u[r+1],y=r>0?u[r-1]:2*n-i,t=r()=>u;function hH(u,l){return function(f){return u+f*l}}function bH(u,l,f){return u=Math.pow(u,f),l=Math.pow(l,f)-u,f=1/f,function(r){return Math.pow(u+r*l,f)}}function TN(u){return(u=+u)===1?Lc:function(l,f){return f-l?bH(l,f,u):c_(isNaN(l)?f:l)}}function Lc(u,l){var f=l-u;return f?hH(u,f):c_(isNaN(u)?l:u)}var Di=function u(l){var f=TN(l);function r(n,i){var y=f((n=a1(n)).r,(i=a1(i)).r),t=f(n.g,i.g),_=f(n.b,i.b),c=Lc(n.opacity,i.opacity);return function(A){return n.r=y(A),n.g=t(A),n.b=_(A),n.opacity=c(A),n+""}}return r.gamma=u,r}(1);function EN(u){return function(l){var f=l.length,r=Array(f),n=Array(f),i=Array(f),y,t;for(y=0;yf)if(i=l.slice(f,i),t[y])t[y]+=i;else t[++y]=i;if((r=r[0])===(n=n[0]))if(t[y])t[y]+=n;else t[++y]=n;else t[++y]=null,_.push({i:y,x:zf(r,n)});f=$5.lastIndex}if(f180)A+=360;else if(A-c>180)c+=360;F.push({i:j.push(n(j)+"rotate(",null,r)-2,x:zf(c,A)})}else if(A)j.push(n(j)+"rotate("+A+r)}function t(c,A,j,F){if(c!==A)F.push({i:j.push(n(j)+"skewX(",null,r)-2,x:zf(c,A)});else if(A)j.push(n(j)+"skewX("+A+r)}function _(c,A,j,F,J,Q){if(c!==j||A!==F){var w=J.push(n(J)+"scale(",null,",",null,")");Q.push({i:w-4,x:zf(c,j)},{i:w-2,x:zf(A,F)})}else if(j!==1||F!==1)J.push(n(J)+"scale("+j+","+F+")")}return function(c,A){var j=[],F=[];return c=u(c),A=u(A),i(c.translateX,c.translateY,A.translateX,A.translateY,j,F),y(c.rotate,A.rotate,j,F),t(c.skewX,A.skewX,j,F),_(c.scaleX,c.scaleY,A.scaleX,A.scaleY,j,F),c=A=null,function(J){var Q=-1,w=F.length,L;while(++Q=0)u._call.call(void 0,l);u=u._next}--d1}function mN(){Si=(Ec=U_.now())+Zc,d1=j_=0;try{MN()}finally{d1=0,jB(),Si=0}}function AB(){var u=U_.now(),l=u-Ec;if(l>PN)Zc-=l,Ec=u}function jB(){var u,l=Tc,f,r=1/0;while(l)if(l._call){if(r>l._time)r=l._time;u=l,l=l._next}else f=l._next,l._next=null,l=u?u._next=f:Tc=f;F_=u,F5(r)}function F5(u){if(d1)return;if(j_)j_=clearTimeout(j_);var l=u-Si;if(l>24){if(u<1/0)j_=setTimeout(mN,u-U_.now()-Zc);if(A_)A_=clearInterval(A_)}else{if(!A_)Ec=U_.now(),A_=setInterval(AB,PN);d1=1,CN(mN)}}function N_(u,l,f){var r=new J_;return l=l==null?0:+l,r.restart((n)=>{r.stop(),u(n+l)},l,f),r}var UB=Oi("start","end","cancel","interrupt"),JB=[],hN=0,RN=1,Bc=2,Hc=3,xN=4,Vc=5,q_=6;function M0(u,l,f,r,n,i){var y=u.__transition;if(!y)u.__transition={};else if(f in y)return;QB(u,f,{name:l,index:r,group:n,on:UB,tween:JB,time:i.time,delay:i.delay,duration:i.duration,ease:i.ease,timer:null,state:hN})}function W_(u,l){var f=al(u,l);if(f.state>hN)throw Error("too late; already scheduled");return f}function Ff(u,l){var f=al(u,l);if(f.state>Hc)throw Error("too late; already running");return f}function al(u,l){var f=u.__transition;if(!f||!(f=f[l]))throw Error("transition not found");return f}function QB(u,l,f){var r=u.__transition,n;r[l]=f,f.timer=Oc(i,0,f.time);function i(c){if(f.state=RN,f.timer.restart(y,f.delay,f.time),f.delay<=c)y(c-f.delay)}function y(c){var A,j,F,J;if(f.state!==RN)return _();for(A in r){if(J=r[A],J.name!==f.name)continue;if(J.state===Hc)return N_(y);if(J.state===xN)J.state=q_,J.timer.stop(),J.on.call("interrupt",u,u.__data__,J.index,J.group),delete r[A];else if(+ABc&&r.state=0)l=l.slice(0,f);return!l||l==="start"})}function pB(u,l,f){var r,n,i=YB(l)?W_:Ff;return function(){var y=i(this,u),t=y.on;if(t!==r)(n=(r=t).copy()).on(l,f);y.on=n}}function z5(u,l){var f=this._id;return arguments.length<2?al(this.node(),f).on.on(u):this.each(pB(f,u,l))}function mB(u){return function(){var l=this.parentNode;for(var f in this.__transition)if(+f!==u)return;if(l)l.removeChild(this)}}function T5(){return this.on("end.remove",mB(this._id))}function E5(u){var l=this._name,f=this._id;if(typeof u!=="function")u=Bn(u);for(var r=this._groups,n=r.length,i=Array(n),y=0;y()=>u;function p5(u,{sourceEvent:l,target:f,transform:r,dispatch:n}){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:r,enumerable:!0,configurable:!0},_:{value:n}})}function Ir(u,l,f){this.k=u,this.x=l,this.y=f}Ir.prototype={constructor:Ir,scale:function(u){return u===1?this:new Ir(this.k*u,this.x,this.y)},translate:function(u,l){return u===0&l===0?this:new Ir(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 Yi=new Ir(1,0,0);K_.prototype=Ir.prototype;function K_(u){while(!u.__zoom)if(!(u=u.parentNode))return Yi;return u.__zoom}function xc(u){u.stopImmediatePropagation()}function pi(u){u.preventDefault(),u.stopImmediatePropagation()}function eB(u){return(!u.ctrlKey||u.type==="wheel")&&!u.button}function uV(){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 kN(){return this.__zoom||Yi}function lV(u){return-u.deltaY*(u.deltaMode===1?0.05:u.deltaMode?1:0.002)*(u.ctrlKey?10:1)}function fV(){return navigator.maxTouchPoints||"ontouchstart"in this}function rV(u,l,f){var r=u.invertX(l[0][0])-f[0][0],n=u.invertX(l[1][0])-f[1][0],i=u.invertY(l[0][1])-f[0][1],y=u.invertY(l[1][1])-f[1][1];return u.translate(n>r?(r+n)/2:Math.min(0,r)||Math.max(0,n),y>i?(i+y)/2:Math.min(0,i)||Math.max(0,y))}function G_(){var u=eB,l=uV,f=rV,r=lV,n=fV,i=[0,1/0],y=[[-1/0,-1/0],[1/0,1/0]],t=250,_=Xi,c=Oi("start","zoom","end"),A,j,F,J=500,Q=150,w=0,L=10;function U(O){O.property("__zoom",kN).on("wheel.zoom",E,{passive:!1}).on("mousedown.zoom",D).on("dblclick.zoom",h).filter(n).on("touchstart.zoom",V).on("touchmove.zoom",S).on("touchend.zoom touchcancel.zoom",p).style("-webkit-tap-highlight-color","rgba(0,0,0,0)")}U.transform=function(O,m,X,v){var T=O.selection?O.selection():O;if(T.property("__zoom",kN),O!==T)z(O,m,X,v);else T.interrupt().each(function(){Z(this,arguments).event(v).start().zoom(null,typeof m==="function"?m.apply(this,arguments):m).end()})},U.scaleBy=function(O,m,X,v){U.scaleTo(O,function(){var T=this.__zoom.k,Y=typeof m==="function"?m.apply(this,arguments):m;return T*Y},X,v)},U.scaleTo=function(O,m,X,v){U.transform(O,function(){var T=l.apply(this,arguments),Y=this.__zoom,k=X==null?W(T):typeof X==="function"?X.apply(this,arguments):X,I=Y.invert(k),b=typeof m==="function"?m.apply(this,arguments):m;return f(q(N(Y,b),k,I),T,y)},X,v)},U.translateBy=function(O,m,X,v){U.transform(O,function(){return f(this.__zoom.translate(typeof m==="function"?m.apply(this,arguments):m,typeof X==="function"?X.apply(this,arguments):X),l.apply(this,arguments),y)},null,v)},U.translateTo=function(O,m,X,v,T){U.transform(O,function(){var Y=l.apply(this,arguments),k=this.__zoom,I=v==null?W(Y):typeof v==="function"?v.apply(this,arguments):v;return f(Yi.translate(I[0],I[1]).scale(k.k).translate(typeof m==="function"?-m.apply(this,arguments):-m,typeof X==="function"?-X.apply(this,arguments):-X),Y,y)},v,T)};function N(O,m){return m=Math.max(i[0],Math.min(i[1],m)),m===O.k?O:new Ir(m,O.x,O.y)}function q(O,m,X){var v=m[0]-X[0]*O.k,T=m[1]-X[1]*O.k;return v===O.x&&T===O.y?O:new Ir(O.k,v,T)}function W(O){return[(+O[0][0]+ +O[1][0])/2,(+O[0][1]+ +O[1][1])/2]}function z(O,m,X,v){O.on("start.zoom",function(){Z(this,arguments).event(v).start()}).on("interrupt.zoom end.zoom",function(){Z(this,arguments).event(v).end()}).tween("zoom",function(){var T=this,Y=arguments,k=Z(T,Y).event(v),I=l.apply(T,Y),b=X==null?W(I):typeof X==="function"?X.apply(T,Y):X,o=Math.max(I[1][0]-I[0][0],I[1][1]-I[0][1]),g=T.__zoom,x=typeof m==="function"?m.apply(T,Y):m,lu=_(g.invert(b).concat(o/g.k),x.invert(b).concat(o/x.k));return function(_u){if(_u===1)_u=x;else{var $u=lu(_u),ju=o/$u[2];_u=new Ir(ju,b[0]-$u[0]*ju,b[1]-$u[1]*ju)}k.zoom(null,_u)}})}function Z(O,m,X){return!X&&O.__zooming||new H(O,m)}function H(O,m){this.that=O,this.args=m,this.active=0,this.sourceEvent=null,this.extent=l.apply(O,m),this.taps=0}H.prototype={event:function(O){if(O)this.sourceEvent=O;return this},start:function(){if(++this.active===1)this.that.__zooming=this,this.emit("start");return this},zoom:function(O,m){if(this.mouse&&O!=="mouse")this.mouse[1]=m.invert(this.mouse[0]);if(this.touch0&&O!=="touch")this.touch0[1]=m.invert(this.touch0[0]);if(this.touch1&&O!=="touch")this.touch1[1]=m.invert(this.touch1[0]);return this.that.__zoom=m,this.emit("zoom"),this},end:function(){if(--this.active===0)delete this.that.__zooming,this.emit("end");return this},emit:function(O){var m=sl(this.that).datum();c.call(O,this.that,new p5(O,{sourceEvent:this.sourceEvent,target:U,type:O,transform:this.that.__zoom,dispatch:c}),m)}};function E(O,...m){if(!u.apply(this,arguments))return;var X=Z(this,m).event(O),v=this.__zoom,T=Math.max(i[0],Math.min(i[1],v.k*Math.pow(2,r.apply(this,arguments)))),Y=Gf(O);if(X.wheel){if(X.mouse[0][0]!==Y[0]||X.mouse[0][1]!==Y[1])X.mouse[1]=v.invert(X.mouse[0]=Y);clearTimeout(X.wheel)}else if(v.k===T)return;else X.mouse=[Y,v.invert(Y)],Dn(this),X.start();pi(O),X.wheel=setTimeout(k,Q),X.zoom("mouse",f(q(N(v,T),X.mouse[0],X.mouse[1]),X.extent,y));function k(){X.wheel=null,X.end()}}function D(O,...m){if(F||!u.apply(this,arguments))return;var X=O.currentTarget,v=Z(this,m,!0).event(O),T=sl(O.view).on("mousemove.zoom",b,!0).on("mouseup.zoom",o,!0),Y=Gf(O,X),k=O.clientX,I=O.clientY;g1(O.view),xc(O),v.mouse=[Y,this.__zoom.invert(Y)],Dn(this),v.start();function b(g){if(pi(g),!v.moved){var x=g.clientX-k,lu=g.clientY-I;v.moved=x*x+lu*lu>w}v.event(g).zoom("mouse",f(q(v.that.__zoom,v.mouse[0]=Gf(g,X),v.mouse[1]),v.extent,y))}function o(g){T.on("mousemove.zoom mouseup.zoom",null),f_(g.view,v.moved),pi(g),v.event(g).end()}}function h(O,...m){if(!u.apply(this,arguments))return;var X=this.__zoom,v=Gf(O.changedTouches?O.changedTouches[0]:O,this),T=X.invert(v),Y=X.k*(O.shiftKey?0.5:2),k=f(q(N(X,Y),v,T),l.apply(this,m),y);if(pi(O),t>0)sl(this).transition().duration(t).call(z,k,v,O);else sl(this).call(U.transform,k,v,O)}function V(O,...m){if(!u.apply(this,arguments))return;var X=O.touches,v=X.length,T=Z(this,m,O.changedTouches.length===v).event(O),Y,k,I,b;xc(O);for(k=0;k"[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:r})=>`Couldn't create edge for ${u} handle id: "${u==="source"?f:r}", 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."},ny=[[Number.NEGATIVE_INFINITY,Number.NEGATIVE_INFINITY],[Number.POSITIVE_INFINITY,Number.POSITIVE_INFINITY]],R5=["Enter"," ","Escape"],x5={"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"},Yn;(function(u){u.Strict="strict",u.Loose="loose"})(Yn||(Yn={}));var x0;(function(u){u.Free="free",u.Vertical="vertical",u.Horizontal="horizontal"})(x0||(x0={}));var mi;(function(u){u.Partial="partial",u.Full="full"})(mi||(mi={}));var h5={inProgress:!1,isValid:null,from:null,fromHandle:null,fromPosition:null,fromNode:null,to:null,toHandle:null,toPosition:null,toNode:null,pointer:null},c0;(function(u){u.Bezier="default",u.Straight="straight",u.Step="step",u.SmoothStep="smoothstep",u.SimpleBezier="simplebezier"})(c0||(c0={}));var pn;(function(u){u.Arrow="arrow",u.ArrowClosed="arrowclosed"})(pn||(pn={}));var Lu;(function(u){u.Left="left",u.Top="top",u.Right="right",u.Bottom="bottom"})(Lu||(Lu={}));var IN={[Lu.Left]:Lu.Right,[Lu.Right]:Lu.Left,[Lu.Top]:Lu.Bottom,[Lu.Bottom]:Lu.Top};function b5(u){return u===null?null:u?"valid":"invalid"}var v5=(u)=>("id"in u)&&("source"in u)&&("target"in u),yq=(u)=>("id"in u)&&("position"in u)&&!("source"in u)&&!("target"in u),k5=(u)=>("id"in u)&&("internals"in u)&&!("source"in u)&&!("target"in u);var E_=(u,l=[0,0])=>{let{width:f,height:r}=A0(u),n=u.origin??l,i=f*n[0],y=r*n[1];return{x:u.position.x-i,y:u.position.y-y}},I5=(u,l={nodeOrigin:[0,0]})=>{if(u.length===0)return{x:0,y:0,width:0,height:0};let f=u.reduce((r,n)=>{let i=typeof n==="string",y=!l.nodeLookup&&!i?n:void 0;if(l.nodeLookup)y=i?l.nodeLookup.get(n):!k5(n)?l.nodeLookup.get(n.id):n;let t=y?vc(y,l.nodeOrigin):{x:0,y:0,x2:0,y2:0};return Ic(r,t)},{x:1/0,y:1/0,x2:-1/0,y2:-1/0});return gc(f)},iy=(u,l={})=>{let f={x:1/0,y:1/0,x2:-1/0,y2:-1/0},r=!1;return u.forEach((n)=>{if(l.filter===void 0||l.filter(n))f=Ic(f,vc(n)),r=!0}),r?gc(f):{x:0,y:0,width:0,height:0}},kc=(u,l,[f,r,n]=[0,0,1],i=!1,y=!1)=>{let t={..._y(l,[f,r,n]),width:l.width/n,height:l.height/n},_=[];for(let c of u.values()){let{measured:A,selectable:j=!0,hidden:F=!1}=c;if(y&&!j||F)continue;let J=A.width??c.width??c.initialWidth??null,Q=A.height??c.height??c.initialHeight??null,w=yy(t,Ci(c)),L=(J??0)*(Q??0),U=i&&w>0;if(!c.internals.handleBounds||U||w>=L||c.dragging)_.push(c)}return _},tq=(u,l)=>{let f=new Set;return u.forEach((r)=>{f.add(r.id)}),l.filter((r)=>f.has(r.source)||f.has(r.target))};function nV(u,l){let f=new Map,r=l?.nodes?new Set(l.nodes.map((n)=>n.id)):null;return u.forEach((n)=>{if(n.measured.width&&n.measured.height&&(l?.includeHiddenNodes||!n.hidden)&&(!r||r.has(n.id)))f.set(n.id,n)}),f}async function _q({nodes:u,width:l,height:f,panZoom:r,minZoom:n,maxZoom:i},y){if(u.size===0)return Promise.resolve(!0);let t=nV(u,y),_=iy(t),c=Z_(_,l,f,y?.minZoom??n,y?.maxZoom??i,y?.padding??0.1);return await r.setViewport(c,{duration:y?.duration,ease:y?.ease,interpolate:y?.interpolate}),Promise.resolve(!0)}function g5({nodeId:u,nextPosition:l,nodeLookup:f,nodeOrigin:r=[0,0],nodeExtent:n,onError:i}){let y=f.get(u),t=y.parentId?f.get(y.parentId):void 0,{x:_,y:c}=t?t.internals.positionAbsolute:{x:0,y:0},A=y.origin??r,j=y.extent||n;if(y.extent==="parent"&&!y.expandParent)if(!t)i?.("005",Ur.error005());else{let J=t.measured.width,Q=t.measured.height;if(J&&Q)j=[[_,c],[_+J,c+Q]]}else if(t&&ry(y.extent))j=[[y.extent[0][0]+_,y.extent[0][1]+c],[y.extent[1][0]+_,y.extent[1][1]+c]];let F=ry(j)?Pi(l,j,y.measured):l;if(y.measured.width===void 0||y.measured.height===void 0)i?.("015",Ur.error015());return{position:{x:F.x-_+(y.measured.width??0)*A[0],y:F.y-c+(y.measured.height??0)*A[1]},positionAbsolute:F}}async function $q({nodesToRemove:u=[],edgesToRemove:l=[],nodes:f,edges:r,onBeforeDelete:n}){let i=new Set(u.map((F)=>F.id)),y=[];for(let F of f){if(F.deletable===!1)continue;let J=i.has(F.id),Q=!J&&F.parentId&&y.find((w)=>w.id===F.parentId);if(J||Q)y.push(F)}let t=new Set(l.map((F)=>F.id)),_=r.filter((F)=>F.deletable!==!1),A=tq(y,_);for(let F of _)if(t.has(F.id)&&!A.find((Q)=>Q.id===F.id))A.push(F);if(!n)return{edges:A,nodes:y};let j=await n({nodes:y,edges:A});if(typeof j==="boolean")return j?{edges:A,nodes:y}:{edges:[],nodes:[]};return j}var fy=(u,l=0,f=1)=>Math.min(Math.max(u,l),f),Pi=(u={x:0,y:0},l,f)=>({x:fy(u.x,l[0][0],l[1][0]-(f?.width??0)),y:fy(u.y,l[0][1],l[1][1]-(f?.height??0))});function cq(u,l,f){let{width:r,height:n}=A0(f),{x:i,y}=f.internals.positionAbsolute;return Pi(u,[[i,y],[i+r,y+n]],l)}var gN=(u,l,f)=>{if(uf)return-fy(Math.abs(u-f),1,l)/l;return 0},Aq=(u,l,f=15,r=40)=>{let n=gN(u.x,r,l.width-r)*f,i=gN(u.y,r,l.height-r)*f;return[n,i]},Ic=(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)}),M5=({x:u,y:l,width:f,height:r})=>({x:u,y:l,x2:u+f,y2:l+r}),gc=({x:u,y:l,x2:f,y2:r})=>({x:u,y:l,width:f-u,height:r-l}),Ci=(u,l=[0,0])=>{let{x:f,y:r}=k5(u)?u.internals.positionAbsolute:E_(u,l);return{x:f,y:r,width:u.measured?.width??u.width??u.initialWidth??0,height:u.measured?.height??u.height??u.initialHeight??0}},vc=(u,l=[0,0])=>{let{x:f,y:r}=k5(u)?u.internals.positionAbsolute:E_(u,l);return{x:f,y:r,x2:f+(u.measured?.width??u.width??u.initialWidth??0),y2:r+(u.measured?.height??u.height??u.initialHeight??0)}},s5=(u,l)=>gc(Ic(M5(u),M5(l))),yy=(u,l)=>{let f=Math.max(0,Math.min(u.x+u.width,l.x+l.width)-Math.max(u.x,l.x)),r=Math.max(0,Math.min(u.y+u.height,l.y+l.height)-Math.max(u.y,l.y));return Math.ceil(f*r)},a5=(u)=>Zr(u.width)&&Zr(u.height)&&Zr(u.x)&&Zr(u.y),Zr=(u)=>!isNaN(u)&&isFinite(u),o5=(u,l)=>{},ty=(u,l=[1,1])=>{return{x:l[0]*Math.round(u.x/l[0]),y:l[1]*Math.round(u.y/l[1])}},_y=({x:u,y:l},[f,r,n],i=!1,y=[1,1])=>{let t={x:(u-f)/n,y:(l-r)/n};return i?ty(t,y):t},T_=({x:u,y:l},[f,r,n])=>{return{x:u*n+f,y:l*n+r}};function uy(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 iV(u,l,f){if(typeof u==="string"||typeof u==="number"){let r=uy(u,f),n=uy(u,l);return{top:r,right:n,bottom:r,left:n,x:n*2,y:r*2}}if(typeof u==="object"){let r=uy(u.top??u.y??0,f),n=uy(u.bottom??u.y??0,f),i=uy(u.left??u.x??0,l),y=uy(u.right??u.x??0,l);return{top:r,right:y,bottom:n,left:i,x:i+y,y:r+n}}return{top:0,right:0,bottom:0,left:0,x:0,y:0}}function yV(u,l,f,r,n,i){let{x:y,y:t}=T_(u,[l,f,r]),{x:_,y:c}=T_({x:u.x+u.width,y:u.y+u.height},[l,f,r]),A=n-_,j=i-c;return{left:Math.floor(y),top:Math.floor(t),right:Math.floor(A),bottom:Math.floor(j)}}var Z_=(u,l,f,r,n,i)=>{let y=iV(i,l,f),t=(l-y.x)/u.width,_=(f-y.y)/u.height,c=Math.min(t,_),A=fy(c,r,n),j=u.x+u.width/2,F=u.y+u.height/2,J=l/2-j*A,Q=f/2-F*A,w=yV(u,J,Q,A,l,f),L={left:Math.min(w.left-y.left,0),top:Math.min(w.top-y.top,0),right:Math.min(w.right-y.right,0),bottom:Math.min(w.bottom-y.bottom,0)};return{x:J-L.left+L.right,y:Q-L.top+L.bottom,zoom:A}},$y=()=>typeof navigator<"u"&&navigator?.userAgent?.indexOf("Mac")>=0;function ry(u){return u!==void 0&&u!==null&&u!=="parent"}function A0(u){return{width:u.measured?.width??u.width??u.initialWidth??0,height:u.measured?.height??u.height??u.initialHeight??0}}function d5(u){return(u.measured?.width??u.width??u.initialWidth)!==void 0&&(u.measured?.height??u.height??u.initialHeight)!==void 0}function e5(u,l={width:0,height:0},f,r,n){let i={...u},y=r.get(f);if(y){let t=y.origin||n;i.x+=y.internals.positionAbsolute.x-(l.width??0)*t[0],i.y+=y.internals.positionAbsolute.y-(l.height??0)*t[1]}return i}function u9(u,l){if(u.size!==l.size)return!1;for(let f of u)if(!l.has(f))return!1;return!0}function jq(){let u,l;return{promise:new Promise((r,n)=>{u=r,l=n}),resolve:u,reject:l}}function Fq(u){return{...x5,...u||{}}}function z_(u,{snapGrid:l=[0,0],snapToGrid:f=!1,transform:r,containerBounds:n}){let{x:i,y}=Or(u),t=_y({x:i-(n?.left??0),y:y-(n?.top??0)},r),{x:_,y:c}=f?ty(t,l):t;return{xSnapped:_,ySnapped:c,...t}}var sc=(u)=>({width:u.offsetWidth,height:u.offsetHeight}),l9=(u)=>u?.getRootNode?.()||window?.document,tV=["INPUT","SELECT","TEXTAREA"];function f9(u){let l=u.composedPath?.()?.[0]||u.target;if(l?.nodeType!==1)return!1;return tV.includes(l.nodeName)||l.hasAttribute("contenteditable")||!!l.closest(".nokey")}var r9=(u)=>("clientX"in u),Or=(u,l)=>{let f=r9(u),r=f?u.clientX:u.touches?.[0].clientX,n=f?u.clientY:u.touches?.[0].clientY;return{x:r-(l?.left??0),y:n-(l?.top??0)}},sN=(u,l,f,r,n)=>{let i=l.querySelectorAll(`.${u}`);if(!i||!i.length)return null;return Array.from(i).map((y)=>{let t=y.getBoundingClientRect();return{id:y.getAttribute("data-handleid"),type:u,nodeId:n,position:y.getAttribute("data-handlepos"),x:(t.left-f.left)/r,y:(t.top-f.top)/r,...sc(y)}})};function ac({sourceX:u,sourceY:l,targetX:f,targetY:r,sourceControlX:n,sourceControlY:i,targetControlX:y,targetControlY:t}){let _=u*0.125+n*0.375+y*0.375+f*0.125,c=l*0.125+i*0.375+t*0.375+r*0.125,A=Math.abs(_-u),j=Math.abs(c-l);return[_,c,A,j]}function hc(u,l){if(u>=0)return 0.5*u;return l*25*Math.sqrt(-u)}function aN({pos:u,x1:l,y1:f,x2:r,y2:n,c:i}){switch(u){case Lu.Left:return[l-hc(l-r,i),f];case Lu.Right:return[l+hc(r-l,i),f];case Lu.Top:return[l,f-hc(f-n,i)];case Lu.Bottom:return[l,f+hc(n-f,i)]}}function oc({sourceX:u,sourceY:l,sourcePosition:f=Lu.Bottom,targetX:r,targetY:n,targetPosition:i=Lu.Top,curvature:y=0.25}){let[t,_]=aN({pos:f,x1:u,y1:l,x2:r,y2:n,c:y}),[c,A]=aN({pos:i,x1:r,y1:n,x2:u,y2:l,c:y}),[j,F,J,Q]=ac({sourceX:u,sourceY:l,targetX:r,targetY:n,sourceControlX:t,sourceControlY:_,targetControlX:c,targetControlY:A});return[`M${u},${l} C${t},${_} ${c},${A} ${r},${n}`,j,F,J,Q]}function n9({sourceX:u,sourceY:l,targetX:f,targetY:r}){let n=Math.abs(f-u)/2,i=f0}var _V=({source:u,sourceHandle:l,target:f,targetHandle:r})=>`xy-edge__${u}${l||""}-${f}${r||""}`,$V=(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))},i9=(u,l,f={})=>{if(!u.source||!u.target)return o5("006",Ur.error006()),l;let r=f.getEdgeId||_V,n;if(v5(u))n={...u};else n={...u,id:r(u)};if($V(n,l))return l;if(n.sourceHandle===null)delete n.sourceHandle;if(n.targetHandle===null)delete n.targetHandle;return l.concat(n)};function dc({sourceX:u,sourceY:l,targetX:f,targetY:r}){let[n,i,y,t]=n9({sourceX:u,sourceY:l,targetX:f,targetY:r});return[`M ${u},${l}L ${f},${r}`,n,i,y,t]}var oN={[Lu.Left]:{x:-1,y:0},[Lu.Right]:{x:1,y:0},[Lu.Top]:{x:0,y:-1},[Lu.Bottom]:{x:0,y:1}},cV=({source:u,sourcePosition:l=Lu.Bottom,target:f})=>{if(l===Lu.Left||l===Lu.Right)return u.xMath.sqrt(Math.pow(l.x-u.x,2)+Math.pow(l.y-u.y,2));function AV({source:u,sourcePosition:l=Lu.Bottom,target:f,targetPosition:r=Lu.Top,center:n,offset:i,stepPosition:y}){let t=oN[l],_=oN[r],c={x:u.x+t.x*i,y:u.y+t.y*i},A={x:f.x+_.x*i,y:f.y+_.y*i},j=cV({source:c,sourcePosition:l,target:A}),F=j.x!==0?"x":"y",J=j[F],Q=[],w,L,U={x:0,y:0},N={x:0,y:0},[,,q,W]=n9({sourceX:u.x,sourceY:u.y,targetX:f.x,targetY:f.y});if(t[F]*_[F]===-1){if(F==="x")w=n.x??c.x+(A.x-c.x)*y,L=n.y??(c.y+A.y)/2;else w=n.x??(c.x+A.x)/2,L=n.y??c.y+(A.y-c.y)*y;let E=[{x:w,y:c.y},{x:w,y:A.y}],D=[{x:c.x,y:L},{x:A.x,y:L}];if(t[F]===J)Q=F==="x"?E:D;else Q=F==="x"?D:E}else{let E=[{x:c.x,y:A.y}],D=[{x:A.x,y:c.y}];if(F==="x")Q=t.x===J?D:E;else Q=t.y===J?E:D;if(l===r){let O=Math.abs(u[F]-f[F]);if(O<=i){let m=Math.min(i-1,i-O);if(t[F]===J)U[F]=(c[F]>u[F]?-1:1)*m;else N[F]=(A[F]>f[F]?-1:1)*m}}if(l!==r){let O=F==="x"?"y":"x",m=t[F]===_[O],X=c[O]>A[O],v=c[O]=p)w=(h.x+V.x)/2,L=Q[0].y;else w=Q[0].x,L=(h.y+V.y)/2}let z={x:c.x+U.x,y:c.y+U.y},Z={x:A.x+N.x,y:A.y+N.y};return[[u,...z.x!==Q[0].x||z.y!==Q[0].y?[z]:[],...Q,...Z.x!==Q[Q.length-1].x||Z.y!==Q[Q.length-1].y?[Z]:[],f],w,L,q,W]}function jV(u,l,f,r){let n=Math.min(dN(u,l)/2,dN(l,f)/2,r),{x:i,y}=l;if(u.x===i&&i===f.x||u.y===y&&y===f.y)return`L${i} ${y}`;if(u.y===y){let c=u.xf.id===l))||null}function ec(u,l){if(!u)return"";if(typeof u==="string")return u;return`${l?`${l}__`:""}${Object.keys(u).sort().map((r)=>`${r}=${u[r]}`).join("&")}`}function Nq(u,{id:l,defaultColor:f,defaultMarkerStart:r,defaultMarkerEnd:n}){let i=new Set;return u.reduce((y,t)=>{return[t.markerStart||r,t.markerEnd||n].forEach((_)=>{if(_&&typeof _==="object"){let c=ec(_,l);if(!i.has(c))y.push({id:c,color:_.color||f,..._}),i.add(c)}}),y},[]).sort((y,t)=>y.id.localeCompare(t.id))}var qq=1000,FV=10,y9={nodeOrigin:[0,0],nodeExtent:ny,elevateNodesOnSelect:!0,zIndexMode:"basic",defaults:{}},UV={...y9,checkEquality:!0};function t9(u,l){let f={...u};for(let r in l)if(l[r]!==void 0)f[r]=l[r];return f}function Wq(u,l,f){let r=t9(y9,f);for(let n of u.values())if(n.parentId)$9(n,u,l,r);else{let i=E_(n,r.nodeOrigin),y=ry(n.extent)?n.extent:r.nodeExtent,t=Pi(i,y,A0(n));n.internals.positionAbsolute=t}}function JV(u,l){if(!u.handles)return!u.measured?void 0:l?.internals.handleBounds;let f=[],r=[];for(let n of u.handles){let i={id:n.id,width:n.width??1,height:n.height??1,nodeId:u.id,x:n.x,y:n.y,position:n.position,type:n.type};if(n.type==="source")f.push(i);else if(n.type==="target")r.push(i)}return{source:f,target:r}}function _9(u){return u==="manual"}function u6(u,l,f,r={}){let n=t9(UV,r),i={i:0},y=new Map(l),t=n?.elevateNodesOnSelect&&!_9(n.zIndexMode)?qq:0,_=u.length>0,c=!1;l.clear(),f.clear();for(let A of u){let j=y.get(A.id);if(n.checkEquality&&A===j?.internals.userNode)l.set(A.id,j);else{let F=E_(A,n.nodeOrigin),J=ry(A.extent)?A.extent:n.nodeExtent,Q=Pi(F,J,A0(A));j={...n.defaults,...A,measured:{width:A.measured?.width,height:A.measured?.height},internals:{positionAbsolute:Q,handleBounds:JV(A,j),z:wq(A,t,n.zIndexMode),userNode:A}},l.set(A.id,j)}if((j.measured===void 0||j.measured.width===void 0||j.measured.height===void 0)&&!j.hidden)_=!1;if(A.parentId)$9(j,l,f,r,i);c||=A.selected??!1}return{nodesInitialized:_,hasSelectedNodes:c}}function QV(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 $9(u,l,f,r,n){let{elevateNodesOnSelect:i,nodeOrigin:y,nodeExtent:t,zIndexMode:_}=t9(y9,r),c=u.parentId,A=l.get(c);if(!A){console.warn(`Parent node ${c} not found. Please make sure that parent nodes are in front of their child nodes in the nodes array.`);return}if(QV(u,f),n&&!A.parentId&&A.internals.rootParentIndex===void 0&&_==="auto")A.internals.rootParentIndex=++n.i,A.internals.z=A.internals.z+n.i*FV;if(n&&A.internals.rootParentIndex!==void 0)n.i=A.internals.rootParentIndex;let j=i&&!_9(_)?qq:0,{x:F,y:J,z:Q}=NV(u,A,y,t,j,_),{positionAbsolute:w}=u.internals,L=F!==w.x||J!==w.y;if(L||Q!==u.internals.z)l.set(u.id,{...u,internals:{...u.internals,positionAbsolute:L?{x:F,y:J}:w,z:Q}})}function wq(u,l,f){let r=Zr(u.zIndex)?u.zIndex:0;if(_9(f))return r;return r+(u.selected?l:0)}function NV(u,l,f,r,n,i){let{x:y,y:t}=l.internals.positionAbsolute,_=A0(u),c=E_(u,f),A=ry(u.extent)?Pi(c,u.extent,_):c,j=Pi({x:y+A.x,y:t+A.y},r,_);if(u.extent==="parent")j=cq(j,_,l);let F=wq(u,n,i),J=l.internals.z??0;return{x:j.x,y:j.y,z:J>=F?J+1:F}}function l6(u,l,f,r=[0,0]){let n=[],i=new Map;for(let y of u){let t=l.get(y.parentId);if(!t)continue;let _=i.get(y.parentId)?.expandedRect??Ci(t),c=s5(_,y.rect);i.set(y.parentId,{expandedRect:c,parent:t})}if(i.size>0)i.forEach(({expandedRect:y,parent:t},_)=>{let c=t.internals.positionAbsolute,A=A0(t),j=t.origin??r,F=y.x0||J>0||L||U)n.push({id:_,type:"position",position:{x:t.position.x-F+L,y:t.position.y-J+U}}),f.get(_)?.forEach((N)=>{if(!u.some((q)=>q.id===N.id))n.push({id:N.id,type:"position",position:{x:N.position.x+F,y:N.position.y+J}})});if(A.width0){let J=l6(F,l,f,n);c.push(...J)}return{changes:c,updatedInternals:_}}async function Kq({delta:u,panZoom:l,transform:f,translateExtent:r,width:n,height:i}){if(!l||!u.x&&!u.y)return Promise.resolve(!1);let y=await l.setViewportConstrained({x:f[0]+u.x,y:f[1]+u.y,zoom:f[2]},[[0,0],[n,i]],r),t=!!y&&(y.x!==f[0]||y.y!==f[1]||y.k!==f[2]);return Promise.resolve(t)}function fq(u,l,f,r,n,i){let y=n,t=r.get(y)||new Map;r.set(y,t.set(f,l)),y=`${n}-${u}`;let _=r.get(y)||new Map;if(r.set(y,_.set(f,l)),i){y=`${n}-${u}-${i}`;let c=r.get(y)||new Map;r.set(y,c.set(f,l))}}function c9(u,l,f){u.clear(),l.clear();for(let r of f){let{source:n,target:i,sourceHandle:y=null,targetHandle:t=null}=r,_={edgeId:r.id,source:n,target:i,sourceHandle:y,targetHandle:t},c=`${n}-${y}--${i}-${t}`,A=`${i}-${t}--${n}-${y}`;fq("source",_,A,u,n,y),fq("target",_,c,u,i,t),l.set(r.id,r)}}function Gq(u,l){if(!u.parentId)return!1;let f=l.get(u.parentId);if(!f)return!1;if(f.selected)return!0;return Gq(f,l)}function rq(u,l,f){let r=u;do{if(r?.matches?.(l))return!0;if(r===f)return!1;r=r?.parentElement}while(r);return!1}function qV(u,l,f,r){let n=new Map;for(let[i,y]of u)if((y.selected||y.id===r)&&(!y.parentId||!Gq(y,u))&&(y.draggable||l&&typeof y.draggable>"u")){let t=u.get(i);if(t)n.set(i,{id:i,position:t.position||{x:0,y:0},distance:{x:f.x-t.internals.positionAbsolute.x,y:f.y-t.internals.positionAbsolute.y},extent:t.extent,parentId:t.parentId,origin:t.origin,expandParent:t.expandParent,internals:{positionAbsolute:t.internals.positionAbsolute||{x:0,y:0}},measured:{width:t.measured.width??0,height:t.measured.height??0}})}return n}function m5({nodeId:u,dragItems:l,nodeLookup:f,dragging:r=!0}){let n=[];for(let[y,t]of l){let _=f.get(y)?.internals.userNode;if(_)n.push({..._,position:t.position,dragging:r})}if(!u)return[n[0],n];let i=f.get(u)?.internals.userNode;return[!i?n[0]:{...i,position:l.get(u)?.position||i.position,dragging:r},n]}function WV({dragItems:u,snapGrid:l,x:f,y:r}){let n=u.values().next().value;if(!n)return null;let i={x:f-n.distance.x,y:r-n.distance.y},y=ty(i,l);return{x:y.x-i.x,y:y.y-i.y}}function zq({onNodeMouseDown:u,getStoreItems:l,onDragStart:f,onDrag:r,onDragStop:n}){let i={x:null,y:null},y=0,t=new Map,_=!1,c={x:0,y:0},A=null,j=!1,F=null,J=!1,Q=!1,w=null;function L({noDragClassName:N,handleSelector:q,domNode:W,isSelectable:z,nodeId:Z,nodeClickDistance:H=0}){F=sl(W);function E({x:S,y:p}){let{nodeLookup:O,nodeExtent:m,snapGrid:X,snapToGrid:v,nodeOrigin:T,onNodeDrag:Y,onSelectionDrag:k,onError:I,updateNodePositions:b}=l();i={x:S,y:p};let o=!1,g=t.size>1,x=g&&m?M5(iy(t)):null,lu=g&&v?WV({dragItems:t,snapGrid:X,x:S,y:p}):null;for(let[_u,$u]of t){if(!O.has(_u))continue;let ju={x:S-$u.distance.x,y:p-$u.distance.y};if(v)ju=lu?{x:Math.round(ju.x+lu.x),y:Math.round(ju.y+lu.y)}:ty(ju,X);let zu=null;if(g&&m&&!$u.extent&&x){let{positionAbsolute:e}=$u.internals,uu=e.x-x.x+m[0][0],Ku=e.x+$u.measured.width-x.x2+m[1][0],s=e.y-x.y+m[0][1],Nu=e.y+$u.measured.height-x.y2+m[1][1];zu=[[uu,s],[Ku,Nu]]}let{position:Wu,positionAbsolute:P}=g5({nodeId:_u,nextPosition:ju,nodeLookup:O,nodeExtent:zu?zu:m,nodeOrigin:T,onError:I});o=o||$u.position.x!==Wu.x||$u.position.y!==Wu.y,$u.position=Wu,$u.internals.positionAbsolute=P}if(Q=Q||o,!o)return;if(b(t,!0),w&&(r||Y||!Z&&k)){let[_u,$u]=m5({nodeId:Z,dragItems:t,nodeLookup:O});if(r?.(w,t,_u,$u),Y?.(w,_u,$u),!Z)k?.(w,$u)}}async function D(){if(!A)return;let{transform:S,panBy:p,autoPanSpeed:O,autoPanOnNodeDrag:m}=l();if(!m){_=!1,cancelAnimationFrame(y);return}let[X,v]=Aq(c,A,O);if(X!==0||v!==0){if(i.x=(i.x??0)-X/S[2],i.y=(i.y??0)-v/S[2],await p({x:X,y:v}))E(i)}y=requestAnimationFrame(D)}function h(S){let{nodeLookup:p,multiSelectionActive:O,nodesDraggable:m,transform:X,snapGrid:v,snapToGrid:T,selectNodesOnDrag:Y,onNodeDragStart:k,onSelectionDragStart:I,unselectNodesAndEdges:b}=l();if(j=!0,(!Y||!z)&&!O&&Z){if(!p.get(Z)?.selected)b()}if(z&&Y&&Z)u?.(Z);let o=z_(S.sourceEvent,{transform:X,snapGrid:v,snapToGrid:T,containerBounds:A});if(i=o,t=qV(p,m,o,Z),t.size>0&&(f||k||!Z&&I)){let[g,x]=m5({nodeId:Z,dragItems:t,nodeLookup:p});if(f?.(S.sourceEvent,t,g,x),k?.(S.sourceEvent,g,x),!Z)I?.(S.sourceEvent,x)}}let V=i_().clickDistance(H).on("start",(S)=>{let{domNode:p,nodeDragThreshold:O,transform:m,snapGrid:X,snapToGrid:v}=l();if(A=p?.getBoundingClientRect()||null,J=!1,Q=!1,w=S.sourceEvent,O===0)h(S);i=z_(S.sourceEvent,{transform:m,snapGrid:X,snapToGrid:v,containerBounds:A}),c=Or(S.sourceEvent,A)}).on("drag",(S)=>{let{autoPanOnNodeDrag:p,transform:O,snapGrid:m,snapToGrid:X,nodeDragThreshold:v,nodeLookup:T}=l(),Y=z_(S.sourceEvent,{transform:O,snapGrid:m,snapToGrid:X,containerBounds:A});if(w=S.sourceEvent,S.sourceEvent.type==="touchmove"&&S.sourceEvent.touches.length>1||Z&&!T.has(Z))J=!0;if(J)return;if(!_&&p&&j)_=!0,D();if(!j){let k=Or(S.sourceEvent,A),I=k.x-c.x,b=k.y-c.y;if(Math.sqrt(I*I+b*b)>v)h(S)}if((i.x!==Y.xSnapped||i.y!==Y.ySnapped)&&t&&j)c=Or(S.sourceEvent,A),E(Y)}).on("end",(S)=>{if(!j||J)return;if(_=!1,j=!1,cancelAnimationFrame(y),t.size>0){let{nodeLookup:p,updateNodePositions:O,onNodeDragStop:m,onSelectionDragStop:X}=l();if(Q)O(t,!1),Q=!1;if(n||m||!Z&&X){let[v,T]=m5({nodeId:Z,dragItems:t,nodeLookup:p,dragging:!1});if(n?.(S.sourceEvent,t,v,T),m?.(S.sourceEvent,v,T),!Z)X?.(S.sourceEvent,T)}}}).filter((S)=>{let p=S.target;return!S.button&&(!N||!rq(p,`.${N}`,W))&&(!q||rq(p,q,W))});F.call(V)}function U(){F?.on(".drag",null)}return{update:L,destroy:U}}function wV(u,l,f){let r=[],n={x:u.x-f,y:u.y-f,width:f*2,height:f*2};for(let i of l.values())if(yy(n,Ci(i))>0)r.push(i);return r}var LV=250;function KV(u,l,f,r){let n=[],i=1/0,y=wV(u,f,l+LV);for(let t of y){let _=[...t.internals.handleBounds?.source??[],...t.internals.handleBounds?.target??[]];for(let c of _){if(r.nodeId===c.nodeId&&r.type===c.type&&r.id===c.id)continue;let{x:A,y:j}=mn(t,c,c.position,!0),F=Math.sqrt(Math.pow(A-u.x,2)+Math.pow(j-u.y,2));if(F>l)continue;if(F1){let t=r.type==="source"?"target":"source";return n.find((_)=>_.type===t)??n[0]}return n[0]}function Tq(u,l,f,r,n,i=!1){let y=r.get(u);if(!y)return null;let t=n==="strict"?y.internals.handleBounds?.[l]:[...y.internals.handleBounds?.source??[],...y.internals.handleBounds?.target??[]],_=(f?t?.find((c)=>c.id===f):t?.[0])??null;return _&&i?{..._,...mn(y,_,_.position,!0)}:_}function Eq(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 GV(u,l){let f=null;if(l)f=!0;else if(u&&!l)f=!1;return f}var Zq=()=>!0;function zV(u,{connectionMode:l,connectionRadius:f,handleId:r,nodeId:n,edgeUpdaterType:i,isTarget:y,domNode:t,nodeLookup:_,lib:c,autoPanOnConnect:A,flowId:j,panBy:F,cancelConnection:J,onConnectStart:Q,onConnect:w,onConnectEnd:L,isValidConnection:U=Zq,onReconnectEnd:N,updateConnection:q,getTransform:W,getFromHandle:z,autoPanSpeed:Z,dragThreshold:H=1,handleDomNode:E}){let D=l9(u.target),h=0,V,{x:S,y:p}=Or(u),O=Eq(i,E),m=t?.getBoundingClientRect(),X=!1;if(!m||!O)return;let v=Tq(n,O,r,_,l);if(!v)return;let T=Or(u,m),Y=!1,k=null,I=!1,b=null;function o(){if(!A||!m)return;let[Wu,P]=Aq(T,m,Z);F({x:Wu,y:P}),h=requestAnimationFrame(o)}let g={...v,nodeId:n,type:O,position:v.position},x=_.get(n),_u={inProgress:!0,isValid:null,from:mn(x,g,Lu.Left,!0),fromHandle:g,fromPosition:g.position,fromNode:x,to:T,toHandle:null,toPosition:IN[g.position],toNode:null,pointer:T};function $u(){X=!0,q(_u),Q?.(u,{nodeId:n,handleId:r,handleType:O})}if(H===0)$u();function ju(Wu){if(!X){let{x:Nu,y:Eu}=Or(Wu),Hu=Nu-S,vu=Eu-p;if(!(Hu*Hu+vu*vu>H*H))return;$u()}if(!z()||!g){zu(Wu);return}let P=W();if(T=Or(Wu,m),V=KV(_y(T,P,!1,[1,1]),f,_,g),!Y)o(),Y=!0;let e=Oq(Wu,{handle:V,connectionMode:l,fromNodeId:n,fromHandleId:r,fromType:y?"target":"source",isValidConnection:U,doc:D,lib:c,flowId:j,nodeLookup:_});b=e.handleDomNode,k=e.connection,I=GV(!!V,e.isValid);let uu=_.get(n),Ku=uu?mn(uu,g,Lu.Left,!0):_u.from,s={..._u,from:Ku,isValid:I,to:e.toHandle&&I?T_({x:e.toHandle.x,y:e.toHandle.y},P):T,toHandle:e.toHandle,toPosition:I&&e.toHandle?e.toHandle.position:IN[g.position],toNode:e.toHandle?_.get(e.toHandle.nodeId):null,pointer:T};q(s),_u=s}function zu(Wu){if("touches"in Wu&&Wu.touches.length>0)return;if(X){if((V||b)&&k&&I)w?.(k);let{inProgress:P,...e}=_u,uu={...e,toPosition:_u.toHandle?_u.toPosition:null};if(L?.(Wu,uu),i)N?.(Wu,uu)}J(),cancelAnimationFrame(h),Y=!1,I=!1,k=null,b=null,D.removeEventListener("mousemove",ju),D.removeEventListener("mouseup",zu),D.removeEventListener("touchmove",ju),D.removeEventListener("touchend",zu)}D.addEventListener("mousemove",ju),D.addEventListener("mouseup",zu),D.addEventListener("touchmove",ju),D.addEventListener("touchend",zu)}function Oq(u,{handle:l,connectionMode:f,fromNodeId:r,fromHandleId:n,fromType:i,doc:y,lib:t,flowId:_,isValidConnection:c=Zq,nodeLookup:A}){let j=i==="target",F=l?y.querySelector(`.${t}-flow__handle[data-id="${_}-${l?.nodeId}-${l?.id}-${l?.type}"]`):null,{x:J,y:Q}=Or(u),w=y.elementFromPoint(J,Q),L=w?.classList.contains(`${t}-flow__handle`)?w:F,U={handleDomNode:L,isValid:!1,connection:null,toHandle:null};if(L){let N=Eq(void 0,L),q=L.getAttribute("data-nodeid"),W=L.getAttribute("data-handleid"),z=L.classList.contains("connectable"),Z=L.classList.contains("connectableend");if(!q||!N)return U;let H={source:j?q:r,sourceHandle:j?W:n,target:j?r:q,targetHandle:j?n:W};U.connection=H;let D=z&&Z&&(f===Yn.Strict?j&&N==="source"||!j&&N==="target":q!==r||W!==n);U.isValid=D&&c(H),U.toHandle=Tq(q,N,W,A,f,!0)}return U}var f6={onPointerDown:zV,isValid:Oq};function Hq({domNode:u,panZoom:l,getTransform:f,getViewScale:r}){let n=sl(u);function i({translateExtent:t,width:_,height:c,zoomStep:A=1,pannable:j=!0,zoomable:F=!0,inversePan:J=!1}){let Q=(q)=>{if(q.sourceEvent.type!=="wheel"||!l)return;let W=f(),z=q.sourceEvent.ctrlKey&&$y()?10:1,Z=-q.sourceEvent.deltaY*(q.sourceEvent.deltaMode===1?0.05:q.sourceEvent.deltaMode?1:0.002)*A,H=W[2]*Math.pow(2,Z*z);l.scaleTo(H)},w=[0,0],L=(q)=>{if(q.sourceEvent.type==="mousedown"||q.sourceEvent.type==="touchstart")w=[q.sourceEvent.clientX??q.sourceEvent.touches[0].clientX,q.sourceEvent.clientY??q.sourceEvent.touches[0].clientY]},U=(q)=>{let W=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],Z=[z[0]-w[0],z[1]-w[1]];w=z;let H=r()*Math.max(W[2],Math.log(W[2]))*(J?-1:1),E={x:W[0]-Z[0]*H,y:W[1]-Z[1]*H},D=[[0,0],[_,c]];l.setViewportConstrained({x:E.x,y:E.y,zoom:W[2]},D,t)},N=G_().on("start",L).on("zoom",j?U:null).on("zoom.wheel",F?Q:null);n.call(N,{})}function y(){n.on("zoom",null)}return{update:i,destroy:y,pointer:Gf}}var r6=(u)=>({x:u.x,y:u.y,zoom:u.k}),P5=({x:u,y:l,zoom:f})=>Yi.translate(u,l).scale(f),ly=(u,l)=>u.target.closest(`.${l}`),Bq=(u,l)=>l===2&&Array.isArray(u)&&u.includes(2),TV=(u)=>((u*=2)<=1?u*u*u:(u-=2)*u*u+2)/2,C5=(u,l=0,f=TV,r=()=>{})=>{let n=typeof l==="number"&&l>0;if(!n)r();return n?u.transition().duration(l).ease(f).on("end",r):u},Vq=(u)=>{let l=u.ctrlKey&&$y()?10:1;return-u.deltaY*(u.deltaMode===1?0.05:u.deltaMode?1:0.002)*l};function EV({zoomPanValues:u,noWheelClassName:l,d3Selection:f,d3Zoom:r,panOnScrollMode:n,panOnScrollSpeed:i,zoomOnPinch:y,onPanZoomStart:t,onPanZoom:_,onPanZoomEnd:c}){return(A)=>{if(ly(A,l)){if(A.ctrlKey)A.preventDefault();return!1}A.preventDefault(),A.stopImmediatePropagation();let j=f.property("__zoom").k||1;if(A.ctrlKey&&y){let L=Gf(A),U=Vq(A),N=j*Math.pow(2,U);r.scaleTo(f,N,L,A);return}let F=A.deltaMode===1?20:1,J=n===x0.Vertical?0:A.deltaX*F,Q=n===x0.Horizontal?0:A.deltaY*F;if(!$y()&&A.shiftKey&&n!==x0.Vertical)J=A.deltaY*F,Q=0;r.translateBy(f,-(J/j)*i,-(Q/j)*i,{internal:!0});let w=r6(f.property("__zoom"));if(clearTimeout(u.panScrollTimeout),!u.isPanScrolling)u.isPanScrolling=!0,t?.(A,w);else _?.(A,w),u.panScrollTimeout=setTimeout(()=>{c?.(A,w),u.isPanScrolling=!1},150)}}function ZV({noWheelClassName:u,preventScrolling:l,d3ZoomHandler:f}){return function(r,n){let i=r.type==="wheel",y=!l&&i&&!r.ctrlKey,t=ly(r,u);if(r.ctrlKey&&i&&t)r.preventDefault();if(y||t)return null;r.preventDefault(),f.call(this,r,n)}}function OV({zoomPanValues:u,onDraggingChange:l,onPanZoomStart:f}){return(r)=>{if(r.sourceEvent?.internal)return;let n=r6(r.transform);if(u.mouseButton=r.sourceEvent?.button||0,u.isZoomingOrPanning=!0,u.prevViewport=n,r.sourceEvent?.type==="mousedown")l(!0);if(f)f?.(r.sourceEvent,n)}}function HV({zoomPanValues:u,panOnDrag:l,onPaneContextMenu:f,onTransformChange:r,onPanZoom:n}){return(i)=>{if(u.usedRightMouseButton=!!(f&&Bq(l,u.mouseButton??0)),!i.sourceEvent?.sync)r([i.transform.x,i.transform.y,i.transform.k]);if(n&&!i.sourceEvent?.internal)n?.(i.sourceEvent,r6(i.transform))}}function BV({zoomPanValues:u,panOnDrag:l,panOnScroll:f,onDraggingChange:r,onPanZoomEnd:n,onPaneContextMenu:i}){return(y)=>{if(y.sourceEvent?.internal)return;if(u.isZoomingOrPanning=!1,i&&Bq(l,u.mouseButton??0)&&!u.usedRightMouseButton&&y.sourceEvent)i(y.sourceEvent);if(u.usedRightMouseButton=!1,r(!1),n){let t=r6(y.transform);u.prevViewport=t,clearTimeout(u.timerId),u.timerId=setTimeout(()=>{n?.(y.sourceEvent,t)},f?150:0)}}}function VV({zoomActivationKeyPressed:u,zoomOnScroll:l,zoomOnPinch:f,panOnDrag:r,panOnScroll:n,zoomOnDoubleClick:i,userSelectionActive:y,noWheelClassName:t,noPanClassName:_,lib:c,connectionInProgress:A}){return(j)=>{let F=u||l,J=f&&j.ctrlKey,Q=j.type==="wheel";if(j.button===1&&j.type==="mousedown"&&(ly(j,`${c}-flow__node`)||ly(j,`${c}-flow__edge`)))return!0;if(!r&&!F&&!n&&!i&&!f)return!1;if(y)return!1;if(A&&!Q)return!1;if(ly(j,t)&&Q)return!1;if(ly(j,_)&&(!Q||n&&Q&&!u))return!1;if(!f&&j.ctrlKey&&Q)return!1;if(!f&&j.type==="touchstart"&&j.touches?.length>1)return j.preventDefault(),!1;if(!F&&!n&&!J&&Q)return!1;if(!r&&(j.type==="mousedown"||j.type==="touchstart"))return!1;if(Array.isArray(r)&&!r.includes(j.button)&&j.type==="mousedown")return!1;let w=Array.isArray(r)&&r.includes(j.button)||!j.button||j.button<=1;return(!j.ctrlKey||Q)&&w}}function Dq({domNode:u,minZoom:l,maxZoom:f,translateExtent:r,viewport:n,onPanZoom:i,onPanZoomStart:y,onPanZoomEnd:t,onDraggingChange:_}){let c={isZoomingOrPanning:!1,usedRightMouseButton:!1,prevViewport:{x:0,y:0,zoom:0},mouseButton:0,timerId:void 0,panScrollTimeout:void 0,isPanScrolling:!1},A=u.getBoundingClientRect(),j=G_().scaleExtent([l,f]).translateExtent(r),F=sl(u).call(j);N({x:n.x,y:n.y,zoom:fy(n.zoom,l,f)},[[0,0],[A.width,A.height]],r);let J=F.on("wheel.zoom"),Q=F.on("dblclick.zoom");j.wheelDelta(Vq);function w(V,S){if(F)return new Promise((p)=>{j?.interpolate(S?.interpolate==="linear"?$0:Xi).transform(C5(F,S?.duration,S?.ease,()=>p(!0)),V)});return Promise.resolve(!1)}function L({noWheelClassName:V,noPanClassName:S,onPaneContextMenu:p,userSelectionActive:O,panOnScroll:m,panOnDrag:X,panOnScrollMode:v,panOnScrollSpeed:T,preventScrolling:Y,zoomOnPinch:k,zoomOnScroll:I,zoomOnDoubleClick:b,zoomActivationKeyPressed:o,lib:g,onTransformChange:x,connectionInProgress:lu,paneClickDistance:_u,selectionOnDrag:$u}){if(O&&!c.isZoomingOrPanning)U();let ju=m&&!o&&!O;j.clickDistance($u?1/0:!Zr(_u)||_u<0?0:_u);let zu=ju?EV({zoomPanValues:c,noWheelClassName:V,d3Selection:F,d3Zoom:j,panOnScrollMode:v,panOnScrollSpeed:T,zoomOnPinch:k,onPanZoomStart:y,onPanZoom:i,onPanZoomEnd:t}):ZV({noWheelClassName:V,preventScrolling:Y,d3ZoomHandler:J});if(F.on("wheel.zoom",zu,{passive:!1}),!O){let P=OV({zoomPanValues:c,onDraggingChange:_,onPanZoomStart:y});j.on("start",P);let e=HV({zoomPanValues:c,panOnDrag:X,onPaneContextMenu:!!p,onPanZoom:i,onTransformChange:x});j.on("zoom",e);let uu=BV({zoomPanValues:c,panOnDrag:X,panOnScroll:m,onPaneContextMenu:p,onPanZoomEnd:t,onDraggingChange:_});j.on("end",uu)}let Wu=VV({zoomActivationKeyPressed:o,panOnDrag:X,zoomOnScroll:I,panOnScroll:m,zoomOnDoubleClick:b,zoomOnPinch:k,userSelectionActive:O,noPanClassName:S,noWheelClassName:V,lib:g,connectionInProgress:lu});if(j.filter(Wu),b)F.on("dblclick.zoom",Q);else F.on("dblclick.zoom",null)}function U(){j.on("zoom",null)}async function N(V,S,p){let O=P5(V),m=j?.constrain()(O,S,p);if(m)await w(m);return new Promise((X)=>X(m))}async function q(V,S){let p=P5(V);return await w(p,S),new Promise((O)=>O(p))}function W(V){if(F){let S=P5(V),p=F.property("__zoom");if(p.k!==V.zoom||p.x!==V.x||p.y!==V.y)j?.transform(F,S,null,{sync:!0})}}function z(){let V=F?K_(F.node()):{x:0,y:0,k:1};return{x:V.x,y:V.y,zoom:V.k}}function Z(V,S){if(F)return new Promise((p)=>{j?.interpolate(S?.interpolate==="linear"?$0:Xi).scaleTo(C5(F,S?.duration,S?.ease,()=>p(!0)),V)});return Promise.resolve(!1)}function H(V,S){if(F)return new Promise((p)=>{j?.interpolate(S?.interpolate==="linear"?$0:Xi).scaleBy(C5(F,S?.duration,S?.ease,()=>p(!0)),V)});return Promise.resolve(!1)}function E(V){j?.scaleExtent(V)}function D(V){j?.translateExtent(V)}function h(V){let S=!Zr(V)||V<0?0:V;j?.clickDistance(S)}return{update:L,destroy:U,setViewport:q,setViewportConstrained:N,getViewport:z,scaleTo:Z,scaleBy:H,setScaleExtent:E,setTranslateExtent:D,syncViewport:W,setClickDistance:h}}var Pn;(function(u){u.Line="line",u.Handle="handle"})(Pn||(Pn={}));function DV({width:u,prevWidth:l,height:f,prevHeight:r,affectsX:n,affectsY:i}){let y=u-l,t=f-r,_=[y>0?1:y<0?-1:0,t>0?1:t<0?-1:0];if(y&&n)_[0]=_[0]*-1;if(t&&i)_[1]=_[1]*-1;return _}function nq(u){let l=u.includes("right")||u.includes("left"),f=u.includes("bottom")||u.includes("top"),r=u.includes("left"),n=u.includes("top");return{isHorizontal:l,isVertical:f,affectsX:r,affectsY:n}}function Xn(u,l){return Math.max(0,l-u)}function Sn(u,l){return Math.max(0,u-l)}function bc(u,l,f){return Math.max(0,l-u,u-f)}function iq(u,l){return u?!l:l}function XV(u,l,f,r,n,i,y,t){let{affectsX:_,affectsY:c}=l,{isHorizontal:A,isVertical:j}=l,F=A&&j,{xSnapped:J,ySnapped:Q}=f,{minWidth:w,maxWidth:L,minHeight:U,maxHeight:N}=r,{x:q,y:W,width:z,height:Z,aspectRatio:H}=u,E=Math.floor(A?J-u.pointerX:0),D=Math.floor(j?Q-u.pointerY:0),h=z+(_?-E:E),V=Z+(c?-D:D),S=-i[0]*z,p=-i[1]*Z,O=bc(h,w,L),m=bc(V,U,N);if(y){let T=0,Y=0;if(_&&E<0)T=Xn(q+E+S,y[0][0]);else if(!_&&E>0)T=Sn(q+h+S,y[1][0]);if(c&&D<0)Y=Xn(W+D+p,y[0][1]);else if(!c&&D>0)Y=Sn(W+V+p,y[1][1]);O=Math.max(O,T),m=Math.max(m,Y)}if(t){let T=0,Y=0;if(_&&E>0)T=Sn(q+E,t[0][0]);else if(!_&&E<0)T=Xn(q+h,t[1][0]);if(c&&D>0)Y=Sn(W+D,t[0][1]);else if(!c&&D<0)Y=Xn(W+V,t[1][1]);O=Math.max(O,T),m=Math.max(m,Y)}if(n){if(A){let T=bc(h/H,U,N)*H;if(O=Math.max(O,T),y){let Y=0;if(!_&&!c||_&&!c&&F)Y=Sn(W+p+h/H,y[1][1])*H;else Y=Xn(W+p+(_?E:-E)/H,y[0][1])*H;O=Math.max(O,Y)}if(t){let Y=0;if(!_&&!c||_&&!c&&F)Y=Xn(W+h/H,t[1][1])*H;else Y=Sn(W+(_?E:-E)/H,t[0][1])*H;O=Math.max(O,Y)}}if(j){let T=bc(V*H,w,L)/H;if(m=Math.max(m,T),y){let Y=0;if(!_&&!c||c&&!_&&F)Y=Sn(q+V*H+S,y[1][0])/H;else Y=Xn(q+(c?D:-D)*H+S,y[0][0])/H;m=Math.max(m,Y)}if(t){let Y=0;if(!_&&!c||c&&!_&&F)Y=Xn(q+V*H,t[1][0])/H;else Y=Sn(q+(c?D:-D)*H,t[0][0])/H;m=Math.max(m,Y)}}}if(D=D+(D<0?m:-m),E=E+(E<0?O:-O),n)if(F)if(h>V*H)D=(iq(_,c)?-E:E)/H;else E=(iq(_,c)?-D:D)*H;else if(A)D=E/H,c=_;else E=D*H,_=c;let X=_?q+E:q,v=c?W+D:W;return{width:z+(_?-E:E),height:Z+(c?-D:D),x:i[0]*E*(!_?1:-1)+X,y:i[1]*D*(!c?1:-1)+v}}var Xq={width:0,height:0,x:0,y:0},SV={...Xq,pointerX:0,pointerY:0,aspectRatio:1};function YV(u){return[[0,0],[u.measured.width,u.measured.height]]}function pV(u,l,f){let r=l.position.x+u.position.x,n=l.position.y+u.position.y,i=u.measured.width??0,y=u.measured.height??0,t=f[0]*i,_=f[1]*y;return[[r-t,n-_],[r+i-t,n+y-_]]}function Sq({domNode:u,nodeId:l,getStoreItems:f,onChange:r,onEnd:n}){let i=sl(u),y={controlDirection:nq("bottom-right"),boundaries:{minWidth:0,minHeight:0,maxWidth:Number.MAX_VALUE,maxHeight:Number.MAX_VALUE},resizeDirection:void 0,keepAspectRatio:!1};function t({controlPosition:c,boundaries:A,keepAspectRatio:j,resizeDirection:F,onResizeStart:J,onResize:Q,onResizeEnd:w,shouldResize:L}){let U={...Xq},N={...SV};y={boundaries:A,resizeDirection:F,keepAspectRatio:j,controlDirection:nq(c)};let q=void 0,W=null,z=[],Z=void 0,H=void 0,E=void 0,D=!1,h=i_().on("start",(V)=>{let{nodeLookup:S,transform:p,snapGrid:O,snapToGrid:m,nodeOrigin:X,paneDomNode:v}=f();if(q=S.get(l),!q)return;W=v?.getBoundingClientRect()??null;let{xSnapped:T,ySnapped:Y}=z_(V.sourceEvent,{transform:p,snapGrid:O,snapToGrid:m,containerBounds:W});if(U={width:q.measured.width??0,height:q.measured.height??0,x:q.position.x??0,y:q.position.y??0},N={...U,pointerX:T,pointerY:Y,aspectRatio:U.width/U.height},Z=void 0,q.parentId&&(q.extent==="parent"||q.expandParent))Z=S.get(q.parentId),H=Z&&q.extent==="parent"?YV(Z):void 0;z=[],E=void 0;for(let[k,I]of S)if(I.parentId===l){if(z.push({id:k,position:{...I.position},extent:I.extent}),I.extent==="parent"||I.expandParent){let b=pV(I,q,I.origin??X);if(E)E=[[Math.min(b[0][0],E[0][0]),Math.min(b[0][1],E[0][1])],[Math.max(b[1][0],E[1][0]),Math.max(b[1][1],E[1][1])]];else E=b}}J?.(V,{...U})}).on("drag",(V)=>{let{transform:S,snapGrid:p,snapToGrid:O,nodeOrigin:m}=f(),X=z_(V.sourceEvent,{transform:S,snapGrid:p,snapToGrid:O,containerBounds:W}),v=[];if(!q)return;let{x:T,y:Y,width:k,height:I}=U,b={},o=q.origin??m,{width:g,height:x,x:lu,y:_u}=XV(N,y.controlDirection,X,y.boundaries,y.keepAspectRatio,o,H,E),$u=g!==k,ju=x!==I,zu=lu!==T&&$u,Wu=_u!==Y&&ju;if(!zu&&!Wu&&!$u&&!ju)return;if(zu||Wu||o[0]===1||o[1]===1){if(b.x=zu?lu:U.x,b.y=Wu?_u:U.y,U.x=b.x,U.y=b.y,z.length>0){let Ku=lu-T,s=_u-Y;for(let Nu of z)Nu.position={x:Nu.position.x-Ku+o[0]*(g-k),y:Nu.position.y-s+o[1]*(x-I)},v.push(Nu)}}if($u||ju)b.width=$u&&(!y.resizeDirection||y.resizeDirection==="horizontal")?g:U.width,b.height=ju&&(!y.resizeDirection||y.resizeDirection==="vertical")?x:U.height,U.width=b.width,U.height=b.height;if(Z&&q.expandParent){let Ku=o[0]*(b.width??0);if(b.x&&b.x{if(!D)return;w?.(V,{...U}),n?.({...U}),D=!1});i.call(h)}function _(){i.on(".drag",null)}return{update:t,destroy:_}}var kq=Pu(Jl(),1),Iq=Pu(xq(),1);var hq=(u)=>{let l,f=new Set,r=(A,j)=>{let F=typeof A==="function"?A(l):A;if(!Object.is(F,l)){let J=l;l=(j!=null?j:typeof F!=="object"||F===null)?F:Object.assign({},l,F),f.forEach((Q)=>Q(l,J))}},n=()=>l,_={setState:r,getState:n,getInitialState:()=>c,subscribe:(A)=>{return f.add(A),()=>f.delete(A)},destroy:()=>{f.clear()}},c=l=u(r,n,_);return _},bq=(u)=>u?hq(u):hq;var{useDebugValue:uD}=kq.default,{useSyncExternalStoreWithSelector:lD}=Iq.default,fD=(u)=>u;function j9(u,l=fD,f){let r=lD(u.subscribe,u.getState,u.getServerState||u.getInitialState,l,f);return uD(r),r}var vq=(u,l)=>{let f=bq(u),r=(n,i=l)=>j9(f,n,i);return Object.assign(r,f),r},gq=(u,l)=>u?vq(u,l):vq;function Gl(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[r,n]of u)if(!Object.is(n,l.get(r)))return!1;return!0}if(u instanceof Set&&l instanceof Set){if(u.size!==l.size)return!1;for(let r of u)if(!l.has(r))return!1;return!0}let f=Object.keys(u);if(f.length!==Object.keys(l).length)return!1;for(let r of f)if(!Object.prototype.hasOwnProperty.call(l,r)||!Object.is(u[r],l[r]))return!1;return!0}var rD=Pu(WA(),1),_6=yu.createContext(null),nD=_6.Provider,qW=Ur.error001();function fl(u,l){let f=yu.useContext(_6);if(f===null)throw Error(qW);return j9(f,u,l)}function El(){let u=yu.useContext(_6);if(u===null)throw Error(qW);return yu.useMemo(()=>({getState:u.getState,setState:u.setState,subscribe:u.subscribe}),[u])}var sq={display:"none"},iD={position:"absolute",width:1,height:1,margin:-1,border:0,padding:0,overflow:"hidden",clip:"rect(0px, 0px, 0px, 0px)",clipPath:"inset(100%)"},WW="react-flow__node-desc",wW="react-flow__edge-desc",yD="react-flow__aria-live",tD=(u)=>u.ariaLiveMessage,_D=(u)=>u.ariaLabelConfig;function $D({rfId:u}){let l=fl(tD);return ru.jsx("div",{id:`${yD}-${u}`,"aria-live":"assertive","aria-atomic":"true",style:iD,children:l})}function cD({rfId:u,disableKeyboardA11y:l}){let f=fl(_D);return ru.jsxs(ru.Fragment,{children:[ru.jsx("div",{id:`${WW}-${u}`,style:sq,children:l?f["node.a11yDescription.default"]:f["node.a11yDescription.keyboardDisabled"]}),ru.jsx("div",{id:`${wW}-${u}`,style:sq,children:f["edge.a11yDescription.default"]}),!l&&ru.jsx($D,{rfId:u})]})}var $6=yu.forwardRef(({position:u="top-left",children:l,className:f,style:r,...n},i)=>{let y=`${u}`.split("-");return ru.jsx("div",{className:Sl(["react-flow__panel",f,...y]),style:r,ref:i,...n,children:l})});$6.displayName="Panel";function AD({proOptions:u,position:l="bottom-right"}){if(u?.hideAttribution)return null;return ru.jsx($6,{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:ru.jsx("a",{href:"https://reactflow.dev",target:"_blank",rel:"noopener noreferrer","aria-label":"React Flow attribution",children:"React Flow"})})}var jD=(u)=>{let l=[],f=[];for(let[,r]of u.nodeLookup)if(r.selected)l.push(r.internals.userNode);for(let[,r]of u.edgeLookup)if(r.selected)f.push(r);return{selectedNodes:l,selectedEdges:f}},i6=(u)=>u.id;function FD(u,l){return Gl(u.selectedNodes.map(i6),l.selectedNodes.map(i6))&&Gl(u.selectedEdges.map(i6),l.selectedEdges.map(i6))}function UD({onSelectionChange:u}){let l=El(),{selectedNodes:f,selectedEdges:r}=fl(jD,FD);return yu.useEffect(()=>{let n={nodes:f,edges:r};u?.(n),l.getState().onSelectionChangeHandlers.forEach((i)=>i(n))},[f,r,u]),null}var JD=(u)=>!!u.onSelectionChangeHandlers;function QD({onSelectionChange:u}){let l=fl(JD);if(u||l)return ru.jsx(UD,{onSelectionChange:u});return null}var J9=typeof window<"u"?yu.useLayoutEffect:yu.useEffect,LW=[0,0],ND={x:0,y:0,zoom:1},qD=["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"],aq=[...qD,"rfId"],WD=(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}),oq={translateExtent:ny,nodeOrigin:LW,minZoom:0.5,maxZoom:2,elementsSelectable:!0,noPanClassName:"nopan",rfId:"1"};function wD(u){let{setNodes:l,setEdges:f,setMinZoom:r,setMaxZoom:n,setTranslateExtent:i,setNodeExtent:y,reset:t,setDefaultNodesAndEdges:_}=fl(WD,Gl),c=El();J9(()=>{return _(u.defaultNodes,u.defaultEdges),()=>{A.current=oq,t()}},[]);let A=yu.useRef(oq);return J9(()=>{for(let j of aq){let F=u[j],J=A.current[j];if(F===J)continue;if(typeof u[j]>"u")continue;if(j==="nodes")l(F);else if(j==="edges")f(F);else if(j==="minZoom")r(F);else if(j==="maxZoom")n(F);else if(j==="translateExtent")i(F);else if(j==="nodeExtent")y(F);else if(j==="ariaLabelConfig")c.setState({ariaLabelConfig:Fq(F)});else if(j==="fitView")c.setState({fitViewQueued:F});else if(j==="fitViewOptions")c.setState({fitViewOptions:F});else c.setState({[j]:F})}A.current=u},aq.map((j)=>u[j])),null}function dq(){if(typeof window>"u"||!window.matchMedia)return null;return window.matchMedia("(prefers-color-scheme: dark)")}function LD(u){let[l,f]=yu.useState(u==="system"?null:u);return yu.useEffect(()=>{if(u!=="system"){f(u);return}let r=dq(),n=()=>f(r?.matches?"dark":"light");return n(),r?.addEventListener("change",n),()=>{r?.removeEventListener("change",n)}},[u]),l!==null?l:dq()?.matches?"dark":"light"}var eq=typeof document<"u"?document:null;function H_(u=null,l={target:eq,actInsideInputWithModifier:!0}){let[f,r]=yu.useState(!1),n=yu.useRef(!1),i=yu.useRef(new Set([])),[y,t]=yu.useMemo(()=>{if(u!==null){let c=(Array.isArray(u)?u:[u]).filter((j)=>typeof j==="string").map((j)=>j.replace("+",` +`;function j2({title:u,eyebrow:l,actions:f,children:r,className:n,loading:i}){return Vu("section",{className:`panel ${n||""}`},Vu("div",{className:"panel-head"},Vu("div",null,l?Vu("p",{className:"panel-eyebrow"},l):null,Vu(rl,{title:u,loading:i})),f?Vu("div",{className:"panel-actions"},f):null),Vu("div",{className:"panel-body"},r))}function RO({title:u,data:l,onOpen:f,testId:r}){return Vu("button",{type:"button",className:"ghost-btn","data-testid":r,onClick:()=>f(u,l)},"查看原始JSON")}function hO({title:u,text:l}){return Vu("div",{className:"empty-state"},Vu("strong",null,u),Vu("span",null,l))}function dQ(u){return u?.runtime&&typeof u.runtime==="object"&&!Array.isArray(u.runtime)?u.runtime:{}}function eQ(u){return u?.backend&&typeof u.backend==="object"&&!Array.isArray(u.backend)?u.backend:{}}function uN(u){return u?.repository&&typeof u.repository==="object"&&!Array.isArray(u.repository)?u.repository:{}}function xO(u){return u.filter((f)=>f?.id==="filebrowser"||String(f?.id||"").startsWith("filebrowser-")).sort((f,r)=>{let n=(i)=>i.providerId==="D518"?0:i.providerId==="D601"?1:i.id==="filebrowser"?2:3;return n(f)-n(r)||String(f.id).localeCompare(String(r.id))})}function bO(u){if(u?.providerId==="D518")return"D518";return u?.providerId||u?.name||u?.id||"Unknown"}function vO(u,l,f="/"){let r=f.startsWith("/")?f:`/${f}`;return`${u}/microservices/${encodeURIComponent(l)}/proxy${r}`}function kO(u,l){return`${u}/microservices/${encodeURIComponent(l)}/health`}async function IO(u,l=16000){let f=new AbortController,r=setTimeout(()=>f.abort(),l);try{return await Eu(u,{signal:f.signal,failureFields:[!1]})}finally{clearTimeout(r)}}function lN(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 u3(u){return u?.status==="OK"||u?.ok===!0}function gO({service:u,active:l,health:f,onSelect:r,onRaw:n}){let i=dQ(u),t=eQ(u),y=uN(u),c=i.container||{},$=u3(f?.body);return Vu("button",{type:"button",className:`filebrowser-target-card ${l?"active":""}`,"data-testid":`filebrowser-target-card-${u.id}`,onClick:r},Vu("span",{className:`status-badge ${$?"ok":i.providerStatus==="online"?"running":"warn"}`},$?"Health OK":i.providerStatus||"unknown"),Vu("strong",null,u.name||u.id),Vu("span",null,lN(u)),Vu("code",null,`${t.nodeBindHost||"--"}:${t.nodePort||"--"}`),Vu("small",null,c.name?`${c.name} / ${c.state||"--"}`:`${y.composeService||"--"}`),Vu("span",{className:"filebrowser-card-raw",onClick:(A)=>{A.stopPropagation(),n(`${u.name} service`,u)}},"JSON"))}function fN(u){try{return u?.contentDocument||u?.contentWindow?.document||null}catch{return null}}function U2(u){let l=fN(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!==F2)f.textContent=F2;return!0}function sO(u,l){let f=URL.createObjectURL(u),r=document.createElement("a");r.href=f,r.download=l,document.body.appendChild(r),r.click(),r.remove(),setTimeout(()=>URL.revokeObjectURL(f),2000)}function aO(u,l){let f=fN(u);if(f===null||f.documentElement===null)throw Error("无法访问 File Browser iframe 文档");U2(u);let r=Math.max(640,Math.ceil(u.clientWidth||f.documentElement.clientWidth||1280)),n=Math.max(480,Math.ceil(u.clientHeight||f.documentElement.clientHeight||720)),i=f.documentElement.cloneNode(!0);i.querySelectorAll("script, style, link[rel='stylesheet'], link[rel='preload'], link[rel='icon']").forEach((A)=>A.remove()),i.querySelectorAll("img").forEach((A)=>{A.removeAttribute("src"),A.removeAttribute("srcset")});let t=i.querySelector("head");if(t===null)t=f.createElement("head"),i.insertBefore(t,i.firstChild);let y=f.createElement("style");y.textContent=`${F2} +html,body{width:${r}px!important;min-height:${n}px!important;overflow:hidden!important;}`,t.appendChild(y);let c=new XMLSerializer().serializeToString(i),$=`${c}`;sO(new Blob([$],{type:"image/svg+xml;charset=utf-8"}),l.replace(/\.png$/i,".svg"))}function rN({microservices:u,onRaw:l,apiBaseUrl:f="/api"}){let r=xO(Array.isArray(u)?u:[]),n=new URLSearchParams(window.location.search).get("target")||"",i=n==="filebrowser-d518"?"filebrowser":n,t=r.some((Z)=>Z.id===i)?i:r[0]?.id||"",[y,c]=A2(t),[$,A]=A2({loading:!1,refreshedAt:null,health:{},error:""}),[j,F]=A2({exporting:!1,message:"",error:""}),J=MO(null),Q=r.find((Z)=>Z.id===y)||r[0]||null,W=dQ(Q),L=eQ(Q),U=uN(Q),q=Q?$.health[Q.id]:null,N=Q?vO(f,Q.id,"/"):"about:blank";$2(()=>{if(r.length===0)return;if(!y||!r.some((Z)=>Z.id===y))c(r[0].id)},[r.map((Z)=>Z.id).join(",")]),$2(()=>{let Z=0,H=setInterval(()=>{if(Z+=1,U2(J.current)||Z>=24)clearInterval(H)},500);return()=>clearInterval(H)},[N]),$2(()=>{if(r.length===0)return;let Z=!1;async function H(){A((S)=>({...S,loading:!0,error:""}));let V=await Promise.all(r.map(async(S)=>{try{let B=await IO(kO(f,S.id));return[S.id,{ok:!0,body:B}]}catch(B){return[S.id,{ok:!1,error:Ou(B,"File Browser health failed")}]}}));if(Z)return;A({loading:!1,refreshedAt:new Date().toISOString(),health:Object.fromEntries(V),error:""})}H();let E=setInterval(H,30000);return()=>{Z=!0,clearInterval(E)}},[r.map((Z)=>`${Z.id}:${Z.runtime?.providerStatus||""}`).join(","),f]);function w(Z){c(Z);let H=new URL(window.location.href);H.searchParams.set("target",Z),window.history.replaceState({},"",`${H.pathname}${H.search}`)}async function G(){if(j.exporting)return;F({exporting:!0,message:"",error:""});try{let Z=new Date().toISOString().replace(/[-:.TZ]/g,"").slice(0,14);await aO(J.current,`unidesk-filebrowser-${Q?.id||"target"}-${Z}.png`),F({exporting:!1,message:"截图已导出",error:""})}catch(Z){F({exporting:!1,message:"",error:Ou(Z,"截图导出失败")})}}if(r.length===0)return Vu(hO,{title:"File Browser 未登记",text:"请在 config.json 的 microservices 中登记 id=filebrowser 或 filebrowser-* 用户服务"});return Vu("div",{className:"filebrowser-page","data-testid":"filebrowser-page"},$.error?Vu(nl,{error:$.error,wide:!0}):null,Vu(j2,{title:"文件管理器",eyebrow:"File Browser / Host Files",loading:$.loading,actions:Vu("div",{className:"panel-actions"},Q?Vu("button",{type:"button",className:"ghost-btn",onClick:G,disabled:j.exporting,"data-testid":"filebrowser-export-screenshot"},j.exporting?"导出中...":"导出截图"):null,Q?Vu("a",{className:"ghost-btn",href:N,target:"_blank",rel:"noreferrer"},"新窗口打开"):null,Q?Vu(RO,{title:"File Browser 当前目标",data:{service:Q,health:q},onOpen:l,testId:"raw-filebrowser-active"}):null)},Vu("div",{className:"filebrowser-hero"},Vu("div",null,Vu("span",{className:`status-badge ${u3(q?.body)?"ok":"warn"}`},u3(q?.body)?"Health OK":"Health Pending"),Vu("h3",null,Q?.name||"File Browser"),Vu("p",{className:"muted paragraph"},Q?.description||"通过 UniDesk 登录态代理访问,不开放 File Browser 公网端口。"),j.error?Vu("p",{className:"filebrowser-shot-error"},j.error):null,j.message?Vu("p",{className:"filebrowser-shot-ok"},j.message):null),Vu("div",{className:"microservice-ref-card"},Vu("span",null,"Provider"),Vu("strong",null,Q?.providerId||"--"),Vu("code",null,W.providerName||Q?.providerId||"--")),Vu("div",{className:"microservice-ref-card"},Vu("span",null,"Private Backend"),Vu("strong",null,`${L.nodeBindHost||"--"}:${L.nodePort||"--"}`),Vu("code",null,L.nodeBaseUrl||"--")),Vu("div",{className:"microservice-ref-card"},Vu("span",null,"Image"),Vu("strong",null,U.dockerfile||"filebrowser/filebrowser:v2.63.3"),Vu("code",null,U.commitId||"--")),Vu("div",{className:"microservice-ref-card"},Vu("span",null,"Mount"),Vu("strong",null,lN(Q)),Vu("code",null,Q?.providerId==="main-server"?"/root, /var, /home":"/home, /mnt/c, /mnt/d")))),Vu(j2,{title:"浏览目标",eyebrow:`${r.length} host targets`,loading:$.loading},Vu("div",{className:"filebrowser-target-grid"},r.map((Z)=>Vu(gO,{key:Z.id,service:Z,active:Z.id===Q?.id,health:$.health[Z.id],onSelect:()=>w(Z.id),onRaw:l})))),Vu(j2,{title:`${bO(Q)} 文件视图`,eyebrow:q?.body?`Health ${u3(q.body)?"OK":"UNKNOWN"} / ${$.refreshedAt?yl($.refreshedAt):"--"}`:"Embedded WebUI",className:"filebrowser-frame-panel"},Vu("div",{className:"filebrowser-frame-shell"},Vu("div",{className:"filebrowser-frame-toolbar"},Vu("span",null,"BaseURL"),Vu("code",null,`/api/microservices/${Q?.id||"filebrowser"}/proxy`),Vu("span",null,"Root"),Vu("code",null,"/srv"),Vu("span",{className:"filebrowser-compact-note"},"Compact layout injected")),Vu("iframe",{ref:J,key:N,title:`${Q?.name||"File Browser"} WebUI`,src:N,className:"filebrowser-frame","data-testid":"filebrowser-frame",onLoad:(Z)=>U2(Z.currentTarget),sandbox:"allow-downloads allow-forms allow-modals allow-same-origin allow-scripts"}))))}var n3=Cu(Fl(),1);var Uu=n3.default.createElement,{useEffect:oO}=n3.default,dO=n3.default.useState;function l3({status:u,children:l}){let f=String(u||"unknown").toLowerCase();return Uu("span",{className:`status-badge ${f}`},l||u||"unknown")}function S0({label:u,value:l,hint:f,tone:r}){return Uu("article",{className:`metric-card ${r||""}`},Uu("div",{className:"metric-label"},u),Uu("div",{className:"metric-value"},l),Uu("div",{className:"metric-hint"},f))}function f3({title:u,eyebrow:l,actions:f,children:r,className:n,loading:i}){return Uu("section",{className:`panel ${n||""}`},Uu("div",{className:"panel-head"},Uu("div",null,l?Uu("p",{className:"panel-eyebrow"},l):null,Uu(rl,{title:u,loading:i})),f?Uu("div",{className:"panel-actions"},f):null),Uu("div",{className:"panel-body"},r))}function r3({title:u,data:l,onOpen:f,testId:r}){return Uu("button",{type:"button",className:"ghost-btn","data-testid":r,onClick:()=>f(u,l)},"查看原始JSON")}function J2({title:u,text:l}){return Uu("div",{className:"empty-state"},Uu("strong",null,u),Uu("span",null,l))}function eO(u){return u?.runtime&&typeof u.runtime==="object"&&!Array.isArray(u.runtime)?u.runtime:{}}function uZ(u){return u?.backend&&typeof u.backend==="object"&&!Array.isArray(u.backend)?u.backend:{}}function lZ(u){return u?.repository&&typeof u.repository==="object"&&!Array.isArray(u.repository)?u.repository:{}}function Si(u,l){let f=u&&typeof u==="object"?u[l]:void 0;return Number.isFinite(Number(f))?String(f):"--"}function fZ(u){return(Array.isArray(u?.jobs)?u.jobs:[]).slice(0,40)}function rZ(u){return(Array.isArray(u?.drafts)?u.drafts:[]).slice(0,12)}function nN({microservices:u,onRaw:l,apiBaseUrl:f="/api"}){let r=u.find((Q)=>Q.id==="findjob")||null,[n,i]=dO({loading:!1,error:"",health:null,summary:null,jobs:null,drafts:null,refreshedAt:null});async function t(){if(!r)return;i((Q)=>({...Q,loading:!0,error:""}));try{let[Q,W,L,U]=await Promise.all([Eu(`${f}/microservices/findjob/health`),Eu(`${f}/microservices/findjob/proxy/api/summary`),Eu(`${f}/microservices/findjob/proxy/api/jobs?__unideskArrayLimit=jobs:40`),Eu(`${f}/microservices/findjob/proxy/api/drafts`)]);i({loading:!1,error:"",health:Q,summary:W,jobs:L,drafts:U,refreshedAt:new Date})}catch(Q){i((W)=>({...W,loading:!1,error:Ou(Q,"FindJob 加载失败")}))}}if(oO(()=>{t()},[r?.id,r?.runtime?.providerStatus]),!r)return Uu(J2,{title:"FindJob 未登记",text:"请在 config.json 的 microservices 中登记用户服务 id=findjob"});let y=eO(r),c=lZ(r),$=uZ(r),A=n.summary||{},j=fZ(n.jobs),F=rZ(n.drafts),J=n.jobs?._unidesk?.arrayLimits?.jobs;return Uu("div",{className:"findjob-page","data-testid":"findjob-page"},Uu(f3,{title:"FindJob 工作台",eyebrow:"D601 用户服务",loading:n.loading,actions:Uu("div",{className:"panel-actions"},Uu("button",{type:"button",className:"ghost-btn",onClick:t,disabled:n.loading,"data-testid":"findjob-refresh-button"},n.loading?"刷新中":"刷新"),Uu(r3,{title:"FindJob 用户服务",data:r,onOpen:l,testId:"raw-findjob-service"}))},Uu("div",{className:"findjob-hero"},Uu("div",null,Uu("div",{className:"node-version-line"},Uu(l3,{status:y.providerStatus==="online"?"online":"warn"},y.providerStatus||"unknown"),Uu("span",null,r.providerId),Uu("span",null,$.public?"公网暴露":"仅 UniDesk frontend 代理访问")),Uu("p",{className:"muted paragraph"},r.description)),Uu("div",{className:"microservice-ref-card"},Uu("span",null,"Repo"),Uu("strong",null,c.url||"--"),Uu("code",null,c.commitId||"--")),Uu("div",{className:"microservice-ref-card"},Uu("span",null,"D601 Docker"),Uu("strong",null,`${$.nodeBindHost||"--"}:${$.nodePort||"--"}`),Uu("code",null,`${c.composeFile||"--"} / ${c.composeService||"--"}`))),Uu(nl,{error:n.error,wide:!0})),Uu("div",{className:"findjob-grid"},Uu(f3,{title:"岗位指标",eyebrow:n.refreshedAt?`Updated ${yl(n.refreshedAt)}`:"Summary",loading:n.loading},Uu("div",{className:"metric-grid"},Uu(S0,{label:"岗位总量",value:Si(A,"totalJobs"),hint:"tracked jobs",tone:"ok"}),Uu(S0,{label:"原始岗位",value:Si(A,"rawJobs"),hint:"raw queue"}),Uu(S0,{label:"已验证",value:Si(A,"verifiedJobs"),hint:"verified set"}),Uu(S0,{label:"优先处理",value:Si(A,"prioritizedJobs"),hint:"prioritized"}),Uu(S0,{label:"过期",value:Si(A,"staleJobs"),hint:"stale jobs",tone:"warn"}),Uu(S0,{label:"无效",value:Si(A,"invalidJobs"),hint:"invalid jobs",tone:"warn"}),Uu(S0,{label:"上海",value:Si(A,"shanghaiJobs"),hint:"city filter"}),Uu(S0,{label:"Health",value:n.health?.ok?"OK":"--",hint:"D601 /api/health"})),Uu("div",{className:"panel-actions inline-actions"},Uu(r3,{title:"FindJob Summary",data:A,onOpen:l,testId:"raw-findjob-summary"}))),Uu(f3,{title:"近期岗位",eyebrow:J?`${J.returnedLength}/${J.originalLength} Preview`:`${j.length} Preview`,loading:n.loading},j.length===0?Uu(J2,{title:"暂无岗位预览",text:"等待 D601 findjob backend 返回 /api/jobs"}):Uu("div",{className:"table-wrap findjob-job-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("th",null,"截止"),Uu("th",null,"证据"))),Uu("tbody",null,j.map((Q)=>Uu("tr",{key:Q.id},Uu("td",null,Uu(l3,{status:String(Q.priority||"").toLowerCase()||"unknown"},Q.priority||"--")),Uu("td",null,Uu(l3,{status:String(Q.status||"").toLowerCase()||"unknown"},Q.status||"--")),Uu("td",null,Q.organization_name||"--",Uu("code",null,Q.id||"--")),Uu("td",null,Q.display_title||Q.title||"--"),Uu("td",null,Q.display_city||Q.city||"--"),Uu("td",null,Q.workflow_stage||"--"),Uu("td",null,Q.deadline||"--"),Uu("td",null,Q.evidence_url?Uu("a",{href:Q.evidence_url,target:"_blank",rel:"noreferrer"},"打开"):Uu("span",{className:"muted"},"无"))))))),Uu("div",{className:"panel-actions inline-actions"},Uu(r3,{title:"FindJob Jobs Preview",data:n.jobs,onOpen:l,testId:"raw-findjob-jobs"}))),Uu(f3,{title:"草稿与报告",eyebrow:`${F.length} Drafts`,loading:n.loading},F.length===0?Uu(J2,{title:"暂无草稿",text:"D601 findjob backend 未返回 drafts"}):Uu("div",{className:"draft-list"},F.map((Q)=>Uu("article",{key:Q.id,className:"draft-card"},Uu("div",{className:"node-card-head"},Uu("strong",null,Q.id),Uu(l3,{status:Q.status},Q.status||"--")),Uu("div",{className:"docker-meta compact"},Uu("span",null,Q.workflow_stage||"--"),Uu("span",null,`jobs ${Q.counts?.jobs??0}`),Uu("span",null,`reports ${Q.counts?.reports??0}`)),Uu("span",null,Q.latestReportPath||"暂无报告"),Uu("code",null,wu(Q.updated_at||Q.updatedAt))))),Uu("div",{className:"panel-actions inline-actions"},Uu(r3,{title:"FindJob Drafts",data:n.drafts,onOpen:l,testId:"raw-findjob-drafts"})))))}var uc=Cu(Fl(),1);var R=uc.default.createElement,{useEffect:nZ}=uc.default,Q2=uc.default.useState;function o1(u){let l=Number(u);return Number.isFinite(l)?`${Math.max(0,Math.min(100,l)).toFixed(1)}%`:"--"}function q2(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 w2(u,l=2){let f=Number(u);if(!Number.isFinite(f))return u===!1?"false":u===!0?"true":"--";let r=Math.abs(f);if(Number.isInteger(f)||r>=1000)return f.toLocaleString("zh-CN",{maximumFractionDigits:0});if(r>=1)return f.toLocaleString("zh-CN",{maximumFractionDigits:l});return f.toLocaleString("zh-CN",{maximumFractionDigits:Math.max(l,6)})}function e1(u){if(u===null||u===void 0||u==="")return"--";if(typeof u==="boolean")return u?"true":"false";if(typeof u==="number")return w2(u,4);if(Array.isArray(u))return u.map((l)=>e1(l)).join(" x ");if(typeof u==="object")return"已上报";return String(u)}function i3(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 t3(u){return u.replace(/[^a-zA-Z0-9_-]/g,"-")}function sf(u){return u&&typeof u==="object"&&!Array.isArray(u)?u:{}}function d1({status:u,children:l}){let f=String(u||"unknown").toLowerCase();return R("span",{className:`status-badge ${f}`},l||u||"unknown")}function X0({label:u,value:l,hint:f,tone:r}){return R("article",{className:`metric-card ${r||""}`},R("div",{className:"metric-label"},u),R("div",{className:"metric-value"},l),R("div",{className:"metric-hint"},f))}function N2({title:u,eyebrow:l,actions:f,children:r,className:n,loading:i}){return R("section",{className:`panel ${n||""}`},R("div",{className:"panel-head"},R("div",null,l?R("p",{className:"panel-eyebrow"},l):null,R(rl,{title:u,loading:i})),f?R("div",{className:"panel-actions"},f):null),R("div",{className:"panel-body"},r))}function et({title:u,data:l,onOpen:f,testId:r}){return R("button",{type:"button",className:"ghost-btn","data-testid":r,onClick:(n)=>{n?.stopPropagation?.(),f(u,l)}},"查看原始JSON")}function hn({title:u,text:l}){return R("div",{className:"empty-state"},R("strong",null,u),R("span",null,l))}function iZ(u){return u?.runtime&&typeof u.runtime==="object"&&!Array.isArray(u.runtime)?u.runtime:{}}function tZ(u){return u?.backend&&typeof u.backend==="object"&&!Array.isArray(u.backend)?u.backend:{}}function yZ(u){return u?.repository&&typeof u.repository==="object"&&!Array.isArray(u.repository)?u.repository:{}}function cZ(u){return u?.counts&&typeof u.counts==="object"&&!Array.isArray(u.counts)?u.counts:{}}function _Z(u){return Array.isArray(u?.jobs)?u.jobs.slice(0,240):[]}function $Z(u){return Array.isArray(u?.projects)?u.projects.slice(0,1000):[]}function y3(u){return Array.isArray(u?.projects)?u.projects:[]}function AZ(u,l){if(Array.isArray(l?.gpu))return l.gpu;if(Array.isArray(u?.gpu))return u.gpu;return[]}function Jr(u,l){return`${u}/microservices/met-nonlinear/proxy${l}`}function iN(u){return u.startedAt&&u.finishedAt?q2((Date.parse(u.finishedAt)-Date.parse(u.startedAt))/1000):"--"}function jZ(u){let l=u.progress||{};if(l.etaSeconds!==null&&l.etaSeconds!==void 0&&l.etaSeconds!==""){let t=Number(l.etaSeconds);if(Number.isFinite(t))return Math.max(0,t)}let f=Number(l.currentEpoch),r=Number(l.epochTarget??u.epochTarget),n=Date.parse(u.startedAt||"");if(!Number.isFinite(f)||f<=0||!Number.isFinite(r)||r<=f||!Number.isFinite(n))return null;let i=Math.max(0,(Date.now()-n)/1000);if(i<=0)return null;return Math.max(0,i/f*(r-f))}function tN(u){let l=u.progress||{},f=Number(l.epochPerHour);if(Number.isFinite(f)&&f>0)return f;let r=Date.parse(u.startedAt||""),n=["succeeded","failed","canceled"].includes(u.status)?Date.parse(u.finishedAt||""):Date.now();if(!Number.isFinite(r)||!Number.isFinite(n)||n<=r)return null;let i=Number(l.currentEpoch??u.epochTarget);if(!Number.isFinite(i)||i<=0)return null;return i/((n-r)/3600000)}function yN(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 cN(u,l,f){return{name:u,path:l,depth:f,count:0,children:[],project:null}}function FZ(u){let l=cN("","",-1);for(let r of u){let i=String(r?.projectPath||"").replace(/\\/g,"/").split("/").filter(Boolean);if(i.length===0)continue;let t=l,y=[];for(let[c,$]of i.entries()){y.push($);let A=y.join("/"),j=t.children.find((F)=>F.path===A);if(!j)j=cN($,A,c),t.children.push(j);if(c===i.length-1)j.project=r;t=j}}let f=(r)=>{let n=r.children.reduce((i,t)=>i+f(t),0);return r.count=(r.project?1:0)+n,r.children.sort((i,t)=>{if(Boolean(i.project)!==Boolean(t.project))return i.project?1:-1;return i.name.localeCompare(t.name,"zh-CN",{numeric:!0,sensitivity:"base"})}),r.count};return f(l),l}function UZ(u){let l=sf(u.data);return sf(l.project).projectPath?sf(l.project):l}function JZ(u){return sf(sf(u.data).job)}function _N({microservices:u,onRaw:l,apiBaseUrl:f="/api"}){let r=u.find((C)=>C.id==="met-nonlinear")||null,[n,i]=Q2({loading:!1,actionBusy:!1,error:"",health:null,summary:null,queue:null,projects:null,history:null,images:null,refreshedAt:null}),[t,y]=Q2({loading:!1,error:"",kind:"",key:"",title:"",data:null}),[c,$]=Q2(()=>({activeTab:"projects",selectedProjects:{},expandedProjectDirs:{},sourceProject:"",forkCount:1,forkEpochs:200,forkPrefix:`ui_fork_${Date.now()}`,maxConcurrency:3,targetGpuName:"2080 Ti",actionMessage:""}));function A(C){$((e)=>({...e,...C}))}async function j(C=c.activeTab){if(!r)return;i((e)=>({...e,loading:!0,error:""}));try{let e=[["health",Eu(`${f}/microservices/met-nonlinear/health`)],["summary",Eu(Jr(f,"/api/summary"))]];if(C==="projects")e.push(["projectsRoot",Eu(Jr(f,"/api/projects?root=projects&limit=500"))]),e.push(["exProjectsRoot",Eu(Jr(f,"/api/projects?root=ex_projects&limit=500"))]);if(C==="current"||C==="completed"||C==="failed")e.push(["queue",Eu(Jr(f,"/api/queue"))]);if(C==="completed"||C==="failed")e.push(["history",Eu(Jr(f,"/api/history"))]);if(C==="gpu")e.push(["images",Eu(Jr(f,"/api/images"))]);let uu=Object.fromEntries(await Promise.all(e.map(async([s,qu])=>[s,await qu]))),Gu={loading:!1,actionBusy:!1,error:"",health:uu.health,summary:uu.summary,refreshedAt:new Date};if(uu.projectsRoot||uu.exProjectsRoot){let{projectsRoot:s,exProjectsRoot:qu}=uu;Gu.projects={ok:s?.ok!==!1&&qu?.ok!==!1,roots:[{root:"projects",count:y3(s).length},{root:"ex_projects",count:y3(qu).length}],projects:[...y3(s),...y3(qu)]}}if(uu.queue)Gu.queue=uu.queue;if(uu.history)Gu.history=uu.history;if(uu.images)Gu.images=uu.images;i((s)=>({...s,...Gu}))}catch(e){i((uu)=>({...uu,loading:!1,actionBusy:!1,error:Ou(e,"MET Nonlinear 加载失败")}))}}async function F(C,e){i((uu)=>({...uu,actionBusy:!0,error:""})),A({actionMessage:`${C}...`});try{let uu=await e();A({actionMessage:uu||`${C}完成`}),await j()}catch(uu){i((Gu)=>({...Gu,actionBusy:!1,error:Ou(uu,`${C}失败`)}))}}async function J(){await F("保存并发设置",async()=>{await Eu(Jr(f,"/api/queue/settings"),{method:"PUT",body:JSON.stringify({maxConcurrency:Number(c.maxConcurrency),targetGpuName:c.targetGpuName})})})}function Q(){return Object.entries(c.selectedProjects).filter(([,C])=>C).map(([C])=>C)}async function W(){let C=Q();if(C.length===0)throw Error("请先选择至少一个 project");await F("加入待启动队列",async()=>{await Eu(Jr(f,"/api/queue"),{method:"POST",body:JSON.stringify({projectPaths:C,maxConcurrency:Number(c.maxConcurrency),targetGpuName:c.targetGpuName,start:!1})}),A({activeTab:"current",selectedProjects:{}})})}async function L(){let C=c.sourceProject||X[0]?.projectPath;if(!C)throw Error("请先选择源 project");await F("Fork Project",async()=>{let e=await Eu(Jr(f,"/api/projects/fork"),{method:"POST",body:JSON.stringify({sourceProject:C,count:Number(c.forkCount),epochs:Number(c.forkEpochs),prefix:c.forkPrefix})}),uu=Array.isArray(e.projectPaths)?e.projectPaths:[],Gu=uu.reduce((s,qu)=>{return s[qu]=!0,s},{...c.selectedProjects});return A({selectedProjects:Gu}),`已 fork ${uu.length} 个 project,并已自动勾选;请确认后点击加入待启动队列。`})}async function U(){await F("启动队列",async()=>{await Eu(Jr(f,"/api/queue/start"),{method:"POST",body:JSON.stringify({maxConcurrency:Number(c.maxConcurrency),targetGpuName:c.targetGpuName})}),A({activeTab:"current"})})}async function q(C){await F("取消任务",async()=>{await Eu(Jr(f,`/api/jobs/${encodeURIComponent(C.id)}/cancel`),{method:"POST",body:JSON.stringify({})})})}async function N(C){let e=String(C?.projectPath||"");if(!e)return;y({loading:!0,error:"",kind:"project",key:e,title:e,data:null});try{let uu=await Eu(Jr(f,`/api/projects/config?path=${encodeURIComponent(e)}`));y({loading:!1,error:"",kind:"project",key:e,title:e,data:uu})}catch(uu){y({loading:!1,error:Ou(uu,"Project 详情加载失败"),kind:"project",key:e,title:e,data:null})}}async function w(C){let e=String(C?.id||"");if(!e)return;y({loading:!0,error:"",kind:"job",key:e,title:C.projectPath||e,data:null});try{let uu=await Eu(Jr(f,`/api/jobs/${encodeURIComponent(e)}`));y({loading:!1,error:"",kind:"job",key:e,title:uu?.job?.projectPath||C.projectPath||e,data:uu})}catch(uu){y({loading:!1,error:Ou(uu,"Job 详情加载失败"),kind:"job",key:e,title:C.projectPath||e,data:null})}}if(nZ(()=>{j(c.activeTab)},[r?.id,r?.runtime?.providerStatus,c.activeTab]),!r)return R(hn,{title:"MET Nonlinear 未登记",text:"请在 config.json 的 microservices 中登记用户服务 id=met-nonlinear"});let G=iZ(r),Z=yZ(r),H=tZ(r),E=cZ(n.queue?.queue||n.summary?.queue),V=AZ(n.health,n.queue),S=n.health?.targetGpu||n.summary?.targetGpu||V.find((C)=>String(C.name||"").includes("2080")),B=n.images?.mlImage||n.health?.image||{},D=_Z(n.queue),X=$Z(n.projects),O=FZ(X),Y=c.sourceProject||X[0]?.projectPath||"",p=D.filter((C)=>["staged","queued","running"].includes(C.status)),v=D.filter((C)=>C.status==="succeeded"),z=D.filter((C)=>["failed","canceled"].includes(C.status)),P=Array.isArray(n.history?.jobs)?n.history.jobs.slice(0,120):[],k=[{id:"projects",label:"项目库",count:X.length},{id:"current",label:"当前队列",count:p.length||Number(E.staged||0)+Number(E.queued||0)+Number(E.running||0)},{id:"completed",label:"已完成",count:v.length||Number(E.succeeded||0)},{id:"failed",label:"失败诊断",count:z.length||Number(E.failed||0)+Number(E.canceled||0)},{id:"gpu",label:"GPU/镜像",count:V.length}];function I(C,e){if(C.length===0)return R(hn,{title:e==="current"?"当前队列为空":"暂无记录",text:e==="current"?"从项目库选择或 fork project 后先加入待启动队列,再启动队列。":"终态任务会显示耗时、exit code 和失败诊断。"});return R("div",{className:"table-wrap met-job-table"},R("table",null,R("thead",null,R("tr",null,R("th",null,"状态"),R("th",null,"Project"),R("th",null,"Epoch"),R("th",null,"速度"),R("th",null,"ETA/耗时"),R("th",null,"GPU"),R("th",null,"Exit"),R("th",null,"更新时间"),R("th",null,"操作"))),R("tbody",null,C.map((uu)=>{let Gu=uu.progress||{},s=["staged","queued","running"].includes(uu.status),qu=t.kind==="job"&&t.key===uu.id;return R("tr",{key:uu.id,className:`met-click-row ${qu?"active":""}`,onClick:()=>w(uu),"data-testid":`met-job-row-${t3(uu.id)}`},R("td",null,R(d1,{status:uu.status},yN(uu.status))),R("td",null,R("button",{type:"button",className:"met-inline-link",onClick:(Zu)=>{Zu.stopPropagation(),w(uu)}},uu.projectPath),R("code",null,uu.id)),R("td",null,R("span",null,`${Gu.currentEpoch??"--"} / ${Gu.epochTarget??uu.epochTarget??"--"}`),R("div",{className:"met-progress"},R("span",{style:{width:o1(Gu.progressPercent)}}))),R("td",null,R("strong",null,i3(tN(uu)))),R("td",null,uu.status==="succeeded"||uu.status==="failed"||uu.status==="canceled"?iN(uu):uu.status==="running"?`ETA ${q2(jZ(uu))}`:"--"),R("td",null,uu.gpuName||"--"),R("td",null,uu.exitCode??"--"),R("td",null,wu(uu.updatedAt)),R("td",null,s?R("button",{type:"button",className:"ghost-btn mini",onClick:(Zu)=>{Zu.stopPropagation(),q(uu)},disabled:n.actionBusy},"取消"):null,R(et,{title:`MET Job ${uu.id}`,data:uu,onOpen:l,testId:`raw-met-job-${uu.id}`})))}))))}function b(){return R("div",{className:"met-queue-summary","data-testid":"met-current-summary"},R(d1,{status:"staged"},`待启动 ${E.staged??0}`),R(d1,{status:"queued"},`排队中 ${E.queued??0}`),R(d1,{status:"running"},`训练中 ${E.running??0}`),R("span",null,`最大并发 ${n.summary?.queue?.maxConcurrency??n.queue?.queue?.maxConcurrency??c.maxConcurrency}`),R("span",null,`目标 GPU ${n.summary?.queue?.targetGpuName??n.queue?.queue?.targetGpuName??c.targetGpuName}`))}function d(C,e){let uu=c.expandedProjectDirs[C];return uu===void 0?e<2:Boolean(uu)}function g(C,e){let uu=d(C,e);A({expandedProjectDirs:{...c.expandedProjectDirs,[C]:!uu}})}function x(C){let e=8+Math.max(0,C.depth)*16;if(Boolean(C.project)){let s=C.project,qu=Boolean(c.selectedProjects[s.projectPath]),Zu=t.kind==="project"&&t.key===s.projectPath;return R("div",{key:C.path,className:`met-tree-row project ${qu?"selected":""} ${Zu?"active":""}`,style:{paddingLeft:e},onClick:()=>N(s),"data-testid":`met-project-node-${t3(s.projectPath)}`},R("div",{className:"met-tree-name"},R("input",{type:"checkbox",checked:qu,onClick:(Bu)=>Bu.stopPropagation(),onChange:(Bu)=>A({selectedProjects:{...c.selectedProjects,[s.projectPath]:Bu.target.checked}}),"data-testid":`met-project-checkbox-${t3(s.projectPath)}`}),R("button",{type:"button",className:"met-inline-link project-path",onClick:(Bu)=>{Bu.stopPropagation(),N(s)}},C.name)),R("span",null,s.useModel||"--"),R("span",null,s.epochTrain??"--"),R("span",null,o1(s.progress?.progressPercent)),R("span",null,i3(s.progress?.epochPerHour)))}let Gu=d(C.path,C.depth);return R(uc.default.Fragment,{key:C.path},R("div",{className:"met-tree-row folder",style:{paddingLeft:e},"data-testid":`met-project-folder-${t3(C.path)}`},R("button",{type:"button",className:"met-tree-toggle",onClick:()=>g(C.path,C.depth),"aria-label":Gu?`折叠 ${C.path}`:`展开 ${C.path}`},Gu?"-":"+"),R("strong",null,C.name),R("span",{className:"met-tree-count"},`${C.count} projects`)),Gu?C.children.map((s)=>x(s)):null)}function lu(C){return R("div",{className:"met-detail-kv"},C.map((e)=>R("div",{key:e.label,className:"met-detail-kv-item"},R("span",null,e.label),R("strong",null,e1(e.value)),e.hint?R("small",null,e.hint):null)))}function cu(C,e){return R("div",{className:"met-detail-section"},R("h3",null,C),lu(e))}function _u(C){if(!Array.isArray(C)||C.length===0)return R(hn,{title:"模型层未上报",text:"等待 data/model_info.json 或 compute_analysis.json 生成。"});return R("div",{className:"table-wrap met-layer-table"},R("table",null,R("thead",null,R("tr",null,R("th",null,"Layer"),R("th",null,"Type"),R("th",null,"Params"),R("th",null,"Trainable"),R("th",null,"Compute"))),R("tbody",null,C.slice(0,18).map((e,uu)=>R("tr",{key:`${e.name||"layer"}-${uu}`},R("td",null,e.name||`#${uu+1}`),R("td",null,e.type||"--"),R("td",null,w2(e.num_params)),R("td",null,e.trainable===void 0?"--":String(Boolean(e.trainable))),R("td",null,w2(e.compute?.total??e.estimated_cost?.weighted_units?.total)))))))}function Fu(C){let e=Array.isArray(C)?C:[];if(e.length===0)return R(hn,{title:"data/ 暂无文件",text:"训练或评估完成后会生成 training_state、metrics、model_info 等文件。"});return R("div",{className:"met-file-chip-grid"},e.slice(0,48).map((uu)=>R("span",{key:uu},uu)),e.length>48?R("span",null,`+${e.length-48}`):null)}function zu(C){let e=String(C||"").replace(/\x1b\[[0-9;]*[A-Za-z]/g,"").split(/\r?\n/).map((uu)=>uu.trim()).filter(Boolean).slice(-12);if(e.length===0)return R(hn,{title:"暂无日志尾部",text:"该任务未上报 logTail 或日志已轮转。"});return R("div",{className:"met-log-lines"},e.map((uu,Gu)=>R("div",{key:`${Gu}-${uu.slice(0,16)}`},uu)))}function Wu(){if(t.loading)return R("section",{className:"met-detail-panel","data-testid":"met-detail-panel"},R("div",{className:"panel-head compact"},R("div",null,R("p",{className:"panel-eyebrow"},"Detail Loading"),R(rl,{title:"详情加载中",loading:!0}))),R(hn,{title:"详情加载中",text:t.title||"正在读取 D601 data/ 和 config.json"}));if(t.error)return R("section",{className:"met-detail-panel","data-testid":"met-detail-panel"},R(nl,{error:t.error,wide:!0}));if(!t.data)return R("section",{className:"met-detail-panel muted","data-testid":"met-detail-panel"},R(hn,{title:"选择一个项目或任务查看详情",text:"项目库、当前队列、已完成和失败诊断中的行都可以点击;默认只展示结构化字段,原始 JSON 需显式点击按钮。"}));let C=UZ(t),e=JZ(t),uu=sf(C.config),Gu=sf(C.progress||e.progress),s=sf(C.data),qu=sf(C.metrics||s.metrics||Gu.trainingInfo?.evaluation_metrics),Zu=sf(s.trainingInfo||Gu.trainingInfo),Bu=sf(s.trainingState),Iu=sf(C.model||s.model),ll=Array.isArray(Iu.modelSummary)&&Iu.modelSummary.length>0?Iu.modelSummary:Iu.computeLayers,Pu=sf(Zu.evaluation_metrics),Jl=t.kind==="job"?"训练任务详情":"Project 详情";return R("section",{className:"met-detail-panel","data-testid":"met-detail-panel"},R("div",{className:"panel-head compact"},R("div",null,R("p",{className:"panel-eyebrow"},t.kind==="job"?"Job + Project Detail":"Project Library Detail"),R(rl,{title:Jl}),R("code",null,C.projectPath||e.projectPath||t.title)),R("div",{className:"panel-actions"},R(et,{title:`MET ${Jl}`,data:t.data,onOpen:l,testId:"raw-met-detail"}))),t.kind==="job"?cu("任务状态",[{label:"Job ID",value:e.id},{label:"状态",value:yN(e.status)},{label:"GPU",value:e.gpuName},{label:"Exit Code",value:e.exitCode},{label:"耗时",value:iN(e)},{label:"训练速度",value:i3(tN({...e,progress:Gu}))}]):null,cu("config.json",[{label:"use_model",value:uu.use_model},{label:"epoch_train",value:uu.epoch_train},{label:"step_per_epoch",value:uu.step_per_epoch},{label:"learning_rate",value:uu.learning_rate},{label:"using_gpu",value:uu.using_gpu},{label:"use_points",value:uu.use_points},{label:"sample_rate",value:uu.sample_rate},{label:"time_clipped_s",value:uu.time_clipped_s},{label:"H_UNITS",value:uu.H_UNITS},{label:"INNER_KAN_UNITS",value:uu.INNER_KAN_UNITS},{label:"INNER_KAN_LAYERS",value:uu.INNER_KAN_LAYERS},{label:"GRID_SIZE",value:uu.GRID_SIZE},{label:"SPLINE_ORDER",value:uu.SPLINE_ORDER},{label:"USE_FAST_MODEL",value:uu.USE_FAST_MODEL},{label:"IIR_TRAINABLE",value:uu.IIR_TRAINABLE}]),cu("data/ 训练状态",[{label:"Epoch",value:`${Gu.currentEpoch??Bu.current_epoch??Bu.completed_epoch??"--"} / ${Gu.epochTarget??uu.epoch_train??"--"}`},{label:"Progress",value:o1(Gu.progressPercent)},{label:"Last Loss",value:Gu.lastLoss??Bu.loss},{label:"Last Val Loss",value:Gu.lastValLoss??Bu.val_loss},{label:"Min Loss",value:Zu.min_loss??Bu.min_loss},{label:"Min Val Loss",value:Zu.min_val_loss??Bu.min_val_loss},{label:"Log Lines",value:Gu.logLineCount},{label:"ETA",value:q2(Gu.etaSeconds??Bu.remaining_time)},{label:"训练速度",value:i3(Gu.epochPerHour??Bu.smoothed_speed)},{label:"Training Alive",value:Bu.training_alive}]),cu("模型参数",[{label:"Model Type",value:Iu.modelType??uu.use_model},{label:"Total Params",value:Iu.totalParams,hint:Iu.totalParams===null||Iu.totalParams===void 0?"未上报":"data/model_info.json"},{label:"Trainable",value:Iu.trainableParams},{label:"Non-trainable",value:Iu.nonTrainableParams},{label:"Compute Cost",value:Iu.computeCost},{label:"Estimate Status",value:Iu.estimateStatus},{label:"Unsupported Layers",value:Iu.unsupportedLayerCount}]),cu("指标",[{label:"train_loss",value:qu.train_loss??Pu.train_loss},{label:"val_loss",value:qu.val_loss??Pu.val_loss},{label:"train_mae",value:qu.train_mae??Pu.train_mae},{label:"val_mae",value:qu.val_mae??Pu.val_mae},{label:"train_afmae",value:qu.train_afmae??Pu.train_afmae},{label:"val_afmae",value:qu.val_afmae??Pu.val_afmae},{label:"freq_drift_hz",value:qu.freq_drift_hz},{label:"sens_drift_percent",value:qu.sens_drift_percent},{label:"linearity_percent",value:qu.linearity_percent},{label:"weights_source",value:qu.weights_source??Pu.weights_source},{label:"lr min/mean/max",value:`${e1(Zu.learning_rate_min)} / ${e1(Zu.learning_rate_mean)} / ${e1(Zu.learning_rate_max)}`}]),R("div",{className:"met-detail-section"},R("h3",null,"模型层"),_u(ll)),R("div",{className:"met-detail-section"},R("h3",null,"data/ 文件"),Fu(s.files)),t.kind==="job"?R("div",{className:"met-detail-section"},R("h3",null,"日志尾部"),zu(sf(t.data).logTail)):null)}return R("div",{className:"met-page","data-testid":"met-nonlinear-page"},R(N2,{title:"MET Nonlinear 训练编排",eyebrow:"D601 GPU 用户服务",loading:n.loading||n.actionBusy,actions:R("div",{className:"panel-actions"},R("button",{type:"button",className:"ghost-btn",onClick:j,disabled:n.loading,"data-testid":"met-refresh-button"},n.loading?"刷新中":"刷新"),R(et,{title:"MET Nonlinear 用户服务",data:r,onOpen:l,testId:"raw-met-service"}))},R("div",{className:"findjob-hero"},R("div",null,R("div",{className:"node-version-line"},R(d1,{status:G.providerStatus==="online"?"online":"warn"},G.providerStatus||"unknown"),R("span",null,r.providerId),R("span",null,H.public?"公网暴露":"仅 UniDesk frontend 代理访问")),R("p",{className:"muted paragraph"},r.description)),R("div",{className:"microservice-ref-card"},R("span",null,"Repo"),R("strong",null,Z.url||"--"),R("code",null,Z.commitId||"--")),R("div",{className:"microservice-ref-card"},R("span",null,"D601 Docker"),R("strong",null,`${H.nodeBindHost||"--"}:${H.nodePort||"--"}`),R("code",null,`${Z.composeFile||"--"} / ${Z.containerName||"--"}`))),R(nl,{error:n.error,wide:!0}),c.actionMessage?R("div",{className:"met-action-log","data-testid":"met-action-message"},c.actionMessage):null),R("div",{className:"met-grid"},R(N2,{title:"核心状态",eyebrow:n.refreshedAt?`Updated ${yl(n.refreshedAt)}`:"Queue + GPU",loading:n.loading},R("div",{className:"metric-grid"},R(X0,{label:"Staged",value:E.staged??0,hint:"加入队列未开始",tone:Number(E.staged||0)>0?"warn":""}),R(X0,{label:"Queued",value:E.queued??0,hint:"排队等待调度",tone:Number(E.queued||0)>0?"warn":""}),R(X0,{label:"Running",value:E.running??0,hint:`max ${n.summary?.queue?.maxConcurrency??n.queue?.queue?.maxConcurrency??"--"}`,tone:Number(E.running||0)>0?"ok":""}),R(X0,{label:"Succeeded",value:E.succeeded??0,hint:"已完成"}),R(X0,{label:"Failed",value:E.failed??0,hint:"需要诊断",tone:Number(E.failed||0)>0?"warn":""}),R(X0,{label:"2080Ti Free",value:S?o1(Number(S.freeRatio)*100):"--",hint:S?`${S.memoryFreeMiB}/${S.memoryTotalMiB} MiB`:"等待 GPU 上报"}),R(X0,{label:"ML Image",value:B.present?"READY":"MISSING",hint:B.image||"met-nonlinear-ml:tf26",tone:B.present?"ok":"warn"}),R(X0,{label:"Health",value:n.health?.ok?"OK":"--",hint:"D601 /health"}))),R(N2,{title:"队列控制",eyebrow:"Downloader-like staging",loading:n.actionBusy},R("div",{className:"met-control-strip"},R("label",null,"最大并发",R("input",{type:"number",min:1,max:16,value:c.maxConcurrency,"data-testid":"met-max-concurrency-input",onChange:(C)=>A({maxConcurrency:C.target.value})})),R("label",null,"目标 GPU",R("input",{value:c.targetGpuName,"data-testid":"met-target-gpu-input",onChange:(C)=>A({targetGpuName:C.target.value})})),R("button",{type:"button",className:"ghost-btn",onClick:J,disabled:n.actionBusy,"data-testid":"met-save-settings-button"},"保存设置"),R("button",{type:"button",className:"primary-btn",onClick:U,disabled:n.actionBusy||Number(E.staged||0)===0,"data-testid":"met-start-queue-button"},"启动队列")),R("p",{className:"muted paragraph"},"Project 先进入待启动队列,不会立即训练;点击启动队列后才切换为排队中,并由 D601 scheduler 按最大并发和 2080Ti 显存策略调度。")),R("section",{className:"panel met-workspace"},R("div",{className:"met-tabs",role:"tablist"},k.map((C)=>R("button",{key:C.id,type:"button",className:c.activeTab===C.id?"active":"",onClick:()=>A({activeTab:C.id}),"data-testid":`met-tab-${C.id}`},`${C.label} ${C.count}`))),R("div",{className:"panel-body"},c.activeTab==="projects"?R("div",{className:"met-form-grid","data-testid":"met-projects-pane"},R("div",{className:"met-fork-card"},R("h3",null,"Fork Project"),R("label",null,"源 Project",R("select",{value:Y,"data-testid":"met-source-project-select",onChange:(C)=>A({sourceProject:C.target.value})},X.map((C)=>R("option",{key:C.projectPath,value:C.projectPath},`${C.projectPath} · ${C.useModel||"model?"}`)))),R("label",null,"Fork 数量",R("input",{type:"number",min:1,max:100,value:c.forkCount,"data-testid":"met-fork-count-input",onChange:(C)=>A({forkCount:C.target.value})})),R("label",null,"训练轮数",R("input",{type:"number",min:1,max:1e5,value:c.forkEpochs,"data-testid":"met-fork-epochs-input",onChange:(C)=>A({forkEpochs:C.target.value})})),R("label",null,"目标前缀",R("input",{value:c.forkPrefix,"data-testid":"met-fork-prefix-input",onChange:(C)=>A({forkPrefix:C.target.value})})),R("button",{type:"button",className:"primary-btn",onClick:L,disabled:n.actionBusy||!Y,"data-testid":"met-fork-button"},"Fork Project"),R("p",{className:"muted paragraph"},"Fork 只创建新 Project 并自动勾选,不会直接训练;需要在右侧确认后加入待启动队列。")),R("div",{className:"met-project-list"},R("div",{className:"panel-head compact"},R("div",null,R("p",{className:"panel-eyebrow"},`Existing Projects · ${(n.projects?.roots||[]).map((C)=>`${C.root} ${C.count}`).join(" / ")}`),R(rl,{title:"选择已有 Project",loading:n.loading||n.actionBusy})),R("button",{type:"button",className:"ghost-btn",onClick:W,disabled:n.actionBusy||Q().length===0,"data-testid":"met-stage-selected-button"},`加入待启动队列 (${Q().length})`)),X.length===0?R(hn,{title:"暂无 project",text:"等待 D601 返回 /api/projects"}):R("div",{className:"met-project-table","data-testid":"met-project-tree"},R("div",{className:"met-tree-header"},R("span",null,"文件树 Project"),R("span",null,"Model"),R("span",null,"Epochs"),R("span",null,"Progress"),R("span",null,"速度")),O.children.map((C)=>x(C)))),Wu()):null,c.activeTab==="current"?R("div",{"data-testid":"met-current-pane"},b(),I(p,"current"),Wu(),R("div",{className:"panel-actions inline-actions"},R(et,{title:"MET Queue",data:n.queue,onOpen:l,testId:"raw-met-queue"}))):null,c.activeTab==="completed"?R("div",{"data-testid":"met-completed-pane"},I(v.length>0?v:P.filter((C)=>C.status==="succeeded"),"completed"),Wu()):null,c.activeTab==="failed"?R("div",{"data-testid":"met-failed-pane"},I(z.length>0?z:P.filter((C)=>["failed","canceled"].includes(C.status)),"failed"),Wu(),R("div",{className:"panel-actions inline-actions"},R(et,{title:"MET History",data:n.history,onOpen:l,testId:"raw-met-history"}))):null,c.activeTab==="gpu"?R("div",{className:"met-gpu-pane","data-testid":"met-gpu-pane"},V.length===0?R(hn,{title:"暂无 GPU 上报",text:"等待 D601 met-nonlinear-ts 或 ML image 提供 nvidia-smi 数据"}):R("div",{className:"table-wrap"},R("table",null,R("thead",null,R("tr",null,R("th",null,"Index"),R("th",null,"Name"),R("th",null,"Free"),R("th",null,"Policy"))),R("tbody",null,V.map((C)=>R("tr",{key:C.index},R("td",null,C.index),R("td",null,C.name),R("td",null,`${C.memoryFreeMiB} / ${C.memoryTotalMiB} MiB`,R("div",{className:"met-progress"},R("span",{style:{width:o1(Number(C.freeRatio)*100)}}))),R("td",null,String(C.name||"").includes("2080")?"target 2080Ti, <20% 限制并发":"non-target")))))),R("div",{className:"panel-actions inline-actions"},R(et,{title:"MET Images",data:n.images,onOpen:l,testId:"raw-met-images"}))):null))))}var A3=Cu(Fl(),1);var Qu=A3.default.createElement,{useEffect:$N,useMemo:QZ}=A3.default,c3=A3.default.useState;function AN({status:u,children:l}){let f=String(u||"unknown").toLowerCase();return Qu("span",{className:`status-badge ${f}`},l||u||"unknown")}function lc({label:u,value:l,hint:f,tone:r}){return Qu("article",{className:`metric-card ${r||""}`},Qu("div",{className:"metric-label"},u),Qu("div",{className:"metric-value"},l),Qu("div",{className:"metric-hint"},f))}function _3({title:u,eyebrow:l,actions:f,children:r,className:n,loading:i}){return Qu("section",{className:`panel ${n||""}`},Qu("div",{className:"panel-head"},Qu("div",null,l?Qu("p",{className:"panel-eyebrow"},l):null,Qu(rl,{title:u,loading:i})),f?Qu("div",{className:"panel-actions"},f):null),Qu("div",{className:"panel-body"},r))}function W2({title:u,data:l,onOpen:f,testId:r}){return Qu("button",{type:"button",className:"ghost-btn","data-testid":r,onClick:()=>f(u,l)},"查看原始JSON")}function $3({title:u,text:l}){return Qu("div",{className:"empty-state"},Qu("strong",null,u),Qu("span",null,l))}function NZ(u){return u?.runtime&&typeof u.runtime==="object"&&!Array.isArray(u.runtime)?u.runtime:{}}function qZ(u){return u?.backend&&typeof u.backend==="object"&&!Array.isArray(u.backend)?u.backend:{}}function wZ(u){return u?.repository&&typeof u.repository==="object"&&!Array.isArray(u.repository)?u.repository:{}}function uy(u,l){return`${u}/microservices/mdtodo/proxy${l}`}function jN(u){if(u==="completed")return"已完成";if(u==="in_progress")return"进行中";return"待处理"}function WZ(u){if(u==="completed")return"online";if(u==="in_progress")return"warn";return"unknown"}function L2(u){let l=[],f=(r)=>{for(let n of r)if(l.push(n),Array.isArray(n.children))f(n.children)};return f(Array.isArray(u)?u:[]),l}function LZ({tasks:u,selectedId:l,onSelect:f}){if(!u.length)return Qu($3,{title:"暂无任务",text:"当前文件没有 R 编号任务。"});let r=(n)=>Qu("li",{key:n.id},Qu("button",{type:"button",className:`mdtodo-task-row ${l===n.id?"active":""}`,style:{"--task-depth":Math.min(Number(n.depth||0),6)},onClick:()=>f(n.id),"data-testid":`mdtodo-task-${String(n.id).replace(/[^A-Za-z0-9_-]+/g,"-")}`},Qu(AN,{status:WZ(n.status)},jN(n.status)),Qu("code",null,n.id),Qu("span",{className:"mdtodo-task-title"},n.title||"--"),Qu("span",{className:"mdtodo-link-count"},`${n.linkExists??0}/${n.linkCount??0}`)),Array.isArray(n.children)&&n.children.length>0?Qu("ol",null,n.children.map(r)):null);return Qu("ol",{className:"mdtodo-tree"},u.map(r))}function FN({microservices:u,onRaw:l,apiBaseUrl:f="/api"}){let r=u.find((S)=>S.id==="mdtodo")||null,[n,i]=c3({loading:!1,saving:!1,error:"",notice:"",health:null,files:[],todo:null,selectedFile:"",selectedTaskId:"",refreshedAt:null,command:null}),[t,y]=c3(""),[c,$]=c3(""),[A,j]=c3(""),F=Array.isArray(n.todo?.tasks)?n.todo.tasks:[],J=QZ(()=>L2(F),[n.todo]),Q=J.find((S)=>S.id===n.selectedTaskId)||J[0]||null,W=n.todo?.stats||{};async function L(S=n.selectedFile){if(!r)return;i((B)=>({...B,loading:!0,error:"",notice:""}));try{let[B,D]=await Promise.all([Eu(`${f}/microservices/mdtodo/health`),Eu(uy(f,"/api/files"))]),X=Array.isArray(D.files)?D.files:[],O=S||X[0]?.path||"",Y=O?await Eu(uy(f,`/api/tasks?file=${encodeURIComponent(O)}`)):null,p=Array.isArray(Y?.tasks)?L2(Y.tasks):[],v=p.some((z)=>z.id===n.selectedTaskId)?n.selectedTaskId:p[0]?.id||"";i({loading:!1,saving:!1,error:"",notice:"",health:B,files:X,todo:Y,selectedFile:O,selectedTaskId:v,refreshedAt:new Date,command:n.command})}catch(B){i((D)=>({...D,loading:!1,error:Ou(B,"MDTODO 加载失败")}))}}if($N(()=>{L()},[r?.id,r?.runtime?.providerStatus]),$N(()=>{y(Q?.title||""),$(Q?.rawContent||"")},[Q?.id,n.selectedFile]),!r)return Qu($3,{title:"MDTODO 未登记",text:"请在 config.json 的 microservices 中登记用户服务 id=mdtodo"});let U=NZ(r),q=wZ(r),N=qZ(r);async function w(S){i((B)=>({...B,selectedFile:S,selectedTaskId:"",command:null})),await L(S)}async function G(S){if(!Q||!n.selectedFile)return;i((B)=>({...B,saving:!0,error:"",notice:""}));try{let B=await Eu(uy(f,`/api/tasks/${encodeURIComponent(Q.id)}`),{method:"PATCH",body:{file:n.selectedFile,...S}});i((D)=>({...D,saving:!1,todo:B.file,notice:B.result?.message||"任务已更新"}))}catch(B){i((D)=>({...D,saving:!1,error:Ou(B,"任务更新失败")}))}}async function Z(){await G({title:t,rawContent:c})}async function H(S){if(!n.selectedFile)return;i((B)=>({...B,saving:!0,error:"",notice:""}));try{let B=await Eu(uy(f,"/api/tasks"),{method:"POST",body:{file:n.selectedFile,parentId:S,title:A||"新任务"}});j(""),i((D)=>({...D,saving:!1,todo:B.file,selectedTaskId:B.result?.taskId||D.selectedTaskId,notice:B.result?.message||"任务已创建"})),await L(n.selectedFile)}catch(B){i((D)=>({...D,saving:!1,error:Ou(B,"创建任务失败")}))}}async function E(){if(!Q||!n.selectedFile)return;if(!window.confirm(`删除 ${Q.id} 及其子任务?`))return;i((S)=>({...S,saving:!0,error:"",notice:""}));try{let S=await Eu(uy(f,`/api/tasks/${encodeURIComponent(Q.id)}?file=${encodeURIComponent(n.selectedFile)}`),{method:"DELETE"}),B=L2(S.file?.tasks||[]);i((D)=>({...D,saving:!1,todo:S.file,selectedTaskId:B[0]?.id||"",notice:S.result?.message||"任务已删除"}))}catch(S){i((B)=>({...B,saving:!1,error:Ou(S,"删除任务失败")}))}}async function V(){if(!Q||!n.selectedFile)return;i((S)=>({...S,saving:!0,error:"",command:null}));try{let S=await Eu(uy(f,"/api/execute-command"),{method:"POST",body:{file:n.selectedFile,taskId:Q.id,mode:"codex"}});i((B)=>({...B,saving:!1,command:S,notice:"执行命令已生成"}))}catch(S){i((B)=>({...B,saving:!1,error:Ou(S,"执行命令生成失败")}))}}return Qu("div",{className:"mdtodo-page","data-testid":"mdtodo-page"},Qu(_3,{title:"MDTODO 工作台",eyebrow:"D601 k3s managed service",loading:n.loading,actions:Qu("div",{className:"panel-actions"},Qu("button",{type:"button",className:"ghost-btn",onClick:()=>void L(),disabled:n.loading,"data-testid":"mdtodo-refresh-button"},n.loading?"刷新中":"刷新"),Qu(W2,{title:"MDTODO 用户服务",data:r,onOpen:l,testId:"raw-mdtodo-service"}))},Qu("div",{className:"findjob-hero"},Qu("div",null,Qu("div",{className:"node-version-line"},Qu(AN,{status:U.providerStatus==="online"?"online":"warn"},U.providerStatus||"unknown"),Qu("span",null,r.providerId),Qu("span",null,N.proxyMode||"--")),Qu("p",{className:"muted paragraph"},r.description)),Qu("div",{className:"microservice-ref-card"},Qu("span",null,"Repo"),Qu("strong",null,q.url||"--"),Qu("code",null,q.composeFile||"--")),Qu("div",{className:"microservice-ref-card"},Qu("span",null,"Workspace"),Qu("strong",null,n.health?.rootDir||"/workspace"),Qu("code",null,`${N.nodeBindHost||"--"}:${N.nodePort||"--"}`))),Qu(nl,{error:n.error,wide:!0}),n.notice?Qu("div",{className:"notice-line"},n.notice):null),Qu("div",{className:"metric-grid"},Qu(lc,{label:"TODO 文件",value:n.files.length,hint:n.health?.rootExists?"hostPath ready":"hostPath missing",tone:n.health?.ok?"ok":"warn"}),Qu(lc,{label:"任务总数",value:W.total??"--",hint:n.selectedFile||"--"}),Qu(lc,{label:"已完成",value:W.completed??"--",hint:"completed",tone:"ok"}),Qu(lc,{label:"进行中",value:W.inProgress??"--",hint:"in progress",tone:"warn"}),Qu(lc,{label:"待处理",value:W.pending??"--",hint:n.refreshedAt?yl(n.refreshedAt):"pending"})),Qu("div",{className:"mdtodo-layout"},Qu(_3,{title:"文件",eyebrow:`${n.files.length} Markdown`,loading:n.loading,className:"mdtodo-file-panel"},n.files.length===0?Qu($3,{title:"暂无 TODO 文件",text:"等待后端扫描 MDTODO 工作区。"}):Qu("div",{className:"mdtodo-file-list"},n.files.map((S)=>Qu("button",{key:S.path,type:"button",className:`mdtodo-file-item ${n.selectedFile===S.path?"active":""}`,onClick:()=>void w(S.path)},Qu("strong",null,S.name),Qu("span",null,S.directory||"."),Qu("code",null,`${S.stats?.total??"--"} tasks / ${wu(S.mtime)}`))))),Qu(_3,{title:"任务树",eyebrow:n.selectedFile||"Tasks",loading:n.loading,actions:Qu("div",{className:"panel-actions"},Qu("input",{value:A,onChange:(S)=>j(S.target.value),placeholder:"新任务标题","data-testid":"mdtodo-new-title"}),Qu("button",{type:"button",className:"ghost-btn",onClick:()=>void H(),disabled:n.saving||!n.selectedFile},"新增"),Q?Qu("button",{type:"button",className:"ghost-btn",onClick:()=>void H(Q.id),disabled:n.saving},"新增子任务"):null,n.todo?Qu(W2,{title:"MDTODO 当前文件",data:n.todo,onOpen:l,testId:"raw-mdtodo-file"}):null)},Qu(LZ,{tasks:F,selectedId:Q?.id||"",onSelect:(S)=>i((B)=>({...B,selectedTaskId:S,command:null}))})),Qu(_3,{title:Q?`${Q.id} 详情`:"任务详情",eyebrow:Q?jN(Q.status):"Detail",loading:n.saving,className:"mdtodo-detail-panel",actions:Q?Qu("div",{className:"panel-actions"},Qu("button",{type:"button",className:"ghost-btn",onClick:()=>void G({status:"pending"}),disabled:n.saving},"待处理"),Qu("button",{type:"button",className:"ghost-btn",onClick:()=>void G({status:"in_progress"}),disabled:n.saving},"进行中"),Qu("button",{type:"button",className:"primary-btn",onClick:()=>void G({status:"completed"}),disabled:n.saving},"完成")):null},!Q?Qu($3,{title:"未选中任务",text:"请选择一个任务。"}):Qu("div",{className:"mdtodo-editor"},Qu("label",null,"标题",Qu("input",{value:t,onChange:(S)=>y(S.target.value),"data-testid":"mdtodo-title-input"})),Qu("label",null,"正文",Qu("textarea",{value:c,onChange:(S)=>$(S.target.value),rows:12,"data-testid":"mdtodo-raw-input"})),Qu("div",{className:"docker-meta compact"},Qu("span",null,`line ${Number(Q.lineNumber??0)+1}`),Qu("span",null,`depth ${Q.depth??0}`),Qu("span",null,`links ${Q.linkExists??0}/${Q.linkCount??0}`)),Qu("div",{className:"inline-actions"},Qu("button",{type:"button",className:"primary-btn",onClick:Z,disabled:n.saving},n.saving?"保存中":"保存"),Qu("button",{type:"button",className:"ghost-btn",onClick:V,disabled:n.saving},"生成执行命令"),Qu("button",{type:"button",className:"danger-btn",onClick:E,disabled:n.saving},"删除"),Qu(W2,{title:`MDTODO ${Q.id}`,data:Q,onOpen:l,testId:"raw-mdtodo-task"})),n.command?Qu("div",{className:"mdtodo-command"},Qu("span",null,n.command.prompt||"--"),Qu("code",null,n.command.command||"--")):null))))}var F3=[{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:"project-manager",label:"Project Manager"}]},{id:"config",label:"系统配置",code:"CFG",tabs:[{id:"topology",label:"连接拓扑"},{id:"auth",label:"认证策略"},{id:"security",label:"安全边界"}]}],fc=Object.fromEntries(F3.map((u)=>[u.id,u.tabs[0]?.id??""]));function TZ(u){let l=String(u||"").trim();if(!l)return"";try{return decodeURIComponent(l)}catch{return l}}function j3(u){let l=String(u||"/"),[f]=l.split(/[?#]/u,1);if(f==="/")return"/";let n=`/${f.split("/").map(TZ).filter(Boolean).join("/")}`;return n.endsWith("/")?n:`${n}/`}function KZ(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 T2(u){return String(u||"").normalize("NFKD").replace(/[\u0300-\u036f]/gu,"").toLowerCase().replace(/[^a-z0-9]+/gu,"-").replace(/^-+|-+$/gu,"")}function UN(u){return String(u||"").trim().toLowerCase().replace(/[\s/\\?#%]+/gu,"-").replace(/-+/gu,"-").replace(/^-+|-+$/gu,"")}function JN(u){let l=T2(u.routeSegment||"")||UN(u.routeSegment||"");if(l)return l;let f=T2(u.id||"");if(f)return f;let r=T2(u.label||"")||UN(u.label||"");if(r)return r;return`route-${KZ(JSON.stringify(u))}`}function K2(u,l){return`${u}:${l}`}function QN(u){let l=u.map((c)=>{let $=JN(c);return{...c,routeSegment:$,tabs:c.tabs.map((A)=>({...A,routeSegment:JN(A)}))}}),f={},r={},n={},i=l.map((c)=>{let $=c.tabs[0]?.id??"";n[c.id]=$;let A=c.tabs.map((J)=>{let Q=`/${c.routeSegment}/${J.routeSegment}/`,W=[Q],L={moduleId:c.id,tabId:J.id};for(let U of W)f[j3(U)]=L;return r[K2(c.id,J.id)]=Q,{...J,canonicalPath:Q,aliases:W}}),j=`/${c.routeSegment}/`,F={moduleId:c.id,tabId:$};return f[j3(j)]=F,{...c,routeSegment:c.routeSegment,canonicalPath:j,tabs:A}}),t=i[0],y={moduleId:t?.id||"",tabId:t?.tabs[0]?.id||""};return f["/"]=y,{modules:i,moduleById:Object.fromEntries(i.map((c)=>[c.id,c])),defaultActiveTabs:n,routeMap:f,canonicalPathByTarget:r,fallbackTarget:y}}function G2(u,l){return u.routeMap[j3(l)]||u.fallbackTarget}function U3(u,l,f){return u.canonicalPathByTarget[K2(l,f)]||u.canonicalPathByTarget[K2(u.fallbackTarget.moduleId,u.fallbackTarget.tabId)]||"/"}function NN(u,l){let f=u.routeMap[j3(l)];if(!f)return null;return U3(u,f.moduleId,f.tabId)}var q3=Cu(Fl(),1);var iu=q3.default.createElement,{useEffect:qN,useMemo:GZ}=q3.default,z2=q3.default.useState;function N3({status:u,children:l,title:f}){let r=String(u||"unknown").toLowerCase();return iu("span",{className:`status-badge ${r}`,title:f},l||u||"unknown")}function rc({label:u,value:l,hint:f,tone:r}){return iu("article",{className:`metric-card ${r||""}`},iu("div",{className:"metric-label"},u),iu("div",{className:"metric-value"},l),iu("div",{className:"metric-hint"},f))}function J3({title:u,eyebrow:l,actions:f,children:r,className:n,loading:i}){return iu("section",{className:`panel ${n||""}`},iu("div",{className:"panel-head"},iu("div",null,l?iu("p",{className:"panel-eyebrow"},l):null,iu(rl,{title:u,loading:i})),f?iu("div",{className:"panel-actions"},f):null),iu("div",{className:"panel-body"},r))}function nc({title:u,data:l,onOpen:f,testId:r}){return iu("button",{type:"button",className:"ghost-btn","data-testid":r,onClick:()=>f?.(u,l)},"查看原始JSON")}function E2({title:u,text:l}){return iu("div",{className:"empty-state"},iu("strong",null,u),iu("span",null,l))}function zZ(u){return u&&typeof u==="object"&&!Array.isArray(u)?u:null}function xn(u){return Array.isArray(u)?u:[]}function af(u){let l=Number(u);return Number.isFinite(l)?l.toLocaleString("zh-CN"):"--"}function wN(u,l=140){if(u===null||u===void 0)return"--";let f=typeof u==="string"?u:JSON.stringify(u),r=String(f||"").replace(/\s+/gu," ").trim();return r.length>l?`${r.slice(0,l-1)}...`:r||"--"}function EZ(u){return xn(u?.tags).map((l)=>String(l||"").trim()).filter(Boolean)}function Xi(u){let l=Number(u);return Number.isFinite(l)&&l>=0?Math.floor(l):0}function OZ(u){return u?.runtime&&typeof u.runtime==="object"&&!Array.isArray(u.runtime)?u.runtime:{}}function ZZ(u){return u?.backend&&typeof u.backend==="object"&&!Array.isArray(u.backend)?u.backend:{}}function HZ(u){return String(u||"").split(/[\s,]+/u).map((l)=>l.trim()).filter(Boolean).join(",")}function Q3(u,l){return`${u}/microservices/oa-event-flow/proxy${l}`}function BZ(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 mZ(u){let l=String(u?.subjectKind||"trace"),f=String(u?.subjectId||u?.scopeId||"");return f?`${l}:${f}`:String(u?.scopeId||"--")}function VZ({tags:u}){let l=EZ({tags:u}).slice(0,6);return iu("div",{className:"oa-tag-rail"},l.length===0?iu("span",{className:"muted"},"--"):l.map((f)=>iu("code",{key:f},f)))}function DZ({events:u,onRaw:l}){let f=[...xn(u)].reverse();return f.length===0?iu(E2,{title:"事件表暂无记录",text:"等待 Code Queue 或 Pipeline 按 tag 发布 OA 事件"}):iu("div",{className:"table-wrap oa-event-table-wrap"},iu("table",{className:"oa-event-table","data-testid":"oa-event-flow-event-table"},iu("thead",null,iu("tr",null,iu("th",null,"Seq"),iu("th",null,"Type"),iu("th",null,"Source"),iu("th",null,"Aggregate"),iu("th",null,"Tags"),iu("th",null,"Payload"),iu("th",null,"Created"),iu("th",null,"Raw"))),iu("tbody",null,f.map((r)=>{let n=String(r?.type||"event"),i=`${String(r?.aggregateType||"--")}:${String(r?.aggregateId||"--")}`;return iu("tr",{key:r?.eventId||r?.sequence},iu("td",null,iu("code",null,af(r?.sequence))),iu("td",null,iu(N3,{status:BZ(n)},n)),iu("td",null,iu("strong",null,r?.sourceId||"--"),iu("code",null,r?.sourceKind||"--")),iu("td",null,iu("code",null,i)),iu("td",null,iu(VZ,{tags:r?.tags})),iu("td",null,iu("span",{className:"oa-payload-preview"},wN(r?.payload,180))),iu("td",null,wu(r?.createdAt)),iu("td",null,iu(nc,{title:`OA Event ${r?.sequence||""}`,data:r,onOpen:l,testId:`raw-oa-event-${r?.sequence||"unknown"}`})))}))))}function pZ({stats:u,onRaw:l}){let f=xn(u);return f.length===0?iu(E2,{title:"统计中心暂无投影",text:"trace-stats-snapshot / trace-step-created 进入事件流后会更新这里"}):iu("div",{className:"table-wrap oa-stats-table-wrap"},iu("table",{className:"oa-stats-table","data-testid":"oa-event-flow-stats"},iu("thead",null,iu("tr",null,iu("th",null,"Scope"),iu("th",null,"Service"),iu("th",null,"STEP"),iu("th",null,"Read"),iu("th",null,"Edit"),iu("th",null,"Run"),iu("th",null,"Error"),iu("th",null,"Output Seq"),iu("th",null,"Revision"),iu("th",null,"Updated"),iu("th",null,"Raw"))),iu("tbody",null,f.map((r)=>iu("tr",{key:r?.scopeId||`${r?.serviceId}-${r?.subjectId}`},iu("td",null,iu("strong",null,mZ(r)),iu("code",null,r?.scopeId||"--")),iu("td",null,iu(N3,{status:String(r?.serviceId||"unknown")==="code-queue"?"running":"queued"},r?.serviceId||"--")),iu("td",null,iu("strong",null,af(Xi(r?.stepCount??r?.llmStepCount)))),iu("td",null,af(Xi(r?.readCount))),iu("td",null,af(Xi(r?.editCount))),iu("td",null,af(Xi(r?.runCount))),iu("td",null,af(Xi(r?.errorCount))),iu("td",null,iu("code",null,af(Xi(r?.outputMaxSeq)))),iu("td",null,af(Xi(r?.statsRevision))),iu("td",null,wu(r?.updatedAt)),iu("td",null,iu(nc,{title:`OA Trace Stats ${r?.scopeId||""}`,data:r,onOpen:l,testId:`raw-oa-stats-${String(r?.scopeId||"unknown").replace(/[^a-zA-Z0-9_-]/gu,"_")}`})))))))}function WN({microservices:u,onRaw:l,apiBaseUrl:f="/api"}){let r=u.find((G)=>G.id==="oa-event-flow")||null,[n,i]=z2("service:code-queue"),[t,y]=z2({loading:!1,error:"",health:null,diagnostics:null,events:[],stats:[],refreshedAt:null}),[c,$]=z2({status:"idle",message:"未连接",lastEventAt:""}),A=GZ(()=>HZ(n),[n]);async function j(){if(!r)return;y((G)=>({...G,loading:!0,error:""}));try{let G=A?`tags=${encodeURIComponent(A)}&`:"",[Z,H,E,V]=await Promise.all([Eu(`${f}/microservices/oa-event-flow/health`,{failureFields:[]}),Eu(Q3(f,"/api/diagnostics")),Eu(Q3(f,`/api/events?${G}limit=100`)),Eu(Q3(f,`/api/stats/trace?${G}limit=100`))]);y({loading:!1,error:"",health:Z,diagnostics:H,events:xn(E?.events),stats:xn(V?.stats),refreshedAt:new Date})}catch(G){y((Z)=>({...Z,loading:!1,error:Ou(G,"OA Event Flow 加载失败")}))}}if(qN(()=>{j()},[r?.id,r?.runtime?.providerStatus,A]),qN(()=>{if(!r||typeof EventSource>"u")return;let G=A?`?tags=${encodeURIComponent(A)}`:"",Z=new EventSource(`${Q3(f,"/api/events/stream")}${G}`,{withCredentials:!0});$({status:"running",message:"SSE connecting",lastEventAt:""});let H=(S)=>{$({status:"online",message:wN(S.data,120),lastEventAt:new Date().toISOString()})},E=(S)=>{try{let B=JSON.parse(String(S.data||"{}"));$({status:"online",message:String(B?.type||S.type||"event"),lastEventAt:new Date().toISOString()}),y((D)=>{let X=[...xn(D.events).filter((Y)=>String(Y?.eventId||"")!==String(B?.eventId||"")),B].sort((Y,p)=>Number(Y?.sequence||0)-Number(p?.sequence||0)).slice(-100),O=B?.type==="trace-stats-updated"&&zZ(B?.payload?.stats)?[B.payload.stats,...xn(D.stats).filter((Y)=>String(Y?.scopeId||"")!==String(B.payload.stats.scopeId||""))].slice(0,100):D.stats;return{...D,events:X,stats:O}})}catch(B){$({status:"warn",message:Ou(B,"SSE 事件解析失败"),lastEventAt:new Date().toISOString()})}},V=()=>{$((S)=>({...S,status:"warn",message:"SSE reconnecting"}))};return Z.addEventListener("hello",H),Z.addEventListener("task-updated",E),Z.addEventListener("queue-updated",E),Z.addEventListener("trace-step-created",E),Z.addEventListener("trace-stats-snapshot",E),Z.addEventListener("trace-stats-updated",E),Z.addEventListener("trace-error",E),Z.onerror=V,()=>Z.close()},[r?.id,f,A]),!r)return iu(E2,{title:"OA Event Flow 未登记",text:"请在 config.json 的 microservices 中登记 id=oa-event-flow"});let F=OZ(r),J=ZZ(r),Q=t.diagnostics||{},W=t.health||{},L=Q.eventCount??W.eventCount,U=Q.traceStatsCount??W.traceStatsCount,q=Q.latestSequence??W.latestSequence,N=Q.pipelineBridge||W.pipelineBridge||{},w=xn(Q.eventTypes).slice(0,8);return iu("div",{className:"oa-event-flow-page","data-testid":"oa-event-flow-page"},iu(J3,{title:"OA Event Flow 控制台",eyebrow:"Unified OA Event Bus + Stats Projection",loading:t.loading,actions:iu("div",{className:"panel-actions"},iu("button",{type:"button",className:"ghost-btn",onClick:j,disabled:t.loading,"data-testid":"oa-event-flow-refresh"},t.loading?"刷新中":"刷新"),iu(nc,{title:"OA Event Flow Service",data:r,onOpen:l,testId:"raw-oa-event-flow-service"}))},iu("div",{className:"oa-flow-hero"},iu("div",null,iu("div",{className:"node-version-line"},iu(N3,{status:W?.ok||F.providerStatus==="online"?"online":"warn"},W?.ok?"HEALTH OK":F.providerStatus||"unknown"),iu(N3,{status:c.status},c.status.toUpperCase()),iu("span",null,J.public?"公网暴露":"仅 UniDesk frontend 代理访问")),iu("p",{className:"muted paragraph"},"独立事件流微服务统一承载 Code Queue 与 Pipeline 的事件发布、tag 订阅、事件表审计和 Trace/STEP 统计投影。")),iu("div",{className:"oa-flow-signal"},iu("span",null,"stream"),iu("strong",null,c.message||"--"),iu("code",null,c.lastEventAt?yl(new Date(c.lastEventAt)):"waiting"))),iu(nl,{error:t.error,wide:!0})),iu("div",{className:"oa-flow-metrics"},iu(rc,{label:"事件总量",value:af(L),hint:`latest seq ${af(q)}`,tone:"ok"}),iu(rc,{label:"Trace Stats",value:af(U),hint:"oa_trace_stats 投影"}),iu(rc,{label:"SSE Clients",value:af(W?.sseClientCount??xn(Q.sseClients).length),hint:c.message||"tag subscription"}),iu(rc,{label:"Pipeline Bridge",value:N?.enabled?af(N?.insertedCount):"OFF",hint:N?.lastError||N?.lastFinishedAt||`${N?.mode||"snapshot"} service:pipeline`}),iu(rc,{label:"DB",value:W?.databaseReady||Q.databaseReady?"READY":"WAIT",hint:W?.databaseLastError||Q.databaseLastError||"PostgreSQL persisted"})),iu(J3,{title:"标签订阅",eyebrow:t.refreshedAt?`Updated ${yl(t.refreshedAt)}`:"Tag Pub/Sub"},iu("div",{className:"oa-filter-bar"},iu("label",null,iu("span",null,"tags"),iu("input",{value:n,onChange:(G)=>i(G.target.value),placeholder:"service:code-queue, trace","data-testid":"oa-event-flow-tag-filter"})),iu("div",{className:"oa-filter-presets"},iu("button",{type:"button",className:"ghost-btn",onClick:()=>i("service:code-queue")},"Code Queue"),iu("button",{type:"button",className:"ghost-btn",onClick:()=>i("service:pipeline")},"Pipeline"),iu("button",{type:"button",className:"ghost-btn",onClick:()=>i("trace")},"Trace"),iu("button",{type:"button",className:"ghost-btn",onClick:()=>i("")},"All")),iu("code",null,A||"all events")),iu("div",{className:"oa-type-strip"},w.length===0?iu("span",{className:"muted"},"等待事件类型统计"):w.map((G)=>iu("span",{key:G.type,className:"data-chip"},`${G.type} ${af(G.count)}`)))),iu("div",{className:"oa-flow-grid"},iu(J3,{title:"事件表",eyebrow:"oa_events persisted log",className:"oa-flow-wide",loading:t.loading,actions:iu(nc,{title:"OA Event Query",data:{events:t.events,diagnostics:Q},onOpen:l,testId:"raw-oa-events"})},iu(DZ,{events:t.events,onRaw:l})),iu(J3,{title:"统计中心",eyebrow:"oa_trace_stats read model",className:"oa-flow-wide",loading:t.loading,actions:iu(nc,{title:"OA Trace Stats",data:t.stats,onOpen:l,testId:"raw-oa-trace-stats"})},iu(pZ,{stats:t.stats,onRaw:l}))))}var a0=Cu(Fl(),1);var ru=Cu(GN(),1),tu=Cu(Fl(),1);function Xl(u){if(typeof u==="string"||typeof u==="number")return""+u;let l="";if(Array.isArray(u)){for(let f=0,r;f{}};function EN(){for(var u=0,l=arguments.length,f={},r;u=0)r=f.slice(n+1),f=f.slice(0,n);if(f&&!l.hasOwnProperty(f))throw Error("unknown type: "+f);return{type:f,name:r}})}W3.prototype=EN.prototype={constructor:W3,on:function(u,l){var f=this._,r=hZ(u+"",f),n,i=-1,t=r.length;if(arguments.length<2){while(++i0)for(var f=Array(n),r=0,n,i;r=0&&(l=u.slice(0,f))!=="xmlns")u=u.slice(f+1);return O2.hasOwnProperty(l)?{space:O2[l],local:u}:u}function Z2(u){let l;while(l=u.sourceEvent)u=l;return u}function Gf(u,l){if(u=Z2(u),l===void 0)l=u.currentTarget;if(l){var f=l.ownerSVGElement||l;if(f.createSVGPoint){var r=f.createSVGPoint();return r.x=u.clientX,r.y=u.clientY,r=r.matrixTransform(l.getScreenCTM().inverse()),[r.x,r.y]}if(l.getBoundingClientRect){var n=l.getBoundingClientRect();return[u.clientX-n.left-l.clientLeft,u.clientY-n.top-l.clientTop]}}return[u.pageX,u.pageY]}function bZ(){}function Y0(u){return u==null?bZ:function(){return this.querySelector(u)}}function H2(u){if(typeof u!=="function")u=Y0(u);for(var l=this._groups,f=l.length,r=Array(f),n=0;n=N)N=q+1;while(!(G=L[N])&&++N=0;)if(t=r[n]){if(i&&t.compareDocumentPosition(i)^4)i.parentNode.insertBefore(t,i);i=t}return this}function h2(u){if(!u)u=rH;function l(j,F){return j&&F?u(j.__data__,F.__data__):!j-!F}for(var f=this._groups,r=f.length,n=Array(r),i=0;il?1:u>=l?0:NaN}function x2(){var u=arguments[0];return arguments[0]=this,u.apply(null,arguments),this}function b2(){return Array.from(this)}function v2(){for(var u=this._groups,l=0,f=u.length;l1?this.each((l==null?$H:typeof l==="function"?jH:AH)(u,l,f==null?"":f)):P0(this.node(),u)}function P0(u,l){return u.style.getPropertyValue(l)||yc(u).getComputedStyle(u,null).getPropertyValue(l)}function FH(u){return function(){delete this[u]}}function UH(u,l){return function(){this[u]=l}}function JH(u,l){return function(){var f=l.apply(this,arguments);if(f==null)delete this[u];else this[u]=f}}function o2(u,l){return arguments.length>1?this.each((l==null?FH:typeof l==="function"?JH:UH)(u,l)):this.node()[u]}function ON(u){return u.trim().split(/^|\s+/)}function d2(u){return u.classList||new ZN(u)}function ZN(u){this._node=u,this._names=ON(u.getAttribute("class")||"")}ZN.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 HN(u,l){var f=d2(u),r=-1,n=l.length;while(++r=0)f=l.slice(r+1),l=l.slice(0,r);return{type:l,name:f}})}function SH(u){return function(){var l=this.__on;if(!l)return;for(var f=0,r=-1,n=l.length,i;f()=>u;function Ac(u,{sourceEvent:l,subject:f,target:r,identifier:n,active:i,x:t,y,dx:c,dy:$,dispatch:A}){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:r,enumerable:!0,configurable:!0},identifier:{value:n,enumerable:!0,configurable:!0},active:{value:i,enumerable:!0,configurable:!0},x:{value:t,enumerable:!0,configurable:!0},y:{value:y,enumerable:!0,configurable:!0},dx:{value:c,enumerable:!0,configurable:!0},dy:{value:$,enumerable:!0,configurable:!0},_:{value:A}})}Ac.prototype.on=function(){var u=this._.on.apply(this._,arguments);return u===this._?this:u};function IH(u){return!u.ctrlKey&&!u.button}function gH(){return this.parentNode}function sH(u,l){return l==null?{x:u.x,y:u.y}:l}function aH(){return navigator.maxTouchPoints||"ontouchstart"in this}function jc(){var u=IH,l=gH,f=sH,r=aH,n={},i=Yi("start","drag","end"),t=0,y,c,$,A,j=0;function F(w){w.on("mousedown.drag",J).filter(r).on("touchstart.drag",L).on("touchmove.drag",U,DN).on("touchend.drag touchcancel.drag",q).style("touch-action","none").style("-webkit-tap-highlight-color","rgba(0,0,0,0)")}function J(w,G){if(A||!u.call(this,w,G))return;var Z=N(this,l.call(this,w,G),w,G,"mouse");if(!Z)return;el(w.view).on("mousemove.drag",Q,Pi).on("mouseup.drag",W,Pi),ry(w.view),K3(w),$=!1,y=w.clientX,c=w.clientY,Z("start",w)}function Q(w){if(vn(w),!$){var G=w.clientX-y,Z=w.clientY-c;$=G*G+Z*Z>j}n.mouse("drag",w)}function W(w){el(w.view).on("mousemove.drag mouseup.drag",null),_c(w.view,$),vn(w),n.mouse("end",w)}function L(w,G){if(!u.call(this,w,G))return;var Z=w.changedTouches,H=l.call(this,w,G),E=Z.length,V,S;for(V=0;V>8&15|l>>4&240,l>>4&15|l&240,(l&15)<<4|l&15,1):f===8?G3(l>>24&255,l>>16&255,l>>8&255,(l&255)/255):f===4?G3(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=dH.exec(u))?new of(l[1],l[2],l[3],1):(l=eH.exec(u))?new of(l[1]*255/100,l[2]*255/100,l[3]*255/100,1):(l=uB.exec(u))?G3(l[1],l[2],l[3],l[4]):(l=lB.exec(u))?G3(l[1]*255/100,l[2]*255/100,l[3]*255/100,l[4]):(l=fB.exec(u))?MN(l[1],l[2]/100,l[3]/100,1):(l=rB.exec(u))?MN(l[1],l[2]/100,l[3]/100,l[4]):pN.hasOwnProperty(u)?YN(pN[u]):u==="transparent"?new of(NaN,NaN,NaN,0):null}function YN(u){return new of(u>>16&255,u>>8&255,u&255,1)}function G3(u,l,f,r){if(r<=0)u=l=f=NaN;return new of(u,l,f,r)}function tB(u){if(!(u instanceof Qc))u=dr(u);if(!u)return new of;return u=u.rgb(),new of(u.r,u.g,u.b,u.opacity)}function iy(u,l,f,r){return arguments.length===1?tB(u):new of(u,l,f,r==null?1:r)}function of(u,l,f,r){this.r=+u,this.g=+l,this.b=+f,this.opacity=+r}Fc(of,iy,F5(Qc,{brighter(u){return u=u==null?E3:Math.pow(E3,u),new of(this.r*u,this.g*u,this.b*u,this.opacity)},darker(u){return u=u==null?Uc:Math.pow(Uc,u),new of(this.r*u,this.g*u,this.b*u,this.opacity)},rgb(){return this},clamp(){return new of(Mi(this.r),Mi(this.g),Mi(this.b),O3(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:PN,formatHex:PN,formatHex8:yB,formatRgb:CN,toString:CN}));function PN(){return`#${Ci(this.r)}${Ci(this.g)}${Ci(this.b)}`}function yB(){return`#${Ci(this.r)}${Ci(this.g)}${Ci(this.b)}${Ci((isNaN(this.opacity)?1:this.opacity)*255)}`}function CN(){let u=O3(this.opacity);return`${u===1?"rgb(":"rgba("}${Mi(this.r)}, ${Mi(this.g)}, ${Mi(this.b)}${u===1?")":`, ${u})`}`}function O3(u){return isNaN(u)?1:Math.max(0,Math.min(1,u))}function Mi(u){return Math.max(0,Math.min(255,Math.round(u)||0))}function Ci(u){return u=Mi(u),(u<16?"0":"")+u.toString(16)}function MN(u,l,f,r){if(r<=0)u=l=f=NaN;else if(f<=0||f>=1)u=l=NaN;else if(l<=0)u=NaN;return new or(u,l,f,r)}function hN(u){if(u instanceof or)return new or(u.h,u.s,u.l,u.opacity);if(!(u instanceof Qc))u=dr(u);if(!u)return new or;if(u instanceof or)return u;u=u.rgb();var l=u.r/255,f=u.g/255,r=u.b/255,n=Math.min(l,f,r),i=Math.max(l,f,r),t=NaN,y=i-n,c=(i+n)/2;if(y){if(l===i)t=(f-r)/y+(f0&&c<1?0:t;return new or(t,y,c,u.opacity)}function xN(u,l,f,r){return arguments.length===1?hN(u):new or(u,l,f,r==null?1:r)}function or(u,l,f,r){this.h=+u,this.s=+l,this.l=+f,this.opacity=+r}Fc(or,xN,F5(Qc,{brighter(u){return u=u==null?E3:Math.pow(E3,u),new or(this.h,this.s,this.l*u,this.opacity)},darker(u){return u=u==null?Uc:Math.pow(Uc,u),new or(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,r=f+(f<0.5?f:1-f)*l,n=2*f-r;return new of(U5(u>=240?u-240:u+120,n,r),U5(u,n,r),U5(u<120?u+240:u-120,n,r),this.opacity)},clamp(){return new or(RN(this.h),z3(this.s),z3(this.l),O3(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=O3(this.opacity);return`${u===1?"hsl(":"hsla("}${RN(this.h)}, ${z3(this.s)*100}%, ${z3(this.l)*100}%${u===1?")":`, ${u})`}`}}));function RN(u){return u=(u||0)%360,u<0?u+360:u}function z3(u){return Math.max(0,Math.min(1,u||0))}function U5(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 J5(u,l,f,r,n){var i=u*u,t=i*u;return((1-3*u+3*i-t)*l+(4-6*i+3*t)*f+(1+3*u+3*i-3*t)*r+t*n)/6}function Q5(u){var l=u.length-1;return function(f){var r=f<=0?f=0:f>=1?(f=1,l-1):Math.floor(f*l),n=u[r],i=u[r+1],t=r>0?u[r-1]:2*n-i,y=r()=>u;function _B(u,l){return function(f){return u+f*l}}function $B(u,l,f){return u=Math.pow(u,f),l=Math.pow(l,f)-u,f=1/f,function(r){return Math.pow(u+r*l,f)}}function bN(u){return(u=+u)===1?H3:function(l,f){return f-l?$B(l,f,u):Nc(isNaN(l)?f:l)}}function H3(u,l){var f=l-u;return f?_B(u,f):Nc(isNaN(u)?l:u)}var Ri=function u(l){var f=bN(l);function r(n,i){var t=f((n=iy(n)).r,(i=iy(i)).r),y=f(n.g,i.g),c=f(n.b,i.b),$=H3(n.opacity,i.opacity);return function(A){return n.r=t(A),n.g=y(A),n.b=c(A),n.opacity=$(A),n+""}}return r.gamma=u,r}(1);function vN(u){return function(l){var f=l.length,r=Array(f),n=Array(f),i=Array(f),t,y;for(t=0;tf)if(i=l.slice(f,i),y[t])y[t]+=i;else y[++t]=i;if((r=r[0])===(n=n[0]))if(y[t])y[t]+=n;else y[++t]=n;else y[++t]=null,c.push({i:t,x:zf(r,n)});f=L5.lastIndex}if(f180)A+=360;else if(A-$>180)$+=360;F.push({i:j.push(n(j)+"rotate(",null,r)-2,x:zf($,A)})}else if(A)j.push(n(j)+"rotate("+A+r)}function y($,A,j,F){if($!==A)F.push({i:j.push(n(j)+"skewX(",null,r)-2,x:zf($,A)});else if(A)j.push(n(j)+"skewX("+A+r)}function c($,A,j,F,J,Q){if($!==j||A!==F){var W=J.push(n(J)+"scale(",null,",",null,")");Q.push({i:W-4,x:zf($,j)},{i:W-2,x:zf(A,F)})}else if(j!==1||F!==1)J.push(n(J)+"scale("+j+","+F+")")}return function($,A){var j=[],F=[];return $=u($),A=u(A),i($.translateX,$.translateY,A.translateX,A.translateY,j,F),t($.rotate,A.rotate,j,F),y($.skewX,A.skewX,j,F),c($.scaleX,$.scaleY,A.scaleX,A.scaleY,j,F),$=A=null,function(J){var Q=-1,W=F.length,L;while(++Q=0)u._call.call(void 0,l);u=u._next}--yy}function fq(){xi=(p3=Lc.now())+S3,yy=wc=0;try{iq()}finally{yy=0,VB(),xi=0}}function mB(){var u=Lc.now(),l=u-p3;if(l>rq)S3-=l,p3=u}function VB(){var u,l=D3,f,r=1/0;while(l)if(l._call){if(r>l._time)r=l._time;u=l,l=l._next}else f=l._next,l._next=null,l=u?u._next=f:D3=f;Wc=u,z5(r)}function z5(u){if(yy)return;if(wc)wc=clearTimeout(wc);var l=u-xi;if(l>24){if(u<1/0)wc=setTimeout(fq,u-Lc.now()-S3);if(qc)qc=clearInterval(qc)}else{if(!qc)p3=Lc.now(),qc=setInterval(mB,rq);yy=1,nq(fq)}}function Gc(u,l,f){var r=new Tc;return l=l==null?0:+l,r.restart((n)=>{r.stop(),u(n+l)},l,f),r}var pB=Yi("start","end","cancel","interrupt"),SB=[],cq=0,tq=1,P3=2,Y3=3,yq=4,C3=5,zc=6;function kn(u,l,f,r,n,i){var t=u.__transition;if(!t)u.__transition={};else if(f in t)return;XB(u,f,{name:l,index:r,group:n,on:pB,tween:SB,time:i.time,delay:i.delay,duration:i.duration,ease:i.ease,timer:null,state:cq})}function Ec(u,l){var f=uf(u,l);if(f.state>cq)throw Error("too late; already scheduled");return f}function Uf(u,l){var f=uf(u,l);if(f.state>Y3)throw Error("too late; already running");return f}function uf(u,l){var f=u.__transition;if(!f||!(f=f[l]))throw Error("transition not found");return f}function XB(u,l,f){var r=u.__transition,n;r[l]=f,f.timer=X3(i,0,f.time);function i($){if(f.state=tq,f.timer.restart(t,f.delay,f.time),f.delay<=$)t($-f.delay)}function t($){var A,j,F,J;if(f.state!==tq)return c();for(A in r){if(J=r[A],J.name!==f.name)continue;if(J.state===Y3)return Gc(t);if(J.state===yq)J.state=zc,J.timer.stop(),J.on.call("interrupt",u,u.__data__,J.index,J.group),delete r[A];else if(+AP3&&r.state=0)l=l.slice(0,f);return!l||l==="start"})}function fm(u,l,f){var r,n,i=lm(l)?Ec:Uf;return function(){var t=i(this,u),y=t.on;if(y!==r)(n=(r=y).copy()).on(l,f);t.on=n}}function X5(u,l){var f=this._id;return arguments.length<2?uf(this.node(),f).on.on(u):this.each(fm(f,u,l))}function rm(u){return function(){var l=this.parentNode;for(var f in this.__transition)if(+f!==u)return;if(l)l.removeChild(this)}}function Y5(){return this.on("end.remove",rm(this._id))}function P5(u){var l=this._name,f=this._id;if(typeof u!=="function")u=Y0(u);for(var r=this._groups,n=r.length,i=Array(n),t=0;t()=>u;function g5(u,{sourceEvent:l,target:f,transform:r,dispatch:n}){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:r,enumerable:!0,configurable:!0},_:{value:n}})}function er(u,l,f){this.k=u,this.x=l,this.y=f}er.prototype={constructor:er,scale:function(u){return u===1?this:new er(this.k*u,this.x,this.y)},translate:function(u,l){return u===0&l===0?this:new er(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 bi=new er(1,0,0);Hc.prototype=er.prototype;function Hc(u){while(!u.__zoom)if(!(u=u.parentNode))return bi;return u.__zoom}function a3(u){u.stopImmediatePropagation()}function vi(u){u.preventDefault(),u.stopImmediatePropagation()}function wm(u){return(!u.ctrlKey||u.type==="wheel")&&!u.button}function Wm(){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 Aq(){return this.__zoom||bi}function Lm(u){return-u.deltaY*(u.deltaMode===1?0.05:u.deltaMode?1:0.002)*(u.ctrlKey?10:1)}function Tm(){return navigator.maxTouchPoints||"ontouchstart"in this}function Km(u,l,f){var r=u.invertX(l[0][0])-f[0][0],n=u.invertX(l[1][0])-f[1][0],i=u.invertY(l[0][1])-f[0][1],t=u.invertY(l[1][1])-f[1][1];return u.translate(n>r?(r+n)/2:Math.min(0,r)||Math.max(0,n),t>i?(i+t)/2:Math.min(0,i)||Math.max(0,t))}function Bc(){var u=wm,l=Wm,f=Km,r=Lm,n=Tm,i=[0,1/0],t=[[-1/0,-1/0],[1/0,1/0]],y=250,c=hi,$=Yi("start","zoom","end"),A,j,F,J=500,Q=150,W=0,L=10;function U(O){O.property("__zoom",Aq).on("wheel.zoom",E,{passive:!1}).on("mousedown.zoom",V).on("dblclick.zoom",S).filter(n).on("touchstart.zoom",B).on("touchmove.zoom",D).on("touchend.zoom touchcancel.zoom",X).style("-webkit-tap-highlight-color","rgba(0,0,0,0)")}U.transform=function(O,Y,p,v){var z=O.selection?O.selection():O;if(z.property("__zoom",Aq),O!==z)G(O,Y,p,v);else z.interrupt().each(function(){Z(this,arguments).event(v).start().zoom(null,typeof Y==="function"?Y.apply(this,arguments):Y).end()})},U.scaleBy=function(O,Y,p,v){U.scaleTo(O,function(){var z=this.__zoom.k,P=typeof Y==="function"?Y.apply(this,arguments):Y;return z*P},p,v)},U.scaleTo=function(O,Y,p,v){U.transform(O,function(){var z=l.apply(this,arguments),P=this.__zoom,k=p==null?w(z):typeof p==="function"?p.apply(this,arguments):p,I=P.invert(k),b=typeof Y==="function"?Y.apply(this,arguments):Y;return f(N(q(P,b),k,I),z,t)},p,v)},U.translateBy=function(O,Y,p,v){U.transform(O,function(){return f(this.__zoom.translate(typeof Y==="function"?Y.apply(this,arguments):Y,typeof p==="function"?p.apply(this,arguments):p),l.apply(this,arguments),t)},null,v)},U.translateTo=function(O,Y,p,v,z){U.transform(O,function(){var P=l.apply(this,arguments),k=this.__zoom,I=v==null?w(P):typeof v==="function"?v.apply(this,arguments):v;return f(bi.translate(I[0],I[1]).scale(k.k).translate(typeof Y==="function"?-Y.apply(this,arguments):-Y,typeof p==="function"?-p.apply(this,arguments):-p),P,t)},v,z)};function q(O,Y){return Y=Math.max(i[0],Math.min(i[1],Y)),Y===O.k?O:new er(Y,O.x,O.y)}function N(O,Y,p){var v=Y[0]-p[0]*O.k,z=Y[1]-p[1]*O.k;return v===O.x&&z===O.y?O:new er(O.k,v,z)}function w(O){return[(+O[0][0]+ +O[1][0])/2,(+O[0][1]+ +O[1][1])/2]}function G(O,Y,p,v){O.on("start.zoom",function(){Z(this,arguments).event(v).start()}).on("interrupt.zoom end.zoom",function(){Z(this,arguments).event(v).end()}).tween("zoom",function(){var z=this,P=arguments,k=Z(z,P).event(v),I=l.apply(z,P),b=p==null?w(I):typeof p==="function"?p.apply(z,P):p,d=Math.max(I[1][0]-I[0][0],I[1][1]-I[0][1]),g=z.__zoom,x=typeof Y==="function"?Y.apply(z,P):Y,lu=c(g.invert(b).concat(d/g.k),x.invert(b).concat(d/x.k));return function(cu){if(cu===1)cu=x;else{var _u=lu(cu),Fu=d/_u[2];cu=new er(Fu,b[0]-_u[0]*Fu,b[1]-_u[1]*Fu)}k.zoom(null,cu)}})}function Z(O,Y,p){return!p&&O.__zooming||new H(O,Y)}function H(O,Y){this.that=O,this.args=Y,this.active=0,this.sourceEvent=null,this.extent=l.apply(O,Y),this.taps=0}H.prototype={event:function(O){if(O)this.sourceEvent=O;return this},start:function(){if(++this.active===1)this.that.__zooming=this,this.emit("start");return this},zoom:function(O,Y){if(this.mouse&&O!=="mouse")this.mouse[1]=Y.invert(this.mouse[0]);if(this.touch0&&O!=="touch")this.touch0[1]=Y.invert(this.touch0[0]);if(this.touch1&&O!=="touch")this.touch1[1]=Y.invert(this.touch1[0]);return this.that.__zoom=Y,this.emit("zoom"),this},end:function(){if(--this.active===0)delete this.that.__zooming,this.emit("end");return this},emit:function(O){var Y=el(this.that).datum();$.call(O,this.that,new g5(O,{sourceEvent:this.sourceEvent,target:U,type:O,transform:this.that.__zoom,dispatch:$}),Y)}};function E(O,...Y){if(!u.apply(this,arguments))return;var p=Z(this,Y).event(O),v=this.__zoom,z=Math.max(i[0],Math.min(i[1],v.k*Math.pow(2,r.apply(this,arguments)))),P=Gf(O);if(p.wheel){if(p.mouse[0][0]!==P[0]||p.mouse[0][1]!==P[1])p.mouse[1]=v.invert(p.mouse[0]=P);clearTimeout(p.wheel)}else if(v.k===z)return;else p.mouse=[P,v.invert(P)],C0(this),p.start();vi(O),p.wheel=setTimeout(k,Q),p.zoom("mouse",f(N(q(v,z),p.mouse[0],p.mouse[1]),p.extent,t));function k(){p.wheel=null,p.end()}}function V(O,...Y){if(F||!u.apply(this,arguments))return;var p=O.currentTarget,v=Z(this,Y,!0).event(O),z=el(O.view).on("mousemove.zoom",b,!0).on("mouseup.zoom",d,!0),P=Gf(O,p),k=O.clientX,I=O.clientY;ry(O.view),a3(O),v.mouse=[P,this.__zoom.invert(P)],C0(this),v.start();function b(g){if(vi(g),!v.moved){var x=g.clientX-k,lu=g.clientY-I;v.moved=x*x+lu*lu>W}v.event(g).zoom("mouse",f(N(v.that.__zoom,v.mouse[0]=Gf(g,p),v.mouse[1]),v.extent,t))}function d(g){z.on("mousemove.zoom mouseup.zoom",null),_c(g.view,v.moved),vi(g),v.event(g).end()}}function S(O,...Y){if(!u.apply(this,arguments))return;var p=this.__zoom,v=Gf(O.changedTouches?O.changedTouches[0]:O,this),z=p.invert(v),P=p.k*(O.shiftKey?0.5:2),k=f(N(q(p,P),v,z),l.apply(this,Y),t);if(vi(O),y>0)el(this).transition().duration(y).call(G,k,v,O);else el(this).call(U.transform,k,v,O)}function B(O,...Y){if(!u.apply(this,arguments))return;var p=O.touches,v=p.length,z=Z(this,Y,O.changedTouches.length===v).event(O),P,k,I,b;a3(O);for(k=0;k"[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:r})=>`Couldn't create edge for ${u} handle id: "${u==="source"?f:r}", 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."},Fy=[[Number.NEGATIVE_INFINITY,Number.NEGATIVE_INFINITY],[Number.POSITIVE_INFINITY,Number.POSITIVE_INFINITY]],e5=["Enter"," ","Escape"],u9={"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"},h0;(function(u){u.Strict="strict",u.Loose="loose"})(h0||(h0={}));var gn;(function(u){u.Free="free",u.Vertical="vertical",u.Horizontal="horizontal"})(gn||(gn={}));var ki;(function(u){u.Partial="partial",u.Full="full"})(ki||(ki={}));var l9={inProgress:!1,isValid:null,from:null,fromHandle:null,fromPosition:null,fromNode:null,to:null,toHandle:null,toPosition:null,toNode:null,pointer:null},Nn;(function(u){u.Bezier="default",u.Straight="straight",u.Step="step",u.SmoothStep="smoothstep",u.SimpleBezier="simplebezier"})(Nn||(Nn={}));var x0;(function(u){u.Arrow="arrow",u.ArrowClosed="arrowclosed"})(x0||(x0={}));var Ku;(function(u){u.Left="left",u.Top="top",u.Right="right",u.Bottom="bottom"})(Ku||(Ku={}));var jq={[Ku.Left]:Ku.Right,[Ku.Right]:Ku.Left,[Ku.Top]:Ku.Bottom,[Ku.Bottom]:Ku.Top};function f9(u){return u===null?null:u?"valid":"invalid"}var r9=(u)=>("id"in u)&&("source"in u)&&("target"in u),zq=(u)=>("id"in u)&&("position"in u)&&!("source"in u)&&!("target"in u),n9=(u)=>("id"in u)&&("internals"in u)&&!("source"in u)&&!("target"in u);var Dc=(u,l=[0,0])=>{let{width:f,height:r}=qn(u),n=u.origin??l,i=f*n[0],t=r*n[1];return{x:u.position.x-i,y:u.position.y-t}},i9=(u,l={nodeOrigin:[0,0]})=>{if(u.length===0)return{x:0,y:0,width:0,height:0};let f=u.reduce((r,n)=>{let i=typeof n==="string",t=!l.nodeLookup&&!i?n:void 0;if(l.nodeLookup)t=i?l.nodeLookup.get(n):!n9(n)?l.nodeLookup.get(n.id):n;let y=t?e3(t,l.nodeOrigin):{x:0,y:0,x2:0,y2:0};return lA(r,y)},{x:1/0,y:1/0,x2:-1/0,y2:-1/0});return fA(f)},Uy=(u,l={})=>{let f={x:1/0,y:1/0,x2:-1/0,y2:-1/0},r=!1;return u.forEach((n)=>{if(l.filter===void 0||l.filter(n))f=lA(f,e3(n)),r=!0}),r?fA(f):{x:0,y:0,width:0,height:0}},uA=(u,l,[f,r,n]=[0,0,1],i=!1,t=!1)=>{let y={...Ny(l,[f,r,n]),width:l.width/n,height:l.height/n},c=[];for(let $ of u.values()){let{measured:A,selectable:j=!0,hidden:F=!1}=$;if(t&&!j||F)continue;let J=A.width??$.width??$.initialWidth??null,Q=A.height??$.height??$.initialHeight??null,W=Jy(y,gi($)),L=(J??0)*(Q??0),U=i&&W>0;if(!$.internals.handleBounds||U||W>=L||$.dragging)c.push($)}return c},Eq=(u,l)=>{let f=new Set;return u.forEach((r)=>{f.add(r.id)}),l.filter((r)=>f.has(r.source)||f.has(r.target))};function Gm(u,l){let f=new Map,r=l?.nodes?new Set(l.nodes.map((n)=>n.id)):null;return u.forEach((n)=>{if(n.measured.width&&n.measured.height&&(l?.includeHiddenNodes||!n.hidden)&&(!r||r.has(n.id)))f.set(n.id,n)}),f}async function Oq({nodes:u,width:l,height:f,panZoom:r,minZoom:n,maxZoom:i},t){if(u.size===0)return Promise.resolve(!0);let y=Gm(u,t),c=Uy(y),$=pc(c,l,f,t?.minZoom??n,t?.maxZoom??i,t?.padding??0.1);return await r.setViewport($,{duration:t?.duration,ease:t?.ease,interpolate:t?.interpolate}),Promise.resolve(!0)}function t9({nodeId:u,nextPosition:l,nodeLookup:f,nodeOrigin:r=[0,0],nodeExtent:n,onError:i}){let t=f.get(u),y=t.parentId?f.get(t.parentId):void 0,{x:c,y:$}=y?y.internals.positionAbsolute:{x:0,y:0},A=t.origin??r,j=t.extent||n;if(t.extent==="parent"&&!t.expandParent)if(!y)i?.("005",Qr.error005());else{let J=y.measured.width,Q=y.measured.height;if(J&&Q)j=[[c,$],[c+J,$+Q]]}else if(y&&jy(t.extent))j=[[t.extent[0][0]+c,t.extent[0][1]+$],[t.extent[1][0]+c,t.extent[1][1]+$]];let F=jy(j)?Ii(l,j,t.measured):l;if(t.measured.width===void 0||t.measured.height===void 0)i?.("015",Qr.error015());return{position:{x:F.x-c+(t.measured.width??0)*A[0],y:F.y-$+(t.measured.height??0)*A[1]},positionAbsolute:F}}async function Zq({nodesToRemove:u=[],edgesToRemove:l=[],nodes:f,edges:r,onBeforeDelete:n}){let i=new Set(u.map((F)=>F.id)),t=[];for(let F of f){if(F.deletable===!1)continue;let J=i.has(F.id),Q=!J&&F.parentId&&t.find((W)=>W.id===F.parentId);if(J||Q)t.push(F)}let y=new Set(l.map((F)=>F.id)),c=r.filter((F)=>F.deletable!==!1),A=Eq(t,c);for(let F of c)if(y.has(F.id)&&!A.find((Q)=>Q.id===F.id))A.push(F);if(!n)return{edges:A,nodes:t};let j=await n({nodes:t,edges:A});if(typeof j==="boolean")return j?{edges:A,nodes:t}:{edges:[],nodes:[]};return j}var Ay=(u,l=0,f=1)=>Math.min(Math.max(u,l),f),Ii=(u={x:0,y:0},l,f)=>({x:Ay(u.x,l[0][0],l[1][0]-(f?.width??0)),y:Ay(u.y,l[0][1],l[1][1]-(f?.height??0))});function Hq(u,l,f){let{width:r,height:n}=qn(f),{x:i,y:t}=f.internals.positionAbsolute;return Ii(u,[[i,t],[i+r,t+n]],l)}var Fq=(u,l,f)=>{if(uf)return-Ay(Math.abs(u-f),1,l)/l;return 0},Bq=(u,l,f=15,r=40)=>{let n=Fq(u.x,r,l.width-r)*f,i=Fq(u.y,r,l.height-r)*f;return[n,i]},lA=(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)}),d5=({x:u,y:l,width:f,height:r})=>({x:u,y:l,x2:u+f,y2:l+r}),fA=({x:u,y:l,x2:f,y2:r})=>({x:u,y:l,width:f-u,height:r-l}),gi=(u,l=[0,0])=>{let{x:f,y:r}=n9(u)?u.internals.positionAbsolute:Dc(u,l);return{x:f,y:r,width:u.measured?.width??u.width??u.initialWidth??0,height:u.measured?.height??u.height??u.initialHeight??0}},e3=(u,l=[0,0])=>{let{x:f,y:r}=n9(u)?u.internals.positionAbsolute:Dc(u,l);return{x:f,y:r,x2:f+(u.measured?.width??u.width??u.initialWidth??0),y2:r+(u.measured?.height??u.height??u.initialHeight??0)}},y9=(u,l)=>fA(lA(d5(u),d5(l))),Jy=(u,l)=>{let f=Math.max(0,Math.min(u.x+u.width,l.x+l.width)-Math.max(u.x,l.x)),r=Math.max(0,Math.min(u.y+u.height,l.y+l.height)-Math.max(u.y,l.y));return Math.ceil(f*r)},c9=(u)=>Br(u.width)&&Br(u.height)&&Br(u.x)&&Br(u.y),Br=(u)=>!isNaN(u)&&isFinite(u),_9=(u,l)=>{},Qy=(u,l=[1,1])=>{return{x:l[0]*Math.round(u.x/l[0]),y:l[1]*Math.round(u.y/l[1])}},Ny=({x:u,y:l},[f,r,n],i=!1,t=[1,1])=>{let y={x:(u-f)/n,y:(l-r)/n};return i?Qy(y,t):y},Vc=({x:u,y:l},[f,r,n])=>{return{x:u*n+f,y:l*n+r}};function _y(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 zm(u,l,f){if(typeof u==="string"||typeof u==="number"){let r=_y(u,f),n=_y(u,l);return{top:r,right:n,bottom:r,left:n,x:n*2,y:r*2}}if(typeof u==="object"){let r=_y(u.top??u.y??0,f),n=_y(u.bottom??u.y??0,f),i=_y(u.left??u.x??0,l),t=_y(u.right??u.x??0,l);return{top:r,right:t,bottom:n,left:i,x:i+t,y:r+n}}return{top:0,right:0,bottom:0,left:0,x:0,y:0}}function Em(u,l,f,r,n,i){let{x:t,y}=Vc(u,[l,f,r]),{x:c,y:$}=Vc({x:u.x+u.width,y:u.y+u.height},[l,f,r]),A=n-c,j=i-$;return{left:Math.floor(t),top:Math.floor(y),right:Math.floor(A),bottom:Math.floor(j)}}var pc=(u,l,f,r,n,i)=>{let t=zm(i,l,f),y=(l-t.x)/u.width,c=(f-t.y)/u.height,$=Math.min(y,c),A=Ay($,r,n),j=u.x+u.width/2,F=u.y+u.height/2,J=l/2-j*A,Q=f/2-F*A,W=Em(u,J,Q,A,l,f),L={left:Math.min(W.left-t.left,0),top:Math.min(W.top-t.top,0),right:Math.min(W.right-t.right,0),bottom:Math.min(W.bottom-t.bottom,0)};return{x:J-L.left+L.right,y:Q-L.top+L.bottom,zoom:A}},qy=()=>typeof navigator<"u"&&navigator?.userAgent?.indexOf("Mac")>=0;function jy(u){return u!==void 0&&u!==null&&u!=="parent"}function qn(u){return{width:u.measured?.width??u.width??u.initialWidth??0,height:u.measured?.height??u.height??u.initialHeight??0}}function $9(u){return(u.measured?.width??u.width??u.initialWidth)!==void 0&&(u.measured?.height??u.height??u.initialHeight)!==void 0}function A9(u,l={width:0,height:0},f,r,n){let i={...u},t=r.get(f);if(t){let y=t.origin||n;i.x+=t.internals.positionAbsolute.x-(l.width??0)*y[0],i.y+=t.internals.positionAbsolute.y-(l.height??0)*y[1]}return i}function j9(u,l){if(u.size!==l.size)return!1;for(let f of u)if(!l.has(f))return!1;return!0}function mq(){let u,l;return{promise:new Promise((r,n)=>{u=r,l=n}),resolve:u,reject:l}}function Vq(u){return{...u9,...u||{}}}function mc(u,{snapGrid:l=[0,0],snapToGrid:f=!1,transform:r,containerBounds:n}){let{x:i,y:t}=mr(u),y=Ny({x:i-(n?.left??0),y:t-(n?.top??0)},r),{x:c,y:$}=f?Qy(y,l):y;return{xSnapped:c,ySnapped:$,...y}}var rA=(u)=>({width:u.offsetWidth,height:u.offsetHeight}),F9=(u)=>u?.getRootNode?.()||window?.document,Om=["INPUT","SELECT","TEXTAREA"];function U9(u){let l=u.composedPath?.()?.[0]||u.target;if(l?.nodeType!==1)return!1;return Om.includes(l.nodeName)||l.hasAttribute("contenteditable")||!!l.closest(".nokey")}var J9=(u)=>("clientX"in u),mr=(u,l)=>{let f=J9(u),r=f?u.clientX:u.touches?.[0].clientX,n=f?u.clientY:u.touches?.[0].clientY;return{x:r-(l?.left??0),y:n-(l?.top??0)}},Uq=(u,l,f,r,n)=>{let i=l.querySelectorAll(`.${u}`);if(!i||!i.length)return null;return Array.from(i).map((t)=>{let y=t.getBoundingClientRect();return{id:t.getAttribute("data-handleid"),type:u,nodeId:n,position:t.getAttribute("data-handlepos"),x:(y.left-f.left)/r,y:(y.top-f.top)/r,...rA(t)}})};function nA({sourceX:u,sourceY:l,targetX:f,targetY:r,sourceControlX:n,sourceControlY:i,targetControlX:t,targetControlY:y}){let c=u*0.125+n*0.375+t*0.375+f*0.125,$=l*0.125+i*0.375+y*0.375+r*0.125,A=Math.abs(c-u),j=Math.abs($-l);return[c,$,A,j]}function o3(u,l){if(u>=0)return 0.5*u;return l*25*Math.sqrt(-u)}function Jq({pos:u,x1:l,y1:f,x2:r,y2:n,c:i}){switch(u){case Ku.Left:return[l-o3(l-r,i),f];case Ku.Right:return[l+o3(r-l,i),f];case Ku.Top:return[l,f-o3(f-n,i)];case Ku.Bottom:return[l,f+o3(n-f,i)]}}function iA({sourceX:u,sourceY:l,sourcePosition:f=Ku.Bottom,targetX:r,targetY:n,targetPosition:i=Ku.Top,curvature:t=0.25}){let[y,c]=Jq({pos:f,x1:u,y1:l,x2:r,y2:n,c:t}),[$,A]=Jq({pos:i,x1:r,y1:n,x2:u,y2:l,c:t}),[j,F,J,Q]=nA({sourceX:u,sourceY:l,targetX:r,targetY:n,sourceControlX:y,sourceControlY:c,targetControlX:$,targetControlY:A});return[`M${u},${l} C${y},${c} ${$},${A} ${r},${n}`,j,F,J,Q]}function Q9({sourceX:u,sourceY:l,targetX:f,targetY:r}){let n=Math.abs(f-u)/2,i=f0}var Zm=({source:u,sourceHandle:l,target:f,targetHandle:r})=>`xy-edge__${u}${l||""}-${f}${r||""}`,Hm=(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))},N9=(u,l,f={})=>{if(!u.source||!u.target)return _9("006",Qr.error006()),l;let r=f.getEdgeId||Zm,n;if(r9(u))n={...u};else n={...u,id:r(u)};if(Hm(n,l))return l;if(n.sourceHandle===null)delete n.sourceHandle;if(n.targetHandle===null)delete n.targetHandle;return l.concat(n)};function tA({sourceX:u,sourceY:l,targetX:f,targetY:r}){let[n,i,t,y]=Q9({sourceX:u,sourceY:l,targetX:f,targetY:r});return[`M ${u},${l}L ${f},${r}`,n,i,t,y]}var Qq={[Ku.Left]:{x:-1,y:0},[Ku.Right]:{x:1,y:0},[Ku.Top]:{x:0,y:-1},[Ku.Bottom]:{x:0,y:1}},Bm=({source:u,sourcePosition:l=Ku.Bottom,target:f})=>{if(l===Ku.Left||l===Ku.Right)return u.xMath.sqrt(Math.pow(l.x-u.x,2)+Math.pow(l.y-u.y,2));function mm({source:u,sourcePosition:l=Ku.Bottom,target:f,targetPosition:r=Ku.Top,center:n,offset:i,stepPosition:t}){let y=Qq[l],c=Qq[r],$={x:u.x+y.x*i,y:u.y+y.y*i},A={x:f.x+c.x*i,y:f.y+c.y*i},j=Bm({source:$,sourcePosition:l,target:A}),F=j.x!==0?"x":"y",J=j[F],Q=[],W,L,U={x:0,y:0},q={x:0,y:0},[,,N,w]=Q9({sourceX:u.x,sourceY:u.y,targetX:f.x,targetY:f.y});if(y[F]*c[F]===-1){if(F==="x")W=n.x??$.x+(A.x-$.x)*t,L=n.y??($.y+A.y)/2;else W=n.x??($.x+A.x)/2,L=n.y??$.y+(A.y-$.y)*t;let E=[{x:W,y:$.y},{x:W,y:A.y}],V=[{x:$.x,y:L},{x:A.x,y:L}];if(y[F]===J)Q=F==="x"?E:V;else Q=F==="x"?V:E}else{let E=[{x:$.x,y:A.y}],V=[{x:A.x,y:$.y}];if(F==="x")Q=y.x===J?V:E;else Q=y.y===J?E:V;if(l===r){let O=Math.abs(u[F]-f[F]);if(O<=i){let Y=Math.min(i-1,i-O);if(y[F]===J)U[F]=($[F]>u[F]?-1:1)*Y;else q[F]=(A[F]>f[F]?-1:1)*Y}}if(l!==r){let O=F==="x"?"y":"x",Y=y[F]===c[O],p=$[O]>A[O],v=$[O]=X)W=(S.x+B.x)/2,L=Q[0].y;else W=Q[0].x,L=(S.y+B.y)/2}let G={x:$.x+U.x,y:$.y+U.y},Z={x:A.x+q.x,y:A.y+q.y};return[[u,...G.x!==Q[0].x||G.y!==Q[0].y?[G]:[],...Q,...Z.x!==Q[Q.length-1].x||Z.y!==Q[Q.length-1].y?[Z]:[],f],W,L,N,w]}function Vm(u,l,f,r){let n=Math.min(Nq(u,l)/2,Nq(l,f)/2,r),{x:i,y:t}=l;if(u.x===i&&i===f.x||u.y===t&&t===f.y)return`L${i} ${t}`;if(u.y===t){let $=u.xf.id===l))||null}function yA(u,l){if(!u)return"";if(typeof u==="string")return u;return`${l?`${l}__`:""}${Object.keys(u).sort().map((r)=>`${r}=${u[r]}`).join("&")}`}function Xq(u,{id:l,defaultColor:f,defaultMarkerStart:r,defaultMarkerEnd:n}){let i=new Set;return u.reduce((t,y)=>{return[y.markerStart||r,y.markerEnd||n].forEach((c)=>{if(c&&typeof c==="object"){let $=yA(c,l);if(!i.has($))t.push({id:$,color:c.color||f,...c}),i.add($)}}),t},[]).sort((t,y)=>t.id.localeCompare(y.id))}var Yq=1000,Dm=10,q9={nodeOrigin:[0,0],nodeExtent:Fy,elevateNodesOnSelect:!0,zIndexMode:"basic",defaults:{}},pm={...q9,checkEquality:!0};function w9(u,l){let f={...u};for(let r in l)if(l[r]!==void 0)f[r]=l[r];return f}function Pq(u,l,f){let r=w9(q9,f);for(let n of u.values())if(n.parentId)L9(n,u,l,r);else{let i=Dc(n,r.nodeOrigin),t=jy(n.extent)?n.extent:r.nodeExtent,y=Ii(i,t,qn(n));n.internals.positionAbsolute=y}}function Sm(u,l){if(!u.handles)return!u.measured?void 0:l?.internals.handleBounds;let f=[],r=[];for(let n of u.handles){let i={id:n.id,width:n.width??1,height:n.height??1,nodeId:u.id,x:n.x,y:n.y,position:n.position,type:n.type};if(n.type==="source")f.push(i);else if(n.type==="target")r.push(i)}return{source:f,target:r}}function W9(u){return u==="manual"}function cA(u,l,f,r={}){let n=w9(pm,r),i={i:0},t=new Map(l),y=n?.elevateNodesOnSelect&&!W9(n.zIndexMode)?Yq:0,c=u.length>0,$=!1;l.clear(),f.clear();for(let A of u){let j=t.get(A.id);if(n.checkEquality&&A===j?.internals.userNode)l.set(A.id,j);else{let F=Dc(A,n.nodeOrigin),J=jy(A.extent)?A.extent:n.nodeExtent,Q=Ii(F,J,qn(A));j={...n.defaults,...A,measured:{width:A.measured?.width,height:A.measured?.height},internals:{positionAbsolute:Q,handleBounds:Sm(A,j),z:Cq(A,y,n.zIndexMode),userNode:A}},l.set(A.id,j)}if((j.measured===void 0||j.measured.width===void 0||j.measured.height===void 0)&&!j.hidden)c=!1;if(A.parentId)L9(j,l,f,r,i);$||=A.selected??!1}return{nodesInitialized:c,hasSelectedNodes:$}}function Xm(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 L9(u,l,f,r,n){let{elevateNodesOnSelect:i,nodeOrigin:t,nodeExtent:y,zIndexMode:c}=w9(q9,r),$=u.parentId,A=l.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(Xm(u,f),n&&!A.parentId&&A.internals.rootParentIndex===void 0&&c==="auto")A.internals.rootParentIndex=++n.i,A.internals.z=A.internals.z+n.i*Dm;if(n&&A.internals.rootParentIndex!==void 0)n.i=A.internals.rootParentIndex;let j=i&&!W9(c)?Yq:0,{x:F,y:J,z:Q}=Ym(u,A,t,y,j,c),{positionAbsolute:W}=u.internals,L=F!==W.x||J!==W.y;if(L||Q!==u.internals.z)l.set(u.id,{...u,internals:{...u.internals,positionAbsolute:L?{x:F,y:J}:W,z:Q}})}function Cq(u,l,f){let r=Br(u.zIndex)?u.zIndex:0;if(W9(f))return r;return r+(u.selected?l:0)}function Ym(u,l,f,r,n,i){let{x:t,y}=l.internals.positionAbsolute,c=qn(u),$=Dc(u,f),A=jy(u.extent)?Ii($,u.extent,c):$,j=Ii({x:t+A.x,y:y+A.y},r,c);if(u.extent==="parent")j=Hq(j,c,l);let F=Cq(u,n,i),J=l.internals.z??0;return{x:j.x,y:j.y,z:J>=F?J+1:F}}function _A(u,l,f,r=[0,0]){let n=[],i=new Map;for(let t of u){let y=l.get(t.parentId);if(!y)continue;let c=i.get(t.parentId)?.expandedRect??gi(y),$=y9(c,t.rect);i.set(t.parentId,{expandedRect:$,parent:y})}if(i.size>0)i.forEach(({expandedRect:t,parent:y},c)=>{let $=y.internals.positionAbsolute,A=qn(y),j=y.origin??r,F=t.x<$.x?Math.round(Math.abs($.x-t.x)):0,J=t.y<$.y?Math.round(Math.abs($.y-t.y)):0,Q=Math.max(A.width,Math.round(t.width)),W=Math.max(A.height,Math.round(t.height)),L=(Q-A.width)*j[0],U=(W-A.height)*j[1];if(F>0||J>0||L||U)n.push({id:c,type:"position",position:{x:y.position.x-F+L,y:y.position.y-J+U}}),f.get(c)?.forEach((q)=>{if(!u.some((N)=>N.id===q.id))n.push({id:q.id,type:"position",position:{x:q.position.x+F,y:q.position.y+J}})});if(A.width0){let J=_A(F,l,f,n);$.push(...J)}return{changes:$,updatedInternals:c}}async function Rq({delta:u,panZoom:l,transform:f,translateExtent:r,width:n,height:i}){if(!l||!u.x&&!u.y)return Promise.resolve(!1);let t=await l.setViewportConstrained({x:f[0]+u.x,y:f[1]+u.y,zoom:f[2]},[[0,0],[n,i]],r),y=!!t&&(t.x!==f[0]||t.y!==f[1]||t.k!==f[2]);return Promise.resolve(y)}function Lq(u,l,f,r,n,i){let t=n,y=r.get(t)||new Map;r.set(t,y.set(f,l)),t=`${n}-${u}`;let c=r.get(t)||new Map;if(r.set(t,c.set(f,l)),i){t=`${n}-${u}-${i}`;let $=r.get(t)||new Map;r.set(t,$.set(f,l))}}function T9(u,l,f){u.clear(),l.clear();for(let r of f){let{source:n,target:i,sourceHandle:t=null,targetHandle:y=null}=r,c={edgeId:r.id,source:n,target:i,sourceHandle:t,targetHandle:y},$=`${n}-${t}--${i}-${y}`,A=`${i}-${y}--${n}-${t}`;Lq("source",c,A,u,n,t),Lq("target",c,$,u,i,y),l.set(r.id,r)}}function hq(u,l){if(!u.parentId)return!1;let f=l.get(u.parentId);if(!f)return!1;if(f.selected)return!0;return hq(f,l)}function Tq(u,l,f){let r=u;do{if(r?.matches?.(l))return!0;if(r===f)return!1;r=r?.parentElement}while(r);return!1}function Pm(u,l,f,r){let n=new Map;for(let[i,t]of u)if((t.selected||t.id===r)&&(!t.parentId||!hq(t,u))&&(t.draggable||l&&typeof t.draggable>"u")){let y=u.get(i);if(y)n.set(i,{id:i,position:y.position||{x:0,y:0},distance:{x:f.x-y.internals.positionAbsolute.x,y:f.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 s5({nodeId:u,dragItems:l,nodeLookup:f,dragging:r=!0}){let n=[];for(let[t,y]of l){let c=f.get(t)?.internals.userNode;if(c)n.push({...c,position:y.position,dragging:r})}if(!u)return[n[0],n];let i=f.get(u)?.internals.userNode;return[!i?n[0]:{...i,position:l.get(u)?.position||i.position,dragging:r},n]}function Cm({dragItems:u,snapGrid:l,x:f,y:r}){let n=u.values().next().value;if(!n)return null;let i={x:f-n.distance.x,y:r-n.distance.y},t=Qy(i,l);return{x:t.x-i.x,y:t.y-i.y}}function xq({onNodeMouseDown:u,getStoreItems:l,onDragStart:f,onDrag:r,onDragStop:n}){let i={x:null,y:null},t=0,y=new Map,c=!1,$={x:0,y:0},A=null,j=!1,F=null,J=!1,Q=!1,W=null;function L({noDragClassName:q,handleSelector:N,domNode:w,isSelectable:G,nodeId:Z,nodeClickDistance:H=0}){F=el(w);function E({x:D,y:X}){let{nodeLookup:O,nodeExtent:Y,snapGrid:p,snapToGrid:v,nodeOrigin:z,onNodeDrag:P,onSelectionDrag:k,onError:I,updateNodePositions:b}=l();i={x:D,y:X};let d=!1,g=y.size>1,x=g&&Y?d5(Uy(y)):null,lu=g&&v?Cm({dragItems:y,snapGrid:p,x:D,y:X}):null;for(let[cu,_u]of y){if(!O.has(cu))continue;let Fu={x:D-_u.distance.x,y:X-_u.distance.y};if(v)Fu=lu?{x:Math.round(Fu.x+lu.x),y:Math.round(Fu.y+lu.y)}:Qy(Fu,p);let zu=null;if(g&&Y&&!_u.extent&&x){let{positionAbsolute:e}=_u.internals,uu=e.x-x.x+Y[0][0],Gu=e.x+_u.measured.width-x.x2+Y[1][0],s=e.y-x.y+Y[0][1],qu=e.y+_u.measured.height-x.y2+Y[1][1];zu=[[uu,s],[Gu,qu]]}let{position:Wu,positionAbsolute:C}=t9({nodeId:cu,nextPosition:Fu,nodeLookup:O,nodeExtent:zu?zu:Y,nodeOrigin:z,onError:I});d=d||_u.position.x!==Wu.x||_u.position.y!==Wu.y,_u.position=Wu,_u.internals.positionAbsolute=C}if(Q=Q||d,!d)return;if(b(y,!0),W&&(r||P||!Z&&k)){let[cu,_u]=s5({nodeId:Z,dragItems:y,nodeLookup:O});if(r?.(W,y,cu,_u),P?.(W,cu,_u),!Z)k?.(W,_u)}}async function V(){if(!A)return;let{transform:D,panBy:X,autoPanSpeed:O,autoPanOnNodeDrag:Y}=l();if(!Y){c=!1,cancelAnimationFrame(t);return}let[p,v]=Bq($,A,O);if(p!==0||v!==0){if(i.x=(i.x??0)-p/D[2],i.y=(i.y??0)-v/D[2],await X({x:p,y:v}))E(i)}t=requestAnimationFrame(V)}function S(D){let{nodeLookup:X,multiSelectionActive:O,nodesDraggable:Y,transform:p,snapGrid:v,snapToGrid:z,selectNodesOnDrag:P,onNodeDragStart:k,onSelectionDragStart:I,unselectNodesAndEdges:b}=l();if(j=!0,(!P||!G)&&!O&&Z){if(!X.get(Z)?.selected)b()}if(G&&P&&Z)u?.(Z);let d=mc(D.sourceEvent,{transform:p,snapGrid:v,snapToGrid:z,containerBounds:A});if(i=d,y=Pm(X,Y,d,Z),y.size>0&&(f||k||!Z&&I)){let[g,x]=s5({nodeId:Z,dragItems:y,nodeLookup:X});if(f?.(D.sourceEvent,y,g,x),k?.(D.sourceEvent,g,x),!Z)I?.(D.sourceEvent,x)}}let B=jc().clickDistance(H).on("start",(D)=>{let{domNode:X,nodeDragThreshold:O,transform:Y,snapGrid:p,snapToGrid:v}=l();if(A=X?.getBoundingClientRect()||null,J=!1,Q=!1,W=D.sourceEvent,O===0)S(D);i=mc(D.sourceEvent,{transform:Y,snapGrid:p,snapToGrid:v,containerBounds:A}),$=mr(D.sourceEvent,A)}).on("drag",(D)=>{let{autoPanOnNodeDrag:X,transform:O,snapGrid:Y,snapToGrid:p,nodeDragThreshold:v,nodeLookup:z}=l(),P=mc(D.sourceEvent,{transform:O,snapGrid:Y,snapToGrid:p,containerBounds:A});if(W=D.sourceEvent,D.sourceEvent.type==="touchmove"&&D.sourceEvent.touches.length>1||Z&&!z.has(Z))J=!0;if(J)return;if(!c&&X&&j)c=!0,V();if(!j){let k=mr(D.sourceEvent,A),I=k.x-$.x,b=k.y-$.y;if(Math.sqrt(I*I+b*b)>v)S(D)}if((i.x!==P.xSnapped||i.y!==P.ySnapped)&&y&&j)$=mr(D.sourceEvent,A),E(P)}).on("end",(D)=>{if(!j||J)return;if(c=!1,j=!1,cancelAnimationFrame(t),y.size>0){let{nodeLookup:X,updateNodePositions:O,onNodeDragStop:Y,onSelectionDragStop:p}=l();if(Q)O(y,!1),Q=!1;if(n||Y||!Z&&p){let[v,z]=s5({nodeId:Z,dragItems:y,nodeLookup:X,dragging:!1});if(n?.(D.sourceEvent,y,v,z),Y?.(D.sourceEvent,v,z),!Z)p?.(D.sourceEvent,z)}}}).filter((D)=>{let X=D.target;return!D.button&&(!q||!Tq(X,`.${q}`,w))&&(!N||Tq(X,N,w))});F.call(B)}function U(){F?.on(".drag",null)}return{update:L,destroy:U}}function Mm(u,l,f){let r=[],n={x:u.x-f,y:u.y-f,width:f*2,height:f*2};for(let i of l.values())if(Jy(n,gi(i))>0)r.push(i);return r}var Rm=250;function hm(u,l,f,r){let n=[],i=1/0,t=Mm(u,f,l+Rm);for(let y of t){let c=[...y.internals.handleBounds?.source??[],...y.internals.handleBounds?.target??[]];for(let $ of c){if(r.nodeId===$.nodeId&&r.type===$.type&&r.id===$.id)continue;let{x:A,y:j}=b0(y,$,$.position,!0),F=Math.sqrt(Math.pow(A-u.x,2)+Math.pow(j-u.y,2));if(F>l)continue;if(F1){let y=r.type==="source"?"target":"source";return n.find((c)=>c.type===y)??n[0]}return n[0]}function bq(u,l,f,r,n,i=!1){let t=r.get(u);if(!t)return null;let y=n==="strict"?t.internals.handleBounds?.[l]:[...t.internals.handleBounds?.source??[],...t.internals.handleBounds?.target??[]],c=(f?y?.find(($)=>$.id===f):y?.[0])??null;return c&&i?{...c,...b0(t,c,c.position,!0)}:c}function vq(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 xm(u,l){let f=null;if(l)f=!0;else if(u&&!l)f=!1;return f}var kq=()=>!0;function bm(u,{connectionMode:l,connectionRadius:f,handleId:r,nodeId:n,edgeUpdaterType:i,isTarget:t,domNode:y,nodeLookup:c,lib:$,autoPanOnConnect:A,flowId:j,panBy:F,cancelConnection:J,onConnectStart:Q,onConnect:W,onConnectEnd:L,isValidConnection:U=kq,onReconnectEnd:q,updateConnection:N,getTransform:w,getFromHandle:G,autoPanSpeed:Z,dragThreshold:H=1,handleDomNode:E}){let V=F9(u.target),S=0,B,{x:D,y:X}=mr(u),O=vq(i,E),Y=y?.getBoundingClientRect(),p=!1;if(!Y||!O)return;let v=bq(n,O,r,c,l);if(!v)return;let z=mr(u,Y),P=!1,k=null,I=!1,b=null;function d(){if(!A||!Y)return;let[Wu,C]=Bq(z,Y,Z);F({x:Wu,y:C}),S=requestAnimationFrame(d)}let g={...v,nodeId:n,type:O,position:v.position},x=c.get(n),cu={inProgress:!0,isValid:null,from:b0(x,g,Ku.Left,!0),fromHandle:g,fromPosition:g.position,fromNode:x,to:z,toHandle:null,toPosition:jq[g.position],toNode:null,pointer:z};function _u(){p=!0,N(cu),Q?.(u,{nodeId:n,handleId:r,handleType:O})}if(H===0)_u();function Fu(Wu){if(!p){let{x:qu,y:Zu}=mr(Wu),Bu=qu-D,Iu=Zu-X;if(!(Bu*Bu+Iu*Iu>H*H))return;_u()}if(!G()||!g){zu(Wu);return}let C=w();if(z=mr(Wu,Y),B=hm(Ny(z,C,!1,[1,1]),f,c,g),!P)d(),P=!0;let e=Iq(Wu,{handle:B,connectionMode:l,fromNodeId:n,fromHandleId:r,fromType:t?"target":"source",isValidConnection:U,doc:V,lib:$,flowId:j,nodeLookup:c});b=e.handleDomNode,k=e.connection,I=xm(!!B,e.isValid);let uu=c.get(n),Gu=uu?b0(uu,g,Ku.Left,!0):cu.from,s={...cu,from:Gu,isValid:I,to:e.toHandle&&I?Vc({x:e.toHandle.x,y:e.toHandle.y},C):z,toHandle:e.toHandle,toPosition:I&&e.toHandle?e.toHandle.position:jq[g.position],toNode:e.toHandle?c.get(e.toHandle.nodeId):null,pointer:z};N(s),cu=s}function zu(Wu){if("touches"in Wu&&Wu.touches.length>0)return;if(p){if((B||b)&&k&&I)W?.(k);let{inProgress:C,...e}=cu,uu={...e,toPosition:cu.toHandle?cu.toPosition:null};if(L?.(Wu,uu),i)q?.(Wu,uu)}J(),cancelAnimationFrame(S),P=!1,I=!1,k=null,b=null,V.removeEventListener("mousemove",Fu),V.removeEventListener("mouseup",zu),V.removeEventListener("touchmove",Fu),V.removeEventListener("touchend",zu)}V.addEventListener("mousemove",Fu),V.addEventListener("mouseup",zu),V.addEventListener("touchmove",Fu),V.addEventListener("touchend",zu)}function Iq(u,{handle:l,connectionMode:f,fromNodeId:r,fromHandleId:n,fromType:i,doc:t,lib:y,flowId:c,isValidConnection:$=kq,nodeLookup:A}){let j=i==="target",F=l?t.querySelector(`.${y}-flow__handle[data-id="${c}-${l?.nodeId}-${l?.id}-${l?.type}"]`):null,{x:J,y:Q}=mr(u),W=t.elementFromPoint(J,Q),L=W?.classList.contains(`${y}-flow__handle`)?W:F,U={handleDomNode:L,isValid:!1,connection:null,toHandle:null};if(L){let q=vq(void 0,L),N=L.getAttribute("data-nodeid"),w=L.getAttribute("data-handleid"),G=L.classList.contains("connectable"),Z=L.classList.contains("connectableend");if(!N||!q)return U;let H={source:j?N:r,sourceHandle:j?w:n,target:j?r:N,targetHandle:j?n:w};U.connection=H;let V=G&&Z&&(f===h0.Strict?j&&q==="source"||!j&&q==="target":N!==r||w!==n);U.isValid=V&&$(H),U.toHandle=bq(N,q,w,A,f,!0)}return U}var $A={onPointerDown:bm,isValid:Iq};function gq({domNode:u,panZoom:l,getTransform:f,getViewScale:r}){let n=el(u);function i({translateExtent:y,width:c,height:$,zoomStep:A=1,pannable:j=!0,zoomable:F=!0,inversePan:J=!1}){let Q=(N)=>{if(N.sourceEvent.type!=="wheel"||!l)return;let w=f(),G=N.sourceEvent.ctrlKey&&qy()?10:1,Z=-N.sourceEvent.deltaY*(N.sourceEvent.deltaMode===1?0.05:N.sourceEvent.deltaMode?1:0.002)*A,H=w[2]*Math.pow(2,Z*G);l.scaleTo(H)},W=[0,0],L=(N)=>{if(N.sourceEvent.type==="mousedown"||N.sourceEvent.type==="touchstart")W=[N.sourceEvent.clientX??N.sourceEvent.touches[0].clientX,N.sourceEvent.clientY??N.sourceEvent.touches[0].clientY]},U=(N)=>{let w=f();if(N.sourceEvent.type!=="mousemove"&&N.sourceEvent.type!=="touchmove"||!l)return;let G=[N.sourceEvent.clientX??N.sourceEvent.touches[0].clientX,N.sourceEvent.clientY??N.sourceEvent.touches[0].clientY],Z=[G[0]-W[0],G[1]-W[1]];W=G;let H=r()*Math.max(w[2],Math.log(w[2]))*(J?-1:1),E={x:w[0]-Z[0]*H,y:w[1]-Z[1]*H},V=[[0,0],[c,$]];l.setViewportConstrained({x:E.x,y:E.y,zoom:w[2]},V,y)},q=Bc().on("start",L).on("zoom",j?U:null).on("zoom.wheel",F?Q:null);n.call(q,{})}function t(){n.on("zoom",null)}return{update:i,destroy:t,pointer:Gf}}var AA=(u)=>({x:u.x,y:u.y,zoom:u.k}),a5=({x:u,y:l,zoom:f})=>bi.translate(u,l).scale(f),$y=(u,l)=>u.target.closest(`.${l}`),sq=(u,l)=>l===2&&Array.isArray(u)&&u.includes(2),vm=(u)=>((u*=2)<=1?u*u*u:(u-=2)*u*u+2)/2,o5=(u,l=0,f=vm,r=()=>{})=>{let n=typeof l==="number"&&l>0;if(!n)r();return n?u.transition().duration(l).ease(f).on("end",r):u},aq=(u)=>{let l=u.ctrlKey&&qy()?10:1;return-u.deltaY*(u.deltaMode===1?0.05:u.deltaMode?1:0.002)*l};function km({zoomPanValues:u,noWheelClassName:l,d3Selection:f,d3Zoom:r,panOnScrollMode:n,panOnScrollSpeed:i,zoomOnPinch:t,onPanZoomStart:y,onPanZoom:c,onPanZoomEnd:$}){return(A)=>{if($y(A,l)){if(A.ctrlKey)A.preventDefault();return!1}A.preventDefault(),A.stopImmediatePropagation();let j=f.property("__zoom").k||1;if(A.ctrlKey&&t){let L=Gf(A),U=aq(A),q=j*Math.pow(2,U);r.scaleTo(f,q,L,A);return}let F=A.deltaMode===1?20:1,J=n===gn.Vertical?0:A.deltaX*F,Q=n===gn.Horizontal?0:A.deltaY*F;if(!qy()&&A.shiftKey&&n!==gn.Vertical)J=A.deltaY*F,Q=0;r.translateBy(f,-(J/j)*i,-(Q/j)*i,{internal:!0});let W=AA(f.property("__zoom"));if(clearTimeout(u.panScrollTimeout),!u.isPanScrolling)u.isPanScrolling=!0,y?.(A,W);else c?.(A,W),u.panScrollTimeout=setTimeout(()=>{$?.(A,W),u.isPanScrolling=!1},150)}}function Im({noWheelClassName:u,preventScrolling:l,d3ZoomHandler:f}){return function(r,n){let i=r.type==="wheel",t=!l&&i&&!r.ctrlKey,y=$y(r,u);if(r.ctrlKey&&i&&y)r.preventDefault();if(t||y)return null;r.preventDefault(),f.call(this,r,n)}}function gm({zoomPanValues:u,onDraggingChange:l,onPanZoomStart:f}){return(r)=>{if(r.sourceEvent?.internal)return;let n=AA(r.transform);if(u.mouseButton=r.sourceEvent?.button||0,u.isZoomingOrPanning=!0,u.prevViewport=n,r.sourceEvent?.type==="mousedown")l(!0);if(f)f?.(r.sourceEvent,n)}}function sm({zoomPanValues:u,panOnDrag:l,onPaneContextMenu:f,onTransformChange:r,onPanZoom:n}){return(i)=>{if(u.usedRightMouseButton=!!(f&&sq(l,u.mouseButton??0)),!i.sourceEvent?.sync)r([i.transform.x,i.transform.y,i.transform.k]);if(n&&!i.sourceEvent?.internal)n?.(i.sourceEvent,AA(i.transform))}}function am({zoomPanValues:u,panOnDrag:l,panOnScroll:f,onDraggingChange:r,onPanZoomEnd:n,onPaneContextMenu:i}){return(t)=>{if(t.sourceEvent?.internal)return;if(u.isZoomingOrPanning=!1,i&&sq(l,u.mouseButton??0)&&!u.usedRightMouseButton&&t.sourceEvent)i(t.sourceEvent);if(u.usedRightMouseButton=!1,r(!1),n){let y=AA(t.transform);u.prevViewport=y,clearTimeout(u.timerId),u.timerId=setTimeout(()=>{n?.(t.sourceEvent,y)},f?150:0)}}}function om({zoomActivationKeyPressed:u,zoomOnScroll:l,zoomOnPinch:f,panOnDrag:r,panOnScroll:n,zoomOnDoubleClick:i,userSelectionActive:t,noWheelClassName:y,noPanClassName:c,lib:$,connectionInProgress:A}){return(j)=>{let F=u||l,J=f&&j.ctrlKey,Q=j.type==="wheel";if(j.button===1&&j.type==="mousedown"&&($y(j,`${$}-flow__node`)||$y(j,`${$}-flow__edge`)))return!0;if(!r&&!F&&!n&&!i&&!f)return!1;if(t)return!1;if(A&&!Q)return!1;if($y(j,y)&&Q)return!1;if($y(j,c)&&(!Q||n&&Q&&!u))return!1;if(!f&&j.ctrlKey&&Q)return!1;if(!f&&j.type==="touchstart"&&j.touches?.length>1)return j.preventDefault(),!1;if(!F&&!n&&!J&&Q)return!1;if(!r&&(j.type==="mousedown"||j.type==="touchstart"))return!1;if(Array.isArray(r)&&!r.includes(j.button)&&j.type==="mousedown")return!1;let W=Array.isArray(r)&&r.includes(j.button)||!j.button||j.button<=1;return(!j.ctrlKey||Q)&&W}}function oq({domNode:u,minZoom:l,maxZoom:f,translateExtent:r,viewport:n,onPanZoom:i,onPanZoomStart:t,onPanZoomEnd:y,onDraggingChange:c}){let $={isZoomingOrPanning:!1,usedRightMouseButton:!1,prevViewport:{x:0,y:0,zoom:0},mouseButton:0,timerId:void 0,panScrollTimeout:void 0,isPanScrolling:!1},A=u.getBoundingClientRect(),j=Bc().scaleExtent([l,f]).translateExtent(r),F=el(u).call(j);q({x:n.x,y:n.y,zoom:Ay(n.zoom,l,f)},[[0,0],[A.width,A.height]],r);let J=F.on("wheel.zoom"),Q=F.on("dblclick.zoom");j.wheelDelta(aq);function W(B,D){if(F)return new Promise((X)=>{j?.interpolate(D?.interpolate==="linear"?Qn:hi).transform(o5(F,D?.duration,D?.ease,()=>X(!0)),B)});return Promise.resolve(!1)}function L({noWheelClassName:B,noPanClassName:D,onPaneContextMenu:X,userSelectionActive:O,panOnScroll:Y,panOnDrag:p,panOnScrollMode:v,panOnScrollSpeed:z,preventScrolling:P,zoomOnPinch:k,zoomOnScroll:I,zoomOnDoubleClick:b,zoomActivationKeyPressed:d,lib:g,onTransformChange:x,connectionInProgress:lu,paneClickDistance:cu,selectionOnDrag:_u}){if(O&&!$.isZoomingOrPanning)U();let Fu=Y&&!d&&!O;j.clickDistance(_u?1/0:!Br(cu)||cu<0?0:cu);let zu=Fu?km({zoomPanValues:$,noWheelClassName:B,d3Selection:F,d3Zoom:j,panOnScrollMode:v,panOnScrollSpeed:z,zoomOnPinch:k,onPanZoomStart:t,onPanZoom:i,onPanZoomEnd:y}):Im({noWheelClassName:B,preventScrolling:P,d3ZoomHandler:J});if(F.on("wheel.zoom",zu,{passive:!1}),!O){let C=gm({zoomPanValues:$,onDraggingChange:c,onPanZoomStart:t});j.on("start",C);let e=sm({zoomPanValues:$,panOnDrag:p,onPaneContextMenu:!!X,onPanZoom:i,onTransformChange:x});j.on("zoom",e);let uu=am({zoomPanValues:$,panOnDrag:p,panOnScroll:Y,onPaneContextMenu:X,onPanZoomEnd:y,onDraggingChange:c});j.on("end",uu)}let Wu=om({zoomActivationKeyPressed:d,panOnDrag:p,zoomOnScroll:I,panOnScroll:Y,zoomOnDoubleClick:b,zoomOnPinch:k,userSelectionActive:O,noPanClassName:D,noWheelClassName:B,lib:g,connectionInProgress:lu});if(j.filter(Wu),b)F.on("dblclick.zoom",Q);else F.on("dblclick.zoom",null)}function U(){j.on("zoom",null)}async function q(B,D,X){let O=a5(B),Y=j?.constrain()(O,D,X);if(Y)await W(Y);return new Promise((p)=>p(Y))}async function N(B,D){let X=a5(B);return await W(X,D),new Promise((O)=>O(X))}function w(B){if(F){let D=a5(B),X=F.property("__zoom");if(X.k!==B.zoom||X.x!==B.x||X.y!==B.y)j?.transform(F,D,null,{sync:!0})}}function G(){let B=F?Hc(F.node()):{x:0,y:0,k:1};return{x:B.x,y:B.y,zoom:B.k}}function Z(B,D){if(F)return new Promise((X)=>{j?.interpolate(D?.interpolate==="linear"?Qn:hi).scaleTo(o5(F,D?.duration,D?.ease,()=>X(!0)),B)});return Promise.resolve(!1)}function H(B,D){if(F)return new Promise((X)=>{j?.interpolate(D?.interpolate==="linear"?Qn:hi).scaleBy(o5(F,D?.duration,D?.ease,()=>X(!0)),B)});return Promise.resolve(!1)}function E(B){j?.scaleExtent(B)}function V(B){j?.translateExtent(B)}function S(B){let D=!Br(B)||B<0?0:B;j?.clickDistance(D)}return{update:L,destroy:U,setViewport:N,setViewportConstrained:q,getViewport:G,scaleTo:Z,scaleBy:H,setScaleExtent:E,setTranslateExtent:V,syncViewport:w,setClickDistance:S}}var v0;(function(u){u.Line="line",u.Handle="handle"})(v0||(v0={}));function dm({width:u,prevWidth:l,height:f,prevHeight:r,affectsX:n,affectsY:i}){let t=u-l,y=f-r,c=[t>0?1:t<0?-1:0,y>0?1:y<0?-1:0];if(t&&n)c[0]=c[0]*-1;if(y&&i)c[1]=c[1]*-1;return c}function Kq(u){let l=u.includes("right")||u.includes("left"),f=u.includes("bottom")||u.includes("top"),r=u.includes("left"),n=u.includes("top");return{isHorizontal:l,isVertical:f,affectsX:r,affectsY:n}}function M0(u,l){return Math.max(0,l-u)}function R0(u,l){return Math.max(0,u-l)}function d3(u,l,f){return Math.max(0,l-u,u-f)}function Gq(u,l){return u?!l:l}function em(u,l,f,r,n,i,t,y){let{affectsX:c,affectsY:$}=l,{isHorizontal:A,isVertical:j}=l,F=A&&j,{xSnapped:J,ySnapped:Q}=f,{minWidth:W,maxWidth:L,minHeight:U,maxHeight:q}=r,{x:N,y:w,width:G,height:Z,aspectRatio:H}=u,E=Math.floor(A?J-u.pointerX:0),V=Math.floor(j?Q-u.pointerY:0),S=G+(c?-E:E),B=Z+($?-V:V),D=-i[0]*G,X=-i[1]*Z,O=d3(S,W,L),Y=d3(B,U,q);if(t){let z=0,P=0;if(c&&E<0)z=M0(N+E+D,t[0][0]);else if(!c&&E>0)z=R0(N+S+D,t[1][0]);if($&&V<0)P=M0(w+V+X,t[0][1]);else if(!$&&V>0)P=R0(w+B+X,t[1][1]);O=Math.max(O,z),Y=Math.max(Y,P)}if(y){let z=0,P=0;if(c&&E>0)z=R0(N+E,y[0][0]);else if(!c&&E<0)z=M0(N+S,y[1][0]);if($&&V>0)P=R0(w+V,y[0][1]);else if(!$&&V<0)P=M0(w+B,y[1][1]);O=Math.max(O,z),Y=Math.max(Y,P)}if(n){if(A){let z=d3(S/H,U,q)*H;if(O=Math.max(O,z),t){let P=0;if(!c&&!$||c&&!$&&F)P=R0(w+X+S/H,t[1][1])*H;else P=M0(w+X+(c?E:-E)/H,t[0][1])*H;O=Math.max(O,P)}if(y){let P=0;if(!c&&!$||c&&!$&&F)P=M0(w+S/H,y[1][1])*H;else P=R0(w+(c?E:-E)/H,y[0][1])*H;O=Math.max(O,P)}}if(j){let z=d3(B*H,W,L)/H;if(Y=Math.max(Y,z),t){let P=0;if(!c&&!$||$&&!c&&F)P=R0(N+B*H+D,t[1][0])/H;else P=M0(N+($?V:-V)*H+D,t[0][0])/H;Y=Math.max(Y,P)}if(y){let P=0;if(!c&&!$||$&&!c&&F)P=M0(N+B*H,y[1][0])/H;else P=R0(N+($?V:-V)*H,y[0][0])/H;Y=Math.max(Y,P)}}}if(V=V+(V<0?Y:-Y),E=E+(E<0?O:-O),n)if(F)if(S>B*H)V=(Gq(c,$)?-E:E)/H;else E=(Gq(c,$)?-V:V)*H;else if(A)V=E/H,$=c;else E=V*H,c=$;let p=c?N+E:N,v=$?w+V:w;return{width:G+(c?-E:E),height:Z+($?-V:V),x:i[0]*E*(!c?1:-1)+p,y:i[1]*V*(!$?1:-1)+v}}var dq={width:0,height:0,x:0,y:0},uV={...dq,pointerX:0,pointerY:0,aspectRatio:1};function lV(u){return[[0,0],[u.measured.width,u.measured.height]]}function fV(u,l,f){let r=l.position.x+u.position.x,n=l.position.y+u.position.y,i=u.measured.width??0,t=u.measured.height??0,y=f[0]*i,c=f[1]*t;return[[r-y,n-c],[r+i-y,n+t-c]]}function eq({domNode:u,nodeId:l,getStoreItems:f,onChange:r,onEnd:n}){let i=el(u),t={controlDirection:Kq("bottom-right"),boundaries:{minWidth:0,minHeight:0,maxWidth:Number.MAX_VALUE,maxHeight:Number.MAX_VALUE},resizeDirection:void 0,keepAspectRatio:!1};function y({controlPosition:$,boundaries:A,keepAspectRatio:j,resizeDirection:F,onResizeStart:J,onResize:Q,onResizeEnd:W,shouldResize:L}){let U={...dq},q={...uV};t={boundaries:A,resizeDirection:F,keepAspectRatio:j,controlDirection:Kq($)};let N=void 0,w=null,G=[],Z=void 0,H=void 0,E=void 0,V=!1,S=jc().on("start",(B)=>{let{nodeLookup:D,transform:X,snapGrid:O,snapToGrid:Y,nodeOrigin:p,paneDomNode:v}=f();if(N=D.get(l),!N)return;w=v?.getBoundingClientRect()??null;let{xSnapped:z,ySnapped:P}=mc(B.sourceEvent,{transform:X,snapGrid:O,snapToGrid:Y,containerBounds:w});if(U={width:N.measured.width??0,height:N.measured.height??0,x:N.position.x??0,y:N.position.y??0},q={...U,pointerX:z,pointerY:P,aspectRatio:U.width/U.height},Z=void 0,N.parentId&&(N.extent==="parent"||N.expandParent))Z=D.get(N.parentId),H=Z&&N.extent==="parent"?lV(Z):void 0;G=[],E=void 0;for(let[k,I]of D)if(I.parentId===l){if(G.push({id:k,position:{...I.position},extent:I.extent}),I.extent==="parent"||I.expandParent){let b=fV(I,N,I.origin??p);if(E)E=[[Math.min(b[0][0],E[0][0]),Math.min(b[0][1],E[0][1])],[Math.max(b[1][0],E[1][0]),Math.max(b[1][1],E[1][1])]];else E=b}}J?.(B,{...U})}).on("drag",(B)=>{let{transform:D,snapGrid:X,snapToGrid:O,nodeOrigin:Y}=f(),p=mc(B.sourceEvent,{transform:D,snapGrid:X,snapToGrid:O,containerBounds:w}),v=[];if(!N)return;let{x:z,y:P,width:k,height:I}=U,b={},d=N.origin??Y,{width:g,height:x,x:lu,y:cu}=em(q,t.controlDirection,p,t.boundaries,t.keepAspectRatio,d,H,E),_u=g!==k,Fu=x!==I,zu=lu!==z&&_u,Wu=cu!==P&&Fu;if(!zu&&!Wu&&!_u&&!Fu)return;if(zu||Wu||d[0]===1||d[1]===1){if(b.x=zu?lu:U.x,b.y=Wu?cu:U.y,U.x=b.x,U.y=b.y,G.length>0){let Gu=lu-z,s=cu-P;for(let qu of G)qu.position={x:qu.position.x-Gu+d[0]*(g-k),y:qu.position.y-s+d[1]*(x-I)},v.push(qu)}}if(_u||Fu)b.width=_u&&(!t.resizeDirection||t.resizeDirection==="horizontal")?g:U.width,b.height=Fu&&(!t.resizeDirection||t.resizeDirection==="vertical")?x:U.height,U.width=b.width,U.height=b.height;if(Z&&N.expandParent){let Gu=d[0]*(b.width??0);if(b.x&&b.x{if(!V)return;W?.(B,{...U}),n?.({...U}),V=!1});i.call(S)}function c(){i.on(".drag",null)}return{update:y,destroy:c}}var Aw=Cu(Fl(),1),jw=Cu(yw(),1);var cw=(u)=>{let l,f=new Set,r=(A,j)=>{let F=typeof A==="function"?A(l):A;if(!Object.is(F,l)){let J=l;l=(j!=null?j:typeof F!=="object"||F===null)?F:Object.assign({},l,F),f.forEach((Q)=>Q(l,J))}},n=()=>l,c={setState:r,getState:n,getInitialState:()=>$,subscribe:(A)=>{return f.add(A),()=>f.delete(A)},destroy:()=>{f.clear()}},$=l=u(r,n,c);return c},_w=(u)=>u?cw(u):cw;var{useDebugValue:WV}=Aw.default,{useSyncExternalStoreWithSelector:LV}=jw.default,TV=(u)=>u;function G9(u,l=TV,f){let r=LV(u.subscribe,u.getState,u.getServerState||u.getInitialState,l,f);return WV(r),r}var $w=(u,l)=>{let f=_w(u),r=(n,i=l)=>G9(f,n,i);return Object.assign(r,f),r},Fw=(u,l)=>u?$w(u,l):$w;function zl(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[r,n]of u)if(!Object.is(n,l.get(r)))return!1;return!0}if(u instanceof Set&&l instanceof Set){if(u.size!==l.size)return!1;for(let r of u)if(!l.has(r))return!1;return!0}let f=Object.keys(u);if(f.length!==Object.keys(l).length)return!1;for(let r of f)if(!Object.prototype.hasOwnProperty.call(l,r)||!Object.is(u[r],l[r]))return!1;return!0}var KV=Cu(Z4(),1),QA=tu.createContext(null),GV=QA.Provider,Yw=Qr.error001();function il(u,l){let f=tu.useContext(QA);if(f===null)throw Error(Yw);return G9(f,u,l)}function Ol(){let u=tu.useContext(QA);if(u===null)throw Error(Yw);return tu.useMemo(()=>({getState:u.getState,setState:u.setState,subscribe:u.subscribe}),[u])}var Uw={display:"none"},zV={position:"absolute",width:1,height:1,margin:-1,border:0,padding:0,overflow:"hidden",clip:"rect(0px, 0px, 0px, 0px)",clipPath:"inset(100%)"},Pw="react-flow__node-desc",Cw="react-flow__edge-desc",EV="react-flow__aria-live",OV=(u)=>u.ariaLiveMessage,ZV=(u)=>u.ariaLabelConfig;function HV({rfId:u}){let l=il(OV);return ru.jsx("div",{id:`${EV}-${u}`,"aria-live":"assertive","aria-atomic":"true",style:zV,children:l})}function BV({rfId:u,disableKeyboardA11y:l}){let f=il(ZV);return ru.jsxs(ru.Fragment,{children:[ru.jsx("div",{id:`${Pw}-${u}`,style:Uw,children:l?f["node.a11yDescription.default"]:f["node.a11yDescription.keyboardDisabled"]}),ru.jsx("div",{id:`${Cw}-${u}`,style:Uw,children:f["edge.a11yDescription.default"]}),!l&&ru.jsx(HV,{rfId:u})]})}var NA=tu.forwardRef(({position:u="top-left",children:l,className:f,style:r,...n},i)=>{let t=`${u}`.split("-");return ru.jsx("div",{className:Xl(["react-flow__panel",f,...t]),style:r,ref:i,...n,children:l})});NA.displayName="Panel";function mV({proOptions:u,position:l="bottom-right"}){if(u?.hideAttribution)return null;return ru.jsx(NA,{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:ru.jsx("a",{href:"https://reactflow.dev",target:"_blank",rel:"noopener noreferrer","aria-label":"React Flow attribution",children:"React Flow"})})}var VV=(u)=>{let l=[],f=[];for(let[,r]of u.nodeLookup)if(r.selected)l.push(r.internals.userNode);for(let[,r]of u.edgeLookup)if(r.selected)f.push(r);return{selectedNodes:l,selectedEdges:f}},FA=(u)=>u.id;function DV(u,l){return zl(u.selectedNodes.map(FA),l.selectedNodes.map(FA))&&zl(u.selectedEdges.map(FA),l.selectedEdges.map(FA))}function pV({onSelectionChange:u}){let l=Ol(),{selectedNodes:f,selectedEdges:r}=il(VV,DV);return tu.useEffect(()=>{let n={nodes:f,edges:r};u?.(n),l.getState().onSelectionChangeHandlers.forEach((i)=>i(n))},[f,r,u]),null}var SV=(u)=>!!u.onSelectionChangeHandlers;function XV({onSelectionChange:u}){let l=il(SV);if(u||l)return ru.jsx(pV,{onSelectionChange:u});return null}var O9=typeof window<"u"?tu.useLayoutEffect:tu.useEffect,Mw=[0,0],YV={x:0,y:0,zoom:1},PV=["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"],Jw=[...PV,"rfId"],CV=(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}),Qw={translateExtent:Fy,nodeOrigin:Mw,minZoom:0.5,maxZoom:2,elementsSelectable:!0,noPanClassName:"nopan",rfId:"1"};function MV(u){let{setNodes:l,setEdges:f,setMinZoom:r,setMaxZoom:n,setTranslateExtent:i,setNodeExtent:t,reset:y,setDefaultNodesAndEdges:c}=il(CV,zl),$=Ol();O9(()=>{return c(u.defaultNodes,u.defaultEdges),()=>{A.current=Qw,y()}},[]);let A=tu.useRef(Qw);return O9(()=>{for(let j of Jw){let F=u[j],J=A.current[j];if(F===J)continue;if(typeof u[j]>"u")continue;if(j==="nodes")l(F);else if(j==="edges")f(F);else if(j==="minZoom")r(F);else if(j==="maxZoom")n(F);else if(j==="translateExtent")i(F);else if(j==="nodeExtent")t(F);else if(j==="ariaLabelConfig")$.setState({ariaLabelConfig:Vq(F)});else if(j==="fitView")$.setState({fitViewQueued:F});else if(j==="fitViewOptions")$.setState({fitViewOptions:F});else $.setState({[j]:F})}A.current=u},Jw.map((j)=>u[j])),null}function Nw(){if(typeof window>"u"||!window.matchMedia)return null;return window.matchMedia("(prefers-color-scheme: dark)")}function RV(u){let[l,f]=tu.useState(u==="system"?null:u);return tu.useEffect(()=>{if(u!=="system"){f(u);return}let r=Nw(),n=()=>f(r?.matches?"dark":"light");return n(),r?.addEventListener("change",n),()=>{r?.removeEventListener("change",n)}},[u]),l!==null?l:Nw()?.matches?"dark":"light"}var qw=typeof document<"u"?document:null;function Xc(u=null,l={target:qw,actInsideInputWithModifier:!0}){let[f,r]=tu.useState(!1),n=tu.useRef(!1),i=tu.useRef(new Set([])),[t,y]=tu.useMemo(()=>{if(u!==null){let $=(Array.isArray(u)?u:[u]).filter((j)=>typeof j==="string").map((j)=>j.replace("+",` `).replace(` `,` +`).split(` -`)),A=c.reduce((j,F)=>j.concat(...F),[]);return[c,A]}return[[],[]]},[u]);return yu.useEffect(()=>{let _=l?.target??eq,c=l?.actInsideInputWithModifier??!0;if(u!==null){let A=(J)=>{if(n.current=J.ctrlKey||J.metaKey||J.shiftKey||J.altKey,(!n.current||n.current&&!c)&&f9(J))return!1;let w=lW(J.code,t);if(i.current.add(J[w]),uW(y,i.current,!1)){let L=J.composedPath?.()?.[0]||J.target,U=L?.nodeName==="BUTTON"||L?.nodeName==="A";if(l.preventDefault!==!1&&(n.current||!U))J.preventDefault();r(!0)}},j=(J)=>{let Q=lW(J.code,t);if(uW(y,i.current,!0))r(!1),i.current.clear();else i.current.delete(J[Q]);if(J.key==="Meta")i.current.clear();n.current=!1},F=()=>{i.current.clear(),r(!1)};return _?.addEventListener("keydown",A),_?.addEventListener("keyup",j),window.addEventListener("blur",F),window.addEventListener("contextmenu",F),()=>{_?.removeEventListener("keydown",A),_?.removeEventListener("keyup",j),window.removeEventListener("blur",F),window.removeEventListener("contextmenu",F)}}},[u,r]),f}function uW(u,l,f){return u.filter((r)=>f||r.length===l.size).some((r)=>r.every((n)=>l.has(n)))}function lW(u,l){return l.includes(u)?"code":"key"}var KD=()=>{let u=El();return yu.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:r}=u.getState();return r?r.scaleTo(l,f):Promise.resolve(!1)},getZoom:()=>u.getState().transform[2],setViewport:async(l,f)=>{let{transform:[r,n,i],panZoom:y}=u.getState();if(!y)return Promise.resolve(!1);return await y.setViewport({x:l.x??r,y:l.y??n,zoom:l.zoom??i},f),Promise.resolve(!0)},getViewport:()=>{let[l,f,r]=u.getState().transform;return{x:l,y:f,zoom:r}},setCenter:async(l,f,r)=>{return u.getState().setCenter(l,f,r)},fitBounds:async(l,f)=>{let{width:r,height:n,minZoom:i,maxZoom:y,panZoom:t}=u.getState(),_=Z_(l,r,n,i,y,f?.padding??0.1);if(!t)return Promise.resolve(!1);return await t.setViewport(_,{duration:f?.duration,ease:f?.ease,interpolate:f?.interpolate}),Promise.resolve(!0)},screenToFlowPosition:(l,f={})=>{let{transform:r,snapGrid:n,snapToGrid:i,domNode:y}=u.getState();if(!y)return l;let{x:t,y:_}=y.getBoundingClientRect(),c={x:l.x-t,y:l.y-_},A=f.snapGrid??n,j=f.snapToGrid??i;return _y(c,r,j,A)},flowToScreenPosition:(l)=>{let{transform:f,domNode:r}=u.getState();if(!r)return l;let{x:n,y:i}=r.getBoundingClientRect(),y=T_(l,f);return{x:y.x+n,y:y.y+i}}}},[])};function KW(u,l){let f=[],r=new Map,n=[];for(let i of u)if(i.type==="add"){n.push(i);continue}else if(i.type==="remove"||i.type==="replace")r.set(i.id,[i]);else{let y=r.get(i.id);if(y)y.push(i);else r.set(i.id,[i])}for(let i of l){let y=r.get(i.id);if(!y){f.push(i);continue}if(y[0].type==="remove")continue;if(y[0].type==="replace"){f.push({...y[0].item});continue}let t={...i};for(let _ of y)GD(_,t);f.push(t)}if(n.length)n.forEach((i)=>{if(i.index!==void 0)f.splice(i.index,0,{...i.item});else f.push({...i.item})});return f}function GD(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 zD(u,l){return KW(u,l)}function TD(u,l){return KW(u,l)}function Mi(u,l){return{id:u,type:"select",selected:l}}function Ay(u,l=new Set,f=!1){let r=[];for(let[n,i]of u){let y=l.has(n);if(!(i.selected===void 0&&!y)&&i.selected!==y){if(f)i.selected=y;r.push(Mi(i.id,y))}}return r}function fW({items:u=[],lookup:l}){let f=[],r=new Map(u.map((n)=>[n.id,n]));for(let[n,i]of u.entries()){let y=l.get(i.id),t=y?.internals?.userNode??y;if(t!==void 0&&t!==i)f.push({id:i.id,item:i,type:"replace"});if(t===void 0)f.push({item:i,type:"add",index:n})}for(let[n]of l)if(r.get(n)===void 0)f.push({id:n,type:"remove"});return f}function rW(u){return{id:u.id,type:"remove"}}var nW=(u)=>yq(u),ED=(u)=>v5(u);function GW(u){return yu.forwardRef(u)}function iW(u){let[l,f]=yu.useState(BigInt(0)),[r]=yu.useState(()=>ZD(()=>f((n)=>n+BigInt(1))));return J9(()=>{let n=r.get();if(n.length)u(n),r.reset()},[l]),r}function ZD(u){let l=[];return{get:()=>l,reset:()=>{l=[]},push:(f)=>{l.push(f),u()}}}var zW=yu.createContext(null);function OD({children:u}){let l=El(),f=yu.useCallback((t)=>{let{nodes:_=[],setNodes:c,hasDefaultNodes:A,onNodesChange:j,nodeLookup:F,fitViewQueued:J,onNodesChangeMiddlewareMap:Q}=l.getState(),w=_;for(let U of t)w=typeof U==="function"?U(w):U;let L=fW({items:w,lookup:F});for(let U of Q.values())L=U(L);if(A)c(w);if(L.length>0)j?.(L);else if(J)window.requestAnimationFrame(()=>{let{fitViewQueued:U,nodes:N,setNodes:q}=l.getState();if(U)q(N)})},[]),r=iW(f),n=yu.useCallback((t)=>{let{edges:_=[],setEdges:c,hasDefaultEdges:A,onEdgesChange:j,edgeLookup:F}=l.getState(),J=_;for(let Q of t)J=typeof Q==="function"?Q(J):Q;if(A)c(J);else if(j)j(fW({items:J,lookup:F}))},[]),i=iW(n),y=yu.useMemo(()=>({nodeQueue:r,edgeQueue:i}),[]);return ru.jsx(zW.Provider,{value:y,children:u})}function HD(){let u=yu.useContext(zW);if(!u)throw Error("useBatchContext must be used within a BatchProvider");return u}var BD=(u)=>!!u.panZoom;function N9(){let u=KD(),l=El(),f=HD(),r=fl(BD),n=yu.useMemo(()=>{let i=(j)=>l.getState().nodeLookup.get(j),y=(j)=>{f.nodeQueue.push(j)},t=(j)=>{f.edgeQueue.push(j)},_=(j)=>{let{nodeLookup:F,nodeOrigin:J}=l.getState(),Q=nW(j)?j:F.get(j.id),w=Q.parentId?e5(Q.position,Q.measured,Q.parentId,F,J):Q.position,L={...Q,position:w,width:Q.measured?.width??Q.width,height:Q.measured?.height??Q.height};return Ci(L)},c=(j,F,J={replace:!1})=>{y((Q)=>Q.map((w)=>{if(w.id===j){let L=typeof F==="function"?F(w):F;return J.replace&&nW(L)?L:{...w,...L}}return w}))},A=(j,F,J={replace:!1})=>{t((Q)=>Q.map((w)=>{if(w.id===j){let L=typeof F==="function"?F(w):F;return J.replace&&ED(L)?L:{...w,...L}}return w}))};return{getNodes:()=>l.getState().nodes.map((j)=>({...j})),getNode:(j)=>i(j)?.internals.userNode,getInternalNode:i,getEdges:()=>{let{edges:j=[]}=l.getState();return j.map((F)=>({...F}))},getEdge:(j)=>l.getState().edgeLookup.get(j),setNodes:y,setEdges:t,addNodes:(j)=>{let F=Array.isArray(j)?j:[j];f.nodeQueue.push((J)=>[...J,...F])},addEdges:(j)=>{let F=Array.isArray(j)?j:[j];f.edgeQueue.push((J)=>[...J,...F])},toObject:()=>{let{nodes:j=[],edges:F=[],transform:J}=l.getState(),[Q,w,L]=J;return{nodes:j.map((U)=>({...U})),edges:F.map((U)=>({...U})),viewport:{x:Q,y:w,zoom:L}}},deleteElements:async({nodes:j=[],edges:F=[]})=>{let{nodes:J,edges:Q,onNodesDelete:w,onEdgesDelete:L,triggerNodeChanges:U,triggerEdgeChanges:N,onDelete:q,onBeforeDelete:W}=l.getState(),{nodes:z,edges:Z}=await $q({nodesToRemove:j,edgesToRemove:F,nodes:J,edges:Q,onBeforeDelete:W}),H=Z.length>0,E=z.length>0;if(H){let D=Z.map(rW);L?.(Z),N(D)}if(E){let D=z.map(rW);w?.(z),U(D)}if(E||H)q?.({nodes:z,edges:Z});return{deletedNodes:z,deletedEdges:Z}},getIntersectingNodes:(j,F=!0,J)=>{let Q=a5(j),w=Q?j:_(j),L=J!==void 0;if(!w)return[];return(J||l.getState().nodes).filter((U)=>{let N=l.getState().nodeLookup.get(U.id);if(N&&!Q&&(U.id===j.id||!N.internals.positionAbsolute))return!1;let q=Ci(L?U:N),W=yy(q,w);return F&&W>0||W>=q.width*q.height||W>=w.width*w.height})},isNodeIntersecting:(j,F,J=!0)=>{let w=a5(j)?j:_(j);if(!w)return!1;let L=yy(w,F);return J&&L>0||L>=F.width*F.height||L>=w.width*w.height},updateNode:c,updateNodeData:(j,F,J={replace:!1})=>{c(j,(Q)=>{let w=typeof F==="function"?F(Q):F;return J.replace?{...Q,data:w}:{...Q,data:{...Q.data,...w}}},J)},updateEdge:A,updateEdgeData:(j,F,J={replace:!1})=>{A(j,(Q)=>{let w=typeof F==="function"?F(Q):F;return J.replace?{...Q,data:w}:{...Q,data:{...Q.data,...w}}},J)},getNodesBounds:(j)=>{let{nodeLookup:F,nodeOrigin:J}=l.getState();return I5(j,{nodeLookup:F,nodeOrigin:J})},getHandleConnections:({type:j,id:F,nodeId:J})=>Array.from(l.getState().connectionLookup.get(`${J}-${j}${F?`-${F}`:""}`)?.values()??[]),getNodeConnections:({type:j,handleId:F,nodeId:J})=>Array.from(l.getState().connectionLookup.get(`${J}${j?F?`-${j}-${F}`:`-${j}`:""}`)?.values()??[]),fitView:async(j)=>{let F=l.getState().fitViewResolver??jq();return l.setState({fitViewQueued:!0,fitViewOptions:j,fitViewResolver:F}),f.nodeQueue.push((J)=>[...J]),F.promise}}},[]);return yu.useMemo(()=>{return{...n,...u,viewportInitialized:r}},[r])}var yW=(u)=>u.selected,VD=typeof window<"u"?window:void 0;function DD({deleteKeyCode:u,multiSelectionKeyCode:l}){let f=El(),{deleteElements:r}=N9(),n=H_(u,{actInsideInputWithModifier:!1}),i=H_(l,{target:VD});yu.useEffect(()=>{if(n){let{edges:y,nodes:t}=f.getState();r({nodes:t.filter(yW),edges:y.filter(yW)}),f.setState({nodesSelectionActive:!1})}},[n]),yu.useEffect(()=>{f.setState({multiSelectionActive:i})},[i])}function XD(u){let l=El();yu.useEffect(()=>{let f=()=>{if(!u.current||!(u.current.checkVisibility?.()??!0))return!1;let r=sc(u.current);if(r.height===0||r.width===0)l.getState().onError?.("004",Ur.error004());l.setState({width:r.width||500,height:r.height||500})};if(u.current){f(),window.addEventListener("resize",f);let r=new ResizeObserver(()=>f());return r.observe(u.current),()=>{if(window.removeEventListener("resize",f),r&&u.current)r.unobserve(u.current)}}},[])}var c6={position:"absolute",width:"100%",height:"100%",top:0,left:0},SD=(u)=>({userSelectionActive:u.userSelectionActive,lib:u.lib,connectionInProgress:u.connection.inProgress});function YD({onPaneContextMenu:u,zoomOnScroll:l=!0,zoomOnPinch:f=!0,panOnScroll:r=!1,panOnScrollSpeed:n=0.5,panOnScrollMode:i=x0.Free,zoomOnDoubleClick:y=!0,panOnDrag:t=!0,defaultViewport:_,translateExtent:c,minZoom:A,maxZoom:j,zoomActivationKeyCode:F,preventScrolling:J=!0,children:Q,noWheelClassName:w,noPanClassName:L,onViewportChange:U,isControlledViewport:N,paneClickDistance:q,selectionOnDrag:W}){let z=El(),Z=yu.useRef(null),{userSelectionActive:H,lib:E,connectionInProgress:D}=fl(SD,Gl),h=H_(F),V=yu.useRef();XD(Z);let S=yu.useCallback((p)=>{if(U?.({x:p[0],y:p[1],zoom:p[2]}),!N)z.setState({transform:p})},[U,N]);return yu.useEffect(()=>{if(Z.current){V.current=Dq({domNode:Z.current,minZoom:A,maxZoom:j,translateExtent:c,viewport:_,onDraggingChange:(X)=>z.setState((v)=>v.paneDragging===X?v:{paneDragging:X}),onPanZoomStart:(X,v)=>{let{onViewportChangeStart:T,onMoveStart:Y}=z.getState();Y?.(X,v),T?.(v)},onPanZoom:(X,v)=>{let{onViewportChange:T,onMove:Y}=z.getState();Y?.(X,v),T?.(v)},onPanZoomEnd:(X,v)=>{let{onViewportChangeEnd:T,onMoveEnd:Y}=z.getState();Y?.(X,v),T?.(v)}});let{x:p,y:O,zoom:m}=V.current.getViewport();return z.setState({panZoom:V.current,transform:[p,O,m],domNode:Z.current.closest(".react-flow")}),()=>{V.current?.destroy()}}},[]),yu.useEffect(()=>{V.current?.update({onPaneContextMenu:u,zoomOnScroll:l,zoomOnPinch:f,panOnScroll:r,panOnScrollSpeed:n,panOnScrollMode:i,zoomOnDoubleClick:y,panOnDrag:t,zoomActivationKeyPressed:h,preventScrolling:J,noPanClassName:L,userSelectionActive:H,noWheelClassName:w,lib:E,onTransformChange:S,connectionInProgress:D,selectionOnDrag:W,paneClickDistance:q})},[u,l,f,r,n,i,y,t,h,J,L,H,w,E,S,D,W,q]),ru.jsx("div",{className:"react-flow__renderer",ref:Z,style:c6,children:Q})}var pD=(u)=>({userSelectionActive:u.userSelectionActive,userSelectionRect:u.userSelectionRect});function mD(){let{userSelectionActive:u,userSelectionRect:l}=fl(pD,Gl);if(!(u&&l))return null;return ru.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 F9=(u,l)=>{return(f)=>{if(f.target!==l.current)return;u?.(f)}},PD=(u)=>({userSelectionActive:u.userSelectionActive,elementsSelectable:u.elementsSelectable,connectionInProgress:u.connection.inProgress,dragging:u.paneDragging});function CD({isSelecting:u,selectionKeyPressed:l,selectionMode:f=mi.Full,panOnDrag:r,paneClickDistance:n,selectionOnDrag:i,onSelectionStart:y,onSelectionEnd:t,onPaneClick:_,onPaneContextMenu:c,onPaneScroll:A,onPaneMouseEnter:j,onPaneMouseMove:F,onPaneMouseLeave:J,children:Q}){let w=El(),{userSelectionActive:L,elementsSelectable:U,dragging:N,connectionInProgress:q}=fl(PD,Gl),W=U&&(u||L),z=yu.useRef(null),Z=yu.useRef(),H=yu.useRef(new Set),E=yu.useRef(new Set),D=yu.useRef(!1),h=(T)=>{if(D.current||q){D.current=!1;return}_?.(T),w.getState().resetSelectedElements(),w.setState({nodesSelectionActive:!1})},V=(T)=>{if(Array.isArray(r)&&r?.includes(2)){T.preventDefault();return}c?.(T)},S=A?(T)=>A(T):void 0,p=(T)=>{if(D.current)T.stopPropagation(),D.current=!1},O=(T)=>{let{domNode:Y}=w.getState();if(Z.current=Y?.getBoundingClientRect(),!Z.current)return;let k=T.target===z.current;if(!k&&!!T.target.closest(".nokey")||!u||!(i&&k||l)||T.button!==0||!T.isPrimary)return;T.target?.setPointerCapture?.(T.pointerId),D.current=!1;let{x:o,y:g}=Or(T.nativeEvent,Z.current);if(w.setState({userSelectionRect:{width:0,height:0,startX:o,startY:g,x:o,y:g}}),!k)T.stopPropagation(),T.preventDefault()},m=(T)=>{let{userSelectionRect:Y,transform:k,nodeLookup:I,edgeLookup:b,connectionLookup:o,triggerNodeChanges:g,triggerEdgeChanges:x,defaultEdgeOptions:lu,resetSelectedElements:_u}=w.getState();if(!Z.current||!Y)return;let{x:$u,y:ju}=Or(T.nativeEvent,Z.current),{startX:zu,startY:Wu}=Y;if(!D.current){let s=l?0:n;if(Math.hypot($u-zu,ju-Wu)<=s)return;_u(),y?.(T)}D.current=!0;let P={startX:zu,startY:Wu,x:$us.id)),E.current=new Set;let Ku=lu?.selectable??!0;for(let s of H.current){let Nu=o.get(s);if(!Nu)continue;for(let{edgeId:Eu}of Nu.values()){let Hu=b.get(Eu);if(Hu&&(Hu.selectable??Ku))E.current.add(Eu)}}if(!u9(e,H.current)){let s=Ay(I,H.current,!0);g(s)}if(!u9(uu,E.current)){let s=Ay(b,E.current);x(s)}w.setState({userSelectionRect:P,userSelectionActive:!0,nodesSelectionActive:!1})},X=(T)=>{if(T.button!==0)return;if(T.target?.releasePointerCapture?.(T.pointerId),!L&&T.target===z.current&&w.getState().userSelectionRect)h?.(T);if(w.setState({userSelectionActive:!1,userSelectionRect:null}),D.current)t?.(T),w.setState({nodesSelectionActive:H.current.size>0})},v=r===!0||Array.isArray(r)&&r.includes(0);return ru.jsxs("div",{className:Sl(["react-flow__pane",{draggable:v,dragging:N,selection:u}]),onClick:W?void 0:F9(h,z),onContextMenu:F9(V,z),onWheel:F9(S,z),onPointerEnter:W?void 0:j,onPointerMove:W?m:F,onPointerUp:W?X:void 0,onPointerDownCapture:W?O:void 0,onClickCapture:W?p:void 0,onPointerLeave:J,ref:z,style:c6,children:[Q,ru.jsx(mD,{})]})}function Q9({id:u,store:l,unselect:f=!1,nodeRef:r}){let{addSelectedNodes:n,unselectNodesAndEdges:i,multiSelectionActive:y,nodeLookup:t,onError:_}=l.getState(),c=t.get(u);if(!c){_?.("012",Ur.error012(u));return}if(l.setState({nodesSelectionActive:!1}),!c.selected)n([u]);else if(f||c.selected&&y)i({nodes:[c],edges:[]}),requestAnimationFrame(()=>r?.current?.blur())}function TW({nodeRef:u,disabled:l=!1,noDragClassName:f,handleSelector:r,nodeId:n,isSelectable:i,nodeClickDistance:y}){let t=El(),[_,c]=yu.useState(!1),A=yu.useRef();return yu.useEffect(()=>{A.current=zq({getStoreItems:()=>t.getState(),onNodeMouseDown:(j)=>{Q9({id:j,store:t,nodeRef:u})},onDragStart:()=>{c(!0)},onDragStop:()=>{c(!1)}})},[]),yu.useEffect(()=>{if(l||!u.current||!A.current)return;return A.current.update({noDragClassName:f,handleSelector:r,domNode:u.current,isSelectable:i,nodeId:n,nodeClickDistance:y}),()=>{A.current?.destroy()}},[f,r,l,i,u,n,y]),_}var MD=(u)=>(l)=>l.selected&&(l.draggable||u&&typeof l.draggable>"u");function EW(){let u=El();return yu.useCallback((f)=>{let{nodeExtent:r,snapToGrid:n,snapGrid:i,nodesDraggable:y,onError:t,updateNodePositions:_,nodeLookup:c,nodeOrigin:A}=u.getState(),j=new Map,F=MD(y),J=n?i[0]:5,Q=n?i[1]:5,w=f.direction.x*J*f.factor,L=f.direction.y*Q*f.factor;for(let[,U]of c){if(!F(U))continue;let N={x:U.internals.positionAbsolute.x+w,y:U.internals.positionAbsolute.y+L};if(n)N=ty(N,i);let{position:q,positionAbsolute:W}=g5({nodeId:U.id,nextPosition:N,nodeLookup:c,nodeExtent:r,nodeOrigin:A,onError:t});U.position=q,U.internals.positionAbsolute=W,j.set(U.id,U)}_(j)},[])}var q9=yu.createContext(null),RD=q9.Provider;q9.Consumer;var ZW=()=>{return yu.useContext(q9)},xD=(u)=>({connectOnClick:u.connectOnClick,noPanClassName:u.noPanClassName,rfId:u.rfId}),hD=(u,l,f)=>(r)=>{let{connectionClickStartHandle:n,connectionMode:i,connection:y}=r,{fromHandle:t,toHandle:_,isValid:c}=y,A=_?.nodeId===u&&_?.id===l&&_?.type===f;return{connectingFrom:t?.nodeId===u&&t?.id===l&&t?.type===f,connectingTo:A,clickConnecting:n?.nodeId===u&&n?.id===l&&n?.type===f,isPossibleEndHandle:i===Yn.Strict?t?.type!==f:u!==t?.nodeId||l!==t?.id,connectionInProcess:!!t,clickConnectionInProcess:!!n,valid:A&&c}};function bD({type:u="source",position:l=Lu.Top,isValidConnection:f,isConnectable:r=!0,isConnectableStart:n=!0,isConnectableEnd:i=!0,id:y,onConnect:t,children:_,className:c,onMouseDown:A,onTouchStart:j,...F},J){let Q=y||null,w=u==="target",L=El(),U=ZW(),{connectOnClick:N,noPanClassName:q,rfId:W}=fl(xD,Gl),{connectingFrom:z,connectingTo:Z,clickConnecting:H,isPossibleEndHandle:E,connectionInProcess:D,clickConnectionInProcess:h,valid:V}=fl(hD(U,Q,u),Gl);if(!U)L.getState().onError?.("010",Ur.error010());let S=(m)=>{let{defaultEdgeOptions:X,onConnect:v,hasDefaultEdges:T}=L.getState(),Y={...X,...m};if(T){let{edges:k,setEdges:I}=L.getState();I(i9(Y,k))}v?.(Y),t?.(Y)},p=(m)=>{if(!U)return;let X=r9(m.nativeEvent);if(n&&(X&&m.button===0||!X)){let v=L.getState();f6.onPointerDown(m.nativeEvent,{handleDomNode:m.currentTarget,autoPanOnConnect:v.autoPanOnConnect,connectionMode:v.connectionMode,connectionRadius:v.connectionRadius,domNode:v.domNode,nodeLookup:v.nodeLookup,lib:v.lib,isTarget:w,handleId:Q,nodeId:U,flowId:v.rfId,panBy:v.panBy,cancelConnection:v.cancelConnection,onConnectStart:v.onConnectStart,onConnectEnd:(...T)=>L.getState().onConnectEnd?.(...T),updateConnection:v.updateConnection,onConnect:S,isValidConnection:f||((...T)=>L.getState().isValidConnection?.(...T)??!0),getTransform:()=>L.getState().transform,getFromHandle:()=>L.getState().connection.fromHandle,autoPanSpeed:v.autoPanSpeed,dragThreshold:v.connectionDragThreshold})}if(X)A?.(m);else j?.(m)},O=(m)=>{let{onClickConnectStart:X,onClickConnectEnd:v,connectionClickStartHandle:T,connectionMode:Y,isValidConnection:k,lib:I,rfId:b,nodeLookup:o,connection:g}=L.getState();if(!U||!T&&!n)return;if(!T){X?.(m.nativeEvent,{nodeId:U,handleId:Q,handleType:u}),L.setState({connectionClickStartHandle:{nodeId:U,type:u,id:Q}});return}let x=l9(m.target),lu=f||k,{connection:_u,isValid:$u}=f6.isValid(m.nativeEvent,{handle:{nodeId:U,id:Q,type:u},connectionMode:Y,fromNodeId:T.nodeId,fromHandleId:T.id||null,fromType:T.type,isValidConnection:lu,flowId:b,doc:x,lib:I,nodeLookup:o});if($u&&_u)S(_u);let ju=structuredClone(g);delete ju.inProgress,ju.toPosition=ju.toHandle?ju.toHandle.position:null,v?.(m,ju),L.setState({connectionClickStartHandle:null})};return ru.jsx("div",{"data-handleid":Q,"data-nodeid":U,"data-handlepos":l,"data-id":`${W}-${U}-${Q}-${u}`,className:Sl(["react-flow__handle",`react-flow__handle-${l}`,"nodrag",q,c,{source:!w,target:w,connectable:r,connectablestart:n,connectableend:i,clickconnecting:H,connectingfrom:z,connectingto:Z,valid:V,connectionindicator:r&&(!D||E)&&(D||h?i:n)}]),onMouseDown:p,onTouchStart:p,onClick:N?O:void 0,ref:J,...F,children:_})}var Ri=yu.memo(GW(bD));function vD({data:u,isConnectable:l,sourcePosition:f=Lu.Bottom}){return ru.jsxs(ru.Fragment,{children:[u?.label,ru.jsx(Ri,{type:"source",position:f,isConnectable:l})]})}function kD({data:u,isConnectable:l,targetPosition:f=Lu.Top,sourcePosition:r=Lu.Bottom}){return ru.jsxs(ru.Fragment,{children:[ru.jsx(Ri,{type:"target",position:f,isConnectable:l}),u?.label,ru.jsx(Ri,{type:"source",position:r,isConnectable:l})]})}function ID(){return null}function gD({data:u,isConnectable:l,targetPosition:f=Lu.Top}){return ru.jsxs(ru.Fragment,{children:[ru.jsx(Ri,{type:"target",position:f,isConnectable:l}),u?.label]})}var t6={ArrowUp:{x:0,y:-1},ArrowDown:{x:0,y:1},ArrowLeft:{x:-1,y:0},ArrowRight:{x:1,y:0}},tW={input:vD,default:kD,output:gD,group:ID};function sD(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 aD=(u)=>{let{width:l,height:f,x:r,y:n}=iy(u.nodeLookup,{filter:(i)=>!!i.selected});return{width:Zr(l)?l:null,height:Zr(f)?f:null,userSelectionActive:u.userSelectionActive,transformString:`translate(${u.transform[0]}px,${u.transform[1]}px) scale(${u.transform[2]}) translate(${r}px,${n}px)`}};function oD({onSelectionContextMenu:u,noPanClassName:l,disableKeyboardA11y:f}){let r=El(),{width:n,height:i,transformString:y,userSelectionActive:t}=fl(aD,Gl),_=EW(),c=yu.useRef(null);yu.useEffect(()=>{if(!f)c.current?.focus({preventScroll:!0})},[f]);let A=!t&&n!==null&&i!==null;if(TW({nodeRef:c,disabled:!A}),!A)return null;let j=u?(J)=>{let Q=r.getState().nodes.filter((w)=>w.selected);u(J,Q)}:void 0,F=(J)=>{if(Object.prototype.hasOwnProperty.call(t6,J.key))J.preventDefault(),_({direction:t6[J.key],factor:J.shiftKey?4:1})};return ru.jsx("div",{className:Sl(["react-flow__nodesselection","react-flow__container",l]),style:{transform:y},children:ru.jsx("div",{ref:c,className:"react-flow__nodesselection-rect",onContextMenu:j,tabIndex:f?void 0:-1,onKeyDown:f?void 0:F,style:{width:n,height:i}})})}var _W=typeof window<"u"?window:void 0,dD=(u)=>{return{nodesSelectionActive:u.nodesSelectionActive,userSelectionActive:u.userSelectionActive}};function OW({children:u,onPaneClick:l,onPaneMouseEnter:f,onPaneMouseMove:r,onPaneMouseLeave:n,onPaneContextMenu:i,onPaneScroll:y,paneClickDistance:t,deleteKeyCode:_,selectionKeyCode:c,selectionOnDrag:A,selectionMode:j,onSelectionStart:F,onSelectionEnd:J,multiSelectionKeyCode:Q,panActivationKeyCode:w,zoomActivationKeyCode:L,elementsSelectable:U,zoomOnScroll:N,zoomOnPinch:q,panOnScroll:W,panOnScrollSpeed:z,panOnScrollMode:Z,zoomOnDoubleClick:H,panOnDrag:E,defaultViewport:D,translateExtent:h,minZoom:V,maxZoom:S,preventScrolling:p,onSelectionContextMenu:O,noWheelClassName:m,noPanClassName:X,disableKeyboardA11y:v,onViewportChange:T,isControlledViewport:Y}){let{nodesSelectionActive:k,userSelectionActive:I}=fl(dD,Gl),b=H_(c,{target:_W}),o=H_(w,{target:_W}),g=o||E,x=o||W,lu=A&&g!==!0,_u=b||I||lu;return DD({deleteKeyCode:_,multiSelectionKeyCode:Q}),ru.jsx(YD,{onPaneContextMenu:i,elementsSelectable:U,zoomOnScroll:N,zoomOnPinch:q,panOnScroll:x,panOnScrollSpeed:z,panOnScrollMode:Z,zoomOnDoubleClick:H,panOnDrag:!b&&g,defaultViewport:D,translateExtent:h,minZoom:V,maxZoom:S,zoomActivationKeyCode:L,preventScrolling:p,noWheelClassName:m,noPanClassName:X,onViewportChange:T,isControlledViewport:Y,paneClickDistance:t,selectionOnDrag:lu,children:ru.jsxs(CD,{onSelectionStart:F,onSelectionEnd:J,onPaneClick:l,onPaneMouseEnter:f,onPaneMouseMove:r,onPaneMouseLeave:n,onPaneContextMenu:i,onPaneScroll:y,panOnDrag:g,isSelecting:!!_u,selectionMode:j,selectionKeyPressed:b,paneClickDistance:t,selectionOnDrag:lu,children:[u,k&&ru.jsx(oD,{onSelectionContextMenu:O,noPanClassName:X,disableKeyboardA11y:v})]})})}OW.displayName="FlowRenderer";var eD=yu.memo(OW),uX=(u)=>(l)=>{return u?kc(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 lX(u){return fl(yu.useCallback(uX(u),[u]),Gl)}var fX=(u)=>u.updateNodeInternals;function rX(){let u=fl(fX),[l]=yu.useState(()=>{if(typeof ResizeObserver>"u")return null;return new ResizeObserver((f)=>{let r=new Map;f.forEach((n)=>{let i=n.target.getAttribute("data-id");r.set(i,{id:i,nodeElement:n.target,force:!0})}),u(r)})});return yu.useEffect(()=>{return()=>{l?.disconnect()}},[l]),l}function nX({node:u,nodeType:l,hasDimensions:f,resizeObserver:r}){let n=El(),i=yu.useRef(null),y=yu.useRef(null),t=yu.useRef(u.sourcePosition),_=yu.useRef(u.targetPosition),c=yu.useRef(l),A=f&&!!u.internals.handleBounds;return yu.useEffect(()=>{if(i.current&&!u.hidden&&(!A||y.current!==i.current)){if(y.current)r?.unobserve(y.current);r?.observe(i.current),y.current=i.current}},[A,u.hidden]),yu.useEffect(()=>{return()=>{if(y.current)r?.unobserve(y.current),y.current=null}},[]),yu.useEffect(()=>{if(i.current){let j=c.current!==l,F=t.current!==u.sourcePosition,J=_.current!==u.targetPosition;if(j||F||J)c.current=l,t.current=u.sourcePosition,_.current=u.targetPosition,n.getState().updateNodeInternals(new Map([[u.id,{id:u.id,nodeElement:i.current,force:!0}]]))}},[u.id,l,u.sourcePosition,u.targetPosition]),i}function iX({id:u,onClick:l,onMouseEnter:f,onMouseMove:r,onMouseLeave:n,onContextMenu:i,onDoubleClick:y,nodesDraggable:t,elementsSelectable:_,nodesConnectable:c,nodesFocusable:A,resizeObserver:j,noDragClassName:F,noPanClassName:J,disableKeyboardA11y:Q,rfId:w,nodeTypes:L,nodeClickDistance:U,onError:N}){let{node:q,internals:W,isParent:z}=fl(($u)=>{let ju=$u.nodeLookup.get(u),zu=$u.parentLookup.has(u);return{node:ju,internals:ju.internals,isParent:zu}},Gl),Z=q.type||"default",H=L?.[Z]||tW[Z];if(H===void 0)N?.("003",Ur.error003(Z)),Z="default",H=L?.default||tW.default;let E=!!(q.draggable||t&&typeof q.draggable>"u"),D=!!(q.selectable||_&&typeof q.selectable>"u"),h=!!(q.connectable||c&&typeof q.connectable>"u"),V=!!(q.focusable||A&&typeof q.focusable>"u"),S=El(),p=d5(q),O=nX({node:q,nodeType:Z,hasDimensions:p,resizeObserver:j}),m=TW({nodeRef:O,disabled:q.hidden||!E,noDragClassName:F,handleSelector:q.dragHandle,nodeId:u,isSelectable:D,nodeClickDistance:U}),X=EW();if(q.hidden)return null;let v=A0(q),T=sD(q),Y=D||E||l||f||r||n,k=f?($u)=>f($u,{...W.userNode}):void 0,I=r?($u)=>r($u,{...W.userNode}):void 0,b=n?($u)=>n($u,{...W.userNode}):void 0,o=i?($u)=>i($u,{...W.userNode}):void 0,g=y?($u)=>y($u,{...W.userNode}):void 0,x=($u)=>{let{selectNodesOnDrag:ju,nodeDragThreshold:zu}=S.getState();if(D&&(!ju||!E||zu>0))Q9({id:u,store:S,nodeRef:O});if(l)l($u,{...W.userNode})},lu=($u)=>{if(f9($u.nativeEvent)||Q)return;if(R5.includes($u.key)&&D){let ju=$u.key==="Escape";Q9({id:u,store:S,unselect:ju,nodeRef:O})}else if(E&&q.selected&&Object.prototype.hasOwnProperty.call(t6,$u.key)){$u.preventDefault();let{ariaLabelConfig:ju}=S.getState();S.setState({ariaLiveMessage:ju["node.a11yDescription.ariaLiveMessage"]({direction:$u.key.replace("Arrow","").toLowerCase(),x:~~W.positionAbsolute.x,y:~~W.positionAbsolute.y})}),X({direction:t6[$u.key],factor:$u.shiftKey?4:1})}},_u=()=>{if(Q||!O.current?.matches(":focus-visible"))return;let{transform:$u,width:ju,height:zu,autoPanOnNodeFocus:Wu,setCenter:P}=S.getState();if(!Wu)return;if(!(kc(new Map([[u,q]]),{x:0,y:0,width:ju,height:zu},$u,!0).length>0))P(q.position.x+v.width/2,q.position.y+v.height/2,{zoom:$u[2]})};return ru.jsx("div",{className:Sl(["react-flow__node",`react-flow__node-${Z}`,{[J]:E},q.className,{selected:q.selected,selectable:D,parent:z,draggable:E,dragging:m}]),ref:O,style:{zIndex:W.z,transform:`translate(${W.positionAbsolute.x}px,${W.positionAbsolute.y}px)`,pointerEvents:Y?"all":"none",visibility:p?"visible":"hidden",...q.style,...T},"data-id":u,"data-testid":`rf__node-${u}`,onMouseEnter:k,onMouseMove:I,onMouseLeave:b,onContextMenu:o,onClick:x,onDoubleClick:g,onKeyDown:V?lu:void 0,tabIndex:V?0:void 0,onFocus:V?_u:void 0,role:q.ariaRole??(V?"group":void 0),"aria-roledescription":"node","aria-describedby":Q?void 0:`${WW}-${w}`,"aria-label":q.ariaLabel,...q.domAttributes,children:ru.jsx(RD,{value:u,children:ru.jsx(H,{id:u,data:q.data,type:Z,positionAbsoluteX:W.positionAbsolute.x,positionAbsoluteY:W.positionAbsolute.y,selected:q.selected??!1,selectable:D,draggable:E,deletable:q.deletable??!0,isConnectable:h,sourcePosition:q.sourcePosition,targetPosition:q.targetPosition,dragging:m,dragHandle:q.dragHandle,zIndex:W.z,parentId:q.parentId,...v})})})}var yX=yu.memo(iX),tX=(u)=>({nodesDraggable:u.nodesDraggable,nodesConnectable:u.nodesConnectable,nodesFocusable:u.nodesFocusable,elementsSelectable:u.elementsSelectable,onError:u.onError});function HW(u){let{nodesDraggable:l,nodesConnectable:f,nodesFocusable:r,elementsSelectable:n,onError:i}=fl(tX,Gl),y=lX(u.onlyRenderVisibleElements),t=rX();return ru.jsx("div",{className:"react-flow__nodes",style:c6,children:y.map((_)=>{return ru.jsx(yX,{id:_,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:t,nodesDraggable:l,nodesConnectable:f,nodesFocusable:r,elementsSelectable:n,nodeClickDistance:u.nodeClickDistance,onError:i},_)})})}HW.displayName="NodeRenderer";var _X=yu.memo(HW);function $X(u){return fl(yu.useCallback((f)=>{if(!u)return f.edges.map((n)=>n.id);let r=[];if(f.width&&f.height)for(let n of f.edges){let i=f.nodeLookup.get(n.source),y=f.nodeLookup.get(n.target);if(i&&y&&Jq({sourceNode:i,targetNode:y,width:f.width,height:f.height,transform:f.transform}))r.push(n.id)}return r},[u]),Gl)}var cX=({color:u="none",strokeWidth:l=1})=>{let f={strokeWidth:l,...u&&{stroke:u}};return ru.jsx("polyline",{className:"arrow",style:f,strokeLinecap:"round",fill:"none",strokeLinejoin:"round",points:"-5,-4 0,0 -5,4"})},AX=({color:u="none",strokeWidth:l=1})=>{let f={strokeWidth:l,...u&&{stroke:u,fill:u}};return ru.jsx("polyline",{className:"arrowclosed",style:f,strokeLinecap:"round",strokeLinejoin:"round",points:"-5,-4 0,0 -5,4 -5,-4"})},$W={[pn.Arrow]:cX,[pn.ArrowClosed]:AX};function jX(u){let l=El();return yu.useMemo(()=>{if(!Object.prototype.hasOwnProperty.call($W,u))return l.getState().onError?.("009",Ur.error009(u)),null;return $W[u]},[u])}var FX=({id:u,type:l,color:f,width:r=12.5,height:n=12.5,markerUnits:i="strokeWidth",strokeWidth:y,orient:t="auto-start-reverse"})=>{let _=jX(l);if(!_)return null;return ru.jsx("marker",{className:"react-flow__arrowhead",id:u,markerWidth:`${r}`,markerHeight:`${n}`,viewBox:"-10 -10 20 20",markerUnits:i,orient:t,refX:"0",refY:"0",children:ru.jsx(_,{color:f,strokeWidth:y})})},BW=({defaultColor:u,rfId:l})=>{let f=fl((i)=>i.edges),r=fl((i)=>i.defaultEdgeOptions),n=yu.useMemo(()=>{return Nq(f,{id:l,defaultColor:u,defaultMarkerStart:r?.markerStart,defaultMarkerEnd:r?.markerEnd})},[f,r,l,u]);if(!n.length)return null;return ru.jsx("svg",{className:"react-flow__marker","aria-hidden":"true",children:ru.jsx("defs",{children:n.map((i)=>ru.jsx(FX,{id:i.id,type:i.type,color:i.color,width:i.width,height:i.height,markerUnits:i.markerUnits,strokeWidth:i.strokeWidth,orient:i.orient},i.id))})})};BW.displayName="MarkerDefinitions";var UX=yu.memo(BW);function VW({x:u,y:l,label:f,labelStyle:r,labelShowBg:n=!0,labelBgStyle:i,labelBgPadding:y=[2,4],labelBgBorderRadius:t=2,children:_,className:c,...A}){let[j,F]=yu.useState({x:1,y:0,width:0,height:0}),J=Sl(["react-flow__edge-textwrapper",c]),Q=yu.useRef(null);if(yu.useEffect(()=>{if(Q.current){let w=Q.current.getBBox();F({x:w.x,y:w.y,width:w.width,height:w.height})}},[f]),!f)return null;return ru.jsxs("g",{transform:`translate(${u-j.width/2} ${l-j.height/2})`,className:J,visibility:j.width?"visible":"hidden",...A,children:[n&&ru.jsx("rect",{width:j.width+2*y[0],x:-y[0],y:-y[1],height:j.height+2*y[1],className:"react-flow__edge-textbg",style:i,rx:t,ry:t}),ru.jsx("text",{className:"react-flow__edge-text",y:j.height/2,dy:"0.3em",ref:Q,style:r,children:f}),_]})}VW.displayName="EdgeText";var JX=yu.memo(VW);function jy({path:u,labelX:l,labelY:f,label:r,labelStyle:n,labelShowBg:i,labelBgStyle:y,labelBgPadding:t,labelBgBorderRadius:_,interactionWidth:c=20,...A}){return ru.jsxs(ru.Fragment,{children:[ru.jsx("path",{...A,d:u,fill:"none",className:Sl(["react-flow__edge-path",A.className])}),c?ru.jsx("path",{d:u,fill:"none",strokeOpacity:0,strokeWidth:c,className:"react-flow__edge-interaction"}):null,r&&Zr(l)&&Zr(f)?ru.jsx(JX,{x:l,y:f,label:r,labelStyle:n,labelShowBg:i,labelBgStyle:y,labelBgPadding:t,labelBgBorderRadius:_}):null]})}function cW({pos:u,x1:l,y1:f,x2:r,y2:n}){if(u===Lu.Left||u===Lu.Right)return[0.5*(l+r),f];return[l,0.5*(f+n)]}function DW({sourceX:u,sourceY:l,sourcePosition:f=Lu.Bottom,targetX:r,targetY:n,targetPosition:i=Lu.Top}){let[y,t]=cW({pos:f,x1:u,y1:l,x2:r,y2:n}),[_,c]=cW({pos:i,x1:r,y1:n,x2:u,y2:l}),[A,j,F,J]=ac({sourceX:u,sourceY:l,targetX:r,targetY:n,sourceControlX:y,sourceControlY:t,targetControlX:_,targetControlY:c});return[`M${u},${l} C${y},${t} ${_},${c} ${r},${n}`,A,j,F,J]}function XW(u){return yu.memo(({id:l,sourceX:f,sourceY:r,targetX:n,targetY:i,sourcePosition:y,targetPosition:t,label:_,labelStyle:c,labelShowBg:A,labelBgStyle:j,labelBgPadding:F,labelBgBorderRadius:J,style:Q,markerEnd:w,markerStart:L,interactionWidth:U})=>{let[N,q,W]=DW({sourceX:f,sourceY:r,sourcePosition:y,targetX:n,targetY:i,targetPosition:t}),z=u.isInternal?void 0:l;return ru.jsx(jy,{id:z,path:N,labelX:q,labelY:W,label:_,labelStyle:c,labelShowBg:A,labelBgStyle:j,labelBgPadding:F,labelBgBorderRadius:J,style:Q,markerEnd:w,markerStart:L,interactionWidth:U})})}var QX=XW({isInternal:!1}),SW=XW({isInternal:!0});QX.displayName="SimpleBezierEdge";SW.displayName="SimpleBezierEdgeInternal";function YW(u){return yu.memo(({id:l,sourceX:f,sourceY:r,targetX:n,targetY:i,label:y,labelStyle:t,labelShowBg:_,labelBgStyle:c,labelBgPadding:A,labelBgBorderRadius:j,style:F,sourcePosition:J=Lu.Bottom,targetPosition:Q=Lu.Top,markerEnd:w,markerStart:L,pathOptions:U,interactionWidth:N})=>{let[q,W,z]=O_({sourceX:f,sourceY:r,sourcePosition:J,targetX:n,targetY:i,targetPosition:Q,borderRadius:U?.borderRadius,offset:U?.offset,stepPosition:U?.stepPosition}),Z=u.isInternal?void 0:l;return ru.jsx(jy,{id:Z,path:q,labelX:W,labelY:z,label:y,labelStyle:t,labelShowBg:_,labelBgStyle:c,labelBgPadding:A,labelBgBorderRadius:j,style:F,markerEnd:w,markerStart:L,interactionWidth:N})})}var pW=YW({isInternal:!1}),mW=YW({isInternal:!0});pW.displayName="SmoothStepEdge";mW.displayName="SmoothStepEdgeInternal";function PW(u){return yu.memo(({id:l,...f})=>{let r=u.isInternal?void 0:l;return ru.jsx(pW,{...f,id:r,pathOptions:yu.useMemo(()=>({borderRadius:0,offset:f.pathOptions?.offset}),[f.pathOptions?.offset])})})}var NX=PW({isInternal:!1}),CW=PW({isInternal:!0});NX.displayName="StepEdge";CW.displayName="StepEdgeInternal";function MW(u){return yu.memo(({id:l,sourceX:f,sourceY:r,targetX:n,targetY:i,label:y,labelStyle:t,labelShowBg:_,labelBgStyle:c,labelBgPadding:A,labelBgBorderRadius:j,style:F,markerEnd:J,markerStart:Q,interactionWidth:w})=>{let[L,U,N]=dc({sourceX:f,sourceY:r,targetX:n,targetY:i}),q=u.isInternal?void 0:l;return ru.jsx(jy,{id:q,path:L,labelX:U,labelY:N,label:y,labelStyle:t,labelShowBg:_,labelBgStyle:c,labelBgPadding:A,labelBgBorderRadius:j,style:F,markerEnd:J,markerStart:Q,interactionWidth:w})})}var qX=MW({isInternal:!1}),RW=MW({isInternal:!0});qX.displayName="StraightEdge";RW.displayName="StraightEdgeInternal";function xW(u){return yu.memo(({id:l,sourceX:f,sourceY:r,targetX:n,targetY:i,sourcePosition:y=Lu.Bottom,targetPosition:t=Lu.Top,label:_,labelStyle:c,labelShowBg:A,labelBgStyle:j,labelBgPadding:F,labelBgBorderRadius:J,style:Q,markerEnd:w,markerStart:L,pathOptions:U,interactionWidth:N})=>{let[q,W,z]=oc({sourceX:f,sourceY:r,sourcePosition:y,targetX:n,targetY:i,targetPosition:t,curvature:U?.curvature}),Z=u.isInternal?void 0:l;return ru.jsx(jy,{id:Z,path:q,labelX:W,labelY:z,label:_,labelStyle:c,labelShowBg:A,labelBgStyle:j,labelBgPadding:F,labelBgBorderRadius:J,style:Q,markerEnd:w,markerStart:L,interactionWidth:N})})}var WX=xW({isInternal:!1}),hW=xW({isInternal:!0});WX.displayName="BezierEdge";hW.displayName="BezierEdgeInternal";var AW={default:hW,straight:RW,step:CW,smoothstep:mW,simplebezier:SW},jW={sourceX:null,sourceY:null,targetX:null,targetY:null,sourcePosition:null,targetPosition:null},wX=(u,l,f)=>{if(f===Lu.Left)return u-l;if(f===Lu.Right)return u+l;return u},LX=(u,l,f)=>{if(f===Lu.Top)return u-l;if(f===Lu.Bottom)return u+l;return u},FW="react-flow__edgeupdater";function UW({position:u,centerX:l,centerY:f,radius:r=10,onMouseDown:n,onMouseEnter:i,onMouseOut:y,type:t}){return ru.jsx("circle",{onMouseDown:n,onMouseEnter:i,onMouseOut:y,className:Sl([FW,`${FW}-${t}`]),cx:wX(l,r,u),cy:LX(f,r,u),r,stroke:"transparent",fill:"transparent"})}function KX({isReconnectable:u,reconnectRadius:l,edge:f,sourceX:r,sourceY:n,targetX:i,targetY:y,sourcePosition:t,targetPosition:_,onReconnect:c,onReconnectStart:A,onReconnectEnd:j,setReconnecting:F,setUpdateHover:J}){let Q=El(),w=(W,z)=>{if(W.button!==0)return;let{autoPanOnConnect:Z,domNode:H,connectionMode:E,connectionRadius:D,lib:h,onConnectStart:V,cancelConnection:S,nodeLookup:p,rfId:O,panBy:m,updateConnection:X}=Q.getState(),v=z.type==="target",T=(I,b)=>{F(!1),j?.(I,f,z.type,b)},Y=(I)=>c?.(f,I),k=(I,b)=>{F(!0),A?.(W,f,z.type),V?.(I,b)};f6.onPointerDown(W.nativeEvent,{autoPanOnConnect:Z,connectionMode:E,connectionRadius:D,domNode:H,handleId:z.id,nodeId:z.nodeId,nodeLookup:p,isTarget:v,edgeUpdaterType:z.type,lib:h,flowId:O,cancelConnection:S,panBy:m,isValidConnection:(...I)=>Q.getState().isValidConnection?.(...I)??!0,onConnect:Y,onConnectStart:k,onConnectEnd:(...I)=>Q.getState().onConnectEnd?.(...I),onReconnectEnd:T,updateConnection:X,getTransform:()=>Q.getState().transform,getFromHandle:()=>Q.getState().connection.fromHandle,dragThreshold:Q.getState().connectionDragThreshold,handleDomNode:W.currentTarget})},L=(W)=>w(W,{nodeId:f.target,id:f.targetHandle??null,type:"target"}),U=(W)=>w(W,{nodeId:f.source,id:f.sourceHandle??null,type:"source"}),N=()=>J(!0),q=()=>J(!1);return ru.jsxs(ru.Fragment,{children:[(u===!0||u==="source")&&ru.jsx(UW,{position:t,centerX:r,centerY:n,radius:l,onMouseDown:L,onMouseEnter:N,onMouseOut:q,type:"source"}),(u===!0||u==="target")&&ru.jsx(UW,{position:_,centerX:i,centerY:y,radius:l,onMouseDown:U,onMouseEnter:N,onMouseOut:q,type:"target"})]})}function GX({id:u,edgesFocusable:l,edgesReconnectable:f,elementsSelectable:r,onClick:n,onDoubleClick:i,onContextMenu:y,onMouseEnter:t,onMouseMove:_,onMouseLeave:c,reconnectRadius:A,onReconnect:j,onReconnectStart:F,onReconnectEnd:J,rfId:Q,edgeTypes:w,noPanClassName:L,onError:U,disableKeyboardA11y:N}){let q=fl((P)=>P.edgeLookup.get(u)),W=fl((P)=>P.defaultEdgeOptions);q=W?{...W,...q}:q;let z=q.type||"default",Z=w?.[z]||AW[z];if(Z===void 0)U?.("011",Ur.error011(z)),z="default",Z=w?.default||AW.default;let H=!!(q.focusable||l&&typeof q.focusable>"u"),E=typeof j<"u"&&(q.reconnectable||f&&typeof q.reconnectable>"u"),D=!!(q.selectable||r&&typeof q.selectable>"u"),h=yu.useRef(null),[V,S]=yu.useState(!1),[p,O]=yu.useState(!1),m=El(),{zIndex:X,sourceX:v,sourceY:T,targetX:Y,targetY:k,sourcePosition:I,targetPosition:b}=fl(yu.useCallback((P)=>{let e=P.nodeLookup.get(q.source),uu=P.nodeLookup.get(q.target);if(!e||!uu)return{zIndex:q.zIndex,...jW};let Ku=Qq({id:u,sourceNode:e,targetNode:uu,sourceHandle:q.sourceHandle||null,targetHandle:q.targetHandle||null,connectionMode:P.connectionMode,onError:U});return{zIndex:Uq({selected:q.selected,zIndex:q.zIndex,sourceNode:e,targetNode:uu,elevateOnSelect:P.elevateEdgesOnSelect,zIndexMode:P.zIndexMode}),...Ku||jW}},[q.source,q.target,q.sourceHandle,q.targetHandle,q.selected,q.zIndex]),Gl),o=yu.useMemo(()=>q.markerStart?`url('#${ec(q.markerStart,Q)}')`:void 0,[q.markerStart,Q]),g=yu.useMemo(()=>q.markerEnd?`url('#${ec(q.markerEnd,Q)}')`:void 0,[q.markerEnd,Q]);if(q.hidden||v===null||T===null||Y===null||k===null)return null;let x=(P)=>{let{addSelectedEdges:e,unselectNodesAndEdges:uu,multiSelectionActive:Ku}=m.getState();if(D)if(m.setState({nodesSelectionActive:!1}),q.selected&&Ku)uu({nodes:[],edges:[q]}),h.current?.blur();else e([u]);if(n)n(P,q)},lu=i?(P)=>{i(P,{...q})}:void 0,_u=y?(P)=>{y(P,{...q})}:void 0,$u=t?(P)=>{t(P,{...q})}:void 0,ju=_?(P)=>{_(P,{...q})}:void 0,zu=c?(P)=>{c(P,{...q})}:void 0,Wu=(P)=>{if(!N&&R5.includes(P.key)&&D){let{unselectNodesAndEdges:e,addSelectedEdges:uu}=m.getState();if(P.key==="Escape")h.current?.blur(),e({edges:[q]});else uu([u])}};return ru.jsx("svg",{style:{zIndex:X},children:ru.jsxs("g",{className:Sl(["react-flow__edge",`react-flow__edge-${z}`,q.className,L,{selected:q.selected,animated:q.animated,inactive:!D&&!n,updating:V,selectable:D}]),onClick:x,onDoubleClick:lu,onContextMenu:_u,onMouseEnter:$u,onMouseMove:ju,onMouseLeave:zu,onKeyDown:H?Wu:void 0,tabIndex:H?0:void 0,role:q.ariaRole??(H?"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":H?`${wW}-${Q}`:void 0,ref:h,...q.domAttributes,children:[!p&&ru.jsx(Z,{id:u,source:q.source,target:q.target,type:q.type,selected:q.selected,animated:q.animated,selectable:D,deletable:q.deletable??!0,label:q.label,labelStyle:q.labelStyle,labelShowBg:q.labelShowBg,labelBgStyle:q.labelBgStyle,labelBgPadding:q.labelBgPadding,labelBgBorderRadius:q.labelBgBorderRadius,sourceX:v,sourceY:T,targetX:Y,targetY:k,sourcePosition:I,targetPosition:b,data:q.data,style:q.style,sourceHandleId:q.sourceHandle,targetHandleId:q.targetHandle,markerStart:o,markerEnd:g,pathOptions:"pathOptions"in q?q.pathOptions:void 0,interactionWidth:q.interactionWidth}),E&&ru.jsx(KX,{edge:q,isReconnectable:E,reconnectRadius:A,onReconnect:j,onReconnectStart:F,onReconnectEnd:J,sourceX:v,sourceY:T,targetX:Y,targetY:k,sourcePosition:I,targetPosition:b,setUpdateHover:S,setReconnecting:O})]})})}var zX=yu.memo(GX),TX=(u)=>({edgesFocusable:u.edgesFocusable,edgesReconnectable:u.edgesReconnectable,elementsSelectable:u.elementsSelectable,connectionMode:u.connectionMode,onError:u.onError});function bW({defaultMarkerColor:u,onlyRenderVisibleElements:l,rfId:f,edgeTypes:r,noPanClassName:n,onReconnect:i,onEdgeContextMenu:y,onEdgeMouseEnter:t,onEdgeMouseMove:_,onEdgeMouseLeave:c,onEdgeClick:A,reconnectRadius:j,onEdgeDoubleClick:F,onReconnectStart:J,onReconnectEnd:Q,disableKeyboardA11y:w}){let{edgesFocusable:L,edgesReconnectable:U,elementsSelectable:N,onError:q}=fl(TX,Gl),W=$X(l);return ru.jsxs("div",{className:"react-flow__edges",children:[ru.jsx(UX,{defaultColor:u,rfId:f}),W.map((z)=>{return ru.jsx(zX,{id:z,edgesFocusable:L,edgesReconnectable:U,elementsSelectable:N,noPanClassName:n,onReconnect:i,onContextMenu:y,onMouseEnter:t,onMouseMove:_,onMouseLeave:c,onClick:A,reconnectRadius:j,onDoubleClick:F,onReconnectStart:J,onReconnectEnd:Q,rfId:f,onError:q,edgeTypes:r,disableKeyboardA11y:w},z)})]})}bW.displayName="EdgeRenderer";var EX=yu.memo(bW),ZX=(u)=>`translate(${u.transform[0]}px,${u.transform[1]}px) scale(${u.transform[2]})`;function OX({children:u}){let l=fl(ZX);return ru.jsx("div",{className:"react-flow__viewport xyflow__viewport react-flow__container",style:{transform:l},children:u})}function HX(u){let l=N9(),f=yu.useRef(!1);yu.useEffect(()=>{if(!f.current&&l.viewportInitialized&&u)setTimeout(()=>u(l),1),f.current=!0},[u,l.viewportInitialized])}var BX=(u)=>u.panZoom?.syncViewport;function VX(u){let l=fl(BX),f=El();return yu.useEffect(()=>{if(u)l?.(u),f.setState({transform:[u.x,u.y,u.zoom]})},[u,l]),null}function JW(u){return u.connection.inProgress?{...u.connection,to:_y(u.connection.to,u.transform)}:{...u.connection}}function DX(u){if(u)return(f)=>{let r=JW(f);return u(r)};return JW}function XX(u){let l=DX(u);return fl(l,Gl)}var SX=(u)=>({nodesConnectable:u.nodesConnectable,isValid:u.connection.isValid,inProgress:u.connection.inProgress,width:u.width,height:u.height});function YX({containerStyle:u,style:l,type:f,component:r}){let{nodesConnectable:n,width:i,height:y,isValid:t,inProgress:_}=fl(SX,Gl);if(!(i&&n&&_))return null;return ru.jsx("svg",{style:u,width:i,height:y,className:"react-flow__connectionline react-flow__container",children:ru.jsx("g",{className:Sl(["react-flow__connection",b5(t)]),children:ru.jsx(vW,{style:l,type:f,CustomComponent:r,isValid:t})})})}var vW=({style:u,type:l=c0.Bezier,CustomComponent:f,isValid:r})=>{let{inProgress:n,from:i,fromNode:y,fromHandle:t,fromPosition:_,to:c,toNode:A,toHandle:j,toPosition:F,pointer:J}=XX();if(!n)return;if(f)return ru.jsx(f,{connectionLineType:l,connectionLineStyle:u,fromNode:y,fromHandle:t,fromX:i.x,fromY:i.y,toX:c.x,toY:c.y,fromPosition:_,toPosition:F,connectionStatus:b5(r),toNode:A,toHandle:j,pointer:J});let Q="",w={sourceX:i.x,sourceY:i.y,sourcePosition:_,targetX:c.x,targetY:c.y,targetPosition:F};switch(l){case c0.Bezier:[Q]=oc(w);break;case c0.SimpleBezier:[Q]=DW(w);break;case c0.Step:[Q]=O_({...w,borderRadius:0});break;case c0.SmoothStep:[Q]=O_(w);break;default:[Q]=dc(w)}return ru.jsx("path",{d:Q,fill:"none",className:"react-flow__connection-path",style:u})};vW.displayName="ConnectionLine";var pX={};function QW(u=pX){let l=yu.useRef(u),f=El();yu.useEffect(()=>{},[u])}function mX(){let u=El(),l=yu.useRef(!1);yu.useEffect(()=>{},[])}function kW({nodeTypes:u,edgeTypes:l,onInit:f,onNodeClick:r,onEdgeClick:n,onNodeDoubleClick:i,onEdgeDoubleClick:y,onNodeMouseEnter:t,onNodeMouseMove:_,onNodeMouseLeave:c,onNodeContextMenu:A,onSelectionContextMenu:j,onSelectionStart:F,onSelectionEnd:J,connectionLineType:Q,connectionLineStyle:w,connectionLineComponent:L,connectionLineContainerStyle:U,selectionKeyCode:N,selectionOnDrag:q,selectionMode:W,multiSelectionKeyCode:z,panActivationKeyCode:Z,zoomActivationKeyCode:H,deleteKeyCode:E,onlyRenderVisibleElements:D,elementsSelectable:h,defaultViewport:V,translateExtent:S,minZoom:p,maxZoom:O,preventScrolling:m,defaultMarkerColor:X,zoomOnScroll:v,zoomOnPinch:T,panOnScroll:Y,panOnScrollSpeed:k,panOnScrollMode:I,zoomOnDoubleClick:b,panOnDrag:o,onPaneClick:g,onPaneMouseEnter:x,onPaneMouseMove:lu,onPaneMouseLeave:_u,onPaneScroll:$u,onPaneContextMenu:ju,paneClickDistance:zu,nodeClickDistance:Wu,onEdgeContextMenu:P,onEdgeMouseEnter:e,onEdgeMouseMove:uu,onEdgeMouseLeave:Ku,reconnectRadius:s,onReconnect:Nu,onReconnectStart:Eu,onReconnectEnd:Hu,noDragClassName:vu,noWheelClassName:ul,noPanClassName:mu,disableKeyboardA11y:Fl,nodeExtent:Uf,rfId:Ef,viewport:lf,onViewportChange:ol}){return QW(u),QW(l),mX(),HX(f),VX(lf),ru.jsx(eD,{onPaneClick:g,onPaneMouseEnter:x,onPaneMouseMove:lu,onPaneMouseLeave:_u,onPaneContextMenu:ju,onPaneScroll:$u,paneClickDistance:zu,deleteKeyCode:E,selectionKeyCode:N,selectionOnDrag:q,selectionMode:W,onSelectionStart:F,onSelectionEnd:J,multiSelectionKeyCode:z,panActivationKeyCode:Z,zoomActivationKeyCode:H,elementsSelectable:h,zoomOnScroll:v,zoomOnPinch:T,zoomOnDoubleClick:b,panOnScroll:Y,panOnScrollSpeed:k,panOnScrollMode:I,panOnDrag:o,defaultViewport:V,translateExtent:S,minZoom:p,maxZoom:O,onSelectionContextMenu:j,preventScrolling:m,noDragClassName:vu,noWheelClassName:ul,noPanClassName:mu,disableKeyboardA11y:Fl,onViewportChange:ol,isControlledViewport:!!lf,children:ru.jsxs(OX,{children:[ru.jsx(EX,{edgeTypes:l,onEdgeClick:n,onEdgeDoubleClick:y,onReconnect:Nu,onReconnectStart:Eu,onReconnectEnd:Hu,onlyRenderVisibleElements:D,onEdgeContextMenu:P,onEdgeMouseEnter:e,onEdgeMouseMove:uu,onEdgeMouseLeave:Ku,reconnectRadius:s,defaultMarkerColor:X,noPanClassName:mu,disableKeyboardA11y:Fl,rfId:Ef}),ru.jsx(YX,{style:w,type:Q,component:L,containerStyle:U}),ru.jsx("div",{className:"react-flow__edgelabel-renderer"}),ru.jsx(_X,{nodeTypes:u,onNodeClick:r,onNodeDoubleClick:i,onNodeMouseEnter:t,onNodeMouseMove:_,onNodeMouseLeave:c,onNodeContextMenu:A,nodeClickDistance:Wu,onlyRenderVisibleElements:D,noPanClassName:mu,noDragClassName:vu,disableKeyboardA11y:Fl,nodeExtent:Uf,rfId:Ef}),ru.jsx("div",{className:"react-flow__viewport-portal"})]})})}kW.displayName="GraphView";var PX=yu.memo(kW),NW=({nodes:u,edges:l,defaultNodes:f,defaultEdges:r,width:n,height:i,fitView:y,fitViewOptions:t,minZoom:_=0.5,maxZoom:c=2,nodeOrigin:A,nodeExtent:j,zIndexMode:F="basic"}={})=>{let J=new Map,Q=new Map,w=new Map,L=new Map,U=r??l??[],N=f??u??[],q=A??[0,0],W=j??ny;c9(w,L,U);let{nodesInitialized:z}=u6(N,J,Q,{nodeOrigin:q,nodeExtent:W,zIndexMode:F}),Z=[0,0,1];if(y&&n&&i){let H=iy(J,{filter:(V)=>!!((V.width||V.initialWidth)&&(V.height||V.initialHeight))}),{x:E,y:D,zoom:h}=Z_(H,n,i,_,c,t?.padding??0.1);Z=[E,D,h]}return{rfId:"1",width:n??0,height:i??0,transform:Z,nodes:N,nodesInitialized:z,nodeLookup:J,parentLookup:Q,edges:U,edgeLookup:L,connectionLookup:w,onNodesChange:null,onEdgesChange:null,hasDefaultNodes:f!==void 0,hasDefaultEdges:r!==void 0,panZoom:null,minZoom:_,maxZoom:c,translateExtent:ny,nodeExtent:W,nodesSelectionActive:!1,userSelectionActive:!1,userSelectionRect:null,connectionMode:Yn.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:y??!1,fitViewOptions:t,fitViewResolver:null,connection:{...h5},connectionClickStartHandle:null,connectOnClick:!0,ariaLiveMessage:"",autoPanOnConnect:!0,autoPanOnNodeDrag:!0,autoPanOnNodeFocus:!0,autoPanSpeed:15,connectionRadius:20,onError:o5,isValidConnection:void 0,onSelectionChangeHandlers:[],lib:"react",debug:!1,ariaLabelConfig:x5,zIndexMode:F,onNodesChangeMiddlewareMap:new Map,onEdgesChangeMiddlewareMap:new Map}},CX=({nodes:u,edges:l,defaultNodes:f,defaultEdges:r,width:n,height:i,fitView:y,fitViewOptions:t,minZoom:_,maxZoom:c,nodeOrigin:A,nodeExtent:j,zIndexMode:F})=>gq((J,Q)=>{async function w(){let{nodeLookup:L,panZoom:U,fitViewOptions:N,fitViewResolver:q,width:W,height:z,minZoom:Z,maxZoom:H}=Q();if(!U)return;await _q({nodes:L,width:W,height:z,panZoom:U,minZoom:Z,maxZoom:H},N),q?.resolve(!0),J({fitViewResolver:null})}return{...NW({nodes:u,edges:l,width:n,height:i,fitView:y,fitViewOptions:t,minZoom:_,maxZoom:c,nodeOrigin:A,nodeExtent:j,defaultNodes:f,defaultEdges:r,zIndexMode:F}),setNodes:(L)=>{let{nodeLookup:U,parentLookup:N,nodeOrigin:q,elevateNodesOnSelect:W,fitViewQueued:z,zIndexMode:Z,nodesSelectionActive:H}=Q(),{nodesInitialized:E,hasSelectedNodes:D}=u6(L,U,N,{nodeOrigin:q,nodeExtent:j,elevateNodesOnSelect:W,checkEquality:!0,zIndexMode:Z}),h=H&&D;if(z&&E)w(),J({nodes:L,nodesInitialized:E,fitViewQueued:!1,fitViewOptions:void 0,nodesSelectionActive:h});else J({nodes:L,nodesInitialized:E,nodesSelectionActive:h})},setEdges:(L)=>{let{connectionLookup:U,edgeLookup:N}=Q();c9(U,N,L),J({edges:L})},setDefaultNodesAndEdges:(L,U)=>{if(L){let{setNodes:N}=Q();N(L),J({hasDefaultNodes:!0})}if(U){let{setEdges:N}=Q();N(U),J({hasDefaultEdges:!0})}},updateNodeInternals:(L)=>{let{triggerNodeChanges:U,nodeLookup:N,parentLookup:q,domNode:W,nodeOrigin:z,nodeExtent:Z,debug:H,fitViewQueued:E,zIndexMode:D}=Q(),{changes:h,updatedInternals:V}=Lq(L,N,q,W,z,Z,D);if(!V)return;if(Wq(N,q,{nodeOrigin:z,nodeExtent:Z,zIndexMode:D}),E)w(),J({fitViewQueued:!1,fitViewOptions:void 0});else J({});if(h?.length>0){if(H)console.log("React Flow: trigger node changes",h);U?.(h)}},updateNodePositions:(L,U=!1)=>{let N=[],q=[],{nodeLookup:W,triggerNodeChanges:z,connection:Z,updateConnection:H,onNodesChangeMiddlewareMap:E}=Q();for(let[D,h]of L){let V=W.get(D),S=!!(V?.expandParent&&V?.parentId&&h?.position),p={id:D,type:"position",position:S?{x:Math.max(0,h.position.x),y:Math.max(0,h.position.y)}:h.position,dragging:U};if(V&&Z.inProgress&&Z.fromNode.id===V.id){let O=mn(V,Z.fromHandle,Lu.Left,!0);H({...Z,from:O})}if(S&&V.parentId)N.push({id:D,parentId:V.parentId,rect:{...h.internals.positionAbsolute,width:h.measured.width??0,height:h.measured.height??0}});q.push(p)}if(N.length>0){let{parentLookup:D,nodeOrigin:h}=Q(),V=l6(N,W,D,h);q.push(...V)}for(let D of E.values())q=D(q);z(q)},triggerNodeChanges:(L)=>{let{onNodesChange:U,setNodes:N,nodes:q,hasDefaultNodes:W,debug:z}=Q();if(L?.length){if(W){let Z=zD(L,q);N(Z)}if(z)console.log("React Flow: trigger node changes",L);U?.(L)}},triggerEdgeChanges:(L)=>{let{onEdgesChange:U,setEdges:N,edges:q,hasDefaultEdges:W,debug:z}=Q();if(L?.length){if(W){let Z=TD(L,q);N(Z)}if(z)console.log("React Flow: trigger edge changes",L);U?.(L)}},addSelectedNodes:(L)=>{let{multiSelectionActive:U,edgeLookup:N,nodeLookup:q,triggerNodeChanges:W,triggerEdgeChanges:z}=Q();if(U){let Z=L.map((H)=>Mi(H,!0));W(Z);return}W(Ay(q,new Set([...L]),!0)),z(Ay(N))},addSelectedEdges:(L)=>{let{multiSelectionActive:U,edgeLookup:N,nodeLookup:q,triggerNodeChanges:W,triggerEdgeChanges:z}=Q();if(U){let Z=L.map((H)=>Mi(H,!0));z(Z);return}z(Ay(N,new Set([...L]))),W(Ay(q,new Set,!0))},unselectNodesAndEdges:({nodes:L,edges:U}={})=>{let{edges:N,nodes:q,nodeLookup:W,triggerNodeChanges:z,triggerEdgeChanges:Z}=Q(),H=L?L:q,E=U?U:N,D=[];for(let V of H){if(!V.selected)continue;let S=W.get(V.id);if(S)S.selected=!1;D.push(Mi(V.id,!1))}let h=[];for(let V of E){if(!V.selected)continue;h.push(Mi(V.id,!1))}z(D),Z(h)},setMinZoom:(L)=>{let{panZoom:U,maxZoom:N}=Q();U?.setScaleExtent([L,N]),J({minZoom:L})},setMaxZoom:(L)=>{let{panZoom:U,minZoom:N}=Q();U?.setScaleExtent([N,L]),J({maxZoom:L})},setTranslateExtent:(L)=>{Q().panZoom?.setTranslateExtent(L),J({translateExtent:L})},resetSelectedElements:()=>{let{edges:L,nodes:U,triggerNodeChanges:N,triggerEdgeChanges:q,elementsSelectable:W}=Q();if(!W)return;let z=U.reduce((H,E)=>E.selected?[...H,Mi(E.id,!1)]:H,[]),Z=L.reduce((H,E)=>E.selected?[...H,Mi(E.id,!1)]:H,[]);N(z),q(Z)},setNodeExtent:(L)=>{let{nodes:U,nodeLookup:N,parentLookup:q,nodeOrigin:W,elevateNodesOnSelect:z,nodeExtent:Z,zIndexMode:H}=Q();if(L[0][0]===Z[0][0]&&L[0][1]===Z[0][1]&&L[1][0]===Z[1][0]&&L[1][1]===Z[1][1])return;u6(U,N,q,{nodeOrigin:W,nodeExtent:L,elevateNodesOnSelect:z,checkEquality:!1,zIndexMode:H}),J({nodeExtent:L})},panBy:(L)=>{let{transform:U,width:N,height:q,panZoom:W,translateExtent:z}=Q();return Kq({delta:L,panZoom:W,transform:U,translateExtent:z,width:N,height:q})},setCenter:async(L,U,N)=>{let{width:q,height:W,maxZoom:z,panZoom:Z}=Q();if(!Z)return Promise.resolve(!1);let H=typeof N?.zoom<"u"?N.zoom:z;return await Z.setViewport({x:q/2-L*H,y:W/2-U*H,zoom:H},{duration:N?.duration,ease:N?.ease,interpolate:N?.interpolate}),Promise.resolve(!0)},cancelConnection:()=>{J({connection:{...h5}})},updateConnection:(L)=>{J({connection:L})},reset:()=>J({...NW()})}},Object.is);function MX({initialNodes:u,initialEdges:l,defaultNodes:f,defaultEdges:r,initialWidth:n,initialHeight:i,initialMinZoom:y,initialMaxZoom:t,initialFitViewOptions:_,fitView:c,nodeOrigin:A,nodeExtent:j,zIndexMode:F,children:J}){let[Q]=yu.useState(()=>CX({nodes:u,edges:l,defaultNodes:f,defaultEdges:r,width:n,height:i,fitView:c,minZoom:y,maxZoom:t,fitViewOptions:_,nodeOrigin:A,nodeExtent:j,zIndexMode:F}));return ru.jsx(nD,{value:Q,children:ru.jsx(OD,{children:J})})}function RX({children:u,nodes:l,edges:f,defaultNodes:r,defaultEdges:n,width:i,height:y,fitView:t,fitViewOptions:_,minZoom:c,maxZoom:A,nodeOrigin:j,nodeExtent:F,zIndexMode:J}){if(yu.useContext(_6))return ru.jsx(ru.Fragment,{children:u});return ru.jsx(MX,{initialNodes:l,initialEdges:f,defaultNodes:r,defaultEdges:n,initialWidth:i,initialHeight:y,fitView:t,initialFitViewOptions:_,initialMinZoom:c,initialMaxZoom:A,nodeOrigin:j,nodeExtent:F,zIndexMode:J,children:u})}var xX={width:"100%",height:"100%",overflow:"hidden",position:"relative",zIndex:0};function hX({nodes:u,edges:l,defaultNodes:f,defaultEdges:r,className:n,nodeTypes:i,edgeTypes:y,onNodeClick:t,onEdgeClick:_,onInit:c,onMove:A,onMoveStart:j,onMoveEnd:F,onConnect:J,onConnectStart:Q,onConnectEnd:w,onClickConnectStart:L,onClickConnectEnd:U,onNodeMouseEnter:N,onNodeMouseMove:q,onNodeMouseLeave:W,onNodeContextMenu:z,onNodeDoubleClick:Z,onNodeDragStart:H,onNodeDrag:E,onNodeDragStop:D,onNodesDelete:h,onEdgesDelete:V,onDelete:S,onSelectionChange:p,onSelectionDragStart:O,onSelectionDrag:m,onSelectionDragStop:X,onSelectionContextMenu:v,onSelectionStart:T,onSelectionEnd:Y,onBeforeDelete:k,connectionMode:I,connectionLineType:b=c0.Bezier,connectionLineStyle:o,connectionLineComponent:g,connectionLineContainerStyle:x,deleteKeyCode:lu="Backspace",selectionKeyCode:_u="Shift",selectionOnDrag:$u=!1,selectionMode:ju=mi.Full,panActivationKeyCode:zu="Space",multiSelectionKeyCode:Wu=$y()?"Meta":"Control",zoomActivationKeyCode:P=$y()?"Meta":"Control",snapToGrid:e,snapGrid:uu,onlyRenderVisibleElements:Ku=!1,selectNodesOnDrag:s,nodesDraggable:Nu,autoPanOnNodeFocus:Eu,nodesConnectable:Hu,nodesFocusable:vu,nodeOrigin:ul=LW,edgesFocusable:mu,edgesReconnectable:Fl,elementsSelectable:Uf=!0,defaultViewport:Ef=ND,minZoom:lf=0.5,maxZoom:ol=2,translateExtent:Zf=ny,preventScrolling:mf=!0,nodeExtent:Au,defaultMarkerColor:su="#b1b1b7",zoomOnScroll:Jf=!0,zoomOnPinch:pu=!0,panOnScroll:ff=!1,panOnScrollSpeed:rf=0.5,panOnScrollMode:ur=x0.Free,zoomOnDoubleClick:nf=!0,panOnDrag:Of=!0,onPaneClick:N0,onPaneMouseEnter:lr,onPaneMouseMove:k0,onPaneMouseLeave:Ul,onPaneScroll:bi,onPaneContextMenu:fu,paneClickDistance:Bu=1,nodeClickDistance:Yu=0,children:au,onReconnect:_l,onReconnectStart:Pl,onReconnectEnd:yl,onEdgeContextMenu:Qf,onEdgeDoubleClick:Xr,onEdgeMouseEnter:Ky,onEdgeMouseMove:Zl,onEdgeMouseLeave:k_,reconnectRadius:m6=10,onNodesChange:zl,onEdgesChange:$7,noDragClassName:vl="nodrag",noWheelClassName:fr="nowheel",noPanClassName:vi="nopan",fitView:Gy,fitViewOptions:ki,connectOnClick:I_,attributionPosition:zy,proOptions:g_,defaultEdgeOptions:Pf,elevateNodesOnSelect:ar=!0,elevateEdgesOnSelect:s_=!1,disableKeyboardA11y:Ty=!1,autoPanOnConnect:Ey,autoPanOnNodeDrag:a_,autoPanSpeed:or,connectionRadius:o_,isValidConnection:pl,onError:P6,style:d_,id:qr,nodeDragThreshold:an,connectionDragThreshold:on,viewport:Ii,onViewportChange:dn,width:Zy,height:c7,colorMode:gi="light",debug:A7,onScroll:Oy,ariaLabelConfig:C6,zIndexMode:e_="basic",...M6},I0){let g0=qr||"1",en=LD(gi),Cf=yu.useCallback((Hy)=>{Hy.currentTarget.scrollTo({top:0,left:0,behavior:"instant"}),Oy?.(Hy)},[Oy]);return ru.jsx("div",{"data-testid":"rf__wrapper",...M6,onScroll:Cf,style:{...d_,...xX},ref:I0,className:Sl(["react-flow",n,en]),id:qr,role:"application",children:ru.jsxs(RX,{nodes:u,edges:l,width:Zy,height:c7,fitView:Gy,fitViewOptions:ki,minZoom:lf,maxZoom:ol,nodeOrigin:ul,nodeExtent:Au,zIndexMode:e_,children:[ru.jsx(wD,{nodes:u,edges:l,defaultNodes:f,defaultEdges:r,onConnect:J,onConnectStart:Q,onConnectEnd:w,onClickConnectStart:L,onClickConnectEnd:U,nodesDraggable:Nu,autoPanOnNodeFocus:Eu,nodesConnectable:Hu,nodesFocusable:vu,edgesFocusable:mu,edgesReconnectable:Fl,elementsSelectable:Uf,elevateNodesOnSelect:ar,elevateEdgesOnSelect:s_,minZoom:lf,maxZoom:ol,nodeExtent:Au,onNodesChange:zl,onEdgesChange:$7,snapToGrid:e,snapGrid:uu,connectionMode:I,translateExtent:Zf,connectOnClick:I_,defaultEdgeOptions:Pf,fitView:Gy,fitViewOptions:ki,onNodesDelete:h,onEdgesDelete:V,onDelete:S,onNodeDragStart:H,onNodeDrag:E,onNodeDragStop:D,onSelectionDrag:m,onSelectionDragStart:O,onSelectionDragStop:X,onMove:A,onMoveStart:j,onMoveEnd:F,noPanClassName:vi,nodeOrigin:ul,rfId:g0,autoPanOnConnect:Ey,autoPanOnNodeDrag:a_,autoPanSpeed:or,onError:P6,connectionRadius:o_,isValidConnection:pl,selectNodesOnDrag:s,nodeDragThreshold:an,connectionDragThreshold:on,onBeforeDelete:k,debug:A7,ariaLabelConfig:C6,zIndexMode:e_}),ru.jsx(PX,{onInit:c,onNodeClick:t,onEdgeClick:_,onNodeMouseEnter:N,onNodeMouseMove:q,onNodeMouseLeave:W,onNodeContextMenu:z,onNodeDoubleClick:Z,nodeTypes:i,edgeTypes:y,connectionLineType:b,connectionLineStyle:o,connectionLineComponent:g,connectionLineContainerStyle:x,selectionKeyCode:_u,selectionOnDrag:$u,selectionMode:ju,deleteKeyCode:lu,multiSelectionKeyCode:Wu,panActivationKeyCode:zu,zoomActivationKeyCode:P,onlyRenderVisibleElements:Ku,defaultViewport:Ef,translateExtent:Zf,minZoom:lf,maxZoom:ol,preventScrolling:mf,zoomOnScroll:Jf,zoomOnPinch:pu,zoomOnDoubleClick:nf,panOnScroll:ff,panOnScrollSpeed:rf,panOnScrollMode:ur,panOnDrag:Of,onPaneClick:N0,onPaneMouseEnter:lr,onPaneMouseMove:k0,onPaneMouseLeave:Ul,onPaneScroll:bi,onPaneContextMenu:fu,paneClickDistance:Bu,nodeClickDistance:Yu,onSelectionContextMenu:v,onSelectionStart:T,onSelectionEnd:Y,onReconnect:_l,onReconnectStart:Pl,onReconnectEnd:yl,onEdgeContextMenu:Qf,onEdgeDoubleClick:Xr,onEdgeMouseEnter:Ky,onEdgeMouseMove:Zl,onEdgeMouseLeave:k_,reconnectRadius:m6,defaultMarkerColor:su,noDragClassName:vl,noWheelClassName:fr,noPanClassName:vi,rfId:g0,disableKeyboardA11y:Ty,nodeExtent:Au,viewport:Ii,onViewportChange:dn}),ru.jsx(QD,{onSelectionChange:p}),au,ru.jsx(AD,{proOptions:g_,position:zy}),ru.jsx(cD,{rfId:g0,disableKeyboardA11y:Ty})]})})}var IW=GW(hX);var pb=Ur.error014();function bX({dimensions:u,lineWidth:l,variant:f,className:r}){return ru.jsx("path",{strokeWidth:l,d:`M${u[0]/2} 0 V${u[1]} M0 ${u[1]/2} H${u[0]}`,className:Sl(["react-flow__background-pattern",f,r])})}function vX({radius:u,className:l}){return ru.jsx("circle",{cx:u,cy:u,r:u,className:Sl(["react-flow__background-pattern","dots",l])})}var Cn;(function(u){u.Lines="lines",u.Dots="dots",u.Cross="cross"})(Cn||(Cn={}));var kX={[Cn.Dots]:1,[Cn.Lines]:1,[Cn.Cross]:6},IX=(u)=>({transform:u.transform,patternId:`pattern-${u.rfId}`});function gW({id:u,variant:l=Cn.Dots,gap:f=20,size:r,lineWidth:n=1,offset:i=0,color:y,bgColor:t,style:_,className:c,patternClassName:A}){let j=yu.useRef(null),{transform:F,patternId:J}=fl(IX,Gl),Q=r||kX[l],w=l===Cn.Dots,L=l===Cn.Cross,U=Array.isArray(f)?f:[f,f],N=[U[0]*F[2]||1,U[1]*F[2]||1],q=Q*F[2],W=Array.isArray(i)?i:[i,i],z=L?[q,q]:N,Z=[W[0]*F[2]||1+z[0]/2,W[1]*F[2]||1+z[1]/2],H=`${J}${u?u:""}`;return ru.jsxs("svg",{className:Sl(["react-flow__background",c]),style:{..._,...c6,"--xy-background-color-props":t,"--xy-background-pattern-color-props":y},ref:j,"data-testid":"rf__background",children:[ru.jsx("pattern",{id:H,x:F[0]%N[0],y:F[1]%N[1],width:N[0],height:N[1],patternUnits:"userSpaceOnUse",patternTransform:`translate(-${Z[0]},-${Z[1]})`,children:w?ru.jsx(vX,{radius:q/2,className:A}):ru.jsx(bX,{dimensions:z,lineWidth:n,variant:l,className:A})}),ru.jsx("rect",{x:"0",y:"0",width:"100%",height:"100%",fill:`url(#${H})`})]})}gW.displayName="Background";var sW=yu.memo(gW);function gX(){return ru.jsx("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 32 32",children:ru.jsx("path",{d:"M32 18.133H18.133V32h-4.266V18.133H0v-4.266h13.867V0h4.266v13.867H32z"})})}function sX(){return ru.jsx("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 32 5",children:ru.jsx("path",{d:"M0 0h32v4.2H0z"})})}function aX(){return ru.jsx("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 32 30",children:ru.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 oX(){return ru.jsx("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 25 32",children:ru.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 dX(){return ru.jsx("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 25 32",children:ru.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 y6({children:u,className:l,...f}){return ru.jsx("button",{type:"button",className:Sl(["react-flow__controls-button",l]),...f,children:u})}var eX=(u)=>({isInteractive:u.nodesDraggable||u.nodesConnectable||u.elementsSelectable,minZoomReached:u.transform[2]<=u.minZoom,maxZoomReached:u.transform[2]>=u.maxZoom,ariaLabelConfig:u.ariaLabelConfig});function aW({style:u,showZoom:l=!0,showFitView:f=!0,showInteractive:r=!0,fitViewOptions:n,onZoomIn:i,onZoomOut:y,onFitView:t,onInteractiveChange:_,className:c,children:A,position:j="bottom-left",orientation:F="vertical","aria-label":J}){let Q=El(),{isInteractive:w,minZoomReached:L,maxZoomReached:U,ariaLabelConfig:N}=fl(eX,Gl),{zoomIn:q,zoomOut:W,fitView:z}=N9(),Z=()=>{q(),i?.()},H=()=>{W(),y?.()},E=()=>{z(n),t?.()},D=()=>{Q.setState({nodesDraggable:!w,nodesConnectable:!w,elementsSelectable:!w}),_?.(!w)};return ru.jsxs($6,{className:Sl(["react-flow__controls",F==="horizontal"?"horizontal":"vertical",c]),position:j,style:u,"data-testid":"rf__controls","aria-label":J??N["controls.ariaLabel"],children:[l&&ru.jsxs(ru.Fragment,{children:[ru.jsx(y6,{onClick:Z,className:"react-flow__controls-zoomin",title:N["controls.zoomIn.ariaLabel"],"aria-label":N["controls.zoomIn.ariaLabel"],disabled:U,children:ru.jsx(gX,{})}),ru.jsx(y6,{onClick:H,className:"react-flow__controls-zoomout",title:N["controls.zoomOut.ariaLabel"],"aria-label":N["controls.zoomOut.ariaLabel"],disabled:L,children:ru.jsx(sX,{})})]}),f&&ru.jsx(y6,{className:"react-flow__controls-fitview",onClick:E,title:N["controls.fitView.ariaLabel"],"aria-label":N["controls.fitView.ariaLabel"],children:ru.jsx(aX,{})}),r&&ru.jsx(y6,{className:"react-flow__controls-interactive",onClick:D,title:N["controls.interactive.ariaLabel"],"aria-label":N["controls.interactive.ariaLabel"],children:w?ru.jsx(dX,{}):ru.jsx(oX,{})}),A]})}aW.displayName="Controls";var oW=yu.memo(aW);function uS({id:u,x:l,y:f,width:r,height:n,style:i,color:y,strokeColor:t,strokeWidth:_,className:c,borderRadius:A,shapeRendering:j,selected:F,onClick:J}){let{background:Q,backgroundColor:w}=i||{},L=y||Q||w;return ru.jsx("rect",{className:Sl(["react-flow__minimap-node",{selected:F},c]),x:l,y:f,rx:A,ry:A,width:r,height:n,style:{fill:L,stroke:t,strokeWidth:_},shapeRendering:j,onClick:J?(U)=>J(U,u):void 0})}var lS=yu.memo(uS),fS=(u)=>u.nodes.map((l)=>l.id),U9=(u)=>u instanceof Function?u:()=>u;function rS({nodeStrokeColor:u,nodeColor:l,nodeClassName:f="",nodeBorderRadius:r=5,nodeStrokeWidth:n,nodeComponent:i=lS,onClick:y}){let t=fl(fS,Gl),_=U9(l),c=U9(u),A=U9(f),j=typeof window>"u"||!!window.chrome?"crispEdges":"geometricPrecision";return ru.jsx(ru.Fragment,{children:t.map((F)=>ru.jsx(iS,{id:F,nodeColorFunc:_,nodeStrokeColorFunc:c,nodeClassNameFunc:A,nodeBorderRadius:r,nodeStrokeWidth:n,NodeComponent:i,onClick:y,shapeRendering:j},F))})}function nS({id:u,nodeColorFunc:l,nodeStrokeColorFunc:f,nodeClassNameFunc:r,nodeBorderRadius:n,nodeStrokeWidth:i,shapeRendering:y,NodeComponent:t,onClick:_}){let{node:c,x:A,y:j,width:F,height:J}=fl((Q)=>{let w=Q.nodeLookup.get(u);if(!w)return{node:void 0,x:0,y:0,width:0,height:0};let L=w.internals.userNode,{x:U,y:N}=w.internals.positionAbsolute,{width:q,height:W}=A0(L);return{node:L,x:U,y:N,width:q,height:W}},Gl);if(!c||c.hidden||!d5(c))return null;return ru.jsx(t,{x:A,y:j,width:F,height:J,style:c.style,selected:!!c.selected,className:r(c),color:l(c),borderRadius:n,strokeColor:f(c),strokeWidth:i,shapeRendering:y,onClick:_,id:c.id})}var iS=yu.memo(nS),yS=yu.memo(rS),tS=200,_S=150,$S=(u)=>!u.hidden,cS=(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?s5(iy(u.nodeLookup,{filter:$S}),l):l,rfId:u.rfId,panZoom:u.panZoom,translateExtent:u.translateExtent,flowWidth:u.width,flowHeight:u.height,ariaLabelConfig:u.ariaLabelConfig}},AS="react-flow__minimap-desc";function dW({style:u,className:l,nodeStrokeColor:f,nodeColor:r,nodeClassName:n="",nodeBorderRadius:i=5,nodeStrokeWidth:y,nodeComponent:t,bgColor:_,maskColor:c,maskStrokeColor:A,maskStrokeWidth:j,position:F="bottom-right",onClick:J,onNodeClick:Q,pannable:w=!1,zoomable:L=!1,ariaLabel:U,inversePan:N,zoomStep:q=1,offsetScale:W=5}){let z=El(),Z=yu.useRef(null),{boundingRect:H,viewBB:E,rfId:D,panZoom:h,translateExtent:V,flowWidth:S,flowHeight:p,ariaLabelConfig:O}=fl(cS,Gl),m=u?.width??tS,X=u?.height??_S,v=H.width/m,T=H.height/X,Y=Math.max(v,T),k=Y*m,I=Y*X,b=W*Y,o=H.x-(k-H.width)/2-b,g=H.y-(I-H.height)/2-b,x=k+b*2,lu=I+b*2,_u=`${AS}-${D}`,$u=yu.useRef(0),ju=yu.useRef();$u.current=Y,yu.useEffect(()=>{if(Z.current&&h)return ju.current=Hq({domNode:Z.current,panZoom:h,getTransform:()=>z.getState().transform,getViewScale:()=>$u.current}),()=>{ju.current?.destroy()}},[h]),yu.useEffect(()=>{ju.current?.update({translateExtent:V,width:S,height:p,inversePan:N,pannable:w,zoomStep:q,zoomable:L})},[w,L,N,q,V,S,p]);let zu=J?(e)=>{let[uu,Ku]=ju.current?.pointer(e)||[0,0];J(e,{x:uu,y:Ku})}:void 0,Wu=Q?yu.useCallback((e,uu)=>{let Ku=z.getState().nodeLookup.get(uu).internals.userNode;Q(e,Ku)},[]):void 0,P=U??O["minimap.ariaLabel"];return ru.jsx($6,{position:F,style:{...u,"--xy-minimap-background-color-props":typeof _==="string"?_:void 0,"--xy-minimap-mask-background-color-props":typeof c==="string"?c:void 0,"--xy-minimap-mask-stroke-color-props":typeof A==="string"?A:void 0,"--xy-minimap-mask-stroke-width-props":typeof j==="number"?j*Y:void 0,"--xy-minimap-node-background-color-props":typeof r==="string"?r:void 0,"--xy-minimap-node-stroke-color-props":typeof f==="string"?f:void 0,"--xy-minimap-node-stroke-width-props":typeof y==="number"?y:void 0},className:Sl(["react-flow__minimap",l]),"data-testid":"rf__minimap",children:ru.jsxs("svg",{width:m,height:X,viewBox:`${o} ${g} ${x} ${lu}`,className:"react-flow__minimap-svg",role:"img","aria-labelledby":_u,ref:Z,onClick:zu,children:[P&&ru.jsx("title",{id:_u,children:P}),ru.jsx(yS,{onClick:Wu,nodeColor:r,nodeStrokeColor:f,nodeBorderRadius:i,nodeClassName:n,nodeStrokeWidth:y,nodeComponent:t}),ru.jsx("path",{className:"react-flow__minimap-mask",d:`M${o-b},${g-b}h${x+b*2}v${lu+b*2}h${-x-b*2}z - M${E.x},${E.y}h${E.width}v${E.height}h${-E.width}z`,fillRule:"evenodd",pointerEvents:"none"})]})})}dW.displayName="MiniMap";var mb=yu.memo(dW),jS=(u)=>(l)=>u?`${Math.max(1/l.transform[2],1)}`:void 0,FS={[Pn.Line]:"right",[Pn.Handle]:"bottom-right"};function US({nodeId:u,position:l,variant:f=Pn.Handle,className:r,style:n=void 0,children:i,color:y,minWidth:t=10,minHeight:_=10,maxWidth:c=Number.MAX_VALUE,maxHeight:A=Number.MAX_VALUE,keepAspectRatio:j=!1,resizeDirection:F,autoScale:J=!0,shouldResize:Q,onResizeStart:w,onResize:L,onResizeEnd:U}){let N=ZW(),q=typeof u==="string"?u:N,W=El(),z=yu.useRef(null),Z=f===Pn.Handle,H=fl(yu.useCallback(jS(Z&&J),[Z,J]),Gl),E=yu.useRef(null),D=l??FS[f];yu.useEffect(()=>{if(!z.current||!q)return;if(!E.current)E.current=Sq({domNode:z.current,nodeId:q,getStoreItems:()=>{let{nodeLookup:V,transform:S,snapGrid:p,snapToGrid:O,nodeOrigin:m,domNode:X}=W.getState();return{nodeLookup:V,transform:S,snapGrid:p,snapToGrid:O,nodeOrigin:m,paneDomNode:X}},onChange:(V,S)=>{let{triggerNodeChanges:p,nodeLookup:O,parentLookup:m,nodeOrigin:X}=W.getState(),v=[],T={x:V.x,y:V.y},Y=O.get(q);if(Y&&Y.expandParent&&Y.parentId){let k=Y.origin??X,I=V.width??Y.measured.width??0,b=V.height??Y.measured.height??0,o={id:Y.id,parentId:Y.parentId,rect:{width:I,height:b,...e5({x:V.x??Y.position.x,y:V.y??Y.position.y},{width:I,height:b},Y.parentId,O,k)}},g=l6([o],O,m,X);v.push(...g),T.x=V.x?Math.max(k[0]*I,V.x):void 0,T.y=V.y?Math.max(k[1]*b,V.y):void 0}if(T.x!==void 0&&T.y!==void 0){let k={id:q,type:"position",position:{...T}};v.push(k)}if(V.width!==void 0&&V.height!==void 0){let I={id:q,type:"dimensions",resizing:!0,setAttributes:!F?!0:F==="horizontal"?"width":"height",dimensions:{width:V.width,height:V.height}};v.push(I)}for(let k of S){let I={...k,type:"position"};v.push(I)}p(v)},onEnd:({width:V,height:S})=>{let p={id:q,type:"dimensions",resizing:!1,dimensions:{width:V,height:S}};W.getState().triggerNodeChanges([p])}});return E.current.update({controlPosition:D,boundaries:{minWidth:t,minHeight:_,maxWidth:c,maxHeight:A},keepAspectRatio:j,resizeDirection:F,onResizeStart:w,onResize:L,onResizeEnd:U,shouldResize:Q}),()=>{E.current?.destroy()}},[D,t,_,c,A,j,w,L,U,Q]);let h=D.split("-");return ru.jsx("div",{className:Sl(["react-flow__resize-control","nodrag",...h,f,r]),ref:z,style:{...n,scale:H,...y&&{[Z?"backgroundColor":"borderColor"]:y}},children:i})}var Pb=yu.memo(US);var G=hn.default.createElement,{useEffect:U0}=hn.default,af=hn.default.useState,xn=hn.default.useRef,Y_=[{id:"in-left",side:"left",position:Lu.Left,style:{top:"50%"}},{id:"in-top-left",side:"top",slot:"left",slotIndex:-1,position:Lu.Top,style:{left:"28%"}},{id:"in-top-mid",side:"top",slot:"mid",slotIndex:0,position:Lu.Top,style:{left:"50%"}},{id:"in-top-right",side:"top",slot:"right",slotIndex:1,position:Lu.Top,style:{left:"72%"}},{id:"in-bottom-left",side:"bottom",slot:"left",slotIndex:-1,position:Lu.Bottom,style:{left:"28%"}},{id:"in-bottom-mid",side:"bottom",slot:"mid",slotIndex:0,position:Lu.Bottom,style:{left:"50%"}},{id:"in-bottom-right",side:"bottom",slot:"right",slotIndex:1,position:Lu.Bottom,style:{left:"72%"}}],D_=[{id:"out-right",position:Lu.Right,style:{top:"50%"}}],eW=["#4eb7a8","#d7a13a","#69aee8","#e0835f","#b7d86b","#d98bd2","#5fc6bf"],Uy=236,Jy=88,uw=15000,JS=10,W9=96,j0=72,w9=64,lw=12;function A6(){return typeof document>"u"||document.visibilityState!=="hidden"}function fw(u,l){let f=Number.parseFloat(String(u||""));return Number.isFinite(f)?f/100:l}function QS(u,l,f){let r=String(u.side||"");if(r!=="top"&&r!=="bottom")return 0;let n=Number(u.slotIndex||0),i=r==="top"?"in-top-mid":"in-bottom-mid",y=l.get(u.id)||0,t=l.get(i)||0;if(n===0)return t===0?-26:28+y*74;let _=f===0?Math.abs(n)*2:Math.sign(f)===Math.sign(n)?-3:3;if(t>0&&y===0)return-14+_;return 8+y*74+_}function j6(u){let l=u.filter((i,y)=>{let t=u[y-1];return!t||Math.abs(t.x-i.x)>0.5||Math.abs(t.y-i.y)>0.5});if(l.length<2)return"";let f=`M ${l[0].x},${l[0].y}`,r=l[0];for(let i=1;i0.5||Math.abs(F.y-r.y)>0.5)f+=` L ${F.x},${F.y}`;f+=` Q ${t.x},${t.y} ${J.x},${J.y}`,r=J}let n=l[l.length-1];return`${f} L ${n.x},${n.y}`}function ww(u,l,f,r,n,i,y=""){let t=f>=u,_=Math.max(1,Math.abs(f-u)),c=Math.abs(r-l),A=Math.max(34,Math.min(118,_*0.26)),j=Math.min(280,Math.abs(i));if(t&&n===Lu.Left&&j<4&&c<28&&_<420)return`M ${u},${l} C ${u+A},${l} ${f-A},${r} ${f},${r}`;if(t&&n===Lu.Left&&(y==="direct-forward-left"||_<=260&&c<=210)){let U=Math.max(42,Math.min(140,_*0.48)),N=Math.max(-28,Math.min(28,i*0.18));return`M ${u},${l} C ${u+U},${l+N} ${f-U},${r} ${f},${r}`}if(t){let U=u+A;if(n===Lu.Top||n===Lu.Bottom){let W=n===Lu.Top?-1:1,z=r+W*(54+j*0.42);return j6([{x:u,y:l},{x:U,y:l},{x:U+Math.min(120,_*0.18),y:z},{x:f,y:z},{x:f,y:r+W*34},{x:f,y:r}])}let N=f-A,q=(l+r)/2+i;return j6([{x:u,y:l},{x:U,y:l},{x:U+Math.min(110,_*0.16),y:q},{x:N-Math.min(90,_*0.12),y:q},{x:N,y:r},{x:f,y:r}])}let Q=n===Lu.Bottom?1:n===Lu.Top?-1:i>=0?1:-1,w=Math.max(u,f)+92+Math.min(180,j*0.52),L=Q<0?Math.min(l,r)-84-j*0.62:Math.max(l,r)+84+j*0.62;if(n===Lu.Top||n===Lu.Bottom)return j6([{x:u,y:l},{x:u+A,y:l},{x:w,y:L},{x:f,y:L},{x:f,y:r+Q*38},{x:f,y:r}]);return j6([{x:u,y:l},{x:u+A,y:l},{x:w,y:L},{x:f-A,y:L},{x:f-A,y:r},{x:f,y:r}])}function NS({data:u}){return G("div",{className:"pipeline-flow-node-body"},Y_.map((l)=>G(Ri,{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})),D_.map((l)=>G(Ri,{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 qS({id:u,sourceX:l,sourceY:f,targetX:r,targetY:n,targetPosition:i,markerEnd:y,markerStart:t,style:_,data:c}){let A=Number(c?.laneOffset||0),j=ww(l,f,r,n,i,A,String(c?.routeMode||""));return G(jy,{id:u,path:j,markerEnd:y,markerStart:t,style:_,interactionWidth:28})}var WS={pipelineCurve:qS},wS={pipelineNode:NS};function Q6(u){if(!u)return"--";let l=new Date(u);if(Number.isNaN(l.getTime()))return"--";return tl(l)}function Br(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 L9(u){let l=Number(u);if(!Number.isFinite(l))return"--";return l.toLocaleString("zh-CN")}function rw(u){let l=Number(u);if(!Number.isFinite(l))return"--";return`${Math.round(Math.max(0,Math.min(1,l))*100)}%`}function Xu(u){return typeof u==="object"&&u!==null&&!Array.isArray(u)}function Du(u){return Array.isArray(u)?u:[]}function Iu(u){if(!u)return null;let l=new Date(u);return Number.isNaN(l.getTime())?null:l.getTime()}function p_(u){return Number.isFinite(Number(u))?new Date(Number(u)).toISOString():""}function C_(...u){for(let l of u){let f=Iu(l);if(f!==null)return new Date(f).toISOString()}return""}function p9(...u){let l=u.map(Iu).filter((f)=>f!==null);return l.length>0?new Date(Math.max(...l)).toISOString():""}function m9(u){return["succeeded","failed","skipped","cancelled","canceled","completed"].includes(String(u||"").toLowerCase())}function Lw(u){let l=zw(u).toLowerCase();return["running","active","in-progress","in_progress"].includes(l)}function nw(u,l="status"){return u.reduce((f,r)=>{let n=String(r?.[l]||"unknown").toLowerCase();return f[n]=(f[n]||0)+1,f},{})}function Kw(u){if(!u||typeof u!=="string")return null;try{let l=JSON.parse(u);return Xu(l)?l:null}catch{return null}}function K9(u){let l=u.map(Kw).filter((i)=>Boolean(i)),f=l.flatMap((i)=>[i.timestamp,i.createdAt,i.updatedAt]).filter(Boolean),r=p9(...f),n=Array.from(new Set(l.map((i)=>String(i.event||i.action||i.type||"")).filter(Boolean))).slice(0,3);return{total:u.length,parsed:l.length,lastAt:r,eventKinds:n}}function N6(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 Gw(u,l=280){if(u===null||u===void 0)return"";let r=(typeof u==="string"?u:String(u)).replace(/\r\n/gu,` -`).trim();return r.length>l?`${r.slice(0,Math.max(0,l-1))}...`:r}function zw(u){if(typeof u==="string")return u;if(Xu(u))return String(u.status||u.state||u.phase||"unknown");return"unknown"}function LS(u){return u.filter((l)=>l&&l.value!==void 0&&l.value!==null&&String(l.value)!=="")}function O9({items:u}){let l=LS(Du(u));return G("div",{className:"pipeline-kv-grid"},l.map((f)=>G("span",{key:f.label},G("b",null,f.label),G("span",null,f.value))))}function P9({items:u}){let l=Du(u).map((f)=>String(f||"")).filter(Boolean);if(l.length===0)return null;return G("div",{className:"pipeline-chip-row"},l.map((f,r)=>G("span",{key:`${r}-${f}`},f)))}function H9(u,l){let f=String(l?.procedureRunId||""),r=Du(u?.procedureRuns);return r.find((n)=>String(Vr(n))===f)||r.at(-1)||null}function KS(u,l){let f=String(l||"");if(!f)return null;return Du(u?.procedureRuns).find((r)=>Vr(r)===f)||null}function G9(u){return Du(u?.attempts).length}function iw(u){return Du(u?.attempts).reduce((l,f)=>l+z6(f).length,0)}function z6(u){return Du(u?.opencodeMessages?.steps).filter(Xu)}function Tw(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 GS(u,l){let f=V9(u.map((i)=>i?.agent)).slice(0,3),r=V9(u.map((i)=>i?.model)).slice(0,3),n=l.length<=2?l.map((i)=>`session ${i}`):[`sessions ${l.length}`,...l.slice(0,2).map((i)=>`session ${i}`)];return[...f.map((i)=>`agent ${i}`),...r.map((i)=>`model ${i}`),...n]}function X_(u,l=0){return String(u?.messageId||u?.index||"")||`step-${l}`}function zS({steps:u,sessionIds:l,sessionFacts:f,matchedStepKey:r}){let n=Du(u),i=n.findIndex((L,U)=>X_(L,U)===r),y=i>=0?n[i]:null,t=n.flatMap((L)=>[Iu(L?.createdAt),Iu(L?.completedAt)]).filter((L)=>L!==null),_=t.length>0?Math.min(...t):null,c=t.length>0?Math.max(...t):null,A=_!==null&&c!==null?Math.max(0,c-_):null,j=n.reduce((L,U)=>L+Du(U?.parts).filter((N)=>String(N?.type||"").toLowerCase()==="tool").length,0),F=n.reduce((L,U)=>L+Du(U?.parts).filter((N)=>["text","reasoning"].includes(String(N?.type||"").toLowerCase())).length,0),J=n.reduce((L,U)=>L+Du(U?.parts).filter((N)=>String(N?.type||"").toLowerCase()==="tool"&&Tw(N)==="failed").length,0),Q=[`${n.length} steps`,`${l.length} sessions`,`${F} messages`,`${j} tools`,A!==null?`duration ${Br(A)}`:"",J>0?`${J} failed tools`:""].filter(Boolean),w=y?[`Step ${y?.index??i+1}`,String(y?.role||"role --"),y?.model?`model ${y.model}`:"",y?.finish?`finish ${y.finish}`:"",y?.durationMs!==void 0&&y?.durationMs!==null?`duration ${Br(y.durationMs)}`:""].filter(Boolean):[];return G("section",{className:"pipeline-trace-timeline","data-testid":"pipeline-step-timeline"},G("div",{className:"pipeline-trace-head"},G("div",null,G("b",null,"OpenCode Trace"),G("span",null,"Trace 使用 Code Queue 统一样式展示完整 agent loop;Pipeline 旧 step/message/tool 卡片样式已废弃。")),G("div",{className:"pipeline-trace-session-head","data-testid":"pipeline-step-timeline-session"},G("span",null,Q.join(" / ")||"Trace"),f.length>0?G(P9,{items:f}):null)),y?G("div",{className:"pipeline-trace-focus","data-testid":"pipeline-trace-matched-step"},G("span",{className:"codex-output-channel"},"Matched"),G("strong",null,`Gantt selection -> ${w.join(" / ")}`),G("time",null,`${Q6(y?.createdAt)} -> ${Q6(y?.completedAt)}`)):null,G(C3,{port:kJ,input:n,className:"codex-transcript pipeline-trace",testId:"pipeline-opencode-step-trace",emptyText:"暂无 OpenCode Trace 输出",keepRecentToolCalls:3}))}function B9(u){return Du(u).flatMap((l)=>{if(Xu(l))return[l];let f=Kw(l);return f?[f]:[]})}function gr(u){return String(u?.event||u?.action||u?.requestedAction||u?.type||"").toLowerCase()}function Fy(u){return C_(u?.timestamp,u?.createdAt,u?.updatedAt,u?.startedAt,u?.finishedAt)}function TS(u){return Iu(Fy(u))}function T6(u){return String(u?.attempt||u?.id||"")}function V9(u){let l=new Set,f=[];for(let r of u){let n=String(r||"");if(!n||l.has(n))continue;l.add(n),f.push(n)}return f}function yw(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 xi(u){return String(u?.requestedAction||u?.action||"").toLowerCase()}function S_(u){switch(xi(u)){case"guide":return"引导";case"modify":return"修改";case"approve":return"审核通过";case"restart":return"重启";case"redo":return"重做";default:return String(u?.requestedAction||u?.action||"控制")}}function tw(u){switch(gr(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`${S_(u)} 已发起`;case"control-command-applied":return`${S_(u)} 已生效`;case"control-command-ignored":return`${S_(u)} 已忽略`;default:return String(u?.event||u?.action||u?.requestedAction||"event")}}function _w(u){return Gw(u?.promptPreview||u?.reasonPreview||u?.prompt||u?.reason||"",240)}function ES(u){let l=String(u?.prompt||""),f=String(u?.reason||u?.restartReason||""),r=l?"":String(u?.promptPreview||""),n=f?"":String(u?.reasonPreview||"");return[l||r?{label:l?"prompt":"prompt preview",value:l||r}:null,f||n?{label:f?"reason":"reason preview",value:f||n}:null,Du(u?.resetNodeIds).length>0?{label:"reset nodes",value:Du(u.resetNodeIds).join(", ")}:null,Du(u?.runningResetNodeIds).length>0?{label:"interrupted running nodes",value:Du(u.runningResetNodeIds).join(", ")}:null,Du(u?.interruptedProcedureRunIds).length>0?{label:"interrupted procedures",value:Du(u.interruptedProcedureRunIds).join(", ")}:null,u?.interruptedProcedureRunId?{label:"interrupted procedure",value:String(u.interruptedProcedureRunId)}:null].filter(Boolean)}function z9(u){let l=z6(u),f=l.map((_)=>Iu(_?.createdAt)).filter((_)=>_!==null),r=l.map((_)=>Iu(_?.completedAt)??Iu(_?.createdAt)).filter((_)=>_!==null),n=B9(u?.controlEventRecords).map((_)=>TS(_)).filter((_)=>_!==null),i=Du(u?.assistantOutputs).map((_)=>Iu(_?.updatedAt)).filter((_)=>_!==null),y=f[0]??n[0]??i[0]??null,t=r.at(-1)??n.at(-1)??i.at(-1)??y;return{startMs:y,endMs:t}}function ZS(u,l,f,r,n=""){let i=Du(u?.procedureRuns).filter((t)=>E6(t,l)===f);if(i.length===0)return null;if(n){let t=i.find((_)=>Vr(_)===n);if(t)return t}if(r===null)return i.at(-1)||null;let y=i.find((t)=>{let _=Iu(F6(t,u)),c=Iu(U6(t,u))??_;return _!==null&&c!==null&&r>=_-1000&&r<=c+1000});if(y)return y;return i.slice().sort((t,_)=>{let c=Iu(F6(t,u))??r,A=Iu(U6(t,u))??c,j=Iu(F6(_,u))??r,F=Iu(U6(_,u))??j,J=Math.min(Math.abs(c-r),Math.abs(A-r)),Q=Math.min(Math.abs(j-r),Math.abs(F-r));return J-Q})[0]||null}function Ew(u,l){let f=Du(u?.attempts).filter(Xu);if(f.length===0)return null;let r=String(l?.attempt||"");if(r){let y=f.find((t)=>T6(t)===r);if(y)return y}let n=Number.isFinite(Number(l?.ms))?Number(l.ms):null;if(n===null)return f.at(-1)||null;let i=f.find((y)=>{let t=z9(y);return Number.isFinite(t.startMs)&&Number.isFinite(t.endMs)&&n>=Number(t.startMs)-1000&&n<=Number(t.endMs)+1000});if(i)return i;return f.slice().sort((y,t)=>{let _=z9(y),c=z9(t),A=Math.min(Math.abs(Number(_.startMs??n)-n),Math.abs(Number(_.endMs??n)-n)),j=Math.min(Math.abs(Number(c.startMs??n)-n),Math.abs(Number(c.endMs??n)-n));return A-j})[0]||f.at(-1)||null}function Zw(u,l){let f=z6(u);if(f.length===0)return{step:null,stepIndex:-1,stepKey:""};if(l===null){let i=f[0];return{step:i,stepIndex:0,stepKey:X_(i,0)}}for(let i=0;i=t-1000&&l<=_+1000)return{step:y,stepIndex:i,stepKey:X_(y,i)}}let r=f.findIndex((i)=>{let y=Iu(i?.createdAt)??Iu(i?.completedAt);return y!==null&&y>=l});if(r>=0){let i=f[r];return{step:i,stepIndex:r,stepKey:X_(i,r)}}let n=Math.max(0,f.length-1);return{step:f[n],stepIndex:n,stepKey:X_(f[n],n)}}function OS(u,l){let f=String(l?.runId||u?.runId||"");if(String(l?.mode||"")==="interval"){let c=l?.interval||{},A=H9(u,c)||c.raw||{};return{mode:"interval",runId:f,interval:c,marker:null,nodeId:String(c?.nodeId||E6(A,f)||""),procedure:A,attempt:null,matchedStep:null,matchedStepIndex:-1,matchedStepKey:""}}let r=Xu(l?.marker)?l.marker:{},n=Number.isFinite(Number(r?.ms))?Number(r.ms):null,i=String(r?.nodeId||""),y=i?ZS(u,f,i,n,String(r?.procedureRunId||"")):null,t=y?Ew(y,r):null,_=t?Zw(t,n):{step:null,stepIndex:-1,stepKey:""};return{mode:"event",runId:f,interval:null,marker:r,nodeId:i,procedure:y,attempt:t,matchedStep:_.step,matchedStepIndex:_.stepIndex,matchedStepKey:_.stepKey}}function HS({procedure:u,matchedStepKey:l="",matchedAttemptId:f=""}){let r=Du(u?.attempts);if(r.length===0)return G(Qr,{title:"暂无 attempt 详情",text:"当前 procedure 还没有可展示的 attempt / OpenCode Trace;若刚点击甘特线,请等待 node 详情抓取完成。"});return r.map((n,i)=>{let y=n?.opencodeMessages||{},t=z6(n),_=Du(y.sessionIds).map((F)=>String(F)).filter(Boolean),c=GS(t,_),A=T6(n)||`attempt-${i+1}`,j=t.reduce((F,J)=>F+Du(J?.parts).filter((Q)=>String(Q?.type||"").toLowerCase()==="tool"&&Tw(Q)==="failed").length,0);return G("article",{key:A,className:`pipeline-attempt-card ${f===A?"matched":""}`},G("div",{className:"pipeline-attempt-head"},G("div",null,G("strong",null,A),G("span",null,y.source||"opencode")),G("div",{className:"pipeline-attempt-badges"},G("span",null,`${t.length} steps`),G("span",null,`${y.toolCallCount??"--"} tools`),j>0?G("span",{className:"danger"},`${j} failed`):null)),G(O9,{items:[{label:"messages",value:y.messageCount??"--"},{label:"steps",value:y.stepCount??"--"},{label:"tools",value:y.toolCallCount??"--"},{label:"updated",value:qu(y.updatedAt)},{label:"sessions",value:_.join(", ")||"--"}]}),t.length===0?G("p",{className:"muted paragraph"},"当前 attempt 尚未返回 OpenCode Trace;请确认 D601 pipeline-control 已重建并重新抓取。"):G(zS,{steps:t,sessionIds:_,sessionFacts:c,matchedStepKey:l}))})}function T9(u,l){return`${u}::${l}`}function q6(u,l,f){if(!Xu(u))return null;return String(u.runId||"")===l&&String(u.nodeId||"")===f?u:null}function BS(u,l){let f=Xu(u)?u:{};if(!Xu(l))return f;let r=Du(l.attempts),n=Du(f.attempts);return{...f,...l,attempts:r.length>0?r:n}}function VS(u,l,f,r){if(!q6(l,f,r))return u;let n=Du(l.procedureRuns),i=Xu(u)?u:{};return{...i,...l,controlEvents:Du(l.controlEvents).length>0?l.controlEvents:i.controlEvents,procedureRuns:n.length>0?n:i.procedureRuns}}function DS({selection:u,runDetails:l,nodeDetails:f,nodeDetailsState:r,onRaw:n,onCollapse:i}){if(!u?.mode)return G("aside",{className:"pipeline-gantt-detail-panel empty","data-testid":"pipeline-gantt-detail-panel"},G("div",{className:"pipeline-gantt-detail-head"},G("div",null,G("span",{className:"panel-eyebrow"},"Gantt Detail"),G(nl,{title:"未选择元素",level:3})),G("button",{type:"button",className:"ghost-btn mini",onClick:i,"data-testid":"pipeline-gantt-sidebar-collapse"},"收起")),G(Qr,{title:"选择一条执行线或一个控制点",text:"点击甘特图中的 node 执行线、prompt 点或控制点,在这里查看结构化过程和 OpenCode step。"}));let y=String(u?.runId||""),t=String(u?.interval?.nodeId||u?.marker?.nodeId||""),_=l?.runId===y?l.details:null,c=q6(f,y,t),A=String(r?.runId||"")===y&&String(r?.nodeId||"")===t,j=VS(_,c,y,t),F=(String(l?.runId||"")!==y||Boolean(l?.loading))&&!j,J=String(l?.runId||"")===y?String(l?.error||""):"",Q=A?String(r?.error||""):"",w=j?OS(j,u):null,L=w?.interval||u?.interval||null,U=w?.marker||u?.marker||null,N=String(L?.procedureRunId||U?.procedureRunId||""),q=c?KS(c,N)||H9(c,L||{procedureRunId:N}):null,W=w?.procedure||(j?H9(j,L||{procedureRunId:N}):null)||L?.raw||{};if(q&&(G9(W)===0||iw(q)>=iw(W)))W=BS(W,q);let z=w?.attempt||null,Z=String(w?.matchedStepKey||"");if(!z&&U&&G9(W)>0)z=Ew(W,U),Z=String(Zw(z,Number.isFinite(Number(U?.ms))?Number(U.ms):null).stepKey||"");let H=T6(z),E=G9(W)>0,D=A&&Boolean(r?.loading)&&!E,h=Boolean(F||D),V=[E?"":J,Q].filter(Boolean).join(" / "),S=A&&r?.fetchedAt?r.fetchedAt:l?.fetchedAt,p=zw(W?.status||L?.status||U?.status||U?.event),O=u?.mode==="event"?U?.label||tw(U?.raw||U)||"event":w?.nodeId||L?.nodeId||"node",m=U?ES(U?.raw||U):[],X=U?[gr(U?.raw||U)?`event ${gr(U?.raw||U)}`:"",U?.promptEvent?`prompt ${U.promptEvent}`:"",U?.action?`action ${U.action}`:"",U?.sourceKind?`source ${yw(U.sourceKind)}`:"",U?.sourceNodeId?`from ${U.sourceNodeId}`:"",U?.targetNodeId?`to ${U.targetNodeId}`:"",U?.snapReason?`draw ${U.snapReason}`:""].filter(Boolean):[];return G("aside",{className:"pipeline-gantt-detail-panel","data-testid":"pipeline-gantt-detail-panel"},G("div",{className:"pipeline-gantt-detail-head"},G("div",null,G("span",{className:"panel-eyebrow"},u?.mode==="event"?"Gantt Event Detail":"Gantt Line Detail"),G(nl,{title:O,level:3,loading:h})),G("div",{className:"pipeline-gantt-detail-head-actions"},G(bn,{status:p},p),G("button",{type:"button",className:"ghost-btn mini",onClick:i,"data-testid":"pipeline-gantt-sidebar-collapse"},"收起"))),U?G("article",{className:"pipeline-event-card"},G("div",{className:"pipeline-event-card-head"},G("strong",null,U?.label||tw(U?.raw||U)),G(P9,{items:X})),G(O9,{items:[{label:"event time",value:qu(U?.timestampIso||U?.timestamp||"--")},U?.snapped?{label:"drawn time",value:qu(U?.renderedTimestampIso||U?.ms)}:null,{label:"node",value:U?.nodeId||"--"},{label:"procedure",value:U?.procedureRunId||Vr(W)||"--"},{label:"attempt",value:U?.attempt||H||"--"},{label:"source kind",value:U?.sourceKind?yw(U.sourceKind):"--"},{label:"source node",value:U?.sourceNodeId||"--"},{label:"target node",value:U?.targetNodeId||"--"},{label:"command",value:U?.commandId||U?.eventId||"--"},U?.snapReason?{label:"placement",value:U.snapReason}:null]}),m.length>0?G("div",{className:"pipeline-event-blocks"},m.map((v,T)=>G("section",{key:`${v.label}-${T}`,className:"pipeline-event-text-block"},G("b",null,v.label),G("p",null,v.value)))):null,_w(U?.raw||U)?G("p",{className:"pipeline-text-preview"},_w(U?.raw||U)):null):null,G(O9,{items:[{label:"epoch",value:y||L?.runId||"--"},{label:"node",value:w?.nodeId||L?.nodeId||U?.nodeId||"--"},{label:"procedure",value:L?.procedureRunId||U?.procedureRunId||Vr(W)||"--"},{label:"started",value:qu(L?.startedAt||W?.startedAt)},{label:"finished",value:qu(L?.finishedAt||W?.finishedAt)},{label:"duration",value:Br(L?.durationMs||W?.durationMs)},{label:"fetched",value:S?tl(S):"--"},w?.matchedStep?{label:"matched step",value:`Step ${w.matchedStep.index??w.matchedStepIndex+1}`}:null]}),G(il,{error:V}),G("div",{className:"pipeline-gantt-detail-actions"},G(sr,{title:`Procedure ${L?.procedureRunId||U?.procedureRunId||w?.nodeId||"node"}`,data:W,onOpen:n,testId:"raw-pipeline-gantt-procedure"}),U?G(sr,{title:`Pipeline event ${U?.id||U?.commandId||U?.eventId||w?.nodeId||"event"}`,data:U?.raw||U,onOpen:n,testId:"raw-pipeline-gantt-event"}):null,j?G(sr,{title:`Pipeline run ${y||"--"}`,data:j,onOpen:n,testId:"raw-pipeline-gantt-node-details"}):null),!h&&!Vr(W)&&!U?G(Qr,{title:"暂无过程详情",text:"当前选择还没有可匹配的 procedure 运行记录。"}):null,!h&&Vr(W)?G(HS,{procedure:W,matchedStepKey:Z,matchedAttemptId:H}):null)}function XS({value:u}){let f=String(u||"--").split(/([_-])/u);return G(hn.default.Fragment,null,f.map((r,n)=>r==="-"||r==="_"?G(hn.default.Fragment,{key:n},r,G("wbr",null)):G(hn.default.Fragment,{key:n},r)))}async function Mn(u,l={}){return Tu(u,{invalidJsonPrefix:"Pipeline 返回了无效 JSON",...l})}function bn({status:u,children:l}){let f=String(u||"unknown").toLowerCase();return G("span",{className:`status-badge ${f}`},l||u||"unknown")}function pf({label:u,value:l,hint:f,tone:r}){return G("article",{className:`metric-card ${r||""}`},G("div",{className:"metric-label"},u),G("div",{className:"metric-value"},l),G("div",{className:"metric-hint"},f))}function F0({title:u,eyebrow:l,actions:f,children:r,className:n,loading:i}){return G("section",{className:`panel ${n||""}`},G("div",{className:"panel-head"},G("div",null,l?G("p",{className:"panel-eyebrow"},l):null,G(nl,{title:u,loading:i})),f?G("div",{className:"panel-actions"},f):null),G("div",{className:"panel-body"},r))}function sr({title:u,data:l,onOpen:f,testId:r}){return G("button",{type:"button",className:"ghost-btn","data-testid":r,onClick:()=>f(u,l)},"查看原始JSON")}function Hr({title:u,subtitle:l,facts:f,data:r,onRaw:n,testId:i}){let y=Du(f).map((t)=>String(t||"")).filter(Boolean);return G("article",{className:"pipeline-evidence-row"},G("div",{className:"pipeline-evidence-main"},G("strong",null,u),l?G("span",null,l):null),G("div",{className:"pipeline-evidence-facts"},y.map((t,_)=>G("span",{key:`${_}-${t.slice(0,16)}`},t))),r!==void 0?G(sr,{title:u,data:r,onOpen:n,testId:i}):null)}function Qr({title:u,text:l}){return G("div",{className:"empty-state"},G("strong",null,u),G("span",null,l))}function SS(u){return u?.runtime&&typeof u.runtime==="object"&&!Array.isArray(u.runtime)?u.runtime:{}}function YS(u){return u?.backend&&typeof u.backend==="object"&&!Array.isArray(u.backend)?u.backend:{}}function pS(u){return u?.repository&&typeof u.repository==="object"&&!Array.isArray(u.repository)?u.repository:{}}function mS(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 $w(u,l,f){let r=u?._unidesk?.arrayLimits?.[l],n=Number(r?.originalLength);return Number.isFinite(n)?n:f}function Ow(u){if(!u||typeof u!=="object"||Array.isArray(u))return"--";return`${u.componentClass||"--"}/${u.id||"--"}`}function W6(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 C9(u){return u?.config&&typeof u.config==="object"&&!Array.isArray(u.config)?u.config:{}}function Hw(u){let l=C9(u),f=Array.isArray(l.nodes)?l.nodes:Array.isArray(u?.nodes)?u.nodes:[],r=new Map;for(let y of f){let t=String(y?.id||y?.nodeId||"");if(t)r.set(t,{...y,id:t})}let n=M9(u),i=(y)=>{if(y&&!r.has(y))r.set(y,{id:y})};for(let y of R9(u))m_(y).forEach(i);for(let y of n)i(String(y?.from||y?.source||"")),i(String(y?.to||y?.target||""));return Array.from(r.values())}function M9(u){let l=C9(u);return Array.isArray(l.edges)?l.edges:Array.isArray(u?.edges)?u.edges:[]}function R9(u){let l=C9(u);return Array.isArray(l.topologicalBatches)?l.topologicalBatches:Array.isArray(u?.topologicalBatches)?u.topologicalBatches:[]}function PS(u){let l=new Map;for(let f of u){let r=W6(f);if(r)l.set(r,f);let n=Array.isArray(f?.refs)?f.refs:[];for(let i of n){let y=W6(i);if(y)l.set(y,f)}}return l}function cw(u,l){let f=l.get(W6(u?.componentRef));if(f)return f;let r=W6({componentClass:u?.kind,id:u?.id});return r?l.get(r)||null:null}function Aw(u,l){let f=Bw(u,l);return String(f?.status||"pending")}function Bw(u,l){return(Array.isArray(u?.nodes)?u.nodes:[]).find((r)=>r?.nodeId===l||r?.id===l)||null}function CS(u){return u.reduce((l,f)=>{let r=String(f?.status||"unknown").toLowerCase();return l[r]=(l[r]||0)+1,l},{})}function MS(u){if(Array.isArray(u?.scorers))return u.scorers.filter(Xu);if(Array.isArray(u?.summary?.scorers))return u.summary.scorers.filter(Xu);if(Array.isArray(u?.artifact?.summary?.scorers))return u.artifact.summary.scorers.filter(Xu);return[]}function RS(u){if(Xu(u?.run))return u.run;if(Xu(u?.runSummary))return u.runSummary;return null}function xS(u,l){if(!Xu(u)&&!Xu(l))return null;if(!Xu(u))return l;if(!Xu(l))return u;return{...u,...l,request:Xu(u.request)||Xu(l.request)?{...Xu(u.request)?u.request:{},...Xu(l.request)?l.request:{}}:l.request??u.request,artifact:Xu(u.artifact)||Xu(l.artifact)?{...Xu(u.artifact)?u.artifact:{},...Xu(l.artifact)?l.artifact:{}}:l.artifact??u.artifact,summary:Xu(u.summary)||Xu(l.summary)?{...Xu(u.summary)?u.summary:{},...Xu(l.summary)?l.summary:{}}:l.summary??u.summary}}function w6(u){let l=MS(u),f=l.find((A)=>Xu(A?.score))||l[0]||null,r=Xu(f?.score)?f.score:{},n=Number(r.passed),i=Number(r.total),y=Number(r.ratio),t=Number.isFinite(y)?y:Number.isFinite(n)&&Number.isFinite(i)&&i>0?n/i:null,_=t===null?null:Math.round(Math.max(0,Math.min(100,t<=1?t*100:t))),c=String(r.text||(Number.isFinite(n)&&Number.isFinite(i)?`${n}/${i}`:""));return{scorer:f,scorers:l,score:r,passed:Number.isFinite(n)?n:null,total:Number.isFinite(i)?i:null,percent:_,text:c}}function D9(u){let l=w6(u);return l.text||(l.scorers.length>0?String(l.scorer?.status||"pending"):"--")}function x9(u){let l=w6(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 hS(u){return Array.isArray(u?.items)?u.items.filter(Xu):[]}function bS({run:u}){let l=D9(u);return G("span",{className:`pipeline-score-badge ${x9(u)}`},`score ${l}`)}function vS({run:u,onRaw:l}){let r=w6(u).scorers;if(!u)return G(Qr,{title:"暂无评分",text:"选择一个 epoch 后会显示 scorer 结果。"});if(r.length===0)return G("div",{className:"pipeline-score-empty"},G("strong",null,"评分器等待中"),G("span",null,"DAG 完成后,Pipeline control backend 会把 scorer summary 追加到 run artifact,并通过 UniDesk 显示。"));return G("div",{className:"pipeline-score-board","data-testid":"pipeline-score-board"},r.map((n,i)=>{let y=w6({scorers:[n]}),t=hS(n),_=y.percent??0;return G("article",{key:`${n.scorerId||n.component||i}`,className:`pipeline-score-card ${x9({scorers:[n]})}`},G("div",{className:"pipeline-score-head"},G("div",null,G("span",null,n.scorerId||n.component||"scorer"),G("strong",null,y.text||n.status||"--")),G(bn,{status:n.status||"unknown"},n.status||"unknown")),G("div",{className:"pipeline-score-meter","aria-label":`score ${_}%`},G("span",{style:{width:`${_}%`}})),G("div",{className:"pipeline-score-facts"},G("span",null,`${_}%`),G("span",null,n.component||"--"),G("span",null,n.applicationCheckoutRef||"--")),t.length>0?G("div",{className:"pipeline-score-items"},t.map((c)=>G("span",{key:`${c.id||c.filter}`,className:`pipeline-score-item ${String(c.status||"").toLowerCase()}`,title:`${c.filter||"--"} / ran=${c.ran??"?"}`},G("b",null,c.id||"--"),G("small",null,c.status||"--")))):G("p",{className:"muted paragraph"},"当前 scorer 尚未返回 item 级结果。"),n.error?G("p",{className:"pipeline-score-error"},Gw(n.error,360)):null,G("div",{className:"panel-actions inline-actions"},G(sr,{title:`Scorer ${n.scorerId||i}`,data:n,onOpen:l,testId:"raw-pipeline-score"})))}))}function kS(u){let l=u.reduce((f,r)=>{let n=String(r?.componentClass||"unknown");return f[n]=(f[n]||0)+1,f},{});return Object.entries(l).map(([f,r])=>({name:f,count:Number(r)})).sort((f,r)=>r.count-f.count||f.name.localeCompare(r.name))}function m_(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 m_(u.nodes);if(Array.isArray(u?.nodeIds))return m_(u.nodeIds);return[]}function IS(u){return Xu(u?.instanceInputs?.monitor)?u.instanceInputs.monitor:{}}function Vw(u,l){if(String(u?.kind||"").toLowerCase()!=="procedure")return!1;let f=IS(u);if(u?.instanceInputs?.monitorMode===!0||f.enabled===!0)return!0;let r=Ow(u?.componentRef);return String(l?.id||l?.config?.id||r||"").toLowerCase().includes("monitor")}function gS(u){return u.filter((l)=>Vw(l)).map((l)=>String(l?.id||"")).filter(Boolean)}function sS(u,l){if(l.length===0)return u;let f=new Set(l),r=l.filter((n)=>u.includes(n));if(r.length===0)return u;return[...r,...u.filter((n)=>!f.has(n))]}function aS(u,l){if(l.length===0)return u;let f=new Set(l),r=l.filter((i)=>u.some((y)=>y.includes(i)));if(r.length===0)return u;let n=u.map((i)=>i.filter((y)=>!f.has(y))).filter((i)=>i.length>0);return[r,...n]}function oS(u,l,f){let n=R9(u).map(m_).filter((F)=>F.length>0);if(n.length>0)return n;let i=l.map((F)=>String(F?.id||"")).filter(Boolean),y=new Set(i),t=new Map(i.map((F)=>[F,0])),_=new Map(i.map((F)=>[F,[]]));for(let F of f){let J=String(F?.from||F?.source||""),Q=String(F?.to||F?.target||"");if(!y.has(J)||!y.has(Q))continue;_.get(J)?.push(Q),t.set(Q,(t.get(Q)||0)+1)}let c=new Map,A=i.filter((F)=>(t.get(F)||0)===0);for(let F of A)c.set(F,0);while(A.length>0){let F=A.shift(),J=(c.get(F)||0)+1;for(let Q of _.get(F)||[])if(t.set(Q,Math.max(0,(t.get(Q)||0)-1)),c.set(Q,Math.max(c.get(Q)||0,J)),(t.get(Q)||0)===0)A.push(Q)}i.forEach((F)=>{if(!c.has(F))c.set(F,0)});let j=Math.max(0,...Array.from(c.values()));return Array.from({length:j+1},(F,J)=>i.filter((Q)=>c.get(Q)===J)).filter((F)=>F.length>0)}function dS(u,l,f){let n=R9(u).map(m_).filter((t)=>t.length>0),i=n.length>0?n.flatMap((t)=>t):(()=>{let t=l.map((w)=>String(w?.id||"")).filter(Boolean),_=new Set(t),c=f.filter((w)=>String(w?.edgeType||"").toLowerCase()!=="rework"),A=new Map(t.map((w)=>[w,0])),j=new Map(t.map((w)=>[w,[]]));for(let w of c){let L=String(w?.from||w?.source||""),U=String(w?.to||w?.target||"");if(!_.has(L)||!_.has(U))continue;j.get(L)?.push(U),A.set(U,(A.get(U)||0)+1)}let F=new Map,J=t.filter((w)=>(A.get(w)||0)===0);for(let w of J)F.set(w,0);while(J.length>0){let w=J.shift(),L=(F.get(w)||0)+1;for(let U of j.get(w)||[])if(A.set(U,Math.max(0,(A.get(U)||0)-1)),F.set(U,Math.max(F.get(U)||0,L)),(A.get(U)||0)===0)J.push(U)}t.forEach((w)=>{if(!F.has(w))F.set(w,0)});let Q=Math.max(0,...Array.from(F.values()));return Array.from({length:Q+1},(w,L)=>t.filter((U)=>F.get(U)===L)).flatMap((w)=>w)})(),y=new Set(i);for(let t of l){let _=String(t?.id||"");if(!_||y.has(_))continue;i.push(_),y.add(_)}return sS(i,gS(l))}function B_(u){return`${u.source}->${u.target}-${u.index}`}function jw(u,l,f){let r=Hw(u),n=M9(u),i=PS(f),y=new Map(r.map((p)=>[String(p?.id||""),p])),t=r.filter((p)=>Vw(p,cw(p,i))).map((p)=>String(p?.id||"")).filter(Boolean),_=aS(oS(u,r,n),t),c=[],A=new Map,j=330,F=122;_.forEach((p,O)=>{let m=p.length*122;p.forEach((X,v)=>{let T=y.get(X)||{id:X},Y=cw(T,i),k=Aw(l,X).toLowerCase(),I=String(T.kind||Y?.componentClass||"node").toLowerCase(),b=Ow(T.componentRef||Y),o=String(Y?.config?.version||Y?.version||""),g=String(Y?.config?.description||Y?.description||""),x=v*122-Math.floor(m/2);A.set(X,{column:O,row:v,y:x}),c.push({id:X,type:"pipelineNode",position:{x:O*330,y:x},data:{exportLabel:{id:X,kind:I,componentRef:b,componentVersion:o,componentDescription:g,status:k},label:G("div",{className:"flow-node-label"},G("strong",null,X),G("span",null,I),G("code",{title:g||b},o?`${b}@${o}`:b),G(bn,{status:k},k))},className:`pipeline-flow-node ${I} ${k}`})})});let J=n.flatMap((p,O)=>{let m=String(p?.from||p?.source||""),X=String(p?.to||p?.target||"");if(!y.has(m)||!y.has(X))return[];return[{source:m,target:X,index:O,condition:p?.condition,edgeType:p?.edgeType}]}),Q=J.reduce((p,O)=>p.set(O.source,(p.get(O.source)||0)+1),new Map),w=J.reduce((p,O)=>p.set(O.target,(p.get(O.target)||0)+1),new Map),L=J.reduce((p,O)=>{let m=`${O.source}->${O.target}`;return p.set(m,(p.get(m)||0)+1)},new Map),U=new Map,N=new Map,q=new Map,W=new Map,z=new Map,Z=new Map,H=J.reduce((p,O)=>{let m=A.get(O.source),X=A.get(O.target),v=(X?.column||0)-(m?.column||0);if(v<=0||String(O.edgeType||"").toLowerCase()==="rework"||v!==1)return p;let Y=`${O.source}->column:${X?.column??""}`,k=p.get(Y)||[];return k.push(O),p.set(Y,k),p},new Map);for(let p of H.values()){if(p.length<2)continue;p.slice().sort((O,m)=>{let X=A.get(O.target),v=A.get(m.target);return(X?.y||0)-(v?.y||0)||O.index-m.index}).forEach((O,m,X)=>{Z.set(B_(O),{slot:m-(X.length-1)/2,count:X.length})})}[...J].sort((p,O)=>{let m=A.get(p.source),X=A.get(p.target),v=A.get(O.source),T=A.get(O.target),Y=Math.abs((X?.column||0)-(m?.column||0))*330+Math.abs((X?.y||0)-(m?.y||0)),k=Math.abs((T?.column||0)-(v?.column||0))*330+Math.abs((T?.y||0)-(v?.y||0));return Y-k||p.index-O.index}).forEach((p)=>{let O=A.get(p.source)||{column:0,row:0,y:0},m=A.get(p.target)||{column:0,row:0,y:0},X=m.column-O.column,v=Math.max(0,X),T=X<=0||String(p.edgeType||"").toLowerCase()==="rework",Y=O.y-m.y,k=w.get(p.target)||1,I=Z.has(B_(p)),b=!T&&v<=1&&(I||k===1),o=z.get(p.target)||new Map;z.set(p.target,o);let g=Y_.slice().sort((x,lu)=>{let _u=(Wu)=>{let P=String(Wu.side),e=0;if(T){if(P==="left")e+=86;if(P==="top")e+=m.y<=0?-22:12;if(P==="bottom")e+=m.y>=0?-22:12;if(Math.abs(m.y)<12&&P!=="left")e+=p.index%2===0?P==="top"?-6:6:P==="bottom"?-6:6;return e}if(b){if(P==="left")e-=I?72:44;if(P!=="left")e+=I?72:44;return e+Math.abs(Y)*0.02}if(P==="left")e+=v<=1?0:24;if(P==="top")e+=Y<-36?-18:42;if(P==="bottom")e+=Y>36?-18:42;if(v<=1&&Math.abs(Y)<=82&&P!=="left")e+=38;if(v>1&&P!=="left")e-=10;return e},$u=O.y-m.y,ju=$u!==0?$u:p.index%2===0?-1:1,zu=(Wu)=>{let P=o.get(Wu.id)||0;return _u(Wu)+P*64+QS(Wu,o,ju)};return zu(x)-zu(lu)||String(x.id).localeCompare(String(lu.id))})[0];o.set(g.id,(o.get(g.id)||0)+1),W.set(B_(p),g)});let D=J.map((p)=>{let O=Aw(l,p.target).toLowerCase(),m=`${p.source}->${p.target}`,X=U.get(p.source)||0,v=N.get(p.target)||0,T=q.get(m)||0;U.set(p.source,X+1),N.set(p.target,v+1),q.set(m,T+1);let Y=X-((Q.get(p.source)||1)-1)/2,k=v-((w.get(p.target)||1)-1)/2,I=T-((L.get(m)||1)-1)/2,b=A.get(p.source),o=A.get(p.target),g=(o?.column||0)-(b?.column||0),x=Math.max(1,Math.abs(g)),lu=g<=0||String(p.edgeType||"").toLowerCase()==="rework",_u=Math.abs((o?.y||0)-(b?.y||0)),$u=Z.get(B_(p)),ju=!lu&&g===1&&(w.get(p.target)||0)>1,zu=$u?$u.slot:I*2+Y+k*0.45,Wu=zu===0?p.index%2===0?-1:1:Math.sign(zu),P=W.get(B_(p))||Y_[1],e=P.side==="top"?-1:P.side==="bottom"?1:Wu,uu=lu||x>1||_u>96||Math.abs(zu)>0.2||P.side!=="left",Ku=lu?118+x*18:22+x*16,s=P.side==="left"?0:28,Nu=uu?Math.max(-280,Math.min(280,e*Math.min(180,Ku+s+_u*0.22)+zu*28)):0,Eu=Math.max(0,Math.min(D_.length-1,Math.round(Y+(D_.length-1)/2))),Hu=D_[Eu]||D_[1],vu=O==="succeeded"?"var(--accent-2)":O==="running"?"var(--accent)":O==="failed"?"var(--danger)":"rgba(129, 147, 159, 0.78)",ul=b?.column||0,mu=o?.column||0,Fl=Nu===0?0:Math.sign(Nu),Uf=lu?`feedback:${ul}->${mu}:${Fl}`:$u?`fanout:${ul}->${mu}:${p.source}`:ju?`fanin:${ul}->${mu}:${p.target}`:P.side!=="left"||x>1?`corridor:${ul}->${mu}:${P.side}:${Fl}:${Math.round(Math.abs(Nu)/56)}`:"";return{id:`${p.source}->${p.target}-${p.index}`,source:p.source,target:p.target,sourceHandle:Hu.id,targetHandle:P.id,type:"pipelineCurve",zIndex:12,animated:O==="running",data:{baseEdgeColor:vu,laneOffset:Nu,routeMode:$u&&P.side==="left"?"direct-forward-left":"",targetSide:P.side,isFeedback:lu,overlapGroup:Uf},targetStatus:O}}),h=D.reduce((p,O)=>{let m=String(O.data?.overlapGroup||"");return m?p.set(m,(p.get(m)||0)+1):p},new Map),V=new Map,S=D.map((p)=>{let O=String(p.targetStatus||"pending"),m={...p};delete m.targetStatus;let X=String(p.data?.overlapGroup||""),v=X?h.get(X)||0:0,T=v>1?V.get(X)||0:-1;if(v>1)V.set(X,T+1);let Y=T>=0?eW[T%eW.length]:String(p.data.baseEdgeColor),k={stroke:Y};if(p.data.isFeedback)k.strokeDasharray="9 7";return{...m,data:{...p.data,edgeColor:Y,overlapSlot:T,overlapCount:v},style:k,markerEnd:{type:pn.ArrowClosed,color:Y},className:`pipeline-flow-edge ${O} ${p.data.isFeedback?"feedback":""} ${T>=0?"overlap-colored":""}`}});return{nodes:c,edges:S}}function of(u){return String(u??"").replace(/&/g,"&").replace(//g,">").replace(/"/g,""")}function Fw(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 L6(u){return`arrow-${u.replace(/[^a-zA-Z0-9_-]+/g,"")}`}function Dw(u,l="pipeline"){return String(u||l).replace(/[^a-zA-Z0-9_-]+/g,"-").replace(/^-|-$/g,"")||l}function Uw(u,l){let f=u.position.x,r=u.position.y,n=Y_.find((i)=>i.id===l);if(n?.side==="top")return{x:f+Uy*fw(n.style?.left,0.5),y:r,position:Lu.Top};if(n?.side==="bottom")return{x:f+Uy*fw(n.style?.left,0.5),y:r+Jy,position:Lu.Bottom};return{x:f,y:r+Jy/2,position:Lu.Left}}function eS(u){return{x:u.position.x+Uy,y:u.position.y+Jy/2}}function uY(u,l){let f=Math.min(...u.nodes.map((w)=>w.position.x),0)-220,r=Math.min(...u.nodes.map((w)=>w.position.y),0)-220,n=Math.max(...u.nodes.map((w)=>w.position.x+Uy),1)+220,i=Math.max(...u.nodes.map((w)=>w.position.y+Jy),1)+220,y=Math.ceil(n-f),t=Math.ceil(i-r),_=new Map(u.nodes.map((w)=>[w.id,w])),c=u.edges.map((w)=>Fw(w.data?.edgeColor||w.style?.stroke)),j=Array.from(new Set(["#4eb7a8","#d7a13a","#cf6a54","#81939f",...c])).map((w)=>``).join(""),F=u.edges.flatMap((w)=>{let L=_.get(w.source),U=_.get(w.target);if(!L||!U)return[];let N=eS(L),q=Uw(U,String(w.targetHandle||"in-left")),W=ww(N.x,N.y,q.x,q.y,q.position,Number(w.data?.laneOffset||0),String(w.data?.routeMode||"")),z=Fw(w.data?.edgeColor||w.style?.stroke),Z=w.data?.isFeedback?' stroke-dasharray="9 7"':"";return``}).join(` -`),J=u.nodes.map((w)=>{let L=w.data?.exportLabel||{},U=String(L.status||"pending").toLowerCase(),N=U==="succeeded"?"#4eb7a8":U==="running"?"#d7a13a":U==="failed"?"#cf6a54":"#81939f",q=w.position.x,W=w.position.y,z=Y_.map((Z)=>{let H=Uw(w,Z.id);if(Z.side==="top"||Z.side==="bottom")return``;return``}).join(` +`)),A=$.reduce((j,F)=>j.concat(...F),[]);return[$,A]}return[[],[]]},[u]);return tu.useEffect(()=>{let c=l?.target??qw,$=l?.actInsideInputWithModifier??!0;if(u!==null){let A=(J)=>{if(n.current=J.ctrlKey||J.metaKey||J.shiftKey||J.altKey,(!n.current||n.current&&!$)&&U9(J))return!1;let W=Ww(J.code,y);if(i.current.add(J[W]),ww(t,i.current,!1)){let L=J.composedPath?.()?.[0]||J.target,U=L?.nodeName==="BUTTON"||L?.nodeName==="A";if(l.preventDefault!==!1&&(n.current||!U))J.preventDefault();r(!0)}},j=(J)=>{let Q=Ww(J.code,y);if(ww(t,i.current,!0))r(!1),i.current.clear();else i.current.delete(J[Q]);if(J.key==="Meta")i.current.clear();n.current=!1},F=()=>{i.current.clear(),r(!1)};return c?.addEventListener("keydown",A),c?.addEventListener("keyup",j),window.addEventListener("blur",F),window.addEventListener("contextmenu",F),()=>{c?.removeEventListener("keydown",A),c?.removeEventListener("keyup",j),window.removeEventListener("blur",F),window.removeEventListener("contextmenu",F)}}},[u,r]),f}function ww(u,l,f){return u.filter((r)=>f||r.length===l.size).some((r)=>r.every((n)=>l.has(n)))}function Ww(u,l){return l.includes(u)?"code":"key"}var hV=()=>{let u=Ol();return tu.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:r}=u.getState();return r?r.scaleTo(l,f):Promise.resolve(!1)},getZoom:()=>u.getState().transform[2],setViewport:async(l,f)=>{let{transform:[r,n,i],panZoom:t}=u.getState();if(!t)return Promise.resolve(!1);return await t.setViewport({x:l.x??r,y:l.y??n,zoom:l.zoom??i},f),Promise.resolve(!0)},getViewport:()=>{let[l,f,r]=u.getState().transform;return{x:l,y:f,zoom:r}},setCenter:async(l,f,r)=>{return u.getState().setCenter(l,f,r)},fitBounds:async(l,f)=>{let{width:r,height:n,minZoom:i,maxZoom:t,panZoom:y}=u.getState(),c=pc(l,r,n,i,t,f?.padding??0.1);if(!y)return Promise.resolve(!1);return await y.setViewport(c,{duration:f?.duration,ease:f?.ease,interpolate:f?.interpolate}),Promise.resolve(!0)},screenToFlowPosition:(l,f={})=>{let{transform:r,snapGrid:n,snapToGrid:i,domNode:t}=u.getState();if(!t)return l;let{x:y,y:c}=t.getBoundingClientRect(),$={x:l.x-y,y:l.y-c},A=f.snapGrid??n,j=f.snapToGrid??i;return Ny($,r,j,A)},flowToScreenPosition:(l)=>{let{transform:f,domNode:r}=u.getState();if(!r)return l;let{x:n,y:i}=r.getBoundingClientRect(),t=Vc(l,f);return{x:t.x+n,y:t.y+i}}}},[])};function Rw(u,l){let f=[],r=new Map,n=[];for(let i of u)if(i.type==="add"){n.push(i);continue}else if(i.type==="remove"||i.type==="replace")r.set(i.id,[i]);else{let t=r.get(i.id);if(t)t.push(i);else r.set(i.id,[i])}for(let i of l){let t=r.get(i.id);if(!t){f.push(i);continue}if(t[0].type==="remove")continue;if(t[0].type==="replace"){f.push({...t[0].item});continue}let y={...i};for(let c of t)xV(c,y);f.push(y)}if(n.length)n.forEach((i)=>{if(i.index!==void 0)f.splice(i.index,0,{...i.item});else f.push({...i.item})});return f}function xV(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 bV(u,l){return Rw(u,l)}function vV(u,l){return Rw(u,l)}function si(u,l){return{id:u,type:"select",selected:l}}function Wy(u,l=new Set,f=!1){let r=[];for(let[n,i]of u){let t=l.has(n);if(!(i.selected===void 0&&!t)&&i.selected!==t){if(f)i.selected=t;r.push(si(i.id,t))}}return r}function Lw({items:u=[],lookup:l}){let f=[],r=new Map(u.map((n)=>[n.id,n]));for(let[n,i]of u.entries()){let t=l.get(i.id),y=t?.internals?.userNode??t;if(y!==void 0&&y!==i)f.push({id:i.id,item:i,type:"replace"});if(y===void 0)f.push({item:i,type:"add",index:n})}for(let[n]of l)if(r.get(n)===void 0)f.push({id:n,type:"remove"});return f}function Tw(u){return{id:u.id,type:"remove"}}var Kw=(u)=>zq(u),kV=(u)=>r9(u);function hw(u){return tu.forwardRef(u)}function Gw(u){let[l,f]=tu.useState(BigInt(0)),[r]=tu.useState(()=>IV(()=>f((n)=>n+BigInt(1))));return O9(()=>{let n=r.get();if(n.length)u(n),r.reset()},[l]),r}function IV(u){let l=[];return{get:()=>l,reset:()=>{l=[]},push:(f)=>{l.push(f),u()}}}var xw=tu.createContext(null);function gV({children:u}){let l=Ol(),f=tu.useCallback((y)=>{let{nodes:c=[],setNodes:$,hasDefaultNodes:A,onNodesChange:j,nodeLookup:F,fitViewQueued:J,onNodesChangeMiddlewareMap:Q}=l.getState(),W=c;for(let U of y)W=typeof U==="function"?U(W):U;let L=Lw({items:W,lookup:F});for(let U of Q.values())L=U(L);if(A)$(W);if(L.length>0)j?.(L);else if(J)window.requestAnimationFrame(()=>{let{fitViewQueued:U,nodes:q,setNodes:N}=l.getState();if(U)N(q)})},[]),r=Gw(f),n=tu.useCallback((y)=>{let{edges:c=[],setEdges:$,hasDefaultEdges:A,onEdgesChange:j,edgeLookup:F}=l.getState(),J=c;for(let Q of y)J=typeof Q==="function"?Q(J):Q;if(A)$(J);else if(j)j(Lw({items:J,lookup:F}))},[]),i=Gw(n),t=tu.useMemo(()=>({nodeQueue:r,edgeQueue:i}),[]);return ru.jsx(xw.Provider,{value:t,children:u})}function sV(){let u=tu.useContext(xw);if(!u)throw Error("useBatchContext must be used within a BatchProvider");return u}var aV=(u)=>!!u.panZoom;function H9(){let u=hV(),l=Ol(),f=sV(),r=il(aV),n=tu.useMemo(()=>{let i=(j)=>l.getState().nodeLookup.get(j),t=(j)=>{f.nodeQueue.push(j)},y=(j)=>{f.edgeQueue.push(j)},c=(j)=>{let{nodeLookup:F,nodeOrigin:J}=l.getState(),Q=Kw(j)?j:F.get(j.id),W=Q.parentId?A9(Q.position,Q.measured,Q.parentId,F,J):Q.position,L={...Q,position:W,width:Q.measured?.width??Q.width,height:Q.measured?.height??Q.height};return gi(L)},$=(j,F,J={replace:!1})=>{t((Q)=>Q.map((W)=>{if(W.id===j){let L=typeof F==="function"?F(W):F;return J.replace&&Kw(L)?L:{...W,...L}}return W}))},A=(j,F,J={replace:!1})=>{y((Q)=>Q.map((W)=>{if(W.id===j){let L=typeof F==="function"?F(W):F;return J.replace&&kV(L)?L:{...W,...L}}return W}))};return{getNodes:()=>l.getState().nodes.map((j)=>({...j})),getNode:(j)=>i(j)?.internals.userNode,getInternalNode:i,getEdges:()=>{let{edges:j=[]}=l.getState();return j.map((F)=>({...F}))},getEdge:(j)=>l.getState().edgeLookup.get(j),setNodes:t,setEdges:y,addNodes:(j)=>{let F=Array.isArray(j)?j:[j];f.nodeQueue.push((J)=>[...J,...F])},addEdges:(j)=>{let F=Array.isArray(j)?j:[j];f.edgeQueue.push((J)=>[...J,...F])},toObject:()=>{let{nodes:j=[],edges:F=[],transform:J}=l.getState(),[Q,W,L]=J;return{nodes:j.map((U)=>({...U})),edges:F.map((U)=>({...U})),viewport:{x:Q,y:W,zoom:L}}},deleteElements:async({nodes:j=[],edges:F=[]})=>{let{nodes:J,edges:Q,onNodesDelete:W,onEdgesDelete:L,triggerNodeChanges:U,triggerEdgeChanges:q,onDelete:N,onBeforeDelete:w}=l.getState(),{nodes:G,edges:Z}=await Zq({nodesToRemove:j,edgesToRemove:F,nodes:J,edges:Q,onBeforeDelete:w}),H=Z.length>0,E=G.length>0;if(H){let V=Z.map(Tw);L?.(Z),q(V)}if(E){let V=G.map(Tw);W?.(G),U(V)}if(E||H)N?.({nodes:G,edges:Z});return{deletedNodes:G,deletedEdges:Z}},getIntersectingNodes:(j,F=!0,J)=>{let Q=c9(j),W=Q?j:c(j),L=J!==void 0;if(!W)return[];return(J||l.getState().nodes).filter((U)=>{let q=l.getState().nodeLookup.get(U.id);if(q&&!Q&&(U.id===j.id||!q.internals.positionAbsolute))return!1;let N=gi(L?U:q),w=Jy(N,W);return F&&w>0||w>=N.width*N.height||w>=W.width*W.height})},isNodeIntersecting:(j,F,J=!0)=>{let W=c9(j)?j:c(j);if(!W)return!1;let L=Jy(W,F);return J&&L>0||L>=F.width*F.height||L>=W.width*W.height},updateNode:$,updateNodeData:(j,F,J={replace:!1})=>{$(j,(Q)=>{let W=typeof F==="function"?F(Q):F;return J.replace?{...Q,data:W}:{...Q,data:{...Q.data,...W}}},J)},updateEdge:A,updateEdgeData:(j,F,J={replace:!1})=>{A(j,(Q)=>{let W=typeof F==="function"?F(Q):F;return J.replace?{...Q,data:W}:{...Q,data:{...Q.data,...W}}},J)},getNodesBounds:(j)=>{let{nodeLookup:F,nodeOrigin:J}=l.getState();return i9(j,{nodeLookup:F,nodeOrigin:J})},getHandleConnections:({type:j,id:F,nodeId:J})=>Array.from(l.getState().connectionLookup.get(`${J}-${j}${F?`-${F}`:""}`)?.values()??[]),getNodeConnections:({type:j,handleId:F,nodeId:J})=>Array.from(l.getState().connectionLookup.get(`${J}${j?F?`-${j}-${F}`:`-${j}`:""}`)?.values()??[]),fitView:async(j)=>{let F=l.getState().fitViewResolver??mq();return l.setState({fitViewQueued:!0,fitViewOptions:j,fitViewResolver:F}),f.nodeQueue.push((J)=>[...J]),F.promise}}},[]);return tu.useMemo(()=>{return{...n,...u,viewportInitialized:r}},[r])}var zw=(u)=>u.selected,oV=typeof window<"u"?window:void 0;function dV({deleteKeyCode:u,multiSelectionKeyCode:l}){let f=Ol(),{deleteElements:r}=H9(),n=Xc(u,{actInsideInputWithModifier:!1}),i=Xc(l,{target:oV});tu.useEffect(()=>{if(n){let{edges:t,nodes:y}=f.getState();r({nodes:y.filter(zw),edges:t.filter(zw)}),f.setState({nodesSelectionActive:!1})}},[n]),tu.useEffect(()=>{f.setState({multiSelectionActive:i})},[i])}function eV(u){let l=Ol();tu.useEffect(()=>{let f=()=>{if(!u.current||!(u.current.checkVisibility?.()??!0))return!1;let r=rA(u.current);if(r.height===0||r.width===0)l.getState().onError?.("004",Qr.error004());l.setState({width:r.width||500,height:r.height||500})};if(u.current){f(),window.addEventListener("resize",f);let r=new ResizeObserver(()=>f());return r.observe(u.current),()=>{if(window.removeEventListener("resize",f),r&&u.current)r.unobserve(u.current)}}},[])}var qA={position:"absolute",width:"100%",height:"100%",top:0,left:0},uD=(u)=>({userSelectionActive:u.userSelectionActive,lib:u.lib,connectionInProgress:u.connection.inProgress});function lD({onPaneContextMenu:u,zoomOnScroll:l=!0,zoomOnPinch:f=!0,panOnScroll:r=!1,panOnScrollSpeed:n=0.5,panOnScrollMode:i=gn.Free,zoomOnDoubleClick:t=!0,panOnDrag:y=!0,defaultViewport:c,translateExtent:$,minZoom:A,maxZoom:j,zoomActivationKeyCode:F,preventScrolling:J=!0,children:Q,noWheelClassName:W,noPanClassName:L,onViewportChange:U,isControlledViewport:q,paneClickDistance:N,selectionOnDrag:w}){let G=Ol(),Z=tu.useRef(null),{userSelectionActive:H,lib:E,connectionInProgress:V}=il(uD,zl),S=Xc(F),B=tu.useRef();eV(Z);let D=tu.useCallback((X)=>{if(U?.({x:X[0],y:X[1],zoom:X[2]}),!q)G.setState({transform:X})},[U,q]);return tu.useEffect(()=>{if(Z.current){B.current=oq({domNode:Z.current,minZoom:A,maxZoom:j,translateExtent:$,viewport:c,onDraggingChange:(p)=>G.setState((v)=>v.paneDragging===p?v:{paneDragging:p}),onPanZoomStart:(p,v)=>{let{onViewportChangeStart:z,onMoveStart:P}=G.getState();P?.(p,v),z?.(v)},onPanZoom:(p,v)=>{let{onViewportChange:z,onMove:P}=G.getState();P?.(p,v),z?.(v)},onPanZoomEnd:(p,v)=>{let{onViewportChangeEnd:z,onMoveEnd:P}=G.getState();P?.(p,v),z?.(v)}});let{x:X,y:O,zoom:Y}=B.current.getViewport();return G.setState({panZoom:B.current,transform:[X,O,Y],domNode:Z.current.closest(".react-flow")}),()=>{B.current?.destroy()}}},[]),tu.useEffect(()=>{B.current?.update({onPaneContextMenu:u,zoomOnScroll:l,zoomOnPinch:f,panOnScroll:r,panOnScrollSpeed:n,panOnScrollMode:i,zoomOnDoubleClick:t,panOnDrag:y,zoomActivationKeyPressed:S,preventScrolling:J,noPanClassName:L,userSelectionActive:H,noWheelClassName:W,lib:E,onTransformChange:D,connectionInProgress:V,selectionOnDrag:w,paneClickDistance:N})},[u,l,f,r,n,i,t,y,S,J,L,H,W,E,D,V,w,N]),ru.jsx("div",{className:"react-flow__renderer",ref:Z,style:qA,children:Q})}var fD=(u)=>({userSelectionActive:u.userSelectionActive,userSelectionRect:u.userSelectionRect});function rD(){let{userSelectionActive:u,userSelectionRect:l}=il(fD,zl);if(!(u&&l))return null;return ru.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 z9=(u,l)=>{return(f)=>{if(f.target!==l.current)return;u?.(f)}},nD=(u)=>({userSelectionActive:u.userSelectionActive,elementsSelectable:u.elementsSelectable,connectionInProgress:u.connection.inProgress,dragging:u.paneDragging});function iD({isSelecting:u,selectionKeyPressed:l,selectionMode:f=ki.Full,panOnDrag:r,paneClickDistance:n,selectionOnDrag:i,onSelectionStart:t,onSelectionEnd:y,onPaneClick:c,onPaneContextMenu:$,onPaneScroll:A,onPaneMouseEnter:j,onPaneMouseMove:F,onPaneMouseLeave:J,children:Q}){let W=Ol(),{userSelectionActive:L,elementsSelectable:U,dragging:q,connectionInProgress:N}=il(nD,zl),w=U&&(u||L),G=tu.useRef(null),Z=tu.useRef(),H=tu.useRef(new Set),E=tu.useRef(new Set),V=tu.useRef(!1),S=(z)=>{if(V.current||N){V.current=!1;return}c?.(z),W.getState().resetSelectedElements(),W.setState({nodesSelectionActive:!1})},B=(z)=>{if(Array.isArray(r)&&r?.includes(2)){z.preventDefault();return}$?.(z)},D=A?(z)=>A(z):void 0,X=(z)=>{if(V.current)z.stopPropagation(),V.current=!1},O=(z)=>{let{domNode:P}=W.getState();if(Z.current=P?.getBoundingClientRect(),!Z.current)return;let k=z.target===G.current;if(!k&&!!z.target.closest(".nokey")||!u||!(i&&k||l)||z.button!==0||!z.isPrimary)return;z.target?.setPointerCapture?.(z.pointerId),V.current=!1;let{x:d,y:g}=mr(z.nativeEvent,Z.current);if(W.setState({userSelectionRect:{width:0,height:0,startX:d,startY:g,x:d,y:g}}),!k)z.stopPropagation(),z.preventDefault()},Y=(z)=>{let{userSelectionRect:P,transform:k,nodeLookup:I,edgeLookup:b,connectionLookup:d,triggerNodeChanges:g,triggerEdgeChanges:x,defaultEdgeOptions:lu,resetSelectedElements:cu}=W.getState();if(!Z.current||!P)return;let{x:_u,y:Fu}=mr(z.nativeEvent,Z.current),{startX:zu,startY:Wu}=P;if(!V.current){let s=l?0:n;if(Math.hypot(_u-zu,Fu-Wu)<=s)return;cu(),t?.(z)}V.current=!0;let C={startX:zu,startY:Wu,x:_us.id)),E.current=new Set;let Gu=lu?.selectable??!0;for(let s of H.current){let qu=d.get(s);if(!qu)continue;for(let{edgeId:Zu}of qu.values()){let Bu=b.get(Zu);if(Bu&&(Bu.selectable??Gu))E.current.add(Zu)}}if(!j9(e,H.current)){let s=Wy(I,H.current,!0);g(s)}if(!j9(uu,E.current)){let s=Wy(b,E.current);x(s)}W.setState({userSelectionRect:C,userSelectionActive:!0,nodesSelectionActive:!1})},p=(z)=>{if(z.button!==0)return;if(z.target?.releasePointerCapture?.(z.pointerId),!L&&z.target===G.current&&W.getState().userSelectionRect)S?.(z);if(W.setState({userSelectionActive:!1,userSelectionRect:null}),V.current)y?.(z),W.setState({nodesSelectionActive:H.current.size>0})},v=r===!0||Array.isArray(r)&&r.includes(0);return ru.jsxs("div",{className:Xl(["react-flow__pane",{draggable:v,dragging:q,selection:u}]),onClick:w?void 0:z9(S,G),onContextMenu:z9(B,G),onWheel:z9(D,G),onPointerEnter:w?void 0:j,onPointerMove:w?Y:F,onPointerUp:w?p:void 0,onPointerDownCapture:w?O:void 0,onClickCapture:w?X:void 0,onPointerLeave:J,ref:G,style:qA,children:[Q,ru.jsx(rD,{})]})}function Z9({id:u,store:l,unselect:f=!1,nodeRef:r}){let{addSelectedNodes:n,unselectNodesAndEdges:i,multiSelectionActive:t,nodeLookup:y,onError:c}=l.getState(),$=y.get(u);if(!$){c?.("012",Qr.error012(u));return}if(l.setState({nodesSelectionActive:!1}),!$.selected)n([u]);else if(f||$.selected&&t)i({nodes:[$],edges:[]}),requestAnimationFrame(()=>r?.current?.blur())}function bw({nodeRef:u,disabled:l=!1,noDragClassName:f,handleSelector:r,nodeId:n,isSelectable:i,nodeClickDistance:t}){let y=Ol(),[c,$]=tu.useState(!1),A=tu.useRef();return tu.useEffect(()=>{A.current=xq({getStoreItems:()=>y.getState(),onNodeMouseDown:(j)=>{Z9({id:j,store:y,nodeRef:u})},onDragStart:()=>{$(!0)},onDragStop:()=>{$(!1)}})},[]),tu.useEffect(()=>{if(l||!u.current||!A.current)return;return A.current.update({noDragClassName:f,handleSelector:r,domNode:u.current,isSelectable:i,nodeId:n,nodeClickDistance:t}),()=>{A.current?.destroy()}},[f,r,l,i,u,n,t]),c}var tD=(u)=>(l)=>l.selected&&(l.draggable||u&&typeof l.draggable>"u");function vw(){let u=Ol();return tu.useCallback((f)=>{let{nodeExtent:r,snapToGrid:n,snapGrid:i,nodesDraggable:t,onError:y,updateNodePositions:c,nodeLookup:$,nodeOrigin:A}=u.getState(),j=new Map,F=tD(t),J=n?i[0]:5,Q=n?i[1]:5,W=f.direction.x*J*f.factor,L=f.direction.y*Q*f.factor;for(let[,U]of $){if(!F(U))continue;let q={x:U.internals.positionAbsolute.x+W,y:U.internals.positionAbsolute.y+L};if(n)q=Qy(q,i);let{position:N,positionAbsolute:w}=t9({nodeId:U.id,nextPosition:q,nodeLookup:$,nodeExtent:r,nodeOrigin:A,onError:y});U.position=N,U.internals.positionAbsolute=w,j.set(U.id,U)}c(j)},[])}var B9=tu.createContext(null),yD=B9.Provider;B9.Consumer;var kw=()=>{return tu.useContext(B9)},cD=(u)=>({connectOnClick:u.connectOnClick,noPanClassName:u.noPanClassName,rfId:u.rfId}),_D=(u,l,f)=>(r)=>{let{connectionClickStartHandle:n,connectionMode:i,connection:t}=r,{fromHandle:y,toHandle:c,isValid:$}=t,A=c?.nodeId===u&&c?.id===l&&c?.type===f;return{connectingFrom:y?.nodeId===u&&y?.id===l&&y?.type===f,connectingTo:A,clickConnecting:n?.nodeId===u&&n?.id===l&&n?.type===f,isPossibleEndHandle:i===h0.Strict?y?.type!==f:u!==y?.nodeId||l!==y?.id,connectionInProcess:!!y,clickConnectionInProcess:!!n,valid:A&&$}};function $D({type:u="source",position:l=Ku.Top,isValidConnection:f,isConnectable:r=!0,isConnectableStart:n=!0,isConnectableEnd:i=!0,id:t,onConnect:y,children:c,className:$,onMouseDown:A,onTouchStart:j,...F},J){let Q=t||null,W=u==="target",L=Ol(),U=kw(),{connectOnClick:q,noPanClassName:N,rfId:w}=il(cD,zl),{connectingFrom:G,connectingTo:Z,clickConnecting:H,isPossibleEndHandle:E,connectionInProcess:V,clickConnectionInProcess:S,valid:B}=il(_D(U,Q,u),zl);if(!U)L.getState().onError?.("010",Qr.error010());let D=(Y)=>{let{defaultEdgeOptions:p,onConnect:v,hasDefaultEdges:z}=L.getState(),P={...p,...Y};if(z){let{edges:k,setEdges:I}=L.getState();I(N9(P,k))}v?.(P),y?.(P)},X=(Y)=>{if(!U)return;let p=J9(Y.nativeEvent);if(n&&(p&&Y.button===0||!p)){let v=L.getState();$A.onPointerDown(Y.nativeEvent,{handleDomNode:Y.currentTarget,autoPanOnConnect:v.autoPanOnConnect,connectionMode:v.connectionMode,connectionRadius:v.connectionRadius,domNode:v.domNode,nodeLookup:v.nodeLookup,lib:v.lib,isTarget:W,handleId:Q,nodeId:U,flowId:v.rfId,panBy:v.panBy,cancelConnection:v.cancelConnection,onConnectStart:v.onConnectStart,onConnectEnd:(...z)=>L.getState().onConnectEnd?.(...z),updateConnection:v.updateConnection,onConnect:D,isValidConnection:f||((...z)=>L.getState().isValidConnection?.(...z)??!0),getTransform:()=>L.getState().transform,getFromHandle:()=>L.getState().connection.fromHandle,autoPanSpeed:v.autoPanSpeed,dragThreshold:v.connectionDragThreshold})}if(p)A?.(Y);else j?.(Y)},O=(Y)=>{let{onClickConnectStart:p,onClickConnectEnd:v,connectionClickStartHandle:z,connectionMode:P,isValidConnection:k,lib:I,rfId:b,nodeLookup:d,connection:g}=L.getState();if(!U||!z&&!n)return;if(!z){p?.(Y.nativeEvent,{nodeId:U,handleId:Q,handleType:u}),L.setState({connectionClickStartHandle:{nodeId:U,type:u,id:Q}});return}let x=F9(Y.target),lu=f||k,{connection:cu,isValid:_u}=$A.isValid(Y.nativeEvent,{handle:{nodeId:U,id:Q,type:u},connectionMode:P,fromNodeId:z.nodeId,fromHandleId:z.id||null,fromType:z.type,isValidConnection:lu,flowId:b,doc:x,lib:I,nodeLookup:d});if(_u&&cu)D(cu);let Fu=structuredClone(g);delete Fu.inProgress,Fu.toPosition=Fu.toHandle?Fu.toHandle.position:null,v?.(Y,Fu),L.setState({connectionClickStartHandle:null})};return ru.jsx("div",{"data-handleid":Q,"data-nodeid":U,"data-handlepos":l,"data-id":`${w}-${U}-${Q}-${u}`,className:Xl(["react-flow__handle",`react-flow__handle-${l}`,"nodrag",N,$,{source:!W,target:W,connectable:r,connectablestart:n,connectableend:i,clickconnecting:H,connectingfrom:G,connectingto:Z,valid:B,connectionindicator:r&&(!V||E)&&(V||S?i:n)}]),onMouseDown:X,onTouchStart:X,onClick:q?O:void 0,ref:J,...F,children:c})}var ai=tu.memo(hw($D));function AD({data:u,isConnectable:l,sourcePosition:f=Ku.Bottom}){return ru.jsxs(ru.Fragment,{children:[u?.label,ru.jsx(ai,{type:"source",position:f,isConnectable:l})]})}function jD({data:u,isConnectable:l,targetPosition:f=Ku.Top,sourcePosition:r=Ku.Bottom}){return ru.jsxs(ru.Fragment,{children:[ru.jsx(ai,{type:"target",position:f,isConnectable:l}),u?.label,ru.jsx(ai,{type:"source",position:r,isConnectable:l})]})}function FD(){return null}function UD({data:u,isConnectable:l,targetPosition:f=Ku.Top}){return ru.jsxs(ru.Fragment,{children:[ru.jsx(ai,{type:"target",position:f,isConnectable:l}),u?.label]})}var JA={ArrowUp:{x:0,y:-1},ArrowDown:{x:0,y:1},ArrowLeft:{x:-1,y:0},ArrowRight:{x:1,y:0}},Ew={input:AD,default:jD,output:UD,group:FD};function JD(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 QD=(u)=>{let{width:l,height:f,x:r,y:n}=Uy(u.nodeLookup,{filter:(i)=>!!i.selected});return{width:Br(l)?l:null,height:Br(f)?f:null,userSelectionActive:u.userSelectionActive,transformString:`translate(${u.transform[0]}px,${u.transform[1]}px) scale(${u.transform[2]}) translate(${r}px,${n}px)`}};function ND({onSelectionContextMenu:u,noPanClassName:l,disableKeyboardA11y:f}){let r=Ol(),{width:n,height:i,transformString:t,userSelectionActive:y}=il(QD,zl),c=vw(),$=tu.useRef(null);tu.useEffect(()=>{if(!f)$.current?.focus({preventScroll:!0})},[f]);let A=!y&&n!==null&&i!==null;if(bw({nodeRef:$,disabled:!A}),!A)return null;let j=u?(J)=>{let Q=r.getState().nodes.filter((W)=>W.selected);u(J,Q)}:void 0,F=(J)=>{if(Object.prototype.hasOwnProperty.call(JA,J.key))J.preventDefault(),c({direction:JA[J.key],factor:J.shiftKey?4:1})};return ru.jsx("div",{className:Xl(["react-flow__nodesselection","react-flow__container",l]),style:{transform:t},children:ru.jsx("div",{ref:$,className:"react-flow__nodesselection-rect",onContextMenu:j,tabIndex:f?void 0:-1,onKeyDown:f?void 0:F,style:{width:n,height:i}})})}var Ow=typeof window<"u"?window:void 0,qD=(u)=>{return{nodesSelectionActive:u.nodesSelectionActive,userSelectionActive:u.userSelectionActive}};function Iw({children:u,onPaneClick:l,onPaneMouseEnter:f,onPaneMouseMove:r,onPaneMouseLeave:n,onPaneContextMenu:i,onPaneScroll:t,paneClickDistance:y,deleteKeyCode:c,selectionKeyCode:$,selectionOnDrag:A,selectionMode:j,onSelectionStart:F,onSelectionEnd:J,multiSelectionKeyCode:Q,panActivationKeyCode:W,zoomActivationKeyCode:L,elementsSelectable:U,zoomOnScroll:q,zoomOnPinch:N,panOnScroll:w,panOnScrollSpeed:G,panOnScrollMode:Z,zoomOnDoubleClick:H,panOnDrag:E,defaultViewport:V,translateExtent:S,minZoom:B,maxZoom:D,preventScrolling:X,onSelectionContextMenu:O,noWheelClassName:Y,noPanClassName:p,disableKeyboardA11y:v,onViewportChange:z,isControlledViewport:P}){let{nodesSelectionActive:k,userSelectionActive:I}=il(qD,zl),b=Xc($,{target:Ow}),d=Xc(W,{target:Ow}),g=d||E,x=d||w,lu=A&&g!==!0,cu=b||I||lu;return dV({deleteKeyCode:c,multiSelectionKeyCode:Q}),ru.jsx(lD,{onPaneContextMenu:i,elementsSelectable:U,zoomOnScroll:q,zoomOnPinch:N,panOnScroll:x,panOnScrollSpeed:G,panOnScrollMode:Z,zoomOnDoubleClick:H,panOnDrag:!b&&g,defaultViewport:V,translateExtent:S,minZoom:B,maxZoom:D,zoomActivationKeyCode:L,preventScrolling:X,noWheelClassName:Y,noPanClassName:p,onViewportChange:z,isControlledViewport:P,paneClickDistance:y,selectionOnDrag:lu,children:ru.jsxs(iD,{onSelectionStart:F,onSelectionEnd:J,onPaneClick:l,onPaneMouseEnter:f,onPaneMouseMove:r,onPaneMouseLeave:n,onPaneContextMenu:i,onPaneScroll:t,panOnDrag:g,isSelecting:!!cu,selectionMode:j,selectionKeyPressed:b,paneClickDistance:y,selectionOnDrag:lu,children:[u,k&&ru.jsx(ND,{onSelectionContextMenu:O,noPanClassName:p,disableKeyboardA11y:v})]})})}Iw.displayName="FlowRenderer";var wD=tu.memo(Iw),WD=(u)=>(l)=>{return u?uA(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 LD(u){return il(tu.useCallback(WD(u),[u]),zl)}var TD=(u)=>u.updateNodeInternals;function KD(){let u=il(TD),[l]=tu.useState(()=>{if(typeof ResizeObserver>"u")return null;return new ResizeObserver((f)=>{let r=new Map;f.forEach((n)=>{let i=n.target.getAttribute("data-id");r.set(i,{id:i,nodeElement:n.target,force:!0})}),u(r)})});return tu.useEffect(()=>{return()=>{l?.disconnect()}},[l]),l}function GD({node:u,nodeType:l,hasDimensions:f,resizeObserver:r}){let n=Ol(),i=tu.useRef(null),t=tu.useRef(null),y=tu.useRef(u.sourcePosition),c=tu.useRef(u.targetPosition),$=tu.useRef(l),A=f&&!!u.internals.handleBounds;return tu.useEffect(()=>{if(i.current&&!u.hidden&&(!A||t.current!==i.current)){if(t.current)r?.unobserve(t.current);r?.observe(i.current),t.current=i.current}},[A,u.hidden]),tu.useEffect(()=>{return()=>{if(t.current)r?.unobserve(t.current),t.current=null}},[]),tu.useEffect(()=>{if(i.current){let j=$.current!==l,F=y.current!==u.sourcePosition,J=c.current!==u.targetPosition;if(j||F||J)$.current=l,y.current=u.sourcePosition,c.current=u.targetPosition,n.getState().updateNodeInternals(new Map([[u.id,{id:u.id,nodeElement:i.current,force:!0}]]))}},[u.id,l,u.sourcePosition,u.targetPosition]),i}function zD({id:u,onClick:l,onMouseEnter:f,onMouseMove:r,onMouseLeave:n,onContextMenu:i,onDoubleClick:t,nodesDraggable:y,elementsSelectable:c,nodesConnectable:$,nodesFocusable:A,resizeObserver:j,noDragClassName:F,noPanClassName:J,disableKeyboardA11y:Q,rfId:W,nodeTypes:L,nodeClickDistance:U,onError:q}){let{node:N,internals:w,isParent:G}=il((_u)=>{let Fu=_u.nodeLookup.get(u),zu=_u.parentLookup.has(u);return{node:Fu,internals:Fu.internals,isParent:zu}},zl),Z=N.type||"default",H=L?.[Z]||Ew[Z];if(H===void 0)q?.("003",Qr.error003(Z)),Z="default",H=L?.default||Ew.default;let E=!!(N.draggable||y&&typeof N.draggable>"u"),V=!!(N.selectable||c&&typeof N.selectable>"u"),S=!!(N.connectable||$&&typeof N.connectable>"u"),B=!!(N.focusable||A&&typeof N.focusable>"u"),D=Ol(),X=$9(N),O=GD({node:N,nodeType:Z,hasDimensions:X,resizeObserver:j}),Y=bw({nodeRef:O,disabled:N.hidden||!E,noDragClassName:F,handleSelector:N.dragHandle,nodeId:u,isSelectable:V,nodeClickDistance:U}),p=vw();if(N.hidden)return null;let v=qn(N),z=JD(N),P=V||E||l||f||r||n,k=f?(_u)=>f(_u,{...w.userNode}):void 0,I=r?(_u)=>r(_u,{...w.userNode}):void 0,b=n?(_u)=>n(_u,{...w.userNode}):void 0,d=i?(_u)=>i(_u,{...w.userNode}):void 0,g=t?(_u)=>t(_u,{...w.userNode}):void 0,x=(_u)=>{let{selectNodesOnDrag:Fu,nodeDragThreshold:zu}=D.getState();if(V&&(!Fu||!E||zu>0))Z9({id:u,store:D,nodeRef:O});if(l)l(_u,{...w.userNode})},lu=(_u)=>{if(U9(_u.nativeEvent)||Q)return;if(e5.includes(_u.key)&&V){let Fu=_u.key==="Escape";Z9({id:u,store:D,unselect:Fu,nodeRef:O})}else if(E&&N.selected&&Object.prototype.hasOwnProperty.call(JA,_u.key)){_u.preventDefault();let{ariaLabelConfig:Fu}=D.getState();D.setState({ariaLiveMessage:Fu["node.a11yDescription.ariaLiveMessage"]({direction:_u.key.replace("Arrow","").toLowerCase(),x:~~w.positionAbsolute.x,y:~~w.positionAbsolute.y})}),p({direction:JA[_u.key],factor:_u.shiftKey?4:1})}},cu=()=>{if(Q||!O.current?.matches(":focus-visible"))return;let{transform:_u,width:Fu,height:zu,autoPanOnNodeFocus:Wu,setCenter:C}=D.getState();if(!Wu)return;if(!(uA(new Map([[u,N]]),{x:0,y:0,width:Fu,height:zu},_u,!0).length>0))C(N.position.x+v.width/2,N.position.y+v.height/2,{zoom:_u[2]})};return ru.jsx("div",{className:Xl(["react-flow__node",`react-flow__node-${Z}`,{[J]:E},N.className,{selected:N.selected,selectable:V,parent:G,draggable:E,dragging:Y}]),ref:O,style:{zIndex:w.z,transform:`translate(${w.positionAbsolute.x}px,${w.positionAbsolute.y}px)`,pointerEvents:P?"all":"none",visibility:X?"visible":"hidden",...N.style,...z},"data-id":u,"data-testid":`rf__node-${u}`,onMouseEnter:k,onMouseMove:I,onMouseLeave:b,onContextMenu:d,onClick:x,onDoubleClick:g,onKeyDown:B?lu:void 0,tabIndex:B?0:void 0,onFocus:B?cu:void 0,role:N.ariaRole??(B?"group":void 0),"aria-roledescription":"node","aria-describedby":Q?void 0:`${Pw}-${W}`,"aria-label":N.ariaLabel,...N.domAttributes,children:ru.jsx(yD,{value:u,children:ru.jsx(H,{id:u,data:N.data,type:Z,positionAbsoluteX:w.positionAbsolute.x,positionAbsoluteY:w.positionAbsolute.y,selected:N.selected??!1,selectable:V,draggable:E,deletable:N.deletable??!0,isConnectable:S,sourcePosition:N.sourcePosition,targetPosition:N.targetPosition,dragging:Y,dragHandle:N.dragHandle,zIndex:w.z,parentId:N.parentId,...v})})})}var ED=tu.memo(zD),OD=(u)=>({nodesDraggable:u.nodesDraggable,nodesConnectable:u.nodesConnectable,nodesFocusable:u.nodesFocusable,elementsSelectable:u.elementsSelectable,onError:u.onError});function gw(u){let{nodesDraggable:l,nodesConnectable:f,nodesFocusable:r,elementsSelectable:n,onError:i}=il(OD,zl),t=LD(u.onlyRenderVisibleElements),y=KD();return ru.jsx("div",{className:"react-flow__nodes",style:qA,children:t.map((c)=>{return ru.jsx(ED,{id:c,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:y,nodesDraggable:l,nodesConnectable:f,nodesFocusable:r,elementsSelectable:n,nodeClickDistance:u.nodeClickDistance,onError:i},c)})})}gw.displayName="NodeRenderer";var ZD=tu.memo(gw);function HD(u){return il(tu.useCallback((f)=>{if(!u)return f.edges.map((n)=>n.id);let r=[];if(f.width&&f.height)for(let n of f.edges){let i=f.nodeLookup.get(n.source),t=f.nodeLookup.get(n.target);if(i&&t&&pq({sourceNode:i,targetNode:t,width:f.width,height:f.height,transform:f.transform}))r.push(n.id)}return r},[u]),zl)}var BD=({color:u="none",strokeWidth:l=1})=>{let f={strokeWidth:l,...u&&{stroke:u}};return ru.jsx("polyline",{className:"arrow",style:f,strokeLinecap:"round",fill:"none",strokeLinejoin:"round",points:"-5,-4 0,0 -5,4"})},mD=({color:u="none",strokeWidth:l=1})=>{let f={strokeWidth:l,...u&&{stroke:u,fill:u}};return ru.jsx("polyline",{className:"arrowclosed",style:f,strokeLinecap:"round",strokeLinejoin:"round",points:"-5,-4 0,0 -5,4 -5,-4"})},Zw={[x0.Arrow]:BD,[x0.ArrowClosed]:mD};function VD(u){let l=Ol();return tu.useMemo(()=>{if(!Object.prototype.hasOwnProperty.call(Zw,u))return l.getState().onError?.("009",Qr.error009(u)),null;return Zw[u]},[u])}var DD=({id:u,type:l,color:f,width:r=12.5,height:n=12.5,markerUnits:i="strokeWidth",strokeWidth:t,orient:y="auto-start-reverse"})=>{let c=VD(l);if(!c)return null;return ru.jsx("marker",{className:"react-flow__arrowhead",id:u,markerWidth:`${r}`,markerHeight:`${n}`,viewBox:"-10 -10 20 20",markerUnits:i,orient:y,refX:"0",refY:"0",children:ru.jsx(c,{color:f,strokeWidth:t})})},sw=({defaultColor:u,rfId:l})=>{let f=il((i)=>i.edges),r=il((i)=>i.defaultEdgeOptions),n=tu.useMemo(()=>{return Xq(f,{id:l,defaultColor:u,defaultMarkerStart:r?.markerStart,defaultMarkerEnd:r?.markerEnd})},[f,r,l,u]);if(!n.length)return null;return ru.jsx("svg",{className:"react-flow__marker","aria-hidden":"true",children:ru.jsx("defs",{children:n.map((i)=>ru.jsx(DD,{id:i.id,type:i.type,color:i.color,width:i.width,height:i.height,markerUnits:i.markerUnits,strokeWidth:i.strokeWidth,orient:i.orient},i.id))})})};sw.displayName="MarkerDefinitions";var pD=tu.memo(sw);function aw({x:u,y:l,label:f,labelStyle:r,labelShowBg:n=!0,labelBgStyle:i,labelBgPadding:t=[2,4],labelBgBorderRadius:y=2,children:c,className:$,...A}){let[j,F]=tu.useState({x:1,y:0,width:0,height:0}),J=Xl(["react-flow__edge-textwrapper",$]),Q=tu.useRef(null);if(tu.useEffect(()=>{if(Q.current){let W=Q.current.getBBox();F({x:W.x,y:W.y,width:W.width,height:W.height})}},[f]),!f)return null;return ru.jsxs("g",{transform:`translate(${u-j.width/2} ${l-j.height/2})`,className:J,visibility:j.width?"visible":"hidden",...A,children:[n&&ru.jsx("rect",{width:j.width+2*t[0],x:-t[0],y:-t[1],height:j.height+2*t[1],className:"react-flow__edge-textbg",style:i,rx:y,ry:y}),ru.jsx("text",{className:"react-flow__edge-text",y:j.height/2,dy:"0.3em",ref:Q,style:r,children:f}),c]})}aw.displayName="EdgeText";var SD=tu.memo(aw);function Ly({path:u,labelX:l,labelY:f,label:r,labelStyle:n,labelShowBg:i,labelBgStyle:t,labelBgPadding:y,labelBgBorderRadius:c,interactionWidth:$=20,...A}){return ru.jsxs(ru.Fragment,{children:[ru.jsx("path",{...A,d:u,fill:"none",className:Xl(["react-flow__edge-path",A.className])}),$?ru.jsx("path",{d:u,fill:"none",strokeOpacity:0,strokeWidth:$,className:"react-flow__edge-interaction"}):null,r&&Br(l)&&Br(f)?ru.jsx(SD,{x:l,y:f,label:r,labelStyle:n,labelShowBg:i,labelBgStyle:t,labelBgPadding:y,labelBgBorderRadius:c}):null]})}function Hw({pos:u,x1:l,y1:f,x2:r,y2:n}){if(u===Ku.Left||u===Ku.Right)return[0.5*(l+r),f];return[l,0.5*(f+n)]}function ow({sourceX:u,sourceY:l,sourcePosition:f=Ku.Bottom,targetX:r,targetY:n,targetPosition:i=Ku.Top}){let[t,y]=Hw({pos:f,x1:u,y1:l,x2:r,y2:n}),[c,$]=Hw({pos:i,x1:r,y1:n,x2:u,y2:l}),[A,j,F,J]=nA({sourceX:u,sourceY:l,targetX:r,targetY:n,sourceControlX:t,sourceControlY:y,targetControlX:c,targetControlY:$});return[`M${u},${l} C${t},${y} ${c},${$} ${r},${n}`,A,j,F,J]}function dw(u){return tu.memo(({id:l,sourceX:f,sourceY:r,targetX:n,targetY:i,sourcePosition:t,targetPosition:y,label:c,labelStyle:$,labelShowBg:A,labelBgStyle:j,labelBgPadding:F,labelBgBorderRadius:J,style:Q,markerEnd:W,markerStart:L,interactionWidth:U})=>{let[q,N,w]=ow({sourceX:f,sourceY:r,sourcePosition:t,targetX:n,targetY:i,targetPosition:y}),G=u.isInternal?void 0:l;return ru.jsx(Ly,{id:G,path:q,labelX:N,labelY:w,label:c,labelStyle:$,labelShowBg:A,labelBgStyle:j,labelBgPadding:F,labelBgBorderRadius:J,style:Q,markerEnd:W,markerStart:L,interactionWidth:U})})}var XD=dw({isInternal:!1}),ew=dw({isInternal:!0});XD.displayName="SimpleBezierEdge";ew.displayName="SimpleBezierEdgeInternal";function uW(u){return tu.memo(({id:l,sourceX:f,sourceY:r,targetX:n,targetY:i,label:t,labelStyle:y,labelShowBg:c,labelBgStyle:$,labelBgPadding:A,labelBgBorderRadius:j,style:F,sourcePosition:J=Ku.Bottom,targetPosition:Q=Ku.Top,markerEnd:W,markerStart:L,pathOptions:U,interactionWidth:q})=>{let[N,w,G]=Sc({sourceX:f,sourceY:r,sourcePosition:J,targetX:n,targetY:i,targetPosition:Q,borderRadius:U?.borderRadius,offset:U?.offset,stepPosition:U?.stepPosition}),Z=u.isInternal?void 0:l;return ru.jsx(Ly,{id:Z,path:N,labelX:w,labelY:G,label:t,labelStyle:y,labelShowBg:c,labelBgStyle:$,labelBgPadding:A,labelBgBorderRadius:j,style:F,markerEnd:W,markerStart:L,interactionWidth:q})})}var lW=uW({isInternal:!1}),fW=uW({isInternal:!0});lW.displayName="SmoothStepEdge";fW.displayName="SmoothStepEdgeInternal";function rW(u){return tu.memo(({id:l,...f})=>{let r=u.isInternal?void 0:l;return ru.jsx(lW,{...f,id:r,pathOptions:tu.useMemo(()=>({borderRadius:0,offset:f.pathOptions?.offset}),[f.pathOptions?.offset])})})}var YD=rW({isInternal:!1}),nW=rW({isInternal:!0});YD.displayName="StepEdge";nW.displayName="StepEdgeInternal";function iW(u){return tu.memo(({id:l,sourceX:f,sourceY:r,targetX:n,targetY:i,label:t,labelStyle:y,labelShowBg:c,labelBgStyle:$,labelBgPadding:A,labelBgBorderRadius:j,style:F,markerEnd:J,markerStart:Q,interactionWidth:W})=>{let[L,U,q]=tA({sourceX:f,sourceY:r,targetX:n,targetY:i}),N=u.isInternal?void 0:l;return ru.jsx(Ly,{id:N,path:L,labelX:U,labelY:q,label:t,labelStyle:y,labelShowBg:c,labelBgStyle:$,labelBgPadding:A,labelBgBorderRadius:j,style:F,markerEnd:J,markerStart:Q,interactionWidth:W})})}var PD=iW({isInternal:!1}),tW=iW({isInternal:!0});PD.displayName="StraightEdge";tW.displayName="StraightEdgeInternal";function yW(u){return tu.memo(({id:l,sourceX:f,sourceY:r,targetX:n,targetY:i,sourcePosition:t=Ku.Bottom,targetPosition:y=Ku.Top,label:c,labelStyle:$,labelShowBg:A,labelBgStyle:j,labelBgPadding:F,labelBgBorderRadius:J,style:Q,markerEnd:W,markerStart:L,pathOptions:U,interactionWidth:q})=>{let[N,w,G]=iA({sourceX:f,sourceY:r,sourcePosition:t,targetX:n,targetY:i,targetPosition:y,curvature:U?.curvature}),Z=u.isInternal?void 0:l;return ru.jsx(Ly,{id:Z,path:N,labelX:w,labelY:G,label:c,labelStyle:$,labelShowBg:A,labelBgStyle:j,labelBgPadding:F,labelBgBorderRadius:J,style:Q,markerEnd:W,markerStart:L,interactionWidth:q})})}var CD=yW({isInternal:!1}),cW=yW({isInternal:!0});CD.displayName="BezierEdge";cW.displayName="BezierEdgeInternal";var Bw={default:cW,straight:tW,step:nW,smoothstep:fW,simplebezier:ew},mw={sourceX:null,sourceY:null,targetX:null,targetY:null,sourcePosition:null,targetPosition:null},MD=(u,l,f)=>{if(f===Ku.Left)return u-l;if(f===Ku.Right)return u+l;return u},RD=(u,l,f)=>{if(f===Ku.Top)return u-l;if(f===Ku.Bottom)return u+l;return u},Vw="react-flow__edgeupdater";function Dw({position:u,centerX:l,centerY:f,radius:r=10,onMouseDown:n,onMouseEnter:i,onMouseOut:t,type:y}){return ru.jsx("circle",{onMouseDown:n,onMouseEnter:i,onMouseOut:t,className:Xl([Vw,`${Vw}-${y}`]),cx:MD(l,r,u),cy:RD(f,r,u),r,stroke:"transparent",fill:"transparent"})}function hD({isReconnectable:u,reconnectRadius:l,edge:f,sourceX:r,sourceY:n,targetX:i,targetY:t,sourcePosition:y,targetPosition:c,onReconnect:$,onReconnectStart:A,onReconnectEnd:j,setReconnecting:F,setUpdateHover:J}){let Q=Ol(),W=(w,G)=>{if(w.button!==0)return;let{autoPanOnConnect:Z,domNode:H,connectionMode:E,connectionRadius:V,lib:S,onConnectStart:B,cancelConnection:D,nodeLookup:X,rfId:O,panBy:Y,updateConnection:p}=Q.getState(),v=G.type==="target",z=(I,b)=>{F(!1),j?.(I,f,G.type,b)},P=(I)=>$?.(f,I),k=(I,b)=>{F(!0),A?.(w,f,G.type),B?.(I,b)};$A.onPointerDown(w.nativeEvent,{autoPanOnConnect:Z,connectionMode:E,connectionRadius:V,domNode:H,handleId:G.id,nodeId:G.nodeId,nodeLookup:X,isTarget:v,edgeUpdaterType:G.type,lib:S,flowId:O,cancelConnection:D,panBy:Y,isValidConnection:(...I)=>Q.getState().isValidConnection?.(...I)??!0,onConnect:P,onConnectStart:k,onConnectEnd:(...I)=>Q.getState().onConnectEnd?.(...I),onReconnectEnd:z,updateConnection:p,getTransform:()=>Q.getState().transform,getFromHandle:()=>Q.getState().connection.fromHandle,dragThreshold:Q.getState().connectionDragThreshold,handleDomNode:w.currentTarget})},L=(w)=>W(w,{nodeId:f.target,id:f.targetHandle??null,type:"target"}),U=(w)=>W(w,{nodeId:f.source,id:f.sourceHandle??null,type:"source"}),q=()=>J(!0),N=()=>J(!1);return ru.jsxs(ru.Fragment,{children:[(u===!0||u==="source")&&ru.jsx(Dw,{position:y,centerX:r,centerY:n,radius:l,onMouseDown:L,onMouseEnter:q,onMouseOut:N,type:"source"}),(u===!0||u==="target")&&ru.jsx(Dw,{position:c,centerX:i,centerY:t,radius:l,onMouseDown:U,onMouseEnter:q,onMouseOut:N,type:"target"})]})}function xD({id:u,edgesFocusable:l,edgesReconnectable:f,elementsSelectable:r,onClick:n,onDoubleClick:i,onContextMenu:t,onMouseEnter:y,onMouseMove:c,onMouseLeave:$,reconnectRadius:A,onReconnect:j,onReconnectStart:F,onReconnectEnd:J,rfId:Q,edgeTypes:W,noPanClassName:L,onError:U,disableKeyboardA11y:q}){let N=il((C)=>C.edgeLookup.get(u)),w=il((C)=>C.defaultEdgeOptions);N=w?{...w,...N}:N;let G=N.type||"default",Z=W?.[G]||Bw[G];if(Z===void 0)U?.("011",Qr.error011(G)),G="default",Z=W?.default||Bw.default;let H=!!(N.focusable||l&&typeof N.focusable>"u"),E=typeof j<"u"&&(N.reconnectable||f&&typeof N.reconnectable>"u"),V=!!(N.selectable||r&&typeof N.selectable>"u"),S=tu.useRef(null),[B,D]=tu.useState(!1),[X,O]=tu.useState(!1),Y=Ol(),{zIndex:p,sourceX:v,sourceY:z,targetX:P,targetY:k,sourcePosition:I,targetPosition:b}=il(tu.useCallback((C)=>{let e=C.nodeLookup.get(N.source),uu=C.nodeLookup.get(N.target);if(!e||!uu)return{zIndex:N.zIndex,...mw};let Gu=Sq({id:u,sourceNode:e,targetNode:uu,sourceHandle:N.sourceHandle||null,targetHandle:N.targetHandle||null,connectionMode:C.connectionMode,onError:U});return{zIndex:Dq({selected:N.selected,zIndex:N.zIndex,sourceNode:e,targetNode:uu,elevateOnSelect:C.elevateEdgesOnSelect,zIndexMode:C.zIndexMode}),...Gu||mw}},[N.source,N.target,N.sourceHandle,N.targetHandle,N.selected,N.zIndex]),zl),d=tu.useMemo(()=>N.markerStart?`url('#${yA(N.markerStart,Q)}')`:void 0,[N.markerStart,Q]),g=tu.useMemo(()=>N.markerEnd?`url('#${yA(N.markerEnd,Q)}')`:void 0,[N.markerEnd,Q]);if(N.hidden||v===null||z===null||P===null||k===null)return null;let x=(C)=>{let{addSelectedEdges:e,unselectNodesAndEdges:uu,multiSelectionActive:Gu}=Y.getState();if(V)if(Y.setState({nodesSelectionActive:!1}),N.selected&&Gu)uu({nodes:[],edges:[N]}),S.current?.blur();else e([u]);if(n)n(C,N)},lu=i?(C)=>{i(C,{...N})}:void 0,cu=t?(C)=>{t(C,{...N})}:void 0,_u=y?(C)=>{y(C,{...N})}:void 0,Fu=c?(C)=>{c(C,{...N})}:void 0,zu=$?(C)=>{$(C,{...N})}:void 0,Wu=(C)=>{if(!q&&e5.includes(C.key)&&V){let{unselectNodesAndEdges:e,addSelectedEdges:uu}=Y.getState();if(C.key==="Escape")S.current?.blur(),e({edges:[N]});else uu([u])}};return ru.jsx("svg",{style:{zIndex:p},children:ru.jsxs("g",{className:Xl(["react-flow__edge",`react-flow__edge-${G}`,N.className,L,{selected:N.selected,animated:N.animated,inactive:!V&&!n,updating:B,selectable:V}]),onClick:x,onDoubleClick:lu,onContextMenu:cu,onMouseEnter:_u,onMouseMove:Fu,onMouseLeave:zu,onKeyDown:H?Wu:void 0,tabIndex:H?0:void 0,role:N.ariaRole??(H?"group":"img"),"aria-roledescription":"edge","data-id":u,"data-testid":`rf__edge-${u}`,"aria-label":N.ariaLabel===null?void 0:N.ariaLabel||`Edge from ${N.source} to ${N.target}`,"aria-describedby":H?`${Cw}-${Q}`:void 0,ref:S,...N.domAttributes,children:[!X&&ru.jsx(Z,{id:u,source:N.source,target:N.target,type:N.type,selected:N.selected,animated:N.animated,selectable:V,deletable:N.deletable??!0,label:N.label,labelStyle:N.labelStyle,labelShowBg:N.labelShowBg,labelBgStyle:N.labelBgStyle,labelBgPadding:N.labelBgPadding,labelBgBorderRadius:N.labelBgBorderRadius,sourceX:v,sourceY:z,targetX:P,targetY:k,sourcePosition:I,targetPosition:b,data:N.data,style:N.style,sourceHandleId:N.sourceHandle,targetHandleId:N.targetHandle,markerStart:d,markerEnd:g,pathOptions:"pathOptions"in N?N.pathOptions:void 0,interactionWidth:N.interactionWidth}),E&&ru.jsx(hD,{edge:N,isReconnectable:E,reconnectRadius:A,onReconnect:j,onReconnectStart:F,onReconnectEnd:J,sourceX:v,sourceY:z,targetX:P,targetY:k,sourcePosition:I,targetPosition:b,setUpdateHover:D,setReconnecting:O})]})})}var bD=tu.memo(xD),vD=(u)=>({edgesFocusable:u.edgesFocusable,edgesReconnectable:u.edgesReconnectable,elementsSelectable:u.elementsSelectable,connectionMode:u.connectionMode,onError:u.onError});function _W({defaultMarkerColor:u,onlyRenderVisibleElements:l,rfId:f,edgeTypes:r,noPanClassName:n,onReconnect:i,onEdgeContextMenu:t,onEdgeMouseEnter:y,onEdgeMouseMove:c,onEdgeMouseLeave:$,onEdgeClick:A,reconnectRadius:j,onEdgeDoubleClick:F,onReconnectStart:J,onReconnectEnd:Q,disableKeyboardA11y:W}){let{edgesFocusable:L,edgesReconnectable:U,elementsSelectable:q,onError:N}=il(vD,zl),w=HD(l);return ru.jsxs("div",{className:"react-flow__edges",children:[ru.jsx(pD,{defaultColor:u,rfId:f}),w.map((G)=>{return ru.jsx(bD,{id:G,edgesFocusable:L,edgesReconnectable:U,elementsSelectable:q,noPanClassName:n,onReconnect:i,onContextMenu:t,onMouseEnter:y,onMouseMove:c,onMouseLeave:$,onClick:A,reconnectRadius:j,onDoubleClick:F,onReconnectStart:J,onReconnectEnd:Q,rfId:f,onError:N,edgeTypes:r,disableKeyboardA11y:W},G)})]})}_W.displayName="EdgeRenderer";var kD=tu.memo(_W),ID=(u)=>`translate(${u.transform[0]}px,${u.transform[1]}px) scale(${u.transform[2]})`;function gD({children:u}){let l=il(ID);return ru.jsx("div",{className:"react-flow__viewport xyflow__viewport react-flow__container",style:{transform:l},children:u})}function sD(u){let l=H9(),f=tu.useRef(!1);tu.useEffect(()=>{if(!f.current&&l.viewportInitialized&&u)setTimeout(()=>u(l),1),f.current=!0},[u,l.viewportInitialized])}var aD=(u)=>u.panZoom?.syncViewport;function oD(u){let l=il(aD),f=Ol();return tu.useEffect(()=>{if(u)l?.(u),f.setState({transform:[u.x,u.y,u.zoom]})},[u,l]),null}function pw(u){return u.connection.inProgress?{...u.connection,to:Ny(u.connection.to,u.transform)}:{...u.connection}}function dD(u){if(u)return(f)=>{let r=pw(f);return u(r)};return pw}function eD(u){let l=dD(u);return il(l,zl)}var up=(u)=>({nodesConnectable:u.nodesConnectable,isValid:u.connection.isValid,inProgress:u.connection.inProgress,width:u.width,height:u.height});function lp({containerStyle:u,style:l,type:f,component:r}){let{nodesConnectable:n,width:i,height:t,isValid:y,inProgress:c}=il(up,zl);if(!(i&&n&&c))return null;return ru.jsx("svg",{style:u,width:i,height:t,className:"react-flow__connectionline react-flow__container",children:ru.jsx("g",{className:Xl(["react-flow__connection",f9(y)]),children:ru.jsx($W,{style:l,type:f,CustomComponent:r,isValid:y})})})}var $W=({style:u,type:l=Nn.Bezier,CustomComponent:f,isValid:r})=>{let{inProgress:n,from:i,fromNode:t,fromHandle:y,fromPosition:c,to:$,toNode:A,toHandle:j,toPosition:F,pointer:J}=eD();if(!n)return;if(f)return ru.jsx(f,{connectionLineType:l,connectionLineStyle:u,fromNode:t,fromHandle:y,fromX:i.x,fromY:i.y,toX:$.x,toY:$.y,fromPosition:c,toPosition:F,connectionStatus:f9(r),toNode:A,toHandle:j,pointer:J});let Q="",W={sourceX:i.x,sourceY:i.y,sourcePosition:c,targetX:$.x,targetY:$.y,targetPosition:F};switch(l){case Nn.Bezier:[Q]=iA(W);break;case Nn.SimpleBezier:[Q]=ow(W);break;case Nn.Step:[Q]=Sc({...W,borderRadius:0});break;case Nn.SmoothStep:[Q]=Sc(W);break;default:[Q]=tA(W)}return ru.jsx("path",{d:Q,fill:"none",className:"react-flow__connection-path",style:u})};$W.displayName="ConnectionLine";var fp={};function Sw(u=fp){let l=tu.useRef(u),f=Ol();tu.useEffect(()=>{},[u])}function rp(){let u=Ol(),l=tu.useRef(!1);tu.useEffect(()=>{},[])}function AW({nodeTypes:u,edgeTypes:l,onInit:f,onNodeClick:r,onEdgeClick:n,onNodeDoubleClick:i,onEdgeDoubleClick:t,onNodeMouseEnter:y,onNodeMouseMove:c,onNodeMouseLeave:$,onNodeContextMenu:A,onSelectionContextMenu:j,onSelectionStart:F,onSelectionEnd:J,connectionLineType:Q,connectionLineStyle:W,connectionLineComponent:L,connectionLineContainerStyle:U,selectionKeyCode:q,selectionOnDrag:N,selectionMode:w,multiSelectionKeyCode:G,panActivationKeyCode:Z,zoomActivationKeyCode:H,deleteKeyCode:E,onlyRenderVisibleElements:V,elementsSelectable:S,defaultViewport:B,translateExtent:D,minZoom:X,maxZoom:O,preventScrolling:Y,defaultMarkerColor:p,zoomOnScroll:v,zoomOnPinch:z,panOnScroll:P,panOnScrollSpeed:k,panOnScrollMode:I,zoomOnDoubleClick:b,panOnDrag:d,onPaneClick:g,onPaneMouseEnter:x,onPaneMouseMove:lu,onPaneMouseLeave:cu,onPaneScroll:_u,onPaneContextMenu:Fu,paneClickDistance:zu,nodeClickDistance:Wu,onEdgeContextMenu:C,onEdgeMouseEnter:e,onEdgeMouseMove:uu,onEdgeMouseLeave:Gu,reconnectRadius:s,onReconnect:qu,onReconnectStart:Zu,onReconnectEnd:Bu,noDragClassName:Iu,noWheelClassName:ll,noPanClassName:Pu,disableKeyboardA11y:Jl,nodeExtent:Jf,rfId:Of,viewport:yf,onViewportChange:lf}){return Sw(u),Sw(l),rp(),sD(f),oD(yf),ru.jsx(wD,{onPaneClick:g,onPaneMouseEnter:x,onPaneMouseMove:lu,onPaneMouseLeave:cu,onPaneContextMenu:Fu,onPaneScroll:_u,paneClickDistance:zu,deleteKeyCode:E,selectionKeyCode:q,selectionOnDrag:N,selectionMode:w,onSelectionStart:F,onSelectionEnd:J,multiSelectionKeyCode:G,panActivationKeyCode:Z,zoomActivationKeyCode:H,elementsSelectable:S,zoomOnScroll:v,zoomOnPinch:z,zoomOnDoubleClick:b,panOnScroll:P,panOnScrollSpeed:k,panOnScrollMode:I,panOnDrag:d,defaultViewport:B,translateExtent:D,minZoom:X,maxZoom:O,onSelectionContextMenu:j,preventScrolling:Y,noDragClassName:Iu,noWheelClassName:ll,noPanClassName:Pu,disableKeyboardA11y:Jl,onViewportChange:lf,isControlledViewport:!!yf,children:ru.jsxs(gD,{children:[ru.jsx(kD,{edgeTypes:l,onEdgeClick:n,onEdgeDoubleClick:t,onReconnect:qu,onReconnectStart:Zu,onReconnectEnd:Bu,onlyRenderVisibleElements:V,onEdgeContextMenu:C,onEdgeMouseEnter:e,onEdgeMouseMove:uu,onEdgeMouseLeave:Gu,reconnectRadius:s,defaultMarkerColor:p,noPanClassName:Pu,disableKeyboardA11y:Jl,rfId:Of}),ru.jsx(lp,{style:W,type:Q,component:L,containerStyle:U}),ru.jsx("div",{className:"react-flow__edgelabel-renderer"}),ru.jsx(ZD,{nodeTypes:u,onNodeClick:r,onNodeDoubleClick:i,onNodeMouseEnter:y,onNodeMouseMove:c,onNodeMouseLeave:$,onNodeContextMenu:A,nodeClickDistance:Wu,onlyRenderVisibleElements:V,noPanClassName:Pu,noDragClassName:Iu,disableKeyboardA11y:Jl,nodeExtent:Jf,rfId:Of}),ru.jsx("div",{className:"react-flow__viewport-portal"})]})})}AW.displayName="GraphView";var np=tu.memo(AW),Xw=({nodes:u,edges:l,defaultNodes:f,defaultEdges:r,width:n,height:i,fitView:t,fitViewOptions:y,minZoom:c=0.5,maxZoom:$=2,nodeOrigin:A,nodeExtent:j,zIndexMode:F="basic"}={})=>{let J=new Map,Q=new Map,W=new Map,L=new Map,U=r??l??[],q=f??u??[],N=A??[0,0],w=j??Fy;T9(W,L,U);let{nodesInitialized:G}=cA(q,J,Q,{nodeOrigin:N,nodeExtent:w,zIndexMode:F}),Z=[0,0,1];if(t&&n&&i){let H=Uy(J,{filter:(B)=>!!((B.width||B.initialWidth)&&(B.height||B.initialHeight))}),{x:E,y:V,zoom:S}=pc(H,n,i,c,$,y?.padding??0.1);Z=[E,V,S]}return{rfId:"1",width:n??0,height:i??0,transform:Z,nodes:q,nodesInitialized:G,nodeLookup:J,parentLookup:Q,edges:U,edgeLookup:L,connectionLookup:W,onNodesChange:null,onEdgesChange:null,hasDefaultNodes:f!==void 0,hasDefaultEdges:r!==void 0,panZoom:null,minZoom:c,maxZoom:$,translateExtent:Fy,nodeExtent:w,nodesSelectionActive:!1,userSelectionActive:!1,userSelectionRect:null,connectionMode:h0.Strict,domNode:null,paneDragging:!1,noPanClassName:"nopan",nodeOrigin:N,nodeDragThreshold:1,connectionDragThreshold:1,snapGrid:[15,15],snapToGrid:!1,nodesDraggable:!0,nodesConnectable:!0,nodesFocusable:!0,edgesFocusable:!0,edgesReconnectable:!0,elementsSelectable:!0,elevateNodesOnSelect:!0,elevateEdgesOnSelect:!0,selectNodesOnDrag:!0,multiSelectionActive:!1,fitViewQueued:t??!1,fitViewOptions:y,fitViewResolver:null,connection:{...l9},connectionClickStartHandle:null,connectOnClick:!0,ariaLiveMessage:"",autoPanOnConnect:!0,autoPanOnNodeDrag:!0,autoPanOnNodeFocus:!0,autoPanSpeed:15,connectionRadius:20,onError:_9,isValidConnection:void 0,onSelectionChangeHandlers:[],lib:"react",debug:!1,ariaLabelConfig:u9,zIndexMode:F,onNodesChangeMiddlewareMap:new Map,onEdgesChangeMiddlewareMap:new Map}},ip=({nodes:u,edges:l,defaultNodes:f,defaultEdges:r,width:n,height:i,fitView:t,fitViewOptions:y,minZoom:c,maxZoom:$,nodeOrigin:A,nodeExtent:j,zIndexMode:F})=>Fw((J,Q)=>{async function W(){let{nodeLookup:L,panZoom:U,fitViewOptions:q,fitViewResolver:N,width:w,height:G,minZoom:Z,maxZoom:H}=Q();if(!U)return;await Oq({nodes:L,width:w,height:G,panZoom:U,minZoom:Z,maxZoom:H},q),N?.resolve(!0),J({fitViewResolver:null})}return{...Xw({nodes:u,edges:l,width:n,height:i,fitView:t,fitViewOptions:y,minZoom:c,maxZoom:$,nodeOrigin:A,nodeExtent:j,defaultNodes:f,defaultEdges:r,zIndexMode:F}),setNodes:(L)=>{let{nodeLookup:U,parentLookup:q,nodeOrigin:N,elevateNodesOnSelect:w,fitViewQueued:G,zIndexMode:Z,nodesSelectionActive:H}=Q(),{nodesInitialized:E,hasSelectedNodes:V}=cA(L,U,q,{nodeOrigin:N,nodeExtent:j,elevateNodesOnSelect:w,checkEquality:!0,zIndexMode:Z}),S=H&&V;if(G&&E)W(),J({nodes:L,nodesInitialized:E,fitViewQueued:!1,fitViewOptions:void 0,nodesSelectionActive:S});else J({nodes:L,nodesInitialized:E,nodesSelectionActive:S})},setEdges:(L)=>{let{connectionLookup:U,edgeLookup:q}=Q();T9(U,q,L),J({edges:L})},setDefaultNodesAndEdges:(L,U)=>{if(L){let{setNodes:q}=Q();q(L),J({hasDefaultNodes:!0})}if(U){let{setEdges:q}=Q();q(U),J({hasDefaultEdges:!0})}},updateNodeInternals:(L)=>{let{triggerNodeChanges:U,nodeLookup:q,parentLookup:N,domNode:w,nodeOrigin:G,nodeExtent:Z,debug:H,fitViewQueued:E,zIndexMode:V}=Q(),{changes:S,updatedInternals:B}=Mq(L,q,N,w,G,Z,V);if(!B)return;if(Pq(q,N,{nodeOrigin:G,nodeExtent:Z,zIndexMode:V}),E)W(),J({fitViewQueued:!1,fitViewOptions:void 0});else J({});if(S?.length>0){if(H)console.log("React Flow: trigger node changes",S);U?.(S)}},updateNodePositions:(L,U=!1)=>{let q=[],N=[],{nodeLookup:w,triggerNodeChanges:G,connection:Z,updateConnection:H,onNodesChangeMiddlewareMap:E}=Q();for(let[V,S]of L){let B=w.get(V),D=!!(B?.expandParent&&B?.parentId&&S?.position),X={id:V,type:"position",position:D?{x:Math.max(0,S.position.x),y:Math.max(0,S.position.y)}:S.position,dragging:U};if(B&&Z.inProgress&&Z.fromNode.id===B.id){let O=b0(B,Z.fromHandle,Ku.Left,!0);H({...Z,from:O})}if(D&&B.parentId)q.push({id:V,parentId:B.parentId,rect:{...S.internals.positionAbsolute,width:S.measured.width??0,height:S.measured.height??0}});N.push(X)}if(q.length>0){let{parentLookup:V,nodeOrigin:S}=Q(),B=_A(q,w,V,S);N.push(...B)}for(let V of E.values())N=V(N);G(N)},triggerNodeChanges:(L)=>{let{onNodesChange:U,setNodes:q,nodes:N,hasDefaultNodes:w,debug:G}=Q();if(L?.length){if(w){let Z=bV(L,N);q(Z)}if(G)console.log("React Flow: trigger node changes",L);U?.(L)}},triggerEdgeChanges:(L)=>{let{onEdgesChange:U,setEdges:q,edges:N,hasDefaultEdges:w,debug:G}=Q();if(L?.length){if(w){let Z=vV(L,N);q(Z)}if(G)console.log("React Flow: trigger edge changes",L);U?.(L)}},addSelectedNodes:(L)=>{let{multiSelectionActive:U,edgeLookup:q,nodeLookup:N,triggerNodeChanges:w,triggerEdgeChanges:G}=Q();if(U){let Z=L.map((H)=>si(H,!0));w(Z);return}w(Wy(N,new Set([...L]),!0)),G(Wy(q))},addSelectedEdges:(L)=>{let{multiSelectionActive:U,edgeLookup:q,nodeLookup:N,triggerNodeChanges:w,triggerEdgeChanges:G}=Q();if(U){let Z=L.map((H)=>si(H,!0));G(Z);return}G(Wy(q,new Set([...L]))),w(Wy(N,new Set,!0))},unselectNodesAndEdges:({nodes:L,edges:U}={})=>{let{edges:q,nodes:N,nodeLookup:w,triggerNodeChanges:G,triggerEdgeChanges:Z}=Q(),H=L?L:N,E=U?U:q,V=[];for(let B of H){if(!B.selected)continue;let D=w.get(B.id);if(D)D.selected=!1;V.push(si(B.id,!1))}let S=[];for(let B of E){if(!B.selected)continue;S.push(si(B.id,!1))}G(V),Z(S)},setMinZoom:(L)=>{let{panZoom:U,maxZoom:q}=Q();U?.setScaleExtent([L,q]),J({minZoom:L})},setMaxZoom:(L)=>{let{panZoom:U,minZoom:q}=Q();U?.setScaleExtent([q,L]),J({maxZoom:L})},setTranslateExtent:(L)=>{Q().panZoom?.setTranslateExtent(L),J({translateExtent:L})},resetSelectedElements:()=>{let{edges:L,nodes:U,triggerNodeChanges:q,triggerEdgeChanges:N,elementsSelectable:w}=Q();if(!w)return;let G=U.reduce((H,E)=>E.selected?[...H,si(E.id,!1)]:H,[]),Z=L.reduce((H,E)=>E.selected?[...H,si(E.id,!1)]:H,[]);q(G),N(Z)},setNodeExtent:(L)=>{let{nodes:U,nodeLookup:q,parentLookup:N,nodeOrigin:w,elevateNodesOnSelect:G,nodeExtent:Z,zIndexMode:H}=Q();if(L[0][0]===Z[0][0]&&L[0][1]===Z[0][1]&&L[1][0]===Z[1][0]&&L[1][1]===Z[1][1])return;cA(U,q,N,{nodeOrigin:w,nodeExtent:L,elevateNodesOnSelect:G,checkEquality:!1,zIndexMode:H}),J({nodeExtent:L})},panBy:(L)=>{let{transform:U,width:q,height:N,panZoom:w,translateExtent:G}=Q();return Rq({delta:L,panZoom:w,transform:U,translateExtent:G,width:q,height:N})},setCenter:async(L,U,q)=>{let{width:N,height:w,maxZoom:G,panZoom:Z}=Q();if(!Z)return Promise.resolve(!1);let H=typeof q?.zoom<"u"?q.zoom:G;return await Z.setViewport({x:N/2-L*H,y:w/2-U*H,zoom:H},{duration:q?.duration,ease:q?.ease,interpolate:q?.interpolate}),Promise.resolve(!0)},cancelConnection:()=>{J({connection:{...l9}})},updateConnection:(L)=>{J({connection:L})},reset:()=>J({...Xw()})}},Object.is);function tp({initialNodes:u,initialEdges:l,defaultNodes:f,defaultEdges:r,initialWidth:n,initialHeight:i,initialMinZoom:t,initialMaxZoom:y,initialFitViewOptions:c,fitView:$,nodeOrigin:A,nodeExtent:j,zIndexMode:F,children:J}){let[Q]=tu.useState(()=>ip({nodes:u,edges:l,defaultNodes:f,defaultEdges:r,width:n,height:i,fitView:$,minZoom:t,maxZoom:y,fitViewOptions:c,nodeOrigin:A,nodeExtent:j,zIndexMode:F}));return ru.jsx(GV,{value:Q,children:ru.jsx(gV,{children:J})})}function yp({children:u,nodes:l,edges:f,defaultNodes:r,defaultEdges:n,width:i,height:t,fitView:y,fitViewOptions:c,minZoom:$,maxZoom:A,nodeOrigin:j,nodeExtent:F,zIndexMode:J}){if(tu.useContext(QA))return ru.jsx(ru.Fragment,{children:u});return ru.jsx(tp,{initialNodes:l,initialEdges:f,defaultNodes:r,defaultEdges:n,initialWidth:i,initialHeight:t,fitView:y,initialFitViewOptions:c,initialMinZoom:$,initialMaxZoom:A,nodeOrigin:j,nodeExtent:F,zIndexMode:J,children:u})}var cp={width:"100%",height:"100%",overflow:"hidden",position:"relative",zIndex:0};function _p({nodes:u,edges:l,defaultNodes:f,defaultEdges:r,className:n,nodeTypes:i,edgeTypes:t,onNodeClick:y,onEdgeClick:c,onInit:$,onMove:A,onMoveStart:j,onMoveEnd:F,onConnect:J,onConnectStart:Q,onConnectEnd:W,onClickConnectStart:L,onClickConnectEnd:U,onNodeMouseEnter:q,onNodeMouseMove:N,onNodeMouseLeave:w,onNodeContextMenu:G,onNodeDoubleClick:Z,onNodeDragStart:H,onNodeDrag:E,onNodeDragStop:V,onNodesDelete:S,onEdgesDelete:B,onDelete:D,onSelectionChange:X,onSelectionDragStart:O,onSelectionDrag:Y,onSelectionDragStop:p,onSelectionContextMenu:v,onSelectionStart:z,onSelectionEnd:P,onBeforeDelete:k,connectionMode:I,connectionLineType:b=Nn.Bezier,connectionLineStyle:d,connectionLineComponent:g,connectionLineContainerStyle:x,deleteKeyCode:lu="Backspace",selectionKeyCode:cu="Shift",selectionOnDrag:_u=!1,selectionMode:Fu=ki.Full,panActivationKeyCode:zu="Space",multiSelectionKeyCode:Wu=qy()?"Meta":"Control",zoomActivationKeyCode:C=qy()?"Meta":"Control",snapToGrid:e,snapGrid:uu,onlyRenderVisibleElements:Gu=!1,selectNodesOnDrag:s,nodesDraggable:qu,autoPanOnNodeFocus:Zu,nodesConnectable:Bu,nodesFocusable:Iu,nodeOrigin:ll=Mw,edgesFocusable:Pu,edgesReconnectable:Jl,elementsSelectable:Jf=!0,defaultViewport:Of=YV,minZoom:yf=0.5,maxZoom:lf=2,translateExtent:Zf=Fy,preventScrolling:Pf=!0,nodeExtent:Au,defaultMarkerColor:au="#b1b1b7",zoomOnScroll:Qf=!0,zoomOnPinch:Yu=!0,panOnScroll:cf=!1,panOnScrollSpeed:_f=0.5,panOnScrollMode:fr=gn.Free,zoomOnDoubleClick:$f=!0,panOnDrag:Hf=!0,onPaneClick:Gn,onPaneMouseEnter:rr,onPaneMouseMove:dn,onPaneMouseLeave:Ql,onPaneScroll:ei,onPaneContextMenu:fu,paneClickDistance:mu=1,nodeClickDistance:Xu=0,children:ou,onReconnect:$l,onReconnectStart:Rl,onReconnectEnd:_l,onEdgeContextMenu:Nf,onEdgeDoubleClick:Xr,onEdgeMouseEnter:my,onEdgeMouseMove:Zl,onEdgeMouseLeave:ec,reconnectRadius:vA=10,onNodesChange:Tl,onEdgesChange:L7,noDragClassName:sl="nodrag",noWheelClassName:nr="nowheel",noPanClassName:ut="nopan",fitView:Vy,fitViewOptions:lt,connectOnClick:u_,attributionPosition:Dy,proOptions:l_,defaultEdgeOptions:Cf,elevateNodesOnSelect:Yr=!0,elevateEdgesOnSelect:f_=!1,disableKeyboardA11y:ft=!1,autoPanOnConnect:py,autoPanOnNodeDrag:r_,autoPanSpeed:fn,connectionRadius:n_,isValidConnection:Pl,onError:kA,style:i_,id:Wr,nodeDragThreshold:ri,connectionDragThreshold:ni,viewport:rt,onViewportChange:ii,width:Sy,height:T7,colorMode:nt="light",debug:K7,onScroll:Xy,ariaLabelConfig:IA,zIndexMode:t_="basic",...gA},en){let u0=Wr||"1",ti=RV(nt),Mf=tu.useCallback((Yy)=>{Yy.currentTarget.scrollTo({top:0,left:0,behavior:"instant"}),Xy?.(Yy)},[Xy]);return ru.jsx("div",{"data-testid":"rf__wrapper",...gA,onScroll:Mf,style:{...i_,...cp},ref:en,className:Xl(["react-flow",n,ti]),id:Wr,role:"application",children:ru.jsxs(yp,{nodes:u,edges:l,width:Sy,height:T7,fitView:Vy,fitViewOptions:lt,minZoom:yf,maxZoom:lf,nodeOrigin:ll,nodeExtent:Au,zIndexMode:t_,children:[ru.jsx(MV,{nodes:u,edges:l,defaultNodes:f,defaultEdges:r,onConnect:J,onConnectStart:Q,onConnectEnd:W,onClickConnectStart:L,onClickConnectEnd:U,nodesDraggable:qu,autoPanOnNodeFocus:Zu,nodesConnectable:Bu,nodesFocusable:Iu,edgesFocusable:Pu,edgesReconnectable:Jl,elementsSelectable:Jf,elevateNodesOnSelect:Yr,elevateEdgesOnSelect:f_,minZoom:yf,maxZoom:lf,nodeExtent:Au,onNodesChange:Tl,onEdgesChange:L7,snapToGrid:e,snapGrid:uu,connectionMode:I,translateExtent:Zf,connectOnClick:u_,defaultEdgeOptions:Cf,fitView:Vy,fitViewOptions:lt,onNodesDelete:S,onEdgesDelete:B,onDelete:D,onNodeDragStart:H,onNodeDrag:E,onNodeDragStop:V,onSelectionDrag:Y,onSelectionDragStart:O,onSelectionDragStop:p,onMove:A,onMoveStart:j,onMoveEnd:F,noPanClassName:ut,nodeOrigin:ll,rfId:u0,autoPanOnConnect:py,autoPanOnNodeDrag:r_,autoPanSpeed:fn,onError:kA,connectionRadius:n_,isValidConnection:Pl,selectNodesOnDrag:s,nodeDragThreshold:ri,connectionDragThreshold:ni,onBeforeDelete:k,debug:K7,ariaLabelConfig:IA,zIndexMode:t_}),ru.jsx(np,{onInit:$,onNodeClick:y,onEdgeClick:c,onNodeMouseEnter:q,onNodeMouseMove:N,onNodeMouseLeave:w,onNodeContextMenu:G,onNodeDoubleClick:Z,nodeTypes:i,edgeTypes:t,connectionLineType:b,connectionLineStyle:d,connectionLineComponent:g,connectionLineContainerStyle:x,selectionKeyCode:cu,selectionOnDrag:_u,selectionMode:Fu,deleteKeyCode:lu,multiSelectionKeyCode:Wu,panActivationKeyCode:zu,zoomActivationKeyCode:C,onlyRenderVisibleElements:Gu,defaultViewport:Of,translateExtent:Zf,minZoom:yf,maxZoom:lf,preventScrolling:Pf,zoomOnScroll:Qf,zoomOnPinch:Yu,zoomOnDoubleClick:$f,panOnScroll:cf,panOnScrollSpeed:_f,panOnScrollMode:fr,panOnDrag:Hf,onPaneClick:Gn,onPaneMouseEnter:rr,onPaneMouseMove:dn,onPaneMouseLeave:Ql,onPaneScroll:ei,onPaneContextMenu:fu,paneClickDistance:mu,nodeClickDistance:Xu,onSelectionContextMenu:v,onSelectionStart:z,onSelectionEnd:P,onReconnect:$l,onReconnectStart:Rl,onReconnectEnd:_l,onEdgeContextMenu:Nf,onEdgeDoubleClick:Xr,onEdgeMouseEnter:my,onEdgeMouseMove:Zl,onEdgeMouseLeave:ec,reconnectRadius:vA,defaultMarkerColor:au,noDragClassName:sl,noWheelClassName:nr,noPanClassName:ut,rfId:u0,disableKeyboardA11y:ft,nodeExtent:Au,viewport:rt,onViewportChange:ii}),ru.jsx(XV,{onSelectionChange:X}),ou,ru.jsx(mV,{proOptions:l_,position:Dy}),ru.jsx(BV,{rfId:u0,disableKeyboardA11y:ft})]})})}var jW=hw(_p);var yv=Qr.error014();function $p({dimensions:u,lineWidth:l,variant:f,className:r}){return ru.jsx("path",{strokeWidth:l,d:`M${u[0]/2} 0 V${u[1]} M0 ${u[1]/2} H${u[0]}`,className:Xl(["react-flow__background-pattern",f,r])})}function Ap({radius:u,className:l}){return ru.jsx("circle",{cx:u,cy:u,r:u,className:Xl(["react-flow__background-pattern","dots",l])})}var k0;(function(u){u.Lines="lines",u.Dots="dots",u.Cross="cross"})(k0||(k0={}));var jp={[k0.Dots]:1,[k0.Lines]:1,[k0.Cross]:6},Fp=(u)=>({transform:u.transform,patternId:`pattern-${u.rfId}`});function FW({id:u,variant:l=k0.Dots,gap:f=20,size:r,lineWidth:n=1,offset:i=0,color:t,bgColor:y,style:c,className:$,patternClassName:A}){let j=tu.useRef(null),{transform:F,patternId:J}=il(Fp,zl),Q=r||jp[l],W=l===k0.Dots,L=l===k0.Cross,U=Array.isArray(f)?f:[f,f],q=[U[0]*F[2]||1,U[1]*F[2]||1],N=Q*F[2],w=Array.isArray(i)?i:[i,i],G=L?[N,N]:q,Z=[w[0]*F[2]||1+G[0]/2,w[1]*F[2]||1+G[1]/2],H=`${J}${u?u:""}`;return ru.jsxs("svg",{className:Xl(["react-flow__background",$]),style:{...c,...qA,"--xy-background-color-props":y,"--xy-background-pattern-color-props":t},ref:j,"data-testid":"rf__background",children:[ru.jsx("pattern",{id:H,x:F[0]%q[0],y:F[1]%q[1],width:q[0],height:q[1],patternUnits:"userSpaceOnUse",patternTransform:`translate(-${Z[0]},-${Z[1]})`,children:W?ru.jsx(Ap,{radius:N/2,className:A}):ru.jsx($p,{dimensions:G,lineWidth:n,variant:l,className:A})}),ru.jsx("rect",{x:"0",y:"0",width:"100%",height:"100%",fill:`url(#${H})`})]})}FW.displayName="Background";var UW=tu.memo(FW);function Up(){return ru.jsx("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 32 32",children:ru.jsx("path",{d:"M32 18.133H18.133V32h-4.266V18.133H0v-4.266h13.867V0h4.266v13.867H32z"})})}function Jp(){return ru.jsx("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 32 5",children:ru.jsx("path",{d:"M0 0h32v4.2H0z"})})}function Qp(){return ru.jsx("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 32 30",children:ru.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 Np(){return ru.jsx("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 25 32",children:ru.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 qp(){return ru.jsx("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 25 32",children:ru.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 UA({children:u,className:l,...f}){return ru.jsx("button",{type:"button",className:Xl(["react-flow__controls-button",l]),...f,children:u})}var wp=(u)=>({isInteractive:u.nodesDraggable||u.nodesConnectable||u.elementsSelectable,minZoomReached:u.transform[2]<=u.minZoom,maxZoomReached:u.transform[2]>=u.maxZoom,ariaLabelConfig:u.ariaLabelConfig});function JW({style:u,showZoom:l=!0,showFitView:f=!0,showInteractive:r=!0,fitViewOptions:n,onZoomIn:i,onZoomOut:t,onFitView:y,onInteractiveChange:c,className:$,children:A,position:j="bottom-left",orientation:F="vertical","aria-label":J}){let Q=Ol(),{isInteractive:W,minZoomReached:L,maxZoomReached:U,ariaLabelConfig:q}=il(wp,zl),{zoomIn:N,zoomOut:w,fitView:G}=H9(),Z=()=>{N(),i?.()},H=()=>{w(),t?.()},E=()=>{G(n),y?.()},V=()=>{Q.setState({nodesDraggable:!W,nodesConnectable:!W,elementsSelectable:!W}),c?.(!W)};return ru.jsxs(NA,{className:Xl(["react-flow__controls",F==="horizontal"?"horizontal":"vertical",$]),position:j,style:u,"data-testid":"rf__controls","aria-label":J??q["controls.ariaLabel"],children:[l&&ru.jsxs(ru.Fragment,{children:[ru.jsx(UA,{onClick:Z,className:"react-flow__controls-zoomin",title:q["controls.zoomIn.ariaLabel"],"aria-label":q["controls.zoomIn.ariaLabel"],disabled:U,children:ru.jsx(Up,{})}),ru.jsx(UA,{onClick:H,className:"react-flow__controls-zoomout",title:q["controls.zoomOut.ariaLabel"],"aria-label":q["controls.zoomOut.ariaLabel"],disabled:L,children:ru.jsx(Jp,{})})]}),f&&ru.jsx(UA,{className:"react-flow__controls-fitview",onClick:E,title:q["controls.fitView.ariaLabel"],"aria-label":q["controls.fitView.ariaLabel"],children:ru.jsx(Qp,{})}),r&&ru.jsx(UA,{className:"react-flow__controls-interactive",onClick:V,title:q["controls.interactive.ariaLabel"],"aria-label":q["controls.interactive.ariaLabel"],children:W?ru.jsx(qp,{}):ru.jsx(Np,{})}),A]})}JW.displayName="Controls";var QW=tu.memo(JW);function Wp({id:u,x:l,y:f,width:r,height:n,style:i,color:t,strokeColor:y,strokeWidth:c,className:$,borderRadius:A,shapeRendering:j,selected:F,onClick:J}){let{background:Q,backgroundColor:W}=i||{},L=t||Q||W;return ru.jsx("rect",{className:Xl(["react-flow__minimap-node",{selected:F},$]),x:l,y:f,rx:A,ry:A,width:r,height:n,style:{fill:L,stroke:y,strokeWidth:c},shapeRendering:j,onClick:J?(U)=>J(U,u):void 0})}var Lp=tu.memo(Wp),Tp=(u)=>u.nodes.map((l)=>l.id),E9=(u)=>u instanceof Function?u:()=>u;function Kp({nodeStrokeColor:u,nodeColor:l,nodeClassName:f="",nodeBorderRadius:r=5,nodeStrokeWidth:n,nodeComponent:i=Lp,onClick:t}){let y=il(Tp,zl),c=E9(l),$=E9(u),A=E9(f),j=typeof window>"u"||!!window.chrome?"crispEdges":"geometricPrecision";return ru.jsx(ru.Fragment,{children:y.map((F)=>ru.jsx(zp,{id:F,nodeColorFunc:c,nodeStrokeColorFunc:$,nodeClassNameFunc:A,nodeBorderRadius:r,nodeStrokeWidth:n,NodeComponent:i,onClick:t,shapeRendering:j},F))})}function Gp({id:u,nodeColorFunc:l,nodeStrokeColorFunc:f,nodeClassNameFunc:r,nodeBorderRadius:n,nodeStrokeWidth:i,shapeRendering:t,NodeComponent:y,onClick:c}){let{node:$,x:A,y:j,width:F,height:J}=il((Q)=>{let W=Q.nodeLookup.get(u);if(!W)return{node:void 0,x:0,y:0,width:0,height:0};let L=W.internals.userNode,{x:U,y:q}=W.internals.positionAbsolute,{width:N,height:w}=qn(L);return{node:L,x:U,y:q,width:N,height:w}},zl);if(!$||$.hidden||!$9($))return null;return ru.jsx(y,{x:A,y:j,width:F,height:J,style:$.style,selected:!!$.selected,className:r($),color:l($),borderRadius:n,strokeColor:f($),strokeWidth:i,shapeRendering:t,onClick:c,id:$.id})}var zp=tu.memo(Gp),Ep=tu.memo(Kp),Op=200,Zp=150,Hp=(u)=>!u.hidden,Bp=(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?y9(Uy(u.nodeLookup,{filter:Hp}),l):l,rfId:u.rfId,panZoom:u.panZoom,translateExtent:u.translateExtent,flowWidth:u.width,flowHeight:u.height,ariaLabelConfig:u.ariaLabelConfig}},mp="react-flow__minimap-desc";function NW({style:u,className:l,nodeStrokeColor:f,nodeColor:r,nodeClassName:n="",nodeBorderRadius:i=5,nodeStrokeWidth:t,nodeComponent:y,bgColor:c,maskColor:$,maskStrokeColor:A,maskStrokeWidth:j,position:F="bottom-right",onClick:J,onNodeClick:Q,pannable:W=!1,zoomable:L=!1,ariaLabel:U,inversePan:q,zoomStep:N=1,offsetScale:w=5}){let G=Ol(),Z=tu.useRef(null),{boundingRect:H,viewBB:E,rfId:V,panZoom:S,translateExtent:B,flowWidth:D,flowHeight:X,ariaLabelConfig:O}=il(Bp,zl),Y=u?.width??Op,p=u?.height??Zp,v=H.width/Y,z=H.height/p,P=Math.max(v,z),k=P*Y,I=P*p,b=w*P,d=H.x-(k-H.width)/2-b,g=H.y-(I-H.height)/2-b,x=k+b*2,lu=I+b*2,cu=`${mp}-${V}`,_u=tu.useRef(0),Fu=tu.useRef();_u.current=P,tu.useEffect(()=>{if(Z.current&&S)return Fu.current=gq({domNode:Z.current,panZoom:S,getTransform:()=>G.getState().transform,getViewScale:()=>_u.current}),()=>{Fu.current?.destroy()}},[S]),tu.useEffect(()=>{Fu.current?.update({translateExtent:B,width:D,height:X,inversePan:q,pannable:W,zoomStep:N,zoomable:L})},[W,L,q,N,B,D,X]);let zu=J?(e)=>{let[uu,Gu]=Fu.current?.pointer(e)||[0,0];J(e,{x:uu,y:Gu})}:void 0,Wu=Q?tu.useCallback((e,uu)=>{let Gu=G.getState().nodeLookup.get(uu).internals.userNode;Q(e,Gu)},[]):void 0,C=U??O["minimap.ariaLabel"];return ru.jsx(NA,{position:F,style:{...u,"--xy-minimap-background-color-props":typeof c==="string"?c:void 0,"--xy-minimap-mask-background-color-props":typeof $==="string"?$:void 0,"--xy-minimap-mask-stroke-color-props":typeof A==="string"?A:void 0,"--xy-minimap-mask-stroke-width-props":typeof j==="number"?j*P:void 0,"--xy-minimap-node-background-color-props":typeof r==="string"?r:void 0,"--xy-minimap-node-stroke-color-props":typeof f==="string"?f:void 0,"--xy-minimap-node-stroke-width-props":typeof t==="number"?t:void 0},className:Xl(["react-flow__minimap",l]),"data-testid":"rf__minimap",children:ru.jsxs("svg",{width:Y,height:p,viewBox:`${d} ${g} ${x} ${lu}`,className:"react-flow__minimap-svg",role:"img","aria-labelledby":cu,ref:Z,onClick:zu,children:[C&&ru.jsx("title",{id:cu,children:C}),ru.jsx(Ep,{onClick:Wu,nodeColor:r,nodeStrokeColor:f,nodeBorderRadius:i,nodeClassName:n,nodeStrokeWidth:t,nodeComponent:y}),ru.jsx("path",{className:"react-flow__minimap-mask",d:`M${d-b},${g-b}h${x+b*2}v${lu+b*2}h${-x-b*2}z + M${E.x},${E.y}h${E.width}v${E.height}h${-E.width}z`,fillRule:"evenodd",pointerEvents:"none"})]})})}NW.displayName="MiniMap";var cv=tu.memo(NW),Vp=(u)=>(l)=>u?`${Math.max(1/l.transform[2],1)}`:void 0,Dp={[v0.Line]:"right",[v0.Handle]:"bottom-right"};function pp({nodeId:u,position:l,variant:f=v0.Handle,className:r,style:n=void 0,children:i,color:t,minWidth:y=10,minHeight:c=10,maxWidth:$=Number.MAX_VALUE,maxHeight:A=Number.MAX_VALUE,keepAspectRatio:j=!1,resizeDirection:F,autoScale:J=!0,shouldResize:Q,onResizeStart:W,onResize:L,onResizeEnd:U}){let q=kw(),N=typeof u==="string"?u:q,w=Ol(),G=tu.useRef(null),Z=f===v0.Handle,H=il(tu.useCallback(Vp(Z&&J),[Z,J]),zl),E=tu.useRef(null),V=l??Dp[f];tu.useEffect(()=>{if(!G.current||!N)return;if(!E.current)E.current=eq({domNode:G.current,nodeId:N,getStoreItems:()=>{let{nodeLookup:B,transform:D,snapGrid:X,snapToGrid:O,nodeOrigin:Y,domNode:p}=w.getState();return{nodeLookup:B,transform:D,snapGrid:X,snapToGrid:O,nodeOrigin:Y,paneDomNode:p}},onChange:(B,D)=>{let{triggerNodeChanges:X,nodeLookup:O,parentLookup:Y,nodeOrigin:p}=w.getState(),v=[],z={x:B.x,y:B.y},P=O.get(N);if(P&&P.expandParent&&P.parentId){let k=P.origin??p,I=B.width??P.measured.width??0,b=B.height??P.measured.height??0,d={id:P.id,parentId:P.parentId,rect:{width:I,height:b,...A9({x:B.x??P.position.x,y:B.y??P.position.y},{width:I,height:b},P.parentId,O,k)}},g=_A([d],O,Y,p);v.push(...g),z.x=B.x?Math.max(k[0]*I,B.x):void 0,z.y=B.y?Math.max(k[1]*b,B.y):void 0}if(z.x!==void 0&&z.y!==void 0){let k={id:N,type:"position",position:{...z}};v.push(k)}if(B.width!==void 0&&B.height!==void 0){let I={id:N,type:"dimensions",resizing:!0,setAttributes:!F?!0:F==="horizontal"?"width":"height",dimensions:{width:B.width,height:B.height}};v.push(I)}for(let k of D){let I={...k,type:"position"};v.push(I)}X(v)},onEnd:({width:B,height:D})=>{let X={id:N,type:"dimensions",resizing:!1,dimensions:{width:B,height:D}};w.getState().triggerNodeChanges([X])}});return E.current.update({controlPosition:V,boundaries:{minWidth:y,minHeight:c,maxWidth:$,maxHeight:A},keepAspectRatio:j,resizeDirection:F,onResizeStart:W,onResize:L,onResizeEnd:U,shouldResize:Q}),()=>{E.current?.destroy()}},[V,y,c,$,A,j,W,L,U,Q]);let S=V.split("-");return ru.jsx("div",{className:Xl(["react-flow__resize-control","nodrag",...S,f,r]),ref:G,style:{...n,scale:H,...t&&{[Z?"backgroundColor":"borderColor"]:t}},children:i})}var _v=tu.memo(pp);var K=a0.default.createElement,{useEffect:Ln}=a0.default,df=a0.default.useState,s0=a0.default.useRef,hc=[{id:"in-left",side:"left",position:Ku.Left,style:{top:"50%"}},{id:"in-top-left",side:"top",slot:"left",slotIndex:-1,position:Ku.Top,style:{left:"28%"}},{id:"in-top-mid",side:"top",slot:"mid",slotIndex:0,position:Ku.Top,style:{left:"50%"}},{id:"in-top-right",side:"top",slot:"right",slotIndex:1,position:Ku.Top,style:{left:"72%"}},{id:"in-bottom-left",side:"bottom",slot:"left",slotIndex:-1,position:Ku.Bottom,style:{left:"28%"}},{id:"in-bottom-mid",side:"bottom",slot:"mid",slotIndex:0,position:Ku.Bottom,style:{left:"50%"}},{id:"in-bottom-right",side:"bottom",slot:"right",slotIndex:1,position:Ku.Bottom,style:{left:"72%"}}],Cc=[{id:"out-right",position:Ku.Right,style:{top:"50%"}}],qW=["#4eb7a8","#d7a13a","#69aee8","#e0835f","#b7d86b","#d98bd2","#5fc6bf"],Ky=236,Gy=88,wW=15000,Sp=10,m9=96,wn=72,V9=64,WW=12;function wA(){return typeof document>"u"||document.visibilityState!=="hidden"}function LW(u,l){let f=Number.parseFloat(String(u||""));return Number.isFinite(f)?f/100:l}function Xp(u,l,f){let r=String(u.side||"");if(r!=="top"&&r!=="bottom")return 0;let n=Number(u.slotIndex||0),i=r==="top"?"in-top-mid":"in-bottom-mid",t=l.get(u.id)||0,y=l.get(i)||0;if(n===0)return y===0?-26:28+t*74;let c=f===0?Math.abs(n)*2:Math.sign(f)===Math.sign(n)?-3:3;if(y>0&&t===0)return-14+c;return 8+t*74+c}function WA(u){let l=u.filter((i,t)=>{let y=u[t-1];return!y||Math.abs(y.x-i.x)>0.5||Math.abs(y.y-i.y)>0.5});if(l.length<2)return"";let f=`M ${l[0].x},${l[0].y}`,r=l[0];for(let i=1;i0.5||Math.abs(F.y-r.y)>0.5)f+=` L ${F.x},${F.y}`;f+=` Q ${y.x},${y.y} ${J.x},${J.y}`,r=J}let n=l[l.length-1];return`${f} L ${n.x},${n.y}`}function CW(u,l,f,r,n,i,t=""){let y=f>=u,c=Math.max(1,Math.abs(f-u)),$=Math.abs(r-l),A=Math.max(34,Math.min(118,c*0.26)),j=Math.min(280,Math.abs(i));if(y&&n===Ku.Left&&j<4&&$<28&&c<420)return`M ${u},${l} C ${u+A},${l} ${f-A},${r} ${f},${r}`;if(y&&n===Ku.Left&&(t==="direct-forward-left"||c<=260&&$<=210)){let U=Math.max(42,Math.min(140,c*0.48)),q=Math.max(-28,Math.min(28,i*0.18));return`M ${u},${l} C ${u+U},${l+q} ${f-U},${r} ${f},${r}`}if(y){let U=u+A;if(n===Ku.Top||n===Ku.Bottom){let w=n===Ku.Top?-1:1,G=r+w*(54+j*0.42);return WA([{x:u,y:l},{x:U,y:l},{x:U+Math.min(120,c*0.18),y:G},{x:f,y:G},{x:f,y:r+w*34},{x:f,y:r}])}let q=f-A,N=(l+r)/2+i;return WA([{x:u,y:l},{x:U,y:l},{x:U+Math.min(110,c*0.16),y:N},{x:q-Math.min(90,c*0.12),y:N},{x:q,y:r},{x:f,y:r}])}let Q=n===Ku.Bottom?1:n===Ku.Top?-1:i>=0?1:-1,W=Math.max(u,f)+92+Math.min(180,j*0.52),L=Q<0?Math.min(l,r)-84-j*0.62:Math.max(l,r)+84+j*0.62;if(n===Ku.Top||n===Ku.Bottom)return WA([{x:u,y:l},{x:u+A,y:l},{x:W,y:L},{x:f,y:L},{x:f,y:r+Q*38},{x:f,y:r}]);return WA([{x:u,y:l},{x:u+A,y:l},{x:W,y:L},{x:f-A,y:L},{x:f-A,y:r},{x:f,y:r}])}function Yp({data:u}){return K("div",{className:"pipeline-flow-node-body"},hc.map((l)=>K(ai,{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})),Cc.map((l)=>K(ai,{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 Pp({id:u,sourceX:l,sourceY:f,targetX:r,targetY:n,targetPosition:i,markerEnd:t,markerStart:y,style:c,data:$}){let A=Number($?.laneOffset||0),j=CW(l,f,r,n,i,A,String($?.routeMode||""));return K(Ly,{id:u,path:j,markerEnd:t,markerStart:y,style:c,interactionWidth:28})}var Cp={pipelineCurve:Pp},Mp={pipelineNode:Yp};function GA(u){if(!u)return"--";let l=new Date(u);if(Number.isNaN(l.getTime()))return"--";return yl(l)}function Dr(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 D9(u){let l=Number(u);if(!Number.isFinite(l))return"--";return l.toLocaleString("zh-CN")}function TW(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 Du(u){return Array.isArray(u)?u:[]}function su(u){if(!u)return null;let l=new Date(u);return Number.isNaN(l.getTime())?null:l.getTime()}function xc(u){return Number.isFinite(Number(u))?new Date(Number(u)).toISOString():""}function kc(...u){for(let l of u){let f=su(l);if(f!==null)return new Date(f).toISOString()}return""}function g9(...u){let l=u.map(su).filter((f)=>f!==null);return l.length>0?new Date(Math.max(...l)).toISOString():""}function s9(u){return["succeeded","failed","skipped","cancelled","canceled","completed"].includes(String(u||"").toLowerCase())}function MW(u){let l=xW(u).toLowerCase();return["running","active","in-progress","in_progress"].includes(l)}function KW(u,l="status"){return u.reduce((f,r)=>{let n=String(r?.[l]||"unknown").toLowerCase();return f[n]=(f[n]||0)+1,f},{})}function RW(u){if(!u||typeof u!=="string")return null;try{let l=JSON.parse(u);return pu(l)?l:null}catch{return null}}function p9(u){let l=u.map(RW).filter((i)=>Boolean(i)),f=l.flatMap((i)=>[i.timestamp,i.createdAt,i.updatedAt]).filter(Boolean),r=g9(...f),n=Array.from(new Set(l.map((i)=>String(i.event||i.action||i.type||"")).filter(Boolean))).slice(0,3);return{total:u.length,parsed:l.length,lastAt:r,eventKinds:n}}function zA(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 hW(u,l=280){if(u===null||u===void 0)return"";let r=(typeof u==="string"?u:String(u)).replace(/\r\n/gu,` +`).trim();return r.length>l?`${r.slice(0,Math.max(0,l-1))}...`:r}function xW(u){if(typeof u==="string")return u;if(pu(u))return String(u.status||u.state||u.phase||"unknown");return"unknown"}function Rp(u){return u.filter((l)=>l&&l.value!==void 0&&l.value!==null&&String(l.value)!=="")}function M9({items:u}){let l=Rp(Du(u));return K("div",{className:"pipeline-kv-grid"},l.map((f)=>K("span",{key:f.label},K("b",null,f.label),K("span",null,f.value))))}function a9({items:u}){let l=Du(u).map((f)=>String(f||"")).filter(Boolean);if(l.length===0)return null;return K("div",{className:"pipeline-chip-row"},l.map((f,r)=>K("span",{key:`${r}-${f}`},f)))}function R9(u,l){let f=String(l?.procedureRunId||""),r=Du(u?.procedureRuns);return r.find((n)=>String(pr(n))===f)||r.at(-1)||null}function hp(u,l){let f=String(l||"");if(!f)return null;return Du(u?.procedureRuns).find((r)=>pr(r)===f)||null}function S9(u){return Du(u?.attempts).length}function GW(u){return Du(u?.attempts).reduce((l,f)=>l+VA(f).length,0)}function VA(u){return Du(u?.opencodeMessages?.steps).filter(pu)}function bW(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 xp(u,l){let f=x9(u.map((i)=>i?.agent)).slice(0,3),r=x9(u.map((i)=>i?.model)).slice(0,3),n=l.length<=2?l.map((i)=>`session ${i}`):[`sessions ${l.length}`,...l.slice(0,2).map((i)=>`session ${i}`)];return[...f.map((i)=>`agent ${i}`),...r.map((i)=>`model ${i}`),...n]}function Mc(u,l=0){return String(u?.messageId||u?.index||"")||`step-${l}`}function bp({steps:u,sessionIds:l,sessionFacts:f,matchedStepKey:r}){let n=Du(u),i=n.findIndex((L,U)=>Mc(L,U)===r),t=i>=0?n[i]:null,y=n.flatMap((L)=>[su(L?.createdAt),su(L?.completedAt)]).filter((L)=>L!==null),c=y.length>0?Math.min(...y):null,$=y.length>0?Math.max(...y):null,A=c!==null&&$!==null?Math.max(0,$-c):null,j=n.reduce((L,U)=>L+Du(U?.parts).filter((q)=>String(q?.type||"").toLowerCase()==="tool").length,0),F=n.reduce((L,U)=>L+Du(U?.parts).filter((q)=>["text","reasoning"].includes(String(q?.type||"").toLowerCase())).length,0),J=n.reduce((L,U)=>L+Du(U?.parts).filter((q)=>String(q?.type||"").toLowerCase()==="tool"&&bW(q)==="failed").length,0),Q=[`${n.length} steps`,`${l.length} sessions`,`${F} messages`,`${j} tools`,A!==null?`duration ${Dr(A)}`:"",J>0?`${J} failed tools`:""].filter(Boolean),W=t?[`Step ${t?.index??i+1}`,String(t?.role||"role --"),t?.model?`model ${t.model}`:"",t?.finish?`finish ${t.finish}`:"",t?.durationMs!==void 0&&t?.durationMs!==null?`duration ${Dr(t.durationMs)}`:""].filter(Boolean):[];return K("section",{className:"pipeline-trace-timeline","data-testid":"pipeline-step-timeline"},K("div",{className:"pipeline-trace-head"},K("div",null,K("b",null,"OpenCode Trace"),K("span",null,"Trace 使用 Code Queue 统一样式展示完整 agent loop;Pipeline 旧 step/message/tool 卡片样式已废弃。")),K("div",{className:"pipeline-trace-session-head","data-testid":"pipeline-step-timeline-session"},K("span",null,Q.join(" / ")||"Trace"),f.length>0?K(a9,{items:f}):null)),t?K("div",{className:"pipeline-trace-focus","data-testid":"pipeline-trace-matched-step"},K("span",{className:"codex-output-channel"},"Matched"),K("strong",null,`Gantt selection -> ${W.join(" / ")}`),K("time",null,`${GA(t?.createdAt)} -> ${GA(t?.completedAt)}`)):null,K(x$,{port:iQ,input:n,className:"codex-transcript pipeline-trace",testId:"pipeline-opencode-step-trace",emptyText:"暂无 OpenCode Trace 输出",keepRecentToolCalls:3}))}function h9(u){return Du(u).flatMap((l)=>{if(pu(l))return[l];let f=RW(l);return f?[f]:[]})}function un(u){return String(u?.event||u?.action||u?.requestedAction||u?.type||"").toLowerCase()}function Ty(u){return kc(u?.timestamp,u?.createdAt,u?.updatedAt,u?.startedAt,u?.finishedAt)}function vp(u){return su(Ty(u))}function DA(u){return String(u?.attempt||u?.id||"")}function x9(u){let l=new Set,f=[];for(let r of u){let n=String(r||"");if(!n||l.has(n))continue;l.add(n),f.push(n)}return f}function zW(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 oi(u){return String(u?.requestedAction||u?.action||"").toLowerCase()}function Rc(u){switch(oi(u)){case"guide":return"引导";case"modify":return"修改";case"approve":return"审核通过";case"restart":return"重启";case"redo":return"重做";default:return String(u?.requestedAction||u?.action||"控制")}}function EW(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`${Rc(u)} 已发起`;case"control-command-applied":return`${Rc(u)} 已生效`;case"control-command-ignored":return`${Rc(u)} 已忽略`;default:return String(u?.event||u?.action||u?.requestedAction||"event")}}function OW(u){return hW(u?.promptPreview||u?.reasonPreview||u?.prompt||u?.reason||"",240)}function kp(u){let l=String(u?.prompt||""),f=String(u?.reason||u?.restartReason||""),r=l?"":String(u?.promptPreview||""),n=f?"":String(u?.reasonPreview||"");return[l||r?{label:l?"prompt":"prompt preview",value:l||r}:null,f||n?{label:f?"reason":"reason preview",value:f||n}:null,Du(u?.resetNodeIds).length>0?{label:"reset nodes",value:Du(u.resetNodeIds).join(", ")}:null,Du(u?.runningResetNodeIds).length>0?{label:"interrupted running nodes",value:Du(u.runningResetNodeIds).join(", ")}:null,Du(u?.interruptedProcedureRunIds).length>0?{label:"interrupted procedures",value:Du(u.interruptedProcedureRunIds).join(", ")}:null,u?.interruptedProcedureRunId?{label:"interrupted procedure",value:String(u.interruptedProcedureRunId)}:null].filter(Boolean)}function X9(u){let l=VA(u),f=l.map((c)=>su(c?.createdAt)).filter((c)=>c!==null),r=l.map((c)=>su(c?.completedAt)??su(c?.createdAt)).filter((c)=>c!==null),n=h9(u?.controlEventRecords).map((c)=>vp(c)).filter((c)=>c!==null),i=Du(u?.assistantOutputs).map((c)=>su(c?.updatedAt)).filter((c)=>c!==null),t=f[0]??n[0]??i[0]??null,y=r.at(-1)??n.at(-1)??i.at(-1)??t;return{startMs:t,endMs:y}}function Ip(u,l,f,r,n=""){let i=Du(u?.procedureRuns).filter((y)=>pA(y,l)===f);if(i.length===0)return null;if(n){let y=i.find((c)=>pr(c)===n);if(y)return y}if(r===null)return i.at(-1)||null;let t=i.find((y)=>{let c=su(LA(y,u)),$=su(TA(y,u))??c;return c!==null&&$!==null&&r>=c-1000&&r<=$+1000});if(t)return t;return i.slice().sort((y,c)=>{let $=su(LA(y,u))??r,A=su(TA(y,u))??$,j=su(LA(c,u))??r,F=su(TA(c,u))??j,J=Math.min(Math.abs($-r),Math.abs(A-r)),Q=Math.min(Math.abs(j-r),Math.abs(F-r));return J-Q})[0]||null}function vW(u,l){let f=Du(u?.attempts).filter(pu);if(f.length===0)return null;let r=String(l?.attempt||"");if(r){let t=f.find((y)=>DA(y)===r);if(t)return t}let n=Number.isFinite(Number(l?.ms))?Number(l.ms):null;if(n===null)return f.at(-1)||null;let i=f.find((t)=>{let y=X9(t);return Number.isFinite(y.startMs)&&Number.isFinite(y.endMs)&&n>=Number(y.startMs)-1000&&n<=Number(y.endMs)+1000});if(i)return i;return f.slice().sort((t,y)=>{let c=X9(t),$=X9(y),A=Math.min(Math.abs(Number(c.startMs??n)-n),Math.abs(Number(c.endMs??n)-n)),j=Math.min(Math.abs(Number($.startMs??n)-n),Math.abs(Number($.endMs??n)-n));return A-j})[0]||f.at(-1)||null}function kW(u,l){let f=VA(u);if(f.length===0)return{step:null,stepIndex:-1,stepKey:""};if(l===null){let i=f[0];return{step:i,stepIndex:0,stepKey:Mc(i,0)}}for(let i=0;i=y-1000&&l<=c+1000)return{step:t,stepIndex:i,stepKey:Mc(t,i)}}let r=f.findIndex((i)=>{let t=su(i?.createdAt)??su(i?.completedAt);return t!==null&&t>=l});if(r>=0){let i=f[r];return{step:i,stepIndex:r,stepKey:Mc(i,r)}}let n=Math.max(0,f.length-1);return{step:f[n],stepIndex:n,stepKey:Mc(f[n],n)}}function gp(u,l){let f=String(l?.runId||u?.runId||"");if(String(l?.mode||"")==="interval"){let $=l?.interval||{},A=R9(u,$)||$.raw||{};return{mode:"interval",runId:f,interval:$,marker:null,nodeId:String($?.nodeId||pA(A,f)||""),procedure:A,attempt:null,matchedStep:null,matchedStepIndex:-1,matchedStepKey:""}}let r=pu(l?.marker)?l.marker:{},n=Number.isFinite(Number(r?.ms))?Number(r.ms):null,i=String(r?.nodeId||""),t=i?Ip(u,f,i,n,String(r?.procedureRunId||"")):null,y=t?vW(t,r):null,c=y?kW(y,n):{step:null,stepIndex:-1,stepKey:""};return{mode:"event",runId:f,interval:null,marker:r,nodeId:i,procedure:t,attempt:y,matchedStep:c.step,matchedStepIndex:c.stepIndex,matchedStepKey:c.stepKey}}function sp({procedure:u,matchedStepKey:l="",matchedAttemptId:f=""}){let r=Du(u?.attempts);if(r.length===0)return K(qr,{title:"暂无 attempt 详情",text:"当前 procedure 还没有可展示的 attempt / OpenCode Trace;若刚点击甘特线,请等待 node 详情抓取完成。"});return r.map((n,i)=>{let t=n?.opencodeMessages||{},y=VA(n),c=Du(t.sessionIds).map((F)=>String(F)).filter(Boolean),$=xp(y,c),A=DA(n)||`attempt-${i+1}`,j=y.reduce((F,J)=>F+Du(J?.parts).filter((Q)=>String(Q?.type||"").toLowerCase()==="tool"&&bW(Q)==="failed").length,0);return K("article",{key:A,className:`pipeline-attempt-card ${f===A?"matched":""}`},K("div",{className:"pipeline-attempt-head"},K("div",null,K("strong",null,A),K("span",null,t.source||"opencode")),K("div",{className:"pipeline-attempt-badges"},K("span",null,`${y.length} steps`),K("span",null,`${t.toolCallCount??"--"} tools`),j>0?K("span",{className:"danger"},`${j} failed`):null)),K(M9,{items:[{label:"messages",value:t.messageCount??"--"},{label:"steps",value:t.stepCount??"--"},{label:"tools",value:t.toolCallCount??"--"},{label:"updated",value:wu(t.updatedAt)},{label:"sessions",value:c.join(", ")||"--"}]}),y.length===0?K("p",{className:"muted paragraph"},"当前 attempt 尚未返回 OpenCode Trace;请确认 D601 pipeline-control 已重建并重新抓取。"):K(bp,{steps:y,sessionIds:c,sessionFacts:$,matchedStepKey:l}))})}function Y9(u,l){return`${u}::${l}`}function EA(u,l,f){if(!pu(u))return null;return String(u.runId||"")===l&&String(u.nodeId||"")===f?u:null}function ap(u,l){let f=pu(u)?u:{};if(!pu(l))return f;let r=Du(l.attempts),n=Du(f.attempts);return{...f,...l,attempts:r.length>0?r:n}}function op(u,l,f,r){if(!EA(l,f,r))return u;let n=Du(l.procedureRuns),i=pu(u)?u:{};return{...i,...l,controlEvents:Du(l.controlEvents).length>0?l.controlEvents:i.controlEvents,procedureRuns:n.length>0?n:i.procedureRuns}}function dp({selection:u,runDetails:l,nodeDetails:f,nodeDetailsState:r,onRaw:n,onCollapse:i}){if(!u?.mode)return K("aside",{className:"pipeline-gantt-detail-panel empty","data-testid":"pipeline-gantt-detail-panel"},K("div",{className:"pipeline-gantt-detail-head"},K("div",null,K("span",{className:"panel-eyebrow"},"Gantt Detail"),K(rl,{title:"未选择元素",level:3})),K("button",{type:"button",className:"ghost-btn mini",onClick:i,"data-testid":"pipeline-gantt-sidebar-collapse"},"收起")),K(qr,{title:"选择一条执行线或一个控制点",text:"点击甘特图中的 node 执行线、prompt 点或控制点,在这里查看结构化过程和 OpenCode step。"}));let t=String(u?.runId||""),y=String(u?.interval?.nodeId||u?.marker?.nodeId||""),c=l?.runId===t?l.details:null,$=EA(f,t,y),A=String(r?.runId||"")===t&&String(r?.nodeId||"")===y,j=op(c,$,t,y),F=(String(l?.runId||"")!==t||Boolean(l?.loading))&&!j,J=String(l?.runId||"")===t?String(l?.error||""):"",Q=A?String(r?.error||""):"",W=j?gp(j,u):null,L=W?.interval||u?.interval||null,U=W?.marker||u?.marker||null,q=String(L?.procedureRunId||U?.procedureRunId||""),N=$?hp($,q)||R9($,L||{procedureRunId:q}):null,w=W?.procedure||(j?R9(j,L||{procedureRunId:q}):null)||L?.raw||{};if(N&&(S9(w)===0||GW(N)>=GW(w)))w=ap(w,N);let G=W?.attempt||null,Z=String(W?.matchedStepKey||"");if(!G&&U&&S9(w)>0)G=vW(w,U),Z=String(kW(G,Number.isFinite(Number(U?.ms))?Number(U.ms):null).stepKey||"");let H=DA(G),E=S9(w)>0,V=A&&Boolean(r?.loading)&&!E,S=Boolean(F||V),B=[E?"":J,Q].filter(Boolean).join(" / "),D=A&&r?.fetchedAt?r.fetchedAt:l?.fetchedAt,X=xW(w?.status||L?.status||U?.status||U?.event),O=u?.mode==="event"?U?.label||EW(U?.raw||U)||"event":W?.nodeId||L?.nodeId||"node",Y=U?kp(U?.raw||U):[],p=U?[un(U?.raw||U)?`event ${un(U?.raw||U)}`:"",U?.promptEvent?`prompt ${U.promptEvent}`:"",U?.action?`action ${U.action}`:"",U?.sourceKind?`source ${zW(U.sourceKind)}`:"",U?.sourceNodeId?`from ${U.sourceNodeId}`:"",U?.targetNodeId?`to ${U.targetNodeId}`:"",U?.snapReason?`draw ${U.snapReason}`:""].filter(Boolean):[];return K("aside",{className:"pipeline-gantt-detail-panel","data-testid":"pipeline-gantt-detail-panel"},K("div",{className:"pipeline-gantt-detail-head"},K("div",null,K("span",{className:"panel-eyebrow"},u?.mode==="event"?"Gantt Event Detail":"Gantt Line Detail"),K(rl,{title:O,level:3,loading:S})),K("div",{className:"pipeline-gantt-detail-head-actions"},K(o0,{status:X},X),K("button",{type:"button",className:"ghost-btn mini",onClick:i,"data-testid":"pipeline-gantt-sidebar-collapse"},"收起"))),U?K("article",{className:"pipeline-event-card"},K("div",{className:"pipeline-event-card-head"},K("strong",null,U?.label||EW(U?.raw||U)),K(a9,{items:p})),K(M9,{items:[{label:"event time",value:wu(U?.timestampIso||U?.timestamp||"--")},U?.snapped?{label:"drawn time",value:wu(U?.renderedTimestampIso||U?.ms)}:null,{label:"node",value:U?.nodeId||"--"},{label:"procedure",value:U?.procedureRunId||pr(w)||"--"},{label:"attempt",value:U?.attempt||H||"--"},{label:"source kind",value:U?.sourceKind?zW(U.sourceKind):"--"},{label:"source node",value:U?.sourceNodeId||"--"},{label:"target node",value:U?.targetNodeId||"--"},{label:"command",value:U?.commandId||U?.eventId||"--"},U?.snapReason?{label:"placement",value:U.snapReason}:null]}),Y.length>0?K("div",{className:"pipeline-event-blocks"},Y.map((v,z)=>K("section",{key:`${v.label}-${z}`,className:"pipeline-event-text-block"},K("b",null,v.label),K("p",null,v.value)))):null,OW(U?.raw||U)?K("p",{className:"pipeline-text-preview"},OW(U?.raw||U)):null):null,K(M9,{items:[{label:"epoch",value:t||L?.runId||"--"},{label:"node",value:W?.nodeId||L?.nodeId||U?.nodeId||"--"},{label:"procedure",value:L?.procedureRunId||U?.procedureRunId||pr(w)||"--"},{label:"started",value:wu(L?.startedAt||w?.startedAt)},{label:"finished",value:wu(L?.finishedAt||w?.finishedAt)},{label:"duration",value:Dr(L?.durationMs||w?.durationMs)},{label:"fetched",value:D?yl(D):"--"},W?.matchedStep?{label:"matched step",value:`Step ${W.matchedStep.index??W.matchedStepIndex+1}`}:null]}),K(nl,{error:B}),K("div",{className:"pipeline-gantt-detail-actions"},K(ln,{title:`Procedure ${L?.procedureRunId||U?.procedureRunId||W?.nodeId||"node"}`,data:w,onOpen:n,testId:"raw-pipeline-gantt-procedure"}),U?K(ln,{title:`Pipeline event ${U?.id||U?.commandId||U?.eventId||W?.nodeId||"event"}`,data:U?.raw||U,onOpen:n,testId:"raw-pipeline-gantt-event"}):null,j?K(ln,{title:`Pipeline run ${t||"--"}`,data:j,onOpen:n,testId:"raw-pipeline-gantt-node-details"}):null),!S&&!pr(w)&&!U?K(qr,{title:"暂无过程详情",text:"当前选择还没有可匹配的 procedure 运行记录。"}):null,!S&&pr(w)?K(sp,{procedure:w,matchedStepKey:Z,matchedAttemptId:H}):null)}function ep({value:u}){let f=String(u||"--").split(/([_-])/u);return K(a0.default.Fragment,null,f.map((r,n)=>r==="-"||r==="_"?K(a0.default.Fragment,{key:n},r,K("wbr",null)):K(a0.default.Fragment,{key:n},r)))}async function I0(u,l={}){return Eu(u,{invalidJsonPrefix:"Pipeline 返回了无效 JSON",...l})}function o0({status:u,children:l}){let f=String(u||"unknown").toLowerCase();return K("span",{className:`status-badge ${f}`},l||u||"unknown")}function Yf({label:u,value:l,hint:f,tone:r}){return K("article",{className:`metric-card ${r||""}`},K("div",{className:"metric-label"},u),K("div",{className:"metric-value"},l),K("div",{className:"metric-hint"},f))}function Wn({title:u,eyebrow:l,actions:f,children:r,className:n,loading:i}){return K("section",{className:`panel ${n||""}`},K("div",{className:"panel-head"},K("div",null,l?K("p",{className:"panel-eyebrow"},l):null,K(rl,{title:u,loading:i})),f?K("div",{className:"panel-actions"},f):null),K("div",{className:"panel-body"},r))}function ln({title:u,data:l,onOpen:f,testId:r}){return K("button",{type:"button",className:"ghost-btn","data-testid":r,onClick:()=>f(u,l)},"查看原始JSON")}function Vr({title:u,subtitle:l,facts:f,data:r,onRaw:n,testId:i}){let t=Du(f).map((y)=>String(y||"")).filter(Boolean);return K("article",{className:"pipeline-evidence-row"},K("div",{className:"pipeline-evidence-main"},K("strong",null,u),l?K("span",null,l):null),K("div",{className:"pipeline-evidence-facts"},t.map((y,c)=>K("span",{key:`${c}-${y.slice(0,16)}`},y))),r!==void 0?K(ln,{title:u,data:r,onOpen:n,testId:i}):null)}function qr({title:u,text:l}){return K("div",{className:"empty-state"},K("strong",null,u),K("span",null,l))}function uS(u){return u?.runtime&&typeof u.runtime==="object"&&!Array.isArray(u.runtime)?u.runtime:{}}function lS(u){return u?.backend&&typeof u.backend==="object"&&!Array.isArray(u.backend)?u.backend:{}}function fS(u){return u?.repository&&typeof u.repository==="object"&&!Array.isArray(u.repository)?u.repository:{}}function rS(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 ZW(u,l,f){let r=u?._unidesk?.arrayLimits?.[l],n=Number(r?.originalLength);return Number.isFinite(n)?n:f}function IW(u){if(!u||typeof u!=="object"||Array.isArray(u))return"--";return`${u.componentClass||"--"}/${u.id||"--"}`}function OA(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 o9(u){return u?.config&&typeof u.config==="object"&&!Array.isArray(u.config)?u.config:{}}function gW(u){let l=o9(u),f=Array.isArray(l.nodes)?l.nodes:Array.isArray(u?.nodes)?u.nodes:[],r=new Map;for(let t of f){let y=String(t?.id||t?.nodeId||"");if(y)r.set(y,{...t,id:y})}let n=d9(u),i=(t)=>{if(t&&!r.has(t))r.set(t,{id:t})};for(let t of e9(u))bc(t).forEach(i);for(let t of n)i(String(t?.from||t?.source||"")),i(String(t?.to||t?.target||""));return Array.from(r.values())}function d9(u){let l=o9(u);return Array.isArray(l.edges)?l.edges:Array.isArray(u?.edges)?u.edges:[]}function e9(u){let l=o9(u);return Array.isArray(l.topologicalBatches)?l.topologicalBatches:Array.isArray(u?.topologicalBatches)?u.topologicalBatches:[]}function nS(u){let l=new Map;for(let f of u){let r=OA(f);if(r)l.set(r,f);let n=Array.isArray(f?.refs)?f.refs:[];for(let i of n){let t=OA(i);if(t)l.set(t,f)}}return l}function HW(u,l){let f=l.get(OA(u?.componentRef));if(f)return f;let r=OA({componentClass:u?.kind,id:u?.id});return r?l.get(r)||null:null}function BW(u,l){let f=sW(u,l);return String(f?.status||"pending")}function sW(u,l){return(Array.isArray(u?.nodes)?u.nodes:[]).find((r)=>r?.nodeId===l||r?.id===l)||null}function iS(u){return u.reduce((l,f)=>{let r=String(f?.status||"unknown").toLowerCase();return l[r]=(l[r]||0)+1,l},{})}function tS(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 yS(u){if(pu(u?.run))return u.run;if(pu(u?.runSummary))return u.runSummary;return null}function cS(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 ZA(u){let l=tS(u),f=l.find((A)=>pu(A?.score))||l[0]||null,r=pu(f?.score)?f.score:{},n=Number(r.passed),i=Number(r.total),t=Number(r.ratio),y=Number.isFinite(t)?t:Number.isFinite(n)&&Number.isFinite(i)&&i>0?n/i:null,c=y===null?null:Math.round(Math.max(0,Math.min(100,y<=1?y*100:y))),$=String(r.text||(Number.isFinite(n)&&Number.isFinite(i)?`${n}/${i}`:""));return{scorer:f,scorers:l,score:r,passed:Number.isFinite(n)?n:null,total:Number.isFinite(i)?i:null,percent:c,text:$}}function b9(u){let l=ZA(u);return l.text||(l.scorers.length>0?String(l.scorer?.status||"pending"):"--")}function u7(u){let l=ZA(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 _S(u){return Array.isArray(u?.items)?u.items.filter(pu):[]}function $S({run:u}){let l=b9(u);return K("span",{className:`pipeline-score-badge ${u7(u)}`},`score ${l}`)}function AS({run:u,onRaw:l}){let r=ZA(u).scorers;if(!u)return K(qr,{title:"暂无评分",text:"选择一个 epoch 后会显示 scorer 结果。"});if(r.length===0)return K("div",{className:"pipeline-score-empty"},K("strong",null,"评分器等待中"),K("span",null,"DAG 完成后,Pipeline control backend 会把 scorer summary 追加到 run artifact,并通过 UniDesk 显示。"));return K("div",{className:"pipeline-score-board","data-testid":"pipeline-score-board"},r.map((n,i)=>{let t=ZA({scorers:[n]}),y=_S(n),c=t.percent??0;return K("article",{key:`${n.scorerId||n.component||i}`,className:`pipeline-score-card ${u7({scorers:[n]})}`},K("div",{className:"pipeline-score-head"},K("div",null,K("span",null,n.scorerId||n.component||"scorer"),K("strong",null,t.text||n.status||"--")),K(o0,{status:n.status||"unknown"},n.status||"unknown")),K("div",{className:"pipeline-score-meter","aria-label":`score ${c}%`},K("span",{style:{width:`${c}%`}})),K("div",{className:"pipeline-score-facts"},K("span",null,`${c}%`),K("span",null,n.component||"--"),K("span",null,n.applicationCheckoutRef||"--")),y.length>0?K("div",{className:"pipeline-score-items"},y.map(($)=>K("span",{key:`${$.id||$.filter}`,className:`pipeline-score-item ${String($.status||"").toLowerCase()}`,title:`${$.filter||"--"} / ran=${$.ran??"?"}`},K("b",null,$.id||"--"),K("small",null,$.status||"--")))):K("p",{className:"muted paragraph"},"当前 scorer 尚未返回 item 级结果。"),n.error?K("p",{className:"pipeline-score-error"},hW(n.error,360)):null,K("div",{className:"panel-actions inline-actions"},K(ln,{title:`Scorer ${n.scorerId||i}`,data:n,onOpen:l,testId:"raw-pipeline-score"})))}))}function jS(u){let l=u.reduce((f,r)=>{let n=String(r?.componentClass||"unknown");return f[n]=(f[n]||0)+1,f},{});return Object.entries(l).map(([f,r])=>({name:f,count:Number(r)})).sort((f,r)=>r.count-f.count||f.name.localeCompare(r.name))}function bc(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 bc(u.nodes);if(Array.isArray(u?.nodeIds))return bc(u.nodeIds);return[]}function FS(u){return pu(u?.instanceInputs?.monitor)?u.instanceInputs.monitor:{}}function aW(u,l){if(String(u?.kind||"").toLowerCase()!=="procedure")return!1;let f=FS(u);if(u?.instanceInputs?.monitorMode===!0||f.enabled===!0)return!0;let r=IW(u?.componentRef);return String(l?.id||l?.config?.id||r||"").toLowerCase().includes("monitor")}function US(u){return u.filter((l)=>aW(l)).map((l)=>String(l?.id||"")).filter(Boolean)}function JS(u,l){if(l.length===0)return u;let f=new Set(l),r=l.filter((n)=>u.includes(n));if(r.length===0)return u;return[...r,...u.filter((n)=>!f.has(n))]}function QS(u,l){if(l.length===0)return u;let f=new Set(l),r=l.filter((i)=>u.some((t)=>t.includes(i)));if(r.length===0)return u;let n=u.map((i)=>i.filter((t)=>!f.has(t))).filter((i)=>i.length>0);return[r,...n]}function NS(u,l,f){let n=e9(u).map(bc).filter((F)=>F.length>0);if(n.length>0)return n;let i=l.map((F)=>String(F?.id||"")).filter(Boolean),t=new Set(i),y=new Map(i.map((F)=>[F,0])),c=new Map(i.map((F)=>[F,[]]));for(let F of f){let J=String(F?.from||F?.source||""),Q=String(F?.to||F?.target||"");if(!t.has(J)||!t.has(Q))continue;c.get(J)?.push(Q),y.set(Q,(y.get(Q)||0)+1)}let $=new Map,A=i.filter((F)=>(y.get(F)||0)===0);for(let F of A)$.set(F,0);while(A.length>0){let F=A.shift(),J=($.get(F)||0)+1;for(let Q of c.get(F)||[])if(y.set(Q,Math.max(0,(y.get(Q)||0)-1)),$.set(Q,Math.max($.get(Q)||0,J)),(y.get(Q)||0)===0)A.push(Q)}i.forEach((F)=>{if(!$.has(F))$.set(F,0)});let j=Math.max(0,...Array.from($.values()));return Array.from({length:j+1},(F,J)=>i.filter((Q)=>$.get(Q)===J)).filter((F)=>F.length>0)}function qS(u,l,f){let n=e9(u).map(bc).filter((y)=>y.length>0),i=n.length>0?n.flatMap((y)=>y):(()=>{let y=l.map((W)=>String(W?.id||"")).filter(Boolean),c=new Set(y),$=f.filter((W)=>String(W?.edgeType||"").toLowerCase()!=="rework"),A=new Map(y.map((W)=>[W,0])),j=new Map(y.map((W)=>[W,[]]));for(let W of $){let L=String(W?.from||W?.source||""),U=String(W?.to||W?.target||"");if(!c.has(L)||!c.has(U))continue;j.get(L)?.push(U),A.set(U,(A.get(U)||0)+1)}let F=new Map,J=y.filter((W)=>(A.get(W)||0)===0);for(let W of J)F.set(W,0);while(J.length>0){let W=J.shift(),L=(F.get(W)||0)+1;for(let U of j.get(W)||[])if(A.set(U,Math.max(0,(A.get(U)||0)-1)),F.set(U,Math.max(F.get(U)||0,L)),(A.get(U)||0)===0)J.push(U)}y.forEach((W)=>{if(!F.has(W))F.set(W,0)});let Q=Math.max(0,...Array.from(F.values()));return Array.from({length:Q+1},(W,L)=>y.filter((U)=>F.get(U)===L)).flatMap((W)=>W)})(),t=new Set(i);for(let y of l){let c=String(y?.id||"");if(!c||t.has(c))continue;i.push(c),t.add(c)}return JS(i,US(l))}function Yc(u){return`${u.source}->${u.target}-${u.index}`}function mW(u,l,f){let r=gW(u),n=d9(u),i=nS(f),t=new Map(r.map((X)=>[String(X?.id||""),X])),y=r.filter((X)=>aW(X,HW(X,i))).map((X)=>String(X?.id||"")).filter(Boolean),c=QS(NS(u,r,n),y),$=[],A=new Map,j=330,F=122;c.forEach((X,O)=>{let Y=X.length*122;X.forEach((p,v)=>{let z=t.get(p)||{id:p},P=HW(z,i),k=BW(l,p).toLowerCase(),I=String(z.kind||P?.componentClass||"node").toLowerCase(),b=IW(z.componentRef||P),d=String(P?.config?.version||P?.version||""),g=String(P?.config?.description||P?.description||""),x=v*122-Math.floor(Y/2);A.set(p,{column:O,row:v,y:x}),$.push({id:p,type:"pipelineNode",position:{x:O*330,y:x},data:{exportLabel:{id:p,kind:I,componentRef:b,componentVersion:d,componentDescription:g,status:k},label:K("div",{className:"flow-node-label"},K("strong",null,p),K("span",null,I),K("code",{title:g||b},d?`${b}@${d}`:b),K(o0,{status:k},k))},className:`pipeline-flow-node ${I} ${k}`})})});let J=n.flatMap((X,O)=>{let Y=String(X?.from||X?.source||""),p=String(X?.to||X?.target||"");if(!t.has(Y)||!t.has(p))return[];return[{source:Y,target:p,index:O,condition:X?.condition,edgeType:X?.edgeType}]}),Q=J.reduce((X,O)=>X.set(O.source,(X.get(O.source)||0)+1),new Map),W=J.reduce((X,O)=>X.set(O.target,(X.get(O.target)||0)+1),new Map),L=J.reduce((X,O)=>{let Y=`${O.source}->${O.target}`;return X.set(Y,(X.get(Y)||0)+1)},new Map),U=new Map,q=new Map,N=new Map,w=new Map,G=new Map,Z=new Map,H=J.reduce((X,O)=>{let Y=A.get(O.source),p=A.get(O.target),v=(p?.column||0)-(Y?.column||0);if(v<=0||String(O.edgeType||"").toLowerCase()==="rework"||v!==1)return X;let P=`${O.source}->column:${p?.column??""}`,k=X.get(P)||[];return k.push(O),X.set(P,k),X},new Map);for(let X of H.values()){if(X.length<2)continue;X.slice().sort((O,Y)=>{let p=A.get(O.target),v=A.get(Y.target);return(p?.y||0)-(v?.y||0)||O.index-Y.index}).forEach((O,Y,p)=>{Z.set(Yc(O),{slot:Y-(p.length-1)/2,count:p.length})})}[...J].sort((X,O)=>{let Y=A.get(X.source),p=A.get(X.target),v=A.get(O.source),z=A.get(O.target),P=Math.abs((p?.column||0)-(Y?.column||0))*330+Math.abs((p?.y||0)-(Y?.y||0)),k=Math.abs((z?.column||0)-(v?.column||0))*330+Math.abs((z?.y||0)-(v?.y||0));return P-k||X.index-O.index}).forEach((X)=>{let O=A.get(X.source)||{column:0,row:0,y:0},Y=A.get(X.target)||{column:0,row:0,y:0},p=Y.column-O.column,v=Math.max(0,p),z=p<=0||String(X.edgeType||"").toLowerCase()==="rework",P=O.y-Y.y,k=W.get(X.target)||1,I=Z.has(Yc(X)),b=!z&&v<=1&&(I||k===1),d=G.get(X.target)||new Map;G.set(X.target,d);let g=hc.slice().sort((x,lu)=>{let cu=(Wu)=>{let C=String(Wu.side),e=0;if(z){if(C==="left")e+=86;if(C==="top")e+=Y.y<=0?-22:12;if(C==="bottom")e+=Y.y>=0?-22:12;if(Math.abs(Y.y)<12&&C!=="left")e+=X.index%2===0?C==="top"?-6:6:C==="bottom"?-6:6;return e}if(b){if(C==="left")e-=I?72:44;if(C!=="left")e+=I?72:44;return e+Math.abs(P)*0.02}if(C==="left")e+=v<=1?0:24;if(C==="top")e+=P<-36?-18:42;if(C==="bottom")e+=P>36?-18:42;if(v<=1&&Math.abs(P)<=82&&C!=="left")e+=38;if(v>1&&C!=="left")e-=10;return e},_u=O.y-Y.y,Fu=_u!==0?_u:X.index%2===0?-1:1,zu=(Wu)=>{let C=d.get(Wu.id)||0;return cu(Wu)+C*64+Xp(Wu,d,Fu)};return zu(x)-zu(lu)||String(x.id).localeCompare(String(lu.id))})[0];d.set(g.id,(d.get(g.id)||0)+1),w.set(Yc(X),g)});let V=J.map((X)=>{let O=BW(l,X.target).toLowerCase(),Y=`${X.source}->${X.target}`,p=U.get(X.source)||0,v=q.get(X.target)||0,z=N.get(Y)||0;U.set(X.source,p+1),q.set(X.target,v+1),N.set(Y,z+1);let P=p-((Q.get(X.source)||1)-1)/2,k=v-((W.get(X.target)||1)-1)/2,I=z-((L.get(Y)||1)-1)/2,b=A.get(X.source),d=A.get(X.target),g=(d?.column||0)-(b?.column||0),x=Math.max(1,Math.abs(g)),lu=g<=0||String(X.edgeType||"").toLowerCase()==="rework",cu=Math.abs((d?.y||0)-(b?.y||0)),_u=Z.get(Yc(X)),Fu=!lu&&g===1&&(W.get(X.target)||0)>1,zu=_u?_u.slot:I*2+P+k*0.45,Wu=zu===0?X.index%2===0?-1:1:Math.sign(zu),C=w.get(Yc(X))||hc[1],e=C.side==="top"?-1:C.side==="bottom"?1:Wu,uu=lu||x>1||cu>96||Math.abs(zu)>0.2||C.side!=="left",Gu=lu?118+x*18:22+x*16,s=C.side==="left"?0:28,qu=uu?Math.max(-280,Math.min(280,e*Math.min(180,Gu+s+cu*0.22)+zu*28)):0,Zu=Math.max(0,Math.min(Cc.length-1,Math.round(P+(Cc.length-1)/2))),Bu=Cc[Zu]||Cc[1],Iu=O==="succeeded"?"var(--accent-2)":O==="running"?"var(--accent)":O==="failed"?"var(--danger)":"rgba(129, 147, 159, 0.78)",ll=b?.column||0,Pu=d?.column||0,Jl=qu===0?0:Math.sign(qu),Jf=lu?`feedback:${ll}->${Pu}:${Jl}`:_u?`fanout:${ll}->${Pu}:${X.source}`:Fu?`fanin:${ll}->${Pu}:${X.target}`:C.side!=="left"||x>1?`corridor:${ll}->${Pu}:${C.side}:${Jl}:${Math.round(Math.abs(qu)/56)}`:"";return{id:`${X.source}->${X.target}-${X.index}`,source:X.source,target:X.target,sourceHandle:Bu.id,targetHandle:C.id,type:"pipelineCurve",zIndex:12,animated:O==="running",data:{baseEdgeColor:Iu,laneOffset:qu,routeMode:_u&&C.side==="left"?"direct-forward-left":"",targetSide:C.side,isFeedback:lu,overlapGroup:Jf},targetStatus:O}}),S=V.reduce((X,O)=>{let Y=String(O.data?.overlapGroup||"");return Y?X.set(Y,(X.get(Y)||0)+1):X},new Map),B=new Map,D=V.map((X)=>{let O=String(X.targetStatus||"pending"),Y={...X};delete Y.targetStatus;let p=String(X.data?.overlapGroup||""),v=p?S.get(p)||0:0,z=v>1?B.get(p)||0:-1;if(v>1)B.set(p,z+1);let P=z>=0?qW[z%qW.length]:String(X.data.baseEdgeColor),k={stroke:P};if(X.data.isFeedback)k.strokeDasharray="9 7";return{...Y,data:{...X.data,edgeColor:P,overlapSlot:z,overlapCount:v},style:k,markerEnd:{type:x0.ArrowClosed,color:P},className:`pipeline-flow-edge ${O} ${X.data.isFeedback?"feedback":""} ${z>=0?"overlap-colored":""}`}});return{nodes:$,edges:D}}function ef(u){return String(u??"").replace(/&/g,"&").replace(//g,">").replace(/"/g,""")}function VW(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 HA(u){return`arrow-${u.replace(/[^a-zA-Z0-9_-]+/g,"")}`}function oW(u,l="pipeline"){return String(u||l).replace(/[^a-zA-Z0-9_-]+/g,"-").replace(/^-|-$/g,"")||l}function DW(u,l){let f=u.position.x,r=u.position.y,n=hc.find((i)=>i.id===l);if(n?.side==="top")return{x:f+Ky*LW(n.style?.left,0.5),y:r,position:Ku.Top};if(n?.side==="bottom")return{x:f+Ky*LW(n.style?.left,0.5),y:r+Gy,position:Ku.Bottom};return{x:f,y:r+Gy/2,position:Ku.Left}}function wS(u){return{x:u.position.x+Ky,y:u.position.y+Gy/2}}function WS(u,l){let f=Math.min(...u.nodes.map((W)=>W.position.x),0)-220,r=Math.min(...u.nodes.map((W)=>W.position.y),0)-220,n=Math.max(...u.nodes.map((W)=>W.position.x+Ky),1)+220,i=Math.max(...u.nodes.map((W)=>W.position.y+Gy),1)+220,t=Math.ceil(n-f),y=Math.ceil(i-r),c=new Map(u.nodes.map((W)=>[W.id,W])),$=u.edges.map((W)=>VW(W.data?.edgeColor||W.style?.stroke)),j=Array.from(new Set(["#4eb7a8","#d7a13a","#cf6a54","#81939f",...$])).map((W)=>``).join(""),F=u.edges.flatMap((W)=>{let L=c.get(W.source),U=c.get(W.target);if(!L||!U)return[];let q=wS(L),N=DW(U,String(W.targetHandle||"in-left")),w=CW(q.x,q.y,N.x,N.y,N.position,Number(W.data?.laneOffset||0),String(W.data?.routeMode||"")),G=VW(W.data?.edgeColor||W.style?.stroke),Z=W.data?.isFeedback?' stroke-dasharray="9 7"':"";return``}).join(` +`),J=u.nodes.map((W)=>{let L=W.data?.exportLabel||{},U=String(L.status||"pending").toLowerCase(),q=U==="succeeded"?"#4eb7a8":U==="running"?"#d7a13a":U==="failed"?"#cf6a54":"#81939f",N=W.position.x,w=W.position.y,G=hc.map((Z)=>{let H=DW(W,Z.id);if(Z.side==="top"||Z.side==="bottom")return``;return``}).join(` `);return` - - ${z} - - ${of(L.id||w.id)} - ${of(L.kind||"node")} - ${of(L.componentRef||"--")} - ${of(U)} + + ${G} + + ${ef(L.id||W.id)} + ${ef(L.kind||"node")} + ${ef(L.componentRef||"--")} + ${ef(U)} `}).join(` -`);return{svg:` +`);return{svg:` ${j} - ${of(l)} + ${ef(l)} ${J}${F} - `,width:y,height:t}}function lY(u){let l=String(u||"").toLowerCase();if(l==="succeeded"||l==="completed")return"#4eb7a8";if(l==="failed")return"#cf6a54";if(Lw(l))return"#69aee8";return"#d7a13a"}function fY(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 Jw(u){let l=String(u?.sourceKind||"").toLowerCase(),f=String(u?.action||"").toLowerCase(),r=String(u?.status||"").toLowerCase();if(f==="observe"||r==="observation"||l==="monitor")return"#4eb7a8";if(l==="webui")return"#69aee8";if(l==="cli")return"#d7a13a";if(r.includes("ignored"))return"#81939f";return"#8aa0ad"}function rY(u,l,f){let r=fY(u),n=String(u?.kind||"");if(n==="control-source")return``;if(n==="control-target"){let y=String(u?.tone||"").toLowerCase()==="approve"?"rgba(78,183,168,0.22)":"#081118";return``}return``}function nY(u){let l=Du(u.visibleNodeIds).map((T)=>String(T||"")).filter(Boolean),f=Du(u.intervals).filter(Xu),r=Du(u.markers).filter(Xu),n=Du(u.arrows).filter(Xu),i=Du(u.ticks).filter(Xu),y=Xu(u.bounds)?u.bounds:{},t=Xu(u.backendLayout)?u.backendLayout:null,_=Math.max(240,Math.round(Number(u.chartHeight||360))),c=Math.max(j0,108),A=128,j=24,F=58,J=56,Q=128+Math.max(1,l.length)*c,w=Math.max(760,Q+48),L=114+_+24,U=24,N=58,q=114,W=(T)=>152+T*c,z=(T)=>W(T)+c/2,Z=Du(u.meta).map((T)=>String(T||"")).filter(Boolean).slice(0,4).join(" · "),H=new Map(r.map((T)=>[String(T.id||""),T])),D=Array.from(new Set(["#4eb7a8","#69aee8","#d7a13a","#cf6a54","#8aa0ad",...n.map(Jw)])).map((T)=>``).join(""),h=i.map((T)=>{let Y=114+Mw(T,y,_,t);return` - - ${of(qu(T.ms))} - +${of(Br(Number(T.offsetMs??Number(T.ms)-Number(y.startMs))))} + `,width:t,height:y}}function LS(u){let l=String(u||"").toLowerCase();if(l==="succeeded"||l==="completed")return"#4eb7a8";if(l==="failed")return"#cf6a54";if(MW(l))return"#69aee8";return"#d7a13a"}function TS(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 pW(u){let l=String(u?.sourceKind||"").toLowerCase(),f=String(u?.action||"").toLowerCase(),r=String(u?.status||"").toLowerCase();if(f==="observe"||r==="observation"||l==="monitor")return"#4eb7a8";if(l==="webui")return"#69aee8";if(l==="cli")return"#d7a13a";if(r.includes("ignored"))return"#81939f";return"#8aa0ad"}function KS(u,l,f){let r=TS(u),n=String(u?.kind||"");if(n==="control-source")return``;if(n==="control-target"){let t=String(u?.tone||"").toLowerCase()==="approve"?"rgba(78,183,168,0.22)":"#081118";return``}return``}function GS(u){let l=Du(u.visibleNodeIds).map((z)=>String(z||"")).filter(Boolean),f=Du(u.intervals).filter(pu),r=Du(u.markers).filter(pu),n=Du(u.arrows).filter(pu),i=Du(u.ticks).filter(pu),t=pu(u.bounds)?u.bounds:{},y=pu(u.backendLayout)?u.backendLayout:null,c=Math.max(240,Math.round(Number(u.chartHeight||360))),$=Math.max(wn,108),A=128,j=24,F=58,J=56,Q=128+Math.max(1,l.length)*$,W=Math.max(760,Q+48),L=114+c+24,U=24,q=58,N=114,w=(z)=>152+z*$,G=(z)=>w(z)+$/2,Z=Du(u.meta).map((z)=>String(z||"")).filter(Boolean).slice(0,4).join(" · "),H=new Map(r.map((z)=>[String(z.id||""),z])),V=Array.from(new Set(["#4eb7a8","#69aee8","#d7a13a","#cf6a54","#8aa0ad",...n.map(pW)])).map((z)=>``).join(""),S=i.map((z)=>{let P=114+iL(z,t,c,y);return` + + ${ef(wu(z.ms))} + +${ef(Dr(Number(z.offsetMs??Number(z.ms)-Number(t.startMs))))} `}).join(` -`),V=['','TIME',...l.map((T,Y)=>{let k=W(Y),I=T.length>18?`${T.slice(0,16)}…`:T;return` - - ${of(I)} - node ${Y+1} +`),B=['','TIME',...l.map((z,P)=>{let k=w(P),I=z.length>18?`${z.slice(0,16)}…`:z;return` + + ${ef(I)} + node ${P+1} `})].join(` -`),S=l.map((T,Y)=>{return``}).join(` -`),p=f.map((T)=>{let Y=l.indexOf(String(T.nodeId||""));if(Y<0)return"";let k=114+G6(T,y,_,t),I=Math.max(2,Cw(T,y,_,t)),b=lY(T.status),o=z(Y)-3.5,g=T.live?``:"",x=I>=28?`${of(String(T.status||"working"))} - ${of(Br(T.durationMs))}`:"";return` - +`),D=l.map((z,P)=>{return``}).join(` +`),X=f.map((z)=>{let P=l.indexOf(String(z.nodeId||""));if(P<0)return"";let k=114+mA(z,t,c,y),I=Math.max(2,nL(z,t,c,y)),b=LS(z.status),d=G(P)-3.5,g=z.live?``:"",x=I>=28?`${ef(String(z.status||"working"))} + ${ef(Dr(z.durationMs))}`:"";return` + ${g} ${x} `}).join(` -`),O=r.map((T)=>{let Y=l.indexOf(String(T.nodeId||""));if(Y<0)return"";let k=114+Jr(T,y,_,t);return rY(T,z(Y),k)}).join(` -`),m=n.map((T)=>{let Y=H.get(String(T.targetMarkerId||""));if(!Y)return"";let k=H.get(String(T.sourceMarkerId||"")),I=String(k?.nodeId||T.sourceNodeId||""),b=String(Y.nodeId||T.targetNodeId||""),o=l.indexOf(I),g=l.indexOf(b);if(o<0||g<0)return"";let x=z(o)-24-128,lu=z(g)-24-128,_u=Qy(t)?Vl(T.sourceY??T.y1)??(k?Jr(k,y,_,t):Jr(Y,y,_,t)):k?Jr(k,y,_,t):Jr(Y,y,_,t),$u=Qy(t)?Vl(T.targetY??T.y2)??Jr(Y,y,_,t):Jr(Y,y,_,t),ju=Jw(T),zu=String(T.action||"").toLowerCase()==="observe"?"3 4":"6 5",Wu=of(Rw(x,_u,lu,$u));return` - `}).join(` -`),X=l.length===0?'No visible Gantt nodes':"";return{svg:` - ${D} +`),O=r.map((z)=>{let P=l.indexOf(String(z.nodeId||""));if(P<0)return"";let k=114+Nr(z,t,c,y);return KS(z,G(P),k)}).join(` +`),Y=n.map((z)=>{let P=H.get(String(z.targetMarkerId||""));if(!P)return"";let k=H.get(String(z.sourceMarkerId||"")),I=String(k?.nodeId||z.sourceNodeId||""),b=String(P.nodeId||z.targetNodeId||""),d=l.indexOf(I),g=l.indexOf(b);if(d<0||g<0)return"";let x=G(d)-24-128,lu=G(g)-24-128,cu=zy(y)?Vl(z.sourceY??z.y1)??(k?Nr(k,t,c,y):Nr(P,t,c,y)):k?Nr(k,t,c,y):Nr(P,t,c,y),_u=zy(y)?Vl(z.targetY??z.y2)??Nr(P,t,c,y):Nr(P,t,c,y),Fu=pW(z),zu=String(z.action||"").toLowerCase()==="observe"?"3 4":"6 5",Wu=ef(tL(x,cu,lu,_u));return` + `}).join(` +`),p=l.length===0?'No visible Gantt nodes':"";return{svg:` + ${V} - - ${of(u.title||"Pipeline Epoch Gantt")} - ${of(Z)} - ${V} - + + ${ef(u.title||"Pipeline Epoch Gantt")} + ${ef(Z)} + ${B} + + ${D} ${S} - ${h} - ${p} - ${m} - ${O} ${X} - `,width:w,height:L}}function K6(u,l){let f=URL.createObjectURL(u),r=document.createElement("a");r.href=f,r.download=l,r.click(),setTimeout(()=>URL.revokeObjectURL(f),1000)}async function Xw(u,l){let f=Dw(l,"pipeline"),{svg:r,width:n,height:i}=uY(u,l),y=new Blob([r],{type:"image/svg+xml;charset=utf-8"}),t=URL.createObjectURL(y);try{let _=new Image;await new Promise((F,J)=>{_.onload=()=>F(),_.onerror=()=>J(Error("svg image load failed")),_.src=t});let c=document.createElement("canvas");c.width=n,c.height=i;let A=c.getContext("2d");if(!A)throw Error("canvas unavailable");A.drawImage(_,0,0);let j=await new Promise((F)=>c.toBlob(F,"image/png"));if(!j)throw Error("png export failed");K6(j,`${f}.png`)}catch{K6(y,`${f}.svg`)}finally{URL.revokeObjectURL(t)}}async function iY(u){let l=Dw(String(u?.title||"pipeline-gantt"),"pipeline-gantt"),{svg:f,width:r,height:n}=nY(u),i=new Blob([f],{type:"image/svg+xml;charset=utf-8"}),y=URL.createObjectURL(i);try{let t=new Image;await new Promise((j,F)=>{t.onload=()=>j(),t.onerror=()=>F(Error("gantt svg image load failed")),t.src=y});let _=document.createElement("canvas");_.width=r,_.height=n;let c=_.getContext("2d");if(!c)throw Error("canvas unavailable");c.drawImage(t,0,0);let A=await new Promise((j)=>_.toBlob(j,"image/png"));if(!A)throw Error("gantt png export failed");K6(A,`${l}.png`)}catch{K6(i,`${l}.svg`)}finally{URL.revokeObjectURL(y)}}async function yY(u){for(let l of u){if(l.flow.nodes.length===0)continue;await Xw(l.flow,l.title),await new Promise((f)=>setTimeout(f,750))}}function Qw(u,l){return u.find((f)=>String(f?.pipelineId||"")===l)||null}function Nw(u){return Iu(u?.startedAt)??Iu(u?.artifact?.startedAt)??Iu(u?.request?.createdAt)??Iu(u?.updatedAt)??0}function tY(u,l){return u.filter((f)=>String(f?.pipelineId||"")===l).slice().sort((f,r)=>Nw(f)-Nw(r)||String(f?.runId||"").localeCompare(String(r?.runId||"")))}function X9(u,l){let f=String(l?.runId||""),r=u.findIndex((y)=>String(y?.runId||"")===f),n=r>=0?r+1:u.length,i=String(l?.status||"--");return`Epoch ${n} / ${f||"--"} / ${i}`}function Vr(u){return String(u?.procedureRunId||u?.runId||"")}function E6(u,l){let f=String(u?.nodeId||u?.request?.nodeId||"");if(f)return f;let r=Vr(u),n=`${l}__`;if(r.startsWith(n))return r.slice(n.length).replace(/__\d+$/u,"");return""}function F6(u,l){let f=Xu(u?.artifact)?u.artifact:{},r=Xu(u?.request)?u.request:{};return C_(u?.startedAt,f.startedAt,r.createdAt,r.startedAt,u?.createdAt,u?.updatedAt,l?.startedAt,l?.request?.createdAt)}function U6(u,l){let f=String(u?.status?.status||u?.artifact?.status||u?.status||"").toLowerCase(),r=Xu(u?.artifact)?u.artifact:{},n=m9(f);return C_(u?.finishedAt,r.finishedAt,u?.completedAt,n?u?.updatedAt:void 0,n?r.updatedAt:void 0,n?l?.updatedAt:void 0)}function Sw(u,l,f=Date.now()){let r=String(u?.runId||""),n=new Set(l.map((i)=>String(i?.id||"")).filter(Boolean));return Du(u?.procedureRuns).flatMap((i)=>{let y=E6(i,r);if(!y)return[];let t=String(i?.status?.status||i?.artifact?.status||i?.status||"unknown").toLowerCase(),_=F6(i,u),c=Iu(_);if(c===null)return[];let A=U6(i,u),j=Iu(A)??(m9(t)?Iu(i?.updatedAt)??c+1000:f),F=Math.max(c+1000,j);return[{nodeId:y,knownNode:n.has(y),procedureRunId:Vr(i),status:t,startMs:c,endMs:F,startedAt:p_(c),finishedAt:p_(F),durationMs:F-c,runId:r,raw:i}]}).sort((i,y)=>i.startMs-y.startMs||i.endMs-y.endMs||i.nodeId.localeCompare(y.nodeId))}function _Y(u,l,f=[]){let r=l.map((A)=>Number(A.startMs)).filter(Number.isFinite),n=l.map((A)=>Number(A.endMs)).filter(Number.isFinite);for(let A of f){let j=Vl(A?.eventMs??A?.ms);if(j!==null)r.push(j),n.push(j)}let i=Iu(u?.startedAt)??Iu(u?.artifact?.startedAt)??Iu(u?.request?.createdAt),y=Iu(u?.finishedAt)??Iu(u?.artifact?.finishedAt)??Iu(u?.updatedAt);if(i!==null)r.push(i);if(y!==null)n.push(y);let t=Date.now(),_=r.length>0?Math.min(...r):t-60000,c=Math.max(_+60000,n.length>0?Math.max(...n):t);return{startMs:_,endMs:c,durationMs:c-_}}var J6=12,Yw=20,S9=100,$Y=!1;function vn(u){let l=Number(u);if(!Number.isFinite(l))return 0;return Math.max(0,Math.min(100,Math.round(l*100)/100))}function cY(u){let l=Math.max(J6,Number(u||J6)),f=Math.log(l/J6)/Math.log(Yw);return vn(f*100)}var P_=cY(S9);function h9(u){let l=vn(u)/100,f=J6*Math.pow(Yw,l),r=l<0.24?"全局":l<0.64?"均衡":"细节";return{value:vn(l*100),pxPerMinute:f,label:r}}function E9(u){let l=Math.round(Number(u));return Math.abs(l-S9)<=1?S9:l}function AY(u,l=P_){let f=Math.max(1,Number(u.durationMs||0)/60000),r=h9(l);return Math.round(Math.max(360,Math.min(7200,f*Number(r.pxPerMinute||48))))}function jY(u,l=7){let f=Math.max(1,Number(u.endMs||0)-Number(u.startMs||0));return Array.from({length:l},(r,n)=>{let i=l===1?0:n/(l-1);return{ms:Number(u.startMs)+f*i,percent:i*100}})}function FY(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 Vl(u){let l=Number(u);return Number.isFinite(l)?l:null}function b9(u){return Lw(u?.status)&&!m9(u?.status)}function pw(u,l,f,r){let n=Math.max(1,f-l),i=Math.max(0,Math.min(1,(u-l)/n));return Number((i*r).toFixed(3))}function qw(u,l){if(!l)return null;let f=Vl(l?.startMs),r=Vl(l?.endMs),n=Vl(l?.chartHeight);if(f===null||r===null||n===null)return null;return pw(u,f,r,n)}function mw(u,l){let f=Vl(u?.rawStartMs??u?.startMs)??Vl(u?.startMs)??l,r=Vl(u?.endMs)??f+1000;if(!b9(u))return Math.max(f+1000,r);return Math.max(f+1000,r,l)}function UY(u,l,f,r){let n=Vl(u?.startMs)??r-60000,i=Vl(u?.endMs)??r,y=f.reduce((Q,w)=>Math.max(Q,mw(w,r)),i),t=Math.max(n+60000,i,y),_=Math.max(1,t-n),c={startMs:n,endMs:t,durationMs:_},A=AY(c,l),j=h9(l),F=Math.max(5,Math.min(18,Math.round(A/150))),J=jY(c,F).map((Q)=>{let w=Number(Q.ms),L=pw(w,n,t,A);return{...Q,y:L,timestamp:p_(w),offsetMs:w-n}});return{source:"frontend-y",startMs:n,endMs:t,durationMs:_,chartHeight:A,scale:vn(l),normalizedScale:Number((vn(l)/100).toFixed(3)),pxPerMinute:Number(Number(j.pxPerMinute||0).toFixed(3)),ticks:J}}function JY(u,l,f){if(!b9(u))return u;let r=Vl(u?.rawStartMs??u?.startMs)??Vl(u?.startMs)??f,n=mw(u,f),i=qw(r,l),y=qw(n,l),t=Vl(i??u?.y1??u?.startY)??0,_=Vl(y??u?.y2??u?.endY)??t+10,c=Math.max(24,_-t);return{...u,live:!0,startMs:r,endMs:n,durationMs:Math.max(1000,n-r),finishedAt:p_(n),y1:t,y2:_,startY:t,endY:_,height:c}}function v9(u,l,f){return FY(u,l)/100*f}function Qy(u){return Boolean(u&&String(u?.source||"")!=="frontend-y")}function Pw(u,l,f,r,n){if(Qy(r))for(let y of n){let t=Vl(u?.[y]);if(t!==null)return t}let i=Vl(u?.ms??u?.eventMs??u?.startMs);return v9(i??Number(l.startMs),l,f)}function G6(u,l,f,r){return Pw(u,l,f,r,["y1","startY"])}function Y9(u,l,f,r){if(Qy(r)){let i=Vl(u?.y2??u?.endY);if(i!==null)return i}let n=Vl(u?.endMs)??Number(l.endMs);return v9(n,l,f)}function Cw(u,l,f,r){if(Qy(r)){let i=Vl(u?.height);if(i!==null)return Math.max(1,i)}let n=u?.live?24:10;return Math.max(n,Y9(u,l,f,r)-G6(u,l,f,r))}function Jr(u,l,f,r){return Pw(u,l,f,r,["y","timeAxisY"])}function Mw(u,l,f,r){if(Qy(r)||String(r?.source||"")==="frontend-y"){let y=Vl(u?.y);if(y!==null)return y}let n=Vl(u?.percent);if(n!==null)return n/100*f;let i=Vl(u?.ms)??Number(l.startMs);return v9(i,l,f)}function QY(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||""),r=String(u?.nodeId||u?.targetNodeId||"");return f&&f!==r?f:""}function NY(u,l){let f=new Set(l.map((n)=>[String(n.sourceNodeId||""),String(n.targetNodeId||""),String(n.targetMarkerId||""),String(n.action||"")].join(":"))),r=[...l];for(let n of u){let i=QY(n),y=String(n?.nodeId||""),t=String(n?.id||"");if(!i||!y||!t)continue;let _=[i,y,t,"observe"].join(":");if(f.has(_))continue;f.add(_),r.push({id:`observation-arrow:${t}:${i}:${y}`,commandId:String(n?.commandId||n?.eventId||t),sourceNodeId:i,targetNodeId:y,sourceMarkerId:"",targetMarkerId:t,sourceKind:"monitor",action:"observe",status:"observation"})}return{markers:u,arrows:r}}function qY(u){let l=gr(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 WY(u){return Du(u?.tags||u?.raw?.tags).map((l)=>String(l||"")).filter(Boolean)}function wY(u){let l=gr(u),f=String(u?.promptEvent||"");if(l==="initial-prompt-delivered")return"初始 prompt";if(f==="node-long-running-observation")return"长任务观察";if(f==="node-finished")return WY(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 Ww(u){let l=gr(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 LY(u,l){let f=String(u?.commandId||"");if(f)return`command:${f}`;return["control-event",Fy(u)||C_(u?.createdAt,u?.timestamp)||`index-${l}`,String(u?.sourceKind||""),String(u?.sourceNodeId||""),String(u?.targetNodeId||""),xi(u)].join(":")}function KY(u){return V9([u?.targetNodeId,...Du(u?.resetNodeIds)])}function GY(u,l){let f=S_(u),r=gr(u),n=String(u?.targetNodeId||""),i=Boolean(n)&&l!==n;if(r==="control-command-applied")return i?`${f} 波及`:`${f} 生效`;if(r==="control-command-ignored")return`${f} 忽略`;if(r==="control-command-queued")return`${f} 已发起`;return i?`${f} 波及`:f}function zY(u){if(gr(u)==="control-command-ignored")return"ignored";let f=xi(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 TY(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 EY(u,l,f,r){let n=u.filter((c)=>String(c.nodeId||"")===l).sort((c,A)=>Number(c.startMs)-Number(A.startMs)),i=n.find((c)=>f>=Number(c.startMs)-1000&&f<=Number(c.endMs)+1000);if(i)return{ms:f,onInterval:!0,snapReason:"inside-interval",procedureRunId:String(i.procedureRunId||"")};let y=xi(r),t=n.slice().reverse().find((c)=>Number(c.endMs)<=f+1000);if(t&&y==="approve")return{ms:Number(t.endMs),onInterval:!0,snapReason:"previous-interval-end",procedureRunId:String(t.procedureRunId||"")};let _=n.find((c)=>Number(c.startMs)>=f-1000);if(_&&["guide","modify","restart","redo"].includes(y))return{ms:Number(_.startMs),onInterval:!0,snapReason:"next-interval-start",procedureRunId:String(_.procedureRunId||"")};return{ms:f,onInterval:!1,snapReason:"event-time",procedureRunId:String(r?.procedureRunId||"")}}function Rw(u,l,f,r){let n=Math.hypot(f-u,r-l),i=n>lw?lw:0,y=i>0?f-(f-u)/n*i:f,t=i>0?r-(r-l)/n*i:r,_=y-u,c=Math.max(16,Math.min(42,Math.abs(_)*0.45+12)),A=_===0?1:Math.sign(_);return`M ${u},${l} C ${u+A*c},${l} ${y-A*c},${t} ${y},${t}`}function ZY(u,l){let f=String(u?.runId||l?.runId||""),r=Sw({...Xu(l)?l:{},...Xu(u)?u:{},runId:f,procedureRuns:Du(u?.procedureRuns).length>0?u.procedureRuns:l?.procedureRuns},[]),n=[],i=[],y=[],t=new Set,_=new Map,c=(F,J)=>{if(!F.nodeId||!Number.isFinite(Number(F.ms)))return;if(t.has(F.id))return;t.add(F.id),J.push(F)};for(let F of Du(u?.procedureRuns)){let J=E6(F,f),Q=Vr(F);if(!J)continue;for(let w of Du(F?.attempts)){let L=T6(w);for(let U of B9(w?.controlEventRecords)){let N=gr(U);if(!["initial-prompt-delivered","append-prompt-delivered","monitor-prompt-delivered"].includes(N))continue;let q=Fy(U),W=Iu(q);if(W===null)continue;let z=String(U?.eventId||"");c({id:`prompt:${z||`${Q}:${L}:${N}:${W}`}`,runId:f,nodeId:J,procedureRunId:Q,attempt:L,kind:"prompt",tone:qY(U),status:"delivered",label:wY(U),ms:W,timestampIso:q,sourceKind:String(U?.sourceKind||""),sourceNodeId:String(U?.sourceNodeId||""),targetNodeId:J,action:"",eventId:z,commandId:String(U?.commandId||""),raw:U},n)}}}let A=new Map;B9(u?.controlEvents).forEach((F,J)=>{let Q=LY(F,J),w=A.get(Q)||{key:Q,events:[]};w.events.push(F),A.set(Q,w)});for(let F of A.values()){let J=Du(F.events).slice().sort((V,S)=>Ww(S)-Ww(V)),Q=Du(F.events).find((V)=>gr(V)==="control-command-queued")||null,w=J[0]||Q;if(!Q&&!w)continue;let L=String(Q?.sourceNodeId||w?.sourceNodeId||""),U=String(Q?.sourceKind||w?.sourceKind||""),N=Fy(Q)||Fy(w)||C_(Q?.createdAt,w?.createdAt),q=Iu(N),W=String(w?.commandId||Q?.commandId||F.key),z=(gr(w)||"control-command-queued").replace(/^control-command-/u,""),Z="";if(L&&q!==null)Z=`control-source:${W}:${L}`,_.set(W,Z),c({id:Z,runId:f,nodeId:L,procedureRunId:String(Q?.procedureRunId||w?.procedureRunId||""),attempt:"",kind:"control-source",tone:TY(Q||w),status:z,label:`${S_(Q||w)} 发起`,ms:q,timestampIso:N,action:xi(Q||w),sourceKind:U,sourceNodeId:L,targetNodeId:String(w?.targetNodeId||Q?.targetNodeId||""),commandId:W,raw:Q||w},i);let H=w||Q,E=Fy(H)||N,D=Iu(E);if(D===null)continue;let h=KY(H);for(let V of h){let S=EY(r,V,D,H),p=`control-target:${W}:${V}`;if(c({id:p,runId:f,nodeId:V,procedureRunId:S.procedureRunId,attempt:"",kind:"control-target",tone:zY(H),status:z,label:GY(H,V),ms:S.ms,eventMs:D,onInterval:S.onInterval,snapReason:S.snapReason,snapped:Number(S.ms)!==D,timestampIso:E,renderedTimestampIso:p_(Number(S.ms)),action:xi(H),sourceKind:U,sourceNodeId:L,targetNodeId:V,commandId:W,raw:H},i),Z&&L&&L!==V)y.push({id:`control-arrow:${W}:${L}:${V}`,commandId:W,sourceNodeId:L,targetNodeId:V,sourceMarkerId:Z,targetMarkerId:p,sourceKind:U,action:xi(H),status:z})}}let j=[...n,...i].sort((F,J)=>Number(F.ms)-Number(J.ms)||String(F.nodeId).localeCompare(String(J.nodeId))||String(F.id).localeCompare(String(J.id)));return{...NY(j,y),sourceMarkerByCommand:_}}function OY({details:u,selectedNodeId:l,selectedNodeRuntime:f,control:r,onRaw:n}){if(!u)return G("span",{className:"muted"},"点击“抓取过程”读取 node 运行材料;主界面只显示结构化摘要,完整内容需点开原始 JSON。");let i=Du(u.procedureRuns),y=i.at(-1)||{},t=Du(y.attempts),_=t.at(-1)||{},c=Du(y.workerLogTail),A=Du(_.controlEventsTail),j=Du(_.controlPromptsTail),F=Du(_.monitorPromptsTail),J=K9(A),Q=K9(j),w=K9(F),L=_.opencodeMessages||{};return G("div",{className:"pipeline-evidence-list compact"},G(Hr,{title:"Node runtime",subtitle:l||"--",facts:[`status ${f?.status||"pending"}`,`attempts ${f?.attempts??t.length}`,`procedure ${f?.currentProcedureRunId||Vr(y)||"--"}`,r.fetchedAt?`fetched ${tl(r.fetchedAt)}`:"not fetched"],data:u.node||u,onRaw:n,testId:"raw-pipeline-node-runtime"}),G(Hr,{title:"Procedure runs",subtitle:`${i.length} groups`,facts:[`latest ${y.status?.status||y.status||"--"}`,`steps ${Du(y.recentSteps).length}`,`duration ${Br(Iu(y.finishedAt)&&Iu(y.startedAt)?Number(Iu(y.finishedAt))-Number(Iu(y.startedAt)):y.durationMs)}`],data:i,onRaw:n,testId:"raw-pipeline-node-procedures"}),G(Hr,{title:"OpenCode messages",subtitle:String(L.exists?"available":"not indexed"),facts:[`messages ${N6(L.messageCount)}`,`size ${N6(L.size)}`,`updated ${qu(L.updatedAt)}`],data:L,onRaw:n,testId:"raw-pipeline-node-messages"}),G(Hr,{title:"Control prompts",subtitle:"manual / monitor append queues",facts:[`manual tail ${Q.total}`,`monitor tail ${w.total}`,`last ${qu(p9(Q.lastAt,w.lastAt))}`],data:{controlPromptsTail:j,monitorPromptsTail:F},onRaw:n,testId:"raw-pipeline-node-prompts"}),G(Hr,{title:"Control events",subtitle:J.eventKinds.length>0?J.eventKinds.join(", "):"event tail",facts:[`tail ${J.total}`,`parsed ${J.parsed}`,`last ${qu(J.lastAt)}`],data:A,onRaw:n,testId:"raw-pipeline-node-events"}),G(Hr,{title:"Worker log",subtitle:"tail is hidden on main canvas",facts:[`tail ${c.length} lines`,"raw only via button",`procedure ${Vr(y)||"--"}`],data:c,onRaw:n,testId:"raw-pipeline-node-worker-log"}))}function HY({activeRun:u,onRaw:l}){if(!u)return G(Qr,{title:"暂无运行材料",text:"没有 Pipeline epoch 时不会展示运行材料索引。"});let f=Du(u.nodes),r=Du(u.procedureRuns),n=Du(u.submissions),i=Du(u.workerLogTail),y=nw(f),t=nw(r),_=r.filter((A)=>String(A?.status||"").toLowerCase()==="failed"),c=p9(...r.flatMap((A)=>[A.updatedAt,A.finishedAt,A.startedAt]));return G("div",{className:"pipeline-evidence-list"},G(Hr,{title:"Epoch overview",subtitle:u.runId||"--",facts:[`pipeline ${u.pipelineId||"--"}`,`status ${u.status||"--"}`,`started ${qu(u.startedAt)}`,`updated ${qu(u.updatedAt)}`],data:u,onRaw:l,testId:"raw-pipeline-run"}),G(Hr,{title:"Node states",subtitle:`${f.length} nodes`,facts:[`running ${y.running||0}`,`succeeded ${y.succeeded||0}`,`failed ${y.failed||0}`,`pending ${y.pending||0}`],data:f,onRaw:l,testId:"raw-pipeline-run-nodes"}),G(Hr,{title:"Procedure run index",subtitle:`${r.length} procedure records`,facts:[`succeeded ${t.succeeded||0}`,`failed ${t.failed||0}`,`latest ${qu(c)}`,`errors ${_.length}`],data:r,onRaw:l,testId:"raw-pipeline-run-procedures"}),G(Hr,{title:"OA submissions",subtitle:`${n.length} submission files`,facts:[`records ${n.length}`,`task ${N6(u.task)}`,"raw grouped by run"],data:n,onRaw:l,testId:"raw-pipeline-run-submissions"}),G(Hr,{title:"Worker log tail",subtitle:"hidden from main interface",facts:[`tail ${i.length} lines`,"display raw only after click",`updated ${qu(u.updatedAt)}`],data:i,onRaw:l,testId:"raw-pipeline-run-worker-log"}))}function BY({diagnostics:u,onRaw:l}){let f=Du(u?.runs).filter(Xu),r=Du(u?.forbiddenResiduals),n=Xu(u?.guarantees)?u.guarantees:{},i=u?.hasNeutralNodeFinishedEvidence===!0&&u?.hasNoAuditPolicyEvidence===!0&&u?.hasAuditPolicyEvidence===!0,y=u?.ok===!0&&i&&r.length===0,t=f[0]||null,_=[{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 G("div",{className:"pipeline-oa-panel","data-testid":"pipeline-oa-event-flow-panel"},G("div",{className:"metric-grid compact"},G(pf,{label:"OA Flow",value:y?"100%":"--",hint:String(u?.mode||"waiting diagnostics"),tone:y?"ok":"warn"}),G(pf,{label:"禁止残留",value:r.length,hint:r.length===0?"source scan clean":"needs cleanup",tone:r.length===0?"ok":"warn"}),G(pf,{label:"No-audit",value:u?.hasNoAuditPolicyEvidence?"OK":"--",hint:"OA 下游策略证据",tone:u?.hasNoAuditPolicyEvidence?"ok":"warn"}),G(pf,{label:"Monitor 审核",value:u?.hasAuditPolicyEvidence?"OK":"--",hint:"OA 控制事件闭环",tone:u?.hasAuditPolicyEvidence?"ok":"warn"})),G("div",{className:"pipeline-oa-guarantees"},_.map((c)=>G("article",{key:c.label,className:`pipeline-oa-guarantee ${c.ok?"ok":"warn"}`},G(bn,{status:c.ok?"online":"warn"},c.ok?"OK":"MISS"),G("div",null,G("strong",null,c.label),G("span",null,c.hint))))),G("div",{className:"pipeline-evidence-list compact"},f.slice(0,6).map((c)=>G(Hr,{key:c.runId,title:String(c.runId||"--"),subtitle:[Number(c.monitorAuditNodeFinishedCount||0)>0?"monitor audit":"",Number(c.noAuditPolicyCount||0)>0?"no-audit policy":""].filter(Boolean).join(" / ")||"event evidence",facts:[`events ${c.eventCount||0}`,`node-finished ${c.nodeFinishedCount||0}`,`policy-in-detail ${c.nodeFinishedWithPolicyCount||0}`,`queued ${c.controlQueuedCount||0}`,`applied ${c.controlAppliedCount||0}`],data:c,onRaw:l,testId:`raw-pipeline-oa-run-${String(c.runId||"run").replace(/[^a-zA-Z0-9_.-]+/g,"-")}`}))),t?G("p",{className:"muted paragraph"},`最新证据 ${t.runId}: ${t.nodeFinishedCount||0} 个 node-finished,${t.controlAppliedCount||0} 个控制结果。`):G(Qr,{title:"暂无 OA 事件流证据",text:"等待 Pipeline backend 暴露 diagnostics。"}),u?G("div",{className:"panel-actions inline-actions"},G(sr,{title:"Pipeline OA Event Flow Diagnostics",data:u,onOpen:l,testId:"raw-pipeline-oa-event-flow"})):null)}function VY({quota:u,onRaw:l}){let f=Xu(u?.summary)?u.summary:{},r=Xu(u?.target)?u.target:{},n=Xu(u?.cache)?u.cache:{},i=u?.ok===!0,y=String(u?.modelId||f.modelName||r.modelName||"MiniMax-M2.7"),t=f.totalCount??r.currentIntervalTotalCount,_=f.usageCount??r.currentIntervalUsageCount,c=f.remainingCount??r.currentIntervalRemainingCount,A=f.remainingRatio??(Number.isFinite(Number(t))&&Number(t)>0&&Number.isFinite(Number(c))?Number(c)/Number(t):void 0),j=f.usageRatio??(Number.isFinite(Number(t))&&Number(t)>0&&Number.isFinite(Number(_))?Number(_)/Number(t):void 0),F=f.resetAt||r.endAt,J=f.remainsMs??r.remainsMs,Q=Number(c),w=!i||Number.isFinite(Q)&&Q<=0?"warn":"ok",L=[i?`endpoint ${u?.endpoint||"--"}`:"quota unavailable",`fetched ${Q6(u?.fetchedAt)}`,n.hit?`cache ${Br(n.ageMs)}`:"live quota"];return G("div",{className:"pipeline-minimax-quota-panel","data-testid":"pipeline-minimax-quota-panel"},G("div",{className:"metric-grid compact"},G(pf,{label:"MiniMax",value:i?y:"--",hint:u?.modelComponent||u?.error||"model/minimax-m27",tone:w}),G(pf,{label:"当前窗口",value:`${L9(_)}/${L9(t)}`,hint:`已用 ${rw(j)}`,tone:w}),G(pf,{label:"剩余额度",value:L9(c),hint:`剩余 ${rw(A)}`,tone:w}),G(pf,{label:"重置时间",value:Q6(F),hint:J!==void 0?`约 ${Br(J)}`:qu(F),tone:w})),G(P9,{items:L}),i?G("p",{className:"muted paragraph"},`MiniMax 限额来自 D601 Pipeline 后端实时查询;当前模型匹配 ${f.modelName||r.modelName||y}。`):G(il,{error:u?.error||"MiniMax 限额查询失败"}),u?G("div",{className:"panel-actions inline-actions"},G(sr,{title:"Pipeline MiniMax Quota",data:u,onOpen:l,testId:"raw-pipeline-minimax-quota"})):null)}function DY({epochs:u,activeRun:l,activePipeline:f,pipelineNodes:r,pipelineEdges:n,runDetails:i,nodeDetails:y,nodeDetailsState:t,ganttScale:_=P_,onGanttScaleChange:c,onRunChange:A,onIntervalSelect:j,onMarkerSelect:F,selection:J,detailOpen:Q,onDetailOpenChange:w,onRaw:L}){let[U,N]=af($Y),[q,W]=af({startY:0,endY:0,startMs:0,endMs:0}),[z,Z]=af(Date.now()),H=xn(null),E=String(l?.runId||""),D=Boolean(Q),h=(Au)=>{if(typeof w==="function")w(Au)},V=vn(_??P_),S=String(i?.runId||"")===E?i?.details:null,p=S?{...Xu(l)?l:{},...Xu(S)?S:{},runId:E,procedureRuns:Du(S?.procedureRuns).length>0?S.procedureRuns:l?.procedureRuns}:l,O=Sw(p,r,z),m=S?ZY(S,p):{markers:[],arrows:[]},X=Du(m.markers),v=_Y(p,O,X),T=UY(v,V,O,z),Y=String(T.source||"frontend-y"),k=O.map((Au)=>JY(Au,T,z)),I={startMs:Number(T.startMs),endMs:Number(T.endMs),durationMs:Math.max(1,Number(T.durationMs??Number(T.endMs)-Number(T.startMs)))},b=h9(V),o={...b,pxPerMinute:Number(T.pxPerMinute??b.pxPerMinute)},g=Math.round(Number(T.chartHeight||360)),x=O.some(b9);U0(()=>{if(!E||!x)return;let Au=window.setInterval(()=>Z(Date.now()),1000);return()=>window.clearInterval(Au)},[E,x]);let lu=dS(f,r,Array.isArray(n)?n:[]),_u=r.map((Au)=>String(Au?.id||"")).filter(Boolean),$u=k.map((Au)=>String(Au.nodeId||"")).filter(Boolean),ju=X.map((Au)=>String(Au.nodeId||"")).filter(Boolean),zu=Array.from(new Set([...lu,..._u,...$u,...ju])),Wu={startY:0,endY:g,startMs:Number(I.startMs),endMs:Number(I.endMs)},P=Number(q?.endY||0)>0?q:Wu,e=(Au)=>{return G6(Au,I,g,T)<=Number(P.endY)&&Y9(Au,I,g,T)>=Number(P.startY)},uu=(Au)=>{let su=Jr(Au,I,g,T);return su>=Number(P.startY)&&su<=Number(P.endY)},Ku=new Set(zu.filter((Au)=>k.some((su)=>su.nodeId===Au&&e(su))||X.some((su)=>su.nodeId===Au&&uu(su)))),s=U?zu.filter((Au)=>Ku.has(Au)):zu,Nu=`${W9}px ${s.length>0?s.map(()=>`${j0}px`).join(" "):"minmax(160px, 1fr)"}`,Eu=Du(T.ticks).filter(Xu),Hu=String(J?.mode==="interval"?J?.interval?.procedureRunId||"":""),vu=String(J?.mode==="event"?J?.marker?.id||"":""),ul=()=>{let Au=H.current;if(!Au){W(Wu);return}let su=Math.max(0,Au.scrollTop-w9),Jf=Math.max(120,Au.clientHeight-w9),pu=Math.min(g,su+Jf),ff={startY:su,endY:pu,startMs:Number(I.startMs),endMs:Number(I.endMs)},rf=Math.max(0,Math.min(1,su/g)),ur=Math.max(rf,Math.min(1,pu/g)),nf=Math.max(1,Number(I.endMs)-Number(I.startMs));ff.startMs=Number(I.startMs)+nf*rf,ff.endMs=Number(I.startMs)+nf*ur,W(ff)};U0(()=>{let Au=H.current,su=window.setTimeout(ul,0);return Au?.addEventListener("scroll",ul),window.addEventListener("resize",ul),()=>{window.clearTimeout(su),Au?.removeEventListener("scroll",ul),window.removeEventListener("resize",ul)}},[E,I.startMs,I.endMs,g]);let mu=Math.max(0,zu.length-s.length),Fl=new Set(X.filter((Au)=>s.includes(String(Au.nodeId||""))&&uu(Au)).map((Au)=>String(Au.id))),Uf=new Map(X.map((Au)=>[String(Au.id),Au])),Ef=Du(m.arrows).filter((Au)=>{if(!Fl.has(String(Au.targetMarkerId||"")))return!1;if(String(Au.action||"")==="observe")return s.includes(String(Au.sourceNodeId||""));return Fl.has(String(Au.sourceMarkerId||""))}),lf=W9+Math.max(1,s.length)*j0,ol=(Au)=>{let su=vn(Au.target.value);if(typeof c==="function")c(su);window.setTimeout(ul,0)},Zf=()=>iY({title:`${f?.id||"pipeline"}-${E||"epoch"}-gantt`,meta:[`run ${E||"--"}`,`${qu(I.startMs)} -> ${qu(I.endMs)}`,`duration ${Br(I.durationMs)}`,`${o.label} / ${E9(o.pxPerMinute)} px/min`,`${s.length}/${zu.length} nodes`,`${X.length} markers`],visibleNodeIds:s,intervals:k,markers:X.filter((Au)=>s.includes(String(Au.nodeId||""))),arrows:Ef,ticks:Eu,bounds:I,chartHeight:g,backendLayout:T}),mf=Xu(S?.gantt?.diagnostics)?S.gantt.diagnostics:null;return G(F0,{title:"Epoch 甘特图",eyebrow:`${f?.id||"pipeline"} / ${u.length} epochs`,className:"pipeline-wide-panel",loading:i?.loading,actions:G("div",{className:"pipeline-gantt-actions"},G("select",{value:E,disabled:u.length===0,onChange:(Au)=>A(Au.target.value),"data-testid":"pipeline-epoch-select"},u.map((Au)=>G("option",{key:Au.runId,value:Au.runId},X9(u,Au)))),G("label",{className:"pipeline-gantt-toggle"},G("input",{type:"checkbox","data-testid":"pipeline-gantt-auto-hide-idle",checked:U,onChange:(Au)=>{N(Boolean(Au.target.checked)),window.setTimeout(ul,0)}}),G("span",null,"自动隐藏空闲列")),G("label",{className:"pipeline-gantt-scale"},G("span",null,G("b",null,"时间尺度"),G("em",{"data-testid":"pipeline-gantt-scale-label"},`${o.label} · ${E9(o.pxPerMinute)} px/min`)),G("input",{type:"range",min:0,max:100,step:0.01,value:V,onChange:ol,"aria-label":"调整甘特图时间尺度","data-testid":"pipeline-gantt-time-scale"}),G("small",null,G("span",null,"全局"),G("span",null,"细节"))),l?G("button",{type:"button",className:"ghost-btn",onClick:Zf,disabled:s.length===0,"data-testid":"pipeline-export-gantt"},"导出甘特图"):null,l?G(sr,{title:`Pipeline Epoch ${l.runId}`,data:l,onOpen:L,testId:"raw-pipeline-epoch-gantt"}):null)},!l?G(Qr,{title:"暂无 Epoch",text:"当前 pipeline 还没有完整运行记录。"}):k.length===0?G(Qr,{title:"暂无时间区间",text:"等待 D601 Pipeline backend 在 procedure summary 中返回 startedAt / finishedAt。"}):G("div",{className:"pipeline-gantt-wrap"},G("div",{className:`pipeline-gantt-detail-layout ${D?"detail-open":"detail-collapsed"}`,"data-testid":"pipeline-gantt-detail-layout","data-sidebar-open":D?"true":"false"},G("div",{className:"pipeline-gantt-main"},G("div",{className:"pipeline-gantt-main-head"},G("div",{className:"pipeline-gantt-meta"},G("span",null,`time ${qu(I.startMs)} -> ${qu(I.endMs)}`),G("span",null,`duration ${Br(I.durationMs)}`),G("span",null,`scale ${o.label} / ${E9(o.pxPerMinute)} px/min`),G("span",null,`layout ${Y}`),mf?G("span",null,`align ${mf.timeAxisAlignmentOk===!1?"check":"ok"}`):null,G("span",null,`visible ${s.length}/${zu.length} nodes`),S?G("span",null,`markers ${X.length}`):null,U&&mu>0?G("span",null,`hidden idle ${mu}`):null),!D?G("button",{type:"button",className:"pipeline-sidecar-tab right",disabled:!J?.mode,onClick:()=>h(!0),"data-testid":"pipeline-gantt-sidebar-toggle"},J?.mode?"展开详情":"点击甘特图元素展开详情"):null),G("div",{className:"pipeline-gantt-viewport",ref:H,"data-testid":"pipeline-epoch-gantt","data-pipeline-id":f?.id||"","data-run-id":E,"data-layout-source":Y,"data-start-ms":String(I.startMs),"data-end-ms":String(I.endMs),"data-chart-height":String(g)},G("div",{className:"pipeline-gantt-board",style:{gridTemplateColumns:Nu,minWidth:`${lf}px`}},G("div",{className:"pipeline-gantt-head time"},"Time"),s.length===0?G("div",{className:"pipeline-gantt-head empty"},"当前时间窗无工作节点"):s.map((Au)=>G("div",{key:`head-${Au}`,className:"pipeline-gantt-head node",title:Au,"data-testid":"pipeline-gantt-head-node","data-node-id":Au},G(XS,{value:Au}))),G("div",{className:"pipeline-gantt-time-axis",style:{height:`${g}px`}},Eu.map((Au)=>{let su=Mw(Au,I,g,T);return G("div",{key:`tick-${Au.ms}-${su}`,className:"pipeline-gantt-tick",style:{top:`${su}px`},"data-testid":"pipeline-gantt-tick","data-ms":String(Au.ms),"data-y":String(su)},G("b",null,qu(Au.ms)),G("span",null,`+${Br(Number(Au.offsetMs??Number(Au.ms)-Number(I.startMs)))}`))})),s.length>0?G("svg",{className:"pipeline-gantt-arrow-layer",width:s.length*j0,height:g,viewBox:`0 0 ${s.length*j0} ${g}`,style:{left:`${W9}px`,top:`${w9}px`,width:`${s.length*j0}px`,height:`${g}px`},"aria-hidden":"true"},G("defs",null,G("marker",{id:"pipeline-gantt-arrowhead",viewBox:"0 0 10 10",refX:9,refY:5,markerWidth:6,markerHeight:6,orient:"auto-start-reverse"},G("path",{d:"M 0 0 L 10 5 L 0 10 z",fill:"context-stroke"}))),Ef.map((Au)=>{let su=Uf.get(String(Au.targetMarkerId||""));if(!su)return null;let Jf=Uf.get(String(Au.sourceMarkerId||"")),pu=String(Jf?.nodeId||Au.sourceNodeId||""),ff=s.indexOf(pu),rf=s.indexOf(String(su.nodeId||""));if(ff<0||rf<0)return null;let ur=ff*j0+j0/2,nf=rf*j0+j0/2,Of=Jf?Jr(Jf,I,g,T):Jr(su,I,g,T),N0=Jr(su,I,g,T);return G("path",{key:Au.id,className:`pipeline-gantt-arrow ${String(Au.sourceKind||"").toLowerCase()} ${String(Au.status||"").toLowerCase()} ${String(Au.action||"").toLowerCase()}`,d:Rw(ur,Of,nf,N0),markerEnd:"url(#pipeline-gantt-arrowhead)","data-testid":String(Au.action||"")==="observe"?"pipeline-gantt-observation-arrow":"pipeline-gantt-arrow","data-source-node-id":String(Au.sourceNodeId||""),"data-target-node-id":String(Au.targetNodeId||""),"data-target-marker-id":String(Au.targetMarkerId||""),"data-action":String(Au.action||""),"data-source-y":String(Of),"data-target-y":String(N0)})})):null,s.length===0?G("div",{className:"pipeline-gantt-empty-col",style:{height:`${g}px`}},"滚动到有活动的时间段后,相关 node 列会自动出现。"):s.map((Au)=>{let su=k.filter((pu)=>pu.nodeId===Au),Jf=X.filter((pu)=>String(pu.nodeId||"")===Au);return G("div",{key:`col-${Au}`,className:"pipeline-gantt-node-col",style:{height:`${g}px`}},su.map((pu)=>{let ff=G6(pu,I,g,T),rf=Y9(pu,I,g,T),ur=Cw(pu,I,g,T),nf=String(pu.procedureRunId||`${Au}-${pu.startMs}`);return G("button",{key:nf,type:"button",className:`pipeline-gantt-bar ${pu.status} ${pu.live?"live":""} ${Hu===nf?"selected":""}`,style:{top:`${ff}px`,height:`${ur}px`},title:`${Au} ${pu.status} ${qu(pu.startedAt||pu.startMs)} -> ${qu(pu.finishedAt||pu.endMs)}`,onClick:()=>j(pu),"data-testid":"pipeline-gantt-line","data-node-id":Au,"data-procedure-run-id":String(pu.procedureRunId||""),"data-status":String(pu.status||""),"data-live":pu.live?"true":"false","data-start-ms":String(pu.startMs||""),"data-end-ms":String(pu.endMs||""),"data-y1":String(ff),"data-y2":String(rf),"data-natural-height":String(Math.max(0,rf-ff))},G("strong",null,pu.status||"working"),G("span",null,Br(pu.durationMs)))}),Jf.map((pu)=>G("button",{key:pu.id,type:"button",className:`pipeline-gantt-marker ${pu.kind} ${pu.tone||""} ${pu.status||""} ${vu===String(pu.id)?"selected":""}`,style:{top:`${Jr(pu,I,g,T)}px`},title:`${pu.label||"event"} / ${qu(pu.timestampIso||pu.timestamp||pu.ms)}`,onClick:()=>F(pu),"data-testid":pu.kind==="prompt"?"pipeline-gantt-prompt-marker":"pipeline-gantt-control-marker","data-marker-id":String(pu.id||""),"data-ms":String(pu.ms??pu.eventMs??""),"data-y":String(Jr(pu,I,g,T))})))})))),D?G(DS,{selection:J,runDetails:i,nodeDetails:y,nodeDetailsState:t,onRaw:L,onCollapse:()=>h(!1)}):null)))}function h0(){return{loading:!1,actionLoading:"",error:"",message:"",details:null,fetchedAt:null,appendPrompt:"",guidePrompt:"",modifyPrompt:"",approveReason:"",redoReason:""}}function Rn(){return{mode:"",runId:"",interval:null,marker:null}}function Z9(){return{runId:"",loading:!1,error:"",details:null,fetchedAt:null}}function V_(u,l){return`${u}/microservices/pipeline/proxy${l}`}function XY({activeRun:u,pipelineRuns:l,selectedRunId:f,onRunChange:r,selectedNodeId:n,selectedNodeConfig:i,selectedNodeRuntime:y,control:t,onControlChange:_,onFetch:c,onAction:A,onRaw:j,onCollapse:F}){let J=String(u?.runId||""),Q=String(y?.status||"pending"),w=!J||!n||t.loading||Boolean(t.actionLoading),L=(N)=>(q)=>_({[N]:q.target.value,error:"",message:""}),U=l.length>0?l:u?[u]:[];return G("aside",{className:"pipeline-node-control","data-testid":"pipeline-node-control"},G("div",{className:"pipeline-node-control-head"},G("div",null,G("p",{className:"panel-eyebrow"},"Manual Node Control"),G(nl,{title:n||"点击控制图中的 node",level:3,loading:t.loading||Boolean(t.actionLoading)})),G("div",{className:"pipeline-node-control-head-actions"},n?G(bn,{status:Q},Q):G(bn,{status:"pending"},"idle"),G("button",{type:"button",className:"ghost-btn mini",onClick:F,"data-testid":"pipeline-node-sidebar-collapse"},"收起"))),G("div",{className:"pipeline-control-runbar"},G("label",null,G("span",null,"目标 run"),G("select",{value:J||f,disabled:U.length===0,onChange:(N)=>r(N.target.value),"data-testid":"pipeline-node-run-select"},U.map((N)=>G("option",{key:N.runId,value:N.runId},`${N.runId||"--"} / ${N.status||"--"}`)))),G("button",{type:"button",className:"ghost-btn",disabled:w,onClick:c,"data-testid":"pipeline-node-fetch"},t.loading?"抓取中":"抓取过程"),t.details?G(sr,{title:`Pipeline Node ${n}`,data:t.details,onOpen:j,testId:"raw-pipeline-node-control"}):null),G("div",{className:"pipeline-control-meta"},G("span",null,G("b",null,"kind"),String(i?.kind||"--")),G("span",null,G("b",null,"procedure"),String(y?.currentProcedureRunId||"--")),G("span",null,G("b",null,"attempts"),String(y?.attempts??"--")),G("span",null,G("b",null,"updated"),qu(u?.updatedAt))),!n?G(Qr,{title:"未选择 node",text:"点击 React Flow 控制图中的任意 node 后,可抓取执行过程、追加 prompt、下发引导、增量修改、审核通过或重做。"}):null,G(il,{error:t.error,wide:!0}),G("div",{className:"pipeline-control-actions"},G("label",null,G("span",null,"实时追加 prompt(仅 running node)"),G("textarea",{value:t.appendPrompt,onChange:L("appendPrompt"),placeholder:"让当前执行中的 agent 继续、补充检查或调整当前步骤...",rows:4,disabled:!n,"data-testid":"pipeline-node-append-input"}),G("button",{type:"button",className:"primary-btn compact",disabled:w||!String(t.appendPrompt||"").trim(),onClick:()=>A("append"),"data-testid":"pipeline-node-append-button"},t.actionLoading==="append"?"追加中":"追加到运行中 node")),G("label",null,G("span",null,"下次尝试引导 prompt"),G("textarea",{value:t.guidePrompt,onChange:L("guidePrompt"),placeholder:"给该 node 下一次 attempt 的执行提示;不会立即打断当前 session。",rows:4,disabled:!n,"data-testid":"pipeline-node-guide-input"}),G("button",{type:"button",className:"ghost-btn compact",disabled:w||!String(t.guidePrompt||"").trim(),onClick:()=>A("guide"),"data-testid":"pipeline-node-guide-button"},t.actionLoading==="guide"?"下发中":"下发 guide")),G("label",null,G("span",null,"完成后增量修改 prompt"),G("textarea",{value:t.modifyPrompt,onChange:L("modifyPrompt"),placeholder:"在该 node 已完成结果基础上追加修改要求;runner 会重跑目标 node,并保留同 node 既有 OA 输出作为上下文。",rows:4,disabled:!n,"data-testid":"pipeline-node-modify-input"}),G("button",{type:"button",className:"ghost-btn compact",disabled:w||!String(t.modifyPrompt||"").trim(),onClick:()=>A("modify"),"data-testid":"pipeline-node-modify-button"},t.actionLoading==="modify"?"排队中":"增量修改 node")),G("label",null,G("span",null,"Monitor 审核通过原因"),G("textarea",{value:t.approveReason,onChange:L("approveReason"),placeholder:"当流程配置开启 monitor 审核时,记录审核通过原因并释放后续 node。",rows:3,disabled:!n,"data-testid":"pipeline-node-approve-input"}),G("button",{type:"button",className:"primary-btn compact",disabled:w||!String(t.approveReason||"").trim(),onClick:()=>A("approve"),"data-testid":"pipeline-node-approve-button"},t.actionLoading==="approve"?"提交中":"审核通过")),G("label",null,G("span",null,"重做 / restart 原因"),G("textarea",{value:t.redoReason,onChange:L("redoReason"),placeholder:"说明为什么需要重做;runner 会重置目标 node 以及非 rework 下游 node。",rows:4,disabled:!n,"data-testid":"pipeline-node-redo-input"}),G("button",{type:"button",className:"danger-btn compact",disabled:w||!String(t.redoReason||"").trim(),onClick:()=>A("redo"),"data-testid":"pipeline-node-redo-button"},t.actionLoading==="redo"?"排队中":"重做 node"))),G("div",{className:"pipeline-control-evidence"},G("strong",null,"Node 过程索引"),G(OY,{details:t.details,selectedNodeId:n,selectedNodeRuntime:y,control:t,onRaw:j})))}function xw({microservices:u,onRaw:l,apiBaseUrl:f="/api"}){let r=u.find((fu)=>fu.id==="pipeline")||null,[n,i]=af({loading:!1,error:"",health:null,snapshot:null,oaDiagnostics:null,minimaxQuota:null,refreshedAt:null}),[y,t]=af(""),[_,c]=af(""),[A,j]=af(""),[F,J]=af(h0()),[Q,w]=af({}),[L,U]=af(Rn()),[N,q]=af(Z9()),[W,z]=af(P_),[Z,H]=af(!1),[E,D]=af(!1),h=xn(0),{addNotification:V}=Xf(),S=xn(!1),p=xn(0),O=xn(""),m=xn({}),X=xn(""),v=xn("");async function T(fu={}){let Bu=fu.silent===!0;if(!r)return;if(S.current)return;S.current=!0;let Yu=h.current+1;if(h.current=Yu,!Bu)i((au)=>({...au,loading:!0,error:""}));try{let au=`__unideskArrayLimit=registry.components:80,runs:${JS}`,[_l,Pl,yl]=await Promise.all([Mn(`${f}/microservices/pipeline/proxy/api/snapshot?${au}`,{cache:"no-store"}),Mn(`${f}/microservices/pipeline/proxy/api/oa-event-flow/diagnostics`,{cache:"no-store"}).catch((Xr)=>({ok:!1,error:Ou(Xr,"OA event flow diagnostics failed")})),Mn(`${f}/microservices/pipeline/proxy/api/model-quota/minimax`,{cache:"no-store"}).catch((Xr)=>({ok:!1,error:Ou(Xr,"MiniMax quota failed")}))]);if(Yu!==h.current)return;let Qf={ok:_l?.ok!==!1,service:"pipeline-v2-control snapshot"};i({loading:!1,error:"",health:Qf,snapshot:_l,oaDiagnostics:Pl,minimaxQuota:yl,refreshedAt:new Date})}catch(au){if(Yu!==h.current)return;i((_l)=>({..._l,loading:!1,error:Ou(au,"Pipeline 加载失败")}))}finally{S.current=!1}}U0(()=>{if(T(),!r)return;let fu=()=>{if(A6())T({silent:!0})},Bu=window.setInterval(()=>{fu()},uw),Yu=()=>{if(A6())fu()};return document.addEventListener("visibilitychange",Yu),()=>{window.clearInterval(Bu),document.removeEventListener("visibilitychange",Yu)}},[r?.id,r?.runtime?.providerStatus,f]);let Y=SS(r),k=pS(r),I=YS(r),b=n.snapshot||{},o=n.oaDiagnostics||null,g=n.minimaxQuota||null,{components:x,pipelines:lu,runs:_u}=mS(b),$u=String(_u[0]?.pipelineId||""),ju=($u?lu.find((fu)=>String(fu.id||"")===$u):null)||lu[0]||{},zu=lu.find((fu)=>String(fu.id||"")===y)||ju,Wu=String(zu.id||""),P=Hw(zu),e=M9(zu),uu=Qw(_u,Wu),Ku=tY(_u,Wu),s=Ku.find((fu)=>String(fu?.runId||"")===_)||uu,Nu=String(N.runId||"")===String(s?.runId||"")?RS(N.details):null,Eu=xS(s,Nu),Hu=String(Eu?.runId||""),vu=P.find((fu)=>String(fu?.id||"")===A)||null,ul=A?Bw(Eu,A):null,mu=CS(_u),Fl=kS(x),Uf=Number(n.health?.components)||$w(b,"registry.components",x.length),Ef=$w(b,"runs",_u.length),lf=jw(zu,Eu,x),ol={nodes:lf.nodes.map((fu)=>fu.id===A?{...fu,selected:!0,className:`${fu.className||""} selected-control-node`}:fu),edges:lf.edges},Zf=lu.map((fu)=>{let Bu=String(fu.id||"pipeline"),Yu=Qw(_u,Bu);return{title:`${Bu}-${Yu?.runId||"snapshot"}`,flow:jw(fu,Yu,x)}}),mf=String(L?.runId||Hu||""),Au=String(L?.interval?.nodeId||L?.marker?.nodeId||""),su=mf&&Au?Q[T9(mf,Au)]||null:null,Jf=q6(F.details,mf,Au),pu=q6(su?.details,mf,Au)||Jf,ff=mf&&Au?{...Xu(su)?su:{},runId:mf,nodeId:Au,details:pu,loading:Boolean(su?.loading)||!pu&&Boolean(F.loading)&&A===Au,error:String(su?.error||""),fetchedAt:su?.fetchedAt||(Jf?F.fetchedAt:null)}:null,rf=Ku.map((fu)=>String(fu?.runId||"")).filter(Boolean).join("|"),ur=P.map((fu)=>String(fu?.id||"")).filter(Boolean).join("|");U0(()=>{X.current=A},[A]),U0(()=>{v.current=Hu},[Hu]),U0(()=>{if(!_||rf.split("|").includes(_))return;c("")},[_,rf]),U0(()=>{if(!A||ur.split("|").includes(A))return;j(""),J(h0()),U(Rn()),H(!1),D(!1)},[A,ur]),U0(()=>{if(!A)H(!1)},[A]),U0(()=>{if(!L.mode)D(!1)},[L.mode]);async function nf(fu=Hu,Bu={}){if(!fu){q(Z9());return}let Yu=vn(Bu.scale??W??P_),au=`${fu}:timeline`;if(O.current===au)return;O.current=au;let _l=Bu.silent===!0,Pl=p.current+1;p.current=Pl,q((yl)=>({runId:fu,scale:Yu,loading:!_l||String(yl.runId||"")!==fu||!yl.details,error:"",details:_l&&yl.runId===fu?yl.details:yl.runId===fu?yl.details:null,fetchedAt:yl.runId===fu?yl.fetchedAt:null}));try{let[yl,Qf]=await Promise.all([Mn(V_(f,`/api/node-control/runs/${encodeURIComponent(fu)}?tail=160&view=timeline`),{cache:"no-store",strictJson:!0}),Mn(V_(f,`/api/runs/${encodeURIComponent(fu)}`),{cache:"no-store"}).catch((Xr)=>({ok:!1,runSummaryError:Ou(Xr,"抓取评分失败")}))]);if(Pl!==p.current)return;q({runId:fu,scale:Yu,loading:!1,error:"",details:{...yl,run:Xu(Qf?.run)?Qf.run:void 0,runSummaryError:Qf?.runSummaryError},fetchedAt:new Date})}catch(yl){if(Pl!==p.current)return;q((Qf)=>({runId:fu,scale:Yu,loading:!1,error:Ou(yl,"抓取 epoch 执行过程失败"),details:Qf.runId===fu?Qf.details:null,fetchedAt:Qf.runId===fu?Qf.fetchedAt:null}))}finally{if(O.current===au)O.current=""}}function Of(fu,Bu,Yu){let au=T9(fu,Bu);w((_l)=>{let Pl={..._l,[au]:{...Xu(_l?.[au])?_l[au]:{},runId:fu,nodeId:Bu,...Yu}},yl=Object.keys(Pl);if(yl.length>32)for(let Qf of yl.slice(0,yl.length-32))delete Pl[Qf];return Pl})}async function N0(fu,Bu){if(!fu||!Bu)return;let Yu=T9(fu,Bu),au=Number(m.current?.[Yu]||0)+1;m.current={...m.current,[Yu]:au},Of(fu,Bu,{loading:!0,error:""});try{let _l=await Mn(V_(f,`/api/node-control/runs/${encodeURIComponent(fu)}/nodes/${encodeURIComponent(Bu)}?tail=160`),{cache:"no-store",strictJson:!0});if(Number(m.current?.[Yu]||0)!==au)return;let Pl=new Date;if(Of(fu,Bu,{loading:!1,details:_l,fetchedAt:Pl,error:""}),X.current===Bu&&v.current===fu)J((yl)=>({...yl,loading:!1,details:_l,fetchedAt:Pl,error:""}))}catch(_l){if(Number(m.current?.[Yu]||0)!==au)return;Of(fu,Bu,{loading:!1,error:Ou(_l,"抓取 Gantt node 详情失败")})}}U0(()=>{if(!Hu){q(Z9());return}nf(Hu);let fu=()=>{if(A6())nf(Hu,{silent:!0})},Bu=window.setInterval(()=>{fu()},uw),Yu=()=>{if(A6())fu()};return document.addEventListener("visibilitychange",Yu),()=>{window.clearInterval(Bu),document.removeEventListener("visibilitychange",Yu)}},[Hu,f]);async function lr(fu=Hu,Bu=A){if(!fu||!Bu){J((Yu)=>({...Yu,error:"请先选择 run 和 node",message:""}));return}J((Yu)=>({...Yu,loading:!0,error:"",message:""}));try{let Yu=await Mn(V_(f,`/api/node-control/runs/${encodeURIComponent(fu)}/nodes/${encodeURIComponent(Bu)}?tail=160`),{cache:"no-store",strictJson:!0}),au=new Date;J((_l)=>({..._l,loading:!1,details:Yu,fetchedAt:au,error:""})),Of(fu,Bu,{loading:!1,details:Yu,fetchedAt:au,error:""})}catch(Yu){J((au)=>({...au,loading:!1,error:Ou(Yu,"抓取 node 执行过程失败")}))}}async function k0(fu){let Bu=String(fu?.runId||Hu||""),Yu=String(fu?.nodeId||"");if(U({mode:"interval",runId:Bu,interval:fu,marker:null}),D(!0),!Bu||!Yu)return;if(Bu!==Hu)c(Bu);j(Yu),J(h0()),nf(Bu,{silent:!0}),N0(Bu,Yu)}async function Ul(fu){let Bu=String(fu?.runId||Hu||""),Yu=String(fu?.nodeId||"");if(U({mode:"event",runId:Bu,interval:null,marker:fu}),D(!0),!Bu)return;if(Bu!==Hu)c(Bu);if(nf(Bu,{silent:!0}),!Yu)return;j(Yu),J(h0()),N0(Bu,Yu)}async function bi(fu){if(!Hu||!A){J((au)=>({...au,error:"请先选择 run 和 node",message:""}));return}let Bu=fu==="append"?"prompts":fu,Yu=fu==="append"?F.appendPrompt:fu==="guide"?F.guidePrompt:fu==="modify"?F.modifyPrompt:fu==="approve"?F.approveReason:F.redoReason;if(!String(Yu||"").trim()){J((au)=>({...au,error:"操作内容不能为空",message:""}));return}J((au)=>({...au,actionLoading:fu,error:"",message:""}));try{let au=fu==="redo"||fu==="approve"?{reason:Yu,source:"unidesk-frontend",sourceKind:"webui"}:{prompt:Yu,source:"unidesk-frontend",sourceKind:"webui"},_l=await Mn(V_(f,`/api/node-control/runs/${encodeURIComponent(Hu)}/nodes/${encodeURIComponent(A)}/${Bu}`),{method:"POST",body:JSON.stringify(au)});if(J((yl)=>({...yl,actionLoading:"",details:_l,fetchedAt:new Date,appendPrompt:fu==="append"?"":yl.appendPrompt,guidePrompt:fu==="guide"?"":yl.guidePrompt,modifyPrompt:fu==="modify"?"":yl.modifyPrompt,approveReason:fu==="approve"?"":yl.approveReason,redoReason:fu==="redo"?"":yl.redoReason,message:fu==="append"?"已追加到运行中 node":fu==="guide"?"已下发 guide,等待 runner 处理":fu==="modify"?"已排队增量修改命令":fu==="approve"?"已提交审核通过决策":"已排队重做命令"})),V("success",fu==="append"?"已追加到运行中 node":fu==="guide"?"已下发 guide,等待 runner 处理":fu==="modify"?"已排队增量修改命令":fu==="approve"?"已提交审核通过决策":"已排队重做命令"),await lr(Hu,A),await nf(Hu,{silent:!0}),fu!=="append")await T()}catch(au){J((_l)=>({..._l,actionLoading:"",error:Ou(au,"node 控制操作失败")}))}}if(!r)return G(Qr,{title:"Pipeline 未登记",text:"请在 config.json 的 microservices 中登记用户服务 id=pipeline"});return G("div",{className:"pipeline-page","data-testid":"pipeline-page"},G(F0,{title:"Pipeline v2 工作台",eyebrow:"D601 Snapshot 用户服务",loading:n.loading,actions:G("div",{className:"panel-actions"},G("button",{type:"button",className:"ghost-btn",onClick:T,disabled:n.loading,"data-testid":"pipeline-refresh-button"},n.loading?"刷新中":"刷新"),G(sr,{title:"Pipeline 用户服务",data:r,onOpen:l,testId:"raw-pipeline-service"}))},G("div",{className:"pipeline-hero"},G("div",null,G("div",{className:"node-version-line"},G(bn,{status:Y.providerStatus==="online"?"online":"warn"},Y.providerStatus||"unknown"),G("span",null,r.providerId),G("span",null,I.public?"公网暴露":"仅 UniDesk frontend 代理访问")),G("p",{className:"muted paragraph"},r.description)),G("div",{className:"microservice-ref-card"},G("span",null,"Repo"),G("strong",null,k.url||"--"),G("code",null,k.commitId||"--")),G("div",{className:"microservice-ref-card"},G("span",null,"D601 Docker"),G("strong",null,`${I.nodeBindHost||"--"}:${I.nodePort||"--"}`),G("code",null,`${k.composeFile||"--"} / ${k.composeService||"--"}`))),G(il,{error:n.error,wide:!0})),G("div",{className:"pipeline-grid"},G(F0,{title:"控制图",eyebrow:`${zu.id||"pipeline"} / run ${Eu?.status||"--"}`,className:"pipeline-wide-panel",loading:n.loading,actions:G("div",{className:"pipeline-toolbar"},G("select",{value:Wu,disabled:lu.length===0,onChange:(fu)=>{t(fu.target.value),c(""),j(""),J(h0()),U(Rn()),H(!1),D(!1)},"data-testid":"pipeline-select"},lu.map((fu)=>G("option",{key:fu.id,value:fu.id},fu.id||fu.key))),G("select",{value:Hu,disabled:Ku.length===0,onChange:(fu)=>{if(c(fu.target.value),J(h0()),U(Rn()),H(!1),D(!1),A)lr(fu.target.value,A)},"data-testid":"pipeline-run-select"},Ku.map((fu)=>G("option",{key:fu.runId,value:fu.runId},X9(Ku,fu)))),G("button",{type:"button",className:"ghost-btn",disabled:ol.nodes.length===0,onClick:()=>Xw(ol,`${zu.id||"pipeline"}-${Eu?.runId||"snapshot"}`),"data-testid":"pipeline-export-graph"},"导出渲染图"),G("button",{type:"button",className:"ghost-btn",disabled:Zf.every((fu)=>fu.flow.nodes.length===0),onClick:()=>yY(Zf),"data-testid":"pipeline-export-all-graphs"},"批量导出"))},P.length===0?G(Qr,{title:"暂无控制图",text:"等待 D601 pipeline backend 返回 config.nodes / config.edges"}):G("div",{className:`pipeline-control-shell ${Z?"detail-open":"detail-collapsed"}`,"data-testid":"pipeline-control-shell","data-sidebar-open":Z?"true":"false"},G("div",{className:"pipeline-flow-frame","data-testid":"pipeline-react-flow"},G(IW,{nodes:ol.nodes,edges:ol.edges,nodeTypes:wS,edgeTypes:WS,fitView:!0,fitViewOptions:{padding:0.18},nodesDraggable:!1,nodesConnectable:!1,elementsSelectable:!0,minZoom:0.25,maxZoom:1.4,proOptions:{hideAttribution:!0},onNodeClick:(fu,Bu)=>{let Yu=String(Bu.id);if(j(Yu),J(h0()),H(!0),Hu)lr(Hu,Yu)}},G(sW,{gap:22,size:1,color:"rgba(215, 161, 58, 0.24)"}),G(oW,{showInteractive:!1})),!Z?G("button",{type:"button",className:"pipeline-sidecar-tab right",disabled:!A,onClick:()=>H(!0),"data-testid":"pipeline-node-sidebar-toggle"},A?"展开 node 控制":"点击 node 展开控制"):null),Z?G(XY,{activeRun:Eu,pipelineRuns:Ku,selectedRunId:_,onRunChange:(fu)=>{if(c(fu),J(h0()),U(Rn()),A)lr(fu,A)},selectedNodeId:A,selectedNodeConfig:vu,selectedNodeRuntime:ul,control:F,onControlChange:(fu)=>J((Bu)=>({...Bu,...fu})),onFetch:()=>lr(),onAction:bi,onRaw:l,onCollapse:()=>H(!1)}):null),G("div",{className:"pipeline-flow-summary"},G("span",null,`${ol.nodes.length} nodes`),G("span",null,`${ol.edges.length} edges`),G("span",null,`${lu.length} pipelines`),G("span",null,`source config+components(${x.length})`),G("span",null,`run ${Eu?.runId||"--"}`),G("span",null,`score ${D9(Eu)}`),G("span",null,A?`selected ${A}`:"click node to control"))),G(DY,{epochs:Ku,activeRun:Eu,activePipeline:zu,pipelineNodes:P,pipelineEdges:e,selection:L,detailOpen:E,onDetailOpenChange:D,runDetails:N,nodeDetails:pu,nodeDetailsState:ff,ganttScale:W,onGanttScaleChange:z,onIntervalSelect:k0,onMarkerSelect:Ul,onRunChange:(fu)=>{if(c(fu),J(h0()),U(Rn()),D(!1),A)lr(fu,A)},onRaw:l}),G(F0,{title:"观测指标",eyebrow:n.refreshedAt?`Updated ${tl(n.refreshedAt)}`:"Snapshot",loading:n.loading},G("div",{className:"metric-grid"},G(pf,{label:"Health",value:n.health?.ok?"OK":"--",hint:n.health?.service||"D601 /health",tone:n.health?.ok?"ok":"warn"}),G(pf,{label:"组件",value:Uf,hint:"components registry",tone:b?.registry?.ok===!1?"warn":"ok"}),G(pf,{label:"Pipeline",value:lu.length,hint:`${P.length} nodes / ${e.length} edges`}),G(pf,{label:"运行记录",value:Ef,hint:`${mu.succeeded||0} succeeded / ${mu.running||0} running`}),G(pf,{label:"OA 记录",value:Array.isArray(uu?.submissions)?uu.submissions.length:0,hint:uu?.runId||"latest run"}),G(pf,{label:"Procedure",value:Array.isArray(uu?.procedureRuns)?uu.procedureRuns.length:0,hint:uu?.status||"no run"}),G(pf,{label:"Score",value:D9(Eu),hint:Eu?.runId||"selected epoch",tone:x9(Eu)})),G("div",{className:"panel-actions inline-actions"},G(sr,{title:"Pipeline Snapshot",data:b,onOpen:l,testId:"raw-pipeline-snapshot"}))),G(F0,{title:"评分器",eyebrow:Eu?.runId||"selected epoch",loading:n.loading},G(vS,{run:Eu,onRaw:l})),G(F0,{title:"MiniMax 限额",eyebrow:"model/minimax-m27 quota",loading:n.loading},G(VY,{quota:g,onRaw:l})),G(F0,{title:"OA 事件流",eyebrow:"100% event-driven diagnostics",className:"pipeline-wide-panel",loading:n.loading},G(BY,{diagnostics:o,onRaw:l})),G(F0,{title:"组件矩阵",eyebrow:`${Fl.length} classes`,loading:n.loading},Fl.length===0?G(Qr,{title:"暂无组件",text:"等待 D601 pipeline backend 返回 registry.components"}):G("div",{className:"component-strata"},Fl.map((fu)=>G("article",{key:fu.name,className:"component-stratum"},G("span",null,fu.name),G("strong",null,fu.count)))),G("div",{className:"pipeline-component-list"},x.slice(0,12).map((fu)=>G("span",{key:fu.key,className:"data-chip"},G("b",null,fu.componentClass||"--"),G("span",null,fu.id||fu.key||"--"))))),G(F0,{title:"Epoch 列表",eyebrow:`${Ku.length}/${Ef} preview`,loading:n.loading},Ku.length===0?G(Qr,{title:"暂无运行记录",text:"当前 pipeline 在 .state/pipeline-runs 中还没有 epoch。"}):G("div",{className:"pipeline-run-list"},Ku.map((fu)=>{let Bu=String(fu?.runId||"")===Hu?Eu:fu;return G("article",{key:fu.runId,className:`pipeline-run-card ${String(fu.runId||"")===Hu?"active":""}`,role:"button",tabIndex:0,onClick:()=>{c(String(fu.runId||"")),U(Rn())},onKeyDown:(Yu)=>{if(Yu.key==="Enter"||Yu.key===" ")c(String(fu.runId||"")),U(Rn())}},G("div",{className:"node-card-head"},G("strong",null,X9(Ku,fu)),G(bn,{status:fu.status},fu.status||"--")),G("div",{className:"docker-meta compact"},G("span",null,Bu?.pipelineId||"--"),G("span",null,`nodes ${Array.isArray(Bu?.nodes)?Bu.nodes.length:0}`),G("span",null,`oa ${Array.isArray(Bu?.submissions)?Bu.submissions.length:0}`),G("span",null,`procedures ${Array.isArray(Bu?.procedureRuns)?Bu.procedureRuns.length:0}`),G(bS,{run:Bu})),G("p",{className:"muted paragraph"},N6(Bu?.task)),G("span",{className:"pipeline-run-time"},qu(Bu?.updatedAt)))}))),G(F0,{title:"运行材料索引",eyebrow:Eu?.runId||"selected epoch",className:"pipeline-wide-panel",loading:n.loading},G(HY,{activeRun:Eu,onRaw:l}))))}var H6=Pu(Jl(),1);var tu=H6.default.createElement,{useEffect:SY}=H6.default,Z6=H6.default.useState,k9={id:"",sequenceNo:"",contractNo:"",name:"",currentStatus:"",pending:"",paymentStatus:"",notes:""};function YY({status:u,children:l}){let f=String(u||"unknown").toLowerCase();return tu("span",{className:`status-badge ${f}`},l||u||"unknown")}function O6({label:u,value:l,hint:f,tone:r}){return tu("article",{className:`metric-card ${r||""}`},tu("div",{className:"metric-label"},u),tu("div",{className:"metric-value"},l),tu("div",{className:"metric-hint"},f))}function I9({title:u,eyebrow:l,actions:f,children:r,className:n,loading:i}){return tu("section",{className:`panel ${n||""}`},tu("div",{className:"panel-head"},tu("div",null,l?tu("p",{className:"panel-eyebrow"},l):null,tu(nl,{title:u,loading:i})),f?tu("div",{className:"panel-actions"},f):null),tu("div",{className:"panel-body"},r))}function hw({title:u,data:l,onOpen:f,testId:r}){return tu("button",{type:"button",className:"ghost-btn","data-testid":r,onClick:()=>f(u,l)},"查看原始JSON")}function bw({title:u,text:l}){return tu("div",{className:"empty-state"},tu("strong",null,u),tu("span",null,l))}function pY(u){return u?.runtime&&typeof u.runtime==="object"&&!Array.isArray(u.runtime)?u.runtime:{}}function mY(u){return u?.backend&&typeof u.backend==="object"&&!Array.isArray(u.backend)?u.backend:{}}function PY(u){return u?.repository&&typeof u.repository==="object"&&!Array.isArray(u.repository)?u.repository:{}}function Ny(u,l){return`${u}/microservices/project-manager/proxy${l}`}function CY(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 MY(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 g9(u){return String(u||"item").replace(/[^A-Za-z0-9_-]+/g,"-")}function RY(u){let l=new Uint8Array(u),f="",r=32768;for(let n=0;ntu("tr",{key:n.id,className:l===n.id?"active-row":"","data-testid":`project-manager-row-${g9(n.id)}`},tu("td",null,n.sequenceNo??"--"),tu("td",null,tu("strong",null,n.contractNo||"--"),tu("code",null,n.id||"--")),tu("td",null,tu("strong",null,n.name||"--"),tu("span",{className:"muted block"},n.sourceFile||"--")),tu("td",null,n.currentStatus||"--"),tu("td",null,tu("span",{className:"preline"},n.pending||"--")),tu("td",null,tu(YY,{status:Number(n.paymentRatio||0)>=1?"online":"warn"},n.paymentStatus||"--")),tu("td",null,n.notes||"--"),tu("td",null,tu("div",{className:"inline-actions"},tu("button",{type:"button",className:"ghost-btn",onClick:()=>f(n),"data-testid":`project-manager-edit-${g9(n.id)}`},"编辑"),tu(hw,{title:`Project ${n.contractNo||n.id}`,data:n,onOpen:r,testId:`raw-project-${g9(n.id)}`}))))))))}function vw({microservices:u,onRaw:l,apiBaseUrl:f="/api"}){let r=u.find((E)=>E.id==="project-manager")||null,[n,i]=Z6({loading:!1,saving:!1,importing:!1,exporting:!1,error:"",notice:"",health:null,list:null,refreshedAt:null}),[y,t]=Z6({...k9}),[_,c]=Z6(""),[A,j]=Z6("all"),{addNotification:F}=Xf();async function J(E=_,D=A){if(!r)return;i((h)=>({...h,loading:!0,error:""}));try{let h=new URLSearchParams({pageSize:"200",status:D});if(E.trim())h.set("q",E.trim());let[V,S]=await Promise.all([Tu(`${f}/microservices/project-manager/health`),Tu(Ny(f,`/api/projects?${h.toString()}`))]);i((p)=>({...p,loading:!1,health:V,list:S,refreshedAt:new Date,error:""}))}catch(h){i((V)=>({...V,loading:!1,error:Ou(h,"Project Manager 加载失败")}))}}SY(()=>{J()},[r?.id,r?.runtime?.providerStatus]);async function Q(E){E.preventDefault(),i((D)=>({...D,saving:!0,error:"",notice:""}));try{let D=MY(y);if(y.id)await Tu(Ny(f,`/api/projects/${encodeURIComponent(y.id)}`),{method:"PUT",body:JSON.stringify(D)});else await Tu(Ny(f,"/api/projects"),{method:"POST",body:JSON.stringify(D)});let h=y.id?"项目已更新":"项目已创建";i((V)=>({...V,saving:!1,notice:h})),F("success",h),await J()}catch(D){i((h)=>({...h,saving:!1,error:Ou(D,"保存项目失败")}))}}async function w(){if(!y.id)return;if(!window.confirm(`删除项目 ${y.contractNo||y.name||y.id} ?`))return;i((E)=>({...E,saving:!0,error:"",notice:""}));try{await Tu(Ny(f,`/api/projects/${encodeURIComponent(y.id)}`),{method:"DELETE"}),t({...k9});let E="项目已删除";i((D)=>({...D,saving:!1,notice:E})),F("success",E),await J()}catch(E){i((D)=>({...D,saving:!1,error:Ou(E,"删除项目失败")}))}}async function L(E){let D=E.target.files?.[0];if(!D)return;i((h)=>({...h,importing:!0,error:"",notice:""}));try{let h=RY(await D.arrayBuffer()),S=`Excel 已导入 ${(await Tu(Ny(f,"/api/import/excel"),{method:"POST",body:JSON.stringify({fileName:D.name,contentBase64:h,replace:!1})})).imported||0} 条项目`;i((p)=>({...p,importing:!1,notice:S})),F("success",S),E.target.value="",await J()}catch(h){i((V)=>({...V,importing:!1,error:Ou(h,"Excel 导入失败")}))}}async function U(){i((E)=>({...E,exporting:!0,error:""}));try{let E=await cJ(Ny(f,"/api/projects/export.xlsx")),D=URL.createObjectURL(E),h=document.createElement("a");h.href=D,h.download=`project-manager-${x7()}.xlsx`,document.body.appendChild(h),h.click(),h.remove(),URL.revokeObjectURL(D),i((V)=>({...V,exporting:!1,notice:"Excel 已导出"}))}catch(E){i((D)=>({...D,exporting:!1,error:Ou(E,"Excel 导出失败")}))}}if(!r)return tu(bw,{title:"Project Manager 未登记",text:"请在 config.json 的 microservices 中登记用户服务 id=project-manager"});let N=pY(r),q=PY(r),W=mY(r),z=Array.isArray(n.list?.projects)?n.list.projects:[],Z=n.list?.summary||{},H=n.health||{};return tu("div",{className:"project-manager-page","data-testid":"project-manager-page"},tu(I9,{title:"项目管理工作台",eyebrow:"Main Server PostgreSQL 用户服务",loading:n.loading||n.exporting,actions:tu("div",{className:"panel-actions"},tu("button",{type:"button",className:"ghost-btn",disabled:n.loading,onClick:()=>J(),"data-testid":"project-manager-refresh-button"},n.loading?"刷新中":"刷新"),tu("button",{type:"button",className:"ghost-btn",disabled:n.exporting,onClick:U,"data-testid":"project-manager-export-button"},n.exporting?"导出中":"导出 Excel"),tu(hw,{title:"Project Manager 用户服务",data:r,onOpen:l,testId:"raw-project-manager-service"}))},tu("div",{className:"project-manager-hero"},tu(O6,{label:"项目总数",value:Z.total??z.length,hint:`PG 表 ${H.storage?.table||"project_manager_projects"}`,tone:"ok"}),tu(O6,{label:"进行中",value:Z.active??"--",hint:"当前状态未完全完成"}),tu(O6,{label:"已完成",value:Z.completed??"--",hint:"按 完成 关键字统计",tone:"ok"}),tu(O6,{label:"未全款",value:Z.unpaid??"--",hint:"付款比例 < 1",tone:Number(Z.unpaid||0)>0?"warn":"ok"})),tu(il,{error:n.error}),n.notice?tu("div",{className:"form-success"},n.notice):null),tu("div",{className:"project-manager-hero"},tu("div",{className:"microservice-ref-card"},tu("span",null,"Repo"),tu("strong",null,q.url||"--"),tu("code",null,q.commitId||"--")),tu("div",{className:"microservice-ref-card"},tu("span",null,"Main Server Docker"),tu("strong",null,`${W.nodeBindHost||"--"}:${W.nodePort||"--"}`),tu("code",null,`${q.composeService||"--"} / ${q.containerName||"--"}`)),tu("div",{className:"microservice-ref-card"},tu("span",null,"Runtime"),tu("strong",null,N.providerName||r.providerId),tu("code",null,`Health ${H.ok?"OK":"--"} / ${n.refreshedAt?tl(n.refreshedAt):"--"}`)),tu("div",{className:"microservice-ref-card"},tu("span",null,"Import Source"),tu("strong",null,"D601 WeChat Excel"),tu("code",null,"合作项目列表_I_20260309.xlsx"))),tu("div",{className:"project-manager-layout"},tu(I9,{title:"项目清单",eyebrow:"CRUD + Excel Export",loading:n.loading||n.importing||n.exporting,actions:tu("div",{className:"inline-actions project-manager-filters"},tu("input",{value:_,onChange:(E)=>c(E.target.value),placeholder:"搜索合同号 / 项目名称 / 状态","data-testid":"project-manager-search"}),tu("select",{value:A,onChange:(E)=>{j(E.target.value),J(_,E.target.value)},"data-testid":"project-manager-status-filter"},tu("option",{value:"all"},"全部"),tu("option",{value:"active"},"进行中"),tu("option",{value:"completed"},"已完成"),tu("option",{value:"unpaid"},"未全款")),tu("button",{type:"button",className:"ghost-btn",onClick:()=>J(_,A)},"筛选"))},tu(xY,{projects:z,activeId:y.id,onSelect:(E)=>t(CY(E)),onRaw:l})),tu(I9,{title:y.id?"编辑项目":"新建项目",eyebrow:"PostgreSQL Write Path",loading:n.saving||n.importing},tu("form",{className:"stack-form project-manager-form",onSubmit:Q,"data-testid":"project-manager-form"},y.id?tu("label",null,"项目 ID",tu("input",{value:y.id,disabled:!0})):null,tu("label",null,"序号",tu("input",{type:"number",value:y.sequenceNo,onChange:(E)=>t((D)=>({...D,sequenceNo:E.target.value}))})),tu("label",null,"合同号",tu("input",{value:y.contractNo,onChange:(E)=>t((D)=>({...D,contractNo:E.target.value})),required:!0})),tu("label",null,"项目名称",tu("input",{value:y.name,onChange:(E)=>t((D)=>({...D,name:E.target.value})),required:!0})),tu("label",null,"当前状况",tu("textarea",{value:y.currentStatus,onChange:(E)=>t((D)=>({...D,currentStatus:E.target.value}))})),tu("label",null,"待完成",tu("textarea",{value:y.pending,onChange:(E)=>t((D)=>({...D,pending:E.target.value}))})),tu("label",null,"付款情况",tu("input",{value:y.paymentStatus,onChange:(E)=>t((D)=>({...D,paymentStatus:E.target.value})),placeholder:"例如 1 / 0.5 / 50%"})),tu("label",null,"其它",tu("input",{value:y.notes,onChange:(E)=>t((D)=>({...D,notes:E.target.value}))})),tu("div",{className:"inline-actions"},tu("button",{type:"submit",className:"primary-btn",disabled:n.saving,"data-testid":"project-manager-save-button"},n.saving?"保存中":y.id?"保存修改":"创建项目"),tu("button",{type:"button",className:"ghost-btn",onClick:()=>t({...k9})},"清空"),y.id?tu("button",{type:"button",className:"danger-btn",disabled:n.saving,onClick:w,"data-testid":"project-manager-delete-button"},"删除"):null)),tu("div",{className:"project-manager-import"},tu("p",{className:"muted paragraph"},"浏览器只访问 UniDesk frontend;后端通过同源用户服务代理写入主 PostgreSQL,不暴露 4233 公网端口。"),tu("label",{className:"file-import"},n.importing?"导入中...":"导入 Excel",tu("input",{type:"file",accept:".xlsx",onChange:L,disabled:n.importing,"data-testid":"project-manager-import-input"}))))))}var D6=Pu(Jl(),1);var cu=D6.default.createElement,{useEffect:hY}=D6.default,df=D6.default.useState;function bY({status:u,children:l}){let f=String(u||"unknown").toLowerCase();return cu("span",{className:`status-badge ${f}`},l||u||"unknown")}function B6({label:u,value:l,hint:f,tone:r}){return cu("article",{className:`metric-card ${r||""}`},cu("div",{className:"metric-label"},u),cu("div",{className:"metric-value"},l),cu("div",{className:"metric-hint"},f))}function s9({title:u,eyebrow:l,actions:f,children:r,className:n,loading:i}){return cu("section",{className:`panel ${n||""}`},cu("div",{className:"panel-head"},cu("div",null,l?cu("p",{className:"panel-eyebrow"},l):null,cu(nl,{title:u,loading:i})),f?cu("div",{className:"panel-actions"},f):null),cu("div",{className:"panel-body"},r))}function kw({title:u,data:l,onOpen:f,testId:r}){return cu("button",{type:"button",className:"ghost-btn","data-testid":r,onClick:()=>f(u,l)},"查看原始JSON")}function V6({title:u,text:l}){return cu("div",{className:"empty-state"},cu("strong",null,u),cu("span",null,l))}function vY(u){return u?.runtime&&typeof u.runtime==="object"&&!Array.isArray(u.runtime)?u.runtime:{}}function kY(u){return u?.backend&&typeof u.backend==="object"&&!Array.isArray(u.backend)?u.backend:{}}function IY(u){return u?.repository&&typeof u.repository==="object"&&!Array.isArray(u.repository)?u.repository:{}}function gw(u){return String(u).replace(/[^a-zA-Z0-9_-]/g,"_")}function gY(u){if(!Number.isFinite(u))return"--";return`${u.toFixed(1)}%`}function qy(u,l){return`${u}/microservices/todo-note/proxy${l}`}function sw(u){return u.reduce((l,f)=>{let r=sw(Array.isArray(f.children)?f.children:[]),n=Boolean(f.completed);return{total:l.total+1+r.total,completed:l.completed+(n?1:0)+r.completed,active:l.active+(n?0:1)+r.active}},{total:0,completed:0,active:0})}function o9(u,l){let f=l==="all"||(l==="completed"?Boolean(u.completed):!u.completed),r=Array.isArray(u.children)?u.children:[];return f||r.some((n)=>o9(n,l))}function Iw(u){return Array.isArray(u?.instances)?u.instances:[]}function a9(u,l){for(let f of u){if(f?.id===l)return Array.isArray(f.children)?f.children:[];let r=a9(Array.isArray(f?.children)?f.children:[],l);if(r.length>0)return r}return[]}function aw({microservices:u,onRaw:l,apiBaseUrl:f="/api"}){let r=u.find((s)=>s.id==="todo-note")||null,[n,i]=df(null),[y,t]=df(null),[_,c]=df(""),[A,j]=df(null),[F,J]=df("all"),[Q,w]=df(13),[L,U]=df(""),[N,q]=df(""),[W,z]=df(""),[Z,H]=df(""),[E,D]=df(""),[h,V]=df(!1),[S,p]=df(""),[O,m]=df(null),X=Iw(y),v=sw(Array.isArray(A?.todos)?A.todos:[]),T=r?vY(r):{},Y=r?IY(r):{},k=r?kY(r):{};async function I(s=_){let[Nu,Eu]=await Promise.all([Tu(`${f}/microservices/todo-note/health`),Tu(qy(f,"/api/instances"))]);i(Nu),t(Eu);let Hu=Iw(Eu),vu=Hu.some((ul)=>ul.id===s)?s:Hu[0]?.id||"";return c(vu),vu}async function b(s=_){if(!s){j(null);return}let Nu=await Tu(qy(f,`/api/instances/${encodeURIComponent(s)}`));j(Nu)}async function o(s=_){if(!r)return;V(!0),p("");try{let Nu=await I(s);await b(Nu),m(new Date)}catch(Nu){p(Ou(Nu,"Todo Note 加载失败"))}finally{V(!1)}}async function g(s){if(!_)return null;p("");try{let Nu=await Tu(qy(f,`/api/instances/${encodeURIComponent(_)}/actions`),{method:"POST",body:JSON.stringify({action:s})});return j(Nu),await I(_),Nu}catch(Nu){return p(Ou(Nu,"Todo 操作失败")),null}}async function x(s){s.preventDefault();let Nu=L.trim();if(!Nu)return;V(!0),p("");try{let Eu=await Tu(qy(f,"/api/instances"),{method:"POST",body:JSON.stringify({name:Nu})});U(""),await o(Eu.id)}catch(Eu){p(Ou(Eu,"创建清单失败"))}finally{V(!1)}}async function lu(s){if(!window.confirm("确认删除这个 Todo Note 清单?"))return;V(!0),p("");try{await Tu(qy(f,`/api/instances/${encodeURIComponent(s)}`),{method:"DELETE"}),await o(_===s?"":_)}catch(Nu){p(Ou(Nu,"删除清单失败"))}finally{V(!1)}}async function _u(s){s.preventDefault();let Nu=N.trim();if(!Nu)return;q(""),await g({type:"addTodo",title:Nu})}async function $u(s){if(!_)return;p("");try{let Nu=await Tu(qy(f,`/api/instances/${encodeURIComponent(_)}/${s}`),{method:"POST",body:JSON.stringify({})});j(Nu),await I(_)}catch(Nu){p(Ou(Nu,`${s} 失败`))}}function ju(s){z(s.id),H(String(s.title||""))}async function zu(s){let Nu=Z.trim();if(z(""),H(""),Nu)await g({type:"updateTodoTitle",todoId:s,title:Nu})}async function Wu(s){let Eu=window.prompt("新增子任务标题")?.trim();if(!Eu)return;let Hu=a9(Array.isArray(A?.todos)?A.todos:[],s),vu=new Set(Hu.map((Uf)=>Uf.id)),ul=await g({type:"addTodo",title:Eu,parentId:s,targetIndex:0});if(!ul)return;let mu=a9(Array.isArray(ul?.todos)?ul.todos:[],s),Fl=mu.find((Uf)=>!vu.has(Uf.id));if(Fl&&mu[0]?.id!==Fl.id)await g({type:"moveTodo",todoId:Fl.id,targetParentId:s,targetIndex:0})}async function P(s,Nu){if(!E)return;let Eu={type:"moveTodo",todoId:E,targetIndex:Nu};if(s)Eu.targetParentId=s;D(""),await g(Eu)}if(hY(()=>{o()},[r?.id,r?.runtime?.providerStatus]),!r)return cu(V6,{title:"Todo Note 未登记",text:"请在 config.json 的 microservices 中登记用户服务 id=todo-note"});let e=X.find((s)=>s.id===_)||null,uu=Array.isArray(A?.todos)?A.todos:[],Ku=uu.map((s,Nu)=>({todo:s,index:Nu})).filter((s)=>o9(s.todo,F));return cu("div",{className:"todo-note-page","data-testid":"todo-note-page"},cu(s9,{title:"Todo Note 工作台",eyebrow:"Main Server 用户服务",loading:h,actions:cu("div",{className:"panel-actions"},cu("button",{type:"button",className:"ghost-btn",disabled:h,onClick:()=>o(_),"data-testid":"todo-note-refresh-button"},h?"刷新中":"刷新"),cu(kw,{title:"Todo Note 用户服务",data:r,onOpen:l,testId:"raw-todo-note-service"}))},cu("div",{className:"todo-note-hero"},cu("div",null,cu("div",{className:"node-version-line"},cu(bY,{status:T.providerStatus==="online"?"online":"warn"},T.providerStatus||"unknown"),cu("span",null,r.providerId),cu("span",null,k.public?"公网暴露":"仅 UniDesk frontend 代理访问"),cu("span",null,n?.ok?"Health OK":"Health --")),cu("p",{className:"muted paragraph"},r.description)),cu("div",{className:"microservice-ref-card"},cu("span",null,"Repo"),cu("strong",null,Y.url||"--"),cu("code",null,Y.commitId||"--")),cu("div",{className:"microservice-ref-card"},cu("span",null,"Main Server Docker"),cu("strong",null,`${k.nodeBindHost||"--"}:${k.nodePort||"--"}`),cu("code",null,`${Y.composeService||"--"} / ${Y.containerName||"--"}`))),cu(il,{error:S,wide:!0})),cu("div",{className:"todo-note-layout"},cu(s9,{title:"清单",eyebrow:`${X.length} Instances`,className:"todo-list-panel",loading:h},cu("form",{className:"todo-create-list",onSubmit:x},cu("input",{placeholder:"新清单名称",value:L,onChange:(s)=>U(s.target.value),"aria-label":"新清单名称"}),cu("button",{type:"submit",className:"ghost-btn",disabled:h||!L.trim()},"创建")),X.length===0?cu(V6,{title:"暂无清单",text:"迁移或创建清单后会出现在这里"}):cu("div",{className:"todo-instance-list"},X.map((s)=>cu("button",{key:s.id,type:"button",className:`todo-instance-row ${_===s.id?"active":""}`,onClick:()=>{c(s.id),b(s.id)},"data-testid":`todo-instance-${gw(s.id)}`},cu("strong",null,s.name),cu("span",null,`${s.completedCount??0}/${s.todoCount??0} 完成`),cu("code",null,s.id))))),cu("div",{className:"todo-main-stack"},cu(s9,{title:e?.name||"待选择清单",eyebrow:O?`Updated ${tl(O)}`:"Todo Tree",loading:h,actions:A?cu("div",{className:"panel-actions"},cu("button",{type:"button",className:"ghost-btn",onClick:()=>g({type:"renameInstance",name:window.prompt("清单新名称",A.name)||A.name})},"重命名"),cu("button",{type:"button",className:"ghost-btn danger",onClick:()=>lu(_)},"删除清单"),cu(kw,{title:`Todo Instance ${_}`,data:A,onOpen:l,testId:"raw-todo-instance"})):null},!A?cu(V6,{title:"未选择清单",text:"左侧选择一个 Todo Note 清单"}):cu("div",{className:"todo-workbench",style:{"--todo-font-size":`${Q}px`}},cu("div",{className:"todo-toolbar"},cu("form",{className:"todo-add-form",onSubmit:_u},cu("input",{placeholder:"新增根任务",value:N,onChange:(s)=>q(s.target.value),"aria-label":"新增根任务"}),cu("button",{type:"submit",className:"ghost-btn",disabled:!N.trim()},"新增")),cu("div",{className:"todo-filter-strip"},["all","active","completed"].map((s)=>cu("button",{key:s,type:"button",className:`todo-filter ${F===s?"active":""}`,onClick:()=>J(s)},s==="all"?"全部":s==="active"?"未完成":"已完成"))),cu("div",{className:"todo-toolbar-actions"},cu("button",{type:"button",className:"ghost-btn",onClick:()=>g({type:"setAllTodosExpanded",expanded:!0})},"全部展开"),cu("button",{type:"button",className:"ghost-btn",onClick:()=>g({type:"setAllTodosExpanded",expanded:!1})},"全部收起"),cu("button",{type:"button",className:"ghost-btn",onClick:()=>$u("undo")},"撤销"),cu("button",{type:"button",className:"ghost-btn",onClick:()=>$u("redo")},"重做"),cu("label",{className:"todo-font-control"},"字号",cu("input",{type:"range",min:11,max:18,value:Q,onChange:(s)=>w(Number(s.target.value))})))),cu("div",{className:"todo-stats-grid"},cu(B6,{label:"总任务",value:v.total,hint:`${X.length} lists`}),cu(B6,{label:"已完成",value:v.completed,hint:`${gY(v.total?v.completed/v.total*100:0)}`,tone:"ok"}),cu(B6,{label:"未完成",value:v.active,hint:F==="active"?"当前筛选":"active tasks",tone:v.active>0?"warn":"ok"}),cu(B6,{label:"历史指针",value:A.historyPointer??0,hint:"undo / redo"})),cu("div",{className:"todo-root-drop",onDragOver:(s)=>s.preventDefault(),onDrop:(s)=>{s.preventDefault(),P(null,uu.length)}},"拖到这里可移为根任务末尾"),cu("div",{className:"todo-tree","data-testid":"todo-note-tree"},Ku.length===0?cu(V6,{title:"没有匹配任务",text:"调整筛选或新增任务"}):Ku.map(({todo:s,index:Nu})=>cu(ow,{key:s.id,todo:s,depth:0,parentId:null,index:Nu,siblingCount:uu.length,filter:F,editingId:W,editingTitle:Z,setEditingTitle:H,beginEdit:ju,saveEdit:zu,applyTodoAction:g,addChild:Wu,dragTodoId:E,setDragTodoId:D,dropTodo:P}))))))))}function ow(u){let{todo:l,depth:f,parentId:r,index:n,siblingCount:i,filter:y,editingId:t,editingTitle:_,setEditingTitle:c,beginEdit:A,saveEdit:j,applyTodoAction:F,addChild:J,dragTodoId:Q,setDragTodoId:w,dropTodo:L}=u,U=Array.isArray(l.children)?l.children:[],N=U.map((z,Z)=>({child:z,childIndex:Z})).filter((z)=>o9(z.child,y)),q=t===l.id,W=r||null;return cu("div",{className:"todo-row-wrap"},cu("article",{className:`todo-row ${l.completed?"completed":""} ${Q===l.id?"dragging":""}`,style:{"--todo-depth":f},draggable:!0,onDragStart:(z)=>{w(l.id),z.dataTransfer.effectAllowed="move"},onDragOver:(z)=>z.preventDefault(),onDrop:(z)=>{z.preventDefault(),L(l.id,U.length)},"data-testid":`todo-row-${gw(l.id)}`},cu("button",{type:"button",className:"todo-expand",disabled:U.length===0,onClick:()=>F({type:"toggleTodoExpanded",todoId:l.id})},U.length===0?"·":l.expanded?"▾":"▸"),cu("input",{type:"checkbox",checked:Boolean(l.completed),onChange:()=>F({type:"toggleTodoCompleted",todoId:l.id}),"aria-label":`完成 ${l.title}`}),cu("div",{className:"todo-title-cell",onDoubleClick:()=>A(l)},q?cu("div",{className:"todo-edit-inline"},cu("input",{value:_,autoFocus:!0,onChange:(z)=>c(z.target.value),onKeyDown:(z)=>{if(z.key==="Enter")j(l.id);if(z.key==="Escape")A({id:"",title:""})}}),cu("button",{type:"button",className:"ghost-btn",onClick:()=>j(l.id)},"保存")):cu("strong",null,l.title||"Untitled"),cu("div",{className:"todo-meta-line"},cu("span",null,`子项 ${U.length}`),cu("span",null,`更新 ${qu(l.updatedAt)}`),l.reminderAt?cu("span",{className:"todo-reminder"},`提醒 ${qu(l.reminderAt)}`):cu("span",null,"无提醒"))),cu("input",{className:"todo-reminder-input",type:"datetime-local",value:r8(l.reminderAt),onChange:(z)=>F({type:"setTodoReminder",todoId:l.id,reminderAt:h7(z.target.value)})}),cu("div",{className:"todo-row-actions"},cu("button",{type:"button",className:"ghost-btn",onClick:()=>A(l)},"编辑"),cu("button",{type:"button",className:"ghost-btn",onClick:()=>J(l.id)},"子项"),cu("button",{type:"button",className:"ghost-btn",disabled:n<=0,onClick:()=>F({type:"moveTodo",todoId:l.id,...W?{targetParentId:W}:{},targetIndex:n-1})},"上移"),cu("button",{type:"button",className:"ghost-btn",disabled:n<=0,onClick:()=>F({type:"moveTodo",todoId:l.id,...W?{targetParentId:W}:{},targetIndex:0})},"置顶"),cu("button",{type:"button",className:"ghost-btn",disabled:n>=i-1,onClick:()=>F({type:"moveTodo",todoId:l.id,...W?{targetParentId:W}:{},targetIndex:n+1})},"下移"),cu("button",{type:"button",className:"ghost-btn",disabled:!r,onClick:()=>F({type:"moveTodo",todoId:l.id,targetIndex:9999})},"提升"),cu("button",{type:"button",className:"ghost-btn danger",onClick:()=>F({type:"deleteTodo",todoId:l.id})},"删除"))),l.expanded&&N.length>0?cu("div",{className:"todo-children"},N.map(({child:z,childIndex:Z})=>cu(ow,{key:z.id,todo:z,depth:f+1,parentId:l.id,index:Z,siblingCount:U.length,filter:y,editingId:t,editingTitle:_,setEditingTitle:c,beginEdit:A,saveEdit:j,applyTodoAction:F,addChild:J,dragTodoId:Q,setDragTodoId:w,dropTodo:L}))):null)}var dw=Pu(Jl(),1),kn=dw.default.createElement;function ew({title:u,items:l,actions:f,className:r,testId:n}){let i=Array.isArray(l)?l:[];return kn("section",{className:`top-status-bar ${r||""}`,"data-testid":n},kn("div",{className:"top-status-main"},u?kn("strong",{className:"top-status-title"},u):null,kn("div",{className:"top-status-chips"},i.map((y,t)=>kn("span",{key:y?.key||`${y?.label||"status"}-${t}`,className:`top-status-chip ${y?.tone||""}`,"data-testid":y?.testId},y?.label?kn("b",null,y.label):null,kn("span",null,y?.value??"--"))))),f?kn("div",{className:"top-status-actions"},f):null)}var M_=Pu(Jl(),1);var Qu=M_.default.createElement,{useEffect:sY,useMemo:aY}=M_.default,oY=M_.default.useState;function uL({status:u,children:l,title:f}){let r=String(u||"unknown").toLowerCase();return Qu("span",{className:`status-badge ${r}`,title:f},l||u||"unknown")}function X6({label:u,value:l,hint:f,tone:r}){return Qu("article",{className:`metric-card ${r||""}`},Qu("div",{className:"metric-label"},u),Qu("div",{className:"metric-value"},l),Qu("div",{className:"metric-hint"},f))}function d9({title:u,eyebrow:l,actions:f,children:r,className:n,loading:i}){return Qu("section",{className:`panel ${n||""}`},Qu("div",{className:"panel-head"},Qu("div",null,l?Qu("p",{className:"panel-eyebrow"},l):null,Qu(nl,{title:u,loading:i})),f?Qu("div",{className:"panel-actions"},f):null),Qu("div",{className:"panel-body"},r))}function lL({title:u,data:l,onOpen:f,testId:r}){return Qu("button",{type:"button",className:"ghost-btn","data-testid":r,onClick:()=>f?.(u,l)},"查看原始JSON")}function e9({title:u,text:l}){return Qu("div",{className:"empty-state"},Qu("strong",null,u),Qu("span",null,l))}function Wy(u){return Array.isArray(u)?u:[]}function u7(u){return u&&typeof u==="object"&&!Array.isArray(u)?u:{}}function dY(u){return u?.runtime&&typeof u.runtime==="object"&&!Array.isArray(u.runtime)?u.runtime:{}}function eY(u,l){return`${u}/microservices/k3sctl-adapter/proxy${l}`}function up(u){return u.find((l)=>String(l?.id||"")==="k3sctl-adapter")||null}function lp(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 rp(u){if(u===!0)return"YES";if(u===!1)return"NO";return"--"}function np(u){return Array.from(new Set(u.flatMap((l)=>Wy(l?.expectedNodeIds).map((f)=>String(f))))).filter(Boolean).sort()}function ip(u){let l=u.find((f)=>f?.id==="code-queue")||u[0];return String(l?.activeInstanceId||"--")}function yp(u){return Qu("article",{key:u?.id||u?.nodeId,className:"k3s-instance-card"},Qu("div",{className:"node-card-head"},Qu("strong",null,u?.nodeId||u?.id||"--"),Qu(uL,{status:lp(u)},u?.healthy?"HEALTHY":"DEGRADED")),Qu("div",{className:"k3s-instance-role"},Qu("span",null,String(u?.role||"worker").toUpperCase()),Qu("code",null,u?.id||"--")),Qu("dl",{className:"k3s-kv"},Qu("dt",null,"Base URL"),Qu("dd",null,Qu("code",null,u?.baseUrl||"--")),Qu("dt",null,"Proxy"),Qu("dd",null,u?.proxyMode||"--"),Qu("dt",null,"Health"),Qu("dd",null,`${u?.upstreamStatus??"--"} / ${u?.status||"unknown"}`),Qu("dt",null,"Checked"),Qu("dd",null,qu(u?.checkedAt))))}function tp(u,l){let f=Wy(u?.instances),r=u7(u?.active);return Qu(d9,{key:u?.id||"service",title:u?.id||"managed-service",eyebrow:`${u?.namespace||"unidesk"} / k3s managed service`,className:"k3s-service-panel",actions:Qu(lL,{title:`k3s service ${u?.id||""}`,data:u,onOpen:l,testId:`raw-k3s-service-${u?.id||"unknown"}`})},Qu("div",{className:"k3s-service-summary"},Qu("div",null,Qu("span",null,"状态"),Qu(uL,{status:fp(u)},u?.status||"unknown")),Qu("div",null,Qu("span",null,"Active"),Qu("strong",null,u?.activeInstanceId||"--")),Qu("div",null,Qu("span",null,"Single Writer"),Qu("strong",null,rp(u?.singleWriter))),Qu("div",null,Qu("span",null,"Active Health"),Qu("strong",null,r?.upstreamStatus??"--"))),f.length===0?Qu(e9,{title:"暂无 k3s 实例",text:"adapter 没有返回该服务的 endpoint 列表"}):Qu("div",{className:"k3s-instance-grid"},f.map(yp)))}function fL({microservices:u,onRaw:l,apiBaseUrl:f,onNavigate:r}){let n=up(Array.isArray(u)?u:[]),i=dY(n),[y,t]=oY({loading:!1,error:"",data:null,refreshedAt:null});async function _(){t((N)=>({...N,loading:!0,error:""}));try{let N=await Tu(eY(f,"/api/control-plane"));t({loading:!1,error:"",data:N,refreshedAt:new Date})}catch(N){t((q)=>({...q,loading:!1,error:Ou(N,"加载 k3s 控制平面失败")}))}}sY(()=>{_()},[f]);let c=aY(()=>Wy(y.data?.services),[y.data]),A=np(c),j=c.filter((N)=>N?.healthy===!0).length,F=c.reduce((N,q)=>N+Wy(q?.instances).length,0),J=c.reduce((N,q)=>N+Wy(q?.instances).filter((W)=>W?.healthy===!0).length,0),Q=ip(c),w=u7(y.data?.kubectl),L=u7(y.data?.kubeApiProxy),U=Wy(y.data?.manifestPaths).map((N)=>String(N));if(!n)return Qu(e9,{title:"k3sctl-adapter 未登记",text:"请在 config.json 的 microservices 中登记 id=k3sctl-adapter,并通过该微服务连接 k3s 控制平面。"});return Qu("div",{className:"k3s-page","data-testid":"k3sctl-page"},Qu(d9,{title:"K3S Control Plane",eyebrow:"Managed by k3sctl-adapter",className:"k3s-hero-panel",loading:y.loading,actions:Qu(M_.default.Fragment,null,Qu("button",{type:"button",className:"ghost-btn",onClick:_,disabled:y.loading,"data-testid":"k3s-refresh-button"},y.loading?"刷新中":"刷新"),r?Qu("button",{type:"button",className:"ghost-btn",onClick:()=>r("apps","code-queue"),"data-testid":"k3s-open-code-queue"},"打开 Code Queue"):null,Qu(lL,{title:"k3sctl-adapter microservice",data:n,onOpen:l,testId:"raw-k3s-adapter"}))},Qu("div",{className:"k3s-hero"},Qu("div",{className:"k3s-orb","aria-hidden":"true"},Qu("span",null,"k3s")),Qu("div",{className:"k3s-hero-copy"},Qu("p",{className:"eyebrow"},"D601 control plane / D518 managed node"),Qu("h2",null,"UniDesk 只管理 adapter;业务微服务交给 k3s 标准服务路由"),Qu("p",{className:"muted paragraph"},"Code Queue 的前端/API 请求进入 k3sctl-adapter,再由 adapter 转发到 k3s active service。provider-gateway 只用于维护 adapter 和节点诊断,不再直接管理 Code Queue 容器。"),Qu("div",{className:"k3s-route-strip"},Qu("span",null,"NO FALLBACK"),Qu("code",null,y.data?.runtimePath||"frontend -> backend-core -> k3sctl-adapter")))),Qu("div",{className:"metric-grid"},Qu(X6,{label:"控制面",value:y.data?.clusterId||"D601",hint:`adapter ${i.providerStatus||"unknown"}`,tone:i.providerStatus==="online"?"ok":"warn"}),Qu(X6,{label:"代管服务",value:c.length,hint:`${j}/${c.length||0} healthy`,tone:j===c.length&&c.length>0?"ok":"warn"}),Qu(X6,{label:"节点",value:A.join(" / ")||"--",hint:"expected k3s nodes"}),Qu(X6,{label:"实例",value:`${J}/${F}`,hint:`active ${Q}`,tone:J===F&&F>0?"ok":"warn"})),Qu("div",{className:"k3s-control-plane-grid"},Qu("article",{className:"k3s-control-plane-card"},Qu("span",null,"service proxy"),Qu("strong",null,L.configured===!0?"K8S API PROXY":"PROXY DEGRADED"),Qu("p",null,L.configured===!0?`${L.mode||"kubernetes-api-service-proxy"} via ${L.connectHost||"--"}`:"adapter 必须通过 k8s API service proxy 访问业务服务,不回退到业务容器直连。")),Qu("article",{className:"k3s-control-plane-card"},Qu("span",null,"manifests"),Qu("strong",null,U.length||"--"),Qu("p",null,U.join(" / ")||"未配置 manifest")),Qu("article",{className:"k3s-control-plane-card"},Qu("span",null,"cluster snapshot"),Qu("strong",null,w.enabled===!0?w.ok===!0?"KUBECTL OK":"KUBECTL DEGRADED":"API ONLY"),Qu("p",null,w.enabled===!0?`nodes ${w.nodeCount??"--"}`:"控制面页面以 adapter 返回的 k8s service proxy 状态为准;kubectl 只作为可选快照。"))),y.error?Qu(il,{error:y.error}):null,y.refreshedAt?Qu("p",{className:"muted paragraph"},`最近刷新 ${tl(y.refreshedAt)}`):null),c.length===0?Qu(d9,{title:"代管服务",eyebrow:"k3s services",loading:y.loading},Qu(e9,{title:"暂无 k3s 服务",text:"等待 k3sctl-adapter 返回 /api/services;Code Queue 切换后这里应显示 D601 和 D518 两个实例。"})):c.map((N)=>tp(N,l)))}var R_=Pu(Jl(),1);var hl=R_.default.createElement;function rL({onClose:u}){let{notifications:l,removeNotification:f,clearNotifications:r}=Xf(),n=R_.default.useRef(null);if(R_.default.useEffect(()=>{let i=(y)=>{if(n.current&&!n.current.contains(y.target))u()};return document.addEventListener("mousedown",i),()=>document.removeEventListener("mousedown",i)},[u]),l.length===0)return hl("div",{className:"notification-popup",ref:n},hl("div",{className:"notification-popup-header"},hl("span",null,"通知"),hl("button",{className:"notification-popup-close",onClick:u},"×")),hl("div",{className:"notification-popup-empty"},"暂无通知"));return hl("div",{className:"notification-popup",ref:n},hl("div",{className:"notification-popup-header"},hl("span",null,`通知 (${l.length})`),hl("div",{className:"notification-popup-actions"},hl("button",{className:"notification-popup-clear",onClick:r},"清空"),hl("button",{className:"notification-popup-close",onClick:u},"×"))),hl("div",{className:"notification-popup-list"},l.slice().reverse().map((i)=>hl("div",{key:i.id,className:`notification-item ${i.type}`},hl("span",{className:"notification-item-icon"},i.type==="success"?"✓":"×"),hl("span",{className:"notification-item-message"},i.message),hl("button",{className:"notification-item-dismiss",onClick:()=>f(i.id)},"×")))))}function nL({notification:u}){let{removeNotification:l}=Xf();return R_.default.useEffect(()=>{let f=setTimeout(()=>{l(u.id)},3000);return()=>clearTimeout(f)},[u.id,l]),hl("div",{className:`notification-banner ${u.type}`,role:"alert"},hl("span",{className:"notification-banner-icon"},u.type==="success"?"✓":"×"),hl("span",{className:"notification-banner-message"},u.message),hl("button",{className:"notification-banner-dismiss",onClick:()=>l(u.id)},"×"))}function QL(u,l){let f=document.getElementById("root")?.getAttribute(u);if(!f)return l;try{let r=JSON.parse(f);return typeof r==="object"&&r!==null&&!Array.isArray(r)?r:l}catch{return l}}var gu=QL("data-config",{apiBaseUrl:"/api",authUsername:"admin"}),_p=QL("data-codex-overview",null),$=gn.default.createElement,{useEffect:J0,useMemo:b_}=gn.default,bu=gn.default.useState,n7=gn.default.createContext(!1),Dr=oQ(ic),$p={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 iL(){return typeof document>"u"||document.visibilityState!=="hidden"}function cp(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 Ap(u){if(!u?._summaryOnly||!u?.id)return u;return(await Tu(`${gu.apiBaseUrl}/tasks/${encodeURIComponent(String(u.id))}`))?.task||u}function v_(u){return u?._summaryOnly?{...u,_loadRaw:()=>Ap(u)}:u}function b0(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 Nr(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 b0(l/1000)}function Tf(u){let l=Number(u);if(!Number.isFinite(l)||l<=0)return"--";let f=["B","KB","MB","GB","TB"],r=l,n=0;while(r>=1024&&n0)return f[r]}return"任务失败但 provider 未返回明确原因"}function hi(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 Fp(u,l){let f=u.replace(/[-_\s]/g,"").toLowerCase(),r=f==="ts"||f.endsWith("at")||f.endsWith("timestamp")||f.endsWith("heartbeat");if((typeof l==="string"||typeof l==="number")&&r){let n=qu(l);if(n!=="--")return n}if(u==="bodyText"&&typeof l==="string")return`${/^\s*[{[]/.test(l)?"JSON":"HTTP"} body ${l.length} chars`;return hi(l)}function WL(u){if(!u||typeof u!=="object"||Array.isArray(u))return[];return Object.entries(u)}function ef(u){return String(u).replace(/[^a-zA-Z0-9_-]/g,"_")}function y7(u,l){return u&&typeof u==="object"&&!Array.isArray(u)?u[l]:void 0}function Y6(u,l,f="未知"){let r=y7(u?.labels,l);return typeof r==="string"&&r.length>0?r:f}function wL(u){return Y6(u,"providerGatewayVersion")}function h_(u){return Y6(u,"providerGatewayUpgradePolicy")}function yL(u){return Y6(u,"providerGatewayStartedAt","")}function LL(u){let l=y7(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 KL(u,l){return LL(u).includes(l)}function tL(u,l){let f=y7(u?.labels,l);return f===!0||f==="true"||f==="1"}function Up(u){if(!KL(u,"host.ssh"))return{tone:"fail",label:"不可用",detail:"未声明 host.ssh"};if(!tL(u,"hostSshConfigured"))return{tone:"warn",label:"未配置",detail:"缺少 SSH 环境变量"};if(!tL(u,"hostSshKeyPresent"))return{tone:"warn",label:"缺 key",detail:"私钥未挂载"};return{tone:"ok",label:"可用",detail:Y6(u,"hostSshTarget","host.ssh ready")}}function Jp(u){if(!KL(u,"provider.upgrade"))return{tone:"fail",label:"不可用",detail:"未声明 provider.upgrade"};let l=h_(u);if(l!=="always-enabled")return{tone:"warn",label:"待确认",detail:`策略 ${l}`};return{tone:"ok",label:"可用",detail:"always-enabled"}}function t7(u){let l=typeof u==="string"&&u.length>0?u:"未知";if(l==="未知")return"版本未知";return l.startsWith("v")?l:`v${l}`}function GL(u){return u?.payload&&typeof u.payload==="object"&&!Array.isArray(u.payload)?u.payload:{}}function p6(u){return u?.result&&typeof u.result==="object"&&!Array.isArray(u.result)?u.result:{}}function S6(u){let l=GL(u),f=p6(u);return(l.mode??f.mode)==="schedule"?"schedule":"plan"}function Qp(u){let l=GL(u).source;return typeof l==="string"&&l.length>0?l:"unknown"}function Np(u){let l=p6(u),f=l.plan&&typeof l.plan==="object"&&!Array.isArray(l.plan)?l.plan:{},r=l.policy??f.policy;return typeof r==="string"&&r.length>0?r:"--"}function zL(u){let l=p6(u),f=l.plan&&typeof l.plan==="object"&&!Array.isArray(l.plan)?l.plan:{},r=l.targetProviderGatewayVersion??l.providerGatewayVersion??f.targetProviderGatewayVersion??f.providerGatewayVersion;return typeof r==="string"&&r.length>0?t7(r):"版本未知"}function TL(u){if(String(u?.status||"").toLowerCase()==="failed")return qL(u);if(Ly(u))return"等待 provider 回传升级终态";let f=p6(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 EL(u,l){return u.filter((f)=>f?.providerId===l&&f?.command==="provider.upgrade").sort((f,r)=>(Q0(r.updatedAt)??0)-(Q0(f.updatedAt)??0))}function qp(u){return u.find((l)=>S6(l)==="schedule")||u[0]||null}function ZL(u){return u?.runtime&&typeof u.runtime==="object"&&!Array.isArray(u.runtime)?u.runtime:{}}function _L(u){return u?.backend&&typeof u.backend==="object"&&!Array.isArray(u.backend)?u.backend:{}}function Wp(u){return u?.repository&&typeof u.repository==="object"&&!Array.isArray(u.repository)?u.repository:{}}function wl({status:u,children:l}){let f=String(u||"unknown").toLowerCase();return $("span",{className:`status-badge ${f}`},l||u||"unknown")}function cl({label:u,value:l,hint:f,tone:r,onClick:n,testId:i}){let y=typeof n==="function";return $("article",{className:`metric-card ${r||""} ${y?"clickable":""}`,role:y?"button":void 0,tabIndex:y?0:void 0,"data-testid":i,onClick:n,onKeyDown:y?(t)=>{if(t.key==="Enter"||t.key===" ")t.preventDefault(),n()}:void 0},$("div",{className:"metric-label"},u),$("div",{className:"metric-value"},l),$("div",{className:"metric-hint"},f))}function du({title:u,eyebrow:l,actions:f,children:r,className:n,loading:i}){let y=gn.default.useContext(n7),t=Boolean(i)||y;return $("section",{className:`panel ${n||""}`},$("div",{className:"panel-head"},$("div",null,l?$("p",{className:"panel-eyebrow"},l):null,$(nl,{title:u,loading:t})),f?$("div",{className:"panel-actions"},f):null),$("div",{className:"panel-body"},r))}function bl({title:u,data:l,onOpen:f,testId:r}){let[n,i]=bu(!1),y=l&&typeof l==="object"&&typeof l._loadRaw==="function"?l._loadRaw:null;async function t(){if(!y){f(u,l);return}i(!0);try{f(u,await y())}catch(_){f(u,{ok:!1,error:Ou(_,"读取原始 JSON 失败"),fallback:l})}finally{i(!1)}}return $("button",{type:"button",className:"ghost-btn","data-testid":r,disabled:n,onClick:()=>void t()},n?"读取中":"查看原始JSON")}function wp({raw:u,onClose:l}){if(!u)return null;return $("div",{className:"modal-backdrop",role:"presentation"},$("section",{className:"raw-dialog",role:"dialog","aria-modal":"true","aria-label":u.title},$("div",{className:"raw-dialog-head"},$("h2",null,u.title),$("button",{type:"button",className:"ghost-btn",onClick:l},"关闭")),$("pre",{className:"raw-json","data-testid":"raw-json"},JSON.stringify(u.data,null,2))))}function OL({labels:u,limit:l=8}){let f=WL(u).slice(0,l);if(f.length===0)return $("span",{className:"muted"},"无标签");return $("div",{className:"chip-row"},f.map(([r,n])=>$("span",{key:r,className:"data-chip"},$("b",null,r),$("span",null,hi(n)))))}function wy({node:u}){let l=wL(u);return $("span",{className:`version-chip ${l==="未知"?"unknown":""}`,"data-testid":`gateway-version-${ef(u?.providerId||"unknown")}`},t7(l))}function $L({title:u,state:l,testId:f}){return $("span",{className:`capability-badge ${l.tone}`,title:l.detail,"data-testid":f},$("b",null,u),$("strong",null,l.label),$("small",null,l.detail))}function _7({node:u}){let l=ef(u?.providerId||"unknown");return $("div",{className:"node-availability-strip"},$($L,{title:"SSH 透传",state:Up(u),testId:`ssh-availability-${l}`}),$($L,{title:"远程更新",state:Jp(u),testId:`upgrade-availability-${l}`}))}function sn({data:u,empty:l="无数据"}){if(u===null||u===void 0)return $("span",{className:"muted"},l);if(typeof u!=="object")return $("span",{className:"summary-value"},hi(u));if(Array.isArray(u))return $("span",{className:"summary-value"},`${u.length} 项列表`);let f=Object.entries(u).slice(0,5);if(f.length===0)return $("span",{className:"muted"},l);return $("div",{className:"summary-grid"},f.map(([r,n])=>$("span",{key:r,className:"summary-item"},$("b",null,r),$("span",null,Fp(r,n)))))}function jl({title:u,text:l}){return $("div",{className:"empty-state"},$("strong",null,u),$("span",null,l))}function Lp({onLogin:u}){let[l,f]=bu(gu.authUsername||"admin"),[r,n]=bu(""),[i,y]=bu(""),[t,_]=bu(!1);async function c(A){A.preventDefault(),_(!0),y("");try{let j=await Tu("/login",{method:"POST",body:JSON.stringify({username:l,password:r})});u(j)}catch(j){y(Ou(j,"登录失败"))}finally{_(!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:c},$("label",null,"账号",$("input",{name:"username",autoComplete:"username",value:l,onChange:(A)=>f(A.target.value)})),$("label",null,"密码",$("input",{name:"password",type:"password",autoComplete:"current-password",value:r,onChange:(A)=>n(A.target.value)})),$(il,{error:i}),$("button",{type:"submit",disabled:t},t?"登录中":"登录")),$("div",{className:"login-note"},"默认账号由 config.json 注入;公网入口只暴露前端登录面。")))}function Kp({connection:u,lastRefresh:l,onRefresh:f,onLogout:r,session:n,clock:i,activeStatusItems:y=[],onNotificationToggle:t,unreadCount:_=0}){let c=[{key:"core",label:"核心",value:u.text,tone:u.ok?"ok":"fail",testId:"conn-text"},...Array.isArray(y)?y:[],{key:"refresh",label:"刷新",value:l?tl(l):"未刷新"},{key:"clock",label:c$,value:tl(i)},{key:"user",label:"用户",value:n?.user?.username||"--",tone:"user"}];return $("header",{className:"topbar"},$("div",null,$("p",{className:"eyebrow"},"Distributed Work Platform"),$("h1",null,"UniDesk 控制平面")),$(ew,{className:"global-top-status",title:"状态",items:c,actions:[$("button",{key:"notification",type:"button",className:`notification-icon-btn ${_>0?"has-unread":""}`,onClick:t,"aria-label":"通知"},"\uD83D\uDD14",_>0?$("span",{key:"badge",className:"notification-badge"},_>99?"99+":_):null),$("button",{key:"refresh",type:"button",className:"ghost-btn",onClick:f},"刷新"),$("button",{key:"logout",type:"button",className:"ghost-btn danger",onClick:r},"退出")]}))}function Gp(u){return!u.defaultPrevented&&u.button===0&&!u.metaKey&&!u.altKey&&!u.ctrlKey&&!u.shiftKey&&u.currentTarget.target!=="_blank"}function HL({moduleId:u,tabId:l,className:f,active:r=!1,title:n,testId:i,onNavigate:y,children:t}){let _=yc(Dr,u,l);return $("a",{href:_,role:"button",className:f,title:n,"aria-current":r?"page":void 0,"data-testid":i,"data-route":_,onClick:(c)=>{if(!Gp(c))return;c.preventDefault(),y(u,l)}},t)}function zp({activeModule:u,activeTabs:l,onNavigate:f,collapsed:r,onToggle:n}){return $("aside",{className:`rail ${r?"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":r?"展开左侧边栏":"收起左侧边栏","data-testid":"rail-toggle"},r?"»":"«")),ic.map((i)=>{let y=l[i.id]||st[i.id]||i.tabs[0]?.id||"";return $(HL,{key:i.id,moduleId:i.id,tabId:y,className:`module ${u===i.id?"active":""}`,active:u===i.id,title:i.label,onNavigate:f},$("span",{className:"module-code"},i.code),$("span",null,i.label))}))}function Tp({module:u,activeTab:l,onNavigate:f}){return $("nav",{className:"tabs","aria-label":`${u.label} 子功能`},u.tabs.map((r)=>$(HL,{key:r.id,moduleId:u.id,tabId:r.id,className:`tab ${l===r.id?"active":""}`,active:l===r.id,onNavigate:f},r.label)))}function Ep({data:u,onRaw:l,onNavigate:f}){let r=u.overview||{},n=u.nodes.filter((J)=>J.status==="online"),i=u.pendingTasks||u.tasks.filter(Ly),y=r.pendingTaskCount??i.length,t=u.tasks.slice(0,5),_=r.pgdata||{},c=r.microserviceAvailability||{},A=Mu(c.totalCount),j=Mu(c.healthyCount),F=Mu(c.unhealthyCount);return $("div",{className:"page-grid overview-grid","data-testid":"overview-page"},$(du,{title:"核心指标",eyebrow:"Control"},$("div",{className:"metric-grid"},$(cl,{label:"数据库",value:r.dbReady?"READY":"WAIT",hint:"PostgreSQL internal network",tone:r.dbReady?"ok":"warn"}),$(cl,{label:"PGDATA",value:Tf(_.databaseBytes),hint:`${_.volumeName||"unidesk_pgdata_10gb"} / ${_.databasePretty||"--"}`,tone:"ok",testId:"pgdata-usage-card"}),$(cl,{label:"在线节点",value:r.onlineNodeCount??0,hint:`${r.nodeCount??0} registered`,tone:"ok"}),$(cl,{label:"WebSocket",value:r.activeSocketCount??0,hint:"Provider ingress sockets"}),$(cl,{label:"用户服务可用",value:A>0?`${j}/${A}`:"--",hint:A>0?`healthyCount ${j} · unhealthyCount ${F}`:"strict /health probes",tone:A>0&&F===0?"ok":"warn",testId:"microservice-availability-card"}),$(cl,{label:"待处理任务",value:y,hint:y>0?"点击查看具体任务":`timeout ${b0(Math.floor((r.taskPendingTimeoutMs??0)/1000))}`,tone:y>0?"warn":"ok",onClick:()=>f("tasks","pending"),testId:"pending-task-card"}))),$(du,{title:"本机 Provider",eyebrow:"Self Connected"},n.length===0?$(jl,{title:"暂无在线节点",text:"provider-gateway 未完成自接入"}):$("div",{className:"node-card-list"},n.slice(0,4).map((J)=>$(Zp,{key:J.providerId,node:J,onRaw:l})))),$(du,{title:"待处理任务明细",eyebrow:`${y} Pending`,actions:$("button",{type:"button",className:"ghost-btn",onClick:()=>f("tasks","pending"),"data-testid":"pending-task-detail-link"},"进入任务调度")},i.length===0?$(jl,{title:"当前无待处理",text:"queued / dispatched / running 超时后会自动转为 failed,避免总览长期卡住"}):$("div",{className:"compact-list"},i.slice(0,5).map((J)=>$(FL,{key:J.id,task:J,onRaw:l})))),$(du,{title:"最近任务",eyebrow:"Dispatch"},t.length===0?$(jl,{title:"暂无任务",text:"可以在任务调度模块发起 docker.ps 或 echo"}):$("div",{className:"compact-list"},t.map((J)=>$(FL,{key:J.id,task:J,onRaw:l})))))}function Zp({node:u,onRaw:l}){return $("article",{className:"node-card"},$("div",{className:"node-card-head"},$("div",null,$("strong",null,u.name),$("code",null,u.providerId)),$(wl,{status:u.status})),$("div",{className:"node-version-line"},$(wy,{node:u}),$("span",null,`升级策略 ${h_(u)}`)),$(_7,{node:u}),$(OL,{labels:u.labels,limit:6}),$("div",{className:"node-card-foot"},$("span",null,`心跳 ${qu(u.lastHeartbeat)}`),$(bl,{title:`Provider ${u.providerId}`,data:u,onOpen:l,testId:`raw-node-${ef(u.providerId)}`})))}function Op({events:u,onRaw:l}){return $(du,{title:"事件摘要",eyebrow:"Latest 100"},u.length===0?$(jl,{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,u.map((f)=>$("tr",{key:f.id},$("td",null,$("code",null,f.id)),$("td",null,$(wl,{status:f.type},f.type)),$("td",null,$("code",null,f.source)),$("td",null,$(sn,{data:f.payload})),$("td",null,qu(f.createdAt)),$("td",null,$(bl,{title:`Event ${f.id}`,data:f,onOpen:l}))))))))}function Hp({logs:u,onRaw:l}){return $(du,{title:"服务日志",eyebrow:"Core Recent"},u.length===0?$(jl,{title:"暂无日志",text:"backend-core 内存日志会在请求和 provider 事件后出现"}):$("div",{className:"log-list"},u.slice(-80).reverse().map((f,r)=>$("article",{key:r,className:`log-row ${f.level||"info"}`},$("span",null,qu(f.ts)),$("b",null,f.level||"info"),$("strong",null,f.message||"log"),$(sn,{data:f.data,empty:"无附加字段"}),$(bl,{title:`Log ${f.message||r}`,data:f,onOpen:l})))))}function Bp({nodes:u,onRaw:l}){return $(du,{title:"节点清单",eyebrow:`${u.length} Providers`},u.length===0?$(jl,{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,u.map((f)=>$("tr",{key:f.providerId},$("td",null,$(wl,{status:f.status})),$("td",null,$("strong",null,f.name),$("code",null,f.providerId)),$("td",null,$("div",{className:"gateway-cell"},$(wy,{node:f}),$("span",null,h_(f)))),$("td",null,$(_7,{node:f})),$("td",null,$(OL,{labels:f.labels,limit:5})),$("td",null,qu(f.connectedAt)),$("td",null,qu(f.lastHeartbeat)),$("td",null,$(bl,{title:`Provider ${f.providerId}`,data:f,onOpen:l,testId:`raw-node-table-${ef(f.providerId)}`}))))))))}function Vp({nodes:u}){let l=b_(()=>{let f=[];for(let r of u)for(let[n,i]of WL(r.labels))f.push({providerId:r.providerId,name:r.name,key:n,value:i});return f},[u]);return $(du,{title:"资源标签",eyebrow:"Structured Labels"},l.length===0?$(jl,{title:"暂无标签",text:"provider-gateway 注册消息会同步资源标签"}):$("div",{className:"label-matrix"},l.map((f)=>$("article",{key:`${f.providerId}-${f.key}`,className:"label-card"},$("span",null,f.key),$("strong",null,hi(f.value)),$("code",null,f.providerId)))))}function Dp({nodes:u}){return $(du,{title:"心跳状态",eyebrow:"Provider Liveness"},u.length===0?$(jl,{title:"无心跳",text:"等待 provider 注册和 heartbeat"}):$("div",{className:"heartbeat-list"},u.map((l)=>$("article",{key:l.providerId,className:"heartbeat-row"},$("span",{className:`pulse ${l.status}`}),$("div",null,$("strong",null,l.name),$("code",null,l.providerId)),$("div",null,$("span",null,"connected"),$("b",null,qu(l.connectedAt))),$("div",null,$("span",null,"last heartbeat"),$("b",null,qu(l.lastHeartbeat)))))))}function Xp({nodes:u,systemStatuses:l,tasks:f,onRaw:r,refresh:n}){let[i,y]=bu(""),t=b_(()=>u.map((w)=>{let L=l.find((U)=>U.providerId===w.providerId);return{...w,systemCurrent:L?.current||null,systemHistory:L?.history||[],systemUpdatedAt:L?.updatedAt||null}}),[u,l]),_=t.find((w)=>w.providerId===i)||t[0]||null;if(J0(()=>{if(!i&&t[0])y(t[0].providerId)},[t.length,i]),!_)return $(jl,{title:"暂无资源监控",text:"等待 provider 上报 CPU、内存和硬盘指标"});let c=_.systemCurrent,A=_.systemHistory||[],j=c?.cpu||{},F=c?.memory||{},J=c?.disk||{},Q=A.length>0?A:c?[{at:c.collectedAt,cpuPercent:Mu(j.percent),memoryPercent:Mu(F.percent),diskPercent:Mu(J.percent)}]:[];return $("div",{className:"monitor-page","data-testid":"node-monitor-page"},$("div",{className:"docker-node-strip"},t.map((w)=>$("button",{key:w.providerId,type:"button",className:`docker-node-tile ${_.providerId===w.providerId?"active":""}`,onClick:()=>y(w.providerId)},$("span",{className:`pulse ${w.status}`}),$("strong",null,w.name),$("code",null,w.providerId),$("span",null,w.systemCurrent?`CPU ${In(w.systemCurrent.cpu?.percent)} / MEM ${In(w.systemCurrent.memory?.percent)}`:"等待指标")))),$("div",{className:"monitor-layout"},$(du,{title:"任务管理器视图",eyebrow:_.name,className:"monitor-main-panel",actions:c?$(bl,{title:`System ${_.providerId}`,data:{current:c,history:A},onOpen:r}):null},!c?$(jl,{title:"系统指标未上报",text:"provider-gateway 会周期性采集 /proc 与 df,并保存历史曲线"}):$("div",null,$("div",{className:"monitor-hero"},$("div",null,$("p",{className:"panel-eyebrow"},"Node Performance"),$("h3",null,_.name),$("div",{className:"docker-meta"},$("span",null,`${j.cores||0} CPU cores`),$("span",null,`load ${Mu(j.load1).toFixed(2)} / ${Mu(j.load5).toFixed(2)} / ${Mu(j.load15).toFixed(2)}`),$("span",null,`memory actual ${Tf(F.usedBytes)} / ${Tf(F.totalBytes)}`),$("span",null,`disk ${Tf(J.usedBytes)} / ${Tf(J.totalBytes)}`))),$(wl,{status:c.ok?"online":"warn"},c.ok?"METRICS READY":"METRICS DEGRADED")),$("div",{className:"monitor-chart-grid"},$(f7,{title:"CPU",metricKey:"cpuPercent",current:j.percent,points:Q,detail:`${j.cores||0} cores / load ${Mu(j.load1).toFixed(2)}`,tone:"cpu",testId:"metric-chart-cpu"}),$(f7,{title:"Memory",metricKey:"memoryPercent",current:F.percent,points:Q,detail:`${Tf(F.usedBytes)} actual / ${Tf(F.cacheBytes)} cache excluded`,tone:"memory",testId:"metric-chart-memory"}),$(f7,{title:"Disk",metricKey:"diskPercent",current:J.percent,points:Q,detail:`${J.path||"/"} mounted ${J.mount||"--"}`,tone:"disk",testId:"metric-chart-disk"})),$("div",{className:"monitor-summary-grid"},$(cl,{label:"CPU 当前",value:In(j.percent),hint:`history ${Q.length} samples`,tone:"ok"}),$(cl,{label:"实际内存",value:Tf(F.usedBytes),hint:`${In(F.percent)} 不含缓存`}),$(cl,{label:"硬盘已用",value:Tf(J.usedBytes),hint:In(J.percent)}),$(cl,{label:"更新时间",value:qu(_.systemUpdatedAt||c.collectedAt),hint:_.providerId})),$(Sp,{current:c,onRaw:r}))),$("div",{className:"monitor-side-stack"},$(xp,{provider:_,refresh:n,onRaw:r}),$(hp,{provider:_,tasks:f,onRaw:r,limit:5}),$(du,{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、实际内存 RSS、线程数和磁盘 I/O 速率;表格默认按内存占用降序")))))))}function cL(u,l){if(l==="memory")return Mu(u.rssBytes);if(l==="cpu")return Mu(u.cpuPercent);if(l==="disk")return Mu(u.readBytesPerSecond)+Mu(u.writeBytesPerSecond);if(l==="pid")return Mu(u.pid);if(l==="threads")return Mu(u.threads);if(l==="runtime")return Mu(u.elapsedSeconds);if(l==="user")return String(u.user||"");return String(u.name||u.command||"")}function AL({value:u,label:l,tone:f}){let r=Math.max(1,Math.min(100,Mu(u)));return $("div",{className:`process-meter ${f||""}`},$("span",{style:{width:`${r}%`}}),$("b",null,l))}function Sp({current:u,onRaw:l}){let[f,r]=bu({key:"memory",direction:"desc"}),n=gn.default.useContext(n7),i=u?.processSummary&&typeof u.processSummary==="object"?u.processSummary:{},y=Array.isArray(u?.processes)?u.processes:[],t=b_(()=>{let c=f.direction==="asc"?1:-1;return[...y].sort((A,j)=>{let F=cL(A,f.key),J=cL(j,f.key);if(typeof F==="string"||typeof J==="string")return String(F).localeCompare(String(J),"zh-CN")*c;return(F-J)*c||Mu(A.pid)-Mu(j.pid)})},[y,f.key,f.direction]),_=(c,A)=>{let j=f.key===A,F=j?f.direction==="asc"?"ascending":"descending":"none";return $("th",{"aria-sort":F},$("button",{type:"button",className:`process-sort-button ${j?"active":""}`,"data-testid":`process-sort-${A}`,onClick:()=>r((J)=>({key:A,direction:J.key===A&&J.direction==="desc"?"asc":"desc"}))},c,$("span",null,j?f.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"),$(nl,{title:"进程资源占用",level:3,loading:n})),$("div",{className:"process-resource-actions"},$("span",{className:"data-chip"},"默认按内存排序"),$("span",{className:"data-chip"},`${Mu(i.visible,t.length)} / ${Mu(i.total,t.length)} 进程`),$(bl,{title:"Process Resource Snapshot",data:{processSummary:i,processes:y},onOpen:l,testId:"raw-process-resources"}))),t.length===0?$(jl,{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,_("进程","name"),_("PID","pid"),_("用户","user"),$("th",null,"状态"),_("CPU","cpu"),_("内存","memory"),$("th",null,"RSS"),_("磁盘 I/O","disk"),_("线程","threads"),_("运行时长","runtime"))),$("tbody",null,t.map((c)=>{let A=Mu(c.readBytesPerSecond)+Mu(c.writeBytesPerSecond);return $("tr",{key:`${c.pid}-${c.startedAt}`,"data-testid":`process-row-${ef(c.pid)}`,"data-memory-bytes":String(Mu(c.rssBytes)),"data-cpu-percent":String(Mu(c.cpuPercent)),"data-disk-bps":String(A),"data-pid":String(Mu(c.pid))},$("td",null,$("div",{className:"process-name-cell"},$("strong",null,c.name||"--"),$("span",{className:"process-command"},c.command||"--"))),$("td",null,$("code",null,c.pid||"--")),$("td",null,c.user||`uid:${c.uid??"--"}`),$("td",null,$("span",{className:`process-state state-${ef(c.state||"unknown")}`},c.state||"?")),$("td",null,$(AL,{value:c.cpuPercent,label:jp(c.cpuPercent),tone:"cpu"})),$("td",null,$(AL,{value:c.memoryPercent,label:In(c.memoryPercent),tone:"memory"})),$("td",null,Tf(c.rssBytes)),$("td",null,$("div",{className:"process-io-cell"},$("strong",null,l7(A)),$("span",null,`R ${l7(c.readBytesPerSecond)} / W ${l7(c.writeBytesPerSecond)}`))),$("td",null,c.threads||0),$("td",null,b0(Mu(c.elapsedSeconds))))})))))}function f7({title:u,metricKey:l,current:f,points:r,detail:n,tone:i,testId:y}){let t=r.map((F)=>Math.max(0,Math.min(100,Mu(F[l])))),_=t.length>1?t:[t[0]||0,t[0]||0],c=_.length<=1?100:100/(_.length-1),A=_.map((F,J)=>`${(J*c).toFixed(2)},${(46-F*0.42).toFixed(2)}`).join(" "),j=`0,48 ${A} 100,48`;return $("article",{className:`metric-chart ${i}`,"data-testid":y},$("div",{className:"metric-chart-head"},$("div",null,$("span",null,u),$("strong",null,In(f))),$("code",null,`${r.length} pts`)),$("svg",{viewBox:"0 0 100 48",preserveAspectRatio:"none",role:"img","aria-label":`${u} usage curve`},$("polygon",{points:j}),$("polyline",{points:A}),$("line",{x1:"0",x2:"100",y1:"24",y2:"24"})),$("div",{className:"metric-chart-foot"},$("span",null,"0%"),$("span",null,n),$("span",null,"100%")))}function v0(u){return Array.isArray(u)?u:[]}function Yp(u){let l=v0(u?.core?.requests?.componentSummary);return[...v0(u?.frontend?.requests?.componentSummary),...l].sort((r,n)=>Mu(n.requestCount)-Mu(r.requestCount))}function pp(u){let l=v0(u?.core?.operations?.summary);return[...v0(u?.frontend?.operations?.summary),...l].sort((r,n)=>Mu(n.count)-Mu(r.count))}function mp(u){let l=v0(u?.core?.requests?.recentFailures).map((r)=>({source:"backend",...r}));return[...v0(u?.frontend?.requests?.recentFailures).map((r)=>({source:"frontend",...r})),...l].sort((r,n)=>(Q0(n.at)??0)-(Q0(r.at)??0)).slice(0,20)}function Pp(u){let l=v0(u?.core?.operations?.recentSlowOperations);return[...v0(u?.frontend?.operations?.recentSlowOperations),...l].sort((r,n)=>Mu(n.durationMs)-Mu(r.durationMs)).slice(0,20)}function Cp(u){let l=performance.memory,f=Number(l?.usedJSHeapSize);if(Number.isFinite(f)&&f>0)return f;let r=Number(u?.appBundleBytes);if(Number.isFinite(r)&&r>0)return r;return Mu(u?.process?.heapUsedBytes)}function Mp({points:u}){let l=v0(u),f=l.map((F)=>Mu(F.mb)),r=Math.max(1,...f),n=Math.max(0,Math.min(...f,0)),i=Math.max(1,r-n),y=l.length>1?l:[...l,...l],t=y.length<=1?100:100/(y.length-1),_=y.map((F,J)=>{let Q=Mu(F.mb);return`${(J*t).toFixed(2)},${(48-(Q-n)/i*42).toFixed(2)}`}).join(" "),c=`0,50 ${_} 100,50`,A=l.at(-1),j=l[0];return $("article",{className:"performance-memory-card","data-testid":"performance-memory-chart"},$("div",{className:"performance-memory-head"},$("strong",null,`Bwebui: ${A?`${Mu(A.mb).toFixed(1)}MB`:"--"}`),$("span",null,l.length>0?`${l.length} samples`:"等待采样")),$("svg",{viewBox:"0 0 100 50",preserveAspectRatio:"none",role:"img","aria-label":"Bwebui memory trend"},$("polygon",{points:c}),$("polyline",{points:_}),$("line",{x1:"0",x2:"100",y1:"25",y2:"25"})),$("div",{className:"performance-axis-row"},$("span",null,j?tl(new Date(j.at)):"--"),$("span",null,"时间"),$("span",null,A?tl(new Date(A.at)):"--")),$("div",{className:"performance-axis-row"},$("span",null,`${n.toFixed(1)}`),$("span",null,"(MB)"),$("span",null,`${r.toFixed(1)}`)))}function Rp({onRaw:u}){let[l,f]=bu({core:null,frontend:null}),[r,n]=bu([]),[i,y]=bu(""),[t,_]=bu(!1),[c,A]=bu(null),[j,F]=bu(!1);async function J(){_(!0),y("");try{let[S,p]=await Promise.all([Tu(`${gu.apiBaseUrl}/performance`,{cache:"no-store"}),Tu(`${gu.apiBaseUrl}/frontend-performance`,{cache:"no-store"})]);f({core:S,frontend:p});let O=Cp(p);n((m)=>[...m,{at:new Date().toISOString(),mb:O/1048576}].slice(-80))}catch(S){y(Ou(S,"性能指标加载失败"))}finally{_(!1)}}J0(()=>{J();let S=setInterval(()=>void J(),5000);return()=>clearInterval(S)},[]);async function Q(){F(!0),y(""),A(null);try{let S=await Tu(`${gu.apiBaseUrl}/code-queue-load-test`,{method:"POST",body:JSON.stringify({targetMs:1000,timeoutMs:90000,url:gu.frontendPublicUrl||window.location.origin})});A(S),J()}catch(S){y(Ou(S,"Code Queue Playwright 测量失败"))}finally{F(!1)}}let w=Yp(l),L=mp(l),U=pp(l),N=Pp(l),q=l.core?.process||{},W=l.frontend?.process||{},z=l.core?.database?.codeQueueStorage||{},Z=Mu(z.total),H=c?.result||{},E=Mu(H.wallMs,NaN),D=Mu(H.networkIdleMs,NaN),h=H.withinTarget===!0,V=j?"running":c===null?"idle":c.measurementOk===!0?h?"passed":"slow":"failed";return $("div",{className:"performance-page","data-testid":"performance-page"},$("div",{className:"performance-hero"},$("div",null,$("p",{className:"panel-eyebrow"},"Unified Performance"),$(nl,{title:"性能面板",loading:t||j}),$("p",null,"按组件统计 HTTP 请求、失败率、P95 延迟,并汇总 backend/frontend 内部操作耗时。")),$("div",{className:"inline-actions"},$("button",{type:"button",className:"ghost-btn",onClick:()=>void Q(),disabled:j,"data-testid":"code-queue-load-test-button"},j?"测试中...":"测试 Code Queue 加载"),$("button",{type:"button",className:"ghost-btn",onClick:()=>void J(),disabled:t,"data-testid":"performance-refresh-button"},t?"刷新中":"刷新"),$(bl,{title:"Performance Snapshot",data:l,onOpen:u,testId:"raw-performance"}))),$(il,{error:i}),$("div",{className:"performance-top-grid"},$(Mp,{points:r}),$("div",{className:"performance-metric-stack"},$(cl,{label:"backend RSS",value:Tf(q.rssBytes),hint:`heap ${Tf(q.heapUsedBytes)}`}),$(cl,{label:"frontend RSS",value:Tf(W.rssBytes),hint:`bundle ${Tf(l.frontend?.appBundleBytes)}`}),$(cl,{label:"Codex PG 任务",value:Z||"--",hint:z.ok?"unidesk_code_queue_tasks":"等待表初始化",tone:z.ok?"ok":"warn"}),$(cl,{label:"请求样本",value:Mu(l.core?.requests?.sampleCount)+Mu(l.frontend?.requests?.sampleCount),hint:"rolling window 3000"}))),$(du,{title:"Code Queue 加载基准",eyebrow:"Playwright / target <1s",className:"codex-load-test-panel",loading:j,actions:$("div",{className:"panel-actions"},$("button",{type:"button",className:"primary-btn",onClick:()=>void Q(),disabled:j,"data-testid":"code-queue-load-test-panel-button"},j?"正在运行 Playwright...":"手动触发测试"),c?$(bl,{title:"Code Queue Load Test",data:c,onOpen:u,testId:"raw-code-queue-load-test"}):null)},$("div",{className:"codex-load-test-grid","data-testid":"code-queue-load-test-result"},$(cl,{label:"总耗时",value:j?"运行中":Number.isFinite(E)?Nr(E):"--",hint:c===null?"点击按钮启动远端 Playwright":`目标 ${Nr(H.targetMs||1000)} / ${H.url||"Code Queue"}`,tone:V==="passed"?"ok":V==="failed"||V==="slow"?"warn":""}),$(cl,{label:"判定",value:j?"RUNNING":V==="passed"?"PASS <1s":V==="slow"?"SLOW":V==="failed"?"FAILED":"--",hint:c?.measurementOk===!1?String(c.error||H.error||"measurement failed").slice(0,120):"导航开始 -> DOMContentLoaded -> data-load-state=complete",tone:V==="passed"?"ok":V==="idle"||V==="running"?"":"fail"}),$(cl,{label:"Network idle",value:Number.isFinite(D)?Nr(D):"--",hint:`DOMContentLoaded ${Nr(H.domContentLoadedMs)} / ${H.networkIdleReached===!1?"未在 5s 内空闲":"已空闲"}`,tone:Number.isFinite(D)&&D<=1000?"ok":"warn"}),$(cl,{label:"组件耗时",value:Number.isFinite(Mu(H.componentLoadMs,NaN))?Nr(H.componentLoadMs):"--",hint:`queue ${Nr(H.queueMs)} / detail ${Nr(H.detailMs)}`,tone:Mu(H.componentLoadMs)>1000?"warn":"ok"}),$(cl,{label:"Trace 规模",value:Number.isFinite(Mu(H.transcriptRows,NaN))?String(H.transcriptRows):"--",hint:`${H.visibleTaskCount??0} visible tasks / ${H.partial?"preview":"complete"}`})),j?$("div",{className:"performance-empty-line"},"正在通过 main-server Host SSH 启动 Playwright,完成后会显示 wall time、组件耗时和最慢 API。"):null,c&&Array.isArray(H.slowestApi)&&H.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((S)=>$("th",{key:S},S)))),$("tbody",null,H.slowestApi.slice(0,5).map((S,p)=>$("tr",{key:`${S.url}-${p}`},$("td",null,$("code",null,S.url)),$("td",null,S.status),$("td",null,Nr(S.durationMs))))))):null),$("div",{className:"performance-grid"},$(du,{title:"组件汇总",eyebrow:"Requests",loading:t},w.length===0?$(jl,{title:"暂无请求样本",text:"刷新几次或打开页面后会自动形成组件统计"}):$("div",{className:"table-wrap performance-table-wrap"},$("table",{className:"performance-table"},$("thead",null,$("tr",null,["组件","请求数","失败数","失败率","平均延迟","P95"].map((S)=>$("th",{key:S},S)))),$("tbody",null,w.map((S)=>$("tr",{key:S.component},$("td",null,$("code",null,S.component)),$("td",null,S.requestCount),$("td",null,S.failureCount),$("td",null,In(Mu(S.failureRate)*100)),$("td",null,Nr(S.averageLatencyMs)),$("td",null,Nr(S.p95LatencyMs)))))))),$(du,{title:"最近失败请求",eyebrow:"Failures",loading:t},L.length===0?$("div",{className:"performance-empty-line"},"最近没有失败请求"):$("div",{className:"table-wrap performance-table-wrap compact"},$("table",{className:"performance-table"},$("thead",null,$("tr",null,["时间","来源","组件","状态","路径"].map((S)=>$("th",{key:S},S)))),$("tbody",null,L.map((S,p)=>$("tr",{key:`${S.at}-${p}`},$("td",null,qu(S.at)),$("td",null,S.source),$("td",null,$("code",null,S.component)),$("td",null,$(wl,{status:"failed"},S.status)),$("td",null,$("code",null,S.path)))))))),$(du,{title:"内部操作汇总",eyebrow:"Operations",loading:t},U.length===0?$(jl,{title:"暂无内部操作样本",text:"API 查询和代理请求会自动记录内部操作耗时"}):$("div",{className:"table-wrap performance-table-wrap"},$("table",{className:"performance-table"},$("thead",null,$("tr",null,["服务","操作","次数","平均延迟","P95"].map((S)=>$("th",{key:S},S)))),$("tbody",null,U.map((S)=>$("tr",{key:`${S.service}-${S.operation}`},$("td",null,S.service),$("td",null,$("code",null,S.operation)),$("td",null,S.count),$("td",null,Nr(S.averageLatencyMs)),$("td",null,Nr(S.p95LatencyMs)))))))),$(du,{title:"最近慢操作",eyebrow:"Slowest",loading:t},N.length===0?$(jl,{title:"暂无慢操作",text:"后端会记录最近窗口内耗时最高的内部操作"}):$("div",{className:"table-wrap performance-table-wrap"},$("table",{className:"performance-table"},$("thead",null,$("tr",null,["时间","操作","耗时","结果","细节"].map((S)=>$("th",{key:S},S)))),$("tbody",null,N.map((S,p)=>$("tr",{key:`${S.at}-${S.operation}-${p}`},$("td",null,qu(S.at)),$("td",null,$("code",null,S.operation)),$("td",null,Nr(S.durationMs)),$("td",null,S.ok?"成功":"失败"),$("td",null,S.detail||"-")))))))))}function xp({provider:u,refresh:l,onRaw:f}){let[r,n]=bu(""),[i,y]=bu(null),[t,_]=bu("");async function c(A){n(A),_("");try{let j=await Tu(`${gu.apiBaseUrl}/dispatch`,{method:"POST",body:JSON.stringify({providerId:u.providerId,command:"provider.upgrade",payload:{mode:A,source:"frontend-resource-monitor",requestedAt:new Date().toISOString()}})});y({mode:A,...j}),await l()}catch(j){_(Ou(j,"升级命令下发失败"))}finally{n("")}}return $(du,{title:"Provider Gateway 升级",eyebrow:"Remote Control",loading:Boolean(r)},$("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,u.providerId),$(wy,{node:u})),$("div",{className:"upgrade-actions"},$("button",{type:"button",className:"ghost-btn",disabled:Boolean(r),onClick:()=>c("plan"),"data-testid":"upgrade-plan-button"},r==="plan"?"预检中":"预检升级"),$("button",{type:"button",className:"ghost-btn danger",disabled:Boolean(r),onClick:()=>c("schedule"),"data-testid":"upgrade-schedule-button"},r==="schedule"?"调度中":"执行升级")),$(il,{error:t}),i?$("div",{className:"upgrade-result"},$(wl,{status:i.status||"queued"},i.status||"queued"),$("span",null,`${i.mode==="schedule"?"执行升级":"预检升级"} 已下发`),$("span",null,`指定版本 ${t7(wL(u))}`),$("code",null,i.taskId||"--"),$(bl,{title:"Provider Upgrade Dispatch",data:i,onOpen:f})):$("span",{className:"muted"},"升级任务结果会进入任务历史;执行升级可能导致 provider 短暂重连。")))}function BL({records:u,onRaw:l,compact:f=!1}){if(u.length===0)return $(jl,{title:"暂无远程更新记录",text:"该节点还没有 provider.upgrade 任务;执行预检或升级后会在这里形成结构化记录"});return $("div",{className:`upgrade-record-table-wrap table-wrap ${f?"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,u.map((r)=>$("tr",{key:r.id,"data-testid":`gateway-upgrade-record-${ef(r.id)}`},$("td",null,$(wl,{status:r.status})),$("td",null,$("span",{className:`mode-chip ${S6(r)}`},S6(r)==="schedule"?"执行升级":"预检")),$("td",null,$("strong",null,"provider.upgrade"),$("code",null,r.id)),$("td",null,Qp(r)),$("td",null,$(DL,{task:r})),$("td",null,Np(r)),$("td",null,$("span",{className:"version-chip"},zL(r))),$("td",null,$("span",{className:`upgrade-outcome ${String(r.status||"").toLowerCase()}`},TL(r))),$("td",null,qu(r.updatedAt)),$("td",null,$(bl,{title:`Provider Upgrade Task ${r.id}`,data:v_(r),onOpen:l})))))))}function hp({provider:u,tasks:l,onRaw:f,limit:r=5}){let n=EL(l,u.providerId).slice(0,r);return $(du,{title:"远程更新记录",eyebrow:u.providerId,actions:$(wy,{node:u}),className:"provider-upgrade-records-panel"},$("div",{"data-testid":`provider-upgrade-records-${ef(u.providerId)}`},$(BL,{records:n,onRaw:f,compact:!0})))}function bp({nodes:u,tasks:l,onRaw:f}){let r=b_(()=>u.map((i)=>{let y=EL(l,i.providerId);return{node:i,records:y,latest:qp(y),capabilities:LL(i)}}),[u,l]),n=r.reduce((i,y)=>i+y.records.length,0);return $("div",{className:"gateway-page","data-testid":"gateway-version-page"},$(du,{title:"Provider Gateway 版本",eyebrow:`${u.length} Providers / ${n} 更新记录`},u.length===0?$(jl,{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,r.map((i)=>$("tr",{key:i.node.providerId},$("td",null,$(wl,{status:i.node.status})),$("td",null,$("strong",null,i.node.name),$("code",null,i.node.providerId)),$("td",null,$(wy,{node:i.node})),$("td",null,h_(i.node)),$("td",null,$(_7,{node:i.node})),$("td",null,yL(i.node)?qu(yL(i.node)):"待新版上报"),$("td",null,$("div",{className:"capability-row"},i.capabilities.length===0?$("span",{className:"muted"},"未声明"):i.capabilities.slice(0,5).map((y)=>$("span",{key:y,className:"data-chip"},y)))),$("td",null,i.latest?$("div",{className:"latest-upgrade-cell"},$(wl,{status:i.latest.status}),$("span",null,`${S6(i.latest)==="schedule"?"执行升级":"预检"} / ${qu(i.latest.updatedAt)}`),$("small",null,`Gateway ${zL(i.latest)}`),$("small",null,TL(i.latest))):$("span",{className:"muted"},"暂无记录")),$("td",null,$(bl,{title:`Provider ${i.node.providerId}`,data:i.node,onOpen:f})))))))),$(du,{title:"远程更新记录",eyebrow:"Structured provider.upgrade records"},u.length===0?$(jl,{title:"暂无记录",text:"没有 provider 节点时不会生成远程更新记录"}):$("div",{className:"gateway-record-grid"},r.map((i)=>$("article",{key:i.node.providerId,className:"gateway-record-card","data-testid":`gateway-records-${ef(i.node.providerId)}`},$("div",{className:"gateway-record-head"},$("div",null,$("strong",null,i.node.name),$("code",null,i.node.providerId)),$(wy,{node:i.node})),$("div",{className:"gateway-record-meta"},$("span",null,`心跳 ${qu(i.node.lastHeartbeat)}`),$("span",null,`策略 ${h_(i.node)}`),$("span",null,`${i.records.length} 条记录`)),$(BL,{records:i.records.slice(0,8),onRaw:f,compact:!0}))))))}function vp(u){if(u==="running")return"online";if(u==="paused"||u==="restarting")return"warn";if(u==="exited"||u==="dead")return"offline";return"internal"}function VL(u){return/^[a-f0-9]{48,64}$/i.test(u)}function x_(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 jL(u){let l=String(u?.name||""),f=String(u?.labels||"");if(x_(u))return 0;if(f.includes("com.docker.compose.project=unidesk"))return 1;if(!VL(l))return 2;return 3}function kp(u){return[...u].sort((l,f)=>{let r=jL(l)-jL(f);if(r!==0)return r;return String(l.name||"").localeCompare(String(f.name||""))})}function Ip({nodes:u,dockerStatuses:l,onRaw:f}){let[r,n]=bu(""),i=b_(()=>u.map((N)=>{let q=l.find((W)=>W.providerId===N.providerId);return{...N,dockerStatus:q?.dockerStatus||null,dockerUpdatedAt:q?.updatedAt||null}}),[u,l]),y=i.find((N)=>N.providerId===r)||i[0]||null;if(J0(()=>{if(!r&&i[0])n(i[0].providerId)},[i.length,r]),!y)return $(jl,{title:"暂无 Docker 节点",text:"等待 provider 上报 Docker daemon 状态"});let t=y.dockerStatus,_=y.providerId==="main-server",c=t?.counts||{},A=t?.daemon||{},j=t?.containers||[],F=t?.images||[],J=kp(t?.volumes||[]),Q=_?J.find(x_):null,w=t?.networks||[],L=j.filter((N)=>N.state==="running"),U=j.filter((N)=>N.state!=="running");return $("div",{className:"docker-page","data-testid":"docker-status-page"},$("div",{className:"docker-node-strip"},i.map((N)=>$("button",{key:N.providerId,type:"button",className:`docker-node-tile ${y.providerId===N.providerId?"active":""}`,onClick:()=>n(N.providerId)},$("span",{className:`pulse ${N.status}`}),$("strong",null,N.name),$("code",null,N.providerId),$("span",null,N.dockerStatus?`Docker ${N.dockerStatus.ok?"ready":"degraded"}`:"等待上报")))),$("div",{className:"docker-layout"},$(du,{title:"Docker Desktop 视图",eyebrow:y.name,className:"docker-main-panel",actions:t?$(bl,{title:`Docker ${y.providerId}`,data:t,onOpen:f}):null},!t?$(jl,{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||y.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 / ${Tf(A.memoryBytes)}`))),$(wl,{status:t.ok?"online":"warn"},t.ok?"Docker Ready":"Docker Degraded")),$("div",{className:"docker-metrics"},$(cl,{label:"Containers",value:c.containers??j.length,hint:`${c.running??L.length} running / ${c.stopped??U.length} stopped`,tone:"ok"}),$(cl,{label:"Images",value:c.images??F.length,hint:`${c.daemonImages??c.images??F.length} daemon images`}),$(cl,{label:"Volumes",value:c.volumes??J.length,hint:_?Q?"database volume visible":"database volume missing":"node local volumes",tone:Q?"ok":""}),$(cl,{label:"Networks",value:c.networks??w.length,hint:A.driver?`driver ${A.driver}`:"docker networks"})),_?$(gp,{volume:Q,volumeCount:J.length}):null,$("div",{className:"docker-section-head"},$("h3",null,"Containers"),$("span",null,`updated ${qu(y.dockerUpdatedAt||t.collectedAt)}`)),$("div",{className:"docker-container-table table-wrap","data-testid":"docker-container-table"},$("table",null,$("thead",null,$("tr",null,$("th",null,"状态"),$("th",null,"容器"),$("th",null,"镜像"),$("th",null,"端口"),$("th",null,"运行时间"),$("th",null,"重启策略"),$("th",null,"PID"),$("th",null,"大小"))),$("tbody",null,j.length===0?$("tr",null,$("td",{colSpan:8},"暂无容器")):j.map((N)=>$("tr",{key:`${N.id}-${N.name}`},$("td",null,$(wl,{status:vp(N.state)},N.state||"unknown")),$("td",null,$("strong",null,N.name||"--"),$("code",null,N.id||"--")),$("td",null,N.image||"--"),$("td",null,N.ports||$("span",{className:"muted"},"未发布")),$("td",null,N.runningFor||N.status||"--"),$("td",null,N.restartPolicy?$(wl,{status:N.restartPolicy==="always"?"online":"warn"},N.restartPolicy):"--"),$("td",null,N.pidMode?$("code",null,N.pidMode):"--"),$("td",null,N.size||"--")))))))),$("div",{className:"docker-side-stack"},$(r7,{title:"Images",items:F,render:(N)=>$("article",{key:`${N.id}-${N.repository}`,className:"docker-side-row"},$("strong",null,`${N.repository}:${N.tag}`),$("span",null,N.size||"--"),$("code",null,N.id||"--"))}),$(r7,{title:"Volumes",items:J,limit:J.length,render:(N)=>$("article",{key:N.name,className:`docker-side-row volume-row ${_&&x_(N)?"database-volume":""}`,"data-testid":_&&x_(N)?"database-volume-row":void 0},$("strong",null,N.name),$("span",null,_&&x_(N)?"PostgreSQL":VL(String(N.name||""))?"anonymous":"named"),$("code",null,N.mountpoint||N.driver||N.scope||"--"))}),$(r7,{title:"Networks",items:w,render:(N)=>$("article",{key:N.id||N.name,className:"docker-side-row"},$("strong",null,N.name),$("span",null,N.driver||"--"),$("code",null,N.id||"--"))}))))}function gp({volume:u,volumeCount:l}){return $("section",{className:`docker-volume-focus ${u?"ready":"missing"}`,"data-testid":"database-volume-card"},$("div",{className:"volume-focus-head"},$("span",{className:"panel-eyebrow"},"Database Named Volume"),$(wl,{status:u?"online":"warn"},u?"FOUND":"MISSING")),u?$("div",{className:"volume-focus-body"},$("strong",null,u.name),$("span",null,"PostgreSQL data volume for unidesk-database"),$("div",{className:"volume-route"},$("code",null,u.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 ${u.driver||"--"}`),$("span",null,`scope ${u.scope||"--"}`),$("span",null,`${l} volumes reported`))):$("div",{className:"volume-focus-body"},$("strong",null,"unidesk_pgdata_10gb"),$("span",null,"当前 Docker 快照没有发现数据库命名卷;请检查 provider-gateway 的 Docker volume 上报。")))}function r7({title:u,items:l,render:f,limit:r}){let n=l.slice(0,r??12),i=Math.max(0,l.length-n.length);return $(du,{title:u,eyebrow:`${l.length} items`,className:"docker-side-panel"},l.length===0?$(jl,{title:`暂无 ${u}`,text:"等待 Docker 状态采集"}):$("div",{className:"docker-side-list"},n.map(f),i>0?$("div",{className:"docker-side-more"},`+ ${i} more`):null))}function sp({microservices:u,onRaw:l,onNavigate:f}){let r=u.filter((n)=>_L(n).public===!1);return $("div",{className:"microservice-page","data-testid":"microservice-catalog-page"},$(du,{title:"用户服务目录",eyebrow:"Provider Mounted User Services"},$("div",{className:"metric-grid"},$(cl,{label:"服务总数",value:u.length,hint:"config.json 用户服务登记"}),$(cl,{label:"私有后端",value:r.length,hint:"不直接暴露公网",tone:"ok"}),$(cl,{label:"D601 服务",value:u.filter((n)=>n.providerId==="D601").length,hint:"compute-node docker"}),$(cl,{label:"集成前端",value:u.filter((n)=>n.frontend?.integrated).length,hint:"UniDesk React 页面"}))),$(du,{title:"服务映射",eyebrow:"Repo Reference + Runtime"},u.length===0?$(jl,{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,u.map((n)=>{let i=ZL(n),y=Wp(n),t=_L(n),_=i.availability||{},c=_.status||(i.providerStatus==="online"?"unknown":"unhealthy");return $("tr",{key:n.id,"data-testid":`microservice-row-${ef(n.id)}`},$("td",null,$("strong",null,n.name),$("code",null,n.id)),$("td",null,$("strong",null,i.providerName||n.providerId),$("code",null,n.providerId)),$("td",null,$("span",null,y.url||"--"),$("code",null,y.commitId||"--")),$("td",null,$("span",null,y.composeFile||"--"),$("code",null,`${y.composeService||"--"} / ${y.containerName||"--"}`)),$("td",null,$(wl,{status:t.public?"warn":"online"},t.public?"public":"private"),$("code",null,`${t.nodeBindHost||"--"}:${t.nodePort||"--"} -> ${t.proxyMode||"--"}`)),$("td",null,$("span",null,n.development?.sshPassthrough?"SSH 透传":"未配置"),$("code",null,n.development?.worktreePath||"--")),$("td",null,$(wl,{status:c==="healthy"?"online":c==="unknown"?"warn":"failed"},c),$("span",null,_.reason||i.providerStatus||"unknown"),$(sn,{data:i.container,empty:"容器快照未上报"})),$("td",null,$("div",{className:"microservice-actions"},n.id==="findjob"?$("button",{type:"button",className:"ghost-btn",onClick:()=>f("apps","findjob"),"data-testid":"open-findjob-button"},"打开"):null,n.id==="pipeline"?$("button",{type:"button",className:"ghost-btn",onClick:()=>f("apps","pipeline"),"data-testid":"open-pipeline-button"},"打开"):null,n.id==="todo-note"?$("button",{type:"button",className:"ghost-btn",onClick:()=>f("apps","todo-note"),"data-testid":"open-todo-note-button"},"打开"):null,n.id==="met-nonlinear"?$("button",{type:"button",className:"ghost-btn",onClick:()=>f("apps","met-nonlinear"),"data-testid":"open-met-nonlinear-button"},"打开"):null,n.id==="claudeqq"?$("button",{type:"button",className:"ghost-btn",onClick:()=>f("apps","claudeqq"),"data-testid":"open-claudeqq-button"},"打开"):null,n.id==="baidu-netdisk"?$("button",{type:"button",className:"ghost-btn",onClick:()=>f("apps","baidu-netdisk"),"data-testid":"open-baidu-netdisk-button"},"打开"):null,n.id==="oa-event-flow"?$("button",{type:"button",className:"ghost-btn",onClick:()=>f("apps","oa-event-flow"),"data-testid":"open-oa-event-flow-button"},"打开"):null,n.id==="k3sctl-adapter"?$("button",{type:"button",className:"ghost-btn",onClick:()=>f("apps","k3sctl"),"data-testid":"open-k3sctl-button"},"打开"):null,n.id==="code-queue"?$("button",{type:"button",className:"ghost-btn",onClick:()=>f("apps","code-queue"),"data-testid":"open-code-queue-button"},"打开"):null,n.id==="project-manager"?$("button",{type:"button",className:"ghost-btn",onClick:()=>f("apps","project-manager"),"data-testid":"open-project-manager-button"},"打开"):null,$(bl,{title:`用户服务 ${n.id}`,data:n,onOpen:l}))))}))))))}function ap({nodes:u,onDispatched:l,onRaw:f}){let r=u.filter((V)=>V.status==="online"),[n,i]=bu(r[0]?.providerId||u[0]?.providerId||""),[y,t]=bu("docker.ps"),[_,c]=bu("frontend"),[A,j]=bu("operator-check"),[F,J]=bu("normal"),[Q,w]=bu(!1),[L,U]=bu(""),[N,q]=bu(!1),[W,z]=bu(null),[Z,H]=bu("");J0(()=>{if(!n&&(r[0]?.providerId||u[0]?.providerId))i(r[0]?.providerId||u[0].providerId)},[u.length,r.length,n]);function E(){return{source:_,note:A,priority:F}}function D(){U(JSON.stringify(E(),null,2)),w(!0)}async function h(V){V.preventDefault(),q(!0),H("");try{let S=Q?JSON.parse(L||"{}"):E(),p=await Tu(`${gu.apiBaseUrl}/dispatch`,{method:"POST",body:JSON.stringify({providerId:n,command:y,payload:S})});z(p),await l()}catch(S){H(Ou(S,"下发失败"))}finally{q(!1)}}return $("div",{className:"page-grid dispatch-grid"},$(du,{title:"下发任务",eyebrow:"Real WebSocket Dispatch"},$("form",{className:"dispatch-form",onSubmit:h},$("label",null,"Provider",$("select",{value:n,onChange:(V)=>i(V.target.value)},u.map((V)=>$("option",{key:V.providerId,value:V.providerId},`${V.name} / ${V.providerId}`)))),$("label",null,"Command",$("select",{value:y,onChange:(V)=>t(V.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:_,onChange:(V)=>c(V.target.value)})),$("label",null,"备注",$("input",{value:A,onChange:(V)=>j(V.target.value)})),$("label",null,"优先级",$("select",{value:F,onChange:(V)=>J(V.target.value)},$("option",{value:"normal"},"normal"),$("option",{value:"low"},"low"),$("option",{value:"urgent"},"urgent"))),$("div",{className:"dispatch-actions"},$("button",{type:"button",className:"ghost-btn",onClick:D},"查看原始JSON"),$("button",{type:"submit",disabled:N||!n},N?"下发中":"下发任务")),Q?$("label",{className:"raw-editor-label"},"高级 Payload",$("textarea",{className:"raw-editor",value:L,onChange:(V)=>U(V.target.value)})):null,$(il,{error:Z,wide:!0}))),$(du,{title:"下发结果",eyebrow:"Response"},W?$("div",{className:"result-card"},$(wl,{status:W.status||"queued"},W.status||"queued"),$("dl",null,$("dt",null,"Task ID"),$("dd",null,$("code",null,W.taskId||"--")),$("dt",null,"Provider 在线"),$("dd",null,hi(W.providerOnline))),$(bl,{title:"Dispatch Response",data:W,onOpen:f})):$(jl,{title:"等待操作",text:"任务响应会以结构化结果卡展示"})))}function FL({task:u,onRaw:l}){return $("article",{className:"compact-row"},$(wl,{status:u.status}),$("div",null,$("strong",null,u.command),$("code",null,u.id)),$("span",null,Ly(u)?`已等待 ${i7(u.updatedAt)}`:`耗时 ${b0(NL(u)??0)}`),$(bl,{title:`Task ${u.id}`,data:v_(u),onOpen:l}))}function DL({task:u}){let l=NL(u),f=Ly(u);return $("div",{className:"task-duration"},$("strong",null,l===null?"--":b0(l)),$("span",null,f?`已运行 / 创建 ${qu(u.createdAt)}`:`创建 ${qu(u.createdAt)}`))}function op({task:u}){let l=String(u?.status||"").toLowerCase(),f=u?.result,r=f&&typeof f==="object"&&!Array.isArray(f)?f:{},i=["exitCode","code","signal","timeoutMs","previousStatus","mode"].filter((y)=>r[y]!==void 0&&r[y]!==null);if(l==="failed"){let y=qL(u);return $("div",{className:"task-diagnostic failed"},$("b",null,"失败原因"),$("span",{className:"diagnostic-reason"},hi(y)),i.length>0?$("div",{className:"diagnostic-meta"},i.map((t)=>$("span",{key:t,className:"data-chip"},$("b",null,t),$("span",null,hi(r[t]))))):null)}if(Ly(u))return $("div",{className:"task-diagnostic warn"},$("b",null,"等待终态"),$("span",null,`最后更新 ${i7(u.updatedAt)} 前`));return $("div",{className:"task-diagnostic ok"},$("b",null,"完成摘要"),$(sn,{data:f,empty:"无执行输出"}))}function dp({tasks:u,onRaw:l}){let f=u.filter(Ly);return $("div",{"data-testid":"pending-task-page"},$(du,{title:"待处理任务",eyebrow:`${f.length} Pending`},f.length===0?$(jl,{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,f.map((r)=>$("tr",{key:r.id},$("td",null,$(wl,{status:r.status})),$("td",null,$("strong",null,r.command),$("code",null,r.id)),$("td",null,$("code",null,r.providerId)),$("td",null,i7(r.updatedAt)),$("td",null,$(sn,{data:r.payload})),$("td",null,$(bl,{title:`Pending Task ${r.id}`,data:v_(r),onOpen:l})))))))))}function ep({tasks:u,onRaw:l}){return $("div",{"data-testid":"task-history-page"},$(du,{title:"任务历史",eyebrow:`${u.length} Tasks`},u.length===0?$(jl,{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,u.map((f)=>$("tr",{key:f.id,"data-testid":`task-row-${ef(f.id)}`},$("td",null,$(wl,{status:f.status})),$("td",null,$("strong",null,f.command),$("code",null,f.id)),$("td",null,$("code",null,f.providerId)),$("td",null,$(DL,{task:f})),$("td",null,$(sn,{data:f.payload})),$("td",null,$(op,{task:f})),$("td",null,qu(f.updatedAt)),$("td",null,$(bl,{title:`Task ${f.id}`,data:v_(f),onOpen:l})))))))))}function um({tasks:u,onRaw:l}){let f=u.filter((r)=>["succeeded","failed"].includes(r.status));return $(du,{title:"执行结果",eyebrow:"Finished Tasks"},f.length===0?$(jl,{title:"暂无结果",text:"任务完成后展示 provider 返回的结构化摘要"}):$("div",{className:"result-grid"},f.map((r)=>$("article",{key:r.id,className:"result-card"},$("div",{className:"node-card-head"},$("strong",null,r.command),$(wl,{status:r.status})),$("code",null,r.id),$(sn,{data:r.result,empty:"无执行输出"}),$(bl,{title:`Task Result ${r.id}`,data:v_(r),onOpen:l})))))}function lm(u){if(!u||typeof u!=="object")return"--";if(u.type==="interval")return`每 ${b0(Number(u.everySeconds||0))}`;return`每天 ${u.timeOfDay||"03:00"} UTC`}function fm(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 rm(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 nm(u){let l=Number(u?.durationMs);if(Number.isFinite(l)&&l>=0)return b0(l/1000);let f=Q0(u?.startedAt||u?.createdAt);if(f===null)return"--";let n=Q0(u?.finishedAt)??Date.now();return b0(Math.max(0,(n-f)/1000))}function UL(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 im({schedules:u,scheduleRuns:l,nodes:f,refresh:r,onRaw:n}){let[i,y]=bu(UL(f||[])),[t,_]=bu(!1),[c,A]=bu(""),[j,F]=bu(""),J=[...l||[]].sort((W,z)=>(Q0(z.updatedAt)??0)-(Q0(W.updatedAt)??0));function Q(W,z){y((Z)=>({...Z,[W]:z}))}function w(W){let z=W?.action||{};y({id:W?.id||"",name:W?.name||"",description:W?.description||"",enabled:W?.enabled!==!1,timeOfDay:W?.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)}),F(`正在编辑 ${W?.id||""}`)}function L(){let W={id:i.id,name:i.name,description:i.description,enabled:i.enabled,concurrencyPolicy:"skip",schedule:{type:"daily",timeOfDay:i.timeOfDay,timezone:"Etc/UTC"}};if(i.actionType==="pgdata_backup")return{...W,action:{type:"pgdata_backup",volumeName:"unidesk_pgdata_10gb",remoteBaseDir:i.remoteBaseDir,stagingSubdir:i.stagingSubdir,timeoutMs:Number(i.timeoutMs)||3600000,cleanupLocal:!0}};return{...W,action:{type:"dispatch",providerId:i.providerId,command:i.command,payload:JSON.parse(i.payloadJson||"{}"),timeoutMs:Number(i.timeoutMs)||600000}}}async function U(W){W.preventDefault(),_(!0),A(""),F("");try{let z=L(),Z=encodeURIComponent(String(z.id));await Tu(`${gu.apiBaseUrl}/schedules/${Z}`,{method:"PUT",body:JSON.stringify(z)}),F("定时任务已保存"),await r()}catch(z){A(Ou(z,"保存定时任务失败"))}finally{_(!1)}}async function N(W){if(!W?.id)return;_(!0),A(""),F("");try{await Tu(`${gu.apiBaseUrl}/schedules/${encodeURIComponent(W.id)}`,{method:"DELETE"}),F(`已删除 ${W.id}`),await r()}catch(z){A(Ou(z,"删除定时任务失败"))}finally{_(!1)}}async function q(W){if(!W?.id)return;_(!0),A(""),F("");try{let z=await Tu(`${gu.apiBaseUrl}/schedules/${encodeURIComponent(W.id)}/run`,{method:"POST",body:"{}"});F(`已触发 ${W.id} / ${z?.run?.id||"run"}`),await r()}catch(z){A(Ou(z,"触发定时任务失败"))}finally{_(!1)}}return $("div",{className:"page-grid scheduled-task-page","data-testid":"scheduled-task-page"},$(du,{title:"定时任务",eyebrow:`${(u||[]).length} Schedules`},(u||[]).length===0?$(jl,{title:"暂无定时任务",text:"创建 daily / dispatch / PGDATA backup 任务后会在这里展示下一次执行时间和最近结果"}):$("div",{className:"schedule-card-grid"},(u||[]).map((W)=>$("article",{key:W.id,className:"schedule-card","data-testid":`schedule-row-${ef(W.id)}`},$("div",{className:"node-card-head"},$("strong",null,W.name||W.id),$(wl,{status:W.enabled?"online":"warn"},W.enabled?"enabled":"disabled")),$("code",null,W.id),$("dl",null,$("dt",null,"计划"),$("dd",null,lm(W.schedule)),$("dt",null,"动作"),$("dd",null,fm(W.action)),$("dt",null,"下次执行"),$("dd",null,qu(W.nextRunAt)),$("dt",null,"最近执行"),$("dd",null,W.lastRunAt?`${qu(W.lastRunAt)} / ${W.lastRunId||"--"}`:"--")),$("div",{className:"dispatch-actions"},$("button",{type:"button",className:"ghost-btn",disabled:t,onClick:()=>w(W)},"编辑"),$("button",{type:"button",className:"ghost-btn",disabled:t,onClick:()=>q(W),"data-testid":`schedule-run-${ef(W.id)}`},"手动触发"),$("button",{type:"button",className:"ghost-btn danger",disabled:t,onClick:()=>N(W)},"删除"),$(bl,{title:`Schedule ${W.id}`,data:W,onOpen:n})))))),$(du,{title:i.id?"配置定时任务":"新建定时任务",eyebrow:"CRUD"},$("form",{className:"dispatch-form schedule-form",onSubmit:U},$("label",null,"ID",$("input",{value:i.id,onChange:(W)=>Q("id",W.target.value)})),$("label",null,"名称",$("input",{value:i.name,onChange:(W)=>Q("name",W.target.value)})),$("label",null,"每日执行时间 UTC",$("input",{value:i.timeOfDay,placeholder:"03:30",onChange:(W)=>Q("timeOfDay",W.target.value)})),$("label",null,"启用",$("select",{value:i.enabled?"true":"false",onChange:(W)=>Q("enabled",W.target.value==="true")},$("option",{value:"true"},"enabled"),$("option",{value:"false"},"disabled"))),$("label",null,"动作类型",$("select",{value:i.actionType,onChange:(W)=>Q("actionType",W.target.value)},$("option",{value:"pgdata_backup"},"PGDATA 备份到百度网盘"),$("option",{value:"dispatch"},"Provider Dispatch"))),i.actionType==="pgdata_backup"?[$("label",{key:"remote"},"网盘根目录",$("input",{value:i.remoteBaseDir,onChange:(W)=>Q("remoteBaseDir",W.target.value)})),$("label",{key:"staging"},"本地 staging 子目录",$("input",{value:i.stagingSubdir,onChange:(W)=>Q("stagingSubdir",W.target.value)}))]:[$("label",{key:"provider"},"Provider",$("select",{value:i.providerId,onChange:(W)=>Q("providerId",W.target.value)},(f||[]).map((W)=>$("option",{key:W.providerId,value:W.providerId},`${W.name} / ${W.providerId}`)))),$("label",{key:"command"},"Command",$("select",{value:i.command,onChange:(W)=>Q("command",W.target.value)},$("option",{value:"echo"},"echo"),$("option",{value:"docker.ps"},"docker.ps"),$("option",{value:"host.ssh"},"host.ssh"),$("option",{value:"microservice.http"},"microservice.http"))),$("label",{key:"payload",className:"raw-editor-label"},"Payload JSON",$("textarea",{className:"raw-editor",value:i.payloadJson,onChange:(W)=>Q("payloadJson",W.target.value)}))],$("label",null,"超时 ms",$("input",{value:i.timeoutMs,onChange:(W)=>Q("timeoutMs",W.target.value)})),$("label",{className:"raw-editor-label"},"描述",$("textarea",{className:"raw-editor compact",value:i.description,onChange:(W)=>Q("description",W.target.value)})),$("div",{className:"dispatch-actions"},$("button",{type:"button",className:"ghost-btn",disabled:t,onClick:()=>y(UL(f||[]))},"重置"),$("button",{type:"submit",disabled:t||!i.id},t?"保存中":"保存任务")),j?$("p",{className:"muted paragraph"},j):null,$(il,{error:c,wide:!0}))),$(du,{title:"历史执行记录",eyebrow:`${J.length} Runs`},J.length===0?$(jl,{title:"暂无执行记录",text:"定时触发或手动触发后会生成 run history"}):$("div",{className:"table-wrap"},$("table",{className:"task-history-table schedule-run-table"},$("thead",null,$("tr",null,$("th",null,"状态"),$("th",null,"任务"),$("th",null,"触发"),$("th",null,"耗时"),$("th",null,"结果摘要"),$("th",null,"更新时间"),$("th",null,"操作"))),$("tbody",null,J.map((W)=>$("tr",{key:W.id,"data-testid":`schedule-run-row-${ef(W.id)}`},$("td",null,$(wl,{status:rm(W.status)},W.status)),$("td",null,$("strong",null,W.scheduleId),$("code",null,W.id),W.taskId?$("code",null,W.taskId):null),$("td",null,W.trigger||"--"),$("td",null,nm(W)),$("td",null,$(sn,{data:W.result||W.error,empty:"无结果"})),$("td",null,qu(W.updatedAt)),$("td",null,$(bl,{title:`Schedule Run ${W.id}`,data:W,onOpen:n})))))))))}function ym({data:u}){let l=u.overview||{};return $("div",{className:"page-grid topology-grid"},$(du,{title:"公开入口",eyebrow:"Public"},$("div",{className:"endpoint-list"},$("article",null,$("b",null,"Frontend"),$("span",null,gu.frontendPublicUrl||window.location.origin),$(wl,{status:"online"},"public")),$("article",null,$("b",null,"Provider Ingress"),$("span",null,gu.providerIngressPublicUrl||"ws://public/ws/provider"),$(wl,{status:"online"},"public")))),$(du,{title:"内部服务",eyebrow:"Docker Network Only"},$("div",{className:"endpoint-list"},$("article",null,$("b",null,"backend-core API"),$("span",null,"http://backend-core:8080"),$(wl,{status:"internal"},"internal")),$("article",null,$("b",null,"database"),$("span",null,"postgres://database:5432/unidesk"),$(wl,{status:"internal"},"internal")))),$(du,{title:"运行态",eyebrow:"Runtime"},$("div",{className:"metric-grid"},$(cl,{label:"DB Ready",value:l.dbReady?"YES":"NO",hint:"internal health"}),$(cl,{label:"Online Nodes",value:l.onlineNodeCount??0,hint:"provider-gateway self-link"}))))}function tm({session:u}){return $(du,{title:"认证策略",eyebrow:"Frontend Login"},$("div",{className:"policy-grid"},$("article",null,$("span",null,"默认账号"),$("strong",null,gu.authUsername||"admin")),$("article",null,$("span",null,"当前会话"),$("strong",null,u?.user?.username||"--")),$("article",null,$("span",null,"Session TTL"),$("strong",null,`${gu.sessionTtlSeconds||0}s`)),$("article",null,$("span",null,"API 访问"),$("strong",null,"同源 Cookie 保护"))),$("p",{className:"muted paragraph"},"浏览器只访问 frontend 同源接口;frontend 容器使用 Docker 内网代理 backend-core API。"))}function _m(){return $(du,{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 $m({activeModule:u,activeTab:l,data:f,session:r,refresh:n,onRaw:i,onNavigate:y}){if(u==="ops"&&l==="status")return $(Ep,{data:f,onRaw:i,onNavigate:y});if(u==="ops"&&l==="performance")return $(Rp,{onRaw:i});if(u==="ops"&&l==="events")return $(Op,{events:f.events,onRaw:i});if(u==="ops"&&l==="logs")return $(Hp,{logs:f.logs,onRaw:i});if(u==="nodes"&&l==="list")return $(Bp,{nodes:f.nodes,onRaw:i});if(u==="nodes"&&l==="monitor")return $(Xp,{nodes:f.nodes,systemStatuses:f.systemStatuses,tasks:f.tasks,onRaw:i,refresh:n});if(u==="nodes"&&l==="docker")return $(Ip,{nodes:f.nodes,dockerStatuses:f.dockerStatuses,onRaw:i});if(u==="nodes"&&l==="gateway")return $(bp,{nodes:f.nodes,tasks:f.tasks,onRaw:i});if(u==="nodes"&&l==="labels")return $(Vp,{nodes:f.nodes});if(u==="nodes"&&l==="heartbeats")return $(Dp,{nodes:f.nodes});if(u==="tasks"&&l==="dispatch")return $(ap,{nodes:f.nodes,onDispatched:n,onRaw:i});if(u==="tasks"&&l==="scheduled")return $(im,{schedules:f.schedules,scheduleRuns:f.scheduleRuns,nodes:f.nodes,refresh:n,onRaw:i});if(u==="tasks"&&l==="pending")return $(dp,{tasks:f.pendingTasks,onRaw:i});if(u==="tasks"&&l==="history")return $(ep,{tasks:f.tasks,onRaw:i});if(u==="tasks"&&l==="results")return $(um,{tasks:f.tasks,onRaw:i});if(u==="apps"&&l==="catalog")return $(sp,{microservices:f.microservices,onRaw:i,onNavigate:y});if(u==="apps"&&l==="todo-note")return $(aw,{microservices:f.microservices,onRaw:i,apiBaseUrl:gu.apiBaseUrl});if(u==="apps"&&l==="findjob")return $(hQ,{microservices:f.microservices,onRaw:i,apiBaseUrl:gu.apiBaseUrl});if(u==="apps"&&l==="pipeline")return $(xw,{microservices:f.microservices,onRaw:i,apiBaseUrl:gu.apiBaseUrl});if(u==="apps"&&l==="met-nonlinear")return $(gQ,{microservices:f.microservices,onRaw:i,apiBaseUrl:gu.apiBaseUrl});if(u==="apps"&&l==="claudeqq")return $(qJ,{microservices:f.microservices,onRaw:i,apiBaseUrl:gu.apiBaseUrl});if(u==="apps"&&l==="baidu-netdisk")return $(JJ,{microservices:f.microservices,onRaw:i,apiBaseUrl:gu.apiBaseUrl});if(u==="apps"&&l==="filebrowser")return $(xQ,{microservices:f.microservices,onRaw:i,apiBaseUrl:gu.apiBaseUrl});if(u==="apps"&&l==="oa-event-flow")return $(lN,{microservices:f.microservices,onRaw:i,apiBaseUrl:gu.apiBaseUrl});if(u==="apps"&&l==="k3sctl")return $(fL,{microservices:f.microservices,onRaw:i,apiBaseUrl:gu.apiBaseUrl,onNavigate:y});if(u==="apps"&&l==="code-queue")return $(pQ,{microservices:f.microservices,onRaw:i,apiBaseUrl:gu.apiBaseUrl,initialTasksData:_p});if(u==="apps"&&l==="project-manager")return $(vw,{microservices:f.microservices,onRaw:i,apiBaseUrl:gu.apiBaseUrl});if(u==="config"&&l==="topology")return $(ym,{data:f});if(u==="config"&&l==="auth")return $(tm,{session:r});if(u==="config"&&l==="security")return $(_m);return $(jl,{title:"未找到页面",text:"请选择左侧主模块和顶部子功能标签"})}function cm({session:u,onLogout:l}){let f=j2(Dr,window.location.pathname),[r,n]=bu(f.moduleId),[i,y]=bu({...st,[f.moduleId]:f.tabId}),[t,_]=bu({overview:null,nodes:[],systemStatuses:[],dockerStatuses:[],microservices:[],events:[],tasks:[],pendingTasks:[],schedules:[],scheduleRuns:[],logs:[]}),[c,A]=bu({ok:!1,text:"连接中"}),[j,F]=bu(null),[J,Q]=bu(new Date),[w,L]=bu(null),[U,N]=bu(!1),[q,W]=bu(!1),z=gn.default.useRef(!1),Z=Dr.moduleById[r]||Dr.modules[0],H=i[r]||st[r]||Z.tabs[0].id,E=Array.isArray(t.microservices)?t.microservices:[],D=E.length===0&&r==="apps"&&H==="code-queue"?[$p]:E,h=D===E?t:{...t,microservices:D},V=r==="apps"?D.find((o)=>String(o?.id||"")===(H==="k3sctl"?"k3sctl-adapter":H)):null,S=V?ZL(V):{},p=Z.tabs.find((o)=>o.id===H)?.label||H,O=V?[{key:"microservice",label:"用户服务",value:`${p} ${S.providerStatus==="online"?"在线":S.providerStatus||"未知"}`,tone:S.providerStatus==="online"?"ok":"warn",testId:"active-microservice-status"}]:[];async function m(){if(z.current)return;z.current=!0,W(!0);try{let o=[],g=(ju,zu)=>{o.push([ju,Tu(zu)])},x=r==="ops"&&H==="status",lu=x||r==="config"&&H==="topology",_u=x||r==="nodes"||r==="tasks"&&(H==="dispatch"||H==="scheduled"),$u=r==="apps"&&H!=="code-queue";if(lu)g("overview",`${gu.apiBaseUrl}/overview`);if(_u)g("nodes",`${gu.apiBaseUrl}/nodes`);if(r==="nodes"&&H==="monitor")g("systemStatuses",`${gu.apiBaseUrl}/nodes/system-status?limit=60`),g("tasks",`${gu.apiBaseUrl}/tasks?limit=120&summary=1`);else if(r==="nodes"&&H==="docker")g("dockerStatuses",`${gu.apiBaseUrl}/nodes/docker-status`);else if(r==="nodes"&&H==="gateway")g("tasks",`${gu.apiBaseUrl}/tasks?limit=300&summary=1`);else if(r==="tasks"&&H==="scheduled")g("schedules",`${gu.apiBaseUrl}/schedules?limit=100`),g("scheduleRuns",`${gu.apiBaseUrl}/schedules/runs?limit=100`);else if(r==="tasks"&&H==="pending")g("pendingTasks",`${gu.apiBaseUrl}/tasks?status=pending&limit=100&summary=1`);else if(r==="tasks"&&(H==="history"||H==="results"))g("tasks",`${gu.apiBaseUrl}/tasks?limit=300&summary=1`);else if(x)g("tasks",`${gu.apiBaseUrl}/tasks?limit=8&lite=1`),g("pendingTasks",`${gu.apiBaseUrl}/tasks?status=pending&limit=20&lite=1`);if($u)g("microservices",`${gu.apiBaseUrl}/microservices`);if(r==="ops"&&H==="events")g("events",`${gu.apiBaseUrl}/events?limit=100`);if(r==="ops"&&H==="logs")g("logs","/logs?limit=100");await Promise.all(o.map(async([ju,zu])=>{let Wu=await zu,P={};if(ju==="overview")P.overview=Wu;if(ju==="nodes")P.nodes=Wu.nodes||[];if(ju==="systemStatuses")P.systemStatuses=Wu.systemStatuses||[];if(ju==="dockerStatuses")P.dockerStatuses=Wu.dockerStatuses||[];if(ju==="microservices")P.microservices=Wu.microservices||[];if(ju==="events")P.events=Wu.events||[];if(ju==="tasks")P.tasks=Wu.tasks||[];if(ju==="pendingTasks")P.pendingTasks=Wu.tasks||[];if(ju==="schedules")P.schedules=Wu.schedules||[];if(ju==="scheduleRuns")P.scheduleRuns=Wu.runs||[];if(ju==="logs")P.logs=Wu.logs||[];_((e)=>({...e,...P}))})),A({ok:!0,text:"核心在线"}),F(new Date)}catch(o){if(A({ok:!1,text:Ou(o,"连接失败")}),o.status===401)l(!1)}finally{z.current=!1,W(!1)}}J0(()=>{let o=()=>{if(!iL())return;m()};o();let g=setInterval(o,cp(r,H)),x=()=>{if(iL())o()};return document.addEventListener("visibilitychange",x),()=>{clearInterval(g),document.removeEventListener("visibilitychange",x)}},[r,H]),J0(()=>{let o=setInterval(()=>Q(new Date),1000);return()=>clearInterval(o)},[]),J0(()=>{let o=dQ(Dr,window.location.pathname);if(o&&window.location.pathname!==o)window.history.replaceState(null,"",o)},[]),J0(()=>{let o=()=>{let g=j2(Dr,window.location.pathname);n(g.moduleId),y((x)=>({...x,[g.moduleId]:g.tabId})),L(null)};return window.addEventListener("popstate",o),()=>window.removeEventListener("popstate",o)},[]),J0(()=>{window.scrollTo({top:0,left:0,behavior:"auto"})},[r,H]);function X(o,g,x="push"){let lu=Dr.moduleById[o]?o:Dr.fallbackTarget.moduleId,_u=Dr.moduleById[lu]?.tabs.some((ju)=>ju.id===g)?g:st[lu]||Dr.moduleById[lu]?.tabs[0]?.id||Dr.fallbackTarget.tabId;n(lu),y((ju)=>({...ju,[lu]:_u}));let $u=yc(Dr,lu,_u);if(window.location.pathname!==$u){let ju=x==="replace"?"replaceState":"pushState";window.history[ju](null,"",$u)}}function v(o,g){L({title:o,data:g})}let[T,Y]=bu(!1),{unreadCount:k,notifications:I}=Xf(),b=I.length>0?I[I.length-1]:null;return $("div",{className:`shell ${U?"rail-collapsed":""}`,"data-testid":"app-shell"},$(zp,{activeModule:r,activeTabs:i,onNavigate:X,collapsed:U,onToggle:()=>N((o)=>!o)}),$("main",{className:"workspace"},$(Kp,{connection:c,lastRefresh:j,onRefresh:m,onLogout:()=>l(!0),session:u,clock:J,activeStatusItems:O,onNotificationToggle:()=>Y((o)=>!o),unreadCount:k}),$(Tp,{module:Z,activeTab:H,onNavigate:X}),$(n7.Provider,{value:q},$($m,{activeModule:r,activeTab:H,data:h,session:u,refresh:m,onRaw:v,onNavigate:X}))),$(wp,{raw:w,onClose:()=>L(null)}),b&&$(nL,{key:b.id,notification:b}),T&&$(rL,{onClose:()=>Y(!1)}))}function Am(){let[u,l]=bu(!0),[f,r]=bu(null);async function n(){l(!0);try{let y=await Tu("/api/session");r(y.authenticated?y:null)}catch{r(null)}finally{l(!1)}}async function i(y){if(y)try{await Tu("/logout",{method:"POST"})}catch{}r(null)}if(J0(()=>{n()},[]),u)return $("main",{className:"loading-screen"},$("div",{className:"brand-mark"},"UD"),$("span",null,"加载会话"));if(!f)return $(Lp,{onLogin:r});return $(UJ,null,$(cm,{session:f,onLogout:i}))}var XL=document.getElementById("root");if(XL===null)throw Error("root element not found");JL.createRoot(XL).render($(Am));})(); + ${Y} + ${O} + ${p} + `,width:W,height:L}}function BA(u,l){let f=URL.createObjectURL(u),r=document.createElement("a");r.href=f,r.download=l,r.click(),setTimeout(()=>URL.revokeObjectURL(f),1000)}async function dW(u,l){let f=oW(l,"pipeline"),{svg:r,width:n,height:i}=WS(u,l),t=new Blob([r],{type:"image/svg+xml;charset=utf-8"}),y=URL.createObjectURL(t);try{let c=new Image;await new Promise((F,J)=>{c.onload=()=>F(),c.onerror=()=>J(Error("svg image load failed")),c.src=y});let $=document.createElement("canvas");$.width=n,$.height=i;let A=$.getContext("2d");if(!A)throw Error("canvas unavailable");A.drawImage(c,0,0);let j=await new Promise((F)=>$.toBlob(F,"image/png"));if(!j)throw Error("png export failed");BA(j,`${f}.png`)}catch{BA(t,`${f}.svg`)}finally{URL.revokeObjectURL(y)}}async function zS(u){let l=oW(String(u?.title||"pipeline-gantt"),"pipeline-gantt"),{svg:f,width:r,height:n}=GS(u),i=new Blob([f],{type:"image/svg+xml;charset=utf-8"}),t=URL.createObjectURL(i);try{let y=new Image;await new Promise((j,F)=>{y.onload=()=>j(),y.onerror=()=>F(Error("gantt svg image load failed")),y.src=t});let c=document.createElement("canvas");c.width=r,c.height=n;let $=c.getContext("2d");if(!$)throw Error("canvas unavailable");$.drawImage(y,0,0);let A=await new Promise((j)=>c.toBlob(j,"image/png"));if(!A)throw Error("gantt png export failed");BA(A,`${l}.png`)}catch{BA(i,`${l}.svg`)}finally{URL.revokeObjectURL(t)}}async function ES(u){for(let l of u){if(l.flow.nodes.length===0)continue;await dW(l.flow,l.title),await new Promise((f)=>setTimeout(f,750))}}function SW(u,l){return u.find((f)=>String(f?.pipelineId||"")===l)||null}function XW(u){return su(u?.startedAt)??su(u?.artifact?.startedAt)??su(u?.request?.createdAt)??su(u?.updatedAt)??0}function OS(u,l){return u.filter((f)=>String(f?.pipelineId||"")===l).slice().sort((f,r)=>XW(f)-XW(r)||String(f?.runId||"").localeCompare(String(r?.runId||"")))}function v9(u,l){let f=String(l?.runId||""),r=u.findIndex((t)=>String(t?.runId||"")===f),n=r>=0?r+1:u.length,i=String(l?.status||"--");return`Epoch ${n} / ${f||"--"} / ${i}`}function pr(u){return String(u?.procedureRunId||u?.runId||"")}function pA(u,l){let f=String(u?.nodeId||u?.request?.nodeId||"");if(f)return f;let r=pr(u),n=`${l}__`;if(r.startsWith(n))return r.slice(n.length).replace(/__\d+$/u,"");return""}function LA(u,l){let f=pu(u?.artifact)?u.artifact:{},r=pu(u?.request)?u.request:{};return kc(u?.startedAt,f.startedAt,r.createdAt,r.startedAt,u?.createdAt,u?.updatedAt,l?.startedAt,l?.request?.createdAt)}function TA(u,l){let f=String(u?.status?.status||u?.artifact?.status||u?.status||"").toLowerCase(),r=pu(u?.artifact)?u.artifact:{},n=s9(f);return kc(u?.finishedAt,r.finishedAt,u?.completedAt,n?u?.updatedAt:void 0,n?r.updatedAt:void 0,n?l?.updatedAt:void 0)}function eW(u,l,f=Date.now()){let r=String(u?.runId||""),n=new Set(l.map((i)=>String(i?.id||"")).filter(Boolean));return Du(u?.procedureRuns).flatMap((i)=>{let t=pA(i,r);if(!t)return[];let y=String(i?.status?.status||i?.artifact?.status||i?.status||"unknown").toLowerCase(),c=LA(i,u),$=su(c);if($===null)return[];let A=TA(i,u),j=su(A)??(s9(y)?su(i?.updatedAt)??$+1000:f),F=Math.max($+1000,j);return[{nodeId:t,knownNode:n.has(t),procedureRunId:pr(i),status:y,startMs:$,endMs:F,startedAt:xc($),finishedAt:xc(F),durationMs:F-$,runId:r,raw:i}]}).sort((i,t)=>i.startMs-t.startMs||i.endMs-t.endMs||i.nodeId.localeCompare(t.nodeId))}function ZS(u,l,f=[]){let r=l.map((A)=>Number(A.startMs)).filter(Number.isFinite),n=l.map((A)=>Number(A.endMs)).filter(Number.isFinite);for(let A of f){let j=Vl(A?.eventMs??A?.ms);if(j!==null)r.push(j),n.push(j)}let i=su(u?.startedAt)??su(u?.artifact?.startedAt)??su(u?.request?.createdAt),t=su(u?.finishedAt)??su(u?.artifact?.finishedAt)??su(u?.updatedAt);if(i!==null)r.push(i);if(t!==null)n.push(t);let y=Date.now(),c=r.length>0?Math.min(...r):y-60000,$=Math.max(c+60000,n.length>0?Math.max(...n):y);return{startMs:c,endMs:$,durationMs:$-c}}var KA=12,uL=20,k9=100,HS=!1;function d0(u){let l=Number(u);if(!Number.isFinite(l))return 0;return Math.max(0,Math.min(100,Math.round(l*100)/100))}function BS(u){let l=Math.max(KA,Number(u||KA)),f=Math.log(l/KA)/Math.log(uL);return d0(f*100)}var vc=BS(k9);function l7(u){let l=d0(u)/100,f=KA*Math.pow(uL,l),r=l<0.24?"全局":l<0.64?"均衡":"细节";return{value:d0(l*100),pxPerMinute:f,label:r}}function P9(u){let l=Math.round(Number(u));return Math.abs(l-k9)<=1?k9:l}function mS(u,l=vc){let f=Math.max(1,Number(u.durationMs||0)/60000),r=l7(l);return Math.round(Math.max(360,Math.min(7200,f*Number(r.pxPerMinute||48))))}function VS(u,l=7){let f=Math.max(1,Number(u.endMs||0)-Number(u.startMs||0));return Array.from({length:l},(r,n)=>{let i=l===1?0:n/(l-1);return{ms:Number(u.startMs)+f*i,percent:i*100}})}function DS(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 Vl(u){let l=Number(u);return Number.isFinite(l)?l:null}function f7(u){return MW(u?.status)&&!s9(u?.status)}function lL(u,l,f,r){let n=Math.max(1,f-l),i=Math.max(0,Math.min(1,(u-l)/n));return Number((i*r).toFixed(3))}function YW(u,l){if(!l)return null;let f=Vl(l?.startMs),r=Vl(l?.endMs),n=Vl(l?.chartHeight);if(f===null||r===null||n===null)return null;return lL(u,f,r,n)}function fL(u,l){let f=Vl(u?.rawStartMs??u?.startMs)??Vl(u?.startMs)??l,r=Vl(u?.endMs)??f+1000;if(!f7(u))return Math.max(f+1000,r);return Math.max(f+1000,r,l)}function pS(u,l,f,r){let n=Vl(u?.startMs)??r-60000,i=Vl(u?.endMs)??r,t=f.reduce((Q,W)=>Math.max(Q,fL(W,r)),i),y=Math.max(n+60000,i,t),c=Math.max(1,y-n),$={startMs:n,endMs:y,durationMs:c},A=mS($,l),j=l7(l),F=Math.max(5,Math.min(18,Math.round(A/150))),J=VS($,F).map((Q)=>{let W=Number(Q.ms),L=lL(W,n,y,A);return{...Q,y:L,timestamp:xc(W),offsetMs:W-n}});return{source:"frontend-y",startMs:n,endMs:y,durationMs:c,chartHeight:A,scale:d0(l),normalizedScale:Number((d0(l)/100).toFixed(3)),pxPerMinute:Number(Number(j.pxPerMinute||0).toFixed(3)),ticks:J}}function SS(u,l,f){if(!f7(u))return u;let r=Vl(u?.rawStartMs??u?.startMs)??Vl(u?.startMs)??f,n=fL(u,f),i=YW(r,l),t=YW(n,l),y=Vl(i??u?.y1??u?.startY)??0,c=Vl(t??u?.y2??u?.endY)??y+10,$=Math.max(24,c-y);return{...u,live:!0,startMs:r,endMs:n,durationMs:Math.max(1000,n-r),finishedAt:xc(n),y1:y,y2:c,startY:y,endY:c,height:$}}function r7(u,l,f){return DS(u,l)/100*f}function zy(u){return Boolean(u&&String(u?.source||"")!=="frontend-y")}function rL(u,l,f,r,n){if(zy(r))for(let t of n){let y=Vl(u?.[t]);if(y!==null)return y}let i=Vl(u?.ms??u?.eventMs??u?.startMs);return r7(i??Number(l.startMs),l,f)}function mA(u,l,f,r){return rL(u,l,f,r,["y1","startY"])}function I9(u,l,f,r){if(zy(r)){let i=Vl(u?.y2??u?.endY);if(i!==null)return i}let n=Vl(u?.endMs)??Number(l.endMs);return r7(n,l,f)}function nL(u,l,f,r){if(zy(r)){let i=Vl(u?.height);if(i!==null)return Math.max(1,i)}let n=u?.live?24:10;return Math.max(n,I9(u,l,f,r)-mA(u,l,f,r))}function Nr(u,l,f,r){return rL(u,l,f,r,["y","timeAxisY"])}function iL(u,l,f,r){if(zy(r)||String(r?.source||"")==="frontend-y"){let t=Vl(u?.y);if(t!==null)return t}let n=Vl(u?.percent);if(n!==null)return n/100*f;let i=Vl(u?.ms)??Number(l.startMs);return r7(i,l,f)}function XS(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||""),r=String(u?.nodeId||u?.targetNodeId||"");return f&&f!==r?f:""}function YS(u,l){let f=new Set(l.map((n)=>[String(n.sourceNodeId||""),String(n.targetNodeId||""),String(n.targetMarkerId||""),String(n.action||"")].join(":"))),r=[...l];for(let n of u){let i=XS(n),t=String(n?.nodeId||""),y=String(n?.id||"");if(!i||!t||!y)continue;let c=[i,t,y,"observe"].join(":");if(f.has(c))continue;f.add(c),r.push({id:`observation-arrow:${y}:${i}:${t}`,commandId:String(n?.commandId||n?.eventId||y),sourceNodeId:i,targetNodeId:t,sourceMarkerId:"",targetMarkerId:y,sourceKind:"monitor",action:"observe",status:"observation"})}return{markers:u,arrows:r}}function PS(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 CS(u){return Du(u?.tags||u?.raw?.tags).map((l)=>String(l||"")).filter(Boolean)}function MS(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 CS(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 PW(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 RS(u,l){let f=String(u?.commandId||"");if(f)return`command:${f}`;return["control-event",Ty(u)||kc(u?.createdAt,u?.timestamp)||`index-${l}`,String(u?.sourceKind||""),String(u?.sourceNodeId||""),String(u?.targetNodeId||""),oi(u)].join(":")}function hS(u){return x9([u?.targetNodeId,...Du(u?.resetNodeIds)])}function xS(u,l){let f=Rc(u),r=un(u),n=String(u?.targetNodeId||""),i=Boolean(n)&&l!==n;if(r==="control-command-applied")return i?`${f} 波及`:`${f} 生效`;if(r==="control-command-ignored")return`${f} 忽略`;if(r==="control-command-queued")return`${f} 已发起`;return i?`${f} 波及`:f}function bS(u){if(un(u)==="control-command-ignored")return"ignored";let f=oi(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 vS(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 kS(u,l,f,r){let n=u.filter(($)=>String($.nodeId||"")===l).sort(($,A)=>Number($.startMs)-Number(A.startMs)),i=n.find(($)=>f>=Number($.startMs)-1000&&f<=Number($.endMs)+1000);if(i)return{ms:f,onInterval:!0,snapReason:"inside-interval",procedureRunId:String(i.procedureRunId||"")};let t=oi(r),y=n.slice().reverse().find(($)=>Number($.endMs)<=f+1000);if(y&&t==="approve")return{ms:Number(y.endMs),onInterval:!0,snapReason:"previous-interval-end",procedureRunId:String(y.procedureRunId||"")};let c=n.find(($)=>Number($.startMs)>=f-1000);if(c&&["guide","modify","restart","redo"].includes(t))return{ms:Number(c.startMs),onInterval:!0,snapReason:"next-interval-start",procedureRunId:String(c.procedureRunId||"")};return{ms:f,onInterval:!1,snapReason:"event-time",procedureRunId:String(r?.procedureRunId||"")}}function tL(u,l,f,r){let n=Math.hypot(f-u,r-l),i=n>WW?WW:0,t=i>0?f-(f-u)/n*i:f,y=i>0?r-(r-l)/n*i:r,c=t-u,$=Math.max(16,Math.min(42,Math.abs(c)*0.45+12)),A=c===0?1:Math.sign(c);return`M ${u},${l} C ${u+A*$},${l} ${t-A*$},${y} ${t},${y}`}function IS(u,l){let f=String(u?.runId||l?.runId||""),r=eW({...pu(l)?l:{},...pu(u)?u:{},runId:f,procedureRuns:Du(u?.procedureRuns).length>0?u.procedureRuns:l?.procedureRuns},[]),n=[],i=[],t=[],y=new Set,c=new Map,$=(F,J)=>{if(!F.nodeId||!Number.isFinite(Number(F.ms)))return;if(y.has(F.id))return;y.add(F.id),J.push(F)};for(let F of Du(u?.procedureRuns)){let J=pA(F,f),Q=pr(F);if(!J)continue;for(let W of Du(F?.attempts)){let L=DA(W);for(let U of h9(W?.controlEventRecords)){let q=un(U);if(!["initial-prompt-delivered","append-prompt-delivered","monitor-prompt-delivered"].includes(q))continue;let N=Ty(U),w=su(N);if(w===null)continue;let G=String(U?.eventId||"");$({id:`prompt:${G||`${Q}:${L}:${q}:${w}`}`,runId:f,nodeId:J,procedureRunId:Q,attempt:L,kind:"prompt",tone:PS(U),status:"delivered",label:MS(U),ms:w,timestampIso:N,sourceKind:String(U?.sourceKind||""),sourceNodeId:String(U?.sourceNodeId||""),targetNodeId:J,action:"",eventId:G,commandId:String(U?.commandId||""),raw:U},n)}}}let A=new Map;h9(u?.controlEvents).forEach((F,J)=>{let Q=RS(F,J),W=A.get(Q)||{key:Q,events:[]};W.events.push(F),A.set(Q,W)});for(let F of A.values()){let J=Du(F.events).slice().sort((B,D)=>PW(D)-PW(B)),Q=Du(F.events).find((B)=>un(B)==="control-command-queued")||null,W=J[0]||Q;if(!Q&&!W)continue;let L=String(Q?.sourceNodeId||W?.sourceNodeId||""),U=String(Q?.sourceKind||W?.sourceKind||""),q=Ty(Q)||Ty(W)||kc(Q?.createdAt,W?.createdAt),N=su(q),w=String(W?.commandId||Q?.commandId||F.key),G=(un(W)||"control-command-queued").replace(/^control-command-/u,""),Z="";if(L&&N!==null)Z=`control-source:${w}:${L}`,c.set(w,Z),$({id:Z,runId:f,nodeId:L,procedureRunId:String(Q?.procedureRunId||W?.procedureRunId||""),attempt:"",kind:"control-source",tone:vS(Q||W),status:G,label:`${Rc(Q||W)} 发起`,ms:N,timestampIso:q,action:oi(Q||W),sourceKind:U,sourceNodeId:L,targetNodeId:String(W?.targetNodeId||Q?.targetNodeId||""),commandId:w,raw:Q||W},i);let H=W||Q,E=Ty(H)||q,V=su(E);if(V===null)continue;let S=hS(H);for(let B of S){let D=kS(r,B,V,H),X=`control-target:${w}:${B}`;if($({id:X,runId:f,nodeId:B,procedureRunId:D.procedureRunId,attempt:"",kind:"control-target",tone:bS(H),status:G,label:xS(H,B),ms:D.ms,eventMs:V,onInterval:D.onInterval,snapReason:D.snapReason,snapped:Number(D.ms)!==V,timestampIso:E,renderedTimestampIso:xc(Number(D.ms)),action:oi(H),sourceKind:U,sourceNodeId:L,targetNodeId:B,commandId:w,raw:H},i),Z&&L&&L!==B)t.push({id:`control-arrow:${w}:${L}:${B}`,commandId:w,sourceNodeId:L,targetNodeId:B,sourceMarkerId:Z,targetMarkerId:X,sourceKind:U,action:oi(H),status:G})}}let j=[...n,...i].sort((F,J)=>Number(F.ms)-Number(J.ms)||String(F.nodeId).localeCompare(String(J.nodeId))||String(F.id).localeCompare(String(J.id)));return{...YS(j,t),sourceMarkerByCommand:c}}function gS({details:u,selectedNodeId:l,selectedNodeRuntime:f,control:r,onRaw:n}){if(!u)return K("span",{className:"muted"},"点击“抓取过程”读取 node 运行材料;主界面只显示结构化摘要,完整内容需点开原始 JSON。");let i=Du(u.procedureRuns),t=i.at(-1)||{},y=Du(t.attempts),c=y.at(-1)||{},$=Du(t.workerLogTail),A=Du(c.controlEventsTail),j=Du(c.controlPromptsTail),F=Du(c.monitorPromptsTail),J=p9(A),Q=p9(j),W=p9(F),L=c.opencodeMessages||{};return K("div",{className:"pipeline-evidence-list compact"},K(Vr,{title:"Node runtime",subtitle:l||"--",facts:[`status ${f?.status||"pending"}`,`attempts ${f?.attempts??y.length}`,`procedure ${f?.currentProcedureRunId||pr(t)||"--"}`,r.fetchedAt?`fetched ${yl(r.fetchedAt)}`:"not fetched"],data:u.node||u,onRaw:n,testId:"raw-pipeline-node-runtime"}),K(Vr,{title:"Procedure runs",subtitle:`${i.length} groups`,facts:[`latest ${t.status?.status||t.status||"--"}`,`steps ${Du(t.recentSteps).length}`,`duration ${Dr(su(t.finishedAt)&&su(t.startedAt)?Number(su(t.finishedAt))-Number(su(t.startedAt)):t.durationMs)}`],data:i,onRaw:n,testId:"raw-pipeline-node-procedures"}),K(Vr,{title:"OpenCode messages",subtitle:String(L.exists?"available":"not indexed"),facts:[`messages ${zA(L.messageCount)}`,`size ${zA(L.size)}`,`updated ${wu(L.updatedAt)}`],data:L,onRaw:n,testId:"raw-pipeline-node-messages"}),K(Vr,{title:"Control prompts",subtitle:"manual / monitor append queues",facts:[`manual tail ${Q.total}`,`monitor tail ${W.total}`,`last ${wu(g9(Q.lastAt,W.lastAt))}`],data:{controlPromptsTail:j,monitorPromptsTail:F},onRaw:n,testId:"raw-pipeline-node-prompts"}),K(Vr,{title:"Control events",subtitle:J.eventKinds.length>0?J.eventKinds.join(", "):"event tail",facts:[`tail ${J.total}`,`parsed ${J.parsed}`,`last ${wu(J.lastAt)}`],data:A,onRaw:n,testId:"raw-pipeline-node-events"}),K(Vr,{title:"Worker log",subtitle:"tail is hidden on main canvas",facts:[`tail ${$.length} lines`,"raw only via button",`procedure ${pr(t)||"--"}`],data:$,onRaw:n,testId:"raw-pipeline-node-worker-log"}))}function sS({activeRun:u,onRaw:l}){if(!u)return K(qr,{title:"暂无运行材料",text:"没有 Pipeline epoch 时不会展示运行材料索引。"});let f=Du(u.nodes),r=Du(u.procedureRuns),n=Du(u.submissions),i=Du(u.workerLogTail),t=KW(f),y=KW(r),c=r.filter((A)=>String(A?.status||"").toLowerCase()==="failed"),$=g9(...r.flatMap((A)=>[A.updatedAt,A.finishedAt,A.startedAt]));return K("div",{className:"pipeline-evidence-list"},K(Vr,{title:"Epoch overview",subtitle:u.runId||"--",facts:[`pipeline ${u.pipelineId||"--"}`,`status ${u.status||"--"}`,`started ${wu(u.startedAt)}`,`updated ${wu(u.updatedAt)}`],data:u,onRaw:l,testId:"raw-pipeline-run"}),K(Vr,{title:"Node states",subtitle:`${f.length} nodes`,facts:[`running ${t.running||0}`,`succeeded ${t.succeeded||0}`,`failed ${t.failed||0}`,`pending ${t.pending||0}`],data:f,onRaw:l,testId:"raw-pipeline-run-nodes"}),K(Vr,{title:"Procedure run index",subtitle:`${r.length} procedure records`,facts:[`succeeded ${y.succeeded||0}`,`failed ${y.failed||0}`,`latest ${wu($)}`,`errors ${c.length}`],data:r,onRaw:l,testId:"raw-pipeline-run-procedures"}),K(Vr,{title:"OA submissions",subtitle:`${n.length} submission files`,facts:[`records ${n.length}`,`task ${zA(u.task)}`,"raw grouped by run"],data:n,onRaw:l,testId:"raw-pipeline-run-submissions"}),K(Vr,{title:"Worker log tail",subtitle:"hidden from main interface",facts:[`tail ${i.length} lines`,"display raw only after click",`updated ${wu(u.updatedAt)}`],data:i,onRaw:l,testId:"raw-pipeline-run-worker-log"}))}function aS({diagnostics:u,onRaw:l}){let f=Du(u?.runs).filter(pu),r=Du(u?.forbiddenResiduals),n=pu(u?.guarantees)?u.guarantees:{},i=u?.hasNeutralNodeFinishedEvidence===!0&&u?.hasNoAuditPolicyEvidence===!0&&u?.hasAuditPolicyEvidence===!0,t=u?.ok===!0&&i&&r.length===0,y=f[0]||null,c=[{label:"中性完成事实",ok:n.neutralNodeFinished===!0,hint:"node-finished 不携带流程策略"},{label:"Config 策略判定",ok:n.auditPolicyFromConfig===!0,hint:"OA backend 读取当前 epoch 配置"},{label:"控制命令来自 OA",ok:n.runnerConsumesControlCommandsFromOaEvents===!0,hint:"runner 只消费 OA control.command"},{label:"无独立审核事件",ok:n.noIndependentAuditRequestEvent===!0,hint:"审核由 node-finished + policy 派生"},{label:"无批次门禁",ok:n.noBatchFinishedControlGate===!0,hint:"下游启动由每个 node 完成驱动"}];return K("div",{className:"pipeline-oa-panel","data-testid":"pipeline-oa-event-flow-panel"},K("div",{className:"metric-grid compact"},K(Yf,{label:"OA Flow",value:t?"100%":"--",hint:String(u?.mode||"waiting diagnostics"),tone:t?"ok":"warn"}),K(Yf,{label:"禁止残留",value:r.length,hint:r.length===0?"source scan clean":"needs cleanup",tone:r.length===0?"ok":"warn"}),K(Yf,{label:"No-audit",value:u?.hasNoAuditPolicyEvidence?"OK":"--",hint:"OA 下游策略证据",tone:u?.hasNoAuditPolicyEvidence?"ok":"warn"}),K(Yf,{label:"Monitor 审核",value:u?.hasAuditPolicyEvidence?"OK":"--",hint:"OA 控制事件闭环",tone:u?.hasAuditPolicyEvidence?"ok":"warn"})),K("div",{className:"pipeline-oa-guarantees"},c.map(($)=>K("article",{key:$.label,className:`pipeline-oa-guarantee ${$.ok?"ok":"warn"}`},K(o0,{status:$.ok?"online":"warn"},$.ok?"OK":"MISS"),K("div",null,K("strong",null,$.label),K("span",null,$.hint))))),K("div",{className:"pipeline-evidence-list compact"},f.slice(0,6).map(($)=>K(Vr,{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:l,testId:`raw-pipeline-oa-run-${String($.runId||"run").replace(/[^a-zA-Z0-9_.-]+/g,"-")}`}))),y?K("p",{className:"muted paragraph"},`最新证据 ${y.runId}: ${y.nodeFinishedCount||0} 个 node-finished,${y.controlAppliedCount||0} 个控制结果。`):K(qr,{title:"暂无 OA 事件流证据",text:"等待 Pipeline backend 暴露 diagnostics。"}),u?K("div",{className:"panel-actions inline-actions"},K(ln,{title:"Pipeline OA Event Flow Diagnostics",data:u,onOpen:l,testId:"raw-pipeline-oa-event-flow"})):null)}function oS({quota:u,onRaw:l}){let f=pu(u?.summary)?u.summary:{},r=pu(u?.target)?u.target:{},n=pu(u?.cache)?u.cache:{},i=u?.ok===!0,t=String(u?.modelId||f.modelName||r.modelName||"MiniMax-M2.7"),y=f.totalCount??r.currentIntervalTotalCount,c=f.usageCount??r.currentIntervalUsageCount,$=f.remainingCount??r.currentIntervalRemainingCount,A=f.remainingRatio??(Number.isFinite(Number(y))&&Number(y)>0&&Number.isFinite(Number($))?Number($)/Number(y):void 0),j=f.usageRatio??(Number.isFinite(Number(y))&&Number(y)>0&&Number.isFinite(Number(c))?Number(c)/Number(y):void 0),F=f.resetAt||r.endAt,J=f.remainsMs??r.remainsMs,Q=Number($),W=!i||Number.isFinite(Q)&&Q<=0?"warn":"ok",L=[i?`endpoint ${u?.endpoint||"--"}`:"quota unavailable",`fetched ${GA(u?.fetchedAt)}`,n.hit?`cache ${Dr(n.ageMs)}`:"live quota"];return K("div",{className:"pipeline-minimax-quota-panel","data-testid":"pipeline-minimax-quota-panel"},K("div",{className:"metric-grid compact"},K(Yf,{label:"MiniMax",value:i?t:"--",hint:u?.modelComponent||u?.error||"model/minimax-m27",tone:W}),K(Yf,{label:"当前窗口",value:`${D9(c)}/${D9(y)}`,hint:`已用 ${TW(j)}`,tone:W}),K(Yf,{label:"剩余额度",value:D9($),hint:`剩余 ${TW(A)}`,tone:W}),K(Yf,{label:"重置时间",value:GA(F),hint:J!==void 0?`约 ${Dr(J)}`:wu(F),tone:W})),K(a9,{items:L}),i?K("p",{className:"muted paragraph"},`MiniMax 限额来自 D601 Pipeline 后端实时查询;当前模型匹配 ${f.modelName||r.modelName||t}。`):K(nl,{error:u?.error||"MiniMax 限额查询失败"}),u?K("div",{className:"panel-actions inline-actions"},K(ln,{title:"Pipeline MiniMax Quota",data:u,onOpen:l,testId:"raw-pipeline-minimax-quota"})):null)}function dS({epochs:u,activeRun:l,activePipeline:f,pipelineNodes:r,pipelineEdges:n,runDetails:i,nodeDetails:t,nodeDetailsState:y,ganttScale:c=vc,onGanttScaleChange:$,onRunChange:A,onIntervalSelect:j,onMarkerSelect:F,selection:J,detailOpen:Q,onDetailOpenChange:W,onRaw:L}){let[U,q]=df(HS),[N,w]=df({startY:0,endY:0,startMs:0,endMs:0}),[G,Z]=df(Date.now()),H=s0(null),E=String(l?.runId||""),V=Boolean(Q),S=(Au)=>{if(typeof W==="function")W(Au)},B=d0(c??vc),D=String(i?.runId||"")===E?i?.details:null,X=D?{...pu(l)?l:{},...pu(D)?D:{},runId:E,procedureRuns:Du(D?.procedureRuns).length>0?D.procedureRuns:l?.procedureRuns}:l,O=eW(X,r,G),Y=D?IS(D,X):{markers:[],arrows:[]},p=Du(Y.markers),v=ZS(X,O,p),z=pS(v,B,O,G),P=String(z.source||"frontend-y"),k=O.map((Au)=>SS(Au,z,G)),I={startMs:Number(z.startMs),endMs:Number(z.endMs),durationMs:Math.max(1,Number(z.durationMs??Number(z.endMs)-Number(z.startMs)))},b=l7(B),d={...b,pxPerMinute:Number(z.pxPerMinute??b.pxPerMinute)},g=Math.round(Number(z.chartHeight||360)),x=O.some(f7);Ln(()=>{if(!E||!x)return;let Au=window.setInterval(()=>Z(Date.now()),1000);return()=>window.clearInterval(Au)},[E,x]);let lu=qS(f,r,Array.isArray(n)?n:[]),cu=r.map((Au)=>String(Au?.id||"")).filter(Boolean),_u=k.map((Au)=>String(Au.nodeId||"")).filter(Boolean),Fu=p.map((Au)=>String(Au.nodeId||"")).filter(Boolean),zu=Array.from(new Set([...lu,...cu,..._u,...Fu])),Wu={startY:0,endY:g,startMs:Number(I.startMs),endMs:Number(I.endMs)},C=Number(N?.endY||0)>0?N:Wu,e=(Au)=>{return mA(Au,I,g,z)<=Number(C.endY)&&I9(Au,I,g,z)>=Number(C.startY)},uu=(Au)=>{let au=Nr(Au,I,g,z);return au>=Number(C.startY)&&au<=Number(C.endY)},Gu=new Set(zu.filter((Au)=>k.some((au)=>au.nodeId===Au&&e(au))||p.some((au)=>au.nodeId===Au&&uu(au)))),s=U?zu.filter((Au)=>Gu.has(Au)):zu,qu=`${m9}px ${s.length>0?s.map(()=>`${wn}px`).join(" "):"minmax(160px, 1fr)"}`,Zu=Du(z.ticks).filter(pu),Bu=String(J?.mode==="interval"?J?.interval?.procedureRunId||"":""),Iu=String(J?.mode==="event"?J?.marker?.id||"":""),ll=()=>{let Au=H.current;if(!Au){w(Wu);return}let au=Math.max(0,Au.scrollTop-V9),Qf=Math.max(120,Au.clientHeight-V9),Yu=Math.min(g,au+Qf),cf={startY:au,endY:Yu,startMs:Number(I.startMs),endMs:Number(I.endMs)},_f=Math.max(0,Math.min(1,au/g)),fr=Math.max(_f,Math.min(1,Yu/g)),$f=Math.max(1,Number(I.endMs)-Number(I.startMs));cf.startMs=Number(I.startMs)+$f*_f,cf.endMs=Number(I.startMs)+$f*fr,w(cf)};Ln(()=>{let Au=H.current,au=window.setTimeout(ll,0);return Au?.addEventListener("scroll",ll),window.addEventListener("resize",ll),()=>{window.clearTimeout(au),Au?.removeEventListener("scroll",ll),window.removeEventListener("resize",ll)}},[E,I.startMs,I.endMs,g]);let Pu=Math.max(0,zu.length-s.length),Jl=new Set(p.filter((Au)=>s.includes(String(Au.nodeId||""))&&uu(Au)).map((Au)=>String(Au.id))),Jf=new Map(p.map((Au)=>[String(Au.id),Au])),Of=Du(Y.arrows).filter((Au)=>{if(!Jl.has(String(Au.targetMarkerId||"")))return!1;if(String(Au.action||"")==="observe")return s.includes(String(Au.sourceNodeId||""));return Jl.has(String(Au.sourceMarkerId||""))}),yf=m9+Math.max(1,s.length)*wn,lf=(Au)=>{let au=d0(Au.target.value);if(typeof $==="function")$(au);window.setTimeout(ll,0)},Zf=()=>zS({title:`${f?.id||"pipeline"}-${E||"epoch"}-gantt`,meta:[`run ${E||"--"}`,`${wu(I.startMs)} -> ${wu(I.endMs)}`,`duration ${Dr(I.durationMs)}`,`${d.label} / ${P9(d.pxPerMinute)} px/min`,`${s.length}/${zu.length} nodes`,`${p.length} markers`],visibleNodeIds:s,intervals:k,markers:p.filter((Au)=>s.includes(String(Au.nodeId||""))),arrows:Of,ticks:Zu,bounds:I,chartHeight:g,backendLayout:z}),Pf=pu(D?.gantt?.diagnostics)?D.gantt.diagnostics:null;return K(Wn,{title:"Epoch 甘特图",eyebrow:`${f?.id||"pipeline"} / ${u.length} epochs`,className:"pipeline-wide-panel",loading:i?.loading,actions:K("div",{className:"pipeline-gantt-actions"},K("select",{value:E,disabled:u.length===0,onChange:(Au)=>A(Au.target.value),"data-testid":"pipeline-epoch-select"},u.map((Au)=>K("option",{key:Au.runId,value:Au.runId},v9(u,Au)))),K("label",{className:"pipeline-gantt-toggle"},K("input",{type:"checkbox","data-testid":"pipeline-gantt-auto-hide-idle",checked:U,onChange:(Au)=>{q(Boolean(Au.target.checked)),window.setTimeout(ll,0)}}),K("span",null,"自动隐藏空闲列")),K("label",{className:"pipeline-gantt-scale"},K("span",null,K("b",null,"时间尺度"),K("em",{"data-testid":"pipeline-gantt-scale-label"},`${d.label} · ${P9(d.pxPerMinute)} px/min`)),K("input",{type:"range",min:0,max:100,step:0.01,value:B,onChange:lf,"aria-label":"调整甘特图时间尺度","data-testid":"pipeline-gantt-time-scale"}),K("small",null,K("span",null,"全局"),K("span",null,"细节"))),l?K("button",{type:"button",className:"ghost-btn",onClick:Zf,disabled:s.length===0,"data-testid":"pipeline-export-gantt"},"导出甘特图"):null,l?K(ln,{title:`Pipeline Epoch ${l.runId}`,data:l,onOpen:L,testId:"raw-pipeline-epoch-gantt"}):null)},!l?K(qr,{title:"暂无 Epoch",text:"当前 pipeline 还没有完整运行记录。"}):k.length===0?K(qr,{title:"暂无时间区间",text:"等待 D601 Pipeline backend 在 procedure summary 中返回 startedAt / finishedAt。"}):K("div",{className:"pipeline-gantt-wrap"},K("div",{className:`pipeline-gantt-detail-layout ${V?"detail-open":"detail-collapsed"}`,"data-testid":"pipeline-gantt-detail-layout","data-sidebar-open":V?"true":"false"},K("div",{className:"pipeline-gantt-main"},K("div",{className:"pipeline-gantt-main-head"},K("div",{className:"pipeline-gantt-meta"},K("span",null,`time ${wu(I.startMs)} -> ${wu(I.endMs)}`),K("span",null,`duration ${Dr(I.durationMs)}`),K("span",null,`scale ${d.label} / ${P9(d.pxPerMinute)} px/min`),K("span",null,`layout ${P}`),Pf?K("span",null,`align ${Pf.timeAxisAlignmentOk===!1?"check":"ok"}`):null,K("span",null,`visible ${s.length}/${zu.length} nodes`),D?K("span",null,`markers ${p.length}`):null,U&&Pu>0?K("span",null,`hidden idle ${Pu}`):null),!V?K("button",{type:"button",className:"pipeline-sidecar-tab right",disabled:!J?.mode,onClick:()=>S(!0),"data-testid":"pipeline-gantt-sidebar-toggle"},J?.mode?"展开详情":"点击甘特图元素展开详情"):null),K("div",{className:"pipeline-gantt-viewport",ref:H,"data-testid":"pipeline-epoch-gantt","data-pipeline-id":f?.id||"","data-run-id":E,"data-layout-source":P,"data-start-ms":String(I.startMs),"data-end-ms":String(I.endMs),"data-chart-height":String(g)},K("div",{className:"pipeline-gantt-board",style:{gridTemplateColumns:qu,minWidth:`${yf}px`}},K("div",{className:"pipeline-gantt-head time"},"Time"),s.length===0?K("div",{className:"pipeline-gantt-head empty"},"当前时间窗无工作节点"):s.map((Au)=>K("div",{key:`head-${Au}`,className:"pipeline-gantt-head node",title:Au,"data-testid":"pipeline-gantt-head-node","data-node-id":Au},K(ep,{value:Au}))),K("div",{className:"pipeline-gantt-time-axis",style:{height:`${g}px`}},Zu.map((Au)=>{let au=iL(Au,I,g,z);return K("div",{key:`tick-${Au.ms}-${au}`,className:"pipeline-gantt-tick",style:{top:`${au}px`},"data-testid":"pipeline-gantt-tick","data-ms":String(Au.ms),"data-y":String(au)},K("b",null,wu(Au.ms)),K("span",null,`+${Dr(Number(Au.offsetMs??Number(Au.ms)-Number(I.startMs)))}`))})),s.length>0?K("svg",{className:"pipeline-gantt-arrow-layer",width:s.length*wn,height:g,viewBox:`0 0 ${s.length*wn} ${g}`,style:{left:`${m9}px`,top:`${V9}px`,width:`${s.length*wn}px`,height:`${g}px`},"aria-hidden":"true"},K("defs",null,K("marker",{id:"pipeline-gantt-arrowhead",viewBox:"0 0 10 10",refX:9,refY:5,markerWidth:6,markerHeight:6,orient:"auto-start-reverse"},K("path",{d:"M 0 0 L 10 5 L 0 10 z",fill:"context-stroke"}))),Of.map((Au)=>{let au=Jf.get(String(Au.targetMarkerId||""));if(!au)return null;let Qf=Jf.get(String(Au.sourceMarkerId||"")),Yu=String(Qf?.nodeId||Au.sourceNodeId||""),cf=s.indexOf(Yu),_f=s.indexOf(String(au.nodeId||""));if(cf<0||_f<0)return null;let fr=cf*wn+wn/2,$f=_f*wn+wn/2,Hf=Qf?Nr(Qf,I,g,z):Nr(au,I,g,z),Gn=Nr(au,I,g,z);return K("path",{key:Au.id,className:`pipeline-gantt-arrow ${String(Au.sourceKind||"").toLowerCase()} ${String(Au.status||"").toLowerCase()} ${String(Au.action||"").toLowerCase()}`,d:tL(fr,Hf,$f,Gn),markerEnd:"url(#pipeline-gantt-arrowhead)","data-testid":String(Au.action||"")==="observe"?"pipeline-gantt-observation-arrow":"pipeline-gantt-arrow","data-source-node-id":String(Au.sourceNodeId||""),"data-target-node-id":String(Au.targetNodeId||""),"data-target-marker-id":String(Au.targetMarkerId||""),"data-action":String(Au.action||""),"data-source-y":String(Hf),"data-target-y":String(Gn)})})):null,s.length===0?K("div",{className:"pipeline-gantt-empty-col",style:{height:`${g}px`}},"滚动到有活动的时间段后,相关 node 列会自动出现。"):s.map((Au)=>{let au=k.filter((Yu)=>Yu.nodeId===Au),Qf=p.filter((Yu)=>String(Yu.nodeId||"")===Au);return K("div",{key:`col-${Au}`,className:"pipeline-gantt-node-col",style:{height:`${g}px`}},au.map((Yu)=>{let cf=mA(Yu,I,g,z),_f=I9(Yu,I,g,z),fr=nL(Yu,I,g,z),$f=String(Yu.procedureRunId||`${Au}-${Yu.startMs}`);return K("button",{key:$f,type:"button",className:`pipeline-gantt-bar ${Yu.status} ${Yu.live?"live":""} ${Bu===$f?"selected":""}`,style:{top:`${cf}px`,height:`${fr}px`},title:`${Au} ${Yu.status} ${wu(Yu.startedAt||Yu.startMs)} -> ${wu(Yu.finishedAt||Yu.endMs)}`,onClick:()=>j(Yu),"data-testid":"pipeline-gantt-line","data-node-id":Au,"data-procedure-run-id":String(Yu.procedureRunId||""),"data-status":String(Yu.status||""),"data-live":Yu.live?"true":"false","data-start-ms":String(Yu.startMs||""),"data-end-ms":String(Yu.endMs||""),"data-y1":String(cf),"data-y2":String(_f),"data-natural-height":String(Math.max(0,_f-cf))},K("strong",null,Yu.status||"working"),K("span",null,Dr(Yu.durationMs)))}),Qf.map((Yu)=>K("button",{key:Yu.id,type:"button",className:`pipeline-gantt-marker ${Yu.kind} ${Yu.tone||""} ${Yu.status||""} ${Iu===String(Yu.id)?"selected":""}`,style:{top:`${Nr(Yu,I,g,z)}px`},title:`${Yu.label||"event"} / ${wu(Yu.timestampIso||Yu.timestamp||Yu.ms)}`,onClick:()=>F(Yu),"data-testid":Yu.kind==="prompt"?"pipeline-gantt-prompt-marker":"pipeline-gantt-control-marker","data-marker-id":String(Yu.id||""),"data-ms":String(Yu.ms??Yu.eventMs??""),"data-y":String(Nr(Yu,I,g,z))})))})))),V?K(dp,{selection:J,runDetails:i,nodeDetails:t,nodeDetailsState:y,onRaw:L,onCollapse:()=>S(!1)}):null)))}function sn(){return{loading:!1,actionLoading:"",error:"",message:"",details:null,fetchedAt:null,appendPrompt:"",guidePrompt:"",modifyPrompt:"",approveReason:"",redoReason:""}}function g0(){return{mode:"",runId:"",interval:null,marker:null}}function C9(){return{runId:"",loading:!1,error:"",details:null,fetchedAt:null}}function Pc(u,l){return`${u}/microservices/pipeline/proxy${l}`}function eS({activeRun:u,pipelineRuns:l,selectedRunId:f,onRunChange:r,selectedNodeId:n,selectedNodeConfig:i,selectedNodeRuntime:t,control:y,onControlChange:c,onFetch:$,onAction:A,onRaw:j,onCollapse:F}){let J=String(u?.runId||""),Q=String(t?.status||"pending"),W=!J||!n||y.loading||Boolean(y.actionLoading),L=(q)=>(N)=>c({[q]:N.target.value,error:"",message:""}),U=l.length>0?l:u?[u]:[];return K("aside",{className:"pipeline-node-control","data-testid":"pipeline-node-control"},K("div",{className:"pipeline-node-control-head"},K("div",null,K("p",{className:"panel-eyebrow"},"Manual Node Control"),K(rl,{title:n||"点击控制图中的 node",level:3,loading:y.loading||Boolean(y.actionLoading)})),K("div",{className:"pipeline-node-control-head-actions"},n?K(o0,{status:Q},Q):K(o0,{status:"pending"},"idle"),K("button",{type:"button",className:"ghost-btn mini",onClick:F,"data-testid":"pipeline-node-sidebar-collapse"},"收起"))),K("div",{className:"pipeline-control-runbar"},K("label",null,K("span",null,"目标 run"),K("select",{value:J||f,disabled:U.length===0,onChange:(q)=>r(q.target.value),"data-testid":"pipeline-node-run-select"},U.map((q)=>K("option",{key:q.runId,value:q.runId},`${q.runId||"--"} / ${q.status||"--"}`)))),K("button",{type:"button",className:"ghost-btn",disabled:W,onClick:$,"data-testid":"pipeline-node-fetch"},y.loading?"抓取中":"抓取过程"),y.details?K(ln,{title:`Pipeline Node ${n}`,data:y.details,onOpen:j,testId:"raw-pipeline-node-control"}):null),K("div",{className:"pipeline-control-meta"},K("span",null,K("b",null,"kind"),String(i?.kind||"--")),K("span",null,K("b",null,"procedure"),String(t?.currentProcedureRunId||"--")),K("span",null,K("b",null,"attempts"),String(t?.attempts??"--")),K("span",null,K("b",null,"updated"),wu(u?.updatedAt))),!n?K(qr,{title:"未选择 node",text:"点击 React Flow 控制图中的任意 node 后,可抓取执行过程、追加 prompt、下发引导、增量修改、审核通过或重做。"}):null,K(nl,{error:y.error,wide:!0}),K("div",{className:"pipeline-control-actions"},K("label",null,K("span",null,"实时追加 prompt(仅 running node)"),K("textarea",{value:y.appendPrompt,onChange:L("appendPrompt"),placeholder:"让当前执行中的 agent 继续、补充检查或调整当前步骤...",rows:4,disabled:!n,"data-testid":"pipeline-node-append-input"}),K("button",{type:"button",className:"primary-btn compact",disabled:W||!String(y.appendPrompt||"").trim(),onClick:()=>A("append"),"data-testid":"pipeline-node-append-button"},y.actionLoading==="append"?"追加中":"追加到运行中 node")),K("label",null,K("span",null,"下次尝试引导 prompt"),K("textarea",{value:y.guidePrompt,onChange:L("guidePrompt"),placeholder:"给该 node 下一次 attempt 的执行提示;不会立即打断当前 session。",rows:4,disabled:!n,"data-testid":"pipeline-node-guide-input"}),K("button",{type:"button",className:"ghost-btn compact",disabled:W||!String(y.guidePrompt||"").trim(),onClick:()=>A("guide"),"data-testid":"pipeline-node-guide-button"},y.actionLoading==="guide"?"下发中":"下发 guide")),K("label",null,K("span",null,"完成后增量修改 prompt"),K("textarea",{value:y.modifyPrompt,onChange:L("modifyPrompt"),placeholder:"在该 node 已完成结果基础上追加修改要求;runner 会重跑目标 node,并保留同 node 既有 OA 输出作为上下文。",rows:4,disabled:!n,"data-testid":"pipeline-node-modify-input"}),K("button",{type:"button",className:"ghost-btn compact",disabled:W||!String(y.modifyPrompt||"").trim(),onClick:()=>A("modify"),"data-testid":"pipeline-node-modify-button"},y.actionLoading==="modify"?"排队中":"增量修改 node")),K("label",null,K("span",null,"Monitor 审核通过原因"),K("textarea",{value:y.approveReason,onChange:L("approveReason"),placeholder:"当流程配置开启 monitor 审核时,记录审核通过原因并释放后续 node。",rows:3,disabled:!n,"data-testid":"pipeline-node-approve-input"}),K("button",{type:"button",className:"primary-btn compact",disabled:W||!String(y.approveReason||"").trim(),onClick:()=>A("approve"),"data-testid":"pipeline-node-approve-button"},y.actionLoading==="approve"?"提交中":"审核通过")),K("label",null,K("span",null,"重做 / restart 原因"),K("textarea",{value:y.redoReason,onChange:L("redoReason"),placeholder:"说明为什么需要重做;runner 会重置目标 node 以及非 rework 下游 node。",rows:4,disabled:!n,"data-testid":"pipeline-node-redo-input"}),K("button",{type:"button",className:"danger-btn compact",disabled:W||!String(y.redoReason||"").trim(),onClick:()=>A("redo"),"data-testid":"pipeline-node-redo-button"},y.actionLoading==="redo"?"排队中":"重做 node"))),K("div",{className:"pipeline-control-evidence"},K("strong",null,"Node 过程索引"),K(gS,{details:y.details,selectedNodeId:n,selectedNodeRuntime:t,control:y,onRaw:j})))}function yL({microservices:u,onRaw:l,apiBaseUrl:f="/api"}){let r=u.find((fu)=>fu.id==="pipeline")||null,[n,i]=df({loading:!1,error:"",health:null,snapshot:null,oaDiagnostics:null,minimaxQuota:null,refreshedAt:null}),[t,y]=df(""),[c,$]=df(""),[A,j]=df(""),[F,J]=df(sn()),[Q,W]=df({}),[L,U]=df(g0()),[q,N]=df(C9()),[w,G]=df(vc),[Z,H]=df(!1),[E,V]=df(!1),S=s0(0),{addNotification:B}=pf(),D=s0(!1),X=s0(0),O=s0(""),Y=s0({}),p=s0(""),v=s0("");async function z(fu={}){let mu=fu.silent===!0;if(!r)return;if(D.current)return;D.current=!0;let Xu=S.current+1;if(S.current=Xu,!mu)i((ou)=>({...ou,loading:!0,error:""}));try{let ou=`__unideskArrayLimit=registry.components:80,runs:${Sp}`,[$l,Rl,_l]=await Promise.all([I0(`${f}/microservices/pipeline/proxy/api/snapshot?${ou}`,{cache:"no-store"}),I0(`${f}/microservices/pipeline/proxy/api/oa-event-flow/diagnostics`,{cache:"no-store"}).catch((Xr)=>({ok:!1,error:Ou(Xr,"OA event flow diagnostics failed")})),I0(`${f}/microservices/pipeline/proxy/api/model-quota/minimax`,{cache:"no-store"}).catch((Xr)=>({ok:!1,error:Ou(Xr,"MiniMax quota failed")}))]);if(Xu!==S.current)return;let Nf={ok:$l?.ok!==!1,service:"pipeline-v2-control snapshot"};i({loading:!1,error:"",health:Nf,snapshot:$l,oaDiagnostics:Rl,minimaxQuota:_l,refreshedAt:new Date})}catch(ou){if(Xu!==S.current)return;i(($l)=>({...$l,loading:!1,error:Ou(ou,"Pipeline 加载失败")}))}finally{D.current=!1}}Ln(()=>{if(z(),!r)return;let fu=()=>{if(wA())z({silent:!0})},mu=window.setInterval(()=>{fu()},wW),Xu=()=>{if(wA())fu()};return document.addEventListener("visibilitychange",Xu),()=>{window.clearInterval(mu),document.removeEventListener("visibilitychange",Xu)}},[r?.id,r?.runtime?.providerStatus,f]);let P=uS(r),k=fS(r),I=lS(r),b=n.snapshot||{},d=n.oaDiagnostics||null,g=n.minimaxQuota||null,{components:x,pipelines:lu,runs:cu}=rS(b),_u=String(cu[0]?.pipelineId||""),Fu=(_u?lu.find((fu)=>String(fu.id||"")===_u):null)||lu[0]||{},zu=lu.find((fu)=>String(fu.id||"")===t)||Fu,Wu=String(zu.id||""),C=gW(zu),e=d9(zu),uu=SW(cu,Wu),Gu=OS(cu,Wu),s=Gu.find((fu)=>String(fu?.runId||"")===c)||uu,qu=String(q.runId||"")===String(s?.runId||"")?yS(q.details):null,Zu=cS(s,qu),Bu=String(Zu?.runId||""),Iu=C.find((fu)=>String(fu?.id||"")===A)||null,ll=A?sW(Zu,A):null,Pu=iS(cu),Jl=jS(x),Jf=Number(n.health?.components)||ZW(b,"registry.components",x.length),Of=ZW(b,"runs",cu.length),yf=mW(zu,Zu,x),lf={nodes:yf.nodes.map((fu)=>fu.id===A?{...fu,selected:!0,className:`${fu.className||""} selected-control-node`}:fu),edges:yf.edges},Zf=lu.map((fu)=>{let mu=String(fu.id||"pipeline"),Xu=SW(cu,mu);return{title:`${mu}-${Xu?.runId||"snapshot"}`,flow:mW(fu,Xu,x)}}),Pf=String(L?.runId||Bu||""),Au=String(L?.interval?.nodeId||L?.marker?.nodeId||""),au=Pf&&Au?Q[Y9(Pf,Au)]||null:null,Qf=EA(F.details,Pf,Au),Yu=EA(au?.details,Pf,Au)||Qf,cf=Pf&&Au?{...pu(au)?au:{},runId:Pf,nodeId:Au,details:Yu,loading:Boolean(au?.loading)||!Yu&&Boolean(F.loading)&&A===Au,error:String(au?.error||""),fetchedAt:au?.fetchedAt||(Qf?F.fetchedAt:null)}:null,_f=Gu.map((fu)=>String(fu?.runId||"")).filter(Boolean).join("|"),fr=C.map((fu)=>String(fu?.id||"")).filter(Boolean).join("|");Ln(()=>{p.current=A},[A]),Ln(()=>{v.current=Bu},[Bu]),Ln(()=>{if(!c||_f.split("|").includes(c))return;$("")},[c,_f]),Ln(()=>{if(!A||fr.split("|").includes(A))return;j(""),J(sn()),U(g0()),H(!1),V(!1)},[A,fr]),Ln(()=>{if(!A)H(!1)},[A]),Ln(()=>{if(!L.mode)V(!1)},[L.mode]);async function $f(fu=Bu,mu={}){if(!fu){N(C9());return}let Xu=d0(mu.scale??w??vc),ou=`${fu}:timeline`;if(O.current===ou)return;O.current=ou;let $l=mu.silent===!0,Rl=X.current+1;X.current=Rl,N((_l)=>({runId:fu,scale:Xu,loading:!$l||String(_l.runId||"")!==fu||!_l.details,error:"",details:$l&&_l.runId===fu?_l.details:_l.runId===fu?_l.details:null,fetchedAt:_l.runId===fu?_l.fetchedAt:null}));try{let[_l,Nf]=await Promise.all([I0(Pc(f,`/api/node-control/runs/${encodeURIComponent(fu)}?tail=160&view=timeline`),{cache:"no-store",strictJson:!0}),I0(Pc(f,`/api/runs/${encodeURIComponent(fu)}`),{cache:"no-store"}).catch((Xr)=>({ok:!1,runSummaryError:Ou(Xr,"抓取评分失败")}))]);if(Rl!==X.current)return;N({runId:fu,scale:Xu,loading:!1,error:"",details:{..._l,run:pu(Nf?.run)?Nf.run:void 0,runSummaryError:Nf?.runSummaryError},fetchedAt:new Date})}catch(_l){if(Rl!==X.current)return;N((Nf)=>({runId:fu,scale:Xu,loading:!1,error:Ou(_l,"抓取 epoch 执行过程失败"),details:Nf.runId===fu?Nf.details:null,fetchedAt:Nf.runId===fu?Nf.fetchedAt:null}))}finally{if(O.current===ou)O.current=""}}function Hf(fu,mu,Xu){let ou=Y9(fu,mu);W(($l)=>{let Rl={...$l,[ou]:{...pu($l?.[ou])?$l[ou]:{},runId:fu,nodeId:mu,...Xu}},_l=Object.keys(Rl);if(_l.length>32)for(let Nf of _l.slice(0,_l.length-32))delete Rl[Nf];return Rl})}async function Gn(fu,mu){if(!fu||!mu)return;let Xu=Y9(fu,mu),ou=Number(Y.current?.[Xu]||0)+1;Y.current={...Y.current,[Xu]:ou},Hf(fu,mu,{loading:!0,error:""});try{let $l=await I0(Pc(f,`/api/node-control/runs/${encodeURIComponent(fu)}/nodes/${encodeURIComponent(mu)}?tail=160`),{cache:"no-store",strictJson:!0});if(Number(Y.current?.[Xu]||0)!==ou)return;let Rl=new Date;if(Hf(fu,mu,{loading:!1,details:$l,fetchedAt:Rl,error:""}),p.current===mu&&v.current===fu)J((_l)=>({..._l,loading:!1,details:$l,fetchedAt:Rl,error:""}))}catch($l){if(Number(Y.current?.[Xu]||0)!==ou)return;Hf(fu,mu,{loading:!1,error:Ou($l,"抓取 Gantt node 详情失败")})}}Ln(()=>{if(!Bu){N(C9());return}$f(Bu);let fu=()=>{if(wA())$f(Bu,{silent:!0})},mu=window.setInterval(()=>{fu()},wW),Xu=()=>{if(wA())fu()};return document.addEventListener("visibilitychange",Xu),()=>{window.clearInterval(mu),document.removeEventListener("visibilitychange",Xu)}},[Bu,f]);async function rr(fu=Bu,mu=A){if(!fu||!mu){J((Xu)=>({...Xu,error:"请先选择 run 和 node",message:""}));return}J((Xu)=>({...Xu,loading:!0,error:"",message:""}));try{let Xu=await I0(Pc(f,`/api/node-control/runs/${encodeURIComponent(fu)}/nodes/${encodeURIComponent(mu)}?tail=160`),{cache:"no-store",strictJson:!0}),ou=new Date;J(($l)=>({...$l,loading:!1,details:Xu,fetchedAt:ou,error:""})),Hf(fu,mu,{loading:!1,details:Xu,fetchedAt:ou,error:""})}catch(Xu){J((ou)=>({...ou,loading:!1,error:Ou(Xu,"抓取 node 执行过程失败")}))}}async function dn(fu){let mu=String(fu?.runId||Bu||""),Xu=String(fu?.nodeId||"");if(U({mode:"interval",runId:mu,interval:fu,marker:null}),V(!0),!mu||!Xu)return;if(mu!==Bu)$(mu);j(Xu),J(sn()),$f(mu,{silent:!0}),Gn(mu,Xu)}async function Ql(fu){let mu=String(fu?.runId||Bu||""),Xu=String(fu?.nodeId||"");if(U({mode:"event",runId:mu,interval:null,marker:fu}),V(!0),!mu)return;if(mu!==Bu)$(mu);if($f(mu,{silent:!0}),!Xu)return;j(Xu),J(sn()),Gn(mu,Xu)}async function ei(fu){if(!Bu||!A){J((ou)=>({...ou,error:"请先选择 run 和 node",message:""}));return}let mu=fu==="append"?"prompts":fu,Xu=fu==="append"?F.appendPrompt:fu==="guide"?F.guidePrompt:fu==="modify"?F.modifyPrompt:fu==="approve"?F.approveReason:F.redoReason;if(!String(Xu||"").trim()){J((ou)=>({...ou,error:"操作内容不能为空",message:""}));return}J((ou)=>({...ou,actionLoading:fu,error:"",message:""}));try{let ou=fu==="redo"||fu==="approve"?{reason:Xu,source:"unidesk-frontend",sourceKind:"webui"}:{prompt:Xu,source:"unidesk-frontend",sourceKind:"webui"},$l=await I0(Pc(f,`/api/node-control/runs/${encodeURIComponent(Bu)}/nodes/${encodeURIComponent(A)}/${mu}`),{method:"POST",body:JSON.stringify(ou)});if(J((_l)=>({..._l,actionLoading:"",details:$l,fetchedAt:new Date,appendPrompt:fu==="append"?"":_l.appendPrompt,guidePrompt:fu==="guide"?"":_l.guidePrompt,modifyPrompt:fu==="modify"?"":_l.modifyPrompt,approveReason:fu==="approve"?"":_l.approveReason,redoReason:fu==="redo"?"":_l.redoReason,message:fu==="append"?"已追加到运行中 node":fu==="guide"?"已下发 guide,等待 runner 处理":fu==="modify"?"已排队增量修改命令":fu==="approve"?"已提交审核通过决策":"已排队重做命令"})),B("success",fu==="append"?"已追加到运行中 node":fu==="guide"?"已下发 guide,等待 runner 处理":fu==="modify"?"已排队增量修改命令":fu==="approve"?"已提交审核通过决策":"已排队重做命令"),await rr(Bu,A),await $f(Bu,{silent:!0}),fu!=="append")await z()}catch(ou){J(($l)=>({...$l,actionLoading:"",error:Ou(ou,"node 控制操作失败")}))}}if(!r)return K(qr,{title:"Pipeline 未登记",text:"请在 config.json 的 microservices 中登记用户服务 id=pipeline"});return K("div",{className:"pipeline-page","data-testid":"pipeline-page"},K(Wn,{title:"Pipeline v2 工作台",eyebrow:"D601 Snapshot 用户服务",loading:n.loading,actions:K("div",{className:"panel-actions"},K("button",{type:"button",className:"ghost-btn",onClick:z,disabled:n.loading,"data-testid":"pipeline-refresh-button"},n.loading?"刷新中":"刷新"),K(ln,{title:"Pipeline 用户服务",data:r,onOpen:l,testId:"raw-pipeline-service"}))},K("div",{className:"pipeline-hero"},K("div",null,K("div",{className:"node-version-line"},K(o0,{status:P.providerStatus==="online"?"online":"warn"},P.providerStatus||"unknown"),K("span",null,r.providerId),K("span",null,I.public?"公网暴露":"仅 UniDesk frontend 代理访问")),K("p",{className:"muted paragraph"},r.description)),K("div",{className:"microservice-ref-card"},K("span",null,"Repo"),K("strong",null,k.url||"--"),K("code",null,k.commitId||"--")),K("div",{className:"microservice-ref-card"},K("span",null,"D601 Docker"),K("strong",null,`${I.nodeBindHost||"--"}:${I.nodePort||"--"}`),K("code",null,`${k.composeFile||"--"} / ${k.composeService||"--"}`))),K(nl,{error:n.error,wide:!0})),K("div",{className:"pipeline-grid"},K(Wn,{title:"控制图",eyebrow:`${zu.id||"pipeline"} / run ${Zu?.status||"--"}`,className:"pipeline-wide-panel",loading:n.loading,actions:K("div",{className:"pipeline-toolbar"},K("select",{value:Wu,disabled:lu.length===0,onChange:(fu)=>{y(fu.target.value),$(""),j(""),J(sn()),U(g0()),H(!1),V(!1)},"data-testid":"pipeline-select"},lu.map((fu)=>K("option",{key:fu.id,value:fu.id},fu.id||fu.key))),K("select",{value:Bu,disabled:Gu.length===0,onChange:(fu)=>{if($(fu.target.value),J(sn()),U(g0()),H(!1),V(!1),A)rr(fu.target.value,A)},"data-testid":"pipeline-run-select"},Gu.map((fu)=>K("option",{key:fu.runId,value:fu.runId},v9(Gu,fu)))),K("button",{type:"button",className:"ghost-btn",disabled:lf.nodes.length===0,onClick:()=>dW(lf,`${zu.id||"pipeline"}-${Zu?.runId||"snapshot"}`),"data-testid":"pipeline-export-graph"},"导出渲染图"),K("button",{type:"button",className:"ghost-btn",disabled:Zf.every((fu)=>fu.flow.nodes.length===0),onClick:()=>ES(Zf),"data-testid":"pipeline-export-all-graphs"},"批量导出"))},C.length===0?K(qr,{title:"暂无控制图",text:"等待 D601 pipeline backend 返回 config.nodes / config.edges"}):K("div",{className:`pipeline-control-shell ${Z?"detail-open":"detail-collapsed"}`,"data-testid":"pipeline-control-shell","data-sidebar-open":Z?"true":"false"},K("div",{className:"pipeline-flow-frame","data-testid":"pipeline-react-flow"},K(jW,{nodes:lf.nodes,edges:lf.edges,nodeTypes:Mp,edgeTypes:Cp,fitView:!0,fitViewOptions:{padding:0.18},nodesDraggable:!1,nodesConnectable:!1,elementsSelectable:!0,minZoom:0.25,maxZoom:1.4,proOptions:{hideAttribution:!0},onNodeClick:(fu,mu)=>{let Xu=String(mu.id);if(j(Xu),J(sn()),H(!0),Bu)rr(Bu,Xu)}},K(UW,{gap:22,size:1,color:"rgba(215, 161, 58, 0.24)"}),K(QW,{showInteractive:!1})),!Z?K("button",{type:"button",className:"pipeline-sidecar-tab right",disabled:!A,onClick:()=>H(!0),"data-testid":"pipeline-node-sidebar-toggle"},A?"展开 node 控制":"点击 node 展开控制"):null),Z?K(eS,{activeRun:Zu,pipelineRuns:Gu,selectedRunId:c,onRunChange:(fu)=>{if($(fu),J(sn()),U(g0()),A)rr(fu,A)},selectedNodeId:A,selectedNodeConfig:Iu,selectedNodeRuntime:ll,control:F,onControlChange:(fu)=>J((mu)=>({...mu,...fu})),onFetch:()=>rr(),onAction:ei,onRaw:l,onCollapse:()=>H(!1)}):null),K("div",{className:"pipeline-flow-summary"},K("span",null,`${lf.nodes.length} nodes`),K("span",null,`${lf.edges.length} edges`),K("span",null,`${lu.length} pipelines`),K("span",null,`source config+components(${x.length})`),K("span",null,`run ${Zu?.runId||"--"}`),K("span",null,`score ${b9(Zu)}`),K("span",null,A?`selected ${A}`:"click node to control"))),K(dS,{epochs:Gu,activeRun:Zu,activePipeline:zu,pipelineNodes:C,pipelineEdges:e,selection:L,detailOpen:E,onDetailOpenChange:V,runDetails:q,nodeDetails:Yu,nodeDetailsState:cf,ganttScale:w,onGanttScaleChange:G,onIntervalSelect:dn,onMarkerSelect:Ql,onRunChange:(fu)=>{if($(fu),J(sn()),U(g0()),V(!1),A)rr(fu,A)},onRaw:l}),K(Wn,{title:"观测指标",eyebrow:n.refreshedAt?`Updated ${yl(n.refreshedAt)}`:"Snapshot",loading:n.loading},K("div",{className:"metric-grid"},K(Yf,{label:"Health",value:n.health?.ok?"OK":"--",hint:n.health?.service||"D601 /health",tone:n.health?.ok?"ok":"warn"}),K(Yf,{label:"组件",value:Jf,hint:"components registry",tone:b?.registry?.ok===!1?"warn":"ok"}),K(Yf,{label:"Pipeline",value:lu.length,hint:`${C.length} nodes / ${e.length} edges`}),K(Yf,{label:"运行记录",value:Of,hint:`${Pu.succeeded||0} succeeded / ${Pu.running||0} running`}),K(Yf,{label:"OA 记录",value:Array.isArray(uu?.submissions)?uu.submissions.length:0,hint:uu?.runId||"latest run"}),K(Yf,{label:"Procedure",value:Array.isArray(uu?.procedureRuns)?uu.procedureRuns.length:0,hint:uu?.status||"no run"}),K(Yf,{label:"Score",value:b9(Zu),hint:Zu?.runId||"selected epoch",tone:u7(Zu)})),K("div",{className:"panel-actions inline-actions"},K(ln,{title:"Pipeline Snapshot",data:b,onOpen:l,testId:"raw-pipeline-snapshot"}))),K(Wn,{title:"评分器",eyebrow:Zu?.runId||"selected epoch",loading:n.loading},K(AS,{run:Zu,onRaw:l})),K(Wn,{title:"MiniMax 限额",eyebrow:"model/minimax-m27 quota",loading:n.loading},K(oS,{quota:g,onRaw:l})),K(Wn,{title:"OA 事件流",eyebrow:"100% event-driven diagnostics",className:"pipeline-wide-panel",loading:n.loading},K(aS,{diagnostics:d,onRaw:l})),K(Wn,{title:"组件矩阵",eyebrow:`${Jl.length} classes`,loading:n.loading},Jl.length===0?K(qr,{title:"暂无组件",text:"等待 D601 pipeline backend 返回 registry.components"}):K("div",{className:"component-strata"},Jl.map((fu)=>K("article",{key:fu.name,className:"component-stratum"},K("span",null,fu.name),K("strong",null,fu.count)))),K("div",{className:"pipeline-component-list"},x.slice(0,12).map((fu)=>K("span",{key:fu.key,className:"data-chip"},K("b",null,fu.componentClass||"--"),K("span",null,fu.id||fu.key||"--"))))),K(Wn,{title:"Epoch 列表",eyebrow:`${Gu.length}/${Of} preview`,loading:n.loading},Gu.length===0?K(qr,{title:"暂无运行记录",text:"当前 pipeline 在 .state/pipeline-runs 中还没有 epoch。"}):K("div",{className:"pipeline-run-list"},Gu.map((fu)=>{let mu=String(fu?.runId||"")===Bu?Zu:fu;return K("article",{key:fu.runId,className:`pipeline-run-card ${String(fu.runId||"")===Bu?"active":""}`,role:"button",tabIndex:0,onClick:()=>{$(String(fu.runId||"")),U(g0())},onKeyDown:(Xu)=>{if(Xu.key==="Enter"||Xu.key===" ")$(String(fu.runId||"")),U(g0())}},K("div",{className:"node-card-head"},K("strong",null,v9(Gu,fu)),K(o0,{status:fu.status},fu.status||"--")),K("div",{className:"docker-meta compact"},K("span",null,mu?.pipelineId||"--"),K("span",null,`nodes ${Array.isArray(mu?.nodes)?mu.nodes.length:0}`),K("span",null,`oa ${Array.isArray(mu?.submissions)?mu.submissions.length:0}`),K("span",null,`procedures ${Array.isArray(mu?.procedureRuns)?mu.procedureRuns.length:0}`),K($S,{run:mu})),K("p",{className:"muted paragraph"},zA(mu?.task)),K("span",{className:"pipeline-run-time"},wu(mu?.updatedAt)))}))),K(Wn,{title:"运行材料索引",eyebrow:Zu?.runId||"selected epoch",className:"pipeline-wide-panel",loading:n.loading},K(sS,{activeRun:Zu,onRaw:l}))))}var YA=Cu(Fl(),1);var yu=YA.default.createElement,{useEffect:uX}=YA.default,SA=YA.default.useState,n7={id:"",sequenceNo:"",contractNo:"",name:"",currentStatus:"",pending:"",paymentStatus:"",notes:""};function lX({status:u,children:l}){let f=String(u||"unknown").toLowerCase();return yu("span",{className:`status-badge ${f}`},l||u||"unknown")}function XA({label:u,value:l,hint:f,tone:r}){return yu("article",{className:`metric-card ${r||""}`},yu("div",{className:"metric-label"},u),yu("div",{className:"metric-value"},l),yu("div",{className:"metric-hint"},f))}function i7({title:u,eyebrow:l,actions:f,children:r,className:n,loading:i}){return yu("section",{className:`panel ${n||""}`},yu("div",{className:"panel-head"},yu("div",null,l?yu("p",{className:"panel-eyebrow"},l):null,yu(rl,{title:u,loading:i})),f?yu("div",{className:"panel-actions"},f):null),yu("div",{className:"panel-body"},r))}function cL({title:u,data:l,onOpen:f,testId:r}){return yu("button",{type:"button",className:"ghost-btn","data-testid":r,onClick:()=>f(u,l)},"查看原始JSON")}function _L({title:u,text:l}){return yu("div",{className:"empty-state"},yu("strong",null,u),yu("span",null,l))}function fX(u){return u?.runtime&&typeof u.runtime==="object"&&!Array.isArray(u.runtime)?u.runtime:{}}function rX(u){return u?.backend&&typeof u.backend==="object"&&!Array.isArray(u.backend)?u.backend:{}}function nX(u){return u?.repository&&typeof u.repository==="object"&&!Array.isArray(u.repository)?u.repository:{}}function Ey(u,l){return`${u}/microservices/project-manager/proxy${l}`}function iX(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 tX(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 t7(u){return String(u||"item").replace(/[^A-Za-z0-9_-]+/g,"-")}function yX(u){let l=new Uint8Array(u),f="",r=32768;for(let n=0;nyu("tr",{key:n.id,className:l===n.id?"active-row":"","data-testid":`project-manager-row-${t7(n.id)}`},yu("td",null,n.sequenceNo??"--"),yu("td",null,yu("strong",null,n.contractNo||"--"),yu("code",null,n.id||"--")),yu("td",null,yu("strong",null,n.name||"--"),yu("span",{className:"muted block"},n.sourceFile||"--")),yu("td",null,n.currentStatus||"--"),yu("td",null,yu("span",{className:"preline"},n.pending||"--")),yu("td",null,yu(lX,{status:Number(n.paymentRatio||0)>=1?"online":"warn"},n.paymentStatus||"--")),yu("td",null,n.notes||"--"),yu("td",null,yu("div",{className:"inline-actions"},yu("button",{type:"button",className:"ghost-btn",onClick:()=>f(n),"data-testid":`project-manager-edit-${t7(n.id)}`},"编辑"),yu(cL,{title:`Project ${n.contractNo||n.id}`,data:n,onOpen:r,testId:`raw-project-${t7(n.id)}`}))))))))}function $L({microservices:u,onRaw:l,apiBaseUrl:f="/api"}){let r=u.find((E)=>E.id==="project-manager")||null,[n,i]=SA({loading:!1,saving:!1,importing:!1,exporting:!1,error:"",notice:"",health:null,list:null,refreshedAt:null}),[t,y]=SA({...n7}),[c,$]=SA(""),[A,j]=SA("all"),{addNotification:F}=pf();async function J(E=c,V=A){if(!r)return;i((S)=>({...S,loading:!0,error:""}));try{let S=new URLSearchParams({pageSize:"200",status:V});if(E.trim())S.set("q",E.trim());let[B,D]=await Promise.all([Eu(`${f}/microservices/project-manager/health`),Eu(Ey(f,`/api/projects?${S.toString()}`))]);i((X)=>({...X,loading:!1,health:B,list:D,refreshedAt:new Date,error:""}))}catch(S){i((B)=>({...B,loading:!1,error:Ou(S,"Project Manager 加载失败")}))}}uX(()=>{J()},[r?.id,r?.runtime?.providerStatus]);async function Q(E){E.preventDefault(),i((V)=>({...V,saving:!0,error:"",notice:""}));try{let V=tX(t);if(t.id)await Eu(Ey(f,`/api/projects/${encodeURIComponent(t.id)}`),{method:"PUT",body:JSON.stringify(V)});else await Eu(Ey(f,"/api/projects"),{method:"POST",body:JSON.stringify(V)});let S=t.id?"项目已更新":"项目已创建";i((B)=>({...B,saving:!1,notice:S})),F("success",S),await J()}catch(V){i((S)=>({...S,saving:!1,error:Ou(V,"保存项目失败")}))}}async function W(){if(!t.id)return;if(!window.confirm(`删除项目 ${t.contractNo||t.name||t.id} ?`))return;i((E)=>({...E,saving:!0,error:"",notice:""}));try{await Eu(Ey(f,`/api/projects/${encodeURIComponent(t.id)}`),{method:"DELETE"}),y({...n7});let E="项目已删除";i((V)=>({...V,saving:!1,notice:E})),F("success",E),await J()}catch(E){i((V)=>({...V,saving:!1,error:Ou(E,"删除项目失败")}))}}async function L(E){let V=E.target.files?.[0];if(!V)return;i((S)=>({...S,importing:!0,error:"",notice:""}));try{let S=yX(await V.arrayBuffer()),D=`Excel 已导入 ${(await Eu(Ey(f,"/api/import/excel"),{method:"POST",body:JSON.stringify({fileName:V.name,contentBase64:S,replace:!1})})).imported||0} 条项目`;i((X)=>({...X,importing:!1,notice:D})),F("success",D),E.target.value="",await J()}catch(S){i((B)=>({...B,importing:!1,error:Ou(S,"Excel 导入失败")}))}}async function U(){i((E)=>({...E,exporting:!0,error:""}));try{let E=await KJ(Ey(f,"/api/projects/export.xlsx")),V=URL.createObjectURL(E),S=document.createElement("a");S.href=V,S.download=`project-manager-${lj()}.xlsx`,document.body.appendChild(S),S.click(),S.remove(),URL.revokeObjectURL(V),i((B)=>({...B,exporting:!1,notice:"Excel 已导出"}))}catch(E){i((V)=>({...V,exporting:!1,error:Ou(E,"Excel 导出失败")}))}}if(!r)return yu(_L,{title:"Project Manager 未登记",text:"请在 config.json 的 microservices 中登记用户服务 id=project-manager"});let q=fX(r),N=nX(r),w=rX(r),G=Array.isArray(n.list?.projects)?n.list.projects:[],Z=n.list?.summary||{},H=n.health||{};return yu("div",{className:"project-manager-page","data-testid":"project-manager-page"},yu(i7,{title:"项目管理工作台",eyebrow:"Main Server PostgreSQL 用户服务",loading:n.loading||n.exporting,actions:yu("div",{className:"panel-actions"},yu("button",{type:"button",className:"ghost-btn",disabled:n.loading,onClick:()=>J(),"data-testid":"project-manager-refresh-button"},n.loading?"刷新中":"刷新"),yu("button",{type:"button",className:"ghost-btn",disabled:n.exporting,onClick:U,"data-testid":"project-manager-export-button"},n.exporting?"导出中":"导出 Excel"),yu(cL,{title:"Project Manager 用户服务",data:r,onOpen:l,testId:"raw-project-manager-service"}))},yu("div",{className:"project-manager-hero"},yu(XA,{label:"项目总数",value:Z.total??G.length,hint:`PG 表 ${H.storage?.table||"project_manager_projects"}`,tone:"ok"}),yu(XA,{label:"进行中",value:Z.active??"--",hint:"当前状态未完全完成"}),yu(XA,{label:"已完成",value:Z.completed??"--",hint:"按 完成 关键字统计",tone:"ok"}),yu(XA,{label:"未全款",value:Z.unpaid??"--",hint:"付款比例 < 1",tone:Number(Z.unpaid||0)>0?"warn":"ok"})),yu(nl,{error:n.error}),n.notice?yu("div",{className:"form-success"},n.notice):null),yu("div",{className:"project-manager-hero"},yu("div",{className:"microservice-ref-card"},yu("span",null,"Repo"),yu("strong",null,N.url||"--"),yu("code",null,N.commitId||"--")),yu("div",{className:"microservice-ref-card"},yu("span",null,"Main Server Docker"),yu("strong",null,`${w.nodeBindHost||"--"}:${w.nodePort||"--"}`),yu("code",null,`${N.composeService||"--"} / ${N.containerName||"--"}`)),yu("div",{className:"microservice-ref-card"},yu("span",null,"Runtime"),yu("strong",null,q.providerName||r.providerId),yu("code",null,`Health ${H.ok?"OK":"--"} / ${n.refreshedAt?yl(n.refreshedAt):"--"}`)),yu("div",{className:"microservice-ref-card"},yu("span",null,"Import Source"),yu("strong",null,"D601 WeChat Excel"),yu("code",null,"合作项目列表_I_20260309.xlsx"))),yu("div",{className:"project-manager-layout"},yu(i7,{title:"项目清单",eyebrow:"CRUD + Excel Export",loading:n.loading||n.importing||n.exporting,actions:yu("div",{className:"inline-actions project-manager-filters"},yu("input",{value:c,onChange:(E)=>$(E.target.value),placeholder:"搜索合同号 / 项目名称 / 状态","data-testid":"project-manager-search"}),yu("select",{value:A,onChange:(E)=>{j(E.target.value),J(c,E.target.value)},"data-testid":"project-manager-status-filter"},yu("option",{value:"all"},"全部"),yu("option",{value:"active"},"进行中"),yu("option",{value:"completed"},"已完成"),yu("option",{value:"unpaid"},"未全款")),yu("button",{type:"button",className:"ghost-btn",onClick:()=>J(c,A)},"筛选"))},yu(cX,{projects:G,activeId:t.id,onSelect:(E)=>y(iX(E)),onRaw:l})),yu(i7,{title:t.id?"编辑项目":"新建项目",eyebrow:"PostgreSQL Write Path",loading:n.saving||n.importing},yu("form",{className:"stack-form project-manager-form",onSubmit:Q,"data-testid":"project-manager-form"},t.id?yu("label",null,"项目 ID",yu("input",{value:t.id,disabled:!0})):null,yu("label",null,"序号",yu("input",{type:"number",value:t.sequenceNo,onChange:(E)=>y((V)=>({...V,sequenceNo:E.target.value}))})),yu("label",null,"合同号",yu("input",{value:t.contractNo,onChange:(E)=>y((V)=>({...V,contractNo:E.target.value})),required:!0})),yu("label",null,"项目名称",yu("input",{value:t.name,onChange:(E)=>y((V)=>({...V,name:E.target.value})),required:!0})),yu("label",null,"当前状况",yu("textarea",{value:t.currentStatus,onChange:(E)=>y((V)=>({...V,currentStatus:E.target.value}))})),yu("label",null,"待完成",yu("textarea",{value:t.pending,onChange:(E)=>y((V)=>({...V,pending:E.target.value}))})),yu("label",null,"付款情况",yu("input",{value:t.paymentStatus,onChange:(E)=>y((V)=>({...V,paymentStatus:E.target.value})),placeholder:"例如 1 / 0.5 / 50%"})),yu("label",null,"其它",yu("input",{value:t.notes,onChange:(E)=>y((V)=>({...V,notes:E.target.value}))})),yu("div",{className:"inline-actions"},yu("button",{type:"submit",className:"primary-btn",disabled:n.saving,"data-testid":"project-manager-save-button"},n.saving?"保存中":t.id?"保存修改":"创建项目"),yu("button",{type:"button",className:"ghost-btn",onClick:()=>y({...n7})},"清空"),t.id?yu("button",{type:"button",className:"danger-btn",disabled:n.saving,onClick:W,"data-testid":"project-manager-delete-button"},"删除"):null)),yu("div",{className:"project-manager-import"},yu("p",{className:"muted paragraph"},"浏览器只访问 UniDesk frontend;后端通过同源用户服务代理写入主 PostgreSQL,不暴露 4233 公网端口。"),yu("label",{className:"file-import"},n.importing?"导入中...":"导入 Excel",yu("input",{type:"file",accept:".xlsx",onChange:L,disabled:n.importing,"data-testid":"project-manager-import-input"}))))))}var MA=Cu(Fl(),1);var $u=MA.default.createElement,{useEffect:_X}=MA.default,ur=MA.default.useState;function $X({status:u,children:l}){let f=String(u||"unknown").toLowerCase();return $u("span",{className:`status-badge ${f}`},l||u||"unknown")}function PA({label:u,value:l,hint:f,tone:r}){return $u("article",{className:`metric-card ${r||""}`},$u("div",{className:"metric-label"},u),$u("div",{className:"metric-value"},l),$u("div",{className:"metric-hint"},f))}function y7({title:u,eyebrow:l,actions:f,children:r,className:n,loading:i}){return $u("section",{className:`panel ${n||""}`},$u("div",{className:"panel-head"},$u("div",null,l?$u("p",{className:"panel-eyebrow"},l):null,$u(rl,{title:u,loading:i})),f?$u("div",{className:"panel-actions"},f):null),$u("div",{className:"panel-body"},r))}function AL({title:u,data:l,onOpen:f,testId:r}){return $u("button",{type:"button",className:"ghost-btn","data-testid":r,onClick:()=>f(u,l)},"查看原始JSON")}function CA({title:u,text:l}){return $u("div",{className:"empty-state"},$u("strong",null,u),$u("span",null,l))}function AX(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 FX(u){return u?.repository&&typeof u.repository==="object"&&!Array.isArray(u.repository)?u.repository:{}}function FL(u){return String(u).replace(/[^a-zA-Z0-9_-]/g,"_")}function UX(u){if(!Number.isFinite(u))return"--";return`${u.toFixed(1)}%`}function Oy(u,l){return`${u}/microservices/todo-note/proxy${l}`}function UL(u){return u.reduce((l,f)=>{let r=UL(Array.isArray(f.children)?f.children:[]),n=Boolean(f.completed);return{total:l.total+1+r.total,completed:l.completed+(n?1:0)+r.completed,active:l.active+(n?0:1)+r.active}},{total:0,completed:0,active:0})}function _7(u,l){let f=l==="all"||(l==="completed"?Boolean(u.completed):!u.completed),r=Array.isArray(u.children)?u.children:[];return f||r.some((n)=>_7(n,l))}function jL(u){return Array.isArray(u?.instances)?u.instances:[]}function c7(u,l){for(let f of u){if(f?.id===l)return Array.isArray(f.children)?f.children:[];let r=c7(Array.isArray(f?.children)?f.children:[],l);if(r.length>0)return r}return[]}function JL({microservices:u,onRaw:l,apiBaseUrl:f="/api"}){let r=u.find((s)=>s.id==="todo-note")||null,[n,i]=ur(null),[t,y]=ur(null),[c,$]=ur(""),[A,j]=ur(null),[F,J]=ur("all"),[Q,W]=ur(13),[L,U]=ur(""),[q,N]=ur(""),[w,G]=ur(""),[Z,H]=ur(""),[E,V]=ur(""),[S,B]=ur(!1),[D,X]=ur(""),[O,Y]=ur(null),p=jL(t),v=UL(Array.isArray(A?.todos)?A.todos:[]),z=r?AX(r):{},P=r?FX(r):{},k=r?jX(r):{};async function I(s=c){let[qu,Zu]=await Promise.all([Eu(`${f}/microservices/todo-note/health`),Eu(Oy(f,"/api/instances"))]);i(qu),y(Zu);let Bu=jL(Zu),Iu=Bu.some((ll)=>ll.id===s)?s:Bu[0]?.id||"";return $(Iu),Iu}async function b(s=c){if(!s){j(null);return}let qu=await Eu(Oy(f,`/api/instances/${encodeURIComponent(s)}`));j(qu)}async function d(s=c){if(!r)return;B(!0),X("");try{let qu=await I(s);await b(qu),Y(new Date)}catch(qu){X(Ou(qu,"Todo Note 加载失败"))}finally{B(!1)}}async function g(s){if(!c)return null;X("");try{let qu=await Eu(Oy(f,`/api/instances/${encodeURIComponent(c)}/actions`),{method:"POST",body:JSON.stringify({action:s})});return j(qu),await I(c),qu}catch(qu){return X(Ou(qu,"Todo 操作失败")),null}}async function x(s){s.preventDefault();let qu=L.trim();if(!qu)return;B(!0),X("");try{let Zu=await Eu(Oy(f,"/api/instances"),{method:"POST",body:JSON.stringify({name:qu})});U(""),await d(Zu.id)}catch(Zu){X(Ou(Zu,"创建清单失败"))}finally{B(!1)}}async function lu(s){if(!window.confirm("确认删除这个 Todo Note 清单?"))return;B(!0),X("");try{await Eu(Oy(f,`/api/instances/${encodeURIComponent(s)}`),{method:"DELETE"}),await d(c===s?"":c)}catch(qu){X(Ou(qu,"删除清单失败"))}finally{B(!1)}}async function cu(s){s.preventDefault();let qu=q.trim();if(!qu)return;N(""),await g({type:"addTodo",title:qu})}async function _u(s){if(!c)return;X("");try{let qu=await Eu(Oy(f,`/api/instances/${encodeURIComponent(c)}/${s}`),{method:"POST",body:JSON.stringify({})});j(qu),await I(c)}catch(qu){X(Ou(qu,`${s} 失败`))}}function Fu(s){G(s.id),H(String(s.title||""))}async function zu(s){let qu=Z.trim();if(G(""),H(""),qu)await g({type:"updateTodoTitle",todoId:s,title:qu})}async function Wu(s){let Zu=window.prompt("新增子任务标题")?.trim();if(!Zu)return;let Bu=c7(Array.isArray(A?.todos)?A.todos:[],s),Iu=new Set(Bu.map((Jf)=>Jf.id)),ll=await g({type:"addTodo",title:Zu,parentId:s,targetIndex:0});if(!ll)return;let Pu=c7(Array.isArray(ll?.todos)?ll.todos:[],s),Jl=Pu.find((Jf)=>!Iu.has(Jf.id));if(Jl&&Pu[0]?.id!==Jl.id)await g({type:"moveTodo",todoId:Jl.id,targetParentId:s,targetIndex:0})}async function C(s,qu){if(!E)return;let Zu={type:"moveTodo",todoId:E,targetIndex:qu};if(s)Zu.targetParentId=s;V(""),await g(Zu)}if(_X(()=>{d()},[r?.id,r?.runtime?.providerStatus]),!r)return $u(CA,{title:"Todo Note 未登记",text:"请在 config.json 的 microservices 中登记用户服务 id=todo-note"});let e=p.find((s)=>s.id===c)||null,uu=Array.isArray(A?.todos)?A.todos:[],Gu=uu.map((s,qu)=>({todo:s,index:qu})).filter((s)=>_7(s.todo,F));return $u("div",{className:"todo-note-page","data-testid":"todo-note-page"},$u(y7,{title:"Todo Note 工作台",eyebrow:"Main Server 用户服务",loading:S,actions:$u("div",{className:"panel-actions"},$u("button",{type:"button",className:"ghost-btn",disabled:S,onClick:()=>d(c),"data-testid":"todo-note-refresh-button"},S?"刷新中":"刷新"),$u(AL,{title:"Todo Note 用户服务",data:r,onOpen:l,testId:"raw-todo-note-service"}))},$u("div",{className:"todo-note-hero"},$u("div",null,$u("div",{className:"node-version-line"},$u($X,{status:z.providerStatus==="online"?"online":"warn"},z.providerStatus||"unknown"),$u("span",null,r.providerId),$u("span",null,k.public?"公网暴露":"仅 UniDesk frontend 代理访问"),$u("span",null,n?.ok?"Health OK":"Health --")),$u("p",{className:"muted paragraph"},r.description)),$u("div",{className:"microservice-ref-card"},$u("span",null,"Repo"),$u("strong",null,P.url||"--"),$u("code",null,P.commitId||"--")),$u("div",{className:"microservice-ref-card"},$u("span",null,"Main Server Docker"),$u("strong",null,`${k.nodeBindHost||"--"}:${k.nodePort||"--"}`),$u("code",null,`${P.composeService||"--"} / ${P.containerName||"--"}`))),$u(nl,{error:D,wide:!0})),$u("div",{className:"todo-note-layout"},$u(y7,{title:"清单",eyebrow:`${p.length} Instances`,className:"todo-list-panel",loading:S},$u("form",{className:"todo-create-list",onSubmit:x},$u("input",{placeholder:"新清单名称",value:L,onChange:(s)=>U(s.target.value),"aria-label":"新清单名称"}),$u("button",{type:"submit",className:"ghost-btn",disabled:S||!L.trim()},"创建")),p.length===0?$u(CA,{title:"暂无清单",text:"迁移或创建清单后会出现在这里"}):$u("div",{className:"todo-instance-list"},p.map((s)=>$u("button",{key:s.id,type:"button",className:`todo-instance-row ${c===s.id?"active":""}`,onClick:()=>{$(s.id),b(s.id)},"data-testid":`todo-instance-${FL(s.id)}`},$u("strong",null,s.name),$u("span",null,`${s.completedCount??0}/${s.todoCount??0} 完成`),$u("code",null,s.id))))),$u("div",{className:"todo-main-stack"},$u(y7,{title:e?.name||"待选择清单",eyebrow:O?`Updated ${yl(O)}`:"Todo Tree",loading:S,actions:A?$u("div",{className:"panel-actions"},$u("button",{type:"button",className:"ghost-btn",onClick:()=>g({type:"renameInstance",name:window.prompt("清单新名称",A.name)||A.name})},"重命名"),$u("button",{type:"button",className:"ghost-btn danger",onClick:()=>lu(c)},"删除清单"),$u(AL,{title:`Todo Instance ${c}`,data:A,onOpen:l,testId:"raw-todo-instance"})):null},!A?$u(CA,{title:"未选择清单",text:"左侧选择一个 Todo Note 清单"}):$u("div",{className:"todo-workbench",style:{"--todo-font-size":`${Q}px`}},$u("div",{className:"todo-toolbar"},$u("form",{className:"todo-add-form",onSubmit:cu},$u("input",{placeholder:"新增根任务",value:q,onChange:(s)=>N(s.target.value),"aria-label":"新增根任务"}),$u("button",{type:"submit",className:"ghost-btn",disabled:!q.trim()},"新增")),$u("div",{className:"todo-filter-strip"},["all","active","completed"].map((s)=>$u("button",{key:s,type:"button",className:`todo-filter ${F===s?"active":""}`,onClick:()=>J(s)},s==="all"?"全部":s==="active"?"未完成":"已完成"))),$u("div",{className:"todo-toolbar-actions"},$u("button",{type:"button",className:"ghost-btn",onClick:()=>g({type:"setAllTodosExpanded",expanded:!0})},"全部展开"),$u("button",{type:"button",className:"ghost-btn",onClick:()=>g({type:"setAllTodosExpanded",expanded:!1})},"全部收起"),$u("button",{type:"button",className:"ghost-btn",onClick:()=>_u("undo")},"撤销"),$u("button",{type:"button",className:"ghost-btn",onClick:()=>_u("redo")},"重做"),$u("label",{className:"todo-font-control"},"字号",$u("input",{type:"range",min:11,max:18,value:Q,onChange:(s)=>W(Number(s.target.value))})))),$u("div",{className:"todo-stats-grid"},$u(PA,{label:"总任务",value:v.total,hint:`${p.length} lists`}),$u(PA,{label:"已完成",value:v.completed,hint:`${UX(v.total?v.completed/v.total*100:0)}`,tone:"ok"}),$u(PA,{label:"未完成",value:v.active,hint:F==="active"?"当前筛选":"active tasks",tone:v.active>0?"warn":"ok"}),$u(PA,{label:"历史指针",value:A.historyPointer??0,hint:"undo / redo"})),$u("div",{className:"todo-root-drop",onDragOver:(s)=>s.preventDefault(),onDrop:(s)=>{s.preventDefault(),C(null,uu.length)}},"拖到这里可移为根任务末尾"),$u("div",{className:"todo-tree","data-testid":"todo-note-tree"},Gu.length===0?$u(CA,{title:"没有匹配任务",text:"调整筛选或新增任务"}):Gu.map(({todo:s,index:qu})=>$u(QL,{key:s.id,todo:s,depth:0,parentId:null,index:qu,siblingCount:uu.length,filter:F,editingId:w,editingTitle:Z,setEditingTitle:H,beginEdit:Fu,saveEdit:zu,applyTodoAction:g,addChild:Wu,dragTodoId:E,setDragTodoId:V,dropTodo:C}))))))))}function QL(u){let{todo:l,depth:f,parentId:r,index:n,siblingCount:i,filter:t,editingId:y,editingTitle:c,setEditingTitle:$,beginEdit:A,saveEdit:j,applyTodoAction:F,addChild:J,dragTodoId:Q,setDragTodoId:W,dropTodo:L}=u,U=Array.isArray(l.children)?l.children:[],q=U.map((G,Z)=>({child:G,childIndex:Z})).filter((G)=>_7(G.child,t)),N=y===l.id,w=r||null;return $u("div",{className:"todo-row-wrap"},$u("article",{className:`todo-row ${l.completed?"completed":""} ${Q===l.id?"dragging":""}`,style:{"--todo-depth":f},draggable:!0,onDragStart:(G)=>{W(l.id),G.dataTransfer.effectAllowed="move"},onDragOver:(G)=>G.preventDefault(),onDrop:(G)=>{G.preventDefault(),L(l.id,U.length)},"data-testid":`todo-row-${FL(l.id)}`},$u("button",{type:"button",className:"todo-expand",disabled:U.length===0,onClick:()=>F({type:"toggleTodoExpanded",todoId:l.id})},U.length===0?"·":l.expanded?"▾":"▸"),$u("input",{type:"checkbox",checked:Boolean(l.completed),onChange:()=>F({type:"toggleTodoCompleted",todoId:l.id}),"aria-label":`完成 ${l.title}`}),$u("div",{className:"todo-title-cell",onDoubleClick:()=>A(l)},N?$u("div",{className:"todo-edit-inline"},$u("input",{value:c,autoFocus:!0,onChange:(G)=>$(G.target.value),onKeyDown:(G)=>{if(G.key==="Enter")j(l.id);if(G.key==="Escape")A({id:"",title:""})}}),$u("button",{type:"button",className:"ghost-btn",onClick:()=>j(l.id)},"保存")):$u("strong",null,l.title||"Untitled"),$u("div",{className:"todo-meta-line"},$u("span",null,`子项 ${U.length}`),$u("span",null,`更新 ${wu(l.updatedAt)}`),l.reminderAt?$u("span",{className:"todo-reminder"},`提醒 ${wu(l.reminderAt)}`):$u("span",null,"无提醒"))),$u("input",{className:"todo-reminder-input",type:"datetime-local",value:j6(l.reminderAt),onChange:(G)=>F({type:"setTodoReminder",todoId:l.id,reminderAt:fj(G.target.value)})}),$u("div",{className:"todo-row-actions"},$u("button",{type:"button",className:"ghost-btn",onClick:()=>A(l)},"编辑"),$u("button",{type:"button",className:"ghost-btn",onClick:()=>J(l.id)},"子项"),$u("button",{type:"button",className:"ghost-btn",disabled:n<=0,onClick:()=>F({type:"moveTodo",todoId:l.id,...w?{targetParentId:w}:{},targetIndex:n-1})},"上移"),$u("button",{type:"button",className:"ghost-btn",disabled:n<=0,onClick:()=>F({type:"moveTodo",todoId:l.id,...w?{targetParentId:w}:{},targetIndex:0})},"置顶"),$u("button",{type:"button",className:"ghost-btn",disabled:n>=i-1,onClick:()=>F({type:"moveTodo",todoId:l.id,...w?{targetParentId:w}:{},targetIndex:n+1})},"下移"),$u("button",{type:"button",className:"ghost-btn",disabled:!r,onClick:()=>F({type:"moveTodo",todoId:l.id,targetIndex:9999})},"提升"),$u("button",{type:"button",className:"ghost-btn danger",onClick:()=>F({type:"deleteTodo",todoId:l.id})},"删除"))),l.expanded&&q.length>0?$u("div",{className:"todo-children"},q.map(({child:G,childIndex:Z})=>$u(QL,{key:G.id,todo:G,depth:f+1,parentId:l.id,index:Z,siblingCount:U.length,filter:t,editingId:y,editingTitle:c,setEditingTitle:$,beginEdit:A,saveEdit:j,applyTodoAction:F,addChild:J,dragTodoId:Q,setDragTodoId:W,dropTodo:L}))):null)}var NL=Cu(Fl(),1),e0=NL.default.createElement;function qL({title:u,items:l,actions:f,className:r,testId:n}){let i=Array.isArray(l)?l:[];return e0("section",{className:`top-status-bar ${r||""}`,"data-testid":n},e0("div",{className:"top-status-main"},u?e0("strong",{className:"top-status-title"},u):null,e0("div",{className:"top-status-chips"},i.map((t,y)=>e0("span",{key:t?.key||`${t?.label||"status"}-${y}`,className:`top-status-chip ${t?.tone||""}`,"data-testid":t?.testId},t?.label?e0("b",null,t.label):null,e0("span",null,t?.value??"--"))))),f?e0("div",{className:"top-status-actions"},f):null)}var Ic=Cu(Fl(),1);var Nu=Ic.default.createElement,{useEffect:JX,useMemo:QX}=Ic.default,NX=Ic.default.useState;function wL({status:u,children:l,title:f}){let r=String(u||"unknown").toLowerCase();return Nu("span",{className:`status-badge ${r}`,title:f},l||u||"unknown")}function RA({label:u,value:l,hint:f,tone:r}){return Nu("article",{className:`metric-card ${r||""}`},Nu("div",{className:"metric-label"},u),Nu("div",{className:"metric-value"},l),Nu("div",{className:"metric-hint"},f))}function $7({title:u,eyebrow:l,actions:f,children:r,className:n,loading:i}){return Nu("section",{className:`panel ${n||""}`},Nu("div",{className:"panel-head"},Nu("div",null,l?Nu("p",{className:"panel-eyebrow"},l):null,Nu(rl,{title:u,loading:i})),f?Nu("div",{className:"panel-actions"},f):null),Nu("div",{className:"panel-body"},r))}function WL({title:u,data:l,onOpen:f,testId:r}){return Nu("button",{type:"button",className:"ghost-btn","data-testid":r,onClick:()=>f?.(u,l)},"查看原始JSON")}function A7({title:u,text:l}){return Nu("div",{className:"empty-state"},Nu("strong",null,u),Nu("span",null,l))}function Zy(u){return Array.isArray(u)?u:[]}function j7(u){return u&&typeof u==="object"&&!Array.isArray(u)?u:{}}function qX(u){return u?.runtime&&typeof u.runtime==="object"&&!Array.isArray(u.runtime)?u.runtime:{}}function wX(u,l){return`${u}/microservices/k3sctl-adapter/proxy${l}`}function WX(u){return u.find((l)=>String(l?.id||"")==="k3sctl-adapter")||null}function LX(u){if(u?.healthy===!0)return"online";if(String(u?.role||"")==="standby")return"warn";return"failed"}function TX(u){return u?.healthy===!0?"online":"failed"}function KX(u){if(u===!0)return"YES";if(u===!1)return"NO";return"--"}function GX(u){return Array.from(new Set(u.flatMap((l)=>Zy(l?.expectedNodeIds).map((f)=>String(f))))).filter(Boolean).sort()}function zX(u){let l=u.find((f)=>f?.id==="code-queue")||u[0];return String(l?.activeInstanceId||"--")}function EX(u){return Nu("article",{key:u?.id||u?.nodeId,className:"k3s-instance-card"},Nu("div",{className:"node-card-head"},Nu("strong",null,u?.nodeId||u?.id||"--"),Nu(wL,{status:LX(u)},u?.healthy?"HEALTHY":"DEGRADED")),Nu("div",{className:"k3s-instance-role"},Nu("span",null,String(u?.role||"worker").toUpperCase()),Nu("code",null,u?.id||"--")),Nu("dl",{className:"k3s-kv"},Nu("dt",null,"Base URL"),Nu("dd",null,Nu("code",null,u?.baseUrl||"--")),Nu("dt",null,"Proxy"),Nu("dd",null,u?.proxyMode||"--"),Nu("dt",null,"Health"),Nu("dd",null,`${u?.upstreamStatus??"--"} / ${u?.status||"unknown"}`),Nu("dt",null,"Checked"),Nu("dd",null,wu(u?.checkedAt))))}function OX(u,l){let f=Zy(u?.instances),r=j7(u?.active);return Nu($7,{key:u?.id||"service",title:u?.id||"managed-service",eyebrow:`${u?.namespace||"unidesk"} / k3s managed service`,className:"k3s-service-panel",actions:Nu(WL,{title:`k3s service ${u?.id||""}`,data:u,onOpen:l,testId:`raw-k3s-service-${u?.id||"unknown"}`})},Nu("div",{className:"k3s-service-summary"},Nu("div",null,Nu("span",null,"状态"),Nu(wL,{status:TX(u)},u?.status||"unknown")),Nu("div",null,Nu("span",null,"Active"),Nu("strong",null,u?.activeInstanceId||"--")),Nu("div",null,Nu("span",null,"Single Writer"),Nu("strong",null,KX(u?.singleWriter))),Nu("div",null,Nu("span",null,"Active Health"),Nu("strong",null,r?.upstreamStatus??"--"))),f.length===0?Nu(A7,{title:"暂无 k3s 实例",text:"adapter 没有返回该服务的 endpoint 列表"}):Nu("div",{className:"k3s-instance-grid"},f.map(EX)))}function LL({microservices:u,onRaw:l,apiBaseUrl:f,onNavigate:r}){let n=WX(Array.isArray(u)?u:[]),i=qX(n),[t,y]=NX({loading:!1,error:"",data:null,refreshedAt:null});async function c(){y((q)=>({...q,loading:!0,error:""}));try{let q=await Eu(wX(f,"/api/control-plane"));y({loading:!1,error:"",data:q,refreshedAt:new Date})}catch(q){y((N)=>({...N,loading:!1,error:Ou(q,"加载 k3s 控制平面失败")}))}}JX(()=>{c()},[f]);let $=QX(()=>Zy(t.data?.services),[t.data]),A=GX($),j=$.filter((q)=>q?.healthy===!0).length,F=$.reduce((q,N)=>q+Zy(N?.instances).length,0),J=$.reduce((q,N)=>q+Zy(N?.instances).filter((w)=>w?.healthy===!0).length,0),Q=zX($),W=j7(t.data?.kubectl),L=j7(t.data?.kubeApiProxy),U=Zy(t.data?.manifestPaths).map((q)=>String(q));if(!n)return Nu(A7,{title:"k3sctl-adapter 未登记",text:"请在 config.json 的 microservices 中登记 id=k3sctl-adapter,并通过该微服务连接 k3s 控制平面。"});return Nu("div",{className:"k3s-page","data-testid":"k3sctl-page"},Nu($7,{title:"k3s Control Plane",eyebrow:"Managed by k3sctl-adapter",className:"k3s-hero-panel",loading:t.loading,actions:Nu(Ic.default.Fragment,null,Nu("button",{type:"button",className:"ghost-btn",onClick:c,disabled:t.loading,"data-testid":"k3s-refresh-button"},t.loading?"刷新中":"刷新"),r?Nu("button",{type:"button",className:"ghost-btn",onClick:()=>r("apps","code-queue"),"data-testid":"k3s-open-code-queue"},"打开 Code Queue"):null,Nu(WL,{title:"k3sctl-adapter microservice",data:n,onOpen:l,testId:"raw-k3s-adapter"}))},Nu("div",{className:"k3s-hero"},Nu("div",{className:"k3s-orb","aria-hidden":"true"},Nu("span",null,"k3s")),Nu("div",{className:"k3s-hero-copy"},Nu("p",{className:"eyebrow"},"D601 control plane / D518 managed node"),Nu("h2",null,"UniDesk 只管理 adapter;业务微服务交给 k3s 标准服务路由"),Nu("p",{className:"muted paragraph"},"Code Queue 的前端/API 请求进入 k3sctl-adapter,再由 adapter 转发到 k3s active service。provider-gateway 只用于维护 adapter 和节点诊断,不再直接管理 Code Queue 容器。"),Nu("div",{className:"k3s-route-strip"},Nu("span",null,"NO FALLBACK"),Nu("code",null,t.data?.runtimePath||"frontend -> backend-core -> k3sctl-adapter")))),Nu("div",{className:"metric-grid"},Nu(RA,{label:"控制面",value:t.data?.clusterId||"D601",hint:`adapter ${i.providerStatus||"unknown"}`,tone:i.providerStatus==="online"?"ok":"warn"}),Nu(RA,{label:"代管服务",value:$.length,hint:`${j}/${$.length||0} healthy`,tone:j===$.length&&$.length>0?"ok":"warn"}),Nu(RA,{label:"节点",value:A.join(" / ")||"--",hint:"expected k3s nodes"}),Nu(RA,{label:"实例",value:`${J}/${F}`,hint:`active ${Q}`,tone:J===F&&F>0?"ok":"warn"})),Nu("div",{className:"k3s-control-plane-grid"},Nu("article",{className:"k3s-control-plane-card"},Nu("span",null,"service proxy"),Nu("strong",null,L.configured===!0?"K8S API PROXY":"PROXY DEGRADED"),Nu("p",null,L.configured===!0?`${L.mode||"kubernetes-api-service-proxy"} via ${L.connectHost||"--"}`:"adapter 必须通过 k8s API service proxy 访问业务服务,不回退到业务容器直连。")),Nu("article",{className:"k3s-control-plane-card"},Nu("span",null,"manifests"),Nu("strong",null,U.length||"--"),Nu("p",null,U.join(" / ")||"未配置 manifest")),Nu("article",{className:"k3s-control-plane-card"},Nu("span",null,"cluster snapshot"),Nu("strong",null,W.enabled===!0?W.ok===!0?"KUBECTL OK":"KUBECTL DEGRADED":"API ONLY"),Nu("p",null,W.enabled===!0?`nodes ${W.nodeCount??"--"}`:"控制面页面以 adapter 返回的 k8s service proxy 状态为准;kubectl 只作为可选快照。"))),t.error?Nu(nl,{error:t.error}):null,t.refreshedAt?Nu("p",{className:"muted paragraph"},`最近刷新 ${yl(t.refreshedAt)}`):null),$.length===0?Nu($7,{title:"代管服务",eyebrow:"k3s services",loading:t.loading},Nu(A7,{title:"暂无 k3s 服务",text:"等待 k3sctl-adapter 返回 /api/services;Code Queue 切换后这里应显示 D601 和 D518 两个实例。"})):$.map((q)=>OX(q,l)))}var gc=Cu(Fl(),1);var Il=gc.default.createElement;function TL({onClose:u}){let{notifications:l,removeNotification:f,clearNotifications:r}=pf(),n=gc.default.useRef(null);if(gc.default.useEffect(()=>{let i=(t)=>{if(n.current&&!n.current.contains(t.target))u()};return document.addEventListener("mousedown",i),()=>document.removeEventListener("mousedown",i)},[u]),l.length===0)return Il("div",{className:"notification-popup",ref:n},Il("div",{className:"notification-popup-header"},Il("span",null,"通知"),Il("button",{className:"notification-popup-close",onClick:u},"×")),Il("div",{className:"notification-popup-empty"},"暂无通知"));return Il("div",{className:"notification-popup",ref:n},Il("div",{className:"notification-popup-header"},Il("span",null,`通知 (${l.length})`),Il("div",{className:"notification-popup-actions"},Il("button",{className:"notification-popup-clear",onClick:r},"清空"),Il("button",{className:"notification-popup-close",onClick:u},"×"))),Il("div",{className:"notification-popup-list"},l.slice().reverse().map((i)=>Il("div",{key:i.id,className:`notification-item ${i.type}`},Il("span",{className:"notification-item-icon"},i.type==="success"?"✓":"×"),Il("span",{className:"notification-item-message"},i.message),Il("button",{className:"notification-item-dismiss",onClick:()=>f(i.id)},"×")))))}function KL({notification:u}){let{removeNotification:l}=pf();return gc.default.useEffect(()=>{let f=setTimeout(()=>{l(u.id)},3000);return()=>clearTimeout(f)},[u.id,l]),Il("div",{className:`notification-banner ${u.type}`,role:"alert"},Il("span",{className:"notification-banner-icon"},u.type==="success"?"✓":"×"),Il("span",{className:"notification-banner-message"},u.message),Il("button",{className:"notification-banner-dismiss",onClick:()=>l(u.id)},"×"))}function SL(u,l){let f=document.getElementById("root")?.getAttribute(u);if(!f)return l;try{let r=JSON.parse(f);return typeof r==="object"&&r!==null&&!Array.isArray(r)?r:l}catch{return l}}var ku=SL("data-config",{apiBaseUrl:"/api",authUsername:"admin"}),ZX=SL("data-codex-overview",null),_=li.default.createElement,{useEffect:Tn,useMemo:oc}=li.default,bu=li.default.useState,Q7=li.default.createContext(!1),Sr=QN(F3),HX={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 GL(){return typeof document>"u"||document.visibilityState!=="hidden"}function BX(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 mX(u){if(!u?._summaryOnly||!u?.id)return u;return(await Eu(`${ku.apiBaseUrl}/tasks/${encodeURIComponent(String(u.id))}`))?.task||u}function dc(u){return u?._summaryOnly?{...u,_loadRaw:()=>mX(u)}:u}function an(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 wr(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 an(l/1000)}function Ef(u){let l=Number(u);if(!Number.isFinite(l)||l<=0)return"--";let f=["B","KB","MB","GB","TB"],r=l,n=0;while(r>=1024&&n0)return f[r]}return"任务失败但 provider 未返回明确原因"}function di(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 DX(u,l){let f=u.replace(/[-_\s]/g,"").toLowerCase(),r=f==="ts"||f.endsWith("at")||f.endsWith("timestamp")||f.endsWith("heartbeat");if((typeof l==="string"||typeof l==="number")&&r){let n=wu(l);if(n!=="--")return n}if(u==="bodyText"&&typeof l==="string")return`${/^\s*[{[]/.test(l)?"JSON":"HTTP"} body ${l.length} chars`;return di(l)}function PL(u){if(!u||typeof u!=="object"||Array.isArray(u))return[];return Object.entries(u)}function lr(u){return String(u).replace(/[^a-zA-Z0-9_-]/g,"_")}function q7(u,l){return u&&typeof u==="object"&&!Array.isArray(u)?u[l]:void 0}function xA(u,l,f="未知"){let r=q7(u?.labels,l);return typeof r==="string"&&r.length>0?r:f}function CL(u){return xA(u,"providerGatewayVersion")}function ac(u){return xA(u,"providerGatewayUpgradePolicy")}function zL(u){return xA(u,"providerGatewayStartedAt","")}function ML(u){let l=q7(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 RL(u,l){return ML(u).includes(l)}function EL(u,l){let f=q7(u?.labels,l);return f===!0||f==="true"||f==="1"}function pX(u){if(!RL(u,"host.ssh"))return{tone:"fail",label:"不可用",detail:"未声明 host.ssh"};if(!EL(u,"hostSshConfigured"))return{tone:"warn",label:"未配置",detail:"缺少 SSH 环境变量"};if(!EL(u,"hostSshKeyPresent"))return{tone:"warn",label:"缺 key",detail:"私钥未挂载"};return{tone:"ok",label:"可用",detail:xA(u,"hostSshTarget","host.ssh ready")}}function SX(u){if(!RL(u,"provider.upgrade"))return{tone:"fail",label:"不可用",detail:"未声明 provider.upgrade"};let l=ac(u);if(l!=="always-enabled")return{tone:"warn",label:"待确认",detail:`策略 ${l}`};return{tone:"ok",label:"可用",detail:"always-enabled"}}function w7(u){let l=typeof u==="string"&&u.length>0?u:"未知";if(l==="未知")return"版本未知";return l.startsWith("v")?l:`v${l}`}function hL(u){return u?.payload&&typeof u.payload==="object"&&!Array.isArray(u.payload)?u.payload:{}}function bA(u){return u?.result&&typeof u.result==="object"&&!Array.isArray(u.result)?u.result:{}}function hA(u){let l=hL(u),f=bA(u);return(l.mode??f.mode)==="schedule"?"schedule":"plan"}function XX(u){let l=hL(u).source;return typeof l==="string"&&l.length>0?l:"unknown"}function YX(u){let l=bA(u),f=l.plan&&typeof l.plan==="object"&&!Array.isArray(l.plan)?l.plan:{},r=l.policy??f.policy;return typeof r==="string"&&r.length>0?r:"--"}function xL(u){let l=bA(u),f=l.plan&&typeof l.plan==="object"&&!Array.isArray(l.plan)?l.plan:{},r=l.targetProviderGatewayVersion??l.providerGatewayVersion??f.targetProviderGatewayVersion??f.providerGatewayVersion;return typeof r==="string"&&r.length>0?w7(r):"版本未知"}function bL(u){if(String(u?.status||"").toLowerCase()==="failed")return YL(u);if(By(u))return"等待 provider 回传升级终态";let f=bA(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 vL(u,l){return u.filter((f)=>f?.providerId===l&&f?.command==="provider.upgrade").sort((f,r)=>(Kn(r.updatedAt)??0)-(Kn(f.updatedAt)??0))}function PX(u){return u.find((l)=>hA(l)==="schedule")||u[0]||null}function kL(u){return u?.runtime&&typeof u.runtime==="object"&&!Array.isArray(u.runtime)?u.runtime:{}}function OL(u){return u?.backend&&typeof u.backend==="object"&&!Array.isArray(u.backend)?u.backend:{}}function CX(u){return u?.repository&&typeof u.repository==="object"&&!Array.isArray(u.repository)?u.repository:{}}function Ll({status:u,children:l}){let f=String(u||"unknown").toLowerCase();return _("span",{className:`status-badge ${f}`},l||u||"unknown")}function jl({label:u,value:l,hint:f,tone:r,onClick:n,testId:i}){let t=typeof n==="function";return _("article",{className:`metric-card ${r||""} ${t?"clickable":""}`,role:t?"button":void 0,tabIndex:t?0:void 0,"data-testid":i,onClick:n,onKeyDown:t?(y)=>{if(y.key==="Enter"||y.key===" ")y.preventDefault(),n()}:void 0},_("div",{className:"metric-label"},u),_("div",{className:"metric-value"},l),_("div",{className:"metric-hint"},f))}function eu({title:u,eyebrow:l,actions:f,children:r,className:n,loading:i}){let t=li.default.useContext(Q7),y=Boolean(i)||t;return _("section",{className:`panel ${n||""}`},_("div",{className:"panel-head"},_("div",null,l?_("p",{className:"panel-eyebrow"},l):null,_(rl,{title:u,loading:y})),f?_("div",{className:"panel-actions"},f):null),_("div",{className:"panel-body"},r))}function gl({title:u,data:l,onOpen:f,testId:r}){let[n,i]=bu(!1),t=l&&typeof l==="object"&&typeof l._loadRaw==="function"?l._loadRaw:null;async function y(){if(!t){f(u,l);return}i(!0);try{f(u,await t())}catch(c){f(u,{ok:!1,error:Ou(c,"读取原始 JSON 失败"),fallback:l})}finally{i(!1)}}return _("button",{type:"button",className:"ghost-btn","data-testid":r,disabled:n,onClick:()=>void y()},n?"读取中":"查看原始JSON")}function MX({raw:u,onClose:l}){if(!u)return null;return _("div",{className:"modal-backdrop",role:"presentation"},_("section",{className:"raw-dialog",role:"dialog","aria-modal":"true","aria-label":u.title},_("div",{className:"raw-dialog-head"},_("h2",null,u.title),_("button",{type:"button",className:"ghost-btn",onClick:l},"关闭")),_("pre",{className:"raw-json","data-testid":"raw-json"},JSON.stringify(u.data,null,2))))}function IL({labels:u,limit:l=8}){let f=PL(u).slice(0,l);if(f.length===0)return _("span",{className:"muted"},"无标签");return _("div",{className:"chip-row"},f.map(([r,n])=>_("span",{key:r,className:"data-chip"},_("b",null,r),_("span",null,di(n)))))}function Hy({node:u}){let l=CL(u);return _("span",{className:`version-chip ${l==="未知"?"unknown":""}`,"data-testid":`gateway-version-${lr(u?.providerId||"unknown")}`},w7(l))}function ZL({title:u,state:l,testId:f}){return _("span",{className:`capability-badge ${l.tone}`,title:l.detail,"data-testid":f},_("b",null,u),_("strong",null,l.label),_("small",null,l.detail))}function W7({node:u}){let l=lr(u?.providerId||"unknown");return _("div",{className:"node-availability-strip"},_(ZL,{title:"SSH 透传",state:pX(u),testId:`ssh-availability-${l}`}),_(ZL,{title:"远程更新",state:SX(u),testId:`upgrade-availability-${l}`}))}function fi({data:u,empty:l="无数据"}){if(u===null||u===void 0)return _("span",{className:"muted"},l);if(typeof u!=="object")return _("span",{className:"summary-value"},di(u));if(Array.isArray(u))return _("span",{className:"summary-value"},`${u.length} 项列表`);let f=Object.entries(u).slice(0,5);if(f.length===0)return _("span",{className:"muted"},l);return _("div",{className:"summary-grid"},f.map(([r,n])=>_("span",{key:r,className:"summary-item"},_("b",null,r),_("span",null,DX(r,n)))))}function Ul({title:u,text:l}){return _("div",{className:"empty-state"},_("strong",null,u),_("span",null,l))}function RX({onLogin:u}){let[l,f]=bu(ku.authUsername||"admin"),[r,n]=bu(""),[i,t]=bu(""),[y,c]=bu(!1);async function $(A){A.preventDefault(),c(!0),t("");try{let j=await Eu("/login",{method:"POST",body:JSON.stringify({username:l,password:r})});u(j)}catch(j){t(Ou(j,"登录失败"))}finally{c(!1)}}return _("main",{className:"login-screen","data-testid":"login-screen"},_("section",{className:"login-card"},_("div",{className:"login-brand"},_("span",{className:"brand-mark"},"UD"),_("div",null,_("h1",null,"UniDesk"),_("p",null,"Control Plane Login"))),_("form",{className:"login-form",onSubmit:$},_("label",null,"账号",_("input",{name:"username",autoComplete:"username",value:l,onChange:(A)=>f(A.target.value)})),_("label",null,"密码",_("input",{name:"password",type:"password",autoComplete:"current-password",value:r,onChange:(A)=>n(A.target.value)})),_(nl,{error:i}),_("button",{type:"submit",disabled:y},y?"登录中":"登录")),_("div",{className:"login-note"},"默认账号由 config.json 注入;公网入口只暴露前端登录面。")))}function hX({connection:u,lastRefresh:l,onRefresh:f,onLogout:r,session:n,clock:i,activeStatusItems:t=[],onNotificationToggle:y,unreadCount:c=0}){let $=[{key:"core",label:"核心",value:u.text,tone:u.ok?"ok":"fail",testId:"conn-text"},...Array.isArray(t)?t:[],{key:"refresh",label:"刷新",value:l?yl(l):"未刷新"},{key:"clock",label:U_,value:yl(i)},{key:"user",label:"用户",value:n?.user?.username||"--",tone:"user"}];return _("header",{className:"topbar"},_("div",null,_("p",{className:"eyebrow"},"Distributed Work Platform"),_("h1",null,"UniDesk 控制平面")),_(qL,{className:"global-top-status",title:"状态",items:$,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:f},"刷新"),_("button",{key:"logout",type:"button",className:"ghost-btn danger",onClick:r},"退出")]}))}function xX(u){return!u.defaultPrevented&&u.button===0&&!u.metaKey&&!u.altKey&&!u.ctrlKey&&!u.shiftKey&&u.currentTarget.target!=="_blank"}function gL({moduleId:u,tabId:l,className:f,active:r=!1,title:n,testId:i,onNavigate:t,children:y}){let c=U3(Sr,u,l);return _("a",{href:c,role:"button",className:f,title:n,"aria-current":r?"page":void 0,"data-testid":i,"data-route":c,onClick:($)=>{if(!xX($))return;$.preventDefault(),t(u,l)}},y)}function bX({activeModule:u,activeTabs:l,onNavigate:f,collapsed:r,onToggle:n}){return _("aside",{className:`rail ${r?"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":r?"展开左侧边栏":"收起左侧边栏","data-testid":"rail-toggle"},r?"»":"«")),F3.map((i)=>{let t=l[i.id]||fc[i.id]||i.tabs[0]?.id||"";return _(gL,{key:i.id,moduleId:i.id,tabId:t,className:`module ${u===i.id?"active":""}`,active:u===i.id,title:i.label,onNavigate:f},_("span",{className:"module-code"},i.code),_("span",null,i.label))}))}function vX({module:u,activeTab:l,onNavigate:f}){return _("nav",{className:"tabs","aria-label":`${u.label} 子功能`},u.tabs.map((r)=>_(gL,{key:r.id,moduleId:u.id,tabId:r.id,className:`tab ${l===r.id?"active":""}`,active:l===r.id,onNavigate:f},r.label)))}function kX({data:u,onRaw:l,onNavigate:f}){let r=u.overview||{},n=u.nodes.filter((J)=>J.status==="online"),i=u.pendingTasks||u.tasks.filter(By),t=r.pendingTaskCount??i.length,y=u.tasks.slice(0,5),c=r.pgdata||{},$=r.microserviceAvailability||{},A=Ru($.totalCount),j=Ru($.healthyCount),F=Ru($.unhealthyCount);return _("div",{className:"page-grid overview-grid","data-testid":"overview-page"},_(eu,{title:"核心指标",eyebrow:"Control"},_("div",{className:"metric-grid"},_(jl,{label:"数据库",value:r.dbReady?"READY":"WAIT",hint:"PostgreSQL internal network",tone:r.dbReady?"ok":"warn"}),_(jl,{label:"PGDATA",value:Ef(c.databaseBytes),hint:`${c.volumeName||"unidesk_pgdata_10gb"} / ${c.databasePretty||"--"}`,tone:"ok",testId:"pgdata-usage-card"}),_(jl,{label:"在线节点",value:r.onlineNodeCount??0,hint:`${r.nodeCount??0} registered`,tone:"ok"}),_(jl,{label:"WebSocket",value:r.activeSocketCount??0,hint:"Provider ingress sockets"}),_(jl,{label:"用户服务可用",value:A>0?`${j}/${A}`:"--",hint:A>0?`healthyCount ${j} · unhealthyCount ${F}`:"strict /health probes",tone:A>0&&F===0?"ok":"warn",testId:"microservice-availability-card"}),_(jl,{label:"待处理任务",value:t,hint:t>0?"点击查看具体任务":`timeout ${an(Math.floor((r.taskPendingTimeoutMs??0)/1000))}`,tone:t>0?"warn":"ok",onClick:()=>f("tasks","pending"),testId:"pending-task-card"}))),_(eu,{title:"本机 Provider",eyebrow:"Self Connected"},n.length===0?_(Ul,{title:"暂无在线节点",text:"provider-gateway 未完成自接入"}):_("div",{className:"node-card-list"},n.slice(0,4).map((J)=>_(IX,{key:J.providerId,node:J,onRaw:l})))),_(eu,{title:"待处理任务明细",eyebrow:`${t} Pending`,actions:_("button",{type:"button",className:"ghost-btn",onClick:()=>f("tasks","pending"),"data-testid":"pending-task-detail-link"},"进入任务调度")},i.length===0?_(Ul,{title:"当前无待处理",text:"queued / dispatched / running 超时后会自动转为 failed,避免总览长期卡住"}):_("div",{className:"compact-list"},i.slice(0,5).map((J)=>_(VL,{key:J.id,task:J,onRaw:l})))),_(eu,{title:"最近任务",eyebrow:"Dispatch"},y.length===0?_(Ul,{title:"暂无任务",text:"可以在任务调度模块发起 docker.ps 或 echo"}):_("div",{className:"compact-list"},y.map((J)=>_(VL,{key:J.id,task:J,onRaw:l})))))}function IX({node:u,onRaw:l}){return _("article",{className:"node-card"},_("div",{className:"node-card-head"},_("div",null,_("strong",null,u.name),_("code",null,u.providerId)),_(Ll,{status:u.status})),_("div",{className:"node-version-line"},_(Hy,{node:u}),_("span",null,`升级策略 ${ac(u)}`)),_(W7,{node:u}),_(IL,{labels:u.labels,limit:6}),_("div",{className:"node-card-foot"},_("span",null,`心跳 ${wu(u.lastHeartbeat)}`),_(gl,{title:`Provider ${u.providerId}`,data:u,onOpen:l,testId:`raw-node-${lr(u.providerId)}`})))}function gX({events:u,onRaw:l}){return _(eu,{title:"事件摘要",eyebrow:"Latest 100"},u.length===0?_(Ul,{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,u.map((f)=>_("tr",{key:f.id},_("td",null,_("code",null,f.id)),_("td",null,_(Ll,{status:f.type},f.type)),_("td",null,_("code",null,f.source)),_("td",null,_(fi,{data:f.payload})),_("td",null,wu(f.createdAt)),_("td",null,_(gl,{title:`Event ${f.id}`,data:f,onOpen:l}))))))))}function sX({logs:u,onRaw:l}){return _(eu,{title:"服务日志",eyebrow:"Core Recent"},u.length===0?_(Ul,{title:"暂无日志",text:"backend-core 内存日志会在请求和 provider 事件后出现"}):_("div",{className:"log-list"},u.slice(-80).reverse().map((f,r)=>_("article",{key:r,className:`log-row ${f.level||"info"}`},_("span",null,wu(f.ts)),_("b",null,f.level||"info"),_("strong",null,f.message||"log"),_(fi,{data:f.data,empty:"无附加字段"}),_(gl,{title:`Log ${f.message||r}`,data:f,onOpen:l})))))}function aX({nodes:u,onRaw:l}){return _(eu,{title:"节点清单",eyebrow:`${u.length} Providers`},u.length===0?_(Ul,{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,u.map((f)=>_("tr",{key:f.providerId},_("td",null,_(Ll,{status:f.status})),_("td",null,_("strong",null,f.name),_("code",null,f.providerId)),_("td",null,_("div",{className:"gateway-cell"},_(Hy,{node:f}),_("span",null,ac(f)))),_("td",null,_(W7,{node:f})),_("td",null,_(IL,{labels:f.labels,limit:5})),_("td",null,wu(f.connectedAt)),_("td",null,wu(f.lastHeartbeat)),_("td",null,_(gl,{title:`Provider ${f.providerId}`,data:f,onOpen:l,testId:`raw-node-table-${lr(f.providerId)}`}))))))))}function oX({nodes:u}){let l=oc(()=>{let f=[];for(let r of u)for(let[n,i]of PL(r.labels))f.push({providerId:r.providerId,name:r.name,key:n,value:i});return f},[u]);return _(eu,{title:"资源标签",eyebrow:"Structured Labels"},l.length===0?_(Ul,{title:"暂无标签",text:"provider-gateway 注册消息会同步资源标签"}):_("div",{className:"label-matrix"},l.map((f)=>_("article",{key:`${f.providerId}-${f.key}`,className:"label-card"},_("span",null,f.key),_("strong",null,di(f.value)),_("code",null,f.providerId)))))}function dX({nodes:u}){return _(eu,{title:"心跳状态",eyebrow:"Provider Liveness"},u.length===0?_(Ul,{title:"无心跳",text:"等待 provider 注册和 heartbeat"}):_("div",{className:"heartbeat-list"},u.map((l)=>_("article",{key:l.providerId,className:"heartbeat-row"},_("span",{className:`pulse ${l.status}`}),_("div",null,_("strong",null,l.name),_("code",null,l.providerId)),_("div",null,_("span",null,"connected"),_("b",null,wu(l.connectedAt))),_("div",null,_("span",null,"last heartbeat"),_("b",null,wu(l.lastHeartbeat)))))))}function eX({nodes:u,systemStatuses:l,tasks:f,onRaw:r,refresh:n}){let[i,t]=bu(""),y=oc(()=>u.map((W)=>{let L=l.find((U)=>U.providerId===W.providerId);return{...W,systemCurrent:L?.current||null,systemHistory:L?.history||[],systemUpdatedAt:L?.updatedAt||null}}),[u,l]),c=y.find((W)=>W.providerId===i)||y[0]||null;if(Tn(()=>{if(!i&&y[0])t(y[0].providerId)},[y.length,i]),!c)return _(Ul,{title:"暂无资源监控",text:"等待 provider 上报 CPU、内存和硬盘指标"});let $=c.systemCurrent,A=c.systemHistory||[],j=$?.cpu||{},F=$?.memory||{},J=$?.disk||{},Q=A.length>0?A:$?[{at:$.collectedAt,cpuPercent:Ru(j.percent),memoryPercent:Ru(F.percent),diskPercent:Ru(J.percent)}]:[];return _("div",{className:"monitor-page","data-testid":"node-monitor-page"},_("div",{className:"docker-node-strip"},y.map((W)=>_("button",{key:W.providerId,type:"button",className:`docker-node-tile ${c.providerId===W.providerId?"active":""}`,onClick:()=>t(W.providerId)},_("span",{className:`pulse ${W.status}`}),_("strong",null,W.name),_("code",null,W.providerId),_("span",null,W.systemCurrent?`CPU ${ui(W.systemCurrent.cpu?.percent)} / MEM ${ui(W.systemCurrent.memory?.percent)}`:"等待指标")))),_("div",{className:"monitor-layout"},_(eu,{title:"任务管理器视图",eyebrow:c.name,className:"monitor-main-panel",actions:$?_(gl,{title:`System ${c.providerId}`,data:{current:$,history:A},onOpen:r}):null},!$?_(Ul,{title:"系统指标未上报",text:"provider-gateway 会周期性采集 /proc 与 df,并保存历史曲线"}):_("div",null,_("div",{className:"monitor-hero"},_("div",null,_("p",{className:"panel-eyebrow"},"Node Performance"),_("h3",null,c.name),_("div",{className:"docker-meta"},_("span",null,`${j.cores||0} CPU cores`),_("span",null,`load ${Ru(j.load1).toFixed(2)} / ${Ru(j.load5).toFixed(2)} / ${Ru(j.load15).toFixed(2)}`),_("span",null,`memory actual ${Ef(F.usedBytes)} / ${Ef(F.totalBytes)}`),_("span",null,`disk ${Ef(J.usedBytes)} / ${Ef(J.totalBytes)}`))),_(Ll,{status:$.ok?"online":"warn"},$.ok?"METRICS READY":"METRICS DEGRADED")),_("div",{className:"monitor-chart-grid"},_(U7,{title:"CPU",metricKey:"cpuPercent",current:j.percent,points:Q,detail:`${j.cores||0} cores / load ${Ru(j.load1).toFixed(2)}`,tone:"cpu",testId:"metric-chart-cpu"}),_(U7,{title:"Memory",metricKey:"memoryPercent",current:F.percent,points:Q,detail:`${Ef(F.usedBytes)} actual / ${Ef(F.cacheBytes)} cache excluded`,tone:"memory",testId:"metric-chart-memory"}),_(U7,{title:"Disk",metricKey:"diskPercent",current:J.percent,points:Q,detail:`${J.path||"/"} mounted ${J.mount||"--"}`,tone:"disk",testId:"metric-chart-disk"})),_("div",{className:"monitor-summary-grid"},_(jl,{label:"CPU 当前",value:ui(j.percent),hint:`history ${Q.length} samples`,tone:"ok"}),_(jl,{label:"实际内存",value:Ef(F.usedBytes),hint:`${ui(F.percent)} 不含缓存`}),_(jl,{label:"硬盘已用",value:Ef(J.usedBytes),hint:ui(J.percent)}),_(jl,{label:"更新时间",value:wu(c.systemUpdatedAt||$.collectedAt),hint:c.providerId})),_(uY,{current:$,onRaw:r}))),_("div",{className:"monitor-side-stack"},_(cY,{provider:c,refresh:n,onRaw:r}),_(_Y,{provider:c,tasks:f,onRaw:r,limit:5}),_(eu,{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、实际内存 RSS、线程数和磁盘 I/O 速率;表格默认按内存占用降序")))))))}function HL(u,l){if(l==="memory")return Ru(u.rssBytes);if(l==="cpu")return Ru(u.cpuPercent);if(l==="disk")return Ru(u.readBytesPerSecond)+Ru(u.writeBytesPerSecond);if(l==="pid")return Ru(u.pid);if(l==="threads")return Ru(u.threads);if(l==="runtime")return Ru(u.elapsedSeconds);if(l==="user")return String(u.user||"");return String(u.name||u.command||"")}function BL({value:u,label:l,tone:f}){let r=Math.max(1,Math.min(100,Ru(u)));return _("div",{className:`process-meter ${f||""}`},_("span",{style:{width:`${r}%`}}),_("b",null,l))}function uY({current:u,onRaw:l}){let[f,r]=bu({key:"memory",direction:"desc"}),n=li.default.useContext(Q7),i=u?.processSummary&&typeof u.processSummary==="object"?u.processSummary:{},t=Array.isArray(u?.processes)?u.processes:[],y=oc(()=>{let $=f.direction==="asc"?1:-1;return[...t].sort((A,j)=>{let F=HL(A,f.key),J=HL(j,f.key);if(typeof F==="string"||typeof J==="string")return String(F).localeCompare(String(J),"zh-CN")*$;return(F-J)*$||Ru(A.pid)-Ru(j.pid)})},[t,f.key,f.direction]),c=($,A)=>{let j=f.key===A,F=j?f.direction==="asc"?"ascending":"descending":"none";return _("th",{"aria-sort":F},_("button",{type:"button",className:`process-sort-button ${j?"active":""}`,"data-testid":`process-sort-${A}`,onClick:()=>r((J)=>({key:A,direction:J.key===A&&J.direction==="desc"?"asc":"desc"}))},$,_("span",null,j?f.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"),_(rl,{title:"进程资源占用",level:3,loading:n})),_("div",{className:"process-resource-actions"},_("span",{className:"data-chip"},"默认按内存排序"),_("span",{className:"data-chip"},`${Ru(i.visible,y.length)} / ${Ru(i.total,y.length)} 进程`),_(gl,{title:"Process Resource Snapshot",data:{processSummary:i,processes:t},onOpen:l,testId:"raw-process-resources"}))),y.length===0?_(Ul,{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,c("进程","name"),c("PID","pid"),c("用户","user"),_("th",null,"状态"),c("CPU","cpu"),c("内存","memory"),_("th",null,"RSS"),c("磁盘 I/O","disk"),c("线程","threads"),c("运行时长","runtime"))),_("tbody",null,y.map(($)=>{let A=Ru($.readBytesPerSecond)+Ru($.writeBytesPerSecond);return _("tr",{key:`${$.pid}-${$.startedAt}`,"data-testid":`process-row-${lr($.pid)}`,"data-memory-bytes":String(Ru($.rssBytes)),"data-cpu-percent":String(Ru($.cpuPercent)),"data-disk-bps":String(A),"data-pid":String(Ru($.pid))},_("td",null,_("div",{className:"process-name-cell"},_("strong",null,$.name||"--"),_("span",{className:"process-command"},$.command||"--"))),_("td",null,_("code",null,$.pid||"--")),_("td",null,$.user||`uid:${$.uid??"--"}`),_("td",null,_("span",{className:`process-state state-${lr($.state||"unknown")}`},$.state||"?")),_("td",null,_(BL,{value:$.cpuPercent,label:VX($.cpuPercent),tone:"cpu"})),_("td",null,_(BL,{value:$.memoryPercent,label:ui($.memoryPercent),tone:"memory"})),_("td",null,Ef($.rssBytes)),_("td",null,_("div",{className:"process-io-cell"},_("strong",null,F7(A)),_("span",null,`R ${F7($.readBytesPerSecond)} / W ${F7($.writeBytesPerSecond)}`))),_("td",null,$.threads||0),_("td",null,an(Ru($.elapsedSeconds))))})))))}function U7({title:u,metricKey:l,current:f,points:r,detail:n,tone:i,testId:t}){let y=r.map((F)=>Math.max(0,Math.min(100,Ru(F[l])))),c=y.length>1?y:[y[0]||0,y[0]||0],$=c.length<=1?100:100/(c.length-1),A=c.map((F,J)=>`${(J*$).toFixed(2)},${(46-F*0.42).toFixed(2)}`).join(" "),j=`0,48 ${A} 100,48`;return _("article",{className:`metric-chart ${i}`,"data-testid":t},_("div",{className:"metric-chart-head"},_("div",null,_("span",null,u),_("strong",null,ui(f))),_("code",null,`${r.length} pts`)),_("svg",{viewBox:"0 0 100 48",preserveAspectRatio:"none",role:"img","aria-label":`${u} usage curve`},_("polygon",{points:j}),_("polyline",{points:A}),_("line",{x1:"0",x2:"100",y1:"24",y2:"24"})),_("div",{className:"metric-chart-foot"},_("span",null,"0%"),_("span",null,n),_("span",null,"100%")))}function on(u){return Array.isArray(u)?u:[]}function lY(u){let l=on(u?.core?.requests?.componentSummary);return[...on(u?.frontend?.requests?.componentSummary),...l].sort((r,n)=>Ru(n.requestCount)-Ru(r.requestCount))}function fY(u){let l=on(u?.core?.operations?.summary);return[...on(u?.frontend?.operations?.summary),...l].sort((r,n)=>Ru(n.count)-Ru(r.count))}function rY(u){let l=on(u?.core?.requests?.recentFailures).map((r)=>({source:"backend",...r}));return[...on(u?.frontend?.requests?.recentFailures).map((r)=>({source:"frontend",...r})),...l].sort((r,n)=>(Kn(n.at)??0)-(Kn(r.at)??0)).slice(0,20)}function nY(u){let l=on(u?.core?.operations?.recentSlowOperations);return[...on(u?.frontend?.operations?.recentSlowOperations),...l].sort((r,n)=>Ru(n.durationMs)-Ru(r.durationMs)).slice(0,20)}function iY(u){let l=performance.memory,f=Number(l?.usedJSHeapSize);if(Number.isFinite(f)&&f>0)return f;let r=Number(u?.appBundleBytes);if(Number.isFinite(r)&&r>0)return r;return Ru(u?.process?.heapUsedBytes)}function tY({points:u}){let l=on(u),f=l.map((F)=>Ru(F.mb)),r=Math.max(1,...f),n=Math.max(0,Math.min(...f,0)),i=Math.max(1,r-n),t=l.length>1?l:[...l,...l],y=t.length<=1?100:100/(t.length-1),c=t.map((F,J)=>{let Q=Ru(F.mb);return`${(J*y).toFixed(2)},${(48-(Q-n)/i*42).toFixed(2)}`}).join(" "),$=`0,50 ${c} 100,50`,A=l.at(-1),j=l[0];return _("article",{className:"performance-memory-card","data-testid":"performance-memory-chart"},_("div",{className:"performance-memory-head"},_("strong",null,`Bwebui: ${A?`${Ru(A.mb).toFixed(1)}MB`:"--"}`),_("span",null,l.length>0?`${l.length} samples`:"等待采样")),_("svg",{viewBox:"0 0 100 50",preserveAspectRatio:"none",role:"img","aria-label":"Bwebui memory trend"},_("polygon",{points:$}),_("polyline",{points:c}),_("line",{x1:"0",x2:"100",y1:"25",y2:"25"})),_("div",{className:"performance-axis-row"},_("span",null,j?yl(new Date(j.at)):"--"),_("span",null,"时间"),_("span",null,A?yl(new Date(A.at)):"--")),_("div",{className:"performance-axis-row"},_("span",null,`${n.toFixed(1)}`),_("span",null,"(MB)"),_("span",null,`${r.toFixed(1)}`)))}function yY({onRaw:u}){let[l,f]=bu({core:null,frontend:null}),[r,n]=bu([]),[i,t]=bu(""),[y,c]=bu(!1),[$,A]=bu(null),[j,F]=bu(!1);async function J(){c(!0),t("");try{let[D,X]=await Promise.all([Eu(`${ku.apiBaseUrl}/performance`,{cache:"no-store"}),Eu(`${ku.apiBaseUrl}/frontend-performance`,{cache:"no-store"})]);f({core:D,frontend:X});let O=iY(X);n((Y)=>[...Y,{at:new Date().toISOString(),mb:O/1048576}].slice(-80))}catch(D){t(Ou(D,"性能指标加载失败"))}finally{c(!1)}}Tn(()=>{J();let D=setInterval(()=>void J(),5000);return()=>clearInterval(D)},[]);async function Q(){F(!0),t(""),A(null);try{let D=await Eu(`${ku.apiBaseUrl}/code-queue-load-test`,{method:"POST",body:JSON.stringify({targetMs:1000,timeoutMs:90000,url:ku.frontendPublicUrl||window.location.origin})});A(D),J()}catch(D){t(Ou(D,"Code Queue Playwright 测量失败"))}finally{F(!1)}}let W=lY(l),L=rY(l),U=fY(l),q=nY(l),N=l.core?.process||{},w=l.frontend?.process||{},G=l.core?.database?.codeQueueStorage||{},Z=Ru(G.total),H=$?.result||{},E=Ru(H.wallMs,NaN),V=Ru(H.networkIdleMs,NaN),S=H.withinTarget===!0,B=j?"running":$===null?"idle":$.measurementOk===!0?S?"passed":"slow":"failed";return _("div",{className:"performance-page","data-testid":"performance-page"},_("div",{className:"performance-hero"},_("div",null,_("p",{className:"panel-eyebrow"},"Unified Performance"),_(rl,{title:"性能面板",loading:y||j}),_("p",null,"按组件统计 HTTP 请求、失败率、P95 延迟,并汇总 backend/frontend 内部操作耗时。")),_("div",{className:"inline-actions"},_("button",{type:"button",className:"ghost-btn",onClick:()=>void Q(),disabled:j,"data-testid":"code-queue-load-test-button"},j?"测试中...":"测试 Code Queue 加载"),_("button",{type:"button",className:"ghost-btn",onClick:()=>void J(),disabled:y,"data-testid":"performance-refresh-button"},y?"刷新中":"刷新"),_(gl,{title:"Performance Snapshot",data:l,onOpen:u,testId:"raw-performance"}))),_(nl,{error:i}),_("div",{className:"performance-top-grid"},_(tY,{points:r}),_("div",{className:"performance-metric-stack"},_(jl,{label:"backend RSS",value:Ef(N.rssBytes),hint:`heap ${Ef(N.heapUsedBytes)}`}),_(jl,{label:"frontend RSS",value:Ef(w.rssBytes),hint:`bundle ${Ef(l.frontend?.appBundleBytes)}`}),_(jl,{label:"Codex PG 任务",value:Z||"--",hint:G.ok?"unidesk_code_queue_tasks":"等待表初始化",tone:G.ok?"ok":"warn"}),_(jl,{label:"请求样本",value:Ru(l.core?.requests?.sampleCount)+Ru(l.frontend?.requests?.sampleCount),hint:"rolling window 3000"}))),_(eu,{title:"Code Queue 加载基准",eyebrow:"Playwright / target <1s",className:"codex-load-test-panel",loading:j,actions:_("div",{className:"panel-actions"},_("button",{type:"button",className:"primary-btn",onClick:()=>void Q(),disabled:j,"data-testid":"code-queue-load-test-panel-button"},j?"正在运行 Playwright...":"手动触发测试"),$?_(gl,{title:"Code Queue Load Test",data:$,onOpen:u,testId:"raw-code-queue-load-test"}):null)},_("div",{className:"codex-load-test-grid","data-testid":"code-queue-load-test-result"},_(jl,{label:"总耗时",value:j?"运行中":Number.isFinite(E)?wr(E):"--",hint:$===null?"点击按钮启动远端 Playwright":`目标 ${wr(H.targetMs||1000)} / ${H.url||"Code Queue"}`,tone:B==="passed"?"ok":B==="failed"||B==="slow"?"warn":""}),_(jl,{label:"判定",value:j?"RUNNING":B==="passed"?"PASS <1s":B==="slow"?"SLOW":B==="failed"?"FAILED":"--",hint:$?.measurementOk===!1?String($.error||H.error||"measurement failed").slice(0,120):"导航开始 -> DOMContentLoaded -> data-load-state=complete",tone:B==="passed"?"ok":B==="idle"||B==="running"?"":"fail"}),_(jl,{label:"Network idle",value:Number.isFinite(V)?wr(V):"--",hint:`DOMContentLoaded ${wr(H.domContentLoadedMs)} / ${H.networkIdleReached===!1?"未在 5s 内空闲":"已空闲"}`,tone:Number.isFinite(V)&&V<=1000?"ok":"warn"}),_(jl,{label:"组件耗时",value:Number.isFinite(Ru(H.componentLoadMs,NaN))?wr(H.componentLoadMs):"--",hint:`queue ${wr(H.queueMs)} / detail ${wr(H.detailMs)}`,tone:Ru(H.componentLoadMs)>1000?"warn":"ok"}),_(jl,{label:"Trace 规模",value:Number.isFinite(Ru(H.transcriptRows,NaN))?String(H.transcriptRows):"--",hint:`${H.visibleTaskCount??0} visible tasks / ${H.partial?"preview":"complete"}`})),j?_("div",{className:"performance-empty-line"},"正在通过 main-server Host SSH 启动 Playwright,完成后会显示 wall time、组件耗时和最慢 API。"):null,$&&Array.isArray(H.slowestApi)&&H.slowestApi.length>0?_("div",{className:"table-wrap performance-table-wrap compact codex-load-api-table"},_("table",{className:"performance-table"},_("thead",null,_("tr",null,["API","状态","耗时"].map((D)=>_("th",{key:D},D)))),_("tbody",null,H.slowestApi.slice(0,5).map((D,X)=>_("tr",{key:`${D.url}-${X}`},_("td",null,_("code",null,D.url)),_("td",null,D.status),_("td",null,wr(D.durationMs))))))):null),_("div",{className:"performance-grid"},_(eu,{title:"组件汇总",eyebrow:"Requests",loading:y},W.length===0?_(Ul,{title:"暂无请求样本",text:"刷新几次或打开页面后会自动形成组件统计"}):_("div",{className:"table-wrap performance-table-wrap"},_("table",{className:"performance-table"},_("thead",null,_("tr",null,["组件","请求数","失败数","失败率","平均延迟","P95"].map((D)=>_("th",{key:D},D)))),_("tbody",null,W.map((D)=>_("tr",{key:D.component},_("td",null,_("code",null,D.component)),_("td",null,D.requestCount),_("td",null,D.failureCount),_("td",null,ui(Ru(D.failureRate)*100)),_("td",null,wr(D.averageLatencyMs)),_("td",null,wr(D.p95LatencyMs)))))))),_(eu,{title:"最近失败请求",eyebrow:"Failures",loading:y},L.length===0?_("div",{className:"performance-empty-line"},"最近没有失败请求"):_("div",{className:"table-wrap performance-table-wrap compact"},_("table",{className:"performance-table"},_("thead",null,_("tr",null,["时间","来源","组件","状态","路径"].map((D)=>_("th",{key:D},D)))),_("tbody",null,L.map((D,X)=>_("tr",{key:`${D.at}-${X}`},_("td",null,wu(D.at)),_("td",null,D.source),_("td",null,_("code",null,D.component)),_("td",null,_(Ll,{status:"failed"},D.status)),_("td",null,_("code",null,D.path)))))))),_(eu,{title:"内部操作汇总",eyebrow:"Operations",loading:y},U.length===0?_(Ul,{title:"暂无内部操作样本",text:"API 查询和代理请求会自动记录内部操作耗时"}):_("div",{className:"table-wrap performance-table-wrap"},_("table",{className:"performance-table"},_("thead",null,_("tr",null,["服务","操作","次数","平均延迟","P95"].map((D)=>_("th",{key:D},D)))),_("tbody",null,U.map((D)=>_("tr",{key:`${D.service}-${D.operation}`},_("td",null,D.service),_("td",null,_("code",null,D.operation)),_("td",null,D.count),_("td",null,wr(D.averageLatencyMs)),_("td",null,wr(D.p95LatencyMs)))))))),_(eu,{title:"最近慢操作",eyebrow:"Slowest",loading:y},q.length===0?_(Ul,{title:"暂无慢操作",text:"后端会记录最近窗口内耗时最高的内部操作"}):_("div",{className:"table-wrap performance-table-wrap"},_("table",{className:"performance-table"},_("thead",null,_("tr",null,["时间","操作","耗时","结果","细节"].map((D)=>_("th",{key:D},D)))),_("tbody",null,q.map((D,X)=>_("tr",{key:`${D.at}-${D.operation}-${X}`},_("td",null,wu(D.at)),_("td",null,_("code",null,D.operation)),_("td",null,wr(D.durationMs)),_("td",null,D.ok?"成功":"失败"),_("td",null,D.detail||"-")))))))))}function cY({provider:u,refresh:l,onRaw:f}){let[r,n]=bu(""),[i,t]=bu(null),[y,c]=bu("");async function $(A){n(A),c("");try{let j=await Eu(`${ku.apiBaseUrl}/dispatch`,{method:"POST",body:JSON.stringify({providerId:u.providerId,command:"provider.upgrade",payload:{mode:A,source:"frontend-resource-monitor",requestedAt:new Date().toISOString()}})});t({mode:A,...j}),await l()}catch(j){c(Ou(j,"升级命令下发失败"))}finally{n("")}}return _(eu,{title:"Provider Gateway 升级",eyebrow:"Remote Control",loading:Boolean(r)},_("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,u.providerId),_(Hy,{node:u})),_("div",{className:"upgrade-actions"},_("button",{type:"button",className:"ghost-btn",disabled:Boolean(r),onClick:()=>$("plan"),"data-testid":"upgrade-plan-button"},r==="plan"?"预检中":"预检升级"),_("button",{type:"button",className:"ghost-btn danger",disabled:Boolean(r),onClick:()=>$("schedule"),"data-testid":"upgrade-schedule-button"},r==="schedule"?"调度中":"执行升级")),_(nl,{error:y}),i?_("div",{className:"upgrade-result"},_(Ll,{status:i.status||"queued"},i.status||"queued"),_("span",null,`${i.mode==="schedule"?"执行升级":"预检升级"} 已下发`),_("span",null,`指定版本 ${w7(CL(u))}`),_("code",null,i.taskId||"--"),_(gl,{title:"Provider Upgrade Dispatch",data:i,onOpen:f})):_("span",{className:"muted"},"升级任务结果会进入任务历史;执行升级可能导致 provider 短暂重连。")))}function sL({records:u,onRaw:l,compact:f=!1}){if(u.length===0)return _(Ul,{title:"暂无远程更新记录",text:"该节点还没有 provider.upgrade 任务;执行预检或升级后会在这里形成结构化记录"});return _("div",{className:`upgrade-record-table-wrap table-wrap ${f?"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,u.map((r)=>_("tr",{key:r.id,"data-testid":`gateway-upgrade-record-${lr(r.id)}`},_("td",null,_(Ll,{status:r.status})),_("td",null,_("span",{className:`mode-chip ${hA(r)}`},hA(r)==="schedule"?"执行升级":"预检")),_("td",null,_("strong",null,"provider.upgrade"),_("code",null,r.id)),_("td",null,XX(r)),_("td",null,_(oL,{task:r})),_("td",null,YX(r)),_("td",null,_("span",{className:"version-chip"},xL(r))),_("td",null,_("span",{className:`upgrade-outcome ${String(r.status||"").toLowerCase()}`},bL(r))),_("td",null,wu(r.updatedAt)),_("td",null,_(gl,{title:`Provider Upgrade Task ${r.id}`,data:dc(r),onOpen:l})))))))}function _Y({provider:u,tasks:l,onRaw:f,limit:r=5}){let n=vL(l,u.providerId).slice(0,r);return _(eu,{title:"远程更新记录",eyebrow:u.providerId,actions:_(Hy,{node:u}),className:"provider-upgrade-records-panel"},_("div",{"data-testid":`provider-upgrade-records-${lr(u.providerId)}`},_(sL,{records:n,onRaw:f,compact:!0})))}function $Y({nodes:u,tasks:l,onRaw:f}){let r=oc(()=>u.map((i)=>{let t=vL(l,i.providerId);return{node:i,records:t,latest:PX(t),capabilities:ML(i)}}),[u,l]),n=r.reduce((i,t)=>i+t.records.length,0);return _("div",{className:"gateway-page","data-testid":"gateway-version-page"},_(eu,{title:"Provider Gateway 版本",eyebrow:`${u.length} Providers / ${n} 更新记录`},u.length===0?_(Ul,{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,r.map((i)=>_("tr",{key:i.node.providerId},_("td",null,_(Ll,{status:i.node.status})),_("td",null,_("strong",null,i.node.name),_("code",null,i.node.providerId)),_("td",null,_(Hy,{node:i.node})),_("td",null,ac(i.node)),_("td",null,_(W7,{node:i.node})),_("td",null,zL(i.node)?wu(zL(i.node)):"待新版上报"),_("td",null,_("div",{className:"capability-row"},i.capabilities.length===0?_("span",{className:"muted"},"未声明"):i.capabilities.slice(0,5).map((t)=>_("span",{key:t,className:"data-chip"},t)))),_("td",null,i.latest?_("div",{className:"latest-upgrade-cell"},_(Ll,{status:i.latest.status}),_("span",null,`${hA(i.latest)==="schedule"?"执行升级":"预检"} / ${wu(i.latest.updatedAt)}`),_("small",null,`Gateway ${xL(i.latest)}`),_("small",null,bL(i.latest))):_("span",{className:"muted"},"暂无记录")),_("td",null,_(gl,{title:`Provider ${i.node.providerId}`,data:i.node,onOpen:f})))))))),_(eu,{title:"远程更新记录",eyebrow:"Structured provider.upgrade records"},u.length===0?_(Ul,{title:"暂无记录",text:"没有 provider 节点时不会生成远程更新记录"}):_("div",{className:"gateway-record-grid"},r.map((i)=>_("article",{key:i.node.providerId,className:"gateway-record-card","data-testid":`gateway-records-${lr(i.node.providerId)}`},_("div",{className:"gateway-record-head"},_("div",null,_("strong",null,i.node.name),_("code",null,i.node.providerId)),_(Hy,{node:i.node})),_("div",{className:"gateway-record-meta"},_("span",null,`心跳 ${wu(i.node.lastHeartbeat)}`),_("span",null,`策略 ${ac(i.node)}`),_("span",null,`${i.records.length} 条记录`)),_(sL,{records:i.records.slice(0,8),onRaw:f,compact:!0}))))))}function AY(u){if(u==="running")return"online";if(u==="paused"||u==="restarting")return"warn";if(u==="exited"||u==="dead")return"offline";return"internal"}function aL(u){return/^[a-f0-9]{48,64}$/i.test(u)}function sc(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 mL(u){let l=String(u?.name||""),f=String(u?.labels||"");if(sc(u))return 0;if(f.includes("com.docker.compose.project=unidesk"))return 1;if(!aL(l))return 2;return 3}function jY(u){return[...u].sort((l,f)=>{let r=mL(l)-mL(f);if(r!==0)return r;return String(l.name||"").localeCompare(String(f.name||""))})}function FY({nodes:u,dockerStatuses:l,onRaw:f}){let[r,n]=bu(""),i=oc(()=>u.map((q)=>{let N=l.find((w)=>w.providerId===q.providerId);return{...q,dockerStatus:N?.dockerStatus||null,dockerUpdatedAt:N?.updatedAt||null}}),[u,l]),t=i.find((q)=>q.providerId===r)||i[0]||null;if(Tn(()=>{if(!r&&i[0])n(i[0].providerId)},[i.length,r]),!t)return _(Ul,{title:"暂无 Docker 节点",text:"等待 provider 上报 Docker daemon 状态"});let y=t.dockerStatus,c=t.providerId==="main-server",$=y?.counts||{},A=y?.daemon||{},j=y?.containers||[],F=y?.images||[],J=jY(y?.volumes||[]),Q=c?J.find(sc):null,W=y?.networks||[],L=j.filter((q)=>q.state==="running"),U=j.filter((q)=>q.state!=="running");return _("div",{className:"docker-page","data-testid":"docker-status-page"},_("div",{className:"docker-node-strip"},i.map((q)=>_("button",{key:q.providerId,type:"button",className:`docker-node-tile ${t.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"},_(eu,{title:"Docker Desktop 视图",eyebrow:t.name,className:"docker-main-panel",actions:y?_(gl,{title:`Docker ${t.providerId}`,data:y,onOpen:f}):null},!y?_(Ul,{title:"Docker 状态未上报",text:"provider-gateway 会在连接后周期性采集 docker info / ps / images / volume / network"}):_("div",null,_("div",{className:"docker-hero"},_("div",null,_("p",{className:"panel-eyebrow"},"Daemon"),_("h3",null,A.name||t.providerId),_("div",{className:"docker-meta"},_("span",null,A.serverVersion?`Engine ${A.serverVersion}`:"Engine --"),_("span",null,A.operatingSystem||"OS --"),_("span",null,A.architecture||"arch --"),_("span",null,`${A.cpus||0} CPU / ${Ef(A.memoryBytes)}`))),_(Ll,{status:y.ok?"online":"warn"},y.ok?"Docker Ready":"Docker Degraded")),_("div",{className:"docker-metrics"},_(jl,{label:"Containers",value:$.containers??j.length,hint:`${$.running??L.length} running / ${$.stopped??U.length} stopped`,tone:"ok"}),_(jl,{label:"Images",value:$.images??F.length,hint:`${$.daemonImages??$.images??F.length} daemon images`}),_(jl,{label:"Volumes",value:$.volumes??J.length,hint:c?Q?"database volume visible":"database volume missing":"node local volumes",tone:Q?"ok":""}),_(jl,{label:"Networks",value:$.networks??W.length,hint:A.driver?`driver ${A.driver}`:"docker networks"})),c?_(UY,{volume:Q,volumeCount:J.length}):null,_("div",{className:"docker-section-head"},_("h3",null,"Containers"),_("span",null,`updated ${wu(t.dockerUpdatedAt||y.collectedAt)}`)),_("div",{className:"docker-container-table table-wrap","data-testid":"docker-container-table"},_("table",null,_("thead",null,_("tr",null,_("th",null,"状态"),_("th",null,"容器"),_("th",null,"镜像"),_("th",null,"端口"),_("th",null,"运行时间"),_("th",null,"重启策略"),_("th",null,"PID"),_("th",null,"大小"))),_("tbody",null,j.length===0?_("tr",null,_("td",{colSpan:8},"暂无容器")):j.map((q)=>_("tr",{key:`${q.id}-${q.name}`},_("td",null,_(Ll,{status:AY(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?_(Ll,{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"},_(J7,{title:"Images",items:F,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||"--"))}),_(J7,{title:"Volumes",items:J,limit:J.length,render:(q)=>_("article",{key:q.name,className:`docker-side-row volume-row ${c&&sc(q)?"database-volume":""}`,"data-testid":c&&sc(q)?"database-volume-row":void 0},_("strong",null,q.name),_("span",null,c&&sc(q)?"PostgreSQL":aL(String(q.name||""))?"anonymous":"named"),_("code",null,q.mountpoint||q.driver||q.scope||"--"))}),_(J7,{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 UY({volume:u,volumeCount:l}){return _("section",{className:`docker-volume-focus ${u?"ready":"missing"}`,"data-testid":"database-volume-card"},_("div",{className:"volume-focus-head"},_("span",{className:"panel-eyebrow"},"Database Named Volume"),_(Ll,{status:u?"online":"warn"},u?"FOUND":"MISSING")),u?_("div",{className:"volume-focus-body"},_("strong",null,u.name),_("span",null,"PostgreSQL data volume for unidesk-database"),_("div",{className:"volume-route"},_("code",null,u.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 ${u.driver||"--"}`),_("span",null,`scope ${u.scope||"--"}`),_("span",null,`${l} volumes reported`))):_("div",{className:"volume-focus-body"},_("strong",null,"unidesk_pgdata_10gb"),_("span",null,"当前 Docker 快照没有发现数据库命名卷;请检查 provider-gateway 的 Docker volume 上报。")))}function J7({title:u,items:l,render:f,limit:r}){let n=l.slice(0,r??12),i=Math.max(0,l.length-n.length);return _(eu,{title:u,eyebrow:`${l.length} items`,className:"docker-side-panel"},l.length===0?_(Ul,{title:`暂无 ${u}`,text:"等待 Docker 状态采集"}):_("div",{className:"docker-side-list"},n.map(f),i>0?_("div",{className:"docker-side-more"},`+ ${i} more`):null))}function JY({microservices:u,onRaw:l,onNavigate:f}){let r=u.filter((n)=>OL(n).public===!1);return _("div",{className:"microservice-page","data-testid":"microservice-catalog-page"},_(eu,{title:"用户服务目录",eyebrow:"Provider Mounted User Services"},_("div",{className:"metric-grid"},_(jl,{label:"服务总数",value:u.length,hint:"config.json 用户服务登记"}),_(jl,{label:"私有后端",value:r.length,hint:"不直接暴露公网",tone:"ok"}),_(jl,{label:"D601 服务",value:u.filter((n)=>n.providerId==="D601").length,hint:"compute-node docker"}),_(jl,{label:"集成前端",value:u.filter((n)=>n.frontend?.integrated).length,hint:"UniDesk React 页面"}))),_(eu,{title:"服务映射",eyebrow:"Repo Reference + Runtime"},u.length===0?_(Ul,{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,u.map((n)=>{let i=kL(n),t=CX(n),y=OL(n),c=i.availability||{},$=c.status||(i.providerStatus==="online"?"unknown":"unhealthy");return _("tr",{key:n.id,"data-testid":`microservice-row-${lr(n.id)}`},_("td",null,_("strong",null,n.name),_("code",null,n.id)),_("td",null,_("strong",null,i.providerName||n.providerId),_("code",null,n.providerId)),_("td",null,_("span",null,t.url||"--"),_("code",null,t.commitId||"--")),_("td",null,_("span",null,t.composeFile||"--"),_("code",null,`${t.composeService||"--"} / ${t.containerName||"--"}`)),_("td",null,_(Ll,{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,_(Ll,{status:$==="healthy"?"online":$==="unknown"?"warn":"failed"},$),_("span",null,c.reason||i.providerStatus||"unknown"),_(fi,{data:i.container,empty:"容器快照未上报"})),_("td",null,_("div",{className:"microservice-actions"},n.id==="findjob"?_("button",{type:"button",className:"ghost-btn",onClick:()=>f("apps","findjob"),"data-testid":"open-findjob-button"},"打开"):null,n.id==="pipeline"?_("button",{type:"button",className:"ghost-btn",onClick:()=>f("apps","pipeline"),"data-testid":"open-pipeline-button"},"打开"):null,n.id==="todo-note"?_("button",{type:"button",className:"ghost-btn",onClick:()=>f("apps","todo-note"),"data-testid":"open-todo-note-button"},"打开"):null,n.id==="met-nonlinear"?_("button",{type:"button",className:"ghost-btn",onClick:()=>f("apps","met-nonlinear"),"data-testid":"open-met-nonlinear-button"},"打开"):null,n.id==="claudeqq"?_("button",{type:"button",className:"ghost-btn",onClick:()=>f("apps","claudeqq"),"data-testid":"open-claudeqq-button"},"打开"):null,n.id==="baidu-netdisk"?_("button",{type:"button",className:"ghost-btn",onClick:()=>f("apps","baidu-netdisk"),"data-testid":"open-baidu-netdisk-button"},"打开"):null,n.id==="oa-event-flow"?_("button",{type:"button",className:"ghost-btn",onClick:()=>f("apps","oa-event-flow"),"data-testid":"open-oa-event-flow-button"},"打开"):null,n.id==="k3sctl-adapter"?_("button",{type:"button",className:"ghost-btn",onClick:()=>f("apps","k3sctl"),"data-testid":"open-k3sctl-button"},"打开"):null,n.id==="code-queue"?_("button",{type:"button",className:"ghost-btn",onClick:()=>f("apps","code-queue"),"data-testid":"open-code-queue-button"},"打开"):null,n.id==="mdtodo"?_("button",{type:"button",className:"ghost-btn",onClick:()=>f("apps","mdtodo"),"data-testid":"open-mdtodo-button"},"打开"):null,n.id==="project-manager"?_("button",{type:"button",className:"ghost-btn",onClick:()=>f("apps","project-manager"),"data-testid":"open-project-manager-button"},"打开"):null,_(gl,{title:`用户服务 ${n.id}`,data:n,onOpen:l}))))}))))))}function QY({nodes:u,onDispatched:l,onRaw:f}){let r=u.filter((B)=>B.status==="online"),[n,i]=bu(r[0]?.providerId||u[0]?.providerId||""),[t,y]=bu("docker.ps"),[c,$]=bu("frontend"),[A,j]=bu("operator-check"),[F,J]=bu("normal"),[Q,W]=bu(!1),[L,U]=bu(""),[q,N]=bu(!1),[w,G]=bu(null),[Z,H]=bu("");Tn(()=>{if(!n&&(r[0]?.providerId||u[0]?.providerId))i(r[0]?.providerId||u[0].providerId)},[u.length,r.length,n]);function E(){return{source:c,note:A,priority:F}}function V(){U(JSON.stringify(E(),null,2)),W(!0)}async function S(B){B.preventDefault(),N(!0),H("");try{let D=Q?JSON.parse(L||"{}"):E(),X=await Eu(`${ku.apiBaseUrl}/dispatch`,{method:"POST",body:JSON.stringify({providerId:n,command:t,payload:D})});G(X),await l()}catch(D){H(Ou(D,"下发失败"))}finally{N(!1)}}return _("div",{className:"page-grid dispatch-grid"},_(eu,{title:"下发任务",eyebrow:"Real WebSocket Dispatch"},_("form",{className:"dispatch-form",onSubmit:S},_("label",null,"Provider",_("select",{value:n,onChange:(B)=>i(B.target.value)},u.map((B)=>_("option",{key:B.providerId,value:B.providerId},`${B.name} / ${B.providerId}`)))),_("label",null,"Command",_("select",{value:t,onChange:(B)=>y(B.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:(B)=>$(B.target.value)})),_("label",null,"备注",_("input",{value:A,onChange:(B)=>j(B.target.value)})),_("label",null,"优先级",_("select",{value:F,onChange:(B)=>J(B.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?"下发中":"下发任务")),Q?_("label",{className:"raw-editor-label"},"高级 Payload",_("textarea",{className:"raw-editor",value:L,onChange:(B)=>U(B.target.value)})):null,_(nl,{error:Z,wide:!0}))),_(eu,{title:"下发结果",eyebrow:"Response"},w?_("div",{className:"result-card"},_(Ll,{status:w.status||"queued"},w.status||"queued"),_("dl",null,_("dt",null,"Task ID"),_("dd",null,_("code",null,w.taskId||"--")),_("dt",null,"Provider 在线"),_("dd",null,di(w.providerOnline))),_(gl,{title:"Dispatch Response",data:w,onOpen:f})):_(Ul,{title:"等待操作",text:"任务响应会以结构化结果卡展示"})))}function VL({task:u,onRaw:l}){return _("article",{className:"compact-row"},_(Ll,{status:u.status}),_("div",null,_("strong",null,u.command),_("code",null,u.id)),_("span",null,By(u)?`已等待 ${N7(u.updatedAt)}`:`耗时 ${an(XL(u)??0)}`),_(gl,{title:`Task ${u.id}`,data:dc(u),onOpen:l}))}function oL({task:u}){let l=XL(u),f=By(u);return _("div",{className:"task-duration"},_("strong",null,l===null?"--":an(l)),_("span",null,f?`已运行 / 创建 ${wu(u.createdAt)}`:`创建 ${wu(u.createdAt)}`))}function NY({task:u}){let l=String(u?.status||"").toLowerCase(),f=u?.result,r=f&&typeof f==="object"&&!Array.isArray(f)?f:{},i=["exitCode","code","signal","timeoutMs","previousStatus","mode"].filter((t)=>r[t]!==void 0&&r[t]!==null);if(l==="failed"){let t=YL(u);return _("div",{className:"task-diagnostic failed"},_("b",null,"失败原因"),_("span",{className:"diagnostic-reason"},di(t)),i.length>0?_("div",{className:"diagnostic-meta"},i.map((y)=>_("span",{key:y,className:"data-chip"},_("b",null,y),_("span",null,di(r[y]))))):null)}if(By(u))return _("div",{className:"task-diagnostic warn"},_("b",null,"等待终态"),_("span",null,`最后更新 ${N7(u.updatedAt)} 前`));return _("div",{className:"task-diagnostic ok"},_("b",null,"完成摘要"),_(fi,{data:f,empty:"无执行输出"}))}function qY({tasks:u,onRaw:l}){let f=u.filter(By);return _("div",{"data-testid":"pending-task-page"},_(eu,{title:"待处理任务",eyebrow:`${f.length} Pending`},f.length===0?_(Ul,{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,f.map((r)=>_("tr",{key:r.id},_("td",null,_(Ll,{status:r.status})),_("td",null,_("strong",null,r.command),_("code",null,r.id)),_("td",null,_("code",null,r.providerId)),_("td",null,N7(r.updatedAt)),_("td",null,_(fi,{data:r.payload})),_("td",null,_(gl,{title:`Pending Task ${r.id}`,data:dc(r),onOpen:l})))))))))}function wY({tasks:u,onRaw:l}){return _("div",{"data-testid":"task-history-page"},_(eu,{title:"任务历史",eyebrow:`${u.length} Tasks`},u.length===0?_(Ul,{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,u.map((f)=>_("tr",{key:f.id,"data-testid":`task-row-${lr(f.id)}`},_("td",null,_(Ll,{status:f.status})),_("td",null,_("strong",null,f.command),_("code",null,f.id)),_("td",null,_("code",null,f.providerId)),_("td",null,_(oL,{task:f})),_("td",null,_(fi,{data:f.payload})),_("td",null,_(NY,{task:f})),_("td",null,wu(f.updatedAt)),_("td",null,_(gl,{title:`Task ${f.id}`,data:dc(f),onOpen:l})))))))))}function WY({tasks:u,onRaw:l}){let f=u.filter((r)=>["succeeded","failed"].includes(r.status));return _(eu,{title:"执行结果",eyebrow:"Finished Tasks"},f.length===0?_(Ul,{title:"暂无结果",text:"任务完成后展示 provider 返回的结构化摘要"}):_("div",{className:"result-grid"},f.map((r)=>_("article",{key:r.id,className:"result-card"},_("div",{className:"node-card-head"},_("strong",null,r.command),_(Ll,{status:r.status})),_("code",null,r.id),_(fi,{data:r.result,empty:"无执行输出"}),_(gl,{title:`Task Result ${r.id}`,data:dc(r),onOpen:l})))))}function LY(u){if(!u||typeof u!=="object")return"--";if(u.type==="interval")return`每 ${an(Number(u.everySeconds||0))}`;return`每天 ${u.timeOfDay||"03:00"} UTC`}function TY(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 KY(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 GY(u){let l=Number(u?.durationMs);if(Number.isFinite(l)&&l>=0)return an(l/1000);let f=Kn(u?.startedAt||u?.createdAt);if(f===null)return"--";let n=Kn(u?.finishedAt)??Date.now();return an(Math.max(0,(n-f)/1000))}function DL(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 zY({schedules:u,scheduleRuns:l,nodes:f,refresh:r,onRaw:n}){let[i,t]=bu(DL(f||[])),[y,c]=bu(!1),[$,A]=bu(""),[j,F]=bu(""),J=[...l||[]].sort((w,G)=>(Kn(G.updatedAt)??0)-(Kn(w.updatedAt)??0));function Q(w,G){t((Z)=>({...Z,[w]:G}))}function W(w){let G=w?.action||{};t({id:w?.id||"",name:w?.name||"",description:w?.description||"",enabled:w?.enabled!==!1,timeOfDay:w?.schedule?.timeOfDay||"03:30",actionType:G.type||"dispatch",providerId:G.providerId||f[0]?.providerId||"main-server",command:G.command||"echo",payloadJson:JSON.stringify(G.payload||{source:"scheduled-task"},null,2),remoteBaseDir:G.remoteBaseDir||"/SERVER_DATA/UNIDESK_PG_DATA",stagingSubdir:G.stagingSubdir||"server-data/unidesk-pg-data",timeoutMs:String(G.timeoutMs||3600000)}),F(`正在编辑 ${w?.id||""}`)}function L(){let w={id:i.id,name:i.name,description:i.description,enabled:i.enabled,concurrencyPolicy:"skip",schedule:{type:"daily",timeOfDay:i.timeOfDay,timezone:"Etc/UTC"}};if(i.actionType==="pgdata_backup")return{...w,action:{type:"pgdata_backup",volumeName:"unidesk_pgdata_10gb",remoteBaseDir:i.remoteBaseDir,stagingSubdir:i.stagingSubdir,timeoutMs:Number(i.timeoutMs)||3600000,cleanupLocal:!0}};return{...w,action:{type:"dispatch",providerId:i.providerId,command:i.command,payload:JSON.parse(i.payloadJson||"{}"),timeoutMs:Number(i.timeoutMs)||600000}}}async function U(w){w.preventDefault(),c(!0),A(""),F("");try{let G=L(),Z=encodeURIComponent(String(G.id));await Eu(`${ku.apiBaseUrl}/schedules/${Z}`,{method:"PUT",body:JSON.stringify(G)}),F("定时任务已保存"),await r()}catch(G){A(Ou(G,"保存定时任务失败"))}finally{c(!1)}}async function q(w){if(!w?.id)return;c(!0),A(""),F("");try{await Eu(`${ku.apiBaseUrl}/schedules/${encodeURIComponent(w.id)}`,{method:"DELETE"}),F(`已删除 ${w.id}`),await r()}catch(G){A(Ou(G,"删除定时任务失败"))}finally{c(!1)}}async function N(w){if(!w?.id)return;c(!0),A(""),F("");try{let G=await Eu(`${ku.apiBaseUrl}/schedules/${encodeURIComponent(w.id)}/run`,{method:"POST",body:"{}"});F(`已触发 ${w.id} / ${G?.run?.id||"run"}`),await r()}catch(G){A(Ou(G,"触发定时任务失败"))}finally{c(!1)}}return _("div",{className:"page-grid scheduled-task-page","data-testid":"scheduled-task-page"},_(eu,{title:"定时任务",eyebrow:`${(u||[]).length} Schedules`},(u||[]).length===0?_(Ul,{title:"暂无定时任务",text:"创建 daily / dispatch / PGDATA backup 任务后会在这里展示下一次执行时间和最近结果"}):_("div",{className:"schedule-card-grid"},(u||[]).map((w)=>_("article",{key:w.id,className:"schedule-card","data-testid":`schedule-row-${lr(w.id)}`},_("div",{className:"node-card-head"},_("strong",null,w.name||w.id),_(Ll,{status:w.enabled?"online":"warn"},w.enabled?"enabled":"disabled")),_("code",null,w.id),_("dl",null,_("dt",null,"计划"),_("dd",null,LY(w.schedule)),_("dt",null,"动作"),_("dd",null,TY(w.action)),_("dt",null,"下次执行"),_("dd",null,wu(w.nextRunAt)),_("dt",null,"最近执行"),_("dd",null,w.lastRunAt?`${wu(w.lastRunAt)} / ${w.lastRunId||"--"}`:"--")),_("div",{className:"dispatch-actions"},_("button",{type:"button",className:"ghost-btn",disabled:y,onClick:()=>W(w)},"编辑"),_("button",{type:"button",className:"ghost-btn",disabled:y,onClick:()=>N(w),"data-testid":`schedule-run-${lr(w.id)}`},"手动触发"),_("button",{type:"button",className:"ghost-btn danger",disabled:y,onClick:()=>q(w)},"删除"),_(gl,{title:`Schedule ${w.id}`,data:w,onOpen:n})))))),_(eu,{title:i.id?"配置定时任务":"新建定时任务",eyebrow:"CRUD"},_("form",{className:"dispatch-form schedule-form",onSubmit:U},_("label",null,"ID",_("input",{value:i.id,onChange:(w)=>Q("id",w.target.value)})),_("label",null,"名称",_("input",{value:i.name,onChange:(w)=>Q("name",w.target.value)})),_("label",null,"每日执行时间 UTC",_("input",{value:i.timeOfDay,placeholder:"03:30",onChange:(w)=>Q("timeOfDay",w.target.value)})),_("label",null,"启用",_("select",{value:i.enabled?"true":"false",onChange:(w)=>Q("enabled",w.target.value==="true")},_("option",{value:"true"},"enabled"),_("option",{value:"false"},"disabled"))),_("label",null,"动作类型",_("select",{value:i.actionType,onChange:(w)=>Q("actionType",w.target.value)},_("option",{value:"pgdata_backup"},"PGDATA 备份到百度网盘"),_("option",{value:"dispatch"},"Provider Dispatch"))),i.actionType==="pgdata_backup"?[_("label",{key:"remote"},"网盘根目录",_("input",{value:i.remoteBaseDir,onChange:(w)=>Q("remoteBaseDir",w.target.value)})),_("label",{key:"staging"},"本地 staging 子目录",_("input",{value:i.stagingSubdir,onChange:(w)=>Q("stagingSubdir",w.target.value)}))]:[_("label",{key:"provider"},"Provider",_("select",{value:i.providerId,onChange:(w)=>Q("providerId",w.target.value)},(f||[]).map((w)=>_("option",{key:w.providerId,value:w.providerId},`${w.name} / ${w.providerId}`)))),_("label",{key:"command"},"Command",_("select",{value:i.command,onChange:(w)=>Q("command",w.target.value)},_("option",{value:"echo"},"echo"),_("option",{value:"docker.ps"},"docker.ps"),_("option",{value:"host.ssh"},"host.ssh"),_("option",{value:"microservice.http"},"microservice.http"))),_("label",{key:"payload",className:"raw-editor-label"},"Payload JSON",_("textarea",{className:"raw-editor",value:i.payloadJson,onChange:(w)=>Q("payloadJson",w.target.value)}))],_("label",null,"超时 ms",_("input",{value:i.timeoutMs,onChange:(w)=>Q("timeoutMs",w.target.value)})),_("label",{className:"raw-editor-label"},"描述",_("textarea",{className:"raw-editor compact",value:i.description,onChange:(w)=>Q("description",w.target.value)})),_("div",{className:"dispatch-actions"},_("button",{type:"button",className:"ghost-btn",disabled:y,onClick:()=>t(DL(f||[]))},"重置"),_("button",{type:"submit",disabled:y||!i.id},y?"保存中":"保存任务")),j?_("p",{className:"muted paragraph"},j):null,_(nl,{error:$,wide:!0}))),_(eu,{title:"历史执行记录",eyebrow:`${J.length} Runs`},J.length===0?_(Ul,{title:"暂无执行记录",text:"定时触发或手动触发后会生成 run history"}):_("div",{className:"table-wrap"},_("table",{className:"task-history-table schedule-run-table"},_("thead",null,_("tr",null,_("th",null,"状态"),_("th",null,"任务"),_("th",null,"触发"),_("th",null,"耗时"),_("th",null,"结果摘要"),_("th",null,"更新时间"),_("th",null,"操作"))),_("tbody",null,J.map((w)=>_("tr",{key:w.id,"data-testid":`schedule-run-row-${lr(w.id)}`},_("td",null,_(Ll,{status:KY(w.status)},w.status)),_("td",null,_("strong",null,w.scheduleId),_("code",null,w.id),w.taskId?_("code",null,w.taskId):null),_("td",null,w.trigger||"--"),_("td",null,GY(w)),_("td",null,_(fi,{data:w.result||w.error,empty:"无结果"})),_("td",null,wu(w.updatedAt)),_("td",null,_(gl,{title:`Schedule Run ${w.id}`,data:w,onOpen:n})))))))))}function EY({data:u}){let l=u.overview||{};return _("div",{className:"page-grid topology-grid"},_(eu,{title:"公开入口",eyebrow:"Public"},_("div",{className:"endpoint-list"},_("article",null,_("b",null,"Frontend"),_("span",null,ku.frontendPublicUrl||window.location.origin),_(Ll,{status:"online"},"public")),_("article",null,_("b",null,"Provider Ingress"),_("span",null,ku.providerIngressPublicUrl||"ws://public/ws/provider"),_(Ll,{status:"online"},"public")))),_(eu,{title:"内部服务",eyebrow:"Docker Network Only"},_("div",{className:"endpoint-list"},_("article",null,_("b",null,"backend-core API"),_("span",null,"http://backend-core:8080"),_(Ll,{status:"internal"},"internal")),_("article",null,_("b",null,"database"),_("span",null,"postgres://database:5432/unidesk"),_(Ll,{status:"internal"},"internal")))),_(eu,{title:"运行态",eyebrow:"Runtime"},_("div",{className:"metric-grid"},_(jl,{label:"DB Ready",value:l.dbReady?"YES":"NO",hint:"internal health"}),_(jl,{label:"Online Nodes",value:l.onlineNodeCount??0,hint:"provider-gateway self-link"}))))}function OY({session:u}){return _(eu,{title:"认证策略",eyebrow:"Frontend Login"},_("div",{className:"policy-grid"},_("article",null,_("span",null,"默认账号"),_("strong",null,ku.authUsername||"admin")),_("article",null,_("span",null,"当前会话"),_("strong",null,u?.user?.username||"--")),_("article",null,_("span",null,"Session TTL"),_("strong",null,`${ku.sessionTtlSeconds||0}s`)),_("article",null,_("span",null,"API 访问"),_("strong",null,"同源 Cookie 保护"))),_("p",{className:"muted paragraph"},"浏览器只访问 frontend 同源接口;frontend 容器使用 Docker 内网代理 backend-core API。"))}function ZY(){return _(eu,{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 HY({activeModule:u,activeTab:l,data:f,session:r,refresh:n,onRaw:i,onNavigate:t}){if(u==="ops"&&l==="status")return _(kX,{data:f,onRaw:i,onNavigate:t});if(u==="ops"&&l==="performance")return _(yY,{onRaw:i});if(u==="ops"&&l==="events")return _(gX,{events:f.events,onRaw:i});if(u==="ops"&&l==="logs")return _(sX,{logs:f.logs,onRaw:i});if(u==="nodes"&&l==="list")return _(aX,{nodes:f.nodes,onRaw:i});if(u==="nodes"&&l==="monitor")return _(eX,{nodes:f.nodes,systemStatuses:f.systemStatuses,tasks:f.tasks,onRaw:i,refresh:n});if(u==="nodes"&&l==="docker")return _(FY,{nodes:f.nodes,dockerStatuses:f.dockerStatuses,onRaw:i});if(u==="nodes"&&l==="gateway")return _($Y,{nodes:f.nodes,tasks:f.tasks,onRaw:i});if(u==="nodes"&&l==="labels")return _(oX,{nodes:f.nodes});if(u==="nodes"&&l==="heartbeats")return _(dX,{nodes:f.nodes});if(u==="tasks"&&l==="dispatch")return _(QY,{nodes:f.nodes,onDispatched:n,onRaw:i});if(u==="tasks"&&l==="scheduled")return _(zY,{schedules:f.schedules,scheduleRuns:f.scheduleRuns,nodes:f.nodes,refresh:n,onRaw:i});if(u==="tasks"&&l==="pending")return _(qY,{tasks:f.pendingTasks,onRaw:i});if(u==="tasks"&&l==="history")return _(wY,{tasks:f.tasks,onRaw:i});if(u==="tasks"&&l==="results")return _(WY,{tasks:f.tasks,onRaw:i});if(u==="apps"&&l==="catalog")return _(JY,{microservices:f.microservices,onRaw:i,onNavigate:t});if(u==="apps"&&l==="todo-note")return _(JL,{microservices:f.microservices,onRaw:i,apiBaseUrl:ku.apiBaseUrl});if(u==="apps"&&l==="findjob")return _(nN,{microservices:f.microservices,onRaw:i,apiBaseUrl:ku.apiBaseUrl});if(u==="apps"&&l==="pipeline")return _(yL,{microservices:f.microservices,onRaw:i,apiBaseUrl:ku.apiBaseUrl});if(u==="apps"&&l==="met-nonlinear")return _(_N,{microservices:f.microservices,onRaw:i,apiBaseUrl:ku.apiBaseUrl});if(u==="apps"&&l==="claudeqq")return _(mJ,{microservices:f.microservices,onRaw:i,apiBaseUrl:ku.apiBaseUrl});if(u==="apps"&&l==="baidu-netdisk")return _(ZJ,{microservices:f.microservices,onRaw:i,apiBaseUrl:ku.apiBaseUrl});if(u==="apps"&&l==="filebrowser")return _(rN,{microservices:f.microservices,onRaw:i,apiBaseUrl:ku.apiBaseUrl});if(u==="apps"&&l==="oa-event-flow")return _(WN,{microservices:f.microservices,onRaw:i,apiBaseUrl:ku.apiBaseUrl});if(u==="apps"&&l==="k3sctl")return _(LL,{microservices:f.microservices,onRaw:i,apiBaseUrl:ku.apiBaseUrl,onNavigate:t});if(u==="apps"&&l==="code-queue")return _(oQ,{microservices:f.microservices,onRaw:i,apiBaseUrl:ku.apiBaseUrl,initialTasksData:ZX});if(u==="apps"&&l==="mdtodo")return _(FN,{microservices:f.microservices,onRaw:i,apiBaseUrl:ku.apiBaseUrl});if(u==="apps"&&l==="project-manager")return _($L,{microservices:f.microservices,onRaw:i,apiBaseUrl:ku.apiBaseUrl});if(u==="config"&&l==="topology")return _(EY,{data:f});if(u==="config"&&l==="auth")return _(OY,{session:r});if(u==="config"&&l==="security")return _(ZY);return _(Ul,{title:"未找到页面",text:"请选择左侧主模块和顶部子功能标签"})}function BY({session:u,onLogout:l}){let f=G2(Sr,window.location.pathname),[r,n]=bu(f.moduleId),[i,t]=bu({...fc,[f.moduleId]:f.tabId}),[y,c]=bu({overview:null,nodes:[],systemStatuses:[],dockerStatuses:[],microservices:[],events:[],tasks:[],pendingTasks:[],schedules:[],scheduleRuns:[],logs:[]}),[$,A]=bu({ok:!1,text:"连接中"}),[j,F]=bu(null),[J,Q]=bu(new Date),[W,L]=bu(null),[U,q]=bu(!1),[N,w]=bu(!1),G=li.default.useRef(!1),Z=Sr.moduleById[r]||Sr.modules[0],H=i[r]||fc[r]||Z.tabs[0].id,E=Array.isArray(y.microservices)?y.microservices:[],V=E.length===0&&r==="apps"&&H==="code-queue"?[HX]:E,S=V===E?y:{...y,microservices:V},B=r==="apps"?V.find((d)=>String(d?.id||"")===(H==="k3sctl"?"k3sctl-adapter":H)):null,D=B?kL(B):{},X=Z.tabs.find((d)=>d.id===H)?.label||H,O=B?[{key:"microservice",label:"用户服务",value:`${X} ${D.providerStatus==="online"?"在线":D.providerStatus||"未知"}`,tone:D.providerStatus==="online"?"ok":"warn",testId:"active-microservice-status"}]:[];async function Y(){if(G.current)return;G.current=!0,w(!0);try{let d=[],g=(Fu,zu)=>{d.push([Fu,Eu(zu)])},x=r==="ops"&&H==="status",lu=x||r==="config"&&H==="topology",cu=x||r==="nodes"||r==="tasks"&&(H==="dispatch"||H==="scheduled"),_u=r==="apps"&&H!=="code-queue";if(lu)g("overview",`${ku.apiBaseUrl}/overview`);if(cu)g("nodes",`${ku.apiBaseUrl}/nodes`);if(r==="nodes"&&H==="monitor")g("systemStatuses",`${ku.apiBaseUrl}/nodes/system-status?limit=60`),g("tasks",`${ku.apiBaseUrl}/tasks?limit=120&summary=1`);else if(r==="nodes"&&H==="docker")g("dockerStatuses",`${ku.apiBaseUrl}/nodes/docker-status`);else if(r==="nodes"&&H==="gateway")g("tasks",`${ku.apiBaseUrl}/tasks?limit=300&summary=1`);else if(r==="tasks"&&H==="scheduled")g("schedules",`${ku.apiBaseUrl}/schedules?limit=100`),g("scheduleRuns",`${ku.apiBaseUrl}/schedules/runs?limit=100`);else if(r==="tasks"&&H==="pending")g("pendingTasks",`${ku.apiBaseUrl}/tasks?status=pending&limit=100&summary=1`);else if(r==="tasks"&&(H==="history"||H==="results"))g("tasks",`${ku.apiBaseUrl}/tasks?limit=300&summary=1`);else if(x)g("tasks",`${ku.apiBaseUrl}/tasks?limit=8&lite=1`),g("pendingTasks",`${ku.apiBaseUrl}/tasks?status=pending&limit=20&lite=1`);if(_u)g("microservices",`${ku.apiBaseUrl}/microservices`);if(r==="ops"&&H==="events")g("events",`${ku.apiBaseUrl}/events?limit=100`);if(r==="ops"&&H==="logs")g("logs","/logs?limit=100");await Promise.all(d.map(async([Fu,zu])=>{let Wu=await zu,C={};if(Fu==="overview")C.overview=Wu;if(Fu==="nodes")C.nodes=Wu.nodes||[];if(Fu==="systemStatuses")C.systemStatuses=Wu.systemStatuses||[];if(Fu==="dockerStatuses")C.dockerStatuses=Wu.dockerStatuses||[];if(Fu==="microservices")C.microservices=Wu.microservices||[];if(Fu==="events")C.events=Wu.events||[];if(Fu==="tasks")C.tasks=Wu.tasks||[];if(Fu==="pendingTasks")C.pendingTasks=Wu.tasks||[];if(Fu==="schedules")C.schedules=Wu.schedules||[];if(Fu==="scheduleRuns")C.scheduleRuns=Wu.runs||[];if(Fu==="logs")C.logs=Wu.logs||[];c((e)=>({...e,...C}))})),A({ok:!0,text:"核心在线"}),F(new Date)}catch(d){if(A({ok:!1,text:Ou(d,"连接失败")}),d.status===401)l(!1)}finally{G.current=!1,w(!1)}}Tn(()=>{let d=()=>{if(!GL())return;Y()};d();let g=setInterval(d,BX(r,H)),x=()=>{if(GL())d()};return document.addEventListener("visibilitychange",x),()=>{clearInterval(g),document.removeEventListener("visibilitychange",x)}},[r,H]),Tn(()=>{let d=setInterval(()=>Q(new Date),1000);return()=>clearInterval(d)},[]),Tn(()=>{let d=NN(Sr,window.location.pathname);if(d&&window.location.pathname!==d)window.history.replaceState(null,"",d)},[]),Tn(()=>{let d=()=>{let g=G2(Sr,window.location.pathname);n(g.moduleId),t((x)=>({...x,[g.moduleId]:g.tabId})),L(null)};return window.addEventListener("popstate",d),()=>window.removeEventListener("popstate",d)},[]),Tn(()=>{window.scrollTo({top:0,left:0,behavior:"auto"})},[r,H]);function p(d,g,x="push"){let lu=Sr.moduleById[d]?d:Sr.fallbackTarget.moduleId,cu=Sr.moduleById[lu]?.tabs.some((Fu)=>Fu.id===g)?g:fc[lu]||Sr.moduleById[lu]?.tabs[0]?.id||Sr.fallbackTarget.tabId;n(lu),t((Fu)=>({...Fu,[lu]:cu}));let _u=U3(Sr,lu,cu);if(window.location.pathname!==_u){let Fu=x==="replace"?"replaceState":"pushState";window.history[Fu](null,"",_u)}}function v(d,g){L({title:d,data:g})}let[z,P]=bu(!1),{unreadCount:k,notifications:I}=pf(),b=I.length>0?I[I.length-1]:null;return _("div",{className:`shell ${U?"rail-collapsed":""}`,"data-testid":"app-shell"},_(bX,{activeModule:r,activeTabs:i,onNavigate:p,collapsed:U,onToggle:()=>q((d)=>!d)}),_("main",{className:"workspace"},_(hX,{connection:$,lastRefresh:j,onRefresh:Y,onLogout:()=>l(!0),session:u,clock:J,activeStatusItems:O,onNotificationToggle:()=>P((d)=>!d),unreadCount:k}),_(vX,{module:Z,activeTab:H,onNavigate:p}),_(Q7.Provider,{value:N},_(HY,{activeModule:r,activeTab:H,data:S,session:u,refresh:Y,onRaw:v,onNavigate:p}))),_(MX,{raw:W,onClose:()=>L(null)}),b&&_(KL,{key:b.id,notification:b}),z&&_(TL,{onClose:()=>P(!1)}))}function mY(){let[u,l]=bu(!0),[f,r]=bu(null);async function n(){l(!0);try{let t=await Eu("/api/session");r(t.authenticated?t:null)}catch{r(null)}finally{l(!1)}}async function i(t){if(t)try{await Eu("/logout",{method:"POST"})}catch{}r(null)}if(Tn(()=>{n()},[]),u)return _("main",{className:"loading-screen"},_("div",{className:"brand-mark"},"UD"),_("span",null,"加载会话"));if(!f)return _(RX,{onLogin:r});return _(OJ,null,_(BY,{session:f,onLogout:i}))}var dL=document.getElementById("root");if(dL===null)throw Error("root element not found");pL.createRoot(dL).render(_(mY));})(); diff --git a/src/components/frontend/src/k3sctl.tsx b/src/components/frontend/src/k3sctl.tsx index b30f441f..77481335 100644 --- a/src/components/frontend/src/k3sctl.tsx +++ b/src/components/frontend/src/k3sctl.tsx @@ -161,7 +161,7 @@ export function K3sCtlPage({ microservices, onRaw, apiBaseUrl, onNavigate }: Any return h("div", { className: "k3s-page", "data-testid": "k3sctl-page" }, h(Panel, { - title: "K3S Control Plane", + title: "k3s Control Plane", eyebrow: "Managed by k3sctl-adapter", className: "k3s-hero-panel", loading: state.loading, diff --git a/src/components/frontend/src/navigation.ts b/src/components/frontend/src/navigation.ts index f40af859..bbc4bb5d 100644 --- a/src/components/frontend/src/navigation.ts +++ b/src/components/frontend/src/navigation.ts @@ -70,7 +70,7 @@ export const MODULES: UniDeskModuleDefinition[] = [ { 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: "k3sctl", label: "k3s Control" }, { id: "code-queue", label: "Code Queue" }, { id: "mdtodo", label: "MDTODO" }, { id: "project-manager", label: "Project Manager" },