(()=>{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||!(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++,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,` `).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(` `)&&!f.startsWith(` `))l+=` `;l+=f}return l}function PJ(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(` # 本次任务 `);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=` :root { --surfacePrimary: #ffffff; --surfaceSecondary: #f8fafc; --background: #f8fafc; --divider: #e5e7eb; --borderPrimary: #dbe3ee; --textPrimary: #17212f; --textSecondary: #64748b; --iconSecondary: #ffffff; --blue: #2283e8; } * { box-sizing: border-box !important; } html, body { font-size: 13px !important; } body { margin: 0 !important; background: var(--surfacePrimary) !important; color: var(--textPrimary) !important; font-family: Arial, sans-serif !important; } button, input { font: inherit !important; } header { height: 42px !important; min-height: 42px !important; padding: 4px 8px !important; } header title { font-size: 14px !important; padding: 0 8px !important; } header img { height: 28px !important; } header .action { min-width: 30px !important; height: 30px !important; padding: 4px 6px !important; } header .search { max-width: 360px !important; height: 32px !important; } nav { top: 42px !important; width: 12rem !important; } nav .action { min-height: 34px !important; padding: 5px 8px !important; font-size: 13px !important; } nav .action i { margin-right: 6px !important; } nav > div { padding: 3px 0 !important; } main { width: calc(100% - 12rem) !important; margin-left: 12rem !important; } main > div { padding-top: 42px !important; } .material-icons { width: 22px !important; min-width: 22px !important; max-width: 22px !important; height: 22px !important; font-family: Arial, sans-serif !important; font-size: 0 !important; line-height: 22px !important; overflow: hidden !important; text-align: center !important; text-transform: none !important; } .material-icons::before { content: "." !important; display: inline-block !important; font-family: Arial, sans-serif !important; font-size: 11px !important; font-weight: 700 !important; line-height: 22px !important; } header .material-icons::before, nav .material-icons::before { content: "op" !important; font-size: 10px !important; } #listing { min-height: 0 !important; } #listing h2 { margin: 4px 8px !important; font-size: 11px !important; } #listing > div { display: block !important; } #listing.mosaic, #listing.list { width: 100% !important; margin: 0 !important; padding-top: 4px !important; } #listing.mosaic .header, #listing.list .header { display: flex !important; min-height: 26px !important; background: var(--background) !important; } #listing.mosaic .item, #listing.list .item { width: calc(100% - 8px) !important; min-height: 30px !important; margin: 0 4px !important; padding: 3px 8px !important; border-radius: 0 !important; border-bottom: 1px solid var(--divider) !important; box-shadow: none !important; } #listing.mosaic .item div:first-of-type, #listing.list .item div:first-of-type { width: 30px !important; min-width: 30px !important; height: 24px !important; } #listing .item i { margin-right: 4px !important; } #listing .item i::before { content: "file" !important; color: inherit !important; font-size: 10px !important; } #listing .item[data-dir="true"] i::before { content: "dir" !important; } #listing.mosaic .item div:last-of-type, #listing.list .item div:last-of-type { width: calc(100% - 34px) !important; display: grid !important; grid-template-columns: minmax(180px, 1fr) 90px 140px !important; gap: 8px !important; align-items: center !important; } #listing .item .name { min-width: 0 !important; font-size: 13px !important; font-weight: 600 !important; overflow: hidden !important; text-overflow: ellipsis !important; white-space: nowrap !important; } #listing .item .size, #listing .item .modified { min-width: 0 !important; color: var(--textSecondary) !important; font-size: 11px !important; overflow: hidden !important; text-overflow: ellipsis !important; white-space: nowrap !important; } #multiple-selection { height: 36px !important; min-height: 36px !important; padding: 4px 8px !important; } @media (max-width: 780px) { nav { width: 9rem !important; } main { width: calc(100% - 9rem) !important; margin-left: 9rem !important; } #listing.mosaic .item div:last-of-type, #listing.list .item div:last-of-type { grid-template-columns: minmax(120px, 1fr) 80px !important; } #listing .item .modified { 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:"v3sctl",label:"V3S 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("+",` `).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(` `);return` ${z} ${of(L.id||w.id)} ${of(L.kind||"node")} ${of(L.componentRef||"--")} ${of(U)} `}).join(` `);return{svg:` ${j} ${of(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))))} `}).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} `})].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` ${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} ${of(u.title||"Pipeline Epoch Gantt")} ${of(Z)} ${V} ${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/v3sctl-adapter/proxy${l}`}function up(u){return u.find((l)=>String(l?.id||"")==="v3sctl-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:"v3s-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:"v3s-instance-role"},Qu("span",null,String(u?.role||"worker").toUpperCase()),Qu("code",null,u?.id||"--")),Qu("dl",{className:"v3s-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"} / v3s managed service`,className:"v3s-service-panel",actions:Qu(lL,{title:`v3s service ${u?.id||""}`,data:u,onOpen:l,testId:`raw-v3s-service-${u?.id||"unknown"}`})},Qu("div",{className:"v3s-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:"暂无 v3s 实例",text:"adapter 没有返回该服务的 endpoint 列表"}):Qu("div",{className:"v3s-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,"加载 v3s 控制平面失败")}))}}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:"v3sctl-adapter 未登记",text:"请在 config.json 的 microservices 中登记 id=v3sctl-adapter,并通过该微服务连接 v3s 控制平面。"});return Qu("div",{className:"v3s-page","data-testid":"v3sctl-page"},Qu(d9,{title:"V3S Control Plane",eyebrow:"Managed by v3sctl-adapter",className:"v3s-hero-panel",loading:y.loading,actions:Qu(M_.default.Fragment,null,Qu("button",{type:"button",className:"ghost-btn",onClick:_,disabled:y.loading,"data-testid":"v3s-refresh-button"},y.loading?"刷新中":"刷新"),r?Qu("button",{type:"button",className:"ghost-btn",onClick:()=>r("apps","code-queue"),"data-testid":"v3s-open-code-queue"},"打开 Code Queue"):null,Qu(lL,{title:"v3sctl-adapter microservice",data:n,onOpen:l,testId:"raw-v3s-adapter"}))},Qu("div",{className:"v3s-hero"},Qu("div",{className:"v3s-orb","aria-hidden":"true"},Qu("span",null,"v3s")),Qu("div",{className:"v3s-hero-copy"},Qu("p",{className:"eyebrow"},"D601 control plane / D518 managed node"),Qu("h2",null,"UniDesk 只管理 adapter;业务微服务交给 v3s 标准服务路由"),Qu("p",{className:"muted paragraph"},"Code Queue 的前端/API 请求进入 v3sctl-adapter,再由 adapter 转发到 v3s active service。provider-gateway 只用于维护 adapter 和节点诊断,不再直接管理 Code Queue 容器。"),Qu("div",{className:"v3s-route-strip"},Qu("span",null,"NO FALLBACK"),Qu("code",null,y.data?.runtimePath||"frontend -> backend-core -> v3sctl-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 v3s nodes"}),Qu(X6,{label:"实例",value:`${J}/${F}`,hint:`active ${Q}`,tone:J===F&&F>0?"ok":"warn"})),Qu("div",{className:"v3s-control-plane-grid"},Qu("article",{className:"v3s-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:"v3s-control-plane-card"},Qu("span",null,"manifests"),Qu("strong",null,U.length||"--"),Qu("p",null,U.join(" / ")||"未配置 manifest")),Qu("article",{className:"v3s-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:"v3s services",loading:y.loading},Qu(e9,{title:"暂无 v3s 服务",text:"等待 v3sctl-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:"v3s:code-queue"},backend:{nodeBaseUrl:"v3s://code-queue",nodeBindHost:"v3s://unidesk/code-queue",nodePort:4222,proxyMode:"v3sctl-adapter-http",public:!1},deployment:{mode:"v3sctl-managed",adapterServiceId:"v3sctl-adapter",v3sServiceId:"code-queue"},runtime:{orchestrator:"v3sctl",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==="v3sctl-adapter"?$("button",{type:"button",className:"ghost-btn",onClick:()=>f("apps","v3sctl"),"data-testid":"open-v3sctl-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==="v3sctl")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==="v3sctl"?"v3sctl-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));})();