From d77a0e129a5308157e83c4e077d8e7ac58188c5e Mon Sep 17 00:00:00 2001 From: Codex Date: Sat, 16 May 2026 16:07:39 +0000 Subject: [PATCH] Add Code Queue workdir presets --- src/components/frontend/public/app.js | 115 ++++++----- src/components/frontend/public/style.css | 22 ++ src/components/frontend/src/code-queue.tsx | 110 +++++++++- .../microservices/code-queue/src/index.ts | 193 ++++++++++++++++++ .../microservices/code-queue/src/types.ts | 8 + 5 files changed, 391 insertions(+), 57 deletions(-) diff --git a/src/components/frontend/public/app.js b/src/components/frontend/public/app.js index 6aa11c40..0c1a7dbe 100644 --- a/src/components/frontend/public/app.js +++ b/src/components/frontend/public/app.js @@ -1,41 +1,44 @@ -(()=>{var hT=Object.create;var{getPrototypeOf:xT,defineProperty:M7,getOwnPropertyNames:bT}=Object;var vT=Object.prototype.hasOwnProperty;function kT(u){return this[u]}var IT,gT,Cu=(u,l,f)=>{var r=u!=null&&typeof u==="object";if(r){var n=l?IT??=new WeakMap:gT??=new WeakMap,i=n.get(u);if(i)return i}f=u!=null?hT(xT(u)):{};let t=l||!u||!u.__esModule?M7(f,"default",{value:u,enumerable:!0}):f;for(let y of bT(u))if(!vT.call(t,y))M7(t,y,{get:kT.bind(u,y),enumerable:!0});if(r)n.set(u,t);return t};var yr=(u,l)=>()=>(l||u((l={exports:{}}).exports,l),l.exports);var fl=((u)=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(u,{get:(l,f)=>(typeof require<"u"?require:l)[f]}):u)(function(u){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+u+'" is not supported')});var d7=yr((du)=>{var Cy=Symbol.for("react.element"),sT=Symbol.for("react.portal"),aT=Symbol.for("react.fragment"),oT=Symbol.for("react.strict_mode"),dT=Symbol.for("react.profiler"),eT=Symbol.for("react.provider"),uK=Symbol.for("react.context"),lK=Symbol.for("react.forward_ref"),fK=Symbol.for("react.suspense"),rK=Symbol.for("react.memo"),nK=Symbol.for("react.lazy"),R7=Symbol.iterator;function iK(u){if(u===null||typeof u!=="object")return null;return u=R7&&u[R7]||u["@@iterator"],typeof u==="function"?u:null}var b7={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},v7=Object.assign,k7={};function $t(u,l,f){this.props=u,this.context=l,this.refs=k7,this.updater=f||b7}$t.prototype.isReactComponent={};$t.prototype.setState=function(u,l){if(typeof u!=="object"&&typeof u!=="function"&&u!=null)throw Error("setState(...): takes an object of state variables to update or a function which returns an object of state variables.");this.updater.enqueueSetState(this,u,l,"setState")};$t.prototype.forceUpdate=function(u){this.updater.enqueueForceUpdate(this,u,"forceUpdate")};function I7(){}I7.prototype=$t.prototype;function y6(u,l,f){this.props=u,this.context=l,this.refs=k7,this.updater=f||b7}var c6=y6.prototype=new I7;c6.constructor=y6;v7(c6,$t.prototype);c6.isPureReactComponent=!0;var h7=Array.isArray,g7=Object.prototype.hasOwnProperty,_6={current:null},s7={key:!0,ref:!0,__self:!0,__source:!0};function a7(u,l,f){var r,n={},i=null,t=null;if(l!=null)for(r in l.ref!==void 0&&(t=l.ref),l.key!==void 0&&(i=""+l.key),l)g7.call(l,r)&&!s7.hasOwnProperty(r)&&(n[r]=l[r]);var y=arguments.length-2;if(y===1)n.children=f;else if(1{e7.exports=d7()});var _j=yr((ql)=>{function U6(u,l){var f=u.length;u.push(l);u:for(;0>>1,n=u[r];if(0>>1;rJ_(y,f))cJ_($,y)?(u[r]=$,u[c]=f,r=c):(u[r]=y,u[t]=f,r=t);else if(cJ_($,f))u[r]=$,u[c]=f,r=c;else break u}}return l}function J_(u,l){var f=u.sortIndex-l.sortIndex;return f!==0?f:u.id-l.id}if(typeof performance==="object"&&typeof performance.now==="function")J6=performance,ql.unstable_now=function(){return J6.now()};else Q_=Date,Q6=Q_.now(),ql.unstable_now=function(){return Q_.now()-Q6};var J6,Q_,Q6,tn=[],i0=[],FK=1,Kr=null,qf=3,W_=!1,$i=!1,Ry=!1,nj=typeof setTimeout==="function"?setTimeout:null,ij=typeof clearTimeout==="function"?clearTimeout:null,rj=typeof setImmediate<"u"?setImmediate:null;typeof navigator<"u"&&navigator.scheduling!==void 0&&navigator.scheduling.isInputPending!==void 0&&navigator.scheduling.isInputPending.bind(navigator.scheduling);function N6(u){for(var l=Mr(i0);l!==null;){if(l.callback===null)w_(i0);else if(l.startTime<=u)w_(i0),l.sortIndex=l.expirationTime,U6(tn,l);else break;l=Mr(i0)}}function w6(u){if(Ry=!1,N6(u),!$i)if(Mr(tn)!==null)$i=!0,L6(W6);else{var l=Mr(i0);l!==null&&T6(w6,l.startTime-u)}}function W6(u,l){$i=!1,Ry&&(Ry=!1,ij(hy),hy=-1),W_=!0;var f=qf;try{N6(l);for(Kr=Mr(tn);Kr!==null&&(!(Kr.expirationTime>l)||u&&!cj());){var r=Kr.callback;if(typeof r==="function"){Kr.callback=null,qf=Kr.priorityLevel;var n=r(Kr.expirationTime<=l);l=ql.unstable_now(),typeof n==="function"?Kr.callback=n:Kr===Mr(tn)&&w_(tn),N6(l)}else w_(tn);Kr=Mr(tn)}if(Kr!==null)var i=!0;else{var t=Mr(i0);t!==null&&T6(w6,t.startTime-l),i=!1}return i}finally{Kr=null,qf=f,W_=!1}}var L_=!1,N_=null,hy=-1,tj=5,yj=-1;function cj(){return ql.unstable_now()-yju||125r?(u.sortIndex=f,U6(i0,u),Mr(tn)===null&&u===Mr(i0)&&(Ry?(ij(hy),hy=-1):Ry=!0,T6(w6,f-r))):(u.sortIndex=n,U6(tn,u),$i||W_||($i=!0,L6(W6))),u};ql.unstable_shouldYield=cj;ql.unstable_wrapCallback=function(u){var l=qf;return function(){var f=qf;qf=l;try{return u.apply(this,arguments)}finally{qf=f}}}});var Aj=yr((PY,$j)=>{$j.exports=_j()});var FJ=yr((Fr)=>{var UK=Fl(),Ar=Aj();function Ju(u){for(var l="https://reactjs.org/docs/error-decoder.html?invariant="+u,f=1;f"u"||typeof window.document>"u"||typeof window.document.createElement>"u"),b6=Object.prototype.hasOwnProperty,JK=/^[:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD][:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD\-.0-9\u00B7\u0300-\u036F\u203F-\u2040]*$/,jj={},Fj={};function QK(u){if(b6.call(Fj,u))return!0;if(b6.call(jj,u))return!1;if(JK.test(u))return Fj[u]=!0;return jj[u]=!0,!1}function NK(u,l,f,r){if(f!==null&&f.type===0)return!1;switch(typeof l){case"function":case"symbol":return!0;case"boolean":if(r)return!1;if(f!==null)return!f.acceptsBooleans;return u=u.toLowerCase().slice(0,5),u!=="data-"&&u!=="aria-";default:return!1}}function qK(u,l,f,r){if(l===null||typeof l>"u"||NK(u,l,f,r))return!0;if(r)return!1;if(f!==null)switch(f.type){case 3:return!l;case 4:return l===!1;case 5:return isNaN(l);case 6:return isNaN(l)||1>l}return!1}function Df(u,l,f,r,n,i,t){this.acceptsBooleans=l===2||l===3||l===4,this.attributeName=r,this.attributeNamespace=n,this.mustUseProperty=f,this.propertyName=u,this.type=l,this.sanitizeURL=i,this.removeEmptyString=t}var Ff={};"children dangerouslySetInnerHTML defaultValue defaultChecked innerHTML suppressContentEditableWarning suppressHydrationWarning style".split(" ").forEach(function(u){Ff[u]=new Df(u,0,!1,u,null,!1,!1)});[["acceptCharset","accept-charset"],["className","class"],["htmlFor","for"],["httpEquiv","http-equiv"]].forEach(function(u){var l=u[0];Ff[l]=new Df(l,1,!1,u[1],null,!1,!1)});["contentEditable","draggable","spellCheck","value"].forEach(function(u){Ff[u]=new Df(u,2,!1,u.toLowerCase(),null,!1,!1)});["autoReverse","externalResourcesRequired","focusable","preserveAlpha"].forEach(function(u){Ff[u]=new Df(u,2,!1,u,null,!1,!1)});"allowFullScreen async autoFocus autoPlay controls default defer disabled disablePictureInPicture disableRemotePlayback formNoValidate hidden loop noModule noValidate open playsInline readOnly required reversed scoped seamless itemScope".split(" ").forEach(function(u){Ff[u]=new Df(u,3,!1,u.toLowerCase(),null,!1,!1)});["checked","multiple","muted","selected"].forEach(function(u){Ff[u]=new Df(u,3,!0,u,null,!1,!1)});["capture","download"].forEach(function(u){Ff[u]=new Df(u,4,!1,u,null,!1,!1)});["cols","rows","size","span"].forEach(function(u){Ff[u]=new Df(u,6,!1,u,null,!1,!1)});["rowSpan","start"].forEach(function(u){Ff[u]=new Df(u,5,!1,u.toLowerCase(),null,!1,!1)});var P8=/[\-:]([a-z])/g;function C8(u){return u[1].toUpperCase()}"accent-height alignment-baseline arabic-form baseline-shift cap-height clip-path clip-rule color-interpolation color-interpolation-filters color-profile color-rendering dominant-baseline enable-background fill-opacity fill-rule flood-color flood-opacity font-family font-size font-size-adjust font-stretch font-style font-variant font-weight glyph-name glyph-orientation-horizontal glyph-orientation-vertical horiz-adv-x horiz-origin-x image-rendering letter-spacing lighting-color marker-end marker-mid marker-start overline-position overline-thickness paint-order panose-1 pointer-events rendering-intent shape-rendering stop-color stop-opacity strikethrough-position strikethrough-thickness stroke-dasharray stroke-dashoffset stroke-linecap stroke-linejoin stroke-miterlimit stroke-opacity stroke-width text-anchor text-decoration text-rendering underline-position underline-thickness unicode-bidi unicode-range units-per-em v-alphabetic v-hanging v-ideographic v-mathematical vector-effect vert-adv-y vert-origin-x vert-origin-y word-spacing writing-mode xmlns:xlink x-height".split(" ").forEach(function(u){var l=u.replace(P8,C8);Ff[l]=new Df(l,1,!1,u,null,!1,!1)});"xlink:actuate xlink:arcrole xlink:role xlink:show xlink:title xlink:type".split(" ").forEach(function(u){var l=u.replace(P8,C8);Ff[l]=new Df(l,1,!1,u,"http://www.w3.org/1999/xlink",!1,!1)});["xml:base","xml:lang","xml:space"].forEach(function(u){var l=u.replace(P8,C8);Ff[l]=new Df(l,1,!1,u,"http://www.w3.org/XML/1998/namespace",!1,!1)});["tabIndex","crossOrigin"].forEach(function(u){Ff[u]=new Df(u,1,!1,u.toLowerCase(),null,!1,!1)});Ff.xlinkHref=new Df("xlinkHref",1,!1,"xlink:href","http://www.w3.org/1999/xlink",!0,!1);["src","href","action","formAction"].forEach(function(u){Ff[u]=new Df(u,1,!1,u.toLowerCase(),null,!0,!0)});function M8(u,l,f,r){var n=Ff.hasOwnProperty(l)?Ff[l]:null;if(n!==null?n.type!==0:r||!(2{var eT=Object.create;var{getPrototypeOf:uK,defineProperty:s7,getOwnPropertyNames:lK}=Object;var fK=Object.prototype.hasOwnProperty;function rK(u){return this[u]}var nK,iK,Cu=(u,l,f)=>{var r=u!=null&&typeof u==="object";if(r){var n=l?nK??=new WeakMap:iK??=new WeakMap,i=n.get(u);if(i)return i}f=u!=null?eT(uK(u)):{};let t=l||!u||!u.__esModule?s7(f,"default",{value:u,enumerable:!0}):f;for(let y of lK(u))if(!fK.call(t,y))s7(t,y,{get:rK.bind(u,y),enumerable:!0});if(r)n.set(u,t);return t};var tr=(u,l)=>()=>(l||u((l={exports:{}}).exports,l),l.exports);var fl=((u)=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(u,{get:(l,f)=>(typeof require<"u"?require:l)[f]}):u)(function(u){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+u+'" is not supported')});var yj=tr((du)=>{var xy=Symbol.for("react.element"),tK=Symbol.for("react.portal"),yK=Symbol.for("react.fragment"),cK=Symbol.for("react.strict_mode"),_K=Symbol.for("react.profiler"),$K=Symbol.for("react.provider"),AK=Symbol.for("react.context"),jK=Symbol.for("react.forward_ref"),FK=Symbol.for("react.suspense"),UK=Symbol.for("react.memo"),JK=Symbol.for("react.lazy"),a7=Symbol.iterator;function QK(u){if(u===null||typeof u!=="object")return null;return u=a7&&u[a7]||u["@@iterator"],typeof u==="function"?u:null}var e7={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},uj=Object.assign,lj={};function jt(u,l,f){this.props=u,this.context=l,this.refs=lj,this.updater=f||e7}jt.prototype.isReactComponent={};jt.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")};jt.prototype.forceUpdate=function(u){this.updater.enqueueForceUpdate(this,u,"forceUpdate")};function fj(){}fj.prototype=jt.prototype;function U6(u,l,f){this.props=u,this.context=l,this.refs=lj,this.updater=f||e7}var J6=U6.prototype=new fj;J6.constructor=U6;uj(J6,jt.prototype);J6.isPureReactComponent=!0;var o7=Array.isArray,rj=Object.prototype.hasOwnProperty,Q6={current:null},nj={key:!0,ref:!0,__self:!0,__source:!0};function ij(u,l,f){var r,n={},i=null,t=null;if(l!=null)for(r in l.ref!==void 0&&(t=l.ref),l.key!==void 0&&(i=""+l.key),l)rj.call(l,r)&&!nj.hasOwnProperty(r)&&(n[r]=l[r]);var y=arguments.length-2;if(y===1)n.children=f;else if(1{cj.exports=yj()});var qj=tr((wl)=>{function L6(u,l){var f=u.length;u.push(l);u:for(;0>>1,n=u[r];if(0>>1;rL_(y,f))cL_($,y)?(u[r]=$,u[c]=f,r=c):(u[r]=y,u[t]=f,r=t);else if(cL_($,f))u[r]=$,u[c]=f,r=c;else break u}}return l}function L_(u,l){var f=u.sortIndex-l.sortIndex;return f!==0?f:u.id-l.id}if(typeof performance==="object"&&typeof performance.now==="function")T6=performance,wl.unstable_now=function(){return T6.now()};else T_=Date,K6=T_.now(),wl.unstable_now=function(){return T_.now()-K6};var T6,T_,K6,tn=[],i0=[],GK=1,Tr=null,wf=3,E_=!1,Ai=!1,by=!1,Fj=typeof setTimeout==="function"?setTimeout:null,Uj=typeof clearTimeout==="function"?clearTimeout:null,jj=typeof setImmediate<"u"?setImmediate:null;typeof navigator<"u"&&navigator.scheduling!==void 0&&navigator.scheduling.isInputPending!==void 0&&navigator.scheduling.isInputPending.bind(navigator.scheduling);function G6(u){for(var l=Mr(i0);l!==null;){if(l.callback===null)z_(i0);else if(l.startTime<=u)z_(i0),l.sortIndex=l.expirationTime,L6(tn,l);else break;l=Mr(i0)}}function E6(u){if(by=!1,G6(u),!Ai)if(Mr(tn)!==null)Ai=!0,Z6(O6);else{var l=Mr(i0);l!==null&&H6(E6,l.startTime-u)}}function O6(u,l){Ai=!1,by&&(by=!1,Uj(vy),vy=-1),E_=!0;var f=wf;try{G6(l);for(Tr=Mr(tn);Tr!==null&&(!(Tr.expirationTime>l)||u&&!Nj());){var r=Tr.callback;if(typeof r==="function"){Tr.callback=null,wf=Tr.priorityLevel;var n=r(Tr.expirationTime<=l);l=wl.unstable_now(),typeof n==="function"?Tr.callback=n:Tr===Mr(tn)&&z_(tn),G6(l)}else z_(tn);Tr=Mr(tn)}if(Tr!==null)var i=!0;else{var t=Mr(i0);t!==null&&H6(E6,t.startTime-l),i=!1}return i}finally{Tr=null,wf=f,E_=!1}}var O_=!1,K_=null,vy=-1,Jj=5,Qj=-1;function Nj(){return wl.unstable_now()-Qju||125r?(u.sortIndex=f,L6(i0,u),Mr(tn)===null&&u===Mr(i0)&&(by?(Uj(vy),vy=-1):by=!0,H6(E6,f-r))):(u.sortIndex=n,L6(tn,u),Ai||E_||(Ai=!0,Z6(O6))),u};wl.unstable_shouldYield=Nj;wl.unstable_wrapCallback=function(u){var l=wf;return function(){var f=wf;wf=l;try{return u.apply(this,arguments)}finally{wf=f}}}});var Wj=tr((lP,wj)=>{wj.exports=qj()});var TJ=tr((jr)=>{var zK=Jl(),$r=Wj();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"),o6=Object.prototype.hasOwnProperty,EK=/^[: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]*$/,Lj={},Tj={};function OK(u){if(o6.call(Tj,u))return!0;if(o6.call(Lj,u))return!1;if(EK.test(u))return Tj[u]=!0;return Lj[u]=!0,!1}function ZK(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 HK(u,l,f,r){if(l===null||typeof l>"u"||ZK(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 Sf(u,l,f,r,n,i,t){this.acceptsBooleans=l===2||l===3||l===4,this.attributeName=r,this.attributeNamespace=n,this.mustUseProperty=f,this.propertyName=u,this.type=l,this.sanitizeURL=i,this.removeEmptyString=t}var Uf={};"children dangerouslySetInnerHTML defaultValue defaultChecked innerHTML suppressContentEditableWarning suppressHydrationWarning style".split(" ").forEach(function(u){Uf[u]=new Sf(u,0,!1,u,null,!1,!1)});[["acceptCharset","accept-charset"],["className","class"],["htmlFor","for"],["httpEquiv","http-equiv"]].forEach(function(u){var l=u[0];Uf[l]=new Sf(l,1,!1,u[1],null,!1,!1)});["contentEditable","draggable","spellCheck","value"].forEach(function(u){Uf[u]=new Sf(u,2,!1,u.toLowerCase(),null,!1,!1)});["autoReverse","externalResourcesRequired","focusable","preserveAlpha"].forEach(function(u){Uf[u]=new Sf(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){Uf[u]=new Sf(u,3,!1,u.toLowerCase(),null,!1,!1)});["checked","multiple","muted","selected"].forEach(function(u){Uf[u]=new Sf(u,3,!0,u,null,!1,!1)});["capture","download"].forEach(function(u){Uf[u]=new Sf(u,4,!1,u,null,!1,!1)});["cols","rows","size","span"].forEach(function(u){Uf[u]=new Sf(u,6,!1,u,null,!1,!1)});["rowSpan","start"].forEach(function(u){Uf[u]=new Sf(u,5,!1,u.toLowerCase(),null,!1,!1)});var v8=/[\-:]([a-z])/g;function k8(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(v8,k8);Uf[l]=new Sf(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(v8,k8);Uf[l]=new Sf(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(v8,k8);Uf[l]=new Sf(l,1,!1,u,"http://www.w3.org/XML/1998/namespace",!1,!1)});["tabIndex","crossOrigin"].forEach(function(u){Uf[u]=new Sf(u,1,!1,u.toLowerCase(),null,!1,!1)});Uf.xlinkHref=new Sf("xlinkHref",1,!1,"xlink:href","http://www.w3.org/1999/xlink",!0,!1);["src","href","action","formAction"].forEach(function(u){Uf[u]=new Sf(u,1,!1,u.toLowerCase(),null,!0,!0)});function I8(u,l,f,r){var n=Uf.hasOwnProperty(l)?Uf[l]:null;if(n!==null?n.type!==0:r||!(2y||n[t]!==i[y]){var c=` -`+n[t].replace(" at new "," at ");return u.displayName&&c.includes("")&&(c=c.replace("",u.displayName)),c}while(1<=t&&0<=y);break}}}finally{G6=!1,Error.prepareStackTrace=f}return(u=u?u.displayName||u.name:"")?ay(u):""}function wK(u){switch(u.tag){case 5:return ay(u.type);case 16:return ay("Lazy");case 13:return ay("Suspense");case 19:return ay("SuspenseList");case 0:case 2:case 15:return u=z6(u.type,!1),u;case 11:return u=z6(u.type.render,!1),u;case 1:return u=z6(u.type,!0),u;default:return""}}function g6(u){if(u==null)return null;if(typeof u==="function")return u.displayName||u.name||null;if(typeof u==="string")return u;switch(u){case Ut:return"Fragment";case Ft:return"Portal";case v6:return"Profiler";case R8:return"StrictMode";case k6:return"Suspense";case I6:return"SuspenseList"}if(typeof u==="object")switch(u.$$typeof){case qF:return(u.displayName||"Context")+".Consumer";case NF:return(u._context.displayName||"Context")+".Provider";case h8:var l=u.render;return u=u.displayName,u||(u=l.displayName||l.name||"",u=u!==""?"ForwardRef("+u+")":"ForwardRef"),u;case x8:return l=u.displayName||null,l!==null?l:g6(u.type)||"Memo";case y0:l=u._payload,u=u._init;try{return g6(u(l))}catch(f){}}return null}function WK(u){var l=u.type;switch(u.tag){case 24:return"Cache";case 9:return(l.displayName||"Context")+".Consumer";case 10:return(l._context.displayName||"Context")+".Provider";case 18:return"DehydratedFragment";case 11:return u=l.render,u=u.displayName||u.name||"",l.displayName||(u!==""?"ForwardRef("+u+")":"ForwardRef");case 7:return"Fragment";case 5:return l;case 4:return"Portal";case 3:return"Root";case 6:return"Text";case 16:return g6(l);case 8:return l===R8?"StrictMode":"Mode";case 22:return"Offscreen";case 12:return"Profiler";case 21:return"Scope";case 13:return"Suspense";case 19:return"SuspenseList";case 25:return"TracingMarker";case 1:case 0:case 17:case 2:case 14:case 15:if(typeof l==="function")return l.displayName||l.name||null;if(typeof l==="string")return l}return null}function L0(u){switch(typeof u){case"boolean":case"number":case"string":case"undefined":return u;case"object":return u;default:return""}}function WF(u){var l=u.type;return(u=u.nodeName)&&u.toLowerCase()==="input"&&(l==="checkbox"||l==="radio")}function LK(u){var l=WF(u)?"checked":"value",f=Object.getOwnPropertyDescriptor(u.constructor.prototype,l),r=""+u[l];if(!u.hasOwnProperty(l)&&typeof f<"u"&&typeof f.get==="function"&&typeof f.set==="function"){var{get:n,set:i}=f;return Object.defineProperty(u,l,{configurable:!0,get:function(){return n.call(this)},set:function(t){r=""+t,i.call(this,t)}}),Object.defineProperty(u,l,{enumerable:f.enumerable}),{getValue:function(){return r},setValue:function(t){r=""+t},stopTracking:function(){u._valueTracker=null,delete u[l]}}}}function K_(u){u._valueTracker||(u._valueTracker=LK(u))}function LF(u){if(!u)return!1;var l=u._valueTracker;if(!l)return!0;var f=l.getValue(),r="";return u&&(r=WF(u)?u.checked?"true":"false":u.value),u=r,u!==f?(l.setValue(u),!0):!1}function g_(u){if(u=u||(typeof document<"u"?document:void 0),typeof u>"u")return null;try{return u.activeElement||u.body}catch(l){return u.body}}function s6(u,l){var f=l.checked;return ml({},l,{defaultChecked:void 0,defaultValue:void 0,value:void 0,checked:f!=null?f:u._wrapperState.initialChecked})}function Jj(u,l){var f=l.defaultValue==null?"":l.defaultValue,r=l.checked!=null?l.checked:l.defaultChecked;f=L0(l.value!=null?l.value:f),u._wrapperState={initialChecked:r,initialValue:f,controlled:l.type==="checkbox"||l.type==="radio"?l.checked!=null:l.value!=null}}function TF(u,l){l=l.checked,l!=null&&M8(u,"checked",l,!1)}function a6(u,l){TF(u,l);var f=L0(l.value),r=l.type;if(f!=null)if(r==="number"){if(f===0&&u.value===""||u.value!=f)u.value=""+f}else u.value!==""+f&&(u.value=""+f);else if(r==="submit"||r==="reset"){u.removeAttribute("value");return}l.hasOwnProperty("value")?o6(u,l.type,f):l.hasOwnProperty("defaultValue")&&o6(u,l.type,L0(l.defaultValue)),l.checked==null&&l.defaultChecked!=null&&(u.defaultChecked=!!l.defaultChecked)}function Qj(u,l,f){if(l.hasOwnProperty("value")||l.hasOwnProperty("defaultValue")){var r=l.type;if(!(r!=="submit"&&r!=="reset"||l.value!==void 0&&l.value!==null))return;l=""+u._wrapperState.initialValue,f||l===u.value||(u.value=l),u.defaultValue=l}f=u.name,f!==""&&(u.name=""),u.defaultChecked=!!u._wrapperState.initialChecked,f!==""&&(u.name=f)}function o6(u,l,f){if(l!=="number"||g_(u.ownerDocument)!==u)f==null?u.defaultValue=""+u._wrapperState.initialValue:u.defaultValue!==""+f&&(u.defaultValue=""+f)}var oy=Array.isArray;function zt(u,l,f,r){if(u=u.options,l){l={};for(var n=0;n"+l.valueOf().toString()+"";for(l=G_.firstChild;u.firstChild;)u.removeChild(u.firstChild);for(;l.firstChild;)u.appendChild(l.firstChild)}});function U1(u,l){if(l){var f=u.firstChild;if(f&&f===u.lastChild&&f.nodeType===3){f.nodeValue=l;return}}u.textContent=l}var n1={animationIterationCount:!0,aspectRatio:!0,borderImageOutset:!0,borderImageSlice:!0,borderImageWidth:!0,boxFlex:!0,boxFlexGroup:!0,boxOrdinalGroup:!0,columnCount:!0,columns:!0,flex:!0,flexGrow:!0,flexPositive:!0,flexShrink:!0,flexNegative:!0,flexOrder:!0,gridArea:!0,gridRow:!0,gridRowEnd:!0,gridRowSpan:!0,gridRowStart:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnSpan:!0,gridColumnStart:!0,fontWeight:!0,lineClamp:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,tabSize:!0,widows:!0,zIndex:!0,zoom:!0,fillOpacity:!0,floodOpacity:!0,stopOpacity:!0,strokeDasharray:!0,strokeDashoffset:!0,strokeMiterlimit:!0,strokeOpacity:!0,strokeWidth:!0},TK=["Webkit","ms","Moz","O"];Object.keys(n1).forEach(function(u){TK.forEach(function(l){l=l+u.charAt(0).toUpperCase()+u.substring(1),n1[l]=n1[u]})});function EF(u,l,f){return l==null||typeof l==="boolean"||l===""?"":f||typeof l!=="number"||l===0||n1.hasOwnProperty(u)&&n1[u]?(""+l).trim():l+"px"}function OF(u,l){u=u.style;for(var f in l)if(l.hasOwnProperty(f)){var r=f.indexOf("--")===0,n=EF(f,l[f],r);f==="float"&&(f="cssFloat"),r?u.setProperty(f,n):u[f]=n}}var KK=ml({menuitem:!0},{area:!0,base:!0,br:!0,col:!0,embed:!0,hr:!0,img:!0,input:!0,keygen:!0,link:!0,meta:!0,param:!0,source:!0,track:!0,wbr:!0});function u8(u,l){if(l){if(KK[u]&&(l.children!=null||l.dangerouslySetInnerHTML!=null))throw Error(Ju(137,u));if(l.dangerouslySetInnerHTML!=null){if(l.children!=null)throw Error(Ju(60));if(typeof l.dangerouslySetInnerHTML!=="object"||!("__html"in l.dangerouslySetInnerHTML))throw Error(Ju(61))}if(l.style!=null&&typeof l.style!=="object")throw Error(Ju(62))}}function l8(u,l){if(u.indexOf("-")===-1)return typeof l.is==="string";switch(u){case"annotation-xml":case"color-profile":case"font-face":case"font-face-src":case"font-face-uri":case"font-face-format":case"font-face-name":case"missing-glyph":return!1;default:return!0}}var f8=null;function b8(u){return u=u.target||u.srcElement||window,u.correspondingUseElement&&(u=u.correspondingUseElement),u.nodeType===3?u.parentNode:u}var r8=null,Et=null,Ot=null;function wj(u){if(u=V1(u)){if(typeof r8!=="function")throw Error(Ju(280));var l=u.stateNode;l&&(l=T$(l),r8(u.stateNode,u.type,l))}}function ZF(u){Et?Ot?Ot.push(u):Ot=[u]:Et=u}function HF(){if(Et){var u=Et,l=Ot;if(Ot=Et=null,wj(u),l)for(u=0;u>>=0,u===0?32:31-(pK(u)/SK|0)|0}var z_=64,E_=4194304;function dy(u){switch(u&-u){case 1:return 1;case 2:return 2;case 4:return 4;case 8:return 8;case 16:return 16;case 32:return 32;case 64:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return u&4194240;case 4194304:case 8388608:case 16777216:case 33554432:case 67108864:return u&130023424;case 134217728:return 134217728;case 268435456:return 268435456;case 536870912:return 536870912;case 1073741824:return 1073741824;default:return u}}function d_(u,l){var f=u.pendingLanes;if(f===0)return 0;var r=0,n=u.suspendedLanes,i=u.pingedLanes,t=f&268435455;if(t!==0){var y=t&~n;y!==0?r=dy(y):(i&=t,i!==0&&(r=dy(i)))}else t=f&~n,t!==0?r=dy(t):i!==0&&(r=dy(i));if(r===0)return 0;if(l!==0&&l!==r&&(l&n)===0&&(n=r&-r,i=l&-l,n>=i||n===16&&(i&4194240)!==0))return l;if((r&4)!==0&&(r|=f&16),l=u.entangledLanes,l!==0)for(u=u.entanglements,l&=r;0f;f++)l.push(u);return l}function B1(u,l,f){u.pendingLanes|=l,l!==536870912&&(u.suspendedLanes=0,u.pingedLanes=0),u=u.eventTimes,l=31-vr(l),u[l]=f}function CK(u,l){var f=u.pendingLanes&~l;u.pendingLanes=l,u.suspendedLanes=0,u.pingedLanes=0,u.expiredLanes&=l,u.mutableReadLanes&=l,u.entangledLanes&=l,l=u.entanglements;var r=u.eventTimes;for(u=u.expirationTimes;0=t1),Zj=String.fromCharCode(32),Hj=!1;function sF(u,l){switch(u){case"keyup":return FG.indexOf(l.keyCode)!==-1;case"keydown":return l.keyCode!==229;case"keypress":case"mousedown":case"focusout":return!0;default:return!1}}function aF(u){return u=u.detail,typeof u==="object"&&"data"in u?u.data:null}var Jt=!1;function JG(u,l){switch(u){case"compositionend":return aF(l);case"keypress":if(l.which!==32)return null;return Hj=!0,Zj;case"textInput":return u=l.data,u===Zj&&Hj?null:u;default:return null}}function QG(u,l){if(Jt)return u==="compositionend"||!d8&&sF(u,l)?(u=IF(),P_=s8=A0=null,Jt=!1,u):null;switch(u){case"paste":return null;case"keypress":if(!(l.ctrlKey||l.altKey||l.metaKey)||l.ctrlKey&&l.altKey){if(l.char&&1=l)return{node:f,offset:l-u};u=r}u:{for(;f;){if(f.nextSibling){f=f.nextSibling;break u}f=f.parentNode}f=void 0}f=Vj(f)}}function uU(u,l){return u&&l?u===l?!0:u&&u.nodeType===3?!1:l&&l.nodeType===3?uU(u,l.parentNode):("contains"in u)?u.contains(l):u.compareDocumentPosition?!!(u.compareDocumentPosition(l)&16):!1:!1}function lU(){for(var u=window,l=g_();l instanceof u.HTMLIFrameElement;){try{var f=typeof l.contentWindow.location.href==="string"}catch(r){f=!1}if(f)u=l.contentWindow;else break;l=g_(u.document)}return l}function e8(u){var l=u&&u.nodeName&&u.nodeName.toLowerCase();return l&&(l==="input"&&(u.type==="text"||u.type==="search"||u.type==="tel"||u.type==="url"||u.type==="password")||l==="textarea"||u.contentEditable==="true")}function zG(u){var l=lU(),f=u.focusedElem,r=u.selectionRange;if(l!==f&&f&&f.ownerDocument&&uU(f.ownerDocument.documentElement,f)){if(r!==null&&e8(f)){if(l=r.start,u=r.end,u===void 0&&(u=l),"selectionStart"in f)f.selectionStart=l,f.selectionEnd=Math.min(u,f.value.length);else if(u=(l=f.ownerDocument||document)&&l.defaultView||window,u.getSelection){u=u.getSelection();var n=f.textContent.length,i=Math.min(r.start,n);r=r.end===void 0?i:Math.min(r.end,n),!u.extend&&i>r&&(n=r,r=i,i=n),n=Dj(f,i);var t=Dj(f,r);n&&t&&(u.rangeCount!==1||u.anchorNode!==n.node||u.anchorOffset!==n.offset||u.focusNode!==t.node||u.focusOffset!==t.offset)&&(l=l.createRange(),l.setStart(n.node,n.offset),u.removeAllRanges(),i>r?(u.addRange(l),u.extend(t.node,t.offset)):(l.setEnd(t.node,t.offset),u.addRange(l)))}}l=[];for(u=f;u=u.parentNode;)u.nodeType===1&&l.push({element:u,left:u.scrollLeft,top:u.scrollTop});typeof f.focus==="function"&&f.focus();for(f=0;f=document.documentMode,Qt=null,_8=null,c1=null,$8=!1;function pj(u,l,f){var r=f.window===f?f.document:f.nodeType===9?f:f.ownerDocument;$8||Qt==null||Qt!==g_(r)||(r=Qt,("selectionStart"in r)&&e8(r)?r={start:r.selectionStart,end:r.selectionEnd}:(r=(r.ownerDocument&&r.ownerDocument.defaultView||window).getSelection(),r={anchorNode:r.anchorNode,anchorOffset:r.anchorOffset,focusNode:r.focusNode,focusOffset:r.focusOffset}),c1&&W1(c1,r)||(c1=r,r=l$(_8,"onSelect"),0wt||(u.current=q8[wt],q8[wt]=null,wt--)}function wl(u,l){wt++,q8[wt]=u.current,u.current=l}var T0={},Tf=G0(T0),vf=G0(!1),wi=T0;function Vt(u,l){var f=u.type.contextTypes;if(!f)return T0;var r=u.stateNode;if(r&&r.__reactInternalMemoizedUnmaskedChildContext===l)return r.__reactInternalMemoizedMaskedChildContext;var n={},i;for(i in f)n[i]=l[i];return r&&(u=u.stateNode,u.__reactInternalMemoizedUnmaskedChildContext=l,u.__reactInternalMemoizedMaskedChildContext=n),n}function kf(u){return u=u.childContextTypes,u!==null&&u!==void 0}function r$(){Gl(vf),Gl(Tf)}function Rj(u,l,f){if(Tf.current!==T0)throw Error(Ju(168));wl(Tf,l),wl(vf,f)}function $U(u,l,f){var r=u.stateNode;if(l=l.childContextTypes,typeof r.getChildContext!=="function")return f;r=r.getChildContext();for(var n in r)if(!(n in l))throw Error(Ju(108,WK(u)||"Unknown",n));return ml({},f,r)}function n$(u){return u=(u=u.stateNode)&&u.__reactInternalMemoizedMergedChildContext||T0,wi=Tf.current,wl(Tf,u),wl(vf,vf.current),!0}function hj(u,l,f){var r=u.stateNode;if(!r)throw Error(Ju(169));f?(u=$U(u,l,wi),r.__reactInternalMemoizedMergedChildContext=u,Gl(vf),Gl(Tf),wl(Tf,u)):Gl(vf),wl(vf,f)}var Zn=null,K$=!1,S6=!1;function AU(u){Zn===null?Zn=[u]:Zn.push(u)}function SG(u){K$=!0,AU(u)}function z0(){if(!S6&&Zn!==null){S6=!0;var u=0,l=Al;try{var f=Zn;for(Al=1;u>=t,n-=t,Hn=1<<32-vr(l)+n|f<E?(V=H,H=null):V=H.sibling;var S=F(U,H,N[E],w);if(S===null){H===null&&(H=V);break}u&&H&&S.alternate===null&&l(U,H),q=i(S,q,E),Z===null?G=S:Z.sibling=S,Z=S,H=V}if(E===N.length)return f(U,H),El&&ji(U,E),G;if(H===null){for(;EE?(V=H,H=null):V=H.sibling;var B=F(U,H,S.value,w);if(B===null){H===null&&(H=V);break}u&&H&&B.alternate===null&&l(U,H),q=i(B,q,E),Z===null?G=B:Z.sibling=B,Z=B,H=V}if(S.done)return f(U,H),El&&ji(U,E),G;if(H===null){for(;!S.done;E++,S=N.next())S=j(U,S.value,w),S!==null&&(q=i(S,q,E),Z===null?G=S:Z.sibling=S,Z=S);return El&&ji(U,E),G}for(H=r(U,H);!S.done;E++,S=N.next())S=J(H,U,E,S.value,w),S!==null&&(u&&S.alternate!==null&&H.delete(S.key===null?E:S.key),q=i(S,q,E),Z===null?G=S:Z.sibling=S,Z=S);return u&&H.forEach(function(D){return l(U,D)}),El&&ji(U,E),G}function L(U,q,N,w){if(typeof N==="object"&&N!==null&&N.type===Ut&&N.key===null&&(N=N.props.children),typeof N==="object"&&N!==null){switch(N.$$typeof){case T_:u:{for(var G=N.key,Z=q;Z!==null;){if(Z.key===G){if(G=N.type,G===Ut){if(Z.tag===7){f(U,Z.sibling),q=n(Z,N.props.children),q.return=U,U=q;break u}}else if(Z.elementType===G||typeof G==="object"&&G!==null&&G.$$typeof===y0&&vj(G)===Z.type){f(U,Z.sibling),q=n(Z,N.props),q.ref=Iy(U,Z,N),q.return=U,U=q;break u}f(U,Z);break}else l(U,Z);Z=Z.sibling}N.type===Ut?(q=qi(N.props.children,U.mode,w,N.key),q.return=U,U=q):(w=I_(N.type,N.key,N.props,null,U.mode,w),w.ref=Iy(U,q,N),w.return=U,U=w)}return t(U);case Ft:u:{for(Z=N.key;q!==null;){if(q.key===Z)if(q.tag===4&&q.stateNode.containerInfo===N.containerInfo&&q.stateNode.implementation===N.implementation){f(U,q.sibling),q=n(q,N.children||[]),q.return=U,U=q;break u}else{f(U,q);break}else l(U,q);q=q.sibling}q=x6(N,U.mode,w),q.return=U,U=q}return t(U);case y0:return Z=N._init,L(U,q,Z(N._payload),w)}if(oy(N))return Q(U,q,N,w);if(xy(N))return W(U,q,N,w);D_(U,N)}return typeof N==="string"&&N!==""||typeof N==="number"?(N=""+N,q!==null&&q.tag===6?(f(U,q.sibling),q=n(q,N),q.return=U,U=q):(f(U,q),q=h6(N,U.mode,w),q.return=U,U=q),t(U)):f(U,q)}return L}var pt=JU(!0),QU=JU(!1),y$=G0(null),c$=null,Tt=null,r4=null;function n4(){r4=Tt=c$=null}function i4(u){var l=y$.current;Gl(y$),u._currentValue=l}function L8(u,l,f){for(;u!==null;){var r=u.alternate;if((u.childLanes&l)!==l?(u.childLanes|=l,r!==null&&(r.childLanes|=l)):r!==null&&(r.childLanes&l)!==l&&(r.childLanes|=l),u===f)break;u=u.return}}function Ht(u,l){c$=u,r4=Tt=null,u=u.dependencies,u!==null&&u.firstContext!==null&&((u.lanes&l)!==0&&(bf=!0),u.firstContext=null)}function Zr(u){var l=u._currentValue;if(r4!==u)if(u={context:u,memoizedValue:l,next:null},Tt===null){if(c$===null)throw Error(Ju(308));Tt=u,c$.dependencies={lanes:0,firstContext:u}}else Tt=Tt.next=u;return l}var Ji=null;function t4(u){Ji===null?Ji=[u]:Ji.push(u)}function NU(u,l,f,r){var n=l.interleaved;return n===null?(f.next=f,t4(l)):(f.next=n.next,n.next=f),l.interleaved=f,pn(u,r)}function pn(u,l){u.lanes|=l;var f=u.alternate;f!==null&&(f.lanes|=l),f=u;for(u=u.return;u!==null;)u.childLanes|=l,f=u.alternate,f!==null&&(f.childLanes|=l),f=u,u=u.return;return f.tag===3?f.stateNode:null}var c0=!1;function y4(u){u.updateQueue={baseState:u.memoizedState,firstBaseUpdate:null,lastBaseUpdate:null,shared:{pending:null,interleaved:null,lanes:0},effects:null}}function qU(u,l){u=u.updateQueue,l.updateQueue===u&&(l.updateQueue={baseState:u.baseState,firstBaseUpdate:u.firstBaseUpdate,lastBaseUpdate:u.lastBaseUpdate,shared:u.shared,effects:u.effects})}function mn(u,l){return{eventTime:u,lane:l,tag:0,payload:null,callback:null,next:null}}function N0(u,l,f){var r=u.updateQueue;if(r===null)return null;if(r=r.shared,(cl&2)!==0){var n=r.pending;return n===null?l.next=l:(l.next=n.next,n.next=l),r.pending=l,pn(u,f)}return n=r.interleaved,n===null?(l.next=l,t4(r)):(l.next=n.next,n.next=l),r.interleaved=l,pn(u,f)}function R_(u,l,f){if(l=l.updateQueue,l!==null&&(l=l.shared,(f&4194240)!==0)){var r=l.lanes;r&=u.pendingLanes,f|=r,l.lanes=f,k8(u,f)}}function kj(u,l){var{updateQueue:f,alternate:r}=u;if(r!==null&&(r=r.updateQueue,f===r)){var n=null,i=null;if(f=f.firstBaseUpdate,f!==null){do{var t={eventTime:f.eventTime,lane:f.lane,tag:f.tag,payload:f.payload,callback:f.callback,next:null};i===null?n=i=t:i=i.next=t,f=f.next}while(f!==null);i===null?n=i=l:i=i.next=l}else n=i=l;f={baseState:r.baseState,firstBaseUpdate:n,lastBaseUpdate:i,shared:r.shared,effects:r.effects},u.updateQueue=f;return}u=f.lastBaseUpdate,u===null?f.firstBaseUpdate=l:u.next=l,f.lastBaseUpdate=l}function _$(u,l,f,r){var n=u.updateQueue;c0=!1;var{firstBaseUpdate:i,lastBaseUpdate:t}=n,y=n.shared.pending;if(y!==null){n.shared.pending=null;var c=y,$=c.next;c.next=null,t===null?i=$:t.next=$,t=c;var A=u.alternate;A!==null&&(A=A.updateQueue,y=A.lastBaseUpdate,y!==t&&(y===null?A.firstBaseUpdate=$:y.next=$,A.lastBaseUpdate=c))}if(i!==null){var j=n.baseState;t=0,A=$=c=null,y=i;do{var{lane:F,eventTime:J}=y;if((r&F)===F){A!==null&&(A=A.next={eventTime:J,lane:0,tag:y.tag,payload:y.payload,callback:y.callback,next:null});u:{var Q=u,W=y;switch(F=l,J=f,W.tag){case 1:if(Q=W.payload,typeof Q==="function"){j=Q.call(J,j,F);break u}j=Q;break u;case 3:Q.flags=Q.flags&-65537|128;case 0:if(Q=W.payload,F=typeof Q==="function"?Q.call(J,j,F):Q,F===null||F===void 0)break u;j=ml({},j,F);break u;case 2:c0=!0}}y.callback!==null&&y.lane!==0&&(u.flags|=64,F=n.effects,F===null?n.effects=[y]:F.push(y))}else J={eventTime:J,lane:F,tag:y.tag,payload:y.payload,callback:y.callback,next:null},A===null?($=A=J,c=j):A=A.next=J,t|=F;if(y=y.next,y===null)if(y=n.shared.pending,y===null)break;else F=y,y=F.next,F.next=null,n.lastBaseUpdate=F,n.shared.pending=null}while(1);if(A===null&&(c=j),n.baseState=c,n.firstBaseUpdate=$,n.lastBaseUpdate=A,l=n.shared.interleaved,l!==null){n=l;do t|=n.lane,n=n.next;while(n!==l)}else i===null&&(n.shared.lanes=0);Ti|=t,u.lanes=t,u.memoizedState=j}}function Ij(u,l,f){if(u=l.effects,l.effects=null,u!==null)for(l=0;lf?f:4,u(!0);var r=Y6.transition;Y6.transition={};try{u(!1),l()}finally{Al=f,Y6.transition=r}}function SU(){return Hr().memoizedState}function CG(u,l,f){var r=w0(u);if(f={lane:r,action:f,hasEagerState:!1,eagerState:null,next:null},XU(u))YU(l,f);else if(f=NU(u,l,f,r),f!==null){var n=Vf();kr(f,u,r,n),PU(f,l,r)}}function MG(u,l,f){var r=w0(u),n={lane:r,action:f,hasEagerState:!1,eagerState:null,next:null};if(XU(u))YU(l,n);else{var i=u.alternate;if(u.lanes===0&&(i===null||i.lanes===0)&&(i=l.lastRenderedReducer,i!==null))try{var t=l.lastRenderedState,y=i(t,f);if(n.hasEagerState=!0,n.eagerState=y,Ir(y,t)){var c=l.interleaved;c===null?(n.next=n,t4(l)):(n.next=c.next,c.next=n),l.interleaved=n;return}}catch($){}finally{}f=NU(u,l,n,r),f!==null&&(n=Vf(),kr(f,u,r,n),PU(f,l,r))}}function XU(u){var l=u.alternate;return u===Bl||l!==null&&l===Bl}function YU(u,l){_1=A$=!0;var f=u.pending;f===null?l.next=l:(l.next=f.next,f.next=l),u.pending=l}function PU(u,l,f){if((f&4194240)!==0){var r=l.lanes;r&=u.pendingLanes,f|=r,l.lanes=f,k8(u,f)}}var j$={readContext:Zr,useCallback:wf,useContext:wf,useEffect:wf,useImperativeHandle:wf,useInsertionEffect:wf,useLayoutEffect:wf,useMemo:wf,useReducer:wf,useRef:wf,useState:wf,useDebugValue:wf,useDeferredValue:wf,useTransition:wf,useMutableSource:wf,useSyncExternalStore:wf,useId:wf,unstable_isNewReconciler:!1},RG={readContext:Zr,useCallback:function(u,l){return cn().memoizedState=[u,l===void 0?null:l],u},useContext:Zr,useEffect:sj,useImperativeHandle:function(u,l,f){return f=f!==null&&f!==void 0?f.concat([u]):null,x_(4194308,4,BU.bind(null,l,u),f)},useLayoutEffect:function(u,l){return x_(4194308,4,u,l)},useInsertionEffect:function(u,l){return x_(4,2,u,l)},useMemo:function(u,l){var f=cn();return l=l===void 0?null:l,u=u(),f.memoizedState=[u,l],u},useReducer:function(u,l,f){var r=cn();return l=f!==void 0?f(l):l,r.memoizedState=r.baseState=l,u={pending:null,interleaved:null,lanes:0,dispatch:null,lastRenderedReducer:u,lastRenderedState:l},r.queue=u,u=u.dispatch=CG.bind(null,Bl,u),[r.memoizedState,u]},useRef:function(u){var l=cn();return u={current:u},l.memoizedState=u},useState:gj,useDebugValue:J4,useDeferredValue:function(u){return cn().memoizedState=u},useTransition:function(){var u=gj(!1),l=u[0];return u=PG.bind(null,u[1]),cn().memoizedState=u,[l,u]},useMutableSource:function(){},useSyncExternalStore:function(u,l,f){var r=Bl,n=cn();if(El){if(f===void 0)throw Error(Ju(407));f=f()}else{if(f=l(),nf===null)throw Error(Ju(349));(Li&30)!==0||TU(r,l,f)}n.memoizedState=f;var i={value:f,getSnapshot:l};return n.queue=i,sj(GU.bind(null,r,i,u),[u]),r.flags|=2048,Z1(9,KU.bind(null,r,i,f,l),void 0,null),f},useId:function(){var u=cn(),l=nf.identifierPrefix;if(El){var f=Bn,r=Hn;f=(r&~(1<<32-vr(r)-1)).toString(32)+f,l=":"+l+"R"+f,f=E1++,0")&&(c=c.replace("",u.displayName)),c}while(1<=t&&0<=y);break}}}finally{V6=!1,Error.prepareStackTrace=f}return(u=u?u.displayName||u.name:"")?ey(u):""}function BK(u){switch(u.tag){case 5:return ey(u.type);case 16:return ey("Lazy");case 13:return ey("Suspense");case 19:return ey("SuspenseList");case 0:case 2:case 15:return u=m6(u.type,!1),u;case 11:return u=m6(u.type.render,!1),u;case 1:return u=m6(u.type,!0),u;default:return""}}function l8(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 Qt:return"Fragment";case Jt:return"Portal";case d6:return"Profiler";case g8:return"StrictMode";case e6:return"Suspense";case u8:return"SuspenseList"}if(typeof u==="object")switch(u.$$typeof){case OF:return(u.displayName||"Context")+".Consumer";case EF:return(u._context.displayName||"Context")+".Provider";case s8:var l=u.render;return u=u.displayName,u||(u=l.displayName||l.name||"",u=u!==""?"ForwardRef("+u+")":"ForwardRef"),u;case a8:return l=u.displayName||null,l!==null?l:l8(u.type)||"Memo";case y0:l=u._payload,u=u._init;try{return l8(u(l))}catch(f){}}return null}function VK(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 l8(l);case 8:return l===g8?"StrictMode":"Mode";case 22:return"Offscreen";case 12:return"Profiler";case 21:return"Scope";case 13:return"Suspense";case 19:return"SuspenseList";case 25:return"TracingMarker";case 1:case 0:case 17:case 2:case 14:case 15:if(typeof l==="function")return l.displayName||l.name||null;if(typeof l==="string")return l}return null}function L0(u){switch(typeof u){case"boolean":case"number":case"string":case"undefined":return u;case"object":return u;default:return""}}function HF(u){var l=u.type;return(u=u.nodeName)&&u.toLowerCase()==="input"&&(l==="checkbox"||l==="radio")}function mK(u){var l=HF(u)?"checked":"value",f=Object.getOwnPropertyDescriptor(u.constructor.prototype,l),r=""+u[l];if(!u.hasOwnProperty(l)&&typeof f<"u"&&typeof f.get==="function"&&typeof f.set==="function"){var{get:n,set:i}=f;return Object.defineProperty(u,l,{configurable:!0,get:function(){return n.call(this)},set:function(t){r=""+t,i.call(this,t)}}),Object.defineProperty(u,l,{enumerable:f.enumerable}),{getValue:function(){return r},setValue:function(t){r=""+t},stopTracking:function(){u._valueTracker=null,delete u[l]}}}}function H_(u){u._valueTracker||(u._valueTracker=mK(u))}function BF(u){if(!u)return!1;var l=u._valueTracker;if(!l)return!0;var f=l.getValue(),r="";return u&&(r=HF(u)?u.checked?"true":"false":u.value),u=r,u!==f?(l.setValue(u),!0):!1}function u$(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 f8(u,l){var f=l.checked;return Vl({},l,{defaultChecked:void 0,defaultValue:void 0,value:void 0,checked:f!=null?f:u._wrapperState.initialChecked})}function Gj(u,l){var f=l.defaultValue==null?"":l.defaultValue,r=l.checked!=null?l.checked:l.defaultChecked;f=L0(l.value!=null?l.value:f),u._wrapperState={initialChecked:r,initialValue:f,controlled:l.type==="checkbox"||l.type==="radio"?l.checked!=null:l.value!=null}}function VF(u,l){l=l.checked,l!=null&&I8(u,"checked",l,!1)}function r8(u,l){VF(u,l);var f=L0(l.value),r=l.type;if(f!=null)if(r==="number"){if(f===0&&u.value===""||u.value!=f)u.value=""+f}else u.value!==""+f&&(u.value=""+f);else if(r==="submit"||r==="reset"){u.removeAttribute("value");return}l.hasOwnProperty("value")?n8(u,l.type,f):l.hasOwnProperty("defaultValue")&&n8(u,l.type,L0(l.defaultValue)),l.checked==null&&l.defaultChecked!=null&&(u.defaultChecked=!!l.defaultChecked)}function zj(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 n8(u,l,f){if(l!=="number"||u$(u.ownerDocument)!==u)f==null?u.defaultValue=""+u._wrapperState.initialValue:u.defaultValue!==""+f&&(u.defaultValue=""+f)}var u1=Array.isArray;function Ot(u,l,f,r){if(u=u.options,l){l={};for(var n=0;n"+l.valueOf().toString()+"";for(l=B_.firstChild;u.firstChild;)u.removeChild(u.firstChild);for(;l.firstChild;)u.appendChild(l.firstChild)}});function N1(u,l){if(l){var f=u.firstChild;if(f&&f===u.lastChild&&f.nodeType===3){f.nodeValue=l;return}}u.textContent=l}var y1={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},DK=["Webkit","ms","Moz","O"];Object.keys(y1).forEach(function(u){DK.forEach(function(l){l=l+u.charAt(0).toUpperCase()+u.substring(1),y1[l]=y1[u]})});function SF(u,l,f){return l==null||typeof l==="boolean"||l===""?"":f||typeof l!=="number"||l===0||y1.hasOwnProperty(u)&&y1[u]?(""+l).trim():l+"px"}function XF(u,l){u=u.style;for(var f in l)if(l.hasOwnProperty(f)){var r=f.indexOf("--")===0,n=SF(f,l[f],r);f==="float"&&(f="cssFloat"),r?u.setProperty(f,n):u[f]=n}}var pK=Vl({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 y8(u,l){if(l){if(pK[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 c8(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 _8=null;function o8(u){return u=u.target||u.srcElement||window,u.correspondingUseElement&&(u=u.correspondingUseElement),u.nodeType===3?u.parentNode:u}var $8=null,Zt=null,Ht=null;function Zj(u){if(u=S1(u)){if(typeof $8!=="function")throw Error(Ju(280));var l=u.stateNode;l&&(l=Z$(l),$8(u.stateNode,u.type,l))}}function YF(u){Zt?Ht?Ht.push(u):Ht=[u]:Zt=u}function PF(){if(Zt){var u=Zt,l=Ht;if(Ht=Zt=null,Zj(u),l)for(u=0;u>>=0,u===0?32:31-(vK(u)/kK|0)|0}var V_=64,m_=4194304;function l1(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 n$(u,l){var f=u.pendingLanes;if(f===0)return 0;var r=0,n=u.suspendedLanes,i=u.pingedLanes,t=f&268435455;if(t!==0){var y=t&~n;y!==0?r=l1(y):(i&=t,i!==0&&(r=l1(i)))}else t=f&~n,t!==0?r=l1(t):i!==0&&(r=l1(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 D1(u,l,f){u.pendingLanes|=l,l!==536870912&&(u.suspendedLanes=0,u.pingedLanes=0),u=u.eventTimes,l=31-vr(l),u[l]=f}function aK(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=_1),Yj=String.fromCharCode(32),Pj=!1;function nU(u,l){switch(u){case"keyup":return GG.indexOf(l.keyCode)!==-1;case"keydown":return l.keyCode!==229;case"keypress":case"mousedown":case"focusout":return!0;default:return!1}}function iU(u){return u=u.detail,typeof u==="object"&&"data"in u?u.data:null}var Nt=!1;function EG(u,l){switch(u){case"compositionend":return iU(l);case"keypress":if(l.which!==32)return null;return Pj=!0,Yj;case"textInput":return u=l.data,u===Yj&&Pj?null:u;default:return null}}function OG(u,l){if(Nt)return u==="compositionend"||!i4&&nU(u,l)?(u=fU(),b_=f4=A0=null,Nt=!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=Rj(f)}}function _U(u,l){return u&&l?u===l?!0:u&&u.nodeType===3?!1:l&&l.nodeType===3?_U(u,l.parentNode):("contains"in u)?u.contains(l):u.compareDocumentPosition?!!(u.compareDocumentPosition(l)&16):!1:!1}function $U(){for(var u=window,l=u$();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=u$(u.document)}return l}function t4(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 XG(u){var l=$U(),f=u.focusedElem,r=u.selectionRange;if(l!==f&&f&&f.ownerDocument&&_U(f.ownerDocument.documentElement,f)){if(r!==null&&t4(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=xj(f,i);var t=xj(f,r);n&&t&&(u.rangeCount!==1||u.anchorNode!==n.node||u.anchorOffset!==n.offset||u.focusNode!==t.node||u.focusOffset!==t.offset)&&(l=l.createRange(),l.setStart(n.node,n.offset),u.removeAllRanges(),i>r?(u.addRange(l),u.extend(t.node,t.offset)):(l.setEnd(t.node,t.offset),u.addRange(l)))}}l=[];for(u=f;u=u.parentNode;)u.nodeType===1&&l.push({element:u,left:u.scrollLeft,top:u.scrollTop});typeof f.focus==="function"&&f.focus();for(f=0;f=document.documentMode,qt=null,Q8=null,A1=null,N8=!1;function hj(u,l,f){var r=f.window===f?f.document:f.nodeType===9?f:f.ownerDocument;N8||qt==null||qt!==u$(r)||(r=qt,("selectionStart"in r)&&t4(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}),A1&&K1(A1,r)||(A1=r,r=y$(Q8,"onSelect"),0Lt||(u.current=z8[Lt],z8[Lt]=null,Lt--)}function Wl(u,l){Lt++,z8[Lt]=u.current,u.current=l}var T0={},Kf=G0(T0),kf=G0(!1),Wi=T0;function pt(u,l){var f=u.type.contextTypes;if(!f)return T0;var r=u.stateNode;if(r&&r.__reactInternalMemoizedUnmaskedChildContext===l)return r.__reactInternalMemoizedMaskedChildContext;var n={},i;for(i in f)n[i]=l[i];return r&&(u=u.stateNode,u.__reactInternalMemoizedUnmaskedChildContext=l,u.__reactInternalMemoizedMaskedChildContext=n),n}function If(u){return u=u.childContextTypes,u!==null&&u!==void 0}function _$(){zl(kf),zl(Kf)}function aj(u,l,f){if(Kf.current!==T0)throw Error(Ju(168));Wl(Kf,l),Wl(kf,f)}function wU(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,VK(u)||"Unknown",n));return Vl({},f,r)}function $$(u){return u=(u=u.stateNode)&&u.__reactInternalMemoizedMergedChildContext||T0,Wi=Kf.current,Wl(Kf,u),Wl(kf,kf.current),!0}function oj(u,l,f){var r=u.stateNode;if(!r)throw Error(Ju(169));f?(u=wU(u,l,Wi),r.__reactInternalMemoizedMergedChildContext=u,zl(kf),zl(Kf),Wl(Kf,u)):zl(kf),Wl(kf,f)}var Hn=null,H$=!1,x6=!1;function WU(u){Hn===null?Hn=[u]:Hn.push(u)}function kG(u){H$=!0,WU(u)}function z0(){if(!x6&&Hn!==null){x6=!0;var u=0,l=jl;try{var f=Hn;for(jl=1;u>=t,n-=t,Bn=1<<32-vr(l)+n|f<E?(m=H,H=null):m=H.sibling;var S=F(U,H,N[E],w);if(S===null){H===null&&(H=m);break}u&&H&&S.alternate===null&&l(U,H),q=i(S,q,E),Z===null?G=S:Z.sibling=S,Z=S,H=m}if(E===N.length)return f(U,H),Ol&&Fi(U,E),G;if(H===null){for(;EE?(m=H,H=null):m=H.sibling;var B=F(U,H,S.value,w);if(B===null){H===null&&(H=m);break}u&&H&&B.alternate===null&&l(U,H),q=i(B,q,E),Z===null?G=B:Z.sibling=B,Z=B,H=m}if(S.done)return f(U,H),Ol&&Fi(U,E),G;if(H===null){for(;!S.done;E++,S=N.next())S=j(U,S.value,w),S!==null&&(q=i(S,q,E),Z===null?G=S:Z.sibling=S,Z=S);return Ol&&Fi(U,E),G}for(H=r(U,H);!S.done;E++,S=N.next())S=J(H,U,E,S.value,w),S!==null&&(u&&S.alternate!==null&&H.delete(S.key===null?E:S.key),q=i(S,q,E),Z===null?G=S:Z.sibling=S,Z=S);return u&&H.forEach(function(D){return l(U,D)}),Ol&&Fi(U,E),G}function L(U,q,N,w){if(typeof N==="object"&&N!==null&&N.type===Qt&&N.key===null&&(N=N.props.children),typeof N==="object"&&N!==null){switch(N.$$typeof){case Z_:u:{for(var G=N.key,Z=q;Z!==null;){if(Z.key===G){if(G=N.type,G===Qt){if(Z.tag===7){f(U,Z.sibling),q=n(Z,N.props.children),q.return=U,U=q;break u}}else if(Z.elementType===G||typeof G==="object"&&G!==null&&G.$$typeof===y0&&uF(G)===Z.type){f(U,Z.sibling),q=n(Z,N.props),q.ref=ay(U,Z,N),q.return=U,U=q;break u}f(U,Z);break}else l(U,Z);Z=Z.sibling}N.type===Qt?(q=wi(N.props.children,U.mode,w,N.key),q.return=U,U=q):(w=e_(N.type,N.key,N.props,null,U.mode,w),w.ref=ay(U,q,N),w.return=U,U=w)}return t(U);case Jt:u:{for(Z=N.key;q!==null;){if(q.key===Z)if(q.tag===4&&q.stateNode.containerInfo===N.containerInfo&&q.stateNode.implementation===N.implementation){f(U,q.sibling),q=n(q,N.children||[]),q.return=U,U=q;break u}else{f(U,q);break}else l(U,q);q=q.sibling}q=a6(N,U.mode,w),q.return=U,U=q}return t(U);case y0:return Z=N._init,L(U,q,Z(N._payload),w)}if(u1(N))return Q(U,q,N,w);if(ky(N))return W(U,q,N,w);C_(U,N)}return typeof N==="string"&&N!==""||typeof N==="number"?(N=""+N,q!==null&&q.tag===6?(f(U,q.sibling),q=n(q,N),q.return=U,U=q):(f(U,q),q=s6(N,U.mode,w),q.return=U,U=q),t(U)):f(U,q)}return L}var Xt=GU(!0),zU=GU(!1),F$=G0(null),U$=null,Gt=null,$4=null;function A4(){$4=Gt=U$=null}function j4(u){var l=F$.current;zl(F$),u._currentValue=l}function Z8(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 Vt(u,l){U$=u,$4=Gt=null,u=u.dependencies,u!==null&&u.firstContext!==null&&((u.lanes&l)!==0&&(vf=!0),u.firstContext=null)}function Or(u){var l=u._currentValue;if($4!==u)if(u={context:u,memoizedValue:l,next:null},Gt===null){if(U$===null)throw Error(Ju(308));Gt=u,U$.dependencies={lanes:0,firstContext:u}}else Gt=Gt.next=u;return l}var Qi=null;function F4(u){Qi===null?Qi=[u]:Qi.push(u)}function EU(u,l,f,r){var n=l.interleaved;return n===null?(f.next=f,F4(l)):(f.next=n.next,n.next=f),l.interleaved=f,Sn(u,r)}function Sn(u,l){u.lanes|=l;var f=u.alternate;f!==null&&(f.lanes|=l),f=u;for(u=u.return;u!==null;)u.childLanes|=l,f=u.alternate,f!==null&&(f.childLanes|=l),f=u,u=u.return;return f.tag===3?f.stateNode:null}var c0=!1;function U4(u){u.updateQueue={baseState:u.memoizedState,firstBaseUpdate:null,lastBaseUpdate:null,shared:{pending:null,interleaved:null,lanes:0},effects:null}}function OU(u,l){u=u.updateQueue,l.updateQueue===u&&(l.updateQueue={baseState:u.baseState,firstBaseUpdate:u.firstBaseUpdate,lastBaseUpdate:u.lastBaseUpdate,shared:u.shared,effects:u.effects})}function mn(u,l){return{eventTime:u,lane:l,tag:0,payload:null,callback:null,next:null}}function N0(u,l,f){var r=u.updateQueue;if(r===null)return null;if(r=r.shared,(cl&2)!==0){var n=r.pending;return n===null?l.next=l:(l.next=n.next,n.next=l),r.pending=l,Sn(u,f)}return n=r.interleaved,n===null?(l.next=l,F4(r)):(l.next=n.next,n.next=l),r.interleaved=l,Sn(u,f)}function I_(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,e8(u,f)}}function lF(u,l){var{updateQueue:f,alternate:r}=u;if(r!==null&&(r=r.updateQueue,f===r)){var n=null,i=null;if(f=f.firstBaseUpdate,f!==null){do{var t={eventTime:f.eventTime,lane:f.lane,tag:f.tag,payload:f.payload,callback:f.callback,next:null};i===null?n=i=t:i=i.next=t,f=f.next}while(f!==null);i===null?n=i=l:i=i.next=l}else n=i=l;f={baseState:r.baseState,firstBaseUpdate:n,lastBaseUpdate:i,shared:r.shared,effects:r.effects},u.updateQueue=f;return}u=f.lastBaseUpdate,u===null?f.firstBaseUpdate=l:u.next=l,f.lastBaseUpdate=l}function J$(u,l,f,r){var n=u.updateQueue;c0=!1;var{firstBaseUpdate:i,lastBaseUpdate:t}=n,y=n.shared.pending;if(y!==null){n.shared.pending=null;var c=y,$=c.next;c.next=null,t===null?i=$:t.next=$,t=c;var A=u.alternate;A!==null&&(A=A.updateQueue,y=A.lastBaseUpdate,y!==t&&(y===null?A.firstBaseUpdate=$:y.next=$,A.lastBaseUpdate=c))}if(i!==null){var j=n.baseState;t=0,A=$=c=null,y=i;do{var{lane:F,eventTime:J}=y;if((r&F)===F){A!==null&&(A=A.next={eventTime:J,lane:0,tag:y.tag,payload:y.payload,callback:y.callback,next:null});u:{var Q=u,W=y;switch(F=l,J=f,W.tag){case 1:if(Q=W.payload,typeof Q==="function"){j=Q.call(J,j,F);break u}j=Q;break u;case 3:Q.flags=Q.flags&-65537|128;case 0:if(Q=W.payload,F=typeof Q==="function"?Q.call(J,j,F):Q,F===null||F===void 0)break u;j=Vl({},j,F);break u;case 2:c0=!0}}y.callback!==null&&y.lane!==0&&(u.flags|=64,F=n.effects,F===null?n.effects=[y]:F.push(y))}else J={eventTime:J,lane:F,tag:y.tag,payload:y.payload,callback:y.callback,next:null},A===null?($=A=J,c=j):A=A.next=J,t|=F;if(y=y.next,y===null)if(y=n.shared.pending,y===null)break;else F=y,y=F.next,F.next=null,n.lastBaseUpdate=F,n.shared.pending=null}while(1);if(A===null&&(c=j),n.baseState=c,n.firstBaseUpdate=$,n.lastBaseUpdate=A,l=n.shared.interleaved,l!==null){n=l;do t|=n.lane,n=n.next;while(n!==l)}else i===null&&(n.shared.lanes=0);Ki|=t,u.lanes=t,u.memoizedState=j}}function fF(u,l,f){if(u=l.effects,l.effects=null,u!==null)for(l=0;lf?f:4,u(!0);var r=b6.transition;b6.transition={};try{u(!1),l()}finally{jl=f,b6.transition=r}}function bU(){return Zr().memoizedState}function aG(u,l,f){var r=w0(u);if(f={lane:r,action:f,hasEagerState:!1,eagerState:null,next:null},vU(u))kU(l,f);else if(f=EU(u,l,f,r),f!==null){var n=pf();kr(f,u,r,n),IU(f,l,r)}}function oG(u,l,f){var r=w0(u),n={lane:r,action:f,hasEagerState:!1,eagerState:null,next:null};if(vU(u))kU(l,n);else{var i=u.alternate;if(u.lanes===0&&(i===null||i.lanes===0)&&(i=l.lastRenderedReducer,i!==null))try{var t=l.lastRenderedState,y=i(t,f);if(n.hasEagerState=!0,n.eagerState=y,Ir(y,t)){var c=l.interleaved;c===null?(n.next=n,F4(l)):(n.next=c.next,c.next=n),l.interleaved=n;return}}catch($){}finally{}f=EU(u,l,n,r),f!==null&&(n=pf(),kr(f,u,r,n),IU(f,l,r))}}function vU(u){var l=u.alternate;return u===Bl||l!==null&&l===Bl}function kU(u,l){j1=N$=!0;var f=u.pending;f===null?l.next=l:(l.next=f.next,f.next=l),u.pending=l}function IU(u,l,f){if((f&4194240)!==0){var r=l.lanes;r&=u.pendingLanes,f|=r,l.lanes=f,e8(u,f)}}var q$={readContext:Or,useCallback:Wf,useContext:Wf,useEffect:Wf,useImperativeHandle:Wf,useInsertionEffect:Wf,useLayoutEffect:Wf,useMemo:Wf,useReducer:Wf,useRef:Wf,useState:Wf,useDebugValue:Wf,useDeferredValue:Wf,useTransition:Wf,useMutableSource:Wf,useSyncExternalStore:Wf,useId:Wf,unstable_isNewReconciler:!1},dG={readContext:Or,useCallback:function(u,l){return cn().memoizedState=[u,l===void 0?null:l],u},useContext:Or,useEffect:nF,useImperativeHandle:function(u,l,f){return f=f!==null&&f!==void 0?f.concat([u]):null,s_(4194308,4,CU.bind(null,l,u),f)},useLayoutEffect:function(u,l){return s_(4194308,4,u,l)},useInsertionEffect:function(u,l){return s_(4,2,u,l)},useMemo:function(u,l){var f=cn();return l=l===void 0?null:l,u=u(),f.memoizedState=[u,l],u},useReducer:function(u,l,f){var r=cn();return l=f!==void 0?f(l):l,r.memoizedState=r.baseState=l,u={pending:null,interleaved:null,lanes:0,dispatch:null,lastRenderedReducer:u,lastRenderedState:l},r.queue=u,u=u.dispatch=aG.bind(null,Bl,u),[r.memoizedState,u]},useRef:function(u){var l=cn();return u={current:u},l.memoizedState=u},useState:rF,useDebugValue:T4,useDeferredValue:function(u){return cn().memoizedState=u},useTransition:function(){var u=rF(!1),l=u[0];return u=sG.bind(null,u[1]),cn().memoizedState=u,[l,u]},useMutableSource:function(){},useSyncExternalStore:function(u,l,f){var r=Bl,n=cn();if(Ol){if(f===void 0)throw Error(Ju(407));f=f()}else{if(f=l(),_f===null)throw Error(Ju(349));(Ti&30)!==0||VU(r,l,f)}n.memoizedState=f;var i={value:f,getSnapshot:l};return n.queue=i,nF(DU.bind(null,r,i,u),[u]),r.flags|=2048,V1(9,mU.bind(null,r,i,f,l),void 0,null),f},useId:function(){var u=cn(),l=_f.identifierPrefix;if(Ol){var f=Vn,r=Bn;f=(r&~(1<<32-vr(r)-1)).toString(32)+f,l=":"+l+"R"+f,f=H1++,0",u=u.removeChild(u.firstChild)):typeof r.is==="string"?u=t.createElement(f,{is:r.is}):(u=t.createElement(f),f==="select"&&(t=u,r.multiple?t.multiple=!0:r.size&&(t.size=r.size))):u=t.createElementNS(u,f),u[_n]=l,u[K1]=r,gU(u,l,!1,!1),l.stateNode=u;u:{switch(t=l8(f,r),f){case"dialog":Kl("cancel",u),Kl("close",u),n=r;break;case"iframe":case"object":case"embed":Kl("load",u),n=r;break;case"video":case"audio":for(n=0;nYt&&(l.flags|=128,r=!0,gy(i,!1),l.lanes=4194304)}else{if(!r)if(u=$$(t),u!==null){if(l.flags|=128,r=!0,f=u.updateQueue,f!==null&&(l.updateQueue=f,l.flags|=4),gy(i,!0),i.tail===null&&i.tailMode==="hidden"&&!t.alternate&&!El)return Wf(l),null}else 2*Cl()-i.renderingStartTime>Yt&&f!==1073741824&&(l.flags|=128,r=!0,gy(i,!1),l.lanes=4194304);i.isBackwards?(t.sibling=l.child,l.child=t):(f=i.last,f!==null?f.sibling=t:l.child=t,i.last=t)}if(i.tail!==null)return l=i.tail,i.rendering=l,i.tail=l.sibling,i.renderingStartTime=Cl(),l.sibling=null,f=Hl.current,wl(Hl,r?f&1|2:f&1),l;return Wf(l),null;case 22:case 23:return L4(),r=l.memoizedState!==null,u!==null&&u.memoizedState!==null!==r&&(l.flags|=8192),r&&(l.mode&1)!==0?(cr&1073741824)!==0&&(Wf(l),l.subtreeFlags&6&&(l.flags|=8192)):Wf(l),null;case 24:return null;case 25:return null}throw Error(Ju(156,l.tag))}function sG(u,l){switch(l4(l),l.tag){case 1:return kf(l.type)&&r$(),u=l.flags,u&65536?(l.flags=u&-65537|128,l):null;case 3:return St(),Gl(vf),Gl(Tf),$4(),u=l.flags,(u&65536)!==0&&(u&128)===0?(l.flags=u&-65537|128,l):null;case 5:return _4(l),null;case 13:if(Gl(Hl),u=l.memoizedState,u!==null&&u.dehydrated!==null){if(l.alternate===null)throw Error(Ju(340));Dt()}return u=l.flags,u&65536?(l.flags=u&-65537|128,l):null;case 19:return Gl(Hl),null;case 4:return St(),null;case 10:return i4(l.type._context),null;case 22:case 23:return L4(),null;case 24:return null;default:return null}}var S_=!1,Lf=!1,aG=typeof WeakSet==="function"?WeakSet:Set,Hu=null;function Kt(u,l){var f=u.ref;if(f!==null)if(typeof f==="function")try{f(null)}catch(r){pl(u,l,r)}else f.current=null}function B8(u,l,f){try{f()}catch(r){pl(u,l,r)}}var tF=!1;function oG(u,l){if(F8=e_,u=lU(),e8(u)){if("selectionStart"in u)var f={start:u.selectionStart,end:u.selectionEnd};else u:{f=(f=u.ownerDocument)&&f.defaultView||window;var r=f.getSelection&&f.getSelection();if(r&&r.rangeCount!==0){f=r.anchorNode;var{anchorOffset:n,focusNode:i}=r;r=r.focusOffset;try{f.nodeType,i.nodeType}catch(w){f=null;break u}var t=0,y=-1,c=-1,$=0,A=0,j=u,F=null;l:for(;;){for(var J;;){if(j!==f||n!==0&&j.nodeType!==3||(y=t+n),j!==i||r!==0&&j.nodeType!==3||(c=t+r),j.nodeType===3&&(t+=j.nodeValue.length),(J=j.firstChild)===null)break;F=j,j=J}for(;;){if(j===u)break l;if(F===f&&++$===n&&(y=t),F===i&&++A===r&&(c=t),(J=j.nextSibling)!==null)break;j=F,F=j.parentNode}j=J}f=y===-1||c===-1?null:{start:y,end:c}}else f=null}f=f||{start:0,end:0}}else f=null;U8={focusedElem:u,selectionRange:f},e_=!1;for(Hu=l;Hu!==null;)if(l=Hu,u=l.child,(l.subtreeFlags&1028)!==0&&u!==null)u.return=l,Hu=u;else for(;Hu!==null;){l=Hu;try{var Q=l.alternate;if((l.flags&1024)!==0)switch(l.tag){case 0:case 11:case 15:break;case 1:if(Q!==null){var{memoizedProps:W,memoizedState:L}=Q,U=l.stateNode,q=U.getSnapshotBeforeUpdate(l.elementType===l.type?W:hr(l.type,W),L);U.__reactInternalSnapshotBeforeUpdate=q}break;case 3:var N=l.stateNode.containerInfo;N.nodeType===1?N.textContent="":N.nodeType===9&&N.documentElement&&N.removeChild(N.documentElement);break;case 5:case 6:case 4:case 17:break;default:throw Error(Ju(163))}}catch(w){pl(l,l.return,w)}if(u=l.sibling,u!==null){u.return=l.return,Hu=u;break}Hu=l.return}return Q=tF,tF=!1,Q}function $1(u,l,f){var r=l.updateQueue;if(r=r!==null?r.lastEffect:null,r!==null){var n=r=r.next;do{if((n.tag&u)===u){var i=n.destroy;n.destroy=void 0,i!==void 0&&B8(l,f,i)}n=n.next}while(n!==r)}}function E$(u,l){if(l=l.updateQueue,l=l!==null?l.lastEffect:null,l!==null){var f=l=l.next;do{if((f.tag&u)===u){var r=f.create;f.destroy=r()}f=f.next}while(f!==l)}}function m8(u){var l=u.ref;if(l!==null){var f=u.stateNode;switch(u.tag){case 5:u=f;break;default:u=f}typeof l==="function"?l(u):l.current=u}}function oU(u){var l=u.alternate;l!==null&&(u.alternate=null,oU(l)),u.child=null,u.deletions=null,u.sibling=null,u.tag===5&&(l=u.stateNode,l!==null&&(delete l[_n],delete l[K1],delete l[N8],delete l[DG],delete l[pG])),u.stateNode=null,u.return=null,u.dependencies=null,u.memoizedProps=null,u.memoizedState=null,u.pendingProps=null,u.stateNode=null,u.updateQueue=null}function dU(u){return u.tag===5||u.tag===3||u.tag===4}function yF(u){u:for(;;){for(;u.sibling===null;){if(u.return===null||dU(u.return))return null;u=u.return}u.sibling.return=u.return;for(u=u.sibling;u.tag!==5&&u.tag!==6&&u.tag!==18;){if(u.flags&2)continue u;if(u.child===null||u.tag===4)continue u;else u.child.return=u,u=u.child}if(!(u.flags&2))return u.stateNode}}function V8(u,l,f){var r=u.tag;if(r===5||r===6)u=u.stateNode,l?f.nodeType===8?f.parentNode.insertBefore(u,l):f.insertBefore(u,l):(f.nodeType===8?(l=f.parentNode,l.insertBefore(u,f)):(l=f,l.appendChild(u)),f=f._reactRootContainer,f!==null&&f!==void 0||l.onclick!==null||(l.onclick=f$));else if(r!==4&&(u=u.child,u!==null))for(V8(u,l,f),u=u.sibling;u!==null;)V8(u,l,f),u=u.sibling}function D8(u,l,f){var r=u.tag;if(r===5||r===6)u=u.stateNode,l?f.insertBefore(u,l):f.appendChild(u);else if(r!==4&&(u=u.child,u!==null))for(D8(u,l,f),u=u.sibling;u!==null;)D8(u,l,f),u=u.sibling}var Af=null,xr=!1;function t0(u,l,f){for(f=f.child;f!==null;)eU(u,l,f),f=f.sibling}function eU(u,l,f){if($n&&typeof $n.onCommitFiberUnmount==="function")try{$n.onCommitFiberUnmount(q$,f)}catch(y){}switch(f.tag){case 5:Lf||Kt(f,l);case 6:var r=Af,n=xr;Af=null,t0(u,l,f),Af=r,xr=n,Af!==null&&(xr?(u=Af,f=f.stateNode,u.nodeType===8?u.parentNode.removeChild(f):u.removeChild(f)):Af.removeChild(f.stateNode));break;case 18:Af!==null&&(xr?(u=Af,f=f.stateNode,u.nodeType===8?p6(u.parentNode,f):u.nodeType===1&&p6(u,f),q1(u)):p6(Af,f.stateNode));break;case 4:r=Af,n=xr,Af=f.stateNode.containerInfo,xr=!0,t0(u,l,f),Af=r,xr=n;break;case 0:case 11:case 14:case 15:if(!Lf&&(r=f.updateQueue,r!==null&&(r=r.lastEffect,r!==null))){n=r=r.next;do{var i=n,t=i.destroy;i=i.tag,t!==void 0&&((i&2)!==0?B8(f,l,t):(i&4)!==0&&B8(f,l,t)),n=n.next}while(n!==r)}t0(u,l,f);break;case 1:if(!Lf&&(Kt(f,l),r=f.stateNode,typeof r.componentWillUnmount==="function"))try{r.props=f.memoizedProps,r.state=f.memoizedState,r.componentWillUnmount()}catch(y){pl(f,l,y)}t0(u,l,f);break;case 21:t0(u,l,f);break;case 22:f.mode&1?(Lf=(r=Lf)||f.memoizedState!==null,t0(u,l,f),Lf=r):t0(u,l,f);break;default:t0(u,l,f)}}function cF(u){var l=u.updateQueue;if(l!==null){u.updateQueue=null;var f=u.stateNode;f===null&&(f=u.stateNode=new aG),l.forEach(function(r){var n=tz.bind(null,u,r);f.has(r)||(f.add(r),r.then(n,n))})}}function Rr(u,l){var f=l.deletions;if(f!==null)for(var r=0;rn&&(n=t),r&=~i}if(r=n,r=Cl()-r,r=(120>r?120:480>r?480:1080>r?1080:1920>r?1920:3000>r?3000:4320>r?4320:1960*eG(r/1960))-r,10u?16:u,j0===null)var r=!1;else{if(u=j0,j0=null,J$=0,(cl&6)!==0)throw Error(Ju(331));var n=cl;cl|=4;for(Hu=u.current;Hu!==null;){var i=Hu,t=i.child;if((Hu.flags&16)!==0){var y=i.deletions;if(y!==null){for(var c=0;cCl()-w4?Ni(u,0):q4|=f),If(u,l)}function yJ(u,l){l===0&&((u.mode&1)===0?l=1:(l=E_,E_<<=1,(E_&130023424)===0&&(E_=4194304)));var f=Vf();u=pn(u,l),u!==null&&(B1(u,l,f),If(u,f))}function iz(u){var l=u.memoizedState,f=0;l!==null&&(f=l.retryLane),yJ(u,f)}function tz(u,l){var f=0;switch(u.tag){case 13:var{stateNode:r,memoizedState:n}=u;n!==null&&(f=n.retryLane);break;case 19:r=u.stateNode;break;default:throw Error(Ju(314))}r!==null&&r.delete(l),yJ(u,f)}var cJ;cJ=function(u,l,f){if(u!==null)if(u.memoizedProps!==l.pendingProps||vf.current)bf=!0;else{if((u.lanes&f)===0&&(l.flags&128)===0)return bf=!1,IG(u,l,f);bf=(u.flags&131072)!==0?!0:!1}else bf=!1,El&&(l.flags&1048576)!==0&&jU(l,t$,l.index);switch(l.lanes=0,l.tag){case 2:var r=l.type;b_(u,l),u=l.pendingProps;var n=Vt(l,Tf.current);Ht(l,f),n=j4(null,l,r,u,n,f);var i=F4();return l.flags|=1,typeof n==="object"&&n!==null&&typeof n.render==="function"&&n.$$typeof===void 0?(l.tag=1,l.memoizedState=null,l.updateQueue=null,kf(r)?(i=!0,n$(l)):i=!1,l.memoizedState=n.state!==null&&n.state!==void 0?n.state:null,y4(l),n.updater=z$,l.stateNode=n,n._reactInternals=l,K8(l,r,u,f),l=E8(null,l,r,!0,i,f)):(l.tag=0,El&&i&&u4(l),mf(null,l,n,f),l=l.child),l;case 16:r=l.elementType;u:{switch(b_(u,l),u=l.pendingProps,n=r._init,r=n(r._payload),l.type=r,n=l.tag=cz(r),u=hr(r,u),n){case 0:l=z8(null,l,r,u,f);break u;case 1:l=rF(null,l,r,u,f);break u;case 11:l=lF(null,l,r,u,f);break u;case 14:l=fF(null,l,r,hr(r.type,u),f);break u}throw Error(Ju(306,r,""))}return l;case 0:return r=l.type,n=l.pendingProps,n=l.elementType===r?n:hr(r,n),z8(u,l,r,n,f);case 1:return r=l.type,n=l.pendingProps,n=l.elementType===r?n:hr(r,n),rF(u,l,r,n,f);case 3:u:{if(vU(l),u===null)throw Error(Ju(387));r=l.pendingProps,i=l.memoizedState,n=i.element,qU(u,l),_$(l,r,null,f);var t=l.memoizedState;if(r=t.element,i.isDehydrated)if(i={element:r,isDehydrated:!1,cache:t.cache,pendingSuspenseBoundaries:t.pendingSuspenseBoundaries,transitions:t.transitions},l.updateQueue.baseState=i,l.memoizedState=i,l.flags&256){n=Xt(Error(Ju(423)),l),l=nF(u,l,r,f,n);break u}else if(r!==n){n=Xt(Error(Ju(424)),l),l=nF(u,l,r,f,n);break u}else for(_r=Q0(l.stateNode.containerInfo.firstChild),$r=l,El=!0,br=null,f=QU(l,null,r,f),l.child=f;f;)f.flags=f.flags&-3|4096,f=f.sibling;else{if(Dt(),r===n){l=Sn(u,l,f);break u}mf(u,l,r,f)}l=l.child}return l;case 5:return wU(l),u===null&&W8(l),r=l.type,n=l.pendingProps,i=u!==null?u.memoizedProps:null,t=n.children,J8(r,n)?t=null:i!==null&&J8(r,i)&&(l.flags|=32),bU(u,l),mf(u,l,t,f),l.child;case 6:return u===null&&W8(l),null;case 13:return kU(u,l,f);case 4:return c4(l,l.stateNode.containerInfo),r=l.pendingProps,u===null?l.child=pt(l,null,r,f):mf(u,l,r,f),l.child;case 11:return r=l.type,n=l.pendingProps,n=l.elementType===r?n:hr(r,n),lF(u,l,r,n,f);case 7:return mf(u,l,l.pendingProps,f),l.child;case 8:return mf(u,l,l.pendingProps.children,f),l.child;case 12:return mf(u,l,l.pendingProps.children,f),l.child;case 10:u:{if(r=l.type._context,n=l.pendingProps,i=l.memoizedProps,t=n.value,wl(y$,r._currentValue),r._currentValue=t,i!==null)if(Ir(i.value,t)){if(i.children===n.children&&!vf.current){l=Sn(u,l,f);break u}}else for(i=l.child,i!==null&&(i.return=l);i!==null;){var y=i.dependencies;if(y!==null){t=i.child;for(var c=y.firstContext;c!==null;){if(c.context===r){if(i.tag===1){c=mn(-1,f&-f),c.tag=2;var $=i.updateQueue;if($!==null){$=$.shared;var A=$.pending;A===null?c.next=c:(c.next=A.next,A.next=c),$.pending=c}}i.lanes|=f,c=i.alternate,c!==null&&(c.lanes|=f),L8(i.return,f,l),y.lanes|=f;break}c=c.next}}else if(i.tag===10)t=i.type===l.type?null:i.child;else if(i.tag===18){if(t=i.return,t===null)throw Error(Ju(341));t.lanes|=f,y=t.alternate,y!==null&&(y.lanes|=f),L8(t,f,l),t=i.sibling}else t=i.child;if(t!==null)t.return=i;else for(t=i;t!==null;){if(t===l){t=null;break}if(i=t.sibling,i!==null){i.return=t.return,t=i;break}t=t.return}i=t}mf(u,l,n.children,f),l=l.child}return l;case 9:return n=l.type,r=l.pendingProps.children,Ht(l,f),n=Zr(n),r=r(n),l.flags|=1,mf(u,l,r,f),l.child;case 14:return r=l.type,n=hr(r,l.pendingProps),n=hr(r.type,n),fF(u,l,r,n,f);case 15:return hU(u,l,l.type,l.pendingProps,f);case 17:return r=l.type,n=l.pendingProps,n=l.elementType===r?n:hr(r,n),b_(u,l),l.tag=1,kf(r)?(u=!0,n$(l)):u=!1,Ht(l,f),CU(l,r,n),K8(l,r,n,f),E8(null,l,r,!0,u,f);case 19:return IU(u,l,f);case 22:return xU(u,l,f)}throw Error(Ju(156,l.tag))};function _J(u,l){return XF(u,l)}function yz(u,l,f,r){this.tag=u,this.key=f,this.sibling=this.child=this.return=this.stateNode=this.type=this.elementType=null,this.index=0,this.ref=null,this.pendingProps=l,this.dependencies=this.memoizedState=this.updateQueue=this.memoizedProps=null,this.mode=r,this.subtreeFlags=this.flags=0,this.deletions=null,this.childLanes=this.lanes=0,this.alternate=null}function Er(u,l,f,r){return new yz(u,l,f,r)}function K4(u){return u=u.prototype,!(!u||!u.isReactComponent)}function cz(u){if(typeof u==="function")return K4(u)?1:0;if(u!==void 0&&u!==null){if(u=u.$$typeof,u===h8)return 11;if(u===x8)return 14}return 2}function W0(u,l){var f=u.alternate;return f===null?(f=Er(u.tag,l,u.key,u.mode),f.elementType=u.elementType,f.type=u.type,f.stateNode=u.stateNode,f.alternate=u,u.alternate=f):(f.pendingProps=l,f.type=u.type,f.flags=0,f.subtreeFlags=0,f.deletions=null),f.flags=u.flags&14680064,f.childLanes=u.childLanes,f.lanes=u.lanes,f.child=u.child,f.memoizedProps=u.memoizedProps,f.memoizedState=u.memoizedState,f.updateQueue=u.updateQueue,l=u.dependencies,f.dependencies=l===null?null:{lanes:l.lanes,firstContext:l.firstContext},f.sibling=u.sibling,f.index=u.index,f.ref=u.ref,f}function I_(u,l,f,r,n,i){var t=2;if(r=u,typeof u==="function")K4(u)&&(t=1);else if(typeof u==="string")t=5;else u:switch(u){case Ut:return qi(f.children,n,i,l);case R8:t=8,n|=8;break;case v6:return u=Er(12,f,l,n|2),u.elementType=v6,u.lanes=i,u;case k6:return u=Er(13,f,l,n),u.elementType=k6,u.lanes=i,u;case I6:return u=Er(19,f,l,n),u.elementType=I6,u.lanes=i,u;case wF:return Z$(f,n,i,l);default:if(typeof u==="object"&&u!==null)switch(u.$$typeof){case NF:t=10;break u;case qF:t=9;break u;case h8:t=11;break u;case x8:t=14;break u;case y0:t=16,r=null;break u}throw Error(Ju(130,u==null?u:typeof u,""))}return l=Er(t,f,l,n),l.elementType=u,l.type=r,l.lanes=i,l}function qi(u,l,f,r){return u=Er(7,u,r,l),u.lanes=f,u}function Z$(u,l,f,r){return u=Er(22,u,r,l),u.elementType=wF,u.lanes=f,u.stateNode={isHidden:!1},u}function h6(u,l,f){return u=Er(6,u,null,l),u.lanes=f,u}function x6(u,l,f){return l=Er(4,u.children!==null?u.children:[],u.key,l),l.lanes=f,l.stateNode={containerInfo:u.containerInfo,pendingChildren:null,implementation:u.implementation},l}function _z(u,l,f,r,n){this.tag=l,this.containerInfo=u,this.finishedWork=this.pingCache=this.current=this.pendingChildren=null,this.timeoutHandle=-1,this.callbackNode=this.pendingContext=this.context=null,this.callbackPriority=0,this.eventTimes=O6(0),this.expirationTimes=O6(-1),this.entangledLanes=this.finishedLanes=this.mutableReadLanes=this.expiredLanes=this.pingedLanes=this.suspendedLanes=this.pendingLanes=0,this.entanglements=O6(0),this.identifierPrefix=r,this.onRecoverableError=n,this.mutableSourceEagerHydrationData=null}function G4(u,l,f,r,n,i,t,y,c){return u=new _z(u,l,f,y,c),l===1?(l=1,i===!0&&(l|=8)):l=0,i=Er(3,null,null,l),u.current=i,i.stateNode=u,i.memoizedState={element:r,isDehydrated:f,cache:null,transitions:null,pendingSuspenseBoundaries:null},y4(i),u}function $z(u,l,f){var r=3{function UJ(){if(typeof __REACT_DEVTOOLS_GLOBAL_HOOK__>"u"||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!=="function")return;try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(UJ)}catch(u){console.error(u)}}UJ(),JJ.exports=FJ()});var NJ=yr((H4)=>{var QJ=Z4();H4.createRoot=QJ.createRoot,H4.hydrateRoot=QJ.hydrateRoot;var Jz});var TN=yr((w3)=>{var SZ=Fl(),XZ=Symbol.for("react.element"),YZ=Symbol.for("react.fragment"),PZ=Object.prototype.hasOwnProperty,CZ=SZ.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner,MZ={key:!0,ref:!0,__self:!0,__source:!0};function LN(u,l,f){var r,n={},i=null,t=null;f!==void 0&&(i=""+f),l.key!==void 0&&(i=""+l.key),l.ref!==void 0&&(t=l.ref);for(r in l)PZ.call(l,r)&&!MZ.hasOwnProperty(r)&&(n[r]=l[r]);if(u&&u.defaultProps)for(r in l=u.defaultProps,l)n[r]===void 0&&(n[r]=l[r]);return{$$typeof:XZ,type:u,key:i,ref:t,props:n,_owner:CZ.current}}w3.Fragment=YZ;w3.jsx=LN;w3.jsxs=LN});var GN=yr((IP,KN)=>{KN.exports=TN()});var lw=yr((uw)=>{var wy=Fl();function rV(u,l){return u===l&&(u!==0||1/u===1/l)||u!==u&&l!==l}var nV=typeof Object.is==="function"?Object.is:rV,iV=wy.useState,tV=wy.useEffect,yV=wy.useLayoutEffect,cV=wy.useDebugValue;function _V(u,l){var f=l(),r=iV({inst:{value:f,getSnapshot:l}}),n=r[0].inst,i=r[1];return yV(function(){n.value=f,n.getSnapshot=l,K9(n)&&i({inst:n})},[u,f,l]),tV(function(){return K9(n)&&i({inst:n}),u(function(){K9(n)&&i({inst:n})})},[u]),cV(f),f}function K9(u){var l=u.getSnapshot;u=u.value;try{var f=l();return!nV(u,f)}catch(r){return!0}}function $V(u,l){return l()}var AV=typeof window>"u"||typeof window.document>"u"||typeof window.document.createElement>"u"?$V:_V;uw.useSyncExternalStore=wy.useSyncExternalStore!==void 0?wy.useSyncExternalStore:AV});var rw=yr((Mb,fw)=>{fw.exports=lw()});var iw=yr((nw)=>{var jA=Fl(),jV=rw();function FV(u,l){return u===l&&(u!==0||1/u===1/l)||u!==u&&l!==l}var UV=typeof Object.is==="function"?Object.is:FV,JV=jV.useSyncExternalStore,QV=jA.useRef,NV=jA.useEffect,qV=jA.useMemo,wV=jA.useDebugValue;nw.useSyncExternalStoreWithSelector=function(u,l,f,r,n){var i=QV(null);if(i.current===null){var t={hasValue:!1,value:null};i.current=t}else t=i.current;i=qV(function(){function c(J){if(!$){if($=!0,A=J,J=r(J),n!==void 0&&t.hasValue){var Q=t.value;if(n(Q,J))return j=Q}return j=J}if(Q=j,UV(A,J))return Q;var W=r(J);if(n!==void 0&&n(Q,W))return A=J,Q;return A=J,j=W}var $=!1,A,j,F=f===void 0?null:f;return[function(){return c(l())},F===null?void 0:function(){return c(F())}]},[l,f,r,n]);var y=JV(u,i[0],i[1]);return NV(function(){t.hasValue=!0,t.value=y},[y]),wV(y),y}});var yw=yr((hb,tw)=>{tw.exports=iw()});var li=Cu(Fl(),1);var U_="北京时间";var $K={timeZone:"Asia/Shanghai",hour12:!1},AK={timeZone:"Asia/Shanghai",hour12:!1},jK=new Intl.DateTimeFormat("en-CA",{timeZone:"Asia/Shanghai",year:"numeric",month:"2-digit",day:"2-digit",hour:"2-digit",minute:"2-digit",hourCycle:"h23"});function A6(u){if(u===null||u===void 0||u==="")return null;let l=u instanceof Date?u:new Date(u);return Number.isNaN(l.getTime())?null:l}function uj(u){let l=A6(u);if(!l)return null;return jK.formatToParts(l).reduce((f,r)=>{if(r.type!=="literal")f[r.type]=r.value;return f},{})}function wu(u){let l=A6(u);return l?l.toLocaleString("zh-CN",$K):"--"}function yl(u){let l=A6(u);return l?l.toLocaleTimeString("zh-CN",AK):"--"}function j6(u){let l=uj(u);if(!l)return"";let f=l.hour==="24"?"00":l.hour;return`${l.year}-${l.month}-${l.day}T${f}:${l.minute}`}function lj(u=new Date){let l=uj(u);if(!l)return"";return`${l.year}-${l.month}-${l.day}`}function fj(u){if(!u)return null;let l=/^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2})(?::(\d{2}))?$/.exec(u);if(!l)return null;let[,f,r,n,i,t,y="00"]=l,c=Date.UTC(Number(f),Number(r)-1,Number(n),Number(i)-8,Number(t),Number(y)),$=new Date(c),A=j6($);return Number.isNaN($.getTime())||A!==`${f}-${r}-${n}T${i}:${t}`?null:$.toISOString()}var pL=Cu(NJ(),1);var S$=Cu(Fl(),1);var qJ=Cu(Fl(),1),p1=qJ.default.createElement;function Qz({active:u=!0,label:l="正在加载"}){if(!u)return null;return p1("span",{className:"loading-spinner-indicator",role:"status","aria-label":l,title:l,"data-testid":"loading-title-indicator"},p1("span",{className:"loading-spinner-ring","aria-hidden":!0}))}function rl({title:u,children:l,loading:f,level:r=2,className:n="",label:i="正在加载"}){return p1(r===3?"h3":"h2",{className:`loading-title ${f?"is-loading":""} ${n}`.trim()},p1("span",{className:"loading-title-text"},l??u),p1(Qz,{active:Boolean(f),label:i}))}class Mt extends Error{unideskRequestError=!0;meta;constructor(u,l){super(u);this.name="UniDeskRequestError",this.meta=l}}function Nz(u){return new Promise((l)=>setTimeout(l,u))}function Y1(u,l="操作失败"){return u instanceof Error?u.message:String(u||l)}function D$(u,l=500){if(u===null||u===void 0)return"";let f=typeof u==="string"?u:JSON.stringify(u),r=String(f||"").replace(/\s+/gu," ").trim();return r.length>l?`${r.slice(0,l)}...`:r}function qz(u){try{let l=typeof location<"u"&&location.origin?location.origin:"http://localhost";return new URL(u,l).toString()}catch{return u}}function wJ(u){return String(u.method||"GET").toUpperCase()}function wz(u){if(u===null||u===void 0)return!1;if(typeof u!=="object")return!1;if(typeof Blob<"u"&&u instanceof Blob)return!1;if(typeof FormData<"u"&&u instanceof FormData)return!1;if(typeof URLSearchParams<"u"&&u instanceof URLSearchParams)return!1;if(typeof ArrayBuffer<"u"&&u instanceof ArrayBuffer)return!1;return!0}function WJ(u){let l=new Headers(u.headers||{}),f=wz(u.body)?JSON.stringify(u.body):u.body;if(f&&!l.has("content-type")&&typeof f==="string")l.set("content-type","application/json");return{...u,credentials:u.credentials||"same-origin",body:f,headers:l}}function LJ(u){if(u?.error&&typeof u.error==="object"&&typeof u.error.message==="string")return u.error.message;if(typeof u?.error==="string")return u.error;if(typeof u?.message==="string")return u.message;if(typeof u?.detail==="string")return u.detail;return""}function Wz(u,l){if(!u||typeof u!=="object"||Array.isArray(u))return!1;return l.some((f)=>f!==!1&&u[f]===!1)}function S1(u,l,f,r,n={}){return{kind:u,method:f,url:qz(l),occurredAt:r.toISOString(),...n}}function X1(u,l){if(!u)return"请求失败";return`HTTP ${u}${l?` ${l}`:""}`}function TJ(u){try{return{body:u?JSON.parse(u):null,parseError:""}}catch(l){return{body:{text:u},parseError:Y1(l,"parse failed")}}}async function Eu(u,l={},f=0){let{failureFields:r=["ok"],strictJson:n=!1,retryInvalidJson:i=0,retryDelayMs:t=120,invalidJsonPrefix:y="服务返回了无效 JSON",invalidJsonPreview:c=!1,responsePreviewLength:$=500,...A}=l,j=wJ(A),F=new Date,J;try{J=await fetch(u,WJ(A))}catch(L){let U=Y1(L,"网络请求失败");throw new Mt(U,S1("network",u,j,F,{upstreamMessage:U}))}let Q=await J.text(),W=TJ(Q);if(W.parseError){if(n&&j==="GET"&&f=300)?X1(u.meta.status,u.meta.statusText):"应用请求失败",i=u.meta.status?X1(u.meta.status):"",t=(c)=>!c||c===n||c===i,y=!t(u.message)?u.message:t(u.meta.upstreamMessage)?"":u.meta.upstreamMessage||"";return{title:n,message:y,status:u.meta.status,statusText:u.meta.statusText,method:u.meta.method,url:u.meta.url,occurredAt:Lz(u.meta.occurredAt),responsePreview:u.meta.responsePreview,parseError:u.meta.parseError,structured:!0}}let r=Y1(u,l).split(/\r?\n/u);return{title:r[0]||l,message:r.slice(1).join(` -`),structured:r.length>1}}function Tz(u,l="操作失败"){let f=B4(u,l),r=[f.title];if(f.message)r.push(`原因: ${f.message}`);if(f.method||f.url)r.push(`请求: ${[f.method,f.url].filter(Boolean).join(" ")}`);if(f.status)r.push(`状态: ${X1(f.status,f.statusText)}`);if(f.occurredAt)r.push(`时间: ${f.occurredAt}`);if(f.parseError)r.push(`解析错误: ${f.parseError}`);if(f.responsePreview&&f.responsePreview!==f.message)r.push(`响应预览: ${f.responsePreview}`);return r.filter(Boolean).join(` -`)}function Ou(u,l="操作失败"){return GJ(u)?Tz(u,l):Y1(u,l)}var zJ=Cu(Fl(),1);var E0=zJ.default.createElement;function P1(u,l){return l?[E0("dt",{key:`${u}-label`},u),E0("dd",{key:u},l)]:null}function nl({error:u,wide:l=!1,fallback:f="操作失败",className:r=""}){if(!u)return null;let n=B4(u,f),i=[P1("请求",[n.method,n.url].filter(Boolean).join(" ")),P1("状态",n.status?`HTTP ${n.status}${n.statusText?` ${n.statusText}`:""}`:""),P1("时间",n.occurredAt),P1("解析错误",n.parseError),P1("响应预览",n.responsePreview)].filter(Boolean);return E0("div",{className:`form-error unidesk-error${l?" wide":""}${r?` ${r}`:""}`,role:"alert","data-testid":"unidesk-error"},E0("div",{className:"unidesk-error-title"},E0("strong",null,n.title),n.status?E0("span",{className:"unidesk-error-code"},`HTTP ${n.status}`):null),n.message?E0("pre",{className:"unidesk-error-message"},n.message):null,i.length>0?E0("dl",{className:"unidesk-error-details"},i):null)}var jn=Cu(Fl(),1),EJ=jn.default.createContext(null);function OJ({children:u}){let[l,f]=jn.default.useState([]),[r,n]=jn.default.useState(Date.now()),i=jn.default.useCallback((j,F)=>{let Q={id:`notif_${Date.now()}_${Math.random().toString(36).slice(2,8)}`,type:j,message:F,timestamp:Date.now()};f((W)=>{let L=[...W,Q];if(L.length>50)return L.slice(-50);return L})},[]),t=jn.default.useCallback((j)=>{f((F)=>F.filter((J)=>J.id!==j))},[]),y=jn.default.useCallback(()=>{f([]),n(Date.now())},[]),c=jn.default.useMemo(()=>{return l.filter((j)=>j.timestamp>r).length},[l,r]),$=c>0,A={notifications:l,addNotification:i,removeNotification:t,clearNotifications:y,unreadCount:c,hasUnread:$};return Kz(EJ.Provider,{value:A},u)}var Kz=jn.default.createElement;function pf(){let u=jn.default.useContext(EJ);if(!u)throw Error("useNotification must be used within NotificationProvider");return u}var h=S$.default.createElement,{useEffect:p$}=S$.default,Rt=S$.default.useState;function Kf(u,l={}){return Eu(u,{failureFields:["ok","success"],...l})}function Sf(u,l){return`${u}/microservices/baidu-netdisk/proxy${l}`}function Gz(u){let l=Number(u);return Number.isFinite(l)?l.toLocaleString("zh-CN"):"--"}function O0(u){let l=Number(u);if(!Number.isFinite(l)||l<=0)return"--";let f=["B","KB","MB","GB","TB"],r=l,n=0;while(r>=1024&&n{n?.stopPropagation?.(),f(u,l)}},"查看原始JSON")}function xt({title:u,text:l}){return h("div",{className:"empty-state"},h("strong",null,u),h("span",null,l))}function bt({title:u,text:l,href:f,badge:r,testId:n}){return h("a",{className:"doc-link-card",href:f,target:"_blank",rel:"noreferrer","data-testid":n},h("span",null,r||"DOC"),h("strong",null,u),h("p",null,l),h("code",null,f))}function zz(u){return u?.runtime&&typeof u.runtime==="object"&&!Array.isArray(u.runtime)?u.runtime:{}}function Ez(u){return u?.backend&&typeof u.backend==="object"&&!Array.isArray(u.backend)?u.backend:{}}function Oz(u){return u?.repository&&typeof u.repository==="object"&&!Array.isArray(u.repository)?u.repository:{}}function Zz(u){return Array.isArray(u?.files)?u.files:[]}function Hz(u){return Array.isArray(u?.jobs)?u.jobs:[]}function Bz(u,l){if(!u||u===l)return l;let f=u.replace(/\/+$/u,""),r=f.slice(0,f.lastIndexOf("/"))||l;return r.lengthx.id==="baidu-netdisk")||null,[n,i]=Rt({loading:!1,actionLoading:!1,error:"",message:"",health:null,account:null,files:null,transfers:null,logs:null,selfTest:null,refreshedAt:null}),[t,y]=Rt("/"),[c,$]=Rt(null),[A,j]=Rt(""),[F,J]=Rt({localPath:"sample.txt",remotePath:"/sample.txt"}),[Q,W]=Rt({fsId:"",localPath:"downloads/"}),{addNotification:L}=pf(),U=n.health?.baidu?.appRoot||n.account?.rootPath||"/";p$(()=>{J((x)=>{let lu=new Set(["/sample.txt","/apps/UniDeskBaiduNetdisk/sample.txt"]);if(x.remotePath&&!lu.has(x.remotePath))return x;let cu=m4(U,"sample.txt");return x.remotePath===cu?x:{...x,remotePath:cu}})},[U]);async function q(x=t){let cu=await Kf(Sf(f,`/api/files?dir=${encodeURIComponent(x||U)}&limit=100`));i((_u)=>({..._u,files:cu}))}async function N(){let x=await Kf(Sf(f,"/api/transfers?limit=80"));i((lu)=>({...lu,transfers:x}))}async function w(){if(!r)return;i((x)=>({...x,loading:!0,error:"",message:""}));try{let x=await Kf(`${f}/microservices/baidu-netdisk/health`),lu=x?.baidu?.appRoot||U,cu=null,_u=null;if(x?.auth?.loggedIn){cu=await Kf(Sf(f,"/api/account?refresh=1"));let Wu=t&&t.startsWith(lu)?t:lu;y(Wu),_u=await Kf(Sf(f,`/api/files?dir=${encodeURIComponent(Wu)}&limit=100`))}else y(lu);let Fu=await Kf(Sf(f,"/api/transfers?limit=80")),zu=await Kf(Sf(f,"/logs?limit=60"));i((Wu)=>({...Wu,loading:!1,health:x,account:cu?.account||null,files:_u,transfers:Fu,logs:zu,refreshedAt:new Date}))}catch(x){i((lu)=>({...lu,loading:!1,error:Ou(x,"百度网盘服务加载失败")}))}}async function G(){i((x)=>({...x,actionLoading:!0,error:"",message:""}));try{let x=await Kf(Sf(f,"/api/auth/device/start"),{method:"POST",body:{}});$(x.session||null),i((lu)=>({...lu,actionLoading:!1,message:"设备码已生成,请扫码授权"}))}catch(x){i((lu)=>({...lu,actionLoading:!1,error:Ou(x,"创建设备码失败")}))}}async function Z(x=!1){if(!c?.id)return;if(x)i((lu)=>({...lu,actionLoading:!0,error:""}));try{let lu=await Kf(Sf(f,`/api/auth/device/status?sessionId=${encodeURIComponent(c.id)}`));if($(lu.session||null),lu.session?.status==="succeeded")i((cu)=>({...cu,actionLoading:!1,message:"授权成功,正在刷新账号与文件列表"})),await w();else if(x)i((cu)=>({...cu,actionLoading:!1}))}catch(lu){i((cu)=>({...cu,actionLoading:!1,error:Ou(lu,"轮询登录状态失败")}))}}async function H(){i((x)=>({...x,actionLoading:!0,error:"",message:""}));try{await Kf(Sf(f,"/api/auth/logout"),{method:"POST",body:{}}),$(null),i((x)=>({...x,actionLoading:!1,account:null,files:null,message:"本地 token 已清除"})),await w()}catch(x){i((lu)=>({...lu,actionLoading:!1,error:Ou(x,"退出登录失败")}))}}async function E(x){x.preventDefault();let lu=A.trim();if(!lu)return;i((cu)=>({...cu,actionLoading:!0,error:"",message:""}));try{await Kf(Sf(f,"/api/folders"),{method:"POST",body:{path:m4(t,lu)}}),j(""),i((cu)=>({...cu,actionLoading:!1,message:"文件夹已创建"})),await q(t)}catch(cu){i((_u)=>({..._u,actionLoading:!1,error:Ou(cu,"创建文件夹失败")}))}}async function V(x){if(!x)return;i((lu)=>({...lu,actionLoading:!0,error:"",message:""}));try{await Kf(Sf(f,"/api/files/manage"),{method:"POST",body:{opera:"delete",filelist:[{path:x}],async:1}}),i((lu)=>({...lu,actionLoading:!1,message:"删除任务已提交"})),await q(t)}catch(lu){i((cu)=>({...cu,actionLoading:!1,error:Ou(lu,"删除失败")}))}}async function S(x){x.preventDefault(),i((lu)=>({...lu,actionLoading:!0,error:"",message:""}));try{await Kf(Sf(f,"/api/transfers/upload-from-path"),{method:"POST",body:F}),i((lu)=>({...lu,actionLoading:!1,message:"上传任务已入队"})),await N()}catch(lu){i((cu)=>({...cu,actionLoading:!1,error:Ou(lu,"上传任务创建失败")}))}}async function B(x){x.preventDefault(),i((lu)=>({...lu,actionLoading:!0,error:"",message:""}));try{await Kf(Sf(f,"/api/transfers/download-to-path"),{method:"POST",body:Q}),i((lu)=>({...lu,actionLoading:!1,message:"下载任务已入队"})),await N()}catch(lu){i((cu)=>({...cu,actionLoading:!1,error:Ou(lu,"下载任务创建失败")}))}}async function D(x,lu){i((cu)=>({...cu,actionLoading:!0,error:"",message:""}));try{await Kf(Sf(f,`/api/transfers/${encodeURIComponent(x)}/${lu}`),{method:"POST",body:{}}),i((cu)=>({...cu,actionLoading:!1,message:lu==="cancel"?"已请求取消任务":"任务已重新入队"})),await N()}catch(cu){i((_u)=>({..._u,actionLoading:!1,error:Ou(cu,"任务操作失败")}))}}async function X(){i((x)=>({...x,actionLoading:!0,error:"",message:"正在运行上传/下载自测..."}));try{let x=await Kf(Sf(f,"/api/self-test"),{method:"POST",body:{}});i((lu)=>({...lu,actionLoading:!1,selfTest:x,message:`上传/下载自测通过:${x.remotePath||""}`})),await q(t),await N()}catch(x){i((lu)=>({...lu,actionLoading:!1,error:Ou(x,"上传/下载自测失败")}))}}if(p$(()=>{if(!r)return;w();return},[r?.id,r?.runtime?.providerStatus]),p$(()=>{if(!c?.id||c.status!=="pending")return;let x=window.setInterval(()=>void Z(!1),Math.max(5000,Number(c.pollIntervalSeconds||5)*1000));return()=>window.clearInterval(x)},[c?.id,c?.status,c?.pollIntervalSeconds]),p$(()=>{if(!r)return;let x=window.setInterval(()=>void N(),5000);return()=>window.clearInterval(x)},[r?.id]),!r)return h(xt,{title:"Baidu Netdisk 未登记",text:"请在 config.json 的 microservices 中登记用户服务 id=baidu-netdisk"});let O=zz(r),Y=Oz(r),p=Ez(r),v=n.health||{},z=n.account||v.auth?.account||null,P=v.auth||{},k=Zz(n.files),I=Hz(n.transfers),b=z?.quota||{},d=Boolean(P.loggedIn||z),g=Boolean(P.configured);return h("div",{className:"baidu-netdisk-page","data-testid":"baidu-netdisk-page"},h(Oi,{title:"Baidu Netdisk 工作台",eyebrow:"Containerized Storage Gateway",loading:n.loading,actions:h("div",{className:"panel-actions"},h("a",{className:"ghost-btn",href:"/docs/issue/baidu-netdisk-env-setup.md",target:"_blank",rel:"noreferrer","data-testid":"baidu-netdisk-config-doc-link"},"配置文档"),h("button",{type:"button",className:"ghost-btn",onClick:w,disabled:n.loading,"data-testid":"baidu-netdisk-refresh"},n.loading?"刷新中":"刷新"),h(Yn,{title:"Baidu Netdisk 用户服务",data:r,onOpen:l,testId:"raw-baidu-netdisk-service"}))},h("div",{className:"baidu-netdisk-hero"},h("div",null,h("div",{className:"node-version-line"},h(Ei,{status:O.providerStatus==="online"?"online":"warn"},O.providerStatus||"unknown"),h("span",null,r.providerId),h(Ei,{status:p.public?"warn":"private"},p.public?"公网暴露":"仅 UniDesk frontend 代理访问")),h("p",{className:"muted paragraph"},r.description)),h("div",{className:"microservice-ref-card"},h("span",null,"Repo"),h("strong",null,Y.url||"--"),h("code",null,Y.commitId||"--")),h("div",{className:"microservice-ref-card"},h("span",null,"Private Backend"),h("strong",null,`${p.nodeBindHost||"--"}:${p.nodePort||"--"}`),h("code",null,`${Y.composeFile||"--"} / ${Y.composeService||"--"}`))),h(nl,{error:n.error,wide:!0})),h("div",{className:"metric-grid"},h(ht,{label:"Health",value:v.ok?"OK":"--",hint:v.storage?.postgres||"postgres",tone:v.ok?"ok":"warn"}),h(ht,{label:"OAuth",value:g?"已配置":"待配置",hint:g?"client + secret + token key":"需要设置 UNIDESK_BAIDU_NETDISK_*",tone:g?"ok":"warn"}),h(ht,{label:"Login",value:d?"已登录":"未登录",hint:z?.username||"Device Code QR",tone:d?"ok":"warn"}),h(ht,{label:"Work Root",value:mz(U),hint:U}),h(ht,{label:"Quota",value:O0(b.used),hint:b.total?`${b.usedPercent||0}% / ${O0(b.total)}`:"授权后刷新"}),h(ht,{label:"Transfers",value:Gz(I.length),hint:`running ${n.transfers?.counts?.running||0} / failed ${n.transfers?.counts?.failed||0}`})),h(Oi,{title:"文件浏览器",eyebrow:t,className:"baidu-files-panel",loading:n.loading,actions:h("div",{className:"panel-actions inline-actions"},h("button",{type:"button",className:"ghost-btn",onClick:()=>{let x=Bz(t,U);y(x),q(x)},disabled:!d||t===U},"上级"),h("button",{type:"button",className:"ghost-btn",onClick:()=>q(t),disabled:!d},"刷新文件"),h(Yn,{title:"Baidu Files",data:n.files,onOpen:l,testId:"raw-baidu-files"}))},h("form",{className:"baidu-pathbar",onSubmit:(x)=>{x.preventDefault(),q(t)}},h("input",{value:t,onChange:(x)=>y(x.target.value),disabled:!d}),h("button",{type:"submit",className:"ghost-btn",disabled:!d},"打开路径")),h("form",{className:"baidu-pathbar",onSubmit:E},h("input",{value:A,onChange:(x)=>j(x.target.value),placeholder:"新文件夹名称",disabled:!d}),h("button",{type:"submit",className:"primary-btn",disabled:!d||!A.trim()},"新建文件夹")),!d?h(xt,{title:"等待授权",text:"登录后通过 /api/files 读取工作目录文件列表"}):k.length===0?h(xt,{title:"目录为空",text:"可以从 staging 目录上传文件或新建文件夹"}):h("div",{className:"table-wrap","data-testid":"baidu-netdisk-file-table"},h("table",null,h("thead",null,h("tr",null,h("th",null,"名称"),h("th",null,"类型"),h("th",null,"大小"),h("th",null,"修改时间"),h("th",null,"fs_id"),h("th",null,"操作"))),h("tbody",null,k.map((x)=>h("tr",{key:x.fsId||x.path},h("td",null,h("strong",null,x.serverFilename||x.path),h("code",null,x.path||"--")),h("td",null,h(Ei,{status:x.isDir?"queued":"private"},x.isDir?"DIR":"FILE")),h("td",null,x.isDir?"--":O0(x.size)),h("td",null,x.serverMtime?wu(x.serverMtime*1000):"--"),h("td",null,h("code",null,x.fsId||"--")),h("td",null,h("div",{className:"inline-actions"},x.isDir?h("button",{type:"button",className:"ghost-btn",onClick:()=>{y(x.path),q(x.path)}},"打开"):h("button",{type:"button",className:"ghost-btn",onClick:()=>W((lu)=>({...lu,fsId:x.fsId}))},"填入下载"),h("button",{type:"button",className:"ghost-btn",onClick:()=>V(x.path),disabled:n.actionLoading},"删除"))))))))),h("div",{className:"baidu-netdisk-grid"},h(Oi,{title:"配置与文档",eyebrow:"Deployment References",className:"baidu-docs-panel",actions:h("div",{className:"panel-actions inline-actions"},h("a",{className:"ghost-btn",href:"/docs/issue/baidu-netdisk-env-setup.md",target:"_blank",rel:"noreferrer"},"打开环境配置"),h("a",{className:"ghost-btn",href:"/docs/issue/baidu-netdisk-user-service.md",target:"_blank",rel:"noreferrer"},"打开服务方案"))},h("p",{className:"muted paragraph"},g?"OAuth 运行时变量已配置;如需轮换密钥、迁移部署或排查代理边界,可直接打开下面的项目内文档。":"首次使用请先按环境变量配置文档填入百度应用 client id / secret,然后重建 baidu-netdisk 服务并刷新本页。"),h("div",{className:"baidu-doc-grid","data-testid":"baidu-netdisk-doc-links"},h(bt,{title:"环境变量配置",text:"填写 UNIDESK_BAIDU_NETDISK_CLIENT_ID、CLIENT_SECRET、TOKEN_KEY,并执行重建与健康检查。",href:"/docs/issue/baidu-netdisk-env-setup.md",badge:"SETUP",testId:"baidu-netdisk-env-doc-card"}),h(bt,{title:"服务方案与 API",text:"说明 OAuth Device Code、根目录工作区、staging 上传下载任务和后端 API 设计。",href:"/docs/issue/baidu-netdisk-user-service.md",badge:"DESIGN"}),h(bt,{title:"用户服务安全边界",text:"查看 UniDesk microservice 私有代理、允许路径、frontendOnly 和密钥边界规则。",href:"/docs/reference/microservices.md",badge:"REF"}),h(bt,{title:"部署与重建流程",text:"查看 server rebuild、Compose 编排、健康检查和交付验证的长期规则。",href:"/docs/reference/deployment.md",badge:"DEPLOY"}),h(bt,{title:"CLI 验证命令",text:"查看 microservice health/proxy、server rebuild、job status 等命令入口。",href:"/docs/reference/cli.md",badge:"CLI"}),h(bt,{title:"百度设备码模式",text:"打开百度官方 OAuth Device Code 文档,对照扫码登录和轮询参数。",href:"https://pan.baidu.com/union/doc/fl1x114ti",badge:"OFFICIAL"}))),h(Oi,{title:"设备码登录",eyebrow:"OAuth Device Code",className:"baidu-login-panel",loading:n.actionLoading,actions:h("div",{className:"panel-actions inline-actions"},h("button",{type:"button",className:"primary-btn",onClick:G,disabled:n.actionLoading||!g,"data-testid":"baidu-netdisk-start-login"},"生成二维码"),c?.id?h("button",{type:"button",className:"ghost-btn",onClick:()=>Z(!0),disabled:n.actionLoading},"检查状态"):null,d?h("button",{type:"button",className:"ghost-btn",onClick:H,disabled:n.actionLoading},"清除本地登录"):null,h(Yn,{title:"Baidu Device Session",data:c||P.latestSession,onOpen:l,testId:"raw-baidu-device-session"}))},h("div",{className:"baidu-login-card","data-testid":"baidu-netdisk-login-card"},h("div",{className:"baidu-qr-frame"},c?.qrcodeUrl?h("img",{src:c.qrcodeUrl,alt:"百度网盘设备码授权二维码","data-testid":"baidu-netdisk-qrcode"}):h(xt,{title:g?"等待二维码":"OAuth 未配置",text:g?"点击生成二维码后使用百度网盘或百度 App 扫码":"设置 client id、secret 和 token key 后重建服务"})),h("div",{className:"claudeqq-login-copy"},h("div",{className:"node-version-line"},h(Ei,{status:d?"online":c?.status==="pending"?"warn":"unknown"},d?"已登录":c?.status||"未开始"),h("span",null,c?.secondsRemaining!==void 0?`${c.secondsRemaining}s`:"--"),h("span",null,"scope basic,netdisk")),h("p",{className:"muted paragraph"},d?"access token / refresh token 已加密保存到 PostgreSQL;前端只看到脱敏登录态。":"后端使用百度 OAuth Device Code 轮询换取 token;二维码过期后重新生成即可。"),h("div",{className:"microservice-ref-card"},h("span",null,"User Code"),h("strong",null,c?.userCode||"--"),h("code",null,c?.verificationUrl||"https://openapi.baidu.com/device")),h("div",{className:"microservice-ref-card"},h("span",null,"Expires"),h("strong",null,c?.expiresAt?wu(c.expiresAt):"--"),h("code",null,c?.error||"no token exposed"))))),h(Oi,{title:"账号与容量",eyebrow:n.refreshedAt?`Updated ${yl(n.refreshedAt)}`:"Account",loading:n.loading,actions:h("div",{className:"panel-actions inline-actions"},h(Yn,{title:"Baidu Account",data:z,onOpen:l,testId:"raw-baidu-account"}))},z?h("div",{className:"baidu-account-card"},h("div",{className:"node-version-line"},h(Ei,{status:"online"},"connected"),h("span",null,z.baiduUid||"--"),h("span",null,`VIP ${z.vipType??"--"}`)),h("h3",null,z.username||"Baidu Netdisk"),h("p",{className:"muted paragraph"},`工作目录固定在 ${z.rootPath||U};v1 上传/下载只读写容器 staging 目录,不把大文件字节流穿过 UniDesk proxy。`),h("div",{className:"quota-bar"},h("span",{style:{width:`${Math.max(0,Math.min(100,Number(b.usedPercent||0)))}%`}})),h("div",{className:"microservice-ref-card"},h("span",null,"Quota"),h("strong",null,`${O0(b.used)} / ${O0(b.total)}`),h("code",null,`${b.usedPercent||0}% used`))):h(xt,{title:"尚未登录",text:"扫码授权后这里会显示账号、UID、会员状态和容量"})),h(Oi,{title:"传输任务",eyebrow:"staging path jobs",className:"baidu-transfers-panel",loading:n.actionLoading,actions:h("div",{className:"panel-actions inline-actions"},h("button",{type:"button",className:"primary-btn",onClick:X,disabled:!d||n.actionLoading,"data-testid":"baidu-netdisk-self-test"},"运行自测"),h("button",{type:"button",className:"ghost-btn",onClick:N},"刷新任务"),h(Yn,{title:"Baidu Transfers",data:n.transfers,onOpen:l,testId:"raw-baidu-transfers"}))},h("div",{className:"baidu-transfer-forms"},h("form",{className:"stack-form",onSubmit:S,"data-testid":"baidu-upload-form"},h("label",null,"容器 staging 文件",h("input",{value:F.localPath,onChange:(x)=>J((lu)=>({...lu,localPath:x.target.value})),placeholder:"sample.txt"})),h("label",null,"百度网盘目标路径",h("input",{value:F.remotePath,onChange:(x)=>J((lu)=>({...lu,remotePath:x.target.value})),placeholder:m4(U,"sample.txt")})),h("button",{type:"submit",className:"primary-btn",disabled:!d||n.actionLoading},"上传 staging 文件")),h("form",{className:"stack-form",onSubmit:B,"data-testid":"baidu-download-form"},h("label",null,"文件 fs_id",h("input",{value:Q.fsId,onChange:(x)=>W((lu)=>({...lu,fsId:x.target.value})),placeholder:"从文件表填入"})),h("label",null,"保存到 staging 路径",h("input",{value:Q.localPath,onChange:(x)=>W((lu)=>({...lu,localPath:x.target.value})),placeholder:"downloads/"})),h("button",{type:"submit",className:"primary-btn",disabled:!d||!Q.fsId||n.actionLoading},"下载到 staging"))),n.selfTest?h("div",{className:"baidu-account-card","data-testid":"baidu-netdisk-self-test-result"},h("div",{className:"node-version-line"},h(Ei,{status:n.selfTest.ok?"online":"warn"},n.selfTest.ok?"self-test ok":"self-test"),h("span",null,O0(n.selfTest.sizeBytes))),h("h3",null,n.selfTest.remotePath||"Baidu self-test"),h("div",{className:"microservice-ref-card"},h("span",null,"fs_id"),h("strong",null,n.selfTest.fsId||"--"),h("code",null,n.selfTest.downloadedPath||"--")),h("div",{className:"microservice-ref-card"},h("span",null,"MD5"),h("strong",null,n.selfTest.downloadedMd5||"--"),h("code",null,n.selfTest.expectedMd5||"--")),h(Yn,{title:"Baidu Self Test",data:n.selfTest,onOpen:l,testId:"raw-baidu-self-test"})):null,I.length===0?h(xt,{title:"暂无传输任务",text:"上传/下载任务会在后端容器内执行,避免大文件穿过 UniDesk proxy"}):h("div",{className:"table-wrap","data-testid":"baidu-transfer-table"},h("table",null,h("thead",null,h("tr",null,h("th",null,"状态"),h("th",null,"方向"),h("th",null,"路径"),h("th",null,"进度"),h("th",null,"时间"),h("th",null,"操作"))),h("tbody",null,I.map((x)=>h("tr",{key:x.id},h("td",null,h(Ei,{status:x.status},x.status)),h("td",null,x.direction),h("td",null,h("strong",null,x.remotePath||x.fsId||"--"),h("code",null,x.localPath||"--"),x.error?h("span",{className:"form-error"},x.error):null),h("td",null,h(Vz,{percent:x.progressPercent}),h("span",{className:"muted"},`${O0(x.bytesDone)} / ${O0(x.sizeBytes)}`)),h("td",null,wu(x.updatedAt)),h("td",null,h("div",{className:"inline-actions"},["queued","running"].includes(x.status)?h("button",{type:"button",className:"ghost-btn",onClick:()=>D(x.id,"cancel")},"取消"):null,["failed","canceled"].includes(x.status)?h("button",{type:"button",className:"ghost-btn",onClick:()=>D(x.id,"retry")},"重试"):null,h(Yn,{title:`Transfer ${x.id}`,data:x,onOpen:l}))))))))),h(Oi,{title:"安全与日志",eyebrow:"redacted diagnostics",className:"baidu-wide-panel",loading:n.loading,actions:h("div",{className:"panel-actions inline-actions"},h(Yn,{title:"Baidu Health",data:v,onOpen:l,testId:"raw-baidu-health"}),h(Yn,{title:"Baidu Logs",data:n.logs,onOpen:l,testId:"raw-baidu-logs"}))},h("div",{className:"policy-grid"},h("article",null,h("b",null,"私有后端"),h("span",null,"4244 只在 Compose 网络 expose,浏览器经 UniDesk 同源代理访问")),h("article",null,h("b",null,"Token 加密"),h("span",null,"access/refresh token 使用 BAIDU_NETDISK_TOKEN_KEY 加密后写入 PostgreSQL")),h("article",null,h("b",null,"无浏览器大文件流"),h("span",null,"上传/下载以容器 staging 目录为边界,避免 proxy 文本通道传输大字节流"))))))}var P$=Cu(Fl(),1);var o=P$.default.createElement,{useEffect:Dz}=P$.default,X$=P$.default.useState,Zi={label:"主用户私聊账号",userId:645275593};function V4(u){let l=Number(u);return Number.isFinite(l)?l.toLocaleString("zh-CN"):"--"}async function Z0(u,l={}){return Eu(u,{failureFields:["ok","success"],...l})}async function pz(u){let l=await fetch(u,{credentials:"same-origin"}),f=await l.text();try{return f?JSON.parse(f):{ok:l.ok,status:l.status}}catch{return{ok:l.ok,status:l.status,text:f}}}function Y$({status:u,children:l}){let f=String(u||"unknown").toLowerCase();return o("span",{className:`status-badge ${f}`},l||u||"unknown")}function vt({label:u,value:l,hint:f,tone:r}){return o("article",{className:`metric-card ${r||""}`},o("div",{className:"metric-label"},u),o("div",{className:"metric-value"},l),o("div",{className:"metric-hint"},f))}function kt({title:u,eyebrow:l,actions:f,children:r,className:n,loading:i}){return o("section",{className:`panel ${n||""}`},o("div",{className:"panel-head"},o("div",null,l?o("p",{className:"panel-eyebrow"},l):null,o(rl,{title:u,loading:i})),f?o("div",{className:"panel-actions"},f):null),o("div",{className:"panel-body"},r))}function C1({title:u,data:l,onOpen:f,testId:r}){return o("button",{type:"button",className:"ghost-btn","data-testid":r,onClick:(n)=>{n?.stopPropagation?.(),f(u,l)}},"查看原始JSON")}function M1({title:u,text:l}){return o("div",{className:"empty-state"},o("strong",null,u),o("span",null,l))}function Sz(u){return u?.runtime&&typeof u.runtime==="object"&&!Array.isArray(u.runtime)?u.runtime:{}}function Xz(u){return u?.backend&&typeof u.backend==="object"&&!Array.isArray(u.backend)?u.backend:{}}function Yz(u){return u?.repository&&typeof u.repository==="object"&&!Array.isArray(u.repository)?u.repository:{}}function H0(u,l){return`${u}/microservices/claudeqq/proxy${l}`}function Pz(u){return Array.isArray(u?.events)?u.events.slice(0,80):[]}function Cz(u){return Array.isArray(u?.subscriptions)?u.subscriptions.slice(0,50):[]}function Mz(u){return Array.isArray(u?.messages)?u.messages.slice(0,30):[]}function HJ(u){let l=u?.text??u?.message??u?.raw?.raw_message;if(typeof l!=="string")return"--";return l.length>180?`${l.slice(0,177)}...`:l}function BJ(u){let l=u?.groupId??u?.group_id??(u?.message_type==="group"?u?.target_id:void 0),f=u?.userId??u?.user_id??(u?.message_type==="private"?u?.target_id:void 0);if(l)return`群 ${l}`;if(f)return`私聊 ${f}`;return"--"}function mJ({microservices:u,onRaw:l,apiBaseUrl:f="/api"}){let r=u.find((z)=>z.id==="claudeqq")||null,[n,i]=X$({loading:!1,qrLoading:!1,error:"",health:null,status:null,napcatLogin:null,napcatQrcode:null,qrcodeFetched:!1,qrcodeRefreshedAt:null,events:null,subscriptions:null,sent:null,refreshedAt:null}),[t,y]=X$({targetType:"private",targetId:String(Zi.userId),message:""}),[c,$]=X$({name:"unidesk-callback",targetUrl:"",eventTypes:"message",secret:""}),[A,j]=X$(""),{addNotification:F}=pf();async function J(){if(!r)return;i((z)=>({...z,loading:!0,error:""}));try{let[z,P,k,I,b]=await Promise.all([pz(`${f}/microservices/claudeqq/health`),Z0(H0(f,"/api/server/status")),Z0(H0(f,"/api/events/recent?limit=60")),Z0(H0(f,"/api/events/subscriptions")),Z0(H0(f,"/api/messages/sent?limit=20"))]);if(i((d)=>({...d,loading:!1,error:"",health:z,status:P,events:k,subscriptions:I,sent:b,refreshedAt:new Date})),!n.qrcodeFetched)Q(!1)}catch(z){i((P)=>({...P,loading:!1,error:Ou(z,"ClaudeQQ 加载失败")}))}}async function Q(z=!0){if(!r)return;i((P)=>({...P,qrLoading:!0,error:z?"":P.error}));try{let P=await Z0(H0(f,"/api/napcat/login")),k=P?.napcat?.qrcode||P?.qrcode||null;i((I)=>({...I,qrLoading:!1,error:"",napcatLogin:P,napcatQrcode:k,qrcodeFetched:!0,qrcodeRefreshedAt:new Date}))}catch(P){i((k)=>({...k,qrLoading:!1,error:z||!k.napcatQrcode?Ou(P,"NapCat 二维码加载失败"):k.error}))}}async function W(z){z.preventDefault(),j("");let P=Number(t.targetId);if(!Number.isFinite(P)||P<=0||t.message.trim().length===0){i((k)=>({...k,error:"请填写 QQ 目标和消息内容"}));return}try{await Z0(H0(f,"/api/push/text"),{method:"POST",body:JSON.stringify({userId:t.targetType==="private"?P:void 0,groupId:t.targetType==="group"?P:void 0,message:t.message})});let k="消息推送请求已提交";y((I)=>({...I,targetType:"private",targetId:String(Zi.userId),message:""})),j(k),F("success",k),await J()}catch(k){i((I)=>({...I,error:Ou(k,"发送失败")}))}}async function L(z){if(z.preventDefault(),j(""),c.targetUrl.trim().length===0){i((P)=>({...P,error:"请填写订阅回调 URL"}));return}try{await Z0(H0(f,"/api/events/subscriptions"),{method:"POST",body:JSON.stringify({name:c.name,targetUrl:c.targetUrl,eventTypes:c.eventTypes.split(",").map((k)=>k.trim()).filter(Boolean),secret:c.secret||void 0,enabled:!0})});let P="事件订阅已创建";j(P),F("success",P),await J()}catch(P){i((k)=>({...k,error:Ou(P,"订阅失败")}))}}async function U(z){if(!z)return;j("");try{await Z0(H0(f,`/api/events/subscriptions/${encodeURIComponent(z)}`),{method:"DELETE"});let P="事件订阅已删除";j(P),F("success",P),await J()}catch(P){i((k)=>({...k,error:Ou(P,"删除订阅失败")}))}}if(Dz(()=>{if(!r)return;J();return},[r?.id,r?.runtime?.providerStatus]),!r)return o(M1,{title:"ClaudeQQ 未登记",text:"请在 config.json 的 microservices 中登记用户服务 id=claudeqq"});let q=Sz(r),N=Yz(r),w=Xz(r),G=n.health||{},Z=n.status||{},H=n.napcatLogin||{},E=G.napcat||Z.napcat||{},V={...H.napcat||{},...E,qrcode:n.napcatQrcode||{},webui:E.webui||H.napcat?.webui},S=H.login||{},B=n.napcatQrcode||{},D=Pz(n.events),X=Cz(n.subscriptions),O=Mz(n.sent),Y=Boolean(V.httpConnected||S.ready),p=String(V.loginState||S.state||(Y?"logged_in":"unknown")),v=Boolean(B.available&&B.dataUrl);return o("div",{className:"claudeqq-page","data-testid":"claudeqq-page"},o(kt,{title:"ClaudeQQ 工作台",eyebrow:"D601 QQ Event Gateway",loading:n.loading,actions:o("div",{className:"panel-actions"},o("button",{type:"button",className:"ghost-btn",onClick:J,disabled:n.loading,"data-testid":"claudeqq-refresh-button"},n.loading?"刷新中":"刷新"),o(C1,{title:"ClaudeQQ 用户服务",data:r,onOpen:l,testId:"raw-claudeqq-service"}))},o("div",{className:"findjob-hero"},o("div",null,o("div",{className:"node-version-line"},o(Y$,{status:q.providerStatus==="online"?"online":"warn"},q.providerStatus||"unknown"),o("span",null,r.providerId),o("span",null,w.public?"公网暴露":"仅 UniDesk frontend 代理访问")),o("p",{className:"muted paragraph"},r.description)),o("div",{className:"microservice-ref-card"},o("span",null,"Repo"),o("strong",null,N.url||"--"),o("code",null,N.commitId||"--")),o("div",{className:"microservice-ref-card"},o("span",null,"D601 Docker"),o("strong",null,`${w.nodeBindHost||"--"}:${w.nodePort||"--"}`),o("code",null,`${N.composeFile||"--"} / ${N.composeService||"--"}`))),o(nl,{error:n.error,wide:!0})),o("div",{className:"metric-grid"},o(vt,{label:"Health",value:G.ok||G.status==="ok"?"OK":"--",hint:"D601 /health",tone:G.ok||G.status==="ok"?"ok":"warn"}),o(vt,{label:"NapCat HTTP",value:V.httpConnected||V.http?.connected?"OK":"离线",hint:`${V.httpHost||G.napcat?.httpHost||"--"}:${V.httpPort||G.napcat?.httpPort||"--"}`}),o(vt,{label:"NapCat WS",value:V.wsConnected||V.ws?.connected?"OK":"离线",hint:`${V.wsHost||G.napcat?.wsHost||"--"}:${V.wsPort||G.napcat?.wsPort||"--"}`}),o(vt,{label:"事件缓存",value:V4(n.events?.count??D.length),hint:"recent QQ events"}),o(vt,{label:"订阅",value:V4(n.subscriptions?.count??X.length),hint:"webhook subscribers"}),o(vt,{label:"已发送",value:V4(n.sent?.count??O.length),hint:"sent message log"})),o("div",{className:"findjob-grid"},o(kt,{title:"NapCat 容器登录",eyebrow:"QR Login",className:"claudeqq-login-panel",loading:n.qrLoading,actions:o("div",{className:"panel-actions inline-actions"},o("button",{type:"button",className:"ghost-btn",onClick:()=>Q(!0),disabled:n.qrLoading,"data-testid":"claudeqq-napcat-refresh"},n.qrLoading?"刷新中":"手动刷新二维码"),o(C1,{title:"NapCat Login",data:n.napcatLogin,onOpen:l,testId:"raw-claudeqq-napcat-login"}))},o("div",{className:"claudeqq-login-card","data-testid":"claudeqq-napcat-login"},o("div",{className:"claudeqq-qr-frame"},v?o("img",{src:B.dataUrl,alt:"NapCat QQ 登录二维码","data-testid":"claudeqq-napcat-qrcode"}):o(M1,{title:"等待二维码",text:"NapCat 容器启动后会把登录二维码写入 cache/qrcode.png"})),o("div",{className:"claudeqq-login-copy"},o("div",{className:"node-version-line"},o(Y$,{status:Y?"online":v?"warn":"unknown"},Y?"已登录":v?"待扫码":"等待二维码"),o("span",null,p),o("span",null,"D601 containerized")),o("p",{className:"muted paragraph"},Y?"NapCat 已登录,ClaudeQQ 可通过容器内 HTTP/WS 链路收发 QQ 消息。":"用手机 QQ 扫描二维码授权登录。二维码只在首次加载或手动刷新时更新,D601 的 NapCat 端口仍只绑定 127.0.0.1。"),o("div",{className:"microservice-ref-card"},o("span",null,"NapCat WebUI"),o("strong",null,V.webui?.url||"http://napcat:6099/webui"),o("code",null,"local-only / proxied QR login")),o("div",{className:"microservice-ref-card"},o("span",null,"QR Source"),o("strong",null,B.modifiedAt?wu(B.modifiedAt):n.qrcodeRefreshedAt?wu(n.qrcodeRefreshedAt):"--"),o("code",null,B.file||"/napcat/cache/qrcode.png"))))),o(kt,{title:"消息推送",eyebrow:"Push API"},o("div",{className:"microservice-ref-card"},o("span",null,Zi.label),o("strong",null,String(Zi.userId)),o("code",null,"private userId / 默认推送测试目标")),o("form",{className:"stack-form",onSubmit:W,"data-testid":"claudeqq-push-form"},o("label",null,"目标类型",o("select",{value:t.targetType,onChange:(z)=>y((P)=>({...P,targetType:z.target.value}))},o("option",{value:"private"},"私聊 userId"),o("option",{value:"group"},"群 groupId"))),o("label",null,"QQ ID",o("input",{value:t.targetId,onChange:(z)=>y((P)=>({...P,targetId:z.target.value})),placeholder:String(Zi.userId)})),o("label",null,"消息内容",o("textarea",{value:t.message,onChange:(z)=>y((P)=>({...P,message:z.target.value})),rows:4,placeholder:"通过 ClaudeQQ 推送一条 QQ 消息"})),o("button",{type:"submit",className:"primary-btn"},"发送 QQ 消息")),o("p",{className:"muted paragraph"},`主 server 和其他用户服务可通过 UniDesk 同源代理调用 /api/push/text;当前人工推送测试默认使用 ${Zi.label} ${Zi.userId},不需要暴露 D601 后端端口。`)),o(kt,{title:"QQ 事件订阅",eyebrow:"Webhook Subscription",loading:n.loading},o("form",{className:"stack-form",onSubmit:L,"data-testid":"claudeqq-subscription-form"},o("label",null,"订阅名称",o("input",{value:c.name,onChange:(z)=>$((P)=>({...P,name:z.target.value}))})),o("label",null,"回调 URL",o("input",{value:c.targetUrl,onChange:(z)=>$((P)=>({...P,targetUrl:z.target.value})),placeholder:"http://host.docker.internal:18080/..."})),o("label",null,"事件类型",o("input",{value:c.eventTypes,onChange:(z)=>$((P)=>({...P,eventTypes:z.target.value})),placeholder:"message,notice"})),o("label",null,"签名密钥",o("input",{value:c.secret,onChange:(z)=>$((P)=>({...P,secret:z.target.value})),placeholder:"可选,生成 x-claudeqq-signature"})),o("button",{type:"submit",className:"primary-btn"},"创建订阅")),X.length===0?o(M1,{title:"暂无订阅",text:"可以为 main server 或其他用户服务注册 HTTP webhook"}):o("div",{className:"table-wrap","data-testid":"claudeqq-subscription-table"},o("table",null,o("thead",null,o("tr",null,o("th",null,"名称"),o("th",null,"状态"),o("th",null,"事件"),o("th",null,"回调"),o("th",null,"最近投递"),o("th",null,"操作"))),o("tbody",null,X.map((z)=>o("tr",{key:z.id},o("td",null,o("strong",null,z.name||z.id),o("code",null,z.id||"--")),o("td",null,o(Y$,{status:z.enabled?"online":"warn"},z.enabled?"enabled":"disabled")),o("td",null,Array.isArray(z.eventTypes)?z.eventTypes.join(", "):"message"),o("td",null,z.targetUrl||"--"),o("td",null,z.lastDelivery?`${z.lastDelivery.ok?"OK":"FAIL"} ${wu(z.lastDelivery.at)}`:"--"),o("td",null,o("button",{type:"button",className:"ghost-btn",onClick:()=>U(z.id)},"删除"))))))),o("div",{className:"panel-actions inline-actions"},o(C1,{title:"ClaudeQQ Subscriptions",data:n.subscriptions,onOpen:l,testId:"raw-claudeqq-subscriptions"}))),o(kt,{title:"最近 QQ 事件",eyebrow:n.refreshedAt?`Updated ${yl(n.refreshedAt)}`:"Event Stream",loading:n.loading},D.length===0?o(M1,{title:"暂无事件",text:"等待 NapCat WebSocket 上报 QQ 消息事件,或通过订阅 API 消费后续事件"}):o("div",{className:"table-wrap","data-testid":"claudeqq-event-list"},o("table",null,o("thead",null,o("tr",null,o("th",null,"时间"),o("th",null,"类型"),o("th",null,"会话"),o("th",null,"消息"),o("th",null,"ID"))),o("tbody",null,D.map((z)=>o("tr",{key:z.id},o("td",null,wu(z.receivedAt||z.timestamp)),o("td",null,o(Y$,{status:z.postType||z.eventType},z.postType||z.eventType||"--")),o("td",null,BJ(z)),o("td",null,HJ(z)),o("td",null,o("code",null,z.messageId||z.id||"--"))))))),o("div",{className:"panel-actions inline-actions"},o(C1,{title:"ClaudeQQ Events",data:n.events,onOpen:l,testId:"raw-claudeqq-events"}))),o(kt,{title:"已发送消息",eyebrow:`${O.length} Sent`,loading:n.loading},O.length===0?o(M1,{title:"暂无发送记录",text:"发送日志来自 ClaudeQQ bot_workspace/messages/sent_messages.jsonl"}):o("div",{className:"table-wrap"},o("table",null,o("thead",null,o("tr",null,o("th",null,"时间"),o("th",null,"目标"),o("th",null,"消息"),o("th",null,"结果"))),o("tbody",null,O.map((z,P)=>o("tr",{key:z.id||P},o("td",null,wu(z.timestamp||z.sentAt||z.createdAt)),o("td",null,BJ(z)),o("td",null,HJ(z)),o("td",null,z.status||z.messageId||z.message_id||"--")))))),o("div",{className:"panel-actions inline-actions"},o(C1,{title:"ClaudeQQ Sent Messages",data:n.sent,onOpen:l,testId:"raw-claudeqq-sent"})))))}var s1=Cu(Fl(),1);var pJ=Cu(Fl(),1),Nl=pJ.default.createElement;function SJ({markdown:u,className:l,testId:f}){let r=String(u??"").trimEnd(),n=["markdown-body",l].filter(Boolean).join(" ");return Nl("div",{className:n,"data-testid":f},XJ(r,"md"))}function XJ(u,l){let f=Rz(u).split(` -`),r=[],n=0;while(n\s?/u.test(i)){let j=[];while(n\s?(.*)$/u);if(J!==null){j.push(J[1]),n+=1;continue}if(F.trim().length===0){j.push(""),n+=1;continue}break}r.push(Nl("blockquote",{key:`${l}-quote-${n}`},XJ(j.join(` -`),`${l}-quote-${n}`)));continue}if(PJ(f,n)){let j=n,F=R1(f[n]??""),J=R1(f[n+1]??"");n+=2;let Q=[];while(n0)Q.push(R1(f[n]??"")),n+=1;r.push(kz(F,J,Q,`${l}-table-${j}`));continue}let c=M$(i);if(c!==null){let j=n,F=c.ordered,J=c.start,Q=[];while(nbz(L,`${l}-list-${j}-${U}`))));continue}let $=n,A=[];while(n0&&!xz(f,n))A.push(f[n].trim()),n+=1;if(A.length===0)A.push(i.trim()),n+=1;r.push(Nl("p",{key:`${l}-p-${$}`},Fn(A.join(` -`),`${l}-p-${$}`)))}return r}function Rz(u){return String(u||"").replace(/\r\n/gu,` +`+i.stack}return{value:u,source:l,stack:n,digest:null}}function I6(u,l,f){return{value:u,source:null,stack:f!=null?f:null,digest:l!=null?l:null}}function V8(u,l){try{console.error(l.value)}catch(f){setTimeout(function(){throw f})}}var lz=typeof WeakMap==="function"?WeakMap:Map;function sU(u,l,f){f=mn(-1,f),f.tag=3,f.payload={element:null};var r=l.value;return f.callback=function(){W$||(W$=!0,R8=r),V8(u,l)},f}function aU(u,l,f){f=mn(-1,f),f.tag=3;var r=u.type.getDerivedStateFromError;if(typeof r==="function"){var n=l.value;f.payload=function(){return r(n)},f.callback=function(){V8(u,l)}}var i=u.stateNode;return i!==null&&typeof i.componentDidCatch==="function"&&(f.callback=function(){V8(u,l),typeof r!=="function"&&(q0===null?q0=new Set([this]):q0.add(this));var t=l.stack;this.componentDidCatch(l.value,{componentStack:t!==null?t:""})}),f}function yF(u,l,f){var r=u.pingCache;if(r===null){r=u.pingCache=new lz;var n=new Set;r.set(l,n)}else n=r.get(l),n===void 0&&(n=new Set,r.set(l,n));n.has(f)||(n.add(f),u=Jz.bind(null,u,l,f),l.then(u,u))}function cF(u){do{var l;if(l=u.tag===13)l=u.memoizedState,l=l!==null?l.dehydrated!==null?!0:!1:!0;if(l)return u;u=u.return}while(u!==null);return null}function _F(u,l,f,r,n){if((u.mode&1)===0)return u===l?u.flags|=65536:(u.flags|=128,f.flags|=131072,f.flags&=-52805,f.tag===1&&(f.alternate===null?f.tag=17:(l=mn(-1,1),l.tag=2,N0(f,l,1))),f.lanes|=1),u;return u.flags|=65536,u.lanes=n,u}var fz=Yn.ReactCurrentOwner,vf=!1;function Df(u,l,f,r){l.child=u===null?zU(l,null,f,r):Xt(l,u.child,f,r)}function $F(u,l,f,r,n){f=f.render;var i=l.ref;if(Vt(l,n),r=w4(u,l,f,r,i,n),f=W4(),u!==null&&!vf)return l.updateQueue=u.updateQueue,l.flags&=-2053,u.lanes&=~n,Xn(u,l,n);return Ol&&f&&y4(l),l.flags|=1,Df(u,l,r,n),l.child}function AF(u,l,f,r,n){if(u===null){var i=f.type;if(typeof i==="function"&&!B4(i)&&i.defaultProps===void 0&&f.compare===null&&f.defaultProps===void 0)return l.tag=15,l.type=i,oU(u,l,i,r,n);return u=e_(f.type,null,r,l,l.mode,n),u.ref=l.ref,u.return=l,l.child=u}if(i=u.child,(u.lanes&n)===0){var t=i.memoizedProps;if(f=f.compare,f=f!==null?f:K1,f(t,r)&&u.ref===l.ref)return Xn(u,l,n)}return l.flags|=1,u=W0(i,r),u.ref=l.ref,u.return=l,l.child=u}function oU(u,l,f,r,n){if(u!==null){var i=u.memoizedProps;if(K1(i,r)&&u.ref===l.ref)if(vf=!1,l.pendingProps=r=i,(u.lanes&n)!==0)(u.flags&131072)!==0&&(vf=!0);else return l.lanes=u.lanes,Xn(u,l,n)}return m8(u,l,f,r,n)}function dU(u,l,f){var r=l.pendingProps,n=r.children,i=u!==null?u.memoizedState:null;if(r.mode==="hidden")if((l.mode&1)===0)l.memoizedState={baseLanes:0,cachePool:null,transitions:null},Wl(Et,yr),yr|=f;else{if((f&1073741824)===0)return u=i!==null?i.baseLanes|f:f,l.lanes=l.childLanes=1073741824,l.memoizedState={baseLanes:u,cachePool:null,transitions:null},l.updateQueue=null,Wl(Et,yr),yr|=u,null;l.memoizedState={baseLanes:0,cachePool:null,transitions:null},r=i!==null?i.baseLanes:f,Wl(Et,yr),yr|=r}else i!==null?(r=i.baseLanes|f,l.memoizedState=null):r=f,Wl(Et,yr),yr|=r;return Df(u,l,n,f),l.child}function eU(u,l){var f=l.ref;if(u===null&&f!==null||u!==null&&u.ref!==f)l.flags|=512,l.flags|=2097152}function m8(u,l,f,r,n){var i=If(f)?Wi:Kf.current;if(i=pt(l,i),Vt(l,n),f=w4(u,l,f,r,i,n),r=W4(),u!==null&&!vf)return l.updateQueue=u.updateQueue,l.flags&=-2053,u.lanes&=~n,Xn(u,l,n);return Ol&&r&&y4(l),l.flags|=1,Df(u,l,f,n),l.child}function jF(u,l,f,r,n){if(If(f)){var i=!0;$$(l)}else i=!1;if(Vt(l,n),l.stateNode===null)a_(u,l),gU(l,f,r),B8(l,f,r,n),r=!0;else if(u===null){var{stateNode:t,memoizedProps:y}=l;t.props=y;var c=t.context,$=f.contextType;typeof $==="object"&&$!==null?$=Or($):($=If(f)?Wi:Kf.current,$=pt(l,$));var A=f.getDerivedStateFromProps,j=typeof A==="function"||typeof t.getSnapshotBeforeUpdate==="function";j||typeof t.UNSAFE_componentWillReceiveProps!=="function"&&typeof t.componentWillReceiveProps!=="function"||(y!==r||c!==$)&&tF(l,t,r,$),c0=!1;var F=l.memoizedState;t.state=F,J$(l,r,t,n),c=l.memoizedState,y!==r||F!==c||kf.current||c0?(typeof A==="function"&&(H8(l,f,A,r),c=l.memoizedState),(y=c0||iF(l,f,y,r,F,c,$))?(j||typeof t.UNSAFE_componentWillMount!=="function"&&typeof t.componentWillMount!=="function"||(typeof t.componentWillMount==="function"&&t.componentWillMount(),typeof t.UNSAFE_componentWillMount==="function"&&t.UNSAFE_componentWillMount()),typeof t.componentDidMount==="function"&&(l.flags|=4194308)):(typeof t.componentDidMount==="function"&&(l.flags|=4194308),l.memoizedProps=r,l.memoizedState=c),t.props=r,t.state=c,t.context=$,r=y):(typeof t.componentDidMount==="function"&&(l.flags|=4194308),r=!1)}else{t=l.stateNode,OU(u,l),y=l.memoizedProps,$=l.type===l.elementType?y:xr(l.type,y),t.props=$,j=l.pendingProps,F=t.context,c=f.contextType,typeof c==="object"&&c!==null?c=Or(c):(c=If(f)?Wi:Kf.current,c=pt(l,c));var J=f.getDerivedStateFromProps;(A=typeof J==="function"||typeof t.getSnapshotBeforeUpdate==="function")||typeof t.UNSAFE_componentWillReceiveProps!=="function"&&typeof t.componentWillReceiveProps!=="function"||(y!==j||F!==c)&&tF(l,t,r,c),c0=!1,F=l.memoizedState,t.state=F,J$(l,r,t,n);var Q=l.memoizedState;y!==j||F!==Q||kf.current||c0?(typeof J==="function"&&(H8(l,f,J,r),Q=l.memoizedState),($=c0||iF(l,f,$,r,F,Q,c)||!1)?(A||typeof t.UNSAFE_componentWillUpdate!=="function"&&typeof t.componentWillUpdate!=="function"||(typeof t.componentWillUpdate==="function"&&t.componentWillUpdate(r,Q,c),typeof t.UNSAFE_componentWillUpdate==="function"&&t.UNSAFE_componentWillUpdate(r,Q,c)),typeof t.componentDidUpdate==="function"&&(l.flags|=4),typeof t.getSnapshotBeforeUpdate==="function"&&(l.flags|=1024)):(typeof t.componentDidUpdate!=="function"||y===u.memoizedProps&&F===u.memoizedState||(l.flags|=4),typeof t.getSnapshotBeforeUpdate!=="function"||y===u.memoizedProps&&F===u.memoizedState||(l.flags|=1024),l.memoizedProps=r,l.memoizedState=Q),t.props=r,t.state=Q,t.context=c,r=$):(typeof t.componentDidUpdate!=="function"||y===u.memoizedProps&&F===u.memoizedState||(l.flags|=4),typeof t.getSnapshotBeforeUpdate!=="function"||y===u.memoizedProps&&F===u.memoizedState||(l.flags|=1024),r=!1)}return D8(u,l,f,r,i,n)}function D8(u,l,f,r,n,i){eU(u,l);var t=(l.flags&128)!==0;if(!r&&!t)return n&&oj(l,f,!1),Xn(u,l,i);r=l.stateNode,fz.current=l;var y=t&&typeof f.getDerivedStateFromError!=="function"?null:r.render();return l.flags|=1,u!==null&&t?(l.child=Xt(l,u.child,null,i),l.child=Xt(l,null,y,i)):Df(u,l,y,i),l.memoizedState=r.state,n&&oj(l,f,!0),l.child}function uJ(u){var l=u.stateNode;l.pendingContext?aj(u,l.pendingContext,l.pendingContext!==l.context):l.context&&aj(u,l.context,!1),J4(u,l.containerInfo)}function FF(u,l,f,r,n){return St(),_4(n),l.flags|=256,Df(u,l,f,r),l.child}var p8={dehydrated:null,treeContext:null,retryLane:0};function S8(u){return{baseLanes:u,cachePool:null,transitions:null}}function lJ(u,l,f){var r=l.pendingProps,n=Hl.current,i=!1,t=(l.flags&128)!==0,y;if((y=t)||(y=u!==null&&u.memoizedState===null?!1:(n&2)!==0),y)i=!0,l.flags&=-129;else if(u===null||u.memoizedState!==null)n|=1;if(Wl(Hl,n&1),u===null){if(O8(l),u=l.memoizedState,u!==null&&(u=u.dehydrated,u!==null))return(l.mode&1)===0?l.lanes=1:u.data==="$!"?l.lanes=8:l.lanes=1073741824,null;return t=r.children,u=r.fallback,i?(r=l.mode,i=l.child,t={mode:"hidden",children:t},(r&1)===0&&i!==null?(i.childLanes=0,i.pendingProps=t):i=p$(t,r,0,null),u=wi(u,r,f,null),i.return=l,u.return=l,i.sibling=u,l.child=i,l.child.memoizedState=S8(f),l.memoizedState=p8,u):K4(l,t)}if(n=u.memoizedState,n!==null&&(y=n.dehydrated,y!==null))return rz(u,l,t,r,y,n,f);if(i){i=r.fallback,t=l.mode,n=u.child,y=n.sibling;var c={mode:"hidden",children:r.children};return(t&1)===0&&l.child!==n?(r=l.child,r.childLanes=0,r.pendingProps=c,l.deletions=null):(r=W0(n,c),r.subtreeFlags=n.subtreeFlags&14680064),y!==null?i=W0(y,i):(i=wi(i,t,f,null),i.flags|=2),i.return=l,r.return=l,r.sibling=i,l.child=r,r=i,i=l.child,t=u.child.memoizedState,t=t===null?S8(f):{baseLanes:t.baseLanes|f,cachePool:null,transitions:t.transitions},i.memoizedState=t,i.childLanes=u.childLanes&~f,l.memoizedState=p8,r}return i=u.child,u=i.sibling,r=W0(i,{mode:"visible",children:r.children}),(l.mode&1)===0&&(r.lanes=f),r.return=l,r.sibling=null,u!==null&&(f=l.deletions,f===null?(l.deletions=[u],l.flags|=16):f.push(u)),l.child=r,l.memoizedState=null,r}function K4(u,l){return l=p$({mode:"visible",children:l},u.mode,0,null),l.return=u,u.child=l}function M_(u,l,f,r){return r!==null&&_4(r),Xt(l,u.child,null,f),u=K4(l,l.pendingProps.children),u.flags|=2,l.memoizedState=null,u}function rz(u,l,f,r,n,i,t){if(f){if(l.flags&256)return l.flags&=-257,r=I6(Error(Ju(422))),M_(u,l,t,r);if(l.memoizedState!==null)return l.child=u.child,l.flags|=128,null;return i=r.fallback,n=l.mode,r=p$({mode:"visible",children:r.children},n,0,null),i=wi(i,n,t,null),i.flags|=2,r.return=l,i.return=l,r.sibling=i,l.child=r,(l.mode&1)!==0&&Xt(l,u.child,null,t),l.child.memoizedState=S8(t),l.memoizedState=p8,i}if((l.mode&1)===0)return M_(u,l,t,null);if(n.data==="$!"){if(r=n.nextSibling&&n.nextSibling.dataset,r)var y=r.dgst;return r=y,i=Error(Ju(419)),r=I6(i,r,void 0),M_(u,l,t,r)}if(y=(t&u.childLanes)!==0,vf||y){if(r=_f,r!==null){switch(t&-t){case 4:n=2;break;case 16:n=8;break;case 64:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:case 4194304:case 8388608:case 16777216:case 33554432:case 67108864:n=32;break;case 536870912:n=268435456;break;default:n=0}n=(n&(r.suspendedLanes|t))!==0?0:n,n!==0&&n!==i.retryLane&&(i.retryLane=n,Sn(u,n),kr(r,u,n,-1))}return H4(),r=I6(Error(Ju(421))),M_(u,l,t,r)}if(n.data==="$?")return l.flags|=128,l.child=u.child,l=Qz.bind(null,u),n._reactRetry=l,null;return u=i.treeContext,cr=Q0(n.nextSibling),_r=l,Ol=!0,br=null,u!==null&&(Kr[Gr++]=Bn,Kr[Gr++]=Vn,Kr[Gr++]=Li,Bn=u.id,Vn=u.overflow,Li=l),l=K4(l,r.children),l.flags|=4096,l}function UF(u,l,f){u.lanes|=l;var r=u.alternate;r!==null&&(r.lanes|=l),Z8(u.return,l,f)}function g6(u,l,f,r,n){var i=u.memoizedState;i===null?u.memoizedState={isBackwards:l,rendering:null,renderingStartTime:0,last:r,tail:f,tailMode:n}:(i.isBackwards=l,i.rendering=null,i.renderingStartTime=0,i.last=r,i.tail=f,i.tailMode=n)}function fJ(u,l,f){var r=l.pendingProps,n=r.revealOrder,i=r.tail;if(Df(u,l,r.children,f),r=Hl.current,(r&2)!==0)r=r&1|2,l.flags|=128;else{if(u!==null&&(u.flags&128)!==0)u:for(u=l.child;u!==null;){if(u.tag===13)u.memoizedState!==null&&UF(u,f,l);else if(u.tag===19)UF(u,f,l);else if(u.child!==null){u.child.return=u,u=u.child;continue}if(u===l)break u;for(;u.sibling===null;){if(u.return===null||u.return===l)break u;u=u.return}u.sibling.return=u.return,u=u.sibling}r&=1}if(Wl(Hl,r),(l.mode&1)===0)l.memoizedState=null;else switch(n){case"forwards":f=l.child;for(n=null;f!==null;)u=f.alternate,u!==null&&Q$(u)===null&&(n=f),f=f.sibling;f=n,f===null?(n=l.child,l.child=null):(n=f.sibling,f.sibling=null),g6(l,!1,n,f,i);break;case"backwards":f=null,n=l.child;for(l.child=null;n!==null;){if(u=n.alternate,u!==null&&Q$(u)===null){l.child=n;break}u=n.sibling,n.sibling=f,f=n,n=u}g6(l,!0,f,null,i);break;case"together":g6(l,!1,null,null,void 0);break;default:l.memoizedState=null}return l.child}function a_(u,l){(l.mode&1)===0&&u!==null&&(u.alternate=null,l.alternate=null,l.flags|=2)}function Xn(u,l,f){if(u!==null&&(l.dependencies=u.dependencies),Ki|=l.lanes,(f&l.childLanes)===0)return null;if(u!==null&&l.child!==u.child)throw Error(Ju(153));if(l.child!==null){u=l.child,f=W0(u,u.pendingProps),l.child=f;for(f.return=l;u.sibling!==null;)u=u.sibling,f=f.sibling=W0(u,u.pendingProps),f.return=l;f.sibling=null}return l.child}function nz(u,l,f){switch(l.tag){case 3:uJ(l),St();break;case 5:ZU(l);break;case 1:If(l.type)&&$$(l);break;case 4:J4(l,l.stateNode.containerInfo);break;case 10:var r=l.type._context,n=l.memoizedProps.value;Wl(F$,r._currentValue),r._currentValue=n;break;case 13:if(r=l.memoizedState,r!==null){if(r.dehydrated!==null)return Wl(Hl,Hl.current&1),l.flags|=128,null;if((f&l.child.childLanes)!==0)return lJ(u,l,f);return Wl(Hl,Hl.current&1),u=Xn(u,l,f),u!==null?u.sibling:null}Wl(Hl,Hl.current&1);break;case 19:if(r=(f&l.childLanes)!==0,(u.flags&128)!==0){if(r)return fJ(u,l,f);l.flags|=128}if(n=l.memoizedState,n!==null&&(n.rendering=null,n.tail=null,n.lastEffect=null),Wl(Hl,Hl.current),r)break;else return null;case 22:case 23:return l.lanes=0,dU(u,l,f)}return Xn(u,l,f)}var rJ,X8,nJ,iJ;rJ=function(u,l){for(var f=l.child;f!==null;){if(f.tag===5||f.tag===6)u.appendChild(f.stateNode);else if(f.tag!==4&&f.child!==null){f.child.return=f,f=f.child;continue}if(f===l)break;for(;f.sibling===null;){if(f.return===null||f.return===l)return;f=f.return}f.sibling.return=f.return,f=f.sibling}};X8=function(){};nJ=function(u,l,f,r){var n=u.memoizedProps;if(n!==r){u=l.stateNode,Ni(An.current);var i=null;switch(f){case"input":n=f8(u,n),r=f8(u,r),i=[];break;case"select":n=Vl({},n,{value:void 0}),r=Vl({},r,{value:void 0}),i=[];break;case"textarea":n=i8(u,n),r=i8(u,r),i=[];break;default:typeof n.onClick!=="function"&&typeof r.onClick==="function"&&(u.onclick=c$)}y8(f,r);var t;f=null;for($ in n)if(!r.hasOwnProperty($)&&n.hasOwnProperty($)&&n[$]!=null)if($==="style"){var y=n[$];for(t in y)y.hasOwnProperty(t)&&(f||(f={}),f[t]="")}else $!=="dangerouslySetInnerHTML"&&$!=="children"&&$!=="suppressContentEditableWarning"&&$!=="suppressHydrationWarning"&&$!=="autoFocus"&&(Q1.hasOwnProperty($)?i||(i=[]):(i=i||[]).push($,null));for($ in r){var c=r[$];if(y=n!=null?n[$]:void 0,r.hasOwnProperty($)&&c!==y&&(c!=null||y!=null))if($==="style")if(y){for(t in y)!y.hasOwnProperty(t)||c&&c.hasOwnProperty(t)||(f||(f={}),f[t]="");for(t in c)c.hasOwnProperty(t)&&y[t]!==c[t]&&(f||(f={}),f[t]=c[t])}else f||(i||(i=[]),i.push($,f)),f=c;else $==="dangerouslySetInnerHTML"?(c=c?c.__html:void 0,y=y?y.__html:void 0,c!=null&&y!==c&&(i=i||[]).push($,c)):$==="children"?typeof c!=="string"&&typeof c!=="number"||(i=i||[]).push($,""+c):$!=="suppressContentEditableWarning"&&$!=="suppressHydrationWarning"&&(Q1.hasOwnProperty($)?(c!=null&&$==="onScroll"&&Gl("scroll",u),i||y===c||(i=[])):(i=i||[]).push($,c))}f&&(i=i||[]).push("style",f);var $=i;if(l.updateQueue=$)l.flags|=4}};iJ=function(u,l,f,r){f!==r&&(l.flags|=4)};function oy(u,l){if(!Ol)switch(u.tailMode){case"hidden":l=u.tail;for(var f=null;l!==null;)l.alternate!==null&&(f=l),l=l.sibling;f===null?u.tail=null:f.sibling=null;break;case"collapsed":f=u.tail;for(var r=null;f!==null;)f.alternate!==null&&(r=f),f=f.sibling;r===null?l||u.tail===null?u.tail=null:u.tail.sibling=null:r.sibling=null}}function Lf(u){var l=u.alternate!==null&&u.alternate.child===u.child,f=0,r=0;if(l)for(var n=u.child;n!==null;)f|=n.lanes|n.childLanes,r|=n.subtreeFlags&14680064,r|=n.flags&14680064,n.return=u,n=n.sibling;else for(n=u.child;n!==null;)f|=n.lanes|n.childLanes,r|=n.subtreeFlags,r|=n.flags,n.return=u,n=n.sibling;return u.subtreeFlags|=r,u.childLanes=f,l}function iz(u,l,f){var r=l.pendingProps;switch(c4(l),l.tag){case 2:case 16:case 15:case 0:case 11:case 7:case 8:case 12:case 9:case 14:return Lf(l),null;case 1:return If(l.type)&&_$(),Lf(l),null;case 3:if(r=l.stateNode,Yt(),zl(kf),zl(Kf),N4(),r.pendingContext&&(r.context=r.pendingContext,r.pendingContext=null),u===null||u.child===null)P_(l)?l.flags|=4:u===null||u.memoizedState.isDehydrated&&(l.flags&256)===0||(l.flags|=1024,br!==null&&(b8(br),br=null));return X8(u,l),Lf(l),null;case 5:Q4(l);var n=Ni(Z1.current);if(f=l.type,u!==null&&l.stateNode!=null)nJ(u,l,f,r,n),u.ref!==l.ref&&(l.flags|=512,l.flags|=2097152);else{if(!r){if(l.stateNode===null)throw Error(Ju(166));return Lf(l),null}if(u=Ni(An.current),P_(l)){r=l.stateNode,f=l.type;var i=l.memoizedProps;switch(r[_n]=l,r[E1]=i,u=(l.mode&1)!==0,f){case"dialog":Gl("cancel",r),Gl("close",r);break;case"iframe":case"object":case"embed":Gl("load",r);break;case"video":case"audio":for(n=0;n",u=u.removeChild(u.firstChild)):typeof r.is==="string"?u=t.createElement(f,{is:r.is}):(u=t.createElement(f),f==="select"&&(t=u,r.multiple?t.multiple=!0:r.size&&(t.size=r.size))):u=t.createElementNS(u,f),u[_n]=l,u[E1]=r,rJ(u,l,!1,!1),l.stateNode=u;u:{switch(t=c8(f,r),f){case"dialog":Gl("cancel",u),Gl("close",u),n=r;break;case"iframe":case"object":case"embed":Gl("load",u),n=r;break;case"video":case"audio":for(n=0;nCt&&(l.flags|=128,r=!0,oy(i,!1),l.lanes=4194304)}else{if(!r)if(u=Q$(t),u!==null){if(l.flags|=128,r=!0,f=u.updateQueue,f!==null&&(l.updateQueue=f,l.flags|=4),oy(i,!0),i.tail===null&&i.tailMode==="hidden"&&!t.alternate&&!Ol)return Lf(l),null}else 2*hl()-i.renderingStartTime>Ct&&f!==1073741824&&(l.flags|=128,r=!0,oy(i,!1),l.lanes=4194304);i.isBackwards?(t.sibling=l.child,l.child=t):(f=i.last,f!==null?f.sibling=t:l.child=t,i.last=t)}if(i.tail!==null)return l=i.tail,i.rendering=l,i.tail=l.sibling,i.renderingStartTime=hl(),l.sibling=null,f=Hl.current,Wl(Hl,r?f&1|2:f&1),l;return Lf(l),null;case 22:case 23:return Z4(),r=l.memoizedState!==null,u!==null&&u.memoizedState!==null!==r&&(l.flags|=8192),r&&(l.mode&1)!==0?(yr&1073741824)!==0&&(Lf(l),l.subtreeFlags&6&&(l.flags|=8192)):Lf(l),null;case 24:return null;case 25:return null}throw Error(Ju(156,l.tag))}function tz(u,l){switch(c4(l),l.tag){case 1:return If(l.type)&&_$(),u=l.flags,u&65536?(l.flags=u&-65537|128,l):null;case 3:return Yt(),zl(kf),zl(Kf),N4(),u=l.flags,(u&65536)!==0&&(u&128)===0?(l.flags=u&-65537|128,l):null;case 5:return Q4(l),null;case 13:if(zl(Hl),u=l.memoizedState,u!==null&&u.dehydrated!==null){if(l.alternate===null)throw Error(Ju(340));St()}return u=l.flags,u&65536?(l.flags=u&-65537|128,l):null;case 19:return zl(Hl),null;case 4:return Yt(),null;case 10:return j4(l.type._context),null;case 22:case 23:return Z4(),null;case 24:return null;default:return null}}var R_=!1,Tf=!1,yz=typeof WeakSet==="function"?WeakSet:Set,Hu=null;function zt(u,l){var f=u.ref;if(f!==null)if(typeof f==="function")try{f(null)}catch(r){Cl(u,l,r)}else f.current=null}function Y8(u,l,f){try{f()}catch(r){Cl(u,l,r)}}var JF=!1;function cz(u,l){if(W8=i$,u=$U(),t4(u)){if("selectionStart"in u)var f={start:u.selectionStart,end:u.selectionEnd};else u:{f=(f=u.ownerDocument)&&f.defaultView||window;var r=f.getSelection&&f.getSelection();if(r&&r.rangeCount!==0){f=r.anchorNode;var{anchorOffset:n,focusNode:i}=r;r=r.focusOffset;try{f.nodeType,i.nodeType}catch(w){f=null;break u}var t=0,y=-1,c=-1,$=0,A=0,j=u,F=null;l:for(;;){for(var J;;){if(j!==f||n!==0&&j.nodeType!==3||(y=t+n),j!==i||r!==0&&j.nodeType!==3||(c=t+r),j.nodeType===3&&(t+=j.nodeValue.length),(J=j.firstChild)===null)break;F=j,j=J}for(;;){if(j===u)break l;if(F===f&&++$===n&&(y=t),F===i&&++A===r&&(c=t),(J=j.nextSibling)!==null)break;j=F,F=j.parentNode}j=J}f=y===-1||c===-1?null:{start:y,end:c}}else f=null}f=f||{start:0,end:0}}else f=null;L8={focusedElem:u,selectionRange:f},i$=!1;for(Hu=l;Hu!==null;)if(l=Hu,u=l.child,(l.subtreeFlags&1028)!==0&&u!==null)u.return=l,Hu=u;else for(;Hu!==null;){l=Hu;try{var Q=l.alternate;if((l.flags&1024)!==0)switch(l.tag){case 0:case 11:case 15:break;case 1:if(Q!==null){var{memoizedProps:W,memoizedState:L}=Q,U=l.stateNode,q=U.getSnapshotBeforeUpdate(l.elementType===l.type?W:xr(l.type,W),L);U.__reactInternalSnapshotBeforeUpdate=q}break;case 3:var N=l.stateNode.containerInfo;N.nodeType===1?N.textContent="":N.nodeType===9&&N.documentElement&&N.removeChild(N.documentElement);break;case 5:case 6:case 4:case 17:break;default:throw Error(Ju(163))}}catch(w){Cl(l,l.return,w)}if(u=l.sibling,u!==null){u.return=l.return,Hu=u;break}Hu=l.return}return Q=JF,JF=!1,Q}function F1(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&&Y8(l,f,i)}n=n.next}while(n!==r)}}function m$(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 P8(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 tJ(u){var l=u.alternate;l!==null&&(u.alternate=null,tJ(l)),u.child=null,u.deletions=null,u.sibling=null,u.tag===5&&(l=u.stateNode,l!==null&&(delete l[_n],delete l[E1],delete l[G8],delete l[bG],delete l[vG])),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 yJ(u){return u.tag===5||u.tag===3||u.tag===4}function QF(u){u:for(;;){for(;u.sibling===null;){if(u.return===null||yJ(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 C8(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=c$));else if(r!==4&&(u=u.child,u!==null))for(C8(u,l,f),u=u.sibling;u!==null;)C8(u,l,f),u=u.sibling}function M8(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(M8(u,l,f),u=u.sibling;u!==null;)M8(u,l,f),u=u.sibling}var jf=null,hr=!1;function t0(u,l,f){for(f=f.child;f!==null;)cJ(u,l,f),f=f.sibling}function cJ(u,l,f){if($n&&typeof $n.onCommitFiberUnmount==="function")try{$n.onCommitFiberUnmount(G$,f)}catch(y){}switch(f.tag){case 5:Tf||zt(f,l);case 6:var r=jf,n=hr;jf=null,t0(u,l,f),jf=r,hr=n,jf!==null&&(hr?(u=jf,f=f.stateNode,u.nodeType===8?u.parentNode.removeChild(f):u.removeChild(f)):jf.removeChild(f.stateNode));break;case 18:jf!==null&&(hr?(u=jf,f=f.stateNode,u.nodeType===8?R6(u.parentNode,f):u.nodeType===1&&R6(u,f),L1(u)):R6(jf,f.stateNode));break;case 4:r=jf,n=hr,jf=f.stateNode.containerInfo,hr=!0,t0(u,l,f),jf=r,hr=n;break;case 0:case 11:case 14:case 15:if(!Tf&&(r=f.updateQueue,r!==null&&(r=r.lastEffect,r!==null))){n=r=r.next;do{var i=n,t=i.destroy;i=i.tag,t!==void 0&&((i&2)!==0?Y8(f,l,t):(i&4)!==0&&Y8(f,l,t)),n=n.next}while(n!==r)}t0(u,l,f);break;case 1:if(!Tf&&(zt(f,l),r=f.stateNode,typeof r.componentWillUnmount==="function"))try{r.props=f.memoizedProps,r.state=f.memoizedState,r.componentWillUnmount()}catch(y){Cl(f,l,y)}t0(u,l,f);break;case 21:t0(u,l,f);break;case 22:f.mode&1?(Tf=(r=Tf)||f.memoizedState!==null,t0(u,l,f),Tf=r):t0(u,l,f);break;default:t0(u,l,f)}}function NF(u){var l=u.updateQueue;if(l!==null){u.updateQueue=null;var f=u.stateNode;f===null&&(f=u.stateNode=new yz),l.forEach(function(r){var n=Nz.bind(null,u,r);f.has(r)||(f.add(r),r.then(n,n))})}}function Rr(u,l){var f=l.deletions;if(f!==null)for(var r=0;rn&&(n=t),r&=~i}if(r=n,r=hl()-r,r=(120>r?120:480>r?480:1080>r?1080:1920>r?1920:3000>r?3000:4320>r?4320:1960*$z(r/1960))-r,10u?16:u,j0===null)var r=!1;else{if(u=j0,j0=null,L$=0,(cl&6)!==0)throw Error(Ju(331));var n=cl;cl|=4;for(Hu=u.current;Hu!==null;){var i=Hu,t=i.child;if((Hu.flags&16)!==0){var y=i.deletions;if(y!==null){for(var c=0;chl()-E4?qi(u,0):z4|=f),gf(u,l)}function QJ(u,l){l===0&&((u.mode&1)===0?l=1:(l=m_,m_<<=1,(m_&130023424)===0&&(m_=4194304)));var f=pf();u=Sn(u,l),u!==null&&(D1(u,l,f),gf(u,f))}function Qz(u){var l=u.memoizedState,f=0;l!==null&&(f=l.retryLane),QJ(u,f)}function Nz(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),QJ(u,f)}var NJ;NJ=function(u,l,f){if(u!==null)if(u.memoizedProps!==l.pendingProps||kf.current)vf=!0;else{if((u.lanes&f)===0&&(l.flags&128)===0)return vf=!1,nz(u,l,f);vf=(u.flags&131072)!==0?!0:!1}else vf=!1,Ol&&(l.flags&1048576)!==0&&LU(l,j$,l.index);switch(l.lanes=0,l.tag){case 2:var r=l.type;a_(u,l),u=l.pendingProps;var n=pt(l,Kf.current);Vt(l,f),n=w4(null,l,r,u,n,f);var i=W4();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,If(r)?(i=!0,$$(l)):i=!1,l.memoizedState=n.state!==null&&n.state!==void 0?n.state:null,U4(l),n.updater=V$,l.stateNode=n,n._reactInternals=l,B8(l,r,u,f),l=D8(null,l,r,!0,i,f)):(l.tag=0,Ol&&i&&y4(l),Df(null,l,n,f),l=l.child),l;case 16:r=l.elementType;u:{switch(a_(u,l),u=l.pendingProps,n=r._init,r=n(r._payload),l.type=r,n=l.tag=wz(r),u=xr(r,u),n){case 0:l=m8(null,l,r,u,f);break u;case 1:l=jF(null,l,r,u,f);break u;case 11:l=$F(null,l,r,u,f);break u;case 14:l=AF(null,l,r,xr(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:xr(r,n),m8(u,l,r,n,f);case 1:return r=l.type,n=l.pendingProps,n=l.elementType===r?n:xr(r,n),jF(u,l,r,n,f);case 3:u:{if(uJ(l),u===null)throw Error(Ju(387));r=l.pendingProps,i=l.memoizedState,n=i.element,OU(u,l),J$(l,r,null,f);var t=l.memoizedState;if(r=t.element,i.isDehydrated)if(i={element:r,isDehydrated:!1,cache:t.cache,pendingSuspenseBoundaries:t.pendingSuspenseBoundaries,transitions:t.transitions},l.updateQueue.baseState=i,l.memoizedState=i,l.flags&256){n=Pt(Error(Ju(423)),l),l=FF(u,l,r,f,n);break u}else if(r!==n){n=Pt(Error(Ju(424)),l),l=FF(u,l,r,f,n);break u}else for(cr=Q0(l.stateNode.containerInfo.firstChild),_r=l,Ol=!0,br=null,f=zU(l,null,r,f),l.child=f;f;)f.flags=f.flags&-3|4096,f=f.sibling;else{if(St(),r===n){l=Xn(u,l,f);break u}Df(u,l,r,f)}l=l.child}return l;case 5:return ZU(l),u===null&&O8(l),r=l.type,n=l.pendingProps,i=u!==null?u.memoizedProps:null,t=n.children,T8(r,n)?t=null:i!==null&&T8(r,i)&&(l.flags|=32),eU(u,l),Df(u,l,t,f),l.child;case 6:return u===null&&O8(l),null;case 13:return lJ(u,l,f);case 4:return J4(l,l.stateNode.containerInfo),r=l.pendingProps,u===null?l.child=Xt(l,null,r,f):Df(u,l,r,f),l.child;case 11:return r=l.type,n=l.pendingProps,n=l.elementType===r?n:xr(r,n),$F(u,l,r,n,f);case 7:return Df(u,l,l.pendingProps,f),l.child;case 8:return Df(u,l,l.pendingProps.children,f),l.child;case 12:return Df(u,l,l.pendingProps.children,f),l.child;case 10:u:{if(r=l.type._context,n=l.pendingProps,i=l.memoizedProps,t=n.value,Wl(F$,r._currentValue),r._currentValue=t,i!==null)if(Ir(i.value,t)){if(i.children===n.children&&!kf.current){l=Xn(u,l,f);break u}}else for(i=l.child,i!==null&&(i.return=l);i!==null;){var y=i.dependencies;if(y!==null){t=i.child;for(var c=y.firstContext;c!==null;){if(c.context===r){if(i.tag===1){c=mn(-1,f&-f),c.tag=2;var $=i.updateQueue;if($!==null){$=$.shared;var A=$.pending;A===null?c.next=c:(c.next=A.next,A.next=c),$.pending=c}}i.lanes|=f,c=i.alternate,c!==null&&(c.lanes|=f),Z8(i.return,f,l),y.lanes|=f;break}c=c.next}}else if(i.tag===10)t=i.type===l.type?null:i.child;else if(i.tag===18){if(t=i.return,t===null)throw Error(Ju(341));t.lanes|=f,y=t.alternate,y!==null&&(y.lanes|=f),Z8(t,f,l),t=i.sibling}else t=i.child;if(t!==null)t.return=i;else for(t=i;t!==null;){if(t===l){t=null;break}if(i=t.sibling,i!==null){i.return=t.return,t=i;break}t=t.return}i=t}Df(u,l,n.children,f),l=l.child}return l;case 9:return n=l.type,r=l.pendingProps.children,Vt(l,f),n=Or(n),r=r(n),l.flags|=1,Df(u,l,r,f),l.child;case 14:return r=l.type,n=xr(r,l.pendingProps),n=xr(r.type,n),AF(u,l,r,n,f);case 15:return oU(u,l,l.type,l.pendingProps,f);case 17:return r=l.type,n=l.pendingProps,n=l.elementType===r?n:xr(r,n),a_(u,l),l.tag=1,If(r)?(u=!0,$$(l)):u=!1,Vt(l,f),gU(l,r,n),B8(l,r,n,f),D8(null,l,r,!0,u,f);case 19:return fJ(u,l,f);case 22:return dU(u,l,f)}throw Error(Ju(156,l.tag))};function qJ(u,l){return vF(u,l)}function qz(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 zr(u,l,f,r){return new qz(u,l,f,r)}function B4(u){return u=u.prototype,!(!u||!u.isReactComponent)}function wz(u){if(typeof u==="function")return B4(u)?1:0;if(u!==void 0&&u!==null){if(u=u.$$typeof,u===s8)return 11;if(u===a8)return 14}return 2}function W0(u,l){var f=u.alternate;return f===null?(f=zr(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 e_(u,l,f,r,n,i){var t=2;if(r=u,typeof u==="function")B4(u)&&(t=1);else if(typeof u==="string")t=5;else u:switch(u){case Qt:return wi(f.children,n,i,l);case g8:t=8,n|=8;break;case d6:return u=zr(12,f,l,n|2),u.elementType=d6,u.lanes=i,u;case e6:return u=zr(13,f,l,n),u.elementType=e6,u.lanes=i,u;case u8:return u=zr(19,f,l,n),u.elementType=u8,u.lanes=i,u;case ZF:return p$(f,n,i,l);default:if(typeof u==="object"&&u!==null)switch(u.$$typeof){case EF:t=10;break u;case OF:t=9;break u;case s8:t=11;break u;case a8:t=14;break u;case y0:t=16,r=null;break u}throw Error(Ju(130,u==null?u:typeof u,""))}return l=zr(t,f,l,n),l.elementType=u,l.type=r,l.lanes=i,l}function wi(u,l,f,r){return u=zr(7,u,r,l),u.lanes=f,u}function p$(u,l,f,r){return u=zr(22,u,r,l),u.elementType=ZF,u.lanes=f,u.stateNode={isHidden:!1},u}function s6(u,l,f){return u=zr(6,u,null,l),u.lanes=f,u}function a6(u,l,f){return l=zr(4,u.children!==null?u.children:[],u.key,l),l.lanes=f,l.stateNode={containerInfo:u.containerInfo,pendingChildren:null,implementation:u.implementation},l}function Wz(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=p6(0),this.expirationTimes=p6(-1),this.entangledLanes=this.finishedLanes=this.mutableReadLanes=this.expiredLanes=this.pingedLanes=this.suspendedLanes=this.pendingLanes=0,this.entanglements=p6(0),this.identifierPrefix=r,this.onRecoverableError=n,this.mutableSourceEagerHydrationData=null}function V4(u,l,f,r,n,i,t,y,c){return u=new Wz(u,l,f,y,c),l===1?(l=1,i===!0&&(l|=8)):l=0,i=zr(3,null,null,l),u.current=i,i.stateNode=u,i.memoizedState={element:r,isDehydrated:f,cache:null,transitions:null,pendingSuspenseBoundaries:null},U4(i),u}function Lz(u,l,f){var r=3{function KJ(){if(typeof __REACT_DEVTOOLS_GLOBAL_HOOK__>"u"||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!=="function")return;try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(KJ)}catch(u){console.error(u)}}KJ(),GJ.exports=TJ()});var EJ=tr((X4)=>{var zJ=S4();X4.createRoot=zJ.createRoot,X4.hydrateRoot=zJ.hydrateRoot;var Ez});var VN=tr((G3)=>{var dZ=Jl(),eZ=Symbol.for("react.element"),uH=Symbol.for("react.fragment"),lH=Object.prototype.hasOwnProperty,fH=dZ.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner,rH={key:!0,ref:!0,__self:!0,__source:!0};function BN(u,l,f){var r,n={},i=null,t=null;f!==void 0&&(i=""+f),l.key!==void 0&&(i=""+l.key),l.ref!==void 0&&(t=l.ref);for(r in l)lH.call(l,r)&&!rH.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:eZ,type:u,key:i,ref:t,props:n,_owner:fH.current}}G3.Fragment=uH;G3.jsx=BN;G3.jsxs=BN});var DN=tr(($C,mN)=>{mN.exports=VN()});var $w=tr((_w)=>{var Ly=Jl();function Wm(u,l){return u===l&&(u!==0||1/u===1/l)||u!==u&&l!==l}var Lm=typeof Object.is==="function"?Object.is:Wm,Tm=Ly.useState,Km=Ly.useEffect,Gm=Ly.useLayoutEffect,zm=Ly.useDebugValue;function Em(u,l){var f=l(),r=Tm({inst:{value:f,getSnapshot:l}}),n=r[0].inst,i=r[1];return Gm(function(){n.value=f,n.getSnapshot=l,H9(n)&&i({inst:n})},[u,f,l]),Km(function(){return H9(n)&&i({inst:n}),u(function(){H9(n)&&i({inst:n})})},[u]),zm(f),f}function H9(u){var l=u.getSnapshot;u=u.value;try{var f=l();return!Lm(u,f)}catch(r){return!0}}function Om(u,l){return l()}var Zm=typeof window>"u"||typeof window.document>"u"||typeof window.document.createElement>"u"?Om:Em;_w.useSyncExternalStore=Ly.useSyncExternalStore!==void 0?Ly.useSyncExternalStore:Zm});var jw=tr((rv,Aw)=>{Aw.exports=$w()});var Uw=tr((Fw)=>{var NA=Jl(),Hm=jw();function Bm(u,l){return u===l&&(u!==0||1/u===1/l)||u!==u&&l!==l}var Vm=typeof Object.is==="function"?Object.is:Bm,mm=Hm.useSyncExternalStore,Dm=NA.useRef,pm=NA.useEffect,Sm=NA.useMemo,Xm=NA.useDebugValue;Fw.useSyncExternalStoreWithSelector=function(u,l,f,r,n){var i=Dm(null);if(i.current===null){var t={hasValue:!1,value:null};i.current=t}else t=i.current;i=Sm(function(){function c(J){if(!$){if($=!0,A=J,J=r(J),n!==void 0&&t.hasValue){var Q=t.value;if(n(Q,J))return j=Q}return j=J}if(Q=j,Vm(A,J))return Q;var W=r(J);if(n!==void 0&&n(Q,W))return A=J,Q;return A=J,j=W}var $=!1,A,j,F=f===void 0?null:f;return[function(){return c(l())},F===null?void 0:function(){return c(F())}]},[l,f,r,n]);var y=mm(u,i[0],i[1]);return pm(function(){t.hasValue=!0,t.value=y},[y]),Xm(y),y}});var Qw=tr((iv,Jw)=>{Jw.exports=Uw()});var ui=Cu(Jl(),1);var W_="北京时间";var LK={timeZone:"Asia/Shanghai",hour12:!1},TK={timeZone:"Asia/Shanghai",hour12:!1},KK=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 q6(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 _j(u){let l=q6(u);if(!l)return null;return KK.formatToParts(l).reduce((f,r)=>{if(r.type!=="literal")f[r.type]=r.value;return f},{})}function wu(u){let l=q6(u);return l?l.toLocaleString("zh-CN",LK):"--"}function yl(u){let l=q6(u);return l?l.toLocaleTimeString("zh-CN",TK):"--"}function w6(u){let l=_j(u);if(!l)return"";let f=l.hour==="24"?"00":l.hour;return`${l.year}-${l.month}-${l.day}T${f}:${l.minute}`}function $j(u=new Date){let l=_j(u);if(!l)return"";return`${l.year}-${l.month}-${l.day}`}function Aj(u){if(!u)return null;let l=/^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2})(?::(\d{2}))?$/.exec(u);if(!l)return null;let[,f,r,n,i,t,y="00"]=l,c=Date.UTC(Number(f),Number(r)-1,Number(n),Number(i)-8,Number(t),Number(y)),$=new Date(c),A=w6($);return Number.isNaN($.getTime())||A!==`${f}-${r}-${n}T${i}:${t}`?null:$.toISOString()}var hL=Cu(EJ(),1);var R$=Cu(Jl(),1);var OJ=Cu(Jl(),1),Y1=OJ.default.createElement;function Oz({active:u=!0,label:l="正在加载"}){if(!u)return null;return Y1("span",{className:"loading-spinner-indicator",role:"status","aria-label":l,title:l,"data-testid":"loading-title-indicator"},Y1("span",{className:"loading-spinner-ring","aria-hidden":!0}))}function rl({title:u,children:l,loading:f,level:r=2,className:n="",label:i="正在加载"}){return Y1(r===3?"h3":"h2",{className:`loading-title ${f?"is-loading":""} ${n}`.trim()},Y1("span",{className:"loading-title-text"},l??u),Y1(Oz,{active:Boolean(f),label:i}))}class xt extends Error{unideskRequestError=!0;meta;constructor(u,l){super(u);this.name="UniDeskRequestError",this.meta=l}}function Zz(u){return new Promise((l)=>setTimeout(l,u))}function M1(u,l="操作失败"){return u instanceof Error?u.message:String(u||l)}function C$(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 Hz(u){try{let l=typeof location<"u"&&location.origin?location.origin:"http://localhost";return new URL(u,l).toString()}catch{return u}}function ZJ(u){return String(u.method||"GET").toUpperCase()}function Bz(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 HJ(u){let l=new Headers(u.headers||{}),f=Bz(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 BJ(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 Vz(u,l){if(!u||typeof u!=="object"||Array.isArray(u))return!1;return l.some((f)=>f!==!1&&u[f]===!1)}function P1(u,l,f,r,n={}){return{kind:u,method:f,url:Hz(l),occurredAt:r.toISOString(),...n}}function C1(u,l){if(!u)return"请求失败";return`HTTP ${u}${l?` ${l}`:""}`}function VJ(u){try{return{body:u?JSON.parse(u):null,parseError:""}}catch(l){return{body:{text:u},parseError:M1(l,"parse failed")}}}async function Eu(u,l={},f=0){let{failureFields:r=["ok"],strictJson:n=!1,retryInvalidJson:i=0,retryDelayMs:t=120,invalidJsonPrefix:y="服务返回了无效 JSON",invalidJsonPreview:c=!1,responsePreviewLength:$=500,...A}=l,j=ZJ(A),F=new Date,J;try{J=await fetch(u,HJ(A))}catch(L){let U=M1(L,"网络请求失败");throw new xt(U,P1("network",u,j,F,{upstreamMessage:U}))}let Q=await J.text(),W=VJ(Q);if(W.parseError){if(n&&j==="GET"&&f=300)?C1(u.meta.status,u.meta.statusText):"应用请求失败",i=u.meta.status?C1(u.meta.status):"",t=(c)=>!c||c===n||c===i,y=!t(u.message)?u.message:t(u.meta.upstreamMessage)?"":u.meta.upstreamMessage||"";return{title:n,message:y,status:u.meta.status,statusText:u.meta.statusText,method:u.meta.method,url:u.meta.url,occurredAt:mz(u.meta.occurredAt),responsePreview:u.meta.responsePreview,parseError:u.meta.parseError,structured:!0}}let r=M1(u,l).split(/\r?\n/u);return{title:r[0]||l,message:r.slice(1).join(` +`),structured:r.length>1}}function Dz(u,l="操作失败"){let f=Y4(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(`状态: ${C1(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 DJ(u)?Dz(u,l):M1(u,l)}var pJ=Cu(Jl(),1);var E0=pJ.default.createElement;function R1(u,l){return l?[E0("dt",{key:`${u}-label`},u),E0("dd",{key:u},l)]:null}function nl({error:u,wide:l=!1,fallback:f="操作失败",className:r=""}){if(!u)return null;let n=Y4(u,f),i=[R1("请求",[n.method,n.url].filter(Boolean).join(" ")),R1("状态",n.status?`HTTP ${n.status}${n.statusText?` ${n.statusText}`:""}`:""),R1("时间",n.occurredAt),R1("解析错误",n.parseError),R1("响应预览",n.responsePreview)].filter(Boolean);return E0("div",{className:`form-error unidesk-error${l?" wide":""}${r?` ${r}`:""}`,role:"alert","data-testid":"unidesk-error"},E0("div",{className:"unidesk-error-title"},E0("strong",null,n.title),n.status?E0("span",{className:"unidesk-error-code"},`HTTP ${n.status}`):null),n.message?E0("pre",{className:"unidesk-error-message"},n.message):null,i.length>0?E0("dl",{className:"unidesk-error-details"},i):null)}var jn=Cu(Jl(),1),SJ=jn.default.createContext(null);function XJ({children:u}){let[l,f]=jn.default.useState([]),[r,n]=jn.default.useState(Date.now()),i=jn.default.useCallback((j,F)=>{let Q={id:`notif_${Date.now()}_${Math.random().toString(36).slice(2,8)}`,type:j,message:F,timestamp:Date.now()};f((W)=>{let L=[...W,Q];if(L.length>50)return L.slice(-50);return L})},[]),t=jn.default.useCallback((j)=>{f((F)=>F.filter((J)=>J.id!==j))},[]),y=jn.default.useCallback(()=>{f([]),n(Date.now())},[]),c=jn.default.useMemo(()=>{return l.filter((j)=>j.timestamp>r).length},[l,r]),$=c>0,A={notifications:l,addNotification:i,removeNotification:t,clearNotifications:y,unreadCount:c,hasUnread:$};return pz(SJ.Provider,{value:A},u)}var pz=jn.default.createElement;function Xf(){let u=jn.default.useContext(SJ);if(!u)throw Error("useNotification must be used within NotificationProvider");return u}var x=R$.default.createElement,{useEffect:M$}=R$.default,ht=R$.default.useState;function Gf(u,l={}){return Eu(u,{failureFields:["ok","success"],...l})}function Yf(u,l){return`${u}/microservices/baidu-netdisk/proxy${l}`}function Sz(u){let l=Number(u);return Number.isFinite(l)?l.toLocaleString("zh-CN"):"--"}function O0(u){let l=Number(u);if(!Number.isFinite(l)||l<=0)return"--";let f=["B","KB","MB","GB","TB"],r=l,n=0;while(r>=1024&&n{n?.stopPropagation?.(),f(u,l)}},"查看原始JSON")}function vt({title:u,text:l}){return x("div",{className:"empty-state"},x("strong",null,u),x("span",null,l))}function kt({title:u,text:l,href:f,badge:r,testId:n}){return x("a",{className:"doc-link-card",href:f,target:"_blank",rel:"noreferrer","data-testid":n},x("span",null,r||"DOC"),x("strong",null,u),x("p",null,l),x("code",null,f))}function Xz(u){return u?.runtime&&typeof u.runtime==="object"&&!Array.isArray(u.runtime)?u.runtime:{}}function Yz(u){return u?.backend&&typeof u.backend==="object"&&!Array.isArray(u.backend)?u.backend:{}}function Pz(u){return u?.repository&&typeof u.repository==="object"&&!Array.isArray(u.repository)?u.repository:{}}function Cz(u){return Array.isArray(u?.files)?u.files:[]}function Mz(u){return Array.isArray(u?.jobs)?u.jobs:[]}function Rz(u,l){if(!u||u===l)return l;let f=u.replace(/\/+$/u,""),r=f.slice(0,f.lastIndexOf("/"))||l;return r.lengthh.id==="baidu-netdisk")||null,[n,i]=ht({loading:!1,actionLoading:!1,error:"",message:"",health:null,account:null,files:null,transfers:null,logs:null,selfTest:null,refreshedAt:null}),[t,y]=ht("/"),[c,$]=ht(null),[A,j]=ht(""),[F,J]=ht({localPath:"sample.txt",remotePath:"/sample.txt"}),[Q,W]=ht({fsId:"",localPath:"downloads/"}),{addNotification:L}=Xf(),U=n.health?.baidu?.appRoot||n.account?.rootPath||"/";M$(()=>{J((h)=>{let lu=new Set(["/sample.txt","/apps/UniDeskBaiduNetdisk/sample.txt"]);if(h.remotePath&&!lu.has(h.remotePath))return h;let cu=P4(U,"sample.txt");return h.remotePath===cu?h:{...h,remotePath:cu}})},[U]);async function q(h=t){let cu=await Gf(Yf(f,`/api/files?dir=${encodeURIComponent(h||U)}&limit=100`));i((_u)=>({..._u,files:cu}))}async function N(){let h=await Gf(Yf(f,"/api/transfers?limit=80"));i((lu)=>({...lu,transfers:h}))}async function w(){if(!r)return;i((h)=>({...h,loading:!0,error:"",message:""}));try{let h=await Gf(`${f}/microservices/baidu-netdisk/health`),lu=h?.baidu?.appRoot||U,cu=null,_u=null;if(h?.auth?.loggedIn){cu=await Gf(Yf(f,"/api/account?refresh=1"));let Wu=t&&t.startsWith(lu)?t:lu;y(Wu),_u=await Gf(Yf(f,`/api/files?dir=${encodeURIComponent(Wu)}&limit=100`))}else y(lu);let Fu=await Gf(Yf(f,"/api/transfers?limit=80")),zu=await Gf(Yf(f,"/logs?limit=60"));i((Wu)=>({...Wu,loading:!1,health:h,account:cu?.account||null,files:_u,transfers:Fu,logs:zu,refreshedAt:new Date}))}catch(h){i((lu)=>({...lu,loading:!1,error:Ou(h,"百度网盘服务加载失败")}))}}async function G(){i((h)=>({...h,actionLoading:!0,error:"",message:""}));try{let h=await Gf(Yf(f,"/api/auth/device/start"),{method:"POST",body:{}});$(h.session||null),i((lu)=>({...lu,actionLoading:!1,message:"设备码已生成,请扫码授权"}))}catch(h){i((lu)=>({...lu,actionLoading:!1,error:Ou(h,"创建设备码失败")}))}}async function Z(h=!1){if(!c?.id)return;if(h)i((lu)=>({...lu,actionLoading:!0,error:""}));try{let lu=await Gf(Yf(f,`/api/auth/device/status?sessionId=${encodeURIComponent(c.id)}`));if($(lu.session||null),lu.session?.status==="succeeded")i((cu)=>({...cu,actionLoading:!1,message:"授权成功,正在刷新账号与文件列表"})),await w();else if(h)i((cu)=>({...cu,actionLoading:!1}))}catch(lu){i((cu)=>({...cu,actionLoading:!1,error:Ou(lu,"轮询登录状态失败")}))}}async function H(){i((h)=>({...h,actionLoading:!0,error:"",message:""}));try{await Gf(Yf(f,"/api/auth/logout"),{method:"POST",body:{}}),$(null),i((h)=>({...h,actionLoading:!1,account:null,files:null,message:"本地 token 已清除"})),await w()}catch(h){i((lu)=>({...lu,actionLoading:!1,error:Ou(h,"退出登录失败")}))}}async function E(h){h.preventDefault();let lu=A.trim();if(!lu)return;i((cu)=>({...cu,actionLoading:!0,error:"",message:""}));try{await Gf(Yf(f,"/api/folders"),{method:"POST",body:{path:P4(t,lu)}}),j(""),i((cu)=>({...cu,actionLoading:!1,message:"文件夹已创建"})),await q(t)}catch(cu){i((_u)=>({..._u,actionLoading:!1,error:Ou(cu,"创建文件夹失败")}))}}async function m(h){if(!h)return;i((lu)=>({...lu,actionLoading:!0,error:"",message:""}));try{await Gf(Yf(f,"/api/files/manage"),{method:"POST",body:{opera:"delete",filelist:[{path:h}],async:1}}),i((lu)=>({...lu,actionLoading:!1,message:"删除任务已提交"})),await q(t)}catch(lu){i((cu)=>({...cu,actionLoading:!1,error:Ou(lu,"删除失败")}))}}async function S(h){h.preventDefault(),i((lu)=>({...lu,actionLoading:!0,error:"",message:""}));try{await Gf(Yf(f,"/api/transfers/upload-from-path"),{method:"POST",body:F}),i((lu)=>({...lu,actionLoading:!1,message:"上传任务已入队"})),await N()}catch(lu){i((cu)=>({...cu,actionLoading:!1,error:Ou(lu,"上传任务创建失败")}))}}async function B(h){h.preventDefault(),i((lu)=>({...lu,actionLoading:!0,error:"",message:""}));try{await Gf(Yf(f,"/api/transfers/download-to-path"),{method:"POST",body:Q}),i((lu)=>({...lu,actionLoading:!1,message:"下载任务已入队"})),await N()}catch(lu){i((cu)=>({...cu,actionLoading:!1,error:Ou(lu,"下载任务创建失败")}))}}async function D(h,lu){i((cu)=>({...cu,actionLoading:!0,error:"",message:""}));try{await Gf(Yf(f,`/api/transfers/${encodeURIComponent(h)}/${lu}`),{method:"POST",body:{}}),i((cu)=>({...cu,actionLoading:!1,message:lu==="cancel"?"已请求取消任务":"任务已重新入队"})),await N()}catch(cu){i((_u)=>({..._u,actionLoading:!1,error:Ou(cu,"任务操作失败")}))}}async function X(){i((h)=>({...h,actionLoading:!0,error:"",message:"正在运行上传/下载自测..."}));try{let h=await Gf(Yf(f,"/api/self-test"),{method:"POST",body:{}});i((lu)=>({...lu,actionLoading:!1,selfTest:h,message:`上传/下载自测通过:${h.remotePath||""}`})),await q(t),await N()}catch(h){i((lu)=>({...lu,actionLoading:!1,error:Ou(h,"上传/下载自测失败")}))}}if(M$(()=>{if(!r)return;w();return},[r?.id,r?.runtime?.providerStatus]),M$(()=>{if(!c?.id||c.status!=="pending")return;let h=window.setInterval(()=>void Z(!1),Math.max(5000,Number(c.pollIntervalSeconds||5)*1000));return()=>window.clearInterval(h)},[c?.id,c?.status,c?.pollIntervalSeconds]),M$(()=>{if(!r)return;let h=window.setInterval(()=>void N(),5000);return()=>window.clearInterval(h)},[r?.id]),!r)return x(vt,{title:"Baidu Netdisk 未登记",text:"请在 config.json 的 microservices 中登记用户服务 id=baidu-netdisk"});let O=Xz(r),Y=Pz(r),p=Yz(r),v=n.health||{},z=n.account||v.auth?.account||null,P=v.auth||{},k=Cz(n.files),I=Mz(n.transfers),b=z?.quota||{},d=Boolean(P.loggedIn||z),s=Boolean(P.configured);return x("div",{className:"baidu-netdisk-page","data-testid":"baidu-netdisk-page"},x(Zi,{title:"Baidu Netdisk 工作台",eyebrow:"Containerized Storage Gateway",loading:n.loading,actions:x("div",{className:"panel-actions"},x("a",{className:"ghost-btn",href:"/docs/issue/baidu-netdisk-env-setup.md",target:"_blank",rel:"noreferrer","data-testid":"baidu-netdisk-config-doc-link"},"配置文档"),x("button",{type:"button",className:"ghost-btn",onClick:w,disabled:n.loading,"data-testid":"baidu-netdisk-refresh"},n.loading?"刷新中":"刷新"),x(Pn,{title:"Baidu Netdisk 用户服务",data:r,onOpen:l,testId:"raw-baidu-netdisk-service"}))},x("div",{className:"baidu-netdisk-hero"},x("div",null,x("div",{className:"node-version-line"},x(Oi,{status:O.providerStatus==="online"?"online":"warn"},O.providerStatus||"unknown"),x("span",null,r.providerId),x(Oi,{status:p.public?"warn":"private"},p.public?"公网暴露":"仅 UniDesk frontend 代理访问")),x("p",{className:"muted paragraph"},r.description)),x("div",{className:"microservice-ref-card"},x("span",null,"Repo"),x("strong",null,Y.url||"--"),x("code",null,Y.commitId||"--")),x("div",{className:"microservice-ref-card"},x("span",null,"Private Backend"),x("strong",null,`${p.nodeBindHost||"--"}:${p.nodePort||"--"}`),x("code",null,`${Y.composeFile||"--"} / ${Y.composeService||"--"}`))),x(nl,{error:n.error,wide:!0})),x("div",{className:"metric-grid"},x(bt,{label:"Health",value:v.ok?"OK":"--",hint:v.storage?.postgres||"postgres",tone:v.ok?"ok":"warn"}),x(bt,{label:"OAuth",value:s?"已配置":"待配置",hint:s?"client + secret + token key":"需要设置 UNIDESK_BAIDU_NETDISK_*",tone:s?"ok":"warn"}),x(bt,{label:"Login",value:d?"已登录":"未登录",hint:z?.username||"Device Code QR",tone:d?"ok":"warn"}),x(bt,{label:"Work Root",value:xz(U),hint:U}),x(bt,{label:"Quota",value:O0(b.used),hint:b.total?`${b.usedPercent||0}% / ${O0(b.total)}`:"授权后刷新"}),x(bt,{label:"Transfers",value:Sz(I.length),hint:`running ${n.transfers?.counts?.running||0} / failed ${n.transfers?.counts?.failed||0}`})),x(Zi,{title:"文件浏览器",eyebrow:t,className:"baidu-files-panel",loading:n.loading,actions:x("div",{className:"panel-actions inline-actions"},x("button",{type:"button",className:"ghost-btn",onClick:()=>{let h=Rz(t,U);y(h),q(h)},disabled:!d||t===U},"上级"),x("button",{type:"button",className:"ghost-btn",onClick:()=>q(t),disabled:!d},"刷新文件"),x(Pn,{title:"Baidu Files",data:n.files,onOpen:l,testId:"raw-baidu-files"}))},x("form",{className:"baidu-pathbar",onSubmit:(h)=>{h.preventDefault(),q(t)}},x("input",{value:t,onChange:(h)=>y(h.target.value),disabled:!d}),x("button",{type:"submit",className:"ghost-btn",disabled:!d},"打开路径")),x("form",{className:"baidu-pathbar",onSubmit:E},x("input",{value:A,onChange:(h)=>j(h.target.value),placeholder:"新文件夹名称",disabled:!d}),x("button",{type:"submit",className:"primary-btn",disabled:!d||!A.trim()},"新建文件夹")),!d?x(vt,{title:"等待授权",text:"登录后通过 /api/files 读取工作目录文件列表"}):k.length===0?x(vt,{title:"目录为空",text:"可以从 staging 目录上传文件或新建文件夹"}):x("div",{className:"table-wrap","data-testid":"baidu-netdisk-file-table"},x("table",null,x("thead",null,x("tr",null,x("th",null,"名称"),x("th",null,"类型"),x("th",null,"大小"),x("th",null,"修改时间"),x("th",null,"fs_id"),x("th",null,"操作"))),x("tbody",null,k.map((h)=>x("tr",{key:h.fsId||h.path},x("td",null,x("strong",null,h.serverFilename||h.path),x("code",null,h.path||"--")),x("td",null,x(Oi,{status:h.isDir?"queued":"private"},h.isDir?"DIR":"FILE")),x("td",null,h.isDir?"--":O0(h.size)),x("td",null,h.serverMtime?wu(h.serverMtime*1000):"--"),x("td",null,x("code",null,h.fsId||"--")),x("td",null,x("div",{className:"inline-actions"},h.isDir?x("button",{type:"button",className:"ghost-btn",onClick:()=>{y(h.path),q(h.path)}},"打开"):x("button",{type:"button",className:"ghost-btn",onClick:()=>W((lu)=>({...lu,fsId:h.fsId}))},"填入下载"),x("button",{type:"button",className:"ghost-btn",onClick:()=>m(h.path),disabled:n.actionLoading},"删除"))))))))),x("div",{className:"baidu-netdisk-grid"},x(Zi,{title:"配置与文档",eyebrow:"Deployment References",className:"baidu-docs-panel",actions:x("div",{className:"panel-actions inline-actions"},x("a",{className:"ghost-btn",href:"/docs/issue/baidu-netdisk-env-setup.md",target:"_blank",rel:"noreferrer"},"打开环境配置"),x("a",{className:"ghost-btn",href:"/docs/issue/baidu-netdisk-user-service.md",target:"_blank",rel:"noreferrer"},"打开服务方案"))},x("p",{className:"muted paragraph"},s?"OAuth 运行时变量已配置;如需轮换密钥、迁移部署或排查代理边界,可直接打开下面的项目内文档。":"首次使用请先按环境变量配置文档填入百度应用 client id / secret,然后重建 baidu-netdisk 服务并刷新本页。"),x("div",{className:"baidu-doc-grid","data-testid":"baidu-netdisk-doc-links"},x(kt,{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"}),x(kt,{title:"服务方案与 API",text:"说明 OAuth Device Code、根目录工作区、staging 上传下载任务和后端 API 设计。",href:"/docs/issue/baidu-netdisk-user-service.md",badge:"DESIGN"}),x(kt,{title:"用户服务安全边界",text:"查看 UniDesk microservice 私有代理、允许路径、frontendOnly 和密钥边界规则。",href:"/docs/reference/microservices.md",badge:"REF"}),x(kt,{title:"部署与重建流程",text:"查看 server rebuild、Compose 编排、健康检查和交付验证的长期规则。",href:"/docs/reference/deployment.md",badge:"DEPLOY"}),x(kt,{title:"CLI 验证命令",text:"查看 microservice health/proxy、server rebuild、job status 等命令入口。",href:"/docs/reference/cli.md",badge:"CLI"}),x(kt,{title:"百度设备码模式",text:"打开百度官方 OAuth Device Code 文档,对照扫码登录和轮询参数。",href:"https://pan.baidu.com/union/doc/fl1x114ti",badge:"OFFICIAL"}))),x(Zi,{title:"设备码登录",eyebrow:"OAuth Device Code",className:"baidu-login-panel",loading:n.actionLoading,actions:x("div",{className:"panel-actions inline-actions"},x("button",{type:"button",className:"primary-btn",onClick:G,disabled:n.actionLoading||!s,"data-testid":"baidu-netdisk-start-login"},"生成二维码"),c?.id?x("button",{type:"button",className:"ghost-btn",onClick:()=>Z(!0),disabled:n.actionLoading},"检查状态"):null,d?x("button",{type:"button",className:"ghost-btn",onClick:H,disabled:n.actionLoading},"清除本地登录"):null,x(Pn,{title:"Baidu Device Session",data:c||P.latestSession,onOpen:l,testId:"raw-baidu-device-session"}))},x("div",{className:"baidu-login-card","data-testid":"baidu-netdisk-login-card"},x("div",{className:"baidu-qr-frame"},c?.qrcodeUrl?x("img",{src:c.qrcodeUrl,alt:"百度网盘设备码授权二维码","data-testid":"baidu-netdisk-qrcode"}):x(vt,{title:s?"等待二维码":"OAuth 未配置",text:s?"点击生成二维码后使用百度网盘或百度 App 扫码":"设置 client id、secret 和 token key 后重建服务"})),x("div",{className:"claudeqq-login-copy"},x("div",{className:"node-version-line"},x(Oi,{status:d?"online":c?.status==="pending"?"warn":"unknown"},d?"已登录":c?.status||"未开始"),x("span",null,c?.secondsRemaining!==void 0?`${c.secondsRemaining}s`:"--"),x("span",null,"scope basic,netdisk")),x("p",{className:"muted paragraph"},d?"access token / refresh token 已加密保存到 PostgreSQL;前端只看到脱敏登录态。":"后端使用百度 OAuth Device Code 轮询换取 token;二维码过期后重新生成即可。"),x("div",{className:"microservice-ref-card"},x("span",null,"User Code"),x("strong",null,c?.userCode||"--"),x("code",null,c?.verificationUrl||"https://openapi.baidu.com/device")),x("div",{className:"microservice-ref-card"},x("span",null,"Expires"),x("strong",null,c?.expiresAt?wu(c.expiresAt):"--"),x("code",null,c?.error||"no token exposed"))))),x(Zi,{title:"账号与容量",eyebrow:n.refreshedAt?`Updated ${yl(n.refreshedAt)}`:"Account",loading:n.loading,actions:x("div",{className:"panel-actions inline-actions"},x(Pn,{title:"Baidu Account",data:z,onOpen:l,testId:"raw-baidu-account"}))},z?x("div",{className:"baidu-account-card"},x("div",{className:"node-version-line"},x(Oi,{status:"online"},"connected"),x("span",null,z.baiduUid||"--"),x("span",null,`VIP ${z.vipType??"--"}`)),x("h3",null,z.username||"Baidu Netdisk"),x("p",{className:"muted paragraph"},`工作目录固定在 ${z.rootPath||U};v1 上传/下载只读写容器 staging 目录,不把大文件字节流穿过 UniDesk proxy。`),x("div",{className:"quota-bar"},x("span",{style:{width:`${Math.max(0,Math.min(100,Number(b.usedPercent||0)))}%`}})),x("div",{className:"microservice-ref-card"},x("span",null,"Quota"),x("strong",null,`${O0(b.used)} / ${O0(b.total)}`),x("code",null,`${b.usedPercent||0}% used`))):x(vt,{title:"尚未登录",text:"扫码授权后这里会显示账号、UID、会员状态和容量"})),x(Zi,{title:"传输任务",eyebrow:"staging path jobs",className:"baidu-transfers-panel",loading:n.actionLoading,actions:x("div",{className:"panel-actions inline-actions"},x("button",{type:"button",className:"primary-btn",onClick:X,disabled:!d||n.actionLoading,"data-testid":"baidu-netdisk-self-test"},"运行自测"),x("button",{type:"button",className:"ghost-btn",onClick:N},"刷新任务"),x(Pn,{title:"Baidu Transfers",data:n.transfers,onOpen:l,testId:"raw-baidu-transfers"}))},x("div",{className:"baidu-transfer-forms"},x("form",{className:"stack-form",onSubmit:S,"data-testid":"baidu-upload-form"},x("label",null,"容器 staging 文件",x("input",{value:F.localPath,onChange:(h)=>J((lu)=>({...lu,localPath:h.target.value})),placeholder:"sample.txt"})),x("label",null,"百度网盘目标路径",x("input",{value:F.remotePath,onChange:(h)=>J((lu)=>({...lu,remotePath:h.target.value})),placeholder:P4(U,"sample.txt")})),x("button",{type:"submit",className:"primary-btn",disabled:!d||n.actionLoading},"上传 staging 文件")),x("form",{className:"stack-form",onSubmit:B,"data-testid":"baidu-download-form"},x("label",null,"文件 fs_id",x("input",{value:Q.fsId,onChange:(h)=>W((lu)=>({...lu,fsId:h.target.value})),placeholder:"从文件表填入"})),x("label",null,"保存到 staging 路径",x("input",{value:Q.localPath,onChange:(h)=>W((lu)=>({...lu,localPath:h.target.value})),placeholder:"downloads/"})),x("button",{type:"submit",className:"primary-btn",disabled:!d||!Q.fsId||n.actionLoading},"下载到 staging"))),n.selfTest?x("div",{className:"baidu-account-card","data-testid":"baidu-netdisk-self-test-result"},x("div",{className:"node-version-line"},x(Oi,{status:n.selfTest.ok?"online":"warn"},n.selfTest.ok?"self-test ok":"self-test"),x("span",null,O0(n.selfTest.sizeBytes))),x("h3",null,n.selfTest.remotePath||"Baidu self-test"),x("div",{className:"microservice-ref-card"},x("span",null,"fs_id"),x("strong",null,n.selfTest.fsId||"--"),x("code",null,n.selfTest.downloadedPath||"--")),x("div",{className:"microservice-ref-card"},x("span",null,"MD5"),x("strong",null,n.selfTest.downloadedMd5||"--"),x("code",null,n.selfTest.expectedMd5||"--")),x(Pn,{title:"Baidu Self Test",data:n.selfTest,onOpen:l,testId:"raw-baidu-self-test"})):null,I.length===0?x(vt,{title:"暂无传输任务",text:"上传/下载任务会在后端容器内执行,避免大文件穿过 UniDesk proxy"}):x("div",{className:"table-wrap","data-testid":"baidu-transfer-table"},x("table",null,x("thead",null,x("tr",null,x("th",null,"状态"),x("th",null,"方向"),x("th",null,"路径"),x("th",null,"进度"),x("th",null,"时间"),x("th",null,"操作"))),x("tbody",null,I.map((h)=>x("tr",{key:h.id},x("td",null,x(Oi,{status:h.status},h.status)),x("td",null,h.direction),x("td",null,x("strong",null,h.remotePath||h.fsId||"--"),x("code",null,h.localPath||"--"),h.error?x("span",{className:"form-error"},h.error):null),x("td",null,x(hz,{percent:h.progressPercent}),x("span",{className:"muted"},`${O0(h.bytesDone)} / ${O0(h.sizeBytes)}`)),x("td",null,wu(h.updatedAt)),x("td",null,x("div",{className:"inline-actions"},["queued","running"].includes(h.status)?x("button",{type:"button",className:"ghost-btn",onClick:()=>D(h.id,"cancel")},"取消"):null,["failed","canceled"].includes(h.status)?x("button",{type:"button",className:"ghost-btn",onClick:()=>D(h.id,"retry")},"重试"):null,x(Pn,{title:`Transfer ${h.id}`,data:h,onOpen:l}))))))))),x(Zi,{title:"安全与日志",eyebrow:"redacted diagnostics",className:"baidu-wide-panel",loading:n.loading,actions:x("div",{className:"panel-actions inline-actions"},x(Pn,{title:"Baidu Health",data:v,onOpen:l,testId:"raw-baidu-health"}),x(Pn,{title:"Baidu Logs",data:n.logs,onOpen:l,testId:"raw-baidu-logs"}))},x("div",{className:"policy-grid"},x("article",null,x("b",null,"私有后端"),x("span",null,"4244 只在 Compose 网络 expose,浏览器经 UniDesk 同源代理访问")),x("article",null,x("b",null,"Token 加密"),x("span",null,"access/refresh token 使用 BAIDU_NETDISK_TOKEN_KEY 加密后写入 PostgreSQL")),x("article",null,x("b",null,"无浏览器大文件流"),x("span",null,"上传/下载以容器 staging 目录为边界,避免 proxy 文本通道传输大字节流"))))))}var b$=Cu(Jl(),1);var o=b$.default.createElement,{useEffect:bz}=b$.default,x$=b$.default.useState,Hi={label:"主用户私聊账号",userId:645275593};function C4(u){let l=Number(u);return Number.isFinite(l)?l.toLocaleString("zh-CN"):"--"}async function Z0(u,l={}){return Eu(u,{failureFields:["ok","success"],...l})}async function vz(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 h$({status:u,children:l}){let f=String(u||"unknown").toLowerCase();return o("span",{className:`status-badge ${f}`},l||u||"unknown")}function It({label:u,value:l,hint:f,tone:r}){return o("article",{className:`metric-card ${r||""}`},o("div",{className:"metric-label"},u),o("div",{className:"metric-value"},l),o("div",{className:"metric-hint"},f))}function gt({title:u,eyebrow:l,actions:f,children:r,className:n,loading:i}){return o("section",{className:`panel ${n||""}`},o("div",{className:"panel-head"},o("div",null,l?o("p",{className:"panel-eyebrow"},l):null,o(rl,{title:u,loading:i})),f?o("div",{className:"panel-actions"},f):null),o("div",{className:"panel-body"},r))}function x1({title:u,data:l,onOpen:f,testId:r}){return o("button",{type:"button",className:"ghost-btn","data-testid":r,onClick:(n)=>{n?.stopPropagation?.(),f(u,l)}},"查看原始JSON")}function h1({title:u,text:l}){return o("div",{className:"empty-state"},o("strong",null,u),o("span",null,l))}function kz(u){return u?.runtime&&typeof u.runtime==="object"&&!Array.isArray(u.runtime)?u.runtime:{}}function Iz(u){return u?.backend&&typeof u.backend==="object"&&!Array.isArray(u.backend)?u.backend:{}}function gz(u){return u?.repository&&typeof u.repository==="object"&&!Array.isArray(u.repository)?u.repository:{}}function H0(u,l){return`${u}/microservices/claudeqq/proxy${l}`}function sz(u){return Array.isArray(u?.events)?u.events.slice(0,80):[]}function az(u){return Array.isArray(u?.subscriptions)?u.subscriptions.slice(0,50):[]}function oz(u){return Array.isArray(u?.messages)?u.messages.slice(0,30):[]}function PJ(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 CJ(u){let l=u?.groupId??u?.group_id??(u?.message_type==="group"?u?.target_id:void 0),f=u?.userId??u?.user_id??(u?.message_type==="private"?u?.target_id:void 0);if(l)return`群 ${l}`;if(f)return`私聊 ${f}`;return"--"}function MJ({microservices:u,onRaw:l,apiBaseUrl:f="/api"}){let r=u.find((z)=>z.id==="claudeqq")||null,[n,i]=x$({loading:!1,qrLoading:!1,error:"",health:null,status:null,napcatLogin:null,napcatQrcode:null,qrcodeFetched:!1,qrcodeRefreshedAt:null,events:null,subscriptions:null,sent:null,refreshedAt:null}),[t,y]=x$({targetType:"private",targetId:String(Hi.userId),message:""}),[c,$]=x$({name:"unidesk-callback",targetUrl:"",eventTypes:"message",secret:""}),[A,j]=x$(""),{addNotification:F}=Xf();async function J(){if(!r)return;i((z)=>({...z,loading:!0,error:""}));try{let[z,P,k,I,b]=await Promise.all([vz(`${f}/microservices/claudeqq/health`),Z0(H0(f,"/api/server/status")),Z0(H0(f,"/api/events/recent?limit=60")),Z0(H0(f,"/api/events/subscriptions")),Z0(H0(f,"/api/messages/sent?limit=20"))]);if(i((d)=>({...d,loading:!1,error:"",health:z,status:P,events:k,subscriptions:I,sent:b,refreshedAt:new Date})),!n.qrcodeFetched)Q(!1)}catch(z){i((P)=>({...P,loading:!1,error:Ou(z,"ClaudeQQ 加载失败")}))}}async function Q(z=!0){if(!r)return;i((P)=>({...P,qrLoading:!0,error:z?"":P.error}));try{let P=await Z0(H0(f,"/api/napcat/login")),k=P?.napcat?.qrcode||P?.qrcode||null;i((I)=>({...I,qrLoading:!1,error:"",napcatLogin:P,napcatQrcode:k,qrcodeFetched:!0,qrcodeRefreshedAt:new Date}))}catch(P){i((k)=>({...k,qrLoading:!1,error:z||!k.napcatQrcode?Ou(P,"NapCat 二维码加载失败"):k.error}))}}async function W(z){z.preventDefault(),j("");let P=Number(t.targetId);if(!Number.isFinite(P)||P<=0||t.message.trim().length===0){i((k)=>({...k,error:"请填写 QQ 目标和消息内容"}));return}try{await Z0(H0(f,"/api/push/text"),{method:"POST",body:JSON.stringify({userId:t.targetType==="private"?P:void 0,groupId:t.targetType==="group"?P:void 0,message:t.message})});let k="消息推送请求已提交";y((I)=>({...I,targetType:"private",targetId:String(Hi.userId),message:""})),j(k),F("success",k),await J()}catch(k){i((I)=>({...I,error:Ou(k,"发送失败")}))}}async function L(z){if(z.preventDefault(),j(""),c.targetUrl.trim().length===0){i((P)=>({...P,error:"请填写订阅回调 URL"}));return}try{await Z0(H0(f,"/api/events/subscriptions"),{method:"POST",body:JSON.stringify({name:c.name,targetUrl:c.targetUrl,eventTypes:c.eventTypes.split(",").map((k)=>k.trim()).filter(Boolean),secret:c.secret||void 0,enabled:!0})});let P="事件订阅已创建";j(P),F("success",P),await J()}catch(P){i((k)=>({...k,error:Ou(P,"订阅失败")}))}}async function U(z){if(!z)return;j("");try{await Z0(H0(f,`/api/events/subscriptions/${encodeURIComponent(z)}`),{method:"DELETE"});let P="事件订阅已删除";j(P),F("success",P),await J()}catch(P){i((k)=>({...k,error:Ou(P,"删除订阅失败")}))}}if(bz(()=>{if(!r)return;J();return},[r?.id,r?.runtime?.providerStatus]),!r)return o(h1,{title:"ClaudeQQ 未登记",text:"请在 config.json 的 microservices 中登记用户服务 id=claudeqq"});let q=kz(r),N=gz(r),w=Iz(r),G=n.health||{},Z=n.status||{},H=n.napcatLogin||{},E=G.napcat||Z.napcat||{},m={...H.napcat||{},...E,qrcode:n.napcatQrcode||{},webui:E.webui||H.napcat?.webui},S=H.login||{},B=n.napcatQrcode||{},D=sz(n.events),X=az(n.subscriptions),O=oz(n.sent),Y=Boolean(m.httpConnected||S.ready),p=String(m.loginState||S.state||(Y?"logged_in":"unknown")),v=Boolean(B.available&&B.dataUrl);return o("div",{className:"claudeqq-page","data-testid":"claudeqq-page"},o(gt,{title:"ClaudeQQ 工作台",eyebrow:"D601 QQ Event Gateway",loading:n.loading,actions:o("div",{className:"panel-actions"},o("button",{type:"button",className:"ghost-btn",onClick:J,disabled:n.loading,"data-testid":"claudeqq-refresh-button"},n.loading?"刷新中":"刷新"),o(x1,{title:"ClaudeQQ 用户服务",data:r,onOpen:l,testId:"raw-claudeqq-service"}))},o("div",{className:"findjob-hero"},o("div",null,o("div",{className:"node-version-line"},o(h$,{status:q.providerStatus==="online"?"online":"warn"},q.providerStatus||"unknown"),o("span",null,r.providerId),o("span",null,w.public?"公网暴露":"仅 UniDesk frontend 代理访问")),o("p",{className:"muted paragraph"},r.description)),o("div",{className:"microservice-ref-card"},o("span",null,"Repo"),o("strong",null,N.url||"--"),o("code",null,N.commitId||"--")),o("div",{className:"microservice-ref-card"},o("span",null,"D601 Docker"),o("strong",null,`${w.nodeBindHost||"--"}:${w.nodePort||"--"}`),o("code",null,`${N.composeFile||"--"} / ${N.composeService||"--"}`))),o(nl,{error:n.error,wide:!0})),o("div",{className:"metric-grid"},o(It,{label:"Health",value:G.ok||G.status==="ok"?"OK":"--",hint:"D601 /health",tone:G.ok||G.status==="ok"?"ok":"warn"}),o(It,{label:"NapCat HTTP",value:m.httpConnected||m.http?.connected?"OK":"离线",hint:`${m.httpHost||G.napcat?.httpHost||"--"}:${m.httpPort||G.napcat?.httpPort||"--"}`}),o(It,{label:"NapCat WS",value:m.wsConnected||m.ws?.connected?"OK":"离线",hint:`${m.wsHost||G.napcat?.wsHost||"--"}:${m.wsPort||G.napcat?.wsPort||"--"}`}),o(It,{label:"事件缓存",value:C4(n.events?.count??D.length),hint:"recent QQ events"}),o(It,{label:"订阅",value:C4(n.subscriptions?.count??X.length),hint:"webhook subscribers"}),o(It,{label:"已发送",value:C4(n.sent?.count??O.length),hint:"sent message log"})),o("div",{className:"findjob-grid"},o(gt,{title:"NapCat 容器登录",eyebrow:"QR Login",className:"claudeqq-login-panel",loading:n.qrLoading,actions:o("div",{className:"panel-actions inline-actions"},o("button",{type:"button",className:"ghost-btn",onClick:()=>Q(!0),disabled:n.qrLoading,"data-testid":"claudeqq-napcat-refresh"},n.qrLoading?"刷新中":"手动刷新二维码"),o(x1,{title:"NapCat Login",data:n.napcatLogin,onOpen:l,testId:"raw-claudeqq-napcat-login"}))},o("div",{className:"claudeqq-login-card","data-testid":"claudeqq-napcat-login"},o("div",{className:"claudeqq-qr-frame"},v?o("img",{src:B.dataUrl,alt:"NapCat QQ 登录二维码","data-testid":"claudeqq-napcat-qrcode"}):o(h1,{title:"等待二维码",text:"NapCat 容器启动后会把登录二维码写入 cache/qrcode.png"})),o("div",{className:"claudeqq-login-copy"},o("div",{className:"node-version-line"},o(h$,{status:Y?"online":v?"warn":"unknown"},Y?"已登录":v?"待扫码":"等待二维码"),o("span",null,p),o("span",null,"D601 containerized")),o("p",{className:"muted paragraph"},Y?"NapCat 已登录,ClaudeQQ 可通过容器内 HTTP/WS 链路收发 QQ 消息。":"用手机 QQ 扫描二维码授权登录。二维码只在首次加载或手动刷新时更新,D601 的 NapCat 端口仍只绑定 127.0.0.1。"),o("div",{className:"microservice-ref-card"},o("span",null,"NapCat WebUI"),o("strong",null,m.webui?.url||"http://napcat:6099/webui"),o("code",null,"local-only / proxied QR login")),o("div",{className:"microservice-ref-card"},o("span",null,"QR Source"),o("strong",null,B.modifiedAt?wu(B.modifiedAt):n.qrcodeRefreshedAt?wu(n.qrcodeRefreshedAt):"--"),o("code",null,B.file||"/napcat/cache/qrcode.png"))))),o(gt,{title:"消息推送",eyebrow:"Push API"},o("div",{className:"microservice-ref-card"},o("span",null,Hi.label),o("strong",null,String(Hi.userId)),o("code",null,"private userId / 默认推送测试目标")),o("form",{className:"stack-form",onSubmit:W,"data-testid":"claudeqq-push-form"},o("label",null,"目标类型",o("select",{value:t.targetType,onChange:(z)=>y((P)=>({...P,targetType:z.target.value}))},o("option",{value:"private"},"私聊 userId"),o("option",{value:"group"},"群 groupId"))),o("label",null,"QQ ID",o("input",{value:t.targetId,onChange:(z)=>y((P)=>({...P,targetId:z.target.value})),placeholder:String(Hi.userId)})),o("label",null,"消息内容",o("textarea",{value:t.message,onChange:(z)=>y((P)=>({...P,message:z.target.value})),rows:4,placeholder:"通过 ClaudeQQ 推送一条 QQ 消息"})),o("button",{type:"submit",className:"primary-btn"},"发送 QQ 消息")),o("p",{className:"muted paragraph"},`主 server 和其他用户服务可通过 UniDesk 同源代理调用 /api/push/text;当前人工推送测试默认使用 ${Hi.label} ${Hi.userId},不需要暴露 D601 后端端口。`)),o(gt,{title:"QQ 事件订阅",eyebrow:"Webhook Subscription",loading:n.loading},o("form",{className:"stack-form",onSubmit:L,"data-testid":"claudeqq-subscription-form"},o("label",null,"订阅名称",o("input",{value:c.name,onChange:(z)=>$((P)=>({...P,name:z.target.value}))})),o("label",null,"回调 URL",o("input",{value:c.targetUrl,onChange:(z)=>$((P)=>({...P,targetUrl:z.target.value})),placeholder:"http://host.docker.internal:18080/..."})),o("label",null,"事件类型",o("input",{value:c.eventTypes,onChange:(z)=>$((P)=>({...P,eventTypes:z.target.value})),placeholder:"message,notice"})),o("label",null,"签名密钥",o("input",{value:c.secret,onChange:(z)=>$((P)=>({...P,secret:z.target.value})),placeholder:"可选,生成 x-claudeqq-signature"})),o("button",{type:"submit",className:"primary-btn"},"创建订阅")),X.length===0?o(h1,{title:"暂无订阅",text:"可以为 main server 或其他用户服务注册 HTTP webhook"}):o("div",{className:"table-wrap","data-testid":"claudeqq-subscription-table"},o("table",null,o("thead",null,o("tr",null,o("th",null,"名称"),o("th",null,"状态"),o("th",null,"事件"),o("th",null,"回调"),o("th",null,"最近投递"),o("th",null,"操作"))),o("tbody",null,X.map((z)=>o("tr",{key:z.id},o("td",null,o("strong",null,z.name||z.id),o("code",null,z.id||"--")),o("td",null,o(h$,{status:z.enabled?"online":"warn"},z.enabled?"enabled":"disabled")),o("td",null,Array.isArray(z.eventTypes)?z.eventTypes.join(", "):"message"),o("td",null,z.targetUrl||"--"),o("td",null,z.lastDelivery?`${z.lastDelivery.ok?"OK":"FAIL"} ${wu(z.lastDelivery.at)}`:"--"),o("td",null,o("button",{type:"button",className:"ghost-btn",onClick:()=>U(z.id)},"删除"))))))),o("div",{className:"panel-actions inline-actions"},o(x1,{title:"ClaudeQQ Subscriptions",data:n.subscriptions,onOpen:l,testId:"raw-claudeqq-subscriptions"}))),o(gt,{title:"最近 QQ 事件",eyebrow:n.refreshedAt?`Updated ${yl(n.refreshedAt)}`:"Event Stream",loading:n.loading},D.length===0?o(h1,{title:"暂无事件",text:"等待 NapCat WebSocket 上报 QQ 消息事件,或通过订阅 API 消费后续事件"}):o("div",{className:"table-wrap","data-testid":"claudeqq-event-list"},o("table",null,o("thead",null,o("tr",null,o("th",null,"时间"),o("th",null,"类型"),o("th",null,"会话"),o("th",null,"消息"),o("th",null,"ID"))),o("tbody",null,D.map((z)=>o("tr",{key:z.id},o("td",null,wu(z.receivedAt||z.timestamp)),o("td",null,o(h$,{status:z.postType||z.eventType},z.postType||z.eventType||"--")),o("td",null,CJ(z)),o("td",null,PJ(z)),o("td",null,o("code",null,z.messageId||z.id||"--"))))))),o("div",{className:"panel-actions inline-actions"},o(x1,{title:"ClaudeQQ Events",data:n.events,onOpen:l,testId:"raw-claudeqq-events"}))),o(gt,{title:"已发送消息",eyebrow:`${O.length} Sent`,loading:n.loading},O.length===0?o(h1,{title:"暂无发送记录",text:"发送日志来自 ClaudeQQ bot_workspace/messages/sent_messages.jsonl"}):o("div",{className:"table-wrap"},o("table",null,o("thead",null,o("tr",null,o("th",null,"时间"),o("th",null,"目标"),o("th",null,"消息"),o("th",null,"结果"))),o("tbody",null,O.map((z,P)=>o("tr",{key:z.id||P},o("td",null,wu(z.timestamp||z.sentAt||z.createdAt)),o("td",null,CJ(z)),o("td",null,PJ(z)),o("td",null,z.status||z.messageId||z.message_id||"--")))))),o("div",{className:"panel-actions inline-actions"},o(x1,{title:"ClaudeQQ Sent Messages",data:n.sent,onOpen:l,testId:"raw-claudeqq-sent"})))))}var uc=Cu(Jl(),1);var hJ=Cu(Jl(),1),ql=hJ.default.createElement;function bJ({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},vJ(r,"md"))}function vJ(u,l){let f=dz(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}`},vJ(j.join(` +`),`${l}-quote-${n}`)));continue}if(IJ(f,n)){let j=n,F=b1(f[n]??""),J=b1(f[n+1]??"");n+=2;let Q=[];while(n0)Q.push(b1(f[n]??"")),n+=1;r.push(rE(F,J,Q,`${l}-table-${j}`));continue}let c=k$(i);if(c!==null){let j=n,F=c.ordered,J=c.start,Q=[];while(nlE(L,`${l}-list-${j}-${U}`))));continue}let $=n,A=[];while(n0&&!uE(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-${$}`},Fn(A.join(` +`),`${l}-p-${$}`)))}return r}function dz(u){return String(u||"").replace(/\r\n/gu,` `).replace(/\r/gu,` -`).trimEnd()}function YJ(u){let l=u.match(/^\s*(```+|~~~+)\s*([A-Za-z0-9_-]+)?\s*$/u);if(l===null)return null;let f=l[1];return{marker:f.startsWith("`")?"`":"~",length:f.length,language:l[2]||""}}function hz(u,l){let f=u.trim();return f.length>=l.length&&f.split("").every((r)=>r===l.marker)}function D4(u){return/^(?: {4}|\t)/u.test(u)}function VJ(u,l,f){let r=l.trim().length>0?`language-${gz(l)}`:void 0;return Nl("pre",{key:f,className:"markdown-code-block"},Nl("code",{className:r},u))}function xz(u,l){let f=u[l]??"";if(f.trim().length===0)return!0;return YJ(f)!==null||D4(f)||/^(#{1,6})\s+.+$/u.test(f)||/^\s*(?:---+|\*\*\*+|___+)\s*$/u.test(f)||/^\s*>\s?/u.test(f)||PJ(u,l)||M$(f)!==null}function M$(u){let l=u.match(/^\s{0,3}[-*+]\s+(.+)$/u);if(l!==null)return{ordered:!1,text:l[1]};let f=u.match(/^\s{0,3}(\d+)[.)]\s+(.+)$/u);if(f!==null)return{ordered:!0,start:Number(f[1]),text:f[2]};return null}function bz(u,l){let f=u.match(/^\[([ xX])\]\s+(.+)$/u);if(f!==null){let r=f[1].toLowerCase()==="x";return Nl("li",{key:l,className:"task-list-item"},Nl("input",{type:"checkbox",checked:r,readOnly:!0,tabIndex:-1}),Nl("span",null,Fn(f[2],`${l}-task`)))}return Nl("li",{key:l},Fn(u,l))}function PJ(u,l){let f=u[l]??"",r=u[l+1]??"";if(!f.includes("|")||!r.includes("|"))return!1;let n=R1(f),i=R1(r);return n.length>1&&i.length===n.length&&i.every((t)=>/^:?-{3,}:?$/u.test(t.trim()))}function R1(u){let l=u.trim();if(l.startsWith("|"))l=l.slice(1);if(l.endsWith("|"))l=l.slice(0,-1);return l.split("|").map((f)=>f.trim())}function vz(u){let l=u.trim();if(l.startsWith(":")&&l.endsWith(":"))return"center";if(l.endsWith(":"))return"right";if(l.startsWith(":"))return"left";return}function kz(u,l,f,r){let n=l.map(vz);return Nl("div",{key:r,className:"markdown-table-wrap"},Nl("table",null,Nl("thead",null,Nl("tr",null,u.map((i,t)=>Nl("th",{key:`${r}-h-${t}`,style:n[t]?{textAlign:n[t]}:void 0},Fn(i,`${r}-h-${t}`))))),Nl("tbody",null,f.map((i,t)=>Nl("tr",{key:`${r}-r-${t}`},u.map((y,c)=>Nl("td",{key:`${r}-r-${t}-${c}`,style:n[c]?{textAlign:n[c]}:void 0},Fn(i[c]||"",`${r}-r-${t}-${c}`))))))))}function Fn(u,l,f={}){let r=[],n=/`([^`\n]+)`|\[([^\]\n]+)\]\(([^)\s]+)(?:\s+"[^"]*")?\)|(https?:\/\/[^\s<>)]+)|\*\*([^*\n]+)\*\*|__([^_\n]+)__|~~([^~\n]+)~~|\*([^*\n]+)\*|_([^_\n]+)_/gu,i=f.linkify!==!1,t=0,y=0;for(let c of u.matchAll(n)){let $=c[0],A=c.index??0;C$(r,u.slice(t,A),`${l}-text-${y}`),t=A+$.length;let j=`${l}-inline-${y}`;if(y+=1,c[1]!==void 0){r.push(Nl("code",{key:j},c[1]));continue}if(c[2]!==void 0&&c[3]!==void 0){if(!i){C$(r,$,`${j}-literal`);continue}r.push(DJ(c[2],c[3],j));continue}if(c[4]!==void 0){if(!i){C$(r,$,`${j}-literal`);continue}r.push(DJ(c[4],c[4],j));continue}let F=c[5]??c[6];if(F!==void 0){r.push(Nl("strong",{key:j},Fn(F,`${j}-strong`)));continue}if(c[7]!==void 0){r.push(Nl("del",{key:j},Fn(c[7],`${j}-del`)));continue}let J=c[8]??c[9];if(J!==void 0)r.push(Nl("em",{key:j},Fn(J,`${j}-em`)))}return C$(r,u.slice(t),`${l}-text-tail`),r}function C$(u,l,f){if(l.length===0)return;l.split(` -`).forEach((n,i)=>{if(i>0)u.push(Nl("br",{key:`${f}-br-${i}`}));if(n.length>0)u.push(n)})}function DJ(u,l,f){let r=Iz(l);if(r===null)return Nl("span",{key:f},u);let n=/^(?:https?:|mailto:)/iu.test(r);return Nl("a",{key:f,href:r,target:n?"_blank":void 0,rel:n?"noreferrer":void 0},Fn(u,`${f}-label`,{linkify:!1}))}function Iz(u){let l=String(u||"").trim();if(/^(?:https?:|mailto:)/iu.test(l))return l;if(l.startsWith("/")&&!l.startsWith("//"))return l;if(l.startsWith("#"))return l;return null}function gz(u){return String(u||"").toLowerCase().replace(/[^a-z0-9_-]+/gu,"-").replace(/^-+|-+$/gu,"")||"text"}var C4=Cu(Fl(),1);var Su=C4.default.createElement,{useEffect:sz,useRef:CJ}=C4.default;function az(u,l){return lQ(u.toTrace(l))}function oz(u){let l=Number(u);if(!Number.isFinite(l)||l<0)return"--";let f=Math.floor(l/1000),r=Math.floor(f/3600),n=Math.floor(f%3600/60),i=f%60;if(r>0)return`${r}h ${String(n).padStart(2,"0")}m`;if(n>0)return`${n}m ${String(i).padStart(2,"0")}s`;return`${i}s`}function gr(u){let l=Number(u);return Number.isFinite(l)&&l>=0?l:null}function gt(u,l=180){let f=String(u||"").replace(/\s+/gu," ").trim();return f.length>l?`${f.slice(0,l-1)}…`:f}function dz(u){if(!u)return 0;return u.split(/\r?\n/u).length}function X4(u){return{ran:"Ran",explored:"Explored",edited:"Edited",toolGroup:"Tool calls",plan:"Plan",message:"Message",system:"System",error:"Error"}[u]||"Message"}function Y4(u){let l=Number(u||0);return Number.isFinite(l)&&l>0?`… +${Math.floor(l)} lines`:""}function ez(u){return(Array.isArray(u)?u:[]).reduce((l,f)=>Math.max(l,Number(f?.seq??0)),0)}function MJ(u){return["explored","edited","ran"].includes(String(u?.kind||""))}function gJ(u){let l={read:0,edit:0,run:0};for(let f of u){let r=String(f?.kind||"");if(r==="explored")l.read+=1;else if(r==="edited")l.edit+=1;else if(r==="ran")l.run+=1}return l}function sJ(u){let l=gJ(u);return`${l.read} read, ${l.edit} edit, ${l.run} run`}function aJ(u){return u.replace(/^['"`([{<]+/u,"").replace(/['"`)\]}>.,;:]+$/u,"").replace(/:\d+(?::\d+)?$/u,"").trim()}function RJ(u){let f=String(u||"").match(/(?:~|\.{1,2}|\/)?(?:[A-Za-z0-9_.@+-]+\/)+[A-Za-z0-9_.@+-]+|[A-Za-z0-9_.@+-]+\.(?:c|cc|cpp|h|hpp|js|jsx|ts|tsx|json|md|py|sh|toml|ya?ml|txt|log|lock)/gu)||[],r=[];for(let n of f){let i=aJ(n);if(i.length<2||i.includes("..."))continue;if(/^(http|https|status|method)$/iu.test(i))continue;if(!r.includes(i))r.push(i)}return r}function p4(u,l=4){if(u.length===0)return"--";let f=u.slice(0,l).join(", ");return u.length>l?`${f} +${u.length-l}`:f}function hJ(u){let l="";for(let f of u){if(f.length===0)continue;if(l.length>0&&!l.endsWith(` +`).trimEnd()}function kJ(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 ez(u,l){let f=u.trim();return f.length>=l.length&&f.split("").every((r)=>r===l.marker)}function M4(u){return/^(?: {4}|\t)/u.test(u)}function RJ(u,l,f){let r=l.trim().length>0?`language-${iE(l)}`:void 0;return ql("pre",{key:f,className:"markdown-code-block"},ql("code",{className:r},u))}function uE(u,l){let f=u[l]??"";if(f.trim().length===0)return!0;return kJ(f)!==null||M4(f)||/^(#{1,6})\s+.+$/u.test(f)||/^\s*(?:---+|\*\*\*+|___+)\s*$/u.test(f)||/^\s*>\s?/u.test(f)||IJ(u,l)||k$(f)!==null}function k$(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 lE(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,Fn(f[2],`${l}-task`)))}return ql("li",{key:l},Fn(u,l))}function IJ(u,l){let f=u[l]??"",r=u[l+1]??"";if(!f.includes("|")||!r.includes("|"))return!1;let n=b1(f),i=b1(r);return n.length>1&&i.length===n.length&&i.every((t)=>/^:?-{3,}:?$/u.test(t.trim()))}function b1(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 fE(u){let l=u.trim();if(l.startsWith(":")&&l.endsWith(":"))return"center";if(l.endsWith(":"))return"right";if(l.startsWith(":"))return"left";return}function rE(u,l,f,r){let n=l.map(fE);return ql("div",{key:r,className:"markdown-table-wrap"},ql("table",null,ql("thead",null,ql("tr",null,u.map((i,t)=>ql("th",{key:`${r}-h-${t}`,style:n[t]?{textAlign:n[t]}:void 0},Fn(i,`${r}-h-${t}`))))),ql("tbody",null,f.map((i,t)=>ql("tr",{key:`${r}-r-${t}`},u.map((y,c)=>ql("td",{key:`${r}-r-${t}-${c}`,style:n[c]?{textAlign:n[c]}:void 0},Fn(i[c]||"",`${r}-r-${t}-${c}`))))))))}function Fn(u,l,f={}){let r=[],n=/`([^`\n]+)`|\[([^\]\n]+)\]\(([^)\s]+)(?:\s+"[^"]*")?\)|(https?:\/\/[^\s<>)]+)|\*\*([^*\n]+)\*\*|__([^_\n]+)__|~~([^~\n]+)~~|\*([^*\n]+)\*|_([^_\n]+)_/gu,i=f.linkify!==!1,t=0,y=0;for(let c of u.matchAll(n)){let $=c[0],A=c.index??0;v$(r,u.slice(t,A),`${l}-text-${y}`),t=A+$.length;let j=`${l}-inline-${y}`;if(y+=1,c[1]!==void 0){r.push(ql("code",{key:j},c[1]));continue}if(c[2]!==void 0&&c[3]!==void 0){if(!i){v$(r,$,`${j}-literal`);continue}r.push(xJ(c[2],c[3],j));continue}if(c[4]!==void 0){if(!i){v$(r,$,`${j}-literal`);continue}r.push(xJ(c[4],c[4],j));continue}let F=c[5]??c[6];if(F!==void 0){r.push(ql("strong",{key:j},Fn(F,`${j}-strong`)));continue}if(c[7]!==void 0){r.push(ql("del",{key:j},Fn(c[7],`${j}-del`)));continue}let J=c[8]??c[9];if(J!==void 0)r.push(ql("em",{key:j},Fn(J,`${j}-em`)))}return v$(r,u.slice(t),`${l}-text-tail`),r}function v$(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 xJ(u,l,f){let r=nE(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},Fn(u,`${f}-label`,{linkify:!1}))}function nE(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 iE(u){return String(u||"").toLowerCase().replace(/[^a-z0-9_-]+/gu,"-").replace(/^-+|-+$/gu,"")||"text"}var k4=Cu(Jl(),1);var Su=k4.default.createElement,{useEffect:tE,useRef:gJ}=k4.default;function yE(u,l){return $Q(u.toTrace(l))}function cE(u){let l=Number(u);if(!Number.isFinite(l)||l<0)return"--";let f=Math.floor(l/1000),r=Math.floor(f/3600),n=Math.floor(f%3600/60),i=f%60;if(r>0)return`${r}h ${String(n).padStart(2,"0")}m`;if(n>0)return`${n}m ${String(i).padStart(2,"0")}s`;return`${i}s`}function gr(u){let l=Number(u);return Number.isFinite(l)&&l>=0?l:null}function at(u,l=180){let f=String(u||"").replace(/\s+/gu," ").trim();return f.length>l?`${f.slice(0,l-1)}…`:f}function _E(u){if(!u)return 0;return u.split(/\r?\n/u).length}function h4(u){return{ran:"Ran",explored:"Explored",edited:"Edited",toolGroup:"Tool calls",plan:"Plan",message:"Message",system:"System",error:"Error"}[u]||"Message"}function b4(u){let l=Number(u||0);return Number.isFinite(l)&&l>0?`… +${Math.floor(l)} lines`:""}function $E(u){return(Array.isArray(u)?u:[]).reduce((l,f)=>Math.max(l,Number(f?.seq??0)),0)}function sJ(u){return["explored","edited","ran"].includes(String(u?.kind||""))}function rQ(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 nQ(u){let l=rQ(u);return`${l.read} read, ${l.edit} edit, ${l.run} run`}function iQ(u){return u.replace(/^['"`([{<]+/u,"").replace(/['"`)\]}>.,;:]+$/u,"").replace(/:\d+(?::\d+)?$/u,"").trim()}function aJ(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=iQ(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 R4(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 oJ(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 oJ(u){let l=String(u||"").replace(/\r\n/gu,` +`;l+=f}return l}function tQ(u){let l=String(u||"").replace(/\r\n/gu,` `).replace(/\r/gu,` `).trimEnd();return l.length>0?l.split(` -`):[]}function P4(u){let l=String(u.status||"").trim();if(l.length>0)return l;let f=String(u.bodyPreview||"");return/^(item\/[A-Za-z]+(?:\/[A-Za-z]+)?):/u.exec(f)?.[1]||"item/fileChange"}function uE(u){let l=String(u.bodyPreview||"");return/file changes status=([A-Za-z0-9_-]+)/u.exec(l)?.[1]}function lE(u){return/^item\/(?:started|completed): file changes status=/u.test(String(u||"").trim())}function dJ(u){if(String(u.kind||"")!=="edited")return!1;let l=String(u.status||""),f=String(u.title||""),r=String(u.bodyPreview||""),n=String(u.commandPreview||"");if(f==="Edited files")return!0;if(/^item\/fileChange\//u.test(l))return!0;if((l==="item/started"||l==="item/completed")&&/file changes status=/u.test(r))return!0;if(/^Success\. Updated the following files:/mu.test(r))return!0;if(/^diff --git /mu.test(r))return!0;return/^([AMDRCU?]{1,2})\s+\S+/mu.test(r)||n.length>0&&h$(r).length>0}function It(u){return aJ(String(u||"").replace(/^[ab]\//u,"").trim())}function M4(u){let l=/^([AMDRCU?]{1,2})\s+(.+)$/u.exec(u);if(!l)return null;let f=It(l[2]||"");return f.length>0?{status:l[1]||"M",path:f}:null}function R4(u){let l=/^\*\*\*\s+(Add|Update|Delete)\s+File:\s+(.+)$/u.exec(u);if(l){let r=l[1]==="Add"?"A":l[1]==="Delete"?"D":"M",n=It(l[2]||"");return n.length>0?{status:r,path:n}:null}let f=/^\*\*\*\s+Move to:\s+(.+)$/u.exec(u);if(f){let r=It(f[1]||"");return r.length>0?{status:"R",path:r}:null}return null}function h$(u){let l=[],f=(n,i)=>{let t=It(i);if(t.length===0||t==="/dev/null")return;let y=l.find((c)=>c.path===t);if(y){if(y.status==="M"&&n!=="M")y.status=n;return}l.push({status:n,path:t})},r="";for(let n of oJ(u)){let i=M4(n)||R4(n);if(i!==null){f(i.status,i.path),r=i.path;continue}let t=/^diff --git a\/(.+?) b\/(.+)$/u.exec(n);if(t){let j=t[2]||t[1]||"";f("M",j),r=It(j);continue}let y=/^\+\+\+ b\/(.+)$/u.exec(n);if(y&&y[1]!=="/dev/null"){f("M",y[1]||""),r=It(y[1]||"");continue}if(/^new file mode /u.exec(n)&&r)f("A",r);if(/^deleted file mode /u.exec(n)&&r)f("D",r);let A=/^rename to (.+)$/u.exec(n);if(A)f("R",A[1]||"")}return l}function fE(u){if(M4(u)!==null||R4(u)!==null)return"file";if(/^(diff --git |index |--- |\+\+\+ |\*\*\* Begin Patch|\*\*\* End Patch)/u.test(u))return"meta";if(/^@@ /u.test(u))return"hunk";if(/^\+/u.test(u))return"add";if(/^-/u.test(u))return"del";if(/^(Success\.|No changes|Updated\b|Created\b|Deleted\b|Added\s+\d+\s+lines?|Wrote\s+\d+\s+lines?|Read\s+\d+\s+files?|\.\.\.\[patch content truncated)/iu.test(u))return"note";return"context"}function h4(u){return oJ(u).map((l)=>{let f=M4(l)||R4(l);if(f!==null)return{text:l,kind:"file",path:f.path,status:f.status};return{text:l,kind:fE(l)}})}function rE(u){return u.reduce((l,f)=>{if(f.kind==="add")l.added+=1;else if(f.kind==="del")l.removed+=1;return l},{added:0,removed:0})}function xJ(u,l){return`${l} ${u} line${u===1?"":"s"}`}function nE(u,l){let f=[];if(u>0)f.push(xJ(u,"Added"));if(l>0)f.push(xJ(l,"removed"));return f.join(", ")}function iE(u){for(let f=u.length-1;f>=0;f-=1){let r=String(u[f]?.status||"").trim();if(r.length>0)return r}let l=String(u[u.length-1]?.method||"").trim();if(l==="item/fileChange/outputDelta")return"updated";if(l==="item/started")return"started";if(l==="item/completed")return"completed";return l.replace(/^item\//u,"")||"changed"}function tE(u){return`${u} file${u===1?"":"s"}`}function eJ(u){let l=u.length>0?u:[],f=hJ(l.map((F)=>String(F.bodyPreview||""))),n=hJ(l.map((F)=>String(F.bodyPreview||"")).filter((F)=>F.trim().length>0&&!lE(F)))||f,i=h$(n||f),t=l.map((F)=>({method:P4(F),status:uE(F),at:F.at})),y=h4(n||f),c=rE(y),$=nE(c.added,c.removed),A=i.length>0?tE(i.length):"",j=$.length>0?`${$}${A?` in ${A}`:""}`:i.length>0?A:gt(n||f||"File changes",72);return{status:iE(t),summary:j,files:i,stages:t,lines:y,addedLines:c.added,removedLines:c.removed,rawText:f}}function yE(u){let l=u[0],f=u[u.length-1]||l,r=eJ(u);return{...l,seq:Number.isFinite(Number(f?.seq))?Number(f?.seq):Number(l?.seq??0),at:f?.at||l?.at,title:r.files.length>0?`Edited ${r.summary}`:"Edited files",status:r.status,commandPreview:"",commandOmittedLines:void 0,bodyPreview:r.rawText,bodyOmittedLines:u.reduce((n,i)=>n+Number(i.bodyOmittedLines||0),0)||void 0,rawSeqs:u.flatMap((n)=>Array.isArray(n?.rawSeqs)?n.rawSeqs:[n?.seq]).filter((n)=>n!==void 0),editObservation:r}}function cE(u){let l=Array.isArray(u)?u:[],f=[],r=[],n=()=>{if(r.length===0)return;f.push(yE(r)),r=[]};for(let i of l){if(dJ(i)){if(P4(i)==="item/started"&&r.length>0)n();if(r.push(i),P4(i)==="item/completed")n();continue}n(),f.push(i)}return n(),f}function uQ(u){let l=[],f=[],r=[],n=($,A)=>{for(let j of A)if(!$.includes(j))$.push(j)};for(let $ of u){let A=String($?.kind||""),j=[$?.commandPreview,$?.bodyPreview,$?.title].map((F)=>String(F||"")).join(` -`);if(A==="explored")n(l,RJ(j));else if(A==="edited")n(f,RJ(j));else if(A==="ran"){let F=String($?.commandPreview||$?.title||"").trim();if(F.length>0&&!r.includes(F))r.push(gt(F,90))}}let i=u.map(($)=>Date.parse(String($?.at||""))).filter(($)=>Number.isFinite($)),t=i.length>=2?Math.max(0,Math.max(...i)-Math.min(...i)):0,y=u.reduce(($,A)=>$+(gr(A?.durationMs)??gr(A?.elapsedMs)??0),0),c=t>0?t:y;return{readFiles:l,editedFiles:f,runCommands:r,durationLabel:oz(c)}}function _E(u,l=3){let f=Array.isArray(u)?u:[],r=[],n=[],i=Math.max(0,l),t=new Set;for(let c=f.length-1;c>=0&&i>0;c-=1){let $=f[c];if(!MJ($))continue;t.add($),i-=1}let y=()=>{if(n.length>=2){let c=gJ(n);r.push({seq:Number(n[0]?.seq??0),at:n[0]?.at||n.at(-1)?.at,kind:"toolGroup",title:sJ(n),status:`${n.length} calls`,items:n,counts:c,digest:uQ(n),rawSeqs:n.flatMap(($)=>Array.isArray($?.rawSeqs)?$.rawSeqs:[$?.seq]).filter(($)=>$!==void 0)})}else r.push(...n);n=[]};for(let c of f){if(MJ(c)&&!t.has(c)){n.push(c);continue}y(),r.push(c)}return y(),r}function lQ(u){return(Array.isArray(u)?u:[]).map((l,f)=>({...l,seq:Number.isFinite(Number(l?.seq))?Number(l.seq):f+1,kind:String(l?.kind||"message"),at:l?.at===void 0?void 0:String(l.at),durationMs:gr(l?.durationMs)??void 0,title:l?.title===void 0?void 0:String(l.title),status:l?.status===void 0?void 0:String(l.status)}))}function h1(u){let l=gr(u?.state?.time?.start)??gr(u?.time?.start),f=gr(u?.state?.time?.end)??gr(u?.time?.end);return gr(u?.durationMs)??gr(u?.elapsedMs)??gr(u?.timing?.durationMs)??gr(u?.metadata?.durationMs)??(l!==null&&f!==null&&f>=l?f-l:null)??void 0}function x1(u,l){return u?.createdAt||u?.updatedAt||u?.completedAt||l||void 0}function S4(u,l){return u?.id||u?.messageId||l}function $E(u,l=1200){if(typeof u==="string")return u;if(u===void 0||u===null)return"";try{return gt(JSON.stringify(u),l)}catch{return gt(String(u),l)}}function fQ(u,l,f){if(typeof u?.metadata?.diff==="string"&&u.metadata.diff.length>0)return u.metadata.diff;if(typeof u?.metadata?.filediff?.patch==="string"&&u.metadata.filediff.patch.length>0)return u.metadata.filediff.patch;if(typeof u?.output==="string"&&u.output.length>0)return u.output;if(typeof u?.result==="string"&&u.result.length>0)return u.result;if(typeof l?.output==="string"&&l.output.length>0)return l.output;if(typeof f?.output==="string"&&f.output.length>0)return f.output;if(typeof u?.metadata?.output==="string"&&u.metadata.output.length>0)return u.metadata.output;return""}function R$(u,l){if(!u||typeof u!=="object"||Array.isArray(u))return"";for(let f of l){let r=u[f];if(typeof r==="string"&&r.length>0)return r;if(r!==void 0&&r!==null&&typeof r!=="object")return String(r)}return""}function bJ(u,l){if(!u||typeof u!=="object"||Array.isArray(u))return null;for(let f of l){let r=Number(u[f]);if(Number.isFinite(r))return r}return null}function rQ(u,l){let f=l?.input&&typeof l.input==="object"&&!Array.isArray(l.input)?l.input:u?.input&&typeof u.input==="object"&&!Array.isArray(u.input)?u.input:{},r=R$(f,["command","cmd","script"]);if(r.length>0)return r;if(typeof u?.command==="string"&&u.command.length>0)return u.command;if(typeof l?.command==="string"&&l.command.length>0)return l.command;let n=String(u?.tool||u?.title||"tool"),i=R$(f,["filePath","filepath","path"])||R$(u,["filePath","filepath","path"]),t=R$(f,["pattern","query"]),y=bJ(f,["offset"]),c=bJ(f,["limit"]),$=[n];if(t.length>0)$.push(t);if(i.length>0)$.push(i);if(y!==null)$.push(`offset=${y}`);if(c!==null)$.push(`limit=${c}`);return $.length>1?$.join(" "):n}function AE(u,l){let f=u?.part&&typeof u.part==="object"&&!Array.isArray(u.part)?u.part:{},r=String(u?.type||u?.event||u?.name||f?.type||"").toLowerCase(),n=String(f?.type||"").toLowerCase(),i=u?.at||u?.timestamp||f?.updatedAt||f?.createdAt,t=Number.isFinite(Number(u?.seq))?Number(u.seq):l;if(r==="step_start"||r==="step-start"||n==="step-start")return null;if(r==="step_finish"||r==="step-finish"||n==="step-finish")return null;if(n==="tool"||/tool|bash|command/iu.test(`${r} ${n}`)){let c=f?.state&&typeof f.state==="object"&&!Array.isArray(f.state)?f.state:{},$=rQ(f,c),A=fQ(c,f,u),j=nQ($,String(f?.tool||f?.title||"")),F=j==="edited"?{status:String(c?.status||f?.status||u?.status||""),summary:gt(A||$,72),files:h$(A),stages:[],lines:h4(A),addedLines:0,removedLines:0,rawText:A}:void 0;return{seq:t,at:x1(f,i),kind:j,title:String(c?.title||f?.title||c?.metadata?.description||f?.tool||"OpenCode tool"),status:String(c?.status||f?.status||u?.status||""),commandPreview:$,bodyPreview:A,durationMs:h1(f),rawSeqs:[f?.id||f?.callID||u?.sessionID||t],editObservation:F}}let y=$E(f?.text??f?.content??f?.delta??u?.text??u?.content??u?.delta,3000).trim();if(y.length>0)return{seq:t,at:x1(f,i),kind:n==="reasoning"?"message":/error|failed/iu.test(`${r} ${n}`)?"error":"message",title:n==="reasoning"?"Reasoning":/error|failed/iu.test(`${r} ${n}`)?"OpenCode error":"Assistant message",status:`opencode/${r||n||"event"}`,bodyPreview:y,durationMs:h1(f),rawSeqs:[f?.id||u?.sessionID||t]};return null}function nQ(u,l){let f=`${l} ${u}`.toLowerCase();if(/\b(read|grep|glob|list|ls|find|search|view|cat|sed|rg|head|tail|wc|file)\b/iu.test(f))return"explored";if(/\b(edit|write|patch|apply|update|create|delete|apply_patch|git apply|cat >|tee .*<<|sed -i|python3? .*write_text|mkdir|rm |touch )\b/iu.test(f))return"edited";return"ran"}function jE(u){let l=[],f=1;for(let r of Array.isArray(u)?u:[]){if(r?.kind&&r?.title){let y=String(r?.status||"");if(y==="opencode/step-start"||y==="opencode/step-finish")continue;l.push({...r,seq:Number.isFinite(Number(r?.seq))?Number(r.seq):f++});continue}let n=r?.createdAt||r?.updatedAt||r?.completedAt,i=String(r?.role||"assistant").toLowerCase(),t=Array.isArray(r?.parts)?r.parts:[];if(t.length===0){if(r?.part&&(r?.sessionID||String(r?.type||"").startsWith("step_")||String(r?.type||"").includes("tool"))){let y=AE(r,f);if(y!==null)l.push(y),f=Math.max(f+1,Number(y.seq)+1)}else if(r?.textPreview)l.push({seq:f++,at:n,kind:"message",title:`${i||"assistant"} message`,status:i,bodyPreview:String(r.textPreview),rawSeqs:[r?.messageId||f]});continue}for(let y of t){let c=String(y?.type||"").toLowerCase();if(c==="step-start"||c==="step-finish")continue;if(c==="text"||c==="reasoning"){let A=String(y?.textPreview||r?.textPreview||"").trim();if(A.length===0)continue;l.push({seq:f++,at:x1(y,n),kind:"message",title:c==="reasoning"?"Reasoning":i==="user"?"User message":i==="system"?"System message":"Assistant message",status:c==="reasoning"?"reasoning":i,bodyPreview:A,durationMs:h1(y),rawSeqs:[S4(y,f)]});continue}if(c==="tool"){let A=y?.state&&typeof y.state==="object"&&!Array.isArray(y.state)?y.state:{},j=rQ(y,A),F=fQ(A,y,{}),J=nQ(j,String(y?.tool||y?.title||"")),Q=J==="edited"?{status:String(A?.status||y?.status||""),summary:gt(F||j,72),files:h$(F),stages:[],lines:h4(F),addedLines:0,removedLines:0,rawText:F}:void 0;l.push({seq:f++,at:x1(y,n),kind:J,title:String(y?.title||y?.tool||"tool"),status:String(y?.status||""),commandPreview:j,bodyPreview:F,durationMs:h1(y),rawSeqs:[S4(y,f)],editObservation:Q});continue}let $=String(y?.textPreview||y?.title||c||"").trim();if($)l.push({seq:f++,at:x1(y,n),kind:"system",title:c||"part",bodyPreview:$,status:String(y?.status||""),durationMs:h1(y),rawSeqs:[S4(y,f)]})}}return l}var iQ={source:"opencode",toTrace:jE};function FE(u){return String(u||"unknown").toLowerCase().replace(/[^a-z0-9_-]+/gu,"-")||"unknown"}function vJ(u){let l=String(u||"M").toUpperCase();if(l.startsWith("A")||l==="??")return"added";if(l.startsWith("D"))return"deleted";if(l.startsWith("R"))return"renamed";return"modified"}function UE(u){if(u==="item/fileChange/outputDelta")return"delta";return u.replace(/^item\//u,"")}function JE(u,l){if(u.kind==="file"){let n=String(u.status||"M");return Su("div",{key:`${l}-${u.text}`,className:`codex-edit-diff-line file ${vJ(n)}`},Su("span",{className:`codex-edit-file-status ${vJ(n)}`},n),Su("code",null,u.path||u.text.replace(/^([AMDRCU?]{1,2})\s+/u,"")))}let f=u.kind==="add"||u.kind==="del"?u.text.slice(0,1):u.kind==="hunk"?"@@":u.kind==="note"?"ok":"",r=u.kind==="add"||u.kind==="del"?u.text.slice(1):u.text;return Su("div",{key:`${l}-${u.text}`,className:`codex-edit-diff-line ${u.kind}`},Su("span",{className:"codex-edit-diff-sign"},f),Su("code",null,r||" "))}function QE(u,l){let f=u.lines.length>0?u.lines:u.files.map((n)=>({text:`${n.status} ${n.path}`,kind:"file",path:n.path,status:n.status})),r=Number(u.addedLines||0)+Number(u.removedLines||0)>0;return Su("div",{className:"codex-edit-observation","data-testid":"codex-edit-observation"},Su("div",{className:"codex-edit-observation-head"},Su("span",{className:"codex-edit-window-controls","aria-hidden":"true"},Su("i",null),Su("i",null),Su("i",null)),Su("strong",null,r?"git diff":"git diff --stat"),Su("code",null,u.summary||"File changes")),u.stages.length>0?Su("div",{className:"codex-edit-stage-strip"},u.stages.map((n,i)=>Su("span",{key:`${n.method}-${i}`,className:`codex-edit-stage ${FE(n.status||n.method)}`},Su("b",null,UE(n.method)),n.status?Su("em",null,n.status):null))):null,f.length>0?Su("div",{className:"codex-edit-diff",role:"list"},f.map(JE)):null,l?Su("div",{className:"codex-edit-omitted"},`${l} (查看原始JSON获取完整记录)`):null)}function kJ(u,l,f){let r=Y4(f);return Su("div",{className:`codex-transcript-stream ${u}`,"data-testid":`codex-trace-${u}`},Su("span",{className:"codex-transcript-stream-label"},u),Su("pre",{className:"codex-transcript-body"},l,r?` -${r} (查看原始JSON获取完整记录)`:""))}function tQ(u,l=!1){let f=String(u.kind||"message"),r=["ran","explored","edited"].includes(f),n=Y4(u.commandOmittedLines),i=Y4(u.bodyOmittedLines),t=String(u.commandPreview||(r?u.title||"":"")),y=String(u.stdoutPreview||""),c=String(u.stderrPreview||""),$=y.length>0||c.length>0,A=Boolean(u.foldedReferencePrompt)&&String(u.fullPrompt||"").length>0,j=f==="edited"&&(u.editObservation!==void 0||dJ(u))?u.editObservation||eJ([u]):null;return Su("article",{key:`${u.seq}-${f}`,className:`codex-transcript-item ${f} ${l?"nested":""}`},Su("div",{className:"codex-transcript-main"},Su("div",{className:"codex-transcript-title"},Su("span",{className:"codex-output-channel"},X4(f)),r&&j===null?null:Su("strong",null,j!==null?"File changes":String(u.title||X4(f))),u.status?Su("code",null,String(j?.status||u.status)):null,Su("time",null,wu(u.at))),t&&j===null?Su("pre",{className:"codex-transcript-command"},t,n?` -${n}`:""):null,j!==null?QE(j,i):$?Su("div",{className:"codex-transcript-streams"},y.length>0?kJ("stdout",y,u.stdoutOmittedLines):null,c.length>0?kJ("stderr",c,u.stderrOmittedLines):null):u.bodyPreview?Su("pre",{className:"codex-transcript-body"},String(u.bodyPreview),i?` -${i} (查看原始JSON获取完整记录)`:""):null,A?Su("details",{className:"codex-initial-prompt-full","data-testid":"codex-initial-prompt-full"},Su("summary",null,Su("span",null,"引用注入已折叠,点击查看最终传入 Codex 的完整 prompt"),Su("code",null,`${u.fullPromptLines||dz(String(u.fullPrompt||""))} lines / ${u.fullPromptChars||String(u.fullPrompt||"").length} chars`)),Su("pre",{className:"codex-transcript-body codex-transcript-full-prompt","data-testid":"codex-initial-prompt-full-text"},String(u.fullPrompt||""))):null))}function NE(u){let l=Array.isArray(u.items)?u.items:[],f=u.digest&&typeof u.digest==="object"?u.digest:uQ(l);return Su("article",{key:`${u.seq}-toolGroup`,className:"codex-transcript-item toolGroup"},Su("div",{className:"codex-transcript-main"},Su("details",{className:"codex-tool-group","data-testid":"codex-tool-group"},Su("summary",null,Su("div",{className:"codex-tool-group-head"},Su("span",{className:"codex-output-channel"},X4("toolGroup")),Su("strong",null,String(u.title||sJ(l))),Su("code",null,String(u.status||`${l.length} calls`)),Su("time",null,wu(u.at)))),Su("div",{className:"codex-tool-group-digest"},Su("span",null,`read: ${p4(Array.isArray(f.readFiles)?f.readFiles:[])}`),Su("span",null,`edit: ${p4(Array.isArray(f.editedFiles)?f.editedFiles:[])}`),Su("span",null,`run: ${p4(Array.isArray(f.runCommands)?f.runCommands:[],2)}`),Su("span",null,`duration: ${f.durationLabel||"--"}`)),Su("div",{className:"codex-tool-group-items"},l.map((r)=>tQ(r,!0))))))}function qE(u){let l=[u.title,u.status,u.bodyPreview,u.commandPreview,u.stderrPreview,u.stdoutPreview].map((f)=>String(f||"")).join(` -`);return/\b(error|failed|failure|interrupt|interrupted|cancell?ed|watchdog|timeout|closed|refused|aborted|exception)\b/iu.test(l)}function yQ(u,l){if(l)return u;return u.flatMap((f)=>{if(String(f.kind||"")==="system"&&!qE(f))return[];if(String(f.kind||"")!=="toolGroup"||!Array.isArray(f.items))return[f];let r=yQ(f.items,l);return[{...f,items:r}]})}var wE=16;function IJ(u){return u.scrollHeight-u.scrollTop-u.clientHeight<=wE}function x$({items:u,input:l,port:f,autoScroll:r=!1,loading:n=!1,hasDetail:i=!0,emptyText:t="等待 Trace 输出...",loadingText:y="正在加载完整 Trace...",testId:c="trace-output",className:$="codex-transcript",keepRecentToolCalls:A=3,collapseTools:j=!0,showSystemEvents:F=!1}){let J=CJ(null),Q=CJ(!0),W=yQ(cE(f?az(f,l):lQ(u)),Boolean(F)),L=j?_E(W,A):W,U=ez(W);sz(()=>{let w=J.current;if(!r||!w)return;if(!Q.current&&!IJ(w))return;w.scrollTop=w.scrollHeight,Q.current=!0},[r,W.length,U]);let N={className:$,ref:J,onScroll:(w)=>{let G=w.currentTarget;Q.current=IJ(G)},"data-testid":c};if(n&&!i)return Su("div",N,Su("div",{className:"codex-output-empty"},y));return Su("div",N,L.length===0?Su("div",{className:"codex-output-empty"},t):L.map((w)=>String(w.kind||"")==="toolGroup"?NE(w):tQ(w)))}var cQ=Cu(Fl(),1),Hi=cQ.default.createElement;function b$(...u){return u.filter(Boolean).join(" ")}function _Q({title:u,children:l,actions:f,onClose:r,className:n,backdropClassName:i,bodyClassName:t,actionsClassName:y,titleId:c,testId:$,closeTestId:A,closeLabel:j="关闭",disableClose:F=!1,closeOnBackdrop:J=!0}){let Q={className:b$("raw-dialog","unidesk-dialog",n),role:"dialog","aria-modal":"true"};if(c)Q["aria-labelledby"]=c;else if(typeof u==="string")Q["aria-label"]=u;if($)Q["data-testid"]=$;return Hi("div",{className:b$("modal-backdrop","unidesk-dialog-backdrop",i),role:"presentation",onClick:(W)=>{if(J&&!F&&W.target===W.currentTarget)r()}},Hi("section",Q,Hi("div",{className:"raw-dialog-head unidesk-dialog-head"},Hi("strong",c?{id:c}:null,u),Hi("button",{type:"button",className:"ghost-btn",onClick:r,disabled:F,"data-testid":A},j)),Hi("div",{className:b$("unidesk-dialog-body",t)},l),f?Hi("div",{className:b$("unidesk-dialog-actions",y)},f):null))}var T=s1.default.createElement,{useEffect:V0,useMemo:$Q,useRef:Sl}=s1.default,gu=s1.default.useState,WE=120,OQ=12,ZQ=48,LE=1200;function x4(){return typeof document>"u"||document.visibilityState!=="hidden"}function tf(u,l="操作失败"){return Ou(u,l)}function ar(u){let l=Number(u);if(!Number.isFinite(l)||l<0)return"--";let f=Math.floor(l/1000),r=Math.floor(f/3600),n=Math.floor(f%3600/60),i=f%60;if(r>0)return`${r}h ${String(n).padStart(2,"0")}m`;if(n>0)return`${n}m ${String(i).padStart(2,"0")}s`;return`${i}s`}function Rn(u){if(u===null||u===void 0||u==="")return null;let l=u instanceof Date?u.getTime():new Date(u).getTime();return Number.isFinite(l)?l:null}function HQ(u,l=Date.now()){let f=Rn(u);if(f===null)return"--";let r=Math.max(0,Math.floor((l-f)/1000));if(r<1)return"刚刚";let n=Math.floor(r/86400),i=Math.floor(r%86400/3600),t=Math.floor(r%3600/60),y=r%60;if(n>0)return`${n}天${i>0?`${i}小时`:""}前`;if(i>0)return`${i}小时${t>0?`${t}分钟`:""}前`;if(t>0)return`${t}分钟${y}秒前`;return`${y}秒前`}function BQ(...u){let l="",f=-1/0;for(let r of u){let n=String(r||"");if(n.length===0)continue;let i=Rn(r);if(i!==null&&i>=f)l=n,f=i;else if(l.length===0)l=n}return l}function TE(u){let l=Number(u);if(!Number.isFinite(l)||l<0)return"--";if(l<1000)return`${Math.round(l)}ms`;return`${(l/1000).toFixed(l<1e4?2:1)}s`}function a4(u,l=180){let f=String(u||"").replace(/\s+/gu," ").trim();return f.length>l?`${f.slice(0,l-1)}…`:f}async function vl(u,l={}){return Eu(u,{strictJson:!0,retryInvalidJson:1,invalidJsonPrefix:"Code Queue 返回了无效 JSON",invalidJsonPreview:!0,responsePreviewLength:LE,...l})}function Di({status:u,children:l,title:f}){let r=String(u||"unknown").toLowerCase();return T("span",{className:`status-badge ${r}`,title:f},l||u||"unknown")}function st({title:u,eyebrow:l,summary:f,actions:r,children:n,className:i,loading:t}){return T("section",{className:`panel ${i||""}`},T("div",{className:"panel-head"},T("div",null,l?T("p",{className:"panel-eyebrow"},l):null,T(rl,{title:u,loading:t}),f?T("div",{className:"panel-summary"},f):null),r?T("div",{className:"panel-actions"},r):null),T("div",{className:"panel-body"},n))}function mQ({title:u,data:l,onOpen:f,testId:r}){return T("button",{type:"button",className:"ghost-btn","data-testid":r,onClick:()=>f(u,l)},"查看原始JSON")}function pi({title:u,text:l}){return T("div",{className:"empty-state"},T("strong",null,u),T("span",null,l))}function KE(u){return u?.runtime&&typeof u.runtime==="object"&&!Array.isArray(u.runtime)?u.runtime:{}}function GE(u){return u?.backend&&typeof u.backend==="object"&&!Array.isArray(u.backend)?u.backend:{}}function kl(u,l){return`${u}/microservices/code-queue/proxy${l}`}function zE(u){return`${u}/microservices/oa-event-flow/proxy/api/events/stream?tags=${encodeURIComponent("service:code-queue")}`}function n2(){return{headers:{"cache-control":"no-cache","x-unidesk-no-cache":"1"}}}function Ml(u){return Array.isArray(u?.tasks)?u.tasks:[]}function B0(u){return u?.pagination&&typeof u.pagination==="object"&&!Array.isArray(u.pagination)?u.pagination:{}}function AQ(u){let l=Date.parse(String(u?.updatedAt||u?.createdAt||""));return Number.isFinite(l)?l:0}function jQ(u){return Rn(u?.queueEnteredAt)??Rn(u?.createdAt)??Rn(u?.updatedAt)??0}function EE(u,l){let f=jQ(u)-jQ(l);if(f!==0)return f;let r=(Rn(u?.createdAt)??0)-(Rn(l?.createdAt)??0);if(r!==0)return r;return String(u?.id||"").localeCompare(String(l?.id||""))}function OE(u,l=""){let f=new Map;for(let r of u)for(let n of r){let i=String(n?.id||"");if(i.length>0&&!f.has(i))f.set(i,n)}return Array.from(f.values()).sort((r,n)=>{let i=TQ(r)-TQ(n);if(i!==0)return i;let t=String(r?.id||"")===l?0:1,y=String(n?.id||"")===l?0:1;if(t!==y)return t-y;return AQ(n)-AQ(r)})}function m0(u,l=""){let f=new Map;for(let r of u)for(let n of r){let i=String(n?.id||"");if(i.length===0)continue;f.set(i,{...f.get(i)||{},...n})}return OE([Array.from(f.values())],l)}function v1(u){return Array.isArray(u?.activeTaskIds)?u.activeTaskIds.map((l)=>String(l||"")).filter(Boolean):[String(u?.activeTaskId||"")].filter(Boolean)}var p0="__all__",ZE="(max-width: 760px)",HE="(min-width: 761px)";function gf(u){return!u||u===p0}function BE(){return typeof window<"u"&&window.matchMedia(ZE).matches}function mE(u){return gf(u)?"":`&queueId=${encodeURIComponent(u)}`}function o4(u){return String(u||"").trim().replace(/\s+/gu," ").slice(0,200)}function VE(u){let l=o4(u);return l.length===0?"":`&search=${encodeURIComponent(l)}`}function i2(u,l=""){return`${mE(u)}${VE(l)}`}function v$(u,l){return Number(u?.counts?.[l]||0)}function FQ(u,l=""){let f=new Map;for(let n of Array.isArray(u?.queues)?u.queues:[]){let i=String(n?.id||"").trim();if(i.length>0)f.set(i,{...n,name:String(n?.name||i).trim()||i})}for(let n of[String(u?.defaultQueueId||"default"),l].map((i)=>i.trim()).filter(Boolean))if(!f.has(n))f.set(n,{id:n,name:n,total:0,counts:{},activeTaskId:null,runnableTaskId:null,processing:!1});return Array.from(f.values()).sort((n,i)=>{let t=String(n?.id||"")===String(u?.defaultQueueId||"default")?0:1,y=String(i?.id||"")===String(u?.defaultQueueId||"default")?0:1;if(t!==y)return t-y;return String(n?.id||"").localeCompare(String(i?.id||""))})}function VQ(u){let l=String(u?.id||"default"),f=String(u?.name||"").trim();return f.length>0?f:l}function d4(u){let l=String(u?.id||"default"),f=VQ(u);return f===l?l:`${f} (${l})`}function k1(u){let l=v$(u,"running")+v$(u,"judging"),f=v$(u,"queued")+v$(u,"retry_wait"),r=Number(u?.total||0),n=[d4(u),`${r} tasks`];if(l>0)n.push(`${l} running`);if(f>0)n.push(`${f} queued`);return n.join(" · ")}function ot(u,l){if(gf(l))return null;return u.find((f)=>String(f?.id||"")===l)||null}function UQ(u,l,f,r){if(gf(f)){let i=v1(u);return String(u?.activeTaskId||i[0]||r.find((t)=>WQ(t))?.id||"")}let n=ot(l,f);return String(n?.activeTaskId||r.find((i)=>WQ(i))?.id||"")}function DE(u,l,f){if(!gf(l)){let r=ot(u,l);return String(r?.runnableTaskId||f.find((n)=>String(n?.status||"")==="queued"||String(n?.status||"")==="retry_wait")?.id||"")}return String(f.find((r)=>String(r?.status||"")==="queued"||String(r?.status||"")==="retry_wait")?.id||"")}async function JQ(u,l=p0,f=""){return vl(kl(u,`/api/tasks/overview?limit=${OQ}&transcriptLimit=1&compact=1&selected=0&includeActive=0&stats=0&skipTrace=1${i2(l,f)}`),n2())}async function b4(u,l,f=0,r=p0,n="",i=!1,t={}){let y=t.selected===!1?"&selected=0":"",c=t.includeActive===!1?"&includeActive=0":"",$=t.stats===!1?"&stats=0":"",A=Number.isInteger(t.limit)&&t.limit>0?Math.min(500,t.limit):OQ;return vl(kl(u,`/api/tasks/overview?limit=${encodeURIComponent(String(A))}&transcriptLimit=3&compact=1&afterSeq=${encodeURIComponent(String(Math.max(0,f)))}&preferId=${encodeURIComponent(l)}${y}${c}${$}${i?"&skipTrace=1":""}${i2(r,n)}`),n2())}async function QQ(u,l,f,r=ZQ,n=""){return vl(kl(u,`/api/tasks/overview?limit=${encodeURIComponent(String(r))}&transcriptLimit=1&compact=1&selected=0&includeActive=0&stats=0&beforeId=${encodeURIComponent(f)}${i2(l,n)}`),n2())}async function pE(u,l){return vl(kl(u,`/api/tasks/${encodeURIComponent(l)}/trace-summary`))}async function SE(u,l,f,r=null){let n=r===null||r===void 0||String(r).length===0?"":`&attempt=${encodeURIComponent(String(r))}`;return vl(kl(u,`/api/tasks/${encodeURIComponent(l)}/prompt?part=${encodeURIComponent(f)}${n}`))}async function XE(u,l,f=0,r=500,n=null){let i=n===null||n===void 0||String(n).length===0?"":`&attempt=${encodeURIComponent(String(n))}`;return vl(kl(u,`/api/tasks/${encodeURIComponent(l)}/trace-steps?afterSeq=${encodeURIComponent(String(f))}&limit=${encodeURIComponent(String(r))}${i}`))}async function YE(u,l,f){return vl(kl(u,`/api/tasks/${encodeURIComponent(l)}/trace-step?seq=${encodeURIComponent(String(f))}`))}async function PE(u,l){return vl(kl(u,`/api/tasks/${encodeURIComponent(l)}/read`),{method:"POST",body:{}})}async function CE(u){return vl(kl(u,"/api/tasks/read-all"),{method:"POST",body:{}})}function ME(u){return Array.isArray(u?.output)?u.output:[]}function RE(u){return Array.isArray(u?.attempts)?u.attempts:[]}function v4(u){return u?.counts&&typeof u.counts==="object"&&!Array.isArray(u.counts)?u.counts:{}}function hE(u){return u.split(/^\s*---+\s*$/gmu).map((l)=>l.trim()).filter(Boolean)}function NQ(u){let l=Number(u);return Number.isFinite(l)?Math.max(1,Math.min(50,Math.floor(l))):1}function Bi(u){let l=[];for(let f of u.split(/[\s,,;;]+/u)){let r=f.trim();if(/^codex_\d+_[A-Za-z0-9_-]+$/u.test(r)&&!l.includes(r))l.push(r)}return l}function xE(u,l){let f=Bi(l);if(f.length===0)return u;return[`引用 Code Queue 任务 ${f.join(" ")}。后端会在入队时只注入这些任务的 initial prompt 和 final response 全文;中间执行过程不注入,如需补充核查可运行:${f.map((r)=>`bun scripts/cli.ts codex task ${r}`).join(";")}`,"","本次任务:",u].join(` -`)}function bE(u){let r=u.trimStart();if(!r.startsWith("# Code Queue 已解析引用上下文"))return{hasInjection:!1,reference:"",userPrompt:u};let n=u.length-r.length,i=u.lastIndexOf(` +`):[]}function v4(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 AE(u){let l=String(u.bodyPreview||"");return/file changes status=([A-Za-z0-9_-]+)/u.exec(l)?.[1]}function jE(u){return/^item\/(?:started|completed): file changes status=/u.test(String(u||"").trim())}function yQ(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&&g$(r).length>0}function st(u){return iQ(String(u||"").replace(/^[ab]\//u,"").trim())}function I4(u){let l=/^([AMDRCU?]{1,2})\s+(.+)$/u.exec(u);if(!l)return null;let f=st(l[2]||"");return f.length>0?{status:l[1]||"M",path:f}:null}function g4(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=st(l[2]||"");return n.length>0?{status:r,path:n}:null}let f=/^\*\*\*\s+Move to:\s+(.+)$/u.exec(u);if(f){let r=st(f[1]||"");return r.length>0?{status:"R",path:r}:null}return null}function g$(u){let l=[],f=(n,i)=>{let t=st(i);if(t.length===0||t==="/dev/null")return;let y=l.find((c)=>c.path===t);if(y){if(y.status==="M"&&n!=="M")y.status=n;return}l.push({status:n,path:t})},r="";for(let n of tQ(u)){let i=I4(n)||g4(n);if(i!==null){f(i.status,i.path),r=i.path;continue}let t=/^diff --git a\/(.+?) b\/(.+)$/u.exec(n);if(t){let j=t[2]||t[1]||"";f("M",j),r=st(j);continue}let y=/^\+\+\+ b\/(.+)$/u.exec(n);if(y&&y[1]!=="/dev/null"){f("M",y[1]||""),r=st(y[1]||"");continue}if(/^new file mode /u.exec(n)&&r)f("A",r);if(/^deleted file mode /u.exec(n)&&r)f("D",r);let A=/^rename to (.+)$/u.exec(n);if(A)f("R",A[1]||"")}return l}function FE(u){if(I4(u)!==null||g4(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 s4(u){return tQ(u).map((l)=>{let f=I4(l)||g4(l);if(f!==null)return{text:l,kind:"file",path:f.path,status:f.status};return{text:l,kind:FE(l)}})}function UE(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 dJ(u,l){return`${l} ${u} line${u===1?"":"s"}`}function JE(u,l){let f=[];if(u>0)f.push(dJ(u,"Added"));if(l>0)f.push(dJ(l,"removed"));return f.join(", ")}function QE(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 NE(u){return`${u} file${u===1?"":"s"}`}function cQ(u){let l=u.length>0?u:[],f=oJ(l.map((F)=>String(F.bodyPreview||""))),n=oJ(l.map((F)=>String(F.bodyPreview||"")).filter((F)=>F.trim().length>0&&!jE(F)))||f,i=g$(n||f),t=l.map((F)=>({method:v4(F),status:AE(F),at:F.at})),y=s4(n||f),c=UE(y),$=JE(c.added,c.removed),A=i.length>0?NE(i.length):"",j=$.length>0?`${$}${A?` in ${A}`:""}`:i.length>0?A:at(n||f||"File changes",72);return{status:QE(t),summary:j,files:i,stages:t,lines:y,addedLines:c.added,removedLines:c.removed,rawText:f}}function qE(u){let l=u[0],f=u[u.length-1]||l,r=cQ(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 wE(u){let l=Array.isArray(u)?u:[],f=[],r=[],n=()=>{if(r.length===0)return;f.push(qE(r)),r=[]};for(let i of l){if(yQ(i)){if(v4(i)==="item/started"&&r.length>0)n();if(r.push(i),v4(i)==="item/completed")n();continue}n(),f.push(i)}return n(),f}function _Q(u){let l=[],f=[],r=[],n=($,A)=>{for(let j of A)if(!$.includes(j))$.push(j)};for(let $ of u){let A=String($?.kind||""),j=[$?.commandPreview,$?.bodyPreview,$?.title].map((F)=>String(F||"")).join(` +`);if(A==="explored")n(l,aJ(j));else if(A==="edited")n(f,aJ(j));else if(A==="ran"){let F=String($?.commandPreview||$?.title||"").trim();if(F.length>0&&!r.includes(F))r.push(at(F,90))}}let i=u.map(($)=>Date.parse(String($?.at||""))).filter(($)=>Number.isFinite($)),t=i.length>=2?Math.max(0,Math.max(...i)-Math.min(...i)):0,y=u.reduce(($,A)=>$+(gr(A?.durationMs)??gr(A?.elapsedMs)??0),0),c=t>0?t:y;return{readFiles:l,editedFiles:f,runCommands:r,durationLabel:cE(c)}}function WE(u,l=3){let f=Array.isArray(u)?u:[],r=[],n=[],i=Math.max(0,l),t=new Set;for(let c=f.length-1;c>=0&&i>0;c-=1){let $=f[c];if(!sJ($))continue;t.add($),i-=1}let y=()=>{if(n.length>=2){let c=rQ(n);r.push({seq:Number(n[0]?.seq??0),at:n[0]?.at||n.at(-1)?.at,kind:"toolGroup",title:nQ(n),status:`${n.length} calls`,items:n,counts:c,digest:_Q(n),rawSeqs:n.flatMap(($)=>Array.isArray($?.rawSeqs)?$.rawSeqs:[$?.seq]).filter(($)=>$!==void 0)})}else r.push(...n);n=[]};for(let c of f){if(sJ(c)&&!t.has(c)){n.push(c);continue}y(),r.push(c)}return y(),r}function $Q(u){return(Array.isArray(u)?u:[]).map((l,f)=>({...l,seq:Number.isFinite(Number(l?.seq))?Number(l.seq):f+1,kind:String(l?.kind||"message"),at:l?.at===void 0?void 0:String(l.at),durationMs:gr(l?.durationMs)??void 0,title:l?.title===void 0?void 0:String(l.title),status:l?.status===void 0?void 0:String(l.status)}))}function v1(u){let l=gr(u?.state?.time?.start)??gr(u?.time?.start),f=gr(u?.state?.time?.end)??gr(u?.time?.end);return gr(u?.durationMs)??gr(u?.elapsedMs)??gr(u?.timing?.durationMs)??gr(u?.metadata?.durationMs)??(l!==null&&f!==null&&f>=l?f-l:null)??void 0}function k1(u,l){return u?.createdAt||u?.updatedAt||u?.completedAt||l||void 0}function x4(u,l){return u?.id||u?.messageId||l}function LE(u,l=1200){if(typeof u==="string")return u;if(u===void 0||u===null)return"";try{return at(JSON.stringify(u),l)}catch{return at(String(u),l)}}function AQ(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 I$(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 eJ(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 jQ(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=I$(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=I$(f,["filePath","filepath","path"])||I$(u,["filePath","filepath","path"]),t=I$(f,["pattern","query"]),y=eJ(f,["offset"]),c=eJ(f,["limit"]),$=[n];if(t.length>0)$.push(t);if(i.length>0)$.push(i);if(y!==null)$.push(`offset=${y}`);if(c!==null)$.push(`limit=${c}`);return $.length>1?$.join(" "):n}function TE(u,l){let f=u?.part&&typeof u.part==="object"&&!Array.isArray(u.part)?u.part:{},r=String(u?.type||u?.event||u?.name||f?.type||"").toLowerCase(),n=String(f?.type||"").toLowerCase(),i=u?.at||u?.timestamp||f?.updatedAt||f?.createdAt,t=Number.isFinite(Number(u?.seq))?Number(u.seq):l;if(r==="step_start"||r==="step-start"||n==="step-start")return null;if(r==="step_finish"||r==="step-finish"||n==="step-finish")return null;if(n==="tool"||/tool|bash|command/iu.test(`${r} ${n}`)){let c=f?.state&&typeof f.state==="object"&&!Array.isArray(f.state)?f.state:{},$=jQ(f,c),A=AQ(c,f,u),j=FQ($,String(f?.tool||f?.title||"")),F=j==="edited"?{status:String(c?.status||f?.status||u?.status||""),summary:at(A||$,72),files:g$(A),stages:[],lines:s4(A),addedLines:0,removedLines:0,rawText:A}:void 0;return{seq:t,at:k1(f,i),kind:j,title:String(c?.title||f?.title||c?.metadata?.description||f?.tool||"OpenCode tool"),status:String(c?.status||f?.status||u?.status||""),commandPreview:$,bodyPreview:A,durationMs:v1(f),rawSeqs:[f?.id||f?.callID||u?.sessionID||t],editObservation:F}}let y=LE(f?.text??f?.content??f?.delta??u?.text??u?.content??u?.delta,3000).trim();if(y.length>0)return{seq:t,at:k1(f,i),kind:n==="reasoning"?"message":/error|failed/iu.test(`${r} ${n}`)?"error":"message",title:n==="reasoning"?"Reasoning":/error|failed/iu.test(`${r} ${n}`)?"OpenCode error":"Assistant message",status:`opencode/${r||n||"event"}`,bodyPreview:y,durationMs:v1(f),rawSeqs:[f?.id||u?.sessionID||t]};return null}function FQ(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 KE(u){let l=[],f=1;for(let r of Array.isArray(u)?u:[]){if(r?.kind&&r?.title){let y=String(r?.status||"");if(y==="opencode/step-start"||y==="opencode/step-finish")continue;l.push({...r,seq:Number.isFinite(Number(r?.seq))?Number(r.seq):f++});continue}let n=r?.createdAt||r?.updatedAt||r?.completedAt,i=String(r?.role||"assistant").toLowerCase(),t=Array.isArray(r?.parts)?r.parts:[];if(t.length===0){if(r?.part&&(r?.sessionID||String(r?.type||"").startsWith("step_")||String(r?.type||"").includes("tool"))){let y=TE(r,f);if(y!==null)l.push(y),f=Math.max(f+1,Number(y.seq)+1)}else if(r?.textPreview)l.push({seq:f++,at:n,kind:"message",title:`${i||"assistant"} message`,status:i,bodyPreview:String(r.textPreview),rawSeqs:[r?.messageId||f]});continue}for(let y of t){let c=String(y?.type||"").toLowerCase();if(c==="step-start"||c==="step-finish")continue;if(c==="text"||c==="reasoning"){let A=String(y?.textPreview||r?.textPreview||"").trim();if(A.length===0)continue;l.push({seq:f++,at:k1(y,n),kind:"message",title:c==="reasoning"?"Reasoning":i==="user"?"User message":i==="system"?"System message":"Assistant message",status:c==="reasoning"?"reasoning":i,bodyPreview:A,durationMs:v1(y),rawSeqs:[x4(y,f)]});continue}if(c==="tool"){let A=y?.state&&typeof y.state==="object"&&!Array.isArray(y.state)?y.state:{},j=jQ(y,A),F=AQ(A,y,{}),J=FQ(j,String(y?.tool||y?.title||"")),Q=J==="edited"?{status:String(A?.status||y?.status||""),summary:at(F||j,72),files:g$(F),stages:[],lines:s4(F),addedLines:0,removedLines:0,rawText:F}:void 0;l.push({seq:f++,at:k1(y,n),kind:J,title:String(y?.title||y?.tool||"tool"),status:String(y?.status||""),commandPreview:j,bodyPreview:F,durationMs:v1(y),rawSeqs:[x4(y,f)],editObservation:Q});continue}let $=String(y?.textPreview||y?.title||c||"").trim();if($)l.push({seq:f++,at:k1(y,n),kind:"system",title:c||"part",bodyPreview:$,status:String(y?.status||""),durationMs:v1(y),rawSeqs:[x4(y,f)]})}}return l}var UQ={source:"opencode",toTrace:KE};function GE(u){return String(u||"unknown").toLowerCase().replace(/[^a-z0-9_-]+/gu,"-")||"unknown"}function uQ(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 zE(u){if(u==="item/fileChange/outputDelta")return"delta";return u.replace(/^item\//u,"")}function EE(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 ${uQ(n)}`},Su("span",{className:`codex-edit-file-status ${uQ(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 OE(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 ${GE(n.status||n.method)}`},Su("b",null,zE(n.method)),n.status?Su("em",null,n.status):null))):null,f.length>0?Su("div",{className:"codex-edit-diff",role:"list"},f.map(EE)):null,l?Su("div",{className:"codex-edit-omitted"},`${l} (查看原始JSON获取完整记录)`):null)}function lQ(u,l,f){let r=b4(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 JQ(u,l=!1){let f=String(u.kind||"message"),r=["ran","explored","edited"].includes(f),n=b4(u.commandOmittedLines),i=b4(u.bodyOmittedLines),t=String(u.commandPreview||(r?u.title||"":"")),y=String(u.stdoutPreview||""),c=String(u.stderrPreview||""),$=y.length>0||c.length>0,A=Boolean(u.foldedReferencePrompt)&&String(u.fullPrompt||"").length>0,j=f==="edited"&&(u.editObservation!==void 0||yQ(u))?u.editObservation||cQ([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"},h4(f)),r&&j===null?null:Su("strong",null,j!==null?"File changes":String(u.title||h4(f))),u.status?Su("code",null,String(j?.status||u.status)):null,Su("time",null,wu(u.at))),t&&j===null?Su("pre",{className:"codex-transcript-command"},t,n?` +${n}`:""):null,j!==null?OE(j,i):$?Su("div",{className:"codex-transcript-streams"},y.length>0?lQ("stdout",y,u.stdoutOmittedLines):null,c.length>0?lQ("stderr",c,u.stderrOmittedLines):null):u.bodyPreview?Su("pre",{className:"codex-transcript-body"},String(u.bodyPreview),i?` +${i} (查看原始JSON获取完整记录)`:""):null,A?Su("details",{className:"codex-initial-prompt-full","data-testid":"codex-initial-prompt-full"},Su("summary",null,Su("span",null,"引用注入已折叠,点击查看最终传入 Codex 的完整 prompt"),Su("code",null,`${u.fullPromptLines||_E(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 ZE(u){let l=Array.isArray(u.items)?u.items:[],f=u.digest&&typeof u.digest==="object"?u.digest:_Q(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"},h4("toolGroup")),Su("strong",null,String(u.title||nQ(l))),Su("code",null,String(u.status||`${l.length} calls`)),Su("time",null,wu(u.at)))),Su("div",{className:"codex-tool-group-digest"},Su("span",null,`read: ${R4(Array.isArray(f.readFiles)?f.readFiles:[])}`),Su("span",null,`edit: ${R4(Array.isArray(f.editedFiles)?f.editedFiles:[])}`),Su("span",null,`run: ${R4(Array.isArray(f.runCommands)?f.runCommands:[],2)}`),Su("span",null,`duration: ${f.durationLabel||"--"}`)),Su("div",{className:"codex-tool-group-items"},l.map((r)=>JQ(r,!0))))))}function HE(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 QQ(u,l){if(l)return u;return u.flatMap((f)=>{if(String(f.kind||"")==="system"&&!HE(f))return[];if(String(f.kind||"")!=="toolGroup"||!Array.isArray(f.items))return[f];let r=QQ(f.items,l);return[{...f,items:r}]})}var BE=16;function fQ(u){return u.scrollHeight-u.scrollTop-u.clientHeight<=BE}function s$({items:u,input:l,port:f,autoScroll:r=!1,loading:n=!1,hasDetail:i=!0,emptyText:t="等待 Trace 输出...",loadingText:y="正在加载完整 Trace...",testId:c="trace-output",className:$="codex-transcript",keepRecentToolCalls:A=3,collapseTools:j=!0,showSystemEvents:F=!1}){let J=gJ(null),Q=gJ(!0),W=QQ(wE(f?yE(f,l):$Q(u)),Boolean(F)),L=j?WE(W,A):W,U=$E(W);tE(()=>{let w=J.current;if(!r||!w)return;if(!Q.current&&!fQ(w))return;w.scrollTop=w.scrollHeight,Q.current=!0},[r,W.length,U]);let N={className:$,ref:J,onScroll:(w)=>{let G=w.currentTarget;Q.current=fQ(G)},"data-testid":c};if(n&&!i)return Su("div",N,Su("div",{className:"codex-output-empty"},y));return Su("div",N,L.length===0?Su("div",{className:"codex-output-empty"},t):L.map((w)=>String(w.kind||"")==="toolGroup"?ZE(w):JQ(w)))}var NQ=Cu(Jl(),1),Bi=NQ.default.createElement;function a$(...u){return u.filter(Boolean).join(" ")}function qQ({title:u,children:l,actions:f,onClose:r,className:n,backdropClassName:i,bodyClassName:t,actionsClassName:y,titleId:c,testId:$,closeTestId:A,closeLabel:j="关闭",disableClose:F=!1,closeOnBackdrop:J=!0}){let Q={className:a$("raw-dialog","unidesk-dialog",n),role:"dialog","aria-modal":"true"};if(c)Q["aria-labelledby"]=c;else if(typeof u==="string")Q["aria-label"]=u;if($)Q["data-testid"]=$;return Bi("div",{className:a$("modal-backdrop","unidesk-dialog-backdrop",i),role:"presentation",onClick:(W)=>{if(J&&!F&&W.target===W.currentTarget)r()}},Bi("section",Q,Bi("div",{className:"raw-dialog-head unidesk-dialog-head"},Bi("strong",c?{id:c}:null,u),Bi("button",{type:"button",className:"ghost-btn",onClick:r,disabled:F,"data-testid":A},j)),Bi("div",{className:a$("unidesk-dialog-body",t)},l),f?Bi("div",{className:a$("unidesk-dialog-actions",y)},f):null))}var T=uc.default.createElement,{useEffect:Mn,useMemo:wQ,useRef:Ml}=uc.default,vu=uc.default.useState,VE=120,XQ=12,YQ=48,mE=1200;function a4(){return typeof document>"u"||document.visibilityState!=="hidden"}function bl(u,l="操作失败"){return Ou(u,l)}function ar(u){let l=Number(u);if(!Number.isFinite(l)||l<0)return"--";let f=Math.floor(l/1000),r=Math.floor(f/3600),n=Math.floor(f%3600/60),i=f%60;if(r>0)return`${r}h ${String(n).padStart(2,"0")}m`;if(n>0)return`${n}m ${String(i).padStart(2,"0")}s`;return`${i}s`}function hn(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 PQ(u,l=Date.now()){let f=hn(u);if(f===null)return"--";let r=Math.max(0,Math.floor((l-f)/1000));if(r<1)return"刚刚";let n=Math.floor(r/86400),i=Math.floor(r%86400/3600),t=Math.floor(r%3600/60),y=r%60;if(n>0)return`${n}天${i>0?`${i}小时`:""}前`;if(i>0)return`${i}小时${t>0?`${t}分钟`:""}前`;if(t>0)return`${t}分钟${y}秒前`;return`${y}秒前`}function CQ(...u){let l="",f=-1/0;for(let r of u){let n=String(r||"");if(n.length===0)continue;let i=hn(r);if(i!==null&&i>=f)l=n,f=i;else if(l.length===0)l=n}return l}function DE(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 r2(u,l=180){let f=String(u||"").replace(/\s+/gu," ").trim();return f.length>l?`${f.slice(0,l-1)}…`:f}async function ml(u,l={}){return Eu(u,{strictJson:!0,retryInvalidJson:1,invalidJsonPrefix:"Code Queue 返回了无效 JSON",invalidJsonPreview:!0,responsePreviewLength:mE,...l})}function pi({status:u,children:l,title:f}){let r=String(u||"unknown").toLowerCase();return T("span",{className:`status-badge ${r}`,title:f},l||u||"unknown")}function ot({title:u,eyebrow:l,summary:f,actions:r,children:n,className:i,loading:t}){return T("section",{className:`panel ${i||""}`},T("div",{className:"panel-head"},T("div",null,l?T("p",{className:"panel-eyebrow"},l):null,T(rl,{title:u,loading:t}),f?T("div",{className:"panel-summary"},f):null),r?T("div",{className:"panel-actions"},r):null),T("div",{className:"panel-body"},n))}function MQ({title:u,data:l,onOpen:f,testId:r}){return T("button",{type:"button",className:"ghost-btn","data-testid":r,onClick:()=>f(u,l)},"查看原始JSON")}function Si({title:u,text:l}){return T("div",{className:"empty-state"},T("strong",null,u),T("span",null,l))}function pE(u){return u?.runtime&&typeof u.runtime==="object"&&!Array.isArray(u.runtime)?u.runtime:{}}function SE(u){return u?.backend&&typeof u.backend==="object"&&!Array.isArray(u.backend)?u.backend:{}}function Dl(u,l){return`${u}/microservices/code-queue/proxy${l}`}function XE(u){return`${u}/microservices/oa-event-flow/proxy/api/events/stream?tags=${encodeURIComponent("service:code-queue")}`}function $2(){return{headers:{"cache-control":"no-cache","x-unidesk-no-cache":"1"}}}function vl(u){return Array.isArray(u?.tasks)?u.tasks:[]}function B0(u){return u?.pagination&&typeof u.pagination==="object"&&!Array.isArray(u.pagination)?u.pagination:{}}function WQ(u){let l=Date.parse(String(u?.updatedAt||u?.createdAt||""));return Number.isFinite(l)?l:0}function LQ(u){return hn(u?.queueEnteredAt)??hn(u?.createdAt)??hn(u?.updatedAt)??0}function YE(u,l){let f=LQ(u)-LQ(l);if(f!==0)return f;let r=(hn(u?.createdAt)??0)-(hn(l?.createdAt)??0);if(r!==0)return r;return String(u?.id||"").localeCompare(String(l?.id||""))}function PE(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=VQ(r)-VQ(n);if(i!==0)return i;let t=String(r?.id||"")===l?0:1,y=String(n?.id||"")===l?0:1;if(t!==y)return t-y;return WQ(n)-WQ(r)})}function V0(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 PE([Array.from(f.values())],l)}function g1(u){return Array.isArray(u?.activeTaskIds)?u.activeTaskIds.map((l)=>String(l||"")).filter(Boolean):[String(u?.activeTaskId||"")].filter(Boolean)}var D0="__all__",CE="(max-width: 760px)",ME="(min-width: 761px)";function sf(u){return!u||u===D0}function RE(){return typeof window<"u"&&window.matchMedia(CE).matches}function xE(u){return sf(u)?"":`&queueId=${encodeURIComponent(u)}`}function n2(u){return String(u||"").trim().replace(/\s+/gu," ").slice(0,200)}function hE(u){let l=n2(u);return l.length===0?"":`&search=${encodeURIComponent(l)}`}function A2(u,l=""){return`${xE(u)}${hE(l)}`}function o$(u,l){return Number(u?.counts?.[l]||0)}function TQ(u,l=""){let f=new Map;for(let n of Array.isArray(u?.queues)?u.queues:[]){let i=String(n?.id||"").trim();if(i.length>0)f.set(i,{...n,name:String(n?.name||i).trim()||i})}for(let n of[String(u?.defaultQueueId||"default"),l].map((i)=>i.trim()).filter(Boolean))if(!f.has(n))f.set(n,{id:n,name:n,total:0,counts:{},activeTaskId:null,runnableTaskId:null,processing:!1});return Array.from(f.values()).sort((n,i)=>{let t=String(n?.id||"")===String(u?.defaultQueueId||"default")?0:1,y=String(i?.id||"")===String(u?.defaultQueueId||"default")?0:1;if(t!==y)return t-y;return String(n?.id||"").localeCompare(String(i?.id||""))})}function RQ(u){let l=String(u?.id||"default"),f=String(u?.name||"").trim();return f.length>0?f:l}function i2(u){let l=String(u?.id||"default"),f=RQ(u);return f===l?l:`${f} (${l})`}function s1(u){let l=o$(u,"running")+o$(u,"judging"),f=o$(u,"queued")+o$(u,"retry_wait"),r=Number(u?.total||0),n=[i2(u),`${r} tasks`];if(l>0)n.push(`${l} running`);if(f>0)n.push(`${f} queued`);return n.join(" · ")}function et(u,l){if(sf(l))return null;return u.find((f)=>String(f?.id||"")===l)||null}function KQ(u,l,f,r){if(sf(f)){let i=g1(u);return String(u?.activeTaskId||i[0]||r.find((t)=>HQ(t))?.id||"")}let n=et(l,f);return String(n?.activeTaskId||r.find((i)=>HQ(i))?.id||"")}function bE(u,l,f){if(!sf(l)){let r=et(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 GQ(u,l=D0,f=""){return ml(Dl(u,`/api/tasks/overview?limit=${XQ}&transcriptLimit=1&compact=1&selected=0&includeActive=0&stats=0&skipTrace=1${A2(l,f)}`),$2())}async function o4(u,l,f=0,r=D0,n="",i=!1,t={}){let y=t.selected===!1?"&selected=0":"",c=t.includeActive===!1?"&includeActive=0":"",$=t.stats===!1?"&stats=0":"",A=Number.isInteger(t.limit)&&t.limit>0?Math.min(500,t.limit):XQ;return ml(Dl(u,`/api/tasks/overview?limit=${encodeURIComponent(String(A))}&transcriptLimit=3&compact=1&afterSeq=${encodeURIComponent(String(Math.max(0,f)))}&preferId=${encodeURIComponent(l)}${y}${c}${$}${i?"&skipTrace=1":""}${A2(r,n)}`),$2())}async function zQ(u,l,f,r=YQ,n=""){return ml(Dl(u,`/api/tasks/overview?limit=${encodeURIComponent(String(r))}&transcriptLimit=1&compact=1&selected=0&includeActive=0&stats=0&beforeId=${encodeURIComponent(f)}${A2(l,n)}`),$2())}async function vE(u,l){return ml(Dl(u,`/api/tasks/${encodeURIComponent(l)}/trace-summary`))}async function kE(u,l,f,r=null){let n=r===null||r===void 0||String(r).length===0?"":`&attempt=${encodeURIComponent(String(r))}`;return ml(Dl(u,`/api/tasks/${encodeURIComponent(l)}/prompt?part=${encodeURIComponent(f)}${n}`))}async function IE(u,l,f=0,r=500,n=null){let i=n===null||n===void 0||String(n).length===0?"":`&attempt=${encodeURIComponent(String(n))}`;return ml(Dl(u,`/api/tasks/${encodeURIComponent(l)}/trace-steps?afterSeq=${encodeURIComponent(String(f))}&limit=${encodeURIComponent(String(r))}${i}`))}async function gE(u,l,f){return ml(Dl(u,`/api/tasks/${encodeURIComponent(l)}/trace-step?seq=${encodeURIComponent(String(f))}`))}async function sE(u,l){return ml(Dl(u,`/api/tasks/${encodeURIComponent(l)}/read`),{method:"POST",body:{}})}async function aE(u){return ml(Dl(u,"/api/tasks/read-all"),{method:"POST",body:{}})}function oE(u){return Array.isArray(u?.output)?u.output:[]}function dE(u){return Array.isArray(u?.attempts)?u.attempts:[]}function d4(u){return u?.counts&&typeof u.counts==="object"&&!Array.isArray(u.counts)?u.counts:{}}function eE(u){return u.split(/^\s*---+\s*$/gmu).map((l)=>l.trim()).filter(Boolean)}function EQ(u){let l=Number(u);return Number.isFinite(l)?Math.max(1,Math.min(50,Math.floor(l))):1}function Vi(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 uO(u,l){let f=Vi(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 lO(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 DQ(u){let l=String(u?.displayPrompt||"");if(l.length>0)return l;let f=String(u?.prompt||"");return vE(bE(f).userPrompt)}function Ur(u){return u?._traceSummary&&typeof u._traceSummary==="object"&&!Array.isArray(u._traceSummary)?u._traceSummary:null}function o$(u){return u?._promptDetails&&typeof u._promptDetails==="object"&&!Array.isArray(u._promptDetails)?u._promptDetails:{}}function t2(u){let l=Ur(u)?.prompt;return l&&typeof l==="object"&&!Array.isArray(l)?l:{}}function pQ(u){let l=Ur(u)?.execution;return l&&typeof l==="object"&&!Array.isArray(l)?l:{}}function qQ(u){let l=Number(u);return Number.isFinite(l)&&l>=0?Math.floor(l):0}function Mn(u){let l=Number(u);return Number.isFinite(l)&&l>=0?Math.floor(l):null}function SQ(u){let l=Wl(u?.traceStats);if(l&&(u?.statsSource==="oa-event-flow"||l.source==="oa-event-flow"))return l;let f=Ur(u),r=Wl(f?.traceStats);if(r&&(f?.statsSource==="oa-event-flow"||r.source==="oa-event-flow"))return r;return null}function kE(u,l){let f=Wl(l?.traceStats)||Wl(l?.execution?.traceStats),r=String(l?.statsSource||l?.execution?.statsSource||"");if(f&&(r==="oa-event-flow"||f.source==="oa-event-flow"))return f;return null}function IE(u,l){return Mn(SQ(u)?.[l])}function XQ(u){let l=IE(u,"stepCount");if(l!==null)return l;let f=Ur(u);if(f!==null)return gE(f);return null}function gE(u){let l=Wl(u?.traceStats);if(!l||u?.statsSource!=="oa-event-flow"&&l.source!=="oa-event-flow")return null;return Mn(l.stepCount)}function k$(u){if(!u||u?._traceSummaryLoaded!==!0)return!1;let l=Ur(u),f=String(u?._traceSummaryUpdatedAt||l?.updatedAt||""),r=String(u?.updatedAt||"");if(r.length>0){let n=Rn(f),i=Rn(r);if(n!==null&&i!==null){if(n+10?f:DQ(u)}function YQ(u){let l=Ur(u);return String(l?.finalResponse||u?.finalResponse||"").trimEnd()}function PQ(u){let f=Ur(u)?.lastJudge||u?.lastJudge;return f&&typeof f==="object"&&!Array.isArray(f)?f:null}function Wl(u){return u&&typeof u==="object"&&!Array.isArray(u)?u:null}function sE(u){let l=Wl(u?.raw),f=Wl(u?.failureDetails)||Wl(l?.minimaxFailure);if(f===null)return"";let r=f.repairAttempt===void 0?"":`${f.repairAttempt}/${f.maxRepairAttempts??"?"}`;return[["provider",f.provider||"minimax"],["stage",f.stage],["model",f.model],["timedOut",f.timedOut],["durationMs",f.durationMs],["timeoutMs",f.timeoutMs],["promptChars",f.promptChars],["promptLines",f.promptLines],["payloadBytes",f.payloadBytes],["responseStatus",f.responseStatus],["repairAttempt",r],["errorName",f.errorName],["error",f.errorMessage],["responseContentPreview",f.responseContentPreview],["responseTextPreview",f.responseTextPreview]].filter(([,i])=>i!==void 0&&i!==null&&String(i).length>0).map(([i,t])=>`${i}: ${String(t)}`).join(` -`)}function CQ({judge:u,testId:l="codex-judge-failure-details"}){let f=sE(u);if(f.length===0)return null;return T("details",{className:"codex-judge-failure-details","data-testid":l},T("summary",null,"MiniMax failure details"),T("pre",null,f))}function aE(u){let l=Ur(u)?.attempts;if(Array.isArray(l)&&l.length>0)return l;let f=pQ(u),r=YQ(u),n=PQ(u);if(Object.keys(f).length===0&&r.length===0&&n===null)return[];return[{index:Number(u?.currentAttempt||1),mode:u?.currentMode||"initial",startedAt:u?.startedAt,finishedAt:u?.finishedAt,terminalStatus:u?.status,execution:f,finalResponse:r,finalResponseChars:r.length,judge:n}]}function oE(u,l){return Wl(l?.execution)||pQ(u)}function dE(u,l,f,r){let n=Ur(u),i=Number(n?.currentAttempt||u?.currentAttempt||0),t=Number(f),y=Number.isFinite(t)&&t>0&&t===i,c=BQ(u?.updatedAt,n?.updatedAt);if(y&&!l?.finishedAt&&c.length>0)return c;return String(l?.updatedAt||l?.finishedAt||r.effectiveEndAt||(y?c:"")||c||u?.finishedAt||u?.startedAt||"")}function eE(u,l){let f=String(l?.finalResponse||l?.finalResponsePreview||"");if(Object.prototype.hasOwnProperty.call(l||{},"finalResponse")||Object.prototype.hasOwnProperty.call(l||{},"finalResponsePreview"))return f.trimEnd();return f.length>0?f.trimEnd():YQ(u)}function MQ(u,l){if(Object.prototype.hasOwnProperty.call(l||{},"judge"))return Wl(l?.judge);return PQ(u)}function uO(u,l,f){if(!QO(u))return!1;if(y2(l,f))return!1;if(l?.finishedAt)return!1;if(["succeeded","failed","canceled"].includes(String(l?.terminalStatus||"")))return!1;let r=Ur(u),n=Number(r?.currentAttempt||u?.currentAttempt||0),i=Number(f);if(Number.isFinite(i)&&i>0&&Number.isFinite(n)&&n>0)return i===n;return!0}function RQ(u){return`feedback:${String(u||"latest")}`}function lO(u,l,f){let r=String(l?.feedbackPrompt||"").trimEnd(),n=String(l?.feedbackPromptPreview||r||"").trimEnd(),i=Number(l?.feedbackPromptChars||r.length||n.length||0),t=Number(l?.feedbackPromptLines||Vi(r||n));if(r.length>0||n.length>0||i>0)return{text:r,preview:n,chars:i,lines:t,source:l?.feedbackPromptSource||"judge-feedback",forAttempt:l?.feedbackPromptForAttempt||Number(f||0)+1,truncated:Boolean(l?.feedbackPromptTruncated)};let y=MQ(u,l),c=String(y?.continuePrompt||"").trimEnd();if(y?.decision==="retry"&&c.length>0)return{text:"",preview:c,chars:c.length,lines:Vi(c),source:"judge-continue-prompt",forAttempt:Number(f||0)+1,truncated:!1};return null}function fO(u){let l=t2(u);return Boolean(l.hasReferenceInjection||Number(l.referencePromptChars||0)>0||u?.referenceInjection||u?.referenceInjectionSummary)}function hQ(u,l=null){if(l!==null&&l!==void 0){let r=(Wl(u?._traceStepsByAttempt)||{})[String(l)];return Array.isArray(r)?r:[]}return Array.isArray(u?._traceSteps)?u._traceSteps:[]}function e4(u){let f=[u?.seq,...Array.isArray(u?.rawSeqs)?u.rawSeqs:[]].map((r)=>Number(r)).filter((r)=>Number.isFinite(r));return f.length>0?Math.max(...f):0}function rO(u){return(Array.isArray(u)?u:[]).reduce((l,f)=>Math.max(l,e4(f)),0)}function nO(u,l){let f=new Map;for(let r of[...Array.isArray(u)?u:[],...Array.isArray(l)?l:[]]){let n=String(r?.seq??`${r?.title||"step"}:${r?.at||""}`);f.set(n,{...f.get(n)||{},...r})}return Array.from(f.values()).sort((r,n)=>e4(r)-e4(n))}function dt(u){return(Array.isArray(u?.summaryLines)?u.summaryLines:[]).map((l)=>String(l||""))}function iO(u){let l=String(u?.kind||"").trim().toLowerCase(),f=String(u?.status||"").trim().toLowerCase();return l==="error"||f==="error"}function d$(u){let l=String(u?.status||"").trim();if(l.length>0)return l;let f=dt(u).join(` -`);return/^(item\/[A-Za-z]+(?:\/[A-Za-z]+)?):/u.exec(f)?.[1]||""}function wQ(u){return/^item\/(?:started|completed): file changes status=/u.test(String(u||"").trim())}function tO(u){let l=dt(u);for(let r=l.length-1;r>=0;r-=1){let n=/file changes status=([A-Za-z0-9_-]+)/u.exec(l[r]||"")?.[1];if(n)return n}let f=d$(u);if(f==="item/fileChange/outputDelta")return"updated";if(f==="item/started")return"started";if(f==="item/completed")return"completed";return f.replace(/^item\//u,"")||String(u?.status||"changed")}function yO(u){if(String(u?.kind||"")!=="edited")return!1;let l=String(u?.title||""),f=String(u?.status||""),r=dt(u).join(` -`);if(l==="Edited files")return!0;if(/^item\/fileChange\//u.test(f))return!0;if((f==="item/started"||f==="item/completed")&&/file changes status=/u.test(r))return!0;if(/^Success\. Updated the following files:/mu.test(r))return!0;if(/^diff --git /mu.test(r))return!0;return/^([AMDRCU?]{1,2})\s+\S+/mu.test(r)}function cO(u){if(u.length<=1)return u[0];let l=u.find((i)=>d$(i)==="item/fileChange/outputDelta")||u.find((i)=>dt(i).some((t)=>!wQ(t)))||u.at(-1)||u[0],f=u.flatMap((i)=>Array.isArray(i?.rawSeqs)?i.rawSeqs:[i?.seq]).filter((i)=>i!==void 0),r=u.flatMap(dt).filter((i)=>i.trim().length>0&&!wQ(i)),n=u[u.length-1]||l;return{...l,at:l?.at||n?.at,title:String(l?.title||"Edited files"),status:tO(n),summaryLines:r.length>0?r:dt(l),rawSeqs:f}}function _O(u){let l=Array.isArray(u)?u:[],f=[],r=[],n=()=>{if(r.length>0)f.push(cO(r));r=[]};for(let i of l){if(yO(i)){if(d$(i)==="item/started"&&r.length>0)n();if(r.push(i),d$(i)==="item/completed")n();continue}n(),f.push(i)}return n(),f}function $O(u){return{...u}}function u2(u,l=null){if(l!==null&&l!==void 0){let f=Wl(u?._traceStepsLoadedByAttempt)||{};return Boolean(f[String(l)])}return Boolean(u?._traceStepsLoaded)}function l2(u){return u?._traceStepDetails&&typeof u._traceStepDetails==="object"&&!Array.isArray(u._traceStepDetails)?u._traceStepDetails:{}}function AO(u,l){let f=Number(u?.index);return Number.isFinite(f)?f:l+1}function y2(u,l){return Boolean(u?.synthetic)||Number(l)<=0}function e$(u){let l=Number(u);return Number.isFinite(l)?String(l):void 0}function jO(u){let l=u?.timing&&typeof u.timing==="object"?u.timing:{},f=String(u?.status||"");if(["queued"].includes(f))return`等待 ${ar(l.queueWaitMs??l.totalElapsedMs)}`;if(["running","judging","retry_wait"].includes(f))return`耗时 ${ar(l.durationMs??l.totalElapsedMs)}`;return`耗时 ${ar(l.durationMs??l.totalElapsedMs)}`}function I1(u){return String(u?.queueId||"default")}function xQ(u){return Wl(u?.queuedReason)}function bQ(u){let l=String(u?.queuedReasonLabel||"").trim();if(l.length>0)return l.toUpperCase();let f=xQ(u),r=String(f?.label||"").trim();return r.length>0?r.toUpperCase():""}function FO(u){let l=String(u?.status||"unknown");if(l!=="queued")return l;let f=bQ(u);return f.length>0?`QUEUED(${f})`:"QUEUED"}function UO(u){if(String(u?.status||"")!=="queued")return;let l=xQ(u),f=String(l?.message||"").trim(),r=bQ(u);if(f.length>0&&r.length>0)return`${r}: ${f}`;if(f.length>0)return f;return r.length>0?r:void 0}function JO(u){return{system:"SYS",user:"YOU",assistant:"GPT",reasoning:"THINK",command:"CMD",diff:"DIFF",tool:"TOOL",error:"ERR"}[u]||u.toUpperCase()}function WQ(u){return["running","judging","retry_wait"].includes(String(u?.status||""))}function QO(u){return String(u?.status||"")==="running"}function sr(u){return["succeeded","failed","canceled"].includes(String(u?.status||""))}function vQ(u){if(u?.promptEditable===!0)return!0;if(u?.promptEditable===!1)return!1;return String(u?.status||"")==="queued"&&!u?.startedAt&&Number(u?.currentAttempt||0)===0&&!u?.codexThreadId&&!u?.nextMode}function Cn(u){if(!sr(u))return!1;if(u?.terminalUnread===!0)return!0;if(u?.terminalUnread===!1)return!1;return!u?.readAt}function bl(u){let l=Number(u||0);return Number.isFinite(l)?l:0}function NO(u){return bl(u.queued)+bl(u.retry_wait)}function qO(u){return bl(u.running)+bl(u.judging)}function wO(u,l){return Wl(u?.statistics)||Wl(l?.statistics)||{}}function WO(u){return Array.isArray(u?.daily)?u.daily:[]}function LO(u){return Wl(u?.totals)||{}}function c2(u,l){let f=Number(u?.[l]??0);return Number.isFinite(f)&&f>0?f:0}function k4(u,l){return u.reduce((f,r)=>Math.max(f,c2(r,l)),0)}var mi=700,LQ=220,D0=30,at=24,g1=184,f2=g1-at;function kQ(u,l){if(l<=1)return mi/2;return D0+u*(mi-D0*2)/(l-1)}function IQ(u,l){let f=l>0?l:1;return g1-Math.min(1,u/f)*f2}function I4(u,l,f){let r=u.length>0?u:[{[l]:0}],n=r.length>1?r:[r[0],r[0]];return n.map((i,t)=>`${kQ(t,n.length).toFixed(2)},${IQ(c2(i,l),f).toFixed(2)}`).join(" ")}function Pn(u){let l=String(u||"");return/^\d{4}-\d{2}-\d{2}$/u.test(l)?l.slice(5):l||"--"}function I$(u){if(!u)return"";return`${String(u.seriesKey||"")}:${String(u.row?.date||u.index||"")}`}function TO(u,l,f,r){let n=c2(u,r.key);return{...r,row:u,index:l,value:n,valueLabel:r.format(n),x:kQ(l,f),y:IQ(n,r.max),seriesKey:r.key}}function TQ(u){if(Cn(u))return 0;return{running:1,judging:2,retry_wait:3,queued:4,succeeded:8,failed:8,canceled:8}[String(u?.status||"")]??9}function b1(u){if(!u)return!1;if(u?._traceSummaryLoaded===!0)return!1;return u?.summaryOnly===!0||u?._metaLoaded!==!0}function KO(u){return Boolean(u?._metaLoaded)||u?.summaryOnly===!1}function GO(u,l,f){let r=String(u?.[f]||""),n=String(l?.[f]||"");return r.length>n.length?r:n}function r2(u,l,f){let r=Array.isArray(u?.[f])?u[f]:[],n=Array.isArray(l?.[f])?l[f]:[];if(n.length===0&&r.length>0)return r;return r.length>n.length?r:n}function KQ(u,l){let f=l?.summaryOnly===!0&&KO(u),r={...u,...l};if(!f)return r;for(let n of["prompt","basePrompt","displayPrompt","finalResponse"])r[n]=GO(u,l,n);for(let n of["promptHistory","attempts","output","events"])r[n]=r2(u,l,n);if(u?.referenceInjection?.items&&!l?.referenceInjection?.items)r.referenceInjection=u.referenceInjection;if(u?.referenceInjectionSummary&&!l?.referenceInjectionSummary)r.referenceInjectionSummary=u.referenceInjectionSummary;r.summaryOnly=u?.summaryOnly===!1?!1:l.summaryOnly,r._metaLoaded=u?._metaLoaded,r._detailLoaded=u?._detailLoaded,r._transcriptComplete=u?._transcriptComplete,r._transcriptPreview=Object.prototype.hasOwnProperty.call(l,"_transcriptPreview")?l._transcriptPreview:u?._transcriptPreview;for(let n of["_traceSummary","_traceSummaryLoaded","_traceSteps","_traceStepsLoaded","_traceStepsByAttempt","_traceStepsLoadedByAttempt","_traceStepsNextAfterSeqByAttempt","_traceStepDetails","_promptDetails"])if(!Object.prototype.hasOwnProperty.call(l,n)&&Object.prototype.hasOwnProperty.call(u||{},n))r[n]=u[n];return r}function GQ(u){let l=u?.selected,f=l?.task&&typeof l.task==="object"?l.task:null;if(f!==null){let n=Boolean(l?.preview);return{...f,transcript:Array.isArray(l?.transcript)?l.transcript:[],_detailLoaded:Array.isArray(l?.transcript)&&l.transcript.length>0,_transcriptComplete:Boolean(!n&&!l?.hasMore&&sr(f)),_transcriptPreview:n,_summaryLoaded:!0}}let r=Ml(u)[0];return r?{...r,_summaryLoaded:!0}:null}function g4(u,l){let f=new Map;for(let r of[...Array.isArray(u)?u:[],...Array.isArray(l)?l:[]]){let n=`${Number(r?.seq??0)}:${String(r?.kind||"message")}`,i=f.get(n);if(!i){f.set(n,r);continue}let t={...i,...r};for(let[y,c]of[["bodyPreview","bodyOmittedLines"],["commandPreview","commandOmittedLines"]]){let $=String(i?.[y]||""),A=String(r?.[y]||"");if($.length>A.length)t[y]=i[y],t[c]=i[c]}f.set(n,t)}return Array.from(f.values()).sort((r,n)=>Number(r?.seq??0)-Number(n?.seq??0))}function g$(u){return(Array.isArray(u)?u:[]).reduce((l,f)=>Math.max(l,Number(f?.seq??0)),0)}function zQ(u,l=8){let f=Array.from(new Set((Array.isArray(u)?u:[]).map((n)=>Number(n?.seq??0)).filter((n)=>Number.isFinite(n)&&n>0))).sort((n,i)=>n-i);if(f.length===0)return 0;let r=f[Math.max(0,f.length-l)]??0;return Math.max(0,r-0.001)}function zO(u,l){let f=Array.isArray(u?.codeModels)?u.codeModels:Array.isArray(u?.codexModels)?u.codexModels:[],r=["gpt-5.5","gpt-5.4-mini","gpt-5.4","minimax-m2.7"];return Array.from(new Set([...f,...r,l].map((n)=>String(n||"").trim()).filter(Boolean)))}function EO(u,l){let r=(Array.isArray(u?.executionProviders)?u.executionProviders:[]).map((t)=>({id:String(t?.id||"").trim(),label:String(t?.label||t?.id||"").trim(),defaultWorkdir:String(t?.defaultWorkdir||"").trim(),supportsWindowsNativeCodex:t?.supportsWindowsNativeCodex===!0,windowsNativeDefaultWorkdir:String(t?.windowsNativeDefaultWorkdir||"").trim(),kind:String(t?.kind||"").trim()})).filter((t)=>t.id.length>0),n=String(u?.mainProviderId||u?.defaultProviderId||"D601").trim()||"D601",i=new Map;for(let t of[...r,{id:n,label:`${n} (local)`,defaultWorkdir:String(u?.defaultWorkdir||"/workspace"),supportsWindowsNativeCodex:!1,windowsNativeDefaultWorkdir:"",kind:"local"},l?{id:l,label:l,defaultWorkdir:_2(u,l),supportsWindowsNativeCodex:l!==n,windowsNativeDefaultWorkdir:String(u?.windowsNativeCodexDefaultWorkdir||"/mnt/f/Work/ConStart"),kind:""}:null].filter(Boolean))if(!i.has(t.id))i.set(t.id,t);return Array.from(i.values())}function OO(u,l){let r=(Array.isArray(u?.executionModes)?u.executionModes:[]).map((t)=>({id:String(t?.id||t?.kind||"").trim(),label:String(t?.label||t?.id||t?.kind||"").trim(),description:String(t?.description||"").trim(),defaultWorkdir:String(t?.defaultWorkdir||"").trim(),requiresProvider:t?.requiresProvider===!0,requiresWindowsCwd:t?.requiresWindowsCwd===!0})).filter((t)=>t.id.length>0),n=[{id:"default",label:"默认容器/本机",description:"Code Queue 所在节点用本机 Codex;远程 Provider 用执行容器 Codex。",defaultWorkdir:"",requiresProvider:!1,requiresWindowsCwd:!1},{id:"windows-native",label:"Windows 原生 Codex",description:"启动执行容器,但容器只做 stdio relay,Codex 运行在 Provider 的 Windows 宿主。",defaultWorkdir:String(u?.windowsNativeCodexDefaultWorkdir||"/mnt/f/Work/ConStart"),requiresProvider:!0,requiresWindowsCwd:!0}],i=new Map;for(let t of[...r,...n,l?{id:l,label:l,description:"",defaultWorkdir:"",requiresProvider:l==="windows-native",requiresWindowsCwd:l==="windows-native"}:null].filter(Boolean))if(!i.has(t.id))i.set(t.id,t);return Array.from(i.values())}function s$(u,l,f){if(l!=="windows-native")return _2(u,f);let r=Array.isArray(u?.executionModes)?u.executionModes.find((i)=>String(i?.id||i?.kind||"")==="windows-native"):null,n=Array.isArray(u?.executionProviders)?u.executionProviders.find((i)=>String(i?.id||"")===f):null;return String(n?.windowsNativeDefaultWorkdir||r?.defaultWorkdir||u?.windowsNativeCodexDefaultWorkdir||"/mnt/f/Work/ConStart")}function _2(u,l){let f=String(l||"").trim(),r=u?.defaultWorkdirByProvider&&typeof u.defaultWorkdirByProvider==="object"?u.defaultWorkdirByProvider:{};if(typeof r[f]==="string"&&String(r[f]).trim().length>0)return String(r[f]).trim();let n=Array.isArray(u?.executionProviders)?u.executionProviders.find((t)=>String(t?.id||"")===f):null;if(typeof n?.defaultWorkdir==="string"&&n.defaultWorkdir.trim().length>0)return n.defaultWorkdir.trim();let i=String(u?.mainProviderId||u?.defaultProviderId||"D601");return f===i?String(u?.defaultWorkdir||"/workspace"):String(u?.remoteDefaultWorkdir||"/home/ubuntu")}function ZO(u){return XQ(u)}function HO({task:u,selected:l,onSelect:f,onCopy:r,onReference:n,onMarkRead:i,copied:t,markingRead:y}){let c=u?.lastJudge||{},$=String(u?.id||""),A=Cn(u),j=BQ(u?.updatedAt,Ur(u)?.updatedAt),F=`最近更新: ${HQ(j)}`,J=ZO(u),Q=J===null?"--":String(J),W=J===null?"STEP 统计中心同步中":"STEP 来自 OA Event Flow 统计中心";return T("article",{role:"button",tabIndex:0,className:`codex-task-card ${l?"selected":""} ${A?"unread-terminal":""}`,onClick:f,onKeyDown:(L)=>{if(L.key==="Enter"||L.key===" ")L.preventDefault(),f()},"data-unread-terminal":A?"true":"false","data-testid":`codex-task-${u?.id||"unknown"}`},A?T("span",{className:"codex-unread-badge",title:"待读","aria-label":"待读","data-testid":`codex-unread-task-${$||"unknown"}`}):null,T("div",{className:"codex-task-card-head"},T("div",{className:"codex-task-status-line"},T(Di,{status:u?.status,title:UO(u)},FO(u))),T("span",{className:"mono-text"},`${u?.currentAttempt||0}/${u?.maxAttempts||0}`)),T("div",{className:"codex-task-id-row"},T("code",{title:$},$||"unknown"),T("div",{className:"codex-task-id-actions"},T("button",{type:"button",className:"codex-copy-id-btn",onClick:(L)=>{L.stopPropagation(),n($)},"data-testid":`codex-reference-task-${$||"unknown"}`},"引用"),T("button",{type:"button",className:"codex-copy-id-btn",onClick:(L)=>{L.stopPropagation(),r($)},"data-testid":`codex-copy-task-id-${$||"unknown"}`},t?"已复制":"复制ID"),A?T("button",{type:"button",className:"codex-copy-id-btn codex-mark-read-btn",disabled:Boolean(y),onClick:(L)=>{L.stopPropagation(),i($)},"data-testid":`codex-mark-task-read-${$||"unknown"}`},y?"标记中":"标为已读"):null)),T("strong",null,a4(DQ(u),120)||"空任务"),T("div",{className:"codex-task-meta"},T("span",null,`queue=${I1(u)}`),T("span",null,`provider=${u?.providerId||"D601"}`),T("span",null,`mode=${u?.executionMode||"default"}`),T("span",null,u?.model||"--"),T("span",null,jO(u))),T("div",{className:"codex-task-meta codex-task-update-meta"},T("span",{className:"codex-task-recent-update codex-task-step-count",title:W,"data-testid":`codex-task-step-count-${$||"unknown"}`},`STEP ${Q}`),T("span",{className:"codex-task-recent-update",title:j?`更新时间: ${wu(j)}`:F,"data-testid":`codex-task-recent-update-${$||"unknown"}`},F),T("span",null,wu(j||u?.updatedAt))),vQ(u)?T("div",{className:"codex-judge-line","data-testid":`codex-task-prompt-editable-${$||"unknown"}`},"queued prompt 可编辑"):null,c?.decision?T("div",{className:"codex-judge-line"},`judge=${c.decision} ${Math.round(Number(c.confidence||0)*100)}%`):null)}function s4({title:u,tasks:l,selectedId:f,onSelect:r,onCopy:n,onReference:i,onMarkRead:t,copiedTaskId:y,markingReadTaskId:c,emptyText:$}){let A=Array.isArray(l)?l:[];return T("section",{className:"codex-task-section"},T("div",{className:"codex-task-section-head"},T("span",null,u),T("code",null,String(A.length))),A.length===0?T("p",{className:"codex-task-section-empty"},$):T("div",{className:"codex-task-section-list"},A.map((j)=>T(HO,{key:j.id,task:j,selected:f===j.id,onSelect:()=>r(j.id),onCopy:n,onReference:i,onMarkRead:t,copied:y===j.id,markingRead:c===j.id}))))}function BO(){return T("span",{className:"codex-stats-icon","aria-hidden":"true"},T("svg",{viewBox:"0 0 36 24",focusable:"false"},T("path",{className:"grid",d:"M3 20.5H33M3 12.5H33M3 4.5H33"}),T("polyline",{className:"line tasks",points:"3,18 9,14 15,15 21,8 27,10 33,4"}),T("polyline",{className:"line retry",points:"3,20 9,17 15,18 21,13 27,14 33,9"})))}function mO({stats:u,queueName:l,onRaw:f}){let r=WO(u),n=LO(u),i=r.at(-1)||{},t=k4(r,"executedTasks"),y=k4(r,"retryAttempts"),c=k4(r,"avgDurationMs"),$=r.length>0,A=Wl(u?.range)||{},[j,F]=gu(null),[J,Q]=gu(null),W=[];if(t>0)W.push(`tasks ${t}`);if(y>0)W.push(`retry ${y}`);if(c>0)W.push(`avg ${ar(c)}`);let L=[{key:"executedTasks",className:"tasks",label:"执行任务",max:t,format:(E)=>`${bl(E)} tasks`},{key:"retryAttempts",className:"retry",label:"重试次数",max:y,format:(E)=>`${bl(E)} retries`},{key:"avgDurationMs",className:"duration",label:"平均耗时",max:c,format:(E)=>ar(E)}],U=j||J,q=I$(U),N=String(U?.row?.date||""),w=U?{left:`${Math.max(8,Math.min(92,Number(U.x)/mi*100))}%`,top:`${Math.max(14,Math.min(86,Number(U.y)/LQ*100))}%`}:void 0;V0(()=>{F(null),Q(null)},[l,A.startDate,A.endDate,r.length]);let G=(E)=>{F(E)},Z=(E)=>{let V=I$(E);Q((S)=>I$(S)===V?null:E),F(E)},H=L.flatMap((E)=>r.map((V,S)=>{let B=TO(V,S,r.length,E),D=I$(B),X=q===D,O=String(V?.date||`day-${S}`),Y=`${Pn(O)} ${E.label}: ${B.valueLabel}`;return T("g",{key:`${E.key}-${O}`,className:`stat-point-group ${E.className} ${X?"active":""}`,role:"button",tabIndex:0,"aria-label":Y,"data-testid":`codex-stats-point-${E.className}-${O}`,onMouseEnter:()=>G(B),onFocus:()=>G(B),onClick:()=>Z(B),onKeyDown:(p)=>{if(p.key==="Enter"||p.key===" ")p.preventDefault(),Z(B)}},T("circle",{className:"stat-hit-point",cx:B.x,cy:B.y,r:13}),T("circle",{className:`stat-point ${E.className} ${X?"active":""}`,cx:B.x,cy:B.y,r:X?5.6:4.2}))}));return T(st,{title:"统计曲线",eyebrow:`Daily task stats / ${l}`,className:"codex-stats-panel",summary:T("span",null,`${Pn(A.startDate)} -> ${Pn(A.endDate)} · ${u?.timezone||"Asia/Shanghai"}`),actions:Wl(u)?T(mQ,{title:"Code Queue Stats",data:u,onOpen:f,testId:"raw-codex-stats"}):null},T("div",{className:"codex-stats-hero","data-testid":"codex-stats-panel"},T(BO),T("div",null,T("strong",null,`${bl(n.executedTasks)} tasks / ${bl(n.retryAttempts)} retries`),T("span",null,`平均完成耗时 ${ar(n.avgDurationMs??void 0)} · 终态 ${bl(n.completedTasks)} 个`))),$?T("div",{className:"codex-stats-chart","data-testid":"codex-stats-chart",onMouseLeave:()=>F(null)},T("svg",{viewBox:`0 0 ${mi} ${LQ}`,preserveAspectRatio:"none",role:"img","aria-label":"Code Queue daily task statistics"},T("line",{className:"axis",x1:D0,x2:mi-D0,y1:g1,y2:g1}),T("line",{className:"grid",x1:D0,x2:mi-D0,y1:at+f2/2,y2:at+f2/2}),T("line",{className:"grid",x1:D0,x2:mi-D0,y1:at,y2:at}),T("polyline",{className:"stat-line tasks",points:I4(r,"executedTasks",t)}),T("polyline",{className:"stat-line retry",points:I4(r,"retryAttempts",y)}),T("polyline",{className:"stat-line duration",points:I4(r,"avgDurationMs",c)}),U?T("g",{className:"stat-cursor-layer","data-testid":"codex-stats-active-point"},T("line",{className:"stat-cursor",x1:U.x,x2:U.x,y1:at,y2:g1}),T("circle",{className:`stat-point-active ${U.className}`,cx:U.x,cy:U.y,r:8})):null,T("g",{className:"stat-point-layer"},H)),U?T("div",{className:"codex-stats-tooltip active",style:w,"data-testid":"codex-stats-tooltip"},T("b",null,Pn(U.row?.date)),T("span",null,`${U.label} · ${U.valueLabel}`),T("code",null,`${bl(U.row?.executedTasks)} exec / ${bl(U.row?.retryAttempts)} retry / ${ar(U.row?.avgDurationMs??void 0)}`)):null,T("div",{className:"codex-stats-legend"},T("span",{className:"tasks"},"执行任务"),T("span",{className:"retry"},"重试次数"),T("span",{className:"duration"},"平均耗时")),T("div",{className:"codex-stats-scale"},T("span",null,Pn(r[0]?.date)),T("span",null,W.join(" · ")||"暂无峰值"),T("span",null,Pn(r.at(-1)?.date))),T("div",{className:`codex-stats-focus ${U?"active":""}`,"data-testid":"codex-stats-focus"},U?T(s1.default.Fragment,null,T("div",null,T("strong",null,Pn(U.row?.date)),T("span",null,`${U.label} · ${U.valueLabel}`)),T("div",{className:"codex-stats-focus-metrics"},T("code",null,`${bl(U.row?.executedTasks)} exec`),T("code",null,`${bl(U.row?.retryAttempts)} retry`),T("code",null,ar(U.row?.avgDurationMs??void 0)))):T("span",null,"将鼠标悬停到曲线数据点查看明细,点击数据点可固定。"))):T(pi,{title:"暂无统计",text:"任务开始执行后会生成按天汇总的曲线。"}),T("div",{className:"codex-stats-summary-grid"},T("article",null,T("span",null,"今日执行"),T("strong",null,String(bl(i.executedTasks))),T("code",null,Pn(i.date))),T("article",null,T("span",null,"今日重试"),T("strong",null,String(bl(i.retryAttempts))),T("code",null,`累计 ${bl(n.retryAttempts)}`)),T("article",null,T("span",null,"平均耗时"),T("strong",null,ar(n.avgDurationMs??void 0)),T("code",null,`${bl(n.durationSamples)} samples`))),T("div",{className:"codex-stats-daily-list","data-testid":"codex-stats-daily-list"},r.slice(-7).map((E)=>T("div",{key:String(E?.date||""),className:`codex-stats-daily-row ${N===String(E?.date||"")?"active":""}`,"data-testid":`codex-stats-day-${String(E?.date||"unknown")}`},T("span",null,Pn(E?.date)),T("b",null,`${bl(E?.executedTasks)} exec`),T("b",null,`${bl(E?.retryAttempts)} retry`),T("code",null,ar(E?.avgDurationMs??void 0))))))}function VO({task:u,queueRows:l,busy:f,onMove:r}){let n=String(u?.id||""),i=I1(u),[t,y]=gu(i);V0(()=>{y(i)},[n,i]);let c=!n||f||["running","judging","retry_wait"].includes(String(u?.status||""));return T("div",{className:"codex-task-move-control","data-testid":"codex-task-queue-move-control"},T("label",null,"任务 queue",T("select",{value:t,disabled:!n||f,onChange:($)=>y(String($.target.value||i)),"data-testid":"codex-task-queue-move-select"},l.map(($)=>T("option",{key:String($?.id||""),value:String($?.id||"")},k1($))))),T("button",{type:"button",className:"ghost-btn",disabled:c||t===i,onClick:()=>r(t),title:c?"运行中 / judging / retry_wait 的任务不能移动;请先打断或等当前 turn 结束":"移动已创建任务到另一个 queue","data-testid":"codex-task-queue-move-button"},"移动"))}function EQ(u,l=4){let f=(Array.isArray(u)?u:[]).map((n)=>String(n||"").trim()).filter(Boolean);if(f.length===0)return"--";let r=f.slice(0,l).join(" / ");return f.length>l?`${r} +${f.length-l}`:r}function DO({task:u,loading:l,onLoadPromptPart:f,testId:r="codex-initial-prompt-full",textTestId:n="codex-initial-prompt-full-text",baseTextTestId:i="codex-initial-prompt-base"}){let t=t2(u),y=o$(u),c=a$(u).trimEnd(),$=String(y.full?.text||""),A=fO(u),j=Number(t.promptChars||u?.promptChars||$.length),F=Number(t.basePromptLines||Vi(c)),J=Number(t.promptLines||Vi($));return T("section",{className:"codex-progressive-card codex-progressive-prompt","data-testid":"codex-progressive-prompt"},T("div",{className:"codex-progressive-card-head"},T("span",{className:"codex-output-channel"},"Prompt"),T("strong",null,"Submitted prompt / 原始用户 prompt"),T("code",null,`${F||Vi(c)} lines / ${c.length} chars`)),T("pre",{className:"codex-prompt-full","data-testid":i},c||"空 prompt"),A?T("details",{className:"codex-reference-injection codex-progressive-full-prompt","data-testid":r,onToggle:(Q)=>{if(Q.currentTarget?.open&&!$)f?.("full")}},T("summary",null,T("span",null,"引用注入已折叠,点击按需拉取最终进入 Code agent 的完整 prompt"),T("code",null,$?`${J||Vi($)} lines / ${$.length} chars`:`${Number.isFinite(j)&&j>0?j:"--"} chars`)),T("pre",{className:"codex-prompt-full codex-prompt-final-full","data-testid":n},$||(l?"正在按需拉取完整 prompt...":"展开后将只请求 full prompt,不拉取完整 transcript。"))):null)}function gQ({task:u,attempt:l,attemptIndex:f,loading:r,onLoadSteps:n,onLoadStep:i,testId:t="codex-execution-summary"}){let y=_O(hQ(u,f)),c=$O(oE(u,l)),$=l?kE(u,l):SQ(u),A=l2(u),j=u2(u,f),F=Mn($?.errorCount),J=Mn($?.stepCount??$?.llmStepCount),Q=Mn($?.readCount),W=Mn($?.editCount),L=Mn($?.runCount),U=Mn($?.stepCount??$?.llmStepCount),q=J===null?"--":String(J),N=U===null?"--":String(U),w=Array.isArray(c.editedFiles)?c.editedFiles:[],G=Array.isArray(c.commands)?c.commands:[],H=y2(l,f)?` · ${String(l?.label||"recovered thread execution")}`:f?` #${f}`:"",E=dE(u,l,f,c),V=`最近更新: ${HQ(E)}`,S=uO(u,l,f);return T("details",{className:`codex-progressive-card codex-execution-summary ${S?"running":""}`,"data-testid":t,"data-attempt-index":e$(f),"data-running":S?"true":"false",onToggle:(B)=>{if(B.currentTarget?.open&&!j)n?.(f)}},T("summary",null,T("div",{className:"codex-progressive-card-head"},T("span",{className:"codex-output-channel"},"Summary"),T("strong",null,`执行过程摘要${H}`),S?T("span",{className:"codex-summary-running-pill","data-testid":`${t}-running`},"执行中"):null,T("code",{title:E?`最近更新: ${wu(E)}`:V},`${ar(c.durationMs??c.totalElapsedMs)} / ${q} tools / ${V}`)),T("div",{className:"codex-execution-digest"},T("span",{title:"来自 OA Event Flow 统计中心"},`read ${Q===null?"--":Q}`),T("span",{title:"来自 OA Event Flow 统计中心"},`edit ${W===null?"--":W}`),T("span",{title:"来自 OA Event Flow 统计中心"},`run ${L===null?"--":L}`),T("span",{title:"来自 OA Event Flow 统计中心"},`STEP ${N}`),F!==null&&F>0?T("span",{className:"codex-execution-error-pill","data-testid":`${t}-error-count`},`Error ${F}`):null)),T("div",{className:"codex-execution-digest expanded"},T("span",null,`修改文件:${EQ(w,6)}`),T("span",null,`执行命令:${EQ(G,4)}`)),y.length===0?T("div",{className:"codex-output-empty"},r?"正在按需拉取步骤 summary...":"展开后将只请求执行步骤 summary,不拉取单步骤全量。"):T("div",{className:"codex-trace-step-list"},y.map((B)=>{let D=String(B?.seq??""),X=A[D],O=Array.isArray(B?.summaryLines)?B.summaryLines.slice(0,4):[],Y=O.find((p)=>String(p||"").trim().length>0);return T("details",{key:D||`${B?.title}-${B?.at}`,className:`codex-trace-step ${String(B?.kind||"message")} ${iO(B)?"error":""}`,"data-testid":`codex-trace-step-${D||"unknown"}`,onToggle:(p)=>{if(p.currentTarget?.open&&!X)i?.(B?.seq)}},T("summary",null,T("span",{className:"codex-output-channel"},pO(B?.kind)),T("strong",null,String(B?.title||"Trace step")),B?.status?T("code",null,String(B.status)):null,Y?T("span",{className:"codex-trace-step-inline-summary",title:String(Y)},String(Y)):null,T("time",null,wu(B?.at))),T("div",{className:"codex-trace-step-summary"},O.length>0?O.map((p,v)=>T("pre",{key:`${D}-${v}`},String(p||""))):T("span",null,"无 summary")),X?.line?T(x$,{items:[X.line],autoScroll:!1,loading:!1,hasDetail:!0,emptyText:"无步骤详情",testId:`codex-trace-step-detail-${D||"unknown"}`,className:"codex-transcript codex-step-detail-transcript",collapseTools:!1}):T("div",{className:"codex-output-empty"},r?"正在按需拉取这个步骤的全量数据...":"展开后将只请求这个单步骤的全量数据。"))})))}function pO(u){let l=String(u||"");if(l==="ran")return"Ran";if(l==="explored")return"Explored";if(l==="edited")return"Edited";if(l==="error")return"Error";if(l==="system")return"System";return"Message"}function sQ({task:u,attempt:l,attemptIndex:f,testId:r="codex-final-response"}){let n=eE(u,l);if(n.length===0)return null;let i=Number(l?.finalResponseChars||n.length),t=f?` #${f}`:"";return T("section",{className:"codex-progressive-card codex-final-response","data-testid":r,"data-attempt-index":e$(f)},T("div",{className:"codex-progressive-card-head"},T("span",{className:"codex-output-channel"},"Final"),T("strong",null,`最终 response${t}`),T("code",null,`${Number.isFinite(i)?i:n.length} chars`)),T(SJ,{markdown:n,className:"codex-transcript-body codex-markdown",testId:`${r}-markdown`}))}function aQ({task:u,attempt:l,attemptIndex:f,testId:r="codex-progressive-judge"}){let n=MQ(u,l);if(!n?.decision)return null;let i=f?` #${f}`:"";return T("section",{className:"codex-progressive-card codex-progressive-judge","data-testid":r,"data-attempt-index":e$(f)},T("div",{className:"codex-progressive-card-head"},T("span",{className:"codex-output-channel"},"Judge"),T("strong",null,`完成判定${i}`),T("code",null,`${n.decision} ${Math.round(Number(n.confidence||0)*100)}%`)),T("div",{className:"codex-judge-card","data-testid":`${r}-card`},T(Di,{status:n.decision},n.decision),T("strong",null,`${Math.round(Number(n.confidence||0)*100)}% confidence`),T("p",{"data-testid":`${r}-reason`},n.reason||"--"),T(CQ,{judge:n,testId:`${r}-failure-details`}),n.continuePrompt?T("pre",{"data-testid":`${r}-continue-prompt`},String(n.continuePrompt||"")):null))}function SO({task:u,attempt:l,attemptIndex:f,loading:r,onLoadPromptPart:n,testId:i="codex-judge-feedback-prompt"}){let t=lO(u,l,f);if(t===null)return null;let y=RQ(f),$=o$(u)[y],A=String($?.text||"").trimEnd(),j=String(t.preview||t.text||"").trimEnd(),F=A||String(t.text||"").trimEnd(),J=Number($?.chars||t.chars||F.length||j.length),Q=Number($?.lines||t.lines||Vi(F||j)),W=$?.forAttempt||t.forAttempt||Number(f||0)+1;return T("details",{className:"codex-progressive-card codex-judge-feedback-prompt","data-testid":i,"data-attempt-index":e$(f),onToggle:(L)=>{if(L.currentTarget?.open&&!A)n?.("feedback",f)}},T("summary",null,T("div",{className:"codex-progressive-card-head"},T("span",{className:"codex-output-channel"},"Prompt"),T("strong",null,`judge feedback prompt #${f} -> #${W}`),T("code",null,`${Q||"--"} lines / ${Number.isFinite(J)?J:j.length} chars`)),T("p",{className:"codex-feedback-preview","data-testid":`${i}-preview`},j||"展开后按需拉取 judge feedback prompt。")),T("pre",{className:"codex-prompt-full codex-feedback-full","data-testid":`${i}-text`},F||(r?"正在按需拉取 judge feedback prompt...":"展开后将只请求这一次 judge feedback prompt。")))}function XO({task:u,attempt:l,position:f,loading:r,onLoadPromptPart:n,onLoadSteps:i,onLoadStep:t}){let y=AO(l,f),c=f===0,$=y2(l,y),A=$?String(l?.label||"Recovered thread execution"):`Attempt ${y}`;return T("section",{className:"codex-attempt-cycle","data-testid":`codex-attempt-cycle-${y}`},T("div",{className:"codex-attempt-cycle-head"},T("span",{className:"codex-output-channel"},A),T("strong",null,String(l?.mode||(y<=1?"initial":"retry"))),l?.terminalStatus?T(Di,{status:l.terminalStatus},l.terminalStatus):null,T("code",null,`${wu(l?.startedAt)} -> ${wu(l?.finishedAt)}`)),T(gQ,{task:u,attempt:l,attemptIndex:y,loading:r,onLoadSteps:i,onLoadStep:t,testId:c?"codex-execution-summary":`codex-execution-summary-attempt-${y}`}),$?null:T(sQ,{task:u,attempt:l,attemptIndex:y,testId:c?"codex-final-response":`codex-final-response-attempt-${y}`}),$?null:T(aQ,{task:u,attempt:l,attemptIndex:y,testId:c?"codex-progressive-judge":`codex-progressive-judge-attempt-${y}`}),$?null:T(SO,{task:u,attempt:l,attemptIndex:y,loading:r,onLoadPromptPart:n,testId:c?"codex-judge-feedback-prompt":`codex-judge-feedback-prompt-attempt-${y}`}))}function YO({task:u,loading:l,onLoadPromptPart:f,onLoadSteps:r,onLoadStep:n}){if(!u)return T(pi,{title:"未选择任务",text:"从左侧队列选择任务,或提交新 Codex 任务。"});let i=aE(u);return T("div",{className:"codex-transcript codex-progressive-trace","data-testid":"codex-output"},l&&!Ur(u)?T("div",{className:"codex-output-empty"},"正在加载 Trace Summary..."):null,T(DO,{task:u,loading:l,onLoadPromptPart:f}),i.length>0?i.map((t,y)=>T(XO,{key:`${t?.index||y+1}-${t?.startedAt||y}`,task:u,attempt:t,position:y,loading:l,onLoadPromptPart:f,onLoadSteps:r,onLoadStep:n})):[T(gQ,{key:"execution",task:u,loading:l,onLoadSteps:r,onLoadStep:n}),T(sQ,{key:"final",task:u}),T(aQ,{key:"judge",task:u})])}function PO({task:u}){let l=ME(u);if(!u||l.length===0)return T(pi,{title:"暂无原始消息",text:"原始 Codex app-server 消息会保留在任务 JSON 中。"});return T("details",{className:"codex-raw-output"},T("summary",null,`原始 messages (${l.length})`),T("div",null,l.map((f)=>T("article",{key:`${f.seq}-${f.channel}`,className:`codex-output-line ${f.channel||"system"}`},T("div",{className:"codex-output-meta"},T("span",{className:"codex-output-channel"},JO(String(f.channel||"system"))),T("span",null,wu(f.at)),f.method?T("code",null,f.method):null),T("pre",null,String(f.text||""))))))}function CO({task:u}){let l=RE(u).slice().reverse();if(l.length===0)return T(pi,{title:"尚无 attempt",text:"任务开始运行后,这里会记录 Codex 终态、传输中断和 stderr tail。"});return T("div",{className:"table-wrap codex-attempt-table"},T("table",null,T("thead",null,T("tr",null,T("th",null,"#"),T("th",null,"模式"),T("th",null,"终态"),T("th",null,"传输"),T("th",null,"退出"),T("th",null,"完成时间"))),T("tbody",null,l.map((f)=>T("tr",{key:`${f.index}-${f.startedAt}`},T("td",null,f.index),T("td",null,f.mode),T("td",null,T(Di,{status:f.terminalStatus||"unknown"},f.terminalStatus||"unknown")),T("td",null,f.transportClosedBeforeTerminal?T(Di,{status:"failed"},"closed-before-terminal"):T(Di,{status:"succeeded"},"normal")),T("td",null,`code=${f.appServerExitCode??"--"} signal=${f.appServerSignal??"--"}`),T("td",null,wu(f.finishedAt)))))))}function oQ({microservices:u,onRaw:l,apiBaseUrl:f="/api",initialTasksData:r=null,standalone:n=!1}){let i=u.find((m)=>m.id==="code-queue")||null,t=GQ(r),y=String(t?.id||""),c=new Map;if(t!==null&&y.length>0)c.set(y,{task:t,maxSeq:g$(Array.isArray(t.transcript)?t.transcript:[]),complete:Boolean(t._transcriptComplete),completeUpdatedAt:t._transcriptComplete?String(t.updatedAt||""):""});let $=typeof performance>"u"?0:performance.now(),A=Sl(y),j=Sl(0),F=Sl(0),J=Sl(0),Q=Sl(!1),W=Sl(!1),L=Sl(!1),U=Sl(null),q=Sl(new Map),N=Sl(new Map),w=Sl(new Map),G=Sl(new Map),Z=Sl(new Set),H=Sl(null),E=Sl(null),V=Sl(!1),S=Sl(!1),B=Sl(Boolean(r)),D=Sl(new Map),X=Sl(new Set),O=Sl(c),Y=Sl(r),[p,v]=gu(null),[z,P]=gu(r),[k,I]=gu(y),[b,d]=gu(t),[g,x]=gu(!1),[lu,cu]=gu(""),[_u,Fu]=gu(null),[zu,Wu]=gu(!1),[C,e]=gu(!1),uu=r?.queue||{},Gu=String(uu?.mainProviderId||uu?.defaultProviderId||"D601").trim()||"D601",[s,qu]=gu(""),[Zu,Bu]=gu(""),[Iu,ll]=gu("default"),[Pu,Jl]=gu(p0),[Jf,Of]=gu(!1),[yf,lf]=gu(""),[Zf,Pf]=gu(Gu),[Au,au]=gu("default"),[Qf,Yu]=gu("gpt-5.5"),[cf,_f]=gu(s$(uu,"default",Gu)||"/workspace"),[fr,$f]=gu(99),[Hf,Gn]=gu(1),[rr,dn]=gu(!1),[Ql,ei]=gu(!1),[fu,mu]=gu(""),[Xu,ou]=gu(""),[$l,Rl]=gu(""),[_l,Nf]=gu(!0),[Xr,my]=gu(()=>typeof window>"u"?!0:window.matchMedia(HE).matches),[Zl,ec]=gu(!1),[vA,Tl]=gu(""),[L7,sl]=gu(""),{addNotification:nr}=pf(),[ut,Vy]=gu(""),[lt,u_]=gu(""),[Dy,l_]=gu(!1),[Cf,Yr]=gu(r?{phase:"complete",taskId:y,queueMs:0,detailMs:0,totalMs:$,chunks:t?1:0,transcriptRows:Array.isArray(t?.transcript)?t.transcript.length:0,partial:Boolean(r?.selected?.hasMore||b1(t)),completedAt:new Date}:null),[f_,ft]=gu(r?new Date:null),[py,r_]=gu(!1),fn=l0(Ml(z)),n_=fn.filter(Cn),Pl=z?.queue||p?.body?.queue||p?.queue||{},kA=wO(z,Pl),i_=B0(z),Wr=FQ(Pl,Iu),ri=String(Iu||"default").trim()||"default",ni=Wr.filter((m)=>String(m?.id||"")!==ri),rt=ot(Wr,Pu),ii=Number((gf(Pu)?Pl?.total:rt?.total)??i_.total??fn.length),Sy=v1(Pl),T7=gf(Pu)?Sy:[String(ot(Wr,Pu)?.activeTaskId||"")].filter(Boolean),nt=UQ(Pl,Wr,Pu,fn),K7=gf(Pu)?v4(Pl):v4(rt||{}),Xy=v4(Pl),IA=NO(Xy),t_=Math.max(qO(Xy),Sy.length),gA=bl((gf(Pu)?Pl?.unreadTerminal:rt?.unreadTerminal)??n_.length),en=z?n_.length:gA,u0=gf(Pu)?"All queues":d4(rt||{id:Pu,name:Pu}),ti=o4(lu),Mf=ti.length>0,Yy=Mf?l0(Ml(_u)):[],sA=B0(_u),rn=Mf?Yy:fn,G7=rn.filter(Cn),eL=rn.filter((m)=>!sr(m)).sort(EE),uT=rn.filter((m)=>sr(m)&&!Cn(m)),z7=Mf?sA:i_,it=Mf?Number(sA.total??Yy.length):ii,E7=z7.hasMore===!0&&String(z7.nextBeforeId||"").length>0,aA=Mf?C:py,lT=i?KE(i):{},fT=i?GE(i):{},oA=$Q(()=>hE(s),[s]),zn=$Q(()=>{let m=NQ(Hf);return oA.flatMap((M)=>Array.from({length:m},()=>xE(M,Zu)))},[oA,Hf,Zu]),Py=zn.length,O7=Py>1&&!rr,rT=Ql||Zl||Py===0||O7,Z7=zO(Pl,Qf),y_=EO(Pl,Zf),H7=OO(Pl,Au),nT=s$(Pl,Au,Zf),dA=b?.id&&b?.activeTurnId&&String(b?.status)==="running",iT=b?.id&&!["succeeded","failed","canceled"].includes(String(b?.status||"")),tT=b?.id&&["succeeded","failed","canceled"].includes(String(b?.status||"")),tt=b?.id&&vQ(b);function Rf(m){let M=typeof m==="function"?m(Y.current):m;return Y.current=M,P(M),M}function yT(m,M,a=!0){let nu=Array.from(new Set(m.map((ju)=>String(ju||"")).filter(Boolean)));for(let ju of nu)if(D.current.set(ju,M),a)X.current.add(ju);return nu}function B7(m){for(let M of m.map((a)=>String(a||"")).filter(Boolean))D.current.delete(M),X.current.delete(M)}function c_(m){let M=String(m?.id||""),a=M?D.current.get(M):void 0;if(!a)return m;if(String(m?.status||"").length>0&&!sr(m))return D.current.delete(M),X.current.delete(M),m;return{...m,readAt:m?.readAt||a,terminalUnread:!1}}function eA(m){let M=String(m?.id||"");return M.length>0&&X.current.has(M)&&sr(m)}function l0(m,M=!0){let a=[];for(let nu of Array.isArray(m)?m:[]){let ju=c_(nu);if(M&&eA(ju))continue;a.push(ju)}return a}function cT(m,M=!0){if(!m||!Array.isArray(m?.tasks))return m;let a=l0(Ml(m),M),nu=B0(m);return{...m,tasks:a,pagination:m.pagination?{...nu,returned:a.length}:m.pagination}}function _T(m){let M=String(m||Pl?.mainProviderId||"D601").trim()||"D601";Pf(M),_f(s$(Pl,Au,M))}function $T(m){let M=String(m||"default").trim()||"default",a=Zf;if(M==="windows-native"){if(!y_.find((ju)=>ju.id===Zf)?.supportsWindowsNativeCodex)a=String(y_.find((ju)=>ju.supportsWindowsNativeCodex)?.id||Zf||"D601"),Pf(a)}au(M),_f(s$(Pl,M,a))}function __(m,M,a=null,nu=null){let ju=new Set(yT(m,M));if(ju.size===0&&nu===null&&a===null)return;Rf((Lu)=>{if(!Lu)return Lu;let Tu=Ml(Lu).flatMap((hu)=>{let xu=String(hu?.id||"");if(!ju.has(xu)){let tl=c_(hu);return eA(tl)?[]:[tl]}let Mu=nu&&String(nu?.id||"")===xu?nu:{},vu={...hu,...Mu,readAt:M,terminalUnread:!1};return eA(vu)?[]:[vu]});return{...Lu,queue:a||Lu.queue,tasks:ju.size>0?m0([Tu],nt):Tu}});for(let Lu of ju){let Tu=O.current.get(Lu);if(Tu?.task){let hu=nu&&String(nu?.id||"")===Lu?nu:{},xu={...Tu.task,...hu,readAt:M,terminalUnread:!1};if(O.current.set(Lu,{...Tu,task:xu}),A.current===Lu)d(xu)}}}V0(()=>{dn(!1)},[s,Hf,Zu]),V0(()=>{let m=o4(lu);F.current+=1;let M=F.current;if(!i||m.length===0){Fu(null),Wu(!1),e(!1),L.current=!1;return}Wu(!0),Fu(null);let a=window.setTimeout(()=>{(async()=>{try{let nu=await JQ(f,Pu,m);if(M!==F.current)return;Fu(cT(nu))}catch(nu){if(M===F.current)Fu(null),Tl(tf(nu,"搜索 Codex tasks 失败"))}finally{if(M===F.current)Wu(!1)}})()},240);return()=>window.clearTimeout(a)},[i?.id,f,Pu,lu]),V0(()=>{ou(b?a$(b):""),Rl(Array.isArray(b?.referenceTaskIds)?b.referenceTaskIds.join(" "):"")},[k]);function Pr(m,M,a){let nu=O.current.get(m)||{},ju=nu.task||{},Lu=Array.isArray(ju.transcript)?ju.transcript:[],Tu=KQ(ju,M),hu=Object.prototype.hasOwnProperty.call(M,"transcript")?g4(Lu,Array.isArray(M.transcript)?M.transcript:[]):Lu,xu={...ju,...Tu,transcript:hu,output:Array.isArray(Tu.output)?r2(ju,Tu,"output"):Array.isArray(ju.output)?ju.output:[],events:Array.isArray(Tu.events)?r2(ju,Tu,"events"):Array.isArray(ju.events)?ju.events:[]},Mu=c_(xu),vu=String(Mu?.updatedAt||""),tl=Boolean(M._transcriptComplete)&&sr(Mu),al=Boolean(nu.complete)&&sr(Mu)&&String(nu.completeUpdatedAt||"")===vu,ul=tl||al,ff={...nu,task:Mu,maxSeq:g$(hu),complete:ul,completeUpdatedAt:ul?vu:""};if(O.current.set(m,ff),a===J.current&&A.current===m)d(Mu);return ff}async function yi(m,M=!1,a,nu){if(!i||!m)return;let Lu=O.current.get(m)?.task;if(!M&&k$(Lu))return;let Tu=m,hu=q.current.get(Tu);if(hu){if(M||!k$(Lu))hu.refreshAfter=!0;return hu.promise}let xu=J.current,Mu=performance.now();if(A.current===m)x(!0);let vu={promise:Promise.resolve(),refreshAfter:!1},tl=(async()=>{try{let al=await pE(f,m);if(xu!==J.current||A.current!==m)return;let ul=al?.summary||{},ff=String(ul.updatedAt||"");Pr(m,{id:m,status:ul.status,updatedAt:ff,startedAt:ul.startedAt,finishedAt:ul.finishedAt,currentAttempt:ul.currentAttempt,maxAttempts:ul.maxAttempts,finalResponse:ul.finalResponse,lastJudge:ul.lastJudge,lastError:ul.lastError,attempts:Array.isArray(ul.attempts)?ul.attempts:[],stepCount:ul.stepCount,llmStepCount:ul.llmStepCount,traceStats:ul.traceStats,statsSource:ul.statsSource,timing:ul.timing,_traceSummary:ul,_traceSummaryLoaded:!0,_traceSummaryUpdatedAt:ff,_detailLoaded:!0},xu),Yr({phase:"complete",taskId:m,queueMs:nu??0,detailMs:performance.now()-Mu,totalMs:a===void 0?performance.now()-Mu:performance.now()-a,chunks:1,transcriptRows:Number(ul?.execution?.traceLineCount||ul?.execution?.stepCount||0),partial:!1,completedAt:new Date})}finally{let al=Boolean(vu.refreshAfter&&A.current===m&&!k$(O.current.get(m)?.task));if(q.current.delete(Tu),xu===J.current&&A.current===m)x(!1);if(al)window.setTimeout(()=>{yi(m,!0).catch((ul)=>Tl(tf(ul,"自动刷新 Trace Summary 失败")))},0)}})();vu.promise=tl,q.current.set(Tu,vu),await tl}async function AT(m,M=null){let a=A.current;if(!i||!a||!m)return;let nu=O.current.get(a)?.task,ju=o$(nu),Lu=m==="feedback"||m==="judge-feedback"?RQ(M):m;if(ju[Lu]?.text)return;let Tu=`${a}:${Lu}`,hu=N.current.get(Tu);if(hu)return hu;let xu=J.current;if(A.current===a)x(!0);let Mu=(async()=>{try{let vu=await SE(f,a,m,M);if(xu!==J.current||A.current!==a)return;let tl=O.current.get(a)?.task,al=o$(tl);Pr(a,{...m==="full"?{prompt:String(vu?.text||""),promptChars:Number(vu?.chars||0)}:{},_promptDetails:{...al,[Lu]:vu}},xu)}finally{if(N.current.delete(Tu),xu===J.current&&A.current===a)x(!1)}})();N.current.set(Tu,Mu),await Mu}async function u6(m=null,M={}){let a=A.current;if(!i||!a)return;let nu=O.current.get(a)?.task,ju=m===null||m===void 0||String(m).length===0?"":String(m),Lu=u2(nu,ju||null),Tu=Boolean(M.force),hu=Boolean(M.incremental);if(Lu&&!Tu)return;let xu=hQ(nu,ju||null),Mu=hu&&xu.length>0?rO(xu):0,vu=`${a}:${ju||"all"}:${Mu}`,tl=w.current.get(vu);if(tl)return tl;let al=J.current;if(A.current===a)x(!0);let ul=(async()=>{try{let ff=await XE(f,a,Mu,500,ju||null);if(al!==J.current||A.current!==a)return;let nn=Array.isArray(ff?.steps)?ff.steps:[],En=Mu>0?nO(xu,nn):nn;if(ju){let f0=O.current.get(a)?.task,yt=Wl(f0?._traceStepsByAttempt)||{},Cr=Wl(f0?._traceStepsLoadedByAttempt)||{},Lr=Wl(f0?._traceStepsNextAfterSeqByAttempt)||{};Pr(a,{_traceStepsByAttempt:{...yt,[ju]:En},_traceStepsLoadedByAttempt:{...Cr,[ju]:!0},_traceStepsNextAfterSeqByAttempt:{...Lr,[ju]:ff?.nextAfterSeq}},al)}else Pr(a,{_traceSteps:En,_traceStepsLoaded:!0,_traceStepsHasMore:Boolean(ff?.hasMore),_traceStepsNextAfterSeq:ff?.nextAfterSeq},al)}finally{if(w.current.delete(vu),al===J.current&&A.current===a)x(!1)}})();w.current.set(vu,ul),await ul}async function jT(m){let M=A.current,a=String(m??"");if(!i||!M||a.length===0)return;let nu=O.current.get(M)?.task;if(l2(nu)[a]?.line)return;let Lu=`${M}:${a}`,Tu=G.current.get(Lu);if(Tu)return Tu;let hu=J.current;if(A.current===M)x(!0);let xu=(async()=>{try{let Mu=await YE(f,M,m);if(hu!==J.current||A.current!==M)return;let vu=O.current.get(M)?.task,tl=l2(vu);Pr(M,{_traceStepDetails:{...tl,[a]:Mu}},hu)}finally{if(G.current.delete(Lu),hu===J.current&&A.current===M)x(!1)}})();G.current.set(Lu,xu),await xu}function FT(m){if(A.current!==m)return;let M=O.current.get(m)?.task;if(!M)return;if(u2(M,null))u6(null,{force:!0,incremental:!0}).catch((nu)=>Tl(tf(nu,"增量刷新 Trace Steps 失败")));let a=Wl(M?._traceStepsLoadedByAttempt)||{};for(let nu of Object.keys(a).filter((ju)=>a[ju]))u6(nu,{force:!0,incremental:!0}).catch((ju)=>Tl(tf(ju,"增量刷新 Attempt Trace Steps 失败")))}async function VY(m,M,a){if(!i||!m)return;let nu=performance.now(),ju=J.current,Lu=O.current.get(m);if(Lu?.task){if(d(Lu.task),x(b1(Lu.task)||!Lu.complete),!b1(Lu.task)&&Lu.complete&&sr(Lu.task)&&String(Lu.completeUpdatedAt||"")===String(Lu.task?.updatedAt||"")){Yr({phase:"complete",taskId:m,queueMs:a??0,detailMs:0,totalMs:M===void 0?0:performance.now()-M,chunks:0,transcriptRows:Array.isArray(Lu.task.transcript)?Lu.task.transcript.length:0,completedAt:new Date});return}}else x(!0);let Tu=U.current;if(Tu?.taskId===m&&Tu.token===ju)return Tu.promise;let hu=(async()=>{try{let xu=await vl(kl(f,`/api/tasks/${encodeURIComponent(m)}?meta=1`));if(ju!==J.current||A.current!==m)return;let Mu=O.current.get(m),vu=Array.isArray(Mu?.task?.transcript)?Mu.task.transcript:[],tl=xu?.task||{},al=Boolean(Mu?.complete)&&String(Mu?.completeUpdatedAt||"")===String(tl?.updatedAt||"");Pr(m,{...tl,summaryOnly:!1,_metaLoaded:!0,transcript:vu,_detailLoaded:vu.length>0,_transcriptComplete:al},ju);let ul=b1(Mu?.task)||Boolean(Mu?.task?._transcriptPreview),ff=ul?0:vu.length>0?zQ(vu):0,nn=!ul&&Mu?.complete&&sr(tl)&&String(Mu?.completeUpdatedAt||"")===String(tl?.updatedAt||"")?g$(vu):ff,En=!0,f0=0,yt=vu.length;while(En){let Cr=await vl(kl(f,`/api/tasks/${encodeURIComponent(m)}/transcript?afterSeq=${encodeURIComponent(String(nn))}&limit=${WE}&fullText=1`));if(ju!==J.current||A.current!==m)return;let Lr=O.current.get(m),ct=Array.isArray(Lr?.task?.transcript)?Lr.task.transcript:[],ci=g4(ct,Array.isArray(Cr?.transcript)?Cr.transcript:[]);f0+=1,yt=ci.length;let Dl=Boolean(!Cr?.hasMore);if(Pr(m,{status:Cr?.status||tl.status,updatedAt:Cr?.updatedAt||tl.updatedAt,transcript:ci,_detailLoaded:Dl||ci.length>0,_transcriptComplete:Dl,_transcriptPreview:ul&&!Dl},ju),En=Boolean(Cr?.hasMore),nn=Number(Cr?.nextAfterSeq??g$(ci)),!En)break;await new Promise((C7)=>window.setTimeout(C7,0))}Yr({phase:"complete",taskId:m,queueMs:a??0,detailMs:performance.now()-nu,totalMs:M===void 0?performance.now()-nu:performance.now()-M,chunks:f0,transcriptRows:yt,completedAt:new Date})}finally{if(U.current?.taskId===m&&U.current?.token===ju)U.current=null;if(ju===J.current&&A.current===m)x(!1)}})();U.current={taskId:m,token:ju,promise:hu},await hu}async function hf(m=A.current,M=!0,a=Pu){if(!i)return;if(!M&&S.current)return;let nu=performance.now();if(M)S.current=!0;if(M)Yr({phase:"loading",taskId:String(m||A.current||""),startedAt:new Date});let ju=j.current+1;j.current=ju;let Lu=String(m||A.current||""),Tu=Lu?O.current.get(Lu):null,hu=Array.isArray(Tu?.task?.transcript)?Tu.task.transcript:[],xu=zQ(hu),Mu=null,vu=M&&Lu.length===0;if(Mu=vu?await JQ(f,a,""):await b4(f,Lu,xu,a,"",!0,{stats:!1}),ju!==j.current){if(M)S.current=!1;return}let tl=performance.now()-nu;v(p||{});let al=Mu?.queue||{},ul=String(al?.activeTaskId||v1(al)[0]||""),ff=Mu;Rf((hl)=>{let r0=Ml(Mu),tr=Ml(hl),Tr=tr.length>0?m0([tr,r0],ul):m0([r0],ul),n0=l0(Tr),$_=B0(Mu),_i=B0(hl),i6=tr.length>r0.length&&(_i.hasMore===!1||String(_i.nextBeforeId||"").length>0),RT={...$_,...i6?{hasMore:_i.hasMore,nextBeforeId:_i.nextBeforeId}:{},returned:n0.length};return ff={...Mu,tasks:n0,pagination:RT},ff});let nn=Ml(ff),En=FQ(al,Iu),f0=UQ(al,En,a,nn),yt=DE(En,a,nn),Cr=Lu||A.current,Lr=ff?.selected||null,ct=Lr?.task||null,ci=Array.isArray(Lr?.transcript)?Lr.transcript:null,Dl=Cr||f0||yt||nn[0]?.id||"";if(A.current!==Dl)J.current+=1;A.current=Dl,I(Dl);let _t=nn.find((hl)=>hl.id===Dl);if(_t){let hl=O.current.get(Dl);if(hl?.task)O.current.set(Dl,{...hl,task:{..._t,...hl.task,status:_t.status,updatedAt:_t.updatedAt}})}if(vu&&_t){if(Pr(Dl,{..._t,_summaryLoaded:!1,transcript:[],_detailLoaded:!1,_transcriptComplete:!1,_transcriptPreview:!0},J.current),x(!0),Yr({phase:"complete",taskId:Dl,queueMs:tl,detailMs:0,totalMs:performance.now()-nu,chunks:0,transcriptRows:0,partial:!0,completedAt:new Date}),ft(new Date),M)S.current=!1;yi(Dl,!0).catch((hl)=>Tl(tf(hl,"加载 Codex Trace Summary 失败"))),b4(f,Dl,0,a,"",!1).then((hl)=>{if(ju!==j.current)return;let r0=Ml(hl),tr=GQ(hl);if(r0.length>0)Rf((Tr)=>{let n0=m0([Ml(Tr),r0],ul);return{...Tr,statistics:hl?.statistics||Tr?.statistics,tasks:l0(n0)}});if(tr?.id===A.current){let Tr=Array.isArray(tr.transcript)?tr.transcript:[];Pr(tr.id,{...tr,transcript:Tr,_summaryLoaded:!0,_detailLoaded:Tr.length>0,_transcriptPreview:Boolean(hl?.selected?.preview)},J.current)}}).catch(()=>{});return}if(ct?.id===Dl&&ci!==null){let hl=O.current.get(Dl),r0=Array.isArray(hl?.task?.transcript)?hl.task.transcript:[],tr=g4(r0,ci),Tr=Boolean(Lr?.preview);if(Pr(Dl,{...ct,_summaryLoaded:!0,transcript:tr,_detailLoaded:!Lr?.hasMore||tr.length>0,_transcriptComplete:!Tr&&!Lr?.hasMore&&sr(ct),_transcriptPreview:Tr},J.current),x(!1),M)Yr({phase:"complete",taskId:Dl,queueMs:tl,detailMs:Math.max(0,performance.now()-nu-tl),totalMs:performance.now()-nu,chunks:1,transcriptRows:tr.length,partial:Boolean(Tr||Lr?.hasMore||b1(ct)),completedAt:new Date});if(ft(new Date),M)S.current=!1;yi(Dl,!1,M?nu:void 0,M?tl:void 0).catch((n0)=>Tl(tf(n0,"加载 Codex Trace Summary 失败"))),b4(f,Lu,xu,a,"",!1).then((n0)=>{if(ju!==j.current)return;let $_=Ml(n0);if($_.length>0)Rf((_i)=>{let i6=m0([Ml(_i),$_],ul);return{..._i,tasks:l0(i6)}})}).catch(()=>{});return}if(M)Yr({phase:"session",taskId:Dl,queueMs:tl,totalMs:tl,startedAt:new Date(Date.now()-tl)});if(Dl)yi(Dl,!0,M?nu:void 0,M?tl:void 0).catch((hl)=>Tl(tf(hl,"加载 Codex Trace Summary 失败")));else if(J.current+=1,d(null),x(!1),M)Yr({phase:"complete",taskId:"",queueMs:tl,detailMs:0,totalMs:performance.now()-nu,chunks:0,transcriptRows:0,completedAt:new Date});if(ft(new Date),M)S.current=!1}async function m7(){if(Mf){if(!i||C||L.current)return;let M=String(sA.nextBeforeId||"");if(!M)return;L.current=!0,e(!0),Tl("");try{let a=await QQ(f,Pu,M,ZQ,ti),nu=Ml(a),ju=a?.queue||Pl||{},Lu=String(ju?.activeTaskId||v1(ju)[0]||nt||"");Fu((Tu)=>{let hu=l0(m0([Ml(Tu),nu],Lu)),xu=B0(a);return{...Tu||{},queue:ju,tasks:hu,pagination:{...xu,returned:hu.length}}})}catch(a){Tl(tf(a,"加载更多搜索结果失败"))}finally{L.current=!1,e(!1)}return}if(!i||py||W.current)return;let m=String(B0(z).nextBeforeId||"");if(!m)return;W.current=!0,r_(!0),Tl("");try{let M=await QQ(f,Pu,m),a=Ml(M),nu=M?.queue||Pl||{},ju=String(nu?.activeTaskId||v1(nu)[0]||nt||"");Rf((Lu)=>{let Tu=l0(m0([Ml(Lu),a],ju)),hu=B0(M);return{...Lu||{},queue:nu,statistics:M?.statistics||Lu?.statistics,tasks:Tu,pagination:{...hu,returned:Tu.length}}})}catch(M){Tl(tf(M,"加载更早 Codex tasks 失败"))}finally{W.current=!1,r_(!1)}}function UT(m){let M=m.currentTarget;if(!M||aA||!E7)return;if(M.scrollHeight-M.scrollTop-M.clientHeight<120)m7()}async function ir(m,M){ec(!0),Tl("");try{await m()}catch(a){Tl(tf(a,M))}finally{ec(!1)}}async function l6(m){if(!m)return;try{let M=!1;try{if(navigator.clipboard?.writeText)await navigator.clipboard.writeText(m),M=!0}catch{M=!1}if(!M){let nu=document.createElement("textarea");nu.value=m,nu.style.position="fixed",nu.style.opacity="0",document.body.appendChild(nu),nu.select(),M=document.execCommand("copy"),document.body.removeChild(nu)}if(!M)throw Error("browser clipboard rejected the copy request");Vy(m);let a=`已复制任务 ID:${m}`;sl(a),nr("success",a),window.setTimeout(()=>Vy((nu)=>nu===m?"":nu),1600)}catch(M){Tl(`复制任务 ID 失败:${tf(M)}`)}}function f6(m){if(!m)return;Bu(m);let M=`已引用任务 ID:${m};提交时后端会读取并注入该任务上下文`;sl(M),nr("success",M)}async function r6(m){if(!i||!m)return;let M=new Date().toISOString();j.current+=1,__([m],M,null,{id:m,readAt:M,terminalUnread:!1}),u_(m);let a=!1;if(await ir(async()=>{let nu=await PE(f,m),ju=nu?.task||{id:m,readAt:new Date().toISOString(),terminalUnread:!1},Lu=String(ju?.readAt||new Date().toISOString());__([m],Lu,nu?.queue||null,ju),a=!0;let Tu=`已将任务 ${m} 标为已读`;sl(Tu),nr("success",Tu)},"标记 Codex task 已读失败"),!a)B7([m]),hf(A.current,!1).catch((nu)=>Tl(tf(nu,"刷新 Codex tasks 失败")));u_((nu)=>nu===m?"":nu)}async function JT(){if(!i||Dy)return;l_(!0);let m=new Date().toISOString(),M=Array.from(new Set([...Ml(Y.current).filter(Cn).map((nu)=>String(nu?.id||"")).filter(Boolean),...Array.from(O.current.entries()).filter(([,nu])=>Cn(nu?.task)).map(([nu])=>nu)]));if(j.current+=1,M.length>0)__(M,m);let a=!1;if(await ir(async()=>{let nu=await CE(f),ju=String(nu?.readAt||new Date().toISOString()),Lu=Ml(Y.current).filter(Cn).map((vu)=>String(vu?.id||"")).filter(Boolean),Tu=Array.from(O.current.entries()).filter(([,vu])=>Cn(vu?.task)).map(([vu])=>vu),hu=Array.from(new Set([...M,...Lu,...Tu]));__(hu,ju,nu?.queue||null);let xu=Number(nu?.count||hu.length);a=!0;let Mu=`已将 ${xu} 个已结束未读任务标为已读`;sl(Mu),nr("success",Mu)},"全部标为已读失败"),!a&&M.length>0)B7(M),hf(A.current,!1).catch((nu)=>Tl(tf(nu,"刷新 Codex tasks 失败")));l_(!1)}function QT(m){let M=m||p0;if(Jl(M),!gf(M))ll(M);if(Rf(null),!(gf(M)?A.current:""))A.current="",J.current+=1,I(""),d(null),x(!0)}async function NT(){let m=typeof window>"u"?"":window.prompt("输入新的 Codex queue ID(字母/数字/._-,最长 64)","new-lane"),M=String(m||"").trim();if(!M)return;await ir(async()=>{let a=await vl(kl(f,"/api/queues"),{method:"POST",body:{queueId:M}}),nu=String(a?.queue?.id||M);ll(nu),Jl(nu),Rf(null),A.current="",J.current+=1,I(""),d(null);let ju=`已创建并切换到 queue:${nu}`;sl(ju),nr("success",ju),await hf("",!0,nu)},"创建 Codex queue 失败")}async function qT(){let m=String(Iu||"default").trim()||"default",M=ot(Wr,m)||{id:m,name:m},a=typeof window>"u"?null:window.prompt(`输入 queue 显示名称(ID 不变:${m};留空恢复为 ID)`,VQ(M));if(a===null)return;await ir(async()=>{let nu=await vl(kl(f,`/api/queues/${encodeURIComponent(m)}`),{method:"PATCH",body:{name:String(a)}}),ju=nu?.queue||{id:m,name:String(a||m)};if(nu?.summary)Rf((Tu)=>Tu?{...Tu,queue:nu.summary}:Tu);let Lu=`已更新 queue 名称:${d4(ju)}`;sl(Lu),nr("success",Lu),await hf(A.current,!0,Pu)},"修改 Codex queue 名称失败")}function wT(){if(ni.length===0){sl("没有可合并的其他 queue;请先创建或选择另一个 queue。");return}let m=ni.some((M)=>String(M?.id||"")===yf)?yf:"";lf(m),Of(!0)}async function WT(){let m=ri;if(ni.length===0){sl("没有可合并的其他 queue;请先创建或选择另一个 queue。");return}let a=String(yf||""||"").trim();if(!a){sl("请先选择要合并的源 queue。");return}if(a===m){Tl("源 queue 和目标 queue 不能相同。");return}await ir(async()=>{let nu=await vl(kl(f,`/api/queues/${encodeURIComponent(m)}/merge`),{method:"POST",body:{sourceQueueId:a}});if(nu?.summary)Rf((Tu)=>Tu?{...Tu,queue:nu.summary}:Tu);ll(m),Jl(m),Rf(null);let ju=Number(nu?.mergedTaskCount||0),Lu=`已将 queue=${a} 合并到 ${m},移动 ${ju} 个任务;源 queue 已自动删除。`;sl(Lu),nr("success",Lu),Of(!1),lf(""),await hf(A.current,!0,m)},"合并 Codex queue 失败")}async function LT(m){if(m.preventDefault(),Q.current){sl("任务正在提交中,请等待当前请求完成,已阻止重复提交。");return}if(zn.length>1&&!rr){Tl(`检测到将创建 ${zn.length} 个任务;请先勾选“确认批量入队”,避免误传多个任务。`);return}Q.current=!0,ei(!0),sl("正在提交 Code Queue 任务,请等待后端确认,输入已临时锁定。"),await ir(async()=>{if(zn.length===0)throw Error("prompt 不能为空");let M=Bi(Zu),a=Iu.trim()||"default",nu=[...zn],ju=(vu)=>({prompt:vu,queueId:a,providerId:Zf,executionMode:Au,model:Qf,cwd:cf,maxAttempts:Number(fr),...M.length>0?{referenceTaskIds:M}:{}}),Lu=nu.length===1?ju(nu[0]):{tasks:nu.map(ju)},Tu=await vl(kl(f,nu.length===1?"/api/tasks":"/api/tasks/batch"),{method:"POST",body:Lu}),hu=Tu?.tasks?.[0]?.id||"",xu=Array.isArray(Tu?.tasks)?Tu.tasks.map((vu)=>String(vu?.id||"")).filter(Boolean):[],Mu=`已创建 ${xu.length||nu.length} 个任务${xu.length>0?`:${xu.join(" / ")}`:""}`;if(sl(Mu),nr("success",Mu),qu(""),Bu(""),dn(!1),A.current=hu,Pu!==a)Rf(null);ll(a),await hf(hu,!0,a)},"Codex 任务入队失败"),Q.current=!1,ei(!1)}async function TT(m){if(m.preventDefault(),!b?.id)return;await ir(async()=>{await vl(kl(f,`/api/tasks/${encodeURIComponent(b.id)}/steer`),{method:"POST",body:{prompt:fu}}),mu(""),await hf(b.id)},"追加 prompt 失败")}async function KT(m){m.preventDefault();let M=String(b?.id||"");if(!M||!tt)return;await ir(async()=>{let a=Bi($l),nu=await vl(kl(f,`/api/tasks/${encodeURIComponent(M)}/edit`),{method:"POST",body:{prompt:Xu,referenceTaskIds:a}}),ju={...nu?.task||b||{},_traceSummary:null,_traceSummaryLoaded:!1,_traceSummaryUpdatedAt:"",_promptDetails:{},_traceSteps:[],_traceStepsLoaded:!1,_traceStepsByAttempt:{},_traceStepsLoadedByAttempt:{},_traceStepsNextAfterSeqByAttempt:{},_traceStepDetails:{}};O.current.set(M,{...O.current.get(M)||{},task:ju,complete:!1,completeUpdatedAt:""}),A.current=M,d(ju),I(M),ou(a$(ju)),Rl(Array.isArray(ju?.referenceTaskIds)?ju.referenceTaskIds.join(" "):""),Rf((Tu)=>{if(!Tu)return Tu;let hu=Ml(Tu).map((xu)=>String(xu?.id||"")===M?{...xu,...ju}:xu);return{...Tu,queue:nu?.queue||Tu.queue,tasks:m0([hu],nt)}});let Lu=nu?.changed===!1?`任务 ${M} 的 prompt 未变化`:`已更新 queued 任务 ${M} 的用户 prompt`;sl(Lu),nr("success",Lu),await hf(M,!0,Pu)},"编辑 queued 任务 prompt 失败")}async function GT(){if(!b?.id)return;await ir(async()=>{await vl(kl(f,`/api/tasks/${encodeURIComponent(b.id)}/interrupt`),{method:"POST",body:{}}),await hf(b.id)},"打断 Codex session 失败")}async function zT(){if(!b?.id)return;await ir(async()=>{await vl(kl(f,`/api/tasks/${encodeURIComponent(b.id)}/retry`),{method:"POST",body:{}}),await hf(b.id)},"重新入队失败")}async function ET(m){let M=String(b?.id||""),a=String(m||"").trim();if(!M||!a)return;let nu=I1(b);if(a===nu){sl(`任务 ${M} 已在 queue=${a}`);return}await ir(async()=>{let Lu=(await vl(kl(f,`/api/tasks/${encodeURIComponent(M)}/move`),{method:"POST",body:{queueId:a}}))?.task||{...b,queueId:a};if(O.current.set(M,{...O.current.get(M)||{},task:Lu}),A.current=M,d(Lu),I(M),ll(a),!gf(Pu))Rf(null),Jl(a);let Tu=`已将任务 ${M} 从 ${nu} 移动到 ${a}`;sl(Tu),nr("success",Tu),await hf(M,!0,gf(Pu)?p0:a)},"移动任务 queue 失败")}async function OT(){let m=A.current;if(!m)return;let M=performance.now();await ir(async()=>{Yr({phase:"session",taskId:m,queueMs:0,totalMs:0,partial:!0,startedAt:new Date}),await yi(m,!0,M,0)},"刷新 Trace Summary 失败")}function ZT(m){A.current=m,J.current+=1,I(m);let M=O.current.get(m);if(M?.task)d(M.task),x(!1);else{x(!0);let a=fn.find((nu)=>nu.id===m);if(a)d(a);else d(null)}hf(m).catch((a)=>Tl(tf(a,"切换 Codex session 失败")))}function n6(m){if(ZT(m),BE())my(!1)}function V7(m,M,a){if(!m||!Array.isArray(m?.tasks)||M.length===0||Object.keys(a).length===0)return m;let nu=!1,ju=Ml(m).map((Lu)=>{if(String(Lu?.id||"")!==M)return Lu;return nu=!0,c_(KQ(Lu,a))});return nu?{...m,tasks:ju}:m}function HT(m,M){Rf((a)=>V7(a,m,M)),Fu((a)=>V7(a,m,M))}function BT(m,M,a){let nu=String(m?.type||"");if(nu==="queue-updated")return!0;if(nu==="trace-stats-updated"||nu==="trace-step-created")return!1;if(M.length===0)return!0;if(!a)return!0;if(m?.queueId&&String(m.queueId)!==I1(a))return!0;if(m?.status&&String(m.status)!==String(a?.status||""))return!0;return String(m?.reason||"")!=="output"}function D7(){if(!i||!x4())return;if(H.current!==null)window.clearTimeout(H.current);H.current=window.setTimeout(()=>{H.current=null,hf(A.current,!1).catch((m)=>Tl(tf(m,"Code Queue 事件刷新失败")))},120)}function mT(m,M){if(!i||!x4()||A.current!==m)return;if(V.current=V.current||M,E.current!==null)return;E.current=window.setTimeout(()=>{E.current=null;let a=V.current;if(V.current=!1,yi(m,!0).catch((nu)=>Tl(tf(nu,"事件刷新 Trace Summary 失败"))),a)FT(m)},250)}function VT(m){let M=Wl(m?.payload)||m,a=Wl(M?.stats),nu=String(m?.type||M?.type||""),ju=String(M?.subjectKind||a?.subjectKind||""),Lu=String(M?.scopeId||a?.scopeId||""),Tu=String(M?.taskId||(ju==="task"?M?.subjectId:"")||a?.taskId||m?.taskId||""),hu=M?.attemptIndex??a?.attemptIndex,xu=hu===null||hu===void 0||hu===""?null:Mn(hu),Mu=a||Wl(M?.traceStats),vu=Mu?.stepCount??Mu?.llmStepCount,tl=Mu?.outputMaxSeq;return{...M,type:nu,eventId:m?.eventId||M?.eventId,sequence:m?.sequence??M?.sequence,taskId:Tu,subjectKind:ju,scopeId:Lu,attemptIndex:xu,stepCount:vu,outputMaxSeq:tl,updatedAt:Mu?.updatedAt||M?.updatedAt||m?.createdAt,traceStats:Mu,statsSource:Mu?"oa-event-flow":M?.statsSource}}function DT(m){let M=VT(m),a=String(M?.taskId||""),nu=String(M?.scopeId||M?.traceStats?.scopeId||""),ju=String(M?.subjectKind||M?.traceStats?.subjectKind||"")==="task-attempt"||Number(M?.attemptIndex)>0||/:attempt:\d+$/u.test(nu),Lu=qQ(M?.stepCount),Tu={},hu=a.length>0?Ml(Y.current).find((xu)=>String(xu?.id||"")===a):null;if(a.length>0){if(M?.status)Tu.status=String(M.status);if(M?.updatedAt)Tu.updatedAt=String(M.updatedAt);if(M?.queueId)Tu.queueId=String(M.queueId);if(!ju&&Number.isFinite(Number(M?.stepCount)))Tu.stepCount=Lu,Tu.llmStepCount=Lu;if(!ju&&Number.isFinite(Number(M?.outputMaxSeq)))Tu.outputMaxSeq=qQ(M.outputMaxSeq);if(!ju&&Wl(M?.traceStats))Tu.traceStats=M.traceStats,Tu.statsSource="oa-event-flow";if(Object.keys(Tu).length>0&&(O.current.has(a)||A.current===a))Pr(a,Tu,J.current);if(Object.keys(Tu).length>0)HT(a,Tu);if(A.current===a&&(M?.type==="trace-step-created"||M?.type==="task-updated"||M?.type==="trace-stats-updated")){let xu=XQ(hu),Mu=M?.type==="trace-step-created"||M?.type==="trace-stats-updated"&&!ju&&Number.isFinite(Number(M?.stepCount))&&(xu===null||Lu>xu);mT(a,Mu)}}if(BT(M,a,hu))D7()}V0(()=>{if(B.current){B.current=!1;return}ir(()=>hf(A.current),"Code Queue 加载失败")},[i?.id,Pu]),V0(()=>{if(!i||typeof EventSource>"u")return;let m=new EventSource(zE(f),{withCredentials:!0}),M=(nu)=>{try{DT(JSON.parse(String(nu.data||"{}")))}catch(ju){Tl(tf(ju,"解析 Code Queue 事件失败"))}},a=()=>{if(x4())D7()};return m.addEventListener("trace-step-created",M),m.addEventListener("task-updated",M),m.addEventListener("queue-updated",M),m.addEventListener("trace-stats-updated",M),document.addEventListener("visibilitychange",a),()=>{if(m.close(),document.removeEventListener("visibilitychange",a),H.current!==null)window.clearTimeout(H.current),H.current=null;if(E.current!==null)window.clearTimeout(E.current),E.current=null}},[i?.id,f,Pu]),V0(()=>{if(!i||!b||g)return;let m=String(b.id||"");if(!m)return;let M=String(b.updatedAt||"");if(k$(b))return;let a=`${m}:${M||"unknown"}:${String(b?._traceSummaryUpdatedAt||"")}`;if(Z.current.has(a))return;Z.current.add(a),yi(m,!0).catch((nu)=>Tl(tf(nu,"自动加载 Trace Summary 失败")))},[i?.id,b?.id,b?.updatedAt,b?.traceStats?.statsRevision,b?._traceSummaryUpdatedAt,b?._traceSummaryLoaded,g]);let pT=rn.length===0?T(pi,{title:Mf?zu?"搜索中":"没有匹配任务":"队列为空",text:Mf?zu?`正在搜索包含“${ti}”的 task...`:`未找到包含“${ti}”的 task;可换个关键词或切换 queue。`:"提交一个任务后,Codex 会串行执行并保存输出。"}):[G7.length>0?T(s4,{key:"unread",title:"已结束未读",tasks:G7,selectedId:k,emptyText:"暂无已结束未读任务。",onSelect:n6,onCopy:l6,onReference:f6,onMarkRead:r6,copiedTaskId:ut,markingReadTaskId:lt}):null,T(s4,{key:"active",title:"运行 / 排队",tasks:eL,selectedId:k,emptyText:"当前没有运行或排队任务。",onSelect:n6,onCopy:l6,onReference:f6,onMarkRead:r6,copiedTaskId:ut,markingReadTaskId:lt}),T(s4,{key:"history",title:"历史 session",tasks:uT,selectedId:k,emptyText:"最近没有完成、失败或取消的 session。",onSelect:n6,onCopy:l6,onReference:f6,onMarkRead:r6,copiedTaskId:ut,markingReadTaskId:lt}),T("div",{key:"pagination",className:"codex-task-pagination","data-testid":"codex-task-pagination"},T("span",null,Mf?`搜索“${ti}” · 已显示 ${rn.length} / ${Number.isFinite(it)?it:rn.length}`:`已加载 ${rn.length} / ${Number.isFinite(it)?it:rn.length}`),E7?T("button",{type:"button",className:"ghost-btn",disabled:aA,onClick:()=>void m7(),"data-testid":"codex-load-more-tasks-button"},aA?"加载中":Mf?"加载更多结果":"加载更早任务"):T("code",null,Mf?"已到结果末尾":"已到队列末尾"))],p7=(m,M=!1)=>T("label",{className:`code-queue-switcher ${M?"compact":""}`},T("span",null,M?"Queue":"查看 queue"),T("select",{value:Pu,onChange:(a)=>QT(String(a.target.value||p0)),"data-testid":m},T("option",{value:p0},`All queues · ${Number.isFinite(ii)?ii:fn.length} tasks · ${Sy.length} running`),Wr.map((a)=>T("option",{key:String(a?.id||""),value:String(a?.id||"")},k1(a))))),ST=T("div",{className:"codex-task-search","data-testid":"codex-task-search"},T("label",{htmlFor:"codex-task-search-input"},"搜索 task"),T("div",{className:"codex-task-search-row"},T("input",{id:"codex-task-search-input",type:"search",value:lu,placeholder:"关键词 / task ID / prompt",autoComplete:"off",onChange:(m)=>cu(String(m.target.value||"")),"data-testid":"codex-task-search-input"}),lu?T("button",{type:"button",className:"ghost-btn",onClick:()=>cu(""),"data-testid":"codex-task-search-clear"},"清除"):null),T("small",{"data-testid":"codex-task-search-summary"},Mf?zu?"搜索中...":`匹配 ${rn.length}/${Number.isFinite(it)?it:rn.length}`:"支持 task ID、prompt、状态、provider、模型和最近输出关键词")),XT=T("div",{className:"codex-trace-status","data-testid":"codex-trace-status-summary"},T("span",{className:"codex-trace-status-chip queued"},T("b",null,"排队"),String(IA)),T("span",{className:"codex-trace-status-chip running"},T("b",null,"运行"),String(t_)),T("span",{className:`codex-trace-status-chip unread ${en>0?"warn":""}`},T("b",null,"结束未读"),String(en)),T("span",{className:"codex-trace-status-chip service"},T("b",null,"服务"),`${lT.providerStatus||"unknown"} · ${i?.providerId||"D601"} · ${fT.public?"公网暴露":"仅 UniDesk frontend 代理访问"}`),T("span",{className:"codex-trace-status-chip"},T("b",null,"执行节点"),y_.map((m)=>m.id).join(" / ")),T("span",{className:"codex-trace-status-chip"},T("b",null,"执行模式"),H7.map((m)=>m.id).join(" / ")),T("span",{className:"codex-trace-status-chip"},T("b",null,"模型"),Z7.join(" / ")),T("span",{className:"codex-trace-status-chip"},T("b",null,"加载"),Cf?.phase==="complete"?TE(Cf?.totalMs):String(Cf?.phase||"idle")),T("span",{className:"codex-trace-status-chip"},T("b",null,"刷新"),f_?yl(f_):"--")),YT=T(st,{title:b?`Trace ${String(b.id).slice(0,22)}`:"Trace 输出",eyebrow:b?`${b.status} / view=${u0} / task queue=${I1(b)} / provider=${b.providerId||"D601"} / mode=${b.executionMode||"default"} / ${b.model} / agent loop trace`:`Agent loop trace / view=${u0}`,summary:XT,loading:g||py||zu||C||Cf?.phase==="loading",actions:T("div",{className:"panel-actions"},p7("code-queue-filter-select"),T("button",{type:"button",className:"ghost-btn codex-mark-all-read-btn",disabled:en===0||Zl||Dy,onClick:()=>void JT(),"data-testid":"codex-mark-all-read-button"},Dy?"标记中":`全部标已读${en>0?` (${en})`:""}`),b?T("button",{type:"button",className:"ghost-btn",disabled:g||Zl,onClick:()=>void OT(),"data-testid":"codex-load-full-trace-button"},g?"加载中":Ur(b)?"刷新 Summary":"加载 Summary"):null,T("button",{type:"button",className:"codex-session-title-toggle",onClick:()=>my((m)=>!m),"data-testid":"code-queue-sidebar-toggle"},Xr?"收起队列":"展开队列"),T("label",{className:"inline-check"},T("input",{type:"checkbox",checked:_l,onChange:(m)=>Nf(Boolean(m.target.checked))}),"自动滚动"),T("button",{type:"button",className:"ghost-btn",disabled:!iT||Zl,onClick:()=>void GT(),"data-testid":"codex-interrupt-button"},"打断"),T("button",{type:"button",className:"ghost-btn",disabled:!tT||Zl,onClick:()=>void zT()},"重试"),b?T(mQ,{title:"Codex Task",data:b,onOpen:l,testId:"raw-codex-task"}):null),className:"codex-output-panel"},T("div",{className:`codex-session-shell ${Xr?"":"queue-collapsed"}`},Xr?T("aside",{className:"codex-session-sidebar","data-testid":"codex-session-sidebar"},T("div",{className:"codex-session-sidebar-head"},T("div",null,T("span",null,gf(Pu)?"All queues":"Queue lane"),T("strong",null,`${u0} · ${fn.length}/${Number.isFinite(ii)?ii:fn.length} sessions · 未读 ${en}`)),T("button",{type:"button",className:"ghost-btn",onClick:()=>my(!1)},"收起")),p7("code-queue-filter-sidebar",!0),ST,T("div",{className:"codex-task-list codex-task-list-session",onScroll:UT,"data-testid":"codex-task-list-scroll"},pT)):null,T("div",{className:"codex-session-main"},T("div",{className:"codex-output-stack"},T(YO,{task:b,loading:g,onLoadPromptPart:AT,onLoadSteps:u6,onLoadStep:jT}),T(PO,{task:b})))));if(!i)return T(pi,{title:"Code Queue 未登记",text:"请在 config.json 的 microservices 中登记用户服务 id=code-queue"});let S7=Number(Cf?.totalMs),X7=Number(Cf?.queueMs),Y7=Number(Cf?.detailMs),P7=Number(Cf?.transcriptRows),PT=Cf?.phase==="complete"?"complete":String(Cf?.phase||"idle"),CT=ot(Wr,ri)||{id:ri,name:ri},MT=Jf?T(_Q,{title:"合并 queue",titleId:"codex-merge-dialog-title",className:"codex-merge-dialog",backdropClassName:"codex-merge-dialog-backdrop",bodyClassName:"codex-merge-dialog-body",actionsClassName:"codex-merge-dialog-actions",testId:"codex-merge-queue-dialog",closeTestId:"codex-merge-queue-close",disableClose:Zl,onClose:()=>Of(!1),actions:[T("button",{key:"cancel",type:"button",className:"ghost-btn",onClick:()=>Of(!1),disabled:Zl,"data-testid":"codex-merge-queue-cancel"},"取消"),T("button",{key:"confirm",type:"button",className:"primary-btn",onClick:()=>void WT(),disabled:Zl||Ql||!yf,"data-testid":"codex-merge-queue-confirm"},Zl?"合并中...":"确认合并")]},T("p",{className:"codex-merge-dialog-target"},"目标 queue:",T("code",null,k1(CT))),T("label",null,"源 queue",T("select",{value:yf,disabled:Zl||Ql,onChange:(m)=>lf(String(m.target.value||"")),"data-testid":"codex-merge-source-queue-select"},T("option",{value:""},"选择要合并进来的源 queue"),ni.map((m)=>T("option",{key:String(m?.id||""),value:String(m?.id||"")},k1(m))))),T("p",{className:"codex-merge-dialog-note"},"会把源 queue 的任务归属合并到目标 queue,并自动删除源 queue;目标 queue 会按原 queueEnteredAt/createdAt 时间顺序运行。")):null;return T("div",{className:`code-queue-page ${n?"codex-standalone-page":""}`,"data-testid":"code-queue-page","data-load-state":PT,"data-load-total-ms":Number.isFinite(S7)?String(Math.round(S7*10)/10):"","data-load-queue-ms":Number.isFinite(X7)?String(Math.round(X7*10)/10):"","data-load-detail-ms":Number.isFinite(Y7)?String(Math.round(Y7*10)/10):"","data-load-transcript-rows":Number.isFinite(P7)?String(P7):"","data-load-task-id":String(Cf?.taskId||k||""),"data-load-partial":Cf?.partial?"true":"false"},T(nl,{error:vA,wide:!0}),MT,T("div",{className:"codex-session-stage codex-session-stage-top"},YT),T("div",{className:"code-queue-layout"},T("div",{className:"codex-left-rail"},T(st,{title:"提交任务",eyebrow:Ql?"Submitting...":zn.length>1?`${zn.length} tasks`:"Single or Batch",className:"codex-compose-panel",loading:Ql},T("form",{className:`codex-task-form ${Ql?"is-submitting":""}`,onSubmit:LT,"data-testid":"code-queue-task-form","aria-busy":Ql?"true":"false"},T("label",null,"Prompt / 多任务用单独一行 --- 分隔",T("textarea",{value:s,rows:8,disabled:Ql,onChange:(m)=>qu(m.target.value),placeholder:"写入 Codex 任务;多个任务之间用 --- 分隔。"})),T("label",{className:"codex-reference-field"},"引用任务 ID(可选)",T("input",{value:Zu,disabled:Ql,onChange:(m)=>Bu(m.target.value),placeholder:"codex_...;支持空格/逗号分隔多个 ID","data-testid":"codex-reference-task-id"}),Bi(Zu).length>0?T("code",null,`后端将解析并注入:${Bi(Zu).join(" / ")}`):null),T("div",{className:"codex-form-grid"},T("label",{className:"codex-submit-queue-field"},"Queue",T("div",{className:"codex-submit-queue-row"},T("select",{className:"codex-submit-queue-select",value:Iu,disabled:Ql,onChange:(m)=>ll(String(m.target.value||"default")),"data-testid":"code-queue-id-select"},Wr.map((m)=>T("option",{key:String(m?.id||""),value:String(m?.id||"")},k1(m)))),T("button",{type:"button",className:"ghost-btn codex-rename-queue-btn",onClick:()=>void qT(),disabled:Zl||Ql||!Iu,title:"修改当前 queue 的显示名称,ID 不变","data-testid":"codex-rename-queue-button"},"改名"),T("button",{type:"button",className:"ghost-btn codex-merge-queue-btn",onClick:()=>wT(),disabled:Zl||Ql||ni.length===0,title:"打开独立窗口选择源 queue 并合并到当前 queue;合并后自动删除源 queue","data-testid":"codex-merge-queue-button"},"合并 queue"),T("button",{type:"button",className:"ghost-btn codex-create-queue-btn",onClick:()=>void NT(),disabled:Zl||Ql,"data-testid":"codex-create-queue-button"},"创建 queue"))),T("label",null,"模型",T("select",{value:Qf,disabled:Ql,onChange:(m)=>Yu(m.target.value),"data-testid":"codex-model-select"},Z7.map((m)=>T("option",{key:m,value:m},m)))),T("label",null,"执行 Provider",T("select",{value:Zf,disabled:Ql,onChange:(m)=>_T(String(m.target.value||"D601")),"data-testid":"codex-provider-select"},y_.map((m)=>T("option",{key:m.id,value:m.id},`${m.label||m.id} · ${m.defaultWorkdir||_2(Pl,m.id)}${m.supportsWindowsNativeCodex?" · Windows native":""}`)))),T("label",null,"执行模式",T("select",{value:Au,disabled:Ql,onChange:(m)=>$T(String(m.target.value||"default")),"data-testid":"codex-execution-mode-select"},H7.map((m)=>T("option",{key:m.id,value:m.id},`${m.label||m.id}${m.id==="windows-native"?" · 宿主 Codex":""}`)))),T("label",null,"工作目录",T("input",{value:cf,disabled:Ql,onChange:(m)=>_f(m.target.value),placeholder:nT||Pl?.defaultWorkdir||"/workspace","data-testid":"codex-cwd-input"})),T("label",null,"最大尝试",T("input",{type:"number",min:1,max:99,value:fr,disabled:Ql,onChange:(m)=>$f(Number(m.target.value)),"data-testid":"codex-max-attempts-input"})),T("label",null,"入队份数",T("input",{type:"number",min:1,max:50,value:Hf,disabled:Ql,onChange:(m)=>Gn(Number(m.target.value)),"data-testid":"codex-repeat-count-input"}))),Py>1?T("label",{className:`codex-batch-confirm ${rr?"confirmed":""}`,"data-testid":"codex-batch-confirm-row"},T("input",{type:"checkbox",checked:rr,disabled:Ql,onChange:(m)=>dn(Boolean(m.target.checked)),"data-testid":"codex-batch-confirm-checkbox"}),T("span",null,`确认批量入队 ${Py} 个任务(prompt 分段 ${oA.length} × 入队份数 ${NQ(Hf)})`)):null,Ql?T("div",{className:"codex-submit-wait","data-testid":"codex-submit-wait"},"正在提交到后端,已锁定输入以防重复提交..."):null,T("div",{className:"codex-form-actions"},T("button",{type:"button",className:"ghost-btn",disabled:Zl||Ql||s.length===0&&Zu.length===0,onClick:()=>{qu(""),Bu(""),dn(!1);let m="已清空任务输入栏";sl(m),nr("success",m)},"data-testid":"codex-clear-input-button"},"清空输入"),T("button",{type:"submit",className:"primary-btn",disabled:rT,"data-testid":"codex-enqueue-button"},Ql?"提交中,请等待...":O7?`请确认批量入队 ${Py} 个任务`:zn.length>1?`批量入队 ${zn.length} 个任务`:"入队并运行"))))),T("div",{className:"codex-main-stage"},T("div",{className:"codex-detail-grid"},T(st,{title:"运行控制",eyebrow:tt?"Queued prompt editable":dA?"Active turn steer":"Steer when running",loading:Zl},T("div",{className:"codex-run-control-stack"},T(VO,{task:b,queueRows:Wr,busy:Zl,onMove:ET}),b?.id?T("form",{className:"codex-steer-form codex-edit-prompt-form",onSubmit:KT,"data-testid":"codex-edit-prompt-form"},T("label",null,"编辑 queued 用户 prompt",T("textarea",{value:Xu,rows:5,onChange:(m)=>ou(m.target.value),placeholder:"仅 QUEUED 且尚未开始运行的任务可在这里修改原始用户 prompt。",disabled:!tt||Zl,"data-testid":"codex-edit-prompt-textarea"})),T("label",{className:"codex-reference-field"},"引用任务 ID(可选,留空会清除引用)",T("input",{value:$l,disabled:!tt||Zl,onChange:(m)=>Rl(m.target.value),placeholder:"codex_...;支持空格/逗号分隔多个 ID","data-testid":"codex-edit-reference-task-id"}),Bi($l).length>0?T("code",null,`将保留/注入:${Bi($l).join(" / ")}`):null),T("div",{className:"codex-form-actions"},T("button",{type:"button",className:"ghost-btn",disabled:!b?.id||Zl,onClick:()=>{ou(b?a$(b):""),Rl(Array.isArray(b?.referenceTaskIds)?b.referenceTaskIds.join(" "):"")},"data-testid":"codex-edit-prompt-reset"},"恢复当前值"),T("button",{type:"submit",className:"primary-btn",disabled:!tt||Zl||Xu.trim().length===0,title:tt?"保存后会重写尚未运行任务的用户 prompt":"只有 QUEUED 且尚未开始的任务可编辑 prompt","data-testid":"codex-edit-prompt-submit"},"保存 queued prompt"))):null,T("form",{className:"codex-steer-form",onSubmit:TT},T("label",null,"追加 prompt",T("textarea",{value:fu,rows:4,onChange:(m)=>mu(m.target.value),placeholder:"给正在运行的 Codex session 推入新的指令或纠偏。",disabled:!dA})),T("button",{type:"submit",className:"primary-btn",disabled:!dA||Zl||fu.trim().length===0,"data-testid":"codex-steer-button"},"推入运行中 session")))),T(st,{title:"完成判定",eyebrow:b?.lastJudge?b.lastJudge.source:"judge",loading:g},b?.lastJudge?T("div",{className:"codex-judge-card","data-testid":"codex-task-judge-card"},T(Di,{status:b.lastJudge.decision},b.lastJudge.decision),T("strong",null,`${Math.round(Number(b.lastJudge.confidence||0)*100)}% confidence`),T("p",{"data-testid":"codex-task-judge-reason"},a4(b.lastJudge.reason||"--",180)),T(CQ,{judge:b.lastJudge,testId:"codex-task-judge-failure-details"}),b.lastJudge.continuePrompt?T("code",{"data-testid":"codex-task-judge-continue-prompt"},a4(b.lastJudge.continuePrompt,160)):null):T(pi,{title:"尚未判定",text:"Codex turn 结束后会由 MiniMax M2.7 或 fallback judge 判定 complete/retry/fail;retry 会在已有 thread 追加继续执行 prompt。"}))),T(mO,{stats:kA,queueName:u0,onRaw:l}),T(st,{title:"Attempts",eyebrow:"terminal vs interruption",loading:g},T(CO,{task:b})))))}var a1=Cu(Fl(),1);var Vu=a1.default.createElement,{useEffect:$2}=a1.default,A2=a1.default.useState,MO=a1.default.useRef,F2=` +本次任务:`,r=l.indexOf(f);if(r===-1)return u;return l.slice(r+f.length).trimStart()}function Di(u){return u.length>0?u.split(/\r\n|\r|\n/u).length:0}function xQ(u){let l=String(u?.displayPrompt||"");if(l.length>0)return l;let f=String(u?.prompt||"");return fO(lO(f).userPrompt)}function Fr(u){return u?._traceSummary&&typeof u._traceSummary==="object"&&!Array.isArray(u._traceSummary)?u._traceSummary:null}function f3(u){return u?._promptDetails&&typeof u._promptDetails==="object"&&!Array.isArray(u._promptDetails)?u._promptDetails:{}}function j2(u){let l=Fr(u)?.prompt;return l&&typeof l==="object"&&!Array.isArray(l)?l:{}}function hQ(u){let l=Fr(u)?.execution;return l&&typeof l==="object"&&!Array.isArray(l)?l:{}}function OQ(u){let l=Number(u);return Number.isFinite(l)&&l>=0?Math.floor(l):0}function xn(u){let l=Number(u);return Number.isFinite(l)&&l>=0?Math.floor(l):null}function bQ(u){let l=Ll(u?.traceStats);if(l&&(u?.statsSource==="oa-event-flow"||l.source==="oa-event-flow"))return l;let f=Fr(u),r=Ll(f?.traceStats);if(r&&(f?.statsSource==="oa-event-flow"||r.source==="oa-event-flow"))return r;return null}function rO(u,l){let f=Ll(l?.traceStats)||Ll(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 nO(u,l){return xn(bQ(u)?.[l])}function vQ(u){let l=nO(u,"stepCount");if(l!==null)return l;let f=Fr(u);if(f!==null)return iO(f);return null}function iO(u){let l=Ll(u?.traceStats);if(!l||u?.statsSource!=="oa-event-flow"&&l.source!=="oa-event-flow")return null;return xn(l.stepCount)}function d$(u){if(!u||u?._traceSummaryLoaded!==!0)return!1;let l=Fr(u),f=String(u?._traceSummaryUpdatedAt||l?.updatedAt||""),r=String(u?.updatedAt||"");if(r.length>0){let n=hn(f),i=hn(r);if(n!==null&&i!==null){if(n+10?f:xQ(u)}function kQ(u){let l=Fr(u);return String(l?.finalResponse||u?.finalResponse||"").trimEnd()}function IQ(u){let f=Fr(u)?.lastJudge||u?.lastJudge;return f&&typeof f==="object"&&!Array.isArray(f)?f:null}function Ll(u){return u&&typeof u==="object"&&!Array.isArray(u)?u:null}function tO(u){let l=Ll(u?.raw),f=Ll(u?.failureDetails)||Ll(l?.minimaxFailure);if(f===null)return"";let r=f.repairAttempt===void 0?"":`${f.repairAttempt}/${f.maxRepairAttempts??"?"}`;return[["provider",f.provider||"minimax"],["stage",f.stage],["model",f.model],["timedOut",f.timedOut],["durationMs",f.durationMs],["timeoutMs",f.timeoutMs],["promptChars",f.promptChars],["promptLines",f.promptLines],["payloadBytes",f.payloadBytes],["responseStatus",f.responseStatus],["repairAttempt",r],["errorName",f.errorName],["error",f.errorMessage],["responseContentPreview",f.responseContentPreview],["responseTextPreview",f.responseTextPreview]].filter(([,i])=>i!==void 0&&i!==null&&String(i).length>0).map(([i,t])=>`${i}: ${String(t)}`).join(` +`)}function gQ({judge:u,testId:l="codex-judge-failure-details"}){let f=tO(u);if(f.length===0)return null;return T("details",{className:"codex-judge-failure-details","data-testid":l},T("summary",null,"MiniMax failure details"),T("pre",null,f))}function yO(u){let l=Fr(u)?.attempts;if(Array.isArray(l)&&l.length>0)return l;let f=hQ(u),r=kQ(u),n=IQ(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 cO(u,l){return Ll(l?.execution)||hQ(u)}function _O(u,l,f,r){let n=Fr(u),i=Number(n?.currentAttempt||u?.currentAttempt||0),t=Number(f),y=Number.isFinite(t)&&t>0&&t===i,c=CQ(u?.updatedAt,n?.updatedAt);if(y&&!l?.finishedAt&&c.length>0)return c;return String(l?.updatedAt||l?.finishedAt||r.effectiveEndAt||(y?c:"")||c||u?.finishedAt||u?.startedAt||"")}function $O(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 sQ(u,l){if(Object.prototype.hasOwnProperty.call(l||{},"judge"))return Ll(l?.judge);return IQ(u)}function AO(u,l,f){if(!VO(u))return!1;if(F2(l,f))return!1;if(l?.finishedAt)return!1;if(["succeeded","failed","canceled"].includes(String(l?.terminalStatus||"")))return!1;let r=Fr(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 aQ(u){return`feedback:${String(u||"latest")}`}function jO(u,l,f){let r=String(l?.feedbackPrompt||"").trimEnd(),n=String(l?.feedbackPromptPreview||r||"").trimEnd(),i=Number(l?.feedbackPromptChars||r.length||n.length||0),t=Number(l?.feedbackPromptLines||Di(r||n));if(r.length>0||n.length>0||i>0)return{text:r,preview:n,chars:i,lines:t,source:l?.feedbackPromptSource||"judge-feedback",forAttempt:l?.feedbackPromptForAttempt||Number(f||0)+1,truncated:Boolean(l?.feedbackPromptTruncated)};let y=sQ(u,l),c=String(y?.continuePrompt||"").trimEnd();if(y?.decision==="retry"&&c.length>0)return{text:"",preview:c,chars:c.length,lines:Di(c),source:"judge-continue-prompt",forAttempt:Number(f||0)+1,truncated:!1};return null}function FO(u){let l=j2(u);return Boolean(l.hasReferenceInjection||Number(l.referencePromptChars||0)>0||u?.referenceInjection||u?.referenceInjectionSummary)}function oQ(u,l=null){if(l!==null&&l!==void 0){let r=(Ll(u?._traceStepsByAttempt)||{})[String(l)];return Array.isArray(r)?r:[]}return Array.isArray(u?._traceSteps)?u._traceSteps:[]}function e1(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 UO(u){return(Array.isArray(u)?u:[]).reduce((l,f)=>Math.max(l,e1(f)),0)}function JO(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)=>e1(r)-e1(n))}function Xi(u){return(Array.isArray(u?.summaryLines)?u.summaryLines:[]).map((l)=>String(l||""))}function QO(u){let l=String(u?.kind||"").trim().toLowerCase(),f=String(u?.status||"").trim().toLowerCase();return l==="error"||f==="error"}function r3(u){let l=String(u?.status||"").trim();if(l.length>0)return l;let f=Xi(u).join(` +`);return/^(item\/[A-Za-z]+(?:\/[A-Za-z]+)?):/u.exec(f)?.[1]||""}function ZQ(u){return/^item\/(?:started|completed): file changes status=/u.test(String(u||"").trim())}function NO(u){let l=Xi(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=r3(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 qO(u){if(String(u?.kind||"")!=="edited")return!1;let l=String(u?.title||""),f=String(u?.status||""),r=Xi(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 wO(u){if(u.length<=1)return u[0];let l=u.find((i)=>r3(i)==="item/fileChange/outputDelta")||u.find((i)=>Xi(i).some((t)=>!ZQ(t)))||u.at(-1)||u[0],f=u.flatMap((i)=>Array.isArray(i?.rawSeqs)?i.rawSeqs:[i?.seq]).filter((i)=>i!==void 0),r=u.flatMap(Xi).filter((i)=>i.trim().length>0&&!ZQ(i)),n=u[u.length-1]||l;return{...l,at:l?.at||n?.at,title:String(l?.title||"Edited files"),status:NO(n),summaryLines:r.length>0?r:Xi(l),rawSeqs:f}}function WO(u){let l=Array.isArray(u)?u:[],f=[],r=[],n=()=>{if(r.length>0)f.push(wO(r));r=[]};for(let i of l){if(qO(i)){if(r3(i)==="item/started"&&r.length>0)n();if(r.push(i),r3(i)==="item/completed")n();continue}n(),f.push(i)}return n(),f}function LO(u){if(String(u?.kind||"")!=="message")return"";let l=String(u?.title||"").trim().toLowerCase();if(l!=="assistant message"&&l!=="reasoning")return"";return`${l}:${String(u?.status||"")}`}function TO(u){if(u.length<=1)return u[0];let l=u[0],f=u.at(-1)||l,r=u.flatMap((t)=>Array.isArray(t?.rawSeqs)?t.rawSeqs:[t?.seq]).filter((t)=>t!==void 0),n=[];for(let t of r)if(!n.includes(t))n.push(t);let i=u.flatMap(Xi).filter((t)=>t.trim().length>0);return{...l,seq:e1(f)||e1(l),at:f?.at||l?.at,summaryLines:i.length>0?[i.at(-1)||i[0]]:[],rawSeqs:n}}function KO(u){let l=Array.isArray(u)?u:[],f=[],r=[],n="",i=()=>{if(r.length>0)f.push(TO(r));r=[],n=""};for(let t of l){let y=LO(t);if(y.length>0&&y===n){r.push(t);continue}if(i(),y.length>0)r=[t],n=y;else f.push(t)}return i(),f}function GO(u){return KO(WO(u))}function zO(u){return{...u}}function t2(u,l=null){if(l!==null&&l!==void 0){let f=Ll(u?._traceStepsLoadedByAttempt)||{};return Boolean(f[String(l)])}return Boolean(u?._traceStepsLoaded)}function y2(u){return u?._traceStepDetails&&typeof u._traceStepDetails==="object"&&!Array.isArray(u._traceStepDetails)?u._traceStepDetails:{}}function EO(u,l){let f=Number(u?.index);return Number.isFinite(f)?f:l+1}function F2(u,l){return Boolean(u?.synthetic)||Number(l)<=0}function n3(u){let l=Number(u);return Number.isFinite(l)?String(l):void 0}function OO(u){let l=u?.timing&&typeof u.timing==="object"?u.timing:{},f=String(u?.status||"");if(["queued"].includes(f))return`等待 ${ar(l.queueWaitMs??l.totalElapsedMs)}`;if(["running","judging","retry_wait"].includes(f))return`耗时 ${ar(l.durationMs??l.totalElapsedMs)}`;return`耗时 ${ar(l.durationMs??l.totalElapsedMs)}`}function o1(u){return String(u?.queueId||"default")}function dQ(u){return Ll(u?.queuedReason)}function eQ(u){let l=String(u?.queuedReasonLabel||"").trim();if(l.length>0)return l.toUpperCase();let f=dQ(u),r=String(f?.label||"").trim();return r.length>0?r.toUpperCase():""}function ZO(u){let l=String(u?.status||"unknown");if(l!=="queued")return l;let f=eQ(u);return f.length>0?`QUEUED(${f})`:"QUEUED"}function HO(u){if(String(u?.status||"")!=="queued")return;let l=dQ(u),f=String(l?.message||"").trim(),r=eQ(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 BO(u){return{system:"SYS",user:"YOU",assistant:"GPT",reasoning:"THINK",command:"CMD",diff:"DIFF",tool:"TOOL",error:"ERR"}[u]||u.toUpperCase()}function HQ(u){return["running","judging","retry_wait"].includes(String(u?.status||""))}function VO(u){return String(u?.status||"")==="running"}function sr(u){return["succeeded","failed","canceled"].includes(String(u?.status||""))}function uN(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 Rn(u){if(!sr(u))return!1;if(u?.terminalUnread===!0)return!0;if(u?.terminalUnread===!1)return!1;return!u?.readAt}function sl(u){let l=Number(u||0);return Number.isFinite(l)?l:0}function mO(u){return sl(u.queued)+sl(u.retry_wait)}function DO(u){return sl(u.running)+sl(u.judging)}function pO(u,l){return Ll(u?.statistics)||Ll(l?.statistics)||{}}function SO(u){return Array.isArray(u?.daily)?u.daily:[]}function XO(u){return Ll(u?.totals)||{}}function U2(u,l){let f=Number(u?.[l]??0);return Number.isFinite(f)&&f>0?f:0}function e4(u,l){return u.reduce((f,r)=>Math.max(f,U2(r,l)),0)}var mi=700,BQ=220,m0=30,dt=24,d1=184,c2=d1-dt;function lN(u,l){if(l<=1)return mi/2;return m0+u*(mi-m0*2)/(l-1)}function fN(u,l){let f=l>0?l:1;return d1-Math.min(1,u/f)*c2}function u2(u,l,f){let r=u.length>0?u:[{[l]:0}],n=r.length>1?r:[r[0],r[0]];return n.map((i,t)=>`${lN(t,n.length).toFixed(2)},${fN(U2(i,l),f).toFixed(2)}`).join(" ")}function Cn(u){let l=String(u||"");return/^\d{4}-\d{2}-\d{2}$/u.test(l)?l.slice(5):l||"--"}function e$(u){if(!u)return"";return`${String(u.seriesKey||"")}:${String(u.row?.date||u.index||"")}`}function YO(u,l,f,r){let n=U2(u,r.key);return{...r,row:u,index:l,value:n,valueLabel:r.format(n),x:lN(l,f),y:fN(n,r.max),seriesKey:r.key}}function VQ(u){if(Rn(u))return 0;return{running:1,judging:2,retry_wait:3,queued:4,succeeded:8,failed:8,canceled:8}[String(u?.status||"")]??9}function I1(u){if(!u)return!1;if(u?._traceSummaryLoaded===!0)return!1;return u?.summaryOnly===!0||u?._metaLoaded!==!0}function PO(u){return Boolean(u?._metaLoaded)||u?.summaryOnly===!1}function CO(u,l,f){let r=String(u?.[f]||""),n=String(l?.[f]||"");return r.length>n.length?r:n}function _2(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 mQ(u,l){let f=l?.summaryOnly===!0&&PO(u),r={...u,...l};if(!f)return r;for(let n of["prompt","basePrompt","displayPrompt","finalResponse"])r[n]=CO(u,l,n);for(let n of["promptHistory","attempts","output","events"])r[n]=_2(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 DQ(u){let l=u?.selected,f=l?.task&&typeof l.task==="object"?l.task:null;if(f!==null){let n=Boolean(l?.preview);return{...f,transcript:Array.isArray(l?.transcript)?l.transcript:[],_detailLoaded:Array.isArray(l?.transcript)&&l.transcript.length>0,_transcriptComplete:Boolean(!n&&!l?.hasMore&&sr(f)),_transcriptPreview:n,_summaryLoaded:!0}}let r=vl(u)[0];return r?{...r,_summaryLoaded:!0}:null}function l2(u,l){let f=new Map;for(let r of[...Array.isArray(u)?u:[],...Array.isArray(l)?l:[]]){let n=`${Number(r?.seq??0)}:${String(r?.kind||"message")}`,i=f.get(n);if(!i){f.set(n,r);continue}let t={...i,...r};for(let[y,c]of[["bodyPreview","bodyOmittedLines"],["commandPreview","commandOmittedLines"]]){let $=String(i?.[y]||""),A=String(r?.[y]||"");if($.length>A.length)t[y]=i[y],t[c]=i[c]}f.set(n,t)}return Array.from(f.values()).sort((r,n)=>Number(r?.seq??0)-Number(n?.seq??0))}function u3(u){return(Array.isArray(u)?u:[]).reduce((l,f)=>Math.max(l,Number(f?.seq??0)),0)}function pQ(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 MO(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 RO(u,l){let r=(Array.isArray(u?.executionProviders)?u.executionProviders:[]).map((t)=>({id:String(t?.id||"").trim(),label:String(t?.label||t?.id||"").trim(),defaultWorkdir:String(t?.defaultWorkdir||"").trim(),supportsWindowsNativeCodex:t?.supportsWindowsNativeCodex===!0,windowsNativeDefaultWorkdir:String(t?.windowsNativeDefaultWorkdir||"").trim(),kind:String(t?.kind||"").trim()})).filter((t)=>t.id.length>0),n=String(u?.mainProviderId||u?.defaultProviderId||"D601").trim()||"D601",i=new Map;for(let t of[...r,{id:n,label:`${n} (local)`,defaultWorkdir:String(u?.defaultWorkdir||"/workspace"),supportsWindowsNativeCodex:!1,windowsNativeDefaultWorkdir:"",kind:"local"},l?{id:l,label:l,defaultWorkdir:J2(u,l),supportsWindowsNativeCodex:l!==n,windowsNativeDefaultWorkdir:String(u?.windowsNativeCodexDefaultWorkdir||"/mnt/f/Work/ConStart"),kind:""}:null].filter(Boolean))if(!i.has(t.id))i.set(t.id,t);return Array.from(i.values())}function xO(u,l){let r=(Array.isArray(u?.executionModes)?u.executionModes:[]).map((t)=>({id:String(t?.id||t?.kind||"").trim(),label:String(t?.label||t?.id||t?.kind||"").trim(),description:String(t?.description||"").trim(),defaultWorkdir:String(t?.defaultWorkdir||"").trim(),requiresProvider:t?.requiresProvider===!0,requiresWindowsCwd:t?.requiresWindowsCwd===!0})).filter((t)=>t.id.length>0),n=[{id:"default",label:"默认容器/本机",description:"Code Queue 所在节点用本机 Codex;远程 Provider 用执行容器 Codex。",defaultWorkdir:"",requiresProvider:!1,requiresWindowsCwd:!1},{id:"windows-native",label:"Windows 原生 Codex",description:"启动执行容器,但容器只做 stdio relay,Codex 运行在 Provider 的 Windows 宿主。",defaultWorkdir:String(u?.windowsNativeCodexDefaultWorkdir||"/mnt/f/Work/ConStart"),requiresProvider:!0,requiresWindowsCwd:!0}],i=new Map;for(let t of[...r,...n,l?{id:l,label:l,description:"",defaultWorkdir:"",requiresProvider:l==="windows-native",requiresWindowsCwd:l==="windows-native"}:null].filter(Boolean))if(!i.has(t.id))i.set(t.id,t);return Array.from(i.values())}function a1(u,l,f){if(l!=="windows-native")return J2(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 J2(u,l){let f=String(l||"").trim(),r=u?.defaultWorkdirByProvider&&typeof u.defaultWorkdirByProvider==="object"?u.defaultWorkdirByProvider:{};if(typeof r[f]==="string"&&String(r[f]).trim().length>0)return String(r[f]).trim();let n=Array.isArray(u?.executionProviders)?u.executionProviders.find((t)=>String(t?.id||"")===f):null;if(typeof n?.defaultWorkdir==="string"&&n.defaultWorkdir.trim().length>0)return n.defaultWorkdir.trim();let i=String(u?.mainProviderId||u?.defaultProviderId||"D601");return f===i?String(u?.defaultWorkdir||"/workspace"):String(u?.remoteDefaultWorkdir||"/home/ubuntu")}function uy(u){return String(u||"").trim().replace(/\/+$/u,"")||"/"}function hO(u,l,f){return String(u?.providerId||"")===String(l||"")&&String(u?.executionMode||"default")===String(f||"default")&&String(u?.path||"").trim().length>0}function bO(u,l,f,r,n){let i=new Map,t=uy(n),y=(c,$,A={})=>{let j=uy(c);if(j.length===0||i.has(j))return;i.set(j,{providerId:f,executionMode:r,path:j,source:$,createdAt:A?.createdAt||"",updatedAt:A?.updatedAt||""})};y(a1(u,r,f),"default");for(let c of Array.isArray(l)?l:[])if(hO(c,f,r))y(c.path,"saved",c);return y(n,"current"),Array.from(i.values()).sort((c,$)=>{if(c.path===t)return-1;if($.path===t)return 1;if(c.source==="default"&&$.source!=="default")return-1;if($.source==="default"&&c.source!=="default")return 1;return c.path.localeCompare($.path)})}function vO(u){return vQ(u)}function kO({task:u,selected:l,onSelect:f,onCopy:r,onReference:n,onMarkRead:i,copied:t,markingRead:y}){let c=u?.lastJudge||{},$=String(u?.id||""),A=Rn(u),j=CQ(u?.updatedAt,Fr(u)?.updatedAt),F=`最近更新: ${PQ(j)}`,J=vO(u),Q=J===null?"--":String(J),W=J===null?"STEP 统计中心同步中":"STEP 来自 OA Event Flow 统计中心";return T("article",{role:"button",tabIndex:0,className:`codex-task-card ${l?"selected":""} ${A?"unread-terminal":""}`,onClick:f,onKeyDown:(L)=>{if(L.key==="Enter"||L.key===" ")L.preventDefault(),f()},"data-unread-terminal":A?"true":"false","data-testid":`codex-task-${u?.id||"unknown"}`},A?T("span",{className:"codex-unread-badge",title:"待读","aria-label":"待读","data-testid":`codex-unread-task-${$||"unknown"}`}):null,T("div",{className:"codex-task-card-head"},T("div",{className:"codex-task-status-line"},T(pi,{status:u?.status,title:HO(u)},ZO(u))),T("span",{className:"mono-text"},`${u?.currentAttempt||0}/${u?.maxAttempts||0}`)),T("div",{className:"codex-task-id-row"},T("code",{title:$},$||"unknown"),T("div",{className:"codex-task-id-actions"},T("button",{type:"button",className:"codex-copy-id-btn",onClick:(L)=>{L.stopPropagation(),n($)},"data-testid":`codex-reference-task-${$||"unknown"}`},"引用"),T("button",{type:"button",className:"codex-copy-id-btn",onClick:(L)=>{L.stopPropagation(),r($)},"data-testid":`codex-copy-task-id-${$||"unknown"}`},t?"已复制":"复制ID"),A?T("button",{type:"button",className:"codex-copy-id-btn codex-mark-read-btn",disabled:Boolean(y),onClick:(L)=>{L.stopPropagation(),i($)},"data-testid":`codex-mark-task-read-${$||"unknown"}`},y?"标记中":"标为已读"):null)),T("strong",null,r2(xQ(u),120)||"空任务"),T("div",{className:"codex-task-meta"},T("span",null,`queue=${o1(u)}`),T("span",null,`provider=${u?.providerId||"D601"}`),T("span",null,`mode=${u?.executionMode||"default"}`),T("span",null,u?.model||"--"),T("span",null,OO(u))),T("div",{className:"codex-task-meta codex-task-update-meta"},T("span",{className:"codex-task-recent-update codex-task-step-count",title:W,"data-testid":`codex-task-step-count-${$||"unknown"}`},`STEP ${Q}`),T("span",{className:"codex-task-recent-update",title:j?`更新时间: ${wu(j)}`:F,"data-testid":`codex-task-recent-update-${$||"unknown"}`},F),T("span",null,wu(j||u?.updatedAt))),uN(u)?T("div",{className:"codex-judge-line","data-testid":`codex-task-prompt-editable-${$||"unknown"}`},"queued prompt 可编辑"):null,c?.decision?T("div",{className:"codex-judge-line"},`judge=${c.decision} ${Math.round(Number(c.confidence||0)*100)}%`):null)}function f2({title:u,tasks:l,selectedId:f,onSelect:r,onCopy:n,onReference:i,onMarkRead:t,copiedTaskId:y,markingReadTaskId:c,emptyText:$}){let A=Array.isArray(l)?l:[];return T("section",{className:"codex-task-section"},T("div",{className:"codex-task-section-head"},T("span",null,u),T("code",null,String(A.length))),A.length===0?T("p",{className:"codex-task-section-empty"},$):T("div",{className:"codex-task-section-list"},A.map((j)=>T(kO,{key:j.id,task:j,selected:f===j.id,onSelect:()=>r(j.id),onCopy:n,onReference:i,onMarkRead:t,copied:y===j.id,markingRead:c===j.id}))))}function IO(){return T("span",{className:"codex-stats-icon","aria-hidden":"true"},T("svg",{viewBox:"0 0 36 24",focusable:"false"},T("path",{className:"grid",d:"M3 20.5H33M3 12.5H33M3 4.5H33"}),T("polyline",{className:"line tasks",points:"3,18 9,14 15,15 21,8 27,10 33,4"}),T("polyline",{className:"line retry",points:"3,20 9,17 15,18 21,13 27,14 33,9"})))}function gO({stats:u,queueName:l,onRaw:f}){let r=SO(u),n=XO(u),i=r.at(-1)||{},t=e4(r,"executedTasks"),y=e4(r,"retryAttempts"),c=e4(r,"avgDurationMs"),$=r.length>0,A=Ll(u?.range)||{},[j,F]=vu(null),[J,Q]=vu(null),W=[];if(t>0)W.push(`tasks ${t}`);if(y>0)W.push(`retry ${y}`);if(c>0)W.push(`avg ${ar(c)}`);let L=[{key:"executedTasks",className:"tasks",label:"执行任务",max:t,format:(E)=>`${sl(E)} tasks`},{key:"retryAttempts",className:"retry",label:"重试次数",max:y,format:(E)=>`${sl(E)} retries`},{key:"avgDurationMs",className:"duration",label:"平均耗时",max:c,format:(E)=>ar(E)}],U=j||J,q=e$(U),N=String(U?.row?.date||""),w=U?{left:`${Math.max(8,Math.min(92,Number(U.x)/mi*100))}%`,top:`${Math.max(14,Math.min(86,Number(U.y)/BQ*100))}%`}:void 0;Mn(()=>{F(null),Q(null)},[l,A.startDate,A.endDate,r.length]);let G=(E)=>{F(E)},Z=(E)=>{let m=e$(E);Q((S)=>e$(S)===m?null:E),F(E)},H=L.flatMap((E)=>r.map((m,S)=>{let B=YO(m,S,r.length,E),D=e$(B),X=q===D,O=String(m?.date||`day-${S}`),Y=`${Cn(O)} ${E.label}: ${B.valueLabel}`;return T("g",{key:`${E.key}-${O}`,className:`stat-point-group ${E.className} ${X?"active":""}`,role:"button",tabIndex:0,"aria-label":Y,"data-testid":`codex-stats-point-${E.className}-${O}`,onMouseEnter:()=>G(B),onFocus:()=>G(B),onClick:()=>Z(B),onKeyDown:(p)=>{if(p.key==="Enter"||p.key===" ")p.preventDefault(),Z(B)}},T("circle",{className:"stat-hit-point",cx:B.x,cy:B.y,r:13}),T("circle",{className:`stat-point ${E.className} ${X?"active":""}`,cx:B.x,cy:B.y,r:X?5.6:4.2}))}));return T(ot,{title:"统计曲线",eyebrow:`Daily task stats / ${l}`,className:"codex-stats-panel",summary:T("span",null,`${Cn(A.startDate)} -> ${Cn(A.endDate)} · ${u?.timezone||"Asia/Shanghai"}`),actions:Ll(u)?T(MQ,{title:"Code Queue Stats",data:u,onOpen:f,testId:"raw-codex-stats"}):null},T("div",{className:"codex-stats-hero","data-testid":"codex-stats-panel"},T(IO),T("div",null,T("strong",null,`${sl(n.executedTasks)} tasks / ${sl(n.retryAttempts)} retries`),T("span",null,`平均完成耗时 ${ar(n.avgDurationMs??void 0)} · 终态 ${sl(n.completedTasks)} 个`))),$?T("div",{className:"codex-stats-chart","data-testid":"codex-stats-chart",onMouseLeave:()=>F(null)},T("svg",{viewBox:`0 0 ${mi} ${BQ}`,preserveAspectRatio:"none",role:"img","aria-label":"Code Queue daily task statistics"},T("line",{className:"axis",x1:m0,x2:mi-m0,y1:d1,y2:d1}),T("line",{className:"grid",x1:m0,x2:mi-m0,y1:dt+c2/2,y2:dt+c2/2}),T("line",{className:"grid",x1:m0,x2:mi-m0,y1:dt,y2:dt}),T("polyline",{className:"stat-line tasks",points:u2(r,"executedTasks",t)}),T("polyline",{className:"stat-line retry",points:u2(r,"retryAttempts",y)}),T("polyline",{className:"stat-line duration",points:u2(r,"avgDurationMs",c)}),U?T("g",{className:"stat-cursor-layer","data-testid":"codex-stats-active-point"},T("line",{className:"stat-cursor",x1:U.x,x2:U.x,y1:dt,y2:d1}),T("circle",{className:`stat-point-active ${U.className}`,cx:U.x,cy:U.y,r:8})):null,T("g",{className:"stat-point-layer"},H)),U?T("div",{className:"codex-stats-tooltip active",style:w,"data-testid":"codex-stats-tooltip"},T("b",null,Cn(U.row?.date)),T("span",null,`${U.label} · ${U.valueLabel}`),T("code",null,`${sl(U.row?.executedTasks)} exec / ${sl(U.row?.retryAttempts)} retry / ${ar(U.row?.avgDurationMs??void 0)}`)):null,T("div",{className:"codex-stats-legend"},T("span",{className:"tasks"},"执行任务"),T("span",{className:"retry"},"重试次数"),T("span",{className:"duration"},"平均耗时")),T("div",{className:"codex-stats-scale"},T("span",null,Cn(r[0]?.date)),T("span",null,W.join(" · ")||"暂无峰值"),T("span",null,Cn(r.at(-1)?.date))),T("div",{className:`codex-stats-focus ${U?"active":""}`,"data-testid":"codex-stats-focus"},U?T(uc.default.Fragment,null,T("div",null,T("strong",null,Cn(U.row?.date)),T("span",null,`${U.label} · ${U.valueLabel}`)),T("div",{className:"codex-stats-focus-metrics"},T("code",null,`${sl(U.row?.executedTasks)} exec`),T("code",null,`${sl(U.row?.retryAttempts)} retry`),T("code",null,ar(U.row?.avgDurationMs??void 0)))):T("span",null,"将鼠标悬停到曲线数据点查看明细,点击数据点可固定。"))):T(Si,{title:"暂无统计",text:"任务开始执行后会生成按天汇总的曲线。"}),T("div",{className:"codex-stats-summary-grid"},T("article",null,T("span",null,"今日执行"),T("strong",null,String(sl(i.executedTasks))),T("code",null,Cn(i.date))),T("article",null,T("span",null,"今日重试"),T("strong",null,String(sl(i.retryAttempts))),T("code",null,`累计 ${sl(n.retryAttempts)}`)),T("article",null,T("span",null,"平均耗时"),T("strong",null,ar(n.avgDurationMs??void 0)),T("code",null,`${sl(n.durationSamples)} samples`))),T("div",{className:"codex-stats-daily-list","data-testid":"codex-stats-daily-list"},r.slice(-7).map((E)=>T("div",{key:String(E?.date||""),className:`codex-stats-daily-row ${N===String(E?.date||"")?"active":""}`,"data-testid":`codex-stats-day-${String(E?.date||"unknown")}`},T("span",null,Cn(E?.date)),T("b",null,`${sl(E?.executedTasks)} exec`),T("b",null,`${sl(E?.retryAttempts)} retry`),T("code",null,ar(E?.avgDurationMs??void 0))))))}function sO({task:u,queueRows:l,busy:f,onMove:r}){let n=String(u?.id||""),i=o1(u),[t,y]=vu(i);Mn(()=>{y(i)},[n,i]);let c=!n||f||["running","judging","retry_wait"].includes(String(u?.status||""));return T("div",{className:"codex-task-move-control","data-testid":"codex-task-queue-move-control"},T("label",null,"任务 queue",T("select",{value:t,disabled:!n||f,onChange:($)=>y(String($.target.value||i)),"data-testid":"codex-task-queue-move-select"},l.map(($)=>T("option",{key:String($?.id||""),value:String($?.id||"")},s1($))))),T("button",{type:"button",className:"ghost-btn",disabled:c||t===i,onClick:()=>r(t),title:c?"运行中 / judging / retry_wait 的任务不能移动;请先打断或等当前 turn 结束":"移动已创建任务到另一个 queue","data-testid":"codex-task-queue-move-button"},"移动"))}function SQ(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 aO({task:u,loading:l,onLoadPromptPart:f,testId:r="codex-initial-prompt-full",textTestId:n="codex-initial-prompt-full-text",baseTextTestId:i="codex-initial-prompt-base"}){let t=j2(u),y=f3(u),c=l3(u).trimEnd(),$=String(y.full?.text||""),A=FO(u),j=Number(t.promptChars||u?.promptChars||$.length),F=Number(t.basePromptLines||Di(c)),J=Number(t.promptLines||Di($));return T("section",{className:"codex-progressive-card codex-progressive-prompt","data-testid":"codex-progressive-prompt"},T("div",{className:"codex-progressive-card-head"},T("span",{className:"codex-output-channel"},"Prompt"),T("strong",null,"Submitted prompt / 原始用户 prompt"),T("code",null,`${F||Di(c)} lines / ${c.length} chars`)),T("pre",{className:"codex-prompt-full","data-testid":i},c||"空 prompt"),A?T("details",{className:"codex-reference-injection codex-progressive-full-prompt","data-testid":r,onToggle:(Q)=>{if(Q.currentTarget?.open&&!$)f?.("full")}},T("summary",null,T("span",null,"引用注入已折叠,点击按需拉取最终进入 Code agent 的完整 prompt"),T("code",null,$?`${J||Di($)} lines / ${$.length} chars`:`${Number.isFinite(j)&&j>0?j:"--"} chars`)),T("pre",{className:"codex-prompt-full codex-prompt-final-full","data-testid":n},$||(l?"正在按需拉取完整 prompt...":"展开后将只请求 full prompt,不拉取完整 transcript。"))):null)}function rN({task:u,attempt:l,attemptIndex:f,loading:r,onLoadSteps:n,onLoadStep:i,testId:t="codex-execution-summary"}){let y=GO(oQ(u,f)),c=zO(cO(u,l)),$=l?rO(u,l):bQ(u),A=y2(u),j=t2(u,f),F=xn($?.errorCount),J=xn($?.stepCount??$?.llmStepCount),Q=xn($?.readCount),W=xn($?.editCount),L=xn($?.runCount),U=xn($?.stepCount??$?.llmStepCount),q=J===null?"--":String(J),N=U===null?"--":String(U),w=Array.isArray(c.editedFiles)?c.editedFiles:[],G=Array.isArray(c.commands)?c.commands:[],H=F2(l,f)?` · ${String(l?.label||"recovered thread execution")}`:f?` #${f}`:"",E=_O(u,l,f,c),m=`最近更新: ${PQ(E)}`,S=AO(u,l,f);return T("details",{className:`codex-progressive-card codex-execution-summary ${S?"running":""}`,"data-testid":t,"data-attempt-index":n3(f),"data-running":S?"true":"false",onToggle:(B)=>{if(B.currentTarget?.open&&!j)n?.(f)}},T("summary",null,T("div",{className:"codex-progressive-card-head"},T("span",{className:"codex-output-channel"},"Summary"),T("strong",null,`执行过程摘要${H}`),S?T("span",{className:"codex-summary-running-pill","data-testid":`${t}-running`},"执行中"):null,T("code",{title:E?`最近更新: ${wu(E)}`:m},`${ar(c.durationMs??c.totalElapsedMs)} / ${q} tools / ${m}`)),T("div",{className:"codex-execution-digest"},T("span",{title:"来自 OA Event Flow 统计中心"},`read ${Q===null?"--":Q}`),T("span",{title:"来自 OA Event Flow 统计中心"},`edit ${W===null?"--":W}`),T("span",{title:"来自 OA Event Flow 统计中心"},`run ${L===null?"--":L}`),T("span",{title:"来自 OA Event Flow 统计中心"},`STEP ${N}`),F!==null&&F>0?T("span",{className:"codex-execution-error-pill","data-testid":`${t}-error-count`},`Error ${F}`):null)),T("div",{className:"codex-execution-digest expanded"},T("span",null,`修改文件:${SQ(w,6)}`),T("span",null,`执行命令:${SQ(G,4)}`)),y.length===0?T("div",{className:"codex-output-empty"},r?"正在按需拉取步骤 summary...":"展开后将只请求执行步骤 summary,不拉取单步骤全量。"):T("div",{className:"codex-trace-step-list"},y.map((B)=>{let D=String(B?.seq??""),X=A[D],O=Array.isArray(B?.summaryLines)?B.summaryLines.slice(0,4):[],Y=O.find((p)=>String(p||"").trim().length>0);return T("details",{key:D||`${B?.title}-${B?.at}`,className:`codex-trace-step ${String(B?.kind||"message")} ${QO(B)?"error":""}`,"data-testid":`codex-trace-step-${D||"unknown"}`,onToggle:(p)=>{if(p.currentTarget?.open&&!X)i?.(B?.seq)}},T("summary",null,T("span",{className:"codex-output-channel"},oO(B?.kind)),T("strong",null,String(B?.title||"Trace step")),B?.status?T("code",null,String(B.status)):null,Y?T("span",{className:"codex-trace-step-inline-summary",title:String(Y)},String(Y)):null,T("time",null,wu(B?.at))),T("div",{className:"codex-trace-step-summary"},O.length>0?O.map((p,v)=>T("pre",{key:`${D}-${v}`},String(p||""))):T("span",null,"无 summary")),X?.line?T(s$,{items:[X.line],autoScroll:!1,loading:!1,hasDetail:!0,emptyText:"无步骤详情",testId:`codex-trace-step-detail-${D||"unknown"}`,className:"codex-transcript codex-step-detail-transcript",collapseTools:!1}):T("div",{className:"codex-output-empty"},r?"正在按需拉取这个步骤的全量数据...":"展开后将只请求这个单步骤的全量数据。"))})))}function oO(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 nN({task:u,attempt:l,attemptIndex:f,testId:r="codex-final-response"}){let n=$O(u,l);if(n.length===0)return null;let i=Number(l?.finalResponseChars||n.length),t=f?` #${f}`:"";return T("section",{className:"codex-progressive-card codex-final-response","data-testid":r,"data-attempt-index":n3(f)},T("div",{className:"codex-progressive-card-head"},T("span",{className:"codex-output-channel"},"Final"),T("strong",null,`最终 response${t}`),T("code",null,`${Number.isFinite(i)?i:n.length} chars`)),T(bJ,{markdown:n,className:"codex-transcript-body codex-markdown",testId:`${r}-markdown`}))}function iN({task:u,attempt:l,attemptIndex:f,testId:r="codex-progressive-judge"}){let n=sQ(u,l);if(!n?.decision)return null;let i=f?` #${f}`:"";return T("section",{className:"codex-progressive-card codex-progressive-judge","data-testid":r,"data-attempt-index":n3(f)},T("div",{className:"codex-progressive-card-head"},T("span",{className:"codex-output-channel"},"Judge"),T("strong",null,`完成判定${i}`),T("code",null,`${n.decision} ${Math.round(Number(n.confidence||0)*100)}%`)),T("div",{className:"codex-judge-card","data-testid":`${r}-card`},T(pi,{status:n.decision},n.decision),T("strong",null,`${Math.round(Number(n.confidence||0)*100)}% confidence`),T("p",{"data-testid":`${r}-reason`},n.reason||"--"),T(gQ,{judge:n,testId:`${r}-failure-details`}),n.continuePrompt?T("pre",{"data-testid":`${r}-continue-prompt`},String(n.continuePrompt||"")):null))}function dO({task:u,attempt:l,attemptIndex:f,loading:r,onLoadPromptPart:n,testId:i="codex-judge-feedback-prompt"}){let t=jO(u,l,f);if(t===null)return null;let y=aQ(f),$=f3(u)[y],A=String($?.text||"").trimEnd(),j=String(t.preview||t.text||"").trimEnd(),F=A||String(t.text||"").trimEnd(),J=Number($?.chars||t.chars||F.length||j.length),Q=Number($?.lines||t.lines||Di(F||j)),W=$?.forAttempt||t.forAttempt||Number(f||0)+1;return T("details",{className:"codex-progressive-card codex-judge-feedback-prompt","data-testid":i,"data-attempt-index":n3(f),onToggle:(L)=>{if(L.currentTarget?.open&&!A)n?.("feedback",f)}},T("summary",null,T("div",{className:"codex-progressive-card-head"},T("span",{className:"codex-output-channel"},"Prompt"),T("strong",null,`judge feedback prompt #${f} -> #${W}`),T("code",null,`${Q||"--"} lines / ${Number.isFinite(J)?J:j.length} chars`)),T("p",{className:"codex-feedback-preview","data-testid":`${i}-preview`},j||"展开后按需拉取 judge feedback prompt。")),T("pre",{className:"codex-prompt-full codex-feedback-full","data-testid":`${i}-text`},F||(r?"正在按需拉取 judge feedback prompt...":"展开后将只请求这一次 judge feedback prompt。")))}function eO({task:u,attempt:l,position:f,loading:r,onLoadPromptPart:n,onLoadSteps:i,onLoadStep:t}){let y=EO(l,f),c=f===0,$=F2(l,y),A=$?String(l?.label||"Recovered thread execution"):`Attempt ${y}`;return T("section",{className:"codex-attempt-cycle","data-testid":`codex-attempt-cycle-${y}`},T("div",{className:"codex-attempt-cycle-head"},T("span",{className:"codex-output-channel"},A),T("strong",null,String(l?.mode||(y<=1?"initial":"retry"))),l?.terminalStatus?T(pi,{status:l.terminalStatus},l.terminalStatus):null,T("code",null,`${wu(l?.startedAt)} -> ${wu(l?.finishedAt)}`)),T(rN,{task:u,attempt:l,attemptIndex:y,loading:r,onLoadSteps:i,onLoadStep:t,testId:c?"codex-execution-summary":`codex-execution-summary-attempt-${y}`}),$?null:T(nN,{task:u,attempt:l,attemptIndex:y,testId:c?"codex-final-response":`codex-final-response-attempt-${y}`}),$?null:T(iN,{task:u,attempt:l,attemptIndex:y,testId:c?"codex-progressive-judge":`codex-progressive-judge-attempt-${y}`}),$?null:T(dO,{task:u,attempt:l,attemptIndex:y,loading:r,onLoadPromptPart:n,testId:c?"codex-judge-feedback-prompt":`codex-judge-feedback-prompt-attempt-${y}`}))}function uZ({task:u,loading:l,onLoadPromptPart:f,onLoadSteps:r,onLoadStep:n}){if(!u)return T(Si,{title:"未选择任务",text:"从左侧队列选择任务,或提交新 Codex 任务。"});let i=yO(u);return T("div",{className:"codex-transcript codex-progressive-trace","data-testid":"codex-output"},l&&!Fr(u)?T("div",{className:"codex-output-empty"},"正在加载 Trace Summary..."):null,T(aO,{task:u,loading:l,onLoadPromptPart:f}),i.length>0?i.map((t,y)=>T(eO,{key:`${t?.index||y+1}-${t?.startedAt||y}`,task:u,attempt:t,position:y,loading:l,onLoadPromptPart:f,onLoadSteps:r,onLoadStep:n})):[T(rN,{key:"execution",task:u,loading:l,onLoadSteps:r,onLoadStep:n}),T(nN,{key:"final",task:u}),T(iN,{key:"judge",task:u})])}function lZ({task:u}){let l=oE(u);if(!u||l.length===0)return T(Si,{title:"暂无原始消息",text:"原始 Codex app-server 消息会保留在任务 JSON 中。"});return T("details",{className:"codex-raw-output"},T("summary",null,`原始 messages (${l.length})`),T("div",null,l.map((f)=>T("article",{key:`${f.seq}-${f.channel}`,className:`codex-output-line ${f.channel||"system"}`},T("div",{className:"codex-output-meta"},T("span",{className:"codex-output-channel"},BO(String(f.channel||"system"))),T("span",null,wu(f.at)),f.method?T("code",null,f.method):null),T("pre",null,String(f.text||""))))))}function fZ({task:u}){let l=dE(u).slice().reverse();if(l.length===0)return T(Si,{title:"尚无 attempt",text:"任务开始运行后,这里会记录 Codex 终态、传输中断和 stderr tail。"});return T("div",{className:"table-wrap codex-attempt-table"},T("table",null,T("thead",null,T("tr",null,T("th",null,"#"),T("th",null,"模式"),T("th",null,"终态"),T("th",null,"传输"),T("th",null,"退出"),T("th",null,"完成时间"))),T("tbody",null,l.map((f)=>T("tr",{key:`${f.index}-${f.startedAt}`},T("td",null,f.index),T("td",null,f.mode),T("td",null,T(pi,{status:f.terminalStatus||"unknown"},f.terminalStatus||"unknown")),T("td",null,f.transportClosedBeforeTerminal?T(pi,{status:"failed"},"closed-before-terminal"):T(pi,{status:"succeeded"},"normal")),T("td",null,`code=${f.appServerExitCode??"--"} signal=${f.appServerSignal??"--"}`),T("td",null,wu(f.finishedAt)))))))}function tN({microservices:u,onRaw:l,apiBaseUrl:f="/api",initialTasksData:r=null,standalone:n=!1}){let i=u.find((V)=>V.id==="code-queue")||null,t=DQ(r),y=String(t?.id||""),c=new Map;if(t!==null&&y.length>0)c.set(y,{task:t,maxSeq:u3(Array.isArray(t.transcript)?t.transcript:[]),complete:Boolean(t._transcriptComplete),completeUpdatedAt:t._transcriptComplete?String(t.updatedAt||""):""});let $=typeof performance>"u"?0:performance.now(),A=Ml(y),j=Ml(0),F=Ml(0),J=Ml(0),Q=Ml(!1),W=Ml(!1),L=Ml(!1),U=Ml(null),q=Ml(new Map),N=Ml(new Map),w=Ml(new Map),G=Ml(new Map),Z=Ml(new Set),H=Ml(null),E=Ml(null),m=Ml(!1),S=Ml(!1),B=Ml(Boolean(r)),D=Ml(new Map),X=Ml(new Set),O=Ml(c),Y=Ml(r),[p,v]=vu(null),[z,P]=vu(r),[k,I]=vu(y),[b,d]=vu(t),[s,h]=vu(!1),[lu,cu]=vu(""),[_u,Fu]=vu(null),[zu,Wu]=vu(!1),[C,e]=vu(!1),uu=r?.queue||{},Gu=String(uu?.mainProviderId||uu?.defaultProviderId||"D601").trim()||"D601",[a,qu]=vu(""),[Zu,Bu]=vu(""),[gu,ll]=vu("default"),[Pu,Nl]=vu(D0),[Qf,Zf]=vu(!1),[$f,nf]=vu(""),[tf,Mf]=vu(Gu),[$u,au]=vu("default"),[Nf,Yu]=vu("gpt-5.5"),[Sl,dl]=vu(a1(uu,"default",Gu)||"/workspace"),[rr,Af]=vu(99),[Hf,Gn]=vu(1),[nr,u0]=vu(!1),[$l,lt]=vu(!1),[fu,Vu]=vu(""),[Xu,ou]=vu(""),[Al,kl]=vu(""),[_l,qf]=vu(!0),[Sr,Dy]=vu(()=>typeof window>"u"?!0:window.matchMedia(ME).matches),[Kl,n_]=vu(!1),[aA,Ul]=vu(""),[O7,Xl]=vu(""),{addNotification:Bf}=Xf(),[ft,py]=vu(""),[rt,i_]=vu(""),[Sy,t_]=vu(!1),[y_,fi]=vu(null),[nt,ri]=vu(!1),[Rf,Xr]=vu(r?{phase:"complete",taskId:y,queueMs:0,detailMs:0,totalMs:$,chunks:t?1:0,transcriptRows:Array.isArray(t?.transcript)?t.transcript.length:0,partial:Boolean(r?.selected?.hasMore||I1(t)),completedAt:new Date}:null),[c_,Xy]=vu(r?new Date:null),[Yy,__]=vu(!1),fn=l0(vl(z)),Py=fn.filter(Rn),Yl=z?.queue||p?.body?.queue||p?.queue||{},oA=pO(z,Yl),$_=B0(z),Yr=TQ(Yl,gu),ni=String(gu||"default").trim()||"default",ii=Yr.filter((V)=>String(V?.id||"")!==ni),it=et(Yr,Pu),ti=Number((sf(Pu)?Yl?.total:it?.total)??$_.total??fn.length),tt=g1(Yl),Z7=sf(Pu)?tt:[String(et(Yr,Pu)?.activeTaskId||"")].filter(Boolean),yi=KQ(Yl,Yr,Pu,fn),H7=sf(Pu)?d4(Yl):d4(it||{}),A_=d4(Yl),Cy=mO(A_),dA=Math.max(DO(A_),tt.length),eA=sl((sf(Pu)?Yl?.unreadTerminal:it?.unreadTerminal)??Py.length),zn=z?Py.length:eA,j_=sf(Pu)?"All queues":i2(it||{id:Pu,name:Pu}),My=n2(lu),wr=My.length>0,B7=wr?l0(vl(_u)):[],u6=B0(_u),rn=wr?B7:fn,V7=rn.filter(Rn),cT=rn.filter((V)=>!sr(V)).sort(YE),_T=rn.filter((V)=>sr(V)&&!Rn(V)),m7=wr?u6:$_,yt=wr?Number(u6.total??B7.length):ti,D7=m7.hasMore===!0&&String(m7.nextBeforeId||"").length>0,l6=wr?C:Yy,$T=i?pE(i):{},AT=i?SE(i):{},f6=wQ(()=>eE(a),[a]),En=wQ(()=>{let V=EQ(Hf);return f6.flatMap((M)=>Array.from({length:V},()=>uO(M,Zu)))},[f6,Hf,Zu]),Ry=En.length,p7=Ry>1&&!nr,jT=$l||Kl||Ry===0||p7,S7=MO(Yl,Nf),F_=RO(Yl,tf),X7=xO(Yl,$u),Y7=a1(Yl,$u,tf),FT=Array.isArray(y_?.workdirs)?y_.workdirs:[],P7=bO(Yl,FT,tf,$u,Sl),r6=P7.some((V)=>V.source==="saved"&&uy(V.path)===uy(Sl)),n6=b?.id&&b?.activeTurnId&&String(b?.status)==="running",UT=b?.id&&!["succeeded","failed","canceled"].includes(String(b?.status||"")),JT=b?.id&&["succeeded","failed","canceled"].includes(String(b?.status||"")),ct=b?.id&&uN(b);function xf(V){let M=typeof V==="function"?V(Y.current):V;return Y.current=M,P(M),M}function QT(V,M,g=!0){let ru=Array.from(new Set(V.map((ju)=>String(ju||"")).filter(Boolean)));for(let ju of ru)if(D.current.set(ju,M),g)X.current.add(ju);return ru}function C7(V){for(let M of V.map((g)=>String(g||"")).filter(Boolean))D.current.delete(M),X.current.delete(M)}function U_(V){let M=String(V?.id||""),g=M?D.current.get(M):void 0;if(!g)return V;if(String(V?.status||"").length>0&&!sr(V))return D.current.delete(M),X.current.delete(M),V;return{...V,readAt:V?.readAt||g,terminalUnread:!1}}function i6(V){let M=String(V?.id||"");return M.length>0&&X.current.has(M)&&sr(V)}function l0(V,M=!0){let g=[];for(let ru of Array.isArray(V)?V:[]){let ju=U_(ru);if(M&&i6(ju))continue;g.push(ju)}return g}function NT(V,M=!0){if(!V||!Array.isArray(V?.tasks))return V;let g=l0(vl(V),M),ru=B0(V);return{...V,tasks:g,pagination:V.pagination?{...ru,returned:g.length}:V.pagination}}function qT(V){let M=String(V||Yl?.mainProviderId||"D601").trim()||"D601";Mf(M),dl(a1(Yl,$u,M)),fi(null),$6().catch((g)=>Ul(bl(g,"加载工作目录失败")))}function wT(V){let M=String(V||"default").trim()||"default",g=tf;if(M==="windows-native"){if(!F_.find((ju)=>ju.id===tf)?.supportsWindowsNativeCodex)g=String(F_.find((ju)=>ju.supportsWindowsNativeCodex)?.id||tf||"D601"),Mf(g)}au(M),dl(a1(Yl,M,g)),fi(null),$6().catch((ru)=>Ul(bl(ru,"加载工作目录失败")))}function J_(V,M,g=null,ru=null){let ju=new Set(QT(V,M));if(ju.size===0&&ru===null&&g===null)return;xf((Lu)=>{if(!Lu)return Lu;let Tu=vl(Lu).flatMap((xu)=>{let hu=String(xu?.id||"");if(!ju.has(hu)){let tl=U_(xu);return i6(tl)?[]:[tl]}let Mu=ru&&String(ru?.id||"")===hu?ru:{},ku={...xu,...Mu,readAt:M,terminalUnread:!1};return i6(ku)?[]:[ku]});return{...Lu,queue:g||Lu.queue,tasks:ju.size>0?V0([Tu],yi):Tu}});for(let Lu of ju){let Tu=O.current.get(Lu);if(Tu?.task){let xu=ru&&String(ru?.id||"")===Lu?ru:{},hu={...Tu.task,...xu,readAt:M,terminalUnread:!1};if(O.current.set(Lu,{...Tu,task:hu}),A.current===Lu)d(hu)}}}Mn(()=>{u0(!1)},[a,Hf,Zu]),Mn(()=>{let V=n2(lu);F.current+=1;let M=F.current;if(!i||V.length===0){Fu(null),Wu(!1),e(!1),L.current=!1;return}Wu(!0),Fu(null);let g=window.setTimeout(()=>{(async()=>{try{let ru=await GQ(f,Pu,V);if(M!==F.current)return;Fu(NT(ru))}catch(ru){if(M===F.current)Fu(null),Ul(bl(ru,"搜索 Codex tasks 失败"))}finally{if(M===F.current)Wu(!1)}})()},240);return()=>window.clearTimeout(g)},[i?.id,f,Pu,lu]),Mn(()=>{ou(b?l3(b):""),kl(Array.isArray(b?.referenceTaskIds)?b.referenceTaskIds.join(" "):"")},[k]);function Pr(V,M,g){let ru=O.current.get(V)||{},ju=ru.task||{},Lu=Array.isArray(ju.transcript)?ju.transcript:[],Tu=mQ(ju,M),xu=Object.prototype.hasOwnProperty.call(M,"transcript")?l2(Lu,Array.isArray(M.transcript)?M.transcript:[]):Lu,hu={...ju,...Tu,transcript:xu,output:Array.isArray(Tu.output)?_2(ju,Tu,"output"):Array.isArray(ju.output)?ju.output:[],events:Array.isArray(Tu.events)?_2(ju,Tu,"events"):Array.isArray(ju.events)?ju.events:[]},Mu=U_(hu),ku=String(Mu?.updatedAt||""),tl=Boolean(M._transcriptComplete)&&sr(Mu),el=Boolean(ru.complete)&&sr(Mu)&&String(ru.completeUpdatedAt||"")===ku,ul=tl||el,yf={...ru,task:Mu,maxSeq:u3(xu),complete:ul,completeUpdatedAt:ul?ku:""};if(O.current.set(V,yf),g===J.current&&A.current===V)d(Mu);return yf}async function ci(V,M=!1,g,ru){if(!i||!V)return;let Lu=O.current.get(V)?.task;if(!M&&d$(Lu))return;let Tu=V,xu=q.current.get(Tu);if(xu){if(M||!d$(Lu))xu.refreshAfter=!0;return xu.promise}let hu=J.current,Mu=performance.now();if(A.current===V)h(!0);let ku={promise:Promise.resolve(),refreshAfter:!1},tl=(async()=>{try{let el=await vE(f,V);if(hu!==J.current||A.current!==V)return;let ul=el?.summary||{},yf=String(ul.updatedAt||"");Pr(V,{id:V,status:ul.status,updatedAt:yf,startedAt:ul.startedAt,finishedAt:ul.finishedAt,currentAttempt:ul.currentAttempt,maxAttempts:ul.maxAttempts,finalResponse:ul.finalResponse,lastJudge:ul.lastJudge,lastError:ul.lastError,attempts:Array.isArray(ul.attempts)?ul.attempts:[],stepCount:ul.stepCount,llmStepCount:ul.llmStepCount,traceStats:ul.traceStats,statsSource:ul.statsSource,timing:ul.timing,_traceSummary:ul,_traceSummaryLoaded:!0,_traceSummaryUpdatedAt:yf,_detailLoaded:!0},hu),Xr({phase:"complete",taskId:V,queueMs:ru??0,detailMs:performance.now()-Mu,totalMs:g===void 0?performance.now()-Mu:performance.now()-g,chunks:1,transcriptRows:Number(ul?.execution?.traceLineCount||ul?.execution?.stepCount||0),partial:!1,completedAt:new Date})}finally{let el=Boolean(ku.refreshAfter&&A.current===V&&!d$(O.current.get(V)?.task));if(q.current.delete(Tu),hu===J.current&&A.current===V)h(!1);if(el)window.setTimeout(()=>{ci(V,!0).catch((ul)=>Ul(bl(ul,"自动刷新 Trace Summary 失败")))},0)}})();ku.promise=tl,q.current.set(Tu,ku),await tl}async function WT(V,M=null){let g=A.current;if(!i||!g||!V)return;let ru=O.current.get(g)?.task,ju=f3(ru),Lu=V==="feedback"||V==="judge-feedback"?aQ(M):V;if(ju[Lu]?.text)return;let Tu=`${g}:${Lu}`,xu=N.current.get(Tu);if(xu)return xu;let hu=J.current;if(A.current===g)h(!0);let Mu=(async()=>{try{let ku=await kE(f,g,V,M);if(hu!==J.current||A.current!==g)return;let tl=O.current.get(g)?.task,el=f3(tl);Pr(g,{...V==="full"?{prompt:String(ku?.text||""),promptChars:Number(ku?.chars||0)}:{},_promptDetails:{...el,[Lu]:ku}},hu)}finally{if(N.current.delete(Tu),hu===J.current&&A.current===g)h(!1)}})();N.current.set(Tu,Mu),await Mu}async function t6(V=null,M={}){let g=A.current;if(!i||!g)return;let ru=O.current.get(g)?.task,ju=V===null||V===void 0||String(V).length===0?"":String(V),Lu=t2(ru,ju||null),Tu=Boolean(M.force),xu=Boolean(M.incremental);if(Lu&&!Tu)return;let hu=oQ(ru,ju||null),Mu=xu&&hu.length>0?UO(hu):0,ku=`${g}:${ju||"all"}:${Mu}`,tl=w.current.get(ku);if(tl)return tl;let el=J.current;if(A.current===g)h(!0);let ul=(async()=>{try{let yf=await IE(f,g,Mu,500,ju||null);if(el!==J.current||A.current!==g)return;let nn=Array.isArray(yf?.steps)?yf.steps:[],On=Mu>0?JO(hu,nn):nn;if(ju){let f0=O.current.get(g)?.task,_t=Ll(f0?._traceStepsByAttempt)||{},Cr=Ll(f0?._traceStepsLoadedByAttempt)||{},Wr=Ll(f0?._traceStepsNextAfterSeqByAttempt)||{};Pr(g,{_traceStepsByAttempt:{..._t,[ju]:On},_traceStepsLoadedByAttempt:{...Cr,[ju]:!0},_traceStepsNextAfterSeqByAttempt:{...Wr,[ju]:yf?.nextAfterSeq}},el)}else Pr(g,{_traceSteps:On,_traceStepsLoaded:!0,_traceStepsHasMore:Boolean(yf?.hasMore),_traceStepsNextAfterSeq:yf?.nextAfterSeq},el)}finally{if(w.current.delete(ku),el===J.current&&A.current===g)h(!1)}})();w.current.set(ku,ul),await ul}async function LT(V){let M=A.current,g=String(V??"");if(!i||!M||g.length===0)return;let ru=O.current.get(M)?.task;if(y2(ru)[g]?.line)return;let Lu=`${M}:${g}`,Tu=G.current.get(Lu);if(Tu)return Tu;let xu=J.current;if(A.current===M)h(!0);let hu=(async()=>{try{let Mu=await gE(f,M,V);if(xu!==J.current||A.current!==M)return;let ku=O.current.get(M)?.task,tl=y2(ku);Pr(M,{_traceStepDetails:{...tl,[g]:Mu}},xu)}finally{if(G.current.delete(Lu),xu===J.current&&A.current===M)h(!1)}})();G.current.set(Lu,hu),await hu}function TT(V){if(A.current!==V)return;let M=O.current.get(V)?.task;if(!M)return;if(t2(M,null))t6(null,{force:!0,incremental:!0}).catch((ru)=>Ul(bl(ru,"增量刷新 Trace Steps 失败")));let g=Ll(M?._traceStepsLoadedByAttempt)||{};for(let ru of Object.keys(g).filter((ju)=>g[ju]))t6(ru,{force:!0,incremental:!0}).catch((ju)=>Ul(bl(ju,"增量刷新 Attempt Trace Steps 失败")))}async function sY(V,M,g){if(!i||!V)return;let ru=performance.now(),ju=J.current,Lu=O.current.get(V);if(Lu?.task){if(d(Lu.task),h(I1(Lu.task)||!Lu.complete),!I1(Lu.task)&&Lu.complete&&sr(Lu.task)&&String(Lu.completeUpdatedAt||"")===String(Lu.task?.updatedAt||"")){Xr({phase:"complete",taskId:V,queueMs:g??0,detailMs:0,totalMs:M===void 0?0:performance.now()-M,chunks:0,transcriptRows:Array.isArray(Lu.task.transcript)?Lu.task.transcript.length:0,completedAt:new Date});return}}else h(!0);let Tu=U.current;if(Tu?.taskId===V&&Tu.token===ju)return Tu.promise;let xu=(async()=>{try{let hu=await ml(Dl(f,`/api/tasks/${encodeURIComponent(V)}?meta=1`));if(ju!==J.current||A.current!==V)return;let Mu=O.current.get(V),ku=Array.isArray(Mu?.task?.transcript)?Mu.task.transcript:[],tl=hu?.task||{},el=Boolean(Mu?.complete)&&String(Mu?.completeUpdatedAt||"")===String(tl?.updatedAt||"");Pr(V,{...tl,summaryOnly:!1,_metaLoaded:!0,transcript:ku,_detailLoaded:ku.length>0,_transcriptComplete:el},ju);let ul=I1(Mu?.task)||Boolean(Mu?.task?._transcriptPreview),yf=ul?0:ku.length>0?pQ(ku):0,nn=!ul&&Mu?.complete&&sr(tl)&&String(Mu?.completeUpdatedAt||"")===String(tl?.updatedAt||"")?u3(ku):yf,On=!0,f0=0,_t=ku.length;while(On){let Cr=await ml(Dl(f,`/api/tasks/${encodeURIComponent(V)}/transcript?afterSeq=${encodeURIComponent(String(nn))}&limit=${VE}&fullText=1`));if(ju!==J.current||A.current!==V)return;let Wr=O.current.get(V),$t=Array.isArray(Wr?.task?.transcript)?Wr.task.transcript:[],_i=l2($t,Array.isArray(Cr?.transcript)?Cr.transcript:[]);f0+=1,_t=_i.length;let Pl=Boolean(!Cr?.hasMore);if(Pr(V,{status:Cr?.status||tl.status,updatedAt:Cr?.updatedAt||tl.updatedAt,transcript:_i,_detailLoaded:Pl||_i.length>0,_transcriptComplete:Pl,_transcriptPreview:ul&&!Pl},ju),On=Boolean(Cr?.hasMore),nn=Number(Cr?.nextAfterSeq??u3(_i)),!On)break;await new Promise((g7)=>window.setTimeout(g7,0))}Xr({phase:"complete",taskId:V,queueMs:g??0,detailMs:performance.now()-ru,totalMs:M===void 0?performance.now()-ru:performance.now()-M,chunks:f0,transcriptRows:_t,completedAt:new Date})}finally{if(U.current?.taskId===V&&U.current?.token===ju)U.current=null;if(ju===J.current&&A.current===V)h(!1)}})();U.current={taskId:V,token:ju,promise:xu},await xu}async function hf(V=A.current,M=!0,g=Pu){if(!i)return;if(!M&&S.current)return;let ru=performance.now();if(M)S.current=!0;if(M)Xr({phase:"loading",taskId:String(V||A.current||""),startedAt:new Date});let ju=j.current+1;j.current=ju;let Lu=String(V||A.current||""),Tu=Lu?O.current.get(Lu):null,xu=Array.isArray(Tu?.task?.transcript)?Tu.task.transcript:[],hu=pQ(xu),Mu=null,ku=M&&Lu.length===0;if(Mu=ku?await GQ(f,g,""):await o4(f,Lu,hu,g,"",!0,{stats:!1}),ju!==j.current){if(M)S.current=!1;return}let tl=performance.now()-ru;v(p||{});let el=Mu?.queue||{},ul=String(el?.activeTaskId||g1(el)[0]||""),yf=Mu;xf((Il)=>{let r0=vl(Mu),ir=vl(Il),Lr=ir.length>0?V0([ir,r0],ul):V0([r0],ul),n0=l0(Lr),Q_=B0(Mu),$i=B0(Il),j6=ir.length>r0.length&&($i.hasMore===!1||String($i.nextBeforeId||"").length>0),dT={...Q_,...j6?{hasMore:$i.hasMore,nextBeforeId:$i.nextBeforeId}:{},returned:n0.length};return yf={...Mu,tasks:n0,pagination:dT},yf});let nn=vl(yf),On=TQ(el,gu),f0=KQ(el,On,g,nn),_t=bE(On,g,nn),Cr=Lu||A.current,Wr=yf?.selected||null,$t=Wr?.task||null,_i=Array.isArray(Wr?.transcript)?Wr.transcript:null,Pl=Cr||f0||_t||nn[0]?.id||"";if(A.current!==Pl)J.current+=1;A.current=Pl,I(Pl);let At=nn.find((Il)=>Il.id===Pl);if(At){let Il=O.current.get(Pl);if(Il?.task)O.current.set(Pl,{...Il,task:{...At,...Il.task,status:At.status,updatedAt:At.updatedAt}})}if(ku&&At){if(Pr(Pl,{...At,_summaryLoaded:!1,transcript:[],_detailLoaded:!1,_transcriptComplete:!1,_transcriptPreview:!0},J.current),h(!0),Xr({phase:"complete",taskId:Pl,queueMs:tl,detailMs:0,totalMs:performance.now()-ru,chunks:0,transcriptRows:0,partial:!0,completedAt:new Date}),Xy(new Date),M)S.current=!1;ci(Pl,!0).catch((Il)=>Ul(bl(Il,"加载 Codex Trace Summary 失败"))),o4(f,Pl,0,g,"",!1).then((Il)=>{if(ju!==j.current)return;let r0=vl(Il),ir=DQ(Il);if(r0.length>0)xf((Lr)=>{let n0=V0([vl(Lr),r0],ul);return{...Lr,statistics:Il?.statistics||Lr?.statistics,tasks:l0(n0)}});if(ir?.id===A.current){let Lr=Array.isArray(ir.transcript)?ir.transcript:[];Pr(ir.id,{...ir,transcript:Lr,_summaryLoaded:!0,_detailLoaded:Lr.length>0,_transcriptPreview:Boolean(Il?.selected?.preview)},J.current)}}).catch(()=>{});return}if($t?.id===Pl&&_i!==null){let Il=O.current.get(Pl),r0=Array.isArray(Il?.task?.transcript)?Il.task.transcript:[],ir=l2(r0,_i),Lr=Boolean(Wr?.preview);if(Pr(Pl,{...$t,_summaryLoaded:!0,transcript:ir,_detailLoaded:!Wr?.hasMore||ir.length>0,_transcriptComplete:!Lr&&!Wr?.hasMore&&sr($t),_transcriptPreview:Lr},J.current),h(!1),M)Xr({phase:"complete",taskId:Pl,queueMs:tl,detailMs:Math.max(0,performance.now()-ru-tl),totalMs:performance.now()-ru,chunks:1,transcriptRows:ir.length,partial:Boolean(Lr||Wr?.hasMore||I1($t)),completedAt:new Date});if(Xy(new Date),M)S.current=!1;ci(Pl,!1,M?ru:void 0,M?tl:void 0).catch((n0)=>Ul(bl(n0,"加载 Codex Trace Summary 失败"))),o4(f,Lu,hu,g,"",!1).then((n0)=>{if(ju!==j.current)return;let Q_=vl(n0);if(Q_.length>0)xf(($i)=>{let j6=V0([vl($i),Q_],ul);return{...$i,tasks:l0(j6)}})}).catch(()=>{});return}if(M)Xr({phase:"session",taskId:Pl,queueMs:tl,totalMs:tl,startedAt:new Date(Date.now()-tl)});if(Pl)ci(Pl,!0,M?ru:void 0,M?tl:void 0).catch((Il)=>Ul(bl(Il,"加载 Codex Trace Summary 失败")));else if(J.current+=1,d(null),h(!1),M)Xr({phase:"complete",taskId:"",queueMs:tl,detailMs:0,totalMs:performance.now()-ru,chunks:0,transcriptRows:0,completedAt:new Date});if(Xy(new Date),M)S.current=!1}async function M7(){if(wr){if(!i||C||L.current)return;let M=String(u6.nextBeforeId||"");if(!M)return;L.current=!0,e(!0),Ul("");try{let g=await zQ(f,Pu,M,YQ,My),ru=vl(g),ju=g?.queue||Yl||{},Lu=String(ju?.activeTaskId||g1(ju)[0]||yi||"");Fu((Tu)=>{let xu=l0(V0([vl(Tu),ru],Lu)),hu=B0(g);return{...Tu||{},queue:ju,tasks:xu,pagination:{...hu,returned:xu.length}}})}catch(g){Ul(bl(g,"加载更多搜索结果失败"))}finally{L.current=!1,e(!1)}return}if(!i||Yy||W.current)return;let V=String(B0(z).nextBeforeId||"");if(!V)return;W.current=!0,__(!0),Ul("");try{let M=await zQ(f,Pu,V),g=vl(M),ru=M?.queue||Yl||{},ju=String(ru?.activeTaskId||g1(ru)[0]||yi||"");xf((Lu)=>{let Tu=l0(V0([vl(Lu),g],ju)),xu=B0(M);return{...Lu||{},queue:ru,statistics:M?.statistics||Lu?.statistics,tasks:Tu,pagination:{...xu,returned:Tu.length}}})}catch(M){Ul(bl(M,"加载更早 Codex tasks 失败"))}finally{W.current=!1,__(!1)}}function KT(V){let M=V.currentTarget;if(!M||l6||!D7)return;if(M.scrollHeight-M.scrollTop-M.clientHeight<120)M7()}async function Vf(V,M){n_(!0),Ul("");try{await V()}catch(g){Ul(bl(g,M))}finally{n_(!1)}}async function y6(V){if(!V)return;try{let M=!1;try{if(navigator.clipboard?.writeText)await navigator.clipboard.writeText(V),M=!0}catch{M=!1}if(!M){let ru=document.createElement("textarea");ru.value=V,ru.style.position="fixed",ru.style.opacity="0",document.body.appendChild(ru),ru.select(),M=document.execCommand("copy"),document.body.removeChild(ru)}if(!M)throw Error("browser clipboard rejected the copy request");py(V);let g=`已复制任务 ID:${V}`;Xl(g),Bf("success",g),window.setTimeout(()=>py((ru)=>ru===V?"":ru),1600)}catch(M){Ul(`复制任务 ID 失败:${bl(M)}`)}}function c6(V){if(!V)return;Bu(V);let M=`已引用任务 ID:${V};提交时后端会读取并注入该任务上下文`;Xl(M),Bf("success",M)}async function _6(V){if(!i||!V)return;let M=new Date().toISOString();j.current+=1,J_([V],M,null,{id:V,readAt:M,terminalUnread:!1}),i_(V);let g=!1;if(await Vf(async()=>{let ru=await sE(f,V),ju=ru?.task||{id:V,readAt:new Date().toISOString(),terminalUnread:!1},Lu=String(ju?.readAt||new Date().toISOString());J_([V],Lu,ru?.queue||null,ju),g=!0;let Tu=`已将任务 ${V} 标为已读`;Xl(Tu),Bf("success",Tu)},"标记 Codex task 已读失败"),!g)C7([V]),hf(A.current,!1).catch((ru)=>Ul(bl(ru,"刷新 Codex tasks 失败")));i_((ru)=>ru===V?"":ru)}async function GT(){if(!i||Sy)return;t_(!0);let V=new Date().toISOString(),M=Array.from(new Set([...vl(Y.current).filter(Rn).map((ru)=>String(ru?.id||"")).filter(Boolean),...Array.from(O.current.entries()).filter(([,ru])=>Rn(ru?.task)).map(([ru])=>ru)]));if(j.current+=1,M.length>0)J_(M,V);let g=!1;if(await Vf(async()=>{let ru=await aE(f),ju=String(ru?.readAt||new Date().toISOString()),Lu=vl(Y.current).filter(Rn).map((ku)=>String(ku?.id||"")).filter(Boolean),Tu=Array.from(O.current.entries()).filter(([,ku])=>Rn(ku?.task)).map(([ku])=>ku),xu=Array.from(new Set([...M,...Lu,...Tu]));J_(xu,ju,ru?.queue||null);let hu=Number(ru?.count||xu.length);g=!0;let Mu=`已将 ${hu} 个已结束未读任务标为已读`;Xl(Mu),Bf("success",Mu)},"全部标为已读失败"),!g&&M.length>0)C7(M),hf(A.current,!1).catch((ru)=>Ul(bl(ru,"刷新 Codex tasks 失败")));t_(!1)}function zT(V){let M=V||D0;if(Nl(M),!sf(M))ll(M);if(xf(null),!(sf(M)?A.current:""))A.current="",J.current+=1,I(""),d(null),h(!0)}async function $6(){if(!i)return;let V=await ml(Dl(f,"/api/workdirs"));fi(V)}async function ET(){let V=Sl.trim()||Y7||"/workspace",M=typeof window>"u"?V:window.prompt("输入新的工作目录绝对路径",V),g=String(M||"").trim();if(!g)return;ri(!0),await Vf(async()=>{let ru=await ml(Dl(f,"/api/workdirs"),{method:"POST",body:{providerId:tf,executionMode:$u,path:g,ensure:!0}});fi((Lu)=>({...Lu||{},...ru})),dl(String(ru?.workdir?.path||g));let ju=`已保存工作目录:${String(ru?.workdir?.path||g)}`;Xl(ju),Bf("success",ju)},"创建工作目录失败"),ri(!1)}async function OT(){let V=uy(Sl);if(!r6){Xl("当前工作目录还没有保存到下拉菜单。");return}if(!(typeof window>"u"?!0:window.confirm(`从下拉菜单删除工作目录选项? +${V} + +不会删除磁盘上的实际目录。`)))return;ri(!0),await Vf(async()=>{let g=await ml(Dl(f,`/api/workdirs/${encodeURIComponent(tf)}/${encodeURIComponent($u)}/${encodeURIComponent(V)}`),{method:"DELETE"});fi((ju)=>({...ju||{},...g}));let ru=`已从下拉菜单删除工作目录:${V}`;Xl(ru),Bf("success",ru)},"删除工作目录失败"),ri(!1)}async function ZT(){let V=typeof window>"u"?"":window.prompt("输入新的 Codex queue ID(字母/数字/._-,最长 64)","new-lane"),M=String(V||"").trim();if(!M)return;await Vf(async()=>{let g=await ml(Dl(f,"/api/queues"),{method:"POST",body:{queueId:M}}),ru=String(g?.queue?.id||M);ll(ru),Nl(ru),xf(null),A.current="",J.current+=1,I(""),d(null);let ju=`已创建并切换到 queue:${ru}`;Xl(ju),Bf("success",ju),await hf("",!0,ru)},"创建 Codex queue 失败")}async function HT(){let V=String(gu||"default").trim()||"default",M=et(Yr,V)||{id:V,name:V},g=typeof window>"u"?null:window.prompt(`输入 queue 显示名称(ID 不变:${V};留空恢复为 ID)`,RQ(M));if(g===null)return;await Vf(async()=>{let ru=await ml(Dl(f,`/api/queues/${encodeURIComponent(V)}`),{method:"PATCH",body:{name:String(g)}}),ju=ru?.queue||{id:V,name:String(g||V)};if(ru?.summary)xf((Tu)=>Tu?{...Tu,queue:ru.summary}:Tu);let Lu=`已更新 queue 名称:${i2(ju)}`;Xl(Lu),Bf("success",Lu),await hf(A.current,!0,Pu)},"修改 Codex queue 名称失败")}function BT(){if(ii.length===0){Xl("没有可合并的其他 queue;请先创建或选择另一个 queue。");return}let V=ii.some((M)=>String(M?.id||"")===$f)?$f:"";nf(V),Zf(!0)}async function VT(){let V=ni;if(ii.length===0){Xl("没有可合并的其他 queue;请先创建或选择另一个 queue。");return}let g=String($f||""||"").trim();if(!g){Xl("请先选择要合并的源 queue。");return}if(g===V){Ul("源 queue 和目标 queue 不能相同。");return}await Vf(async()=>{let ru=await ml(Dl(f,`/api/queues/${encodeURIComponent(V)}/merge`),{method:"POST",body:{sourceQueueId:g}});if(ru?.summary)xf((Tu)=>Tu?{...Tu,queue:ru.summary}:Tu);ll(V),Nl(V),xf(null);let ju=Number(ru?.mergedTaskCount||0),Lu=`已将 queue=${g} 合并到 ${V},移动 ${ju} 个任务;源 queue 已自动删除。`;Xl(Lu),Bf("success",Lu),Zf(!1),nf(""),await hf(A.current,!0,V)},"合并 Codex queue 失败")}async function mT(V){if(V.preventDefault(),Q.current){Xl("任务正在提交中,请等待当前请求完成,已阻止重复提交。");return}if(En.length>1&&!nr){Ul(`检测到将创建 ${En.length} 个任务;请先勾选“确认批量入队”,避免误传多个任务。`);return}Q.current=!0,lt(!0),Xl("正在提交 Code Queue 任务,请等待后端确认,输入已临时锁定。"),await Vf(async()=>{if(En.length===0)throw Error("prompt 不能为空");let M=Vi(Zu),g=gu.trim()||"default",ru=[...En],ju=(ku)=>({prompt:ku,queueId:g,providerId:tf,executionMode:$u,model:Nf,cwd:Sl,maxAttempts:Number(rr),...M.length>0?{referenceTaskIds:M}:{}}),Lu=ru.length===1?ju(ru[0]):{tasks:ru.map(ju)},Tu=await ml(Dl(f,ru.length===1?"/api/tasks":"/api/tasks/batch"),{method:"POST",body:Lu}),xu=Tu?.tasks?.[0]?.id||"",hu=Array.isArray(Tu?.tasks)?Tu.tasks.map((ku)=>String(ku?.id||"")).filter(Boolean):[],Mu=`已创建 ${hu.length||ru.length} 个任务${hu.length>0?`:${hu.join(" / ")}`:""}`;if(Xl(Mu),Bf("success",Mu),qu(""),Bu(""),u0(!1),A.current=xu,Pu!==g)xf(null);ll(g),await hf(xu,!0,g)},"Codex 任务入队失败"),Q.current=!1,lt(!1)}async function DT(V){if(V.preventDefault(),!b?.id)return;await Vf(async()=>{await ml(Dl(f,`/api/tasks/${encodeURIComponent(b.id)}/steer`),{method:"POST",body:{prompt:fu}}),Vu(""),await hf(b.id)},"追加 prompt 失败")}async function pT(V){V.preventDefault();let M=String(b?.id||"");if(!M||!ct)return;await Vf(async()=>{let g=Vi(Al),ru=await ml(Dl(f,`/api/tasks/${encodeURIComponent(M)}/edit`),{method:"POST",body:{prompt:Xu,referenceTaskIds:g}}),ju={...ru?.task||b||{},_traceSummary:null,_traceSummaryLoaded:!1,_traceSummaryUpdatedAt:"",_promptDetails:{},_traceSteps:[],_traceStepsLoaded:!1,_traceStepsByAttempt:{},_traceStepsLoadedByAttempt:{},_traceStepsNextAfterSeqByAttempt:{},_traceStepDetails:{}};O.current.set(M,{...O.current.get(M)||{},task:ju,complete:!1,completeUpdatedAt:""}),A.current=M,d(ju),I(M),ou(l3(ju)),kl(Array.isArray(ju?.referenceTaskIds)?ju.referenceTaskIds.join(" "):""),xf((Tu)=>{if(!Tu)return Tu;let xu=vl(Tu).map((hu)=>String(hu?.id||"")===M?{...hu,...ju}:hu);return{...Tu,queue:ru?.queue||Tu.queue,tasks:V0([xu],yi)}});let Lu=ru?.changed===!1?`任务 ${M} 的 prompt 未变化`:`已更新 queued 任务 ${M} 的用户 prompt`;Xl(Lu),Bf("success",Lu),await hf(M,!0,Pu)},"编辑 queued 任务 prompt 失败")}async function ST(){if(!b?.id)return;await Vf(async()=>{await ml(Dl(f,`/api/tasks/${encodeURIComponent(b.id)}/interrupt`),{method:"POST",body:{}}),await hf(b.id)},"打断 Codex session 失败")}async function XT(){if(!b?.id)return;await Vf(async()=>{await ml(Dl(f,`/api/tasks/${encodeURIComponent(b.id)}/retry`),{method:"POST",body:{}}),await hf(b.id)},"重新入队失败")}async function YT(V){let M=String(b?.id||""),g=String(V||"").trim();if(!M||!g)return;let ru=o1(b);if(g===ru){Xl(`任务 ${M} 已在 queue=${g}`);return}await Vf(async()=>{let Lu=(await ml(Dl(f,`/api/tasks/${encodeURIComponent(M)}/move`),{method:"POST",body:{queueId:g}}))?.task||{...b,queueId:g};if(O.current.set(M,{...O.current.get(M)||{},task:Lu}),A.current=M,d(Lu),I(M),ll(g),!sf(Pu))xf(null),Nl(g);let Tu=`已将任务 ${M} 从 ${ru} 移动到 ${g}`;Xl(Tu),Bf("success",Tu),await hf(M,!0,sf(Pu)?D0:g)},"移动任务 queue 失败")}async function PT(){let V=A.current;if(!V)return;let M=performance.now();await Vf(async()=>{Xr({phase:"session",taskId:V,queueMs:0,totalMs:0,partial:!0,startedAt:new Date}),await ci(V,!0,M,0)},"刷新 Trace Summary 失败")}function CT(V){A.current=V,J.current+=1,I(V);let M=O.current.get(V);if(M?.task)d(M.task),h(!1);else{h(!0);let g=fn.find((ru)=>ru.id===V);if(g)d(g);else d(null)}hf(V).catch((g)=>Ul(bl(g,"切换 Codex session 失败")))}function A6(V){if(CT(V),RE())Dy(!1)}function R7(V,M,g){if(!V||!Array.isArray(V?.tasks)||M.length===0||Object.keys(g).length===0)return V;let ru=!1,ju=vl(V).map((Lu)=>{if(String(Lu?.id||"")!==M)return Lu;return ru=!0,U_(mQ(Lu,g))});return ru?{...V,tasks:ju}:V}function MT(V,M){xf((g)=>R7(g,V,M)),Fu((g)=>R7(g,V,M))}function RT(V,M,g){let ru=String(V?.type||"");if(ru==="queue-updated")return!0;if(ru==="trace-stats-updated"||ru==="trace-step-created")return!1;if(M.length===0)return!0;if(!g)return!0;if(V?.queueId&&String(V.queueId)!==o1(g))return!0;if(V?.status&&String(V.status)!==String(g?.status||""))return!0;return String(V?.reason||"")!=="output"}function x7(){if(!i||!a4())return;if(H.current!==null)window.clearTimeout(H.current);H.current=window.setTimeout(()=>{H.current=null,hf(A.current,!1).catch((V)=>Ul(bl(V,"Code Queue 事件刷新失败")))},120)}function xT(V,M){if(!i||!a4()||A.current!==V)return;if(m.current=m.current||M,E.current!==null)return;E.current=window.setTimeout(()=>{E.current=null;let g=m.current;if(m.current=!1,ci(V,!0).catch((ru)=>Ul(bl(ru,"事件刷新 Trace Summary 失败"))),g)TT(V)},250)}function hT(V){let M=Ll(V?.payload)||V,g=Ll(M?.stats),ru=String(V?.type||M?.type||""),ju=String(M?.subjectKind||g?.subjectKind||""),Lu=String(M?.scopeId||g?.scopeId||""),Tu=String(M?.taskId||(ju==="task"?M?.subjectId:"")||g?.taskId||V?.taskId||""),xu=M?.attemptIndex??g?.attemptIndex,hu=xu===null||xu===void 0||xu===""?null:xn(xu),Mu=g||Ll(M?.traceStats),ku=Mu?.stepCount??Mu?.llmStepCount,tl=Mu?.outputMaxSeq;return{...M,type:ru,eventId:V?.eventId||M?.eventId,sequence:V?.sequence??M?.sequence,taskId:Tu,subjectKind:ju,scopeId:Lu,attemptIndex:hu,stepCount:ku,outputMaxSeq:tl,updatedAt:Mu?.updatedAt||M?.updatedAt||V?.createdAt,traceStats:Mu,statsSource:Mu?"oa-event-flow":M?.statsSource}}function bT(V){let M=hT(V),g=String(M?.taskId||""),ru=String(M?.scopeId||M?.traceStats?.scopeId||""),ju=String(M?.subjectKind||M?.traceStats?.subjectKind||"")==="task-attempt"||Number(M?.attemptIndex)>0||/:attempt:\d+$/u.test(ru),Lu=OQ(M?.stepCount),Tu={},xu=g.length>0?vl(Y.current).find((hu)=>String(hu?.id||"")===g):null;if(g.length>0){if(M?.status)Tu.status=String(M.status);if(M?.updatedAt)Tu.updatedAt=String(M.updatedAt);if(M?.queueId)Tu.queueId=String(M.queueId);if(!ju&&Number.isFinite(Number(M?.stepCount)))Tu.stepCount=Lu,Tu.llmStepCount=Lu;if(!ju&&Number.isFinite(Number(M?.outputMaxSeq)))Tu.outputMaxSeq=OQ(M.outputMaxSeq);if(!ju&&Ll(M?.traceStats))Tu.traceStats=M.traceStats,Tu.statsSource="oa-event-flow";if(Object.keys(Tu).length>0&&(O.current.has(g)||A.current===g))Pr(g,Tu,J.current);if(Object.keys(Tu).length>0)MT(g,Tu);if(A.current===g&&(M?.type==="trace-step-created"||M?.type==="task-updated"||M?.type==="trace-stats-updated")){let hu=vQ(xu),Mu=M?.type==="trace-step-created"||M?.type==="trace-stats-updated"&&!ju&&Number.isFinite(Number(M?.stepCount))&&(hu===null||Lu>hu);xT(g,Mu)}}if(RT(M,g,xu))x7()}Mn(()=>{if(B.current){B.current=!1;return}Vf(()=>hf(A.current),"Code Queue 加载失败")},[i?.id,Pu]),Mn(()=>{if(!i||typeof EventSource>"u")return;let V=new EventSource(XE(f),{withCredentials:!0}),M=(ru)=>{try{bT(JSON.parse(String(ru.data||"{}")))}catch(ju){Ul(bl(ju,"解析 Code Queue 事件失败"))}},g=()=>{if(a4())x7()};return V.addEventListener("trace-step-created",M),V.addEventListener("task-updated",M),V.addEventListener("queue-updated",M),V.addEventListener("trace-stats-updated",M),document.addEventListener("visibilitychange",g),()=>{if(V.close(),document.removeEventListener("visibilitychange",g),H.current!==null)window.clearTimeout(H.current),H.current=null;if(E.current!==null)window.clearTimeout(E.current),E.current=null}},[i?.id,f,Pu]),Mn(()=>{if(!i||!b||s)return;let V=String(b.id||"");if(!V)return;let M=String(b.updatedAt||"");if(d$(b))return;let g=`${V}:${M||"unknown"}:${String(b?._traceSummaryUpdatedAt||"")}`;if(Z.current.has(g))return;Z.current.add(g),ci(V,!0).catch((ru)=>Ul(bl(ru,"自动加载 Trace Summary 失败")))},[i?.id,b?.id,b?.updatedAt,b?.traceStats?.statsRevision,b?._traceSummaryUpdatedAt,b?._traceSummaryLoaded,s]),Mn(()=>{if(!i)return;$6().catch((V)=>Ul(bl(V,"加载工作目录失败")));return},[i?.id]);let vT=rn.length===0?T(Si,{title:wr?zu?"搜索中":"没有匹配任务":"队列为空",text:wr?zu?`正在搜索包含“${My}”的 task...`:`未找到包含“${My}”的 task;可换个关键词或切换 queue。`:"提交一个任务后,Codex 会串行执行并保存输出。"}):[V7.length>0?T(f2,{key:"unread",title:"已结束未读",tasks:V7,selectedId:k,emptyText:"暂无已结束未读任务。",onSelect:A6,onCopy:y6,onReference:c6,onMarkRead:_6,copiedTaskId:ft,markingReadTaskId:rt}):null,T(f2,{key:"active",title:"运行 / 排队",tasks:cT,selectedId:k,emptyText:"当前没有运行或排队任务。",onSelect:A6,onCopy:y6,onReference:c6,onMarkRead:_6,copiedTaskId:ft,markingReadTaskId:rt}),T(f2,{key:"history",title:"历史 session",tasks:_T,selectedId:k,emptyText:"最近没有完成、失败或取消的 session。",onSelect:A6,onCopy:y6,onReference:c6,onMarkRead:_6,copiedTaskId:ft,markingReadTaskId:rt}),T("div",{key:"pagination",className:"codex-task-pagination","data-testid":"codex-task-pagination"},T("span",null,wr?`搜索“${My}” · 已显示 ${rn.length} / ${Number.isFinite(yt)?yt:rn.length}`:`已加载 ${rn.length} / ${Number.isFinite(yt)?yt:rn.length}`),D7?T("button",{type:"button",className:"ghost-btn",disabled:l6,onClick:()=>void M7(),"data-testid":"codex-load-more-tasks-button"},l6?"加载中":wr?"加载更多结果":"加载更早任务"):T("code",null,wr?"已到结果末尾":"已到队列末尾"))],h7=(V,M=!1)=>T("label",{className:`code-queue-switcher ${M?"compact":""}`},T("span",null,M?"Queue":"查看 queue"),T("select",{value:Pu,onChange:(g)=>zT(String(g.target.value||D0)),"data-testid":V},T("option",{value:D0},`All queues · ${Number.isFinite(ti)?ti:fn.length} tasks · ${tt.length} running`),Yr.map((g)=>T("option",{key:String(g?.id||""),value:String(g?.id||"")},s1(g))))),kT=T("div",{className:"codex-task-search","data-testid":"codex-task-search"},T("label",{htmlFor:"codex-task-search-input"},"搜索 task"),T("div",{className:"codex-task-search-row"},T("input",{id:"codex-task-search-input",type:"search",value:lu,placeholder:"关键词 / task ID / prompt",autoComplete:"off",onChange:(V)=>cu(String(V.target.value||"")),"data-testid":"codex-task-search-input"}),lu?T("button",{type:"button",className:"ghost-btn",onClick:()=>cu(""),"data-testid":"codex-task-search-clear"},"清除"):null),T("small",{"data-testid":"codex-task-search-summary"},wr?zu?"搜索中...":`匹配 ${rn.length}/${Number.isFinite(yt)?yt:rn.length}`:"支持 task ID、prompt、状态、provider、模型和最近输出关键词")),IT=T("div",{className:"codex-trace-status","data-testid":"codex-trace-status-summary"},T("span",{className:"codex-trace-status-chip queued"},T("b",null,"排队"),String(Cy)),T("span",{className:"codex-trace-status-chip running"},T("b",null,"运行"),String(dA)),T("span",{className:`codex-trace-status-chip unread ${zn>0?"warn":""}`},T("b",null,"结束未读"),String(zn)),T("span",{className:"codex-trace-status-chip service"},T("b",null,"服务"),`${$T.providerStatus||"unknown"} · ${i?.providerId||"D601"} · ${AT.public?"公网暴露":"仅 UniDesk frontend 代理访问"}`),T("span",{className:"codex-trace-status-chip"},T("b",null,"执行节点"),F_.map((V)=>V.id).join(" / ")),T("span",{className:"codex-trace-status-chip"},T("b",null,"执行模式"),X7.map((V)=>V.id).join(" / ")),T("span",{className:"codex-trace-status-chip"},T("b",null,"模型"),S7.join(" / ")),T("span",{className:"codex-trace-status-chip"},T("b",null,"加载"),Rf?.phase==="complete"?DE(Rf?.totalMs):String(Rf?.phase||"idle")),T("span",{className:"codex-trace-status-chip"},T("b",null,"刷新"),c_?yl(c_):"--")),gT=T(ot,{title:b?`Trace ${String(b.id).slice(0,22)}`:"Trace 输出",eyebrow:b?`${b.status} / view=${j_} / task queue=${o1(b)} / provider=${b.providerId||"D601"} / mode=${b.executionMode||"default"} / ${b.model} / agent loop trace`:`Agent loop trace / view=${j_}`,summary:IT,loading:s||Yy||zu||C||Rf?.phase==="loading",actions:T("div",{className:"panel-actions"},h7("code-queue-filter-select"),T("button",{type:"button",className:"ghost-btn codex-mark-all-read-btn",disabled:zn===0||Kl||Sy,onClick:()=>void GT(),"data-testid":"codex-mark-all-read-button"},Sy?"标记中":`全部标已读${zn>0?` (${zn})`:""}`),b?T("button",{type:"button",className:"ghost-btn",disabled:s||Kl,onClick:()=>void PT(),"data-testid":"codex-load-full-trace-button"},s?"加载中":Fr(b)?"刷新 Summary":"加载 Summary"):null,T("button",{type:"button",className:"codex-session-title-toggle",onClick:()=>Dy((V)=>!V),"data-testid":"code-queue-sidebar-toggle"},Sr?"收起队列":"展开队列"),T("label",{className:"inline-check"},T("input",{type:"checkbox",checked:_l,onChange:(V)=>qf(Boolean(V.target.checked))}),"自动滚动"),T("button",{type:"button",className:"ghost-btn",disabled:!UT||Kl,onClick:()=>void ST(),"data-testid":"codex-interrupt-button"},"打断"),T("button",{type:"button",className:"ghost-btn",disabled:!JT||Kl,onClick:()=>void XT()},"重试"),b?T(MQ,{title:"Codex Task",data:b,onOpen:l,testId:"raw-codex-task"}):null),className:"codex-output-panel"},T("div",{className:`codex-session-shell ${Sr?"":"queue-collapsed"}`},Sr?T("aside",{className:"codex-session-sidebar","data-testid":"codex-session-sidebar"},T("div",{className:"codex-session-sidebar-head"},T("div",null,T("span",null,sf(Pu)?"All queues":"Queue lane"),T("strong",null,`${j_} · ${fn.length}/${Number.isFinite(ti)?ti:fn.length} sessions · 未读 ${zn}`)),T("button",{type:"button",className:"ghost-btn",onClick:()=>Dy(!1)},"收起")),h7("code-queue-filter-sidebar",!0),kT,T("div",{className:"codex-task-list codex-task-list-session",onScroll:KT,"data-testid":"codex-task-list-scroll"},vT)):null,T("div",{className:"codex-session-main"},T("div",{className:"codex-output-stack"},T(uZ,{task:b,loading:s,onLoadPromptPart:WT,onLoadSteps:t6,onLoadStep:LT}),T(lZ,{task:b})))));if(!i)return T(Si,{title:"Code Queue 未登记",text:"请在 config.json 的 microservices 中登记用户服务 id=code-queue"});let b7=Number(Rf?.totalMs),v7=Number(Rf?.queueMs),k7=Number(Rf?.detailMs),I7=Number(Rf?.transcriptRows),sT=Rf?.phase==="complete"?"complete":String(Rf?.phase||"idle"),aT=et(Yr,ni)||{id:ni,name:ni},oT=Qf?T(qQ,{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:Kl,onClose:()=>Zf(!1),actions:[T("button",{key:"cancel",type:"button",className:"ghost-btn",onClick:()=>Zf(!1),disabled:Kl,"data-testid":"codex-merge-queue-cancel"},"取消"),T("button",{key:"confirm",type:"button",className:"primary-btn",onClick:()=>void VT(),disabled:Kl||$l||!$f,"data-testid":"codex-merge-queue-confirm"},Kl?"合并中...":"确认合并")]},T("p",{className:"codex-merge-dialog-target"},"目标 queue:",T("code",null,s1(aT))),T("label",null,"源 queue",T("select",{value:$f,disabled:Kl||$l,onChange:(V)=>nf(String(V.target.value||"")),"data-testid":"codex-merge-source-queue-select"},T("option",{value:""},"选择要合并进来的源 queue"),ii.map((V)=>T("option",{key:String(V?.id||""),value:String(V?.id||"")},s1(V))))),T("p",{className:"codex-merge-dialog-note"},"会把源 queue 的任务归属合并到目标 queue,并自动删除源 queue;目标 queue 会按原 queueEnteredAt/createdAt 时间顺序运行。")):null;return T("div",{className:`code-queue-page ${n?"codex-standalone-page":""}`,"data-testid":"code-queue-page","data-load-state":sT,"data-load-total-ms":Number.isFinite(b7)?String(Math.round(b7*10)/10):"","data-load-queue-ms":Number.isFinite(v7)?String(Math.round(v7*10)/10):"","data-load-detail-ms":Number.isFinite(k7)?String(Math.round(k7*10)/10):"","data-load-transcript-rows":Number.isFinite(I7)?String(I7):"","data-load-task-id":String(Rf?.taskId||k||""),"data-load-partial":Rf?.partial?"true":"false"},T(nl,{error:aA,wide:!0}),oT,T("div",{className:"codex-session-stage codex-session-stage-top"},gT),T("div",{className:"code-queue-layout"},T("div",{className:"codex-left-rail"},T(ot,{title:"提交任务",eyebrow:$l?"Submitting...":En.length>1?`${En.length} tasks`:"Single or Batch",className:"codex-compose-panel",loading:$l},T("form",{className:`codex-task-form ${$l?"is-submitting":""}`,onSubmit:mT,"data-testid":"code-queue-task-form","aria-busy":$l?"true":"false"},T("label",null,"Prompt / 多任务用单独一行 --- 分隔",T("textarea",{value:a,rows:8,disabled:$l,onChange:(V)=>qu(V.target.value),placeholder:"写入 Codex 任务;多个任务之间用 --- 分隔。"})),T("label",{className:"codex-reference-field"},"引用任务 ID(可选)",T("input",{value:Zu,disabled:$l,onChange:(V)=>Bu(V.target.value),placeholder:"codex_...;支持空格/逗号分隔多个 ID","data-testid":"codex-reference-task-id"}),Vi(Zu).length>0?T("code",null,`后端将解析并注入:${Vi(Zu).join(" / ")}`):null),T("div",{className:"codex-form-grid"},T("label",{className:"codex-submit-queue-field"},"Queue",T("div",{className:"codex-submit-queue-row"},T("select",{className:"codex-submit-queue-select",value:gu,disabled:$l,onChange:(V)=>ll(String(V.target.value||"default")),"data-testid":"code-queue-id-select"},Yr.map((V)=>T("option",{key:String(V?.id||""),value:String(V?.id||"")},s1(V)))),T("button",{type:"button",className:"ghost-btn codex-rename-queue-btn",onClick:()=>void HT(),disabled:Kl||$l||!gu,title:"修改当前 queue 的显示名称,ID 不变","data-testid":"codex-rename-queue-button"},"改名"),T("button",{type:"button",className:"ghost-btn codex-merge-queue-btn",onClick:()=>BT(),disabled:Kl||$l||ii.length===0,title:"打开独立窗口选择源 queue 并合并到当前 queue;合并后自动删除源 queue","data-testid":"codex-merge-queue-button"},"合并 queue"),T("button",{type:"button",className:"ghost-btn codex-create-queue-btn",onClick:()=>void ZT(),disabled:Kl||$l,"data-testid":"codex-create-queue-button"},"创建 queue"))),T("label",null,"模型",T("select",{value:Nf,disabled:$l,onChange:(V)=>Yu(V.target.value),"data-testid":"codex-model-select"},S7.map((V)=>T("option",{key:V,value:V},V)))),T("label",null,"执行 Provider",T("select",{value:tf,disabled:$l,onChange:(V)=>qT(String(V.target.value||"D601")),"data-testid":"codex-provider-select"},F_.map((V)=>T("option",{key:V.id,value:V.id},`${V.label||V.id} · ${V.defaultWorkdir||J2(Yl,V.id)}${V.supportsWindowsNativeCodex?" · Windows native":""}`)))),T("label",null,"执行模式",T("select",{value:$u,disabled:$l,onChange:(V)=>wT(String(V.target.value||"default")),"data-testid":"codex-execution-mode-select"},X7.map((V)=>T("option",{key:V.id,value:V.id},`${V.label||V.id}${V.id==="windows-native"?" · 宿主 Codex":""}`)))),T("label",{className:"codex-workdir-field"},"工作目录",T("div",{className:"codex-workdir-row"},T("input",{value:Sl,disabled:$l,onChange:(V)=>dl(V.target.value),placeholder:Y7||Yl?.defaultWorkdir||"/workspace","data-testid":"codex-cwd-input"}),T("select",{value:uy(Sl),disabled:$l||nt,onChange:(V)=>dl(String(V.target.value||"")),"data-testid":"codex-cwd-select"},P7.map((V)=>T("option",{key:`${V.providerId}:${V.executionMode}:${V.path}`,value:V.path},`${V.path}${V.source==="default"?" · 默认":""}`))),T("button",{type:"button",className:"ghost-btn codex-workdir-create-btn",disabled:$l||Kl||nt,onClick:()=>void ET(),"data-testid":"codex-cwd-create-button"},nt?"处理中":"新建"),T("button",{type:"button",className:"ghost-btn codex-workdir-delete-btn",disabled:$l||Kl||nt||!r6,onClick:()=>void OT(),title:r6?"从工作目录下拉菜单删除这个选项,不删除磁盘目录":"当前工作目录尚未保存到下拉菜单","data-testid":"codex-cwd-delete-button"},"删除"))),T("label",null,"最大尝试",T("input",{type:"number",min:1,max:99,value:rr,disabled:$l,onChange:(V)=>Af(Number(V.target.value)),"data-testid":"codex-max-attempts-input"})),T("label",null,"入队份数",T("input",{type:"number",min:1,max:50,value:Hf,disabled:$l,onChange:(V)=>Gn(Number(V.target.value)),"data-testid":"codex-repeat-count-input"}))),Ry>1?T("label",{className:`codex-batch-confirm ${nr?"confirmed":""}`,"data-testid":"codex-batch-confirm-row"},T("input",{type:"checkbox",checked:nr,disabled:$l,onChange:(V)=>u0(Boolean(V.target.checked)),"data-testid":"codex-batch-confirm-checkbox"}),T("span",null,`确认批量入队 ${Ry} 个任务(prompt 分段 ${f6.length} × 入队份数 ${EQ(Hf)})`)):null,$l?T("div",{className:"codex-submit-wait","data-testid":"codex-submit-wait"},"正在提交到后端,已锁定输入以防重复提交..."):null,T("div",{className:"codex-form-actions"},T("button",{type:"button",className:"ghost-btn",disabled:Kl||$l||a.length===0&&Zu.length===0,onClick:()=>{qu(""),Bu(""),u0(!1);let V="已清空任务输入栏";Xl(V),Bf("success",V)},"data-testid":"codex-clear-input-button"},"清空输入"),T("button",{type:"submit",className:"primary-btn",disabled:jT,"data-testid":"codex-enqueue-button"},$l?"提交中,请等待...":p7?`请确认批量入队 ${Ry} 个任务`:En.length>1?`批量入队 ${En.length} 个任务`:"入队并运行"))))),T("div",{className:"codex-main-stage"},T("div",{className:"codex-detail-grid"},T(ot,{title:"运行控制",eyebrow:ct?"Queued prompt editable":n6?"Active turn steer":"Steer when running",loading:Kl},T("div",{className:"codex-run-control-stack"},T(sO,{task:b,queueRows:Yr,busy:Kl,onMove:YT}),b?.id?T("form",{className:"codex-steer-form codex-edit-prompt-form",onSubmit:pT,"data-testid":"codex-edit-prompt-form"},T("label",null,"编辑 queued 用户 prompt",T("textarea",{value:Xu,rows:5,onChange:(V)=>ou(V.target.value),placeholder:"仅 QUEUED 且尚未开始运行的任务可在这里修改原始用户 prompt。",disabled:!ct||Kl,"data-testid":"codex-edit-prompt-textarea"})),T("label",{className:"codex-reference-field"},"引用任务 ID(可选,留空会清除引用)",T("input",{value:Al,disabled:!ct||Kl,onChange:(V)=>kl(V.target.value),placeholder:"codex_...;支持空格/逗号分隔多个 ID","data-testid":"codex-edit-reference-task-id"}),Vi(Al).length>0?T("code",null,`将保留/注入:${Vi(Al).join(" / ")}`):null),T("div",{className:"codex-form-actions"},T("button",{type:"button",className:"ghost-btn",disabled:!b?.id||Kl,onClick:()=>{ou(b?l3(b):""),kl(Array.isArray(b?.referenceTaskIds)?b.referenceTaskIds.join(" "):"")},"data-testid":"codex-edit-prompt-reset"},"恢复当前值"),T("button",{type:"submit",className:"primary-btn",disabled:!ct||Kl||Xu.trim().length===0,title:ct?"保存后会重写尚未运行任务的用户 prompt":"只有 QUEUED 且尚未开始的任务可编辑 prompt","data-testid":"codex-edit-prompt-submit"},"保存 queued prompt"))):null,T("form",{className:"codex-steer-form",onSubmit:DT},T("label",null,"追加 prompt",T("textarea",{value:fu,rows:4,onChange:(V)=>Vu(V.target.value),placeholder:"给正在运行的 Codex session 推入新的指令或纠偏。",disabled:!n6})),T("button",{type:"submit",className:"primary-btn",disabled:!n6||Kl||fu.trim().length===0,"data-testid":"codex-steer-button"},"推入运行中 session")))),T(ot,{title:"完成判定",eyebrow:b?.lastJudge?b.lastJudge.source:"judge",loading:s},b?.lastJudge?T("div",{className:"codex-judge-card","data-testid":"codex-task-judge-card"},T(pi,{status:b.lastJudge.decision},b.lastJudge.decision),T("strong",null,`${Math.round(Number(b.lastJudge.confidence||0)*100)}% confidence`),T("p",{"data-testid":"codex-task-judge-reason"},r2(b.lastJudge.reason||"--",180)),T(gQ,{judge:b.lastJudge,testId:"codex-task-judge-failure-details"}),b.lastJudge.continuePrompt?T("code",{"data-testid":"codex-task-judge-continue-prompt"},r2(b.lastJudge.continuePrompt,160)):null):T(Si,{title:"尚未判定",text:"Codex turn 结束后会由 MiniMax M2.7 或 fallback judge 判定 complete/retry/fail;retry 会在已有 thread 追加继续执行 prompt。"}))),T(gO,{stats:oA,queueName:j_,onRaw:l}),T(ot,{title:"Attempts",eyebrow:"terminal vs interruption",loading:s},T(fZ,{task:b})))))}var lc=Cu(Jl(),1);var mu=lc.default.createElement,{useEffect:Q2}=lc.default,N2=lc.default.useState,rZ=lc.default.useRef,w2=` :root { --surfacePrimary: #ffffff; --surfaceSecondary: #f8fafc; @@ -226,58 +229,58 @@ nav .material-icons::before { display: none !important; } } -`;function j2({title:u,eyebrow:l,actions:f,children:r,className:n,loading:i}){return Vu("section",{className:`panel ${n||""}`},Vu("div",{className:"panel-head"},Vu("div",null,l?Vu("p",{className:"panel-eyebrow"},l):null,Vu(rl,{title:u,loading:i})),f?Vu("div",{className:"panel-actions"},f):null),Vu("div",{className:"panel-body"},r))}function RO({title:u,data:l,onOpen:f,testId:r}){return Vu("button",{type:"button",className:"ghost-btn","data-testid":r,onClick:()=>f(u,l)},"查看原始JSON")}function hO({title:u,text:l}){return Vu("div",{className:"empty-state"},Vu("strong",null,u),Vu("span",null,l))}function dQ(u){return u?.runtime&&typeof u.runtime==="object"&&!Array.isArray(u.runtime)?u.runtime:{}}function eQ(u){return u?.backend&&typeof u.backend==="object"&&!Array.isArray(u.backend)?u.backend:{}}function uN(u){return u?.repository&&typeof u.repository==="object"&&!Array.isArray(u.repository)?u.repository:{}}function xO(u){return u.filter((f)=>f?.id==="filebrowser"||String(f?.id||"").startsWith("filebrowser-")).sort((f,r)=>{let n=(i)=>i.providerId==="D518"?0:i.providerId==="D601"?1:i.id==="filebrowser"?2:3;return n(f)-n(r)||String(f.id).localeCompare(String(r.id))})}function bO(u){if(u?.providerId==="D518")return"D518";return u?.providerId||u?.name||u?.id||"Unknown"}function vO(u,l,f="/"){let r=f.startsWith("/")?f:`/${f}`;return`${u}/microservices/${encodeURIComponent(l)}/proxy${r}`}function kO(u,l){return`${u}/microservices/${encodeURIComponent(l)}/health`}async function IO(u,l=16000){let f=new AbortController,r=setTimeout(()=>f.abort(),l);try{return await Eu(u,{signal:f.signal,failureFields:[!1]})}finally{clearTimeout(r)}}function lN(u){if(u?.providerId==="main-server")return"host / -> /srv";if(u?.providerId==="D601"||u?.providerId==="D518")return"WSL / + /mnt/c -> /srv";return"provider / -> /srv"}function u3(u){return u?.status==="OK"||u?.ok===!0}function gO({service:u,active:l,health:f,onSelect:r,onRaw:n}){let i=dQ(u),t=eQ(u),y=uN(u),c=i.container||{},$=u3(f?.body);return Vu("button",{type:"button",className:`filebrowser-target-card ${l?"active":""}`,"data-testid":`filebrowser-target-card-${u.id}`,onClick:r},Vu("span",{className:`status-badge ${$?"ok":i.providerStatus==="online"?"running":"warn"}`},$?"Health OK":i.providerStatus||"unknown"),Vu("strong",null,u.name||u.id),Vu("span",null,lN(u)),Vu("code",null,`${t.nodeBindHost||"--"}:${t.nodePort||"--"}`),Vu("small",null,c.name?`${c.name} / ${c.state||"--"}`:`${y.composeService||"--"}`),Vu("span",{className:"filebrowser-card-raw",onClick:(A)=>{A.stopPropagation(),n(`${u.name} service`,u)}},"JSON"))}function fN(u){try{return u?.contentDocument||u?.contentWindow?.document||null}catch{return null}}function U2(u){let l=fN(u);if(l===null||l.head===null)return!1;let f=l.getElementById("unidesk-filebrowser-compact-style");if(f===null)f=l.createElement("style"),f.id="unidesk-filebrowser-compact-style",l.head.appendChild(f);if(f.textContent!==F2)f.textContent=F2;return!0}function sO(u,l){let f=URL.createObjectURL(u),r=document.createElement("a");r.href=f,r.download=l,document.body.appendChild(r),r.click(),r.remove(),setTimeout(()=>URL.revokeObjectURL(f),2000)}function aO(u,l){let f=fN(u);if(f===null||f.documentElement===null)throw Error("无法访问 File Browser iframe 文档");U2(u);let r=Math.max(640,Math.ceil(u.clientWidth||f.documentElement.clientWidth||1280)),n=Math.max(480,Math.ceil(u.clientHeight||f.documentElement.clientHeight||720)),i=f.documentElement.cloneNode(!0);i.querySelectorAll("script, style, link[rel='stylesheet'], link[rel='preload'], link[rel='icon']").forEach((A)=>A.remove()),i.querySelectorAll("img").forEach((A)=>{A.removeAttribute("src"),A.removeAttribute("srcset")});let t=i.querySelector("head");if(t===null)t=f.createElement("head"),i.insertBefore(t,i.firstChild);let y=f.createElement("style");y.textContent=`${F2} -html,body{width:${r}px!important;min-height:${n}px!important;overflow:hidden!important;}`,t.appendChild(y);let c=new XMLSerializer().serializeToString(i),$=`${c}`;sO(new Blob([$],{type:"image/svg+xml;charset=utf-8"}),l.replace(/\.png$/i,".svg"))}function rN({microservices:u,onRaw:l,apiBaseUrl:f="/api"}){let r=xO(Array.isArray(u)?u:[]),n=new URLSearchParams(window.location.search).get("target")||"",i=n==="filebrowser-d518"?"filebrowser":n,t=r.some((Z)=>Z.id===i)?i:r[0]?.id||"",[y,c]=A2(t),[$,A]=A2({loading:!1,refreshedAt:null,health:{},error:""}),[j,F]=A2({exporting:!1,message:"",error:""}),J=MO(null),Q=r.find((Z)=>Z.id===y)||r[0]||null,W=dQ(Q),L=eQ(Q),U=uN(Q),q=Q?$.health[Q.id]:null,N=Q?vO(f,Q.id,"/"):"about:blank";$2(()=>{if(r.length===0)return;if(!y||!r.some((Z)=>Z.id===y))c(r[0].id)},[r.map((Z)=>Z.id).join(",")]),$2(()=>{let Z=0,H=setInterval(()=>{if(Z+=1,U2(J.current)||Z>=24)clearInterval(H)},500);return()=>clearInterval(H)},[N]),$2(()=>{if(r.length===0)return;let Z=!1;async function H(){A((S)=>({...S,loading:!0,error:""}));let V=await Promise.all(r.map(async(S)=>{try{let B=await IO(kO(f,S.id));return[S.id,{ok:!0,body:B}]}catch(B){return[S.id,{ok:!1,error:Ou(B,"File Browser health failed")}]}}));if(Z)return;A({loading:!1,refreshedAt:new Date().toISOString(),health:Object.fromEntries(V),error:""})}H();let E=setInterval(H,30000);return()=>{Z=!0,clearInterval(E)}},[r.map((Z)=>`${Z.id}:${Z.runtime?.providerStatus||""}`).join(","),f]);function w(Z){c(Z);let H=new URL(window.location.href);H.searchParams.set("target",Z),window.history.replaceState({},"",`${H.pathname}${H.search}`)}async function G(){if(j.exporting)return;F({exporting:!0,message:"",error:""});try{let Z=new Date().toISOString().replace(/[-:.TZ]/g,"").slice(0,14);await aO(J.current,`unidesk-filebrowser-${Q?.id||"target"}-${Z}.png`),F({exporting:!1,message:"截图已导出",error:""})}catch(Z){F({exporting:!1,message:"",error:Ou(Z,"截图导出失败")})}}if(r.length===0)return Vu(hO,{title:"File Browser 未登记",text:"请在 config.json 的 microservices 中登记 id=filebrowser 或 filebrowser-* 用户服务"});return Vu("div",{className:"filebrowser-page","data-testid":"filebrowser-page"},$.error?Vu(nl,{error:$.error,wide:!0}):null,Vu(j2,{title:"文件管理器",eyebrow:"File Browser / Host Files",loading:$.loading,actions:Vu("div",{className:"panel-actions"},Q?Vu("button",{type:"button",className:"ghost-btn",onClick:G,disabled:j.exporting,"data-testid":"filebrowser-export-screenshot"},j.exporting?"导出中...":"导出截图"):null,Q?Vu("a",{className:"ghost-btn",href:N,target:"_blank",rel:"noreferrer"},"新窗口打开"):null,Q?Vu(RO,{title:"File Browser 当前目标",data:{service:Q,health:q},onOpen:l,testId:"raw-filebrowser-active"}):null)},Vu("div",{className:"filebrowser-hero"},Vu("div",null,Vu("span",{className:`status-badge ${u3(q?.body)?"ok":"warn"}`},u3(q?.body)?"Health OK":"Health Pending"),Vu("h3",null,Q?.name||"File Browser"),Vu("p",{className:"muted paragraph"},Q?.description||"通过 UniDesk 登录态代理访问,不开放 File Browser 公网端口。"),j.error?Vu("p",{className:"filebrowser-shot-error"},j.error):null,j.message?Vu("p",{className:"filebrowser-shot-ok"},j.message):null),Vu("div",{className:"microservice-ref-card"},Vu("span",null,"Provider"),Vu("strong",null,Q?.providerId||"--"),Vu("code",null,W.providerName||Q?.providerId||"--")),Vu("div",{className:"microservice-ref-card"},Vu("span",null,"Private Backend"),Vu("strong",null,`${L.nodeBindHost||"--"}:${L.nodePort||"--"}`),Vu("code",null,L.nodeBaseUrl||"--")),Vu("div",{className:"microservice-ref-card"},Vu("span",null,"Image"),Vu("strong",null,U.dockerfile||"filebrowser/filebrowser:v2.63.3"),Vu("code",null,U.commitId||"--")),Vu("div",{className:"microservice-ref-card"},Vu("span",null,"Mount"),Vu("strong",null,lN(Q)),Vu("code",null,Q?.providerId==="main-server"?"/root, /var, /home":"/home, /mnt/c, /mnt/d")))),Vu(j2,{title:"浏览目标",eyebrow:`${r.length} host targets`,loading:$.loading},Vu("div",{className:"filebrowser-target-grid"},r.map((Z)=>Vu(gO,{key:Z.id,service:Z,active:Z.id===Q?.id,health:$.health[Z.id],onSelect:()=>w(Z.id),onRaw:l})))),Vu(j2,{title:`${bO(Q)} 文件视图`,eyebrow:q?.body?`Health ${u3(q.body)?"OK":"UNKNOWN"} / ${$.refreshedAt?yl($.refreshedAt):"--"}`:"Embedded WebUI",className:"filebrowser-frame-panel"},Vu("div",{className:"filebrowser-frame-shell"},Vu("div",{className:"filebrowser-frame-toolbar"},Vu("span",null,"BaseURL"),Vu("code",null,`/api/microservices/${Q?.id||"filebrowser"}/proxy`),Vu("span",null,"Root"),Vu("code",null,"/srv"),Vu("span",{className:"filebrowser-compact-note"},"Compact layout injected")),Vu("iframe",{ref:J,key:N,title:`${Q?.name||"File Browser"} WebUI`,src:N,className:"filebrowser-frame","data-testid":"filebrowser-frame",onLoad:(Z)=>U2(Z.currentTarget),sandbox:"allow-downloads allow-forms allow-modals allow-same-origin allow-scripts"}))))}var n3=Cu(Fl(),1);var Uu=n3.default.createElement,{useEffect:oO}=n3.default,dO=n3.default.useState;function l3({status:u,children:l}){let f=String(u||"unknown").toLowerCase();return Uu("span",{className:`status-badge ${f}`},l||u||"unknown")}function S0({label:u,value:l,hint:f,tone:r}){return Uu("article",{className:`metric-card ${r||""}`},Uu("div",{className:"metric-label"},u),Uu("div",{className:"metric-value"},l),Uu("div",{className:"metric-hint"},f))}function f3({title:u,eyebrow:l,actions:f,children:r,className:n,loading:i}){return Uu("section",{className:`panel ${n||""}`},Uu("div",{className:"panel-head"},Uu("div",null,l?Uu("p",{className:"panel-eyebrow"},l):null,Uu(rl,{title:u,loading:i})),f?Uu("div",{className:"panel-actions"},f):null),Uu("div",{className:"panel-body"},r))}function r3({title:u,data:l,onOpen:f,testId:r}){return Uu("button",{type:"button",className:"ghost-btn","data-testid":r,onClick:()=>f(u,l)},"查看原始JSON")}function J2({title:u,text:l}){return Uu("div",{className:"empty-state"},Uu("strong",null,u),Uu("span",null,l))}function eO(u){return u?.runtime&&typeof u.runtime==="object"&&!Array.isArray(u.runtime)?u.runtime:{}}function uZ(u){return u?.backend&&typeof u.backend==="object"&&!Array.isArray(u.backend)?u.backend:{}}function lZ(u){return u?.repository&&typeof u.repository==="object"&&!Array.isArray(u.repository)?u.repository:{}}function Si(u,l){let f=u&&typeof u==="object"?u[l]:void 0;return Number.isFinite(Number(f))?String(f):"--"}function fZ(u){return(Array.isArray(u?.jobs)?u.jobs:[]).slice(0,40)}function rZ(u){return(Array.isArray(u?.drafts)?u.drafts:[]).slice(0,12)}function nN({microservices:u,onRaw:l,apiBaseUrl:f="/api"}){let r=u.find((Q)=>Q.id==="findjob")||null,[n,i]=dO({loading:!1,error:"",health:null,summary:null,jobs:null,drafts:null,refreshedAt:null});async function t(){if(!r)return;i((Q)=>({...Q,loading:!0,error:""}));try{let[Q,W,L,U]=await Promise.all([Eu(`${f}/microservices/findjob/health`),Eu(`${f}/microservices/findjob/proxy/api/summary`),Eu(`${f}/microservices/findjob/proxy/api/jobs?__unideskArrayLimit=jobs:40`),Eu(`${f}/microservices/findjob/proxy/api/drafts`)]);i({loading:!1,error:"",health:Q,summary:W,jobs:L,drafts:U,refreshedAt:new Date})}catch(Q){i((W)=>({...W,loading:!1,error:Ou(Q,"FindJob 加载失败")}))}}if(oO(()=>{t()},[r?.id,r?.runtime?.providerStatus]),!r)return Uu(J2,{title:"FindJob 未登记",text:"请在 config.json 的 microservices 中登记用户服务 id=findjob"});let y=eO(r),c=lZ(r),$=uZ(r),A=n.summary||{},j=fZ(n.jobs),F=rZ(n.drafts),J=n.jobs?._unidesk?.arrayLimits?.jobs;return Uu("div",{className:"findjob-page","data-testid":"findjob-page"},Uu(f3,{title:"FindJob 工作台",eyebrow:"D601 用户服务",loading:n.loading,actions:Uu("div",{className:"panel-actions"},Uu("button",{type:"button",className:"ghost-btn",onClick:t,disabled:n.loading,"data-testid":"findjob-refresh-button"},n.loading?"刷新中":"刷新"),Uu(r3,{title:"FindJob 用户服务",data:r,onOpen:l,testId:"raw-findjob-service"}))},Uu("div",{className:"findjob-hero"},Uu("div",null,Uu("div",{className:"node-version-line"},Uu(l3,{status:y.providerStatus==="online"?"online":"warn"},y.providerStatus||"unknown"),Uu("span",null,r.providerId),Uu("span",null,$.public?"公网暴露":"仅 UniDesk frontend 代理访问")),Uu("p",{className:"muted paragraph"},r.description)),Uu("div",{className:"microservice-ref-card"},Uu("span",null,"Repo"),Uu("strong",null,c.url||"--"),Uu("code",null,c.commitId||"--")),Uu("div",{className:"microservice-ref-card"},Uu("span",null,"D601 Docker"),Uu("strong",null,`${$.nodeBindHost||"--"}:${$.nodePort||"--"}`),Uu("code",null,`${c.composeFile||"--"} / ${c.composeService||"--"}`))),Uu(nl,{error:n.error,wide:!0})),Uu("div",{className:"findjob-grid"},Uu(f3,{title:"岗位指标",eyebrow:n.refreshedAt?`Updated ${yl(n.refreshedAt)}`:"Summary",loading:n.loading},Uu("div",{className:"metric-grid"},Uu(S0,{label:"岗位总量",value:Si(A,"totalJobs"),hint:"tracked jobs",tone:"ok"}),Uu(S0,{label:"原始岗位",value:Si(A,"rawJobs"),hint:"raw queue"}),Uu(S0,{label:"已验证",value:Si(A,"verifiedJobs"),hint:"verified set"}),Uu(S0,{label:"优先处理",value:Si(A,"prioritizedJobs"),hint:"prioritized"}),Uu(S0,{label:"过期",value:Si(A,"staleJobs"),hint:"stale jobs",tone:"warn"}),Uu(S0,{label:"无效",value:Si(A,"invalidJobs"),hint:"invalid jobs",tone:"warn"}),Uu(S0,{label:"上海",value:Si(A,"shanghaiJobs"),hint:"city filter"}),Uu(S0,{label:"Health",value:n.health?.ok?"OK":"--",hint:"D601 /api/health"})),Uu("div",{className:"panel-actions inline-actions"},Uu(r3,{title:"FindJob Summary",data:A,onOpen:l,testId:"raw-findjob-summary"}))),Uu(f3,{title:"近期岗位",eyebrow:J?`${J.returnedLength}/${J.originalLength} Preview`:`${j.length} Preview`,loading:n.loading},j.length===0?Uu(J2,{title:"暂无岗位预览",text:"等待 D601 findjob backend 返回 /api/jobs"}):Uu("div",{className:"table-wrap findjob-job-table"},Uu("table",null,Uu("thead",null,Uu("tr",null,Uu("th",null,"优先级"),Uu("th",null,"状态"),Uu("th",null,"单位"),Uu("th",null,"职位"),Uu("th",null,"城市"),Uu("th",null,"阶段"),Uu("th",null,"截止"),Uu("th",null,"证据"))),Uu("tbody",null,j.map((Q)=>Uu("tr",{key:Q.id},Uu("td",null,Uu(l3,{status:String(Q.priority||"").toLowerCase()||"unknown"},Q.priority||"--")),Uu("td",null,Uu(l3,{status:String(Q.status||"").toLowerCase()||"unknown"},Q.status||"--")),Uu("td",null,Q.organization_name||"--",Uu("code",null,Q.id||"--")),Uu("td",null,Q.display_title||Q.title||"--"),Uu("td",null,Q.display_city||Q.city||"--"),Uu("td",null,Q.workflow_stage||"--"),Uu("td",null,Q.deadline||"--"),Uu("td",null,Q.evidence_url?Uu("a",{href:Q.evidence_url,target:"_blank",rel:"noreferrer"},"打开"):Uu("span",{className:"muted"},"无"))))))),Uu("div",{className:"panel-actions inline-actions"},Uu(r3,{title:"FindJob Jobs Preview",data:n.jobs,onOpen:l,testId:"raw-findjob-jobs"}))),Uu(f3,{title:"草稿与报告",eyebrow:`${F.length} Drafts`,loading:n.loading},F.length===0?Uu(J2,{title:"暂无草稿",text:"D601 findjob backend 未返回 drafts"}):Uu("div",{className:"draft-list"},F.map((Q)=>Uu("article",{key:Q.id,className:"draft-card"},Uu("div",{className:"node-card-head"},Uu("strong",null,Q.id),Uu(l3,{status:Q.status},Q.status||"--")),Uu("div",{className:"docker-meta compact"},Uu("span",null,Q.workflow_stage||"--"),Uu("span",null,`jobs ${Q.counts?.jobs??0}`),Uu("span",null,`reports ${Q.counts?.reports??0}`)),Uu("span",null,Q.latestReportPath||"暂无报告"),Uu("code",null,wu(Q.updated_at||Q.updatedAt))))),Uu("div",{className:"panel-actions inline-actions"},Uu(r3,{title:"FindJob Drafts",data:n.drafts,onOpen:l,testId:"raw-findjob-drafts"})))))}var uc=Cu(Fl(),1);var R=uc.default.createElement,{useEffect:nZ}=uc.default,Q2=uc.default.useState;function o1(u){let l=Number(u);return Number.isFinite(l)?`${Math.max(0,Math.min(100,l)).toFixed(1)}%`:"--"}function q2(u){if(u===null||u===void 0||u==="")return"--";let l=Number(u);if(!Number.isFinite(l))return"--";if(l<60)return`${Math.max(0,Math.round(l))}s`;if(l<3600)return`${Math.floor(l/60)}m ${Math.round(l%60)}s`;return`${Math.floor(l/3600)}h ${Math.floor(l%3600/60)}m`}function w2(u,l=2){let f=Number(u);if(!Number.isFinite(f))return u===!1?"false":u===!0?"true":"--";let r=Math.abs(f);if(Number.isInteger(f)||r>=1000)return f.toLocaleString("zh-CN",{maximumFractionDigits:0});if(r>=1)return f.toLocaleString("zh-CN",{maximumFractionDigits:l});return f.toLocaleString("zh-CN",{maximumFractionDigits:Math.max(l,6)})}function e1(u){if(u===null||u===void 0||u==="")return"--";if(typeof u==="boolean")return u?"true":"false";if(typeof u==="number")return w2(u,4);if(Array.isArray(u))return u.map((l)=>e1(l)).join(" x ");if(typeof u==="object")return"已上报";return String(u)}function i3(u){let l=Number(u);if(!Number.isFinite(l)||l<=0)return"--";let f=l>=100?0:l>=10?1:2;return`${l.toLocaleString("zh-CN",{maximumFractionDigits:f})} epoch/h`}function t3(u){return u.replace(/[^a-zA-Z0-9_-]/g,"-")}function sf(u){return u&&typeof u==="object"&&!Array.isArray(u)?u:{}}function d1({status:u,children:l}){let f=String(u||"unknown").toLowerCase();return R("span",{className:`status-badge ${f}`},l||u||"unknown")}function X0({label:u,value:l,hint:f,tone:r}){return R("article",{className:`metric-card ${r||""}`},R("div",{className:"metric-label"},u),R("div",{className:"metric-value"},l),R("div",{className:"metric-hint"},f))}function N2({title:u,eyebrow:l,actions:f,children:r,className:n,loading:i}){return R("section",{className:`panel ${n||""}`},R("div",{className:"panel-head"},R("div",null,l?R("p",{className:"panel-eyebrow"},l):null,R(rl,{title:u,loading:i})),f?R("div",{className:"panel-actions"},f):null),R("div",{className:"panel-body"},r))}function et({title:u,data:l,onOpen:f,testId:r}){return R("button",{type:"button",className:"ghost-btn","data-testid":r,onClick:(n)=>{n?.stopPropagation?.(),f(u,l)}},"查看原始JSON")}function hn({title:u,text:l}){return R("div",{className:"empty-state"},R("strong",null,u),R("span",null,l))}function iZ(u){return u?.runtime&&typeof u.runtime==="object"&&!Array.isArray(u.runtime)?u.runtime:{}}function tZ(u){return u?.backend&&typeof u.backend==="object"&&!Array.isArray(u.backend)?u.backend:{}}function yZ(u){return u?.repository&&typeof u.repository==="object"&&!Array.isArray(u.repository)?u.repository:{}}function cZ(u){return u?.counts&&typeof u.counts==="object"&&!Array.isArray(u.counts)?u.counts:{}}function _Z(u){return Array.isArray(u?.jobs)?u.jobs.slice(0,240):[]}function $Z(u){return Array.isArray(u?.projects)?u.projects.slice(0,1000):[]}function y3(u){return Array.isArray(u?.projects)?u.projects:[]}function AZ(u,l){if(Array.isArray(l?.gpu))return l.gpu;if(Array.isArray(u?.gpu))return u.gpu;return[]}function Jr(u,l){return`${u}/microservices/met-nonlinear/proxy${l}`}function iN(u){return u.startedAt&&u.finishedAt?q2((Date.parse(u.finishedAt)-Date.parse(u.startedAt))/1000):"--"}function jZ(u){let l=u.progress||{};if(l.etaSeconds!==null&&l.etaSeconds!==void 0&&l.etaSeconds!==""){let t=Number(l.etaSeconds);if(Number.isFinite(t))return Math.max(0,t)}let f=Number(l.currentEpoch),r=Number(l.epochTarget??u.epochTarget),n=Date.parse(u.startedAt||"");if(!Number.isFinite(f)||f<=0||!Number.isFinite(r)||r<=f||!Number.isFinite(n))return null;let i=Math.max(0,(Date.now()-n)/1000);if(i<=0)return null;return Math.max(0,i/f*(r-f))}function tN(u){let l=u.progress||{},f=Number(l.epochPerHour);if(Number.isFinite(f)&&f>0)return f;let r=Date.parse(u.startedAt||""),n=["succeeded","failed","canceled"].includes(u.status)?Date.parse(u.finishedAt||""):Date.now();if(!Number.isFinite(r)||!Number.isFinite(n)||n<=r)return null;let i=Number(l.currentEpoch??u.epochTarget);if(!Number.isFinite(i)||i<=0)return null;return i/((n-r)/3600000)}function yN(u){if(u==="staged")return"待启动";if(u==="queued")return"排队中";if(u==="running")return"训练中";if(u==="succeeded")return"已完成";if(u==="failed")return"失败";if(u==="canceled")return"已取消";return u||"unknown"}function cN(u,l,f){return{name:u,path:l,depth:f,count:0,children:[],project:null}}function FZ(u){let l=cN("","",-1);for(let r of u){let i=String(r?.projectPath||"").replace(/\\/g,"/").split("/").filter(Boolean);if(i.length===0)continue;let t=l,y=[];for(let[c,$]of i.entries()){y.push($);let A=y.join("/"),j=t.children.find((F)=>F.path===A);if(!j)j=cN($,A,c),t.children.push(j);if(c===i.length-1)j.project=r;t=j}}let f=(r)=>{let n=r.children.reduce((i,t)=>i+f(t),0);return r.count=(r.project?1:0)+n,r.children.sort((i,t)=>{if(Boolean(i.project)!==Boolean(t.project))return i.project?1:-1;return i.name.localeCompare(t.name,"zh-CN",{numeric:!0,sensitivity:"base"})}),r.count};return f(l),l}function UZ(u){let l=sf(u.data);return sf(l.project).projectPath?sf(l.project):l}function JZ(u){return sf(sf(u.data).job)}function _N({microservices:u,onRaw:l,apiBaseUrl:f="/api"}){let r=u.find((C)=>C.id==="met-nonlinear")||null,[n,i]=Q2({loading:!1,actionBusy:!1,error:"",health:null,summary:null,queue:null,projects:null,history:null,images:null,refreshedAt:null}),[t,y]=Q2({loading:!1,error:"",kind:"",key:"",title:"",data:null}),[c,$]=Q2(()=>({activeTab:"projects",selectedProjects:{},expandedProjectDirs:{},sourceProject:"",forkCount:1,forkEpochs:200,forkPrefix:`ui_fork_${Date.now()}`,maxConcurrency:3,targetGpuName:"2080 Ti",actionMessage:""}));function A(C){$((e)=>({...e,...C}))}async function j(C=c.activeTab){if(!r)return;i((e)=>({...e,loading:!0,error:""}));try{let e=[["health",Eu(`${f}/microservices/met-nonlinear/health`)],["summary",Eu(Jr(f,"/api/summary"))]];if(C==="projects")e.push(["projectsRoot",Eu(Jr(f,"/api/projects?root=projects&limit=500"))]),e.push(["exProjectsRoot",Eu(Jr(f,"/api/projects?root=ex_projects&limit=500"))]);if(C==="current"||C==="completed"||C==="failed")e.push(["queue",Eu(Jr(f,"/api/queue"))]);if(C==="completed"||C==="failed")e.push(["history",Eu(Jr(f,"/api/history"))]);if(C==="gpu")e.push(["images",Eu(Jr(f,"/api/images"))]);let uu=Object.fromEntries(await Promise.all(e.map(async([s,qu])=>[s,await qu]))),Gu={loading:!1,actionBusy:!1,error:"",health:uu.health,summary:uu.summary,refreshedAt:new Date};if(uu.projectsRoot||uu.exProjectsRoot){let{projectsRoot:s,exProjectsRoot:qu}=uu;Gu.projects={ok:s?.ok!==!1&&qu?.ok!==!1,roots:[{root:"projects",count:y3(s).length},{root:"ex_projects",count:y3(qu).length}],projects:[...y3(s),...y3(qu)]}}if(uu.queue)Gu.queue=uu.queue;if(uu.history)Gu.history=uu.history;if(uu.images)Gu.images=uu.images;i((s)=>({...s,...Gu}))}catch(e){i((uu)=>({...uu,loading:!1,actionBusy:!1,error:Ou(e,"MET Nonlinear 加载失败")}))}}async function F(C,e){i((uu)=>({...uu,actionBusy:!0,error:""})),A({actionMessage:`${C}...`});try{let uu=await e();A({actionMessage:uu||`${C}完成`}),await j()}catch(uu){i((Gu)=>({...Gu,actionBusy:!1,error:Ou(uu,`${C}失败`)}))}}async function J(){await F("保存并发设置",async()=>{await Eu(Jr(f,"/api/queue/settings"),{method:"PUT",body:JSON.stringify({maxConcurrency:Number(c.maxConcurrency),targetGpuName:c.targetGpuName})})})}function Q(){return Object.entries(c.selectedProjects).filter(([,C])=>C).map(([C])=>C)}async function W(){let C=Q();if(C.length===0)throw Error("请先选择至少一个 project");await F("加入待启动队列",async()=>{await Eu(Jr(f,"/api/queue"),{method:"POST",body:JSON.stringify({projectPaths:C,maxConcurrency:Number(c.maxConcurrency),targetGpuName:c.targetGpuName,start:!1})}),A({activeTab:"current",selectedProjects:{}})})}async function L(){let C=c.sourceProject||X[0]?.projectPath;if(!C)throw Error("请先选择源 project");await F("Fork Project",async()=>{let e=await Eu(Jr(f,"/api/projects/fork"),{method:"POST",body:JSON.stringify({sourceProject:C,count:Number(c.forkCount),epochs:Number(c.forkEpochs),prefix:c.forkPrefix})}),uu=Array.isArray(e.projectPaths)?e.projectPaths:[],Gu=uu.reduce((s,qu)=>{return s[qu]=!0,s},{...c.selectedProjects});return A({selectedProjects:Gu}),`已 fork ${uu.length} 个 project,并已自动勾选;请确认后点击加入待启动队列。`})}async function U(){await F("启动队列",async()=>{await Eu(Jr(f,"/api/queue/start"),{method:"POST",body:JSON.stringify({maxConcurrency:Number(c.maxConcurrency),targetGpuName:c.targetGpuName})}),A({activeTab:"current"})})}async function q(C){await F("取消任务",async()=>{await Eu(Jr(f,`/api/jobs/${encodeURIComponent(C.id)}/cancel`),{method:"POST",body:JSON.stringify({})})})}async function N(C){let e=String(C?.projectPath||"");if(!e)return;y({loading:!0,error:"",kind:"project",key:e,title:e,data:null});try{let uu=await Eu(Jr(f,`/api/projects/config?path=${encodeURIComponent(e)}`));y({loading:!1,error:"",kind:"project",key:e,title:e,data:uu})}catch(uu){y({loading:!1,error:Ou(uu,"Project 详情加载失败"),kind:"project",key:e,title:e,data:null})}}async function w(C){let e=String(C?.id||"");if(!e)return;y({loading:!0,error:"",kind:"job",key:e,title:C.projectPath||e,data:null});try{let uu=await Eu(Jr(f,`/api/jobs/${encodeURIComponent(e)}`));y({loading:!1,error:"",kind:"job",key:e,title:uu?.job?.projectPath||C.projectPath||e,data:uu})}catch(uu){y({loading:!1,error:Ou(uu,"Job 详情加载失败"),kind:"job",key:e,title:C.projectPath||e,data:null})}}if(nZ(()=>{j(c.activeTab)},[r?.id,r?.runtime?.providerStatus,c.activeTab]),!r)return R(hn,{title:"MET Nonlinear 未登记",text:"请在 config.json 的 microservices 中登记用户服务 id=met-nonlinear"});let G=iZ(r),Z=yZ(r),H=tZ(r),E=cZ(n.queue?.queue||n.summary?.queue),V=AZ(n.health,n.queue),S=n.health?.targetGpu||n.summary?.targetGpu||V.find((C)=>String(C.name||"").includes("2080")),B=n.images?.mlImage||n.health?.image||{},D=_Z(n.queue),X=$Z(n.projects),O=FZ(X),Y=c.sourceProject||X[0]?.projectPath||"",p=D.filter((C)=>["staged","queued","running"].includes(C.status)),v=D.filter((C)=>C.status==="succeeded"),z=D.filter((C)=>["failed","canceled"].includes(C.status)),P=Array.isArray(n.history?.jobs)?n.history.jobs.slice(0,120):[],k=[{id:"projects",label:"项目库",count:X.length},{id:"current",label:"当前队列",count:p.length||Number(E.staged||0)+Number(E.queued||0)+Number(E.running||0)},{id:"completed",label:"已完成",count:v.length||Number(E.succeeded||0)},{id:"failed",label:"失败诊断",count:z.length||Number(E.failed||0)+Number(E.canceled||0)},{id:"gpu",label:"GPU/镜像",count:V.length}];function I(C,e){if(C.length===0)return R(hn,{title:e==="current"?"当前队列为空":"暂无记录",text:e==="current"?"从项目库选择或 fork project 后先加入待启动队列,再启动队列。":"终态任务会显示耗时、exit code 和失败诊断。"});return R("div",{className:"table-wrap met-job-table"},R("table",null,R("thead",null,R("tr",null,R("th",null,"状态"),R("th",null,"Project"),R("th",null,"Epoch"),R("th",null,"速度"),R("th",null,"ETA/耗时"),R("th",null,"GPU"),R("th",null,"Exit"),R("th",null,"更新时间"),R("th",null,"操作"))),R("tbody",null,C.map((uu)=>{let Gu=uu.progress||{},s=["staged","queued","running"].includes(uu.status),qu=t.kind==="job"&&t.key===uu.id;return R("tr",{key:uu.id,className:`met-click-row ${qu?"active":""}`,onClick:()=>w(uu),"data-testid":`met-job-row-${t3(uu.id)}`},R("td",null,R(d1,{status:uu.status},yN(uu.status))),R("td",null,R("button",{type:"button",className:"met-inline-link",onClick:(Zu)=>{Zu.stopPropagation(),w(uu)}},uu.projectPath),R("code",null,uu.id)),R("td",null,R("span",null,`${Gu.currentEpoch??"--"} / ${Gu.epochTarget??uu.epochTarget??"--"}`),R("div",{className:"met-progress"},R("span",{style:{width:o1(Gu.progressPercent)}}))),R("td",null,R("strong",null,i3(tN(uu)))),R("td",null,uu.status==="succeeded"||uu.status==="failed"||uu.status==="canceled"?iN(uu):uu.status==="running"?`ETA ${q2(jZ(uu))}`:"--"),R("td",null,uu.gpuName||"--"),R("td",null,uu.exitCode??"--"),R("td",null,wu(uu.updatedAt)),R("td",null,s?R("button",{type:"button",className:"ghost-btn mini",onClick:(Zu)=>{Zu.stopPropagation(),q(uu)},disabled:n.actionBusy},"取消"):null,R(et,{title:`MET Job ${uu.id}`,data:uu,onOpen:l,testId:`raw-met-job-${uu.id}`})))}))))}function b(){return R("div",{className:"met-queue-summary","data-testid":"met-current-summary"},R(d1,{status:"staged"},`待启动 ${E.staged??0}`),R(d1,{status:"queued"},`排队中 ${E.queued??0}`),R(d1,{status:"running"},`训练中 ${E.running??0}`),R("span",null,`最大并发 ${n.summary?.queue?.maxConcurrency??n.queue?.queue?.maxConcurrency??c.maxConcurrency}`),R("span",null,`目标 GPU ${n.summary?.queue?.targetGpuName??n.queue?.queue?.targetGpuName??c.targetGpuName}`))}function d(C,e){let uu=c.expandedProjectDirs[C];return uu===void 0?e<2:Boolean(uu)}function g(C,e){let uu=d(C,e);A({expandedProjectDirs:{...c.expandedProjectDirs,[C]:!uu}})}function x(C){let e=8+Math.max(0,C.depth)*16;if(Boolean(C.project)){let s=C.project,qu=Boolean(c.selectedProjects[s.projectPath]),Zu=t.kind==="project"&&t.key===s.projectPath;return R("div",{key:C.path,className:`met-tree-row project ${qu?"selected":""} ${Zu?"active":""}`,style:{paddingLeft:e},onClick:()=>N(s),"data-testid":`met-project-node-${t3(s.projectPath)}`},R("div",{className:"met-tree-name"},R("input",{type:"checkbox",checked:qu,onClick:(Bu)=>Bu.stopPropagation(),onChange:(Bu)=>A({selectedProjects:{...c.selectedProjects,[s.projectPath]:Bu.target.checked}}),"data-testid":`met-project-checkbox-${t3(s.projectPath)}`}),R("button",{type:"button",className:"met-inline-link project-path",onClick:(Bu)=>{Bu.stopPropagation(),N(s)}},C.name)),R("span",null,s.useModel||"--"),R("span",null,s.epochTrain??"--"),R("span",null,o1(s.progress?.progressPercent)),R("span",null,i3(s.progress?.epochPerHour)))}let Gu=d(C.path,C.depth);return R(uc.default.Fragment,{key:C.path},R("div",{className:"met-tree-row folder",style:{paddingLeft:e},"data-testid":`met-project-folder-${t3(C.path)}`},R("button",{type:"button",className:"met-tree-toggle",onClick:()=>g(C.path,C.depth),"aria-label":Gu?`折叠 ${C.path}`:`展开 ${C.path}`},Gu?"-":"+"),R("strong",null,C.name),R("span",{className:"met-tree-count"},`${C.count} projects`)),Gu?C.children.map((s)=>x(s)):null)}function lu(C){return R("div",{className:"met-detail-kv"},C.map((e)=>R("div",{key:e.label,className:"met-detail-kv-item"},R("span",null,e.label),R("strong",null,e1(e.value)),e.hint?R("small",null,e.hint):null)))}function cu(C,e){return R("div",{className:"met-detail-section"},R("h3",null,C),lu(e))}function _u(C){if(!Array.isArray(C)||C.length===0)return R(hn,{title:"模型层未上报",text:"等待 data/model_info.json 或 compute_analysis.json 生成。"});return R("div",{className:"table-wrap met-layer-table"},R("table",null,R("thead",null,R("tr",null,R("th",null,"Layer"),R("th",null,"Type"),R("th",null,"Params"),R("th",null,"Trainable"),R("th",null,"Compute"))),R("tbody",null,C.slice(0,18).map((e,uu)=>R("tr",{key:`${e.name||"layer"}-${uu}`},R("td",null,e.name||`#${uu+1}`),R("td",null,e.type||"--"),R("td",null,w2(e.num_params)),R("td",null,e.trainable===void 0?"--":String(Boolean(e.trainable))),R("td",null,w2(e.compute?.total??e.estimated_cost?.weighted_units?.total)))))))}function Fu(C){let e=Array.isArray(C)?C:[];if(e.length===0)return R(hn,{title:"data/ 暂无文件",text:"训练或评估完成后会生成 training_state、metrics、model_info 等文件。"});return R("div",{className:"met-file-chip-grid"},e.slice(0,48).map((uu)=>R("span",{key:uu},uu)),e.length>48?R("span",null,`+${e.length-48}`):null)}function zu(C){let e=String(C||"").replace(/\x1b\[[0-9;]*[A-Za-z]/g,"").split(/\r?\n/).map((uu)=>uu.trim()).filter(Boolean).slice(-12);if(e.length===0)return R(hn,{title:"暂无日志尾部",text:"该任务未上报 logTail 或日志已轮转。"});return R("div",{className:"met-log-lines"},e.map((uu,Gu)=>R("div",{key:`${Gu}-${uu.slice(0,16)}`},uu)))}function Wu(){if(t.loading)return R("section",{className:"met-detail-panel","data-testid":"met-detail-panel"},R("div",{className:"panel-head compact"},R("div",null,R("p",{className:"panel-eyebrow"},"Detail Loading"),R(rl,{title:"详情加载中",loading:!0}))),R(hn,{title:"详情加载中",text:t.title||"正在读取 D601 data/ 和 config.json"}));if(t.error)return R("section",{className:"met-detail-panel","data-testid":"met-detail-panel"},R(nl,{error:t.error,wide:!0}));if(!t.data)return R("section",{className:"met-detail-panel muted","data-testid":"met-detail-panel"},R(hn,{title:"选择一个项目或任务查看详情",text:"项目库、当前队列、已完成和失败诊断中的行都可以点击;默认只展示结构化字段,原始 JSON 需显式点击按钮。"}));let C=UZ(t),e=JZ(t),uu=sf(C.config),Gu=sf(C.progress||e.progress),s=sf(C.data),qu=sf(C.metrics||s.metrics||Gu.trainingInfo?.evaluation_metrics),Zu=sf(s.trainingInfo||Gu.trainingInfo),Bu=sf(s.trainingState),Iu=sf(C.model||s.model),ll=Array.isArray(Iu.modelSummary)&&Iu.modelSummary.length>0?Iu.modelSummary:Iu.computeLayers,Pu=sf(Zu.evaluation_metrics),Jl=t.kind==="job"?"训练任务详情":"Project 详情";return R("section",{className:"met-detail-panel","data-testid":"met-detail-panel"},R("div",{className:"panel-head compact"},R("div",null,R("p",{className:"panel-eyebrow"},t.kind==="job"?"Job + Project Detail":"Project Library Detail"),R(rl,{title:Jl}),R("code",null,C.projectPath||e.projectPath||t.title)),R("div",{className:"panel-actions"},R(et,{title:`MET ${Jl}`,data:t.data,onOpen:l,testId:"raw-met-detail"}))),t.kind==="job"?cu("任务状态",[{label:"Job ID",value:e.id},{label:"状态",value:yN(e.status)},{label:"GPU",value:e.gpuName},{label:"Exit Code",value:e.exitCode},{label:"耗时",value:iN(e)},{label:"训练速度",value:i3(tN({...e,progress:Gu}))}]):null,cu("config.json",[{label:"use_model",value:uu.use_model},{label:"epoch_train",value:uu.epoch_train},{label:"step_per_epoch",value:uu.step_per_epoch},{label:"learning_rate",value:uu.learning_rate},{label:"using_gpu",value:uu.using_gpu},{label:"use_points",value:uu.use_points},{label:"sample_rate",value:uu.sample_rate},{label:"time_clipped_s",value:uu.time_clipped_s},{label:"H_UNITS",value:uu.H_UNITS},{label:"INNER_KAN_UNITS",value:uu.INNER_KAN_UNITS},{label:"INNER_KAN_LAYERS",value:uu.INNER_KAN_LAYERS},{label:"GRID_SIZE",value:uu.GRID_SIZE},{label:"SPLINE_ORDER",value:uu.SPLINE_ORDER},{label:"USE_FAST_MODEL",value:uu.USE_FAST_MODEL},{label:"IIR_TRAINABLE",value:uu.IIR_TRAINABLE}]),cu("data/ 训练状态",[{label:"Epoch",value:`${Gu.currentEpoch??Bu.current_epoch??Bu.completed_epoch??"--"} / ${Gu.epochTarget??uu.epoch_train??"--"}`},{label:"Progress",value:o1(Gu.progressPercent)},{label:"Last Loss",value:Gu.lastLoss??Bu.loss},{label:"Last Val Loss",value:Gu.lastValLoss??Bu.val_loss},{label:"Min Loss",value:Zu.min_loss??Bu.min_loss},{label:"Min Val Loss",value:Zu.min_val_loss??Bu.min_val_loss},{label:"Log Lines",value:Gu.logLineCount},{label:"ETA",value:q2(Gu.etaSeconds??Bu.remaining_time)},{label:"训练速度",value:i3(Gu.epochPerHour??Bu.smoothed_speed)},{label:"Training Alive",value:Bu.training_alive}]),cu("模型参数",[{label:"Model Type",value:Iu.modelType??uu.use_model},{label:"Total Params",value:Iu.totalParams,hint:Iu.totalParams===null||Iu.totalParams===void 0?"未上报":"data/model_info.json"},{label:"Trainable",value:Iu.trainableParams},{label:"Non-trainable",value:Iu.nonTrainableParams},{label:"Compute Cost",value:Iu.computeCost},{label:"Estimate Status",value:Iu.estimateStatus},{label:"Unsupported Layers",value:Iu.unsupportedLayerCount}]),cu("指标",[{label:"train_loss",value:qu.train_loss??Pu.train_loss},{label:"val_loss",value:qu.val_loss??Pu.val_loss},{label:"train_mae",value:qu.train_mae??Pu.train_mae},{label:"val_mae",value:qu.val_mae??Pu.val_mae},{label:"train_afmae",value:qu.train_afmae??Pu.train_afmae},{label:"val_afmae",value:qu.val_afmae??Pu.val_afmae},{label:"freq_drift_hz",value:qu.freq_drift_hz},{label:"sens_drift_percent",value:qu.sens_drift_percent},{label:"linearity_percent",value:qu.linearity_percent},{label:"weights_source",value:qu.weights_source??Pu.weights_source},{label:"lr min/mean/max",value:`${e1(Zu.learning_rate_min)} / ${e1(Zu.learning_rate_mean)} / ${e1(Zu.learning_rate_max)}`}]),R("div",{className:"met-detail-section"},R("h3",null,"模型层"),_u(ll)),R("div",{className:"met-detail-section"},R("h3",null,"data/ 文件"),Fu(s.files)),t.kind==="job"?R("div",{className:"met-detail-section"},R("h3",null,"日志尾部"),zu(sf(t.data).logTail)):null)}return R("div",{className:"met-page","data-testid":"met-nonlinear-page"},R(N2,{title:"MET Nonlinear 训练编排",eyebrow:"D601 GPU 用户服务",loading:n.loading||n.actionBusy,actions:R("div",{className:"panel-actions"},R("button",{type:"button",className:"ghost-btn",onClick:j,disabled:n.loading,"data-testid":"met-refresh-button"},n.loading?"刷新中":"刷新"),R(et,{title:"MET Nonlinear 用户服务",data:r,onOpen:l,testId:"raw-met-service"}))},R("div",{className:"findjob-hero"},R("div",null,R("div",{className:"node-version-line"},R(d1,{status:G.providerStatus==="online"?"online":"warn"},G.providerStatus||"unknown"),R("span",null,r.providerId),R("span",null,H.public?"公网暴露":"仅 UniDesk frontend 代理访问")),R("p",{className:"muted paragraph"},r.description)),R("div",{className:"microservice-ref-card"},R("span",null,"Repo"),R("strong",null,Z.url||"--"),R("code",null,Z.commitId||"--")),R("div",{className:"microservice-ref-card"},R("span",null,"D601 Docker"),R("strong",null,`${H.nodeBindHost||"--"}:${H.nodePort||"--"}`),R("code",null,`${Z.composeFile||"--"} / ${Z.containerName||"--"}`))),R(nl,{error:n.error,wide:!0}),c.actionMessage?R("div",{className:"met-action-log","data-testid":"met-action-message"},c.actionMessage):null),R("div",{className:"met-grid"},R(N2,{title:"核心状态",eyebrow:n.refreshedAt?`Updated ${yl(n.refreshedAt)}`:"Queue + GPU",loading:n.loading},R("div",{className:"metric-grid"},R(X0,{label:"Staged",value:E.staged??0,hint:"加入队列未开始",tone:Number(E.staged||0)>0?"warn":""}),R(X0,{label:"Queued",value:E.queued??0,hint:"排队等待调度",tone:Number(E.queued||0)>0?"warn":""}),R(X0,{label:"Running",value:E.running??0,hint:`max ${n.summary?.queue?.maxConcurrency??n.queue?.queue?.maxConcurrency??"--"}`,tone:Number(E.running||0)>0?"ok":""}),R(X0,{label:"Succeeded",value:E.succeeded??0,hint:"已完成"}),R(X0,{label:"Failed",value:E.failed??0,hint:"需要诊断",tone:Number(E.failed||0)>0?"warn":""}),R(X0,{label:"2080Ti Free",value:S?o1(Number(S.freeRatio)*100):"--",hint:S?`${S.memoryFreeMiB}/${S.memoryTotalMiB} MiB`:"等待 GPU 上报"}),R(X0,{label:"ML Image",value:B.present?"READY":"MISSING",hint:B.image||"met-nonlinear-ml:tf26",tone:B.present?"ok":"warn"}),R(X0,{label:"Health",value:n.health?.ok?"OK":"--",hint:"D601 /health"}))),R(N2,{title:"队列控制",eyebrow:"Downloader-like staging",loading:n.actionBusy},R("div",{className:"met-control-strip"},R("label",null,"最大并发",R("input",{type:"number",min:1,max:16,value:c.maxConcurrency,"data-testid":"met-max-concurrency-input",onChange:(C)=>A({maxConcurrency:C.target.value})})),R("label",null,"目标 GPU",R("input",{value:c.targetGpuName,"data-testid":"met-target-gpu-input",onChange:(C)=>A({targetGpuName:C.target.value})})),R("button",{type:"button",className:"ghost-btn",onClick:J,disabled:n.actionBusy,"data-testid":"met-save-settings-button"},"保存设置"),R("button",{type:"button",className:"primary-btn",onClick:U,disabled:n.actionBusy||Number(E.staged||0)===0,"data-testid":"met-start-queue-button"},"启动队列")),R("p",{className:"muted paragraph"},"Project 先进入待启动队列,不会立即训练;点击启动队列后才切换为排队中,并由 D601 scheduler 按最大并发和 2080Ti 显存策略调度。")),R("section",{className:"panel met-workspace"},R("div",{className:"met-tabs",role:"tablist"},k.map((C)=>R("button",{key:C.id,type:"button",className:c.activeTab===C.id?"active":"",onClick:()=>A({activeTab:C.id}),"data-testid":`met-tab-${C.id}`},`${C.label} ${C.count}`))),R("div",{className:"panel-body"},c.activeTab==="projects"?R("div",{className:"met-form-grid","data-testid":"met-projects-pane"},R("div",{className:"met-fork-card"},R("h3",null,"Fork Project"),R("label",null,"源 Project",R("select",{value:Y,"data-testid":"met-source-project-select",onChange:(C)=>A({sourceProject:C.target.value})},X.map((C)=>R("option",{key:C.projectPath,value:C.projectPath},`${C.projectPath} · ${C.useModel||"model?"}`)))),R("label",null,"Fork 数量",R("input",{type:"number",min:1,max:100,value:c.forkCount,"data-testid":"met-fork-count-input",onChange:(C)=>A({forkCount:C.target.value})})),R("label",null,"训练轮数",R("input",{type:"number",min:1,max:1e5,value:c.forkEpochs,"data-testid":"met-fork-epochs-input",onChange:(C)=>A({forkEpochs:C.target.value})})),R("label",null,"目标前缀",R("input",{value:c.forkPrefix,"data-testid":"met-fork-prefix-input",onChange:(C)=>A({forkPrefix:C.target.value})})),R("button",{type:"button",className:"primary-btn",onClick:L,disabled:n.actionBusy||!Y,"data-testid":"met-fork-button"},"Fork Project"),R("p",{className:"muted paragraph"},"Fork 只创建新 Project 并自动勾选,不会直接训练;需要在右侧确认后加入待启动队列。")),R("div",{className:"met-project-list"},R("div",{className:"panel-head compact"},R("div",null,R("p",{className:"panel-eyebrow"},`Existing Projects · ${(n.projects?.roots||[]).map((C)=>`${C.root} ${C.count}`).join(" / ")}`),R(rl,{title:"选择已有 Project",loading:n.loading||n.actionBusy})),R("button",{type:"button",className:"ghost-btn",onClick:W,disabled:n.actionBusy||Q().length===0,"data-testid":"met-stage-selected-button"},`加入待启动队列 (${Q().length})`)),X.length===0?R(hn,{title:"暂无 project",text:"等待 D601 返回 /api/projects"}):R("div",{className:"met-project-table","data-testid":"met-project-tree"},R("div",{className:"met-tree-header"},R("span",null,"文件树 Project"),R("span",null,"Model"),R("span",null,"Epochs"),R("span",null,"Progress"),R("span",null,"速度")),O.children.map((C)=>x(C)))),Wu()):null,c.activeTab==="current"?R("div",{"data-testid":"met-current-pane"},b(),I(p,"current"),Wu(),R("div",{className:"panel-actions inline-actions"},R(et,{title:"MET Queue",data:n.queue,onOpen:l,testId:"raw-met-queue"}))):null,c.activeTab==="completed"?R("div",{"data-testid":"met-completed-pane"},I(v.length>0?v:P.filter((C)=>C.status==="succeeded"),"completed"),Wu()):null,c.activeTab==="failed"?R("div",{"data-testid":"met-failed-pane"},I(z.length>0?z:P.filter((C)=>["failed","canceled"].includes(C.status)),"failed"),Wu(),R("div",{className:"panel-actions inline-actions"},R(et,{title:"MET History",data:n.history,onOpen:l,testId:"raw-met-history"}))):null,c.activeTab==="gpu"?R("div",{className:"met-gpu-pane","data-testid":"met-gpu-pane"},V.length===0?R(hn,{title:"暂无 GPU 上报",text:"等待 D601 met-nonlinear-ts 或 ML image 提供 nvidia-smi 数据"}):R("div",{className:"table-wrap"},R("table",null,R("thead",null,R("tr",null,R("th",null,"Index"),R("th",null,"Name"),R("th",null,"Free"),R("th",null,"Policy"))),R("tbody",null,V.map((C)=>R("tr",{key:C.index},R("td",null,C.index),R("td",null,C.name),R("td",null,`${C.memoryFreeMiB} / ${C.memoryTotalMiB} MiB`,R("div",{className:"met-progress"},R("span",{style:{width:o1(Number(C.freeRatio)*100)}}))),R("td",null,String(C.name||"").includes("2080")?"target 2080Ti, <20% 限制并发":"non-target")))))),R("div",{className:"panel-actions inline-actions"},R(et,{title:"MET Images",data:n.images,onOpen:l,testId:"raw-met-images"}))):null))))}var A3=Cu(Fl(),1);var Qu=A3.default.createElement,{useEffect:$N,useMemo:QZ}=A3.default,c3=A3.default.useState;function AN({status:u,children:l}){let f=String(u||"unknown").toLowerCase();return Qu("span",{className:`status-badge ${f}`},l||u||"unknown")}function lc({label:u,value:l,hint:f,tone:r}){return Qu("article",{className:`metric-card ${r||""}`},Qu("div",{className:"metric-label"},u),Qu("div",{className:"metric-value"},l),Qu("div",{className:"metric-hint"},f))}function _3({title:u,eyebrow:l,actions:f,children:r,className:n,loading:i}){return Qu("section",{className:`panel ${n||""}`},Qu("div",{className:"panel-head"},Qu("div",null,l?Qu("p",{className:"panel-eyebrow"},l):null,Qu(rl,{title:u,loading:i})),f?Qu("div",{className:"panel-actions"},f):null),Qu("div",{className:"panel-body"},r))}function W2({title:u,data:l,onOpen:f,testId:r}){return Qu("button",{type:"button",className:"ghost-btn","data-testid":r,onClick:()=>f(u,l)},"查看原始JSON")}function $3({title:u,text:l}){return Qu("div",{className:"empty-state"},Qu("strong",null,u),Qu("span",null,l))}function NZ(u){return u?.runtime&&typeof u.runtime==="object"&&!Array.isArray(u.runtime)?u.runtime:{}}function qZ(u){return u?.backend&&typeof u.backend==="object"&&!Array.isArray(u.backend)?u.backend:{}}function wZ(u){return u?.repository&&typeof u.repository==="object"&&!Array.isArray(u.repository)?u.repository:{}}function uy(u,l){return`${u}/microservices/mdtodo/proxy${l}`}function jN(u){if(u==="completed")return"已完成";if(u==="in_progress")return"进行中";return"待处理"}function WZ(u){if(u==="completed")return"online";if(u==="in_progress")return"warn";return"unknown"}function L2(u){let l=[],f=(r)=>{for(let n of r)if(l.push(n),Array.isArray(n.children))f(n.children)};return f(Array.isArray(u)?u:[]),l}function LZ({tasks:u,selectedId:l,onSelect:f}){if(!u.length)return Qu($3,{title:"暂无任务",text:"当前文件没有 R 编号任务。"});let r=(n)=>Qu("li",{key:n.id},Qu("button",{type:"button",className:`mdtodo-task-row ${l===n.id?"active":""}`,style:{"--task-depth":Math.min(Number(n.depth||0),6)},onClick:()=>f(n.id),"data-testid":`mdtodo-task-${String(n.id).replace(/[^A-Za-z0-9_-]+/g,"-")}`},Qu(AN,{status:WZ(n.status)},jN(n.status)),Qu("code",null,n.id),Qu("span",{className:"mdtodo-task-title"},n.title||"--"),Qu("span",{className:"mdtodo-link-count"},`${n.linkExists??0}/${n.linkCount??0}`)),Array.isArray(n.children)&&n.children.length>0?Qu("ol",null,n.children.map(r)):null);return Qu("ol",{className:"mdtodo-tree"},u.map(r))}function FN({microservices:u,onRaw:l,apiBaseUrl:f="/api"}){let r=u.find((S)=>S.id==="mdtodo")||null,[n,i]=c3({loading:!1,saving:!1,error:"",notice:"",health:null,files:[],todo:null,selectedFile:"",selectedTaskId:"",refreshedAt:null,command:null}),[t,y]=c3(""),[c,$]=c3(""),[A,j]=c3(""),F=Array.isArray(n.todo?.tasks)?n.todo.tasks:[],J=QZ(()=>L2(F),[n.todo]),Q=J.find((S)=>S.id===n.selectedTaskId)||J[0]||null,W=n.todo?.stats||{};async function L(S=n.selectedFile){if(!r)return;i((B)=>({...B,loading:!0,error:"",notice:""}));try{let[B,D]=await Promise.all([Eu(`${f}/microservices/mdtodo/health`),Eu(uy(f,"/api/files"))]),X=Array.isArray(D.files)?D.files:[],O=S||X[0]?.path||"",Y=O?await Eu(uy(f,`/api/tasks?file=${encodeURIComponent(O)}`)):null,p=Array.isArray(Y?.tasks)?L2(Y.tasks):[],v=p.some((z)=>z.id===n.selectedTaskId)?n.selectedTaskId:p[0]?.id||"";i({loading:!1,saving:!1,error:"",notice:"",health:B,files:X,todo:Y,selectedFile:O,selectedTaskId:v,refreshedAt:new Date,command:n.command})}catch(B){i((D)=>({...D,loading:!1,error:Ou(B,"MDTODO 加载失败")}))}}if($N(()=>{L()},[r?.id,r?.runtime?.providerStatus]),$N(()=>{y(Q?.title||""),$(Q?.rawContent||"")},[Q?.id,n.selectedFile]),!r)return Qu($3,{title:"MDTODO 未登记",text:"请在 config.json 的 microservices 中登记用户服务 id=mdtodo"});let U=NZ(r),q=wZ(r),N=qZ(r);async function w(S){i((B)=>({...B,selectedFile:S,selectedTaskId:"",command:null})),await L(S)}async function G(S){if(!Q||!n.selectedFile)return;i((B)=>({...B,saving:!0,error:"",notice:""}));try{let B=await Eu(uy(f,`/api/tasks/${encodeURIComponent(Q.id)}`),{method:"PATCH",body:{file:n.selectedFile,...S}});i((D)=>({...D,saving:!1,todo:B.file,notice:B.result?.message||"任务已更新"}))}catch(B){i((D)=>({...D,saving:!1,error:Ou(B,"任务更新失败")}))}}async function Z(){await G({title:t,rawContent:c})}async function H(S){if(!n.selectedFile)return;i((B)=>({...B,saving:!0,error:"",notice:""}));try{let B=await Eu(uy(f,"/api/tasks"),{method:"POST",body:{file:n.selectedFile,parentId:S,title:A||"新任务"}});j(""),i((D)=>({...D,saving:!1,todo:B.file,selectedTaskId:B.result?.taskId||D.selectedTaskId,notice:B.result?.message||"任务已创建"})),await L(n.selectedFile)}catch(B){i((D)=>({...D,saving:!1,error:Ou(B,"创建任务失败")}))}}async function E(){if(!Q||!n.selectedFile)return;if(!window.confirm(`删除 ${Q.id} 及其子任务?`))return;i((S)=>({...S,saving:!0,error:"",notice:""}));try{let S=await Eu(uy(f,`/api/tasks/${encodeURIComponent(Q.id)}?file=${encodeURIComponent(n.selectedFile)}`),{method:"DELETE"}),B=L2(S.file?.tasks||[]);i((D)=>({...D,saving:!1,todo:S.file,selectedTaskId:B[0]?.id||"",notice:S.result?.message||"任务已删除"}))}catch(S){i((B)=>({...B,saving:!1,error:Ou(S,"删除任务失败")}))}}async function V(){if(!Q||!n.selectedFile)return;i((S)=>({...S,saving:!0,error:"",command:null}));try{let S=await Eu(uy(f,"/api/execute-command"),{method:"POST",body:{file:n.selectedFile,taskId:Q.id,mode:"codex"}});i((B)=>({...B,saving:!1,command:S,notice:"执行命令已生成"}))}catch(S){i((B)=>({...B,saving:!1,error:Ou(S,"执行命令生成失败")}))}}return Qu("div",{className:"mdtodo-page","data-testid":"mdtodo-page"},Qu(_3,{title:"MDTODO 工作台",eyebrow:"D601 k3s managed service",loading:n.loading,actions:Qu("div",{className:"panel-actions"},Qu("button",{type:"button",className:"ghost-btn",onClick:()=>void L(),disabled:n.loading,"data-testid":"mdtodo-refresh-button"},n.loading?"刷新中":"刷新"),Qu(W2,{title:"MDTODO 用户服务",data:r,onOpen:l,testId:"raw-mdtodo-service"}))},Qu("div",{className:"findjob-hero"},Qu("div",null,Qu("div",{className:"node-version-line"},Qu(AN,{status:U.providerStatus==="online"?"online":"warn"},U.providerStatus||"unknown"),Qu("span",null,r.providerId),Qu("span",null,N.proxyMode||"--")),Qu("p",{className:"muted paragraph"},r.description)),Qu("div",{className:"microservice-ref-card"},Qu("span",null,"Repo"),Qu("strong",null,q.url||"--"),Qu("code",null,q.composeFile||"--")),Qu("div",{className:"microservice-ref-card"},Qu("span",null,"Workspace"),Qu("strong",null,n.health?.rootDir||"/workspace"),Qu("code",null,`${N.nodeBindHost||"--"}:${N.nodePort||"--"}`))),Qu(nl,{error:n.error,wide:!0}),n.notice?Qu("div",{className:"notice-line"},n.notice):null),Qu("div",{className:"metric-grid"},Qu(lc,{label:"TODO 文件",value:n.files.length,hint:n.health?.rootExists?"hostPath ready":"hostPath missing",tone:n.health?.ok?"ok":"warn"}),Qu(lc,{label:"任务总数",value:W.total??"--",hint:n.selectedFile||"--"}),Qu(lc,{label:"已完成",value:W.completed??"--",hint:"completed",tone:"ok"}),Qu(lc,{label:"进行中",value:W.inProgress??"--",hint:"in progress",tone:"warn"}),Qu(lc,{label:"待处理",value:W.pending??"--",hint:n.refreshedAt?yl(n.refreshedAt):"pending"})),Qu("div",{className:"mdtodo-layout"},Qu(_3,{title:"文件",eyebrow:`${n.files.length} Markdown`,loading:n.loading,className:"mdtodo-file-panel"},n.files.length===0?Qu($3,{title:"暂无 TODO 文件",text:"等待后端扫描 MDTODO 工作区。"}):Qu("div",{className:"mdtodo-file-list"},n.files.map((S)=>Qu("button",{key:S.path,type:"button",className:`mdtodo-file-item ${n.selectedFile===S.path?"active":""}`,onClick:()=>void w(S.path)},Qu("strong",null,S.name),Qu("span",null,S.directory||"."),Qu("code",null,`${S.stats?.total??"--"} tasks / ${wu(S.mtime)}`))))),Qu(_3,{title:"任务树",eyebrow:n.selectedFile||"Tasks",loading:n.loading,actions:Qu("div",{className:"panel-actions"},Qu("input",{value:A,onChange:(S)=>j(S.target.value),placeholder:"新任务标题","data-testid":"mdtodo-new-title"}),Qu("button",{type:"button",className:"ghost-btn",onClick:()=>void H(),disabled:n.saving||!n.selectedFile},"新增"),Q?Qu("button",{type:"button",className:"ghost-btn",onClick:()=>void H(Q.id),disabled:n.saving},"新增子任务"):null,n.todo?Qu(W2,{title:"MDTODO 当前文件",data:n.todo,onOpen:l,testId:"raw-mdtodo-file"}):null)},Qu(LZ,{tasks:F,selectedId:Q?.id||"",onSelect:(S)=>i((B)=>({...B,selectedTaskId:S,command:null}))})),Qu(_3,{title:Q?`${Q.id} 详情`:"任务详情",eyebrow:Q?jN(Q.status):"Detail",loading:n.saving,className:"mdtodo-detail-panel",actions:Q?Qu("div",{className:"panel-actions"},Qu("button",{type:"button",className:"ghost-btn",onClick:()=>void G({status:"pending"}),disabled:n.saving},"待处理"),Qu("button",{type:"button",className:"ghost-btn",onClick:()=>void G({status:"in_progress"}),disabled:n.saving},"进行中"),Qu("button",{type:"button",className:"primary-btn",onClick:()=>void G({status:"completed"}),disabled:n.saving},"完成")):null},!Q?Qu($3,{title:"未选中任务",text:"请选择一个任务。"}):Qu("div",{className:"mdtodo-editor"},Qu("label",null,"标题",Qu("input",{value:t,onChange:(S)=>y(S.target.value),"data-testid":"mdtodo-title-input"})),Qu("label",null,"正文",Qu("textarea",{value:c,onChange:(S)=>$(S.target.value),rows:12,"data-testid":"mdtodo-raw-input"})),Qu("div",{className:"docker-meta compact"},Qu("span",null,`line ${Number(Q.lineNumber??0)+1}`),Qu("span",null,`depth ${Q.depth??0}`),Qu("span",null,`links ${Q.linkExists??0}/${Q.linkCount??0}`)),Qu("div",{className:"inline-actions"},Qu("button",{type:"button",className:"primary-btn",onClick:Z,disabled:n.saving},n.saving?"保存中":"保存"),Qu("button",{type:"button",className:"ghost-btn",onClick:V,disabled:n.saving},"生成执行命令"),Qu("button",{type:"button",className:"danger-btn",onClick:E,disabled:n.saving},"删除"),Qu(W2,{title:`MDTODO ${Q.id}`,data:Q,onOpen:l,testId:"raw-mdtodo-task"})),n.command?Qu("div",{className:"mdtodo-command"},Qu("span",null,n.command.prompt||"--"),Qu("code",null,n.command.command||"--")):null))))}var F3=[{id:"ops",label:"运行总览",code:"OPS",tabs:[{id:"status",label:"态势总览"},{id:"performance",label:"性能面板"},{id:"events",label:"事件摘要"},{id:"logs",label:"服务日志"}]},{id:"nodes",label:"资源节点",code:"NODE",tabs:[{id:"list",label:"节点清单"},{id:"monitor",label:"资源监控"},{id:"docker",label:"Docker 状态"},{id:"gateway",label:"网关版本"},{id:"labels",label:"资源标签"},{id:"heartbeats",label:"心跳状态"}]},{id:"tasks",label:"任务调度",code:"TASK",tabs:[{id:"dispatch",label:"下发任务"},{id:"scheduled",label:"定时任务"},{id:"pending",label:"待处理任务"},{id:"history",label:"任务历史"},{id:"results",label:"执行结果"}]},{id:"apps",label:"用户服务",code:"APP",routeSegment:"app",tabs:[{id:"catalog",label:"服务目录"},{id:"todo-note",label:"Todo Note"},{id:"findjob",label:"FindJob"},{id:"pipeline",label:"Pipeline"},{id:"met-nonlinear",label:"MET Nonlinear"},{id:"claudeqq",label:"ClaudeQQ"},{id:"baidu-netdisk",label:"Baidu Netdisk"},{id:"filebrowser",label:"File Browser"},{id:"oa-event-flow",label:"OA Event Flow"},{id:"k3sctl",label:"k3s Control"},{id:"code-queue",label:"Code Queue"},{id:"mdtodo",label:"MDTODO"},{id:"project-manager",label:"Project Manager"}]},{id:"config",label:"系统配置",code:"CFG",tabs:[{id:"topology",label:"连接拓扑"},{id:"auth",label:"认证策略"},{id:"security",label:"安全边界"}]}],fc=Object.fromEntries(F3.map((u)=>[u.id,u.tabs[0]?.id??""]));function TZ(u){let l=String(u||"").trim();if(!l)return"";try{return decodeURIComponent(l)}catch{return l}}function j3(u){let l=String(u||"/"),[f]=l.split(/[?#]/u,1);if(f==="/")return"/";let n=`/${f.split("/").map(TZ).filter(Boolean).join("/")}`;return n.endsWith("/")?n:`${n}/`}function KZ(u){let l=2166136261;for(let f of u)l^=f.charCodeAt(0),l=Math.imul(l,16777619);return Math.abs(l>>>0).toString(36)}function T2(u){return String(u||"").normalize("NFKD").replace(/[\u0300-\u036f]/gu,"").toLowerCase().replace(/[^a-z0-9]+/gu,"-").replace(/^-+|-+$/gu,"")}function UN(u){return String(u||"").trim().toLowerCase().replace(/[\s/\\?#%]+/gu,"-").replace(/-+/gu,"-").replace(/^-+|-+$/gu,"")}function JN(u){let l=T2(u.routeSegment||"")||UN(u.routeSegment||"");if(l)return l;let f=T2(u.id||"");if(f)return f;let r=T2(u.label||"")||UN(u.label||"");if(r)return r;return`route-${KZ(JSON.stringify(u))}`}function K2(u,l){return`${u}:${l}`}function QN(u){let l=u.map((c)=>{let $=JN(c);return{...c,routeSegment:$,tabs:c.tabs.map((A)=>({...A,routeSegment:JN(A)}))}}),f={},r={},n={},i=l.map((c)=>{let $=c.tabs[0]?.id??"";n[c.id]=$;let A=c.tabs.map((J)=>{let Q=`/${c.routeSegment}/${J.routeSegment}/`,W=[Q],L={moduleId:c.id,tabId:J.id};for(let U of W)f[j3(U)]=L;return r[K2(c.id,J.id)]=Q,{...J,canonicalPath:Q,aliases:W}}),j=`/${c.routeSegment}/`,F={moduleId:c.id,tabId:$};return f[j3(j)]=F,{...c,routeSegment:c.routeSegment,canonicalPath:j,tabs:A}}),t=i[0],y={moduleId:t?.id||"",tabId:t?.tabs[0]?.id||""};return f["/"]=y,{modules:i,moduleById:Object.fromEntries(i.map((c)=>[c.id,c])),defaultActiveTabs:n,routeMap:f,canonicalPathByTarget:r,fallbackTarget:y}}function G2(u,l){return u.routeMap[j3(l)]||u.fallbackTarget}function U3(u,l,f){return u.canonicalPathByTarget[K2(l,f)]||u.canonicalPathByTarget[K2(u.fallbackTarget.moduleId,u.fallbackTarget.tabId)]||"/"}function NN(u,l){let f=u.routeMap[j3(l)];if(!f)return null;return U3(u,f.moduleId,f.tabId)}var q3=Cu(Fl(),1);var iu=q3.default.createElement,{useEffect:qN,useMemo:GZ}=q3.default,z2=q3.default.useState;function N3({status:u,children:l,title:f}){let r=String(u||"unknown").toLowerCase();return iu("span",{className:`status-badge ${r}`,title:f},l||u||"unknown")}function rc({label:u,value:l,hint:f,tone:r}){return iu("article",{className:`metric-card ${r||""}`},iu("div",{className:"metric-label"},u),iu("div",{className:"metric-value"},l),iu("div",{className:"metric-hint"},f))}function J3({title:u,eyebrow:l,actions:f,children:r,className:n,loading:i}){return iu("section",{className:`panel ${n||""}`},iu("div",{className:"panel-head"},iu("div",null,l?iu("p",{className:"panel-eyebrow"},l):null,iu(rl,{title:u,loading:i})),f?iu("div",{className:"panel-actions"},f):null),iu("div",{className:"panel-body"},r))}function nc({title:u,data:l,onOpen:f,testId:r}){return iu("button",{type:"button",className:"ghost-btn","data-testid":r,onClick:()=>f?.(u,l)},"查看原始JSON")}function E2({title:u,text:l}){return iu("div",{className:"empty-state"},iu("strong",null,u),iu("span",null,l))}function zZ(u){return u&&typeof u==="object"&&!Array.isArray(u)?u:null}function xn(u){return Array.isArray(u)?u:[]}function af(u){let l=Number(u);return Number.isFinite(l)?l.toLocaleString("zh-CN"):"--"}function wN(u,l=140){if(u===null||u===void 0)return"--";let f=typeof u==="string"?u:JSON.stringify(u),r=String(f||"").replace(/\s+/gu," ").trim();return r.length>l?`${r.slice(0,l-1)}...`:r||"--"}function EZ(u){return xn(u?.tags).map((l)=>String(l||"").trim()).filter(Boolean)}function Xi(u){let l=Number(u);return Number.isFinite(l)&&l>=0?Math.floor(l):0}function OZ(u){return u?.runtime&&typeof u.runtime==="object"&&!Array.isArray(u.runtime)?u.runtime:{}}function ZZ(u){return u?.backend&&typeof u.backend==="object"&&!Array.isArray(u.backend)?u.backend:{}}function HZ(u){return String(u||"").split(/[\s,]+/u).map((l)=>l.trim()).filter(Boolean).join(",")}function Q3(u,l){return`${u}/microservices/oa-event-flow/proxy${l}`}function BZ(u){if(u.includes("error")||u.includes("failed"))return"failed";if(u.includes("stats"))return"ok";if(u.includes("step")||u.includes("updated"))return"running";return"queued"}function mZ(u){let l=String(u?.subjectKind||"trace"),f=String(u?.subjectId||u?.scopeId||"");return f?`${l}:${f}`:String(u?.scopeId||"--")}function VZ({tags:u}){let l=EZ({tags:u}).slice(0,6);return iu("div",{className:"oa-tag-rail"},l.length===0?iu("span",{className:"muted"},"--"):l.map((f)=>iu("code",{key:f},f)))}function DZ({events:u,onRaw:l}){let f=[...xn(u)].reverse();return f.length===0?iu(E2,{title:"事件表暂无记录",text:"等待 Code Queue 或 Pipeline 按 tag 发布 OA 事件"}):iu("div",{className:"table-wrap oa-event-table-wrap"},iu("table",{className:"oa-event-table","data-testid":"oa-event-flow-event-table"},iu("thead",null,iu("tr",null,iu("th",null,"Seq"),iu("th",null,"Type"),iu("th",null,"Source"),iu("th",null,"Aggregate"),iu("th",null,"Tags"),iu("th",null,"Payload"),iu("th",null,"Created"),iu("th",null,"Raw"))),iu("tbody",null,f.map((r)=>{let n=String(r?.type||"event"),i=`${String(r?.aggregateType||"--")}:${String(r?.aggregateId||"--")}`;return iu("tr",{key:r?.eventId||r?.sequence},iu("td",null,iu("code",null,af(r?.sequence))),iu("td",null,iu(N3,{status:BZ(n)},n)),iu("td",null,iu("strong",null,r?.sourceId||"--"),iu("code",null,r?.sourceKind||"--")),iu("td",null,iu("code",null,i)),iu("td",null,iu(VZ,{tags:r?.tags})),iu("td",null,iu("span",{className:"oa-payload-preview"},wN(r?.payload,180))),iu("td",null,wu(r?.createdAt)),iu("td",null,iu(nc,{title:`OA Event ${r?.sequence||""}`,data:r,onOpen:l,testId:`raw-oa-event-${r?.sequence||"unknown"}`})))}))))}function pZ({stats:u,onRaw:l}){let f=xn(u);return f.length===0?iu(E2,{title:"统计中心暂无投影",text:"trace-stats-snapshot / trace-step-created 进入事件流后会更新这里"}):iu("div",{className:"table-wrap oa-stats-table-wrap"},iu("table",{className:"oa-stats-table","data-testid":"oa-event-flow-stats"},iu("thead",null,iu("tr",null,iu("th",null,"Scope"),iu("th",null,"Service"),iu("th",null,"STEP"),iu("th",null,"Read"),iu("th",null,"Edit"),iu("th",null,"Run"),iu("th",null,"Error"),iu("th",null,"Output Seq"),iu("th",null,"Revision"),iu("th",null,"Updated"),iu("th",null,"Raw"))),iu("tbody",null,f.map((r)=>iu("tr",{key:r?.scopeId||`${r?.serviceId}-${r?.subjectId}`},iu("td",null,iu("strong",null,mZ(r)),iu("code",null,r?.scopeId||"--")),iu("td",null,iu(N3,{status:String(r?.serviceId||"unknown")==="code-queue"?"running":"queued"},r?.serviceId||"--")),iu("td",null,iu("strong",null,af(Xi(r?.stepCount??r?.llmStepCount)))),iu("td",null,af(Xi(r?.readCount))),iu("td",null,af(Xi(r?.editCount))),iu("td",null,af(Xi(r?.runCount))),iu("td",null,af(Xi(r?.errorCount))),iu("td",null,iu("code",null,af(Xi(r?.outputMaxSeq)))),iu("td",null,af(Xi(r?.statsRevision))),iu("td",null,wu(r?.updatedAt)),iu("td",null,iu(nc,{title:`OA Trace Stats ${r?.scopeId||""}`,data:r,onOpen:l,testId:`raw-oa-stats-${String(r?.scopeId||"unknown").replace(/[^a-zA-Z0-9_-]/gu,"_")}`})))))))}function WN({microservices:u,onRaw:l,apiBaseUrl:f="/api"}){let r=u.find((G)=>G.id==="oa-event-flow")||null,[n,i]=z2("service:code-queue"),[t,y]=z2({loading:!1,error:"",health:null,diagnostics:null,events:[],stats:[],refreshedAt:null}),[c,$]=z2({status:"idle",message:"未连接",lastEventAt:""}),A=GZ(()=>HZ(n),[n]);async function j(){if(!r)return;y((G)=>({...G,loading:!0,error:""}));try{let G=A?`tags=${encodeURIComponent(A)}&`:"",[Z,H,E,V]=await Promise.all([Eu(`${f}/microservices/oa-event-flow/health`,{failureFields:[]}),Eu(Q3(f,"/api/diagnostics")),Eu(Q3(f,`/api/events?${G}limit=100`)),Eu(Q3(f,`/api/stats/trace?${G}limit=100`))]);y({loading:!1,error:"",health:Z,diagnostics:H,events:xn(E?.events),stats:xn(V?.stats),refreshedAt:new Date})}catch(G){y((Z)=>({...Z,loading:!1,error:Ou(G,"OA Event Flow 加载失败")}))}}if(qN(()=>{j()},[r?.id,r?.runtime?.providerStatus,A]),qN(()=>{if(!r||typeof EventSource>"u")return;let G=A?`?tags=${encodeURIComponent(A)}`:"",Z=new EventSource(`${Q3(f,"/api/events/stream")}${G}`,{withCredentials:!0});$({status:"running",message:"SSE connecting",lastEventAt:""});let H=(S)=>{$({status:"online",message:wN(S.data,120),lastEventAt:new Date().toISOString()})},E=(S)=>{try{let B=JSON.parse(String(S.data||"{}"));$({status:"online",message:String(B?.type||S.type||"event"),lastEventAt:new Date().toISOString()}),y((D)=>{let X=[...xn(D.events).filter((Y)=>String(Y?.eventId||"")!==String(B?.eventId||"")),B].sort((Y,p)=>Number(Y?.sequence||0)-Number(p?.sequence||0)).slice(-100),O=B?.type==="trace-stats-updated"&&zZ(B?.payload?.stats)?[B.payload.stats,...xn(D.stats).filter((Y)=>String(Y?.scopeId||"")!==String(B.payload.stats.scopeId||""))].slice(0,100):D.stats;return{...D,events:X,stats:O}})}catch(B){$({status:"warn",message:Ou(B,"SSE 事件解析失败"),lastEventAt:new Date().toISOString()})}},V=()=>{$((S)=>({...S,status:"warn",message:"SSE reconnecting"}))};return Z.addEventListener("hello",H),Z.addEventListener("task-updated",E),Z.addEventListener("queue-updated",E),Z.addEventListener("trace-step-created",E),Z.addEventListener("trace-stats-snapshot",E),Z.addEventListener("trace-stats-updated",E),Z.addEventListener("trace-error",E),Z.onerror=V,()=>Z.close()},[r?.id,f,A]),!r)return iu(E2,{title:"OA Event Flow 未登记",text:"请在 config.json 的 microservices 中登记 id=oa-event-flow"});let F=OZ(r),J=ZZ(r),Q=t.diagnostics||{},W=t.health||{},L=Q.eventCount??W.eventCount,U=Q.traceStatsCount??W.traceStatsCount,q=Q.latestSequence??W.latestSequence,N=Q.pipelineBridge||W.pipelineBridge||{},w=xn(Q.eventTypes).slice(0,8);return iu("div",{className:"oa-event-flow-page","data-testid":"oa-event-flow-page"},iu(J3,{title:"OA Event Flow 控制台",eyebrow:"Unified OA Event Bus + Stats Projection",loading:t.loading,actions:iu("div",{className:"panel-actions"},iu("button",{type:"button",className:"ghost-btn",onClick:j,disabled:t.loading,"data-testid":"oa-event-flow-refresh"},t.loading?"刷新中":"刷新"),iu(nc,{title:"OA Event Flow Service",data:r,onOpen:l,testId:"raw-oa-event-flow-service"}))},iu("div",{className:"oa-flow-hero"},iu("div",null,iu("div",{className:"node-version-line"},iu(N3,{status:W?.ok||F.providerStatus==="online"?"online":"warn"},W?.ok?"HEALTH OK":F.providerStatus||"unknown"),iu(N3,{status:c.status},c.status.toUpperCase()),iu("span",null,J.public?"公网暴露":"仅 UniDesk frontend 代理访问")),iu("p",{className:"muted paragraph"},"独立事件流微服务统一承载 Code Queue 与 Pipeline 的事件发布、tag 订阅、事件表审计和 Trace/STEP 统计投影。")),iu("div",{className:"oa-flow-signal"},iu("span",null,"stream"),iu("strong",null,c.message||"--"),iu("code",null,c.lastEventAt?yl(new Date(c.lastEventAt)):"waiting"))),iu(nl,{error:t.error,wide:!0})),iu("div",{className:"oa-flow-metrics"},iu(rc,{label:"事件总量",value:af(L),hint:`latest seq ${af(q)}`,tone:"ok"}),iu(rc,{label:"Trace Stats",value:af(U),hint:"oa_trace_stats 投影"}),iu(rc,{label:"SSE Clients",value:af(W?.sseClientCount??xn(Q.sseClients).length),hint:c.message||"tag subscription"}),iu(rc,{label:"Pipeline Bridge",value:N?.enabled?af(N?.insertedCount):"OFF",hint:N?.lastError||N?.lastFinishedAt||`${N?.mode||"snapshot"} service:pipeline`}),iu(rc,{label:"DB",value:W?.databaseReady||Q.databaseReady?"READY":"WAIT",hint:W?.databaseLastError||Q.databaseLastError||"PostgreSQL persisted"})),iu(J3,{title:"标签订阅",eyebrow:t.refreshedAt?`Updated ${yl(t.refreshedAt)}`:"Tag Pub/Sub"},iu("div",{className:"oa-filter-bar"},iu("label",null,iu("span",null,"tags"),iu("input",{value:n,onChange:(G)=>i(G.target.value),placeholder:"service:code-queue, trace","data-testid":"oa-event-flow-tag-filter"})),iu("div",{className:"oa-filter-presets"},iu("button",{type:"button",className:"ghost-btn",onClick:()=>i("service:code-queue")},"Code Queue"),iu("button",{type:"button",className:"ghost-btn",onClick:()=>i("service:pipeline")},"Pipeline"),iu("button",{type:"button",className:"ghost-btn",onClick:()=>i("trace")},"Trace"),iu("button",{type:"button",className:"ghost-btn",onClick:()=>i("")},"All")),iu("code",null,A||"all events")),iu("div",{className:"oa-type-strip"},w.length===0?iu("span",{className:"muted"},"等待事件类型统计"):w.map((G)=>iu("span",{key:G.type,className:"data-chip"},`${G.type} ${af(G.count)}`)))),iu("div",{className:"oa-flow-grid"},iu(J3,{title:"事件表",eyebrow:"oa_events persisted log",className:"oa-flow-wide",loading:t.loading,actions:iu(nc,{title:"OA Event Query",data:{events:t.events,diagnostics:Q},onOpen:l,testId:"raw-oa-events"})},iu(DZ,{events:t.events,onRaw:l})),iu(J3,{title:"统计中心",eyebrow:"oa_trace_stats read model",className:"oa-flow-wide",loading:t.loading,actions:iu(nc,{title:"OA Trace Stats",data:t.stats,onOpen:l,testId:"raw-oa-trace-stats"})},iu(pZ,{stats:t.stats,onRaw:l}))))}var a0=Cu(Fl(),1);var ru=Cu(GN(),1),tu=Cu(Fl(),1);function Xl(u){if(typeof u==="string"||typeof u==="number")return""+u;let l="";if(Array.isArray(u)){for(let f=0,r;f{}};function EN(){for(var u=0,l=arguments.length,f={},r;u=0)r=f.slice(n+1),f=f.slice(0,n);if(f&&!l.hasOwnProperty(f))throw Error("unknown type: "+f);return{type:f,name:r}})}W3.prototype=EN.prototype={constructor:W3,on:function(u,l){var f=this._,r=hZ(u+"",f),n,i=-1,t=r.length;if(arguments.length<2){while(++i0)for(var f=Array(n),r=0,n,i;r=0&&(l=u.slice(0,f))!=="xmlns")u=u.slice(f+1);return O2.hasOwnProperty(l)?{space:O2[l],local:u}:u}function Z2(u){let l;while(l=u.sourceEvent)u=l;return u}function Gf(u,l){if(u=Z2(u),l===void 0)l=u.currentTarget;if(l){var f=l.ownerSVGElement||l;if(f.createSVGPoint){var r=f.createSVGPoint();return r.x=u.clientX,r.y=u.clientY,r=r.matrixTransform(l.getScreenCTM().inverse()),[r.x,r.y]}if(l.getBoundingClientRect){var n=l.getBoundingClientRect();return[u.clientX-n.left-l.clientLeft,u.clientY-n.top-l.clientTop]}}return[u.pageX,u.pageY]}function bZ(){}function Y0(u){return u==null?bZ:function(){return this.querySelector(u)}}function H2(u){if(typeof u!=="function")u=Y0(u);for(var l=this._groups,f=l.length,r=Array(f),n=0;n=N)N=q+1;while(!(G=L[N])&&++N=0;)if(t=r[n]){if(i&&t.compareDocumentPosition(i)^4)i.parentNode.insertBefore(t,i);i=t}return this}function h2(u){if(!u)u=rH;function l(j,F){return j&&F?u(j.__data__,F.__data__):!j-!F}for(var f=this._groups,r=f.length,n=Array(r),i=0;il?1:u>=l?0:NaN}function x2(){var u=arguments[0];return arguments[0]=this,u.apply(null,arguments),this}function b2(){return Array.from(this)}function v2(){for(var u=this._groups,l=0,f=u.length;l1?this.each((l==null?$H:typeof l==="function"?jH:AH)(u,l,f==null?"":f)):P0(this.node(),u)}function P0(u,l){return u.style.getPropertyValue(l)||yc(u).getComputedStyle(u,null).getPropertyValue(l)}function FH(u){return function(){delete this[u]}}function UH(u,l){return function(){this[u]=l}}function JH(u,l){return function(){var f=l.apply(this,arguments);if(f==null)delete this[u];else this[u]=f}}function o2(u,l){return arguments.length>1?this.each((l==null?FH:typeof l==="function"?JH:UH)(u,l)):this.node()[u]}function ON(u){return u.trim().split(/^|\s+/)}function d2(u){return u.classList||new ZN(u)}function ZN(u){this._node=u,this._names=ON(u.getAttribute("class")||"")}ZN.prototype={add:function(u){var l=this._names.indexOf(u);if(l<0)this._names.push(u),this._node.setAttribute("class",this._names.join(" "))},remove:function(u){var l=this._names.indexOf(u);if(l>=0)this._names.splice(l,1),this._node.setAttribute("class",this._names.join(" "))},contains:function(u){return this._names.indexOf(u)>=0}};function HN(u,l){var f=d2(u),r=-1,n=l.length;while(++r=0)f=l.slice(r+1),l=l.slice(0,r);return{type:l,name:f}})}function SH(u){return function(){var l=this.__on;if(!l)return;for(var f=0,r=-1,n=l.length,i;f()=>u;function Ac(u,{sourceEvent:l,subject:f,target:r,identifier:n,active:i,x:t,y,dx:c,dy:$,dispatch:A}){Object.defineProperties(this,{type:{value:u,enumerable:!0,configurable:!0},sourceEvent:{value:l,enumerable:!0,configurable:!0},subject:{value:f,enumerable:!0,configurable:!0},target:{value:r,enumerable:!0,configurable:!0},identifier:{value:n,enumerable:!0,configurable:!0},active:{value:i,enumerable:!0,configurable:!0},x:{value:t,enumerable:!0,configurable:!0},y:{value:y,enumerable:!0,configurable:!0},dx:{value:c,enumerable:!0,configurable:!0},dy:{value:$,enumerable:!0,configurable:!0},_:{value:A}})}Ac.prototype.on=function(){var u=this._.on.apply(this._,arguments);return u===this._?this:u};function IH(u){return!u.ctrlKey&&!u.button}function gH(){return this.parentNode}function sH(u,l){return l==null?{x:u.x,y:u.y}:l}function aH(){return navigator.maxTouchPoints||"ontouchstart"in this}function jc(){var u=IH,l=gH,f=sH,r=aH,n={},i=Yi("start","drag","end"),t=0,y,c,$,A,j=0;function F(w){w.on("mousedown.drag",J).filter(r).on("touchstart.drag",L).on("touchmove.drag",U,DN).on("touchend.drag touchcancel.drag",q).style("touch-action","none").style("-webkit-tap-highlight-color","rgba(0,0,0,0)")}function J(w,G){if(A||!u.call(this,w,G))return;var Z=N(this,l.call(this,w,G),w,G,"mouse");if(!Z)return;el(w.view).on("mousemove.drag",Q,Pi).on("mouseup.drag",W,Pi),ry(w.view),K3(w),$=!1,y=w.clientX,c=w.clientY,Z("start",w)}function Q(w){if(vn(w),!$){var G=w.clientX-y,Z=w.clientY-c;$=G*G+Z*Z>j}n.mouse("drag",w)}function W(w){el(w.view).on("mousemove.drag mouseup.drag",null),_c(w.view,$),vn(w),n.mouse("end",w)}function L(w,G){if(!u.call(this,w,G))return;var Z=w.changedTouches,H=l.call(this,w,G),E=Z.length,V,S;for(V=0;V>8&15|l>>4&240,l>>4&15|l&240,(l&15)<<4|l&15,1):f===8?G3(l>>24&255,l>>16&255,l>>8&255,(l&255)/255):f===4?G3(l>>12&15|l>>8&240,l>>8&15|l>>4&240,l>>4&15|l&240,((l&15)<<4|l&15)/255):null):(l=dH.exec(u))?new of(l[1],l[2],l[3],1):(l=eH.exec(u))?new of(l[1]*255/100,l[2]*255/100,l[3]*255/100,1):(l=uB.exec(u))?G3(l[1],l[2],l[3],l[4]):(l=lB.exec(u))?G3(l[1]*255/100,l[2]*255/100,l[3]*255/100,l[4]):(l=fB.exec(u))?MN(l[1],l[2]/100,l[3]/100,1):(l=rB.exec(u))?MN(l[1],l[2]/100,l[3]/100,l[4]):pN.hasOwnProperty(u)?YN(pN[u]):u==="transparent"?new of(NaN,NaN,NaN,0):null}function YN(u){return new of(u>>16&255,u>>8&255,u&255,1)}function G3(u,l,f,r){if(r<=0)u=l=f=NaN;return new of(u,l,f,r)}function tB(u){if(!(u instanceof Qc))u=dr(u);if(!u)return new of;return u=u.rgb(),new of(u.r,u.g,u.b,u.opacity)}function iy(u,l,f,r){return arguments.length===1?tB(u):new of(u,l,f,r==null?1:r)}function of(u,l,f,r){this.r=+u,this.g=+l,this.b=+f,this.opacity=+r}Fc(of,iy,F5(Qc,{brighter(u){return u=u==null?E3:Math.pow(E3,u),new of(this.r*u,this.g*u,this.b*u,this.opacity)},darker(u){return u=u==null?Uc:Math.pow(Uc,u),new of(this.r*u,this.g*u,this.b*u,this.opacity)},rgb(){return this},clamp(){return new of(Mi(this.r),Mi(this.g),Mi(this.b),O3(this.opacity))},displayable(){return-0.5<=this.r&&this.r<255.5&&(-0.5<=this.g&&this.g<255.5)&&(-0.5<=this.b&&this.b<255.5)&&(0<=this.opacity&&this.opacity<=1)},hex:PN,formatHex:PN,formatHex8:yB,formatRgb:CN,toString:CN}));function PN(){return`#${Ci(this.r)}${Ci(this.g)}${Ci(this.b)}`}function yB(){return`#${Ci(this.r)}${Ci(this.g)}${Ci(this.b)}${Ci((isNaN(this.opacity)?1:this.opacity)*255)}`}function CN(){let u=O3(this.opacity);return`${u===1?"rgb(":"rgba("}${Mi(this.r)}, ${Mi(this.g)}, ${Mi(this.b)}${u===1?")":`, ${u})`}`}function O3(u){return isNaN(u)?1:Math.max(0,Math.min(1,u))}function Mi(u){return Math.max(0,Math.min(255,Math.round(u)||0))}function Ci(u){return u=Mi(u),(u<16?"0":"")+u.toString(16)}function MN(u,l,f,r){if(r<=0)u=l=f=NaN;else if(f<=0||f>=1)u=l=NaN;else if(l<=0)u=NaN;return new or(u,l,f,r)}function hN(u){if(u instanceof or)return new or(u.h,u.s,u.l,u.opacity);if(!(u instanceof Qc))u=dr(u);if(!u)return new or;if(u instanceof or)return u;u=u.rgb();var l=u.r/255,f=u.g/255,r=u.b/255,n=Math.min(l,f,r),i=Math.max(l,f,r),t=NaN,y=i-n,c=(i+n)/2;if(y){if(l===i)t=(f-r)/y+(f0&&c<1?0:t;return new or(t,y,c,u.opacity)}function xN(u,l,f,r){return arguments.length===1?hN(u):new or(u,l,f,r==null?1:r)}function or(u,l,f,r){this.h=+u,this.s=+l,this.l=+f,this.opacity=+r}Fc(or,xN,F5(Qc,{brighter(u){return u=u==null?E3:Math.pow(E3,u),new or(this.h,this.s,this.l*u,this.opacity)},darker(u){return u=u==null?Uc:Math.pow(Uc,u),new or(this.h,this.s,this.l*u,this.opacity)},rgb(){var u=this.h%360+(this.h<0)*360,l=isNaN(u)||isNaN(this.s)?0:this.s,f=this.l,r=f+(f<0.5?f:1-f)*l,n=2*f-r;return new of(U5(u>=240?u-240:u+120,n,r),U5(u,n,r),U5(u<120?u+240:u-120,n,r),this.opacity)},clamp(){return new or(RN(this.h),z3(this.s),z3(this.l),O3(this.opacity))},displayable(){return(0<=this.s&&this.s<=1||isNaN(this.s))&&(0<=this.l&&this.l<=1)&&(0<=this.opacity&&this.opacity<=1)},formatHsl(){let u=O3(this.opacity);return`${u===1?"hsl(":"hsla("}${RN(this.h)}, ${z3(this.s)*100}%, ${z3(this.l)*100}%${u===1?")":`, ${u})`}`}}));function RN(u){return u=(u||0)%360,u<0?u+360:u}function z3(u){return Math.max(0,Math.min(1,u||0))}function U5(u,l,f){return(u<60?l+(f-l)*u/60:u<180?f:u<240?l+(f-l)*(240-u)/60:l)*255}function J5(u,l,f,r,n){var i=u*u,t=i*u;return((1-3*u+3*i-t)*l+(4-6*i+3*t)*f+(1+3*u+3*i-3*t)*r+t*n)/6}function Q5(u){var l=u.length-1;return function(f){var r=f<=0?f=0:f>=1?(f=1,l-1):Math.floor(f*l),n=u[r],i=u[r+1],t=r>0?u[r-1]:2*n-i,y=r()=>u;function _B(u,l){return function(f){return u+f*l}}function $B(u,l,f){return u=Math.pow(u,f),l=Math.pow(l,f)-u,f=1/f,function(r){return Math.pow(u+r*l,f)}}function bN(u){return(u=+u)===1?H3:function(l,f){return f-l?$B(l,f,u):Nc(isNaN(l)?f:l)}}function H3(u,l){var f=l-u;return f?_B(u,f):Nc(isNaN(u)?l:u)}var Ri=function u(l){var f=bN(l);function r(n,i){var t=f((n=iy(n)).r,(i=iy(i)).r),y=f(n.g,i.g),c=f(n.b,i.b),$=H3(n.opacity,i.opacity);return function(A){return n.r=t(A),n.g=y(A),n.b=c(A),n.opacity=$(A),n+""}}return r.gamma=u,r}(1);function vN(u){return function(l){var f=l.length,r=Array(f),n=Array(f),i=Array(f),t,y;for(t=0;tf)if(i=l.slice(f,i),y[t])y[t]+=i;else y[++t]=i;if((r=r[0])===(n=n[0]))if(y[t])y[t]+=n;else y[++t]=n;else y[++t]=null,c.push({i:t,x:zf(r,n)});f=L5.lastIndex}if(f180)A+=360;else if(A-$>180)$+=360;F.push({i:j.push(n(j)+"rotate(",null,r)-2,x:zf($,A)})}else if(A)j.push(n(j)+"rotate("+A+r)}function y($,A,j,F){if($!==A)F.push({i:j.push(n(j)+"skewX(",null,r)-2,x:zf($,A)});else if(A)j.push(n(j)+"skewX("+A+r)}function c($,A,j,F,J,Q){if($!==j||A!==F){var W=J.push(n(J)+"scale(",null,",",null,")");Q.push({i:W-4,x:zf($,j)},{i:W-2,x:zf(A,F)})}else if(j!==1||F!==1)J.push(n(J)+"scale("+j+","+F+")")}return function($,A){var j=[],F=[];return $=u($),A=u(A),i($.translateX,$.translateY,A.translateX,A.translateY,j,F),t($.rotate,A.rotate,j,F),y($.skewX,A.skewX,j,F),c($.scaleX,$.scaleY,A.scaleX,A.scaleY,j,F),$=A=null,function(J){var Q=-1,W=F.length,L;while(++Q=0)u._call.call(void 0,l);u=u._next}--yy}function fq(){xi=(p3=Lc.now())+S3,yy=wc=0;try{iq()}finally{yy=0,VB(),xi=0}}function mB(){var u=Lc.now(),l=u-p3;if(l>rq)S3-=l,p3=u}function VB(){var u,l=D3,f,r=1/0;while(l)if(l._call){if(r>l._time)r=l._time;u=l,l=l._next}else f=l._next,l._next=null,l=u?u._next=f:D3=f;Wc=u,z5(r)}function z5(u){if(yy)return;if(wc)wc=clearTimeout(wc);var l=u-xi;if(l>24){if(u<1/0)wc=setTimeout(fq,u-Lc.now()-S3);if(qc)qc=clearInterval(qc)}else{if(!qc)p3=Lc.now(),qc=setInterval(mB,rq);yy=1,nq(fq)}}function Gc(u,l,f){var r=new Tc;return l=l==null?0:+l,r.restart((n)=>{r.stop(),u(n+l)},l,f),r}var pB=Yi("start","end","cancel","interrupt"),SB=[],cq=0,tq=1,P3=2,Y3=3,yq=4,C3=5,zc=6;function kn(u,l,f,r,n,i){var t=u.__transition;if(!t)u.__transition={};else if(f in t)return;XB(u,f,{name:l,index:r,group:n,on:pB,tween:SB,time:i.time,delay:i.delay,duration:i.duration,ease:i.ease,timer:null,state:cq})}function Ec(u,l){var f=uf(u,l);if(f.state>cq)throw Error("too late; already scheduled");return f}function Uf(u,l){var f=uf(u,l);if(f.state>Y3)throw Error("too late; already running");return f}function uf(u,l){var f=u.__transition;if(!f||!(f=f[l]))throw Error("transition not found");return f}function XB(u,l,f){var r=u.__transition,n;r[l]=f,f.timer=X3(i,0,f.time);function i($){if(f.state=tq,f.timer.restart(t,f.delay,f.time),f.delay<=$)t($-f.delay)}function t($){var A,j,F,J;if(f.state!==tq)return c();for(A in r){if(J=r[A],J.name!==f.name)continue;if(J.state===Y3)return Gc(t);if(J.state===yq)J.state=zc,J.timer.stop(),J.on.call("interrupt",u,u.__data__,J.index,J.group),delete r[A];else if(+AP3&&r.state=0)l=l.slice(0,f);return!l||l==="start"})}function fm(u,l,f){var r,n,i=lm(l)?Ec:Uf;return function(){var t=i(this,u),y=t.on;if(y!==r)(n=(r=y).copy()).on(l,f);t.on=n}}function X5(u,l){var f=this._id;return arguments.length<2?uf(this.node(),f).on.on(u):this.each(fm(f,u,l))}function rm(u){return function(){var l=this.parentNode;for(var f in this.__transition)if(+f!==u)return;if(l)l.removeChild(this)}}function Y5(){return this.on("end.remove",rm(this._id))}function P5(u){var l=this._name,f=this._id;if(typeof u!=="function")u=Y0(u);for(var r=this._groups,n=r.length,i=Array(n),t=0;t()=>u;function g5(u,{sourceEvent:l,target:f,transform:r,dispatch:n}){Object.defineProperties(this,{type:{value:u,enumerable:!0,configurable:!0},sourceEvent:{value:l,enumerable:!0,configurable:!0},target:{value:f,enumerable:!0,configurable:!0},transform:{value:r,enumerable:!0,configurable:!0},_:{value:n}})}function er(u,l,f){this.k=u,this.x=l,this.y=f}er.prototype={constructor:er,scale:function(u){return u===1?this:new er(this.k*u,this.x,this.y)},translate:function(u,l){return u===0&l===0?this:new er(this.k,this.x+this.k*u,this.y+this.k*l)},apply:function(u){return[u[0]*this.k+this.x,u[1]*this.k+this.y]},applyX:function(u){return u*this.k+this.x},applyY:function(u){return u*this.k+this.y},invert:function(u){return[(u[0]-this.x)/this.k,(u[1]-this.y)/this.k]},invertX:function(u){return(u-this.x)/this.k},invertY:function(u){return(u-this.y)/this.k},rescaleX:function(u){return u.copy().domain(u.range().map(this.invertX,this).map(u.invert,u))},rescaleY:function(u){return u.copy().domain(u.range().map(this.invertY,this).map(u.invert,u))},toString:function(){return"translate("+this.x+","+this.y+") scale("+this.k+")"}};var bi=new er(1,0,0);Hc.prototype=er.prototype;function Hc(u){while(!u.__zoom)if(!(u=u.parentNode))return bi;return u.__zoom}function a3(u){u.stopImmediatePropagation()}function vi(u){u.preventDefault(),u.stopImmediatePropagation()}function wm(u){return(!u.ctrlKey||u.type==="wheel")&&!u.button}function Wm(){var u=this;if(u instanceof SVGElement){if(u=u.ownerSVGElement||u,u.hasAttribute("viewBox"))return u=u.viewBox.baseVal,[[u.x,u.y],[u.x+u.width,u.y+u.height]];return[[0,0],[u.width.baseVal.value,u.height.baseVal.value]]}return[[0,0],[u.clientWidth,u.clientHeight]]}function Aq(){return this.__zoom||bi}function Lm(u){return-u.deltaY*(u.deltaMode===1?0.05:u.deltaMode?1:0.002)*(u.ctrlKey?10:1)}function Tm(){return navigator.maxTouchPoints||"ontouchstart"in this}function Km(u,l,f){var r=u.invertX(l[0][0])-f[0][0],n=u.invertX(l[1][0])-f[1][0],i=u.invertY(l[0][1])-f[0][1],t=u.invertY(l[1][1])-f[1][1];return u.translate(n>r?(r+n)/2:Math.min(0,r)||Math.max(0,n),t>i?(i+t)/2:Math.min(0,i)||Math.max(0,t))}function Bc(){var u=wm,l=Wm,f=Km,r=Lm,n=Tm,i=[0,1/0],t=[[-1/0,-1/0],[1/0,1/0]],y=250,c=hi,$=Yi("start","zoom","end"),A,j,F,J=500,Q=150,W=0,L=10;function U(O){O.property("__zoom",Aq).on("wheel.zoom",E,{passive:!1}).on("mousedown.zoom",V).on("dblclick.zoom",S).filter(n).on("touchstart.zoom",B).on("touchmove.zoom",D).on("touchend.zoom touchcancel.zoom",X).style("-webkit-tap-highlight-color","rgba(0,0,0,0)")}U.transform=function(O,Y,p,v){var z=O.selection?O.selection():O;if(z.property("__zoom",Aq),O!==z)G(O,Y,p,v);else z.interrupt().each(function(){Z(this,arguments).event(v).start().zoom(null,typeof Y==="function"?Y.apply(this,arguments):Y).end()})},U.scaleBy=function(O,Y,p,v){U.scaleTo(O,function(){var z=this.__zoom.k,P=typeof Y==="function"?Y.apply(this,arguments):Y;return z*P},p,v)},U.scaleTo=function(O,Y,p,v){U.transform(O,function(){var z=l.apply(this,arguments),P=this.__zoom,k=p==null?w(z):typeof p==="function"?p.apply(this,arguments):p,I=P.invert(k),b=typeof Y==="function"?Y.apply(this,arguments):Y;return f(N(q(P,b),k,I),z,t)},p,v)},U.translateBy=function(O,Y,p,v){U.transform(O,function(){return f(this.__zoom.translate(typeof Y==="function"?Y.apply(this,arguments):Y,typeof p==="function"?p.apply(this,arguments):p),l.apply(this,arguments),t)},null,v)},U.translateTo=function(O,Y,p,v,z){U.transform(O,function(){var P=l.apply(this,arguments),k=this.__zoom,I=v==null?w(P):typeof v==="function"?v.apply(this,arguments):v;return f(bi.translate(I[0],I[1]).scale(k.k).translate(typeof Y==="function"?-Y.apply(this,arguments):-Y,typeof p==="function"?-p.apply(this,arguments):-p),P,t)},v,z)};function q(O,Y){return Y=Math.max(i[0],Math.min(i[1],Y)),Y===O.k?O:new er(Y,O.x,O.y)}function N(O,Y,p){var v=Y[0]-p[0]*O.k,z=Y[1]-p[1]*O.k;return v===O.x&&z===O.y?O:new er(O.k,v,z)}function w(O){return[(+O[0][0]+ +O[1][0])/2,(+O[0][1]+ +O[1][1])/2]}function G(O,Y,p,v){O.on("start.zoom",function(){Z(this,arguments).event(v).start()}).on("interrupt.zoom end.zoom",function(){Z(this,arguments).event(v).end()}).tween("zoom",function(){var z=this,P=arguments,k=Z(z,P).event(v),I=l.apply(z,P),b=p==null?w(I):typeof p==="function"?p.apply(z,P):p,d=Math.max(I[1][0]-I[0][0],I[1][1]-I[0][1]),g=z.__zoom,x=typeof Y==="function"?Y.apply(z,P):Y,lu=c(g.invert(b).concat(d/g.k),x.invert(b).concat(d/x.k));return function(cu){if(cu===1)cu=x;else{var _u=lu(cu),Fu=d/_u[2];cu=new er(Fu,b[0]-_u[0]*Fu,b[1]-_u[1]*Fu)}k.zoom(null,cu)}})}function Z(O,Y,p){return!p&&O.__zooming||new H(O,Y)}function H(O,Y){this.that=O,this.args=Y,this.active=0,this.sourceEvent=null,this.extent=l.apply(O,Y),this.taps=0}H.prototype={event:function(O){if(O)this.sourceEvent=O;return this},start:function(){if(++this.active===1)this.that.__zooming=this,this.emit("start");return this},zoom:function(O,Y){if(this.mouse&&O!=="mouse")this.mouse[1]=Y.invert(this.mouse[0]);if(this.touch0&&O!=="touch")this.touch0[1]=Y.invert(this.touch0[0]);if(this.touch1&&O!=="touch")this.touch1[1]=Y.invert(this.touch1[0]);return this.that.__zoom=Y,this.emit("zoom"),this},end:function(){if(--this.active===0)delete this.that.__zooming,this.emit("end");return this},emit:function(O){var Y=el(this.that).datum();$.call(O,this.that,new g5(O,{sourceEvent:this.sourceEvent,target:U,type:O,transform:this.that.__zoom,dispatch:$}),Y)}};function E(O,...Y){if(!u.apply(this,arguments))return;var p=Z(this,Y).event(O),v=this.__zoom,z=Math.max(i[0],Math.min(i[1],v.k*Math.pow(2,r.apply(this,arguments)))),P=Gf(O);if(p.wheel){if(p.mouse[0][0]!==P[0]||p.mouse[0][1]!==P[1])p.mouse[1]=v.invert(p.mouse[0]=P);clearTimeout(p.wheel)}else if(v.k===z)return;else p.mouse=[P,v.invert(P)],C0(this),p.start();vi(O),p.wheel=setTimeout(k,Q),p.zoom("mouse",f(N(q(v,z),p.mouse[0],p.mouse[1]),p.extent,t));function k(){p.wheel=null,p.end()}}function V(O,...Y){if(F||!u.apply(this,arguments))return;var p=O.currentTarget,v=Z(this,Y,!0).event(O),z=el(O.view).on("mousemove.zoom",b,!0).on("mouseup.zoom",d,!0),P=Gf(O,p),k=O.clientX,I=O.clientY;ry(O.view),a3(O),v.mouse=[P,this.__zoom.invert(P)],C0(this),v.start();function b(g){if(vi(g),!v.moved){var x=g.clientX-k,lu=g.clientY-I;v.moved=x*x+lu*lu>W}v.event(g).zoom("mouse",f(N(v.that.__zoom,v.mouse[0]=Gf(g,p),v.mouse[1]),v.extent,t))}function d(g){z.on("mousemove.zoom mouseup.zoom",null),_c(g.view,v.moved),vi(g),v.event(g).end()}}function S(O,...Y){if(!u.apply(this,arguments))return;var p=this.__zoom,v=Gf(O.changedTouches?O.changedTouches[0]:O,this),z=p.invert(v),P=p.k*(O.shiftKey?0.5:2),k=f(N(q(p,P),v,z),l.apply(this,Y),t);if(vi(O),y>0)el(this).transition().duration(y).call(G,k,v,O);else el(this).call(U.transform,k,v,O)}function B(O,...Y){if(!u.apply(this,arguments))return;var p=O.touches,v=p.length,z=Z(this,Y,O.changedTouches.length===v).event(O),P,k,I,b;a3(O);for(k=0;k"[React Flow]: Seems like you have not used zustand provider as an ancestor. Help: https://reactflow.dev/error#001",error002:()=>"It looks like you've created a new nodeTypes or edgeTypes object. If this wasn't on purpose please define the nodeTypes/edgeTypes outside of the component or memoize them.",error003:(u)=>`Node type "${u}" not found. Using fallback type "default".`,error004:()=>"The React Flow parent container needs a width and a height to render the graph.",error005:()=>"Only child nodes can use a parent extent.",error006:()=>"Can't create edge. An edge needs a source and a target.",error007:(u)=>`The old edge with id=${u} does not exist.`,error009:(u)=>`Marker type "${u}" doesn't exist.`,error008:(u,{id:l,sourceHandle:f,targetHandle:r})=>`Couldn't create edge for ${u} handle id: "${u==="source"?f:r}", edge id: ${l}.`,error010:()=>"Handle: No node id found. Make sure to only use a Handle inside a custom Node.",error011:(u)=>`Edge type "${u}" not found. Using fallback type "default".`,error012:(u)=>`Node with id "${u}" does not exist, it may have been removed. This can happen when a node is deleted before the "onNodeClick" handler is called.`,error013:(u="react")=>`It seems that you haven't loaded the styles. Please import '@xyflow/${u}/dist/style.css' or base.css to make sure everything is working properly.`,error014:()=>"useNodeConnections: No node ID found. Call useNodeConnections inside a custom Node or provide a node ID.",error015:()=>"It seems that you are trying to drag a node that is not initialized. Please use onNodesChange as explained in the docs."},Fy=[[Number.NEGATIVE_INFINITY,Number.NEGATIVE_INFINITY],[Number.POSITIVE_INFINITY,Number.POSITIVE_INFINITY]],e5=["Enter"," ","Escape"],u9={"node.a11yDescription.default":"Press enter or space to select a node. Press delete to remove it and escape to cancel.","node.a11yDescription.keyboardDisabled":"Press enter or space to select a node. You can then use the arrow keys to move the node around. Press delete to remove it and escape to cancel.","node.a11yDescription.ariaLiveMessage":({direction:u,x:l,y:f})=>`Moved selected node ${u}. New position, x: ${l}, y: ${f}`,"edge.a11yDescription.default":"Press enter or space to select an edge. You can then press delete to remove it or escape to cancel.","controls.ariaLabel":"Control Panel","controls.zoomIn.ariaLabel":"Zoom In","controls.zoomOut.ariaLabel":"Zoom Out","controls.fitView.ariaLabel":"Fit View","controls.interactive.ariaLabel":"Toggle Interactivity","minimap.ariaLabel":"Mini Map","handle.ariaLabel":"Handle"},h0;(function(u){u.Strict="strict",u.Loose="loose"})(h0||(h0={}));var gn;(function(u){u.Free="free",u.Vertical="vertical",u.Horizontal="horizontal"})(gn||(gn={}));var ki;(function(u){u.Partial="partial",u.Full="full"})(ki||(ki={}));var l9={inProgress:!1,isValid:null,from:null,fromHandle:null,fromPosition:null,fromNode:null,to:null,toHandle:null,toPosition:null,toNode:null,pointer:null},Nn;(function(u){u.Bezier="default",u.Straight="straight",u.Step="step",u.SmoothStep="smoothstep",u.SimpleBezier="simplebezier"})(Nn||(Nn={}));var x0;(function(u){u.Arrow="arrow",u.ArrowClosed="arrowclosed"})(x0||(x0={}));var Ku;(function(u){u.Left="left",u.Top="top",u.Right="right",u.Bottom="bottom"})(Ku||(Ku={}));var jq={[Ku.Left]:Ku.Right,[Ku.Right]:Ku.Left,[Ku.Top]:Ku.Bottom,[Ku.Bottom]:Ku.Top};function f9(u){return u===null?null:u?"valid":"invalid"}var r9=(u)=>("id"in u)&&("source"in u)&&("target"in u),zq=(u)=>("id"in u)&&("position"in u)&&!("source"in u)&&!("target"in u),n9=(u)=>("id"in u)&&("internals"in u)&&!("source"in u)&&!("target"in u);var Dc=(u,l=[0,0])=>{let{width:f,height:r}=qn(u),n=u.origin??l,i=f*n[0],t=r*n[1];return{x:u.position.x-i,y:u.position.y-t}},i9=(u,l={nodeOrigin:[0,0]})=>{if(u.length===0)return{x:0,y:0,width:0,height:0};let f=u.reduce((r,n)=>{let i=typeof n==="string",t=!l.nodeLookup&&!i?n:void 0;if(l.nodeLookup)t=i?l.nodeLookup.get(n):!n9(n)?l.nodeLookup.get(n.id):n;let y=t?e3(t,l.nodeOrigin):{x:0,y:0,x2:0,y2:0};return lA(r,y)},{x:1/0,y:1/0,x2:-1/0,y2:-1/0});return fA(f)},Uy=(u,l={})=>{let f={x:1/0,y:1/0,x2:-1/0,y2:-1/0},r=!1;return u.forEach((n)=>{if(l.filter===void 0||l.filter(n))f=lA(f,e3(n)),r=!0}),r?fA(f):{x:0,y:0,width:0,height:0}},uA=(u,l,[f,r,n]=[0,0,1],i=!1,t=!1)=>{let y={...Ny(l,[f,r,n]),width:l.width/n,height:l.height/n},c=[];for(let $ of u.values()){let{measured:A,selectable:j=!0,hidden:F=!1}=$;if(t&&!j||F)continue;let J=A.width??$.width??$.initialWidth??null,Q=A.height??$.height??$.initialHeight??null,W=Jy(y,gi($)),L=(J??0)*(Q??0),U=i&&W>0;if(!$.internals.handleBounds||U||W>=L||$.dragging)c.push($)}return c},Eq=(u,l)=>{let f=new Set;return u.forEach((r)=>{f.add(r.id)}),l.filter((r)=>f.has(r.source)||f.has(r.target))};function Gm(u,l){let f=new Map,r=l?.nodes?new Set(l.nodes.map((n)=>n.id)):null;return u.forEach((n)=>{if(n.measured.width&&n.measured.height&&(l?.includeHiddenNodes||!n.hidden)&&(!r||r.has(n.id)))f.set(n.id,n)}),f}async function Oq({nodes:u,width:l,height:f,panZoom:r,minZoom:n,maxZoom:i},t){if(u.size===0)return Promise.resolve(!0);let y=Gm(u,t),c=Uy(y),$=pc(c,l,f,t?.minZoom??n,t?.maxZoom??i,t?.padding??0.1);return await r.setViewport($,{duration:t?.duration,ease:t?.ease,interpolate:t?.interpolate}),Promise.resolve(!0)}function t9({nodeId:u,nextPosition:l,nodeLookup:f,nodeOrigin:r=[0,0],nodeExtent:n,onError:i}){let t=f.get(u),y=t.parentId?f.get(t.parentId):void 0,{x:c,y:$}=y?y.internals.positionAbsolute:{x:0,y:0},A=t.origin??r,j=t.extent||n;if(t.extent==="parent"&&!t.expandParent)if(!y)i?.("005",Qr.error005());else{let J=y.measured.width,Q=y.measured.height;if(J&&Q)j=[[c,$],[c+J,$+Q]]}else if(y&&jy(t.extent))j=[[t.extent[0][0]+c,t.extent[0][1]+$],[t.extent[1][0]+c,t.extent[1][1]+$]];let F=jy(j)?Ii(l,j,t.measured):l;if(t.measured.width===void 0||t.measured.height===void 0)i?.("015",Qr.error015());return{position:{x:F.x-c+(t.measured.width??0)*A[0],y:F.y-$+(t.measured.height??0)*A[1]},positionAbsolute:F}}async function Zq({nodesToRemove:u=[],edgesToRemove:l=[],nodes:f,edges:r,onBeforeDelete:n}){let i=new Set(u.map((F)=>F.id)),t=[];for(let F of f){if(F.deletable===!1)continue;let J=i.has(F.id),Q=!J&&F.parentId&&t.find((W)=>W.id===F.parentId);if(J||Q)t.push(F)}let y=new Set(l.map((F)=>F.id)),c=r.filter((F)=>F.deletable!==!1),A=Eq(t,c);for(let F of c)if(y.has(F.id)&&!A.find((Q)=>Q.id===F.id))A.push(F);if(!n)return{edges:A,nodes:t};let j=await n({nodes:t,edges:A});if(typeof j==="boolean")return j?{edges:A,nodes:t}:{edges:[],nodes:[]};return j}var Ay=(u,l=0,f=1)=>Math.min(Math.max(u,l),f),Ii=(u={x:0,y:0},l,f)=>({x:Ay(u.x,l[0][0],l[1][0]-(f?.width??0)),y:Ay(u.y,l[0][1],l[1][1]-(f?.height??0))});function Hq(u,l,f){let{width:r,height:n}=qn(f),{x:i,y:t}=f.internals.positionAbsolute;return Ii(u,[[i,t],[i+r,t+n]],l)}var Fq=(u,l,f)=>{if(uf)return-Ay(Math.abs(u-f),1,l)/l;return 0},Bq=(u,l,f=15,r=40)=>{let n=Fq(u.x,r,l.width-r)*f,i=Fq(u.y,r,l.height-r)*f;return[n,i]},lA=(u,l)=>({x:Math.min(u.x,l.x),y:Math.min(u.y,l.y),x2:Math.max(u.x2,l.x2),y2:Math.max(u.y2,l.y2)}),d5=({x:u,y:l,width:f,height:r})=>({x:u,y:l,x2:u+f,y2:l+r}),fA=({x:u,y:l,x2:f,y2:r})=>({x:u,y:l,width:f-u,height:r-l}),gi=(u,l=[0,0])=>{let{x:f,y:r}=n9(u)?u.internals.positionAbsolute:Dc(u,l);return{x:f,y:r,width:u.measured?.width??u.width??u.initialWidth??0,height:u.measured?.height??u.height??u.initialHeight??0}},e3=(u,l=[0,0])=>{let{x:f,y:r}=n9(u)?u.internals.positionAbsolute:Dc(u,l);return{x:f,y:r,x2:f+(u.measured?.width??u.width??u.initialWidth??0),y2:r+(u.measured?.height??u.height??u.initialHeight??0)}},y9=(u,l)=>fA(lA(d5(u),d5(l))),Jy=(u,l)=>{let f=Math.max(0,Math.min(u.x+u.width,l.x+l.width)-Math.max(u.x,l.x)),r=Math.max(0,Math.min(u.y+u.height,l.y+l.height)-Math.max(u.y,l.y));return Math.ceil(f*r)},c9=(u)=>Br(u.width)&&Br(u.height)&&Br(u.x)&&Br(u.y),Br=(u)=>!isNaN(u)&&isFinite(u),_9=(u,l)=>{},Qy=(u,l=[1,1])=>{return{x:l[0]*Math.round(u.x/l[0]),y:l[1]*Math.round(u.y/l[1])}},Ny=({x:u,y:l},[f,r,n],i=!1,t=[1,1])=>{let y={x:(u-f)/n,y:(l-r)/n};return i?Qy(y,t):y},Vc=({x:u,y:l},[f,r,n])=>{return{x:u*n+f,y:l*n+r}};function _y(u,l){if(typeof u==="number")return Math.floor((l-l/(1+u))*0.5);if(typeof u==="string"&&u.endsWith("px")){let f=parseFloat(u);if(!Number.isNaN(f))return Math.floor(f)}if(typeof u==="string"&&u.endsWith("%")){let f=parseFloat(u);if(!Number.isNaN(f))return Math.floor(l*f*0.01)}return console.error(`[React Flow] The padding value "${u}" is invalid. Please provide a number or a string with a valid unit (px or %).`),0}function zm(u,l,f){if(typeof u==="string"||typeof u==="number"){let r=_y(u,f),n=_y(u,l);return{top:r,right:n,bottom:r,left:n,x:n*2,y:r*2}}if(typeof u==="object"){let r=_y(u.top??u.y??0,f),n=_y(u.bottom??u.y??0,f),i=_y(u.left??u.x??0,l),t=_y(u.right??u.x??0,l);return{top:r,right:t,bottom:n,left:i,x:i+t,y:r+n}}return{top:0,right:0,bottom:0,left:0,x:0,y:0}}function Em(u,l,f,r,n,i){let{x:t,y}=Vc(u,[l,f,r]),{x:c,y:$}=Vc({x:u.x+u.width,y:u.y+u.height},[l,f,r]),A=n-c,j=i-$;return{left:Math.floor(t),top:Math.floor(y),right:Math.floor(A),bottom:Math.floor(j)}}var pc=(u,l,f,r,n,i)=>{let t=zm(i,l,f),y=(l-t.x)/u.width,c=(f-t.y)/u.height,$=Math.min(y,c),A=Ay($,r,n),j=u.x+u.width/2,F=u.y+u.height/2,J=l/2-j*A,Q=f/2-F*A,W=Em(u,J,Q,A,l,f),L={left:Math.min(W.left-t.left,0),top:Math.min(W.top-t.top,0),right:Math.min(W.right-t.right,0),bottom:Math.min(W.bottom-t.bottom,0)};return{x:J-L.left+L.right,y:Q-L.top+L.bottom,zoom:A}},qy=()=>typeof navigator<"u"&&navigator?.userAgent?.indexOf("Mac")>=0;function jy(u){return u!==void 0&&u!==null&&u!=="parent"}function qn(u){return{width:u.measured?.width??u.width??u.initialWidth??0,height:u.measured?.height??u.height??u.initialHeight??0}}function $9(u){return(u.measured?.width??u.width??u.initialWidth)!==void 0&&(u.measured?.height??u.height??u.initialHeight)!==void 0}function A9(u,l={width:0,height:0},f,r,n){let i={...u},t=r.get(f);if(t){let y=t.origin||n;i.x+=t.internals.positionAbsolute.x-(l.width??0)*y[0],i.y+=t.internals.positionAbsolute.y-(l.height??0)*y[1]}return i}function j9(u,l){if(u.size!==l.size)return!1;for(let f of u)if(!l.has(f))return!1;return!0}function mq(){let u,l;return{promise:new Promise((r,n)=>{u=r,l=n}),resolve:u,reject:l}}function Vq(u){return{...u9,...u||{}}}function mc(u,{snapGrid:l=[0,0],snapToGrid:f=!1,transform:r,containerBounds:n}){let{x:i,y:t}=mr(u),y=Ny({x:i-(n?.left??0),y:t-(n?.top??0)},r),{x:c,y:$}=f?Qy(y,l):y;return{xSnapped:c,ySnapped:$,...y}}var rA=(u)=>({width:u.offsetWidth,height:u.offsetHeight}),F9=(u)=>u?.getRootNode?.()||window?.document,Om=["INPUT","SELECT","TEXTAREA"];function U9(u){let l=u.composedPath?.()?.[0]||u.target;if(l?.nodeType!==1)return!1;return Om.includes(l.nodeName)||l.hasAttribute("contenteditable")||!!l.closest(".nokey")}var J9=(u)=>("clientX"in u),mr=(u,l)=>{let f=J9(u),r=f?u.clientX:u.touches?.[0].clientX,n=f?u.clientY:u.touches?.[0].clientY;return{x:r-(l?.left??0),y:n-(l?.top??0)}},Uq=(u,l,f,r,n)=>{let i=l.querySelectorAll(`.${u}`);if(!i||!i.length)return null;return Array.from(i).map((t)=>{let y=t.getBoundingClientRect();return{id:t.getAttribute("data-handleid"),type:u,nodeId:n,position:t.getAttribute("data-handlepos"),x:(y.left-f.left)/r,y:(y.top-f.top)/r,...rA(t)}})};function nA({sourceX:u,sourceY:l,targetX:f,targetY:r,sourceControlX:n,sourceControlY:i,targetControlX:t,targetControlY:y}){let c=u*0.125+n*0.375+t*0.375+f*0.125,$=l*0.125+i*0.375+y*0.375+r*0.125,A=Math.abs(c-u),j=Math.abs($-l);return[c,$,A,j]}function o3(u,l){if(u>=0)return 0.5*u;return l*25*Math.sqrt(-u)}function Jq({pos:u,x1:l,y1:f,x2:r,y2:n,c:i}){switch(u){case Ku.Left:return[l-o3(l-r,i),f];case Ku.Right:return[l+o3(r-l,i),f];case Ku.Top:return[l,f-o3(f-n,i)];case Ku.Bottom:return[l,f+o3(n-f,i)]}}function iA({sourceX:u,sourceY:l,sourcePosition:f=Ku.Bottom,targetX:r,targetY:n,targetPosition:i=Ku.Top,curvature:t=0.25}){let[y,c]=Jq({pos:f,x1:u,y1:l,x2:r,y2:n,c:t}),[$,A]=Jq({pos:i,x1:r,y1:n,x2:u,y2:l,c:t}),[j,F,J,Q]=nA({sourceX:u,sourceY:l,targetX:r,targetY:n,sourceControlX:y,sourceControlY:c,targetControlX:$,targetControlY:A});return[`M${u},${l} C${y},${c} ${$},${A} ${r},${n}`,j,F,J,Q]}function Q9({sourceX:u,sourceY:l,targetX:f,targetY:r}){let n=Math.abs(f-u)/2,i=f0}var Zm=({source:u,sourceHandle:l,target:f,targetHandle:r})=>`xy-edge__${u}${l||""}-${f}${r||""}`,Hm=(u,l)=>{return l.some((f)=>f.source===u.source&&f.target===u.target&&(f.sourceHandle===u.sourceHandle||!f.sourceHandle&&!u.sourceHandle)&&(f.targetHandle===u.targetHandle||!f.targetHandle&&!u.targetHandle))},N9=(u,l,f={})=>{if(!u.source||!u.target)return _9("006",Qr.error006()),l;let r=f.getEdgeId||Zm,n;if(r9(u))n={...u};else n={...u,id:r(u)};if(Hm(n,l))return l;if(n.sourceHandle===null)delete n.sourceHandle;if(n.targetHandle===null)delete n.targetHandle;return l.concat(n)};function tA({sourceX:u,sourceY:l,targetX:f,targetY:r}){let[n,i,t,y]=Q9({sourceX:u,sourceY:l,targetX:f,targetY:r});return[`M ${u},${l}L ${f},${r}`,n,i,t,y]}var Qq={[Ku.Left]:{x:-1,y:0},[Ku.Right]:{x:1,y:0},[Ku.Top]:{x:0,y:-1},[Ku.Bottom]:{x:0,y:1}},Bm=({source:u,sourcePosition:l=Ku.Bottom,target:f})=>{if(l===Ku.Left||l===Ku.Right)return u.xMath.sqrt(Math.pow(l.x-u.x,2)+Math.pow(l.y-u.y,2));function mm({source:u,sourcePosition:l=Ku.Bottom,target:f,targetPosition:r=Ku.Top,center:n,offset:i,stepPosition:t}){let y=Qq[l],c=Qq[r],$={x:u.x+y.x*i,y:u.y+y.y*i},A={x:f.x+c.x*i,y:f.y+c.y*i},j=Bm({source:$,sourcePosition:l,target:A}),F=j.x!==0?"x":"y",J=j[F],Q=[],W,L,U={x:0,y:0},q={x:0,y:0},[,,N,w]=Q9({sourceX:u.x,sourceY:u.y,targetX:f.x,targetY:f.y});if(y[F]*c[F]===-1){if(F==="x")W=n.x??$.x+(A.x-$.x)*t,L=n.y??($.y+A.y)/2;else W=n.x??($.x+A.x)/2,L=n.y??$.y+(A.y-$.y)*t;let E=[{x:W,y:$.y},{x:W,y:A.y}],V=[{x:$.x,y:L},{x:A.x,y:L}];if(y[F]===J)Q=F==="x"?E:V;else Q=F==="x"?V:E}else{let E=[{x:$.x,y:A.y}],V=[{x:A.x,y:$.y}];if(F==="x")Q=y.x===J?V:E;else Q=y.y===J?E:V;if(l===r){let O=Math.abs(u[F]-f[F]);if(O<=i){let Y=Math.min(i-1,i-O);if(y[F]===J)U[F]=($[F]>u[F]?-1:1)*Y;else q[F]=(A[F]>f[F]?-1:1)*Y}}if(l!==r){let O=F==="x"?"y":"x",Y=y[F]===c[O],p=$[O]>A[O],v=$[O]=X)W=(S.x+B.x)/2,L=Q[0].y;else W=Q[0].x,L=(S.y+B.y)/2}let G={x:$.x+U.x,y:$.y+U.y},Z={x:A.x+q.x,y:A.y+q.y};return[[u,...G.x!==Q[0].x||G.y!==Q[0].y?[G]:[],...Q,...Z.x!==Q[Q.length-1].x||Z.y!==Q[Q.length-1].y?[Z]:[],f],W,L,N,w]}function Vm(u,l,f,r){let n=Math.min(Nq(u,l)/2,Nq(l,f)/2,r),{x:i,y:t}=l;if(u.x===i&&i===f.x||u.y===t&&t===f.y)return`L${i} ${t}`;if(u.y===t){let $=u.xf.id===l))||null}function yA(u,l){if(!u)return"";if(typeof u==="string")return u;return`${l?`${l}__`:""}${Object.keys(u).sort().map((r)=>`${r}=${u[r]}`).join("&")}`}function Xq(u,{id:l,defaultColor:f,defaultMarkerStart:r,defaultMarkerEnd:n}){let i=new Set;return u.reduce((t,y)=>{return[y.markerStart||r,y.markerEnd||n].forEach((c)=>{if(c&&typeof c==="object"){let $=yA(c,l);if(!i.has($))t.push({id:$,color:c.color||f,...c}),i.add($)}}),t},[]).sort((t,y)=>t.id.localeCompare(y.id))}var Yq=1000,Dm=10,q9={nodeOrigin:[0,0],nodeExtent:Fy,elevateNodesOnSelect:!0,zIndexMode:"basic",defaults:{}},pm={...q9,checkEquality:!0};function w9(u,l){let f={...u};for(let r in l)if(l[r]!==void 0)f[r]=l[r];return f}function Pq(u,l,f){let r=w9(q9,f);for(let n of u.values())if(n.parentId)L9(n,u,l,r);else{let i=Dc(n,r.nodeOrigin),t=jy(n.extent)?n.extent:r.nodeExtent,y=Ii(i,t,qn(n));n.internals.positionAbsolute=y}}function Sm(u,l){if(!u.handles)return!u.measured?void 0:l?.internals.handleBounds;let f=[],r=[];for(let n of u.handles){let i={id:n.id,width:n.width??1,height:n.height??1,nodeId:u.id,x:n.x,y:n.y,position:n.position,type:n.type};if(n.type==="source")f.push(i);else if(n.type==="target")r.push(i)}return{source:f,target:r}}function W9(u){return u==="manual"}function cA(u,l,f,r={}){let n=w9(pm,r),i={i:0},t=new Map(l),y=n?.elevateNodesOnSelect&&!W9(n.zIndexMode)?Yq:0,c=u.length>0,$=!1;l.clear(),f.clear();for(let A of u){let j=t.get(A.id);if(n.checkEquality&&A===j?.internals.userNode)l.set(A.id,j);else{let F=Dc(A,n.nodeOrigin),J=jy(A.extent)?A.extent:n.nodeExtent,Q=Ii(F,J,qn(A));j={...n.defaults,...A,measured:{width:A.measured?.width,height:A.measured?.height},internals:{positionAbsolute:Q,handleBounds:Sm(A,j),z:Cq(A,y,n.zIndexMode),userNode:A}},l.set(A.id,j)}if((j.measured===void 0||j.measured.width===void 0||j.measured.height===void 0)&&!j.hidden)c=!1;if(A.parentId)L9(j,l,f,r,i);$||=A.selected??!1}return{nodesInitialized:c,hasSelectedNodes:$}}function Xm(u,l){if(!u.parentId)return;let f=l.get(u.parentId);if(f)f.set(u.id,u);else l.set(u.parentId,new Map([[u.id,u]]))}function L9(u,l,f,r,n){let{elevateNodesOnSelect:i,nodeOrigin:t,nodeExtent:y,zIndexMode:c}=w9(q9,r),$=u.parentId,A=l.get($);if(!A){console.warn(`Parent node ${$} not found. Please make sure that parent nodes are in front of their child nodes in the nodes array.`);return}if(Xm(u,f),n&&!A.parentId&&A.internals.rootParentIndex===void 0&&c==="auto")A.internals.rootParentIndex=++n.i,A.internals.z=A.internals.z+n.i*Dm;if(n&&A.internals.rootParentIndex!==void 0)n.i=A.internals.rootParentIndex;let j=i&&!W9(c)?Yq:0,{x:F,y:J,z:Q}=Ym(u,A,t,y,j,c),{positionAbsolute:W}=u.internals,L=F!==W.x||J!==W.y;if(L||Q!==u.internals.z)l.set(u.id,{...u,internals:{...u.internals,positionAbsolute:L?{x:F,y:J}:W,z:Q}})}function Cq(u,l,f){let r=Br(u.zIndex)?u.zIndex:0;if(W9(f))return r;return r+(u.selected?l:0)}function Ym(u,l,f,r,n,i){let{x:t,y}=l.internals.positionAbsolute,c=qn(u),$=Dc(u,f),A=jy(u.extent)?Ii($,u.extent,c):$,j=Ii({x:t+A.x,y:y+A.y},r,c);if(u.extent==="parent")j=Hq(j,c,l);let F=Cq(u,n,i),J=l.internals.z??0;return{x:j.x,y:j.y,z:J>=F?J+1:F}}function _A(u,l,f,r=[0,0]){let n=[],i=new Map;for(let t of u){let y=l.get(t.parentId);if(!y)continue;let c=i.get(t.parentId)?.expandedRect??gi(y),$=y9(c,t.rect);i.set(t.parentId,{expandedRect:$,parent:y})}if(i.size>0)i.forEach(({expandedRect:t,parent:y},c)=>{let $=y.internals.positionAbsolute,A=qn(y),j=y.origin??r,F=t.x<$.x?Math.round(Math.abs($.x-t.x)):0,J=t.y<$.y?Math.round(Math.abs($.y-t.y)):0,Q=Math.max(A.width,Math.round(t.width)),W=Math.max(A.height,Math.round(t.height)),L=(Q-A.width)*j[0],U=(W-A.height)*j[1];if(F>0||J>0||L||U)n.push({id:c,type:"position",position:{x:y.position.x-F+L,y:y.position.y-J+U}}),f.get(c)?.forEach((q)=>{if(!u.some((N)=>N.id===q.id))n.push({id:q.id,type:"position",position:{x:q.position.x+F,y:q.position.y+J}})});if(A.width0){let J=_A(F,l,f,n);$.push(...J)}return{changes:$,updatedInternals:c}}async function Rq({delta:u,panZoom:l,transform:f,translateExtent:r,width:n,height:i}){if(!l||!u.x&&!u.y)return Promise.resolve(!1);let t=await l.setViewportConstrained({x:f[0]+u.x,y:f[1]+u.y,zoom:f[2]},[[0,0],[n,i]],r),y=!!t&&(t.x!==f[0]||t.y!==f[1]||t.k!==f[2]);return Promise.resolve(y)}function Lq(u,l,f,r,n,i){let t=n,y=r.get(t)||new Map;r.set(t,y.set(f,l)),t=`${n}-${u}`;let c=r.get(t)||new Map;if(r.set(t,c.set(f,l)),i){t=`${n}-${u}-${i}`;let $=r.get(t)||new Map;r.set(t,$.set(f,l))}}function T9(u,l,f){u.clear(),l.clear();for(let r of f){let{source:n,target:i,sourceHandle:t=null,targetHandle:y=null}=r,c={edgeId:r.id,source:n,target:i,sourceHandle:t,targetHandle:y},$=`${n}-${t}--${i}-${y}`,A=`${i}-${y}--${n}-${t}`;Lq("source",c,A,u,n,t),Lq("target",c,$,u,i,y),l.set(r.id,r)}}function hq(u,l){if(!u.parentId)return!1;let f=l.get(u.parentId);if(!f)return!1;if(f.selected)return!0;return hq(f,l)}function Tq(u,l,f){let r=u;do{if(r?.matches?.(l))return!0;if(r===f)return!1;r=r?.parentElement}while(r);return!1}function Pm(u,l,f,r){let n=new Map;for(let[i,t]of u)if((t.selected||t.id===r)&&(!t.parentId||!hq(t,u))&&(t.draggable||l&&typeof t.draggable>"u")){let y=u.get(i);if(y)n.set(i,{id:i,position:y.position||{x:0,y:0},distance:{x:f.x-y.internals.positionAbsolute.x,y:f.y-y.internals.positionAbsolute.y},extent:y.extent,parentId:y.parentId,origin:y.origin,expandParent:y.expandParent,internals:{positionAbsolute:y.internals.positionAbsolute||{x:0,y:0}},measured:{width:y.measured.width??0,height:y.measured.height??0}})}return n}function s5({nodeId:u,dragItems:l,nodeLookup:f,dragging:r=!0}){let n=[];for(let[t,y]of l){let c=f.get(t)?.internals.userNode;if(c)n.push({...c,position:y.position,dragging:r})}if(!u)return[n[0],n];let i=f.get(u)?.internals.userNode;return[!i?n[0]:{...i,position:l.get(u)?.position||i.position,dragging:r},n]}function Cm({dragItems:u,snapGrid:l,x:f,y:r}){let n=u.values().next().value;if(!n)return null;let i={x:f-n.distance.x,y:r-n.distance.y},t=Qy(i,l);return{x:t.x-i.x,y:t.y-i.y}}function xq({onNodeMouseDown:u,getStoreItems:l,onDragStart:f,onDrag:r,onDragStop:n}){let i={x:null,y:null},t=0,y=new Map,c=!1,$={x:0,y:0},A=null,j=!1,F=null,J=!1,Q=!1,W=null;function L({noDragClassName:q,handleSelector:N,domNode:w,isSelectable:G,nodeId:Z,nodeClickDistance:H=0}){F=el(w);function E({x:D,y:X}){let{nodeLookup:O,nodeExtent:Y,snapGrid:p,snapToGrid:v,nodeOrigin:z,onNodeDrag:P,onSelectionDrag:k,onError:I,updateNodePositions:b}=l();i={x:D,y:X};let d=!1,g=y.size>1,x=g&&Y?d5(Uy(y)):null,lu=g&&v?Cm({dragItems:y,snapGrid:p,x:D,y:X}):null;for(let[cu,_u]of y){if(!O.has(cu))continue;let Fu={x:D-_u.distance.x,y:X-_u.distance.y};if(v)Fu=lu?{x:Math.round(Fu.x+lu.x),y:Math.round(Fu.y+lu.y)}:Qy(Fu,p);let zu=null;if(g&&Y&&!_u.extent&&x){let{positionAbsolute:e}=_u.internals,uu=e.x-x.x+Y[0][0],Gu=e.x+_u.measured.width-x.x2+Y[1][0],s=e.y-x.y+Y[0][1],qu=e.y+_u.measured.height-x.y2+Y[1][1];zu=[[uu,s],[Gu,qu]]}let{position:Wu,positionAbsolute:C}=t9({nodeId:cu,nextPosition:Fu,nodeLookup:O,nodeExtent:zu?zu:Y,nodeOrigin:z,onError:I});d=d||_u.position.x!==Wu.x||_u.position.y!==Wu.y,_u.position=Wu,_u.internals.positionAbsolute=C}if(Q=Q||d,!d)return;if(b(y,!0),W&&(r||P||!Z&&k)){let[cu,_u]=s5({nodeId:Z,dragItems:y,nodeLookup:O});if(r?.(W,y,cu,_u),P?.(W,cu,_u),!Z)k?.(W,_u)}}async function V(){if(!A)return;let{transform:D,panBy:X,autoPanSpeed:O,autoPanOnNodeDrag:Y}=l();if(!Y){c=!1,cancelAnimationFrame(t);return}let[p,v]=Bq($,A,O);if(p!==0||v!==0){if(i.x=(i.x??0)-p/D[2],i.y=(i.y??0)-v/D[2],await X({x:p,y:v}))E(i)}t=requestAnimationFrame(V)}function S(D){let{nodeLookup:X,multiSelectionActive:O,nodesDraggable:Y,transform:p,snapGrid:v,snapToGrid:z,selectNodesOnDrag:P,onNodeDragStart:k,onSelectionDragStart:I,unselectNodesAndEdges:b}=l();if(j=!0,(!P||!G)&&!O&&Z){if(!X.get(Z)?.selected)b()}if(G&&P&&Z)u?.(Z);let d=mc(D.sourceEvent,{transform:p,snapGrid:v,snapToGrid:z,containerBounds:A});if(i=d,y=Pm(X,Y,d,Z),y.size>0&&(f||k||!Z&&I)){let[g,x]=s5({nodeId:Z,dragItems:y,nodeLookup:X});if(f?.(D.sourceEvent,y,g,x),k?.(D.sourceEvent,g,x),!Z)I?.(D.sourceEvent,x)}}let B=jc().clickDistance(H).on("start",(D)=>{let{domNode:X,nodeDragThreshold:O,transform:Y,snapGrid:p,snapToGrid:v}=l();if(A=X?.getBoundingClientRect()||null,J=!1,Q=!1,W=D.sourceEvent,O===0)S(D);i=mc(D.sourceEvent,{transform:Y,snapGrid:p,snapToGrid:v,containerBounds:A}),$=mr(D.sourceEvent,A)}).on("drag",(D)=>{let{autoPanOnNodeDrag:X,transform:O,snapGrid:Y,snapToGrid:p,nodeDragThreshold:v,nodeLookup:z}=l(),P=mc(D.sourceEvent,{transform:O,snapGrid:Y,snapToGrid:p,containerBounds:A});if(W=D.sourceEvent,D.sourceEvent.type==="touchmove"&&D.sourceEvent.touches.length>1||Z&&!z.has(Z))J=!0;if(J)return;if(!c&&X&&j)c=!0,V();if(!j){let k=mr(D.sourceEvent,A),I=k.x-$.x,b=k.y-$.y;if(Math.sqrt(I*I+b*b)>v)S(D)}if((i.x!==P.xSnapped||i.y!==P.ySnapped)&&y&&j)$=mr(D.sourceEvent,A),E(P)}).on("end",(D)=>{if(!j||J)return;if(c=!1,j=!1,cancelAnimationFrame(t),y.size>0){let{nodeLookup:X,updateNodePositions:O,onNodeDragStop:Y,onSelectionDragStop:p}=l();if(Q)O(y,!1),Q=!1;if(n||Y||!Z&&p){let[v,z]=s5({nodeId:Z,dragItems:y,nodeLookup:X,dragging:!1});if(n?.(D.sourceEvent,y,v,z),Y?.(D.sourceEvent,v,z),!Z)p?.(D.sourceEvent,z)}}}).filter((D)=>{let X=D.target;return!D.button&&(!q||!Tq(X,`.${q}`,w))&&(!N||Tq(X,N,w))});F.call(B)}function U(){F?.on(".drag",null)}return{update:L,destroy:U}}function Mm(u,l,f){let r=[],n={x:u.x-f,y:u.y-f,width:f*2,height:f*2};for(let i of l.values())if(Jy(n,gi(i))>0)r.push(i);return r}var Rm=250;function hm(u,l,f,r){let n=[],i=1/0,t=Mm(u,f,l+Rm);for(let y of t){let c=[...y.internals.handleBounds?.source??[],...y.internals.handleBounds?.target??[]];for(let $ of c){if(r.nodeId===$.nodeId&&r.type===$.type&&r.id===$.id)continue;let{x:A,y:j}=b0(y,$,$.position,!0),F=Math.sqrt(Math.pow(A-u.x,2)+Math.pow(j-u.y,2));if(F>l)continue;if(F1){let y=r.type==="source"?"target":"source";return n.find((c)=>c.type===y)??n[0]}return n[0]}function bq(u,l,f,r,n,i=!1){let t=r.get(u);if(!t)return null;let y=n==="strict"?t.internals.handleBounds?.[l]:[...t.internals.handleBounds?.source??[],...t.internals.handleBounds?.target??[]],c=(f?y?.find(($)=>$.id===f):y?.[0])??null;return c&&i?{...c,...b0(t,c,c.position,!0)}:c}function vq(u,l){if(u)return u;else if(l?.classList.contains("target"))return"target";else if(l?.classList.contains("source"))return"source";return null}function xm(u,l){let f=null;if(l)f=!0;else if(u&&!l)f=!1;return f}var kq=()=>!0;function bm(u,{connectionMode:l,connectionRadius:f,handleId:r,nodeId:n,edgeUpdaterType:i,isTarget:t,domNode:y,nodeLookup:c,lib:$,autoPanOnConnect:A,flowId:j,panBy:F,cancelConnection:J,onConnectStart:Q,onConnect:W,onConnectEnd:L,isValidConnection:U=kq,onReconnectEnd:q,updateConnection:N,getTransform:w,getFromHandle:G,autoPanSpeed:Z,dragThreshold:H=1,handleDomNode:E}){let V=F9(u.target),S=0,B,{x:D,y:X}=mr(u),O=vq(i,E),Y=y?.getBoundingClientRect(),p=!1;if(!Y||!O)return;let v=bq(n,O,r,c,l);if(!v)return;let z=mr(u,Y),P=!1,k=null,I=!1,b=null;function d(){if(!A||!Y)return;let[Wu,C]=Bq(z,Y,Z);F({x:Wu,y:C}),S=requestAnimationFrame(d)}let g={...v,nodeId:n,type:O,position:v.position},x=c.get(n),cu={inProgress:!0,isValid:null,from:b0(x,g,Ku.Left,!0),fromHandle:g,fromPosition:g.position,fromNode:x,to:z,toHandle:null,toPosition:jq[g.position],toNode:null,pointer:z};function _u(){p=!0,N(cu),Q?.(u,{nodeId:n,handleId:r,handleType:O})}if(H===0)_u();function Fu(Wu){if(!p){let{x:qu,y:Zu}=mr(Wu),Bu=qu-D,Iu=Zu-X;if(!(Bu*Bu+Iu*Iu>H*H))return;_u()}if(!G()||!g){zu(Wu);return}let C=w();if(z=mr(Wu,Y),B=hm(Ny(z,C,!1,[1,1]),f,c,g),!P)d(),P=!0;let e=Iq(Wu,{handle:B,connectionMode:l,fromNodeId:n,fromHandleId:r,fromType:t?"target":"source",isValidConnection:U,doc:V,lib:$,flowId:j,nodeLookup:c});b=e.handleDomNode,k=e.connection,I=xm(!!B,e.isValid);let uu=c.get(n),Gu=uu?b0(uu,g,Ku.Left,!0):cu.from,s={...cu,from:Gu,isValid:I,to:e.toHandle&&I?Vc({x:e.toHandle.x,y:e.toHandle.y},C):z,toHandle:e.toHandle,toPosition:I&&e.toHandle?e.toHandle.position:jq[g.position],toNode:e.toHandle?c.get(e.toHandle.nodeId):null,pointer:z};N(s),cu=s}function zu(Wu){if("touches"in Wu&&Wu.touches.length>0)return;if(p){if((B||b)&&k&&I)W?.(k);let{inProgress:C,...e}=cu,uu={...e,toPosition:cu.toHandle?cu.toPosition:null};if(L?.(Wu,uu),i)q?.(Wu,uu)}J(),cancelAnimationFrame(S),P=!1,I=!1,k=null,b=null,V.removeEventListener("mousemove",Fu),V.removeEventListener("mouseup",zu),V.removeEventListener("touchmove",Fu),V.removeEventListener("touchend",zu)}V.addEventListener("mousemove",Fu),V.addEventListener("mouseup",zu),V.addEventListener("touchmove",Fu),V.addEventListener("touchend",zu)}function Iq(u,{handle:l,connectionMode:f,fromNodeId:r,fromHandleId:n,fromType:i,doc:t,lib:y,flowId:c,isValidConnection:$=kq,nodeLookup:A}){let j=i==="target",F=l?t.querySelector(`.${y}-flow__handle[data-id="${c}-${l?.nodeId}-${l?.id}-${l?.type}"]`):null,{x:J,y:Q}=mr(u),W=t.elementFromPoint(J,Q),L=W?.classList.contains(`${y}-flow__handle`)?W:F,U={handleDomNode:L,isValid:!1,connection:null,toHandle:null};if(L){let q=vq(void 0,L),N=L.getAttribute("data-nodeid"),w=L.getAttribute("data-handleid"),G=L.classList.contains("connectable"),Z=L.classList.contains("connectableend");if(!N||!q)return U;let H={source:j?N:r,sourceHandle:j?w:n,target:j?r:N,targetHandle:j?n:w};U.connection=H;let V=G&&Z&&(f===h0.Strict?j&&q==="source"||!j&&q==="target":N!==r||w!==n);U.isValid=V&&$(H),U.toHandle=bq(N,q,w,A,f,!0)}return U}var $A={onPointerDown:bm,isValid:Iq};function gq({domNode:u,panZoom:l,getTransform:f,getViewScale:r}){let n=el(u);function i({translateExtent:y,width:c,height:$,zoomStep:A=1,pannable:j=!0,zoomable:F=!0,inversePan:J=!1}){let Q=(N)=>{if(N.sourceEvent.type!=="wheel"||!l)return;let w=f(),G=N.sourceEvent.ctrlKey&&qy()?10:1,Z=-N.sourceEvent.deltaY*(N.sourceEvent.deltaMode===1?0.05:N.sourceEvent.deltaMode?1:0.002)*A,H=w[2]*Math.pow(2,Z*G);l.scaleTo(H)},W=[0,0],L=(N)=>{if(N.sourceEvent.type==="mousedown"||N.sourceEvent.type==="touchstart")W=[N.sourceEvent.clientX??N.sourceEvent.touches[0].clientX,N.sourceEvent.clientY??N.sourceEvent.touches[0].clientY]},U=(N)=>{let w=f();if(N.sourceEvent.type!=="mousemove"&&N.sourceEvent.type!=="touchmove"||!l)return;let G=[N.sourceEvent.clientX??N.sourceEvent.touches[0].clientX,N.sourceEvent.clientY??N.sourceEvent.touches[0].clientY],Z=[G[0]-W[0],G[1]-W[1]];W=G;let H=r()*Math.max(w[2],Math.log(w[2]))*(J?-1:1),E={x:w[0]-Z[0]*H,y:w[1]-Z[1]*H},V=[[0,0],[c,$]];l.setViewportConstrained({x:E.x,y:E.y,zoom:w[2]},V,y)},q=Bc().on("start",L).on("zoom",j?U:null).on("zoom.wheel",F?Q:null);n.call(q,{})}function t(){n.on("zoom",null)}return{update:i,destroy:t,pointer:Gf}}var AA=(u)=>({x:u.x,y:u.y,zoom:u.k}),a5=({x:u,y:l,zoom:f})=>bi.translate(u,l).scale(f),$y=(u,l)=>u.target.closest(`.${l}`),sq=(u,l)=>l===2&&Array.isArray(u)&&u.includes(2),vm=(u)=>((u*=2)<=1?u*u*u:(u-=2)*u*u+2)/2,o5=(u,l=0,f=vm,r=()=>{})=>{let n=typeof l==="number"&&l>0;if(!n)r();return n?u.transition().duration(l).ease(f).on("end",r):u},aq=(u)=>{let l=u.ctrlKey&&qy()?10:1;return-u.deltaY*(u.deltaMode===1?0.05:u.deltaMode?1:0.002)*l};function km({zoomPanValues:u,noWheelClassName:l,d3Selection:f,d3Zoom:r,panOnScrollMode:n,panOnScrollSpeed:i,zoomOnPinch:t,onPanZoomStart:y,onPanZoom:c,onPanZoomEnd:$}){return(A)=>{if($y(A,l)){if(A.ctrlKey)A.preventDefault();return!1}A.preventDefault(),A.stopImmediatePropagation();let j=f.property("__zoom").k||1;if(A.ctrlKey&&t){let L=Gf(A),U=aq(A),q=j*Math.pow(2,U);r.scaleTo(f,q,L,A);return}let F=A.deltaMode===1?20:1,J=n===gn.Vertical?0:A.deltaX*F,Q=n===gn.Horizontal?0:A.deltaY*F;if(!qy()&&A.shiftKey&&n!==gn.Vertical)J=A.deltaY*F,Q=0;r.translateBy(f,-(J/j)*i,-(Q/j)*i,{internal:!0});let W=AA(f.property("__zoom"));if(clearTimeout(u.panScrollTimeout),!u.isPanScrolling)u.isPanScrolling=!0,y?.(A,W);else c?.(A,W),u.panScrollTimeout=setTimeout(()=>{$?.(A,W),u.isPanScrolling=!1},150)}}function Im({noWheelClassName:u,preventScrolling:l,d3ZoomHandler:f}){return function(r,n){let i=r.type==="wheel",t=!l&&i&&!r.ctrlKey,y=$y(r,u);if(r.ctrlKey&&i&&y)r.preventDefault();if(t||y)return null;r.preventDefault(),f.call(this,r,n)}}function gm({zoomPanValues:u,onDraggingChange:l,onPanZoomStart:f}){return(r)=>{if(r.sourceEvent?.internal)return;let n=AA(r.transform);if(u.mouseButton=r.sourceEvent?.button||0,u.isZoomingOrPanning=!0,u.prevViewport=n,r.sourceEvent?.type==="mousedown")l(!0);if(f)f?.(r.sourceEvent,n)}}function sm({zoomPanValues:u,panOnDrag:l,onPaneContextMenu:f,onTransformChange:r,onPanZoom:n}){return(i)=>{if(u.usedRightMouseButton=!!(f&&sq(l,u.mouseButton??0)),!i.sourceEvent?.sync)r([i.transform.x,i.transform.y,i.transform.k]);if(n&&!i.sourceEvent?.internal)n?.(i.sourceEvent,AA(i.transform))}}function am({zoomPanValues:u,panOnDrag:l,panOnScroll:f,onDraggingChange:r,onPanZoomEnd:n,onPaneContextMenu:i}){return(t)=>{if(t.sourceEvent?.internal)return;if(u.isZoomingOrPanning=!1,i&&sq(l,u.mouseButton??0)&&!u.usedRightMouseButton&&t.sourceEvent)i(t.sourceEvent);if(u.usedRightMouseButton=!1,r(!1),n){let y=AA(t.transform);u.prevViewport=y,clearTimeout(u.timerId),u.timerId=setTimeout(()=>{n?.(t.sourceEvent,y)},f?150:0)}}}function om({zoomActivationKeyPressed:u,zoomOnScroll:l,zoomOnPinch:f,panOnDrag:r,panOnScroll:n,zoomOnDoubleClick:i,userSelectionActive:t,noWheelClassName:y,noPanClassName:c,lib:$,connectionInProgress:A}){return(j)=>{let F=u||l,J=f&&j.ctrlKey,Q=j.type==="wheel";if(j.button===1&&j.type==="mousedown"&&($y(j,`${$}-flow__node`)||$y(j,`${$}-flow__edge`)))return!0;if(!r&&!F&&!n&&!i&&!f)return!1;if(t)return!1;if(A&&!Q)return!1;if($y(j,y)&&Q)return!1;if($y(j,c)&&(!Q||n&&Q&&!u))return!1;if(!f&&j.ctrlKey&&Q)return!1;if(!f&&j.type==="touchstart"&&j.touches?.length>1)return j.preventDefault(),!1;if(!F&&!n&&!J&&Q)return!1;if(!r&&(j.type==="mousedown"||j.type==="touchstart"))return!1;if(Array.isArray(r)&&!r.includes(j.button)&&j.type==="mousedown")return!1;let W=Array.isArray(r)&&r.includes(j.button)||!j.button||j.button<=1;return(!j.ctrlKey||Q)&&W}}function oq({domNode:u,minZoom:l,maxZoom:f,translateExtent:r,viewport:n,onPanZoom:i,onPanZoomStart:t,onPanZoomEnd:y,onDraggingChange:c}){let $={isZoomingOrPanning:!1,usedRightMouseButton:!1,prevViewport:{x:0,y:0,zoom:0},mouseButton:0,timerId:void 0,panScrollTimeout:void 0,isPanScrolling:!1},A=u.getBoundingClientRect(),j=Bc().scaleExtent([l,f]).translateExtent(r),F=el(u).call(j);q({x:n.x,y:n.y,zoom:Ay(n.zoom,l,f)},[[0,0],[A.width,A.height]],r);let J=F.on("wheel.zoom"),Q=F.on("dblclick.zoom");j.wheelDelta(aq);function W(B,D){if(F)return new Promise((X)=>{j?.interpolate(D?.interpolate==="linear"?Qn:hi).transform(o5(F,D?.duration,D?.ease,()=>X(!0)),B)});return Promise.resolve(!1)}function L({noWheelClassName:B,noPanClassName:D,onPaneContextMenu:X,userSelectionActive:O,panOnScroll:Y,panOnDrag:p,panOnScrollMode:v,panOnScrollSpeed:z,preventScrolling:P,zoomOnPinch:k,zoomOnScroll:I,zoomOnDoubleClick:b,zoomActivationKeyPressed:d,lib:g,onTransformChange:x,connectionInProgress:lu,paneClickDistance:cu,selectionOnDrag:_u}){if(O&&!$.isZoomingOrPanning)U();let Fu=Y&&!d&&!O;j.clickDistance(_u?1/0:!Br(cu)||cu<0?0:cu);let zu=Fu?km({zoomPanValues:$,noWheelClassName:B,d3Selection:F,d3Zoom:j,panOnScrollMode:v,panOnScrollSpeed:z,zoomOnPinch:k,onPanZoomStart:t,onPanZoom:i,onPanZoomEnd:y}):Im({noWheelClassName:B,preventScrolling:P,d3ZoomHandler:J});if(F.on("wheel.zoom",zu,{passive:!1}),!O){let C=gm({zoomPanValues:$,onDraggingChange:c,onPanZoomStart:t});j.on("start",C);let e=sm({zoomPanValues:$,panOnDrag:p,onPaneContextMenu:!!X,onPanZoom:i,onTransformChange:x});j.on("zoom",e);let uu=am({zoomPanValues:$,panOnDrag:p,panOnScroll:Y,onPaneContextMenu:X,onPanZoomEnd:y,onDraggingChange:c});j.on("end",uu)}let Wu=om({zoomActivationKeyPressed:d,panOnDrag:p,zoomOnScroll:I,panOnScroll:Y,zoomOnDoubleClick:b,zoomOnPinch:k,userSelectionActive:O,noPanClassName:D,noWheelClassName:B,lib:g,connectionInProgress:lu});if(j.filter(Wu),b)F.on("dblclick.zoom",Q);else F.on("dblclick.zoom",null)}function U(){j.on("zoom",null)}async function q(B,D,X){let O=a5(B),Y=j?.constrain()(O,D,X);if(Y)await W(Y);return new Promise((p)=>p(Y))}async function N(B,D){let X=a5(B);return await W(X,D),new Promise((O)=>O(X))}function w(B){if(F){let D=a5(B),X=F.property("__zoom");if(X.k!==B.zoom||X.x!==B.x||X.y!==B.y)j?.transform(F,D,null,{sync:!0})}}function G(){let B=F?Hc(F.node()):{x:0,y:0,k:1};return{x:B.x,y:B.y,zoom:B.k}}function Z(B,D){if(F)return new Promise((X)=>{j?.interpolate(D?.interpolate==="linear"?Qn:hi).scaleTo(o5(F,D?.duration,D?.ease,()=>X(!0)),B)});return Promise.resolve(!1)}function H(B,D){if(F)return new Promise((X)=>{j?.interpolate(D?.interpolate==="linear"?Qn:hi).scaleBy(o5(F,D?.duration,D?.ease,()=>X(!0)),B)});return Promise.resolve(!1)}function E(B){j?.scaleExtent(B)}function V(B){j?.translateExtent(B)}function S(B){let D=!Br(B)||B<0?0:B;j?.clickDistance(D)}return{update:L,destroy:U,setViewport:N,setViewportConstrained:q,getViewport:G,scaleTo:Z,scaleBy:H,setScaleExtent:E,setTranslateExtent:V,syncViewport:w,setClickDistance:S}}var v0;(function(u){u.Line="line",u.Handle="handle"})(v0||(v0={}));function dm({width:u,prevWidth:l,height:f,prevHeight:r,affectsX:n,affectsY:i}){let t=u-l,y=f-r,c=[t>0?1:t<0?-1:0,y>0?1:y<0?-1:0];if(t&&n)c[0]=c[0]*-1;if(y&&i)c[1]=c[1]*-1;return c}function Kq(u){let l=u.includes("right")||u.includes("left"),f=u.includes("bottom")||u.includes("top"),r=u.includes("left"),n=u.includes("top");return{isHorizontal:l,isVertical:f,affectsX:r,affectsY:n}}function M0(u,l){return Math.max(0,l-u)}function R0(u,l){return Math.max(0,u-l)}function d3(u,l,f){return Math.max(0,l-u,u-f)}function Gq(u,l){return u?!l:l}function em(u,l,f,r,n,i,t,y){let{affectsX:c,affectsY:$}=l,{isHorizontal:A,isVertical:j}=l,F=A&&j,{xSnapped:J,ySnapped:Q}=f,{minWidth:W,maxWidth:L,minHeight:U,maxHeight:q}=r,{x:N,y:w,width:G,height:Z,aspectRatio:H}=u,E=Math.floor(A?J-u.pointerX:0),V=Math.floor(j?Q-u.pointerY:0),S=G+(c?-E:E),B=Z+($?-V:V),D=-i[0]*G,X=-i[1]*Z,O=d3(S,W,L),Y=d3(B,U,q);if(t){let z=0,P=0;if(c&&E<0)z=M0(N+E+D,t[0][0]);else if(!c&&E>0)z=R0(N+S+D,t[1][0]);if($&&V<0)P=M0(w+V+X,t[0][1]);else if(!$&&V>0)P=R0(w+B+X,t[1][1]);O=Math.max(O,z),Y=Math.max(Y,P)}if(y){let z=0,P=0;if(c&&E>0)z=R0(N+E,y[0][0]);else if(!c&&E<0)z=M0(N+S,y[1][0]);if($&&V>0)P=R0(w+V,y[0][1]);else if(!$&&V<0)P=M0(w+B,y[1][1]);O=Math.max(O,z),Y=Math.max(Y,P)}if(n){if(A){let z=d3(S/H,U,q)*H;if(O=Math.max(O,z),t){let P=0;if(!c&&!$||c&&!$&&F)P=R0(w+X+S/H,t[1][1])*H;else P=M0(w+X+(c?E:-E)/H,t[0][1])*H;O=Math.max(O,P)}if(y){let P=0;if(!c&&!$||c&&!$&&F)P=M0(w+S/H,y[1][1])*H;else P=R0(w+(c?E:-E)/H,y[0][1])*H;O=Math.max(O,P)}}if(j){let z=d3(B*H,W,L)/H;if(Y=Math.max(Y,z),t){let P=0;if(!c&&!$||$&&!c&&F)P=R0(N+B*H+D,t[1][0])/H;else P=M0(N+($?V:-V)*H+D,t[0][0])/H;Y=Math.max(Y,P)}if(y){let P=0;if(!c&&!$||$&&!c&&F)P=M0(N+B*H,y[1][0])/H;else P=R0(N+($?V:-V)*H,y[0][0])/H;Y=Math.max(Y,P)}}}if(V=V+(V<0?Y:-Y),E=E+(E<0?O:-O),n)if(F)if(S>B*H)V=(Gq(c,$)?-E:E)/H;else E=(Gq(c,$)?-V:V)*H;else if(A)V=E/H,$=c;else E=V*H,c=$;let p=c?N+E:N,v=$?w+V:w;return{width:G+(c?-E:E),height:Z+($?-V:V),x:i[0]*E*(!c?1:-1)+p,y:i[1]*V*(!$?1:-1)+v}}var dq={width:0,height:0,x:0,y:0},uV={...dq,pointerX:0,pointerY:0,aspectRatio:1};function lV(u){return[[0,0],[u.measured.width,u.measured.height]]}function fV(u,l,f){let r=l.position.x+u.position.x,n=l.position.y+u.position.y,i=u.measured.width??0,t=u.measured.height??0,y=f[0]*i,c=f[1]*t;return[[r-y,n-c],[r+i-y,n+t-c]]}function eq({domNode:u,nodeId:l,getStoreItems:f,onChange:r,onEnd:n}){let i=el(u),t={controlDirection:Kq("bottom-right"),boundaries:{minWidth:0,minHeight:0,maxWidth:Number.MAX_VALUE,maxHeight:Number.MAX_VALUE},resizeDirection:void 0,keepAspectRatio:!1};function y({controlPosition:$,boundaries:A,keepAspectRatio:j,resizeDirection:F,onResizeStart:J,onResize:Q,onResizeEnd:W,shouldResize:L}){let U={...dq},q={...uV};t={boundaries:A,resizeDirection:F,keepAspectRatio:j,controlDirection:Kq($)};let N=void 0,w=null,G=[],Z=void 0,H=void 0,E=void 0,V=!1,S=jc().on("start",(B)=>{let{nodeLookup:D,transform:X,snapGrid:O,snapToGrid:Y,nodeOrigin:p,paneDomNode:v}=f();if(N=D.get(l),!N)return;w=v?.getBoundingClientRect()??null;let{xSnapped:z,ySnapped:P}=mc(B.sourceEvent,{transform:X,snapGrid:O,snapToGrid:Y,containerBounds:w});if(U={width:N.measured.width??0,height:N.measured.height??0,x:N.position.x??0,y:N.position.y??0},q={...U,pointerX:z,pointerY:P,aspectRatio:U.width/U.height},Z=void 0,N.parentId&&(N.extent==="parent"||N.expandParent))Z=D.get(N.parentId),H=Z&&N.extent==="parent"?lV(Z):void 0;G=[],E=void 0;for(let[k,I]of D)if(I.parentId===l){if(G.push({id:k,position:{...I.position},extent:I.extent}),I.extent==="parent"||I.expandParent){let b=fV(I,N,I.origin??p);if(E)E=[[Math.min(b[0][0],E[0][0]),Math.min(b[0][1],E[0][1])],[Math.max(b[1][0],E[1][0]),Math.max(b[1][1],E[1][1])]];else E=b}}J?.(B,{...U})}).on("drag",(B)=>{let{transform:D,snapGrid:X,snapToGrid:O,nodeOrigin:Y}=f(),p=mc(B.sourceEvent,{transform:D,snapGrid:X,snapToGrid:O,containerBounds:w}),v=[];if(!N)return;let{x:z,y:P,width:k,height:I}=U,b={},d=N.origin??Y,{width:g,height:x,x:lu,y:cu}=em(q,t.controlDirection,p,t.boundaries,t.keepAspectRatio,d,H,E),_u=g!==k,Fu=x!==I,zu=lu!==z&&_u,Wu=cu!==P&&Fu;if(!zu&&!Wu&&!_u&&!Fu)return;if(zu||Wu||d[0]===1||d[1]===1){if(b.x=zu?lu:U.x,b.y=Wu?cu:U.y,U.x=b.x,U.y=b.y,G.length>0){let Gu=lu-z,s=cu-P;for(let qu of G)qu.position={x:qu.position.x-Gu+d[0]*(g-k),y:qu.position.y-s+d[1]*(x-I)},v.push(qu)}}if(_u||Fu)b.width=_u&&(!t.resizeDirection||t.resizeDirection==="horizontal")?g:U.width,b.height=Fu&&(!t.resizeDirection||t.resizeDirection==="vertical")?x:U.height,U.width=b.width,U.height=b.height;if(Z&&N.expandParent){let Gu=d[0]*(b.width??0);if(b.x&&b.x{if(!V)return;W?.(B,{...U}),n?.({...U}),V=!1});i.call(S)}function c(){i.on(".drag",null)}return{update:y,destroy:c}}var Aw=Cu(Fl(),1),jw=Cu(yw(),1);var cw=(u)=>{let l,f=new Set,r=(A,j)=>{let F=typeof A==="function"?A(l):A;if(!Object.is(F,l)){let J=l;l=(j!=null?j:typeof F!=="object"||F===null)?F:Object.assign({},l,F),f.forEach((Q)=>Q(l,J))}},n=()=>l,c={setState:r,getState:n,getInitialState:()=>$,subscribe:(A)=>{return f.add(A),()=>f.delete(A)},destroy:()=>{f.clear()}},$=l=u(r,n,c);return c},_w=(u)=>u?cw(u):cw;var{useDebugValue:WV}=Aw.default,{useSyncExternalStoreWithSelector:LV}=jw.default,TV=(u)=>u;function G9(u,l=TV,f){let r=LV(u.subscribe,u.getState,u.getServerState||u.getInitialState,l,f);return WV(r),r}var $w=(u,l)=>{let f=_w(u),r=(n,i=l)=>G9(f,n,i);return Object.assign(r,f),r},Fw=(u,l)=>u?$w(u,l):$w;function zl(u,l){if(Object.is(u,l))return!0;if(typeof u!=="object"||u===null||typeof l!=="object"||l===null)return!1;if(u instanceof Map&&l instanceof Map){if(u.size!==l.size)return!1;for(let[r,n]of u)if(!Object.is(n,l.get(r)))return!1;return!0}if(u instanceof Set&&l instanceof Set){if(u.size!==l.size)return!1;for(let r of u)if(!l.has(r))return!1;return!0}let f=Object.keys(u);if(f.length!==Object.keys(l).length)return!1;for(let r of f)if(!Object.prototype.hasOwnProperty.call(l,r)||!Object.is(u[r],l[r]))return!1;return!0}var KV=Cu(Z4(),1),QA=tu.createContext(null),GV=QA.Provider,Yw=Qr.error001();function il(u,l){let f=tu.useContext(QA);if(f===null)throw Error(Yw);return G9(f,u,l)}function Ol(){let u=tu.useContext(QA);if(u===null)throw Error(Yw);return tu.useMemo(()=>({getState:u.getState,setState:u.setState,subscribe:u.subscribe}),[u])}var Uw={display:"none"},zV={position:"absolute",width:1,height:1,margin:-1,border:0,padding:0,overflow:"hidden",clip:"rect(0px, 0px, 0px, 0px)",clipPath:"inset(100%)"},Pw="react-flow__node-desc",Cw="react-flow__edge-desc",EV="react-flow__aria-live",OV=(u)=>u.ariaLiveMessage,ZV=(u)=>u.ariaLabelConfig;function HV({rfId:u}){let l=il(OV);return ru.jsx("div",{id:`${EV}-${u}`,"aria-live":"assertive","aria-atomic":"true",style:zV,children:l})}function BV({rfId:u,disableKeyboardA11y:l}){let f=il(ZV);return ru.jsxs(ru.Fragment,{children:[ru.jsx("div",{id:`${Pw}-${u}`,style:Uw,children:l?f["node.a11yDescription.default"]:f["node.a11yDescription.keyboardDisabled"]}),ru.jsx("div",{id:`${Cw}-${u}`,style:Uw,children:f["edge.a11yDescription.default"]}),!l&&ru.jsx(HV,{rfId:u})]})}var NA=tu.forwardRef(({position:u="top-left",children:l,className:f,style:r,...n},i)=>{let t=`${u}`.split("-");return ru.jsx("div",{className:Xl(["react-flow__panel",f,...t]),style:r,ref:i,...n,children:l})});NA.displayName="Panel";function mV({proOptions:u,position:l="bottom-right"}){if(u?.hideAttribution)return null;return ru.jsx(NA,{position:l,className:"react-flow__attribution","data-message":"Please only hide this attribution when you are subscribed to React Flow Pro: https://pro.reactflow.dev",children:ru.jsx("a",{href:"https://reactflow.dev",target:"_blank",rel:"noopener noreferrer","aria-label":"React Flow attribution",children:"React Flow"})})}var VV=(u)=>{let l=[],f=[];for(let[,r]of u.nodeLookup)if(r.selected)l.push(r.internals.userNode);for(let[,r]of u.edgeLookup)if(r.selected)f.push(r);return{selectedNodes:l,selectedEdges:f}},FA=(u)=>u.id;function DV(u,l){return zl(u.selectedNodes.map(FA),l.selectedNodes.map(FA))&&zl(u.selectedEdges.map(FA),l.selectedEdges.map(FA))}function pV({onSelectionChange:u}){let l=Ol(),{selectedNodes:f,selectedEdges:r}=il(VV,DV);return tu.useEffect(()=>{let n={nodes:f,edges:r};u?.(n),l.getState().onSelectionChangeHandlers.forEach((i)=>i(n))},[f,r,u]),null}var SV=(u)=>!!u.onSelectionChangeHandlers;function XV({onSelectionChange:u}){let l=il(SV);if(u||l)return ru.jsx(pV,{onSelectionChange:u});return null}var O9=typeof window<"u"?tu.useLayoutEffect:tu.useEffect,Mw=[0,0],YV={x:0,y:0,zoom:1},PV=["nodes","edges","defaultNodes","defaultEdges","onConnect","onConnectStart","onConnectEnd","onClickConnectStart","onClickConnectEnd","nodesDraggable","autoPanOnNodeFocus","nodesConnectable","nodesFocusable","edgesFocusable","edgesReconnectable","elevateNodesOnSelect","elevateEdgesOnSelect","minZoom","maxZoom","nodeExtent","onNodesChange","onEdgesChange","elementsSelectable","connectionMode","snapGrid","snapToGrid","translateExtent","connectOnClick","defaultEdgeOptions","fitView","fitViewOptions","onNodesDelete","onEdgesDelete","onDelete","onNodeDrag","onNodeDragStart","onNodeDragStop","onSelectionDrag","onSelectionDragStart","onSelectionDragStop","onMoveStart","onMove","onMoveEnd","noPanClassName","nodeOrigin","autoPanOnConnect","autoPanOnNodeDrag","onError","connectionRadius","isValidConnection","selectNodesOnDrag","nodeDragThreshold","connectionDragThreshold","onBeforeDelete","debug","autoPanSpeed","ariaLabelConfig","zIndexMode"],Jw=[...PV,"rfId"],CV=(u)=>({setNodes:u.setNodes,setEdges:u.setEdges,setMinZoom:u.setMinZoom,setMaxZoom:u.setMaxZoom,setTranslateExtent:u.setTranslateExtent,setNodeExtent:u.setNodeExtent,reset:u.reset,setDefaultNodesAndEdges:u.setDefaultNodesAndEdges}),Qw={translateExtent:Fy,nodeOrigin:Mw,minZoom:0.5,maxZoom:2,elementsSelectable:!0,noPanClassName:"nopan",rfId:"1"};function MV(u){let{setNodes:l,setEdges:f,setMinZoom:r,setMaxZoom:n,setTranslateExtent:i,setNodeExtent:t,reset:y,setDefaultNodesAndEdges:c}=il(CV,zl),$=Ol();O9(()=>{return c(u.defaultNodes,u.defaultEdges),()=>{A.current=Qw,y()}},[]);let A=tu.useRef(Qw);return O9(()=>{for(let j of Jw){let F=u[j],J=A.current[j];if(F===J)continue;if(typeof u[j]>"u")continue;if(j==="nodes")l(F);else if(j==="edges")f(F);else if(j==="minZoom")r(F);else if(j==="maxZoom")n(F);else if(j==="translateExtent")i(F);else if(j==="nodeExtent")t(F);else if(j==="ariaLabelConfig")$.setState({ariaLabelConfig:Vq(F)});else if(j==="fitView")$.setState({fitViewQueued:F});else if(j==="fitViewOptions")$.setState({fitViewOptions:F});else $.setState({[j]:F})}A.current=u},Jw.map((j)=>u[j])),null}function Nw(){if(typeof window>"u"||!window.matchMedia)return null;return window.matchMedia("(prefers-color-scheme: dark)")}function RV(u){let[l,f]=tu.useState(u==="system"?null:u);return tu.useEffect(()=>{if(u!=="system"){f(u);return}let r=Nw(),n=()=>f(r?.matches?"dark":"light");return n(),r?.addEventListener("change",n),()=>{r?.removeEventListener("change",n)}},[u]),l!==null?l:Nw()?.matches?"dark":"light"}var qw=typeof document<"u"?document:null;function Xc(u=null,l={target:qw,actInsideInputWithModifier:!0}){let[f,r]=tu.useState(!1),n=tu.useRef(!1),i=tu.useRef(new Set([])),[t,y]=tu.useMemo(()=>{if(u!==null){let $=(Array.isArray(u)?u:[u]).filter((j)=>typeof j==="string").map((j)=>j.replace("+",` +`;function q2({title:u,eyebrow:l,actions:f,children:r,className:n,loading:i}){return mu("section",{className:`panel ${n||""}`},mu("div",{className:"panel-head"},mu("div",null,l?mu("p",{className:"panel-eyebrow"},l):null,mu(rl,{title:u,loading:i})),f?mu("div",{className:"panel-actions"},f):null),mu("div",{className:"panel-body"},r))}function nZ({title:u,data:l,onOpen:f,testId:r}){return mu("button",{type:"button",className:"ghost-btn","data-testid":r,onClick:()=>f(u,l)},"查看原始JSON")}function iZ({title:u,text:l}){return mu("div",{className:"empty-state"},mu("strong",null,u),mu("span",null,l))}function yN(u){return u?.runtime&&typeof u.runtime==="object"&&!Array.isArray(u.runtime)?u.runtime:{}}function cN(u){return u?.backend&&typeof u.backend==="object"&&!Array.isArray(u.backend)?u.backend:{}}function _N(u){return u?.repository&&typeof u.repository==="object"&&!Array.isArray(u.repository)?u.repository:{}}function tZ(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 yZ(u){if(u?.providerId==="D518")return"D518";return u?.providerId||u?.name||u?.id||"Unknown"}function cZ(u,l,f="/"){let r=f.startsWith("/")?f:`/${f}`;return`${u}/microservices/${encodeURIComponent(l)}/proxy${r}`}function _Z(u,l){return`${u}/microservices/${encodeURIComponent(l)}/health`}async function $Z(u,l=16000){let f=new AbortController,r=setTimeout(()=>f.abort(),l);try{return await Eu(u,{signal:f.signal,failureFields:[!1]})}finally{clearTimeout(r)}}function $N(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 i3(u){return u?.status==="OK"||u?.ok===!0}function AZ({service:u,active:l,health:f,onSelect:r,onRaw:n}){let i=yN(u),t=cN(u),y=_N(u),c=i.container||{},$=i3(f?.body);return mu("button",{type:"button",className:`filebrowser-target-card ${l?"active":""}`,"data-testid":`filebrowser-target-card-${u.id}`,onClick:r},mu("span",{className:`status-badge ${$?"ok":i.providerStatus==="online"?"running":"warn"}`},$?"Health OK":i.providerStatus||"unknown"),mu("strong",null,u.name||u.id),mu("span",null,$N(u)),mu("code",null,`${t.nodeBindHost||"--"}:${t.nodePort||"--"}`),mu("small",null,c.name?`${c.name} / ${c.state||"--"}`:`${y.composeService||"--"}`),mu("span",{className:"filebrowser-card-raw",onClick:(A)=>{A.stopPropagation(),n(`${u.name} service`,u)}},"JSON"))}function AN(u){try{return u?.contentDocument||u?.contentWindow?.document||null}catch{return null}}function W2(u){let l=AN(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!==w2)f.textContent=w2;return!0}function jZ(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 FZ(u,l){let f=AN(u);if(f===null||f.documentElement===null)throw Error("无法访问 File Browser iframe 文档");W2(u);let r=Math.max(640,Math.ceil(u.clientWidth||f.documentElement.clientWidth||1280)),n=Math.max(480,Math.ceil(u.clientHeight||f.documentElement.clientHeight||720)),i=f.documentElement.cloneNode(!0);i.querySelectorAll("script, style, link[rel='stylesheet'], link[rel='preload'], link[rel='icon']").forEach((A)=>A.remove()),i.querySelectorAll("img").forEach((A)=>{A.removeAttribute("src"),A.removeAttribute("srcset")});let t=i.querySelector("head");if(t===null)t=f.createElement("head"),i.insertBefore(t,i.firstChild);let y=f.createElement("style");y.textContent=`${w2} +html,body{width:${r}px!important;min-height:${n}px!important;overflow:hidden!important;}`,t.appendChild(y);let c=new XMLSerializer().serializeToString(i),$=`${c}`;jZ(new Blob([$],{type:"image/svg+xml;charset=utf-8"}),l.replace(/\.png$/i,".svg"))}function jN({microservices:u,onRaw:l,apiBaseUrl:f="/api"}){let r=tZ(Array.isArray(u)?u:[]),n=new URLSearchParams(window.location.search).get("target")||"",i=n==="filebrowser-d518"?"filebrowser":n,t=r.some((Z)=>Z.id===i)?i:r[0]?.id||"",[y,c]=N2(t),[$,A]=N2({loading:!1,refreshedAt:null,health:{},error:""}),[j,F]=N2({exporting:!1,message:"",error:""}),J=rZ(null),Q=r.find((Z)=>Z.id===y)||r[0]||null,W=yN(Q),L=cN(Q),U=_N(Q),q=Q?$.health[Q.id]:null,N=Q?cZ(f,Q.id,"/"):"about:blank";Q2(()=>{if(r.length===0)return;if(!y||!r.some((Z)=>Z.id===y))c(r[0].id)},[r.map((Z)=>Z.id).join(",")]),Q2(()=>{let Z=0,H=setInterval(()=>{if(Z+=1,W2(J.current)||Z>=24)clearInterval(H)},500);return()=>clearInterval(H)},[N]),Q2(()=>{if(r.length===0)return;let Z=!1;async function H(){A((S)=>({...S,loading:!0,error:""}));let m=await Promise.all(r.map(async(S)=>{try{let B=await $Z(_Z(f,S.id));return[S.id,{ok:!0,body:B}]}catch(B){return[S.id,{ok:!1,error:Ou(B,"File Browser health failed")}]}}));if(Z)return;A({loading:!1,refreshedAt:new Date().toISOString(),health:Object.fromEntries(m),error:""})}H();let E=setInterval(H,30000);return()=>{Z=!0,clearInterval(E)}},[r.map((Z)=>`${Z.id}:${Z.runtime?.providerStatus||""}`).join(","),f]);function w(Z){c(Z);let H=new URL(window.location.href);H.searchParams.set("target",Z),window.history.replaceState({},"",`${H.pathname}${H.search}`)}async function G(){if(j.exporting)return;F({exporting:!0,message:"",error:""});try{let Z=new Date().toISOString().replace(/[-:.TZ]/g,"").slice(0,14);await FZ(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 mu(iZ,{title:"File Browser 未登记",text:"请在 config.json 的 microservices 中登记 id=filebrowser 或 filebrowser-* 用户服务"});return mu("div",{className:"filebrowser-page","data-testid":"filebrowser-page"},$.error?mu(nl,{error:$.error,wide:!0}):null,mu(q2,{title:"文件管理器",eyebrow:"File Browser / Host Files",loading:$.loading,actions:mu("div",{className:"panel-actions"},Q?mu("button",{type:"button",className:"ghost-btn",onClick:G,disabled:j.exporting,"data-testid":"filebrowser-export-screenshot"},j.exporting?"导出中...":"导出截图"):null,Q?mu("a",{className:"ghost-btn",href:N,target:"_blank",rel:"noreferrer"},"新窗口打开"):null,Q?mu(nZ,{title:"File Browser 当前目标",data:{service:Q,health:q},onOpen:l,testId:"raw-filebrowser-active"}):null)},mu("div",{className:"filebrowser-hero"},mu("div",null,mu("span",{className:`status-badge ${i3(q?.body)?"ok":"warn"}`},i3(q?.body)?"Health OK":"Health Pending"),mu("h3",null,Q?.name||"File Browser"),mu("p",{className:"muted paragraph"},Q?.description||"通过 UniDesk 登录态代理访问,不开放 File Browser 公网端口。"),j.error?mu("p",{className:"filebrowser-shot-error"},j.error):null,j.message?mu("p",{className:"filebrowser-shot-ok"},j.message):null),mu("div",{className:"microservice-ref-card"},mu("span",null,"Provider"),mu("strong",null,Q?.providerId||"--"),mu("code",null,W.providerName||Q?.providerId||"--")),mu("div",{className:"microservice-ref-card"},mu("span",null,"Private Backend"),mu("strong",null,`${L.nodeBindHost||"--"}:${L.nodePort||"--"}`),mu("code",null,L.nodeBaseUrl||"--")),mu("div",{className:"microservice-ref-card"},mu("span",null,"Image"),mu("strong",null,U.dockerfile||"filebrowser/filebrowser:v2.63.3"),mu("code",null,U.commitId||"--")),mu("div",{className:"microservice-ref-card"},mu("span",null,"Mount"),mu("strong",null,$N(Q)),mu("code",null,Q?.providerId==="main-server"?"/root, /var, /home":"/home, /mnt/c, /mnt/d")))),mu(q2,{title:"浏览目标",eyebrow:`${r.length} host targets`,loading:$.loading},mu("div",{className:"filebrowser-target-grid"},r.map((Z)=>mu(AZ,{key:Z.id,service:Z,active:Z.id===Q?.id,health:$.health[Z.id],onSelect:()=>w(Z.id),onRaw:l})))),mu(q2,{title:`${yZ(Q)} 文件视图`,eyebrow:q?.body?`Health ${i3(q.body)?"OK":"UNKNOWN"} / ${$.refreshedAt?yl($.refreshedAt):"--"}`:"Embedded WebUI",className:"filebrowser-frame-panel"},mu("div",{className:"filebrowser-frame-shell"},mu("div",{className:"filebrowser-frame-toolbar"},mu("span",null,"BaseURL"),mu("code",null,`/api/microservices/${Q?.id||"filebrowser"}/proxy`),mu("span",null,"Root"),mu("code",null,"/srv"),mu("span",{className:"filebrowser-compact-note"},"Compact layout injected")),mu("iframe",{ref:J,key:N,title:`${Q?.name||"File Browser"} WebUI`,src:N,className:"filebrowser-frame","data-testid":"filebrowser-frame",onLoad:(Z)=>W2(Z.currentTarget),sandbox:"allow-downloads allow-forms allow-modals allow-same-origin allow-scripts"}))))}var _3=Cu(Jl(),1);var Uu=_3.default.createElement,{useEffect:UZ}=_3.default,JZ=_3.default.useState;function t3({status:u,children:l}){let f=String(u||"unknown").toLowerCase();return Uu("span",{className:`status-badge ${f}`},l||u||"unknown")}function p0({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 y3({title:u,eyebrow:l,actions:f,children:r,className:n,loading:i}){return Uu("section",{className:`panel ${n||""}`},Uu("div",{className:"panel-head"},Uu("div",null,l?Uu("p",{className:"panel-eyebrow"},l):null,Uu(rl,{title:u,loading:i})),f?Uu("div",{className:"panel-actions"},f):null),Uu("div",{className:"panel-body"},r))}function c3({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 L2({title:u,text:l}){return Uu("div",{className:"empty-state"},Uu("strong",null,u),Uu("span",null,l))}function QZ(u){return u?.runtime&&typeof u.runtime==="object"&&!Array.isArray(u.runtime)?u.runtime:{}}function NZ(u){return u?.backend&&typeof u.backend==="object"&&!Array.isArray(u.backend)?u.backend:{}}function qZ(u){return u?.repository&&typeof u.repository==="object"&&!Array.isArray(u.repository)?u.repository:{}}function Yi(u,l){let f=u&&typeof u==="object"?u[l]:void 0;return Number.isFinite(Number(f))?String(f):"--"}function wZ(u){return(Array.isArray(u?.jobs)?u.jobs:[]).slice(0,40)}function WZ(u){return(Array.isArray(u?.drafts)?u.drafts:[]).slice(0,12)}function FN({microservices:u,onRaw:l,apiBaseUrl:f="/api"}){let r=u.find((Q)=>Q.id==="findjob")||null,[n,i]=JZ({loading:!1,error:"",health:null,summary:null,jobs:null,drafts:null,refreshedAt:null});async function t(){if(!r)return;i((Q)=>({...Q,loading:!0,error:""}));try{let[Q,W,L,U]=await Promise.all([Eu(`${f}/microservices/findjob/health`),Eu(`${f}/microservices/findjob/proxy/api/summary`),Eu(`${f}/microservices/findjob/proxy/api/jobs?__unideskArrayLimit=jobs:40`),Eu(`${f}/microservices/findjob/proxy/api/drafts`)]);i({loading:!1,error:"",health:Q,summary:W,jobs:L,drafts:U,refreshedAt:new Date})}catch(Q){i((W)=>({...W,loading:!1,error:Ou(Q,"FindJob 加载失败")}))}}if(UZ(()=>{t()},[r?.id,r?.runtime?.providerStatus]),!r)return Uu(L2,{title:"FindJob 未登记",text:"请在 config.json 的 microservices 中登记用户服务 id=findjob"});let y=QZ(r),c=qZ(r),$=NZ(r),A=n.summary||{},j=wZ(n.jobs),F=WZ(n.drafts),J=n.jobs?._unidesk?.arrayLimits?.jobs;return Uu("div",{className:"findjob-page","data-testid":"findjob-page"},Uu(y3,{title:"FindJob 工作台",eyebrow:"D601 用户服务",loading:n.loading,actions:Uu("div",{className:"panel-actions"},Uu("button",{type:"button",className:"ghost-btn",onClick:t,disabled:n.loading,"data-testid":"findjob-refresh-button"},n.loading?"刷新中":"刷新"),Uu(c3,{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(t3,{status:y.providerStatus==="online"?"online":"warn"},y.providerStatus||"unknown"),Uu("span",null,r.providerId),Uu("span",null,$.public?"公网暴露":"仅 UniDesk frontend 代理访问")),Uu("p",{className:"muted paragraph"},r.description)),Uu("div",{className:"microservice-ref-card"},Uu("span",null,"Repo"),Uu("strong",null,c.url||"--"),Uu("code",null,c.commitId||"--")),Uu("div",{className:"microservice-ref-card"},Uu("span",null,"D601 Docker"),Uu("strong",null,`${$.nodeBindHost||"--"}:${$.nodePort||"--"}`),Uu("code",null,`${c.composeFile||"--"} / ${c.composeService||"--"}`))),Uu(nl,{error:n.error,wide:!0})),Uu("div",{className:"findjob-grid"},Uu(y3,{title:"岗位指标",eyebrow:n.refreshedAt?`Updated ${yl(n.refreshedAt)}`:"Summary",loading:n.loading},Uu("div",{className:"metric-grid"},Uu(p0,{label:"岗位总量",value:Yi(A,"totalJobs"),hint:"tracked jobs",tone:"ok"}),Uu(p0,{label:"原始岗位",value:Yi(A,"rawJobs"),hint:"raw queue"}),Uu(p0,{label:"已验证",value:Yi(A,"verifiedJobs"),hint:"verified set"}),Uu(p0,{label:"优先处理",value:Yi(A,"prioritizedJobs"),hint:"prioritized"}),Uu(p0,{label:"过期",value:Yi(A,"staleJobs"),hint:"stale jobs",tone:"warn"}),Uu(p0,{label:"无效",value:Yi(A,"invalidJobs"),hint:"invalid jobs",tone:"warn"}),Uu(p0,{label:"上海",value:Yi(A,"shanghaiJobs"),hint:"city filter"}),Uu(p0,{label:"Health",value:n.health?.ok?"OK":"--",hint:"D601 /api/health"})),Uu("div",{className:"panel-actions inline-actions"},Uu(c3,{title:"FindJob Summary",data:A,onOpen:l,testId:"raw-findjob-summary"}))),Uu(y3,{title:"近期岗位",eyebrow:J?`${J.returnedLength}/${J.originalLength} Preview`:`${j.length} Preview`,loading:n.loading},j.length===0?Uu(L2,{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(t3,{status:String(Q.priority||"").toLowerCase()||"unknown"},Q.priority||"--")),Uu("td",null,Uu(t3,{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(c3,{title:"FindJob Jobs Preview",data:n.jobs,onOpen:l,testId:"raw-findjob-jobs"}))),Uu(y3,{title:"草稿与报告",eyebrow:`${F.length} Drafts`,loading:n.loading},F.length===0?Uu(L2,{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(t3,{status:Q.status},Q.status||"--")),Uu("div",{className:"docker-meta compact"},Uu("span",null,Q.workflow_stage||"--"),Uu("span",null,`jobs ${Q.counts?.jobs??0}`),Uu("span",null,`reports ${Q.counts?.reports??0}`)),Uu("span",null,Q.latestReportPath||"暂无报告"),Uu("code",null,wu(Q.updated_at||Q.updatedAt))))),Uu("div",{className:"panel-actions inline-actions"},Uu(c3,{title:"FindJob Drafts",data:n.drafts,onOpen:l,testId:"raw-findjob-drafts"})))))}var ic=Cu(Jl(),1);var R=ic.default.createElement,{useEffect:LZ}=ic.default,T2=ic.default.useState;function fc(u){let l=Number(u);return Number.isFinite(l)?`${Math.max(0,Math.min(100,l)).toFixed(1)}%`:"--"}function G2(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 z2(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 nc(u){if(u===null||u===void 0||u==="")return"--";if(typeof u==="boolean")return u?"true":"false";if(typeof u==="number")return z2(u,4);if(Array.isArray(u))return u.map((l)=>nc(l)).join(" x ");if(typeof u==="object")return"已上报";return String(u)}function $3(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 A3(u){return u.replace(/[^a-zA-Z0-9_-]/g,"-")}function af(u){return u&&typeof u==="object"&&!Array.isArray(u)?u:{}}function rc({status:u,children:l}){let f=String(u||"unknown").toLowerCase();return R("span",{className:`status-badge ${f}`},l||u||"unknown")}function S0({label:u,value:l,hint:f,tone:r}){return R("article",{className:`metric-card ${r||""}`},R("div",{className:"metric-label"},u),R("div",{className:"metric-value"},l),R("div",{className:"metric-hint"},f))}function K2({title:u,eyebrow:l,actions:f,children:r,className:n,loading:i}){return R("section",{className:`panel ${n||""}`},R("div",{className:"panel-head"},R("div",null,l?R("p",{className:"panel-eyebrow"},l):null,R(rl,{title:u,loading:i})),f?R("div",{className:"panel-actions"},f):null),R("div",{className:"panel-body"},r))}function ly({title:u,data:l,onOpen:f,testId:r}){return R("button",{type:"button",className:"ghost-btn","data-testid":r,onClick:(n)=>{n?.stopPropagation?.(),f(u,l)}},"查看原始JSON")}function bn({title:u,text:l}){return R("div",{className:"empty-state"},R("strong",null,u),R("span",null,l))}function TZ(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 GZ(u){return u?.repository&&typeof u.repository==="object"&&!Array.isArray(u.repository)?u.repository:{}}function zZ(u){return u?.counts&&typeof u.counts==="object"&&!Array.isArray(u.counts)?u.counts:{}}function EZ(u){return Array.isArray(u?.jobs)?u.jobs.slice(0,240):[]}function OZ(u){return Array.isArray(u?.projects)?u.projects.slice(0,1000):[]}function j3(u){return Array.isArray(u?.projects)?u.projects:[]}function ZZ(u,l){if(Array.isArray(l?.gpu))return l.gpu;if(Array.isArray(u?.gpu))return u.gpu;return[]}function Ur(u,l){return`${u}/microservices/met-nonlinear/proxy${l}`}function UN(u){return u.startedAt&&u.finishedAt?G2((Date.parse(u.finishedAt)-Date.parse(u.startedAt))/1000):"--"}function HZ(u){let l=u.progress||{};if(l.etaSeconds!==null&&l.etaSeconds!==void 0&&l.etaSeconds!==""){let t=Number(l.etaSeconds);if(Number.isFinite(t))return Math.max(0,t)}let f=Number(l.currentEpoch),r=Number(l.epochTarget??u.epochTarget),n=Date.parse(u.startedAt||"");if(!Number.isFinite(f)||f<=0||!Number.isFinite(r)||r<=f||!Number.isFinite(n))return null;let i=Math.max(0,(Date.now()-n)/1000);if(i<=0)return null;return Math.max(0,i/f*(r-f))}function JN(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 QN(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 NN(u,l,f){return{name:u,path:l,depth:f,count:0,children:[],project:null}}function BZ(u){let l=NN("","",-1);for(let r of u){let i=String(r?.projectPath||"").replace(/\\/g,"/").split("/").filter(Boolean);if(i.length===0)continue;let t=l,y=[];for(let[c,$]of i.entries()){y.push($);let A=y.join("/"),j=t.children.find((F)=>F.path===A);if(!j)j=NN($,A,c),t.children.push(j);if(c===i.length-1)j.project=r;t=j}}let f=(r)=>{let n=r.children.reduce((i,t)=>i+f(t),0);return r.count=(r.project?1:0)+n,r.children.sort((i,t)=>{if(Boolean(i.project)!==Boolean(t.project))return i.project?1:-1;return i.name.localeCompare(t.name,"zh-CN",{numeric:!0,sensitivity:"base"})}),r.count};return f(l),l}function VZ(u){let l=af(u.data);return af(l.project).projectPath?af(l.project):l}function mZ(u){return af(af(u.data).job)}function qN({microservices:u,onRaw:l,apiBaseUrl:f="/api"}){let r=u.find((C)=>C.id==="met-nonlinear")||null,[n,i]=T2({loading:!1,actionBusy:!1,error:"",health:null,summary:null,queue:null,projects:null,history:null,images:null,refreshedAt:null}),[t,y]=T2({loading:!1,error:"",kind:"",key:"",title:"",data:null}),[c,$]=T2(()=>({activeTab:"projects",selectedProjects:{},expandedProjectDirs:{},sourceProject:"",forkCount:1,forkEpochs:200,forkPrefix:`ui_fork_${Date.now()}`,maxConcurrency:3,targetGpuName:"2080 Ti",actionMessage:""}));function A(C){$((e)=>({...e,...C}))}async function j(C=c.activeTab){if(!r)return;i((e)=>({...e,loading:!0,error:""}));try{let e=[["health",Eu(`${f}/microservices/met-nonlinear/health`)],["summary",Eu(Ur(f,"/api/summary"))]];if(C==="projects")e.push(["projectsRoot",Eu(Ur(f,"/api/projects?root=projects&limit=500"))]),e.push(["exProjectsRoot",Eu(Ur(f,"/api/projects?root=ex_projects&limit=500"))]);if(C==="current"||C==="completed"||C==="failed")e.push(["queue",Eu(Ur(f,"/api/queue"))]);if(C==="completed"||C==="failed")e.push(["history",Eu(Ur(f,"/api/history"))]);if(C==="gpu")e.push(["images",Eu(Ur(f,"/api/images"))]);let uu=Object.fromEntries(await Promise.all(e.map(async([a,qu])=>[a,await qu]))),Gu={loading:!1,actionBusy:!1,error:"",health:uu.health,summary:uu.summary,refreshedAt:new Date};if(uu.projectsRoot||uu.exProjectsRoot){let{projectsRoot:a,exProjectsRoot:qu}=uu;Gu.projects={ok:a?.ok!==!1&&qu?.ok!==!1,roots:[{root:"projects",count:j3(a).length},{root:"ex_projects",count:j3(qu).length}],projects:[...j3(a),...j3(qu)]}}if(uu.queue)Gu.queue=uu.queue;if(uu.history)Gu.history=uu.history;if(uu.images)Gu.images=uu.images;i((a)=>({...a,...Gu}))}catch(e){i((uu)=>({...uu,loading:!1,actionBusy:!1,error:Ou(e,"MET Nonlinear 加载失败")}))}}async function F(C,e){i((uu)=>({...uu,actionBusy:!0,error:""})),A({actionMessage:`${C}...`});try{let uu=await e();A({actionMessage:uu||`${C}完成`}),await j()}catch(uu){i((Gu)=>({...Gu,actionBusy:!1,error:Ou(uu,`${C}失败`)}))}}async function J(){await F("保存并发设置",async()=>{await Eu(Ur(f,"/api/queue/settings"),{method:"PUT",body:JSON.stringify({maxConcurrency:Number(c.maxConcurrency),targetGpuName:c.targetGpuName})})})}function Q(){return Object.entries(c.selectedProjects).filter(([,C])=>C).map(([C])=>C)}async function W(){let C=Q();if(C.length===0)throw Error("请先选择至少一个 project");await F("加入待启动队列",async()=>{await Eu(Ur(f,"/api/queue"),{method:"POST",body:JSON.stringify({projectPaths:C,maxConcurrency:Number(c.maxConcurrency),targetGpuName:c.targetGpuName,start:!1})}),A({activeTab:"current",selectedProjects:{}})})}async function L(){let C=c.sourceProject||X[0]?.projectPath;if(!C)throw Error("请先选择源 project");await F("Fork Project",async()=>{let e=await Eu(Ur(f,"/api/projects/fork"),{method:"POST",body:JSON.stringify({sourceProject:C,count:Number(c.forkCount),epochs:Number(c.forkEpochs),prefix:c.forkPrefix})}),uu=Array.isArray(e.projectPaths)?e.projectPaths:[],Gu=uu.reduce((a,qu)=>{return a[qu]=!0,a},{...c.selectedProjects});return A({selectedProjects:Gu}),`已 fork ${uu.length} 个 project,并已自动勾选;请确认后点击加入待启动队列。`})}async function U(){await F("启动队列",async()=>{await Eu(Ur(f,"/api/queue/start"),{method:"POST",body:JSON.stringify({maxConcurrency:Number(c.maxConcurrency),targetGpuName:c.targetGpuName})}),A({activeTab:"current"})})}async function q(C){await F("取消任务",async()=>{await Eu(Ur(f,`/api/jobs/${encodeURIComponent(C.id)}/cancel`),{method:"POST",body:JSON.stringify({})})})}async function N(C){let e=String(C?.projectPath||"");if(!e)return;y({loading:!0,error:"",kind:"project",key:e,title:e,data:null});try{let uu=await Eu(Ur(f,`/api/projects/config?path=${encodeURIComponent(e)}`));y({loading:!1,error:"",kind:"project",key:e,title:e,data:uu})}catch(uu){y({loading:!1,error:Ou(uu,"Project 详情加载失败"),kind:"project",key:e,title:e,data:null})}}async function w(C){let e=String(C?.id||"");if(!e)return;y({loading:!0,error:"",kind:"job",key:e,title:C.projectPath||e,data:null});try{let uu=await Eu(Ur(f,`/api/jobs/${encodeURIComponent(e)}`));y({loading:!1,error:"",kind:"job",key:e,title:uu?.job?.projectPath||C.projectPath||e,data:uu})}catch(uu){y({loading:!1,error:Ou(uu,"Job 详情加载失败"),kind:"job",key:e,title:C.projectPath||e,data:null})}}if(LZ(()=>{j(c.activeTab)},[r?.id,r?.runtime?.providerStatus,c.activeTab]),!r)return R(bn,{title:"MET Nonlinear 未登记",text:"请在 config.json 的 microservices 中登记用户服务 id=met-nonlinear"});let G=TZ(r),Z=GZ(r),H=KZ(r),E=zZ(n.queue?.queue||n.summary?.queue),m=ZZ(n.health,n.queue),S=n.health?.targetGpu||n.summary?.targetGpu||m.find((C)=>String(C.name||"").includes("2080")),B=n.images?.mlImage||n.health?.image||{},D=EZ(n.queue),X=OZ(n.projects),O=BZ(X),Y=c.sourceProject||X[0]?.projectPath||"",p=D.filter((C)=>["staged","queued","running"].includes(C.status)),v=D.filter((C)=>C.status==="succeeded"),z=D.filter((C)=>["failed","canceled"].includes(C.status)),P=Array.isArray(n.history?.jobs)?n.history.jobs.slice(0,120):[],k=[{id:"projects",label:"项目库",count:X.length},{id:"current",label:"当前队列",count:p.length||Number(E.staged||0)+Number(E.queued||0)+Number(E.running||0)},{id:"completed",label:"已完成",count:v.length||Number(E.succeeded||0)},{id:"failed",label:"失败诊断",count:z.length||Number(E.failed||0)+Number(E.canceled||0)},{id:"gpu",label:"GPU/镜像",count:m.length}];function I(C,e){if(C.length===0)return R(bn,{title:e==="current"?"当前队列为空":"暂无记录",text:e==="current"?"从项目库选择或 fork project 后先加入待启动队列,再启动队列。":"终态任务会显示耗时、exit code 和失败诊断。"});return R("div",{className:"table-wrap met-job-table"},R("table",null,R("thead",null,R("tr",null,R("th",null,"状态"),R("th",null,"Project"),R("th",null,"Epoch"),R("th",null,"速度"),R("th",null,"ETA/耗时"),R("th",null,"GPU"),R("th",null,"Exit"),R("th",null,"更新时间"),R("th",null,"操作"))),R("tbody",null,C.map((uu)=>{let Gu=uu.progress||{},a=["staged","queued","running"].includes(uu.status),qu=t.kind==="job"&&t.key===uu.id;return R("tr",{key:uu.id,className:`met-click-row ${qu?"active":""}`,onClick:()=>w(uu),"data-testid":`met-job-row-${A3(uu.id)}`},R("td",null,R(rc,{status:uu.status},QN(uu.status))),R("td",null,R("button",{type:"button",className:"met-inline-link",onClick:(Zu)=>{Zu.stopPropagation(),w(uu)}},uu.projectPath),R("code",null,uu.id)),R("td",null,R("span",null,`${Gu.currentEpoch??"--"} / ${Gu.epochTarget??uu.epochTarget??"--"}`),R("div",{className:"met-progress"},R("span",{style:{width:fc(Gu.progressPercent)}}))),R("td",null,R("strong",null,$3(JN(uu)))),R("td",null,uu.status==="succeeded"||uu.status==="failed"||uu.status==="canceled"?UN(uu):uu.status==="running"?`ETA ${G2(HZ(uu))}`:"--"),R("td",null,uu.gpuName||"--"),R("td",null,uu.exitCode??"--"),R("td",null,wu(uu.updatedAt)),R("td",null,a?R("button",{type:"button",className:"ghost-btn mini",onClick:(Zu)=>{Zu.stopPropagation(),q(uu)},disabled:n.actionBusy},"取消"):null,R(ly,{title:`MET Job ${uu.id}`,data:uu,onOpen:l,testId:`raw-met-job-${uu.id}`})))}))))}function b(){return R("div",{className:"met-queue-summary","data-testid":"met-current-summary"},R(rc,{status:"staged"},`待启动 ${E.staged??0}`),R(rc,{status:"queued"},`排队中 ${E.queued??0}`),R(rc,{status:"running"},`训练中 ${E.running??0}`),R("span",null,`最大并发 ${n.summary?.queue?.maxConcurrency??n.queue?.queue?.maxConcurrency??c.maxConcurrency}`),R("span",null,`目标 GPU ${n.summary?.queue?.targetGpuName??n.queue?.queue?.targetGpuName??c.targetGpuName}`))}function d(C,e){let uu=c.expandedProjectDirs[C];return uu===void 0?e<2:Boolean(uu)}function s(C,e){let uu=d(C,e);A({expandedProjectDirs:{...c.expandedProjectDirs,[C]:!uu}})}function h(C){let e=8+Math.max(0,C.depth)*16;if(Boolean(C.project)){let a=C.project,qu=Boolean(c.selectedProjects[a.projectPath]),Zu=t.kind==="project"&&t.key===a.projectPath;return R("div",{key:C.path,className:`met-tree-row project ${qu?"selected":""} ${Zu?"active":""}`,style:{paddingLeft:e},onClick:()=>N(a),"data-testid":`met-project-node-${A3(a.projectPath)}`},R("div",{className:"met-tree-name"},R("input",{type:"checkbox",checked:qu,onClick:(Bu)=>Bu.stopPropagation(),onChange:(Bu)=>A({selectedProjects:{...c.selectedProjects,[a.projectPath]:Bu.target.checked}}),"data-testid":`met-project-checkbox-${A3(a.projectPath)}`}),R("button",{type:"button",className:"met-inline-link project-path",onClick:(Bu)=>{Bu.stopPropagation(),N(a)}},C.name)),R("span",null,a.useModel||"--"),R("span",null,a.epochTrain??"--"),R("span",null,fc(a.progress?.progressPercent)),R("span",null,$3(a.progress?.epochPerHour)))}let Gu=d(C.path,C.depth);return R(ic.default.Fragment,{key:C.path},R("div",{className:"met-tree-row folder",style:{paddingLeft:e},"data-testid":`met-project-folder-${A3(C.path)}`},R("button",{type:"button",className:"met-tree-toggle",onClick:()=>s(C.path,C.depth),"aria-label":Gu?`折叠 ${C.path}`:`展开 ${C.path}`},Gu?"-":"+"),R("strong",null,C.name),R("span",{className:"met-tree-count"},`${C.count} projects`)),Gu?C.children.map((a)=>h(a)):null)}function lu(C){return R("div",{className:"met-detail-kv"},C.map((e)=>R("div",{key:e.label,className:"met-detail-kv-item"},R("span",null,e.label),R("strong",null,nc(e.value)),e.hint?R("small",null,e.hint):null)))}function cu(C,e){return R("div",{className:"met-detail-section"},R("h3",null,C),lu(e))}function _u(C){if(!Array.isArray(C)||C.length===0)return R(bn,{title:"模型层未上报",text:"等待 data/model_info.json 或 compute_analysis.json 生成。"});return R("div",{className:"table-wrap met-layer-table"},R("table",null,R("thead",null,R("tr",null,R("th",null,"Layer"),R("th",null,"Type"),R("th",null,"Params"),R("th",null,"Trainable"),R("th",null,"Compute"))),R("tbody",null,C.slice(0,18).map((e,uu)=>R("tr",{key:`${e.name||"layer"}-${uu}`},R("td",null,e.name||`#${uu+1}`),R("td",null,e.type||"--"),R("td",null,z2(e.num_params)),R("td",null,e.trainable===void 0?"--":String(Boolean(e.trainable))),R("td",null,z2(e.compute?.total??e.estimated_cost?.weighted_units?.total)))))))}function Fu(C){let e=Array.isArray(C)?C:[];if(e.length===0)return R(bn,{title:"data/ 暂无文件",text:"训练或评估完成后会生成 training_state、metrics、model_info 等文件。"});return R("div",{className:"met-file-chip-grid"},e.slice(0,48).map((uu)=>R("span",{key:uu},uu)),e.length>48?R("span",null,`+${e.length-48}`):null)}function zu(C){let e=String(C||"").replace(/\x1b\[[0-9;]*[A-Za-z]/g,"").split(/\r?\n/).map((uu)=>uu.trim()).filter(Boolean).slice(-12);if(e.length===0)return R(bn,{title:"暂无日志尾部",text:"该任务未上报 logTail 或日志已轮转。"});return R("div",{className:"met-log-lines"},e.map((uu,Gu)=>R("div",{key:`${Gu}-${uu.slice(0,16)}`},uu)))}function Wu(){if(t.loading)return R("section",{className:"met-detail-panel","data-testid":"met-detail-panel"},R("div",{className:"panel-head compact"},R("div",null,R("p",{className:"panel-eyebrow"},"Detail Loading"),R(rl,{title:"详情加载中",loading:!0}))),R(bn,{title:"详情加载中",text:t.title||"正在读取 D601 data/ 和 config.json"}));if(t.error)return R("section",{className:"met-detail-panel","data-testid":"met-detail-panel"},R(nl,{error:t.error,wide:!0}));if(!t.data)return R("section",{className:"met-detail-panel muted","data-testid":"met-detail-panel"},R(bn,{title:"选择一个项目或任务查看详情",text:"项目库、当前队列、已完成和失败诊断中的行都可以点击;默认只展示结构化字段,原始 JSON 需显式点击按钮。"}));let C=VZ(t),e=mZ(t),uu=af(C.config),Gu=af(C.progress||e.progress),a=af(C.data),qu=af(C.metrics||a.metrics||Gu.trainingInfo?.evaluation_metrics),Zu=af(a.trainingInfo||Gu.trainingInfo),Bu=af(a.trainingState),gu=af(C.model||a.model),ll=Array.isArray(gu.modelSummary)&&gu.modelSummary.length>0?gu.modelSummary:gu.computeLayers,Pu=af(Zu.evaluation_metrics),Nl=t.kind==="job"?"训练任务详情":"Project 详情";return R("section",{className:"met-detail-panel","data-testid":"met-detail-panel"},R("div",{className:"panel-head compact"},R("div",null,R("p",{className:"panel-eyebrow"},t.kind==="job"?"Job + Project Detail":"Project Library Detail"),R(rl,{title:Nl}),R("code",null,C.projectPath||e.projectPath||t.title)),R("div",{className:"panel-actions"},R(ly,{title:`MET ${Nl}`,data:t.data,onOpen:l,testId:"raw-met-detail"}))),t.kind==="job"?cu("任务状态",[{label:"Job ID",value:e.id},{label:"状态",value:QN(e.status)},{label:"GPU",value:e.gpuName},{label:"Exit Code",value:e.exitCode},{label:"耗时",value:UN(e)},{label:"训练速度",value:$3(JN({...e,progress:Gu}))}]):null,cu("config.json",[{label:"use_model",value:uu.use_model},{label:"epoch_train",value:uu.epoch_train},{label:"step_per_epoch",value:uu.step_per_epoch},{label:"learning_rate",value:uu.learning_rate},{label:"using_gpu",value:uu.using_gpu},{label:"use_points",value:uu.use_points},{label:"sample_rate",value:uu.sample_rate},{label:"time_clipped_s",value:uu.time_clipped_s},{label:"H_UNITS",value:uu.H_UNITS},{label:"INNER_KAN_UNITS",value:uu.INNER_KAN_UNITS},{label:"INNER_KAN_LAYERS",value:uu.INNER_KAN_LAYERS},{label:"GRID_SIZE",value:uu.GRID_SIZE},{label:"SPLINE_ORDER",value:uu.SPLINE_ORDER},{label:"USE_FAST_MODEL",value:uu.USE_FAST_MODEL},{label:"IIR_TRAINABLE",value:uu.IIR_TRAINABLE}]),cu("data/ 训练状态",[{label:"Epoch",value:`${Gu.currentEpoch??Bu.current_epoch??Bu.completed_epoch??"--"} / ${Gu.epochTarget??uu.epoch_train??"--"}`},{label:"Progress",value:fc(Gu.progressPercent)},{label:"Last Loss",value:Gu.lastLoss??Bu.loss},{label:"Last Val Loss",value:Gu.lastValLoss??Bu.val_loss},{label:"Min Loss",value:Zu.min_loss??Bu.min_loss},{label:"Min Val Loss",value:Zu.min_val_loss??Bu.min_val_loss},{label:"Log Lines",value:Gu.logLineCount},{label:"ETA",value:G2(Gu.etaSeconds??Bu.remaining_time)},{label:"训练速度",value:$3(Gu.epochPerHour??Bu.smoothed_speed)},{label:"Training Alive",value:Bu.training_alive}]),cu("模型参数",[{label:"Model Type",value:gu.modelType??uu.use_model},{label:"Total Params",value:gu.totalParams,hint:gu.totalParams===null||gu.totalParams===void 0?"未上报":"data/model_info.json"},{label:"Trainable",value:gu.trainableParams},{label:"Non-trainable",value:gu.nonTrainableParams},{label:"Compute Cost",value:gu.computeCost},{label:"Estimate Status",value:gu.estimateStatus},{label:"Unsupported Layers",value:gu.unsupportedLayerCount}]),cu("指标",[{label:"train_loss",value:qu.train_loss??Pu.train_loss},{label:"val_loss",value:qu.val_loss??Pu.val_loss},{label:"train_mae",value:qu.train_mae??Pu.train_mae},{label:"val_mae",value:qu.val_mae??Pu.val_mae},{label:"train_afmae",value:qu.train_afmae??Pu.train_afmae},{label:"val_afmae",value:qu.val_afmae??Pu.val_afmae},{label:"freq_drift_hz",value:qu.freq_drift_hz},{label:"sens_drift_percent",value:qu.sens_drift_percent},{label:"linearity_percent",value:qu.linearity_percent},{label:"weights_source",value:qu.weights_source??Pu.weights_source},{label:"lr min/mean/max",value:`${nc(Zu.learning_rate_min)} / ${nc(Zu.learning_rate_mean)} / ${nc(Zu.learning_rate_max)}`}]),R("div",{className:"met-detail-section"},R("h3",null,"模型层"),_u(ll)),R("div",{className:"met-detail-section"},R("h3",null,"data/ 文件"),Fu(a.files)),t.kind==="job"?R("div",{className:"met-detail-section"},R("h3",null,"日志尾部"),zu(af(t.data).logTail)):null)}return R("div",{className:"met-page","data-testid":"met-nonlinear-page"},R(K2,{title:"MET Nonlinear 训练编排",eyebrow:"D601 GPU 用户服务",loading:n.loading||n.actionBusy,actions:R("div",{className:"panel-actions"},R("button",{type:"button",className:"ghost-btn",onClick:j,disabled:n.loading,"data-testid":"met-refresh-button"},n.loading?"刷新中":"刷新"),R(ly,{title:"MET Nonlinear 用户服务",data:r,onOpen:l,testId:"raw-met-service"}))},R("div",{className:"findjob-hero"},R("div",null,R("div",{className:"node-version-line"},R(rc,{status:G.providerStatus==="online"?"online":"warn"},G.providerStatus||"unknown"),R("span",null,r.providerId),R("span",null,H.public?"公网暴露":"仅 UniDesk frontend 代理访问")),R("p",{className:"muted paragraph"},r.description)),R("div",{className:"microservice-ref-card"},R("span",null,"Repo"),R("strong",null,Z.url||"--"),R("code",null,Z.commitId||"--")),R("div",{className:"microservice-ref-card"},R("span",null,"D601 Docker"),R("strong",null,`${H.nodeBindHost||"--"}:${H.nodePort||"--"}`),R("code",null,`${Z.composeFile||"--"} / ${Z.containerName||"--"}`))),R(nl,{error:n.error,wide:!0}),c.actionMessage?R("div",{className:"met-action-log","data-testid":"met-action-message"},c.actionMessage):null),R("div",{className:"met-grid"},R(K2,{title:"核心状态",eyebrow:n.refreshedAt?`Updated ${yl(n.refreshedAt)}`:"Queue + GPU",loading:n.loading},R("div",{className:"metric-grid"},R(S0,{label:"Staged",value:E.staged??0,hint:"加入队列未开始",tone:Number(E.staged||0)>0?"warn":""}),R(S0,{label:"Queued",value:E.queued??0,hint:"排队等待调度",tone:Number(E.queued||0)>0?"warn":""}),R(S0,{label:"Running",value:E.running??0,hint:`max ${n.summary?.queue?.maxConcurrency??n.queue?.queue?.maxConcurrency??"--"}`,tone:Number(E.running||0)>0?"ok":""}),R(S0,{label:"Succeeded",value:E.succeeded??0,hint:"已完成"}),R(S0,{label:"Failed",value:E.failed??0,hint:"需要诊断",tone:Number(E.failed||0)>0?"warn":""}),R(S0,{label:"2080Ti Free",value:S?fc(Number(S.freeRatio)*100):"--",hint:S?`${S.memoryFreeMiB}/${S.memoryTotalMiB} MiB`:"等待 GPU 上报"}),R(S0,{label:"ML Image",value:B.present?"READY":"MISSING",hint:B.image||"met-nonlinear-ml:tf26",tone:B.present?"ok":"warn"}),R(S0,{label:"Health",value:n.health?.ok?"OK":"--",hint:"D601 /health"}))),R(K2,{title:"队列控制",eyebrow:"Downloader-like staging",loading:n.actionBusy},R("div",{className:"met-control-strip"},R("label",null,"最大并发",R("input",{type:"number",min:1,max:16,value:c.maxConcurrency,"data-testid":"met-max-concurrency-input",onChange:(C)=>A({maxConcurrency:C.target.value})})),R("label",null,"目标 GPU",R("input",{value:c.targetGpuName,"data-testid":"met-target-gpu-input",onChange:(C)=>A({targetGpuName:C.target.value})})),R("button",{type:"button",className:"ghost-btn",onClick:J,disabled:n.actionBusy,"data-testid":"met-save-settings-button"},"保存设置"),R("button",{type:"button",className:"primary-btn",onClick:U,disabled:n.actionBusy||Number(E.staged||0)===0,"data-testid":"met-start-queue-button"},"启动队列")),R("p",{className:"muted paragraph"},"Project 先进入待启动队列,不会立即训练;点击启动队列后才切换为排队中,并由 D601 scheduler 按最大并发和 2080Ti 显存策略调度。")),R("section",{className:"panel met-workspace"},R("div",{className:"met-tabs",role:"tablist"},k.map((C)=>R("button",{key:C.id,type:"button",className:c.activeTab===C.id?"active":"",onClick:()=>A({activeTab:C.id}),"data-testid":`met-tab-${C.id}`},`${C.label} ${C.count}`))),R("div",{className:"panel-body"},c.activeTab==="projects"?R("div",{className:"met-form-grid","data-testid":"met-projects-pane"},R("div",{className:"met-fork-card"},R("h3",null,"Fork Project"),R("label",null,"源 Project",R("select",{value:Y,"data-testid":"met-source-project-select",onChange:(C)=>A({sourceProject:C.target.value})},X.map((C)=>R("option",{key:C.projectPath,value:C.projectPath},`${C.projectPath} · ${C.useModel||"model?"}`)))),R("label",null,"Fork 数量",R("input",{type:"number",min:1,max:100,value:c.forkCount,"data-testid":"met-fork-count-input",onChange:(C)=>A({forkCount:C.target.value})})),R("label",null,"训练轮数",R("input",{type:"number",min:1,max:1e5,value:c.forkEpochs,"data-testid":"met-fork-epochs-input",onChange:(C)=>A({forkEpochs:C.target.value})})),R("label",null,"目标前缀",R("input",{value:c.forkPrefix,"data-testid":"met-fork-prefix-input",onChange:(C)=>A({forkPrefix:C.target.value})})),R("button",{type:"button",className:"primary-btn",onClick:L,disabled:n.actionBusy||!Y,"data-testid":"met-fork-button"},"Fork Project"),R("p",{className:"muted paragraph"},"Fork 只创建新 Project 并自动勾选,不会直接训练;需要在右侧确认后加入待启动队列。")),R("div",{className:"met-project-list"},R("div",{className:"panel-head compact"},R("div",null,R("p",{className:"panel-eyebrow"},`Existing Projects · ${(n.projects?.roots||[]).map((C)=>`${C.root} ${C.count}`).join(" / ")}`),R(rl,{title:"选择已有 Project",loading:n.loading||n.actionBusy})),R("button",{type:"button",className:"ghost-btn",onClick:W,disabled:n.actionBusy||Q().length===0,"data-testid":"met-stage-selected-button"},`加入待启动队列 (${Q().length})`)),X.length===0?R(bn,{title:"暂无 project",text:"等待 D601 返回 /api/projects"}):R("div",{className:"met-project-table","data-testid":"met-project-tree"},R("div",{className:"met-tree-header"},R("span",null,"文件树 Project"),R("span",null,"Model"),R("span",null,"Epochs"),R("span",null,"Progress"),R("span",null,"速度")),O.children.map((C)=>h(C)))),Wu()):null,c.activeTab==="current"?R("div",{"data-testid":"met-current-pane"},b(),I(p,"current"),Wu(),R("div",{className:"panel-actions inline-actions"},R(ly,{title:"MET Queue",data:n.queue,onOpen:l,testId:"raw-met-queue"}))):null,c.activeTab==="completed"?R("div",{"data-testid":"met-completed-pane"},I(v.length>0?v:P.filter((C)=>C.status==="succeeded"),"completed"),Wu()):null,c.activeTab==="failed"?R("div",{"data-testid":"met-failed-pane"},I(z.length>0?z:P.filter((C)=>["failed","canceled"].includes(C.status)),"failed"),Wu(),R("div",{className:"panel-actions inline-actions"},R(ly,{title:"MET History",data:n.history,onOpen:l,testId:"raw-met-history"}))):null,c.activeTab==="gpu"?R("div",{className:"met-gpu-pane","data-testid":"met-gpu-pane"},m.length===0?R(bn,{title:"暂无 GPU 上报",text:"等待 D601 met-nonlinear-ts 或 ML image 提供 nvidia-smi 数据"}):R("div",{className:"table-wrap"},R("table",null,R("thead",null,R("tr",null,R("th",null,"Index"),R("th",null,"Name"),R("th",null,"Free"),R("th",null,"Policy"))),R("tbody",null,m.map((C)=>R("tr",{key:C.index},R("td",null,C.index),R("td",null,C.name),R("td",null,`${C.memoryFreeMiB} / ${C.memoryTotalMiB} MiB`,R("div",{className:"met-progress"},R("span",{style:{width:fc(Number(C.freeRatio)*100)}}))),R("td",null,String(C.name||"").includes("2080")?"target 2080Ti, <20% 限制并发":"non-target")))))),R("div",{className:"panel-actions inline-actions"},R(ly,{title:"MET Images",data:n.images,onOpen:l,testId:"raw-met-images"}))):null))))}var Q3=Cu(Jl(),1);var Qu=Q3.default.createElement,{useEffect:wN,useMemo:DZ}=Q3.default,F3=Q3.default.useState;function WN({status:u,children:l}){let f=String(u||"unknown").toLowerCase();return Qu("span",{className:`status-badge ${f}`},l||u||"unknown")}function tc({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 U3({title:u,eyebrow:l,actions:f,children:r,className:n,loading:i}){return Qu("section",{className:`panel ${n||""}`},Qu("div",{className:"panel-head"},Qu("div",null,l?Qu("p",{className:"panel-eyebrow"},l):null,Qu(rl,{title:u,loading:i})),f?Qu("div",{className:"panel-actions"},f):null),Qu("div",{className:"panel-body"},r))}function E2({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 J3({title:u,text:l}){return Qu("div",{className:"empty-state"},Qu("strong",null,u),Qu("span",null,l))}function pZ(u){return u?.runtime&&typeof u.runtime==="object"&&!Array.isArray(u.runtime)?u.runtime:{}}function SZ(u){return u?.backend&&typeof u.backend==="object"&&!Array.isArray(u.backend)?u.backend:{}}function XZ(u){return u?.repository&&typeof u.repository==="object"&&!Array.isArray(u.repository)?u.repository:{}}function fy(u,l){return`${u}/microservices/mdtodo/proxy${l}`}function LN(u){if(u==="completed")return"已完成";if(u==="in_progress")return"进行中";return"待处理"}function YZ(u){if(u==="completed")return"online";if(u==="in_progress")return"warn";return"unknown"}function O2(u){let l=[],f=(r)=>{for(let n of r)if(l.push(n),Array.isArray(n.children))f(n.children)};return f(Array.isArray(u)?u:[]),l}function PZ({tasks:u,selectedId:l,onSelect:f}){if(!u.length)return Qu(J3,{title:"暂无任务",text:"当前文件没有 R 编号任务。"});let r=(n)=>Qu("li",{key:n.id},Qu("button",{type:"button",className:`mdtodo-task-row ${l===n.id?"active":""}`,style:{"--task-depth":Math.min(Number(n.depth||0),6)},onClick:()=>f(n.id),"data-testid":`mdtodo-task-${String(n.id).replace(/[^A-Za-z0-9_-]+/g,"-")}`},Qu(WN,{status:YZ(n.status)},LN(n.status)),Qu("code",null,n.id),Qu("span",{className:"mdtodo-task-title"},n.title||"--"),Qu("span",{className:"mdtodo-link-count"},`${n.linkExists??0}/${n.linkCount??0}`)),Array.isArray(n.children)&&n.children.length>0?Qu("ol",null,n.children.map(r)):null);return Qu("ol",{className:"mdtodo-tree"},u.map(r))}function TN({microservices:u,onRaw:l,apiBaseUrl:f="/api"}){let r=u.find((S)=>S.id==="mdtodo")||null,[n,i]=F3({loading:!1,saving:!1,error:"",notice:"",health:null,files:[],todo:null,selectedFile:"",selectedTaskId:"",refreshedAt:null,command:null}),[t,y]=F3(""),[c,$]=F3(""),[A,j]=F3(""),F=Array.isArray(n.todo?.tasks)?n.todo.tasks:[],J=DZ(()=>O2(F),[n.todo]),Q=J.find((S)=>S.id===n.selectedTaskId)||J[0]||null,W=n.todo?.stats||{};async function L(S=n.selectedFile){if(!r)return;i((B)=>({...B,loading:!0,error:"",notice:""}));try{let[B,D]=await Promise.all([Eu(`${f}/microservices/mdtodo/health`),Eu(fy(f,"/api/files"))]),X=Array.isArray(D.files)?D.files:[],O=S||X[0]?.path||"",Y=O?await Eu(fy(f,`/api/tasks?file=${encodeURIComponent(O)}`)):null,p=Array.isArray(Y?.tasks)?O2(Y.tasks):[],v=p.some((z)=>z.id===n.selectedTaskId)?n.selectedTaskId:p[0]?.id||"";i({loading:!1,saving:!1,error:"",notice:"",health:B,files:X,todo:Y,selectedFile:O,selectedTaskId:v,refreshedAt:new Date,command:n.command})}catch(B){i((D)=>({...D,loading:!1,error:Ou(B,"MDTODO 加载失败")}))}}if(wN(()=>{L()},[r?.id,r?.runtime?.providerStatus]),wN(()=>{y(Q?.title||""),$(Q?.rawContent||"")},[Q?.id,n.selectedFile]),!r)return Qu(J3,{title:"MDTODO 未登记",text:"请在 config.json 的 microservices 中登记用户服务 id=mdtodo"});let U=pZ(r),q=XZ(r),N=SZ(r);async function w(S){i((B)=>({...B,selectedFile:S,selectedTaskId:"",command:null})),await L(S)}async function G(S){if(!Q||!n.selectedFile)return;i((B)=>({...B,saving:!0,error:"",notice:""}));try{let B=await Eu(fy(f,`/api/tasks/${encodeURIComponent(Q.id)}`),{method:"PATCH",body:{file:n.selectedFile,...S}});i((D)=>({...D,saving:!1,todo:B.file,notice:B.result?.message||"任务已更新"}))}catch(B){i((D)=>({...D,saving:!1,error:Ou(B,"任务更新失败")}))}}async function Z(){await G({title:t,rawContent:c})}async function H(S){if(!n.selectedFile)return;i((B)=>({...B,saving:!0,error:"",notice:""}));try{let B=await Eu(fy(f,"/api/tasks"),{method:"POST",body:{file:n.selectedFile,parentId:S,title:A||"新任务"}});j(""),i((D)=>({...D,saving:!1,todo:B.file,selectedTaskId:B.result?.taskId||D.selectedTaskId,notice:B.result?.message||"任务已创建"})),await L(n.selectedFile)}catch(B){i((D)=>({...D,saving:!1,error:Ou(B,"创建任务失败")}))}}async function E(){if(!Q||!n.selectedFile)return;if(!window.confirm(`删除 ${Q.id} 及其子任务?`))return;i((S)=>({...S,saving:!0,error:"",notice:""}));try{let S=await Eu(fy(f,`/api/tasks/${encodeURIComponent(Q.id)}?file=${encodeURIComponent(n.selectedFile)}`),{method:"DELETE"}),B=O2(S.file?.tasks||[]);i((D)=>({...D,saving:!1,todo:S.file,selectedTaskId:B[0]?.id||"",notice:S.result?.message||"任务已删除"}))}catch(S){i((B)=>({...B,saving:!1,error:Ou(S,"删除任务失败")}))}}async function m(){if(!Q||!n.selectedFile)return;i((S)=>({...S,saving:!0,error:"",command:null}));try{let S=await Eu(fy(f,"/api/execute-command"),{method:"POST",body:{file:n.selectedFile,taskId:Q.id,mode:"codex"}});i((B)=>({...B,saving:!1,command:S,notice:"执行命令已生成"}))}catch(S){i((B)=>({...B,saving:!1,error:Ou(S,"执行命令生成失败")}))}}return Qu("div",{className:"mdtodo-page","data-testid":"mdtodo-page"},Qu(U3,{title:"MDTODO 工作台",eyebrow:"D601 k3s managed service",loading:n.loading,actions:Qu("div",{className:"panel-actions"},Qu("button",{type:"button",className:"ghost-btn",onClick:()=>void L(),disabled:n.loading,"data-testid":"mdtodo-refresh-button"},n.loading?"刷新中":"刷新"),Qu(E2,{title:"MDTODO 用户服务",data:r,onOpen:l,testId:"raw-mdtodo-service"}))},Qu("div",{className:"findjob-hero"},Qu("div",null,Qu("div",{className:"node-version-line"},Qu(WN,{status:U.providerStatus==="online"?"online":"warn"},U.providerStatus||"unknown"),Qu("span",null,r.providerId),Qu("span",null,N.proxyMode||"--")),Qu("p",{className:"muted paragraph"},r.description)),Qu("div",{className:"microservice-ref-card"},Qu("span",null,"Repo"),Qu("strong",null,q.url||"--"),Qu("code",null,q.composeFile||"--")),Qu("div",{className:"microservice-ref-card"},Qu("span",null,"Workspace"),Qu("strong",null,n.health?.rootDir||"/workspace"),Qu("code",null,`${N.nodeBindHost||"--"}:${N.nodePort||"--"}`))),Qu(nl,{error:n.error,wide:!0}),n.notice?Qu("div",{className:"notice-line"},n.notice):null),Qu("div",{className:"metric-grid"},Qu(tc,{label:"TODO 文件",value:n.files.length,hint:n.health?.rootExists?"hostPath ready":"hostPath missing",tone:n.health?.ok?"ok":"warn"}),Qu(tc,{label:"任务总数",value:W.total??"--",hint:n.selectedFile||"--"}),Qu(tc,{label:"已完成",value:W.completed??"--",hint:"completed",tone:"ok"}),Qu(tc,{label:"进行中",value:W.inProgress??"--",hint:"in progress",tone:"warn"}),Qu(tc,{label:"待处理",value:W.pending??"--",hint:n.refreshedAt?yl(n.refreshedAt):"pending"})),Qu("div",{className:"mdtodo-layout"},Qu(U3,{title:"文件",eyebrow:`${n.files.length} Markdown`,loading:n.loading,className:"mdtodo-file-panel"},n.files.length===0?Qu(J3,{title:"暂无 TODO 文件",text:"等待后端扫描 MDTODO 工作区。"}):Qu("div",{className:"mdtodo-file-list"},n.files.map((S)=>Qu("button",{key:S.path,type:"button",className:`mdtodo-file-item ${n.selectedFile===S.path?"active":""}`,onClick:()=>void w(S.path)},Qu("strong",null,S.name),Qu("span",null,S.directory||"."),Qu("code",null,`${S.stats?.total??"--"} tasks / ${wu(S.mtime)}`))))),Qu(U3,{title:"任务树",eyebrow:n.selectedFile||"Tasks",loading:n.loading,actions:Qu("div",{className:"panel-actions"},Qu("input",{value:A,onChange:(S)=>j(S.target.value),placeholder:"新任务标题","data-testid":"mdtodo-new-title"}),Qu("button",{type:"button",className:"ghost-btn",onClick:()=>void H(),disabled:n.saving||!n.selectedFile},"新增"),Q?Qu("button",{type:"button",className:"ghost-btn",onClick:()=>void H(Q.id),disabled:n.saving},"新增子任务"):null,n.todo?Qu(E2,{title:"MDTODO 当前文件",data:n.todo,onOpen:l,testId:"raw-mdtodo-file"}):null)},Qu(PZ,{tasks:F,selectedId:Q?.id||"",onSelect:(S)=>i((B)=>({...B,selectedTaskId:S,command:null}))})),Qu(U3,{title:Q?`${Q.id} 详情`:"任务详情",eyebrow:Q?LN(Q.status):"Detail",loading:n.saving,className:"mdtodo-detail-panel",actions:Q?Qu("div",{className:"panel-actions"},Qu("button",{type:"button",className:"ghost-btn",onClick:()=>void G({status:"pending"}),disabled:n.saving},"待处理"),Qu("button",{type:"button",className:"ghost-btn",onClick:()=>void G({status:"in_progress"}),disabled:n.saving},"进行中"),Qu("button",{type:"button",className:"primary-btn",onClick:()=>void G({status:"completed"}),disabled:n.saving},"完成")):null},!Q?Qu(J3,{title:"未选中任务",text:"请选择一个任务。"}):Qu("div",{className:"mdtodo-editor"},Qu("label",null,"标题",Qu("input",{value:t,onChange:(S)=>y(S.target.value),"data-testid":"mdtodo-title-input"})),Qu("label",null,"正文",Qu("textarea",{value:c,onChange:(S)=>$(S.target.value),rows:12,"data-testid":"mdtodo-raw-input"})),Qu("div",{className:"docker-meta compact"},Qu("span",null,`line ${Number(Q.lineNumber??0)+1}`),Qu("span",null,`depth ${Q.depth??0}`),Qu("span",null,`links ${Q.linkExists??0}/${Q.linkCount??0}`)),Qu("div",{className:"inline-actions"},Qu("button",{type:"button",className:"primary-btn",onClick:Z,disabled:n.saving},n.saving?"保存中":"保存"),Qu("button",{type:"button",className:"ghost-btn",onClick:m,disabled:n.saving},"生成执行命令"),Qu("button",{type:"button",className:"danger-btn",onClick:E,disabled:n.saving},"删除"),Qu(E2,{title:`MDTODO ${Q.id}`,data:Q,onOpen:l,testId:"raw-mdtodo-task"})),n.command?Qu("div",{className:"mdtodo-command"},Qu("span",null,n.command.prompt||"--"),Qu("code",null,n.command.command||"--")):null))))}var q3=[{id:"ops",label:"运行总览",code:"OPS",tabs:[{id:"status",label:"态势总览"},{id:"performance",label:"性能面板"},{id:"events",label:"事件摘要"},{id:"logs",label:"服务日志"}]},{id:"nodes",label:"资源节点",code:"NODE",tabs:[{id:"list",label:"节点清单"},{id:"monitor",label:"资源监控"},{id:"docker",label:"Docker 状态"},{id:"gateway",label:"网关版本"},{id:"labels",label:"资源标签"},{id:"heartbeats",label:"心跳状态"}]},{id:"tasks",label:"任务调度",code:"TASK",tabs:[{id:"dispatch",label:"下发任务"},{id:"scheduled",label:"定时任务"},{id:"pending",label:"待处理任务"},{id:"history",label:"任务历史"},{id:"results",label:"执行结果"}]},{id:"apps",label:"用户服务",code:"APP",routeSegment:"app",tabs:[{id:"catalog",label:"服务目录"},{id:"todo-note",label:"Todo Note"},{id:"findjob",label:"FindJob"},{id:"pipeline",label:"Pipeline"},{id:"met-nonlinear",label:"MET Nonlinear"},{id:"claudeqq",label:"ClaudeQQ"},{id:"baidu-netdisk",label:"Baidu Netdisk"},{id:"filebrowser",label:"File Browser"},{id:"oa-event-flow",label:"OA Event Flow"},{id:"k3sctl",label:"k3s Control"},{id:"code-queue",label:"Code Queue"},{id:"mdtodo",label:"MDTODO"},{id:"project-manager",label:"Project Manager"}]},{id:"config",label:"系统配置",code:"CFG",tabs:[{id:"topology",label:"连接拓扑"},{id:"auth",label:"认证策略"},{id:"security",label:"安全边界"}]}],yc=Object.fromEntries(q3.map((u)=>[u.id,u.tabs[0]?.id??""]));function CZ(u){let l=String(u||"").trim();if(!l)return"";try{return decodeURIComponent(l)}catch{return l}}function N3(u){let l=String(u||"/"),[f]=l.split(/[?#]/u,1);if(f==="/")return"/";let n=`/${f.split("/").map(CZ).filter(Boolean).join("/")}`;return n.endsWith("/")?n:`${n}/`}function MZ(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 Z2(u){return String(u||"").normalize("NFKD").replace(/[\u0300-\u036f]/gu,"").toLowerCase().replace(/[^a-z0-9]+/gu,"-").replace(/^-+|-+$/gu,"")}function KN(u){return String(u||"").trim().toLowerCase().replace(/[\s/\\?#%]+/gu,"-").replace(/-+/gu,"-").replace(/^-+|-+$/gu,"")}function GN(u){let l=Z2(u.routeSegment||"")||KN(u.routeSegment||"");if(l)return l;let f=Z2(u.id||"");if(f)return f;let r=Z2(u.label||"")||KN(u.label||"");if(r)return r;return`route-${MZ(JSON.stringify(u))}`}function H2(u,l){return`${u}:${l}`}function zN(u){let l=u.map((c)=>{let $=GN(c);return{...c,routeSegment:$,tabs:c.tabs.map((A)=>({...A,routeSegment:GN(A)}))}}),f={},r={},n={},i=l.map((c)=>{let $=c.tabs[0]?.id??"";n[c.id]=$;let A=c.tabs.map((J)=>{let Q=`/${c.routeSegment}/${J.routeSegment}/`,W=[Q],L={moduleId:c.id,tabId:J.id};for(let U of W)f[N3(U)]=L;return r[H2(c.id,J.id)]=Q,{...J,canonicalPath:Q,aliases:W}}),j=`/${c.routeSegment}/`,F={moduleId:c.id,tabId:$};return f[N3(j)]=F,{...c,routeSegment:c.routeSegment,canonicalPath:j,tabs:A}}),t=i[0],y={moduleId:t?.id||"",tabId:t?.tabs[0]?.id||""};return f["/"]=y,{modules:i,moduleById:Object.fromEntries(i.map((c)=>[c.id,c])),defaultActiveTabs:n,routeMap:f,canonicalPathByTarget:r,fallbackTarget:y}}function B2(u,l){return u.routeMap[N3(l)]||u.fallbackTarget}function w3(u,l,f){return u.canonicalPathByTarget[H2(l,f)]||u.canonicalPathByTarget[H2(u.fallbackTarget.moduleId,u.fallbackTarget.tabId)]||"/"}function EN(u,l){let f=u.routeMap[N3(l)];if(!f)return null;return w3(u,f.moduleId,f.tabId)}var K3=Cu(Jl(),1);var iu=K3.default.createElement,{useEffect:ON,useMemo:RZ}=K3.default,V2=K3.default.useState;function T3({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 cc({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 W3({title:u,eyebrow:l,actions:f,children:r,className:n,loading:i}){return iu("section",{className:`panel ${n||""}`},iu("div",{className:"panel-head"},iu("div",null,l?iu("p",{className:"panel-eyebrow"},l):null,iu(rl,{title:u,loading:i})),f?iu("div",{className:"panel-actions"},f):null),iu("div",{className:"panel-body"},r))}function _c({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 m2({title:u,text:l}){return iu("div",{className:"empty-state"},iu("strong",null,u),iu("span",null,l))}function xZ(u){return u&&typeof u==="object"&&!Array.isArray(u)?u:null}function vn(u){return Array.isArray(u)?u:[]}function of(u){let l=Number(u);return Number.isFinite(l)?l.toLocaleString("zh-CN"):"--"}function ZN(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 hZ(u){return vn(u?.tags).map((l)=>String(l||"").trim()).filter(Boolean)}function Pi(u){let l=Number(u);return Number.isFinite(l)&&l>=0?Math.floor(l):0}function bZ(u){return u?.runtime&&typeof u.runtime==="object"&&!Array.isArray(u.runtime)?u.runtime:{}}function vZ(u){return u?.backend&&typeof u.backend==="object"&&!Array.isArray(u.backend)?u.backend:{}}function kZ(u){return String(u||"").split(/[\s,]+/u).map((l)=>l.trim()).filter(Boolean).join(",")}function L3(u,l){return`${u}/microservices/oa-event-flow/proxy${l}`}function IZ(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 gZ(u){let l=String(u?.subjectKind||"trace"),f=String(u?.subjectId||u?.scopeId||"");return f?`${l}:${f}`:String(u?.scopeId||"--")}function sZ({tags:u}){let l=hZ({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 aZ({events:u,onRaw:l}){let f=[...vn(u)].reverse();return f.length===0?iu(m2,{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,of(r?.sequence))),iu("td",null,iu(T3,{status:IZ(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(sZ,{tags:r?.tags})),iu("td",null,iu("span",{className:"oa-payload-preview"},ZN(r?.payload,180))),iu("td",null,wu(r?.createdAt)),iu("td",null,iu(_c,{title:`OA Event ${r?.sequence||""}`,data:r,onOpen:l,testId:`raw-oa-event-${r?.sequence||"unknown"}`})))}))))}function oZ({stats:u,onRaw:l}){let f=vn(u);return f.length===0?iu(m2,{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,gZ(r)),iu("code",null,r?.scopeId||"--")),iu("td",null,iu(T3,{status:String(r?.serviceId||"unknown")==="code-queue"?"running":"queued"},r?.serviceId||"--")),iu("td",null,iu("strong",null,of(Pi(r?.stepCount??r?.llmStepCount)))),iu("td",null,of(Pi(r?.readCount))),iu("td",null,of(Pi(r?.editCount))),iu("td",null,of(Pi(r?.runCount))),iu("td",null,of(Pi(r?.errorCount))),iu("td",null,iu("code",null,of(Pi(r?.outputMaxSeq)))),iu("td",null,of(Pi(r?.statsRevision))),iu("td",null,wu(r?.updatedAt)),iu("td",null,iu(_c,{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 HN({microservices:u,onRaw:l,apiBaseUrl:f="/api"}){let r=u.find((G)=>G.id==="oa-event-flow")||null,[n,i]=V2("service:code-queue"),[t,y]=V2({loading:!1,error:"",health:null,diagnostics:null,events:[],stats:[],refreshedAt:null}),[c,$]=V2({status:"idle",message:"未连接",lastEventAt:""}),A=RZ(()=>kZ(n),[n]);async function j(){if(!r)return;y((G)=>({...G,loading:!0,error:""}));try{let G=A?`tags=${encodeURIComponent(A)}&`:"",[Z,H,E,m]=await Promise.all([Eu(`${f}/microservices/oa-event-flow/health`,{failureFields:[]}),Eu(L3(f,"/api/diagnostics")),Eu(L3(f,`/api/events?${G}limit=100`)),Eu(L3(f,`/api/stats/trace?${G}limit=100`))]);y({loading:!1,error:"",health:Z,diagnostics:H,events:vn(E?.events),stats:vn(m?.stats),refreshedAt:new Date})}catch(G){y((Z)=>({...Z,loading:!1,error:Ou(G,"OA Event Flow 加载失败")}))}}if(ON(()=>{j()},[r?.id,r?.runtime?.providerStatus,A]),ON(()=>{if(!r||typeof EventSource>"u")return;let G=A?`?tags=${encodeURIComponent(A)}`:"",Z=new EventSource(`${L3(f,"/api/events/stream")}${G}`,{withCredentials:!0});$({status:"running",message:"SSE connecting",lastEventAt:""});let H=(S)=>{$({status:"online",message:ZN(S.data,120),lastEventAt:new Date().toISOString()})},E=(S)=>{try{let B=JSON.parse(String(S.data||"{}"));$({status:"online",message:String(B?.type||S.type||"event"),lastEventAt:new Date().toISOString()}),y((D)=>{let X=[...vn(D.events).filter((Y)=>String(Y?.eventId||"")!==String(B?.eventId||"")),B].sort((Y,p)=>Number(Y?.sequence||0)-Number(p?.sequence||0)).slice(-100),O=B?.type==="trace-stats-updated"&&xZ(B?.payload?.stats)?[B.payload.stats,...vn(D.stats).filter((Y)=>String(Y?.scopeId||"")!==String(B.payload.stats.scopeId||""))].slice(0,100):D.stats;return{...D,events:X,stats:O}})}catch(B){$({status:"warn",message:Ou(B,"SSE 事件解析失败"),lastEventAt:new Date().toISOString()})}},m=()=>{$((S)=>({...S,status:"warn",message:"SSE reconnecting"}))};return Z.addEventListener("hello",H),Z.addEventListener("task-updated",E),Z.addEventListener("queue-updated",E),Z.addEventListener("trace-step-created",E),Z.addEventListener("trace-stats-snapshot",E),Z.addEventListener("trace-stats-updated",E),Z.addEventListener("trace-error",E),Z.onerror=m,()=>Z.close()},[r?.id,f,A]),!r)return iu(m2,{title:"OA Event Flow 未登记",text:"请在 config.json 的 microservices 中登记 id=oa-event-flow"});let F=bZ(r),J=vZ(r),Q=t.diagnostics||{},W=t.health||{},L=Q.eventCount??W.eventCount,U=Q.traceStatsCount??W.traceStatsCount,q=Q.latestSequence??W.latestSequence,N=Q.pipelineBridge||W.pipelineBridge||{},w=vn(Q.eventTypes).slice(0,8);return iu("div",{className:"oa-event-flow-page","data-testid":"oa-event-flow-page"},iu(W3,{title:"OA Event Flow 控制台",eyebrow:"Unified OA Event Bus + Stats Projection",loading:t.loading,actions:iu("div",{className:"panel-actions"},iu("button",{type:"button",className:"ghost-btn",onClick:j,disabled:t.loading,"data-testid":"oa-event-flow-refresh"},t.loading?"刷新中":"刷新"),iu(_c,{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(T3,{status:W?.ok||F.providerStatus==="online"?"online":"warn"},W?.ok?"HEALTH OK":F.providerStatus||"unknown"),iu(T3,{status:c.status},c.status.toUpperCase()),iu("span",null,J.public?"公网暴露":"仅 UniDesk frontend 代理访问")),iu("p",{className:"muted paragraph"},"独立事件流微服务统一承载 Code Queue 与 Pipeline 的事件发布、tag 订阅、事件表审计和 Trace/STEP 统计投影。")),iu("div",{className:"oa-flow-signal"},iu("span",null,"stream"),iu("strong",null,c.message||"--"),iu("code",null,c.lastEventAt?yl(new Date(c.lastEventAt)):"waiting"))),iu(nl,{error:t.error,wide:!0})),iu("div",{className:"oa-flow-metrics"},iu(cc,{label:"事件总量",value:of(L),hint:`latest seq ${of(q)}`,tone:"ok"}),iu(cc,{label:"Trace Stats",value:of(U),hint:"oa_trace_stats 投影"}),iu(cc,{label:"SSE Clients",value:of(W?.sseClientCount??vn(Q.sseClients).length),hint:c.message||"tag subscription"}),iu(cc,{label:"Pipeline Bridge",value:N?.enabled?of(N?.insertedCount):"OFF",hint:N?.lastError||N?.lastFinishedAt||`${N?.mode||"snapshot"} service:pipeline`}),iu(cc,{label:"DB",value:W?.databaseReady||Q.databaseReady?"READY":"WAIT",hint:W?.databaseLastError||Q.databaseLastError||"PostgreSQL persisted"})),iu(W3,{title:"标签订阅",eyebrow:t.refreshedAt?`Updated ${yl(t.refreshedAt)}`:"Tag Pub/Sub"},iu("div",{className:"oa-filter-bar"},iu("label",null,iu("span",null,"tags"),iu("input",{value:n,onChange:(G)=>i(G.target.value),placeholder:"service:code-queue, trace","data-testid":"oa-event-flow-tag-filter"})),iu("div",{className:"oa-filter-presets"},iu("button",{type:"button",className:"ghost-btn",onClick:()=>i("service:code-queue")},"Code Queue"),iu("button",{type:"button",className:"ghost-btn",onClick:()=>i("service:pipeline")},"Pipeline"),iu("button",{type:"button",className:"ghost-btn",onClick:()=>i("trace")},"Trace"),iu("button",{type:"button",className:"ghost-btn",onClick:()=>i("")},"All")),iu("code",null,A||"all events")),iu("div",{className:"oa-type-strip"},w.length===0?iu("span",{className:"muted"},"等待事件类型统计"):w.map((G)=>iu("span",{key:G.type,className:"data-chip"},`${G.type} ${of(G.count)}`)))),iu("div",{className:"oa-flow-grid"},iu(W3,{title:"事件表",eyebrow:"oa_events persisted log",className:"oa-flow-wide",loading:t.loading,actions:iu(_c,{title:"OA Event Query",data:{events:t.events,diagnostics:Q},onOpen:l,testId:"raw-oa-events"})},iu(aZ,{events:t.events,onRaw:l})),iu(W3,{title:"统计中心",eyebrow:"oa_trace_stats read model",className:"oa-flow-wide",loading:t.loading,actions:iu(_c,{title:"OA Trace Stats",data:t.stats,onOpen:l,testId:"raw-oa-trace-stats"})},iu(oZ,{stats:t.stats,onRaw:l}))))}var s0=Cu(Jl(),1);var nu=Cu(DN(),1),tu=Cu(Jl(),1);function Rl(u){if(typeof u==="string"||typeof u==="number")return""+u;let l="";if(Array.isArray(u)){for(let f=0,r;f{}};function SN(){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}})}z3.prototype=SN.prototype={constructor:z3,on:function(u,l){var f=this._,r=iH(u+"",f),n,i=-1,t=r.length;if(arguments.length<2){while(++i0)for(var f=Array(n),r=0,n,i;r=0&&(l=u.slice(0,f))!=="xmlns")u=u.slice(f+1);return D2.hasOwnProperty(l)?{space:D2[l],local:u}:u}function p2(u){let l;while(l=u.sourceEvent)u=l;return u}function zf(u,l){if(u=p2(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 yH(){}function X0(u){return u==null?yH:function(){return this.querySelector(u)}}function S2(u){if(typeof u!=="function")u=X0(u);for(var l=this._groups,f=l.length,r=Array(f),n=0;n=N)N=q+1;while(!(G=L[N])&&++N=0;)if(t=r[n]){if(i&&t.compareDocumentPosition(i)^4)i.parentNode.insertBefore(t,i);i=t}return this}function g2(u){if(!u)u=WH;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 s2(){var u=arguments[0];return arguments[0]=this,u.apply(null,arguments),this}function a2(){return Array.from(this)}function o2(){for(var u=this._groups,l=0,f=u.length;l1?this.each((l==null?OH:typeof l==="function"?HH:ZH)(u,l,f==null?"":f)):Y0(this.node(),u)}function Y0(u,l){return u.style.getPropertyValue(l)||jc(u).getComputedStyle(u,null).getPropertyValue(l)}function BH(u){return function(){delete this[u]}}function VH(u,l){return function(){this[u]=l}}function mH(u,l){return function(){var f=l.apply(this,arguments);if(f==null)delete this[u];else this[u]=f}}function r5(u,l){return arguments.length>1?this.each((l==null?BH:typeof l==="function"?mH:VH)(u,l)):this.node()[u]}function XN(u){return u.trim().split(/^|\s+/)}function n5(u){return u.classList||new YN(u)}function YN(u){this._node=u,this._names=XN(u.getAttribute("class")||"")}YN.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 PN(u,l){var f=n5(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 dH(u){return function(){var l=this.__on;if(!l)return;for(var f=0,r=-1,n=l.length,i;f()=>u;function Qc(u,{sourceEvent:l,subject:f,target:r,identifier:n,active:i,x:t,y,dx:c,dy:$,dispatch:A}){Object.defineProperties(this,{type:{value:u,enumerable:!0,configurable:!0},sourceEvent:{value:l,enumerable:!0,configurable:!0},subject:{value:f,enumerable:!0,configurable:!0},target:{value:r,enumerable:!0,configurable:!0},identifier:{value:n,enumerable:!0,configurable:!0},active:{value:i,enumerable:!0,configurable:!0},x:{value:t,enumerable:!0,configurable:!0},y:{value:y,enumerable:!0,configurable:!0},dx:{value:c,enumerable:!0,configurable:!0},dy:{value:$,enumerable:!0,configurable:!0},_:{value:A}})}Qc.prototype.on=function(){var u=this._.on.apply(this._,arguments);return u===this._?this:u};function $B(u){return!u.ctrlKey&&!u.button}function AB(){return this.parentNode}function jB(u,l){return l==null?{x:u.x,y:u.y}:l}function FB(){return navigator.maxTouchPoints||"ontouchstart"in this}function Nc(){var u=$B,l=AB,f=jB,r=FB,n={},i=Ci("start","drag","end"),t=0,y,c,$,A,j=0;function F(w){w.on("mousedown.drag",J).filter(r).on("touchstart.drag",L).on("touchmove.drag",U,xN).on("touchend.drag touchcancel.drag",q).style("touch-action","none").style("-webkit-tap-highlight-color","rgba(0,0,0,0)")}function J(w,G){if(A||!u.call(this,w,G))return;var Z=N(this,l.call(this,w,G),w,G,"mouse");if(!Z)return;ff(w.view).on("mousemove.drag",Q,Mi).on("mouseup.drag",W,Mi),iy(w.view),Z3(w),$=!1,y=w.clientX,c=w.clientY,Z("start",w)}function Q(w){if(In(w),!$){var G=w.clientX-y,Z=w.clientY-c;$=G*G+Z*Z>j}n.mouse("drag",w)}function W(w){ff(w.view).on("mousemove.drag mouseup.drag",null),Uc(w.view,$),In(w),n.mouse("end",w)}function L(w,G){if(!u.call(this,w,G))return;var Z=w.changedTouches,H=l.call(this,w,G),E=Z.length,m,S;for(m=0;m>8&15|l>>4&240,l>>4&15|l&240,(l&15)<<4|l&15,1):f===8?H3(l>>24&255,l>>16&255,l>>8&255,(l&255)/255):f===4?H3(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=JB.exec(u))?new df(l[1],l[2],l[3],1):(l=QB.exec(u))?new df(l[1]*255/100,l[2]*255/100,l[3]*255/100,1):(l=NB.exec(u))?H3(l[1],l[2],l[3],l[4]):(l=qB.exec(u))?H3(l[1]*255/100,l[2]*255/100,l[3]*255/100,l[4]):(l=wB.exec(u))?sN(l[1],l[2]/100,l[3]/100,1):(l=WB.exec(u))?sN(l[1],l[2]/100,l[3]/100,l[4]):hN.hasOwnProperty(u)?kN(hN[u]):u==="transparent"?new df(NaN,NaN,NaN,0):null}function kN(u){return new df(u>>16&255,u>>8&255,u&255,1)}function H3(u,l,f,r){if(r<=0)u=l=f=NaN;return new df(u,l,f,r)}function KB(u){if(!(u instanceof Lc))u=dr(u);if(!u)return new df;return u=u.rgb(),new df(u.r,u.g,u.b,u.opacity)}function yy(u,l,f,r){return arguments.length===1?KB(u):new df(u,l,f,r==null?1:r)}function df(u,l,f,r){this.r=+u,this.g=+l,this.b=+f,this.opacity=+r}qc(df,yy,w5(Lc,{brighter(u){return u=u==null?V3:Math.pow(V3,u),new df(this.r*u,this.g*u,this.b*u,this.opacity)},darker(u){return u=u==null?wc:Math.pow(wc,u),new df(this.r*u,this.g*u,this.b*u,this.opacity)},rgb(){return this},clamp(){return new df(xi(this.r),xi(this.g),xi(this.b),m3(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:IN,formatHex:IN,formatHex8:GB,formatRgb:gN,toString:gN}));function IN(){return`#${Ri(this.r)}${Ri(this.g)}${Ri(this.b)}`}function GB(){return`#${Ri(this.r)}${Ri(this.g)}${Ri(this.b)}${Ri((isNaN(this.opacity)?1:this.opacity)*255)}`}function gN(){let u=m3(this.opacity);return`${u===1?"rgb(":"rgba("}${xi(this.r)}, ${xi(this.g)}, ${xi(this.b)}${u===1?")":`, ${u})`}`}function m3(u){return isNaN(u)?1:Math.max(0,Math.min(1,u))}function xi(u){return Math.max(0,Math.min(255,Math.round(u)||0))}function Ri(u){return u=xi(u),(u<16?"0":"")+u.toString(16)}function sN(u,l,f,r){if(r<=0)u=l=f=NaN;else if(f<=0||f>=1)u=l=NaN;else if(l<=0)u=NaN;return new or(u,l,f,r)}function oN(u){if(u instanceof or)return new or(u.h,u.s,u.l,u.opacity);if(!(u instanceof Lc))u=dr(u);if(!u)return new or;if(u instanceof or)return u;u=u.rgb();var l=u.r/255,f=u.g/255,r=u.b/255,n=Math.min(l,f,r),i=Math.max(l,f,r),t=NaN,y=i-n,c=(i+n)/2;if(y){if(l===i)t=(f-r)/y+(f0&&c<1?0:t;return new or(t,y,c,u.opacity)}function dN(u,l,f,r){return arguments.length===1?oN(u):new or(u,l,f,r==null?1:r)}function or(u,l,f,r){this.h=+u,this.s=+l,this.l=+f,this.opacity=+r}qc(or,dN,w5(Lc,{brighter(u){return u=u==null?V3:Math.pow(V3,u),new or(this.h,this.s,this.l*u,this.opacity)},darker(u){return u=u==null?wc:Math.pow(wc,u),new or(this.h,this.s,this.l*u,this.opacity)},rgb(){var u=this.h%360+(this.h<0)*360,l=isNaN(u)||isNaN(this.s)?0:this.s,f=this.l,r=f+(f<0.5?f:1-f)*l,n=2*f-r;return new df(W5(u>=240?u-240:u+120,n,r),W5(u,n,r),W5(u<120?u+240:u-120,n,r),this.opacity)},clamp(){return new or(aN(this.h),B3(this.s),B3(this.l),m3(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=m3(this.opacity);return`${u===1?"hsl(":"hsla("}${aN(this.h)}, ${B3(this.s)*100}%, ${B3(this.l)*100}%${u===1?")":`, ${u})`}`}}));function aN(u){return u=(u||0)%360,u<0?u+360:u}function B3(u){return Math.max(0,Math.min(1,u||0))}function W5(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 L5(u,l,f,r,n){var i=u*u,t=i*u;return((1-3*u+3*i-t)*l+(4-6*i+3*t)*f+(1+3*u+3*i-3*t)*r+t*n)/6}function T5(u){var l=u.length-1;return function(f){var r=f<=0?f=0:f>=1?(f=1,l-1):Math.floor(f*l),n=u[r],i=u[r+1],t=r>0?u[r-1]:2*n-i,y=r()=>u;function EB(u,l){return function(f){return u+f*l}}function OB(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 eN(u){return(u=+u)===1?p3:function(l,f){return f-l?OB(l,f,u):Tc(isNaN(l)?f:l)}}function p3(u,l){var f=l-u;return f?EB(u,f):Tc(isNaN(u)?l:u)}var hi=function u(l){var f=eN(l);function r(n,i){var t=f((n=yy(n)).r,(i=yy(i)).r),y=f(n.g,i.g),c=f(n.b,i.b),$=p3(n.opacity,i.opacity);return function(A){return n.r=t(A),n.g=y(A),n.b=c(A),n.opacity=$(A),n+""}}return r.gamma=u,r}(1);function uq(u){return function(l){var f=l.length,r=Array(f),n=Array(f),i=Array(f),t,y;for(t=0;tf)if(i=l.slice(f,i),y[t])y[t]+=i;else y[++t]=i;if((r=r[0])===(n=n[0]))if(y[t])y[t]+=n;else y[++t]=n;else y[++t]=null,c.push({i:t,x:Ef(r,n)});f=O5.lastIndex}if(f180)A+=360;else if(A-$>180)$+=360;F.push({i:j.push(n(j)+"rotate(",null,r)-2,x:Ef($,A)})}else if(A)j.push(n(j)+"rotate("+A+r)}function y($,A,j,F){if($!==A)F.push({i:j.push(n(j)+"skewX(",null,r)-2,x:Ef($,A)});else if(A)j.push(n(j)+"skewX("+A+r)}function c($,A,j,F,J,Q){if($!==j||A!==F){var W=J.push(n(J)+"scale(",null,",",null,")");Q.push({i:W-4,x:Ef($,j)},{i:W-2,x:Ef(A,F)})}else if(j!==1||F!==1)J.push(n(J)+"scale("+j+","+F+")")}return function($,A){var j=[],F=[];return $=u($),A=u(A),i($.translateX,$.translateY,A.translateX,A.translateY,j,F),t($.rotate,A.rotate,j,F),y($.skewX,A.skewX,j,F),c($.scaleX,$.scaleY,A.scaleX,A.scaleY,j,F),$=A=null,function(J){var Q=-1,W=F.length,L;while(++Q=0)u._call.call(void 0,l);u=u._next}--_y}function Aq(){vi=(C3=Ec.now())+M3,_y=Gc=0;try{Uq()}finally{_y=0,sB(),vi=0}}function gB(){var u=Ec.now(),l=u-C3;if(l>jq)M3-=l,C3=u}function sB(){var u,l=P3,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:P3=f;zc=u,V5(r)}function V5(u){if(_y)return;if(Gc)Gc=clearTimeout(Gc);var l=u-vi;if(l>24){if(u<1/0)Gc=setTimeout(Aq,u-Ec.now()-M3);if(Kc)Kc=clearInterval(Kc)}else{if(!Kc)C3=Ec.now(),Kc=setInterval(gB,jq);_y=1,Fq(Aq)}}function Hc(u,l,f){var r=new Oc;return l=l==null?0:+l,r.restart((n)=>{r.stop(),u(n+l)},l,f),r}var oB=Ci("start","end","cancel","interrupt"),dB=[],Nq=0,Jq=1,h3=2,x3=3,Qq=4,b3=5,Bc=6;function gn(u,l,f,r,n,i){var t=u.__transition;if(!t)u.__transition={};else if(f in t)return;eB(u,f,{name:l,index:r,group:n,on:oB,tween:dB,time:i.time,delay:i.delay,duration:i.duration,ease:i.ease,timer:null,state:Nq})}function Vc(u,l){var f=rf(u,l);if(f.state>Nq)throw Error("too late; already scheduled");return f}function Jf(u,l){var f=rf(u,l);if(f.state>x3)throw Error("too late; already running");return f}function rf(u,l){var f=u.__transition;if(!f||!(f=f[l]))throw Error("transition not found");return f}function eB(u,l,f){var r=u.__transition,n;r[l]=f,f.timer=R3(i,0,f.time);function i($){if(f.state=Jq,f.timer.restart(t,f.delay,f.time),f.delay<=$)t($-f.delay)}function t($){var A,j,F,J;if(f.state!==Jq)return c();for(A in r){if(J=r[A],J.name!==f.name)continue;if(J.state===x3)return Hc(t);if(J.state===Qq)J.state=Bc,J.timer.stop(),J.on.call("interrupt",u,u.__data__,J.index,J.group),delete r[A];else if(+Ah3&&r.state=0)l=l.slice(0,f);return!l||l==="start"})}function wV(u,l,f){var r,n,i=qV(l)?Vc:Jf;return function(){var t=i(this,u),y=t.on;if(y!==r)(n=(r=y).copy()).on(l,f);t.on=n}}function x5(u,l){var f=this._id;return arguments.length<2?rf(this.node(),f).on.on(u):this.each(wV(f,u,l))}function WV(u){return function(){var l=this.parentNode;for(var f in this.__transition)if(+f!==u)return;if(l)l.removeChild(this)}}function h5(){return this.on("end.remove",WV(this._id))}function b5(u){var l=this._name,f=this._id;if(typeof u!=="function")u=X0(u);for(var r=this._groups,n=r.length,i=Array(n),t=0;t()=>u;function u9(u,{sourceEvent:l,target:f,transform:r,dispatch:n}){Object.defineProperties(this,{type:{value:u,enumerable:!0,configurable:!0},sourceEvent:{value:l,enumerable:!0,configurable:!0},target:{value:f,enumerable:!0,configurable:!0},transform:{value:r,enumerable:!0,configurable:!0},_:{value:n}})}function er(u,l,f){this.k=u,this.x=l,this.y=f}er.prototype={constructor:er,scale:function(u){return u===1?this:new er(this.k*u,this.x,this.y)},translate:function(u,l){return u===0&l===0?this:new er(this.k,this.x+this.k*u,this.y+this.k*l)},apply:function(u){return[u[0]*this.k+this.x,u[1]*this.k+this.y]},applyX:function(u){return u*this.k+this.x},applyY:function(u){return u*this.k+this.y},invert:function(u){return[(u[0]-this.x)/this.k,(u[1]-this.y)/this.k]},invertX:function(u){return(u-this.x)/this.k},invertY:function(u){return(u-this.y)/this.k},rescaleX:function(u){return u.copy().domain(u.range().map(this.invertX,this).map(u.invert,u))},rescaleY:function(u){return u.copy().domain(u.range().map(this.invertY,this).map(u.invert,u))},toString:function(){return"translate("+this.x+","+this.y+") scale("+this.k+")"}};var ki=new er(1,0,0);pc.prototype=er.prototype;function pc(u){while(!u.__zoom)if(!(u=u.parentNode))return ki;return u.__zoom}function lA(u){u.stopImmediatePropagation()}function Ii(u){u.preventDefault(),u.stopImmediatePropagation()}function XV(u){return(!u.ctrlKey||u.type==="wheel")&&!u.button}function YV(){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 Wq(){return this.__zoom||ki}function PV(u){return-u.deltaY*(u.deltaMode===1?0.05:u.deltaMode?1:0.002)*(u.ctrlKey?10:1)}function CV(){return navigator.maxTouchPoints||"ontouchstart"in this}function MV(u,l,f){var r=u.invertX(l[0][0])-f[0][0],n=u.invertX(l[1][0])-f[1][0],i=u.invertY(l[0][1])-f[0][1],t=u.invertY(l[1][1])-f[1][1];return u.translate(n>r?(r+n)/2:Math.min(0,r)||Math.max(0,n),t>i?(i+t)/2:Math.min(0,i)||Math.max(0,t))}function Sc(){var u=XV,l=YV,f=MV,r=PV,n=CV,i=[0,1/0],t=[[-1/0,-1/0],[1/0,1/0]],y=250,c=bi,$=Ci("start","zoom","end"),A,j,F,J=500,Q=150,W=0,L=10;function U(O){O.property("__zoom",Wq).on("wheel.zoom",E,{passive:!1}).on("mousedown.zoom",m).on("dblclick.zoom",S).filter(n).on("touchstart.zoom",B).on("touchmove.zoom",D).on("touchend.zoom touchcancel.zoom",X).style("-webkit-tap-highlight-color","rgba(0,0,0,0)")}U.transform=function(O,Y,p,v){var z=O.selection?O.selection():O;if(z.property("__zoom",Wq),O!==z)G(O,Y,p,v);else z.interrupt().each(function(){Z(this,arguments).event(v).start().zoom(null,typeof Y==="function"?Y.apply(this,arguments):Y).end()})},U.scaleBy=function(O,Y,p,v){U.scaleTo(O,function(){var z=this.__zoom.k,P=typeof Y==="function"?Y.apply(this,arguments):Y;return z*P},p,v)},U.scaleTo=function(O,Y,p,v){U.transform(O,function(){var z=l.apply(this,arguments),P=this.__zoom,k=p==null?w(z):typeof p==="function"?p.apply(this,arguments):p,I=P.invert(k),b=typeof Y==="function"?Y.apply(this,arguments):Y;return f(N(q(P,b),k,I),z,t)},p,v)},U.translateBy=function(O,Y,p,v){U.transform(O,function(){return f(this.__zoom.translate(typeof Y==="function"?Y.apply(this,arguments):Y,typeof p==="function"?p.apply(this,arguments):p),l.apply(this,arguments),t)},null,v)},U.translateTo=function(O,Y,p,v,z){U.transform(O,function(){var P=l.apply(this,arguments),k=this.__zoom,I=v==null?w(P):typeof v==="function"?v.apply(this,arguments):v;return f(ki.translate(I[0],I[1]).scale(k.k).translate(typeof Y==="function"?-Y.apply(this,arguments):-Y,typeof p==="function"?-p.apply(this,arguments):-p),P,t)},v,z)};function q(O,Y){return Y=Math.max(i[0],Math.min(i[1],Y)),Y===O.k?O:new er(Y,O.x,O.y)}function N(O,Y,p){var v=Y[0]-p[0]*O.k,z=Y[1]-p[1]*O.k;return v===O.x&&z===O.y?O:new er(O.k,v,z)}function w(O){return[(+O[0][0]+ +O[1][0])/2,(+O[0][1]+ +O[1][1])/2]}function G(O,Y,p,v){O.on("start.zoom",function(){Z(this,arguments).event(v).start()}).on("interrupt.zoom end.zoom",function(){Z(this,arguments).event(v).end()}).tween("zoom",function(){var z=this,P=arguments,k=Z(z,P).event(v),I=l.apply(z,P),b=p==null?w(I):typeof p==="function"?p.apply(z,P):p,d=Math.max(I[1][0]-I[0][0],I[1][1]-I[0][1]),s=z.__zoom,h=typeof Y==="function"?Y.apply(z,P):Y,lu=c(s.invert(b).concat(d/s.k),h.invert(b).concat(d/h.k));return function(cu){if(cu===1)cu=h;else{var _u=lu(cu),Fu=d/_u[2];cu=new er(Fu,b[0]-_u[0]*Fu,b[1]-_u[1]*Fu)}k.zoom(null,cu)}})}function Z(O,Y,p){return!p&&O.__zooming||new H(O,Y)}function H(O,Y){this.that=O,this.args=Y,this.active=0,this.sourceEvent=null,this.extent=l.apply(O,Y),this.taps=0}H.prototype={event:function(O){if(O)this.sourceEvent=O;return this},start:function(){if(++this.active===1)this.that.__zooming=this,this.emit("start");return this},zoom:function(O,Y){if(this.mouse&&O!=="mouse")this.mouse[1]=Y.invert(this.mouse[0]);if(this.touch0&&O!=="touch")this.touch0[1]=Y.invert(this.touch0[0]);if(this.touch1&&O!=="touch")this.touch1[1]=Y.invert(this.touch1[0]);return this.that.__zoom=Y,this.emit("zoom"),this},end:function(){if(--this.active===0)delete this.that.__zooming,this.emit("end");return this},emit:function(O){var Y=ff(this.that).datum();$.call(O,this.that,new u9(O,{sourceEvent:this.sourceEvent,target:U,type:O,transform:this.that.__zoom,dispatch:$}),Y)}};function E(O,...Y){if(!u.apply(this,arguments))return;var p=Z(this,Y).event(O),v=this.__zoom,z=Math.max(i[0],Math.min(i[1],v.k*Math.pow(2,r.apply(this,arguments)))),P=zf(O);if(p.wheel){if(p.mouse[0][0]!==P[0]||p.mouse[0][1]!==P[1])p.mouse[1]=v.invert(p.mouse[0]=P);clearTimeout(p.wheel)}else if(v.k===z)return;else p.mouse=[P,v.invert(P)],P0(this),p.start();Ii(O),p.wheel=setTimeout(k,Q),p.zoom("mouse",f(N(q(v,z),p.mouse[0],p.mouse[1]),p.extent,t));function k(){p.wheel=null,p.end()}}function m(O,...Y){if(F||!u.apply(this,arguments))return;var p=O.currentTarget,v=Z(this,Y,!0).event(O),z=ff(O.view).on("mousemove.zoom",b,!0).on("mouseup.zoom",d,!0),P=zf(O,p),k=O.clientX,I=O.clientY;iy(O.view),lA(O),v.mouse=[P,this.__zoom.invert(P)],P0(this),v.start();function b(s){if(Ii(s),!v.moved){var h=s.clientX-k,lu=s.clientY-I;v.moved=h*h+lu*lu>W}v.event(s).zoom("mouse",f(N(v.that.__zoom,v.mouse[0]=zf(s,p),v.mouse[1]),v.extent,t))}function d(s){z.on("mousemove.zoom mouseup.zoom",null),Uc(s.view,v.moved),Ii(s),v.event(s).end()}}function S(O,...Y){if(!u.apply(this,arguments))return;var p=this.__zoom,v=zf(O.changedTouches?O.changedTouches[0]:O,this),z=p.invert(v),P=p.k*(O.shiftKey?0.5:2),k=f(N(q(p,P),v,z),l.apply(this,Y),t);if(Ii(O),y>0)ff(this).transition().duration(y).call(G,k,v,O);else ff(this).call(U.transform,k,v,O)}function B(O,...Y){if(!u.apply(this,arguments))return;var p=O.touches,v=p.length,z=Z(this,Y,O.changedTouches.length===v).event(O),P,k,I,b;lA(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."},Jy=[[Number.NEGATIVE_INFINITY,Number.NEGATIVE_INFINITY],[Number.POSITIVE_INFINITY,Number.POSITIVE_INFINITY]],i9=["Enter"," ","Escape"],t9={"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"},R0;(function(u){u.Strict="strict",u.Loose="loose"})(R0||(R0={}));var an;(function(u){u.Free="free",u.Vertical="vertical",u.Horizontal="horizontal"})(an||(an={}));var gi;(function(u){u.Partial="partial",u.Full="full"})(gi||(gi={}));var y9={inProgress:!1,isValid:null,from:null,fromHandle:null,fromPosition:null,fromNode:null,to:null,toHandle:null,toPosition:null,toNode:null,pointer:null},Nn;(function(u){u.Bezier="default",u.Straight="straight",u.Step="step",u.SmoothStep="smoothstep",u.SimpleBezier="simplebezier"})(Nn||(Nn={}));var x0;(function(u){u.Arrow="arrow",u.ArrowClosed="arrowclosed"})(x0||(x0={}));var Ku;(function(u){u.Left="left",u.Top="top",u.Right="right",u.Bottom="bottom"})(Ku||(Ku={}));var Lq={[Ku.Left]:Ku.Right,[Ku.Right]:Ku.Left,[Ku.Top]:Ku.Bottom,[Ku.Bottom]:Ku.Top};function c9(u){return u===null?null:u?"valid":"invalid"}var _9=(u)=>("id"in u)&&("source"in u)&&("target"in u),pq=(u)=>("id"in u)&&("position"in u)&&!("source"in u)&&!("target"in u),$9=(u)=>("id"in u)&&("internals"in u)&&!("source"in u)&&!("target"in u);var Pc=(u,l=[0,0])=>{let{width:f,height:r}=qn(u),n=u.origin??l,i=f*n[0],t=r*n[1];return{x:u.position.x-i,y:u.position.y-t}},A9=(u,l={nodeOrigin:[0,0]})=>{if(u.length===0)return{x:0,y:0,width:0,height:0};let f=u.reduce((r,n)=>{let i=typeof n==="string",t=!l.nodeLookup&&!i?n:void 0;if(l.nodeLookup)t=i?l.nodeLookup.get(n):!$9(n)?l.nodeLookup.get(n.id):n;let y=t?nA(t,l.nodeOrigin):{x:0,y:0,x2:0,y2:0};return tA(r,y)},{x:1/0,y:1/0,x2:-1/0,y2:-1/0});return yA(f)},Qy=(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=tA(f,nA(n)),r=!0}),r?yA(f):{x:0,y:0,width:0,height:0}},iA=(u,l,[f,r,n]=[0,0,1],i=!1,t=!1)=>{let y={...wy(l,[f,r,n]),width:l.width/n,height:l.height/n},c=[];for(let $ of u.values()){let{measured:A,selectable:j=!0,hidden:F=!1}=$;if(t&&!j||F)continue;let J=A.width??$.width??$.initialWidth??null,Q=A.height??$.height??$.initialHeight??null,W=Ny(y,ai($)),L=(J??0)*(Q??0),U=i&&W>0;if(!$.internals.handleBounds||U||W>=L||$.dragging)c.push($)}return c},Sq=(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 RV(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 Xq({nodes:u,width:l,height:f,panZoom:r,minZoom:n,maxZoom:i},t){if(u.size===0)return Promise.resolve(!0);let y=RV(u,t),c=Qy(y),$=Cc(c,l,f,t?.minZoom??n,t?.maxZoom??i,t?.padding??0.1);return await r.setViewport($,{duration:t?.duration,ease:t?.ease,interpolate:t?.interpolate}),Promise.resolve(!0)}function j9({nodeId:u,nextPosition:l,nodeLookup:f,nodeOrigin:r=[0,0],nodeExtent:n,onError:i}){let t=f.get(u),y=t.parentId?f.get(t.parentId):void 0,{x:c,y:$}=y?y.internals.positionAbsolute:{x:0,y:0},A=t.origin??r,j=t.extent||n;if(t.extent==="parent"&&!t.expandParent)if(!y)i?.("005",Jr.error005());else{let J=y.measured.width,Q=y.measured.height;if(J&&Q)j=[[c,$],[c+J,$+Q]]}else if(y&&Uy(t.extent))j=[[t.extent[0][0]+c,t.extent[0][1]+$],[t.extent[1][0]+c,t.extent[1][1]+$]];let F=Uy(j)?si(l,j,t.measured):l;if(t.measured.width===void 0||t.measured.height===void 0)i?.("015",Jr.error015());return{position:{x:F.x-c+(t.measured.width??0)*A[0],y:F.y-$+(t.measured.height??0)*A[1]},positionAbsolute:F}}async function Yq({nodesToRemove:u=[],edgesToRemove:l=[],nodes:f,edges:r,onBeforeDelete:n}){let i=new Set(u.map((F)=>F.id)),t=[];for(let F of f){if(F.deletable===!1)continue;let J=i.has(F.id),Q=!J&&F.parentId&&t.find((W)=>W.id===F.parentId);if(J||Q)t.push(F)}let y=new Set(l.map((F)=>F.id)),c=r.filter((F)=>F.deletable!==!1),A=Sq(t,c);for(let F of c)if(y.has(F.id)&&!A.find((Q)=>Q.id===F.id))A.push(F);if(!n)return{edges:A,nodes:t};let j=await n({nodes:t,edges:A});if(typeof j==="boolean")return j?{edges:A,nodes:t}:{edges:[],nodes:[]};return j}var Fy=(u,l=0,f=1)=>Math.min(Math.max(u,l),f),si=(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 Pq(u,l,f){let{width:r,height:n}=qn(f),{x:i,y:t}=f.internals.positionAbsolute;return si(u,[[i,t],[i+r,t+n]],l)}var Tq=(u,l,f)=>{if(uf)return-Fy(Math.abs(u-f),1,l)/l;return 0},Cq=(u,l,f=15,r=40)=>{let n=Tq(u.x,r,l.width-r)*f,i=Tq(u.y,r,l.height-r)*f;return[n,i]},tA=(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)}),n9=({x:u,y:l,width:f,height:r})=>({x:u,y:l,x2:u+f,y2:l+r}),yA=({x:u,y:l,x2:f,y2:r})=>({x:u,y:l,width:f-u,height:r-l}),ai=(u,l=[0,0])=>{let{x:f,y:r}=$9(u)?u.internals.positionAbsolute:Pc(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}},nA=(u,l=[0,0])=>{let{x:f,y:r}=$9(u)?u.internals.positionAbsolute:Pc(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)}},F9=(u,l)=>yA(tA(n9(u),n9(l))),Ny=(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)},U9=(u)=>Hr(u.width)&&Hr(u.height)&&Hr(u.x)&&Hr(u.y),Hr=(u)=>!isNaN(u)&&isFinite(u),J9=(u,l)=>{},qy=(u,l=[1,1])=>{return{x:l[0]*Math.round(u.x/l[0]),y:l[1]*Math.round(u.y/l[1])}},wy=({x:u,y:l},[f,r,n],i=!1,t=[1,1])=>{let y={x:(u-f)/n,y:(l-r)/n};return i?qy(y,t):y},Yc=({x:u,y:l},[f,r,n])=>{return{x:u*n+f,y:l*n+r}};function Ay(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 xV(u,l,f){if(typeof u==="string"||typeof u==="number"){let r=Ay(u,f),n=Ay(u,l);return{top:r,right:n,bottom:r,left:n,x:n*2,y:r*2}}if(typeof u==="object"){let r=Ay(u.top??u.y??0,f),n=Ay(u.bottom??u.y??0,f),i=Ay(u.left??u.x??0,l),t=Ay(u.right??u.x??0,l);return{top:r,right:t,bottom:n,left:i,x:i+t,y:r+n}}return{top:0,right:0,bottom:0,left:0,x:0,y:0}}function hV(u,l,f,r,n,i){let{x:t,y}=Yc(u,[l,f,r]),{x:c,y:$}=Yc({x:u.x+u.width,y:u.y+u.height},[l,f,r]),A=n-c,j=i-$;return{left:Math.floor(t),top:Math.floor(y),right:Math.floor(A),bottom:Math.floor(j)}}var Cc=(u,l,f,r,n,i)=>{let t=xV(i,l,f),y=(l-t.x)/u.width,c=(f-t.y)/u.height,$=Math.min(y,c),A=Fy($,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=hV(u,J,Q,A,l,f),L={left:Math.min(W.left-t.left,0),top:Math.min(W.top-t.top,0),right:Math.min(W.right-t.right,0),bottom:Math.min(W.bottom-t.bottom,0)};return{x:J-L.left+L.right,y:Q-L.top+L.bottom,zoom:A}},Wy=()=>typeof navigator<"u"&&navigator?.userAgent?.indexOf("Mac")>=0;function Uy(u){return u!==void 0&&u!==null&&u!=="parent"}function qn(u){return{width:u.measured?.width??u.width??u.initialWidth??0,height:u.measured?.height??u.height??u.initialHeight??0}}function Q9(u){return(u.measured?.width??u.width??u.initialWidth)!==void 0&&(u.measured?.height??u.height??u.initialHeight)!==void 0}function N9(u,l={width:0,height:0},f,r,n){let i={...u},t=r.get(f);if(t){let y=t.origin||n;i.x+=t.internals.positionAbsolute.x-(l.width??0)*y[0],i.y+=t.internals.positionAbsolute.y-(l.height??0)*y[1]}return i}function q9(u,l){if(u.size!==l.size)return!1;for(let f of u)if(!l.has(f))return!1;return!0}function Mq(){let u,l;return{promise:new Promise((r,n)=>{u=r,l=n}),resolve:u,reject:l}}function Rq(u){return{...t9,...u||{}}}function Xc(u,{snapGrid:l=[0,0],snapToGrid:f=!1,transform:r,containerBounds:n}){let{x:i,y:t}=Br(u),y=wy({x:i-(n?.left??0),y:t-(n?.top??0)},r),{x:c,y:$}=f?qy(y,l):y;return{xSnapped:c,ySnapped:$,...y}}var cA=(u)=>({width:u.offsetWidth,height:u.offsetHeight}),w9=(u)=>u?.getRootNode?.()||window?.document,bV=["INPUT","SELECT","TEXTAREA"];function W9(u){let l=u.composedPath?.()?.[0]||u.target;if(l?.nodeType!==1)return!1;return bV.includes(l.nodeName)||l.hasAttribute("contenteditable")||!!l.closest(".nokey")}var L9=(u)=>("clientX"in u),Br=(u,l)=>{let f=L9(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)}},Kq=(u,l,f,r,n)=>{let i=l.querySelectorAll(`.${u}`);if(!i||!i.length)return null;return Array.from(i).map((t)=>{let y=t.getBoundingClientRect();return{id:t.getAttribute("data-handleid"),type:u,nodeId:n,position:t.getAttribute("data-handlepos"),x:(y.left-f.left)/r,y:(y.top-f.top)/r,...cA(t)}})};function _A({sourceX:u,sourceY:l,targetX:f,targetY:r,sourceControlX:n,sourceControlY:i,targetControlX:t,targetControlY:y}){let c=u*0.125+n*0.375+t*0.375+f*0.125,$=l*0.125+i*0.375+y*0.375+r*0.125,A=Math.abs(c-u),j=Math.abs($-l);return[c,$,A,j]}function fA(u,l){if(u>=0)return 0.5*u;return l*25*Math.sqrt(-u)}function Gq({pos:u,x1:l,y1:f,x2:r,y2:n,c:i}){switch(u){case Ku.Left:return[l-fA(l-r,i),f];case Ku.Right:return[l+fA(r-l,i),f];case Ku.Top:return[l,f-fA(f-n,i)];case Ku.Bottom:return[l,f+fA(n-f,i)]}}function $A({sourceX:u,sourceY:l,sourcePosition:f=Ku.Bottom,targetX:r,targetY:n,targetPosition:i=Ku.Top,curvature:t=0.25}){let[y,c]=Gq({pos:f,x1:u,y1:l,x2:r,y2:n,c:t}),[$,A]=Gq({pos:i,x1:r,y1:n,x2:u,y2:l,c:t}),[j,F,J,Q]=_A({sourceX:u,sourceY:l,targetX:r,targetY:n,sourceControlX:y,sourceControlY:c,targetControlX:$,targetControlY:A});return[`M${u},${l} C${y},${c} ${$},${A} ${r},${n}`,j,F,J,Q]}function T9({sourceX:u,sourceY:l,targetX:f,targetY:r}){let n=Math.abs(f-u)/2,i=f0}var vV=({source:u,sourceHandle:l,target:f,targetHandle:r})=>`xy-edge__${u}${l||""}-${f}${r||""}`,kV=(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))},K9=(u,l,f={})=>{if(!u.source||!u.target)return J9("006",Jr.error006()),l;let r=f.getEdgeId||vV,n;if(_9(u))n={...u};else n={...u,id:r(u)};if(kV(n,l))return l;if(n.sourceHandle===null)delete n.sourceHandle;if(n.targetHandle===null)delete n.targetHandle;return l.concat(n)};function AA({sourceX:u,sourceY:l,targetX:f,targetY:r}){let[n,i,t,y]=T9({sourceX:u,sourceY:l,targetX:f,targetY:r});return[`M ${u},${l}L ${f},${r}`,n,i,t,y]}var zq={[Ku.Left]:{x:-1,y:0},[Ku.Right]:{x:1,y:0},[Ku.Top]:{x:0,y:-1},[Ku.Bottom]:{x:0,y:1}},IV=({source:u,sourcePosition:l=Ku.Bottom,target:f})=>{if(l===Ku.Left||l===Ku.Right)return u.xMath.sqrt(Math.pow(l.x-u.x,2)+Math.pow(l.y-u.y,2));function gV({source:u,sourcePosition:l=Ku.Bottom,target:f,targetPosition:r=Ku.Top,center:n,offset:i,stepPosition:t}){let y=zq[l],c=zq[r],$={x:u.x+y.x*i,y:u.y+y.y*i},A={x:f.x+c.x*i,y:f.y+c.y*i},j=IV({source:$,sourcePosition:l,target:A}),F=j.x!==0?"x":"y",J=j[F],Q=[],W,L,U={x:0,y:0},q={x:0,y:0},[,,N,w]=T9({sourceX:u.x,sourceY:u.y,targetX:f.x,targetY:f.y});if(y[F]*c[F]===-1){if(F==="x")W=n.x??$.x+(A.x-$.x)*t,L=n.y??($.y+A.y)/2;else W=n.x??($.x+A.x)/2,L=n.y??$.y+(A.y-$.y)*t;let E=[{x:W,y:$.y},{x:W,y:A.y}],m=[{x:$.x,y:L},{x:A.x,y:L}];if(y[F]===J)Q=F==="x"?E:m;else Q=F==="x"?m:E}else{let E=[{x:$.x,y:A.y}],m=[{x:A.x,y:$.y}];if(F==="x")Q=y.x===J?m:E;else Q=y.y===J?E:m;if(l===r){let O=Math.abs(u[F]-f[F]);if(O<=i){let Y=Math.min(i-1,i-O);if(y[F]===J)U[F]=($[F]>u[F]?-1:1)*Y;else q[F]=(A[F]>f[F]?-1:1)*Y}}if(l!==r){let O=F==="x"?"y":"x",Y=y[F]===c[O],p=$[O]>A[O],v=$[O]=X)W=(S.x+B.x)/2,L=Q[0].y;else W=Q[0].x,L=(S.y+B.y)/2}let G={x:$.x+U.x,y:$.y+U.y},Z={x:A.x+q.x,y:A.y+q.y};return[[u,...G.x!==Q[0].x||G.y!==Q[0].y?[G]:[],...Q,...Z.x!==Q[Q.length-1].x||Z.y!==Q[Q.length-1].y?[Z]:[],f],W,L,N,w]}function sV(u,l,f,r){let n=Math.min(Eq(u,l)/2,Eq(l,f)/2,r),{x:i,y:t}=l;if(u.x===i&&i===f.x||u.y===t&&t===f.y)return`L${i} ${t}`;if(u.y===t){let $=u.xf.id===l))||null}function jA(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 vq(u,{id:l,defaultColor:f,defaultMarkerStart:r,defaultMarkerEnd:n}){let i=new Set;return u.reduce((t,y)=>{return[y.markerStart||r,y.markerEnd||n].forEach((c)=>{if(c&&typeof c==="object"){let $=jA(c,l);if(!i.has($))t.push({id:$,color:c.color||f,...c}),i.add($)}}),t},[]).sort((t,y)=>t.id.localeCompare(y.id))}var kq=1000,aV=10,G9={nodeOrigin:[0,0],nodeExtent:Jy,elevateNodesOnSelect:!0,zIndexMode:"basic",defaults:{}},oV={...G9,checkEquality:!0};function z9(u,l){let f={...u};for(let r in l)if(l[r]!==void 0)f[r]=l[r];return f}function Iq(u,l,f){let r=z9(G9,f);for(let n of u.values())if(n.parentId)O9(n,u,l,r);else{let i=Pc(n,r.nodeOrigin),t=Uy(n.extent)?n.extent:r.nodeExtent,y=si(i,t,qn(n));n.internals.positionAbsolute=y}}function dV(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 E9(u){return u==="manual"}function FA(u,l,f,r={}){let n=z9(oV,r),i={i:0},t=new Map(l),y=n?.elevateNodesOnSelect&&!E9(n.zIndexMode)?kq:0,c=u.length>0,$=!1;l.clear(),f.clear();for(let A of u){let j=t.get(A.id);if(n.checkEquality&&A===j?.internals.userNode)l.set(A.id,j);else{let F=Pc(A,n.nodeOrigin),J=Uy(A.extent)?A.extent:n.nodeExtent,Q=si(F,J,qn(A));j={...n.defaults,...A,measured:{width:A.measured?.width,height:A.measured?.height},internals:{positionAbsolute:Q,handleBounds:dV(A,j),z:gq(A,y,n.zIndexMode),userNode:A}},l.set(A.id,j)}if((j.measured===void 0||j.measured.width===void 0||j.measured.height===void 0)&&!j.hidden)c=!1;if(A.parentId)O9(j,l,f,r,i);$||=A.selected??!1}return{nodesInitialized:c,hasSelectedNodes:$}}function eV(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 O9(u,l,f,r,n){let{elevateNodesOnSelect:i,nodeOrigin:t,nodeExtent:y,zIndexMode:c}=z9(G9,r),$=u.parentId,A=l.get($);if(!A){console.warn(`Parent node ${$} not found. Please make sure that parent nodes are in front of their child nodes in the nodes array.`);return}if(eV(u,f),n&&!A.parentId&&A.internals.rootParentIndex===void 0&&c==="auto")A.internals.rootParentIndex=++n.i,A.internals.z=A.internals.z+n.i*aV;if(n&&A.internals.rootParentIndex!==void 0)n.i=A.internals.rootParentIndex;let j=i&&!E9(c)?kq:0,{x:F,y:J,z:Q}=um(u,A,t,y,j,c),{positionAbsolute:W}=u.internals,L=F!==W.x||J!==W.y;if(L||Q!==u.internals.z)l.set(u.id,{...u,internals:{...u.internals,positionAbsolute:L?{x:F,y:J}:W,z:Q}})}function gq(u,l,f){let r=Hr(u.zIndex)?u.zIndex:0;if(E9(f))return r;return r+(u.selected?l:0)}function um(u,l,f,r,n,i){let{x:t,y}=l.internals.positionAbsolute,c=qn(u),$=Pc(u,f),A=Uy(u.extent)?si($,u.extent,c):$,j=si({x:t+A.x,y:y+A.y},r,c);if(u.extent==="parent")j=Pq(j,c,l);let F=gq(u,n,i),J=l.internals.z??0;return{x:j.x,y:j.y,z:J>=F?J+1:F}}function UA(u,l,f,r=[0,0]){let n=[],i=new Map;for(let t of u){let y=l.get(t.parentId);if(!y)continue;let c=i.get(t.parentId)?.expandedRect??ai(y),$=F9(c,t.rect);i.set(t.parentId,{expandedRect:$,parent:y})}if(i.size>0)i.forEach(({expandedRect:t,parent:y},c)=>{let $=y.internals.positionAbsolute,A=qn(y),j=y.origin??r,F=t.x<$.x?Math.round(Math.abs($.x-t.x)):0,J=t.y<$.y?Math.round(Math.abs($.y-t.y)):0,Q=Math.max(A.width,Math.round(t.width)),W=Math.max(A.height,Math.round(t.height)),L=(Q-A.width)*j[0],U=(W-A.height)*j[1];if(F>0||J>0||L||U)n.push({id:c,type:"position",position:{x:y.position.x-F+L,y:y.position.y-J+U}}),f.get(c)?.forEach((q)=>{if(!u.some((N)=>N.id===q.id))n.push({id:q.id,type:"position",position:{x:q.position.x+F,y:q.position.y+J}})});if(A.width0){let J=UA(F,l,f,n);$.push(...J)}return{changes:$,updatedInternals:c}}async function aq({delta:u,panZoom:l,transform:f,translateExtent:r,width:n,height:i}){if(!l||!u.x&&!u.y)return Promise.resolve(!1);let t=await l.setViewportConstrained({x:f[0]+u.x,y:f[1]+u.y,zoom:f[2]},[[0,0],[n,i]],r),y=!!t&&(t.x!==f[0]||t.y!==f[1]||t.k!==f[2]);return Promise.resolve(y)}function Bq(u,l,f,r,n,i){let t=n,y=r.get(t)||new Map;r.set(t,y.set(f,l)),t=`${n}-${u}`;let c=r.get(t)||new Map;if(r.set(t,c.set(f,l)),i){t=`${n}-${u}-${i}`;let $=r.get(t)||new Map;r.set(t,$.set(f,l))}}function Z9(u,l,f){u.clear(),l.clear();for(let r of f){let{source:n,target:i,sourceHandle:t=null,targetHandle:y=null}=r,c={edgeId:r.id,source:n,target:i,sourceHandle:t,targetHandle:y},$=`${n}-${t}--${i}-${y}`,A=`${i}-${y}--${n}-${t}`;Bq("source",c,A,u,n,t),Bq("target",c,$,u,i,y),l.set(r.id,r)}}function oq(u,l){if(!u.parentId)return!1;let f=l.get(u.parentId);if(!f)return!1;if(f.selected)return!0;return oq(f,l)}function Vq(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 lm(u,l,f,r){let n=new Map;for(let[i,t]of u)if((t.selected||t.id===r)&&(!t.parentId||!oq(t,u))&&(t.draggable||l&&typeof t.draggable>"u")){let y=u.get(i);if(y)n.set(i,{id:i,position:y.position||{x:0,y:0},distance:{x:f.x-y.internals.positionAbsolute.x,y:f.y-y.internals.positionAbsolute.y},extent:y.extent,parentId:y.parentId,origin:y.origin,expandParent:y.expandParent,internals:{positionAbsolute:y.internals.positionAbsolute||{x:0,y:0}},measured:{width:y.measured.width??0,height:y.measured.height??0}})}return n}function l9({nodeId:u,dragItems:l,nodeLookup:f,dragging:r=!0}){let n=[];for(let[t,y]of l){let c=f.get(t)?.internals.userNode;if(c)n.push({...c,position:y.position,dragging:r})}if(!u)return[n[0],n];let i=f.get(u)?.internals.userNode;return[!i?n[0]:{...i,position:l.get(u)?.position||i.position,dragging:r},n]}function fm({dragItems:u,snapGrid:l,x:f,y:r}){let n=u.values().next().value;if(!n)return null;let i={x:f-n.distance.x,y:r-n.distance.y},t=qy(i,l);return{x:t.x-i.x,y:t.y-i.y}}function dq({onNodeMouseDown:u,getStoreItems:l,onDragStart:f,onDrag:r,onDragStop:n}){let i={x:null,y:null},t=0,y=new Map,c=!1,$={x:0,y:0},A=null,j=!1,F=null,J=!1,Q=!1,W=null;function L({noDragClassName:q,handleSelector:N,domNode:w,isSelectable:G,nodeId:Z,nodeClickDistance:H=0}){F=ff(w);function E({x:D,y:X}){let{nodeLookup:O,nodeExtent:Y,snapGrid:p,snapToGrid:v,nodeOrigin:z,onNodeDrag:P,onSelectionDrag:k,onError:I,updateNodePositions:b}=l();i={x:D,y:X};let d=!1,s=y.size>1,h=s&&Y?n9(Qy(y)):null,lu=s&&v?fm({dragItems:y,snapGrid:p,x:D,y:X}):null;for(let[cu,_u]of y){if(!O.has(cu))continue;let Fu={x:D-_u.distance.x,y:X-_u.distance.y};if(v)Fu=lu?{x:Math.round(Fu.x+lu.x),y:Math.round(Fu.y+lu.y)}:qy(Fu,p);let zu=null;if(s&&Y&&!_u.extent&&h){let{positionAbsolute:e}=_u.internals,uu=e.x-h.x+Y[0][0],Gu=e.x+_u.measured.width-h.x2+Y[1][0],a=e.y-h.y+Y[0][1],qu=e.y+_u.measured.height-h.y2+Y[1][1];zu=[[uu,a],[Gu,qu]]}let{position:Wu,positionAbsolute:C}=j9({nodeId:cu,nextPosition:Fu,nodeLookup:O,nodeExtent:zu?zu:Y,nodeOrigin:z,onError:I});d=d||_u.position.x!==Wu.x||_u.position.y!==Wu.y,_u.position=Wu,_u.internals.positionAbsolute=C}if(Q=Q||d,!d)return;if(b(y,!0),W&&(r||P||!Z&&k)){let[cu,_u]=l9({nodeId:Z,dragItems:y,nodeLookup:O});if(r?.(W,y,cu,_u),P?.(W,cu,_u),!Z)k?.(W,_u)}}async function m(){if(!A)return;let{transform:D,panBy:X,autoPanSpeed:O,autoPanOnNodeDrag:Y}=l();if(!Y){c=!1,cancelAnimationFrame(t);return}let[p,v]=Cq($,A,O);if(p!==0||v!==0){if(i.x=(i.x??0)-p/D[2],i.y=(i.y??0)-v/D[2],await X({x:p,y:v}))E(i)}t=requestAnimationFrame(m)}function S(D){let{nodeLookup:X,multiSelectionActive:O,nodesDraggable:Y,transform:p,snapGrid:v,snapToGrid:z,selectNodesOnDrag:P,onNodeDragStart:k,onSelectionDragStart:I,unselectNodesAndEdges:b}=l();if(j=!0,(!P||!G)&&!O&&Z){if(!X.get(Z)?.selected)b()}if(G&&P&&Z)u?.(Z);let d=Xc(D.sourceEvent,{transform:p,snapGrid:v,snapToGrid:z,containerBounds:A});if(i=d,y=lm(X,Y,d,Z),y.size>0&&(f||k||!Z&&I)){let[s,h]=l9({nodeId:Z,dragItems:y,nodeLookup:X});if(f?.(D.sourceEvent,y,s,h),k?.(D.sourceEvent,s,h),!Z)I?.(D.sourceEvent,h)}}let B=Nc().clickDistance(H).on("start",(D)=>{let{domNode:X,nodeDragThreshold:O,transform:Y,snapGrid:p,snapToGrid:v}=l();if(A=X?.getBoundingClientRect()||null,J=!1,Q=!1,W=D.sourceEvent,O===0)S(D);i=Xc(D.sourceEvent,{transform:Y,snapGrid:p,snapToGrid:v,containerBounds:A}),$=Br(D.sourceEvent,A)}).on("drag",(D)=>{let{autoPanOnNodeDrag:X,transform:O,snapGrid:Y,snapToGrid:p,nodeDragThreshold:v,nodeLookup:z}=l(),P=Xc(D.sourceEvent,{transform:O,snapGrid:Y,snapToGrid:p,containerBounds:A});if(W=D.sourceEvent,D.sourceEvent.type==="touchmove"&&D.sourceEvent.touches.length>1||Z&&!z.has(Z))J=!0;if(J)return;if(!c&&X&&j)c=!0,m();if(!j){let k=Br(D.sourceEvent,A),I=k.x-$.x,b=k.y-$.y;if(Math.sqrt(I*I+b*b)>v)S(D)}if((i.x!==P.xSnapped||i.y!==P.ySnapped)&&y&&j)$=Br(D.sourceEvent,A),E(P)}).on("end",(D)=>{if(!j||J)return;if(c=!1,j=!1,cancelAnimationFrame(t),y.size>0){let{nodeLookup:X,updateNodePositions:O,onNodeDragStop:Y,onSelectionDragStop:p}=l();if(Q)O(y,!1),Q=!1;if(n||Y||!Z&&p){let[v,z]=l9({nodeId:Z,dragItems:y,nodeLookup:X,dragging:!1});if(n?.(D.sourceEvent,y,v,z),Y?.(D.sourceEvent,v,z),!Z)p?.(D.sourceEvent,z)}}}).filter((D)=>{let X=D.target;return!D.button&&(!q||!Vq(X,`.${q}`,w))&&(!N||Vq(X,N,w))});F.call(B)}function U(){F?.on(".drag",null)}return{update:L,destroy:U}}function rm(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(Ny(n,ai(i))>0)r.push(i);return r}var nm=250;function im(u,l,f,r){let n=[],i=1/0,t=rm(u,f,l+nm);for(let y of t){let c=[...y.internals.handleBounds?.source??[],...y.internals.handleBounds?.target??[]];for(let $ of c){if(r.nodeId===$.nodeId&&r.type===$.type&&r.id===$.id)continue;let{x:A,y:j}=h0(y,$,$.position,!0),F=Math.sqrt(Math.pow(A-u.x,2)+Math.pow(j-u.y,2));if(F>l)continue;if(F1){let y=r.type==="source"?"target":"source";return n.find((c)=>c.type===y)??n[0]}return n[0]}function eq(u,l,f,r,n,i=!1){let t=r.get(u);if(!t)return null;let y=n==="strict"?t.internals.handleBounds?.[l]:[...t.internals.handleBounds?.source??[],...t.internals.handleBounds?.target??[]],c=(f?y?.find(($)=>$.id===f):y?.[0])??null;return c&&i?{...c,...h0(t,c,c.position,!0)}:c}function uw(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 tm(u,l){let f=null;if(l)f=!0;else if(u&&!l)f=!1;return f}var lw=()=>!0;function ym(u,{connectionMode:l,connectionRadius:f,handleId:r,nodeId:n,edgeUpdaterType:i,isTarget:t,domNode:y,nodeLookup:c,lib:$,autoPanOnConnect:A,flowId:j,panBy:F,cancelConnection:J,onConnectStart:Q,onConnect:W,onConnectEnd:L,isValidConnection:U=lw,onReconnectEnd:q,updateConnection:N,getTransform:w,getFromHandle:G,autoPanSpeed:Z,dragThreshold:H=1,handleDomNode:E}){let m=w9(u.target),S=0,B,{x:D,y:X}=Br(u),O=uw(i,E),Y=y?.getBoundingClientRect(),p=!1;if(!Y||!O)return;let v=eq(n,O,r,c,l);if(!v)return;let z=Br(u,Y),P=!1,k=null,I=!1,b=null;function d(){if(!A||!Y)return;let[Wu,C]=Cq(z,Y,Z);F({x:Wu,y:C}),S=requestAnimationFrame(d)}let s={...v,nodeId:n,type:O,position:v.position},h=c.get(n),cu={inProgress:!0,isValid:null,from:h0(h,s,Ku.Left,!0),fromHandle:s,fromPosition:s.position,fromNode:h,to:z,toHandle:null,toPosition:Lq[s.position],toNode:null,pointer:z};function _u(){p=!0,N(cu),Q?.(u,{nodeId:n,handleId:r,handleType:O})}if(H===0)_u();function Fu(Wu){if(!p){let{x:qu,y:Zu}=Br(Wu),Bu=qu-D,gu=Zu-X;if(!(Bu*Bu+gu*gu>H*H))return;_u()}if(!G()||!s){zu(Wu);return}let C=w();if(z=Br(Wu,Y),B=im(wy(z,C,!1,[1,1]),f,c,s),!P)d(),P=!0;let e=fw(Wu,{handle:B,connectionMode:l,fromNodeId:n,fromHandleId:r,fromType:t?"target":"source",isValidConnection:U,doc:m,lib:$,flowId:j,nodeLookup:c});b=e.handleDomNode,k=e.connection,I=tm(!!B,e.isValid);let uu=c.get(n),Gu=uu?h0(uu,s,Ku.Left,!0):cu.from,a={...cu,from:Gu,isValid:I,to:e.toHandle&&I?Yc({x:e.toHandle.x,y:e.toHandle.y},C):z,toHandle:e.toHandle,toPosition:I&&e.toHandle?e.toHandle.position:Lq[s.position],toNode:e.toHandle?c.get(e.toHandle.nodeId):null,pointer:z};N(a),cu=a}function zu(Wu){if("touches"in Wu&&Wu.touches.length>0)return;if(p){if((B||b)&&k&&I)W?.(k);let{inProgress:C,...e}=cu,uu={...e,toPosition:cu.toHandle?cu.toPosition:null};if(L?.(Wu,uu),i)q?.(Wu,uu)}J(),cancelAnimationFrame(S),P=!1,I=!1,k=null,b=null,m.removeEventListener("mousemove",Fu),m.removeEventListener("mouseup",zu),m.removeEventListener("touchmove",Fu),m.removeEventListener("touchend",zu)}m.addEventListener("mousemove",Fu),m.addEventListener("mouseup",zu),m.addEventListener("touchmove",Fu),m.addEventListener("touchend",zu)}function fw(u,{handle:l,connectionMode:f,fromNodeId:r,fromHandleId:n,fromType:i,doc:t,lib:y,flowId:c,isValidConnection:$=lw,nodeLookup:A}){let j=i==="target",F=l?t.querySelector(`.${y}-flow__handle[data-id="${c}-${l?.nodeId}-${l?.id}-${l?.type}"]`):null,{x:J,y:Q}=Br(u),W=t.elementFromPoint(J,Q),L=W?.classList.contains(`${y}-flow__handle`)?W:F,U={handleDomNode:L,isValid:!1,connection:null,toHandle:null};if(L){let q=uw(void 0,L),N=L.getAttribute("data-nodeid"),w=L.getAttribute("data-handleid"),G=L.classList.contains("connectable"),Z=L.classList.contains("connectableend");if(!N||!q)return U;let H={source:j?N:r,sourceHandle:j?w:n,target:j?r:N,targetHandle:j?n:w};U.connection=H;let m=G&&Z&&(f===R0.Strict?j&&q==="source"||!j&&q==="target":N!==r||w!==n);U.isValid=m&&$(H),U.toHandle=eq(N,q,w,A,f,!0)}return U}var JA={onPointerDown:ym,isValid:fw};function rw({domNode:u,panZoom:l,getTransform:f,getViewScale:r}){let n=ff(u);function i({translateExtent:y,width:c,height:$,zoomStep:A=1,pannable:j=!0,zoomable:F=!0,inversePan:J=!1}){let Q=(N)=>{if(N.sourceEvent.type!=="wheel"||!l)return;let w=f(),G=N.sourceEvent.ctrlKey&&Wy()?10:1,Z=-N.sourceEvent.deltaY*(N.sourceEvent.deltaMode===1?0.05:N.sourceEvent.deltaMode?1:0.002)*A,H=w[2]*Math.pow(2,Z*G);l.scaleTo(H)},W=[0,0],L=(N)=>{if(N.sourceEvent.type==="mousedown"||N.sourceEvent.type==="touchstart")W=[N.sourceEvent.clientX??N.sourceEvent.touches[0].clientX,N.sourceEvent.clientY??N.sourceEvent.touches[0].clientY]},U=(N)=>{let w=f();if(N.sourceEvent.type!=="mousemove"&&N.sourceEvent.type!=="touchmove"||!l)return;let G=[N.sourceEvent.clientX??N.sourceEvent.touches[0].clientX,N.sourceEvent.clientY??N.sourceEvent.touches[0].clientY],Z=[G[0]-W[0],G[1]-W[1]];W=G;let H=r()*Math.max(w[2],Math.log(w[2]))*(J?-1:1),E={x:w[0]-Z[0]*H,y:w[1]-Z[1]*H},m=[[0,0],[c,$]];l.setViewportConstrained({x:E.x,y:E.y,zoom:w[2]},m,y)},q=Sc().on("start",L).on("zoom",j?U:null).on("zoom.wheel",F?Q:null);n.call(q,{})}function t(){n.on("zoom",null)}return{update:i,destroy:t,pointer:zf}}var QA=(u)=>({x:u.x,y:u.y,zoom:u.k}),f9=({x:u,y:l,zoom:f})=>ki.translate(u,l).scale(f),jy=(u,l)=>u.target.closest(`.${l}`),nw=(u,l)=>l===2&&Array.isArray(u)&&u.includes(2),cm=(u)=>((u*=2)<=1?u*u*u:(u-=2)*u*u+2)/2,r9=(u,l=0,f=cm,r=()=>{})=>{let n=typeof l==="number"&&l>0;if(!n)r();return n?u.transition().duration(l).ease(f).on("end",r):u},iw=(u)=>{let l=u.ctrlKey&&Wy()?10:1;return-u.deltaY*(u.deltaMode===1?0.05:u.deltaMode?1:0.002)*l};function _m({zoomPanValues:u,noWheelClassName:l,d3Selection:f,d3Zoom:r,panOnScrollMode:n,panOnScrollSpeed:i,zoomOnPinch:t,onPanZoomStart:y,onPanZoom:c,onPanZoomEnd:$}){return(A)=>{if(jy(A,l)){if(A.ctrlKey)A.preventDefault();return!1}A.preventDefault(),A.stopImmediatePropagation();let j=f.property("__zoom").k||1;if(A.ctrlKey&&t){let L=zf(A),U=iw(A),q=j*Math.pow(2,U);r.scaleTo(f,q,L,A);return}let F=A.deltaMode===1?20:1,J=n===an.Vertical?0:A.deltaX*F,Q=n===an.Horizontal?0:A.deltaY*F;if(!Wy()&&A.shiftKey&&n!==an.Vertical)J=A.deltaY*F,Q=0;r.translateBy(f,-(J/j)*i,-(Q/j)*i,{internal:!0});let W=QA(f.property("__zoom"));if(clearTimeout(u.panScrollTimeout),!u.isPanScrolling)u.isPanScrolling=!0,y?.(A,W);else c?.(A,W),u.panScrollTimeout=setTimeout(()=>{$?.(A,W),u.isPanScrolling=!1},150)}}function $m({noWheelClassName:u,preventScrolling:l,d3ZoomHandler:f}){return function(r,n){let i=r.type==="wheel",t=!l&&i&&!r.ctrlKey,y=jy(r,u);if(r.ctrlKey&&i&&y)r.preventDefault();if(t||y)return null;r.preventDefault(),f.call(this,r,n)}}function Am({zoomPanValues:u,onDraggingChange:l,onPanZoomStart:f}){return(r)=>{if(r.sourceEvent?.internal)return;let n=QA(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 jm({zoomPanValues:u,panOnDrag:l,onPaneContextMenu:f,onTransformChange:r,onPanZoom:n}){return(i)=>{if(u.usedRightMouseButton=!!(f&&nw(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,QA(i.transform))}}function Fm({zoomPanValues:u,panOnDrag:l,panOnScroll:f,onDraggingChange:r,onPanZoomEnd:n,onPaneContextMenu:i}){return(t)=>{if(t.sourceEvent?.internal)return;if(u.isZoomingOrPanning=!1,i&&nw(l,u.mouseButton??0)&&!u.usedRightMouseButton&&t.sourceEvent)i(t.sourceEvent);if(u.usedRightMouseButton=!1,r(!1),n){let y=QA(t.transform);u.prevViewport=y,clearTimeout(u.timerId),u.timerId=setTimeout(()=>{n?.(t.sourceEvent,y)},f?150:0)}}}function Um({zoomActivationKeyPressed:u,zoomOnScroll:l,zoomOnPinch:f,panOnDrag:r,panOnScroll:n,zoomOnDoubleClick:i,userSelectionActive:t,noWheelClassName:y,noPanClassName:c,lib:$,connectionInProgress:A}){return(j)=>{let F=u||l,J=f&&j.ctrlKey,Q=j.type==="wheel";if(j.button===1&&j.type==="mousedown"&&(jy(j,`${$}-flow__node`)||jy(j,`${$}-flow__edge`)))return!0;if(!r&&!F&&!n&&!i&&!f)return!1;if(t)return!1;if(A&&!Q)return!1;if(jy(j,y)&&Q)return!1;if(jy(j,c)&&(!Q||n&&Q&&!u))return!1;if(!f&&j.ctrlKey&&Q)return!1;if(!f&&j.type==="touchstart"&&j.touches?.length>1)return j.preventDefault(),!1;if(!F&&!n&&!J&&Q)return!1;if(!r&&(j.type==="mousedown"||j.type==="touchstart"))return!1;if(Array.isArray(r)&&!r.includes(j.button)&&j.type==="mousedown")return!1;let W=Array.isArray(r)&&r.includes(j.button)||!j.button||j.button<=1;return(!j.ctrlKey||Q)&&W}}function tw({domNode:u,minZoom:l,maxZoom:f,translateExtent:r,viewport:n,onPanZoom:i,onPanZoomStart:t,onPanZoomEnd:y,onDraggingChange:c}){let $={isZoomingOrPanning:!1,usedRightMouseButton:!1,prevViewport:{x:0,y:0,zoom:0},mouseButton:0,timerId:void 0,panScrollTimeout:void 0,isPanScrolling:!1},A=u.getBoundingClientRect(),j=Sc().scaleExtent([l,f]).translateExtent(r),F=ff(u).call(j);q({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(iw);function W(B,D){if(F)return new Promise((X)=>{j?.interpolate(D?.interpolate==="linear"?Qn:bi).transform(r9(F,D?.duration,D?.ease,()=>X(!0)),B)});return Promise.resolve(!1)}function L({noWheelClassName:B,noPanClassName:D,onPaneContextMenu:X,userSelectionActive:O,panOnScroll:Y,panOnDrag:p,panOnScrollMode:v,panOnScrollSpeed:z,preventScrolling:P,zoomOnPinch:k,zoomOnScroll:I,zoomOnDoubleClick:b,zoomActivationKeyPressed:d,lib:s,onTransformChange:h,connectionInProgress:lu,paneClickDistance:cu,selectionOnDrag:_u}){if(O&&!$.isZoomingOrPanning)U();let Fu=Y&&!d&&!O;j.clickDistance(_u?1/0:!Hr(cu)||cu<0?0:cu);let zu=Fu?_m({zoomPanValues:$,noWheelClassName:B,d3Selection:F,d3Zoom:j,panOnScrollMode:v,panOnScrollSpeed:z,zoomOnPinch:k,onPanZoomStart:t,onPanZoom:i,onPanZoomEnd:y}):$m({noWheelClassName:B,preventScrolling:P,d3ZoomHandler:J});if(F.on("wheel.zoom",zu,{passive:!1}),!O){let C=Am({zoomPanValues:$,onDraggingChange:c,onPanZoomStart:t});j.on("start",C);let e=jm({zoomPanValues:$,panOnDrag:p,onPaneContextMenu:!!X,onPanZoom:i,onTransformChange:h});j.on("zoom",e);let uu=Fm({zoomPanValues:$,panOnDrag:p,panOnScroll:Y,onPaneContextMenu:X,onPanZoomEnd:y,onDraggingChange:c});j.on("end",uu)}let Wu=Um({zoomActivationKeyPressed:d,panOnDrag:p,zoomOnScroll:I,panOnScroll:Y,zoomOnDoubleClick:b,zoomOnPinch:k,userSelectionActive:O,noPanClassName:D,noWheelClassName:B,lib:s,connectionInProgress:lu});if(j.filter(Wu),b)F.on("dblclick.zoom",Q);else F.on("dblclick.zoom",null)}function U(){j.on("zoom",null)}async function q(B,D,X){let O=f9(B),Y=j?.constrain()(O,D,X);if(Y)await W(Y);return new Promise((p)=>p(Y))}async function N(B,D){let X=f9(B);return await W(X,D),new Promise((O)=>O(X))}function w(B){if(F){let D=f9(B),X=F.property("__zoom");if(X.k!==B.zoom||X.x!==B.x||X.y!==B.y)j?.transform(F,D,null,{sync:!0})}}function G(){let B=F?pc(F.node()):{x:0,y:0,k:1};return{x:B.x,y:B.y,zoom:B.k}}function Z(B,D){if(F)return new Promise((X)=>{j?.interpolate(D?.interpolate==="linear"?Qn:bi).scaleTo(r9(F,D?.duration,D?.ease,()=>X(!0)),B)});return Promise.resolve(!1)}function H(B,D){if(F)return new Promise((X)=>{j?.interpolate(D?.interpolate==="linear"?Qn:bi).scaleBy(r9(F,D?.duration,D?.ease,()=>X(!0)),B)});return Promise.resolve(!1)}function E(B){j?.scaleExtent(B)}function m(B){j?.translateExtent(B)}function S(B){let D=!Hr(B)||B<0?0:B;j?.clickDistance(D)}return{update:L,destroy:U,setViewport:N,setViewportConstrained:q,getViewport:G,scaleTo:Z,scaleBy:H,setScaleExtent:E,setTranslateExtent:m,syncViewport:w,setClickDistance:S}}var b0;(function(u){u.Line="line",u.Handle="handle"})(b0||(b0={}));function Jm({width:u,prevWidth:l,height:f,prevHeight:r,affectsX:n,affectsY:i}){let t=u-l,y=f-r,c=[t>0?1:t<0?-1:0,y>0?1:y<0?-1:0];if(t&&n)c[0]=c[0]*-1;if(y&&i)c[1]=c[1]*-1;return c}function mq(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 C0(u,l){return Math.max(0,l-u)}function M0(u,l){return Math.max(0,u-l)}function rA(u,l,f){return Math.max(0,l-u,u-f)}function Dq(u,l){return u?!l:l}function Qm(u,l,f,r,n,i,t,y){let{affectsX:c,affectsY:$}=l,{isHorizontal:A,isVertical:j}=l,F=A&&j,{xSnapped:J,ySnapped:Q}=f,{minWidth:W,maxWidth:L,minHeight:U,maxHeight:q}=r,{x:N,y:w,width:G,height:Z,aspectRatio:H}=u,E=Math.floor(A?J-u.pointerX:0),m=Math.floor(j?Q-u.pointerY:0),S=G+(c?-E:E),B=Z+($?-m:m),D=-i[0]*G,X=-i[1]*Z,O=rA(S,W,L),Y=rA(B,U,q);if(t){let z=0,P=0;if(c&&E<0)z=C0(N+E+D,t[0][0]);else if(!c&&E>0)z=M0(N+S+D,t[1][0]);if($&&m<0)P=C0(w+m+X,t[0][1]);else if(!$&&m>0)P=M0(w+B+X,t[1][1]);O=Math.max(O,z),Y=Math.max(Y,P)}if(y){let z=0,P=0;if(c&&E>0)z=M0(N+E,y[0][0]);else if(!c&&E<0)z=C0(N+S,y[1][0]);if($&&m>0)P=M0(w+m,y[0][1]);else if(!$&&m<0)P=C0(w+B,y[1][1]);O=Math.max(O,z),Y=Math.max(Y,P)}if(n){if(A){let z=rA(S/H,U,q)*H;if(O=Math.max(O,z),t){let P=0;if(!c&&!$||c&&!$&&F)P=M0(w+X+S/H,t[1][1])*H;else P=C0(w+X+(c?E:-E)/H,t[0][1])*H;O=Math.max(O,P)}if(y){let P=0;if(!c&&!$||c&&!$&&F)P=C0(w+S/H,y[1][1])*H;else P=M0(w+(c?E:-E)/H,y[0][1])*H;O=Math.max(O,P)}}if(j){let z=rA(B*H,W,L)/H;if(Y=Math.max(Y,z),t){let P=0;if(!c&&!$||$&&!c&&F)P=M0(N+B*H+D,t[1][0])/H;else P=C0(N+($?m:-m)*H+D,t[0][0])/H;Y=Math.max(Y,P)}if(y){let P=0;if(!c&&!$||$&&!c&&F)P=C0(N+B*H,y[1][0])/H;else P=M0(N+($?m:-m)*H,y[0][0])/H;Y=Math.max(Y,P)}}}if(m=m+(m<0?Y:-Y),E=E+(E<0?O:-O),n)if(F)if(S>B*H)m=(Dq(c,$)?-E:E)/H;else E=(Dq(c,$)?-m:m)*H;else if(A)m=E/H,$=c;else E=m*H,c=$;let p=c?N+E:N,v=$?w+m:w;return{width:G+(c?-E:E),height:Z+($?-m:m),x:i[0]*E*(!c?1:-1)+p,y:i[1]*m*(!$?1:-1)+v}}var yw={width:0,height:0,x:0,y:0},Nm={...yw,pointerX:0,pointerY:0,aspectRatio:1};function qm(u){return[[0,0],[u.measured.width,u.measured.height]]}function wm(u,l,f){let r=l.position.x+u.position.x,n=l.position.y+u.position.y,i=u.measured.width??0,t=u.measured.height??0,y=f[0]*i,c=f[1]*t;return[[r-y,n-c],[r+i-y,n+t-c]]}function cw({domNode:u,nodeId:l,getStoreItems:f,onChange:r,onEnd:n}){let i=ff(u),t={controlDirection:mq("bottom-right"),boundaries:{minWidth:0,minHeight:0,maxWidth:Number.MAX_VALUE,maxHeight:Number.MAX_VALUE},resizeDirection:void 0,keepAspectRatio:!1};function y({controlPosition:$,boundaries:A,keepAspectRatio:j,resizeDirection:F,onResizeStart:J,onResize:Q,onResizeEnd:W,shouldResize:L}){let U={...yw},q={...Nm};t={boundaries:A,resizeDirection:F,keepAspectRatio:j,controlDirection:mq($)};let N=void 0,w=null,G=[],Z=void 0,H=void 0,E=void 0,m=!1,S=Nc().on("start",(B)=>{let{nodeLookup:D,transform:X,snapGrid:O,snapToGrid:Y,nodeOrigin:p,paneDomNode:v}=f();if(N=D.get(l),!N)return;w=v?.getBoundingClientRect()??null;let{xSnapped:z,ySnapped:P}=Xc(B.sourceEvent,{transform:X,snapGrid:O,snapToGrid:Y,containerBounds:w});if(U={width:N.measured.width??0,height:N.measured.height??0,x:N.position.x??0,y:N.position.y??0},q={...U,pointerX:z,pointerY:P,aspectRatio:U.width/U.height},Z=void 0,N.parentId&&(N.extent==="parent"||N.expandParent))Z=D.get(N.parentId),H=Z&&N.extent==="parent"?qm(Z):void 0;G=[],E=void 0;for(let[k,I]of D)if(I.parentId===l){if(G.push({id:k,position:{...I.position},extent:I.extent}),I.extent==="parent"||I.expandParent){let b=wm(I,N,I.origin??p);if(E)E=[[Math.min(b[0][0],E[0][0]),Math.min(b[0][1],E[0][1])],[Math.max(b[1][0],E[1][0]),Math.max(b[1][1],E[1][1])]];else E=b}}J?.(B,{...U})}).on("drag",(B)=>{let{transform:D,snapGrid:X,snapToGrid:O,nodeOrigin:Y}=f(),p=Xc(B.sourceEvent,{transform:D,snapGrid:X,snapToGrid:O,containerBounds:w}),v=[];if(!N)return;let{x:z,y:P,width:k,height:I}=U,b={},d=N.origin??Y,{width:s,height:h,x:lu,y:cu}=Qm(q,t.controlDirection,p,t.boundaries,t.keepAspectRatio,d,H,E),_u=s!==k,Fu=h!==I,zu=lu!==z&&_u,Wu=cu!==P&&Fu;if(!zu&&!Wu&&!_u&&!Fu)return;if(zu||Wu||d[0]===1||d[1]===1){if(b.x=zu?lu:U.x,b.y=Wu?cu:U.y,U.x=b.x,U.y=b.y,G.length>0){let Gu=lu-z,a=cu-P;for(let qu of G)qu.position={x:qu.position.x-Gu+d[0]*(s-k),y:qu.position.y-a+d[1]*(h-I)},v.push(qu)}}if(_u||Fu)b.width=_u&&(!t.resizeDirection||t.resizeDirection==="horizontal")?s:U.width,b.height=Fu&&(!t.resizeDirection||t.resizeDirection==="vertical")?h:U.height,U.width=b.width,U.height=b.height;if(Z&&N.expandParent){let Gu=d[0]*(b.width??0);if(b.x&&b.x{if(!m)return;W?.(B,{...U}),n?.({...U}),m=!1});i.call(S)}function c(){i.on(".drag",null)}return{update:y,destroy:c}}var Ww=Cu(Jl(),1),Lw=Cu(Qw(),1);var Nw=(u)=>{let l,f=new Set,r=(A,j)=>{let F=typeof A==="function"?A(l):A;if(!Object.is(F,l)){let J=l;l=(j!=null?j:typeof F!=="object"||F===null)?F:Object.assign({},l,F),f.forEach((Q)=>Q(l,J))}},n=()=>l,c={setState:r,getState:n,getInitialState:()=>$,subscribe:(A)=>{return f.add(A),()=>f.delete(A)},destroy:()=>{f.clear()}},$=l=u(r,n,c);return c},qw=(u)=>u?Nw(u):Nw;var{useDebugValue:Ym}=Ww.default,{useSyncExternalStoreWithSelector:Pm}=Lw.default,Cm=(u)=>u;function B9(u,l=Cm,f){let r=Pm(u.subscribe,u.getState,u.getServerState||u.getInitialState,l,f);return Ym(r),r}var ww=(u,l)=>{let f=qw(u),r=(n,i=l)=>B9(f,n,i);return Object.assign(r,f),r},Tw=(u,l)=>u?ww(u,l):ww;function El(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 Mm=Cu(S4(),1),LA=tu.createContext(null),Rm=LA.Provider,kw=Jr.error001();function il(u,l){let f=tu.useContext(LA);if(f===null)throw Error(kw);return B9(f,u,l)}function Zl(){let u=tu.useContext(LA);if(u===null)throw Error(kw);return tu.useMemo(()=>({getState:u.getState,setState:u.setState,subscribe:u.subscribe}),[u])}var Kw={display:"none"},xm={position:"absolute",width:1,height:1,margin:-1,border:0,padding:0,overflow:"hidden",clip:"rect(0px, 0px, 0px, 0px)",clipPath:"inset(100%)"},Iw="react-flow__node-desc",gw="react-flow__edge-desc",hm="react-flow__aria-live",bm=(u)=>u.ariaLiveMessage,vm=(u)=>u.ariaLabelConfig;function km({rfId:u}){let l=il(bm);return nu.jsx("div",{id:`${hm}-${u}`,"aria-live":"assertive","aria-atomic":"true",style:xm,children:l})}function Im({rfId:u,disableKeyboardA11y:l}){let f=il(vm);return nu.jsxs(nu.Fragment,{children:[nu.jsx("div",{id:`${Iw}-${u}`,style:Kw,children:l?f["node.a11yDescription.default"]:f["node.a11yDescription.keyboardDisabled"]}),nu.jsx("div",{id:`${gw}-${u}`,style:Kw,children:f["edge.a11yDescription.default"]}),!l&&nu.jsx(km,{rfId:u})]})}var TA=tu.forwardRef(({position:u="top-left",children:l,className:f,style:r,...n},i)=>{let t=`${u}`.split("-");return nu.jsx("div",{className:Rl(["react-flow__panel",f,...t]),style:r,ref:i,...n,children:l})});TA.displayName="Panel";function gm({proOptions:u,position:l="bottom-right"}){if(u?.hideAttribution)return null;return nu.jsx(TA,{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:nu.jsx("a",{href:"https://reactflow.dev",target:"_blank",rel:"noopener noreferrer","aria-label":"React Flow attribution",children:"React Flow"})})}var sm=(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}},qA=(u)=>u.id;function am(u,l){return El(u.selectedNodes.map(qA),l.selectedNodes.map(qA))&&El(u.selectedEdges.map(qA),l.selectedEdges.map(qA))}function om({onSelectionChange:u}){let l=Zl(),{selectedNodes:f,selectedEdges:r}=il(sm,am);return tu.useEffect(()=>{let n={nodes:f,edges:r};u?.(n),l.getState().onSelectionChangeHandlers.forEach((i)=>i(n))},[f,r,u]),null}var dm=(u)=>!!u.onSelectionChangeHandlers;function em({onSelectionChange:u}){let l=il(dm);if(u||l)return nu.jsx(om,{onSelectionChange:u});return null}var D9=typeof window<"u"?tu.useLayoutEffect:tu.useEffect,sw=[0,0],uD={x:0,y:0,zoom:1},lD=["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"],Gw=[...lD,"rfId"],fD=(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}),zw={translateExtent:Jy,nodeOrigin:sw,minZoom:0.5,maxZoom:2,elementsSelectable:!0,noPanClassName:"nopan",rfId:"1"};function rD(u){let{setNodes:l,setEdges:f,setMinZoom:r,setMaxZoom:n,setTranslateExtent:i,setNodeExtent:t,reset:y,setDefaultNodesAndEdges:c}=il(fD,El),$=Zl();D9(()=>{return c(u.defaultNodes,u.defaultEdges),()=>{A.current=zw,y()}},[]);let A=tu.useRef(zw);return D9(()=>{for(let j of Gw){let F=u[j],J=A.current[j];if(F===J)continue;if(typeof u[j]>"u")continue;if(j==="nodes")l(F);else if(j==="edges")f(F);else if(j==="minZoom")r(F);else if(j==="maxZoom")n(F);else if(j==="translateExtent")i(F);else if(j==="nodeExtent")t(F);else if(j==="ariaLabelConfig")$.setState({ariaLabelConfig:Rq(F)});else if(j==="fitView")$.setState({fitViewQueued:F});else if(j==="fitViewOptions")$.setState({fitViewOptions:F});else $.setState({[j]:F})}A.current=u},Gw.map((j)=>u[j])),null}function Ew(){if(typeof window>"u"||!window.matchMedia)return null;return window.matchMedia("(prefers-color-scheme: dark)")}function nD(u){let[l,f]=tu.useState(u==="system"?null:u);return tu.useEffect(()=>{if(u!=="system"){f(u);return}let r=Ew(),n=()=>f(r?.matches?"dark":"light");return n(),r?.addEventListener("change",n),()=>{r?.removeEventListener("change",n)}},[u]),l!==null?l:Ew()?.matches?"dark":"light"}var Ow=typeof document<"u"?document:null;function Rc(u=null,l={target:Ow,actInsideInputWithModifier:!0}){let[f,r]=tu.useState(!1),n=tu.useRef(!1),i=tu.useRef(new Set([])),[t,y]=tu.useMemo(()=>{if(u!==null){let $=(Array.isArray(u)?u:[u]).filter((j)=>typeof j==="string").map((j)=>j.replace("+",` `).replace(` `,` +`).split(` -`)),A=$.reduce((j,F)=>j.concat(...F),[]);return[$,A]}return[[],[]]},[u]);return tu.useEffect(()=>{let c=l?.target??qw,$=l?.actInsideInputWithModifier??!0;if(u!==null){let A=(J)=>{if(n.current=J.ctrlKey||J.metaKey||J.shiftKey||J.altKey,(!n.current||n.current&&!$)&&U9(J))return!1;let W=Ww(J.code,y);if(i.current.add(J[W]),ww(t,i.current,!1)){let L=J.composedPath?.()?.[0]||J.target,U=L?.nodeName==="BUTTON"||L?.nodeName==="A";if(l.preventDefault!==!1&&(n.current||!U))J.preventDefault();r(!0)}},j=(J)=>{let Q=Ww(J.code,y);if(ww(t,i.current,!0))r(!1),i.current.clear();else i.current.delete(J[Q]);if(J.key==="Meta")i.current.clear();n.current=!1},F=()=>{i.current.clear(),r(!1)};return c?.addEventListener("keydown",A),c?.addEventListener("keyup",j),window.addEventListener("blur",F),window.addEventListener("contextmenu",F),()=>{c?.removeEventListener("keydown",A),c?.removeEventListener("keyup",j),window.removeEventListener("blur",F),window.removeEventListener("contextmenu",F)}}},[u,r]),f}function ww(u,l,f){return u.filter((r)=>f||r.length===l.size).some((r)=>r.every((n)=>l.has(n)))}function Ww(u,l){return l.includes(u)?"code":"key"}var hV=()=>{let u=Ol();return tu.useMemo(()=>{return{zoomIn:(l)=>{let{panZoom:f}=u.getState();return f?f.scaleBy(1.2,l):Promise.resolve(!1)},zoomOut:(l)=>{let{panZoom:f}=u.getState();return f?f.scaleBy(0.8333333333333334,l):Promise.resolve(!1)},zoomTo:(l,f)=>{let{panZoom:r}=u.getState();return r?r.scaleTo(l,f):Promise.resolve(!1)},getZoom:()=>u.getState().transform[2],setViewport:async(l,f)=>{let{transform:[r,n,i],panZoom:t}=u.getState();if(!t)return Promise.resolve(!1);return await t.setViewport({x:l.x??r,y:l.y??n,zoom:l.zoom??i},f),Promise.resolve(!0)},getViewport:()=>{let[l,f,r]=u.getState().transform;return{x:l,y:f,zoom:r}},setCenter:async(l,f,r)=>{return u.getState().setCenter(l,f,r)},fitBounds:async(l,f)=>{let{width:r,height:n,minZoom:i,maxZoom:t,panZoom:y}=u.getState(),c=pc(l,r,n,i,t,f?.padding??0.1);if(!y)return Promise.resolve(!1);return await y.setViewport(c,{duration:f?.duration,ease:f?.ease,interpolate:f?.interpolate}),Promise.resolve(!0)},screenToFlowPosition:(l,f={})=>{let{transform:r,snapGrid:n,snapToGrid:i,domNode:t}=u.getState();if(!t)return l;let{x:y,y:c}=t.getBoundingClientRect(),$={x:l.x-y,y:l.y-c},A=f.snapGrid??n,j=f.snapToGrid??i;return Ny($,r,j,A)},flowToScreenPosition:(l)=>{let{transform:f,domNode:r}=u.getState();if(!r)return l;let{x:n,y:i}=r.getBoundingClientRect(),t=Vc(l,f);return{x:t.x+n,y:t.y+i}}}},[])};function Rw(u,l){let f=[],r=new Map,n=[];for(let i of u)if(i.type==="add"){n.push(i);continue}else if(i.type==="remove"||i.type==="replace")r.set(i.id,[i]);else{let t=r.get(i.id);if(t)t.push(i);else r.set(i.id,[i])}for(let i of l){let t=r.get(i.id);if(!t){f.push(i);continue}if(t[0].type==="remove")continue;if(t[0].type==="replace"){f.push({...t[0].item});continue}let y={...i};for(let c of t)xV(c,y);f.push(y)}if(n.length)n.forEach((i)=>{if(i.index!==void 0)f.splice(i.index,0,{...i.item});else f.push({...i.item})});return f}function xV(u,l){switch(u.type){case"select":{l.selected=u.selected;break}case"position":{if(typeof u.position<"u")l.position=u.position;if(typeof u.dragging<"u")l.dragging=u.dragging;break}case"dimensions":{if(typeof u.dimensions<"u"){if(l.measured={...u.dimensions},u.setAttributes){if(u.setAttributes===!0||u.setAttributes==="width")l.width=u.dimensions.width;if(u.setAttributes===!0||u.setAttributes==="height")l.height=u.dimensions.height}}if(typeof u.resizing==="boolean")l.resizing=u.resizing;break}}}function bV(u,l){return Rw(u,l)}function vV(u,l){return Rw(u,l)}function si(u,l){return{id:u,type:"select",selected:l}}function Wy(u,l=new Set,f=!1){let r=[];for(let[n,i]of u){let t=l.has(n);if(!(i.selected===void 0&&!t)&&i.selected!==t){if(f)i.selected=t;r.push(si(i.id,t))}}return r}function Lw({items:u=[],lookup:l}){let f=[],r=new Map(u.map((n)=>[n.id,n]));for(let[n,i]of u.entries()){let t=l.get(i.id),y=t?.internals?.userNode??t;if(y!==void 0&&y!==i)f.push({id:i.id,item:i,type:"replace"});if(y===void 0)f.push({item:i,type:"add",index:n})}for(let[n]of l)if(r.get(n)===void 0)f.push({id:n,type:"remove"});return f}function Tw(u){return{id:u.id,type:"remove"}}var Kw=(u)=>zq(u),kV=(u)=>r9(u);function hw(u){return tu.forwardRef(u)}function Gw(u){let[l,f]=tu.useState(BigInt(0)),[r]=tu.useState(()=>IV(()=>f((n)=>n+BigInt(1))));return O9(()=>{let n=r.get();if(n.length)u(n),r.reset()},[l]),r}function IV(u){let l=[];return{get:()=>l,reset:()=>{l=[]},push:(f)=>{l.push(f),u()}}}var xw=tu.createContext(null);function gV({children:u}){let l=Ol(),f=tu.useCallback((y)=>{let{nodes:c=[],setNodes:$,hasDefaultNodes:A,onNodesChange:j,nodeLookup:F,fitViewQueued:J,onNodesChangeMiddlewareMap:Q}=l.getState(),W=c;for(let U of y)W=typeof U==="function"?U(W):U;let L=Lw({items:W,lookup:F});for(let U of Q.values())L=U(L);if(A)$(W);if(L.length>0)j?.(L);else if(J)window.requestAnimationFrame(()=>{let{fitViewQueued:U,nodes:q,setNodes:N}=l.getState();if(U)N(q)})},[]),r=Gw(f),n=tu.useCallback((y)=>{let{edges:c=[],setEdges:$,hasDefaultEdges:A,onEdgesChange:j,edgeLookup:F}=l.getState(),J=c;for(let Q of y)J=typeof Q==="function"?Q(J):Q;if(A)$(J);else if(j)j(Lw({items:J,lookup:F}))},[]),i=Gw(n),t=tu.useMemo(()=>({nodeQueue:r,edgeQueue:i}),[]);return ru.jsx(xw.Provider,{value:t,children:u})}function sV(){let u=tu.useContext(xw);if(!u)throw Error("useBatchContext must be used within a BatchProvider");return u}var aV=(u)=>!!u.panZoom;function H9(){let u=hV(),l=Ol(),f=sV(),r=il(aV),n=tu.useMemo(()=>{let i=(j)=>l.getState().nodeLookup.get(j),t=(j)=>{f.nodeQueue.push(j)},y=(j)=>{f.edgeQueue.push(j)},c=(j)=>{let{nodeLookup:F,nodeOrigin:J}=l.getState(),Q=Kw(j)?j:F.get(j.id),W=Q.parentId?A9(Q.position,Q.measured,Q.parentId,F,J):Q.position,L={...Q,position:W,width:Q.measured?.width??Q.width,height:Q.measured?.height??Q.height};return gi(L)},$=(j,F,J={replace:!1})=>{t((Q)=>Q.map((W)=>{if(W.id===j){let L=typeof F==="function"?F(W):F;return J.replace&&Kw(L)?L:{...W,...L}}return W}))},A=(j,F,J={replace:!1})=>{y((Q)=>Q.map((W)=>{if(W.id===j){let L=typeof F==="function"?F(W):F;return J.replace&&kV(L)?L:{...W,...L}}return W}))};return{getNodes:()=>l.getState().nodes.map((j)=>({...j})),getNode:(j)=>i(j)?.internals.userNode,getInternalNode:i,getEdges:()=>{let{edges:j=[]}=l.getState();return j.map((F)=>({...F}))},getEdge:(j)=>l.getState().edgeLookup.get(j),setNodes:t,setEdges:y,addNodes:(j)=>{let F=Array.isArray(j)?j:[j];f.nodeQueue.push((J)=>[...J,...F])},addEdges:(j)=>{let F=Array.isArray(j)?j:[j];f.edgeQueue.push((J)=>[...J,...F])},toObject:()=>{let{nodes:j=[],edges:F=[],transform:J}=l.getState(),[Q,W,L]=J;return{nodes:j.map((U)=>({...U})),edges:F.map((U)=>({...U})),viewport:{x:Q,y:W,zoom:L}}},deleteElements:async({nodes:j=[],edges:F=[]})=>{let{nodes:J,edges:Q,onNodesDelete:W,onEdgesDelete:L,triggerNodeChanges:U,triggerEdgeChanges:q,onDelete:N,onBeforeDelete:w}=l.getState(),{nodes:G,edges:Z}=await Zq({nodesToRemove:j,edgesToRemove:F,nodes:J,edges:Q,onBeforeDelete:w}),H=Z.length>0,E=G.length>0;if(H){let V=Z.map(Tw);L?.(Z),q(V)}if(E){let V=G.map(Tw);W?.(G),U(V)}if(E||H)N?.({nodes:G,edges:Z});return{deletedNodes:G,deletedEdges:Z}},getIntersectingNodes:(j,F=!0,J)=>{let Q=c9(j),W=Q?j:c(j),L=J!==void 0;if(!W)return[];return(J||l.getState().nodes).filter((U)=>{let q=l.getState().nodeLookup.get(U.id);if(q&&!Q&&(U.id===j.id||!q.internals.positionAbsolute))return!1;let N=gi(L?U:q),w=Jy(N,W);return F&&w>0||w>=N.width*N.height||w>=W.width*W.height})},isNodeIntersecting:(j,F,J=!0)=>{let W=c9(j)?j:c(j);if(!W)return!1;let L=Jy(W,F);return J&&L>0||L>=F.width*F.height||L>=W.width*W.height},updateNode:$,updateNodeData:(j,F,J={replace:!1})=>{$(j,(Q)=>{let W=typeof F==="function"?F(Q):F;return J.replace?{...Q,data:W}:{...Q,data:{...Q.data,...W}}},J)},updateEdge:A,updateEdgeData:(j,F,J={replace:!1})=>{A(j,(Q)=>{let W=typeof F==="function"?F(Q):F;return J.replace?{...Q,data:W}:{...Q,data:{...Q.data,...W}}},J)},getNodesBounds:(j)=>{let{nodeLookup:F,nodeOrigin:J}=l.getState();return i9(j,{nodeLookup:F,nodeOrigin:J})},getHandleConnections:({type:j,id:F,nodeId:J})=>Array.from(l.getState().connectionLookup.get(`${J}-${j}${F?`-${F}`:""}`)?.values()??[]),getNodeConnections:({type:j,handleId:F,nodeId:J})=>Array.from(l.getState().connectionLookup.get(`${J}${j?F?`-${j}-${F}`:`-${j}`:""}`)?.values()??[]),fitView:async(j)=>{let F=l.getState().fitViewResolver??mq();return l.setState({fitViewQueued:!0,fitViewOptions:j,fitViewResolver:F}),f.nodeQueue.push((J)=>[...J]),F.promise}}},[]);return tu.useMemo(()=>{return{...n,...u,viewportInitialized:r}},[r])}var zw=(u)=>u.selected,oV=typeof window<"u"?window:void 0;function dV({deleteKeyCode:u,multiSelectionKeyCode:l}){let f=Ol(),{deleteElements:r}=H9(),n=Xc(u,{actInsideInputWithModifier:!1}),i=Xc(l,{target:oV});tu.useEffect(()=>{if(n){let{edges:t,nodes:y}=f.getState();r({nodes:y.filter(zw),edges:t.filter(zw)}),f.setState({nodesSelectionActive:!1})}},[n]),tu.useEffect(()=>{f.setState({multiSelectionActive:i})},[i])}function eV(u){let l=Ol();tu.useEffect(()=>{let f=()=>{if(!u.current||!(u.current.checkVisibility?.()??!0))return!1;let r=rA(u.current);if(r.height===0||r.width===0)l.getState().onError?.("004",Qr.error004());l.setState({width:r.width||500,height:r.height||500})};if(u.current){f(),window.addEventListener("resize",f);let r=new ResizeObserver(()=>f());return r.observe(u.current),()=>{if(window.removeEventListener("resize",f),r&&u.current)r.unobserve(u.current)}}},[])}var qA={position:"absolute",width:"100%",height:"100%",top:0,left:0},uD=(u)=>({userSelectionActive:u.userSelectionActive,lib:u.lib,connectionInProgress:u.connection.inProgress});function lD({onPaneContextMenu:u,zoomOnScroll:l=!0,zoomOnPinch:f=!0,panOnScroll:r=!1,panOnScrollSpeed:n=0.5,panOnScrollMode:i=gn.Free,zoomOnDoubleClick:t=!0,panOnDrag:y=!0,defaultViewport:c,translateExtent:$,minZoom:A,maxZoom:j,zoomActivationKeyCode:F,preventScrolling:J=!0,children:Q,noWheelClassName:W,noPanClassName:L,onViewportChange:U,isControlledViewport:q,paneClickDistance:N,selectionOnDrag:w}){let G=Ol(),Z=tu.useRef(null),{userSelectionActive:H,lib:E,connectionInProgress:V}=il(uD,zl),S=Xc(F),B=tu.useRef();eV(Z);let D=tu.useCallback((X)=>{if(U?.({x:X[0],y:X[1],zoom:X[2]}),!q)G.setState({transform:X})},[U,q]);return tu.useEffect(()=>{if(Z.current){B.current=oq({domNode:Z.current,minZoom:A,maxZoom:j,translateExtent:$,viewport:c,onDraggingChange:(p)=>G.setState((v)=>v.paneDragging===p?v:{paneDragging:p}),onPanZoomStart:(p,v)=>{let{onViewportChangeStart:z,onMoveStart:P}=G.getState();P?.(p,v),z?.(v)},onPanZoom:(p,v)=>{let{onViewportChange:z,onMove:P}=G.getState();P?.(p,v),z?.(v)},onPanZoomEnd:(p,v)=>{let{onViewportChangeEnd:z,onMoveEnd:P}=G.getState();P?.(p,v),z?.(v)}});let{x:X,y:O,zoom:Y}=B.current.getViewport();return G.setState({panZoom:B.current,transform:[X,O,Y],domNode:Z.current.closest(".react-flow")}),()=>{B.current?.destroy()}}},[]),tu.useEffect(()=>{B.current?.update({onPaneContextMenu:u,zoomOnScroll:l,zoomOnPinch:f,panOnScroll:r,panOnScrollSpeed:n,panOnScrollMode:i,zoomOnDoubleClick:t,panOnDrag:y,zoomActivationKeyPressed:S,preventScrolling:J,noPanClassName:L,userSelectionActive:H,noWheelClassName:W,lib:E,onTransformChange:D,connectionInProgress:V,selectionOnDrag:w,paneClickDistance:N})},[u,l,f,r,n,i,t,y,S,J,L,H,W,E,D,V,w,N]),ru.jsx("div",{className:"react-flow__renderer",ref:Z,style:qA,children:Q})}var fD=(u)=>({userSelectionActive:u.userSelectionActive,userSelectionRect:u.userSelectionRect});function rD(){let{userSelectionActive:u,userSelectionRect:l}=il(fD,zl);if(!(u&&l))return null;return ru.jsx("div",{className:"react-flow__selection react-flow__container",style:{width:l.width,height:l.height,transform:`translate(${l.x}px, ${l.y}px)`}})}var z9=(u,l)=>{return(f)=>{if(f.target!==l.current)return;u?.(f)}},nD=(u)=>({userSelectionActive:u.userSelectionActive,elementsSelectable:u.elementsSelectable,connectionInProgress:u.connection.inProgress,dragging:u.paneDragging});function iD({isSelecting:u,selectionKeyPressed:l,selectionMode:f=ki.Full,panOnDrag:r,paneClickDistance:n,selectionOnDrag:i,onSelectionStart:t,onSelectionEnd:y,onPaneClick:c,onPaneContextMenu:$,onPaneScroll:A,onPaneMouseEnter:j,onPaneMouseMove:F,onPaneMouseLeave:J,children:Q}){let W=Ol(),{userSelectionActive:L,elementsSelectable:U,dragging:q,connectionInProgress:N}=il(nD,zl),w=U&&(u||L),G=tu.useRef(null),Z=tu.useRef(),H=tu.useRef(new Set),E=tu.useRef(new Set),V=tu.useRef(!1),S=(z)=>{if(V.current||N){V.current=!1;return}c?.(z),W.getState().resetSelectedElements(),W.setState({nodesSelectionActive:!1})},B=(z)=>{if(Array.isArray(r)&&r?.includes(2)){z.preventDefault();return}$?.(z)},D=A?(z)=>A(z):void 0,X=(z)=>{if(V.current)z.stopPropagation(),V.current=!1},O=(z)=>{let{domNode:P}=W.getState();if(Z.current=P?.getBoundingClientRect(),!Z.current)return;let k=z.target===G.current;if(!k&&!!z.target.closest(".nokey")||!u||!(i&&k||l)||z.button!==0||!z.isPrimary)return;z.target?.setPointerCapture?.(z.pointerId),V.current=!1;let{x:d,y:g}=mr(z.nativeEvent,Z.current);if(W.setState({userSelectionRect:{width:0,height:0,startX:d,startY:g,x:d,y:g}}),!k)z.stopPropagation(),z.preventDefault()},Y=(z)=>{let{userSelectionRect:P,transform:k,nodeLookup:I,edgeLookup:b,connectionLookup:d,triggerNodeChanges:g,triggerEdgeChanges:x,defaultEdgeOptions:lu,resetSelectedElements:cu}=W.getState();if(!Z.current||!P)return;let{x:_u,y:Fu}=mr(z.nativeEvent,Z.current),{startX:zu,startY:Wu}=P;if(!V.current){let s=l?0:n;if(Math.hypot(_u-zu,Fu-Wu)<=s)return;cu(),t?.(z)}V.current=!0;let C={startX:zu,startY:Wu,x:_us.id)),E.current=new Set;let Gu=lu?.selectable??!0;for(let s of H.current){let qu=d.get(s);if(!qu)continue;for(let{edgeId:Zu}of qu.values()){let Bu=b.get(Zu);if(Bu&&(Bu.selectable??Gu))E.current.add(Zu)}}if(!j9(e,H.current)){let s=Wy(I,H.current,!0);g(s)}if(!j9(uu,E.current)){let s=Wy(b,E.current);x(s)}W.setState({userSelectionRect:C,userSelectionActive:!0,nodesSelectionActive:!1})},p=(z)=>{if(z.button!==0)return;if(z.target?.releasePointerCapture?.(z.pointerId),!L&&z.target===G.current&&W.getState().userSelectionRect)S?.(z);if(W.setState({userSelectionActive:!1,userSelectionRect:null}),V.current)y?.(z),W.setState({nodesSelectionActive:H.current.size>0})},v=r===!0||Array.isArray(r)&&r.includes(0);return ru.jsxs("div",{className:Xl(["react-flow__pane",{draggable:v,dragging:q,selection:u}]),onClick:w?void 0:z9(S,G),onContextMenu:z9(B,G),onWheel:z9(D,G),onPointerEnter:w?void 0:j,onPointerMove:w?Y:F,onPointerUp:w?p:void 0,onPointerDownCapture:w?O:void 0,onClickCapture:w?X:void 0,onPointerLeave:J,ref:G,style:qA,children:[Q,ru.jsx(rD,{})]})}function Z9({id:u,store:l,unselect:f=!1,nodeRef:r}){let{addSelectedNodes:n,unselectNodesAndEdges:i,multiSelectionActive:t,nodeLookup:y,onError:c}=l.getState(),$=y.get(u);if(!$){c?.("012",Qr.error012(u));return}if(l.setState({nodesSelectionActive:!1}),!$.selected)n([u]);else if(f||$.selected&&t)i({nodes:[$],edges:[]}),requestAnimationFrame(()=>r?.current?.blur())}function bw({nodeRef:u,disabled:l=!1,noDragClassName:f,handleSelector:r,nodeId:n,isSelectable:i,nodeClickDistance:t}){let y=Ol(),[c,$]=tu.useState(!1),A=tu.useRef();return tu.useEffect(()=>{A.current=xq({getStoreItems:()=>y.getState(),onNodeMouseDown:(j)=>{Z9({id:j,store:y,nodeRef:u})},onDragStart:()=>{$(!0)},onDragStop:()=>{$(!1)}})},[]),tu.useEffect(()=>{if(l||!u.current||!A.current)return;return A.current.update({noDragClassName:f,handleSelector:r,domNode:u.current,isSelectable:i,nodeId:n,nodeClickDistance:t}),()=>{A.current?.destroy()}},[f,r,l,i,u,n,t]),c}var tD=(u)=>(l)=>l.selected&&(l.draggable||u&&typeof l.draggable>"u");function vw(){let u=Ol();return tu.useCallback((f)=>{let{nodeExtent:r,snapToGrid:n,snapGrid:i,nodesDraggable:t,onError:y,updateNodePositions:c,nodeLookup:$,nodeOrigin:A}=u.getState(),j=new Map,F=tD(t),J=n?i[0]:5,Q=n?i[1]:5,W=f.direction.x*J*f.factor,L=f.direction.y*Q*f.factor;for(let[,U]of $){if(!F(U))continue;let q={x:U.internals.positionAbsolute.x+W,y:U.internals.positionAbsolute.y+L};if(n)q=Qy(q,i);let{position:N,positionAbsolute:w}=t9({nodeId:U.id,nextPosition:q,nodeLookup:$,nodeExtent:r,nodeOrigin:A,onError:y});U.position=N,U.internals.positionAbsolute=w,j.set(U.id,U)}c(j)},[])}var B9=tu.createContext(null),yD=B9.Provider;B9.Consumer;var kw=()=>{return tu.useContext(B9)},cD=(u)=>({connectOnClick:u.connectOnClick,noPanClassName:u.noPanClassName,rfId:u.rfId}),_D=(u,l,f)=>(r)=>{let{connectionClickStartHandle:n,connectionMode:i,connection:t}=r,{fromHandle:y,toHandle:c,isValid:$}=t,A=c?.nodeId===u&&c?.id===l&&c?.type===f;return{connectingFrom:y?.nodeId===u&&y?.id===l&&y?.type===f,connectingTo:A,clickConnecting:n?.nodeId===u&&n?.id===l&&n?.type===f,isPossibleEndHandle:i===h0.Strict?y?.type!==f:u!==y?.nodeId||l!==y?.id,connectionInProcess:!!y,clickConnectionInProcess:!!n,valid:A&&$}};function $D({type:u="source",position:l=Ku.Top,isValidConnection:f,isConnectable:r=!0,isConnectableStart:n=!0,isConnectableEnd:i=!0,id:t,onConnect:y,children:c,className:$,onMouseDown:A,onTouchStart:j,...F},J){let Q=t||null,W=u==="target",L=Ol(),U=kw(),{connectOnClick:q,noPanClassName:N,rfId:w}=il(cD,zl),{connectingFrom:G,connectingTo:Z,clickConnecting:H,isPossibleEndHandle:E,connectionInProcess:V,clickConnectionInProcess:S,valid:B}=il(_D(U,Q,u),zl);if(!U)L.getState().onError?.("010",Qr.error010());let D=(Y)=>{let{defaultEdgeOptions:p,onConnect:v,hasDefaultEdges:z}=L.getState(),P={...p,...Y};if(z){let{edges:k,setEdges:I}=L.getState();I(N9(P,k))}v?.(P),y?.(P)},X=(Y)=>{if(!U)return;let p=J9(Y.nativeEvent);if(n&&(p&&Y.button===0||!p)){let v=L.getState();$A.onPointerDown(Y.nativeEvent,{handleDomNode:Y.currentTarget,autoPanOnConnect:v.autoPanOnConnect,connectionMode:v.connectionMode,connectionRadius:v.connectionRadius,domNode:v.domNode,nodeLookup:v.nodeLookup,lib:v.lib,isTarget:W,handleId:Q,nodeId:U,flowId:v.rfId,panBy:v.panBy,cancelConnection:v.cancelConnection,onConnectStart:v.onConnectStart,onConnectEnd:(...z)=>L.getState().onConnectEnd?.(...z),updateConnection:v.updateConnection,onConnect:D,isValidConnection:f||((...z)=>L.getState().isValidConnection?.(...z)??!0),getTransform:()=>L.getState().transform,getFromHandle:()=>L.getState().connection.fromHandle,autoPanSpeed:v.autoPanSpeed,dragThreshold:v.connectionDragThreshold})}if(p)A?.(Y);else j?.(Y)},O=(Y)=>{let{onClickConnectStart:p,onClickConnectEnd:v,connectionClickStartHandle:z,connectionMode:P,isValidConnection:k,lib:I,rfId:b,nodeLookup:d,connection:g}=L.getState();if(!U||!z&&!n)return;if(!z){p?.(Y.nativeEvent,{nodeId:U,handleId:Q,handleType:u}),L.setState({connectionClickStartHandle:{nodeId:U,type:u,id:Q}});return}let x=F9(Y.target),lu=f||k,{connection:cu,isValid:_u}=$A.isValid(Y.nativeEvent,{handle:{nodeId:U,id:Q,type:u},connectionMode:P,fromNodeId:z.nodeId,fromHandleId:z.id||null,fromType:z.type,isValidConnection:lu,flowId:b,doc:x,lib:I,nodeLookup:d});if(_u&&cu)D(cu);let Fu=structuredClone(g);delete Fu.inProgress,Fu.toPosition=Fu.toHandle?Fu.toHandle.position:null,v?.(Y,Fu),L.setState({connectionClickStartHandle:null})};return ru.jsx("div",{"data-handleid":Q,"data-nodeid":U,"data-handlepos":l,"data-id":`${w}-${U}-${Q}-${u}`,className:Xl(["react-flow__handle",`react-flow__handle-${l}`,"nodrag",N,$,{source:!W,target:W,connectable:r,connectablestart:n,connectableend:i,clickconnecting:H,connectingfrom:G,connectingto:Z,valid:B,connectionindicator:r&&(!V||E)&&(V||S?i:n)}]),onMouseDown:X,onTouchStart:X,onClick:q?O:void 0,ref:J,...F,children:c})}var ai=tu.memo(hw($D));function AD({data:u,isConnectable:l,sourcePosition:f=Ku.Bottom}){return ru.jsxs(ru.Fragment,{children:[u?.label,ru.jsx(ai,{type:"source",position:f,isConnectable:l})]})}function jD({data:u,isConnectable:l,targetPosition:f=Ku.Top,sourcePosition:r=Ku.Bottom}){return ru.jsxs(ru.Fragment,{children:[ru.jsx(ai,{type:"target",position:f,isConnectable:l}),u?.label,ru.jsx(ai,{type:"source",position:r,isConnectable:l})]})}function FD(){return null}function UD({data:u,isConnectable:l,targetPosition:f=Ku.Top}){return ru.jsxs(ru.Fragment,{children:[ru.jsx(ai,{type:"target",position:f,isConnectable:l}),u?.label]})}var JA={ArrowUp:{x:0,y:-1},ArrowDown:{x:0,y:1},ArrowLeft:{x:-1,y:0},ArrowRight:{x:1,y:0}},Ew={input:AD,default:jD,output:UD,group:FD};function JD(u){if(u.internals.handleBounds===void 0)return{width:u.width??u.initialWidth??u.style?.width,height:u.height??u.initialHeight??u.style?.height};return{width:u.width??u.style?.width,height:u.height??u.style?.height}}var QD=(u)=>{let{width:l,height:f,x:r,y:n}=Uy(u.nodeLookup,{filter:(i)=>!!i.selected});return{width:Br(l)?l:null,height:Br(f)?f:null,userSelectionActive:u.userSelectionActive,transformString:`translate(${u.transform[0]}px,${u.transform[1]}px) scale(${u.transform[2]}) translate(${r}px,${n}px)`}};function ND({onSelectionContextMenu:u,noPanClassName:l,disableKeyboardA11y:f}){let r=Ol(),{width:n,height:i,transformString:t,userSelectionActive:y}=il(QD,zl),c=vw(),$=tu.useRef(null);tu.useEffect(()=>{if(!f)$.current?.focus({preventScroll:!0})},[f]);let A=!y&&n!==null&&i!==null;if(bw({nodeRef:$,disabled:!A}),!A)return null;let j=u?(J)=>{let Q=r.getState().nodes.filter((W)=>W.selected);u(J,Q)}:void 0,F=(J)=>{if(Object.prototype.hasOwnProperty.call(JA,J.key))J.preventDefault(),c({direction:JA[J.key],factor:J.shiftKey?4:1})};return ru.jsx("div",{className:Xl(["react-flow__nodesselection","react-flow__container",l]),style:{transform:t},children:ru.jsx("div",{ref:$,className:"react-flow__nodesselection-rect",onContextMenu:j,tabIndex:f?void 0:-1,onKeyDown:f?void 0:F,style:{width:n,height:i}})})}var Ow=typeof window<"u"?window:void 0,qD=(u)=>{return{nodesSelectionActive:u.nodesSelectionActive,userSelectionActive:u.userSelectionActive}};function Iw({children:u,onPaneClick:l,onPaneMouseEnter:f,onPaneMouseMove:r,onPaneMouseLeave:n,onPaneContextMenu:i,onPaneScroll:t,paneClickDistance:y,deleteKeyCode:c,selectionKeyCode:$,selectionOnDrag:A,selectionMode:j,onSelectionStart:F,onSelectionEnd:J,multiSelectionKeyCode:Q,panActivationKeyCode:W,zoomActivationKeyCode:L,elementsSelectable:U,zoomOnScroll:q,zoomOnPinch:N,panOnScroll:w,panOnScrollSpeed:G,panOnScrollMode:Z,zoomOnDoubleClick:H,panOnDrag:E,defaultViewport:V,translateExtent:S,minZoom:B,maxZoom:D,preventScrolling:X,onSelectionContextMenu:O,noWheelClassName:Y,noPanClassName:p,disableKeyboardA11y:v,onViewportChange:z,isControlledViewport:P}){let{nodesSelectionActive:k,userSelectionActive:I}=il(qD,zl),b=Xc($,{target:Ow}),d=Xc(W,{target:Ow}),g=d||E,x=d||w,lu=A&&g!==!0,cu=b||I||lu;return dV({deleteKeyCode:c,multiSelectionKeyCode:Q}),ru.jsx(lD,{onPaneContextMenu:i,elementsSelectable:U,zoomOnScroll:q,zoomOnPinch:N,panOnScroll:x,panOnScrollSpeed:G,panOnScrollMode:Z,zoomOnDoubleClick:H,panOnDrag:!b&&g,defaultViewport:V,translateExtent:S,minZoom:B,maxZoom:D,zoomActivationKeyCode:L,preventScrolling:X,noWheelClassName:Y,noPanClassName:p,onViewportChange:z,isControlledViewport:P,paneClickDistance:y,selectionOnDrag:lu,children:ru.jsxs(iD,{onSelectionStart:F,onSelectionEnd:J,onPaneClick:l,onPaneMouseEnter:f,onPaneMouseMove:r,onPaneMouseLeave:n,onPaneContextMenu:i,onPaneScroll:t,panOnDrag:g,isSelecting:!!cu,selectionMode:j,selectionKeyPressed:b,paneClickDistance:y,selectionOnDrag:lu,children:[u,k&&ru.jsx(ND,{onSelectionContextMenu:O,noPanClassName:p,disableKeyboardA11y:v})]})})}Iw.displayName="FlowRenderer";var wD=tu.memo(Iw),WD=(u)=>(l)=>{return u?uA(l.nodeLookup,{x:0,y:0,width:l.width,height:l.height},l.transform,!0).map((f)=>f.id):Array.from(l.nodeLookup.keys())};function LD(u){return il(tu.useCallback(WD(u),[u]),zl)}var TD=(u)=>u.updateNodeInternals;function KD(){let u=il(TD),[l]=tu.useState(()=>{if(typeof ResizeObserver>"u")return null;return new ResizeObserver((f)=>{let r=new Map;f.forEach((n)=>{let i=n.target.getAttribute("data-id");r.set(i,{id:i,nodeElement:n.target,force:!0})}),u(r)})});return tu.useEffect(()=>{return()=>{l?.disconnect()}},[l]),l}function GD({node:u,nodeType:l,hasDimensions:f,resizeObserver:r}){let n=Ol(),i=tu.useRef(null),t=tu.useRef(null),y=tu.useRef(u.sourcePosition),c=tu.useRef(u.targetPosition),$=tu.useRef(l),A=f&&!!u.internals.handleBounds;return tu.useEffect(()=>{if(i.current&&!u.hidden&&(!A||t.current!==i.current)){if(t.current)r?.unobserve(t.current);r?.observe(i.current),t.current=i.current}},[A,u.hidden]),tu.useEffect(()=>{return()=>{if(t.current)r?.unobserve(t.current),t.current=null}},[]),tu.useEffect(()=>{if(i.current){let j=$.current!==l,F=y.current!==u.sourcePosition,J=c.current!==u.targetPosition;if(j||F||J)$.current=l,y.current=u.sourcePosition,c.current=u.targetPosition,n.getState().updateNodeInternals(new Map([[u.id,{id:u.id,nodeElement:i.current,force:!0}]]))}},[u.id,l,u.sourcePosition,u.targetPosition]),i}function zD({id:u,onClick:l,onMouseEnter:f,onMouseMove:r,onMouseLeave:n,onContextMenu:i,onDoubleClick:t,nodesDraggable:y,elementsSelectable:c,nodesConnectable:$,nodesFocusable:A,resizeObserver:j,noDragClassName:F,noPanClassName:J,disableKeyboardA11y:Q,rfId:W,nodeTypes:L,nodeClickDistance:U,onError:q}){let{node:N,internals:w,isParent:G}=il((_u)=>{let Fu=_u.nodeLookup.get(u),zu=_u.parentLookup.has(u);return{node:Fu,internals:Fu.internals,isParent:zu}},zl),Z=N.type||"default",H=L?.[Z]||Ew[Z];if(H===void 0)q?.("003",Qr.error003(Z)),Z="default",H=L?.default||Ew.default;let E=!!(N.draggable||y&&typeof N.draggable>"u"),V=!!(N.selectable||c&&typeof N.selectable>"u"),S=!!(N.connectable||$&&typeof N.connectable>"u"),B=!!(N.focusable||A&&typeof N.focusable>"u"),D=Ol(),X=$9(N),O=GD({node:N,nodeType:Z,hasDimensions:X,resizeObserver:j}),Y=bw({nodeRef:O,disabled:N.hidden||!E,noDragClassName:F,handleSelector:N.dragHandle,nodeId:u,isSelectable:V,nodeClickDistance:U}),p=vw();if(N.hidden)return null;let v=qn(N),z=JD(N),P=V||E||l||f||r||n,k=f?(_u)=>f(_u,{...w.userNode}):void 0,I=r?(_u)=>r(_u,{...w.userNode}):void 0,b=n?(_u)=>n(_u,{...w.userNode}):void 0,d=i?(_u)=>i(_u,{...w.userNode}):void 0,g=t?(_u)=>t(_u,{...w.userNode}):void 0,x=(_u)=>{let{selectNodesOnDrag:Fu,nodeDragThreshold:zu}=D.getState();if(V&&(!Fu||!E||zu>0))Z9({id:u,store:D,nodeRef:O});if(l)l(_u,{...w.userNode})},lu=(_u)=>{if(U9(_u.nativeEvent)||Q)return;if(e5.includes(_u.key)&&V){let Fu=_u.key==="Escape";Z9({id:u,store:D,unselect:Fu,nodeRef:O})}else if(E&&N.selected&&Object.prototype.hasOwnProperty.call(JA,_u.key)){_u.preventDefault();let{ariaLabelConfig:Fu}=D.getState();D.setState({ariaLiveMessage:Fu["node.a11yDescription.ariaLiveMessage"]({direction:_u.key.replace("Arrow","").toLowerCase(),x:~~w.positionAbsolute.x,y:~~w.positionAbsolute.y})}),p({direction:JA[_u.key],factor:_u.shiftKey?4:1})}},cu=()=>{if(Q||!O.current?.matches(":focus-visible"))return;let{transform:_u,width:Fu,height:zu,autoPanOnNodeFocus:Wu,setCenter:C}=D.getState();if(!Wu)return;if(!(uA(new Map([[u,N]]),{x:0,y:0,width:Fu,height:zu},_u,!0).length>0))C(N.position.x+v.width/2,N.position.y+v.height/2,{zoom:_u[2]})};return ru.jsx("div",{className:Xl(["react-flow__node",`react-flow__node-${Z}`,{[J]:E},N.className,{selected:N.selected,selectable:V,parent:G,draggable:E,dragging:Y}]),ref:O,style:{zIndex:w.z,transform:`translate(${w.positionAbsolute.x}px,${w.positionAbsolute.y}px)`,pointerEvents:P?"all":"none",visibility:X?"visible":"hidden",...N.style,...z},"data-id":u,"data-testid":`rf__node-${u}`,onMouseEnter:k,onMouseMove:I,onMouseLeave:b,onContextMenu:d,onClick:x,onDoubleClick:g,onKeyDown:B?lu:void 0,tabIndex:B?0:void 0,onFocus:B?cu:void 0,role:N.ariaRole??(B?"group":void 0),"aria-roledescription":"node","aria-describedby":Q?void 0:`${Pw}-${W}`,"aria-label":N.ariaLabel,...N.domAttributes,children:ru.jsx(yD,{value:u,children:ru.jsx(H,{id:u,data:N.data,type:Z,positionAbsoluteX:w.positionAbsolute.x,positionAbsoluteY:w.positionAbsolute.y,selected:N.selected??!1,selectable:V,draggable:E,deletable:N.deletable??!0,isConnectable:S,sourcePosition:N.sourcePosition,targetPosition:N.targetPosition,dragging:Y,dragHandle:N.dragHandle,zIndex:w.z,parentId:N.parentId,...v})})})}var ED=tu.memo(zD),OD=(u)=>({nodesDraggable:u.nodesDraggable,nodesConnectable:u.nodesConnectable,nodesFocusable:u.nodesFocusable,elementsSelectable:u.elementsSelectable,onError:u.onError});function gw(u){let{nodesDraggable:l,nodesConnectable:f,nodesFocusable:r,elementsSelectable:n,onError:i}=il(OD,zl),t=LD(u.onlyRenderVisibleElements),y=KD();return ru.jsx("div",{className:"react-flow__nodes",style:qA,children:t.map((c)=>{return ru.jsx(ED,{id:c,nodeTypes:u.nodeTypes,nodeExtent:u.nodeExtent,onClick:u.onNodeClick,onMouseEnter:u.onNodeMouseEnter,onMouseMove:u.onNodeMouseMove,onMouseLeave:u.onNodeMouseLeave,onContextMenu:u.onNodeContextMenu,onDoubleClick:u.onNodeDoubleClick,noDragClassName:u.noDragClassName,noPanClassName:u.noPanClassName,rfId:u.rfId,disableKeyboardA11y:u.disableKeyboardA11y,resizeObserver:y,nodesDraggable:l,nodesConnectable:f,nodesFocusable:r,elementsSelectable:n,nodeClickDistance:u.nodeClickDistance,onError:i},c)})})}gw.displayName="NodeRenderer";var ZD=tu.memo(gw);function HD(u){return il(tu.useCallback((f)=>{if(!u)return f.edges.map((n)=>n.id);let r=[];if(f.width&&f.height)for(let n of f.edges){let i=f.nodeLookup.get(n.source),t=f.nodeLookup.get(n.target);if(i&&t&&pq({sourceNode:i,targetNode:t,width:f.width,height:f.height,transform:f.transform}))r.push(n.id)}return r},[u]),zl)}var BD=({color:u="none",strokeWidth:l=1})=>{let f={strokeWidth:l,...u&&{stroke:u}};return ru.jsx("polyline",{className:"arrow",style:f,strokeLinecap:"round",fill:"none",strokeLinejoin:"round",points:"-5,-4 0,0 -5,4"})},mD=({color:u="none",strokeWidth:l=1})=>{let f={strokeWidth:l,...u&&{stroke:u,fill:u}};return ru.jsx("polyline",{className:"arrowclosed",style:f,strokeLinecap:"round",strokeLinejoin:"round",points:"-5,-4 0,0 -5,4 -5,-4"})},Zw={[x0.Arrow]:BD,[x0.ArrowClosed]:mD};function VD(u){let l=Ol();return tu.useMemo(()=>{if(!Object.prototype.hasOwnProperty.call(Zw,u))return l.getState().onError?.("009",Qr.error009(u)),null;return Zw[u]},[u])}var DD=({id:u,type:l,color:f,width:r=12.5,height:n=12.5,markerUnits:i="strokeWidth",strokeWidth:t,orient:y="auto-start-reverse"})=>{let c=VD(l);if(!c)return null;return ru.jsx("marker",{className:"react-flow__arrowhead",id:u,markerWidth:`${r}`,markerHeight:`${n}`,viewBox:"-10 -10 20 20",markerUnits:i,orient:y,refX:"0",refY:"0",children:ru.jsx(c,{color:f,strokeWidth:t})})},sw=({defaultColor:u,rfId:l})=>{let f=il((i)=>i.edges),r=il((i)=>i.defaultEdgeOptions),n=tu.useMemo(()=>{return Xq(f,{id:l,defaultColor:u,defaultMarkerStart:r?.markerStart,defaultMarkerEnd:r?.markerEnd})},[f,r,l,u]);if(!n.length)return null;return ru.jsx("svg",{className:"react-flow__marker","aria-hidden":"true",children:ru.jsx("defs",{children:n.map((i)=>ru.jsx(DD,{id:i.id,type:i.type,color:i.color,width:i.width,height:i.height,markerUnits:i.markerUnits,strokeWidth:i.strokeWidth,orient:i.orient},i.id))})})};sw.displayName="MarkerDefinitions";var pD=tu.memo(sw);function aw({x:u,y:l,label:f,labelStyle:r,labelShowBg:n=!0,labelBgStyle:i,labelBgPadding:t=[2,4],labelBgBorderRadius:y=2,children:c,className:$,...A}){let[j,F]=tu.useState({x:1,y:0,width:0,height:0}),J=Xl(["react-flow__edge-textwrapper",$]),Q=tu.useRef(null);if(tu.useEffect(()=>{if(Q.current){let W=Q.current.getBBox();F({x:W.x,y:W.y,width:W.width,height:W.height})}},[f]),!f)return null;return ru.jsxs("g",{transform:`translate(${u-j.width/2} ${l-j.height/2})`,className:J,visibility:j.width?"visible":"hidden",...A,children:[n&&ru.jsx("rect",{width:j.width+2*t[0],x:-t[0],y:-t[1],height:j.height+2*t[1],className:"react-flow__edge-textbg",style:i,rx:y,ry:y}),ru.jsx("text",{className:"react-flow__edge-text",y:j.height/2,dy:"0.3em",ref:Q,style:r,children:f}),c]})}aw.displayName="EdgeText";var SD=tu.memo(aw);function Ly({path:u,labelX:l,labelY:f,label:r,labelStyle:n,labelShowBg:i,labelBgStyle:t,labelBgPadding:y,labelBgBorderRadius:c,interactionWidth:$=20,...A}){return ru.jsxs(ru.Fragment,{children:[ru.jsx("path",{...A,d:u,fill:"none",className:Xl(["react-flow__edge-path",A.className])}),$?ru.jsx("path",{d:u,fill:"none",strokeOpacity:0,strokeWidth:$,className:"react-flow__edge-interaction"}):null,r&&Br(l)&&Br(f)?ru.jsx(SD,{x:l,y:f,label:r,labelStyle:n,labelShowBg:i,labelBgStyle:t,labelBgPadding:y,labelBgBorderRadius:c}):null]})}function Hw({pos:u,x1:l,y1:f,x2:r,y2:n}){if(u===Ku.Left||u===Ku.Right)return[0.5*(l+r),f];return[l,0.5*(f+n)]}function ow({sourceX:u,sourceY:l,sourcePosition:f=Ku.Bottom,targetX:r,targetY:n,targetPosition:i=Ku.Top}){let[t,y]=Hw({pos:f,x1:u,y1:l,x2:r,y2:n}),[c,$]=Hw({pos:i,x1:r,y1:n,x2:u,y2:l}),[A,j,F,J]=nA({sourceX:u,sourceY:l,targetX:r,targetY:n,sourceControlX:t,sourceControlY:y,targetControlX:c,targetControlY:$});return[`M${u},${l} C${t},${y} ${c},${$} ${r},${n}`,A,j,F,J]}function dw(u){return tu.memo(({id:l,sourceX:f,sourceY:r,targetX:n,targetY:i,sourcePosition:t,targetPosition:y,label:c,labelStyle:$,labelShowBg:A,labelBgStyle:j,labelBgPadding:F,labelBgBorderRadius:J,style:Q,markerEnd:W,markerStart:L,interactionWidth:U})=>{let[q,N,w]=ow({sourceX:f,sourceY:r,sourcePosition:t,targetX:n,targetY:i,targetPosition:y}),G=u.isInternal?void 0:l;return ru.jsx(Ly,{id:G,path:q,labelX:N,labelY:w,label:c,labelStyle:$,labelShowBg:A,labelBgStyle:j,labelBgPadding:F,labelBgBorderRadius:J,style:Q,markerEnd:W,markerStart:L,interactionWidth:U})})}var XD=dw({isInternal:!1}),ew=dw({isInternal:!0});XD.displayName="SimpleBezierEdge";ew.displayName="SimpleBezierEdgeInternal";function uW(u){return tu.memo(({id:l,sourceX:f,sourceY:r,targetX:n,targetY:i,label:t,labelStyle:y,labelShowBg:c,labelBgStyle:$,labelBgPadding:A,labelBgBorderRadius:j,style:F,sourcePosition:J=Ku.Bottom,targetPosition:Q=Ku.Top,markerEnd:W,markerStart:L,pathOptions:U,interactionWidth:q})=>{let[N,w,G]=Sc({sourceX:f,sourceY:r,sourcePosition:J,targetX:n,targetY:i,targetPosition:Q,borderRadius:U?.borderRadius,offset:U?.offset,stepPosition:U?.stepPosition}),Z=u.isInternal?void 0:l;return ru.jsx(Ly,{id:Z,path:N,labelX:w,labelY:G,label:t,labelStyle:y,labelShowBg:c,labelBgStyle:$,labelBgPadding:A,labelBgBorderRadius:j,style:F,markerEnd:W,markerStart:L,interactionWidth:q})})}var lW=uW({isInternal:!1}),fW=uW({isInternal:!0});lW.displayName="SmoothStepEdge";fW.displayName="SmoothStepEdgeInternal";function rW(u){return tu.memo(({id:l,...f})=>{let r=u.isInternal?void 0:l;return ru.jsx(lW,{...f,id:r,pathOptions:tu.useMemo(()=>({borderRadius:0,offset:f.pathOptions?.offset}),[f.pathOptions?.offset])})})}var YD=rW({isInternal:!1}),nW=rW({isInternal:!0});YD.displayName="StepEdge";nW.displayName="StepEdgeInternal";function iW(u){return tu.memo(({id:l,sourceX:f,sourceY:r,targetX:n,targetY:i,label:t,labelStyle:y,labelShowBg:c,labelBgStyle:$,labelBgPadding:A,labelBgBorderRadius:j,style:F,markerEnd:J,markerStart:Q,interactionWidth:W})=>{let[L,U,q]=tA({sourceX:f,sourceY:r,targetX:n,targetY:i}),N=u.isInternal?void 0:l;return ru.jsx(Ly,{id:N,path:L,labelX:U,labelY:q,label:t,labelStyle:y,labelShowBg:c,labelBgStyle:$,labelBgPadding:A,labelBgBorderRadius:j,style:F,markerEnd:J,markerStart:Q,interactionWidth:W})})}var PD=iW({isInternal:!1}),tW=iW({isInternal:!0});PD.displayName="StraightEdge";tW.displayName="StraightEdgeInternal";function yW(u){return tu.memo(({id:l,sourceX:f,sourceY:r,targetX:n,targetY:i,sourcePosition:t=Ku.Bottom,targetPosition:y=Ku.Top,label:c,labelStyle:$,labelShowBg:A,labelBgStyle:j,labelBgPadding:F,labelBgBorderRadius:J,style:Q,markerEnd:W,markerStart:L,pathOptions:U,interactionWidth:q})=>{let[N,w,G]=iA({sourceX:f,sourceY:r,sourcePosition:t,targetX:n,targetY:i,targetPosition:y,curvature:U?.curvature}),Z=u.isInternal?void 0:l;return ru.jsx(Ly,{id:Z,path:N,labelX:w,labelY:G,label:c,labelStyle:$,labelShowBg:A,labelBgStyle:j,labelBgPadding:F,labelBgBorderRadius:J,style:Q,markerEnd:W,markerStart:L,interactionWidth:q})})}var CD=yW({isInternal:!1}),cW=yW({isInternal:!0});CD.displayName="BezierEdge";cW.displayName="BezierEdgeInternal";var Bw={default:cW,straight:tW,step:nW,smoothstep:fW,simplebezier:ew},mw={sourceX:null,sourceY:null,targetX:null,targetY:null,sourcePosition:null,targetPosition:null},MD=(u,l,f)=>{if(f===Ku.Left)return u-l;if(f===Ku.Right)return u+l;return u},RD=(u,l,f)=>{if(f===Ku.Top)return u-l;if(f===Ku.Bottom)return u+l;return u},Vw="react-flow__edgeupdater";function Dw({position:u,centerX:l,centerY:f,radius:r=10,onMouseDown:n,onMouseEnter:i,onMouseOut:t,type:y}){return ru.jsx("circle",{onMouseDown:n,onMouseEnter:i,onMouseOut:t,className:Xl([Vw,`${Vw}-${y}`]),cx:MD(l,r,u),cy:RD(f,r,u),r,stroke:"transparent",fill:"transparent"})}function hD({isReconnectable:u,reconnectRadius:l,edge:f,sourceX:r,sourceY:n,targetX:i,targetY:t,sourcePosition:y,targetPosition:c,onReconnect:$,onReconnectStart:A,onReconnectEnd:j,setReconnecting:F,setUpdateHover:J}){let Q=Ol(),W=(w,G)=>{if(w.button!==0)return;let{autoPanOnConnect:Z,domNode:H,connectionMode:E,connectionRadius:V,lib:S,onConnectStart:B,cancelConnection:D,nodeLookup:X,rfId:O,panBy:Y,updateConnection:p}=Q.getState(),v=G.type==="target",z=(I,b)=>{F(!1),j?.(I,f,G.type,b)},P=(I)=>$?.(f,I),k=(I,b)=>{F(!0),A?.(w,f,G.type),B?.(I,b)};$A.onPointerDown(w.nativeEvent,{autoPanOnConnect:Z,connectionMode:E,connectionRadius:V,domNode:H,handleId:G.id,nodeId:G.nodeId,nodeLookup:X,isTarget:v,edgeUpdaterType:G.type,lib:S,flowId:O,cancelConnection:D,panBy:Y,isValidConnection:(...I)=>Q.getState().isValidConnection?.(...I)??!0,onConnect:P,onConnectStart:k,onConnectEnd:(...I)=>Q.getState().onConnectEnd?.(...I),onReconnectEnd:z,updateConnection:p,getTransform:()=>Q.getState().transform,getFromHandle:()=>Q.getState().connection.fromHandle,dragThreshold:Q.getState().connectionDragThreshold,handleDomNode:w.currentTarget})},L=(w)=>W(w,{nodeId:f.target,id:f.targetHandle??null,type:"target"}),U=(w)=>W(w,{nodeId:f.source,id:f.sourceHandle??null,type:"source"}),q=()=>J(!0),N=()=>J(!1);return ru.jsxs(ru.Fragment,{children:[(u===!0||u==="source")&&ru.jsx(Dw,{position:y,centerX:r,centerY:n,radius:l,onMouseDown:L,onMouseEnter:q,onMouseOut:N,type:"source"}),(u===!0||u==="target")&&ru.jsx(Dw,{position:c,centerX:i,centerY:t,radius:l,onMouseDown:U,onMouseEnter:q,onMouseOut:N,type:"target"})]})}function xD({id:u,edgesFocusable:l,edgesReconnectable:f,elementsSelectable:r,onClick:n,onDoubleClick:i,onContextMenu:t,onMouseEnter:y,onMouseMove:c,onMouseLeave:$,reconnectRadius:A,onReconnect:j,onReconnectStart:F,onReconnectEnd:J,rfId:Q,edgeTypes:W,noPanClassName:L,onError:U,disableKeyboardA11y:q}){let N=il((C)=>C.edgeLookup.get(u)),w=il((C)=>C.defaultEdgeOptions);N=w?{...w,...N}:N;let G=N.type||"default",Z=W?.[G]||Bw[G];if(Z===void 0)U?.("011",Qr.error011(G)),G="default",Z=W?.default||Bw.default;let H=!!(N.focusable||l&&typeof N.focusable>"u"),E=typeof j<"u"&&(N.reconnectable||f&&typeof N.reconnectable>"u"),V=!!(N.selectable||r&&typeof N.selectable>"u"),S=tu.useRef(null),[B,D]=tu.useState(!1),[X,O]=tu.useState(!1),Y=Ol(),{zIndex:p,sourceX:v,sourceY:z,targetX:P,targetY:k,sourcePosition:I,targetPosition:b}=il(tu.useCallback((C)=>{let e=C.nodeLookup.get(N.source),uu=C.nodeLookup.get(N.target);if(!e||!uu)return{zIndex:N.zIndex,...mw};let Gu=Sq({id:u,sourceNode:e,targetNode:uu,sourceHandle:N.sourceHandle||null,targetHandle:N.targetHandle||null,connectionMode:C.connectionMode,onError:U});return{zIndex:Dq({selected:N.selected,zIndex:N.zIndex,sourceNode:e,targetNode:uu,elevateOnSelect:C.elevateEdgesOnSelect,zIndexMode:C.zIndexMode}),...Gu||mw}},[N.source,N.target,N.sourceHandle,N.targetHandle,N.selected,N.zIndex]),zl),d=tu.useMemo(()=>N.markerStart?`url('#${yA(N.markerStart,Q)}')`:void 0,[N.markerStart,Q]),g=tu.useMemo(()=>N.markerEnd?`url('#${yA(N.markerEnd,Q)}')`:void 0,[N.markerEnd,Q]);if(N.hidden||v===null||z===null||P===null||k===null)return null;let x=(C)=>{let{addSelectedEdges:e,unselectNodesAndEdges:uu,multiSelectionActive:Gu}=Y.getState();if(V)if(Y.setState({nodesSelectionActive:!1}),N.selected&&Gu)uu({nodes:[],edges:[N]}),S.current?.blur();else e([u]);if(n)n(C,N)},lu=i?(C)=>{i(C,{...N})}:void 0,cu=t?(C)=>{t(C,{...N})}:void 0,_u=y?(C)=>{y(C,{...N})}:void 0,Fu=c?(C)=>{c(C,{...N})}:void 0,zu=$?(C)=>{$(C,{...N})}:void 0,Wu=(C)=>{if(!q&&e5.includes(C.key)&&V){let{unselectNodesAndEdges:e,addSelectedEdges:uu}=Y.getState();if(C.key==="Escape")S.current?.blur(),e({edges:[N]});else uu([u])}};return ru.jsx("svg",{style:{zIndex:p},children:ru.jsxs("g",{className:Xl(["react-flow__edge",`react-flow__edge-${G}`,N.className,L,{selected:N.selected,animated:N.animated,inactive:!V&&!n,updating:B,selectable:V}]),onClick:x,onDoubleClick:lu,onContextMenu:cu,onMouseEnter:_u,onMouseMove:Fu,onMouseLeave:zu,onKeyDown:H?Wu:void 0,tabIndex:H?0:void 0,role:N.ariaRole??(H?"group":"img"),"aria-roledescription":"edge","data-id":u,"data-testid":`rf__edge-${u}`,"aria-label":N.ariaLabel===null?void 0:N.ariaLabel||`Edge from ${N.source} to ${N.target}`,"aria-describedby":H?`${Cw}-${Q}`:void 0,ref:S,...N.domAttributes,children:[!X&&ru.jsx(Z,{id:u,source:N.source,target:N.target,type:N.type,selected:N.selected,animated:N.animated,selectable:V,deletable:N.deletable??!0,label:N.label,labelStyle:N.labelStyle,labelShowBg:N.labelShowBg,labelBgStyle:N.labelBgStyle,labelBgPadding:N.labelBgPadding,labelBgBorderRadius:N.labelBgBorderRadius,sourceX:v,sourceY:z,targetX:P,targetY:k,sourcePosition:I,targetPosition:b,data:N.data,style:N.style,sourceHandleId:N.sourceHandle,targetHandleId:N.targetHandle,markerStart:d,markerEnd:g,pathOptions:"pathOptions"in N?N.pathOptions:void 0,interactionWidth:N.interactionWidth}),E&&ru.jsx(hD,{edge:N,isReconnectable:E,reconnectRadius:A,onReconnect:j,onReconnectStart:F,onReconnectEnd:J,sourceX:v,sourceY:z,targetX:P,targetY:k,sourcePosition:I,targetPosition:b,setUpdateHover:D,setReconnecting:O})]})})}var bD=tu.memo(xD),vD=(u)=>({edgesFocusable:u.edgesFocusable,edgesReconnectable:u.edgesReconnectable,elementsSelectable:u.elementsSelectable,connectionMode:u.connectionMode,onError:u.onError});function _W({defaultMarkerColor:u,onlyRenderVisibleElements:l,rfId:f,edgeTypes:r,noPanClassName:n,onReconnect:i,onEdgeContextMenu:t,onEdgeMouseEnter:y,onEdgeMouseMove:c,onEdgeMouseLeave:$,onEdgeClick:A,reconnectRadius:j,onEdgeDoubleClick:F,onReconnectStart:J,onReconnectEnd:Q,disableKeyboardA11y:W}){let{edgesFocusable:L,edgesReconnectable:U,elementsSelectable:q,onError:N}=il(vD,zl),w=HD(l);return ru.jsxs("div",{className:"react-flow__edges",children:[ru.jsx(pD,{defaultColor:u,rfId:f}),w.map((G)=>{return ru.jsx(bD,{id:G,edgesFocusable:L,edgesReconnectable:U,elementsSelectable:q,noPanClassName:n,onReconnect:i,onContextMenu:t,onMouseEnter:y,onMouseMove:c,onMouseLeave:$,onClick:A,reconnectRadius:j,onDoubleClick:F,onReconnectStart:J,onReconnectEnd:Q,rfId:f,onError:N,edgeTypes:r,disableKeyboardA11y:W},G)})]})}_W.displayName="EdgeRenderer";var kD=tu.memo(_W),ID=(u)=>`translate(${u.transform[0]}px,${u.transform[1]}px) scale(${u.transform[2]})`;function gD({children:u}){let l=il(ID);return ru.jsx("div",{className:"react-flow__viewport xyflow__viewport react-flow__container",style:{transform:l},children:u})}function sD(u){let l=H9(),f=tu.useRef(!1);tu.useEffect(()=>{if(!f.current&&l.viewportInitialized&&u)setTimeout(()=>u(l),1),f.current=!0},[u,l.viewportInitialized])}var aD=(u)=>u.panZoom?.syncViewport;function oD(u){let l=il(aD),f=Ol();return tu.useEffect(()=>{if(u)l?.(u),f.setState({transform:[u.x,u.y,u.zoom]})},[u,l]),null}function pw(u){return u.connection.inProgress?{...u.connection,to:Ny(u.connection.to,u.transform)}:{...u.connection}}function dD(u){if(u)return(f)=>{let r=pw(f);return u(r)};return pw}function eD(u){let l=dD(u);return il(l,zl)}var up=(u)=>({nodesConnectable:u.nodesConnectable,isValid:u.connection.isValid,inProgress:u.connection.inProgress,width:u.width,height:u.height});function lp({containerStyle:u,style:l,type:f,component:r}){let{nodesConnectable:n,width:i,height:t,isValid:y,inProgress:c}=il(up,zl);if(!(i&&n&&c))return null;return ru.jsx("svg",{style:u,width:i,height:t,className:"react-flow__connectionline react-flow__container",children:ru.jsx("g",{className:Xl(["react-flow__connection",f9(y)]),children:ru.jsx($W,{style:l,type:f,CustomComponent:r,isValid:y})})})}var $W=({style:u,type:l=Nn.Bezier,CustomComponent:f,isValid:r})=>{let{inProgress:n,from:i,fromNode:t,fromHandle:y,fromPosition:c,to:$,toNode:A,toHandle:j,toPosition:F,pointer:J}=eD();if(!n)return;if(f)return ru.jsx(f,{connectionLineType:l,connectionLineStyle:u,fromNode:t,fromHandle:y,fromX:i.x,fromY:i.y,toX:$.x,toY:$.y,fromPosition:c,toPosition:F,connectionStatus:f9(r),toNode:A,toHandle:j,pointer:J});let Q="",W={sourceX:i.x,sourceY:i.y,sourcePosition:c,targetX:$.x,targetY:$.y,targetPosition:F};switch(l){case Nn.Bezier:[Q]=iA(W);break;case Nn.SimpleBezier:[Q]=ow(W);break;case Nn.Step:[Q]=Sc({...W,borderRadius:0});break;case Nn.SmoothStep:[Q]=Sc(W);break;default:[Q]=tA(W)}return ru.jsx("path",{d:Q,fill:"none",className:"react-flow__connection-path",style:u})};$W.displayName="ConnectionLine";var fp={};function Sw(u=fp){let l=tu.useRef(u),f=Ol();tu.useEffect(()=>{},[u])}function rp(){let u=Ol(),l=tu.useRef(!1);tu.useEffect(()=>{},[])}function AW({nodeTypes:u,edgeTypes:l,onInit:f,onNodeClick:r,onEdgeClick:n,onNodeDoubleClick:i,onEdgeDoubleClick:t,onNodeMouseEnter:y,onNodeMouseMove:c,onNodeMouseLeave:$,onNodeContextMenu:A,onSelectionContextMenu:j,onSelectionStart:F,onSelectionEnd:J,connectionLineType:Q,connectionLineStyle:W,connectionLineComponent:L,connectionLineContainerStyle:U,selectionKeyCode:q,selectionOnDrag:N,selectionMode:w,multiSelectionKeyCode:G,panActivationKeyCode:Z,zoomActivationKeyCode:H,deleteKeyCode:E,onlyRenderVisibleElements:V,elementsSelectable:S,defaultViewport:B,translateExtent:D,minZoom:X,maxZoom:O,preventScrolling:Y,defaultMarkerColor:p,zoomOnScroll:v,zoomOnPinch:z,panOnScroll:P,panOnScrollSpeed:k,panOnScrollMode:I,zoomOnDoubleClick:b,panOnDrag:d,onPaneClick:g,onPaneMouseEnter:x,onPaneMouseMove:lu,onPaneMouseLeave:cu,onPaneScroll:_u,onPaneContextMenu:Fu,paneClickDistance:zu,nodeClickDistance:Wu,onEdgeContextMenu:C,onEdgeMouseEnter:e,onEdgeMouseMove:uu,onEdgeMouseLeave:Gu,reconnectRadius:s,onReconnect:qu,onReconnectStart:Zu,onReconnectEnd:Bu,noDragClassName:Iu,noWheelClassName:ll,noPanClassName:Pu,disableKeyboardA11y:Jl,nodeExtent:Jf,rfId:Of,viewport:yf,onViewportChange:lf}){return Sw(u),Sw(l),rp(),sD(f),oD(yf),ru.jsx(wD,{onPaneClick:g,onPaneMouseEnter:x,onPaneMouseMove:lu,onPaneMouseLeave:cu,onPaneContextMenu:Fu,onPaneScroll:_u,paneClickDistance:zu,deleteKeyCode:E,selectionKeyCode:q,selectionOnDrag:N,selectionMode:w,onSelectionStart:F,onSelectionEnd:J,multiSelectionKeyCode:G,panActivationKeyCode:Z,zoomActivationKeyCode:H,elementsSelectable:S,zoomOnScroll:v,zoomOnPinch:z,zoomOnDoubleClick:b,panOnScroll:P,panOnScrollSpeed:k,panOnScrollMode:I,panOnDrag:d,defaultViewport:B,translateExtent:D,minZoom:X,maxZoom:O,onSelectionContextMenu:j,preventScrolling:Y,noDragClassName:Iu,noWheelClassName:ll,noPanClassName:Pu,disableKeyboardA11y:Jl,onViewportChange:lf,isControlledViewport:!!yf,children:ru.jsxs(gD,{children:[ru.jsx(kD,{edgeTypes:l,onEdgeClick:n,onEdgeDoubleClick:t,onReconnect:qu,onReconnectStart:Zu,onReconnectEnd:Bu,onlyRenderVisibleElements:V,onEdgeContextMenu:C,onEdgeMouseEnter:e,onEdgeMouseMove:uu,onEdgeMouseLeave:Gu,reconnectRadius:s,defaultMarkerColor:p,noPanClassName:Pu,disableKeyboardA11y:Jl,rfId:Of}),ru.jsx(lp,{style:W,type:Q,component:L,containerStyle:U}),ru.jsx("div",{className:"react-flow__edgelabel-renderer"}),ru.jsx(ZD,{nodeTypes:u,onNodeClick:r,onNodeDoubleClick:i,onNodeMouseEnter:y,onNodeMouseMove:c,onNodeMouseLeave:$,onNodeContextMenu:A,nodeClickDistance:Wu,onlyRenderVisibleElements:V,noPanClassName:Pu,noDragClassName:Iu,disableKeyboardA11y:Jl,nodeExtent:Jf,rfId:Of}),ru.jsx("div",{className:"react-flow__viewport-portal"})]})})}AW.displayName="GraphView";var np=tu.memo(AW),Xw=({nodes:u,edges:l,defaultNodes:f,defaultEdges:r,width:n,height:i,fitView:t,fitViewOptions:y,minZoom:c=0.5,maxZoom:$=2,nodeOrigin:A,nodeExtent:j,zIndexMode:F="basic"}={})=>{let J=new Map,Q=new Map,W=new Map,L=new Map,U=r??l??[],q=f??u??[],N=A??[0,0],w=j??Fy;T9(W,L,U);let{nodesInitialized:G}=cA(q,J,Q,{nodeOrigin:N,nodeExtent:w,zIndexMode:F}),Z=[0,0,1];if(t&&n&&i){let H=Uy(J,{filter:(B)=>!!((B.width||B.initialWidth)&&(B.height||B.initialHeight))}),{x:E,y:V,zoom:S}=pc(H,n,i,c,$,y?.padding??0.1);Z=[E,V,S]}return{rfId:"1",width:n??0,height:i??0,transform:Z,nodes:q,nodesInitialized:G,nodeLookup:J,parentLookup:Q,edges:U,edgeLookup:L,connectionLookup:W,onNodesChange:null,onEdgesChange:null,hasDefaultNodes:f!==void 0,hasDefaultEdges:r!==void 0,panZoom:null,minZoom:c,maxZoom:$,translateExtent:Fy,nodeExtent:w,nodesSelectionActive:!1,userSelectionActive:!1,userSelectionRect:null,connectionMode:h0.Strict,domNode:null,paneDragging:!1,noPanClassName:"nopan",nodeOrigin:N,nodeDragThreshold:1,connectionDragThreshold:1,snapGrid:[15,15],snapToGrid:!1,nodesDraggable:!0,nodesConnectable:!0,nodesFocusable:!0,edgesFocusable:!0,edgesReconnectable:!0,elementsSelectable:!0,elevateNodesOnSelect:!0,elevateEdgesOnSelect:!0,selectNodesOnDrag:!0,multiSelectionActive:!1,fitViewQueued:t??!1,fitViewOptions:y,fitViewResolver:null,connection:{...l9},connectionClickStartHandle:null,connectOnClick:!0,ariaLiveMessage:"",autoPanOnConnect:!0,autoPanOnNodeDrag:!0,autoPanOnNodeFocus:!0,autoPanSpeed:15,connectionRadius:20,onError:_9,isValidConnection:void 0,onSelectionChangeHandlers:[],lib:"react",debug:!1,ariaLabelConfig:u9,zIndexMode:F,onNodesChangeMiddlewareMap:new Map,onEdgesChangeMiddlewareMap:new Map}},ip=({nodes:u,edges:l,defaultNodes:f,defaultEdges:r,width:n,height:i,fitView:t,fitViewOptions:y,minZoom:c,maxZoom:$,nodeOrigin:A,nodeExtent:j,zIndexMode:F})=>Fw((J,Q)=>{async function W(){let{nodeLookup:L,panZoom:U,fitViewOptions:q,fitViewResolver:N,width:w,height:G,minZoom:Z,maxZoom:H}=Q();if(!U)return;await Oq({nodes:L,width:w,height:G,panZoom:U,minZoom:Z,maxZoom:H},q),N?.resolve(!0),J({fitViewResolver:null})}return{...Xw({nodes:u,edges:l,width:n,height:i,fitView:t,fitViewOptions:y,minZoom:c,maxZoom:$,nodeOrigin:A,nodeExtent:j,defaultNodes:f,defaultEdges:r,zIndexMode:F}),setNodes:(L)=>{let{nodeLookup:U,parentLookup:q,nodeOrigin:N,elevateNodesOnSelect:w,fitViewQueued:G,zIndexMode:Z,nodesSelectionActive:H}=Q(),{nodesInitialized:E,hasSelectedNodes:V}=cA(L,U,q,{nodeOrigin:N,nodeExtent:j,elevateNodesOnSelect:w,checkEquality:!0,zIndexMode:Z}),S=H&&V;if(G&&E)W(),J({nodes:L,nodesInitialized:E,fitViewQueued:!1,fitViewOptions:void 0,nodesSelectionActive:S});else J({nodes:L,nodesInitialized:E,nodesSelectionActive:S})},setEdges:(L)=>{let{connectionLookup:U,edgeLookup:q}=Q();T9(U,q,L),J({edges:L})},setDefaultNodesAndEdges:(L,U)=>{if(L){let{setNodes:q}=Q();q(L),J({hasDefaultNodes:!0})}if(U){let{setEdges:q}=Q();q(U),J({hasDefaultEdges:!0})}},updateNodeInternals:(L)=>{let{triggerNodeChanges:U,nodeLookup:q,parentLookup:N,domNode:w,nodeOrigin:G,nodeExtent:Z,debug:H,fitViewQueued:E,zIndexMode:V}=Q(),{changes:S,updatedInternals:B}=Mq(L,q,N,w,G,Z,V);if(!B)return;if(Pq(q,N,{nodeOrigin:G,nodeExtent:Z,zIndexMode:V}),E)W(),J({fitViewQueued:!1,fitViewOptions:void 0});else J({});if(S?.length>0){if(H)console.log("React Flow: trigger node changes",S);U?.(S)}},updateNodePositions:(L,U=!1)=>{let q=[],N=[],{nodeLookup:w,triggerNodeChanges:G,connection:Z,updateConnection:H,onNodesChangeMiddlewareMap:E}=Q();for(let[V,S]of L){let B=w.get(V),D=!!(B?.expandParent&&B?.parentId&&S?.position),X={id:V,type:"position",position:D?{x:Math.max(0,S.position.x),y:Math.max(0,S.position.y)}:S.position,dragging:U};if(B&&Z.inProgress&&Z.fromNode.id===B.id){let O=b0(B,Z.fromHandle,Ku.Left,!0);H({...Z,from:O})}if(D&&B.parentId)q.push({id:V,parentId:B.parentId,rect:{...S.internals.positionAbsolute,width:S.measured.width??0,height:S.measured.height??0}});N.push(X)}if(q.length>0){let{parentLookup:V,nodeOrigin:S}=Q(),B=_A(q,w,V,S);N.push(...B)}for(let V of E.values())N=V(N);G(N)},triggerNodeChanges:(L)=>{let{onNodesChange:U,setNodes:q,nodes:N,hasDefaultNodes:w,debug:G}=Q();if(L?.length){if(w){let Z=bV(L,N);q(Z)}if(G)console.log("React Flow: trigger node changes",L);U?.(L)}},triggerEdgeChanges:(L)=>{let{onEdgesChange:U,setEdges:q,edges:N,hasDefaultEdges:w,debug:G}=Q();if(L?.length){if(w){let Z=vV(L,N);q(Z)}if(G)console.log("React Flow: trigger edge changes",L);U?.(L)}},addSelectedNodes:(L)=>{let{multiSelectionActive:U,edgeLookup:q,nodeLookup:N,triggerNodeChanges:w,triggerEdgeChanges:G}=Q();if(U){let Z=L.map((H)=>si(H,!0));w(Z);return}w(Wy(N,new Set([...L]),!0)),G(Wy(q))},addSelectedEdges:(L)=>{let{multiSelectionActive:U,edgeLookup:q,nodeLookup:N,triggerNodeChanges:w,triggerEdgeChanges:G}=Q();if(U){let Z=L.map((H)=>si(H,!0));G(Z);return}G(Wy(q,new Set([...L]))),w(Wy(N,new Set,!0))},unselectNodesAndEdges:({nodes:L,edges:U}={})=>{let{edges:q,nodes:N,nodeLookup:w,triggerNodeChanges:G,triggerEdgeChanges:Z}=Q(),H=L?L:N,E=U?U:q,V=[];for(let B of H){if(!B.selected)continue;let D=w.get(B.id);if(D)D.selected=!1;V.push(si(B.id,!1))}let S=[];for(let B of E){if(!B.selected)continue;S.push(si(B.id,!1))}G(V),Z(S)},setMinZoom:(L)=>{let{panZoom:U,maxZoom:q}=Q();U?.setScaleExtent([L,q]),J({minZoom:L})},setMaxZoom:(L)=>{let{panZoom:U,minZoom:q}=Q();U?.setScaleExtent([q,L]),J({maxZoom:L})},setTranslateExtent:(L)=>{Q().panZoom?.setTranslateExtent(L),J({translateExtent:L})},resetSelectedElements:()=>{let{edges:L,nodes:U,triggerNodeChanges:q,triggerEdgeChanges:N,elementsSelectable:w}=Q();if(!w)return;let G=U.reduce((H,E)=>E.selected?[...H,si(E.id,!1)]:H,[]),Z=L.reduce((H,E)=>E.selected?[...H,si(E.id,!1)]:H,[]);q(G),N(Z)},setNodeExtent:(L)=>{let{nodes:U,nodeLookup:q,parentLookup:N,nodeOrigin:w,elevateNodesOnSelect:G,nodeExtent:Z,zIndexMode:H}=Q();if(L[0][0]===Z[0][0]&&L[0][1]===Z[0][1]&&L[1][0]===Z[1][0]&&L[1][1]===Z[1][1])return;cA(U,q,N,{nodeOrigin:w,nodeExtent:L,elevateNodesOnSelect:G,checkEquality:!1,zIndexMode:H}),J({nodeExtent:L})},panBy:(L)=>{let{transform:U,width:q,height:N,panZoom:w,translateExtent:G}=Q();return Rq({delta:L,panZoom:w,transform:U,translateExtent:G,width:q,height:N})},setCenter:async(L,U,q)=>{let{width:N,height:w,maxZoom:G,panZoom:Z}=Q();if(!Z)return Promise.resolve(!1);let H=typeof q?.zoom<"u"?q.zoom:G;return await Z.setViewport({x:N/2-L*H,y:w/2-U*H,zoom:H},{duration:q?.duration,ease:q?.ease,interpolate:q?.interpolate}),Promise.resolve(!0)},cancelConnection:()=>{J({connection:{...l9}})},updateConnection:(L)=>{J({connection:L})},reset:()=>J({...Xw()})}},Object.is);function tp({initialNodes:u,initialEdges:l,defaultNodes:f,defaultEdges:r,initialWidth:n,initialHeight:i,initialMinZoom:t,initialMaxZoom:y,initialFitViewOptions:c,fitView:$,nodeOrigin:A,nodeExtent:j,zIndexMode:F,children:J}){let[Q]=tu.useState(()=>ip({nodes:u,edges:l,defaultNodes:f,defaultEdges:r,width:n,height:i,fitView:$,minZoom:t,maxZoom:y,fitViewOptions:c,nodeOrigin:A,nodeExtent:j,zIndexMode:F}));return ru.jsx(GV,{value:Q,children:ru.jsx(gV,{children:J})})}function yp({children:u,nodes:l,edges:f,defaultNodes:r,defaultEdges:n,width:i,height:t,fitView:y,fitViewOptions:c,minZoom:$,maxZoom:A,nodeOrigin:j,nodeExtent:F,zIndexMode:J}){if(tu.useContext(QA))return ru.jsx(ru.Fragment,{children:u});return ru.jsx(tp,{initialNodes:l,initialEdges:f,defaultNodes:r,defaultEdges:n,initialWidth:i,initialHeight:t,fitView:y,initialFitViewOptions:c,initialMinZoom:$,initialMaxZoom:A,nodeOrigin:j,nodeExtent:F,zIndexMode:J,children:u})}var cp={width:"100%",height:"100%",overflow:"hidden",position:"relative",zIndex:0};function _p({nodes:u,edges:l,defaultNodes:f,defaultEdges:r,className:n,nodeTypes:i,edgeTypes:t,onNodeClick:y,onEdgeClick:c,onInit:$,onMove:A,onMoveStart:j,onMoveEnd:F,onConnect:J,onConnectStart:Q,onConnectEnd:W,onClickConnectStart:L,onClickConnectEnd:U,onNodeMouseEnter:q,onNodeMouseMove:N,onNodeMouseLeave:w,onNodeContextMenu:G,onNodeDoubleClick:Z,onNodeDragStart:H,onNodeDrag:E,onNodeDragStop:V,onNodesDelete:S,onEdgesDelete:B,onDelete:D,onSelectionChange:X,onSelectionDragStart:O,onSelectionDrag:Y,onSelectionDragStop:p,onSelectionContextMenu:v,onSelectionStart:z,onSelectionEnd:P,onBeforeDelete:k,connectionMode:I,connectionLineType:b=Nn.Bezier,connectionLineStyle:d,connectionLineComponent:g,connectionLineContainerStyle:x,deleteKeyCode:lu="Backspace",selectionKeyCode:cu="Shift",selectionOnDrag:_u=!1,selectionMode:Fu=ki.Full,panActivationKeyCode:zu="Space",multiSelectionKeyCode:Wu=qy()?"Meta":"Control",zoomActivationKeyCode:C=qy()?"Meta":"Control",snapToGrid:e,snapGrid:uu,onlyRenderVisibleElements:Gu=!1,selectNodesOnDrag:s,nodesDraggable:qu,autoPanOnNodeFocus:Zu,nodesConnectable:Bu,nodesFocusable:Iu,nodeOrigin:ll=Mw,edgesFocusable:Pu,edgesReconnectable:Jl,elementsSelectable:Jf=!0,defaultViewport:Of=YV,minZoom:yf=0.5,maxZoom:lf=2,translateExtent:Zf=Fy,preventScrolling:Pf=!0,nodeExtent:Au,defaultMarkerColor:au="#b1b1b7",zoomOnScroll:Qf=!0,zoomOnPinch:Yu=!0,panOnScroll:cf=!1,panOnScrollSpeed:_f=0.5,panOnScrollMode:fr=gn.Free,zoomOnDoubleClick:$f=!0,panOnDrag:Hf=!0,onPaneClick:Gn,onPaneMouseEnter:rr,onPaneMouseMove:dn,onPaneMouseLeave:Ql,onPaneScroll:ei,onPaneContextMenu:fu,paneClickDistance:mu=1,nodeClickDistance:Xu=0,children:ou,onReconnect:$l,onReconnectStart:Rl,onReconnectEnd:_l,onEdgeContextMenu:Nf,onEdgeDoubleClick:Xr,onEdgeMouseEnter:my,onEdgeMouseMove:Zl,onEdgeMouseLeave:ec,reconnectRadius:vA=10,onNodesChange:Tl,onEdgesChange:L7,noDragClassName:sl="nodrag",noWheelClassName:nr="nowheel",noPanClassName:ut="nopan",fitView:Vy,fitViewOptions:lt,connectOnClick:u_,attributionPosition:Dy,proOptions:l_,defaultEdgeOptions:Cf,elevateNodesOnSelect:Yr=!0,elevateEdgesOnSelect:f_=!1,disableKeyboardA11y:ft=!1,autoPanOnConnect:py,autoPanOnNodeDrag:r_,autoPanSpeed:fn,connectionRadius:n_,isValidConnection:Pl,onError:kA,style:i_,id:Wr,nodeDragThreshold:ri,connectionDragThreshold:ni,viewport:rt,onViewportChange:ii,width:Sy,height:T7,colorMode:nt="light",debug:K7,onScroll:Xy,ariaLabelConfig:IA,zIndexMode:t_="basic",...gA},en){let u0=Wr||"1",ti=RV(nt),Mf=tu.useCallback((Yy)=>{Yy.currentTarget.scrollTo({top:0,left:0,behavior:"instant"}),Xy?.(Yy)},[Xy]);return ru.jsx("div",{"data-testid":"rf__wrapper",...gA,onScroll:Mf,style:{...i_,...cp},ref:en,className:Xl(["react-flow",n,ti]),id:Wr,role:"application",children:ru.jsxs(yp,{nodes:u,edges:l,width:Sy,height:T7,fitView:Vy,fitViewOptions:lt,minZoom:yf,maxZoom:lf,nodeOrigin:ll,nodeExtent:Au,zIndexMode:t_,children:[ru.jsx(MV,{nodes:u,edges:l,defaultNodes:f,defaultEdges:r,onConnect:J,onConnectStart:Q,onConnectEnd:W,onClickConnectStart:L,onClickConnectEnd:U,nodesDraggable:qu,autoPanOnNodeFocus:Zu,nodesConnectable:Bu,nodesFocusable:Iu,edgesFocusable:Pu,edgesReconnectable:Jl,elementsSelectable:Jf,elevateNodesOnSelect:Yr,elevateEdgesOnSelect:f_,minZoom:yf,maxZoom:lf,nodeExtent:Au,onNodesChange:Tl,onEdgesChange:L7,snapToGrid:e,snapGrid:uu,connectionMode:I,translateExtent:Zf,connectOnClick:u_,defaultEdgeOptions:Cf,fitView:Vy,fitViewOptions:lt,onNodesDelete:S,onEdgesDelete:B,onDelete:D,onNodeDragStart:H,onNodeDrag:E,onNodeDragStop:V,onSelectionDrag:Y,onSelectionDragStart:O,onSelectionDragStop:p,onMove:A,onMoveStart:j,onMoveEnd:F,noPanClassName:ut,nodeOrigin:ll,rfId:u0,autoPanOnConnect:py,autoPanOnNodeDrag:r_,autoPanSpeed:fn,onError:kA,connectionRadius:n_,isValidConnection:Pl,selectNodesOnDrag:s,nodeDragThreshold:ri,connectionDragThreshold:ni,onBeforeDelete:k,debug:K7,ariaLabelConfig:IA,zIndexMode:t_}),ru.jsx(np,{onInit:$,onNodeClick:y,onEdgeClick:c,onNodeMouseEnter:q,onNodeMouseMove:N,onNodeMouseLeave:w,onNodeContextMenu:G,onNodeDoubleClick:Z,nodeTypes:i,edgeTypes:t,connectionLineType:b,connectionLineStyle:d,connectionLineComponent:g,connectionLineContainerStyle:x,selectionKeyCode:cu,selectionOnDrag:_u,selectionMode:Fu,deleteKeyCode:lu,multiSelectionKeyCode:Wu,panActivationKeyCode:zu,zoomActivationKeyCode:C,onlyRenderVisibleElements:Gu,defaultViewport:Of,translateExtent:Zf,minZoom:yf,maxZoom:lf,preventScrolling:Pf,zoomOnScroll:Qf,zoomOnPinch:Yu,zoomOnDoubleClick:$f,panOnScroll:cf,panOnScrollSpeed:_f,panOnScrollMode:fr,panOnDrag:Hf,onPaneClick:Gn,onPaneMouseEnter:rr,onPaneMouseMove:dn,onPaneMouseLeave:Ql,onPaneScroll:ei,onPaneContextMenu:fu,paneClickDistance:mu,nodeClickDistance:Xu,onSelectionContextMenu:v,onSelectionStart:z,onSelectionEnd:P,onReconnect:$l,onReconnectStart:Rl,onReconnectEnd:_l,onEdgeContextMenu:Nf,onEdgeDoubleClick:Xr,onEdgeMouseEnter:my,onEdgeMouseMove:Zl,onEdgeMouseLeave:ec,reconnectRadius:vA,defaultMarkerColor:au,noDragClassName:sl,noWheelClassName:nr,noPanClassName:ut,rfId:u0,disableKeyboardA11y:ft,nodeExtent:Au,viewport:rt,onViewportChange:ii}),ru.jsx(XV,{onSelectionChange:X}),ou,ru.jsx(mV,{proOptions:l_,position:Dy}),ru.jsx(BV,{rfId:u0,disableKeyboardA11y:ft})]})})}var jW=hw(_p);var yv=Qr.error014();function $p({dimensions:u,lineWidth:l,variant:f,className:r}){return ru.jsx("path",{strokeWidth:l,d:`M${u[0]/2} 0 V${u[1]} M0 ${u[1]/2} H${u[0]}`,className:Xl(["react-flow__background-pattern",f,r])})}function Ap({radius:u,className:l}){return ru.jsx("circle",{cx:u,cy:u,r:u,className:Xl(["react-flow__background-pattern","dots",l])})}var k0;(function(u){u.Lines="lines",u.Dots="dots",u.Cross="cross"})(k0||(k0={}));var jp={[k0.Dots]:1,[k0.Lines]:1,[k0.Cross]:6},Fp=(u)=>({transform:u.transform,patternId:`pattern-${u.rfId}`});function FW({id:u,variant:l=k0.Dots,gap:f=20,size:r,lineWidth:n=1,offset:i=0,color:t,bgColor:y,style:c,className:$,patternClassName:A}){let j=tu.useRef(null),{transform:F,patternId:J}=il(Fp,zl),Q=r||jp[l],W=l===k0.Dots,L=l===k0.Cross,U=Array.isArray(f)?f:[f,f],q=[U[0]*F[2]||1,U[1]*F[2]||1],N=Q*F[2],w=Array.isArray(i)?i:[i,i],G=L?[N,N]:q,Z=[w[0]*F[2]||1+G[0]/2,w[1]*F[2]||1+G[1]/2],H=`${J}${u?u:""}`;return ru.jsxs("svg",{className:Xl(["react-flow__background",$]),style:{...c,...qA,"--xy-background-color-props":y,"--xy-background-pattern-color-props":t},ref:j,"data-testid":"rf__background",children:[ru.jsx("pattern",{id:H,x:F[0]%q[0],y:F[1]%q[1],width:q[0],height:q[1],patternUnits:"userSpaceOnUse",patternTransform:`translate(-${Z[0]},-${Z[1]})`,children:W?ru.jsx(Ap,{radius:N/2,className:A}):ru.jsx($p,{dimensions:G,lineWidth:n,variant:l,className:A})}),ru.jsx("rect",{x:"0",y:"0",width:"100%",height:"100%",fill:`url(#${H})`})]})}FW.displayName="Background";var UW=tu.memo(FW);function Up(){return ru.jsx("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 32 32",children:ru.jsx("path",{d:"M32 18.133H18.133V32h-4.266V18.133H0v-4.266h13.867V0h4.266v13.867H32z"})})}function Jp(){return ru.jsx("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 32 5",children:ru.jsx("path",{d:"M0 0h32v4.2H0z"})})}function Qp(){return ru.jsx("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 32 30",children:ru.jsx("path",{d:"M3.692 4.63c0-.53.4-.938.939-.938h5.215V0H4.708C2.13 0 0 2.054 0 4.63v5.216h3.692V4.631zM27.354 0h-5.2v3.692h5.17c.53 0 .984.4.984.939v5.215H32V4.631A4.624 4.624 0 0027.354 0zm.954 24.83c0 .532-.4.94-.939.94h-5.215v3.768h5.215c2.577 0 4.631-2.13 4.631-4.707v-5.139h-3.692v5.139zm-23.677.94c-.531 0-.939-.4-.939-.94v-5.138H0v5.139c0 2.577 2.13 4.707 4.708 4.707h5.138V25.77H4.631z"})})}function Np(){return ru.jsx("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 25 32",children:ru.jsx("path",{d:"M21.333 10.667H19.81V7.619C19.81 3.429 16.38 0 12.19 0 8 0 4.571 3.429 4.571 7.619v3.048H3.048A3.056 3.056 0 000 13.714v15.238A3.056 3.056 0 003.048 32h18.285a3.056 3.056 0 003.048-3.048V13.714a3.056 3.056 0 00-3.048-3.047zM12.19 24.533a3.056 3.056 0 01-3.047-3.047 3.056 3.056 0 013.047-3.048 3.056 3.056 0 013.048 3.048 3.056 3.056 0 01-3.048 3.047zm4.724-13.866H7.467V7.619c0-2.59 2.133-4.724 4.723-4.724 2.591 0 4.724 2.133 4.724 4.724v3.048z"})})}function qp(){return ru.jsx("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 25 32",children:ru.jsx("path",{d:"M21.333 10.667H19.81V7.619C19.81 3.429 16.38 0 12.19 0c-4.114 1.828-1.37 2.133.305 2.438 1.676.305 4.42 2.59 4.42 5.181v3.048H3.047A3.056 3.056 0 000 13.714v15.238A3.056 3.056 0 003.048 32h18.285a3.056 3.056 0 003.048-3.048V13.714a3.056 3.056 0 00-3.048-3.047zM12.19 24.533a3.056 3.056 0 01-3.047-3.047 3.056 3.056 0 013.047-3.048 3.056 3.056 0 013.048 3.048 3.056 3.056 0 01-3.048 3.047z"})})}function UA({children:u,className:l,...f}){return ru.jsx("button",{type:"button",className:Xl(["react-flow__controls-button",l]),...f,children:u})}var wp=(u)=>({isInteractive:u.nodesDraggable||u.nodesConnectable||u.elementsSelectable,minZoomReached:u.transform[2]<=u.minZoom,maxZoomReached:u.transform[2]>=u.maxZoom,ariaLabelConfig:u.ariaLabelConfig});function JW({style:u,showZoom:l=!0,showFitView:f=!0,showInteractive:r=!0,fitViewOptions:n,onZoomIn:i,onZoomOut:t,onFitView:y,onInteractiveChange:c,className:$,children:A,position:j="bottom-left",orientation:F="vertical","aria-label":J}){let Q=Ol(),{isInteractive:W,minZoomReached:L,maxZoomReached:U,ariaLabelConfig:q}=il(wp,zl),{zoomIn:N,zoomOut:w,fitView:G}=H9(),Z=()=>{N(),i?.()},H=()=>{w(),t?.()},E=()=>{G(n),y?.()},V=()=>{Q.setState({nodesDraggable:!W,nodesConnectable:!W,elementsSelectable:!W}),c?.(!W)};return ru.jsxs(NA,{className:Xl(["react-flow__controls",F==="horizontal"?"horizontal":"vertical",$]),position:j,style:u,"data-testid":"rf__controls","aria-label":J??q["controls.ariaLabel"],children:[l&&ru.jsxs(ru.Fragment,{children:[ru.jsx(UA,{onClick:Z,className:"react-flow__controls-zoomin",title:q["controls.zoomIn.ariaLabel"],"aria-label":q["controls.zoomIn.ariaLabel"],disabled:U,children:ru.jsx(Up,{})}),ru.jsx(UA,{onClick:H,className:"react-flow__controls-zoomout",title:q["controls.zoomOut.ariaLabel"],"aria-label":q["controls.zoomOut.ariaLabel"],disabled:L,children:ru.jsx(Jp,{})})]}),f&&ru.jsx(UA,{className:"react-flow__controls-fitview",onClick:E,title:q["controls.fitView.ariaLabel"],"aria-label":q["controls.fitView.ariaLabel"],children:ru.jsx(Qp,{})}),r&&ru.jsx(UA,{className:"react-flow__controls-interactive",onClick:V,title:q["controls.interactive.ariaLabel"],"aria-label":q["controls.interactive.ariaLabel"],children:W?ru.jsx(qp,{}):ru.jsx(Np,{})}),A]})}JW.displayName="Controls";var QW=tu.memo(JW);function Wp({id:u,x:l,y:f,width:r,height:n,style:i,color:t,strokeColor:y,strokeWidth:c,className:$,borderRadius:A,shapeRendering:j,selected:F,onClick:J}){let{background:Q,backgroundColor:W}=i||{},L=t||Q||W;return ru.jsx("rect",{className:Xl(["react-flow__minimap-node",{selected:F},$]),x:l,y:f,rx:A,ry:A,width:r,height:n,style:{fill:L,stroke:y,strokeWidth:c},shapeRendering:j,onClick:J?(U)=>J(U,u):void 0})}var Lp=tu.memo(Wp),Tp=(u)=>u.nodes.map((l)=>l.id),E9=(u)=>u instanceof Function?u:()=>u;function Kp({nodeStrokeColor:u,nodeColor:l,nodeClassName:f="",nodeBorderRadius:r=5,nodeStrokeWidth:n,nodeComponent:i=Lp,onClick:t}){let y=il(Tp,zl),c=E9(l),$=E9(u),A=E9(f),j=typeof window>"u"||!!window.chrome?"crispEdges":"geometricPrecision";return ru.jsx(ru.Fragment,{children:y.map((F)=>ru.jsx(zp,{id:F,nodeColorFunc:c,nodeStrokeColorFunc:$,nodeClassNameFunc:A,nodeBorderRadius:r,nodeStrokeWidth:n,NodeComponent:i,onClick:t,shapeRendering:j},F))})}function Gp({id:u,nodeColorFunc:l,nodeStrokeColorFunc:f,nodeClassNameFunc:r,nodeBorderRadius:n,nodeStrokeWidth:i,shapeRendering:t,NodeComponent:y,onClick:c}){let{node:$,x:A,y:j,width:F,height:J}=il((Q)=>{let W=Q.nodeLookup.get(u);if(!W)return{node:void 0,x:0,y:0,width:0,height:0};let L=W.internals.userNode,{x:U,y:q}=W.internals.positionAbsolute,{width:N,height:w}=qn(L);return{node:L,x:U,y:q,width:N,height:w}},zl);if(!$||$.hidden||!$9($))return null;return ru.jsx(y,{x:A,y:j,width:F,height:J,style:$.style,selected:!!$.selected,className:r($),color:l($),borderRadius:n,strokeColor:f($),strokeWidth:i,shapeRendering:t,onClick:c,id:$.id})}var zp=tu.memo(Gp),Ep=tu.memo(Kp),Op=200,Zp=150,Hp=(u)=>!u.hidden,Bp=(u)=>{let l={x:-u.transform[0]/u.transform[2],y:-u.transform[1]/u.transform[2],width:u.width/u.transform[2],height:u.height/u.transform[2]};return{viewBB:l,boundingRect:u.nodeLookup.size>0?y9(Uy(u.nodeLookup,{filter:Hp}),l):l,rfId:u.rfId,panZoom:u.panZoom,translateExtent:u.translateExtent,flowWidth:u.width,flowHeight:u.height,ariaLabelConfig:u.ariaLabelConfig}},mp="react-flow__minimap-desc";function NW({style:u,className:l,nodeStrokeColor:f,nodeColor:r,nodeClassName:n="",nodeBorderRadius:i=5,nodeStrokeWidth:t,nodeComponent:y,bgColor:c,maskColor:$,maskStrokeColor:A,maskStrokeWidth:j,position:F="bottom-right",onClick:J,onNodeClick:Q,pannable:W=!1,zoomable:L=!1,ariaLabel:U,inversePan:q,zoomStep:N=1,offsetScale:w=5}){let G=Ol(),Z=tu.useRef(null),{boundingRect:H,viewBB:E,rfId:V,panZoom:S,translateExtent:B,flowWidth:D,flowHeight:X,ariaLabelConfig:O}=il(Bp,zl),Y=u?.width??Op,p=u?.height??Zp,v=H.width/Y,z=H.height/p,P=Math.max(v,z),k=P*Y,I=P*p,b=w*P,d=H.x-(k-H.width)/2-b,g=H.y-(I-H.height)/2-b,x=k+b*2,lu=I+b*2,cu=`${mp}-${V}`,_u=tu.useRef(0),Fu=tu.useRef();_u.current=P,tu.useEffect(()=>{if(Z.current&&S)return Fu.current=gq({domNode:Z.current,panZoom:S,getTransform:()=>G.getState().transform,getViewScale:()=>_u.current}),()=>{Fu.current?.destroy()}},[S]),tu.useEffect(()=>{Fu.current?.update({translateExtent:B,width:D,height:X,inversePan:q,pannable:W,zoomStep:N,zoomable:L})},[W,L,q,N,B,D,X]);let zu=J?(e)=>{let[uu,Gu]=Fu.current?.pointer(e)||[0,0];J(e,{x:uu,y:Gu})}:void 0,Wu=Q?tu.useCallback((e,uu)=>{let Gu=G.getState().nodeLookup.get(uu).internals.userNode;Q(e,Gu)},[]):void 0,C=U??O["minimap.ariaLabel"];return ru.jsx(NA,{position:F,style:{...u,"--xy-minimap-background-color-props":typeof c==="string"?c:void 0,"--xy-minimap-mask-background-color-props":typeof $==="string"?$:void 0,"--xy-minimap-mask-stroke-color-props":typeof A==="string"?A:void 0,"--xy-minimap-mask-stroke-width-props":typeof j==="number"?j*P:void 0,"--xy-minimap-node-background-color-props":typeof r==="string"?r:void 0,"--xy-minimap-node-stroke-color-props":typeof f==="string"?f:void 0,"--xy-minimap-node-stroke-width-props":typeof t==="number"?t:void 0},className:Xl(["react-flow__minimap",l]),"data-testid":"rf__minimap",children:ru.jsxs("svg",{width:Y,height:p,viewBox:`${d} ${g} ${x} ${lu}`,className:"react-flow__minimap-svg",role:"img","aria-labelledby":cu,ref:Z,onClick:zu,children:[C&&ru.jsx("title",{id:cu,children:C}),ru.jsx(Ep,{onClick:Wu,nodeColor:r,nodeStrokeColor:f,nodeBorderRadius:i,nodeClassName:n,nodeStrokeWidth:t,nodeComponent:y}),ru.jsx("path",{className:"react-flow__minimap-mask",d:`M${d-b},${g-b}h${x+b*2}v${lu+b*2}h${-x-b*2}z - M${E.x},${E.y}h${E.width}v${E.height}h${-E.width}z`,fillRule:"evenodd",pointerEvents:"none"})]})})}NW.displayName="MiniMap";var cv=tu.memo(NW),Vp=(u)=>(l)=>u?`${Math.max(1/l.transform[2],1)}`:void 0,Dp={[v0.Line]:"right",[v0.Handle]:"bottom-right"};function pp({nodeId:u,position:l,variant:f=v0.Handle,className:r,style:n=void 0,children:i,color:t,minWidth:y=10,minHeight:c=10,maxWidth:$=Number.MAX_VALUE,maxHeight:A=Number.MAX_VALUE,keepAspectRatio:j=!1,resizeDirection:F,autoScale:J=!0,shouldResize:Q,onResizeStart:W,onResize:L,onResizeEnd:U}){let q=kw(),N=typeof u==="string"?u:q,w=Ol(),G=tu.useRef(null),Z=f===v0.Handle,H=il(tu.useCallback(Vp(Z&&J),[Z,J]),zl),E=tu.useRef(null),V=l??Dp[f];tu.useEffect(()=>{if(!G.current||!N)return;if(!E.current)E.current=eq({domNode:G.current,nodeId:N,getStoreItems:()=>{let{nodeLookup:B,transform:D,snapGrid:X,snapToGrid:O,nodeOrigin:Y,domNode:p}=w.getState();return{nodeLookup:B,transform:D,snapGrid:X,snapToGrid:O,nodeOrigin:Y,paneDomNode:p}},onChange:(B,D)=>{let{triggerNodeChanges:X,nodeLookup:O,parentLookup:Y,nodeOrigin:p}=w.getState(),v=[],z={x:B.x,y:B.y},P=O.get(N);if(P&&P.expandParent&&P.parentId){let k=P.origin??p,I=B.width??P.measured.width??0,b=B.height??P.measured.height??0,d={id:P.id,parentId:P.parentId,rect:{width:I,height:b,...A9({x:B.x??P.position.x,y:B.y??P.position.y},{width:I,height:b},P.parentId,O,k)}},g=_A([d],O,Y,p);v.push(...g),z.x=B.x?Math.max(k[0]*I,B.x):void 0,z.y=B.y?Math.max(k[1]*b,B.y):void 0}if(z.x!==void 0&&z.y!==void 0){let k={id:N,type:"position",position:{...z}};v.push(k)}if(B.width!==void 0&&B.height!==void 0){let I={id:N,type:"dimensions",resizing:!0,setAttributes:!F?!0:F==="horizontal"?"width":"height",dimensions:{width:B.width,height:B.height}};v.push(I)}for(let k of D){let I={...k,type:"position"};v.push(I)}X(v)},onEnd:({width:B,height:D})=>{let X={id:N,type:"dimensions",resizing:!1,dimensions:{width:B,height:D}};w.getState().triggerNodeChanges([X])}});return E.current.update({controlPosition:V,boundaries:{minWidth:y,minHeight:c,maxWidth:$,maxHeight:A},keepAspectRatio:j,resizeDirection:F,onResizeStart:W,onResize:L,onResizeEnd:U,shouldResize:Q}),()=>{E.current?.destroy()}},[V,y,c,$,A,j,W,L,U,Q]);let S=V.split("-");return ru.jsx("div",{className:Xl(["react-flow__resize-control","nodrag",...S,f,r]),ref:G,style:{...n,scale:H,...t&&{[Z?"backgroundColor":"borderColor"]:t}},children:i})}var _v=tu.memo(pp);var K=a0.default.createElement,{useEffect:Ln}=a0.default,df=a0.default.useState,s0=a0.default.useRef,hc=[{id:"in-left",side:"left",position:Ku.Left,style:{top:"50%"}},{id:"in-top-left",side:"top",slot:"left",slotIndex:-1,position:Ku.Top,style:{left:"28%"}},{id:"in-top-mid",side:"top",slot:"mid",slotIndex:0,position:Ku.Top,style:{left:"50%"}},{id:"in-top-right",side:"top",slot:"right",slotIndex:1,position:Ku.Top,style:{left:"72%"}},{id:"in-bottom-left",side:"bottom",slot:"left",slotIndex:-1,position:Ku.Bottom,style:{left:"28%"}},{id:"in-bottom-mid",side:"bottom",slot:"mid",slotIndex:0,position:Ku.Bottom,style:{left:"50%"}},{id:"in-bottom-right",side:"bottom",slot:"right",slotIndex:1,position:Ku.Bottom,style:{left:"72%"}}],Cc=[{id:"out-right",position:Ku.Right,style:{top:"50%"}}],qW=["#4eb7a8","#d7a13a","#69aee8","#e0835f","#b7d86b","#d98bd2","#5fc6bf"],Ky=236,Gy=88,wW=15000,Sp=10,m9=96,wn=72,V9=64,WW=12;function wA(){return typeof document>"u"||document.visibilityState!=="hidden"}function LW(u,l){let f=Number.parseFloat(String(u||""));return Number.isFinite(f)?f/100:l}function Xp(u,l,f){let r=String(u.side||"");if(r!=="top"&&r!=="bottom")return 0;let n=Number(u.slotIndex||0),i=r==="top"?"in-top-mid":"in-bottom-mid",t=l.get(u.id)||0,y=l.get(i)||0;if(n===0)return y===0?-26:28+t*74;let c=f===0?Math.abs(n)*2:Math.sign(f)===Math.sign(n)?-3:3;if(y>0&&t===0)return-14+c;return 8+t*74+c}function WA(u){let l=u.filter((i,t)=>{let y=u[t-1];return!y||Math.abs(y.x-i.x)>0.5||Math.abs(y.y-i.y)>0.5});if(l.length<2)return"";let f=`M ${l[0].x},${l[0].y}`,r=l[0];for(let i=1;i0.5||Math.abs(F.y-r.y)>0.5)f+=` L ${F.x},${F.y}`;f+=` Q ${y.x},${y.y} ${J.x},${J.y}`,r=J}let n=l[l.length-1];return`${f} L ${n.x},${n.y}`}function CW(u,l,f,r,n,i,t=""){let y=f>=u,c=Math.max(1,Math.abs(f-u)),$=Math.abs(r-l),A=Math.max(34,Math.min(118,c*0.26)),j=Math.min(280,Math.abs(i));if(y&&n===Ku.Left&&j<4&&$<28&&c<420)return`M ${u},${l} C ${u+A},${l} ${f-A},${r} ${f},${r}`;if(y&&n===Ku.Left&&(t==="direct-forward-left"||c<=260&&$<=210)){let U=Math.max(42,Math.min(140,c*0.48)),q=Math.max(-28,Math.min(28,i*0.18));return`M ${u},${l} C ${u+U},${l+q} ${f-U},${r} ${f},${r}`}if(y){let U=u+A;if(n===Ku.Top||n===Ku.Bottom){let w=n===Ku.Top?-1:1,G=r+w*(54+j*0.42);return WA([{x:u,y:l},{x:U,y:l},{x:U+Math.min(120,c*0.18),y:G},{x:f,y:G},{x:f,y:r+w*34},{x:f,y:r}])}let q=f-A,N=(l+r)/2+i;return WA([{x:u,y:l},{x:U,y:l},{x:U+Math.min(110,c*0.16),y:N},{x:q-Math.min(90,c*0.12),y:N},{x:q,y:r},{x:f,y:r}])}let Q=n===Ku.Bottom?1:n===Ku.Top?-1:i>=0?1:-1,W=Math.max(u,f)+92+Math.min(180,j*0.52),L=Q<0?Math.min(l,r)-84-j*0.62:Math.max(l,r)+84+j*0.62;if(n===Ku.Top||n===Ku.Bottom)return WA([{x:u,y:l},{x:u+A,y:l},{x:W,y:L},{x:f,y:L},{x:f,y:r+Q*38},{x:f,y:r}]);return WA([{x:u,y:l},{x:u+A,y:l},{x:W,y:L},{x:f-A,y:L},{x:f-A,y:r},{x:f,y:r}])}function Yp({data:u}){return K("div",{className:"pipeline-flow-node-body"},hc.map((l)=>K(ai,{key:l.id,id:l.id,type:"target",position:l.position,isConnectable:!1,className:`pipeline-flow-handle input ${l.side} slot-${l.slot||"mid"}`,style:l.style})),Cc.map((l)=>K(ai,{key:l.id,id:l.id,type:"source",position:l.position,isConnectable:!1,className:"pipeline-flow-handle output right",style:l.style})),u?.label)}function Pp({id:u,sourceX:l,sourceY:f,targetX:r,targetY:n,targetPosition:i,markerEnd:t,markerStart:y,style:c,data:$}){let A=Number($?.laneOffset||0),j=CW(l,f,r,n,i,A,String($?.routeMode||""));return K(Ly,{id:u,path:j,markerEnd:t,markerStart:y,style:c,interactionWidth:28})}var Cp={pipelineCurve:Pp},Mp={pipelineNode:Yp};function GA(u){if(!u)return"--";let l=new Date(u);if(Number.isNaN(l.getTime()))return"--";return yl(l)}function Dr(u){let l=Number(u);if(!Number.isFinite(l)||l<0)return"--";let f=Math.round(l/1000);if(f<60)return`${f}s`;if(f<3600)return`${Math.floor(f/60)}m ${f%60}s`;return`${Math.floor(f/3600)}h ${Math.floor(f%3600/60)}m`}function D9(u){let l=Number(u);if(!Number.isFinite(l))return"--";return l.toLocaleString("zh-CN")}function TW(u){let l=Number(u);if(!Number.isFinite(l))return"--";return`${Math.round(Math.max(0,Math.min(1,l))*100)}%`}function pu(u){return typeof u==="object"&&u!==null&&!Array.isArray(u)}function Du(u){return Array.isArray(u)?u:[]}function su(u){if(!u)return null;let l=new Date(u);return Number.isNaN(l.getTime())?null:l.getTime()}function xc(u){return Number.isFinite(Number(u))?new Date(Number(u)).toISOString():""}function kc(...u){for(let l of u){let f=su(l);if(f!==null)return new Date(f).toISOString()}return""}function g9(...u){let l=u.map(su).filter((f)=>f!==null);return l.length>0?new Date(Math.max(...l)).toISOString():""}function s9(u){return["succeeded","failed","skipped","cancelled","canceled","completed"].includes(String(u||"").toLowerCase())}function MW(u){let l=xW(u).toLowerCase();return["running","active","in-progress","in_progress"].includes(l)}function KW(u,l="status"){return u.reduce((f,r)=>{let n=String(r?.[l]||"unknown").toLowerCase();return f[n]=(f[n]||0)+1,f},{})}function RW(u){if(!u||typeof u!=="string")return null;try{let l=JSON.parse(u);return pu(l)?l:null}catch{return null}}function p9(u){let l=u.map(RW).filter((i)=>Boolean(i)),f=l.flatMap((i)=>[i.timestamp,i.createdAt,i.updatedAt]).filter(Boolean),r=g9(...f),n=Array.from(new Set(l.map((i)=>String(i.event||i.action||i.type||"")).filter(Boolean))).slice(0,3);return{total:u.length,parsed:l.length,lastAt:r,eventKinds:n}}function zA(u){if(u===null||u===void 0)return"--";if(typeof u==="boolean")return u?"是":"否";if(typeof u==="number")return String(u);if(typeof u==="string")return u.length>80?`${u.slice(0,77)}...`:u;if(Array.isArray(u))return`${u.length} 项`;if(typeof u==="object")return`${Object.keys(u).length} 字段`;return String(u)}function hW(u,l=280){if(u===null||u===void 0)return"";let r=(typeof u==="string"?u:String(u)).replace(/\r\n/gu,` -`).trim();return r.length>l?`${r.slice(0,Math.max(0,l-1))}...`:r}function xW(u){if(typeof u==="string")return u;if(pu(u))return String(u.status||u.state||u.phase||"unknown");return"unknown"}function Rp(u){return u.filter((l)=>l&&l.value!==void 0&&l.value!==null&&String(l.value)!=="")}function M9({items:u}){let l=Rp(Du(u));return K("div",{className:"pipeline-kv-grid"},l.map((f)=>K("span",{key:f.label},K("b",null,f.label),K("span",null,f.value))))}function a9({items:u}){let l=Du(u).map((f)=>String(f||"")).filter(Boolean);if(l.length===0)return null;return K("div",{className:"pipeline-chip-row"},l.map((f,r)=>K("span",{key:`${r}-${f}`},f)))}function R9(u,l){let f=String(l?.procedureRunId||""),r=Du(u?.procedureRuns);return r.find((n)=>String(pr(n))===f)||r.at(-1)||null}function hp(u,l){let f=String(l||"");if(!f)return null;return Du(u?.procedureRuns).find((r)=>pr(r)===f)||null}function S9(u){return Du(u?.attempts).length}function GW(u){return Du(u?.attempts).reduce((l,f)=>l+VA(f).length,0)}function VA(u){return Du(u?.opencodeMessages?.steps).filter(pu)}function bW(u){let l=String(u?.status||"").toLowerCase();if(["error","failed","failure"].includes(l))return"failed";if(["completed","succeeded","success"].includes(l))return"succeeded";if(["running","started","in_progress"].includes(l))return"running";return"unknown"}function xp(u,l){let f=x9(u.map((i)=>i?.agent)).slice(0,3),r=x9(u.map((i)=>i?.model)).slice(0,3),n=l.length<=2?l.map((i)=>`session ${i}`):[`sessions ${l.length}`,...l.slice(0,2).map((i)=>`session ${i}`)];return[...f.map((i)=>`agent ${i}`),...r.map((i)=>`model ${i}`),...n]}function Mc(u,l=0){return String(u?.messageId||u?.index||"")||`step-${l}`}function bp({steps:u,sessionIds:l,sessionFacts:f,matchedStepKey:r}){let n=Du(u),i=n.findIndex((L,U)=>Mc(L,U)===r),t=i>=0?n[i]:null,y=n.flatMap((L)=>[su(L?.createdAt),su(L?.completedAt)]).filter((L)=>L!==null),c=y.length>0?Math.min(...y):null,$=y.length>0?Math.max(...y):null,A=c!==null&&$!==null?Math.max(0,$-c):null,j=n.reduce((L,U)=>L+Du(U?.parts).filter((q)=>String(q?.type||"").toLowerCase()==="tool").length,0),F=n.reduce((L,U)=>L+Du(U?.parts).filter((q)=>["text","reasoning"].includes(String(q?.type||"").toLowerCase())).length,0),J=n.reduce((L,U)=>L+Du(U?.parts).filter((q)=>String(q?.type||"").toLowerCase()==="tool"&&bW(q)==="failed").length,0),Q=[`${n.length} steps`,`${l.length} sessions`,`${F} messages`,`${j} tools`,A!==null?`duration ${Dr(A)}`:"",J>0?`${J} failed tools`:""].filter(Boolean),W=t?[`Step ${t?.index??i+1}`,String(t?.role||"role --"),t?.model?`model ${t.model}`:"",t?.finish?`finish ${t.finish}`:"",t?.durationMs!==void 0&&t?.durationMs!==null?`duration ${Dr(t.durationMs)}`:""].filter(Boolean):[];return K("section",{className:"pipeline-trace-timeline","data-testid":"pipeline-step-timeline"},K("div",{className:"pipeline-trace-head"},K("div",null,K("b",null,"OpenCode Trace"),K("span",null,"Trace 使用 Code Queue 统一样式展示完整 agent loop;Pipeline 旧 step/message/tool 卡片样式已废弃。")),K("div",{className:"pipeline-trace-session-head","data-testid":"pipeline-step-timeline-session"},K("span",null,Q.join(" / ")||"Trace"),f.length>0?K(a9,{items:f}):null)),t?K("div",{className:"pipeline-trace-focus","data-testid":"pipeline-trace-matched-step"},K("span",{className:"codex-output-channel"},"Matched"),K("strong",null,`Gantt selection -> ${W.join(" / ")}`),K("time",null,`${GA(t?.createdAt)} -> ${GA(t?.completedAt)}`)):null,K(x$,{port:iQ,input:n,className:"codex-transcript pipeline-trace",testId:"pipeline-opencode-step-trace",emptyText:"暂无 OpenCode Trace 输出",keepRecentToolCalls:3}))}function h9(u){return Du(u).flatMap((l)=>{if(pu(l))return[l];let f=RW(l);return f?[f]:[]})}function un(u){return String(u?.event||u?.action||u?.requestedAction||u?.type||"").toLowerCase()}function Ty(u){return kc(u?.timestamp,u?.createdAt,u?.updatedAt,u?.startedAt,u?.finishedAt)}function vp(u){return su(Ty(u))}function DA(u){return String(u?.attempt||u?.id||"")}function x9(u){let l=new Set,f=[];for(let r of u){let n=String(r||"");if(!n||l.has(n))continue;l.add(n),f.push(n)}return f}function zW(u){switch(String(u||"").toLowerCase()){case"monitor":return"monitor";case"webui":return"webui";case"cli":return"cli";case"system":return"runner";default:return String(u||"--")}}function oi(u){return String(u?.requestedAction||u?.action||"").toLowerCase()}function Rc(u){switch(oi(u)){case"guide":return"引导";case"modify":return"修改";case"approve":return"审核通过";case"restart":return"重启";case"redo":return"重做";default:return String(u?.requestedAction||u?.action||"控制")}}function EW(u){switch(un(u)){case"initial-prompt-delivered":return"初始 prompt";case"append-prompt-delivered":return"追加 prompt";case"append-prompt-queued":return"追加 prompt 已排队";case"monitor-prompt-delivered":return"Monitor prompt";case"node-long-running-observation":return"长任务观察";case"node-finished":return"节点完成";case"oa-policy-downstream-evaluated":return"OA 下游策略";case"control-command-queued":return`${Rc(u)} 已发起`;case"control-command-applied":return`${Rc(u)} 已生效`;case"control-command-ignored":return`${Rc(u)} 已忽略`;default:return String(u?.event||u?.action||u?.requestedAction||"event")}}function OW(u){return hW(u?.promptPreview||u?.reasonPreview||u?.prompt||u?.reason||"",240)}function kp(u){let l=String(u?.prompt||""),f=String(u?.reason||u?.restartReason||""),r=l?"":String(u?.promptPreview||""),n=f?"":String(u?.reasonPreview||"");return[l||r?{label:l?"prompt":"prompt preview",value:l||r}:null,f||n?{label:f?"reason":"reason preview",value:f||n}:null,Du(u?.resetNodeIds).length>0?{label:"reset nodes",value:Du(u.resetNodeIds).join(", ")}:null,Du(u?.runningResetNodeIds).length>0?{label:"interrupted running nodes",value:Du(u.runningResetNodeIds).join(", ")}:null,Du(u?.interruptedProcedureRunIds).length>0?{label:"interrupted procedures",value:Du(u.interruptedProcedureRunIds).join(", ")}:null,u?.interruptedProcedureRunId?{label:"interrupted procedure",value:String(u.interruptedProcedureRunId)}:null].filter(Boolean)}function X9(u){let l=VA(u),f=l.map((c)=>su(c?.createdAt)).filter((c)=>c!==null),r=l.map((c)=>su(c?.completedAt)??su(c?.createdAt)).filter((c)=>c!==null),n=h9(u?.controlEventRecords).map((c)=>vp(c)).filter((c)=>c!==null),i=Du(u?.assistantOutputs).map((c)=>su(c?.updatedAt)).filter((c)=>c!==null),t=f[0]??n[0]??i[0]??null,y=r.at(-1)??n.at(-1)??i.at(-1)??t;return{startMs:t,endMs:y}}function Ip(u,l,f,r,n=""){let i=Du(u?.procedureRuns).filter((y)=>pA(y,l)===f);if(i.length===0)return null;if(n){let y=i.find((c)=>pr(c)===n);if(y)return y}if(r===null)return i.at(-1)||null;let t=i.find((y)=>{let c=su(LA(y,u)),$=su(TA(y,u))??c;return c!==null&&$!==null&&r>=c-1000&&r<=$+1000});if(t)return t;return i.slice().sort((y,c)=>{let $=su(LA(y,u))??r,A=su(TA(y,u))??$,j=su(LA(c,u))??r,F=su(TA(c,u))??j,J=Math.min(Math.abs($-r),Math.abs(A-r)),Q=Math.min(Math.abs(j-r),Math.abs(F-r));return J-Q})[0]||null}function vW(u,l){let f=Du(u?.attempts).filter(pu);if(f.length===0)return null;let r=String(l?.attempt||"");if(r){let t=f.find((y)=>DA(y)===r);if(t)return t}let n=Number.isFinite(Number(l?.ms))?Number(l.ms):null;if(n===null)return f.at(-1)||null;let i=f.find((t)=>{let y=X9(t);return Number.isFinite(y.startMs)&&Number.isFinite(y.endMs)&&n>=Number(y.startMs)-1000&&n<=Number(y.endMs)+1000});if(i)return i;return f.slice().sort((t,y)=>{let c=X9(t),$=X9(y),A=Math.min(Math.abs(Number(c.startMs??n)-n),Math.abs(Number(c.endMs??n)-n)),j=Math.min(Math.abs(Number($.startMs??n)-n),Math.abs(Number($.endMs??n)-n));return A-j})[0]||f.at(-1)||null}function kW(u,l){let f=VA(u);if(f.length===0)return{step:null,stepIndex:-1,stepKey:""};if(l===null){let i=f[0];return{step:i,stepIndex:0,stepKey:Mc(i,0)}}for(let i=0;i=y-1000&&l<=c+1000)return{step:t,stepIndex:i,stepKey:Mc(t,i)}}let r=f.findIndex((i)=>{let t=su(i?.createdAt)??su(i?.completedAt);return t!==null&&t>=l});if(r>=0){let i=f[r];return{step:i,stepIndex:r,stepKey:Mc(i,r)}}let n=Math.max(0,f.length-1);return{step:f[n],stepIndex:n,stepKey:Mc(f[n],n)}}function gp(u,l){let f=String(l?.runId||u?.runId||"");if(String(l?.mode||"")==="interval"){let $=l?.interval||{},A=R9(u,$)||$.raw||{};return{mode:"interval",runId:f,interval:$,marker:null,nodeId:String($?.nodeId||pA(A,f)||""),procedure:A,attempt:null,matchedStep:null,matchedStepIndex:-1,matchedStepKey:""}}let r=pu(l?.marker)?l.marker:{},n=Number.isFinite(Number(r?.ms))?Number(r.ms):null,i=String(r?.nodeId||""),t=i?Ip(u,f,i,n,String(r?.procedureRunId||"")):null,y=t?vW(t,r):null,c=y?kW(y,n):{step:null,stepIndex:-1,stepKey:""};return{mode:"event",runId:f,interval:null,marker:r,nodeId:i,procedure:t,attempt:y,matchedStep:c.step,matchedStepIndex:c.stepIndex,matchedStepKey:c.stepKey}}function sp({procedure:u,matchedStepKey:l="",matchedAttemptId:f=""}){let r=Du(u?.attempts);if(r.length===0)return K(qr,{title:"暂无 attempt 详情",text:"当前 procedure 还没有可展示的 attempt / OpenCode Trace;若刚点击甘特线,请等待 node 详情抓取完成。"});return r.map((n,i)=>{let t=n?.opencodeMessages||{},y=VA(n),c=Du(t.sessionIds).map((F)=>String(F)).filter(Boolean),$=xp(y,c),A=DA(n)||`attempt-${i+1}`,j=y.reduce((F,J)=>F+Du(J?.parts).filter((Q)=>String(Q?.type||"").toLowerCase()==="tool"&&bW(Q)==="failed").length,0);return K("article",{key:A,className:`pipeline-attempt-card ${f===A?"matched":""}`},K("div",{className:"pipeline-attempt-head"},K("div",null,K("strong",null,A),K("span",null,t.source||"opencode")),K("div",{className:"pipeline-attempt-badges"},K("span",null,`${y.length} steps`),K("span",null,`${t.toolCallCount??"--"} tools`),j>0?K("span",{className:"danger"},`${j} failed`):null)),K(M9,{items:[{label:"messages",value:t.messageCount??"--"},{label:"steps",value:t.stepCount??"--"},{label:"tools",value:t.toolCallCount??"--"},{label:"updated",value:wu(t.updatedAt)},{label:"sessions",value:c.join(", ")||"--"}]}),y.length===0?K("p",{className:"muted paragraph"},"当前 attempt 尚未返回 OpenCode Trace;请确认 D601 pipeline-control 已重建并重新抓取。"):K(bp,{steps:y,sessionIds:c,sessionFacts:$,matchedStepKey:l}))})}function Y9(u,l){return`${u}::${l}`}function EA(u,l,f){if(!pu(u))return null;return String(u.runId||"")===l&&String(u.nodeId||"")===f?u:null}function ap(u,l){let f=pu(u)?u:{};if(!pu(l))return f;let r=Du(l.attempts),n=Du(f.attempts);return{...f,...l,attempts:r.length>0?r:n}}function op(u,l,f,r){if(!EA(l,f,r))return u;let n=Du(l.procedureRuns),i=pu(u)?u:{};return{...i,...l,controlEvents:Du(l.controlEvents).length>0?l.controlEvents:i.controlEvents,procedureRuns:n.length>0?n:i.procedureRuns}}function dp({selection:u,runDetails:l,nodeDetails:f,nodeDetailsState:r,onRaw:n,onCollapse:i}){if(!u?.mode)return K("aside",{className:"pipeline-gantt-detail-panel empty","data-testid":"pipeline-gantt-detail-panel"},K("div",{className:"pipeline-gantt-detail-head"},K("div",null,K("span",{className:"panel-eyebrow"},"Gantt Detail"),K(rl,{title:"未选择元素",level:3})),K("button",{type:"button",className:"ghost-btn mini",onClick:i,"data-testid":"pipeline-gantt-sidebar-collapse"},"收起")),K(qr,{title:"选择一条执行线或一个控制点",text:"点击甘特图中的 node 执行线、prompt 点或控制点,在这里查看结构化过程和 OpenCode step。"}));let t=String(u?.runId||""),y=String(u?.interval?.nodeId||u?.marker?.nodeId||""),c=l?.runId===t?l.details:null,$=EA(f,t,y),A=String(r?.runId||"")===t&&String(r?.nodeId||"")===y,j=op(c,$,t,y),F=(String(l?.runId||"")!==t||Boolean(l?.loading))&&!j,J=String(l?.runId||"")===t?String(l?.error||""):"",Q=A?String(r?.error||""):"",W=j?gp(j,u):null,L=W?.interval||u?.interval||null,U=W?.marker||u?.marker||null,q=String(L?.procedureRunId||U?.procedureRunId||""),N=$?hp($,q)||R9($,L||{procedureRunId:q}):null,w=W?.procedure||(j?R9(j,L||{procedureRunId:q}):null)||L?.raw||{};if(N&&(S9(w)===0||GW(N)>=GW(w)))w=ap(w,N);let G=W?.attempt||null,Z=String(W?.matchedStepKey||"");if(!G&&U&&S9(w)>0)G=vW(w,U),Z=String(kW(G,Number.isFinite(Number(U?.ms))?Number(U.ms):null).stepKey||"");let H=DA(G),E=S9(w)>0,V=A&&Boolean(r?.loading)&&!E,S=Boolean(F||V),B=[E?"":J,Q].filter(Boolean).join(" / "),D=A&&r?.fetchedAt?r.fetchedAt:l?.fetchedAt,X=xW(w?.status||L?.status||U?.status||U?.event),O=u?.mode==="event"?U?.label||EW(U?.raw||U)||"event":W?.nodeId||L?.nodeId||"node",Y=U?kp(U?.raw||U):[],p=U?[un(U?.raw||U)?`event ${un(U?.raw||U)}`:"",U?.promptEvent?`prompt ${U.promptEvent}`:"",U?.action?`action ${U.action}`:"",U?.sourceKind?`source ${zW(U.sourceKind)}`:"",U?.sourceNodeId?`from ${U.sourceNodeId}`:"",U?.targetNodeId?`to ${U.targetNodeId}`:"",U?.snapReason?`draw ${U.snapReason}`:""].filter(Boolean):[];return K("aside",{className:"pipeline-gantt-detail-panel","data-testid":"pipeline-gantt-detail-panel"},K("div",{className:"pipeline-gantt-detail-head"},K("div",null,K("span",{className:"panel-eyebrow"},u?.mode==="event"?"Gantt Event Detail":"Gantt Line Detail"),K(rl,{title:O,level:3,loading:S})),K("div",{className:"pipeline-gantt-detail-head-actions"},K(o0,{status:X},X),K("button",{type:"button",className:"ghost-btn mini",onClick:i,"data-testid":"pipeline-gantt-sidebar-collapse"},"收起"))),U?K("article",{className:"pipeline-event-card"},K("div",{className:"pipeline-event-card-head"},K("strong",null,U?.label||EW(U?.raw||U)),K(a9,{items:p})),K(M9,{items:[{label:"event time",value:wu(U?.timestampIso||U?.timestamp||"--")},U?.snapped?{label:"drawn time",value:wu(U?.renderedTimestampIso||U?.ms)}:null,{label:"node",value:U?.nodeId||"--"},{label:"procedure",value:U?.procedureRunId||pr(w)||"--"},{label:"attempt",value:U?.attempt||H||"--"},{label:"source kind",value:U?.sourceKind?zW(U.sourceKind):"--"},{label:"source node",value:U?.sourceNodeId||"--"},{label:"target node",value:U?.targetNodeId||"--"},{label:"command",value:U?.commandId||U?.eventId||"--"},U?.snapReason?{label:"placement",value:U.snapReason}:null]}),Y.length>0?K("div",{className:"pipeline-event-blocks"},Y.map((v,z)=>K("section",{key:`${v.label}-${z}`,className:"pipeline-event-text-block"},K("b",null,v.label),K("p",null,v.value)))):null,OW(U?.raw||U)?K("p",{className:"pipeline-text-preview"},OW(U?.raw||U)):null):null,K(M9,{items:[{label:"epoch",value:t||L?.runId||"--"},{label:"node",value:W?.nodeId||L?.nodeId||U?.nodeId||"--"},{label:"procedure",value:L?.procedureRunId||U?.procedureRunId||pr(w)||"--"},{label:"started",value:wu(L?.startedAt||w?.startedAt)},{label:"finished",value:wu(L?.finishedAt||w?.finishedAt)},{label:"duration",value:Dr(L?.durationMs||w?.durationMs)},{label:"fetched",value:D?yl(D):"--"},W?.matchedStep?{label:"matched step",value:`Step ${W.matchedStep.index??W.matchedStepIndex+1}`}:null]}),K(nl,{error:B}),K("div",{className:"pipeline-gantt-detail-actions"},K(ln,{title:`Procedure ${L?.procedureRunId||U?.procedureRunId||W?.nodeId||"node"}`,data:w,onOpen:n,testId:"raw-pipeline-gantt-procedure"}),U?K(ln,{title:`Pipeline event ${U?.id||U?.commandId||U?.eventId||W?.nodeId||"event"}`,data:U?.raw||U,onOpen:n,testId:"raw-pipeline-gantt-event"}):null,j?K(ln,{title:`Pipeline run ${t||"--"}`,data:j,onOpen:n,testId:"raw-pipeline-gantt-node-details"}):null),!S&&!pr(w)&&!U?K(qr,{title:"暂无过程详情",text:"当前选择还没有可匹配的 procedure 运行记录。"}):null,!S&&pr(w)?K(sp,{procedure:w,matchedStepKey:Z,matchedAttemptId:H}):null)}function ep({value:u}){let f=String(u||"--").split(/([_-])/u);return K(a0.default.Fragment,null,f.map((r,n)=>r==="-"||r==="_"?K(a0.default.Fragment,{key:n},r,K("wbr",null)):K(a0.default.Fragment,{key:n},r)))}async function I0(u,l={}){return Eu(u,{invalidJsonPrefix:"Pipeline 返回了无效 JSON",...l})}function o0({status:u,children:l}){let f=String(u||"unknown").toLowerCase();return K("span",{className:`status-badge ${f}`},l||u||"unknown")}function Yf({label:u,value:l,hint:f,tone:r}){return K("article",{className:`metric-card ${r||""}`},K("div",{className:"metric-label"},u),K("div",{className:"metric-value"},l),K("div",{className:"metric-hint"},f))}function Wn({title:u,eyebrow:l,actions:f,children:r,className:n,loading:i}){return K("section",{className:`panel ${n||""}`},K("div",{className:"panel-head"},K("div",null,l?K("p",{className:"panel-eyebrow"},l):null,K(rl,{title:u,loading:i})),f?K("div",{className:"panel-actions"},f):null),K("div",{className:"panel-body"},r))}function ln({title:u,data:l,onOpen:f,testId:r}){return K("button",{type:"button",className:"ghost-btn","data-testid":r,onClick:()=>f(u,l)},"查看原始JSON")}function Vr({title:u,subtitle:l,facts:f,data:r,onRaw:n,testId:i}){let t=Du(f).map((y)=>String(y||"")).filter(Boolean);return K("article",{className:"pipeline-evidence-row"},K("div",{className:"pipeline-evidence-main"},K("strong",null,u),l?K("span",null,l):null),K("div",{className:"pipeline-evidence-facts"},t.map((y,c)=>K("span",{key:`${c}-${y.slice(0,16)}`},y))),r!==void 0?K(ln,{title:u,data:r,onOpen:n,testId:i}):null)}function qr({title:u,text:l}){return K("div",{className:"empty-state"},K("strong",null,u),K("span",null,l))}function uS(u){return u?.runtime&&typeof u.runtime==="object"&&!Array.isArray(u.runtime)?u.runtime:{}}function lS(u){return u?.backend&&typeof u.backend==="object"&&!Array.isArray(u.backend)?u.backend:{}}function fS(u){return u?.repository&&typeof u.repository==="object"&&!Array.isArray(u.repository)?u.repository:{}}function rS(u){return{components:Array.isArray(u?.registry?.components)?u.registry.components:[],pipelines:Array.isArray(u?.pipelines)?u.pipelines:[],runs:Array.isArray(u?.runs)?u.runs:[]}}function ZW(u,l,f){let r=u?._unidesk?.arrayLimits?.[l],n=Number(r?.originalLength);return Number.isFinite(n)?n:f}function IW(u){if(!u||typeof u!=="object"||Array.isArray(u))return"--";return`${u.componentClass||"--"}/${u.id||"--"}`}function OA(u){if(!u||typeof u!=="object"||Array.isArray(u))return"";let l=String(u.componentClass||"").trim(),f=String(u.id||"").trim();return l&&f?`${l}/${f}`:""}function o9(u){return u?.config&&typeof u.config==="object"&&!Array.isArray(u.config)?u.config:{}}function gW(u){let l=o9(u),f=Array.isArray(l.nodes)?l.nodes:Array.isArray(u?.nodes)?u.nodes:[],r=new Map;for(let t of f){let y=String(t?.id||t?.nodeId||"");if(y)r.set(y,{...t,id:y})}let n=d9(u),i=(t)=>{if(t&&!r.has(t))r.set(t,{id:t})};for(let t of e9(u))bc(t).forEach(i);for(let t of n)i(String(t?.from||t?.source||"")),i(String(t?.to||t?.target||""));return Array.from(r.values())}function d9(u){let l=o9(u);return Array.isArray(l.edges)?l.edges:Array.isArray(u?.edges)?u.edges:[]}function e9(u){let l=o9(u);return Array.isArray(l.topologicalBatches)?l.topologicalBatches:Array.isArray(u?.topologicalBatches)?u.topologicalBatches:[]}function nS(u){let l=new Map;for(let f of u){let r=OA(f);if(r)l.set(r,f);let n=Array.isArray(f?.refs)?f.refs:[];for(let i of n){let t=OA(i);if(t)l.set(t,f)}}return l}function HW(u,l){let f=l.get(OA(u?.componentRef));if(f)return f;let r=OA({componentClass:u?.kind,id:u?.id});return r?l.get(r)||null:null}function BW(u,l){let f=sW(u,l);return String(f?.status||"pending")}function sW(u,l){return(Array.isArray(u?.nodes)?u.nodes:[]).find((r)=>r?.nodeId===l||r?.id===l)||null}function iS(u){return u.reduce((l,f)=>{let r=String(f?.status||"unknown").toLowerCase();return l[r]=(l[r]||0)+1,l},{})}function tS(u){if(Array.isArray(u?.scorers))return u.scorers.filter(pu);if(Array.isArray(u?.summary?.scorers))return u.summary.scorers.filter(pu);if(Array.isArray(u?.artifact?.summary?.scorers))return u.artifact.summary.scorers.filter(pu);return[]}function yS(u){if(pu(u?.run))return u.run;if(pu(u?.runSummary))return u.runSummary;return null}function cS(u,l){if(!pu(u)&&!pu(l))return null;if(!pu(u))return l;if(!pu(l))return u;return{...u,...l,request:pu(u.request)||pu(l.request)?{...pu(u.request)?u.request:{},...pu(l.request)?l.request:{}}:l.request??u.request,artifact:pu(u.artifact)||pu(l.artifact)?{...pu(u.artifact)?u.artifact:{},...pu(l.artifact)?l.artifact:{}}:l.artifact??u.artifact,summary:pu(u.summary)||pu(l.summary)?{...pu(u.summary)?u.summary:{},...pu(l.summary)?l.summary:{}}:l.summary??u.summary}}function ZA(u){let l=tS(u),f=l.find((A)=>pu(A?.score))||l[0]||null,r=pu(f?.score)?f.score:{},n=Number(r.passed),i=Number(r.total),t=Number(r.ratio),y=Number.isFinite(t)?t:Number.isFinite(n)&&Number.isFinite(i)&&i>0?n/i:null,c=y===null?null:Math.round(Math.max(0,Math.min(100,y<=1?y*100:y))),$=String(r.text||(Number.isFinite(n)&&Number.isFinite(i)?`${n}/${i}`:""));return{scorer:f,scorers:l,score:r,passed:Number.isFinite(n)?n:null,total:Number.isFinite(i)?i:null,percent:c,text:$}}function b9(u){let l=ZA(u);return l.text||(l.scorers.length>0?String(l.scorer?.status||"pending"):"--")}function u7(u){let l=ZA(u);if(l.total>0&&l.passed===l.total)return"succeeded";if(l.total>0&&l.passed>0)return"running";if(l.scorers.length>0)return"failed";return"pending"}function _S(u){return Array.isArray(u?.items)?u.items.filter(pu):[]}function $S({run:u}){let l=b9(u);return K("span",{className:`pipeline-score-badge ${u7(u)}`},`score ${l}`)}function AS({run:u,onRaw:l}){let r=ZA(u).scorers;if(!u)return K(qr,{title:"暂无评分",text:"选择一个 epoch 后会显示 scorer 结果。"});if(r.length===0)return K("div",{className:"pipeline-score-empty"},K("strong",null,"评分器等待中"),K("span",null,"DAG 完成后,Pipeline control backend 会把 scorer summary 追加到 run artifact,并通过 UniDesk 显示。"));return K("div",{className:"pipeline-score-board","data-testid":"pipeline-score-board"},r.map((n,i)=>{let t=ZA({scorers:[n]}),y=_S(n),c=t.percent??0;return K("article",{key:`${n.scorerId||n.component||i}`,className:`pipeline-score-card ${u7({scorers:[n]})}`},K("div",{className:"pipeline-score-head"},K("div",null,K("span",null,n.scorerId||n.component||"scorer"),K("strong",null,t.text||n.status||"--")),K(o0,{status:n.status||"unknown"},n.status||"unknown")),K("div",{className:"pipeline-score-meter","aria-label":`score ${c}%`},K("span",{style:{width:`${c}%`}})),K("div",{className:"pipeline-score-facts"},K("span",null,`${c}%`),K("span",null,n.component||"--"),K("span",null,n.applicationCheckoutRef||"--")),y.length>0?K("div",{className:"pipeline-score-items"},y.map(($)=>K("span",{key:`${$.id||$.filter}`,className:`pipeline-score-item ${String($.status||"").toLowerCase()}`,title:`${$.filter||"--"} / ran=${$.ran??"?"}`},K("b",null,$.id||"--"),K("small",null,$.status||"--")))):K("p",{className:"muted paragraph"},"当前 scorer 尚未返回 item 级结果。"),n.error?K("p",{className:"pipeline-score-error"},hW(n.error,360)):null,K("div",{className:"panel-actions inline-actions"},K(ln,{title:`Scorer ${n.scorerId||i}`,data:n,onOpen:l,testId:"raw-pipeline-score"})))}))}function jS(u){let l=u.reduce((f,r)=>{let n=String(r?.componentClass||"unknown");return f[n]=(f[n]||0)+1,f},{});return Object.entries(l).map(([f,r])=>({name:f,count:Number(r)})).sort((f,r)=>r.count-f.count||f.name.localeCompare(r.name))}function bc(u){if(Array.isArray(u))return u.map((l)=>typeof l==="string"?l:String(l?.id||l?.nodeId||"")).filter(Boolean);if(Array.isArray(u?.nodes))return bc(u.nodes);if(Array.isArray(u?.nodeIds))return bc(u.nodeIds);return[]}function FS(u){return pu(u?.instanceInputs?.monitor)?u.instanceInputs.monitor:{}}function aW(u,l){if(String(u?.kind||"").toLowerCase()!=="procedure")return!1;let f=FS(u);if(u?.instanceInputs?.monitorMode===!0||f.enabled===!0)return!0;let r=IW(u?.componentRef);return String(l?.id||l?.config?.id||r||"").toLowerCase().includes("monitor")}function US(u){return u.filter((l)=>aW(l)).map((l)=>String(l?.id||"")).filter(Boolean)}function JS(u,l){if(l.length===0)return u;let f=new Set(l),r=l.filter((n)=>u.includes(n));if(r.length===0)return u;return[...r,...u.filter((n)=>!f.has(n))]}function QS(u,l){if(l.length===0)return u;let f=new Set(l),r=l.filter((i)=>u.some((t)=>t.includes(i)));if(r.length===0)return u;let n=u.map((i)=>i.filter((t)=>!f.has(t))).filter((i)=>i.length>0);return[r,...n]}function NS(u,l,f){let n=e9(u).map(bc).filter((F)=>F.length>0);if(n.length>0)return n;let i=l.map((F)=>String(F?.id||"")).filter(Boolean),t=new Set(i),y=new Map(i.map((F)=>[F,0])),c=new Map(i.map((F)=>[F,[]]));for(let F of f){let J=String(F?.from||F?.source||""),Q=String(F?.to||F?.target||"");if(!t.has(J)||!t.has(Q))continue;c.get(J)?.push(Q),y.set(Q,(y.get(Q)||0)+1)}let $=new Map,A=i.filter((F)=>(y.get(F)||0)===0);for(let F of A)$.set(F,0);while(A.length>0){let F=A.shift(),J=($.get(F)||0)+1;for(let Q of c.get(F)||[])if(y.set(Q,Math.max(0,(y.get(Q)||0)-1)),$.set(Q,Math.max($.get(Q)||0,J)),(y.get(Q)||0)===0)A.push(Q)}i.forEach((F)=>{if(!$.has(F))$.set(F,0)});let j=Math.max(0,...Array.from($.values()));return Array.from({length:j+1},(F,J)=>i.filter((Q)=>$.get(Q)===J)).filter((F)=>F.length>0)}function qS(u,l,f){let n=e9(u).map(bc).filter((y)=>y.length>0),i=n.length>0?n.flatMap((y)=>y):(()=>{let y=l.map((W)=>String(W?.id||"")).filter(Boolean),c=new Set(y),$=f.filter((W)=>String(W?.edgeType||"").toLowerCase()!=="rework"),A=new Map(y.map((W)=>[W,0])),j=new Map(y.map((W)=>[W,[]]));for(let W of $){let L=String(W?.from||W?.source||""),U=String(W?.to||W?.target||"");if(!c.has(L)||!c.has(U))continue;j.get(L)?.push(U),A.set(U,(A.get(U)||0)+1)}let F=new Map,J=y.filter((W)=>(A.get(W)||0)===0);for(let W of J)F.set(W,0);while(J.length>0){let W=J.shift(),L=(F.get(W)||0)+1;for(let U of j.get(W)||[])if(A.set(U,Math.max(0,(A.get(U)||0)-1)),F.set(U,Math.max(F.get(U)||0,L)),(A.get(U)||0)===0)J.push(U)}y.forEach((W)=>{if(!F.has(W))F.set(W,0)});let Q=Math.max(0,...Array.from(F.values()));return Array.from({length:Q+1},(W,L)=>y.filter((U)=>F.get(U)===L)).flatMap((W)=>W)})(),t=new Set(i);for(let y of l){let c=String(y?.id||"");if(!c||t.has(c))continue;i.push(c),t.add(c)}return JS(i,US(l))}function Yc(u){return`${u.source}->${u.target}-${u.index}`}function mW(u,l,f){let r=gW(u),n=d9(u),i=nS(f),t=new Map(r.map((X)=>[String(X?.id||""),X])),y=r.filter((X)=>aW(X,HW(X,i))).map((X)=>String(X?.id||"")).filter(Boolean),c=QS(NS(u,r,n),y),$=[],A=new Map,j=330,F=122;c.forEach((X,O)=>{let Y=X.length*122;X.forEach((p,v)=>{let z=t.get(p)||{id:p},P=HW(z,i),k=BW(l,p).toLowerCase(),I=String(z.kind||P?.componentClass||"node").toLowerCase(),b=IW(z.componentRef||P),d=String(P?.config?.version||P?.version||""),g=String(P?.config?.description||P?.description||""),x=v*122-Math.floor(Y/2);A.set(p,{column:O,row:v,y:x}),$.push({id:p,type:"pipelineNode",position:{x:O*330,y:x},data:{exportLabel:{id:p,kind:I,componentRef:b,componentVersion:d,componentDescription:g,status:k},label:K("div",{className:"flow-node-label"},K("strong",null,p),K("span",null,I),K("code",{title:g||b},d?`${b}@${d}`:b),K(o0,{status:k},k))},className:`pipeline-flow-node ${I} ${k}`})})});let J=n.flatMap((X,O)=>{let Y=String(X?.from||X?.source||""),p=String(X?.to||X?.target||"");if(!t.has(Y)||!t.has(p))return[];return[{source:Y,target:p,index:O,condition:X?.condition,edgeType:X?.edgeType}]}),Q=J.reduce((X,O)=>X.set(O.source,(X.get(O.source)||0)+1),new Map),W=J.reduce((X,O)=>X.set(O.target,(X.get(O.target)||0)+1),new Map),L=J.reduce((X,O)=>{let Y=`${O.source}->${O.target}`;return X.set(Y,(X.get(Y)||0)+1)},new Map),U=new Map,q=new Map,N=new Map,w=new Map,G=new Map,Z=new Map,H=J.reduce((X,O)=>{let Y=A.get(O.source),p=A.get(O.target),v=(p?.column||0)-(Y?.column||0);if(v<=0||String(O.edgeType||"").toLowerCase()==="rework"||v!==1)return X;let P=`${O.source}->column:${p?.column??""}`,k=X.get(P)||[];return k.push(O),X.set(P,k),X},new Map);for(let X of H.values()){if(X.length<2)continue;X.slice().sort((O,Y)=>{let p=A.get(O.target),v=A.get(Y.target);return(p?.y||0)-(v?.y||0)||O.index-Y.index}).forEach((O,Y,p)=>{Z.set(Yc(O),{slot:Y-(p.length-1)/2,count:p.length})})}[...J].sort((X,O)=>{let Y=A.get(X.source),p=A.get(X.target),v=A.get(O.source),z=A.get(O.target),P=Math.abs((p?.column||0)-(Y?.column||0))*330+Math.abs((p?.y||0)-(Y?.y||0)),k=Math.abs((z?.column||0)-(v?.column||0))*330+Math.abs((z?.y||0)-(v?.y||0));return P-k||X.index-O.index}).forEach((X)=>{let O=A.get(X.source)||{column:0,row:0,y:0},Y=A.get(X.target)||{column:0,row:0,y:0},p=Y.column-O.column,v=Math.max(0,p),z=p<=0||String(X.edgeType||"").toLowerCase()==="rework",P=O.y-Y.y,k=W.get(X.target)||1,I=Z.has(Yc(X)),b=!z&&v<=1&&(I||k===1),d=G.get(X.target)||new Map;G.set(X.target,d);let g=hc.slice().sort((x,lu)=>{let cu=(Wu)=>{let C=String(Wu.side),e=0;if(z){if(C==="left")e+=86;if(C==="top")e+=Y.y<=0?-22:12;if(C==="bottom")e+=Y.y>=0?-22:12;if(Math.abs(Y.y)<12&&C!=="left")e+=X.index%2===0?C==="top"?-6:6:C==="bottom"?-6:6;return e}if(b){if(C==="left")e-=I?72:44;if(C!=="left")e+=I?72:44;return e+Math.abs(P)*0.02}if(C==="left")e+=v<=1?0:24;if(C==="top")e+=P<-36?-18:42;if(C==="bottom")e+=P>36?-18:42;if(v<=1&&Math.abs(P)<=82&&C!=="left")e+=38;if(v>1&&C!=="left")e-=10;return e},_u=O.y-Y.y,Fu=_u!==0?_u:X.index%2===0?-1:1,zu=(Wu)=>{let C=d.get(Wu.id)||0;return cu(Wu)+C*64+Xp(Wu,d,Fu)};return zu(x)-zu(lu)||String(x.id).localeCompare(String(lu.id))})[0];d.set(g.id,(d.get(g.id)||0)+1),w.set(Yc(X),g)});let V=J.map((X)=>{let O=BW(l,X.target).toLowerCase(),Y=`${X.source}->${X.target}`,p=U.get(X.source)||0,v=q.get(X.target)||0,z=N.get(Y)||0;U.set(X.source,p+1),q.set(X.target,v+1),N.set(Y,z+1);let P=p-((Q.get(X.source)||1)-1)/2,k=v-((W.get(X.target)||1)-1)/2,I=z-((L.get(Y)||1)-1)/2,b=A.get(X.source),d=A.get(X.target),g=(d?.column||0)-(b?.column||0),x=Math.max(1,Math.abs(g)),lu=g<=0||String(X.edgeType||"").toLowerCase()==="rework",cu=Math.abs((d?.y||0)-(b?.y||0)),_u=Z.get(Yc(X)),Fu=!lu&&g===1&&(W.get(X.target)||0)>1,zu=_u?_u.slot:I*2+P+k*0.45,Wu=zu===0?X.index%2===0?-1:1:Math.sign(zu),C=w.get(Yc(X))||hc[1],e=C.side==="top"?-1:C.side==="bottom"?1:Wu,uu=lu||x>1||cu>96||Math.abs(zu)>0.2||C.side!=="left",Gu=lu?118+x*18:22+x*16,s=C.side==="left"?0:28,qu=uu?Math.max(-280,Math.min(280,e*Math.min(180,Gu+s+cu*0.22)+zu*28)):0,Zu=Math.max(0,Math.min(Cc.length-1,Math.round(P+(Cc.length-1)/2))),Bu=Cc[Zu]||Cc[1],Iu=O==="succeeded"?"var(--accent-2)":O==="running"?"var(--accent)":O==="failed"?"var(--danger)":"rgba(129, 147, 159, 0.78)",ll=b?.column||0,Pu=d?.column||0,Jl=qu===0?0:Math.sign(qu),Jf=lu?`feedback:${ll}->${Pu}:${Jl}`:_u?`fanout:${ll}->${Pu}:${X.source}`:Fu?`fanin:${ll}->${Pu}:${X.target}`:C.side!=="left"||x>1?`corridor:${ll}->${Pu}:${C.side}:${Jl}:${Math.round(Math.abs(qu)/56)}`:"";return{id:`${X.source}->${X.target}-${X.index}`,source:X.source,target:X.target,sourceHandle:Bu.id,targetHandle:C.id,type:"pipelineCurve",zIndex:12,animated:O==="running",data:{baseEdgeColor:Iu,laneOffset:qu,routeMode:_u&&C.side==="left"?"direct-forward-left":"",targetSide:C.side,isFeedback:lu,overlapGroup:Jf},targetStatus:O}}),S=V.reduce((X,O)=>{let Y=String(O.data?.overlapGroup||"");return Y?X.set(Y,(X.get(Y)||0)+1):X},new Map),B=new Map,D=V.map((X)=>{let O=String(X.targetStatus||"pending"),Y={...X};delete Y.targetStatus;let p=String(X.data?.overlapGroup||""),v=p?S.get(p)||0:0,z=v>1?B.get(p)||0:-1;if(v>1)B.set(p,z+1);let P=z>=0?qW[z%qW.length]:String(X.data.baseEdgeColor),k={stroke:P};if(X.data.isFeedback)k.strokeDasharray="9 7";return{...Y,data:{...X.data,edgeColor:P,overlapSlot:z,overlapCount:v},style:k,markerEnd:{type:x0.ArrowClosed,color:P},className:`pipeline-flow-edge ${O} ${X.data.isFeedback?"feedback":""} ${z>=0?"overlap-colored":""}`}});return{nodes:$,edges:D}}function ef(u){return String(u??"").replace(/&/g,"&").replace(//g,">").replace(/"/g,""")}function VW(u){let l=String(u||"");if(l.includes("--accent-2"))return"#4eb7a8";if(l.includes("--accent"))return"#d7a13a";if(l.includes("--danger"))return"#cf6a54";return l.startsWith("#")?l:"#81939f"}function HA(u){return`arrow-${u.replace(/[^a-zA-Z0-9_-]+/g,"")}`}function oW(u,l="pipeline"){return String(u||l).replace(/[^a-zA-Z0-9_-]+/g,"-").replace(/^-|-$/g,"")||l}function DW(u,l){let f=u.position.x,r=u.position.y,n=hc.find((i)=>i.id===l);if(n?.side==="top")return{x:f+Ky*LW(n.style?.left,0.5),y:r,position:Ku.Top};if(n?.side==="bottom")return{x:f+Ky*LW(n.style?.left,0.5),y:r+Gy,position:Ku.Bottom};return{x:f,y:r+Gy/2,position:Ku.Left}}function wS(u){return{x:u.position.x+Ky,y:u.position.y+Gy/2}}function WS(u,l){let f=Math.min(...u.nodes.map((W)=>W.position.x),0)-220,r=Math.min(...u.nodes.map((W)=>W.position.y),0)-220,n=Math.max(...u.nodes.map((W)=>W.position.x+Ky),1)+220,i=Math.max(...u.nodes.map((W)=>W.position.y+Gy),1)+220,t=Math.ceil(n-f),y=Math.ceil(i-r),c=new Map(u.nodes.map((W)=>[W.id,W])),$=u.edges.map((W)=>VW(W.data?.edgeColor||W.style?.stroke)),j=Array.from(new Set(["#4eb7a8","#d7a13a","#cf6a54","#81939f",...$])).map((W)=>``).join(""),F=u.edges.flatMap((W)=>{let L=c.get(W.source),U=c.get(W.target);if(!L||!U)return[];let q=wS(L),N=DW(U,String(W.targetHandle||"in-left")),w=CW(q.x,q.y,N.x,N.y,N.position,Number(W.data?.laneOffset||0),String(W.data?.routeMode||"")),G=VW(W.data?.edgeColor||W.style?.stroke),Z=W.data?.isFeedback?' stroke-dasharray="9 7"':"";return``}).join(` -`),J=u.nodes.map((W)=>{let L=W.data?.exportLabel||{},U=String(L.status||"pending").toLowerCase(),q=U==="succeeded"?"#4eb7a8":U==="running"?"#d7a13a":U==="failed"?"#cf6a54":"#81939f",N=W.position.x,w=W.position.y,G=hc.map((Z)=>{let H=DW(W,Z.id);if(Z.side==="top"||Z.side==="bottom")return``;return``}).join(` +`)),A=$.reduce((j,F)=>j.concat(...F),[]);return[$,A]}return[[],[]]},[u]);return tu.useEffect(()=>{let c=l?.target??Ow,$=l?.actInsideInputWithModifier??!0;if(u!==null){let A=(J)=>{if(n.current=J.ctrlKey||J.metaKey||J.shiftKey||J.altKey,(!n.current||n.current&&!$)&&W9(J))return!1;let W=Hw(J.code,y);if(i.current.add(J[W]),Zw(t,i.current,!1)){let L=J.composedPath?.()?.[0]||J.target,U=L?.nodeName==="BUTTON"||L?.nodeName==="A";if(l.preventDefault!==!1&&(n.current||!U))J.preventDefault();r(!0)}},j=(J)=>{let Q=Hw(J.code,y);if(Zw(t,i.current,!0))r(!1),i.current.clear();else i.current.delete(J[Q]);if(J.key==="Meta")i.current.clear();n.current=!1},F=()=>{i.current.clear(),r(!1)};return c?.addEventListener("keydown",A),c?.addEventListener("keyup",j),window.addEventListener("blur",F),window.addEventListener("contextmenu",F),()=>{c?.removeEventListener("keydown",A),c?.removeEventListener("keyup",j),window.removeEventListener("blur",F),window.removeEventListener("contextmenu",F)}}},[u,r]),f}function Zw(u,l,f){return u.filter((r)=>f||r.length===l.size).some((r)=>r.every((n)=>l.has(n)))}function Hw(u,l){return l.includes(u)?"code":"key"}var iD=()=>{let u=Zl();return tu.useMemo(()=>{return{zoomIn:(l)=>{let{panZoom:f}=u.getState();return f?f.scaleBy(1.2,l):Promise.resolve(!1)},zoomOut:(l)=>{let{panZoom:f}=u.getState();return f?f.scaleBy(0.8333333333333334,l):Promise.resolve(!1)},zoomTo:(l,f)=>{let{panZoom:r}=u.getState();return r?r.scaleTo(l,f):Promise.resolve(!1)},getZoom:()=>u.getState().transform[2],setViewport:async(l,f)=>{let{transform:[r,n,i],panZoom:t}=u.getState();if(!t)return Promise.resolve(!1);return await t.setViewport({x:l.x??r,y:l.y??n,zoom:l.zoom??i},f),Promise.resolve(!0)},getViewport:()=>{let[l,f,r]=u.getState().transform;return{x:l,y:f,zoom:r}},setCenter:async(l,f,r)=>{return u.getState().setCenter(l,f,r)},fitBounds:async(l,f)=>{let{width:r,height:n,minZoom:i,maxZoom:t,panZoom:y}=u.getState(),c=Cc(l,r,n,i,t,f?.padding??0.1);if(!y)return Promise.resolve(!1);return await y.setViewport(c,{duration:f?.duration,ease:f?.ease,interpolate:f?.interpolate}),Promise.resolve(!0)},screenToFlowPosition:(l,f={})=>{let{transform:r,snapGrid:n,snapToGrid:i,domNode:t}=u.getState();if(!t)return l;let{x:y,y:c}=t.getBoundingClientRect(),$={x:l.x-y,y:l.y-c},A=f.snapGrid??n,j=f.snapToGrid??i;return wy($,r,j,A)},flowToScreenPosition:(l)=>{let{transform:f,domNode:r}=u.getState();if(!r)return l;let{x:n,y:i}=r.getBoundingClientRect(),t=Yc(l,f);return{x:t.x+n,y:t.y+i}}}},[])};function aw(u,l){let f=[],r=new Map,n=[];for(let i of u)if(i.type==="add"){n.push(i);continue}else if(i.type==="remove"||i.type==="replace")r.set(i.id,[i]);else{let t=r.get(i.id);if(t)t.push(i);else r.set(i.id,[i])}for(let i of l){let t=r.get(i.id);if(!t){f.push(i);continue}if(t[0].type==="remove")continue;if(t[0].type==="replace"){f.push({...t[0].item});continue}let y={...i};for(let c of t)tD(c,y);f.push(y)}if(n.length)n.forEach((i)=>{if(i.index!==void 0)f.splice(i.index,0,{...i.item});else f.push({...i.item})});return f}function tD(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 yD(u,l){return aw(u,l)}function cD(u,l){return aw(u,l)}function oi(u,l){return{id:u,type:"select",selected:l}}function Ty(u,l=new Set,f=!1){let r=[];for(let[n,i]of u){let t=l.has(n);if(!(i.selected===void 0&&!t)&&i.selected!==t){if(f)i.selected=t;r.push(oi(i.id,t))}}return r}function Bw({items:u=[],lookup:l}){let f=[],r=new Map(u.map((n)=>[n.id,n]));for(let[n,i]of u.entries()){let t=l.get(i.id),y=t?.internals?.userNode??t;if(y!==void 0&&y!==i)f.push({id:i.id,item:i,type:"replace"});if(y===void 0)f.push({item:i,type:"add",index:n})}for(let[n]of l)if(r.get(n)===void 0)f.push({id:n,type:"remove"});return f}function Vw(u){return{id:u.id,type:"remove"}}var mw=(u)=>pq(u),_D=(u)=>_9(u);function ow(u){return tu.forwardRef(u)}function Dw(u){let[l,f]=tu.useState(BigInt(0)),[r]=tu.useState(()=>$D(()=>f((n)=>n+BigInt(1))));return D9(()=>{let n=r.get();if(n.length)u(n),r.reset()},[l]),r}function $D(u){let l=[];return{get:()=>l,reset:()=>{l=[]},push:(f)=>{l.push(f),u()}}}var dw=tu.createContext(null);function AD({children:u}){let l=Zl(),f=tu.useCallback((y)=>{let{nodes:c=[],setNodes:$,hasDefaultNodes:A,onNodesChange:j,nodeLookup:F,fitViewQueued:J,onNodesChangeMiddlewareMap:Q}=l.getState(),W=c;for(let U of y)W=typeof U==="function"?U(W):U;let L=Bw({items:W,lookup:F});for(let U of Q.values())L=U(L);if(A)$(W);if(L.length>0)j?.(L);else if(J)window.requestAnimationFrame(()=>{let{fitViewQueued:U,nodes:q,setNodes:N}=l.getState();if(U)N(q)})},[]),r=Dw(f),n=tu.useCallback((y)=>{let{edges:c=[],setEdges:$,hasDefaultEdges:A,onEdgesChange:j,edgeLookup:F}=l.getState(),J=c;for(let Q of y)J=typeof Q==="function"?Q(J):Q;if(A)$(J);else if(j)j(Bw({items:J,lookup:F}))},[]),i=Dw(n),t=tu.useMemo(()=>({nodeQueue:r,edgeQueue:i}),[]);return nu.jsx(dw.Provider,{value:t,children:u})}function jD(){let u=tu.useContext(dw);if(!u)throw Error("useBatchContext must be used within a BatchProvider");return u}var FD=(u)=>!!u.panZoom;function S9(){let u=iD(),l=Zl(),f=jD(),r=il(FD),n=tu.useMemo(()=>{let i=(j)=>l.getState().nodeLookup.get(j),t=(j)=>{f.nodeQueue.push(j)},y=(j)=>{f.edgeQueue.push(j)},c=(j)=>{let{nodeLookup:F,nodeOrigin:J}=l.getState(),Q=mw(j)?j:F.get(j.id),W=Q.parentId?N9(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 ai(L)},$=(j,F,J={replace:!1})=>{t((Q)=>Q.map((W)=>{if(W.id===j){let L=typeof F==="function"?F(W):F;return J.replace&&mw(L)?L:{...W,...L}}return W}))},A=(j,F,J={replace:!1})=>{y((Q)=>Q.map((W)=>{if(W.id===j){let L=typeof F==="function"?F(W):F;return J.replace&&_D(L)?L:{...W,...L}}return W}))};return{getNodes:()=>l.getState().nodes.map((j)=>({...j})),getNode:(j)=>i(j)?.internals.userNode,getInternalNode:i,getEdges:()=>{let{edges:j=[]}=l.getState();return j.map((F)=>({...F}))},getEdge:(j)=>l.getState().edgeLookup.get(j),setNodes:t,setEdges:y,addNodes:(j)=>{let F=Array.isArray(j)?j:[j];f.nodeQueue.push((J)=>[...J,...F])},addEdges:(j)=>{let F=Array.isArray(j)?j:[j];f.edgeQueue.push((J)=>[...J,...F])},toObject:()=>{let{nodes:j=[],edges:F=[],transform:J}=l.getState(),[Q,W,L]=J;return{nodes:j.map((U)=>({...U})),edges:F.map((U)=>({...U})),viewport:{x:Q,y:W,zoom:L}}},deleteElements:async({nodes:j=[],edges:F=[]})=>{let{nodes:J,edges:Q,onNodesDelete:W,onEdgesDelete:L,triggerNodeChanges:U,triggerEdgeChanges:q,onDelete:N,onBeforeDelete:w}=l.getState(),{nodes:G,edges:Z}=await Yq({nodesToRemove:j,edgesToRemove:F,nodes:J,edges:Q,onBeforeDelete:w}),H=Z.length>0,E=G.length>0;if(H){let m=Z.map(Vw);L?.(Z),q(m)}if(E){let m=G.map(Vw);W?.(G),U(m)}if(E||H)N?.({nodes:G,edges:Z});return{deletedNodes:G,deletedEdges:Z}},getIntersectingNodes:(j,F=!0,J)=>{let Q=U9(j),W=Q?j:c(j),L=J!==void 0;if(!W)return[];return(J||l.getState().nodes).filter((U)=>{let q=l.getState().nodeLookup.get(U.id);if(q&&!Q&&(U.id===j.id||!q.internals.positionAbsolute))return!1;let N=ai(L?U:q),w=Ny(N,W);return F&&w>0||w>=N.width*N.height||w>=W.width*W.height})},isNodeIntersecting:(j,F,J=!0)=>{let W=U9(j)?j:c(j);if(!W)return!1;let L=Ny(W,F);return J&&L>0||L>=F.width*F.height||L>=W.width*W.height},updateNode:$,updateNodeData:(j,F,J={replace:!1})=>{$(j,(Q)=>{let W=typeof F==="function"?F(Q):F;return J.replace?{...Q,data:W}:{...Q,data:{...Q.data,...W}}},J)},updateEdge:A,updateEdgeData:(j,F,J={replace:!1})=>{A(j,(Q)=>{let W=typeof F==="function"?F(Q):F;return J.replace?{...Q,data:W}:{...Q,data:{...Q.data,...W}}},J)},getNodesBounds:(j)=>{let{nodeLookup:F,nodeOrigin:J}=l.getState();return A9(j,{nodeLookup:F,nodeOrigin:J})},getHandleConnections:({type:j,id:F,nodeId:J})=>Array.from(l.getState().connectionLookup.get(`${J}-${j}${F?`-${F}`:""}`)?.values()??[]),getNodeConnections:({type:j,handleId:F,nodeId:J})=>Array.from(l.getState().connectionLookup.get(`${J}${j?F?`-${j}-${F}`:`-${j}`:""}`)?.values()??[]),fitView:async(j)=>{let F=l.getState().fitViewResolver??Mq();return l.setState({fitViewQueued:!0,fitViewOptions:j,fitViewResolver:F}),f.nodeQueue.push((J)=>[...J]),F.promise}}},[]);return tu.useMemo(()=>{return{...n,...u,viewportInitialized:r}},[r])}var pw=(u)=>u.selected,UD=typeof window<"u"?window:void 0;function JD({deleteKeyCode:u,multiSelectionKeyCode:l}){let f=Zl(),{deleteElements:r}=S9(),n=Rc(u,{actInsideInputWithModifier:!1}),i=Rc(l,{target:UD});tu.useEffect(()=>{if(n){let{edges:t,nodes:y}=f.getState();r({nodes:y.filter(pw),edges:t.filter(pw)}),f.setState({nodesSelectionActive:!1})}},[n]),tu.useEffect(()=>{f.setState({multiSelectionActive:i})},[i])}function QD(u){let l=Zl();tu.useEffect(()=>{let f=()=>{if(!u.current||!(u.current.checkVisibility?.()??!0))return!1;let r=cA(u.current);if(r.height===0||r.width===0)l.getState().onError?.("004",Jr.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 KA={position:"absolute",width:"100%",height:"100%",top:0,left:0},ND=(u)=>({userSelectionActive:u.userSelectionActive,lib:u.lib,connectionInProgress:u.connection.inProgress});function qD({onPaneContextMenu:u,zoomOnScroll:l=!0,zoomOnPinch:f=!0,panOnScroll:r=!1,panOnScrollSpeed:n=0.5,panOnScrollMode:i=an.Free,zoomOnDoubleClick:t=!0,panOnDrag:y=!0,defaultViewport:c,translateExtent:$,minZoom:A,maxZoom:j,zoomActivationKeyCode:F,preventScrolling:J=!0,children:Q,noWheelClassName:W,noPanClassName:L,onViewportChange:U,isControlledViewport:q,paneClickDistance:N,selectionOnDrag:w}){let G=Zl(),Z=tu.useRef(null),{userSelectionActive:H,lib:E,connectionInProgress:m}=il(ND,El),S=Rc(F),B=tu.useRef();QD(Z);let D=tu.useCallback((X)=>{if(U?.({x:X[0],y:X[1],zoom:X[2]}),!q)G.setState({transform:X})},[U,q]);return tu.useEffect(()=>{if(Z.current){B.current=tw({domNode:Z.current,minZoom:A,maxZoom:j,translateExtent:$,viewport:c,onDraggingChange:(p)=>G.setState((v)=>v.paneDragging===p?v:{paneDragging:p}),onPanZoomStart:(p,v)=>{let{onViewportChangeStart:z,onMoveStart:P}=G.getState();P?.(p,v),z?.(v)},onPanZoom:(p,v)=>{let{onViewportChange:z,onMove:P}=G.getState();P?.(p,v),z?.(v)},onPanZoomEnd:(p,v)=>{let{onViewportChangeEnd:z,onMoveEnd:P}=G.getState();P?.(p,v),z?.(v)}});let{x:X,y:O,zoom:Y}=B.current.getViewport();return G.setState({panZoom:B.current,transform:[X,O,Y],domNode:Z.current.closest(".react-flow")}),()=>{B.current?.destroy()}}},[]),tu.useEffect(()=>{B.current?.update({onPaneContextMenu:u,zoomOnScroll:l,zoomOnPinch:f,panOnScroll:r,panOnScrollSpeed:n,panOnScrollMode:i,zoomOnDoubleClick:t,panOnDrag:y,zoomActivationKeyPressed:S,preventScrolling:J,noPanClassName:L,userSelectionActive:H,noWheelClassName:W,lib:E,onTransformChange:D,connectionInProgress:m,selectionOnDrag:w,paneClickDistance:N})},[u,l,f,r,n,i,t,y,S,J,L,H,W,E,D,m,w,N]),nu.jsx("div",{className:"react-flow__renderer",ref:Z,style:KA,children:Q})}var wD=(u)=>({userSelectionActive:u.userSelectionActive,userSelectionRect:u.userSelectionRect});function WD(){let{userSelectionActive:u,userSelectionRect:l}=il(wD,El);if(!(u&&l))return null;return nu.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 V9=(u,l)=>{return(f)=>{if(f.target!==l.current)return;u?.(f)}},LD=(u)=>({userSelectionActive:u.userSelectionActive,elementsSelectable:u.elementsSelectable,connectionInProgress:u.connection.inProgress,dragging:u.paneDragging});function TD({isSelecting:u,selectionKeyPressed:l,selectionMode:f=gi.Full,panOnDrag:r,paneClickDistance:n,selectionOnDrag:i,onSelectionStart:t,onSelectionEnd:y,onPaneClick:c,onPaneContextMenu:$,onPaneScroll:A,onPaneMouseEnter:j,onPaneMouseMove:F,onPaneMouseLeave:J,children:Q}){let W=Zl(),{userSelectionActive:L,elementsSelectable:U,dragging:q,connectionInProgress:N}=il(LD,El),w=U&&(u||L),G=tu.useRef(null),Z=tu.useRef(),H=tu.useRef(new Set),E=tu.useRef(new Set),m=tu.useRef(!1),S=(z)=>{if(m.current||N){m.current=!1;return}c?.(z),W.getState().resetSelectedElements(),W.setState({nodesSelectionActive:!1})},B=(z)=>{if(Array.isArray(r)&&r?.includes(2)){z.preventDefault();return}$?.(z)},D=A?(z)=>A(z):void 0,X=(z)=>{if(m.current)z.stopPropagation(),m.current=!1},O=(z)=>{let{domNode:P}=W.getState();if(Z.current=P?.getBoundingClientRect(),!Z.current)return;let k=z.target===G.current;if(!k&&!!z.target.closest(".nokey")||!u||!(i&&k||l)||z.button!==0||!z.isPrimary)return;z.target?.setPointerCapture?.(z.pointerId),m.current=!1;let{x:d,y:s}=Br(z.nativeEvent,Z.current);if(W.setState({userSelectionRect:{width:0,height:0,startX:d,startY:s,x:d,y:s}}),!k)z.stopPropagation(),z.preventDefault()},Y=(z)=>{let{userSelectionRect:P,transform:k,nodeLookup:I,edgeLookup:b,connectionLookup:d,triggerNodeChanges:s,triggerEdgeChanges:h,defaultEdgeOptions:lu,resetSelectedElements:cu}=W.getState();if(!Z.current||!P)return;let{x:_u,y:Fu}=Br(z.nativeEvent,Z.current),{startX:zu,startY:Wu}=P;if(!m.current){let a=l?0:n;if(Math.hypot(_u-zu,Fu-Wu)<=a)return;cu(),t?.(z)}m.current=!0;let C={startX:zu,startY:Wu,x:_ua.id)),E.current=new Set;let Gu=lu?.selectable??!0;for(let a of H.current){let qu=d.get(a);if(!qu)continue;for(let{edgeId:Zu}of qu.values()){let Bu=b.get(Zu);if(Bu&&(Bu.selectable??Gu))E.current.add(Zu)}}if(!q9(e,H.current)){let a=Ty(I,H.current,!0);s(a)}if(!q9(uu,E.current)){let a=Ty(b,E.current);h(a)}W.setState({userSelectionRect:C,userSelectionActive:!0,nodesSelectionActive:!1})},p=(z)=>{if(z.button!==0)return;if(z.target?.releasePointerCapture?.(z.pointerId),!L&&z.target===G.current&&W.getState().userSelectionRect)S?.(z);if(W.setState({userSelectionActive:!1,userSelectionRect:null}),m.current)y?.(z),W.setState({nodesSelectionActive:H.current.size>0})},v=r===!0||Array.isArray(r)&&r.includes(0);return nu.jsxs("div",{className:Rl(["react-flow__pane",{draggable:v,dragging:q,selection:u}]),onClick:w?void 0:V9(S,G),onContextMenu:V9(B,G),onWheel:V9(D,G),onPointerEnter:w?void 0:j,onPointerMove:w?Y:F,onPointerUp:w?p:void 0,onPointerDownCapture:w?O:void 0,onClickCapture:w?X:void 0,onPointerLeave:J,ref:G,style:KA,children:[Q,nu.jsx(WD,{})]})}function p9({id:u,store:l,unselect:f=!1,nodeRef:r}){let{addSelectedNodes:n,unselectNodesAndEdges:i,multiSelectionActive:t,nodeLookup:y,onError:c}=l.getState(),$=y.get(u);if(!$){c?.("012",Jr.error012(u));return}if(l.setState({nodesSelectionActive:!1}),!$.selected)n([u]);else if(f||$.selected&&t)i({nodes:[$],edges:[]}),requestAnimationFrame(()=>r?.current?.blur())}function ew({nodeRef:u,disabled:l=!1,noDragClassName:f,handleSelector:r,nodeId:n,isSelectable:i,nodeClickDistance:t}){let y=Zl(),[c,$]=tu.useState(!1),A=tu.useRef();return tu.useEffect(()=>{A.current=dq({getStoreItems:()=>y.getState(),onNodeMouseDown:(j)=>{p9({id:j,store:y,nodeRef:u})},onDragStart:()=>{$(!0)},onDragStop:()=>{$(!1)}})},[]),tu.useEffect(()=>{if(l||!u.current||!A.current)return;return A.current.update({noDragClassName:f,handleSelector:r,domNode:u.current,isSelectable:i,nodeId:n,nodeClickDistance:t}),()=>{A.current?.destroy()}},[f,r,l,i,u,n,t]),c}var KD=(u)=>(l)=>l.selected&&(l.draggable||u&&typeof l.draggable>"u");function uW(){let u=Zl();return tu.useCallback((f)=>{let{nodeExtent:r,snapToGrid:n,snapGrid:i,nodesDraggable:t,onError:y,updateNodePositions:c,nodeLookup:$,nodeOrigin:A}=u.getState(),j=new Map,F=KD(t),J=n?i[0]:5,Q=n?i[1]:5,W=f.direction.x*J*f.factor,L=f.direction.y*Q*f.factor;for(let[,U]of $){if(!F(U))continue;let q={x:U.internals.positionAbsolute.x+W,y:U.internals.positionAbsolute.y+L};if(n)q=qy(q,i);let{position:N,positionAbsolute:w}=j9({nodeId:U.id,nextPosition:q,nodeLookup:$,nodeExtent:r,nodeOrigin:A,onError:y});U.position=N,U.internals.positionAbsolute=w,j.set(U.id,U)}c(j)},[])}var X9=tu.createContext(null),GD=X9.Provider;X9.Consumer;var lW=()=>{return tu.useContext(X9)},zD=(u)=>({connectOnClick:u.connectOnClick,noPanClassName:u.noPanClassName,rfId:u.rfId}),ED=(u,l,f)=>(r)=>{let{connectionClickStartHandle:n,connectionMode:i,connection:t}=r,{fromHandle:y,toHandle:c,isValid:$}=t,A=c?.nodeId===u&&c?.id===l&&c?.type===f;return{connectingFrom:y?.nodeId===u&&y?.id===l&&y?.type===f,connectingTo:A,clickConnecting:n?.nodeId===u&&n?.id===l&&n?.type===f,isPossibleEndHandle:i===R0.Strict?y?.type!==f:u!==y?.nodeId||l!==y?.id,connectionInProcess:!!y,clickConnectionInProcess:!!n,valid:A&&$}};function OD({type:u="source",position:l=Ku.Top,isValidConnection:f,isConnectable:r=!0,isConnectableStart:n=!0,isConnectableEnd:i=!0,id:t,onConnect:y,children:c,className:$,onMouseDown:A,onTouchStart:j,...F},J){let Q=t||null,W=u==="target",L=Zl(),U=lW(),{connectOnClick:q,noPanClassName:N,rfId:w}=il(zD,El),{connectingFrom:G,connectingTo:Z,clickConnecting:H,isPossibleEndHandle:E,connectionInProcess:m,clickConnectionInProcess:S,valid:B}=il(ED(U,Q,u),El);if(!U)L.getState().onError?.("010",Jr.error010());let D=(Y)=>{let{defaultEdgeOptions:p,onConnect:v,hasDefaultEdges:z}=L.getState(),P={...p,...Y};if(z){let{edges:k,setEdges:I}=L.getState();I(K9(P,k))}v?.(P),y?.(P)},X=(Y)=>{if(!U)return;let p=L9(Y.nativeEvent);if(n&&(p&&Y.button===0||!p)){let v=L.getState();JA.onPointerDown(Y.nativeEvent,{handleDomNode:Y.currentTarget,autoPanOnConnect:v.autoPanOnConnect,connectionMode:v.connectionMode,connectionRadius:v.connectionRadius,domNode:v.domNode,nodeLookup:v.nodeLookup,lib:v.lib,isTarget:W,handleId:Q,nodeId:U,flowId:v.rfId,panBy:v.panBy,cancelConnection:v.cancelConnection,onConnectStart:v.onConnectStart,onConnectEnd:(...z)=>L.getState().onConnectEnd?.(...z),updateConnection:v.updateConnection,onConnect:D,isValidConnection:f||((...z)=>L.getState().isValidConnection?.(...z)??!0),getTransform:()=>L.getState().transform,getFromHandle:()=>L.getState().connection.fromHandle,autoPanSpeed:v.autoPanSpeed,dragThreshold:v.connectionDragThreshold})}if(p)A?.(Y);else j?.(Y)},O=(Y)=>{let{onClickConnectStart:p,onClickConnectEnd:v,connectionClickStartHandle:z,connectionMode:P,isValidConnection:k,lib:I,rfId:b,nodeLookup:d,connection:s}=L.getState();if(!U||!z&&!n)return;if(!z){p?.(Y.nativeEvent,{nodeId:U,handleId:Q,handleType:u}),L.setState({connectionClickStartHandle:{nodeId:U,type:u,id:Q}});return}let h=w9(Y.target),lu=f||k,{connection:cu,isValid:_u}=JA.isValid(Y.nativeEvent,{handle:{nodeId:U,id:Q,type:u},connectionMode:P,fromNodeId:z.nodeId,fromHandleId:z.id||null,fromType:z.type,isValidConnection:lu,flowId:b,doc:h,lib:I,nodeLookup:d});if(_u&&cu)D(cu);let Fu=structuredClone(s);delete Fu.inProgress,Fu.toPosition=Fu.toHandle?Fu.toHandle.position:null,v?.(Y,Fu),L.setState({connectionClickStartHandle:null})};return nu.jsx("div",{"data-handleid":Q,"data-nodeid":U,"data-handlepos":l,"data-id":`${w}-${U}-${Q}-${u}`,className:Rl(["react-flow__handle",`react-flow__handle-${l}`,"nodrag",N,$,{source:!W,target:W,connectable:r,connectablestart:n,connectableend:i,clickconnecting:H,connectingfrom:G,connectingto:Z,valid:B,connectionindicator:r&&(!m||E)&&(m||S?i:n)}]),onMouseDown:X,onTouchStart:X,onClick:q?O:void 0,ref:J,...F,children:c})}var di=tu.memo(ow(OD));function ZD({data:u,isConnectable:l,sourcePosition:f=Ku.Bottom}){return nu.jsxs(nu.Fragment,{children:[u?.label,nu.jsx(di,{type:"source",position:f,isConnectable:l})]})}function HD({data:u,isConnectable:l,targetPosition:f=Ku.Top,sourcePosition:r=Ku.Bottom}){return nu.jsxs(nu.Fragment,{children:[nu.jsx(di,{type:"target",position:f,isConnectable:l}),u?.label,nu.jsx(di,{type:"source",position:r,isConnectable:l})]})}function BD(){return null}function VD({data:u,isConnectable:l,targetPosition:f=Ku.Top}){return nu.jsxs(nu.Fragment,{children:[nu.jsx(di,{type:"target",position:f,isConnectable:l}),u?.label]})}var WA={ArrowUp:{x:0,y:-1},ArrowDown:{x:0,y:1},ArrowLeft:{x:-1,y:0},ArrowRight:{x:1,y:0}},Sw={input:ZD,default:HD,output:VD,group:BD};function mD(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 DD=(u)=>{let{width:l,height:f,x:r,y:n}=Qy(u.nodeLookup,{filter:(i)=>!!i.selected});return{width:Hr(l)?l:null,height:Hr(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 pD({onSelectionContextMenu:u,noPanClassName:l,disableKeyboardA11y:f}){let r=Zl(),{width:n,height:i,transformString:t,userSelectionActive:y}=il(DD,El),c=uW(),$=tu.useRef(null);tu.useEffect(()=>{if(!f)$.current?.focus({preventScroll:!0})},[f]);let A=!y&&n!==null&&i!==null;if(ew({nodeRef:$,disabled:!A}),!A)return null;let j=u?(J)=>{let Q=r.getState().nodes.filter((W)=>W.selected);u(J,Q)}:void 0,F=(J)=>{if(Object.prototype.hasOwnProperty.call(WA,J.key))J.preventDefault(),c({direction:WA[J.key],factor:J.shiftKey?4:1})};return nu.jsx("div",{className:Rl(["react-flow__nodesselection","react-flow__container",l]),style:{transform:t},children:nu.jsx("div",{ref:$,className:"react-flow__nodesselection-rect",onContextMenu:j,tabIndex:f?void 0:-1,onKeyDown:f?void 0:F,style:{width:n,height:i}})})}var Xw=typeof window<"u"?window:void 0,SD=(u)=>{return{nodesSelectionActive:u.nodesSelectionActive,userSelectionActive:u.userSelectionActive}};function fW({children:u,onPaneClick:l,onPaneMouseEnter:f,onPaneMouseMove:r,onPaneMouseLeave:n,onPaneContextMenu:i,onPaneScroll:t,paneClickDistance:y,deleteKeyCode:c,selectionKeyCode:$,selectionOnDrag:A,selectionMode:j,onSelectionStart:F,onSelectionEnd:J,multiSelectionKeyCode:Q,panActivationKeyCode:W,zoomActivationKeyCode:L,elementsSelectable:U,zoomOnScroll:q,zoomOnPinch:N,panOnScroll:w,panOnScrollSpeed:G,panOnScrollMode:Z,zoomOnDoubleClick:H,panOnDrag:E,defaultViewport:m,translateExtent:S,minZoom:B,maxZoom:D,preventScrolling:X,onSelectionContextMenu:O,noWheelClassName:Y,noPanClassName:p,disableKeyboardA11y:v,onViewportChange:z,isControlledViewport:P}){let{nodesSelectionActive:k,userSelectionActive:I}=il(SD,El),b=Rc($,{target:Xw}),d=Rc(W,{target:Xw}),s=d||E,h=d||w,lu=A&&s!==!0,cu=b||I||lu;return JD({deleteKeyCode:c,multiSelectionKeyCode:Q}),nu.jsx(qD,{onPaneContextMenu:i,elementsSelectable:U,zoomOnScroll:q,zoomOnPinch:N,panOnScroll:h,panOnScrollSpeed:G,panOnScrollMode:Z,zoomOnDoubleClick:H,panOnDrag:!b&&s,defaultViewport:m,translateExtent:S,minZoom:B,maxZoom:D,zoomActivationKeyCode:L,preventScrolling:X,noWheelClassName:Y,noPanClassName:p,onViewportChange:z,isControlledViewport:P,paneClickDistance:y,selectionOnDrag:lu,children:nu.jsxs(TD,{onSelectionStart:F,onSelectionEnd:J,onPaneClick:l,onPaneMouseEnter:f,onPaneMouseMove:r,onPaneMouseLeave:n,onPaneContextMenu:i,onPaneScroll:t,panOnDrag:s,isSelecting:!!cu,selectionMode:j,selectionKeyPressed:b,paneClickDistance:y,selectionOnDrag:lu,children:[u,k&&nu.jsx(pD,{onSelectionContextMenu:O,noPanClassName:p,disableKeyboardA11y:v})]})})}fW.displayName="FlowRenderer";var XD=tu.memo(fW),YD=(u)=>(l)=>{return u?iA(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 PD(u){return il(tu.useCallback(YD(u),[u]),El)}var CD=(u)=>u.updateNodeInternals;function MD(){let u=il(CD),[l]=tu.useState(()=>{if(typeof ResizeObserver>"u")return null;return new ResizeObserver((f)=>{let r=new Map;f.forEach((n)=>{let i=n.target.getAttribute("data-id");r.set(i,{id:i,nodeElement:n.target,force:!0})}),u(r)})});return tu.useEffect(()=>{return()=>{l?.disconnect()}},[l]),l}function RD({node:u,nodeType:l,hasDimensions:f,resizeObserver:r}){let n=Zl(),i=tu.useRef(null),t=tu.useRef(null),y=tu.useRef(u.sourcePosition),c=tu.useRef(u.targetPosition),$=tu.useRef(l),A=f&&!!u.internals.handleBounds;return tu.useEffect(()=>{if(i.current&&!u.hidden&&(!A||t.current!==i.current)){if(t.current)r?.unobserve(t.current);r?.observe(i.current),t.current=i.current}},[A,u.hidden]),tu.useEffect(()=>{return()=>{if(t.current)r?.unobserve(t.current),t.current=null}},[]),tu.useEffect(()=>{if(i.current){let j=$.current!==l,F=y.current!==u.sourcePosition,J=c.current!==u.targetPosition;if(j||F||J)$.current=l,y.current=u.sourcePosition,c.current=u.targetPosition,n.getState().updateNodeInternals(new Map([[u.id,{id:u.id,nodeElement:i.current,force:!0}]]))}},[u.id,l,u.sourcePosition,u.targetPosition]),i}function xD({id:u,onClick:l,onMouseEnter:f,onMouseMove:r,onMouseLeave:n,onContextMenu:i,onDoubleClick:t,nodesDraggable:y,elementsSelectable:c,nodesConnectable:$,nodesFocusable:A,resizeObserver:j,noDragClassName:F,noPanClassName:J,disableKeyboardA11y:Q,rfId:W,nodeTypes:L,nodeClickDistance:U,onError:q}){let{node:N,internals:w,isParent:G}=il((_u)=>{let Fu=_u.nodeLookup.get(u),zu=_u.parentLookup.has(u);return{node:Fu,internals:Fu.internals,isParent:zu}},El),Z=N.type||"default",H=L?.[Z]||Sw[Z];if(H===void 0)q?.("003",Jr.error003(Z)),Z="default",H=L?.default||Sw.default;let E=!!(N.draggable||y&&typeof N.draggable>"u"),m=!!(N.selectable||c&&typeof N.selectable>"u"),S=!!(N.connectable||$&&typeof N.connectable>"u"),B=!!(N.focusable||A&&typeof N.focusable>"u"),D=Zl(),X=Q9(N),O=RD({node:N,nodeType:Z,hasDimensions:X,resizeObserver:j}),Y=ew({nodeRef:O,disabled:N.hidden||!E,noDragClassName:F,handleSelector:N.dragHandle,nodeId:u,isSelectable:m,nodeClickDistance:U}),p=uW();if(N.hidden)return null;let v=qn(N),z=mD(N),P=m||E||l||f||r||n,k=f?(_u)=>f(_u,{...w.userNode}):void 0,I=r?(_u)=>r(_u,{...w.userNode}):void 0,b=n?(_u)=>n(_u,{...w.userNode}):void 0,d=i?(_u)=>i(_u,{...w.userNode}):void 0,s=t?(_u)=>t(_u,{...w.userNode}):void 0,h=(_u)=>{let{selectNodesOnDrag:Fu,nodeDragThreshold:zu}=D.getState();if(m&&(!Fu||!E||zu>0))p9({id:u,store:D,nodeRef:O});if(l)l(_u,{...w.userNode})},lu=(_u)=>{if(W9(_u.nativeEvent)||Q)return;if(i9.includes(_u.key)&&m){let Fu=_u.key==="Escape";p9({id:u,store:D,unselect:Fu,nodeRef:O})}else if(E&&N.selected&&Object.prototype.hasOwnProperty.call(WA,_u.key)){_u.preventDefault();let{ariaLabelConfig:Fu}=D.getState();D.setState({ariaLiveMessage:Fu["node.a11yDescription.ariaLiveMessage"]({direction:_u.key.replace("Arrow","").toLowerCase(),x:~~w.positionAbsolute.x,y:~~w.positionAbsolute.y})}),p({direction:WA[_u.key],factor:_u.shiftKey?4:1})}},cu=()=>{if(Q||!O.current?.matches(":focus-visible"))return;let{transform:_u,width:Fu,height:zu,autoPanOnNodeFocus:Wu,setCenter:C}=D.getState();if(!Wu)return;if(!(iA(new Map([[u,N]]),{x:0,y:0,width:Fu,height:zu},_u,!0).length>0))C(N.position.x+v.width/2,N.position.y+v.height/2,{zoom:_u[2]})};return nu.jsx("div",{className:Rl(["react-flow__node",`react-flow__node-${Z}`,{[J]:E},N.className,{selected:N.selected,selectable:m,parent:G,draggable:E,dragging:Y}]),ref:O,style:{zIndex:w.z,transform:`translate(${w.positionAbsolute.x}px,${w.positionAbsolute.y}px)`,pointerEvents:P?"all":"none",visibility:X?"visible":"hidden",...N.style,...z},"data-id":u,"data-testid":`rf__node-${u}`,onMouseEnter:k,onMouseMove:I,onMouseLeave:b,onContextMenu:d,onClick:h,onDoubleClick:s,onKeyDown:B?lu:void 0,tabIndex:B?0:void 0,onFocus:B?cu:void 0,role:N.ariaRole??(B?"group":void 0),"aria-roledescription":"node","aria-describedby":Q?void 0:`${Iw}-${W}`,"aria-label":N.ariaLabel,...N.domAttributes,children:nu.jsx(GD,{value:u,children:nu.jsx(H,{id:u,data:N.data,type:Z,positionAbsoluteX:w.positionAbsolute.x,positionAbsoluteY:w.positionAbsolute.y,selected:N.selected??!1,selectable:m,draggable:E,deletable:N.deletable??!0,isConnectable:S,sourcePosition:N.sourcePosition,targetPosition:N.targetPosition,dragging:Y,dragHandle:N.dragHandle,zIndex:w.z,parentId:N.parentId,...v})})})}var hD=tu.memo(xD),bD=(u)=>({nodesDraggable:u.nodesDraggable,nodesConnectable:u.nodesConnectable,nodesFocusable:u.nodesFocusable,elementsSelectable:u.elementsSelectable,onError:u.onError});function rW(u){let{nodesDraggable:l,nodesConnectable:f,nodesFocusable:r,elementsSelectable:n,onError:i}=il(bD,El),t=PD(u.onlyRenderVisibleElements),y=MD();return nu.jsx("div",{className:"react-flow__nodes",style:KA,children:t.map((c)=>{return nu.jsx(hD,{id:c,nodeTypes:u.nodeTypes,nodeExtent:u.nodeExtent,onClick:u.onNodeClick,onMouseEnter:u.onNodeMouseEnter,onMouseMove:u.onNodeMouseMove,onMouseLeave:u.onNodeMouseLeave,onContextMenu:u.onNodeContextMenu,onDoubleClick:u.onNodeDoubleClick,noDragClassName:u.noDragClassName,noPanClassName:u.noPanClassName,rfId:u.rfId,disableKeyboardA11y:u.disableKeyboardA11y,resizeObserver:y,nodesDraggable:l,nodesConnectable:f,nodesFocusable:r,elementsSelectable:n,nodeClickDistance:u.nodeClickDistance,onError:i},c)})})}rW.displayName="NodeRenderer";var vD=tu.memo(rW);function kD(u){return il(tu.useCallback((f)=>{if(!u)return f.edges.map((n)=>n.id);let r=[];if(f.width&&f.height)for(let n of f.edges){let i=f.nodeLookup.get(n.source),t=f.nodeLookup.get(n.target);if(i&&t&&hq({sourceNode:i,targetNode:t,width:f.width,height:f.height,transform:f.transform}))r.push(n.id)}return r},[u]),El)}var ID=({color:u="none",strokeWidth:l=1})=>{let f={strokeWidth:l,...u&&{stroke:u}};return nu.jsx("polyline",{className:"arrow",style:f,strokeLinecap:"round",fill:"none",strokeLinejoin:"round",points:"-5,-4 0,0 -5,4"})},gD=({color:u="none",strokeWidth:l=1})=>{let f={strokeWidth:l,...u&&{stroke:u,fill:u}};return nu.jsx("polyline",{className:"arrowclosed",style:f,strokeLinecap:"round",strokeLinejoin:"round",points:"-5,-4 0,0 -5,4 -5,-4"})},Yw={[x0.Arrow]:ID,[x0.ArrowClosed]:gD};function sD(u){let l=Zl();return tu.useMemo(()=>{if(!Object.prototype.hasOwnProperty.call(Yw,u))return l.getState().onError?.("009",Jr.error009(u)),null;return Yw[u]},[u])}var aD=({id:u,type:l,color:f,width:r=12.5,height:n=12.5,markerUnits:i="strokeWidth",strokeWidth:t,orient:y="auto-start-reverse"})=>{let c=sD(l);if(!c)return null;return nu.jsx("marker",{className:"react-flow__arrowhead",id:u,markerWidth:`${r}`,markerHeight:`${n}`,viewBox:"-10 -10 20 20",markerUnits:i,orient:y,refX:"0",refY:"0",children:nu.jsx(c,{color:f,strokeWidth:t})})},nW=({defaultColor:u,rfId:l})=>{let f=il((i)=>i.edges),r=il((i)=>i.defaultEdgeOptions),n=tu.useMemo(()=>{return vq(f,{id:l,defaultColor:u,defaultMarkerStart:r?.markerStart,defaultMarkerEnd:r?.markerEnd})},[f,r,l,u]);if(!n.length)return null;return nu.jsx("svg",{className:"react-flow__marker","aria-hidden":"true",children:nu.jsx("defs",{children:n.map((i)=>nu.jsx(aD,{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))})})};nW.displayName="MarkerDefinitions";var oD=tu.memo(nW);function iW({x:u,y:l,label:f,labelStyle:r,labelShowBg:n=!0,labelBgStyle:i,labelBgPadding:t=[2,4],labelBgBorderRadius:y=2,children:c,className:$,...A}){let[j,F]=tu.useState({x:1,y:0,width:0,height:0}),J=Rl(["react-flow__edge-textwrapper",$]),Q=tu.useRef(null);if(tu.useEffect(()=>{if(Q.current){let W=Q.current.getBBox();F({x:W.x,y:W.y,width:W.width,height:W.height})}},[f]),!f)return null;return nu.jsxs("g",{transform:`translate(${u-j.width/2} ${l-j.height/2})`,className:J,visibility:j.width?"visible":"hidden",...A,children:[n&&nu.jsx("rect",{width:j.width+2*t[0],x:-t[0],y:-t[1],height:j.height+2*t[1],className:"react-flow__edge-textbg",style:i,rx:y,ry:y}),nu.jsx("text",{className:"react-flow__edge-text",y:j.height/2,dy:"0.3em",ref:Q,style:r,children:f}),c]})}iW.displayName="EdgeText";var dD=tu.memo(iW);function Ky({path:u,labelX:l,labelY:f,label:r,labelStyle:n,labelShowBg:i,labelBgStyle:t,labelBgPadding:y,labelBgBorderRadius:c,interactionWidth:$=20,...A}){return nu.jsxs(nu.Fragment,{children:[nu.jsx("path",{...A,d:u,fill:"none",className:Rl(["react-flow__edge-path",A.className])}),$?nu.jsx("path",{d:u,fill:"none",strokeOpacity:0,strokeWidth:$,className:"react-flow__edge-interaction"}):null,r&&Hr(l)&&Hr(f)?nu.jsx(dD,{x:l,y:f,label:r,labelStyle:n,labelShowBg:i,labelBgStyle:t,labelBgPadding:y,labelBgBorderRadius:c}):null]})}function Pw({pos:u,x1:l,y1:f,x2:r,y2:n}){if(u===Ku.Left||u===Ku.Right)return[0.5*(l+r),f];return[l,0.5*(f+n)]}function tW({sourceX:u,sourceY:l,sourcePosition:f=Ku.Bottom,targetX:r,targetY:n,targetPosition:i=Ku.Top}){let[t,y]=Pw({pos:f,x1:u,y1:l,x2:r,y2:n}),[c,$]=Pw({pos:i,x1:r,y1:n,x2:u,y2:l}),[A,j,F,J]=_A({sourceX:u,sourceY:l,targetX:r,targetY:n,sourceControlX:t,sourceControlY:y,targetControlX:c,targetControlY:$});return[`M${u},${l} C${t},${y} ${c},${$} ${r},${n}`,A,j,F,J]}function yW(u){return tu.memo(({id:l,sourceX:f,sourceY:r,targetX:n,targetY:i,sourcePosition:t,targetPosition:y,label:c,labelStyle:$,labelShowBg:A,labelBgStyle:j,labelBgPadding:F,labelBgBorderRadius:J,style:Q,markerEnd:W,markerStart:L,interactionWidth:U})=>{let[q,N,w]=tW({sourceX:f,sourceY:r,sourcePosition:t,targetX:n,targetY:i,targetPosition:y}),G=u.isInternal?void 0:l;return nu.jsx(Ky,{id:G,path:q,labelX:N,labelY:w,label:c,labelStyle:$,labelShowBg:A,labelBgStyle:j,labelBgPadding:F,labelBgBorderRadius:J,style:Q,markerEnd:W,markerStart:L,interactionWidth:U})})}var eD=yW({isInternal:!1}),cW=yW({isInternal:!0});eD.displayName="SimpleBezierEdge";cW.displayName="SimpleBezierEdgeInternal";function _W(u){return tu.memo(({id:l,sourceX:f,sourceY:r,targetX:n,targetY:i,label:t,labelStyle:y,labelShowBg:c,labelBgStyle:$,labelBgPadding:A,labelBgBorderRadius:j,style:F,sourcePosition:J=Ku.Bottom,targetPosition:Q=Ku.Top,markerEnd:W,markerStart:L,pathOptions:U,interactionWidth:q})=>{let[N,w,G]=Mc({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 nu.jsx(Ky,{id:Z,path:N,labelX:w,labelY:G,label:t,labelStyle:y,labelShowBg:c,labelBgStyle:$,labelBgPadding:A,labelBgBorderRadius:j,style:F,markerEnd:W,markerStart:L,interactionWidth:q})})}var $W=_W({isInternal:!1}),AW=_W({isInternal:!0});$W.displayName="SmoothStepEdge";AW.displayName="SmoothStepEdgeInternal";function jW(u){return tu.memo(({id:l,...f})=>{let r=u.isInternal?void 0:l;return nu.jsx($W,{...f,id:r,pathOptions:tu.useMemo(()=>({borderRadius:0,offset:f.pathOptions?.offset}),[f.pathOptions?.offset])})})}var up=jW({isInternal:!1}),FW=jW({isInternal:!0});up.displayName="StepEdge";FW.displayName="StepEdgeInternal";function UW(u){return tu.memo(({id:l,sourceX:f,sourceY:r,targetX:n,targetY:i,label:t,labelStyle:y,labelShowBg:c,labelBgStyle:$,labelBgPadding:A,labelBgBorderRadius:j,style:F,markerEnd:J,markerStart:Q,interactionWidth:W})=>{let[L,U,q]=AA({sourceX:f,sourceY:r,targetX:n,targetY:i}),N=u.isInternal?void 0:l;return nu.jsx(Ky,{id:N,path:L,labelX:U,labelY:q,label:t,labelStyle:y,labelShowBg:c,labelBgStyle:$,labelBgPadding:A,labelBgBorderRadius:j,style:F,markerEnd:J,markerStart:Q,interactionWidth:W})})}var lp=UW({isInternal:!1}),JW=UW({isInternal:!0});lp.displayName="StraightEdge";JW.displayName="StraightEdgeInternal";function QW(u){return tu.memo(({id:l,sourceX:f,sourceY:r,targetX:n,targetY:i,sourcePosition:t=Ku.Bottom,targetPosition:y=Ku.Top,label:c,labelStyle:$,labelShowBg:A,labelBgStyle:j,labelBgPadding:F,labelBgBorderRadius:J,style:Q,markerEnd:W,markerStart:L,pathOptions:U,interactionWidth:q})=>{let[N,w,G]=$A({sourceX:f,sourceY:r,sourcePosition:t,targetX:n,targetY:i,targetPosition:y,curvature:U?.curvature}),Z=u.isInternal?void 0:l;return nu.jsx(Ky,{id:Z,path:N,labelX:w,labelY:G,label:c,labelStyle:$,labelShowBg:A,labelBgStyle:j,labelBgPadding:F,labelBgBorderRadius:J,style:Q,markerEnd:W,markerStart:L,interactionWidth:q})})}var fp=QW({isInternal:!1}),NW=QW({isInternal:!0});fp.displayName="BezierEdge";NW.displayName="BezierEdgeInternal";var Cw={default:NW,straight:JW,step:FW,smoothstep:AW,simplebezier:cW},Mw={sourceX:null,sourceY:null,targetX:null,targetY:null,sourcePosition:null,targetPosition:null},rp=(u,l,f)=>{if(f===Ku.Left)return u-l;if(f===Ku.Right)return u+l;return u},np=(u,l,f)=>{if(f===Ku.Top)return u-l;if(f===Ku.Bottom)return u+l;return u},Rw="react-flow__edgeupdater";function xw({position:u,centerX:l,centerY:f,radius:r=10,onMouseDown:n,onMouseEnter:i,onMouseOut:t,type:y}){return nu.jsx("circle",{onMouseDown:n,onMouseEnter:i,onMouseOut:t,className:Rl([Rw,`${Rw}-${y}`]),cx:rp(l,r,u),cy:np(f,r,u),r,stroke:"transparent",fill:"transparent"})}function ip({isReconnectable:u,reconnectRadius:l,edge:f,sourceX:r,sourceY:n,targetX:i,targetY:t,sourcePosition:y,targetPosition:c,onReconnect:$,onReconnectStart:A,onReconnectEnd:j,setReconnecting:F,setUpdateHover:J}){let Q=Zl(),W=(w,G)=>{if(w.button!==0)return;let{autoPanOnConnect:Z,domNode:H,connectionMode:E,connectionRadius:m,lib:S,onConnectStart:B,cancelConnection:D,nodeLookup:X,rfId:O,panBy:Y,updateConnection:p}=Q.getState(),v=G.type==="target",z=(I,b)=>{F(!1),j?.(I,f,G.type,b)},P=(I)=>$?.(f,I),k=(I,b)=>{F(!0),A?.(w,f,G.type),B?.(I,b)};JA.onPointerDown(w.nativeEvent,{autoPanOnConnect:Z,connectionMode:E,connectionRadius:m,domNode:H,handleId:G.id,nodeId:G.nodeId,nodeLookup:X,isTarget:v,edgeUpdaterType:G.type,lib:S,flowId:O,cancelConnection:D,panBy:Y,isValidConnection:(...I)=>Q.getState().isValidConnection?.(...I)??!0,onConnect:P,onConnectStart:k,onConnectEnd:(...I)=>Q.getState().onConnectEnd?.(...I),onReconnectEnd:z,updateConnection:p,getTransform:()=>Q.getState().transform,getFromHandle:()=>Q.getState().connection.fromHandle,dragThreshold:Q.getState().connectionDragThreshold,handleDomNode:w.currentTarget})},L=(w)=>W(w,{nodeId:f.target,id:f.targetHandle??null,type:"target"}),U=(w)=>W(w,{nodeId:f.source,id:f.sourceHandle??null,type:"source"}),q=()=>J(!0),N=()=>J(!1);return nu.jsxs(nu.Fragment,{children:[(u===!0||u==="source")&&nu.jsx(xw,{position:y,centerX:r,centerY:n,radius:l,onMouseDown:L,onMouseEnter:q,onMouseOut:N,type:"source"}),(u===!0||u==="target")&&nu.jsx(xw,{position:c,centerX:i,centerY:t,radius:l,onMouseDown:U,onMouseEnter:q,onMouseOut:N,type:"target"})]})}function tp({id:u,edgesFocusable:l,edgesReconnectable:f,elementsSelectable:r,onClick:n,onDoubleClick:i,onContextMenu:t,onMouseEnter:y,onMouseMove:c,onMouseLeave:$,reconnectRadius:A,onReconnect:j,onReconnectStart:F,onReconnectEnd:J,rfId:Q,edgeTypes:W,noPanClassName:L,onError:U,disableKeyboardA11y:q}){let N=il((C)=>C.edgeLookup.get(u)),w=il((C)=>C.defaultEdgeOptions);N=w?{...w,...N}:N;let G=N.type||"default",Z=W?.[G]||Cw[G];if(Z===void 0)U?.("011",Jr.error011(G)),G="default",Z=W?.default||Cw.default;let H=!!(N.focusable||l&&typeof N.focusable>"u"),E=typeof j<"u"&&(N.reconnectable||f&&typeof N.reconnectable>"u"),m=!!(N.selectable||r&&typeof N.selectable>"u"),S=tu.useRef(null),[B,D]=tu.useState(!1),[X,O]=tu.useState(!1),Y=Zl(),{zIndex:p,sourceX:v,sourceY:z,targetX:P,targetY:k,sourcePosition:I,targetPosition:b}=il(tu.useCallback((C)=>{let e=C.nodeLookup.get(N.source),uu=C.nodeLookup.get(N.target);if(!e||!uu)return{zIndex:N.zIndex,...Mw};let Gu=bq({id:u,sourceNode:e,targetNode:uu,sourceHandle:N.sourceHandle||null,targetHandle:N.targetHandle||null,connectionMode:C.connectionMode,onError:U});return{zIndex:xq({selected:N.selected,zIndex:N.zIndex,sourceNode:e,targetNode:uu,elevateOnSelect:C.elevateEdgesOnSelect,zIndexMode:C.zIndexMode}),...Gu||Mw}},[N.source,N.target,N.sourceHandle,N.targetHandle,N.selected,N.zIndex]),El),d=tu.useMemo(()=>N.markerStart?`url('#${jA(N.markerStart,Q)}')`:void 0,[N.markerStart,Q]),s=tu.useMemo(()=>N.markerEnd?`url('#${jA(N.markerEnd,Q)}')`:void 0,[N.markerEnd,Q]);if(N.hidden||v===null||z===null||P===null||k===null)return null;let h=(C)=>{let{addSelectedEdges:e,unselectNodesAndEdges:uu,multiSelectionActive:Gu}=Y.getState();if(m)if(Y.setState({nodesSelectionActive:!1}),N.selected&&Gu)uu({nodes:[],edges:[N]}),S.current?.blur();else e([u]);if(n)n(C,N)},lu=i?(C)=>{i(C,{...N})}:void 0,cu=t?(C)=>{t(C,{...N})}:void 0,_u=y?(C)=>{y(C,{...N})}:void 0,Fu=c?(C)=>{c(C,{...N})}:void 0,zu=$?(C)=>{$(C,{...N})}:void 0,Wu=(C)=>{if(!q&&i9.includes(C.key)&&m){let{unselectNodesAndEdges:e,addSelectedEdges:uu}=Y.getState();if(C.key==="Escape")S.current?.blur(),e({edges:[N]});else uu([u])}};return nu.jsx("svg",{style:{zIndex:p},children:nu.jsxs("g",{className:Rl(["react-flow__edge",`react-flow__edge-${G}`,N.className,L,{selected:N.selected,animated:N.animated,inactive:!m&&!n,updating:B,selectable:m}]),onClick:h,onDoubleClick:lu,onContextMenu:cu,onMouseEnter:_u,onMouseMove:Fu,onMouseLeave:zu,onKeyDown:H?Wu:void 0,tabIndex:H?0:void 0,role:N.ariaRole??(H?"group":"img"),"aria-roledescription":"edge","data-id":u,"data-testid":`rf__edge-${u}`,"aria-label":N.ariaLabel===null?void 0:N.ariaLabel||`Edge from ${N.source} to ${N.target}`,"aria-describedby":H?`${gw}-${Q}`:void 0,ref:S,...N.domAttributes,children:[!X&&nu.jsx(Z,{id:u,source:N.source,target:N.target,type:N.type,selected:N.selected,animated:N.animated,selectable:m,deletable:N.deletable??!0,label:N.label,labelStyle:N.labelStyle,labelShowBg:N.labelShowBg,labelBgStyle:N.labelBgStyle,labelBgPadding:N.labelBgPadding,labelBgBorderRadius:N.labelBgBorderRadius,sourceX:v,sourceY:z,targetX:P,targetY:k,sourcePosition:I,targetPosition:b,data:N.data,style:N.style,sourceHandleId:N.sourceHandle,targetHandleId:N.targetHandle,markerStart:d,markerEnd:s,pathOptions:"pathOptions"in N?N.pathOptions:void 0,interactionWidth:N.interactionWidth}),E&&nu.jsx(ip,{edge:N,isReconnectable:E,reconnectRadius:A,onReconnect:j,onReconnectStart:F,onReconnectEnd:J,sourceX:v,sourceY:z,targetX:P,targetY:k,sourcePosition:I,targetPosition:b,setUpdateHover:D,setReconnecting:O})]})})}var yp=tu.memo(tp),cp=(u)=>({edgesFocusable:u.edgesFocusable,edgesReconnectable:u.edgesReconnectable,elementsSelectable:u.elementsSelectable,connectionMode:u.connectionMode,onError:u.onError});function qW({defaultMarkerColor:u,onlyRenderVisibleElements:l,rfId:f,edgeTypes:r,noPanClassName:n,onReconnect:i,onEdgeContextMenu:t,onEdgeMouseEnter:y,onEdgeMouseMove:c,onEdgeMouseLeave:$,onEdgeClick:A,reconnectRadius:j,onEdgeDoubleClick:F,onReconnectStart:J,onReconnectEnd:Q,disableKeyboardA11y:W}){let{edgesFocusable:L,edgesReconnectable:U,elementsSelectable:q,onError:N}=il(cp,El),w=kD(l);return nu.jsxs("div",{className:"react-flow__edges",children:[nu.jsx(oD,{defaultColor:u,rfId:f}),w.map((G)=>{return nu.jsx(yp,{id:G,edgesFocusable:L,edgesReconnectable:U,elementsSelectable:q,noPanClassName:n,onReconnect:i,onContextMenu:t,onMouseEnter:y,onMouseMove:c,onMouseLeave:$,onClick:A,reconnectRadius:j,onDoubleClick:F,onReconnectStart:J,onReconnectEnd:Q,rfId:f,onError:N,edgeTypes:r,disableKeyboardA11y:W},G)})]})}qW.displayName="EdgeRenderer";var _p=tu.memo(qW),$p=(u)=>`translate(${u.transform[0]}px,${u.transform[1]}px) scale(${u.transform[2]})`;function Ap({children:u}){let l=il($p);return nu.jsx("div",{className:"react-flow__viewport xyflow__viewport react-flow__container",style:{transform:l},children:u})}function jp(u){let l=S9(),f=tu.useRef(!1);tu.useEffect(()=>{if(!f.current&&l.viewportInitialized&&u)setTimeout(()=>u(l),1),f.current=!0},[u,l.viewportInitialized])}var Fp=(u)=>u.panZoom?.syncViewport;function Up(u){let l=il(Fp),f=Zl();return tu.useEffect(()=>{if(u)l?.(u),f.setState({transform:[u.x,u.y,u.zoom]})},[u,l]),null}function hw(u){return u.connection.inProgress?{...u.connection,to:wy(u.connection.to,u.transform)}:{...u.connection}}function Jp(u){if(u)return(f)=>{let r=hw(f);return u(r)};return hw}function Qp(u){let l=Jp(u);return il(l,El)}var Np=(u)=>({nodesConnectable:u.nodesConnectable,isValid:u.connection.isValid,inProgress:u.connection.inProgress,width:u.width,height:u.height});function qp({containerStyle:u,style:l,type:f,component:r}){let{nodesConnectable:n,width:i,height:t,isValid:y,inProgress:c}=il(Np,El);if(!(i&&n&&c))return null;return nu.jsx("svg",{style:u,width:i,height:t,className:"react-flow__connectionline react-flow__container",children:nu.jsx("g",{className:Rl(["react-flow__connection",c9(y)]),children:nu.jsx(wW,{style:l,type:f,CustomComponent:r,isValid:y})})})}var wW=({style:u,type:l=Nn.Bezier,CustomComponent:f,isValid:r})=>{let{inProgress:n,from:i,fromNode:t,fromHandle:y,fromPosition:c,to:$,toNode:A,toHandle:j,toPosition:F,pointer:J}=Qp();if(!n)return;if(f)return nu.jsx(f,{connectionLineType:l,connectionLineStyle:u,fromNode:t,fromHandle:y,fromX:i.x,fromY:i.y,toX:$.x,toY:$.y,fromPosition:c,toPosition:F,connectionStatus:c9(r),toNode:A,toHandle:j,pointer:J});let Q="",W={sourceX:i.x,sourceY:i.y,sourcePosition:c,targetX:$.x,targetY:$.y,targetPosition:F};switch(l){case Nn.Bezier:[Q]=$A(W);break;case Nn.SimpleBezier:[Q]=tW(W);break;case Nn.Step:[Q]=Mc({...W,borderRadius:0});break;case Nn.SmoothStep:[Q]=Mc(W);break;default:[Q]=AA(W)}return nu.jsx("path",{d:Q,fill:"none",className:"react-flow__connection-path",style:u})};wW.displayName="ConnectionLine";var wp={};function bw(u=wp){let l=tu.useRef(u),f=Zl();tu.useEffect(()=>{},[u])}function Wp(){let u=Zl(),l=tu.useRef(!1);tu.useEffect(()=>{},[])}function WW({nodeTypes:u,edgeTypes:l,onInit:f,onNodeClick:r,onEdgeClick:n,onNodeDoubleClick:i,onEdgeDoubleClick:t,onNodeMouseEnter:y,onNodeMouseMove:c,onNodeMouseLeave:$,onNodeContextMenu:A,onSelectionContextMenu:j,onSelectionStart:F,onSelectionEnd:J,connectionLineType:Q,connectionLineStyle:W,connectionLineComponent:L,connectionLineContainerStyle:U,selectionKeyCode:q,selectionOnDrag:N,selectionMode:w,multiSelectionKeyCode:G,panActivationKeyCode:Z,zoomActivationKeyCode:H,deleteKeyCode:E,onlyRenderVisibleElements:m,elementsSelectable:S,defaultViewport:B,translateExtent:D,minZoom:X,maxZoom:O,preventScrolling:Y,defaultMarkerColor:p,zoomOnScroll:v,zoomOnPinch:z,panOnScroll:P,panOnScrollSpeed:k,panOnScrollMode:I,zoomOnDoubleClick:b,panOnDrag:d,onPaneClick:s,onPaneMouseEnter:h,onPaneMouseMove:lu,onPaneMouseLeave:cu,onPaneScroll:_u,onPaneContextMenu:Fu,paneClickDistance:zu,nodeClickDistance:Wu,onEdgeContextMenu:C,onEdgeMouseEnter:e,onEdgeMouseMove:uu,onEdgeMouseLeave:Gu,reconnectRadius:a,onReconnect:qu,onReconnectStart:Zu,onReconnectEnd:Bu,noDragClassName:gu,noWheelClassName:ll,noPanClassName:Pu,disableKeyboardA11y:Nl,nodeExtent:Qf,rfId:Zf,viewport:$f,onViewportChange:nf}){return bw(u),bw(l),Wp(),jp(f),Up($f),nu.jsx(XD,{onPaneClick:s,onPaneMouseEnter:h,onPaneMouseMove:lu,onPaneMouseLeave:cu,onPaneContextMenu:Fu,onPaneScroll:_u,paneClickDistance:zu,deleteKeyCode:E,selectionKeyCode:q,selectionOnDrag:N,selectionMode:w,onSelectionStart:F,onSelectionEnd:J,multiSelectionKeyCode:G,panActivationKeyCode:Z,zoomActivationKeyCode:H,elementsSelectable:S,zoomOnScroll:v,zoomOnPinch:z,zoomOnDoubleClick:b,panOnScroll:P,panOnScrollSpeed:k,panOnScrollMode:I,panOnDrag:d,defaultViewport:B,translateExtent:D,minZoom:X,maxZoom:O,onSelectionContextMenu:j,preventScrolling:Y,noDragClassName:gu,noWheelClassName:ll,noPanClassName:Pu,disableKeyboardA11y:Nl,onViewportChange:nf,isControlledViewport:!!$f,children:nu.jsxs(Ap,{children:[nu.jsx(_p,{edgeTypes:l,onEdgeClick:n,onEdgeDoubleClick:t,onReconnect:qu,onReconnectStart:Zu,onReconnectEnd:Bu,onlyRenderVisibleElements:m,onEdgeContextMenu:C,onEdgeMouseEnter:e,onEdgeMouseMove:uu,onEdgeMouseLeave:Gu,reconnectRadius:a,defaultMarkerColor:p,noPanClassName:Pu,disableKeyboardA11y:Nl,rfId:Zf}),nu.jsx(qp,{style:W,type:Q,component:L,containerStyle:U}),nu.jsx("div",{className:"react-flow__edgelabel-renderer"}),nu.jsx(vD,{nodeTypes:u,onNodeClick:r,onNodeDoubleClick:i,onNodeMouseEnter:y,onNodeMouseMove:c,onNodeMouseLeave:$,onNodeContextMenu:A,nodeClickDistance:Wu,onlyRenderVisibleElements:m,noPanClassName:Pu,noDragClassName:gu,disableKeyboardA11y:Nl,nodeExtent:Qf,rfId:Zf}),nu.jsx("div",{className:"react-flow__viewport-portal"})]})})}WW.displayName="GraphView";var Lp=tu.memo(WW),vw=({nodes:u,edges:l,defaultNodes:f,defaultEdges:r,width:n,height:i,fitView:t,fitViewOptions:y,minZoom:c=0.5,maxZoom:$=2,nodeOrigin:A,nodeExtent:j,zIndexMode:F="basic"}={})=>{let J=new Map,Q=new Map,W=new Map,L=new Map,U=r??l??[],q=f??u??[],N=A??[0,0],w=j??Jy;Z9(W,L,U);let{nodesInitialized:G}=FA(q,J,Q,{nodeOrigin:N,nodeExtent:w,zIndexMode:F}),Z=[0,0,1];if(t&&n&&i){let H=Qy(J,{filter:(B)=>!!((B.width||B.initialWidth)&&(B.height||B.initialHeight))}),{x:E,y:m,zoom:S}=Cc(H,n,i,c,$,y?.padding??0.1);Z=[E,m,S]}return{rfId:"1",width:n??0,height:i??0,transform:Z,nodes:q,nodesInitialized:G,nodeLookup:J,parentLookup:Q,edges:U,edgeLookup:L,connectionLookup:W,onNodesChange:null,onEdgesChange:null,hasDefaultNodes:f!==void 0,hasDefaultEdges:r!==void 0,panZoom:null,minZoom:c,maxZoom:$,translateExtent:Jy,nodeExtent:w,nodesSelectionActive:!1,userSelectionActive:!1,userSelectionRect:null,connectionMode:R0.Strict,domNode:null,paneDragging:!1,noPanClassName:"nopan",nodeOrigin:N,nodeDragThreshold:1,connectionDragThreshold:1,snapGrid:[15,15],snapToGrid:!1,nodesDraggable:!0,nodesConnectable:!0,nodesFocusable:!0,edgesFocusable:!0,edgesReconnectable:!0,elementsSelectable:!0,elevateNodesOnSelect:!0,elevateEdgesOnSelect:!0,selectNodesOnDrag:!0,multiSelectionActive:!1,fitViewQueued:t??!1,fitViewOptions:y,fitViewResolver:null,connection:{...y9},connectionClickStartHandle:null,connectOnClick:!0,ariaLiveMessage:"",autoPanOnConnect:!0,autoPanOnNodeDrag:!0,autoPanOnNodeFocus:!0,autoPanSpeed:15,connectionRadius:20,onError:J9,isValidConnection:void 0,onSelectionChangeHandlers:[],lib:"react",debug:!1,ariaLabelConfig:t9,zIndexMode:F,onNodesChangeMiddlewareMap:new Map,onEdgesChangeMiddlewareMap:new Map}},Tp=({nodes:u,edges:l,defaultNodes:f,defaultEdges:r,width:n,height:i,fitView:t,fitViewOptions:y,minZoom:c,maxZoom:$,nodeOrigin:A,nodeExtent:j,zIndexMode:F})=>Tw((J,Q)=>{async function W(){let{nodeLookup:L,panZoom:U,fitViewOptions:q,fitViewResolver:N,width:w,height:G,minZoom:Z,maxZoom:H}=Q();if(!U)return;await Xq({nodes:L,width:w,height:G,panZoom:U,minZoom:Z,maxZoom:H},q),N?.resolve(!0),J({fitViewResolver:null})}return{...vw({nodes:u,edges:l,width:n,height:i,fitView:t,fitViewOptions:y,minZoom:c,maxZoom:$,nodeOrigin:A,nodeExtent:j,defaultNodes:f,defaultEdges:r,zIndexMode:F}),setNodes:(L)=>{let{nodeLookup:U,parentLookup:q,nodeOrigin:N,elevateNodesOnSelect:w,fitViewQueued:G,zIndexMode:Z,nodesSelectionActive:H}=Q(),{nodesInitialized:E,hasSelectedNodes:m}=FA(L,U,q,{nodeOrigin:N,nodeExtent:j,elevateNodesOnSelect:w,checkEquality:!0,zIndexMode:Z}),S=H&&m;if(G&&E)W(),J({nodes:L,nodesInitialized:E,fitViewQueued:!1,fitViewOptions:void 0,nodesSelectionActive:S});else J({nodes:L,nodesInitialized:E,nodesSelectionActive:S})},setEdges:(L)=>{let{connectionLookup:U,edgeLookup:q}=Q();Z9(U,q,L),J({edges:L})},setDefaultNodesAndEdges:(L,U)=>{if(L){let{setNodes:q}=Q();q(L),J({hasDefaultNodes:!0})}if(U){let{setEdges:q}=Q();q(U),J({hasDefaultEdges:!0})}},updateNodeInternals:(L)=>{let{triggerNodeChanges:U,nodeLookup:q,parentLookup:N,domNode:w,nodeOrigin:G,nodeExtent:Z,debug:H,fitViewQueued:E,zIndexMode:m}=Q(),{changes:S,updatedInternals:B}=sq(L,q,N,w,G,Z,m);if(!B)return;if(Iq(q,N,{nodeOrigin:G,nodeExtent:Z,zIndexMode:m}),E)W(),J({fitViewQueued:!1,fitViewOptions:void 0});else J({});if(S?.length>0){if(H)console.log("React Flow: trigger node changes",S);U?.(S)}},updateNodePositions:(L,U=!1)=>{let q=[],N=[],{nodeLookup:w,triggerNodeChanges:G,connection:Z,updateConnection:H,onNodesChangeMiddlewareMap:E}=Q();for(let[m,S]of L){let B=w.get(m),D=!!(B?.expandParent&&B?.parentId&&S?.position),X={id:m,type:"position",position:D?{x:Math.max(0,S.position.x),y:Math.max(0,S.position.y)}:S.position,dragging:U};if(B&&Z.inProgress&&Z.fromNode.id===B.id){let O=h0(B,Z.fromHandle,Ku.Left,!0);H({...Z,from:O})}if(D&&B.parentId)q.push({id:m,parentId:B.parentId,rect:{...S.internals.positionAbsolute,width:S.measured.width??0,height:S.measured.height??0}});N.push(X)}if(q.length>0){let{parentLookup:m,nodeOrigin:S}=Q(),B=UA(q,w,m,S);N.push(...B)}for(let m of E.values())N=m(N);G(N)},triggerNodeChanges:(L)=>{let{onNodesChange:U,setNodes:q,nodes:N,hasDefaultNodes:w,debug:G}=Q();if(L?.length){if(w){let Z=yD(L,N);q(Z)}if(G)console.log("React Flow: trigger node changes",L);U?.(L)}},triggerEdgeChanges:(L)=>{let{onEdgesChange:U,setEdges:q,edges:N,hasDefaultEdges:w,debug:G}=Q();if(L?.length){if(w){let Z=cD(L,N);q(Z)}if(G)console.log("React Flow: trigger edge changes",L);U?.(L)}},addSelectedNodes:(L)=>{let{multiSelectionActive:U,edgeLookup:q,nodeLookup:N,triggerNodeChanges:w,triggerEdgeChanges:G}=Q();if(U){let Z=L.map((H)=>oi(H,!0));w(Z);return}w(Ty(N,new Set([...L]),!0)),G(Ty(q))},addSelectedEdges:(L)=>{let{multiSelectionActive:U,edgeLookup:q,nodeLookup:N,triggerNodeChanges:w,triggerEdgeChanges:G}=Q();if(U){let Z=L.map((H)=>oi(H,!0));G(Z);return}G(Ty(q,new Set([...L]))),w(Ty(N,new Set,!0))},unselectNodesAndEdges:({nodes:L,edges:U}={})=>{let{edges:q,nodes:N,nodeLookup:w,triggerNodeChanges:G,triggerEdgeChanges:Z}=Q(),H=L?L:N,E=U?U:q,m=[];for(let B of H){if(!B.selected)continue;let D=w.get(B.id);if(D)D.selected=!1;m.push(oi(B.id,!1))}let S=[];for(let B of E){if(!B.selected)continue;S.push(oi(B.id,!1))}G(m),Z(S)},setMinZoom:(L)=>{let{panZoom:U,maxZoom:q}=Q();U?.setScaleExtent([L,q]),J({minZoom:L})},setMaxZoom:(L)=>{let{panZoom:U,minZoom:q}=Q();U?.setScaleExtent([q,L]),J({maxZoom:L})},setTranslateExtent:(L)=>{Q().panZoom?.setTranslateExtent(L),J({translateExtent:L})},resetSelectedElements:()=>{let{edges:L,nodes:U,triggerNodeChanges:q,triggerEdgeChanges:N,elementsSelectable:w}=Q();if(!w)return;let G=U.reduce((H,E)=>E.selected?[...H,oi(E.id,!1)]:H,[]),Z=L.reduce((H,E)=>E.selected?[...H,oi(E.id,!1)]:H,[]);q(G),N(Z)},setNodeExtent:(L)=>{let{nodes:U,nodeLookup:q,parentLookup:N,nodeOrigin:w,elevateNodesOnSelect:G,nodeExtent:Z,zIndexMode:H}=Q();if(L[0][0]===Z[0][0]&&L[0][1]===Z[0][1]&&L[1][0]===Z[1][0]&&L[1][1]===Z[1][1])return;FA(U,q,N,{nodeOrigin:w,nodeExtent:L,elevateNodesOnSelect:G,checkEquality:!1,zIndexMode:H}),J({nodeExtent:L})},panBy:(L)=>{let{transform:U,width:q,height:N,panZoom:w,translateExtent:G}=Q();return aq({delta:L,panZoom:w,transform:U,translateExtent:G,width:q,height:N})},setCenter:async(L,U,q)=>{let{width:N,height:w,maxZoom:G,panZoom:Z}=Q();if(!Z)return Promise.resolve(!1);let H=typeof q?.zoom<"u"?q.zoom:G;return await Z.setViewport({x:N/2-L*H,y:w/2-U*H,zoom:H},{duration:q?.duration,ease:q?.ease,interpolate:q?.interpolate}),Promise.resolve(!0)},cancelConnection:()=>{J({connection:{...y9}})},updateConnection:(L)=>{J({connection:L})},reset:()=>J({...vw()})}},Object.is);function Kp({initialNodes:u,initialEdges:l,defaultNodes:f,defaultEdges:r,initialWidth:n,initialHeight:i,initialMinZoom:t,initialMaxZoom:y,initialFitViewOptions:c,fitView:$,nodeOrigin:A,nodeExtent:j,zIndexMode:F,children:J}){let[Q]=tu.useState(()=>Tp({nodes:u,edges:l,defaultNodes:f,defaultEdges:r,width:n,height:i,fitView:$,minZoom:t,maxZoom:y,fitViewOptions:c,nodeOrigin:A,nodeExtent:j,zIndexMode:F}));return nu.jsx(Rm,{value:Q,children:nu.jsx(AD,{children:J})})}function Gp({children:u,nodes:l,edges:f,defaultNodes:r,defaultEdges:n,width:i,height:t,fitView:y,fitViewOptions:c,minZoom:$,maxZoom:A,nodeOrigin:j,nodeExtent:F,zIndexMode:J}){if(tu.useContext(LA))return nu.jsx(nu.Fragment,{children:u});return nu.jsx(Kp,{initialNodes:l,initialEdges:f,defaultNodes:r,defaultEdges:n,initialWidth:i,initialHeight:t,fitView:y,initialFitViewOptions:c,initialMinZoom:$,initialMaxZoom:A,nodeOrigin:j,nodeExtent:F,zIndexMode:J,children:u})}var zp={width:"100%",height:"100%",overflow:"hidden",position:"relative",zIndex:0};function Ep({nodes:u,edges:l,defaultNodes:f,defaultEdges:r,className:n,nodeTypes:i,edgeTypes:t,onNodeClick:y,onEdgeClick:c,onInit:$,onMove:A,onMoveStart:j,onMoveEnd:F,onConnect:J,onConnectStart:Q,onConnectEnd:W,onClickConnectStart:L,onClickConnectEnd:U,onNodeMouseEnter:q,onNodeMouseMove:N,onNodeMouseLeave:w,onNodeContextMenu:G,onNodeDoubleClick:Z,onNodeDragStart:H,onNodeDrag:E,onNodeDragStop:m,onNodesDelete:S,onEdgesDelete:B,onDelete:D,onSelectionChange:X,onSelectionDragStart:O,onSelectionDrag:Y,onSelectionDragStop:p,onSelectionContextMenu:v,onSelectionStart:z,onSelectionEnd:P,onBeforeDelete:k,connectionMode:I,connectionLineType:b=Nn.Bezier,connectionLineStyle:d,connectionLineComponent:s,connectionLineContainerStyle:h,deleteKeyCode:lu="Backspace",selectionKeyCode:cu="Shift",selectionOnDrag:_u=!1,selectionMode:Fu=gi.Full,panActivationKeyCode:zu="Space",multiSelectionKeyCode:Wu=Wy()?"Meta":"Control",zoomActivationKeyCode:C=Wy()?"Meta":"Control",snapToGrid:e,snapGrid:uu,onlyRenderVisibleElements:Gu=!1,selectNodesOnDrag:a,nodesDraggable:qu,autoPanOnNodeFocus:Zu,nodesConnectable:Bu,nodesFocusable:gu,nodeOrigin:ll=sw,edgesFocusable:Pu,edgesReconnectable:Nl,elementsSelectable:Qf=!0,defaultViewport:Zf=uD,minZoom:$f=0.5,maxZoom:nf=2,translateExtent:tf=Jy,preventScrolling:Mf=!0,nodeExtent:$u,defaultMarkerColor:au="#b1b1b7",zoomOnScroll:Nf=!0,zoomOnPinch:Yu=!0,panOnScroll:Sl=!1,panOnScrollSpeed:dl=0.5,panOnScrollMode:rr=an.Free,zoomOnDoubleClick:Af=!0,panOnDrag:Hf=!0,onPaneClick:Gn,onPaneMouseEnter:nr,onPaneMouseMove:u0,onPaneMouseLeave:$l,onPaneScroll:lt,onPaneContextMenu:fu,paneClickDistance:Vu=1,nodeClickDistance:Xu=0,children:ou,onReconnect:Al,onReconnectStart:kl,onReconnectEnd:_l,onEdgeContextMenu:qf,onEdgeDoubleClick:Sr,onEdgeMouseEnter:Dy,onEdgeMouseMove:Kl,onEdgeMouseLeave:n_,reconnectRadius:aA=10,onNodesChange:Ul,onEdgesChange:O7,noDragClassName:Xl="nodrag",noWheelClassName:Bf="nowheel",noPanClassName:ft="nopan",fitView:py,fitViewOptions:rt,connectOnClick:i_,attributionPosition:Sy,proOptions:t_,defaultEdgeOptions:y_,elevateNodesOnSelect:fi=!0,elevateEdgesOnSelect:nt=!1,disableKeyboardA11y:ri=!1,autoPanOnConnect:Rf,autoPanOnNodeDrag:Xr,autoPanSpeed:c_,connectionRadius:Xy,isValidConnection:Yy,onError:__,style:fn,id:Py,nodeDragThreshold:Yl,connectionDragThreshold:oA,viewport:$_,onViewportChange:Yr,width:ni,height:ii,colorMode:it="light",debug:ti,onScroll:tt,ariaLabelConfig:Z7,zIndexMode:yi="basic",...H7},A_){let Cy=Py||"1",dA=nD(it),eA=tu.useCallback((zn)=>{zn.currentTarget.scrollTo({top:0,left:0,behavior:"instant"}),tt?.(zn)},[tt]);return nu.jsx("div",{"data-testid":"rf__wrapper",...H7,onScroll:eA,style:{...fn,...zp},ref:A_,className:Rl(["react-flow",n,dA]),id:Py,role:"application",children:nu.jsxs(Gp,{nodes:u,edges:l,width:ni,height:ii,fitView:py,fitViewOptions:rt,minZoom:$f,maxZoom:nf,nodeOrigin:ll,nodeExtent:$u,zIndexMode:yi,children:[nu.jsx(rD,{nodes:u,edges:l,defaultNodes:f,defaultEdges:r,onConnect:J,onConnectStart:Q,onConnectEnd:W,onClickConnectStart:L,onClickConnectEnd:U,nodesDraggable:qu,autoPanOnNodeFocus:Zu,nodesConnectable:Bu,nodesFocusable:gu,edgesFocusable:Pu,edgesReconnectable:Nl,elementsSelectable:Qf,elevateNodesOnSelect:fi,elevateEdgesOnSelect:nt,minZoom:$f,maxZoom:nf,nodeExtent:$u,onNodesChange:Ul,onEdgesChange:O7,snapToGrid:e,snapGrid:uu,connectionMode:I,translateExtent:tf,connectOnClick:i_,defaultEdgeOptions:y_,fitView:py,fitViewOptions:rt,onNodesDelete:S,onEdgesDelete:B,onDelete:D,onNodeDragStart:H,onNodeDrag:E,onNodeDragStop:m,onSelectionDrag:Y,onSelectionDragStart:O,onSelectionDragStop:p,onMove:A,onMoveStart:j,onMoveEnd:F,noPanClassName:ft,nodeOrigin:ll,rfId:Cy,autoPanOnConnect:Rf,autoPanOnNodeDrag:Xr,autoPanSpeed:c_,onError:__,connectionRadius:Xy,isValidConnection:Yy,selectNodesOnDrag:a,nodeDragThreshold:Yl,connectionDragThreshold:oA,onBeforeDelete:k,debug:ti,ariaLabelConfig:Z7,zIndexMode:yi}),nu.jsx(Lp,{onInit:$,onNodeClick:y,onEdgeClick:c,onNodeMouseEnter:q,onNodeMouseMove:N,onNodeMouseLeave:w,onNodeContextMenu:G,onNodeDoubleClick:Z,nodeTypes:i,edgeTypes:t,connectionLineType:b,connectionLineStyle:d,connectionLineComponent:s,connectionLineContainerStyle:h,selectionKeyCode:cu,selectionOnDrag:_u,selectionMode:Fu,deleteKeyCode:lu,multiSelectionKeyCode:Wu,panActivationKeyCode:zu,zoomActivationKeyCode:C,onlyRenderVisibleElements:Gu,defaultViewport:Zf,translateExtent:tf,minZoom:$f,maxZoom:nf,preventScrolling:Mf,zoomOnScroll:Nf,zoomOnPinch:Yu,zoomOnDoubleClick:Af,panOnScroll:Sl,panOnScrollSpeed:dl,panOnScrollMode:rr,panOnDrag:Hf,onPaneClick:Gn,onPaneMouseEnter:nr,onPaneMouseMove:u0,onPaneMouseLeave:$l,onPaneScroll:lt,onPaneContextMenu:fu,paneClickDistance:Vu,nodeClickDistance:Xu,onSelectionContextMenu:v,onSelectionStart:z,onSelectionEnd:P,onReconnect:Al,onReconnectStart:kl,onReconnectEnd:_l,onEdgeContextMenu:qf,onEdgeDoubleClick:Sr,onEdgeMouseEnter:Dy,onEdgeMouseMove:Kl,onEdgeMouseLeave:n_,reconnectRadius:aA,defaultMarkerColor:au,noDragClassName:Xl,noWheelClassName:Bf,noPanClassName:ft,rfId:Cy,disableKeyboardA11y:ri,nodeExtent:$u,viewport:$_,onViewportChange:Yr}),nu.jsx(em,{onSelectionChange:X}),ou,nu.jsx(gm,{proOptions:t_,position:Sy}),nu.jsx(Im,{rfId:Cy,disableKeyboardA11y:ri})]})})}var LW=ow(Ep);var Gv=Jr.error014();function Op({dimensions:u,lineWidth:l,variant:f,className:r}){return nu.jsx("path",{strokeWidth:l,d:`M${u[0]/2} 0 V${u[1]} M0 ${u[1]/2} H${u[0]}`,className:Rl(["react-flow__background-pattern",f,r])})}function Zp({radius:u,className:l}){return nu.jsx("circle",{cx:u,cy:u,r:u,className:Rl(["react-flow__background-pattern","dots",l])})}var v0;(function(u){u.Lines="lines",u.Dots="dots",u.Cross="cross"})(v0||(v0={}));var Hp={[v0.Dots]:1,[v0.Lines]:1,[v0.Cross]:6},Bp=(u)=>({transform:u.transform,patternId:`pattern-${u.rfId}`});function TW({id:u,variant:l=v0.Dots,gap:f=20,size:r,lineWidth:n=1,offset:i=0,color:t,bgColor:y,style:c,className:$,patternClassName:A}){let j=tu.useRef(null),{transform:F,patternId:J}=il(Bp,El),Q=r||Hp[l],W=l===v0.Dots,L=l===v0.Cross,U=Array.isArray(f)?f:[f,f],q=[U[0]*F[2]||1,U[1]*F[2]||1],N=Q*F[2],w=Array.isArray(i)?i:[i,i],G=L?[N,N]:q,Z=[w[0]*F[2]||1+G[0]/2,w[1]*F[2]||1+G[1]/2],H=`${J}${u?u:""}`;return nu.jsxs("svg",{className:Rl(["react-flow__background",$]),style:{...c,...KA,"--xy-background-color-props":y,"--xy-background-pattern-color-props":t},ref:j,"data-testid":"rf__background",children:[nu.jsx("pattern",{id:H,x:F[0]%q[0],y:F[1]%q[1],width:q[0],height:q[1],patternUnits:"userSpaceOnUse",patternTransform:`translate(-${Z[0]},-${Z[1]})`,children:W?nu.jsx(Zp,{radius:N/2,className:A}):nu.jsx(Op,{dimensions:G,lineWidth:n,variant:l,className:A})}),nu.jsx("rect",{x:"0",y:"0",width:"100%",height:"100%",fill:`url(#${H})`})]})}TW.displayName="Background";var KW=tu.memo(TW);function Vp(){return nu.jsx("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 32 32",children:nu.jsx("path",{d:"M32 18.133H18.133V32h-4.266V18.133H0v-4.266h13.867V0h4.266v13.867H32z"})})}function mp(){return nu.jsx("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 32 5",children:nu.jsx("path",{d:"M0 0h32v4.2H0z"})})}function Dp(){return nu.jsx("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 32 30",children:nu.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 pp(){return nu.jsx("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 25 32",children:nu.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 Sp(){return nu.jsx("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 25 32",children:nu.jsx("path",{d:"M21.333 10.667H19.81V7.619C19.81 3.429 16.38 0 12.19 0c-4.114 1.828-1.37 2.133.305 2.438 1.676.305 4.42 2.59 4.42 5.181v3.048H3.047A3.056 3.056 0 000 13.714v15.238A3.056 3.056 0 003.048 32h18.285a3.056 3.056 0 003.048-3.048V13.714a3.056 3.056 0 00-3.048-3.047zM12.19 24.533a3.056 3.056 0 01-3.047-3.047 3.056 3.056 0 013.047-3.048 3.056 3.056 0 013.048 3.048 3.056 3.056 0 01-3.048 3.047z"})})}function wA({children:u,className:l,...f}){return nu.jsx("button",{type:"button",className:Rl(["react-flow__controls-button",l]),...f,children:u})}var Xp=(u)=>({isInteractive:u.nodesDraggable||u.nodesConnectable||u.elementsSelectable,minZoomReached:u.transform[2]<=u.minZoom,maxZoomReached:u.transform[2]>=u.maxZoom,ariaLabelConfig:u.ariaLabelConfig});function GW({style:u,showZoom:l=!0,showFitView:f=!0,showInteractive:r=!0,fitViewOptions:n,onZoomIn:i,onZoomOut:t,onFitView:y,onInteractiveChange:c,className:$,children:A,position:j="bottom-left",orientation:F="vertical","aria-label":J}){let Q=Zl(),{isInteractive:W,minZoomReached:L,maxZoomReached:U,ariaLabelConfig:q}=il(Xp,El),{zoomIn:N,zoomOut:w,fitView:G}=S9(),Z=()=>{N(),i?.()},H=()=>{w(),t?.()},E=()=>{G(n),y?.()},m=()=>{Q.setState({nodesDraggable:!W,nodesConnectable:!W,elementsSelectable:!W}),c?.(!W)};return nu.jsxs(TA,{className:Rl(["react-flow__controls",F==="horizontal"?"horizontal":"vertical",$]),position:j,style:u,"data-testid":"rf__controls","aria-label":J??q["controls.ariaLabel"],children:[l&&nu.jsxs(nu.Fragment,{children:[nu.jsx(wA,{onClick:Z,className:"react-flow__controls-zoomin",title:q["controls.zoomIn.ariaLabel"],"aria-label":q["controls.zoomIn.ariaLabel"],disabled:U,children:nu.jsx(Vp,{})}),nu.jsx(wA,{onClick:H,className:"react-flow__controls-zoomout",title:q["controls.zoomOut.ariaLabel"],"aria-label":q["controls.zoomOut.ariaLabel"],disabled:L,children:nu.jsx(mp,{})})]}),f&&nu.jsx(wA,{className:"react-flow__controls-fitview",onClick:E,title:q["controls.fitView.ariaLabel"],"aria-label":q["controls.fitView.ariaLabel"],children:nu.jsx(Dp,{})}),r&&nu.jsx(wA,{className:"react-flow__controls-interactive",onClick:m,title:q["controls.interactive.ariaLabel"],"aria-label":q["controls.interactive.ariaLabel"],children:W?nu.jsx(Sp,{}):nu.jsx(pp,{})}),A]})}GW.displayName="Controls";var zW=tu.memo(GW);function Yp({id:u,x:l,y:f,width:r,height:n,style:i,color:t,strokeColor:y,strokeWidth:c,className:$,borderRadius:A,shapeRendering:j,selected:F,onClick:J}){let{background:Q,backgroundColor:W}=i||{},L=t||Q||W;return nu.jsx("rect",{className:Rl(["react-flow__minimap-node",{selected:F},$]),x:l,y:f,rx:A,ry:A,width:r,height:n,style:{fill:L,stroke:y,strokeWidth:c},shapeRendering:j,onClick:J?(U)=>J(U,u):void 0})}var Pp=tu.memo(Yp),Cp=(u)=>u.nodes.map((l)=>l.id),m9=(u)=>u instanceof Function?u:()=>u;function Mp({nodeStrokeColor:u,nodeColor:l,nodeClassName:f="",nodeBorderRadius:r=5,nodeStrokeWidth:n,nodeComponent:i=Pp,onClick:t}){let y=il(Cp,El),c=m9(l),$=m9(u),A=m9(f),j=typeof window>"u"||!!window.chrome?"crispEdges":"geometricPrecision";return nu.jsx(nu.Fragment,{children:y.map((F)=>nu.jsx(xp,{id:F,nodeColorFunc:c,nodeStrokeColorFunc:$,nodeClassNameFunc:A,nodeBorderRadius:r,nodeStrokeWidth:n,NodeComponent:i,onClick:t,shapeRendering:j},F))})}function Rp({id:u,nodeColorFunc:l,nodeStrokeColorFunc:f,nodeClassNameFunc:r,nodeBorderRadius:n,nodeStrokeWidth:i,shapeRendering:t,NodeComponent:y,onClick:c}){let{node:$,x:A,y:j,width:F,height:J}=il((Q)=>{let W=Q.nodeLookup.get(u);if(!W)return{node:void 0,x:0,y:0,width:0,height:0};let L=W.internals.userNode,{x:U,y:q}=W.internals.positionAbsolute,{width:N,height:w}=qn(L);return{node:L,x:U,y:q,width:N,height:w}},El);if(!$||$.hidden||!Q9($))return null;return nu.jsx(y,{x:A,y:j,width:F,height:J,style:$.style,selected:!!$.selected,className:r($),color:l($),borderRadius:n,strokeColor:f($),strokeWidth:i,shapeRendering:t,onClick:c,id:$.id})}var xp=tu.memo(Rp),hp=tu.memo(Mp),bp=200,vp=150,kp=(u)=>!u.hidden,Ip=(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?F9(Qy(u.nodeLookup,{filter:kp}),l):l,rfId:u.rfId,panZoom:u.panZoom,translateExtent:u.translateExtent,flowWidth:u.width,flowHeight:u.height,ariaLabelConfig:u.ariaLabelConfig}},gp="react-flow__minimap-desc";function EW({style:u,className:l,nodeStrokeColor:f,nodeColor:r,nodeClassName:n="",nodeBorderRadius:i=5,nodeStrokeWidth:t,nodeComponent:y,bgColor:c,maskColor:$,maskStrokeColor:A,maskStrokeWidth:j,position:F="bottom-right",onClick:J,onNodeClick:Q,pannable:W=!1,zoomable:L=!1,ariaLabel:U,inversePan:q,zoomStep:N=1,offsetScale:w=5}){let G=Zl(),Z=tu.useRef(null),{boundingRect:H,viewBB:E,rfId:m,panZoom:S,translateExtent:B,flowWidth:D,flowHeight:X,ariaLabelConfig:O}=il(Ip,El),Y=u?.width??bp,p=u?.height??vp,v=H.width/Y,z=H.height/p,P=Math.max(v,z),k=P*Y,I=P*p,b=w*P,d=H.x-(k-H.width)/2-b,s=H.y-(I-H.height)/2-b,h=k+b*2,lu=I+b*2,cu=`${gp}-${m}`,_u=tu.useRef(0),Fu=tu.useRef();_u.current=P,tu.useEffect(()=>{if(Z.current&&S)return Fu.current=rw({domNode:Z.current,panZoom:S,getTransform:()=>G.getState().transform,getViewScale:()=>_u.current}),()=>{Fu.current?.destroy()}},[S]),tu.useEffect(()=>{Fu.current?.update({translateExtent:B,width:D,height:X,inversePan:q,pannable:W,zoomStep:N,zoomable:L})},[W,L,q,N,B,D,X]);let zu=J?(e)=>{let[uu,Gu]=Fu.current?.pointer(e)||[0,0];J(e,{x:uu,y:Gu})}:void 0,Wu=Q?tu.useCallback((e,uu)=>{let Gu=G.getState().nodeLookup.get(uu).internals.userNode;Q(e,Gu)},[]):void 0,C=U??O["minimap.ariaLabel"];return nu.jsx(TA,{position:F,style:{...u,"--xy-minimap-background-color-props":typeof c==="string"?c:void 0,"--xy-minimap-mask-background-color-props":typeof $==="string"?$:void 0,"--xy-minimap-mask-stroke-color-props":typeof A==="string"?A:void 0,"--xy-minimap-mask-stroke-width-props":typeof j==="number"?j*P:void 0,"--xy-minimap-node-background-color-props":typeof r==="string"?r:void 0,"--xy-minimap-node-stroke-color-props":typeof f==="string"?f:void 0,"--xy-minimap-node-stroke-width-props":typeof t==="number"?t:void 0},className:Rl(["react-flow__minimap",l]),"data-testid":"rf__minimap",children:nu.jsxs("svg",{width:Y,height:p,viewBox:`${d} ${s} ${h} ${lu}`,className:"react-flow__minimap-svg",role:"img","aria-labelledby":cu,ref:Z,onClick:zu,children:[C&&nu.jsx("title",{id:cu,children:C}),nu.jsx(hp,{onClick:Wu,nodeColor:r,nodeStrokeColor:f,nodeBorderRadius:i,nodeClassName:n,nodeStrokeWidth:t,nodeComponent:y}),nu.jsx("path",{className:"react-flow__minimap-mask",d:`M${d-b},${s-b}h${h+b*2}v${lu+b*2}h${-h-b*2}z + M${E.x},${E.y}h${E.width}v${E.height}h${-E.width}z`,fillRule:"evenodd",pointerEvents:"none"})]})})}EW.displayName="MiniMap";var zv=tu.memo(EW),sp=(u)=>(l)=>u?`${Math.max(1/l.transform[2],1)}`:void 0,ap={[b0.Line]:"right",[b0.Handle]:"bottom-right"};function op({nodeId:u,position:l,variant:f=b0.Handle,className:r,style:n=void 0,children:i,color:t,minWidth:y=10,minHeight:c=10,maxWidth:$=Number.MAX_VALUE,maxHeight:A=Number.MAX_VALUE,keepAspectRatio:j=!1,resizeDirection:F,autoScale:J=!0,shouldResize:Q,onResizeStart:W,onResize:L,onResizeEnd:U}){let q=lW(),N=typeof u==="string"?u:q,w=Zl(),G=tu.useRef(null),Z=f===b0.Handle,H=il(tu.useCallback(sp(Z&&J),[Z,J]),El),E=tu.useRef(null),m=l??ap[f];tu.useEffect(()=>{if(!G.current||!N)return;if(!E.current)E.current=cw({domNode:G.current,nodeId:N,getStoreItems:()=>{let{nodeLookup:B,transform:D,snapGrid:X,snapToGrid:O,nodeOrigin:Y,domNode:p}=w.getState();return{nodeLookup:B,transform:D,snapGrid:X,snapToGrid:O,nodeOrigin:Y,paneDomNode:p}},onChange:(B,D)=>{let{triggerNodeChanges:X,nodeLookup:O,parentLookup:Y,nodeOrigin:p}=w.getState(),v=[],z={x:B.x,y:B.y},P=O.get(N);if(P&&P.expandParent&&P.parentId){let k=P.origin??p,I=B.width??P.measured.width??0,b=B.height??P.measured.height??0,d={id:P.id,parentId:P.parentId,rect:{width:I,height:b,...N9({x:B.x??P.position.x,y:B.y??P.position.y},{width:I,height:b},P.parentId,O,k)}},s=UA([d],O,Y,p);v.push(...s),z.x=B.x?Math.max(k[0]*I,B.x):void 0,z.y=B.y?Math.max(k[1]*b,B.y):void 0}if(z.x!==void 0&&z.y!==void 0){let k={id:N,type:"position",position:{...z}};v.push(k)}if(B.width!==void 0&&B.height!==void 0){let I={id:N,type:"dimensions",resizing:!0,setAttributes:!F?!0:F==="horizontal"?"width":"height",dimensions:{width:B.width,height:B.height}};v.push(I)}for(let k of D){let I={...k,type:"position"};v.push(I)}X(v)},onEnd:({width:B,height:D})=>{let X={id:N,type:"dimensions",resizing:!1,dimensions:{width:B,height:D}};w.getState().triggerNodeChanges([X])}});return E.current.update({controlPosition:m,boundaries:{minWidth:y,minHeight:c,maxWidth:$,maxHeight:A},keepAspectRatio:j,resizeDirection:F,onResizeStart:W,onResize:L,onResizeEnd:U,shouldResize:Q}),()=>{E.current?.destroy()}},[m,y,c,$,A,j,W,L,U,Q]);let S=m.split("-");return nu.jsx("div",{className:Rl(["react-flow__resize-control","nodrag",...S,f,r]),ref:G,style:{...n,scale:H,...t&&{[Z?"backgroundColor":"borderColor"]:t}},children:i})}var Ev=tu.memo(op);var K=s0.default.createElement,{useEffect:Ln}=s0.default,ef=s0.default.useState,g0=s0.default.useRef,Ic=[{id:"in-left",side:"left",position:Ku.Left,style:{top:"50%"}},{id:"in-top-left",side:"top",slot:"left",slotIndex:-1,position:Ku.Top,style:{left:"28%"}},{id:"in-top-mid",side:"top",slot:"mid",slotIndex:0,position:Ku.Top,style:{left:"50%"}},{id:"in-top-right",side:"top",slot:"right",slotIndex:1,position:Ku.Top,style:{left:"72%"}},{id:"in-bottom-left",side:"bottom",slot:"left",slotIndex:-1,position:Ku.Bottom,style:{left:"28%"}},{id:"in-bottom-mid",side:"bottom",slot:"mid",slotIndex:0,position:Ku.Bottom,style:{left:"50%"}},{id:"in-bottom-right",side:"bottom",slot:"right",slotIndex:1,position:Ku.Bottom,style:{left:"72%"}}],bc=[{id:"out-right",position:Ku.Right,style:{top:"50%"}}],OW=["#4eb7a8","#d7a13a","#69aee8","#e0835f","#b7d86b","#d98bd2","#5fc6bf"],zy=236,Ey=88,ZW=15000,dp=10,Y9=96,wn=72,P9=64,HW=12;function GA(){return typeof document>"u"||document.visibilityState!=="hidden"}function BW(u,l){let f=Number.parseFloat(String(u||""));return Number.isFinite(f)?f/100:l}function ep(u,l,f){let r=String(u.side||"");if(r!=="top"&&r!=="bottom")return 0;let n=Number(u.slotIndex||0),i=r==="top"?"in-top-mid":"in-bottom-mid",t=l.get(u.id)||0,y=l.get(i)||0;if(n===0)return y===0?-26:28+t*74;let c=f===0?Math.abs(n)*2:Math.sign(f)===Math.sign(n)?-3:3;if(y>0&&t===0)return-14+c;return 8+t*74+c}function zA(u){let l=u.filter((i,t)=>{let y=u[t-1];return!y||Math.abs(y.x-i.x)>0.5||Math.abs(y.y-i.y)>0.5});if(l.length<2)return"";let f=`M ${l[0].x},${l[0].y}`,r=l[0];for(let i=1;i0.5||Math.abs(F.y-r.y)>0.5)f+=` L ${F.x},${F.y}`;f+=` Q ${y.x},${y.y} ${J.x},${J.y}`,r=J}let n=l[l.length-1];return`${f} L ${n.x},${n.y}`}function gW(u,l,f,r,n,i,t=""){let y=f>=u,c=Math.max(1,Math.abs(f-u)),$=Math.abs(r-l),A=Math.max(34,Math.min(118,c*0.26)),j=Math.min(280,Math.abs(i));if(y&&n===Ku.Left&&j<4&&$<28&&c<420)return`M ${u},${l} C ${u+A},${l} ${f-A},${r} ${f},${r}`;if(y&&n===Ku.Left&&(t==="direct-forward-left"||c<=260&&$<=210)){let U=Math.max(42,Math.min(140,c*0.48)),q=Math.max(-28,Math.min(28,i*0.18));return`M ${u},${l} C ${u+U},${l+q} ${f-U},${r} ${f},${r}`}if(y){let U=u+A;if(n===Ku.Top||n===Ku.Bottom){let w=n===Ku.Top?-1:1,G=r+w*(54+j*0.42);return zA([{x:u,y:l},{x:U,y:l},{x:U+Math.min(120,c*0.18),y:G},{x:f,y:G},{x:f,y:r+w*34},{x:f,y:r}])}let q=f-A,N=(l+r)/2+i;return zA([{x:u,y:l},{x:U,y:l},{x:U+Math.min(110,c*0.16),y:N},{x:q-Math.min(90,c*0.12),y:N},{x:q,y:r},{x:f,y:r}])}let Q=n===Ku.Bottom?1:n===Ku.Top?-1:i>=0?1:-1,W=Math.max(u,f)+92+Math.min(180,j*0.52),L=Q<0?Math.min(l,r)-84-j*0.62:Math.max(l,r)+84+j*0.62;if(n===Ku.Top||n===Ku.Bottom)return zA([{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 zA([{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 uS({data:u}){return K("div",{className:"pipeline-flow-node-body"},Ic.map((l)=>K(di,{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})),bc.map((l)=>K(di,{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 lS({id:u,sourceX:l,sourceY:f,targetX:r,targetY:n,targetPosition:i,markerEnd:t,markerStart:y,style:c,data:$}){let A=Number($?.laneOffset||0),j=gW(l,f,r,n,i,A,String($?.routeMode||""));return K(Ky,{id:u,path:j,markerEnd:t,markerStart:y,style:c,interactionWidth:28})}var fS={pipelineCurve:lS},rS={pipelineNode:uS};function HA(u){if(!u)return"--";let l=new Date(u);if(Number.isNaN(l.getTime()))return"--";return yl(l)}function mr(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 C9(u){let l=Number(u);if(!Number.isFinite(l))return"--";return l.toLocaleString("zh-CN")}function VW(u){let l=Number(u);if(!Number.isFinite(l))return"--";return`${Math.round(Math.max(0,Math.min(1,l))*100)}%`}function pu(u){return typeof u==="object"&&u!==null&&!Array.isArray(u)}function Du(u){return Array.isArray(u)?u:[]}function su(u){if(!u)return null;let l=new Date(u);return Number.isNaN(l.getTime())?null:l.getTime()}function gc(u){return Number.isFinite(Number(u))?new Date(Number(u)).toISOString():""}function oc(...u){for(let l of u){let f=su(l);if(f!==null)return new Date(f).toISOString()}return""}function u7(...u){let l=u.map(su).filter((f)=>f!==null);return l.length>0?new Date(Math.max(...l)).toISOString():""}function l7(u){return["succeeded","failed","skipped","cancelled","canceled","completed"].includes(String(u||"").toLowerCase())}function sW(u){let l=dW(u).toLowerCase();return["running","active","in-progress","in_progress"].includes(l)}function mW(u,l="status"){return u.reduce((f,r)=>{let n=String(r?.[l]||"unknown").toLowerCase();return f[n]=(f[n]||0)+1,f},{})}function aW(u){if(!u||typeof u!=="string")return null;try{let l=JSON.parse(u);return pu(l)?l:null}catch{return null}}function M9(u){let l=u.map(aW).filter((i)=>Boolean(i)),f=l.flatMap((i)=>[i.timestamp,i.createdAt,i.updatedAt]).filter(Boolean),r=u7(...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 BA(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 oW(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 dW(u){if(typeof u==="string")return u;if(pu(u))return String(u.status||u.state||u.phase||"unknown");return"unknown"}function nS(u){return u.filter((l)=>l&&l.value!==void 0&&l.value!==null&&String(l.value)!=="")}function k9({items:u}){let l=nS(Du(u));return K("div",{className:"pipeline-kv-grid"},l.map((f)=>K("span",{key:f.label},K("b",null,f.label),K("span",null,f.value))))}function f7({items:u}){let l=Du(u).map((f)=>String(f||"")).filter(Boolean);if(l.length===0)return null;return K("div",{className:"pipeline-chip-row"},l.map((f,r)=>K("span",{key:`${r}-${f}`},f)))}function I9(u,l){let f=String(l?.procedureRunId||""),r=Du(u?.procedureRuns);return r.find((n)=>String(Dr(n))===f)||r.at(-1)||null}function iS(u,l){let f=String(l||"");if(!f)return null;return Du(u?.procedureRuns).find((r)=>Dr(r)===f)||null}function R9(u){return Du(u?.attempts).length}function DW(u){return Du(u?.attempts).reduce((l,f)=>l+YA(f).length,0)}function YA(u){return Du(u?.opencodeMessages?.steps).filter(pu)}function eW(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 tS(u,l){let f=s9(u.map((i)=>i?.agent)).slice(0,3),r=s9(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 vc(u,l=0){return String(u?.messageId||u?.index||"")||`step-${l}`}function yS({steps:u,sessionIds:l,sessionFacts:f,matchedStepKey:r}){let n=Du(u),i=n.findIndex((L,U)=>vc(L,U)===r),t=i>=0?n[i]:null,y=n.flatMap((L)=>[su(L?.createdAt),su(L?.completedAt)]).filter((L)=>L!==null),c=y.length>0?Math.min(...y):null,$=y.length>0?Math.max(...y):null,A=c!==null&&$!==null?Math.max(0,$-c):null,j=n.reduce((L,U)=>L+Du(U?.parts).filter((q)=>String(q?.type||"").toLowerCase()==="tool").length,0),F=n.reduce((L,U)=>L+Du(U?.parts).filter((q)=>["text","reasoning"].includes(String(q?.type||"").toLowerCase())).length,0),J=n.reduce((L,U)=>L+Du(U?.parts).filter((q)=>String(q?.type||"").toLowerCase()==="tool"&&eW(q)==="failed").length,0),Q=[`${n.length} steps`,`${l.length} sessions`,`${F} messages`,`${j} tools`,A!==null?`duration ${mr(A)}`:"",J>0?`${J} failed tools`:""].filter(Boolean),W=t?[`Step ${t?.index??i+1}`,String(t?.role||"role --"),t?.model?`model ${t.model}`:"",t?.finish?`finish ${t.finish}`:"",t?.durationMs!==void 0&&t?.durationMs!==null?`duration ${mr(t.durationMs)}`:""].filter(Boolean):[];return K("section",{className:"pipeline-trace-timeline","data-testid":"pipeline-step-timeline"},K("div",{className:"pipeline-trace-head"},K("div",null,K("b",null,"OpenCode Trace"),K("span",null,"Trace 使用 Code Queue 统一样式展示完整 agent loop;Pipeline 旧 step/message/tool 卡片样式已废弃。")),K("div",{className:"pipeline-trace-session-head","data-testid":"pipeline-step-timeline-session"},K("span",null,Q.join(" / ")||"Trace"),f.length>0?K(f7,{items:f}):null)),t?K("div",{className:"pipeline-trace-focus","data-testid":"pipeline-trace-matched-step"},K("span",{className:"codex-output-channel"},"Matched"),K("strong",null,`Gantt selection -> ${W.join(" / ")}`),K("time",null,`${HA(t?.createdAt)} -> ${HA(t?.completedAt)}`)):null,K(s$,{port:UQ,input:n,className:"codex-transcript pipeline-trace",testId:"pipeline-opencode-step-trace",emptyText:"暂无 OpenCode Trace 输出",keepRecentToolCalls:3}))}function g9(u){return Du(u).flatMap((l)=>{if(pu(l))return[l];let f=aW(l);return f?[f]:[]})}function un(u){return String(u?.event||u?.action||u?.requestedAction||u?.type||"").toLowerCase()}function Gy(u){return oc(u?.timestamp,u?.createdAt,u?.updatedAt,u?.startedAt,u?.finishedAt)}function cS(u){return su(Gy(u))}function PA(u){return String(u?.attempt||u?.id||"")}function s9(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 pW(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 ei(u){return String(u?.requestedAction||u?.action||"").toLowerCase()}function kc(u){switch(ei(u)){case"guide":return"引导";case"modify":return"修改";case"approve":return"审核通过";case"restart":return"重启";case"redo":return"重做";default:return String(u?.requestedAction||u?.action||"控制")}}function SW(u){switch(un(u)){case"initial-prompt-delivered":return"初始 prompt";case"append-prompt-delivered":return"追加 prompt";case"append-prompt-queued":return"追加 prompt 已排队";case"monitor-prompt-delivered":return"Monitor prompt";case"node-long-running-observation":return"长任务观察";case"node-finished":return"节点完成";case"oa-policy-downstream-evaluated":return"OA 下游策略";case"control-command-queued":return`${kc(u)} 已发起`;case"control-command-applied":return`${kc(u)} 已生效`;case"control-command-ignored":return`${kc(u)} 已忽略`;default:return String(u?.event||u?.action||u?.requestedAction||"event")}}function XW(u){return oW(u?.promptPreview||u?.reasonPreview||u?.prompt||u?.reason||"",240)}function _S(u){let l=String(u?.prompt||""),f=String(u?.reason||u?.restartReason||""),r=l?"":String(u?.promptPreview||""),n=f?"":String(u?.reasonPreview||"");return[l||r?{label:l?"prompt":"prompt preview",value:l||r}:null,f||n?{label:f?"reason":"reason preview",value:f||n}:null,Du(u?.resetNodeIds).length>0?{label:"reset nodes",value:Du(u.resetNodeIds).join(", ")}:null,Du(u?.runningResetNodeIds).length>0?{label:"interrupted running nodes",value:Du(u.runningResetNodeIds).join(", ")}:null,Du(u?.interruptedProcedureRunIds).length>0?{label:"interrupted procedures",value:Du(u.interruptedProcedureRunIds).join(", ")}:null,u?.interruptedProcedureRunId?{label:"interrupted procedure",value:String(u.interruptedProcedureRunId)}:null].filter(Boolean)}function x9(u){let l=YA(u),f=l.map((c)=>su(c?.createdAt)).filter((c)=>c!==null),r=l.map((c)=>su(c?.completedAt)??su(c?.createdAt)).filter((c)=>c!==null),n=g9(u?.controlEventRecords).map((c)=>cS(c)).filter((c)=>c!==null),i=Du(u?.assistantOutputs).map((c)=>su(c?.updatedAt)).filter((c)=>c!==null),t=f[0]??n[0]??i[0]??null,y=r.at(-1)??n.at(-1)??i.at(-1)??t;return{startMs:t,endMs:y}}function $S(u,l,f,r,n=""){let i=Du(u?.procedureRuns).filter((y)=>CA(y,l)===f);if(i.length===0)return null;if(n){let y=i.find((c)=>Dr(c)===n);if(y)return y}if(r===null)return i.at(-1)||null;let t=i.find((y)=>{let c=su(EA(y,u)),$=su(OA(y,u))??c;return c!==null&&$!==null&&r>=c-1000&&r<=$+1000});if(t)return t;return i.slice().sort((y,c)=>{let $=su(EA(y,u))??r,A=su(OA(y,u))??$,j=su(EA(c,u))??r,F=su(OA(c,u))??j,J=Math.min(Math.abs($-r),Math.abs(A-r)),Q=Math.min(Math.abs(j-r),Math.abs(F-r));return J-Q})[0]||null}function uL(u,l){let f=Du(u?.attempts).filter(pu);if(f.length===0)return null;let r=String(l?.attempt||"");if(r){let t=f.find((y)=>PA(y)===r);if(t)return t}let n=Number.isFinite(Number(l?.ms))?Number(l.ms):null;if(n===null)return f.at(-1)||null;let i=f.find((t)=>{let y=x9(t);return Number.isFinite(y.startMs)&&Number.isFinite(y.endMs)&&n>=Number(y.startMs)-1000&&n<=Number(y.endMs)+1000});if(i)return i;return f.slice().sort((t,y)=>{let c=x9(t),$=x9(y),A=Math.min(Math.abs(Number(c.startMs??n)-n),Math.abs(Number(c.endMs??n)-n)),j=Math.min(Math.abs(Number($.startMs??n)-n),Math.abs(Number($.endMs??n)-n));return A-j})[0]||f.at(-1)||null}function lL(u,l){let f=YA(u);if(f.length===0)return{step:null,stepIndex:-1,stepKey:""};if(l===null){let i=f[0];return{step:i,stepIndex:0,stepKey:vc(i,0)}}for(let i=0;i=y-1000&&l<=c+1000)return{step:t,stepIndex:i,stepKey:vc(t,i)}}let r=f.findIndex((i)=>{let t=su(i?.createdAt)??su(i?.completedAt);return t!==null&&t>=l});if(r>=0){let i=f[r];return{step:i,stepIndex:r,stepKey:vc(i,r)}}let n=Math.max(0,f.length-1);return{step:f[n],stepIndex:n,stepKey:vc(f[n],n)}}function AS(u,l){let f=String(l?.runId||u?.runId||"");if(String(l?.mode||"")==="interval"){let $=l?.interval||{},A=I9(u,$)||$.raw||{};return{mode:"interval",runId:f,interval:$,marker:null,nodeId:String($?.nodeId||CA(A,f)||""),procedure:A,attempt:null,matchedStep:null,matchedStepIndex:-1,matchedStepKey:""}}let r=pu(l?.marker)?l.marker:{},n=Number.isFinite(Number(r?.ms))?Number(r.ms):null,i=String(r?.nodeId||""),t=i?$S(u,f,i,n,String(r?.procedureRunId||"")):null,y=t?uL(t,r):null,c=y?lL(y,n):{step:null,stepIndex:-1,stepKey:""};return{mode:"event",runId:f,interval:null,marker:r,nodeId:i,procedure:t,attempt:y,matchedStep:c.step,matchedStepIndex:c.stepIndex,matchedStepKey:c.stepKey}}function jS({procedure:u,matchedStepKey:l="",matchedAttemptId:f=""}){let r=Du(u?.attempts);if(r.length===0)return K(Nr,{title:"暂无 attempt 详情",text:"当前 procedure 还没有可展示的 attempt / OpenCode Trace;若刚点击甘特线,请等待 node 详情抓取完成。"});return r.map((n,i)=>{let t=n?.opencodeMessages||{},y=YA(n),c=Du(t.sessionIds).map((F)=>String(F)).filter(Boolean),$=tS(y,c),A=PA(n)||`attempt-${i+1}`,j=y.reduce((F,J)=>F+Du(J?.parts).filter((Q)=>String(Q?.type||"").toLowerCase()==="tool"&&eW(Q)==="failed").length,0);return K("article",{key:A,className:`pipeline-attempt-card ${f===A?"matched":""}`},K("div",{className:"pipeline-attempt-head"},K("div",null,K("strong",null,A),K("span",null,t.source||"opencode")),K("div",{className:"pipeline-attempt-badges"},K("span",null,`${y.length} steps`),K("span",null,`${t.toolCallCount??"--"} tools`),j>0?K("span",{className:"danger"},`${j} failed`):null)),K(k9,{items:[{label:"messages",value:t.messageCount??"--"},{label:"steps",value:t.stepCount??"--"},{label:"tools",value:t.toolCallCount??"--"},{label:"updated",value:wu(t.updatedAt)},{label:"sessions",value:c.join(", ")||"--"}]}),y.length===0?K("p",{className:"muted paragraph"},"当前 attempt 尚未返回 OpenCode Trace;请确认 D601 pipeline-control 已重建并重新抓取。"):K(yS,{steps:y,sessionIds:c,sessionFacts:$,matchedStepKey:l}))})}function h9(u,l){return`${u}::${l}`}function VA(u,l,f){if(!pu(u))return null;return String(u.runId||"")===l&&String(u.nodeId||"")===f?u:null}function FS(u,l){let f=pu(u)?u:{};if(!pu(l))return f;let r=Du(l.attempts),n=Du(f.attempts);return{...f,...l,attempts:r.length>0?r:n}}function US(u,l,f,r){if(!VA(l,f,r))return u;let n=Du(l.procedureRuns),i=pu(u)?u:{};return{...i,...l,controlEvents:Du(l.controlEvents).length>0?l.controlEvents:i.controlEvents,procedureRuns:n.length>0?n:i.procedureRuns}}function JS({selection:u,runDetails:l,nodeDetails:f,nodeDetailsState:r,onRaw:n,onCollapse:i}){if(!u?.mode)return K("aside",{className:"pipeline-gantt-detail-panel empty","data-testid":"pipeline-gantt-detail-panel"},K("div",{className:"pipeline-gantt-detail-head"},K("div",null,K("span",{className:"panel-eyebrow"},"Gantt Detail"),K(rl,{title:"未选择元素",level:3})),K("button",{type:"button",className:"ghost-btn mini",onClick:i,"data-testid":"pipeline-gantt-sidebar-collapse"},"收起")),K(Nr,{title:"选择一条执行线或一个控制点",text:"点击甘特图中的 node 执行线、prompt 点或控制点,在这里查看结构化过程和 OpenCode step。"}));let t=String(u?.runId||""),y=String(u?.interval?.nodeId||u?.marker?.nodeId||""),c=l?.runId===t?l.details:null,$=VA(f,t,y),A=String(r?.runId||"")===t&&String(r?.nodeId||"")===y,j=US(c,$,t,y),F=(String(l?.runId||"")!==t||Boolean(l?.loading))&&!j,J=String(l?.runId||"")===t?String(l?.error||""):"",Q=A?String(r?.error||""):"",W=j?AS(j,u):null,L=W?.interval||u?.interval||null,U=W?.marker||u?.marker||null,q=String(L?.procedureRunId||U?.procedureRunId||""),N=$?iS($,q)||I9($,L||{procedureRunId:q}):null,w=W?.procedure||(j?I9(j,L||{procedureRunId:q}):null)||L?.raw||{};if(N&&(R9(w)===0||DW(N)>=DW(w)))w=FS(w,N);let G=W?.attempt||null,Z=String(W?.matchedStepKey||"");if(!G&&U&&R9(w)>0)G=uL(w,U),Z=String(lL(G,Number.isFinite(Number(U?.ms))?Number(U.ms):null).stepKey||"");let H=PA(G),E=R9(w)>0,m=A&&Boolean(r?.loading)&&!E,S=Boolean(F||m),B=[E?"":J,Q].filter(Boolean).join(" / "),D=A&&r?.fetchedAt?r.fetchedAt:l?.fetchedAt,X=dW(w?.status||L?.status||U?.status||U?.event),O=u?.mode==="event"?U?.label||SW(U?.raw||U)||"event":W?.nodeId||L?.nodeId||"node",Y=U?_S(U?.raw||U):[],p=U?[un(U?.raw||U)?`event ${un(U?.raw||U)}`:"",U?.promptEvent?`prompt ${U.promptEvent}`:"",U?.action?`action ${U.action}`:"",U?.sourceKind?`source ${pW(U.sourceKind)}`:"",U?.sourceNodeId?`from ${U.sourceNodeId}`:"",U?.targetNodeId?`to ${U.targetNodeId}`:"",U?.snapReason?`draw ${U.snapReason}`:""].filter(Boolean):[];return K("aside",{className:"pipeline-gantt-detail-panel","data-testid":"pipeline-gantt-detail-panel"},K("div",{className:"pipeline-gantt-detail-head"},K("div",null,K("span",{className:"panel-eyebrow"},u?.mode==="event"?"Gantt Event Detail":"Gantt Line Detail"),K(rl,{title:O,level:3,loading:S})),K("div",{className:"pipeline-gantt-detail-head-actions"},K(a0,{status:X},X),K("button",{type:"button",className:"ghost-btn mini",onClick:i,"data-testid":"pipeline-gantt-sidebar-collapse"},"收起"))),U?K("article",{className:"pipeline-event-card"},K("div",{className:"pipeline-event-card-head"},K("strong",null,U?.label||SW(U?.raw||U)),K(f7,{items:p})),K(k9,{items:[{label:"event time",value:wu(U?.timestampIso||U?.timestamp||"--")},U?.snapped?{label:"drawn time",value:wu(U?.renderedTimestampIso||U?.ms)}:null,{label:"node",value:U?.nodeId||"--"},{label:"procedure",value:U?.procedureRunId||Dr(w)||"--"},{label:"attempt",value:U?.attempt||H||"--"},{label:"source kind",value:U?.sourceKind?pW(U.sourceKind):"--"},{label:"source node",value:U?.sourceNodeId||"--"},{label:"target node",value:U?.targetNodeId||"--"},{label:"command",value:U?.commandId||U?.eventId||"--"},U?.snapReason?{label:"placement",value:U.snapReason}:null]}),Y.length>0?K("div",{className:"pipeline-event-blocks"},Y.map((v,z)=>K("section",{key:`${v.label}-${z}`,className:"pipeline-event-text-block"},K("b",null,v.label),K("p",null,v.value)))):null,XW(U?.raw||U)?K("p",{className:"pipeline-text-preview"},XW(U?.raw||U)):null):null,K(k9,{items:[{label:"epoch",value:t||L?.runId||"--"},{label:"node",value:W?.nodeId||L?.nodeId||U?.nodeId||"--"},{label:"procedure",value:L?.procedureRunId||U?.procedureRunId||Dr(w)||"--"},{label:"started",value:wu(L?.startedAt||w?.startedAt)},{label:"finished",value:wu(L?.finishedAt||w?.finishedAt)},{label:"duration",value:mr(L?.durationMs||w?.durationMs)},{label:"fetched",value:D?yl(D):"--"},W?.matchedStep?{label:"matched step",value:`Step ${W.matchedStep.index??W.matchedStepIndex+1}`}:null]}),K(nl,{error:B}),K("div",{className:"pipeline-gantt-detail-actions"},K(ln,{title:`Procedure ${L?.procedureRunId||U?.procedureRunId||W?.nodeId||"node"}`,data:w,onOpen:n,testId:"raw-pipeline-gantt-procedure"}),U?K(ln,{title:`Pipeline event ${U?.id||U?.commandId||U?.eventId||W?.nodeId||"event"}`,data:U?.raw||U,onOpen:n,testId:"raw-pipeline-gantt-event"}):null,j?K(ln,{title:`Pipeline run ${t||"--"}`,data:j,onOpen:n,testId:"raw-pipeline-gantt-node-details"}):null),!S&&!Dr(w)&&!U?K(Nr,{title:"暂无过程详情",text:"当前选择还没有可匹配的 procedure 运行记录。"}):null,!S&&Dr(w)?K(jS,{procedure:w,matchedStepKey:Z,matchedAttemptId:H}):null)}function QS({value:u}){let f=String(u||"--").split(/([_-])/u);return K(s0.default.Fragment,null,f.map((r,n)=>r==="-"||r==="_"?K(s0.default.Fragment,{key:n},r,K("wbr",null)):K(s0.default.Fragment,{key:n},r)))}async function k0(u,l={}){return Eu(u,{invalidJsonPrefix:"Pipeline 返回了无效 JSON",...l})}function a0({status:u,children:l}){let f=String(u||"unknown").toLowerCase();return K("span",{className:`status-badge ${f}`},l||u||"unknown")}function Cf({label:u,value:l,hint:f,tone:r}){return K("article",{className:`metric-card ${r||""}`},K("div",{className:"metric-label"},u),K("div",{className:"metric-value"},l),K("div",{className:"metric-hint"},f))}function Wn({title:u,eyebrow:l,actions:f,children:r,className:n,loading:i}){return K("section",{className:`panel ${n||""}`},K("div",{className:"panel-head"},K("div",null,l?K("p",{className:"panel-eyebrow"},l):null,K(rl,{title:u,loading:i})),f?K("div",{className:"panel-actions"},f):null),K("div",{className:"panel-body"},r))}function ln({title:u,data:l,onOpen:f,testId:r}){return K("button",{type:"button",className:"ghost-btn","data-testid":r,onClick:()=>f(u,l)},"查看原始JSON")}function Vr({title:u,subtitle:l,facts:f,data:r,onRaw:n,testId:i}){let t=Du(f).map((y)=>String(y||"")).filter(Boolean);return K("article",{className:"pipeline-evidence-row"},K("div",{className:"pipeline-evidence-main"},K("strong",null,u),l?K("span",null,l):null),K("div",{className:"pipeline-evidence-facts"},t.map((y,c)=>K("span",{key:`${c}-${y.slice(0,16)}`},y))),r!==void 0?K(ln,{title:u,data:r,onOpen:n,testId:i}):null)}function Nr({title:u,text:l}){return K("div",{className:"empty-state"},K("strong",null,u),K("span",null,l))}function NS(u){return u?.runtime&&typeof u.runtime==="object"&&!Array.isArray(u.runtime)?u.runtime:{}}function qS(u){return u?.backend&&typeof u.backend==="object"&&!Array.isArray(u.backend)?u.backend:{}}function wS(u){return u?.repository&&typeof u.repository==="object"&&!Array.isArray(u.repository)?u.repository:{}}function WS(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 YW(u,l,f){let r=u?._unidesk?.arrayLimits?.[l],n=Number(r?.originalLength);return Number.isFinite(n)?n:f}function fL(u){if(!u||typeof u!=="object"||Array.isArray(u))return"--";return`${u.componentClass||"--"}/${u.id||"--"}`}function mA(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 r7(u){return u?.config&&typeof u.config==="object"&&!Array.isArray(u.config)?u.config:{}}function rL(u){let l=r7(u),f=Array.isArray(l.nodes)?l.nodes:Array.isArray(u?.nodes)?u.nodes:[],r=new Map;for(let t of f){let y=String(t?.id||t?.nodeId||"");if(y)r.set(y,{...t,id:y})}let n=n7(u),i=(t)=>{if(t&&!r.has(t))r.set(t,{id:t})};for(let t of i7(u))sc(t).forEach(i);for(let t of n)i(String(t?.from||t?.source||"")),i(String(t?.to||t?.target||""));return Array.from(r.values())}function n7(u){let l=r7(u);return Array.isArray(l.edges)?l.edges:Array.isArray(u?.edges)?u.edges:[]}function i7(u){let l=r7(u);return Array.isArray(l.topologicalBatches)?l.topologicalBatches:Array.isArray(u?.topologicalBatches)?u.topologicalBatches:[]}function LS(u){let l=new Map;for(let f of u){let r=mA(f);if(r)l.set(r,f);let n=Array.isArray(f?.refs)?f.refs:[];for(let i of n){let t=mA(i);if(t)l.set(t,f)}}return l}function PW(u,l){let f=l.get(mA(u?.componentRef));if(f)return f;let r=mA({componentClass:u?.kind,id:u?.id});return r?l.get(r)||null:null}function CW(u,l){let f=nL(u,l);return String(f?.status||"pending")}function nL(u,l){return(Array.isArray(u?.nodes)?u.nodes:[]).find((r)=>r?.nodeId===l||r?.id===l)||null}function TS(u){return u.reduce((l,f)=>{let r=String(f?.status||"unknown").toLowerCase();return l[r]=(l[r]||0)+1,l},{})}function KS(u){if(Array.isArray(u?.scorers))return u.scorers.filter(pu);if(Array.isArray(u?.summary?.scorers))return u.summary.scorers.filter(pu);if(Array.isArray(u?.artifact?.summary?.scorers))return u.artifact.summary.scorers.filter(pu);return[]}function GS(u){if(pu(u?.run))return u.run;if(pu(u?.runSummary))return u.runSummary;return null}function zS(u,l){if(!pu(u)&&!pu(l))return null;if(!pu(u))return l;if(!pu(l))return u;return{...u,...l,request:pu(u.request)||pu(l.request)?{...pu(u.request)?u.request:{},...pu(l.request)?l.request:{}}:l.request??u.request,artifact:pu(u.artifact)||pu(l.artifact)?{...pu(u.artifact)?u.artifact:{},...pu(l.artifact)?l.artifact:{}}:l.artifact??u.artifact,summary:pu(u.summary)||pu(l.summary)?{...pu(u.summary)?u.summary:{},...pu(l.summary)?l.summary:{}}:l.summary??u.summary}}function DA(u){let l=KS(u),f=l.find((A)=>pu(A?.score))||l[0]||null,r=pu(f?.score)?f.score:{},n=Number(r.passed),i=Number(r.total),t=Number(r.ratio),y=Number.isFinite(t)?t:Number.isFinite(n)&&Number.isFinite(i)&&i>0?n/i:null,c=y===null?null:Math.round(Math.max(0,Math.min(100,y<=1?y*100:y))),$=String(r.text||(Number.isFinite(n)&&Number.isFinite(i)?`${n}/${i}`:""));return{scorer:f,scorers:l,score:r,passed:Number.isFinite(n)?n:null,total:Number.isFinite(i)?i:null,percent:c,text:$}}function a9(u){let l=DA(u);return l.text||(l.scorers.length>0?String(l.scorer?.status||"pending"):"--")}function t7(u){let l=DA(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 ES(u){return Array.isArray(u?.items)?u.items.filter(pu):[]}function OS({run:u}){let l=a9(u);return K("span",{className:`pipeline-score-badge ${t7(u)}`},`score ${l}`)}function ZS({run:u,onRaw:l}){let r=DA(u).scorers;if(!u)return K(Nr,{title:"暂无评分",text:"选择一个 epoch 后会显示 scorer 结果。"});if(r.length===0)return K("div",{className:"pipeline-score-empty"},K("strong",null,"评分器等待中"),K("span",null,"DAG 完成后,Pipeline control backend 会把 scorer summary 追加到 run artifact,并通过 UniDesk 显示。"));return K("div",{className:"pipeline-score-board","data-testid":"pipeline-score-board"},r.map((n,i)=>{let t=DA({scorers:[n]}),y=ES(n),c=t.percent??0;return K("article",{key:`${n.scorerId||n.component||i}`,className:`pipeline-score-card ${t7({scorers:[n]})}`},K("div",{className:"pipeline-score-head"},K("div",null,K("span",null,n.scorerId||n.component||"scorer"),K("strong",null,t.text||n.status||"--")),K(a0,{status:n.status||"unknown"},n.status||"unknown")),K("div",{className:"pipeline-score-meter","aria-label":`score ${c}%`},K("span",{style:{width:`${c}%`}})),K("div",{className:"pipeline-score-facts"},K("span",null,`${c}%`),K("span",null,n.component||"--"),K("span",null,n.applicationCheckoutRef||"--")),y.length>0?K("div",{className:"pipeline-score-items"},y.map(($)=>K("span",{key:`${$.id||$.filter}`,className:`pipeline-score-item ${String($.status||"").toLowerCase()}`,title:`${$.filter||"--"} / ran=${$.ran??"?"}`},K("b",null,$.id||"--"),K("small",null,$.status||"--")))):K("p",{className:"muted paragraph"},"当前 scorer 尚未返回 item 级结果。"),n.error?K("p",{className:"pipeline-score-error"},oW(n.error,360)):null,K("div",{className:"panel-actions inline-actions"},K(ln,{title:`Scorer ${n.scorerId||i}`,data:n,onOpen:l,testId:"raw-pipeline-score"})))}))}function HS(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 sc(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 sc(u.nodes);if(Array.isArray(u?.nodeIds))return sc(u.nodeIds);return[]}function BS(u){return pu(u?.instanceInputs?.monitor)?u.instanceInputs.monitor:{}}function iL(u,l){if(String(u?.kind||"").toLowerCase()!=="procedure")return!1;let f=BS(u);if(u?.instanceInputs?.monitorMode===!0||f.enabled===!0)return!0;let r=fL(u?.componentRef);return String(l?.id||l?.config?.id||r||"").toLowerCase().includes("monitor")}function VS(u){return u.filter((l)=>iL(l)).map((l)=>String(l?.id||"")).filter(Boolean)}function mS(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 DS(u,l){if(l.length===0)return u;let f=new Set(l),r=l.filter((i)=>u.some((t)=>t.includes(i)));if(r.length===0)return u;let n=u.map((i)=>i.filter((t)=>!f.has(t))).filter((i)=>i.length>0);return[r,...n]}function pS(u,l,f){let n=i7(u).map(sc).filter((F)=>F.length>0);if(n.length>0)return n;let i=l.map((F)=>String(F?.id||"")).filter(Boolean),t=new Set(i),y=new Map(i.map((F)=>[F,0])),c=new Map(i.map((F)=>[F,[]]));for(let F of f){let J=String(F?.from||F?.source||""),Q=String(F?.to||F?.target||"");if(!t.has(J)||!t.has(Q))continue;c.get(J)?.push(Q),y.set(Q,(y.get(Q)||0)+1)}let $=new Map,A=i.filter((F)=>(y.get(F)||0)===0);for(let F of A)$.set(F,0);while(A.length>0){let F=A.shift(),J=($.get(F)||0)+1;for(let Q of c.get(F)||[])if(y.set(Q,Math.max(0,(y.get(Q)||0)-1)),$.set(Q,Math.max($.get(Q)||0,J)),(y.get(Q)||0)===0)A.push(Q)}i.forEach((F)=>{if(!$.has(F))$.set(F,0)});let j=Math.max(0,...Array.from($.values()));return Array.from({length:j+1},(F,J)=>i.filter((Q)=>$.get(Q)===J)).filter((F)=>F.length>0)}function SS(u,l,f){let n=i7(u).map(sc).filter((y)=>y.length>0),i=n.length>0?n.flatMap((y)=>y):(()=>{let y=l.map((W)=>String(W?.id||"")).filter(Boolean),c=new Set(y),$=f.filter((W)=>String(W?.edgeType||"").toLowerCase()!=="rework"),A=new Map(y.map((W)=>[W,0])),j=new Map(y.map((W)=>[W,[]]));for(let W of $){let L=String(W?.from||W?.source||""),U=String(W?.to||W?.target||"");if(!c.has(L)||!c.has(U))continue;j.get(L)?.push(U),A.set(U,(A.get(U)||0)+1)}let F=new Map,J=y.filter((W)=>(A.get(W)||0)===0);for(let W of J)F.set(W,0);while(J.length>0){let W=J.shift(),L=(F.get(W)||0)+1;for(let U of j.get(W)||[])if(A.set(U,Math.max(0,(A.get(U)||0)-1)),F.set(U,Math.max(F.get(U)||0,L)),(A.get(U)||0)===0)J.push(U)}y.forEach((W)=>{if(!F.has(W))F.set(W,0)});let Q=Math.max(0,...Array.from(F.values()));return Array.from({length:Q+1},(W,L)=>y.filter((U)=>F.get(U)===L)).flatMap((W)=>W)})(),t=new Set(i);for(let y of l){let c=String(y?.id||"");if(!c||t.has(c))continue;i.push(c),t.add(c)}return mS(i,VS(l))}function xc(u){return`${u.source}->${u.target}-${u.index}`}function MW(u,l,f){let r=rL(u),n=n7(u),i=LS(f),t=new Map(r.map((X)=>[String(X?.id||""),X])),y=r.filter((X)=>iL(X,PW(X,i))).map((X)=>String(X?.id||"")).filter(Boolean),c=DS(pS(u,r,n),y),$=[],A=new Map,j=330,F=122;c.forEach((X,O)=>{let Y=X.length*122;X.forEach((p,v)=>{let z=t.get(p)||{id:p},P=PW(z,i),k=CW(l,p).toLowerCase(),I=String(z.kind||P?.componentClass||"node").toLowerCase(),b=fL(z.componentRef||P),d=String(P?.config?.version||P?.version||""),s=String(P?.config?.description||P?.description||""),h=v*122-Math.floor(Y/2);A.set(p,{column:O,row:v,y:h}),$.push({id:p,type:"pipelineNode",position:{x:O*330,y:h},data:{exportLabel:{id:p,kind:I,componentRef:b,componentVersion:d,componentDescription:s,status:k},label:K("div",{className:"flow-node-label"},K("strong",null,p),K("span",null,I),K("code",{title:s||b},d?`${b}@${d}`:b),K(a0,{status:k},k))},className:`pipeline-flow-node ${I} ${k}`})})});let J=n.flatMap((X,O)=>{let Y=String(X?.from||X?.source||""),p=String(X?.to||X?.target||"");if(!t.has(Y)||!t.has(p))return[];return[{source:Y,target:p,index:O,condition:X?.condition,edgeType:X?.edgeType}]}),Q=J.reduce((X,O)=>X.set(O.source,(X.get(O.source)||0)+1),new Map),W=J.reduce((X,O)=>X.set(O.target,(X.get(O.target)||0)+1),new Map),L=J.reduce((X,O)=>{let Y=`${O.source}->${O.target}`;return X.set(Y,(X.get(Y)||0)+1)},new Map),U=new Map,q=new Map,N=new Map,w=new Map,G=new Map,Z=new Map,H=J.reduce((X,O)=>{let Y=A.get(O.source),p=A.get(O.target),v=(p?.column||0)-(Y?.column||0);if(v<=0||String(O.edgeType||"").toLowerCase()==="rework"||v!==1)return X;let P=`${O.source}->column:${p?.column??""}`,k=X.get(P)||[];return k.push(O),X.set(P,k),X},new Map);for(let X of H.values()){if(X.length<2)continue;X.slice().sort((O,Y)=>{let p=A.get(O.target),v=A.get(Y.target);return(p?.y||0)-(v?.y||0)||O.index-Y.index}).forEach((O,Y,p)=>{Z.set(xc(O),{slot:Y-(p.length-1)/2,count:p.length})})}[...J].sort((X,O)=>{let Y=A.get(X.source),p=A.get(X.target),v=A.get(O.source),z=A.get(O.target),P=Math.abs((p?.column||0)-(Y?.column||0))*330+Math.abs((p?.y||0)-(Y?.y||0)),k=Math.abs((z?.column||0)-(v?.column||0))*330+Math.abs((z?.y||0)-(v?.y||0));return P-k||X.index-O.index}).forEach((X)=>{let O=A.get(X.source)||{column:0,row:0,y:0},Y=A.get(X.target)||{column:0,row:0,y:0},p=Y.column-O.column,v=Math.max(0,p),z=p<=0||String(X.edgeType||"").toLowerCase()==="rework",P=O.y-Y.y,k=W.get(X.target)||1,I=Z.has(xc(X)),b=!z&&v<=1&&(I||k===1),d=G.get(X.target)||new Map;G.set(X.target,d);let s=Ic.slice().sort((h,lu)=>{let cu=(Wu)=>{let C=String(Wu.side),e=0;if(z){if(C==="left")e+=86;if(C==="top")e+=Y.y<=0?-22:12;if(C==="bottom")e+=Y.y>=0?-22:12;if(Math.abs(Y.y)<12&&C!=="left")e+=X.index%2===0?C==="top"?-6:6:C==="bottom"?-6:6;return e}if(b){if(C==="left")e-=I?72:44;if(C!=="left")e+=I?72:44;return e+Math.abs(P)*0.02}if(C==="left")e+=v<=1?0:24;if(C==="top")e+=P<-36?-18:42;if(C==="bottom")e+=P>36?-18:42;if(v<=1&&Math.abs(P)<=82&&C!=="left")e+=38;if(v>1&&C!=="left")e-=10;return e},_u=O.y-Y.y,Fu=_u!==0?_u:X.index%2===0?-1:1,zu=(Wu)=>{let C=d.get(Wu.id)||0;return cu(Wu)+C*64+ep(Wu,d,Fu)};return zu(h)-zu(lu)||String(h.id).localeCompare(String(lu.id))})[0];d.set(s.id,(d.get(s.id)||0)+1),w.set(xc(X),s)});let m=J.map((X)=>{let O=CW(l,X.target).toLowerCase(),Y=`${X.source}->${X.target}`,p=U.get(X.source)||0,v=q.get(X.target)||0,z=N.get(Y)||0;U.set(X.source,p+1),q.set(X.target,v+1),N.set(Y,z+1);let P=p-((Q.get(X.source)||1)-1)/2,k=v-((W.get(X.target)||1)-1)/2,I=z-((L.get(Y)||1)-1)/2,b=A.get(X.source),d=A.get(X.target),s=(d?.column||0)-(b?.column||0),h=Math.max(1,Math.abs(s)),lu=s<=0||String(X.edgeType||"").toLowerCase()==="rework",cu=Math.abs((d?.y||0)-(b?.y||0)),_u=Z.get(xc(X)),Fu=!lu&&s===1&&(W.get(X.target)||0)>1,zu=_u?_u.slot:I*2+P+k*0.45,Wu=zu===0?X.index%2===0?-1:1:Math.sign(zu),C=w.get(xc(X))||Ic[1],e=C.side==="top"?-1:C.side==="bottom"?1:Wu,uu=lu||h>1||cu>96||Math.abs(zu)>0.2||C.side!=="left",Gu=lu?118+h*18:22+h*16,a=C.side==="left"?0:28,qu=uu?Math.max(-280,Math.min(280,e*Math.min(180,Gu+a+cu*0.22)+zu*28)):0,Zu=Math.max(0,Math.min(bc.length-1,Math.round(P+(bc.length-1)/2))),Bu=bc[Zu]||bc[1],gu=O==="succeeded"?"var(--accent-2)":O==="running"?"var(--accent)":O==="failed"?"var(--danger)":"rgba(129, 147, 159, 0.78)",ll=b?.column||0,Pu=d?.column||0,Nl=qu===0?0:Math.sign(qu),Qf=lu?`feedback:${ll}->${Pu}:${Nl}`:_u?`fanout:${ll}->${Pu}:${X.source}`:Fu?`fanin:${ll}->${Pu}:${X.target}`:C.side!=="left"||h>1?`corridor:${ll}->${Pu}:${C.side}:${Nl}:${Math.round(Math.abs(qu)/56)}`:"";return{id:`${X.source}->${X.target}-${X.index}`,source:X.source,target:X.target,sourceHandle:Bu.id,targetHandle:C.id,type:"pipelineCurve",zIndex:12,animated:O==="running",data:{baseEdgeColor:gu,laneOffset:qu,routeMode:_u&&C.side==="left"?"direct-forward-left":"",targetSide:C.side,isFeedback:lu,overlapGroup:Qf},targetStatus:O}}),S=m.reduce((X,O)=>{let Y=String(O.data?.overlapGroup||"");return Y?X.set(Y,(X.get(Y)||0)+1):X},new Map),B=new Map,D=m.map((X)=>{let O=String(X.targetStatus||"pending"),Y={...X};delete Y.targetStatus;let p=String(X.data?.overlapGroup||""),v=p?S.get(p)||0:0,z=v>1?B.get(p)||0:-1;if(v>1)B.set(p,z+1);let P=z>=0?OW[z%OW.length]:String(X.data.baseEdgeColor),k={stroke:P};if(X.data.isFeedback)k.strokeDasharray="9 7";return{...Y,data:{...X.data,edgeColor:P,overlapSlot:z,overlapCount:v},style:k,markerEnd:{type:x0.ArrowClosed,color:P},className:`pipeline-flow-edge ${O} ${X.data.isFeedback?"feedback":""} ${z>=0?"overlap-colored":""}`}});return{nodes:$,edges:D}}function ur(u){return String(u??"").replace(/&/g,"&").replace(//g,">").replace(/"/g,""")}function RW(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 pA(u){return`arrow-${u.replace(/[^a-zA-Z0-9_-]+/g,"")}`}function tL(u,l="pipeline"){return String(u||l).replace(/[^a-zA-Z0-9_-]+/g,"-").replace(/^-|-$/g,"")||l}function xW(u,l){let f=u.position.x,r=u.position.y,n=Ic.find((i)=>i.id===l);if(n?.side==="top")return{x:f+zy*BW(n.style?.left,0.5),y:r,position:Ku.Top};if(n?.side==="bottom")return{x:f+zy*BW(n.style?.left,0.5),y:r+Ey,position:Ku.Bottom};return{x:f,y:r+Ey/2,position:Ku.Left}}function XS(u){return{x:u.position.x+zy,y:u.position.y+Ey/2}}function YS(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+zy),1)+220,i=Math.max(...u.nodes.map((W)=>W.position.y+Ey),1)+220,t=Math.ceil(n-f),y=Math.ceil(i-r),c=new Map(u.nodes.map((W)=>[W.id,W])),$=u.edges.map((W)=>RW(W.data?.edgeColor||W.style?.stroke)),j=Array.from(new Set(["#4eb7a8","#d7a13a","#cf6a54","#81939f",...$])).map((W)=>``).join(""),F=u.edges.flatMap((W)=>{let L=c.get(W.source),U=c.get(W.target);if(!L||!U)return[];let q=XS(L),N=xW(U,String(W.targetHandle||"in-left")),w=gW(q.x,q.y,N.x,N.y,N.position,Number(W.data?.laneOffset||0),String(W.data?.routeMode||"")),G=RW(W.data?.edgeColor||W.style?.stroke),Z=W.data?.isFeedback?' stroke-dasharray="9 7"':"";return``}).join(` +`),J=u.nodes.map((W)=>{let L=W.data?.exportLabel||{},U=String(L.status||"pending").toLowerCase(),q=U==="succeeded"?"#4eb7a8":U==="running"?"#d7a13a":U==="failed"?"#cf6a54":"#81939f",N=W.position.x,w=W.position.y,G=Ic.map((Z)=>{let H=xW(W,Z.id);if(Z.side==="top"||Z.side==="bottom")return``;return``}).join(` `);return` - + ${G} - - ${ef(L.id||W.id)} - ${ef(L.kind||"node")} - ${ef(L.componentRef||"--")} - ${ef(U)} + + ${ur(L.id||W.id)} + ${ur(L.kind||"node")} + ${ur(L.componentRef||"--")} + ${ur(U)} `}).join(` `);return{svg:` ${j} - ${ef(l)} + ${ur(l)} ${J}${F} - `,width:t,height:y}}function LS(u){let l=String(u||"").toLowerCase();if(l==="succeeded"||l==="completed")return"#4eb7a8";if(l==="failed")return"#cf6a54";if(MW(l))return"#69aee8";return"#d7a13a"}function TS(u){let l=String(u?.kind||""),f=String(u?.tone||u?.status||"").toLowerCase();if(l==="prompt"&&f==="initial")return"#d7a13a";if(l==="prompt"&&f==="monitor")return"#69aee8";if(l==="prompt")return"#4eb7a8";if(f==="modify")return"#e0b95a";if(f==="approve"||f==="guide"||f==="monitor")return"#4eb7a8";if(f==="restart"||f==="redo")return"#d7a13a";if(f==="ignored")return"#81939f";if(f==="webui")return"#69aee8";if(f==="cli")return"#d7a13a";return"#a7bac5"}function pW(u){let l=String(u?.sourceKind||"").toLowerCase(),f=String(u?.action||"").toLowerCase(),r=String(u?.status||"").toLowerCase();if(f==="observe"||r==="observation"||l==="monitor")return"#4eb7a8";if(l==="webui")return"#69aee8";if(l==="cli")return"#d7a13a";if(r.includes("ignored"))return"#81939f";return"#8aa0ad"}function KS(u,l,f){let r=TS(u),n=String(u?.kind||"");if(n==="control-source")return``;if(n==="control-target"){let t=String(u?.tone||"").toLowerCase()==="approve"?"rgba(78,183,168,0.22)":"#081118";return``}return``}function GS(u){let l=Du(u.visibleNodeIds).map((z)=>String(z||"")).filter(Boolean),f=Du(u.intervals).filter(pu),r=Du(u.markers).filter(pu),n=Du(u.arrows).filter(pu),i=Du(u.ticks).filter(pu),t=pu(u.bounds)?u.bounds:{},y=pu(u.backendLayout)?u.backendLayout:null,c=Math.max(240,Math.round(Number(u.chartHeight||360))),$=Math.max(wn,108),A=128,j=24,F=58,J=56,Q=128+Math.max(1,l.length)*$,W=Math.max(760,Q+48),L=114+c+24,U=24,q=58,N=114,w=(z)=>152+z*$,G=(z)=>w(z)+$/2,Z=Du(u.meta).map((z)=>String(z||"")).filter(Boolean).slice(0,4).join(" · "),H=new Map(r.map((z)=>[String(z.id||""),z])),V=Array.from(new Set(["#4eb7a8","#69aee8","#d7a13a","#cf6a54","#8aa0ad",...n.map(pW)])).map((z)=>``).join(""),S=i.map((z)=>{let P=114+iL(z,t,c,y);return` + `,width:t,height:y}}function PS(u){let l=String(u||"").toLowerCase();if(l==="succeeded"||l==="completed")return"#4eb7a8";if(l==="failed")return"#cf6a54";if(sW(l))return"#69aee8";return"#d7a13a"}function CS(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 hW(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 MS(u,l,f){let r=CS(u),n=String(u?.kind||"");if(n==="control-source")return``;if(n==="control-target"){let t=String(u?.tone||"").toLowerCase()==="approve"?"rgba(78,183,168,0.22)":"#081118";return``}return``}function RS(u){let l=Du(u.visibleNodeIds).map((z)=>String(z||"")).filter(Boolean),f=Du(u.intervals).filter(pu),r=Du(u.markers).filter(pu),n=Du(u.arrows).filter(pu),i=Du(u.ticks).filter(pu),t=pu(u.bounds)?u.bounds:{},y=pu(u.backendLayout)?u.backendLayout:null,c=Math.max(240,Math.round(Number(u.chartHeight||360))),$=Math.max(wn,108),A=128,j=24,F=58,J=56,Q=128+Math.max(1,l.length)*$,W=Math.max(760,Q+48),L=114+c+24,U=24,q=58,N=114,w=(z)=>152+z*$,G=(z)=>w(z)+$/2,Z=Du(u.meta).map((z)=>String(z||"")).filter(Boolean).slice(0,4).join(" · "),H=new Map(r.map((z)=>[String(z.id||""),z])),m=Array.from(new Set(["#4eb7a8","#69aee8","#d7a13a","#cf6a54","#8aa0ad",...n.map(hW)])).map((z)=>``).join(""),S=i.map((z)=>{let P=114+UL(z,t,c,y);return` - ${ef(wu(z.ms))} - +${ef(Dr(Number(z.offsetMs??Number(z.ms)-Number(t.startMs))))} + ${ur(wu(z.ms))} + +${ur(mr(Number(z.offsetMs??Number(z.ms)-Number(t.startMs))))} `}).join(` `),B=['','TIME',...l.map((z,P)=>{let k=w(P),I=z.length>18?`${z.slice(0,16)}…`:z;return` - ${ef(I)} + ${ur(I)} node ${P+1} `})].join(` `),D=l.map((z,P)=>{return``}).join(` -`),X=f.map((z)=>{let P=l.indexOf(String(z.nodeId||""));if(P<0)return"";let k=114+mA(z,t,c,y),I=Math.max(2,nL(z,t,c,y)),b=LS(z.status),d=G(P)-3.5,g=z.live?``:"",x=I>=28?`${ef(String(z.status||"working"))} - ${ef(Dr(z.durationMs))}`:"";return` +`),X=f.map((z)=>{let P=l.indexOf(String(z.nodeId||""));if(P<0)return"";let k=114+XA(z,t,c,y),I=Math.max(2,FL(z,t,c,y)),b=PS(z.status),d=G(P)-3.5,s=z.live?``:"",h=I>=28?`${ur(String(z.status||"working"))} + ${ur(mr(z.durationMs))}`:"";return` - ${g} - ${x} + ${s} + ${h} `}).join(` -`),O=r.map((z)=>{let P=l.indexOf(String(z.nodeId||""));if(P<0)return"";let k=114+Nr(z,t,c,y);return KS(z,G(P),k)}).join(` -`),Y=n.map((z)=>{let P=H.get(String(z.targetMarkerId||""));if(!P)return"";let k=H.get(String(z.sourceMarkerId||"")),I=String(k?.nodeId||z.sourceNodeId||""),b=String(P.nodeId||z.targetNodeId||""),d=l.indexOf(I),g=l.indexOf(b);if(d<0||g<0)return"";let x=G(d)-24-128,lu=G(g)-24-128,cu=zy(y)?Vl(z.sourceY??z.y1)??(k?Nr(k,t,c,y):Nr(P,t,c,y)):k?Nr(k,t,c,y):Nr(P,t,c,y),_u=zy(y)?Vl(z.targetY??z.y2)??Nr(P,t,c,y):Nr(P,t,c,y),Fu=pW(z),zu=String(z.action||"").toLowerCase()==="observe"?"3 4":"6 5",Wu=ef(tL(x,cu,lu,_u));return` - `}).join(` +`),O=r.map((z)=>{let P=l.indexOf(String(z.nodeId||""));if(P<0)return"";let k=114+Qr(z,t,c,y);return MS(z,G(P),k)}).join(` +`),Y=n.map((z)=>{let P=H.get(String(z.targetMarkerId||""));if(!P)return"";let k=H.get(String(z.sourceMarkerId||"")),I=String(k?.nodeId||z.sourceNodeId||""),b=String(P.nodeId||z.targetNodeId||""),d=l.indexOf(I),s=l.indexOf(b);if(d<0||s<0)return"";let h=G(d)-24-128,lu=G(s)-24-128,cu=Oy(y)?pl(z.sourceY??z.y1)??(k?Qr(k,t,c,y):Qr(P,t,c,y)):k?Qr(k,t,c,y):Qr(P,t,c,y),_u=Oy(y)?pl(z.targetY??z.y2)??Qr(P,t,c,y):Qr(P,t,c,y),Fu=hW(z),zu=String(z.action||"").toLowerCase()==="observe"?"3 4":"6 5",Wu=ur(JL(h,cu,lu,_u));return` + `}).join(` `),p=l.length===0?'No visible Gantt nodes':"";return{svg:` - ${V} + ${m} - ${ef(u.title||"Pipeline Epoch Gantt")} - ${ef(Z)} + ${ur(u.title||"Pipeline Epoch Gantt")} + ${ur(Z)} ${B} ${D} @@ -286,4 +289,4 @@ html,body{width:${r}px!important;min-height:${n}px!important;overflow:hidden!imp ${Y} ${O} ${p} - `,width:W,height:L}}function BA(u,l){let f=URL.createObjectURL(u),r=document.createElement("a");r.href=f,r.download=l,r.click(),setTimeout(()=>URL.revokeObjectURL(f),1000)}async function dW(u,l){let f=oW(l,"pipeline"),{svg:r,width:n,height:i}=WS(u,l),t=new Blob([r],{type:"image/svg+xml;charset=utf-8"}),y=URL.createObjectURL(t);try{let c=new Image;await new Promise((F,J)=>{c.onload=()=>F(),c.onerror=()=>J(Error("svg image load failed")),c.src=y});let $=document.createElement("canvas");$.width=n,$.height=i;let A=$.getContext("2d");if(!A)throw Error("canvas unavailable");A.drawImage(c,0,0);let j=await new Promise((F)=>$.toBlob(F,"image/png"));if(!j)throw Error("png export failed");BA(j,`${f}.png`)}catch{BA(t,`${f}.svg`)}finally{URL.revokeObjectURL(y)}}async function zS(u){let l=oW(String(u?.title||"pipeline-gantt"),"pipeline-gantt"),{svg:f,width:r,height:n}=GS(u),i=new Blob([f],{type:"image/svg+xml;charset=utf-8"}),t=URL.createObjectURL(i);try{let y=new Image;await new Promise((j,F)=>{y.onload=()=>j(),y.onerror=()=>F(Error("gantt svg image load failed")),y.src=t});let c=document.createElement("canvas");c.width=r,c.height=n;let $=c.getContext("2d");if(!$)throw Error("canvas unavailable");$.drawImage(y,0,0);let A=await new Promise((j)=>c.toBlob(j,"image/png"));if(!A)throw Error("gantt png export failed");BA(A,`${l}.png`)}catch{BA(i,`${l}.svg`)}finally{URL.revokeObjectURL(t)}}async function ES(u){for(let l of u){if(l.flow.nodes.length===0)continue;await dW(l.flow,l.title),await new Promise((f)=>setTimeout(f,750))}}function SW(u,l){return u.find((f)=>String(f?.pipelineId||"")===l)||null}function XW(u){return su(u?.startedAt)??su(u?.artifact?.startedAt)??su(u?.request?.createdAt)??su(u?.updatedAt)??0}function OS(u,l){return u.filter((f)=>String(f?.pipelineId||"")===l).slice().sort((f,r)=>XW(f)-XW(r)||String(f?.runId||"").localeCompare(String(r?.runId||"")))}function v9(u,l){let f=String(l?.runId||""),r=u.findIndex((t)=>String(t?.runId||"")===f),n=r>=0?r+1:u.length,i=String(l?.status||"--");return`Epoch ${n} / ${f||"--"} / ${i}`}function pr(u){return String(u?.procedureRunId||u?.runId||"")}function pA(u,l){let f=String(u?.nodeId||u?.request?.nodeId||"");if(f)return f;let r=pr(u),n=`${l}__`;if(r.startsWith(n))return r.slice(n.length).replace(/__\d+$/u,"");return""}function LA(u,l){let f=pu(u?.artifact)?u.artifact:{},r=pu(u?.request)?u.request:{};return kc(u?.startedAt,f.startedAt,r.createdAt,r.startedAt,u?.createdAt,u?.updatedAt,l?.startedAt,l?.request?.createdAt)}function TA(u,l){let f=String(u?.status?.status||u?.artifact?.status||u?.status||"").toLowerCase(),r=pu(u?.artifact)?u.artifact:{},n=s9(f);return kc(u?.finishedAt,r.finishedAt,u?.completedAt,n?u?.updatedAt:void 0,n?r.updatedAt:void 0,n?l?.updatedAt:void 0)}function eW(u,l,f=Date.now()){let r=String(u?.runId||""),n=new Set(l.map((i)=>String(i?.id||"")).filter(Boolean));return Du(u?.procedureRuns).flatMap((i)=>{let t=pA(i,r);if(!t)return[];let y=String(i?.status?.status||i?.artifact?.status||i?.status||"unknown").toLowerCase(),c=LA(i,u),$=su(c);if($===null)return[];let A=TA(i,u),j=su(A)??(s9(y)?su(i?.updatedAt)??$+1000:f),F=Math.max($+1000,j);return[{nodeId:t,knownNode:n.has(t),procedureRunId:pr(i),status:y,startMs:$,endMs:F,startedAt:xc($),finishedAt:xc(F),durationMs:F-$,runId:r,raw:i}]}).sort((i,t)=>i.startMs-t.startMs||i.endMs-t.endMs||i.nodeId.localeCompare(t.nodeId))}function ZS(u,l,f=[]){let r=l.map((A)=>Number(A.startMs)).filter(Number.isFinite),n=l.map((A)=>Number(A.endMs)).filter(Number.isFinite);for(let A of f){let j=Vl(A?.eventMs??A?.ms);if(j!==null)r.push(j),n.push(j)}let i=su(u?.startedAt)??su(u?.artifact?.startedAt)??su(u?.request?.createdAt),t=su(u?.finishedAt)??su(u?.artifact?.finishedAt)??su(u?.updatedAt);if(i!==null)r.push(i);if(t!==null)n.push(t);let y=Date.now(),c=r.length>0?Math.min(...r):y-60000,$=Math.max(c+60000,n.length>0?Math.max(...n):y);return{startMs:c,endMs:$,durationMs:$-c}}var KA=12,uL=20,k9=100,HS=!1;function d0(u){let l=Number(u);if(!Number.isFinite(l))return 0;return Math.max(0,Math.min(100,Math.round(l*100)/100))}function BS(u){let l=Math.max(KA,Number(u||KA)),f=Math.log(l/KA)/Math.log(uL);return d0(f*100)}var vc=BS(k9);function l7(u){let l=d0(u)/100,f=KA*Math.pow(uL,l),r=l<0.24?"全局":l<0.64?"均衡":"细节";return{value:d0(l*100),pxPerMinute:f,label:r}}function P9(u){let l=Math.round(Number(u));return Math.abs(l-k9)<=1?k9:l}function mS(u,l=vc){let f=Math.max(1,Number(u.durationMs||0)/60000),r=l7(l);return Math.round(Math.max(360,Math.min(7200,f*Number(r.pxPerMinute||48))))}function VS(u,l=7){let f=Math.max(1,Number(u.endMs||0)-Number(u.startMs||0));return Array.from({length:l},(r,n)=>{let i=l===1?0:n/(l-1);return{ms:Number(u.startMs)+f*i,percent:i*100}})}function DS(u,l){let f=Math.max(1,Number(l.endMs)-Number(l.startMs));return Math.max(0,Math.min(100,(u-Number(l.startMs))/f*100))}function Vl(u){let l=Number(u);return Number.isFinite(l)?l:null}function f7(u){return MW(u?.status)&&!s9(u?.status)}function lL(u,l,f,r){let n=Math.max(1,f-l),i=Math.max(0,Math.min(1,(u-l)/n));return Number((i*r).toFixed(3))}function YW(u,l){if(!l)return null;let f=Vl(l?.startMs),r=Vl(l?.endMs),n=Vl(l?.chartHeight);if(f===null||r===null||n===null)return null;return lL(u,f,r,n)}function fL(u,l){let f=Vl(u?.rawStartMs??u?.startMs)??Vl(u?.startMs)??l,r=Vl(u?.endMs)??f+1000;if(!f7(u))return Math.max(f+1000,r);return Math.max(f+1000,r,l)}function pS(u,l,f,r){let n=Vl(u?.startMs)??r-60000,i=Vl(u?.endMs)??r,t=f.reduce((Q,W)=>Math.max(Q,fL(W,r)),i),y=Math.max(n+60000,i,t),c=Math.max(1,y-n),$={startMs:n,endMs:y,durationMs:c},A=mS($,l),j=l7(l),F=Math.max(5,Math.min(18,Math.round(A/150))),J=VS($,F).map((Q)=>{let W=Number(Q.ms),L=lL(W,n,y,A);return{...Q,y:L,timestamp:xc(W),offsetMs:W-n}});return{source:"frontend-y",startMs:n,endMs:y,durationMs:c,chartHeight:A,scale:d0(l),normalizedScale:Number((d0(l)/100).toFixed(3)),pxPerMinute:Number(Number(j.pxPerMinute||0).toFixed(3)),ticks:J}}function SS(u,l,f){if(!f7(u))return u;let r=Vl(u?.rawStartMs??u?.startMs)??Vl(u?.startMs)??f,n=fL(u,f),i=YW(r,l),t=YW(n,l),y=Vl(i??u?.y1??u?.startY)??0,c=Vl(t??u?.y2??u?.endY)??y+10,$=Math.max(24,c-y);return{...u,live:!0,startMs:r,endMs:n,durationMs:Math.max(1000,n-r),finishedAt:xc(n),y1:y,y2:c,startY:y,endY:c,height:$}}function r7(u,l,f){return DS(u,l)/100*f}function zy(u){return Boolean(u&&String(u?.source||"")!=="frontend-y")}function rL(u,l,f,r,n){if(zy(r))for(let t of n){let y=Vl(u?.[t]);if(y!==null)return y}let i=Vl(u?.ms??u?.eventMs??u?.startMs);return r7(i??Number(l.startMs),l,f)}function mA(u,l,f,r){return rL(u,l,f,r,["y1","startY"])}function I9(u,l,f,r){if(zy(r)){let i=Vl(u?.y2??u?.endY);if(i!==null)return i}let n=Vl(u?.endMs)??Number(l.endMs);return r7(n,l,f)}function nL(u,l,f,r){if(zy(r)){let i=Vl(u?.height);if(i!==null)return Math.max(1,i)}let n=u?.live?24:10;return Math.max(n,I9(u,l,f,r)-mA(u,l,f,r))}function Nr(u,l,f,r){return rL(u,l,f,r,["y","timeAxisY"])}function iL(u,l,f,r){if(zy(r)||String(r?.source||"")==="frontend-y"){let t=Vl(u?.y);if(t!==null)return t}let n=Vl(u?.percent);if(n!==null)return n/100*f;let i=Vl(u?.ms)??Number(l.startMs);return r7(i,l,f)}function XS(u){let l=String(u?.promptEvent||u?.raw?.promptEvent||u?.event||"").toLowerCase();if(!["node-long-running-observation","node-finished"].includes(l))return"";let f=String(u?.sourceNodeId||u?.raw?.sourceNodeId||u?.raw?.detail?.nodeId||""),r=String(u?.nodeId||u?.targetNodeId||"");return f&&f!==r?f:""}function YS(u,l){let f=new Set(l.map((n)=>[String(n.sourceNodeId||""),String(n.targetNodeId||""),String(n.targetMarkerId||""),String(n.action||"")].join(":"))),r=[...l];for(let n of u){let i=XS(n),t=String(n?.nodeId||""),y=String(n?.id||"");if(!i||!t||!y)continue;let c=[i,t,y,"observe"].join(":");if(f.has(c))continue;f.add(c),r.push({id:`observation-arrow:${y}:${i}:${t}`,commandId:String(n?.commandId||n?.eventId||y),sourceNodeId:i,targetNodeId:t,sourceMarkerId:"",targetMarkerId:y,sourceKind:"monitor",action:"observe",status:"observation"})}return{markers:u,arrows:r}}function PS(u){let l=un(u),f=String(u?.promptEvent||"");if(l==="initial-prompt-delivered")return"initial";if(f==="node-finished"||f==="node-long-running-observation"||f.startsWith("monitor-"))return"monitor";if(l==="monitor-prompt-delivered"||String(u?.sourceKind||"").toLowerCase()==="monitor")return"monitor";return"append"}function CS(u){return Du(u?.tags||u?.raw?.tags).map((l)=>String(l||"")).filter(Boolean)}function MS(u){let l=un(u),f=String(u?.promptEvent||"");if(l==="initial-prompt-delivered")return"初始 prompt";if(f==="node-long-running-observation")return"长任务观察";if(f==="node-finished")return CS(u).includes("monitor.audit")?"节点完成 / OA 审核":"节点完成";if(f==="monitor-interval")return"Monitor observation";if(f==="monitor-start")return"Monitor start";if(f==="monitor-stop")return"Monitor stop";if(l==="monitor-prompt-delivered")return"Monitor prompt";if(l==="append-prompt-queued")return"追加 prompt 已排队";return"追加 prompt"}function PW(u){let l=un(u);if(l==="control-command-applied")return 3;if(l==="control-command-ignored")return 2;if(l==="control-command-queued")return 1;return 0}function RS(u,l){let f=String(u?.commandId||"");if(f)return`command:${f}`;return["control-event",Ty(u)||kc(u?.createdAt,u?.timestamp)||`index-${l}`,String(u?.sourceKind||""),String(u?.sourceNodeId||""),String(u?.targetNodeId||""),oi(u)].join(":")}function hS(u){return x9([u?.targetNodeId,...Du(u?.resetNodeIds)])}function xS(u,l){let f=Rc(u),r=un(u),n=String(u?.targetNodeId||""),i=Boolean(n)&&l!==n;if(r==="control-command-applied")return i?`${f} 波及`:`${f} 生效`;if(r==="control-command-ignored")return`${f} 忽略`;if(r==="control-command-queued")return`${f} 已发起`;return i?`${f} 波及`:f}function bS(u){if(un(u)==="control-command-ignored")return"ignored";let f=oi(u);if(f==="restart"||f==="redo")return"restart";if(f==="modify")return"modify";if(f==="approve")return"approve";if(f==="guide")return"guide";return"pending"}function vS(u){let l=String(u?.sourceKind||"").toLowerCase();if(l==="monitor")return"monitor";if(l==="webui")return"webui";if(l==="cli")return"cli";return"system"}function kS(u,l,f,r){let n=u.filter(($)=>String($.nodeId||"")===l).sort(($,A)=>Number($.startMs)-Number(A.startMs)),i=n.find(($)=>f>=Number($.startMs)-1000&&f<=Number($.endMs)+1000);if(i)return{ms:f,onInterval:!0,snapReason:"inside-interval",procedureRunId:String(i.procedureRunId||"")};let t=oi(r),y=n.slice().reverse().find(($)=>Number($.endMs)<=f+1000);if(y&&t==="approve")return{ms:Number(y.endMs),onInterval:!0,snapReason:"previous-interval-end",procedureRunId:String(y.procedureRunId||"")};let c=n.find(($)=>Number($.startMs)>=f-1000);if(c&&["guide","modify","restart","redo"].includes(t))return{ms:Number(c.startMs),onInterval:!0,snapReason:"next-interval-start",procedureRunId:String(c.procedureRunId||"")};return{ms:f,onInterval:!1,snapReason:"event-time",procedureRunId:String(r?.procedureRunId||"")}}function tL(u,l,f,r){let n=Math.hypot(f-u,r-l),i=n>WW?WW:0,t=i>0?f-(f-u)/n*i:f,y=i>0?r-(r-l)/n*i:r,c=t-u,$=Math.max(16,Math.min(42,Math.abs(c)*0.45+12)),A=c===0?1:Math.sign(c);return`M ${u},${l} C ${u+A*$},${l} ${t-A*$},${y} ${t},${y}`}function IS(u,l){let f=String(u?.runId||l?.runId||""),r=eW({...pu(l)?l:{},...pu(u)?u:{},runId:f,procedureRuns:Du(u?.procedureRuns).length>0?u.procedureRuns:l?.procedureRuns},[]),n=[],i=[],t=[],y=new Set,c=new Map,$=(F,J)=>{if(!F.nodeId||!Number.isFinite(Number(F.ms)))return;if(y.has(F.id))return;y.add(F.id),J.push(F)};for(let F of Du(u?.procedureRuns)){let J=pA(F,f),Q=pr(F);if(!J)continue;for(let W of Du(F?.attempts)){let L=DA(W);for(let U of h9(W?.controlEventRecords)){let q=un(U);if(!["initial-prompt-delivered","append-prompt-delivered","monitor-prompt-delivered"].includes(q))continue;let N=Ty(U),w=su(N);if(w===null)continue;let G=String(U?.eventId||"");$({id:`prompt:${G||`${Q}:${L}:${q}:${w}`}`,runId:f,nodeId:J,procedureRunId:Q,attempt:L,kind:"prompt",tone:PS(U),status:"delivered",label:MS(U),ms:w,timestampIso:N,sourceKind:String(U?.sourceKind||""),sourceNodeId:String(U?.sourceNodeId||""),targetNodeId:J,action:"",eventId:G,commandId:String(U?.commandId||""),raw:U},n)}}}let A=new Map;h9(u?.controlEvents).forEach((F,J)=>{let Q=RS(F,J),W=A.get(Q)||{key:Q,events:[]};W.events.push(F),A.set(Q,W)});for(let F of A.values()){let J=Du(F.events).slice().sort((B,D)=>PW(D)-PW(B)),Q=Du(F.events).find((B)=>un(B)==="control-command-queued")||null,W=J[0]||Q;if(!Q&&!W)continue;let L=String(Q?.sourceNodeId||W?.sourceNodeId||""),U=String(Q?.sourceKind||W?.sourceKind||""),q=Ty(Q)||Ty(W)||kc(Q?.createdAt,W?.createdAt),N=su(q),w=String(W?.commandId||Q?.commandId||F.key),G=(un(W)||"control-command-queued").replace(/^control-command-/u,""),Z="";if(L&&N!==null)Z=`control-source:${w}:${L}`,c.set(w,Z),$({id:Z,runId:f,nodeId:L,procedureRunId:String(Q?.procedureRunId||W?.procedureRunId||""),attempt:"",kind:"control-source",tone:vS(Q||W),status:G,label:`${Rc(Q||W)} 发起`,ms:N,timestampIso:q,action:oi(Q||W),sourceKind:U,sourceNodeId:L,targetNodeId:String(W?.targetNodeId||Q?.targetNodeId||""),commandId:w,raw:Q||W},i);let H=W||Q,E=Ty(H)||q,V=su(E);if(V===null)continue;let S=hS(H);for(let B of S){let D=kS(r,B,V,H),X=`control-target:${w}:${B}`;if($({id:X,runId:f,nodeId:B,procedureRunId:D.procedureRunId,attempt:"",kind:"control-target",tone:bS(H),status:G,label:xS(H,B),ms:D.ms,eventMs:V,onInterval:D.onInterval,snapReason:D.snapReason,snapped:Number(D.ms)!==V,timestampIso:E,renderedTimestampIso:xc(Number(D.ms)),action:oi(H),sourceKind:U,sourceNodeId:L,targetNodeId:B,commandId:w,raw:H},i),Z&&L&&L!==B)t.push({id:`control-arrow:${w}:${L}:${B}`,commandId:w,sourceNodeId:L,targetNodeId:B,sourceMarkerId:Z,targetMarkerId:X,sourceKind:U,action:oi(H),status:G})}}let j=[...n,...i].sort((F,J)=>Number(F.ms)-Number(J.ms)||String(F.nodeId).localeCompare(String(J.nodeId))||String(F.id).localeCompare(String(J.id)));return{...YS(j,t),sourceMarkerByCommand:c}}function gS({details:u,selectedNodeId:l,selectedNodeRuntime:f,control:r,onRaw:n}){if(!u)return K("span",{className:"muted"},"点击“抓取过程”读取 node 运行材料;主界面只显示结构化摘要,完整内容需点开原始 JSON。");let i=Du(u.procedureRuns),t=i.at(-1)||{},y=Du(t.attempts),c=y.at(-1)||{},$=Du(t.workerLogTail),A=Du(c.controlEventsTail),j=Du(c.controlPromptsTail),F=Du(c.monitorPromptsTail),J=p9(A),Q=p9(j),W=p9(F),L=c.opencodeMessages||{};return K("div",{className:"pipeline-evidence-list compact"},K(Vr,{title:"Node runtime",subtitle:l||"--",facts:[`status ${f?.status||"pending"}`,`attempts ${f?.attempts??y.length}`,`procedure ${f?.currentProcedureRunId||pr(t)||"--"}`,r.fetchedAt?`fetched ${yl(r.fetchedAt)}`:"not fetched"],data:u.node||u,onRaw:n,testId:"raw-pipeline-node-runtime"}),K(Vr,{title:"Procedure runs",subtitle:`${i.length} groups`,facts:[`latest ${t.status?.status||t.status||"--"}`,`steps ${Du(t.recentSteps).length}`,`duration ${Dr(su(t.finishedAt)&&su(t.startedAt)?Number(su(t.finishedAt))-Number(su(t.startedAt)):t.durationMs)}`],data:i,onRaw:n,testId:"raw-pipeline-node-procedures"}),K(Vr,{title:"OpenCode messages",subtitle:String(L.exists?"available":"not indexed"),facts:[`messages ${zA(L.messageCount)}`,`size ${zA(L.size)}`,`updated ${wu(L.updatedAt)}`],data:L,onRaw:n,testId:"raw-pipeline-node-messages"}),K(Vr,{title:"Control prompts",subtitle:"manual / monitor append queues",facts:[`manual tail ${Q.total}`,`monitor tail ${W.total}`,`last ${wu(g9(Q.lastAt,W.lastAt))}`],data:{controlPromptsTail:j,monitorPromptsTail:F},onRaw:n,testId:"raw-pipeline-node-prompts"}),K(Vr,{title:"Control events",subtitle:J.eventKinds.length>0?J.eventKinds.join(", "):"event tail",facts:[`tail ${J.total}`,`parsed ${J.parsed}`,`last ${wu(J.lastAt)}`],data:A,onRaw:n,testId:"raw-pipeline-node-events"}),K(Vr,{title:"Worker log",subtitle:"tail is hidden on main canvas",facts:[`tail ${$.length} lines`,"raw only via button",`procedure ${pr(t)||"--"}`],data:$,onRaw:n,testId:"raw-pipeline-node-worker-log"}))}function sS({activeRun:u,onRaw:l}){if(!u)return K(qr,{title:"暂无运行材料",text:"没有 Pipeline epoch 时不会展示运行材料索引。"});let f=Du(u.nodes),r=Du(u.procedureRuns),n=Du(u.submissions),i=Du(u.workerLogTail),t=KW(f),y=KW(r),c=r.filter((A)=>String(A?.status||"").toLowerCase()==="failed"),$=g9(...r.flatMap((A)=>[A.updatedAt,A.finishedAt,A.startedAt]));return K("div",{className:"pipeline-evidence-list"},K(Vr,{title:"Epoch overview",subtitle:u.runId||"--",facts:[`pipeline ${u.pipelineId||"--"}`,`status ${u.status||"--"}`,`started ${wu(u.startedAt)}`,`updated ${wu(u.updatedAt)}`],data:u,onRaw:l,testId:"raw-pipeline-run"}),K(Vr,{title:"Node states",subtitle:`${f.length} nodes`,facts:[`running ${t.running||0}`,`succeeded ${t.succeeded||0}`,`failed ${t.failed||0}`,`pending ${t.pending||0}`],data:f,onRaw:l,testId:"raw-pipeline-run-nodes"}),K(Vr,{title:"Procedure run index",subtitle:`${r.length} procedure records`,facts:[`succeeded ${y.succeeded||0}`,`failed ${y.failed||0}`,`latest ${wu($)}`,`errors ${c.length}`],data:r,onRaw:l,testId:"raw-pipeline-run-procedures"}),K(Vr,{title:"OA submissions",subtitle:`${n.length} submission files`,facts:[`records ${n.length}`,`task ${zA(u.task)}`,"raw grouped by run"],data:n,onRaw:l,testId:"raw-pipeline-run-submissions"}),K(Vr,{title:"Worker log tail",subtitle:"hidden from main interface",facts:[`tail ${i.length} lines`,"display raw only after click",`updated ${wu(u.updatedAt)}`],data:i,onRaw:l,testId:"raw-pipeline-run-worker-log"}))}function aS({diagnostics:u,onRaw:l}){let f=Du(u?.runs).filter(pu),r=Du(u?.forbiddenResiduals),n=pu(u?.guarantees)?u.guarantees:{},i=u?.hasNeutralNodeFinishedEvidence===!0&&u?.hasNoAuditPolicyEvidence===!0&&u?.hasAuditPolicyEvidence===!0,t=u?.ok===!0&&i&&r.length===0,y=f[0]||null,c=[{label:"中性完成事实",ok:n.neutralNodeFinished===!0,hint:"node-finished 不携带流程策略"},{label:"Config 策略判定",ok:n.auditPolicyFromConfig===!0,hint:"OA backend 读取当前 epoch 配置"},{label:"控制命令来自 OA",ok:n.runnerConsumesControlCommandsFromOaEvents===!0,hint:"runner 只消费 OA control.command"},{label:"无独立审核事件",ok:n.noIndependentAuditRequestEvent===!0,hint:"审核由 node-finished + policy 派生"},{label:"无批次门禁",ok:n.noBatchFinishedControlGate===!0,hint:"下游启动由每个 node 完成驱动"}];return K("div",{className:"pipeline-oa-panel","data-testid":"pipeline-oa-event-flow-panel"},K("div",{className:"metric-grid compact"},K(Yf,{label:"OA Flow",value:t?"100%":"--",hint:String(u?.mode||"waiting diagnostics"),tone:t?"ok":"warn"}),K(Yf,{label:"禁止残留",value:r.length,hint:r.length===0?"source scan clean":"needs cleanup",tone:r.length===0?"ok":"warn"}),K(Yf,{label:"No-audit",value:u?.hasNoAuditPolicyEvidence?"OK":"--",hint:"OA 下游策略证据",tone:u?.hasNoAuditPolicyEvidence?"ok":"warn"}),K(Yf,{label:"Monitor 审核",value:u?.hasAuditPolicyEvidence?"OK":"--",hint:"OA 控制事件闭环",tone:u?.hasAuditPolicyEvidence?"ok":"warn"})),K("div",{className:"pipeline-oa-guarantees"},c.map(($)=>K("article",{key:$.label,className:`pipeline-oa-guarantee ${$.ok?"ok":"warn"}`},K(o0,{status:$.ok?"online":"warn"},$.ok?"OK":"MISS"),K("div",null,K("strong",null,$.label),K("span",null,$.hint))))),K("div",{className:"pipeline-evidence-list compact"},f.slice(0,6).map(($)=>K(Vr,{key:$.runId,title:String($.runId||"--"),subtitle:[Number($.monitorAuditNodeFinishedCount||0)>0?"monitor audit":"",Number($.noAuditPolicyCount||0)>0?"no-audit policy":""].filter(Boolean).join(" / ")||"event evidence",facts:[`events ${$.eventCount||0}`,`node-finished ${$.nodeFinishedCount||0}`,`policy-in-detail ${$.nodeFinishedWithPolicyCount||0}`,`queued ${$.controlQueuedCount||0}`,`applied ${$.controlAppliedCount||0}`],data:$,onRaw:l,testId:`raw-pipeline-oa-run-${String($.runId||"run").replace(/[^a-zA-Z0-9_.-]+/g,"-")}`}))),y?K("p",{className:"muted paragraph"},`最新证据 ${y.runId}: ${y.nodeFinishedCount||0} 个 node-finished,${y.controlAppliedCount||0} 个控制结果。`):K(qr,{title:"暂无 OA 事件流证据",text:"等待 Pipeline backend 暴露 diagnostics。"}),u?K("div",{className:"panel-actions inline-actions"},K(ln,{title:"Pipeline OA Event Flow Diagnostics",data:u,onOpen:l,testId:"raw-pipeline-oa-event-flow"})):null)}function oS({quota:u,onRaw:l}){let f=pu(u?.summary)?u.summary:{},r=pu(u?.target)?u.target:{},n=pu(u?.cache)?u.cache:{},i=u?.ok===!0,t=String(u?.modelId||f.modelName||r.modelName||"MiniMax-M2.7"),y=f.totalCount??r.currentIntervalTotalCount,c=f.usageCount??r.currentIntervalUsageCount,$=f.remainingCount??r.currentIntervalRemainingCount,A=f.remainingRatio??(Number.isFinite(Number(y))&&Number(y)>0&&Number.isFinite(Number($))?Number($)/Number(y):void 0),j=f.usageRatio??(Number.isFinite(Number(y))&&Number(y)>0&&Number.isFinite(Number(c))?Number(c)/Number(y):void 0),F=f.resetAt||r.endAt,J=f.remainsMs??r.remainsMs,Q=Number($),W=!i||Number.isFinite(Q)&&Q<=0?"warn":"ok",L=[i?`endpoint ${u?.endpoint||"--"}`:"quota unavailable",`fetched ${GA(u?.fetchedAt)}`,n.hit?`cache ${Dr(n.ageMs)}`:"live quota"];return K("div",{className:"pipeline-minimax-quota-panel","data-testid":"pipeline-minimax-quota-panel"},K("div",{className:"metric-grid compact"},K(Yf,{label:"MiniMax",value:i?t:"--",hint:u?.modelComponent||u?.error||"model/minimax-m27",tone:W}),K(Yf,{label:"当前窗口",value:`${D9(c)}/${D9(y)}`,hint:`已用 ${TW(j)}`,tone:W}),K(Yf,{label:"剩余额度",value:D9($),hint:`剩余 ${TW(A)}`,tone:W}),K(Yf,{label:"重置时间",value:GA(F),hint:J!==void 0?`约 ${Dr(J)}`:wu(F),tone:W})),K(a9,{items:L}),i?K("p",{className:"muted paragraph"},`MiniMax 限额来自 D601 Pipeline 后端实时查询;当前模型匹配 ${f.modelName||r.modelName||t}。`):K(nl,{error:u?.error||"MiniMax 限额查询失败"}),u?K("div",{className:"panel-actions inline-actions"},K(ln,{title:"Pipeline MiniMax Quota",data:u,onOpen:l,testId:"raw-pipeline-minimax-quota"})):null)}function dS({epochs:u,activeRun:l,activePipeline:f,pipelineNodes:r,pipelineEdges:n,runDetails:i,nodeDetails:t,nodeDetailsState:y,ganttScale:c=vc,onGanttScaleChange:$,onRunChange:A,onIntervalSelect:j,onMarkerSelect:F,selection:J,detailOpen:Q,onDetailOpenChange:W,onRaw:L}){let[U,q]=df(HS),[N,w]=df({startY:0,endY:0,startMs:0,endMs:0}),[G,Z]=df(Date.now()),H=s0(null),E=String(l?.runId||""),V=Boolean(Q),S=(Au)=>{if(typeof W==="function")W(Au)},B=d0(c??vc),D=String(i?.runId||"")===E?i?.details:null,X=D?{...pu(l)?l:{},...pu(D)?D:{},runId:E,procedureRuns:Du(D?.procedureRuns).length>0?D.procedureRuns:l?.procedureRuns}:l,O=eW(X,r,G),Y=D?IS(D,X):{markers:[],arrows:[]},p=Du(Y.markers),v=ZS(X,O,p),z=pS(v,B,O,G),P=String(z.source||"frontend-y"),k=O.map((Au)=>SS(Au,z,G)),I={startMs:Number(z.startMs),endMs:Number(z.endMs),durationMs:Math.max(1,Number(z.durationMs??Number(z.endMs)-Number(z.startMs)))},b=l7(B),d={...b,pxPerMinute:Number(z.pxPerMinute??b.pxPerMinute)},g=Math.round(Number(z.chartHeight||360)),x=O.some(f7);Ln(()=>{if(!E||!x)return;let Au=window.setInterval(()=>Z(Date.now()),1000);return()=>window.clearInterval(Au)},[E,x]);let lu=qS(f,r,Array.isArray(n)?n:[]),cu=r.map((Au)=>String(Au?.id||"")).filter(Boolean),_u=k.map((Au)=>String(Au.nodeId||"")).filter(Boolean),Fu=p.map((Au)=>String(Au.nodeId||"")).filter(Boolean),zu=Array.from(new Set([...lu,...cu,..._u,...Fu])),Wu={startY:0,endY:g,startMs:Number(I.startMs),endMs:Number(I.endMs)},C=Number(N?.endY||0)>0?N:Wu,e=(Au)=>{return mA(Au,I,g,z)<=Number(C.endY)&&I9(Au,I,g,z)>=Number(C.startY)},uu=(Au)=>{let au=Nr(Au,I,g,z);return au>=Number(C.startY)&&au<=Number(C.endY)},Gu=new Set(zu.filter((Au)=>k.some((au)=>au.nodeId===Au&&e(au))||p.some((au)=>au.nodeId===Au&&uu(au)))),s=U?zu.filter((Au)=>Gu.has(Au)):zu,qu=`${m9}px ${s.length>0?s.map(()=>`${wn}px`).join(" "):"minmax(160px, 1fr)"}`,Zu=Du(z.ticks).filter(pu),Bu=String(J?.mode==="interval"?J?.interval?.procedureRunId||"":""),Iu=String(J?.mode==="event"?J?.marker?.id||"":""),ll=()=>{let Au=H.current;if(!Au){w(Wu);return}let au=Math.max(0,Au.scrollTop-V9),Qf=Math.max(120,Au.clientHeight-V9),Yu=Math.min(g,au+Qf),cf={startY:au,endY:Yu,startMs:Number(I.startMs),endMs:Number(I.endMs)},_f=Math.max(0,Math.min(1,au/g)),fr=Math.max(_f,Math.min(1,Yu/g)),$f=Math.max(1,Number(I.endMs)-Number(I.startMs));cf.startMs=Number(I.startMs)+$f*_f,cf.endMs=Number(I.startMs)+$f*fr,w(cf)};Ln(()=>{let Au=H.current,au=window.setTimeout(ll,0);return Au?.addEventListener("scroll",ll),window.addEventListener("resize",ll),()=>{window.clearTimeout(au),Au?.removeEventListener("scroll",ll),window.removeEventListener("resize",ll)}},[E,I.startMs,I.endMs,g]);let Pu=Math.max(0,zu.length-s.length),Jl=new Set(p.filter((Au)=>s.includes(String(Au.nodeId||""))&&uu(Au)).map((Au)=>String(Au.id))),Jf=new Map(p.map((Au)=>[String(Au.id),Au])),Of=Du(Y.arrows).filter((Au)=>{if(!Jl.has(String(Au.targetMarkerId||"")))return!1;if(String(Au.action||"")==="observe")return s.includes(String(Au.sourceNodeId||""));return Jl.has(String(Au.sourceMarkerId||""))}),yf=m9+Math.max(1,s.length)*wn,lf=(Au)=>{let au=d0(Au.target.value);if(typeof $==="function")$(au);window.setTimeout(ll,0)},Zf=()=>zS({title:`${f?.id||"pipeline"}-${E||"epoch"}-gantt`,meta:[`run ${E||"--"}`,`${wu(I.startMs)} -> ${wu(I.endMs)}`,`duration ${Dr(I.durationMs)}`,`${d.label} / ${P9(d.pxPerMinute)} px/min`,`${s.length}/${zu.length} nodes`,`${p.length} markers`],visibleNodeIds:s,intervals:k,markers:p.filter((Au)=>s.includes(String(Au.nodeId||""))),arrows:Of,ticks:Zu,bounds:I,chartHeight:g,backendLayout:z}),Pf=pu(D?.gantt?.diagnostics)?D.gantt.diagnostics:null;return K(Wn,{title:"Epoch 甘特图",eyebrow:`${f?.id||"pipeline"} / ${u.length} epochs`,className:"pipeline-wide-panel",loading:i?.loading,actions:K("div",{className:"pipeline-gantt-actions"},K("select",{value:E,disabled:u.length===0,onChange:(Au)=>A(Au.target.value),"data-testid":"pipeline-epoch-select"},u.map((Au)=>K("option",{key:Au.runId,value:Au.runId},v9(u,Au)))),K("label",{className:"pipeline-gantt-toggle"},K("input",{type:"checkbox","data-testid":"pipeline-gantt-auto-hide-idle",checked:U,onChange:(Au)=>{q(Boolean(Au.target.checked)),window.setTimeout(ll,0)}}),K("span",null,"自动隐藏空闲列")),K("label",{className:"pipeline-gantt-scale"},K("span",null,K("b",null,"时间尺度"),K("em",{"data-testid":"pipeline-gantt-scale-label"},`${d.label} · ${P9(d.pxPerMinute)} px/min`)),K("input",{type:"range",min:0,max:100,step:0.01,value:B,onChange:lf,"aria-label":"调整甘特图时间尺度","data-testid":"pipeline-gantt-time-scale"}),K("small",null,K("span",null,"全局"),K("span",null,"细节"))),l?K("button",{type:"button",className:"ghost-btn",onClick:Zf,disabled:s.length===0,"data-testid":"pipeline-export-gantt"},"导出甘特图"):null,l?K(ln,{title:`Pipeline Epoch ${l.runId}`,data:l,onOpen:L,testId:"raw-pipeline-epoch-gantt"}):null)},!l?K(qr,{title:"暂无 Epoch",text:"当前 pipeline 还没有完整运行记录。"}):k.length===0?K(qr,{title:"暂无时间区间",text:"等待 D601 Pipeline backend 在 procedure summary 中返回 startedAt / finishedAt。"}):K("div",{className:"pipeline-gantt-wrap"},K("div",{className:`pipeline-gantt-detail-layout ${V?"detail-open":"detail-collapsed"}`,"data-testid":"pipeline-gantt-detail-layout","data-sidebar-open":V?"true":"false"},K("div",{className:"pipeline-gantt-main"},K("div",{className:"pipeline-gantt-main-head"},K("div",{className:"pipeline-gantt-meta"},K("span",null,`time ${wu(I.startMs)} -> ${wu(I.endMs)}`),K("span",null,`duration ${Dr(I.durationMs)}`),K("span",null,`scale ${d.label} / ${P9(d.pxPerMinute)} px/min`),K("span",null,`layout ${P}`),Pf?K("span",null,`align ${Pf.timeAxisAlignmentOk===!1?"check":"ok"}`):null,K("span",null,`visible ${s.length}/${zu.length} nodes`),D?K("span",null,`markers ${p.length}`):null,U&&Pu>0?K("span",null,`hidden idle ${Pu}`):null),!V?K("button",{type:"button",className:"pipeline-sidecar-tab right",disabled:!J?.mode,onClick:()=>S(!0),"data-testid":"pipeline-gantt-sidebar-toggle"},J?.mode?"展开详情":"点击甘特图元素展开详情"):null),K("div",{className:"pipeline-gantt-viewport",ref:H,"data-testid":"pipeline-epoch-gantt","data-pipeline-id":f?.id||"","data-run-id":E,"data-layout-source":P,"data-start-ms":String(I.startMs),"data-end-ms":String(I.endMs),"data-chart-height":String(g)},K("div",{className:"pipeline-gantt-board",style:{gridTemplateColumns:qu,minWidth:`${yf}px`}},K("div",{className:"pipeline-gantt-head time"},"Time"),s.length===0?K("div",{className:"pipeline-gantt-head empty"},"当前时间窗无工作节点"):s.map((Au)=>K("div",{key:`head-${Au}`,className:"pipeline-gantt-head node",title:Au,"data-testid":"pipeline-gantt-head-node","data-node-id":Au},K(ep,{value:Au}))),K("div",{className:"pipeline-gantt-time-axis",style:{height:`${g}px`}},Zu.map((Au)=>{let au=iL(Au,I,g,z);return K("div",{key:`tick-${Au.ms}-${au}`,className:"pipeline-gantt-tick",style:{top:`${au}px`},"data-testid":"pipeline-gantt-tick","data-ms":String(Au.ms),"data-y":String(au)},K("b",null,wu(Au.ms)),K("span",null,`+${Dr(Number(Au.offsetMs??Number(Au.ms)-Number(I.startMs)))}`))})),s.length>0?K("svg",{className:"pipeline-gantt-arrow-layer",width:s.length*wn,height:g,viewBox:`0 0 ${s.length*wn} ${g}`,style:{left:`${m9}px`,top:`${V9}px`,width:`${s.length*wn}px`,height:`${g}px`},"aria-hidden":"true"},K("defs",null,K("marker",{id:"pipeline-gantt-arrowhead",viewBox:"0 0 10 10",refX:9,refY:5,markerWidth:6,markerHeight:6,orient:"auto-start-reverse"},K("path",{d:"M 0 0 L 10 5 L 0 10 z",fill:"context-stroke"}))),Of.map((Au)=>{let au=Jf.get(String(Au.targetMarkerId||""));if(!au)return null;let Qf=Jf.get(String(Au.sourceMarkerId||"")),Yu=String(Qf?.nodeId||Au.sourceNodeId||""),cf=s.indexOf(Yu),_f=s.indexOf(String(au.nodeId||""));if(cf<0||_f<0)return null;let fr=cf*wn+wn/2,$f=_f*wn+wn/2,Hf=Qf?Nr(Qf,I,g,z):Nr(au,I,g,z),Gn=Nr(au,I,g,z);return K("path",{key:Au.id,className:`pipeline-gantt-arrow ${String(Au.sourceKind||"").toLowerCase()} ${String(Au.status||"").toLowerCase()} ${String(Au.action||"").toLowerCase()}`,d:tL(fr,Hf,$f,Gn),markerEnd:"url(#pipeline-gantt-arrowhead)","data-testid":String(Au.action||"")==="observe"?"pipeline-gantt-observation-arrow":"pipeline-gantt-arrow","data-source-node-id":String(Au.sourceNodeId||""),"data-target-node-id":String(Au.targetNodeId||""),"data-target-marker-id":String(Au.targetMarkerId||""),"data-action":String(Au.action||""),"data-source-y":String(Hf),"data-target-y":String(Gn)})})):null,s.length===0?K("div",{className:"pipeline-gantt-empty-col",style:{height:`${g}px`}},"滚动到有活动的时间段后,相关 node 列会自动出现。"):s.map((Au)=>{let au=k.filter((Yu)=>Yu.nodeId===Au),Qf=p.filter((Yu)=>String(Yu.nodeId||"")===Au);return K("div",{key:`col-${Au}`,className:"pipeline-gantt-node-col",style:{height:`${g}px`}},au.map((Yu)=>{let cf=mA(Yu,I,g,z),_f=I9(Yu,I,g,z),fr=nL(Yu,I,g,z),$f=String(Yu.procedureRunId||`${Au}-${Yu.startMs}`);return K("button",{key:$f,type:"button",className:`pipeline-gantt-bar ${Yu.status} ${Yu.live?"live":""} ${Bu===$f?"selected":""}`,style:{top:`${cf}px`,height:`${fr}px`},title:`${Au} ${Yu.status} ${wu(Yu.startedAt||Yu.startMs)} -> ${wu(Yu.finishedAt||Yu.endMs)}`,onClick:()=>j(Yu),"data-testid":"pipeline-gantt-line","data-node-id":Au,"data-procedure-run-id":String(Yu.procedureRunId||""),"data-status":String(Yu.status||""),"data-live":Yu.live?"true":"false","data-start-ms":String(Yu.startMs||""),"data-end-ms":String(Yu.endMs||""),"data-y1":String(cf),"data-y2":String(_f),"data-natural-height":String(Math.max(0,_f-cf))},K("strong",null,Yu.status||"working"),K("span",null,Dr(Yu.durationMs)))}),Qf.map((Yu)=>K("button",{key:Yu.id,type:"button",className:`pipeline-gantt-marker ${Yu.kind} ${Yu.tone||""} ${Yu.status||""} ${Iu===String(Yu.id)?"selected":""}`,style:{top:`${Nr(Yu,I,g,z)}px`},title:`${Yu.label||"event"} / ${wu(Yu.timestampIso||Yu.timestamp||Yu.ms)}`,onClick:()=>F(Yu),"data-testid":Yu.kind==="prompt"?"pipeline-gantt-prompt-marker":"pipeline-gantt-control-marker","data-marker-id":String(Yu.id||""),"data-ms":String(Yu.ms??Yu.eventMs??""),"data-y":String(Nr(Yu,I,g,z))})))})))),V?K(dp,{selection:J,runDetails:i,nodeDetails:t,nodeDetailsState:y,onRaw:L,onCollapse:()=>S(!1)}):null)))}function sn(){return{loading:!1,actionLoading:"",error:"",message:"",details:null,fetchedAt:null,appendPrompt:"",guidePrompt:"",modifyPrompt:"",approveReason:"",redoReason:""}}function g0(){return{mode:"",runId:"",interval:null,marker:null}}function C9(){return{runId:"",loading:!1,error:"",details:null,fetchedAt:null}}function Pc(u,l){return`${u}/microservices/pipeline/proxy${l}`}function eS({activeRun:u,pipelineRuns:l,selectedRunId:f,onRunChange:r,selectedNodeId:n,selectedNodeConfig:i,selectedNodeRuntime:t,control:y,onControlChange:c,onFetch:$,onAction:A,onRaw:j,onCollapse:F}){let J=String(u?.runId||""),Q=String(t?.status||"pending"),W=!J||!n||y.loading||Boolean(y.actionLoading),L=(q)=>(N)=>c({[q]:N.target.value,error:"",message:""}),U=l.length>0?l:u?[u]:[];return K("aside",{className:"pipeline-node-control","data-testid":"pipeline-node-control"},K("div",{className:"pipeline-node-control-head"},K("div",null,K("p",{className:"panel-eyebrow"},"Manual Node Control"),K(rl,{title:n||"点击控制图中的 node",level:3,loading:y.loading||Boolean(y.actionLoading)})),K("div",{className:"pipeline-node-control-head-actions"},n?K(o0,{status:Q},Q):K(o0,{status:"pending"},"idle"),K("button",{type:"button",className:"ghost-btn mini",onClick:F,"data-testid":"pipeline-node-sidebar-collapse"},"收起"))),K("div",{className:"pipeline-control-runbar"},K("label",null,K("span",null,"目标 run"),K("select",{value:J||f,disabled:U.length===0,onChange:(q)=>r(q.target.value),"data-testid":"pipeline-node-run-select"},U.map((q)=>K("option",{key:q.runId,value:q.runId},`${q.runId||"--"} / ${q.status||"--"}`)))),K("button",{type:"button",className:"ghost-btn",disabled:W,onClick:$,"data-testid":"pipeline-node-fetch"},y.loading?"抓取中":"抓取过程"),y.details?K(ln,{title:`Pipeline Node ${n}`,data:y.details,onOpen:j,testId:"raw-pipeline-node-control"}):null),K("div",{className:"pipeline-control-meta"},K("span",null,K("b",null,"kind"),String(i?.kind||"--")),K("span",null,K("b",null,"procedure"),String(t?.currentProcedureRunId||"--")),K("span",null,K("b",null,"attempts"),String(t?.attempts??"--")),K("span",null,K("b",null,"updated"),wu(u?.updatedAt))),!n?K(qr,{title:"未选择 node",text:"点击 React Flow 控制图中的任意 node 后,可抓取执行过程、追加 prompt、下发引导、增量修改、审核通过或重做。"}):null,K(nl,{error:y.error,wide:!0}),K("div",{className:"pipeline-control-actions"},K("label",null,K("span",null,"实时追加 prompt(仅 running node)"),K("textarea",{value:y.appendPrompt,onChange:L("appendPrompt"),placeholder:"让当前执行中的 agent 继续、补充检查或调整当前步骤...",rows:4,disabled:!n,"data-testid":"pipeline-node-append-input"}),K("button",{type:"button",className:"primary-btn compact",disabled:W||!String(y.appendPrompt||"").trim(),onClick:()=>A("append"),"data-testid":"pipeline-node-append-button"},y.actionLoading==="append"?"追加中":"追加到运行中 node")),K("label",null,K("span",null,"下次尝试引导 prompt"),K("textarea",{value:y.guidePrompt,onChange:L("guidePrompt"),placeholder:"给该 node 下一次 attempt 的执行提示;不会立即打断当前 session。",rows:4,disabled:!n,"data-testid":"pipeline-node-guide-input"}),K("button",{type:"button",className:"ghost-btn compact",disabled:W||!String(y.guidePrompt||"").trim(),onClick:()=>A("guide"),"data-testid":"pipeline-node-guide-button"},y.actionLoading==="guide"?"下发中":"下发 guide")),K("label",null,K("span",null,"完成后增量修改 prompt"),K("textarea",{value:y.modifyPrompt,onChange:L("modifyPrompt"),placeholder:"在该 node 已完成结果基础上追加修改要求;runner 会重跑目标 node,并保留同 node 既有 OA 输出作为上下文。",rows:4,disabled:!n,"data-testid":"pipeline-node-modify-input"}),K("button",{type:"button",className:"ghost-btn compact",disabled:W||!String(y.modifyPrompt||"").trim(),onClick:()=>A("modify"),"data-testid":"pipeline-node-modify-button"},y.actionLoading==="modify"?"排队中":"增量修改 node")),K("label",null,K("span",null,"Monitor 审核通过原因"),K("textarea",{value:y.approveReason,onChange:L("approveReason"),placeholder:"当流程配置开启 monitor 审核时,记录审核通过原因并释放后续 node。",rows:3,disabled:!n,"data-testid":"pipeline-node-approve-input"}),K("button",{type:"button",className:"primary-btn compact",disabled:W||!String(y.approveReason||"").trim(),onClick:()=>A("approve"),"data-testid":"pipeline-node-approve-button"},y.actionLoading==="approve"?"提交中":"审核通过")),K("label",null,K("span",null,"重做 / restart 原因"),K("textarea",{value:y.redoReason,onChange:L("redoReason"),placeholder:"说明为什么需要重做;runner 会重置目标 node 以及非 rework 下游 node。",rows:4,disabled:!n,"data-testid":"pipeline-node-redo-input"}),K("button",{type:"button",className:"danger-btn compact",disabled:W||!String(y.redoReason||"").trim(),onClick:()=>A("redo"),"data-testid":"pipeline-node-redo-button"},y.actionLoading==="redo"?"排队中":"重做 node"))),K("div",{className:"pipeline-control-evidence"},K("strong",null,"Node 过程索引"),K(gS,{details:y.details,selectedNodeId:n,selectedNodeRuntime:t,control:y,onRaw:j})))}function yL({microservices:u,onRaw:l,apiBaseUrl:f="/api"}){let r=u.find((fu)=>fu.id==="pipeline")||null,[n,i]=df({loading:!1,error:"",health:null,snapshot:null,oaDiagnostics:null,minimaxQuota:null,refreshedAt:null}),[t,y]=df(""),[c,$]=df(""),[A,j]=df(""),[F,J]=df(sn()),[Q,W]=df({}),[L,U]=df(g0()),[q,N]=df(C9()),[w,G]=df(vc),[Z,H]=df(!1),[E,V]=df(!1),S=s0(0),{addNotification:B}=pf(),D=s0(!1),X=s0(0),O=s0(""),Y=s0({}),p=s0(""),v=s0("");async function z(fu={}){let mu=fu.silent===!0;if(!r)return;if(D.current)return;D.current=!0;let Xu=S.current+1;if(S.current=Xu,!mu)i((ou)=>({...ou,loading:!0,error:""}));try{let ou=`__unideskArrayLimit=registry.components:80,runs:${Sp}`,[$l,Rl,_l]=await Promise.all([I0(`${f}/microservices/pipeline/proxy/api/snapshot?${ou}`,{cache:"no-store"}),I0(`${f}/microservices/pipeline/proxy/api/oa-event-flow/diagnostics`,{cache:"no-store"}).catch((Xr)=>({ok:!1,error:Ou(Xr,"OA event flow diagnostics failed")})),I0(`${f}/microservices/pipeline/proxy/api/model-quota/minimax`,{cache:"no-store"}).catch((Xr)=>({ok:!1,error:Ou(Xr,"MiniMax quota failed")}))]);if(Xu!==S.current)return;let Nf={ok:$l?.ok!==!1,service:"pipeline-v2-control snapshot"};i({loading:!1,error:"",health:Nf,snapshot:$l,oaDiagnostics:Rl,minimaxQuota:_l,refreshedAt:new Date})}catch(ou){if(Xu!==S.current)return;i(($l)=>({...$l,loading:!1,error:Ou(ou,"Pipeline 加载失败")}))}finally{D.current=!1}}Ln(()=>{if(z(),!r)return;let fu=()=>{if(wA())z({silent:!0})},mu=window.setInterval(()=>{fu()},wW),Xu=()=>{if(wA())fu()};return document.addEventListener("visibilitychange",Xu),()=>{window.clearInterval(mu),document.removeEventListener("visibilitychange",Xu)}},[r?.id,r?.runtime?.providerStatus,f]);let P=uS(r),k=fS(r),I=lS(r),b=n.snapshot||{},d=n.oaDiagnostics||null,g=n.minimaxQuota||null,{components:x,pipelines:lu,runs:cu}=rS(b),_u=String(cu[0]?.pipelineId||""),Fu=(_u?lu.find((fu)=>String(fu.id||"")===_u):null)||lu[0]||{},zu=lu.find((fu)=>String(fu.id||"")===t)||Fu,Wu=String(zu.id||""),C=gW(zu),e=d9(zu),uu=SW(cu,Wu),Gu=OS(cu,Wu),s=Gu.find((fu)=>String(fu?.runId||"")===c)||uu,qu=String(q.runId||"")===String(s?.runId||"")?yS(q.details):null,Zu=cS(s,qu),Bu=String(Zu?.runId||""),Iu=C.find((fu)=>String(fu?.id||"")===A)||null,ll=A?sW(Zu,A):null,Pu=iS(cu),Jl=jS(x),Jf=Number(n.health?.components)||ZW(b,"registry.components",x.length),Of=ZW(b,"runs",cu.length),yf=mW(zu,Zu,x),lf={nodes:yf.nodes.map((fu)=>fu.id===A?{...fu,selected:!0,className:`${fu.className||""} selected-control-node`}:fu),edges:yf.edges},Zf=lu.map((fu)=>{let mu=String(fu.id||"pipeline"),Xu=SW(cu,mu);return{title:`${mu}-${Xu?.runId||"snapshot"}`,flow:mW(fu,Xu,x)}}),Pf=String(L?.runId||Bu||""),Au=String(L?.interval?.nodeId||L?.marker?.nodeId||""),au=Pf&&Au?Q[Y9(Pf,Au)]||null:null,Qf=EA(F.details,Pf,Au),Yu=EA(au?.details,Pf,Au)||Qf,cf=Pf&&Au?{...pu(au)?au:{},runId:Pf,nodeId:Au,details:Yu,loading:Boolean(au?.loading)||!Yu&&Boolean(F.loading)&&A===Au,error:String(au?.error||""),fetchedAt:au?.fetchedAt||(Qf?F.fetchedAt:null)}:null,_f=Gu.map((fu)=>String(fu?.runId||"")).filter(Boolean).join("|"),fr=C.map((fu)=>String(fu?.id||"")).filter(Boolean).join("|");Ln(()=>{p.current=A},[A]),Ln(()=>{v.current=Bu},[Bu]),Ln(()=>{if(!c||_f.split("|").includes(c))return;$("")},[c,_f]),Ln(()=>{if(!A||fr.split("|").includes(A))return;j(""),J(sn()),U(g0()),H(!1),V(!1)},[A,fr]),Ln(()=>{if(!A)H(!1)},[A]),Ln(()=>{if(!L.mode)V(!1)},[L.mode]);async function $f(fu=Bu,mu={}){if(!fu){N(C9());return}let Xu=d0(mu.scale??w??vc),ou=`${fu}:timeline`;if(O.current===ou)return;O.current=ou;let $l=mu.silent===!0,Rl=X.current+1;X.current=Rl,N((_l)=>({runId:fu,scale:Xu,loading:!$l||String(_l.runId||"")!==fu||!_l.details,error:"",details:$l&&_l.runId===fu?_l.details:_l.runId===fu?_l.details:null,fetchedAt:_l.runId===fu?_l.fetchedAt:null}));try{let[_l,Nf]=await Promise.all([I0(Pc(f,`/api/node-control/runs/${encodeURIComponent(fu)}?tail=160&view=timeline`),{cache:"no-store",strictJson:!0}),I0(Pc(f,`/api/runs/${encodeURIComponent(fu)}`),{cache:"no-store"}).catch((Xr)=>({ok:!1,runSummaryError:Ou(Xr,"抓取评分失败")}))]);if(Rl!==X.current)return;N({runId:fu,scale:Xu,loading:!1,error:"",details:{..._l,run:pu(Nf?.run)?Nf.run:void 0,runSummaryError:Nf?.runSummaryError},fetchedAt:new Date})}catch(_l){if(Rl!==X.current)return;N((Nf)=>({runId:fu,scale:Xu,loading:!1,error:Ou(_l,"抓取 epoch 执行过程失败"),details:Nf.runId===fu?Nf.details:null,fetchedAt:Nf.runId===fu?Nf.fetchedAt:null}))}finally{if(O.current===ou)O.current=""}}function Hf(fu,mu,Xu){let ou=Y9(fu,mu);W(($l)=>{let Rl={...$l,[ou]:{...pu($l?.[ou])?$l[ou]:{},runId:fu,nodeId:mu,...Xu}},_l=Object.keys(Rl);if(_l.length>32)for(let Nf of _l.slice(0,_l.length-32))delete Rl[Nf];return Rl})}async function Gn(fu,mu){if(!fu||!mu)return;let Xu=Y9(fu,mu),ou=Number(Y.current?.[Xu]||0)+1;Y.current={...Y.current,[Xu]:ou},Hf(fu,mu,{loading:!0,error:""});try{let $l=await I0(Pc(f,`/api/node-control/runs/${encodeURIComponent(fu)}/nodes/${encodeURIComponent(mu)}?tail=160`),{cache:"no-store",strictJson:!0});if(Number(Y.current?.[Xu]||0)!==ou)return;let Rl=new Date;if(Hf(fu,mu,{loading:!1,details:$l,fetchedAt:Rl,error:""}),p.current===mu&&v.current===fu)J((_l)=>({..._l,loading:!1,details:$l,fetchedAt:Rl,error:""}))}catch($l){if(Number(Y.current?.[Xu]||0)!==ou)return;Hf(fu,mu,{loading:!1,error:Ou($l,"抓取 Gantt node 详情失败")})}}Ln(()=>{if(!Bu){N(C9());return}$f(Bu);let fu=()=>{if(wA())$f(Bu,{silent:!0})},mu=window.setInterval(()=>{fu()},wW),Xu=()=>{if(wA())fu()};return document.addEventListener("visibilitychange",Xu),()=>{window.clearInterval(mu),document.removeEventListener("visibilitychange",Xu)}},[Bu,f]);async function rr(fu=Bu,mu=A){if(!fu||!mu){J((Xu)=>({...Xu,error:"请先选择 run 和 node",message:""}));return}J((Xu)=>({...Xu,loading:!0,error:"",message:""}));try{let Xu=await I0(Pc(f,`/api/node-control/runs/${encodeURIComponent(fu)}/nodes/${encodeURIComponent(mu)}?tail=160`),{cache:"no-store",strictJson:!0}),ou=new Date;J(($l)=>({...$l,loading:!1,details:Xu,fetchedAt:ou,error:""})),Hf(fu,mu,{loading:!1,details:Xu,fetchedAt:ou,error:""})}catch(Xu){J((ou)=>({...ou,loading:!1,error:Ou(Xu,"抓取 node 执行过程失败")}))}}async function dn(fu){let mu=String(fu?.runId||Bu||""),Xu=String(fu?.nodeId||"");if(U({mode:"interval",runId:mu,interval:fu,marker:null}),V(!0),!mu||!Xu)return;if(mu!==Bu)$(mu);j(Xu),J(sn()),$f(mu,{silent:!0}),Gn(mu,Xu)}async function Ql(fu){let mu=String(fu?.runId||Bu||""),Xu=String(fu?.nodeId||"");if(U({mode:"event",runId:mu,interval:null,marker:fu}),V(!0),!mu)return;if(mu!==Bu)$(mu);if($f(mu,{silent:!0}),!Xu)return;j(Xu),J(sn()),Gn(mu,Xu)}async function ei(fu){if(!Bu||!A){J((ou)=>({...ou,error:"请先选择 run 和 node",message:""}));return}let mu=fu==="append"?"prompts":fu,Xu=fu==="append"?F.appendPrompt:fu==="guide"?F.guidePrompt:fu==="modify"?F.modifyPrompt:fu==="approve"?F.approveReason:F.redoReason;if(!String(Xu||"").trim()){J((ou)=>({...ou,error:"操作内容不能为空",message:""}));return}J((ou)=>({...ou,actionLoading:fu,error:"",message:""}));try{let ou=fu==="redo"||fu==="approve"?{reason:Xu,source:"unidesk-frontend",sourceKind:"webui"}:{prompt:Xu,source:"unidesk-frontend",sourceKind:"webui"},$l=await I0(Pc(f,`/api/node-control/runs/${encodeURIComponent(Bu)}/nodes/${encodeURIComponent(A)}/${mu}`),{method:"POST",body:JSON.stringify(ou)});if(J((_l)=>({..._l,actionLoading:"",details:$l,fetchedAt:new Date,appendPrompt:fu==="append"?"":_l.appendPrompt,guidePrompt:fu==="guide"?"":_l.guidePrompt,modifyPrompt:fu==="modify"?"":_l.modifyPrompt,approveReason:fu==="approve"?"":_l.approveReason,redoReason:fu==="redo"?"":_l.redoReason,message:fu==="append"?"已追加到运行中 node":fu==="guide"?"已下发 guide,等待 runner 处理":fu==="modify"?"已排队增量修改命令":fu==="approve"?"已提交审核通过决策":"已排队重做命令"})),B("success",fu==="append"?"已追加到运行中 node":fu==="guide"?"已下发 guide,等待 runner 处理":fu==="modify"?"已排队增量修改命令":fu==="approve"?"已提交审核通过决策":"已排队重做命令"),await rr(Bu,A),await $f(Bu,{silent:!0}),fu!=="append")await z()}catch(ou){J(($l)=>({...$l,actionLoading:"",error:Ou(ou,"node 控制操作失败")}))}}if(!r)return K(qr,{title:"Pipeline 未登记",text:"请在 config.json 的 microservices 中登记用户服务 id=pipeline"});return K("div",{className:"pipeline-page","data-testid":"pipeline-page"},K(Wn,{title:"Pipeline v2 工作台",eyebrow:"D601 Snapshot 用户服务",loading:n.loading,actions:K("div",{className:"panel-actions"},K("button",{type:"button",className:"ghost-btn",onClick:z,disabled:n.loading,"data-testid":"pipeline-refresh-button"},n.loading?"刷新中":"刷新"),K(ln,{title:"Pipeline 用户服务",data:r,onOpen:l,testId:"raw-pipeline-service"}))},K("div",{className:"pipeline-hero"},K("div",null,K("div",{className:"node-version-line"},K(o0,{status:P.providerStatus==="online"?"online":"warn"},P.providerStatus||"unknown"),K("span",null,r.providerId),K("span",null,I.public?"公网暴露":"仅 UniDesk frontend 代理访问")),K("p",{className:"muted paragraph"},r.description)),K("div",{className:"microservice-ref-card"},K("span",null,"Repo"),K("strong",null,k.url||"--"),K("code",null,k.commitId||"--")),K("div",{className:"microservice-ref-card"},K("span",null,"D601 Docker"),K("strong",null,`${I.nodeBindHost||"--"}:${I.nodePort||"--"}`),K("code",null,`${k.composeFile||"--"} / ${k.composeService||"--"}`))),K(nl,{error:n.error,wide:!0})),K("div",{className:"pipeline-grid"},K(Wn,{title:"控制图",eyebrow:`${zu.id||"pipeline"} / run ${Zu?.status||"--"}`,className:"pipeline-wide-panel",loading:n.loading,actions:K("div",{className:"pipeline-toolbar"},K("select",{value:Wu,disabled:lu.length===0,onChange:(fu)=>{y(fu.target.value),$(""),j(""),J(sn()),U(g0()),H(!1),V(!1)},"data-testid":"pipeline-select"},lu.map((fu)=>K("option",{key:fu.id,value:fu.id},fu.id||fu.key))),K("select",{value:Bu,disabled:Gu.length===0,onChange:(fu)=>{if($(fu.target.value),J(sn()),U(g0()),H(!1),V(!1),A)rr(fu.target.value,A)},"data-testid":"pipeline-run-select"},Gu.map((fu)=>K("option",{key:fu.runId,value:fu.runId},v9(Gu,fu)))),K("button",{type:"button",className:"ghost-btn",disabled:lf.nodes.length===0,onClick:()=>dW(lf,`${zu.id||"pipeline"}-${Zu?.runId||"snapshot"}`),"data-testid":"pipeline-export-graph"},"导出渲染图"),K("button",{type:"button",className:"ghost-btn",disabled:Zf.every((fu)=>fu.flow.nodes.length===0),onClick:()=>ES(Zf),"data-testid":"pipeline-export-all-graphs"},"批量导出"))},C.length===0?K(qr,{title:"暂无控制图",text:"等待 D601 pipeline backend 返回 config.nodes / config.edges"}):K("div",{className:`pipeline-control-shell ${Z?"detail-open":"detail-collapsed"}`,"data-testid":"pipeline-control-shell","data-sidebar-open":Z?"true":"false"},K("div",{className:"pipeline-flow-frame","data-testid":"pipeline-react-flow"},K(jW,{nodes:lf.nodes,edges:lf.edges,nodeTypes:Mp,edgeTypes:Cp,fitView:!0,fitViewOptions:{padding:0.18},nodesDraggable:!1,nodesConnectable:!1,elementsSelectable:!0,minZoom:0.25,maxZoom:1.4,proOptions:{hideAttribution:!0},onNodeClick:(fu,mu)=>{let Xu=String(mu.id);if(j(Xu),J(sn()),H(!0),Bu)rr(Bu,Xu)}},K(UW,{gap:22,size:1,color:"rgba(215, 161, 58, 0.24)"}),K(QW,{showInteractive:!1})),!Z?K("button",{type:"button",className:"pipeline-sidecar-tab right",disabled:!A,onClick:()=>H(!0),"data-testid":"pipeline-node-sidebar-toggle"},A?"展开 node 控制":"点击 node 展开控制"):null),Z?K(eS,{activeRun:Zu,pipelineRuns:Gu,selectedRunId:c,onRunChange:(fu)=>{if($(fu),J(sn()),U(g0()),A)rr(fu,A)},selectedNodeId:A,selectedNodeConfig:Iu,selectedNodeRuntime:ll,control:F,onControlChange:(fu)=>J((mu)=>({...mu,...fu})),onFetch:()=>rr(),onAction:ei,onRaw:l,onCollapse:()=>H(!1)}):null),K("div",{className:"pipeline-flow-summary"},K("span",null,`${lf.nodes.length} nodes`),K("span",null,`${lf.edges.length} edges`),K("span",null,`${lu.length} pipelines`),K("span",null,`source config+components(${x.length})`),K("span",null,`run ${Zu?.runId||"--"}`),K("span",null,`score ${b9(Zu)}`),K("span",null,A?`selected ${A}`:"click node to control"))),K(dS,{epochs:Gu,activeRun:Zu,activePipeline:zu,pipelineNodes:C,pipelineEdges:e,selection:L,detailOpen:E,onDetailOpenChange:V,runDetails:q,nodeDetails:Yu,nodeDetailsState:cf,ganttScale:w,onGanttScaleChange:G,onIntervalSelect:dn,onMarkerSelect:Ql,onRunChange:(fu)=>{if($(fu),J(sn()),U(g0()),V(!1),A)rr(fu,A)},onRaw:l}),K(Wn,{title:"观测指标",eyebrow:n.refreshedAt?`Updated ${yl(n.refreshedAt)}`:"Snapshot",loading:n.loading},K("div",{className:"metric-grid"},K(Yf,{label:"Health",value:n.health?.ok?"OK":"--",hint:n.health?.service||"D601 /health",tone:n.health?.ok?"ok":"warn"}),K(Yf,{label:"组件",value:Jf,hint:"components registry",tone:b?.registry?.ok===!1?"warn":"ok"}),K(Yf,{label:"Pipeline",value:lu.length,hint:`${C.length} nodes / ${e.length} edges`}),K(Yf,{label:"运行记录",value:Of,hint:`${Pu.succeeded||0} succeeded / ${Pu.running||0} running`}),K(Yf,{label:"OA 记录",value:Array.isArray(uu?.submissions)?uu.submissions.length:0,hint:uu?.runId||"latest run"}),K(Yf,{label:"Procedure",value:Array.isArray(uu?.procedureRuns)?uu.procedureRuns.length:0,hint:uu?.status||"no run"}),K(Yf,{label:"Score",value:b9(Zu),hint:Zu?.runId||"selected epoch",tone:u7(Zu)})),K("div",{className:"panel-actions inline-actions"},K(ln,{title:"Pipeline Snapshot",data:b,onOpen:l,testId:"raw-pipeline-snapshot"}))),K(Wn,{title:"评分器",eyebrow:Zu?.runId||"selected epoch",loading:n.loading},K(AS,{run:Zu,onRaw:l})),K(Wn,{title:"MiniMax 限额",eyebrow:"model/minimax-m27 quota",loading:n.loading},K(oS,{quota:g,onRaw:l})),K(Wn,{title:"OA 事件流",eyebrow:"100% event-driven diagnostics",className:"pipeline-wide-panel",loading:n.loading},K(aS,{diagnostics:d,onRaw:l})),K(Wn,{title:"组件矩阵",eyebrow:`${Jl.length} classes`,loading:n.loading},Jl.length===0?K(qr,{title:"暂无组件",text:"等待 D601 pipeline backend 返回 registry.components"}):K("div",{className:"component-strata"},Jl.map((fu)=>K("article",{key:fu.name,className:"component-stratum"},K("span",null,fu.name),K("strong",null,fu.count)))),K("div",{className:"pipeline-component-list"},x.slice(0,12).map((fu)=>K("span",{key:fu.key,className:"data-chip"},K("b",null,fu.componentClass||"--"),K("span",null,fu.id||fu.key||"--"))))),K(Wn,{title:"Epoch 列表",eyebrow:`${Gu.length}/${Of} preview`,loading:n.loading},Gu.length===0?K(qr,{title:"暂无运行记录",text:"当前 pipeline 在 .state/pipeline-runs 中还没有 epoch。"}):K("div",{className:"pipeline-run-list"},Gu.map((fu)=>{let mu=String(fu?.runId||"")===Bu?Zu:fu;return K("article",{key:fu.runId,className:`pipeline-run-card ${String(fu.runId||"")===Bu?"active":""}`,role:"button",tabIndex:0,onClick:()=>{$(String(fu.runId||"")),U(g0())},onKeyDown:(Xu)=>{if(Xu.key==="Enter"||Xu.key===" ")$(String(fu.runId||"")),U(g0())}},K("div",{className:"node-card-head"},K("strong",null,v9(Gu,fu)),K(o0,{status:fu.status},fu.status||"--")),K("div",{className:"docker-meta compact"},K("span",null,mu?.pipelineId||"--"),K("span",null,`nodes ${Array.isArray(mu?.nodes)?mu.nodes.length:0}`),K("span",null,`oa ${Array.isArray(mu?.submissions)?mu.submissions.length:0}`),K("span",null,`procedures ${Array.isArray(mu?.procedureRuns)?mu.procedureRuns.length:0}`),K($S,{run:mu})),K("p",{className:"muted paragraph"},zA(mu?.task)),K("span",{className:"pipeline-run-time"},wu(mu?.updatedAt)))}))),K(Wn,{title:"运行材料索引",eyebrow:Zu?.runId||"selected epoch",className:"pipeline-wide-panel",loading:n.loading},K(sS,{activeRun:Zu,onRaw:l}))))}var YA=Cu(Fl(),1);var yu=YA.default.createElement,{useEffect:uX}=YA.default,SA=YA.default.useState,n7={id:"",sequenceNo:"",contractNo:"",name:"",currentStatus:"",pending:"",paymentStatus:"",notes:""};function lX({status:u,children:l}){let f=String(u||"unknown").toLowerCase();return yu("span",{className:`status-badge ${f}`},l||u||"unknown")}function XA({label:u,value:l,hint:f,tone:r}){return yu("article",{className:`metric-card ${r||""}`},yu("div",{className:"metric-label"},u),yu("div",{className:"metric-value"},l),yu("div",{className:"metric-hint"},f))}function i7({title:u,eyebrow:l,actions:f,children:r,className:n,loading:i}){return yu("section",{className:`panel ${n||""}`},yu("div",{className:"panel-head"},yu("div",null,l?yu("p",{className:"panel-eyebrow"},l):null,yu(rl,{title:u,loading:i})),f?yu("div",{className:"panel-actions"},f):null),yu("div",{className:"panel-body"},r))}function cL({title:u,data:l,onOpen:f,testId:r}){return yu("button",{type:"button",className:"ghost-btn","data-testid":r,onClick:()=>f(u,l)},"查看原始JSON")}function _L({title:u,text:l}){return yu("div",{className:"empty-state"},yu("strong",null,u),yu("span",null,l))}function fX(u){return u?.runtime&&typeof u.runtime==="object"&&!Array.isArray(u.runtime)?u.runtime:{}}function rX(u){return u?.backend&&typeof u.backend==="object"&&!Array.isArray(u.backend)?u.backend:{}}function nX(u){return u?.repository&&typeof u.repository==="object"&&!Array.isArray(u.repository)?u.repository:{}}function Ey(u,l){return`${u}/microservices/project-manager/proxy${l}`}function iX(u){return{id:String(u.id||""),sequenceNo:u.sequenceNo===null||u.sequenceNo===void 0?"":String(u.sequenceNo),contractNo:String(u.contractNo||""),name:String(u.name||""),currentStatus:String(u.currentStatus||""),pending:String(u.pending||""),paymentStatus:String(u.paymentStatus||""),notes:String(u.notes||"")}}function tX(u){return{sequenceNo:u.sequenceNo===""?null:Number(u.sequenceNo),contractNo:String(u.contractNo||"").trim(),name:String(u.name||"").trim(),currentStatus:String(u.currentStatus||"").trim(),pending:String(u.pending||"").trim(),paymentStatus:String(u.paymentStatus||"").trim(),paymentRatio:String(u.paymentStatus||"").trim(),notes:String(u.notes||"").trim()}}function t7(u){return String(u||"item").replace(/[^A-Za-z0-9_-]+/g,"-")}function yX(u){let l=new Uint8Array(u),f="",r=32768;for(let n=0;nyu("tr",{key:n.id,className:l===n.id?"active-row":"","data-testid":`project-manager-row-${t7(n.id)}`},yu("td",null,n.sequenceNo??"--"),yu("td",null,yu("strong",null,n.contractNo||"--"),yu("code",null,n.id||"--")),yu("td",null,yu("strong",null,n.name||"--"),yu("span",{className:"muted block"},n.sourceFile||"--")),yu("td",null,n.currentStatus||"--"),yu("td",null,yu("span",{className:"preline"},n.pending||"--")),yu("td",null,yu(lX,{status:Number(n.paymentRatio||0)>=1?"online":"warn"},n.paymentStatus||"--")),yu("td",null,n.notes||"--"),yu("td",null,yu("div",{className:"inline-actions"},yu("button",{type:"button",className:"ghost-btn",onClick:()=>f(n),"data-testid":`project-manager-edit-${t7(n.id)}`},"编辑"),yu(cL,{title:`Project ${n.contractNo||n.id}`,data:n,onOpen:r,testId:`raw-project-${t7(n.id)}`}))))))))}function $L({microservices:u,onRaw:l,apiBaseUrl:f="/api"}){let r=u.find((E)=>E.id==="project-manager")||null,[n,i]=SA({loading:!1,saving:!1,importing:!1,exporting:!1,error:"",notice:"",health:null,list:null,refreshedAt:null}),[t,y]=SA({...n7}),[c,$]=SA(""),[A,j]=SA("all"),{addNotification:F}=pf();async function J(E=c,V=A){if(!r)return;i((S)=>({...S,loading:!0,error:""}));try{let S=new URLSearchParams({pageSize:"200",status:V});if(E.trim())S.set("q",E.trim());let[B,D]=await Promise.all([Eu(`${f}/microservices/project-manager/health`),Eu(Ey(f,`/api/projects?${S.toString()}`))]);i((X)=>({...X,loading:!1,health:B,list:D,refreshedAt:new Date,error:""}))}catch(S){i((B)=>({...B,loading:!1,error:Ou(S,"Project Manager 加载失败")}))}}uX(()=>{J()},[r?.id,r?.runtime?.providerStatus]);async function Q(E){E.preventDefault(),i((V)=>({...V,saving:!0,error:"",notice:""}));try{let V=tX(t);if(t.id)await Eu(Ey(f,`/api/projects/${encodeURIComponent(t.id)}`),{method:"PUT",body:JSON.stringify(V)});else await Eu(Ey(f,"/api/projects"),{method:"POST",body:JSON.stringify(V)});let S=t.id?"项目已更新":"项目已创建";i((B)=>({...B,saving:!1,notice:S})),F("success",S),await J()}catch(V){i((S)=>({...S,saving:!1,error:Ou(V,"保存项目失败")}))}}async function W(){if(!t.id)return;if(!window.confirm(`删除项目 ${t.contractNo||t.name||t.id} ?`))return;i((E)=>({...E,saving:!0,error:"",notice:""}));try{await Eu(Ey(f,`/api/projects/${encodeURIComponent(t.id)}`),{method:"DELETE"}),y({...n7});let E="项目已删除";i((V)=>({...V,saving:!1,notice:E})),F("success",E),await J()}catch(E){i((V)=>({...V,saving:!1,error:Ou(E,"删除项目失败")}))}}async function L(E){let V=E.target.files?.[0];if(!V)return;i((S)=>({...S,importing:!0,error:"",notice:""}));try{let S=yX(await V.arrayBuffer()),D=`Excel 已导入 ${(await Eu(Ey(f,"/api/import/excel"),{method:"POST",body:JSON.stringify({fileName:V.name,contentBase64:S,replace:!1})})).imported||0} 条项目`;i((X)=>({...X,importing:!1,notice:D})),F("success",D),E.target.value="",await J()}catch(S){i((B)=>({...B,importing:!1,error:Ou(S,"Excel 导入失败")}))}}async function U(){i((E)=>({...E,exporting:!0,error:""}));try{let E=await KJ(Ey(f,"/api/projects/export.xlsx")),V=URL.createObjectURL(E),S=document.createElement("a");S.href=V,S.download=`project-manager-${lj()}.xlsx`,document.body.appendChild(S),S.click(),S.remove(),URL.revokeObjectURL(V),i((B)=>({...B,exporting:!1,notice:"Excel 已导出"}))}catch(E){i((V)=>({...V,exporting:!1,error:Ou(E,"Excel 导出失败")}))}}if(!r)return yu(_L,{title:"Project Manager 未登记",text:"请在 config.json 的 microservices 中登记用户服务 id=project-manager"});let q=fX(r),N=nX(r),w=rX(r),G=Array.isArray(n.list?.projects)?n.list.projects:[],Z=n.list?.summary||{},H=n.health||{};return yu("div",{className:"project-manager-page","data-testid":"project-manager-page"},yu(i7,{title:"项目管理工作台",eyebrow:"Main Server PostgreSQL 用户服务",loading:n.loading||n.exporting,actions:yu("div",{className:"panel-actions"},yu("button",{type:"button",className:"ghost-btn",disabled:n.loading,onClick:()=>J(),"data-testid":"project-manager-refresh-button"},n.loading?"刷新中":"刷新"),yu("button",{type:"button",className:"ghost-btn",disabled:n.exporting,onClick:U,"data-testid":"project-manager-export-button"},n.exporting?"导出中":"导出 Excel"),yu(cL,{title:"Project Manager 用户服务",data:r,onOpen:l,testId:"raw-project-manager-service"}))},yu("div",{className:"project-manager-hero"},yu(XA,{label:"项目总数",value:Z.total??G.length,hint:`PG 表 ${H.storage?.table||"project_manager_projects"}`,tone:"ok"}),yu(XA,{label:"进行中",value:Z.active??"--",hint:"当前状态未完全完成"}),yu(XA,{label:"已完成",value:Z.completed??"--",hint:"按 完成 关键字统计",tone:"ok"}),yu(XA,{label:"未全款",value:Z.unpaid??"--",hint:"付款比例 < 1",tone:Number(Z.unpaid||0)>0?"warn":"ok"})),yu(nl,{error:n.error}),n.notice?yu("div",{className:"form-success"},n.notice):null),yu("div",{className:"project-manager-hero"},yu("div",{className:"microservice-ref-card"},yu("span",null,"Repo"),yu("strong",null,N.url||"--"),yu("code",null,N.commitId||"--")),yu("div",{className:"microservice-ref-card"},yu("span",null,"Main Server Docker"),yu("strong",null,`${w.nodeBindHost||"--"}:${w.nodePort||"--"}`),yu("code",null,`${N.composeService||"--"} / ${N.containerName||"--"}`)),yu("div",{className:"microservice-ref-card"},yu("span",null,"Runtime"),yu("strong",null,q.providerName||r.providerId),yu("code",null,`Health ${H.ok?"OK":"--"} / ${n.refreshedAt?yl(n.refreshedAt):"--"}`)),yu("div",{className:"microservice-ref-card"},yu("span",null,"Import Source"),yu("strong",null,"D601 WeChat Excel"),yu("code",null,"合作项目列表_I_20260309.xlsx"))),yu("div",{className:"project-manager-layout"},yu(i7,{title:"项目清单",eyebrow:"CRUD + Excel Export",loading:n.loading||n.importing||n.exporting,actions:yu("div",{className:"inline-actions project-manager-filters"},yu("input",{value:c,onChange:(E)=>$(E.target.value),placeholder:"搜索合同号 / 项目名称 / 状态","data-testid":"project-manager-search"}),yu("select",{value:A,onChange:(E)=>{j(E.target.value),J(c,E.target.value)},"data-testid":"project-manager-status-filter"},yu("option",{value:"all"},"全部"),yu("option",{value:"active"},"进行中"),yu("option",{value:"completed"},"已完成"),yu("option",{value:"unpaid"},"未全款")),yu("button",{type:"button",className:"ghost-btn",onClick:()=>J(c,A)},"筛选"))},yu(cX,{projects:G,activeId:t.id,onSelect:(E)=>y(iX(E)),onRaw:l})),yu(i7,{title:t.id?"编辑项目":"新建项目",eyebrow:"PostgreSQL Write Path",loading:n.saving||n.importing},yu("form",{className:"stack-form project-manager-form",onSubmit:Q,"data-testid":"project-manager-form"},t.id?yu("label",null,"项目 ID",yu("input",{value:t.id,disabled:!0})):null,yu("label",null,"序号",yu("input",{type:"number",value:t.sequenceNo,onChange:(E)=>y((V)=>({...V,sequenceNo:E.target.value}))})),yu("label",null,"合同号",yu("input",{value:t.contractNo,onChange:(E)=>y((V)=>({...V,contractNo:E.target.value})),required:!0})),yu("label",null,"项目名称",yu("input",{value:t.name,onChange:(E)=>y((V)=>({...V,name:E.target.value})),required:!0})),yu("label",null,"当前状况",yu("textarea",{value:t.currentStatus,onChange:(E)=>y((V)=>({...V,currentStatus:E.target.value}))})),yu("label",null,"待完成",yu("textarea",{value:t.pending,onChange:(E)=>y((V)=>({...V,pending:E.target.value}))})),yu("label",null,"付款情况",yu("input",{value:t.paymentStatus,onChange:(E)=>y((V)=>({...V,paymentStatus:E.target.value})),placeholder:"例如 1 / 0.5 / 50%"})),yu("label",null,"其它",yu("input",{value:t.notes,onChange:(E)=>y((V)=>({...V,notes:E.target.value}))})),yu("div",{className:"inline-actions"},yu("button",{type:"submit",className:"primary-btn",disabled:n.saving,"data-testid":"project-manager-save-button"},n.saving?"保存中":t.id?"保存修改":"创建项目"),yu("button",{type:"button",className:"ghost-btn",onClick:()=>y({...n7})},"清空"),t.id?yu("button",{type:"button",className:"danger-btn",disabled:n.saving,onClick:W,"data-testid":"project-manager-delete-button"},"删除"):null)),yu("div",{className:"project-manager-import"},yu("p",{className:"muted paragraph"},"浏览器只访问 UniDesk frontend;后端通过同源用户服务代理写入主 PostgreSQL,不暴露 4233 公网端口。"),yu("label",{className:"file-import"},n.importing?"导入中...":"导入 Excel",yu("input",{type:"file",accept:".xlsx",onChange:L,disabled:n.importing,"data-testid":"project-manager-import-input"}))))))}var MA=Cu(Fl(),1);var $u=MA.default.createElement,{useEffect:_X}=MA.default,ur=MA.default.useState;function $X({status:u,children:l}){let f=String(u||"unknown").toLowerCase();return $u("span",{className:`status-badge ${f}`},l||u||"unknown")}function PA({label:u,value:l,hint:f,tone:r}){return $u("article",{className:`metric-card ${r||""}`},$u("div",{className:"metric-label"},u),$u("div",{className:"metric-value"},l),$u("div",{className:"metric-hint"},f))}function y7({title:u,eyebrow:l,actions:f,children:r,className:n,loading:i}){return $u("section",{className:`panel ${n||""}`},$u("div",{className:"panel-head"},$u("div",null,l?$u("p",{className:"panel-eyebrow"},l):null,$u(rl,{title:u,loading:i})),f?$u("div",{className:"panel-actions"},f):null),$u("div",{className:"panel-body"},r))}function AL({title:u,data:l,onOpen:f,testId:r}){return $u("button",{type:"button",className:"ghost-btn","data-testid":r,onClick:()=>f(u,l)},"查看原始JSON")}function CA({title:u,text:l}){return $u("div",{className:"empty-state"},$u("strong",null,u),$u("span",null,l))}function AX(u){return u?.runtime&&typeof u.runtime==="object"&&!Array.isArray(u.runtime)?u.runtime:{}}function jX(u){return u?.backend&&typeof u.backend==="object"&&!Array.isArray(u.backend)?u.backend:{}}function FX(u){return u?.repository&&typeof u.repository==="object"&&!Array.isArray(u.repository)?u.repository:{}}function FL(u){return String(u).replace(/[^a-zA-Z0-9_-]/g,"_")}function UX(u){if(!Number.isFinite(u))return"--";return`${u.toFixed(1)}%`}function Oy(u,l){return`${u}/microservices/todo-note/proxy${l}`}function UL(u){return u.reduce((l,f)=>{let r=UL(Array.isArray(f.children)?f.children:[]),n=Boolean(f.completed);return{total:l.total+1+r.total,completed:l.completed+(n?1:0)+r.completed,active:l.active+(n?0:1)+r.active}},{total:0,completed:0,active:0})}function _7(u,l){let f=l==="all"||(l==="completed"?Boolean(u.completed):!u.completed),r=Array.isArray(u.children)?u.children:[];return f||r.some((n)=>_7(n,l))}function jL(u){return Array.isArray(u?.instances)?u.instances:[]}function c7(u,l){for(let f of u){if(f?.id===l)return Array.isArray(f.children)?f.children:[];let r=c7(Array.isArray(f?.children)?f.children:[],l);if(r.length>0)return r}return[]}function JL({microservices:u,onRaw:l,apiBaseUrl:f="/api"}){let r=u.find((s)=>s.id==="todo-note")||null,[n,i]=ur(null),[t,y]=ur(null),[c,$]=ur(""),[A,j]=ur(null),[F,J]=ur("all"),[Q,W]=ur(13),[L,U]=ur(""),[q,N]=ur(""),[w,G]=ur(""),[Z,H]=ur(""),[E,V]=ur(""),[S,B]=ur(!1),[D,X]=ur(""),[O,Y]=ur(null),p=jL(t),v=UL(Array.isArray(A?.todos)?A.todos:[]),z=r?AX(r):{},P=r?FX(r):{},k=r?jX(r):{};async function I(s=c){let[qu,Zu]=await Promise.all([Eu(`${f}/microservices/todo-note/health`),Eu(Oy(f,"/api/instances"))]);i(qu),y(Zu);let Bu=jL(Zu),Iu=Bu.some((ll)=>ll.id===s)?s:Bu[0]?.id||"";return $(Iu),Iu}async function b(s=c){if(!s){j(null);return}let qu=await Eu(Oy(f,`/api/instances/${encodeURIComponent(s)}`));j(qu)}async function d(s=c){if(!r)return;B(!0),X("");try{let qu=await I(s);await b(qu),Y(new Date)}catch(qu){X(Ou(qu,"Todo Note 加载失败"))}finally{B(!1)}}async function g(s){if(!c)return null;X("");try{let qu=await Eu(Oy(f,`/api/instances/${encodeURIComponent(c)}/actions`),{method:"POST",body:JSON.stringify({action:s})});return j(qu),await I(c),qu}catch(qu){return X(Ou(qu,"Todo 操作失败")),null}}async function x(s){s.preventDefault();let qu=L.trim();if(!qu)return;B(!0),X("");try{let Zu=await Eu(Oy(f,"/api/instances"),{method:"POST",body:JSON.stringify({name:qu})});U(""),await d(Zu.id)}catch(Zu){X(Ou(Zu,"创建清单失败"))}finally{B(!1)}}async function lu(s){if(!window.confirm("确认删除这个 Todo Note 清单?"))return;B(!0),X("");try{await Eu(Oy(f,`/api/instances/${encodeURIComponent(s)}`),{method:"DELETE"}),await d(c===s?"":c)}catch(qu){X(Ou(qu,"删除清单失败"))}finally{B(!1)}}async function cu(s){s.preventDefault();let qu=q.trim();if(!qu)return;N(""),await g({type:"addTodo",title:qu})}async function _u(s){if(!c)return;X("");try{let qu=await Eu(Oy(f,`/api/instances/${encodeURIComponent(c)}/${s}`),{method:"POST",body:JSON.stringify({})});j(qu),await I(c)}catch(qu){X(Ou(qu,`${s} 失败`))}}function Fu(s){G(s.id),H(String(s.title||""))}async function zu(s){let qu=Z.trim();if(G(""),H(""),qu)await g({type:"updateTodoTitle",todoId:s,title:qu})}async function Wu(s){let Zu=window.prompt("新增子任务标题")?.trim();if(!Zu)return;let Bu=c7(Array.isArray(A?.todos)?A.todos:[],s),Iu=new Set(Bu.map((Jf)=>Jf.id)),ll=await g({type:"addTodo",title:Zu,parentId:s,targetIndex:0});if(!ll)return;let Pu=c7(Array.isArray(ll?.todos)?ll.todos:[],s),Jl=Pu.find((Jf)=>!Iu.has(Jf.id));if(Jl&&Pu[0]?.id!==Jl.id)await g({type:"moveTodo",todoId:Jl.id,targetParentId:s,targetIndex:0})}async function C(s,qu){if(!E)return;let Zu={type:"moveTodo",todoId:E,targetIndex:qu};if(s)Zu.targetParentId=s;V(""),await g(Zu)}if(_X(()=>{d()},[r?.id,r?.runtime?.providerStatus]),!r)return $u(CA,{title:"Todo Note 未登记",text:"请在 config.json 的 microservices 中登记用户服务 id=todo-note"});let e=p.find((s)=>s.id===c)||null,uu=Array.isArray(A?.todos)?A.todos:[],Gu=uu.map((s,qu)=>({todo:s,index:qu})).filter((s)=>_7(s.todo,F));return $u("div",{className:"todo-note-page","data-testid":"todo-note-page"},$u(y7,{title:"Todo Note 工作台",eyebrow:"Main Server 用户服务",loading:S,actions:$u("div",{className:"panel-actions"},$u("button",{type:"button",className:"ghost-btn",disabled:S,onClick:()=>d(c),"data-testid":"todo-note-refresh-button"},S?"刷新中":"刷新"),$u(AL,{title:"Todo Note 用户服务",data:r,onOpen:l,testId:"raw-todo-note-service"}))},$u("div",{className:"todo-note-hero"},$u("div",null,$u("div",{className:"node-version-line"},$u($X,{status:z.providerStatus==="online"?"online":"warn"},z.providerStatus||"unknown"),$u("span",null,r.providerId),$u("span",null,k.public?"公网暴露":"仅 UniDesk frontend 代理访问"),$u("span",null,n?.ok?"Health OK":"Health --")),$u("p",{className:"muted paragraph"},r.description)),$u("div",{className:"microservice-ref-card"},$u("span",null,"Repo"),$u("strong",null,P.url||"--"),$u("code",null,P.commitId||"--")),$u("div",{className:"microservice-ref-card"},$u("span",null,"Main Server Docker"),$u("strong",null,`${k.nodeBindHost||"--"}:${k.nodePort||"--"}`),$u("code",null,`${P.composeService||"--"} / ${P.containerName||"--"}`))),$u(nl,{error:D,wide:!0})),$u("div",{className:"todo-note-layout"},$u(y7,{title:"清单",eyebrow:`${p.length} Instances`,className:"todo-list-panel",loading:S},$u("form",{className:"todo-create-list",onSubmit:x},$u("input",{placeholder:"新清单名称",value:L,onChange:(s)=>U(s.target.value),"aria-label":"新清单名称"}),$u("button",{type:"submit",className:"ghost-btn",disabled:S||!L.trim()},"创建")),p.length===0?$u(CA,{title:"暂无清单",text:"迁移或创建清单后会出现在这里"}):$u("div",{className:"todo-instance-list"},p.map((s)=>$u("button",{key:s.id,type:"button",className:`todo-instance-row ${c===s.id?"active":""}`,onClick:()=>{$(s.id),b(s.id)},"data-testid":`todo-instance-${FL(s.id)}`},$u("strong",null,s.name),$u("span",null,`${s.completedCount??0}/${s.todoCount??0} 完成`),$u("code",null,s.id))))),$u("div",{className:"todo-main-stack"},$u(y7,{title:e?.name||"待选择清单",eyebrow:O?`Updated ${yl(O)}`:"Todo Tree",loading:S,actions:A?$u("div",{className:"panel-actions"},$u("button",{type:"button",className:"ghost-btn",onClick:()=>g({type:"renameInstance",name:window.prompt("清单新名称",A.name)||A.name})},"重命名"),$u("button",{type:"button",className:"ghost-btn danger",onClick:()=>lu(c)},"删除清单"),$u(AL,{title:`Todo Instance ${c}`,data:A,onOpen:l,testId:"raw-todo-instance"})):null},!A?$u(CA,{title:"未选择清单",text:"左侧选择一个 Todo Note 清单"}):$u("div",{className:"todo-workbench",style:{"--todo-font-size":`${Q}px`}},$u("div",{className:"todo-toolbar"},$u("form",{className:"todo-add-form",onSubmit:cu},$u("input",{placeholder:"新增根任务",value:q,onChange:(s)=>N(s.target.value),"aria-label":"新增根任务"}),$u("button",{type:"submit",className:"ghost-btn",disabled:!q.trim()},"新增")),$u("div",{className:"todo-filter-strip"},["all","active","completed"].map((s)=>$u("button",{key:s,type:"button",className:`todo-filter ${F===s?"active":""}`,onClick:()=>J(s)},s==="all"?"全部":s==="active"?"未完成":"已完成"))),$u("div",{className:"todo-toolbar-actions"},$u("button",{type:"button",className:"ghost-btn",onClick:()=>g({type:"setAllTodosExpanded",expanded:!0})},"全部展开"),$u("button",{type:"button",className:"ghost-btn",onClick:()=>g({type:"setAllTodosExpanded",expanded:!1})},"全部收起"),$u("button",{type:"button",className:"ghost-btn",onClick:()=>_u("undo")},"撤销"),$u("button",{type:"button",className:"ghost-btn",onClick:()=>_u("redo")},"重做"),$u("label",{className:"todo-font-control"},"字号",$u("input",{type:"range",min:11,max:18,value:Q,onChange:(s)=>W(Number(s.target.value))})))),$u("div",{className:"todo-stats-grid"},$u(PA,{label:"总任务",value:v.total,hint:`${p.length} lists`}),$u(PA,{label:"已完成",value:v.completed,hint:`${UX(v.total?v.completed/v.total*100:0)}`,tone:"ok"}),$u(PA,{label:"未完成",value:v.active,hint:F==="active"?"当前筛选":"active tasks",tone:v.active>0?"warn":"ok"}),$u(PA,{label:"历史指针",value:A.historyPointer??0,hint:"undo / redo"})),$u("div",{className:"todo-root-drop",onDragOver:(s)=>s.preventDefault(),onDrop:(s)=>{s.preventDefault(),C(null,uu.length)}},"拖到这里可移为根任务末尾"),$u("div",{className:"todo-tree","data-testid":"todo-note-tree"},Gu.length===0?$u(CA,{title:"没有匹配任务",text:"调整筛选或新增任务"}):Gu.map(({todo:s,index:qu})=>$u(QL,{key:s.id,todo:s,depth:0,parentId:null,index:qu,siblingCount:uu.length,filter:F,editingId:w,editingTitle:Z,setEditingTitle:H,beginEdit:Fu,saveEdit:zu,applyTodoAction:g,addChild:Wu,dragTodoId:E,setDragTodoId:V,dropTodo:C}))))))))}function QL(u){let{todo:l,depth:f,parentId:r,index:n,siblingCount:i,filter:t,editingId:y,editingTitle:c,setEditingTitle:$,beginEdit:A,saveEdit:j,applyTodoAction:F,addChild:J,dragTodoId:Q,setDragTodoId:W,dropTodo:L}=u,U=Array.isArray(l.children)?l.children:[],q=U.map((G,Z)=>({child:G,childIndex:Z})).filter((G)=>_7(G.child,t)),N=y===l.id,w=r||null;return $u("div",{className:"todo-row-wrap"},$u("article",{className:`todo-row ${l.completed?"completed":""} ${Q===l.id?"dragging":""}`,style:{"--todo-depth":f},draggable:!0,onDragStart:(G)=>{W(l.id),G.dataTransfer.effectAllowed="move"},onDragOver:(G)=>G.preventDefault(),onDrop:(G)=>{G.preventDefault(),L(l.id,U.length)},"data-testid":`todo-row-${FL(l.id)}`},$u("button",{type:"button",className:"todo-expand",disabled:U.length===0,onClick:()=>F({type:"toggleTodoExpanded",todoId:l.id})},U.length===0?"·":l.expanded?"▾":"▸"),$u("input",{type:"checkbox",checked:Boolean(l.completed),onChange:()=>F({type:"toggleTodoCompleted",todoId:l.id}),"aria-label":`完成 ${l.title}`}),$u("div",{className:"todo-title-cell",onDoubleClick:()=>A(l)},N?$u("div",{className:"todo-edit-inline"},$u("input",{value:c,autoFocus:!0,onChange:(G)=>$(G.target.value),onKeyDown:(G)=>{if(G.key==="Enter")j(l.id);if(G.key==="Escape")A({id:"",title:""})}}),$u("button",{type:"button",className:"ghost-btn",onClick:()=>j(l.id)},"保存")):$u("strong",null,l.title||"Untitled"),$u("div",{className:"todo-meta-line"},$u("span",null,`子项 ${U.length}`),$u("span",null,`更新 ${wu(l.updatedAt)}`),l.reminderAt?$u("span",{className:"todo-reminder"},`提醒 ${wu(l.reminderAt)}`):$u("span",null,"无提醒"))),$u("input",{className:"todo-reminder-input",type:"datetime-local",value:j6(l.reminderAt),onChange:(G)=>F({type:"setTodoReminder",todoId:l.id,reminderAt:fj(G.target.value)})}),$u("div",{className:"todo-row-actions"},$u("button",{type:"button",className:"ghost-btn",onClick:()=>A(l)},"编辑"),$u("button",{type:"button",className:"ghost-btn",onClick:()=>J(l.id)},"子项"),$u("button",{type:"button",className:"ghost-btn",disabled:n<=0,onClick:()=>F({type:"moveTodo",todoId:l.id,...w?{targetParentId:w}:{},targetIndex:n-1})},"上移"),$u("button",{type:"button",className:"ghost-btn",disabled:n<=0,onClick:()=>F({type:"moveTodo",todoId:l.id,...w?{targetParentId:w}:{},targetIndex:0})},"置顶"),$u("button",{type:"button",className:"ghost-btn",disabled:n>=i-1,onClick:()=>F({type:"moveTodo",todoId:l.id,...w?{targetParentId:w}:{},targetIndex:n+1})},"下移"),$u("button",{type:"button",className:"ghost-btn",disabled:!r,onClick:()=>F({type:"moveTodo",todoId:l.id,targetIndex:9999})},"提升"),$u("button",{type:"button",className:"ghost-btn danger",onClick:()=>F({type:"deleteTodo",todoId:l.id})},"删除"))),l.expanded&&q.length>0?$u("div",{className:"todo-children"},q.map(({child:G,childIndex:Z})=>$u(QL,{key:G.id,todo:G,depth:f+1,parentId:l.id,index:Z,siblingCount:U.length,filter:t,editingId:y,editingTitle:c,setEditingTitle:$,beginEdit:A,saveEdit:j,applyTodoAction:F,addChild:J,dragTodoId:Q,setDragTodoId:W,dropTodo:L}))):null)}var NL=Cu(Fl(),1),e0=NL.default.createElement;function qL({title:u,items:l,actions:f,className:r,testId:n}){let i=Array.isArray(l)?l:[];return e0("section",{className:`top-status-bar ${r||""}`,"data-testid":n},e0("div",{className:"top-status-main"},u?e0("strong",{className:"top-status-title"},u):null,e0("div",{className:"top-status-chips"},i.map((t,y)=>e0("span",{key:t?.key||`${t?.label||"status"}-${y}`,className:`top-status-chip ${t?.tone||""}`,"data-testid":t?.testId},t?.label?e0("b",null,t.label):null,e0("span",null,t?.value??"--"))))),f?e0("div",{className:"top-status-actions"},f):null)}var Ic=Cu(Fl(),1);var Nu=Ic.default.createElement,{useEffect:JX,useMemo:QX}=Ic.default,NX=Ic.default.useState;function wL({status:u,children:l,title:f}){let r=String(u||"unknown").toLowerCase();return Nu("span",{className:`status-badge ${r}`,title:f},l||u||"unknown")}function RA({label:u,value:l,hint:f,tone:r}){return Nu("article",{className:`metric-card ${r||""}`},Nu("div",{className:"metric-label"},u),Nu("div",{className:"metric-value"},l),Nu("div",{className:"metric-hint"},f))}function $7({title:u,eyebrow:l,actions:f,children:r,className:n,loading:i}){return Nu("section",{className:`panel ${n||""}`},Nu("div",{className:"panel-head"},Nu("div",null,l?Nu("p",{className:"panel-eyebrow"},l):null,Nu(rl,{title:u,loading:i})),f?Nu("div",{className:"panel-actions"},f):null),Nu("div",{className:"panel-body"},r))}function WL({title:u,data:l,onOpen:f,testId:r}){return Nu("button",{type:"button",className:"ghost-btn","data-testid":r,onClick:()=>f?.(u,l)},"查看原始JSON")}function A7({title:u,text:l}){return Nu("div",{className:"empty-state"},Nu("strong",null,u),Nu("span",null,l))}function Zy(u){return Array.isArray(u)?u:[]}function j7(u){return u&&typeof u==="object"&&!Array.isArray(u)?u:{}}function qX(u){return u?.runtime&&typeof u.runtime==="object"&&!Array.isArray(u.runtime)?u.runtime:{}}function wX(u,l){return`${u}/microservices/k3sctl-adapter/proxy${l}`}function WX(u){return u.find((l)=>String(l?.id||"")==="k3sctl-adapter")||null}function LX(u){if(u?.healthy===!0)return"online";if(String(u?.role||"")==="standby")return"warn";return"failed"}function TX(u){return u?.healthy===!0?"online":"failed"}function KX(u){if(u===!0)return"YES";if(u===!1)return"NO";return"--"}function GX(u){return Array.from(new Set(u.flatMap((l)=>Zy(l?.expectedNodeIds).map((f)=>String(f))))).filter(Boolean).sort()}function zX(u){let l=u.find((f)=>f?.id==="code-queue")||u[0];return String(l?.activeInstanceId||"--")}function EX(u){return Nu("article",{key:u?.id||u?.nodeId,className:"k3s-instance-card"},Nu("div",{className:"node-card-head"},Nu("strong",null,u?.nodeId||u?.id||"--"),Nu(wL,{status:LX(u)},u?.healthy?"HEALTHY":"DEGRADED")),Nu("div",{className:"k3s-instance-role"},Nu("span",null,String(u?.role||"worker").toUpperCase()),Nu("code",null,u?.id||"--")),Nu("dl",{className:"k3s-kv"},Nu("dt",null,"Base URL"),Nu("dd",null,Nu("code",null,u?.baseUrl||"--")),Nu("dt",null,"Proxy"),Nu("dd",null,u?.proxyMode||"--"),Nu("dt",null,"Health"),Nu("dd",null,`${u?.upstreamStatus??"--"} / ${u?.status||"unknown"}`),Nu("dt",null,"Checked"),Nu("dd",null,wu(u?.checkedAt))))}function OX(u,l){let f=Zy(u?.instances),r=j7(u?.active);return Nu($7,{key:u?.id||"service",title:u?.id||"managed-service",eyebrow:`${u?.namespace||"unidesk"} / k3s managed service`,className:"k3s-service-panel",actions:Nu(WL,{title:`k3s service ${u?.id||""}`,data:u,onOpen:l,testId:`raw-k3s-service-${u?.id||"unknown"}`})},Nu("div",{className:"k3s-service-summary"},Nu("div",null,Nu("span",null,"状态"),Nu(wL,{status:TX(u)},u?.status||"unknown")),Nu("div",null,Nu("span",null,"Active"),Nu("strong",null,u?.activeInstanceId||"--")),Nu("div",null,Nu("span",null,"Single Writer"),Nu("strong",null,KX(u?.singleWriter))),Nu("div",null,Nu("span",null,"Active Health"),Nu("strong",null,r?.upstreamStatus??"--"))),f.length===0?Nu(A7,{title:"暂无 k3s 实例",text:"adapter 没有返回该服务的 endpoint 列表"}):Nu("div",{className:"k3s-instance-grid"},f.map(EX)))}function LL({microservices:u,onRaw:l,apiBaseUrl:f,onNavigate:r}){let n=WX(Array.isArray(u)?u:[]),i=qX(n),[t,y]=NX({loading:!1,error:"",data:null,refreshedAt:null});async function c(){y((q)=>({...q,loading:!0,error:""}));try{let q=await Eu(wX(f,"/api/control-plane"));y({loading:!1,error:"",data:q,refreshedAt:new Date})}catch(q){y((N)=>({...N,loading:!1,error:Ou(q,"加载 k3s 控制平面失败")}))}}JX(()=>{c()},[f]);let $=QX(()=>Zy(t.data?.services),[t.data]),A=GX($),j=$.filter((q)=>q?.healthy===!0).length,F=$.reduce((q,N)=>q+Zy(N?.instances).length,0),J=$.reduce((q,N)=>q+Zy(N?.instances).filter((w)=>w?.healthy===!0).length,0),Q=zX($),W=j7(t.data?.kubectl),L=j7(t.data?.kubeApiProxy),U=Zy(t.data?.manifestPaths).map((q)=>String(q));if(!n)return Nu(A7,{title:"k3sctl-adapter 未登记",text:"请在 config.json 的 microservices 中登记 id=k3sctl-adapter,并通过该微服务连接 k3s 控制平面。"});return Nu("div",{className:"k3s-page","data-testid":"k3sctl-page"},Nu($7,{title:"k3s Control Plane",eyebrow:"Managed by k3sctl-adapter",className:"k3s-hero-panel",loading:t.loading,actions:Nu(Ic.default.Fragment,null,Nu("button",{type:"button",className:"ghost-btn",onClick:c,disabled:t.loading,"data-testid":"k3s-refresh-button"},t.loading?"刷新中":"刷新"),r?Nu("button",{type:"button",className:"ghost-btn",onClick:()=>r("apps","code-queue"),"data-testid":"k3s-open-code-queue"},"打开 Code Queue"):null,Nu(WL,{title:"k3sctl-adapter microservice",data:n,onOpen:l,testId:"raw-k3s-adapter"}))},Nu("div",{className:"k3s-hero"},Nu("div",{className:"k3s-orb","aria-hidden":"true"},Nu("span",null,"k3s")),Nu("div",{className:"k3s-hero-copy"},Nu("p",{className:"eyebrow"},"D601 control plane / D518 managed node"),Nu("h2",null,"UniDesk 只管理 adapter;业务微服务交给 k3s 标准服务路由"),Nu("p",{className:"muted paragraph"},"Code Queue 的前端/API 请求进入 k3sctl-adapter,再由 adapter 转发到 k3s active service。provider-gateway 只用于维护 adapter 和节点诊断,不再直接管理 Code Queue 容器。"),Nu("div",{className:"k3s-route-strip"},Nu("span",null,"NO FALLBACK"),Nu("code",null,t.data?.runtimePath||"frontend -> backend-core -> k3sctl-adapter")))),Nu("div",{className:"metric-grid"},Nu(RA,{label:"控制面",value:t.data?.clusterId||"D601",hint:`adapter ${i.providerStatus||"unknown"}`,tone:i.providerStatus==="online"?"ok":"warn"}),Nu(RA,{label:"代管服务",value:$.length,hint:`${j}/${$.length||0} healthy`,tone:j===$.length&&$.length>0?"ok":"warn"}),Nu(RA,{label:"节点",value:A.join(" / ")||"--",hint:"expected k3s nodes"}),Nu(RA,{label:"实例",value:`${J}/${F}`,hint:`active ${Q}`,tone:J===F&&F>0?"ok":"warn"})),Nu("div",{className:"k3s-control-plane-grid"},Nu("article",{className:"k3s-control-plane-card"},Nu("span",null,"service proxy"),Nu("strong",null,L.configured===!0?"K8S API PROXY":"PROXY DEGRADED"),Nu("p",null,L.configured===!0?`${L.mode||"kubernetes-api-service-proxy"} via ${L.connectHost||"--"}`:"adapter 必须通过 k8s API service proxy 访问业务服务,不回退到业务容器直连。")),Nu("article",{className:"k3s-control-plane-card"},Nu("span",null,"manifests"),Nu("strong",null,U.length||"--"),Nu("p",null,U.join(" / ")||"未配置 manifest")),Nu("article",{className:"k3s-control-plane-card"},Nu("span",null,"cluster snapshot"),Nu("strong",null,W.enabled===!0?W.ok===!0?"KUBECTL OK":"KUBECTL DEGRADED":"API ONLY"),Nu("p",null,W.enabled===!0?`nodes ${W.nodeCount??"--"}`:"控制面页面以 adapter 返回的 k8s service proxy 状态为准;kubectl 只作为可选快照。"))),t.error?Nu(nl,{error:t.error}):null,t.refreshedAt?Nu("p",{className:"muted paragraph"},`最近刷新 ${yl(t.refreshedAt)}`):null),$.length===0?Nu($7,{title:"代管服务",eyebrow:"k3s services",loading:t.loading},Nu(A7,{title:"暂无 k3s 服务",text:"等待 k3sctl-adapter 返回 /api/services;Code Queue 切换后这里应显示 D601 和 D518 两个实例。"})):$.map((q)=>OX(q,l)))}var gc=Cu(Fl(),1);var Il=gc.default.createElement;function TL({onClose:u}){let{notifications:l,removeNotification:f,clearNotifications:r}=pf(),n=gc.default.useRef(null);if(gc.default.useEffect(()=>{let i=(t)=>{if(n.current&&!n.current.contains(t.target))u()};return document.addEventListener("mousedown",i),()=>document.removeEventListener("mousedown",i)},[u]),l.length===0)return Il("div",{className:"notification-popup",ref:n},Il("div",{className:"notification-popup-header"},Il("span",null,"通知"),Il("button",{className:"notification-popup-close",onClick:u},"×")),Il("div",{className:"notification-popup-empty"},"暂无通知"));return Il("div",{className:"notification-popup",ref:n},Il("div",{className:"notification-popup-header"},Il("span",null,`通知 (${l.length})`),Il("div",{className:"notification-popup-actions"},Il("button",{className:"notification-popup-clear",onClick:r},"清空"),Il("button",{className:"notification-popup-close",onClick:u},"×"))),Il("div",{className:"notification-popup-list"},l.slice().reverse().map((i)=>Il("div",{key:i.id,className:`notification-item ${i.type}`},Il("span",{className:"notification-item-icon"},i.type==="success"?"✓":"×"),Il("span",{className:"notification-item-message"},i.message),Il("button",{className:"notification-item-dismiss",onClick:()=>f(i.id)},"×")))))}function KL({notification:u}){let{removeNotification:l}=pf();return gc.default.useEffect(()=>{let f=setTimeout(()=>{l(u.id)},3000);return()=>clearTimeout(f)},[u.id,l]),Il("div",{className:`notification-banner ${u.type}`,role:"alert"},Il("span",{className:"notification-banner-icon"},u.type==="success"?"✓":"×"),Il("span",{className:"notification-banner-message"},u.message),Il("button",{className:"notification-banner-dismiss",onClick:()=>l(u.id)},"×"))}function SL(u,l){let f=document.getElementById("root")?.getAttribute(u);if(!f)return l;try{let r=JSON.parse(f);return typeof r==="object"&&r!==null&&!Array.isArray(r)?r:l}catch{return l}}var ku=SL("data-config",{apiBaseUrl:"/api",authUsername:"admin"}),ZX=SL("data-codex-overview",null),_=li.default.createElement,{useEffect:Tn,useMemo:oc}=li.default,bu=li.default.useState,Q7=li.default.createContext(!1),Sr=QN(F3),HX={id:"code-queue",name:"Code Queue",providerId:"D601",description:"Code Queue",repository:{containerName:"k3s:code-queue"},backend:{nodeBaseUrl:"k3s://code-queue",nodeBindHost:"k3s://unidesk/code-queue",nodePort:4222,proxyMode:"k3sctl-adapter-http",public:!1},deployment:{mode:"k3sctl-managed",adapterServiceId:"k3sctl-adapter",k3sServiceId:"code-queue"},runtime:{orchestrator:"k3sctl",providerStatus:"loading",providerName:"D601"}};function GL(){return typeof document>"u"||document.visibilityState!=="hidden"}function BX(u,l){if(u==="ops"&&l==="status")return 5000;if(u==="nodes"&&l==="monitor")return 5000;if(u==="tasks"&&(l==="dispatch"||l==="scheduled"||l==="pending"))return 5000;if(u==="nodes"||u==="ops")return 1e4;if(u==="apps")return 15000;if(u==="tasks")return 15000;return 30000}async function mX(u){if(!u?._summaryOnly||!u?.id)return u;return(await Eu(`${ku.apiBaseUrl}/tasks/${encodeURIComponent(String(u.id))}`))?.task||u}function dc(u){return u?._summaryOnly?{...u,_loadRaw:()=>mX(u)}:u}function an(u){if(!Number.isFinite(u))return"--";let l=Math.max(0,u);if(l===0)return"0s";if(l<0.01)return"<0.01s";if(l<0.1)return`${l.toFixed(2)}s`;if(l<1)return`${l.toFixed(1)}s`;if(l<10&&!Number.isInteger(l))return`${l.toFixed(1)}s`;if(l<60)return`${Math.round(l)}s`;let f=Math.floor(l);if(f<3600)return`${Math.floor(f/60)}m ${f%60}s`;return`${Math.floor(f/3600)}h ${Math.floor(f%3600/60)}m`}function wr(u){let l=Number(u);if(!Number.isFinite(l))return"--";if(l<1)return`${Math.max(0,l).toFixed(1)}ms`;if(l<10)return`${l.toFixed(1)}ms`;if(l<1000)return`${Math.round(l)}ms`;return an(l/1000)}function Ef(u){let l=Number(u);if(!Number.isFinite(l)||l<=0)return"--";let f=["B","KB","MB","GB","TB"],r=l,n=0;while(r>=1024&&n0)return f[r]}return"任务失败但 provider 未返回明确原因"}function di(u){if(u===null||u===void 0)return"--";if(typeof u==="boolean")return u?"是":"否";if(typeof u==="number")return String(u);if(typeof u==="string")return u.length>80?`${u.slice(0,77)}...`:u;if(Array.isArray(u))return`${u.length} 项`;if(typeof u==="object")return`${Object.keys(u).length} 字段`;return String(u)}function DX(u,l){let f=u.replace(/[-_\s]/g,"").toLowerCase(),r=f==="ts"||f.endsWith("at")||f.endsWith("timestamp")||f.endsWith("heartbeat");if((typeof l==="string"||typeof l==="number")&&r){let n=wu(l);if(n!=="--")return n}if(u==="bodyText"&&typeof l==="string")return`${/^\s*[{[]/.test(l)?"JSON":"HTTP"} body ${l.length} chars`;return di(l)}function PL(u){if(!u||typeof u!=="object"||Array.isArray(u))return[];return Object.entries(u)}function lr(u){return String(u).replace(/[^a-zA-Z0-9_-]/g,"_")}function q7(u,l){return u&&typeof u==="object"&&!Array.isArray(u)?u[l]:void 0}function xA(u,l,f="未知"){let r=q7(u?.labels,l);return typeof r==="string"&&r.length>0?r:f}function CL(u){return xA(u,"providerGatewayVersion")}function ac(u){return xA(u,"providerGatewayUpgradePolicy")}function zL(u){return xA(u,"providerGatewayStartedAt","")}function ML(u){let l=q7(u?.labels,"unideskCapabilities");if(typeof l==="string")return l.split(",").map((f)=>f.trim()).filter(Boolean);return Array.isArray(l)?l.filter((f)=>typeof f==="string"):[]}function RL(u,l){return ML(u).includes(l)}function EL(u,l){let f=q7(u?.labels,l);return f===!0||f==="true"||f==="1"}function pX(u){if(!RL(u,"host.ssh"))return{tone:"fail",label:"不可用",detail:"未声明 host.ssh"};if(!EL(u,"hostSshConfigured"))return{tone:"warn",label:"未配置",detail:"缺少 SSH 环境变量"};if(!EL(u,"hostSshKeyPresent"))return{tone:"warn",label:"缺 key",detail:"私钥未挂载"};return{tone:"ok",label:"可用",detail:xA(u,"hostSshTarget","host.ssh ready")}}function SX(u){if(!RL(u,"provider.upgrade"))return{tone:"fail",label:"不可用",detail:"未声明 provider.upgrade"};let l=ac(u);if(l!=="always-enabled")return{tone:"warn",label:"待确认",detail:`策略 ${l}`};return{tone:"ok",label:"可用",detail:"always-enabled"}}function w7(u){let l=typeof u==="string"&&u.length>0?u:"未知";if(l==="未知")return"版本未知";return l.startsWith("v")?l:`v${l}`}function hL(u){return u?.payload&&typeof u.payload==="object"&&!Array.isArray(u.payload)?u.payload:{}}function bA(u){return u?.result&&typeof u.result==="object"&&!Array.isArray(u.result)?u.result:{}}function hA(u){let l=hL(u),f=bA(u);return(l.mode??f.mode)==="schedule"?"schedule":"plan"}function XX(u){let l=hL(u).source;return typeof l==="string"&&l.length>0?l:"unknown"}function YX(u){let l=bA(u),f=l.plan&&typeof l.plan==="object"&&!Array.isArray(l.plan)?l.plan:{},r=l.policy??f.policy;return typeof r==="string"&&r.length>0?r:"--"}function xL(u){let l=bA(u),f=l.plan&&typeof l.plan==="object"&&!Array.isArray(l.plan)?l.plan:{},r=l.targetProviderGatewayVersion??l.providerGatewayVersion??f.targetProviderGatewayVersion??f.providerGatewayVersion;return typeof r==="string"&&r.length>0?w7(r):"版本未知"}function bL(u){if(String(u?.status||"").toLowerCase()==="failed")return YL(u);if(By(u))return"等待 provider 回传升级终态";let f=bA(u);if(typeof f.updaterContainerId==="string"&&f.updaterContainerId.length>0)return`updater ${f.updaterContainerId.slice(0,18)}`;if(typeof f.message==="string"&&f.message.length>0)return f.message;if(f.plan)return"升级计划已生成";return"无升级结果摘要"}function vL(u,l){return u.filter((f)=>f?.providerId===l&&f?.command==="provider.upgrade").sort((f,r)=>(Kn(r.updatedAt)??0)-(Kn(f.updatedAt)??0))}function PX(u){return u.find((l)=>hA(l)==="schedule")||u[0]||null}function kL(u){return u?.runtime&&typeof u.runtime==="object"&&!Array.isArray(u.runtime)?u.runtime:{}}function OL(u){return u?.backend&&typeof u.backend==="object"&&!Array.isArray(u.backend)?u.backend:{}}function CX(u){return u?.repository&&typeof u.repository==="object"&&!Array.isArray(u.repository)?u.repository:{}}function Ll({status:u,children:l}){let f=String(u||"unknown").toLowerCase();return _("span",{className:`status-badge ${f}`},l||u||"unknown")}function jl({label:u,value:l,hint:f,tone:r,onClick:n,testId:i}){let t=typeof n==="function";return _("article",{className:`metric-card ${r||""} ${t?"clickable":""}`,role:t?"button":void 0,tabIndex:t?0:void 0,"data-testid":i,onClick:n,onKeyDown:t?(y)=>{if(y.key==="Enter"||y.key===" ")y.preventDefault(),n()}:void 0},_("div",{className:"metric-label"},u),_("div",{className:"metric-value"},l),_("div",{className:"metric-hint"},f))}function eu({title:u,eyebrow:l,actions:f,children:r,className:n,loading:i}){let t=li.default.useContext(Q7),y=Boolean(i)||t;return _("section",{className:`panel ${n||""}`},_("div",{className:"panel-head"},_("div",null,l?_("p",{className:"panel-eyebrow"},l):null,_(rl,{title:u,loading:y})),f?_("div",{className:"panel-actions"},f):null),_("div",{className:"panel-body"},r))}function gl({title:u,data:l,onOpen:f,testId:r}){let[n,i]=bu(!1),t=l&&typeof l==="object"&&typeof l._loadRaw==="function"?l._loadRaw:null;async function y(){if(!t){f(u,l);return}i(!0);try{f(u,await t())}catch(c){f(u,{ok:!1,error:Ou(c,"读取原始 JSON 失败"),fallback:l})}finally{i(!1)}}return _("button",{type:"button",className:"ghost-btn","data-testid":r,disabled:n,onClick:()=>void y()},n?"读取中":"查看原始JSON")}function MX({raw:u,onClose:l}){if(!u)return null;return _("div",{className:"modal-backdrop",role:"presentation"},_("section",{className:"raw-dialog",role:"dialog","aria-modal":"true","aria-label":u.title},_("div",{className:"raw-dialog-head"},_("h2",null,u.title),_("button",{type:"button",className:"ghost-btn",onClick:l},"关闭")),_("pre",{className:"raw-json","data-testid":"raw-json"},JSON.stringify(u.data,null,2))))}function IL({labels:u,limit:l=8}){let f=PL(u).slice(0,l);if(f.length===0)return _("span",{className:"muted"},"无标签");return _("div",{className:"chip-row"},f.map(([r,n])=>_("span",{key:r,className:"data-chip"},_("b",null,r),_("span",null,di(n)))))}function Hy({node:u}){let l=CL(u);return _("span",{className:`version-chip ${l==="未知"?"unknown":""}`,"data-testid":`gateway-version-${lr(u?.providerId||"unknown")}`},w7(l))}function ZL({title:u,state:l,testId:f}){return _("span",{className:`capability-badge ${l.tone}`,title:l.detail,"data-testid":f},_("b",null,u),_("strong",null,l.label),_("small",null,l.detail))}function W7({node:u}){let l=lr(u?.providerId||"unknown");return _("div",{className:"node-availability-strip"},_(ZL,{title:"SSH 透传",state:pX(u),testId:`ssh-availability-${l}`}),_(ZL,{title:"远程更新",state:SX(u),testId:`upgrade-availability-${l}`}))}function fi({data:u,empty:l="无数据"}){if(u===null||u===void 0)return _("span",{className:"muted"},l);if(typeof u!=="object")return _("span",{className:"summary-value"},di(u));if(Array.isArray(u))return _("span",{className:"summary-value"},`${u.length} 项列表`);let f=Object.entries(u).slice(0,5);if(f.length===0)return _("span",{className:"muted"},l);return _("div",{className:"summary-grid"},f.map(([r,n])=>_("span",{key:r,className:"summary-item"},_("b",null,r),_("span",null,DX(r,n)))))}function Ul({title:u,text:l}){return _("div",{className:"empty-state"},_("strong",null,u),_("span",null,l))}function RX({onLogin:u}){let[l,f]=bu(ku.authUsername||"admin"),[r,n]=bu(""),[i,t]=bu(""),[y,c]=bu(!1);async function $(A){A.preventDefault(),c(!0),t("");try{let j=await Eu("/login",{method:"POST",body:JSON.stringify({username:l,password:r})});u(j)}catch(j){t(Ou(j,"登录失败"))}finally{c(!1)}}return _("main",{className:"login-screen","data-testid":"login-screen"},_("section",{className:"login-card"},_("div",{className:"login-brand"},_("span",{className:"brand-mark"},"UD"),_("div",null,_("h1",null,"UniDesk"),_("p",null,"Control Plane Login"))),_("form",{className:"login-form",onSubmit:$},_("label",null,"账号",_("input",{name:"username",autoComplete:"username",value:l,onChange:(A)=>f(A.target.value)})),_("label",null,"密码",_("input",{name:"password",type:"password",autoComplete:"current-password",value:r,onChange:(A)=>n(A.target.value)})),_(nl,{error:i}),_("button",{type:"submit",disabled:y},y?"登录中":"登录")),_("div",{className:"login-note"},"默认账号由 config.json 注入;公网入口只暴露前端登录面。")))}function hX({connection:u,lastRefresh:l,onRefresh:f,onLogout:r,session:n,clock:i,activeStatusItems:t=[],onNotificationToggle:y,unreadCount:c=0}){let $=[{key:"core",label:"核心",value:u.text,tone:u.ok?"ok":"fail",testId:"conn-text"},...Array.isArray(t)?t:[],{key:"refresh",label:"刷新",value:l?yl(l):"未刷新"},{key:"clock",label:U_,value:yl(i)},{key:"user",label:"用户",value:n?.user?.username||"--",tone:"user"}];return _("header",{className:"topbar"},_("div",null,_("p",{className:"eyebrow"},"Distributed Work Platform"),_("h1",null,"UniDesk 控制平面")),_(qL,{className:"global-top-status",title:"状态",items:$,actions:[_("button",{key:"notification",type:"button",className:`notification-icon-btn ${c>0?"has-unread":""}`,onClick:y,"aria-label":"通知"},"\uD83D\uDD14",c>0?_("span",{key:"badge",className:"notification-badge"},c>99?"99+":c):null),_("button",{key:"refresh",type:"button",className:"ghost-btn",onClick:f},"刷新"),_("button",{key:"logout",type:"button",className:"ghost-btn danger",onClick:r},"退出")]}))}function xX(u){return!u.defaultPrevented&&u.button===0&&!u.metaKey&&!u.altKey&&!u.ctrlKey&&!u.shiftKey&&u.currentTarget.target!=="_blank"}function gL({moduleId:u,tabId:l,className:f,active:r=!1,title:n,testId:i,onNavigate:t,children:y}){let c=U3(Sr,u,l);return _("a",{href:c,role:"button",className:f,title:n,"aria-current":r?"page":void 0,"data-testid":i,"data-route":c,onClick:($)=>{if(!xX($))return;$.preventDefault(),t(u,l)}},y)}function bX({activeModule:u,activeTabs:l,onNavigate:f,collapsed:r,onToggle:n}){return _("aside",{className:`rail ${r?"collapsed":""}`,"aria-label":"主模块"},_("div",{className:"brand"},_("span",{className:"brand-mark"},"UD"),_("span",{className:"brand-text"},"UniDesk"),_("button",{type:"button",className:"rail-toggle",onClick:n,"aria-label":r?"展开左侧边栏":"收起左侧边栏","data-testid":"rail-toggle"},r?"»":"«")),F3.map((i)=>{let t=l[i.id]||fc[i.id]||i.tabs[0]?.id||"";return _(gL,{key:i.id,moduleId:i.id,tabId:t,className:`module ${u===i.id?"active":""}`,active:u===i.id,title:i.label,onNavigate:f},_("span",{className:"module-code"},i.code),_("span",null,i.label))}))}function vX({module:u,activeTab:l,onNavigate:f}){return _("nav",{className:"tabs","aria-label":`${u.label} 子功能`},u.tabs.map((r)=>_(gL,{key:r.id,moduleId:u.id,tabId:r.id,className:`tab ${l===r.id?"active":""}`,active:l===r.id,onNavigate:f},r.label)))}function kX({data:u,onRaw:l,onNavigate:f}){let r=u.overview||{},n=u.nodes.filter((J)=>J.status==="online"),i=u.pendingTasks||u.tasks.filter(By),t=r.pendingTaskCount??i.length,y=u.tasks.slice(0,5),c=r.pgdata||{},$=r.microserviceAvailability||{},A=Ru($.totalCount),j=Ru($.healthyCount),F=Ru($.unhealthyCount);return _("div",{className:"page-grid overview-grid","data-testid":"overview-page"},_(eu,{title:"核心指标",eyebrow:"Control"},_("div",{className:"metric-grid"},_(jl,{label:"数据库",value:r.dbReady?"READY":"WAIT",hint:"PostgreSQL internal network",tone:r.dbReady?"ok":"warn"}),_(jl,{label:"PGDATA",value:Ef(c.databaseBytes),hint:`${c.volumeName||"unidesk_pgdata_10gb"} / ${c.databasePretty||"--"}`,tone:"ok",testId:"pgdata-usage-card"}),_(jl,{label:"在线节点",value:r.onlineNodeCount??0,hint:`${r.nodeCount??0} registered`,tone:"ok"}),_(jl,{label:"WebSocket",value:r.activeSocketCount??0,hint:"Provider ingress sockets"}),_(jl,{label:"用户服务可用",value:A>0?`${j}/${A}`:"--",hint:A>0?`healthyCount ${j} · unhealthyCount ${F}`:"strict /health probes",tone:A>0&&F===0?"ok":"warn",testId:"microservice-availability-card"}),_(jl,{label:"待处理任务",value:t,hint:t>0?"点击查看具体任务":`timeout ${an(Math.floor((r.taskPendingTimeoutMs??0)/1000))}`,tone:t>0?"warn":"ok",onClick:()=>f("tasks","pending"),testId:"pending-task-card"}))),_(eu,{title:"本机 Provider",eyebrow:"Self Connected"},n.length===0?_(Ul,{title:"暂无在线节点",text:"provider-gateway 未完成自接入"}):_("div",{className:"node-card-list"},n.slice(0,4).map((J)=>_(IX,{key:J.providerId,node:J,onRaw:l})))),_(eu,{title:"待处理任务明细",eyebrow:`${t} Pending`,actions:_("button",{type:"button",className:"ghost-btn",onClick:()=>f("tasks","pending"),"data-testid":"pending-task-detail-link"},"进入任务调度")},i.length===0?_(Ul,{title:"当前无待处理",text:"queued / dispatched / running 超时后会自动转为 failed,避免总览长期卡住"}):_("div",{className:"compact-list"},i.slice(0,5).map((J)=>_(VL,{key:J.id,task:J,onRaw:l})))),_(eu,{title:"最近任务",eyebrow:"Dispatch"},y.length===0?_(Ul,{title:"暂无任务",text:"可以在任务调度模块发起 docker.ps 或 echo"}):_("div",{className:"compact-list"},y.map((J)=>_(VL,{key:J.id,task:J,onRaw:l})))))}function IX({node:u,onRaw:l}){return _("article",{className:"node-card"},_("div",{className:"node-card-head"},_("div",null,_("strong",null,u.name),_("code",null,u.providerId)),_(Ll,{status:u.status})),_("div",{className:"node-version-line"},_(Hy,{node:u}),_("span",null,`升级策略 ${ac(u)}`)),_(W7,{node:u}),_(IL,{labels:u.labels,limit:6}),_("div",{className:"node-card-foot"},_("span",null,`心跳 ${wu(u.lastHeartbeat)}`),_(gl,{title:`Provider ${u.providerId}`,data:u,onOpen:l,testId:`raw-node-${lr(u.providerId)}`})))}function gX({events:u,onRaw:l}){return _(eu,{title:"事件摘要",eyebrow:"Latest 100"},u.length===0?_(Ul,{title:"暂无事件",text:"Provider 注册、心跳超时和任务状态会写入事件流"}):_("div",{className:"table-wrap"},_("table",null,_("thead",null,_("tr",null,_("th",null,"ID"),_("th",null,"类型"),_("th",null,"来源"),_("th",null,"摘要"),_("th",null,"时间"),_("th",null,"操作"))),_("tbody",null,u.map((f)=>_("tr",{key:f.id},_("td",null,_("code",null,f.id)),_("td",null,_(Ll,{status:f.type},f.type)),_("td",null,_("code",null,f.source)),_("td",null,_(fi,{data:f.payload})),_("td",null,wu(f.createdAt)),_("td",null,_(gl,{title:`Event ${f.id}`,data:f,onOpen:l}))))))))}function sX({logs:u,onRaw:l}){return _(eu,{title:"服务日志",eyebrow:"Core Recent"},u.length===0?_(Ul,{title:"暂无日志",text:"backend-core 内存日志会在请求和 provider 事件后出现"}):_("div",{className:"log-list"},u.slice(-80).reverse().map((f,r)=>_("article",{key:r,className:`log-row ${f.level||"info"}`},_("span",null,wu(f.ts)),_("b",null,f.level||"info"),_("strong",null,f.message||"log"),_(fi,{data:f.data,empty:"无附加字段"}),_(gl,{title:`Log ${f.message||r}`,data:f,onOpen:l})))))}function aX({nodes:u,onRaw:l}){return _(eu,{title:"节点清单",eyebrow:`${u.length} Providers`},u.length===0?_(Ul,{title:"暂无 Provider 节点",text:"确认 provider-gateway 已连接 provider ingress"}):_("div",{className:"table-wrap"},_("table",{className:"node-list-table"},_("thead",null,_("tr",null,_("th",null,"状态"),_("th",null,"Provider"),_("th",null,"网关版本"),_("th",null,"运维可用性"),_("th",null,"资源标签"),_("th",null,"连接时间"),_("th",null,"最后心跳"),_("th",null,"操作"))),_("tbody",null,u.map((f)=>_("tr",{key:f.providerId},_("td",null,_(Ll,{status:f.status})),_("td",null,_("strong",null,f.name),_("code",null,f.providerId)),_("td",null,_("div",{className:"gateway-cell"},_(Hy,{node:f}),_("span",null,ac(f)))),_("td",null,_(W7,{node:f})),_("td",null,_(IL,{labels:f.labels,limit:5})),_("td",null,wu(f.connectedAt)),_("td",null,wu(f.lastHeartbeat)),_("td",null,_(gl,{title:`Provider ${f.providerId}`,data:f,onOpen:l,testId:`raw-node-table-${lr(f.providerId)}`}))))))))}function oX({nodes:u}){let l=oc(()=>{let f=[];for(let r of u)for(let[n,i]of PL(r.labels))f.push({providerId:r.providerId,name:r.name,key:n,value:i});return f},[u]);return _(eu,{title:"资源标签",eyebrow:"Structured Labels"},l.length===0?_(Ul,{title:"暂无标签",text:"provider-gateway 注册消息会同步资源标签"}):_("div",{className:"label-matrix"},l.map((f)=>_("article",{key:`${f.providerId}-${f.key}`,className:"label-card"},_("span",null,f.key),_("strong",null,di(f.value)),_("code",null,f.providerId)))))}function dX({nodes:u}){return _(eu,{title:"心跳状态",eyebrow:"Provider Liveness"},u.length===0?_(Ul,{title:"无心跳",text:"等待 provider 注册和 heartbeat"}):_("div",{className:"heartbeat-list"},u.map((l)=>_("article",{key:l.providerId,className:"heartbeat-row"},_("span",{className:`pulse ${l.status}`}),_("div",null,_("strong",null,l.name),_("code",null,l.providerId)),_("div",null,_("span",null,"connected"),_("b",null,wu(l.connectedAt))),_("div",null,_("span",null,"last heartbeat"),_("b",null,wu(l.lastHeartbeat)))))))}function eX({nodes:u,systemStatuses:l,tasks:f,onRaw:r,refresh:n}){let[i,t]=bu(""),y=oc(()=>u.map((W)=>{let L=l.find((U)=>U.providerId===W.providerId);return{...W,systemCurrent:L?.current||null,systemHistory:L?.history||[],systemUpdatedAt:L?.updatedAt||null}}),[u,l]),c=y.find((W)=>W.providerId===i)||y[0]||null;if(Tn(()=>{if(!i&&y[0])t(y[0].providerId)},[y.length,i]),!c)return _(Ul,{title:"暂无资源监控",text:"等待 provider 上报 CPU、内存和硬盘指标"});let $=c.systemCurrent,A=c.systemHistory||[],j=$?.cpu||{},F=$?.memory||{},J=$?.disk||{},Q=A.length>0?A:$?[{at:$.collectedAt,cpuPercent:Ru(j.percent),memoryPercent:Ru(F.percent),diskPercent:Ru(J.percent)}]:[];return _("div",{className:"monitor-page","data-testid":"node-monitor-page"},_("div",{className:"docker-node-strip"},y.map((W)=>_("button",{key:W.providerId,type:"button",className:`docker-node-tile ${c.providerId===W.providerId?"active":""}`,onClick:()=>t(W.providerId)},_("span",{className:`pulse ${W.status}`}),_("strong",null,W.name),_("code",null,W.providerId),_("span",null,W.systemCurrent?`CPU ${ui(W.systemCurrent.cpu?.percent)} / MEM ${ui(W.systemCurrent.memory?.percent)}`:"等待指标")))),_("div",{className:"monitor-layout"},_(eu,{title:"任务管理器视图",eyebrow:c.name,className:"monitor-main-panel",actions:$?_(gl,{title:`System ${c.providerId}`,data:{current:$,history:A},onOpen:r}):null},!$?_(Ul,{title:"系统指标未上报",text:"provider-gateway 会周期性采集 /proc 与 df,并保存历史曲线"}):_("div",null,_("div",{className:"monitor-hero"},_("div",null,_("p",{className:"panel-eyebrow"},"Node Performance"),_("h3",null,c.name),_("div",{className:"docker-meta"},_("span",null,`${j.cores||0} CPU cores`),_("span",null,`load ${Ru(j.load1).toFixed(2)} / ${Ru(j.load5).toFixed(2)} / ${Ru(j.load15).toFixed(2)}`),_("span",null,`memory actual ${Ef(F.usedBytes)} / ${Ef(F.totalBytes)}`),_("span",null,`disk ${Ef(J.usedBytes)} / ${Ef(J.totalBytes)}`))),_(Ll,{status:$.ok?"online":"warn"},$.ok?"METRICS READY":"METRICS DEGRADED")),_("div",{className:"monitor-chart-grid"},_(U7,{title:"CPU",metricKey:"cpuPercent",current:j.percent,points:Q,detail:`${j.cores||0} cores / load ${Ru(j.load1).toFixed(2)}`,tone:"cpu",testId:"metric-chart-cpu"}),_(U7,{title:"Memory",metricKey:"memoryPercent",current:F.percent,points:Q,detail:`${Ef(F.usedBytes)} actual / ${Ef(F.cacheBytes)} cache excluded`,tone:"memory",testId:"metric-chart-memory"}),_(U7,{title:"Disk",metricKey:"diskPercent",current:J.percent,points:Q,detail:`${J.path||"/"} mounted ${J.mount||"--"}`,tone:"disk",testId:"metric-chart-disk"})),_("div",{className:"monitor-summary-grid"},_(jl,{label:"CPU 当前",value:ui(j.percent),hint:`history ${Q.length} samples`,tone:"ok"}),_(jl,{label:"实际内存",value:Ef(F.usedBytes),hint:`${ui(F.percent)} 不含缓存`}),_(jl,{label:"硬盘已用",value:Ef(J.usedBytes),hint:ui(J.percent)}),_(jl,{label:"更新时间",value:wu(c.systemUpdatedAt||$.collectedAt),hint:c.providerId})),_(uY,{current:$,onRaw:r}))),_("div",{className:"monitor-side-stack"},_(cY,{provider:c,refresh:n,onRaw:r}),_(_Y,{provider:c,tasks:f,onRaw:r,limit:5}),_(eu,{title:"采样说明",eyebrow:"Retention"},_("div",{className:"monitor-note-list"},_("article",null,_("b",null,"CPU"),_("span",null,"从 /proc/stat 计算相邻采样差值,首个采样用 load/cores 近似")),_("article",null,_("b",null,"Memory"),_("span",null,"实际内存 = MemTotal - MemFree - Buffers - Cached - SReclaimable + Shmem,不把 page cache / buffer 计入占用")),_("article",null,_("b",null,"Disk"),_("span",null,"使用 df -PB1 对配置路径采样,默认监控根文件系统")),_("article",null,_("b",null,"Process"),_("span",null,"从 /proc/[pid] 采集进程 CPU、实际内存 RSS、线程数和磁盘 I/O 速率;表格默认按内存占用降序")))))))}function HL(u,l){if(l==="memory")return Ru(u.rssBytes);if(l==="cpu")return Ru(u.cpuPercent);if(l==="disk")return Ru(u.readBytesPerSecond)+Ru(u.writeBytesPerSecond);if(l==="pid")return Ru(u.pid);if(l==="threads")return Ru(u.threads);if(l==="runtime")return Ru(u.elapsedSeconds);if(l==="user")return String(u.user||"");return String(u.name||u.command||"")}function BL({value:u,label:l,tone:f}){let r=Math.max(1,Math.min(100,Ru(u)));return _("div",{className:`process-meter ${f||""}`},_("span",{style:{width:`${r}%`}}),_("b",null,l))}function uY({current:u,onRaw:l}){let[f,r]=bu({key:"memory",direction:"desc"}),n=li.default.useContext(Q7),i=u?.processSummary&&typeof u.processSummary==="object"?u.processSummary:{},t=Array.isArray(u?.processes)?u.processes:[],y=oc(()=>{let $=f.direction==="asc"?1:-1;return[...t].sort((A,j)=>{let F=HL(A,f.key),J=HL(j,f.key);if(typeof F==="string"||typeof J==="string")return String(F).localeCompare(String(J),"zh-CN")*$;return(F-J)*$||Ru(A.pid)-Ru(j.pid)})},[t,f.key,f.direction]),c=($,A)=>{let j=f.key===A,F=j?f.direction==="asc"?"ascending":"descending":"none";return _("th",{"aria-sort":F},_("button",{type:"button",className:`process-sort-button ${j?"active":""}`,"data-testid":`process-sort-${A}`,onClick:()=>r((J)=>({key:A,direction:J.key===A&&J.direction==="desc"?"asc":"desc"}))},$,_("span",null,j?f.direction==="desc"?"↓":"↑":"↕")))};return _("section",{className:"process-resource-panel","data-testid":"process-resource-panel"},_("div",{className:"process-resource-head"},_("div",null,_("p",{className:"panel-eyebrow"},"Windows Resource Monitor Style"),_(rl,{title:"进程资源占用",level:3,loading:n})),_("div",{className:"process-resource-actions"},_("span",{className:"data-chip"},"默认按内存排序"),_("span",{className:"data-chip"},`${Ru(i.visible,y.length)} / ${Ru(i.total,y.length)} 进程`),_(gl,{title:"Process Resource Snapshot",data:{processSummary:i,processes:t},onOpen:l,testId:"raw-process-resources"}))),y.length===0?_(Ul,{title:"暂无进程资源数据",text:"等待 provider-gateway 上报 /proc/[pid] 采样;旧版 provider 需要先升级到支持进程资源表的版本"}):_("div",{className:"process-table-wrap"},_("table",{className:"process-resource-table","data-testid":"process-resource-table"},_("thead",null,_("tr",null,c("进程","name"),c("PID","pid"),c("用户","user"),_("th",null,"状态"),c("CPU","cpu"),c("内存","memory"),_("th",null,"RSS"),c("磁盘 I/O","disk"),c("线程","threads"),c("运行时长","runtime"))),_("tbody",null,y.map(($)=>{let A=Ru($.readBytesPerSecond)+Ru($.writeBytesPerSecond);return _("tr",{key:`${$.pid}-${$.startedAt}`,"data-testid":`process-row-${lr($.pid)}`,"data-memory-bytes":String(Ru($.rssBytes)),"data-cpu-percent":String(Ru($.cpuPercent)),"data-disk-bps":String(A),"data-pid":String(Ru($.pid))},_("td",null,_("div",{className:"process-name-cell"},_("strong",null,$.name||"--"),_("span",{className:"process-command"},$.command||"--"))),_("td",null,_("code",null,$.pid||"--")),_("td",null,$.user||`uid:${$.uid??"--"}`),_("td",null,_("span",{className:`process-state state-${lr($.state||"unknown")}`},$.state||"?")),_("td",null,_(BL,{value:$.cpuPercent,label:VX($.cpuPercent),tone:"cpu"})),_("td",null,_(BL,{value:$.memoryPercent,label:ui($.memoryPercent),tone:"memory"})),_("td",null,Ef($.rssBytes)),_("td",null,_("div",{className:"process-io-cell"},_("strong",null,F7(A)),_("span",null,`R ${F7($.readBytesPerSecond)} / W ${F7($.writeBytesPerSecond)}`))),_("td",null,$.threads||0),_("td",null,an(Ru($.elapsedSeconds))))})))))}function U7({title:u,metricKey:l,current:f,points:r,detail:n,tone:i,testId:t}){let y=r.map((F)=>Math.max(0,Math.min(100,Ru(F[l])))),c=y.length>1?y:[y[0]||0,y[0]||0],$=c.length<=1?100:100/(c.length-1),A=c.map((F,J)=>`${(J*$).toFixed(2)},${(46-F*0.42).toFixed(2)}`).join(" "),j=`0,48 ${A} 100,48`;return _("article",{className:`metric-chart ${i}`,"data-testid":t},_("div",{className:"metric-chart-head"},_("div",null,_("span",null,u),_("strong",null,ui(f))),_("code",null,`${r.length} pts`)),_("svg",{viewBox:"0 0 100 48",preserveAspectRatio:"none",role:"img","aria-label":`${u} usage curve`},_("polygon",{points:j}),_("polyline",{points:A}),_("line",{x1:"0",x2:"100",y1:"24",y2:"24"})),_("div",{className:"metric-chart-foot"},_("span",null,"0%"),_("span",null,n),_("span",null,"100%")))}function on(u){return Array.isArray(u)?u:[]}function lY(u){let l=on(u?.core?.requests?.componentSummary);return[...on(u?.frontend?.requests?.componentSummary),...l].sort((r,n)=>Ru(n.requestCount)-Ru(r.requestCount))}function fY(u){let l=on(u?.core?.operations?.summary);return[...on(u?.frontend?.operations?.summary),...l].sort((r,n)=>Ru(n.count)-Ru(r.count))}function rY(u){let l=on(u?.core?.requests?.recentFailures).map((r)=>({source:"backend",...r}));return[...on(u?.frontend?.requests?.recentFailures).map((r)=>({source:"frontend",...r})),...l].sort((r,n)=>(Kn(n.at)??0)-(Kn(r.at)??0)).slice(0,20)}function nY(u){let l=on(u?.core?.operations?.recentSlowOperations);return[...on(u?.frontend?.operations?.recentSlowOperations),...l].sort((r,n)=>Ru(n.durationMs)-Ru(r.durationMs)).slice(0,20)}function iY(u){let l=performance.memory,f=Number(l?.usedJSHeapSize);if(Number.isFinite(f)&&f>0)return f;let r=Number(u?.appBundleBytes);if(Number.isFinite(r)&&r>0)return r;return Ru(u?.process?.heapUsedBytes)}function tY({points:u}){let l=on(u),f=l.map((F)=>Ru(F.mb)),r=Math.max(1,...f),n=Math.max(0,Math.min(...f,0)),i=Math.max(1,r-n),t=l.length>1?l:[...l,...l],y=t.length<=1?100:100/(t.length-1),c=t.map((F,J)=>{let Q=Ru(F.mb);return`${(J*y).toFixed(2)},${(48-(Q-n)/i*42).toFixed(2)}`}).join(" "),$=`0,50 ${c} 100,50`,A=l.at(-1),j=l[0];return _("article",{className:"performance-memory-card","data-testid":"performance-memory-chart"},_("div",{className:"performance-memory-head"},_("strong",null,`Bwebui: ${A?`${Ru(A.mb).toFixed(1)}MB`:"--"}`),_("span",null,l.length>0?`${l.length} samples`:"等待采样")),_("svg",{viewBox:"0 0 100 50",preserveAspectRatio:"none",role:"img","aria-label":"Bwebui memory trend"},_("polygon",{points:$}),_("polyline",{points:c}),_("line",{x1:"0",x2:"100",y1:"25",y2:"25"})),_("div",{className:"performance-axis-row"},_("span",null,j?yl(new Date(j.at)):"--"),_("span",null,"时间"),_("span",null,A?yl(new Date(A.at)):"--")),_("div",{className:"performance-axis-row"},_("span",null,`${n.toFixed(1)}`),_("span",null,"(MB)"),_("span",null,`${r.toFixed(1)}`)))}function yY({onRaw:u}){let[l,f]=bu({core:null,frontend:null}),[r,n]=bu([]),[i,t]=bu(""),[y,c]=bu(!1),[$,A]=bu(null),[j,F]=bu(!1);async function J(){c(!0),t("");try{let[D,X]=await Promise.all([Eu(`${ku.apiBaseUrl}/performance`,{cache:"no-store"}),Eu(`${ku.apiBaseUrl}/frontend-performance`,{cache:"no-store"})]);f({core:D,frontend:X});let O=iY(X);n((Y)=>[...Y,{at:new Date().toISOString(),mb:O/1048576}].slice(-80))}catch(D){t(Ou(D,"性能指标加载失败"))}finally{c(!1)}}Tn(()=>{J();let D=setInterval(()=>void J(),5000);return()=>clearInterval(D)},[]);async function Q(){F(!0),t(""),A(null);try{let D=await Eu(`${ku.apiBaseUrl}/code-queue-load-test`,{method:"POST",body:JSON.stringify({targetMs:1000,timeoutMs:90000,url:ku.frontendPublicUrl||window.location.origin})});A(D),J()}catch(D){t(Ou(D,"Code Queue Playwright 测量失败"))}finally{F(!1)}}let W=lY(l),L=rY(l),U=fY(l),q=nY(l),N=l.core?.process||{},w=l.frontend?.process||{},G=l.core?.database?.codeQueueStorage||{},Z=Ru(G.total),H=$?.result||{},E=Ru(H.wallMs,NaN),V=Ru(H.networkIdleMs,NaN),S=H.withinTarget===!0,B=j?"running":$===null?"idle":$.measurementOk===!0?S?"passed":"slow":"failed";return _("div",{className:"performance-page","data-testid":"performance-page"},_("div",{className:"performance-hero"},_("div",null,_("p",{className:"panel-eyebrow"},"Unified Performance"),_(rl,{title:"性能面板",loading:y||j}),_("p",null,"按组件统计 HTTP 请求、失败率、P95 延迟,并汇总 backend/frontend 内部操作耗时。")),_("div",{className:"inline-actions"},_("button",{type:"button",className:"ghost-btn",onClick:()=>void Q(),disabled:j,"data-testid":"code-queue-load-test-button"},j?"测试中...":"测试 Code Queue 加载"),_("button",{type:"button",className:"ghost-btn",onClick:()=>void J(),disabled:y,"data-testid":"performance-refresh-button"},y?"刷新中":"刷新"),_(gl,{title:"Performance Snapshot",data:l,onOpen:u,testId:"raw-performance"}))),_(nl,{error:i}),_("div",{className:"performance-top-grid"},_(tY,{points:r}),_("div",{className:"performance-metric-stack"},_(jl,{label:"backend RSS",value:Ef(N.rssBytes),hint:`heap ${Ef(N.heapUsedBytes)}`}),_(jl,{label:"frontend RSS",value:Ef(w.rssBytes),hint:`bundle ${Ef(l.frontend?.appBundleBytes)}`}),_(jl,{label:"Codex PG 任务",value:Z||"--",hint:G.ok?"unidesk_code_queue_tasks":"等待表初始化",tone:G.ok?"ok":"warn"}),_(jl,{label:"请求样本",value:Ru(l.core?.requests?.sampleCount)+Ru(l.frontend?.requests?.sampleCount),hint:"rolling window 3000"}))),_(eu,{title:"Code Queue 加载基准",eyebrow:"Playwright / target <1s",className:"codex-load-test-panel",loading:j,actions:_("div",{className:"panel-actions"},_("button",{type:"button",className:"primary-btn",onClick:()=>void Q(),disabled:j,"data-testid":"code-queue-load-test-panel-button"},j?"正在运行 Playwright...":"手动触发测试"),$?_(gl,{title:"Code Queue Load Test",data:$,onOpen:u,testId:"raw-code-queue-load-test"}):null)},_("div",{className:"codex-load-test-grid","data-testid":"code-queue-load-test-result"},_(jl,{label:"总耗时",value:j?"运行中":Number.isFinite(E)?wr(E):"--",hint:$===null?"点击按钮启动远端 Playwright":`目标 ${wr(H.targetMs||1000)} / ${H.url||"Code Queue"}`,tone:B==="passed"?"ok":B==="failed"||B==="slow"?"warn":""}),_(jl,{label:"判定",value:j?"RUNNING":B==="passed"?"PASS <1s":B==="slow"?"SLOW":B==="failed"?"FAILED":"--",hint:$?.measurementOk===!1?String($.error||H.error||"measurement failed").slice(0,120):"导航开始 -> DOMContentLoaded -> data-load-state=complete",tone:B==="passed"?"ok":B==="idle"||B==="running"?"":"fail"}),_(jl,{label:"Network idle",value:Number.isFinite(V)?wr(V):"--",hint:`DOMContentLoaded ${wr(H.domContentLoadedMs)} / ${H.networkIdleReached===!1?"未在 5s 内空闲":"已空闲"}`,tone:Number.isFinite(V)&&V<=1000?"ok":"warn"}),_(jl,{label:"组件耗时",value:Number.isFinite(Ru(H.componentLoadMs,NaN))?wr(H.componentLoadMs):"--",hint:`queue ${wr(H.queueMs)} / detail ${wr(H.detailMs)}`,tone:Ru(H.componentLoadMs)>1000?"warn":"ok"}),_(jl,{label:"Trace 规模",value:Number.isFinite(Ru(H.transcriptRows,NaN))?String(H.transcriptRows):"--",hint:`${H.visibleTaskCount??0} visible tasks / ${H.partial?"preview":"complete"}`})),j?_("div",{className:"performance-empty-line"},"正在通过 main-server Host SSH 启动 Playwright,完成后会显示 wall time、组件耗时和最慢 API。"):null,$&&Array.isArray(H.slowestApi)&&H.slowestApi.length>0?_("div",{className:"table-wrap performance-table-wrap compact codex-load-api-table"},_("table",{className:"performance-table"},_("thead",null,_("tr",null,["API","状态","耗时"].map((D)=>_("th",{key:D},D)))),_("tbody",null,H.slowestApi.slice(0,5).map((D,X)=>_("tr",{key:`${D.url}-${X}`},_("td",null,_("code",null,D.url)),_("td",null,D.status),_("td",null,wr(D.durationMs))))))):null),_("div",{className:"performance-grid"},_(eu,{title:"组件汇总",eyebrow:"Requests",loading:y},W.length===0?_(Ul,{title:"暂无请求样本",text:"刷新几次或打开页面后会自动形成组件统计"}):_("div",{className:"table-wrap performance-table-wrap"},_("table",{className:"performance-table"},_("thead",null,_("tr",null,["组件","请求数","失败数","失败率","平均延迟","P95"].map((D)=>_("th",{key:D},D)))),_("tbody",null,W.map((D)=>_("tr",{key:D.component},_("td",null,_("code",null,D.component)),_("td",null,D.requestCount),_("td",null,D.failureCount),_("td",null,ui(Ru(D.failureRate)*100)),_("td",null,wr(D.averageLatencyMs)),_("td",null,wr(D.p95LatencyMs)))))))),_(eu,{title:"最近失败请求",eyebrow:"Failures",loading:y},L.length===0?_("div",{className:"performance-empty-line"},"最近没有失败请求"):_("div",{className:"table-wrap performance-table-wrap compact"},_("table",{className:"performance-table"},_("thead",null,_("tr",null,["时间","来源","组件","状态","路径"].map((D)=>_("th",{key:D},D)))),_("tbody",null,L.map((D,X)=>_("tr",{key:`${D.at}-${X}`},_("td",null,wu(D.at)),_("td",null,D.source),_("td",null,_("code",null,D.component)),_("td",null,_(Ll,{status:"failed"},D.status)),_("td",null,_("code",null,D.path)))))))),_(eu,{title:"内部操作汇总",eyebrow:"Operations",loading:y},U.length===0?_(Ul,{title:"暂无内部操作样本",text:"API 查询和代理请求会自动记录内部操作耗时"}):_("div",{className:"table-wrap performance-table-wrap"},_("table",{className:"performance-table"},_("thead",null,_("tr",null,["服务","操作","次数","平均延迟","P95"].map((D)=>_("th",{key:D},D)))),_("tbody",null,U.map((D)=>_("tr",{key:`${D.service}-${D.operation}`},_("td",null,D.service),_("td",null,_("code",null,D.operation)),_("td",null,D.count),_("td",null,wr(D.averageLatencyMs)),_("td",null,wr(D.p95LatencyMs)))))))),_(eu,{title:"最近慢操作",eyebrow:"Slowest",loading:y},q.length===0?_(Ul,{title:"暂无慢操作",text:"后端会记录最近窗口内耗时最高的内部操作"}):_("div",{className:"table-wrap performance-table-wrap"},_("table",{className:"performance-table"},_("thead",null,_("tr",null,["时间","操作","耗时","结果","细节"].map((D)=>_("th",{key:D},D)))),_("tbody",null,q.map((D,X)=>_("tr",{key:`${D.at}-${D.operation}-${X}`},_("td",null,wu(D.at)),_("td",null,_("code",null,D.operation)),_("td",null,wr(D.durationMs)),_("td",null,D.ok?"成功":"失败"),_("td",null,D.detail||"-")))))))))}function cY({provider:u,refresh:l,onRaw:f}){let[r,n]=bu(""),[i,t]=bu(null),[y,c]=bu("");async function $(A){n(A),c("");try{let j=await Eu(`${ku.apiBaseUrl}/dispatch`,{method:"POST",body:JSON.stringify({providerId:u.providerId,command:"provider.upgrade",payload:{mode:A,source:"frontend-resource-monitor",requestedAt:new Date().toISOString()}})});t({mode:A,...j}),await l()}catch(j){c(Ou(j,"升级命令下发失败"))}finally{n("")}}return _(eu,{title:"Provider Gateway 升级",eyebrow:"Remote Control",loading:Boolean(r)},_("div",{className:"upgrade-control","data-testid":"provider-upgrade-control"},_("p",null,"通过 UniDesk WebSocket 向当前计算节点下发 provider.upgrade;预检只生成升级计划,执行升级会调度节点本地 updater 容器。"),_("div",{className:"upgrade-target-line"},_("span",null,"指定 Provider"),_("code",null,u.providerId),_(Hy,{node:u})),_("div",{className:"upgrade-actions"},_("button",{type:"button",className:"ghost-btn",disabled:Boolean(r),onClick:()=>$("plan"),"data-testid":"upgrade-plan-button"},r==="plan"?"预检中":"预检升级"),_("button",{type:"button",className:"ghost-btn danger",disabled:Boolean(r),onClick:()=>$("schedule"),"data-testid":"upgrade-schedule-button"},r==="schedule"?"调度中":"执行升级")),_(nl,{error:y}),i?_("div",{className:"upgrade-result"},_(Ll,{status:i.status||"queued"},i.status||"queued"),_("span",null,`${i.mode==="schedule"?"执行升级":"预检升级"} 已下发`),_("span",null,`指定版本 ${w7(CL(u))}`),_("code",null,i.taskId||"--"),_(gl,{title:"Provider Upgrade Dispatch",data:i,onOpen:f})):_("span",{className:"muted"},"升级任务结果会进入任务历史;执行升级可能导致 provider 短暂重连。")))}function sL({records:u,onRaw:l,compact:f=!1}){if(u.length===0)return _(Ul,{title:"暂无远程更新记录",text:"该节点还没有 provider.upgrade 任务;执行预检或升级后会在这里形成结构化记录"});return _("div",{className:`upgrade-record-table-wrap table-wrap ${f?"compact":""}`},_("table",{className:"upgrade-record-table"},_("thead",null,_("tr",null,_("th",null,"状态"),_("th",null,"模式"),_("th",null,"任务"),_("th",null,"来源"),_("th",null,"耗时"),_("th",null,"策略"),_("th",null,"Gateway 版本"),_("th",null,"结果记录"),_("th",null,"更新时间"),_("th",null,"操作"))),_("tbody",null,u.map((r)=>_("tr",{key:r.id,"data-testid":`gateway-upgrade-record-${lr(r.id)}`},_("td",null,_(Ll,{status:r.status})),_("td",null,_("span",{className:`mode-chip ${hA(r)}`},hA(r)==="schedule"?"执行升级":"预检")),_("td",null,_("strong",null,"provider.upgrade"),_("code",null,r.id)),_("td",null,XX(r)),_("td",null,_(oL,{task:r})),_("td",null,YX(r)),_("td",null,_("span",{className:"version-chip"},xL(r))),_("td",null,_("span",{className:`upgrade-outcome ${String(r.status||"").toLowerCase()}`},bL(r))),_("td",null,wu(r.updatedAt)),_("td",null,_(gl,{title:`Provider Upgrade Task ${r.id}`,data:dc(r),onOpen:l})))))))}function _Y({provider:u,tasks:l,onRaw:f,limit:r=5}){let n=vL(l,u.providerId).slice(0,r);return _(eu,{title:"远程更新记录",eyebrow:u.providerId,actions:_(Hy,{node:u}),className:"provider-upgrade-records-panel"},_("div",{"data-testid":`provider-upgrade-records-${lr(u.providerId)}`},_(sL,{records:n,onRaw:f,compact:!0})))}function $Y({nodes:u,tasks:l,onRaw:f}){let r=oc(()=>u.map((i)=>{let t=vL(l,i.providerId);return{node:i,records:t,latest:PX(t),capabilities:ML(i)}}),[u,l]),n=r.reduce((i,t)=>i+t.records.length,0);return _("div",{className:"gateway-page","data-testid":"gateway-version-page"},_(eu,{title:"Provider Gateway 版本",eyebrow:`${u.length} Providers / ${n} 更新记录`},u.length===0?_(Ul,{title:"暂无 Provider 节点",text:"等待 provider-gateway 注册后显示版本号和升级记录"}):_("div",{className:"table-wrap gateway-version-table-wrap"},_("table",{className:"gateway-version-table"},_("thead",null,_("tr",null,_("th",null,"状态"),_("th",null,"Provider"),_("th",null,"Gateway 版本"),_("th",null,"升级策略"),_("th",null,"运维可用性"),_("th",null,"运行时间"),_("th",null,"能力"),_("th",null,"最近远程更新"),_("th",null,"操作"))),_("tbody",null,r.map((i)=>_("tr",{key:i.node.providerId},_("td",null,_(Ll,{status:i.node.status})),_("td",null,_("strong",null,i.node.name),_("code",null,i.node.providerId)),_("td",null,_(Hy,{node:i.node})),_("td",null,ac(i.node)),_("td",null,_(W7,{node:i.node})),_("td",null,zL(i.node)?wu(zL(i.node)):"待新版上报"),_("td",null,_("div",{className:"capability-row"},i.capabilities.length===0?_("span",{className:"muted"},"未声明"):i.capabilities.slice(0,5).map((t)=>_("span",{key:t,className:"data-chip"},t)))),_("td",null,i.latest?_("div",{className:"latest-upgrade-cell"},_(Ll,{status:i.latest.status}),_("span",null,`${hA(i.latest)==="schedule"?"执行升级":"预检"} / ${wu(i.latest.updatedAt)}`),_("small",null,`Gateway ${xL(i.latest)}`),_("small",null,bL(i.latest))):_("span",{className:"muted"},"暂无记录")),_("td",null,_(gl,{title:`Provider ${i.node.providerId}`,data:i.node,onOpen:f})))))))),_(eu,{title:"远程更新记录",eyebrow:"Structured provider.upgrade records"},u.length===0?_(Ul,{title:"暂无记录",text:"没有 provider 节点时不会生成远程更新记录"}):_("div",{className:"gateway-record-grid"},r.map((i)=>_("article",{key:i.node.providerId,className:"gateway-record-card","data-testid":`gateway-records-${lr(i.node.providerId)}`},_("div",{className:"gateway-record-head"},_("div",null,_("strong",null,i.node.name),_("code",null,i.node.providerId)),_(Hy,{node:i.node})),_("div",{className:"gateway-record-meta"},_("span",null,`心跳 ${wu(i.node.lastHeartbeat)}`),_("span",null,`策略 ${ac(i.node)}`),_("span",null,`${i.records.length} 条记录`)),_(sL,{records:i.records.slice(0,8),onRaw:f,compact:!0}))))))}function AY(u){if(u==="running")return"online";if(u==="paused"||u==="restarting")return"warn";if(u==="exited"||u==="dead")return"offline";return"internal"}function aL(u){return/^[a-f0-9]{48,64}$/i.test(u)}function sc(u){let l=String(u?.name||""),f=String(u?.labels||"");return l==="unidesk_pgdata_10gb"||f.includes("com.docker.compose.volume=unidesk_pgdata_10gb")||l.toLowerCase().includes("pgdata")}function mL(u){let l=String(u?.name||""),f=String(u?.labels||"");if(sc(u))return 0;if(f.includes("com.docker.compose.project=unidesk"))return 1;if(!aL(l))return 2;return 3}function jY(u){return[...u].sort((l,f)=>{let r=mL(l)-mL(f);if(r!==0)return r;return String(l.name||"").localeCompare(String(f.name||""))})}function FY({nodes:u,dockerStatuses:l,onRaw:f}){let[r,n]=bu(""),i=oc(()=>u.map((q)=>{let N=l.find((w)=>w.providerId===q.providerId);return{...q,dockerStatus:N?.dockerStatus||null,dockerUpdatedAt:N?.updatedAt||null}}),[u,l]),t=i.find((q)=>q.providerId===r)||i[0]||null;if(Tn(()=>{if(!r&&i[0])n(i[0].providerId)},[i.length,r]),!t)return _(Ul,{title:"暂无 Docker 节点",text:"等待 provider 上报 Docker daemon 状态"});let y=t.dockerStatus,c=t.providerId==="main-server",$=y?.counts||{},A=y?.daemon||{},j=y?.containers||[],F=y?.images||[],J=jY(y?.volumes||[]),Q=c?J.find(sc):null,W=y?.networks||[],L=j.filter((q)=>q.state==="running"),U=j.filter((q)=>q.state!=="running");return _("div",{className:"docker-page","data-testid":"docker-status-page"},_("div",{className:"docker-node-strip"},i.map((q)=>_("button",{key:q.providerId,type:"button",className:`docker-node-tile ${t.providerId===q.providerId?"active":""}`,onClick:()=>n(q.providerId)},_("span",{className:`pulse ${q.status}`}),_("strong",null,q.name),_("code",null,q.providerId),_("span",null,q.dockerStatus?`Docker ${q.dockerStatus.ok?"ready":"degraded"}`:"等待上报")))),_("div",{className:"docker-layout"},_(eu,{title:"Docker Desktop 视图",eyebrow:t.name,className:"docker-main-panel",actions:y?_(gl,{title:`Docker ${t.providerId}`,data:y,onOpen:f}):null},!y?_(Ul,{title:"Docker 状态未上报",text:"provider-gateway 会在连接后周期性采集 docker info / ps / images / volume / network"}):_("div",null,_("div",{className:"docker-hero"},_("div",null,_("p",{className:"panel-eyebrow"},"Daemon"),_("h3",null,A.name||t.providerId),_("div",{className:"docker-meta"},_("span",null,A.serverVersion?`Engine ${A.serverVersion}`:"Engine --"),_("span",null,A.operatingSystem||"OS --"),_("span",null,A.architecture||"arch --"),_("span",null,`${A.cpus||0} CPU / ${Ef(A.memoryBytes)}`))),_(Ll,{status:y.ok?"online":"warn"},y.ok?"Docker Ready":"Docker Degraded")),_("div",{className:"docker-metrics"},_(jl,{label:"Containers",value:$.containers??j.length,hint:`${$.running??L.length} running / ${$.stopped??U.length} stopped`,tone:"ok"}),_(jl,{label:"Images",value:$.images??F.length,hint:`${$.daemonImages??$.images??F.length} daemon images`}),_(jl,{label:"Volumes",value:$.volumes??J.length,hint:c?Q?"database volume visible":"database volume missing":"node local volumes",tone:Q?"ok":""}),_(jl,{label:"Networks",value:$.networks??W.length,hint:A.driver?`driver ${A.driver}`:"docker networks"})),c?_(UY,{volume:Q,volumeCount:J.length}):null,_("div",{className:"docker-section-head"},_("h3",null,"Containers"),_("span",null,`updated ${wu(t.dockerUpdatedAt||y.collectedAt)}`)),_("div",{className:"docker-container-table table-wrap","data-testid":"docker-container-table"},_("table",null,_("thead",null,_("tr",null,_("th",null,"状态"),_("th",null,"容器"),_("th",null,"镜像"),_("th",null,"端口"),_("th",null,"运行时间"),_("th",null,"重启策略"),_("th",null,"PID"),_("th",null,"大小"))),_("tbody",null,j.length===0?_("tr",null,_("td",{colSpan:8},"暂无容器")):j.map((q)=>_("tr",{key:`${q.id}-${q.name}`},_("td",null,_(Ll,{status:AY(q.state)},q.state||"unknown")),_("td",null,_("strong",null,q.name||"--"),_("code",null,q.id||"--")),_("td",null,q.image||"--"),_("td",null,q.ports||_("span",{className:"muted"},"未发布")),_("td",null,q.runningFor||q.status||"--"),_("td",null,q.restartPolicy?_(Ll,{status:q.restartPolicy==="always"?"online":"warn"},q.restartPolicy):"--"),_("td",null,q.pidMode?_("code",null,q.pidMode):"--"),_("td",null,q.size||"--")))))))),_("div",{className:"docker-side-stack"},_(J7,{title:"Images",items:F,render:(q)=>_("article",{key:`${q.id}-${q.repository}`,className:"docker-side-row"},_("strong",null,`${q.repository}:${q.tag}`),_("span",null,q.size||"--"),_("code",null,q.id||"--"))}),_(J7,{title:"Volumes",items:J,limit:J.length,render:(q)=>_("article",{key:q.name,className:`docker-side-row volume-row ${c&&sc(q)?"database-volume":""}`,"data-testid":c&&sc(q)?"database-volume-row":void 0},_("strong",null,q.name),_("span",null,c&&sc(q)?"PostgreSQL":aL(String(q.name||""))?"anonymous":"named"),_("code",null,q.mountpoint||q.driver||q.scope||"--"))}),_(J7,{title:"Networks",items:W,render:(q)=>_("article",{key:q.id||q.name,className:"docker-side-row"},_("strong",null,q.name),_("span",null,q.driver||"--"),_("code",null,q.id||"--"))}))))}function UY({volume:u,volumeCount:l}){return _("section",{className:`docker-volume-focus ${u?"ready":"missing"}`,"data-testid":"database-volume-card"},_("div",{className:"volume-focus-head"},_("span",{className:"panel-eyebrow"},"Database Named Volume"),_(Ll,{status:u?"online":"warn"},u?"FOUND":"MISSING")),u?_("div",{className:"volume-focus-body"},_("strong",null,u.name),_("span",null,"PostgreSQL data volume for unidesk-database"),_("div",{className:"volume-route"},_("code",null,u.mountpoint||"/var/lib/docker/volumes/unidesk_pgdata_10gb/_data"),_("span",null,"->"),_("code",null,"unidesk-database:/var/lib/postgresql/data")),_("div",{className:"docker-meta compact"},_("span",null,`driver ${u.driver||"--"}`),_("span",null,`scope ${u.scope||"--"}`),_("span",null,`${l} volumes reported`))):_("div",{className:"volume-focus-body"},_("strong",null,"unidesk_pgdata_10gb"),_("span",null,"当前 Docker 快照没有发现数据库命名卷;请检查 provider-gateway 的 Docker volume 上报。")))}function J7({title:u,items:l,render:f,limit:r}){let n=l.slice(0,r??12),i=Math.max(0,l.length-n.length);return _(eu,{title:u,eyebrow:`${l.length} items`,className:"docker-side-panel"},l.length===0?_(Ul,{title:`暂无 ${u}`,text:"等待 Docker 状态采集"}):_("div",{className:"docker-side-list"},n.map(f),i>0?_("div",{className:"docker-side-more"},`+ ${i} more`):null))}function JY({microservices:u,onRaw:l,onNavigate:f}){let r=u.filter((n)=>OL(n).public===!1);return _("div",{className:"microservice-page","data-testid":"microservice-catalog-page"},_(eu,{title:"用户服务目录",eyebrow:"Provider Mounted User Services"},_("div",{className:"metric-grid"},_(jl,{label:"服务总数",value:u.length,hint:"config.json 用户服务登记"}),_(jl,{label:"私有后端",value:r.length,hint:"不直接暴露公网",tone:"ok"}),_(jl,{label:"D601 服务",value:u.filter((n)=>n.providerId==="D601").length,hint:"compute-node docker"}),_(jl,{label:"集成前端",value:u.filter((n)=>n.frontend?.integrated).length,hint:"UniDesk React 页面"}))),_(eu,{title:"服务映射",eyebrow:"Repo Reference + Runtime"},u.length===0?_(Ul,{title:"暂无用户服务",text:"在 config.json 的 microservices 中登记用户服务的 provider、仓库引用和后端映射"}):_("div",{className:"table-wrap"},_("table",{className:"microservice-table"},_("thead",null,_("tr",null,_("th",null,"服务"),_("th",null,"Provider"),_("th",null,"代码引用"),_("th",null,"Docker 引用"),_("th",null,"后端映射"),_("th",null,"开发入口"),_("th",null,"运行态"),_("th",null,"操作"))),_("tbody",null,u.map((n)=>{let i=kL(n),t=CX(n),y=OL(n),c=i.availability||{},$=c.status||(i.providerStatus==="online"?"unknown":"unhealthy");return _("tr",{key:n.id,"data-testid":`microservice-row-${lr(n.id)}`},_("td",null,_("strong",null,n.name),_("code",null,n.id)),_("td",null,_("strong",null,i.providerName||n.providerId),_("code",null,n.providerId)),_("td",null,_("span",null,t.url||"--"),_("code",null,t.commitId||"--")),_("td",null,_("span",null,t.composeFile||"--"),_("code",null,`${t.composeService||"--"} / ${t.containerName||"--"}`)),_("td",null,_(Ll,{status:y.public?"warn":"online"},y.public?"public":"private"),_("code",null,`${y.nodeBindHost||"--"}:${y.nodePort||"--"} -> ${y.proxyMode||"--"}`)),_("td",null,_("span",null,n.development?.sshPassthrough?"SSH 透传":"未配置"),_("code",null,n.development?.worktreePath||"--")),_("td",null,_(Ll,{status:$==="healthy"?"online":$==="unknown"?"warn":"failed"},$),_("span",null,c.reason||i.providerStatus||"unknown"),_(fi,{data:i.container,empty:"容器快照未上报"})),_("td",null,_("div",{className:"microservice-actions"},n.id==="findjob"?_("button",{type:"button",className:"ghost-btn",onClick:()=>f("apps","findjob"),"data-testid":"open-findjob-button"},"打开"):null,n.id==="pipeline"?_("button",{type:"button",className:"ghost-btn",onClick:()=>f("apps","pipeline"),"data-testid":"open-pipeline-button"},"打开"):null,n.id==="todo-note"?_("button",{type:"button",className:"ghost-btn",onClick:()=>f("apps","todo-note"),"data-testid":"open-todo-note-button"},"打开"):null,n.id==="met-nonlinear"?_("button",{type:"button",className:"ghost-btn",onClick:()=>f("apps","met-nonlinear"),"data-testid":"open-met-nonlinear-button"},"打开"):null,n.id==="claudeqq"?_("button",{type:"button",className:"ghost-btn",onClick:()=>f("apps","claudeqq"),"data-testid":"open-claudeqq-button"},"打开"):null,n.id==="baidu-netdisk"?_("button",{type:"button",className:"ghost-btn",onClick:()=>f("apps","baidu-netdisk"),"data-testid":"open-baidu-netdisk-button"},"打开"):null,n.id==="oa-event-flow"?_("button",{type:"button",className:"ghost-btn",onClick:()=>f("apps","oa-event-flow"),"data-testid":"open-oa-event-flow-button"},"打开"):null,n.id==="k3sctl-adapter"?_("button",{type:"button",className:"ghost-btn",onClick:()=>f("apps","k3sctl"),"data-testid":"open-k3sctl-button"},"打开"):null,n.id==="code-queue"?_("button",{type:"button",className:"ghost-btn",onClick:()=>f("apps","code-queue"),"data-testid":"open-code-queue-button"},"打开"):null,n.id==="mdtodo"?_("button",{type:"button",className:"ghost-btn",onClick:()=>f("apps","mdtodo"),"data-testid":"open-mdtodo-button"},"打开"):null,n.id==="project-manager"?_("button",{type:"button",className:"ghost-btn",onClick:()=>f("apps","project-manager"),"data-testid":"open-project-manager-button"},"打开"):null,_(gl,{title:`用户服务 ${n.id}`,data:n,onOpen:l}))))}))))))}function QY({nodes:u,onDispatched:l,onRaw:f}){let r=u.filter((B)=>B.status==="online"),[n,i]=bu(r[0]?.providerId||u[0]?.providerId||""),[t,y]=bu("docker.ps"),[c,$]=bu("frontend"),[A,j]=bu("operator-check"),[F,J]=bu("normal"),[Q,W]=bu(!1),[L,U]=bu(""),[q,N]=bu(!1),[w,G]=bu(null),[Z,H]=bu("");Tn(()=>{if(!n&&(r[0]?.providerId||u[0]?.providerId))i(r[0]?.providerId||u[0].providerId)},[u.length,r.length,n]);function E(){return{source:c,note:A,priority:F}}function V(){U(JSON.stringify(E(),null,2)),W(!0)}async function S(B){B.preventDefault(),N(!0),H("");try{let D=Q?JSON.parse(L||"{}"):E(),X=await Eu(`${ku.apiBaseUrl}/dispatch`,{method:"POST",body:JSON.stringify({providerId:n,command:t,payload:D})});G(X),await l()}catch(D){H(Ou(D,"下发失败"))}finally{N(!1)}}return _("div",{className:"page-grid dispatch-grid"},_(eu,{title:"下发任务",eyebrow:"Real WebSocket Dispatch"},_("form",{className:"dispatch-form",onSubmit:S},_("label",null,"Provider",_("select",{value:n,onChange:(B)=>i(B.target.value)},u.map((B)=>_("option",{key:B.providerId,value:B.providerId},`${B.name} / ${B.providerId}`)))),_("label",null,"Command",_("select",{value:t,onChange:(B)=>y(B.target.value)},_("option",{value:"docker.ps"},"docker.ps"),_("option",{value:"host.ssh"},"host.ssh"),_("option",{value:"microservice.http"},"microservice.http"),_("option",{value:"echo"},"echo"))),_("label",null,"来源",_("input",{value:c,onChange:(B)=>$(B.target.value)})),_("label",null,"备注",_("input",{value:A,onChange:(B)=>j(B.target.value)})),_("label",null,"优先级",_("select",{value:F,onChange:(B)=>J(B.target.value)},_("option",{value:"normal"},"normal"),_("option",{value:"low"},"low"),_("option",{value:"urgent"},"urgent"))),_("div",{className:"dispatch-actions"},_("button",{type:"button",className:"ghost-btn",onClick:V},"查看原始JSON"),_("button",{type:"submit",disabled:q||!n},q?"下发中":"下发任务")),Q?_("label",{className:"raw-editor-label"},"高级 Payload",_("textarea",{className:"raw-editor",value:L,onChange:(B)=>U(B.target.value)})):null,_(nl,{error:Z,wide:!0}))),_(eu,{title:"下发结果",eyebrow:"Response"},w?_("div",{className:"result-card"},_(Ll,{status:w.status||"queued"},w.status||"queued"),_("dl",null,_("dt",null,"Task ID"),_("dd",null,_("code",null,w.taskId||"--")),_("dt",null,"Provider 在线"),_("dd",null,di(w.providerOnline))),_(gl,{title:"Dispatch Response",data:w,onOpen:f})):_(Ul,{title:"等待操作",text:"任务响应会以结构化结果卡展示"})))}function VL({task:u,onRaw:l}){return _("article",{className:"compact-row"},_(Ll,{status:u.status}),_("div",null,_("strong",null,u.command),_("code",null,u.id)),_("span",null,By(u)?`已等待 ${N7(u.updatedAt)}`:`耗时 ${an(XL(u)??0)}`),_(gl,{title:`Task ${u.id}`,data:dc(u),onOpen:l}))}function oL({task:u}){let l=XL(u),f=By(u);return _("div",{className:"task-duration"},_("strong",null,l===null?"--":an(l)),_("span",null,f?`已运行 / 创建 ${wu(u.createdAt)}`:`创建 ${wu(u.createdAt)}`))}function NY({task:u}){let l=String(u?.status||"").toLowerCase(),f=u?.result,r=f&&typeof f==="object"&&!Array.isArray(f)?f:{},i=["exitCode","code","signal","timeoutMs","previousStatus","mode"].filter((t)=>r[t]!==void 0&&r[t]!==null);if(l==="failed"){let t=YL(u);return _("div",{className:"task-diagnostic failed"},_("b",null,"失败原因"),_("span",{className:"diagnostic-reason"},di(t)),i.length>0?_("div",{className:"diagnostic-meta"},i.map((y)=>_("span",{key:y,className:"data-chip"},_("b",null,y),_("span",null,di(r[y]))))):null)}if(By(u))return _("div",{className:"task-diagnostic warn"},_("b",null,"等待终态"),_("span",null,`最后更新 ${N7(u.updatedAt)} 前`));return _("div",{className:"task-diagnostic ok"},_("b",null,"完成摘要"),_(fi,{data:f,empty:"无执行输出"}))}function qY({tasks:u,onRaw:l}){let f=u.filter(By);return _("div",{"data-testid":"pending-task-page"},_(eu,{title:"待处理任务",eyebrow:`${f.length} Pending`},f.length===0?_(Ul,{title:"当前无待处理任务",text:"queued / dispatched / running 会在超时后自动转为 failed;历史记录仍可在任务历史中查看"}):_("div",{className:"table-wrap","data-testid":"pending-task-table"},_("table",null,_("thead",null,_("tr",null,_("th",null,"状态"),_("th",null,"任务"),_("th",null,"Provider"),_("th",null,"已等待"),_("th",null,"载荷摘要"),_("th",null,"操作"))),_("tbody",null,f.map((r)=>_("tr",{key:r.id},_("td",null,_(Ll,{status:r.status})),_("td",null,_("strong",null,r.command),_("code",null,r.id)),_("td",null,_("code",null,r.providerId)),_("td",null,N7(r.updatedAt)),_("td",null,_(fi,{data:r.payload})),_("td",null,_(gl,{title:`Pending Task ${r.id}`,data:dc(r),onOpen:l})))))))))}function wY({tasks:u,onRaw:l}){return _("div",{"data-testid":"task-history-page"},_(eu,{title:"任务历史",eyebrow:`${u.length} Tasks`},u.length===0?_(Ul,{title:"暂无任务",text:"下发任务后会在这里看到生命周期"}):_("div",{className:"table-wrap"},_("table",{className:"task-history-table"},_("thead",null,_("tr",null,_("th",null,"状态"),_("th",null,"任务"),_("th",null,"Provider"),_("th",null,"任务耗时"),_("th",null,"载荷摘要"),_("th",null,"诊断信息"),_("th",null,"更新时间"),_("th",null,"操作"))),_("tbody",null,u.map((f)=>_("tr",{key:f.id,"data-testid":`task-row-${lr(f.id)}`},_("td",null,_(Ll,{status:f.status})),_("td",null,_("strong",null,f.command),_("code",null,f.id)),_("td",null,_("code",null,f.providerId)),_("td",null,_(oL,{task:f})),_("td",null,_(fi,{data:f.payload})),_("td",null,_(NY,{task:f})),_("td",null,wu(f.updatedAt)),_("td",null,_(gl,{title:`Task ${f.id}`,data:dc(f),onOpen:l})))))))))}function WY({tasks:u,onRaw:l}){let f=u.filter((r)=>["succeeded","failed"].includes(r.status));return _(eu,{title:"执行结果",eyebrow:"Finished Tasks"},f.length===0?_(Ul,{title:"暂无结果",text:"任务完成后展示 provider 返回的结构化摘要"}):_("div",{className:"result-grid"},f.map((r)=>_("article",{key:r.id,className:"result-card"},_("div",{className:"node-card-head"},_("strong",null,r.command),_(Ll,{status:r.status})),_("code",null,r.id),_(fi,{data:r.result,empty:"无执行输出"}),_(gl,{title:`Task Result ${r.id}`,data:dc(r),onOpen:l})))))}function LY(u){if(!u||typeof u!=="object")return"--";if(u.type==="interval")return`每 ${an(Number(u.everySeconds||0))}`;return`每天 ${u.timeOfDay||"03:00"} UTC`}function TY(u){if(!u||typeof u!=="object")return"--";if(u.type==="pgdata_backup")return`PGDATA -> ${u.remoteBaseDir||"/SERVER_DATA/UNIDESK_PG_DATA"}`;if(u.type==="dispatch")return`${u.providerId||"--"} / ${u.command||"--"}`;return String(u.type||"--")}function KY(u){let l=String(u||"").toLowerCase();if(l==="succeeded")return"online";if(l==="failed")return"failed";if(l==="running"||l==="queued")return"warn";return l}function GY(u){let l=Number(u?.durationMs);if(Number.isFinite(l)&&l>=0)return an(l/1000);let f=Kn(u?.startedAt||u?.createdAt);if(f===null)return"--";let n=Kn(u?.finishedAt)??Date.now();return an(Math.max(0,(n-f)/1000))}function DL(u){return{id:"unidesk-pgdata-baidu-daily",name:"PGDATA daily Baidu Netdisk backup",description:"Daily PostgreSQL physical base backup uploaded to Baidu Netdisk /SERVER_DATA with monthly rotation.",enabled:!0,timeOfDay:"03:30",actionType:"pgdata_backup",providerId:u[0]?.providerId||"main-server",command:"echo",payloadJson:JSON.stringify({source:"scheduled-task",message:"hello from scheduler"},null,2),remoteBaseDir:"/SERVER_DATA/UNIDESK_PG_DATA",stagingSubdir:"server-data/unidesk-pg-data",timeoutMs:"3600000"}}function zY({schedules:u,scheduleRuns:l,nodes:f,refresh:r,onRaw:n}){let[i,t]=bu(DL(f||[])),[y,c]=bu(!1),[$,A]=bu(""),[j,F]=bu(""),J=[...l||[]].sort((w,G)=>(Kn(G.updatedAt)??0)-(Kn(w.updatedAt)??0));function Q(w,G){t((Z)=>({...Z,[w]:G}))}function W(w){let G=w?.action||{};t({id:w?.id||"",name:w?.name||"",description:w?.description||"",enabled:w?.enabled!==!1,timeOfDay:w?.schedule?.timeOfDay||"03:30",actionType:G.type||"dispatch",providerId:G.providerId||f[0]?.providerId||"main-server",command:G.command||"echo",payloadJson:JSON.stringify(G.payload||{source:"scheduled-task"},null,2),remoteBaseDir:G.remoteBaseDir||"/SERVER_DATA/UNIDESK_PG_DATA",stagingSubdir:G.stagingSubdir||"server-data/unidesk-pg-data",timeoutMs:String(G.timeoutMs||3600000)}),F(`正在编辑 ${w?.id||""}`)}function L(){let w={id:i.id,name:i.name,description:i.description,enabled:i.enabled,concurrencyPolicy:"skip",schedule:{type:"daily",timeOfDay:i.timeOfDay,timezone:"Etc/UTC"}};if(i.actionType==="pgdata_backup")return{...w,action:{type:"pgdata_backup",volumeName:"unidesk_pgdata_10gb",remoteBaseDir:i.remoteBaseDir,stagingSubdir:i.stagingSubdir,timeoutMs:Number(i.timeoutMs)||3600000,cleanupLocal:!0}};return{...w,action:{type:"dispatch",providerId:i.providerId,command:i.command,payload:JSON.parse(i.payloadJson||"{}"),timeoutMs:Number(i.timeoutMs)||600000}}}async function U(w){w.preventDefault(),c(!0),A(""),F("");try{let G=L(),Z=encodeURIComponent(String(G.id));await Eu(`${ku.apiBaseUrl}/schedules/${Z}`,{method:"PUT",body:JSON.stringify(G)}),F("定时任务已保存"),await r()}catch(G){A(Ou(G,"保存定时任务失败"))}finally{c(!1)}}async function q(w){if(!w?.id)return;c(!0),A(""),F("");try{await Eu(`${ku.apiBaseUrl}/schedules/${encodeURIComponent(w.id)}`,{method:"DELETE"}),F(`已删除 ${w.id}`),await r()}catch(G){A(Ou(G,"删除定时任务失败"))}finally{c(!1)}}async function N(w){if(!w?.id)return;c(!0),A(""),F("");try{let G=await Eu(`${ku.apiBaseUrl}/schedules/${encodeURIComponent(w.id)}/run`,{method:"POST",body:"{}"});F(`已触发 ${w.id} / ${G?.run?.id||"run"}`),await r()}catch(G){A(Ou(G,"触发定时任务失败"))}finally{c(!1)}}return _("div",{className:"page-grid scheduled-task-page","data-testid":"scheduled-task-page"},_(eu,{title:"定时任务",eyebrow:`${(u||[]).length} Schedules`},(u||[]).length===0?_(Ul,{title:"暂无定时任务",text:"创建 daily / dispatch / PGDATA backup 任务后会在这里展示下一次执行时间和最近结果"}):_("div",{className:"schedule-card-grid"},(u||[]).map((w)=>_("article",{key:w.id,className:"schedule-card","data-testid":`schedule-row-${lr(w.id)}`},_("div",{className:"node-card-head"},_("strong",null,w.name||w.id),_(Ll,{status:w.enabled?"online":"warn"},w.enabled?"enabled":"disabled")),_("code",null,w.id),_("dl",null,_("dt",null,"计划"),_("dd",null,LY(w.schedule)),_("dt",null,"动作"),_("dd",null,TY(w.action)),_("dt",null,"下次执行"),_("dd",null,wu(w.nextRunAt)),_("dt",null,"最近执行"),_("dd",null,w.lastRunAt?`${wu(w.lastRunAt)} / ${w.lastRunId||"--"}`:"--")),_("div",{className:"dispatch-actions"},_("button",{type:"button",className:"ghost-btn",disabled:y,onClick:()=>W(w)},"编辑"),_("button",{type:"button",className:"ghost-btn",disabled:y,onClick:()=>N(w),"data-testid":`schedule-run-${lr(w.id)}`},"手动触发"),_("button",{type:"button",className:"ghost-btn danger",disabled:y,onClick:()=>q(w)},"删除"),_(gl,{title:`Schedule ${w.id}`,data:w,onOpen:n})))))),_(eu,{title:i.id?"配置定时任务":"新建定时任务",eyebrow:"CRUD"},_("form",{className:"dispatch-form schedule-form",onSubmit:U},_("label",null,"ID",_("input",{value:i.id,onChange:(w)=>Q("id",w.target.value)})),_("label",null,"名称",_("input",{value:i.name,onChange:(w)=>Q("name",w.target.value)})),_("label",null,"每日执行时间 UTC",_("input",{value:i.timeOfDay,placeholder:"03:30",onChange:(w)=>Q("timeOfDay",w.target.value)})),_("label",null,"启用",_("select",{value:i.enabled?"true":"false",onChange:(w)=>Q("enabled",w.target.value==="true")},_("option",{value:"true"},"enabled"),_("option",{value:"false"},"disabled"))),_("label",null,"动作类型",_("select",{value:i.actionType,onChange:(w)=>Q("actionType",w.target.value)},_("option",{value:"pgdata_backup"},"PGDATA 备份到百度网盘"),_("option",{value:"dispatch"},"Provider Dispatch"))),i.actionType==="pgdata_backup"?[_("label",{key:"remote"},"网盘根目录",_("input",{value:i.remoteBaseDir,onChange:(w)=>Q("remoteBaseDir",w.target.value)})),_("label",{key:"staging"},"本地 staging 子目录",_("input",{value:i.stagingSubdir,onChange:(w)=>Q("stagingSubdir",w.target.value)}))]:[_("label",{key:"provider"},"Provider",_("select",{value:i.providerId,onChange:(w)=>Q("providerId",w.target.value)},(f||[]).map((w)=>_("option",{key:w.providerId,value:w.providerId},`${w.name} / ${w.providerId}`)))),_("label",{key:"command"},"Command",_("select",{value:i.command,onChange:(w)=>Q("command",w.target.value)},_("option",{value:"echo"},"echo"),_("option",{value:"docker.ps"},"docker.ps"),_("option",{value:"host.ssh"},"host.ssh"),_("option",{value:"microservice.http"},"microservice.http"))),_("label",{key:"payload",className:"raw-editor-label"},"Payload JSON",_("textarea",{className:"raw-editor",value:i.payloadJson,onChange:(w)=>Q("payloadJson",w.target.value)}))],_("label",null,"超时 ms",_("input",{value:i.timeoutMs,onChange:(w)=>Q("timeoutMs",w.target.value)})),_("label",{className:"raw-editor-label"},"描述",_("textarea",{className:"raw-editor compact",value:i.description,onChange:(w)=>Q("description",w.target.value)})),_("div",{className:"dispatch-actions"},_("button",{type:"button",className:"ghost-btn",disabled:y,onClick:()=>t(DL(f||[]))},"重置"),_("button",{type:"submit",disabled:y||!i.id},y?"保存中":"保存任务")),j?_("p",{className:"muted paragraph"},j):null,_(nl,{error:$,wide:!0}))),_(eu,{title:"历史执行记录",eyebrow:`${J.length} Runs`},J.length===0?_(Ul,{title:"暂无执行记录",text:"定时触发或手动触发后会生成 run history"}):_("div",{className:"table-wrap"},_("table",{className:"task-history-table schedule-run-table"},_("thead",null,_("tr",null,_("th",null,"状态"),_("th",null,"任务"),_("th",null,"触发"),_("th",null,"耗时"),_("th",null,"结果摘要"),_("th",null,"更新时间"),_("th",null,"操作"))),_("tbody",null,J.map((w)=>_("tr",{key:w.id,"data-testid":`schedule-run-row-${lr(w.id)}`},_("td",null,_(Ll,{status:KY(w.status)},w.status)),_("td",null,_("strong",null,w.scheduleId),_("code",null,w.id),w.taskId?_("code",null,w.taskId):null),_("td",null,w.trigger||"--"),_("td",null,GY(w)),_("td",null,_(fi,{data:w.result||w.error,empty:"无结果"})),_("td",null,wu(w.updatedAt)),_("td",null,_(gl,{title:`Schedule Run ${w.id}`,data:w,onOpen:n})))))))))}function EY({data:u}){let l=u.overview||{};return _("div",{className:"page-grid topology-grid"},_(eu,{title:"公开入口",eyebrow:"Public"},_("div",{className:"endpoint-list"},_("article",null,_("b",null,"Frontend"),_("span",null,ku.frontendPublicUrl||window.location.origin),_(Ll,{status:"online"},"public")),_("article",null,_("b",null,"Provider Ingress"),_("span",null,ku.providerIngressPublicUrl||"ws://public/ws/provider"),_(Ll,{status:"online"},"public")))),_(eu,{title:"内部服务",eyebrow:"Docker Network Only"},_("div",{className:"endpoint-list"},_("article",null,_("b",null,"backend-core API"),_("span",null,"http://backend-core:8080"),_(Ll,{status:"internal"},"internal")),_("article",null,_("b",null,"database"),_("span",null,"postgres://database:5432/unidesk"),_(Ll,{status:"internal"},"internal")))),_(eu,{title:"运行态",eyebrow:"Runtime"},_("div",{className:"metric-grid"},_(jl,{label:"DB Ready",value:l.dbReady?"YES":"NO",hint:"internal health"}),_(jl,{label:"Online Nodes",value:l.onlineNodeCount??0,hint:"provider-gateway self-link"}))))}function OY({session:u}){return _(eu,{title:"认证策略",eyebrow:"Frontend Login"},_("div",{className:"policy-grid"},_("article",null,_("span",null,"默认账号"),_("strong",null,ku.authUsername||"admin")),_("article",null,_("span",null,"当前会话"),_("strong",null,u?.user?.username||"--")),_("article",null,_("span",null,"Session TTL"),_("strong",null,`${ku.sessionTtlSeconds||0}s`)),_("article",null,_("span",null,"API 访问"),_("strong",null,"同源 Cookie 保护"))),_("p",{className:"muted paragraph"},"浏览器只访问 frontend 同源接口;frontend 容器使用 Docker 内网代理 backend-core API。"))}function ZY(){return _(eu,{title:"安全边界",eyebrow:"Exposure Rule"},_("div",{className:"security-board"},_("article",{className:"allow"},_("b",null,"允许公网"),_("span",null,"frontend 登录入口"),_("span",null,"provider ingress WebSocket/health")),_("article",{className:"deny"},_("b",null,"禁止公网"),_("span",null,"backend-core REST API"),_("span",null,"PostgreSQL database")),_("article",null,_("b",null,"数据库卷"),_("span",null,"named volume unidesk_pgdata_10gb"),_("span",null,"CLI stop/start 不删除数据卷"))))}function HY({activeModule:u,activeTab:l,data:f,session:r,refresh:n,onRaw:i,onNavigate:t}){if(u==="ops"&&l==="status")return _(kX,{data:f,onRaw:i,onNavigate:t});if(u==="ops"&&l==="performance")return _(yY,{onRaw:i});if(u==="ops"&&l==="events")return _(gX,{events:f.events,onRaw:i});if(u==="ops"&&l==="logs")return _(sX,{logs:f.logs,onRaw:i});if(u==="nodes"&&l==="list")return _(aX,{nodes:f.nodes,onRaw:i});if(u==="nodes"&&l==="monitor")return _(eX,{nodes:f.nodes,systemStatuses:f.systemStatuses,tasks:f.tasks,onRaw:i,refresh:n});if(u==="nodes"&&l==="docker")return _(FY,{nodes:f.nodes,dockerStatuses:f.dockerStatuses,onRaw:i});if(u==="nodes"&&l==="gateway")return _($Y,{nodes:f.nodes,tasks:f.tasks,onRaw:i});if(u==="nodes"&&l==="labels")return _(oX,{nodes:f.nodes});if(u==="nodes"&&l==="heartbeats")return _(dX,{nodes:f.nodes});if(u==="tasks"&&l==="dispatch")return _(QY,{nodes:f.nodes,onDispatched:n,onRaw:i});if(u==="tasks"&&l==="scheduled")return _(zY,{schedules:f.schedules,scheduleRuns:f.scheduleRuns,nodes:f.nodes,refresh:n,onRaw:i});if(u==="tasks"&&l==="pending")return _(qY,{tasks:f.pendingTasks,onRaw:i});if(u==="tasks"&&l==="history")return _(wY,{tasks:f.tasks,onRaw:i});if(u==="tasks"&&l==="results")return _(WY,{tasks:f.tasks,onRaw:i});if(u==="apps"&&l==="catalog")return _(JY,{microservices:f.microservices,onRaw:i,onNavigate:t});if(u==="apps"&&l==="todo-note")return _(JL,{microservices:f.microservices,onRaw:i,apiBaseUrl:ku.apiBaseUrl});if(u==="apps"&&l==="findjob")return _(nN,{microservices:f.microservices,onRaw:i,apiBaseUrl:ku.apiBaseUrl});if(u==="apps"&&l==="pipeline")return _(yL,{microservices:f.microservices,onRaw:i,apiBaseUrl:ku.apiBaseUrl});if(u==="apps"&&l==="met-nonlinear")return _(_N,{microservices:f.microservices,onRaw:i,apiBaseUrl:ku.apiBaseUrl});if(u==="apps"&&l==="claudeqq")return _(mJ,{microservices:f.microservices,onRaw:i,apiBaseUrl:ku.apiBaseUrl});if(u==="apps"&&l==="baidu-netdisk")return _(ZJ,{microservices:f.microservices,onRaw:i,apiBaseUrl:ku.apiBaseUrl});if(u==="apps"&&l==="filebrowser")return _(rN,{microservices:f.microservices,onRaw:i,apiBaseUrl:ku.apiBaseUrl});if(u==="apps"&&l==="oa-event-flow")return _(WN,{microservices:f.microservices,onRaw:i,apiBaseUrl:ku.apiBaseUrl});if(u==="apps"&&l==="k3sctl")return _(LL,{microservices:f.microservices,onRaw:i,apiBaseUrl:ku.apiBaseUrl,onNavigate:t});if(u==="apps"&&l==="code-queue")return _(oQ,{microservices:f.microservices,onRaw:i,apiBaseUrl:ku.apiBaseUrl,initialTasksData:ZX});if(u==="apps"&&l==="mdtodo")return _(FN,{microservices:f.microservices,onRaw:i,apiBaseUrl:ku.apiBaseUrl});if(u==="apps"&&l==="project-manager")return _($L,{microservices:f.microservices,onRaw:i,apiBaseUrl:ku.apiBaseUrl});if(u==="config"&&l==="topology")return _(EY,{data:f});if(u==="config"&&l==="auth")return _(OY,{session:r});if(u==="config"&&l==="security")return _(ZY);return _(Ul,{title:"未找到页面",text:"请选择左侧主模块和顶部子功能标签"})}function BY({session:u,onLogout:l}){let f=G2(Sr,window.location.pathname),[r,n]=bu(f.moduleId),[i,t]=bu({...fc,[f.moduleId]:f.tabId}),[y,c]=bu({overview:null,nodes:[],systemStatuses:[],dockerStatuses:[],microservices:[],events:[],tasks:[],pendingTasks:[],schedules:[],scheduleRuns:[],logs:[]}),[$,A]=bu({ok:!1,text:"连接中"}),[j,F]=bu(null),[J,Q]=bu(new Date),[W,L]=bu(null),[U,q]=bu(!1),[N,w]=bu(!1),G=li.default.useRef(!1),Z=Sr.moduleById[r]||Sr.modules[0],H=i[r]||fc[r]||Z.tabs[0].id,E=Array.isArray(y.microservices)?y.microservices:[],V=E.length===0&&r==="apps"&&H==="code-queue"?[HX]:E,S=V===E?y:{...y,microservices:V},B=r==="apps"?V.find((d)=>String(d?.id||"")===(H==="k3sctl"?"k3sctl-adapter":H)):null,D=B?kL(B):{},X=Z.tabs.find((d)=>d.id===H)?.label||H,O=B?[{key:"microservice",label:"用户服务",value:`${X} ${D.providerStatus==="online"?"在线":D.providerStatus||"未知"}`,tone:D.providerStatus==="online"?"ok":"warn",testId:"active-microservice-status"}]:[];async function Y(){if(G.current)return;G.current=!0,w(!0);try{let d=[],g=(Fu,zu)=>{d.push([Fu,Eu(zu)])},x=r==="ops"&&H==="status",lu=x||r==="config"&&H==="topology",cu=x||r==="nodes"||r==="tasks"&&(H==="dispatch"||H==="scheduled"),_u=r==="apps"&&H!=="code-queue";if(lu)g("overview",`${ku.apiBaseUrl}/overview`);if(cu)g("nodes",`${ku.apiBaseUrl}/nodes`);if(r==="nodes"&&H==="monitor")g("systemStatuses",`${ku.apiBaseUrl}/nodes/system-status?limit=60`),g("tasks",`${ku.apiBaseUrl}/tasks?limit=120&summary=1`);else if(r==="nodes"&&H==="docker")g("dockerStatuses",`${ku.apiBaseUrl}/nodes/docker-status`);else if(r==="nodes"&&H==="gateway")g("tasks",`${ku.apiBaseUrl}/tasks?limit=300&summary=1`);else if(r==="tasks"&&H==="scheduled")g("schedules",`${ku.apiBaseUrl}/schedules?limit=100`),g("scheduleRuns",`${ku.apiBaseUrl}/schedules/runs?limit=100`);else if(r==="tasks"&&H==="pending")g("pendingTasks",`${ku.apiBaseUrl}/tasks?status=pending&limit=100&summary=1`);else if(r==="tasks"&&(H==="history"||H==="results"))g("tasks",`${ku.apiBaseUrl}/tasks?limit=300&summary=1`);else if(x)g("tasks",`${ku.apiBaseUrl}/tasks?limit=8&lite=1`),g("pendingTasks",`${ku.apiBaseUrl}/tasks?status=pending&limit=20&lite=1`);if(_u)g("microservices",`${ku.apiBaseUrl}/microservices`);if(r==="ops"&&H==="events")g("events",`${ku.apiBaseUrl}/events?limit=100`);if(r==="ops"&&H==="logs")g("logs","/logs?limit=100");await Promise.all(d.map(async([Fu,zu])=>{let Wu=await zu,C={};if(Fu==="overview")C.overview=Wu;if(Fu==="nodes")C.nodes=Wu.nodes||[];if(Fu==="systemStatuses")C.systemStatuses=Wu.systemStatuses||[];if(Fu==="dockerStatuses")C.dockerStatuses=Wu.dockerStatuses||[];if(Fu==="microservices")C.microservices=Wu.microservices||[];if(Fu==="events")C.events=Wu.events||[];if(Fu==="tasks")C.tasks=Wu.tasks||[];if(Fu==="pendingTasks")C.pendingTasks=Wu.tasks||[];if(Fu==="schedules")C.schedules=Wu.schedules||[];if(Fu==="scheduleRuns")C.scheduleRuns=Wu.runs||[];if(Fu==="logs")C.logs=Wu.logs||[];c((e)=>({...e,...C}))})),A({ok:!0,text:"核心在线"}),F(new Date)}catch(d){if(A({ok:!1,text:Ou(d,"连接失败")}),d.status===401)l(!1)}finally{G.current=!1,w(!1)}}Tn(()=>{let d=()=>{if(!GL())return;Y()};d();let g=setInterval(d,BX(r,H)),x=()=>{if(GL())d()};return document.addEventListener("visibilitychange",x),()=>{clearInterval(g),document.removeEventListener("visibilitychange",x)}},[r,H]),Tn(()=>{let d=setInterval(()=>Q(new Date),1000);return()=>clearInterval(d)},[]),Tn(()=>{let d=NN(Sr,window.location.pathname);if(d&&window.location.pathname!==d)window.history.replaceState(null,"",d)},[]),Tn(()=>{let d=()=>{let g=G2(Sr,window.location.pathname);n(g.moduleId),t((x)=>({...x,[g.moduleId]:g.tabId})),L(null)};return window.addEventListener("popstate",d),()=>window.removeEventListener("popstate",d)},[]),Tn(()=>{window.scrollTo({top:0,left:0,behavior:"auto"})},[r,H]);function p(d,g,x="push"){let lu=Sr.moduleById[d]?d:Sr.fallbackTarget.moduleId,cu=Sr.moduleById[lu]?.tabs.some((Fu)=>Fu.id===g)?g:fc[lu]||Sr.moduleById[lu]?.tabs[0]?.id||Sr.fallbackTarget.tabId;n(lu),t((Fu)=>({...Fu,[lu]:cu}));let _u=U3(Sr,lu,cu);if(window.location.pathname!==_u){let Fu=x==="replace"?"replaceState":"pushState";window.history[Fu](null,"",_u)}}function v(d,g){L({title:d,data:g})}let[z,P]=bu(!1),{unreadCount:k,notifications:I}=pf(),b=I.length>0?I[I.length-1]:null;return _("div",{className:`shell ${U?"rail-collapsed":""}`,"data-testid":"app-shell"},_(bX,{activeModule:r,activeTabs:i,onNavigate:p,collapsed:U,onToggle:()=>q((d)=>!d)}),_("main",{className:"workspace"},_(hX,{connection:$,lastRefresh:j,onRefresh:Y,onLogout:()=>l(!0),session:u,clock:J,activeStatusItems:O,onNotificationToggle:()=>P((d)=>!d),unreadCount:k}),_(vX,{module:Z,activeTab:H,onNavigate:p}),_(Q7.Provider,{value:N},_(HY,{activeModule:r,activeTab:H,data:S,session:u,refresh:Y,onRaw:v,onNavigate:p}))),_(MX,{raw:W,onClose:()=>L(null)}),b&&_(KL,{key:b.id,notification:b}),z&&_(TL,{onClose:()=>P(!1)}))}function mY(){let[u,l]=bu(!0),[f,r]=bu(null);async function n(){l(!0);try{let t=await Eu("/api/session");r(t.authenticated?t:null)}catch{r(null)}finally{l(!1)}}async function i(t){if(t)try{await Eu("/logout",{method:"POST"})}catch{}r(null)}if(Tn(()=>{n()},[]),u)return _("main",{className:"loading-screen"},_("div",{className:"brand-mark"},"UD"),_("span",null,"加载会话"));if(!f)return _(RX,{onLogin:r});return _(OJ,null,_(BY,{session:f,onLogout:i}))}var dL=document.getElementById("root");if(dL===null)throw Error("root element not found");pL.createRoot(dL).render(_(mY));})(); + `,width:W,height:L}}function SA(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 yL(u,l){let f=tL(l,"pipeline"),{svg:r,width:n,height:i}=YS(u,l),t=new Blob([r],{type:"image/svg+xml;charset=utf-8"}),y=URL.createObjectURL(t);try{let c=new Image;await new Promise((F,J)=>{c.onload=()=>F(),c.onerror=()=>J(Error("svg image load failed")),c.src=y});let $=document.createElement("canvas");$.width=n,$.height=i;let A=$.getContext("2d");if(!A)throw Error("canvas unavailable");A.drawImage(c,0,0);let j=await new Promise((F)=>$.toBlob(F,"image/png"));if(!j)throw Error("png export failed");SA(j,`${f}.png`)}catch{SA(t,`${f}.svg`)}finally{URL.revokeObjectURL(y)}}async function xS(u){let l=tL(String(u?.title||"pipeline-gantt"),"pipeline-gantt"),{svg:f,width:r,height:n}=RS(u),i=new Blob([f],{type:"image/svg+xml;charset=utf-8"}),t=URL.createObjectURL(i);try{let y=new Image;await new Promise((j,F)=>{y.onload=()=>j(),y.onerror=()=>F(Error("gantt svg image load failed")),y.src=t});let c=document.createElement("canvas");c.width=r,c.height=n;let $=c.getContext("2d");if(!$)throw Error("canvas unavailable");$.drawImage(y,0,0);let A=await new Promise((j)=>c.toBlob(j,"image/png"));if(!A)throw Error("gantt png export failed");SA(A,`${l}.png`)}catch{SA(i,`${l}.svg`)}finally{URL.revokeObjectURL(t)}}async function hS(u){for(let l of u){if(l.flow.nodes.length===0)continue;await yL(l.flow,l.title),await new Promise((f)=>setTimeout(f,750))}}function bW(u,l){return u.find((f)=>String(f?.pipelineId||"")===l)||null}function vW(u){return su(u?.startedAt)??su(u?.artifact?.startedAt)??su(u?.request?.createdAt)??su(u?.updatedAt)??0}function bS(u,l){return u.filter((f)=>String(f?.pipelineId||"")===l).slice().sort((f,r)=>vW(f)-vW(r)||String(f?.runId||"").localeCompare(String(r?.runId||"")))}function o9(u,l){let f=String(l?.runId||""),r=u.findIndex((t)=>String(t?.runId||"")===f),n=r>=0?r+1:u.length,i=String(l?.status||"--");return`Epoch ${n} / ${f||"--"} / ${i}`}function Dr(u){return String(u?.procedureRunId||u?.runId||"")}function CA(u,l){let f=String(u?.nodeId||u?.request?.nodeId||"");if(f)return f;let r=Dr(u),n=`${l}__`;if(r.startsWith(n))return r.slice(n.length).replace(/__\d+$/u,"");return""}function EA(u,l){let f=pu(u?.artifact)?u.artifact:{},r=pu(u?.request)?u.request:{};return oc(u?.startedAt,f.startedAt,r.createdAt,r.startedAt,u?.createdAt,u?.updatedAt,l?.startedAt,l?.request?.createdAt)}function OA(u,l){let f=String(u?.status?.status||u?.artifact?.status||u?.status||"").toLowerCase(),r=pu(u?.artifact)?u.artifact:{},n=l7(f);return oc(u?.finishedAt,r.finishedAt,u?.completedAt,n?u?.updatedAt:void 0,n?r.updatedAt:void 0,n?l?.updatedAt:void 0)}function cL(u,l,f=Date.now()){let r=String(u?.runId||""),n=new Set(l.map((i)=>String(i?.id||"")).filter(Boolean));return Du(u?.procedureRuns).flatMap((i)=>{let t=CA(i,r);if(!t)return[];let y=String(i?.status?.status||i?.artifact?.status||i?.status||"unknown").toLowerCase(),c=EA(i,u),$=su(c);if($===null)return[];let A=OA(i,u),j=su(A)??(l7(y)?su(i?.updatedAt)??$+1000:f),F=Math.max($+1000,j);return[{nodeId:t,knownNode:n.has(t),procedureRunId:Dr(i),status:y,startMs:$,endMs:F,startedAt:gc($),finishedAt:gc(F),durationMs:F-$,runId:r,raw:i}]}).sort((i,t)=>i.startMs-t.startMs||i.endMs-t.endMs||i.nodeId.localeCompare(t.nodeId))}function vS(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=pl(A?.eventMs??A?.ms);if(j!==null)r.push(j),n.push(j)}let i=su(u?.startedAt)??su(u?.artifact?.startedAt)??su(u?.request?.createdAt),t=su(u?.finishedAt)??su(u?.artifact?.finishedAt)??su(u?.updatedAt);if(i!==null)r.push(i);if(t!==null)n.push(t);let y=Date.now(),c=r.length>0?Math.min(...r):y-60000,$=Math.max(c+60000,n.length>0?Math.max(...n):y);return{startMs:c,endMs:$,durationMs:$-c}}var ZA=12,_L=20,d9=100,kS=!1;function o0(u){let l=Number(u);if(!Number.isFinite(l))return 0;return Math.max(0,Math.min(100,Math.round(l*100)/100))}function IS(u){let l=Math.max(ZA,Number(u||ZA)),f=Math.log(l/ZA)/Math.log(_L);return o0(f*100)}var ac=IS(d9);function y7(u){let l=o0(u)/100,f=ZA*Math.pow(_L,l),r=l<0.24?"全局":l<0.64?"均衡":"细节";return{value:o0(l*100),pxPerMinute:f,label:r}}function b9(u){let l=Math.round(Number(u));return Math.abs(l-d9)<=1?d9:l}function gS(u,l=ac){let f=Math.max(1,Number(u.durationMs||0)/60000),r=y7(l);return Math.round(Math.max(360,Math.min(7200,f*Number(r.pxPerMinute||48))))}function sS(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 aS(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 pl(u){let l=Number(u);return Number.isFinite(l)?l:null}function c7(u){return sW(u?.status)&&!l7(u?.status)}function $L(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 kW(u,l){if(!l)return null;let f=pl(l?.startMs),r=pl(l?.endMs),n=pl(l?.chartHeight);if(f===null||r===null||n===null)return null;return $L(u,f,r,n)}function AL(u,l){let f=pl(u?.rawStartMs??u?.startMs)??pl(u?.startMs)??l,r=pl(u?.endMs)??f+1000;if(!c7(u))return Math.max(f+1000,r);return Math.max(f+1000,r,l)}function oS(u,l,f,r){let n=pl(u?.startMs)??r-60000,i=pl(u?.endMs)??r,t=f.reduce((Q,W)=>Math.max(Q,AL(W,r)),i),y=Math.max(n+60000,i,t),c=Math.max(1,y-n),$={startMs:n,endMs:y,durationMs:c},A=gS($,l),j=y7(l),F=Math.max(5,Math.min(18,Math.round(A/150))),J=sS($,F).map((Q)=>{let W=Number(Q.ms),L=$L(W,n,y,A);return{...Q,y:L,timestamp:gc(W),offsetMs:W-n}});return{source:"frontend-y",startMs:n,endMs:y,durationMs:c,chartHeight:A,scale:o0(l),normalizedScale:Number((o0(l)/100).toFixed(3)),pxPerMinute:Number(Number(j.pxPerMinute||0).toFixed(3)),ticks:J}}function dS(u,l,f){if(!c7(u))return u;let r=pl(u?.rawStartMs??u?.startMs)??pl(u?.startMs)??f,n=AL(u,f),i=kW(r,l),t=kW(n,l),y=pl(i??u?.y1??u?.startY)??0,c=pl(t??u?.y2??u?.endY)??y+10,$=Math.max(24,c-y);return{...u,live:!0,startMs:r,endMs:n,durationMs:Math.max(1000,n-r),finishedAt:gc(n),y1:y,y2:c,startY:y,endY:c,height:$}}function _7(u,l,f){return aS(u,l)/100*f}function Oy(u){return Boolean(u&&String(u?.source||"")!=="frontend-y")}function jL(u,l,f,r,n){if(Oy(r))for(let t of n){let y=pl(u?.[t]);if(y!==null)return y}let i=pl(u?.ms??u?.eventMs??u?.startMs);return _7(i??Number(l.startMs),l,f)}function XA(u,l,f,r){return jL(u,l,f,r,["y1","startY"])}function e9(u,l,f,r){if(Oy(r)){let i=pl(u?.y2??u?.endY);if(i!==null)return i}let n=pl(u?.endMs)??Number(l.endMs);return _7(n,l,f)}function FL(u,l,f,r){if(Oy(r)){let i=pl(u?.height);if(i!==null)return Math.max(1,i)}let n=u?.live?24:10;return Math.max(n,e9(u,l,f,r)-XA(u,l,f,r))}function Qr(u,l,f,r){return jL(u,l,f,r,["y","timeAxisY"])}function UL(u,l,f,r){if(Oy(r)||String(r?.source||"")==="frontend-y"){let t=pl(u?.y);if(t!==null)return t}let n=pl(u?.percent);if(n!==null)return n/100*f;let i=pl(u?.ms)??Number(l.startMs);return _7(i,l,f)}function eS(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 uX(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=eS(n),t=String(n?.nodeId||""),y=String(n?.id||"");if(!i||!t||!y)continue;let c=[i,t,y,"observe"].join(":");if(f.has(c))continue;f.add(c),r.push({id:`observation-arrow:${y}:${i}:${t}`,commandId:String(n?.commandId||n?.eventId||y),sourceNodeId:i,targetNodeId:t,sourceMarkerId:"",targetMarkerId:y,sourceKind:"monitor",action:"observe",status:"observation"})}return{markers:u,arrows:r}}function lX(u){let l=un(u),f=String(u?.promptEvent||"");if(l==="initial-prompt-delivered")return"initial";if(f==="node-finished"||f==="node-long-running-observation"||f.startsWith("monitor-"))return"monitor";if(l==="monitor-prompt-delivered"||String(u?.sourceKind||"").toLowerCase()==="monitor")return"monitor";return"append"}function fX(u){return Du(u?.tags||u?.raw?.tags).map((l)=>String(l||"")).filter(Boolean)}function rX(u){let l=un(u),f=String(u?.promptEvent||"");if(l==="initial-prompt-delivered")return"初始 prompt";if(f==="node-long-running-observation")return"长任务观察";if(f==="node-finished")return fX(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 IW(u){let l=un(u);if(l==="control-command-applied")return 3;if(l==="control-command-ignored")return 2;if(l==="control-command-queued")return 1;return 0}function nX(u,l){let f=String(u?.commandId||"");if(f)return`command:${f}`;return["control-event",Gy(u)||oc(u?.createdAt,u?.timestamp)||`index-${l}`,String(u?.sourceKind||""),String(u?.sourceNodeId||""),String(u?.targetNodeId||""),ei(u)].join(":")}function iX(u){return s9([u?.targetNodeId,...Du(u?.resetNodeIds)])}function tX(u,l){let f=kc(u),r=un(u),n=String(u?.targetNodeId||""),i=Boolean(n)&&l!==n;if(r==="control-command-applied")return i?`${f} 波及`:`${f} 生效`;if(r==="control-command-ignored")return`${f} 忽略`;if(r==="control-command-queued")return`${f} 已发起`;return i?`${f} 波及`:f}function yX(u){if(un(u)==="control-command-ignored")return"ignored";let f=ei(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 cX(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 _X(u,l,f,r){let n=u.filter(($)=>String($.nodeId||"")===l).sort(($,A)=>Number($.startMs)-Number(A.startMs)),i=n.find(($)=>f>=Number($.startMs)-1000&&f<=Number($.endMs)+1000);if(i)return{ms:f,onInterval:!0,snapReason:"inside-interval",procedureRunId:String(i.procedureRunId||"")};let t=ei(r),y=n.slice().reverse().find(($)=>Number($.endMs)<=f+1000);if(y&&t==="approve")return{ms:Number(y.endMs),onInterval:!0,snapReason:"previous-interval-end",procedureRunId:String(y.procedureRunId||"")};let c=n.find(($)=>Number($.startMs)>=f-1000);if(c&&["guide","modify","restart","redo"].includes(t))return{ms:Number(c.startMs),onInterval:!0,snapReason:"next-interval-start",procedureRunId:String(c.procedureRunId||"")};return{ms:f,onInterval:!1,snapReason:"event-time",procedureRunId:String(r?.procedureRunId||"")}}function JL(u,l,f,r){let n=Math.hypot(f-u,r-l),i=n>HW?HW:0,t=i>0?f-(f-u)/n*i:f,y=i>0?r-(r-l)/n*i:r,c=t-u,$=Math.max(16,Math.min(42,Math.abs(c)*0.45+12)),A=c===0?1:Math.sign(c);return`M ${u},${l} C ${u+A*$},${l} ${t-A*$},${y} ${t},${y}`}function $X(u,l){let f=String(u?.runId||l?.runId||""),r=cL({...pu(l)?l:{},...pu(u)?u:{},runId:f,procedureRuns:Du(u?.procedureRuns).length>0?u.procedureRuns:l?.procedureRuns},[]),n=[],i=[],t=[],y=new Set,c=new Map,$=(F,J)=>{if(!F.nodeId||!Number.isFinite(Number(F.ms)))return;if(y.has(F.id))return;y.add(F.id),J.push(F)};for(let F of Du(u?.procedureRuns)){let J=CA(F,f),Q=Dr(F);if(!J)continue;for(let W of Du(F?.attempts)){let L=PA(W);for(let U of g9(W?.controlEventRecords)){let q=un(U);if(!["initial-prompt-delivered","append-prompt-delivered","monitor-prompt-delivered"].includes(q))continue;let N=Gy(U),w=su(N);if(w===null)continue;let G=String(U?.eventId||"");$({id:`prompt:${G||`${Q}:${L}:${q}:${w}`}`,runId:f,nodeId:J,procedureRunId:Q,attempt:L,kind:"prompt",tone:lX(U),status:"delivered",label:rX(U),ms:w,timestampIso:N,sourceKind:String(U?.sourceKind||""),sourceNodeId:String(U?.sourceNodeId||""),targetNodeId:J,action:"",eventId:G,commandId:String(U?.commandId||""),raw:U},n)}}}let A=new Map;g9(u?.controlEvents).forEach((F,J)=>{let Q=nX(F,J),W=A.get(Q)||{key:Q,events:[]};W.events.push(F),A.set(Q,W)});for(let F of A.values()){let J=Du(F.events).slice().sort((B,D)=>IW(D)-IW(B)),Q=Du(F.events).find((B)=>un(B)==="control-command-queued")||null,W=J[0]||Q;if(!Q&&!W)continue;let L=String(Q?.sourceNodeId||W?.sourceNodeId||""),U=String(Q?.sourceKind||W?.sourceKind||""),q=Gy(Q)||Gy(W)||oc(Q?.createdAt,W?.createdAt),N=su(q),w=String(W?.commandId||Q?.commandId||F.key),G=(un(W)||"control-command-queued").replace(/^control-command-/u,""),Z="";if(L&&N!==null)Z=`control-source:${w}:${L}`,c.set(w,Z),$({id:Z,runId:f,nodeId:L,procedureRunId:String(Q?.procedureRunId||W?.procedureRunId||""),attempt:"",kind:"control-source",tone:cX(Q||W),status:G,label:`${kc(Q||W)} 发起`,ms:N,timestampIso:q,action:ei(Q||W),sourceKind:U,sourceNodeId:L,targetNodeId:String(W?.targetNodeId||Q?.targetNodeId||""),commandId:w,raw:Q||W},i);let H=W||Q,E=Gy(H)||q,m=su(E);if(m===null)continue;let S=iX(H);for(let B of S){let D=_X(r,B,m,H),X=`control-target:${w}:${B}`;if($({id:X,runId:f,nodeId:B,procedureRunId:D.procedureRunId,attempt:"",kind:"control-target",tone:yX(H),status:G,label:tX(H,B),ms:D.ms,eventMs:m,onInterval:D.onInterval,snapReason:D.snapReason,snapped:Number(D.ms)!==m,timestampIso:E,renderedTimestampIso:gc(Number(D.ms)),action:ei(H),sourceKind:U,sourceNodeId:L,targetNodeId:B,commandId:w,raw:H},i),Z&&L&&L!==B)t.push({id:`control-arrow:${w}:${L}:${B}`,commandId:w,sourceNodeId:L,targetNodeId:B,sourceMarkerId:Z,targetMarkerId:X,sourceKind:U,action:ei(H),status:G})}}let j=[...n,...i].sort((F,J)=>Number(F.ms)-Number(J.ms)||String(F.nodeId).localeCompare(String(J.nodeId))||String(F.id).localeCompare(String(J.id)));return{...uX(j,t),sourceMarkerByCommand:c}}function AX({details:u,selectedNodeId:l,selectedNodeRuntime:f,control:r,onRaw:n}){if(!u)return K("span",{className:"muted"},"点击“抓取过程”读取 node 运行材料;主界面只显示结构化摘要,完整内容需点开原始 JSON。");let i=Du(u.procedureRuns),t=i.at(-1)||{},y=Du(t.attempts),c=y.at(-1)||{},$=Du(t.workerLogTail),A=Du(c.controlEventsTail),j=Du(c.controlPromptsTail),F=Du(c.monitorPromptsTail),J=M9(A),Q=M9(j),W=M9(F),L=c.opencodeMessages||{};return K("div",{className:"pipeline-evidence-list compact"},K(Vr,{title:"Node runtime",subtitle:l||"--",facts:[`status ${f?.status||"pending"}`,`attempts ${f?.attempts??y.length}`,`procedure ${f?.currentProcedureRunId||Dr(t)||"--"}`,r.fetchedAt?`fetched ${yl(r.fetchedAt)}`:"not fetched"],data:u.node||u,onRaw:n,testId:"raw-pipeline-node-runtime"}),K(Vr,{title:"Procedure runs",subtitle:`${i.length} groups`,facts:[`latest ${t.status?.status||t.status||"--"}`,`steps ${Du(t.recentSteps).length}`,`duration ${mr(su(t.finishedAt)&&su(t.startedAt)?Number(su(t.finishedAt))-Number(su(t.startedAt)):t.durationMs)}`],data:i,onRaw:n,testId:"raw-pipeline-node-procedures"}),K(Vr,{title:"OpenCode messages",subtitle:String(L.exists?"available":"not indexed"),facts:[`messages ${BA(L.messageCount)}`,`size ${BA(L.size)}`,`updated ${wu(L.updatedAt)}`],data:L,onRaw:n,testId:"raw-pipeline-node-messages"}),K(Vr,{title:"Control prompts",subtitle:"manual / monitor append queues",facts:[`manual tail ${Q.total}`,`monitor tail ${W.total}`,`last ${wu(u7(Q.lastAt,W.lastAt))}`],data:{controlPromptsTail:j,monitorPromptsTail:F},onRaw:n,testId:"raw-pipeline-node-prompts"}),K(Vr,{title:"Control events",subtitle:J.eventKinds.length>0?J.eventKinds.join(", "):"event tail",facts:[`tail ${J.total}`,`parsed ${J.parsed}`,`last ${wu(J.lastAt)}`],data:A,onRaw:n,testId:"raw-pipeline-node-events"}),K(Vr,{title:"Worker log",subtitle:"tail is hidden on main canvas",facts:[`tail ${$.length} lines`,"raw only via button",`procedure ${Dr(t)||"--"}`],data:$,onRaw:n,testId:"raw-pipeline-node-worker-log"}))}function jX({activeRun:u,onRaw:l}){if(!u)return K(Nr,{title:"暂无运行材料",text:"没有 Pipeline epoch 时不会展示运行材料索引。"});let f=Du(u.nodes),r=Du(u.procedureRuns),n=Du(u.submissions),i=Du(u.workerLogTail),t=mW(f),y=mW(r),c=r.filter((A)=>String(A?.status||"").toLowerCase()==="failed"),$=u7(...r.flatMap((A)=>[A.updatedAt,A.finishedAt,A.startedAt]));return K("div",{className:"pipeline-evidence-list"},K(Vr,{title:"Epoch overview",subtitle:u.runId||"--",facts:[`pipeline ${u.pipelineId||"--"}`,`status ${u.status||"--"}`,`started ${wu(u.startedAt)}`,`updated ${wu(u.updatedAt)}`],data:u,onRaw:l,testId:"raw-pipeline-run"}),K(Vr,{title:"Node states",subtitle:`${f.length} nodes`,facts:[`running ${t.running||0}`,`succeeded ${t.succeeded||0}`,`failed ${t.failed||0}`,`pending ${t.pending||0}`],data:f,onRaw:l,testId:"raw-pipeline-run-nodes"}),K(Vr,{title:"Procedure run index",subtitle:`${r.length} procedure records`,facts:[`succeeded ${y.succeeded||0}`,`failed ${y.failed||0}`,`latest ${wu($)}`,`errors ${c.length}`],data:r,onRaw:l,testId:"raw-pipeline-run-procedures"}),K(Vr,{title:"OA submissions",subtitle:`${n.length} submission files`,facts:[`records ${n.length}`,`task ${BA(u.task)}`,"raw grouped by run"],data:n,onRaw:l,testId:"raw-pipeline-run-submissions"}),K(Vr,{title:"Worker log tail",subtitle:"hidden from main interface",facts:[`tail ${i.length} lines`,"display raw only after click",`updated ${wu(u.updatedAt)}`],data:i,onRaw:l,testId:"raw-pipeline-run-worker-log"}))}function FX({diagnostics:u,onRaw:l}){let f=Du(u?.runs).filter(pu),r=Du(u?.forbiddenResiduals),n=pu(u?.guarantees)?u.guarantees:{},i=u?.hasNeutralNodeFinishedEvidence===!0&&u?.hasNoAuditPolicyEvidence===!0&&u?.hasAuditPolicyEvidence===!0,t=u?.ok===!0&&i&&r.length===0,y=f[0]||null,c=[{label:"中性完成事实",ok:n.neutralNodeFinished===!0,hint:"node-finished 不携带流程策略"},{label:"Config 策略判定",ok:n.auditPolicyFromConfig===!0,hint:"OA backend 读取当前 epoch 配置"},{label:"控制命令来自 OA",ok:n.runnerConsumesControlCommandsFromOaEvents===!0,hint:"runner 只消费 OA control.command"},{label:"无独立审核事件",ok:n.noIndependentAuditRequestEvent===!0,hint:"审核由 node-finished + policy 派生"},{label:"无批次门禁",ok:n.noBatchFinishedControlGate===!0,hint:"下游启动由每个 node 完成驱动"}];return K("div",{className:"pipeline-oa-panel","data-testid":"pipeline-oa-event-flow-panel"},K("div",{className:"metric-grid compact"},K(Cf,{label:"OA Flow",value:t?"100%":"--",hint:String(u?.mode||"waiting diagnostics"),tone:t?"ok":"warn"}),K(Cf,{label:"禁止残留",value:r.length,hint:r.length===0?"source scan clean":"needs cleanup",tone:r.length===0?"ok":"warn"}),K(Cf,{label:"No-audit",value:u?.hasNoAuditPolicyEvidence?"OK":"--",hint:"OA 下游策略证据",tone:u?.hasNoAuditPolicyEvidence?"ok":"warn"}),K(Cf,{label:"Monitor 审核",value:u?.hasAuditPolicyEvidence?"OK":"--",hint:"OA 控制事件闭环",tone:u?.hasAuditPolicyEvidence?"ok":"warn"})),K("div",{className:"pipeline-oa-guarantees"},c.map(($)=>K("article",{key:$.label,className:`pipeline-oa-guarantee ${$.ok?"ok":"warn"}`},K(a0,{status:$.ok?"online":"warn"},$.ok?"OK":"MISS"),K("div",null,K("strong",null,$.label),K("span",null,$.hint))))),K("div",{className:"pipeline-evidence-list compact"},f.slice(0,6).map(($)=>K(Vr,{key:$.runId,title:String($.runId||"--"),subtitle:[Number($.monitorAuditNodeFinishedCount||0)>0?"monitor audit":"",Number($.noAuditPolicyCount||0)>0?"no-audit policy":""].filter(Boolean).join(" / ")||"event evidence",facts:[`events ${$.eventCount||0}`,`node-finished ${$.nodeFinishedCount||0}`,`policy-in-detail ${$.nodeFinishedWithPolicyCount||0}`,`queued ${$.controlQueuedCount||0}`,`applied ${$.controlAppliedCount||0}`],data:$,onRaw:l,testId:`raw-pipeline-oa-run-${String($.runId||"run").replace(/[^a-zA-Z0-9_.-]+/g,"-")}`}))),y?K("p",{className:"muted paragraph"},`最新证据 ${y.runId}: ${y.nodeFinishedCount||0} 个 node-finished,${y.controlAppliedCount||0} 个控制结果。`):K(Nr,{title:"暂无 OA 事件流证据",text:"等待 Pipeline backend 暴露 diagnostics。"}),u?K("div",{className:"panel-actions inline-actions"},K(ln,{title:"Pipeline OA Event Flow Diagnostics",data:u,onOpen:l,testId:"raw-pipeline-oa-event-flow"})):null)}function UX({quota:u,onRaw:l}){let f=pu(u?.summary)?u.summary:{},r=pu(u?.target)?u.target:{},n=pu(u?.cache)?u.cache:{},i=u?.ok===!0,t=String(u?.modelId||f.modelName||r.modelName||"MiniMax-M2.7"),y=f.totalCount??r.currentIntervalTotalCount,c=f.usageCount??r.currentIntervalUsageCount,$=f.remainingCount??r.currentIntervalRemainingCount,A=f.remainingRatio??(Number.isFinite(Number(y))&&Number(y)>0&&Number.isFinite(Number($))?Number($)/Number(y):void 0),j=f.usageRatio??(Number.isFinite(Number(y))&&Number(y)>0&&Number.isFinite(Number(c))?Number(c)/Number(y):void 0),F=f.resetAt||r.endAt,J=f.remainsMs??r.remainsMs,Q=Number($),W=!i||Number.isFinite(Q)&&Q<=0?"warn":"ok",L=[i?`endpoint ${u?.endpoint||"--"}`:"quota unavailable",`fetched ${HA(u?.fetchedAt)}`,n.hit?`cache ${mr(n.ageMs)}`:"live quota"];return K("div",{className:"pipeline-minimax-quota-panel","data-testid":"pipeline-minimax-quota-panel"},K("div",{className:"metric-grid compact"},K(Cf,{label:"MiniMax",value:i?t:"--",hint:u?.modelComponent||u?.error||"model/minimax-m27",tone:W}),K(Cf,{label:"当前窗口",value:`${C9(c)}/${C9(y)}`,hint:`已用 ${VW(j)}`,tone:W}),K(Cf,{label:"剩余额度",value:C9($),hint:`剩余 ${VW(A)}`,tone:W}),K(Cf,{label:"重置时间",value:HA(F),hint:J!==void 0?`约 ${mr(J)}`:wu(F),tone:W})),K(f7,{items:L}),i?K("p",{className:"muted paragraph"},`MiniMax 限额来自 D601 Pipeline 后端实时查询;当前模型匹配 ${f.modelName||r.modelName||t}。`):K(nl,{error:u?.error||"MiniMax 限额查询失败"}),u?K("div",{className:"panel-actions inline-actions"},K(ln,{title:"Pipeline MiniMax Quota",data:u,onOpen:l,testId:"raw-pipeline-minimax-quota"})):null)}function JX({epochs:u,activeRun:l,activePipeline:f,pipelineNodes:r,pipelineEdges:n,runDetails:i,nodeDetails:t,nodeDetailsState:y,ganttScale:c=ac,onGanttScaleChange:$,onRunChange:A,onIntervalSelect:j,onMarkerSelect:F,selection:J,detailOpen:Q,onDetailOpenChange:W,onRaw:L}){let[U,q]=ef(kS),[N,w]=ef({startY:0,endY:0,startMs:0,endMs:0}),[G,Z]=ef(Date.now()),H=g0(null),E=String(l?.runId||""),m=Boolean(Q),S=($u)=>{if(typeof W==="function")W($u)},B=o0(c??ac),D=String(i?.runId||"")===E?i?.details:null,X=D?{...pu(l)?l:{},...pu(D)?D:{},runId:E,procedureRuns:Du(D?.procedureRuns).length>0?D.procedureRuns:l?.procedureRuns}:l,O=cL(X,r,G),Y=D?$X(D,X):{markers:[],arrows:[]},p=Du(Y.markers),v=vS(X,O,p),z=oS(v,B,O,G),P=String(z.source||"frontend-y"),k=O.map(($u)=>dS($u,z,G)),I={startMs:Number(z.startMs),endMs:Number(z.endMs),durationMs:Math.max(1,Number(z.durationMs??Number(z.endMs)-Number(z.startMs)))},b=y7(B),d={...b,pxPerMinute:Number(z.pxPerMinute??b.pxPerMinute)},s=Math.round(Number(z.chartHeight||360)),h=O.some(c7);Ln(()=>{if(!E||!h)return;let $u=window.setInterval(()=>Z(Date.now()),1000);return()=>window.clearInterval($u)},[E,h]);let lu=SS(f,r,Array.isArray(n)?n:[]),cu=r.map(($u)=>String($u?.id||"")).filter(Boolean),_u=k.map(($u)=>String($u.nodeId||"")).filter(Boolean),Fu=p.map(($u)=>String($u.nodeId||"")).filter(Boolean),zu=Array.from(new Set([...lu,...cu,..._u,...Fu])),Wu={startY:0,endY:s,startMs:Number(I.startMs),endMs:Number(I.endMs)},C=Number(N?.endY||0)>0?N:Wu,e=($u)=>{return XA($u,I,s,z)<=Number(C.endY)&&e9($u,I,s,z)>=Number(C.startY)},uu=($u)=>{let au=Qr($u,I,s,z);return au>=Number(C.startY)&&au<=Number(C.endY)},Gu=new Set(zu.filter(($u)=>k.some((au)=>au.nodeId===$u&&e(au))||p.some((au)=>au.nodeId===$u&&uu(au)))),a=U?zu.filter(($u)=>Gu.has($u)):zu,qu=`${Y9}px ${a.length>0?a.map(()=>`${wn}px`).join(" "):"minmax(160px, 1fr)"}`,Zu=Du(z.ticks).filter(pu),Bu=String(J?.mode==="interval"?J?.interval?.procedureRunId||"":""),gu=String(J?.mode==="event"?J?.marker?.id||"":""),ll=()=>{let $u=H.current;if(!$u){w(Wu);return}let au=Math.max(0,$u.scrollTop-P9),Nf=Math.max(120,$u.clientHeight-P9),Yu=Math.min(s,au+Nf),Sl={startY:au,endY:Yu,startMs:Number(I.startMs),endMs:Number(I.endMs)},dl=Math.max(0,Math.min(1,au/s)),rr=Math.max(dl,Math.min(1,Yu/s)),Af=Math.max(1,Number(I.endMs)-Number(I.startMs));Sl.startMs=Number(I.startMs)+Af*dl,Sl.endMs=Number(I.startMs)+Af*rr,w(Sl)};Ln(()=>{let $u=H.current,au=window.setTimeout(ll,0);return $u?.addEventListener("scroll",ll),window.addEventListener("resize",ll),()=>{window.clearTimeout(au),$u?.removeEventListener("scroll",ll),window.removeEventListener("resize",ll)}},[E,I.startMs,I.endMs,s]);let Pu=Math.max(0,zu.length-a.length),Nl=new Set(p.filter(($u)=>a.includes(String($u.nodeId||""))&&uu($u)).map(($u)=>String($u.id))),Qf=new Map(p.map(($u)=>[String($u.id),$u])),Zf=Du(Y.arrows).filter(($u)=>{if(!Nl.has(String($u.targetMarkerId||"")))return!1;if(String($u.action||"")==="observe")return a.includes(String($u.sourceNodeId||""));return Nl.has(String($u.sourceMarkerId||""))}),$f=Y9+Math.max(1,a.length)*wn,nf=($u)=>{let au=o0($u.target.value);if(typeof $==="function")$(au);window.setTimeout(ll,0)},tf=()=>xS({title:`${f?.id||"pipeline"}-${E||"epoch"}-gantt`,meta:[`run ${E||"--"}`,`${wu(I.startMs)} -> ${wu(I.endMs)}`,`duration ${mr(I.durationMs)}`,`${d.label} / ${b9(d.pxPerMinute)} px/min`,`${a.length}/${zu.length} nodes`,`${p.length} markers`],visibleNodeIds:a,intervals:k,markers:p.filter(($u)=>a.includes(String($u.nodeId||""))),arrows:Zf,ticks:Zu,bounds:I,chartHeight:s,backendLayout:z}),Mf=pu(D?.gantt?.diagnostics)?D.gantt.diagnostics:null;return K(Wn,{title:"Epoch 甘特图",eyebrow:`${f?.id||"pipeline"} / ${u.length} epochs`,className:"pipeline-wide-panel",loading:i?.loading,actions:K("div",{className:"pipeline-gantt-actions"},K("select",{value:E,disabled:u.length===0,onChange:($u)=>A($u.target.value),"data-testid":"pipeline-epoch-select"},u.map(($u)=>K("option",{key:$u.runId,value:$u.runId},o9(u,$u)))),K("label",{className:"pipeline-gantt-toggle"},K("input",{type:"checkbox","data-testid":"pipeline-gantt-auto-hide-idle",checked:U,onChange:($u)=>{q(Boolean($u.target.checked)),window.setTimeout(ll,0)}}),K("span",null,"自动隐藏空闲列")),K("label",{className:"pipeline-gantt-scale"},K("span",null,K("b",null,"时间尺度"),K("em",{"data-testid":"pipeline-gantt-scale-label"},`${d.label} · ${b9(d.pxPerMinute)} px/min`)),K("input",{type:"range",min:0,max:100,step:0.01,value:B,onChange:nf,"aria-label":"调整甘特图时间尺度","data-testid":"pipeline-gantt-time-scale"}),K("small",null,K("span",null,"全局"),K("span",null,"细节"))),l?K("button",{type:"button",className:"ghost-btn",onClick:tf,disabled:a.length===0,"data-testid":"pipeline-export-gantt"},"导出甘特图"):null,l?K(ln,{title:`Pipeline Epoch ${l.runId}`,data:l,onOpen:L,testId:"raw-pipeline-epoch-gantt"}):null)},!l?K(Nr,{title:"暂无 Epoch",text:"当前 pipeline 还没有完整运行记录。"}):k.length===0?K(Nr,{title:"暂无时间区间",text:"等待 D601 Pipeline backend 在 procedure summary 中返回 startedAt / finishedAt。"}):K("div",{className:"pipeline-gantt-wrap"},K("div",{className:`pipeline-gantt-detail-layout ${m?"detail-open":"detail-collapsed"}`,"data-testid":"pipeline-gantt-detail-layout","data-sidebar-open":m?"true":"false"},K("div",{className:"pipeline-gantt-main"},K("div",{className:"pipeline-gantt-main-head"},K("div",{className:"pipeline-gantt-meta"},K("span",null,`time ${wu(I.startMs)} -> ${wu(I.endMs)}`),K("span",null,`duration ${mr(I.durationMs)}`),K("span",null,`scale ${d.label} / ${b9(d.pxPerMinute)} px/min`),K("span",null,`layout ${P}`),Mf?K("span",null,`align ${Mf.timeAxisAlignmentOk===!1?"check":"ok"}`):null,K("span",null,`visible ${a.length}/${zu.length} nodes`),D?K("span",null,`markers ${p.length}`):null,U&&Pu>0?K("span",null,`hidden idle ${Pu}`):null),!m?K("button",{type:"button",className:"pipeline-sidecar-tab right",disabled:!J?.mode,onClick:()=>S(!0),"data-testid":"pipeline-gantt-sidebar-toggle"},J?.mode?"展开详情":"点击甘特图元素展开详情"):null),K("div",{className:"pipeline-gantt-viewport",ref:H,"data-testid":"pipeline-epoch-gantt","data-pipeline-id":f?.id||"","data-run-id":E,"data-layout-source":P,"data-start-ms":String(I.startMs),"data-end-ms":String(I.endMs),"data-chart-height":String(s)},K("div",{className:"pipeline-gantt-board",style:{gridTemplateColumns:qu,minWidth:`${$f}px`}},K("div",{className:"pipeline-gantt-head time"},"Time"),a.length===0?K("div",{className:"pipeline-gantt-head empty"},"当前时间窗无工作节点"):a.map(($u)=>K("div",{key:`head-${$u}`,className:"pipeline-gantt-head node",title:$u,"data-testid":"pipeline-gantt-head-node","data-node-id":$u},K(QS,{value:$u}))),K("div",{className:"pipeline-gantt-time-axis",style:{height:`${s}px`}},Zu.map(($u)=>{let au=UL($u,I,s,z);return K("div",{key:`tick-${$u.ms}-${au}`,className:"pipeline-gantt-tick",style:{top:`${au}px`},"data-testid":"pipeline-gantt-tick","data-ms":String($u.ms),"data-y":String(au)},K("b",null,wu($u.ms)),K("span",null,`+${mr(Number($u.offsetMs??Number($u.ms)-Number(I.startMs)))}`))})),a.length>0?K("svg",{className:"pipeline-gantt-arrow-layer",width:a.length*wn,height:s,viewBox:`0 0 ${a.length*wn} ${s}`,style:{left:`${Y9}px`,top:`${P9}px`,width:`${a.length*wn}px`,height:`${s}px`},"aria-hidden":"true"},K("defs",null,K("marker",{id:"pipeline-gantt-arrowhead",viewBox:"0 0 10 10",refX:9,refY:5,markerWidth:6,markerHeight:6,orient:"auto-start-reverse"},K("path",{d:"M 0 0 L 10 5 L 0 10 z",fill:"context-stroke"}))),Zf.map(($u)=>{let au=Qf.get(String($u.targetMarkerId||""));if(!au)return null;let Nf=Qf.get(String($u.sourceMarkerId||"")),Yu=String(Nf?.nodeId||$u.sourceNodeId||""),Sl=a.indexOf(Yu),dl=a.indexOf(String(au.nodeId||""));if(Sl<0||dl<0)return null;let rr=Sl*wn+wn/2,Af=dl*wn+wn/2,Hf=Nf?Qr(Nf,I,s,z):Qr(au,I,s,z),Gn=Qr(au,I,s,z);return K("path",{key:$u.id,className:`pipeline-gantt-arrow ${String($u.sourceKind||"").toLowerCase()} ${String($u.status||"").toLowerCase()} ${String($u.action||"").toLowerCase()}`,d:JL(rr,Hf,Af,Gn),markerEnd:"url(#pipeline-gantt-arrowhead)","data-testid":String($u.action||"")==="observe"?"pipeline-gantt-observation-arrow":"pipeline-gantt-arrow","data-source-node-id":String($u.sourceNodeId||""),"data-target-node-id":String($u.targetNodeId||""),"data-target-marker-id":String($u.targetMarkerId||""),"data-action":String($u.action||""),"data-source-y":String(Hf),"data-target-y":String(Gn)})})):null,a.length===0?K("div",{className:"pipeline-gantt-empty-col",style:{height:`${s}px`}},"滚动到有活动的时间段后,相关 node 列会自动出现。"):a.map(($u)=>{let au=k.filter((Yu)=>Yu.nodeId===$u),Nf=p.filter((Yu)=>String(Yu.nodeId||"")===$u);return K("div",{key:`col-${$u}`,className:"pipeline-gantt-node-col",style:{height:`${s}px`}},au.map((Yu)=>{let Sl=XA(Yu,I,s,z),dl=e9(Yu,I,s,z),rr=FL(Yu,I,s,z),Af=String(Yu.procedureRunId||`${$u}-${Yu.startMs}`);return K("button",{key:Af,type:"button",className:`pipeline-gantt-bar ${Yu.status} ${Yu.live?"live":""} ${Bu===Af?"selected":""}`,style:{top:`${Sl}px`,height:`${rr}px`},title:`${$u} ${Yu.status} ${wu(Yu.startedAt||Yu.startMs)} -> ${wu(Yu.finishedAt||Yu.endMs)}`,onClick:()=>j(Yu),"data-testid":"pipeline-gantt-line","data-node-id":$u,"data-procedure-run-id":String(Yu.procedureRunId||""),"data-status":String(Yu.status||""),"data-live":Yu.live?"true":"false","data-start-ms":String(Yu.startMs||""),"data-end-ms":String(Yu.endMs||""),"data-y1":String(Sl),"data-y2":String(dl),"data-natural-height":String(Math.max(0,dl-Sl))},K("strong",null,Yu.status||"working"),K("span",null,mr(Yu.durationMs)))}),Nf.map((Yu)=>K("button",{key:Yu.id,type:"button",className:`pipeline-gantt-marker ${Yu.kind} ${Yu.tone||""} ${Yu.status||""} ${gu===String(Yu.id)?"selected":""}`,style:{top:`${Qr(Yu,I,s,z)}px`},title:`${Yu.label||"event"} / ${wu(Yu.timestampIso||Yu.timestamp||Yu.ms)}`,onClick:()=>F(Yu),"data-testid":Yu.kind==="prompt"?"pipeline-gantt-prompt-marker":"pipeline-gantt-control-marker","data-marker-id":String(Yu.id||""),"data-ms":String(Yu.ms??Yu.eventMs??""),"data-y":String(Qr(Yu,I,s,z))})))})))),m?K(JS,{selection:J,runDetails:i,nodeDetails:t,nodeDetailsState:y,onRaw:L,onCollapse:()=>S(!1)}):null)))}function on(){return{loading:!1,actionLoading:"",error:"",message:"",details:null,fetchedAt:null,appendPrompt:"",guidePrompt:"",modifyPrompt:"",approveReason:"",redoReason:""}}function I0(){return{mode:"",runId:"",interval:null,marker:null}}function v9(){return{runId:"",loading:!1,error:"",details:null,fetchedAt:null}}function hc(u,l){return`${u}/microservices/pipeline/proxy${l}`}function QX({activeRun:u,pipelineRuns:l,selectedRunId:f,onRunChange:r,selectedNodeId:n,selectedNodeConfig:i,selectedNodeRuntime:t,control:y,onControlChange:c,onFetch:$,onAction:A,onRaw:j,onCollapse:F}){let J=String(u?.runId||""),Q=String(t?.status||"pending"),W=!J||!n||y.loading||Boolean(y.actionLoading),L=(q)=>(N)=>c({[q]:N.target.value,error:"",message:""}),U=l.length>0?l:u?[u]:[];return K("aside",{className:"pipeline-node-control","data-testid":"pipeline-node-control"},K("div",{className:"pipeline-node-control-head"},K("div",null,K("p",{className:"panel-eyebrow"},"Manual Node Control"),K(rl,{title:n||"点击控制图中的 node",level:3,loading:y.loading||Boolean(y.actionLoading)})),K("div",{className:"pipeline-node-control-head-actions"},n?K(a0,{status:Q},Q):K(a0,{status:"pending"},"idle"),K("button",{type:"button",className:"ghost-btn mini",onClick:F,"data-testid":"pipeline-node-sidebar-collapse"},"收起"))),K("div",{className:"pipeline-control-runbar"},K("label",null,K("span",null,"目标 run"),K("select",{value:J||f,disabled:U.length===0,onChange:(q)=>r(q.target.value),"data-testid":"pipeline-node-run-select"},U.map((q)=>K("option",{key:q.runId,value:q.runId},`${q.runId||"--"} / ${q.status||"--"}`)))),K("button",{type:"button",className:"ghost-btn",disabled:W,onClick:$,"data-testid":"pipeline-node-fetch"},y.loading?"抓取中":"抓取过程"),y.details?K(ln,{title:`Pipeline Node ${n}`,data:y.details,onOpen:j,testId:"raw-pipeline-node-control"}):null),K("div",{className:"pipeline-control-meta"},K("span",null,K("b",null,"kind"),String(i?.kind||"--")),K("span",null,K("b",null,"procedure"),String(t?.currentProcedureRunId||"--")),K("span",null,K("b",null,"attempts"),String(t?.attempts??"--")),K("span",null,K("b",null,"updated"),wu(u?.updatedAt))),!n?K(Nr,{title:"未选择 node",text:"点击 React Flow 控制图中的任意 node 后,可抓取执行过程、追加 prompt、下发引导、增量修改、审核通过或重做。"}):null,K(nl,{error:y.error,wide:!0}),K("div",{className:"pipeline-control-actions"},K("label",null,K("span",null,"实时追加 prompt(仅 running node)"),K("textarea",{value:y.appendPrompt,onChange:L("appendPrompt"),placeholder:"让当前执行中的 agent 继续、补充检查或调整当前步骤...",rows:4,disabled:!n,"data-testid":"pipeline-node-append-input"}),K("button",{type:"button",className:"primary-btn compact",disabled:W||!String(y.appendPrompt||"").trim(),onClick:()=>A("append"),"data-testid":"pipeline-node-append-button"},y.actionLoading==="append"?"追加中":"追加到运行中 node")),K("label",null,K("span",null,"下次尝试引导 prompt"),K("textarea",{value:y.guidePrompt,onChange:L("guidePrompt"),placeholder:"给该 node 下一次 attempt 的执行提示;不会立即打断当前 session。",rows:4,disabled:!n,"data-testid":"pipeline-node-guide-input"}),K("button",{type:"button",className:"ghost-btn compact",disabled:W||!String(y.guidePrompt||"").trim(),onClick:()=>A("guide"),"data-testid":"pipeline-node-guide-button"},y.actionLoading==="guide"?"下发中":"下发 guide")),K("label",null,K("span",null,"完成后增量修改 prompt"),K("textarea",{value:y.modifyPrompt,onChange:L("modifyPrompt"),placeholder:"在该 node 已完成结果基础上追加修改要求;runner 会重跑目标 node,并保留同 node 既有 OA 输出作为上下文。",rows:4,disabled:!n,"data-testid":"pipeline-node-modify-input"}),K("button",{type:"button",className:"ghost-btn compact",disabled:W||!String(y.modifyPrompt||"").trim(),onClick:()=>A("modify"),"data-testid":"pipeline-node-modify-button"},y.actionLoading==="modify"?"排队中":"增量修改 node")),K("label",null,K("span",null,"Monitor 审核通过原因"),K("textarea",{value:y.approveReason,onChange:L("approveReason"),placeholder:"当流程配置开启 monitor 审核时,记录审核通过原因并释放后续 node。",rows:3,disabled:!n,"data-testid":"pipeline-node-approve-input"}),K("button",{type:"button",className:"primary-btn compact",disabled:W||!String(y.approveReason||"").trim(),onClick:()=>A("approve"),"data-testid":"pipeline-node-approve-button"},y.actionLoading==="approve"?"提交中":"审核通过")),K("label",null,K("span",null,"重做 / restart 原因"),K("textarea",{value:y.redoReason,onChange:L("redoReason"),placeholder:"说明为什么需要重做;runner 会重置目标 node 以及非 rework 下游 node。",rows:4,disabled:!n,"data-testid":"pipeline-node-redo-input"}),K("button",{type:"button",className:"danger-btn compact",disabled:W||!String(y.redoReason||"").trim(),onClick:()=>A("redo"),"data-testid":"pipeline-node-redo-button"},y.actionLoading==="redo"?"排队中":"重做 node"))),K("div",{className:"pipeline-control-evidence"},K("strong",null,"Node 过程索引"),K(AX,{details:y.details,selectedNodeId:n,selectedNodeRuntime:t,control:y,onRaw:j})))}function QL({microservices:u,onRaw:l,apiBaseUrl:f="/api"}){let r=u.find((fu)=>fu.id==="pipeline")||null,[n,i]=ef({loading:!1,error:"",health:null,snapshot:null,oaDiagnostics:null,minimaxQuota:null,refreshedAt:null}),[t,y]=ef(""),[c,$]=ef(""),[A,j]=ef(""),[F,J]=ef(on()),[Q,W]=ef({}),[L,U]=ef(I0()),[q,N]=ef(v9()),[w,G]=ef(ac),[Z,H]=ef(!1),[E,m]=ef(!1),S=g0(0),{addNotification:B}=Xf(),D=g0(!1),X=g0(0),O=g0(""),Y=g0({}),p=g0(""),v=g0("");async function z(fu={}){let Vu=fu.silent===!0;if(!r)return;if(D.current)return;D.current=!0;let Xu=S.current+1;if(S.current=Xu,!Vu)i((ou)=>({...ou,loading:!0,error:""}));try{let ou=`__unideskArrayLimit=registry.components:80,runs:${dp}`,[Al,kl,_l]=await Promise.all([k0(`${f}/microservices/pipeline/proxy/api/snapshot?${ou}`,{cache:"no-store"}),k0(`${f}/microservices/pipeline/proxy/api/oa-event-flow/diagnostics`,{cache:"no-store"}).catch((Sr)=>({ok:!1,error:Ou(Sr,"OA event flow diagnostics failed")})),k0(`${f}/microservices/pipeline/proxy/api/model-quota/minimax`,{cache:"no-store"}).catch((Sr)=>({ok:!1,error:Ou(Sr,"MiniMax quota failed")}))]);if(Xu!==S.current)return;let qf={ok:Al?.ok!==!1,service:"pipeline-v2-control snapshot"};i({loading:!1,error:"",health:qf,snapshot:Al,oaDiagnostics:kl,minimaxQuota:_l,refreshedAt:new Date})}catch(ou){if(Xu!==S.current)return;i((Al)=>({...Al,loading:!1,error:Ou(ou,"Pipeline 加载失败")}))}finally{D.current=!1}}Ln(()=>{if(z(),!r)return;let fu=()=>{if(GA())z({silent:!0})},Vu=window.setInterval(()=>{fu()},ZW),Xu=()=>{if(GA())fu()};return document.addEventListener("visibilitychange",Xu),()=>{window.clearInterval(Vu),document.removeEventListener("visibilitychange",Xu)}},[r?.id,r?.runtime?.providerStatus,f]);let P=NS(r),k=wS(r),I=qS(r),b=n.snapshot||{},d=n.oaDiagnostics||null,s=n.minimaxQuota||null,{components:h,pipelines:lu,runs:cu}=WS(b),_u=String(cu[0]?.pipelineId||""),Fu=(_u?lu.find((fu)=>String(fu.id||"")===_u):null)||lu[0]||{},zu=lu.find((fu)=>String(fu.id||"")===t)||Fu,Wu=String(zu.id||""),C=rL(zu),e=n7(zu),uu=bW(cu,Wu),Gu=bS(cu,Wu),a=Gu.find((fu)=>String(fu?.runId||"")===c)||uu,qu=String(q.runId||"")===String(a?.runId||"")?GS(q.details):null,Zu=zS(a,qu),Bu=String(Zu?.runId||""),gu=C.find((fu)=>String(fu?.id||"")===A)||null,ll=A?nL(Zu,A):null,Pu=TS(cu),Nl=HS(h),Qf=Number(n.health?.components)||YW(b,"registry.components",h.length),Zf=YW(b,"runs",cu.length),$f=MW(zu,Zu,h),nf={nodes:$f.nodes.map((fu)=>fu.id===A?{...fu,selected:!0,className:`${fu.className||""} selected-control-node`}:fu),edges:$f.edges},tf=lu.map((fu)=>{let Vu=String(fu.id||"pipeline"),Xu=bW(cu,Vu);return{title:`${Vu}-${Xu?.runId||"snapshot"}`,flow:MW(fu,Xu,h)}}),Mf=String(L?.runId||Bu||""),$u=String(L?.interval?.nodeId||L?.marker?.nodeId||""),au=Mf&&$u?Q[h9(Mf,$u)]||null:null,Nf=VA(F.details,Mf,$u),Yu=VA(au?.details,Mf,$u)||Nf,Sl=Mf&&$u?{...pu(au)?au:{},runId:Mf,nodeId:$u,details:Yu,loading:Boolean(au?.loading)||!Yu&&Boolean(F.loading)&&A===$u,error:String(au?.error||""),fetchedAt:au?.fetchedAt||(Nf?F.fetchedAt:null)}:null,dl=Gu.map((fu)=>String(fu?.runId||"")).filter(Boolean).join("|"),rr=C.map((fu)=>String(fu?.id||"")).filter(Boolean).join("|");Ln(()=>{p.current=A},[A]),Ln(()=>{v.current=Bu},[Bu]),Ln(()=>{if(!c||dl.split("|").includes(c))return;$("")},[c,dl]),Ln(()=>{if(!A||rr.split("|").includes(A))return;j(""),J(on()),U(I0()),H(!1),m(!1)},[A,rr]),Ln(()=>{if(!A)H(!1)},[A]),Ln(()=>{if(!L.mode)m(!1)},[L.mode]);async function Af(fu=Bu,Vu={}){if(!fu){N(v9());return}let Xu=o0(Vu.scale??w??ac),ou=`${fu}:timeline`;if(O.current===ou)return;O.current=ou;let Al=Vu.silent===!0,kl=X.current+1;X.current=kl,N((_l)=>({runId:fu,scale:Xu,loading:!Al||String(_l.runId||"")!==fu||!_l.details,error:"",details:Al&&_l.runId===fu?_l.details:_l.runId===fu?_l.details:null,fetchedAt:_l.runId===fu?_l.fetchedAt:null}));try{let[_l,qf]=await Promise.all([k0(hc(f,`/api/node-control/runs/${encodeURIComponent(fu)}?tail=160&view=timeline`),{cache:"no-store",strictJson:!0}),k0(hc(f,`/api/runs/${encodeURIComponent(fu)}`),{cache:"no-store"}).catch((Sr)=>({ok:!1,runSummaryError:Ou(Sr,"抓取评分失败")}))]);if(kl!==X.current)return;N({runId:fu,scale:Xu,loading:!1,error:"",details:{..._l,run:pu(qf?.run)?qf.run:void 0,runSummaryError:qf?.runSummaryError},fetchedAt:new Date})}catch(_l){if(kl!==X.current)return;N((qf)=>({runId:fu,scale:Xu,loading:!1,error:Ou(_l,"抓取 epoch 执行过程失败"),details:qf.runId===fu?qf.details:null,fetchedAt:qf.runId===fu?qf.fetchedAt:null}))}finally{if(O.current===ou)O.current=""}}function Hf(fu,Vu,Xu){let ou=h9(fu,Vu);W((Al)=>{let kl={...Al,[ou]:{...pu(Al?.[ou])?Al[ou]:{},runId:fu,nodeId:Vu,...Xu}},_l=Object.keys(kl);if(_l.length>32)for(let qf of _l.slice(0,_l.length-32))delete kl[qf];return kl})}async function Gn(fu,Vu){if(!fu||!Vu)return;let Xu=h9(fu,Vu),ou=Number(Y.current?.[Xu]||0)+1;Y.current={...Y.current,[Xu]:ou},Hf(fu,Vu,{loading:!0,error:""});try{let Al=await k0(hc(f,`/api/node-control/runs/${encodeURIComponent(fu)}/nodes/${encodeURIComponent(Vu)}?tail=160`),{cache:"no-store",strictJson:!0});if(Number(Y.current?.[Xu]||0)!==ou)return;let kl=new Date;if(Hf(fu,Vu,{loading:!1,details:Al,fetchedAt:kl,error:""}),p.current===Vu&&v.current===fu)J((_l)=>({..._l,loading:!1,details:Al,fetchedAt:kl,error:""}))}catch(Al){if(Number(Y.current?.[Xu]||0)!==ou)return;Hf(fu,Vu,{loading:!1,error:Ou(Al,"抓取 Gantt node 详情失败")})}}Ln(()=>{if(!Bu){N(v9());return}Af(Bu);let fu=()=>{if(GA())Af(Bu,{silent:!0})},Vu=window.setInterval(()=>{fu()},ZW),Xu=()=>{if(GA())fu()};return document.addEventListener("visibilitychange",Xu),()=>{window.clearInterval(Vu),document.removeEventListener("visibilitychange",Xu)}},[Bu,f]);async function nr(fu=Bu,Vu=A){if(!fu||!Vu){J((Xu)=>({...Xu,error:"请先选择 run 和 node",message:""}));return}J((Xu)=>({...Xu,loading:!0,error:"",message:""}));try{let Xu=await k0(hc(f,`/api/node-control/runs/${encodeURIComponent(fu)}/nodes/${encodeURIComponent(Vu)}?tail=160`),{cache:"no-store",strictJson:!0}),ou=new Date;J((Al)=>({...Al,loading:!1,details:Xu,fetchedAt:ou,error:""})),Hf(fu,Vu,{loading:!1,details:Xu,fetchedAt:ou,error:""})}catch(Xu){J((ou)=>({...ou,loading:!1,error:Ou(Xu,"抓取 node 执行过程失败")}))}}async function u0(fu){let Vu=String(fu?.runId||Bu||""),Xu=String(fu?.nodeId||"");if(U({mode:"interval",runId:Vu,interval:fu,marker:null}),m(!0),!Vu||!Xu)return;if(Vu!==Bu)$(Vu);j(Xu),J(on()),Af(Vu,{silent:!0}),Gn(Vu,Xu)}async function $l(fu){let Vu=String(fu?.runId||Bu||""),Xu=String(fu?.nodeId||"");if(U({mode:"event",runId:Vu,interval:null,marker:fu}),m(!0),!Vu)return;if(Vu!==Bu)$(Vu);if(Af(Vu,{silent:!0}),!Xu)return;j(Xu),J(on()),Gn(Vu,Xu)}async function lt(fu){if(!Bu||!A){J((ou)=>({...ou,error:"请先选择 run 和 node",message:""}));return}let Vu=fu==="append"?"prompts":fu,Xu=fu==="append"?F.appendPrompt:fu==="guide"?F.guidePrompt:fu==="modify"?F.modifyPrompt:fu==="approve"?F.approveReason:F.redoReason;if(!String(Xu||"").trim()){J((ou)=>({...ou,error:"操作内容不能为空",message:""}));return}J((ou)=>({...ou,actionLoading:fu,error:"",message:""}));try{let ou=fu==="redo"||fu==="approve"?{reason:Xu,source:"unidesk-frontend",sourceKind:"webui"}:{prompt:Xu,source:"unidesk-frontend",sourceKind:"webui"},Al=await k0(hc(f,`/api/node-control/runs/${encodeURIComponent(Bu)}/nodes/${encodeURIComponent(A)}/${Vu}`),{method:"POST",body:JSON.stringify(ou)});if(J((_l)=>({..._l,actionLoading:"",details:Al,fetchedAt:new Date,appendPrompt:fu==="append"?"":_l.appendPrompt,guidePrompt:fu==="guide"?"":_l.guidePrompt,modifyPrompt:fu==="modify"?"":_l.modifyPrompt,approveReason:fu==="approve"?"":_l.approveReason,redoReason:fu==="redo"?"":_l.redoReason,message:fu==="append"?"已追加到运行中 node":fu==="guide"?"已下发 guide,等待 runner 处理":fu==="modify"?"已排队增量修改命令":fu==="approve"?"已提交审核通过决策":"已排队重做命令"})),B("success",fu==="append"?"已追加到运行中 node":fu==="guide"?"已下发 guide,等待 runner 处理":fu==="modify"?"已排队增量修改命令":fu==="approve"?"已提交审核通过决策":"已排队重做命令"),await nr(Bu,A),await Af(Bu,{silent:!0}),fu!=="append")await z()}catch(ou){J((Al)=>({...Al,actionLoading:"",error:Ou(ou,"node 控制操作失败")}))}}if(!r)return K(Nr,{title:"Pipeline 未登记",text:"请在 config.json 的 microservices 中登记用户服务 id=pipeline"});return K("div",{className:"pipeline-page","data-testid":"pipeline-page"},K(Wn,{title:"Pipeline v2 工作台",eyebrow:"D601 Snapshot 用户服务",loading:n.loading,actions:K("div",{className:"panel-actions"},K("button",{type:"button",className:"ghost-btn",onClick:z,disabled:n.loading,"data-testid":"pipeline-refresh-button"},n.loading?"刷新中":"刷新"),K(ln,{title:"Pipeline 用户服务",data:r,onOpen:l,testId:"raw-pipeline-service"}))},K("div",{className:"pipeline-hero"},K("div",null,K("div",{className:"node-version-line"},K(a0,{status:P.providerStatus==="online"?"online":"warn"},P.providerStatus||"unknown"),K("span",null,r.providerId),K("span",null,I.public?"公网暴露":"仅 UniDesk frontend 代理访问")),K("p",{className:"muted paragraph"},r.description)),K("div",{className:"microservice-ref-card"},K("span",null,"Repo"),K("strong",null,k.url||"--"),K("code",null,k.commitId||"--")),K("div",{className:"microservice-ref-card"},K("span",null,"D601 Docker"),K("strong",null,`${I.nodeBindHost||"--"}:${I.nodePort||"--"}`),K("code",null,`${k.composeFile||"--"} / ${k.composeService||"--"}`))),K(nl,{error:n.error,wide:!0})),K("div",{className:"pipeline-grid"},K(Wn,{title:"控制图",eyebrow:`${zu.id||"pipeline"} / run ${Zu?.status||"--"}`,className:"pipeline-wide-panel",loading:n.loading,actions:K("div",{className:"pipeline-toolbar"},K("select",{value:Wu,disabled:lu.length===0,onChange:(fu)=>{y(fu.target.value),$(""),j(""),J(on()),U(I0()),H(!1),m(!1)},"data-testid":"pipeline-select"},lu.map((fu)=>K("option",{key:fu.id,value:fu.id},fu.id||fu.key))),K("select",{value:Bu,disabled:Gu.length===0,onChange:(fu)=>{if($(fu.target.value),J(on()),U(I0()),H(!1),m(!1),A)nr(fu.target.value,A)},"data-testid":"pipeline-run-select"},Gu.map((fu)=>K("option",{key:fu.runId,value:fu.runId},o9(Gu,fu)))),K("button",{type:"button",className:"ghost-btn",disabled:nf.nodes.length===0,onClick:()=>yL(nf,`${zu.id||"pipeline"}-${Zu?.runId||"snapshot"}`),"data-testid":"pipeline-export-graph"},"导出渲染图"),K("button",{type:"button",className:"ghost-btn",disabled:tf.every((fu)=>fu.flow.nodes.length===0),onClick:()=>hS(tf),"data-testid":"pipeline-export-all-graphs"},"批量导出"))},C.length===0?K(Nr,{title:"暂无控制图",text:"等待 D601 pipeline backend 返回 config.nodes / config.edges"}):K("div",{className:`pipeline-control-shell ${Z?"detail-open":"detail-collapsed"}`,"data-testid":"pipeline-control-shell","data-sidebar-open":Z?"true":"false"},K("div",{className:"pipeline-flow-frame","data-testid":"pipeline-react-flow"},K(LW,{nodes:nf.nodes,edges:nf.edges,nodeTypes:rS,edgeTypes:fS,fitView:!0,fitViewOptions:{padding:0.18},nodesDraggable:!1,nodesConnectable:!1,elementsSelectable:!0,minZoom:0.25,maxZoom:1.4,proOptions:{hideAttribution:!0},onNodeClick:(fu,Vu)=>{let Xu=String(Vu.id);if(j(Xu),J(on()),H(!0),Bu)nr(Bu,Xu)}},K(KW,{gap:22,size:1,color:"rgba(215, 161, 58, 0.24)"}),K(zW,{showInteractive:!1})),!Z?K("button",{type:"button",className:"pipeline-sidecar-tab right",disabled:!A,onClick:()=>H(!0),"data-testid":"pipeline-node-sidebar-toggle"},A?"展开 node 控制":"点击 node 展开控制"):null),Z?K(QX,{activeRun:Zu,pipelineRuns:Gu,selectedRunId:c,onRunChange:(fu)=>{if($(fu),J(on()),U(I0()),A)nr(fu,A)},selectedNodeId:A,selectedNodeConfig:gu,selectedNodeRuntime:ll,control:F,onControlChange:(fu)=>J((Vu)=>({...Vu,...fu})),onFetch:()=>nr(),onAction:lt,onRaw:l,onCollapse:()=>H(!1)}):null),K("div",{className:"pipeline-flow-summary"},K("span",null,`${nf.nodes.length} nodes`),K("span",null,`${nf.edges.length} edges`),K("span",null,`${lu.length} pipelines`),K("span",null,`source config+components(${h.length})`),K("span",null,`run ${Zu?.runId||"--"}`),K("span",null,`score ${a9(Zu)}`),K("span",null,A?`selected ${A}`:"click node to control"))),K(JX,{epochs:Gu,activeRun:Zu,activePipeline:zu,pipelineNodes:C,pipelineEdges:e,selection:L,detailOpen:E,onDetailOpenChange:m,runDetails:q,nodeDetails:Yu,nodeDetailsState:Sl,ganttScale:w,onGanttScaleChange:G,onIntervalSelect:u0,onMarkerSelect:$l,onRunChange:(fu)=>{if($(fu),J(on()),U(I0()),m(!1),A)nr(fu,A)},onRaw:l}),K(Wn,{title:"观测指标",eyebrow:n.refreshedAt?`Updated ${yl(n.refreshedAt)}`:"Snapshot",loading:n.loading},K("div",{className:"metric-grid"},K(Cf,{label:"Health",value:n.health?.ok?"OK":"--",hint:n.health?.service||"D601 /health",tone:n.health?.ok?"ok":"warn"}),K(Cf,{label:"组件",value:Qf,hint:"components registry",tone:b?.registry?.ok===!1?"warn":"ok"}),K(Cf,{label:"Pipeline",value:lu.length,hint:`${C.length} nodes / ${e.length} edges`}),K(Cf,{label:"运行记录",value:Zf,hint:`${Pu.succeeded||0} succeeded / ${Pu.running||0} running`}),K(Cf,{label:"OA 记录",value:Array.isArray(uu?.submissions)?uu.submissions.length:0,hint:uu?.runId||"latest run"}),K(Cf,{label:"Procedure",value:Array.isArray(uu?.procedureRuns)?uu.procedureRuns.length:0,hint:uu?.status||"no run"}),K(Cf,{label:"Score",value:a9(Zu),hint:Zu?.runId||"selected epoch",tone:t7(Zu)})),K("div",{className:"panel-actions inline-actions"},K(ln,{title:"Pipeline Snapshot",data:b,onOpen:l,testId:"raw-pipeline-snapshot"}))),K(Wn,{title:"评分器",eyebrow:Zu?.runId||"selected epoch",loading:n.loading},K(ZS,{run:Zu,onRaw:l})),K(Wn,{title:"MiniMax 限额",eyebrow:"model/minimax-m27 quota",loading:n.loading},K(UX,{quota:s,onRaw:l})),K(Wn,{title:"OA 事件流",eyebrow:"100% event-driven diagnostics",className:"pipeline-wide-panel",loading:n.loading},K(FX,{diagnostics:d,onRaw:l})),K(Wn,{title:"组件矩阵",eyebrow:`${Nl.length} classes`,loading:n.loading},Nl.length===0?K(Nr,{title:"暂无组件",text:"等待 D601 pipeline backend 返回 registry.components"}):K("div",{className:"component-strata"},Nl.map((fu)=>K("article",{key:fu.name,className:"component-stratum"},K("span",null,fu.name),K("strong",null,fu.count)))),K("div",{className:"pipeline-component-list"},h.slice(0,12).map((fu)=>K("span",{key:fu.key,className:"data-chip"},K("b",null,fu.componentClass||"--"),K("span",null,fu.id||fu.key||"--"))))),K(Wn,{title:"Epoch 列表",eyebrow:`${Gu.length}/${Zf} preview`,loading:n.loading},Gu.length===0?K(Nr,{title:"暂无运行记录",text:"当前 pipeline 在 .state/pipeline-runs 中还没有 epoch。"}):K("div",{className:"pipeline-run-list"},Gu.map((fu)=>{let Vu=String(fu?.runId||"")===Bu?Zu:fu;return K("article",{key:fu.runId,className:`pipeline-run-card ${String(fu.runId||"")===Bu?"active":""}`,role:"button",tabIndex:0,onClick:()=>{$(String(fu.runId||"")),U(I0())},onKeyDown:(Xu)=>{if(Xu.key==="Enter"||Xu.key===" ")$(String(fu.runId||"")),U(I0())}},K("div",{className:"node-card-head"},K("strong",null,o9(Gu,fu)),K(a0,{status:fu.status},fu.status||"--")),K("div",{className:"docker-meta compact"},K("span",null,Vu?.pipelineId||"--"),K("span",null,`nodes ${Array.isArray(Vu?.nodes)?Vu.nodes.length:0}`),K("span",null,`oa ${Array.isArray(Vu?.submissions)?Vu.submissions.length:0}`),K("span",null,`procedures ${Array.isArray(Vu?.procedureRuns)?Vu.procedureRuns.length:0}`),K(OS,{run:Vu})),K("p",{className:"muted paragraph"},BA(Vu?.task)),K("span",{className:"pipeline-run-time"},wu(Vu?.updatedAt)))}))),K(Wn,{title:"运行材料索引",eyebrow:Zu?.runId||"selected epoch",className:"pipeline-wide-panel",loading:n.loading},K(jX,{activeRun:Zu,onRaw:l}))))}var xA=Cu(Jl(),1);var yu=xA.default.createElement,{useEffect:NX}=xA.default,MA=xA.default.useState,$7={id:"",sequenceNo:"",contractNo:"",name:"",currentStatus:"",pending:"",paymentStatus:"",notes:""};function qX({status:u,children:l}){let f=String(u||"unknown").toLowerCase();return yu("span",{className:`status-badge ${f}`},l||u||"unknown")}function RA({label:u,value:l,hint:f,tone:r}){return yu("article",{className:`metric-card ${r||""}`},yu("div",{className:"metric-label"},u),yu("div",{className:"metric-value"},l),yu("div",{className:"metric-hint"},f))}function A7({title:u,eyebrow:l,actions:f,children:r,className:n,loading:i}){return yu("section",{className:`panel ${n||""}`},yu("div",{className:"panel-head"},yu("div",null,l?yu("p",{className:"panel-eyebrow"},l):null,yu(rl,{title:u,loading:i})),f?yu("div",{className:"panel-actions"},f):null),yu("div",{className:"panel-body"},r))}function NL({title:u,data:l,onOpen:f,testId:r}){return yu("button",{type:"button",className:"ghost-btn","data-testid":r,onClick:()=>f(u,l)},"查看原始JSON")}function qL({title:u,text:l}){return yu("div",{className:"empty-state"},yu("strong",null,u),yu("span",null,l))}function wX(u){return u?.runtime&&typeof u.runtime==="object"&&!Array.isArray(u.runtime)?u.runtime:{}}function WX(u){return u?.backend&&typeof u.backend==="object"&&!Array.isArray(u.backend)?u.backend:{}}function LX(u){return u?.repository&&typeof u.repository==="object"&&!Array.isArray(u.repository)?u.repository:{}}function Zy(u,l){return`${u}/microservices/project-manager/proxy${l}`}function TX(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 KX(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 j7(u){return String(u||"item").replace(/[^A-Za-z0-9_-]+/g,"-")}function GX(u){let l=new Uint8Array(u),f="",r=32768;for(let n=0;nyu("tr",{key:n.id,className:l===n.id?"active-row":"","data-testid":`project-manager-row-${j7(n.id)}`},yu("td",null,n.sequenceNo??"--"),yu("td",null,yu("strong",null,n.contractNo||"--"),yu("code",null,n.id||"--")),yu("td",null,yu("strong",null,n.name||"--"),yu("span",{className:"muted block"},n.sourceFile||"--")),yu("td",null,n.currentStatus||"--"),yu("td",null,yu("span",{className:"preline"},n.pending||"--")),yu("td",null,yu(qX,{status:Number(n.paymentRatio||0)>=1?"online":"warn"},n.paymentStatus||"--")),yu("td",null,n.notes||"--"),yu("td",null,yu("div",{className:"inline-actions"},yu("button",{type:"button",className:"ghost-btn",onClick:()=>f(n),"data-testid":`project-manager-edit-${j7(n.id)}`},"编辑"),yu(NL,{title:`Project ${n.contractNo||n.id}`,data:n,onOpen:r,testId:`raw-project-${j7(n.id)}`}))))))))}function wL({microservices:u,onRaw:l,apiBaseUrl:f="/api"}){let r=u.find((E)=>E.id==="project-manager")||null,[n,i]=MA({loading:!1,saving:!1,importing:!1,exporting:!1,error:"",notice:"",health:null,list:null,refreshedAt:null}),[t,y]=MA({...$7}),[c,$]=MA(""),[A,j]=MA("all"),{addNotification:F}=Xf();async function J(E=c,m=A){if(!r)return;i((S)=>({...S,loading:!0,error:""}));try{let S=new URLSearchParams({pageSize:"200",status:m});if(E.trim())S.set("q",E.trim());let[B,D]=await Promise.all([Eu(`${f}/microservices/project-manager/health`),Eu(Zy(f,`/api/projects?${S.toString()}`))]);i((X)=>({...X,loading:!1,health:B,list:D,refreshedAt:new Date,error:""}))}catch(S){i((B)=>({...B,loading:!1,error:Ou(S,"Project Manager 加载失败")}))}}NX(()=>{J()},[r?.id,r?.runtime?.providerStatus]);async function Q(E){E.preventDefault(),i((m)=>({...m,saving:!0,error:"",notice:""}));try{let m=KX(t);if(t.id)await Eu(Zy(f,`/api/projects/${encodeURIComponent(t.id)}`),{method:"PUT",body:JSON.stringify(m)});else await Eu(Zy(f,"/api/projects"),{method:"POST",body:JSON.stringify(m)});let S=t.id?"项目已更新":"项目已创建";i((B)=>({...B,saving:!1,notice:S})),F("success",S),await J()}catch(m){i((S)=>({...S,saving:!1,error:Ou(m,"保存项目失败")}))}}async function W(){if(!t.id)return;if(!window.confirm(`删除项目 ${t.contractNo||t.name||t.id} ?`))return;i((E)=>({...E,saving:!0,error:"",notice:""}));try{await Eu(Zy(f,`/api/projects/${encodeURIComponent(t.id)}`),{method:"DELETE"}),y({...$7});let E="项目已删除";i((m)=>({...m,saving:!1,notice:E})),F("success",E),await J()}catch(E){i((m)=>({...m,saving:!1,error:Ou(E,"删除项目失败")}))}}async function L(E){let m=E.target.files?.[0];if(!m)return;i((S)=>({...S,importing:!0,error:"",notice:""}));try{let S=GX(await m.arrayBuffer()),D=`Excel 已导入 ${(await Eu(Zy(f,"/api/import/excel"),{method:"POST",body:JSON.stringify({fileName:m.name,contentBase64:S,replace:!1})})).imported||0} 条项目`;i((X)=>({...X,importing:!1,notice:D})),F("success",D),E.target.value="",await J()}catch(S){i((B)=>({...B,importing:!1,error:Ou(S,"Excel 导入失败")}))}}async function U(){i((E)=>({...E,exporting:!0,error:""}));try{let E=await mJ(Zy(f,"/api/projects/export.xlsx")),m=URL.createObjectURL(E),S=document.createElement("a");S.href=m,S.download=`project-manager-${$j()}.xlsx`,document.body.appendChild(S),S.click(),S.remove(),URL.revokeObjectURL(m),i((B)=>({...B,exporting:!1,notice:"Excel 已导出"}))}catch(E){i((m)=>({...m,exporting:!1,error:Ou(E,"Excel 导出失败")}))}}if(!r)return yu(qL,{title:"Project Manager 未登记",text:"请在 config.json 的 microservices 中登记用户服务 id=project-manager"});let q=wX(r),N=LX(r),w=WX(r),G=Array.isArray(n.list?.projects)?n.list.projects:[],Z=n.list?.summary||{},H=n.health||{};return yu("div",{className:"project-manager-page","data-testid":"project-manager-page"},yu(A7,{title:"项目管理工作台",eyebrow:"Main Server PostgreSQL 用户服务",loading:n.loading||n.exporting,actions:yu("div",{className:"panel-actions"},yu("button",{type:"button",className:"ghost-btn",disabled:n.loading,onClick:()=>J(),"data-testid":"project-manager-refresh-button"},n.loading?"刷新中":"刷新"),yu("button",{type:"button",className:"ghost-btn",disabled:n.exporting,onClick:U,"data-testid":"project-manager-export-button"},n.exporting?"导出中":"导出 Excel"),yu(NL,{title:"Project Manager 用户服务",data:r,onOpen:l,testId:"raw-project-manager-service"}))},yu("div",{className:"project-manager-hero"},yu(RA,{label:"项目总数",value:Z.total??G.length,hint:`PG 表 ${H.storage?.table||"project_manager_projects"}`,tone:"ok"}),yu(RA,{label:"进行中",value:Z.active??"--",hint:"当前状态未完全完成"}),yu(RA,{label:"已完成",value:Z.completed??"--",hint:"按 完成 关键字统计",tone:"ok"}),yu(RA,{label:"未全款",value:Z.unpaid??"--",hint:"付款比例 < 1",tone:Number(Z.unpaid||0)>0?"warn":"ok"})),yu(nl,{error:n.error}),n.notice?yu("div",{className:"form-success"},n.notice):null),yu("div",{className:"project-manager-hero"},yu("div",{className:"microservice-ref-card"},yu("span",null,"Repo"),yu("strong",null,N.url||"--"),yu("code",null,N.commitId||"--")),yu("div",{className:"microservice-ref-card"},yu("span",null,"Main Server Docker"),yu("strong",null,`${w.nodeBindHost||"--"}:${w.nodePort||"--"}`),yu("code",null,`${N.composeService||"--"} / ${N.containerName||"--"}`)),yu("div",{className:"microservice-ref-card"},yu("span",null,"Runtime"),yu("strong",null,q.providerName||r.providerId),yu("code",null,`Health ${H.ok?"OK":"--"} / ${n.refreshedAt?yl(n.refreshedAt):"--"}`)),yu("div",{className:"microservice-ref-card"},yu("span",null,"Import Source"),yu("strong",null,"D601 WeChat Excel"),yu("code",null,"合作项目列表_I_20260309.xlsx"))),yu("div",{className:"project-manager-layout"},yu(A7,{title:"项目清单",eyebrow:"CRUD + Excel Export",loading:n.loading||n.importing||n.exporting,actions:yu("div",{className:"inline-actions project-manager-filters"},yu("input",{value:c,onChange:(E)=>$(E.target.value),placeholder:"搜索合同号 / 项目名称 / 状态","data-testid":"project-manager-search"}),yu("select",{value:A,onChange:(E)=>{j(E.target.value),J(c,E.target.value)},"data-testid":"project-manager-status-filter"},yu("option",{value:"all"},"全部"),yu("option",{value:"active"},"进行中"),yu("option",{value:"completed"},"已完成"),yu("option",{value:"unpaid"},"未全款")),yu("button",{type:"button",className:"ghost-btn",onClick:()=>J(c,A)},"筛选"))},yu(zX,{projects:G,activeId:t.id,onSelect:(E)=>y(TX(E)),onRaw:l})),yu(A7,{title:t.id?"编辑项目":"新建项目",eyebrow:"PostgreSQL Write Path",loading:n.saving||n.importing},yu("form",{className:"stack-form project-manager-form",onSubmit:Q,"data-testid":"project-manager-form"},t.id?yu("label",null,"项目 ID",yu("input",{value:t.id,disabled:!0})):null,yu("label",null,"序号",yu("input",{type:"number",value:t.sequenceNo,onChange:(E)=>y((m)=>({...m,sequenceNo:E.target.value}))})),yu("label",null,"合同号",yu("input",{value:t.contractNo,onChange:(E)=>y((m)=>({...m,contractNo:E.target.value})),required:!0})),yu("label",null,"项目名称",yu("input",{value:t.name,onChange:(E)=>y((m)=>({...m,name:E.target.value})),required:!0})),yu("label",null,"当前状况",yu("textarea",{value:t.currentStatus,onChange:(E)=>y((m)=>({...m,currentStatus:E.target.value}))})),yu("label",null,"待完成",yu("textarea",{value:t.pending,onChange:(E)=>y((m)=>({...m,pending:E.target.value}))})),yu("label",null,"付款情况",yu("input",{value:t.paymentStatus,onChange:(E)=>y((m)=>({...m,paymentStatus:E.target.value})),placeholder:"例如 1 / 0.5 / 50%"})),yu("label",null,"其它",yu("input",{value:t.notes,onChange:(E)=>y((m)=>({...m,notes:E.target.value}))})),yu("div",{className:"inline-actions"},yu("button",{type:"submit",className:"primary-btn",disabled:n.saving,"data-testid":"project-manager-save-button"},n.saving?"保存中":t.id?"保存修改":"创建项目"),yu("button",{type:"button",className:"ghost-btn",onClick:()=>y({...$7})},"清空"),t.id?yu("button",{type:"button",className:"danger-btn",disabled:n.saving,onClick:W,"data-testid":"project-manager-delete-button"},"删除"):null)),yu("div",{className:"project-manager-import"},yu("p",{className:"muted paragraph"},"浏览器只访问 UniDesk frontend;后端通过同源用户服务代理写入主 PostgreSQL,不暴露 4233 公网端口。"),yu("label",{className:"file-import"},n.importing?"导入中...":"导入 Excel",yu("input",{type:"file",accept:".xlsx",onChange:L,disabled:n.importing,"data-testid":"project-manager-import-input"}))))))}var vA=Cu(Jl(),1);var Au=vA.default.createElement,{useEffect:EX}=vA.default,lr=vA.default.useState;function OX({status:u,children:l}){let f=String(u||"unknown").toLowerCase();return Au("span",{className:`status-badge ${f}`},l||u||"unknown")}function hA({label:u,value:l,hint:f,tone:r}){return Au("article",{className:`metric-card ${r||""}`},Au("div",{className:"metric-label"},u),Au("div",{className:"metric-value"},l),Au("div",{className:"metric-hint"},f))}function F7({title:u,eyebrow:l,actions:f,children:r,className:n,loading:i}){return Au("section",{className:`panel ${n||""}`},Au("div",{className:"panel-head"},Au("div",null,l?Au("p",{className:"panel-eyebrow"},l):null,Au(rl,{title:u,loading:i})),f?Au("div",{className:"panel-actions"},f):null),Au("div",{className:"panel-body"},r))}function WL({title:u,data:l,onOpen:f,testId:r}){return Au("button",{type:"button",className:"ghost-btn","data-testid":r,onClick:()=>f(u,l)},"查看原始JSON")}function bA({title:u,text:l}){return Au("div",{className:"empty-state"},Au("strong",null,u),Au("span",null,l))}function ZX(u){return u?.runtime&&typeof u.runtime==="object"&&!Array.isArray(u.runtime)?u.runtime:{}}function HX(u){return u?.backend&&typeof u.backend==="object"&&!Array.isArray(u.backend)?u.backend:{}}function BX(u){return u?.repository&&typeof u.repository==="object"&&!Array.isArray(u.repository)?u.repository:{}}function TL(u){return String(u).replace(/[^a-zA-Z0-9_-]/g,"_")}function VX(u){if(!Number.isFinite(u))return"--";return`${u.toFixed(1)}%`}function Hy(u,l){return`${u}/microservices/todo-note/proxy${l}`}function KL(u){return u.reduce((l,f)=>{let r=KL(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 J7(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)=>J7(n,l))}function LL(u){return Array.isArray(u?.instances)?u.instances:[]}function U7(u,l){for(let f of u){if(f?.id===l)return Array.isArray(f.children)?f.children:[];let r=U7(Array.isArray(f?.children)?f.children:[],l);if(r.length>0)return r}return[]}function GL({microservices:u,onRaw:l,apiBaseUrl:f="/api"}){let r=u.find((a)=>a.id==="todo-note")||null,[n,i]=lr(null),[t,y]=lr(null),[c,$]=lr(""),[A,j]=lr(null),[F,J]=lr("all"),[Q,W]=lr(13),[L,U]=lr(""),[q,N]=lr(""),[w,G]=lr(""),[Z,H]=lr(""),[E,m]=lr(""),[S,B]=lr(!1),[D,X]=lr(""),[O,Y]=lr(null),p=LL(t),v=KL(Array.isArray(A?.todos)?A.todos:[]),z=r?ZX(r):{},P=r?BX(r):{},k=r?HX(r):{};async function I(a=c){let[qu,Zu]=await Promise.all([Eu(`${f}/microservices/todo-note/health`),Eu(Hy(f,"/api/instances"))]);i(qu),y(Zu);let Bu=LL(Zu),gu=Bu.some((ll)=>ll.id===a)?a:Bu[0]?.id||"";return $(gu),gu}async function b(a=c){if(!a){j(null);return}let qu=await Eu(Hy(f,`/api/instances/${encodeURIComponent(a)}`));j(qu)}async function d(a=c){if(!r)return;B(!0),X("");try{let qu=await I(a);await b(qu),Y(new Date)}catch(qu){X(Ou(qu,"Todo Note 加载失败"))}finally{B(!1)}}async function s(a){if(!c)return null;X("");try{let qu=await Eu(Hy(f,`/api/instances/${encodeURIComponent(c)}/actions`),{method:"POST",body:JSON.stringify({action:a})});return j(qu),await I(c),qu}catch(qu){return X(Ou(qu,"Todo 操作失败")),null}}async function h(a){a.preventDefault();let qu=L.trim();if(!qu)return;B(!0),X("");try{let Zu=await Eu(Hy(f,"/api/instances"),{method:"POST",body:JSON.stringify({name:qu})});U(""),await d(Zu.id)}catch(Zu){X(Ou(Zu,"创建清单失败"))}finally{B(!1)}}async function lu(a){if(!window.confirm("确认删除这个 Todo Note 清单?"))return;B(!0),X("");try{await Eu(Hy(f,`/api/instances/${encodeURIComponent(a)}`),{method:"DELETE"}),await d(c===a?"":c)}catch(qu){X(Ou(qu,"删除清单失败"))}finally{B(!1)}}async function cu(a){a.preventDefault();let qu=q.trim();if(!qu)return;N(""),await s({type:"addTodo",title:qu})}async function _u(a){if(!c)return;X("");try{let qu=await Eu(Hy(f,`/api/instances/${encodeURIComponent(c)}/${a}`),{method:"POST",body:JSON.stringify({})});j(qu),await I(c)}catch(qu){X(Ou(qu,`${a} 失败`))}}function Fu(a){G(a.id),H(String(a.title||""))}async function zu(a){let qu=Z.trim();if(G(""),H(""),qu)await s({type:"updateTodoTitle",todoId:a,title:qu})}async function Wu(a){let Zu=window.prompt("新增子任务标题")?.trim();if(!Zu)return;let Bu=U7(Array.isArray(A?.todos)?A.todos:[],a),gu=new Set(Bu.map((Qf)=>Qf.id)),ll=await s({type:"addTodo",title:Zu,parentId:a,targetIndex:0});if(!ll)return;let Pu=U7(Array.isArray(ll?.todos)?ll.todos:[],a),Nl=Pu.find((Qf)=>!gu.has(Qf.id));if(Nl&&Pu[0]?.id!==Nl.id)await s({type:"moveTodo",todoId:Nl.id,targetParentId:a,targetIndex:0})}async function C(a,qu){if(!E)return;let Zu={type:"moveTodo",todoId:E,targetIndex:qu};if(a)Zu.targetParentId=a;m(""),await s(Zu)}if(EX(()=>{d()},[r?.id,r?.runtime?.providerStatus]),!r)return Au(bA,{title:"Todo Note 未登记",text:"请在 config.json 的 microservices 中登记用户服务 id=todo-note"});let e=p.find((a)=>a.id===c)||null,uu=Array.isArray(A?.todos)?A.todos:[],Gu=uu.map((a,qu)=>({todo:a,index:qu})).filter((a)=>J7(a.todo,F));return Au("div",{className:"todo-note-page","data-testid":"todo-note-page"},Au(F7,{title:"Todo Note 工作台",eyebrow:"Main Server 用户服务",loading:S,actions:Au("div",{className:"panel-actions"},Au("button",{type:"button",className:"ghost-btn",disabled:S,onClick:()=>d(c),"data-testid":"todo-note-refresh-button"},S?"刷新中":"刷新"),Au(WL,{title:"Todo Note 用户服务",data:r,onOpen:l,testId:"raw-todo-note-service"}))},Au("div",{className:"todo-note-hero"},Au("div",null,Au("div",{className:"node-version-line"},Au(OX,{status:z.providerStatus==="online"?"online":"warn"},z.providerStatus||"unknown"),Au("span",null,r.providerId),Au("span",null,k.public?"公网暴露":"仅 UniDesk frontend 代理访问"),Au("span",null,n?.ok?"Health OK":"Health --")),Au("p",{className:"muted paragraph"},r.description)),Au("div",{className:"microservice-ref-card"},Au("span",null,"Repo"),Au("strong",null,P.url||"--"),Au("code",null,P.commitId||"--")),Au("div",{className:"microservice-ref-card"},Au("span",null,"Main Server Docker"),Au("strong",null,`${k.nodeBindHost||"--"}:${k.nodePort||"--"}`),Au("code",null,`${P.composeService||"--"} / ${P.containerName||"--"}`))),Au(nl,{error:D,wide:!0})),Au("div",{className:"todo-note-layout"},Au(F7,{title:"清单",eyebrow:`${p.length} Instances`,className:"todo-list-panel",loading:S},Au("form",{className:"todo-create-list",onSubmit:h},Au("input",{placeholder:"新清单名称",value:L,onChange:(a)=>U(a.target.value),"aria-label":"新清单名称"}),Au("button",{type:"submit",className:"ghost-btn",disabled:S||!L.trim()},"创建")),p.length===0?Au(bA,{title:"暂无清单",text:"迁移或创建清单后会出现在这里"}):Au("div",{className:"todo-instance-list"},p.map((a)=>Au("button",{key:a.id,type:"button",className:`todo-instance-row ${c===a.id?"active":""}`,onClick:()=>{$(a.id),b(a.id)},"data-testid":`todo-instance-${TL(a.id)}`},Au("strong",null,a.name),Au("span",null,`${a.completedCount??0}/${a.todoCount??0} 完成`),Au("code",null,a.id))))),Au("div",{className:"todo-main-stack"},Au(F7,{title:e?.name||"待选择清单",eyebrow:O?`Updated ${yl(O)}`:"Todo Tree",loading:S,actions:A?Au("div",{className:"panel-actions"},Au("button",{type:"button",className:"ghost-btn",onClick:()=>s({type:"renameInstance",name:window.prompt("清单新名称",A.name)||A.name})},"重命名"),Au("button",{type:"button",className:"ghost-btn danger",onClick:()=>lu(c)},"删除清单"),Au(WL,{title:`Todo Instance ${c}`,data:A,onOpen:l,testId:"raw-todo-instance"})):null},!A?Au(bA,{title:"未选择清单",text:"左侧选择一个 Todo Note 清单"}):Au("div",{className:"todo-workbench",style:{"--todo-font-size":`${Q}px`}},Au("div",{className:"todo-toolbar"},Au("form",{className:"todo-add-form",onSubmit:cu},Au("input",{placeholder:"新增根任务",value:q,onChange:(a)=>N(a.target.value),"aria-label":"新增根任务"}),Au("button",{type:"submit",className:"ghost-btn",disabled:!q.trim()},"新增")),Au("div",{className:"todo-filter-strip"},["all","active","completed"].map((a)=>Au("button",{key:a,type:"button",className:`todo-filter ${F===a?"active":""}`,onClick:()=>J(a)},a==="all"?"全部":a==="active"?"未完成":"已完成"))),Au("div",{className:"todo-toolbar-actions"},Au("button",{type:"button",className:"ghost-btn",onClick:()=>s({type:"setAllTodosExpanded",expanded:!0})},"全部展开"),Au("button",{type:"button",className:"ghost-btn",onClick:()=>s({type:"setAllTodosExpanded",expanded:!1})},"全部收起"),Au("button",{type:"button",className:"ghost-btn",onClick:()=>_u("undo")},"撤销"),Au("button",{type:"button",className:"ghost-btn",onClick:()=>_u("redo")},"重做"),Au("label",{className:"todo-font-control"},"字号",Au("input",{type:"range",min:11,max:18,value:Q,onChange:(a)=>W(Number(a.target.value))})))),Au("div",{className:"todo-stats-grid"},Au(hA,{label:"总任务",value:v.total,hint:`${p.length} lists`}),Au(hA,{label:"已完成",value:v.completed,hint:`${VX(v.total?v.completed/v.total*100:0)}`,tone:"ok"}),Au(hA,{label:"未完成",value:v.active,hint:F==="active"?"当前筛选":"active tasks",tone:v.active>0?"warn":"ok"}),Au(hA,{label:"历史指针",value:A.historyPointer??0,hint:"undo / redo"})),Au("div",{className:"todo-root-drop",onDragOver:(a)=>a.preventDefault(),onDrop:(a)=>{a.preventDefault(),C(null,uu.length)}},"拖到这里可移为根任务末尾"),Au("div",{className:"todo-tree","data-testid":"todo-note-tree"},Gu.length===0?Au(bA,{title:"没有匹配任务",text:"调整筛选或新增任务"}):Gu.map(({todo:a,index:qu})=>Au(zL,{key:a.id,todo:a,depth:0,parentId:null,index:qu,siblingCount:uu.length,filter:F,editingId:w,editingTitle:Z,setEditingTitle:H,beginEdit:Fu,saveEdit:zu,applyTodoAction:s,addChild:Wu,dragTodoId:E,setDragTodoId:m,dropTodo:C}))))))))}function zL(u){let{todo:l,depth:f,parentId:r,index:n,siblingCount:i,filter:t,editingId:y,editingTitle:c,setEditingTitle:$,beginEdit:A,saveEdit:j,applyTodoAction:F,addChild:J,dragTodoId:Q,setDragTodoId:W,dropTodo:L}=u,U=Array.isArray(l.children)?l.children:[],q=U.map((G,Z)=>({child:G,childIndex:Z})).filter((G)=>J7(G.child,t)),N=y===l.id,w=r||null;return Au("div",{className:"todo-row-wrap"},Au("article",{className:`todo-row ${l.completed?"completed":""} ${Q===l.id?"dragging":""}`,style:{"--todo-depth":f},draggable:!0,onDragStart:(G)=>{W(l.id),G.dataTransfer.effectAllowed="move"},onDragOver:(G)=>G.preventDefault(),onDrop:(G)=>{G.preventDefault(),L(l.id,U.length)},"data-testid":`todo-row-${TL(l.id)}`},Au("button",{type:"button",className:"todo-expand",disabled:U.length===0,onClick:()=>F({type:"toggleTodoExpanded",todoId:l.id})},U.length===0?"·":l.expanded?"▾":"▸"),Au("input",{type:"checkbox",checked:Boolean(l.completed),onChange:()=>F({type:"toggleTodoCompleted",todoId:l.id}),"aria-label":`完成 ${l.title}`}),Au("div",{className:"todo-title-cell",onDoubleClick:()=>A(l)},N?Au("div",{className:"todo-edit-inline"},Au("input",{value:c,autoFocus:!0,onChange:(G)=>$(G.target.value),onKeyDown:(G)=>{if(G.key==="Enter")j(l.id);if(G.key==="Escape")A({id:"",title:""})}}),Au("button",{type:"button",className:"ghost-btn",onClick:()=>j(l.id)},"保存")):Au("strong",null,l.title||"Untitled"),Au("div",{className:"todo-meta-line"},Au("span",null,`子项 ${U.length}`),Au("span",null,`更新 ${wu(l.updatedAt)}`),l.reminderAt?Au("span",{className:"todo-reminder"},`提醒 ${wu(l.reminderAt)}`):Au("span",null,"无提醒"))),Au("input",{className:"todo-reminder-input",type:"datetime-local",value:w6(l.reminderAt),onChange:(G)=>F({type:"setTodoReminder",todoId:l.id,reminderAt:Aj(G.target.value)})}),Au("div",{className:"todo-row-actions"},Au("button",{type:"button",className:"ghost-btn",onClick:()=>A(l)},"编辑"),Au("button",{type:"button",className:"ghost-btn",onClick:()=>J(l.id)},"子项"),Au("button",{type:"button",className:"ghost-btn",disabled:n<=0,onClick:()=>F({type:"moveTodo",todoId:l.id,...w?{targetParentId:w}:{},targetIndex:n-1})},"上移"),Au("button",{type:"button",className:"ghost-btn",disabled:n<=0,onClick:()=>F({type:"moveTodo",todoId:l.id,...w?{targetParentId:w}:{},targetIndex:0})},"置顶"),Au("button",{type:"button",className:"ghost-btn",disabled:n>=i-1,onClick:()=>F({type:"moveTodo",todoId:l.id,...w?{targetParentId:w}:{},targetIndex:n+1})},"下移"),Au("button",{type:"button",className:"ghost-btn",disabled:!r,onClick:()=>F({type:"moveTodo",todoId:l.id,targetIndex:9999})},"提升"),Au("button",{type:"button",className:"ghost-btn danger",onClick:()=>F({type:"deleteTodo",todoId:l.id})},"删除"))),l.expanded&&q.length>0?Au("div",{className:"todo-children"},q.map(({child:G,childIndex:Z})=>Au(zL,{key:G.id,todo:G,depth:f+1,parentId:l.id,index:Z,siblingCount:U.length,filter:t,editingId:y,editingTitle:c,setEditingTitle:$,beginEdit:A,saveEdit:j,applyTodoAction:F,addChild:J,dragTodoId:Q,setDragTodoId:W,dropTodo:L}))):null)}var EL=Cu(Jl(),1),d0=EL.default.createElement;function OL({title:u,items:l,actions:f,className:r,testId:n}){let i=Array.isArray(l)?l:[];return d0("section",{className:`top-status-bar ${r||""}`,"data-testid":n},d0("div",{className:"top-status-main"},u?d0("strong",{className:"top-status-title"},u):null,d0("div",{className:"top-status-chips"},i.map((t,y)=>d0("span",{key:t?.key||`${t?.label||"status"}-${y}`,className:`top-status-chip ${t?.tone||""}`,"data-testid":t?.testId},t?.label?d0("b",null,t.label):null,d0("span",null,t?.value??"--"))))),f?d0("div",{className:"top-status-actions"},f):null)}var dc=Cu(Jl(),1);var Nu=dc.default.createElement,{useEffect:mX,useMemo:DX}=dc.default,pX=dc.default.useState;function ZL({status:u,children:l,title:f}){let r=String(u||"unknown").toLowerCase();return Nu("span",{className:`status-badge ${r}`,title:f},l||u||"unknown")}function kA({label:u,value:l,hint:f,tone:r}){return Nu("article",{className:`metric-card ${r||""}`},Nu("div",{className:"metric-label"},u),Nu("div",{className:"metric-value"},l),Nu("div",{className:"metric-hint"},f))}function Q7({title:u,eyebrow:l,actions:f,children:r,className:n,loading:i}){return Nu("section",{className:`panel ${n||""}`},Nu("div",{className:"panel-head"},Nu("div",null,l?Nu("p",{className:"panel-eyebrow"},l):null,Nu(rl,{title:u,loading:i})),f?Nu("div",{className:"panel-actions"},f):null),Nu("div",{className:"panel-body"},r))}function HL({title:u,data:l,onOpen:f,testId:r}){return Nu("button",{type:"button",className:"ghost-btn","data-testid":r,onClick:()=>f?.(u,l)},"查看原始JSON")}function N7({title:u,text:l}){return Nu("div",{className:"empty-state"},Nu("strong",null,u),Nu("span",null,l))}function By(u){return Array.isArray(u)?u:[]}function q7(u){return u&&typeof u==="object"&&!Array.isArray(u)?u:{}}function SX(u){return u?.runtime&&typeof u.runtime==="object"&&!Array.isArray(u.runtime)?u.runtime:{}}function XX(u,l){return`${u}/microservices/k3sctl-adapter/proxy${l}`}function YX(u){return u.find((l)=>String(l?.id||"")==="k3sctl-adapter")||null}function PX(u){if(u?.healthy===!0)return"online";if(String(u?.role||"")==="standby")return"warn";return"failed"}function CX(u){return u?.healthy===!0?"online":"failed"}function MX(u){if(u===!0)return"YES";if(u===!1)return"NO";return"--"}function RX(u){return Array.from(new Set(u.flatMap((l)=>By(l?.expectedNodeIds).map((f)=>String(f))))).filter(Boolean).sort()}function xX(u){let l=u.find((f)=>f?.id==="code-queue")||u[0];return String(l?.activeInstanceId||"--")}function hX(u){return Nu("article",{key:u?.id||u?.nodeId,className:"k3s-instance-card"},Nu("div",{className:"node-card-head"},Nu("strong",null,u?.nodeId||u?.id||"--"),Nu(ZL,{status:PX(u)},u?.healthy?"HEALTHY":"DEGRADED")),Nu("div",{className:"k3s-instance-role"},Nu("span",null,String(u?.role||"worker").toUpperCase()),Nu("code",null,u?.id||"--")),Nu("dl",{className:"k3s-kv"},Nu("dt",null,"Base URL"),Nu("dd",null,Nu("code",null,u?.baseUrl||"--")),Nu("dt",null,"Proxy"),Nu("dd",null,u?.proxyMode||"--"),Nu("dt",null,"Health"),Nu("dd",null,`${u?.upstreamStatus??"--"} / ${u?.status||"unknown"}`),Nu("dt",null,"Checked"),Nu("dd",null,wu(u?.checkedAt))))}function bX(u,l){let f=By(u?.instances),r=q7(u?.active);return Nu(Q7,{key:u?.id||"service",title:u?.id||"managed-service",eyebrow:`${u?.namespace||"unidesk"} / k3s managed service`,className:"k3s-service-panel",actions:Nu(HL,{title:`k3s service ${u?.id||""}`,data:u,onOpen:l,testId:`raw-k3s-service-${u?.id||"unknown"}`})},Nu("div",{className:"k3s-service-summary"},Nu("div",null,Nu("span",null,"状态"),Nu(ZL,{status:CX(u)},u?.status||"unknown")),Nu("div",null,Nu("span",null,"Active"),Nu("strong",null,u?.activeInstanceId||"--")),Nu("div",null,Nu("span",null,"Single Writer"),Nu("strong",null,MX(u?.singleWriter))),Nu("div",null,Nu("span",null,"Active Health"),Nu("strong",null,r?.upstreamStatus??"--"))),f.length===0?Nu(N7,{title:"暂无 k3s 实例",text:"adapter 没有返回该服务的 endpoint 列表"}):Nu("div",{className:"k3s-instance-grid"},f.map(hX)))}function BL({microservices:u,onRaw:l,apiBaseUrl:f,onNavigate:r}){let n=YX(Array.isArray(u)?u:[]),i=SX(n),[t,y]=pX({loading:!1,error:"",data:null,refreshedAt:null});async function c(){y((q)=>({...q,loading:!0,error:""}));try{let q=await Eu(XX(f,"/api/control-plane"));y({loading:!1,error:"",data:q,refreshedAt:new Date})}catch(q){y((N)=>({...N,loading:!1,error:Ou(q,"加载 k3s 控制平面失败")}))}}mX(()=>{c()},[f]);let $=DX(()=>By(t.data?.services),[t.data]),A=RX($),j=$.filter((q)=>q?.healthy===!0).length,F=$.reduce((q,N)=>q+By(N?.instances).length,0),J=$.reduce((q,N)=>q+By(N?.instances).filter((w)=>w?.healthy===!0).length,0),Q=xX($),W=q7(t.data?.kubectl),L=q7(t.data?.kubeApiProxy),U=By(t.data?.manifestPaths).map((q)=>String(q));if(!n)return Nu(N7,{title:"k3sctl-adapter 未登记",text:"请在 config.json 的 microservices 中登记 id=k3sctl-adapter,并通过该微服务连接 k3s 控制平面。"});return Nu("div",{className:"k3s-page","data-testid":"k3sctl-page"},Nu(Q7,{title:"k3s Control Plane",eyebrow:"Managed by k3sctl-adapter",className:"k3s-hero-panel",loading:t.loading,actions:Nu(dc.default.Fragment,null,Nu("button",{type:"button",className:"ghost-btn",onClick:c,disabled:t.loading,"data-testid":"k3s-refresh-button"},t.loading?"刷新中":"刷新"),r?Nu("button",{type:"button",className:"ghost-btn",onClick:()=>r("apps","code-queue"),"data-testid":"k3s-open-code-queue"},"打开 Code Queue"):null,Nu(HL,{title:"k3sctl-adapter microservice",data:n,onOpen:l,testId:"raw-k3s-adapter"}))},Nu("div",{className:"k3s-hero"},Nu("div",{className:"k3s-orb","aria-hidden":"true"},Nu("span",null,"k3s")),Nu("div",{className:"k3s-hero-copy"},Nu("p",{className:"eyebrow"},"D601 control plane / D518 managed node"),Nu("h2",null,"UniDesk 只管理 adapter;业务微服务交给 k3s 标准服务路由"),Nu("p",{className:"muted paragraph"},"Code Queue 的前端/API 请求进入 k3sctl-adapter,再由 adapter 转发到 k3s active service。provider-gateway 只用于维护 adapter 和节点诊断,不再直接管理 Code Queue 容器。"),Nu("div",{className:"k3s-route-strip"},Nu("span",null,"NO FALLBACK"),Nu("code",null,t.data?.runtimePath||"frontend -> backend-core -> k3sctl-adapter")))),Nu("div",{className:"metric-grid"},Nu(kA,{label:"控制面",value:t.data?.clusterId||"D601",hint:`adapter ${i.providerStatus||"unknown"}`,tone:i.providerStatus==="online"?"ok":"warn"}),Nu(kA,{label:"代管服务",value:$.length,hint:`${j}/${$.length||0} healthy`,tone:j===$.length&&$.length>0?"ok":"warn"}),Nu(kA,{label:"节点",value:A.join(" / ")||"--",hint:"expected k3s nodes"}),Nu(kA,{label:"实例",value:`${J}/${F}`,hint:`active ${Q}`,tone:J===F&&F>0?"ok":"warn"})),Nu("div",{className:"k3s-control-plane-grid"},Nu("article",{className:"k3s-control-plane-card"},Nu("span",null,"service proxy"),Nu("strong",null,L.configured===!0?"K8S API PROXY":"PROXY DEGRADED"),Nu("p",null,L.configured===!0?`${L.mode||"kubernetes-api-service-proxy"} via ${L.connectHost||"--"}`:"adapter 必须通过 k8s API service proxy 访问业务服务,不回退到业务容器直连。")),Nu("article",{className:"k3s-control-plane-card"},Nu("span",null,"manifests"),Nu("strong",null,U.length||"--"),Nu("p",null,U.join(" / ")||"未配置 manifest")),Nu("article",{className:"k3s-control-plane-card"},Nu("span",null,"cluster snapshot"),Nu("strong",null,W.enabled===!0?W.ok===!0?"KUBECTL OK":"KUBECTL DEGRADED":"API ONLY"),Nu("p",null,W.enabled===!0?`nodes ${W.nodeCount??"--"}`:"控制面页面以 adapter 返回的 k8s service proxy 状态为准;kubectl 只作为可选快照。"))),t.error?Nu(nl,{error:t.error}):null,t.refreshedAt?Nu("p",{className:"muted paragraph"},`最近刷新 ${yl(t.refreshedAt)}`):null),$.length===0?Nu(Q7,{title:"代管服务",eyebrow:"k3s services",loading:t.loading},Nu(N7,{title:"暂无 k3s 服务",text:"等待 k3sctl-adapter 返回 /api/services;Code Queue 切换后这里应显示 D601 和 D518 两个实例。"})):$.map((q)=>bX(q,l)))}var ec=Cu(Jl(),1);var al=ec.default.createElement;function VL({onClose:u}){let{notifications:l,removeNotification:f,clearNotifications:r}=Xf(),n=ec.default.useRef(null);if(ec.default.useEffect(()=>{let i=(t)=>{if(n.current&&!n.current.contains(t.target))u()};return document.addEventListener("mousedown",i),()=>document.removeEventListener("mousedown",i)},[u]),l.length===0)return al("div",{className:"notification-popup",ref:n},al("div",{className:"notification-popup-header"},al("span",null,"通知"),al("button",{className:"notification-popup-close",onClick:u},"×")),al("div",{className:"notification-popup-empty"},"暂无通知"));return al("div",{className:"notification-popup",ref:n},al("div",{className:"notification-popup-header"},al("span",null,`通知 (${l.length})`),al("div",{className:"notification-popup-actions"},al("button",{className:"notification-popup-clear",onClick:r},"清空"),al("button",{className:"notification-popup-close",onClick:u},"×"))),al("div",{className:"notification-popup-list"},l.slice().reverse().map((i)=>al("div",{key:i.id,className:`notification-item ${i.type}`},al("span",{className:"notification-item-icon"},i.type==="success"?"✓":"×"),al("span",{className:"notification-item-message"},i.message),al("button",{className:"notification-item-dismiss",onClick:()=>f(i.id)},"×")))))}function mL({notification:u}){let{removeNotification:l}=Xf();return ec.default.useEffect(()=>{let f=setTimeout(()=>{l(u.id)},3000);return()=>clearTimeout(f)},[u.id,l]),al("div",{className:`notification-banner ${u.type}`,role:"alert"},al("span",{className:"notification-banner-icon"},u.type==="success"?"✓":"×"),al("span",{className:"notification-banner-message"},u.message),al("button",{className:"notification-banner-dismiss",onClick:()=>l(u.id)},"×"))}function bL(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 Iu=bL("data-config",{apiBaseUrl:"/api",authUsername:"admin"}),vX=bL("data-codex-overview",null),_=ui.default.createElement,{useEffect:Tn,useMemo:f_}=ui.default,bu=ui.default.useState,T7=ui.default.createContext(!1),pr=zN(q3),kX={id:"code-queue",name:"Code Queue",providerId:"D601",description:"Code Queue",repository:{containerName:"k3s:code-queue"},backend:{nodeBaseUrl:"k3s://code-queue",nodeBindHost:"k3s://unidesk/code-queue",nodePort:4222,proxyMode:"k3sctl-adapter-http",public:!1},deployment:{mode:"k3sctl-managed",adapterServiceId:"k3sctl-adapter",k3sServiceId:"code-queue"},runtime:{orchestrator:"k3sctl",providerStatus:"loading",providerName:"D601"}};function DL(){return typeof document>"u"||document.visibilityState!=="hidden"}function IX(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 gX(u){if(!u?._summaryOnly||!u?.id)return u;return(await Eu(`${Iu.apiBaseUrl}/tasks/${encodeURIComponent(String(u.id))}`))?.task||u}function r_(u){return u?._summaryOnly?{...u,_loadRaw:()=>gX(u)}:u}function dn(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 qr(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 dn(l/1000)}function Of(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 ut(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 aX(u,l){let f=u.replace(/[-_\s]/g,"").toLowerCase(),r=f==="ts"||f.endsWith("at")||f.endsWith("timestamp")||f.endsWith("heartbeat");if((typeof l==="string"||typeof l==="number")&&r){let n=wu(l);if(n!=="--")return n}if(u==="bodyText"&&typeof l==="string")return`${/^\s*[{[]/.test(l)?"JSON":"HTTP"} body ${l.length} chars`;return ut(l)}function IL(u){if(!u||typeof u!=="object"||Array.isArray(u))return[];return Object.entries(u)}function fr(u){return String(u).replace(/[^a-zA-Z0-9_-]/g,"_")}function G7(u,l){return u&&typeof u==="object"&&!Array.isArray(u)?u[l]:void 0}function gA(u,l,f="未知"){let r=G7(u?.labels,l);return typeof r==="string"&&r.length>0?r:f}function gL(u){return gA(u,"providerGatewayVersion")}function l_(u){return gA(u,"providerGatewayUpgradePolicy")}function pL(u){return gA(u,"providerGatewayStartedAt","")}function sL(u){let l=G7(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 aL(u,l){return sL(u).includes(l)}function SL(u,l){let f=G7(u?.labels,l);return f===!0||f==="true"||f==="1"}function oX(u){if(!aL(u,"host.ssh"))return{tone:"fail",label:"不可用",detail:"未声明 host.ssh"};if(!SL(u,"hostSshConfigured"))return{tone:"warn",label:"未配置",detail:"缺少 SSH 环境变量"};if(!SL(u,"hostSshKeyPresent"))return{tone:"warn",label:"缺 key",detail:"私钥未挂载"};return{tone:"ok",label:"可用",detail:gA(u,"hostSshTarget","host.ssh ready")}}function dX(u){if(!aL(u,"provider.upgrade"))return{tone:"fail",label:"不可用",detail:"未声明 provider.upgrade"};let l=l_(u);if(l!=="always-enabled")return{tone:"warn",label:"待确认",detail:`策略 ${l}`};return{tone:"ok",label:"可用",detail:"always-enabled"}}function z7(u){let l=typeof u==="string"&&u.length>0?u:"未知";if(l==="未知")return"版本未知";return l.startsWith("v")?l:`v${l}`}function oL(u){return u?.payload&&typeof u.payload==="object"&&!Array.isArray(u.payload)?u.payload:{}}function sA(u){return u?.result&&typeof u.result==="object"&&!Array.isArray(u.result)?u.result:{}}function IA(u){let l=oL(u),f=sA(u);return(l.mode??f.mode)==="schedule"?"schedule":"plan"}function eX(u){let l=oL(u).source;return typeof l==="string"&&l.length>0?l:"unknown"}function uY(u){let l=sA(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 dL(u){let l=sA(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?z7(r):"版本未知"}function eL(u){if(String(u?.status||"").toLowerCase()==="failed")return kL(u);if(my(u))return"等待 provider 回传升级终态";let f=sA(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 uT(u,l){return u.filter((f)=>f?.providerId===l&&f?.command==="provider.upgrade").sort((f,r)=>(Kn(r.updatedAt)??0)-(Kn(f.updatedAt)??0))}function lY(u){return u.find((l)=>IA(l)==="schedule")||u[0]||null}function lT(u){return u?.runtime&&typeof u.runtime==="object"&&!Array.isArray(u.runtime)?u.runtime:{}}function XL(u){return u?.backend&&typeof u.backend==="object"&&!Array.isArray(u.backend)?u.backend:{}}function fY(u){return u?.repository&&typeof u.repository==="object"&&!Array.isArray(u.repository)?u.repository:{}}function Tl({status:u,children:l}){let f=String(u||"unknown").toLowerCase();return _("span",{className:`status-badge ${f}`},l||u||"unknown")}function Fl({label:u,value:l,hint:f,tone:r,onClick:n,testId:i}){let t=typeof n==="function";return _("article",{className:`metric-card ${r||""} ${t?"clickable":""}`,role:t?"button":void 0,tabIndex:t?0:void 0,"data-testid":i,onClick:n,onKeyDown:t?(y)=>{if(y.key==="Enter"||y.key===" ")y.preventDefault(),n()}:void 0},_("div",{className:"metric-label"},u),_("div",{className:"metric-value"},l),_("div",{className:"metric-hint"},f))}function eu({title:u,eyebrow:l,actions:f,children:r,className:n,loading:i}){let t=ui.default.useContext(T7),y=Boolean(i)||t;return _("section",{className:`panel ${n||""}`},_("div",{className:"panel-head"},_("div",null,l?_("p",{className:"panel-eyebrow"},l):null,_(rl,{title:u,loading:y})),f?_("div",{className:"panel-actions"},f):null),_("div",{className:"panel-body"},r))}function ol({title:u,data:l,onOpen:f,testId:r}){let[n,i]=bu(!1),t=l&&typeof l==="object"&&typeof l._loadRaw==="function"?l._loadRaw:null;async function y(){if(!t){f(u,l);return}i(!0);try{f(u,await t())}catch(c){f(u,{ok:!1,error:Ou(c,"读取原始 JSON 失败"),fallback:l})}finally{i(!1)}}return _("button",{type:"button",className:"ghost-btn","data-testid":r,disabled:n,onClick:()=>void y()},n?"读取中":"查看原始JSON")}function rY({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 fT({labels:u,limit:l=8}){let f=IL(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,ut(n)))))}function Vy({node:u}){let l=gL(u);return _("span",{className:`version-chip ${l==="未知"?"unknown":""}`,"data-testid":`gateway-version-${fr(u?.providerId||"unknown")}`},z7(l))}function YL({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 E7({node:u}){let l=fr(u?.providerId||"unknown");return _("div",{className:"node-availability-strip"},_(YL,{title:"SSH 透传",state:oX(u),testId:`ssh-availability-${l}`}),_(YL,{title:"远程更新",state:dX(u),testId:`upgrade-availability-${l}`}))}function li({data:u,empty:l="无数据"}){if(u===null||u===void 0)return _("span",{className:"muted"},l);if(typeof u!=="object")return _("span",{className:"summary-value"},ut(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,aX(r,n)))))}function Ql({title:u,text:l}){return _("div",{className:"empty-state"},_("strong",null,u),_("span",null,l))}function nY({onLogin:u}){let[l,f]=bu(Iu.authUsername||"admin"),[r,n]=bu(""),[i,t]=bu(""),[y,c]=bu(!1);async function $(A){A.preventDefault(),c(!0),t("");try{let j=await Eu("/login",{method:"POST",body:JSON.stringify({username:l,password:r})});u(j)}catch(j){t(Ou(j,"登录失败"))}finally{c(!1)}}return _("main",{className:"login-screen","data-testid":"login-screen"},_("section",{className:"login-card"},_("div",{className:"login-brand"},_("span",{className:"brand-mark"},"UD"),_("div",null,_("h1",null,"UniDesk"),_("p",null,"Control Plane Login"))),_("form",{className:"login-form",onSubmit:$},_("label",null,"账号",_("input",{name:"username",autoComplete:"username",value:l,onChange:(A)=>f(A.target.value)})),_("label",null,"密码",_("input",{name:"password",type:"password",autoComplete:"current-password",value:r,onChange:(A)=>n(A.target.value)})),_(nl,{error:i}),_("button",{type:"submit",disabled:y},y?"登录中":"登录")),_("div",{className:"login-note"},"默认账号由 config.json 注入;公网入口只暴露前端登录面。")))}function iY({connection:u,lastRefresh:l,onRefresh:f,onLogout:r,session:n,clock:i,activeStatusItems:t=[],onNotificationToggle:y,unreadCount:c=0}){let $=[{key:"core",label:"核心",value:u.text,tone:u.ok?"ok":"fail",testId:"conn-text"},...Array.isArray(t)?t:[],{key:"refresh",label:"刷新",value:l?yl(l):"未刷新"},{key:"clock",label:W_,value:yl(i)},{key:"user",label:"用户",value:n?.user?.username||"--",tone:"user"}];return _("header",{className:"topbar"},_("div",null,_("p",{className:"eyebrow"},"Distributed Work Platform"),_("h1",null,"UniDesk 控制平面")),_(OL,{className:"global-top-status",title:"状态",items:$,actions:[_("button",{key:"notification",type:"button",className:`notification-icon-btn ${c>0?"has-unread":""}`,onClick:y,"aria-label":"通知"},"\uD83D\uDD14",c>0?_("span",{key:"badge",className:"notification-badge"},c>99?"99+":c):null),_("button",{key:"refresh",type:"button",className:"ghost-btn",onClick:f},"刷新"),_("button",{key:"logout",type:"button",className:"ghost-btn danger",onClick:r},"退出")]}))}function tY(u){return!u.defaultPrevented&&u.button===0&&!u.metaKey&&!u.altKey&&!u.ctrlKey&&!u.shiftKey&&u.currentTarget.target!=="_blank"}function rT({moduleId:u,tabId:l,className:f,active:r=!1,title:n,testId:i,onNavigate:t,children:y}){let c=w3(pr,u,l);return _("a",{href:c,role:"button",className:f,title:n,"aria-current":r?"page":void 0,"data-testid":i,"data-route":c,onClick:($)=>{if(!tY($))return;$.preventDefault(),t(u,l)}},y)}function yY({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?"»":"«")),q3.map((i)=>{let t=l[i.id]||yc[i.id]||i.tabs[0]?.id||"";return _(rT,{key:i.id,moduleId:i.id,tabId:t,className:`module ${u===i.id?"active":""}`,active:u===i.id,title:i.label,onNavigate:f},_("span",{className:"module-code"},i.code),_("span",null,i.label))}))}function cY({module:u,activeTab:l,onNavigate:f}){return _("nav",{className:"tabs","aria-label":`${u.label} 子功能`},u.tabs.map((r)=>_(rT,{key:r.id,moduleId:u.id,tabId:r.id,className:`tab ${l===r.id?"active":""}`,active:l===r.id,onNavigate:f},r.label)))}function _Y({data:u,onRaw:l,onNavigate:f}){let r=u.overview||{},n=u.nodes.filter((J)=>J.status==="online"),i=u.pendingTasks||u.tasks.filter(my),t=r.pendingTaskCount??i.length,y=u.tasks.slice(0,5),c=r.pgdata||{},$=r.microserviceAvailability||{},A=Ru($.totalCount),j=Ru($.healthyCount),F=Ru($.unhealthyCount);return _("div",{className:"page-grid overview-grid","data-testid":"overview-page"},_(eu,{title:"核心指标",eyebrow:"Control"},_("div",{className:"metric-grid"},_(Fl,{label:"数据库",value:r.dbReady?"READY":"WAIT",hint:"PostgreSQL internal network",tone:r.dbReady?"ok":"warn"}),_(Fl,{label:"PGDATA",value:Of(c.databaseBytes),hint:`${c.volumeName||"unidesk_pgdata_10gb"} / ${c.databasePretty||"--"}`,tone:"ok",testId:"pgdata-usage-card"}),_(Fl,{label:"在线节点",value:r.onlineNodeCount??0,hint:`${r.nodeCount??0} registered`,tone:"ok"}),_(Fl,{label:"WebSocket",value:r.activeSocketCount??0,hint:"Provider ingress sockets"}),_(Fl,{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"}),_(Fl,{label:"待处理任务",value:t,hint:t>0?"点击查看具体任务":`timeout ${dn(Math.floor((r.taskPendingTimeoutMs??0)/1000))}`,tone:t>0?"warn":"ok",onClick:()=>f("tasks","pending"),testId:"pending-task-card"}))),_(eu,{title:"本机 Provider",eyebrow:"Self Connected"},n.length===0?_(Ql,{title:"暂无在线节点",text:"provider-gateway 未完成自接入"}):_("div",{className:"node-card-list"},n.slice(0,4).map((J)=>_($Y,{key:J.providerId,node:J,onRaw:l})))),_(eu,{title:"待处理任务明细",eyebrow:`${t} Pending`,actions:_("button",{type:"button",className:"ghost-btn",onClick:()=>f("tasks","pending"),"data-testid":"pending-task-detail-link"},"进入任务调度")},i.length===0?_(Ql,{title:"当前无待处理",text:"queued / dispatched / running 超时后会自动转为 failed,避免总览长期卡住"}):_("div",{className:"compact-list"},i.slice(0,5).map((J)=>_(RL,{key:J.id,task:J,onRaw:l})))),_(eu,{title:"最近任务",eyebrow:"Dispatch"},y.length===0?_(Ql,{title:"暂无任务",text:"可以在任务调度模块发起 docker.ps 或 echo"}):_("div",{className:"compact-list"},y.map((J)=>_(RL,{key:J.id,task:J,onRaw:l})))))}function $Y({node:u,onRaw:l}){return _("article",{className:"node-card"},_("div",{className:"node-card-head"},_("div",null,_("strong",null,u.name),_("code",null,u.providerId)),_(Tl,{status:u.status})),_("div",{className:"node-version-line"},_(Vy,{node:u}),_("span",null,`升级策略 ${l_(u)}`)),_(E7,{node:u}),_(fT,{labels:u.labels,limit:6}),_("div",{className:"node-card-foot"},_("span",null,`心跳 ${wu(u.lastHeartbeat)}`),_(ol,{title:`Provider ${u.providerId}`,data:u,onOpen:l,testId:`raw-node-${fr(u.providerId)}`})))}function AY({events:u,onRaw:l}){return _(eu,{title:"事件摘要",eyebrow:"Latest 100"},u.length===0?_(Ql,{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,_(Tl,{status:f.type},f.type)),_("td",null,_("code",null,f.source)),_("td",null,_(li,{data:f.payload})),_("td",null,wu(f.createdAt)),_("td",null,_(ol,{title:`Event ${f.id}`,data:f,onOpen:l}))))))))}function jY({logs:u,onRaw:l}){return _(eu,{title:"服务日志",eyebrow:"Core Recent"},u.length===0?_(Ql,{title:"暂无日志",text:"backend-core 内存日志会在请求和 provider 事件后出现"}):_("div",{className:"log-list"},u.slice(-80).reverse().map((f,r)=>_("article",{key:r,className:`log-row ${f.level||"info"}`},_("span",null,wu(f.ts)),_("b",null,f.level||"info"),_("strong",null,f.message||"log"),_(li,{data:f.data,empty:"无附加字段"}),_(ol,{title:`Log ${f.message||r}`,data:f,onOpen:l})))))}function FY({nodes:u,onRaw:l}){return _(eu,{title:"节点清单",eyebrow:`${u.length} Providers`},u.length===0?_(Ql,{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,_(Tl,{status:f.status})),_("td",null,_("strong",null,f.name),_("code",null,f.providerId)),_("td",null,_("div",{className:"gateway-cell"},_(Vy,{node:f}),_("span",null,l_(f)))),_("td",null,_(E7,{node:f})),_("td",null,_(fT,{labels:f.labels,limit:5})),_("td",null,wu(f.connectedAt)),_("td",null,wu(f.lastHeartbeat)),_("td",null,_(ol,{title:`Provider ${f.providerId}`,data:f,onOpen:l,testId:`raw-node-table-${fr(f.providerId)}`}))))))))}function UY({nodes:u}){let l=f_(()=>{let f=[];for(let r of u)for(let[n,i]of IL(r.labels))f.push({providerId:r.providerId,name:r.name,key:n,value:i});return f},[u]);return _(eu,{title:"资源标签",eyebrow:"Structured Labels"},l.length===0?_(Ql,{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,ut(f.value)),_("code",null,f.providerId)))))}function JY({nodes:u}){return _(eu,{title:"心跳状态",eyebrow:"Provider Liveness"},u.length===0?_(Ql,{title:"无心跳",text:"等待 provider 注册和 heartbeat"}):_("div",{className:"heartbeat-list"},u.map((l)=>_("article",{key:l.providerId,className:"heartbeat-row"},_("span",{className:`pulse ${l.status}`}),_("div",null,_("strong",null,l.name),_("code",null,l.providerId)),_("div",null,_("span",null,"connected"),_("b",null,wu(l.connectedAt))),_("div",null,_("span",null,"last heartbeat"),_("b",null,wu(l.lastHeartbeat)))))))}function QY({nodes:u,systemStatuses:l,tasks:f,onRaw:r,refresh:n}){let[i,t]=bu(""),y=f_(()=>u.map((W)=>{let L=l.find((U)=>U.providerId===W.providerId);return{...W,systemCurrent:L?.current||null,systemHistory:L?.history||[],systemUpdatedAt:L?.updatedAt||null}}),[u,l]),c=y.find((W)=>W.providerId===i)||y[0]||null;if(Tn(()=>{if(!i&&y[0])t(y[0].providerId)},[y.length,i]),!c)return _(Ql,{title:"暂无资源监控",text:"等待 provider 上报 CPU、内存和硬盘指标"});let $=c.systemCurrent,A=c.systemHistory||[],j=$?.cpu||{},F=$?.memory||{},J=$?.disk||{},Q=A.length>0?A:$?[{at:$.collectedAt,cpuPercent:Ru(j.percent),memoryPercent:Ru(F.percent),diskPercent:Ru(J.percent)}]:[];return _("div",{className:"monitor-page","data-testid":"node-monitor-page"},_("div",{className:"docker-node-strip"},y.map((W)=>_("button",{key:W.providerId,type:"button",className:`docker-node-tile ${c.providerId===W.providerId?"active":""}`,onClick:()=>t(W.providerId)},_("span",{className:`pulse ${W.status}`}),_("strong",null,W.name),_("code",null,W.providerId),_("span",null,W.systemCurrent?`CPU ${e0(W.systemCurrent.cpu?.percent)} / MEM ${e0(W.systemCurrent.memory?.percent)}`:"等待指标")))),_("div",{className:"monitor-layout"},_(eu,{title:"任务管理器视图",eyebrow:c.name,className:"monitor-main-panel",actions:$?_(ol,{title:`System ${c.providerId}`,data:{current:$,history:A},onOpen:r}):null},!$?_(Ql,{title:"系统指标未上报",text:"provider-gateway 会周期性采集 /proc 与 df,并保存历史曲线"}):_("div",null,_("div",{className:"monitor-hero"},_("div",null,_("p",{className:"panel-eyebrow"},"Node Performance"),_("h3",null,c.name),_("div",{className:"docker-meta"},_("span",null,`${j.cores||0} CPU cores`),_("span",null,`load ${Ru(j.load1).toFixed(2)} / ${Ru(j.load5).toFixed(2)} / ${Ru(j.load15).toFixed(2)}`),_("span",null,`memory actual ${Of(F.usedBytes)} / ${Of(F.totalBytes)}`),_("span",null,`disk ${Of(J.usedBytes)} / ${Of(J.totalBytes)}`))),_(Tl,{status:$.ok?"online":"warn"},$.ok?"METRICS READY":"METRICS DEGRADED")),_("div",{className:"monitor-chart-grid"},_(W7,{title:"CPU",metricKey:"cpuPercent",current:j.percent,points:Q,detail:`${j.cores||0} cores / load ${Ru(j.load1).toFixed(2)}`,tone:"cpu",testId:"metric-chart-cpu"}),_(W7,{title:"Memory",metricKey:"memoryPercent",current:F.percent,points:Q,detail:`${Of(F.usedBytes)} actual / ${Of(F.cacheBytes)} cache excluded`,tone:"memory",testId:"metric-chart-memory"}),_(W7,{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"},_(Fl,{label:"CPU 当前",value:e0(j.percent),hint:`history ${Q.length} samples`,tone:"ok"}),_(Fl,{label:"实际内存",value:Of(F.usedBytes),hint:`${e0(F.percent)} 不含缓存`}),_(Fl,{label:"硬盘已用",value:Of(J.usedBytes),hint:e0(J.percent)}),_(Fl,{label:"更新时间",value:wu(c.systemUpdatedAt||$.collectedAt),hint:c.providerId})),_(NY,{current:$,onRaw:r}))),_("div",{className:"monitor-side-stack"},_(zY,{provider:c,refresh:n,onRaw:r}),_(EY,{provider:c,tasks:f,onRaw:r,limit:5}),_(eu,{title:"采样说明",eyebrow:"Retention"},_("div",{className:"monitor-note-list"},_("article",null,_("b",null,"CPU"),_("span",null,"从 /proc/stat 计算相邻采样差值,首个采样用 load/cores 近似")),_("article",null,_("b",null,"Memory"),_("span",null,"实际内存 = MemTotal - MemFree - Buffers - Cached - SReclaimable + Shmem,不把 page cache / buffer 计入占用")),_("article",null,_("b",null,"Disk"),_("span",null,"使用 df -PB1 对配置路径采样,默认监控根文件系统")),_("article",null,_("b",null,"Process"),_("span",null,"从 /proc/[pid] 采集进程 CPU、实际内存 RSS、线程数和磁盘 I/O 速率;表格默认按内存占用降序")))))))}function PL(u,l){if(l==="memory")return Ru(u.rssBytes);if(l==="cpu")return Ru(u.cpuPercent);if(l==="disk")return Ru(u.readBytesPerSecond)+Ru(u.writeBytesPerSecond);if(l==="pid")return Ru(u.pid);if(l==="threads")return Ru(u.threads);if(l==="runtime")return Ru(u.elapsedSeconds);if(l==="user")return String(u.user||"");return String(u.name||u.command||"")}function CL({value:u,label:l,tone:f}){let r=Math.max(1,Math.min(100,Ru(u)));return _("div",{className:`process-meter ${f||""}`},_("span",{style:{width:`${r}%`}}),_("b",null,l))}function NY({current:u,onRaw:l}){let[f,r]=bu({key:"memory",direction:"desc"}),n=ui.default.useContext(T7),i=u?.processSummary&&typeof u.processSummary==="object"?u.processSummary:{},t=Array.isArray(u?.processes)?u.processes:[],y=f_(()=>{let $=f.direction==="asc"?1:-1;return[...t].sort((A,j)=>{let F=PL(A,f.key),J=PL(j,f.key);if(typeof F==="string"||typeof J==="string")return String(F).localeCompare(String(J),"zh-CN")*$;return(F-J)*$||Ru(A.pid)-Ru(j.pid)})},[t,f.key,f.direction]),c=($,A)=>{let j=f.key===A,F=j?f.direction==="asc"?"ascending":"descending":"none";return _("th",{"aria-sort":F},_("button",{type:"button",className:`process-sort-button ${j?"active":""}`,"data-testid":`process-sort-${A}`,onClick:()=>r((J)=>({key:A,direction:J.key===A&&J.direction==="desc"?"asc":"desc"}))},$,_("span",null,j?f.direction==="desc"?"↓":"↑":"↕")))};return _("section",{className:"process-resource-panel","data-testid":"process-resource-panel"},_("div",{className:"process-resource-head"},_("div",null,_("p",{className:"panel-eyebrow"},"Windows Resource Monitor Style"),_(rl,{title:"进程资源占用",level:3,loading:n})),_("div",{className:"process-resource-actions"},_("span",{className:"data-chip"},"默认按内存排序"),_("span",{className:"data-chip"},`${Ru(i.visible,y.length)} / ${Ru(i.total,y.length)} 进程`),_(ol,{title:"Process Resource Snapshot",data:{processSummary:i,processes:t},onOpen:l,testId:"raw-process-resources"}))),y.length===0?_(Ql,{title:"暂无进程资源数据",text:"等待 provider-gateway 上报 /proc/[pid] 采样;旧版 provider 需要先升级到支持进程资源表的版本"}):_("div",{className:"process-table-wrap"},_("table",{className:"process-resource-table","data-testid":"process-resource-table"},_("thead",null,_("tr",null,c("进程","name"),c("PID","pid"),c("用户","user"),_("th",null,"状态"),c("CPU","cpu"),c("内存","memory"),_("th",null,"RSS"),c("磁盘 I/O","disk"),c("线程","threads"),c("运行时长","runtime"))),_("tbody",null,y.map(($)=>{let A=Ru($.readBytesPerSecond)+Ru($.writeBytesPerSecond);return _("tr",{key:`${$.pid}-${$.startedAt}`,"data-testid":`process-row-${fr($.pid)}`,"data-memory-bytes":String(Ru($.rssBytes)),"data-cpu-percent":String(Ru($.cpuPercent)),"data-disk-bps":String(A),"data-pid":String(Ru($.pid))},_("td",null,_("div",{className:"process-name-cell"},_("strong",null,$.name||"--"),_("span",{className:"process-command"},$.command||"--"))),_("td",null,_("code",null,$.pid||"--")),_("td",null,$.user||`uid:${$.uid??"--"}`),_("td",null,_("span",{className:`process-state state-${fr($.state||"unknown")}`},$.state||"?")),_("td",null,_(CL,{value:$.cpuPercent,label:sX($.cpuPercent),tone:"cpu"})),_("td",null,_(CL,{value:$.memoryPercent,label:e0($.memoryPercent),tone:"memory"})),_("td",null,Of($.rssBytes)),_("td",null,_("div",{className:"process-io-cell"},_("strong",null,w7(A)),_("span",null,`R ${w7($.readBytesPerSecond)} / W ${w7($.writeBytesPerSecond)}`))),_("td",null,$.threads||0),_("td",null,dn(Ru($.elapsedSeconds))))})))))}function W7({title:u,metricKey:l,current:f,points:r,detail:n,tone:i,testId:t}){let y=r.map((F)=>Math.max(0,Math.min(100,Ru(F[l])))),c=y.length>1?y:[y[0]||0,y[0]||0],$=c.length<=1?100:100/(c.length-1),A=c.map((F,J)=>`${(J*$).toFixed(2)},${(46-F*0.42).toFixed(2)}`).join(" "),j=`0,48 ${A} 100,48`;return _("article",{className:`metric-chart ${i}`,"data-testid":t},_("div",{className:"metric-chart-head"},_("div",null,_("span",null,u),_("strong",null,e0(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 en(u){return Array.isArray(u)?u:[]}function qY(u){let l=en(u?.core?.requests?.componentSummary);return[...en(u?.frontend?.requests?.componentSummary),...l].sort((r,n)=>Ru(n.requestCount)-Ru(r.requestCount))}function wY(u){let l=en(u?.core?.operations?.summary);return[...en(u?.frontend?.operations?.summary),...l].sort((r,n)=>Ru(n.count)-Ru(r.count))}function WY(u){let l=en(u?.core?.requests?.recentFailures).map((r)=>({source:"backend",...r}));return[...en(u?.frontend?.requests?.recentFailures).map((r)=>({source:"frontend",...r})),...l].sort((r,n)=>(Kn(n.at)??0)-(Kn(r.at)??0)).slice(0,20)}function LY(u){let l=en(u?.core?.operations?.recentSlowOperations);return[...en(u?.frontend?.operations?.recentSlowOperations),...l].sort((r,n)=>Ru(n.durationMs)-Ru(r.durationMs)).slice(0,20)}function TY(u){let l=performance.memory,f=Number(l?.usedJSHeapSize);if(Number.isFinite(f)&&f>0)return f;let r=Number(u?.appBundleBytes);if(Number.isFinite(r)&&r>0)return r;return Ru(u?.process?.heapUsedBytes)}function KY({points:u}){let l=en(u),f=l.map((F)=>Ru(F.mb)),r=Math.max(1,...f),n=Math.max(0,Math.min(...f,0)),i=Math.max(1,r-n),t=l.length>1?l:[...l,...l],y=t.length<=1?100:100/(t.length-1),c=t.map((F,J)=>{let Q=Ru(F.mb);return`${(J*y).toFixed(2)},${(48-(Q-n)/i*42).toFixed(2)}`}).join(" "),$=`0,50 ${c} 100,50`,A=l.at(-1),j=l[0];return _("article",{className:"performance-memory-card","data-testid":"performance-memory-chart"},_("div",{className:"performance-memory-head"},_("strong",null,`Bwebui: ${A?`${Ru(A.mb).toFixed(1)}MB`:"--"}`),_("span",null,l.length>0?`${l.length} samples`:"等待采样")),_("svg",{viewBox:"0 0 100 50",preserveAspectRatio:"none",role:"img","aria-label":"Bwebui memory trend"},_("polygon",{points:$}),_("polyline",{points:c}),_("line",{x1:"0",x2:"100",y1:"25",y2:"25"})),_("div",{className:"performance-axis-row"},_("span",null,j?yl(new Date(j.at)):"--"),_("span",null,"时间"),_("span",null,A?yl(new Date(A.at)):"--")),_("div",{className:"performance-axis-row"},_("span",null,`${n.toFixed(1)}`),_("span",null,"(MB)"),_("span",null,`${r.toFixed(1)}`)))}function GY({onRaw:u}){let[l,f]=bu({core:null,frontend:null}),[r,n]=bu([]),[i,t]=bu(""),[y,c]=bu(!1),[$,A]=bu(null),[j,F]=bu(!1);async function J(){c(!0),t("");try{let[D,X]=await Promise.all([Eu(`${Iu.apiBaseUrl}/performance`,{cache:"no-store"}),Eu(`${Iu.apiBaseUrl}/frontend-performance`,{cache:"no-store"})]);f({core:D,frontend:X});let O=TY(X);n((Y)=>[...Y,{at:new Date().toISOString(),mb:O/1048576}].slice(-80))}catch(D){t(Ou(D,"性能指标加载失败"))}finally{c(!1)}}Tn(()=>{J();let D=setInterval(()=>void J(),5000);return()=>clearInterval(D)},[]);async function Q(){F(!0),t(""),A(null);try{let D=await Eu(`${Iu.apiBaseUrl}/code-queue-load-test`,{method:"POST",body:JSON.stringify({targetMs:1000,timeoutMs:90000,url:Iu.frontendPublicUrl||window.location.origin})});A(D),J()}catch(D){t(Ou(D,"Code Queue Playwright 测量失败"))}finally{F(!1)}}let W=qY(l),L=WY(l),U=wY(l),q=LY(l),N=l.core?.process||{},w=l.frontend?.process||{},G=l.core?.database?.codeQueueStorage||{},Z=Ru(G.total),H=$?.result||{},E=Ru(H.wallMs,NaN),m=Ru(H.networkIdleMs,NaN),S=H.withinTarget===!0,B=j?"running":$===null?"idle":$.measurementOk===!0?S?"passed":"slow":"failed";return _("div",{className:"performance-page","data-testid":"performance-page"},_("div",{className:"performance-hero"},_("div",null,_("p",{className:"panel-eyebrow"},"Unified Performance"),_(rl,{title:"性能面板",loading:y||j}),_("p",null,"按组件统计 HTTP 请求、失败率、P95 延迟,并汇总 backend/frontend 内部操作耗时。")),_("div",{className:"inline-actions"},_("button",{type:"button",className:"ghost-btn",onClick:()=>void Q(),disabled:j,"data-testid":"code-queue-load-test-button"},j?"测试中...":"测试 Code Queue 加载"),_("button",{type:"button",className:"ghost-btn",onClick:()=>void J(),disabled:y,"data-testid":"performance-refresh-button"},y?"刷新中":"刷新"),_(ol,{title:"Performance Snapshot",data:l,onOpen:u,testId:"raw-performance"}))),_(nl,{error:i}),_("div",{className:"performance-top-grid"},_(KY,{points:r}),_("div",{className:"performance-metric-stack"},_(Fl,{label:"backend RSS",value:Of(N.rssBytes),hint:`heap ${Of(N.heapUsedBytes)}`}),_(Fl,{label:"frontend RSS",value:Of(w.rssBytes),hint:`bundle ${Of(l.frontend?.appBundleBytes)}`}),_(Fl,{label:"Codex PG 任务",value:Z||"--",hint:G.ok?"unidesk_code_queue_tasks":"等待表初始化",tone:G.ok?"ok":"warn"}),_(Fl,{label:"请求样本",value:Ru(l.core?.requests?.sampleCount)+Ru(l.frontend?.requests?.sampleCount),hint:"rolling window 3000"}))),_(eu,{title:"Code Queue 加载基准",eyebrow:"Playwright / target <1s",className:"codex-load-test-panel",loading:j,actions:_("div",{className:"panel-actions"},_("button",{type:"button",className:"primary-btn",onClick:()=>void Q(),disabled:j,"data-testid":"code-queue-load-test-panel-button"},j?"正在运行 Playwright...":"手动触发测试"),$?_(ol,{title:"Code Queue Load Test",data:$,onOpen:u,testId:"raw-code-queue-load-test"}):null)},_("div",{className:"codex-load-test-grid","data-testid":"code-queue-load-test-result"},_(Fl,{label:"总耗时",value:j?"运行中":Number.isFinite(E)?qr(E):"--",hint:$===null?"点击按钮启动远端 Playwright":`目标 ${qr(H.targetMs||1000)} / ${H.url||"Code Queue"}`,tone:B==="passed"?"ok":B==="failed"||B==="slow"?"warn":""}),_(Fl,{label:"判定",value:j?"RUNNING":B==="passed"?"PASS <1s":B==="slow"?"SLOW":B==="failed"?"FAILED":"--",hint:$?.measurementOk===!1?String($.error||H.error||"measurement failed").slice(0,120):"导航开始 -> DOMContentLoaded -> data-load-state=complete",tone:B==="passed"?"ok":B==="idle"||B==="running"?"":"fail"}),_(Fl,{label:"Network idle",value:Number.isFinite(m)?qr(m):"--",hint:`DOMContentLoaded ${qr(H.domContentLoadedMs)} / ${H.networkIdleReached===!1?"未在 5s 内空闲":"已空闲"}`,tone:Number.isFinite(m)&&m<=1000?"ok":"warn"}),_(Fl,{label:"组件耗时",value:Number.isFinite(Ru(H.componentLoadMs,NaN))?qr(H.componentLoadMs):"--",hint:`queue ${qr(H.queueMs)} / detail ${qr(H.detailMs)}`,tone:Ru(H.componentLoadMs)>1000?"warn":"ok"}),_(Fl,{label:"Trace 规模",value:Number.isFinite(Ru(H.transcriptRows,NaN))?String(H.transcriptRows):"--",hint:`${H.visibleTaskCount??0} visible tasks / ${H.partial?"preview":"complete"}`})),j?_("div",{className:"performance-empty-line"},"正在通过 main-server Host SSH 启动 Playwright,完成后会显示 wall time、组件耗时和最慢 API。"):null,$&&Array.isArray(H.slowestApi)&&H.slowestApi.length>0?_("div",{className:"table-wrap performance-table-wrap compact codex-load-api-table"},_("table",{className:"performance-table"},_("thead",null,_("tr",null,["API","状态","耗时"].map((D)=>_("th",{key:D},D)))),_("tbody",null,H.slowestApi.slice(0,5).map((D,X)=>_("tr",{key:`${D.url}-${X}`},_("td",null,_("code",null,D.url)),_("td",null,D.status),_("td",null,qr(D.durationMs))))))):null),_("div",{className:"performance-grid"},_(eu,{title:"组件汇总",eyebrow:"Requests",loading:y},W.length===0?_(Ql,{title:"暂无请求样本",text:"刷新几次或打开页面后会自动形成组件统计"}):_("div",{className:"table-wrap performance-table-wrap"},_("table",{className:"performance-table"},_("thead",null,_("tr",null,["组件","请求数","失败数","失败率","平均延迟","P95"].map((D)=>_("th",{key:D},D)))),_("tbody",null,W.map((D)=>_("tr",{key:D.component},_("td",null,_("code",null,D.component)),_("td",null,D.requestCount),_("td",null,D.failureCount),_("td",null,e0(Ru(D.failureRate)*100)),_("td",null,qr(D.averageLatencyMs)),_("td",null,qr(D.p95LatencyMs)))))))),_(eu,{title:"最近失败请求",eyebrow:"Failures",loading:y},L.length===0?_("div",{className:"performance-empty-line"},"最近没有失败请求"):_("div",{className:"table-wrap performance-table-wrap compact"},_("table",{className:"performance-table"},_("thead",null,_("tr",null,["时间","来源","组件","状态","路径"].map((D)=>_("th",{key:D},D)))),_("tbody",null,L.map((D,X)=>_("tr",{key:`${D.at}-${X}`},_("td",null,wu(D.at)),_("td",null,D.source),_("td",null,_("code",null,D.component)),_("td",null,_(Tl,{status:"failed"},D.status)),_("td",null,_("code",null,D.path)))))))),_(eu,{title:"内部操作汇总",eyebrow:"Operations",loading:y},U.length===0?_(Ql,{title:"暂无内部操作样本",text:"API 查询和代理请求会自动记录内部操作耗时"}):_("div",{className:"table-wrap performance-table-wrap"},_("table",{className:"performance-table"},_("thead",null,_("tr",null,["服务","操作","次数","平均延迟","P95"].map((D)=>_("th",{key:D},D)))),_("tbody",null,U.map((D)=>_("tr",{key:`${D.service}-${D.operation}`},_("td",null,D.service),_("td",null,_("code",null,D.operation)),_("td",null,D.count),_("td",null,qr(D.averageLatencyMs)),_("td",null,qr(D.p95LatencyMs)))))))),_(eu,{title:"最近慢操作",eyebrow:"Slowest",loading:y},q.length===0?_(Ql,{title:"暂无慢操作",text:"后端会记录最近窗口内耗时最高的内部操作"}):_("div",{className:"table-wrap performance-table-wrap"},_("table",{className:"performance-table"},_("thead",null,_("tr",null,["时间","操作","耗时","结果","细节"].map((D)=>_("th",{key:D},D)))),_("tbody",null,q.map((D,X)=>_("tr",{key:`${D.at}-${D.operation}-${X}`},_("td",null,wu(D.at)),_("td",null,_("code",null,D.operation)),_("td",null,qr(D.durationMs)),_("td",null,D.ok?"成功":"失败"),_("td",null,D.detail||"-")))))))))}function zY({provider:u,refresh:l,onRaw:f}){let[r,n]=bu(""),[i,t]=bu(null),[y,c]=bu("");async function $(A){n(A),c("");try{let j=await Eu(`${Iu.apiBaseUrl}/dispatch`,{method:"POST",body:JSON.stringify({providerId:u.providerId,command:"provider.upgrade",payload:{mode:A,source:"frontend-resource-monitor",requestedAt:new Date().toISOString()}})});t({mode:A,...j}),await l()}catch(j){c(Ou(j,"升级命令下发失败"))}finally{n("")}}return _(eu,{title:"Provider Gateway 升级",eyebrow:"Remote Control",loading:Boolean(r)},_("div",{className:"upgrade-control","data-testid":"provider-upgrade-control"},_("p",null,"通过 UniDesk WebSocket 向当前计算节点下发 provider.upgrade;预检只生成升级计划,执行升级会调度节点本地 updater 容器。"),_("div",{className:"upgrade-target-line"},_("span",null,"指定 Provider"),_("code",null,u.providerId),_(Vy,{node:u})),_("div",{className:"upgrade-actions"},_("button",{type:"button",className:"ghost-btn",disabled:Boolean(r),onClick:()=>$("plan"),"data-testid":"upgrade-plan-button"},r==="plan"?"预检中":"预检升级"),_("button",{type:"button",className:"ghost-btn danger",disabled:Boolean(r),onClick:()=>$("schedule"),"data-testid":"upgrade-schedule-button"},r==="schedule"?"调度中":"执行升级")),_(nl,{error:y}),i?_("div",{className:"upgrade-result"},_(Tl,{status:i.status||"queued"},i.status||"queued"),_("span",null,`${i.mode==="schedule"?"执行升级":"预检升级"} 已下发`),_("span",null,`指定版本 ${z7(gL(u))}`),_("code",null,i.taskId||"--"),_(ol,{title:"Provider Upgrade Dispatch",data:i,onOpen:f})):_("span",{className:"muted"},"升级任务结果会进入任务历史;执行升级可能导致 provider 短暂重连。")))}function nT({records:u,onRaw:l,compact:f=!1}){if(u.length===0)return _(Ql,{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-${fr(r.id)}`},_("td",null,_(Tl,{status:r.status})),_("td",null,_("span",{className:`mode-chip ${IA(r)}`},IA(r)==="schedule"?"执行升级":"预检")),_("td",null,_("strong",null,"provider.upgrade"),_("code",null,r.id)),_("td",null,eX(r)),_("td",null,_(tT,{task:r})),_("td",null,uY(r)),_("td",null,_("span",{className:"version-chip"},dL(r))),_("td",null,_("span",{className:`upgrade-outcome ${String(r.status||"").toLowerCase()}`},eL(r))),_("td",null,wu(r.updatedAt)),_("td",null,_(ol,{title:`Provider Upgrade Task ${r.id}`,data:r_(r),onOpen:l})))))))}function EY({provider:u,tasks:l,onRaw:f,limit:r=5}){let n=uT(l,u.providerId).slice(0,r);return _(eu,{title:"远程更新记录",eyebrow:u.providerId,actions:_(Vy,{node:u}),className:"provider-upgrade-records-panel"},_("div",{"data-testid":`provider-upgrade-records-${fr(u.providerId)}`},_(nT,{records:n,onRaw:f,compact:!0})))}function OY({nodes:u,tasks:l,onRaw:f}){let r=f_(()=>u.map((i)=>{let t=uT(l,i.providerId);return{node:i,records:t,latest:lY(t),capabilities:sL(i)}}),[u,l]),n=r.reduce((i,t)=>i+t.records.length,0);return _("div",{className:"gateway-page","data-testid":"gateway-version-page"},_(eu,{title:"Provider Gateway 版本",eyebrow:`${u.length} Providers / ${n} 更新记录`},u.length===0?_(Ql,{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,_(Tl,{status:i.node.status})),_("td",null,_("strong",null,i.node.name),_("code",null,i.node.providerId)),_("td",null,_(Vy,{node:i.node})),_("td",null,l_(i.node)),_("td",null,_(E7,{node:i.node})),_("td",null,pL(i.node)?wu(pL(i.node)):"待新版上报"),_("td",null,_("div",{className:"capability-row"},i.capabilities.length===0?_("span",{className:"muted"},"未声明"):i.capabilities.slice(0,5).map((t)=>_("span",{key:t,className:"data-chip"},t)))),_("td",null,i.latest?_("div",{className:"latest-upgrade-cell"},_(Tl,{status:i.latest.status}),_("span",null,`${IA(i.latest)==="schedule"?"执行升级":"预检"} / ${wu(i.latest.updatedAt)}`),_("small",null,`Gateway ${dL(i.latest)}`),_("small",null,eL(i.latest))):_("span",{className:"muted"},"暂无记录")),_("td",null,_(ol,{title:`Provider ${i.node.providerId}`,data:i.node,onOpen:f})))))))),_(eu,{title:"远程更新记录",eyebrow:"Structured provider.upgrade records"},u.length===0?_(Ql,{title:"暂无记录",text:"没有 provider 节点时不会生成远程更新记录"}):_("div",{className:"gateway-record-grid"},r.map((i)=>_("article",{key:i.node.providerId,className:"gateway-record-card","data-testid":`gateway-records-${fr(i.node.providerId)}`},_("div",{className:"gateway-record-head"},_("div",null,_("strong",null,i.node.name),_("code",null,i.node.providerId)),_(Vy,{node:i.node})),_("div",{className:"gateway-record-meta"},_("span",null,`心跳 ${wu(i.node.lastHeartbeat)}`),_("span",null,`策略 ${l_(i.node)}`),_("span",null,`${i.records.length} 条记录`)),_(nT,{records:i.records.slice(0,8),onRaw:f,compact:!0}))))))}function ZY(u){if(u==="running")return"online";if(u==="paused"||u==="restarting")return"warn";if(u==="exited"||u==="dead")return"offline";return"internal"}function iT(u){return/^[a-f0-9]{48,64}$/i.test(u)}function u_(u){let l=String(u?.name||""),f=String(u?.labels||"");return l==="unidesk_pgdata_10gb"||f.includes("com.docker.compose.volume=unidesk_pgdata_10gb")||l.toLowerCase().includes("pgdata")}function ML(u){let l=String(u?.name||""),f=String(u?.labels||"");if(u_(u))return 0;if(f.includes("com.docker.compose.project=unidesk"))return 1;if(!iT(l))return 2;return 3}function HY(u){return[...u].sort((l,f)=>{let r=ML(l)-ML(f);if(r!==0)return r;return String(l.name||"").localeCompare(String(f.name||""))})}function BY({nodes:u,dockerStatuses:l,onRaw:f}){let[r,n]=bu(""),i=f_(()=>u.map((q)=>{let N=l.find((w)=>w.providerId===q.providerId);return{...q,dockerStatus:N?.dockerStatus||null,dockerUpdatedAt:N?.updatedAt||null}}),[u,l]),t=i.find((q)=>q.providerId===r)||i[0]||null;if(Tn(()=>{if(!r&&i[0])n(i[0].providerId)},[i.length,r]),!t)return _(Ql,{title:"暂无 Docker 节点",text:"等待 provider 上报 Docker daemon 状态"});let y=t.dockerStatus,c=t.providerId==="main-server",$=y?.counts||{},A=y?.daemon||{},j=y?.containers||[],F=y?.images||[],J=HY(y?.volumes||[]),Q=c?J.find(u_):null,W=y?.networks||[],L=j.filter((q)=>q.state==="running"),U=j.filter((q)=>q.state!=="running");return _("div",{className:"docker-page","data-testid":"docker-status-page"},_("div",{className:"docker-node-strip"},i.map((q)=>_("button",{key:q.providerId,type:"button",className:`docker-node-tile ${t.providerId===q.providerId?"active":""}`,onClick:()=>n(q.providerId)},_("span",{className:`pulse ${q.status}`}),_("strong",null,q.name),_("code",null,q.providerId),_("span",null,q.dockerStatus?`Docker ${q.dockerStatus.ok?"ready":"degraded"}`:"等待上报")))),_("div",{className:"docker-layout"},_(eu,{title:"Docker Desktop 视图",eyebrow:t.name,className:"docker-main-panel",actions:y?_(ol,{title:`Docker ${t.providerId}`,data:y,onOpen:f}):null},!y?_(Ql,{title:"Docker 状态未上报",text:"provider-gateway 会在连接后周期性采集 docker info / ps / images / volume / network"}):_("div",null,_("div",{className:"docker-hero"},_("div",null,_("p",{className:"panel-eyebrow"},"Daemon"),_("h3",null,A.name||t.providerId),_("div",{className:"docker-meta"},_("span",null,A.serverVersion?`Engine ${A.serverVersion}`:"Engine --"),_("span",null,A.operatingSystem||"OS --"),_("span",null,A.architecture||"arch --"),_("span",null,`${A.cpus||0} CPU / ${Of(A.memoryBytes)}`))),_(Tl,{status:y.ok?"online":"warn"},y.ok?"Docker Ready":"Docker Degraded")),_("div",{className:"docker-metrics"},_(Fl,{label:"Containers",value:$.containers??j.length,hint:`${$.running??L.length} running / ${$.stopped??U.length} stopped`,tone:"ok"}),_(Fl,{label:"Images",value:$.images??F.length,hint:`${$.daemonImages??$.images??F.length} daemon images`}),_(Fl,{label:"Volumes",value:$.volumes??J.length,hint:c?Q?"database volume visible":"database volume missing":"node local volumes",tone:Q?"ok":""}),_(Fl,{label:"Networks",value:$.networks??W.length,hint:A.driver?`driver ${A.driver}`:"docker networks"})),c?_(VY,{volume:Q,volumeCount:J.length}):null,_("div",{className:"docker-section-head"},_("h3",null,"Containers"),_("span",null,`updated ${wu(t.dockerUpdatedAt||y.collectedAt)}`)),_("div",{className:"docker-container-table table-wrap","data-testid":"docker-container-table"},_("table",null,_("thead",null,_("tr",null,_("th",null,"状态"),_("th",null,"容器"),_("th",null,"镜像"),_("th",null,"端口"),_("th",null,"运行时间"),_("th",null,"重启策略"),_("th",null,"PID"),_("th",null,"大小"))),_("tbody",null,j.length===0?_("tr",null,_("td",{colSpan:8},"暂无容器")):j.map((q)=>_("tr",{key:`${q.id}-${q.name}`},_("td",null,_(Tl,{status:ZY(q.state)},q.state||"unknown")),_("td",null,_("strong",null,q.name||"--"),_("code",null,q.id||"--")),_("td",null,q.image||"--"),_("td",null,q.ports||_("span",{className:"muted"},"未发布")),_("td",null,q.runningFor||q.status||"--"),_("td",null,q.restartPolicy?_(Tl,{status:q.restartPolicy==="always"?"online":"warn"},q.restartPolicy):"--"),_("td",null,q.pidMode?_("code",null,q.pidMode):"--"),_("td",null,q.size||"--")))))))),_("div",{className:"docker-side-stack"},_(L7,{title:"Images",items:F,render:(q)=>_("article",{key:`${q.id}-${q.repository}`,className:"docker-side-row"},_("strong",null,`${q.repository}:${q.tag}`),_("span",null,q.size||"--"),_("code",null,q.id||"--"))}),_(L7,{title:"Volumes",items:J,limit:J.length,render:(q)=>_("article",{key:q.name,className:`docker-side-row volume-row ${c&&u_(q)?"database-volume":""}`,"data-testid":c&&u_(q)?"database-volume-row":void 0},_("strong",null,q.name),_("span",null,c&&u_(q)?"PostgreSQL":iT(String(q.name||""))?"anonymous":"named"),_("code",null,q.mountpoint||q.driver||q.scope||"--"))}),_(L7,{title:"Networks",items:W,render:(q)=>_("article",{key:q.id||q.name,className:"docker-side-row"},_("strong",null,q.name),_("span",null,q.driver||"--"),_("code",null,q.id||"--"))}))))}function VY({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"),_(Tl,{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 L7({title:u,items:l,render:f,limit:r}){let n=l.slice(0,r??12),i=Math.max(0,l.length-n.length);return _(eu,{title:u,eyebrow:`${l.length} items`,className:"docker-side-panel"},l.length===0?_(Ql,{title:`暂无 ${u}`,text:"等待 Docker 状态采集"}):_("div",{className:"docker-side-list"},n.map(f),i>0?_("div",{className:"docker-side-more"},`+ ${i} more`):null))}function mY({microservices:u,onRaw:l,onNavigate:f}){let r=u.filter((n)=>XL(n).public===!1);return _("div",{className:"microservice-page","data-testid":"microservice-catalog-page"},_(eu,{title:"用户服务目录",eyebrow:"Provider Mounted User Services"},_("div",{className:"metric-grid"},_(Fl,{label:"服务总数",value:u.length,hint:"config.json 用户服务登记"}),_(Fl,{label:"私有后端",value:r.length,hint:"不直接暴露公网",tone:"ok"}),_(Fl,{label:"D601 服务",value:u.filter((n)=>n.providerId==="D601").length,hint:"compute-node docker"}),_(Fl,{label:"集成前端",value:u.filter((n)=>n.frontend?.integrated).length,hint:"UniDesk React 页面"}))),_(eu,{title:"服务映射",eyebrow:"Repo Reference + Runtime"},u.length===0?_(Ql,{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=lT(n),t=fY(n),y=XL(n),c=i.availability||{},$=c.status||(i.providerStatus==="online"?"unknown":"unhealthy");return _("tr",{key:n.id,"data-testid":`microservice-row-${fr(n.id)}`},_("td",null,_("strong",null,n.name),_("code",null,n.id)),_("td",null,_("strong",null,i.providerName||n.providerId),_("code",null,n.providerId)),_("td",null,_("span",null,t.url||"--"),_("code",null,t.commitId||"--")),_("td",null,_("span",null,t.composeFile||"--"),_("code",null,`${t.composeService||"--"} / ${t.containerName||"--"}`)),_("td",null,_(Tl,{status:y.public?"warn":"online"},y.public?"public":"private"),_("code",null,`${y.nodeBindHost||"--"}:${y.nodePort||"--"} -> ${y.proxyMode||"--"}`)),_("td",null,_("span",null,n.development?.sshPassthrough?"SSH 透传":"未配置"),_("code",null,n.development?.worktreePath||"--")),_("td",null,_(Tl,{status:$==="healthy"?"online":$==="unknown"?"warn":"failed"},$),_("span",null,c.reason||i.providerStatus||"unknown"),_(li,{data:i.container,empty:"容器快照未上报"})),_("td",null,_("div",{className:"microservice-actions"},n.id==="findjob"?_("button",{type:"button",className:"ghost-btn",onClick:()=>f("apps","findjob"),"data-testid":"open-findjob-button"},"打开"):null,n.id==="pipeline"?_("button",{type:"button",className:"ghost-btn",onClick:()=>f("apps","pipeline"),"data-testid":"open-pipeline-button"},"打开"):null,n.id==="todo-note"?_("button",{type:"button",className:"ghost-btn",onClick:()=>f("apps","todo-note"),"data-testid":"open-todo-note-button"},"打开"):null,n.id==="met-nonlinear"?_("button",{type:"button",className:"ghost-btn",onClick:()=>f("apps","met-nonlinear"),"data-testid":"open-met-nonlinear-button"},"打开"):null,n.id==="claudeqq"?_("button",{type:"button",className:"ghost-btn",onClick:()=>f("apps","claudeqq"),"data-testid":"open-claudeqq-button"},"打开"):null,n.id==="baidu-netdisk"?_("button",{type:"button",className:"ghost-btn",onClick:()=>f("apps","baidu-netdisk"),"data-testid":"open-baidu-netdisk-button"},"打开"):null,n.id==="oa-event-flow"?_("button",{type:"button",className:"ghost-btn",onClick:()=>f("apps","oa-event-flow"),"data-testid":"open-oa-event-flow-button"},"打开"):null,n.id==="k3sctl-adapter"?_("button",{type:"button",className:"ghost-btn",onClick:()=>f("apps","k3sctl"),"data-testid":"open-k3sctl-button"},"打开"):null,n.id==="code-queue"?_("button",{type:"button",className:"ghost-btn",onClick:()=>f("apps","code-queue"),"data-testid":"open-code-queue-button"},"打开"):null,n.id==="mdtodo"?_("button",{type:"button",className:"ghost-btn",onClick:()=>f("apps","mdtodo"),"data-testid":"open-mdtodo-button"},"打开"):null,n.id==="project-manager"?_("button",{type:"button",className:"ghost-btn",onClick:()=>f("apps","project-manager"),"data-testid":"open-project-manager-button"},"打开"):null,_(ol,{title:`用户服务 ${n.id}`,data:n,onOpen:l}))))}))))))}function DY({nodes:u,onDispatched:l,onRaw:f}){let r=u.filter((B)=>B.status==="online"),[n,i]=bu(r[0]?.providerId||u[0]?.providerId||""),[t,y]=bu("docker.ps"),[c,$]=bu("frontend"),[A,j]=bu("operator-check"),[F,J]=bu("normal"),[Q,W]=bu(!1),[L,U]=bu(""),[q,N]=bu(!1),[w,G]=bu(null),[Z,H]=bu("");Tn(()=>{if(!n&&(r[0]?.providerId||u[0]?.providerId))i(r[0]?.providerId||u[0].providerId)},[u.length,r.length,n]);function E(){return{source:c,note:A,priority:F}}function m(){U(JSON.stringify(E(),null,2)),W(!0)}async function S(B){B.preventDefault(),N(!0),H("");try{let D=Q?JSON.parse(L||"{}"):E(),X=await Eu(`${Iu.apiBaseUrl}/dispatch`,{method:"POST",body:JSON.stringify({providerId:n,command:t,payload:D})});G(X),await l()}catch(D){H(Ou(D,"下发失败"))}finally{N(!1)}}return _("div",{className:"page-grid dispatch-grid"},_(eu,{title:"下发任务",eyebrow:"Real WebSocket Dispatch"},_("form",{className:"dispatch-form",onSubmit:S},_("label",null,"Provider",_("select",{value:n,onChange:(B)=>i(B.target.value)},u.map((B)=>_("option",{key:B.providerId,value:B.providerId},`${B.name} / ${B.providerId}`)))),_("label",null,"Command",_("select",{value:t,onChange:(B)=>y(B.target.value)},_("option",{value:"docker.ps"},"docker.ps"),_("option",{value:"host.ssh"},"host.ssh"),_("option",{value:"microservice.http"},"microservice.http"),_("option",{value:"echo"},"echo"))),_("label",null,"来源",_("input",{value:c,onChange:(B)=>$(B.target.value)})),_("label",null,"备注",_("input",{value:A,onChange:(B)=>j(B.target.value)})),_("label",null,"优先级",_("select",{value:F,onChange:(B)=>J(B.target.value)},_("option",{value:"normal"},"normal"),_("option",{value:"low"},"low"),_("option",{value:"urgent"},"urgent"))),_("div",{className:"dispatch-actions"},_("button",{type:"button",className:"ghost-btn",onClick:m},"查看原始JSON"),_("button",{type:"submit",disabled:q||!n},q?"下发中":"下发任务")),Q?_("label",{className:"raw-editor-label"},"高级 Payload",_("textarea",{className:"raw-editor",value:L,onChange:(B)=>U(B.target.value)})):null,_(nl,{error:Z,wide:!0}))),_(eu,{title:"下发结果",eyebrow:"Response"},w?_("div",{className:"result-card"},_(Tl,{status:w.status||"queued"},w.status||"queued"),_("dl",null,_("dt",null,"Task ID"),_("dd",null,_("code",null,w.taskId||"--")),_("dt",null,"Provider 在线"),_("dd",null,ut(w.providerOnline))),_(ol,{title:"Dispatch Response",data:w,onOpen:f})):_(Ql,{title:"等待操作",text:"任务响应会以结构化结果卡展示"})))}function RL({task:u,onRaw:l}){return _("article",{className:"compact-row"},_(Tl,{status:u.status}),_("div",null,_("strong",null,u.command),_("code",null,u.id)),_("span",null,my(u)?`已等待 ${K7(u.updatedAt)}`:`耗时 ${dn(vL(u)??0)}`),_(ol,{title:`Task ${u.id}`,data:r_(u),onOpen:l}))}function tT({task:u}){let l=vL(u),f=my(u);return _("div",{className:"task-duration"},_("strong",null,l===null?"--":dn(l)),_("span",null,f?`已运行 / 创建 ${wu(u.createdAt)}`:`创建 ${wu(u.createdAt)}`))}function pY({task:u}){let l=String(u?.status||"").toLowerCase(),f=u?.result,r=f&&typeof f==="object"&&!Array.isArray(f)?f:{},i=["exitCode","code","signal","timeoutMs","previousStatus","mode"].filter((t)=>r[t]!==void 0&&r[t]!==null);if(l==="failed"){let t=kL(u);return _("div",{className:"task-diagnostic failed"},_("b",null,"失败原因"),_("span",{className:"diagnostic-reason"},ut(t)),i.length>0?_("div",{className:"diagnostic-meta"},i.map((y)=>_("span",{key:y,className:"data-chip"},_("b",null,y),_("span",null,ut(r[y]))))):null)}if(my(u))return _("div",{className:"task-diagnostic warn"},_("b",null,"等待终态"),_("span",null,`最后更新 ${K7(u.updatedAt)} 前`));return _("div",{className:"task-diagnostic ok"},_("b",null,"完成摘要"),_(li,{data:f,empty:"无执行输出"}))}function SY({tasks:u,onRaw:l}){let f=u.filter(my);return _("div",{"data-testid":"pending-task-page"},_(eu,{title:"待处理任务",eyebrow:`${f.length} Pending`},f.length===0?_(Ql,{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,_(Tl,{status:r.status})),_("td",null,_("strong",null,r.command),_("code",null,r.id)),_("td",null,_("code",null,r.providerId)),_("td",null,K7(r.updatedAt)),_("td",null,_(li,{data:r.payload})),_("td",null,_(ol,{title:`Pending Task ${r.id}`,data:r_(r),onOpen:l})))))))))}function XY({tasks:u,onRaw:l}){return _("div",{"data-testid":"task-history-page"},_(eu,{title:"任务历史",eyebrow:`${u.length} Tasks`},u.length===0?_(Ql,{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-${fr(f.id)}`},_("td",null,_(Tl,{status:f.status})),_("td",null,_("strong",null,f.command),_("code",null,f.id)),_("td",null,_("code",null,f.providerId)),_("td",null,_(tT,{task:f})),_("td",null,_(li,{data:f.payload})),_("td",null,_(pY,{task:f})),_("td",null,wu(f.updatedAt)),_("td",null,_(ol,{title:`Task ${f.id}`,data:r_(f),onOpen:l})))))))))}function YY({tasks:u,onRaw:l}){let f=u.filter((r)=>["succeeded","failed"].includes(r.status));return _(eu,{title:"执行结果",eyebrow:"Finished Tasks"},f.length===0?_(Ql,{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),_(Tl,{status:r.status})),_("code",null,r.id),_(li,{data:r.result,empty:"无执行输出"}),_(ol,{title:`Task Result ${r.id}`,data:r_(r),onOpen:l})))))}function PY(u){if(!u||typeof u!=="object")return"--";if(u.type==="interval")return`每 ${dn(Number(u.everySeconds||0))}`;return`每天 ${u.timeOfDay||"03:00"} UTC`}function CY(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 MY(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 RY(u){let l=Number(u?.durationMs);if(Number.isFinite(l)&&l>=0)return dn(l/1000);let f=Kn(u?.startedAt||u?.createdAt);if(f===null)return"--";let n=Kn(u?.finishedAt)??Date.now();return dn(Math.max(0,(n-f)/1000))}function xL(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 xY({schedules:u,scheduleRuns:l,nodes:f,refresh:r,onRaw:n}){let[i,t]=bu(xL(f||[])),[y,c]=bu(!1),[$,A]=bu(""),[j,F]=bu(""),J=[...l||[]].sort((w,G)=>(Kn(G.updatedAt)??0)-(Kn(w.updatedAt)??0));function Q(w,G){t((Z)=>({...Z,[w]:G}))}function W(w){let G=w?.action||{};t({id:w?.id||"",name:w?.name||"",description:w?.description||"",enabled:w?.enabled!==!1,timeOfDay:w?.schedule?.timeOfDay||"03:30",actionType:G.type||"dispatch",providerId:G.providerId||f[0]?.providerId||"main-server",command:G.command||"echo",payloadJson:JSON.stringify(G.payload||{source:"scheduled-task"},null,2),remoteBaseDir:G.remoteBaseDir||"/SERVER_DATA/UNIDESK_PG_DATA",stagingSubdir:G.stagingSubdir||"server-data/unidesk-pg-data",timeoutMs:String(G.timeoutMs||3600000)}),F(`正在编辑 ${w?.id||""}`)}function L(){let w={id:i.id,name:i.name,description:i.description,enabled:i.enabled,concurrencyPolicy:"skip",schedule:{type:"daily",timeOfDay:i.timeOfDay,timezone:"Etc/UTC"}};if(i.actionType==="pgdata_backup")return{...w,action:{type:"pgdata_backup",volumeName:"unidesk_pgdata_10gb",remoteBaseDir:i.remoteBaseDir,stagingSubdir:i.stagingSubdir,timeoutMs:Number(i.timeoutMs)||3600000,cleanupLocal:!0}};return{...w,action:{type:"dispatch",providerId:i.providerId,command:i.command,payload:JSON.parse(i.payloadJson||"{}"),timeoutMs:Number(i.timeoutMs)||600000}}}async function U(w){w.preventDefault(),c(!0),A(""),F("");try{let G=L(),Z=encodeURIComponent(String(G.id));await Eu(`${Iu.apiBaseUrl}/schedules/${Z}`,{method:"PUT",body:JSON.stringify(G)}),F("定时任务已保存"),await r()}catch(G){A(Ou(G,"保存定时任务失败"))}finally{c(!1)}}async function q(w){if(!w?.id)return;c(!0),A(""),F("");try{await Eu(`${Iu.apiBaseUrl}/schedules/${encodeURIComponent(w.id)}`,{method:"DELETE"}),F(`已删除 ${w.id}`),await r()}catch(G){A(Ou(G,"删除定时任务失败"))}finally{c(!1)}}async function N(w){if(!w?.id)return;c(!0),A(""),F("");try{let G=await Eu(`${Iu.apiBaseUrl}/schedules/${encodeURIComponent(w.id)}/run`,{method:"POST",body:"{}"});F(`已触发 ${w.id} / ${G?.run?.id||"run"}`),await r()}catch(G){A(Ou(G,"触发定时任务失败"))}finally{c(!1)}}return _("div",{className:"page-grid scheduled-task-page","data-testid":"scheduled-task-page"},_(eu,{title:"定时任务",eyebrow:`${(u||[]).length} Schedules`},(u||[]).length===0?_(Ql,{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-${fr(w.id)}`},_("div",{className:"node-card-head"},_("strong",null,w.name||w.id),_(Tl,{status:w.enabled?"online":"warn"},w.enabled?"enabled":"disabled")),_("code",null,w.id),_("dl",null,_("dt",null,"计划"),_("dd",null,PY(w.schedule)),_("dt",null,"动作"),_("dd",null,CY(w.action)),_("dt",null,"下次执行"),_("dd",null,wu(w.nextRunAt)),_("dt",null,"最近执行"),_("dd",null,w.lastRunAt?`${wu(w.lastRunAt)} / ${w.lastRunId||"--"}`:"--")),_("div",{className:"dispatch-actions"},_("button",{type:"button",className:"ghost-btn",disabled:y,onClick:()=>W(w)},"编辑"),_("button",{type:"button",className:"ghost-btn",disabled:y,onClick:()=>N(w),"data-testid":`schedule-run-${fr(w.id)}`},"手动触发"),_("button",{type:"button",className:"ghost-btn danger",disabled:y,onClick:()=>q(w)},"删除"),_(ol,{title:`Schedule ${w.id}`,data:w,onOpen:n})))))),_(eu,{title:i.id?"配置定时任务":"新建定时任务",eyebrow:"CRUD"},_("form",{className:"dispatch-form schedule-form",onSubmit:U},_("label",null,"ID",_("input",{value:i.id,onChange:(w)=>Q("id",w.target.value)})),_("label",null,"名称",_("input",{value:i.name,onChange:(w)=>Q("name",w.target.value)})),_("label",null,"每日执行时间 UTC",_("input",{value:i.timeOfDay,placeholder:"03:30",onChange:(w)=>Q("timeOfDay",w.target.value)})),_("label",null,"启用",_("select",{value:i.enabled?"true":"false",onChange:(w)=>Q("enabled",w.target.value==="true")},_("option",{value:"true"},"enabled"),_("option",{value:"false"},"disabled"))),_("label",null,"动作类型",_("select",{value:i.actionType,onChange:(w)=>Q("actionType",w.target.value)},_("option",{value:"pgdata_backup"},"PGDATA 备份到百度网盘"),_("option",{value:"dispatch"},"Provider Dispatch"))),i.actionType==="pgdata_backup"?[_("label",{key:"remote"},"网盘根目录",_("input",{value:i.remoteBaseDir,onChange:(w)=>Q("remoteBaseDir",w.target.value)})),_("label",{key:"staging"},"本地 staging 子目录",_("input",{value:i.stagingSubdir,onChange:(w)=>Q("stagingSubdir",w.target.value)}))]:[_("label",{key:"provider"},"Provider",_("select",{value:i.providerId,onChange:(w)=>Q("providerId",w.target.value)},(f||[]).map((w)=>_("option",{key:w.providerId,value:w.providerId},`${w.name} / ${w.providerId}`)))),_("label",{key:"command"},"Command",_("select",{value:i.command,onChange:(w)=>Q("command",w.target.value)},_("option",{value:"echo"},"echo"),_("option",{value:"docker.ps"},"docker.ps"),_("option",{value:"host.ssh"},"host.ssh"),_("option",{value:"microservice.http"},"microservice.http"))),_("label",{key:"payload",className:"raw-editor-label"},"Payload JSON",_("textarea",{className:"raw-editor",value:i.payloadJson,onChange:(w)=>Q("payloadJson",w.target.value)}))],_("label",null,"超时 ms",_("input",{value:i.timeoutMs,onChange:(w)=>Q("timeoutMs",w.target.value)})),_("label",{className:"raw-editor-label"},"描述",_("textarea",{className:"raw-editor compact",value:i.description,onChange:(w)=>Q("description",w.target.value)})),_("div",{className:"dispatch-actions"},_("button",{type:"button",className:"ghost-btn",disabled:y,onClick:()=>t(xL(f||[]))},"重置"),_("button",{type:"submit",disabled:y||!i.id},y?"保存中":"保存任务")),j?_("p",{className:"muted paragraph"},j):null,_(nl,{error:$,wide:!0}))),_(eu,{title:"历史执行记录",eyebrow:`${J.length} Runs`},J.length===0?_(Ql,{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-${fr(w.id)}`},_("td",null,_(Tl,{status:MY(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,RY(w)),_("td",null,_(li,{data:w.result||w.error,empty:"无结果"})),_("td",null,wu(w.updatedAt)),_("td",null,_(ol,{title:`Schedule Run ${w.id}`,data:w,onOpen:n})))))))))}function hY({data:u}){let l=u.overview||{};return _("div",{className:"page-grid topology-grid"},_(eu,{title:"公开入口",eyebrow:"Public"},_("div",{className:"endpoint-list"},_("article",null,_("b",null,"Frontend"),_("span",null,Iu.frontendPublicUrl||window.location.origin),_(Tl,{status:"online"},"public")),_("article",null,_("b",null,"Provider Ingress"),_("span",null,Iu.providerIngressPublicUrl||"ws://public/ws/provider"),_(Tl,{status:"online"},"public")))),_(eu,{title:"内部服务",eyebrow:"Docker Network Only"},_("div",{className:"endpoint-list"},_("article",null,_("b",null,"backend-core API"),_("span",null,"http://backend-core:8080"),_(Tl,{status:"internal"},"internal")),_("article",null,_("b",null,"database"),_("span",null,"postgres://database:5432/unidesk"),_(Tl,{status:"internal"},"internal")))),_(eu,{title:"运行态",eyebrow:"Runtime"},_("div",{className:"metric-grid"},_(Fl,{label:"DB Ready",value:l.dbReady?"YES":"NO",hint:"internal health"}),_(Fl,{label:"Online Nodes",value:l.onlineNodeCount??0,hint:"provider-gateway self-link"}))))}function bY({session:u}){return _(eu,{title:"认证策略",eyebrow:"Frontend Login"},_("div",{className:"policy-grid"},_("article",null,_("span",null,"默认账号"),_("strong",null,Iu.authUsername||"admin")),_("article",null,_("span",null,"当前会话"),_("strong",null,u?.user?.username||"--")),_("article",null,_("span",null,"Session TTL"),_("strong",null,`${Iu.sessionTtlSeconds||0}s`)),_("article",null,_("span",null,"API 访问"),_("strong",null,"同源 Cookie 保护"))),_("p",{className:"muted paragraph"},"浏览器只访问 frontend 同源接口;frontend 容器使用 Docker 内网代理 backend-core API。"))}function vY(){return _(eu,{title:"安全边界",eyebrow:"Exposure Rule"},_("div",{className:"security-board"},_("article",{className:"allow"},_("b",null,"允许公网"),_("span",null,"frontend 登录入口"),_("span",null,"provider ingress WebSocket/health")),_("article",{className:"deny"},_("b",null,"禁止公网"),_("span",null,"backend-core REST API"),_("span",null,"PostgreSQL database")),_("article",null,_("b",null,"数据库卷"),_("span",null,"named volume unidesk_pgdata_10gb"),_("span",null,"CLI stop/start 不删除数据卷"))))}function kY({activeModule:u,activeTab:l,data:f,session:r,refresh:n,onRaw:i,onNavigate:t}){if(u==="ops"&&l==="status")return _(_Y,{data:f,onRaw:i,onNavigate:t});if(u==="ops"&&l==="performance")return _(GY,{onRaw:i});if(u==="ops"&&l==="events")return _(AY,{events:f.events,onRaw:i});if(u==="ops"&&l==="logs")return _(jY,{logs:f.logs,onRaw:i});if(u==="nodes"&&l==="list")return _(FY,{nodes:f.nodes,onRaw:i});if(u==="nodes"&&l==="monitor")return _(QY,{nodes:f.nodes,systemStatuses:f.systemStatuses,tasks:f.tasks,onRaw:i,refresh:n});if(u==="nodes"&&l==="docker")return _(BY,{nodes:f.nodes,dockerStatuses:f.dockerStatuses,onRaw:i});if(u==="nodes"&&l==="gateway")return _(OY,{nodes:f.nodes,tasks:f.tasks,onRaw:i});if(u==="nodes"&&l==="labels")return _(UY,{nodes:f.nodes});if(u==="nodes"&&l==="heartbeats")return _(JY,{nodes:f.nodes});if(u==="tasks"&&l==="dispatch")return _(DY,{nodes:f.nodes,onDispatched:n,onRaw:i});if(u==="tasks"&&l==="scheduled")return _(xY,{schedules:f.schedules,scheduleRuns:f.scheduleRuns,nodes:f.nodes,refresh:n,onRaw:i});if(u==="tasks"&&l==="pending")return _(SY,{tasks:f.pendingTasks,onRaw:i});if(u==="tasks"&&l==="history")return _(XY,{tasks:f.tasks,onRaw:i});if(u==="tasks"&&l==="results")return _(YY,{tasks:f.tasks,onRaw:i});if(u==="apps"&&l==="catalog")return _(mY,{microservices:f.microservices,onRaw:i,onNavigate:t});if(u==="apps"&&l==="todo-note")return _(GL,{microservices:f.microservices,onRaw:i,apiBaseUrl:Iu.apiBaseUrl});if(u==="apps"&&l==="findjob")return _(FN,{microservices:f.microservices,onRaw:i,apiBaseUrl:Iu.apiBaseUrl});if(u==="apps"&&l==="pipeline")return _(QL,{microservices:f.microservices,onRaw:i,apiBaseUrl:Iu.apiBaseUrl});if(u==="apps"&&l==="met-nonlinear")return _(qN,{microservices:f.microservices,onRaw:i,apiBaseUrl:Iu.apiBaseUrl});if(u==="apps"&&l==="claudeqq")return _(MJ,{microservices:f.microservices,onRaw:i,apiBaseUrl:Iu.apiBaseUrl});if(u==="apps"&&l==="baidu-netdisk")return _(YJ,{microservices:f.microservices,onRaw:i,apiBaseUrl:Iu.apiBaseUrl});if(u==="apps"&&l==="filebrowser")return _(jN,{microservices:f.microservices,onRaw:i,apiBaseUrl:Iu.apiBaseUrl});if(u==="apps"&&l==="oa-event-flow")return _(HN,{microservices:f.microservices,onRaw:i,apiBaseUrl:Iu.apiBaseUrl});if(u==="apps"&&l==="k3sctl")return _(BL,{microservices:f.microservices,onRaw:i,apiBaseUrl:Iu.apiBaseUrl,onNavigate:t});if(u==="apps"&&l==="code-queue")return _(tN,{microservices:f.microservices,onRaw:i,apiBaseUrl:Iu.apiBaseUrl,initialTasksData:vX});if(u==="apps"&&l==="mdtodo")return _(TN,{microservices:f.microservices,onRaw:i,apiBaseUrl:Iu.apiBaseUrl});if(u==="apps"&&l==="project-manager")return _(wL,{microservices:f.microservices,onRaw:i,apiBaseUrl:Iu.apiBaseUrl});if(u==="config"&&l==="topology")return _(hY,{data:f});if(u==="config"&&l==="auth")return _(bY,{session:r});if(u==="config"&&l==="security")return _(vY);return _(Ql,{title:"未找到页面",text:"请选择左侧主模块和顶部子功能标签"})}function IY({session:u,onLogout:l}){let f=B2(pr,window.location.pathname),[r,n]=bu(f.moduleId),[i,t]=bu({...yc,[f.moduleId]:f.tabId}),[y,c]=bu({overview:null,nodes:[],systemStatuses:[],dockerStatuses:[],microservices:[],events:[],tasks:[],pendingTasks:[],schedules:[],scheduleRuns:[],logs:[]}),[$,A]=bu({ok:!1,text:"连接中"}),[j,F]=bu(null),[J,Q]=bu(new Date),[W,L]=bu(null),[U,q]=bu(!1),[N,w]=bu(!1),G=ui.default.useRef(!1),Z=pr.moduleById[r]||pr.modules[0],H=i[r]||yc[r]||Z.tabs[0].id,E=Array.isArray(y.microservices)?y.microservices:[],m=E.length===0&&r==="apps"&&H==="code-queue"?[kX]:E,S=m===E?y:{...y,microservices:m},B=r==="apps"?m.find((d)=>String(d?.id||"")===(H==="k3sctl"?"k3sctl-adapter":H)):null,D=B?lT(B):{},X=Z.tabs.find((d)=>d.id===H)?.label||H,O=B?[{key:"microservice",label:"用户服务",value:`${X} ${D.providerStatus==="online"?"在线":D.providerStatus||"未知"}`,tone:D.providerStatus==="online"?"ok":"warn",testId:"active-microservice-status"}]:[];async function Y(){if(G.current)return;G.current=!0,w(!0);try{let d=[],s=(Fu,zu)=>{d.push([Fu,Eu(zu)])},h=r==="ops"&&H==="status",lu=h||r==="config"&&H==="topology",cu=h||r==="nodes"||r==="tasks"&&(H==="dispatch"||H==="scheduled"),_u=r==="apps"&&H!=="code-queue";if(lu)s("overview",`${Iu.apiBaseUrl}/overview`);if(cu)s("nodes",`${Iu.apiBaseUrl}/nodes`);if(r==="nodes"&&H==="monitor")s("systemStatuses",`${Iu.apiBaseUrl}/nodes/system-status?limit=60`),s("tasks",`${Iu.apiBaseUrl}/tasks?limit=120&summary=1`);else if(r==="nodes"&&H==="docker")s("dockerStatuses",`${Iu.apiBaseUrl}/nodes/docker-status`);else if(r==="nodes"&&H==="gateway")s("tasks",`${Iu.apiBaseUrl}/tasks?limit=300&summary=1`);else if(r==="tasks"&&H==="scheduled")s("schedules",`${Iu.apiBaseUrl}/schedules?limit=100`),s("scheduleRuns",`${Iu.apiBaseUrl}/schedules/runs?limit=100`);else if(r==="tasks"&&H==="pending")s("pendingTasks",`${Iu.apiBaseUrl}/tasks?status=pending&limit=100&summary=1`);else if(r==="tasks"&&(H==="history"||H==="results"))s("tasks",`${Iu.apiBaseUrl}/tasks?limit=300&summary=1`);else if(h)s("tasks",`${Iu.apiBaseUrl}/tasks?limit=8&lite=1`),s("pendingTasks",`${Iu.apiBaseUrl}/tasks?status=pending&limit=20&lite=1`);if(_u)s("microservices",`${Iu.apiBaseUrl}/microservices`);if(r==="ops"&&H==="events")s("events",`${Iu.apiBaseUrl}/events?limit=100`);if(r==="ops"&&H==="logs")s("logs","/logs?limit=100");await Promise.all(d.map(async([Fu,zu])=>{let Wu=await zu,C={};if(Fu==="overview")C.overview=Wu;if(Fu==="nodes")C.nodes=Wu.nodes||[];if(Fu==="systemStatuses")C.systemStatuses=Wu.systemStatuses||[];if(Fu==="dockerStatuses")C.dockerStatuses=Wu.dockerStatuses||[];if(Fu==="microservices")C.microservices=Wu.microservices||[];if(Fu==="events")C.events=Wu.events||[];if(Fu==="tasks")C.tasks=Wu.tasks||[];if(Fu==="pendingTasks")C.pendingTasks=Wu.tasks||[];if(Fu==="schedules")C.schedules=Wu.schedules||[];if(Fu==="scheduleRuns")C.scheduleRuns=Wu.runs||[];if(Fu==="logs")C.logs=Wu.logs||[];c((e)=>({...e,...C}))})),A({ok:!0,text:"核心在线"}),F(new Date)}catch(d){if(A({ok:!1,text:Ou(d,"连接失败")}),d.status===401)l(!1)}finally{G.current=!1,w(!1)}}Tn(()=>{let d=()=>{if(!DL())return;Y()};d();let s=setInterval(d,IX(r,H)),h=()=>{if(DL())d()};return document.addEventListener("visibilitychange",h),()=>{clearInterval(s),document.removeEventListener("visibilitychange",h)}},[r,H]),Tn(()=>{let d=setInterval(()=>Q(new Date),1000);return()=>clearInterval(d)},[]),Tn(()=>{let d=EN(pr,window.location.pathname);if(d&&window.location.pathname!==d)window.history.replaceState(null,"",d)},[]),Tn(()=>{let d=()=>{let s=B2(pr,window.location.pathname);n(s.moduleId),t((h)=>({...h,[s.moduleId]:s.tabId})),L(null)};return window.addEventListener("popstate",d),()=>window.removeEventListener("popstate",d)},[]),Tn(()=>{window.scrollTo({top:0,left:0,behavior:"auto"})},[r,H]);function p(d,s,h="push"){let lu=pr.moduleById[d]?d:pr.fallbackTarget.moduleId,cu=pr.moduleById[lu]?.tabs.some((Fu)=>Fu.id===s)?s:yc[lu]||pr.moduleById[lu]?.tabs[0]?.id||pr.fallbackTarget.tabId;n(lu),t((Fu)=>({...Fu,[lu]:cu}));let _u=w3(pr,lu,cu);if(window.location.pathname!==_u){let Fu=h==="replace"?"replaceState":"pushState";window.history[Fu](null,"",_u)}}function v(d,s){L({title:d,data:s})}let[z,P]=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"},_(yY,{activeModule:r,activeTabs:i,onNavigate:p,collapsed:U,onToggle:()=>q((d)=>!d)}),_("main",{className:"workspace"},_(iY,{connection:$,lastRefresh:j,onRefresh:Y,onLogout:()=>l(!0),session:u,clock:J,activeStatusItems:O,onNotificationToggle:()=>P((d)=>!d),unreadCount:k}),_(cY,{module:Z,activeTab:H,onNavigate:p}),_(T7.Provider,{value:N},_(kY,{activeModule:r,activeTab:H,data:S,session:u,refresh:Y,onRaw:v,onNavigate:p}))),_(rY,{raw:W,onClose:()=>L(null)}),b&&_(mL,{key:b.id,notification:b}),z&&_(VL,{onClose:()=>P(!1)}))}function gY(){let[u,l]=bu(!0),[f,r]=bu(null);async function n(){l(!0);try{let t=await Eu("/api/session");r(t.authenticated?t:null)}catch{r(null)}finally{l(!1)}}async function i(t){if(t)try{await Eu("/logout",{method:"POST"})}catch{}r(null)}if(Tn(()=>{n()},[]),u)return _("main",{className:"loading-screen"},_("div",{className:"brand-mark"},"UD"),_("span",null,"加载会话"));if(!f)return _(nY,{onLogin:r});return _(XJ,null,_(IY,{session:f,onLogout:i}))}var yT=document.getElementById("root");if(yT===null)throw Error("root element not found");hL.createRoot(yT).render(_(gY));})(); diff --git a/src/components/frontend/public/style.css b/src/components/frontend/public/style.css index 532592c6..63564555 100644 --- a/src/components/frontend/public/style.css +++ b/src/components/frontend/public/style.css @@ -2483,6 +2483,25 @@ input:focus, select:focus, textarea:focus { border-color: var(--accent-2); } .codex-submit-queue-select { grid-area: queue-select; } +.codex-workdir-field { + grid-column: 1 / -1; +} +.codex-workdir-row { + display: grid; + grid-template-columns: minmax(0, 1fr) minmax(120px, 0.72fr) auto auto; + gap: 6px; + align-items: center; + min-width: 0; +} +.codex-workdir-row input, +.codex-workdir-row select { + min-width: 0; +} +.codex-workdir-create-btn, +.codex-workdir-delete-btn { + min-height: 32px; + white-space: nowrap; +} .codex-rename-queue-btn, .codex-merge-queue-btn, .codex-create-queue-btn { @@ -5574,6 +5593,9 @@ input:focus, select:focus, textarea:focus { border-color: var(--accent-2); } "merge" "create"; } + .codex-workdir-row { + grid-template-columns: 1fr; + } .codex-rename-queue-btn, .codex-merge-queue-btn, .codex-create-queue-btn { width: 100%; } .codex-session-title-toggle { min-height: 40px; padding: 9px 15px; font-size: 14px; } .codex-attempt-cycle-head { align-items: flex-start; } diff --git a/src/components/frontend/src/code-queue.tsx b/src/components/frontend/src/code-queue.tsx index fdd77029..e20dae5b 100644 --- a/src/components/frontend/src/code-queue.tsx +++ b/src/components/frontend/src/code-queue.tsx @@ -1367,6 +1367,45 @@ function providerDefaultWorkdir(queue: any, providerId: string): string { return id === mainProvider ? String(queue?.defaultWorkdir || "/workspace") : String(queue?.remoteDefaultWorkdir || "/home/ubuntu"); } +function normalizedWorkdirPath(value: any): string { + return String(value || "").trim().replace(/\/+$/u, "") || "/"; +} + +function workdirRecordMatches(record: any, providerId: string, executionMode: string): boolean { + return String(record?.providerId || "") === String(providerId || "") + && String(record?.executionMode || "default") === String(executionMode || "default") + && String(record?.path || "").trim().length > 0; +} + +function workdirOptions(queue: any, records: any[], providerId: string, executionMode: string, cwd: string): any[] { + const byPath = new Map(); + const currentPath = normalizedWorkdirPath(cwd); + const add = (pathValue: any, source: string, record: any = {}) => { + const path = normalizedWorkdirPath(pathValue); + if (path.length === 0 || byPath.has(path)) return; + byPath.set(path, { + providerId, + executionMode, + path, + source, + createdAt: record?.createdAt || "", + updatedAt: record?.updatedAt || "", + }); + }; + add(executionModeDefaultWorkdir(queue, executionMode, providerId), "default"); + for (const record of Array.isArray(records) ? records : []) { + if (workdirRecordMatches(record, providerId, executionMode)) add(record.path, "saved", record); + } + add(cwd, "current"); + return Array.from(byPath.values()).sort((left, right) => { + if (left.path === currentPath) return -1; + if (right.path === currentPath) return 1; + if (left.source === "default" && right.source !== "default") return -1; + if (right.source === "default" && left.source !== "default") return 1; + return left.path.localeCompare(right.path); + }); +} + function taskStepCount(task: any): number | null { return canonicalTaskStepCount(task); } @@ -2042,6 +2081,8 @@ export function CodeQueuePage({ microservices, onRaw, apiBaseUrl = "/api", initi const [copiedTaskId, setCopiedTaskId] = useState(""); const [markingReadTaskId, setMarkingReadTaskId] = useState(""); const [markingAllRead, setMarkingAllRead] = useState(false); + const [workdirData, setWorkdirData] = useState(null); + const [workdirBusy, setWorkdirBusy] = useState(false); const [loadStats, setLoadStats] = useState(initialTasksData ? { phase: "complete", taskId: initialSelectedId, @@ -2104,6 +2145,9 @@ export function CodeQueuePage({ microservices, onRaw, apiBaseUrl = "/api", initi const providerOptions = codexProviderOptions(queue, providerId); const executionModeRows = codexExecutionModeOptions(queue, executionMode); const currentProviderDefaultWorkdir = executionModeDefaultWorkdir(queue, executionMode, providerId); + const savedWorkdirs = Array.isArray(workdirData?.workdirs) ? workdirData.workdirs : []; + const currentWorkdirOptions = workdirOptions(queue, savedWorkdirs, providerId, executionMode, cwd); + const currentWorkdirSaved = currentWorkdirOptions.some((item: any) => item.source === "saved" && normalizedWorkdirPath(item.path) === normalizedWorkdirPath(cwd)); const selectedCanSteer = selectedTask?.id && selectedTask?.activeTurnId && String(selectedTask?.status) === "running"; const selectedCanInterrupt = selectedTask?.id && !["succeeded", "failed", "canceled"].includes(String(selectedTask?.status || "")); const selectedCanRetry = selectedTask?.id && ["succeeded", "failed", "canceled"].includes(String(selectedTask?.status || "")); @@ -2175,6 +2219,8 @@ export function CodeQueuePage({ microservices, onRaw, apiBaseUrl = "/api", initi const next = String(nextProviderId || queue?.mainProviderId || "D601").trim() || "D601"; setProviderId(next); setCwd(executionModeDefaultWorkdir(queue, executionMode, next)); + setWorkdirData(null); + void loadWorkdirs().catch((err) => setError(errorText(err, "加载工作目录失败"))); } function changeSubmitExecutionMode(nextMode: string): void { @@ -2189,6 +2235,8 @@ export function CodeQueuePage({ microservices, onRaw, apiBaseUrl = "/api", initi } setExecutionMode(next); setCwd(executionModeDefaultWorkdir(queue, next, nextProvider)); + setWorkdirData(null); + void loadWorkdirs().catch((err) => setError(errorText(err, "加载工作目录失败"))); } function patchLoadedReadState(taskIds: string[], readAt: string, queuePatch: any = null, taskPatch: any = null): void { @@ -2976,6 +3024,51 @@ export function CodeQueuePage({ microservices, onRaw, apiBaseUrl = "/api", initi } } + async function loadWorkdirs(): Promise { + if (!service) return; + const result = await requestJson(codexApi(apiBaseUrl, "/api/workdirs")); + setWorkdirData(result); + } + + async function createWorkdirPreset(): Promise { + const defaultPath = cwd.trim() || currentProviderDefaultWorkdir || "/workspace"; + const proposed = typeof window === "undefined" ? defaultPath : window.prompt("输入新的工作目录绝对路径", defaultPath); + const path = String(proposed || "").trim(); + if (!path) return; + setWorkdirBusy(true); + await guarded(async () => { + const result = await requestJson(codexApi(apiBaseUrl, "/api/workdirs"), { + method: "POST", + body: { providerId, executionMode, path, ensure: true }, + }); + setWorkdirData((previous: any) => ({ ...(previous || {}), ...result })); + setCwd(String(result?.workdir?.path || path)); + const msg = `已保存工作目录:${String(result?.workdir?.path || path)}`; + setNotice(msg); + addNotification("success", msg); + }, "创建工作目录失败"); + setWorkdirBusy(false); + } + + async function deleteWorkdirPreset(): Promise { + const path = normalizedWorkdirPath(cwd); + if (!currentWorkdirSaved) { + setNotice("当前工作目录还没有保存到下拉菜单。"); + return; + } + const confirmed = typeof window === "undefined" ? true : window.confirm(`从下拉菜单删除工作目录选项?\n${path}\n\n不会删除磁盘上的实际目录。`); + if (!confirmed) return; + setWorkdirBusy(true); + await guarded(async () => { + const result = await requestJson(codexApi(apiBaseUrl, `/api/workdirs/${encodeURIComponent(providerId)}/${encodeURIComponent(executionMode)}/${encodeURIComponent(path)}`), { method: "DELETE" }); + setWorkdirData((previous: any) => ({ ...(previous || {}), ...result })); + const msg = `已从下拉菜单删除工作目录:${path}`; + setNotice(msg); + addNotification("success", msg); + }, "删除工作目录失败"); + setWorkdirBusy(false); + } + async function createQueue(): Promise { const proposed = typeof window === "undefined" ? "" : window.prompt("输入新的 Codex queue ID(字母/数字/._-,最长 64)", "new-lane"); const nextQueueId = String(proposed || "").trim(); @@ -3420,6 +3513,12 @@ export function CodeQueuePage({ microservices, onRaw, apiBaseUrl = "/api", initi void ensureTraceSummary(taskId, true).catch((err) => setError(errorText(err, "自动加载 Trace Summary 失败"))); }, [service?.id, selectedTask?.id, selectedTask?.updatedAt, selectedTask?.traceStats?.statsRevision, selectedTask?._traceSummaryUpdatedAt, selectedTask?._traceSummaryLoaded, selectedDetailLoading]); + useEffect(() => { + if (!service) return undefined; + void loadWorkdirs().catch((err) => setError(errorText(err, "加载工作目录失败"))); + return undefined; + }, [service?.id]); + const taskListContent = sidebarTasks.length === 0 ? h(EmptyState, { title: searchActive ? (searchLoading ? "搜索中" : "没有匹配任务") : "队列为空", text: searchActive ? (searchLoading ? `正在搜索包含“${normalizedSearchQuery}”的 task...` : `未找到包含“${normalizedSearchQuery}”的 task;可换个关键词或切换 queue。`) : "提交一个任务后,Codex 会串行执行并保存输出。", @@ -3659,7 +3758,16 @@ export function CodeQueuePage({ microservices, onRaw, apiBaseUrl = "/api", initi executionModeRows.map((mode: any) => h("option", { key: mode.id, value: mode.id }, `${mode.label || mode.id}${mode.id === "windows-native" ? " · 宿主 Codex" : ""}`)), ), ), - h("label", null, "工作目录", h("input", { value: cwd, disabled: submitting, onChange: (event: any) => setCwd(event.target.value), placeholder: currentProviderDefaultWorkdir || queue?.defaultWorkdir || "/workspace", "data-testid": "codex-cwd-input" })), + h("label", { className: "codex-workdir-field" }, "工作目录", + h("div", { className: "codex-workdir-row" }, + h("input", { value: cwd, disabled: submitting, onChange: (event: any) => setCwd(event.target.value), placeholder: currentProviderDefaultWorkdir || queue?.defaultWorkdir || "/workspace", "data-testid": "codex-cwd-input" }), + h("select", { value: normalizedWorkdirPath(cwd), disabled: submitting || workdirBusy, onChange: (event: any) => setCwd(String(event.target.value || "")), "data-testid": "codex-cwd-select" }, + currentWorkdirOptions.map((item: any) => h("option", { key: `${item.providerId}:${item.executionMode}:${item.path}`, value: item.path }, `${item.path}${item.source === "default" ? " · 默认" : ""}`)), + ), + h("button", { type: "button", className: "ghost-btn codex-workdir-create-btn", disabled: submitting || busy || workdirBusy, onClick: () => void createWorkdirPreset(), "data-testid": "codex-cwd-create-button" }, workdirBusy ? "处理中" : "新建"), + h("button", { type: "button", className: "ghost-btn codex-workdir-delete-btn", disabled: submitting || busy || workdirBusy || !currentWorkdirSaved, onClick: () => void deleteWorkdirPreset(), title: currentWorkdirSaved ? "从工作目录下拉菜单删除这个选项,不删除磁盘目录" : "当前工作目录尚未保存到下拉菜单", "data-testid": "codex-cwd-delete-button" }, "删除"), + ), + ), h("label", null, "最大尝试", h("input", { type: "number", min: 1, max: 99, value: maxAttempts, disabled: submitting, onChange: (event: any) => setMaxAttempts(Number(event.target.value)), "data-testid": "codex-max-attempts-input" })), h("label", null, "入队份数", h("input", { type: "number", min: 1, max: 50, value: repeatCount, disabled: submitting, onChange: (event: any) => setRepeatCount(Number(event.target.value)), "data-testid": "codex-repeat-count-input" })), ), diff --git a/src/components/microservices/code-queue/src/index.ts b/src/components/microservices/code-queue/src/index.ts index 031dcfcf..d7047d18 100644 --- a/src/components/microservices/code-queue/src/index.ts +++ b/src/components/microservices/code-queue/src/index.ts @@ -24,6 +24,7 @@ import type { RunMode, RuntimeConfig, TaskStatus, + WorkdirRecord, } from "./types"; import { codeAgentPortForModel, @@ -168,6 +169,7 @@ const retryBackoffBaseMs = 1000; const retryBackoffMaxMs = 10 * 60 * 1000; const queueIdPattern = /^[A-Za-z0-9][A-Za-z0-9_.-]{0,63}$/u; const queueNameMaxLength = 80; +const workdirMaxLength = 512; const config = readConfig(); const logger = createLogger("code-queue", config.logFile); @@ -210,6 +212,7 @@ let databaseFlushTimer: ReturnType | null = null; let databaseFlushInFlight = false; const dirtyDatabaseTaskIds = new Set(); const dirtyDatabaseQueueIds = new Set(); +const workdirRecords = new Map(); function envString(name: string, fallback: string): string { const value = process.env[name]; @@ -753,6 +756,61 @@ function safeQueueName(value: unknown, queueId: string): string { } } +function normalizeWorkdirPath(value: unknown, providerId: string): string { + const raw = typeof value === "string" ? value.trim() : ""; + if (raw.length === 0) throw new Error("workdir path is required"); + if (raw.length > workdirMaxLength) throw new Error(`workdir path must be ${workdirMaxLength} characters or fewer`); + if (raw.includes("\u0000")) throw new Error("workdir path contains an invalid character"); + return resolveTaskCwd(providerId, raw).replace(/\/+$/u, "") || "/"; +} + +function workdirRecordKey(providerId: string, executionMode: ReturnType, path: string): string { + return `${providerId}\u0000${executionMode}\u0000${path}`; +} + +function sortedWorkdirRecords(): WorkdirRecord[] { + return Array.from(workdirRecords.values()).sort((left, right) => { + const providerDelta = left.providerId.localeCompare(right.providerId); + if (providerDelta !== 0) return providerDelta; + const modeDelta = left.executionMode.localeCompare(right.executionMode); + if (modeDelta !== 0) return modeDelta; + return left.path.localeCompare(right.path); + }); +} + +function rememberWorkdir(providerIdValue: unknown, executionModeValue: unknown, pathValue: unknown, timestamp = nowIso()): WorkdirRecord { + const providerId = normalizeTaskProviderId(providerIdValue); + const executionMode = normalizeCodeExecutionMode(executionModeValue); + const path = normalizeWorkdirPath(pathValue, providerId); + const key = workdirRecordKey(providerId, executionMode, path); + const existing = workdirRecords.get(key); + if (existing !== undefined) { + existing.updatedAt = timestamp; + return existing; + } + const record: WorkdirRecord = { providerId, executionMode, path, createdAt: timestamp, updatedAt: timestamp }; + workdirRecords.set(key, record); + return record; +} + +function ensureDefaultWorkdirRecords(): void { + const timestamp = nowIso(); + for (const provider of executionProviderOptions() as Array>) { + const providerId = normalizeProviderId(provider.id); + if (providerId === null) continue; + rememberWorkdir(providerId, "default", String(provider.defaultWorkdir || defaultWorkdirForProvider(providerId)), timestamp); + if (provider.supportsWindowsNativeCodex === true && typeof provider.windowsNativeDefaultWorkdir === "string" && provider.windowsNativeDefaultWorkdir.length > 0) { + rememberWorkdir(providerId, "windows-native", provider.windowsNativeDefaultWorkdir, timestamp); + } + } +} + +function ensureLocalWorkdir(path: string): { ok: boolean; created: boolean; error: string | null } { + const existed = existsSync(path); + mkdirSync(path, { recursive: true }); + return { ok: true, created: !existed, error: null }; +} + function emptyState(): PersistedState { const at = nowIso(); return { version: 1, updatedAt: at, nextSeq: 1, queues: [{ id: defaultQueueId, name: defaultQueueId, createdAt: at, updatedAt: at }], tasks: [] }; @@ -1211,6 +1269,29 @@ async function upsertQueueToDatabase(client: SqlExecutor, queue: QueueRecord): P `; } +async function upsertWorkdirsToDatabase(records: WorkdirRecord[]): Promise { + if (records.length === 0) return; + for (const record of records) { + await sql` + INSERT INTO unidesk_code_queue_workdirs ( + provider_id, + execution_mode, + path, + created_at, + updated_at + ) VALUES ( + ${record.providerId}, + ${record.executionMode}, + ${record.path}, + ${taskTimestamp(record.createdAt) ?? nowIso()}, + ${taskTimestamp(record.updatedAt) ?? nowIso()} + ) + ON CONFLICT (provider_id, execution_mode, path) DO UPDATE SET + updated_at = EXCLUDED.updated_at + `; + } +} + interface DatabaseTaskRow { id: string; updated_at: Date | string; @@ -1595,6 +1676,16 @@ async function initDatabasePersistence(): Promise { updated_at TIMESTAMPTZ NOT NULL ) `; + await sql` + CREATE TABLE IF NOT EXISTS unidesk_code_queue_workdirs ( + provider_id TEXT NOT NULL, + execution_mode TEXT NOT NULL DEFAULT 'default', + path TEXT NOT NULL, + created_at TIMESTAMPTZ NOT NULL, + updated_at TIMESTAMPTZ NOT NULL, + PRIMARY KEY (provider_id, execution_mode, path) + ) + `; await sql` CREATE TABLE IF NOT EXISTS unidesk_code_queue_notifications ( id TEXT PRIMARY KEY, @@ -1626,6 +1717,7 @@ async function initDatabasePersistence(): Promise { AND (task_json->>'readAt') ~ '^\\d{4}-\\d{2}-\\d{2}T' `; await sql`ALTER TABLE unidesk_code_queue_queues ADD COLUMN IF NOT EXISTS name TEXT NOT NULL DEFAULT ''`; + await sql`ALTER TABLE unidesk_code_queue_workdirs ADD COLUMN IF NOT EXISTS execution_mode TEXT NOT NULL DEFAULT 'default'`; const countRows = await sql>`SELECT COUNT(*) AS count FROM unidesk_code_queue_tasks`; const hotTasks = await loadTasksFromDatabase("hot"); @@ -1665,6 +1757,21 @@ async function initDatabasePersistence(): Promise { } } state.queues.splice(0, state.queues.length, ...Array.from(queueMap.values()).sort((left, right) => left.id.localeCompare(right.id))); + const workdirRows = await sql>` + SELECT provider_id, execution_mode, path, created_at, updated_at + FROM unidesk_code_queue_workdirs + ORDER BY provider_id ASC, execution_mode ASC, path ASC + `; + for (const row of workdirRows) { + rememberWorkdir(row.provider_id, row.execution_mode, row.path, taskTimestamp(String(row.updated_at)) ?? nowIso()); + const record = workdirRecords.get(workdirRecordKey(normalizeTaskProviderId(row.provider_id), normalizeCodeExecutionMode(row.execution_mode), normalizeWorkdirPath(row.path, normalizeTaskProviderId(row.provider_id)))); + if (record !== undefined) { + record.createdAt = taskTimestamp(String(row.created_at)) ?? record.createdAt; + record.updatedAt = taskTimestamp(String(row.updated_at)) ?? record.updatedAt; + } + } + ensureDefaultWorkdirRecords(); + await upsertWorkdirsToDatabase(sortedWorkdirRecords()); databaseReady = true; scheduleStartupDatabaseMaintenance(); runGarbageCollection(); @@ -1902,6 +2009,7 @@ function createTask(request: QueueTaskRequest): QueueTask { const executionMode = normalizeCodeExecutionMode(request.executionMode); const cwd = resolveTaskCwd(providerId, request.cwd); validateExecutionModeForTask(providerId, cwd, model, executionMode); + rememberWorkdir(providerId, executionMode, cwd, at); const queueId = normalizeQueueId(request.queueId); ensureQueue(queueId); return { @@ -2137,6 +2245,7 @@ configureProviderRuntime({ config, safePreview, }); +ensureDefaultWorkdirRecords(); configureTaskOutput({ config, @@ -3318,9 +3427,12 @@ function requestErrorResponse(error: unknown): Response | null { || error.message === "a task cannot reference itself while editing prompt" || error.message === "sourceQueueId is required" || error.message === "source queue must be different from target queue" + || error.message === "workdir path is required" + || error.message === "workdir path contains an invalid character" || error.message.startsWith("referenceTaskIds supports at most ") || error.message.startsWith("queueId must match ") || error.message.startsWith("queue name must be ") + || error.message.startsWith("workdir path must be ") || error.message.startsWith("windows-native executionMode ") )) { return jsonResponse({ ok: false, error: error.message }, 400); @@ -3337,6 +3449,76 @@ function parseLimit(url: URL): number { return Number.isInteger(value) && value > 0 ? Math.min(500, value) : 100; } +function workdirRowsForResponse(providerIdValue: string | null, executionModeValue: string | null): WorkdirRecord[] { + const providerId = normalizeProviderId(providerIdValue) ?? null; + const executionMode = executionModeValue === null ? null : normalizeCodeExecutionMode(executionModeValue); + return sortedWorkdirRecords().filter((record) => { + if (providerId !== null && record.providerId !== providerId) return false; + if (executionMode !== null && record.executionMode !== executionMode) return false; + return true; + }); +} + +async function listWorkdirs(url: URL): Promise { + ensureDefaultWorkdirRecords(); + return jsonResponse({ + ok: true, + workdirs: workdirRowsForResponse(url.searchParams.get("providerId"), url.searchParams.get("executionMode")), + defaultProviderId: config.mainProviderId, + defaultWorkdir: config.defaultWorkdir, + remoteDefaultWorkdir: config.remoteDefaultWorkdir, + windowsNativeCodexDefaultWorkdir: config.windowsNativeCodexDefaultWorkdir, + }); +} + +async function createWorkdir(req: Request): Promise { + const body = await readJson(req); + const record = typeof body === "object" && body !== null && !Array.isArray(body) ? body as Record : {}; + const providerId = normalizeTaskProviderId(record.providerId); + const executionMode = normalizeCodeExecutionMode(record.executionMode); + const path = normalizeWorkdirPath(record.path ?? record.cwd ?? record.workdir, providerId); + validateExecutionModeForTask(providerId, path, config.defaultModel, executionMode); + const previous = workdirRecords.get(workdirRecordKey(providerId, executionMode, path)); + let ensureResult: JsonValue = { ok: false, skipped: true, reason: "remote provider workdirs are created when a task starts" }; + if (providerIsMain(providerId)) { + ensureResult = ensureLocalWorkdir(path) as unknown as JsonValue; + } else if (record.ensure === true || record.createOnProvider === true) { + const command = await runCodeQueueSsh(providerId, `set -euo pipefail\nmkdir -p ${shellQuote(path)}\ntest -d ${shellQuote(path)}\nprintf 'workdir_ready path=%s\\n' ${shellQuote(path)}`, 30_000, "workdir-create"); + ensureResult = { + ok: command.exitCode === 0, + exitCode: command.exitCode, + stdout: safePreview(command.stdout, 800), + stderr: safePreview(command.stderr, 800), + durationMs: command.durationMs, + } as unknown as JsonValue; + if (command.exitCode !== 0) return jsonResponse({ ok: false, error: `failed to create workdir on provider ${providerId}`, ensure: ensureResult }, 502); + } + const workdir = rememberWorkdir(providerId, executionMode, path); + await upsertWorkdirsToDatabase([workdir]); + logger("info", "workdir_saved", { providerId, executionMode, path, existed: previous !== undefined, ensure: ensureResult }); + return jsonResponse({ ok: true, workdir, workdirs: sortedWorkdirRecords(), ensure: ensureResult }, previous === undefined ? 201 : 200); +} + +async function deleteWorkdir(providerIdValue: string, executionModeValue: string, pathValue: string): Promise { + const providerId = normalizeTaskProviderId(providerIdValue); + const executionMode = normalizeCodeExecutionMode(executionModeValue); + const path = normalizeWorkdirPath(pathValue, providerId); + const key = workdirRecordKey(providerId, executionMode, path); + const existing = workdirRecords.get(key) ?? null; + if (existing === null) return jsonResponse({ ok: false, error: "workdir not found" }, 404); + workdirRecords.delete(key); + if (databaseReady) { + await sql` + DELETE FROM unidesk_code_queue_workdirs + WHERE provider_id = ${providerId} + AND execution_mode = ${executionMode} + AND path = ${path} + `; + } + logger("info", "workdir_deleted", { providerId, executionMode, path }); + return jsonResponse({ ok: true, deleted: existing, workdirs: sortedWorkdirRecords() }); +} + async function createTasks(req: Request): Promise { const body = await readJson(req); const batchRecord = typeof body === "object" && body !== null && !Array.isArray(body) ? body as Record : {}; @@ -3358,6 +3540,7 @@ async function createTasks(req: Request): Promise { logger("info", "tasks_enqueued", { count: tasks.length, ids: tasks.map((task) => task.id), queueIds: Array.from(new Set(tasks.map(queueIdOf))), providerIds: Array.from(new Set(tasks.map((task) => task.providerId))), executionModes: Array.from(new Set(tasks.map((task) => task.executionMode))) }); scheduleQueue(); await flushDirtyTasksToDatabase(true); + await upsertWorkdirsToDatabase(sortedWorkdirRecords()); return jsonResponse({ ok: true, tasks: tasks.map((task) => taskForResponse(task)), queue: await queueSummaryForResponse() }, 202); } @@ -3964,6 +4147,16 @@ async function route(req: Request): Promise { const tasks = await loadAllTasksForRead(); return jsonResponse({ ok: true, queues: perQueueSummaries(tasks), queue: queueSummary(false, tasks) }); } + if (url.pathname === "/api/workdirs" && req.method === "GET") return await listWorkdirs(url); + if (url.pathname === "/api/workdirs" && req.method === "POST") return await createWorkdir(req); + const workdirMatch = url.pathname.match(/^\/api\/workdirs\/([^/]+)\/([^/]+)\/(.+)$/u); + if (workdirMatch !== null && req.method === "DELETE") { + return await deleteWorkdir( + decodeURIComponent(workdirMatch[1] ?? ""), + decodeURIComponent(workdirMatch[2] ?? ""), + decodeURIComponent(workdirMatch[3] ?? ""), + ); + } if (url.pathname === "/api/queues" && req.method === "POST") return await createQueue(req); if (url.pathname === "/api/queues/merge" && req.method === "POST") return await mergeQueues(null, req); const queueMergeMatch = url.pathname.match(/^\/api\/queues\/([^/]+)\/merge$/u); diff --git a/src/components/microservices/code-queue/src/types.ts b/src/components/microservices/code-queue/src/types.ts index 922bbb2e..6a1b6410 100644 --- a/src/components/microservices/code-queue/src/types.ts +++ b/src/components/microservices/code-queue/src/types.ts @@ -385,6 +385,14 @@ export interface QueueRecord { updatedAt: string; } +export interface WorkdirRecord { + providerId: string; + executionMode: CodeExecutionMode; + path: string; + createdAt: string; + updatedAt: string; +} + export interface AppServerExit { code: number | null; signal: string | null;