diff --git a/cloud/console-react/src/sections/TaskDetailPanel.tsx b/cloud/console-react/src/sections/TaskDetailPanel.tsx index 45b9f03..487ccf3 100644 --- a/cloud/console-react/src/sections/TaskDetailPanel.tsx +++ b/cloud/console-react/src/sections/TaskDetailPanel.tsx @@ -23,6 +23,29 @@ import { CoordPanel, AgentsPanel, ApprovalPanel, PeerPanel, ThreadPanel } from " // 只是没被挂进页签)。 // Data, actions and sub-sections are unchanged; only grouping // and visibility changed. +// LLM failure summary: the raw error_text is usually a codex JSON +// blob (e.g. a 503 from the relay). The overview must say, at a +// glance, whether the model ever ran and why it stopped — previously +// the only copy lived in the "操作与结果"
, so a failed task
+// looked like "failed" with no reason. This is a display mapping
+// only; it never claims a connection state the server does not
+// report (there is no "LLM connected" field — running progress
+// below is elapsed time + last activity, not a live socket state).
+function errorSummary(err: string): string {
+  if (/503|Service Unavailable/.test(err)) return "上游模型服务暂时不可用(503):模型一轮都没跑出来,不是任务逻辑失败;等上游恢复或换模型重试";
+  if (/429|rate limit/i.test(err)) return "上游限流(429):模型拒绝了本次调用,可稍后重试";
+  if (/timeout|timed out/i.test(err)) return "上游调用超时:模型响应未在限时内返回";
+  if (/401|403|Invalid API key|unauthorized/i.test(err)) return "上游鉴权失败:网关 key 或权限有问题";
+  if (/ECONNREFUSED|ENOTFOUND|network|fetch failed/i.test(err)) return "连不上上游模型服务:网络或网关地址有问题";
+  return "任务失败(原因见原始错误文本)";
+}
+
+function fmtAge(sec: number | null): string {
+  if (sec === null || sec < 0) return "未知";
+  if (sec < 60) return Math.floor(sec) + " 秒前";
+  if (sec < 3600) return Math.floor(sec / 60) + " 分钟前";
+  return (sec / 3600).toFixed(1) + " 小时前";
+}
 type DetailTab = "overview" | "collab" | "review" | "threads" | "browser";
 const DETAIL_TABS: Array<[DetailTab, string]> = [
   ["overview", "概览"], ["collab", "协作"], ["review", "评审与审批"], ["threads", "线程"], ["browser", "浏览器"],
@@ -82,6 +105,22 @@ export default function TaskDetailPanel() {
           
         
       
+      {(t.status === "running" || t.status === "queued") ? (() => {
+        const now = Date.now() / 1000;
+        const last = t.last_heartbeat || t.updated_at || null;
+        const idle = last ? now - last : null;
+        return (
+          
状态 {t.status === "running" ? "进行中" : "排队中"} · 已用 {dur}{idle !== null ? " · 上次活动 " + fmtAge(idle) : ""}
+ {idle !== null && idle > 180 + ?
超过 3 分钟无活动:可能在等上游模型响应(上游 503 时 worker 会重试后失败,失败后这里会显示失败原因;无活动不等于已断连,服务端没有“LLM 已连接”字段,不作此断言)
+ :
首轮无输出时属正常:模型第一轮回复到达前 trace 里没有消息;回复到达后会在会话区出现,成本里的 LLM 请求数随之增加
} +
); + })() : null} + {t.error_text ? ( +
{errorSummary(t.error_text)}
+
{t.error_text.slice(0, 1000)}
+
完整错误文本仍在下方“操作与结果”里;模型 {t.model || "默认"} · executor {t.executor || ""}
+
) : null}
任务
{t.id}
diff --git a/cloud/console-react/src/sections/TaskListSection.tsx b/cloud/console-react/src/sections/TaskListSection.tsx index fecb93d..d6aca91 100644 --- a/cloud/console-react/src/sections/TaskListSection.tsx +++ b/cloud/console-react/src/sections/TaskListSection.tsx @@ -72,6 +72,9 @@ export default function TaskListSection({ onNew }: { onNew: () => void }) { {" · "}耗时 {dur} {" · "}{tok} + {(t.status === "failed" || t.status === "interrupted" || t.status === "merge-failed") && t.error_text ? ( +
{/503|Service Unavailable/.test(t.error_text) ? "上游 503:模型服务暂时不可用" : t.error_text.replace(/\s+/g, " ").slice(0, 60)}
+ ) : null} ); diff --git a/cloud/console.html b/cloud/console.html index 4afe0e5..8331ec9 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 Uh;function By(){if(Uh)return ht;Uh=1;var i=Symbol.for("react.transitional.element"),r=Symbol.for("react.portal"),h=Symbol.for("react.fragment"),f=Symbol.for("react.strict_mode"),S=Symbol.for("react.profiler"),N=Symbol.for("react.consumer"),A=Symbol.for("react.context"),p=Symbol.for("react.forward_ref"),H=Symbol.for("react.suspense"),O=Symbol.for("react.memo"),Y=Symbol.for("react.lazy"),j=Symbol.for("react.activity"),k=Symbol.for("react.view_transition"),K=Symbol.iterator;function L(y){return y===null||typeof y!="object"?null:(y=K&&y[K]||y["@@iterator"],typeof y=="function"?y:null)}var at={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},X=Object.assign,vt={};function bt(y,D,ut){this.props=y,this.context=D,this.refs=vt,this.updater=ut||at}bt.prototype.isReactComponent={},bt.prototype.setState=function(y,D){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,D,"setState")},bt.prototype.forceUpdate=function(y){this.updater.enqueueForceUpdate(this,y,"forceUpdate")};function zt(){}zt.prototype=bt.prototype;function J(y,D,ut){this.props=y,this.context=D,this.refs=vt,this.updater=ut||at}var Rt=J.prototype=new zt;Rt.constructor=J,X(Rt,bt.prototype),Rt.isPureReactComponent=!0;var it=Array.isArray;function Q(){}var rt={H:null,A:null,T:null,S:null},Ut=Object.prototype.hasOwnProperty;function Qt(y,D,ut){var nt=ut.ref;return{$$typeof:i,type:y,key:D,ref:nt!==void 0?nt:null,props:ut}}function Nt(y,D){return Qt(y.type,D,y.props)}function kt(y){return typeof y=="object"&&y!==null&&y.$$typeof===i}function B(y){var D={"=":"=0",":":"=2"};return"$"+y.replace(/[=:]/g,function(ut){return D[ut]})}var ot=/\/+/g;function st(y,D){return typeof y=="object"&&y!==null&&y.key!=null?B(""+y.key):D.toString(36)}function q(y){switch(y.status){case"fulfilled":return y.value;case"rejected":throw y.reason;default:switch(typeof y.status=="string"?y.then(Q,Q):(y.status="pending",y.then(function(D){y.status==="pending"&&(y.status="fulfilled",y.value=D)},function(D){y.status==="pending"&&(y.status="rejected",y.reason=D)})),y.status){case"fulfilled":return y.value;case"rejected":throw y.reason}}throw y}function C(y,D,ut,nt,Tt){var xt=typeof y;(xt==="undefined"||xt==="boolean")&&(y=null);var Ot=!1;if(y===null)Ot=!0;else switch(xt){case"bigint":case"string":case"number":Ot=!0;break;case"object":switch(y.$$typeof){case i:case r:Ot=!0;break;case Y:return Ot=y._init,C(Ot(y._payload),D,ut,nt,Tt)}}if(Ot)return Tt=Tt(y),Ot=nt===""?"."+st(y,0):nt,it(Tt)?(ut="",Ot!=null&&(ut=Ot.replace(ot,"$&/")+"/"),C(Tt,D,ut,"",function(ce){return ce})):Tt!=null&&(kt(Tt)&&(Tt=Nt(Tt,ut+(Tt.key==null||y&&y.key===Tt.key?"":(""+Tt.key).replace(ot,"$&/")+"/")+Ot)),D.push(Tt)),1;Ot=0;var $=nt===""?".":nt+":";if(it(y))for(var dt=0;dt>>1,yt=q[gt];if(0>>1;gtS(Ce,lt))yS(D,Ce)?(q[gt]=D,q[y]=lt,gt=y):(q[gt]=Ce,q[we]=lt,gt=we);else if(yS(D,lt))q[gt]=D,q[y]=lt,gt=y;else break t}}return C}function S(q,C){var lt=q.sortIndex-C.sortIndex;return lt!==0?lt:q.id-C.id}if(i.unstable_now=void 0,typeof performance=="object"&&typeof performance.now=="function"){var N=performance;i.unstable_now=function(){return N.now()}}else{var A=Date,p=A.now();i.unstable_now=function(){return A.now()-p}}var H=[],O=[],Y=1,j=null,k=3,K=!1,L=!1,at=!1,X=!1,vt=typeof setTimeout=="function"?setTimeout:null,bt=typeof clearTimeout=="function"?clearTimeout:null,zt=typeof setImmediate<"u"?setImmediate:null;function J(q){for(var C=h(O);C!==null;){if(C.callback===null)f(O);else if(C.startTime<=q)f(O),C.sortIndex=C.expirationTime,r(H,C);else break;C=h(O)}}function Rt(q){if(at=!1,J(q),!L)if(h(H)!==null)L=!0,it||(it=!0,kt());else{var C=h(O);C!==null&&st(Rt,C.startTime-q)}}var it=!1,Q=-1,rt=5,Ut=-1;function Qt(){return X?!0:!(i.unstable_now()-Utq&&Qt());){var gt=j.callback;if(typeof gt=="function"){j.callback=null,k=j.priorityLevel;var yt=gt(j.expirationTime<=q);if(q=i.unstable_now(),typeof yt=="function"){j.callback=yt,J(q),C=!0;break e}j===h(H)&&f(H),J(q)}else f(H);j=h(H)}if(j!==null)C=!0;else{var ge=h(O);ge!==null&&st(Rt,ge.startTime-q),C=!1}}break t}finally{j=null,k=lt,K=!1}C=void 0}}finally{C?kt():it=!1}}}var kt;if(typeof zt=="function")kt=function(){zt(Nt)};else if(typeof MessageChannel<"u"){var B=new MessageChannel,ot=B.port2;B.port1.onmessage=Nt,kt=function(){ot.postMessage(null)}}else kt=function(){vt(Nt,0)};function st(q,C){Q=vt(function(){q(i.unstable_now())},C)}i.unstable_IdlePriority=5,i.unstable_ImmediatePriority=1,i.unstable_LowPriority=4,i.unstable_NormalPriority=3,i.unstable_Profiling=null,i.unstable_UserBlockingPriority=2,i.unstable_cancelCallback=function(q){q.callback=null},i.unstable_forceFrameRate=function(q){0>q||125gt?(q.sortIndex=lt,r(O,q),h(H)===null&&q===h(O)&&(at?(bt(Q),Q=-1):at=!0,st(Rt,lt-gt))):(q.sortIndex=yt,r(H,q),L||K||(L=!0,it||(it=!0,kt()))),q},i.unstable_shouldYield=Qt,i.unstable_wrapCallback=function(q){var C=k;return function(){var lt=k;k=C;try{return q.apply(this,arguments)}finally{k=lt}}}})(so)),so}var kh;function Gy(){return kh||(kh=1,co.exports=Yy()),co.exports}var ro={exports:{}},He={};/** + */var wh;function Yy(){return wh||(wh=1,(function(i){function r(q,C){var lt=q.length;q.push(C);t:for(;0>>1,yt=q[gt];if(0>>1;gtS(Ce,lt))yS(D,Ce)?(q[gt]=D,q[y]=lt,gt=y):(q[gt]=Ce,q[we]=lt,gt=we);else if(yS(D,lt))q[gt]=D,q[y]=lt,gt=y;else break t}}return C}function S(q,C){var lt=q.sortIndex-C.sortIndex;return lt!==0?lt:q.id-C.id}if(i.unstable_now=void 0,typeof performance=="object"&&typeof performance.now=="function"){var N=performance;i.unstable_now=function(){return N.now()}}else{var A=Date,p=A.now();i.unstable_now=function(){return A.now()-p}}var H=[],O=[],Y=1,j=null,w=3,X=!1,V=!1,at=!1,L=!1,vt=typeof setTimeout=="function"?setTimeout:null,bt=typeof clearTimeout=="function"?clearTimeout:null,zt=typeof setImmediate<"u"?setImmediate:null;function J(q){for(var C=h(O);C!==null;){if(C.callback===null)f(O);else if(C.startTime<=q)f(O),C.sortIndex=C.expirationTime,r(H,C);else break;C=h(O)}}function Rt(q){if(at=!1,J(q),!V)if(h(H)!==null)V=!0,it||(it=!0,kt());else{var C=h(O);C!==null&&st(Rt,C.startTime-q)}}var it=!1,Q=-1,rt=5,Ut=-1;function Qt(){return L?!0:!(i.unstable_now()-Utq&&Qt());){var gt=j.callback;if(typeof gt=="function"){j.callback=null,w=j.priorityLevel;var yt=gt(j.expirationTime<=q);if(q=i.unstable_now(),typeof yt=="function"){j.callback=yt,J(q),C=!0;break e}j===h(H)&&f(H),J(q)}else f(H);j=h(H)}if(j!==null)C=!0;else{var ge=h(O);ge!==null&&st(Rt,ge.startTime-q),C=!1}}break t}finally{j=null,w=lt,X=!1}C=void 0}}finally{C?kt():it=!1}}}var kt;if(typeof zt=="function")kt=function(){zt(Nt)};else if(typeof MessageChannel<"u"){var B=new MessageChannel,ot=B.port2;B.port1.onmessage=Nt,kt=function(){ot.postMessage(null)}}else kt=function(){vt(Nt,0)};function st(q,C){Q=vt(function(){q(i.unstable_now())},C)}i.unstable_IdlePriority=5,i.unstable_ImmediatePriority=1,i.unstable_LowPriority=4,i.unstable_NormalPriority=3,i.unstable_Profiling=null,i.unstable_UserBlockingPriority=2,i.unstable_cancelCallback=function(q){q.callback=null},i.unstable_forceFrameRate=function(q){0>q||125gt?(q.sortIndex=lt,r(O,q),h(H)===null&&q===h(O)&&(at?(bt(Q),Q=-1):at=!0,st(Rt,lt-gt))):(q.sortIndex=yt,r(H,q),V||X||(V=!0,it||(it=!0,kt()))),q},i.unstable_shouldYield=Qt,i.unstable_wrapCallback=function(q){var C=w;return function(){var lt=w;w=C;try{return q.apply(this,arguments)}finally{w=lt}}}})(so)),so}var kh;function Gy(){return kh||(kh=1,co.exports=Yy()),co.exports}var ro={exports:{}},He={};/** * @license React * react-dom.production.js * @@ -36,7 +36,7 @@ * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. - */var Bh;function Qy(){if(Bh)return He;Bh=1;var i=yo();function r(Y){var j="https://react.dev/errors/"+Y;if(1"u"||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!="function"))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(i)}catch(r){console.error(r)}}return i(),ro.exports=Qy(),ro.exports}/** + */var Bh;function Qy(){if(Bh)return He;Bh=1;var i=yo();function r(Y){var j="https://react.dev/errors/"+Y;if(1"u"||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!="function"))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(i)}catch(r){console.error(r)}}return i(),ro.exports=Qy(),ro.exports}/** * @license React * react-dom-client.production.js * @@ -44,37 +44,37 @@ * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. - */var Yh;function Ly(){if(Yh)return ii;Yh=1;var i=Gy(),r=yo(),h=Xy();function f(t){var e="https://react.dev/errors/"+t;if(1jl||(t.current=Ga[jl],Ga[jl]=null,jl--)}function Yt(t,e){jl++,Ga[jl]=t.current,t.current=e}var he=Le(null),Kl=Le(null),pe=Le(null),fa=Le(null);function Ve(t,e){switch(Yt(pe,e),Yt(Kl,t),Yt(he,null),e.nodeType){case 9:case 11:t=(t=e.documentElement)&&(t=t.namespaceURI)?Gm(t):0;break;default:if(t=e.tagName,e=e.namespaceURI)e=Gm(e),t=Qm(e,t);else switch(t){case"svg":t=1;break;case"math":t=2;break;default:t=0}}le(he),Yt(he,t)}function zl(){le(he),le(Kl),le(pe)}function Rl(t){var e=t.memoizedState;e!==null&&(eu._currentValue=e.memoizedState,Yt(fa,t)),e=he.current;var l=Qm(e,t.type);e!==l&&(Yt(Kl,t),Yt(he,l))}function Tl(t){Kl.current===t&&(le(he),le(Kl)),fa.current===t&&(le(fa),eu._currentValue=ce)}var Be,se;function re(t){if(Be===void 0)try{throw Error()}catch(l){var e=l.stack.trim().match(/\n( *(at )?)/);Be=e&&e[1]||"",se=-1jl||(t.current=Ga[jl],Ga[jl]=null,jl--)}function Yt(t,e){jl++,Ga[jl]=t.current,t.current=e}var he=Le(null),Kl=Le(null),pe=Le(null),fa=Le(null);function Ve(t,e){switch(Yt(pe,e),Yt(Kl,t),Yt(he,null),e.nodeType){case 9:case 11:t=(t=e.documentElement)&&(t=t.namespaceURI)?Gm(t):0;break;default:if(t=e.tagName,e=e.namespaceURI)e=Gm(e),t=Qm(e,t);else switch(t){case"svg":t=1;break;case"math":t=2;break;default:t=0}}le(he),Yt(he,t)}function zl(){le(he),le(Kl),le(pe)}function Rl(t){var e=t.memoizedState;e!==null&&(eu._currentValue=e.memoizedState,Yt(fa,t)),e=he.current;var l=Qm(e,t.type);e!==l&&(Yt(Kl,t),Yt(he,l))}function Tl(t){Kl.current===t&&(le(he),le(Kl)),fa.current===t&&(le(fa),eu._currentValue=ce)}var Be,se;function re(t){if(Be===void 0)try{throw Error()}catch(l){var e=l.stack.trim().match(/\n( *(at )?)/);Be=e&&e[1]||"",se=-1)":-1n||m[a]!==x[n]){var E=` `+m[a].replace(" at new "," at ");return t.displayName&&E.includes("")&&(E=E.replace("",t.displayName)),E}while(1<=a&&0<=n);break}}}finally{rl=!1,Error.prepareStackTrace=l}return(l=t?t.displayName||t.name:"")?re(l):""}function da(t,e){switch(t.tag){case 26:case 27:case 5:return re(t.type);case 16:return re("Lazy");case 13:return t.child!==e&&e!==null?re("Suspense Fallback"):re("Suspense");case 19:return re("SuspenseList");case 0:case 15:return Jl(t.type,!1);case 11:return Jl(t.type.render,!1);case 1:return Jl(t.type,!0);case 31:return re("Activity");case 30:return re("ViewTransition");default:return""}}function Dl(t){try{var e="",l=null;do e+=da(t,l),l=t,t=t.return;while(t);return e}catch(a){return` Error generating stack: `+a.message+` -`+a.stack}}var te=Object.prototype.hasOwnProperty,Pe=i.unstable_scheduleCallback,qe=i.unstable_cancelCallback,_l=i.unstable_shouldYield,ol=i.unstable_requestPaint,Ft=i.unstable_now,Ul=i.unstable_getCurrentPriorityLevel,mn=i.unstable_ImmediatePriority,Qa=i.unstable_UserBlockingPriority,Se=i.unstable_NormalPriority,Xa=i.unstable_LowPriority,ma=i.unstable_IdlePriority,su=i.log,ru=i.unstable_setDisableYieldValue,Fl=null,Ae=null;function fl(t){if(typeof su=="function"&&ru(t),Ae&&typeof Ae.setStrictMode=="function")try{Ae.setStrictMode(Fl,t)}catch{}}var Oe=Math.clz32?Math.clz32:du,ou=Math.log,fu=Math.LN2;function du(t){return t>>>=0,t===0?32:31-(ou(t)/fu|0)|0}var w=256,U=262144,W=4194304;function tt(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 M(t,e,l){var a=t.pendingLanes;if(a===0)return 0;var n=0,u=t.suspendedLanes,s=t.pingedLanes;t=t.warmLanes;var o=a&134217727;return o!==0?(a=o&~u,a!==0?n=tt(a):(s&=o,s!==0?n=tt(s):l||(l=o&~t,l!==0&&(n=tt(l))))):(o=a&~u,o!==0?n=tt(o):s!==0?n=tt(s):l||(l=a&~t,l!==0&&(n=tt(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 V(t,e){return(t.pendingLanes&~(t.suspendedLanes&~t.pingedLanes)&e)===0}function et(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 xe(t,e){t.pendingLanes|=e,e!==268435456&&(t.suspendedLanes=0,t.pingedLanes=0,t.warmLanes=0)}function Dc(t,e,l,a,n,u){var s=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 o=t.entanglements,m=t.expirationTimes,x=t.hiddenUpdates;for(l=s&~l;0"u"||typeof window.document>"u"||typeof window.document.createElement>"u"),Gc=!1;if(Il)try{var pu={};Object.defineProperty(pu,"passive",{get:function(){Gc=!0}}),window.addEventListener("test",pu,pu),window.removeEventListener("test",pu,pu)}catch{Gc=!1}var ha=null,Qc=null,mi=null;function wo(){if(mi)return mi;var t,e=Qc,l=e.length,a,n="value"in ha?ha.value:ha.textContent,u=n.length;for(t=0;t=xu),Qo=" ",Xo=!1;function Lo(t,e){switch(t){case"keyup":return Dv.indexOf(e.keyCode)!==-1;case"keydown":return e.keyCode!==229;case"keypress":case"mousedown":case"focusout":return!0;default:return!1}}function Vo(t){return t=t.detail,typeof t=="object"&&"data"in t?t.data:null}var Tn=!1;function Hv(t,e){switch(t){case"compositionend":return Vo(e);case"keypress":return e.which!==32?null:(Xo=!0,Qo);case"textInput":return t=e.data,t===Qo&&Xo?null:t;default:return null}}function wv(t,e){if(Tn)return t==="compositionend"||!Kc&&Lo(t,e)?(t=wo(),mi=Qc=ha=null,Tn=!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 Po(t){for(;t&&t.firstChild;)t=t.firstChild;return t}function tf(t,e){var l=Po(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=Po(l)}}function ef(t,e){return t&&e?t===e?!0:t&&t.nodeType===3?!1:e&&e.nodeType===3?ef(t,e.parentNode):"contains"in t?t.contains(e):t.compareDocumentPosition?!!(t.compareDocumentPosition(e)&16):!1:!1}function lf(t){t=t!=null&&t.ownerDocument!=null&&t.ownerDocument.defaultView!=null?t.ownerDocument.defaultView:window;for(var e=Wc(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=Wc(t.document)}return e}function $c(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 Lv=Il&&"documentMode"in document&&11>=document.documentMode,_n=null,Ic=null,Eu=null,Pc=!1;function af(t,e,l){var a=l.window===l?l.document:l.nodeType===9?l:l.ownerDocument;Pc||_n==null||_n!==Wc(a)||(a=_n,"selectionStart"in a&&$c(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}),Eu&&_u(Eu,a)||(Eu=a,a=pc(Ic,"onSelect"),0>=s,n-=s,kl=1<<32-Oe(e)+n|l<mt?(me=ct,ct=null):me=ct.sibling;var Dt=g(b,ct,T[mt],z);if(Dt===null){ct===null&&(ct=me);break}t&&ct&&Dt.alternate===null&&e(b,ct),v=u(Dt,v,mt),At===null?F=Dt:At.sibling=Dt,At=Dt,ct=me}if(mt===T.length)return l(b,ct),jt&&la(b,mt),F;if(ct===null){for(;mtmt?(me=ct,ct=null):me=ct.sibling;var qa=g(b,ct,Dt.value,z);if(qa===null){ct===null&&(ct=me);break}t&&ct&&qa.alternate===null&&e(b,ct),v=u(qa,v,mt),At===null?F=qa:At.sibling=qa,At=qa,ct=me}if(Dt.done)return l(b,ct),jt&&la(b,mt),F;if(ct===null){for(;!Dt.done;mt++,Dt=T.next())Dt=R(b,Dt.value,z),Dt!==null&&(v=u(Dt,v,mt),At===null?F=Dt:At.sibling=Dt,At=Dt);return jt&&la(b,mt),F}for(ct=a(ct);!Dt.done;mt++,Dt=T.next())Dt=_(ct,b,mt,Dt.value,z),Dt!==null&&(t&&(me=Dt.alternate,me!==null&&ct.delete(me.key===null?mt:me.key)),v=u(Dt,v,mt),At===null?F=Dt:At.sibling=Dt,At=Dt);return t&&ct.forEach(function(Hy){return e(b,Hy)}),jt&&la(b,mt),F}function St(b,v,T,z){if(typeof T=="object"&&T!==null&&T.type===Nt&&T.key===null&&T.props.ref===void 0&&(T=T.props.children),typeof T=="object"&&T!==null){switch(T.$$typeof){case Ut:t:{for(var F=T.key;v!==null;){if(v.key===F){if(F=T.type,F===Nt){if(v.tag===7){l(b,v.sibling),z=n(v,T.props.children),ba(z,T),z.return=b,b=z;break t}}else if(v.elementType===F||typeof F=="object"&&F!==null&&F.$$typeof===yt&&ln(F)===v.type){l(b,v.sibling),z=n(v,T.props),ba(z,T),z.return=b,b=z;break t}l(b,v);break}else e(b,v);v=v.sibling}T.type===Nt?(z=Fa(T.props.children,b.mode,z,T.key),ba(z,T),z.return=b,b=z):(z=Ti(T.type,T.key,T.props,null,b.mode,z),ba(z,T),z.return=b,b=z)}return s(b);case Qt:t:{for(F=T.key;v!==null;){if(v.key===F)if(v.tag===4&&v.stateNode.containerInfo===T.containerInfo&&v.stateNode.implementation===T.implementation){l(b,v.sibling),z=n(v,T.children||[]),z.return=b,b=z;break t}else{l(b,v);break}else e(b,v);v=v.sibling}z=is(T,b.mode,z),z.return=b,b=z}return s(b);case yt:return T=ln(T),St(b,v,T,z)}if(Ot(T))return G(b,v,T,z);if(nt(T)){if(F=nt(T),typeof F!="function")throw Error(f(150));return T=F.call(T),P(b,v,T,z)}if(typeof T.then=="function")return St(b,v,Di(T),z);if(T.$$typeof===st)return St(b,v,Oi(b,T),z);Ui(b,T)}return typeof T=="string"&&T!==""||typeof T=="number"||typeof T=="bigint"?(T=""+T,v!==null&&v.tag===6?(l(b,v.sibling),z=n(v,T),z.return=b,b=z):(l(b,v),z=us(T,b.mode,z),z.return=b,b=z),s(b)):l(b,v)}return function(b,v,T,z){try{zu=0;var F=St(b,v,T,z);return Dn=null,F}catch(ct){if(ct===Rn||ct===zi)throw ct;var At=Je(29,ct,null,b.mode);return At.lanes=z,At.return=b,At}finally{}}}var nn=Af(!0),Of=Af(!1),xa=!1;function ys(t){t.updateQueue={baseState:t.memoizedState,firstBaseUpdate:null,lastBaseUpdate:null,shared:{pending:null,lanes:0,hiddenCallbacks:null},callbacks:null}}function gs(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 ja(t){return{lane:t,tag:0,payload:null,callback:null,next:null}}function Ta(t,e,l){var a=t.updateQueue;if(a===null)return null;if(a=a.shared,(qt&2)!==0){var n=a.pending;return n===null?e.next=e:(e.next=n.next,n.next=e),a.pending=e,e=ji(t),df(t,null,l),e}return xi(t,a,e,l),ji(t)}function Ru(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,hn(t,l)}}function ps(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 s={lane:l.lane,tag:l.tag,payload:l.payload,callback:null,next:null};u===null?n=u=s:u=u.next=s,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 Ss=!1;function Du(){if(Ss){var t=zn;if(t!==null)throw t}}function Uu(t,e,l,a){Ss=!1;var n=t.updateQueue;xa=!1;var u=n.firstBaseUpdate,s=n.lastBaseUpdate,o=n.shared.pending;if(o!==null){n.shared.pending=null;var m=o,x=m.next;m.next=null,s===null?u=x:s.next=x,s=m;var E=t.alternate;E!==null&&(E=E.updateQueue,o=E.lastBaseUpdate,o!==s&&(o===null?E.firstBaseUpdate=x:o.next=x,E.lastBaseUpdate=m))}if(u!==null){var R=n.baseState;s=0,E=x=m=null,o=u;do{var g=o.lane&-536870913,_=g!==o.lane;if(_?(Ct&g)===g:(a&g)===g){g!==0&&g===tn&&(Ss=!0),E!==null&&(E=E.next={lane:0,tag:o.tag,payload:o.payload,callback:null,next:null});t:{var G=t,P=o;g=e;var St=l;switch(P.tag){case 1:if(G=P.payload,typeof G=="function"){R=G.call(St,R,g);break t}R=G;break t;case 3:G.flags=G.flags&-65537|128;case 0:if(G=P.payload,g=typeof G=="function"?G.call(St,R,g):G,g==null)break t;R=Q({},R,g);break t;case 2:xa=!0}}g=o.callback,g!==null&&(t.flags|=64,_&&(t.flags|=8192),_=n.callbacks,_===null?n.callbacks=[g]:_.push(g))}else _={lane:g,tag:o.tag,payload:o.payload,callback:o.callback,next:null},E===null?(x=E=_,m=R):E=E.next=_,s|=g;if(o=o.next,o===null){if(o=n.shared.pending,o===null)break;_=o,o=_.next,_.next=null,n.lastBaseUpdate=_,n.shared.pending=null}}while(!0);E===null&&(m=R),n.baseState=m,n.firstBaseUpdate=x,n.lastBaseUpdate=E,u===null&&(n.shared.lanes=0),Ma|=s,t.lanes=s,t.memoizedState=R}}function Mf(t,e){if(typeof t!="function")throw Error(f(191,t));t.call(e)}function zf(t,e){var l=t.callbacks;if(l!==null)for(t.callbacks=null,t=0;tu?u:8;var s=$.T,o={};o.types=s!==null?s.types:null,$.T=o,qs(t,!1,e,l);try{var m=n(),x=$.S;if(x!==null&&x(o,m),m!==null&&typeof m=="object"&&typeof m.then=="function"){var E=e0(m,a);Bu(t,e,E,il(t))}else Bu(t,e,a,il(t))}catch(R){Bu(t,e,{then:function(){},status:"rejected",reason:R},il())}finally{dt.p=u,s!==null&&o.types!==null&&(s.types=o.types),$.T=s}}function c0(){}function ks(t,e,l,a){if(t.tag!==5)throw Error(f(476));var n=rd(t).queue;sd(t,n,e,ce,l===null?c0:function(){return od(t),l(a)})}function rd(t){var e=t.memoizedState;if(e!==null)return e;e={memoizedState:ce,baseState:ce,baseQueue:null,queue:{pending:null,lanes:0,dispatch:null,lastRenderedReducer:ia,lastRenderedState:ce},next:null};var l={};return e.next={memoizedState:l,baseState:l,baseQueue:null,queue:{pending:null,lanes:0,dispatch:null,lastRenderedReducer:ia,lastRenderedState:l},next:null},t.memoizedState=e,t=t.alternate,t!==null&&(t.memoizedState=e),e}function od(t){var e=rd(t);e.next===null&&(e=t.alternate.memoizedState),Bu(t,e.next.queue,{},il())}function Bs(){return Me(eu)}function fd(){return ie().memoizedState}function dd(){return ie().memoizedState}function s0(t){for(var e=t.return;e!==null;){switch(e.tag){case 24:case 3:var l=il();t=ja(l);var a=Ta(e,t,l);a!==null&&(Ie(a,e,l),Ru(a,e,l)),e={cache:ds()},t.payload=e;return}e=e.return}}function r0(t,e,l){var a=il();l={lane:a,revertLane:0,gesture:null,action:l,hasEagerState:!1,eagerState:null,next:null},Li(t)?hd(e,l):(l=as(t,e,l,a),l!==null&&(Ie(l,t,a),vd(l,e,a)))}function md(t,e,l){var a=il();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(Li(t))hd(e,n);else{var u=t.alternate;if(t.lanes===0&&(u===null||u.lanes===0)&&(u=e.lastRenderedReducer,u!==null))try{var s=e.lastRenderedState,o=u(s,l);if(n.hasEagerState=!0,n.eagerState=o,el(o,s))return xi(t,e,n,0),Jt===null&&bi(),!1}catch{}finally{}if(l=as(t,e,n,a),l!==null)return Ie(l,t,a),vd(l,e,a),!0}return!1}function qs(t,e,l,a){if(a={lane:2,revertLane:Or(),gesture:null,action:a,hasEagerState:!1,eagerState:null,next:null},Li(t)){if(e)throw Error(f(479))}else e=as(t,l,a,2),e!==null&&Ie(e,t,2)}function Li(t){var e=t.alternate;return t===pt||e!==null&&e===pt}function hd(t,e){Un=ki=!0;var l=t.pending;l===null?e.next=e:(e.next=l.next,l.next=e),t.pending=e}function vd(t,e,l){if((l&4194048)!==0){var a=e.lanes;a&=t.pendingLanes,l|=a,e.lanes=l,hn(t,l)}}var Vi={readContext:Me,use:Yi,useCallback:ne,useContext:ne,useEffect:ne,useImperativeHandle:ne,useLayoutEffect:ne,useInsertionEffect:ne,useMemo:ne,useReducer:ne,useRef:ne,useState:ne,useDebugValue:ne,useDeferredValue:ne,useTransition:ne,useSyncExternalStore:ne,useId:ne,useHostTransitionStatus:ne,useFormState:ne,useActionState:ne,useOptimistic:ne,useMemoCache:ne,useCacheRefresh:ne,useEffectEvent:ne},yd={readContext:Me,use:Yi,useCallback:function(t,e){return Ge().memoizedState=[t,e===void 0?null:e],t},useContext:Me,useEffect:Pf,useImperativeHandle:function(t,e,l){l=l!=null?l.concat([t]):null,Qi(4194308,4,ad.bind(null,e,t),l)},useLayoutEffect:function(t,e){return Qi(4194308,4,t,e)},useInsertionEffect:function(t,e){Qi(4,2,t,e)},useMemo:function(t,e){var l=Ge();e=e===void 0?null:e;var a=t();if(un){fl(!0);try{t()}finally{fl(!1)}}return l.memoizedState=[a,e],a},useReducer:function(t,e,l){var a=Ge();if(l!==void 0){var n=l(e);if(un){fl(!0);try{l(e)}finally{fl(!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=r0.bind(null,pt,t),[a.memoizedState,t]},useRef:function(t){var e=Ge();return t={current:t},e.memoizedState=t},useState:function(t){t=Rs(t);var e=t.queue,l=md.bind(null,pt,e);return e.dispatch=l,[t.memoizedState,l]},useDebugValue:Hs,useDeferredValue:function(t,e){var l=Ge();return ws(l,t,e)},useTransition:function(){var t=Rs(!1);return t=sd.bind(null,pt,t.queue,!0,!1),Ge().memoizedState=t,[!1,t]},useSyncExternalStore:function(t,e,l){var a=pt,n=Ge();if(jt){if(l===void 0)throw Error(f(407));l=l()}else{if(l=e(),Jt===null)throw Error(f(349));(Ct&127)!==0||kf(a,e,l)}n.memoizedState=l;var u={value:l,getSnapshot:e};return n.queue=u,Pf(qf.bind(null,a,u,t),[t]),a.flags|=2048,wn(9,{destroy:void 0},Bf.bind(null,a,u,l,e),null),l},useId:function(){var t=Ge(),e=Jt.identifierPrefix;if(jt){var l=Bl,a=kl;l=(a&~(1<<32-Oe(a)-1)).toString(32)+l,e="_"+e+"R_"+l,l=Bi++,0<\/script>",u=u.removeChild(u.firstChild);break;case"select":u=typeof a.is=="string"?s.createElement("select",{is:a.is}):s.createElement("select"),a.multiple?u.multiple=!0:a.size&&(u.size=a.size);break;default:u=typeof a.is=="string"?s.createElement(n,{is:a.is}):s.createElement(n)}}u[ve]=e,u[Ke]=a;t:for(s=e.child;s!==null;){if(s.tag===5||s.tag===6)u.appendChild(s.stateNode);else if(s.tag!==4&&s.tag!==27&&s.child!==null){s.child.return=s,s=s.child;continue}if(s===e)break t;for(;s.sibling===null;){if(s.return===null||s.return===e)break t;s=s.return}s.sibling.return=s.return,s=s.sibling}e.stateNode=u;t:switch(Ue(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&&sa(e)}}return $t(e),e.subtreeFlags&=-33554433,Is(e,e.type,t===null?null:t.memoizedProps,e.pendingProps,l),null;case 6:if(t&&e.stateNode!=null)t.memoizedProps!==a&&sa(e);else{if(typeof a!="string"&&e.stateNode===null)throw Error(f(166));if(t=pe.current,Mn(e)){if(t=e.stateNode,l=e.memoizedProps,a=null,n=Te,n!==null)switch(n.tag){case 27:case 5:a=n.memoizedProps}t[ve]=e,t=!!(t.nodeValue===l||a!==null&&a.suppressHydrationWarning===!0||qm(t.nodeValue,l)),t||pa(e,!0)}else t=$u(t).createTextNode(a),t[ve]=e,e.stateNode=t}return $t(e),null;case 31:if(l=e.memoizedState,t===null||t.memoizedState!==null){if(a=Mn(e),l!==null){if(t===null){if(!a)throw Error(f(318));if(t=e.memoizedState,t=t!==null?t.dehydrated:null,!t)throw Error(f(557));t[ve]=e}else Wa(),(e.flags&128)===0&&(e.memoizedState=null),e.flags|=4;$t(e),t=!1}else l=rs(),t!==null&&t.memoizedState!==null&&(t.memoizedState.hydrationErrors=l),t=!0;if(!t)return e.flags&256?(ll(e),e):(ll(e),null);if((e.flags&128)!==0)throw Error(f(558))}return $t(e),null;case 13:if(a=e.memoizedState,t===null||t.memoizedState!==null&&t.memoizedState.dehydrated!==null){if(n=Mn(e),a!==null&&a.dehydrated!==null){if(t===null){if(!n)throw Error(f(318));if(n=e.memoizedState,n=n!==null?n.dehydrated:null,!n)throw Error(f(317));n[ve]=e}else Wa(),(e.flags&128)===0&&(e.memoizedState=null),e.flags|=4;$t(e),n=!1}else n=rs(),t!==null&&t.memoizedState!==null&&(t.memoizedState.hydrationErrors=n),n=!0;if(!n)return e.flags&256?(ll(e),e):(ll(e),null)}return ll(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),$i(e,e.updateQueue),$t(e),null);case 4:return zl(),t===null&&Dr(e.stateNode.containerInfo),e.flags|=67108864,$t(e),null;case 10:return na(e.type),$t(e),null;case 19:if(Ts(e),a=e.memoizedState,a===null)return $t(e),null;if(n=(e.flags&128)!==0,u=a.rendering,u===null)if(n)Yu(a,!1);else{if(ue!==0||t!==null&&(t.flags&128)!==0)for(t=e.child;t!==null;){if(u=wi(t),u!==null){for(e.flags|=128,Yu(a,!1),t=u.updateQueue,e.updateQueue=t,$i(e,t),e.subtreeFlags=0,t=l,l=e.child;l!==null;)mf(l,t),l=l.sibling;return Hu(e,Re.current&1|2),jt&&la(e,a.treeForkCount),e.child}t=t.sibling}a.tail!==null&&Ft()>rc&&(e.flags|=128,n=!0,Yu(a,!1),e.lanes=4194304)}else{if(!n)if(t=wi(u),t!==null){if(e.flags|=128,n=!0,t=t.updateQueue,e.updateQueue=t,$i(e,t),Yu(a,!0),a.tail===null&&a.tailMode!=="collapsed"&&a.tailMode!=="visible"&&!u.alternate&&!jt)return $t(e),null}else 2*Ft()-a.renderingStartTime>rc&&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=Ft(),t.sibling=null,u=Re.current,u=n?u&1|2:u&1,a.tailMode==="visible"||a.tailMode==="collapsed"||!l||jt?Hu(e,u):(l=u,Yt(ze,e),Yt(Re,l),ke===null&&(ke=e)),jt&&la(e,a.treeForkCount),t}return $t(e),null;case 22:case 23:return ll(e),xs(),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&&($t(e),e.subtreeFlags&6&&(e.flags|=8192)):$t(e),l=e.updateQueue,l!==null&&$i(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&&le(en),null;case 24:return l=null,t!==null&&(l=t.memoizedState.cache),e.memoizedState.cache!==l&&(e.flags|=2048),na(oe),$t(e),null;case 25:return null;case 30:return e.flags|=33554432,$t(e),null}throw Error(f(156,e.tag))}function y0(t,e){switch(cs(e),e.tag){case 1:return t=e.flags,t&65536?(e.flags=t&-65537|128,e):null;case 3:return na(oe),zl(),t=e.flags,(t&65536)!==0&&(t&128)===0?(e.flags=t&-65537|128,e):null;case 26:case 27:case 5:return Tl(e),null;case 31:if(e.memoizedState!==null){if(ll(e),e.alternate===null)throw Error(f(340));Wa()}return t=e.flags,t&65536?(e.flags=t&-65537|128,e):null;case 13:if(ll(e),t=e.memoizedState,t!==null&&t.dehydrated!==null){if(e.alternate===null)throw Error(f(340));Wa()}return t=e.flags,t&65536?(e.flags=t&-65537|128,e):null;case 19:return Ts(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 zl(),null;case 10:return na(e.type),null;case 22:case 23:return ll(e),xs(),t!==null&&le(en),t=e.flags,t&65536?(e.flags=t&-65537|128,e):null;case 24:return na(oe),null;case 25:return null;default:return null}}function Gd(t,e){switch(cs(e),e.tag){case 3:na(oe),zl();break;case 26:case 27:case 5:Tl(e);break;case 4:zl();break;case 31:e.memoizedState!==null&&ll(e);break;case 13:ll(e);break;case 19:Ts(e);break;case 10:na(e.type);break;case 22:case 23:ll(e),xs(),t!==null&&le(en);break;case 24:na(oe)}}function Gu(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,s=l.inst;a=u(),s.destroy=a}l=l.next}while(l!==n)}}catch(o){Lt(e,e.return,o)}}function Ca(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 s=a.inst,o=s.destroy;if(o!==void 0){s.destroy=void 0,n=e;var m=l,x=o;try{x()}catch(E){Lt(n,m,E)}}}a=a.next}while(a!==u)}}catch(E){Lt(e,e.return,E)}}function Qd(t){var e=t.updateQueue;if(e!==null){var l=t.stateNode;try{zf(e,l)}catch(a){Lt(t,t.return,a)}}}function Xd(t,e,l){l.props=cn(t.type,t.memoizedProps),l.state=t.memoizedState;try{l.componentWillUnmount()}catch(a){Lt(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=Pl(t.memoizedProps,n);(n.ref===null||n.ref.name!==u)&&(n.ref=Wm(u)),a=n.ref;break;case 7:if(t.stateNode===null){var s=new cl(t);j(t.child,!1,iy,s,void 0,void 0),t.stateNode=s}a=t.stateNode;break;default:a=t.stateNode}typeof l=="function"?t.refCleanup=l(a):l.current=a}}catch(o){Lt(t,e,o)}}function De(t,e){var l=t.ref,a=t.refCleanup;if(l!==null)if(typeof a=="function")try{a()}catch(n){Lt(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){Lt(t,e,n)}else l.current=null}function Ii(t,e){if((t.tag===5||t.tag===27||t.tag===6)&&t.alternate===null&&e!==null)for(var l=0;l title"))),Ue(a,e,l),a[ve]=t,je(a),e=a;break t;case"link":if(u=mh("link","href",n).get(e+(l.href||""))){for(s=0;sSt&&(s=St,St=P,P=s);var b=tf(o,P),v=tf(o,St);if(b&&v&&(_.rangeCount!==1||_.anchorNode!==b.node||_.anchorOffset!==b.offset||_.focusNode!==v.node||_.focusOffset!==v.offset)){var T=R.createRange();T.setStart(b.node,b.offset),_.removeAllRanges(),P>St?(_.addRange(T),_.extend(v.node,v.offset)):(T.setEnd(v.node,v.offset),_.addRange(T))}}}}for(R=[],_=o;_=_.parentNode;)_.nodeType===1&&R.push({element:_,left:_.scrollLeft,top:_.scrollTop});for(typeof o.focus=="function"&&o.focus(),o=0;ol?32:l,$.T=null,l=Sr,Sr=null;var u=Ol,s=Vl;if(ee=0,fn=Ol=null,Vl=0,(qt&6)!==0)throw Error(f(331));var o=qt;if(qt|=4,dm(u.current),rm(u,u.current,s,l),qt=o,Ju(0,!1),Ae&&typeof Ae.onPostCommitFiberRoot=="function")try{Ae.onPostCommitFiberRoot(Fl,u)}catch{}return!0}finally{dt.p=n,$.T=a,Cm(t,e)}}function Am(t,e,l){e=hl(l,e),e=Qs(t.stateNode,e,2),t=Ta(t,e,2),t!==null&&(xe(t,2),Zl(t))}function Lt(t,e,l){if(t.tag===3)Am(t,t,l);else for(;e!==null;){if(e.tag===3){Am(e,t,l);break}else if(e.tag===1){var a=e.stateNode;if(typeof e.type.getDerivedStateFromError=="function"||typeof a.componentDidCatch=="function"&&(za===null||!za.has(a))){t=hl(l,t),l=_d(2),a=Ta(e,l,2),a!==null&&(Ed(l,a,e,t),xe(a,2),Zl(a));break}}e=e.return}}function Nr(t,e,l){var a=t.pingCache;if(a===null){a=t.pingCache=new b0;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)||(yr=!0,n.add(l),t=A0.bind(null,t,e,l),e.then(t,t))}function A0(t,e,l){var a=t.pingCache;a!==null&&a.delete(e),t.pingedLanes|=t.suspendedLanes&l,t.warmLanes&=~l,Jt===t&&(Ct&l)===l&&((ue===4||ue===3&&(Ct&62914560)===Ct&&300>Ft()-sc)&&(qt&2)===0?Kn(t,0):cc|=l,Qn===Ct&&(Qn=0)),Zl(t)}function Om(t,e){e===0&&(e=Mt()),t=Ja(t,e),t!==null&&(xe(t,e),Zl(t))}function O0(t){var e=t.memoizedState,l=0;e!==null&&(l=e.retryLane),Om(t,l)}function M0(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(f(314))}a!==null&&a.delete(e),Om(t,l)}function z0(t,e){return Pe(t,e)}var Fn=null,Wn=null,Cr=!1,yc=!1,Ar=!1,Da=0;function Zl(t){t!==Wn&&t.next===null&&(Wn===null?Fn=Wn=t:Wn=Wn.next=t),yc=!0,Cr||(Cr=!0,D0())}function Ju(t,e){if(!Ar&&yc){Ar=!0;do for(var l=!1,a=Fn;a!==null;){if(t!==0){var n=a.pendingLanes;if(n===0)var u=0;else{var s=a.suspendedLanes,o=a.pingedLanes;u=(1<<31-Oe(42|t)+1)-1,u&=n&~(s&~o),u=u&201326741?u&201326741|1:u?u|2:0}u!==0&&(l=!0,Dm(a,u))}else u=Ct,u=M(a,a===Jt?u:0,a.cancelPendingCommit!==null||a.timeoutHandle!==-1),(u&3)===0||V(a,u)||(l=!0,Dm(a,u));a=a.next}while(l);Ar=!1}}function R0(){Mm()}function Mm(){yc=Cr=!1;var t=0;Da!==0&&L0()&&(t=Da);for(var e=Ft(),l=null,a=Fn;a!==null;){var n=a.next,u=zm(a,e);u===0?(a.next=null,l===null?Fn=n:l.next=n,n===null&&(Wn=l)):(l=a,(t!==0||(u&3)!==0)&&(yc=!0)),a=n}ee!==0&&ee!==5||Ju(t),Da!==0&&(Da=0)}function zm(t,e){for(var l=t.suspendedLanes,a=t.pingedLanes,n=t.expirationTimes,u=t.pendingLanes&-62914561;0o)break;var E=m.transferSize,R=m.initiatorType;E&&Ym(R)&&(m=m.responseEnd,s+=E*(mxc){P.length=G;break}T=new Promise(W0.bind(T)),P.push(T)}}}if(0"u"?null:document;function rh(t,e,l){var a=In;if(a&&typeof e=="string"&&e){var n=dl(e);n='link[rel="'+t+'"][href="'+n+'"]',typeof l=="string"&&(n+='[crossorigin="'+l+'"]'),sh.has(n)||(sh.add(n),t={rel:t,crossOrigin:l,href:e},a.querySelector(n)===null&&(e=a.createElement("link"),Ue(e,"link",t),je(e),a.head.appendChild(e)))}}function vy(t){oa.D(t),rh("dns-prefetch",t,null)}function yy(t,e){oa.C(t,e),rh("preconnect",t,e)}function gy(t,e,l){oa.L(t,e,l);var a=In;if(a&&t&&e){var n='link[rel="preload"][as="'+dl(e)+'"]';e==="image"&&l&&l.imageSrcSet?(n+='[imagesrcset="'+dl(l.imageSrcSet)+'"]',typeof l.imageSizes=="string"&&(n+='[imagesizes="'+dl(l.imageSizes)+'"]')):n+='[href="'+dl(t)+'"]';var u=n;switch(e){case"style":u=Pn(t);break;case"script":u=tu(t)}if(!(bl.has(u)||(t=Q({rel:"preload",href:e==="image"&&l&&l.imageSrcSet?void 0:t,as:e},l),bl.set(u,t),a.querySelector(n)!==null||e==="style"&&a.querySelector(Pu(u))||e==="script"&&a.querySelector(ti(u))))){var s=a.createElement("link");Ue(s,"link",t),e==="style"&&(s[si]=!0,s.onload=s.onerror=function(){xo(s)}),je(s),a.head.appendChild(s)}}}function py(t,e){oa.m(t,e);var l=In;if(l&&t){var a=e&&typeof e.as=="string"?e.as:"script",n='link[rel="modulepreload"][as="'+dl(a)+'"][href="'+dl(t)+'"]',u=n;switch(a){case"audioworklet":case"paintworklet":case"serviceworker":case"sharedworker":case"worker":case"script":u=tu(t)}if(!bl.has(u)&&(t=Q({rel:"modulepreload",href:t},e),bl.set(u,t),l.querySelector(n)===null)){switch(a){case"audioworklet":case"paintworklet":case"serviceworker":case"sharedworker":case"worker":case"script":if(l.querySelector(ti(u)))return}a=l.createElement("link"),Ue(a,"link",t),je(a),l.head.appendChild(a)}}}function Sy(t,e,l){oa.S(t,e,l);var a=In;if(a&&t){var n=gn(a).hoistableStyles,u=Pn(t);e=e||"default";var s=n.get(u);if(!s){var o={loading:0,preload:null};if(s=a.querySelector(Pu(u)))o.loading=5;else{t=Q({rel:"stylesheet",href:t,"data-precedence":e},l),(l=bl.get(u))&&Fr(t,l);var m=s=a.createElement("link");je(m),Ue(m,"link",t),m._p=new Promise(function(x,E){m.onload=x,m.onerror=E}),m.addEventListener("load",function(){o.loading|=1}),m.addEventListener("error",function(){o.loading|=2}),o.loading|=4,Sc(s,e,a)}s={type:"stylesheet",instance:s,count:1,state:o},n.set(u,s)}}}function by(t,e){oa.X(t,e);var l=In;if(l&&t){var a=gn(l).hoistableScripts,n=tu(t),u=a.get(n);u||(u=l.querySelector(ti(n)),u||(t=Q({src:t,async:!0},e),(e=bl.get(n))&&Wr(t,e),u=l.createElement("script"),je(u),Ue(u,"link",t),l.head.appendChild(u)),u={type:"script",instance:u,count:1,state:null},a.set(n,u))}}function xy(t,e){oa.M(t,e);var l=In;if(l&&t){var a=gn(l).hoistableScripts,n=tu(t),u=a.get(n);u||(u=l.querySelector(ti(n)),u||(t=Q({src:t,async:!0,type:"module"},e),(e=bl.get(n))&&Wr(t,e),u=l.createElement("script"),je(u),Ue(u,"link",t),l.head.appendChild(u)),u={type:"script",instance:u,count:1,state:null},a.set(n,u))}}function oh(t,e,l,a){var n=(n=pe.current)?Iu(n):null;if(!n)throw Error(f(446));switch(t){case"meta":case"title":return null;case"style":return typeof l.precedence=="string"&&typeof l.href=="string"?(l=Pn(l.href),e=gn(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=Pn(l.href);var u=gn(n).hoistableStyles,s=u.get(t);if(s||(n=n.ownerDocument||n,s={type:"stylesheet",instance:null,count:0,state:{loading:0,preload:null}},u.set(t,s),(u=n.querySelector(Pu(t)))?u._p||(s.instance=u,s.state.loading=5):(u=bl.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},bl.set(t,u)),jy(n,t,u,s.state))),e&&a===null)throw Error(f(528,""));return s}if(e&&a!==null)throw Error(f(529,""));return null;case"script":return e=l.async,l=l.src,typeof l=="string"&&e&&typeof e!="function"&&typeof e!="symbol"?(l=tu(l),e=gn(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(f(444,t))}}function Pn(t){return'href="'+dl(t)+'"'}function Pu(t){return'link[rel="stylesheet"]['+t+"]"}function fh(t){return Q({},t,{"data-precedence":t.precedence,precedence:null})}function jy(t,e,l,a){if(e=t.querySelector('link[rel="preload"][as="style"]['+e+"]")){if(e[si]!==!0){a.loading=1;return}}else e=t.createElement("link"),e[si]=!0,e.onload=e.onerror=xo.bind(null,e),Ue(e,"link",l),je(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 tu(t){return'[src="'+dl(t)+'"]'}function ti(t){return"script[async]"+t}function dh(t,e,l){if(e.count++,e.instance===null)switch(e.type){case"style":var a=t.querySelector('style[data-href~="'+dl(l.href)+'"]');if(a)return e.instance=a,je(a),a;var n=Q({},l,{"data-href":l.href,"data-precedence":l.precedence,href:null,precedence:null});return a=(t.ownerDocument||t).createElement("style"),je(a),Ue(a,"style",n),Sc(a,l.precedence,t),e.instance=a;case"stylesheet":n=Pn(l.href);var u=t.querySelector(Pu(n));if(u)return e.state.loading|=4,e.instance=u,je(u),u;a=fh(l),(n=bl.get(n))&&Fr(a,n),u=(t.ownerDocument||t).createElement("link"),je(u);var s=u;return s._p=new Promise(function(o,m){s.onload=o,s.onerror=m}),Ue(u,"link",a),e.state.loading|=4,Sc(u,l.precedence,t),e.instance=u;case"script":return u=tu(l.src),(n=t.querySelector(ti(u)))?(e.instance=n,je(n),n):(a=l,(n=bl.get(u))&&(a=Q({},l),Wr(a,n)),t=t.ownerDocument||t,n=t.createElement("script"),je(n),Ue(n,"link",a),t.head.appendChild(n),e.instance=n);case"void":return null;default:throw Error(f(443,e.type))}else e.type==="stylesheet"&&(e.state.loading&4)===0&&(a=e.instance,e.state.loading|=4,Sc(a,l.precedence,t));return e.instance}function Sc(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,s=0;s title"):null)}function Ty(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 hh(t,e){return t==="img"&&e.src!=null&&e.src!==""&&e.onLoad==null&&e.loading!=="lazy"}function vh(t){return!(t.type==="stylesheet"&&(t.state.loading&3)===0)}function yh(t){return(t.width||100)*(t.height||100)*(typeof devicePixelRatio=="number"?devicePixelRatio:1)*.25}function gh(t,e){typeof e.decode=="function"&&(t.imgCount++,e.complete||(t.imgBytes+=yh(e),t.suspenseyImages.push(e)),t=Ny.bind(t),e.decode().then(t,t))}function _y(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=Pn(a.href),u=e.querySelector(Pu(n));if(u){e=u._p,e!==null&&typeof e=="object"&&typeof e.then=="function"&&(t.count++,t=ei.bind(t),e.then(t,t)),l.state.loading|=4,l.instance=u,je(u);return}u=e.ownerDocument||e,a=fh(a),(n=bl.get(n))&&Fr(a,n),u=u.createElement("link"),je(u);var s=u;s._p=new Promise(function(o,m){s.onload=o,s.onerror=m}),Ue(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=ei.bind(t),e.addEventListener("load",l),e.addEventListener("error",l))}}var xc=0;function Ey(t,e){return t.stylesheets&&t.count===0&&Tc(t,t.stylesheets),0xc?50:800)+e);return t.unsuspend=l,function(){t.unsuspend=null,clearTimeout(a),clearTimeout(n)}}:null}function ph(t){if(t.count===0&&(t.imgCount===0||!t.waitingForImages)){if(t.stylesheets)Tc(t,t.stylesheets);else if(t.unsuspend){var e=t.unsuspend;t.unsuspend=null,e()}}}function ei(){this.count--,ph(this)}function Ny(){this.imgCount--,ph(this)}var jc=null;function Tc(t,e){t.stylesheets=null,t.unsuspend!==null&&(t.count++,jc=new Map,e.forEach(Cy,t),jc=null,ei.call(t))}function Cy(t,e){if(!(e.state.loading&4)){var l=jc.get(t);if(l)var a=l.get(null);else{l=new Map,jc.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(i)}catch(r){console.error(r)}}return i(),io.exports=Ly(),io.exports}var Zy=Vy();const Ky=Zh(Zy),Kh=d.createContext(null);function Zt(){const i=d.useContext(Kh);if(!i)throw new Error("ConsoleContext missing");return i}const ft=encodeURIComponent,Z={health:"/health",relayModels:"/relay/models",quotaMe:"/users/me/quota",userKeys:"/users/me/keys",userKey:i=>"/users/me/keys/"+ft(i),githubRepos:"/github/repos",projects:"/projects",project:i=>"/projects/"+ft(i),projectMembers:i=>"/projects/"+ft(i)+"/members",projectMember:(i,r)=>"/projects/"+ft(i)+"/members/"+ft(r),projectSkills:i=>"/projects/"+ft(i)+"/skills",projectApps:i=>"/projects/"+ft(i)+"/apps",projectMcp:i=>"/projects/"+ft(i)+"/mcp-servers",projectMcpReload:i=>"/projects/"+ft(i)+"/mcp-servers/reload",projectMcpOauth:(i,r)=>"/projects/"+ft(i)+"/mcp-servers/"+ft(r)+"/oauth-login",projectAutomations:i=>"/projects/"+ft(i)+"/automations",projectAutomationCancel:(i,r)=>"/projects/"+ft(i)+"/automations/"+ft(r)+"/cancel",projectTriage:i=>"/projects/"+ft(i)+"/triage",projectTodos:i=>"/projects/"+ft(i)+"/todos",projectTodo:(i,r)=>"/projects/"+ft(i)+"/todos/"+ft(r),workers:"/workers",environments:i=>"/environments?project_id="+ft(i),environmentsCreate:"/environments",environmentArchive:i=>"/environments/"+ft(i)+"/archive",tasks:i=>"/tasks?project_id="+ft(i),tasksPage:(i,r,h,f,S,N)=>{let A="/tasks?project_id="+ft(i)+"&limit="+r+"&offset="+h+"&order=desc";return f&&(A+="&status="+ft(f)),S&&(A+="&executor="+ft(S)),N&&N.trim()&&(A+="&q="+ft(N.trim())),A},tasksByParent:(i,r)=>"/tasks?project_id="+ft(i)+"&parent_task_id="+ft(r),tasksCreate:"/tasks",task:i=>"/tasks/"+ft(i),taskAction:(i,r)=>"/tasks/"+ft(i)+"/"+r,taskFork:i=>"/tasks/"+ft(i)+"/fork",taskContinue:i=>"/tasks/"+ft(i)+"/continue",taskTrace:i=>"/tasks/"+ft(i)+"/trace",taskTraceStream:i=>"/tasks/"+ft(i)+"/trace/stream",taskAgents:i=>"/tasks/"+ft(i)+"/agents",taskReviews:i=>"/tasks/"+ft(i)+"/reviews",taskReviewFindings:(i,r)=>"/tasks/"+ft(i)+"/reviews/"+ft(r)+"/findings",taskApprovals:i=>"/tasks/"+ft(i)+"/approvals",taskApprovalDecision:(i,r,h)=>"/tasks/"+ft(i)+"/approvals/"+ft(r)+"/"+h,taskFollowups:i=>"/tasks/"+ft(i)+"/followups",taskChatHistory:i=>"/tasks/"+ft(i)+"/chat-history",taskMessages:i=>"/tasks/"+ft(i)+"/messages",taskMessagesTo:i=>"/tasks/"+ft(i)+"/messages",taskThread:i=>"/tasks/"+ft(i)+"/thread",taskThreads:i=>"/tasks/"+ft(i)+"/threads",taskThreadAction:(i,r)=>"/tasks/"+ft(i)+"/thread/"+r,taskCost:i=>"/tasks/"+ft(i)+"/cost",taskBrowserState:i=>"/tasks/"+ft(i)+"/browser/state",taskBrowserStream:i=>"/tasks/"+ft(i)+"/browser/stream",taskBrowserInput:i=>"/tasks/"+ft(i)+"/browser/input",taskBrowserControl:i=>"/tasks/"+ft(i)+"/browser/control",uploads:"/uploads",adminQuotas:"/admin/quotas",adminQuotaUser:i=>"/admin/quotas?user_id="+ft(i),adminSweep:"/admin/sweep",adminBackup:"/admin/backup"},Jy={exec:"命令",file:"文件",call:"调用",tool:"工具",message:"消息",reasoning:"思考",plan:"计划","agent-start":"子代理","agent-done":"子代理"},uu=["completed","failed","interrupted","merged","merge-failed"],Fy={queued:"排队中,尚未被 worker 认领",running:"运行中,模型回合进行中",completed:"模型回合结束、改动在 worktree 里尚未合并",failed:"模型回合失败,可重试",interrupted:"已被取消/中断,可重试",merged:"控制面已标记 merged,不代表 git 主分支已合入","merge-failed":"合并落盘失败,可重试"},Qh=["low","medium","high","xhigh","max"],Wy=["viewer","contributor","maintainer","owner"],go="codex-console-key";function sl(){try{return localStorage.getItem(go)||""}catch{return""}}function $y(i){localStorage.setItem(go,i)}function Iy(){localStorage.removeItem(go)}function Ne(i){return i?i.slice(0,8):""}function Ya(i){return i?new Date(i*1e3).toLocaleString():""}async function I(i,r="GET",h){const f={"Content-Type":"application/json"},S=sl();S&&(f["X-API-Key"]=S);const N={method:r,headers:f};h!==void 0&&(N.body=JSON.stringify(h));const A=await fetch(i,N);let p=null;try{p=await A.json()}catch{p=null}if(!A.ok){const H=p;let O=H&&H.error?H.error:"HTTP "+A.status;throw A.status===401&&(O+="(key 未填或无效)"),A.status===429&&(O+="(触发限流,稍后再试)"),A.status===402&&(H&&H.unpriced_token_cap!==void 0?O+="(无价 token 已满,联系管理员调整)":H&&H.error==="coordinator_quota_reserve_exceeded"?O="协调员分工预留不足:剩余美元配额不够覆盖全部分工,子任务费用记父任务创建人账,整个父任务已被挡下(未建任何子任务)":O+="(美元配额已满,联系管理员调整)"),new Error(O)}return p}async function Py(i){const r=new FormData;r.append("paths",JSON.stringify(i.map(S=>S.path))),i.forEach((S,N)=>r.append("file"+N,S.file));const h=await fetch(Z.uploads,{method:"POST",headers:{"X-API-Key":sl()},body:r}),f=await h.json().catch(()=>({}));if(!h.ok)throw new Error(f&&f.error||"HTTP "+h.status);return f.upload_id}function tg(i,r,h){const f=[],S={},N=(A,p)=>{if(A)for(let H=0;HA.name),N(r,A=>A.webkitRelativePath||A.name),N(h,A=>A.name),f}function Jh(i){const r=Date.now()/1e3;let h=null;if(typeof i.last_seen=="number"?h=r-i.last_seen:typeof i.last_seen_seconds_ago=="number"&&(h=i.last_seen_seconds_ago),(h===null||h<0)&&(h=null),h===null)return{text:"未知",age:null};const f=Math.floor(h);return f<60?{text:f+" 秒前",age:h}:f<3600?{text:Math.floor(f/60)+" 分钟前",age:h}:{text:Math.floor(f/3600)+" 小时前",age:h}}function Mc(i){const r=i.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 oo(i){const r=i.message||"";return r.includes("forbidden")?"无全局管理员权限:服务端返回 403(CODEX_GLOBAL_ADMINS 未包含当前用户),请联系管理员":r.includes("user not found")?"找不到该用户:请核对用户 id 是否正确":"管理操作失败:"+r}function fo(i){return i==null?"不限额":"$"+(i/1e6).toFixed(2)}function vo(i){const r=Jy[i.kind||""]||i.kind||"?";let h="";return i.kind==="exec"?h=(i.command||"")+"(exit="+(i.exitCode??"")+","+(i.durationMs??"")+"ms,cwd="+(i.cwd||"")+")":i.kind==="file"?h=(i.path||"")+" "+(i.change||"")+" "+(i.status||""):i.kind==="message"?h=(i.phase?"["+i.phase+"] ":"")+(i.text||"")+(i.truncated?"(链路摘要已截断至 300 字,完整回复见右侧任务结果)":""):i.kind==="reasoning"?h=i.summary||"":i.kind==="tool"?h=(i.server||"")+"/"+(i.tool||"")+" "+(i.status||""):i.kind==="call"?h=i.name||"":i.kind==="plan"?h=i.text||"":i.kind==="agent-start"?h="开始:"+(i.name||"")+(i.prompt?"("+i.prompt+")":""):i.kind==="agent-done"?h="结束:"+(i.name||"")+" "+(i.status||""):h=JSON.stringify(i).slice(0,300),"["+r+"] "+h}function eg(){const[i,r]=d.useState(!!sl()),[h,f]=d.useState(sl()?"已保存到本浏览器(只用于调本站 API)":"未填 key,数据接口会返回 401"),[S,N]=d.useState("未加载"),[A,p]=d.useState("未加载"),[H,O]=d.useState("填 key 后判断权限…"),[Y,j]=d.useState(!1),[k,K]=d.useState(""),[L,at]=d.useState(""),[X,vt]=d.useState([]),[bt,zt]=d.useState(""),[J,Rt]=d.useState(""),[it,Q]=d.useState([]),[rt,Ut]=d.useState(null),[Qt,Nt]=d.useState("未加载"),[kt,B]=d.useState(""),[ot,st]=d.useState([]),[q,C]=d.useState(""),[lt,gt]=d.useState(""),[yt,ge]=d.useState([]),[we,Ce]=d.useState([]),[y,D]=d.useState([]),[ut,nt]=d.useState("先选项目"),[Tt,xt]=d.useState(""),[Ot,$]=d.useState(""),[dt,ce]=d.useState(""),[Ga,jl]=d.useState(""),[Le,le]=d.useState([]),[Yt,he]=d.useState(""),[Kl,pe]=d.useState(""),[fa,Ve]=d.useState(""),[zl,Rl]=d.useState(!1),[Tl,Be]=d.useState(""),[se,re]=d.useState(""),[rl,Jl]=d.useState([]),[da,Dl]=d.useState(!1),te=d.useRef("");te.current=bt;const Pe=d.useRef("");Pe.current=se;const qe=d.useCallback(async()=>{try{const M=await I(Z.health);p("backend="+M.backend+" db_ok="+M.db_ok+" worker_ok="+M.worker_ok+" commit="+String(M.commit||"").slice(0,7))}catch(M){p("加载失败:"+M.message)}},[]),_l=d.useCallback(async()=>{if(!sl()){N("未填 key,配额不显示");return}try{const M=await I(Z.quotaMe),V=((M.used_usd_micros||0)/1e6).toFixed(2),et=M.quota_usd_micros===null||M.quota_usd_micros===void 0?"美元:本月用量 $"+V+"(不限额)":"美元:本月用量 $"+V+" / $"+((M.quota_usd_micros||0)/1e6).toFixed(2)+"(剩余 $"+((M.remaining_usd_micros||0)/1e6).toFixed(2)+")",Bt=M.unpriced_token_cap===void 0||M.unpriced_tokens_used===void 0?"无价 token:未返回(旧服务端)":"无价 token:"+M.unpriced_tokens_used+" / "+M.unpriced_token_cap+" tokens";N(et+" | "+Bt)}catch(M){N("配额加载失败:"+M.message)}},[]),ol=d.useCallback(async()=>{if(!sl()){O("未填 key,管理区不可用"),j(!1);return}try{const M=await fetch(Z.adminQuotas,{headers:{"X-API-Key":sl()}});M.status===400?(O("已确认为全局管理员,管理操作可用"),j(!0)):M.status===403?(O("管理区仅全局管理员可用:当前 key 无全局管理员权限(服务端返回 403)"),j(!1)):M.status===401?(O("key 无效,管理区不可用(服务端返回 401)"),j(!1)):(O("管理权限判断失败(HTTP "+M.status+"),管理操作暂不可用"),j(!1))}catch(M){O("管理权限判断失败:"+M.message),j(!1)}},[]),Ft=d.useCallback(async()=>{try{const V=(await I(Z.projects)).projects||[];vt(V),Rt(V.length+" 个项目"),te.current&&V.some(et=>et.id===te.current)}catch(M){Rt("加载失败:"+M.message)}},[]),Ul=d.useCallback(async()=>{try{const M=await I(Z.githubRepos);Q(M.repos||[])}catch{}},[]),mn=d.useCallback(async()=>{try{const M=await I(Z.relayModels);Jl(M.models||[]),Dl(!1)}catch{Dl(!0)}},[]),Qa=d.useCallback(async()=>{try{const M=await I(Z.workers);if(!Array.isArray(M)&&M.workers===void 0&&M.workers_total!==void 0){Ut(null),Nt(M.workers_total?"在线 "+M.workers_online+" / 离线 "+M.workers_offline+"(共 "+M.workers_total+";完整 worker 清单仅全局管理员可见)":"无 worker 注册"),B("");return}const V=Array.isArray(M)?M:M.workers||[];Ut(V),Nt(V.length?"":"无 worker 注册"),B("")}catch(M){B("加载失败:"+M.message)}},[]),Se=d.useCallback(async M=>{const V=M!==void 0?M:te.current,et=Pe.current;if(!V){le([]),he(""),re("");return}try{const Mt=(await I(Z.environments(V))).environments||[];le(Mt),he(Mt.length+" 个环境"),(et&&Mt.some(xe=>xe.id===et&&xe.status==="ready")||et&&Mt.some(xe=>xe.id===et))&&re(et);const be=X.find(xe=>xe.id===V);be&&be.repo_url?(Ve("仓库:"+be.repo_url),Rl(!1)):be?(Ve("该项目未绑定仓库,环境无法创建——先选一个仓库保存"),Rl(!0)):(Ve(""),Rl(!1))}catch(Bt){pe("加载失败:"+Bt.message)}},[X]),Xa=d.useCallback(async M=>{const V=M!==void 0?M:te.current;if(!V){st([]);return}try{const et=await I(Z.projectMembers(V));st(et.members||[]),gt("")}catch(et){gt("成员加载失败:"+Mc(et))}},[]),ma=d.useCallback(async M=>{const V=M!==void 0?M:te.current;if(!V){ge([]),Ce([]),D([]),nt("先选项目");return}nt("");try{const et=await I(Z.projectSkills(V));ge(et.skills||[])}catch(et){xt("技能加载失败:"+et.message)}try{const et=await I(Z.projectApps(V));Ce(et.apps||[])}catch(et){xt("应用加载失败:"+et.message)}try{const et=await I(Z.projectMcp(V));D(et.servers||et.mcp_servers||[])}catch(et){xt("MCP 服务加载失败:"+et.message)}},[]),su=d.useCallback(M=>{if(!M.trim()){f("key 为空,未保存");return}$y(M.trim()),r(!0),f("已保存到本浏览器(只用于调本站 API)")},[]),ru=d.useCallback(()=>{Iy(),r(!1),f("未填 key,数据接口会返回 401"),ol()},[ol]),Fl=d.useCallback(async(M,V)=>{if(!M.trim()){Rt("项目名必填");return}const et={name:M.trim()};V.trim()&&(et.repo_url=V.trim());try{await I(Z.projects,"POST",et),Rt("项目已建"),await Ft()}catch(Bt){Rt("新建失败:"+Bt.message)}},[Ft]),Ae=d.useCallback(async(M,V,et)=>{const Bt=te.current;if(!Bt){pe("先选项目");return}if(!M.trim()){pe("环境名必填");return}const Mt={project_id:Bt,name:M.trim()};V.trim()&&(Mt.branch=V.trim()),et&&(Mt.executor=et);try{await I(Z.environmentsCreate,"POST",Mt),pe("环境已建,worker 准备中(creating → ready,失败会在列表里写原因)"),await Se(Bt)}catch(be){pe("新建失败:"+be.message)}},[Se]),fl=d.useCallback(async M=>{if(window.confirm("确定归档该环境吗?归档后新任务不能再选它,进行中的任务不受影响(有进行中任务在用它时归档会被拒绝)。"))try{await I(Z.environmentArchive(M),"POST",{}),await Se()}catch(V){pe("归档失败:"+V.message)}},[Se]),Oe=d.useCallback(async M=>{const V=te.current;if(!V){Be("先选项目");return}if(!M){Be("先选一个仓库");return}try{await I(Z.project(V),"PATCH",{repo_url:M}),Be("仓库已保存,现在可以建环境了"),await Ft(),await Se(V)}catch(et){Be("保存失败:"+et.message)}},[Ft,Se]),ou=d.useCallback(async(M,V)=>{const et=te.current;if(!et){C("先选项目");return}if(!M.trim()){C("请填成员 user_id 或用户名");return}try{await I(Z.projectMembers(et),"POST",{user_id:M.trim(),role:V})}catch(Bt){if(Bt.message.includes("user not found"))try{await I(Z.projectMembers(et),"POST",{username:M.trim(),role:V})}catch(Mt){C(Mc(Mt));return}else{C(Mc(Bt));return}}C("已邀请成员"),await Xa(et)},[Xa]),fu=d.useCallback(async(M,V)=>{const et=te.current;if(et)try{await I(Z.projectMember(et,M),"PATCH",{role:V}),st(Bt=>Bt.map(Mt=>Mt.user_id===M?{...Mt,role:V}:Mt)),C("角色已改为 "+V)}catch(Bt){C(Mc(Bt))}},[]),du=d.useCallback(async()=>{const M=te.current;if(!M){$("先选项目");return}try{await I(Z.projectMcpReload(M),"POST",{}),$("配置已重载"),await ma(M)}catch(V){$("重载失败:"+V.message)}},[ma]),w=d.useCallback(async M=>{const V=te.current;if(!V){ce("先选项目");return}if(!M.trim()){ce("服务名不能为空");return}try{const et=await I(Z.projectMcpOauth(V,M.trim()),"POST",{}),Bt=et.url||et.auth_url||et.login_url||et.authorization_url||"",Mt=et.steps||et.instructions||"";let be=`登录尚未完成:请在浏览器打开下面的链接或按步骤完成,完成后回到本页刷新 MCP 状态。 +`+a.stack}}var te=Object.prototype.hasOwnProperty,Pe=i.unstable_scheduleCallback,qe=i.unstable_cancelCallback,_l=i.unstable_shouldYield,ol=i.unstable_requestPaint,Wt=i.unstable_now,Ul=i.unstable_getCurrentPriorityLevel,mn=i.unstable_ImmediatePriority,Qa=i.unstable_UserBlockingPriority,Se=i.unstable_NormalPriority,Xa=i.unstable_LowPriority,ma=i.unstable_IdlePriority,su=i.log,ru=i.unstable_setDisableYieldValue,Fl=null,Ae=null;function fl(t){if(typeof su=="function"&&ru(t),Ae&&typeof Ae.setStrictMode=="function")try{Ae.setStrictMode(Fl,t)}catch{}}var Oe=Math.clz32?Math.clz32:du,ou=Math.log,fu=Math.LN2;function du(t){return t>>>=0,t===0?32:31-(ou(t)/fu|0)|0}var k=256,U=262144,W=4194304;function tt(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 M(t,e,l){var a=t.pendingLanes;if(a===0)return 0;var n=0,u=t.suspendedLanes,s=t.pingedLanes;t=t.warmLanes;var o=a&134217727;return o!==0?(a=o&~u,a!==0?n=tt(a):(s&=o,s!==0?n=tt(s):l||(l=o&~t,l!==0&&(n=tt(l))))):(o=a&~u,o!==0?n=tt(o):s!==0?n=tt(s):l||(l=a&~t,l!==0&&(n=tt(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 Z(t,e){return(t.pendingLanes&~(t.suspendedLanes&~t.pingedLanes)&e)===0}function et(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 xe(t,e){t.pendingLanes|=e,e!==268435456&&(t.suspendedLanes=0,t.pingedLanes=0,t.warmLanes=0)}function Dc(t,e,l,a,n,u){var s=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 o=t.entanglements,m=t.expirationTimes,x=t.hiddenUpdates;for(l=s&~l;0"u"||typeof window.document>"u"||typeof window.document.createElement>"u"),Gc=!1;if(Il)try{var pu={};Object.defineProperty(pu,"passive",{get:function(){Gc=!0}}),window.addEventListener("test",pu,pu),window.removeEventListener("test",pu,pu)}catch{Gc=!1}var ha=null,Qc=null,mi=null;function wo(){if(mi)return mi;var t,e=Qc,l=e.length,a,n="value"in ha?ha.value:ha.textContent,u=n.length;for(t=0;t=xu),Qo=" ",Xo=!1;function Lo(t,e){switch(t){case"keyup":return Dv.indexOf(e.keyCode)!==-1;case"keydown":return e.keyCode!==229;case"keypress":case"mousedown":case"focusout":return!0;default:return!1}}function Vo(t){return t=t.detail,typeof t=="object"&&"data"in t?t.data:null}var Tn=!1;function Hv(t,e){switch(t){case"compositionend":return Vo(e);case"keypress":return e.which!==32?null:(Xo=!0,Qo);case"textInput":return t=e.data,t===Qo&&Xo?null:t;default:return null}}function wv(t,e){if(Tn)return t==="compositionend"||!Kc&&Lo(t,e)?(t=wo(),mi=Qc=ha=null,Tn=!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 Po(t){for(;t&&t.firstChild;)t=t.firstChild;return t}function tf(t,e){var l=Po(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=Po(l)}}function ef(t,e){return t&&e?t===e?!0:t&&t.nodeType===3?!1:e&&e.nodeType===3?ef(t,e.parentNode):"contains"in t?t.contains(e):t.compareDocumentPosition?!!(t.compareDocumentPosition(e)&16):!1:!1}function lf(t){t=t!=null&&t.ownerDocument!=null&&t.ownerDocument.defaultView!=null?t.ownerDocument.defaultView:window;for(var e=Wc(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=Wc(t.document)}return e}function $c(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 Lv=Il&&"documentMode"in document&&11>=document.documentMode,_n=null,Ic=null,Eu=null,Pc=!1;function af(t,e,l){var a=l.window===l?l.document:l.nodeType===9?l:l.ownerDocument;Pc||_n==null||_n!==Wc(a)||(a=_n,"selectionStart"in a&&$c(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}),Eu&&_u(Eu,a)||(Eu=a,a=pc(Ic,"onSelect"),0>=s,n-=s,kl=1<<32-Oe(e)+n|l<mt?(me=ct,ct=null):me=ct.sibling;var Dt=g(b,ct,T[mt],z);if(Dt===null){ct===null&&(ct=me);break}t&&ct&&Dt.alternate===null&&e(b,ct),v=u(Dt,v,mt),At===null?F=Dt:At.sibling=Dt,At=Dt,ct=me}if(mt===T.length)return l(b,ct),jt&&la(b,mt),F;if(ct===null){for(;mtmt?(me=ct,ct=null):me=ct.sibling;var qa=g(b,ct,Dt.value,z);if(qa===null){ct===null&&(ct=me);break}t&&ct&&qa.alternate===null&&e(b,ct),v=u(qa,v,mt),At===null?F=qa:At.sibling=qa,At=qa,ct=me}if(Dt.done)return l(b,ct),jt&&la(b,mt),F;if(ct===null){for(;!Dt.done;mt++,Dt=T.next())Dt=R(b,Dt.value,z),Dt!==null&&(v=u(Dt,v,mt),At===null?F=Dt:At.sibling=Dt,At=Dt);return jt&&la(b,mt),F}for(ct=a(ct);!Dt.done;mt++,Dt=T.next())Dt=_(ct,b,mt,Dt.value,z),Dt!==null&&(t&&(me=Dt.alternate,me!==null&&ct.delete(me.key===null?mt:me.key)),v=u(Dt,v,mt),At===null?F=Dt:At.sibling=Dt,At=Dt);return t&&ct.forEach(function(Hy){return e(b,Hy)}),jt&&la(b,mt),F}function St(b,v,T,z){if(typeof T=="object"&&T!==null&&T.type===Nt&&T.key===null&&T.props.ref===void 0&&(T=T.props.children),typeof T=="object"&&T!==null){switch(T.$$typeof){case Ut:t:{for(var F=T.key;v!==null;){if(v.key===F){if(F=T.type,F===Nt){if(v.tag===7){l(b,v.sibling),z=n(v,T.props.children),ba(z,T),z.return=b,b=z;break t}}else if(v.elementType===F||typeof F=="object"&&F!==null&&F.$$typeof===yt&&ln(F)===v.type){l(b,v.sibling),z=n(v,T.props),ba(z,T),z.return=b,b=z;break t}l(b,v);break}else e(b,v);v=v.sibling}T.type===Nt?(z=Fa(T.props.children,b.mode,z,T.key),ba(z,T),z.return=b,b=z):(z=Ti(T.type,T.key,T.props,null,b.mode,z),ba(z,T),z.return=b,b=z)}return s(b);case Qt:t:{for(F=T.key;v!==null;){if(v.key===F)if(v.tag===4&&v.stateNode.containerInfo===T.containerInfo&&v.stateNode.implementation===T.implementation){l(b,v.sibling),z=n(v,T.children||[]),z.return=b,b=z;break t}else{l(b,v);break}else e(b,v);v=v.sibling}z=is(T,b.mode,z),z.return=b,b=z}return s(b);case yt:return T=ln(T),St(b,v,T,z)}if(Ot(T))return G(b,v,T,z);if(nt(T)){if(F=nt(T),typeof F!="function")throw Error(f(150));return T=F.call(T),P(b,v,T,z)}if(typeof T.then=="function")return St(b,v,Di(T),z);if(T.$$typeof===st)return St(b,v,Oi(b,T),z);Ui(b,T)}return typeof T=="string"&&T!==""||typeof T=="number"||typeof T=="bigint"?(T=""+T,v!==null&&v.tag===6?(l(b,v.sibling),z=n(v,T),z.return=b,b=z):(l(b,v),z=us(T,b.mode,z),z.return=b,b=z),s(b)):l(b,v)}return function(b,v,T,z){try{zu=0;var F=St(b,v,T,z);return Dn=null,F}catch(ct){if(ct===Rn||ct===zi)throw ct;var At=Je(29,ct,null,b.mode);return At.lanes=z,At.return=b,At}finally{}}}var nn=Af(!0),Of=Af(!1),xa=!1;function ys(t){t.updateQueue={baseState:t.memoizedState,firstBaseUpdate:null,lastBaseUpdate:null,shared:{pending:null,lanes:0,hiddenCallbacks:null},callbacks:null}}function gs(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 ja(t){return{lane:t,tag:0,payload:null,callback:null,next:null}}function Ta(t,e,l){var a=t.updateQueue;if(a===null)return null;if(a=a.shared,(qt&2)!==0){var n=a.pending;return n===null?e.next=e:(e.next=n.next,n.next=e),a.pending=e,e=ji(t),df(t,null,l),e}return xi(t,a,e,l),ji(t)}function Ru(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,hn(t,l)}}function ps(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 s={lane:l.lane,tag:l.tag,payload:l.payload,callback:null,next:null};u===null?n=u=s:u=u.next=s,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 Ss=!1;function Du(){if(Ss){var t=zn;if(t!==null)throw t}}function Uu(t,e,l,a){Ss=!1;var n=t.updateQueue;xa=!1;var u=n.firstBaseUpdate,s=n.lastBaseUpdate,o=n.shared.pending;if(o!==null){n.shared.pending=null;var m=o,x=m.next;m.next=null,s===null?u=x:s.next=x,s=m;var E=t.alternate;E!==null&&(E=E.updateQueue,o=E.lastBaseUpdate,o!==s&&(o===null?E.firstBaseUpdate=x:o.next=x,E.lastBaseUpdate=m))}if(u!==null){var R=n.baseState;s=0,E=x=m=null,o=u;do{var g=o.lane&-536870913,_=g!==o.lane;if(_?(Ct&g)===g:(a&g)===g){g!==0&&g===tn&&(Ss=!0),E!==null&&(E=E.next={lane:0,tag:o.tag,payload:o.payload,callback:null,next:null});t:{var G=t,P=o;g=e;var St=l;switch(P.tag){case 1:if(G=P.payload,typeof G=="function"){R=G.call(St,R,g);break t}R=G;break t;case 3:G.flags=G.flags&-65537|128;case 0:if(G=P.payload,g=typeof G=="function"?G.call(St,R,g):G,g==null)break t;R=Q({},R,g);break t;case 2:xa=!0}}g=o.callback,g!==null&&(t.flags|=64,_&&(t.flags|=8192),_=n.callbacks,_===null?n.callbacks=[g]:_.push(g))}else _={lane:g,tag:o.tag,payload:o.payload,callback:o.callback,next:null},E===null?(x=E=_,m=R):E=E.next=_,s|=g;if(o=o.next,o===null){if(o=n.shared.pending,o===null)break;_=o,o=_.next,_.next=null,n.lastBaseUpdate=_,n.shared.pending=null}}while(!0);E===null&&(m=R),n.baseState=m,n.firstBaseUpdate=x,n.lastBaseUpdate=E,u===null&&(n.shared.lanes=0),Ma|=s,t.lanes=s,t.memoizedState=R}}function Mf(t,e){if(typeof t!="function")throw Error(f(191,t));t.call(e)}function zf(t,e){var l=t.callbacks;if(l!==null)for(t.callbacks=null,t=0;tu?u:8;var s=$.T,o={};o.types=s!==null?s.types:null,$.T=o,qs(t,!1,e,l);try{var m=n(),x=$.S;if(x!==null&&x(o,m),m!==null&&typeof m=="object"&&typeof m.then=="function"){var E=e0(m,a);Bu(t,e,E,il(t))}else Bu(t,e,a,il(t))}catch(R){Bu(t,e,{then:function(){},status:"rejected",reason:R},il())}finally{dt.p=u,s!==null&&o.types!==null&&(s.types=o.types),$.T=s}}function c0(){}function ks(t,e,l,a){if(t.tag!==5)throw Error(f(476));var n=rd(t).queue;sd(t,n,e,ce,l===null?c0:function(){return od(t),l(a)})}function rd(t){var e=t.memoizedState;if(e!==null)return e;e={memoizedState:ce,baseState:ce,baseQueue:null,queue:{pending:null,lanes:0,dispatch:null,lastRenderedReducer:ia,lastRenderedState:ce},next:null};var l={};return e.next={memoizedState:l,baseState:l,baseQueue:null,queue:{pending:null,lanes:0,dispatch:null,lastRenderedReducer:ia,lastRenderedState:l},next:null},t.memoizedState=e,t=t.alternate,t!==null&&(t.memoizedState=e),e}function od(t){var e=rd(t);e.next===null&&(e=t.alternate.memoizedState),Bu(t,e.next.queue,{},il())}function Bs(){return Me(eu)}function fd(){return ie().memoizedState}function dd(){return ie().memoizedState}function s0(t){for(var e=t.return;e!==null;){switch(e.tag){case 24:case 3:var l=il();t=ja(l);var a=Ta(e,t,l);a!==null&&(Ie(a,e,l),Ru(a,e,l)),e={cache:ds()},t.payload=e;return}e=e.return}}function r0(t,e,l){var a=il();l={lane:a,revertLane:0,gesture:null,action:l,hasEagerState:!1,eagerState:null,next:null},Li(t)?hd(e,l):(l=as(t,e,l,a),l!==null&&(Ie(l,t,a),vd(l,e,a)))}function md(t,e,l){var a=il();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(Li(t))hd(e,n);else{var u=t.alternate;if(t.lanes===0&&(u===null||u.lanes===0)&&(u=e.lastRenderedReducer,u!==null))try{var s=e.lastRenderedState,o=u(s,l);if(n.hasEagerState=!0,n.eagerState=o,el(o,s))return xi(t,e,n,0),Ft===null&&bi(),!1}catch{}finally{}if(l=as(t,e,n,a),l!==null)return Ie(l,t,a),vd(l,e,a),!0}return!1}function qs(t,e,l,a){if(a={lane:2,revertLane:Or(),gesture:null,action:a,hasEagerState:!1,eagerState:null,next:null},Li(t)){if(e)throw Error(f(479))}else e=as(t,l,a,2),e!==null&&Ie(e,t,2)}function Li(t){var e=t.alternate;return t===pt||e!==null&&e===pt}function hd(t,e){Un=ki=!0;var l=t.pending;l===null?e.next=e:(e.next=l.next,l.next=e),t.pending=e}function vd(t,e,l){if((l&4194048)!==0){var a=e.lanes;a&=t.pendingLanes,l|=a,e.lanes=l,hn(t,l)}}var Vi={readContext:Me,use:Yi,useCallback:ne,useContext:ne,useEffect:ne,useImperativeHandle:ne,useLayoutEffect:ne,useInsertionEffect:ne,useMemo:ne,useReducer:ne,useRef:ne,useState:ne,useDebugValue:ne,useDeferredValue:ne,useTransition:ne,useSyncExternalStore:ne,useId:ne,useHostTransitionStatus:ne,useFormState:ne,useActionState:ne,useOptimistic:ne,useMemoCache:ne,useCacheRefresh:ne,useEffectEvent:ne},yd={readContext:Me,use:Yi,useCallback:function(t,e){return Ge().memoizedState=[t,e===void 0?null:e],t},useContext:Me,useEffect:Pf,useImperativeHandle:function(t,e,l){l=l!=null?l.concat([t]):null,Qi(4194308,4,ad.bind(null,e,t),l)},useLayoutEffect:function(t,e){return Qi(4194308,4,t,e)},useInsertionEffect:function(t,e){Qi(4,2,t,e)},useMemo:function(t,e){var l=Ge();e=e===void 0?null:e;var a=t();if(un){fl(!0);try{t()}finally{fl(!1)}}return l.memoizedState=[a,e],a},useReducer:function(t,e,l){var a=Ge();if(l!==void 0){var n=l(e);if(un){fl(!0);try{l(e)}finally{fl(!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=r0.bind(null,pt,t),[a.memoizedState,t]},useRef:function(t){var e=Ge();return t={current:t},e.memoizedState=t},useState:function(t){t=Rs(t);var e=t.queue,l=md.bind(null,pt,e);return e.dispatch=l,[t.memoizedState,l]},useDebugValue:Hs,useDeferredValue:function(t,e){var l=Ge();return ws(l,t,e)},useTransition:function(){var t=Rs(!1);return t=sd.bind(null,pt,t.queue,!0,!1),Ge().memoizedState=t,[!1,t]},useSyncExternalStore:function(t,e,l){var a=pt,n=Ge();if(jt){if(l===void 0)throw Error(f(407));l=l()}else{if(l=e(),Ft===null)throw Error(f(349));(Ct&127)!==0||kf(a,e,l)}n.memoizedState=l;var u={value:l,getSnapshot:e};return n.queue=u,Pf(qf.bind(null,a,u,t),[t]),a.flags|=2048,wn(9,{destroy:void 0},Bf.bind(null,a,u,l,e),null),l},useId:function(){var t=Ge(),e=Ft.identifierPrefix;if(jt){var l=Bl,a=kl;l=(a&~(1<<32-Oe(a)-1)).toString(32)+l,e="_"+e+"R_"+l,l=Bi++,0<\/script>",u=u.removeChild(u.firstChild);break;case"select":u=typeof a.is=="string"?s.createElement("select",{is:a.is}):s.createElement("select"),a.multiple?u.multiple=!0:a.size&&(u.size=a.size);break;default:u=typeof a.is=="string"?s.createElement(n,{is:a.is}):s.createElement(n)}}u[ve]=e,u[Ke]=a;t:for(s=e.child;s!==null;){if(s.tag===5||s.tag===6)u.appendChild(s.stateNode);else if(s.tag!==4&&s.tag!==27&&s.child!==null){s.child.return=s,s=s.child;continue}if(s===e)break t;for(;s.sibling===null;){if(s.return===null||s.return===e)break t;s=s.return}s.sibling.return=s.return,s=s.sibling}e.stateNode=u;t:switch(Ue(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&&sa(e)}}return It(e),e.subtreeFlags&=-33554433,Is(e,e.type,t===null?null:t.memoizedProps,e.pendingProps,l),null;case 6:if(t&&e.stateNode!=null)t.memoizedProps!==a&&sa(e);else{if(typeof a!="string"&&e.stateNode===null)throw Error(f(166));if(t=pe.current,Mn(e)){if(t=e.stateNode,l=e.memoizedProps,a=null,n=Te,n!==null)switch(n.tag){case 27:case 5:a=n.memoizedProps}t[ve]=e,t=!!(t.nodeValue===l||a!==null&&a.suppressHydrationWarning===!0||qm(t.nodeValue,l)),t||pa(e,!0)}else t=$u(t).createTextNode(a),t[ve]=e,e.stateNode=t}return It(e),null;case 31:if(l=e.memoizedState,t===null||t.memoizedState!==null){if(a=Mn(e),l!==null){if(t===null){if(!a)throw Error(f(318));if(t=e.memoizedState,t=t!==null?t.dehydrated:null,!t)throw Error(f(557));t[ve]=e}else Wa(),(e.flags&128)===0&&(e.memoizedState=null),e.flags|=4;It(e),t=!1}else l=rs(),t!==null&&t.memoizedState!==null&&(t.memoizedState.hydrationErrors=l),t=!0;if(!t)return e.flags&256?(ll(e),e):(ll(e),null);if((e.flags&128)!==0)throw Error(f(558))}return It(e),null;case 13:if(a=e.memoizedState,t===null||t.memoizedState!==null&&t.memoizedState.dehydrated!==null){if(n=Mn(e),a!==null&&a.dehydrated!==null){if(t===null){if(!n)throw Error(f(318));if(n=e.memoizedState,n=n!==null?n.dehydrated:null,!n)throw Error(f(317));n[ve]=e}else Wa(),(e.flags&128)===0&&(e.memoizedState=null),e.flags|=4;It(e),n=!1}else n=rs(),t!==null&&t.memoizedState!==null&&(t.memoizedState.hydrationErrors=n),n=!0;if(!n)return e.flags&256?(ll(e),e):(ll(e),null)}return ll(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),$i(e,e.updateQueue),It(e),null);case 4:return zl(),t===null&&Dr(e.stateNode.containerInfo),e.flags|=67108864,It(e),null;case 10:return na(e.type),It(e),null;case 19:if(Ts(e),a=e.memoizedState,a===null)return It(e),null;if(n=(e.flags&128)!==0,u=a.rendering,u===null)if(n)Yu(a,!1);else{if(ue!==0||t!==null&&(t.flags&128)!==0)for(t=e.child;t!==null;){if(u=wi(t),u!==null){for(e.flags|=128,Yu(a,!1),t=u.updateQueue,e.updateQueue=t,$i(e,t),e.subtreeFlags=0,t=l,l=e.child;l!==null;)mf(l,t),l=l.sibling;return Hu(e,Re.current&1|2),jt&&la(e,a.treeForkCount),e.child}t=t.sibling}a.tail!==null&&Wt()>rc&&(e.flags|=128,n=!0,Yu(a,!1),e.lanes=4194304)}else{if(!n)if(t=wi(u),t!==null){if(e.flags|=128,n=!0,t=t.updateQueue,e.updateQueue=t,$i(e,t),Yu(a,!0),a.tail===null&&a.tailMode!=="collapsed"&&a.tailMode!=="visible"&&!u.alternate&&!jt)return It(e),null}else 2*Wt()-a.renderingStartTime>rc&&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=Wt(),t.sibling=null,u=Re.current,u=n?u&1|2:u&1,a.tailMode==="visible"||a.tailMode==="collapsed"||!l||jt?Hu(e,u):(l=u,Yt(ze,e),Yt(Re,l),ke===null&&(ke=e)),jt&&la(e,a.treeForkCount),t}return It(e),null;case 22:case 23:return ll(e),xs(),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&&(It(e),e.subtreeFlags&6&&(e.flags|=8192)):It(e),l=e.updateQueue,l!==null&&$i(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&&le(en),null;case 24:return l=null,t!==null&&(l=t.memoizedState.cache),e.memoizedState.cache!==l&&(e.flags|=2048),na(oe),It(e),null;case 25:return null;case 30:return e.flags|=33554432,It(e),null}throw Error(f(156,e.tag))}function y0(t,e){switch(cs(e),e.tag){case 1:return t=e.flags,t&65536?(e.flags=t&-65537|128,e):null;case 3:return na(oe),zl(),t=e.flags,(t&65536)!==0&&(t&128)===0?(e.flags=t&-65537|128,e):null;case 26:case 27:case 5:return Tl(e),null;case 31:if(e.memoizedState!==null){if(ll(e),e.alternate===null)throw Error(f(340));Wa()}return t=e.flags,t&65536?(e.flags=t&-65537|128,e):null;case 13:if(ll(e),t=e.memoizedState,t!==null&&t.dehydrated!==null){if(e.alternate===null)throw Error(f(340));Wa()}return t=e.flags,t&65536?(e.flags=t&-65537|128,e):null;case 19:return Ts(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 zl(),null;case 10:return na(e.type),null;case 22:case 23:return ll(e),xs(),t!==null&&le(en),t=e.flags,t&65536?(e.flags=t&-65537|128,e):null;case 24:return na(oe),null;case 25:return null;default:return null}}function Gd(t,e){switch(cs(e),e.tag){case 3:na(oe),zl();break;case 26:case 27:case 5:Tl(e);break;case 4:zl();break;case 31:e.memoizedState!==null&&ll(e);break;case 13:ll(e);break;case 19:Ts(e);break;case 10:na(e.type);break;case 22:case 23:ll(e),xs(),t!==null&&le(en);break;case 24:na(oe)}}function Gu(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,s=l.inst;a=u(),s.destroy=a}l=l.next}while(l!==n)}}catch(o){Lt(e,e.return,o)}}function Ca(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 s=a.inst,o=s.destroy;if(o!==void 0){s.destroy=void 0,n=e;var m=l,x=o;try{x()}catch(E){Lt(n,m,E)}}}a=a.next}while(a!==u)}}catch(E){Lt(e,e.return,E)}}function Qd(t){var e=t.updateQueue;if(e!==null){var l=t.stateNode;try{zf(e,l)}catch(a){Lt(t,t.return,a)}}}function Xd(t,e,l){l.props=cn(t.type,t.memoizedProps),l.state=t.memoizedState;try{l.componentWillUnmount()}catch(a){Lt(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=Pl(t.memoizedProps,n);(n.ref===null||n.ref.name!==u)&&(n.ref=Wm(u)),a=n.ref;break;case 7:if(t.stateNode===null){var s=new cl(t);j(t.child,!1,iy,s,void 0,void 0),t.stateNode=s}a=t.stateNode;break;default:a=t.stateNode}typeof l=="function"?t.refCleanup=l(a):l.current=a}}catch(o){Lt(t,e,o)}}function De(t,e){var l=t.ref,a=t.refCleanup;if(l!==null)if(typeof a=="function")try{a()}catch(n){Lt(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){Lt(t,e,n)}else l.current=null}function Ii(t,e){if((t.tag===5||t.tag===27||t.tag===6)&&t.alternate===null&&e!==null)for(var l=0;l title"))),Ue(a,e,l),a[ve]=t,je(a),e=a;break t;case"link":if(u=mh("link","href",n).get(e+(l.href||""))){for(s=0;sSt&&(s=St,St=P,P=s);var b=tf(o,P),v=tf(o,St);if(b&&v&&(_.rangeCount!==1||_.anchorNode!==b.node||_.anchorOffset!==b.offset||_.focusNode!==v.node||_.focusOffset!==v.offset)){var T=R.createRange();T.setStart(b.node,b.offset),_.removeAllRanges(),P>St?(_.addRange(T),_.extend(v.node,v.offset)):(T.setEnd(v.node,v.offset),_.addRange(T))}}}}for(R=[],_=o;_=_.parentNode;)_.nodeType===1&&R.push({element:_,left:_.scrollLeft,top:_.scrollTop});for(typeof o.focus=="function"&&o.focus(),o=0;ol?32:l,$.T=null,l=Sr,Sr=null;var u=Ol,s=Vl;if(ee=0,fn=Ol=null,Vl=0,(qt&6)!==0)throw Error(f(331));var o=qt;if(qt|=4,dm(u.current),rm(u,u.current,s,l),qt=o,Ju(0,!1),Ae&&typeof Ae.onPostCommitFiberRoot=="function")try{Ae.onPostCommitFiberRoot(Fl,u)}catch{}return!0}finally{dt.p=n,$.T=a,Cm(t,e)}}function Am(t,e,l){e=hl(l,e),e=Qs(t.stateNode,e,2),t=Ta(t,e,2),t!==null&&(xe(t,2),Zl(t))}function Lt(t,e,l){if(t.tag===3)Am(t,t,l);else for(;e!==null;){if(e.tag===3){Am(e,t,l);break}else if(e.tag===1){var a=e.stateNode;if(typeof e.type.getDerivedStateFromError=="function"||typeof a.componentDidCatch=="function"&&(za===null||!za.has(a))){t=hl(l,t),l=_d(2),a=Ta(e,l,2),a!==null&&(Ed(l,a,e,t),xe(a,2),Zl(a));break}}e=e.return}}function Nr(t,e,l){var a=t.pingCache;if(a===null){a=t.pingCache=new b0;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)||(yr=!0,n.add(l),t=A0.bind(null,t,e,l),e.then(t,t))}function A0(t,e,l){var a=t.pingCache;a!==null&&a.delete(e),t.pingedLanes|=t.suspendedLanes&l,t.warmLanes&=~l,Ft===t&&(Ct&l)===l&&((ue===4||ue===3&&(Ct&62914560)===Ct&&300>Wt()-sc)&&(qt&2)===0?Kn(t,0):cc|=l,Qn===Ct&&(Qn=0)),Zl(t)}function Om(t,e){e===0&&(e=Mt()),t=Ja(t,e),t!==null&&(xe(t,e),Zl(t))}function O0(t){var e=t.memoizedState,l=0;e!==null&&(l=e.retryLane),Om(t,l)}function M0(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(f(314))}a!==null&&a.delete(e),Om(t,l)}function z0(t,e){return Pe(t,e)}var Fn=null,Wn=null,Cr=!1,yc=!1,Ar=!1,Da=0;function Zl(t){t!==Wn&&t.next===null&&(Wn===null?Fn=Wn=t:Wn=Wn.next=t),yc=!0,Cr||(Cr=!0,D0())}function Ju(t,e){if(!Ar&&yc){Ar=!0;do for(var l=!1,a=Fn;a!==null;){if(t!==0){var n=a.pendingLanes;if(n===0)var u=0;else{var s=a.suspendedLanes,o=a.pingedLanes;u=(1<<31-Oe(42|t)+1)-1,u&=n&~(s&~o),u=u&201326741?u&201326741|1:u?u|2:0}u!==0&&(l=!0,Dm(a,u))}else u=Ct,u=M(a,a===Ft?u:0,a.cancelPendingCommit!==null||a.timeoutHandle!==-1),(u&3)===0||Z(a,u)||(l=!0,Dm(a,u));a=a.next}while(l);Ar=!1}}function R0(){Mm()}function Mm(){yc=Cr=!1;var t=0;Da!==0&&L0()&&(t=Da);for(var e=Wt(),l=null,a=Fn;a!==null;){var n=a.next,u=zm(a,e);u===0?(a.next=null,l===null?Fn=n:l.next=n,n===null&&(Wn=l)):(l=a,(t!==0||(u&3)!==0)&&(yc=!0)),a=n}ee!==0&&ee!==5||Ju(t),Da!==0&&(Da=0)}function zm(t,e){for(var l=t.suspendedLanes,a=t.pingedLanes,n=t.expirationTimes,u=t.pendingLanes&-62914561;0o)break;var E=m.transferSize,R=m.initiatorType;E&&Ym(R)&&(m=m.responseEnd,s+=E*(mxc){P.length=G;break}T=new Promise(W0.bind(T)),P.push(T)}}}if(0"u"?null:document;function rh(t,e,l){var a=In;if(a&&typeof e=="string"&&e){var n=dl(e);n='link[rel="'+t+'"][href="'+n+'"]',typeof l=="string"&&(n+='[crossorigin="'+l+'"]'),sh.has(n)||(sh.add(n),t={rel:t,crossOrigin:l,href:e},a.querySelector(n)===null&&(e=a.createElement("link"),Ue(e,"link",t),je(e),a.head.appendChild(e)))}}function vy(t){oa.D(t),rh("dns-prefetch",t,null)}function yy(t,e){oa.C(t,e),rh("preconnect",t,e)}function gy(t,e,l){oa.L(t,e,l);var a=In;if(a&&t&&e){var n='link[rel="preload"][as="'+dl(e)+'"]';e==="image"&&l&&l.imageSrcSet?(n+='[imagesrcset="'+dl(l.imageSrcSet)+'"]',typeof l.imageSizes=="string"&&(n+='[imagesizes="'+dl(l.imageSizes)+'"]')):n+='[href="'+dl(t)+'"]';var u=n;switch(e){case"style":u=Pn(t);break;case"script":u=tu(t)}if(!(bl.has(u)||(t=Q({rel:"preload",href:e==="image"&&l&&l.imageSrcSet?void 0:t,as:e},l),bl.set(u,t),a.querySelector(n)!==null||e==="style"&&a.querySelector(Pu(u))||e==="script"&&a.querySelector(ti(u))))){var s=a.createElement("link");Ue(s,"link",t),e==="style"&&(s[si]=!0,s.onload=s.onerror=function(){xo(s)}),je(s),a.head.appendChild(s)}}}function py(t,e){oa.m(t,e);var l=In;if(l&&t){var a=e&&typeof e.as=="string"?e.as:"script",n='link[rel="modulepreload"][as="'+dl(a)+'"][href="'+dl(t)+'"]',u=n;switch(a){case"audioworklet":case"paintworklet":case"serviceworker":case"sharedworker":case"worker":case"script":u=tu(t)}if(!bl.has(u)&&(t=Q({rel:"modulepreload",href:t},e),bl.set(u,t),l.querySelector(n)===null)){switch(a){case"audioworklet":case"paintworklet":case"serviceworker":case"sharedworker":case"worker":case"script":if(l.querySelector(ti(u)))return}a=l.createElement("link"),Ue(a,"link",t),je(a),l.head.appendChild(a)}}}function Sy(t,e,l){oa.S(t,e,l);var a=In;if(a&&t){var n=gn(a).hoistableStyles,u=Pn(t);e=e||"default";var s=n.get(u);if(!s){var o={loading:0,preload:null};if(s=a.querySelector(Pu(u)))o.loading=5;else{t=Q({rel:"stylesheet",href:t,"data-precedence":e},l),(l=bl.get(u))&&Fr(t,l);var m=s=a.createElement("link");je(m),Ue(m,"link",t),m._p=new Promise(function(x,E){m.onload=x,m.onerror=E}),m.addEventListener("load",function(){o.loading|=1}),m.addEventListener("error",function(){o.loading|=2}),o.loading|=4,Sc(s,e,a)}s={type:"stylesheet",instance:s,count:1,state:o},n.set(u,s)}}}function by(t,e){oa.X(t,e);var l=In;if(l&&t){var a=gn(l).hoistableScripts,n=tu(t),u=a.get(n);u||(u=l.querySelector(ti(n)),u||(t=Q({src:t,async:!0},e),(e=bl.get(n))&&Wr(t,e),u=l.createElement("script"),je(u),Ue(u,"link",t),l.head.appendChild(u)),u={type:"script",instance:u,count:1,state:null},a.set(n,u))}}function xy(t,e){oa.M(t,e);var l=In;if(l&&t){var a=gn(l).hoistableScripts,n=tu(t),u=a.get(n);u||(u=l.querySelector(ti(n)),u||(t=Q({src:t,async:!0,type:"module"},e),(e=bl.get(n))&&Wr(t,e),u=l.createElement("script"),je(u),Ue(u,"link",t),l.head.appendChild(u)),u={type:"script",instance:u,count:1,state:null},a.set(n,u))}}function oh(t,e,l,a){var n=(n=pe.current)?Iu(n):null;if(!n)throw Error(f(446));switch(t){case"meta":case"title":return null;case"style":return typeof l.precedence=="string"&&typeof l.href=="string"?(l=Pn(l.href),e=gn(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=Pn(l.href);var u=gn(n).hoistableStyles,s=u.get(t);if(s||(n=n.ownerDocument||n,s={type:"stylesheet",instance:null,count:0,state:{loading:0,preload:null}},u.set(t,s),(u=n.querySelector(Pu(t)))?u._p||(s.instance=u,s.state.loading=5):(u=bl.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},bl.set(t,u)),jy(n,t,u,s.state))),e&&a===null)throw Error(f(528,""));return s}if(e&&a!==null)throw Error(f(529,""));return null;case"script":return e=l.async,l=l.src,typeof l=="string"&&e&&typeof e!="function"&&typeof e!="symbol"?(l=tu(l),e=gn(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(f(444,t))}}function Pn(t){return'href="'+dl(t)+'"'}function Pu(t){return'link[rel="stylesheet"]['+t+"]"}function fh(t){return Q({},t,{"data-precedence":t.precedence,precedence:null})}function jy(t,e,l,a){if(e=t.querySelector('link[rel="preload"][as="style"]['+e+"]")){if(e[si]!==!0){a.loading=1;return}}else e=t.createElement("link"),e[si]=!0,e.onload=e.onerror=xo.bind(null,e),Ue(e,"link",l),je(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 tu(t){return'[src="'+dl(t)+'"]'}function ti(t){return"script[async]"+t}function dh(t,e,l){if(e.count++,e.instance===null)switch(e.type){case"style":var a=t.querySelector('style[data-href~="'+dl(l.href)+'"]');if(a)return e.instance=a,je(a),a;var n=Q({},l,{"data-href":l.href,"data-precedence":l.precedence,href:null,precedence:null});return a=(t.ownerDocument||t).createElement("style"),je(a),Ue(a,"style",n),Sc(a,l.precedence,t),e.instance=a;case"stylesheet":n=Pn(l.href);var u=t.querySelector(Pu(n));if(u)return e.state.loading|=4,e.instance=u,je(u),u;a=fh(l),(n=bl.get(n))&&Fr(a,n),u=(t.ownerDocument||t).createElement("link"),je(u);var s=u;return s._p=new Promise(function(o,m){s.onload=o,s.onerror=m}),Ue(u,"link",a),e.state.loading|=4,Sc(u,l.precedence,t),e.instance=u;case"script":return u=tu(l.src),(n=t.querySelector(ti(u)))?(e.instance=n,je(n),n):(a=l,(n=bl.get(u))&&(a=Q({},l),Wr(a,n)),t=t.ownerDocument||t,n=t.createElement("script"),je(n),Ue(n,"link",a),t.head.appendChild(n),e.instance=n);case"void":return null;default:throw Error(f(443,e.type))}else e.type==="stylesheet"&&(e.state.loading&4)===0&&(a=e.instance,e.state.loading|=4,Sc(a,l.precedence,t));return e.instance}function Sc(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,s=0;s title"):null)}function Ty(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 hh(t,e){return t==="img"&&e.src!=null&&e.src!==""&&e.onLoad==null&&e.loading!=="lazy"}function vh(t){return!(t.type==="stylesheet"&&(t.state.loading&3)===0)}function yh(t){return(t.width||100)*(t.height||100)*(typeof devicePixelRatio=="number"?devicePixelRatio:1)*.25}function gh(t,e){typeof e.decode=="function"&&(t.imgCount++,e.complete||(t.imgBytes+=yh(e),t.suspenseyImages.push(e)),t=Ny.bind(t),e.decode().then(t,t))}function _y(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=Pn(a.href),u=e.querySelector(Pu(n));if(u){e=u._p,e!==null&&typeof e=="object"&&typeof e.then=="function"&&(t.count++,t=ei.bind(t),e.then(t,t)),l.state.loading|=4,l.instance=u,je(u);return}u=e.ownerDocument||e,a=fh(a),(n=bl.get(n))&&Fr(a,n),u=u.createElement("link"),je(u);var s=u;s._p=new Promise(function(o,m){s.onload=o,s.onerror=m}),Ue(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=ei.bind(t),e.addEventListener("load",l),e.addEventListener("error",l))}}var xc=0;function Ey(t,e){return t.stylesheets&&t.count===0&&Tc(t,t.stylesheets),0xc?50:800)+e);return t.unsuspend=l,function(){t.unsuspend=null,clearTimeout(a),clearTimeout(n)}}:null}function ph(t){if(t.count===0&&(t.imgCount===0||!t.waitingForImages)){if(t.stylesheets)Tc(t,t.stylesheets);else if(t.unsuspend){var e=t.unsuspend;t.unsuspend=null,e()}}}function ei(){this.count--,ph(this)}function Ny(){this.imgCount--,ph(this)}var jc=null;function Tc(t,e){t.stylesheets=null,t.unsuspend!==null&&(t.count++,jc=new Map,e.forEach(Cy,t),jc=null,ei.call(t))}function Cy(t,e){if(!(e.state.loading&4)){var l=jc.get(t);if(l)var a=l.get(null);else{l=new Map,jc.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(i)}catch(r){console.error(r)}}return i(),io.exports=Ly(),io.exports}var Zy=Vy();const Ky=Zh(Zy),Kh=d.createContext(null);function Zt(){const i=d.useContext(Kh);if(!i)throw new Error("ConsoleContext missing");return i}const ft=encodeURIComponent,K={health:"/health",relayModels:"/relay/models",quotaMe:"/users/me/quota",userKeys:"/users/me/keys",userKey:i=>"/users/me/keys/"+ft(i),githubRepos:"/github/repos",projects:"/projects",project:i=>"/projects/"+ft(i),projectMembers:i=>"/projects/"+ft(i)+"/members",projectMember:(i,r)=>"/projects/"+ft(i)+"/members/"+ft(r),projectSkills:i=>"/projects/"+ft(i)+"/skills",projectApps:i=>"/projects/"+ft(i)+"/apps",projectMcp:i=>"/projects/"+ft(i)+"/mcp-servers",projectMcpReload:i=>"/projects/"+ft(i)+"/mcp-servers/reload",projectMcpOauth:(i,r)=>"/projects/"+ft(i)+"/mcp-servers/"+ft(r)+"/oauth-login",projectAutomations:i=>"/projects/"+ft(i)+"/automations",projectAutomationCancel:(i,r)=>"/projects/"+ft(i)+"/automations/"+ft(r)+"/cancel",projectTriage:i=>"/projects/"+ft(i)+"/triage",projectTodos:i=>"/projects/"+ft(i)+"/todos",projectTodo:(i,r)=>"/projects/"+ft(i)+"/todos/"+ft(r),workers:"/workers",environments:i=>"/environments?project_id="+ft(i),environmentsCreate:"/environments",environmentArchive:i=>"/environments/"+ft(i)+"/archive",tasks:i=>"/tasks?project_id="+ft(i),tasksPage:(i,r,h,f,S,N)=>{let A="/tasks?project_id="+ft(i)+"&limit="+r+"&offset="+h+"&order=desc";return f&&(A+="&status="+ft(f)),S&&(A+="&executor="+ft(S)),N&&N.trim()&&(A+="&q="+ft(N.trim())),A},tasksByParent:(i,r)=>"/tasks?project_id="+ft(i)+"&parent_task_id="+ft(r),tasksCreate:"/tasks",task:i=>"/tasks/"+ft(i),taskAction:(i,r)=>"/tasks/"+ft(i)+"/"+r,taskFork:i=>"/tasks/"+ft(i)+"/fork",taskContinue:i=>"/tasks/"+ft(i)+"/continue",taskTrace:i=>"/tasks/"+ft(i)+"/trace",taskTraceStream:i=>"/tasks/"+ft(i)+"/trace/stream",taskAgents:i=>"/tasks/"+ft(i)+"/agents",taskReviews:i=>"/tasks/"+ft(i)+"/reviews",taskReviewFindings:(i,r)=>"/tasks/"+ft(i)+"/reviews/"+ft(r)+"/findings",taskApprovals:i=>"/tasks/"+ft(i)+"/approvals",taskApprovalDecision:(i,r,h)=>"/tasks/"+ft(i)+"/approvals/"+ft(r)+"/"+h,taskFollowups:i=>"/tasks/"+ft(i)+"/followups",taskChatHistory:i=>"/tasks/"+ft(i)+"/chat-history",taskMessages:i=>"/tasks/"+ft(i)+"/messages",taskMessagesTo:i=>"/tasks/"+ft(i)+"/messages",taskThread:i=>"/tasks/"+ft(i)+"/thread",taskThreads:i=>"/tasks/"+ft(i)+"/threads",taskThreadAction:(i,r)=>"/tasks/"+ft(i)+"/thread/"+r,taskCost:i=>"/tasks/"+ft(i)+"/cost",taskBrowserState:i=>"/tasks/"+ft(i)+"/browser/state",taskBrowserStream:i=>"/tasks/"+ft(i)+"/browser/stream",taskBrowserInput:i=>"/tasks/"+ft(i)+"/browser/input",taskBrowserControl:i=>"/tasks/"+ft(i)+"/browser/control",uploads:"/uploads",adminQuotas:"/admin/quotas",adminQuotaUser:i=>"/admin/quotas?user_id="+ft(i),adminSweep:"/admin/sweep",adminBackup:"/admin/backup"},Jy={exec:"命令",file:"文件",call:"调用",tool:"工具",message:"消息",reasoning:"思考",plan:"计划","agent-start":"子代理","agent-done":"子代理"},uu=["completed","failed","interrupted","merged","merge-failed"],Fy={queued:"排队中,尚未被 worker 认领",running:"运行中,模型回合进行中",completed:"模型回合结束、改动在 worktree 里尚未合并",failed:"模型回合失败,可重试",interrupted:"已被取消/中断,可重试",merged:"控制面已标记 merged,不代表 git 主分支已合入","merge-failed":"合并落盘失败,可重试"},Qh=["low","medium","high","xhigh","max"],Wy=["viewer","contributor","maintainer","owner"],go="codex-console-key";function sl(){try{return localStorage.getItem(go)||""}catch{return""}}function $y(i){localStorage.setItem(go,i)}function Iy(){localStorage.removeItem(go)}function Ne(i){return i?i.slice(0,8):""}function Ya(i){return i?new Date(i*1e3).toLocaleString():""}async function I(i,r="GET",h){const f={"Content-Type":"application/json"},S=sl();S&&(f["X-API-Key"]=S);const N={method:r,headers:f};h!==void 0&&(N.body=JSON.stringify(h));const A=await fetch(i,N);let p=null;try{p=await A.json()}catch{p=null}if(!A.ok){const H=p;let O=H&&H.error?H.error:"HTTP "+A.status;throw A.status===401&&(O+="(key 未填或无效)"),A.status===429&&(O+="(触发限流,稍后再试)"),A.status===402&&(H&&H.unpriced_token_cap!==void 0?O+="(无价 token 已满,联系管理员调整)":H&&H.error==="coordinator_quota_reserve_exceeded"?O="协调员分工预留不足:剩余美元配额不够覆盖全部分工,子任务费用记父任务创建人账,整个父任务已被挡下(未建任何子任务)":O+="(美元配额已满,联系管理员调整)"),new Error(O)}return p}async function Py(i){const r=new FormData;r.append("paths",JSON.stringify(i.map(S=>S.path))),i.forEach((S,N)=>r.append("file"+N,S.file));const h=await fetch(K.uploads,{method:"POST",headers:{"X-API-Key":sl()},body:r}),f=await h.json().catch(()=>({}));if(!h.ok)throw new Error(f&&f.error||"HTTP "+h.status);return f.upload_id}function tg(i,r,h){const f=[],S={},N=(A,p)=>{if(A)for(let H=0;HA.name),N(r,A=>A.webkitRelativePath||A.name),N(h,A=>A.name),f}function Jh(i){const r=Date.now()/1e3;let h=null;if(typeof i.last_seen=="number"?h=r-i.last_seen:typeof i.last_seen_seconds_ago=="number"&&(h=i.last_seen_seconds_ago),(h===null||h<0)&&(h=null),h===null)return{text:"未知",age:null};const f=Math.floor(h);return f<60?{text:f+" 秒前",age:h}:f<3600?{text:Math.floor(f/60)+" 分钟前",age:h}:{text:Math.floor(f/3600)+" 小时前",age:h}}function Mc(i){const r=i.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 oo(i){const r=i.message||"";return r.includes("forbidden")?"无全局管理员权限:服务端返回 403(CODEX_GLOBAL_ADMINS 未包含当前用户),请联系管理员":r.includes("user not found")?"找不到该用户:请核对用户 id 是否正确":"管理操作失败:"+r}function fo(i){return i==null?"不限额":"$"+(i/1e6).toFixed(2)}function vo(i){const r=Jy[i.kind||""]||i.kind||"?";let h="";return i.kind==="exec"?h=(i.command||"")+"(exit="+(i.exitCode??"")+","+(i.durationMs??"")+"ms,cwd="+(i.cwd||"")+")":i.kind==="file"?h=(i.path||"")+" "+(i.change||"")+" "+(i.status||""):i.kind==="message"?h=(i.phase?"["+i.phase+"] ":"")+(i.text||"")+(i.truncated?"(链路摘要已截断至 300 字,完整回复见右侧任务结果)":""):i.kind==="reasoning"?h=i.summary||"":i.kind==="tool"?h=(i.server||"")+"/"+(i.tool||"")+" "+(i.status||""):i.kind==="call"?h=i.name||"":i.kind==="plan"?h=i.text||"":i.kind==="agent-start"?h="开始:"+(i.name||"")+(i.prompt?"("+i.prompt+")":""):i.kind==="agent-done"?h="结束:"+(i.name||"")+" "+(i.status||""):h=JSON.stringify(i).slice(0,300),"["+r+"] "+h}function eg(){const[i,r]=d.useState(!!sl()),[h,f]=d.useState(sl()?"已保存到本浏览器(只用于调本站 API)":"未填 key,数据接口会返回 401"),[S,N]=d.useState("未加载"),[A,p]=d.useState("未加载"),[H,O]=d.useState("填 key 后判断权限…"),[Y,j]=d.useState(!1),[w,X]=d.useState(""),[V,at]=d.useState(""),[L,vt]=d.useState([]),[bt,zt]=d.useState(""),[J,Rt]=d.useState(""),[it,Q]=d.useState([]),[rt,Ut]=d.useState(null),[Qt,Nt]=d.useState("未加载"),[kt,B]=d.useState(""),[ot,st]=d.useState([]),[q,C]=d.useState(""),[lt,gt]=d.useState(""),[yt,ge]=d.useState([]),[we,Ce]=d.useState([]),[y,D]=d.useState([]),[ut,nt]=d.useState("先选项目"),[Tt,xt]=d.useState(""),[Ot,$]=d.useState(""),[dt,ce]=d.useState(""),[Ga,jl]=d.useState(""),[Le,le]=d.useState([]),[Yt,he]=d.useState(""),[Kl,pe]=d.useState(""),[fa,Ve]=d.useState(""),[zl,Rl]=d.useState(!1),[Tl,Be]=d.useState(""),[se,re]=d.useState(""),[rl,Jl]=d.useState([]),[da,Dl]=d.useState(!1),te=d.useRef("");te.current=bt;const Pe=d.useRef("");Pe.current=se;const qe=d.useCallback(async()=>{try{const M=await I(K.health);p("backend="+M.backend+" db_ok="+M.db_ok+" worker_ok="+M.worker_ok+" commit="+String(M.commit||"").slice(0,7))}catch(M){p("加载失败:"+M.message)}},[]),_l=d.useCallback(async()=>{if(!sl()){N("未填 key,配额不显示");return}try{const M=await I(K.quotaMe),Z=((M.used_usd_micros||0)/1e6).toFixed(2),et=M.quota_usd_micros===null||M.quota_usd_micros===void 0?"美元:本月用量 $"+Z+"(不限额)":"美元:本月用量 $"+Z+" / $"+((M.quota_usd_micros||0)/1e6).toFixed(2)+"(剩余 $"+((M.remaining_usd_micros||0)/1e6).toFixed(2)+")",Bt=M.unpriced_token_cap===void 0||M.unpriced_tokens_used===void 0?"无价 token:未返回(旧服务端)":"无价 token:"+M.unpriced_tokens_used+" / "+M.unpriced_token_cap+" tokens";N(et+" | "+Bt)}catch(M){N("配额加载失败:"+M.message)}},[]),ol=d.useCallback(async()=>{if(!sl()){O("未填 key,管理区不可用"),j(!1);return}try{const M=await fetch(K.adminQuotas,{headers:{"X-API-Key":sl()}});M.status===400?(O("已确认为全局管理员,管理操作可用"),j(!0)):M.status===403?(O("管理区仅全局管理员可用:当前 key 无全局管理员权限(服务端返回 403)"),j(!1)):M.status===401?(O("key 无效,管理区不可用(服务端返回 401)"),j(!1)):(O("管理权限判断失败(HTTP "+M.status+"),管理操作暂不可用"),j(!1))}catch(M){O("管理权限判断失败:"+M.message),j(!1)}},[]),Wt=d.useCallback(async()=>{try{const Z=(await I(K.projects)).projects||[];vt(Z),Rt(Z.length+" 个项目"),te.current&&Z.some(et=>et.id===te.current)}catch(M){Rt("加载失败:"+M.message)}},[]),Ul=d.useCallback(async()=>{try{const M=await I(K.githubRepos);Q(M.repos||[])}catch{}},[]),mn=d.useCallback(async()=>{try{const M=await I(K.relayModels);Jl(M.models||[]),Dl(!1)}catch{Dl(!0)}},[]),Qa=d.useCallback(async()=>{try{const M=await I(K.workers);if(!Array.isArray(M)&&M.workers===void 0&&M.workers_total!==void 0){Ut(null),Nt(M.workers_total?"在线 "+M.workers_online+" / 离线 "+M.workers_offline+"(共 "+M.workers_total+";完整 worker 清单仅全局管理员可见)":"无 worker 注册"),B("");return}const Z=Array.isArray(M)?M:M.workers||[];Ut(Z),Nt(Z.length?"":"无 worker 注册"),B("")}catch(M){B("加载失败:"+M.message)}},[]),Se=d.useCallback(async M=>{const Z=M!==void 0?M:te.current,et=Pe.current;if(!Z){le([]),he(""),re("");return}try{const Mt=(await I(K.environments(Z))).environments||[];le(Mt),he(Mt.length+" 个环境"),(et&&Mt.some(xe=>xe.id===et&&xe.status==="ready")||et&&Mt.some(xe=>xe.id===et))&&re(et);const be=L.find(xe=>xe.id===Z);be&&be.repo_url?(Ve("仓库:"+be.repo_url),Rl(!1)):be?(Ve("该项目未绑定仓库,环境无法创建——先选一个仓库保存"),Rl(!0)):(Ve(""),Rl(!1))}catch(Bt){pe("加载失败:"+Bt.message)}},[L]),Xa=d.useCallback(async M=>{const Z=M!==void 0?M:te.current;if(!Z){st([]);return}try{const et=await I(K.projectMembers(Z));st(et.members||[]),gt("")}catch(et){gt("成员加载失败:"+Mc(et))}},[]),ma=d.useCallback(async M=>{const Z=M!==void 0?M:te.current;if(!Z){ge([]),Ce([]),D([]),nt("先选项目");return}nt("");try{const et=await I(K.projectSkills(Z));ge(et.skills||[])}catch(et){xt("技能加载失败:"+et.message)}try{const et=await I(K.projectApps(Z));Ce(et.apps||[])}catch(et){xt("应用加载失败:"+et.message)}try{const et=await I(K.projectMcp(Z));D(et.servers||et.mcp_servers||[])}catch(et){xt("MCP 服务加载失败:"+et.message)}},[]),su=d.useCallback(M=>{if(!M.trim()){f("key 为空,未保存");return}$y(M.trim()),r(!0),f("已保存到本浏览器(只用于调本站 API)")},[]),ru=d.useCallback(()=>{Iy(),r(!1),f("未填 key,数据接口会返回 401"),ol()},[ol]),Fl=d.useCallback(async(M,Z)=>{if(!M.trim()){Rt("项目名必填");return}const et={name:M.trim()};Z.trim()&&(et.repo_url=Z.trim());try{await I(K.projects,"POST",et),Rt("项目已建"),await Wt()}catch(Bt){Rt("新建失败:"+Bt.message)}},[Wt]),Ae=d.useCallback(async(M,Z,et)=>{const Bt=te.current;if(!Bt){pe("先选项目");return}if(!M.trim()){pe("环境名必填");return}const Mt={project_id:Bt,name:M.trim()};Z.trim()&&(Mt.branch=Z.trim()),et&&(Mt.executor=et);try{await I(K.environmentsCreate,"POST",Mt),pe("环境已建,worker 准备中(creating → ready,失败会在列表里写原因)"),await Se(Bt)}catch(be){pe("新建失败:"+be.message)}},[Se]),fl=d.useCallback(async M=>{if(window.confirm("确定归档该环境吗?归档后新任务不能再选它,进行中的任务不受影响(有进行中任务在用它时归档会被拒绝)。"))try{await I(K.environmentArchive(M),"POST",{}),await Se()}catch(Z){pe("归档失败:"+Z.message)}},[Se]),Oe=d.useCallback(async M=>{const Z=te.current;if(!Z){Be("先选项目");return}if(!M){Be("先选一个仓库");return}try{await I(K.project(Z),"PATCH",{repo_url:M}),Be("仓库已保存,现在可以建环境了"),await Wt(),await Se(Z)}catch(et){Be("保存失败:"+et.message)}},[Wt,Se]),ou=d.useCallback(async(M,Z)=>{const et=te.current;if(!et){C("先选项目");return}if(!M.trim()){C("请填成员 user_id 或用户名");return}try{await I(K.projectMembers(et),"POST",{user_id:M.trim(),role:Z})}catch(Bt){if(Bt.message.includes("user not found"))try{await I(K.projectMembers(et),"POST",{username:M.trim(),role:Z})}catch(Mt){C(Mc(Mt));return}else{C(Mc(Bt));return}}C("已邀请成员"),await Xa(et)},[Xa]),fu=d.useCallback(async(M,Z)=>{const et=te.current;if(et)try{await I(K.projectMember(et,M),"PATCH",{role:Z}),st(Bt=>Bt.map(Mt=>Mt.user_id===M?{...Mt,role:Z}:Mt)),C("角色已改为 "+Z)}catch(Bt){C(Mc(Bt))}},[]),du=d.useCallback(async()=>{const M=te.current;if(!M){$("先选项目");return}try{await I(K.projectMcpReload(M),"POST",{}),$("配置已重载"),await ma(M)}catch(Z){$("重载失败:"+Z.message)}},[ma]),k=d.useCallback(async M=>{const Z=te.current;if(!Z){ce("先选项目");return}if(!M.trim()){ce("服务名不能为空");return}try{const et=await I(K.projectMcpOauth(Z,M.trim()),"POST",{}),Bt=et.url||et.auth_url||et.login_url||et.authorization_url||"",Mt=et.steps||et.instructions||"";let be=`登录尚未完成:请在浏览器打开下面的链接或按步骤完成,完成后回到本页刷新 MCP 状态。 `;Bt&&(be+=Bt+` `),Mt&&(be+=(Array.isArray(Mt)?Mt.join(` `):String(Mt))+` -`),be+=JSON.stringify(et,null,2).slice(0,4e3),jl(be),ce("已返回登录信息,见下方")}catch(et){ce("发起失败:"+et.message)}},[]),U=d.useCallback(async()=>{const M=L.trim();if(!M){K("请填要查配额的用户 id");return}try{const V=await I(Z.adminQuotaUser(M));K("用户 "+M.slice(0,8)+":本月用量 "+fo(V.used_usd_micros)+" / 配额 "+fo(V.quota_usd_micros)+(V.remaining_usd_micros!==null&&V.remaining_usd_micros!==void 0?"(剩余 "+fo(V.remaining_usd_micros)+")":"")+" | 月份 "+(V.month||""))}catch(V){K(oo(V))}},[L]),W=d.useCallback(async()=>{if(window.confirm("确定手动触发 sweep 吗?超阈值的陈旧 running 任务会被标为 interrupted。"))try{const V=(await I(Z.adminSweep,"POST",{})).swept||[];K("sweep 完成,清理 "+V.length+" 个任务"+(V.length?":"+V.join("、"):""))}catch(M){K(oo(M))}},[]),tt=d.useCallback(async()=>{try{const M=await I(Z.adminBackup,"POST",{});K("备份完成:backend="+M.backend+" | 路径 "+M.path+" | 大小 "+M.size_bytes+" 字节 | 任务 "+M.task_count+" 行")}catch(M){K(oo(M))}},[]);return{keySaved:i,keyState:h,quotaText:S,healthText:A,adminGate:H,adminBody:Y,adminResult:k,adminUserId:L,setAdminUserId:at,projects:X,projectId:bt,setProjectId:zt,projectMsg:J,githubRepos:it,workers:rt,workersSummary:Qt,workersError:kt,members:ot,memberMsg:q,memberError:lt,skills:yt,apps:we,mcpServers:y,skillMsg:ut,skillError:Tt,mcpMsg:Ot,mcpOauthMsg:dt,mcpOauthBox:Ga,envs:Le,envCount:Yt,envMsg:Kl,envRepoLine:fa,envRepoBar:zl,envRepoMsg:Tl,envSelect:se,setEnvSelect:re,models:rl,modelCustomVisible:da,refreshHealth:qe,loadQuota:_l,probeAdmin:ol,refreshProjects:Ft,loadGithubRepos:Ul,loadRelayModels:mn,refreshWorkers:Qa,refreshEnvs:Se,refreshMembers:Xa,refreshSkills:ma,saveKeyInput:su,clearKeyInput:ru,createProject:Fl,createEnv:Ae,archiveEnv:fl,saveEnvRepo:Oe,inviteMember:ou,changeMemberRole:fu,reloadMcp:du,mcpOauth:w,adminQuota:U,adminSweep:W,adminBackup:tt}}const mo=20;function lg(){const[i,r]=d.useState([]),[h,f]=d.useState(""),[S,N]=d.useState(""),[A,p]=d.useState(""),[H,O]=d.useState(""),[Y,j]=d.useState(0),[k,K]=d.useState(0),[L,at]=d.useState({}),X=d.useRef(0),vt=d.useRef({status:"",executor:"",q:""});vt.current={status:S,executor:A,q:H};const bt=d.useRef(""),zt=d.useCallback(async(ot,st,q)=>{const C=ot!==void 0?ot:st;if(!C){r([]),K(0),at({});return}bt.current=C;const lt=q!==void 0?q:X.current,gt=vt.current;try{const yt=await I(Z.tasksPage(C,mo,lt*mo,gt.status,gt.executor,gt.q));r(yt.tasks||[]),K(yt.total??(yt.tasks||[]).length),at(yt.status_counts||{}),f("")}catch(yt){f("加载失败:"+yt.message)}},[]),J=d.useCallback(ot=>{const st=Math.max(0,ot);X.current=st,j(st)},[]),Rt=d.useCallback(ot=>{J(ot),zt(bt.current||void 0,void 0,ot)},[zt,J]);d.useEffect(()=>{if(!bt.current)return;const ot=setTimeout(()=>{zt(bt.current,void 0,0)},300);return()=>clearTimeout(ot)},[S,A,H]);const it=d.useCallback(ot=>{N(ot),J(0)},[J]),Q=d.useCallback(ot=>{p(ot),J(0)},[J]),rt=d.useCallback(ot=>{O(ot),J(0)},[J]),Ut=d.useCallback(async ot=>{J(0),await zt(ot,void 0,0)},[zt,J]),Qt=Math.max(1,Math.ceil(k/mo)),Nt=k===0?"共 0 个任务":"共 "+k+" 个任务,第 "+(Y+1)+" / "+Qt+" 页",kt=i,B=d.useCallback(async(ot,st)=>{const q={...ot};st.length&&(q.upload_id=await Py(st));const C=await I(Z.tasksCreate,"POST",q);return"任务已建:"+Ne(C.id)},[]);return{tasks:i,taskError:h,statusFilter:S,setStatusFilter:it,executorFilter:A,setExecutorFilter:Q,searchText:H,setSearchText:rt,filteredTasks:kt,taskCountText:Nt,refreshTasks:zt,refreshTasksFirstPage:Ut,page:Y,totalPages:Qt,taskTotal:k,taskStatusCounts:L,goToPage:Rt,dispatch:B}}function ag(i,r){const[h,f]=d.useState(null),[S,N]=d.useState(""),[A,p]=d.useState(""),[H,O]=d.useState(""),[Y,j]=d.useState(""),[k,K]=d.useState(void 0),[L,at]=d.useState(!1),[X,vt]=d.useState(""),[bt,zt]=d.useState([]),[J,Rt]=d.useState([]),[it,Q]=d.useState(""),[rt,Ut]=d.useState([]),[Qt,Nt]=d.useState(""),[kt,B]=d.useState(""),[ot,st]=d.useState([]),[q,C]=d.useState(""),[lt,gt]=d.useState(""),[yt,ge]=d.useState(""),[we,Ce]=d.useState(""),[y,D]=d.useState([]),[ut,nt]=d.useState([]),[Tt,xt]=d.useState(""),[Ot,$]=d.useState([]),[dt,ce]=d.useState(""),[Ga,jl]=d.useState(""),[Le,le]=d.useState(""),[Yt,he]=d.useState(""),[Kl,pe]=d.useState([]),[fa,Ve]=d.useState(""),[zl,Rl]=d.useState(null),Tl=d.useRef(null),Be=d.useRef(null),se=d.useRef(null);se.current=h;const re=d.useCallback(()=>{if(Tl.current){try{Tl.current.abort()}catch{}Tl.current=null}Be.current&&(clearTimeout(Be.current),Be.current=null)},[]),rl=d.useCallback(async w=>{try{const U=await I(Z.taskAgents(w));Rt(U.agents||[]),Q(U.note||"")}catch(U){Rt([]),Q("子代理链路加载失败:"+U.message)}},[]),Jl=d.useCallback(w=>{Be.current&&clearTimeout(Be.current),Be.current=setTimeout(()=>void rl(w),1e3)},[rl]),da=d.useCallback(async w=>{if(!w.coordinator_parts){zt([]);return}try{const U=await I(Z.tasksByParent(w.project_id||"",w.id));zt(U.tasks||[])}catch{zt([])}},[]),Dl=d.useCallback(async w=>{try{const U=await I(Z.taskCost(w));K(U)}catch{K(null)}},[]),te=d.useCallback(async w=>{try{const U=await I(Z.taskFollowups(w));D(U.followups||[])}catch{D([])}},[]),Pe=d.useCallback(async w=>{try{const U=await I(Z.taskChatHistory(w));Rl(U)}catch{Rl(null)}},[]),qe=d.useCallback(async w=>{var W;const U=w||((W=se.current)==null?void 0:W.id);if(U)try{const tt=await I(Z.taskReviews(U));Ut(tt.reviews||[]),B("")}catch(tt){B("评审队列加载失败:"+tt.message)}},[]),_l=d.useCallback(async w=>{var W;const U=w||((W=se.current)==null?void 0:W.id);if(U)try{const tt=await I(Z.taskApprovals(U));nt(tt.approvals||[])}catch(tt){xt("审批队列加载失败:"+tt.message)}},[]),ol=d.useCallback(async w=>{try{const U=await I(Z.taskMessages(w));$(U.messages||[])}catch{$([])}},[]),Ft=d.useCallback(async w=>{try{const U=await I(Z.taskThread(w)),W=U.thread||U;let tt=W.turns;tt==null&&(tt=W.turn_count),tt==null&&(tt=W.turns_count),jl("id "+(W.id||w)+" | 名字 "+(W.name||W.thread_name||"")+" | 归档 "+(W.archived===void 0||W.archived===null?"":W.archived?"是":"否")+" | cwd "+(W.cwd||"")+(tt!=null?" | turn 数 "+tt:""))}catch(U){jl("线程加载失败:"+U.message)}},[]),Ul=d.useCallback(async w=>{try{const U=await I(Z.taskThreads(w));pe(U.threads||[])}catch{pe([])}},[]),mn=d.useCallback(w=>{const U=["completed","failed","interrupted"].includes(w);le(U?"终态任务,线程操作可用":"仅终态任务可操作线程,当前状态 "+w+",按钮已置灰")},[]),Qa=d.useCallback(async(w,U)=>{if(re(),st([]),C(""),gt(""),uu.includes(U)){try{const Mt=await I(Z.taskTrace(w));st(Mt.entries||[]),C(Mt.note||""),gt(Mt.status||"")}catch(Mt){C("链路加载失败:"+Mt.message)}return}const W=new AbortController;Tl.current=W;let tt=[];const M={};let V="",et=!1,Bt="";try{const Mt={},be=sl();be&&(Mt["X-API-Key"]=be);const xe=await fetch(Z.taskTraceStream(w),{headers:Mt,signal:W.signal});if(!xe.ok){let Wl="HTTP "+xe.status;try{const Hl=await xe.json();Hl&&Hl.error&&(Wl=Hl.error)}catch{}throw xe.status===401&&(Wl+="(key 未填或无效)"),new Error(Wl)}const Dc=xe.body.getReader(),ci=new TextDecoder;let hn="";for(;;){const Wl=await Dc.read();if(Wl.done)break;hn+=ci.decode(Wl.value,{stream:!0});const Hl=hn.split(` +`),be+=JSON.stringify(et,null,2).slice(0,4e3),jl(be),ce("已返回登录信息,见下方")}catch(et){ce("发起失败:"+et.message)}},[]),U=d.useCallback(async()=>{const M=V.trim();if(!M){X("请填要查配额的用户 id");return}try{const Z=await I(K.adminQuotaUser(M));X("用户 "+M.slice(0,8)+":本月用量 "+fo(Z.used_usd_micros)+" / 配额 "+fo(Z.quota_usd_micros)+(Z.remaining_usd_micros!==null&&Z.remaining_usd_micros!==void 0?"(剩余 "+fo(Z.remaining_usd_micros)+")":"")+" | 月份 "+(Z.month||""))}catch(Z){X(oo(Z))}},[V]),W=d.useCallback(async()=>{if(window.confirm("确定手动触发 sweep 吗?超阈值的陈旧 running 任务会被标为 interrupted。"))try{const Z=(await I(K.adminSweep,"POST",{})).swept||[];X("sweep 完成,清理 "+Z.length+" 个任务"+(Z.length?":"+Z.join("、"):""))}catch(M){X(oo(M))}},[]),tt=d.useCallback(async()=>{try{const M=await I(K.adminBackup,"POST",{});X("备份完成:backend="+M.backend+" | 路径 "+M.path+" | 大小 "+M.size_bytes+" 字节 | 任务 "+M.task_count+" 行")}catch(M){X(oo(M))}},[]);return{keySaved:i,keyState:h,quotaText:S,healthText:A,adminGate:H,adminBody:Y,adminResult:w,adminUserId:V,setAdminUserId:at,projects:L,projectId:bt,setProjectId:zt,projectMsg:J,githubRepos:it,workers:rt,workersSummary:Qt,workersError:kt,members:ot,memberMsg:q,memberError:lt,skills:yt,apps:we,mcpServers:y,skillMsg:ut,skillError:Tt,mcpMsg:Ot,mcpOauthMsg:dt,mcpOauthBox:Ga,envs:Le,envCount:Yt,envMsg:Kl,envRepoLine:fa,envRepoBar:zl,envRepoMsg:Tl,envSelect:se,setEnvSelect:re,models:rl,modelCustomVisible:da,refreshHealth:qe,loadQuota:_l,probeAdmin:ol,refreshProjects:Wt,loadGithubRepos:Ul,loadRelayModels:mn,refreshWorkers:Qa,refreshEnvs:Se,refreshMembers:Xa,refreshSkills:ma,saveKeyInput:su,clearKeyInput:ru,createProject:Fl,createEnv:Ae,archiveEnv:fl,saveEnvRepo:Oe,inviteMember:ou,changeMemberRole:fu,reloadMcp:du,mcpOauth:k,adminQuota:U,adminSweep:W,adminBackup:tt}}const mo=20;function lg(){const[i,r]=d.useState([]),[h,f]=d.useState(""),[S,N]=d.useState(""),[A,p]=d.useState(""),[H,O]=d.useState(""),[Y,j]=d.useState(0),[w,X]=d.useState(0),[V,at]=d.useState({}),L=d.useRef(0),vt=d.useRef({status:"",executor:"",q:""});vt.current={status:S,executor:A,q:H};const bt=d.useRef(""),zt=d.useCallback(async(ot,st,q)=>{const C=ot!==void 0?ot:st;if(!C){r([]),X(0),at({});return}bt.current=C;const lt=q!==void 0?q:L.current,gt=vt.current;try{const yt=await I(K.tasksPage(C,mo,lt*mo,gt.status,gt.executor,gt.q));r(yt.tasks||[]),X(yt.total??(yt.tasks||[]).length),at(yt.status_counts||{}),f("")}catch(yt){f("加载失败:"+yt.message)}},[]),J=d.useCallback(ot=>{const st=Math.max(0,ot);L.current=st,j(st)},[]),Rt=d.useCallback(ot=>{J(ot),zt(bt.current||void 0,void 0,ot)},[zt,J]);d.useEffect(()=>{if(!bt.current)return;const ot=setTimeout(()=>{zt(bt.current,void 0,0)},300);return()=>clearTimeout(ot)},[S,A,H]);const it=d.useCallback(ot=>{N(ot),J(0)},[J]),Q=d.useCallback(ot=>{p(ot),J(0)},[J]),rt=d.useCallback(ot=>{O(ot),J(0)},[J]),Ut=d.useCallback(async ot=>{J(0),await zt(ot,void 0,0)},[zt,J]),Qt=Math.max(1,Math.ceil(w/mo)),Nt=w===0?"共 0 个任务":"共 "+w+" 个任务,第 "+(Y+1)+" / "+Qt+" 页",kt=i,B=d.useCallback(async(ot,st)=>{const q={...ot};st.length&&(q.upload_id=await Py(st));const C=await I(K.tasksCreate,"POST",q);return"任务已建:"+Ne(C.id)},[]);return{tasks:i,taskError:h,statusFilter:S,setStatusFilter:it,executorFilter:A,setExecutorFilter:Q,searchText:H,setSearchText:rt,filteredTasks:kt,taskCountText:Nt,refreshTasks:zt,refreshTasksFirstPage:Ut,page:Y,totalPages:Qt,taskTotal:w,taskStatusCounts:V,goToPage:Rt,dispatch:B}}function ag(i,r){const[h,f]=d.useState(null),[S,N]=d.useState(""),[A,p]=d.useState(""),[H,O]=d.useState(""),[Y,j]=d.useState(""),[w,X]=d.useState(void 0),[V,at]=d.useState(!1),[L,vt]=d.useState(""),[bt,zt]=d.useState([]),[J,Rt]=d.useState([]),[it,Q]=d.useState(""),[rt,Ut]=d.useState([]),[Qt,Nt]=d.useState(""),[kt,B]=d.useState(""),[ot,st]=d.useState([]),[q,C]=d.useState(""),[lt,gt]=d.useState(""),[yt,ge]=d.useState(""),[we,Ce]=d.useState(""),[y,D]=d.useState([]),[ut,nt]=d.useState([]),[Tt,xt]=d.useState(""),[Ot,$]=d.useState([]),[dt,ce]=d.useState(""),[Ga,jl]=d.useState(""),[Le,le]=d.useState(""),[Yt,he]=d.useState(""),[Kl,pe]=d.useState([]),[fa,Ve]=d.useState(""),[zl,Rl]=d.useState(null),Tl=d.useRef(null),Be=d.useRef(null),se=d.useRef(null);se.current=h;const re=d.useCallback(()=>{if(Tl.current){try{Tl.current.abort()}catch{}Tl.current=null}Be.current&&(clearTimeout(Be.current),Be.current=null)},[]),rl=d.useCallback(async k=>{try{const U=await I(K.taskAgents(k));Rt(U.agents||[]),Q(U.note||"")}catch(U){Rt([]),Q("子代理链路加载失败:"+U.message)}},[]),Jl=d.useCallback(k=>{Be.current&&clearTimeout(Be.current),Be.current=setTimeout(()=>void rl(k),1e3)},[rl]),da=d.useCallback(async k=>{if(!k.coordinator_parts){zt([]);return}try{const U=await I(K.tasksByParent(k.project_id||"",k.id));zt(U.tasks||[])}catch{zt([])}},[]),Dl=d.useCallback(async k=>{try{const U=await I(K.taskCost(k));X(U)}catch{X(null)}},[]),te=d.useCallback(async k=>{try{const U=await I(K.taskFollowups(k));D(U.followups||[])}catch{D([])}},[]),Pe=d.useCallback(async k=>{try{const U=await I(K.taskChatHistory(k));Rl(U)}catch{Rl(null)}},[]),qe=d.useCallback(async k=>{var W;const U=k||((W=se.current)==null?void 0:W.id);if(U)try{const tt=await I(K.taskReviews(U));Ut(tt.reviews||[]),B("")}catch(tt){B("评审队列加载失败:"+tt.message)}},[]),_l=d.useCallback(async k=>{var W;const U=k||((W=se.current)==null?void 0:W.id);if(U)try{const tt=await I(K.taskApprovals(U));nt(tt.approvals||[])}catch(tt){xt("审批队列加载失败:"+tt.message)}},[]),ol=d.useCallback(async k=>{try{const U=await I(K.taskMessages(k));$(U.messages||[])}catch{$([])}},[]),Wt=d.useCallback(async k=>{try{const U=await I(K.taskThread(k)),W=U.thread||U;let tt=W.turns;tt==null&&(tt=W.turn_count),tt==null&&(tt=W.turns_count),jl("id "+(W.id||k)+" | 名字 "+(W.name||W.thread_name||"")+" | 归档 "+(W.archived===void 0||W.archived===null?"":W.archived?"是":"否")+" | cwd "+(W.cwd||"")+(tt!=null?" | turn 数 "+tt:""))}catch(U){jl("线程加载失败:"+U.message)}},[]),Ul=d.useCallback(async k=>{try{const U=await I(K.taskThreads(k));pe(U.threads||[])}catch{pe([])}},[]),mn=d.useCallback(k=>{const U=["completed","failed","interrupted"].includes(k);le(U?"终态任务,线程操作可用":"仅终态任务可操作线程,当前状态 "+k+",按钮已置灰")},[]),Qa=d.useCallback(async(k,U)=>{if(re(),st([]),C(""),gt(""),uu.includes(U)){try{const Mt=await I(K.taskTrace(k));st(Mt.entries||[]),C(Mt.note||""),gt(Mt.status||"")}catch(Mt){C("链路加载失败:"+Mt.message)}return}const W=new AbortController;Tl.current=W;let tt=[];const M={};let Z="",et=!1,Bt="";try{const Mt={},be=sl();be&&(Mt["X-API-Key"]=be);const xe=await fetch(K.taskTraceStream(k),{headers:Mt,signal:W.signal});if(!xe.ok){let Wl="HTTP "+xe.status;try{const Hl=await xe.json();Hl&&Hl.error&&(Wl=Hl.error)}catch{}throw xe.status===401&&(Wl+="(key 未填或无效)"),new Error(Wl)}const Dc=xe.body.getReader(),ci=new TextDecoder;let hn="";for(;;){const Wl=await Dc.read();if(Wl.done)break;hn+=ci.decode(Wl.value,{stream:!0});const Hl=hn.split(` `);hn=Hl.pop()||"";for(const mu of Hl){const hu=mu.split(` `).filter(Ze=>Ze.indexOf("data: ")===0).map(Ze=>Ze.slice(6)).join(` -`);if(hu)try{const Ze=JSON.parse(hu);if(Ze.type==="snapshot")tt=Ze.entries||[],Object.keys(M).forEach(ae=>delete M[ae]),tt.forEach((ae,ve)=>{ae.id&&(M[ae.id]=ve)}),V=Ze.note||"",st([...tt]),C(V),Jl(w);else if(Ze.type==="entry"){const ae=Ze.entry;ae.id&&ae.id in M?tt[M[ae.id]]=ae:(ae.id&&(M[ae.id]=tt.length),tt.push(ae)),st([...tt]),Jl(w)}else Ze.type==="done"&&(et=!0,Bt=Ze.status,gt(Bt))}catch{}}if(et)break}}catch(Mt){if(Mt&&Mt.name==="AbortError")return;C("链路流中断:"+Mt.message);return}et&&r()},[re,Jl,r]),Se=d.useCallback(async w=>{re();try{const U=await I(Z.task(w));f(U);let W="";U.result_text&&(W+=`=== result === +`);if(hu)try{const Ze=JSON.parse(hu);if(Ze.type==="snapshot")tt=Ze.entries||[],Object.keys(M).forEach(ae=>delete M[ae]),tt.forEach((ae,ve)=>{ae.id&&(M[ae.id]=ve)}),Z=Ze.note||"",st([...tt]),C(Z),Jl(k);else if(Ze.type==="entry"){const ae=Ze.entry;ae.id&&ae.id in M?tt[M[ae.id]]=ae:(ae.id&&(M[ae.id]=tt.length),tt.push(ae)),st([...tt]),Jl(k)}else Ze.type==="done"&&(et=!0,Bt=Ze.status,gt(Bt))}catch{}}if(et)break}}catch(Mt){if(Mt&&Mt.name==="AbortError")return;C("链路流中断:"+Mt.message);return}et&&r()},[re,Jl,r]),Se=d.useCallback(async k=>{re();try{const U=await I(K.task(k));f(U);let W="";U.result_text&&(W+=`=== result === `+U.result_text.slice(0,8e3)+` `),U.error_text&&(W+=`=== error === `+U.error_text.slice(0,8e3)+` -`),W||(W="(暂无 result/error 输出)"),N(W),j(""),K(void 0),Dl(w),at(!1),vt(""),ce(""),he(""),mn(U.status);const tt=i(U.project_id),M=tt==="maintainer"||tt==="owner",V=tt==="contributor"||M,et=uu.includes(U.status),Bt=[];["failed","interrupted","merge-failed"].includes(U.status)&&M||Bt.push("重试:不可用——仅 failed/interrupted/merge-failed 可重试"+(M?"":",且仅 maintainer 可重试")),!et&&V||Bt.push("取消:不可用——"+(et?"终态任务不可取消":"仅项目成员(contributor 及以上)可取消")),U.status==="completed"&&M||Bt.push("合并:不可用——仅 completed 可合并"+(M?"":",且仅 maintainer 可合并")),U.status==="merged"&&M||Bt.push("提 PR:不可用——仅 merged 可提 PR"+(M?"":",且仅 maintainer 可提 PR")),O(Bt.join(";")),p(""),Qa(w,U.status),rl(w),da(U),Pe(w),te(w),ol(w),Ft(w),Ul(w),qe(w),_l(w)}catch(U){f(null),N("加载失败:"+U.message)}},[re,Qa,rl,da,Pe,te,ol,Ft,Ul,qe,_l,Dl,i]),Xa=d.useCallback(async()=>{const w=se.current;if(w){try{const U=await I(Z.task(w.id));f(U);let W="";U.result_text&&(W+=`=== result === +`),W||(W="(暂无 result/error 输出)"),N(W),j(""),X(void 0),Dl(k),at(!1),vt(""),ce(""),he(""),mn(U.status);const tt=i(U.project_id),M=tt==="maintainer"||tt==="owner",Z=tt==="contributor"||M,et=uu.includes(U.status),Bt=[];["failed","interrupted","merge-failed"].includes(U.status)&&M||Bt.push("重试:不可用——仅 failed/interrupted/merge-failed 可重试"+(M?"":",且仅 maintainer 可重试")),!et&&Z||Bt.push("取消:不可用——"+(et?"终态任务不可取消":"仅项目成员(contributor 及以上)可取消")),U.status==="completed"&&M||Bt.push("合并:不可用——仅 completed 可合并"+(M?"":",且仅 maintainer 可合并")),U.status==="merged"&&M||Bt.push("提 PR:不可用——仅 merged 可提 PR"+(M?"":",且仅 maintainer 可提 PR")),O(Bt.join(";")),p(""),Qa(k,U.status),rl(k),da(U),Pe(k),te(k),ol(k),Wt(k),Ul(k),qe(k),_l(k)}catch(U){f(null),N("加载失败:"+U.message)}},[re,Qa,rl,da,Pe,te,ol,Wt,Ul,qe,_l,Dl,i]),Xa=d.useCallback(async()=>{const k=se.current;if(k){try{const U=await I(K.task(k.id));f(U);let W="";U.result_text&&(W+=`=== result === `+U.result_text.slice(0,8e3)+` `),U.error_text&&(W+=`=== error === `+U.error_text.slice(0,8e3)+` -`),N(W||"(暂无 result/error 输出)")}catch{}te(w.id),Pe(w.id),qe(w.id),_l(w.id),da(w),rl(w.id),ol(w.id),Ft(w.id),Ul(w.id),Dl(w.id)}},[te,Pe,qe,_l,da,rl,ol,Ft,Ul,Dl]),ma=d.useCallback(async w=>{const U=se.current;if(!U)return;const W={cancel:"确定取消该任务吗?",merge:"确定把 completed 任务标为 merged 吗?",pr:"确定为该任务提 PR 吗?(会在仓库真实建 PR)"};if(!(W[w]&&!window.confirm(W[w])))try{const tt=await I(Z.taskAction(U.id,w),"POST",{});p(w+" 已提交:"+JSON.stringify(tt).slice(0,300)),r(),await Se(U.id)}catch(tt){p(w+" 失败:"+tt.message)}},[Se,r]),su=d.useCallback(async()=>{const w=se.current;if(w)try{const U=await I(Z.taskCost(w.id));j(JSON.stringify(U,null,2).slice(0,4e3))}catch(U){j("查成本失败:"+U.message)}},[]),ru=d.useCallback(async w=>{const U=se.current;if(U){if(!w.trim()){vt("分支消息必填");return}if(!uu.includes(U.status)){vt("仅终态任务可分支");return}try{const W=await I(Z.taskFork(U.id),"POST",{message:w.trim()});vt("分支任务已建:"+W.id.slice(0,8)),r()}catch(W){vt("分支失败:"+W.message)}}},[r]),Fl=d.useCallback(async w=>{const U=se.current;if(U)try{await I(Z.taskReviews(U.id),"POST",w),Nt("评审已登记(requested)"),await qe(U.id)}catch(W){Nt("登记评审需求失败:"+W.message)}},[qe]),Ae=d.useCallback(w=>{const U=se.current;if(!U)return;const W=window.prompt("输入该条评审的 findings(将写回记录并标为 completed):");W!==null&&I(Z.taskReviewFindings(U.id,w),"POST",{findings:W}).then(()=>void qe(U.id)).catch(tt=>Nt("写 findings 失败:"+tt.message))},[qe]),fl=d.useCallback((w,U)=>{const W=se.current;if(!W)return;const tt=U==="approved"?"approve":"deny";I(Z.taskApprovalDecision(W.id,w,tt),"POST",{}).then(()=>{xt("已记录"+(U==="approved"?"允许":"拒绝")+"(当前版本只留回执,不拦截实时行为)"),_l(W.id)}).catch(M=>xt("决定失败:"+M.message))},[_l]),Oe=d.useCallback(async(w,U,W)=>{const tt=se.current;if(tt){if(!U.trim()){ce("目标任务 id 不能为空");return}if(!W.trim()){ce("消息正文不能为空");return}try{const M=await I(Z.taskMessagesTo(U.trim()),"POST",{from_task_id:tt.id,body:W.trim(),mode:w});ce("已发送("+M.delivery+")"),await ol(tt.id)}catch(M){ce("发送失败:"+M.message)}}},[ol]),ou=d.useCallback((w,U)=>{const W=se.current;if(!W)return;if(!["completed","failed","interrupted"].includes(W.status)){he("仅 completed/failed/interrupted 任务可操作线程(merged/merge-failed 不可改,服务端同样 409)");return}const tt={};if(w==="rename"){if(!U.trim()){he("新线程名不能为空");return}tt.name=U.trim()}I(Z.taskThreadAction(W.id,w),"POST",tt).then(M=>{he(w+" 已提交:"+JSON.stringify(M).slice(0,300)),Ft(W.id),Ul(W.id)}).catch(M=>he(w+" 失败:"+M.message))},[Ft,Ul]),fu=d.useCallback(async w=>{const U=se.current;if(!U)return;const W=w.trim();if(!W){Ve("消息不能为空");return}try{uu.includes(U.status)&&U.status!=="merged"?(await I(Z.taskContinue(U.id),"POST",{message:W}),Ve("已重新排队,同一会话继续"),r(),await Se(U.id)):["queued","running"].includes(U.status)?(await I(Z.taskFollowups(U.id),"POST",{body:W,mode:"direct"}),Ve("已直接发送"),await te(U.id),await Pe(U.id)):Ve("merged/merge-failed 任务不可继续,也不可发后续消息")}catch(tt){Ve("发送失败:"+tt.message)}},[Se,r,te,Pe]),du=d.useCallback(async()=>{const w=se.current;if(!w){Ce("先选一个任务");return}try{const U=await I(Z.taskTrace(w.id)),W=new Blob([JSON.stringify({task_id:w.id,status:U.status,note:U.note||"",count:(U.entries||[]).length,entries:U.entries||[]},null,2)],{type:"application/json"}),tt=document.createElement("a");tt.href=URL.createObjectURL(W),tt.download="trace-"+w.id.slice(0,8)+".json",document.body.appendChild(tt),tt.click(),tt.remove(),setTimeout(()=>URL.revokeObjectURL(tt.href),1e3),Ce("已下载完整链路 "+(U.entries||[]).length+" 条")}catch(U){Ce("下载失败:"+U.message)}},[]);return d.useEffect(()=>()=>re(),[re]),{currentTask:h,detailBody:S,actionMsg:A,actionReasons:H,costBox:Y,costSummary:k,forkVisible:L,setForkVisible:at,forkMsg:X,coordChildren:bt,agents:J,agentsNote:it,reviews:rt,reviewMsg:Qt,reviewError:kt,traceEntries:ot,traceNote:q,traceDone:lt,traceKind:yt,setTraceKind:ge,traceMsg:we,followups:y,approvals:ut,approvalMsg:Tt,peerMessages:Ot,peerMsg:dt,threadText:Ga,threadGateNote:Le,threadMsg:Yt,threadList:Kl,chatMsg:fa,chatHistory:zl,showDetail:Se,refreshDetailLists:Xa,doAction:ma,taskCost:su,forkTask:ru,postReview:Fl,submitFindings:Ae,decideApproval:fl,postPeer:Oe,threadAction:ou,sendChatMessage:fu,downloadTrace:du,refreshReviews:()=>void qe(),refreshApprovals:()=>void _l()}}function ng(i){const[r,h]=d.useState([]),[f,S]=d.useState(""),[N,A]=d.useState(null),[p,H]=d.useState(""),O=d.useCallback(async K=>{const L=K!==void 0?K:i();if(!L){h([]);return}try{const at=await I(Z.projectAutomations(L));h(at.automations||[])}catch(at){S("自动化加载失败:"+at.message)}},[i]),Y=d.useCallback(async(K,L,at,X)=>{const vt=i();if(!vt){S("先选项目");return}if(!K.trim()){S("自动化名称必填");return}if(!L.trim()){S("定时任务内容必填");return}const bt={name:K.trim(),prompt:L.trim()};at.trim()&&(bt.interval_seconds=parseInt(at.trim(),10)),X.trim()&&(bt.repo_url=X.trim());try{await I(Z.projectAutomations(vt),"POST",bt),S("自动化已创建(登记定义,到期后由执行器认领)"),await O(vt)}catch(zt){S("创建失败:"+zt.message)}},[i,O]),j=d.useCallback(K=>{const L=i();L&&I(Z.projectAutomationCancel(L,K),"POST",{}).then(()=>{S("自动化已取消"),O(L)}).catch(at=>S("取消失败:"+at.message))},[i,O]),k=d.useCallback(async K=>{const L=K!==void 0?K:i();if(!L){A(null);return}try{const at=await I(Z.projectTriage(L));A(at),H("")}catch(at){H("分诊加载失败:"+at.message)}},[i]);return{automations:r,autoMsg:f,triage:N,triageError:p,refreshAutomations:O,createAutomation:Y,cancelAutomation:j,refreshTriage:k}}function ug(i,r){const h=d.useRef(i);h.current=i,d.useEffect(()=>{const f=setInterval(()=>{const S=document.activeElement;h.current(S?S.tagName==="SELECT":!1)},r);return()=>clearInterval(f)},[r])}function ig(i,r){const h=d.useRef(i);h.current=i,d.useEffect(()=>{const f=setInterval(()=>h.current(),r);return()=>clearInterval(f)},[r])}function cg(i){const r=h=>String(h).padStart(2,"0");return r(i.getHours())+":"+r(i.getMinutes())+":"+r(i.getSeconds())}function sg(){var at;const i=eg(),r=lg(),h=d.useRef("");h.current=i.projectId;const f=d.useCallback(()=>h.current,[]),S=ng(f),N=d.useCallback(X=>{const vt=i.projects.find(bt=>bt.id===X);return vt&&vt.my_role||null},[i.projects]),A=d.useCallback(()=>{r.refreshTasks(void 0,h.current)},[r]),p=ag(N,A),[H,O]=d.useState("--:--:--"),Y=d.useCallback(X=>{i.setProjectId(X),h.current=X,r.refreshTasksFirstPage(X),i.refreshEnvs(X),i.refreshMembers(X),i.refreshSkills(X),S.refreshAutomations(X),S.refreshTriage(X)},[i,r,S]),j=(at=i.projects[0])==null?void 0:at.id;d.useEffect(()=>{!i.projectId&&j&&Y(j)},[i.projectId,j,Y]);const k=d.useCallback(X=>{i.saveKeyInput(X),X.trim()&&(i.refreshHealth(),i.refreshProjects(),i.refreshWorkers(),h.current&&(r.refreshTasks(h.current),i.refreshEnvs(h.current),i.refreshMembers(h.current)),i.loadRelayModels(),i.loadQuota(),i.loadGithubRepos(),i.probeAdmin())},[i,r]),K=d.useCallback(X=>{if(O(cg(new Date)),!sl()){i.refreshHealth();return}r.refreshTasks(void 0,h.current),i.refreshHealth(),i.loadQuota(),i.refreshWorkers(),i.refreshMembers(),i.refreshSkills(),S.refreshAutomations(),S.refreshTriage(),p.refreshDetailLists(),X||(i.refreshProjects(),i.refreshEnvs())},[i,r,S,p]),L=d.useCallback(()=>{sl()&&(i.loadRelayModels(),i.loadGithubRepos())},[i]);return d.useEffect(()=>{i.refreshHealth(),i.refreshProjects(),i.refreshWorkers(),i.loadQuota(),i.loadGithubRepos(),sl()&&i.loadRelayModels(),i.probeAdmin()},[]),{keySaved:i.keySaved,keyState:i.keyState,saveKeyInput:k,clearKeyInput:i.clearKeyInput,quotaText:i.quotaText,healthText:i.healthText,refreshHealth:i.refreshHealth,adminGate:i.adminGate,adminBody:i.adminBody,adminResult:i.adminResult,adminUserId:i.adminUserId,setAdminUserId:i.setAdminUserId,adminQuota:i.adminQuota,adminSweep:i.adminSweep,adminBackup:i.adminBackup,projects:i.projects,projectId:i.projectId,projectMsg:i.projectMsg,selectProject:Y,refreshProjects:i.refreshProjects,createProject:i.createProject,githubRepos:i.githubRepos,workers:i.workers,workersSummary:i.workersSummary,workersError:i.workersError,refreshWorkers:i.refreshWorkers,members:i.members,memberMsg:i.memberMsg,memberError:i.memberError,refreshMembers:()=>void i.refreshMembers(),inviteMember:i.inviteMember,changeMemberRole:i.changeMemberRole,skills:i.skills,apps:i.apps,mcpServers:i.mcpServers,skillMsg:i.skillMsg,skillError:i.skillError,mcpMsg:i.mcpMsg,mcpOauthMsg:i.mcpOauthMsg,mcpOauthBox:i.mcpOauthBox,refreshSkills:()=>void i.refreshSkills(),reloadMcp:i.reloadMcp,mcpOauth:i.mcpOauth,envs:i.envs,envCount:i.envCount,envMsg:i.envMsg,envRepoLine:i.envRepoLine,envRepoBar:i.envRepoBar,envRepoMsg:i.envRepoMsg,envSelect:i.envSelect,setEnvSelect:i.setEnvSelect,refreshEnvs:()=>void i.refreshEnvs(),createEnv:i.createEnv,archiveEnv:i.archiveEnv,saveEnvRepo:i.saveEnvRepo,models:i.models,modelCustomVisible:i.modelCustomVisible,tasks:r.tasks,taskCountText:r.taskCountText,taskError:r.taskError,refreshTasks:()=>void r.refreshTasks(void 0,h.current),statusFilter:r.statusFilter,setStatusFilter:r.setStatusFilter,executorFilter:r.executorFilter,setExecutorFilter:r.setExecutorFilter,searchText:r.searchText,setSearchText:r.setSearchText,filteredTasks:r.filteredTasks,taskPage:r.page,taskTotalPages:r.totalPages,taskTotal:r.taskTotal,taskStatusCounts:r.taskStatusCounts,goToTaskPage:r.goToPage,currentTask:p.currentTask,detailBody:p.detailBody,actionMsg:p.actionMsg,actionReasons:p.actionReasons,showDetail:X=>void p.showDetail(X),doAction:p.doAction,taskCost:p.taskCost,costBox:p.costBox,costSummary:p.costSummary,forkVisible:p.forkVisible,setForkVisible:p.setForkVisible,forkTask:p.forkTask,forkMsg:p.forkMsg,coordChildren:p.coordChildren,coordText:"",agents:p.agents,agentsNote:p.agentsNote,reviews:p.reviews,reviewMsg:p.reviewMsg,reviewError:p.reviewError,refreshReviews:p.refreshReviews,postReview:p.postReview,submitFindings:p.submitFindings,traceEntries:p.traceEntries,traceNote:p.traceNote,traceDone:p.traceDone,traceKind:p.traceKind,setTraceKind:p.setTraceKind,downloadTrace:p.downloadTrace,traceMsg:p.traceMsg,sendChatMessage:p.sendChatMessage,chatMsg:p.chatMsg,chatHistory:p.chatHistory,followups:p.followups,approvals:p.approvals,approvalMsg:p.approvalMsg,refreshApprovals:p.refreshApprovals,decideApproval:p.decideApproval,peerMessages:p.peerMessages,peerMsg:p.peerMsg,postPeer:p.postPeer,automations:S.automations,autoMsg:S.autoMsg,refreshAutomations:()=>void S.refreshAutomations(),createAutomation:S.createAutomation,cancelAutomation:S.cancelAutomation,triage:S.triage,triageError:S.triageError,refreshTriage:()=>void S.refreshTriage(),threadText:p.threadText,threadGateNote:p.threadGateNote,threadMsg:p.threadMsg,threadList:p.threadList,threadAction:p.threadAction,dispatch:async(X,vt)=>{const bt=await r.dispatch(X,vt);return r.refreshTasksFirstPage(h.current),bt},dispatchMsg:"",refreshAll:K,refreshSlow:L,refreshStamp:H}}function nu({label:i,value:r,sub:h}){return c.jsxs("div",{className:"dash-card data-card",children:[c.jsx("div",{className:"dash-card-label",children:i}),c.jsx("div",{className:"dash-card-value",children:r}),c.jsx("div",{className:"muted",children:h})]})}function rg(){const i=Zt(),r=i.healthText==="未加载"?"未加载":i.healthText.includes("worker_ok=true")?"正常":i.healthText.includes("worker_ok=false")?"异常":i.healthText.includes("加载失败")?"加载失败":"未知",h=i.quotaText.match(/剩余 \$([0-9.]+)/),f=i.quotaText.includes("加载失败")?"加载失败":i.quotaText.includes("未填 key")||i.quotaText==="未加载"?"未加载":h?"$"+h[1]:"配额",S=["running","completed","failed","queued","merged","interrupted"].map(j=>j+" "+(i.taskStatusCounts[j]||0)).join(" | "),N=i.projects.find(j=>j.id===i.projectId),A=i.taskError?{value:"加载失败",sub:i.taskError}:i.projectId?{value:String(i.taskTotal),sub:i.taskCountText+" | "+S+(N?" | "+N.name:"")}:{value:"先选项目",sub:i.projectMsg||"项目加载后自动选第一个"};let p;if(i.workersError)p={value:"加载失败",sub:i.workersError};else if(i.workers===null)p={value:i.workersSummary||"未加载",sub:"完整 worker 清单仅全局管理员可见"};else{const j=i.workers.filter(k=>{if(k.alive!==void 0&&k.alive!==null)return!!k.alive;const K=Jh(k).age;return K!==null&&K<=120}).length;p={value:j+" 在线 / "+i.workers.length,sub:i.workers.length-j+" 离线"}}const H=i.projectMsg.includes("加载失败")?{value:"加载失败",sub:i.projectMsg}:{value:i.projects.length+" 个",sub:N?"当前项目:"+N.name:"未选项目(加载后自动选第一个)"},O=[i.envMsg,i.memberError,i.skillError].filter(j=>j&&j.includes("失败")),Y=i.projectId?O.length?{value:"部分加载失败",sub:O.join(" | ")}:{value:i.envs.length+" 个环境",sub:i.members.length+" 成员 | "+i.skills.length+" 技能 | "+i.apps.length+" 应用 | "+i.mcpServers.length+" MCP"}:{value:"先选项目",sub:"选项目后显示环境 / 成员 / 技能计数"};return c.jsxs("section",{className:"dash-cards","aria-label":"数据卡片",children:[c.jsx(nu,{label:"健康",value:r,sub:i.healthText}),c.jsx(nu,{label:"配额",value:f,sub:i.quotaText}),c.jsx(nu,{label:"任务",value:A.value,sub:A.sub}),c.jsx(nu,{label:"Workers",value:p.value,sub:p.sub}),c.jsx(nu,{label:"项目",value:H.value,sub:H.sub}),c.jsx(nu,{label:"项目数据",value:Y.value,sub:Y.sub})]})}function It({id:i,className:r,title:h,children:f}){return c.jsxs("section",{id:i,className:"card"+(r?" "+r:""),children:[h?c.jsx("h2",{children:h}):null,f]})}function wt({children:i}){return c.jsx("div",{className:"bar",children:i})}function xl({items:i,empty:r}){return i.length?c.jsx("ul",{className:"data-list",children:i.map((h,f)=>c.jsx("li",{children:h},f))}):c.jsx("div",{className:"muted",children:r||"(暂无)"})}function cu({children:i}){return c.jsx("ul",{className:"data-list",children:i})}function og(){const i=Zt(),[r,h]=d.useState(""),[f,S]=d.useState(""),[N,A]=d.useState(!1),[p,H]=d.useState(!1),[O,Y]=d.useState(!1),[j,k]=d.useState("docker"),[K,L]=d.useState(""),[at,X]=d.useState(""),[vt,bt]=d.useState(""),[zt,J]=d.useState(""),[Rt,it]=d.useState(""),[Q,rt]=d.useState(""),[Ut,Qt]=d.useState(""),Nt=d.useRef(null),kt=d.useRef(null),B=d.useRef(null),[ot,st]=d.useState("");async function q(){var we,Ce,y;if(st(""),!i.projectId){st("先选项目");return}if(!r.trim()){st("prompt 必填");return}const C={project_id:i.projectId,prompt:r.trim()};i.envSelect&&(C.environment_id=i.envSelect),j&&(C.executor=j);const lt=at.trim()||K;lt&&(C.model=lt),vt&&(C.effort=vt);const gt=Q.trim()||Rt;if(gt&&(C.child_model=gt),Ut&&(C.child_effort=Ut),zt&&(C.approval=zt),O){if(zt==="full"){st("计划模式不能与完全访问同用");return}if(N||p){st("计划模式不能与 goal 模式同用");return}C.plan=1}p?(C.goal_mode=1,C.no_time_limit=1):N&&(C.goal_mode=1);const yt=f.trim();if(yt){try{C.coordinator_parts=JSON.parse(yt)}catch{st("协调员子任务 JSON 解析失败");return}if(!Array.isArray(C.coordinator_parts)){st("协调员子任务必须是数组");return}if(N||p||O){st("协调员任务不能与 goal/计划模式同用:协调员任务本身不跑模型回合,请取消 goal/计划勾选,或清空协调员 JSON");return}}const ge=tg(((we=Nt.current)==null?void 0:we.files)||null,((Ce=kt.current)==null?void 0:Ce.files)||null,((y=B.current)==null?void 0:y.files)||null);try{const D=await i.dispatch(C,ge);st(D),h(""),S(""),Nt.current&&(Nt.current.value=""),kt.current&&(kt.current.value=""),B.current&&(B.current.value="")}catch(D){st("提交失败:"+((D==null?void 0:D.message)||String(D)))}}return c.jsxs(It,{id:"nav-newtask",className:"composer",title:"新建任务",children:[c.jsxs(wt,{children:[c.jsxs("select",{"aria-label":"环境",value:i.envSelect,onChange:C=>i.setEnvSelect(C.target.value),children:[c.jsx("option",{value:"",children:"环境:不指定(走项目仓库)"}),i.envs.map(C=>c.jsxs("option",{value:C.id,disabled:C.status!=="ready",children:[C.name,"(",C.status,")"]},C.id))]}),c.jsxs("select",{"aria-label":"执行器",value:j,onChange:C=>k(C.target.value),children:[c.jsx("option",{value:"docker",children:"docker(默认,多用户下隔离最强)"}),c.jsx("option",{value:"local",children:"local"}),c.jsx("option",{value:"cloud",children:"cloud"})]}),c.jsxs("label",{children:[c.jsx("input",{type:"checkbox",checked:N,onChange:C=>A(C.target.checked)})," goal 模式"]}),c.jsxs("label",{children:[c.jsx("input",{type:"checkbox",checked:p,onChange:C=>H(C.target.checked)})," goal 模式无敌版"]}),c.jsxs("label",{children:[c.jsx("input",{type:"checkbox",checked:O,onChange:C=>Y(C.target.checked)})," 计划模式(只读)"]})]}),c.jsx("textarea",{className:"prompt stacked",placeholder:"任务 prompt(必填)",value:r,onChange:C=>h(C.target.value)}),c.jsx("textarea",{className:"coord stacked",placeholder:"协调员子任务 JSON(可选),留空为普通任务",value:f,onChange:C=>S(C.target.value)}),c.jsxs("div",{className:"muted",children:["协调员格式:[","{",'"name":"后端","prompt":"做后端"',"}",",","{",'"name":"前端","prompt":"做前端"',"}","];提交后 worker 并行建子任务、等齐、合流汇总。不能与 goal/计划模式同用。协调员与 goal/计划互斥:勾了 goal 或计划模式时不要填协调员 JSON,提交前会校验并拦截。子任务费用记父任务创建人账;父任务创建时按分工数预留配额,余额不足时整个父任务被挡下。"]}),c.jsxs(wt,{children:[c.jsxs("select",{"aria-label":"模型",value:K,onChange:C=>L(C.target.value),children:[c.jsx("option",{value:"",children:"模型:默认(跟随配置)"}),i.models.map(C=>c.jsx("option",{value:C,children:C},C))]}),i.modelCustomVisible?c.jsx("input",{type:"text",placeholder:"手动输入模型(中转列表取不到时用)",value:at,onChange:C=>X(C.target.value)}):null,c.jsxs("select",{"aria-label":"推理强度",value:vt,onChange:C=>bt(C.target.value),children:[c.jsx("option",{value:"",children:"推理强度:默认(跟随配置)"}),Qh.map(C=>c.jsx("option",{value:C,children:C},C))]}),c.jsxs("select",{"aria-label":"权限",value:zt,onChange:C=>J(C.target.value),children:[c.jsx("option",{value:"",children:"权限:默认(跟随配置)"}),c.jsx("option",{value:"ask",children:"请求批准"}),c.jsx("option",{value:"auto",children:"帮我批准"}),c.jsx("option",{value:"full",children:"完全访问"})]})]}),c.jsxs(wt,{children:[c.jsxs("select",{"aria-label":"子任务模型",value:Rt,onChange:C=>it(C.target.value),children:[c.jsx("option",{value:"",children:"子任务模型:跟随本任务模型"}),i.models.map(C=>c.jsx("option",{value:C,children:C},C))]}),c.jsx("input",{type:"text",placeholder:"子任务模型手动输入(中转列表里没有时填,如 gpt-6-luna;留空=跟随本任务模型)",value:Q,onChange:C=>rt(C.target.value)}),c.jsxs("select",{"aria-label":"子任务强度",value:Ut,onChange:C=>Qt(C.target.value),children:[c.jsx("option",{value:"",children:"子任务强度:跟随本任务强度"}),Qh.map(C=>c.jsx("option",{value:C,children:C},C))]})]}),c.jsx("div",{className:"muted",children:"子任务模型/强度是派生默认:本任务用 marker task-create 或协调员分工派生的子任务,未显式写模型/强度时用它;块/分工里显式写了则覆盖它。也可以不在这里填、直接在 prompt 里写“子任务用 gpt-6-luna max”,建任务时服务端会解析成同一对字段(任务详情里可核对)。"}),N?c.jsx("div",{className:"muted",children:"goal 模式:输入框内容即目标,不需要专用 prompt 与验收命令;不限轮次,模型确认达成后在回复末尾输出“目标已达成”即结束,未达成会一直运行,可用取消停止。"}):null,p?c.jsx("div",{className:"muted",children:"goal 模式无敌版:goal 模式 + 任务不限时(去掉 worker/docker 总超时;单轮 600 秒护栏还在,不限的是任务总时长与总轮次)。服务端默认的自动续跑与断点镜像同时生效。"}):null,c.jsxs(wt,{children:[c.jsx("span",{className:"muted",children:"附件(放进任务工作区,图片与普通文件不区分):"}),c.jsx("input",{ref:Nt,type:"file",multiple:!0,title:"文件"}),c.jsx("input",{ref:kt,type:"file",multiple:!0,title:"文件夹",webkitdirectory:""}),c.jsx("input",{ref:B,type:"file",accept:"image/*",multiple:!0,title:"图片"})]}),c.jsxs(wt,{children:[c.jsx("button",{className:"seal",onClick:q,children:"提交任务"}),c.jsx("span",{className:"muted",children:ot||i.dispatchMsg})]})]})}function Fh(i){const r=(i.prompt||"").trim();return r?[...r][0]:i.id?[...i.id][0]:"?"}function zc(i){const r=Math.max(0,Math.floor(i));if(r<60)return r+"秒";if(r<3600){const S=Math.floor(r/60),N=r%60;return N?S+"分"+N+"秒":S+"分"}if(r<86400){const S=Math.floor(r/3600),N=Math.floor(r%3600/60);return N?S+"小时"+N+"分":S+"小时"}const h=Math.floor(r/86400),f=Math.floor(r%86400/3600);return f?h+"天"+f+"小时":h+"天"}function iu(i){if(i==null)return null;const r=Number(i);return Number.isFinite(r)?r:null}function Wh(i){const r=Date.now()/1e3,h=iu(i.started_at),f=iu(i.finished_at),S=iu(i.created_at);return h!==null&&f!==null&&f>=h?[zc(f-h),"总耗时:开始→结束(末次认领的执行时长)"]:h!==null&&i.status==="running"?["进行中 "+zc(r-h),"总耗时:进行中,已用时长从开始算起,随刷新更新"]:S!==null&&f!==null&&f>=S?[zc(f-S),"总耗时:创建→完成(含排队等待;无开始时间时的兜底口径)"]:S!==null&&(i.status==="queued"||i.status==="running")?[(i.status==="queued"?"排队中 ":"进行中 ")+zc(r-S),"总耗时:从创建算起的已用时长(无开始时间时的兜底口径)"]:["—","总耗时:无可用时间戳"]}function fg(i){if(i==null||!Number.isFinite(Number(i)))return"—";const r=Number(i)/1e6;return"$"+(r>0&&r<.01?r.toFixed(4):r.toFixed(2))}function $h(i){const r=iu(i.total_tokens);if(r!==null)return[r.toLocaleString()+" token","token:服务端 total_tokens"];const h=iu(i.actual_tokens),f=iu(i.estimated_tokens);return h!==null||f!==null?[((h||0)+(f||0)).toLocaleString()+" token","token:actual + estimated 分项加总"]:["token —","token:本任务对象未带 token 字段;单任务真数在详情的成本里可查,不逐个调成本接口、不编造"]}function dg({onNew:i}){const r=Zt();return c.jsxs("div",{children:[c.jsxs("div",{className:"search-box",children:[c.jsxs("svg",{viewBox:"0 0 24 24",width:"18",height:"18",fill:"none",stroke:"currentColor",strokeWidth:"1.8",strokeLinecap:"round","aria-hidden":"true",children:[c.jsx("circle",{cx:"11",cy:"11",r:"7"}),c.jsx("path",{d:"M21 21l-4.3-4.3"})]}),c.jsx("input",{type:"text",placeholder:"搜索","aria-label":"搜索任务",value:r.searchText,onChange:h=>r.setSearchText(h.target.value)})]}),c.jsx("div",{className:"bar",children:c.jsxs("select",{"aria-label":"项目",value:r.projectId,onChange:h=>r.selectProject(h.target.value),children:[r.projects.length===0?c.jsx("option",{value:"",children:"(先加载项目)"}):null,r.projects.map(h=>c.jsxs("option",{value:h.id,children:[h.name," (",Ne(h.id),")"]},h.id))]})}),c.jsxs("div",{className:"list-section-head",children:[c.jsx("span",{children:"主要聊天"}),c.jsx("button",{type:"button","aria-label":"派发新任务",title:"派发新任务",onClick:i,children:"+"})]}),c.jsxs("div",{className:"bar",children:[c.jsxs("select",{"aria-label":"状态筛选",value:r.statusFilter,onChange:h=>r.setStatusFilter(h.target.value),children:[c.jsx("option",{value:"",children:"状态:全部"}),["queued","running","completed","failed","interrupted","merged","merge-failed"].map(h=>c.jsx("option",{value:h,children:h},h))]}),c.jsxs("select",{"aria-label":"执行器筛选",value:r.executorFilter,onChange:h=>r.setExecutorFilter(h.target.value),children:[c.jsx("option",{value:"",children:"执行器:全部"}),c.jsx("option",{value:"local",children:"local"}),c.jsx("option",{value:"docker",children:"docker"}),c.jsx("option",{value:"cloud",children:"cloud"})]})]}),c.jsxs("div",{className:"bar",children:[c.jsx("button",{onClick:r.refreshTasks,children:"刷新"}),c.jsx("span",{className:"muted",children:r.taskCountText})]}),c.jsxs("div",{className:"bar",children:[c.jsx("button",{disabled:r.taskPage<=0,onClick:()=>r.goToTaskPage(r.taskPage-1),children:"上一页"}),c.jsxs("span",{className:"muted",children:["第 ",r.taskPage+1," / ",r.taskTotalPages," 页(每页 20 条,最新在前)"]}),c.jsx("button",{disabled:r.taskPage+1>=r.taskTotalPages,onClick:()=>r.goToTaskPage(r.taskPage+1),children:"下一页"})]}),r.taskError?c.jsx("div",{className:"err",children:r.taskError}):r.projectId?r.filteredTasks.length===0?c.jsx("div",{className:"muted",children:r.taskTotal?"没有符合筛选条件的任务":"该项目暂无任务"}):c.jsx("ul",{className:"issue-list",children:r.filteredTasks.map(h=>{var H;const[f,S]=Wh(h),[N,A]=$h(h),p=Fh(h);return c.jsxs("li",{className:"issue-item"+(((H=r.currentTask)==null?void 0:H.id)===h.id?" selected":""),onClick:()=>r.showDetail(h.id),children:[c.jsx("span",{className:"issue-state st-"+h.status,"aria-hidden":"true"}),c.jsx("span",{className:"issue-first",title:"任务首字:"+p,"aria-hidden":"true",children:p}),c.jsxs("span",{style:{flex:1,minWidth:0},children:[c.jsxs("div",{className:"issue-title",children:[h.plan?"[计划] ":"",h.forked_from?"[分支] ":"",h.coordinator_parts?"[协调] ":"",h.parent_task_id?"[协调子任务] ":"",String(h.prompt||Ne(h.id)).slice(0,60)]}),c.jsxs("div",{className:"issue-meta",children:[Ne(h.id)," · ",c.jsx("span",{className:"st-"+h.status,children:h.status})," · ",h.executor||"",h.updated_at?" · "+new Date(h.updated_at*1e3).toLocaleString():""," · ",c.jsxs("span",{title:S,children:["耗时 ",f]})," · ",c.jsx("span",{title:A,children:N})]})]})]},h.id)})}):c.jsx("div",{className:"muted",children:"先选项目"})]})}function mg(i){const r=d.useRef(null),[h,f]=d.useState(!0),S=d.useRef(!0),N=()=>{const A=r.current;if(!A)return;const p=A.scrollHeight-A.scrollTop-A.clientHeight<80;S.current=p,f(p)};return d.useEffect(()=>{S.current&&r.current&&(r.current.scrollTop=r.current.scrollHeight)},[i]),{ref:r,following:h,onScroll:N}}function hg({msg:i}){if(i.role==="status")return c.jsx("div",{className:"chat-status",children:i.text});const r=i.label||(i.role==="user"?"用户":i.role==="assistant"?"助手":"工具");return c.jsxs("div",{className:"gh-comment "+i.role,children:[c.jsx("div",{className:"gh-comment-header",children:c.jsx("span",{className:"gh-comment-author",children:r})}),c.jsx("div",{className:"gh-comment-body",children:i.text})]})}function vg({messages:i,empty:r}){const{ref:h,following:f,onScroll:S}=mg(i.length);return c.jsxs("div",{className:"chat-list",ref:h,onScroll:S,children:[i.length===0?c.jsx("div",{className:"muted",children:r||"(暂无消息)"}):i.map(N=>c.jsx(hg,{msg:N},N.id)),!f&&i.length>0?c.jsx("button",{className:"chat-follow",onClick:()=>{h.current&&(h.current.scrollTop=h.current.scrollHeight)},children:"回到最新 ↓"}):null]})}function yg({onSend:i,disabled:r,placeholder:h}){const[f,S]=d.useState(""),N=()=>{const A=f.trim();!A||r||(i(A),S(""))};return c.jsxs("div",{className:"gh-comment-box",children:[c.jsx("textarea",{"aria-label":"会话输入",rows:3,placeholder:h||"消息",value:f,disabled:r,onChange:A=>S(A.target.value),onKeyDown:A=>{A.key==="Enter"&&!A.shiftKey&&(A.preventDefault(),N())}}),c.jsx("div",{className:"gh-comment-footer",children:c.jsx("button",{type:"button",className:"primary","aria-label":"发送",disabled:r||!f.trim(),onClick:N,children:"发送"})})]})}function Xh(i,r){const h=i.id||"trace-"+r;if(i.kind==="message"){const f=(i.phase?"["+i.phase+"] ":"")+(i.text||"");return{id:h,role:"assistant",kind:i.kind,text:i.truncated?f+` -(链路摘要已截断至 300 字,完整回复见右侧任务结果)`:f,label:"助手"}}if(i.kind==="exec"||i.kind==="file"||i.kind==="tool"||i.kind==="call"){const f=i.kind==="exec"?"命令":i.kind==="file"?"文件":i.kind==="tool"?"工具":"调用";return{id:h,role:"tool",kind:i.kind,text:vo(i),label:f}}return i.kind==="plan"?{id:h,role:"status",kind:i.kind,text:i.text||""}:i.kind==="reasoning"?{id:h,role:"status",kind:i.kind,text:"思考:"+(i.summary||"")}:i.kind==="agent-start"?{id:h,role:"status",kind:i.kind,text:"子代理开始:"+(i.name||"")+(i.prompt?"("+i.prompt+")":"")}:i.kind==="agent-done"?{id:h,role:"status",kind:i.kind,text:"子代理结束:"+(i.name||"")+" "+(i.status||"")}:{id:h,role:"status",kind:i.kind,text:vo(i)}}function gg(){const i=Zt(),r=i.currentTask,h=d.useMemo(()=>{if(!r)return[];let H;if(i.chatHistory){H=i.chatHistory.messages.map(L=>({id:L.id,role:L.role,text:L.text,label:L.label,kind:L.kind}));const k=new Set(H.map(L=>L.id)),K=i.traceEntries.filter(L=>L.id&&!k.has(L.id)&&!String(L.id).startsWith("fu-")).map((L,at)=>Xh(L,at));H=[...H,...K]}else{const k=r.prompt?[{id:"task-prompt",role:"user",text:r.prompt}]:[],K=i.traceEntries.filter(at=>!String(at.id||"").startsWith("fu-")).map((at,X)=>Xh(at,X)),L=i.followups.map((at,X)=>({id:"followup-"+X,role:"user",text:String(at.body||""),label:"后续消息"}));H=[...k,...K,...L]}const O=i.traceKind,Y=O?H.filter(k=>k.role==="user"||!k.kind||k.kind===O):H,j=i.traceDone?[{id:"trace-done",role:"status",text:"链路已结束("+i.traceDone+")"}]:[];return[...Y,...j]},[r,i.chatHistory,i.traceEntries,i.followups,i.traceKind,i.traceDone]);if(!r)return c.jsx("div",{className:"muted",children:"点任务行查看详情后,这里显示继续会话"});const f=uu.includes(r.status),S=["queued","running"].includes(r.status),N=f||S,A=f?"终态任务:发送走继续接口(同一会话再跑一轮)":S?"运行中/排队中:发送走后续消息直接发送(跑完当前轮后优先执行)":"merged/merge-failed 任务不可继续,也不可发后续消息",p=i.chatHistory?i.chatHistory.legacy_continue_count??null:null;return c.jsxs("div",{className:"chat-column",children:[c.jsx("div",{className:"muted",children:"实时对话"}),c.jsxs(wt,{children:[c.jsxs("select",{"aria-label":"链路类型",value:i.traceKind,onChange:H=>i.setTraceKind(H.target.value),children:[c.jsx("option",{value:"",children:"链路类型:全部"}),["exec","file","call","tool","message","reasoning","plan","agent-start","agent-done"].map(H=>c.jsx("option",{value:H,children:H==="exec"?"命令":H==="file"?"文件":H==="call"?"调用":H==="tool"?"工具":H==="message"?"消息":H==="reasoning"?"思考":H==="plan"?"计划":"子代理"},H))]}),c.jsx("button",{onClick:i.downloadTrace,children:"下载完整链路"}),c.jsx("span",{className:"muted",children:i.traceMsg})]}),i.traceNote?c.jsx("div",{children:c.jsx("span",{className:"err",children:i.traceNote})}):null,p!==null&&p>0?c.jsxs("div",{className:"muted",children:["此前有 ",p," 条继续消息发生在持久化之前,未入库,上面历史不完整;部署后新发的继续消息会正常显示。"]}):null,i.chatHistory&&i.chatHistory.trace_note?c.jsx("div",{className:"muted",children:i.chatHistory.trace_note}):null,c.jsx(vg,{messages:h,empty:"(暂无会话消息)"}),c.jsx(yg,{disabled:!N,placeholder:"消息",onSend:H=>void i.sendChatMessage(H)}),c.jsxs("div",{className:"muted",children:[A,"。",i.chatMsg]}),c.jsx("div",{className:"muted",children:"对话时间线:首条是本任务 prompt(用户);助手回复、命令/文件/工具/调用、计划/思考/子代理开始结束都在同一列里,不再另起一份链路名单。流式进行中时新条目实时追加;你在底部时自动跟随,往上翻时暂停跟随,点“回到最新”恢复。"})]})}function pg(){return Zt().currentTask?c.jsx("div",{className:"conversation",children:c.jsx(gg,{})}):c.jsx("div",{className:"conversation",children:c.jsx("div",{className:"muted",children:"在任务列表里点一条任务,对话和详情就切到该任务;也可以在上面派发一个新任务。"})})}function Sg(){const i=Zt(),r=i.currentTask,[h,f]=d.useState("");if(!r)return null;const S=uu.includes(r.status),N=["failed","interrupted","merge-failed"].includes(r.status);return c.jsxs(c.Fragment,{children:[c.jsxs(wt,{children:[c.jsx("button",{disabled:!N,title:N?"":"仅 failed/interrupted/merge-failed 可重试",onClick:()=>i.doAction("retry"),children:"重试"}),c.jsx("button",{className:"danger",disabled:S,title:S?"终态任务不可取消":"",onClick:()=>i.doAction("cancel"),children:"取消"}),c.jsx("button",{disabled:r.status!=="completed",title:r.status!=="completed"?"仅 completed 可合并":"",onClick:()=>i.doAction("merge"),children:"合并(completed → merged)"}),c.jsx("button",{disabled:r.status!=="merged",title:r.status!=="merged"?"仅 merged 可提 PR":"",onClick:()=>i.doAction("pr"),children:"提 PR(须 merged)"}),S?c.jsx("button",{onClick:()=>i.setForkVisible(!0),children:"分支"}):null,c.jsx("button",{onClick:i.taskCost,children:"查成本"}),c.jsxs("span",{className:"muted",children:[i.actionMsg," ",i.actionReasons]})]}),i.forkVisible?c.jsxs("div",{children:[c.jsx("input",{type:"text",placeholder:"分支首轮消息(必填,带历史的新会话)",style:{width:"100%",boxSizing:"border-box",margin:"6px 0"},value:h,onChange:A=>f(A.target.value)}),c.jsxs(wt,{children:[c.jsx("button",{className:"seal",onClick:async()=>{await i.forkTask(h),f("")},children:"创建分支任务"}),c.jsx("span",{className:"muted",children:i.forkMsg})]})]}):null]})}function bg(){const r=Zt().currentTask,[h,f]=d.useState(""),[S,N]=d.useState(null),[A,p]=d.useState("未开始"),[H,O]=d.useState(""),[Y,j]=d.useState(!1),k=d.useRef(null),K=d.useRef(null),L=d.useCallback(async()=>{if(r)try{const it=await I(Z.taskBrowserState(r.id));N(it),O("")}catch(it){const Q=it instanceof Error?it.message:String(it);Q.includes("503")?N(null):O(Q)}},[r]);d.useEffect(()=>{var it;if(f(""),N(null),p("未开始"),O(""),j(!1),(it=k.current)==null||it.abort(),!!r)return L(),()=>{var Q;(Q=k.current)==null||Q.abort()}},[r,L]),d.useEffect(()=>{if(!r||Y)return;const it=setInterval(()=>void L(),5e3);return()=>clearInterval(it)},[r,Y,L]);const at=d.useCallback(async()=>{var Q;if(!r)return;(Q=k.current)==null||Q.abort();const it=new AbortController;k.current=it,j(!0),p("连接中…"),O("");try{const rt=await fetch(Z.taskBrowserStream(r.id),{headers:{"X-API-Key":sl()},signal:it.signal});if(!rt.ok||!rt.body){const kt=await rt.json().catch(()=>null);throw new Error(kt&&kt.error||"HTTP "+rt.status)}p("直播中");const Ut=rt.body.getReader(),Qt=new TextDecoder;let Nt="";for(;;){const{done:kt,value:B}=await Ut.read();if(kt)break;Nt+=Qt.decode(B,{stream:!0});let ot=Nt.indexOf(` +`),N(W||"(暂无 result/error 输出)")}catch{}te(k.id),Pe(k.id),qe(k.id),_l(k.id),da(k),rl(k.id),ol(k.id),Wt(k.id),Ul(k.id),Dl(k.id)}},[te,Pe,qe,_l,da,rl,ol,Wt,Ul,Dl]),ma=d.useCallback(async k=>{const U=se.current;if(!U)return;const W={cancel:"确定取消该任务吗?",merge:"确定把 completed 任务标为 merged 吗?",pr:"确定为该任务提 PR 吗?(会在仓库真实建 PR)"};if(!(W[k]&&!window.confirm(W[k])))try{const tt=await I(K.taskAction(U.id,k),"POST",{});p(k+" 已提交:"+JSON.stringify(tt).slice(0,300)),r(),await Se(U.id)}catch(tt){p(k+" 失败:"+tt.message)}},[Se,r]),su=d.useCallback(async()=>{const k=se.current;if(k)try{const U=await I(K.taskCost(k.id));j(JSON.stringify(U,null,2).slice(0,4e3))}catch(U){j("查成本失败:"+U.message)}},[]),ru=d.useCallback(async k=>{const U=se.current;if(U){if(!k.trim()){vt("分支消息必填");return}if(!uu.includes(U.status)){vt("仅终态任务可分支");return}try{const W=await I(K.taskFork(U.id),"POST",{message:k.trim()});vt("分支任务已建:"+W.id.slice(0,8)),r()}catch(W){vt("分支失败:"+W.message)}}},[r]),Fl=d.useCallback(async k=>{const U=se.current;if(U)try{await I(K.taskReviews(U.id),"POST",k),Nt("评审已登记(requested)"),await qe(U.id)}catch(W){Nt("登记评审需求失败:"+W.message)}},[qe]),Ae=d.useCallback(k=>{const U=se.current;if(!U)return;const W=window.prompt("输入该条评审的 findings(将写回记录并标为 completed):");W!==null&&I(K.taskReviewFindings(U.id,k),"POST",{findings:W}).then(()=>void qe(U.id)).catch(tt=>Nt("写 findings 失败:"+tt.message))},[qe]),fl=d.useCallback((k,U)=>{const W=se.current;if(!W)return;const tt=U==="approved"?"approve":"deny";I(K.taskApprovalDecision(W.id,k,tt),"POST",{}).then(()=>{xt("已记录"+(U==="approved"?"允许":"拒绝")+"(当前版本只留回执,不拦截实时行为)"),_l(W.id)}).catch(M=>xt("决定失败:"+M.message))},[_l]),Oe=d.useCallback(async(k,U,W)=>{const tt=se.current;if(tt){if(!U.trim()){ce("目标任务 id 不能为空");return}if(!W.trim()){ce("消息正文不能为空");return}try{const M=await I(K.taskMessagesTo(U.trim()),"POST",{from_task_id:tt.id,body:W.trim(),mode:k});ce("已发送("+M.delivery+")"),await ol(tt.id)}catch(M){ce("发送失败:"+M.message)}}},[ol]),ou=d.useCallback((k,U)=>{const W=se.current;if(!W)return;if(!["completed","failed","interrupted"].includes(W.status)){he("仅 completed/failed/interrupted 任务可操作线程(merged/merge-failed 不可改,服务端同样 409)");return}const tt={};if(k==="rename"){if(!U.trim()){he("新线程名不能为空");return}tt.name=U.trim()}I(K.taskThreadAction(W.id,k),"POST",tt).then(M=>{he(k+" 已提交:"+JSON.stringify(M).slice(0,300)),Wt(W.id),Ul(W.id)}).catch(M=>he(k+" 失败:"+M.message))},[Wt,Ul]),fu=d.useCallback(async k=>{const U=se.current;if(!U)return;const W=k.trim();if(!W){Ve("消息不能为空");return}try{uu.includes(U.status)&&U.status!=="merged"?(await I(K.taskContinue(U.id),"POST",{message:W}),Ve("已重新排队,同一会话继续"),r(),await Se(U.id)):["queued","running"].includes(U.status)?(await I(K.taskFollowups(U.id),"POST",{body:W,mode:"direct"}),Ve("已直接发送"),await te(U.id),await Pe(U.id)):Ve("merged/merge-failed 任务不可继续,也不可发后续消息")}catch(tt){Ve("发送失败:"+tt.message)}},[Se,r,te,Pe]),du=d.useCallback(async()=>{const k=se.current;if(!k){Ce("先选一个任务");return}try{const U=await I(K.taskTrace(k.id)),W=new Blob([JSON.stringify({task_id:k.id,status:U.status,note:U.note||"",count:(U.entries||[]).length,entries:U.entries||[]},null,2)],{type:"application/json"}),tt=document.createElement("a");tt.href=URL.createObjectURL(W),tt.download="trace-"+k.id.slice(0,8)+".json",document.body.appendChild(tt),tt.click(),tt.remove(),setTimeout(()=>URL.revokeObjectURL(tt.href),1e3),Ce("已下载完整链路 "+(U.entries||[]).length+" 条")}catch(U){Ce("下载失败:"+U.message)}},[]);return d.useEffect(()=>()=>re(),[re]),{currentTask:h,detailBody:S,actionMsg:A,actionReasons:H,costBox:Y,costSummary:w,forkVisible:V,setForkVisible:at,forkMsg:L,coordChildren:bt,agents:J,agentsNote:it,reviews:rt,reviewMsg:Qt,reviewError:kt,traceEntries:ot,traceNote:q,traceDone:lt,traceKind:yt,setTraceKind:ge,traceMsg:we,followups:y,approvals:ut,approvalMsg:Tt,peerMessages:Ot,peerMsg:dt,threadText:Ga,threadGateNote:Le,threadMsg:Yt,threadList:Kl,chatMsg:fa,chatHistory:zl,showDetail:Se,refreshDetailLists:Xa,doAction:ma,taskCost:su,forkTask:ru,postReview:Fl,submitFindings:Ae,decideApproval:fl,postPeer:Oe,threadAction:ou,sendChatMessage:fu,downloadTrace:du,refreshReviews:()=>void qe(),refreshApprovals:()=>void _l()}}function ng(i){const[r,h]=d.useState([]),[f,S]=d.useState(""),[N,A]=d.useState(null),[p,H]=d.useState(""),O=d.useCallback(async X=>{const V=X!==void 0?X:i();if(!V){h([]);return}try{const at=await I(K.projectAutomations(V));h(at.automations||[])}catch(at){S("自动化加载失败:"+at.message)}},[i]),Y=d.useCallback(async(X,V,at,L)=>{const vt=i();if(!vt){S("先选项目");return}if(!X.trim()){S("自动化名称必填");return}if(!V.trim()){S("定时任务内容必填");return}const bt={name:X.trim(),prompt:V.trim()};at.trim()&&(bt.interval_seconds=parseInt(at.trim(),10)),L.trim()&&(bt.repo_url=L.trim());try{await I(K.projectAutomations(vt),"POST",bt),S("自动化已创建(登记定义,到期后由执行器认领)"),await O(vt)}catch(zt){S("创建失败:"+zt.message)}},[i,O]),j=d.useCallback(X=>{const V=i();V&&I(K.projectAutomationCancel(V,X),"POST",{}).then(()=>{S("自动化已取消"),O(V)}).catch(at=>S("取消失败:"+at.message))},[i,O]),w=d.useCallback(async X=>{const V=X!==void 0?X:i();if(!V){A(null);return}try{const at=await I(K.projectTriage(V));A(at),H("")}catch(at){H("分诊加载失败:"+at.message)}},[i]);return{automations:r,autoMsg:f,triage:N,triageError:p,refreshAutomations:O,createAutomation:Y,cancelAutomation:j,refreshTriage:w}}function ug(i,r){const h=d.useRef(i);h.current=i,d.useEffect(()=>{const f=setInterval(()=>{const S=document.activeElement;h.current(S?S.tagName==="SELECT":!1)},r);return()=>clearInterval(f)},[r])}function ig(i,r){const h=d.useRef(i);h.current=i,d.useEffect(()=>{const f=setInterval(()=>h.current(),r);return()=>clearInterval(f)},[r])}function cg(i){const r=h=>String(h).padStart(2,"0");return r(i.getHours())+":"+r(i.getMinutes())+":"+r(i.getSeconds())}function sg(){var at;const i=eg(),r=lg(),h=d.useRef("");h.current=i.projectId;const f=d.useCallback(()=>h.current,[]),S=ng(f),N=d.useCallback(L=>{const vt=i.projects.find(bt=>bt.id===L);return vt&&vt.my_role||null},[i.projects]),A=d.useCallback(()=>{r.refreshTasks(void 0,h.current)},[r]),p=ag(N,A),[H,O]=d.useState("--:--:--"),Y=d.useCallback(L=>{i.setProjectId(L),h.current=L,r.refreshTasksFirstPage(L),i.refreshEnvs(L),i.refreshMembers(L),i.refreshSkills(L),S.refreshAutomations(L),S.refreshTriage(L)},[i,r,S]),j=(at=i.projects[0])==null?void 0:at.id;d.useEffect(()=>{!i.projectId&&j&&Y(j)},[i.projectId,j,Y]);const w=d.useCallback(L=>{i.saveKeyInput(L),L.trim()&&(i.refreshHealth(),i.refreshProjects(),i.refreshWorkers(),h.current&&(r.refreshTasks(h.current),i.refreshEnvs(h.current),i.refreshMembers(h.current)),i.loadRelayModels(),i.loadQuota(),i.loadGithubRepos(),i.probeAdmin())},[i,r]),X=d.useCallback(L=>{if(O(cg(new Date)),!sl()){i.refreshHealth();return}r.refreshTasks(void 0,h.current),i.refreshHealth(),i.loadQuota(),i.refreshWorkers(),i.refreshMembers(),i.refreshSkills(),S.refreshAutomations(),S.refreshTriage(),p.refreshDetailLists(),L||(i.refreshProjects(),i.refreshEnvs())},[i,r,S,p]),V=d.useCallback(()=>{sl()&&(i.loadRelayModels(),i.loadGithubRepos())},[i]);return d.useEffect(()=>{i.refreshHealth(),i.refreshProjects(),i.refreshWorkers(),i.loadQuota(),i.loadGithubRepos(),sl()&&i.loadRelayModels(),i.probeAdmin()},[]),{keySaved:i.keySaved,keyState:i.keyState,saveKeyInput:w,clearKeyInput:i.clearKeyInput,quotaText:i.quotaText,healthText:i.healthText,refreshHealth:i.refreshHealth,adminGate:i.adminGate,adminBody:i.adminBody,adminResult:i.adminResult,adminUserId:i.adminUserId,setAdminUserId:i.setAdminUserId,adminQuota:i.adminQuota,adminSweep:i.adminSweep,adminBackup:i.adminBackup,projects:i.projects,projectId:i.projectId,projectMsg:i.projectMsg,selectProject:Y,refreshProjects:i.refreshProjects,createProject:i.createProject,githubRepos:i.githubRepos,workers:i.workers,workersSummary:i.workersSummary,workersError:i.workersError,refreshWorkers:i.refreshWorkers,members:i.members,memberMsg:i.memberMsg,memberError:i.memberError,refreshMembers:()=>void i.refreshMembers(),inviteMember:i.inviteMember,changeMemberRole:i.changeMemberRole,skills:i.skills,apps:i.apps,mcpServers:i.mcpServers,skillMsg:i.skillMsg,skillError:i.skillError,mcpMsg:i.mcpMsg,mcpOauthMsg:i.mcpOauthMsg,mcpOauthBox:i.mcpOauthBox,refreshSkills:()=>void i.refreshSkills(),reloadMcp:i.reloadMcp,mcpOauth:i.mcpOauth,envs:i.envs,envCount:i.envCount,envMsg:i.envMsg,envRepoLine:i.envRepoLine,envRepoBar:i.envRepoBar,envRepoMsg:i.envRepoMsg,envSelect:i.envSelect,setEnvSelect:i.setEnvSelect,refreshEnvs:()=>void i.refreshEnvs(),createEnv:i.createEnv,archiveEnv:i.archiveEnv,saveEnvRepo:i.saveEnvRepo,models:i.models,modelCustomVisible:i.modelCustomVisible,tasks:r.tasks,taskCountText:r.taskCountText,taskError:r.taskError,refreshTasks:()=>void r.refreshTasks(void 0,h.current),statusFilter:r.statusFilter,setStatusFilter:r.setStatusFilter,executorFilter:r.executorFilter,setExecutorFilter:r.setExecutorFilter,searchText:r.searchText,setSearchText:r.setSearchText,filteredTasks:r.filteredTasks,taskPage:r.page,taskTotalPages:r.totalPages,taskTotal:r.taskTotal,taskStatusCounts:r.taskStatusCounts,goToTaskPage:r.goToPage,currentTask:p.currentTask,detailBody:p.detailBody,actionMsg:p.actionMsg,actionReasons:p.actionReasons,showDetail:L=>void p.showDetail(L),doAction:p.doAction,taskCost:p.taskCost,costBox:p.costBox,costSummary:p.costSummary,forkVisible:p.forkVisible,setForkVisible:p.setForkVisible,forkTask:p.forkTask,forkMsg:p.forkMsg,coordChildren:p.coordChildren,coordText:"",agents:p.agents,agentsNote:p.agentsNote,reviews:p.reviews,reviewMsg:p.reviewMsg,reviewError:p.reviewError,refreshReviews:p.refreshReviews,postReview:p.postReview,submitFindings:p.submitFindings,traceEntries:p.traceEntries,traceNote:p.traceNote,traceDone:p.traceDone,traceKind:p.traceKind,setTraceKind:p.setTraceKind,downloadTrace:p.downloadTrace,traceMsg:p.traceMsg,sendChatMessage:p.sendChatMessage,chatMsg:p.chatMsg,chatHistory:p.chatHistory,followups:p.followups,approvals:p.approvals,approvalMsg:p.approvalMsg,refreshApprovals:p.refreshApprovals,decideApproval:p.decideApproval,peerMessages:p.peerMessages,peerMsg:p.peerMsg,postPeer:p.postPeer,automations:S.automations,autoMsg:S.autoMsg,refreshAutomations:()=>void S.refreshAutomations(),createAutomation:S.createAutomation,cancelAutomation:S.cancelAutomation,triage:S.triage,triageError:S.triageError,refreshTriage:()=>void S.refreshTriage(),threadText:p.threadText,threadGateNote:p.threadGateNote,threadMsg:p.threadMsg,threadList:p.threadList,threadAction:p.threadAction,dispatch:async(L,vt)=>{const bt=await r.dispatch(L,vt);return r.refreshTasksFirstPage(h.current),bt},dispatchMsg:"",refreshAll:X,refreshSlow:V,refreshStamp:H}}function nu({label:i,value:r,sub:h}){return c.jsxs("div",{className:"dash-card data-card",children:[c.jsx("div",{className:"dash-card-label",children:i}),c.jsx("div",{className:"dash-card-value",children:r}),c.jsx("div",{className:"muted",children:h})]})}function rg(){const i=Zt(),r=i.healthText==="未加载"?"未加载":i.healthText.includes("worker_ok=true")?"正常":i.healthText.includes("worker_ok=false")?"异常":i.healthText.includes("加载失败")?"加载失败":"未知",h=i.quotaText.match(/剩余 \$([0-9.]+)/),f=i.quotaText.includes("加载失败")?"加载失败":i.quotaText.includes("未填 key")||i.quotaText==="未加载"?"未加载":h?"$"+h[1]:"配额",S=["running","completed","failed","queued","merged","interrupted"].map(j=>j+" "+(i.taskStatusCounts[j]||0)).join(" | "),N=i.projects.find(j=>j.id===i.projectId),A=i.taskError?{value:"加载失败",sub:i.taskError}:i.projectId?{value:String(i.taskTotal),sub:i.taskCountText+" | "+S+(N?" | "+N.name:"")}:{value:"先选项目",sub:i.projectMsg||"项目加载后自动选第一个"};let p;if(i.workersError)p={value:"加载失败",sub:i.workersError};else if(i.workers===null)p={value:i.workersSummary||"未加载",sub:"完整 worker 清单仅全局管理员可见"};else{const j=i.workers.filter(w=>{if(w.alive!==void 0&&w.alive!==null)return!!w.alive;const X=Jh(w).age;return X!==null&&X<=120}).length;p={value:j+" 在线 / "+i.workers.length,sub:i.workers.length-j+" 离线"}}const H=i.projectMsg.includes("加载失败")?{value:"加载失败",sub:i.projectMsg}:{value:i.projects.length+" 个",sub:N?"当前项目:"+N.name:"未选项目(加载后自动选第一个)"},O=[i.envMsg,i.memberError,i.skillError].filter(j=>j&&j.includes("失败")),Y=i.projectId?O.length?{value:"部分加载失败",sub:O.join(" | ")}:{value:i.envs.length+" 个环境",sub:i.members.length+" 成员 | "+i.skills.length+" 技能 | "+i.apps.length+" 应用 | "+i.mcpServers.length+" MCP"}:{value:"先选项目",sub:"选项目后显示环境 / 成员 / 技能计数"};return c.jsxs("section",{className:"dash-cards","aria-label":"数据卡片",children:[c.jsx(nu,{label:"健康",value:r,sub:i.healthText}),c.jsx(nu,{label:"配额",value:f,sub:i.quotaText}),c.jsx(nu,{label:"任务",value:A.value,sub:A.sub}),c.jsx(nu,{label:"Workers",value:p.value,sub:p.sub}),c.jsx(nu,{label:"项目",value:H.value,sub:H.sub}),c.jsx(nu,{label:"项目数据",value:Y.value,sub:Y.sub})]})}function Jt({id:i,className:r,title:h,children:f}){return c.jsxs("section",{id:i,className:"card"+(r?" "+r:""),children:[h?c.jsx("h2",{children:h}):null,f]})}function wt({children:i}){return c.jsx("div",{className:"bar",children:i})}function xl({items:i,empty:r}){return i.length?c.jsx("ul",{className:"data-list",children:i.map((h,f)=>c.jsx("li",{children:h},f))}):c.jsx("div",{className:"muted",children:r||"(暂无)"})}function cu({children:i}){return c.jsx("ul",{className:"data-list",children:i})}function og(){const i=Zt(),[r,h]=d.useState(""),[f,S]=d.useState(""),[N,A]=d.useState(!1),[p,H]=d.useState(!1),[O,Y]=d.useState(!1),[j,w]=d.useState("docker"),[X,V]=d.useState(""),[at,L]=d.useState(""),[vt,bt]=d.useState(""),[zt,J]=d.useState(""),[Rt,it]=d.useState(""),[Q,rt]=d.useState(""),[Ut,Qt]=d.useState(""),Nt=d.useRef(null),kt=d.useRef(null),B=d.useRef(null),[ot,st]=d.useState("");async function q(){var we,Ce,y;if(st(""),!i.projectId){st("先选项目");return}if(!r.trim()){st("prompt 必填");return}const C={project_id:i.projectId,prompt:r.trim()};i.envSelect&&(C.environment_id=i.envSelect),j&&(C.executor=j);const lt=at.trim()||X;lt&&(C.model=lt),vt&&(C.effort=vt);const gt=Q.trim()||Rt;if(gt&&(C.child_model=gt),Ut&&(C.child_effort=Ut),zt&&(C.approval=zt),O){if(zt==="full"){st("计划模式不能与完全访问同用");return}if(N||p){st("计划模式不能与 goal 模式同用");return}C.plan=1}p?(C.goal_mode=1,C.no_time_limit=1):N&&(C.goal_mode=1);const yt=f.trim();if(yt){try{C.coordinator_parts=JSON.parse(yt)}catch{st("协调员子任务 JSON 解析失败");return}if(!Array.isArray(C.coordinator_parts)){st("协调员子任务必须是数组");return}if(N||p||O){st("协调员任务不能与 goal/计划模式同用:协调员任务本身不跑模型回合,请取消 goal/计划勾选,或清空协调员 JSON");return}}const ge=tg(((we=Nt.current)==null?void 0:we.files)||null,((Ce=kt.current)==null?void 0:Ce.files)||null,((y=B.current)==null?void 0:y.files)||null);try{const D=await i.dispatch(C,ge);st(D),h(""),S(""),Nt.current&&(Nt.current.value=""),kt.current&&(kt.current.value=""),B.current&&(B.current.value="")}catch(D){st("提交失败:"+((D==null?void 0:D.message)||String(D)))}}return c.jsxs(Jt,{id:"nav-newtask",className:"composer",title:"新建任务",children:[c.jsxs(wt,{children:[c.jsxs("select",{"aria-label":"环境",value:i.envSelect,onChange:C=>i.setEnvSelect(C.target.value),children:[c.jsx("option",{value:"",children:"环境:不指定(走项目仓库)"}),i.envs.map(C=>c.jsxs("option",{value:C.id,disabled:C.status!=="ready",children:[C.name,"(",C.status,")"]},C.id))]}),c.jsxs("select",{"aria-label":"执行器",value:j,onChange:C=>w(C.target.value),children:[c.jsx("option",{value:"docker",children:"docker(默认,多用户下隔离最强)"}),c.jsx("option",{value:"local",children:"local"}),c.jsx("option",{value:"cloud",children:"cloud"})]}),c.jsxs("label",{children:[c.jsx("input",{type:"checkbox",checked:N,onChange:C=>A(C.target.checked)})," goal 模式"]}),c.jsxs("label",{children:[c.jsx("input",{type:"checkbox",checked:p,onChange:C=>H(C.target.checked)})," goal 模式无敌版"]}),c.jsxs("label",{children:[c.jsx("input",{type:"checkbox",checked:O,onChange:C=>Y(C.target.checked)})," 计划模式(只读)"]})]}),c.jsx("textarea",{className:"prompt stacked",placeholder:"任务 prompt(必填)",value:r,onChange:C=>h(C.target.value)}),c.jsx("textarea",{className:"coord stacked",placeholder:"协调员子任务 JSON(可选),留空为普通任务",value:f,onChange:C=>S(C.target.value)}),c.jsxs("div",{className:"muted",children:["协调员格式:[","{",'"name":"后端","prompt":"做后端"',"}",",","{",'"name":"前端","prompt":"做前端"',"}","];提交后 worker 并行建子任务、等齐、合流汇总。不能与 goal/计划模式同用。协调员与 goal/计划互斥:勾了 goal 或计划模式时不要填协调员 JSON,提交前会校验并拦截。子任务费用记父任务创建人账;父任务创建时按分工数预留配额,余额不足时整个父任务被挡下。"]}),c.jsxs(wt,{children:[c.jsxs("select",{"aria-label":"模型",value:X,onChange:C=>V(C.target.value),children:[c.jsx("option",{value:"",children:"模型:默认(跟随配置)"}),i.models.map(C=>c.jsx("option",{value:C,children:C},C))]}),i.modelCustomVisible?c.jsx("input",{type:"text",placeholder:"手动输入模型(中转列表取不到时用)",value:at,onChange:C=>L(C.target.value)}):null,c.jsxs("select",{"aria-label":"推理强度",value:vt,onChange:C=>bt(C.target.value),children:[c.jsx("option",{value:"",children:"推理强度:默认(跟随配置)"}),Qh.map(C=>c.jsx("option",{value:C,children:C},C))]}),c.jsxs("select",{"aria-label":"权限",value:zt,onChange:C=>J(C.target.value),children:[c.jsx("option",{value:"",children:"权限:默认(跟随配置)"}),c.jsx("option",{value:"ask",children:"请求批准"}),c.jsx("option",{value:"auto",children:"帮我批准"}),c.jsx("option",{value:"full",children:"完全访问"})]})]}),c.jsxs(wt,{children:[c.jsxs("select",{"aria-label":"子任务模型",value:Rt,onChange:C=>it(C.target.value),children:[c.jsx("option",{value:"",children:"子任务模型:跟随本任务模型"}),i.models.map(C=>c.jsx("option",{value:C,children:C},C))]}),c.jsx("input",{type:"text",placeholder:"子任务模型手动输入(中转列表里没有时填,如 gpt-6-luna;留空=跟随本任务模型)",value:Q,onChange:C=>rt(C.target.value)}),c.jsxs("select",{"aria-label":"子任务强度",value:Ut,onChange:C=>Qt(C.target.value),children:[c.jsx("option",{value:"",children:"子任务强度:跟随本任务强度"}),Qh.map(C=>c.jsx("option",{value:C,children:C},C))]})]}),c.jsx("div",{className:"muted",children:"子任务模型/强度是派生默认:本任务用 marker task-create 或协调员分工派生的子任务,未显式写模型/强度时用它;块/分工里显式写了则覆盖它。也可以不在这里填、直接在 prompt 里写“子任务用 gpt-6-luna max”,建任务时服务端会解析成同一对字段(任务详情里可核对)。"}),N?c.jsx("div",{className:"muted",children:"goal 模式:输入框内容即目标,不需要专用 prompt 与验收命令;不限轮次,模型确认达成后在回复末尾输出“目标已达成”即结束,未达成会一直运行,可用取消停止。"}):null,p?c.jsx("div",{className:"muted",children:"goal 模式无敌版:goal 模式 + 任务不限时(去掉 worker/docker 总超时;单轮 600 秒护栏还在,不限的是任务总时长与总轮次)。服务端默认的自动续跑与断点镜像同时生效。"}):null,c.jsxs(wt,{children:[c.jsx("span",{className:"muted",children:"附件(放进任务工作区,图片与普通文件不区分):"}),c.jsx("input",{ref:Nt,type:"file",multiple:!0,title:"文件"}),c.jsx("input",{ref:kt,type:"file",multiple:!0,title:"文件夹",webkitdirectory:""}),c.jsx("input",{ref:B,type:"file",accept:"image/*",multiple:!0,title:"图片"})]}),c.jsxs(wt,{children:[c.jsx("button",{className:"seal",onClick:q,children:"提交任务"}),c.jsx("span",{className:"muted",children:ot||i.dispatchMsg})]})]})}function Fh(i){const r=(i.prompt||"").trim();return r?[...r][0]:i.id?[...i.id][0]:"?"}function zc(i){const r=Math.max(0,Math.floor(i));if(r<60)return r+"秒";if(r<3600){const S=Math.floor(r/60),N=r%60;return N?S+"分"+N+"秒":S+"分"}if(r<86400){const S=Math.floor(r/3600),N=Math.floor(r%3600/60);return N?S+"小时"+N+"分":S+"小时"}const h=Math.floor(r/86400),f=Math.floor(r%86400/3600);return f?h+"天"+f+"小时":h+"天"}function iu(i){if(i==null)return null;const r=Number(i);return Number.isFinite(r)?r:null}function Wh(i){const r=Date.now()/1e3,h=iu(i.started_at),f=iu(i.finished_at),S=iu(i.created_at);return h!==null&&f!==null&&f>=h?[zc(f-h),"总耗时:开始→结束(末次认领的执行时长)"]:h!==null&&i.status==="running"?["进行中 "+zc(r-h),"总耗时:进行中,已用时长从开始算起,随刷新更新"]:S!==null&&f!==null&&f>=S?[zc(f-S),"总耗时:创建→完成(含排队等待;无开始时间时的兜底口径)"]:S!==null&&(i.status==="queued"||i.status==="running")?[(i.status==="queued"?"排队中 ":"进行中 ")+zc(r-S),"总耗时:从创建算起的已用时长(无开始时间时的兜底口径)"]:["—","总耗时:无可用时间戳"]}function fg(i){if(i==null||!Number.isFinite(Number(i)))return"—";const r=Number(i)/1e6;return"$"+(r>0&&r<.01?r.toFixed(4):r.toFixed(2))}function $h(i){const r=iu(i.total_tokens);if(r!==null)return[r.toLocaleString()+" token","token:服务端 total_tokens"];const h=iu(i.actual_tokens),f=iu(i.estimated_tokens);return h!==null||f!==null?[((h||0)+(f||0)).toLocaleString()+" token","token:actual + estimated 分项加总"]:["token —","token:本任务对象未带 token 字段;单任务真数在详情的成本里可查,不逐个调成本接口、不编造"]}function dg({onNew:i}){const r=Zt();return c.jsxs("div",{children:[c.jsxs("div",{className:"search-box",children:[c.jsxs("svg",{viewBox:"0 0 24 24",width:"18",height:"18",fill:"none",stroke:"currentColor",strokeWidth:"1.8",strokeLinecap:"round","aria-hidden":"true",children:[c.jsx("circle",{cx:"11",cy:"11",r:"7"}),c.jsx("path",{d:"M21 21l-4.3-4.3"})]}),c.jsx("input",{type:"text",placeholder:"搜索","aria-label":"搜索任务",value:r.searchText,onChange:h=>r.setSearchText(h.target.value)})]}),c.jsx("div",{className:"bar",children:c.jsxs("select",{"aria-label":"项目",value:r.projectId,onChange:h=>r.selectProject(h.target.value),children:[r.projects.length===0?c.jsx("option",{value:"",children:"(先加载项目)"}):null,r.projects.map(h=>c.jsxs("option",{value:h.id,children:[h.name," (",Ne(h.id),")"]},h.id))]})}),c.jsxs("div",{className:"list-section-head",children:[c.jsx("span",{children:"主要聊天"}),c.jsx("button",{type:"button","aria-label":"派发新任务",title:"派发新任务",onClick:i,children:"+"})]}),c.jsxs("div",{className:"bar",children:[c.jsxs("select",{"aria-label":"状态筛选",value:r.statusFilter,onChange:h=>r.setStatusFilter(h.target.value),children:[c.jsx("option",{value:"",children:"状态:全部"}),["queued","running","completed","failed","interrupted","merged","merge-failed"].map(h=>c.jsx("option",{value:h,children:h},h))]}),c.jsxs("select",{"aria-label":"执行器筛选",value:r.executorFilter,onChange:h=>r.setExecutorFilter(h.target.value),children:[c.jsx("option",{value:"",children:"执行器:全部"}),c.jsx("option",{value:"local",children:"local"}),c.jsx("option",{value:"docker",children:"docker"}),c.jsx("option",{value:"cloud",children:"cloud"})]})]}),c.jsxs("div",{className:"bar",children:[c.jsx("button",{onClick:r.refreshTasks,children:"刷新"}),c.jsx("span",{className:"muted",children:r.taskCountText})]}),c.jsxs("div",{className:"bar",children:[c.jsx("button",{disabled:r.taskPage<=0,onClick:()=>r.goToTaskPage(r.taskPage-1),children:"上一页"}),c.jsxs("span",{className:"muted",children:["第 ",r.taskPage+1," / ",r.taskTotalPages," 页(每页 20 条,最新在前)"]}),c.jsx("button",{disabled:r.taskPage+1>=r.taskTotalPages,onClick:()=>r.goToTaskPage(r.taskPage+1),children:"下一页"})]}),r.taskError?c.jsx("div",{className:"err",children:r.taskError}):r.projectId?r.filteredTasks.length===0?c.jsx("div",{className:"muted",children:r.taskTotal?"没有符合筛选条件的任务":"该项目暂无任务"}):c.jsx("ul",{className:"issue-list",children:r.filteredTasks.map(h=>{var H;const[f,S]=Wh(h),[N,A]=$h(h),p=Fh(h);return c.jsxs("li",{className:"issue-item"+(((H=r.currentTask)==null?void 0:H.id)===h.id?" selected":""),onClick:()=>r.showDetail(h.id),children:[c.jsx("span",{className:"issue-state st-"+h.status,"aria-hidden":"true"}),c.jsx("span",{className:"issue-first",title:"任务首字:"+p,"aria-hidden":"true",children:p}),c.jsxs("span",{style:{flex:1,minWidth:0},children:[c.jsxs("div",{className:"issue-title",children:[h.plan?"[计划] ":"",h.forked_from?"[分支] ":"",h.coordinator_parts?"[协调] ":"",h.parent_task_id?"[协调子任务] ":"",String(h.prompt||Ne(h.id)).slice(0,60)]}),c.jsxs("div",{className:"issue-meta",children:[Ne(h.id)," · ",c.jsx("span",{className:"st-"+h.status,children:h.status})," · ",h.executor||"",h.updated_at?" · "+new Date(h.updated_at*1e3).toLocaleString():""," · ",c.jsxs("span",{title:S,children:["耗时 ",f]})," · ",c.jsx("span",{title:A,children:N})]}),(h.status==="failed"||h.status==="interrupted"||h.status==="merge-failed")&&h.error_text?c.jsx("div",{className:"issue-meta",title:h.error_text,children:/503|Service Unavailable/.test(h.error_text)?"上游 503:模型服务暂时不可用":h.error_text.replace(/\s+/g," ").slice(0,60)}):null]})]},h.id)})}):c.jsx("div",{className:"muted",children:"先选项目"})]})}function mg(i){const r=d.useRef(null),[h,f]=d.useState(!0),S=d.useRef(!0),N=()=>{const A=r.current;if(!A)return;const p=A.scrollHeight-A.scrollTop-A.clientHeight<80;S.current=p,f(p)};return d.useEffect(()=>{S.current&&r.current&&(r.current.scrollTop=r.current.scrollHeight)},[i]),{ref:r,following:h,onScroll:N}}function hg({msg:i}){if(i.role==="status")return c.jsx("div",{className:"chat-status",children:i.text});const r=i.label||(i.role==="user"?"用户":i.role==="assistant"?"助手":"工具");return c.jsxs("div",{className:"gh-comment "+i.role,children:[c.jsx("div",{className:"gh-comment-header",children:c.jsx("span",{className:"gh-comment-author",children:r})}),c.jsx("div",{className:"gh-comment-body",children:i.text})]})}function vg({messages:i,empty:r}){const{ref:h,following:f,onScroll:S}=mg(i.length);return c.jsxs("div",{className:"chat-list",ref:h,onScroll:S,children:[i.length===0?c.jsx("div",{className:"muted",children:r||"(暂无消息)"}):i.map(N=>c.jsx(hg,{msg:N},N.id)),!f&&i.length>0?c.jsx("button",{className:"chat-follow",onClick:()=>{h.current&&(h.current.scrollTop=h.current.scrollHeight)},children:"回到最新 ↓"}):null]})}function yg({onSend:i,disabled:r,placeholder:h}){const[f,S]=d.useState(""),N=()=>{const A=f.trim();!A||r||(i(A),S(""))};return c.jsxs("div",{className:"gh-comment-box",children:[c.jsx("textarea",{"aria-label":"会话输入",rows:3,placeholder:h||"消息",value:f,disabled:r,onChange:A=>S(A.target.value),onKeyDown:A=>{A.key==="Enter"&&!A.shiftKey&&(A.preventDefault(),N())}}),c.jsx("div",{className:"gh-comment-footer",children:c.jsx("button",{type:"button",className:"primary","aria-label":"发送",disabled:r||!f.trim(),onClick:N,children:"发送"})})]})}function Xh(i,r){const h=i.id||"trace-"+r;if(i.kind==="message"){const f=(i.phase?"["+i.phase+"] ":"")+(i.text||"");return{id:h,role:"assistant",kind:i.kind,text:i.truncated?f+` +(链路摘要已截断至 300 字,完整回复见右侧任务结果)`:f,label:"助手"}}if(i.kind==="exec"||i.kind==="file"||i.kind==="tool"||i.kind==="call"){const f=i.kind==="exec"?"命令":i.kind==="file"?"文件":i.kind==="tool"?"工具":"调用";return{id:h,role:"tool",kind:i.kind,text:vo(i),label:f}}return i.kind==="plan"?{id:h,role:"status",kind:i.kind,text:i.text||""}:i.kind==="reasoning"?{id:h,role:"status",kind:i.kind,text:"思考:"+(i.summary||"")}:i.kind==="agent-start"?{id:h,role:"status",kind:i.kind,text:"子代理开始:"+(i.name||"")+(i.prompt?"("+i.prompt+")":"")}:i.kind==="agent-done"?{id:h,role:"status",kind:i.kind,text:"子代理结束:"+(i.name||"")+" "+(i.status||"")}:{id:h,role:"status",kind:i.kind,text:vo(i)}}function gg(){const i=Zt(),r=i.currentTask,h=d.useMemo(()=>{if(!r)return[];let H;if(i.chatHistory){H=i.chatHistory.messages.map(V=>({id:V.id,role:V.role,text:V.text,label:V.label,kind:V.kind}));const w=new Set(H.map(V=>V.id)),X=i.traceEntries.filter(V=>V.id&&!w.has(V.id)&&!String(V.id).startsWith("fu-")).map((V,at)=>Xh(V,at));H=[...H,...X]}else{const w=r.prompt?[{id:"task-prompt",role:"user",text:r.prompt}]:[],X=i.traceEntries.filter(at=>!String(at.id||"").startsWith("fu-")).map((at,L)=>Xh(at,L)),V=i.followups.map((at,L)=>({id:"followup-"+L,role:"user",text:String(at.body||""),label:"后续消息"}));H=[...w,...X,...V]}const O=i.traceKind,Y=O?H.filter(w=>w.role==="user"||!w.kind||w.kind===O):H,j=i.traceDone?[{id:"trace-done",role:"status",text:"链路已结束("+i.traceDone+")"}]:[];return[...Y,...j]},[r,i.chatHistory,i.traceEntries,i.followups,i.traceKind,i.traceDone]);if(!r)return c.jsx("div",{className:"muted",children:"点任务行查看详情后,这里显示继续会话"});const f=uu.includes(r.status),S=["queued","running"].includes(r.status),N=f||S,A=f?"终态任务:发送走继续接口(同一会话再跑一轮)":S?"运行中/排队中:发送走后续消息直接发送(跑完当前轮后优先执行)":"merged/merge-failed 任务不可继续,也不可发后续消息",p=i.chatHistory?i.chatHistory.legacy_continue_count??null:null;return c.jsxs("div",{className:"chat-column",children:[c.jsx("div",{className:"muted",children:"实时对话"}),c.jsxs(wt,{children:[c.jsxs("select",{"aria-label":"链路类型",value:i.traceKind,onChange:H=>i.setTraceKind(H.target.value),children:[c.jsx("option",{value:"",children:"链路类型:全部"}),["exec","file","call","tool","message","reasoning","plan","agent-start","agent-done"].map(H=>c.jsx("option",{value:H,children:H==="exec"?"命令":H==="file"?"文件":H==="call"?"调用":H==="tool"?"工具":H==="message"?"消息":H==="reasoning"?"思考":H==="plan"?"计划":"子代理"},H))]}),c.jsx("button",{onClick:i.downloadTrace,children:"下载完整链路"}),c.jsx("span",{className:"muted",children:i.traceMsg})]}),i.traceNote?c.jsx("div",{children:c.jsx("span",{className:"err",children:i.traceNote})}):null,p!==null&&p>0?c.jsxs("div",{className:"muted",children:["此前有 ",p," 条继续消息发生在持久化之前,未入库,上面历史不完整;部署后新发的继续消息会正常显示。"]}):null,i.chatHistory&&i.chatHistory.trace_note?c.jsx("div",{className:"muted",children:i.chatHistory.trace_note}):null,c.jsx(vg,{messages:h,empty:"(暂无会话消息)"}),c.jsx(yg,{disabled:!N,placeholder:"消息",onSend:H=>void i.sendChatMessage(H)}),c.jsxs("div",{className:"muted",children:[A,"。",i.chatMsg]}),c.jsx("div",{className:"muted",children:"对话时间线:首条是本任务 prompt(用户);助手回复、命令/文件/工具/调用、计划/思考/子代理开始结束都在同一列里,不再另起一份链路名单。流式进行中时新条目实时追加;你在底部时自动跟随,往上翻时暂停跟随,点“回到最新”恢复。"})]})}function pg(){return Zt().currentTask?c.jsx("div",{className:"conversation",children:c.jsx(gg,{})}):c.jsx("div",{className:"conversation",children:c.jsx("div",{className:"muted",children:"在任务列表里点一条任务,对话和详情就切到该任务;也可以在上面派发一个新任务。"})})}function Sg(){const i=Zt(),r=i.currentTask,[h,f]=d.useState("");if(!r)return null;const S=uu.includes(r.status),N=["failed","interrupted","merge-failed"].includes(r.status);return c.jsxs(c.Fragment,{children:[c.jsxs(wt,{children:[c.jsx("button",{disabled:!N,title:N?"":"仅 failed/interrupted/merge-failed 可重试",onClick:()=>i.doAction("retry"),children:"重试"}),c.jsx("button",{className:"danger",disabled:S,title:S?"终态任务不可取消":"",onClick:()=>i.doAction("cancel"),children:"取消"}),c.jsx("button",{disabled:r.status!=="completed",title:r.status!=="completed"?"仅 completed 可合并":"",onClick:()=>i.doAction("merge"),children:"合并(completed → merged)"}),c.jsx("button",{disabled:r.status!=="merged",title:r.status!=="merged"?"仅 merged 可提 PR":"",onClick:()=>i.doAction("pr"),children:"提 PR(须 merged)"}),S?c.jsx("button",{onClick:()=>i.setForkVisible(!0),children:"分支"}):null,c.jsx("button",{onClick:i.taskCost,children:"查成本"}),c.jsxs("span",{className:"muted",children:[i.actionMsg," ",i.actionReasons]})]}),i.forkVisible?c.jsxs("div",{children:[c.jsx("input",{type:"text",placeholder:"分支首轮消息(必填,带历史的新会话)",style:{width:"100%",boxSizing:"border-box",margin:"6px 0"},value:h,onChange:A=>f(A.target.value)}),c.jsxs(wt,{children:[c.jsx("button",{className:"seal",onClick:async()=>{await i.forkTask(h),f("")},children:"创建分支任务"}),c.jsx("span",{className:"muted",children:i.forkMsg})]})]}):null]})}function bg(){const r=Zt().currentTask,[h,f]=d.useState(""),[S,N]=d.useState(null),[A,p]=d.useState("未开始"),[H,O]=d.useState(""),[Y,j]=d.useState(!1),w=d.useRef(null),X=d.useRef(null),V=d.useCallback(async()=>{if(r)try{const it=await I(K.taskBrowserState(r.id));N(it),O("")}catch(it){const Q=it instanceof Error?it.message:String(it);Q.includes("503")?N(null):O(Q)}},[r]);d.useEffect(()=>{var it;if(f(""),N(null),p("未开始"),O(""),j(!1),(it=w.current)==null||it.abort(),!!r)return V(),()=>{var Q;(Q=w.current)==null||Q.abort()}},[r,V]),d.useEffect(()=>{if(!r||Y)return;const it=setInterval(()=>void V(),5e3);return()=>clearInterval(it)},[r,Y,V]);const at=d.useCallback(async()=>{var Q;if(!r)return;(Q=w.current)==null||Q.abort();const it=new AbortController;w.current=it,j(!0),p("连接中…"),O("");try{const rt=await fetch(K.taskBrowserStream(r.id),{headers:{"X-API-Key":sl()},signal:it.signal});if(!rt.ok||!rt.body){const kt=await rt.json().catch(()=>null);throw new Error(kt&&kt.error||"HTTP "+rt.status)}p("直播中");const Ut=rt.body.getReader(),Qt=new TextDecoder;let Nt="";for(;;){const{done:kt,value:B}=await Ut.read();if(kt)break;Nt+=Qt.decode(B,{stream:!0});let ot=Nt.indexOf(` `);for(;ot>=0;){const st=Nt.slice(0,ot);Nt=Nt.slice(ot+2);for(const q of st.split(` `))if(q.startsWith("data: "))try{const C=JSON.parse(q.slice(6));C.image&&f("data:image/jpeg;base64,"+C.image);const lt={};C.holder&&(lt.holder=C.holder),C.url&&(lt.url=C.url),C.title!==void 0&&(lt.title=C.title),Object.keys(lt).length>0&&N(gt=>({...gt||{},...lt}))}catch{}ot=Nt.indexOf(` -`)}}p("流已断开")}catch(rt){if(rt.name==="AbortError")return;O(rt instanceof Error?rt.message:String(rt)),p("未开始")}finally{j(!1)}},[r]),X=d.useCallback(()=>{var it;(it=k.current)==null||it.abort(),j(!1),p("已停止")},[]),vt=d.useCallback(async it=>{if(r)try{const Q=await I(Z.taskBrowserControl(r.id),"POST",{holder:it});N(Q),O("")}catch(Q){O(Q instanceof Error?Q.message:String(Q))}},[r]),bt=d.useCallback(async it=>{if(!r||(S==null?void 0:S.holder)!=="user"||!K.current)return;const Q=K.current.getBoundingClientRect(),rt=Math.round((it.clientX-Q.left)/Q.width*1280),Ut=Math.round((it.clientY-Q.top)/Q.height*800);try{await I(Z.taskBrowserInput(r.id),"POST",{type:"mouse_click",x:rt,y:Ut})}catch(Qt){O(Qt instanceof Error?Qt.message:String(Qt))}},[r,S]),zt=d.useCallback(async it=>{if(!(!r||(S==null?void 0:S.holder)!=="user")){it.preventDefault();try{it.key.length===1?await I(Z.taskBrowserInput(r.id),"POST",{type:"type",text:it.key}):await I(Z.taskBrowserInput(r.id),"POST",{type:"key",key:it.key})}catch(Q){O(Q instanceof Error?Q.message:String(Q))}}},[r,S]);if(!r)return c.jsx("div",{className:"muted",children:"点任务行查看详情"});const J=(S==null?void 0:S.holder)||"—",Rt=S!==null;return c.jsxs("div",{children:[c.jsxs("div",{style:{display:"flex",gap:8,flexWrap:"wrap",alignItems:"center"},children:[c.jsxs("span",{children:["状态 ",c.jsx("b",{children:A})]}),c.jsxs("span",{className:"muted",children:["会话 ",Rt?"活跃":"未激活(轮次结束即消失)"]}),c.jsxs("span",{className:"muted",children:["控制权 ",J]}),S!=null&&S.url?c.jsx("span",{className:"muted",title:S.url,children:S.url.slice(0,80)}):null]}),c.jsxs("div",{style:{display:"flex",gap:8,flexWrap:"wrap",marginTop:8},children:[Y?c.jsx("button",{type:"button",onClick:X,children:"停止观看"}):c.jsx("button",{type:"button",onClick:()=>void at(),children:"开始观看"}),c.jsx("button",{type:"button",onClick:()=>void L(),children:"刷新状态"}),J!=="user"?c.jsx("button",{type:"button",onClick:()=>void vt("user"),disabled:!Rt,children:"接管"}):c.jsx("button",{type:"button",onClick:()=>void vt("agent"),children:"交还给 Agent"})]}),H?c.jsx("div",{className:"muted",style:{marginTop:8},children:H}):null,J==="user"?c.jsx("div",{className:"muted",style:{marginTop:8},children:"你已接管:点画面即点击,键盘输入直达页面。交还后 Agent 续跑前会先快照确认你的改动。"}):null,c.jsx("div",{style:{marginTop:8},children:h?c.jsx("img",{ref:K,src:h,alt:"浏览器实时画面",tabIndex:0,onClick:it=>void bt(it),onKeyDown:it=>void zt(it),style:{width:"100%",maxWidth:1280,cursor:J==="user"?"crosshair":"default",border:"1px solid var(--border, #ccc)"}}):c.jsx("div",{className:"muted",children:Rt?"点“开始观看”接入画面流(接管后点画面即点击)":"浏览器会话未激活:任务本轮未开浏览器,或轮次已结束。"})})]})}function xg(){const i=Zt(),[r,h]=d.useState("uncommittedChanges"),[f,S]=d.useState(""),[N,A]=d.useState(""),[p,H]=d.useState("");return c.jsxs(c.Fragment,{children:[c.jsx("h3",{children:"评审队列"}),c.jsxs("select",{"aria-label":"评审目标",value:r,onChange:O=>h(O.target.value),children:[c.jsx("option",{value:"uncommittedChanges",children:"未提交改动(工作区)"}),c.jsx("option",{value:"baseBranch",children:"与分支的差异"}),c.jsx("option",{value:"commit",children:"指定提交"}),c.jsx("option",{value:"custom",children:"自定义评审指令"})]}),c.jsx("input",{className:"stacked",placeholder:"与分支的差异用:分支名(如 main)",style:{width:"100%"},value:f,onChange:O=>S(O.target.value)}),c.jsx("input",{className:"stacked",placeholder:"指定提交用:提交 sha",style:{width:"100%"},value:N,onChange:O=>A(O.target.value)}),c.jsx("textarea",{placeholder:"自定义评审指令用:评审指令正文",value:p,onChange:O=>H(O.target.value)}),c.jsxs(wt,{children:[c.jsx("button",{className:"primary",onClick:()=>void i.postReview({target_type:r,branch:f.trim()||void 0,sha:N.trim()||void 0,instructions:p.trim()||void 0}),children:"登记评审需求"}),c.jsx("button",{onClick:i.refreshReviews,children:"刷新队列"}),c.jsx("span",{className:"muted",children:i.reviewMsg})]}),c.jsx("div",{className:"muted",children:"本基线只登记评审需求(requested),不自动跑评审;评审是否执行、结果如何,以评审队列里的记录为准。"}),i.reviewError?c.jsx("div",{className:"muted",children:i.reviewError}):i.reviews.length===0?c.jsx("div",{className:"muted",children:"点任务行查看详情后,点“刷新队列”查看评审记录"}):c.jsx(cu,{children:i.reviews.map(O=>{let Y=O.target_type||"";return O.branch&&(Y+=":"+O.branch),O.sha&&(Y+=":"+String(O.sha).slice(0,12)),O.instructions&&(Y+=":"+String(O.instructions).slice(0,80)),c.jsxs("li",{children:[c.jsxs("span",{className:"row-main",children:[c.jsx("b",{children:"评审"})," ",Ne(O.id)," | ",Y," | ",c.jsx("span",{className:"st-"+(O.status||""),children:O.status}),O.created_at?" | "+Ya(O.created_at):"",c.jsx("br",{}),O.findings?String(O.findings).slice(0,1e3):c.jsx("span",{className:"muted",children:"(暂无 findings:评审尚未执行或尚未写回)"})]}),c.jsx("button",{onClick:()=>i.submitFindings(O.id),children:"写 findings"})]},O.id)})})]})}function jg(){const i=Zt();return i.currentTask?i.currentTask.coordinator_parts?i.coordChildren.length===0?c.jsx("div",{className:"muted",children:"(子任务尚未创建)"}):c.jsx(cu,{children:i.coordChildren.map(r=>c.jsx("li",{children:c.jsxs("span",{className:"row-main",children:["分工 ",c.jsx("b",{children:r.coordinator_part||""})," | 状态 ",c.jsx("span",{className:"st-"+r.status,children:r.status})," | ",Ne(r.id)," | ",String(r.prompt||"").slice(0,60)]})},r.id))}):c.jsx("div",{className:"muted",children:"(非协调员任务)"}):c.jsx("div",{className:"muted",children:"点任务行查看详情后,这里显示协调员的子任务"})}function Tg(){const i=Zt();if(!i.currentTask)return c.jsx("div",{className:"muted",children:"点任务行查看详情后,这里显示子代理链路"});if(i.agents.length===0)return c.jsxs("div",{className:"muted",children:["(暂无子代理)",i.agentsNote?c.jsx("span",{className:"err",children:i.agentsNote}):null]});const r={main:"主任务",delegate:"委派子任务",model:"模型子代理"},h={running:"进行中",completed:"已完成",failed:"失败",interrupted:"已中断",unknown:"未知"};return c.jsx(cu,{children:i.agents.map((f,S)=>c.jsx("li",{children:c.jsxs("span",{className:"row-main",children:[c.jsxs("b",{children:[r[f.kind||""]||f.kind||"",":"]}),f.name||""," ",c.jsx("span",{className:"st-"+(f.status||""),children:h[f.status||""]||f.status||"?"})," | 过程调用 "+(f.calls?f.calls.length:0)+" 条",f.updated_ts?" | 最近活动 "+Ya(f.updated_ts/1e3):"",f.prompt?c.jsxs(c.Fragment,{children:[c.jsx("br",{}),c.jsxs("span",{className:"muted",children:["任务:",f.prompt]})]}):null,f.calls&&f.calls.length?c.jsxs(c.Fragment,{children:[c.jsx("br",{}),f.calls.slice(-50).map((N,A)=>c.jsx("div",{children:vo(N)},A))]}):c.jsxs(c.Fragment,{children:[c.jsx("br",{}),c.jsx("span",{className:"muted",children:"(暂无过程调用)"})]})]})},S))})}function _g(){const i=Zt();return c.jsxs(c.Fragment,{children:[c.jsxs(wt,{children:[c.jsx("button",{onClick:i.refreshApprovals,children:"刷新审批队列"}),c.jsx("span",{className:"muted",children:i.approvalMsg})]}),c.jsx("div",{className:"muted",children:"待审批项需人工点记录允许或记录拒绝;超时默认拒绝。当前版本只留回执,不拦截实时行为(实时请求的事前拦截待 host 接入后生效,在此之前实时行为不变)。"}),c.jsx(xl,{empty:"(暂无审批项)",items:i.approvals.map(r=>c.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)+" "+Ya(r.decided_at):"",r.status==="pending"?c.jsxs(c.Fragment,{children:[" ",c.jsx("button",{onClick:()=>i.decideApproval(r.id,"approved"),children:"记录允许"})," ",c.jsx("button",{onClick:()=>i.decideApproval(r.id,"denied"),children:"记录拒绝"})]}):null]},r.id))})]})}function Eg(){const i=Zt(),[r,h]=d.useState(""),[f,S]=d.useState("");return c.jsxs(c.Fragment,{children:[c.jsx("input",{placeholder:"目标任务 id(与本任务同项目;对方运行中排队执行、已终态则续跑复活,绝不打断当前轮)",style:{width:"100%"},value:r,onChange:N=>h(N.target.value)}),c.jsx("textarea",{placeholder:"消息正文(以本任务名义发出;对方 agent 会看到发送方任务 id,可照此回消息)",value:f,onChange:N=>S(N.target.value)}),c.jsxs(wt,{children:[c.jsx("button",{onClick:async()=>{await i.postPeer("queued",r,f),S("")},children:"排队发给对方"}),c.jsx("button",{className:"primary",onClick:async()=>{await i.postPeer("direct",r,f),S("")},children:"直接发送"}),c.jsx("span",{className:"muted",children:i.peerMsg})]}),c.jsx(xl,{empty:"(本任务尚未发出任务间消息)",items:i.peerMessages.map((N,A)=>c.jsxs("span",{className:"row-main",children:["[发给 ",String(N.task_id).slice(0,8),"|",N.mode,"|",N.status,"] ",String(N.body||"").slice(0,120)]},A))})]})}function Ng(){const i=Zt(),[r,h]=d.useState(""),f=i.currentTask?["completed","failed","interrupted"].includes(i.currentTask.status):!1;return c.jsxs(c.Fragment,{children:[c.jsx("div",{className:"muted",children:i.threadText||"点任务行查看详情后,这里显示线程元数据"}),c.jsxs(wt,{children:[c.jsx("input",{type:"text",placeholder:"新线程名",value:r,onChange:S=>h(S.target.value)}),c.jsx("button",{disabled:!f,onClick:()=>i.threadAction("rename",r),children:"重命名"}),c.jsx("button",{disabled:!f,onClick:()=>i.threadAction("archive",""),children:"归档"}),c.jsx("button",{disabled:!f,onClick:()=>i.threadAction("unarchive",""),children:"取消归档"}),c.jsx("button",{disabled:!f,onClick:()=>i.threadAction("compact",""),children:"压缩"}),c.jsx("span",{className:"muted",children:i.threadGateNote}),c.jsx("span",{className:"muted",children:i.threadMsg})]}),c.jsx(xl,{empty:"暂无其他线程",items:i.threadList.map((S,N)=>c.jsxs("span",{className:"row-main",children:[S.name||S.thread_name||S.id||""," [",S.id||"","]",S.archived?" [已归档]":"",S.cwd?" "+S.cwd:""]},N))}),c.jsx("div",{className:"muted",children:"限制:Docker/异机任务线程操作一律 409;merged/merge-failed 不可改;turn/steer 与 review/start 不在本批。"})]})}const Cg=[["overview","概览"],["collab","协作"],["review","评审与审批"],["threads","线程"],["browser","浏览器"]];function Ag(){const i=Zt(),r=i.currentTask,[h,f]=d.useState("overview");if(!r)return c.jsx(It,{id:"nav-detail",title:"任务详情",children:c.jsx("div",{className:"muted",children:"点任务行查看详情"})});const[S,N]=Wh(r),[A,p]=$h(r),H=Fh(r),O=i.costSummary,Y=r.plan?"计划模式(只读)":r.goal_mode?r.no_time_limit?"goal 模式无敌版(不限时)":"goal 模式(不限轮次,模型宣告完成)":r.verify_command?"goal 模式(旧语义,验收命令)":null;return c.jsxs("div",{className:"detail-stack",id:"nav-detail",children:[c.jsx("nav",{className:"detail-tabs","aria-label":"任务详情页签",children:Cg.map(([j,k])=>c.jsx("button",{type:"button",className:h===j?"active":"",onClick:()=>f(j),children:k},j))}),h==="overview"?c.jsxs(c.Fragment,{children:[c.jsxs(It,{title:"任务详情",children:[c.jsxs("div",{style:{display:"flex",alignItems:"center",gap:8,flexWrap:"wrap"},children:[c.jsx("span",{className:"issue-first",title:"任务首字:"+H,"aria-hidden":"true",children:H}),c.jsxs("span",{children:["状态 ",c.jsx("b",{className:"st-"+r.status,children:r.status}),"(",Fy[r.status]||"未知状态",")"]}),c.jsxs("span",{className:"muted",children:["更新 ",Ya(r.updated_at)]})]}),c.jsxs("div",{className:"detail-cards",children:[c.jsxs("div",{className:"detail-card",title:N,children:[c.jsx("div",{className:"detail-card-label",children:"耗时"}),c.jsx("div",{className:"detail-card-value",children:S})]}),c.jsxs("div",{className:"detail-card",title:p,children:[c.jsx("div",{className:"detail-card-label",children:"token"}),c.jsx("div",{className:"detail-card-value",children:A})]}),c.jsxs("div",{className:"detail-card",title:"LLM 请求数 = GET /tasks/{id}/cost 的 llm_requests,即 cost_records 的 completions 之和:host.py 每收到一次 thread/tokenUsage/updated(一次上游补全)计 1,worker 每轮终局记账时累加;估算行(无真实用量)计 0;部署前已记账的老任务没有 completions 列,显示 0 而非回填数",children:[c.jsx("div",{className:"detail-card-label",children:"LLM 请求数"}),c.jsx("div",{className:"detail-card-value",children:O===void 0?"加载中…":O===null?"—":(O.llm_requests??0).toLocaleString()}),O===void 0?c.jsx("div",{className:"muted",children:"成本加载中…"}):O===null?c.jsx("div",{className:"muted",children:"成本明细加载失败,LLM 请求数不可用"}):c.jsxs("div",{className:"muted",children:["上游补全次数之和| 轮数 ",O.turns??0," | fallback ",O.fallback_count??0]})]}),c.jsxs("div",{className:"detail-card",title:"成本明细:GET /tasks/{id}/cost 聚合;美元只计有价行,无价 token 单列;缓存是输入 token 的子集,不另计",children:[c.jsx("div",{className:"detail-card-label",children:"成本"}),c.jsx("div",{className:"detail-card-value",children:O===void 0?"加载中…":O===null?"—":fg(O.usd_micros)}),O===void 0?c.jsx("div",{className:"muted",children:"成本加载中…"}):O===null?c.jsx("div",{className:"muted",children:"成本明细加载失败(“查成本”按钮仍可手动拉取原始 JSON)"}):c.jsxs("div",{className:"muted",children:["token ",(O.total_tokens??0).toLocaleString(),"(实际 ",(O.actual_tokens??0).toLocaleString()," / 估算 ",(O.estimated_tokens??0).toLocaleString(),",缓存 ",(O.cached_input_tokens??0).toLocaleString(),",无价 ",(O.unpriced_actual_tokens??0).toLocaleString(),")| fallback ",O.fallback_count??0]})]})]})]}),c.jsx(It,{title:"基本信息",children:c.jsxs("dl",{className:"detail-kv",children:[c.jsxs("div",{children:[c.jsx("dt",{children:"任务"}),c.jsx("dd",{children:r.id})]}),c.jsxs("div",{children:[c.jsx("dt",{children:"turn"}),c.jsx("dd",{children:Ne(r.turn_id)})]}),c.jsxs("div",{children:[c.jsx("dt",{children:"root turn"}),c.jsx("dd",{children:Ne(r.root_turn_id)})]}),c.jsxs("div",{children:[c.jsx("dt",{children:"executor"}),c.jsx("dd",{children:r.executor||""})]}),c.jsxs("div",{children:[c.jsx("dt",{children:"主机"}),c.jsx("dd",{children:r.worktree_host||""})]}),c.jsxs("div",{children:[c.jsx("dt",{children:"模型"}),c.jsx("dd",{children:r.model||"默认"})]}),c.jsxs("div",{children:[c.jsx("dt",{children:"强度"}),c.jsx("dd",{children:r.effort||"默认"})]}),r.child_model||r.child_effort?c.jsxs("div",{children:[c.jsx("dt",{children:"子任务默认"}),c.jsx("dd",{children:(r.child_model||"跟随本任务")+" / "+(r.child_effort||"跟随本任务")})]}):null,c.jsxs("div",{children:[c.jsx("dt",{children:"权限"}),c.jsx("dd",{children:r.approval||"默认"})]}),c.jsxs("div",{children:[c.jsx("dt",{children:"项目"}),c.jsx("dd",{children:Ne(r.project_id)})]}),Y?c.jsxs("div",{children:[c.jsx("dt",{children:"模式"}),c.jsx("dd",{children:Y})]}):null,r.forked_from?c.jsxs("div",{children:[c.jsx("dt",{children:"分支自"}),c.jsx("dd",{children:Ne(r.forked_from)})]}):null,r.coordinator_parts?c.jsxs("div",{children:[c.jsx("dt",{children:"协调员"}),c.jsxs("dd",{children:[r.coordinator_parts.length," 个子任务(",r.coordinator_parts.map(j=>j.name).join("、"),")"]})]}):null,r.parent_task_id?c.jsxs("div",{children:[c.jsx("dt",{children:"协调子任务"}),c.jsxs("dd",{children:["父任务 ",Ne(r.parent_task_id),r.coordinator_part?"("+r.coordinator_part+")":""]})]}):null,r.attachments&&r.attachments.length?c.jsxs("div",{children:[c.jsx("dt",{children:"附件"}),c.jsx("dd",{children:r.attachments.join("、")})]}):null,r.pr_url?c.jsxs("div",{children:[c.jsx("dt",{children:"PR"}),c.jsx("dd",{children:c.jsxs("a",{href:r.pr_url,target:"_blank",rel:"noopener noreferrer",children:["PR #",r.pr_number]})})]}):null]})}),c.jsx(It,{title:"prompt",children:c.jsx("div",{style:{whiteSpace:"pre-wrap",overflowWrap:"anywhere"},children:r.prompt||"(无 prompt)"})}),c.jsxs(It,{title:"操作与结果",children:[c.jsx(Sg,{}),c.jsx("pre",{children:i.detailBody||"(暂无 result/error 输出)"}),i.costBox?c.jsx("pre",{children:i.costBox}):null]})]}):h==="collab"?c.jsxs(c.Fragment,{children:[c.jsx(It,{title:"协调子任务",children:c.jsx(jg,{})}),c.jsx(It,{title:"子代理链路",children:c.jsx(Tg,{})}),c.jsx(It,{title:"给其他任务发消息",children:c.jsx(Eg,{})})]}):h==="review"?c.jsxs(c.Fragment,{children:[c.jsx(It,{title:"评审队列",children:c.jsx(xg,{})}),c.jsx(It,{title:"运行时审批队列",children:c.jsx(_g,{})})]}):h==="browser"?c.jsx(c.Fragment,{children:c.jsx(It,{title:"浏览器远控",children:c.jsx(bg,{})})}):c.jsx(c.Fragment,{children:c.jsx(It,{title:"线程",children:c.jsx(Ng,{})})})]})}function Og(){const i=Zt(),[r,h]=d.useState(""),[f,S]=d.useState(""),[N,A]=d.useState([]),[p,H]=d.useState(null),[O,Y]=d.useState(!1),[j,k]=d.useState(""),[K,L]=d.useState(""),at=d.useCallback(async()=>{if(!i.keySaved){A([]);return}try{const J=await I(Z.userKeys);A(J.keys||[]),L("")}catch(J){L(J instanceof Error?J.message:"加载 key 列表失败")}},[i.keySaved]);d.useEffect(()=>{at()},[at]);const X=async()=>{k(""),L(""),Y(!1);try{const J=await I(Z.userKeys,"POST",{label:f.trim()||"api-key"});H(J),S(""),k("新 key 已生成,只显示一次:复制后请妥善保存。"),await at()}catch(J){L(J instanceof Error?J.message:"生成 key 失败")}},vt=async()=>{if(p)try{await navigator.clipboard.writeText(p.api_key),Y(!0)}catch{L("复制失败:请手动选中上方 key 文本复制")}},bt=()=>{p&&(i.saveKeyInput(p.api_key),H(null),k("已存为当前浏览器 key(原有 key 未被撤销,需要时可单独撤销)。"))},zt=async J=>{const Rt=(()=>{try{return sl().slice(-4)}catch{return""}})(),it=J.id==="legacy"?"(主 key:撤销后当前浏览器保存的 key 也可能随之失效,需重新登录拿新 key)":J.hint&&J.hint===Rt?"(这就是本浏览器当前在用的 key,撤销后本页会立刻未连接)":"";if(window.confirm(`撤销 key「${J.label}」(后 4 位 ${J.hint||"无"})吗?${it}撤销不可恢复。`)){k(""),L("");try{await I(Z.userKey(J.id),"DELETE"),k(`已撤销 key「${J.label}」。`),await at()}catch(Q){L(Q instanceof Error?Q.message:"撤销失败")}}};return c.jsxs(It,{id:"nav-key",title:"API Key",children:[c.jsxs(wt,{children:[c.jsx("input",{type:"password",placeholder:"粘贴你的 X-API-Key(与调 API 用的同一个)",autoComplete:"off",value:r,onChange:J=>h(J.target.value)}),c.jsx("button",{className:"primary",onClick:()=>{i.saveKeyInput(r),h("")},children:"保存到本浏览器"}),c.jsx("button",{onClick:i.clearKeyInput,children:"清除"}),c.jsx("span",{className:"muted",children:i.keyState})]}),c.jsx("div",{children:c.jsx("span",{className:"muted",children:i.quotaText})}),!i.keySaved&&c.jsx("div",{children:c.jsx("span",{className:"muted",children:"先粘贴并保存已有 key,再生成或管理 key(生成接口本身也要用已有 key 鉴权)。"})}),i.keySaved&&c.jsxs(c.Fragment,{children:[c.jsxs(wt,{children:[c.jsx("input",{placeholder:"新 key 备注(可选,默认 api-key,如 harness2-temp)",autoComplete:"off",value:f,onChange:J=>S(J.target.value)}),c.jsx("button",{className:"primary",onClick:()=>void X(),children:"生成新 key"}),c.jsx("button",{onClick:()=>void at(),children:"刷新列表"})]}),p&&c.jsxs("div",{children:[c.jsx("div",{children:c.jsxs("span",{className:"muted",children:["新 key(",p.label,",后 4 位 ",p.hint,"):只显示一次,关闭后无法再查看。"]})}),c.jsxs(wt,{children:[c.jsx("input",{type:"text",readOnly:!0,value:p.api_key,onFocus:J=>J.target.select()}),c.jsx("button",{className:"primary",onClick:()=>void vt(),children:O?"已复制":"复制"}),c.jsx("button",{onClick:bt,children:"存为当前浏览器 key"}),c.jsx("button",{onClick:()=>H(null),children:"关闭(不再显示)"})]})]}),j&&c.jsx("div",{children:c.jsx("span",{className:"muted",children:j})}),K&&c.jsx("div",{children:c.jsx("span",{children:K})}),c.jsxs("div",{className:"api-key-list",children:[N.length===0&&c.jsx("span",{className:"muted",children:"暂无 key(或列表加载失败,见上方报错)。"}),N.map(J=>c.jsxs("div",{children:[c.jsx("span",{children:J.label})," ",c.jsxs("span",{className:"muted",children:["后 4 位 ",J.hint||"无"," · 创建 ",Ya(J.created_at)," · 最近使用 ",J.last_used_at?Ya(J.last_used_at):"未使用过"]})," ",J.revoked_at?c.jsxs("span",{className:"muted",children:["已撤销(",Ya(J.revoked_at),")"]}):c.jsx("button",{onClick:()=>void zt(J),children:"撤销"})]},J.id))]})]})]})}function Mg(){const i=Zt();return c.jsxs(It,{id:"adminCard",title:c.jsxs(c.Fragment,{children:["管理区 ",c.jsx("span",{className:"muted",children:"(仅全局管理员)"})]}),children:[c.jsx("div",{className:"muted",children:i.adminGate}),i.adminBody?c.jsxs(c.Fragment,{children:[c.jsxs(wt,{children:[c.jsx("input",{type:"text",placeholder:"要查配额的用户 id",value:i.adminUserId,onChange:r=>i.setAdminUserId(r.target.value)}),c.jsx("button",{onClick:i.adminQuota,children:"查该用户配额"})]}),c.jsxs(wt,{children:[c.jsx("button",{onClick:i.adminSweep,children:"手动触发 sweep(清理陈旧 running 任务)"}),c.jsx("button",{onClick:i.adminBackup,children:"手动触发备份"})]}),c.jsx("div",{className:"muted",children:i.adminResult})]}):null]})}function zg(){const i=Zt(),[r,h]=d.useState(""),[f,S]=d.useState(""),[N,A]=d.useState("");return c.jsxs(It,{id:"nav-projects",title:"项目",children:[c.jsxs(wt,{children:[c.jsxs("select",{"aria-label":"项目",value:i.projectId,onChange:p=>i.selectProject(p.target.value),children:[i.projects.length===0?c.jsx("option",{value:"",children:"(先加载项目)"}):null,i.projects.map(p=>c.jsxs("option",{value:p.id,children:[p.name," (",Ne(p.id),")"]},p.id))]}),c.jsx("button",{onClick:i.refreshProjects,children:"刷新"})]}),c.jsxs(wt,{children:[c.jsx("input",{type:"text",placeholder:"新项目名",value:r,onChange:p=>h(p.target.value)}),c.jsxs("select",{"aria-label":"从 GitHub 仓库选",value:f,onChange:p=>{S(p.target.value),p.target.value&&A(p.target.value)},children:[c.jsx("option",{value:"",children:"(从 GitHub App 安装仓库里选,或手动输入)"}),i.githubRepos.map(p=>c.jsx("option",{value:p.clone_url,children:p.repo_full_name},p.clone_url))]}),c.jsx("input",{type:"text",placeholder:"repo_url(可选)",value:N,onChange:p=>A(p.target.value)}),c.jsx("button",{onClick:async()=>{await i.createProject(r,N),h(""),A(""),S("")},children:"新建项目"})]}),c.jsx("span",{className:"muted",children:i.projectMsg})]})}function Rg(){const i=Zt(),[r,h]=d.useState(""),[f,S]=d.useState("contributor"),N=i.projects.find(A=>A.id===i.projectId);return c.jsxs(It,{title:"项目成员",children:[N?c.jsxs("div",{className:"muted",children:[N.name," | ",N.id," | 仓库 ",N.repo_url||"未绑定"," | 我的角色 ",N.my_role||"未知"]}):c.jsx("div",{className:"muted",children:"先选项目"}),c.jsxs(wt,{children:[c.jsx("input",{type:"text",placeholder:"成员 user_id 或用户名",value:r,onChange:A=>h(A.target.value)}),c.jsxs("select",{"aria-label":"邀请角色",value:f,onChange:A=>S(A.target.value),children:[c.jsx("option",{value:"viewer",children:"viewer(只读)"}),c.jsx("option",{value:"contributor",children:"contributor(可建任务)"}),c.jsx("option",{value:"maintainer",children:"maintainer(可批合并)"}),c.jsx("option",{value:"owner",children:"owner(可管项目)"})]}),c.jsx("button",{onClick:async()=>{await i.inviteMember(r,f),h("")},children:"邀请成员"}),c.jsx("button",{onClick:i.refreshMembers,children:"刷新成员"})]}),i.memberError?c.jsx("div",{className:"muted",children:i.memberError}):i.members.length===0?c.jsx("div",{className:"muted",children:"先选项目"}):c.jsx(cu,{children:i.members.map(A=>{const p=(A.username||"")+(A.username?"("+String(A.user_id).slice(0,8)+")":String(A.user_id).slice(0,8));return c.jsxs("li",{children:[c.jsx("span",{className:"row-main",children:p}),c.jsx("select",{"aria-label":"成员角色",value:A.role||"viewer",onChange:H=>void i.changeMemberRole(A.user_id,H.target.value),children:Wy.map(H=>c.jsx("option",{value:H,children:H},H))})]},A.user_id)})}),c.jsx("span",{className:"muted",children:i.memberMsg})]})}function Dg(){const i=Zt(),[r,h]=d.useState(""),[f,S]=d.useState(""),[N,A]=d.useState("");return c.jsxs(It,{id:"nav-env",title:c.jsxs(c.Fragment,{children:["环境 ",c.jsx("span",{className:"muted",children:"(选、建、管:当前项目的基准检出)"})]}),children:[c.jsxs(wt,{children:[c.jsx("button",{onClick:i.refreshEnvs,children:"刷新"}),c.jsx("span",{className:"muted",children:i.envCount})]}),i.envs.length===0?c.jsx("div",{className:"muted",children:"先选项目"}):c.jsx(cu,{children:i.envs.map(p=>c.jsxs("li",{children:[c.jsxs("span",{className:"row-main",children:[p.name,"(",Ne(p.id),") / 分支 ",p.branch||"默认分支"," / 执行器 ",p.executor||"不限"," / 状态 ",p.status,p.status==="failed"&&p.error_text?" / 失败原因:"+p.error_text:""]}),p.status==="archived"?null:c.jsx("button",{onClick:()=>void i.archiveEnv(p.id),children:"归档"})]},p.id))}),c.jsxs(wt,{children:[c.jsx("input",{type:"text",placeholder:"新环境名",value:r,onChange:p=>h(p.target.value)}),c.jsx("input",{type:"text",placeholder:"分支(可选,空=默认分支)",value:f,onChange:p=>S(p.target.value)}),c.jsxs("select",{"aria-label":"新环境执行器",value:N,onChange:p=>A(p.target.value),children:[c.jsx("option",{value:"",children:"执行器:不限"}),c.jsx("option",{value:"local",children:"local"}),c.jsx("option",{value:"docker",children:"docker"})]}),c.jsx("button",{onClick:async()=>{await i.createEnv(r,f,N),h(""),S("")},children:"新建环境"})]}),c.jsx("span",{className:"muted",children:i.envMsg})]})}function Ug(){const i=Zt(),[r,h]=d.useState("");return c.jsxs(It,{title:"仓库与环境上下文",children:[c.jsx("div",{className:"muted",children:i.envRepoLine||"先选项目"}),c.jsx("div",{className:"muted",children:i.envCount}),i.envRepoBar?c.jsxs(wt,{children:[c.jsxs("select",{"aria-label":"补仓库",value:r,onChange:f=>h(f.target.value),children:[c.jsx("option",{value:"",children:"(从 GitHub App 安装仓库里选)"}),i.githubRepos.map(f=>c.jsx("option",{value:f.clone_url,children:f.repo_full_name},f.clone_url))]}),c.jsx("button",{onClick:()=>void i.saveEnvRepo(r),children:"保存仓库"})]}):null,c.jsx("span",{className:"muted",children:i.envRepoMsg})]})}function Hg(){const i=Zt();return c.jsxs(It,{id:"nav-workers",title:"Workers",children:[c.jsx(wt,{children:c.jsx("button",{onClick:i.refreshWorkers,children:"刷新"})}),i.workersError?c.jsx("div",{className:"muted",children:i.workersError}):i.workers===null?c.jsx("div",{className:"muted",children:i.workersSummary||"未加载"}):i.workers.length===0?c.jsx("div",{className:"muted",children:"无 worker 注册"}):c.jsx(cu,{children:i.workers.map((r,h)=>{const f=r.running===void 0||r.running===null?"?":r.running,S=r.capacity===void 0||r.capacity===null?"?":r.capacity,N=Jh(r),A=r.alive!==void 0&&r.alive!==null?!!r.alive:N.age!==null&&N.age<=120,p=A?" / 在线":" / 离线(占用为上次上报值)";return c.jsx("li",{className:A?"is-online":"is-offline",children:c.jsxs("span",{className:"row-main",children:[r.worker_id||r.id||"?"," / ",r.executor||""," / 占用 ",f,"/",S,p," / 最后心跳 ",N.text]})},h)})})]})}function wg(){const i=Zt();return c.jsxs(It,{title:"健康与配额",children:[c.jsxs(wt,{children:[c.jsx("span",{className:"muted",children:i.healthText}),c.jsx("button",{onClick:i.refreshHealth,children:"刷新"})]}),c.jsx("div",{children:c.jsx("span",{className:"muted",children:i.quotaText})}),c.jsx("div",{className:"muted",children:i.workersSummary})]})}function kg(){const i=Zt();return c.jsxs(It,{id:"nav-skills",title:"技能与 MCP",children:[c.jsx("div",{className:"muted",children:"反映宿主租户 home,容器内 home 可能不同;重载只在 schema 枚举里,当前 pin 的二进制拒绝时原样 502;OAuth 只发起登录,不代表登录完成。"}),c.jsxs(wt,{children:[c.jsx("button",{onClick:i.refreshSkills,children:"刷新"}),c.jsx("span",{className:"muted",children:i.skillMsg})]}),c.jsx("h3",{children:"技能"}),i.skillError?c.jsx("div",{className:"muted",children:i.skillError}):c.jsx(xl,{empty:"暂无技能",items:i.skills.map((r,h)=>c.jsxs("span",{className:"row-main",children:[r.name||r.id||"",r.description?" - "+r.description:"",r.detail?" - "+r.detail:""]},h))}),c.jsx("h3",{children:"应用"}),c.jsx(xl,{empty:"暂无应用",items:i.apps.map((r,h)=>c.jsxs("span",{className:"row-main",children:[r.name||r.id||"",r.description?" - "+r.description:""]},h))}),c.jsx("h3",{children:"MCP 服务"}),c.jsx(xl,{empty:"暂无 MCP 服务",items:i.mcpServers.map((r,h)=>{const f=r.detail||r.details||r.state||"";return c.jsxs("span",{className:"row-main",children:[r.name||r.id||""," | 状态 ",r.status||"",f?" | "+f:""]},h)})})]})}function Bg(){const i=Zt(),[r,h]=d.useState("");return c.jsxs(It,{title:"MCP 操作",children:[c.jsxs(wt,{children:[c.jsx("button",{onClick:i.reloadMcp,children:"重载配置"}),c.jsx("span",{className:"muted",children:i.mcpMsg})]}),c.jsxs(wt,{children:[c.jsx("input",{type:"text",placeholder:"MCP 服务名",value:r,onChange:f=>h(f.target.value)}),c.jsx("button",{onClick:()=>void i.mcpOauth(r),children:"发起 OAuth 登录"}),c.jsx("span",{className:"muted",children:i.mcpOauthMsg})]}),i.mcpOauthBox?c.jsx("pre",{children:i.mcpOauthBox}):null]})}function qg(){const i=Zt(),[r,h]=d.useState(""),[f,S]=d.useState(""),[N,A]=d.useState(""),[p,H]=d.useState("");return c.jsxs(c.Fragment,{children:[c.jsx("input",{placeholder:"自动化名称(同项目内启用中的名称唯一)",style:{width:"100%"},value:r,onChange:O=>h(O.target.value)}),c.jsx("textarea",{placeholder:"定时任务内容(创建只登记定义与到期状态;执行由后续执行器经 claim 抢单后建任务,不另起调度器)",value:f,onChange:O=>S(O.target.value)}),c.jsxs(wt,{children:[c.jsx("input",{placeholder:"间隔秒数(默认 86400,最小 60)",style:{width:"40%"},value:N,onChange:O=>A(O.target.value)}),c.jsx("input",{placeholder:"仓库(可选)",style:{width:"40%"},value:p,onChange:O=>H(O.target.value)}),c.jsx("button",{className:"primary",onClick:async()=>{await i.createAutomation(r,f,N,p),h(""),S(""),A(""),H("")},children:"创建自动化"}),c.jsx("button",{onClick:i.refreshAutomations,children:"刷新自动化"}),c.jsx("span",{className:"muted",children:i.autoMsg})]}),c.jsx(xl,{empty:"(暂无自动化)",items:i.automations.map(O=>c.jsxs("span",{className:"row-main",children:["[",O.status,O.due?"|到期":"","] ",O.name,"|每 ",O.interval_seconds," 秒|下次 ",Ya(O.next_run_at),O.status==="active"?c.jsxs(c.Fragment,{children:[" ",c.jsx("button",{onClick:()=>i.cancelAutomation(O.id),children:"取消"})]}):null]},O.id))})]})}function Yg(){var h,f,S,N;const i=Zt(),r=i.triage;return i.triageError?c.jsx("div",{className:"muted",children:i.triageError}):r?c.jsxs(c.Fragment,{children:[c.jsxs("div",{className:"data-group",children:[c.jsxs("b",{children:["到期自动化(",((h=r.counts)==null?void 0:h.automations_due)||0,")"]}),c.jsx(xl,{empty:"(无)",items:(r.automations_due||[]).map((A,p)=>c.jsxs("span",{className:"row-main",children:[A.name,"|每 ",A.interval_seconds," 秒"]},p))})]}),c.jsxs("div",{className:"data-group",children:[c.jsxs("b",{children:["失败/中断任务(",((f=r.counts)==null?void 0:f.failed_tasks)||0,")"]}),c.jsx(xl,{empty:"(无)",items:(r.failed_tasks||[]).map((A,p)=>c.jsxs("span",{className:"row-main",children:[Ne(A.id),"|",A.status,"|",String(A.prompt||"").slice(0,80)]},p))})]}),c.jsxs("div",{className:"data-group",children:[c.jsxs("b",{children:["待处理后续消息(",((S=r.counts)==null?void 0:S.pending_followups)||0,")"]}),c.jsx(xl,{empty:"(无)",items:(r.pending_followups||[]).map((A,p)=>c.jsxs("span",{className:"row-main",children:["任务 ",Ne(A.task_id),"|",String(A.body||"").slice(0,80)]},p))})]}),c.jsxs("div",{className:"data-group",children:[c.jsxs("b",{children:["最近自动化产出(",((N=r.counts)==null?void 0:N.recent_runs)||0,")"]}),c.jsx(xl,{empty:"(无)",items:(r.recent_runs||[]).map((A,p)=>c.jsxs("span",{className:"row-main",children:[Ne(A.automation_id),"|",A.status,A.task_id?"|任务 "+Ne(A.task_id):"",A.task_status?"|"+A.task_status:""]},p))})]})]}):c.jsx("div",{className:"muted",children:"(先选项目)"})}function Gg(){return c.jsx(It,{id:"nav-automations",title:"自动化",children:c.jsx(qg,{})})}function Qg(){const i=Zt();return c.jsxs(It,{id:"nav-triage",title:"分诊收件箱",children:[c.jsx(wt,{children:c.jsx("button",{onClick:i.refreshTriage,children:"刷新分诊"})}),c.jsx(Yg,{})]})}const ho=["pending","in_progress","blocked","completed","cancelled"],Rc={pending:"待办",in_progress:"进行中",blocked:"受阻",completed:"已完成",cancelled:"已取消"},Xg=["low","medium","high"],Lh={low:"低",medium:"中",high:"高"};function Lg(i){return i?new Date(i*1e3).toLocaleString():""}function Vg(){const i=Zt(),[r,h]=d.useState([]),[f,S]=d.useState({}),[N,A]=d.useState(0),[p,H]=d.useState(""),[O,Y]=d.useState(""),[j,k]=d.useState(""),[K,L]=d.useState(""),[at,X]=d.useState(""),[vt,bt]=d.useState(""),[zt,J]=d.useState("medium"),[Rt,it]=d.useState(""),[Q,rt]=d.useState(""),Ut=d.useCallback(async()=>{if(!i.projectId){h([]),S({}),A(0);return}try{let B=Z.projectTodos(i.projectId);const ot=new URLSearchParams;j&&ot.set("status",j),K.trim()&&ot.set("q",K.trim());const st=ot.toString();st&&(B+="?"+st);const q=await I(B);h(q.todos||[]),S(q.counts||{}),A(q.total||0),Y("")}catch(B){Y("待办加载失败:"+((B==null?void 0:B.message)||String(B)))}},[i.projectId,j,K]);d.useEffect(()=>{Ut()},[Ut]);const Qt=async()=>{if(!i.projectId){H("先选项目");return}if(!at.trim()){H("标题必填");return}H("");try{const B={title:at.trim(),description:vt,priority:zt};Rt.trim()&&(B.task_id=Rt.trim()),Q&&(B.due_at=Math.floor(new Date(Q).getTime()/1e3)),await I(Z.projectTodos(i.projectId),"POST",B),X(""),bt(""),it(""),rt(""),H("已创建"),await Ut()}catch(B){H("创建失败:"+((B==null?void 0:B.message)||String(B)))}},Nt=async(B,ot)=>{if(i.projectId)try{await I(Z.projectTodo(i.projectId,B.id),"PATCH",ot),await Ut()}catch(st){Y("待办更新失败:"+((st==null?void 0:st.message)||String(st)))}},kt=async B=>{if(i.projectId&&window.confirm("删除待办“"+B.title+"”?删除后不可恢复(取消请改状态为已取消)。"))try{await I(Z.projectTodo(i.projectId,B.id),"DELETE"),await Ut()}catch(ot){Y("待办删除失败:"+((ot==null?void 0:ot.message)||String(ot)))}};return c.jsxs(It,{id:"nav-todos",title:"项目待办",children:[c.jsx("div",{className:"muted",children:i.projectId?"共 "+N+" 项 | "+ho.map(B=>Rc[B]+" "+(f[B]||0)).join(" | "):"先选项目"}),O?c.jsx("div",{className:"err",children:O}):null,c.jsxs(wt,{children:[c.jsxs("select",{"aria-label":"状态筛选",value:j,onChange:B=>k(B.target.value),children:[c.jsx("option",{value:"",children:"状态:全部"}),ho.map(B=>c.jsx("option",{value:B,children:Rc[B]},B))]}),c.jsx("input",{type:"text",placeholder:"搜索标题/说明",value:K,onChange:B=>L(B.target.value)}),c.jsx("button",{onClick:()=>void Ut(),children:"刷新"})]}),c.jsx("input",{type:"text",placeholder:"待办标题(必填)",style:{width:"100%"},value:at,onChange:B=>X(B.target.value)}),c.jsx("textarea",{placeholder:"说明(可选)",value:vt,onChange:B=>bt(B.target.value)}),c.jsxs(wt,{children:[c.jsx("select",{"aria-label":"优先级",value:zt,onChange:B=>J(B.target.value),children:Xg.map(B=>c.jsxs("option",{value:B,children:["优先级:",Lh[B]]},B))}),c.jsx("input",{type:"text",placeholder:"关联任务 id(可选)",value:Rt,onChange:B=>it(B.target.value)}),c.jsx("input",{type:"datetime-local","aria-label":"截止时间",value:Q,onChange:B=>rt(B.target.value)}),c.jsx("button",{className:"primary",onClick:()=>void Qt(),children:"新建待办"}),c.jsx("span",{className:"muted",children:p})]}),c.jsx(xl,{empty:i.projectId?"(暂无待办)":"(先选项目)",items:r.map(B=>c.jsxs("span",{className:"row-main",children:[c.jsx("b",{children:B.title})," | ",c.jsx("span",{className:"st-"+B.status,children:Rc[B.status]||B.status})," | 优先级 "+(Lh[B.priority]||B.priority),B.task_id?" | 任务 "+Ne(B.task_id):"",B.due_at?" | 截止 "+Lg(B.due_at):"",B.completed_at?" | 完成于 "+new Date(B.completed_at*1e3).toLocaleString():"",B.description?c.jsxs(c.Fragment,{children:[c.jsx("br",{}),c.jsx("span",{className:"muted",children:B.description})]}):null,c.jsx("br",{}),c.jsx("select",{"aria-label":"改状态",value:B.status,onChange:ot=>void Nt(B,{status:ot.target.value}),children:ho.map(ot=>c.jsx("option",{value:ot,children:Rc[ot]},ot))})," ",c.jsx("button",{onClick:()=>void Nt(B,{status:"completed"}),children:"完成"})," ",c.jsx("button",{onClick:()=>void kt(B),children:"删除"})]},B.id))}),c.jsx("div",{className:"muted",children:"状态与 Muse 待办同款五态;完成时服务端记完成时间,改回其它状态时清掉;已取消是软关闭,删除才是硬删除。"})]})}const po=[["tasks","任务工作台","任务"],["todos","项目待办","任务"],["projects","项目与成员","管理"],["resources","环境与 Workers","管理"],["automation","技能与自动化","管理"],["admin","系统与 Key","管理"]],Zg=Object.fromEntries(po.map(([i,r])=>[i,r]));function Vh(){const i=window.location.hash.replace("#view-","");return po.some(([r])=>r===i)?i:"tasks"}function Kg({view:i,setView:r}){return c.jsxs("aside",{className:"shell-side",children:[c.jsx("div",{className:"shell-brand",children:"Codex 命令台"}),c.jsx("nav",{className:"shell-nav","aria-label":"导航",children:["任务","管理"].map(h=>c.jsxs("div",{className:"shell-nav-group",children:[c.jsx("div",{className:"shell-nav-group-label",children:h}),po.filter(([,,f])=>f===h).map(([f,S])=>c.jsx("button",{type:"button",className:i===f?"active":"",onClick:()=>r(f),children:S},f))]},h))}),c.jsxs("div",{className:"shell-stats",children:[c.jsx("div",{className:"shell-stats-label",children:"概览"}),c.jsx(rg,{})]})]})}function Jg(){const i=Zt();return c.jsx("span",{className:i.keySaved?"dash-status ok":"dash-status off",children:i.keySaved?"● 已连接":"○ 未连接"})}function Fg(){const i=sg();ug(p=>i.refreshAll(p),1e4),ig(()=>i.refreshSlow(),6e4);const[r,h]=d.useState(()=>Vh()),[f,S]=d.useState(!0),N=p=>{h(p);try{window.history.replaceState(null,"","#view-"+p)}catch{}};d.useEffect(()=>{const p=()=>h(Vh());return window.addEventListener("hashchange",p),()=>window.removeEventListener("hashchange",p)},[]);const A=()=>{N("tasks"),S(!0),setTimeout(()=>{var p;return(p=document.getElementById("sec-dispatch"))==null?void 0:p.scrollIntoView({behavior:"smooth"})},0)};return c.jsx(Kh.Provider,{value:i,children:c.jsxs("div",{className:"shell",children:[c.jsx(Kg,{view:r,setView:N}),c.jsxs("div",{className:"shell-main",children:[c.jsxs("header",{className:"shell-header",children:[c.jsx("h1",{children:Zg[r]}),c.jsx(Jg,{}),c.jsx("span",{className:"muted shell-hide-sm",children:i.healthText}),c.jsx("span",{className:"muted shell-hide-sm",children:i.quotaText}),c.jsxs("span",{className:"muted shell-stamp",children:["自动刷新 · 每 10 秒 · 已刷新 ",i.refreshStamp]})]}),r==="tasks"?c.jsxs("div",{className:"workspace",children:[c.jsxs("section",{className:"workspace-rail","aria-label":"任务列表",children:[c.jsx("h2",{children:"任务列表"}),c.jsx(dg,{onNew:A})]}),c.jsxs("section",{className:"workspace-center",children:[c.jsx("div",{className:"composer-toggle",children:c.jsx("button",{type:"button",onClick:()=>S(!f),children:f?"收起新建任务":"新建任务"})}),f?c.jsx("section",{id:"sec-dispatch",children:c.jsx(og,{})}):null,c.jsxs("section",{className:"card workspace-conv",children:[c.jsx("h2",{children:"对话"}),c.jsx(pg,{})]})]}),c.jsx("section",{className:"workspace-inspector","aria-label":"任务详情",children:c.jsx(Ag,{})})]}):c.jsx("main",{className:"page",children:r==="todos"?c.jsx(c.Fragment,{children:c.jsx(Vg,{})}):r==="projects"?c.jsxs(c.Fragment,{children:[c.jsx(zg,{}),c.jsx(Rg,{})]}):r==="resources"?c.jsxs(c.Fragment,{children:[c.jsx(Dg,{}),c.jsx(Ug,{}),c.jsx(Hg,{}),c.jsx(wg,{})]}):r==="automation"?c.jsxs(c.Fragment,{children:[c.jsx(kg,{}),c.jsx(Bg,{}),c.jsx(Gg,{}),c.jsx(Qg,{})]}):c.jsxs(c.Fragment,{children:[c.jsx(Mg,{}),c.jsx(Og,{})]})})]})]})})}Ky.createRoot(document.getElementById("root")).render(c.jsx(qy.StrictMode,{children:c.jsx(Fg,{})})); +`)}}p("流已断开")}catch(rt){if(rt.name==="AbortError")return;O(rt instanceof Error?rt.message:String(rt)),p("未开始")}finally{j(!1)}},[r]),L=d.useCallback(()=>{var it;(it=w.current)==null||it.abort(),j(!1),p("已停止")},[]),vt=d.useCallback(async it=>{if(r)try{const Q=await I(K.taskBrowserControl(r.id),"POST",{holder:it});N(Q),O("")}catch(Q){O(Q instanceof Error?Q.message:String(Q))}},[r]),bt=d.useCallback(async it=>{if(!r||(S==null?void 0:S.holder)!=="user"||!X.current)return;const Q=X.current.getBoundingClientRect(),rt=Math.round((it.clientX-Q.left)/Q.width*1280),Ut=Math.round((it.clientY-Q.top)/Q.height*800);try{await I(K.taskBrowserInput(r.id),"POST",{type:"mouse_click",x:rt,y:Ut})}catch(Qt){O(Qt instanceof Error?Qt.message:String(Qt))}},[r,S]),zt=d.useCallback(async it=>{if(!(!r||(S==null?void 0:S.holder)!=="user")){it.preventDefault();try{it.key.length===1?await I(K.taskBrowserInput(r.id),"POST",{type:"type",text:it.key}):await I(K.taskBrowserInput(r.id),"POST",{type:"key",key:it.key})}catch(Q){O(Q instanceof Error?Q.message:String(Q))}}},[r,S]);if(!r)return c.jsx("div",{className:"muted",children:"点任务行查看详情"});const J=(S==null?void 0:S.holder)||"—",Rt=S!==null;return c.jsxs("div",{children:[c.jsxs("div",{style:{display:"flex",gap:8,flexWrap:"wrap",alignItems:"center"},children:[c.jsxs("span",{children:["状态 ",c.jsx("b",{children:A})]}),c.jsxs("span",{className:"muted",children:["会话 ",Rt?"活跃":"未激活(轮次结束即消失)"]}),c.jsxs("span",{className:"muted",children:["控制权 ",J]}),S!=null&&S.url?c.jsx("span",{className:"muted",title:S.url,children:S.url.slice(0,80)}):null]}),c.jsxs("div",{style:{display:"flex",gap:8,flexWrap:"wrap",marginTop:8},children:[Y?c.jsx("button",{type:"button",onClick:L,children:"停止观看"}):c.jsx("button",{type:"button",onClick:()=>void at(),children:"开始观看"}),c.jsx("button",{type:"button",onClick:()=>void V(),children:"刷新状态"}),J!=="user"?c.jsx("button",{type:"button",onClick:()=>void vt("user"),disabled:!Rt,children:"接管"}):c.jsx("button",{type:"button",onClick:()=>void vt("agent"),children:"交还给 Agent"})]}),H?c.jsx("div",{className:"muted",style:{marginTop:8},children:H}):null,J==="user"?c.jsx("div",{className:"muted",style:{marginTop:8},children:"你已接管:点画面即点击,键盘输入直达页面。交还后 Agent 续跑前会先快照确认你的改动。"}):null,c.jsx("div",{style:{marginTop:8},children:h?c.jsx("img",{ref:X,src:h,alt:"浏览器实时画面",tabIndex:0,onClick:it=>void bt(it),onKeyDown:it=>void zt(it),style:{width:"100%",maxWidth:1280,cursor:J==="user"?"crosshair":"default",border:"1px solid var(--border, #ccc)"}}):c.jsx("div",{className:"muted",children:Rt?"点“开始观看”接入画面流(接管后点画面即点击)":"浏览器会话未激活:任务本轮未开浏览器,或轮次已结束。"})})]})}function xg(){const i=Zt(),[r,h]=d.useState("uncommittedChanges"),[f,S]=d.useState(""),[N,A]=d.useState(""),[p,H]=d.useState("");return c.jsxs(c.Fragment,{children:[c.jsx("h3",{children:"评审队列"}),c.jsxs("select",{"aria-label":"评审目标",value:r,onChange:O=>h(O.target.value),children:[c.jsx("option",{value:"uncommittedChanges",children:"未提交改动(工作区)"}),c.jsx("option",{value:"baseBranch",children:"与分支的差异"}),c.jsx("option",{value:"commit",children:"指定提交"}),c.jsx("option",{value:"custom",children:"自定义评审指令"})]}),c.jsx("input",{className:"stacked",placeholder:"与分支的差异用:分支名(如 main)",style:{width:"100%"},value:f,onChange:O=>S(O.target.value)}),c.jsx("input",{className:"stacked",placeholder:"指定提交用:提交 sha",style:{width:"100%"},value:N,onChange:O=>A(O.target.value)}),c.jsx("textarea",{placeholder:"自定义评审指令用:评审指令正文",value:p,onChange:O=>H(O.target.value)}),c.jsxs(wt,{children:[c.jsx("button",{className:"primary",onClick:()=>void i.postReview({target_type:r,branch:f.trim()||void 0,sha:N.trim()||void 0,instructions:p.trim()||void 0}),children:"登记评审需求"}),c.jsx("button",{onClick:i.refreshReviews,children:"刷新队列"}),c.jsx("span",{className:"muted",children:i.reviewMsg})]}),c.jsx("div",{className:"muted",children:"本基线只登记评审需求(requested),不自动跑评审;评审是否执行、结果如何,以评审队列里的记录为准。"}),i.reviewError?c.jsx("div",{className:"muted",children:i.reviewError}):i.reviews.length===0?c.jsx("div",{className:"muted",children:"点任务行查看详情后,点“刷新队列”查看评审记录"}):c.jsx(cu,{children:i.reviews.map(O=>{let Y=O.target_type||"";return O.branch&&(Y+=":"+O.branch),O.sha&&(Y+=":"+String(O.sha).slice(0,12)),O.instructions&&(Y+=":"+String(O.instructions).slice(0,80)),c.jsxs("li",{children:[c.jsxs("span",{className:"row-main",children:[c.jsx("b",{children:"评审"})," ",Ne(O.id)," | ",Y," | ",c.jsx("span",{className:"st-"+(O.status||""),children:O.status}),O.created_at?" | "+Ya(O.created_at):"",c.jsx("br",{}),O.findings?String(O.findings).slice(0,1e3):c.jsx("span",{className:"muted",children:"(暂无 findings:评审尚未执行或尚未写回)"})]}),c.jsx("button",{onClick:()=>i.submitFindings(O.id),children:"写 findings"})]},O.id)})})]})}function jg(){const i=Zt();return i.currentTask?i.currentTask.coordinator_parts?i.coordChildren.length===0?c.jsx("div",{className:"muted",children:"(子任务尚未创建)"}):c.jsx(cu,{children:i.coordChildren.map(r=>c.jsx("li",{children:c.jsxs("span",{className:"row-main",children:["分工 ",c.jsx("b",{children:r.coordinator_part||""})," | 状态 ",c.jsx("span",{className:"st-"+r.status,children:r.status})," | ",Ne(r.id)," | ",String(r.prompt||"").slice(0,60)]})},r.id))}):c.jsx("div",{className:"muted",children:"(非协调员任务)"}):c.jsx("div",{className:"muted",children:"点任务行查看详情后,这里显示协调员的子任务"})}function Tg(){const i=Zt();if(!i.currentTask)return c.jsx("div",{className:"muted",children:"点任务行查看详情后,这里显示子代理链路"});if(i.agents.length===0)return c.jsxs("div",{className:"muted",children:["(暂无子代理)",i.agentsNote?c.jsx("span",{className:"err",children:i.agentsNote}):null]});const r={main:"主任务",delegate:"委派子任务",model:"模型子代理"},h={running:"进行中",completed:"已完成",failed:"失败",interrupted:"已中断",unknown:"未知"};return c.jsx(cu,{children:i.agents.map((f,S)=>c.jsx("li",{children:c.jsxs("span",{className:"row-main",children:[c.jsxs("b",{children:[r[f.kind||""]||f.kind||"",":"]}),f.name||""," ",c.jsx("span",{className:"st-"+(f.status||""),children:h[f.status||""]||f.status||"?"})," | 过程调用 "+(f.calls?f.calls.length:0)+" 条",f.updated_ts?" | 最近活动 "+Ya(f.updated_ts/1e3):"",f.prompt?c.jsxs(c.Fragment,{children:[c.jsx("br",{}),c.jsxs("span",{className:"muted",children:["任务:",f.prompt]})]}):null,f.calls&&f.calls.length?c.jsxs(c.Fragment,{children:[c.jsx("br",{}),f.calls.slice(-50).map((N,A)=>c.jsx("div",{children:vo(N)},A))]}):c.jsxs(c.Fragment,{children:[c.jsx("br",{}),c.jsx("span",{className:"muted",children:"(暂无过程调用)"})]})]})},S))})}function _g(){const i=Zt();return c.jsxs(c.Fragment,{children:[c.jsxs(wt,{children:[c.jsx("button",{onClick:i.refreshApprovals,children:"刷新审批队列"}),c.jsx("span",{className:"muted",children:i.approvalMsg})]}),c.jsx("div",{className:"muted",children:"待审批项需人工点记录允许或记录拒绝;超时默认拒绝。当前版本只留回执,不拦截实时行为(实时请求的事前拦截待 host 接入后生效,在此之前实时行为不变)。"}),c.jsx(xl,{empty:"(暂无审批项)",items:i.approvals.map(r=>c.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)+" "+Ya(r.decided_at):"",r.status==="pending"?c.jsxs(c.Fragment,{children:[" ",c.jsx("button",{onClick:()=>i.decideApproval(r.id,"approved"),children:"记录允许"})," ",c.jsx("button",{onClick:()=>i.decideApproval(r.id,"denied"),children:"记录拒绝"})]}):null]},r.id))})]})}function Eg(){const i=Zt(),[r,h]=d.useState(""),[f,S]=d.useState("");return c.jsxs(c.Fragment,{children:[c.jsx("input",{placeholder:"目标任务 id(与本任务同项目;对方运行中排队执行、已终态则续跑复活,绝不打断当前轮)",style:{width:"100%"},value:r,onChange:N=>h(N.target.value)}),c.jsx("textarea",{placeholder:"消息正文(以本任务名义发出;对方 agent 会看到发送方任务 id,可照此回消息)",value:f,onChange:N=>S(N.target.value)}),c.jsxs(wt,{children:[c.jsx("button",{onClick:async()=>{await i.postPeer("queued",r,f),S("")},children:"排队发给对方"}),c.jsx("button",{className:"primary",onClick:async()=>{await i.postPeer("direct",r,f),S("")},children:"直接发送"}),c.jsx("span",{className:"muted",children:i.peerMsg})]}),c.jsx(xl,{empty:"(本任务尚未发出任务间消息)",items:i.peerMessages.map((N,A)=>c.jsxs("span",{className:"row-main",children:["[发给 ",String(N.task_id).slice(0,8),"|",N.mode,"|",N.status,"] ",String(N.body||"").slice(0,120)]},A))})]})}function Ng(){const i=Zt(),[r,h]=d.useState(""),f=i.currentTask?["completed","failed","interrupted"].includes(i.currentTask.status):!1;return c.jsxs(c.Fragment,{children:[c.jsx("div",{className:"muted",children:i.threadText||"点任务行查看详情后,这里显示线程元数据"}),c.jsxs(wt,{children:[c.jsx("input",{type:"text",placeholder:"新线程名",value:r,onChange:S=>h(S.target.value)}),c.jsx("button",{disabled:!f,onClick:()=>i.threadAction("rename",r),children:"重命名"}),c.jsx("button",{disabled:!f,onClick:()=>i.threadAction("archive",""),children:"归档"}),c.jsx("button",{disabled:!f,onClick:()=>i.threadAction("unarchive",""),children:"取消归档"}),c.jsx("button",{disabled:!f,onClick:()=>i.threadAction("compact",""),children:"压缩"}),c.jsx("span",{className:"muted",children:i.threadGateNote}),c.jsx("span",{className:"muted",children:i.threadMsg})]}),c.jsx(xl,{empty:"暂无其他线程",items:i.threadList.map((S,N)=>c.jsxs("span",{className:"row-main",children:[S.name||S.thread_name||S.id||""," [",S.id||"","]",S.archived?" [已归档]":"",S.cwd?" "+S.cwd:""]},N))}),c.jsx("div",{className:"muted",children:"限制:Docker/异机任务线程操作一律 409;merged/merge-failed 不可改;turn/steer 与 review/start 不在本批。"})]})}function Cg(i){return/503|Service Unavailable/.test(i)?"上游模型服务暂时不可用(503):模型一轮都没跑出来,不是任务逻辑失败;等上游恢复或换模型重试":/429|rate limit/i.test(i)?"上游限流(429):模型拒绝了本次调用,可稍后重试":/timeout|timed out/i.test(i)?"上游调用超时:模型响应未在限时内返回":/401|403|Invalid API key|unauthorized/i.test(i)?"上游鉴权失败:网关 key 或权限有问题":/ECONNREFUSED|ENOTFOUND|network|fetch failed/i.test(i)?"连不上上游模型服务:网络或网关地址有问题":"任务失败(原因见原始错误文本)"}function Ag(i){return i===null||i<0?"未知":i<60?Math.floor(i)+" 秒前":i<3600?Math.floor(i/60)+" 分钟前":(i/3600).toFixed(1)+" 小时前"}const Og=[["overview","概览"],["collab","协作"],["review","评审与审批"],["threads","线程"],["browser","浏览器"]];function Mg(){const i=Zt(),r=i.currentTask,[h,f]=d.useState("overview");if(!r)return c.jsx(Jt,{id:"nav-detail",title:"任务详情",children:c.jsx("div",{className:"muted",children:"点任务行查看详情"})});const[S,N]=Wh(r),[A,p]=$h(r),H=Fh(r),O=i.costSummary,Y=r.plan?"计划模式(只读)":r.goal_mode?r.no_time_limit?"goal 模式无敌版(不限时)":"goal 模式(不限轮次,模型宣告完成)":r.verify_command?"goal 模式(旧语义,验收命令)":null;return c.jsxs("div",{className:"detail-stack",id:"nav-detail",children:[c.jsx("nav",{className:"detail-tabs","aria-label":"任务详情页签",children:Og.map(([j,w])=>c.jsx("button",{type:"button",className:h===j?"active":"",onClick:()=>f(j),children:w},j))}),h==="overview"?c.jsxs(c.Fragment,{children:[c.jsxs(Jt,{title:"任务详情",children:[c.jsxs("div",{style:{display:"flex",alignItems:"center",gap:8,flexWrap:"wrap"},children:[c.jsx("span",{className:"issue-first",title:"任务首字:"+H,"aria-hidden":"true",children:H}),c.jsxs("span",{children:["状态 ",c.jsx("b",{className:"st-"+r.status,children:r.status}),"(",Fy[r.status]||"未知状态",")"]}),c.jsxs("span",{className:"muted",children:["更新 ",Ya(r.updated_at)]})]}),c.jsxs("div",{className:"detail-cards",children:[c.jsxs("div",{className:"detail-card",title:N,children:[c.jsx("div",{className:"detail-card-label",children:"耗时"}),c.jsx("div",{className:"detail-card-value",children:S})]}),c.jsxs("div",{className:"detail-card",title:p,children:[c.jsx("div",{className:"detail-card-label",children:"token"}),c.jsx("div",{className:"detail-card-value",children:A})]}),c.jsxs("div",{className:"detail-card",title:"LLM 请求数 = GET /tasks/{id}/cost 的 llm_requests,即 cost_records 的 completions 之和:host.py 每收到一次 thread/tokenUsage/updated(一次上游补全)计 1,worker 每轮终局记账时累加;估算行(无真实用量)计 0;部署前已记账的老任务没有 completions 列,显示 0 而非回填数",children:[c.jsx("div",{className:"detail-card-label",children:"LLM 请求数"}),c.jsx("div",{className:"detail-card-value",children:O===void 0?"加载中…":O===null?"—":(O.llm_requests??0).toLocaleString()}),O===void 0?c.jsx("div",{className:"muted",children:"成本加载中…"}):O===null?c.jsx("div",{className:"muted",children:"成本明细加载失败,LLM 请求数不可用"}):c.jsxs("div",{className:"muted",children:["上游补全次数之和| 轮数 ",O.turns??0," | fallback ",O.fallback_count??0]})]}),c.jsxs("div",{className:"detail-card",title:"成本明细:GET /tasks/{id}/cost 聚合;美元只计有价行,无价 token 单列;缓存是输入 token 的子集,不另计",children:[c.jsx("div",{className:"detail-card-label",children:"成本"}),c.jsx("div",{className:"detail-card-value",children:O===void 0?"加载中…":O===null?"—":fg(O.usd_micros)}),O===void 0?c.jsx("div",{className:"muted",children:"成本加载中…"}):O===null?c.jsx("div",{className:"muted",children:"成本明细加载失败(“查成本”按钮仍可手动拉取原始 JSON)"}):c.jsxs("div",{className:"muted",children:["token ",(O.total_tokens??0).toLocaleString(),"(实际 ",(O.actual_tokens??0).toLocaleString()," / 估算 ",(O.estimated_tokens??0).toLocaleString(),",缓存 ",(O.cached_input_tokens??0).toLocaleString(),",无价 ",(O.unpriced_actual_tokens??0).toLocaleString(),")| fallback ",O.fallback_count??0]})]})]})]}),r.status==="running"||r.status==="queued"?(()=>{const j=Date.now()/1e3,w=r.last_heartbeat||r.updated_at||null,X=w?j-w:null;return c.jsxs(Jt,{title:"LLM 进度",children:[c.jsxs("div",{children:["状态 ",r.status==="running"?"进行中":"排队中"," · 已用 ",S,X!==null?" · 上次活动 "+Ag(X):""]}),X!==null&&X>180?c.jsx("div",{className:"muted",children:"超过 3 分钟无活动:可能在等上游模型响应(上游 503 时 worker 会重试后失败,失败后这里会显示失败原因;无活动不等于已断连,服务端没有“LLM 已连接”字段,不作此断言)"}):c.jsx("div",{className:"muted",children:"首轮无输出时属正常:模型第一轮回复到达前 trace 里没有消息;回复到达后会在会话区出现,成本里的 LLM 请求数随之增加"})]})})():null,r.error_text?c.jsxs(Jt,{title:"失败原因",children:[c.jsx("div",{children:Cg(r.error_text)}),c.jsx("pre",{style:{whiteSpace:"pre-wrap",overflowWrap:"anywhere"},children:r.error_text.slice(0,1e3)}),c.jsxs("div",{className:"muted",children:["完整错误文本仍在下方“操作与结果”里;模型 ",r.model||"默认"," · executor ",r.executor||""]})]}):null,c.jsx(Jt,{title:"基本信息",children:c.jsxs("dl",{className:"detail-kv",children:[c.jsxs("div",{children:[c.jsx("dt",{children:"任务"}),c.jsx("dd",{children:r.id})]}),c.jsxs("div",{children:[c.jsx("dt",{children:"turn"}),c.jsx("dd",{children:Ne(r.turn_id)})]}),c.jsxs("div",{children:[c.jsx("dt",{children:"root turn"}),c.jsx("dd",{children:Ne(r.root_turn_id)})]}),c.jsxs("div",{children:[c.jsx("dt",{children:"executor"}),c.jsx("dd",{children:r.executor||""})]}),c.jsxs("div",{children:[c.jsx("dt",{children:"主机"}),c.jsx("dd",{children:r.worktree_host||""})]}),c.jsxs("div",{children:[c.jsx("dt",{children:"模型"}),c.jsx("dd",{children:r.model||"默认"})]}),c.jsxs("div",{children:[c.jsx("dt",{children:"强度"}),c.jsx("dd",{children:r.effort||"默认"})]}),r.child_model||r.child_effort?c.jsxs("div",{children:[c.jsx("dt",{children:"子任务默认"}),c.jsx("dd",{children:(r.child_model||"跟随本任务")+" / "+(r.child_effort||"跟随本任务")})]}):null,c.jsxs("div",{children:[c.jsx("dt",{children:"权限"}),c.jsx("dd",{children:r.approval||"默认"})]}),c.jsxs("div",{children:[c.jsx("dt",{children:"项目"}),c.jsx("dd",{children:Ne(r.project_id)})]}),Y?c.jsxs("div",{children:[c.jsx("dt",{children:"模式"}),c.jsx("dd",{children:Y})]}):null,r.forked_from?c.jsxs("div",{children:[c.jsx("dt",{children:"分支自"}),c.jsx("dd",{children:Ne(r.forked_from)})]}):null,r.coordinator_parts?c.jsxs("div",{children:[c.jsx("dt",{children:"协调员"}),c.jsxs("dd",{children:[r.coordinator_parts.length," 个子任务(",r.coordinator_parts.map(j=>j.name).join("、"),")"]})]}):null,r.parent_task_id?c.jsxs("div",{children:[c.jsx("dt",{children:"协调子任务"}),c.jsxs("dd",{children:["父任务 ",Ne(r.parent_task_id),r.coordinator_part?"("+r.coordinator_part+")":""]})]}):null,r.attachments&&r.attachments.length?c.jsxs("div",{children:[c.jsx("dt",{children:"附件"}),c.jsx("dd",{children:r.attachments.join("、")})]}):null,r.pr_url?c.jsxs("div",{children:[c.jsx("dt",{children:"PR"}),c.jsx("dd",{children:c.jsxs("a",{href:r.pr_url,target:"_blank",rel:"noopener noreferrer",children:["PR #",r.pr_number]})})]}):null]})}),c.jsx(Jt,{title:"prompt",children:c.jsx("div",{style:{whiteSpace:"pre-wrap",overflowWrap:"anywhere"},children:r.prompt||"(无 prompt)"})}),c.jsxs(Jt,{title:"操作与结果",children:[c.jsx(Sg,{}),c.jsx("pre",{children:i.detailBody||"(暂无 result/error 输出)"}),i.costBox?c.jsx("pre",{children:i.costBox}):null]})]}):h==="collab"?c.jsxs(c.Fragment,{children:[c.jsx(Jt,{title:"协调子任务",children:c.jsx(jg,{})}),c.jsx(Jt,{title:"子代理链路",children:c.jsx(Tg,{})}),c.jsx(Jt,{title:"给其他任务发消息",children:c.jsx(Eg,{})})]}):h==="review"?c.jsxs(c.Fragment,{children:[c.jsx(Jt,{title:"评审队列",children:c.jsx(xg,{})}),c.jsx(Jt,{title:"运行时审批队列",children:c.jsx(_g,{})})]}):h==="browser"?c.jsx(c.Fragment,{children:c.jsx(Jt,{title:"浏览器远控",children:c.jsx(bg,{})})}):c.jsx(c.Fragment,{children:c.jsx(Jt,{title:"线程",children:c.jsx(Ng,{})})})]})}function zg(){const i=Zt(),[r,h]=d.useState(""),[f,S]=d.useState(""),[N,A]=d.useState([]),[p,H]=d.useState(null),[O,Y]=d.useState(!1),[j,w]=d.useState(""),[X,V]=d.useState(""),at=d.useCallback(async()=>{if(!i.keySaved){A([]);return}try{const J=await I(K.userKeys);A(J.keys||[]),V("")}catch(J){V(J instanceof Error?J.message:"加载 key 列表失败")}},[i.keySaved]);d.useEffect(()=>{at()},[at]);const L=async()=>{w(""),V(""),Y(!1);try{const J=await I(K.userKeys,"POST",{label:f.trim()||"api-key"});H(J),S(""),w("新 key 已生成,只显示一次:复制后请妥善保存。"),await at()}catch(J){V(J instanceof Error?J.message:"生成 key 失败")}},vt=async()=>{if(p)try{await navigator.clipboard.writeText(p.api_key),Y(!0)}catch{V("复制失败:请手动选中上方 key 文本复制")}},bt=()=>{p&&(i.saveKeyInput(p.api_key),H(null),w("已存为当前浏览器 key(原有 key 未被撤销,需要时可单独撤销)。"))},zt=async J=>{const Rt=(()=>{try{return sl().slice(-4)}catch{return""}})(),it=J.id==="legacy"?"(主 key:撤销后当前浏览器保存的 key 也可能随之失效,需重新登录拿新 key)":J.hint&&J.hint===Rt?"(这就是本浏览器当前在用的 key,撤销后本页会立刻未连接)":"";if(window.confirm(`撤销 key「${J.label}」(后 4 位 ${J.hint||"无"})吗?${it}撤销不可恢复。`)){w(""),V("");try{await I(K.userKey(J.id),"DELETE"),w(`已撤销 key「${J.label}」。`),await at()}catch(Q){V(Q instanceof Error?Q.message:"撤销失败")}}};return c.jsxs(Jt,{id:"nav-key",title:"API Key",children:[c.jsxs(wt,{children:[c.jsx("input",{type:"password",placeholder:"粘贴你的 X-API-Key(与调 API 用的同一个)",autoComplete:"off",value:r,onChange:J=>h(J.target.value)}),c.jsx("button",{className:"primary",onClick:()=>{i.saveKeyInput(r),h("")},children:"保存到本浏览器"}),c.jsx("button",{onClick:i.clearKeyInput,children:"清除"}),c.jsx("span",{className:"muted",children:i.keyState})]}),c.jsx("div",{children:c.jsx("span",{className:"muted",children:i.quotaText})}),!i.keySaved&&c.jsx("div",{children:c.jsx("span",{className:"muted",children:"先粘贴并保存已有 key,再生成或管理 key(生成接口本身也要用已有 key 鉴权)。"})}),i.keySaved&&c.jsxs(c.Fragment,{children:[c.jsxs(wt,{children:[c.jsx("input",{placeholder:"新 key 备注(可选,默认 api-key,如 harness2-temp)",autoComplete:"off",value:f,onChange:J=>S(J.target.value)}),c.jsx("button",{className:"primary",onClick:()=>void L(),children:"生成新 key"}),c.jsx("button",{onClick:()=>void at(),children:"刷新列表"})]}),p&&c.jsxs("div",{children:[c.jsx("div",{children:c.jsxs("span",{className:"muted",children:["新 key(",p.label,",后 4 位 ",p.hint,"):只显示一次,关闭后无法再查看。"]})}),c.jsxs(wt,{children:[c.jsx("input",{type:"text",readOnly:!0,value:p.api_key,onFocus:J=>J.target.select()}),c.jsx("button",{className:"primary",onClick:()=>void vt(),children:O?"已复制":"复制"}),c.jsx("button",{onClick:bt,children:"存为当前浏览器 key"}),c.jsx("button",{onClick:()=>H(null),children:"关闭(不再显示)"})]})]}),j&&c.jsx("div",{children:c.jsx("span",{className:"muted",children:j})}),X&&c.jsx("div",{children:c.jsx("span",{children:X})}),c.jsxs("div",{className:"api-key-list",children:[N.length===0&&c.jsx("span",{className:"muted",children:"暂无 key(或列表加载失败,见上方报错)。"}),N.map(J=>c.jsxs("div",{children:[c.jsx("span",{children:J.label})," ",c.jsxs("span",{className:"muted",children:["后 4 位 ",J.hint||"无"," · 创建 ",Ya(J.created_at)," · 最近使用 ",J.last_used_at?Ya(J.last_used_at):"未使用过"]})," ",J.revoked_at?c.jsxs("span",{className:"muted",children:["已撤销(",Ya(J.revoked_at),")"]}):c.jsx("button",{onClick:()=>void zt(J),children:"撤销"})]},J.id))]})]})]})}function Rg(){const i=Zt();return c.jsxs(Jt,{id:"adminCard",title:c.jsxs(c.Fragment,{children:["管理区 ",c.jsx("span",{className:"muted",children:"(仅全局管理员)"})]}),children:[c.jsx("div",{className:"muted",children:i.adminGate}),i.adminBody?c.jsxs(c.Fragment,{children:[c.jsxs(wt,{children:[c.jsx("input",{type:"text",placeholder:"要查配额的用户 id",value:i.adminUserId,onChange:r=>i.setAdminUserId(r.target.value)}),c.jsx("button",{onClick:i.adminQuota,children:"查该用户配额"})]}),c.jsxs(wt,{children:[c.jsx("button",{onClick:i.adminSweep,children:"手动触发 sweep(清理陈旧 running 任务)"}),c.jsx("button",{onClick:i.adminBackup,children:"手动触发备份"})]}),c.jsx("div",{className:"muted",children:i.adminResult})]}):null]})}function Dg(){const i=Zt(),[r,h]=d.useState(""),[f,S]=d.useState(""),[N,A]=d.useState("");return c.jsxs(Jt,{id:"nav-projects",title:"项目",children:[c.jsxs(wt,{children:[c.jsxs("select",{"aria-label":"项目",value:i.projectId,onChange:p=>i.selectProject(p.target.value),children:[i.projects.length===0?c.jsx("option",{value:"",children:"(先加载项目)"}):null,i.projects.map(p=>c.jsxs("option",{value:p.id,children:[p.name," (",Ne(p.id),")"]},p.id))]}),c.jsx("button",{onClick:i.refreshProjects,children:"刷新"})]}),c.jsxs(wt,{children:[c.jsx("input",{type:"text",placeholder:"新项目名",value:r,onChange:p=>h(p.target.value)}),c.jsxs("select",{"aria-label":"从 GitHub 仓库选",value:f,onChange:p=>{S(p.target.value),p.target.value&&A(p.target.value)},children:[c.jsx("option",{value:"",children:"(从 GitHub App 安装仓库里选,或手动输入)"}),i.githubRepos.map(p=>c.jsx("option",{value:p.clone_url,children:p.repo_full_name},p.clone_url))]}),c.jsx("input",{type:"text",placeholder:"repo_url(可选)",value:N,onChange:p=>A(p.target.value)}),c.jsx("button",{onClick:async()=>{await i.createProject(r,N),h(""),A(""),S("")},children:"新建项目"})]}),c.jsx("span",{className:"muted",children:i.projectMsg})]})}function Ug(){const i=Zt(),[r,h]=d.useState(""),[f,S]=d.useState("contributor"),N=i.projects.find(A=>A.id===i.projectId);return c.jsxs(Jt,{title:"项目成员",children:[N?c.jsxs("div",{className:"muted",children:[N.name," | ",N.id," | 仓库 ",N.repo_url||"未绑定"," | 我的角色 ",N.my_role||"未知"]}):c.jsx("div",{className:"muted",children:"先选项目"}),c.jsxs(wt,{children:[c.jsx("input",{type:"text",placeholder:"成员 user_id 或用户名",value:r,onChange:A=>h(A.target.value)}),c.jsxs("select",{"aria-label":"邀请角色",value:f,onChange:A=>S(A.target.value),children:[c.jsx("option",{value:"viewer",children:"viewer(只读)"}),c.jsx("option",{value:"contributor",children:"contributor(可建任务)"}),c.jsx("option",{value:"maintainer",children:"maintainer(可批合并)"}),c.jsx("option",{value:"owner",children:"owner(可管项目)"})]}),c.jsx("button",{onClick:async()=>{await i.inviteMember(r,f),h("")},children:"邀请成员"}),c.jsx("button",{onClick:i.refreshMembers,children:"刷新成员"})]}),i.memberError?c.jsx("div",{className:"muted",children:i.memberError}):i.members.length===0?c.jsx("div",{className:"muted",children:"先选项目"}):c.jsx(cu,{children:i.members.map(A=>{const p=(A.username||"")+(A.username?"("+String(A.user_id).slice(0,8)+")":String(A.user_id).slice(0,8));return c.jsxs("li",{children:[c.jsx("span",{className:"row-main",children:p}),c.jsx("select",{"aria-label":"成员角色",value:A.role||"viewer",onChange:H=>void i.changeMemberRole(A.user_id,H.target.value),children:Wy.map(H=>c.jsx("option",{value:H,children:H},H))})]},A.user_id)})}),c.jsx("span",{className:"muted",children:i.memberMsg})]})}function Hg(){const i=Zt(),[r,h]=d.useState(""),[f,S]=d.useState(""),[N,A]=d.useState("");return c.jsxs(Jt,{id:"nav-env",title:c.jsxs(c.Fragment,{children:["环境 ",c.jsx("span",{className:"muted",children:"(选、建、管:当前项目的基准检出)"})]}),children:[c.jsxs(wt,{children:[c.jsx("button",{onClick:i.refreshEnvs,children:"刷新"}),c.jsx("span",{className:"muted",children:i.envCount})]}),i.envs.length===0?c.jsx("div",{className:"muted",children:"先选项目"}):c.jsx(cu,{children:i.envs.map(p=>c.jsxs("li",{children:[c.jsxs("span",{className:"row-main",children:[p.name,"(",Ne(p.id),") / 分支 ",p.branch||"默认分支"," / 执行器 ",p.executor||"不限"," / 状态 ",p.status,p.status==="failed"&&p.error_text?" / 失败原因:"+p.error_text:""]}),p.status==="archived"?null:c.jsx("button",{onClick:()=>void i.archiveEnv(p.id),children:"归档"})]},p.id))}),c.jsxs(wt,{children:[c.jsx("input",{type:"text",placeholder:"新环境名",value:r,onChange:p=>h(p.target.value)}),c.jsx("input",{type:"text",placeholder:"分支(可选,空=默认分支)",value:f,onChange:p=>S(p.target.value)}),c.jsxs("select",{"aria-label":"新环境执行器",value:N,onChange:p=>A(p.target.value),children:[c.jsx("option",{value:"",children:"执行器:不限"}),c.jsx("option",{value:"local",children:"local"}),c.jsx("option",{value:"docker",children:"docker"})]}),c.jsx("button",{onClick:async()=>{await i.createEnv(r,f,N),h(""),S("")},children:"新建环境"})]}),c.jsx("span",{className:"muted",children:i.envMsg})]})}function wg(){const i=Zt(),[r,h]=d.useState("");return c.jsxs(Jt,{title:"仓库与环境上下文",children:[c.jsx("div",{className:"muted",children:i.envRepoLine||"先选项目"}),c.jsx("div",{className:"muted",children:i.envCount}),i.envRepoBar?c.jsxs(wt,{children:[c.jsxs("select",{"aria-label":"补仓库",value:r,onChange:f=>h(f.target.value),children:[c.jsx("option",{value:"",children:"(从 GitHub App 安装仓库里选)"}),i.githubRepos.map(f=>c.jsx("option",{value:f.clone_url,children:f.repo_full_name},f.clone_url))]}),c.jsx("button",{onClick:()=>void i.saveEnvRepo(r),children:"保存仓库"})]}):null,c.jsx("span",{className:"muted",children:i.envRepoMsg})]})}function kg(){const i=Zt();return c.jsxs(Jt,{id:"nav-workers",title:"Workers",children:[c.jsx(wt,{children:c.jsx("button",{onClick:i.refreshWorkers,children:"刷新"})}),i.workersError?c.jsx("div",{className:"muted",children:i.workersError}):i.workers===null?c.jsx("div",{className:"muted",children:i.workersSummary||"未加载"}):i.workers.length===0?c.jsx("div",{className:"muted",children:"无 worker 注册"}):c.jsx(cu,{children:i.workers.map((r,h)=>{const f=r.running===void 0||r.running===null?"?":r.running,S=r.capacity===void 0||r.capacity===null?"?":r.capacity,N=Jh(r),A=r.alive!==void 0&&r.alive!==null?!!r.alive:N.age!==null&&N.age<=120,p=A?" / 在线":" / 离线(占用为上次上报值)";return c.jsx("li",{className:A?"is-online":"is-offline",children:c.jsxs("span",{className:"row-main",children:[r.worker_id||r.id||"?"," / ",r.executor||""," / 占用 ",f,"/",S,p," / 最后心跳 ",N.text]})},h)})})]})}function Bg(){const i=Zt();return c.jsxs(Jt,{title:"健康与配额",children:[c.jsxs(wt,{children:[c.jsx("span",{className:"muted",children:i.healthText}),c.jsx("button",{onClick:i.refreshHealth,children:"刷新"})]}),c.jsx("div",{children:c.jsx("span",{className:"muted",children:i.quotaText})}),c.jsx("div",{className:"muted",children:i.workersSummary})]})}function qg(){const i=Zt();return c.jsxs(Jt,{id:"nav-skills",title:"技能与 MCP",children:[c.jsx("div",{className:"muted",children:"反映宿主租户 home,容器内 home 可能不同;重载只在 schema 枚举里,当前 pin 的二进制拒绝时原样 502;OAuth 只发起登录,不代表登录完成。"}),c.jsxs(wt,{children:[c.jsx("button",{onClick:i.refreshSkills,children:"刷新"}),c.jsx("span",{className:"muted",children:i.skillMsg})]}),c.jsx("h3",{children:"技能"}),i.skillError?c.jsx("div",{className:"muted",children:i.skillError}):c.jsx(xl,{empty:"暂无技能",items:i.skills.map((r,h)=>c.jsxs("span",{className:"row-main",children:[r.name||r.id||"",r.description?" - "+r.description:"",r.detail?" - "+r.detail:""]},h))}),c.jsx("h3",{children:"应用"}),c.jsx(xl,{empty:"暂无应用",items:i.apps.map((r,h)=>c.jsxs("span",{className:"row-main",children:[r.name||r.id||"",r.description?" - "+r.description:""]},h))}),c.jsx("h3",{children:"MCP 服务"}),c.jsx(xl,{empty:"暂无 MCP 服务",items:i.mcpServers.map((r,h)=>{const f=r.detail||r.details||r.state||"";return c.jsxs("span",{className:"row-main",children:[r.name||r.id||""," | 状态 ",r.status||"",f?" | "+f:""]},h)})})]})}function Yg(){const i=Zt(),[r,h]=d.useState("");return c.jsxs(Jt,{title:"MCP 操作",children:[c.jsxs(wt,{children:[c.jsx("button",{onClick:i.reloadMcp,children:"重载配置"}),c.jsx("span",{className:"muted",children:i.mcpMsg})]}),c.jsxs(wt,{children:[c.jsx("input",{type:"text",placeholder:"MCP 服务名",value:r,onChange:f=>h(f.target.value)}),c.jsx("button",{onClick:()=>void i.mcpOauth(r),children:"发起 OAuth 登录"}),c.jsx("span",{className:"muted",children:i.mcpOauthMsg})]}),i.mcpOauthBox?c.jsx("pre",{children:i.mcpOauthBox}):null]})}function Gg(){const i=Zt(),[r,h]=d.useState(""),[f,S]=d.useState(""),[N,A]=d.useState(""),[p,H]=d.useState("");return c.jsxs(c.Fragment,{children:[c.jsx("input",{placeholder:"自动化名称(同项目内启用中的名称唯一)",style:{width:"100%"},value:r,onChange:O=>h(O.target.value)}),c.jsx("textarea",{placeholder:"定时任务内容(创建只登记定义与到期状态;执行由后续执行器经 claim 抢单后建任务,不另起调度器)",value:f,onChange:O=>S(O.target.value)}),c.jsxs(wt,{children:[c.jsx("input",{placeholder:"间隔秒数(默认 86400,最小 60)",style:{width:"40%"},value:N,onChange:O=>A(O.target.value)}),c.jsx("input",{placeholder:"仓库(可选)",style:{width:"40%"},value:p,onChange:O=>H(O.target.value)}),c.jsx("button",{className:"primary",onClick:async()=>{await i.createAutomation(r,f,N,p),h(""),S(""),A(""),H("")},children:"创建自动化"}),c.jsx("button",{onClick:i.refreshAutomations,children:"刷新自动化"}),c.jsx("span",{className:"muted",children:i.autoMsg})]}),c.jsx(xl,{empty:"(暂无自动化)",items:i.automations.map(O=>c.jsxs("span",{className:"row-main",children:["[",O.status,O.due?"|到期":"","] ",O.name,"|每 ",O.interval_seconds," 秒|下次 ",Ya(O.next_run_at),O.status==="active"?c.jsxs(c.Fragment,{children:[" ",c.jsx("button",{onClick:()=>i.cancelAutomation(O.id),children:"取消"})]}):null]},O.id))})]})}function Qg(){var h,f,S,N;const i=Zt(),r=i.triage;return i.triageError?c.jsx("div",{className:"muted",children:i.triageError}):r?c.jsxs(c.Fragment,{children:[c.jsxs("div",{className:"data-group",children:[c.jsxs("b",{children:["到期自动化(",((h=r.counts)==null?void 0:h.automations_due)||0,")"]}),c.jsx(xl,{empty:"(无)",items:(r.automations_due||[]).map((A,p)=>c.jsxs("span",{className:"row-main",children:[A.name,"|每 ",A.interval_seconds," 秒"]},p))})]}),c.jsxs("div",{className:"data-group",children:[c.jsxs("b",{children:["失败/中断任务(",((f=r.counts)==null?void 0:f.failed_tasks)||0,")"]}),c.jsx(xl,{empty:"(无)",items:(r.failed_tasks||[]).map((A,p)=>c.jsxs("span",{className:"row-main",children:[Ne(A.id),"|",A.status,"|",String(A.prompt||"").slice(0,80)]},p))})]}),c.jsxs("div",{className:"data-group",children:[c.jsxs("b",{children:["待处理后续消息(",((S=r.counts)==null?void 0:S.pending_followups)||0,")"]}),c.jsx(xl,{empty:"(无)",items:(r.pending_followups||[]).map((A,p)=>c.jsxs("span",{className:"row-main",children:["任务 ",Ne(A.task_id),"|",String(A.body||"").slice(0,80)]},p))})]}),c.jsxs("div",{className:"data-group",children:[c.jsxs("b",{children:["最近自动化产出(",((N=r.counts)==null?void 0:N.recent_runs)||0,")"]}),c.jsx(xl,{empty:"(无)",items:(r.recent_runs||[]).map((A,p)=>c.jsxs("span",{className:"row-main",children:[Ne(A.automation_id),"|",A.status,A.task_id?"|任务 "+Ne(A.task_id):"",A.task_status?"|"+A.task_status:""]},p))})]})]}):c.jsx("div",{className:"muted",children:"(先选项目)"})}function Xg(){return c.jsx(Jt,{id:"nav-automations",title:"自动化",children:c.jsx(Gg,{})})}function Lg(){const i=Zt();return c.jsxs(Jt,{id:"nav-triage",title:"分诊收件箱",children:[c.jsx(wt,{children:c.jsx("button",{onClick:i.refreshTriage,children:"刷新分诊"})}),c.jsx(Qg,{})]})}const ho=["pending","in_progress","blocked","completed","cancelled"],Rc={pending:"待办",in_progress:"进行中",blocked:"受阻",completed:"已完成",cancelled:"已取消"},Vg=["low","medium","high"],Lh={low:"低",medium:"中",high:"高"};function Zg(i){return i?new Date(i*1e3).toLocaleString():""}function Kg(){const i=Zt(),[r,h]=d.useState([]),[f,S]=d.useState({}),[N,A]=d.useState(0),[p,H]=d.useState(""),[O,Y]=d.useState(""),[j,w]=d.useState(""),[X,V]=d.useState(""),[at,L]=d.useState(""),[vt,bt]=d.useState(""),[zt,J]=d.useState("medium"),[Rt,it]=d.useState(""),[Q,rt]=d.useState(""),Ut=d.useCallback(async()=>{if(!i.projectId){h([]),S({}),A(0);return}try{let B=K.projectTodos(i.projectId);const ot=new URLSearchParams;j&&ot.set("status",j),X.trim()&&ot.set("q",X.trim());const st=ot.toString();st&&(B+="?"+st);const q=await I(B);h(q.todos||[]),S(q.counts||{}),A(q.total||0),Y("")}catch(B){Y("待办加载失败:"+((B==null?void 0:B.message)||String(B)))}},[i.projectId,j,X]);d.useEffect(()=>{Ut()},[Ut]);const Qt=async()=>{if(!i.projectId){H("先选项目");return}if(!at.trim()){H("标题必填");return}H("");try{const B={title:at.trim(),description:vt,priority:zt};Rt.trim()&&(B.task_id=Rt.trim()),Q&&(B.due_at=Math.floor(new Date(Q).getTime()/1e3)),await I(K.projectTodos(i.projectId),"POST",B),L(""),bt(""),it(""),rt(""),H("已创建"),await Ut()}catch(B){H("创建失败:"+((B==null?void 0:B.message)||String(B)))}},Nt=async(B,ot)=>{if(i.projectId)try{await I(K.projectTodo(i.projectId,B.id),"PATCH",ot),await Ut()}catch(st){Y("待办更新失败:"+((st==null?void 0:st.message)||String(st)))}},kt=async B=>{if(i.projectId&&window.confirm("删除待办“"+B.title+"”?删除后不可恢复(取消请改状态为已取消)。"))try{await I(K.projectTodo(i.projectId,B.id),"DELETE"),await Ut()}catch(ot){Y("待办删除失败:"+((ot==null?void 0:ot.message)||String(ot)))}};return c.jsxs(Jt,{id:"nav-todos",title:"项目待办",children:[c.jsx("div",{className:"muted",children:i.projectId?"共 "+N+" 项 | "+ho.map(B=>Rc[B]+" "+(f[B]||0)).join(" | "):"先选项目"}),O?c.jsx("div",{className:"err",children:O}):null,c.jsxs(wt,{children:[c.jsxs("select",{"aria-label":"状态筛选",value:j,onChange:B=>w(B.target.value),children:[c.jsx("option",{value:"",children:"状态:全部"}),ho.map(B=>c.jsx("option",{value:B,children:Rc[B]},B))]}),c.jsx("input",{type:"text",placeholder:"搜索标题/说明",value:X,onChange:B=>V(B.target.value)}),c.jsx("button",{onClick:()=>void Ut(),children:"刷新"})]}),c.jsx("input",{type:"text",placeholder:"待办标题(必填)",style:{width:"100%"},value:at,onChange:B=>L(B.target.value)}),c.jsx("textarea",{placeholder:"说明(可选)",value:vt,onChange:B=>bt(B.target.value)}),c.jsxs(wt,{children:[c.jsx("select",{"aria-label":"优先级",value:zt,onChange:B=>J(B.target.value),children:Vg.map(B=>c.jsxs("option",{value:B,children:["优先级:",Lh[B]]},B))}),c.jsx("input",{type:"text",placeholder:"关联任务 id(可选)",value:Rt,onChange:B=>it(B.target.value)}),c.jsx("input",{type:"datetime-local","aria-label":"截止时间",value:Q,onChange:B=>rt(B.target.value)}),c.jsx("button",{className:"primary",onClick:()=>void Qt(),children:"新建待办"}),c.jsx("span",{className:"muted",children:p})]}),c.jsx(xl,{empty:i.projectId?"(暂无待办)":"(先选项目)",items:r.map(B=>c.jsxs("span",{className:"row-main",children:[c.jsx("b",{children:B.title})," | ",c.jsx("span",{className:"st-"+B.status,children:Rc[B.status]||B.status})," | 优先级 "+(Lh[B.priority]||B.priority),B.task_id?" | 任务 "+Ne(B.task_id):"",B.due_at?" | 截止 "+Zg(B.due_at):"",B.completed_at?" | 完成于 "+new Date(B.completed_at*1e3).toLocaleString():"",B.description?c.jsxs(c.Fragment,{children:[c.jsx("br",{}),c.jsx("span",{className:"muted",children:B.description})]}):null,c.jsx("br",{}),c.jsx("select",{"aria-label":"改状态",value:B.status,onChange:ot=>void Nt(B,{status:ot.target.value}),children:ho.map(ot=>c.jsx("option",{value:ot,children:Rc[ot]},ot))})," ",c.jsx("button",{onClick:()=>void Nt(B,{status:"completed"}),children:"完成"})," ",c.jsx("button",{onClick:()=>void kt(B),children:"删除"})]},B.id))}),c.jsx("div",{className:"muted",children:"状态与 Muse 待办同款五态;完成时服务端记完成时间,改回其它状态时清掉;已取消是软关闭,删除才是硬删除。"})]})}const po=[["tasks","任务工作台","任务"],["todos","项目待办","任务"],["projects","项目与成员","管理"],["resources","环境与 Workers","管理"],["automation","技能与自动化","管理"],["admin","系统与 Key","管理"]],Jg=Object.fromEntries(po.map(([i,r])=>[i,r]));function Vh(){const i=window.location.hash.replace("#view-","");return po.some(([r])=>r===i)?i:"tasks"}function Fg({view:i,setView:r}){return c.jsxs("aside",{className:"shell-side",children:[c.jsx("div",{className:"shell-brand",children:"Codex 命令台"}),c.jsx("nav",{className:"shell-nav","aria-label":"导航",children:["任务","管理"].map(h=>c.jsxs("div",{className:"shell-nav-group",children:[c.jsx("div",{className:"shell-nav-group-label",children:h}),po.filter(([,,f])=>f===h).map(([f,S])=>c.jsx("button",{type:"button",className:i===f?"active":"",onClick:()=>r(f),children:S},f))]},h))}),c.jsxs("div",{className:"shell-stats",children:[c.jsx("div",{className:"shell-stats-label",children:"概览"}),c.jsx(rg,{})]})]})}function Wg(){const i=Zt();return c.jsx("span",{className:i.keySaved?"dash-status ok":"dash-status off",children:i.keySaved?"● 已连接":"○ 未连接"})}function $g(){const i=sg();ug(p=>i.refreshAll(p),1e4),ig(()=>i.refreshSlow(),6e4);const[r,h]=d.useState(()=>Vh()),[f,S]=d.useState(!0),N=p=>{h(p);try{window.history.replaceState(null,"","#view-"+p)}catch{}};d.useEffect(()=>{const p=()=>h(Vh());return window.addEventListener("hashchange",p),()=>window.removeEventListener("hashchange",p)},[]);const A=()=>{N("tasks"),S(!0),setTimeout(()=>{var p;return(p=document.getElementById("sec-dispatch"))==null?void 0:p.scrollIntoView({behavior:"smooth"})},0)};return c.jsx(Kh.Provider,{value:i,children:c.jsxs("div",{className:"shell",children:[c.jsx(Fg,{view:r,setView:N}),c.jsxs("div",{className:"shell-main",children:[c.jsxs("header",{className:"shell-header",children:[c.jsx("h1",{children:Jg[r]}),c.jsx(Wg,{}),c.jsx("span",{className:"muted shell-hide-sm",children:i.healthText}),c.jsx("span",{className:"muted shell-hide-sm",children:i.quotaText}),c.jsxs("span",{className:"muted shell-stamp",children:["自动刷新 · 每 10 秒 · 已刷新 ",i.refreshStamp]})]}),r==="tasks"?c.jsxs("div",{className:"workspace",children:[c.jsxs("section",{className:"workspace-rail","aria-label":"任务列表",children:[c.jsx("h2",{children:"任务列表"}),c.jsx(dg,{onNew:A})]}),c.jsxs("section",{className:"workspace-center",children:[c.jsx("div",{className:"composer-toggle",children:c.jsx("button",{type:"button",onClick:()=>S(!f),children:f?"收起新建任务":"新建任务"})}),f?c.jsx("section",{id:"sec-dispatch",children:c.jsx(og,{})}):null,c.jsxs("section",{className:"card workspace-conv",children:[c.jsx("h2",{children:"对话"}),c.jsx(pg,{})]})]}),c.jsx("section",{className:"workspace-inspector","aria-label":"任务详情",children:c.jsx(Mg,{})})]}):c.jsx("main",{className:"page",children:r==="todos"?c.jsx(c.Fragment,{children:c.jsx(Kg,{})}):r==="projects"?c.jsxs(c.Fragment,{children:[c.jsx(Dg,{}),c.jsx(Ug,{})]}):r==="resources"?c.jsxs(c.Fragment,{children:[c.jsx(Hg,{}),c.jsx(wg,{}),c.jsx(kg,{}),c.jsx(Bg,{})]}):r==="automation"?c.jsxs(c.Fragment,{children:[c.jsx(qg,{}),c.jsx(Yg,{}),c.jsx(Xg,{}),c.jsx(Lg,{})]}):c.jsxs(c.Fragment,{children:[c.jsx(Rg,{}),c.jsx(zg,{})]})})]})]})})}Ky.createRoot(document.getElementById("root")).render(c.jsx(qy.StrictMode,{children:c.jsx($g,{})}));