From 6d9cd245538f9bcb4e62a333ce4c1192df7c5da6 Mon Sep 17 00:00:00 2001 From: host Date: Thu, 29 Oct 2026 18:05:00 +0800 Subject: [PATCH] =?UTF-8?q?console:=20=E6=96=B0=E5=BB=BA=E4=BB=BB=E5=8A=A1?= =?UTF-8?q?=E9=80=89=E5=AE=8C=E5=85=A8=E8=AE=BF=E9=97=AE=E4=B8=8D=E5=86=8D?= =?UTF-8?q?=E5=BC=B9=E7=A1=AE=E8=AE=A4=E6=A1=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit DispatchSection 提交时删掉 full 的 window.confirm:下拉里 选 full 本身就是显式选择,提交直接送 approval,不再二次 确认。计划模式与 full 互斥的拦截不动,其它确认框(取消/ 合并/提 PR 等)不动。 构建产物 cloud/console.html 由 npm run build(tsc + vite singlefile)重新生成,产物里已无“确认提交吗”,仅剩下拉 选项本身的“完全访问”文案。 --- .../src/sections/DispatchSection.tsx | 4 +++- cloud/console.html | 18 +++++++++--------- 2 files changed, 12 insertions(+), 10 deletions(-) diff --git a/cloud/console-react/src/sections/DispatchSection.tsx b/cloud/console-react/src/sections/DispatchSection.tsx index 9977084..a30efcc 100644 --- a/cloud/console-react/src/sections/DispatchSection.tsx +++ b/cloud/console-react/src/sections/DispatchSection.tsx @@ -38,7 +38,9 @@ export default function DispatchSection() { if (cm) body.child_model = cm; if (childEffort) body.child_effort = childEffort; if (approval) { - if (approval === "full" && !window.confirm("完全访问 = 自动批准 + 不受工作区限制,agent 可读写工作区外路径。确认提交吗?")) return; + // 选了完全访问也不再弹确认框:下拉里选 full 本身就是 + // 显式选择,提交时直接送 approval;计划模式与 full + // 互斥仍在下面拦截。 body.approval = approval; } if (planMode) { diff --git a/cloud/console.html b/cloud/console.html index fdab1aa..a6e4a7a 100644 --- a/cloud/console.html +++ b/cloud/console.html @@ -20,7 +20,7 @@ * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. - */var Ah;function Ay(){if(Ah)return st;Ah=1;var c=Symbol.for("react.transitional.element"),r=Symbol.for("react.portal"),m=Symbol.for("react.fragment"),o=Symbol.for("react.strict_mode"),_=Symbol.for("react.profiler"),M=Symbol.for("react.consumer"),N=Symbol.for("react.context"),x=Symbol.for("react.forward_ref"),Q=Symbol.for("react.suspense"),U=Symbol.for("react.memo"),G=Symbol.for("react.lazy"),b=Symbol.for("react.activity"),B=Symbol.for("react.view_transition"),lt=Symbol.iterator;function at(y){return y===null||typeof y!="object"?null:(y=lt&&y[lt]||y["@@iterator"],typeof y=="function"?y:null)}var I={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},V=Object.assign,dt={};function Mt(y,R,F){this.props=y,this.context=R,this.refs=dt,this.updater=F||I}Mt.prototype.isReactComponent={},Mt.prototype.setState=function(y,R){if(typeof y!="object"&&typeof y!="function"&&y!=null)throw Error("takes an object of state variables to update or a function which returns an object of state variables.");this.updater.enqueueSetState(this,y,R,"setState")},Mt.prototype.forceUpdate=function(y){this.updater.enqueueForceUpdate(this,y,"forceUpdate")};function Ft(){}Ft.prototype=Mt.prototype;function nt(y,R,F){this.props=y,this.context=R,this.refs=dt,this.updater=F||I}var kt=nt.prototype=new Ft;kt.constructor=nt,V(kt,Mt.prototype),kt.isPureReactComponent=!0;var ee=Array.isArray;function it(){}var yt={H:null,A:null,T:null,S:null},le=Object.prototype.hasOwnProperty;function de(y,R,F){var K=F.ref;return{$$typeof:c,type:y,key:R,ref:K!==void 0?K:null,props:F}}function Kt(y,R){return de(y.type,R,y.props)}function Wt(y){return typeof y=="object"&&y!==null&&y.$$typeof===c}function $t(y){var R={"=":"=0",":":"=2"};return"$"+y.replace(/[=:]/g,function(F){return R[F]})}var tl=/\/+/g;function mt(y,R){return typeof y=="object"&&y!==null&&y.key!=null?$t(""+y.key):R.toString(36)}function Y(y){switch(y.status){case"fulfilled":return y.value;case"rejected":throw y.reason;default:switch(typeof y.status=="string"?y.then(it,it):(y.status="pending",y.then(function(R){y.status==="pending"&&(y.status="fulfilled",y.value=R)},function(R){y.status==="pending"&&(y.status="rejected",y.reason=R)})),y.status){case"fulfilled":return y.value;case"rejected":throw y.reason}}throw y}function C(y,R,F,K,St){var ht=typeof y;(ht==="undefined"||ht==="boolean")&&(y=null);var Et=!1;if(y===null)Et=!0;else switch(ht){case"bigint":case"string":case"number":Et=!0;break;case"object":switch(y.$$typeof){case c:case r:Et=!0;break;case G:return Et=y._init,C(Et(y._payload),R,F,K,St)}}if(Et)return St=St(y),Et=K===""?"."+mt(y,0):K,ee(St)?(F="",Et!=null&&(F=Et.replace(tl,"$&/")+"/"),C(St,R,F,"",function(ge){return ge})):St!=null&&(Wt(St)&&(St=Kt(St,F+(St.key==null||y&&y.key===St.key?"":(""+St.key).replace(tl,"$&/")+"/")+Et)),R.push(St)),1;Et=0;var X=K===""?".":K+":";if(ee(y))for(var ut=0;ut>>1,gt=Y[Tt];if(0<_(gt,C))Y[Tt]=C,Y[et]=gt,et=Tt;else break t}}function m(Y){return Y.length===0?null:Y[0]}function o(Y){if(Y.length===0)return null;var C=Y[0],et=Y.pop();if(et!==C){Y[0]=et;t:for(var Tt=0,gt=Y.length,ce=gt>>>1;Tt_(ze,et))y_(R,ze)?(Y[Tt]=R,Y[y]=et,Tt=y):(Y[Tt]=ze,Y[Me]=et,Tt=Me);else if(y_(R,et))Y[Tt]=R,Y[y]=et,Tt=y;else break t}}return C}function _(Y,C){var et=Y.sortIndex-C.sortIndex;return et!==0?et:Y.id-C.id}if(c.unstable_now=void 0,typeof performance=="object"&&typeof performance.now=="function"){var M=performance;c.unstable_now=function(){return M.now()}}else{var N=Date,x=N.now();c.unstable_now=function(){return N.now()-x}}var Q=[],U=[],G=1,b=null,B=3,lt=!1,at=!1,I=!1,V=!1,dt=typeof setTimeout=="function"?setTimeout:null,Mt=typeof clearTimeout=="function"?clearTimeout:null,Ft=typeof setImmediate<"u"?setImmediate:null;function nt(Y){for(var C=m(U);C!==null;){if(C.callback===null)o(U);else if(C.startTime<=Y)o(U),C.sortIndex=C.expirationTime,r(Q,C);else break;C=m(U)}}function kt(Y){if(I=!1,nt(Y),!at)if(m(Q)!==null)at=!0,ee||(ee=!0,Wt());else{var C=m(U);C!==null&&mt(kt,C.startTime-Y)}}var ee=!1,it=-1,yt=5,le=-1;function de(){return V?!0:!(c.unstable_now()-leY&&de());){var Tt=b.callback;if(typeof Tt=="function"){b.callback=null,B=b.priorityLevel;var gt=Tt(b.expirationTime<=Y);if(Y=c.unstable_now(),typeof gt=="function"){b.callback=gt,nt(Y),C=!0;break e}b===m(Q)&&o(Q),nt(Y)}else o(Q);b=m(Q)}if(b!==null)C=!0;else{var ce=m(U);ce!==null&&mt(kt,ce.startTime-Y),C=!1}}break t}finally{b=null,B=et,lt=!1}C=void 0}}finally{C?Wt():ee=!1}}}var Wt;if(typeof Ft=="function")Wt=function(){Ft(Kt)};else if(typeof MessageChannel<"u"){var $t=new MessageChannel,tl=$t.port2;$t.port1.onmessage=Kt,Wt=function(){tl.postMessage(null)}}else Wt=function(){dt(Kt,0)};function mt(Y,C){it=dt(function(){Y(c.unstable_now())},C)}c.unstable_IdlePriority=5,c.unstable_ImmediatePriority=1,c.unstable_LowPriority=4,c.unstable_NormalPriority=3,c.unstable_Profiling=null,c.unstable_UserBlockingPriority=2,c.unstable_cancelCallback=function(Y){Y.callback=null},c.unstable_forceFrameRate=function(Y){0>Y||125Tt?(Y.sortIndex=et,r(U,Y),m(Q)===null&&Y===m(U)&&(I?(Mt(it),it=-1):I=!0,mt(kt,et-Tt))):(Y.sortIndex=gt,r(Q,Y),at||lt||(at=!0,ee||(ee=!0,Wt()))),Y},c.unstable_shouldYield=de,c.unstable_wrapCallback=function(Y){var C=B;return function(){var et=B;B=C;try{return Y.apply(this,arguments)}finally{B=et}}}})(ur)),ur}var zh;function zy(){return zh||(zh=1,nr.exports=My()),nr.exports}var cr={exports:{}},Ae={};/** + */var Mh;function My(){return Mh||(Mh=1,(function(c){function r(Y,C){var et=Y.length;Y.push(C);t:for(;0>>1,gt=Y[Tt];if(0<_(gt,C))Y[Tt]=C,Y[et]=gt,et=Tt;else break t}}function m(Y){return Y.length===0?null:Y[0]}function o(Y){if(Y.length===0)return null;var C=Y[0],et=Y.pop();if(et!==C){Y[0]=et;t:for(var Tt=0,gt=Y.length,ce=gt>>>1;Tt_(ze,et))y_(R,ze)?(Y[Tt]=R,Y[y]=et,Tt=y):(Y[Tt]=ze,Y[Me]=et,Tt=Me);else if(y_(R,et))Y[Tt]=R,Y[y]=et,Tt=y;else break t}}return C}function _(Y,C){var et=Y.sortIndex-C.sortIndex;return et!==0?et:Y.id-C.id}if(c.unstable_now=void 0,typeof performance=="object"&&typeof performance.now=="function"){var M=performance;c.unstable_now=function(){return M.now()}}else{var N=Date,x=N.now();c.unstable_now=function(){return N.now()-x}}var Q=[],U=[],G=1,b=null,B=3,lt=!1,at=!1,I=!1,V=!1,dt=typeof setTimeout=="function"?setTimeout:null,Mt=typeof clearTimeout=="function"?clearTimeout:null,te=typeof setImmediate<"u"?setImmediate:null;function nt(Y){for(var C=m(U);C!==null;){if(C.callback===null)o(U);else if(C.startTime<=Y)o(U),C.sortIndex=C.expirationTime,r(Q,C);else break;C=m(U)}}function kt(Y){if(I=!1,nt(Y),!at)if(m(Q)!==null)at=!0,ee||(ee=!0,Ft());else{var C=m(U);C!==null&&mt(kt,C.startTime-Y)}}var ee=!1,it=-1,yt=5,le=-1;function de(){return V?!0:!(c.unstable_now()-leY&&de());){var Tt=b.callback;if(typeof Tt=="function"){b.callback=null,B=b.priorityLevel;var gt=Tt(b.expirationTime<=Y);if(Y=c.unstable_now(),typeof gt=="function"){b.callback=gt,nt(Y),C=!0;break e}b===m(Q)&&o(Q),nt(Y)}else o(Q);b=m(Q)}if(b!==null)C=!0;else{var ce=m(U);ce!==null&&mt(kt,ce.startTime-Y),C=!1}}break t}finally{b=null,B=et,lt=!1}C=void 0}}finally{C?Ft():ee=!1}}}var Ft;if(typeof te=="function")Ft=function(){te(Kt)};else if(typeof MessageChannel<"u"){var Wt=new MessageChannel,tl=Wt.port2;Wt.port1.onmessage=Kt,Ft=function(){tl.postMessage(null)}}else Ft=function(){dt(Kt,0)};function mt(Y,C){it=dt(function(){Y(c.unstable_now())},C)}c.unstable_IdlePriority=5,c.unstable_ImmediatePriority=1,c.unstable_LowPriority=4,c.unstable_NormalPriority=3,c.unstable_Profiling=null,c.unstable_UserBlockingPriority=2,c.unstable_cancelCallback=function(Y){Y.callback=null},c.unstable_forceFrameRate=function(Y){0>Y||125Tt?(Y.sortIndex=et,r(U,Y),m(Q)===null&&Y===m(U)&&(I?(Mt(it),it=-1):I=!0,mt(kt,et-Tt))):(Y.sortIndex=gt,r(Q,Y),at||lt||(at=!0,ee||(ee=!0,Ft()))),Y},c.unstable_shouldYield=de,c.unstable_wrapCallback=function(Y){var C=B;return function(){var et=B;B=C;try{return Y.apply(this,arguments)}finally{B=et}}}})(ur)),ur}var zh;function zy(){return zh||(zh=1,nr.exports=My()),nr.exports}var cr={exports:{}},Ae={};/** * @license React * react-dom.production.js * @@ -44,31 +44,31 @@ * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. - */var Uh;function Uy(){if(Uh)return nc;Uh=1;var c=zy(),r=rr(),m=Dy();function o(t){var e="https://react.dev/errors/"+t;if(1Ul||(t.current=Va[Ul],Va[Ul]=null,Ul--)}function zt(t,e){Ul++,Va[Ul]=t.current,t.current=e}var Re=Ze(null),Fl=Ze(null),ae=Ze(null),ha=Ze(null);function _l(t,e){switch(zt(ae,e),zt(Fl,t),zt(Re,null),e.nodeType){case 9:case 11:t=(t=e.documentElement)&&(t=t.namespaceURI)?Hm(t):0;break;default:if(t=e.tagName,e=e.namespaceURI)e=Hm(e),t=Bm(e,t);else switch(t){case"svg":t=1;break;case"math":t=2;break;default:t=0}}Gt(Re),zt(Re,t)}function el(){Gt(Re),Gt(Fl),Gt(ae)}function Le(t){var e=t.memoizedState;e!==null&&(nu._currentValue=e.memoizedState,zt(ha,t)),e=Re.current;var l=Bm(e,t.type);e!==l&&(zt(Fl,t),zt(Re,l))}function ne(t){Fl.current===t&&(Gt(Re),Gt(Fl)),ha.current===t&&(Gt(ha),nu._currentValue=ge)}var qe,ol;function Se(t){if(qe===void 0)try{throw Error()}catch(l){var e=l.stack.trim().match(/\n( *(at )?)/);qe=e&&e[1]||"",ol=-1Ul||(t.current=Va[Ul],Va[Ul]=null,Ul--)}function zt(t,e){Ul++,Va[Ul]=t.current,t.current=e}var Re=Ze(null),Fl=Ze(null),ae=Ze(null),ha=Ze(null);function _l(t,e){switch(zt(ae,e),zt(Fl,t),zt(Re,null),e.nodeType){case 9:case 11:t=(t=e.documentElement)&&(t=t.namespaceURI)?Hm(t):0;break;default:if(t=e.tagName,e=e.namespaceURI)e=Hm(e),t=Bm(e,t);else switch(t){case"svg":t=1;break;case"math":t=2;break;default:t=0}}Gt(Re),zt(Re,t)}function el(){Gt(Re),Gt(Fl),Gt(ae)}function Le(t){var e=t.memoizedState;e!==null&&(nu._currentValue=e.memoizedState,zt(ha,t)),e=Re.current;var l=Bm(e,t.type);e!==l&&(zt(Fl,t),zt(Re,l))}function ne(t){Fl.current===t&&(Gt(Re),Gt(Fl)),ha.current===t&&(Gt(ha),nu._currentValue=ge)}var qe,ol;function Se(t){if(qe===void 0)try{throw Error()}catch(l){var e=l.stack.trim().match(/\n( *(at )?)/);qe=e&&e[1]||"",ol=-1)":-1n||d[a]!==p[n]){var E=` `+d[a].replace(" at new "," at ");return t.displayName&&E.includes("")&&(E=E.replace("",t.displayName)),E}while(1<=a&&0<=n);break}}}finally{Hl=!1,Error.prepareStackTrace=l}return(l=t?t.displayName||t.name:"")?Se(l):""}function Bl(t,e){switch(t.tag){case 26:case 27:case 5:return Se(t.type);case 16:return Se("Lazy");case 13:return t.child!==e&&e!==null?Se("Suspense Fallback"):Se("Suspense");case 19:return Se("SuspenseList");case 0:case 15:return dl(t.type,!1);case 11:return dl(t.type.render,!1);case 1:return dl(t.type,!0);case 31:return Se("Activity");case 30:return Se("ViewTransition");default:return""}}function Ye(t){try{var e="",l=null;do e+=Bl(t,l),l=t,t=t.return;while(t);return e}catch(a){return` Error generating stack: `+a.message+` -`+a.stack}}var Vt=Object.prototype.hasOwnProperty,ll=c.unstable_scheduleCallback,ml=c.unstable_cancelCallback,ql=c.unstable_shouldYield,Za=c.unstable_requestPaint,It=c.unstable_now,Wl=c.unstable_getCurrentPriorityLevel,yn=c.unstable_ImmediatePriority,gn=c.unstable_UserBlockingPriority,Ke=c.unstable_NormalPriority,La=c.unstable_LowPriority,va=c.unstable_IdlePriority,ru=c.log,ou=c.unstable_setDisableYieldValue,$l=null,pe=null;function hl(t){if(typeof ru=="function"&&ou(t),pe&&typeof pe.setStrictMode=="function")try{pe.setStrictMode($l,t)}catch{}}var be=Math.clz32?Math.clz32:Z,H=Math.log,D=Math.LN2;function Z(t){return t>>>=0,t===0?32:31-(H(t)/D|0)|0}var J=256,Ct=262144,Nl=4194304;function De(t){var e=t&42;if(e!==0)return e;switch(t&-t){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:return 64;case 128:return 128;case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:return t&-t;case 262144:case 524288:case 1048576:case 2097152:return t&3932160;case 4194304:case 8388608:case 16777216:case 33554432:return t&62914560;case 67108864:return 67108864;case 134217728:return 134217728;case 268435456:return 268435456;case 536870912:return 536870912;case 1073741824:return 0;default:return t}}function z(t,e,l){var a=t.pendingLanes;if(a===0)return 0;var n=0,u=t.suspendedLanes,i=t.pingedLanes;t=t.warmLanes;var f=a&134217727;return f!==0?(a=f&~u,a!==0?n=De(a):(i&=f,i!==0?n=De(i):l||(l=f&~t,l!==0&&(n=De(l))))):(f=a&~u,f!==0?n=De(f):i!==0?n=De(i):l||(l=a&~t,l!==0&&(n=De(l)))),n===0?0:e!==0&&e!==n&&(e&u)===0&&(u=n&-n,l=e&-e,u>=l||u===32&&(l&4194048)!==0)?e:n}function w(t,e){return(t.pendingLanes&~(t.suspendedLanes&~t.pingedLanes)&e)===0}function W(t,e){(e&8)!==0&&(e|=e&32);var l=t.entangledLanes;if(l!==0)for(t=t.entanglements,l&=e;0l;l++)e.push(t);return e}function Ue(t,e){t.pendingLanes|=e,e!==268435456&&(t.suspendedLanes=0,t.pingedLanes=0,t.warmLanes=0)}function ya(t,e,l,a,n,u){var i=t.pendingLanes;t.pendingLanes=l,t.suspendedLanes=0,t.pingedLanes=0,t.warmLanes=0,t.expiredLanes&=l,t.entangledLanes&=l,t.errorRecoveryDisabledLanes&=l,t.shellSuspendCounter=0;var f=t.entanglements,d=t.expirationTimes,p=t.hiddenUpdates;for(l=i&~l;0"u"||typeof window.document>"u"||typeof window.document.createElement>"u"),qi=!1;if(ea)try{var yu={};Object.defineProperty(yu,"passive",{get:function(){qi=!0}}),window.addEventListener("test",yu,yu),window.removeEventListener("test",yu,yu)}catch{qi=!1}var ga=null,Yi=null,dc=null;function Mr(){if(dc)return dc;var t,e=Yi,l=e.length,a,n="value"in ga?ga.value:ga.textContent,u=n.length;for(t=0;t=pu),Br=" ",qr=!1;function Yr(t,e){switch(t){case"keyup":return Tv.indexOf(e.keyCode)!==-1;case"keydown":return e.keyCode!==229;case"keypress":case"mousedown":case"focusout":return!0;default:return!1}}function wr(t){return t=t.detail,typeof t=="object"&&"data"in t?t.data:null}var Nn=!1;function _v(t,e){switch(t){case"compositionend":return wr(e);case"keypress":return e.which!==32?null:(qr=!0,Br);case"textInput":return t=e.data,t===Br&&qr?null:t;default:return null}}function Nv(t,e){if(Nn)return t==="compositionend"||!ki&&Yr(t,e)?(t=Mr(),dc=Yi=ga=null,Nn=!1,t):null;switch(t){case"paste":return null;case"keypress":if(!(e.ctrlKey||e.altKey||e.metaKey)||e.ctrlKey&&e.altKey){if(e.char&&1"u")return null;try{return t.activeElement||t.body}catch{return t.body}}function Kr(t){for(;t&&t.firstChild;)t=t.firstChild;return t}function Jr(t,e){var l=Kr(t);t=0;for(var a;l;){if(l.nodeType===3){if(a=t+l.textContent.length,t<=e&&a>=e)return{node:l,offset:e-t};t=a}t:{for(;l;){if(l.nextSibling){l=l.nextSibling;break t}l=l.parentNode}l=void 0}l=Kr(l)}}function Fr(t,e){return t&&e?t===e?!0:t&&t.nodeType===3?!1:e&&e.nodeType===3?Fr(t,e.parentNode):"contains"in t?t.contains(e):t.compareDocumentPosition?!!(t.compareDocumentPosition(e)&16):!1:!1}function Wr(t){t=t!=null&&t.ownerDocument!=null&&t.ownerDocument.defaultView!=null?t.ownerDocument.defaultView:window;for(var e=Li(t.document);e instanceof t.HTMLIFrameElement;){try{var l=typeof e.contentWindow.location.href=="string"}catch{l=!1}if(l)t=e.contentWindow;else break;e=Li(t.document)}return e}function Ki(t){var e=t&&t.nodeName&&t.nodeName.toLowerCase();return e&&(e==="input"&&(t.type==="text"||t.type==="search"||t.type==="tel"||t.type==="url"||t.type==="password")||e==="textarea"||t.contentEditable==="true")}var Uv=ea&&"documentMode"in document&&11>=document.documentMode,Cn=null,Ji=null,Tu=null,Fi=!1;function $r(t,e,l){var a=l.window===l?l.document:l.nodeType===9?l:l.ownerDocument;Fi||Cn==null||Cn!==Li(a)||(a=Cn,"selectionStart"in a&&Ki(a)?a={start:a.selectionStart,end:a.selectionEnd}:(a=(a.ownerDocument&&a.ownerDocument.defaultView||window).getSelection(),a={anchorNode:a.anchorNode,anchorOffset:a.anchorOffset,focusNode:a.focusNode,focusOffset:a.focusOffset}),Tu&&xu(Tu,a)||(Tu=a,a=gi(Ji,"onSelect"),0>=i,n-=i,wl=1<<32-be(e)+n|l<ct?(re=P,P=null):re=P.sibling;var _t=g(S,P,j[ct],A);if(_t===null){P===null&&(P=re);break}t&&P&&_t.alternate===null&&e(S,P),h=u(_t,h,ct),xt===null?k=_t:xt.sibling=_t,xt=_t,P=re}if(ct===j.length)return l(S,P),vt&&ua(S,ct),k;if(P===null){for(;ctct?(re=P,P=null):re=P.sibling;var Xa=g(S,P,_t.value,A);if(Xa===null){P===null&&(P=re);break}t&&P&&Xa.alternate===null&&e(S,P),h=u(Xa,h,ct),xt===null?k=Xa:xt.sibling=Xa,xt=Xa,P=re}if(_t.done)return l(S,P),vt&&ua(S,ct),k;if(P===null){for(;!_t.done;ct++,_t=j.next())_t=O(S,_t.value,A),_t!==null&&(h=u(_t,h,ct),xt===null?k=_t:xt.sibling=_t,xt=_t);return vt&&ua(S,ct),k}for(P=a(P);!_t.done;ct++,_t=j.next())_t=T(P,S,ct,_t.value,A),_t!==null&&(t&&(re=_t.alternate,re!==null&&P.delete(re.key===null?ct:re.key)),h=u(_t,h,ct),xt===null?k=_t:xt.sibling=_t,xt=_t);return t&&P.forEach(function(_y){return e(S,_y)}),vt&&ua(S,ct),k}function rt(S,h,j,A){if(typeof j=="object"&&j!==null&&j.type===Kt&&j.key===null&&j.props.ref===void 0&&(j=j.props.children),typeof j=="object"&&j!==null){switch(j.$$typeof){case le:t:{for(var k=j.key;h!==null;){if(h.key===k){if(k=j.type,k===Kt){if(h.tag===7){l(S,h.sibling),A=n(h,j.props.children),Ta(A,j),A.return=S,S=A;break t}}else if(h.elementType===k||typeof k=="object"&&k!==null&&k.$$typeof===gt&&un(k)===h.type){l(S,h.sibling),A=n(h,j.props),Ta(A,j),A.return=S,S=A;break t}l(S,h);break}else e(S,h);h=h.sibling}j.type===Kt?(A=Ia(j.props.children,S.mode,A,j.key),Ta(A,j),A.return=S,S=A):(A=xc(j.type,j.key,j.props,null,S.mode,A),Ta(A,j),A.return=S,S=A)}return i(S);case de:t:{for(k=j.key;h!==null;){if(h.key===k)if(h.tag===4&&h.stateNode.containerInfo===j.containerInfo&&h.stateNode.implementation===j.implementation){l(S,h.sibling),A=n(h,j.children||[]),A.return=S,S=A;break t}else{l(S,h);break}else e(S,h);h=h.sibling}A=ls(j,S.mode,A),A.return=S,S=A}return i(S);case gt:return j=un(j),rt(S,h,j,A)}if(Et(j))return q(S,h,j,A);if(K(j)){if(k=K(j),typeof k!="function")throw Error(o(150));return j=k.call(j),L(S,h,j,A)}if(typeof j.then=="function")return rt(S,h,Rc(j),A);if(j.$$typeof===mt)return rt(S,h,Ac(S,j),A);Dc(S,j)}return typeof j=="string"&&j!==""||typeof j=="number"||typeof j=="bigint"?(j=""+j,h!==null&&h.tag===6?(l(S,h.sibling),A=n(h,j),A.return=S,S=A):(l(S,h),A=es(j,S.mode,A),A.return=S,S=A),i(S)):l(S,h)}return function(S,h,j,A){try{Ou=0;var k=rt(S,h,j,A);return Bn=null,k}catch(P){if(P===Hn||P===Mc)throw P;var xt=Fe(29,P,null,S.mode);return xt.lanes=A,xt.return=S,xt}finally{}}}var sn=xo(!0),To=xo(!1),Ea=!1;function ds(t){t.updateQueue={baseState:t.memoizedState,firstBaseUpdate:null,lastBaseUpdate:null,shared:{pending:null,lanes:0,hiddenCallbacks:null},callbacks:null}}function ms(t,e){t=t.updateQueue,e.updateQueue===t&&(e.updateQueue={baseState:t.baseState,firstBaseUpdate:t.firstBaseUpdate,lastBaseUpdate:t.lastBaseUpdate,shared:t.shared,callbacks:null})}function _a(t){return{lane:t,tag:0,payload:null,callback:null,next:null}}function Na(t,e,l){var a=t.updateQueue;if(a===null)return null;if(a=a.shared,(At&2)!==0){var n=a.pending;return n===null?e.next=e:(e.next=n.next,n.next=e),a.pending=e,e=jc(t),uo(t,null,l),e}return bc(t,a,e,l),jc(t)}function Mu(t,e,l){if(e=e.updateQueue,e!==null&&(e=e.shared,(l&4194048)!==0)){var a=e.lanes;a&=t.pendingLanes,l|=a,e.lanes=l,uc(t,l)}}function hs(t,e){var l=t.updateQueue,a=t.alternate;if(a!==null&&(a=a.updateQueue,l===a)){var n=null,u=null;if(l=l.firstBaseUpdate,l!==null){do{var i={lane:l.lane,tag:l.tag,payload:l.payload,callback:null,next:null};u===null?n=u=i:u=u.next=i,l=l.next}while(l!==null);u===null?n=u=e:u=u.next=e}else n=u=e;l={baseState:a.baseState,firstBaseUpdate:n,lastBaseUpdate:u,shared:a.shared,callbacks:a.callbacks},t.updateQueue=l;return}t=l.lastBaseUpdate,t===null?l.firstBaseUpdate=e:t.next=e,l.lastBaseUpdate=e}var vs=!1;function zu(){if(vs){var t=Un;if(t!==null)throw t}}function Ru(t,e,l,a){vs=!1;var n=t.updateQueue;Ea=!1;var u=n.firstBaseUpdate,i=n.lastBaseUpdate,f=n.shared.pending;if(f!==null){n.shared.pending=null;var d=f,p=d.next;d.next=null,i===null?u=p:i.next=p,i=d;var E=t.alternate;E!==null&&(E=E.updateQueue,f=E.lastBaseUpdate,f!==i&&(f===null?E.firstBaseUpdate=p:f.next=p,E.lastBaseUpdate=d))}if(u!==null){var O=n.baseState;i=0,E=p=d=null,f=u;do{var g=f.lane&-536870913,T=g!==f.lane;if(T?(jt&g)===g:(a&g)===g){g!==0&&g===an&&(vs=!0),E!==null&&(E=E.next={lane:0,tag:f.tag,payload:f.payload,callback:null,next:null});t:{var q=t,L=f;g=e;var rt=l;switch(L.tag){case 1:if(q=L.payload,typeof q=="function"){O=q.call(rt,O,g);break t}O=q;break t;case 3:q.flags=q.flags&-65537|128;case 0:if(q=L.payload,g=typeof q=="function"?q.call(rt,O,g):q,g==null)break t;O=it({},O,g);break t;case 2:Ea=!0}}g=f.callback,g!==null&&(t.flags|=64,T&&(t.flags|=8192),T=n.callbacks,T===null?n.callbacks=[g]:T.push(g))}else T={lane:g,tag:f.tag,payload:f.payload,callback:f.callback,next:null},E===null?(p=E=T,d=O):E=E.next=T,i|=g;if(f=f.next,f===null){if(f=n.shared.pending,f===null)break;T=f,f=T.next,T.next=null,n.lastBaseUpdate=T,n.shared.pending=null}}while(!0);E===null&&(d=O),n.baseState=d,n.firstBaseUpdate=p,n.lastBaseUpdate=E,u===null&&(n.shared.lanes=0),Da|=i,t.lanes=i,t.memoizedState=O}}function Eo(t,e){if(typeof t!="function")throw Error(o(191,t));t.call(e)}function _o(t,e){var l=t.callbacks;if(l!==null)for(t.callbacks=null,t=0;tu?u:8;var i=X.T,f={};f.types=i!==null?i.types:null,X.T=f,Hs(t,!1,e,l);try{var d=n(),p=X.S;if(p!==null&&p(f,d),d!==null&&typeof d=="object"&&typeof d.then=="function"){var E=Zv(d,a);Bu(t,e,E,fl(t))}else Bu(t,e,a,fl(t))}catch(O){Bu(t,e,{then:function(){},status:"rejected",reason:O},fl())}finally{ut.p=u,i!==null&&f.types!==null&&(i.types=f.types),X.T=i}}function $v(){}function Ds(t,e,l,a){if(t.tag!==5)throw Error(o(476));var n=ad(t).queue;ld(t,n,e,ge,l===null?$v:function(){return nd(t),l(a)})}function ad(t){var e=t.memoizedState;if(e!==null)return e;e={memoizedState:ge,baseState:ge,baseQueue:null,queue:{pending:null,lanes:0,dispatch:null,lastRenderedReducer:fa,lastRenderedState:ge},next:null};var l={};return e.next={memoizedState:l,baseState:l,baseQueue:null,queue:{pending:null,lanes:0,dispatch:null,lastRenderedReducer:fa,lastRenderedState:l},next:null},t.memoizedState=e,t=t.alternate,t!==null&&(t.memoizedState=e),e}function nd(t){var e=ad(t);e.next===null&&(e=t.alternate.memoizedState),Bu(t,e.next.queue,{},fl())}function Us(){return Te(nu)}function ud(){return ue().memoizedState}function cd(){return ue().memoizedState}function Iv(t){for(var e=t.return;e!==null;){switch(e.tag){case 24:case 3:var l=fl();t=_a(l);var a=Na(e,t,l);a!==null&&(Pe(a,e,l),Mu(a,e,l)),e={cache:ss()},t.payload=e;return}e=e.return}}function Pv(t,e,l){var a=fl();l={lane:a,revertLane:0,gesture:null,action:l,hasEagerState:!1,eagerState:null,next:null},kc(t)?sd(e,l):(l=Pi(t,e,l,a),l!==null&&(Pe(l,t,a),fd(l,e,a)))}function id(t,e,l){var a=fl();Bu(t,e,l,a)}function Bu(t,e,l,a){var n={lane:a,revertLane:0,gesture:null,action:l,hasEagerState:!1,eagerState:null,next:null};if(kc(t))sd(e,n);else{var u=t.alternate;if(t.lanes===0&&(u===null||u.lanes===0)&&(u=e.lastRenderedReducer,u!==null))try{var i=e.lastRenderedState,f=u(i,l);if(n.hasEagerState=!0,n.eagerState=f,nl(f,i))return bc(t,e,n,0),wt===null&&pc(),!1}catch{}finally{}if(l=Pi(t,e,n,a),l!==null)return Pe(l,t,a),fd(l,e,a),!0}return!1}function Hs(t,e,l,a){if(a={lane:2,revertLane:Nf(),gesture:null,action:a,hasEagerState:!1,eagerState:null,next:null},kc(t)){if(e)throw Error(o(479))}else e=Pi(t,l,a,2),e!==null&&Pe(e,t,2)}function kc(t){var e=t.alternate;return t===ft||e!==null&&e===ft}function sd(t,e){qn=Bc=!0;var l=t.pending;l===null?e.next=e:(e.next=l.next,l.next=e),t.pending=e}function fd(t,e,l){if((l&4194048)!==0){var a=e.lanes;a&=t.pendingLanes,l|=a,e.lanes=l,uc(t,l)}}var Vc={readContext:Te,use:wc,useCallback:Pt,useContext:Pt,useEffect:Pt,useImperativeHandle:Pt,useLayoutEffect:Pt,useInsertionEffect:Pt,useMemo:Pt,useReducer:Pt,useRef:Pt,useState:Pt,useDebugValue:Pt,useDeferredValue:Pt,useTransition:Pt,useSyncExternalStore:Pt,useId:Pt,useHostTransitionStatus:Pt,useFormState:Pt,useActionState:Pt,useOptimistic:Pt,useMemoCache:Pt,useCacheRefresh:Pt,useEffectEvent:Pt},rd={readContext:Te,use:wc,useCallback:function(t,e){return Qe().memoizedState=[t,e===void 0?null:e],t},useContext:Te,useEffect:Ko,useImperativeHandle:function(t,e,l){l=l!=null?l.concat([t]):null,Qc(4194308,4,$o.bind(null,e,t),l)},useLayoutEffect:function(t,e){return Qc(4194308,4,t,e)},useInsertionEffect:function(t,e){Qc(4,2,t,e)},useMemo:function(t,e){var l=Qe();e=e===void 0?null:e;var a=t();if(fn){hl(!0);try{t()}finally{hl(!1)}}return l.memoizedState=[a,e],a},useReducer:function(t,e,l){var a=Qe();if(l!==void 0){var n=l(e);if(fn){hl(!0);try{l(e)}finally{hl(!1)}}}else n=e;return a.memoizedState=a.baseState=n,t={pending:null,lanes:0,dispatch:null,lastRenderedReducer:t,lastRenderedState:n},a.queue=t,t=t.dispatch=Pv.bind(null,ft,t),[a.memoizedState,t]},useRef:function(t){var e=Qe();return t={current:t},e.memoizedState=t},useState:function(t){t=As(t);var e=t.queue,l=id.bind(null,ft,e);return e.dispatch=l,[t.memoizedState,l]},useDebugValue:zs,useDeferredValue:function(t,e){var l=Qe();return Rs(l,t,e)},useTransition:function(){var t=As(!1);return t=ld.bind(null,ft,t.queue,!0,!1),Qe().memoizedState=t,[!1,t]},useSyncExternalStore:function(t,e,l){var a=ft,n=Qe();if(vt){if(l===void 0)throw Error(o(407));l=l()}else{if(l=e(),wt===null)throw Error(o(349));(jt&127)!==0||zo(a,e,l)}n.memoizedState=l;var u={value:l,getSnapshot:e};return n.queue=u,Ko(Do.bind(null,a,u,t),[t]),a.flags|=2048,wn(9,{destroy:void 0},Ro.bind(null,a,u,l,e),null),l},useId:function(){var t=Qe(),e=wt.identifierPrefix;if(vt){var l=Gl,a=wl;l=(a&~(1<<32-be(a)-1)).toString(32)+l,e="_"+e+"R_"+l,l=qc++,0<\/script>",u=u.removeChild(u.firstChild);break;case"select":u=typeof a.is=="string"?i.createElement("select",{is:a.is}):i.createElement("select"),a.multiple?u.multiple=!0:a.size&&(u.size=a.size);break;default:u=typeof a.is=="string"?i.createElement(n,{is:a.is}):i.createElement(n)}}u[xe]=e,u[Je]=a;t:for(i=e.child;i!==null;){if(i.tag===5||i.tag===6)u.appendChild(i.stateNode);else if(i.tag!==4&&i.tag!==27&&i.child!==null){i.child.return=i,i=i.child;continue}if(i===e)break t;for(;i.sibling===null;){if(i.return===null||i.return===e)break t;i=i.return}i.sibling.return=i.return,i=i.sibling}e.stateNode=u;t:switch(Ce(u,n,a),n){case"button":case"input":case"select":case"textarea":a=!!a.autoFocus;break t;case"img":a=!0;break t;default:a=!1}a&&oa(e)}}return Xt(e),e.subtreeFlags&=-33554433,Js(e,e.type,t===null?null:t.memoizedProps,e.pendingProps,l),null;case 6:if(t&&e.stateNode!=null)t.memoizedProps!==a&&oa(e);else{if(typeof a!="string"&&e.stateNode===null)throw Error(o(166));if(t=ae.current,Dn(e)){if(t=e.stateNode,l=e.memoizedProps,a=null,n=he,n!==null)switch(n.tag){case 27:case 5:a=n.memoizedProps}t[xe]=e,t=!!(t.nodeValue===l||a!==null&&a.suppressHydrationWarning===!0||Dm(t.nodeValue,l)),t||ja(e,!0)}else t=Fu(t).createTextNode(a),t[xe]=e,e.stateNode=t}return Xt(e),null;case 31:if(l=e.memoizedState,t===null||t.memoizedState!==null){if(a=Dn(e),l!==null){if(t===null){if(!a)throw Error(o(318));if(t=e.memoizedState,t=t!==null?t.dehydrated:null,!t)throw Error(o(557));t[xe]=e}else Pa(),(e.flags&128)===0&&(e.memoizedState=null),e.flags|=4;Xt(e),t=!1}else l=us(),t!==null&&t.memoizedState!==null&&(t.memoizedState.hydrationErrors=l),t=!0;if(!t)return e.flags&256?(ul(e),e):(ul(e),null);if((e.flags&128)!==0)throw Error(o(558))}return Xt(e),null;case 13:if(a=e.memoizedState,t===null||t.memoizedState!==null&&t.memoizedState.dehydrated!==null){if(n=Dn(e),a!==null&&a.dehydrated!==null){if(t===null){if(!n)throw Error(o(318));if(n=e.memoizedState,n=n!==null?n.dehydrated:null,!n)throw Error(o(317));n[xe]=e}else Pa(),(e.flags&128)===0&&(e.memoizedState=null),e.flags|=4;Xt(e),n=!1}else n=us(),t!==null&&t.memoizedState!==null&&(t.memoizedState.hydrationErrors=n),n=!0;if(!n)return e.flags&256?(ul(e),e):(ul(e),null)}return ul(e),(e.flags&128)!==0?(e.lanes=l,e):(l=a!==null,t=t!==null&&t.memoizedState!==null,l&&(a=e.child,n=null,a.alternate!==null&&a.alternate.memoizedState!==null&&a.alternate.memoizedState.cachePool!==null&&(n=a.alternate.memoizedState.cachePool.pool),u=null,a.memoizedState!==null&&a.memoizedState.cachePool!==null&&(u=a.memoizedState.cachePool.pool),u!==n&&(a.flags|=2048)),l!==t&&l&&(e.child.flags|=8192),Wc(e,e.updateQueue),Xt(e),null);case 4:return el(),t===null&&Mf(e.stateNode.containerInfo),e.flags|=67108864,Xt(e),null;case 10:return ia(e.type),Xt(e),null;case 19:if(ps(e),a=e.memoizedState,a===null)return Xt(e),null;if(n=(e.flags&128)!==0,u=a.rendering,u===null)if(n)Yu(a,!1);else{if(te!==0||t!==null&&(t.flags&128)!==0)for(t=e.child;t!==null;){if(u=Hc(t),u!==null){for(e.flags|=128,Yu(a,!1),t=u.updateQueue,e.updateQueue=t,Wc(e,t),e.subtreeFlags=0,t=l,l=e.child;l!==null;)co(l,t),l=l.sibling;return Du(e,_e.current&1|2),vt&&ua(e,a.treeForkCount),e.child}t=t.sibling}a.tail!==null&&It()>si&&(e.flags|=128,n=!0,Yu(a,!1),e.lanes=4194304)}else{if(!n)if(t=Hc(u),t!==null){if(e.flags|=128,n=!0,t=t.updateQueue,e.updateQueue=t,Wc(e,t),Yu(a,!0),a.tail===null&&a.tailMode!=="collapsed"&&a.tailMode!=="visible"&&!u.alternate&&!vt)return Xt(e),null}else 2*It()-a.renderingStartTime>si&&l!==536870912&&(e.flags|=128,n=!0,Yu(a,!1),e.lanes=4194304);a.isBackwards?(u.sibling=e.child,e.child=u):(t=a.last,t!==null?t.sibling=u:e.child=u,a.last=u)}if(a.tail!==null){t=a.tail;t:{for(l=t;l!==null;){if(l.alternate!==null){l=!1;break t}l=l.sibling}l=!0}return a.rendering=t,a.tail=t.sibling,a.renderingStartTime=It(),t.sibling=null,u=_e.current,u=n?u&1|2:u&1,a.tailMode==="visible"||a.tailMode==="collapsed"||!l||vt?Du(e,u):(l=u,zt(Ee,e),zt(_e,l),Be===null&&(Be=e)),vt&&ua(e,a.treeForkCount),t}return Xt(e),null;case 22:case 23:return ul(e),gs(),a=e.memoizedState!==null,t!==null?t.memoizedState!==null!==a&&(e.flags|=8192):a&&(e.flags|=8192),a?(l&536870912)!==0&&(e.flags&128)===0&&(Xt(e),e.subtreeFlags&6&&(e.flags|=8192)):Xt(e),l=e.updateQueue,l!==null&&Wc(e,l.retryQueue),l=null,t!==null&&t.memoizedState!==null&&t.memoizedState.cachePool!==null&&(l=t.memoizedState.cachePool.pool),a=null,e.memoizedState!==null&&e.memoizedState.cachePool!==null&&(a=e.memoizedState.cachePool.pool),a!==l&&(e.flags|=2048),t!==null&&Gt(nn),null;case 24:return l=null,t!==null&&(l=t.memoizedState.cache),e.memoizedState.cache!==l&&(e.flags|=2048),ia(ie),Xt(e),null;case 25:return null;case 30:return e.flags|=33554432,Xt(e),null}throw Error(o(156,e.tag))}function c0(t,e){switch(as(e),e.tag){case 1:return t=e.flags,t&65536?(e.flags=t&-65537|128,e):null;case 3:return ia(ie),el(),t=e.flags,(t&65536)!==0&&(t&128)===0?(e.flags=t&-65537|128,e):null;case 26:case 27:case 5:return ne(e),null;case 31:if(e.memoizedState!==null){if(ul(e),e.alternate===null)throw Error(o(340));Pa()}return t=e.flags,t&65536?(e.flags=t&-65537|128,e):null;case 13:if(ul(e),t=e.memoizedState,t!==null&&t.dehydrated!==null){if(e.alternate===null)throw Error(o(340));Pa()}return t=e.flags,t&65536?(e.flags=t&-65537|128,e):null;case 19:return ps(e),t=e.flags,t&65536?(e.flags=t&-65537|128,t=e.memoizedState,t!==null&&(t.rendering=null,t.tail=null),e.flags|=4,e):null;case 4:return el(),null;case 10:return ia(e.type),null;case 22:case 23:return ul(e),gs(),t!==null&&Gt(nn),t=e.flags,t&65536?(e.flags=t&-65537|128,e):null;case 24:return ia(ie),null;case 25:return null;default:return null}}function Hd(t,e){switch(as(e),e.tag){case 3:ia(ie),el();break;case 26:case 27:case 5:ne(e);break;case 4:el();break;case 31:e.memoizedState!==null&&ul(e);break;case 13:ul(e);break;case 19:ps(e);break;case 10:ia(e.type);break;case 22:case 23:ul(e),gs(),t!==null&&Gt(nn);break;case 24:ia(ie)}}function wu(t,e){try{var l=e.updateQueue,a=l!==null?l.lastEffect:null;if(a!==null){var n=a.next;l=n;do{if((l.tag&t)===t){a=void 0;var u=l.create,i=l.inst;a=u(),i.destroy=a}l=l.next}while(l!==n)}}catch(f){Ht(e,e.return,f)}}function Ma(t,e,l){try{var a=e.updateQueue,n=a!==null?a.lastEffect:null;if(n!==null){var u=n.next;a=u;do{if((a.tag&t)===t){var i=a.inst,f=i.destroy;if(f!==void 0){i.destroy=void 0,n=e;var d=l,p=f;try{p()}catch(E){Ht(n,d,E)}}}a=a.next}while(a!==u)}}catch(E){Ht(e,e.return,E)}}function Bd(t){var e=t.updateQueue;if(e!==null){var l=t.stateNode;try{_o(e,l)}catch(a){Ht(t,t.return,a)}}}function qd(t,e,l){l.props=rn(t.type,t.memoizedProps),l.state=t.memoizedState;try{l.componentWillUnmount()}catch(a){Ht(t,e,a)}}function Ql(t,e){try{var l=t.ref;if(l!==null){switch(t.tag){case 26:case 27:case 5:var a=t.stateNode;break;case 30:var n=t.stateNode,u=la(t.memoizedProps,n);(n.ref===null||n.ref.name!==u)&&(n.ref=Vm(u)),a=n.ref;break;case 7:if(t.stateNode===null){var i=new rl(t);b(t.child,!1,W0,i,void 0,void 0),t.stateNode=i}a=t.stateNode;break;default:a=t.stateNode}typeof l=="function"?t.refCleanup=l(a):l.current=a}}catch(f){Ht(t,e,f)}}function Ne(t,e){var l=t.ref,a=t.refCleanup;if(l!==null)if(typeof a=="function")try{a()}catch(n){Ht(t,e,n)}finally{t.refCleanup=null,t=t.alternate,t!=null&&(t.refCleanup=null)}else if(typeof l=="function")try{l(null)}catch(n){Ht(t,e,n)}else l.current=null}function $c(t,e){if((t.tag===5||t.tag===27||t.tag===6)&&t.alternate===null&&e!==null)for(var l=0;l title"))),Ce(a,e,l),a[xe]=t,me(a),e=a;break t;case"link":if(u=ih("link","href",n).get(e+(l.href||""))){for(i=0;irt&&(i=rt,rt=L,L=i);var S=Jr(f,L),h=Jr(f,rt);if(S&&h&&(T.rangeCount!==1||T.anchorNode!==S.node||T.anchorOffset!==S.offset||T.focusNode!==h.node||T.focusOffset!==h.offset)){var j=O.createRange();j.setStart(S.node,S.offset),T.removeAllRanges(),L>rt?(T.addRange(j),T.extend(h.node,h.offset)):(j.setEnd(h.node,h.offset),T.addRange(j))}}}}for(O=[],T=f;T=T.parentNode;)T.nodeType===1&&O.push({element:T,left:T.scrollLeft,top:T.scrollTop});for(typeof f.focus=="function"&&f.focus(),f=0;fl?32:l,X.T=null,l=yf,yf=null;var u=zl,i=Kl;if(Jt=0,hn=zl=null,Kl=0,(At&6)!==0)throw Error(o(331));var f=At;if(At|=4,cm(u.current),am(u,u.current,i,l),At=f,Lu(0,!1),pe&&typeof pe.onPostCommitFiberRoot=="function")try{pe.onPostCommitFiberRoot($l,u)}catch{}return!0}finally{ut.p=n,X.T=a,jm(t,e)}}function xm(t,e,l){e=gl(l,e),e=Ys(t.stateNode,e,2),t=Na(t,e,2),t!==null&&(Ue(t,2),Jl(t))}function Ht(t,e,l){if(t.tag===3)xm(t,t,l);else for(;e!==null;){if(e.tag===3){xm(e,t,l);break}else if(e.tag===1){var a=e.stateNode;if(typeof e.type.getDerivedStateFromError=="function"||typeof a.componentDidCatch=="function"&&(Ua===null||!Ua.has(a))){t=gl(l,t),l=Sd(2),a=Na(e,l,2),a!==null&&(pd(l,a,e,t),Ue(a,2),Jl(a));break}}e=e.return}}function Tf(t,e,l){var a=t.pingCache;if(a===null){a=t.pingCache=new r0;var n=new Set;a.set(e,n)}else n=a.get(e),n===void 0&&(n=new Set,a.set(e,n));n.has(l)||(mf=!0,n.add(l),t=S0.bind(null,t,e,l),e.then(t,t))}function S0(t,e,l){var a=t.pingCache;a!==null&&a.delete(e),t.pingedLanes|=t.suspendedLanes&l,t.warmLanes&=~l,wt===t&&(jt&l)===l&&((te===4||te===3&&(jt&62914560)===jt&&300>It()-ii)&&(At&2)===0?Wn(t,0):ci|=l,Zn===jt&&(Zn=0)),Jl(t)}function Tm(t,e){e===0&&(e=Zt()),t=$a(t,e),t!==null&&(Ue(t,e),Jl(t))}function p0(t){var e=t.memoizedState,l=0;e!==null&&(l=e.retryLane),Tm(t,l)}function b0(t,e){var l=0;switch(t.tag){case 31:case 13:var a=t.stateNode,n=t.memoizedState;n!==null&&(l=n.retryLane);break;case 19:a=t.stateNode;break;case 22:a=t.stateNode._retryCache;break;default:throw Error(o(314))}a!==null&&a.delete(e),Tm(t,l)}function j0(t,e){return ll(t,e)}var In=null,Pn=null,Ef=!1,vi=!1,_f=!1,Ba=0;function Jl(t){t!==Pn&&t.next===null&&(Pn===null?In=Pn=t:Pn=Pn.next=t),vi=!0,Ef||(Ef=!0,T0())}function Lu(t,e){if(!_f&&vi){_f=!0;do for(var l=!1,a=In;a!==null;){if(t!==0){var n=a.pendingLanes;if(n===0)var u=0;else{var i=a.suspendedLanes,f=a.pingedLanes;u=(1<<31-be(42|t)+1)-1,u&=n&~(i&~f),u=u&201326741?u&201326741|1:u?u|2:0}u!==0&&(l=!0,Cm(a,u))}else u=jt,u=z(a,a===wt?u:0,a.cancelPendingCommit!==null||a.timeoutHandle!==-1),(u&3)===0||w(a,u)||(l=!0,Cm(a,u));a=a.next}while(l);_f=!1}}function x0(){Em()}function Em(){vi=Ef=!1;var t=0;Ba!==0&&U0()&&(t=Ba);for(var e=It(),l=null,a=In;a!==null;){var n=a.next,u=_m(a,e);u===0?(a.next=null,l===null?In=n:l.next=n,n===null&&(Pn=l)):(l=a,(t!==0||(u&3)!==0)&&(vi=!0)),a=n}Jt!==0&&Jt!==5||Lu(t),Ba!==0&&(Ba=0)}function _m(t,e){for(var l=t.suspendedLanes,a=t.pingedLanes,n=t.expirationTimes,u=t.pendingLanes&-62914561;0f)break;var E=d.transferSize,O=d.initiatorType;E&&Um(O)&&(d=d.responseEnd,i+=E*(dbi){L.length=q;break}j=new Promise(G0.bind(j)),L.push(j)}}}if(0"u"?null:document;function ah(t,e,l){var a=eu;if(a&&typeof e=="string"&&e){var n=vl(e);n='link[rel="'+t+'"][href="'+n+'"]',typeof l=="string"&&(n+='[crossorigin="'+l+'"]'),lh.has(n)||(lh.add(n),t={rel:t,crossOrigin:l,href:e},a.querySelector(n)===null&&(e=a.createElement("link"),Ce(e,"link",t),me(e),a.head.appendChild(e)))}}function uy(t){ma.D(t),ah("dns-prefetch",t,null)}function cy(t,e){ma.C(t,e),ah("preconnect",t,e)}function iy(t,e,l){ma.L(t,e,l);var a=eu;if(a&&t&&e){var n='link[rel="preload"][as="'+vl(e)+'"]';e==="image"&&l&&l.imageSrcSet?(n+='[imagesrcset="'+vl(l.imageSrcSet)+'"]',typeof l.imageSizes=="string"&&(n+='[imagesizes="'+vl(l.imageSizes)+'"]')):n+='[href="'+vl(t)+'"]';var u=n;switch(e){case"style":u=lu(t);break;case"script":u=au(t)}if(!(Tl.has(u)||(t=it({rel:"preload",href:e==="image"&&l&&l.imageSrcSet?void 0:t,as:e},l),Tl.set(u,t),a.querySelector(n)!==null||e==="style"&&a.querySelector($u(u))||e==="script"&&a.querySelector(Iu(u))))){var i=a.createElement("link");Ce(i,"link",t),e==="style"&&(i[ic]=!0,i.onload=i.onerror=function(){vr(i)}),me(i),a.head.appendChild(i)}}}function sy(t,e){ma.m(t,e);var l=eu;if(l&&t){var a=e&&typeof e.as=="string"?e.as:"script",n='link[rel="modulepreload"][as="'+vl(a)+'"][href="'+vl(t)+'"]',u=n;switch(a){case"audioworklet":case"paintworklet":case"serviceworker":case"sharedworker":case"worker":case"script":u=au(t)}if(!Tl.has(u)&&(t=it({rel:"modulepreload",href:t},e),Tl.set(u,t),l.querySelector(n)===null)){switch(a){case"audioworklet":case"paintworklet":case"serviceworker":case"sharedworker":case"worker":case"script":if(l.querySelector(Iu(u)))return}a=l.createElement("link"),Ce(a,"link",t),me(a),l.head.appendChild(a)}}}function fy(t,e,l){ma.S(t,e,l);var a=eu;if(a&&t){var n=bn(a).hoistableStyles,u=lu(t);e=e||"default";var i=n.get(u);if(!i){var f={loading:0,preload:null};if(i=a.querySelector($u(u)))f.loading=5;else{t=it({rel:"stylesheet",href:t,"data-precedence":e},l),(l=Tl.get(u))&&Lf(t,l);var d=i=a.createElement("link");me(d),Ce(d,"link",t),d._p=new Promise(function(p,E){d.onload=p,d.onerror=E}),d.addEventListener("load",function(){f.loading|=1}),d.addEventListener("error",function(){f.loading|=2}),f.loading|=4,Si(i,e,a)}i={type:"stylesheet",instance:i,count:1,state:f},n.set(u,i)}}}function ry(t,e){ma.X(t,e);var l=eu;if(l&&t){var a=bn(l).hoistableScripts,n=au(t),u=a.get(n);u||(u=l.querySelector(Iu(n)),u||(t=it({src:t,async:!0},e),(e=Tl.get(n))&&Kf(t,e),u=l.createElement("script"),me(u),Ce(u,"link",t),l.head.appendChild(u)),u={type:"script",instance:u,count:1,state:null},a.set(n,u))}}function oy(t,e){ma.M(t,e);var l=eu;if(l&&t){var a=bn(l).hoistableScripts,n=au(t),u=a.get(n);u||(u=l.querySelector(Iu(n)),u||(t=it({src:t,async:!0,type:"module"},e),(e=Tl.get(n))&&Kf(t,e),u=l.createElement("script"),me(u),Ce(u,"link",t),l.head.appendChild(u)),u={type:"script",instance:u,count:1,state:null},a.set(n,u))}}function nh(t,e,l,a){var n=(n=ae.current)?Wu(n):null;if(!n)throw Error(o(446));switch(t){case"meta":case"title":return null;case"style":return typeof l.precedence=="string"&&typeof l.href=="string"?(l=lu(l.href),e=bn(n).hoistableStyles,a=e.get(l),a||(a={type:"style",instance:null,count:0,state:null},e.set(l,a)),a):{type:"void",instance:null,count:0,state:null};case"link":if(l.rel==="stylesheet"&&typeof l.href=="string"&&typeof l.precedence=="string"){t=lu(l.href);var u=bn(n).hoistableStyles,i=u.get(t);if(i||(n=n.ownerDocument||n,i={type:"stylesheet",instance:null,count:0,state:{loading:0,preload:null}},u.set(t,i),(u=n.querySelector($u(t)))?u._p||(i.instance=u,i.state.loading=5):(u=Tl.get(t),u||(u={rel:"preload",as:"style",href:l.href,crossOrigin:l.crossOrigin,integrity:l.integrity,media:l.media,hrefLang:l.hrefLang,referrerPolicy:l.referrerPolicy},Tl.set(t,u)),dy(n,t,u,i.state))),e&&a===null)throw Error(o(528,""));return i}if(e&&a!==null)throw Error(o(529,""));return null;case"script":return e=l.async,l=l.src,typeof l=="string"&&e&&typeof e!="function"&&typeof e!="symbol"?(l=au(l),e=bn(n).hoistableScripts,a=e.get(l),a||(a={type:"script",instance:null,count:0,state:null},e.set(l,a)),a):{type:"void",instance:null,count:0,state:null};default:throw Error(o(444,t))}}function lu(t){return'href="'+vl(t)+'"'}function $u(t){return'link[rel="stylesheet"]['+t+"]"}function uh(t){return it({},t,{"data-precedence":t.precedence,precedence:null})}function dy(t,e,l,a){if(e=t.querySelector('link[rel="preload"][as="style"]['+e+"]")){if(e[ic]!==!0){a.loading=1;return}}else e=t.createElement("link"),e[ic]=!0,e.onload=e.onerror=vr.bind(null,e),Ce(e,"link",l),me(e),t.head.appendChild(e);a.preload=e,e.addEventListener("load",function(){return a.loading|=1}),e.addEventListener("error",function(){return a.loading|=2})}function au(t){return'[src="'+vl(t)+'"]'}function Iu(t){return"script[async]"+t}function ch(t,e,l){if(e.count++,e.instance===null)switch(e.type){case"style":var a=t.querySelector('style[data-href~="'+vl(l.href)+'"]');if(a)return e.instance=a,me(a),a;var n=it({},l,{"data-href":l.href,"data-precedence":l.precedence,href:null,precedence:null});return a=(t.ownerDocument||t).createElement("style"),me(a),Ce(a,"style",n),Si(a,l.precedence,t),e.instance=a;case"stylesheet":n=lu(l.href);var u=t.querySelector($u(n));if(u)return e.state.loading|=4,e.instance=u,me(u),u;a=uh(l),(n=Tl.get(n))&&Lf(a,n),u=(t.ownerDocument||t).createElement("link"),me(u);var i=u;return i._p=new Promise(function(f,d){i.onload=f,i.onerror=d}),Ce(u,"link",a),e.state.loading|=4,Si(u,l.precedence,t),e.instance=u;case"script":return u=au(l.src),(n=t.querySelector(Iu(u)))?(e.instance=n,me(n),n):(a=l,(n=Tl.get(u))&&(a=it({},l),Kf(a,n)),t=t.ownerDocument||t,n=t.createElement("script"),me(n),Ce(n,"link",a),t.head.appendChild(n),e.instance=n);case"void":return null;default:throw Error(o(443,e.type))}else e.type==="stylesheet"&&(e.state.loading&4)===0&&(a=e.instance,e.state.loading|=4,Si(a,l.precedence,t));return e.instance}function Si(t,e,l){for(var a=l.querySelectorAll('link[rel="stylesheet"][data-precedence],style[data-precedence]'),n=a.length?a[a.length-1]:null,u=n,i=0;i title"):null)}function my(t,e,l){if(l===1||e.itemProp!=null)return!1;switch(t){case"meta":case"title":return!0;case"style":if(typeof e.precedence!="string"||typeof e.href!="string"||e.href==="")break;return!0;case"link":if(typeof e.rel!="string"||typeof e.href!="string"||e.href===""||e.onLoad||e.onError)break;switch(e.rel){case"stylesheet":return t=e.disabled,typeof e.precedence=="string"&&t==null;default:return!0}case"script":if(e.async&&typeof e.async!="function"&&typeof e.async!="symbol"&&!e.onLoad&&!e.onError&&e.src&&typeof e.src=="string")return!0}return!1}function sh(t,e){return t==="img"&&e.src!=null&&e.src!==""&&e.onLoad==null&&e.loading!=="lazy"}function fh(t){return!(t.type==="stylesheet"&&(t.state.loading&3)===0)}function rh(t){return(t.width||100)*(t.height||100)*(typeof devicePixelRatio=="number"?devicePixelRatio:1)*.25}function oh(t,e){typeof e.decode=="function"&&(t.imgCount++,e.complete||(t.imgBytes+=rh(e),t.suspenseyImages.push(e)),t=yy.bind(t),e.decode().then(t,t))}function hy(t,e,l,a){if(l.type==="stylesheet"&&(typeof a.media!="string"||matchMedia(a.media).matches!==!1)&&(l.state.loading&4)===0){if(l.instance===null){var n=lu(a.href),u=e.querySelector($u(n));if(u){e=u._p,e!==null&&typeof e=="object"&&typeof e.then=="function"&&(t.count++,t=Pu.bind(t),e.then(t,t)),l.state.loading|=4,l.instance=u,me(u);return}u=e.ownerDocument||e,a=uh(a),(n=Tl.get(n))&&Lf(a,n),u=u.createElement("link"),me(u);var i=u;i._p=new Promise(function(f,d){i.onload=f,i.onerror=d}),Ce(u,"link",a),l.instance=u}t.stylesheets===null&&(t.stylesheets=new Map),t.stylesheets.set(l,e),(e=l.state.preload)&&(l.state.loading&3)===0&&(t.count++,l=Pu.bind(t),e.addEventListener("load",l),e.addEventListener("error",l))}}var bi=0;function vy(t,e){return t.stylesheets&&t.count===0&&xi(t,t.stylesheets),0bi?50:800)+e);return t.unsuspend=l,function(){t.unsuspend=null,clearTimeout(a),clearTimeout(n)}}:null}function dh(t){if(t.count===0&&(t.imgCount===0||!t.waitingForImages)){if(t.stylesheets)xi(t,t.stylesheets);else if(t.unsuspend){var e=t.unsuspend;t.unsuspend=null,e()}}}function Pu(){this.count--,dh(this)}function yy(){this.imgCount--,dh(this)}var ji=null;function xi(t,e){t.stylesheets=null,t.unsuspend!==null&&(t.count++,ji=new Map,e.forEach(gy,t),ji=null,Pu.call(t))}function gy(t,e){if(!(e.state.loading&4)){var l=ji.get(t);if(l)var a=l.get(null);else{l=new Map,ji.set(t,l);for(var n=t.querySelectorAll("link[data-precedence],style[data-precedence]"),u=0;u"u"||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!="function"))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(c)}catch(r){console.error(r)}}return c(),ar.exports=Uy(),ar.exports}var By=Hy();const qy=qh(By),Yh=v.createContext(null);function Ot(){const c=v.useContext(Yh);if(!c)throw new Error("ConsoleContext missing");return c}const ot=encodeURIComponent,$={health:"/health",relayModels:"/relay/models",quotaMe:"/users/me/quota",userKeys:"/users/me/keys",userKey:c=>"/users/me/keys/"+ot(c),githubRepos:"/github/repos",projects:"/projects",project:c=>"/projects/"+ot(c),projectMembers:c=>"/projects/"+ot(c)+"/members",projectMember:(c,r)=>"/projects/"+ot(c)+"/members/"+ot(r),projectSkills:c=>"/projects/"+ot(c)+"/skills",projectApps:c=>"/projects/"+ot(c)+"/apps",projectMcp:c=>"/projects/"+ot(c)+"/mcp-servers",projectMcpReload:c=>"/projects/"+ot(c)+"/mcp-servers/reload",projectMcpOauth:(c,r)=>"/projects/"+ot(c)+"/mcp-servers/"+ot(r)+"/oauth-login",projectAutomations:c=>"/projects/"+ot(c)+"/automations",projectAutomationCancel:(c,r)=>"/projects/"+ot(c)+"/automations/"+ot(r)+"/cancel",projectTriage:c=>"/projects/"+ot(c)+"/triage",workers:"/workers",environments:c=>"/environments?project_id="+ot(c),environmentsCreate:"/environments",environmentArchive:c=>"/environments/"+ot(c)+"/archive",tasks:c=>"/tasks?project_id="+ot(c),tasksByParent:(c,r)=>"/tasks?project_id="+ot(c)+"&parent_task_id="+ot(r),tasksCreate:"/tasks",task:c=>"/tasks/"+ot(c),taskAction:(c,r)=>"/tasks/"+ot(c)+"/"+r,taskFork:c=>"/tasks/"+ot(c)+"/fork",taskContinue:c=>"/tasks/"+ot(c)+"/continue",taskTrace:c=>"/tasks/"+ot(c)+"/trace",taskTraceStream:c=>"/tasks/"+ot(c)+"/trace/stream",taskAgents:c=>"/tasks/"+ot(c)+"/agents",taskReviews:c=>"/tasks/"+ot(c)+"/reviews",taskReviewFindings:(c,r)=>"/tasks/"+ot(c)+"/reviews/"+ot(r)+"/findings",taskApprovals:c=>"/tasks/"+ot(c)+"/approvals",taskApprovalDecision:(c,r,m)=>"/tasks/"+ot(c)+"/approvals/"+ot(r)+"/"+m,taskFollowups:c=>"/tasks/"+ot(c)+"/followups",taskChatHistory:c=>"/tasks/"+ot(c)+"/chat-history",taskMessages:c=>"/tasks/"+ot(c)+"/messages",taskMessagesTo:c=>"/tasks/"+ot(c)+"/messages",taskThread:c=>"/tasks/"+ot(c)+"/thread",taskThreads:c=>"/tasks/"+ot(c)+"/threads",taskThreadAction:(c,r)=>"/tasks/"+ot(c)+"/thread/"+r,taskCost:c=>"/tasks/"+ot(c)+"/cost",uploads:"/uploads",adminQuotas:"/admin/quotas",adminQuotaUser:c=>"/admin/quotas?user_id="+ot(c),adminSweep:"/admin/sweep",adminBackup:"/admin/backup"},Yy={exec:"命令",file:"文件",call:"调用",tool:"工具",message:"消息",reasoning:"思考",plan:"计划","agent-start":"子代理","agent-done":"子代理"},su=["completed","failed","interrupted","merged","merge-failed"],wy={queued:"排队中,尚未被 worker 认领",running:"运行中,模型回合进行中",completed:"模型回合结束、改动在 worktree 里尚未合并",failed:"模型回合失败,可重试",interrupted:"已被取消/中断,可重试",merged:"控制面已标记 merged,不代表 git 主分支已合入","merge-failed":"合并落盘失败,可重试"},Bh=["low","medium","high","xhigh","max"],Gy=["viewer","contributor","maintainer","owner"],or="codex-console-key";function El(){try{return localStorage.getItem(or)||""}catch{return""}}function Qy(c){localStorage.setItem(or,c)}function Xy(){localStorage.removeItem(or)}function Oe(c){return c?c.slice(0,8):""}function ka(c){return c?new Date(c*1e3).toLocaleString():""}async function tt(c,r="GET",m){const o={"Content-Type":"application/json"},_=El();_&&(o["X-API-Key"]=_);const M={method:r,headers:o};m!==void 0&&(M.body=JSON.stringify(m));const N=await fetch(c,M);let x=null;try{x=await N.json()}catch{x=null}if(!N.ok){const Q=x;let U=Q&&Q.error?Q.error:"HTTP "+N.status;throw N.status===401&&(U+="(key 未填或无效)"),N.status===429&&(U+="(触发限流,稍后再试)"),N.status===402&&(Q&&Q.unpriced_token_cap!==void 0?U+="(无价 token 已满,联系管理员调整)":Q&&Q.error==="coordinator_quota_reserve_exceeded"?U="协调员分工预留不足:剩余美元配额不够覆盖全部分工,子任务费用记父任务创建人账,整个父任务已被挡下(未建任何子任务)":U+="(美元配额已满,联系管理员调整)"),new Error(U)}return x}async function ky(c){const r=new FormData;r.append("paths",JSON.stringify(c.map(_=>_.path))),c.forEach((_,M)=>r.append("file"+M,_.file));const m=await fetch($.uploads,{method:"POST",headers:{"X-API-Key":El()},body:r}),o=await m.json().catch(()=>({}));if(!m.ok)throw new Error(o&&o.error||"HTTP "+m.status);return o.upload_id}function Vy(c,r,m){const o=[],_={},M=(N,x)=>{if(N)for(let Q=0;QN.name),M(r,N=>N.webkitRelativePath||N.name),M(m,N=>N.name),o}function wh(c){const r=Date.now()/1e3;let m=null;if(typeof c.last_seen=="number"?m=r-c.last_seen:typeof c.last_seen_seconds_ago=="number"&&(m=c.last_seen_seconds_ago),(m===null||m<0)&&(m=null),m===null)return{text:"未知",age:null};const o=Math.floor(m);return o<60?{text:o+" 秒前",age:m}:o<3600?{text:Math.floor(o/60)+" 分钟前",age:m}:{text:Math.floor(o/3600)+" 小时前",age:m}}function Oi(c){const r=c.message||"";return r.includes("forbidden")?"没有权限:只有项目 owner 或全局管理员可以管理成员":r.includes("already_member")?"该用户已是成员,改角色请用成员行的下拉框":r.includes("cannot demote the only owner")?"不能把唯一 owner 降为非 owner:请先把另一位成员升为 owner":r.includes("user not found")?"找不到该用户:请核对 user_id 或用户名是否正确":r.includes("member not found")?"该用户不是本项目成员":r.includes("unknown role")?"角色无效:只能是 viewer / contributor / maintainer / owner":r.includes("project not found")?"项目不存在(可能已被删除)":"成员操作失败:"+r}function ir(c){const r=c.message||"";return r.includes("forbidden")?"无全局管理员权限:服务端返回 403(CODEX_GLOBAL_ADMINS 未包含当前用户),请联系管理员":r.includes("user not found")?"找不到该用户:请核对用户 id 是否正确":"管理操作失败:"+r}function sr(c){return c==null?"不限额":"$"+(c/1e6).toFixed(2)}function fr(c){const r=Yy[c.kind||""]||c.kind||"?";let m="";return c.kind==="exec"?m=(c.command||"")+"(exit="+(c.exitCode??"")+","+(c.durationMs??"")+"ms,cwd="+(c.cwd||"")+")":c.kind==="file"?m=(c.path||"")+" "+(c.change||"")+" "+(c.status||""):c.kind==="message"?m=(c.phase?"["+c.phase+"] ":"")+(c.text||""):c.kind==="reasoning"?m=c.summary||"":c.kind==="tool"?m=(c.server||"")+"/"+(c.tool||"")+" "+(c.status||""):c.kind==="call"?m=c.name||"":c.kind==="plan"?m=c.text||"":c.kind==="agent-start"?m="开始:"+(c.name||"")+(c.prompt?"("+c.prompt+")":""):c.kind==="agent-done"?m="结束:"+(c.name||"")+" "+(c.status||""):m=JSON.stringify(c).slice(0,300),"["+r+"] "+m}function Zy(){const[c,r]=v.useState(!!El()),[m,o]=v.useState(El()?"已保存到本浏览器(只用于调本站 API)":"未填 key,数据接口会返回 401"),[_,M]=v.useState("未加载"),[N,x]=v.useState("未加载"),[Q,U]=v.useState("填 key 后判断权限…"),[G,b]=v.useState(!1),[B,lt]=v.useState(""),[at,I]=v.useState(""),[V,dt]=v.useState([]),[Mt,Ft]=v.useState(""),[nt,kt]=v.useState(""),[ee,it]=v.useState([]),[yt,le]=v.useState(null),[de,Kt]=v.useState("未加载"),[Wt,$t]=v.useState(""),[tl,mt]=v.useState([]),[Y,C]=v.useState(""),[et,Tt]=v.useState(""),[gt,ce]=v.useState([]),[Me,ze]=v.useState([]),[y,R]=v.useState([]),[F,K]=v.useState("先选项目"),[St,ht]=v.useState(""),[Et,X]=v.useState(""),[ut,ge]=v.useState(""),[Va,Ul]=v.useState(""),[Ze,Gt]=v.useState([]),[zt,Re]=v.useState(""),[Fl,ae]=v.useState(""),[ha,_l]=v.useState(""),[el,Le]=v.useState(!1),[ne,qe]=v.useState(""),[ol,Se]=v.useState(""),[Hl,dl]=v.useState([]),[Bl,Ye]=v.useState(!1),Vt=v.useRef("");Vt.current=Mt;const ll=v.useRef("");ll.current=ol;const ml=v.useCallback(async()=>{try{const z=await tt($.health);x("backend="+z.backend+" db_ok="+z.db_ok+" worker_ok="+z.worker_ok+" commit="+String(z.commit||"").slice(0,7))}catch(z){x("加载失败:"+z.message)}},[]),ql=v.useCallback(async()=>{if(!El()){M("未填 key,配额不显示");return}try{const z=await tt($.quotaMe),w=((z.used_usd_micros||0)/1e6).toFixed(2),W=z.quota_usd_micros===null||z.quota_usd_micros===void 0?"美元:本月用量 $"+w+"(不限额)":"美元:本月用量 $"+w+" / $"+((z.quota_usd_micros||0)/1e6).toFixed(2)+"(剩余 $"+((z.remaining_usd_micros||0)/1e6).toFixed(2)+")",qt=z.unpriced_token_cap===void 0||z.unpriced_tokens_used===void 0?"无价 token:未返回(旧服务端)":"无价 token:"+z.unpriced_tokens_used+" / "+z.unpriced_token_cap+" tokens";M(W+" | "+qt)}catch(z){M("配额加载失败:"+z.message)}},[]),Za=v.useCallback(async()=>{if(!El()){U("未填 key,管理区不可用"),b(!1);return}try{const z=await fetch($.adminQuotas,{headers:{"X-API-Key":El()}});z.status===400?(U("已确认为全局管理员,管理操作可用"),b(!0)):z.status===403?(U("管理区仅全局管理员可用:当前 key 无全局管理员权限(服务端返回 403)"),b(!1)):z.status===401?(U("key 无效,管理区不可用(服务端返回 401)"),b(!1)):(U("管理权限判断失败(HTTP "+z.status+"),管理操作暂不可用"),b(!1))}catch(z){U("管理权限判断失败:"+z.message),b(!1)}},[]),It=v.useCallback(async()=>{try{const w=(await tt($.projects)).projects||[];dt(w),kt(w.length+" 个项目"),Vt.current&&w.some(W=>W.id===Vt.current)}catch(z){kt("加载失败:"+z.message)}},[]),Wl=v.useCallback(async()=>{try{const z=await tt($.githubRepos);it(z.repos||[])}catch{}},[]),yn=v.useCallback(async()=>{try{const z=await tt($.relayModels);dl(z.models||[]),Ye(!1)}catch{Ye(!0)}},[]),gn=v.useCallback(async()=>{try{const z=await tt($.workers);if(!Array.isArray(z)&&z.workers===void 0&&z.workers_total!==void 0){le(null),Kt(z.workers_total?"在线 "+z.workers_online+" / 离线 "+z.workers_offline+"(共 "+z.workers_total+";完整 worker 清单仅全局管理员可见)":"无 worker 注册"),$t("");return}const w=Array.isArray(z)?z:z.workers||[];le(w),Kt(w.length?"":"无 worker 注册"),$t("")}catch(z){$t("加载失败:"+z.message)}},[]),Ke=v.useCallback(async z=>{const w=z!==void 0?z:Vt.current,W=ll.current;if(!w){Gt([]),Re(""),Se("");return}try{const Zt=(await tt($.environments(w))).environments||[];Gt(Zt),Re(Zt.length+" 个环境"),(W&&Zt.some(Ue=>Ue.id===W&&Ue.status==="ready")||W&&Zt.some(Ue=>Ue.id===W))&&Se(W);const je=V.find(Ue=>Ue.id===w);je&&je.repo_url?(_l("仓库:"+je.repo_url),Le(!1)):je?(_l("该项目未绑定仓库,环境无法创建——先选一个仓库保存"),Le(!0)):(_l(""),Le(!1))}catch(qt){ae("加载失败:"+qt.message)}},[V]),La=v.useCallback(async z=>{const w=z!==void 0?z:Vt.current;if(!w){mt([]);return}try{const W=await tt($.projectMembers(w));mt(W.members||[]),Tt("")}catch(W){Tt("成员加载失败:"+Oi(W))}},[]),va=v.useCallback(async z=>{const w=z!==void 0?z:Vt.current;if(!w){ce([]),ze([]),R([]),K("先选项目");return}K("");try{const W=await tt($.projectSkills(w));ce(W.skills||[])}catch(W){ht("技能加载失败:"+W.message)}try{const W=await tt($.projectApps(w));ze(W.apps||[])}catch(W){ht("应用加载失败:"+W.message)}try{const W=await tt($.projectMcp(w));R(W.servers||W.mcp_servers||[])}catch(W){ht("MCP 服务加载失败:"+W.message)}},[]),ru=v.useCallback(z=>{if(!z.trim()){o("key 为空,未保存");return}Qy(z.trim()),r(!0),o("已保存到本浏览器(只用于调本站 API)")},[]),ou=v.useCallback(()=>{Xy(),r(!1),o("未填 key,数据接口会返回 401"),Za()},[Za]),$l=v.useCallback(async(z,w)=>{if(!z.trim()){kt("项目名必填");return}const W={name:z.trim()};w.trim()&&(W.repo_url=w.trim());try{await tt($.projects,"POST",W),kt("项目已建"),await It()}catch(qt){kt("新建失败:"+qt.message)}},[It]),pe=v.useCallback(async(z,w,W)=>{const qt=Vt.current;if(!qt){ae("先选项目");return}if(!z.trim()){ae("环境名必填");return}const Zt={project_id:qt,name:z.trim()};w.trim()&&(Zt.branch=w.trim()),W&&(Zt.executor=W);try{await tt($.environmentsCreate,"POST",Zt),ae("环境已建,worker 准备中(creating → ready,失败会在列表里写原因)"),await Ke(qt)}catch(je){ae("新建失败:"+je.message)}},[Ke]),hl=v.useCallback(async z=>{if(window.confirm("确定归档该环境吗?归档后新任务不能再选它,进行中的任务不受影响(有进行中任务在用它时归档会被拒绝)。"))try{await tt($.environmentArchive(z),"POST",{}),await Ke()}catch(w){ae("归档失败:"+w.message)}},[Ke]),be=v.useCallback(async z=>{const w=Vt.current;if(!w){qe("先选项目");return}if(!z){qe("先选一个仓库");return}try{await tt($.project(w),"PATCH",{repo_url:z}),qe("仓库已保存,现在可以建环境了"),await It(),await Ke(w)}catch(W){qe("保存失败:"+W.message)}},[It,Ke]),H=v.useCallback(async(z,w)=>{const W=Vt.current;if(!W){C("先选项目");return}if(!z.trim()){C("请填成员 user_id 或用户名");return}try{await tt($.projectMembers(W),"POST",{user_id:z.trim(),role:w})}catch(qt){if(qt.message.includes("user not found"))try{await tt($.projectMembers(W),"POST",{username:z.trim(),role:w})}catch(Zt){C(Oi(Zt));return}else{C(Oi(qt));return}}C("已邀请成员"),await La(W)},[La]),D=v.useCallback(async(z,w)=>{const W=Vt.current;if(W)try{await tt($.projectMember(W,z),"PATCH",{role:w}),mt(qt=>qt.map(Zt=>Zt.user_id===z?{...Zt,role:w}:Zt)),C("角色已改为 "+w)}catch(qt){C(Oi(qt))}},[]),Z=v.useCallback(async()=>{const z=Vt.current;if(!z){X("先选项目");return}try{await tt($.projectMcpReload(z),"POST",{}),X("配置已重载"),await va(z)}catch(w){X("重载失败:"+w.message)}},[va]),J=v.useCallback(async z=>{const w=Vt.current;if(!w){ge("先选项目");return}if(!z.trim()){ge("服务名不能为空");return}try{const W=await tt($.projectMcpOauth(w,z.trim()),"POST",{}),qt=W.url||W.auth_url||W.login_url||W.authorization_url||"",Zt=W.steps||W.instructions||"";let je=`登录尚未完成:请在浏览器打开下面的链接或按步骤完成,完成后回到本页刷新 MCP 状态。 +`+a.stack}}var Vt=Object.prototype.hasOwnProperty,ll=c.unstable_scheduleCallback,ml=c.unstable_cancelCallback,ql=c.unstable_shouldYield,Za=c.unstable_requestPaint,$t=c.unstable_now,Wl=c.unstable_getCurrentPriorityLevel,yn=c.unstable_ImmediatePriority,gn=c.unstable_UserBlockingPriority,Ke=c.unstable_NormalPriority,La=c.unstable_LowPriority,va=c.unstable_IdlePriority,ru=c.log,ou=c.unstable_setDisableYieldValue,$l=null,pe=null;function hl(t){if(typeof ru=="function"&&ou(t),pe&&typeof pe.setStrictMode=="function")try{pe.setStrictMode($l,t)}catch{}}var be=Math.clz32?Math.clz32:Z,H=Math.log,D=Math.LN2;function Z(t){return t>>>=0,t===0?32:31-(H(t)/D|0)|0}var J=256,Ct=262144,Nl=4194304;function De(t){var e=t&42;if(e!==0)return e;switch(t&-t){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:return 64;case 128:return 128;case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:return t&-t;case 262144:case 524288:case 1048576:case 2097152:return t&3932160;case 4194304:case 8388608:case 16777216:case 33554432:return t&62914560;case 67108864:return 67108864;case 134217728:return 134217728;case 268435456:return 268435456;case 536870912:return 536870912;case 1073741824:return 0;default:return t}}function z(t,e,l){var a=t.pendingLanes;if(a===0)return 0;var n=0,u=t.suspendedLanes,i=t.pingedLanes;t=t.warmLanes;var f=a&134217727;return f!==0?(a=f&~u,a!==0?n=De(a):(i&=f,i!==0?n=De(i):l||(l=f&~t,l!==0&&(n=De(l))))):(f=a&~u,f!==0?n=De(f):i!==0?n=De(i):l||(l=a&~t,l!==0&&(n=De(l)))),n===0?0:e!==0&&e!==n&&(e&u)===0&&(u=n&-n,l=e&-e,u>=l||u===32&&(l&4194048)!==0)?e:n}function w(t,e){return(t.pendingLanes&~(t.suspendedLanes&~t.pingedLanes)&e)===0}function W(t,e){(e&8)!==0&&(e|=e&32);var l=t.entangledLanes;if(l!==0)for(t=t.entanglements,l&=e;0l;l++)e.push(t);return e}function Ue(t,e){t.pendingLanes|=e,e!==268435456&&(t.suspendedLanes=0,t.pingedLanes=0,t.warmLanes=0)}function ya(t,e,l,a,n,u){var i=t.pendingLanes;t.pendingLanes=l,t.suspendedLanes=0,t.pingedLanes=0,t.warmLanes=0,t.expiredLanes&=l,t.entangledLanes&=l,t.errorRecoveryDisabledLanes&=l,t.shellSuspendCounter=0;var f=t.entanglements,d=t.expirationTimes,p=t.hiddenUpdates;for(l=i&~l;0"u"||typeof window.document>"u"||typeof window.document.createElement>"u"),qi=!1;if(ea)try{var yu={};Object.defineProperty(yu,"passive",{get:function(){qi=!0}}),window.addEventListener("test",yu,yu),window.removeEventListener("test",yu,yu)}catch{qi=!1}var ga=null,Yi=null,dc=null;function Mr(){if(dc)return dc;var t,e=Yi,l=e.length,a,n="value"in ga?ga.value:ga.textContent,u=n.length;for(t=0;t=pu),Br=" ",qr=!1;function Yr(t,e){switch(t){case"keyup":return Tv.indexOf(e.keyCode)!==-1;case"keydown":return e.keyCode!==229;case"keypress":case"mousedown":case"focusout":return!0;default:return!1}}function wr(t){return t=t.detail,typeof t=="object"&&"data"in t?t.data:null}var Nn=!1;function _v(t,e){switch(t){case"compositionend":return wr(e);case"keypress":return e.which!==32?null:(qr=!0,Br);case"textInput":return t=e.data,t===Br&&qr?null:t;default:return null}}function Nv(t,e){if(Nn)return t==="compositionend"||!ki&&Yr(t,e)?(t=Mr(),dc=Yi=ga=null,Nn=!1,t):null;switch(t){case"paste":return null;case"keypress":if(!(e.ctrlKey||e.altKey||e.metaKey)||e.ctrlKey&&e.altKey){if(e.char&&1"u")return null;try{return t.activeElement||t.body}catch{return t.body}}function Kr(t){for(;t&&t.firstChild;)t=t.firstChild;return t}function Jr(t,e){var l=Kr(t);t=0;for(var a;l;){if(l.nodeType===3){if(a=t+l.textContent.length,t<=e&&a>=e)return{node:l,offset:e-t};t=a}t:{for(;l;){if(l.nextSibling){l=l.nextSibling;break t}l=l.parentNode}l=void 0}l=Kr(l)}}function Fr(t,e){return t&&e?t===e?!0:t&&t.nodeType===3?!1:e&&e.nodeType===3?Fr(t,e.parentNode):"contains"in t?t.contains(e):t.compareDocumentPosition?!!(t.compareDocumentPosition(e)&16):!1:!1}function Wr(t){t=t!=null&&t.ownerDocument!=null&&t.ownerDocument.defaultView!=null?t.ownerDocument.defaultView:window;for(var e=Li(t.document);e instanceof t.HTMLIFrameElement;){try{var l=typeof e.contentWindow.location.href=="string"}catch{l=!1}if(l)t=e.contentWindow;else break;e=Li(t.document)}return e}function Ki(t){var e=t&&t.nodeName&&t.nodeName.toLowerCase();return e&&(e==="input"&&(t.type==="text"||t.type==="search"||t.type==="tel"||t.type==="url"||t.type==="password")||e==="textarea"||t.contentEditable==="true")}var Uv=ea&&"documentMode"in document&&11>=document.documentMode,Cn=null,Ji=null,Tu=null,Fi=!1;function $r(t,e,l){var a=l.window===l?l.document:l.nodeType===9?l:l.ownerDocument;Fi||Cn==null||Cn!==Li(a)||(a=Cn,"selectionStart"in a&&Ki(a)?a={start:a.selectionStart,end:a.selectionEnd}:(a=(a.ownerDocument&&a.ownerDocument.defaultView||window).getSelection(),a={anchorNode:a.anchorNode,anchorOffset:a.anchorOffset,focusNode:a.focusNode,focusOffset:a.focusOffset}),Tu&&xu(Tu,a)||(Tu=a,a=gi(Ji,"onSelect"),0>=i,n-=i,wl=1<<32-be(e)+n|l<ct?(re=P,P=null):re=P.sibling;var _t=g(S,P,j[ct],A);if(_t===null){P===null&&(P=re);break}t&&P&&_t.alternate===null&&e(S,P),h=u(_t,h,ct),xt===null?k=_t:xt.sibling=_t,xt=_t,P=re}if(ct===j.length)return l(S,P),vt&&ua(S,ct),k;if(P===null){for(;ctct?(re=P,P=null):re=P.sibling;var Xa=g(S,P,_t.value,A);if(Xa===null){P===null&&(P=re);break}t&&P&&Xa.alternate===null&&e(S,P),h=u(Xa,h,ct),xt===null?k=Xa:xt.sibling=Xa,xt=Xa,P=re}if(_t.done)return l(S,P),vt&&ua(S,ct),k;if(P===null){for(;!_t.done;ct++,_t=j.next())_t=O(S,_t.value,A),_t!==null&&(h=u(_t,h,ct),xt===null?k=_t:xt.sibling=_t,xt=_t);return vt&&ua(S,ct),k}for(P=a(P);!_t.done;ct++,_t=j.next())_t=T(P,S,ct,_t.value,A),_t!==null&&(t&&(re=_t.alternate,re!==null&&P.delete(re.key===null?ct:re.key)),h=u(_t,h,ct),xt===null?k=_t:xt.sibling=_t,xt=_t);return t&&P.forEach(function(_y){return e(S,_y)}),vt&&ua(S,ct),k}function rt(S,h,j,A){if(typeof j=="object"&&j!==null&&j.type===Kt&&j.key===null&&j.props.ref===void 0&&(j=j.props.children),typeof j=="object"&&j!==null){switch(j.$$typeof){case le:t:{for(var k=j.key;h!==null;){if(h.key===k){if(k=j.type,k===Kt){if(h.tag===7){l(S,h.sibling),A=n(h,j.props.children),Ta(A,j),A.return=S,S=A;break t}}else if(h.elementType===k||typeof k=="object"&&k!==null&&k.$$typeof===gt&&un(k)===h.type){l(S,h.sibling),A=n(h,j.props),Ta(A,j),A.return=S,S=A;break t}l(S,h);break}else e(S,h);h=h.sibling}j.type===Kt?(A=Ia(j.props.children,S.mode,A,j.key),Ta(A,j),A.return=S,S=A):(A=xc(j.type,j.key,j.props,null,S.mode,A),Ta(A,j),A.return=S,S=A)}return i(S);case de:t:{for(k=j.key;h!==null;){if(h.key===k)if(h.tag===4&&h.stateNode.containerInfo===j.containerInfo&&h.stateNode.implementation===j.implementation){l(S,h.sibling),A=n(h,j.children||[]),A.return=S,S=A;break t}else{l(S,h);break}else e(S,h);h=h.sibling}A=ls(j,S.mode,A),A.return=S,S=A}return i(S);case gt:return j=un(j),rt(S,h,j,A)}if(Et(j))return q(S,h,j,A);if(K(j)){if(k=K(j),typeof k!="function")throw Error(o(150));return j=k.call(j),L(S,h,j,A)}if(typeof j.then=="function")return rt(S,h,Rc(j),A);if(j.$$typeof===mt)return rt(S,h,Ac(S,j),A);Dc(S,j)}return typeof j=="string"&&j!==""||typeof j=="number"||typeof j=="bigint"?(j=""+j,h!==null&&h.tag===6?(l(S,h.sibling),A=n(h,j),A.return=S,S=A):(l(S,h),A=es(j,S.mode,A),A.return=S,S=A),i(S)):l(S,h)}return function(S,h,j,A){try{Ou=0;var k=rt(S,h,j,A);return Bn=null,k}catch(P){if(P===Hn||P===Mc)throw P;var xt=Fe(29,P,null,S.mode);return xt.lanes=A,xt.return=S,xt}finally{}}}var sn=xo(!0),To=xo(!1),Ea=!1;function ds(t){t.updateQueue={baseState:t.memoizedState,firstBaseUpdate:null,lastBaseUpdate:null,shared:{pending:null,lanes:0,hiddenCallbacks:null},callbacks:null}}function ms(t,e){t=t.updateQueue,e.updateQueue===t&&(e.updateQueue={baseState:t.baseState,firstBaseUpdate:t.firstBaseUpdate,lastBaseUpdate:t.lastBaseUpdate,shared:t.shared,callbacks:null})}function _a(t){return{lane:t,tag:0,payload:null,callback:null,next:null}}function Na(t,e,l){var a=t.updateQueue;if(a===null)return null;if(a=a.shared,(At&2)!==0){var n=a.pending;return n===null?e.next=e:(e.next=n.next,n.next=e),a.pending=e,e=jc(t),uo(t,null,l),e}return bc(t,a,e,l),jc(t)}function Mu(t,e,l){if(e=e.updateQueue,e!==null&&(e=e.shared,(l&4194048)!==0)){var a=e.lanes;a&=t.pendingLanes,l|=a,e.lanes=l,uc(t,l)}}function hs(t,e){var l=t.updateQueue,a=t.alternate;if(a!==null&&(a=a.updateQueue,l===a)){var n=null,u=null;if(l=l.firstBaseUpdate,l!==null){do{var i={lane:l.lane,tag:l.tag,payload:l.payload,callback:null,next:null};u===null?n=u=i:u=u.next=i,l=l.next}while(l!==null);u===null?n=u=e:u=u.next=e}else n=u=e;l={baseState:a.baseState,firstBaseUpdate:n,lastBaseUpdate:u,shared:a.shared,callbacks:a.callbacks},t.updateQueue=l;return}t=l.lastBaseUpdate,t===null?l.firstBaseUpdate=e:t.next=e,l.lastBaseUpdate=e}var vs=!1;function zu(){if(vs){var t=Un;if(t!==null)throw t}}function Ru(t,e,l,a){vs=!1;var n=t.updateQueue;Ea=!1;var u=n.firstBaseUpdate,i=n.lastBaseUpdate,f=n.shared.pending;if(f!==null){n.shared.pending=null;var d=f,p=d.next;d.next=null,i===null?u=p:i.next=p,i=d;var E=t.alternate;E!==null&&(E=E.updateQueue,f=E.lastBaseUpdate,f!==i&&(f===null?E.firstBaseUpdate=p:f.next=p,E.lastBaseUpdate=d))}if(u!==null){var O=n.baseState;i=0,E=p=d=null,f=u;do{var g=f.lane&-536870913,T=g!==f.lane;if(T?(jt&g)===g:(a&g)===g){g!==0&&g===an&&(vs=!0),E!==null&&(E=E.next={lane:0,tag:f.tag,payload:f.payload,callback:null,next:null});t:{var q=t,L=f;g=e;var rt=l;switch(L.tag){case 1:if(q=L.payload,typeof q=="function"){O=q.call(rt,O,g);break t}O=q;break t;case 3:q.flags=q.flags&-65537|128;case 0:if(q=L.payload,g=typeof q=="function"?q.call(rt,O,g):q,g==null)break t;O=it({},O,g);break t;case 2:Ea=!0}}g=f.callback,g!==null&&(t.flags|=64,T&&(t.flags|=8192),T=n.callbacks,T===null?n.callbacks=[g]:T.push(g))}else T={lane:g,tag:f.tag,payload:f.payload,callback:f.callback,next:null},E===null?(p=E=T,d=O):E=E.next=T,i|=g;if(f=f.next,f===null){if(f=n.shared.pending,f===null)break;T=f,f=T.next,T.next=null,n.lastBaseUpdate=T,n.shared.pending=null}}while(!0);E===null&&(d=O),n.baseState=d,n.firstBaseUpdate=p,n.lastBaseUpdate=E,u===null&&(n.shared.lanes=0),Da|=i,t.lanes=i,t.memoizedState=O}}function Eo(t,e){if(typeof t!="function")throw Error(o(191,t));t.call(e)}function _o(t,e){var l=t.callbacks;if(l!==null)for(t.callbacks=null,t=0;tu?u:8;var i=X.T,f={};f.types=i!==null?i.types:null,X.T=f,Hs(t,!1,e,l);try{var d=n(),p=X.S;if(p!==null&&p(f,d),d!==null&&typeof d=="object"&&typeof d.then=="function"){var E=Zv(d,a);Bu(t,e,E,fl(t))}else Bu(t,e,a,fl(t))}catch(O){Bu(t,e,{then:function(){},status:"rejected",reason:O},fl())}finally{ut.p=u,i!==null&&f.types!==null&&(i.types=f.types),X.T=i}}function $v(){}function Ds(t,e,l,a){if(t.tag!==5)throw Error(o(476));var n=ad(t).queue;ld(t,n,e,ge,l===null?$v:function(){return nd(t),l(a)})}function ad(t){var e=t.memoizedState;if(e!==null)return e;e={memoizedState:ge,baseState:ge,baseQueue:null,queue:{pending:null,lanes:0,dispatch:null,lastRenderedReducer:fa,lastRenderedState:ge},next:null};var l={};return e.next={memoizedState:l,baseState:l,baseQueue:null,queue:{pending:null,lanes:0,dispatch:null,lastRenderedReducer:fa,lastRenderedState:l},next:null},t.memoizedState=e,t=t.alternate,t!==null&&(t.memoizedState=e),e}function nd(t){var e=ad(t);e.next===null&&(e=t.alternate.memoizedState),Bu(t,e.next.queue,{},fl())}function Us(){return Te(nu)}function ud(){return ue().memoizedState}function cd(){return ue().memoizedState}function Iv(t){for(var e=t.return;e!==null;){switch(e.tag){case 24:case 3:var l=fl();t=_a(l);var a=Na(e,t,l);a!==null&&(Pe(a,e,l),Mu(a,e,l)),e={cache:ss()},t.payload=e;return}e=e.return}}function Pv(t,e,l){var a=fl();l={lane:a,revertLane:0,gesture:null,action:l,hasEagerState:!1,eagerState:null,next:null},kc(t)?sd(e,l):(l=Pi(t,e,l,a),l!==null&&(Pe(l,t,a),fd(l,e,a)))}function id(t,e,l){var a=fl();Bu(t,e,l,a)}function Bu(t,e,l,a){var n={lane:a,revertLane:0,gesture:null,action:l,hasEagerState:!1,eagerState:null,next:null};if(kc(t))sd(e,n);else{var u=t.alternate;if(t.lanes===0&&(u===null||u.lanes===0)&&(u=e.lastRenderedReducer,u!==null))try{var i=e.lastRenderedState,f=u(i,l);if(n.hasEagerState=!0,n.eagerState=f,nl(f,i))return bc(t,e,n,0),wt===null&&pc(),!1}catch{}finally{}if(l=Pi(t,e,n,a),l!==null)return Pe(l,t,a),fd(l,e,a),!0}return!1}function Hs(t,e,l,a){if(a={lane:2,revertLane:Nf(),gesture:null,action:a,hasEagerState:!1,eagerState:null,next:null},kc(t)){if(e)throw Error(o(479))}else e=Pi(t,l,a,2),e!==null&&Pe(e,t,2)}function kc(t){var e=t.alternate;return t===ft||e!==null&&e===ft}function sd(t,e){qn=Bc=!0;var l=t.pending;l===null?e.next=e:(e.next=l.next,l.next=e),t.pending=e}function fd(t,e,l){if((l&4194048)!==0){var a=e.lanes;a&=t.pendingLanes,l|=a,e.lanes=l,uc(t,l)}}var Vc={readContext:Te,use:wc,useCallback:It,useContext:It,useEffect:It,useImperativeHandle:It,useLayoutEffect:It,useInsertionEffect:It,useMemo:It,useReducer:It,useRef:It,useState:It,useDebugValue:It,useDeferredValue:It,useTransition:It,useSyncExternalStore:It,useId:It,useHostTransitionStatus:It,useFormState:It,useActionState:It,useOptimistic:It,useMemoCache:It,useCacheRefresh:It,useEffectEvent:It},rd={readContext:Te,use:wc,useCallback:function(t,e){return Qe().memoizedState=[t,e===void 0?null:e],t},useContext:Te,useEffect:Ko,useImperativeHandle:function(t,e,l){l=l!=null?l.concat([t]):null,Qc(4194308,4,$o.bind(null,e,t),l)},useLayoutEffect:function(t,e){return Qc(4194308,4,t,e)},useInsertionEffect:function(t,e){Qc(4,2,t,e)},useMemo:function(t,e){var l=Qe();e=e===void 0?null:e;var a=t();if(fn){hl(!0);try{t()}finally{hl(!1)}}return l.memoizedState=[a,e],a},useReducer:function(t,e,l){var a=Qe();if(l!==void 0){var n=l(e);if(fn){hl(!0);try{l(e)}finally{hl(!1)}}}else n=e;return a.memoizedState=a.baseState=n,t={pending:null,lanes:0,dispatch:null,lastRenderedReducer:t,lastRenderedState:n},a.queue=t,t=t.dispatch=Pv.bind(null,ft,t),[a.memoizedState,t]},useRef:function(t){var e=Qe();return t={current:t},e.memoizedState=t},useState:function(t){t=As(t);var e=t.queue,l=id.bind(null,ft,e);return e.dispatch=l,[t.memoizedState,l]},useDebugValue:zs,useDeferredValue:function(t,e){var l=Qe();return Rs(l,t,e)},useTransition:function(){var t=As(!1);return t=ld.bind(null,ft,t.queue,!0,!1),Qe().memoizedState=t,[!1,t]},useSyncExternalStore:function(t,e,l){var a=ft,n=Qe();if(vt){if(l===void 0)throw Error(o(407));l=l()}else{if(l=e(),wt===null)throw Error(o(349));(jt&127)!==0||zo(a,e,l)}n.memoizedState=l;var u={value:l,getSnapshot:e};return n.queue=u,Ko(Do.bind(null,a,u,t),[t]),a.flags|=2048,wn(9,{destroy:void 0},Ro.bind(null,a,u,l,e),null),l},useId:function(){var t=Qe(),e=wt.identifierPrefix;if(vt){var l=Gl,a=wl;l=(a&~(1<<32-be(a)-1)).toString(32)+l,e="_"+e+"R_"+l,l=qc++,0<\/script>",u=u.removeChild(u.firstChild);break;case"select":u=typeof a.is=="string"?i.createElement("select",{is:a.is}):i.createElement("select"),a.multiple?u.multiple=!0:a.size&&(u.size=a.size);break;default:u=typeof a.is=="string"?i.createElement(n,{is:a.is}):i.createElement(n)}}u[xe]=e,u[Je]=a;t:for(i=e.child;i!==null;){if(i.tag===5||i.tag===6)u.appendChild(i.stateNode);else if(i.tag!==4&&i.tag!==27&&i.child!==null){i.child.return=i,i=i.child;continue}if(i===e)break t;for(;i.sibling===null;){if(i.return===null||i.return===e)break t;i=i.return}i.sibling.return=i.return,i=i.sibling}e.stateNode=u;t:switch(Ce(u,n,a),n){case"button":case"input":case"select":case"textarea":a=!!a.autoFocus;break t;case"img":a=!0;break t;default:a=!1}a&&oa(e)}}return Xt(e),e.subtreeFlags&=-33554433,Js(e,e.type,t===null?null:t.memoizedProps,e.pendingProps,l),null;case 6:if(t&&e.stateNode!=null)t.memoizedProps!==a&&oa(e);else{if(typeof a!="string"&&e.stateNode===null)throw Error(o(166));if(t=ae.current,Dn(e)){if(t=e.stateNode,l=e.memoizedProps,a=null,n=he,n!==null)switch(n.tag){case 27:case 5:a=n.memoizedProps}t[xe]=e,t=!!(t.nodeValue===l||a!==null&&a.suppressHydrationWarning===!0||Dm(t.nodeValue,l)),t||ja(e,!0)}else t=Fu(t).createTextNode(a),t[xe]=e,e.stateNode=t}return Xt(e),null;case 31:if(l=e.memoizedState,t===null||t.memoizedState!==null){if(a=Dn(e),l!==null){if(t===null){if(!a)throw Error(o(318));if(t=e.memoizedState,t=t!==null?t.dehydrated:null,!t)throw Error(o(557));t[xe]=e}else Pa(),(e.flags&128)===0&&(e.memoizedState=null),e.flags|=4;Xt(e),t=!1}else l=us(),t!==null&&t.memoizedState!==null&&(t.memoizedState.hydrationErrors=l),t=!0;if(!t)return e.flags&256?(ul(e),e):(ul(e),null);if((e.flags&128)!==0)throw Error(o(558))}return Xt(e),null;case 13:if(a=e.memoizedState,t===null||t.memoizedState!==null&&t.memoizedState.dehydrated!==null){if(n=Dn(e),a!==null&&a.dehydrated!==null){if(t===null){if(!n)throw Error(o(318));if(n=e.memoizedState,n=n!==null?n.dehydrated:null,!n)throw Error(o(317));n[xe]=e}else Pa(),(e.flags&128)===0&&(e.memoizedState=null),e.flags|=4;Xt(e),n=!1}else n=us(),t!==null&&t.memoizedState!==null&&(t.memoizedState.hydrationErrors=n),n=!0;if(!n)return e.flags&256?(ul(e),e):(ul(e),null)}return ul(e),(e.flags&128)!==0?(e.lanes=l,e):(l=a!==null,t=t!==null&&t.memoizedState!==null,l&&(a=e.child,n=null,a.alternate!==null&&a.alternate.memoizedState!==null&&a.alternate.memoizedState.cachePool!==null&&(n=a.alternate.memoizedState.cachePool.pool),u=null,a.memoizedState!==null&&a.memoizedState.cachePool!==null&&(u=a.memoizedState.cachePool.pool),u!==n&&(a.flags|=2048)),l!==t&&l&&(e.child.flags|=8192),Wc(e,e.updateQueue),Xt(e),null);case 4:return el(),t===null&&Mf(e.stateNode.containerInfo),e.flags|=67108864,Xt(e),null;case 10:return ia(e.type),Xt(e),null;case 19:if(ps(e),a=e.memoizedState,a===null)return Xt(e),null;if(n=(e.flags&128)!==0,u=a.rendering,u===null)if(n)Yu(a,!1);else{if(Pt!==0||t!==null&&(t.flags&128)!==0)for(t=e.child;t!==null;){if(u=Hc(t),u!==null){for(e.flags|=128,Yu(a,!1),t=u.updateQueue,e.updateQueue=t,Wc(e,t),e.subtreeFlags=0,t=l,l=e.child;l!==null;)co(l,t),l=l.sibling;return Du(e,_e.current&1|2),vt&&ua(e,a.treeForkCount),e.child}t=t.sibling}a.tail!==null&&$t()>si&&(e.flags|=128,n=!0,Yu(a,!1),e.lanes=4194304)}else{if(!n)if(t=Hc(u),t!==null){if(e.flags|=128,n=!0,t=t.updateQueue,e.updateQueue=t,Wc(e,t),Yu(a,!0),a.tail===null&&a.tailMode!=="collapsed"&&a.tailMode!=="visible"&&!u.alternate&&!vt)return Xt(e),null}else 2*$t()-a.renderingStartTime>si&&l!==536870912&&(e.flags|=128,n=!0,Yu(a,!1),e.lanes=4194304);a.isBackwards?(u.sibling=e.child,e.child=u):(t=a.last,t!==null?t.sibling=u:e.child=u,a.last=u)}if(a.tail!==null){t=a.tail;t:{for(l=t;l!==null;){if(l.alternate!==null){l=!1;break t}l=l.sibling}l=!0}return a.rendering=t,a.tail=t.sibling,a.renderingStartTime=$t(),t.sibling=null,u=_e.current,u=n?u&1|2:u&1,a.tailMode==="visible"||a.tailMode==="collapsed"||!l||vt?Du(e,u):(l=u,zt(Ee,e),zt(_e,l),Be===null&&(Be=e)),vt&&ua(e,a.treeForkCount),t}return Xt(e),null;case 22:case 23:return ul(e),gs(),a=e.memoizedState!==null,t!==null?t.memoizedState!==null!==a&&(e.flags|=8192):a&&(e.flags|=8192),a?(l&536870912)!==0&&(e.flags&128)===0&&(Xt(e),e.subtreeFlags&6&&(e.flags|=8192)):Xt(e),l=e.updateQueue,l!==null&&Wc(e,l.retryQueue),l=null,t!==null&&t.memoizedState!==null&&t.memoizedState.cachePool!==null&&(l=t.memoizedState.cachePool.pool),a=null,e.memoizedState!==null&&e.memoizedState.cachePool!==null&&(a=e.memoizedState.cachePool.pool),a!==l&&(e.flags|=2048),t!==null&&Gt(nn),null;case 24:return l=null,t!==null&&(l=t.memoizedState.cache),e.memoizedState.cache!==l&&(e.flags|=2048),ia(ie),Xt(e),null;case 25:return null;case 30:return e.flags|=33554432,Xt(e),null}throw Error(o(156,e.tag))}function c0(t,e){switch(as(e),e.tag){case 1:return t=e.flags,t&65536?(e.flags=t&-65537|128,e):null;case 3:return ia(ie),el(),t=e.flags,(t&65536)!==0&&(t&128)===0?(e.flags=t&-65537|128,e):null;case 26:case 27:case 5:return ne(e),null;case 31:if(e.memoizedState!==null){if(ul(e),e.alternate===null)throw Error(o(340));Pa()}return t=e.flags,t&65536?(e.flags=t&-65537|128,e):null;case 13:if(ul(e),t=e.memoizedState,t!==null&&t.dehydrated!==null){if(e.alternate===null)throw Error(o(340));Pa()}return t=e.flags,t&65536?(e.flags=t&-65537|128,e):null;case 19:return ps(e),t=e.flags,t&65536?(e.flags=t&-65537|128,t=e.memoizedState,t!==null&&(t.rendering=null,t.tail=null),e.flags|=4,e):null;case 4:return el(),null;case 10:return ia(e.type),null;case 22:case 23:return ul(e),gs(),t!==null&&Gt(nn),t=e.flags,t&65536?(e.flags=t&-65537|128,e):null;case 24:return ia(ie),null;case 25:return null;default:return null}}function Hd(t,e){switch(as(e),e.tag){case 3:ia(ie),el();break;case 26:case 27:case 5:ne(e);break;case 4:el();break;case 31:e.memoizedState!==null&&ul(e);break;case 13:ul(e);break;case 19:ps(e);break;case 10:ia(e.type);break;case 22:case 23:ul(e),gs(),t!==null&&Gt(nn);break;case 24:ia(ie)}}function wu(t,e){try{var l=e.updateQueue,a=l!==null?l.lastEffect:null;if(a!==null){var n=a.next;l=n;do{if((l.tag&t)===t){a=void 0;var u=l.create,i=l.inst;a=u(),i.destroy=a}l=l.next}while(l!==n)}}catch(f){Ht(e,e.return,f)}}function Ma(t,e,l){try{var a=e.updateQueue,n=a!==null?a.lastEffect:null;if(n!==null){var u=n.next;a=u;do{if((a.tag&t)===t){var i=a.inst,f=i.destroy;if(f!==void 0){i.destroy=void 0,n=e;var d=l,p=f;try{p()}catch(E){Ht(n,d,E)}}}a=a.next}while(a!==u)}}catch(E){Ht(e,e.return,E)}}function Bd(t){var e=t.updateQueue;if(e!==null){var l=t.stateNode;try{_o(e,l)}catch(a){Ht(t,t.return,a)}}}function qd(t,e,l){l.props=rn(t.type,t.memoizedProps),l.state=t.memoizedState;try{l.componentWillUnmount()}catch(a){Ht(t,e,a)}}function Ql(t,e){try{var l=t.ref;if(l!==null){switch(t.tag){case 26:case 27:case 5:var a=t.stateNode;break;case 30:var n=t.stateNode,u=la(t.memoizedProps,n);(n.ref===null||n.ref.name!==u)&&(n.ref=Vm(u)),a=n.ref;break;case 7:if(t.stateNode===null){var i=new rl(t);b(t.child,!1,W0,i,void 0,void 0),t.stateNode=i}a=t.stateNode;break;default:a=t.stateNode}typeof l=="function"?t.refCleanup=l(a):l.current=a}}catch(f){Ht(t,e,f)}}function Ne(t,e){var l=t.ref,a=t.refCleanup;if(l!==null)if(typeof a=="function")try{a()}catch(n){Ht(t,e,n)}finally{t.refCleanup=null,t=t.alternate,t!=null&&(t.refCleanup=null)}else if(typeof l=="function")try{l(null)}catch(n){Ht(t,e,n)}else l.current=null}function $c(t,e){if((t.tag===5||t.tag===27||t.tag===6)&&t.alternate===null&&e!==null)for(var l=0;l title"))),Ce(a,e,l),a[xe]=t,me(a),e=a;break t;case"link":if(u=ih("link","href",n).get(e+(l.href||""))){for(i=0;irt&&(i=rt,rt=L,L=i);var S=Jr(f,L),h=Jr(f,rt);if(S&&h&&(T.rangeCount!==1||T.anchorNode!==S.node||T.anchorOffset!==S.offset||T.focusNode!==h.node||T.focusOffset!==h.offset)){var j=O.createRange();j.setStart(S.node,S.offset),T.removeAllRanges(),L>rt?(T.addRange(j),T.extend(h.node,h.offset)):(j.setEnd(h.node,h.offset),T.addRange(j))}}}}for(O=[],T=f;T=T.parentNode;)T.nodeType===1&&O.push({element:T,left:T.scrollLeft,top:T.scrollTop});for(typeof f.focus=="function"&&f.focus(),f=0;fl?32:l,X.T=null,l=yf,yf=null;var u=zl,i=Kl;if(Jt=0,hn=zl=null,Kl=0,(At&6)!==0)throw Error(o(331));var f=At;if(At|=4,cm(u.current),am(u,u.current,i,l),At=f,Lu(0,!1),pe&&typeof pe.onPostCommitFiberRoot=="function")try{pe.onPostCommitFiberRoot($l,u)}catch{}return!0}finally{ut.p=n,X.T=a,jm(t,e)}}function xm(t,e,l){e=gl(l,e),e=Ys(t.stateNode,e,2),t=Na(t,e,2),t!==null&&(Ue(t,2),Jl(t))}function Ht(t,e,l){if(t.tag===3)xm(t,t,l);else for(;e!==null;){if(e.tag===3){xm(e,t,l);break}else if(e.tag===1){var a=e.stateNode;if(typeof e.type.getDerivedStateFromError=="function"||typeof a.componentDidCatch=="function"&&(Ua===null||!Ua.has(a))){t=gl(l,t),l=Sd(2),a=Na(e,l,2),a!==null&&(pd(l,a,e,t),Ue(a,2),Jl(a));break}}e=e.return}}function Tf(t,e,l){var a=t.pingCache;if(a===null){a=t.pingCache=new r0;var n=new Set;a.set(e,n)}else n=a.get(e),n===void 0&&(n=new Set,a.set(e,n));n.has(l)||(mf=!0,n.add(l),t=S0.bind(null,t,e,l),e.then(t,t))}function S0(t,e,l){var a=t.pingCache;a!==null&&a.delete(e),t.pingedLanes|=t.suspendedLanes&l,t.warmLanes&=~l,wt===t&&(jt&l)===l&&((Pt===4||Pt===3&&(jt&62914560)===jt&&300>$t()-ii)&&(At&2)===0?Wn(t,0):ci|=l,Zn===jt&&(Zn=0)),Jl(t)}function Tm(t,e){e===0&&(e=Zt()),t=$a(t,e),t!==null&&(Ue(t,e),Jl(t))}function p0(t){var e=t.memoizedState,l=0;e!==null&&(l=e.retryLane),Tm(t,l)}function b0(t,e){var l=0;switch(t.tag){case 31:case 13:var a=t.stateNode,n=t.memoizedState;n!==null&&(l=n.retryLane);break;case 19:a=t.stateNode;break;case 22:a=t.stateNode._retryCache;break;default:throw Error(o(314))}a!==null&&a.delete(e),Tm(t,l)}function j0(t,e){return ll(t,e)}var In=null,Pn=null,Ef=!1,vi=!1,_f=!1,Ba=0;function Jl(t){t!==Pn&&t.next===null&&(Pn===null?In=Pn=t:Pn=Pn.next=t),vi=!0,Ef||(Ef=!0,T0())}function Lu(t,e){if(!_f&&vi){_f=!0;do for(var l=!1,a=In;a!==null;){if(t!==0){var n=a.pendingLanes;if(n===0)var u=0;else{var i=a.suspendedLanes,f=a.pingedLanes;u=(1<<31-be(42|t)+1)-1,u&=n&~(i&~f),u=u&201326741?u&201326741|1:u?u|2:0}u!==0&&(l=!0,Cm(a,u))}else u=jt,u=z(a,a===wt?u:0,a.cancelPendingCommit!==null||a.timeoutHandle!==-1),(u&3)===0||w(a,u)||(l=!0,Cm(a,u));a=a.next}while(l);_f=!1}}function x0(){Em()}function Em(){vi=Ef=!1;var t=0;Ba!==0&&U0()&&(t=Ba);for(var e=$t(),l=null,a=In;a!==null;){var n=a.next,u=_m(a,e);u===0?(a.next=null,l===null?In=n:l.next=n,n===null&&(Pn=l)):(l=a,(t!==0||(u&3)!==0)&&(vi=!0)),a=n}Jt!==0&&Jt!==5||Lu(t),Ba!==0&&(Ba=0)}function _m(t,e){for(var l=t.suspendedLanes,a=t.pingedLanes,n=t.expirationTimes,u=t.pendingLanes&-62914561;0f)break;var E=d.transferSize,O=d.initiatorType;E&&Um(O)&&(d=d.responseEnd,i+=E*(dbi){L.length=q;break}j=new Promise(G0.bind(j)),L.push(j)}}}if(0"u"?null:document;function ah(t,e,l){var a=eu;if(a&&typeof e=="string"&&e){var n=vl(e);n='link[rel="'+t+'"][href="'+n+'"]',typeof l=="string"&&(n+='[crossorigin="'+l+'"]'),lh.has(n)||(lh.add(n),t={rel:t,crossOrigin:l,href:e},a.querySelector(n)===null&&(e=a.createElement("link"),Ce(e,"link",t),me(e),a.head.appendChild(e)))}}function uy(t){ma.D(t),ah("dns-prefetch",t,null)}function cy(t,e){ma.C(t,e),ah("preconnect",t,e)}function iy(t,e,l){ma.L(t,e,l);var a=eu;if(a&&t&&e){var n='link[rel="preload"][as="'+vl(e)+'"]';e==="image"&&l&&l.imageSrcSet?(n+='[imagesrcset="'+vl(l.imageSrcSet)+'"]',typeof l.imageSizes=="string"&&(n+='[imagesizes="'+vl(l.imageSizes)+'"]')):n+='[href="'+vl(t)+'"]';var u=n;switch(e){case"style":u=lu(t);break;case"script":u=au(t)}if(!(Tl.has(u)||(t=it({rel:"preload",href:e==="image"&&l&&l.imageSrcSet?void 0:t,as:e},l),Tl.set(u,t),a.querySelector(n)!==null||e==="style"&&a.querySelector($u(u))||e==="script"&&a.querySelector(Iu(u))))){var i=a.createElement("link");Ce(i,"link",t),e==="style"&&(i[ic]=!0,i.onload=i.onerror=function(){vr(i)}),me(i),a.head.appendChild(i)}}}function sy(t,e){ma.m(t,e);var l=eu;if(l&&t){var a=e&&typeof e.as=="string"?e.as:"script",n='link[rel="modulepreload"][as="'+vl(a)+'"][href="'+vl(t)+'"]',u=n;switch(a){case"audioworklet":case"paintworklet":case"serviceworker":case"sharedworker":case"worker":case"script":u=au(t)}if(!Tl.has(u)&&(t=it({rel:"modulepreload",href:t},e),Tl.set(u,t),l.querySelector(n)===null)){switch(a){case"audioworklet":case"paintworklet":case"serviceworker":case"sharedworker":case"worker":case"script":if(l.querySelector(Iu(u)))return}a=l.createElement("link"),Ce(a,"link",t),me(a),l.head.appendChild(a)}}}function fy(t,e,l){ma.S(t,e,l);var a=eu;if(a&&t){var n=bn(a).hoistableStyles,u=lu(t);e=e||"default";var i=n.get(u);if(!i){var f={loading:0,preload:null};if(i=a.querySelector($u(u)))f.loading=5;else{t=it({rel:"stylesheet",href:t,"data-precedence":e},l),(l=Tl.get(u))&&Lf(t,l);var d=i=a.createElement("link");me(d),Ce(d,"link",t),d._p=new Promise(function(p,E){d.onload=p,d.onerror=E}),d.addEventListener("load",function(){f.loading|=1}),d.addEventListener("error",function(){f.loading|=2}),f.loading|=4,Si(i,e,a)}i={type:"stylesheet",instance:i,count:1,state:f},n.set(u,i)}}}function ry(t,e){ma.X(t,e);var l=eu;if(l&&t){var a=bn(l).hoistableScripts,n=au(t),u=a.get(n);u||(u=l.querySelector(Iu(n)),u||(t=it({src:t,async:!0},e),(e=Tl.get(n))&&Kf(t,e),u=l.createElement("script"),me(u),Ce(u,"link",t),l.head.appendChild(u)),u={type:"script",instance:u,count:1,state:null},a.set(n,u))}}function oy(t,e){ma.M(t,e);var l=eu;if(l&&t){var a=bn(l).hoistableScripts,n=au(t),u=a.get(n);u||(u=l.querySelector(Iu(n)),u||(t=it({src:t,async:!0,type:"module"},e),(e=Tl.get(n))&&Kf(t,e),u=l.createElement("script"),me(u),Ce(u,"link",t),l.head.appendChild(u)),u={type:"script",instance:u,count:1,state:null},a.set(n,u))}}function nh(t,e,l,a){var n=(n=ae.current)?Wu(n):null;if(!n)throw Error(o(446));switch(t){case"meta":case"title":return null;case"style":return typeof l.precedence=="string"&&typeof l.href=="string"?(l=lu(l.href),e=bn(n).hoistableStyles,a=e.get(l),a||(a={type:"style",instance:null,count:0,state:null},e.set(l,a)),a):{type:"void",instance:null,count:0,state:null};case"link":if(l.rel==="stylesheet"&&typeof l.href=="string"&&typeof l.precedence=="string"){t=lu(l.href);var u=bn(n).hoistableStyles,i=u.get(t);if(i||(n=n.ownerDocument||n,i={type:"stylesheet",instance:null,count:0,state:{loading:0,preload:null}},u.set(t,i),(u=n.querySelector($u(t)))?u._p||(i.instance=u,i.state.loading=5):(u=Tl.get(t),u||(u={rel:"preload",as:"style",href:l.href,crossOrigin:l.crossOrigin,integrity:l.integrity,media:l.media,hrefLang:l.hrefLang,referrerPolicy:l.referrerPolicy},Tl.set(t,u)),dy(n,t,u,i.state))),e&&a===null)throw Error(o(528,""));return i}if(e&&a!==null)throw Error(o(529,""));return null;case"script":return e=l.async,l=l.src,typeof l=="string"&&e&&typeof e!="function"&&typeof e!="symbol"?(l=au(l),e=bn(n).hoistableScripts,a=e.get(l),a||(a={type:"script",instance:null,count:0,state:null},e.set(l,a)),a):{type:"void",instance:null,count:0,state:null};default:throw Error(o(444,t))}}function lu(t){return'href="'+vl(t)+'"'}function $u(t){return'link[rel="stylesheet"]['+t+"]"}function uh(t){return it({},t,{"data-precedence":t.precedence,precedence:null})}function dy(t,e,l,a){if(e=t.querySelector('link[rel="preload"][as="style"]['+e+"]")){if(e[ic]!==!0){a.loading=1;return}}else e=t.createElement("link"),e[ic]=!0,e.onload=e.onerror=vr.bind(null,e),Ce(e,"link",l),me(e),t.head.appendChild(e);a.preload=e,e.addEventListener("load",function(){return a.loading|=1}),e.addEventListener("error",function(){return a.loading|=2})}function au(t){return'[src="'+vl(t)+'"]'}function Iu(t){return"script[async]"+t}function ch(t,e,l){if(e.count++,e.instance===null)switch(e.type){case"style":var a=t.querySelector('style[data-href~="'+vl(l.href)+'"]');if(a)return e.instance=a,me(a),a;var n=it({},l,{"data-href":l.href,"data-precedence":l.precedence,href:null,precedence:null});return a=(t.ownerDocument||t).createElement("style"),me(a),Ce(a,"style",n),Si(a,l.precedence,t),e.instance=a;case"stylesheet":n=lu(l.href);var u=t.querySelector($u(n));if(u)return e.state.loading|=4,e.instance=u,me(u),u;a=uh(l),(n=Tl.get(n))&&Lf(a,n),u=(t.ownerDocument||t).createElement("link"),me(u);var i=u;return i._p=new Promise(function(f,d){i.onload=f,i.onerror=d}),Ce(u,"link",a),e.state.loading|=4,Si(u,l.precedence,t),e.instance=u;case"script":return u=au(l.src),(n=t.querySelector(Iu(u)))?(e.instance=n,me(n),n):(a=l,(n=Tl.get(u))&&(a=it({},l),Kf(a,n)),t=t.ownerDocument||t,n=t.createElement("script"),me(n),Ce(n,"link",a),t.head.appendChild(n),e.instance=n);case"void":return null;default:throw Error(o(443,e.type))}else e.type==="stylesheet"&&(e.state.loading&4)===0&&(a=e.instance,e.state.loading|=4,Si(a,l.precedence,t));return e.instance}function Si(t,e,l){for(var a=l.querySelectorAll('link[rel="stylesheet"][data-precedence],style[data-precedence]'),n=a.length?a[a.length-1]:null,u=n,i=0;i title"):null)}function my(t,e,l){if(l===1||e.itemProp!=null)return!1;switch(t){case"meta":case"title":return!0;case"style":if(typeof e.precedence!="string"||typeof e.href!="string"||e.href==="")break;return!0;case"link":if(typeof e.rel!="string"||typeof e.href!="string"||e.href===""||e.onLoad||e.onError)break;switch(e.rel){case"stylesheet":return t=e.disabled,typeof e.precedence=="string"&&t==null;default:return!0}case"script":if(e.async&&typeof e.async!="function"&&typeof e.async!="symbol"&&!e.onLoad&&!e.onError&&e.src&&typeof e.src=="string")return!0}return!1}function sh(t,e){return t==="img"&&e.src!=null&&e.src!==""&&e.onLoad==null&&e.loading!=="lazy"}function fh(t){return!(t.type==="stylesheet"&&(t.state.loading&3)===0)}function rh(t){return(t.width||100)*(t.height||100)*(typeof devicePixelRatio=="number"?devicePixelRatio:1)*.25}function oh(t,e){typeof e.decode=="function"&&(t.imgCount++,e.complete||(t.imgBytes+=rh(e),t.suspenseyImages.push(e)),t=yy.bind(t),e.decode().then(t,t))}function hy(t,e,l,a){if(l.type==="stylesheet"&&(typeof a.media!="string"||matchMedia(a.media).matches!==!1)&&(l.state.loading&4)===0){if(l.instance===null){var n=lu(a.href),u=e.querySelector($u(n));if(u){e=u._p,e!==null&&typeof e=="object"&&typeof e.then=="function"&&(t.count++,t=Pu.bind(t),e.then(t,t)),l.state.loading|=4,l.instance=u,me(u);return}u=e.ownerDocument||e,a=uh(a),(n=Tl.get(n))&&Lf(a,n),u=u.createElement("link"),me(u);var i=u;i._p=new Promise(function(f,d){i.onload=f,i.onerror=d}),Ce(u,"link",a),l.instance=u}t.stylesheets===null&&(t.stylesheets=new Map),t.stylesheets.set(l,e),(e=l.state.preload)&&(l.state.loading&3)===0&&(t.count++,l=Pu.bind(t),e.addEventListener("load",l),e.addEventListener("error",l))}}var bi=0;function vy(t,e){return t.stylesheets&&t.count===0&&xi(t,t.stylesheets),0bi?50:800)+e);return t.unsuspend=l,function(){t.unsuspend=null,clearTimeout(a),clearTimeout(n)}}:null}function dh(t){if(t.count===0&&(t.imgCount===0||!t.waitingForImages)){if(t.stylesheets)xi(t,t.stylesheets);else if(t.unsuspend){var e=t.unsuspend;t.unsuspend=null,e()}}}function Pu(){this.count--,dh(this)}function yy(){this.imgCount--,dh(this)}var ji=null;function xi(t,e){t.stylesheets=null,t.unsuspend!==null&&(t.count++,ji=new Map,e.forEach(gy,t),ji=null,Pu.call(t))}function gy(t,e){if(!(e.state.loading&4)){var l=ji.get(t);if(l)var a=l.get(null);else{l=new Map,ji.set(t,l);for(var n=t.querySelectorAll("link[data-precedence],style[data-precedence]"),u=0;u"u"||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!="function"))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(c)}catch(r){console.error(r)}}return c(),ar.exports=Uy(),ar.exports}var By=Hy();const qy=qh(By),Yh=v.createContext(null);function Ot(){const c=v.useContext(Yh);if(!c)throw new Error("ConsoleContext missing");return c}const ot=encodeURIComponent,$={health:"/health",relayModels:"/relay/models",quotaMe:"/users/me/quota",userKeys:"/users/me/keys",userKey:c=>"/users/me/keys/"+ot(c),githubRepos:"/github/repos",projects:"/projects",project:c=>"/projects/"+ot(c),projectMembers:c=>"/projects/"+ot(c)+"/members",projectMember:(c,r)=>"/projects/"+ot(c)+"/members/"+ot(r),projectSkills:c=>"/projects/"+ot(c)+"/skills",projectApps:c=>"/projects/"+ot(c)+"/apps",projectMcp:c=>"/projects/"+ot(c)+"/mcp-servers",projectMcpReload:c=>"/projects/"+ot(c)+"/mcp-servers/reload",projectMcpOauth:(c,r)=>"/projects/"+ot(c)+"/mcp-servers/"+ot(r)+"/oauth-login",projectAutomations:c=>"/projects/"+ot(c)+"/automations",projectAutomationCancel:(c,r)=>"/projects/"+ot(c)+"/automations/"+ot(r)+"/cancel",projectTriage:c=>"/projects/"+ot(c)+"/triage",workers:"/workers",environments:c=>"/environments?project_id="+ot(c),environmentsCreate:"/environments",environmentArchive:c=>"/environments/"+ot(c)+"/archive",tasks:c=>"/tasks?project_id="+ot(c),tasksByParent:(c,r)=>"/tasks?project_id="+ot(c)+"&parent_task_id="+ot(r),tasksCreate:"/tasks",task:c=>"/tasks/"+ot(c),taskAction:(c,r)=>"/tasks/"+ot(c)+"/"+r,taskFork:c=>"/tasks/"+ot(c)+"/fork",taskContinue:c=>"/tasks/"+ot(c)+"/continue",taskTrace:c=>"/tasks/"+ot(c)+"/trace",taskTraceStream:c=>"/tasks/"+ot(c)+"/trace/stream",taskAgents:c=>"/tasks/"+ot(c)+"/agents",taskReviews:c=>"/tasks/"+ot(c)+"/reviews",taskReviewFindings:(c,r)=>"/tasks/"+ot(c)+"/reviews/"+ot(r)+"/findings",taskApprovals:c=>"/tasks/"+ot(c)+"/approvals",taskApprovalDecision:(c,r,m)=>"/tasks/"+ot(c)+"/approvals/"+ot(r)+"/"+m,taskFollowups:c=>"/tasks/"+ot(c)+"/followups",taskChatHistory:c=>"/tasks/"+ot(c)+"/chat-history",taskMessages:c=>"/tasks/"+ot(c)+"/messages",taskMessagesTo:c=>"/tasks/"+ot(c)+"/messages",taskThread:c=>"/tasks/"+ot(c)+"/thread",taskThreads:c=>"/tasks/"+ot(c)+"/threads",taskThreadAction:(c,r)=>"/tasks/"+ot(c)+"/thread/"+r,taskCost:c=>"/tasks/"+ot(c)+"/cost",uploads:"/uploads",adminQuotas:"/admin/quotas",adminQuotaUser:c=>"/admin/quotas?user_id="+ot(c),adminSweep:"/admin/sweep",adminBackup:"/admin/backup"},Yy={exec:"命令",file:"文件",call:"调用",tool:"工具",message:"消息",reasoning:"思考",plan:"计划","agent-start":"子代理","agent-done":"子代理"},su=["completed","failed","interrupted","merged","merge-failed"],wy={queued:"排队中,尚未被 worker 认领",running:"运行中,模型回合进行中",completed:"模型回合结束、改动在 worktree 里尚未合并",failed:"模型回合失败,可重试",interrupted:"已被取消/中断,可重试",merged:"控制面已标记 merged,不代表 git 主分支已合入","merge-failed":"合并落盘失败,可重试"},Bh=["low","medium","high","xhigh","max"],Gy=["viewer","contributor","maintainer","owner"],or="codex-console-key";function El(){try{return localStorage.getItem(or)||""}catch{return""}}function Qy(c){localStorage.setItem(or,c)}function Xy(){localStorage.removeItem(or)}function Oe(c){return c?c.slice(0,8):""}function ka(c){return c?new Date(c*1e3).toLocaleString():""}async function tt(c,r="GET",m){const o={"Content-Type":"application/json"},_=El();_&&(o["X-API-Key"]=_);const M={method:r,headers:o};m!==void 0&&(M.body=JSON.stringify(m));const N=await fetch(c,M);let x=null;try{x=await N.json()}catch{x=null}if(!N.ok){const Q=x;let U=Q&&Q.error?Q.error:"HTTP "+N.status;throw N.status===401&&(U+="(key 未填或无效)"),N.status===429&&(U+="(触发限流,稍后再试)"),N.status===402&&(Q&&Q.unpriced_token_cap!==void 0?U+="(无价 token 已满,联系管理员调整)":Q&&Q.error==="coordinator_quota_reserve_exceeded"?U="协调员分工预留不足:剩余美元配额不够覆盖全部分工,子任务费用记父任务创建人账,整个父任务已被挡下(未建任何子任务)":U+="(美元配额已满,联系管理员调整)"),new Error(U)}return x}async function ky(c){const r=new FormData;r.append("paths",JSON.stringify(c.map(_=>_.path))),c.forEach((_,M)=>r.append("file"+M,_.file));const m=await fetch($.uploads,{method:"POST",headers:{"X-API-Key":El()},body:r}),o=await m.json().catch(()=>({}));if(!m.ok)throw new Error(o&&o.error||"HTTP "+m.status);return o.upload_id}function Vy(c,r,m){const o=[],_={},M=(N,x)=>{if(N)for(let Q=0;QN.name),M(r,N=>N.webkitRelativePath||N.name),M(m,N=>N.name),o}function wh(c){const r=Date.now()/1e3;let m=null;if(typeof c.last_seen=="number"?m=r-c.last_seen:typeof c.last_seen_seconds_ago=="number"&&(m=c.last_seen_seconds_ago),(m===null||m<0)&&(m=null),m===null)return{text:"未知",age:null};const o=Math.floor(m);return o<60?{text:o+" 秒前",age:m}:o<3600?{text:Math.floor(o/60)+" 分钟前",age:m}:{text:Math.floor(o/3600)+" 小时前",age:m}}function Oi(c){const r=c.message||"";return r.includes("forbidden")?"没有权限:只有项目 owner 或全局管理员可以管理成员":r.includes("already_member")?"该用户已是成员,改角色请用成员行的下拉框":r.includes("cannot demote the only owner")?"不能把唯一 owner 降为非 owner:请先把另一位成员升为 owner":r.includes("user not found")?"找不到该用户:请核对 user_id 或用户名是否正确":r.includes("member not found")?"该用户不是本项目成员":r.includes("unknown role")?"角色无效:只能是 viewer / contributor / maintainer / owner":r.includes("project not found")?"项目不存在(可能已被删除)":"成员操作失败:"+r}function ir(c){const r=c.message||"";return r.includes("forbidden")?"无全局管理员权限:服务端返回 403(CODEX_GLOBAL_ADMINS 未包含当前用户),请联系管理员":r.includes("user not found")?"找不到该用户:请核对用户 id 是否正确":"管理操作失败:"+r}function sr(c){return c==null?"不限额":"$"+(c/1e6).toFixed(2)}function fr(c){const r=Yy[c.kind||""]||c.kind||"?";let m="";return c.kind==="exec"?m=(c.command||"")+"(exit="+(c.exitCode??"")+","+(c.durationMs??"")+"ms,cwd="+(c.cwd||"")+")":c.kind==="file"?m=(c.path||"")+" "+(c.change||"")+" "+(c.status||""):c.kind==="message"?m=(c.phase?"["+c.phase+"] ":"")+(c.text||""):c.kind==="reasoning"?m=c.summary||"":c.kind==="tool"?m=(c.server||"")+"/"+(c.tool||"")+" "+(c.status||""):c.kind==="call"?m=c.name||"":c.kind==="plan"?m=c.text||"":c.kind==="agent-start"?m="开始:"+(c.name||"")+(c.prompt?"("+c.prompt+")":""):c.kind==="agent-done"?m="结束:"+(c.name||"")+" "+(c.status||""):m=JSON.stringify(c).slice(0,300),"["+r+"] "+m}function Zy(){const[c,r]=v.useState(!!El()),[m,o]=v.useState(El()?"已保存到本浏览器(只用于调本站 API)":"未填 key,数据接口会返回 401"),[_,M]=v.useState("未加载"),[N,x]=v.useState("未加载"),[Q,U]=v.useState("填 key 后判断权限…"),[G,b]=v.useState(!1),[B,lt]=v.useState(""),[at,I]=v.useState(""),[V,dt]=v.useState([]),[Mt,te]=v.useState(""),[nt,kt]=v.useState(""),[ee,it]=v.useState([]),[yt,le]=v.useState(null),[de,Kt]=v.useState("未加载"),[Ft,Wt]=v.useState(""),[tl,mt]=v.useState([]),[Y,C]=v.useState(""),[et,Tt]=v.useState(""),[gt,ce]=v.useState([]),[Me,ze]=v.useState([]),[y,R]=v.useState([]),[F,K]=v.useState("先选项目"),[St,ht]=v.useState(""),[Et,X]=v.useState(""),[ut,ge]=v.useState(""),[Va,Ul]=v.useState(""),[Ze,Gt]=v.useState([]),[zt,Re]=v.useState(""),[Fl,ae]=v.useState(""),[ha,_l]=v.useState(""),[el,Le]=v.useState(!1),[ne,qe]=v.useState(""),[ol,Se]=v.useState(""),[Hl,dl]=v.useState([]),[Bl,Ye]=v.useState(!1),Vt=v.useRef("");Vt.current=Mt;const ll=v.useRef("");ll.current=ol;const ml=v.useCallback(async()=>{try{const z=await tt($.health);x("backend="+z.backend+" db_ok="+z.db_ok+" worker_ok="+z.worker_ok+" commit="+String(z.commit||"").slice(0,7))}catch(z){x("加载失败:"+z.message)}},[]),ql=v.useCallback(async()=>{if(!El()){M("未填 key,配额不显示");return}try{const z=await tt($.quotaMe),w=((z.used_usd_micros||0)/1e6).toFixed(2),W=z.quota_usd_micros===null||z.quota_usd_micros===void 0?"美元:本月用量 $"+w+"(不限额)":"美元:本月用量 $"+w+" / $"+((z.quota_usd_micros||0)/1e6).toFixed(2)+"(剩余 $"+((z.remaining_usd_micros||0)/1e6).toFixed(2)+")",qt=z.unpriced_token_cap===void 0||z.unpriced_tokens_used===void 0?"无价 token:未返回(旧服务端)":"无价 token:"+z.unpriced_tokens_used+" / "+z.unpriced_token_cap+" tokens";M(W+" | "+qt)}catch(z){M("配额加载失败:"+z.message)}},[]),Za=v.useCallback(async()=>{if(!El()){U("未填 key,管理区不可用"),b(!1);return}try{const z=await fetch($.adminQuotas,{headers:{"X-API-Key":El()}});z.status===400?(U("已确认为全局管理员,管理操作可用"),b(!0)):z.status===403?(U("管理区仅全局管理员可用:当前 key 无全局管理员权限(服务端返回 403)"),b(!1)):z.status===401?(U("key 无效,管理区不可用(服务端返回 401)"),b(!1)):(U("管理权限判断失败(HTTP "+z.status+"),管理操作暂不可用"),b(!1))}catch(z){U("管理权限判断失败:"+z.message),b(!1)}},[]),$t=v.useCallback(async()=>{try{const w=(await tt($.projects)).projects||[];dt(w),kt(w.length+" 个项目"),Vt.current&&w.some(W=>W.id===Vt.current)}catch(z){kt("加载失败:"+z.message)}},[]),Wl=v.useCallback(async()=>{try{const z=await tt($.githubRepos);it(z.repos||[])}catch{}},[]),yn=v.useCallback(async()=>{try{const z=await tt($.relayModels);dl(z.models||[]),Ye(!1)}catch{Ye(!0)}},[]),gn=v.useCallback(async()=>{try{const z=await tt($.workers);if(!Array.isArray(z)&&z.workers===void 0&&z.workers_total!==void 0){le(null),Kt(z.workers_total?"在线 "+z.workers_online+" / 离线 "+z.workers_offline+"(共 "+z.workers_total+";完整 worker 清单仅全局管理员可见)":"无 worker 注册"),Wt("");return}const w=Array.isArray(z)?z:z.workers||[];le(w),Kt(w.length?"":"无 worker 注册"),Wt("")}catch(z){Wt("加载失败:"+z.message)}},[]),Ke=v.useCallback(async z=>{const w=z!==void 0?z:Vt.current,W=ll.current;if(!w){Gt([]),Re(""),Se("");return}try{const Zt=(await tt($.environments(w))).environments||[];Gt(Zt),Re(Zt.length+" 个环境"),(W&&Zt.some(Ue=>Ue.id===W&&Ue.status==="ready")||W&&Zt.some(Ue=>Ue.id===W))&&Se(W);const je=V.find(Ue=>Ue.id===w);je&&je.repo_url?(_l("仓库:"+je.repo_url),Le(!1)):je?(_l("该项目未绑定仓库,环境无法创建——先选一个仓库保存"),Le(!0)):(_l(""),Le(!1))}catch(qt){ae("加载失败:"+qt.message)}},[V]),La=v.useCallback(async z=>{const w=z!==void 0?z:Vt.current;if(!w){mt([]);return}try{const W=await tt($.projectMembers(w));mt(W.members||[]),Tt("")}catch(W){Tt("成员加载失败:"+Oi(W))}},[]),va=v.useCallback(async z=>{const w=z!==void 0?z:Vt.current;if(!w){ce([]),ze([]),R([]),K("先选项目");return}K("");try{const W=await tt($.projectSkills(w));ce(W.skills||[])}catch(W){ht("技能加载失败:"+W.message)}try{const W=await tt($.projectApps(w));ze(W.apps||[])}catch(W){ht("应用加载失败:"+W.message)}try{const W=await tt($.projectMcp(w));R(W.servers||W.mcp_servers||[])}catch(W){ht("MCP 服务加载失败:"+W.message)}},[]),ru=v.useCallback(z=>{if(!z.trim()){o("key 为空,未保存");return}Qy(z.trim()),r(!0),o("已保存到本浏览器(只用于调本站 API)")},[]),ou=v.useCallback(()=>{Xy(),r(!1),o("未填 key,数据接口会返回 401"),Za()},[Za]),$l=v.useCallback(async(z,w)=>{if(!z.trim()){kt("项目名必填");return}const W={name:z.trim()};w.trim()&&(W.repo_url=w.trim());try{await tt($.projects,"POST",W),kt("项目已建"),await $t()}catch(qt){kt("新建失败:"+qt.message)}},[$t]),pe=v.useCallback(async(z,w,W)=>{const qt=Vt.current;if(!qt){ae("先选项目");return}if(!z.trim()){ae("环境名必填");return}const Zt={project_id:qt,name:z.trim()};w.trim()&&(Zt.branch=w.trim()),W&&(Zt.executor=W);try{await tt($.environmentsCreate,"POST",Zt),ae("环境已建,worker 准备中(creating → ready,失败会在列表里写原因)"),await Ke(qt)}catch(je){ae("新建失败:"+je.message)}},[Ke]),hl=v.useCallback(async z=>{if(window.confirm("确定归档该环境吗?归档后新任务不能再选它,进行中的任务不受影响(有进行中任务在用它时归档会被拒绝)。"))try{await tt($.environmentArchive(z),"POST",{}),await Ke()}catch(w){ae("归档失败:"+w.message)}},[Ke]),be=v.useCallback(async z=>{const w=Vt.current;if(!w){qe("先选项目");return}if(!z){qe("先选一个仓库");return}try{await tt($.project(w),"PATCH",{repo_url:z}),qe("仓库已保存,现在可以建环境了"),await $t(),await Ke(w)}catch(W){qe("保存失败:"+W.message)}},[$t,Ke]),H=v.useCallback(async(z,w)=>{const W=Vt.current;if(!W){C("先选项目");return}if(!z.trim()){C("请填成员 user_id 或用户名");return}try{await tt($.projectMembers(W),"POST",{user_id:z.trim(),role:w})}catch(qt){if(qt.message.includes("user not found"))try{await tt($.projectMembers(W),"POST",{username:z.trim(),role:w})}catch(Zt){C(Oi(Zt));return}else{C(Oi(qt));return}}C("已邀请成员"),await La(W)},[La]),D=v.useCallback(async(z,w)=>{const W=Vt.current;if(W)try{await tt($.projectMember(W,z),"PATCH",{role:w}),mt(qt=>qt.map(Zt=>Zt.user_id===z?{...Zt,role:w}:Zt)),C("角色已改为 "+w)}catch(qt){C(Oi(qt))}},[]),Z=v.useCallback(async()=>{const z=Vt.current;if(!z){X("先选项目");return}try{await tt($.projectMcpReload(z),"POST",{}),X("配置已重载"),await va(z)}catch(w){X("重载失败:"+w.message)}},[va]),J=v.useCallback(async z=>{const w=Vt.current;if(!w){ge("先选项目");return}if(!z.trim()){ge("服务名不能为空");return}try{const W=await tt($.projectMcpOauth(w,z.trim()),"POST",{}),qt=W.url||W.auth_url||W.login_url||W.authorization_url||"",Zt=W.steps||W.instructions||"";let je=`登录尚未完成:请在浏览器打开下面的链接或按步骤完成,完成后回到本页刷新 MCP 状态。 `;qt&&(je+=qt+` `),Zt&&(je+=(Array.isArray(Zt)?Zt.join(` `):String(Zt))+` -`),je+=JSON.stringify(W,null,2).slice(0,4e3),Ul(je),ge("已返回登录信息,见下方")}catch(W){ge("发起失败:"+W.message)}},[]),Ct=v.useCallback(async()=>{const z=at.trim();if(!z){lt("请填要查配额的用户 id");return}try{const w=await tt($.adminQuotaUser(z));lt("用户 "+z.slice(0,8)+":本月用量 "+sr(w.used_usd_micros)+" / 配额 "+sr(w.quota_usd_micros)+(w.remaining_usd_micros!==null&&w.remaining_usd_micros!==void 0?"(剩余 "+sr(w.remaining_usd_micros)+")":"")+" | 月份 "+(w.month||""))}catch(w){lt(ir(w))}},[at]),Nl=v.useCallback(async()=>{if(window.confirm("确定手动触发 sweep 吗?超阈值的陈旧 running 任务会被标为 interrupted。"))try{const w=(await tt($.adminSweep,"POST",{})).swept||[];lt("sweep 完成,清理 "+w.length+" 个任务"+(w.length?":"+w.join("、"):""))}catch(z){lt(ir(z))}},[]),De=v.useCallback(async()=>{try{const z=await tt($.adminBackup,"POST",{});lt("备份完成:backend="+z.backend+" | 路径 "+z.path+" | 大小 "+z.size_bytes+" 字节 | 任务 "+z.task_count+" 行")}catch(z){lt(ir(z))}},[]);return{keySaved:c,keyState:m,quotaText:_,healthText:N,adminGate:Q,adminBody:G,adminResult:B,adminUserId:at,setAdminUserId:I,projects:V,projectId:Mt,setProjectId:Ft,projectMsg:nt,githubRepos:ee,workers:yt,workersSummary:de,workersError:Wt,members:tl,memberMsg:Y,memberError:et,skills:gt,apps:Me,mcpServers:y,skillMsg:F,skillError:St,mcpMsg:Et,mcpOauthMsg:ut,mcpOauthBox:Va,envs:Ze,envCount:zt,envMsg:Fl,envRepoLine:ha,envRepoBar:el,envRepoMsg:ne,envSelect:ol,setEnvSelect:Se,models:Hl,modelCustomVisible:Bl,refreshHealth:ml,loadQuota:ql,probeAdmin:Za,refreshProjects:It,loadGithubRepos:Wl,loadRelayModels:yn,refreshWorkers:gn,refreshEnvs:Ke,refreshMembers:La,refreshSkills:va,saveKeyInput:ru,clearKeyInput:ou,createProject:$l,createEnv:pe,archiveEnv:hl,saveEnvRepo:be,inviteMember:H,changeMemberRole:D,reloadMcp:Z,mcpOauth:J,adminQuota:Ct,adminSweep:Nl,adminBackup:De}}function Ly(){const[c,r]=v.useState([]),[m,o]=v.useState(""),[_,M]=v.useState(""),[N,x]=v.useState(""),[Q,U]=v.useState(""),G=v.useCallback(async(at,I)=>{const V=at!==void 0?at:I;if(!V){r([]);return}try{const dt=await tt($.tasks(V));r(dt.tasks||[]),o("")}catch(dt){o("加载失败:"+dt.message)}},[]),b=v.useMemo(()=>{const at=Q.trim().toLowerCase();return c.filter(I=>!(_&&I.status!==_||N&&(I.executor||"")!==N||at&&!((I.id||"")+" "+(I.prompt||"")).toLowerCase().includes(at)))},[c,_,N,Q]),B=b.length+" 个任务(共 "+c.length+" 个)",lt=v.useCallback(async(at,I)=>{const V={...at};I.length&&(V.upload_id=await ky(I));const dt=await tt($.tasksCreate,"POST",V);return"任务已建:"+Oe(dt.id)},[]);return{tasks:c,taskError:m,statusFilter:_,setStatusFilter:M,executorFilter:N,setExecutorFilter:x,searchText:Q,setSearchText:U,filteredTasks:b,taskCountText:B,refreshTasks:G,dispatch:lt}}function Ky(c,r){const[m,o]=v.useState(null),[_,M]=v.useState(""),[N,x]=v.useState(""),[Q,U]=v.useState(""),[G,b]=v.useState(""),[B,lt]=v.useState(!1),[at,I]=v.useState(""),[V,dt]=v.useState([]),[Mt,Ft]=v.useState([]),[nt,kt]=v.useState(""),[ee,it]=v.useState([]),[yt,le]=v.useState(""),[de,Kt]=v.useState(""),[Wt,$t]=v.useState([]),[tl,mt]=v.useState(""),[Y,C]=v.useState(""),[et,Tt]=v.useState(""),[gt,ce]=v.useState(""),[Me,ze]=v.useState([]),[y,R]=v.useState([]),[F,K]=v.useState(""),[St,ht]=v.useState([]),[Et,X]=v.useState(""),[ut,ge]=v.useState(""),[Va,Ul]=v.useState(""),[Ze,Gt]=v.useState(""),[zt,Re]=v.useState([]),[Fl,ae]=v.useState(""),[ha,_l]=v.useState(null),el=v.useRef(null),Le=v.useRef(null),ne=v.useRef(null);ne.current=m;const qe=v.useCallback(()=>{if(el.current){try{el.current.abort()}catch{}el.current=null}Le.current&&(clearTimeout(Le.current),Le.current=null)},[]),ol=v.useCallback(async H=>{try{const D=await tt($.taskAgents(H));Ft(D.agents||[]),kt(D.note||"")}catch(D){Ft([]),kt("子代理链路加载失败:"+D.message)}},[]),Se=v.useCallback(H=>{Le.current&&clearTimeout(Le.current),Le.current=setTimeout(()=>void ol(H),1e3)},[ol]),Hl=v.useCallback(async H=>{if(!H.coordinator_parts){dt([]);return}try{const D=await tt($.tasksByParent(H.project_id||"",H.id));dt(D.tasks||[])}catch{dt([])}},[]),dl=v.useCallback(async H=>{try{const D=await tt($.taskFollowups(H));ze(D.followups||[])}catch{ze([])}},[]),Bl=v.useCallback(async H=>{try{const D=await tt($.taskChatHistory(H));_l(D)}catch{_l(null)}},[]),Ye=v.useCallback(async H=>{var Z;const D=H||((Z=ne.current)==null?void 0:Z.id);if(D)try{const J=await tt($.taskReviews(D));it(J.reviews||[]),Kt("")}catch(J){Kt("评审队列加载失败:"+J.message)}},[]),Vt=v.useCallback(async H=>{var Z;const D=H||((Z=ne.current)==null?void 0:Z.id);if(D)try{const J=await tt($.taskApprovals(D));R(J.approvals||[])}catch(J){K("审批队列加载失败:"+J.message)}},[]),ll=v.useCallback(async H=>{try{const D=await tt($.taskMessages(H));ht(D.messages||[])}catch{ht([])}},[]),ml=v.useCallback(async H=>{try{const D=await tt($.taskThread(H)),Z=D.thread||D;let J=Z.turns;J==null&&(J=Z.turn_count),J==null&&(J=Z.turns_count),ge("id "+(Z.id||H)+" | 名字 "+(Z.name||Z.thread_name||"")+" | 归档 "+(Z.archived===void 0||Z.archived===null?"":Z.archived?"是":"否")+" | cwd "+(Z.cwd||"")+(J!=null?" | turn 数 "+J:""))}catch(D){ge("线程加载失败:"+D.message)}},[]),ql=v.useCallback(async H=>{try{const D=await tt($.taskThreads(H));Re(D.threads||[])}catch{Re([])}},[]),Za=v.useCallback(H=>{const D=["completed","failed","interrupted"].includes(H);Ul(D?"终态任务,线程操作可用":"仅终态任务可操作线程,当前状态 "+H+",按钮已置灰")},[]),It=v.useCallback(async(H,D)=>{if(qe(),$t([]),mt(""),C(""),su.includes(D)){try{const w=await tt($.taskTrace(H));$t(w.entries||[]),mt(w.note||""),C(w.status||"")}catch(w){mt("链路加载失败:"+w.message)}return}const Z=new AbortController;el.current=Z;let J=[];const Ct={};let Nl="",De=!1,z="";try{const w={},W=El();W&&(w["X-API-Key"]=W);const qt=await fetch($.taskTraceStream(H),{headers:w,signal:Z.signal});if(!qt.ok){let ya="HTTP "+qt.status;try{const Il=await qt.json();Il&&Il.error&&(ya=Il.error)}catch{}throw qt.status===401&&(ya+="(key 未填或无效)"),new Error(ya)}const Zt=qt.body.getReader(),je=new TextDecoder;let Ue="";for(;;){const ya=await Zt.read();if(ya.done)break;Ue+=je.decode(ya.value,{stream:!0});const Il=Ue.split(` +`),je+=JSON.stringify(W,null,2).slice(0,4e3),Ul(je),ge("已返回登录信息,见下方")}catch(W){ge("发起失败:"+W.message)}},[]),Ct=v.useCallback(async()=>{const z=at.trim();if(!z){lt("请填要查配额的用户 id");return}try{const w=await tt($.adminQuotaUser(z));lt("用户 "+z.slice(0,8)+":本月用量 "+sr(w.used_usd_micros)+" / 配额 "+sr(w.quota_usd_micros)+(w.remaining_usd_micros!==null&&w.remaining_usd_micros!==void 0?"(剩余 "+sr(w.remaining_usd_micros)+")":"")+" | 月份 "+(w.month||""))}catch(w){lt(ir(w))}},[at]),Nl=v.useCallback(async()=>{if(window.confirm("确定手动触发 sweep 吗?超阈值的陈旧 running 任务会被标为 interrupted。"))try{const w=(await tt($.adminSweep,"POST",{})).swept||[];lt("sweep 完成,清理 "+w.length+" 个任务"+(w.length?":"+w.join("、"):""))}catch(z){lt(ir(z))}},[]),De=v.useCallback(async()=>{try{const z=await tt($.adminBackup,"POST",{});lt("备份完成:backend="+z.backend+" | 路径 "+z.path+" | 大小 "+z.size_bytes+" 字节 | 任务 "+z.task_count+" 行")}catch(z){lt(ir(z))}},[]);return{keySaved:c,keyState:m,quotaText:_,healthText:N,adminGate:Q,adminBody:G,adminResult:B,adminUserId:at,setAdminUserId:I,projects:V,projectId:Mt,setProjectId:te,projectMsg:nt,githubRepos:ee,workers:yt,workersSummary:de,workersError:Ft,members:tl,memberMsg:Y,memberError:et,skills:gt,apps:Me,mcpServers:y,skillMsg:F,skillError:St,mcpMsg:Et,mcpOauthMsg:ut,mcpOauthBox:Va,envs:Ze,envCount:zt,envMsg:Fl,envRepoLine:ha,envRepoBar:el,envRepoMsg:ne,envSelect:ol,setEnvSelect:Se,models:Hl,modelCustomVisible:Bl,refreshHealth:ml,loadQuota:ql,probeAdmin:Za,refreshProjects:$t,loadGithubRepos:Wl,loadRelayModels:yn,refreshWorkers:gn,refreshEnvs:Ke,refreshMembers:La,refreshSkills:va,saveKeyInput:ru,clearKeyInput:ou,createProject:$l,createEnv:pe,archiveEnv:hl,saveEnvRepo:be,inviteMember:H,changeMemberRole:D,reloadMcp:Z,mcpOauth:J,adminQuota:Ct,adminSweep:Nl,adminBackup:De}}function Ly(){const[c,r]=v.useState([]),[m,o]=v.useState(""),[_,M]=v.useState(""),[N,x]=v.useState(""),[Q,U]=v.useState(""),G=v.useCallback(async(at,I)=>{const V=at!==void 0?at:I;if(!V){r([]);return}try{const dt=await tt($.tasks(V));r(dt.tasks||[]),o("")}catch(dt){o("加载失败:"+dt.message)}},[]),b=v.useMemo(()=>{const at=Q.trim().toLowerCase();return c.filter(I=>!(_&&I.status!==_||N&&(I.executor||"")!==N||at&&!((I.id||"")+" "+(I.prompt||"")).toLowerCase().includes(at)))},[c,_,N,Q]),B=b.length+" 个任务(共 "+c.length+" 个)",lt=v.useCallback(async(at,I)=>{const V={...at};I.length&&(V.upload_id=await ky(I));const dt=await tt($.tasksCreate,"POST",V);return"任务已建:"+Oe(dt.id)},[]);return{tasks:c,taskError:m,statusFilter:_,setStatusFilter:M,executorFilter:N,setExecutorFilter:x,searchText:Q,setSearchText:U,filteredTasks:b,taskCountText:B,refreshTasks:G,dispatch:lt}}function Ky(c,r){const[m,o]=v.useState(null),[_,M]=v.useState(""),[N,x]=v.useState(""),[Q,U]=v.useState(""),[G,b]=v.useState(""),[B,lt]=v.useState(!1),[at,I]=v.useState(""),[V,dt]=v.useState([]),[Mt,te]=v.useState([]),[nt,kt]=v.useState(""),[ee,it]=v.useState([]),[yt,le]=v.useState(""),[de,Kt]=v.useState(""),[Ft,Wt]=v.useState([]),[tl,mt]=v.useState(""),[Y,C]=v.useState(""),[et,Tt]=v.useState(""),[gt,ce]=v.useState(""),[Me,ze]=v.useState([]),[y,R]=v.useState([]),[F,K]=v.useState(""),[St,ht]=v.useState([]),[Et,X]=v.useState(""),[ut,ge]=v.useState(""),[Va,Ul]=v.useState(""),[Ze,Gt]=v.useState(""),[zt,Re]=v.useState([]),[Fl,ae]=v.useState(""),[ha,_l]=v.useState(null),el=v.useRef(null),Le=v.useRef(null),ne=v.useRef(null);ne.current=m;const qe=v.useCallback(()=>{if(el.current){try{el.current.abort()}catch{}el.current=null}Le.current&&(clearTimeout(Le.current),Le.current=null)},[]),ol=v.useCallback(async H=>{try{const D=await tt($.taskAgents(H));te(D.agents||[]),kt(D.note||"")}catch(D){te([]),kt("子代理链路加载失败:"+D.message)}},[]),Se=v.useCallback(H=>{Le.current&&clearTimeout(Le.current),Le.current=setTimeout(()=>void ol(H),1e3)},[ol]),Hl=v.useCallback(async H=>{if(!H.coordinator_parts){dt([]);return}try{const D=await tt($.tasksByParent(H.project_id||"",H.id));dt(D.tasks||[])}catch{dt([])}},[]),dl=v.useCallback(async H=>{try{const D=await tt($.taskFollowups(H));ze(D.followups||[])}catch{ze([])}},[]),Bl=v.useCallback(async H=>{try{const D=await tt($.taskChatHistory(H));_l(D)}catch{_l(null)}},[]),Ye=v.useCallback(async H=>{var Z;const D=H||((Z=ne.current)==null?void 0:Z.id);if(D)try{const J=await tt($.taskReviews(D));it(J.reviews||[]),Kt("")}catch(J){Kt("评审队列加载失败:"+J.message)}},[]),Vt=v.useCallback(async H=>{var Z;const D=H||((Z=ne.current)==null?void 0:Z.id);if(D)try{const J=await tt($.taskApprovals(D));R(J.approvals||[])}catch(J){K("审批队列加载失败:"+J.message)}},[]),ll=v.useCallback(async H=>{try{const D=await tt($.taskMessages(H));ht(D.messages||[])}catch{ht([])}},[]),ml=v.useCallback(async H=>{try{const D=await tt($.taskThread(H)),Z=D.thread||D;let J=Z.turns;J==null&&(J=Z.turn_count),J==null&&(J=Z.turns_count),ge("id "+(Z.id||H)+" | 名字 "+(Z.name||Z.thread_name||"")+" | 归档 "+(Z.archived===void 0||Z.archived===null?"":Z.archived?"是":"否")+" | cwd "+(Z.cwd||"")+(J!=null?" | turn 数 "+J:""))}catch(D){ge("线程加载失败:"+D.message)}},[]),ql=v.useCallback(async H=>{try{const D=await tt($.taskThreads(H));Re(D.threads||[])}catch{Re([])}},[]),Za=v.useCallback(H=>{const D=["completed","failed","interrupted"].includes(H);Ul(D?"终态任务,线程操作可用":"仅终态任务可操作线程,当前状态 "+H+",按钮已置灰")},[]),$t=v.useCallback(async(H,D)=>{if(qe(),Wt([]),mt(""),C(""),su.includes(D)){try{const w=await tt($.taskTrace(H));Wt(w.entries||[]),mt(w.note||""),C(w.status||"")}catch(w){mt("链路加载失败:"+w.message)}return}const Z=new AbortController;el.current=Z;let J=[];const Ct={};let Nl="",De=!1,z="";try{const w={},W=El();W&&(w["X-API-Key"]=W);const qt=await fetch($.taskTraceStream(H),{headers:w,signal:Z.signal});if(!qt.ok){let ya="HTTP "+qt.status;try{const Il=await qt.json();Il&&Il.error&&(ya=Il.error)}catch{}throw qt.status===401&&(ya+="(key 未填或无效)"),new Error(ya)}const Zt=qt.body.getReader(),je=new TextDecoder;let Ue="";for(;;){const ya=await Zt.read();if(ya.done)break;Ue+=je.decode(ya.value,{stream:!0});const Il=Ue.split(` `);Ue=Il.pop()||"";for(const uc of Il){const du=uc.split(` `).filter(we=>we.indexOf("data: ")===0).map(we=>we.slice(6)).join(` -`);if(du)try{const we=JSON.parse(du);if(we.type==="snapshot")J=we.entries||[],Object.keys(Ct).forEach(He=>delete Ct[He]),J.forEach((He,cc)=>{He.id&&(Ct[He.id]=cc)}),Nl=we.note||"",$t([...J]),mt(Nl),Se(H);else if(we.type==="entry"){const He=we.entry;He.id&&He.id in Ct?J[Ct[He.id]]=He:(He.id&&(Ct[He.id]=J.length),J.push(He)),$t([...J]),Se(H)}else we.type==="done"&&(De=!0,z=we.status,C(z))}catch{}}if(De)break}}catch(w){if(w&&w.name==="AbortError")return;mt("链路流中断:"+w.message);return}De&&r()},[qe,Se,r]),Wl=v.useCallback(async H=>{qe();try{const D=await tt($.task(H));o(D);let Z="";D.result_text&&(Z+=`=== result === +`);if(du)try{const we=JSON.parse(du);if(we.type==="snapshot")J=we.entries||[],Object.keys(Ct).forEach(He=>delete Ct[He]),J.forEach((He,cc)=>{He.id&&(Ct[He.id]=cc)}),Nl=we.note||"",Wt([...J]),mt(Nl),Se(H);else if(we.type==="entry"){const He=we.entry;He.id&&He.id in Ct?J[Ct[He.id]]=He:(He.id&&(Ct[He.id]=J.length),J.push(He)),Wt([...J]),Se(H)}else we.type==="done"&&(De=!0,z=we.status,C(z))}catch{}}if(De)break}}catch(w){if(w&&w.name==="AbortError")return;mt("链路流中断:"+w.message);return}De&&r()},[qe,Se,r]),Wl=v.useCallback(async H=>{qe();try{const D=await tt($.task(H));o(D);let Z="";D.result_text&&(Z+=`=== result === `+D.result_text.slice(0,8e3)+` `),D.error_text&&(Z+=`=== error === `+D.error_text.slice(0,8e3)+` -`),Z||(Z="(暂无 result/error 输出)"),M(Z),b(""),lt(!1),I(""),X(""),Gt(""),Za(D.status);const J=c(D.project_id),Ct=J==="maintainer"||J==="owner",Nl=J==="contributor"||Ct,De=su.includes(D.status),z=[];["failed","interrupted","merge-failed"].includes(D.status)&&Ct||z.push("重试:不可用——仅 failed/interrupted/merge-failed 可重试"+(Ct?"":",且仅 maintainer 可重试")),!De&&Nl||z.push("取消:不可用——"+(De?"终态任务不可取消":"仅项目成员(contributor 及以上)可取消")),D.status==="completed"&&Ct||z.push("合并:不可用——仅 completed 可合并"+(Ct?"":",且仅 maintainer 可合并")),D.status==="merged"&&Ct||z.push("提 PR:不可用——仅 merged 可提 PR"+(Ct?"":",且仅 maintainer 可提 PR")),U(z.join(";")),x(""),It(H,D.status),ol(H),Hl(D),Bl(H),dl(H),ll(H),ml(H),ql(H),Ye(H),Vt(H)}catch(D){o(null),M("加载失败:"+D.message)}},[qe,It,ol,Hl,Bl,dl,ll,ml,ql,Ye,Vt,c]),yn=v.useCallback(async()=>{const H=ne.current;if(H){try{const D=await tt($.task(H.id));o(D);let Z="";D.result_text&&(Z+=`=== result === +`),Z||(Z="(暂无 result/error 输出)"),M(Z),b(""),lt(!1),I(""),X(""),Gt(""),Za(D.status);const J=c(D.project_id),Ct=J==="maintainer"||J==="owner",Nl=J==="contributor"||Ct,De=su.includes(D.status),z=[];["failed","interrupted","merge-failed"].includes(D.status)&&Ct||z.push("重试:不可用——仅 failed/interrupted/merge-failed 可重试"+(Ct?"":",且仅 maintainer 可重试")),!De&&Nl||z.push("取消:不可用——"+(De?"终态任务不可取消":"仅项目成员(contributor 及以上)可取消")),D.status==="completed"&&Ct||z.push("合并:不可用——仅 completed 可合并"+(Ct?"":",且仅 maintainer 可合并")),D.status==="merged"&&Ct||z.push("提 PR:不可用——仅 merged 可提 PR"+(Ct?"":",且仅 maintainer 可提 PR")),U(z.join(";")),x(""),$t(H,D.status),ol(H),Hl(D),Bl(H),dl(H),ll(H),ml(H),ql(H),Ye(H),Vt(H)}catch(D){o(null),M("加载失败:"+D.message)}},[qe,$t,ol,Hl,Bl,dl,ll,ml,ql,Ye,Vt,c]),yn=v.useCallback(async()=>{const H=ne.current;if(H){try{const D=await tt($.task(H.id));o(D);let Z="";D.result_text&&(Z+=`=== result === `+D.result_text.slice(0,8e3)+` `),D.error_text&&(Z+=`=== error === `+D.error_text.slice(0,8e3)+` -`),M(Z||"(暂无 result/error 输出)")}catch{}dl(H.id),Bl(H.id),Ye(H.id),Vt(H.id),Hl(H),ol(H.id),ll(H.id),ml(H.id),ql(H.id)}},[dl,Bl,Ye,Vt,Hl,ol,ll,ml,ql]),gn=v.useCallback(async H=>{const D=ne.current;if(!D)return;const Z={cancel:"确定取消该任务吗?",merge:"确定把 completed 任务标为 merged 吗?",pr:"确定为该任务提 PR 吗?(会在仓库真实建 PR)"};if(!(Z[H]&&!window.confirm(Z[H])))try{const J=await tt($.taskAction(D.id,H),"POST",{});x(H+" 已提交:"+JSON.stringify(J).slice(0,300)),r(),await Wl(D.id)}catch(J){x(H+" 失败:"+J.message)}},[Wl,r]),Ke=v.useCallback(async()=>{const H=ne.current;if(H)try{const D=await tt($.taskCost(H.id));b(JSON.stringify(D,null,2).slice(0,4e3))}catch(D){b("查成本失败:"+D.message)}},[]),La=v.useCallback(async H=>{const D=ne.current;if(D){if(!H.trim()){I("分支消息必填");return}if(!su.includes(D.status)){I("仅终态任务可分支");return}try{const Z=await tt($.taskFork(D.id),"POST",{message:H.trim()});I("分支任务已建:"+Z.id.slice(0,8)),r()}catch(Z){I("分支失败:"+Z.message)}}},[r]),va=v.useCallback(async H=>{const D=ne.current;if(D)try{await tt($.taskReviews(D.id),"POST",H),le("评审已登记(requested)"),await Ye(D.id)}catch(Z){le("登记评审需求失败:"+Z.message)}},[Ye]),ru=v.useCallback(H=>{const D=ne.current;if(!D)return;const Z=window.prompt("输入该条评审的 findings(将写回记录并标为 completed):");Z!==null&&tt($.taskReviewFindings(D.id,H),"POST",{findings:Z}).then(()=>void Ye(D.id)).catch(J=>le("写 findings 失败:"+J.message))},[Ye]),ou=v.useCallback((H,D)=>{const Z=ne.current;if(!Z)return;const J=D==="approved"?"approve":"deny";tt($.taskApprovalDecision(Z.id,H,J),"POST",{}).then(()=>{K("已记录"+(D==="approved"?"允许":"拒绝")+"(当前版本只留回执,不拦截实时行为)"),Vt(Z.id)}).catch(Ct=>K("决定失败:"+Ct.message))},[Vt]),$l=v.useCallback(async(H,D,Z)=>{const J=ne.current;if(J){if(!D.trim()){X("目标任务 id 不能为空");return}if(!Z.trim()){X("消息正文不能为空");return}try{const Ct=await tt($.taskMessagesTo(D.trim()),"POST",{from_task_id:J.id,body:Z.trim(),mode:H});X("已发送("+Ct.delivery+")"),await ll(J.id)}catch(Ct){X("发送失败:"+Ct.message)}}},[ll]),pe=v.useCallback((H,D)=>{const Z=ne.current;if(!Z)return;if(!["completed","failed","interrupted"].includes(Z.status)){Gt("仅 completed/failed/interrupted 任务可操作线程(merged/merge-failed 不可改,服务端同样 409)");return}const J={};if(H==="rename"){if(!D.trim()){Gt("新线程名不能为空");return}J.name=D.trim()}tt($.taskThreadAction(Z.id,H),"POST",J).then(Ct=>{Gt(H+" 已提交:"+JSON.stringify(Ct).slice(0,300)),ml(Z.id),ql(Z.id)}).catch(Ct=>Gt(H+" 失败:"+Ct.message))},[ml,ql]),hl=v.useCallback(async H=>{const D=ne.current;if(!D)return;const Z=H.trim();if(!Z){ae("消息不能为空");return}try{su.includes(D.status)&&D.status!=="merged"?(await tt($.taskContinue(D.id),"POST",{message:Z}),ae("已重新排队,同一会话继续"),r(),await Wl(D.id)):["queued","running"].includes(D.status)?(await tt($.taskFollowups(D.id),"POST",{body:Z,mode:"direct"}),ae("已直接发送"),await dl(D.id),await Bl(D.id)):ae("merged/merge-failed 任务不可继续,也不可发后续消息")}catch(J){ae("发送失败:"+J.message)}},[Wl,r,dl,Bl]),be=v.useCallback(async()=>{const H=ne.current;if(!H){ce("先选一个任务");return}try{const D=await tt($.taskTrace(H.id)),Z=new Blob([JSON.stringify({task_id:H.id,status:D.status,note:D.note||"",count:(D.entries||[]).length,entries:D.entries||[]},null,2)],{type:"application/json"}),J=document.createElement("a");J.href=URL.createObjectURL(Z),J.download="trace-"+H.id.slice(0,8)+".json",document.body.appendChild(J),J.click(),J.remove(),setTimeout(()=>URL.revokeObjectURL(J.href),1e3),ce("已下载完整链路 "+(D.entries||[]).length+" 条")}catch(D){ce("下载失败:"+D.message)}},[]);return v.useEffect(()=>()=>qe(),[qe]),{currentTask:m,detailBody:_,actionMsg:N,actionReasons:Q,costBox:G,forkVisible:B,setForkVisible:lt,forkMsg:at,coordChildren:V,agents:Mt,agentsNote:nt,reviews:ee,reviewMsg:yt,reviewError:de,traceEntries:Wt,traceNote:tl,traceDone:Y,traceKind:et,setTraceKind:Tt,traceMsg:gt,followups:Me,approvals:y,approvalMsg:F,peerMessages:St,peerMsg:Et,threadText:ut,threadGateNote:Va,threadMsg:Ze,threadList:zt,chatMsg:Fl,chatHistory:ha,showDetail:Wl,refreshDetailLists:yn,doAction:gn,taskCost:Ke,forkTask:La,postReview:va,submitFindings:ru,decideApproval:ou,postPeer:$l,threadAction:pe,sendChatMessage:hl,downloadTrace:be,refreshReviews:()=>void Ye(),refreshApprovals:()=>void Vt()}}function Jy(c){const[r,m]=v.useState([]),[o,_]=v.useState(""),[M,N]=v.useState(null),[x,Q]=v.useState(""),U=v.useCallback(async lt=>{const at=lt!==void 0?lt:c();if(!at){m([]);return}try{const I=await tt($.projectAutomations(at));m(I.automations||[])}catch(I){_("自动化加载失败:"+I.message)}},[c]),G=v.useCallback(async(lt,at,I,V)=>{const dt=c();if(!dt){_("先选项目");return}if(!lt.trim()){_("自动化名称必填");return}if(!at.trim()){_("定时任务内容必填");return}const Mt={name:lt.trim(),prompt:at.trim()};I.trim()&&(Mt.interval_seconds=parseInt(I.trim(),10)),V.trim()&&(Mt.repo_url=V.trim());try{await tt($.projectAutomations(dt),"POST",Mt),_("自动化已创建(登记定义,到期后由执行器认领)"),await U(dt)}catch(Ft){_("创建失败:"+Ft.message)}},[c,U]),b=v.useCallback(lt=>{const at=c();at&&tt($.projectAutomationCancel(at,lt),"POST",{}).then(()=>{_("自动化已取消"),U(at)}).catch(I=>_("取消失败:"+I.message))},[c,U]),B=v.useCallback(async lt=>{const at=lt!==void 0?lt:c();if(!at){N(null);return}try{const I=await tt($.projectTriage(at));N(I),Q("")}catch(I){Q("分诊加载失败:"+I.message)}},[c]);return{automations:r,autoMsg:o,triage:M,triageError:x,refreshAutomations:U,createAutomation:G,cancelAutomation:b,refreshTriage:B}}function Fy(c,r){const m=v.useRef(c);m.current=c,v.useEffect(()=>{const o=setInterval(()=>{const _=document.activeElement;m.current(_?_.tagName==="SELECT":!1)},r);return()=>clearInterval(o)},[r])}function Wy(c,r){const m=v.useRef(c);m.current=c,v.useEffect(()=>{const o=setInterval(()=>m.current(),r);return()=>clearInterval(o)},[r])}function $y(c){const r=m=>String(m).padStart(2,"0");return r(c.getHours())+":"+r(c.getMinutes())+":"+r(c.getSeconds())}function Iy(){var I;const c=Zy(),r=Ly(),m=v.useRef("");m.current=c.projectId;const o=v.useCallback(()=>m.current,[]),_=Jy(o),M=v.useCallback(V=>{const dt=c.projects.find(Mt=>Mt.id===V);return dt&&dt.my_role||null},[c.projects]),N=v.useCallback(()=>{r.refreshTasks(void 0,m.current)},[r]),x=Ky(M,N),[Q,U]=v.useState("--:--:--"),G=v.useCallback(V=>{c.setProjectId(V),m.current=V,r.refreshTasks(V),c.refreshEnvs(V),c.refreshMembers(V),c.refreshSkills(V),_.refreshAutomations(V),_.refreshTriage(V)},[c,r,_]),b=(I=c.projects[0])==null?void 0:I.id;v.useEffect(()=>{!c.projectId&&b&&G(b)},[c.projectId,b,G]);const B=v.useCallback(V=>{c.saveKeyInput(V),V.trim()&&(c.refreshHealth(),c.refreshProjects(),c.refreshWorkers(),m.current&&(r.refreshTasks(m.current),c.refreshEnvs(m.current),c.refreshMembers(m.current)),c.loadRelayModels(),c.loadQuota(),c.loadGithubRepos(),c.probeAdmin())},[c,r]),lt=v.useCallback(V=>{if(U($y(new Date)),!El()){c.refreshHealth();return}r.refreshTasks(void 0,m.current),c.refreshHealth(),c.loadQuota(),c.refreshWorkers(),c.refreshMembers(),c.refreshSkills(),_.refreshAutomations(),_.refreshTriage(),x.refreshDetailLists(),V||(c.refreshProjects(),c.refreshEnvs())},[c,r,_,x]),at=v.useCallback(()=>{El()&&(c.loadRelayModels(),c.loadGithubRepos())},[c]);return v.useEffect(()=>{c.refreshHealth(),c.refreshProjects(),c.refreshWorkers(),c.loadQuota(),c.loadGithubRepos(),El()&&c.loadRelayModels(),c.probeAdmin()},[]),{keySaved:c.keySaved,keyState:c.keyState,saveKeyInput:B,clearKeyInput:c.clearKeyInput,quotaText:c.quotaText,healthText:c.healthText,refreshHealth:c.refreshHealth,adminGate:c.adminGate,adminBody:c.adminBody,adminResult:c.adminResult,adminUserId:c.adminUserId,setAdminUserId:c.setAdminUserId,adminQuota:c.adminQuota,adminSweep:c.adminSweep,adminBackup:c.adminBackup,projects:c.projects,projectId:c.projectId,projectMsg:c.projectMsg,selectProject:G,refreshProjects:c.refreshProjects,createProject:c.createProject,githubRepos:c.githubRepos,workers:c.workers,workersSummary:c.workersSummary,workersError:c.workersError,refreshWorkers:c.refreshWorkers,members:c.members,memberMsg:c.memberMsg,memberError:c.memberError,refreshMembers:()=>void c.refreshMembers(),inviteMember:c.inviteMember,changeMemberRole:c.changeMemberRole,skills:c.skills,apps:c.apps,mcpServers:c.mcpServers,skillMsg:c.skillMsg,skillError:c.skillError,mcpMsg:c.mcpMsg,mcpOauthMsg:c.mcpOauthMsg,mcpOauthBox:c.mcpOauthBox,refreshSkills:()=>void c.refreshSkills(),reloadMcp:c.reloadMcp,mcpOauth:c.mcpOauth,envs:c.envs,envCount:c.envCount,envMsg:c.envMsg,envRepoLine:c.envRepoLine,envRepoBar:c.envRepoBar,envRepoMsg:c.envRepoMsg,envSelect:c.envSelect,setEnvSelect:c.setEnvSelect,refreshEnvs:()=>void c.refreshEnvs(),createEnv:c.createEnv,archiveEnv:c.archiveEnv,saveEnvRepo:c.saveEnvRepo,models:c.models,modelCustomVisible:c.modelCustomVisible,tasks:r.tasks,taskCountText:r.taskCountText,taskError:r.taskError,refreshTasks:()=>void r.refreshTasks(void 0,m.current),statusFilter:r.statusFilter,setStatusFilter:r.setStatusFilter,executorFilter:r.executorFilter,setExecutorFilter:r.setExecutorFilter,searchText:r.searchText,setSearchText:r.setSearchText,filteredTasks:r.filteredTasks,currentTask:x.currentTask,detailBody:x.detailBody,actionMsg:x.actionMsg,actionReasons:x.actionReasons,showDetail:V=>void x.showDetail(V),doAction:x.doAction,taskCost:x.taskCost,costBox:x.costBox,forkVisible:x.forkVisible,setForkVisible:x.setForkVisible,forkTask:x.forkTask,forkMsg:x.forkMsg,coordChildren:x.coordChildren,coordText:"",agents:x.agents,agentsNote:x.agentsNote,reviews:x.reviews,reviewMsg:x.reviewMsg,reviewError:x.reviewError,refreshReviews:x.refreshReviews,postReview:x.postReview,submitFindings:x.submitFindings,traceEntries:x.traceEntries,traceNote:x.traceNote,traceDone:x.traceDone,traceKind:x.traceKind,setTraceKind:x.setTraceKind,downloadTrace:x.downloadTrace,traceMsg:x.traceMsg,sendChatMessage:x.sendChatMessage,chatMsg:x.chatMsg,chatHistory:x.chatHistory,followups:x.followups,approvals:x.approvals,approvalMsg:x.approvalMsg,refreshApprovals:x.refreshApprovals,decideApproval:x.decideApproval,peerMessages:x.peerMessages,peerMsg:x.peerMsg,postPeer:x.postPeer,automations:_.automations,autoMsg:_.autoMsg,refreshAutomations:()=>void _.refreshAutomations(),createAutomation:_.createAutomation,cancelAutomation:_.cancelAutomation,triage:_.triage,triageError:_.triageError,refreshTriage:()=>void _.refreshTriage(),threadText:x.threadText,threadGateNote:x.threadGateNote,threadMsg:x.threadMsg,threadList:x.threadList,threadAction:x.threadAction,dispatch:async(V,dt)=>{const Mt=await r.dispatch(V,dt);return r.refreshTasks(m.current),Mt},dispatchMsg:"",refreshAll:lt,refreshSlow:at,refreshStamp:Q}}function iu({label:c,value:r,sub:m}){return s.jsxs("div",{className:"dash-card data-card",children:[s.jsx("div",{className:"dash-card-label",children:c}),s.jsx("div",{className:"dash-card-value",children:r}),s.jsx("div",{className:"muted",children:m})]})}function Py(){const c=Ot(),r=c.healthText==="未加载"?"未加载":c.healthText.includes("worker_ok=true")?"正常":c.healthText.includes("worker_ok=false")?"异常":c.healthText.includes("加载失败")?"加载失败":"未知",m=c.quotaText.match(/剩余 \$([0-9.]+)/),o=c.quotaText.includes("加载失败")?"加载失败":c.quotaText.includes("未填 key")||c.quotaText==="未加载"?"未加载":m?"$"+m[1]:"配额",_=["running","completed","failed","queued","merged","interrupted"].map(b=>c.tasks.filter(B=>B.status===b).length).map((b,B)=>["running","completed","failed","queued","merged","interrupted"][B]+" "+b).join(" | "),M=c.projects.find(b=>b.id===c.projectId),N=c.taskError?{value:"加载失败",sub:c.taskError}:c.projectId?{value:String(c.tasks.length),sub:c.taskCountText+" | "+_+(M?" | "+M.name:"")}:{value:"先选项目",sub:c.projectMsg||"项目加载后自动选第一个"};let x;if(c.workersError)x={value:"加载失败",sub:c.workersError};else if(c.workers===null)x={value:c.workersSummary||"未加载",sub:"完整 worker 清单仅全局管理员可见"};else{const b=c.workers.filter(B=>{if(B.alive!==void 0&&B.alive!==null)return!!B.alive;const lt=wh(B).age;return lt!==null&<<=120}).length;x={value:b+" 在线 / "+c.workers.length,sub:c.workers.length-b+" 离线"}}const Q=c.projectMsg.includes("加载失败")?{value:"加载失败",sub:c.projectMsg}:{value:c.projects.length+" 个",sub:M?"当前项目:"+M.name:"未选项目(加载后自动选第一个)"},U=[c.envMsg,c.memberError,c.skillError].filter(b=>b&&b.includes("失败")),G=c.projectId?U.length?{value:"部分加载失败",sub:U.join(" | ")}:{value:c.envs.length+" 个环境",sub:c.members.length+" 成员 | "+c.skills.length+" 技能 | "+c.apps.length+" 应用 | "+c.mcpServers.length+" MCP"}:{value:"先选项目",sub:"选项目后显示环境 / 成员 / 技能计数"};return s.jsxs("section",{className:"dash-cards","aria-label":"数据卡片",children:[s.jsx(iu,{label:"健康",value:r,sub:c.healthText}),s.jsx(iu,{label:"配额",value:o,sub:c.quotaText}),s.jsx(iu,{label:"任务",value:N.value,sub:N.sub}),s.jsx(iu,{label:"Workers",value:x.value,sub:x.sub}),s.jsx(iu,{label:"项目",value:Q.value,sub:Q.sub}),s.jsx(iu,{label:"项目数据",value:G.value,sub:G.sub})]})}function Ve({id:c,className:r,title:m,children:o}){return s.jsxs("section",{id:c,className:"card"+(r?" "+r:""),children:[m?s.jsx("h2",{children:m}):null,o]})}function Dt({children:c}){return s.jsx("div",{className:"bar",children:c})}function Dl({items:c,empty:r}){return c.length?s.jsx("ul",{className:"data-list",children:c.map((m,o)=>s.jsx("li",{children:m},o))}):s.jsx("div",{className:"muted",children:r||"(暂无)"})}function fu({children:c}){return s.jsx("ul",{className:"data-list",children:c})}function tg(){const c=Ot(),[r,m]=v.useState(""),[o,_]=v.useState(""),[M,N]=v.useState(!1),[x,Q]=v.useState(!1),[U,G]=v.useState(!1),[b,B]=v.useState("docker"),[lt,at]=v.useState(""),[I,V]=v.useState(""),[dt,Mt]=v.useState(""),[Ft,nt]=v.useState(""),[kt,ee]=v.useState(""),[it,yt]=v.useState(""),[le,de]=v.useState(""),Kt=v.useRef(null),Wt=v.useRef(null),$t=v.useRef(null),[tl,mt]=v.useState("");async function Y(){var Me,ze,y;if(mt(""),!c.projectId){mt("先选项目");return}if(!r.trim()){mt("prompt 必填");return}const C={project_id:c.projectId,prompt:r.trim()};c.envSelect&&(C.environment_id=c.envSelect),b&&(C.executor=b);const et=I.trim()||lt;et&&(C.model=et),dt&&(C.effort=dt);const Tt=it.trim()||kt;if(Tt&&(C.child_model=Tt),le&&(C.child_effort=le),Ft){if(Ft==="full"&&!window.confirm("完全访问 = 自动批准 + 不受工作区限制,agent 可读写工作区外路径。确认提交吗?"))return;C.approval=Ft}if(U){if(Ft==="full"){mt("计划模式不能与完全访问同用");return}if(M||x){mt("计划模式不能与 goal 模式同用");return}C.plan=1}x?(C.goal_mode=1,C.no_time_limit=1):M&&(C.goal_mode=1);const gt=o.trim();if(gt){try{C.coordinator_parts=JSON.parse(gt)}catch{mt("协调员子任务 JSON 解析失败");return}if(!Array.isArray(C.coordinator_parts)){mt("协调员子任务必须是数组");return}if(M||x||U){mt("协调员任务不能与 goal/计划模式同用:协调员任务本身不跑模型回合,请取消 goal/计划勾选,或清空协调员 JSON");return}}const ce=Vy(((Me=Kt.current)==null?void 0:Me.files)||null,((ze=Wt.current)==null?void 0:ze.files)||null,((y=$t.current)==null?void 0:y.files)||null);try{const R=await c.dispatch(C,ce);mt(R),m(""),_(""),Kt.current&&(Kt.current.value=""),Wt.current&&(Wt.current.value=""),$t.current&&($t.current.value="")}catch(R){mt("提交失败:"+((R==null?void 0:R.message)||String(R)))}}return s.jsxs(Ve,{id:"nav-newtask",className:"composer",title:"新建任务",children:[s.jsxs(Dt,{children:[s.jsxs("select",{"aria-label":"环境",value:c.envSelect,onChange:C=>c.setEnvSelect(C.target.value),children:[s.jsx("option",{value:"",children:"环境:不指定(走项目仓库)"}),c.envs.map(C=>s.jsxs("option",{value:C.id,disabled:C.status!=="ready",children:[C.name,"(",C.status,")"]},C.id))]}),s.jsxs("select",{"aria-label":"执行器",value:b,onChange:C=>B(C.target.value),children:[s.jsx("option",{value:"docker",children:"docker(默认,多用户下隔离最强)"}),s.jsx("option",{value:"local",children:"local"}),s.jsx("option",{value:"cloud",children:"cloud"})]}),s.jsxs("label",{children:[s.jsx("input",{type:"checkbox",checked:M,onChange:C=>N(C.target.checked)})," goal 模式"]}),s.jsxs("label",{children:[s.jsx("input",{type:"checkbox",checked:x,onChange:C=>Q(C.target.checked)})," goal 模式无敌版"]}),s.jsxs("label",{children:[s.jsx("input",{type:"checkbox",checked:U,onChange:C=>G(C.target.checked)})," 计划模式(只读)"]})]}),s.jsx("textarea",{className:"prompt stacked",placeholder:"任务 prompt(必填)",value:r,onChange:C=>m(C.target.value)}),s.jsx("textarea",{className:"coord stacked",placeholder:"协调员子任务 JSON(可选),留空为普通任务",value:o,onChange:C=>_(C.target.value)}),s.jsxs("div",{className:"muted",children:["协调员格式:[","{",'"name":"后端","prompt":"做后端"',"}",",","{",'"name":"前端","prompt":"做前端"',"}","];提交后 worker 并行建子任务、等齐、合流汇总。不能与 goal/计划模式同用。协调员与 goal/计划互斥:勾了 goal 或计划模式时不要填协调员 JSON,提交前会校验并拦截。子任务费用记父任务创建人账;父任务创建时按分工数预留配额,余额不足时整个父任务被挡下。"]}),s.jsxs(Dt,{children:[s.jsxs("select",{"aria-label":"模型",value:lt,onChange:C=>at(C.target.value),children:[s.jsx("option",{value:"",children:"模型:默认(跟随配置)"}),c.models.map(C=>s.jsx("option",{value:C,children:C},C))]}),c.modelCustomVisible?s.jsx("input",{type:"text",placeholder:"手动输入模型(中转列表取不到时用)",value:I,onChange:C=>V(C.target.value)}):null,s.jsxs("select",{"aria-label":"推理强度",value:dt,onChange:C=>Mt(C.target.value),children:[s.jsx("option",{value:"",children:"推理强度:默认(跟随配置)"}),Bh.map(C=>s.jsx("option",{value:C,children:C},C))]}),s.jsxs("select",{"aria-label":"权限",value:Ft,onChange:C=>nt(C.target.value),children:[s.jsx("option",{value:"",children:"权限:默认(跟随配置)"}),s.jsx("option",{value:"ask",children:"请求批准"}),s.jsx("option",{value:"auto",children:"帮我批准"}),s.jsx("option",{value:"full",children:"完全访问"})]})]}),s.jsxs(Dt,{children:[s.jsxs("select",{"aria-label":"子任务模型",value:kt,onChange:C=>ee(C.target.value),children:[s.jsx("option",{value:"",children:"子任务模型:跟随本任务模型"}),c.models.map(C=>s.jsx("option",{value:C,children:C},C))]}),s.jsx("input",{type:"text",placeholder:"子任务模型手动输入(中转列表里没有时填,如 gpt-6-luna;留空=跟随本任务模型)",value:it,onChange:C=>yt(C.target.value)}),s.jsxs("select",{"aria-label":"子任务强度",value:le,onChange:C=>de(C.target.value),children:[s.jsx("option",{value:"",children:"子任务强度:跟随本任务强度"}),Bh.map(C=>s.jsx("option",{value:C,children:C},C))]})]}),s.jsx("div",{className:"muted",children:"子任务模型/强度是派生默认:本任务用 marker task-create 或协调员分工派生的子任务,未显式写模型/强度时用它;块/分工里显式写了则覆盖它。也可以不在这里填、直接在 prompt 里写“子任务用 gpt-6-luna max”,建任务时服务端会解析成同一对字段(任务详情里可核对)。"}),M?s.jsx("div",{className:"muted",children:"goal 模式:输入框内容即目标,不需要专用 prompt 与验收命令;不限轮次,模型确认达成后在回复末尾输出“目标已达成”即结束,未达成会一直运行,可用取消停止。"}):null,x?s.jsx("div",{className:"muted",children:"goal 模式无敌版:goal 模式 + 任务不限时(去掉 worker/docker 总超时;单轮 600 秒护栏还在,不限的是任务总时长与总轮次)。服务端默认的自动续跑与断点镜像同时生效。"}):null,s.jsxs(Dt,{children:[s.jsx("span",{className:"muted",children:"附件(放进任务工作区,图片与普通文件不区分):"}),s.jsx("input",{ref:Kt,type:"file",multiple:!0,title:"文件"}),s.jsx("input",{ref:Wt,type:"file",multiple:!0,title:"文件夹",webkitdirectory:""}),s.jsx("input",{ref:$t,type:"file",accept:"image/*",multiple:!0,title:"图片"})]}),s.jsxs(Dt,{children:[s.jsx("button",{className:"seal",onClick:Y,children:"提交任务"}),s.jsx("span",{className:"muted",children:tl||c.dispatchMsg})]})]})}function eg({onNew:c}){const r=Ot();return s.jsxs("div",{children:[s.jsxs("div",{className:"search-box",children:[s.jsxs("svg",{viewBox:"0 0 24 24",width:"18",height:"18",fill:"none",stroke:"currentColor",strokeWidth:"1.8",strokeLinecap:"round","aria-hidden":"true",children:[s.jsx("circle",{cx:"11",cy:"11",r:"7"}),s.jsx("path",{d:"M21 21l-4.3-4.3"})]}),s.jsx("input",{type:"text",placeholder:"搜索","aria-label":"搜索任务",value:r.searchText,onChange:m=>r.setSearchText(m.target.value)})]}),s.jsx("div",{className:"bar",children:s.jsxs("select",{"aria-label":"项目",value:r.projectId,onChange:m=>r.selectProject(m.target.value),children:[r.projects.length===0?s.jsx("option",{value:"",children:"(先加载项目)"}):null,r.projects.map(m=>s.jsxs("option",{value:m.id,children:[m.name," (",Oe(m.id),")"]},m.id))]})}),s.jsxs("div",{className:"list-section-head",children:[s.jsx("span",{children:"主要聊天"}),s.jsx("button",{type:"button","aria-label":"派发新任务",title:"派发新任务",onClick:c,children:"+"})]}),s.jsxs("div",{className:"bar",children:[s.jsxs("select",{"aria-label":"状态筛选",value:r.statusFilter,onChange:m=>r.setStatusFilter(m.target.value),children:[s.jsx("option",{value:"",children:"状态:全部"}),["queued","running","completed","failed","interrupted","merged","merge-failed"].map(m=>s.jsx("option",{value:m,children:m},m))]}),s.jsxs("select",{"aria-label":"执行器筛选",value:r.executorFilter,onChange:m=>r.setExecutorFilter(m.target.value),children:[s.jsx("option",{value:"",children:"执行器:全部"}),s.jsx("option",{value:"local",children:"local"}),s.jsx("option",{value:"docker",children:"docker"}),s.jsx("option",{value:"cloud",children:"cloud"})]})]}),s.jsxs("div",{className:"bar",children:[s.jsx("button",{onClick:r.refreshTasks,children:"刷新"}),s.jsx("span",{className:"muted",children:r.taskCountText})]}),r.taskError?s.jsx("div",{className:"err",children:r.taskError}):r.projectId?r.filteredTasks.length===0?s.jsx("div",{className:"muted",children:r.tasks.length?"没有符合筛选条件的任务":"该项目暂无任务"}):s.jsx("ul",{className:"issue-list",children:r.filteredTasks.slice().reverse().map(m=>{var o;return s.jsxs("li",{className:"issue-item"+(((o=r.currentTask)==null?void 0:o.id)===m.id?" selected":""),onClick:()=>r.showDetail(m.id),children:[s.jsx("span",{className:"issue-state st-"+m.status,"aria-hidden":"true"}),s.jsxs("span",{children:[s.jsxs("div",{className:"issue-title",children:[m.plan?"[计划] ":"",m.forked_from?"[分支] ":"",m.coordinator_parts?"[协调] ":"",m.parent_task_id?"[协调子任务] ":"",String(m.prompt||Oe(m.id)).slice(0,60)]}),s.jsxs("div",{className:"issue-meta",children:[Oe(m.id)," · ",s.jsx("span",{className:"st-"+m.status,children:m.status})," · ",m.executor||"",m.updated_at?" · "+new Date(m.updated_at*1e3).toLocaleString():""]})]})]},m.id)})}):s.jsx("div",{className:"muted",children:"先选项目"})]})}function lg(c){const r=v.useRef(null),[m,o]=v.useState(!0),_=v.useRef(!0),M=()=>{const N=r.current;if(!N)return;const x=N.scrollHeight-N.scrollTop-N.clientHeight<80;_.current=x,o(x)};return v.useEffect(()=>{_.current&&r.current&&(r.current.scrollTop=r.current.scrollHeight)},[c]),{ref:r,following:m,onScroll:M}}function ag({msg:c}){if(c.role==="status")return s.jsx("div",{className:"chat-status",children:c.text});const r=c.label||(c.role==="user"?"用户":c.role==="assistant"?"助手":"工具");return s.jsxs("div",{className:"gh-comment "+c.role,children:[s.jsx("div",{className:"gh-comment-header",children:s.jsx("span",{className:"gh-comment-author",children:r})}),s.jsx("div",{className:"gh-comment-body",children:c.text})]})}function Gh({messages:c,empty:r}){const{ref:m,following:o,onScroll:_}=lg(c.length);return s.jsxs("div",{className:"chat-list",ref:m,onScroll:_,children:[c.length===0?s.jsx("div",{className:"muted",children:r||"(暂无消息)"}):c.map(M=>s.jsx(ag,{msg:M},M.id)),!o&&c.length>0?s.jsx("button",{className:"chat-follow",onClick:()=>{m.current&&(m.current.scrollTop=m.current.scrollHeight)},children:"回到最新 ↓"}):null]})}function ng({onSend:c,disabled:r,placeholder:m}){const[o,_]=v.useState(""),M=()=>{const N=o.trim();!N||r||(c(N),_(""))};return s.jsxs("div",{className:"gh-comment-box",children:[s.jsx("textarea",{"aria-label":"会话输入",rows:3,placeholder:m||"消息",value:o,disabled:r,onChange:N=>_(N.target.value),onKeyDown:N=>{N.key==="Enter"&&!N.shiftKey&&(N.preventDefault(),M())}}),s.jsx("div",{className:"gh-comment-footer",children:s.jsx("button",{type:"button",className:"primary","aria-label":"发送",disabled:r||!o.trim(),onClick:M,children:"发送"})})]})}function Qh(c,r){const m=c.id||"trace-"+r;if(c.kind==="message")return{id:m,role:"assistant",text:(c.phase?"["+c.phase+"] ":"")+(c.text||""),label:"助手"};if(c.kind==="exec"||c.kind==="file"||c.kind==="tool"||c.kind==="call"){const o=c.kind==="exec"?"命令":c.kind==="file"?"文件":c.kind==="tool"?"工具":"调用";return{id:m,role:"tool",text:fr(c),label:o}}return c.kind==="plan"?{id:m,role:"status",text:c.text||""}:c.kind==="reasoning"?{id:m,role:"status",text:"思考:"+(c.summary||"")}:c.kind==="agent-start"?{id:m,role:"status",text:"子代理开始:"+(c.name||"")+(c.prompt?"("+c.prompt+")":"")}:c.kind==="agent-done"?{id:m,role:"status",text:"子代理结束:"+(c.name||"")+" "+(c.status||"")}:{id:m,role:"status",text:fr(c)}}function ug(){const c=Ot(),r=v.useMemo(()=>{const m=c.currentTask,o=m&&m.prompt?[{id:"task-prompt",role:"user",text:m.prompt}]:[],M=(c.traceKind?c.traceEntries.filter(x=>x.kind===c.traceKind):c.traceEntries).map((x,Q)=>Qh(x,Q)),N=c.traceDone?[{id:"trace-done",role:"status",text:"链路已结束("+c.traceDone+")"}]:[];return[...o,...M,...N]},[c.currentTask,c.traceEntries,c.traceKind,c.traceDone]);return s.jsxs(s.Fragment,{children:[s.jsx("div",{className:"muted",children:"实时链路"}),s.jsxs(Dt,{children:[s.jsxs("select",{"aria-label":"链路类型",value:c.traceKind,onChange:m=>c.setTraceKind(m.target.value),children:[s.jsx("option",{value:"",children:"链路类型:全部"}),["exec","file","call","tool","message","reasoning","plan","agent-start","agent-done"].map(m=>s.jsx("option",{value:m,children:m==="exec"?"命令":m==="file"?"文件":m==="call"?"调用":m==="tool"?"工具":m==="message"?"消息":m==="reasoning"?"思考":m==="plan"?"计划":"子代理"},m))]}),s.jsx("button",{onClick:c.downloadTrace,children:"下载完整链路"}),s.jsx("span",{className:"muted",children:c.traceMsg})]}),c.traceNote?s.jsx("div",{children:s.jsx("span",{className:"err",children:c.traceNote})}):null,s.jsx("div",{className:"chat-column",children:s.jsx(Gh,{messages:r,empty:"(暂无链路条目)"})}),s.jsx("div",{className:"muted",children:"对话时间线:首条是本任务 prompt(用户);助手回复来自 message 条目,命令/文件/工具/调用是工具评论框,计划/思考/子代理开始结束是时间线上的状态文字。流式进行中时新条目实时追加;你在底部时自动跟随,往上翻时暂停跟随,点“回到最新”恢复。"})]})}function cg(){const c=Ot(),r=c.currentTask,m=v.useMemo(()=>{if(!r)return[];if(c.chatHistory)return c.chatHistory.messages.map(b=>({id:b.id,role:b.role,text:b.text,label:b.label}));const Q=r.prompt?[{id:"task-prompt",role:"user",text:r.prompt}]:[],U=c.traceEntries.filter(b=>b.kind==="message").map((b,B)=>Qh(b,B)),G=c.followups.map((b,B)=>({id:"followup-"+B,role:"user",text:String(b.body||""),label:"后续消息"}));return[...Q,...U,...G]},[r,c.chatHistory,c.traceEntries,c.followups]);if(!r)return s.jsx("div",{className:"muted",children:"点任务行查看详情后,这里显示继续会话"});const o=su.includes(r.status),_=["queued","running"].includes(r.status),M=o||_,N=o?"终态任务:发送走继续接口(同一会话再跑一轮)":_?"运行中/排队中:发送走后续消息直接发送(跑完当前轮后优先执行)":"merged/merge-failed 任务不可继续,也不可发后续消息",x=c.chatHistory?c.chatHistory.legacy_continue_count??null:null;return s.jsxs("div",{className:"chat-column",children:[x!==null&&x>0?s.jsxs("div",{className:"muted",children:["此前有 ",x," 条继续消息发生在持久化之前,未入库,上面历史不完整;部署后新发的继续消息会正常显示。"]}):null,c.chatHistory&&c.chatHistory.trace_note?s.jsx("div",{className:"muted",children:c.chatHistory.trace_note}):null,s.jsx(Gh,{messages:m,empty:"(暂无会话消息)"}),s.jsx(ng,{disabled:!M,placeholder:"消息",onSend:Q=>void c.sendChatMessage(Q)}),s.jsxs("div",{className:"muted",children:[N,"。",c.chatMsg]})]})}function ig(){return Ot().currentTask?s.jsxs("div",{className:"conversation",children:[s.jsx(ug,{}),s.jsx("div",{className:"conv-divider"}),s.jsx(cg,{})]}):s.jsx("div",{className:"conversation",children:s.jsx("div",{className:"muted",children:"在任务列表里点一条任务,对话和详情就切到该任务;也可以在上面派发一个新任务。"})})}function sg(){const c=Ot(),r=c.currentTask,[m,o]=v.useState("");if(!r)return null;const _=su.includes(r.status),M=["failed","interrupted","merge-failed"].includes(r.status);return s.jsxs(s.Fragment,{children:[s.jsxs(Dt,{children:[s.jsx("button",{disabled:!M,title:M?"":"仅 failed/interrupted/merge-failed 可重试",onClick:()=>c.doAction("retry"),children:"重试"}),s.jsx("button",{className:"danger",disabled:_,title:_?"终态任务不可取消":"",onClick:()=>c.doAction("cancel"),children:"取消"}),s.jsx("button",{disabled:r.status!=="completed",title:r.status!=="completed"?"仅 completed 可合并":"",onClick:()=>c.doAction("merge"),children:"合并(completed → merged)"}),s.jsx("button",{disabled:r.status!=="merged",title:r.status!=="merged"?"仅 merged 可提 PR":"",onClick:()=>c.doAction("pr"),children:"提 PR(须 merged)"}),_?s.jsx("button",{onClick:()=>c.setForkVisible(!0),children:"分支"}):null,s.jsx("button",{onClick:c.taskCost,children:"查成本"}),s.jsxs("span",{className:"muted",children:[c.actionMsg," ",c.actionReasons]})]}),c.forkVisible?s.jsxs("div",{children:[s.jsx("input",{type:"text",placeholder:"分支首轮消息(必填,带历史的新会话)",style:{width:"100%",boxSizing:"border-box",margin:"6px 0"},value:m,onChange:N=>o(N.target.value)}),s.jsxs(Dt,{children:[s.jsx("button",{className:"seal",onClick:async()=>{await c.forkTask(m),o("")},children:"创建分支任务"}),s.jsx("span",{className:"muted",children:c.forkMsg})]})]}):null]})}function fg(){const c=Ot(),[r,m]=v.useState("uncommittedChanges"),[o,_]=v.useState(""),[M,N]=v.useState(""),[x,Q]=v.useState("");return s.jsxs(s.Fragment,{children:[s.jsx("h3",{children:"评审队列"}),s.jsxs("select",{"aria-label":"评审目标",value:r,onChange:U=>m(U.target.value),children:[s.jsx("option",{value:"uncommittedChanges",children:"未提交改动(工作区)"}),s.jsx("option",{value:"baseBranch",children:"与分支的差异"}),s.jsx("option",{value:"commit",children:"指定提交"}),s.jsx("option",{value:"custom",children:"自定义评审指令"})]}),s.jsx("input",{className:"stacked",placeholder:"与分支的差异用:分支名(如 main)",style:{width:"100%"},value:o,onChange:U=>_(U.target.value)}),s.jsx("input",{className:"stacked",placeholder:"指定提交用:提交 sha",style:{width:"100%"},value:M,onChange:U=>N(U.target.value)}),s.jsx("textarea",{placeholder:"自定义评审指令用:评审指令正文",value:x,onChange:U=>Q(U.target.value)}),s.jsxs(Dt,{children:[s.jsx("button",{className:"primary",onClick:()=>void c.postReview({target_type:r,branch:o.trim()||void 0,sha:M.trim()||void 0,instructions:x.trim()||void 0}),children:"登记评审需求"}),s.jsx("button",{onClick:c.refreshReviews,children:"刷新队列"}),s.jsx("span",{className:"muted",children:c.reviewMsg})]}),s.jsx("div",{className:"muted",children:"本基线只登记评审需求(requested),不自动跑评审;评审是否执行、结果如何,以评审队列里的记录为准。"}),c.reviewError?s.jsx("div",{className:"muted",children:c.reviewError}):c.reviews.length===0?s.jsx("div",{className:"muted",children:"点任务行查看详情后,点“刷新队列”查看评审记录"}):s.jsx(fu,{children:c.reviews.map(U=>{let G=U.target_type||"";return U.branch&&(G+=":"+U.branch),U.sha&&(G+=":"+String(U.sha).slice(0,12)),U.instructions&&(G+=":"+String(U.instructions).slice(0,80)),s.jsxs("li",{children:[s.jsxs("span",{className:"row-main",children:[s.jsx("b",{children:"评审"})," ",Oe(U.id)," | ",G," | ",s.jsx("span",{className:"st-"+(U.status||""),children:U.status}),U.created_at?" | "+ka(U.created_at):"",s.jsx("br",{}),U.findings?String(U.findings).slice(0,1e3):s.jsx("span",{className:"muted",children:"(暂无 findings:评审尚未执行或尚未写回)"})]}),s.jsx("button",{onClick:()=>c.submitFindings(U.id),children:"写 findings"})]},U.id)})})]})}function rg(){const c=Ot();return c.currentTask?c.currentTask.coordinator_parts?c.coordChildren.length===0?s.jsx("div",{className:"muted",children:"(子任务尚未创建)"}):s.jsx(fu,{children:c.coordChildren.map(r=>s.jsx("li",{children:s.jsxs("span",{className:"row-main",children:["分工 ",s.jsx("b",{children:r.coordinator_part||""})," | 状态 ",s.jsx("span",{className:"st-"+r.status,children:r.status})," | ",Oe(r.id)," | ",String(r.prompt||"").slice(0,60)]})},r.id))}):s.jsx("div",{className:"muted",children:"(非协调员任务)"}):s.jsx("div",{className:"muted",children:"点任务行查看详情后,这里显示协调员的子任务"})}function og(){const c=Ot();if(!c.currentTask)return s.jsx("div",{className:"muted",children:"点任务行查看详情后,这里显示子代理链路"});if(c.agents.length===0)return s.jsxs("div",{className:"muted",children:["(暂无子代理)",c.agentsNote?s.jsx("span",{className:"err",children:c.agentsNote}):null]});const r={main:"主任务",delegate:"委派子任务",model:"模型子代理"},m={running:"进行中",completed:"已完成",failed:"失败",interrupted:"已中断",unknown:"未知"};return s.jsx(fu,{children:c.agents.map((o,_)=>s.jsx("li",{children:s.jsxs("span",{className:"row-main",children:[s.jsxs("b",{children:[r[o.kind||""]||o.kind||"",":"]}),o.name||""," ",s.jsx("span",{className:"st-"+(o.status||""),children:m[o.status||""]||o.status||"?"})," | 过程调用 "+(o.calls?o.calls.length:0)+" 条",o.updated_ts?" | 最近活动 "+ka(o.updated_ts/1e3):"",o.prompt?s.jsxs(s.Fragment,{children:[s.jsx("br",{}),s.jsxs("span",{className:"muted",children:["任务:",o.prompt]})]}):null,o.calls&&o.calls.length?s.jsxs(s.Fragment,{children:[s.jsx("br",{}),o.calls.slice(-50).map((M,N)=>s.jsx("div",{children:fr(M)},N))]}):s.jsxs(s.Fragment,{children:[s.jsx("br",{}),s.jsx("span",{className:"muted",children:"(暂无过程调用)"})]})]})},_))})}function dg(){const c=Ot();return s.jsxs(s.Fragment,{children:[s.jsxs(Dt,{children:[s.jsx("button",{onClick:c.refreshApprovals,children:"刷新审批队列"}),s.jsx("span",{className:"muted",children:c.approvalMsg})]}),s.jsx("div",{className:"muted",children:"待审批项需人工点记录允许或记录拒绝;超时默认拒绝。当前版本只留回执,不拦截实时行为(实时请求的事前拦截待 host 接入后生效,在此之前实时行为不变)。"}),s.jsx(Dl,{empty:"(暂无审批项)",items:c.approvals.map(r=>s.jsxs("span",{className:"row-main",children:["[",r.kind,"|",r.status,"] ",r.summary,["approved","denied","expired"].includes(r.status||"")?"|回执:"+(r.decision||r.status)+" by "+String(r.decided_by||"").slice(0,8)+" "+ka(r.decided_at):"",r.status==="pending"?s.jsxs(s.Fragment,{children:[" ",s.jsx("button",{onClick:()=>c.decideApproval(r.id,"approved"),children:"记录允许"})," ",s.jsx("button",{onClick:()=>c.decideApproval(r.id,"denied"),children:"记录拒绝"})]}):null]},r.id))})]})}function mg(){const c=Ot(),[r,m]=v.useState(""),[o,_]=v.useState("");return s.jsxs(s.Fragment,{children:[s.jsx("input",{placeholder:"目标任务 id(与本任务同项目;对方运行中排队执行、已终态则续跑复活,绝不打断当前轮)",style:{width:"100%"},value:r,onChange:M=>m(M.target.value)}),s.jsx("textarea",{placeholder:"消息正文(以本任务名义发出;对方 agent 会看到发送方任务 id,可照此回消息)",value:o,onChange:M=>_(M.target.value)}),s.jsxs(Dt,{children:[s.jsx("button",{onClick:async()=>{await c.postPeer("queued",r,o),_("")},children:"排队发给对方"}),s.jsx("button",{className:"primary",onClick:async()=>{await c.postPeer("direct",r,o),_("")},children:"直接发送"}),s.jsx("span",{className:"muted",children:c.peerMsg})]}),s.jsx(Dl,{empty:"(本任务尚未发出任务间消息)",items:c.peerMessages.map((M,N)=>s.jsxs("span",{className:"row-main",children:["[发给 ",String(M.task_id).slice(0,8),"|",M.mode,"|",M.status,"] ",String(M.body||"").slice(0,120)]},N))})]})}function hg(){const c=Ot(),[r,m]=v.useState(""),o=c.currentTask?["completed","failed","interrupted"].includes(c.currentTask.status):!1;return s.jsxs(s.Fragment,{children:[s.jsx("div",{className:"muted",children:c.threadText||"点任务行查看详情后,这里显示线程元数据"}),s.jsxs(Dt,{children:[s.jsx("input",{type:"text",placeholder:"新线程名",value:r,onChange:_=>m(_.target.value)}),s.jsx("button",{disabled:!o,onClick:()=>c.threadAction("rename",r),children:"重命名"}),s.jsx("button",{disabled:!o,onClick:()=>c.threadAction("archive",""),children:"归档"}),s.jsx("button",{disabled:!o,onClick:()=>c.threadAction("unarchive",""),children:"取消归档"}),s.jsx("button",{disabled:!o,onClick:()=>c.threadAction("compact",""),children:"压缩"}),s.jsx("span",{className:"muted",children:c.threadGateNote}),s.jsx("span",{className:"muted",children:c.threadMsg})]}),s.jsx(Dl,{empty:"暂无其他线程",items:c.threadList.map((_,M)=>s.jsxs("span",{className:"row-main",children:[_.name||_.thread_name||_.id||""," [",_.id||"","]",_.archived?" [已归档]":"",_.cwd?" "+_.cwd:""]},M))}),s.jsx("div",{className:"muted",children:"限制:Docker/异机任务线程操作一律 409;merged/merge-failed 不可改;turn/steer 与 review/start 不在本批。"})]})}function vg(){const c=Ot(),r=c.currentTask;return r?s.jsxs(Ve,{id:"nav-detail",title:"任务详情",children:[s.jsxs("div",{children:["状态 ",s.jsx("b",{className:"st-"+r.status,children:r.status}),"(",wy[r.status]||"未知状态",")",s.jsx("br",{}),"任务 ",r.id," | turn ",Oe(r.turn_id)," | root turn ",Oe(r.root_turn_id),s.jsx("br",{}),"executor ",r.executor||""," | 主机 ",r.worktree_host||"",s.jsx("br",{}),"模型 ",r.model||"默认"," | 强度 ",r.effort||"默认",r.child_model||r.child_effort?s.jsxs(s.Fragment,{children:[s.jsx("br",{}),"子任务默认 ",(r.child_model||"跟随本任务")+" / "+(r.child_effort||"跟随本任务")]}):null,s.jsx("br",{}),"权限 ",r.approval||"默认"," | 项目 ",Oe(r.project_id),s.jsx("br",{}),"更新 ",ka(r.updated_at),r.plan?s.jsxs(s.Fragment,{children:[s.jsx("br",{}),"计划模式(只读)"]}):null,r.forked_from?s.jsxs(s.Fragment,{children:[s.jsx("br",{}),"分支自 ",Oe(r.forked_from)]}):null,r.goal_mode?s.jsxs(s.Fragment,{children:[s.jsx("br",{}),r.no_time_limit?"goal 模式无敌版(不限时)":"goal 模式(不限轮次,模型宣告完成)"]}):r.verify_command?s.jsxs(s.Fragment,{children:[s.jsx("br",{}),"goal 模式(旧语义,验收命令)"]}):null,r.coordinator_parts?s.jsxs(s.Fragment,{children:[s.jsx("br",{}),"协调员:",r.coordinator_parts.length," 个子任务(",r.coordinator_parts.map(m=>m.name).join("、"),")"]}):null,r.parent_task_id?s.jsxs(s.Fragment,{children:[s.jsx("br",{}),"协调子任务,父任务 ",Oe(r.parent_task_id),r.coordinator_part?"("+r.coordinator_part+")":""]}):null,r.attachments&&r.attachments.length?s.jsxs(s.Fragment,{children:[s.jsx("br",{}),"附件:",r.attachments.join("、")]}):null,r.pr_url?s.jsxs(s.Fragment,{children:[s.jsx("br",{}),s.jsxs("a",{href:r.pr_url,target:"_blank",rel:"noopener noreferrer",children:["PR #",r.pr_number]})]}):null,s.jsx("br",{}),"prompt:",r.prompt||""]}),s.jsx(sg,{}),s.jsx("pre",{children:c.detailBody||"(暂无 result/error 输出)"}),c.costBox?s.jsx("pre",{children:c.costBox}):null,s.jsx("h3",{children:"协调子任务"}),s.jsx(rg,{}),s.jsx("h3",{children:"子代理链路"}),s.jsx(og,{}),s.jsx("h3",{children:"评审队列"}),s.jsx(fg,{}),s.jsx("h3",{children:"运行时审批队列"}),s.jsx(dg,{}),s.jsx("h3",{children:"给其他任务发消息"}),s.jsx(mg,{}),s.jsx("h3",{children:"线程"}),s.jsx(hg,{})]}):s.jsx(Ve,{id:"nav-detail",title:"任务详情",children:s.jsx("div",{className:"muted",children:"点任务行查看详情"})})}function yg(){const c=Ot(),[r,m]=v.useState(""),[o,_]=v.useState(""),[M,N]=v.useState([]),[x,Q]=v.useState(null),[U,G]=v.useState(!1),[b,B]=v.useState(""),[lt,at]=v.useState(""),I=v.useCallback(async()=>{if(!c.keySaved){N([]);return}try{const nt=await tt($.userKeys);N(nt.keys||[]),at("")}catch(nt){at(nt instanceof Error?nt.message:"加载 key 列表失败")}},[c.keySaved]);v.useEffect(()=>{I()},[I]);const V=async()=>{B(""),at(""),G(!1);try{const nt=await tt($.userKeys,"POST",{label:o.trim()||"api-key"});Q(nt),_(""),B("新 key 已生成,只显示一次:复制后请妥善保存。"),await I()}catch(nt){at(nt instanceof Error?nt.message:"生成 key 失败")}},dt=async()=>{if(x)try{await navigator.clipboard.writeText(x.api_key),G(!0)}catch{at("复制失败:请手动选中上方 key 文本复制")}},Mt=()=>{x&&(c.saveKeyInput(x.api_key),Q(null),B("已存为当前浏览器 key(原有 key 未被撤销,需要时可单独撤销)。"))},Ft=async nt=>{const kt=(()=>{try{return El().slice(-4)}catch{return""}})(),ee=nt.id==="legacy"?"(主 key:撤销后当前浏览器保存的 key 也可能随之失效,需重新登录拿新 key)":nt.hint&&nt.hint===kt?"(这就是本浏览器当前在用的 key,撤销后本页会立刻未连接)":"";if(window.confirm(`撤销 key「${nt.label}」(后 4 位 ${nt.hint||"无"})吗?${ee}撤销不可恢复。`)){B(""),at("");try{await tt($.userKey(nt.id),"DELETE"),B(`已撤销 key「${nt.label}」。`),await I()}catch(it){at(it instanceof Error?it.message:"撤销失败")}}};return s.jsxs(Ve,{id:"nav-key",title:"API Key",children:[s.jsxs(Dt,{children:[s.jsx("input",{type:"password",placeholder:"粘贴你的 X-API-Key(与调 API 用的同一个)",autoComplete:"off",value:r,onChange:nt=>m(nt.target.value)}),s.jsx("button",{className:"primary",onClick:()=>{c.saveKeyInput(r),m("")},children:"保存到本浏览器"}),s.jsx("button",{onClick:c.clearKeyInput,children:"清除"}),s.jsx("span",{className:"muted",children:c.keyState})]}),s.jsx("div",{children:s.jsx("span",{className:"muted",children:c.quotaText})}),!c.keySaved&&s.jsx("div",{children:s.jsx("span",{className:"muted",children:"先粘贴并保存已有 key,再生成或管理 key(生成接口本身也要用已有 key 鉴权)。"})}),c.keySaved&&s.jsxs(s.Fragment,{children:[s.jsxs(Dt,{children:[s.jsx("input",{placeholder:"新 key 备注(可选,默认 api-key,如 harness2-temp)",autoComplete:"off",value:o,onChange:nt=>_(nt.target.value)}),s.jsx("button",{className:"primary",onClick:()=>void V(),children:"生成新 key"}),s.jsx("button",{onClick:()=>void I(),children:"刷新列表"})]}),x&&s.jsxs("div",{children:[s.jsx("div",{children:s.jsxs("span",{className:"muted",children:["新 key(",x.label,",后 4 位 ",x.hint,"):只显示一次,关闭后无法再查看。"]})}),s.jsxs(Dt,{children:[s.jsx("input",{type:"text",readOnly:!0,value:x.api_key,onFocus:nt=>nt.target.select()}),s.jsx("button",{className:"primary",onClick:()=>void dt(),children:U?"已复制":"复制"}),s.jsx("button",{onClick:Mt,children:"存为当前浏览器 key"}),s.jsx("button",{onClick:()=>Q(null),children:"关闭(不再显示)"})]})]}),b&&s.jsx("div",{children:s.jsx("span",{className:"muted",children:b})}),lt&&s.jsx("div",{children:s.jsx("span",{children:lt})}),s.jsxs("div",{children:[M.length===0&&s.jsx("span",{className:"muted",children:"暂无 key(或列表加载失败,见上方报错)。"}),M.map(nt=>s.jsxs("div",{children:[s.jsx("span",{children:nt.label})," ",s.jsxs("span",{className:"muted",children:["后 4 位 ",nt.hint||"无"," · 创建 ",ka(nt.created_at)," · 最近使用 ",nt.last_used_at?ka(nt.last_used_at):"未使用过"]})," ",nt.revoked_at?s.jsxs("span",{className:"muted",children:["已撤销(",ka(nt.revoked_at),")"]}):s.jsx("button",{onClick:()=>void Ft(nt),children:"撤销"})]},nt.id))]})]})]})}function gg(){const c=Ot();return s.jsxs(Ve,{id:"adminCard",title:s.jsxs(s.Fragment,{children:["管理区 ",s.jsx("span",{className:"muted",children:"(仅全局管理员)"})]}),children:[s.jsx("div",{className:"muted",children:c.adminGate}),c.adminBody?s.jsxs(s.Fragment,{children:[s.jsxs(Dt,{children:[s.jsx("input",{type:"text",placeholder:"要查配额的用户 id",value:c.adminUserId,onChange:r=>c.setAdminUserId(r.target.value)}),s.jsx("button",{onClick:c.adminQuota,children:"查该用户配额"})]}),s.jsxs(Dt,{children:[s.jsx("button",{onClick:c.adminSweep,children:"手动触发 sweep(清理陈旧 running 任务)"}),s.jsx("button",{onClick:c.adminBackup,children:"手动触发备份"})]}),s.jsx("div",{className:"muted",children:c.adminResult})]}):null]})}function Sg(){const c=Ot(),[r,m]=v.useState(""),[o,_]=v.useState(""),[M,N]=v.useState("");return s.jsxs(Ve,{id:"nav-projects",title:"项目",children:[s.jsxs(Dt,{children:[s.jsxs("select",{"aria-label":"项目",value:c.projectId,onChange:x=>c.selectProject(x.target.value),children:[c.projects.length===0?s.jsx("option",{value:"",children:"(先加载项目)"}):null,c.projects.map(x=>s.jsxs("option",{value:x.id,children:[x.name," (",Oe(x.id),")"]},x.id))]}),s.jsx("button",{onClick:c.refreshProjects,children:"刷新"})]}),s.jsxs(Dt,{children:[s.jsx("input",{type:"text",placeholder:"新项目名",value:r,onChange:x=>m(x.target.value)}),s.jsxs("select",{"aria-label":"从 GitHub 仓库选",value:o,onChange:x=>{_(x.target.value),x.target.value&&N(x.target.value)},children:[s.jsx("option",{value:"",children:"(从 GitHub App 安装仓库里选,或手动输入)"}),c.githubRepos.map(x=>s.jsx("option",{value:x.clone_url,children:x.repo_full_name},x.clone_url))]}),s.jsx("input",{type:"text",placeholder:"repo_url(可选)",value:M,onChange:x=>N(x.target.value)}),s.jsx("button",{onClick:async()=>{await c.createProject(r,M),m(""),N(""),_("")},children:"新建项目"})]}),s.jsx("span",{className:"muted",children:c.projectMsg})]})}function pg(){const c=Ot(),[r,m]=v.useState(""),[o,_]=v.useState("contributor"),M=c.projects.find(N=>N.id===c.projectId);return s.jsxs(Ve,{title:"项目成员",children:[M?s.jsxs("div",{className:"muted",children:[M.name," | ",M.id," | 仓库 ",M.repo_url||"未绑定"," | 我的角色 ",M.my_role||"未知"]}):s.jsx("div",{className:"muted",children:"先选项目"}),s.jsxs(Dt,{children:[s.jsx("input",{type:"text",placeholder:"成员 user_id 或用户名",value:r,onChange:N=>m(N.target.value)}),s.jsxs("select",{"aria-label":"邀请角色",value:o,onChange:N=>_(N.target.value),children:[s.jsx("option",{value:"viewer",children:"viewer(只读)"}),s.jsx("option",{value:"contributor",children:"contributor(可建任务)"}),s.jsx("option",{value:"maintainer",children:"maintainer(可批合并)"}),s.jsx("option",{value:"owner",children:"owner(可管项目)"})]}),s.jsx("button",{onClick:async()=>{await c.inviteMember(r,o),m("")},children:"邀请成员"}),s.jsx("button",{onClick:c.refreshMembers,children:"刷新成员"})]}),c.memberError?s.jsx("div",{className:"muted",children:c.memberError}):c.members.length===0?s.jsx("div",{className:"muted",children:"先选项目"}):s.jsx(fu,{children:c.members.map(N=>{const x=(N.username||"")+(N.username?"("+String(N.user_id).slice(0,8)+")":String(N.user_id).slice(0,8));return s.jsxs("li",{children:[s.jsx("span",{className:"row-main",children:x}),s.jsx("select",{"aria-label":"成员角色",value:N.role||"viewer",onChange:Q=>void c.changeMemberRole(N.user_id,Q.target.value),children:Gy.map(Q=>s.jsx("option",{value:Q,children:Q},Q))})]},N.user_id)})}),s.jsx("span",{className:"muted",children:c.memberMsg})]})}function bg(){const c=Ot(),[r,m]=v.useState(""),[o,_]=v.useState(""),[M,N]=v.useState("");return s.jsxs(Ve,{id:"nav-env",title:s.jsxs(s.Fragment,{children:["环境 ",s.jsx("span",{className:"muted",children:"(选、建、管:当前项目的基准检出)"})]}),children:[s.jsxs(Dt,{children:[s.jsx("button",{onClick:c.refreshEnvs,children:"刷新"}),s.jsx("span",{className:"muted",children:c.envCount})]}),c.envs.length===0?s.jsx("div",{className:"muted",children:"先选项目"}):s.jsx(fu,{children:c.envs.map(x=>s.jsxs("li",{children:[s.jsxs("span",{className:"row-main",children:[x.name,"(",Oe(x.id),") / 分支 ",x.branch||"默认分支"," / 执行器 ",x.executor||"不限"," / 状态 ",x.status,x.status==="failed"&&x.error_text?" / 失败原因:"+x.error_text:""]}),x.status==="archived"?null:s.jsx("button",{onClick:()=>void c.archiveEnv(x.id),children:"归档"})]},x.id))}),s.jsxs(Dt,{children:[s.jsx("input",{type:"text",placeholder:"新环境名",value:r,onChange:x=>m(x.target.value)}),s.jsx("input",{type:"text",placeholder:"分支(可选,空=默认分支)",value:o,onChange:x=>_(x.target.value)}),s.jsxs("select",{"aria-label":"新环境执行器",value:M,onChange:x=>N(x.target.value),children:[s.jsx("option",{value:"",children:"执行器:不限"}),s.jsx("option",{value:"local",children:"local"}),s.jsx("option",{value:"docker",children:"docker"})]}),s.jsx("button",{onClick:async()=>{await c.createEnv(r,o,M),m(""),_("")},children:"新建环境"})]}),s.jsx("span",{className:"muted",children:c.envMsg})]})}function jg(){const c=Ot(),[r,m]=v.useState("");return s.jsxs(Ve,{title:"仓库与环境上下文",children:[s.jsx("div",{className:"muted",children:c.envRepoLine||"先选项目"}),s.jsx("div",{className:"muted",children:c.envCount}),c.envRepoBar?s.jsxs(Dt,{children:[s.jsxs("select",{"aria-label":"补仓库",value:r,onChange:o=>m(o.target.value),children:[s.jsx("option",{value:"",children:"(从 GitHub App 安装仓库里选)"}),c.githubRepos.map(o=>s.jsx("option",{value:o.clone_url,children:o.repo_full_name},o.clone_url))]}),s.jsx("button",{onClick:()=>void c.saveEnvRepo(r),children:"保存仓库"})]}):null,s.jsx("span",{className:"muted",children:c.envRepoMsg})]})}function xg(){const c=Ot();return s.jsxs(Ve,{id:"nav-workers",title:"Workers",children:[s.jsx(Dt,{children:s.jsx("button",{onClick:c.refreshWorkers,children:"刷新"})}),c.workersError?s.jsx("div",{className:"muted",children:c.workersError}):c.workers===null?s.jsx("div",{className:"muted",children:c.workersSummary||"未加载"}):c.workers.length===0?s.jsx("div",{className:"muted",children:"无 worker 注册"}):s.jsx(fu,{children:c.workers.map((r,m)=>{const o=r.running===void 0||r.running===null?"?":r.running,_=r.capacity===void 0||r.capacity===null?"?":r.capacity,M=wh(r),N=r.alive!==void 0&&r.alive!==null?!!r.alive:M.age!==null&&M.age<=120,x=N?" / 在线":" / 离线(占用为上次上报值)";return s.jsx("li",{className:N?"is-online":"is-offline",children:s.jsxs("span",{className:"row-main",children:[r.worker_id||r.id||"?"," / ",r.executor||""," / 占用 ",o,"/",_,x," / 最后心跳 ",M.text]})},m)})})]})}function Tg(){const c=Ot();return s.jsxs(Ve,{title:"健康与配额",children:[s.jsxs(Dt,{children:[s.jsx("span",{className:"muted",children:c.healthText}),s.jsx("button",{onClick:c.refreshHealth,children:"刷新"})]}),s.jsx("div",{children:s.jsx("span",{className:"muted",children:c.quotaText})}),s.jsx("div",{className:"muted",children:c.workersSummary})]})}function Eg(){const c=Ot();return s.jsxs(Ve,{id:"nav-skills",title:"技能与 MCP",children:[s.jsx("div",{className:"muted",children:"反映宿主租户 home,容器内 home 可能不同;重载只在 schema 枚举里,当前 pin 的二进制拒绝时原样 502;OAuth 只发起登录,不代表登录完成。"}),s.jsxs(Dt,{children:[s.jsx("button",{onClick:c.refreshSkills,children:"刷新"}),s.jsx("span",{className:"muted",children:c.skillMsg})]}),s.jsx("h3",{children:"技能"}),c.skillError?s.jsx("div",{className:"muted",children:c.skillError}):s.jsx(Dl,{empty:"暂无技能",items:c.skills.map((r,m)=>s.jsxs("span",{className:"row-main",children:[r.name||r.id||"",r.description?" - "+r.description:"",r.detail?" - "+r.detail:""]},m))}),s.jsx("h3",{children:"应用"}),s.jsx(Dl,{empty:"暂无应用",items:c.apps.map((r,m)=>s.jsxs("span",{className:"row-main",children:[r.name||r.id||"",r.description?" - "+r.description:""]},m))}),s.jsx("h3",{children:"MCP 服务"}),s.jsx(Dl,{empty:"暂无 MCP 服务",items:c.mcpServers.map((r,m)=>{const o=r.detail||r.details||r.state||"";return s.jsxs("span",{className:"row-main",children:[r.name||r.id||""," | 状态 ",r.status||"",o?" | "+o:""]},m)})})]})}function _g(){const c=Ot(),[r,m]=v.useState("");return s.jsxs(Ve,{title:"MCP 操作",children:[s.jsxs(Dt,{children:[s.jsx("button",{onClick:c.reloadMcp,children:"重载配置"}),s.jsx("span",{className:"muted",children:c.mcpMsg})]}),s.jsxs(Dt,{children:[s.jsx("input",{type:"text",placeholder:"MCP 服务名",value:r,onChange:o=>m(o.target.value)}),s.jsx("button",{onClick:()=>void c.mcpOauth(r),children:"发起 OAuth 登录"}),s.jsx("span",{className:"muted",children:c.mcpOauthMsg})]}),c.mcpOauthBox?s.jsx("pre",{children:c.mcpOauthBox}):null]})}function Ng(){const c=Ot(),[r,m]=v.useState(""),[o,_]=v.useState(""),[M,N]=v.useState(""),[x,Q]=v.useState("");return s.jsxs(s.Fragment,{children:[s.jsx("input",{placeholder:"自动化名称(同项目内启用中的名称唯一)",style:{width:"100%"},value:r,onChange:U=>m(U.target.value)}),s.jsx("textarea",{placeholder:"定时任务内容(创建只登记定义与到期状态;执行由后续执行器经 claim 抢单后建任务,不另起调度器)",value:o,onChange:U=>_(U.target.value)}),s.jsxs(Dt,{children:[s.jsx("input",{placeholder:"间隔秒数(默认 86400,最小 60)",style:{width:"40%"},value:M,onChange:U=>N(U.target.value)}),s.jsx("input",{placeholder:"仓库(可选)",style:{width:"40%"},value:x,onChange:U=>Q(U.target.value)}),s.jsx("button",{className:"primary",onClick:async()=>{await c.createAutomation(r,o,M,x),m(""),_(""),N(""),Q("")},children:"创建自动化"}),s.jsx("button",{onClick:c.refreshAutomations,children:"刷新自动化"}),s.jsx("span",{className:"muted",children:c.autoMsg})]}),s.jsx(Dl,{empty:"(暂无自动化)",items:c.automations.map(U=>s.jsxs("span",{className:"row-main",children:["[",U.status,U.due?"|到期":"","] ",U.name,"|每 ",U.interval_seconds," 秒|下次 ",ka(U.next_run_at),U.status==="active"?s.jsxs(s.Fragment,{children:[" ",s.jsx("button",{onClick:()=>c.cancelAutomation(U.id),children:"取消"})]}):null]},U.id))})]})}function Cg(){var m,o,_,M;const c=Ot(),r=c.triage;return c.triageError?s.jsx("div",{className:"muted",children:c.triageError}):r?s.jsxs(s.Fragment,{children:[s.jsxs("div",{className:"data-group",children:[s.jsxs("b",{children:["到期自动化(",((m=r.counts)==null?void 0:m.automations_due)||0,")"]}),s.jsx(Dl,{empty:"(无)",items:(r.automations_due||[]).map((N,x)=>s.jsxs("span",{className:"row-main",children:[N.name,"|每 ",N.interval_seconds," 秒"]},x))})]}),s.jsxs("div",{className:"data-group",children:[s.jsxs("b",{children:["失败/中断任务(",((o=r.counts)==null?void 0:o.failed_tasks)||0,")"]}),s.jsx(Dl,{empty:"(无)",items:(r.failed_tasks||[]).map((N,x)=>s.jsxs("span",{className:"row-main",children:[Oe(N.id),"|",N.status,"|",String(N.prompt||"").slice(0,80)]},x))})]}),s.jsxs("div",{className:"data-group",children:[s.jsxs("b",{children:["待处理后续消息(",((_=r.counts)==null?void 0:_.pending_followups)||0,")"]}),s.jsx(Dl,{empty:"(无)",items:(r.pending_followups||[]).map((N,x)=>s.jsxs("span",{className:"row-main",children:["任务 ",Oe(N.task_id),"|",String(N.body||"").slice(0,80)]},x))})]}),s.jsxs("div",{className:"data-group",children:[s.jsxs("b",{children:["最近自动化产出(",((M=r.counts)==null?void 0:M.recent_runs)||0,")"]}),s.jsx(Dl,{empty:"(无)",items:(r.recent_runs||[]).map((N,x)=>s.jsxs("span",{className:"row-main",children:[Oe(N.automation_id),"|",N.status,N.task_id?"|任务 "+Oe(N.task_id):"",N.task_status?"|"+N.task_status:""]},x))})]})]}):s.jsx("div",{className:"muted",children:"(先选项目)"})}function Ag(){return s.jsx(Ve,{id:"nav-automations",title:"自动化",children:s.jsx(Ng,{})})}function Og(){const c=Ot();return s.jsxs(Ve,{id:"nav-triage",title:"分诊收件箱",children:[s.jsx(Dt,{children:s.jsx("button",{onClick:c.refreshTriage,children:"刷新分诊"})}),s.jsx(Cg,{})]})}const Mg=[["#sec-dispatch","派发"],["#sec-tasks","任务"],["#sec-conv","对话"],["#sec-projects","项目"],["#sec-env","环境"],["#sec-workers","Workers"],["#sec-skills","技能"],["#sec-automations","自动化"],["#sec-triage","分诊"],["#sec-admin","管理区"],["#sec-key","API Key"]];function zg(){return s.jsxs("header",{className:"dash-topbar",children:[s.jsxs("div",{className:"dash-topbar-row",children:[s.jsx("span",{className:"dash-brand",children:"Codex 命令台"}),s.jsx(Rg,{}),s.jsx("span",{className:"muted dash-hide-sm",children:s.jsx(Dg,{})}),s.jsx("span",{className:"muted dash-hide-sm",children:s.jsx(Ug,{})}),s.jsx("span",{className:"muted dash-stamp",children:s.jsx(Hg,{})})]}),s.jsx("nav",{className:"dash-nav","aria-label":"页面导航",children:Mg.map(([c,r])=>s.jsx("a",{href:c,children:r},c))})]})}function Rg(){const c=Ot();return s.jsx("span",{className:c.keySaved?"dash-status ok":"dash-status off",children:c.keySaved?"● 已连接":"○ 未连接"})}function Dg(){return s.jsx(s.Fragment,{children:Ot().healthText})}function Ug(){return s.jsx(s.Fragment,{children:Ot().quotaText})}function Hg(){return s.jsxs(s.Fragment,{children:["自动刷新 · 每 10 秒 · 已刷新 ",Ot().refreshStamp]})}function Bg(){const c=Iy();Fy(m=>c.refreshAll(m),1e4),Wy(()=>c.refreshSlow(),6e4);const r=()=>{var m;(m=document.getElementById("sec-dispatch"))==null||m.scrollIntoView({behavior:"smooth"})};return s.jsxs(Yh.Provider,{value:c,children:[s.jsx(zg,{}),s.jsxs("main",{className:"dash-page",children:[s.jsx(Py,{}),s.jsxs("div",{className:"dash-col dash-col-left",children:[s.jsxs("section",{id:"sec-tasks",className:"dash-section card",children:[s.jsx("h2",{children:"任务列表"}),s.jsx(eg,{onNew:r})]}),s.jsxs("section",{id:"sec-projects",className:"dash-section",children:[s.jsx(Sg,{}),s.jsx(pg,{})]})]}),s.jsxs("div",{className:"dash-col dash-col-mid",children:[s.jsx("section",{id:"sec-dispatch",className:"dash-section",children:s.jsx(tg,{})}),s.jsxs("section",{id:"sec-conv",className:"dash-section",children:[s.jsxs("div",{className:"card",children:[s.jsx("h2",{children:"对话"}),s.jsx(ig,{})]}),s.jsx(vg,{})]})]}),s.jsxs("div",{className:"dash-col dash-col-right",children:[s.jsxs("section",{id:"sec-env",className:"dash-section",children:[s.jsx(bg,{}),s.jsx(jg,{})]}),s.jsxs("section",{id:"sec-workers",className:"dash-section",children:[s.jsx(xg,{}),s.jsx(Tg,{})]}),s.jsxs("section",{id:"sec-skills",className:"dash-section",children:[s.jsx(Eg,{}),s.jsx(_g,{})]}),s.jsx("section",{id:"sec-automations",className:"dash-section",children:s.jsx(Ag,{})}),s.jsx("section",{id:"sec-triage",className:"dash-section",children:s.jsx(Og,{})}),s.jsx("section",{id:"sec-admin",className:"dash-section",children:s.jsx(gg,{})}),s.jsx("section",{id:"sec-key",className:"dash-section",children:s.jsx(yg,{})})]})]})]})}qy.createRoot(document.getElementById("root")).render(s.jsx(Oy.StrictMode,{children:s.jsx(Bg,{})})); +`),M(Z||"(暂无 result/error 输出)")}catch{}dl(H.id),Bl(H.id),Ye(H.id),Vt(H.id),Hl(H),ol(H.id),ll(H.id),ml(H.id),ql(H.id)}},[dl,Bl,Ye,Vt,Hl,ol,ll,ml,ql]),gn=v.useCallback(async H=>{const D=ne.current;if(!D)return;const Z={cancel:"确定取消该任务吗?",merge:"确定把 completed 任务标为 merged 吗?",pr:"确定为该任务提 PR 吗?(会在仓库真实建 PR)"};if(!(Z[H]&&!window.confirm(Z[H])))try{const J=await tt($.taskAction(D.id,H),"POST",{});x(H+" 已提交:"+JSON.stringify(J).slice(0,300)),r(),await Wl(D.id)}catch(J){x(H+" 失败:"+J.message)}},[Wl,r]),Ke=v.useCallback(async()=>{const H=ne.current;if(H)try{const D=await tt($.taskCost(H.id));b(JSON.stringify(D,null,2).slice(0,4e3))}catch(D){b("查成本失败:"+D.message)}},[]),La=v.useCallback(async H=>{const D=ne.current;if(D){if(!H.trim()){I("分支消息必填");return}if(!su.includes(D.status)){I("仅终态任务可分支");return}try{const Z=await tt($.taskFork(D.id),"POST",{message:H.trim()});I("分支任务已建:"+Z.id.slice(0,8)),r()}catch(Z){I("分支失败:"+Z.message)}}},[r]),va=v.useCallback(async H=>{const D=ne.current;if(D)try{await tt($.taskReviews(D.id),"POST",H),le("评审已登记(requested)"),await Ye(D.id)}catch(Z){le("登记评审需求失败:"+Z.message)}},[Ye]),ru=v.useCallback(H=>{const D=ne.current;if(!D)return;const Z=window.prompt("输入该条评审的 findings(将写回记录并标为 completed):");Z!==null&&tt($.taskReviewFindings(D.id,H),"POST",{findings:Z}).then(()=>void Ye(D.id)).catch(J=>le("写 findings 失败:"+J.message))},[Ye]),ou=v.useCallback((H,D)=>{const Z=ne.current;if(!Z)return;const J=D==="approved"?"approve":"deny";tt($.taskApprovalDecision(Z.id,H,J),"POST",{}).then(()=>{K("已记录"+(D==="approved"?"允许":"拒绝")+"(当前版本只留回执,不拦截实时行为)"),Vt(Z.id)}).catch(Ct=>K("决定失败:"+Ct.message))},[Vt]),$l=v.useCallback(async(H,D,Z)=>{const J=ne.current;if(J){if(!D.trim()){X("目标任务 id 不能为空");return}if(!Z.trim()){X("消息正文不能为空");return}try{const Ct=await tt($.taskMessagesTo(D.trim()),"POST",{from_task_id:J.id,body:Z.trim(),mode:H});X("已发送("+Ct.delivery+")"),await ll(J.id)}catch(Ct){X("发送失败:"+Ct.message)}}},[ll]),pe=v.useCallback((H,D)=>{const Z=ne.current;if(!Z)return;if(!["completed","failed","interrupted"].includes(Z.status)){Gt("仅 completed/failed/interrupted 任务可操作线程(merged/merge-failed 不可改,服务端同样 409)");return}const J={};if(H==="rename"){if(!D.trim()){Gt("新线程名不能为空");return}J.name=D.trim()}tt($.taskThreadAction(Z.id,H),"POST",J).then(Ct=>{Gt(H+" 已提交:"+JSON.stringify(Ct).slice(0,300)),ml(Z.id),ql(Z.id)}).catch(Ct=>Gt(H+" 失败:"+Ct.message))},[ml,ql]),hl=v.useCallback(async H=>{const D=ne.current;if(!D)return;const Z=H.trim();if(!Z){ae("消息不能为空");return}try{su.includes(D.status)&&D.status!=="merged"?(await tt($.taskContinue(D.id),"POST",{message:Z}),ae("已重新排队,同一会话继续"),r(),await Wl(D.id)):["queued","running"].includes(D.status)?(await tt($.taskFollowups(D.id),"POST",{body:Z,mode:"direct"}),ae("已直接发送"),await dl(D.id),await Bl(D.id)):ae("merged/merge-failed 任务不可继续,也不可发后续消息")}catch(J){ae("发送失败:"+J.message)}},[Wl,r,dl,Bl]),be=v.useCallback(async()=>{const H=ne.current;if(!H){ce("先选一个任务");return}try{const D=await tt($.taskTrace(H.id)),Z=new Blob([JSON.stringify({task_id:H.id,status:D.status,note:D.note||"",count:(D.entries||[]).length,entries:D.entries||[]},null,2)],{type:"application/json"}),J=document.createElement("a");J.href=URL.createObjectURL(Z),J.download="trace-"+H.id.slice(0,8)+".json",document.body.appendChild(J),J.click(),J.remove(),setTimeout(()=>URL.revokeObjectURL(J.href),1e3),ce("已下载完整链路 "+(D.entries||[]).length+" 条")}catch(D){ce("下载失败:"+D.message)}},[]);return v.useEffect(()=>()=>qe(),[qe]),{currentTask:m,detailBody:_,actionMsg:N,actionReasons:Q,costBox:G,forkVisible:B,setForkVisible:lt,forkMsg:at,coordChildren:V,agents:Mt,agentsNote:nt,reviews:ee,reviewMsg:yt,reviewError:de,traceEntries:Ft,traceNote:tl,traceDone:Y,traceKind:et,setTraceKind:Tt,traceMsg:gt,followups:Me,approvals:y,approvalMsg:F,peerMessages:St,peerMsg:Et,threadText:ut,threadGateNote:Va,threadMsg:Ze,threadList:zt,chatMsg:Fl,chatHistory:ha,showDetail:Wl,refreshDetailLists:yn,doAction:gn,taskCost:Ke,forkTask:La,postReview:va,submitFindings:ru,decideApproval:ou,postPeer:$l,threadAction:pe,sendChatMessage:hl,downloadTrace:be,refreshReviews:()=>void Ye(),refreshApprovals:()=>void Vt()}}function Jy(c){const[r,m]=v.useState([]),[o,_]=v.useState(""),[M,N]=v.useState(null),[x,Q]=v.useState(""),U=v.useCallback(async lt=>{const at=lt!==void 0?lt:c();if(!at){m([]);return}try{const I=await tt($.projectAutomations(at));m(I.automations||[])}catch(I){_("自动化加载失败:"+I.message)}},[c]),G=v.useCallback(async(lt,at,I,V)=>{const dt=c();if(!dt){_("先选项目");return}if(!lt.trim()){_("自动化名称必填");return}if(!at.trim()){_("定时任务内容必填");return}const Mt={name:lt.trim(),prompt:at.trim()};I.trim()&&(Mt.interval_seconds=parseInt(I.trim(),10)),V.trim()&&(Mt.repo_url=V.trim());try{await tt($.projectAutomations(dt),"POST",Mt),_("自动化已创建(登记定义,到期后由执行器认领)"),await U(dt)}catch(te){_("创建失败:"+te.message)}},[c,U]),b=v.useCallback(lt=>{const at=c();at&&tt($.projectAutomationCancel(at,lt),"POST",{}).then(()=>{_("自动化已取消"),U(at)}).catch(I=>_("取消失败:"+I.message))},[c,U]),B=v.useCallback(async lt=>{const at=lt!==void 0?lt:c();if(!at){N(null);return}try{const I=await tt($.projectTriage(at));N(I),Q("")}catch(I){Q("分诊加载失败:"+I.message)}},[c]);return{automations:r,autoMsg:o,triage:M,triageError:x,refreshAutomations:U,createAutomation:G,cancelAutomation:b,refreshTriage:B}}function Fy(c,r){const m=v.useRef(c);m.current=c,v.useEffect(()=>{const o=setInterval(()=>{const _=document.activeElement;m.current(_?_.tagName==="SELECT":!1)},r);return()=>clearInterval(o)},[r])}function Wy(c,r){const m=v.useRef(c);m.current=c,v.useEffect(()=>{const o=setInterval(()=>m.current(),r);return()=>clearInterval(o)},[r])}function $y(c){const r=m=>String(m).padStart(2,"0");return r(c.getHours())+":"+r(c.getMinutes())+":"+r(c.getSeconds())}function Iy(){var I;const c=Zy(),r=Ly(),m=v.useRef("");m.current=c.projectId;const o=v.useCallback(()=>m.current,[]),_=Jy(o),M=v.useCallback(V=>{const dt=c.projects.find(Mt=>Mt.id===V);return dt&&dt.my_role||null},[c.projects]),N=v.useCallback(()=>{r.refreshTasks(void 0,m.current)},[r]),x=Ky(M,N),[Q,U]=v.useState("--:--:--"),G=v.useCallback(V=>{c.setProjectId(V),m.current=V,r.refreshTasks(V),c.refreshEnvs(V),c.refreshMembers(V),c.refreshSkills(V),_.refreshAutomations(V),_.refreshTriage(V)},[c,r,_]),b=(I=c.projects[0])==null?void 0:I.id;v.useEffect(()=>{!c.projectId&&b&&G(b)},[c.projectId,b,G]);const B=v.useCallback(V=>{c.saveKeyInput(V),V.trim()&&(c.refreshHealth(),c.refreshProjects(),c.refreshWorkers(),m.current&&(r.refreshTasks(m.current),c.refreshEnvs(m.current),c.refreshMembers(m.current)),c.loadRelayModels(),c.loadQuota(),c.loadGithubRepos(),c.probeAdmin())},[c,r]),lt=v.useCallback(V=>{if(U($y(new Date)),!El()){c.refreshHealth();return}r.refreshTasks(void 0,m.current),c.refreshHealth(),c.loadQuota(),c.refreshWorkers(),c.refreshMembers(),c.refreshSkills(),_.refreshAutomations(),_.refreshTriage(),x.refreshDetailLists(),V||(c.refreshProjects(),c.refreshEnvs())},[c,r,_,x]),at=v.useCallback(()=>{El()&&(c.loadRelayModels(),c.loadGithubRepos())},[c]);return v.useEffect(()=>{c.refreshHealth(),c.refreshProjects(),c.refreshWorkers(),c.loadQuota(),c.loadGithubRepos(),El()&&c.loadRelayModels(),c.probeAdmin()},[]),{keySaved:c.keySaved,keyState:c.keyState,saveKeyInput:B,clearKeyInput:c.clearKeyInput,quotaText:c.quotaText,healthText:c.healthText,refreshHealth:c.refreshHealth,adminGate:c.adminGate,adminBody:c.adminBody,adminResult:c.adminResult,adminUserId:c.adminUserId,setAdminUserId:c.setAdminUserId,adminQuota:c.adminQuota,adminSweep:c.adminSweep,adminBackup:c.adminBackup,projects:c.projects,projectId:c.projectId,projectMsg:c.projectMsg,selectProject:G,refreshProjects:c.refreshProjects,createProject:c.createProject,githubRepos:c.githubRepos,workers:c.workers,workersSummary:c.workersSummary,workersError:c.workersError,refreshWorkers:c.refreshWorkers,members:c.members,memberMsg:c.memberMsg,memberError:c.memberError,refreshMembers:()=>void c.refreshMembers(),inviteMember:c.inviteMember,changeMemberRole:c.changeMemberRole,skills:c.skills,apps:c.apps,mcpServers:c.mcpServers,skillMsg:c.skillMsg,skillError:c.skillError,mcpMsg:c.mcpMsg,mcpOauthMsg:c.mcpOauthMsg,mcpOauthBox:c.mcpOauthBox,refreshSkills:()=>void c.refreshSkills(),reloadMcp:c.reloadMcp,mcpOauth:c.mcpOauth,envs:c.envs,envCount:c.envCount,envMsg:c.envMsg,envRepoLine:c.envRepoLine,envRepoBar:c.envRepoBar,envRepoMsg:c.envRepoMsg,envSelect:c.envSelect,setEnvSelect:c.setEnvSelect,refreshEnvs:()=>void c.refreshEnvs(),createEnv:c.createEnv,archiveEnv:c.archiveEnv,saveEnvRepo:c.saveEnvRepo,models:c.models,modelCustomVisible:c.modelCustomVisible,tasks:r.tasks,taskCountText:r.taskCountText,taskError:r.taskError,refreshTasks:()=>void r.refreshTasks(void 0,m.current),statusFilter:r.statusFilter,setStatusFilter:r.setStatusFilter,executorFilter:r.executorFilter,setExecutorFilter:r.setExecutorFilter,searchText:r.searchText,setSearchText:r.setSearchText,filteredTasks:r.filteredTasks,currentTask:x.currentTask,detailBody:x.detailBody,actionMsg:x.actionMsg,actionReasons:x.actionReasons,showDetail:V=>void x.showDetail(V),doAction:x.doAction,taskCost:x.taskCost,costBox:x.costBox,forkVisible:x.forkVisible,setForkVisible:x.setForkVisible,forkTask:x.forkTask,forkMsg:x.forkMsg,coordChildren:x.coordChildren,coordText:"",agents:x.agents,agentsNote:x.agentsNote,reviews:x.reviews,reviewMsg:x.reviewMsg,reviewError:x.reviewError,refreshReviews:x.refreshReviews,postReview:x.postReview,submitFindings:x.submitFindings,traceEntries:x.traceEntries,traceNote:x.traceNote,traceDone:x.traceDone,traceKind:x.traceKind,setTraceKind:x.setTraceKind,downloadTrace:x.downloadTrace,traceMsg:x.traceMsg,sendChatMessage:x.sendChatMessage,chatMsg:x.chatMsg,chatHistory:x.chatHistory,followups:x.followups,approvals:x.approvals,approvalMsg:x.approvalMsg,refreshApprovals:x.refreshApprovals,decideApproval:x.decideApproval,peerMessages:x.peerMessages,peerMsg:x.peerMsg,postPeer:x.postPeer,automations:_.automations,autoMsg:_.autoMsg,refreshAutomations:()=>void _.refreshAutomations(),createAutomation:_.createAutomation,cancelAutomation:_.cancelAutomation,triage:_.triage,triageError:_.triageError,refreshTriage:()=>void _.refreshTriage(),threadText:x.threadText,threadGateNote:x.threadGateNote,threadMsg:x.threadMsg,threadList:x.threadList,threadAction:x.threadAction,dispatch:async(V,dt)=>{const Mt=await r.dispatch(V,dt);return r.refreshTasks(m.current),Mt},dispatchMsg:"",refreshAll:lt,refreshSlow:at,refreshStamp:Q}}function iu({label:c,value:r,sub:m}){return s.jsxs("div",{className:"dash-card data-card",children:[s.jsx("div",{className:"dash-card-label",children:c}),s.jsx("div",{className:"dash-card-value",children:r}),s.jsx("div",{className:"muted",children:m})]})}function Py(){const c=Ot(),r=c.healthText==="未加载"?"未加载":c.healthText.includes("worker_ok=true")?"正常":c.healthText.includes("worker_ok=false")?"异常":c.healthText.includes("加载失败")?"加载失败":"未知",m=c.quotaText.match(/剩余 \$([0-9.]+)/),o=c.quotaText.includes("加载失败")?"加载失败":c.quotaText.includes("未填 key")||c.quotaText==="未加载"?"未加载":m?"$"+m[1]:"配额",_=["running","completed","failed","queued","merged","interrupted"].map(b=>c.tasks.filter(B=>B.status===b).length).map((b,B)=>["running","completed","failed","queued","merged","interrupted"][B]+" "+b).join(" | "),M=c.projects.find(b=>b.id===c.projectId),N=c.taskError?{value:"加载失败",sub:c.taskError}:c.projectId?{value:String(c.tasks.length),sub:c.taskCountText+" | "+_+(M?" | "+M.name:"")}:{value:"先选项目",sub:c.projectMsg||"项目加载后自动选第一个"};let x;if(c.workersError)x={value:"加载失败",sub:c.workersError};else if(c.workers===null)x={value:c.workersSummary||"未加载",sub:"完整 worker 清单仅全局管理员可见"};else{const b=c.workers.filter(B=>{if(B.alive!==void 0&&B.alive!==null)return!!B.alive;const lt=wh(B).age;return lt!==null&<<=120}).length;x={value:b+" 在线 / "+c.workers.length,sub:c.workers.length-b+" 离线"}}const Q=c.projectMsg.includes("加载失败")?{value:"加载失败",sub:c.projectMsg}:{value:c.projects.length+" 个",sub:M?"当前项目:"+M.name:"未选项目(加载后自动选第一个)"},U=[c.envMsg,c.memberError,c.skillError].filter(b=>b&&b.includes("失败")),G=c.projectId?U.length?{value:"部分加载失败",sub:U.join(" | ")}:{value:c.envs.length+" 个环境",sub:c.members.length+" 成员 | "+c.skills.length+" 技能 | "+c.apps.length+" 应用 | "+c.mcpServers.length+" MCP"}:{value:"先选项目",sub:"选项目后显示环境 / 成员 / 技能计数"};return s.jsxs("section",{className:"dash-cards","aria-label":"数据卡片",children:[s.jsx(iu,{label:"健康",value:r,sub:c.healthText}),s.jsx(iu,{label:"配额",value:o,sub:c.quotaText}),s.jsx(iu,{label:"任务",value:N.value,sub:N.sub}),s.jsx(iu,{label:"Workers",value:x.value,sub:x.sub}),s.jsx(iu,{label:"项目",value:Q.value,sub:Q.sub}),s.jsx(iu,{label:"项目数据",value:G.value,sub:G.sub})]})}function Ve({id:c,className:r,title:m,children:o}){return s.jsxs("section",{id:c,className:"card"+(r?" "+r:""),children:[m?s.jsx("h2",{children:m}):null,o]})}function Dt({children:c}){return s.jsx("div",{className:"bar",children:c})}function Dl({items:c,empty:r}){return c.length?s.jsx("ul",{className:"data-list",children:c.map((m,o)=>s.jsx("li",{children:m},o))}):s.jsx("div",{className:"muted",children:r||"(暂无)"})}function fu({children:c}){return s.jsx("ul",{className:"data-list",children:c})}function tg(){const c=Ot(),[r,m]=v.useState(""),[o,_]=v.useState(""),[M,N]=v.useState(!1),[x,Q]=v.useState(!1),[U,G]=v.useState(!1),[b,B]=v.useState("docker"),[lt,at]=v.useState(""),[I,V]=v.useState(""),[dt,Mt]=v.useState(""),[te,nt]=v.useState(""),[kt,ee]=v.useState(""),[it,yt]=v.useState(""),[le,de]=v.useState(""),Kt=v.useRef(null),Ft=v.useRef(null),Wt=v.useRef(null),[tl,mt]=v.useState("");async function Y(){var Me,ze,y;if(mt(""),!c.projectId){mt("先选项目");return}if(!r.trim()){mt("prompt 必填");return}const C={project_id:c.projectId,prompt:r.trim()};c.envSelect&&(C.environment_id=c.envSelect),b&&(C.executor=b);const et=I.trim()||lt;et&&(C.model=et),dt&&(C.effort=dt);const Tt=it.trim()||kt;if(Tt&&(C.child_model=Tt),le&&(C.child_effort=le),te&&(C.approval=te),U){if(te==="full"){mt("计划模式不能与完全访问同用");return}if(M||x){mt("计划模式不能与 goal 模式同用");return}C.plan=1}x?(C.goal_mode=1,C.no_time_limit=1):M&&(C.goal_mode=1);const gt=o.trim();if(gt){try{C.coordinator_parts=JSON.parse(gt)}catch{mt("协调员子任务 JSON 解析失败");return}if(!Array.isArray(C.coordinator_parts)){mt("协调员子任务必须是数组");return}if(M||x||U){mt("协调员任务不能与 goal/计划模式同用:协调员任务本身不跑模型回合,请取消 goal/计划勾选,或清空协调员 JSON");return}}const ce=Vy(((Me=Kt.current)==null?void 0:Me.files)||null,((ze=Ft.current)==null?void 0:ze.files)||null,((y=Wt.current)==null?void 0:y.files)||null);try{const R=await c.dispatch(C,ce);mt(R),m(""),_(""),Kt.current&&(Kt.current.value=""),Ft.current&&(Ft.current.value=""),Wt.current&&(Wt.current.value="")}catch(R){mt("提交失败:"+((R==null?void 0:R.message)||String(R)))}}return s.jsxs(Ve,{id:"nav-newtask",className:"composer",title:"新建任务",children:[s.jsxs(Dt,{children:[s.jsxs("select",{"aria-label":"环境",value:c.envSelect,onChange:C=>c.setEnvSelect(C.target.value),children:[s.jsx("option",{value:"",children:"环境:不指定(走项目仓库)"}),c.envs.map(C=>s.jsxs("option",{value:C.id,disabled:C.status!=="ready",children:[C.name,"(",C.status,")"]},C.id))]}),s.jsxs("select",{"aria-label":"执行器",value:b,onChange:C=>B(C.target.value),children:[s.jsx("option",{value:"docker",children:"docker(默认,多用户下隔离最强)"}),s.jsx("option",{value:"local",children:"local"}),s.jsx("option",{value:"cloud",children:"cloud"})]}),s.jsxs("label",{children:[s.jsx("input",{type:"checkbox",checked:M,onChange:C=>N(C.target.checked)})," goal 模式"]}),s.jsxs("label",{children:[s.jsx("input",{type:"checkbox",checked:x,onChange:C=>Q(C.target.checked)})," goal 模式无敌版"]}),s.jsxs("label",{children:[s.jsx("input",{type:"checkbox",checked:U,onChange:C=>G(C.target.checked)})," 计划模式(只读)"]})]}),s.jsx("textarea",{className:"prompt stacked",placeholder:"任务 prompt(必填)",value:r,onChange:C=>m(C.target.value)}),s.jsx("textarea",{className:"coord stacked",placeholder:"协调员子任务 JSON(可选),留空为普通任务",value:o,onChange:C=>_(C.target.value)}),s.jsxs("div",{className:"muted",children:["协调员格式:[","{",'"name":"后端","prompt":"做后端"',"}",",","{",'"name":"前端","prompt":"做前端"',"}","];提交后 worker 并行建子任务、等齐、合流汇总。不能与 goal/计划模式同用。协调员与 goal/计划互斥:勾了 goal 或计划模式时不要填协调员 JSON,提交前会校验并拦截。子任务费用记父任务创建人账;父任务创建时按分工数预留配额,余额不足时整个父任务被挡下。"]}),s.jsxs(Dt,{children:[s.jsxs("select",{"aria-label":"模型",value:lt,onChange:C=>at(C.target.value),children:[s.jsx("option",{value:"",children:"模型:默认(跟随配置)"}),c.models.map(C=>s.jsx("option",{value:C,children:C},C))]}),c.modelCustomVisible?s.jsx("input",{type:"text",placeholder:"手动输入模型(中转列表取不到时用)",value:I,onChange:C=>V(C.target.value)}):null,s.jsxs("select",{"aria-label":"推理强度",value:dt,onChange:C=>Mt(C.target.value),children:[s.jsx("option",{value:"",children:"推理强度:默认(跟随配置)"}),Bh.map(C=>s.jsx("option",{value:C,children:C},C))]}),s.jsxs("select",{"aria-label":"权限",value:te,onChange:C=>nt(C.target.value),children:[s.jsx("option",{value:"",children:"权限:默认(跟随配置)"}),s.jsx("option",{value:"ask",children:"请求批准"}),s.jsx("option",{value:"auto",children:"帮我批准"}),s.jsx("option",{value:"full",children:"完全访问"})]})]}),s.jsxs(Dt,{children:[s.jsxs("select",{"aria-label":"子任务模型",value:kt,onChange:C=>ee(C.target.value),children:[s.jsx("option",{value:"",children:"子任务模型:跟随本任务模型"}),c.models.map(C=>s.jsx("option",{value:C,children:C},C))]}),s.jsx("input",{type:"text",placeholder:"子任务模型手动输入(中转列表里没有时填,如 gpt-6-luna;留空=跟随本任务模型)",value:it,onChange:C=>yt(C.target.value)}),s.jsxs("select",{"aria-label":"子任务强度",value:le,onChange:C=>de(C.target.value),children:[s.jsx("option",{value:"",children:"子任务强度:跟随本任务强度"}),Bh.map(C=>s.jsx("option",{value:C,children:C},C))]})]}),s.jsx("div",{className:"muted",children:"子任务模型/强度是派生默认:本任务用 marker task-create 或协调员分工派生的子任务,未显式写模型/强度时用它;块/分工里显式写了则覆盖它。也可以不在这里填、直接在 prompt 里写“子任务用 gpt-6-luna max”,建任务时服务端会解析成同一对字段(任务详情里可核对)。"}),M?s.jsx("div",{className:"muted",children:"goal 模式:输入框内容即目标,不需要专用 prompt 与验收命令;不限轮次,模型确认达成后在回复末尾输出“目标已达成”即结束,未达成会一直运行,可用取消停止。"}):null,x?s.jsx("div",{className:"muted",children:"goal 模式无敌版:goal 模式 + 任务不限时(去掉 worker/docker 总超时;单轮 600 秒护栏还在,不限的是任务总时长与总轮次)。服务端默认的自动续跑与断点镜像同时生效。"}):null,s.jsxs(Dt,{children:[s.jsx("span",{className:"muted",children:"附件(放进任务工作区,图片与普通文件不区分):"}),s.jsx("input",{ref:Kt,type:"file",multiple:!0,title:"文件"}),s.jsx("input",{ref:Ft,type:"file",multiple:!0,title:"文件夹",webkitdirectory:""}),s.jsx("input",{ref:Wt,type:"file",accept:"image/*",multiple:!0,title:"图片"})]}),s.jsxs(Dt,{children:[s.jsx("button",{className:"seal",onClick:Y,children:"提交任务"}),s.jsx("span",{className:"muted",children:tl||c.dispatchMsg})]})]})}function eg({onNew:c}){const r=Ot();return s.jsxs("div",{children:[s.jsxs("div",{className:"search-box",children:[s.jsxs("svg",{viewBox:"0 0 24 24",width:"18",height:"18",fill:"none",stroke:"currentColor",strokeWidth:"1.8",strokeLinecap:"round","aria-hidden":"true",children:[s.jsx("circle",{cx:"11",cy:"11",r:"7"}),s.jsx("path",{d:"M21 21l-4.3-4.3"})]}),s.jsx("input",{type:"text",placeholder:"搜索","aria-label":"搜索任务",value:r.searchText,onChange:m=>r.setSearchText(m.target.value)})]}),s.jsx("div",{className:"bar",children:s.jsxs("select",{"aria-label":"项目",value:r.projectId,onChange:m=>r.selectProject(m.target.value),children:[r.projects.length===0?s.jsx("option",{value:"",children:"(先加载项目)"}):null,r.projects.map(m=>s.jsxs("option",{value:m.id,children:[m.name," (",Oe(m.id),")"]},m.id))]})}),s.jsxs("div",{className:"list-section-head",children:[s.jsx("span",{children:"主要聊天"}),s.jsx("button",{type:"button","aria-label":"派发新任务",title:"派发新任务",onClick:c,children:"+"})]}),s.jsxs("div",{className:"bar",children:[s.jsxs("select",{"aria-label":"状态筛选",value:r.statusFilter,onChange:m=>r.setStatusFilter(m.target.value),children:[s.jsx("option",{value:"",children:"状态:全部"}),["queued","running","completed","failed","interrupted","merged","merge-failed"].map(m=>s.jsx("option",{value:m,children:m},m))]}),s.jsxs("select",{"aria-label":"执行器筛选",value:r.executorFilter,onChange:m=>r.setExecutorFilter(m.target.value),children:[s.jsx("option",{value:"",children:"执行器:全部"}),s.jsx("option",{value:"local",children:"local"}),s.jsx("option",{value:"docker",children:"docker"}),s.jsx("option",{value:"cloud",children:"cloud"})]})]}),s.jsxs("div",{className:"bar",children:[s.jsx("button",{onClick:r.refreshTasks,children:"刷新"}),s.jsx("span",{className:"muted",children:r.taskCountText})]}),r.taskError?s.jsx("div",{className:"err",children:r.taskError}):r.projectId?r.filteredTasks.length===0?s.jsx("div",{className:"muted",children:r.tasks.length?"没有符合筛选条件的任务":"该项目暂无任务"}):s.jsx("ul",{className:"issue-list",children:r.filteredTasks.slice().reverse().map(m=>{var o;return s.jsxs("li",{className:"issue-item"+(((o=r.currentTask)==null?void 0:o.id)===m.id?" selected":""),onClick:()=>r.showDetail(m.id),children:[s.jsx("span",{className:"issue-state st-"+m.status,"aria-hidden":"true"}),s.jsxs("span",{children:[s.jsxs("div",{className:"issue-title",children:[m.plan?"[计划] ":"",m.forked_from?"[分支] ":"",m.coordinator_parts?"[协调] ":"",m.parent_task_id?"[协调子任务] ":"",String(m.prompt||Oe(m.id)).slice(0,60)]}),s.jsxs("div",{className:"issue-meta",children:[Oe(m.id)," · ",s.jsx("span",{className:"st-"+m.status,children:m.status})," · ",m.executor||"",m.updated_at?" · "+new Date(m.updated_at*1e3).toLocaleString():""]})]})]},m.id)})}):s.jsx("div",{className:"muted",children:"先选项目"})]})}function lg(c){const r=v.useRef(null),[m,o]=v.useState(!0),_=v.useRef(!0),M=()=>{const N=r.current;if(!N)return;const x=N.scrollHeight-N.scrollTop-N.clientHeight<80;_.current=x,o(x)};return v.useEffect(()=>{_.current&&r.current&&(r.current.scrollTop=r.current.scrollHeight)},[c]),{ref:r,following:m,onScroll:M}}function ag({msg:c}){if(c.role==="status")return s.jsx("div",{className:"chat-status",children:c.text});const r=c.label||(c.role==="user"?"用户":c.role==="assistant"?"助手":"工具");return s.jsxs("div",{className:"gh-comment "+c.role,children:[s.jsx("div",{className:"gh-comment-header",children:s.jsx("span",{className:"gh-comment-author",children:r})}),s.jsx("div",{className:"gh-comment-body",children:c.text})]})}function Gh({messages:c,empty:r}){const{ref:m,following:o,onScroll:_}=lg(c.length);return s.jsxs("div",{className:"chat-list",ref:m,onScroll:_,children:[c.length===0?s.jsx("div",{className:"muted",children:r||"(暂无消息)"}):c.map(M=>s.jsx(ag,{msg:M},M.id)),!o&&c.length>0?s.jsx("button",{className:"chat-follow",onClick:()=>{m.current&&(m.current.scrollTop=m.current.scrollHeight)},children:"回到最新 ↓"}):null]})}function ng({onSend:c,disabled:r,placeholder:m}){const[o,_]=v.useState(""),M=()=>{const N=o.trim();!N||r||(c(N),_(""))};return s.jsxs("div",{className:"gh-comment-box",children:[s.jsx("textarea",{"aria-label":"会话输入",rows:3,placeholder:m||"消息",value:o,disabled:r,onChange:N=>_(N.target.value),onKeyDown:N=>{N.key==="Enter"&&!N.shiftKey&&(N.preventDefault(),M())}}),s.jsx("div",{className:"gh-comment-footer",children:s.jsx("button",{type:"button",className:"primary","aria-label":"发送",disabled:r||!o.trim(),onClick:M,children:"发送"})})]})}function Qh(c,r){const m=c.id||"trace-"+r;if(c.kind==="message")return{id:m,role:"assistant",text:(c.phase?"["+c.phase+"] ":"")+(c.text||""),label:"助手"};if(c.kind==="exec"||c.kind==="file"||c.kind==="tool"||c.kind==="call"){const o=c.kind==="exec"?"命令":c.kind==="file"?"文件":c.kind==="tool"?"工具":"调用";return{id:m,role:"tool",text:fr(c),label:o}}return c.kind==="plan"?{id:m,role:"status",text:c.text||""}:c.kind==="reasoning"?{id:m,role:"status",text:"思考:"+(c.summary||"")}:c.kind==="agent-start"?{id:m,role:"status",text:"子代理开始:"+(c.name||"")+(c.prompt?"("+c.prompt+")":"")}:c.kind==="agent-done"?{id:m,role:"status",text:"子代理结束:"+(c.name||"")+" "+(c.status||"")}:{id:m,role:"status",text:fr(c)}}function ug(){const c=Ot(),r=v.useMemo(()=>{const m=c.currentTask,o=m&&m.prompt?[{id:"task-prompt",role:"user",text:m.prompt}]:[],M=(c.traceKind?c.traceEntries.filter(x=>x.kind===c.traceKind):c.traceEntries).map((x,Q)=>Qh(x,Q)),N=c.traceDone?[{id:"trace-done",role:"status",text:"链路已结束("+c.traceDone+")"}]:[];return[...o,...M,...N]},[c.currentTask,c.traceEntries,c.traceKind,c.traceDone]);return s.jsxs(s.Fragment,{children:[s.jsx("div",{className:"muted",children:"实时链路"}),s.jsxs(Dt,{children:[s.jsxs("select",{"aria-label":"链路类型",value:c.traceKind,onChange:m=>c.setTraceKind(m.target.value),children:[s.jsx("option",{value:"",children:"链路类型:全部"}),["exec","file","call","tool","message","reasoning","plan","agent-start","agent-done"].map(m=>s.jsx("option",{value:m,children:m==="exec"?"命令":m==="file"?"文件":m==="call"?"调用":m==="tool"?"工具":m==="message"?"消息":m==="reasoning"?"思考":m==="plan"?"计划":"子代理"},m))]}),s.jsx("button",{onClick:c.downloadTrace,children:"下载完整链路"}),s.jsx("span",{className:"muted",children:c.traceMsg})]}),c.traceNote?s.jsx("div",{children:s.jsx("span",{className:"err",children:c.traceNote})}):null,s.jsx("div",{className:"chat-column",children:s.jsx(Gh,{messages:r,empty:"(暂无链路条目)"})}),s.jsx("div",{className:"muted",children:"对话时间线:首条是本任务 prompt(用户);助手回复来自 message 条目,命令/文件/工具/调用是工具评论框,计划/思考/子代理开始结束是时间线上的状态文字。流式进行中时新条目实时追加;你在底部时自动跟随,往上翻时暂停跟随,点“回到最新”恢复。"})]})}function cg(){const c=Ot(),r=c.currentTask,m=v.useMemo(()=>{if(!r)return[];if(c.chatHistory)return c.chatHistory.messages.map(b=>({id:b.id,role:b.role,text:b.text,label:b.label}));const Q=r.prompt?[{id:"task-prompt",role:"user",text:r.prompt}]:[],U=c.traceEntries.filter(b=>b.kind==="message").map((b,B)=>Qh(b,B)),G=c.followups.map((b,B)=>({id:"followup-"+B,role:"user",text:String(b.body||""),label:"后续消息"}));return[...Q,...U,...G]},[r,c.chatHistory,c.traceEntries,c.followups]);if(!r)return s.jsx("div",{className:"muted",children:"点任务行查看详情后,这里显示继续会话"});const o=su.includes(r.status),_=["queued","running"].includes(r.status),M=o||_,N=o?"终态任务:发送走继续接口(同一会话再跑一轮)":_?"运行中/排队中:发送走后续消息直接发送(跑完当前轮后优先执行)":"merged/merge-failed 任务不可继续,也不可发后续消息",x=c.chatHistory?c.chatHistory.legacy_continue_count??null:null;return s.jsxs("div",{className:"chat-column",children:[x!==null&&x>0?s.jsxs("div",{className:"muted",children:["此前有 ",x," 条继续消息发生在持久化之前,未入库,上面历史不完整;部署后新发的继续消息会正常显示。"]}):null,c.chatHistory&&c.chatHistory.trace_note?s.jsx("div",{className:"muted",children:c.chatHistory.trace_note}):null,s.jsx(Gh,{messages:m,empty:"(暂无会话消息)"}),s.jsx(ng,{disabled:!M,placeholder:"消息",onSend:Q=>void c.sendChatMessage(Q)}),s.jsxs("div",{className:"muted",children:[N,"。",c.chatMsg]})]})}function ig(){return Ot().currentTask?s.jsxs("div",{className:"conversation",children:[s.jsx(ug,{}),s.jsx("div",{className:"conv-divider"}),s.jsx(cg,{})]}):s.jsx("div",{className:"conversation",children:s.jsx("div",{className:"muted",children:"在任务列表里点一条任务,对话和详情就切到该任务;也可以在上面派发一个新任务。"})})}function sg(){const c=Ot(),r=c.currentTask,[m,o]=v.useState("");if(!r)return null;const _=su.includes(r.status),M=["failed","interrupted","merge-failed"].includes(r.status);return s.jsxs(s.Fragment,{children:[s.jsxs(Dt,{children:[s.jsx("button",{disabled:!M,title:M?"":"仅 failed/interrupted/merge-failed 可重试",onClick:()=>c.doAction("retry"),children:"重试"}),s.jsx("button",{className:"danger",disabled:_,title:_?"终态任务不可取消":"",onClick:()=>c.doAction("cancel"),children:"取消"}),s.jsx("button",{disabled:r.status!=="completed",title:r.status!=="completed"?"仅 completed 可合并":"",onClick:()=>c.doAction("merge"),children:"合并(completed → merged)"}),s.jsx("button",{disabled:r.status!=="merged",title:r.status!=="merged"?"仅 merged 可提 PR":"",onClick:()=>c.doAction("pr"),children:"提 PR(须 merged)"}),_?s.jsx("button",{onClick:()=>c.setForkVisible(!0),children:"分支"}):null,s.jsx("button",{onClick:c.taskCost,children:"查成本"}),s.jsxs("span",{className:"muted",children:[c.actionMsg," ",c.actionReasons]})]}),c.forkVisible?s.jsxs("div",{children:[s.jsx("input",{type:"text",placeholder:"分支首轮消息(必填,带历史的新会话)",style:{width:"100%",boxSizing:"border-box",margin:"6px 0"},value:m,onChange:N=>o(N.target.value)}),s.jsxs(Dt,{children:[s.jsx("button",{className:"seal",onClick:async()=>{await c.forkTask(m),o("")},children:"创建分支任务"}),s.jsx("span",{className:"muted",children:c.forkMsg})]})]}):null]})}function fg(){const c=Ot(),[r,m]=v.useState("uncommittedChanges"),[o,_]=v.useState(""),[M,N]=v.useState(""),[x,Q]=v.useState("");return s.jsxs(s.Fragment,{children:[s.jsx("h3",{children:"评审队列"}),s.jsxs("select",{"aria-label":"评审目标",value:r,onChange:U=>m(U.target.value),children:[s.jsx("option",{value:"uncommittedChanges",children:"未提交改动(工作区)"}),s.jsx("option",{value:"baseBranch",children:"与分支的差异"}),s.jsx("option",{value:"commit",children:"指定提交"}),s.jsx("option",{value:"custom",children:"自定义评审指令"})]}),s.jsx("input",{className:"stacked",placeholder:"与分支的差异用:分支名(如 main)",style:{width:"100%"},value:o,onChange:U=>_(U.target.value)}),s.jsx("input",{className:"stacked",placeholder:"指定提交用:提交 sha",style:{width:"100%"},value:M,onChange:U=>N(U.target.value)}),s.jsx("textarea",{placeholder:"自定义评审指令用:评审指令正文",value:x,onChange:U=>Q(U.target.value)}),s.jsxs(Dt,{children:[s.jsx("button",{className:"primary",onClick:()=>void c.postReview({target_type:r,branch:o.trim()||void 0,sha:M.trim()||void 0,instructions:x.trim()||void 0}),children:"登记评审需求"}),s.jsx("button",{onClick:c.refreshReviews,children:"刷新队列"}),s.jsx("span",{className:"muted",children:c.reviewMsg})]}),s.jsx("div",{className:"muted",children:"本基线只登记评审需求(requested),不自动跑评审;评审是否执行、结果如何,以评审队列里的记录为准。"}),c.reviewError?s.jsx("div",{className:"muted",children:c.reviewError}):c.reviews.length===0?s.jsx("div",{className:"muted",children:"点任务行查看详情后,点“刷新队列”查看评审记录"}):s.jsx(fu,{children:c.reviews.map(U=>{let G=U.target_type||"";return U.branch&&(G+=":"+U.branch),U.sha&&(G+=":"+String(U.sha).slice(0,12)),U.instructions&&(G+=":"+String(U.instructions).slice(0,80)),s.jsxs("li",{children:[s.jsxs("span",{className:"row-main",children:[s.jsx("b",{children:"评审"})," ",Oe(U.id)," | ",G," | ",s.jsx("span",{className:"st-"+(U.status||""),children:U.status}),U.created_at?" | "+ka(U.created_at):"",s.jsx("br",{}),U.findings?String(U.findings).slice(0,1e3):s.jsx("span",{className:"muted",children:"(暂无 findings:评审尚未执行或尚未写回)"})]}),s.jsx("button",{onClick:()=>c.submitFindings(U.id),children:"写 findings"})]},U.id)})})]})}function rg(){const c=Ot();return c.currentTask?c.currentTask.coordinator_parts?c.coordChildren.length===0?s.jsx("div",{className:"muted",children:"(子任务尚未创建)"}):s.jsx(fu,{children:c.coordChildren.map(r=>s.jsx("li",{children:s.jsxs("span",{className:"row-main",children:["分工 ",s.jsx("b",{children:r.coordinator_part||""})," | 状态 ",s.jsx("span",{className:"st-"+r.status,children:r.status})," | ",Oe(r.id)," | ",String(r.prompt||"").slice(0,60)]})},r.id))}):s.jsx("div",{className:"muted",children:"(非协调员任务)"}):s.jsx("div",{className:"muted",children:"点任务行查看详情后,这里显示协调员的子任务"})}function og(){const c=Ot();if(!c.currentTask)return s.jsx("div",{className:"muted",children:"点任务行查看详情后,这里显示子代理链路"});if(c.agents.length===0)return s.jsxs("div",{className:"muted",children:["(暂无子代理)",c.agentsNote?s.jsx("span",{className:"err",children:c.agentsNote}):null]});const r={main:"主任务",delegate:"委派子任务",model:"模型子代理"},m={running:"进行中",completed:"已完成",failed:"失败",interrupted:"已中断",unknown:"未知"};return s.jsx(fu,{children:c.agents.map((o,_)=>s.jsx("li",{children:s.jsxs("span",{className:"row-main",children:[s.jsxs("b",{children:[r[o.kind||""]||o.kind||"",":"]}),o.name||""," ",s.jsx("span",{className:"st-"+(o.status||""),children:m[o.status||""]||o.status||"?"})," | 过程调用 "+(o.calls?o.calls.length:0)+" 条",o.updated_ts?" | 最近活动 "+ka(o.updated_ts/1e3):"",o.prompt?s.jsxs(s.Fragment,{children:[s.jsx("br",{}),s.jsxs("span",{className:"muted",children:["任务:",o.prompt]})]}):null,o.calls&&o.calls.length?s.jsxs(s.Fragment,{children:[s.jsx("br",{}),o.calls.slice(-50).map((M,N)=>s.jsx("div",{children:fr(M)},N))]}):s.jsxs(s.Fragment,{children:[s.jsx("br",{}),s.jsx("span",{className:"muted",children:"(暂无过程调用)"})]})]})},_))})}function dg(){const c=Ot();return s.jsxs(s.Fragment,{children:[s.jsxs(Dt,{children:[s.jsx("button",{onClick:c.refreshApprovals,children:"刷新审批队列"}),s.jsx("span",{className:"muted",children:c.approvalMsg})]}),s.jsx("div",{className:"muted",children:"待审批项需人工点记录允许或记录拒绝;超时默认拒绝。当前版本只留回执,不拦截实时行为(实时请求的事前拦截待 host 接入后生效,在此之前实时行为不变)。"}),s.jsx(Dl,{empty:"(暂无审批项)",items:c.approvals.map(r=>s.jsxs("span",{className:"row-main",children:["[",r.kind,"|",r.status,"] ",r.summary,["approved","denied","expired"].includes(r.status||"")?"|回执:"+(r.decision||r.status)+" by "+String(r.decided_by||"").slice(0,8)+" "+ka(r.decided_at):"",r.status==="pending"?s.jsxs(s.Fragment,{children:[" ",s.jsx("button",{onClick:()=>c.decideApproval(r.id,"approved"),children:"记录允许"})," ",s.jsx("button",{onClick:()=>c.decideApproval(r.id,"denied"),children:"记录拒绝"})]}):null]},r.id))})]})}function mg(){const c=Ot(),[r,m]=v.useState(""),[o,_]=v.useState("");return s.jsxs(s.Fragment,{children:[s.jsx("input",{placeholder:"目标任务 id(与本任务同项目;对方运行中排队执行、已终态则续跑复活,绝不打断当前轮)",style:{width:"100%"},value:r,onChange:M=>m(M.target.value)}),s.jsx("textarea",{placeholder:"消息正文(以本任务名义发出;对方 agent 会看到发送方任务 id,可照此回消息)",value:o,onChange:M=>_(M.target.value)}),s.jsxs(Dt,{children:[s.jsx("button",{onClick:async()=>{await c.postPeer("queued",r,o),_("")},children:"排队发给对方"}),s.jsx("button",{className:"primary",onClick:async()=>{await c.postPeer("direct",r,o),_("")},children:"直接发送"}),s.jsx("span",{className:"muted",children:c.peerMsg})]}),s.jsx(Dl,{empty:"(本任务尚未发出任务间消息)",items:c.peerMessages.map((M,N)=>s.jsxs("span",{className:"row-main",children:["[发给 ",String(M.task_id).slice(0,8),"|",M.mode,"|",M.status,"] ",String(M.body||"").slice(0,120)]},N))})]})}function hg(){const c=Ot(),[r,m]=v.useState(""),o=c.currentTask?["completed","failed","interrupted"].includes(c.currentTask.status):!1;return s.jsxs(s.Fragment,{children:[s.jsx("div",{className:"muted",children:c.threadText||"点任务行查看详情后,这里显示线程元数据"}),s.jsxs(Dt,{children:[s.jsx("input",{type:"text",placeholder:"新线程名",value:r,onChange:_=>m(_.target.value)}),s.jsx("button",{disabled:!o,onClick:()=>c.threadAction("rename",r),children:"重命名"}),s.jsx("button",{disabled:!o,onClick:()=>c.threadAction("archive",""),children:"归档"}),s.jsx("button",{disabled:!o,onClick:()=>c.threadAction("unarchive",""),children:"取消归档"}),s.jsx("button",{disabled:!o,onClick:()=>c.threadAction("compact",""),children:"压缩"}),s.jsx("span",{className:"muted",children:c.threadGateNote}),s.jsx("span",{className:"muted",children:c.threadMsg})]}),s.jsx(Dl,{empty:"暂无其他线程",items:c.threadList.map((_,M)=>s.jsxs("span",{className:"row-main",children:[_.name||_.thread_name||_.id||""," [",_.id||"","]",_.archived?" [已归档]":"",_.cwd?" "+_.cwd:""]},M))}),s.jsx("div",{className:"muted",children:"限制:Docker/异机任务线程操作一律 409;merged/merge-failed 不可改;turn/steer 与 review/start 不在本批。"})]})}function vg(){const c=Ot(),r=c.currentTask;return r?s.jsxs(Ve,{id:"nav-detail",title:"任务详情",children:[s.jsxs("div",{children:["状态 ",s.jsx("b",{className:"st-"+r.status,children:r.status}),"(",wy[r.status]||"未知状态",")",s.jsx("br",{}),"任务 ",r.id," | turn ",Oe(r.turn_id)," | root turn ",Oe(r.root_turn_id),s.jsx("br",{}),"executor ",r.executor||""," | 主机 ",r.worktree_host||"",s.jsx("br",{}),"模型 ",r.model||"默认"," | 强度 ",r.effort||"默认",r.child_model||r.child_effort?s.jsxs(s.Fragment,{children:[s.jsx("br",{}),"子任务默认 ",(r.child_model||"跟随本任务")+" / "+(r.child_effort||"跟随本任务")]}):null,s.jsx("br",{}),"权限 ",r.approval||"默认"," | 项目 ",Oe(r.project_id),s.jsx("br",{}),"更新 ",ka(r.updated_at),r.plan?s.jsxs(s.Fragment,{children:[s.jsx("br",{}),"计划模式(只读)"]}):null,r.forked_from?s.jsxs(s.Fragment,{children:[s.jsx("br",{}),"分支自 ",Oe(r.forked_from)]}):null,r.goal_mode?s.jsxs(s.Fragment,{children:[s.jsx("br",{}),r.no_time_limit?"goal 模式无敌版(不限时)":"goal 模式(不限轮次,模型宣告完成)"]}):r.verify_command?s.jsxs(s.Fragment,{children:[s.jsx("br",{}),"goal 模式(旧语义,验收命令)"]}):null,r.coordinator_parts?s.jsxs(s.Fragment,{children:[s.jsx("br",{}),"协调员:",r.coordinator_parts.length," 个子任务(",r.coordinator_parts.map(m=>m.name).join("、"),")"]}):null,r.parent_task_id?s.jsxs(s.Fragment,{children:[s.jsx("br",{}),"协调子任务,父任务 ",Oe(r.parent_task_id),r.coordinator_part?"("+r.coordinator_part+")":""]}):null,r.attachments&&r.attachments.length?s.jsxs(s.Fragment,{children:[s.jsx("br",{}),"附件:",r.attachments.join("、")]}):null,r.pr_url?s.jsxs(s.Fragment,{children:[s.jsx("br",{}),s.jsxs("a",{href:r.pr_url,target:"_blank",rel:"noopener noreferrer",children:["PR #",r.pr_number]})]}):null,s.jsx("br",{}),"prompt:",r.prompt||""]}),s.jsx(sg,{}),s.jsx("pre",{children:c.detailBody||"(暂无 result/error 输出)"}),c.costBox?s.jsx("pre",{children:c.costBox}):null,s.jsx("h3",{children:"协调子任务"}),s.jsx(rg,{}),s.jsx("h3",{children:"子代理链路"}),s.jsx(og,{}),s.jsx("h3",{children:"评审队列"}),s.jsx(fg,{}),s.jsx("h3",{children:"运行时审批队列"}),s.jsx(dg,{}),s.jsx("h3",{children:"给其他任务发消息"}),s.jsx(mg,{}),s.jsx("h3",{children:"线程"}),s.jsx(hg,{})]}):s.jsx(Ve,{id:"nav-detail",title:"任务详情",children:s.jsx("div",{className:"muted",children:"点任务行查看详情"})})}function yg(){const c=Ot(),[r,m]=v.useState(""),[o,_]=v.useState(""),[M,N]=v.useState([]),[x,Q]=v.useState(null),[U,G]=v.useState(!1),[b,B]=v.useState(""),[lt,at]=v.useState(""),I=v.useCallback(async()=>{if(!c.keySaved){N([]);return}try{const nt=await tt($.userKeys);N(nt.keys||[]),at("")}catch(nt){at(nt instanceof Error?nt.message:"加载 key 列表失败")}},[c.keySaved]);v.useEffect(()=>{I()},[I]);const V=async()=>{B(""),at(""),G(!1);try{const nt=await tt($.userKeys,"POST",{label:o.trim()||"api-key"});Q(nt),_(""),B("新 key 已生成,只显示一次:复制后请妥善保存。"),await I()}catch(nt){at(nt instanceof Error?nt.message:"生成 key 失败")}},dt=async()=>{if(x)try{await navigator.clipboard.writeText(x.api_key),G(!0)}catch{at("复制失败:请手动选中上方 key 文本复制")}},Mt=()=>{x&&(c.saveKeyInput(x.api_key),Q(null),B("已存为当前浏览器 key(原有 key 未被撤销,需要时可单独撤销)。"))},te=async nt=>{const kt=(()=>{try{return El().slice(-4)}catch{return""}})(),ee=nt.id==="legacy"?"(主 key:撤销后当前浏览器保存的 key 也可能随之失效,需重新登录拿新 key)":nt.hint&&nt.hint===kt?"(这就是本浏览器当前在用的 key,撤销后本页会立刻未连接)":"";if(window.confirm(`撤销 key「${nt.label}」(后 4 位 ${nt.hint||"无"})吗?${ee}撤销不可恢复。`)){B(""),at("");try{await tt($.userKey(nt.id),"DELETE"),B(`已撤销 key「${nt.label}」。`),await I()}catch(it){at(it instanceof Error?it.message:"撤销失败")}}};return s.jsxs(Ve,{id:"nav-key",title:"API Key",children:[s.jsxs(Dt,{children:[s.jsx("input",{type:"password",placeholder:"粘贴你的 X-API-Key(与调 API 用的同一个)",autoComplete:"off",value:r,onChange:nt=>m(nt.target.value)}),s.jsx("button",{className:"primary",onClick:()=>{c.saveKeyInput(r),m("")},children:"保存到本浏览器"}),s.jsx("button",{onClick:c.clearKeyInput,children:"清除"}),s.jsx("span",{className:"muted",children:c.keyState})]}),s.jsx("div",{children:s.jsx("span",{className:"muted",children:c.quotaText})}),!c.keySaved&&s.jsx("div",{children:s.jsx("span",{className:"muted",children:"先粘贴并保存已有 key,再生成或管理 key(生成接口本身也要用已有 key 鉴权)。"})}),c.keySaved&&s.jsxs(s.Fragment,{children:[s.jsxs(Dt,{children:[s.jsx("input",{placeholder:"新 key 备注(可选,默认 api-key,如 harness2-temp)",autoComplete:"off",value:o,onChange:nt=>_(nt.target.value)}),s.jsx("button",{className:"primary",onClick:()=>void V(),children:"生成新 key"}),s.jsx("button",{onClick:()=>void I(),children:"刷新列表"})]}),x&&s.jsxs("div",{children:[s.jsx("div",{children:s.jsxs("span",{className:"muted",children:["新 key(",x.label,",后 4 位 ",x.hint,"):只显示一次,关闭后无法再查看。"]})}),s.jsxs(Dt,{children:[s.jsx("input",{type:"text",readOnly:!0,value:x.api_key,onFocus:nt=>nt.target.select()}),s.jsx("button",{className:"primary",onClick:()=>void dt(),children:U?"已复制":"复制"}),s.jsx("button",{onClick:Mt,children:"存为当前浏览器 key"}),s.jsx("button",{onClick:()=>Q(null),children:"关闭(不再显示)"})]})]}),b&&s.jsx("div",{children:s.jsx("span",{className:"muted",children:b})}),lt&&s.jsx("div",{children:s.jsx("span",{children:lt})}),s.jsxs("div",{children:[M.length===0&&s.jsx("span",{className:"muted",children:"暂无 key(或列表加载失败,见上方报错)。"}),M.map(nt=>s.jsxs("div",{children:[s.jsx("span",{children:nt.label})," ",s.jsxs("span",{className:"muted",children:["后 4 位 ",nt.hint||"无"," · 创建 ",ka(nt.created_at)," · 最近使用 ",nt.last_used_at?ka(nt.last_used_at):"未使用过"]})," ",nt.revoked_at?s.jsxs("span",{className:"muted",children:["已撤销(",ka(nt.revoked_at),")"]}):s.jsx("button",{onClick:()=>void te(nt),children:"撤销"})]},nt.id))]})]})]})}function gg(){const c=Ot();return s.jsxs(Ve,{id:"adminCard",title:s.jsxs(s.Fragment,{children:["管理区 ",s.jsx("span",{className:"muted",children:"(仅全局管理员)"})]}),children:[s.jsx("div",{className:"muted",children:c.adminGate}),c.adminBody?s.jsxs(s.Fragment,{children:[s.jsxs(Dt,{children:[s.jsx("input",{type:"text",placeholder:"要查配额的用户 id",value:c.adminUserId,onChange:r=>c.setAdminUserId(r.target.value)}),s.jsx("button",{onClick:c.adminQuota,children:"查该用户配额"})]}),s.jsxs(Dt,{children:[s.jsx("button",{onClick:c.adminSweep,children:"手动触发 sweep(清理陈旧 running 任务)"}),s.jsx("button",{onClick:c.adminBackup,children:"手动触发备份"})]}),s.jsx("div",{className:"muted",children:c.adminResult})]}):null]})}function Sg(){const c=Ot(),[r,m]=v.useState(""),[o,_]=v.useState(""),[M,N]=v.useState("");return s.jsxs(Ve,{id:"nav-projects",title:"项目",children:[s.jsxs(Dt,{children:[s.jsxs("select",{"aria-label":"项目",value:c.projectId,onChange:x=>c.selectProject(x.target.value),children:[c.projects.length===0?s.jsx("option",{value:"",children:"(先加载项目)"}):null,c.projects.map(x=>s.jsxs("option",{value:x.id,children:[x.name," (",Oe(x.id),")"]},x.id))]}),s.jsx("button",{onClick:c.refreshProjects,children:"刷新"})]}),s.jsxs(Dt,{children:[s.jsx("input",{type:"text",placeholder:"新项目名",value:r,onChange:x=>m(x.target.value)}),s.jsxs("select",{"aria-label":"从 GitHub 仓库选",value:o,onChange:x=>{_(x.target.value),x.target.value&&N(x.target.value)},children:[s.jsx("option",{value:"",children:"(从 GitHub App 安装仓库里选,或手动输入)"}),c.githubRepos.map(x=>s.jsx("option",{value:x.clone_url,children:x.repo_full_name},x.clone_url))]}),s.jsx("input",{type:"text",placeholder:"repo_url(可选)",value:M,onChange:x=>N(x.target.value)}),s.jsx("button",{onClick:async()=>{await c.createProject(r,M),m(""),N(""),_("")},children:"新建项目"})]}),s.jsx("span",{className:"muted",children:c.projectMsg})]})}function pg(){const c=Ot(),[r,m]=v.useState(""),[o,_]=v.useState("contributor"),M=c.projects.find(N=>N.id===c.projectId);return s.jsxs(Ve,{title:"项目成员",children:[M?s.jsxs("div",{className:"muted",children:[M.name," | ",M.id," | 仓库 ",M.repo_url||"未绑定"," | 我的角色 ",M.my_role||"未知"]}):s.jsx("div",{className:"muted",children:"先选项目"}),s.jsxs(Dt,{children:[s.jsx("input",{type:"text",placeholder:"成员 user_id 或用户名",value:r,onChange:N=>m(N.target.value)}),s.jsxs("select",{"aria-label":"邀请角色",value:o,onChange:N=>_(N.target.value),children:[s.jsx("option",{value:"viewer",children:"viewer(只读)"}),s.jsx("option",{value:"contributor",children:"contributor(可建任务)"}),s.jsx("option",{value:"maintainer",children:"maintainer(可批合并)"}),s.jsx("option",{value:"owner",children:"owner(可管项目)"})]}),s.jsx("button",{onClick:async()=>{await c.inviteMember(r,o),m("")},children:"邀请成员"}),s.jsx("button",{onClick:c.refreshMembers,children:"刷新成员"})]}),c.memberError?s.jsx("div",{className:"muted",children:c.memberError}):c.members.length===0?s.jsx("div",{className:"muted",children:"先选项目"}):s.jsx(fu,{children:c.members.map(N=>{const x=(N.username||"")+(N.username?"("+String(N.user_id).slice(0,8)+")":String(N.user_id).slice(0,8));return s.jsxs("li",{children:[s.jsx("span",{className:"row-main",children:x}),s.jsx("select",{"aria-label":"成员角色",value:N.role||"viewer",onChange:Q=>void c.changeMemberRole(N.user_id,Q.target.value),children:Gy.map(Q=>s.jsx("option",{value:Q,children:Q},Q))})]},N.user_id)})}),s.jsx("span",{className:"muted",children:c.memberMsg})]})}function bg(){const c=Ot(),[r,m]=v.useState(""),[o,_]=v.useState(""),[M,N]=v.useState("");return s.jsxs(Ve,{id:"nav-env",title:s.jsxs(s.Fragment,{children:["环境 ",s.jsx("span",{className:"muted",children:"(选、建、管:当前项目的基准检出)"})]}),children:[s.jsxs(Dt,{children:[s.jsx("button",{onClick:c.refreshEnvs,children:"刷新"}),s.jsx("span",{className:"muted",children:c.envCount})]}),c.envs.length===0?s.jsx("div",{className:"muted",children:"先选项目"}):s.jsx(fu,{children:c.envs.map(x=>s.jsxs("li",{children:[s.jsxs("span",{className:"row-main",children:[x.name,"(",Oe(x.id),") / 分支 ",x.branch||"默认分支"," / 执行器 ",x.executor||"不限"," / 状态 ",x.status,x.status==="failed"&&x.error_text?" / 失败原因:"+x.error_text:""]}),x.status==="archived"?null:s.jsx("button",{onClick:()=>void c.archiveEnv(x.id),children:"归档"})]},x.id))}),s.jsxs(Dt,{children:[s.jsx("input",{type:"text",placeholder:"新环境名",value:r,onChange:x=>m(x.target.value)}),s.jsx("input",{type:"text",placeholder:"分支(可选,空=默认分支)",value:o,onChange:x=>_(x.target.value)}),s.jsxs("select",{"aria-label":"新环境执行器",value:M,onChange:x=>N(x.target.value),children:[s.jsx("option",{value:"",children:"执行器:不限"}),s.jsx("option",{value:"local",children:"local"}),s.jsx("option",{value:"docker",children:"docker"})]}),s.jsx("button",{onClick:async()=>{await c.createEnv(r,o,M),m(""),_("")},children:"新建环境"})]}),s.jsx("span",{className:"muted",children:c.envMsg})]})}function jg(){const c=Ot(),[r,m]=v.useState("");return s.jsxs(Ve,{title:"仓库与环境上下文",children:[s.jsx("div",{className:"muted",children:c.envRepoLine||"先选项目"}),s.jsx("div",{className:"muted",children:c.envCount}),c.envRepoBar?s.jsxs(Dt,{children:[s.jsxs("select",{"aria-label":"补仓库",value:r,onChange:o=>m(o.target.value),children:[s.jsx("option",{value:"",children:"(从 GitHub App 安装仓库里选)"}),c.githubRepos.map(o=>s.jsx("option",{value:o.clone_url,children:o.repo_full_name},o.clone_url))]}),s.jsx("button",{onClick:()=>void c.saveEnvRepo(r),children:"保存仓库"})]}):null,s.jsx("span",{className:"muted",children:c.envRepoMsg})]})}function xg(){const c=Ot();return s.jsxs(Ve,{id:"nav-workers",title:"Workers",children:[s.jsx(Dt,{children:s.jsx("button",{onClick:c.refreshWorkers,children:"刷新"})}),c.workersError?s.jsx("div",{className:"muted",children:c.workersError}):c.workers===null?s.jsx("div",{className:"muted",children:c.workersSummary||"未加载"}):c.workers.length===0?s.jsx("div",{className:"muted",children:"无 worker 注册"}):s.jsx(fu,{children:c.workers.map((r,m)=>{const o=r.running===void 0||r.running===null?"?":r.running,_=r.capacity===void 0||r.capacity===null?"?":r.capacity,M=wh(r),N=r.alive!==void 0&&r.alive!==null?!!r.alive:M.age!==null&&M.age<=120,x=N?" / 在线":" / 离线(占用为上次上报值)";return s.jsx("li",{className:N?"is-online":"is-offline",children:s.jsxs("span",{className:"row-main",children:[r.worker_id||r.id||"?"," / ",r.executor||""," / 占用 ",o,"/",_,x," / 最后心跳 ",M.text]})},m)})})]})}function Tg(){const c=Ot();return s.jsxs(Ve,{title:"健康与配额",children:[s.jsxs(Dt,{children:[s.jsx("span",{className:"muted",children:c.healthText}),s.jsx("button",{onClick:c.refreshHealth,children:"刷新"})]}),s.jsx("div",{children:s.jsx("span",{className:"muted",children:c.quotaText})}),s.jsx("div",{className:"muted",children:c.workersSummary})]})}function Eg(){const c=Ot();return s.jsxs(Ve,{id:"nav-skills",title:"技能与 MCP",children:[s.jsx("div",{className:"muted",children:"反映宿主租户 home,容器内 home 可能不同;重载只在 schema 枚举里,当前 pin 的二进制拒绝时原样 502;OAuth 只发起登录,不代表登录完成。"}),s.jsxs(Dt,{children:[s.jsx("button",{onClick:c.refreshSkills,children:"刷新"}),s.jsx("span",{className:"muted",children:c.skillMsg})]}),s.jsx("h3",{children:"技能"}),c.skillError?s.jsx("div",{className:"muted",children:c.skillError}):s.jsx(Dl,{empty:"暂无技能",items:c.skills.map((r,m)=>s.jsxs("span",{className:"row-main",children:[r.name||r.id||"",r.description?" - "+r.description:"",r.detail?" - "+r.detail:""]},m))}),s.jsx("h3",{children:"应用"}),s.jsx(Dl,{empty:"暂无应用",items:c.apps.map((r,m)=>s.jsxs("span",{className:"row-main",children:[r.name||r.id||"",r.description?" - "+r.description:""]},m))}),s.jsx("h3",{children:"MCP 服务"}),s.jsx(Dl,{empty:"暂无 MCP 服务",items:c.mcpServers.map((r,m)=>{const o=r.detail||r.details||r.state||"";return s.jsxs("span",{className:"row-main",children:[r.name||r.id||""," | 状态 ",r.status||"",o?" | "+o:""]},m)})})]})}function _g(){const c=Ot(),[r,m]=v.useState("");return s.jsxs(Ve,{title:"MCP 操作",children:[s.jsxs(Dt,{children:[s.jsx("button",{onClick:c.reloadMcp,children:"重载配置"}),s.jsx("span",{className:"muted",children:c.mcpMsg})]}),s.jsxs(Dt,{children:[s.jsx("input",{type:"text",placeholder:"MCP 服务名",value:r,onChange:o=>m(o.target.value)}),s.jsx("button",{onClick:()=>void c.mcpOauth(r),children:"发起 OAuth 登录"}),s.jsx("span",{className:"muted",children:c.mcpOauthMsg})]}),c.mcpOauthBox?s.jsx("pre",{children:c.mcpOauthBox}):null]})}function Ng(){const c=Ot(),[r,m]=v.useState(""),[o,_]=v.useState(""),[M,N]=v.useState(""),[x,Q]=v.useState("");return s.jsxs(s.Fragment,{children:[s.jsx("input",{placeholder:"自动化名称(同项目内启用中的名称唯一)",style:{width:"100%"},value:r,onChange:U=>m(U.target.value)}),s.jsx("textarea",{placeholder:"定时任务内容(创建只登记定义与到期状态;执行由后续执行器经 claim 抢单后建任务,不另起调度器)",value:o,onChange:U=>_(U.target.value)}),s.jsxs(Dt,{children:[s.jsx("input",{placeholder:"间隔秒数(默认 86400,最小 60)",style:{width:"40%"},value:M,onChange:U=>N(U.target.value)}),s.jsx("input",{placeholder:"仓库(可选)",style:{width:"40%"},value:x,onChange:U=>Q(U.target.value)}),s.jsx("button",{className:"primary",onClick:async()=>{await c.createAutomation(r,o,M,x),m(""),_(""),N(""),Q("")},children:"创建自动化"}),s.jsx("button",{onClick:c.refreshAutomations,children:"刷新自动化"}),s.jsx("span",{className:"muted",children:c.autoMsg})]}),s.jsx(Dl,{empty:"(暂无自动化)",items:c.automations.map(U=>s.jsxs("span",{className:"row-main",children:["[",U.status,U.due?"|到期":"","] ",U.name,"|每 ",U.interval_seconds," 秒|下次 ",ka(U.next_run_at),U.status==="active"?s.jsxs(s.Fragment,{children:[" ",s.jsx("button",{onClick:()=>c.cancelAutomation(U.id),children:"取消"})]}):null]},U.id))})]})}function Cg(){var m,o,_,M;const c=Ot(),r=c.triage;return c.triageError?s.jsx("div",{className:"muted",children:c.triageError}):r?s.jsxs(s.Fragment,{children:[s.jsxs("div",{className:"data-group",children:[s.jsxs("b",{children:["到期自动化(",((m=r.counts)==null?void 0:m.automations_due)||0,")"]}),s.jsx(Dl,{empty:"(无)",items:(r.automations_due||[]).map((N,x)=>s.jsxs("span",{className:"row-main",children:[N.name,"|每 ",N.interval_seconds," 秒"]},x))})]}),s.jsxs("div",{className:"data-group",children:[s.jsxs("b",{children:["失败/中断任务(",((o=r.counts)==null?void 0:o.failed_tasks)||0,")"]}),s.jsx(Dl,{empty:"(无)",items:(r.failed_tasks||[]).map((N,x)=>s.jsxs("span",{className:"row-main",children:[Oe(N.id),"|",N.status,"|",String(N.prompt||"").slice(0,80)]},x))})]}),s.jsxs("div",{className:"data-group",children:[s.jsxs("b",{children:["待处理后续消息(",((_=r.counts)==null?void 0:_.pending_followups)||0,")"]}),s.jsx(Dl,{empty:"(无)",items:(r.pending_followups||[]).map((N,x)=>s.jsxs("span",{className:"row-main",children:["任务 ",Oe(N.task_id),"|",String(N.body||"").slice(0,80)]},x))})]}),s.jsxs("div",{className:"data-group",children:[s.jsxs("b",{children:["最近自动化产出(",((M=r.counts)==null?void 0:M.recent_runs)||0,")"]}),s.jsx(Dl,{empty:"(无)",items:(r.recent_runs||[]).map((N,x)=>s.jsxs("span",{className:"row-main",children:[Oe(N.automation_id),"|",N.status,N.task_id?"|任务 "+Oe(N.task_id):"",N.task_status?"|"+N.task_status:""]},x))})]})]}):s.jsx("div",{className:"muted",children:"(先选项目)"})}function Ag(){return s.jsx(Ve,{id:"nav-automations",title:"自动化",children:s.jsx(Ng,{})})}function Og(){const c=Ot();return s.jsxs(Ve,{id:"nav-triage",title:"分诊收件箱",children:[s.jsx(Dt,{children:s.jsx("button",{onClick:c.refreshTriage,children:"刷新分诊"})}),s.jsx(Cg,{})]})}const Mg=[["#sec-dispatch","派发"],["#sec-tasks","任务"],["#sec-conv","对话"],["#sec-projects","项目"],["#sec-env","环境"],["#sec-workers","Workers"],["#sec-skills","技能"],["#sec-automations","自动化"],["#sec-triage","分诊"],["#sec-admin","管理区"],["#sec-key","API Key"]];function zg(){return s.jsxs("header",{className:"dash-topbar",children:[s.jsxs("div",{className:"dash-topbar-row",children:[s.jsx("span",{className:"dash-brand",children:"Codex 命令台"}),s.jsx(Rg,{}),s.jsx("span",{className:"muted dash-hide-sm",children:s.jsx(Dg,{})}),s.jsx("span",{className:"muted dash-hide-sm",children:s.jsx(Ug,{})}),s.jsx("span",{className:"muted dash-stamp",children:s.jsx(Hg,{})})]}),s.jsx("nav",{className:"dash-nav","aria-label":"页面导航",children:Mg.map(([c,r])=>s.jsx("a",{href:c,children:r},c))})]})}function Rg(){const c=Ot();return s.jsx("span",{className:c.keySaved?"dash-status ok":"dash-status off",children:c.keySaved?"● 已连接":"○ 未连接"})}function Dg(){return s.jsx(s.Fragment,{children:Ot().healthText})}function Ug(){return s.jsx(s.Fragment,{children:Ot().quotaText})}function Hg(){return s.jsxs(s.Fragment,{children:["自动刷新 · 每 10 秒 · 已刷新 ",Ot().refreshStamp]})}function Bg(){const c=Iy();Fy(m=>c.refreshAll(m),1e4),Wy(()=>c.refreshSlow(),6e4);const r=()=>{var m;(m=document.getElementById("sec-dispatch"))==null||m.scrollIntoView({behavior:"smooth"})};return s.jsxs(Yh.Provider,{value:c,children:[s.jsx(zg,{}),s.jsxs("main",{className:"dash-page",children:[s.jsx(Py,{}),s.jsxs("div",{className:"dash-col dash-col-left",children:[s.jsxs("section",{id:"sec-tasks",className:"dash-section card",children:[s.jsx("h2",{children:"任务列表"}),s.jsx(eg,{onNew:r})]}),s.jsxs("section",{id:"sec-projects",className:"dash-section",children:[s.jsx(Sg,{}),s.jsx(pg,{})]})]}),s.jsxs("div",{className:"dash-col dash-col-mid",children:[s.jsx("section",{id:"sec-dispatch",className:"dash-section",children:s.jsx(tg,{})}),s.jsxs("section",{id:"sec-conv",className:"dash-section",children:[s.jsxs("div",{className:"card",children:[s.jsx("h2",{children:"对话"}),s.jsx(ig,{})]}),s.jsx(vg,{})]})]}),s.jsxs("div",{className:"dash-col dash-col-right",children:[s.jsxs("section",{id:"sec-env",className:"dash-section",children:[s.jsx(bg,{}),s.jsx(jg,{})]}),s.jsxs("section",{id:"sec-workers",className:"dash-section",children:[s.jsx(xg,{}),s.jsx(Tg,{})]}),s.jsxs("section",{id:"sec-skills",className:"dash-section",children:[s.jsx(Eg,{}),s.jsx(_g,{})]}),s.jsx("section",{id:"sec-automations",className:"dash-section",children:s.jsx(Ag,{})}),s.jsx("section",{id:"sec-triage",className:"dash-section",children:s.jsx(Og,{})}),s.jsx("section",{id:"sec-admin",className:"dash-section",children:s.jsx(gg,{})}),s.jsx("section",{id:"sec-key",className:"dash-section",children:s.jsx(yg,{})})]})]})]})}qy.createRoot(document.getElementById("root")).render(s.jsx(Oy.StrictMode,{children:s.jsx(Bg,{})}));