diff --git a/webui/dist/assets/index-D7__Caje.js b/webui/dist/assets/index-Cg1tZrb2.js similarity index 74% rename from webui/dist/assets/index-D7__Caje.js rename to webui/dist/assets/index-Cg1tZrb2.js index e420ceee..e9d0bdd0 100644 --- a/webui/dist/assets/index-D7__Caje.js +++ b/webui/dist/assets/index-Cg1tZrb2.js @@ -1,41 +1,41 @@ -import{r as d,j as e,L as Bn,e as ca,R as As,b as v0,f as N0,g as b0,h as y0,k as w0,l as Qs,m as _0,n as S0,O as Bg,o as k0}from"./router-9vIXuQkh.js";import{a as C0,b as T0,g as E0}from"./react-vendor-BmxF9s7Q.js";import{N as M0,c as z0,O as Kr,P as A0,g as vm}from"./utils-BqoaXoQ1.js";import{L as Ig,T as Pg,C as Hg,R as O0,a as Fg,V as D0,b as R0,S as Gg,c as L0,d as Vg,I as U0,e as qg,f as $0,g as Kg,h as B0,i as I0,j as P0,O as Qg,P as H0,k as Yg,l as Jg,D as Xg,A as Zg,m as Wg,n as F0,o as G0,p as ej,q as V0,r as sj,s as q0,t as K0,u as tj,v as Q0,w as Y0,x as aj,y as lj,F as nj,z as rj,B as J0,E as X0,G as ij,H as Z0,J as W0,K as ew,M as sw,N as tw,Q as aw,U as lw,W as nw,X as rw,Y as iw,Z as cw,_ as ow,$ as dw,a0 as uw,a1 as mw,a2 as cj,a3 as xw,a4 as hw}from"./radix-extra-tU0cN6gS.js";import{R as oj,T as dj,L as fw,g as pw,C as Hi,X as Fi,Y as Ur,h as gw,B as Eo,j as Gi,P as jw,k as vw,l as Nw}from"./charts-simvewUa.js";import{S as bw,O as uj,o as yw,C as mj,p as ww,T as xj,D as hj,R as _w,q as Sw,H as fj,I as kw,J as pj,K as gj,L as Cw,M as jj,N as vj,Q as Tw,U as Nj,V as Ew,X as bj,Y as yj,Z as Mw,_ as zw,$ as wj,a0 as Aw,a1 as Ow,e as _j,f as qo,c as Ko,P as Qn,d as Qo,b as hn,h as Dw,l as Rw,m as Lw,u as Lm,r as Uw,a as $w,a2 as Bw,a3 as Sj,a4 as Iw,a5 as Pw,a6 as Hw,a7 as kj,a8 as Cj,a9 as Tj,aa as Ej,ab as Mj,ac as zj,ad as Fw}from"./radix-core-CEUnGg09.js";import{R as dt,a as Zi,C as wt,b as pt,L as Bs,X as Ta,c as kt,d as na,e as Ga,S as Ct,f as za,g as Zt,B as Pn,U as fn,P as cc,Z as Za,h as Aj,F as ka,i as Gw,j as pn,k as Vw,M as Ea,A as Gm,D as qw,l as Hr,T as Vm,m as Kw,n as Oj,I as Ht,o as Jt,p as Ro,E as Wi,q as ia,H as Qw,r as ls,s as sa,t as ec,u as qm,v as Qi,w as rg,K as Km,x as Dj,y as Yw,z as Mo,G as Jw,J as Yo,N as Xw,O as Zw,Q as Jo,V as Ca,W as et,Y as Ma,_ as Fr,$ as Qm,a0 as Rj,a1 as oc,a2 as Lj,a3 as Uj,a4 as Fn,a5 as gn,a6 as jn,a7 as Ym,a8 as $j,a9 as ra,aa as Dl,ab as Gn,ac as Vn,ad as Xo,ae as Ww,af as e_,ag as s_,ah as Jm,ai as zo,aj as qn,ak as t_,al as Gr,am as Lo,an as a_,ao as Uo,ap as sc,aq as Bj,ar as l_,as as n_,at as $o,au as r_,av as Xm,aw as i_,ax as ig,ay as c_,az as o_,aA as Ij,aB as d_,aC as dn,aD as Pj,aE as Nm,aF as cg,aG as u_,aH as bm,aI as m_,aJ as x_,aK as h_,aL as f_,aM as Hj,aN as p_,aO as Vr,aP as g_,aQ as j_,aR as Fj,aS as Gj,aT as v_,aU as N_,aV as og,aW as b_,aX as y_,aY as w_,aZ as __,a_ as S_}from"./icons-Dluc6IJB.js";import{S as k_,p as C_,j as T_,a as E_,E as dg,R as M_,o as z_}from"./codemirror-TZqPU532.js";import{u as Vj,a as Bo,s as qj,K as Kj,P as Qj,b as Yj,D as Jj,c as Xj,S as Zj,v as A_,d as Wj,C as ev,h as O_}from"./dnd-BiPfFtVp.js";import{_ as ga,c as D_,g as sv,D as R_,z as ko}from"./misc-Dw5FBFSX.js";import{D as L_,U as U_}from"./uppy-wQRVMWCa.js";import{M as $_,r as B_,a as I_,b as P_}from"./markdown-CKA5gBQ9.js";import{c as H_,H as Io,P as Po,u as F_,d as G_,R as V_,B as q_,e as K_,C as Q_,M as Y_,f as J_}from"./reactflow-DtsZHOR4.js";(function(){const n=document.createElement("link").relList;if(n&&n.supports&&n.supports("modulepreload"))return;for(const u of document.querySelectorAll('link[rel="modulepreload"]'))c(u);new MutationObserver(u=>{for(const x of u)if(x.type==="childList")for(const h of x.addedNodes)h.tagName==="LINK"&&h.rel==="modulepreload"&&c(h)}).observe(document,{childList:!0,subtree:!0});function i(u){const x={};return u.integrity&&(x.integrity=u.integrity),u.referrerPolicy&&(x.referrerPolicy=u.referrerPolicy),u.crossOrigin==="use-credentials"?x.credentials="include":u.crossOrigin==="anonymous"?x.credentials="omit":x.credentials="same-origin",x}function c(u){if(u.ep)return;u.ep=!0;const x=i(u);fetch(u.href,x)}})();var ym={exports:{}},Bi={},wm={exports:{}},_m={};var ug;function X_(){return ug||(ug=1,(function(l){function n(z,V){var B=z.length;z.push(V);e:for(;0>>1,K=z[oe];if(0>>1;oe<_e;){var pe=2*(oe+1)-1,ke=z[pe],O=pe+1,k=z[O];if(0>u(ke,B))Ou(k,ke)?(z[oe]=k,z[O]=B,oe=O):(z[oe]=ke,z[pe]=B,oe=pe);else if(Ou(k,B))z[oe]=k,z[O]=B,oe=O;else break e}}return V}function u(z,V){var B=z.sortIndex-V.sortIndex;return B!==0?B:z.id-V.id}if(l.unstable_now=void 0,typeof performance=="object"&&typeof performance.now=="function"){var x=performance;l.unstable_now=function(){return x.now()}}else{var h=Date,f=h.now();l.unstable_now=function(){return h.now()-f}}var p=[],g=[],N=1,v=null,y=3,w=!1,b=!1,R=!1,D=!1,S=typeof setTimeout=="function"?setTimeout:null,P=typeof clearTimeout=="function"?clearTimeout:null,M=typeof setImmediate<"u"?setImmediate:null;function T(z){for(var V=i(g);V!==null;){if(V.callback===null)c(g);else if(V.startTime<=z)c(g),V.sortIndex=V.expirationTime,n(p,V);else break;V=i(g)}}function A(z){if(R=!1,T(z),!b)if(i(p)!==null)b=!0,F||(F=!0,he());else{var V=i(g);V!==null&&je(A,V.startTime-z)}}var F=!1,L=-1,J=5,U=-1;function ue(){return D?!0:!(l.unstable_now()-Uz&&ue());){var oe=v.callback;if(typeof oe=="function"){v.callback=null,y=v.priorityLevel;var K=oe(v.expirationTime<=z);if(z=l.unstable_now(),typeof K=="function"){v.callback=K,T(z),V=!0;break s}v===i(p)&&c(p),T(z)}else c(p);v=i(p)}if(v!==null)V=!0;else{var _e=i(g);_e!==null&&je(A,_e.startTime-z),V=!1}}break e}finally{v=null,y=B,w=!1}V=void 0}}finally{V?he():F=!1}}}var he;if(typeof M=="function")he=function(){M(xe)};else if(typeof MessageChannel<"u"){var ne=new MessageChannel,ve=ne.port2;ne.port1.onmessage=xe,he=function(){ve.postMessage(null)}}else he=function(){S(xe,0)};function je(z,V){L=S(function(){z(l.unstable_now())},V)}l.unstable_IdlePriority=5,l.unstable_ImmediatePriority=1,l.unstable_LowPriority=4,l.unstable_NormalPriority=3,l.unstable_Profiling=null,l.unstable_UserBlockingPriority=2,l.unstable_cancelCallback=function(z){z.callback=null},l.unstable_forceFrameRate=function(z){0>z||125oe?(z.sortIndex=B,n(g,z),i(p)===null&&z===i(g)&&(R?(P(L),L=-1):R=!0,je(A,B-oe))):(z.sortIndex=K,n(p,z),b||w||(b=!0,F||(F=!0,he()))),z},l.unstable_shouldYield=ue,l.unstable_wrapCallback=function(z){var V=y;return function(){var B=y;y=V;try{return z.apply(this,arguments)}finally{y=B}}}})(_m)),_m}var mg;function Z_(){return mg||(mg=1,wm.exports=X_()),wm.exports}var xg;function W_(){if(xg)return Bi;xg=1;var l=Z_(),n=C0(),i=T0();function c(s){var t="https://react.dev/errors/"+s;if(1K||(s.current=oe[K],oe[K]=null,K--)}function ke(s,t){K++,oe[K]=s.current,s.current=t}var O=_e(null),k=_e(null),H=_e(null),se=_e(null);function Ee(s,t){switch(ke(H,t),ke(k,s),ke(O,null),t.nodeType){case 9:case 11:s=(s=t.documentElement)&&(s=s.namespaceURI)?Ep(s):0;break;default:if(s=t.tagName,t=t.namespaceURI)t=Ep(t),s=Mp(t,s);else switch(s){case"svg":s=1;break;case"math":s=2;break;default:s=0}}pe(O),ke(O,s)}function Z(){pe(O),pe(k),pe(H)}function Oe(s){s.memoizedState!==null&&ke(se,s);var t=O.current,a=Mp(t,s.type);t!==a&&(ke(k,s),ke(O,a))}function ns(s){k.current===s&&(pe(O),pe(k)),se.current===s&&(pe(se),Ri._currentValue=B)}var Q,ee;function Ue(s){if(Q===void 0)try{throw Error()}catch(a){var t=a.stack.trim().match(/\n( *(at )?)/);Q=t&&t[1]||"",ee=-1{for(const x of u)if(x.type==="childList")for(const h of x.addedNodes)h.tagName==="LINK"&&h.rel==="modulepreload"&&c(h)}).observe(document,{childList:!0,subtree:!0});function i(u){const x={};return u.integrity&&(x.integrity=u.integrity),u.referrerPolicy&&(x.referrerPolicy=u.referrerPolicy),u.crossOrigin==="use-credentials"?x.credentials="include":u.crossOrigin==="anonymous"?x.credentials="omit":x.credentials="same-origin",x}function c(u){if(u.ep)return;u.ep=!0;const x=i(u);fetch(u.href,x)}})();var ym={exports:{}},Bi={},wm={exports:{}},_m={};var ug;function X_(){return ug||(ug=1,(function(l){function n(z,V){var B=z.length;z.push(V);e:for(;0>>1,K=z[oe];if(0>>1;oe<_e;){var pe=2*(oe+1)-1,ke=z[pe],O=pe+1,k=z[O];if(0>u(ke,B))Ou(k,ke)?(z[oe]=k,z[O]=B,oe=O):(z[oe]=ke,z[pe]=B,oe=pe);else if(Ou(k,B))z[oe]=k,z[O]=B,oe=O;else break e}}return V}function u(z,V){var B=z.sortIndex-V.sortIndex;return B!==0?B:z.id-V.id}if(l.unstable_now=void 0,typeof performance=="object"&&typeof performance.now=="function"){var x=performance;l.unstable_now=function(){return x.now()}}else{var h=Date,f=h.now();l.unstable_now=function(){return h.now()-f}}var p=[],g=[],N=1,v=null,y=3,w=!1,b=!1,R=!1,D=!1,S=typeof setTimeout=="function"?setTimeout:null,P=typeof clearTimeout=="function"?clearTimeout:null,M=typeof setImmediate<"u"?setImmediate:null;function T(z){for(var V=i(g);V!==null;){if(V.callback===null)c(g);else if(V.startTime<=z)c(g),V.sortIndex=V.expirationTime,n(p,V);else break;V=i(g)}}function A(z){if(R=!1,T(z),!b)if(i(p)!==null)b=!0,F||(F=!0,he());else{var V=i(g);V!==null&&je(A,V.startTime-z)}}var F=!1,L=-1,J=5,U=-1;function ue(){return D?!0:!(l.unstable_now()-Uz&&ue());){var oe=v.callback;if(typeof oe=="function"){v.callback=null,y=v.priorityLevel;var K=oe(v.expirationTime<=z);if(z=l.unstable_now(),typeof K=="function"){v.callback=K,T(z),V=!0;break s}v===i(p)&&c(p),T(z)}else c(p);v=i(p)}if(v!==null)V=!0;else{var _e=i(g);_e!==null&&je(A,_e.startTime-z),V=!1}}break e}finally{v=null,y=B,w=!1}V=void 0}}finally{V?he():F=!1}}}var he;if(typeof M=="function")he=function(){M(xe)};else if(typeof MessageChannel<"u"){var ne=new MessageChannel,ve=ne.port2;ne.port1.onmessage=xe,he=function(){ve.postMessage(null)}}else he=function(){S(xe,0)};function je(z,V){L=S(function(){z(l.unstable_now())},V)}l.unstable_IdlePriority=5,l.unstable_ImmediatePriority=1,l.unstable_LowPriority=4,l.unstable_NormalPriority=3,l.unstable_Profiling=null,l.unstable_UserBlockingPriority=2,l.unstable_cancelCallback=function(z){z.callback=null},l.unstable_forceFrameRate=function(z){0>z||125oe?(z.sortIndex=B,n(g,z),i(p)===null&&z===i(g)&&(R?(P(L),L=-1):R=!0,je(A,B-oe))):(z.sortIndex=K,n(p,z),b||w||(b=!0,F||(F=!0,he()))),z},l.unstable_shouldYield=ue,l.unstable_wrapCallback=function(z){var V=y;return function(){var B=y;y=V;try{return z.apply(this,arguments)}finally{y=B}}}})(_m)),_m}var mg;function Z_(){return mg||(mg=1,wm.exports=X_()),wm.exports}var xg;function W_(){if(xg)return Bi;xg=1;var l=Z_(),n=C0(),i=T0();function c(s){var t="https://react.dev/errors/"+s;if(1K||(s.current=oe[K],oe[K]=null,K--)}function ke(s,t){K++,oe[K]=s.current,s.current=t}var O=_e(null),k=_e(null),H=_e(null),se=_e(null);function Ee(s,t){switch(ke(H,t),ke(k,s),ke(O,null),t.nodeType){case 9:case 11:s=(s=t.documentElement)&&(s=s.namespaceURI)?Ep(s):0;break;default:if(s=t.tagName,t=t.namespaceURI)t=Ep(t),s=Mp(t,s);else switch(s){case"svg":s=1;break;case"math":s=2;break;default:s=0}}pe(O),ke(O,s)}function Z(){pe(O),pe(k),pe(H)}function Oe(s){s.memoizedState!==null&&ke(se,s);var t=O.current,a=Mp(t,s.type);t!==a&&(ke(k,s),ke(O,a))}function ns(s){k.current===s&&(pe(O),pe(k)),se.current===s&&(pe(se),Ri._currentValue=B)}var Q,ee;function Ue(s){if(Q===void 0)try{throw Error()}catch(a){var t=a.stack.trim().match(/\n( *(at )?)/);Q=t&&t[1]||"",ee=-1)":-1o||$[r]!==ae[o]){var ge=` `+$[r].replace(" at new "," at ");return s.displayName&&ge.includes("")&&(ge=ge.replace("",s.displayName)),ge}while(1<=r&&0<=o);break}}}finally{ie=!1,Error.prepareStackTrace=a}return(a=s?s.displayName||s.name:"")?Ue(a):""}function de(s,t){switch(s.tag){case 26:case 27:case 5:return Ue(s.type);case 16:return Ue("Lazy");case 13:return s.child!==t&&t!==null?Ue("Suspense Fallback"):Ue("Suspense");case 19:return Ue("SuspenseList");case 0:case 15:return Te(s.type,!1);case 11:return Te(s.type.render,!1);case 1:return Te(s.type,!0);case 31:return Ue("Activity");default:return""}}function Me(s){try{var t="",a=null;do t+=de(s,a),a=s,s=s.return;while(s);return t}catch(r){return` Error generating stack: `+r.message+` -`+r.stack}}var rs=Object.prototype.hasOwnProperty,Ut=l.unstable_scheduleCallback,aa=l.unstable_cancelCallback,Ka=l.unstable_shouldYield,Ft=l.unstable_requestPaint,mt=l.unstable_now,q=l.unstable_getCurrentPriorityLevel,Ve=l.unstable_ImmediatePriority,Ke=l.unstable_UserBlockingPriority,We=l.unstable_NormalPriority,Ls=l.unstable_LowPriority,ts=l.unstable_IdlePriority,Cs=l.log,ze=l.unstable_setDisableYieldValue,Ns=null,as=null;function es(s){if(typeof Cs=="function"&&ze(s),as&&typeof as.setStrictMode=="function")try{as.setStrictMode(Ns,s)}catch{}}var bs=Math.clz32?Math.clz32:tt,gt=Math.log,$t=Math.LN2;function tt(s){return s>>>=0,s===0?32:31-(gt(s)/$t|0)|0}var Ms=256,Tt=262144,Bt=4194304;function Aa(s){var t=s&42;if(t!==0)return t;switch(s&-s){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 s&261888;case 262144:case 524288:case 1048576:case 2097152:return s&3932160;case 4194304:case 8388608:case 16777216:case 33554432:return s&62914560;case 67108864:return 67108864;case 134217728:return 134217728;case 268435456:return 268435456;case 536870912:return 536870912;case 1073741824:return 0;default:return s}}function tl(s,t,a){var r=s.pendingLanes;if(r===0)return 0;var o=0,m=s.suspendedLanes,j=s.pingedLanes;s=s.warmLanes;var C=r&134217727;return C!==0?(r=C&~m,r!==0?o=Aa(r):(j&=C,j!==0?o=Aa(j):a||(a=C&~s,a!==0&&(o=Aa(a))))):(C=r&~m,C!==0?o=Aa(C):j!==0?o=Aa(j):a||(a=r&~s,a!==0&&(o=Aa(a)))),o===0?0:t!==0&&t!==o&&(t&m)===0&&(m=o&-o,a=t&-t,m>=a||m===32&&(a&4194048)!==0)?t:o}function ul(s,t){return(s.pendingLanes&~(s.suspendedLanes&~s.pingedLanes)&t)===0}function Xn(s,t){switch(s){case 1:case 2:case 4:case 8:case 64:return t+250;case 16:case 32:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return t+5e3;case 4194304:case 8388608:case 16777216:case 33554432:return-1;case 67108864:case 134217728:case 268435456:case 536870912:case 1073741824:return-1;default:return-1}}function W(){var s=Bt;return Bt<<=1,(Bt&62914560)===0&&(Bt=4194304),s}function ye(s){for(var t=[],a=0;31>a;a++)t.push(s);return t}function Re(s,t){s.pendingLanes|=t,t!==268435456&&(s.suspendedLanes=0,s.pingedLanes=0,s.warmLanes=0)}function Hs(s,t,a,r,o,m){var j=s.pendingLanes;s.pendingLanes=a,s.suspendedLanes=0,s.pingedLanes=0,s.warmLanes=0,s.expiredLanes&=a,s.entangledLanes&=a,s.errorRecoveryDisabledLanes&=a,s.shellSuspendCounter=0;var C=s.entanglements,$=s.expirationTimes,ae=s.hiddenUpdates;for(a=j&~a;0"u")return null;try{return s.activeElement||s.body}catch{return s.body}}var xb=/[\n"\\]/g;function Da(s){return s.replace(xb,function(t){return"\\"+t.charCodeAt(0).toString(16)+" "})}function xd(s,t,a,r,o,m,j,C){s.name="",j!=null&&typeof j!="function"&&typeof j!="symbol"&&typeof j!="boolean"?s.type=j:s.removeAttribute("type"),t!=null?j==="number"?(t===0&&s.value===""||s.value!=t)&&(s.value=""+Oa(t)):s.value!==""+Oa(t)&&(s.value=""+Oa(t)):j!=="submit"&&j!=="reset"||s.removeAttribute("value"),t!=null?hd(s,j,Oa(t)):a!=null?hd(s,j,Oa(a)):r!=null&&s.removeAttribute("value"),o==null&&m!=null&&(s.defaultChecked=!!m),o!=null&&(s.checked=o&&typeof o!="function"&&typeof o!="symbol"),C!=null&&typeof C!="function"&&typeof C!="symbol"&&typeof C!="boolean"?s.name=""+Oa(C):s.removeAttribute("name")}function yx(s,t,a,r,o,m,j,C){if(m!=null&&typeof m!="function"&&typeof m!="symbol"&&typeof m!="boolean"&&(s.type=m),t!=null||a!=null){if(!(m!=="submit"&&m!=="reset"||t!=null)){md(s);return}a=a!=null?""+Oa(a):"",t=t!=null?""+Oa(t):a,C||t===s.value||(s.value=t),s.defaultValue=t}r=r??o,r=typeof r!="function"&&typeof r!="symbol"&&!!r,s.checked=C?s.checked:!!r,s.defaultChecked=!!r,j!=null&&typeof j!="function"&&typeof j!="symbol"&&typeof j!="boolean"&&(s.name=j),md(s)}function hd(s,t,a){t==="number"&&fc(s.ownerDocument)===s||s.defaultValue===""+a||(s.defaultValue=""+a)}function ar(s,t,a,r){if(s=s.options,t){t={};for(var o=0;o"u"||typeof window.document>"u"||typeof window.document.createElement>"u"),vd=!1;if(hl)try{var Wr={};Object.defineProperty(Wr,"passive",{get:function(){vd=!0}}),window.addEventListener("test",Wr,Wr),window.removeEventListener("test",Wr,Wr)}catch{vd=!1}var Il=null,Nd=null,gc=null;function Ex(){if(gc)return gc;var s,t=Nd,a=t.length,r,o="value"in Il?Il.value:Il.textContent,m=o.length;for(s=0;s=ti),Rx=" ",Lx=!1;function Ux(s,t){switch(s){case"keyup":return Pb.indexOf(t.keyCode)!==-1;case"keydown":return t.keyCode!==229;case"keypress":case"mousedown":case"focusout":return!0;default:return!1}}function $x(s){return s=s.detail,typeof s=="object"&&"data"in s?s.data:null}var ir=!1;function Fb(s,t){switch(s){case"compositionend":return $x(t);case"keypress":return t.which!==32?null:(Lx=!0,Rx);case"textInput":return s=t.data,s===Rx&&Lx?null:s;default:return null}}function Gb(s,t){if(ir)return s==="compositionend"||!Sd&&Ux(s,t)?(s=Ex(),gc=Nd=Il=null,ir=!1,s):null;switch(s){case"paste":return null;case"keypress":if(!(t.ctrlKey||t.altKey||t.metaKey)||t.ctrlKey&&t.altKey){if(t.char&&1=t)return{node:a,offset:t-s};s=r}e:{for(;a;){if(a.nextSibling){a=a.nextSibling;break e}a=a.parentNode}a=void 0}a=qx(a)}}function Qx(s,t){return s&&t?s===t?!0:s&&s.nodeType===3?!1:t&&t.nodeType===3?Qx(s,t.parentNode):"contains"in s?s.contains(t):s.compareDocumentPosition?!!(s.compareDocumentPosition(t)&16):!1:!1}function Yx(s){s=s!=null&&s.ownerDocument!=null&&s.ownerDocument.defaultView!=null?s.ownerDocument.defaultView:window;for(var t=fc(s.document);t instanceof s.HTMLIFrameElement;){try{var a=typeof t.contentWindow.location.href=="string"}catch{a=!1}if(a)s=t.contentWindow;else break;t=fc(s.document)}return t}function Td(s){var t=s&&s.nodeName&&s.nodeName.toLowerCase();return t&&(t==="input"&&(s.type==="text"||s.type==="search"||s.type==="tel"||s.type==="url"||s.type==="password")||t==="textarea"||s.contentEditable==="true")}var Zb=hl&&"documentMode"in document&&11>=document.documentMode,cr=null,Ed=null,ri=null,Md=!1;function Jx(s,t,a){var r=a.window===a?a.document:a.nodeType===9?a:a.ownerDocument;Md||cr==null||cr!==fc(r)||(r=cr,"selectionStart"in r&&Td(r)?r={start:r.selectionStart,end:r.selectionEnd}:(r=(r.ownerDocument&&r.ownerDocument.defaultView||window).getSelection(),r={anchorNode:r.anchorNode,anchorOffset:r.anchorOffset,focusNode:r.focusNode,focusOffset:r.focusOffset}),ri&&ni(ri,r)||(ri=r,r=uo(Ed,"onSelect"),0>=j,o-=j,al=1<<32-bs(t)+o|a<os?(Es=Ge,Ge=null):Es=Ge.sibling;var $s=ce(Y,Ge,te[os],Ne);if($s===null){Ge===null&&(Ge=Es);break}s&&Ge&&$s.alternate===null&&t(Y,Ge),G=m($s,G,os),Us===null?Qe=$s:Us.sibling=$s,Us=$s,Ge=Es}if(os===te.length)return a(Y,Ge),zs&&pl(Y,os),Qe;if(Ge===null){for(;osos?(Es=Ge,Ge=null):Es=Ge.sibling;var on=ce(Y,Ge,$s.value,Ne);if(on===null){Ge===null&&(Ge=Es);break}s&&Ge&&on.alternate===null&&t(Y,Ge),G=m(on,G,os),Us===null?Qe=on:Us.sibling=on,Us=on,Ge=Es}if($s.done)return a(Y,Ge),zs&&pl(Y,os),Qe;if(Ge===null){for(;!$s.done;os++,$s=te.next())$s=be(Y,$s.value,Ne),$s!==null&&(G=m($s,G,os),Us===null?Qe=$s:Us.sibling=$s,Us=$s);return zs&&pl(Y,os),Qe}for(Ge=r(Ge);!$s.done;os++,$s=te.next())$s=me(Ge,Y,os,$s.value,Ne),$s!==null&&(s&&$s.alternate!==null&&Ge.delete($s.key===null?os:$s.key),G=m($s,G,os),Us===null?Qe=$s:Us.sibling=$s,Us=$s);return s&&Ge.forEach(function(j0){return t(Y,j0)}),zs&&pl(Y,os),Qe}function Xs(Y,G,te,Ne){if(typeof te=="object"&&te!==null&&te.type===R&&te.key===null&&(te=te.props.children),typeof te=="object"&&te!==null){switch(te.$$typeof){case w:e:{for(var Qe=te.key;G!==null;){if(G.key===Qe){if(Qe=te.type,Qe===R){if(G.tag===7){a(Y,G.sibling),Ne=o(G,te.props.children),Ne.return=Y,Y=Ne;break e}}else if(G.elementType===Qe||typeof Qe=="object"&&Qe!==null&&Qe.$$typeof===J&&An(Qe)===G.type){a(Y,G.sibling),Ne=o(G,te.props),mi(Ne,te),Ne.return=Y,Y=Ne;break e}a(Y,G);break}else t(Y,G);G=G.sibling}te.type===R?(Ne=Cn(te.props.children,Y.mode,Ne,te.key),Ne.return=Y,Y=Ne):(Ne=Cc(te.type,te.key,te.props,null,Y.mode,Ne),mi(Ne,te),Ne.return=Y,Y=Ne)}return j(Y);case b:e:{for(Qe=te.key;G!==null;){if(G.key===Qe)if(G.tag===4&&G.stateNode.containerInfo===te.containerInfo&&G.stateNode.implementation===te.implementation){a(Y,G.sibling),Ne=o(G,te.children||[]),Ne.return=Y,Y=Ne;break e}else{a(Y,G);break}else t(Y,G);G=G.sibling}Ne=Ud(te,Y.mode,Ne),Ne.return=Y,Y=Ne}return j(Y);case J:return te=An(te),Xs(Y,G,te,Ne)}if(je(te))return He(Y,G,te,Ne);if(he(te)){if(Qe=he(te),typeof Qe!="function")throw Error(c(150));return te=Qe.call(te),Xe(Y,G,te,Ne)}if(typeof te.then=="function")return Xs(Y,G,Dc(te),Ne);if(te.$$typeof===M)return Xs(Y,G,Mc(Y,te),Ne);Rc(Y,te)}return typeof te=="string"&&te!==""||typeof te=="number"||typeof te=="bigint"?(te=""+te,G!==null&&G.tag===6?(a(Y,G.sibling),Ne=o(G,te),Ne.return=Y,Y=Ne):(a(Y,G),Ne=Ld(te,Y.mode,Ne),Ne.return=Y,Y=Ne),j(Y)):a(Y,G)}return function(Y,G,te,Ne){try{ui=0;var Qe=Xs(Y,G,te,Ne);return vr=null,Qe}catch(Ge){if(Ge===jr||Ge===Ac)throw Ge;var Us=va(29,Ge,null,Y.mode);return Us.lanes=Ne,Us.return=Y,Us}finally{}}}var Dn=vh(!0),Nh=vh(!1),Vl=!1;function Yd(s){s.updateQueue={baseState:s.memoizedState,firstBaseUpdate:null,lastBaseUpdate:null,shared:{pending:null,lanes:0,hiddenCallbacks:null},callbacks:null}}function Jd(s,t){s=s.updateQueue,t.updateQueue===s&&(t.updateQueue={baseState:s.baseState,firstBaseUpdate:s.firstBaseUpdate,lastBaseUpdate:s.lastBaseUpdate,shared:s.shared,callbacks:null})}function ql(s){return{lane:s,tag:0,payload:null,callback:null,next:null}}function Kl(s,t,a){var r=s.updateQueue;if(r===null)return null;if(r=r.shared,(Ps&2)!==0){var o=r.pending;return o===null?t.next=t:(t.next=o.next,o.next=t),r.pending=t,t=kc(s),ah(s,null,a),t}return Sc(s,r,t,a),kc(s)}function xi(s,t,a){if(t=t.updateQueue,t!==null&&(t=t.shared,(a&4194048)!==0)){var r=t.lanes;r&=s.pendingLanes,a|=r,t.lanes=a,Wt(s,a)}}function Xd(s,t){var a=s.updateQueue,r=s.alternate;if(r!==null&&(r=r.updateQueue,a===r)){var o=null,m=null;if(a=a.firstBaseUpdate,a!==null){do{var j={lane:a.lane,tag:a.tag,payload:a.payload,callback:null,next:null};m===null?o=m=j:m=m.next=j,a=a.next}while(a!==null);m===null?o=m=t:m=m.next=t}else o=m=t;a={baseState:r.baseState,firstBaseUpdate:o,lastBaseUpdate:m,shared:r.shared,callbacks:r.callbacks},s.updateQueue=a;return}s=a.lastBaseUpdate,s===null?a.firstBaseUpdate=t:s.next=t,a.lastBaseUpdate=t}var Zd=!1;function hi(){if(Zd){var s=gr;if(s!==null)throw s}}function fi(s,t,a,r){Zd=!1;var o=s.updateQueue;Vl=!1;var m=o.firstBaseUpdate,j=o.lastBaseUpdate,C=o.shared.pending;if(C!==null){o.shared.pending=null;var $=C,ae=$.next;$.next=null,j===null?m=ae:j.next=ae,j=$;var ge=s.alternate;ge!==null&&(ge=ge.updateQueue,C=ge.lastBaseUpdate,C!==j&&(C===null?ge.firstBaseUpdate=ae:C.next=ae,ge.lastBaseUpdate=$))}if(m!==null){var be=o.baseState;j=0,ge=ae=$=null,C=m;do{var ce=C.lane&-536870913,me=ce!==C.lane;if(me?(Ts&ce)===ce:(r&ce)===ce){ce!==0&&ce===pr&&(Zd=!0),ge!==null&&(ge=ge.next={lane:0,tag:C.tag,payload:C.payload,callback:null,next:null});e:{var He=s,Xe=C;ce=t;var Xs=a;switch(Xe.tag){case 1:if(He=Xe.payload,typeof He=="function"){be=He.call(Xs,be,ce);break e}be=He;break e;case 3:He.flags=He.flags&-65537|128;case 0:if(He=Xe.payload,ce=typeof He=="function"?He.call(Xs,be,ce):He,ce==null)break e;be=v({},be,ce);break e;case 2:Vl=!0}}ce=C.callback,ce!==null&&(s.flags|=64,me&&(s.flags|=8192),me=o.callbacks,me===null?o.callbacks=[ce]:me.push(ce))}else me={lane:ce,tag:C.tag,payload:C.payload,callback:C.callback,next:null},ge===null?(ae=ge=me,$=be):ge=ge.next=me,j|=ce;if(C=C.next,C===null){if(C=o.shared.pending,C===null)break;me=C,C=me.next,me.next=null,o.lastBaseUpdate=me,o.shared.pending=null}}while(!0);ge===null&&($=be),o.baseState=$,o.firstBaseUpdate=ae,o.lastBaseUpdate=ge,m===null&&(o.shared.lanes=0),Zl|=j,s.lanes=j,s.memoizedState=be}}function bh(s,t){if(typeof s!="function")throw Error(c(191,s));s.call(t)}function yh(s,t){var a=s.callbacks;if(a!==null)for(s.callbacks=null,s=0;sm?m:8;var j=z.T,C={};z.T=C,gu(s,!1,t,a);try{var $=o(),ae=z.S;if(ae!==null&&ae(C,$),$!==null&&typeof $=="object"&&typeof $.then=="function"){var ge=iy($,r);ji(s,t,ge,_a(s))}else ji(s,t,r,_a(s))}catch(be){ji(s,t,{then:function(){},status:"rejected",reason:be},_a())}finally{V.p=m,j!==null&&C.types!==null&&(j.types=C.types),z.T=j}}function xy(){}function fu(s,t,a,r){if(s.tag!==5)throw Error(c(476));var o=ef(s).queue;Wh(s,o,t,B,a===null?xy:function(){return sf(s),a(r)})}function ef(s){var t=s.memoizedState;if(t!==null)return t;t={memoizedState:B,baseState:B,baseQueue:null,queue:{pending:null,lanes:0,dispatch:null,lastRenderedReducer:Nl,lastRenderedState:B},next:null};var a={};return t.next={memoizedState:a,baseState:a,baseQueue:null,queue:{pending:null,lanes:0,dispatch:null,lastRenderedReducer:Nl,lastRenderedState:a},next:null},s.memoizedState=t,s=s.alternate,s!==null&&(s.memoizedState=t),t}function sf(s){var t=ef(s);t.next===null&&(t=s.alternate.memoizedState),ji(s,t.next.queue,{},_a())}function pu(){return Vt(Ri)}function tf(){return St().memoizedState}function af(){return St().memoizedState}function hy(s){for(var t=s.return;t!==null;){switch(t.tag){case 24:case 3:var a=_a();s=ql(a);var r=Kl(t,s,a);r!==null&&(fa(r,t,a),xi(r,t,a)),t={cache:Vd()},s.payload=t;return}t=t.return}}function fy(s,t,a){var r=_a();a={lane:r,revertLane:0,gesture:null,action:a,hasEagerState:!1,eagerState:null,next:null},Vc(s)?nf(t,a):(a=Dd(s,t,a,r),a!==null&&(fa(a,s,r),rf(a,t,r)))}function lf(s,t,a){var r=_a();ji(s,t,a,r)}function ji(s,t,a,r){var o={lane:r,revertLane:0,gesture:null,action:a,hasEagerState:!1,eagerState:null,next:null};if(Vc(s))nf(t,o);else{var m=s.alternate;if(s.lanes===0&&(m===null||m.lanes===0)&&(m=t.lastRenderedReducer,m!==null))try{var j=t.lastRenderedState,C=m(j,a);if(o.hasEagerState=!0,o.eagerState=C,ja(C,j))return Sc(s,t,o,0),Ws===null&&_c(),!1}catch{}finally{}if(a=Dd(s,t,o,r),a!==null)return fa(a,s,r),rf(a,t,r),!0}return!1}function gu(s,t,a,r){if(r={lane:2,revertLane:Yu(),gesture:null,action:r,hasEagerState:!1,eagerState:null,next:null},Vc(s)){if(t)throw Error(c(479))}else t=Dd(s,a,r,2),t!==null&&fa(t,s,2)}function Vc(s){var t=s.alternate;return s===is||t!==null&&t===is}function nf(s,t){br=$c=!0;var a=s.pending;a===null?t.next=t:(t.next=a.next,a.next=t),s.pending=t}function rf(s,t,a){if((a&4194048)!==0){var r=t.lanes;r&=s.pendingLanes,a|=r,t.lanes=a,Wt(s,a)}}var vi={readContext:Vt,use:Pc,useCallback:jt,useContext:jt,useEffect:jt,useImperativeHandle:jt,useLayoutEffect:jt,useInsertionEffect:jt,useMemo:jt,useReducer:jt,useRef:jt,useState:jt,useDebugValue:jt,useDeferredValue:jt,useTransition:jt,useSyncExternalStore:jt,useId:jt,useHostTransitionStatus:jt,useFormState:jt,useActionState:jt,useOptimistic:jt,useMemoCache:jt,useCacheRefresh:jt};vi.useEffectEvent=jt;var cf={readContext:Vt,use:Pc,useCallback:function(s,t){return la().memoizedState=[s,t===void 0?null:t],s},useContext:Vt,useEffect:Gh,useImperativeHandle:function(s,t,a){a=a!=null?a.concat([s]):null,Fc(4194308,4,Qh.bind(null,t,s),a)},useLayoutEffect:function(s,t){return Fc(4194308,4,s,t)},useInsertionEffect:function(s,t){Fc(4,2,s,t)},useMemo:function(s,t){var a=la();t=t===void 0?null:t;var r=s();if(Rn){es(!0);try{s()}finally{es(!1)}}return a.memoizedState=[r,t],r},useReducer:function(s,t,a){var r=la();if(a!==void 0){var o=a(t);if(Rn){es(!0);try{a(t)}finally{es(!1)}}}else o=t;return r.memoizedState=r.baseState=o,s={pending:null,lanes:0,dispatch:null,lastRenderedReducer:s,lastRenderedState:o},r.queue=s,s=s.dispatch=fy.bind(null,is,s),[r.memoizedState,s]},useRef:function(s){var t=la();return s={current:s},t.memoizedState=s},useState:function(s){s=du(s);var t=s.queue,a=lf.bind(null,is,t);return t.dispatch=a,[s.memoizedState,a]},useDebugValue:xu,useDeferredValue:function(s,t){var a=la();return hu(a,s,t)},useTransition:function(){var s=du(!1);return s=Wh.bind(null,is,s.queue,!0,!1),la().memoizedState=s,[!1,s]},useSyncExternalStore:function(s,t,a){var r=is,o=la();if(zs){if(a===void 0)throw Error(c(407));a=a()}else{if(a=t(),Ws===null)throw Error(c(349));(Ts&127)!==0||Th(r,t,a)}o.memoizedState=a;var m={value:a,getSnapshot:t};return o.queue=m,Gh(Mh.bind(null,r,m,s),[s]),r.flags|=2048,wr(9,{destroy:void 0},Eh.bind(null,r,m,a,t),null),a},useId:function(){var s=la(),t=Ws.identifierPrefix;if(zs){var a=ll,r=al;a=(r&~(1<<32-bs(r)-1)).toString(32)+a,t="_"+t+"R_"+a,a=Bc++,0<\/script>",m=m.removeChild(m.firstChild);break;case"select":m=typeof r.is=="string"?j.createElement("select",{is:r.is}):j.createElement("select"),r.multiple?m.multiple=!0:r.size&&(m.size=r.size);break;default:m=typeof r.is=="string"?j.createElement(o,{is:r.is}):j.createElement(o)}}m[gs]=t,m[cs]=r;e:for(j=t.child;j!==null;){if(j.tag===5||j.tag===6)m.appendChild(j.stateNode);else if(j.tag!==4&&j.tag!==27&&j.child!==null){j.child.return=j,j=j.child;continue}if(j===t)break e;for(;j.sibling===null;){if(j.return===null||j.return===t)break e;j=j.return}j.sibling.return=j.return,j=j.sibling}t.stateNode=m;e:switch(Kt(m,o,r),o){case"button":case"input":case"select":case"textarea":r=!!r.autoFocus;break e;case"img":r=!0;break e;default:r=!1}r&&yl(t)}}return ct(t),zu(t,t.type,s===null?null:s.memoizedProps,t.pendingProps,a),null;case 6:if(s&&t.stateNode!=null)s.memoizedProps!==r&&yl(t);else{if(typeof r!="string"&&t.stateNode===null)throw Error(c(166));if(s=H.current,hr(t)){if(s=t.stateNode,a=t.memoizedProps,r=null,o=Gt,o!==null)switch(o.tag){case 27:case 5:r=o.memoizedProps}s[gs]=t,s=!!(s.nodeValue===a||r!==null&&r.suppressHydrationWarning===!0||Cp(s.nodeValue,a)),s||Fl(t,!0)}else s=mo(s).createTextNode(r),s[gs]=t,t.stateNode=s}return ct(t),null;case 31:if(a=t.memoizedState,s===null||s.memoizedState!==null){if(r=hr(t),a!==null){if(s===null){if(!r)throw Error(c(318));if(s=t.memoizedState,s=s!==null?s.dehydrated:null,!s)throw Error(c(557));s[gs]=t}else Tn(),(t.flags&128)===0&&(t.memoizedState=null),t.flags|=4;ct(t),s=!1}else a=Pd(),s!==null&&s.memoizedState!==null&&(s.memoizedState.hydrationErrors=a),s=!0;if(!s)return t.flags&256?(ba(t),t):(ba(t),null);if((t.flags&128)!==0)throw Error(c(558))}return ct(t),null;case 13:if(r=t.memoizedState,s===null||s.memoizedState!==null&&s.memoizedState.dehydrated!==null){if(o=hr(t),r!==null&&r.dehydrated!==null){if(s===null){if(!o)throw Error(c(318));if(o=t.memoizedState,o=o!==null?o.dehydrated:null,!o)throw Error(c(317));o[gs]=t}else Tn(),(t.flags&128)===0&&(t.memoizedState=null),t.flags|=4;ct(t),o=!1}else o=Pd(),s!==null&&s.memoizedState!==null&&(s.memoizedState.hydrationErrors=o),o=!0;if(!o)return t.flags&256?(ba(t),t):(ba(t),null)}return ba(t),(t.flags&128)!==0?(t.lanes=a,t):(a=r!==null,s=s!==null&&s.memoizedState!==null,a&&(r=t.child,o=null,r.alternate!==null&&r.alternate.memoizedState!==null&&r.alternate.memoizedState.cachePool!==null&&(o=r.alternate.memoizedState.cachePool.pool),m=null,r.memoizedState!==null&&r.memoizedState.cachePool!==null&&(m=r.memoizedState.cachePool.pool),m!==o&&(r.flags|=2048)),a!==s&&a&&(t.child.flags|=8192),Jc(t,t.updateQueue),ct(t),null);case 4:return Z(),s===null&&Wu(t.stateNode.containerInfo),ct(t),null;case 10:return jl(t.type),ct(t),null;case 19:if(pe(_t),r=t.memoizedState,r===null)return ct(t),null;if(o=(t.flags&128)!==0,m=r.rendering,m===null)if(o)bi(r,!1);else{if(vt!==0||s!==null&&(s.flags&128)!==0)for(s=t.child;s!==null;){if(m=Uc(s),m!==null){for(t.flags|=128,bi(r,!1),s=m.updateQueue,t.updateQueue=s,Jc(t,s),t.subtreeFlags=0,s=a,a=t.child;a!==null;)lh(a,s),a=a.sibling;return ke(_t,_t.current&1|2),zs&&pl(t,r.treeForkCount),t.child}s=s.sibling}r.tail!==null&&mt()>so&&(t.flags|=128,o=!0,bi(r,!1),t.lanes=4194304)}else{if(!o)if(s=Uc(m),s!==null){if(t.flags|=128,o=!0,s=s.updateQueue,t.updateQueue=s,Jc(t,s),bi(r,!0),r.tail===null&&r.tailMode==="hidden"&&!m.alternate&&!zs)return ct(t),null}else 2*mt()-r.renderingStartTime>so&&a!==536870912&&(t.flags|=128,o=!0,bi(r,!1),t.lanes=4194304);r.isBackwards?(m.sibling=t.child,t.child=m):(s=r.last,s!==null?s.sibling=m:t.child=m,r.last=m)}return r.tail!==null?(s=r.tail,r.rendering=s,r.tail=s.sibling,r.renderingStartTime=mt(),s.sibling=null,a=_t.current,ke(_t,o?a&1|2:a&1),zs&&pl(t,r.treeForkCount),s):(ct(t),null);case 22:case 23:return ba(t),eu(),r=t.memoizedState!==null,s!==null?s.memoizedState!==null!==r&&(t.flags|=8192):r&&(t.flags|=8192),r?(a&536870912)!==0&&(t.flags&128)===0&&(ct(t),t.subtreeFlags&6&&(t.flags|=8192)):ct(t),a=t.updateQueue,a!==null&&Jc(t,a.retryQueue),a=null,s!==null&&s.memoizedState!==null&&s.memoizedState.cachePool!==null&&(a=s.memoizedState.cachePool.pool),r=null,t.memoizedState!==null&&t.memoizedState.cachePool!==null&&(r=t.memoizedState.cachePool.pool),r!==a&&(t.flags|=2048),s!==null&&pe(zn),null;case 24:return a=null,s!==null&&(a=s.memoizedState.cache),t.memoizedState.cache!==a&&(t.flags|=2048),jl(Mt),ct(t),null;case 25:return null;case 30:return null}throw Error(c(156,t.tag))}function Ny(s,t){switch(Bd(t),t.tag){case 1:return s=t.flags,s&65536?(t.flags=s&-65537|128,t):null;case 3:return jl(Mt),Z(),s=t.flags,(s&65536)!==0&&(s&128)===0?(t.flags=s&-65537|128,t):null;case 26:case 27:case 5:return ns(t),null;case 31:if(t.memoizedState!==null){if(ba(t),t.alternate===null)throw Error(c(340));Tn()}return s=t.flags,s&65536?(t.flags=s&-65537|128,t):null;case 13:if(ba(t),s=t.memoizedState,s!==null&&s.dehydrated!==null){if(t.alternate===null)throw Error(c(340));Tn()}return s=t.flags,s&65536?(t.flags=s&-65537|128,t):null;case 19:return pe(_t),null;case 4:return Z(),null;case 10:return jl(t.type),null;case 22:case 23:return ba(t),eu(),s!==null&&pe(zn),s=t.flags,s&65536?(t.flags=s&-65537|128,t):null;case 24:return jl(Mt),null;case 25:return null;default:return null}}function Af(s,t){switch(Bd(t),t.tag){case 3:jl(Mt),Z();break;case 26:case 27:case 5:ns(t);break;case 4:Z();break;case 31:t.memoizedState!==null&&ba(t);break;case 13:ba(t);break;case 19:pe(_t);break;case 10:jl(t.type);break;case 22:case 23:ba(t),eu(),s!==null&&pe(zn);break;case 24:jl(Mt)}}function yi(s,t){try{var a=t.updateQueue,r=a!==null?a.lastEffect:null;if(r!==null){var o=r.next;a=o;do{if((a.tag&s)===s){r=void 0;var m=a.create,j=a.inst;r=m(),j.destroy=r}a=a.next}while(a!==o)}}catch(C){Vs(t,t.return,C)}}function Jl(s,t,a){try{var r=t.updateQueue,o=r!==null?r.lastEffect:null;if(o!==null){var m=o.next;r=m;do{if((r.tag&s)===s){var j=r.inst,C=j.destroy;if(C!==void 0){j.destroy=void 0,o=t;var $=a,ae=C;try{ae()}catch(ge){Vs(o,$,ge)}}}r=r.next}while(r!==m)}}catch(ge){Vs(t,t.return,ge)}}function Of(s){var t=s.updateQueue;if(t!==null){var a=s.stateNode;try{yh(t,a)}catch(r){Vs(s,s.return,r)}}}function Df(s,t,a){a.props=Ln(s.type,s.memoizedProps),a.state=s.memoizedState;try{a.componentWillUnmount()}catch(r){Vs(s,t,r)}}function wi(s,t){try{var a=s.ref;if(a!==null){switch(s.tag){case 26:case 27:case 5:var r=s.stateNode;break;case 30:r=s.stateNode;break;default:r=s.stateNode}typeof a=="function"?s.refCleanup=a(r):a.current=r}}catch(o){Vs(s,t,o)}}function nl(s,t){var a=s.ref,r=s.refCleanup;if(a!==null)if(typeof r=="function")try{r()}catch(o){Vs(s,t,o)}finally{s.refCleanup=null,s=s.alternate,s!=null&&(s.refCleanup=null)}else if(typeof a=="function")try{a(null)}catch(o){Vs(s,t,o)}else a.current=null}function Rf(s){var t=s.type,a=s.memoizedProps,r=s.stateNode;try{e:switch(t){case"button":case"input":case"select":case"textarea":a.autoFocus&&r.focus();break e;case"img":a.src?r.src=a.src:a.srcSet&&(r.srcset=a.srcSet)}}catch(o){Vs(s,s.return,o)}}function Au(s,t,a){try{var r=s.stateNode;Hy(r,s.type,a,t),r[cs]=t}catch(o){Vs(s,s.return,o)}}function Lf(s){return s.tag===5||s.tag===3||s.tag===26||s.tag===27&&an(s.type)||s.tag===4}function Ou(s){e:for(;;){for(;s.sibling===null;){if(s.return===null||Lf(s.return))return null;s=s.return}for(s.sibling.return=s.return,s=s.sibling;s.tag!==5&&s.tag!==6&&s.tag!==18;){if(s.tag===27&&an(s.type)||s.flags&2||s.child===null||s.tag===4)continue e;s.child.return=s,s=s.child}if(!(s.flags&2))return s.stateNode}}function Du(s,t,a){var r=s.tag;if(r===5||r===6)s=s.stateNode,t?(a.nodeType===9?a.body:a.nodeName==="HTML"?a.ownerDocument.body:a).insertBefore(s,t):(t=a.nodeType===9?a.body:a.nodeName==="HTML"?a.ownerDocument.body:a,t.appendChild(s),a=a._reactRootContainer,a!=null||t.onclick!==null||(t.onclick=xl));else if(r!==4&&(r===27&&an(s.type)&&(a=s.stateNode,t=null),s=s.child,s!==null))for(Du(s,t,a),s=s.sibling;s!==null;)Du(s,t,a),s=s.sibling}function Xc(s,t,a){var r=s.tag;if(r===5||r===6)s=s.stateNode,t?a.insertBefore(s,t):a.appendChild(s);else if(r!==4&&(r===27&&an(s.type)&&(a=s.stateNode),s=s.child,s!==null))for(Xc(s,t,a),s=s.sibling;s!==null;)Xc(s,t,a),s=s.sibling}function Uf(s){var t=s.stateNode,a=s.memoizedProps;try{for(var r=s.type,o=t.attributes;o.length;)t.removeAttributeNode(o[0]);Kt(t,r,a),t[gs]=s,t[cs]=a}catch(m){Vs(s,s.return,m)}}var wl=!1,Ot=!1,Ru=!1,$f=typeof WeakSet=="function"?WeakSet:Set,Pt=null;function by(s,t){if(s=s.containerInfo,tm=vo,s=Yx(s),Td(s)){if("selectionStart"in s)var a={start:s.selectionStart,end:s.selectionEnd};else e:{a=(a=s.ownerDocument)&&a.defaultView||window;var r=a.getSelection&&a.getSelection();if(r&&r.rangeCount!==0){a=r.anchorNode;var o=r.anchorOffset,m=r.focusNode;r=r.focusOffset;try{a.nodeType,m.nodeType}catch{a=null;break e}var j=0,C=-1,$=-1,ae=0,ge=0,be=s,ce=null;s:for(;;){for(var me;be!==a||o!==0&&be.nodeType!==3||(C=j+o),be!==m||r!==0&&be.nodeType!==3||($=j+r),be.nodeType===3&&(j+=be.nodeValue.length),(me=be.firstChild)!==null;)ce=be,be=me;for(;;){if(be===s)break s;if(ce===a&&++ae===o&&(C=j),ce===m&&++ge===r&&($=j),(me=be.nextSibling)!==null)break;be=ce,ce=be.parentNode}be=me}a=C===-1||$===-1?null:{start:C,end:$}}else a=null}a=a||{start:0,end:0}}else a=null;for(am={focusedElem:s,selectionRange:a},vo=!1,Pt=t;Pt!==null;)if(t=Pt,s=t.child,(t.subtreeFlags&1028)!==0&&s!==null)s.return=t,Pt=s;else for(;Pt!==null;){switch(t=Pt,m=t.alternate,s=t.flags,t.tag){case 0:if((s&4)!==0&&(s=t.updateQueue,s=s!==null?s.events:null,s!==null))for(a=0;a title"))),Kt(m,r,a),m[gs]=s,It(m),r=m;break e;case"link":var j=Gp("link","href",o).get(r+(a.href||""));if(j){for(var C=0;CXs&&(j=Xs,Xs=Xe,Xe=j);var Y=Kx(C,Xe),G=Kx(C,Xs);if(Y&&G&&(me.rangeCount!==1||me.anchorNode!==Y.node||me.anchorOffset!==Y.offset||me.focusNode!==G.node||me.focusOffset!==G.offset)){var te=be.createRange();te.setStart(Y.node,Y.offset),me.removeAllRanges(),Xe>Xs?(me.addRange(te),me.extend(G.node,G.offset)):(te.setEnd(G.node,G.offset),me.addRange(te))}}}}for(be=[],me=C;me=me.parentNode;)me.nodeType===1&&be.push({element:me,left:me.scrollLeft,top:me.scrollTop});for(typeof C.focus=="function"&&C.focus(),C=0;Ca?32:a,z.T=null,a=Hu,Hu=null;var m=en,j=Tl;if(Rt=0,Tr=en=null,Tl=0,(Ps&6)!==0)throw Error(c(331));var C=Ps;if(Ps|=4,Yf(m.current),qf(m,m.current,j,a),Ps=C,Ei(0,!1),as&&typeof as.onPostCommitFiberRoot=="function")try{as.onPostCommitFiberRoot(Ns,m)}catch{}return!0}finally{V.p=o,z.T=r,xp(s,t)}}function fp(s,t,a){t=La(a,t),t=bu(s.stateNode,t,2),s=Kl(s,t,2),s!==null&&(Re(s,2),rl(s))}function Vs(s,t,a){if(s.tag===3)fp(s,s,a);else for(;t!==null;){if(t.tag===3){fp(t,s,a);break}else if(t.tag===1){var r=t.stateNode;if(typeof t.type.getDerivedStateFromError=="function"||typeof r.componentDidCatch=="function"&&(Wl===null||!Wl.has(r))){s=La(a,s),a=pf(2),r=Kl(t,a,2),r!==null&&(gf(a,r,t,s),Re(r,2),rl(r));break}}t=t.return}}function qu(s,t,a){var r=s.pingCache;if(r===null){r=s.pingCache=new _y;var o=new Set;r.set(t,o)}else o=r.get(t),o===void 0&&(o=new Set,r.set(t,o));o.has(a)||($u=!0,o.add(a),s=Ey.bind(null,s,t,a),t.then(s,s))}function Ey(s,t,a){var r=s.pingCache;r!==null&&r.delete(t),s.pingedLanes|=s.suspendedLanes&a,s.warmLanes&=~a,Ws===s&&(Ts&a)===a&&(vt===4||vt===3&&(Ts&62914560)===Ts&&300>mt()-eo?(Ps&2)===0&&Er(s,0):Bu|=a,Cr===Ts&&(Cr=0)),rl(s)}function pp(s,t){t===0&&(t=W()),s=kn(s,t),s!==null&&(Re(s,t),rl(s))}function My(s){var t=s.memoizedState,a=0;t!==null&&(a=t.retryLane),pp(s,a)}function zy(s,t){var a=0;switch(s.tag){case 31:case 13:var r=s.stateNode,o=s.memoizedState;o!==null&&(a=o.retryLane);break;case 19:r=s.stateNode;break;case 22:r=s.stateNode._retryCache;break;default:throw Error(c(314))}r!==null&&r.delete(t),pp(s,a)}function Ay(s,t){return Ut(s,t)}var io=null,zr=null,Ku=!1,co=!1,Qu=!1,tn=0;function rl(s){s!==zr&&s.next===null&&(zr===null?io=zr=s:zr=zr.next=s),co=!0,Ku||(Ku=!0,Dy())}function Ei(s,t){if(!Qu&&co){Qu=!0;do for(var a=!1,r=io;r!==null;){if(s!==0){var o=r.pendingLanes;if(o===0)var m=0;else{var j=r.suspendedLanes,C=r.pingedLanes;m=(1<<31-bs(42|s)+1)-1,m&=o&~(j&~C),m=m&201326741?m&201326741|1:m?m|2:0}m!==0&&(a=!0,Np(r,m))}else m=Ts,m=tl(r,r===Ws?m:0,r.cancelPendingCommit!==null||r.timeoutHandle!==-1),(m&3)===0||ul(r,m)||(a=!0,Np(r,m));r=r.next}while(a);Qu=!1}}function Oy(){gp()}function gp(){co=Ku=!1;var s=0;tn!==0&&Gy()&&(s=tn);for(var t=mt(),a=null,r=io;r!==null;){var o=r.next,m=jp(r,t);m===0?(r.next=null,a===null?io=o:a.next=o,o===null&&(zr=a)):(a=r,(s!==0||(m&3)!==0)&&(co=!0)),r=o}Rt!==0&&Rt!==5||Ei(s),tn!==0&&(tn=0)}function jp(s,t){for(var a=s.suspendedLanes,r=s.pingedLanes,o=s.expirationTimes,m=s.pendingLanes&-62914561;0C)break;var ge=$.transferSize,be=$.initiatorType;ge&&Tp(be)&&($=$.responseEnd,j+=ge*($"u"?null:document;function Ip(s,t,a){var r=Ar;if(r&&typeof t=="string"&&t){var o=Da(t);o='link[rel="'+s+'"][href="'+o+'"]',typeof a=="string"&&(o+='[crossorigin="'+a+'"]'),Bp.has(o)||(Bp.add(o),s={rel:s,crossOrigin:a,href:t},r.querySelector(o)===null&&(t=r.createElement("link"),Kt(t,"link",s),It(t),r.head.appendChild(t)))}}function Wy(s){El.D(s),Ip("dns-prefetch",s,null)}function e0(s,t){El.C(s,t),Ip("preconnect",s,t)}function s0(s,t,a){El.L(s,t,a);var r=Ar;if(r&&s&&t){var o='link[rel="preload"][as="'+Da(t)+'"]';t==="image"&&a&&a.imageSrcSet?(o+='[imagesrcset="'+Da(a.imageSrcSet)+'"]',typeof a.imageSizes=="string"&&(o+='[imagesizes="'+Da(a.imageSizes)+'"]')):o+='[href="'+Da(s)+'"]';var m=o;switch(t){case"style":m=Or(s);break;case"script":m=Dr(s)}Ha.has(m)||(s=v({rel:"preload",href:t==="image"&&a&&a.imageSrcSet?void 0:s,as:t},a),Ha.set(m,s),r.querySelector(o)!==null||t==="style"&&r.querySelector(Oi(m))||t==="script"&&r.querySelector(Di(m))||(t=r.createElement("link"),Kt(t,"link",s),It(t),r.head.appendChild(t)))}}function t0(s,t){El.m(s,t);var a=Ar;if(a&&s){var r=t&&typeof t.as=="string"?t.as:"script",o='link[rel="modulepreload"][as="'+Da(r)+'"][href="'+Da(s)+'"]',m=o;switch(r){case"audioworklet":case"paintworklet":case"serviceworker":case"sharedworker":case"worker":case"script":m=Dr(s)}if(!Ha.has(m)&&(s=v({rel:"modulepreload",href:s},t),Ha.set(m,s),a.querySelector(o)===null)){switch(r){case"audioworklet":case"paintworklet":case"serviceworker":case"sharedworker":case"worker":case"script":if(a.querySelector(Di(m)))return}r=a.createElement("link"),Kt(r,"link",s),It(r),a.head.appendChild(r)}}}function a0(s,t,a){El.S(s,t,a);var r=Ar;if(r&&s){var o=sr(r).hoistableStyles,m=Or(s);t=t||"default";var j=o.get(m);if(!j){var C={loading:0,preload:null};if(j=r.querySelector(Oi(m)))C.loading=5;else{s=v({rel:"stylesheet",href:s,"data-precedence":t},a),(a=Ha.get(m))&&dm(s,a);var $=j=r.createElement("link");It($),Kt($,"link",s),$._p=new Promise(function(ae,ge){$.onload=ae,$.onerror=ge}),$.addEventListener("load",function(){C.loading|=1}),$.addEventListener("error",function(){C.loading|=2}),C.loading|=4,ho(j,t,r)}j={type:"stylesheet",instance:j,count:1,state:C},o.set(m,j)}}}function l0(s,t){El.X(s,t);var a=Ar;if(a&&s){var r=sr(a).hoistableScripts,o=Dr(s),m=r.get(o);m||(m=a.querySelector(Di(o)),m||(s=v({src:s,async:!0},t),(t=Ha.get(o))&&um(s,t),m=a.createElement("script"),It(m),Kt(m,"link",s),a.head.appendChild(m)),m={type:"script",instance:m,count:1,state:null},r.set(o,m))}}function n0(s,t){El.M(s,t);var a=Ar;if(a&&s){var r=sr(a).hoistableScripts,o=Dr(s),m=r.get(o);m||(m=a.querySelector(Di(o)),m||(s=v({src:s,async:!0,type:"module"},t),(t=Ha.get(o))&&um(s,t),m=a.createElement("script"),It(m),Kt(m,"link",s),a.head.appendChild(m)),m={type:"script",instance:m,count:1,state:null},r.set(o,m))}}function Pp(s,t,a,r){var o=(o=H.current)?xo(o):null;if(!o)throw Error(c(446));switch(s){case"meta":case"title":return null;case"style":return typeof a.precedence=="string"&&typeof a.href=="string"?(t=Or(a.href),a=sr(o).hoistableStyles,r=a.get(t),r||(r={type:"style",instance:null,count:0,state:null},a.set(t,r)),r):{type:"void",instance:null,count:0,state:null};case"link":if(a.rel==="stylesheet"&&typeof a.href=="string"&&typeof a.precedence=="string"){s=Or(a.href);var m=sr(o).hoistableStyles,j=m.get(s);if(j||(o=o.ownerDocument||o,j={type:"stylesheet",instance:null,count:0,state:{loading:0,preload:null}},m.set(s,j),(m=o.querySelector(Oi(s)))&&!m._p&&(j.instance=m,j.state.loading=5),Ha.has(s)||(a={rel:"preload",as:"style",href:a.href,crossOrigin:a.crossOrigin,integrity:a.integrity,media:a.media,hrefLang:a.hrefLang,referrerPolicy:a.referrerPolicy},Ha.set(s,a),m||r0(o,s,a,j.state))),t&&r===null)throw Error(c(528,""));return j}if(t&&r!==null)throw Error(c(529,""));return null;case"script":return t=a.async,a=a.src,typeof a=="string"&&t&&typeof t!="function"&&typeof t!="symbol"?(t=Dr(a),a=sr(o).hoistableScripts,r=a.get(t),r||(r={type:"script",instance:null,count:0,state:null},a.set(t,r)),r):{type:"void",instance:null,count:0,state:null};default:throw Error(c(444,s))}}function Or(s){return'href="'+Da(s)+'"'}function Oi(s){return'link[rel="stylesheet"]['+s+"]"}function Hp(s){return v({},s,{"data-precedence":s.precedence,precedence:null})}function r0(s,t,a,r){s.querySelector('link[rel="preload"][as="style"]['+t+"]")?r.loading=1:(t=s.createElement("link"),r.preload=t,t.addEventListener("load",function(){return r.loading|=1}),t.addEventListener("error",function(){return r.loading|=2}),Kt(t,"link",a),It(t),s.head.appendChild(t))}function Dr(s){return'[src="'+Da(s)+'"]'}function Di(s){return"script[async]"+s}function Fp(s,t,a){if(t.count++,t.instance===null)switch(t.type){case"style":var r=s.querySelector('style[data-href~="'+Da(a.href)+'"]');if(r)return t.instance=r,It(r),r;var o=v({},a,{"data-href":a.href,"data-precedence":a.precedence,href:null,precedence:null});return r=(s.ownerDocument||s).createElement("style"),It(r),Kt(r,"style",o),ho(r,a.precedence,s),t.instance=r;case"stylesheet":o=Or(a.href);var m=s.querySelector(Oi(o));if(m)return t.state.loading|=4,t.instance=m,It(m),m;r=Hp(a),(o=Ha.get(o))&&dm(r,o),m=(s.ownerDocument||s).createElement("link"),It(m);var j=m;return j._p=new Promise(function(C,$){j.onload=C,j.onerror=$}),Kt(m,"link",r),t.state.loading|=4,ho(m,a.precedence,s),t.instance=m;case"script":return m=Dr(a.src),(o=s.querySelector(Di(m)))?(t.instance=o,It(o),o):(r=a,(o=Ha.get(m))&&(r=v({},a),um(r,o)),s=s.ownerDocument||s,o=s.createElement("script"),It(o),Kt(o,"link",r),s.head.appendChild(o),t.instance=o);case"void":return null;default:throw Error(c(443,t.type))}else t.type==="stylesheet"&&(t.state.loading&4)===0&&(r=t.instance,t.state.loading|=4,ho(r,a.precedence,s));return t.instance}function ho(s,t,a){for(var r=a.querySelectorAll('link[rel="stylesheet"][data-precedence],style[data-precedence]'),o=r.length?r[r.length-1]:null,m=o,j=0;j title"):null)}function i0(s,t,a){if(a===1||t.itemProp!=null)return!1;switch(s){case"meta":case"title":return!0;case"style":if(typeof t.precedence!="string"||typeof t.href!="string"||t.href==="")break;return!0;case"link":if(typeof t.rel!="string"||typeof t.href!="string"||t.href===""||t.onLoad||t.onError)break;switch(t.rel){case"stylesheet":return s=t.disabled,typeof t.precedence=="string"&&s==null;default:return!0}case"script":if(t.async&&typeof t.async!="function"&&typeof t.async!="symbol"&&!t.onLoad&&!t.onError&&t.src&&typeof t.src=="string")return!0}return!1}function qp(s){return!(s.type==="stylesheet"&&(s.state.loading&3)===0)}function c0(s,t,a,r){if(a.type==="stylesheet"&&(typeof r.media!="string"||matchMedia(r.media).matches!==!1)&&(a.state.loading&4)===0){if(a.instance===null){var o=Or(r.href),m=t.querySelector(Oi(o));if(m){t=m._p,t!==null&&typeof t=="object"&&typeof t.then=="function"&&(s.count++,s=po.bind(s),t.then(s,s)),a.state.loading|=4,a.instance=m,It(m);return}m=t.ownerDocument||t,r=Hp(r),(o=Ha.get(o))&&dm(r,o),m=m.createElement("link"),It(m);var j=m;j._p=new Promise(function(C,$){j.onload=C,j.onerror=$}),Kt(m,"link",r),a.instance=m}s.stylesheets===null&&(s.stylesheets=new Map),s.stylesheets.set(a,t),(t=a.state.preload)&&(a.state.loading&3)===0&&(s.count++,a=po.bind(s),t.addEventListener("load",a),t.addEventListener("error",a))}}var mm=0;function o0(s,t){return s.stylesheets&&s.count===0&&jo(s,s.stylesheets),0mm?50:800)+t);return s.unsuspend=a,function(){s.unsuspend=null,clearTimeout(r),clearTimeout(o)}}:null}function po(){if(this.count--,this.count===0&&(this.imgCount===0||!this.waitingForImages)){if(this.stylesheets)jo(this,this.stylesheets);else if(this.unsuspend){var s=this.unsuspend;this.unsuspend=null,s()}}}var go=null;function jo(s,t){s.stylesheets=null,s.unsuspend!==null&&(s.count++,go=new Map,t.forEach(d0,s),go=null,po.call(s))}function d0(s,t){if(!(t.state.loading&4)){var a=go.get(s);if(a)var r=a.get(null);else{a=new Map,go.set(s,a);for(var o=s.querySelectorAll("link[data-precedence],style[data-precedence]"),m=0;m"u"||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!="function"))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(l)}catch(n){console.error(n)}}return l(),ym.exports=W_(),ym.exports}var s1=e1();function I(...l){return M0(z0(l))}const Ce=d.forwardRef(({className:l,...n},i)=>e.jsx("div",{ref:i,className:I("rounded-xl border bg-card text-card-foreground shadow",l),...n}));Ce.displayName="Card";const De=d.forwardRef(({className:l,...n},i)=>e.jsx("div",{ref:i,className:I("flex flex-col space-y-1.5 p-6",l),...n}));De.displayName="CardHeader";const Le=d.forwardRef(({className:l,...n},i)=>e.jsx("div",{ref:i,className:I("font-semibold leading-none tracking-tight",l),...n}));Le.displayName="CardTitle";const ws=d.forwardRef(({className:l,...n},i)=>e.jsx("div",{ref:i,className:I("text-sm text-muted-foreground",l),...n}));ws.displayName="CardDescription";const Ae=d.forwardRef(({className:l,...n},i)=>e.jsx("div",{ref:i,className:I("p-6 pt-0",l),...n}));Ae.displayName="CardContent";const Zo=d.forwardRef(({className:l,...n},i)=>e.jsx("div",{ref:i,className:I("flex items-center p-6 pt-0",l),...n}));Zo.displayName="CardFooter";const ta=O0,Xt=d.forwardRef(({className:l,...n},i)=>e.jsx(Ig,{ref:i,className:I("inline-flex h-9 items-center justify-center rounded-lg bg-muted p-1 text-muted-foreground",l),...n}));Xt.displayName=Ig.displayName;const Je=d.forwardRef(({className:l,...n},i)=>e.jsx(Pg,{ref:i,className:I("inline-flex items-center justify-center whitespace-nowrap rounded-md px-3 py-1 text-sm font-medium ring-offset-background transition-all duration-300 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 data-[state=active]:bg-background data-[state=active]:text-foreground data-[state=active]:shadow",l),...n}));Je.displayName=Pg.displayName;const ys=d.forwardRef(({className:l,...n},i)=>e.jsx(Hg,{ref:i,className:I("mt-2 ring-offset-background focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 data-[state=active]:animate-in data-[state=active]:fade-in data-[state=active]:duration-300",l),...n}));ys.displayName=Hg.displayName;const Ye=d.forwardRef(({className:l,children:n,viewportRef:i,...c},u)=>e.jsxs(Fg,{ref:u,className:I("relative overflow-hidden",l),...c,children:[e.jsx(D0,{ref:i,className:"h-full w-full rounded-[inherit]",children:n}),e.jsx(Um,{}),e.jsx(Um,{orientation:"horizontal"}),e.jsx(R0,{})]}));Ye.displayName=Fg.displayName;const Um=d.forwardRef(({className:l,orientation:n="vertical",...i},c)=>e.jsx(Gg,{ref:c,orientation:n,className:I("flex touch-none select-none transition-colors",n==="vertical"&&"h-full w-2.5 border-l border-l-transparent p-[1px]",n==="horizontal"&&"h-2.5 flex-col border-t border-t-transparent p-[1px]",l),...i,children:e.jsx(L0,{className:"relative flex-1 rounded-full bg-border"})}));Um.displayName=Gg.displayName;function js({className:l,...n}){return e.jsx("div",{className:I("animate-pulse rounded-md bg-primary/10",l),...n})}const Kn=d.forwardRef(({className:l,value:n,...i},c)=>e.jsx(Vg,{ref:c,className:I("relative h-2 w-full overflow-hidden rounded-full bg-primary/20",l),...i,children:e.jsx(U0,{className:"h-full w-full flex-1 bg-primary transition-all",style:{transform:`translateX(-${100-(n||0)}%)`}})}));Kn.displayName=Vg.displayName;async function we(l,n){const c=n?.body instanceof FormData?{...n?.headers}:{"Content-Type":"application/json",...n?.headers},u={...n,credentials:"include",headers:c},x=await fetch(l,u);if(x.status===401)throw window.location.href="/auth",new Error("认证失败,请重新登录");return x}function Fs(){return{"Content-Type":"application/json"}}async function t1(){try{await fetch("/api/webui/auth/logout",{method:"POST",credentials:"include"})}catch(l){console.error("登出请求失败:",l)}window.location.href="/auth"}async function tc(){try{return(await(await fetch("/api/webui/auth/check",{method:"GET",credentials:"include"})).json()).authenticated===!0}catch{return!1}}const a1={light:"",dark:".dark"},tv=d.createContext(null);function av(){const l=d.useContext(tv);if(!l)throw new Error("useChart must be used within a ");return l}const $r=d.forwardRef(({id:l,className:n,children:i,config:c,...u},x)=>{const h=d.useId(),f=`chart-${l||h.replace(/:/g,"")}`;return e.jsx(tv.Provider,{value:{config:c},children:e.jsxs("div",{"data-chart":f,ref:x,className:I("flex aspect-video justify-center text-xs [&_.recharts-cartesian-axis-tick_text]:fill-muted-foreground [&_.recharts-cartesian-grid_line[stroke='#ccc']]:stroke-border/50 [&_.recharts-curve.recharts-tooltip-cursor]:stroke-border [&_.recharts-dot[stroke='#fff']]:stroke-transparent [&_.recharts-layer]:outline-none [&_.recharts-polar-grid_[stroke='#ccc']]:stroke-border [&_.recharts-radial-bar-background-sector]:fill-muted [&_.recharts-rectangle.recharts-tooltip-cursor]:fill-muted [&_.recharts-reference-line_[stroke='#ccc']]:stroke-border [&_.recharts-sector[stroke='#fff']]:stroke-transparent [&_.recharts-sector]:outline-none [&_.recharts-surface]:outline-none",n),...u,children:[e.jsx(l1,{id:f,config:c}),e.jsx(oj,{children:i})]})})});$r.displayName="Chart";const l1=({id:l,config:n})=>{const i=Object.entries(n).filter(([,c])=>c.theme||c.color);return i.length?e.jsx("style",{dangerouslySetInnerHTML:{__html:Object.entries(a1).map(([c,u])=>` +`+r.stack}}var rs=Object.prototype.hasOwnProperty,Ut=l.unstable_scheduleCallback,aa=l.unstable_cancelCallback,Qa=l.unstable_shouldYield,Ft=l.unstable_requestPaint,mt=l.unstable_now,q=l.unstable_getCurrentPriorityLevel,Ve=l.unstable_ImmediatePriority,Ke=l.unstable_UserBlockingPriority,We=l.unstable_NormalPriority,Ls=l.unstable_LowPriority,ts=l.unstable_IdlePriority,Cs=l.log,ze=l.unstable_setDisableYieldValue,Ns=null,as=null;function es(s){if(typeof Cs=="function"&&ze(s),as&&typeof as.setStrictMode=="function")try{as.setStrictMode(Ns,s)}catch{}}var bs=Math.clz32?Math.clz32:tt,gt=Math.log,$t=Math.LN2;function tt(s){return s>>>=0,s===0?32:31-(gt(s)/$t|0)|0}var Ms=256,Et=262144,Bt=4194304;function Oa(s){var t=s&42;if(t!==0)return t;switch(s&-s){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 s&261888;case 262144:case 524288:case 1048576:case 2097152:return s&3932160;case 4194304:case 8388608:case 16777216:case 33554432:return s&62914560;case 67108864:return 67108864;case 134217728:return 134217728;case 268435456:return 268435456;case 536870912:return 536870912;case 1073741824:return 0;default:return s}}function tl(s,t,a){var r=s.pendingLanes;if(r===0)return 0;var o=0,m=s.suspendedLanes,j=s.pingedLanes;s=s.warmLanes;var C=r&134217727;return C!==0?(r=C&~m,r!==0?o=Oa(r):(j&=C,j!==0?o=Oa(j):a||(a=C&~s,a!==0&&(o=Oa(a))))):(C=r&~m,C!==0?o=Oa(C):j!==0?o=Oa(j):a||(a=r&~s,a!==0&&(o=Oa(a)))),o===0?0:t!==0&&t!==o&&(t&m)===0&&(m=o&-o,a=t&-t,m>=a||m===32&&(a&4194048)!==0)?t:o}function ul(s,t){return(s.pendingLanes&~(s.suspendedLanes&~s.pingedLanes)&t)===0}function Xn(s,t){switch(s){case 1:case 2:case 4:case 8:case 64:return t+250;case 16:case 32:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return t+5e3;case 4194304:case 8388608:case 16777216:case 33554432:return-1;case 67108864:case 134217728:case 268435456:case 536870912:case 1073741824:return-1;default:return-1}}function W(){var s=Bt;return Bt<<=1,(Bt&62914560)===0&&(Bt=4194304),s}function ye(s){for(var t=[],a=0;31>a;a++)t.push(s);return t}function Re(s,t){s.pendingLanes|=t,t!==268435456&&(s.suspendedLanes=0,s.pingedLanes=0,s.warmLanes=0)}function Hs(s,t,a,r,o,m){var j=s.pendingLanes;s.pendingLanes=a,s.suspendedLanes=0,s.pingedLanes=0,s.warmLanes=0,s.expiredLanes&=a,s.entangledLanes&=a,s.errorRecoveryDisabledLanes&=a,s.shellSuspendCounter=0;var C=s.entanglements,$=s.expirationTimes,ae=s.hiddenUpdates;for(a=j&~a;0"u")return null;try{return s.activeElement||s.body}catch{return s.body}}var xb=/[\n"\\]/g;function Ra(s){return s.replace(xb,function(t){return"\\"+t.charCodeAt(0).toString(16)+" "})}function xd(s,t,a,r,o,m,j,C){s.name="",j!=null&&typeof j!="function"&&typeof j!="symbol"&&typeof j!="boolean"?s.type=j:s.removeAttribute("type"),t!=null?j==="number"?(t===0&&s.value===""||s.value!=t)&&(s.value=""+Da(t)):s.value!==""+Da(t)&&(s.value=""+Da(t)):j!=="submit"&&j!=="reset"||s.removeAttribute("value"),t!=null?hd(s,j,Da(t)):a!=null?hd(s,j,Da(a)):r!=null&&s.removeAttribute("value"),o==null&&m!=null&&(s.defaultChecked=!!m),o!=null&&(s.checked=o&&typeof o!="function"&&typeof o!="symbol"),C!=null&&typeof C!="function"&&typeof C!="symbol"&&typeof C!="boolean"?s.name=""+Da(C):s.removeAttribute("name")}function yx(s,t,a,r,o,m,j,C){if(m!=null&&typeof m!="function"&&typeof m!="symbol"&&typeof m!="boolean"&&(s.type=m),t!=null||a!=null){if(!(m!=="submit"&&m!=="reset"||t!=null)){md(s);return}a=a!=null?""+Da(a):"",t=t!=null?""+Da(t):a,C||t===s.value||(s.value=t),s.defaultValue=t}r=r??o,r=typeof r!="function"&&typeof r!="symbol"&&!!r,s.checked=C?s.checked:!!r,s.defaultChecked=!!r,j!=null&&typeof j!="function"&&typeof j!="symbol"&&typeof j!="boolean"&&(s.name=j),md(s)}function hd(s,t,a){t==="number"&&fc(s.ownerDocument)===s||s.defaultValue===""+a||(s.defaultValue=""+a)}function ar(s,t,a,r){if(s=s.options,t){t={};for(var o=0;o"u"||typeof window.document>"u"||typeof window.document.createElement>"u"),vd=!1;if(hl)try{var Wr={};Object.defineProperty(Wr,"passive",{get:function(){vd=!0}}),window.addEventListener("test",Wr,Wr),window.removeEventListener("test",Wr,Wr)}catch{vd=!1}var Il=null,Nd=null,gc=null;function Ex(){if(gc)return gc;var s,t=Nd,a=t.length,r,o="value"in Il?Il.value:Il.textContent,m=o.length;for(s=0;s=ti),Rx=" ",Lx=!1;function Ux(s,t){switch(s){case"keyup":return Pb.indexOf(t.keyCode)!==-1;case"keydown":return t.keyCode!==229;case"keypress":case"mousedown":case"focusout":return!0;default:return!1}}function $x(s){return s=s.detail,typeof s=="object"&&"data"in s?s.data:null}var ir=!1;function Fb(s,t){switch(s){case"compositionend":return $x(t);case"keypress":return t.which!==32?null:(Lx=!0,Rx);case"textInput":return s=t.data,s===Rx&&Lx?null:s;default:return null}}function Gb(s,t){if(ir)return s==="compositionend"||!Sd&&Ux(s,t)?(s=Ex(),gc=Nd=Il=null,ir=!1,s):null;switch(s){case"paste":return null;case"keypress":if(!(t.ctrlKey||t.altKey||t.metaKey)||t.ctrlKey&&t.altKey){if(t.char&&1=t)return{node:a,offset:t-s};s=r}e:{for(;a;){if(a.nextSibling){a=a.nextSibling;break e}a=a.parentNode}a=void 0}a=qx(a)}}function Qx(s,t){return s&&t?s===t?!0:s&&s.nodeType===3?!1:t&&t.nodeType===3?Qx(s,t.parentNode):"contains"in s?s.contains(t):s.compareDocumentPosition?!!(s.compareDocumentPosition(t)&16):!1:!1}function Yx(s){s=s!=null&&s.ownerDocument!=null&&s.ownerDocument.defaultView!=null?s.ownerDocument.defaultView:window;for(var t=fc(s.document);t instanceof s.HTMLIFrameElement;){try{var a=typeof t.contentWindow.location.href=="string"}catch{a=!1}if(a)s=t.contentWindow;else break;t=fc(s.document)}return t}function Td(s){var t=s&&s.nodeName&&s.nodeName.toLowerCase();return t&&(t==="input"&&(s.type==="text"||s.type==="search"||s.type==="tel"||s.type==="url"||s.type==="password")||t==="textarea"||s.contentEditable==="true")}var Zb=hl&&"documentMode"in document&&11>=document.documentMode,cr=null,Ed=null,ri=null,Md=!1;function Jx(s,t,a){var r=a.window===a?a.document:a.nodeType===9?a:a.ownerDocument;Md||cr==null||cr!==fc(r)||(r=cr,"selectionStart"in r&&Td(r)?r={start:r.selectionStart,end:r.selectionEnd}:(r=(r.ownerDocument&&r.ownerDocument.defaultView||window).getSelection(),r={anchorNode:r.anchorNode,anchorOffset:r.anchorOffset,focusNode:r.focusNode,focusOffset:r.focusOffset}),ri&&ni(ri,r)||(ri=r,r=uo(Ed,"onSelect"),0>=j,o-=j,al=1<<32-bs(t)+o|a<os?(Es=Ge,Ge=null):Es=Ge.sibling;var $s=ce(Y,Ge,te[os],Ne);if($s===null){Ge===null&&(Ge=Es);break}s&&Ge&&$s.alternate===null&&t(Y,Ge),G=m($s,G,os),Us===null?Qe=$s:Us.sibling=$s,Us=$s,Ge=Es}if(os===te.length)return a(Y,Ge),zs&&pl(Y,os),Qe;if(Ge===null){for(;osos?(Es=Ge,Ge=null):Es=Ge.sibling;var on=ce(Y,Ge,$s.value,Ne);if(on===null){Ge===null&&(Ge=Es);break}s&&Ge&&on.alternate===null&&t(Y,Ge),G=m(on,G,os),Us===null?Qe=on:Us.sibling=on,Us=on,Ge=Es}if($s.done)return a(Y,Ge),zs&&pl(Y,os),Qe;if(Ge===null){for(;!$s.done;os++,$s=te.next())$s=be(Y,$s.value,Ne),$s!==null&&(G=m($s,G,os),Us===null?Qe=$s:Us.sibling=$s,Us=$s);return zs&&pl(Y,os),Qe}for(Ge=r(Ge);!$s.done;os++,$s=te.next())$s=me(Ge,Y,os,$s.value,Ne),$s!==null&&(s&&$s.alternate!==null&&Ge.delete($s.key===null?os:$s.key),G=m($s,G,os),Us===null?Qe=$s:Us.sibling=$s,Us=$s);return s&&Ge.forEach(function(j0){return t(Y,j0)}),zs&&pl(Y,os),Qe}function Xs(Y,G,te,Ne){if(typeof te=="object"&&te!==null&&te.type===R&&te.key===null&&(te=te.props.children),typeof te=="object"&&te!==null){switch(te.$$typeof){case w:e:{for(var Qe=te.key;G!==null;){if(G.key===Qe){if(Qe=te.type,Qe===R){if(G.tag===7){a(Y,G.sibling),Ne=o(G,te.props.children),Ne.return=Y,Y=Ne;break e}}else if(G.elementType===Qe||typeof Qe=="object"&&Qe!==null&&Qe.$$typeof===J&&An(Qe)===G.type){a(Y,G.sibling),Ne=o(G,te.props),mi(Ne,te),Ne.return=Y,Y=Ne;break e}a(Y,G);break}else t(Y,G);G=G.sibling}te.type===R?(Ne=Cn(te.props.children,Y.mode,Ne,te.key),Ne.return=Y,Y=Ne):(Ne=Cc(te.type,te.key,te.props,null,Y.mode,Ne),mi(Ne,te),Ne.return=Y,Y=Ne)}return j(Y);case b:e:{for(Qe=te.key;G!==null;){if(G.key===Qe)if(G.tag===4&&G.stateNode.containerInfo===te.containerInfo&&G.stateNode.implementation===te.implementation){a(Y,G.sibling),Ne=o(G,te.children||[]),Ne.return=Y,Y=Ne;break e}else{a(Y,G);break}else t(Y,G);G=G.sibling}Ne=Ud(te,Y.mode,Ne),Ne.return=Y,Y=Ne}return j(Y);case J:return te=An(te),Xs(Y,G,te,Ne)}if(je(te))return He(Y,G,te,Ne);if(he(te)){if(Qe=he(te),typeof Qe!="function")throw Error(c(150));return te=Qe.call(te),Xe(Y,G,te,Ne)}if(typeof te.then=="function")return Xs(Y,G,Dc(te),Ne);if(te.$$typeof===M)return Xs(Y,G,Mc(Y,te),Ne);Rc(Y,te)}return typeof te=="string"&&te!==""||typeof te=="number"||typeof te=="bigint"?(te=""+te,G!==null&&G.tag===6?(a(Y,G.sibling),Ne=o(G,te),Ne.return=Y,Y=Ne):(a(Y,G),Ne=Ld(te,Y.mode,Ne),Ne.return=Y,Y=Ne),j(Y)):a(Y,G)}return function(Y,G,te,Ne){try{ui=0;var Qe=Xs(Y,G,te,Ne);return vr=null,Qe}catch(Ge){if(Ge===jr||Ge===Ac)throw Ge;var Us=Na(29,Ge,null,Y.mode);return Us.lanes=Ne,Us.return=Y,Us}finally{}}}var Dn=vh(!0),Nh=vh(!1),Vl=!1;function Yd(s){s.updateQueue={baseState:s.memoizedState,firstBaseUpdate:null,lastBaseUpdate:null,shared:{pending:null,lanes:0,hiddenCallbacks:null},callbacks:null}}function Jd(s,t){s=s.updateQueue,t.updateQueue===s&&(t.updateQueue={baseState:s.baseState,firstBaseUpdate:s.firstBaseUpdate,lastBaseUpdate:s.lastBaseUpdate,shared:s.shared,callbacks:null})}function ql(s){return{lane:s,tag:0,payload:null,callback:null,next:null}}function Kl(s,t,a){var r=s.updateQueue;if(r===null)return null;if(r=r.shared,(Ps&2)!==0){var o=r.pending;return o===null?t.next=t:(t.next=o.next,o.next=t),r.pending=t,t=kc(s),ah(s,null,a),t}return Sc(s,r,t,a),kc(s)}function xi(s,t,a){if(t=t.updateQueue,t!==null&&(t=t.shared,(a&4194048)!==0)){var r=t.lanes;r&=s.pendingLanes,a|=r,t.lanes=a,Wt(s,a)}}function Xd(s,t){var a=s.updateQueue,r=s.alternate;if(r!==null&&(r=r.updateQueue,a===r)){var o=null,m=null;if(a=a.firstBaseUpdate,a!==null){do{var j={lane:a.lane,tag:a.tag,payload:a.payload,callback:null,next:null};m===null?o=m=j:m=m.next=j,a=a.next}while(a!==null);m===null?o=m=t:m=m.next=t}else o=m=t;a={baseState:r.baseState,firstBaseUpdate:o,lastBaseUpdate:m,shared:r.shared,callbacks:r.callbacks},s.updateQueue=a;return}s=a.lastBaseUpdate,s===null?a.firstBaseUpdate=t:s.next=t,a.lastBaseUpdate=t}var Zd=!1;function hi(){if(Zd){var s=gr;if(s!==null)throw s}}function fi(s,t,a,r){Zd=!1;var o=s.updateQueue;Vl=!1;var m=o.firstBaseUpdate,j=o.lastBaseUpdate,C=o.shared.pending;if(C!==null){o.shared.pending=null;var $=C,ae=$.next;$.next=null,j===null?m=ae:j.next=ae,j=$;var ge=s.alternate;ge!==null&&(ge=ge.updateQueue,C=ge.lastBaseUpdate,C!==j&&(C===null?ge.firstBaseUpdate=ae:C.next=ae,ge.lastBaseUpdate=$))}if(m!==null){var be=o.baseState;j=0,ge=ae=$=null,C=m;do{var ce=C.lane&-536870913,me=ce!==C.lane;if(me?(Ts&ce)===ce:(r&ce)===ce){ce!==0&&ce===pr&&(Zd=!0),ge!==null&&(ge=ge.next={lane:0,tag:C.tag,payload:C.payload,callback:null,next:null});e:{var He=s,Xe=C;ce=t;var Xs=a;switch(Xe.tag){case 1:if(He=Xe.payload,typeof He=="function"){be=He.call(Xs,be,ce);break e}be=He;break e;case 3:He.flags=He.flags&-65537|128;case 0:if(He=Xe.payload,ce=typeof He=="function"?He.call(Xs,be,ce):He,ce==null)break e;be=v({},be,ce);break e;case 2:Vl=!0}}ce=C.callback,ce!==null&&(s.flags|=64,me&&(s.flags|=8192),me=o.callbacks,me===null?o.callbacks=[ce]:me.push(ce))}else me={lane:ce,tag:C.tag,payload:C.payload,callback:C.callback,next:null},ge===null?(ae=ge=me,$=be):ge=ge.next=me,j|=ce;if(C=C.next,C===null){if(C=o.shared.pending,C===null)break;me=C,C=me.next,me.next=null,o.lastBaseUpdate=me,o.shared.pending=null}}while(!0);ge===null&&($=be),o.baseState=$,o.firstBaseUpdate=ae,o.lastBaseUpdate=ge,m===null&&(o.shared.lanes=0),Zl|=j,s.lanes=j,s.memoizedState=be}}function bh(s,t){if(typeof s!="function")throw Error(c(191,s));s.call(t)}function yh(s,t){var a=s.callbacks;if(a!==null)for(s.callbacks=null,s=0;sm?m:8;var j=z.T,C={};z.T=C,gu(s,!1,t,a);try{var $=o(),ae=z.S;if(ae!==null&&ae(C,$),$!==null&&typeof $=="object"&&typeof $.then=="function"){var ge=iy($,r);ji(s,t,ge,Sa(s))}else ji(s,t,r,Sa(s))}catch(be){ji(s,t,{then:function(){},status:"rejected",reason:be},Sa())}finally{V.p=m,j!==null&&C.types!==null&&(j.types=C.types),z.T=j}}function xy(){}function fu(s,t,a,r){if(s.tag!==5)throw Error(c(476));var o=ef(s).queue;Wh(s,o,t,B,a===null?xy:function(){return sf(s),a(r)})}function ef(s){var t=s.memoizedState;if(t!==null)return t;t={memoizedState:B,baseState:B,baseQueue:null,queue:{pending:null,lanes:0,dispatch:null,lastRenderedReducer:Nl,lastRenderedState:B},next:null};var a={};return t.next={memoizedState:a,baseState:a,baseQueue:null,queue:{pending:null,lanes:0,dispatch:null,lastRenderedReducer:Nl,lastRenderedState:a},next:null},s.memoizedState=t,s=s.alternate,s!==null&&(s.memoizedState=t),t}function sf(s){var t=ef(s);t.next===null&&(t=s.alternate.memoizedState),ji(s,t.next.queue,{},Sa())}function pu(){return Vt(Ri)}function tf(){return kt().memoizedState}function af(){return kt().memoizedState}function hy(s){for(var t=s.return;t!==null;){switch(t.tag){case 24:case 3:var a=Sa();s=ql(a);var r=Kl(t,s,a);r!==null&&(fa(r,t,a),xi(r,t,a)),t={cache:Vd()},s.payload=t;return}t=t.return}}function fy(s,t,a){var r=Sa();a={lane:r,revertLane:0,gesture:null,action:a,hasEagerState:!1,eagerState:null,next:null},Vc(s)?nf(t,a):(a=Dd(s,t,a,r),a!==null&&(fa(a,s,r),rf(a,t,r)))}function lf(s,t,a){var r=Sa();ji(s,t,a,r)}function ji(s,t,a,r){var o={lane:r,revertLane:0,gesture:null,action:a,hasEagerState:!1,eagerState:null,next:null};if(Vc(s))nf(t,o);else{var m=s.alternate;if(s.lanes===0&&(m===null||m.lanes===0)&&(m=t.lastRenderedReducer,m!==null))try{var j=t.lastRenderedState,C=m(j,a);if(o.hasEagerState=!0,o.eagerState=C,va(C,j))return Sc(s,t,o,0),Ws===null&&_c(),!1}catch{}finally{}if(a=Dd(s,t,o,r),a!==null)return fa(a,s,r),rf(a,t,r),!0}return!1}function gu(s,t,a,r){if(r={lane:2,revertLane:Yu(),gesture:null,action:r,hasEagerState:!1,eagerState:null,next:null},Vc(s)){if(t)throw Error(c(479))}else t=Dd(s,a,r,2),t!==null&&fa(t,s,2)}function Vc(s){var t=s.alternate;return s===cs||t!==null&&t===cs}function nf(s,t){br=$c=!0;var a=s.pending;a===null?t.next=t:(t.next=a.next,a.next=t),s.pending=t}function rf(s,t,a){if((a&4194048)!==0){var r=t.lanes;r&=s.pendingLanes,a|=r,t.lanes=a,Wt(s,a)}}var vi={readContext:Vt,use:Pc,useCallback:vt,useContext:vt,useEffect:vt,useImperativeHandle:vt,useLayoutEffect:vt,useInsertionEffect:vt,useMemo:vt,useReducer:vt,useRef:vt,useState:vt,useDebugValue:vt,useDeferredValue:vt,useTransition:vt,useSyncExternalStore:vt,useId:vt,useHostTransitionStatus:vt,useFormState:vt,useActionState:vt,useOptimistic:vt,useMemoCache:vt,useCacheRefresh:vt};vi.useEffectEvent=vt;var cf={readContext:Vt,use:Pc,useCallback:function(s,t){return la().memoizedState=[s,t===void 0?null:t],s},useContext:Vt,useEffect:Gh,useImperativeHandle:function(s,t,a){a=a!=null?a.concat([s]):null,Fc(4194308,4,Qh.bind(null,t,s),a)},useLayoutEffect:function(s,t){return Fc(4194308,4,s,t)},useInsertionEffect:function(s,t){Fc(4,2,s,t)},useMemo:function(s,t){var a=la();t=t===void 0?null:t;var r=s();if(Rn){es(!0);try{s()}finally{es(!1)}}return a.memoizedState=[r,t],r},useReducer:function(s,t,a){var r=la();if(a!==void 0){var o=a(t);if(Rn){es(!0);try{a(t)}finally{es(!1)}}}else o=t;return r.memoizedState=r.baseState=o,s={pending:null,lanes:0,dispatch:null,lastRenderedReducer:s,lastRenderedState:o},r.queue=s,s=s.dispatch=fy.bind(null,cs,s),[r.memoizedState,s]},useRef:function(s){var t=la();return s={current:s},t.memoizedState=s},useState:function(s){s=du(s);var t=s.queue,a=lf.bind(null,cs,t);return t.dispatch=a,[s.memoizedState,a]},useDebugValue:xu,useDeferredValue:function(s,t){var a=la();return hu(a,s,t)},useTransition:function(){var s=du(!1);return s=Wh.bind(null,cs,s.queue,!0,!1),la().memoizedState=s,[!1,s]},useSyncExternalStore:function(s,t,a){var r=cs,o=la();if(zs){if(a===void 0)throw Error(c(407));a=a()}else{if(a=t(),Ws===null)throw Error(c(349));(Ts&127)!==0||Th(r,t,a)}o.memoizedState=a;var m={value:a,getSnapshot:t};return o.queue=m,Gh(Mh.bind(null,r,m,s),[s]),r.flags|=2048,wr(9,{destroy:void 0},Eh.bind(null,r,m,a,t),null),a},useId:function(){var s=la(),t=Ws.identifierPrefix;if(zs){var a=ll,r=al;a=(r&~(1<<32-bs(r)-1)).toString(32)+a,t="_"+t+"R_"+a,a=Bc++,0<\/script>",m=m.removeChild(m.firstChild);break;case"select":m=typeof r.is=="string"?j.createElement("select",{is:r.is}):j.createElement("select"),r.multiple?m.multiple=!0:r.size&&(m.size=r.size);break;default:m=typeof r.is=="string"?j.createElement(o,{is:r.is}):j.createElement(o)}}m[gs]=t,m[is]=r;e:for(j=t.child;j!==null;){if(j.tag===5||j.tag===6)m.appendChild(j.stateNode);else if(j.tag!==4&&j.tag!==27&&j.child!==null){j.child.return=j,j=j.child;continue}if(j===t)break e;for(;j.sibling===null;){if(j.return===null||j.return===t)break e;j=j.return}j.sibling.return=j.return,j=j.sibling}t.stateNode=m;e:switch(Kt(m,o,r),o){case"button":case"input":case"select":case"textarea":r=!!r.autoFocus;break e;case"img":r=!0;break e;default:r=!1}r&&yl(t)}}return ct(t),zu(t,t.type,s===null?null:s.memoizedProps,t.pendingProps,a),null;case 6:if(s&&t.stateNode!=null)s.memoizedProps!==r&&yl(t);else{if(typeof r!="string"&&t.stateNode===null)throw Error(c(166));if(s=H.current,hr(t)){if(s=t.stateNode,a=t.memoizedProps,r=null,o=Gt,o!==null)switch(o.tag){case 27:case 5:r=o.memoizedProps}s[gs]=t,s=!!(s.nodeValue===a||r!==null&&r.suppressHydrationWarning===!0||Cp(s.nodeValue,a)),s||Fl(t,!0)}else s=mo(s).createTextNode(r),s[gs]=t,t.stateNode=s}return ct(t),null;case 31:if(a=t.memoizedState,s===null||s.memoizedState!==null){if(r=hr(t),a!==null){if(s===null){if(!r)throw Error(c(318));if(s=t.memoizedState,s=s!==null?s.dehydrated:null,!s)throw Error(c(557));s[gs]=t}else Tn(),(t.flags&128)===0&&(t.memoizedState=null),t.flags|=4;ct(t),s=!1}else a=Pd(),s!==null&&s.memoizedState!==null&&(s.memoizedState.hydrationErrors=a),s=!0;if(!s)return t.flags&256?(ya(t),t):(ya(t),null);if((t.flags&128)!==0)throw Error(c(558))}return ct(t),null;case 13:if(r=t.memoizedState,s===null||s.memoizedState!==null&&s.memoizedState.dehydrated!==null){if(o=hr(t),r!==null&&r.dehydrated!==null){if(s===null){if(!o)throw Error(c(318));if(o=t.memoizedState,o=o!==null?o.dehydrated:null,!o)throw Error(c(317));o[gs]=t}else Tn(),(t.flags&128)===0&&(t.memoizedState=null),t.flags|=4;ct(t),o=!1}else o=Pd(),s!==null&&s.memoizedState!==null&&(s.memoizedState.hydrationErrors=o),o=!0;if(!o)return t.flags&256?(ya(t),t):(ya(t),null)}return ya(t),(t.flags&128)!==0?(t.lanes=a,t):(a=r!==null,s=s!==null&&s.memoizedState!==null,a&&(r=t.child,o=null,r.alternate!==null&&r.alternate.memoizedState!==null&&r.alternate.memoizedState.cachePool!==null&&(o=r.alternate.memoizedState.cachePool.pool),m=null,r.memoizedState!==null&&r.memoizedState.cachePool!==null&&(m=r.memoizedState.cachePool.pool),m!==o&&(r.flags|=2048)),a!==s&&a&&(t.child.flags|=8192),Jc(t,t.updateQueue),ct(t),null);case 4:return Z(),s===null&&Wu(t.stateNode.containerInfo),ct(t),null;case 10:return jl(t.type),ct(t),null;case 19:if(pe(St),r=t.memoizedState,r===null)return ct(t),null;if(o=(t.flags&128)!==0,m=r.rendering,m===null)if(o)bi(r,!1);else{if(Nt!==0||s!==null&&(s.flags&128)!==0)for(s=t.child;s!==null;){if(m=Uc(s),m!==null){for(t.flags|=128,bi(r,!1),s=m.updateQueue,t.updateQueue=s,Jc(t,s),t.subtreeFlags=0,s=a,a=t.child;a!==null;)lh(a,s),a=a.sibling;return ke(St,St.current&1|2),zs&&pl(t,r.treeForkCount),t.child}s=s.sibling}r.tail!==null&&mt()>so&&(t.flags|=128,o=!0,bi(r,!1),t.lanes=4194304)}else{if(!o)if(s=Uc(m),s!==null){if(t.flags|=128,o=!0,s=s.updateQueue,t.updateQueue=s,Jc(t,s),bi(r,!0),r.tail===null&&r.tailMode==="hidden"&&!m.alternate&&!zs)return ct(t),null}else 2*mt()-r.renderingStartTime>so&&a!==536870912&&(t.flags|=128,o=!0,bi(r,!1),t.lanes=4194304);r.isBackwards?(m.sibling=t.child,t.child=m):(s=r.last,s!==null?s.sibling=m:t.child=m,r.last=m)}return r.tail!==null?(s=r.tail,r.rendering=s,r.tail=s.sibling,r.renderingStartTime=mt(),s.sibling=null,a=St.current,ke(St,o?a&1|2:a&1),zs&&pl(t,r.treeForkCount),s):(ct(t),null);case 22:case 23:return ya(t),eu(),r=t.memoizedState!==null,s!==null?s.memoizedState!==null!==r&&(t.flags|=8192):r&&(t.flags|=8192),r?(a&536870912)!==0&&(t.flags&128)===0&&(ct(t),t.subtreeFlags&6&&(t.flags|=8192)):ct(t),a=t.updateQueue,a!==null&&Jc(t,a.retryQueue),a=null,s!==null&&s.memoizedState!==null&&s.memoizedState.cachePool!==null&&(a=s.memoizedState.cachePool.pool),r=null,t.memoizedState!==null&&t.memoizedState.cachePool!==null&&(r=t.memoizedState.cachePool.pool),r!==a&&(t.flags|=2048),s!==null&&pe(zn),null;case 24:return a=null,s!==null&&(a=s.memoizedState.cache),t.memoizedState.cache!==a&&(t.flags|=2048),jl(Mt),ct(t),null;case 25:return null;case 30:return null}throw Error(c(156,t.tag))}function Ny(s,t){switch(Bd(t),t.tag){case 1:return s=t.flags,s&65536?(t.flags=s&-65537|128,t):null;case 3:return jl(Mt),Z(),s=t.flags,(s&65536)!==0&&(s&128)===0?(t.flags=s&-65537|128,t):null;case 26:case 27:case 5:return ns(t),null;case 31:if(t.memoizedState!==null){if(ya(t),t.alternate===null)throw Error(c(340));Tn()}return s=t.flags,s&65536?(t.flags=s&-65537|128,t):null;case 13:if(ya(t),s=t.memoizedState,s!==null&&s.dehydrated!==null){if(t.alternate===null)throw Error(c(340));Tn()}return s=t.flags,s&65536?(t.flags=s&-65537|128,t):null;case 19:return pe(St),null;case 4:return Z(),null;case 10:return jl(t.type),null;case 22:case 23:return ya(t),eu(),s!==null&&pe(zn),s=t.flags,s&65536?(t.flags=s&-65537|128,t):null;case 24:return jl(Mt),null;case 25:return null;default:return null}}function Af(s,t){switch(Bd(t),t.tag){case 3:jl(Mt),Z();break;case 26:case 27:case 5:ns(t);break;case 4:Z();break;case 31:t.memoizedState!==null&&ya(t);break;case 13:ya(t);break;case 19:pe(St);break;case 10:jl(t.type);break;case 22:case 23:ya(t),eu(),s!==null&&pe(zn);break;case 24:jl(Mt)}}function yi(s,t){try{var a=t.updateQueue,r=a!==null?a.lastEffect:null;if(r!==null){var o=r.next;a=o;do{if((a.tag&s)===s){r=void 0;var m=a.create,j=a.inst;r=m(),j.destroy=r}a=a.next}while(a!==o)}}catch(C){Vs(t,t.return,C)}}function Jl(s,t,a){try{var r=t.updateQueue,o=r!==null?r.lastEffect:null;if(o!==null){var m=o.next;r=m;do{if((r.tag&s)===s){var j=r.inst,C=j.destroy;if(C!==void 0){j.destroy=void 0,o=t;var $=a,ae=C;try{ae()}catch(ge){Vs(o,$,ge)}}}r=r.next}while(r!==m)}}catch(ge){Vs(t,t.return,ge)}}function Of(s){var t=s.updateQueue;if(t!==null){var a=s.stateNode;try{yh(t,a)}catch(r){Vs(s,s.return,r)}}}function Df(s,t,a){a.props=Ln(s.type,s.memoizedProps),a.state=s.memoizedState;try{a.componentWillUnmount()}catch(r){Vs(s,t,r)}}function wi(s,t){try{var a=s.ref;if(a!==null){switch(s.tag){case 26:case 27:case 5:var r=s.stateNode;break;case 30:r=s.stateNode;break;default:r=s.stateNode}typeof a=="function"?s.refCleanup=a(r):a.current=r}}catch(o){Vs(s,t,o)}}function nl(s,t){var a=s.ref,r=s.refCleanup;if(a!==null)if(typeof r=="function")try{r()}catch(o){Vs(s,t,o)}finally{s.refCleanup=null,s=s.alternate,s!=null&&(s.refCleanup=null)}else if(typeof a=="function")try{a(null)}catch(o){Vs(s,t,o)}else a.current=null}function Rf(s){var t=s.type,a=s.memoizedProps,r=s.stateNode;try{e:switch(t){case"button":case"input":case"select":case"textarea":a.autoFocus&&r.focus();break e;case"img":a.src?r.src=a.src:a.srcSet&&(r.srcset=a.srcSet)}}catch(o){Vs(s,s.return,o)}}function Au(s,t,a){try{var r=s.stateNode;Hy(r,s.type,a,t),r[is]=t}catch(o){Vs(s,s.return,o)}}function Lf(s){return s.tag===5||s.tag===3||s.tag===26||s.tag===27&&an(s.type)||s.tag===4}function Ou(s){e:for(;;){for(;s.sibling===null;){if(s.return===null||Lf(s.return))return null;s=s.return}for(s.sibling.return=s.return,s=s.sibling;s.tag!==5&&s.tag!==6&&s.tag!==18;){if(s.tag===27&&an(s.type)||s.flags&2||s.child===null||s.tag===4)continue e;s.child.return=s,s=s.child}if(!(s.flags&2))return s.stateNode}}function Du(s,t,a){var r=s.tag;if(r===5||r===6)s=s.stateNode,t?(a.nodeType===9?a.body:a.nodeName==="HTML"?a.ownerDocument.body:a).insertBefore(s,t):(t=a.nodeType===9?a.body:a.nodeName==="HTML"?a.ownerDocument.body:a,t.appendChild(s),a=a._reactRootContainer,a!=null||t.onclick!==null||(t.onclick=xl));else if(r!==4&&(r===27&&an(s.type)&&(a=s.stateNode,t=null),s=s.child,s!==null))for(Du(s,t,a),s=s.sibling;s!==null;)Du(s,t,a),s=s.sibling}function Xc(s,t,a){var r=s.tag;if(r===5||r===6)s=s.stateNode,t?a.insertBefore(s,t):a.appendChild(s);else if(r!==4&&(r===27&&an(s.type)&&(a=s.stateNode),s=s.child,s!==null))for(Xc(s,t,a),s=s.sibling;s!==null;)Xc(s,t,a),s=s.sibling}function Uf(s){var t=s.stateNode,a=s.memoizedProps;try{for(var r=s.type,o=t.attributes;o.length;)t.removeAttributeNode(o[0]);Kt(t,r,a),t[gs]=s,t[is]=a}catch(m){Vs(s,s.return,m)}}var wl=!1,Ot=!1,Ru=!1,$f=typeof WeakSet=="function"?WeakSet:Set,Pt=null;function by(s,t){if(s=s.containerInfo,tm=vo,s=Yx(s),Td(s)){if("selectionStart"in s)var a={start:s.selectionStart,end:s.selectionEnd};else e:{a=(a=s.ownerDocument)&&a.defaultView||window;var r=a.getSelection&&a.getSelection();if(r&&r.rangeCount!==0){a=r.anchorNode;var o=r.anchorOffset,m=r.focusNode;r=r.focusOffset;try{a.nodeType,m.nodeType}catch{a=null;break e}var j=0,C=-1,$=-1,ae=0,ge=0,be=s,ce=null;s:for(;;){for(var me;be!==a||o!==0&&be.nodeType!==3||(C=j+o),be!==m||r!==0&&be.nodeType!==3||($=j+r),be.nodeType===3&&(j+=be.nodeValue.length),(me=be.firstChild)!==null;)ce=be,be=me;for(;;){if(be===s)break s;if(ce===a&&++ae===o&&(C=j),ce===m&&++ge===r&&($=j),(me=be.nextSibling)!==null)break;be=ce,ce=be.parentNode}be=me}a=C===-1||$===-1?null:{start:C,end:$}}else a=null}a=a||{start:0,end:0}}else a=null;for(am={focusedElem:s,selectionRange:a},vo=!1,Pt=t;Pt!==null;)if(t=Pt,s=t.child,(t.subtreeFlags&1028)!==0&&s!==null)s.return=t,Pt=s;else for(;Pt!==null;){switch(t=Pt,m=t.alternate,s=t.flags,t.tag){case 0:if((s&4)!==0&&(s=t.updateQueue,s=s!==null?s.events:null,s!==null))for(a=0;a title"))),Kt(m,r,a),m[gs]=s,It(m),r=m;break e;case"link":var j=Gp("link","href",o).get(r+(a.href||""));if(j){for(var C=0;CXs&&(j=Xs,Xs=Xe,Xe=j);var Y=Kx(C,Xe),G=Kx(C,Xs);if(Y&&G&&(me.rangeCount!==1||me.anchorNode!==Y.node||me.anchorOffset!==Y.offset||me.focusNode!==G.node||me.focusOffset!==G.offset)){var te=be.createRange();te.setStart(Y.node,Y.offset),me.removeAllRanges(),Xe>Xs?(me.addRange(te),me.extend(G.node,G.offset)):(te.setEnd(G.node,G.offset),me.addRange(te))}}}}for(be=[],me=C;me=me.parentNode;)me.nodeType===1&&be.push({element:me,left:me.scrollLeft,top:me.scrollTop});for(typeof C.focus=="function"&&C.focus(),C=0;Ca?32:a,z.T=null,a=Hu,Hu=null;var m=en,j=Tl;if(Rt=0,Tr=en=null,Tl=0,(Ps&6)!==0)throw Error(c(331));var C=Ps;if(Ps|=4,Yf(m.current),qf(m,m.current,j,a),Ps=C,Ei(0,!1),as&&typeof as.onPostCommitFiberRoot=="function")try{as.onPostCommitFiberRoot(Ns,m)}catch{}return!0}finally{V.p=o,z.T=r,xp(s,t)}}function fp(s,t,a){t=Ua(a,t),t=bu(s.stateNode,t,2),s=Kl(s,t,2),s!==null&&(Re(s,2),rl(s))}function Vs(s,t,a){if(s.tag===3)fp(s,s,a);else for(;t!==null;){if(t.tag===3){fp(t,s,a);break}else if(t.tag===1){var r=t.stateNode;if(typeof t.type.getDerivedStateFromError=="function"||typeof r.componentDidCatch=="function"&&(Wl===null||!Wl.has(r))){s=Ua(a,s),a=pf(2),r=Kl(t,a,2),r!==null&&(gf(a,r,t,s),Re(r,2),rl(r));break}}t=t.return}}function qu(s,t,a){var r=s.pingCache;if(r===null){r=s.pingCache=new _y;var o=new Set;r.set(t,o)}else o=r.get(t),o===void 0&&(o=new Set,r.set(t,o));o.has(a)||($u=!0,o.add(a),s=Ey.bind(null,s,t,a),t.then(s,s))}function Ey(s,t,a){var r=s.pingCache;r!==null&&r.delete(t),s.pingedLanes|=s.suspendedLanes&a,s.warmLanes&=~a,Ws===s&&(Ts&a)===a&&(Nt===4||Nt===3&&(Ts&62914560)===Ts&&300>mt()-eo?(Ps&2)===0&&Er(s,0):Bu|=a,Cr===Ts&&(Cr=0)),rl(s)}function pp(s,t){t===0&&(t=W()),s=kn(s,t),s!==null&&(Re(s,t),rl(s))}function My(s){var t=s.memoizedState,a=0;t!==null&&(a=t.retryLane),pp(s,a)}function zy(s,t){var a=0;switch(s.tag){case 31:case 13:var r=s.stateNode,o=s.memoizedState;o!==null&&(a=o.retryLane);break;case 19:r=s.stateNode;break;case 22:r=s.stateNode._retryCache;break;default:throw Error(c(314))}r!==null&&r.delete(t),pp(s,a)}function Ay(s,t){return Ut(s,t)}var io=null,zr=null,Ku=!1,co=!1,Qu=!1,tn=0;function rl(s){s!==zr&&s.next===null&&(zr===null?io=zr=s:zr=zr.next=s),co=!0,Ku||(Ku=!0,Dy())}function Ei(s,t){if(!Qu&&co){Qu=!0;do for(var a=!1,r=io;r!==null;){if(s!==0){var o=r.pendingLanes;if(o===0)var m=0;else{var j=r.suspendedLanes,C=r.pingedLanes;m=(1<<31-bs(42|s)+1)-1,m&=o&~(j&~C),m=m&201326741?m&201326741|1:m?m|2:0}m!==0&&(a=!0,Np(r,m))}else m=Ts,m=tl(r,r===Ws?m:0,r.cancelPendingCommit!==null||r.timeoutHandle!==-1),(m&3)===0||ul(r,m)||(a=!0,Np(r,m));r=r.next}while(a);Qu=!1}}function Oy(){gp()}function gp(){co=Ku=!1;var s=0;tn!==0&&Gy()&&(s=tn);for(var t=mt(),a=null,r=io;r!==null;){var o=r.next,m=jp(r,t);m===0?(r.next=null,a===null?io=o:a.next=o,o===null&&(zr=a)):(a=r,(s!==0||(m&3)!==0)&&(co=!0)),r=o}Rt!==0&&Rt!==5||Ei(s),tn!==0&&(tn=0)}function jp(s,t){for(var a=s.suspendedLanes,r=s.pingedLanes,o=s.expirationTimes,m=s.pendingLanes&-62914561;0C)break;var ge=$.transferSize,be=$.initiatorType;ge&&Tp(be)&&($=$.responseEnd,j+=ge*($"u"?null:document;function Ip(s,t,a){var r=Ar;if(r&&typeof t=="string"&&t){var o=Ra(t);o='link[rel="'+s+'"][href="'+o+'"]',typeof a=="string"&&(o+='[crossorigin="'+a+'"]'),Bp.has(o)||(Bp.add(o),s={rel:s,crossOrigin:a,href:t},r.querySelector(o)===null&&(t=r.createElement("link"),Kt(t,"link",s),It(t),r.head.appendChild(t)))}}function Wy(s){El.D(s),Ip("dns-prefetch",s,null)}function e0(s,t){El.C(s,t),Ip("preconnect",s,t)}function s0(s,t,a){El.L(s,t,a);var r=Ar;if(r&&s&&t){var o='link[rel="preload"][as="'+Ra(t)+'"]';t==="image"&&a&&a.imageSrcSet?(o+='[imagesrcset="'+Ra(a.imageSrcSet)+'"]',typeof a.imageSizes=="string"&&(o+='[imagesizes="'+Ra(a.imageSizes)+'"]')):o+='[href="'+Ra(s)+'"]';var m=o;switch(t){case"style":m=Or(s);break;case"script":m=Dr(s)}Fa.has(m)||(s=v({rel:"preload",href:t==="image"&&a&&a.imageSrcSet?void 0:s,as:t},a),Fa.set(m,s),r.querySelector(o)!==null||t==="style"&&r.querySelector(Oi(m))||t==="script"&&r.querySelector(Di(m))||(t=r.createElement("link"),Kt(t,"link",s),It(t),r.head.appendChild(t)))}}function t0(s,t){El.m(s,t);var a=Ar;if(a&&s){var r=t&&typeof t.as=="string"?t.as:"script",o='link[rel="modulepreload"][as="'+Ra(r)+'"][href="'+Ra(s)+'"]',m=o;switch(r){case"audioworklet":case"paintworklet":case"serviceworker":case"sharedworker":case"worker":case"script":m=Dr(s)}if(!Fa.has(m)&&(s=v({rel:"modulepreload",href:s},t),Fa.set(m,s),a.querySelector(o)===null)){switch(r){case"audioworklet":case"paintworklet":case"serviceworker":case"sharedworker":case"worker":case"script":if(a.querySelector(Di(m)))return}r=a.createElement("link"),Kt(r,"link",s),It(r),a.head.appendChild(r)}}}function a0(s,t,a){El.S(s,t,a);var r=Ar;if(r&&s){var o=sr(r).hoistableStyles,m=Or(s);t=t||"default";var j=o.get(m);if(!j){var C={loading:0,preload:null};if(j=r.querySelector(Oi(m)))C.loading=5;else{s=v({rel:"stylesheet",href:s,"data-precedence":t},a),(a=Fa.get(m))&&dm(s,a);var $=j=r.createElement("link");It($),Kt($,"link",s),$._p=new Promise(function(ae,ge){$.onload=ae,$.onerror=ge}),$.addEventListener("load",function(){C.loading|=1}),$.addEventListener("error",function(){C.loading|=2}),C.loading|=4,ho(j,t,r)}j={type:"stylesheet",instance:j,count:1,state:C},o.set(m,j)}}}function l0(s,t){El.X(s,t);var a=Ar;if(a&&s){var r=sr(a).hoistableScripts,o=Dr(s),m=r.get(o);m||(m=a.querySelector(Di(o)),m||(s=v({src:s,async:!0},t),(t=Fa.get(o))&&um(s,t),m=a.createElement("script"),It(m),Kt(m,"link",s),a.head.appendChild(m)),m={type:"script",instance:m,count:1,state:null},r.set(o,m))}}function n0(s,t){El.M(s,t);var a=Ar;if(a&&s){var r=sr(a).hoistableScripts,o=Dr(s),m=r.get(o);m||(m=a.querySelector(Di(o)),m||(s=v({src:s,async:!0,type:"module"},t),(t=Fa.get(o))&&um(s,t),m=a.createElement("script"),It(m),Kt(m,"link",s),a.head.appendChild(m)),m={type:"script",instance:m,count:1,state:null},r.set(o,m))}}function Pp(s,t,a,r){var o=(o=H.current)?xo(o):null;if(!o)throw Error(c(446));switch(s){case"meta":case"title":return null;case"style":return typeof a.precedence=="string"&&typeof a.href=="string"?(t=Or(a.href),a=sr(o).hoistableStyles,r=a.get(t),r||(r={type:"style",instance:null,count:0,state:null},a.set(t,r)),r):{type:"void",instance:null,count:0,state:null};case"link":if(a.rel==="stylesheet"&&typeof a.href=="string"&&typeof a.precedence=="string"){s=Or(a.href);var m=sr(o).hoistableStyles,j=m.get(s);if(j||(o=o.ownerDocument||o,j={type:"stylesheet",instance:null,count:0,state:{loading:0,preload:null}},m.set(s,j),(m=o.querySelector(Oi(s)))&&!m._p&&(j.instance=m,j.state.loading=5),Fa.has(s)||(a={rel:"preload",as:"style",href:a.href,crossOrigin:a.crossOrigin,integrity:a.integrity,media:a.media,hrefLang:a.hrefLang,referrerPolicy:a.referrerPolicy},Fa.set(s,a),m||r0(o,s,a,j.state))),t&&r===null)throw Error(c(528,""));return j}if(t&&r!==null)throw Error(c(529,""));return null;case"script":return t=a.async,a=a.src,typeof a=="string"&&t&&typeof t!="function"&&typeof t!="symbol"?(t=Dr(a),a=sr(o).hoistableScripts,r=a.get(t),r||(r={type:"script",instance:null,count:0,state:null},a.set(t,r)),r):{type:"void",instance:null,count:0,state:null};default:throw Error(c(444,s))}}function Or(s){return'href="'+Ra(s)+'"'}function Oi(s){return'link[rel="stylesheet"]['+s+"]"}function Hp(s){return v({},s,{"data-precedence":s.precedence,precedence:null})}function r0(s,t,a,r){s.querySelector('link[rel="preload"][as="style"]['+t+"]")?r.loading=1:(t=s.createElement("link"),r.preload=t,t.addEventListener("load",function(){return r.loading|=1}),t.addEventListener("error",function(){return r.loading|=2}),Kt(t,"link",a),It(t),s.head.appendChild(t))}function Dr(s){return'[src="'+Ra(s)+'"]'}function Di(s){return"script[async]"+s}function Fp(s,t,a){if(t.count++,t.instance===null)switch(t.type){case"style":var r=s.querySelector('style[data-href~="'+Ra(a.href)+'"]');if(r)return t.instance=r,It(r),r;var o=v({},a,{"data-href":a.href,"data-precedence":a.precedence,href:null,precedence:null});return r=(s.ownerDocument||s).createElement("style"),It(r),Kt(r,"style",o),ho(r,a.precedence,s),t.instance=r;case"stylesheet":o=Or(a.href);var m=s.querySelector(Oi(o));if(m)return t.state.loading|=4,t.instance=m,It(m),m;r=Hp(a),(o=Fa.get(o))&&dm(r,o),m=(s.ownerDocument||s).createElement("link"),It(m);var j=m;return j._p=new Promise(function(C,$){j.onload=C,j.onerror=$}),Kt(m,"link",r),t.state.loading|=4,ho(m,a.precedence,s),t.instance=m;case"script":return m=Dr(a.src),(o=s.querySelector(Di(m)))?(t.instance=o,It(o),o):(r=a,(o=Fa.get(m))&&(r=v({},a),um(r,o)),s=s.ownerDocument||s,o=s.createElement("script"),It(o),Kt(o,"link",r),s.head.appendChild(o),t.instance=o);case"void":return null;default:throw Error(c(443,t.type))}else t.type==="stylesheet"&&(t.state.loading&4)===0&&(r=t.instance,t.state.loading|=4,ho(r,a.precedence,s));return t.instance}function ho(s,t,a){for(var r=a.querySelectorAll('link[rel="stylesheet"][data-precedence],style[data-precedence]'),o=r.length?r[r.length-1]:null,m=o,j=0;j title"):null)}function i0(s,t,a){if(a===1||t.itemProp!=null)return!1;switch(s){case"meta":case"title":return!0;case"style":if(typeof t.precedence!="string"||typeof t.href!="string"||t.href==="")break;return!0;case"link":if(typeof t.rel!="string"||typeof t.href!="string"||t.href===""||t.onLoad||t.onError)break;switch(t.rel){case"stylesheet":return s=t.disabled,typeof t.precedence=="string"&&s==null;default:return!0}case"script":if(t.async&&typeof t.async!="function"&&typeof t.async!="symbol"&&!t.onLoad&&!t.onError&&t.src&&typeof t.src=="string")return!0}return!1}function qp(s){return!(s.type==="stylesheet"&&(s.state.loading&3)===0)}function c0(s,t,a,r){if(a.type==="stylesheet"&&(typeof r.media!="string"||matchMedia(r.media).matches!==!1)&&(a.state.loading&4)===0){if(a.instance===null){var o=Or(r.href),m=t.querySelector(Oi(o));if(m){t=m._p,t!==null&&typeof t=="object"&&typeof t.then=="function"&&(s.count++,s=po.bind(s),t.then(s,s)),a.state.loading|=4,a.instance=m,It(m);return}m=t.ownerDocument||t,r=Hp(r),(o=Fa.get(o))&&dm(r,o),m=m.createElement("link"),It(m);var j=m;j._p=new Promise(function(C,$){j.onload=C,j.onerror=$}),Kt(m,"link",r),a.instance=m}s.stylesheets===null&&(s.stylesheets=new Map),s.stylesheets.set(a,t),(t=a.state.preload)&&(a.state.loading&3)===0&&(s.count++,a=po.bind(s),t.addEventListener("load",a),t.addEventListener("error",a))}}var mm=0;function o0(s,t){return s.stylesheets&&s.count===0&&jo(s,s.stylesheets),0mm?50:800)+t);return s.unsuspend=a,function(){s.unsuspend=null,clearTimeout(r),clearTimeout(o)}}:null}function po(){if(this.count--,this.count===0&&(this.imgCount===0||!this.waitingForImages)){if(this.stylesheets)jo(this,this.stylesheets);else if(this.unsuspend){var s=this.unsuspend;this.unsuspend=null,s()}}}var go=null;function jo(s,t){s.stylesheets=null,s.unsuspend!==null&&(s.count++,go=new Map,t.forEach(d0,s),go=null,po.call(s))}function d0(s,t){if(!(t.state.loading&4)){var a=go.get(s);if(a)var r=a.get(null);else{a=new Map,go.set(s,a);for(var o=s.querySelectorAll("link[data-precedence],style[data-precedence]"),m=0;m"u"||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!="function"))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(l)}catch(n){console.error(n)}}return l(),ym.exports=W_(),ym.exports}var s1=e1();function I(...l){return M0(z0(l))}const Ce=d.forwardRef(({className:l,...n},i)=>e.jsx("div",{ref:i,className:I("rounded-xl border bg-card text-card-foreground shadow",l),...n}));Ce.displayName="Card";const De=d.forwardRef(({className:l,...n},i)=>e.jsx("div",{ref:i,className:I("flex flex-col space-y-1.5 p-6",l),...n}));De.displayName="CardHeader";const Le=d.forwardRef(({className:l,...n},i)=>e.jsx("div",{ref:i,className:I("font-semibold leading-none tracking-tight",l),...n}));Le.displayName="CardTitle";const ws=d.forwardRef(({className:l,...n},i)=>e.jsx("div",{ref:i,className:I("text-sm text-muted-foreground",l),...n}));ws.displayName="CardDescription";const Ae=d.forwardRef(({className:l,...n},i)=>e.jsx("div",{ref:i,className:I("p-6 pt-0",l),...n}));Ae.displayName="CardContent";const Zo=d.forwardRef(({className:l,...n},i)=>e.jsx("div",{ref:i,className:I("flex items-center p-6 pt-0",l),...n}));Zo.displayName="CardFooter";const ta=O0,Xt=d.forwardRef(({className:l,...n},i)=>e.jsx(Ig,{ref:i,className:I("inline-flex h-9 items-center justify-center rounded-lg bg-muted p-1 text-muted-foreground",l),...n}));Xt.displayName=Ig.displayName;const Je=d.forwardRef(({className:l,...n},i)=>e.jsx(Pg,{ref:i,className:I("inline-flex items-center justify-center whitespace-nowrap rounded-md px-3 py-1 text-sm font-medium ring-offset-background transition-all duration-300 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 data-[state=active]:bg-background data-[state=active]:text-foreground data-[state=active]:shadow",l),...n}));Je.displayName=Pg.displayName;const ys=d.forwardRef(({className:l,...n},i)=>e.jsx(Hg,{ref:i,className:I("mt-2 ring-offset-background focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 data-[state=active]:animate-in data-[state=active]:fade-in data-[state=active]:duration-300",l),...n}));ys.displayName=Hg.displayName;const Ye=d.forwardRef(({className:l,children:n,viewportRef:i,...c},u)=>e.jsxs(Fg,{ref:u,className:I("relative overflow-hidden",l),...c,children:[e.jsx(D0,{ref:i,className:"h-full w-full rounded-[inherit]",children:n}),e.jsx(Um,{}),e.jsx(Um,{orientation:"horizontal"}),e.jsx(R0,{})]}));Ye.displayName=Fg.displayName;const Um=d.forwardRef(({className:l,orientation:n="vertical",...i},c)=>e.jsx(Gg,{ref:c,orientation:n,className:I("flex touch-none select-none transition-colors",n==="vertical"&&"h-full w-2.5 border-l border-l-transparent p-[1px]",n==="horizontal"&&"h-2.5 flex-col border-t border-t-transparent p-[1px]",l),...i,children:e.jsx(L0,{className:"relative flex-1 rounded-full bg-border"})}));Um.displayName=Gg.displayName;function js({className:l,...n}){return e.jsx("div",{className:I("animate-pulse rounded-md bg-primary/10",l),...n})}const Kn=d.forwardRef(({className:l,value:n,...i},c)=>e.jsx(Vg,{ref:c,className:I("relative h-2 w-full overflow-hidden rounded-full bg-primary/20",l),...i,children:e.jsx(U0,{className:"h-full w-full flex-1 bg-primary transition-all",style:{transform:`translateX(-${100-(n||0)}%)`}})}));Kn.displayName=Vg.displayName;async function we(l,n){const c=n?.body instanceof FormData?{...n?.headers}:{"Content-Type":"application/json",...n?.headers},u={...n,credentials:"include",headers:c},x=await fetch(l,u);if(x.status===401)throw window.location.href="/auth",new Error("认证失败,请重新登录");return x}function Fs(){return{"Content-Type":"application/json"}}async function t1(){try{await fetch("/api/webui/auth/logout",{method:"POST",credentials:"include"})}catch(l){console.error("登出请求失败:",l)}window.location.href="/auth"}async function tc(){try{return(await(await fetch("/api/webui/auth/check",{method:"GET",credentials:"include"})).json()).authenticated===!0}catch{return!1}}const a1={light:"",dark:".dark"},tv=d.createContext(null);function av(){const l=d.useContext(tv);if(!l)throw new Error("useChart must be used within a ");return l}const $r=d.forwardRef(({id:l,className:n,children:i,config:c,...u},x)=>{const h=d.useId(),f=`chart-${l||h.replace(/:/g,"")}`;return e.jsx(tv.Provider,{value:{config:c},children:e.jsxs("div",{"data-chart":f,ref:x,className:I("flex aspect-video justify-center text-xs [&_.recharts-cartesian-axis-tick_text]:fill-muted-foreground [&_.recharts-cartesian-grid_line[stroke='#ccc']]:stroke-border/50 [&_.recharts-curve.recharts-tooltip-cursor]:stroke-border [&_.recharts-dot[stroke='#fff']]:stroke-transparent [&_.recharts-layer]:outline-none [&_.recharts-polar-grid_[stroke='#ccc']]:stroke-border [&_.recharts-radial-bar-background-sector]:fill-muted [&_.recharts-rectangle.recharts-tooltip-cursor]:fill-muted [&_.recharts-reference-line_[stroke='#ccc']]:stroke-border [&_.recharts-sector[stroke='#fff']]:stroke-transparent [&_.recharts-sector]:outline-none [&_.recharts-surface]:outline-none",n),...u,children:[e.jsx(l1,{id:f,config:c}),e.jsx(oj,{children:i})]})})});$r.displayName="Chart";const l1=({id:l,config:n})=>{const i=Object.entries(n).filter(([,c])=>c.theme||c.color);return i.length?e.jsx("style",{dangerouslySetInnerHTML:{__html:Object.entries(a1).map(([c,u])=>` ${u} [data-chart=${l}] { ${i.map(([x,h])=>{const f=h.theme?.[c]||h.color;return f?` --color-${x}: ${f};`:null}).join(` `)} } `).join(` -`)}}):null},Ii=dj,Br=d.forwardRef(({active:l,payload:n,className:i,indicator:c="dot",hideLabel:u=!1,hideIndicator:x=!1,label:h,labelFormatter:f,labelClassName:p,formatter:g,color:N,nameKey:v,labelKey:y},w)=>{const{config:b}=av(),R=d.useMemo(()=>{if(u||!n?.length)return null;const[S]=n,P=`${y||S?.dataKey||S?.name||"value"}`,M=$m(b,S,P),T=!y&&typeof h=="string"?b[h]?.label||h:M?.label;return f?e.jsx("div",{className:I("font-medium",p),children:f(T,n)}):T?e.jsx("div",{className:I("font-medium",p),children:T}):null},[h,f,n,u,p,b,y]);if(!l||!n?.length)return null;const D=n.length===1&&c!=="dot";return e.jsxs("div",{ref:w,className:I("grid min-w-[8rem] items-start gap-1.5 rounded-lg border border-border/50 bg-background px-2.5 py-1.5 text-xs shadow-xl",i),children:[D?null:R,e.jsx("div",{className:"grid gap-1.5",children:n.filter(S=>S.type!=="none").map((S,P)=>{const M=`${v||S.name||S.dataKey||"value"}`,T=$m(b,S,M),A=N||S.payload.fill||S.color;return e.jsx("div",{className:I("flex w-full flex-wrap items-stretch gap-2 [&>svg]:h-2.5 [&>svg]:w-2.5 [&>svg]:text-muted-foreground",c==="dot"&&"items-center"),children:g&&S?.value!==void 0&&S.name?g(S.value,S.name,S,P,S.payload):e.jsxs(e.Fragment,{children:[T?.icon?e.jsx(T.icon,{}):!x&&e.jsx("div",{className:I("shrink-0 rounded-[2px] border-[--color-border] bg-[--color-bg]",{"h-2.5 w-2.5":c==="dot","w-1":c==="line","w-0 border-[1.5px] border-dashed bg-transparent":c==="dashed","my-0.5":D&&c==="dashed"}),style:{"--color-bg":A,"--color-border":A}}),e.jsxs("div",{className:I("flex flex-1 justify-between leading-none",D?"items-end":"items-center"),children:[e.jsxs("div",{className:"grid gap-1.5",children:[D?R:null,e.jsx("span",{className:"text-muted-foreground",children:T?.label||S.name})]}),S.value&&e.jsx("span",{className:"font-mono font-medium tabular-nums text-foreground",children:S.value.toLocaleString()})]})]})},S.dataKey)})})]})});Br.displayName="ChartTooltip";const n1=fw,lv=d.forwardRef(({className:l,hideIcon:n=!1,payload:i,verticalAlign:c="bottom",nameKey:u},x)=>{const{config:h}=av();return i?.length?e.jsx("div",{ref:x,className:I("flex items-center justify-center gap-4",c==="top"?"pb-3":"pt-3",l),children:i.filter(f=>f.type!=="none").map(f=>{const p=`${u||f.dataKey||"value"}`,g=$m(h,f,p);return e.jsxs("div",{className:I("flex items-center gap-1.5 [&>svg]:h-3 [&>svg]:w-3 [&>svg]:text-muted-foreground"),children:[g?.icon&&!n?e.jsx(g.icon,{}):e.jsx("div",{className:"h-2 w-2 shrink-0 rounded-[2px]",style:{backgroundColor:f.color}}),g?.label]},f.value)})}):null});lv.displayName="ChartLegend";function $m(l,n,i){if(typeof n!="object"||n===null)return;const c="payload"in n&&typeof n.payload=="object"&&n.payload!==null?n.payload:void 0;let u=i;return i in n&&typeof n[i]=="string"?u=n[i]:c&&i in c&&typeof c[i]=="string"&&(u=c[i]),u in l?l[u]:l[i]}const qr=Kr("inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0",{variants:{variant:{default:"bg-primary text-primary-foreground shadow hover:bg-primary/90",destructive:"bg-destructive text-destructive-foreground shadow-sm hover:bg-destructive/90",outline:"border border-input bg-background shadow-sm hover:bg-accent hover:text-accent-foreground",secondary:"bg-secondary text-secondary-foreground shadow-sm hover:bg-secondary/80",ghost:"hover:bg-accent hover:text-accent-foreground",link:"text-primary underline-offset-4 hover:underline"},size:{default:"h-9 px-4 py-2",sm:"h-8 rounded-md px-3 text-xs",lg:"h-10 rounded-md px-8",icon:"h-9 w-9"}},defaultVariants:{variant:"default",size:"default"}}),_=d.forwardRef(({className:l,variant:n,size:i,asChild:c=!1,...u},x)=>{const h=c?bw:"button";return e.jsx(h,{className:I(qr({variant:n,size:i,className:l})),ref:x,...u})});_.displayName="Button";const r1=Kr("inline-flex items-center rounded-md border px-2.5 py-0.5 text-xs font-semibold transition-colors focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2",{variants:{variant:{default:"border-transparent bg-primary text-primary-foreground shadow hover:bg-primary/80",secondary:"border-transparent bg-secondary text-secondary-foreground hover:bg-secondary/80",destructive:"border-transparent bg-destructive text-destructive-foreground shadow hover:bg-destructive/80",outline:"text-foreground"}},defaultVariants:{variant:"default"}});function Se({className:l,variant:n,...i}){return e.jsx("div",{className:I(r1({variant:n}),l),...i})}async function i1(){const l=await we("/api/webui/system/restart",{method:"POST",headers:Fs()});if(!l.ok){const n=await l.json();throw new Error(n.detail||"重启失败")}return await l.json()}async function c1(){const l=await we("/api/webui/system/status",{method:"GET",headers:Fs()});if(!l.ok){const n=await l.json();throw new Error(n.detail||"获取状态失败")}return await l.json()}const Lr={INITIAL_DELAY:3e3,CHECK_INTERVAL:2e3,CHECK_TIMEOUT:3e3,MAX_ATTEMPTS:60,PROGRESS_INTERVAL:200,SUCCESS_REDIRECT_DELAY:1500},nv=d.createContext(null);function Yn({children:l,onRestartComplete:n,onRestartFailed:i,healthCheckUrl:c="/api/webui/system/status",maxAttempts:u=Lr.MAX_ATTEMPTS}){const[x,h]=d.useState({status:"idle",progress:0,elapsedTime:0,checkAttempts:0,maxAttempts:u}),[f,p]=d.useState({}),g=d.useCallback(()=>{f.progress&&clearInterval(f.progress),f.elapsed&&clearInterval(f.elapsed),f.check&&clearTimeout(f.check),p({})},[f]),N=d.useCallback(()=>{g(),h({status:"idle",progress:0,elapsedTime:0,checkAttempts:0,maxAttempts:u})},[g,u]),v=d.useCallback(async()=>{try{const D=new AbortController,S=setTimeout(()=>D.abort(),Lr.CHECK_TIMEOUT),P=await fetch(c,{method:"GET",headers:{"Content-Type":"application/json"},credentials:"include",signal:D.signal});return clearTimeout(S),P.ok}catch{return!1}},[c]),y=d.useCallback(()=>{let D=0;const S=async()=>{if(D++,h(M=>({...M,status:"checking",checkAttempts:D})),await v())g(),h(M=>({...M,status:"success",progress:100})),setTimeout(()=>{n?.(),window.location.href="/auth"},Lr.SUCCESS_REDIRECT_DELAY);else if(D>=u){g();const M=`健康检查超时 (${D}/${u})`;h(T=>({...T,status:"failed",error:M})),i?.(M)}else{const M=setTimeout(S,Lr.CHECK_INTERVAL);p(T=>({...T,check:M}))}};S()},[v,g,u,n,i]),w=d.useCallback(()=>{h(D=>({...D,status:"checking",checkAttempts:0,error:void 0})),y()},[y]),b=d.useCallback(async D=>{const{delay:S=0,skipApiCall:P=!1}=D??{};if(x.status!=="idle"&&x.status!=="failed")return;if(g(),h({status:"requesting",progress:0,elapsedTime:0,checkAttempts:0,maxAttempts:u}),S>0&&await new Promise(A=>setTimeout(A,S)),P)h(A=>({...A,status:"restarting"}));else try{h(A=>({...A,status:"restarting"})),await Promise.race([i1(),new Promise(A=>setTimeout(A,5e3))])}catch{}const M=setInterval(()=>{h(A=>({...A,progress:A.progress>=90?A.progress:A.progress+1}))},Lr.PROGRESS_INTERVAL),T=setInterval(()=>{h(A=>({...A,elapsedTime:A.elapsedTime+1}))},1e3);p({progress:M,elapsed:T}),setTimeout(()=>{y()},Lr.INITIAL_DELAY)},[x.status,g,u,y]),R={state:x,isRestarting:x.status!=="idle",triggerRestart:b,resetState:N,retryHealthCheck:w};return e.jsx(nv.Provider,{value:R,children:l})}function vn(){const l=d.useContext(nv);if(!l)throw new Error("useRestart must be used within a RestartProvider");return l}function o1(){try{return vn()}catch{return null}}const d1=(l,n,i,c,u)=>({idle:{icon:null,title:"",description:"",tip:""},requesting:{icon:e.jsx(Bs,{className:"h-16 w-16 text-primary animate-spin"}),title:c??"准备重启",description:u??"正在发送重启请求...",tip:"🔄 正在准备重启麦麦..."},restarting:{icon:e.jsx(Bs,{className:"h-16 w-16 text-primary animate-spin"}),title:c??"正在重启麦麦",description:u??"请稍候,麦麦正在重启中...",tip:"🔄 配置已保存,正在重启主程序..."},checking:{icon:e.jsx(Bs,{className:"h-16 w-16 text-primary animate-spin"}),title:"检查服务状态",description:`等待服务恢复... (${n}/${i})`,tip:"⏳ 正在等待服务恢复,请勿关闭页面..."},success:{icon:e.jsx(pt,{className:"h-16 w-16 text-green-500"}),title:"重启成功",description:"正在跳转到登录页面...",tip:"✅ 配置已生效,服务运行正常"},failed:{icon:e.jsx(wt,{className:"h-16 w-16 text-destructive"}),title:"重启超时",description:"服务未能在预期时间内恢复",tip:"⚠️ 如果长时间无响应,请尝试手动重启"}})[l];function Jn({visible:l,onComplete:n,onFailed:i,title:c,description:u,showAnimation:x=!0,className:h}){const f=o1();return(f?f.isRestarting:l)?f?e.jsx(rv,{state:f.state,onRetry:f.retryHealthCheck,onComplete:n,onFailed:i,title:c,description:u,showAnimation:x,className:h}):e.jsx(u1,{onComplete:n,onFailed:i,title:c,description:u,showAnimation:x,className:h}):null}function rv({state:l,onRetry:n,onComplete:i,onFailed:c,title:u,description:x,showAnimation:h,className:f}){const{status:p,progress:g,elapsedTime:N,checkAttempts:v,maxAttempts:y}=l;d.useEffect(()=>{p==="success"&&i?i():p==="failed"&&c&&c()},[p,i,c]);const w=d1(p,v,y,u,x),b=R=>{const D=Math.floor(R/60),S=R%60;return`${D}:${S.toString().padStart(2,"0")}`};return e.jsxs("div",{className:I("fixed inset-0 bg-background/95 backdrop-blur-sm z-50 flex items-center justify-center",f),children:[h&&e.jsx(m1,{}),e.jsxs("div",{className:"max-w-md w-full mx-4 space-y-8 relative z-10",children:[e.jsxs("div",{className:"flex flex-col items-center space-y-4",children:[e.jsxs("div",{className:"relative",children:[w.icon,(p==="restarting"||p==="checking")&&e.jsx("div",{className:"absolute inset-0 rounded-full bg-primary/20 animate-ping"})]}),e.jsx("h2",{className:"text-2xl font-bold",children:w.title}),e.jsx("p",{className:"text-muted-foreground text-center",children:w.description})]}),p!=="failed"&&p!=="idle"&&e.jsxs("div",{className:"space-y-2",children:[e.jsx(Kn,{value:g,className:"h-2"}),e.jsxs("div",{className:"flex justify-between text-sm text-muted-foreground",children:[e.jsxs("span",{children:[g,"%"]}),e.jsxs("span",{children:["已用时: ",b(N)]})]})]}),e.jsx("div",{className:"bg-muted/50 rounded-lg p-4",children:e.jsx("p",{className:"text-sm text-muted-foreground",children:w.tip})}),p==="failed"&&e.jsxs("div",{className:"flex gap-2",children:[e.jsxs(_,{onClick:()=>window.location.reload(),variant:"default",className:"flex-1",children:[e.jsx(dt,{className:"mr-2 h-4 w-4"}),"刷新页面"]}),e.jsxs(_,{onClick:n,variant:"secondary",className:"flex-1",children:[e.jsx(Zi,{className:"mr-2 h-4 w-4"}),"重试检测"]})]})]})]})}function u1({onComplete:l,onFailed:n,title:i,description:c,showAnimation:u,className:x}){const[h,f]=d.useState({status:"restarting",progress:0,elapsedTime:0,checkAttempts:0,maxAttempts:60}),p=d.useCallback(()=>{let g=0;const N=60,v=async()=>{g++,f(y=>({...y,status:"checking",checkAttempts:g}));try{if((await fetch("/api/webui/system/status",{method:"GET",signal:AbortSignal.timeout(3e3)})).ok){f(w=>({...w,status:"success",progress:100})),setTimeout(()=>{l?.(),window.location.href="/auth"},1500);return}}catch{}g>=N?(f(y=>({...y,status:"failed"})),n?.()):setTimeout(v,2e3)};v()},[l,n]);return d.useEffect(()=>{const g=setInterval(()=>{f(y=>({...y,progress:y.progress>=90?y.progress:y.progress+1}))},200),N=setInterval(()=>{f(y=>({...y,elapsedTime:y.elapsedTime+1}))},1e3),v=setTimeout(()=>{p()},3e3);return()=>{clearInterval(g),clearInterval(N),clearTimeout(v)}},[p]),e.jsx(rv,{state:h,onRetry:p,onComplete:l,onFailed:n,title:i,description:c,showAnimation:u,className:x})}function m1(){return e.jsxs("div",{className:"absolute inset-0 overflow-hidden pointer-events-none",children:[e.jsxs("div",{className:"absolute top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2 w-[600px] h-[600px]",children:[e.jsx("div",{className:"absolute inset-0 rounded-full border border-primary/10 animate-[ping_3s_ease-in-out_infinite]"}),e.jsx("div",{className:"absolute inset-8 rounded-full border border-primary/10 animate-[ping_3s_ease-in-out_infinite_0.5s]"}),e.jsx("div",{className:"absolute inset-16 rounded-full border border-primary/10 animate-[ping_3s_ease-in-out_infinite_1s]"})]}),e.jsx("div",{className:"absolute top-1/4 left-1/4 w-2 h-2 bg-primary/20 rounded-full animate-bounce"}),e.jsx("div",{className:"absolute top-3/4 right-1/4 w-3 h-3 bg-primary/15 rounded-full animate-bounce delay-150"}),e.jsx("div",{className:"absolute top-1/2 right-1/3 w-2 h-2 bg-primary/20 rounded-full animate-bounce delay-300"})]})}const Is=_w,Wo=Sw,x1=yw,iv=d.forwardRef(({className:l,...n},i)=>e.jsx(uj,{ref:i,className:I("fixed inset-0 z-50 bg-black/80 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0",l),...n}));iv.displayName=uj.displayName;const Os=d.forwardRef(({className:l,children:n,preventOutsideClose:i=!1,...c},u)=>e.jsxs(x1,{children:[e.jsx(iv,{}),e.jsxs(mj,{ref:u,className:I("fixed left-[50%] top-[50%] z-50 grid w-full max-w-lg translate-x-[-50%] translate-y-[-50%] gap-4 border bg-background p-6 shadow-lg duration-200 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[state=closed]:slide-out-to-left-1/2 data-[state=closed]:slide-out-to-top-[48%] data-[state=open]:slide-in-from-left-1/2 data-[state=open]:slide-in-from-top-[48%] sm:rounded-lg",l),onPointerDownOutside:i?x=>x.preventDefault():void 0,onInteractOutside:i?x=>x.preventDefault():void 0,...c,children:[n,e.jsxs(ww,{className:"absolute right-4 top-4 rounded-sm opacity-70 ring-offset-background transition-opacity hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:pointer-events-none data-[state=open]:bg-accent data-[state=open]:text-muted-foreground",children:[e.jsx(Ta,{className:"h-4 w-4"}),e.jsx("span",{className:"sr-only",children:"Close"})]})]})]}));Os.displayName=mj.displayName;const Ds=({className:l,...n})=>e.jsx("div",{className:I("flex flex-col space-y-1.5 text-center sm:text-left",l),...n});Ds.displayName="DialogHeader";const st=({className:l,...n})=>e.jsx("div",{className:I("flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2",l),...n});st.displayName="DialogFooter";const Rs=d.forwardRef(({className:l,...n},i)=>e.jsx(xj,{ref:i,className:I("text-lg font-semibold leading-none tracking-tight",l),...n}));Rs.displayName=xj.displayName;const Ks=d.forwardRef(({className:l,...n},i)=>e.jsx(hj,{ref:i,className:I("text-sm text-muted-foreground",l),...n}));Ks.displayName=hj.displayName;const le=d.forwardRef(({className:l,type:n,...i},c)=>e.jsx("input",{type:n,className:I("flex h-9 w-full rounded-md border border-input bg-transparent px-3 py-1 text-base shadow-sm transition-colors file:border-0 file:bg-transparent file:text-sm file:font-medium file:text-foreground placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:cursor-not-allowed disabled:opacity-50 md:text-sm",l),ref:c,...i}));le.displayName="Input";const qs=d.forwardRef(({className:l,...n},i)=>e.jsx(fj,{ref:i,className:I("grid place-content-center peer h-4 w-4 shrink-0 rounded-sm border border-primary shadow focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:cursor-not-allowed disabled:opacity-50 data-[state=checked]:bg-primary data-[state=checked]:text-primary-foreground",l),...n,children:e.jsx(kw,{className:I("grid place-content-center text-current"),children:e.jsx(kt,{className:"h-4 w-4"})})}));qs.displayName=fj.displayName;const h1=5,f1=5e3;let Sm=0;function p1(){return Sm=(Sm+1)%Number.MAX_SAFE_INTEGER,Sm.toString()}const km=new Map,fg=l=>{if(km.has(l))return;const n=setTimeout(()=>{km.delete(l),Yi({type:"REMOVE_TOAST",toastId:l})},f1);km.set(l,n)},g1=(l,n)=>{switch(n.type){case"ADD_TOAST":return{...l,toasts:[n.toast,...l.toasts].slice(0,h1)};case"UPDATE_TOAST":return{...l,toasts:l.toasts.map(i=>i.id===n.toast.id?{...i,...n.toast}:i)};case"DISMISS_TOAST":{const{toastId:i}=n;return i?fg(i):l.toasts.forEach(c=>{fg(c.id)}),{...l,toasts:l.toasts.map(c=>c.id===i||i===void 0?{...c,open:!1}:c)}}case"REMOVE_TOAST":return n.toastId===void 0?{...l,toasts:[]}:{...l,toasts:l.toasts.filter(i=>i.id!==n.toastId)}}},Ao=[];let Oo={toasts:[]};function Yi(l){Oo=g1(Oo,l),Ao.forEach(n=>{n(Oo)})}function Qt({...l}){const n=p1(),i=u=>Yi({type:"UPDATE_TOAST",toast:{...u,id:n}}),c=()=>Yi({type:"DISMISS_TOAST",toastId:n});return Yi({type:"ADD_TOAST",toast:{...l,id:n,open:!0,onOpenChange:u=>{u||c()}}}),{id:n,dismiss:c,update:i}}function Zs(){const[l,n]=d.useState(Oo);return d.useEffect(()=>(Ao.push(n),()=>{const i=Ao.indexOf(n);i>-1&&Ao.splice(i,1)}),[l]),{...l,toast:Qt,dismiss:i=>Yi({type:"DISMISS_TOAST",toastId:i})}}const el="/api/webui/expression";async function Zm(){const l=await we(`${el}/chats`,{});if(!l.ok){const n=await l.json();throw new Error(n.detail||"获取聊天列表失败")}return l.json()}async function j1(l){const n=new URLSearchParams;l.page&&n.append("page",l.page.toString()),l.page_size&&n.append("page_size",l.page_size.toString()),l.search&&n.append("search",l.search),l.chat_id&&n.append("chat_id",l.chat_id);const i=await we(`${el}/list?${n}`,{});if(!i.ok){const c=await i.json();throw new Error(c.detail||"获取表达方式列表失败")}return i.json()}async function v1(l){const n=await we(`${el}/${l}`,{});if(!n.ok){const i=await n.json();throw new Error(i.detail||"获取表达方式详情失败")}return n.json()}async function N1(l){const n=await we(`${el}/`,{method:"POST",body:JSON.stringify(l)});if(!n.ok){const i=await n.json();throw new Error(i.detail||"创建表达方式失败")}return n.json()}async function b1(l,n){const i=await we(`${el}/${l}`,{method:"PATCH",body:JSON.stringify(n)});if(!i.ok){const c=await i.json();throw new Error(c.detail||"更新表达方式失败")}return i.json()}async function y1(l){const n=await we(`${el}/${l}`,{method:"DELETE"});if(!n.ok){const i=await n.json();throw new Error(i.detail||"删除表达方式失败")}return n.json()}async function w1(l){const n=await we(`${el}/batch/delete`,{method:"POST",body:JSON.stringify({ids:l})});if(!n.ok){const i=await n.json();throw new Error(i.detail||"批量删除表达方式失败")}return n.json()}async function _1(){const l=await we(`${el}/stats/summary`,{});if(!l.ok){const n=await l.json();throw new Error(n.detail||"获取统计数据失败")}return l.json()}async function Wm(){const l=await we(`${el}/review/stats`);if(!l.ok){const n=await l.json();throw new Error(n.detail||"获取审核统计失败")}return l.json()}async function S1(l){const n=new URLSearchParams;l.page&&n.append("page",l.page.toString()),l.page_size&&n.append("page_size",l.page_size.toString()),l.filter_type&&n.append("filter_type",l.filter_type),l.search&&n.append("search",l.search),l.chat_id&&n.append("chat_id",l.chat_id);const i=await we(`${el}/review/list?${n}`);if(!i.ok){const c=await i.json();throw new Error(c.detail||"获取审核列表失败")}return i.json()}async function pg(l){const n=await we(`${el}/review/batch`,{method:"POST",body:JSON.stringify({items:l})});if(!n.ok){const i=await n.json();throw new Error(i.detail||"批量审核失败")}return n.json()}function cv({open:l,onOpenChange:n}){const[i,c]=d.useState(null),[u,x]=d.useState([]),[h,f]=d.useState(!1),[p,g]=d.useState(!1),[N,v]=d.useState(0),[y,w]=d.useState(1),[b]=d.useState(20),[R,D]=d.useState("unchecked"),[S,P]=d.useState(""),[M,T]=d.useState(""),[A,F]=d.useState(new Set),[L,J]=d.useState(new Set),[U,ue]=d.useState(new Map),{toast:xe}=Zs(),he=d.useCallback(async()=>{try{g(!0);const k=await Wm();c(k)}catch(k){console.error("加载统计失败:",k)}finally{g(!1)}},[]),ne=d.useCallback(async()=>{try{f(!0);const k=await S1({page:y,page_size:b,filter_type:R,search:S||void 0});x(k.data),v(k.total)}catch(k){xe({title:"加载失败",description:k instanceof Error?k.message:"无法加载列表",variant:"destructive"})}finally{f(!1)}},[y,b,R,S,xe]),ve=d.useCallback(async()=>{try{const k=await Zm();if(k?.data){const H=new Map;k.data.forEach(se=>{H.set(se.chat_id,se.chat_name)}),ue(H)}}catch(k){console.error("加载聊天名称失败:",k)}},[]);d.useEffect(()=>{l&&(he(),ne(),ve())},[l,he,ne,ve]),d.useEffect(()=>{w(1),F(new Set)},[R,S]);const je=()=>{P(M),w(1)},z=k=>U.get(k)||k,V=async(k,H)=>{try{J(Ee=>new Set(Ee).add(k));const se=await pg([{id:k,rejected:H,require_unchecked:R==="unchecked"}]);se.results[0]?.success?(xe({title:H?"已拒绝":"已通过",description:`表达方式 #${k} ${H?"已拒绝":"已通过"}`}),ne(),he()):xe({title:"操作失败",description:se.results[0]?.message||"未知错误",variant:"destructive"})}catch(se){xe({title:"操作失败",description:se instanceof Error?se.message:"未知错误",variant:"destructive"})}finally{J(se=>{const Ee=new Set(se);return Ee.delete(k),Ee})}},B=async k=>{if(A.size===0){xe({title:"请选择",description:"请先选择要审核的表达方式",variant:"destructive"});return}try{f(!0);const H=Array.from(A).map(Ee=>({id:Ee,rejected:k,require_unchecked:R==="unchecked"})),se=await pg(H);xe({title:"批量审核完成",description:`成功 ${se.succeeded} 条,失败 ${se.failed} 条`,variant:se.failed>0?"destructive":"default"}),F(new Set),ne(),he()}catch(H){xe({title:"批量审核失败",description:H instanceof Error?H.message:"未知错误",variant:"destructive"})}finally{f(!1)}},oe=()=>{A.size===u.length?F(new Set):F(new Set(u.map(k=>k.id)))},K=k=>{F(H=>{const se=new Set(H);return se.has(k)?se.delete(k):se.add(k),se})},_e=k=>k?new Date(k*1e3).toLocaleString("zh-CN",{month:"2-digit",day:"2-digit",hour:"2-digit",minute:"2-digit"}):"-",pe=k=>k.checked?k.rejected?e.jsxs(Se,{variant:"destructive",className:"gap-1",children:[e.jsx(Ga,{className:"h-3 w-3"}),"已拒绝"]}):e.jsxs(Se,{variant:"default",className:"gap-1 bg-green-600",children:[e.jsx(pt,{className:"h-3 w-3"}),"已通过"]}):e.jsxs(Se,{variant:"outline",className:"gap-1",children:[e.jsx(na,{className:"h-3 w-3"}),"待审核"]}),ke=k=>k?k==="ai"?e.jsxs(Se,{variant:"secondary",className:"gap-1 text-xs",children:[e.jsx(Pn,{className:"h-3 w-3"}),"AI"]}):e.jsxs(Se,{variant:"secondary",className:"gap-1 text-xs",children:[e.jsx(fn,{className:"h-3 w-3"}),"人工"]}):null,O=Math.ceil(N/b);return e.jsx(Is,{open:l,onOpenChange:n,children:e.jsxs(Os,{className:"max-w-5xl h-[85vh] flex flex-col p-0",children:[e.jsxs(Ds,{className:"px-6 pt-6 pb-4 border-b shrink-0",children:[e.jsx(Rs,{className:"text-xl",children:"表达方式审核"}),e.jsx(Ks,{children:"审核麦麦学习到的表达方式,通过或拒绝不合适的内容"}),e.jsxs("div",{className:"grid grid-cols-4 gap-3 mt-4",children:[e.jsxs("div",{className:"rounded-lg border p-3 text-center",children:[e.jsx("div",{className:"text-2xl font-bold text-orange-500",children:p?"-":i?.unchecked??0}),e.jsx("div",{className:"text-xs text-muted-foreground",children:"待审核"})]}),e.jsxs("div",{className:"rounded-lg border p-3 text-center",children:[e.jsx("div",{className:"text-2xl font-bold text-green-500",children:p?"-":i?.passed??0}),e.jsx("div",{className:"text-xs text-muted-foreground",children:"已通过"})]}),e.jsxs("div",{className:"rounded-lg border p-3 text-center",children:[e.jsx("div",{className:"text-2xl font-bold text-red-500",children:p?"-":i?.rejected??0}),e.jsx("div",{className:"text-xs text-muted-foreground",children:"已拒绝"})]}),e.jsxs("div",{className:"rounded-lg border p-3 text-center",children:[e.jsx("div",{className:"text-2xl font-bold text-blue-500",children:p?"-":i?.total??0}),e.jsx("div",{className:"text-xs text-muted-foreground",children:"总计"})]})]})]}),e.jsxs("div",{className:"px-6 py-3 border-b shrink-0 space-y-3",children:[e.jsx(ta,{value:R,onValueChange:k=>D(k),className:"w-full",children:e.jsxs(Xt,{className:"grid w-full grid-cols-4",children:[e.jsxs(Je,{value:"unchecked",className:"gap-1",children:[e.jsx(na,{className:"h-4 w-4"}),"待审核 (",i?.unchecked??0,")"]}),e.jsxs(Je,{value:"passed",className:"gap-1",children:[e.jsx(pt,{className:"h-4 w-4"}),"已通过 (",i?.passed??0,")"]}),e.jsxs(Je,{value:"rejected",className:"gap-1",children:[e.jsx(Ga,{className:"h-4 w-4"}),"已拒绝 (",i?.rejected??0,")"]}),e.jsxs(Je,{value:"all",className:"gap-1",children:["全部 (",i?.total??0,")"]})]})}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsxs("div",{className:"relative flex-1",children:[e.jsx(Ct,{className:"absolute left-3 top-1/2 -translate-y-1/2 h-4 w-4 text-muted-foreground"}),e.jsx(le,{placeholder:"搜索情景或风格...",value:M,onChange:k=>T(k.target.value),onKeyDown:k=>k.key==="Enter"&&je(),className:"pl-9"})]}),e.jsx(_,{variant:"outline",size:"icon",onClick:je,children:e.jsx(Ct,{className:"h-4 w-4"})}),e.jsx(_,{variant:"outline",size:"icon",onClick:()=>{ne(),he()},disabled:h,children:e.jsx(dt,{className:I("h-4 w-4",h&&"animate-spin")})}),R==="unchecked"&&A.size>0&&e.jsxs(e.Fragment,{children:[e.jsxs(_,{variant:"default",size:"sm",className:"bg-green-600 hover:bg-green-700",onClick:()=>B(!1),disabled:h,children:[e.jsx(pt,{className:"h-4 w-4 mr-1"}),"批量通过 (",A.size,")"]}),e.jsxs(_,{variant:"destructive",size:"sm",onClick:()=>B(!0),disabled:h,children:[e.jsx(Ga,{className:"h-4 w-4 mr-1"}),"批量拒绝 (",A.size,")"]})]})]})]}),e.jsx(Ye,{className:"flex-1 px-6",children:h&&u.length===0?e.jsx("div",{className:"flex items-center justify-center h-40",children:e.jsx(dt,{className:"h-6 w-6 animate-spin text-muted-foreground"})}):u.length===0?e.jsxs("div",{className:"flex flex-col items-center justify-center h-40 text-muted-foreground",children:[e.jsx(wt,{className:"h-8 w-8 mb-2"}),e.jsx("p",{children:"没有找到表达方式"})]}):e.jsxs("div",{className:"space-y-2 py-2",children:[R==="unchecked"&&u.length>0&&e.jsxs("div",{className:"flex items-center gap-2 py-2 px-3 rounded-lg bg-muted/50",children:[e.jsx(qs,{checked:A.size===u.length&&u.length>0,onCheckedChange:oe}),e.jsxs("span",{className:"text-sm text-muted-foreground",children:["全选当前页 (",u.length," 条)"]})]}),u.map(k=>e.jsx("div",{className:I("rounded-lg border p-4 space-y-3 transition-colors",A.has(k.id)&&"bg-accent border-primary",L.has(k.id)&&"opacity-50"),children:e.jsxs("div",{className:"flex items-start gap-3",children:[R==="unchecked"&&e.jsx(qs,{checked:A.has(k.id),onCheckedChange:()=>K(k.id),disabled:L.has(k.id),className:"mt-1"}),e.jsxs("div",{className:"flex-1 min-w-0 space-y-2",children:[e.jsxs("div",{children:[e.jsx("span",{className:"text-xs text-muted-foreground",children:"情景:"}),e.jsx("p",{className:"text-sm font-medium break-words",children:k.situation})]}),e.jsxs("div",{children:[e.jsx("span",{className:"text-xs text-muted-foreground",children:"风格:"}),e.jsx("p",{className:"text-sm text-muted-foreground break-words",children:k.style})]}),e.jsxs("div",{className:"flex flex-wrap items-center gap-2 text-xs text-muted-foreground",children:[e.jsxs("span",{children:["#",k.id]}),e.jsx("span",{children:"·"}),e.jsx("span",{title:z(k.chat_id),className:"truncate max-w-32",children:z(k.chat_id)}),e.jsx("span",{children:"·"}),e.jsx("span",{children:_e(k.create_date)}),pe(k),ke(k.modified_by)]})]}),e.jsx("div",{className:"flex flex-col gap-2 shrink-0",children:R==="unchecked"?e.jsxs(e.Fragment,{children:[e.jsxs(_,{size:"sm",variant:"outline",className:"text-green-600 hover:text-green-700 hover:bg-green-50",onClick:()=>V(k.id,!1),disabled:L.has(k.id),children:[e.jsx(pt,{className:"h-4 w-4 mr-1"}),"通过"]}),e.jsxs(_,{size:"sm",variant:"outline",className:"text-red-600 hover:text-red-700 hover:bg-red-50",onClick:()=>V(k.id,!0),disabled:L.has(k.id),children:[e.jsx(Ga,{className:"h-4 w-4 mr-1"}),"拒绝"]})]}):R==="passed"?e.jsxs(_,{size:"sm",variant:"outline",className:"text-red-600 hover:text-red-700 hover:bg-red-50",onClick:()=>V(k.id,!0),disabled:L.has(k.id),children:[e.jsx(Ga,{className:"h-4 w-4 mr-1"}),"改为拒绝"]}):R==="rejected"?e.jsxs(_,{size:"sm",variant:"outline",className:"text-green-600 hover:text-green-700 hover:bg-green-50",onClick:()=>V(k.id,!1),disabled:L.has(k.id),children:[e.jsx(pt,{className:"h-4 w-4 mr-1"}),"改为通过"]}):e.jsx(e.Fragment,{children:k.rejected?e.jsxs(_,{size:"sm",variant:"outline",className:"text-green-600 hover:text-green-700 hover:bg-green-50",onClick:()=>V(k.id,!1),disabled:L.has(k.id),children:[e.jsx(pt,{className:"h-4 w-4 mr-1"}),"改为通过"]}):k.checked?e.jsxs(_,{size:"sm",variant:"outline",className:"text-red-600 hover:text-red-700 hover:bg-red-50",onClick:()=>V(k.id,!0),disabled:L.has(k.id),children:[e.jsx(Ga,{className:"h-4 w-4 mr-1"}),"改为拒绝"]}):e.jsxs(e.Fragment,{children:[e.jsxs(_,{size:"sm",variant:"outline",className:"text-green-600 hover:text-green-700 hover:bg-green-50",onClick:()=>V(k.id,!1),disabled:L.has(k.id),children:[e.jsx(pt,{className:"h-4 w-4 mr-1"}),"通过"]}),e.jsxs(_,{size:"sm",variant:"outline",className:"text-red-600 hover:text-red-700 hover:bg-red-50",onClick:()=>V(k.id,!0),disabled:L.has(k.id),children:[e.jsx(Ga,{className:"h-4 w-4 mr-1"}),"拒绝"]})]})})})]})},k.id))]})}),e.jsxs("div",{className:"px-6 py-3 border-t shrink-0 flex items-center justify-between",children:[e.jsxs("div",{className:"text-sm text-muted-foreground",children:["共 ",N," 条,第 ",y,"/",O||1," 页"]}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsxs(_,{variant:"outline",size:"sm",onClick:()=>w(k=>Math.max(1,k-1)),disabled:y<=1||h,children:[e.jsx(za,{className:"h-4 w-4"}),"上一页"]}),e.jsxs(_,{variant:"outline",size:"sm",onClick:()=>w(k=>Math.min(O,k+1)),disabled:y>=O||h,children:["下一页",e.jsx(Zt,{className:"h-4 w-4"})]})]})]})]})})}function k1(){return e.jsx(Yn,{children:e.jsx(T1,{})})}const C1=l=>{const n=[];for(let i=0;i{try{const O=await Wm();M(O.unchecked)}catch(O){console.error("获取审核统计失败:",O)}},[]),L=d.useCallback(async()=>{try{w(!0);const O=await A0.get("https://v1.hitokoto.cn/?c=a&c=b&c=c&c=d&c=h&c=i&c=k");v({hitokoto:O.data.hitokoto,from:O.data.from||O.data.from_who||"未知"})}catch(O){console.error("获取一言失败:",O),v({hitokoto:"人生就像一盒巧克力,你永远不知道下一颗是什么味道。",from:"阿甘正传"})}finally{w(!1)}},[]),J=d.useCallback(async()=>{try{const O=await we("/api/webui/system/status");if(O.ok){const k=await O.json();R(k)}else R(null)}catch(O){console.error("获取机器人状态失败:",O),R(null)}},[]),U=async()=>{await T()},ue=d.useCallback(async()=>{try{const O=await we(`/api/webui/statistics/dashboard?hours=${h}`);if(O.ok){const k=await O.json();n(k)}c(!1),x(100)}catch(O){console.error("Failed to fetch dashboard data:",O),c(!1),x(100)}},[h]);if(d.useEffect(()=>{if(!i)return;x(0);const O=setTimeout(()=>x(15),200),k=setTimeout(()=>x(30),800),H=setTimeout(()=>x(45),2e3),se=setTimeout(()=>x(60),4e3),Ee=setTimeout(()=>x(75),6500),Z=setTimeout(()=>x(85),9e3),Oe=setTimeout(()=>x(92),11e3);return()=>{clearTimeout(O),clearTimeout(k),clearTimeout(H),clearTimeout(se),clearTimeout(Ee),clearTimeout(Z),clearTimeout(Oe)}},[i]),d.useEffect(()=>{ue(),L(),J(),F()},[ue,L,J,F]),d.useEffect(()=>{if(!p)return;const O=setInterval(()=>{ue(),J()},3e4);return()=>clearInterval(O)},[p,ue,J]),i||!l)return e.jsx("div",{className:"flex items-center justify-center h-[calc(100vh-200px)]",children:e.jsxs("div",{className:"text-center space-y-6 w-full max-w-md px-4",children:[e.jsx(dt,{className:"h-12 w-12 animate-spin mx-auto text-primary"}),e.jsxs("div",{className:"space-y-2",children:[e.jsx("p",{className:"text-lg font-medium",children:"加载统计数据中..."}),e.jsx("p",{className:"text-sm text-muted-foreground",children:"正在获取麦麦运行数据"})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsx(Kn,{value:u,className:"h-2"}),e.jsxs("p",{className:"text-xs text-muted-foreground",children:[u,"%"]})]})]})});const{summary:xe,model_stats:he=[],hourly_data:ne=[],daily_data:ve=[],recent_activity:je=[]}=l,z=xe??{total_requests:0,total_cost:0,total_tokens:0,online_time:0,total_messages:0,total_replies:0,avg_response_time:0,cost_per_hour:0,tokens_per_hour:0},V=O=>{const k=Math.floor(O/3600),H=Math.floor(O%3600/60);return`${k}小时${H}分钟`},B=O=>{const k=O.toLocaleString("zh-CN");return O>=1e9?{display:`${(O/1e9).toFixed(2)}B`,exact:k,needsExact:!0}:O>=1e6?{display:`${(O/1e6).toFixed(2)}M`,exact:k,needsExact:!0}:O>=1e4?{display:`${(O/1e3).toFixed(1)}K`,exact:k,needsExact:!0}:O>=1e3?{display:`${(O/1e3).toFixed(2)}K`,exact:k,needsExact:!0}:{display:k,exact:k,needsExact:!1}},oe=O=>{const k=`¥${O.toLocaleString("zh-CN",{minimumFractionDigits:2,maximumFractionDigits:2})}`;return O>=1e6?{display:`¥${(O/1e6).toFixed(2)}M`,exact:k,needsExact:!0}:O>=1e4?{display:`¥${(O/1e3).toFixed(1)}K`,exact:k,needsExact:!0}:O>=1e3?{display:`¥${(O/1e3).toFixed(2)}K`,exact:k,needsExact:!0}:{display:k,exact:k,needsExact:!1}},K=O=>new Date(O).toLocaleString("zh-CN",{month:"2-digit",day:"2-digit",hour:"2-digit",minute:"2-digit"}),_e=C1(he.length),pe=he.map((O,k)=>({name:O.model_name,value:O.request_count,fill:_e[k]})),ke={requests:{label:"请求数",color:"hsl(var(--chart-1))"},cost:{label:"花费(¥)",color:"hsl(var(--chart-2))"},tokens:{label:"Tokens",color:"hsl(var(--chart-3))"}};return e.jsx(Ye,{className:"h-full",children:e.jsxs("div",{className:"space-y-4 sm:space-y-6 p-4 sm:p-6",children:[e.jsxs("div",{className:"flex flex-col sm:flex-row sm:items-center justify-between gap-4",children:[e.jsxs("div",{children:[e.jsx("h1",{className:"text-2xl sm:text-3xl font-bold",children:"实时监控面板"}),e.jsx("p",{className:"text-sm text-muted-foreground mt-1",children:"麦麦运行状态和统计数据一览"})]}),e.jsxs("div",{className:"flex flex-wrap items-center gap-2",children:[e.jsx(ta,{value:h.toString(),onValueChange:O=>f(Number(O)),children:e.jsxs(Xt,{className:"grid grid-cols-3 w-full sm:w-auto",children:[e.jsx(Je,{value:"24",children:"24小时"}),e.jsx(Je,{value:"168",children:"7天"}),e.jsx(Je,{value:"720",children:"30天"})]})}),e.jsxs(_,{variant:p?"default":"outline",size:"sm",onClick:()=>g(!p),className:"gap-2",children:[e.jsx(dt,{className:`h-4 w-4 ${p?"animate-spin":""}`}),e.jsx("span",{className:"hidden sm:inline",children:"自动刷新"})]}),e.jsx(_,{variant:"outline",size:"sm",onClick:ue,children:e.jsx(dt,{className:"h-4 w-4"})})]})]}),e.jsxs("div",{className:"flex items-center gap-3 px-4 py-2 rounded-lg border border-dashed border-muted-foreground/30 bg-muted/20",children:[y?e.jsx(js,{className:"h-5 flex-1"}):N?e.jsxs("p",{className:"flex-1 text-sm text-muted-foreground italic truncate",children:['"',N.hitokoto,'" —— ',N.from]}):null,e.jsx(_,{variant:"ghost",size:"icon",className:"h-7 w-7 shrink-0",onClick:L,disabled:y,children:e.jsx(dt,{className:`h-3.5 w-3.5 ${y?"animate-spin":""}`})})]}),e.jsxs("div",{className:"grid gap-4 grid-cols-1 lg:grid-cols-3",children:[e.jsxs(Ce,{className:"lg:col-span-1",children:[e.jsx(De,{className:"pb-3",children:e.jsxs(Le,{className:"text-sm font-medium flex items-center gap-2",children:[e.jsx(cc,{className:"h-4 w-4"}),"麦麦状态"]})}),e.jsx(Ae,{children:e.jsxs("div",{className:"flex items-center gap-4",children:[e.jsx("div",{className:"flex items-center gap-2",children:b?.running?e.jsxs(e.Fragment,{children:[e.jsx("div",{className:"h-3 w-3 rounded-full bg-green-500 animate-pulse"}),e.jsxs(Se,{variant:"outline",className:"text-green-600 border-green-300 bg-green-50",children:[e.jsx(pt,{className:"h-3 w-3 mr-1"}),"运行中"]})]}):e.jsxs(e.Fragment,{children:[e.jsx("div",{className:"h-3 w-3 rounded-full bg-red-500"}),e.jsxs(Se,{variant:"outline",className:"text-red-600 border-red-300 bg-red-50",children:[e.jsx(wt,{className:"h-3 w-3 mr-1"}),"已停止"]})]})}),b&&e.jsxs("div",{className:"text-xs text-muted-foreground",children:[e.jsxs("span",{children:["v",b.version]}),e.jsx("span",{className:"mx-2",children:"|"}),e.jsxs("span",{children:["运行 ",V(b.uptime)]})]})]})})]}),e.jsxs(Ce,{children:[e.jsx(De,{className:"pb-3",children:e.jsxs(Le,{className:"text-sm font-medium flex items-center gap-2",children:[e.jsx(Za,{className:"h-4 w-4"}),"快速操作"]})}),e.jsx(Ae,{children:e.jsxs("div",{className:"flex flex-wrap gap-2",children:[e.jsxs(_,{variant:"outline",size:"sm",onClick:U,disabled:A,className:"gap-2",children:[e.jsx(Zi,{className:`h-4 w-4 ${A?"animate-spin":""}`}),A?"重启中...":"重启麦麦"]}),e.jsxs(_,{variant:"outline",size:"sm",onClick:()=>S(!0),className:"gap-2",children:[e.jsx(Aj,{className:"h-4 w-4"}),"表达审核",P>0&&e.jsx("span",{className:"ml-1 px-1.5 py-0.5 text-xs rounded-full bg-orange-500 text-white",children:P>99?"99+":P})]}),e.jsx(_,{variant:"outline",size:"sm",asChild:!0,className:"gap-2",children:e.jsxs(Bn,{to:"/logs",children:[e.jsx(ka,{className:"h-4 w-4"}),"查看日志"]})}),e.jsx(_,{variant:"outline",size:"sm",asChild:!0,className:"gap-2",children:e.jsxs(Bn,{to:"/plugins",children:[e.jsx(Gw,{className:"h-4 w-4"}),"插件管理"]})}),e.jsx(_,{variant:"outline",size:"sm",asChild:!0,className:"gap-2",children:e.jsxs(Bn,{to:"/settings",children:[e.jsx(pn,{className:"h-4 w-4"}),"系统设置"]})})]})})]}),e.jsxs(Ce,{children:[e.jsxs(De,{className:"pb-3",children:[e.jsxs(Le,{className:"text-sm font-medium flex items-center gap-2",children:[e.jsx(Vw,{className:"h-4 w-4"}),"反馈问卷"]}),e.jsx(ws,{className:"text-xs",children:"帮助我们改进产品体验"})]}),e.jsx(Ae,{children:e.jsxs("div",{className:"flex flex-wrap gap-2",children:[e.jsx(_,{variant:"outline",size:"sm",asChild:!0,className:"gap-2",children:e.jsxs(Bn,{to:"/survey/webui-feedback",children:[e.jsx(ka,{className:"h-4 w-4"}),"WebUI 反馈"]})}),e.jsx(_,{variant:"outline",size:"sm",asChild:!0,className:"gap-2",children:e.jsxs(Bn,{to:"/survey/maibot-feedback",children:[e.jsx(Ea,{className:"h-4 w-4"}),"麦麦反馈"]})})]})})]})]}),e.jsxs("div",{className:"grid gap-4 grid-cols-1 xs:grid-cols-2 lg:grid-cols-4",children:[e.jsxs(Ce,{children:[e.jsxs(De,{className:"flex flex-row items-center justify-between space-y-0 pb-2",children:[e.jsx(Le,{className:"text-sm font-medium",children:"总请求数"}),e.jsx(Gm,{className:"h-4 w-4 text-muted-foreground"})]}),e.jsxs(Ae,{children:[e.jsxs("div",{className:"text-2xl font-bold",children:[B(z.total_requests).display,B(z.total_requests).needsExact&&e.jsxs("span",{className:"text-xs font-normal text-muted-foreground ml-1",children:["(",B(z.total_requests).exact,")"]})]}),e.jsxs("p",{className:"text-xs text-muted-foreground mt-1",children:["最近",h<48?h+"小时":Math.floor(h/24)+"天"]})]})]}),e.jsxs(Ce,{children:[e.jsxs(De,{className:"flex flex-row items-center justify-between space-y-0 pb-2",children:[e.jsx(Le,{className:"text-sm font-medium",children:"总花费"}),e.jsx(qw,{className:"h-4 w-4 text-muted-foreground"})]}),e.jsxs(Ae,{children:[e.jsxs("div",{className:"text-2xl font-bold",children:[oe(z.total_cost).display,oe(z.total_cost).needsExact&&e.jsxs("span",{className:"text-xs font-normal text-muted-foreground ml-1",children:["(",oe(z.total_cost).exact,")"]})]}),e.jsx("p",{className:"text-xs text-muted-foreground mt-1",children:z.cost_per_hour>0?`¥${z.cost_per_hour.toFixed(2)}/小时`:"暂无数据"})]})]}),e.jsxs(Ce,{children:[e.jsxs(De,{className:"flex flex-row items-center justify-between space-y-0 pb-2",children:[e.jsx(Le,{className:"text-sm font-medium",children:"Token消耗"}),e.jsx(Hr,{className:"h-4 w-4 text-muted-foreground"})]}),e.jsxs(Ae,{children:[e.jsxs("div",{className:"text-2xl font-bold",children:[B(z.total_tokens).display,B(z.total_tokens).needsExact&&e.jsxs("span",{className:"text-xs font-normal text-muted-foreground ml-1",children:["(",B(z.total_tokens).exact,")"]})]}),e.jsx("p",{className:"text-xs text-muted-foreground mt-1",children:z.tokens_per_hour>0?`${B(z.tokens_per_hour).display}/小时`:"暂无数据"})]})]}),e.jsxs(Ce,{children:[e.jsxs(De,{className:"flex flex-row items-center justify-between space-y-0 pb-2",children:[e.jsx(Le,{className:"text-sm font-medium",children:"平均响应"}),e.jsx(Za,{className:"h-4 w-4 text-muted-foreground"})]}),e.jsxs(Ae,{children:[e.jsxs("div",{className:"text-2xl font-bold",children:[z.avg_response_time.toFixed(2),"s"]}),e.jsx("p",{className:"text-xs text-muted-foreground mt-1",children:"API平均耗时"})]})]})]}),e.jsxs("div",{className:"grid gap-4 grid-cols-1 sm:grid-cols-3",children:[e.jsxs(Ce,{children:[e.jsxs(De,{className:"flex flex-row items-center justify-between space-y-0 pb-2",children:[e.jsx(Le,{className:"text-sm font-medium",children:"在线时长"}),e.jsx(na,{className:"h-4 w-4 text-muted-foreground"})]}),e.jsx(Ae,{children:e.jsxs("div",{className:"text-xl font-bold",children:[V(z.online_time),e.jsxs("span",{className:"text-xs font-normal text-muted-foreground ml-1",children:["(",z.online_time.toLocaleString(),"秒)"]})]})})]}),e.jsxs(Ce,{children:[e.jsxs(De,{className:"flex flex-row items-center justify-between space-y-0 pb-2",children:[e.jsx(Le,{className:"text-sm font-medium",children:"消息处理"}),e.jsx(Ea,{className:"h-4 w-4 text-muted-foreground"})]}),e.jsxs(Ae,{children:[e.jsxs("div",{className:"text-xl font-bold",children:[B(z.total_messages).display,B(z.total_messages).needsExact&&e.jsxs("span",{className:"text-xs font-normal text-muted-foreground ml-1",children:["(",B(z.total_messages).exact,")"]})]}),e.jsxs("p",{className:"text-xs text-muted-foreground mt-1",children:["回复 ",B(z.total_replies).display,B(z.total_replies).needsExact&&e.jsxs("span",{children:["(",B(z.total_replies).exact,")"]})," 条"]})]})]}),e.jsxs(Ce,{children:[e.jsxs(De,{className:"flex flex-row items-center justify-between space-y-0 pb-2",children:[e.jsx(Le,{className:"text-sm font-medium",children:"成本效率"}),e.jsx(Vm,{className:"h-4 w-4 text-muted-foreground"})]}),e.jsxs(Ae,{children:[e.jsx("div",{className:"text-xl font-bold",children:z.total_messages>0?`¥${(z.total_cost/z.total_messages*100).toFixed(2)}`:"¥0.00"}),e.jsx("p",{className:"text-xs text-muted-foreground mt-1",children:"每100条消息"})]})]})]}),e.jsxs(ta,{defaultValue:"trends",className:"space-y-4",children:[e.jsxs(Xt,{className:"grid w-full grid-cols-2 sm:grid-cols-4",children:[e.jsx(Je,{value:"trends",children:"趋势"}),e.jsx(Je,{value:"models",children:"模型"}),e.jsx(Je,{value:"activity",children:"活动"}),e.jsx(Je,{value:"daily",children:"日统计"})]}),e.jsxs(ys,{value:"trends",className:"space-y-4",children:[e.jsxs(Ce,{children:[e.jsxs(De,{children:[e.jsx(Le,{children:"请求趋势"}),e.jsxs(ws,{children:["最近",h,"小时的请求量变化"]})]}),e.jsx(Ae,{children:e.jsx($r,{config:ke,className:"h-[300px] sm:h-[400px] w-full aspect-auto",children:e.jsxs(pw,{data:ne,children:[e.jsx(Hi,{strokeDasharray:"3 3",stroke:"hsl(var(--muted-foreground) / 0.2)"}),e.jsx(Fi,{dataKey:"timestamp",tickFormatter:O=>K(O),angle:-45,textAnchor:"end",height:60,stroke:"hsl(var(--muted-foreground))",tick:{fill:"hsl(var(--muted-foreground))"}}),e.jsx(Ur,{stroke:"hsl(var(--muted-foreground))",tick:{fill:"hsl(var(--muted-foreground))"}}),e.jsx(Ii,{content:e.jsx(Br,{labelFormatter:O=>K(O)})}),e.jsx(gw,{type:"monotone",dataKey:"requests",stroke:"var(--color-requests)",strokeWidth:2})]})})})]}),e.jsxs("div",{className:"grid gap-4 grid-cols-1 lg:grid-cols-2",children:[e.jsxs(Ce,{children:[e.jsxs(De,{children:[e.jsx(Le,{children:"花费趋势"}),e.jsx(ws,{children:"API调用成本变化"})]}),e.jsx(Ae,{children:e.jsx($r,{config:ke,className:"h-[250px] sm:h-[300px] w-full aspect-auto",children:e.jsxs(Eo,{data:ne,children:[e.jsx(Hi,{strokeDasharray:"3 3",stroke:"hsl(var(--muted-foreground) / 0.2)"}),e.jsx(Fi,{dataKey:"timestamp",tickFormatter:O=>K(O),angle:-45,textAnchor:"end",height:60,stroke:"hsl(var(--muted-foreground))",tick:{fill:"hsl(var(--muted-foreground))"}}),e.jsx(Ur,{stroke:"hsl(var(--muted-foreground))",tick:{fill:"hsl(var(--muted-foreground))"}}),e.jsx(Ii,{content:e.jsx(Br,{labelFormatter:O=>K(O)})}),e.jsx(Gi,{dataKey:"cost",fill:"var(--color-cost)"})]})})})]}),e.jsxs(Ce,{children:[e.jsxs(De,{children:[e.jsx(Le,{children:"Token消耗"}),e.jsx(ws,{children:"Token使用量变化"})]}),e.jsx(Ae,{children:e.jsx($r,{config:ke,className:"h-[250px] sm:h-[300px] w-full aspect-auto",children:e.jsxs(Eo,{data:ne,children:[e.jsx(Hi,{strokeDasharray:"3 3",stroke:"hsl(var(--muted-foreground) / 0.2)"}),e.jsx(Fi,{dataKey:"timestamp",tickFormatter:O=>K(O),angle:-45,textAnchor:"end",height:60,stroke:"hsl(var(--muted-foreground))",tick:{fill:"hsl(var(--muted-foreground))"}}),e.jsx(Ur,{stroke:"hsl(var(--muted-foreground))",tick:{fill:"hsl(var(--muted-foreground))"}}),e.jsx(Ii,{content:e.jsx(Br,{labelFormatter:O=>K(O)})}),e.jsx(Gi,{dataKey:"tokens",fill:"var(--color-tokens)"})]})})})]})]})]}),e.jsx(ys,{value:"models",className:"space-y-4",children:e.jsxs("div",{className:"grid gap-4 grid-cols-1 lg:grid-cols-2",children:[e.jsxs(Ce,{children:[e.jsxs(De,{children:[e.jsx(Le,{children:"模型请求分布"}),e.jsxs(ws,{children:["各模型使用占比 (共 ",he.length," 个模型)"]})]}),e.jsx(Ae,{children:e.jsx($r,{config:Object.fromEntries(he.map((O,k)=>[O.model_name,{label:O.model_name,color:_e[k]}])),className:"h-[300px] sm:h-[400px] w-full aspect-auto",children:e.jsxs(jw,{children:[e.jsx(Ii,{content:e.jsx(Br,{})}),e.jsx(vw,{data:pe,cx:"50%",cy:"50%",labelLine:!1,label:({name:O,percent:k})=>k&&k<.05?"":`${O} ${k?(k*100).toFixed(0):0}%`,outerRadius:100,dataKey:"value",children:pe.map((O,k)=>e.jsx(Nw,{fill:O.fill},`cell-${k}`))})]})})})]}),e.jsxs(Ce,{children:[e.jsxs(De,{children:[e.jsx(Le,{children:"模型详细统计"}),e.jsx(ws,{children:"请求数、花费和性能"})]}),e.jsx(Ae,{children:e.jsx(Ye,{className:"h-[300px] sm:h-[400px]",children:e.jsx("div",{className:"space-y-3",children:he.map((O,k)=>e.jsxs("div",{className:"p-4 rounded-lg border bg-card hover:bg-accent/50 transition-colors",children:[e.jsxs("div",{className:"flex items-center justify-between mb-2",children:[e.jsx("h4",{className:"font-semibold text-sm truncate flex-1 min-w-0",children:O.model_name}),e.jsx("div",{className:"w-3 h-3 rounded-full ml-2 flex-shrink-0",style:{backgroundColor:`hsl(var(--chart-${k%5+1}))`}})]}),e.jsxs("div",{className:"grid grid-cols-2 gap-2 text-xs",children:[e.jsxs("div",{children:[e.jsx("span",{className:"text-muted-foreground",children:"请求数:"}),e.jsx("span",{className:"ml-1 font-medium",children:O.request_count.toLocaleString()})]}),e.jsxs("div",{children:[e.jsx("span",{className:"text-muted-foreground",children:"花费:"}),e.jsxs("span",{className:"ml-1 font-medium",children:["¥",O.total_cost.toFixed(2)]})]}),e.jsxs("div",{children:[e.jsx("span",{className:"text-muted-foreground",children:"Tokens:"}),e.jsxs("span",{className:"ml-1 font-medium",children:[(O.total_tokens/1e3).toFixed(1),"K"]})]}),e.jsxs("div",{children:[e.jsx("span",{className:"text-muted-foreground",children:"平均耗时:"}),e.jsxs("span",{className:"ml-1 font-medium",children:[O.avg_response_time.toFixed(2),"s"]})]})]})]},k))})})})]})]})}),e.jsx(ys,{value:"activity",children:e.jsxs(Ce,{children:[e.jsxs(De,{children:[e.jsx(Le,{children:"最近活动"}),e.jsx(ws,{children:"最新的API调用记录"})]}),e.jsx(Ae,{children:e.jsx(Ye,{className:"h-[400px] sm:h-[500px]",children:e.jsx("div",{className:"space-y-2",children:je.map((O,k)=>e.jsxs("div",{className:"p-3 sm:p-4 rounded-lg border bg-card hover:bg-accent/50 transition-colors",children:[e.jsxs("div",{className:"flex flex-col sm:flex-row sm:items-center justify-between gap-2 mb-2",children:[e.jsxs("div",{className:"flex-1 min-w-0",children:[e.jsx("div",{className:"font-medium text-sm truncate",children:O.model}),e.jsx("div",{className:"text-xs text-muted-foreground",children:O.request_type})]}),e.jsx("div",{className:"text-xs text-muted-foreground flex-shrink-0",children:K(O.timestamp)})]}),e.jsxs("div",{className:"grid grid-cols-2 sm:grid-cols-4 gap-2 text-xs",children:[e.jsxs("div",{children:[e.jsx("span",{className:"text-muted-foreground",children:"Tokens:"}),e.jsx("span",{className:"ml-1",children:O.tokens})]}),e.jsxs("div",{children:[e.jsx("span",{className:"text-muted-foreground",children:"花费:"}),e.jsxs("span",{className:"ml-1",children:["¥",O.cost.toFixed(4)]})]}),e.jsxs("div",{children:[e.jsx("span",{className:"text-muted-foreground",children:"耗时:"}),e.jsxs("span",{className:"ml-1",children:[O.time_cost.toFixed(2),"s"]})]}),e.jsxs("div",{children:[e.jsx("span",{className:"text-muted-foreground",children:"状态:"}),e.jsx("span",{className:`ml-1 ${O.status==="success"?"text-green-600":"text-red-600"}`,children:O.status})]})]})]},k))})})})]})}),e.jsx(ys,{value:"daily",children:e.jsxs(Ce,{children:[e.jsxs(De,{children:[e.jsx(Le,{children:"每日统计"}),e.jsx(ws,{children:"最近7天的数据汇总"})]}),e.jsx(Ae,{children:e.jsx($r,{config:{requests:{label:"请求数",color:"hsl(var(--chart-1))"},cost:{label:"花费(¥)",color:"hsl(var(--chart-2))"}},className:"h-[400px] sm:h-[500px] w-full aspect-auto",children:e.jsxs(Eo,{data:ve,children:[e.jsx(Hi,{strokeDasharray:"3 3",stroke:"hsl(var(--muted-foreground) / 0.2)"}),e.jsx(Fi,{dataKey:"timestamp",tickFormatter:O=>{const k=new Date(O);return`${k.getMonth()+1}/${k.getDate()}`},stroke:"hsl(var(--muted-foreground))",tick:{fill:"hsl(var(--muted-foreground))"}}),e.jsx(Ur,{yAxisId:"left",stroke:"hsl(var(--muted-foreground))",tick:{fill:"hsl(var(--muted-foreground))"}}),e.jsx(Ur,{yAxisId:"right",orientation:"right",stroke:"hsl(var(--muted-foreground))",tick:{fill:"hsl(var(--muted-foreground))"}}),e.jsx(Ii,{content:e.jsx(Br,{labelFormatter:O=>new Date(O).toLocaleDateString("zh-CN")})}),e.jsx(n1,{content:e.jsx(lv,{})}),e.jsx(Gi,{yAxisId:"left",dataKey:"requests",fill:"var(--color-requests)"}),e.jsx(Gi,{yAxisId:"right",dataKey:"cost",fill:"var(--color-cost)"})]})})})]})})]}),e.jsx(Jn,{}),e.jsx(cv,{open:D,onOpenChange:O=>{S(O),O||F()}})]})})}const E1={theme:"system",setTheme:()=>null},ov=d.createContext(E1),ex=()=>{const l=d.useContext(ov);if(l===void 0)throw new Error("useTheme must be used within a ThemeProvider");return l},M1=(l,n,i)=>{const c=document.documentElement.classList.contains("no-animations");if(!document.startViewTransition||c){n(l);return}const u=i.clientX,x=i.clientY,h=Math.hypot(Math.max(u,innerWidth-u),Math.max(x,innerHeight-x));document.startViewTransition(()=>{n(l)}).ready.then(()=>{document.documentElement.animate({clipPath:[`circle(0px at ${u}px ${x}px)`,`circle(${h}px at ${u}px ${x}px)`]},{duration:500,easing:"ease-in-out",pseudoElement:"::view-transition-new(root)"})})},dv=d.createContext(void 0),uv=()=>{const l=d.useContext(dv);if(l===void 0)throw new Error("useAnimation must be used within an AnimationProvider");return l},Fe=d.forwardRef(({className:l,...n},i)=>e.jsx(qg,{className:I("peer inline-flex h-5 w-9 shrink-0 cursor-pointer items-center rounded-full border-2 border-transparent shadow-sm transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background disabled:cursor-not-allowed disabled:opacity-50 data-[state=checked]:bg-primary data-[state=unchecked]:bg-input",l),...n,ref:i,children:e.jsx($0,{className:I("pointer-events-none block h-4 w-4 rounded-full bg-background shadow-lg ring-0 transition-transform data-[state=checked]:translate-x-4 data-[state=unchecked]:translate-x-0")})}));Fe.displayName=qg.displayName;const z1=Kr("text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70"),E=d.forwardRef(({className:l,...n},i)=>e.jsx(pj,{ref:i,className:I(z1(),l),...n}));E.displayName=pj.displayName;const A1=[{id:"minLength",label:"长度至少 10 位",description:"Token 长度必须大于等于 10 个字符",validate:l=>l.length>=10},{id:"hasUppercase",label:"包含大写字母",description:"至少包含一个大写字母 (A-Z)",validate:l=>/[A-Z]/.test(l)},{id:"hasLowercase",label:"包含小写字母",description:"至少包含一个小写字母 (a-z)",validate:l=>/[a-z]/.test(l)},{id:"hasSpecialChar",label:"包含特殊符号",description:"至少包含一个特殊符号 (!@#$%^&*()_+-=[]{}|;:,.<>?/)",validate:l=>/[!@#$%^&*()_+\-=[\]{}|;:,.<>?/]/.test(l)}];function O1(l){const n=A1.map(c=>({id:c.id,label:c.label,description:c.description,passed:c.validate(l)}));return{isValid:n.every(c=>c.passed),rules:n}}const ed="0.12.1",sx="MaiBot Dashboard",D1=`${sx} v${ed}`,R1=(l="v")=>`${l}${ed}`,pa={THEME:"maibot-ui-theme",ACCENT_COLOR:"accent-color",ENABLE_ANIMATIONS:"maibot-animations",ENABLE_WAVES_BACKGROUND:"maibot-waves-background",LOG_CACHE_SIZE:"maibot-log-cache-size",LOG_AUTO_SCROLL:"maibot-log-auto-scroll",LOG_FONT_SIZE:"maibot-log-font-size",LOG_LINE_SPACING:"maibot-log-line-spacing",DATA_SYNC_INTERVAL:"maibot-data-sync-interval",WS_RECONNECT_INTERVAL:"maibot-ws-reconnect-interval",WS_MAX_RECONNECT_ATTEMPTS:"maibot-ws-max-reconnect-attempts",COMPLETED_TOURS:"maibot-completed-tours"},cl={theme:"system",accentColor:"blue",enableAnimations:!0,enableWavesBackground:!0,logCacheSize:1e3,logAutoScroll:!0,logFontSize:"xs",logLineSpacing:4,dataSyncInterval:30,wsReconnectInterval:3e3,wsMaxReconnectAttempts:10};function bt(l){const n=mv(l),i=localStorage.getItem(n);if(i===null)return cl[l];const c=cl[l];if(typeof c=="boolean")return i==="true";if(typeof c=="number"){const u=parseFloat(i);return isNaN(u)?c:u}return i}function Ir(l,n){const i=mv(l);localStorage.setItem(i,String(n)),window.dispatchEvent(new CustomEvent("maibot-settings-change",{detail:{key:l,value:n}}))}function L1(){return{theme:bt("theme"),accentColor:bt("accentColor"),enableAnimations:bt("enableAnimations"),enableWavesBackground:bt("enableWavesBackground"),logCacheSize:bt("logCacheSize"),logAutoScroll:bt("logAutoScroll"),logFontSize:bt("logFontSize"),logLineSpacing:bt("logLineSpacing"),dataSyncInterval:bt("dataSyncInterval"),wsReconnectInterval:bt("wsReconnectInterval"),wsMaxReconnectAttempts:bt("wsMaxReconnectAttempts")}}function U1(){const l=L1(),n=localStorage.getItem(pa.COMPLETED_TOURS),i=n?JSON.parse(n):[];return{...l,completedTours:i}}function $1(l){const n=[],i=[];for(const[c,u]of Object.entries(l)){if(c==="completedTours"){Array.isArray(u)?(localStorage.setItem(pa.COMPLETED_TOURS,JSON.stringify(u)),n.push("completedTours")):i.push("completedTours");continue}if(c in cl){const x=c,h=cl[x];if(typeof u==typeof h){if(x==="theme"&&!["light","dark","system"].includes(u)){i.push(c);continue}if(x==="logFontSize"&&!["xs","sm","base"].includes(u)){i.push(c);continue}Ir(x,u),n.push(c)}else i.push(c)}else i.push(c)}return{success:n.length>0,imported:n,skipped:i}}function B1(){for(const l of Object.keys(cl))Ir(l,cl[l]);localStorage.removeItem(pa.COMPLETED_TOURS),window.dispatchEvent(new CustomEvent("maibot-settings-reset"))}function I1(){const l=[],n=[],i=[];for(let c=0;cc.size-i.size),{used:l,items:localStorage.length,details:n}}function P1(l){if(l===0)return"0 B";const n=1024,i=["B","KB","MB"],c=Math.floor(Math.log(l)/Math.log(n));return parseFloat((l/Math.pow(n,c)).toFixed(2))+" "+i[c]}function mv(l){return{theme:pa.THEME,accentColor:pa.ACCENT_COLOR,enableAnimations:pa.ENABLE_ANIMATIONS,enableWavesBackground:pa.ENABLE_WAVES_BACKGROUND,logCacheSize:pa.LOG_CACHE_SIZE,logAutoScroll:pa.LOG_AUTO_SCROLL,logFontSize:pa.LOG_FONT_SIZE,logLineSpacing:pa.LOG_LINE_SPACING,dataSyncInterval:pa.DATA_SYNC_INTERVAL,wsReconnectInterval:pa.WS_RECONNECT_INTERVAL,wsMaxReconnectAttempts:pa.WS_MAX_RECONNECT_ATTEMPTS}[l]}const Va=d.forwardRef(({className:l,...n},i)=>e.jsxs(Kg,{ref:i,className:I("relative flex w-full touch-none select-none items-center",l),...n,children:[e.jsx(B0,{className:"relative h-1.5 w-full grow overflow-hidden rounded-full bg-primary/20",children:e.jsx(I0,{className:"absolute h-full bg-primary"})}),e.jsx(P0,{className:"block h-4 w-4 rounded-full border border-primary/50 bg-background shadow transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50"})]}));Va.displayName=Kg.displayName;class H1{ws=null;reconnectTimeout=null;reconnectAttempts=0;heartbeatInterval=null;logCallbacks=new Set;connectionCallbacks=new Set;isConnected=!1;logCache=[];getMaxCacheSize(){return bt("logCacheSize")}getMaxReconnectAttempts(){return bt("wsMaxReconnectAttempts")}getReconnectInterval(){return bt("wsReconnectInterval")}getWebSocketUrl(n){let i;{const c=window.location.protocol==="https:"?"wss:":"ws:",u=window.location.host;i=`${c}//${u}/ws/logs`}return n?`${i}?token=${encodeURIComponent(n)}`:i}async getWsToken(){try{const n=await we("/api/webui/ws-token",{method:"GET",credentials:"include"});if(!n.ok)return console.error("获取 WebSocket token 失败:",n.status),null;const i=await n.json();return i.success&&i.token?i.token:null}catch(n){return console.error("获取 WebSocket token 失败:",n),null}}async connect(){if(this.ws?.readyState===WebSocket.OPEN||this.ws?.readyState===WebSocket.CONNECTING)return;if(window.location.pathname==="/auth"){console.log("📡 在登录页面,跳过 WebSocket 连接");return}if(!await tc()){console.log("📡 未登录,跳过 WebSocket 连接");return}const i=await this.getWsToken();if(!i){console.log("📡 无法获取 WebSocket token,跳过连接");return}const c=this.getWebSocketUrl(i);try{this.ws=new WebSocket(c),this.ws.onopen=()=>{this.isConnected=!0,this.reconnectAttempts=0,this.notifyConnection(!0),this.startHeartbeat()},this.ws.onmessage=u=>{try{if(u.data==="pong")return;const x=JSON.parse(u.data);this.notifyLog(x)}catch(x){console.error("解析日志消息失败:",x)}},this.ws.onerror=u=>{console.error("❌ WebSocket 错误:",u),this.isConnected=!1,this.notifyConnection(!1)},this.ws.onclose=()=>{this.isConnected=!1,this.notifyConnection(!1),this.stopHeartbeat(),this.attemptReconnect()}}catch(u){console.error("创建 WebSocket 连接失败:",u),this.attemptReconnect()}}attemptReconnect(){const n=this.getMaxReconnectAttempts();if(this.reconnectAttempts>=n)return;this.reconnectAttempts+=1;const i=this.getReconnectInterval(),c=Math.min(i*this.reconnectAttempts,3e4);this.reconnectTimeout=window.setTimeout(()=>{this.connect()},c)}startHeartbeat(){this.heartbeatInterval=window.setInterval(()=>{this.ws?.readyState===WebSocket.OPEN&&this.ws.send("ping")},3e4)}stopHeartbeat(){this.heartbeatInterval!==null&&(clearInterval(this.heartbeatInterval),this.heartbeatInterval=null)}disconnect(){this.reconnectTimeout!==null&&(clearTimeout(this.reconnectTimeout),this.reconnectTimeout=null),this.stopHeartbeat(),this.ws&&(this.ws.close(),this.ws=null),this.isConnected=!1,this.reconnectAttempts=0}onLog(n){return this.logCallbacks.add(n),()=>this.logCallbacks.delete(n)}onConnectionChange(n){return this.connectionCallbacks.add(n),n(this.isConnected),()=>this.connectionCallbacks.delete(n)}notifyLog(n){if(!this.logCache.some(c=>c.id===n.id)){this.logCache.push(n);const c=this.getMaxCacheSize();this.logCache.length>c&&(this.logCache=this.logCache.slice(-c)),this.logCallbacks.forEach(u=>{try{u(n)}catch(x){console.error("日志回调执行失败:",x)}})}}notifyConnection(n){this.connectionCallbacks.forEach(i=>{try{i(n)}catch(c){console.error("连接状态回调执行失败:",c)}})}getAllLogs(){return[...this.logCache]}clearLogs(){this.logCache=[]}getConnectionStatus(){return this.isConnected}}const In=new H1;typeof window<"u"&&setTimeout(()=>{In.connect()},100);const vs=F0,yt=G0,F1=H0,xv=d.forwardRef(({className:l,...n},i)=>e.jsx(Qg,{className:I("fixed inset-0 z-50 bg-black/80 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0",l),...n,ref:i}));xv.displayName=Qg.displayName;const ds=d.forwardRef(({className:l,...n},i)=>e.jsxs(F1,{children:[e.jsx(xv,{}),e.jsx(Yg,{ref:i,className:I("fixed left-[50%] top-[50%] z-50 grid w-full max-w-lg translate-x-[-50%] translate-y-[-50%] gap-4 border bg-background p-6 shadow-lg duration-200 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[state=closed]:slide-out-to-left-1/2 data-[state=closed]:slide-out-to-top-[48%] data-[state=open]:slide-in-from-left-1/2 data-[state=open]:slide-in-from-top-[48%] sm:rounded-lg",l),...n})]}));ds.displayName=Yg.displayName;const us=({className:l,...n})=>e.jsx("div",{className:I("flex flex-col space-y-2 text-center sm:text-left",l),...n});us.displayName="AlertDialogHeader";const ms=({className:l,...n})=>e.jsx("div",{className:I("flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2",l),...n});ms.displayName="AlertDialogFooter";const xs=d.forwardRef(({className:l,...n},i)=>e.jsx(Jg,{ref:i,className:I("text-lg font-semibold",l),...n}));xs.displayName=Jg.displayName;const hs=d.forwardRef(({className:l,...n},i)=>e.jsx(Xg,{ref:i,className:I("text-sm text-muted-foreground",l),...n}));hs.displayName=Xg.displayName;const fs=d.forwardRef(({className:l,variant:n,...i},c)=>e.jsx(Zg,{ref:c,className:I(qr({variant:n}),l),...i}));fs.displayName=Zg.displayName;const ps=d.forwardRef(({className:l,...n},i)=>e.jsx(Wg,{ref:i,className:I(qr({variant:"outline"}),"mt-2 sm:mt-0",l),...n}));ps.displayName=Wg.displayName;function G1(){return e.jsxs("div",{className:"space-y-4 sm:space-y-6 p-4 sm:p-6",children:[e.jsx("div",{className:"flex flex-col sm:flex-row sm:items-center justify-between gap-4",children:e.jsxs("div",{children:[e.jsx("h1",{className:"text-2xl sm:text-3xl font-bold",children:"系统设置"}),e.jsx("p",{className:"text-muted-foreground mt-1 sm:mt-2 text-sm sm:text-base",children:"管理您的应用偏好设置"})]})}),e.jsxs(ta,{defaultValue:"appearance",className:"w-full",children:[e.jsxs(Xt,{className:"grid w-full grid-cols-2 sm:grid-cols-4 gap-0.5 sm:gap-1 h-auto p-1",children:[e.jsxs(Je,{value:"appearance",className:"gap-1 sm:gap-2 text-xs sm:text-sm px-2 sm:px-3 py-2",children:[e.jsx(Kw,{className:"h-3.5 w-3.5 sm:h-4 sm:w-4",strokeWidth:2,fill:"none"}),e.jsx("span",{children:"外观"})]}),e.jsxs(Je,{value:"security",className:"gap-1 sm:gap-2 text-xs sm:text-sm px-2 sm:px-3 py-2",children:[e.jsx(Oj,{className:"h-3.5 w-3.5 sm:h-4 sm:w-4",strokeWidth:2,fill:"none"}),e.jsx("span",{children:"安全"})]}),e.jsxs(Je,{value:"other",className:"gap-1 sm:gap-2 text-xs sm:text-sm px-2 sm:px-3 py-2",children:[e.jsx(pn,{className:"h-3.5 w-3.5 sm:h-4 sm:w-4",strokeWidth:2,fill:"none"}),e.jsx("span",{children:"其他"})]}),e.jsxs(Je,{value:"about",className:"gap-1 sm:gap-2 text-xs sm:text-sm px-2 sm:px-3 py-2",children:[e.jsx(Ht,{className:"h-3.5 w-3.5 sm:h-4 sm:w-4",strokeWidth:2,fill:"none"}),e.jsx("span",{children:"关于"})]})]}),e.jsxs(Ye,{className:"h-[calc(100vh-240px)] sm:h-[calc(100vh-280px)] mt-4 sm:mt-6",children:[e.jsx(ys,{value:"appearance",className:"mt-0",children:e.jsx(V1,{})}),e.jsx(ys,{value:"security",className:"mt-0",children:e.jsx(q1,{})}),e.jsx(ys,{value:"other",className:"mt-0",children:e.jsx(K1,{})}),e.jsx(ys,{value:"about",className:"mt-0",children:e.jsx(Q1,{})})]})]})]})}function jg(l){const n=document.documentElement,c={blue:{hsl:"221.2 83.2% 53.3%",darkHsl:"217.2 91.2% 59.8%",gradient:null},purple:{hsl:"271 91% 65%",darkHsl:"270 95% 75%",gradient:null},green:{hsl:"142 71% 45%",darkHsl:"142 76% 36%",gradient:null},orange:{hsl:"25 95% 53%",darkHsl:"20 90% 48%",gradient:null},pink:{hsl:"330 81% 60%",darkHsl:"330 85% 70%",gradient:null},red:{hsl:"0 84% 60%",darkHsl:"0 90% 70%",gradient:null},"gradient-sunset":{hsl:"15 95% 60%",darkHsl:"15 95% 65%",gradient:"linear-gradient(135deg, hsl(25 95% 53%) 0%, hsl(330 81% 60%) 100%)"},"gradient-ocean":{hsl:"200 90% 55%",darkHsl:"200 90% 60%",gradient:"linear-gradient(135deg, hsl(221.2 83.2% 53.3%) 0%, hsl(189 94% 43%) 100%)"},"gradient-forest":{hsl:"150 70% 45%",darkHsl:"150 75% 40%",gradient:"linear-gradient(135deg, hsl(142 71% 45%) 0%, hsl(158 64% 52%) 100%)"},"gradient-aurora":{hsl:"310 85% 65%",darkHsl:"310 90% 70%",gradient:"linear-gradient(135deg, hsl(271 91% 65%) 0%, hsl(330 81% 60%) 100%)"},"gradient-fire":{hsl:"15 95% 55%",darkHsl:"15 95% 60%",gradient:"linear-gradient(135deg, hsl(0 84% 60%) 0%, hsl(25 95% 53%) 100%)"},"gradient-twilight":{hsl:"250 90% 60%",darkHsl:"250 95% 65%",gradient:"linear-gradient(135deg, hsl(239 84% 67%) 0%, hsl(271 91% 65%) 100%)"}}[l];if(c)n.style.setProperty("--primary",c.hsl),c.gradient?(n.style.setProperty("--primary-gradient",c.gradient),n.classList.add("has-gradient")):(n.style.removeProperty("--primary-gradient"),n.classList.remove("has-gradient"));else if(l.startsWith("#")){const u=x=>{x=x.replace("#","");const h=parseInt(x.substring(0,2),16)/255,f=parseInt(x.substring(2,4),16)/255,p=parseInt(x.substring(4,6),16)/255,g=Math.max(h,f,p),N=Math.min(h,f,p);let v=0,y=0;const w=(g+N)/2;if(g!==N){const b=g-N;switch(y=w>.5?b/(2-g-N):b/(g+N),g){case h:v=((f-p)/b+(flocalStorage.getItem("accent-color")||"blue");d.useEffect(()=>{const g=localStorage.getItem("accent-color")||"blue";jg(g)},[]);const p=g=>{f(g),localStorage.setItem("accent-color",g),jg(g)};return e.jsxs("div",{className:"space-y-6 sm:space-y-8",children:[e.jsxs("div",{children:[e.jsx("h3",{className:"text-base sm:text-lg font-semibold mb-3 sm:mb-4",children:"主题模式"}),e.jsxs("div",{className:"grid grid-cols-1 sm:grid-cols-3 gap-3 sm:gap-4",children:[e.jsx(Cm,{value:"light",current:l,onChange:n,label:"浅色",description:"始终使用浅色主题"}),e.jsx(Cm,{value:"dark",current:l,onChange:n,label:"深色",description:"始终使用深色主题"}),e.jsx(Cm,{value:"system",current:l,onChange:n,label:"跟随系统",description:"根据系统设置自动切换"})]})]}),e.jsxs("div",{children:[e.jsx("h3",{className:"text-base sm:text-lg font-semibold mb-3 sm:mb-4",children:"主题色"}),e.jsxs("div",{className:"space-y-3 sm:space-y-4",children:[e.jsxs("div",{children:[e.jsx("h4",{className:"text-xs sm:text-sm font-medium mb-2 sm:mb-3",children:"单色"}),e.jsxs("div",{className:"grid grid-cols-3 sm:grid-cols-6 gap-2 sm:gap-3",children:[e.jsx(Fa,{value:"blue",current:h,onChange:p,label:"蓝色",colorClass:"bg-blue-500"}),e.jsx(Fa,{value:"purple",current:h,onChange:p,label:"紫色",colorClass:"bg-purple-500"}),e.jsx(Fa,{value:"green",current:h,onChange:p,label:"绿色",colorClass:"bg-green-500"}),e.jsx(Fa,{value:"orange",current:h,onChange:p,label:"橙色",colorClass:"bg-orange-500"}),e.jsx(Fa,{value:"pink",current:h,onChange:p,label:"粉色",colorClass:"bg-pink-500"}),e.jsx(Fa,{value:"red",current:h,onChange:p,label:"红色",colorClass:"bg-red-500"})]})]}),e.jsxs("div",{children:[e.jsx("h4",{className:"text-xs sm:text-sm font-medium mb-2 sm:mb-3",children:"渐变色"}),e.jsxs("div",{className:"grid grid-cols-3 sm:grid-cols-6 gap-2 sm:gap-3",children:[e.jsx(Fa,{value:"gradient-sunset",current:h,onChange:p,label:"日落",colorClass:"bg-gradient-to-r from-orange-500 to-pink-500"}),e.jsx(Fa,{value:"gradient-ocean",current:h,onChange:p,label:"海洋",colorClass:"bg-gradient-to-r from-blue-500 to-cyan-500"}),e.jsx(Fa,{value:"gradient-forest",current:h,onChange:p,label:"森林",colorClass:"bg-gradient-to-r from-green-500 to-emerald-500"}),e.jsx(Fa,{value:"gradient-aurora",current:h,onChange:p,label:"极光",colorClass:"bg-gradient-to-r from-purple-500 to-pink-500"}),e.jsx(Fa,{value:"gradient-fire",current:h,onChange:p,label:"烈焰",colorClass:"bg-gradient-to-r from-red-500 to-orange-500"}),e.jsx(Fa,{value:"gradient-twilight",current:h,onChange:p,label:"暮光",colorClass:"bg-gradient-to-r from-indigo-500 to-purple-500"})]})]}),e.jsxs("div",{children:[e.jsx("h4",{className:"text-xs sm:text-sm font-medium mb-2 sm:mb-3",children:"自定义颜色"}),e.jsxs("div",{className:"flex flex-col sm:flex-row gap-3 sm:gap-4",children:[e.jsx("div",{className:"flex-1",children:e.jsx("input",{type:"color",value:h.startsWith("#")?h:"#3b82f6",onChange:g=>p(g.target.value),className:"h-10 sm:h-12 w-full rounded-lg border-2 border-border cursor-pointer",title:"选择自定义颜色"})}),e.jsx("div",{className:"flex-1",children:e.jsx(le,{type:"text",value:h,onChange:g=>p(g.target.value),placeholder:"#3b82f6",className:"font-mono text-sm"})})]}),e.jsx("p",{className:"text-[10px] sm:text-xs text-muted-foreground mt-2",children:"点击色块选择颜色,或手动输入 HEX 颜色代码"})]})]})]}),e.jsxs("div",{children:[e.jsx("h3",{className:"text-base sm:text-lg font-semibold mb-3 sm:mb-4",children:"动画效果"}),e.jsxs("div",{className:"space-y-2 sm:space-y-3",children:[e.jsx("div",{className:"rounded-lg border bg-card p-3 sm:p-4",children:e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsxs("div",{className:"space-y-0.5 flex-1",children:[e.jsx(E,{htmlFor:"animations",className:"text-base font-medium cursor-pointer",children:"启用动画效果"}),e.jsx("p",{className:"text-sm text-muted-foreground",children:"关闭后将禁用所有过渡动画和特效,提升性能"})]}),e.jsx(Fe,{id:"animations",checked:i,onCheckedChange:c})]})}),e.jsx("div",{className:"rounded-lg border bg-card p-4",children:e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsxs("div",{className:"space-y-0.5 flex-1",children:[e.jsx(E,{htmlFor:"waves-background",className:"text-base font-medium cursor-pointer",children:"登录页波浪背景"}),e.jsx("p",{className:"text-sm text-muted-foreground",children:"关闭后登录页将使用纯色背景,适合低性能设备"})]}),e.jsx(Fe,{id:"waves-background",checked:u,onCheckedChange:x})]})})]})]})]})}function q1(){const l=ca(),[n,i]=d.useState(""),[c,u]=d.useState(""),[x,h]=d.useState(!1),[f,p]=d.useState(!1),[g,N]=d.useState(!1),[v,y]=d.useState(!1),[w,b]=d.useState(!1),[R,D]=d.useState(!1),[S,P]=d.useState(""),[M,T]=d.useState(!1),{toast:A}=Zs(),F=d.useMemo(()=>O1(c),[c]),L=async ne=>{if(!n){A({title:"无法复制",description:"Token 存储在安全 Cookie 中,请重新生成以获取新 Token",variant:"destructive"});return}try{await navigator.clipboard.writeText(ne),b(!0),A({title:"复制成功",description:"Token 已复制到剪贴板"}),setTimeout(()=>b(!1),2e3)}catch{A({title:"复制失败",description:"请手动复制 Token",variant:"destructive"})}},J=async()=>{if(!c.trim()){A({title:"输入错误",description:"请输入新的 Token",variant:"destructive"});return}if(!F.isValid){const ne=F.rules.filter(ve=>!ve.passed).map(ve=>ve.label).join(", ");A({title:"格式错误",description:`Token 不符合要求: ${ne}`,variant:"destructive"});return}N(!0);try{const ne=await fetch("/api/webui/auth/update",{method:"POST",headers:{"Content-Type":"application/json"},credentials:"include",body:JSON.stringify({new_token:c.trim()})}),ve=await ne.json();ne.ok&&ve.success?(u(""),i(c.trim()),A({title:"更新成功",description:"Access Token 已更新,即将跳转到登录页"}),setTimeout(()=>{l({to:"/auth"})},1500)):A({title:"更新失败",description:ve.message||"无法更新 Token",variant:"destructive"})}catch(ne){console.error("更新 Token 错误:",ne),A({title:"更新失败",description:"连接服务器失败",variant:"destructive"})}finally{N(!1)}},U=async()=>{y(!0);try{const ne=await fetch("/api/webui/auth/regenerate",{method:"POST",headers:{"Content-Type":"application/json"},credentials:"include"}),ve=await ne.json();ne.ok&&ve.success?(i(ve.token),P(ve.token),D(!0),T(!1),A({title:"生成成功",description:"新的 Access Token 已生成,请及时保存"})):A({title:"生成失败",description:ve.message||"无法生成新 Token",variant:"destructive"})}catch(ne){console.error("生成 Token 错误:",ne),A({title:"生成失败",description:"连接服务器失败",variant:"destructive"})}finally{y(!1)}},ue=async()=>{try{await navigator.clipboard.writeText(S),T(!0),A({title:"复制成功",description:"Token 已复制到剪贴板"})}catch{A({title:"复制失败",description:"请手动复制 Token",variant:"destructive"})}},xe=()=>{D(!1),setTimeout(()=>{P(""),T(!1)},300),setTimeout(()=>{l({to:"/auth"})},500)},he=ne=>{ne||xe()};return e.jsxs("div",{className:"space-y-4 sm:space-y-6",children:[e.jsx(Is,{open:R,onOpenChange:he,children:e.jsxs(Os,{className:"sm:max-w-md",children:[e.jsxs(Ds,{children:[e.jsxs(Rs,{className:"flex items-center gap-2",children:[e.jsx(Jt,{className:"h-5 w-5 text-yellow-500"}),"新的 Access Token"]}),e.jsx(Ks,{children:"这是您的新 Token,请立即保存。关闭此窗口后将跳转到登录页面。"})]}),e.jsxs("div",{className:"space-y-4",children:[e.jsxs("div",{className:"rounded-lg border-2 border-primary/20 bg-primary/5 p-4",children:[e.jsx(E,{className:"text-xs text-muted-foreground mb-2 block",children:"您的新 Token (64位安全令牌)"}),e.jsx("div",{className:"font-mono text-sm break-all select-all bg-background p-3 rounded border",children:S})]}),e.jsx("div",{className:"rounded-lg border border-yellow-200 dark:border-yellow-900 bg-yellow-50 dark:bg-yellow-950/30 p-3",children:e.jsxs("div",{className:"flex gap-2",children:[e.jsx(Jt,{className:"h-4 w-4 text-yellow-600 dark:text-yellow-500 flex-shrink-0 mt-0.5"}),e.jsxs("div",{className:"text-sm text-yellow-800 dark:text-yellow-300 space-y-1",children:[e.jsx("p",{className:"font-semibold",children:"重要提示"}),e.jsxs("ul",{className:"list-disc list-inside space-y-0.5 text-xs",children:[e.jsx("li",{children:"此 Token 仅显示一次,关闭后无法再查看"}),e.jsx("li",{children:"请立即复制并保存到安全的位置"}),e.jsx("li",{children:"关闭窗口后将自动跳转到登录页面"}),e.jsx("li",{children:"请使用新 Token 重新登录系统"})]})]})]})})]}),e.jsxs(st,{className:"gap-2 sm:gap-0",children:[e.jsx(_,{variant:"outline",onClick:ue,className:"gap-2",children:M?e.jsxs(e.Fragment,{children:[e.jsx(kt,{className:"h-4 w-4 text-green-500"}),"已复制"]}):e.jsxs(e.Fragment,{children:[e.jsx(Ro,{className:"h-4 w-4"}),"复制 Token"]})}),e.jsx(_,{onClick:xe,children:"我已保存,关闭"})]})]})}),e.jsxs("div",{className:"rounded-lg border bg-card p-4 sm:p-6",children:[e.jsx("h3",{className:"text-base sm:text-lg font-semibold mb-3 sm:mb-4",children:"当前 Access Token"}),e.jsx("div",{className:"space-y-3 sm:space-y-4",children:e.jsxs("div",{className:"space-y-2",children:[e.jsx(E,{htmlFor:"current-token",className:"text-sm",children:"您的访问令牌"}),e.jsxs("div",{className:"flex flex-col sm:flex-row gap-2",children:[e.jsxs("div",{className:"relative flex-1",children:[e.jsx(le,{id:"current-token",type:x?"text":"password",value:n||"••••••••••••••••••••••••••••••••",readOnly:!0,className:"pr-10 font-mono text-sm",placeholder:"Token 存储在安全 Cookie 中"}),e.jsx("button",{onClick:()=>{n?h(!x):A({title:"无法查看",description:'Token 存储在安全 Cookie 中,如需新 Token 请点击"重新生成"'})},className:"absolute right-2 top-1/2 -translate-y-1/2 p-1.5 hover:bg-accent rounded",title:x?"隐藏":"显示",children:x?e.jsx(Wi,{className:"h-4 w-4 text-muted-foreground"}):e.jsx(ia,{className:"h-4 w-4 text-muted-foreground"})})]}),e.jsxs("div",{className:"flex gap-2 w-full sm:w-auto",children:[e.jsx(_,{variant:"outline",size:"icon",onClick:()=>L(n),title:"复制到剪贴板",className:"flex-shrink-0",disabled:!n,children:w?e.jsx(kt,{className:"h-4 w-4 text-green-500"}):e.jsx(Ro,{className:"h-4 w-4"})}),e.jsxs(vs,{children:[e.jsx(yt,{asChild:!0,children:e.jsxs(_,{variant:"outline",disabled:v,className:"gap-2 flex-1 sm:flex-none",children:[e.jsx(dt,{className:I("h-4 w-4",v&&"animate-spin")}),e.jsx("span",{className:"hidden sm:inline",children:"重新生成"}),e.jsx("span",{className:"sm:hidden",children:"生成"})]})}),e.jsxs(ds,{children:[e.jsxs(us,{children:[e.jsx(xs,{children:"确认重新生成 Token"}),e.jsx(hs,{children:"这将生成一个新的 64 位安全令牌,并使当前 Token 立即失效。 您需要使用新 Token 重新登录系统。此操作不可撤销,确定要继续吗?"})]}),e.jsxs(ms,{children:[e.jsx(ps,{children:"取消"}),e.jsx(fs,{onClick:U,children:"确认生成"})]})]})]})]})]}),e.jsx("p",{className:"text-[10px] sm:text-xs text-muted-foreground",children:"请妥善保管您的 Access Token,不要泄露给他人"})]})})]}),e.jsxs("div",{className:"rounded-lg border bg-card p-4 sm:p-6",children:[e.jsx("h3",{className:"text-base sm:text-lg font-semibold mb-3 sm:mb-4",children:"自定义 Access Token"}),e.jsxs("div",{className:"space-y-3 sm:space-y-4",children:[e.jsxs("div",{className:"space-y-2",children:[e.jsx(E,{htmlFor:"new-token",className:"text-sm",children:"新的访问令牌"}),e.jsxs("div",{className:"relative",children:[e.jsx(le,{id:"new-token",type:f?"text":"password",value:c,onChange:ne=>u(ne.target.value),className:"pr-10 font-mono text-sm",placeholder:"输入自定义 Token"}),e.jsx("button",{onClick:()=>p(!f),className:"absolute right-2 top-1/2 -translate-y-1/2 p-1.5 hover:bg-accent rounded",title:f?"隐藏":"显示",children:f?e.jsx(Wi,{className:"h-4 w-4 text-muted-foreground"}):e.jsx(ia,{className:"h-4 w-4 text-muted-foreground"})})]}),c&&e.jsxs("div",{className:"mt-3 space-y-2 p-3 rounded-lg bg-muted/50",children:[e.jsx("p",{className:"text-sm font-medium text-foreground",children:"Token 安全要求:"}),e.jsx("div",{className:"space-y-1.5",children:F.rules.map(ne=>e.jsxs("div",{className:"flex items-center gap-2 text-sm",children:[ne.passed?e.jsx(pt,{className:"h-4 w-4 text-green-500 flex-shrink-0"}):e.jsx(Ga,{className:"h-4 w-4 text-muted-foreground flex-shrink-0"}),e.jsx("span",{className:I(ne.passed?"text-green-600 dark:text-green-400":"text-muted-foreground"),children:ne.label})]},ne.id))}),F.isValid&&e.jsx("div",{className:"mt-2 pt-2 border-t border-border",children:e.jsxs("div",{className:"flex items-center gap-2 text-sm text-green-600 dark:text-green-400",children:[e.jsx(kt,{className:"h-4 w-4"}),e.jsx("span",{className:"font-medium",children:"Token 格式正确,可以使用"})]})})]})]}),e.jsx(_,{onClick:J,disabled:g||!F.isValid||!c,className:"w-full sm:w-auto",children:g?"更新中...":"更新自定义 Token"})]})]}),e.jsxs("div",{className:"rounded-lg border border-yellow-200 dark:border-yellow-900 bg-yellow-50 dark:bg-yellow-950/30 p-3 sm:p-4",children:[e.jsx("h4",{className:"text-sm sm:text-base font-semibold text-yellow-900 dark:text-yellow-200 mb-2",children:"安全提示"}),e.jsxs("ul",{className:"text-xs sm:text-sm text-yellow-800 dark:text-yellow-300 space-y-1 list-disc list-inside",children:[e.jsx("li",{children:"重新生成 Token 会创建系统随机生成的 64 位安全令牌"}),e.jsx("li",{children:"自定义 Token 必须满足所有安全要求才能使用"}),e.jsx("li",{children:"更新 Token 后,旧的 Token 将立即失效"}),e.jsx("li",{children:"请在安全的环境下查看和复制 Token"}),e.jsx("li",{children:"如果怀疑 Token 泄露,请立即重新生成或更新"}),e.jsx("li",{children:"建议使用系统生成的 Token 以获得最高安全性"})]})]})]})}function K1(){const l=ca(),{toast:n}=Zs(),[i,c]=d.useState(!1),[u,x]=d.useState(!1),[h,f]=d.useState(()=>bt("logCacheSize")),[p,g]=d.useState(()=>bt("wsReconnectInterval")),[N,v]=d.useState(()=>bt("wsMaxReconnectAttempts")),[y,w]=d.useState(()=>bt("dataSyncInterval")),[b,R]=d.useState(()=>gg()),[D,S]=d.useState(!1),[P,M]=d.useState(!1),T=d.useRef(null);if(u)throw new Error("这是一个手动触发的测试错误,用于验证错误边界组件是否正常工作。");const A=()=>{R(gg())},F=z=>{const V=z[0];f(V),Ir("logCacheSize",V)},L=z=>{const V=z[0];g(V),Ir("wsReconnectInterval",V)},J=z=>{const V=z[0];v(V),Ir("wsMaxReconnectAttempts",V)},U=z=>{const V=z[0];w(V),Ir("dataSyncInterval",V)},ue=()=>{In.clearLogs(),n({title:"日志已清除",description:"日志缓存已清空"})},xe=()=>{const z=I1();A(),n({title:"缓存已清除",description:`已清除 ${z.clearedKeys.length} 项缓存数据`})},he=()=>{S(!0);try{const z=U1(),V=JSON.stringify(z,null,2),B=new Blob([V],{type:"application/json"}),oe=URL.createObjectURL(B),K=document.createElement("a");K.href=oe,K.download=`maibot-webui-settings-${new Date().toISOString().slice(0,10)}.json`,document.body.appendChild(K),K.click(),document.body.removeChild(K),URL.revokeObjectURL(oe),n({title:"导出成功",description:"设置已导出为 JSON 文件"})}catch(z){console.error("导出设置失败:",z),n({title:"导出失败",description:"无法导出设置",variant:"destructive"})}finally{S(!1)}},ne=z=>{const V=z.target.files?.[0];if(!V)return;M(!0);const B=new FileReader;B.onload=oe=>{try{const K=oe.target?.result,_e=JSON.parse(K),pe=$1(_e);pe.success?(f(bt("logCacheSize")),g(bt("wsReconnectInterval")),v(bt("wsMaxReconnectAttempts")),w(bt("dataSyncInterval")),A(),n({title:"导入成功",description:`成功导入 ${pe.imported.length} 项设置${pe.skipped.length>0?`,跳过 ${pe.skipped.length} 项`:""}`}),(pe.imported.includes("theme")||pe.imported.includes("accentColor"))&&n({title:"提示",description:"部分设置需要刷新页面才能完全生效"})):n({title:"导入失败",description:"没有有效的设置项可导入",variant:"destructive"})}catch(K){console.error("导入设置失败:",K),n({title:"导入失败",description:"文件格式无效",variant:"destructive"})}finally{M(!1),T.current&&(T.current.value="")}},B.readAsText(V)},ve=()=>{B1(),f(cl.logCacheSize),g(cl.wsReconnectInterval),v(cl.wsMaxReconnectAttempts),w(cl.dataSyncInterval),A(),n({title:"已重置",description:"所有设置已恢复为默认值,刷新页面以应用更改"})},je=async()=>{c(!0);try{const z=await we("/api/webui/setup/reset",{method:"POST"}),V=await z.json();z.ok&&V.success?(n({title:"重置成功",description:"即将进入初次配置向导"}),setTimeout(()=>{l({to:"/setup"})},1e3)):n({title:"重置失败",description:V.message||"无法重置配置状态",variant:"destructive"})}catch(z){console.error("重置配置状态错误:",z),n({title:"重置失败",description:"连接服务器失败",variant:"destructive"})}finally{c(!1)}};return e.jsxs("div",{className:"space-y-4 sm:space-y-6",children:[e.jsxs("div",{className:"rounded-lg border bg-card p-4 sm:p-6",children:[e.jsxs("h3",{className:"text-base sm:text-lg font-semibold mb-3 sm:mb-4 flex items-center gap-2",children:[e.jsx(Hr,{className:"h-5 w-5"}),"性能与存储"]}),e.jsxs("div",{className:"space-y-4 sm:space-y-5",children:[e.jsxs("div",{className:"rounded-lg bg-muted/50 p-3 sm:p-4",children:[e.jsxs("div",{className:"flex items-center justify-between mb-2",children:[e.jsxs("span",{className:"text-sm font-medium flex items-center gap-2",children:[e.jsx(Qw,{className:"h-4 w-4"}),"本地存储使用"]}),e.jsx(_,{variant:"ghost",size:"sm",onClick:A,className:"h-7 px-2",children:e.jsx(dt,{className:"h-3 w-3"})})]}),e.jsx("div",{className:"text-2xl font-bold text-primary",children:P1(b.used)}),e.jsxs("p",{className:"text-xs text-muted-foreground mt-1",children:[b.items," 个存储项"]})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsx(E,{className:"text-sm font-medium",children:"日志缓存大小"}),e.jsxs("span",{className:"text-sm text-muted-foreground",children:[h," 条"]})]}),e.jsx(Va,{value:[h],onValueChange:F,min:100,max:5e3,step:100,className:"w-full"}),e.jsx("p",{className:"text-xs text-muted-foreground",children:"控制日志查看器最多缓存的日志条数,较大的值会占用更多内存"})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsx(E,{className:"text-sm font-medium",children:"首页数据刷新间隔"}),e.jsxs("span",{className:"text-sm text-muted-foreground",children:[y," 秒"]})]}),e.jsx(Va,{value:[y],onValueChange:U,min:10,max:120,step:5,className:"w-full"}),e.jsx("p",{className:"text-xs text-muted-foreground",children:"控制首页统计数据的自动刷新间隔"})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsx(E,{className:"text-sm font-medium",children:"WebSocket 重连间隔"}),e.jsxs("span",{className:"text-sm text-muted-foreground",children:[p/1e3," 秒"]})]}),e.jsx(Va,{value:[p],onValueChange:L,min:1e3,max:1e4,step:500,className:"w-full"}),e.jsx("p",{className:"text-xs text-muted-foreground",children:"日志 WebSocket 连接断开后的重连基础间隔"})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsx(E,{className:"text-sm font-medium",children:"WebSocket 最大重连次数"}),e.jsxs("span",{className:"text-sm text-muted-foreground",children:[N," 次"]})]}),e.jsx(Va,{value:[N],onValueChange:J,min:3,max:30,step:1,className:"w-full"}),e.jsx("p",{className:"text-xs text-muted-foreground",children:"连接失败后的最大重连尝试次数"})]}),e.jsxs("div",{className:"flex flex-wrap gap-2 pt-2",children:[e.jsxs(_,{variant:"outline",size:"sm",onClick:ue,className:"gap-2",children:[e.jsx(ls,{className:"h-4 w-4"}),"清除日志缓存"]}),e.jsxs(vs,{children:[e.jsx(yt,{asChild:!0,children:e.jsxs(_,{variant:"outline",size:"sm",className:"gap-2",children:[e.jsx(ls,{className:"h-4 w-4"}),"清除本地缓存"]})}),e.jsxs(ds,{children:[e.jsxs(us,{children:[e.jsx(xs,{children:"确认清除本地缓存"}),e.jsx(hs,{children:"这将清除所有本地缓存的设置和数据(不包括登录凭证)。 您可能需要重新配置部分偏好设置。确定要继续吗?"})]}),e.jsxs(ms,{children:[e.jsx(ps,{children:"取消"}),e.jsx(fs,{onClick:xe,children:"确认清除"})]})]})]})]})]})]}),e.jsxs("div",{className:"rounded-lg border bg-card p-4 sm:p-6",children:[e.jsxs("h3",{className:"text-base sm:text-lg font-semibold mb-3 sm:mb-4 flex items-center gap-2",children:[e.jsx(sa,{className:"h-5 w-5"}),"导入/导出设置"]}),e.jsxs("div",{className:"space-y-4",children:[e.jsx("p",{className:"text-xs sm:text-sm text-muted-foreground",children:"导出当前的界面设置以便备份,或从之前导出的文件中恢复设置。"}),e.jsxs("div",{className:"flex flex-wrap gap-2",children:[e.jsxs(_,{variant:"outline",onClick:he,disabled:D,className:"gap-2",children:[e.jsx(sa,{className:"h-4 w-4"}),D?"导出中...":"导出设置"]}),e.jsx("input",{ref:T,type:"file",accept:".json",onChange:ne,className:"hidden"}),e.jsxs(_,{variant:"outline",onClick:()=>T.current?.click(),disabled:P,className:"gap-2",children:[e.jsx(ec,{className:"h-4 w-4"}),P?"导入中...":"导入设置"]})]}),e.jsx("div",{className:"pt-2 border-t",children:e.jsxs(vs,{children:[e.jsx(yt,{asChild:!0,children:e.jsxs(_,{variant:"outline",size:"sm",className:"gap-2 text-destructive hover:text-destructive",children:[e.jsx(Zi,{className:"h-4 w-4"}),"重置所有设置为默认值"]})}),e.jsxs(ds,{children:[e.jsxs(us,{children:[e.jsx(xs,{children:"确认重置所有设置"}),e.jsx(hs,{children:"这将把所有界面设置恢复为默认值,包括主题、颜色、动画等偏好设置。 此操作不会影响您的登录状态。确定要继续吗?"})]}),e.jsxs(ms,{children:[e.jsx(ps,{children:"取消"}),e.jsx(fs,{onClick:ve,children:"确认重置"})]})]})]})})]})]}),e.jsxs("div",{className:"rounded-lg border bg-card p-4 sm:p-6",children:[e.jsx("h3",{className:"text-base sm:text-lg font-semibold mb-3 sm:mb-4",children:"配置向导"}),e.jsxs("div",{className:"space-y-3 sm:space-y-4",children:[e.jsx("div",{className:"space-y-2",children:e.jsx("p",{className:"text-xs sm:text-sm text-muted-foreground",children:"重新进行初次配置向导,可以帮助您重新设置系统的基础配置。"})}),e.jsxs(vs,{children:[e.jsx(yt,{asChild:!0,children:e.jsxs(_,{variant:"outline",disabled:i,className:"gap-2",children:[e.jsx(Zi,{className:I("h-4 w-4",i&&"animate-spin")}),"重新进行初次配置"]})}),e.jsxs(ds,{children:[e.jsxs(us,{children:[e.jsx(xs,{children:"确认重新配置"}),e.jsx(hs,{children:"这将带您重新进入初次配置向导。您可以重新设置系统的基础配置项。确定要继续吗?"})]}),e.jsxs(ms,{children:[e.jsx(ps,{children:"取消"}),e.jsx(fs,{onClick:je,children:"确认重置"})]})]})]})]})]}),e.jsxs("div",{className:"rounded-lg border border-dashed border-yellow-500/50 bg-yellow-500/5 p-4 sm:p-6",children:[e.jsxs("h3",{className:"text-base sm:text-lg font-semibold mb-3 sm:mb-4 flex items-center gap-2",children:[e.jsx(Jt,{className:"h-5 w-5 text-yellow-500"}),"开发者工具"]}),e.jsxs("div",{className:"space-y-3 sm:space-y-4",children:[e.jsx("div",{className:"space-y-2",children:e.jsx("p",{className:"text-xs sm:text-sm text-muted-foreground",children:"以下功能仅供开发调试使用,可能会导致页面崩溃或异常。"})}),e.jsxs(vs,{children:[e.jsx(yt,{asChild:!0,children:e.jsxs(_,{variant:"destructive",className:"gap-2",children:[e.jsx(Jt,{className:"h-4 w-4"}),"触发测试错误"]})}),e.jsxs(ds,{children:[e.jsxs(us,{children:[e.jsx(xs,{children:"确认触发错误"}),e.jsx(hs,{children:"这将手动触发一个 React 错误,用于测试错误边界组件的显示效果。 页面将显示错误界面,您可以通过刷新页面或点击返回首页来恢复。"})]}),e.jsxs(ms,{children:[e.jsx(ps,{children:"取消"}),e.jsx(fs,{onClick:()=>x(!0),className:"bg-destructive text-destructive-foreground hover:bg-destructive/90",children:"确认触发"})]})]})]})]})]})]})}function Q1(){return e.jsxs("div",{className:"space-y-4 sm:space-y-6",children:[e.jsx("div",{className:"rounded-lg border-2 border-primary/30 bg-gradient-to-r from-primary/5 to-primary/10 p-4 sm:p-6",children:e.jsxs("div",{className:"flex items-start gap-3 sm:gap-4",children:[e.jsx("div",{className:"flex-shrink-0 rounded-lg bg-primary/10 p-2 sm:p-3",children:e.jsx("svg",{className:"h-6 w-6 sm:h-8 sm:w-8 text-primary",fill:"currentColor",viewBox:"0 0 24 24","aria-hidden":"true",children:e.jsx("path",{fillRule:"evenodd",d:"M12 2C6.477 2 2 6.484 2 12.017c0 4.425 2.865 8.18 6.839 9.504.5.092.682-.217.682-.483 0-.237-.008-.868-.013-1.703-2.782.605-3.369-1.343-3.369-1.343-.454-1.158-1.11-1.466-1.11-1.466-.908-.62.069-.608.069-.608 1.003.07 1.531 1.032 1.531 1.032.892 1.53 2.341 1.088 2.91.832.092-.647.35-1.088.636-1.338-2.22-.253-4.555-1.113-4.555-4.951 0-1.093.39-1.988 1.029-2.688-.103-.253-.446-1.272.098-2.65 0 0 .84-.27 2.75 1.026A9.564 9.564 0 0112 6.844c.85.004 1.705.115 2.504.337 1.909-1.296 2.747-1.027 2.747-1.027.546 1.379.202 2.398.1 2.651.64.7 1.028 1.595 1.028 2.688 0 3.848-2.339 4.695-4.566 4.943.359.309.678.92.678 1.855 0 1.338-.012 2.419-.012 2.747 0 .268.18.58.688.482A10.019 10.019 0 0022 12.017C22 6.484 17.522 2 12 2z",clipRule:"evenodd"})})}),e.jsxs("div",{className:"flex-1 min-w-0",children:[e.jsx("h3",{className:"text-lg sm:text-xl font-bold text-foreground mb-2",children:"开源项目"}),e.jsx("p",{className:"text-sm sm:text-base text-muted-foreground mb-3",children:"本项目在 GitHub 开源,欢迎 Star ⭐ 支持!"}),e.jsxs("a",{href:"https://github.com/Mai-with-u/MaiBot-Dashboard",target:"_blank",rel:"noopener noreferrer",className:I("inline-flex items-center gap-2 px-4 py-2 rounded-lg","bg-primary text-primary-foreground font-medium text-sm","hover:bg-primary/90 transition-colors","focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2"),children:[e.jsx("svg",{className:"h-4 w-4",fill:"currentColor",viewBox:"0 0 24 24","aria-hidden":"true",children:e.jsx("path",{fillRule:"evenodd",d:"M12 2C6.477 2 2 6.484 2 12.017c0 4.425 2.865 8.18 6.839 9.504.5.092.682-.217.682-.483 0-.237-.008-.868-.013-1.703-2.782.605-3.369-1.343-3.369-1.343-.454-1.158-1.11-1.466-1.11-1.466-.908-.62.069-.608.069-.608 1.003.07 1.531 1.032 1.531 1.032.892 1.53 2.341 1.088 2.91.832.092-.647.35-1.088.636-1.338-2.22-.253-4.555-1.113-4.555-4.951 0-1.093.39-1.988 1.029-2.688-.103-.253-.446-1.272.098-2.65 0 0 .84-.27 2.75 1.026A9.564 9.564 0 0112 6.844c.85.004 1.705.115 2.504.337 1.909-1.296 2.747-1.027 2.747-1.027.546 1.379.202 2.398.1 2.651.64.7 1.028 1.595 1.028 2.688 0 3.848-2.339 4.695-4.566 4.943.359.309.678.92.678 1.855 0 1.338-.012 2.419-.012 2.747 0 .268.18.58.688.482A10.019 10.019 0 0022 12.017C22 6.484 17.522 2 12 2z",clipRule:"evenodd"})}),"前往 GitHub",e.jsx("svg",{className:"h-4 w-4",fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",children:e.jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M10 6H6a2 2 0 00-2 2v10a2 2 0 002 2h10a2 2 0 002-2v-4M14 4h6m0 0v6m0-6L10 14"})})]})]})]})}),e.jsxs("div",{className:"rounded-lg border bg-card p-4 sm:p-6",children:[e.jsxs("h3",{className:"text-base sm:text-lg font-semibold mb-3 sm:mb-4",children:["关于 ",sx]}),e.jsxs("div",{className:"space-y-2 text-xs sm:text-sm text-muted-foreground",children:[e.jsxs("p",{children:["版本: ",ed]}),e.jsx("p",{children:"麦麦(MaiBot)的现代化 Web 管理界面"})]})]}),e.jsxs("div",{className:"rounded-lg border bg-card p-4 sm:p-6",children:[e.jsx("h3",{className:"text-base sm:text-lg font-semibold mb-3 sm:mb-4",children:"作者"}),e.jsxs("div",{className:"space-y-3",children:[e.jsxs("div",{className:"space-y-1",children:[e.jsx("p",{className:"text-sm font-medium",children:"MaiBot 核心"}),e.jsx("p",{className:"text-xs sm:text-sm text-muted-foreground",children:"Mai-with-u"})]}),e.jsxs("div",{className:"space-y-1",children:[e.jsx("p",{className:"text-sm font-medium",children:"WebUI"}),e.jsxs("p",{className:"text-xs sm:text-sm text-muted-foreground",children:["Mai-with-u ",e.jsx("a",{href:"https://github.com/DrSmoothl",target:"_blank",rel:"noopener noreferrer",className:"text-primary underline",children:"@MotricSeven"})]})]})]})]}),e.jsxs("div",{className:"rounded-lg border bg-card p-4 sm:p-6",children:[e.jsx("h3",{className:"text-base sm:text-lg font-semibold mb-3 sm:mb-4",children:"技术栈"}),e.jsxs("div",{className:"grid grid-cols-1 sm:grid-cols-2 gap-3 text-xs sm:text-sm text-muted-foreground",children:[e.jsxs("div",{className:"space-y-1.5",children:[e.jsx("p",{className:"font-medium text-foreground",children:"前端框架"}),e.jsxs("ul",{className:"space-y-0.5 list-disc list-inside",children:[e.jsx("li",{children:"React 19.2.0"}),e.jsx("li",{children:"TypeScript 5.7.2"}),e.jsx("li",{children:"Vite 6.0.7"}),e.jsx("li",{children:"TanStack Router 1.94.2"})]})]}),e.jsxs("div",{className:"space-y-1.5",children:[e.jsx("p",{className:"font-medium text-foreground",children:"UI 组件"}),e.jsxs("ul",{className:"space-y-0.5 list-disc list-inside",children:[e.jsx("li",{children:"shadcn/ui"}),e.jsx("li",{children:"Radix UI"}),e.jsx("li",{children:"Tailwind CSS 3.4.17"}),e.jsx("li",{children:"Lucide Icons"})]})]}),e.jsxs("div",{className:"space-y-1.5",children:[e.jsx("p",{className:"font-medium text-foreground",children:"后端"}),e.jsxs("ul",{className:"space-y-0.5 list-disc list-inside",children:[e.jsx("li",{children:"Python 3.12+"}),e.jsx("li",{children:"FastAPI"}),e.jsx("li",{children:"Uvicorn"}),e.jsx("li",{children:"WebSocket"})]})]}),e.jsxs("div",{className:"space-y-1.5",children:[e.jsx("p",{className:"font-medium text-foreground",children:"构建工具"}),e.jsxs("ul",{className:"space-y-0.5 list-disc list-inside",children:[e.jsx("li",{children:"Bun / npm"}),e.jsx("li",{children:"ESLint 9.17.0"}),e.jsx("li",{children:"PostCSS"})]})]})]})]}),e.jsxs("div",{className:"rounded-lg border bg-card p-4 sm:p-6",children:[e.jsx("h3",{className:"text-base sm:text-lg font-semibold mb-3 sm:mb-4",children:"开源库感谢"}),e.jsx("p",{className:"text-xs sm:text-sm text-muted-foreground mb-3",children:"本项目使用了以下优秀的开源库,感谢他们的贡献:"}),e.jsx(Ye,{className:"h-[300px] sm:h-[400px]",children:e.jsxs("div",{className:"space-y-4 pr-4",children:[e.jsxs("div",{className:"space-y-2",children:[e.jsx("p",{className:"text-sm font-medium text-foreground",children:"UI 框架与组件"}),e.jsxs("div",{className:"grid gap-2 text-xs sm:text-sm",children:[e.jsx(ft,{name:"React",description:"用户界面构建库",license:"MIT"}),e.jsx(ft,{name:"shadcn/ui",description:"优雅的 React 组件库",license:"MIT"}),e.jsx(ft,{name:"Radix UI",description:"无样式的可访问组件库",license:"MIT"}),e.jsx(ft,{name:"Tailwind CSS",description:"实用优先的 CSS 框架",license:"MIT"}),e.jsx(ft,{name:"Lucide React",description:"精美的图标库",license:"ISC"})]})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsx("p",{className:"text-sm font-medium text-foreground",children:"路由与状态管理"}),e.jsxs("div",{className:"grid gap-2 text-xs sm:text-sm",children:[e.jsx(ft,{name:"TanStack Router",description:"类型安全的路由库",license:"MIT"}),e.jsx(ft,{name:"Zustand",description:"轻量级状态管理",license:"MIT"})]})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsx("p",{className:"text-sm font-medium text-foreground",children:"表单处理"}),e.jsxs("div",{className:"grid gap-2 text-xs sm:text-sm",children:[e.jsx(ft,{name:"React Hook Form",description:"高性能表单库",license:"MIT"}),e.jsx(ft,{name:"Zod",description:"TypeScript 优先的 schema 验证",license:"MIT"})]})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsx("p",{className:"text-sm font-medium text-foreground",children:"工具库"}),e.jsxs("div",{className:"grid gap-2 text-xs sm:text-sm",children:[e.jsx(ft,{name:"clsx",description:"条件 className 构建工具",license:"MIT"}),e.jsx(ft,{name:"tailwind-merge",description:"Tailwind 类名合并工具",license:"MIT"}),e.jsx(ft,{name:"class-variance-authority",description:"组件变体管理",license:"Apache-2.0"}),e.jsx(ft,{name:"date-fns",description:"现代化日期处理库",license:"MIT"})]})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsx("p",{className:"text-sm font-medium text-foreground",children:"动画效果"}),e.jsxs("div",{className:"grid gap-2 text-xs sm:text-sm",children:[e.jsx(ft,{name:"Framer Motion",description:"React 动画库",license:"MIT"}),e.jsx(ft,{name:"vaul",description:"抽屉组件动画",license:"MIT"})]})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsx("p",{className:"text-sm font-medium text-foreground",children:"后端框架"}),e.jsxs("div",{className:"grid gap-2 text-xs sm:text-sm",children:[e.jsx(ft,{name:"FastAPI",description:"现代化 Python Web 框架",license:"MIT"}),e.jsx(ft,{name:"Uvicorn",description:"ASGI 服务器",license:"BSD-3-Clause"}),e.jsx(ft,{name:"Pydantic",description:"数据验证库",license:"MIT"}),e.jsx(ft,{name:"python-multipart",description:"文件上传支持",license:"Apache-2.0"})]})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsx("p",{className:"text-sm font-medium text-foreground",children:"开发工具"}),e.jsxs("div",{className:"grid gap-2 text-xs sm:text-sm",children:[e.jsx(ft,{name:"TypeScript",description:"JavaScript 的超集",license:"Apache-2.0"}),e.jsx(ft,{name:"Vite",description:"下一代前端构建工具",license:"MIT"}),e.jsx(ft,{name:"ESLint",description:"JavaScript 代码检查工具",license:"MIT"}),e.jsx(ft,{name:"PostCSS",description:"CSS 转换工具",license:"MIT"})]})]})]})})]}),e.jsxs("div",{className:"rounded-lg border bg-card p-4 sm:p-6",children:[e.jsx("h3",{className:"text-base sm:text-lg font-semibold mb-3 sm:mb-4",children:"开源许可"}),e.jsxs("div",{className:"space-y-3",children:[e.jsx("div",{className:"rounded-lg bg-primary/5 border border-primary/20 p-3 sm:p-4",children:e.jsxs("div",{className:"flex items-start gap-2 sm:gap-3",children:[e.jsx("div",{className:"flex-shrink-0 mt-0.5",children:e.jsx("div",{className:"rounded-md bg-primary/10 px-2 py-1",children:e.jsx("span",{className:"text-xs sm:text-sm font-bold text-primary",children:"GPLv3"})})}),e.jsxs("div",{className:"flex-1 min-w-0",children:[e.jsx("p",{className:"text-sm sm:text-base font-semibold text-foreground mb-1",children:"MaiBot WebUI"}),e.jsx("p",{className:"text-xs sm:text-sm text-muted-foreground",children:"本项目采用 GNU General Public License v3.0 开源许可证。 您可以自由地使用、修改和分发本软件,但必须保持相同的开源许可。"})]})]})}),e.jsx("p",{className:"text-xs sm:text-sm text-muted-foreground",children:"本项目依赖的所有开源库均遵循各自的开源许可证(MIT、Apache-2.0、BSD 等)。 感谢所有开源贡献者的无私奉献。"})]})]})]})}function ft({name:l,description:n,license:i}){return e.jsxs("div",{className:"flex items-start justify-between gap-2 rounded-lg border bg-muted/30 p-2.5 sm:p-3",children:[e.jsxs("div",{className:"flex-1 min-w-0",children:[e.jsx("p",{className:"font-medium text-foreground truncate",children:l}),e.jsx("p",{className:"text-muted-foreground text-xs mt-0.5",children:n})]}),e.jsx("span",{className:"inline-flex items-center rounded-full bg-primary/10 px-2 py-0.5 text-[10px] font-medium text-primary flex-shrink-0",children:i})]})}function Cm({value:l,current:n,onChange:i,label:c,description:u}){const x=n===l;return e.jsxs("button",{onClick:()=>i(l),className:I("relative rounded-lg border-2 p-3 sm:p-4 text-left transition-all","hover:border-primary/50 hover:bg-accent/50",x?"border-primary bg-accent":"border-border"),children:[x&&e.jsx("div",{className:"absolute top-2 right-2 sm:top-3 sm:right-3 h-2 w-2 rounded-full bg-primary"}),e.jsxs("div",{className:"space-y-1",children:[e.jsx("div",{className:"text-sm sm:text-base font-medium",children:c}),e.jsx("div",{className:"text-[10px] sm:text-xs text-muted-foreground",children:u})]}),e.jsxs("div",{className:"mt-2 sm:mt-3 flex gap-1",children:[l==="light"&&e.jsxs(e.Fragment,{children:[e.jsx("div",{className:"h-2 w-2 rounded-full bg-slate-200"}),e.jsx("div",{className:"h-2 w-2 rounded-full bg-slate-300"}),e.jsx("div",{className:"h-2 w-2 rounded-full bg-slate-400"})]}),l==="dark"&&e.jsxs(e.Fragment,{children:[e.jsx("div",{className:"h-2 w-2 rounded-full bg-slate-700"}),e.jsx("div",{className:"h-2 w-2 rounded-full bg-slate-800"}),e.jsx("div",{className:"h-2 w-2 rounded-full bg-slate-900"})]}),l==="system"&&e.jsxs(e.Fragment,{children:[e.jsx("div",{className:"h-2 w-2 rounded-full bg-gradient-to-r from-slate-200 to-slate-700"}),e.jsx("div",{className:"h-2 w-2 rounded-full bg-gradient-to-r from-slate-300 to-slate-800"}),e.jsx("div",{className:"h-2 w-2 rounded-full bg-gradient-to-r from-slate-400 to-slate-900"})]})]})]})}function Fa({value:l,current:n,onChange:i,label:c,colorClass:u}){const x=n===l;return e.jsxs("button",{onClick:()=>i(l),className:I("relative rounded-lg border-2 p-2 sm:p-3 text-left transition-all","hover:border-primary/50 hover:bg-accent/50",x?"border-primary bg-accent":"border-border"),children:[x&&e.jsx("div",{className:"absolute top-1.5 right-1.5 sm:top-2 sm:right-2 h-1.5 w-1.5 sm:h-2 sm:w-2 rounded-full bg-primary"}),e.jsxs("div",{className:"flex flex-col items-center gap-1.5 sm:gap-2",children:[e.jsx("div",{className:I("h-8 w-8 sm:h-10 sm:w-10 rounded-full",u)}),e.jsx("div",{className:"text-[10px] sm:text-xs font-medium text-center",children:c})]})]})}const Y1=Date.now()%1e6;class J1{grad3;p;perm;constructor(n=0){this.grad3=[[1,1,0],[-1,1,0],[1,-1,0],[-1,-1,0],[1,0,1],[-1,0,1],[1,0,-1],[-1,0,-1],[0,1,1],[0,-1,1],[0,1,-1],[0,-1,-1]],this.p=[];for(let i=0;i<256;i++)this.p[i]=Math.floor(Math.random()*256);this.perm=[];for(let i=0;i<512;i++)this.perm[i]=this.p[i&255]}dot(n,i,c){return n[0]*i+n[1]*c}mix(n,i,c){return(1-c)*n+c*i}fade(n){return n*n*n*(n*(n*6-15)+10)}perlin2(n,i){const c=Math.floor(n)&255,u=Math.floor(i)&255;n-=Math.floor(n),i-=Math.floor(i);const x=this.fade(n),h=this.fade(i),f=this.perm[c]+u,p=this.perm[f],g=this.perm[f+1],N=this.perm[c+1]+u,v=this.perm[N],y=this.perm[N+1];return this.mix(this.mix(this.dot(this.grad3[p%12],n,i),this.dot(this.grad3[v%12],n-1,i),x),this.mix(this.dot(this.grad3[g%12],n,i-1),this.dot(this.grad3[y%12],n-1,i-1),x),h)}}function vg(){const l=d.useRef(null),n=d.useRef(null),i=d.useRef(void 0),[c]=d.useState(()=>new J1(Y1)),u=d.useRef({mouse:{x:-10,y:0,lx:0,ly:0,sx:0,sy:0,v:0,vs:0,a:0,set:!1},lines:[],paths:[],noise:c,bounding:null});return d.useEffect(()=>{const x=n.current,h=l.current;if(!x||!h)return;const f=u.current;f.noise=c;const p=()=>{const D=x.getBoundingClientRect();f.bounding=D,h.style.width=`${D.width}px`,h.style.height=`${D.height}px`},g=()=>{if(!f.bounding)return;const{width:D,height:S}=f.bounding;f.lines=[],f.paths.forEach(ue=>ue.remove()),f.paths=[];const P=10,M=32,T=D+200,A=S+30,F=Math.ceil(T/P),L=Math.ceil(A/M),J=(D-P*F)/2,U=(S-M*L)/2;for(let ue=0;ue<=F;ue++){const xe=[];for(let ne=0;ne<=L;ne++){const ve={x:J+P*ue,y:U+M*ne,wave:{x:0,y:0},cursor:{x:0,y:0,vx:0,vy:0}};xe.push(ve)}const he=document.createElementNS("http://www.w3.org/2000/svg","path");h.appendChild(he),f.paths.push(he),f.lines.push(xe)}},N=D=>{const{lines:S,mouse:P,noise:M}=f;S.forEach(T=>{T.forEach(A=>{const F=M.perlin2((A.x+D*.0125)*.002,(A.y+D*.005)*.0015)*12;A.wave.x=Math.cos(F)*32,A.wave.y=Math.sin(F)*16;const L=A.x-P.sx,J=A.y-P.sy,U=Math.hypot(L,J),ue=Math.max(175,P.vs);if(U{const P={x:D.x+D.wave.x+(S?D.cursor.x:0),y:D.y+D.wave.y+(S?D.cursor.y:0)};return P.x=Math.round(P.x*10)/10,P.y=Math.round(P.y*10)/10,P},y=()=>{const{lines:D,paths:S}=f;D.forEach((P,M)=>{let T=v(P[0],!1),A=`M ${T.x} ${T.y}`;P.forEach((F,L)=>{const J=L===P.length-1;T=v(F,!J),A+=`L ${T.x} ${T.y}`}),S[M].setAttribute("d",A)})},w=D=>{const{mouse:S}=f;S.sx+=(S.x-S.sx)*.1,S.sy+=(S.y-S.sy)*.1;const P=S.x-S.lx,M=S.y-S.ly,T=Math.hypot(P,M);S.v=T,S.vs+=(T-S.vs)*.1,S.vs=Math.min(100,S.vs),S.lx=S.x,S.ly=S.y,S.a=Math.atan2(M,P),x&&(x.style.setProperty("--x",`${S.sx}px`),x.style.setProperty("--y",`${S.sy}px`)),N(D),y(),i.current=requestAnimationFrame(w)},b=D=>{if(!f.bounding)return;const{mouse:S}=f;S.x=D.pageX-f.bounding.left,S.y=D.pageY-f.bounding.top+window.scrollY,S.set||(S.sx=S.x,S.sy=S.y,S.lx=S.x,S.ly=S.y,S.set=!0)},R=()=>{p(),g()};return p(),g(),window.addEventListener("resize",R),window.addEventListener("mousemove",b),i.current=requestAnimationFrame(w),()=>{window.removeEventListener("resize",R),window.removeEventListener("mousemove",b),i.current&&cancelAnimationFrame(i.current)}},[c]),e.jsxs("div",{ref:n,className:"waves-background",style:{position:"absolute",top:0,left:0,width:"100%",height:"100%",overflow:"hidden",pointerEvents:"none"},children:[e.jsx("div",{className:"waves-cursor",style:{position:"absolute",top:0,left:0,width:"0.5rem",height:"0.5rem",background:"hsl(var(--primary) / 0.3)",borderRadius:"50%",transform:"translate3d(calc(var(--x, -0.5rem) - 50%), calc(var(--y, 50%) - 50%), 0)",willChange:"transform",pointerEvents:"none"}}),e.jsx("svg",{ref:l,style:{display:"block",width:"100%",height:"100%"},children:e.jsx("style",{children:` +`)}}):null},Ii=dj,Br=d.forwardRef(({active:l,payload:n,className:i,indicator:c="dot",hideLabel:u=!1,hideIndicator:x=!1,label:h,labelFormatter:f,labelClassName:p,formatter:g,color:N,nameKey:v,labelKey:y},w)=>{const{config:b}=av(),R=d.useMemo(()=>{if(u||!n?.length)return null;const[S]=n,P=`${y||S?.dataKey||S?.name||"value"}`,M=$m(b,S,P),T=!y&&typeof h=="string"?b[h]?.label||h:M?.label;return f?e.jsx("div",{className:I("font-medium",p),children:f(T,n)}):T?e.jsx("div",{className:I("font-medium",p),children:T}):null},[h,f,n,u,p,b,y]);if(!l||!n?.length)return null;const D=n.length===1&&c!=="dot";return e.jsxs("div",{ref:w,className:I("grid min-w-[8rem] items-start gap-1.5 rounded-lg border border-border/50 bg-background px-2.5 py-1.5 text-xs shadow-xl",i),children:[D?null:R,e.jsx("div",{className:"grid gap-1.5",children:n.filter(S=>S.type!=="none").map((S,P)=>{const M=`${v||S.name||S.dataKey||"value"}`,T=$m(b,S,M),A=N||S.payload.fill||S.color;return e.jsx("div",{className:I("flex w-full flex-wrap items-stretch gap-2 [&>svg]:h-2.5 [&>svg]:w-2.5 [&>svg]:text-muted-foreground",c==="dot"&&"items-center"),children:g&&S?.value!==void 0&&S.name?g(S.value,S.name,S,P,S.payload):e.jsxs(e.Fragment,{children:[T?.icon?e.jsx(T.icon,{}):!x&&e.jsx("div",{className:I("shrink-0 rounded-[2px] border-[--color-border] bg-[--color-bg]",{"h-2.5 w-2.5":c==="dot","w-1":c==="line","w-0 border-[1.5px] border-dashed bg-transparent":c==="dashed","my-0.5":D&&c==="dashed"}),style:{"--color-bg":A,"--color-border":A}}),e.jsxs("div",{className:I("flex flex-1 justify-between leading-none",D?"items-end":"items-center"),children:[e.jsxs("div",{className:"grid gap-1.5",children:[D?R:null,e.jsx("span",{className:"text-muted-foreground",children:T?.label||S.name})]}),S.value&&e.jsx("span",{className:"font-mono font-medium tabular-nums text-foreground",children:S.value.toLocaleString()})]})]})},S.dataKey)})})]})});Br.displayName="ChartTooltip";const n1=fw,lv=d.forwardRef(({className:l,hideIcon:n=!1,payload:i,verticalAlign:c="bottom",nameKey:u},x)=>{const{config:h}=av();return i?.length?e.jsx("div",{ref:x,className:I("flex items-center justify-center gap-4",c==="top"?"pb-3":"pt-3",l),children:i.filter(f=>f.type!=="none").map(f=>{const p=`${u||f.dataKey||"value"}`,g=$m(h,f,p);return e.jsxs("div",{className:I("flex items-center gap-1.5 [&>svg]:h-3 [&>svg]:w-3 [&>svg]:text-muted-foreground"),children:[g?.icon&&!n?e.jsx(g.icon,{}):e.jsx("div",{className:"h-2 w-2 shrink-0 rounded-[2px]",style:{backgroundColor:f.color}}),g?.label]},f.value)})}):null});lv.displayName="ChartLegend";function $m(l,n,i){if(typeof n!="object"||n===null)return;const c="payload"in n&&typeof n.payload=="object"&&n.payload!==null?n.payload:void 0;let u=i;return i in n&&typeof n[i]=="string"?u=n[i]:c&&i in c&&typeof c[i]=="string"&&(u=c[i]),u in l?l[u]:l[i]}const qr=Kr("inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0",{variants:{variant:{default:"bg-primary text-primary-foreground shadow hover:bg-primary/90",destructive:"bg-destructive text-destructive-foreground shadow-sm hover:bg-destructive/90",outline:"border border-input bg-background shadow-sm hover:bg-accent hover:text-accent-foreground",secondary:"bg-secondary text-secondary-foreground shadow-sm hover:bg-secondary/80",ghost:"hover:bg-accent hover:text-accent-foreground",link:"text-primary underline-offset-4 hover:underline"},size:{default:"h-9 px-4 py-2",sm:"h-8 rounded-md px-3 text-xs",lg:"h-10 rounded-md px-8",icon:"h-9 w-9"}},defaultVariants:{variant:"default",size:"default"}}),_=d.forwardRef(({className:l,variant:n,size:i,asChild:c=!1,...u},x)=>{const h=c?bw:"button";return e.jsx(h,{className:I(qr({variant:n,size:i,className:l})),ref:x,...u})});_.displayName="Button";const r1=Kr("inline-flex items-center rounded-md border px-2.5 py-0.5 text-xs font-semibold transition-colors focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2",{variants:{variant:{default:"border-transparent bg-primary text-primary-foreground shadow hover:bg-primary/80",secondary:"border-transparent bg-secondary text-secondary-foreground hover:bg-secondary/80",destructive:"border-transparent bg-destructive text-destructive-foreground shadow hover:bg-destructive/80",outline:"text-foreground"}},defaultVariants:{variant:"default"}});function Se({className:l,variant:n,...i}){return e.jsx("div",{className:I(r1({variant:n}),l),...i})}async function i1(){const l=await we("/api/webui/system/restart",{method:"POST",headers:Fs()});if(!l.ok){const n=await l.json();throw new Error(n.detail||"重启失败")}return await l.json()}async function c1(){const l=await we("/api/webui/system/status",{method:"GET",headers:Fs()});if(!l.ok){const n=await l.json();throw new Error(n.detail||"获取状态失败")}return await l.json()}const Lr={INITIAL_DELAY:3e3,CHECK_INTERVAL:2e3,CHECK_TIMEOUT:3e3,MAX_ATTEMPTS:60,PROGRESS_INTERVAL:200,SUCCESS_REDIRECT_DELAY:1500},nv=d.createContext(null);function Yn({children:l,onRestartComplete:n,onRestartFailed:i,healthCheckUrl:c="/api/webui/system/status",maxAttempts:u=Lr.MAX_ATTEMPTS}){const[x,h]=d.useState({status:"idle",progress:0,elapsedTime:0,checkAttempts:0,maxAttempts:u}),[f,p]=d.useState({}),g=d.useCallback(()=>{f.progress&&clearInterval(f.progress),f.elapsed&&clearInterval(f.elapsed),f.check&&clearTimeout(f.check),p({})},[f]),N=d.useCallback(()=>{g(),h({status:"idle",progress:0,elapsedTime:0,checkAttempts:0,maxAttempts:u})},[g,u]),v=d.useCallback(async()=>{try{const D=new AbortController,S=setTimeout(()=>D.abort(),Lr.CHECK_TIMEOUT),P=await fetch(c,{method:"GET",headers:{"Content-Type":"application/json"},credentials:"include",signal:D.signal});return clearTimeout(S),P.ok}catch{return!1}},[c]),y=d.useCallback(()=>{let D=0;const S=async()=>{if(D++,h(M=>({...M,status:"checking",checkAttempts:D})),await v())g(),h(M=>({...M,status:"success",progress:100})),setTimeout(()=>{n?.(),window.location.href="/auth"},Lr.SUCCESS_REDIRECT_DELAY);else if(D>=u){g();const M=`健康检查超时 (${D}/${u})`;h(T=>({...T,status:"failed",error:M})),i?.(M)}else{const M=setTimeout(S,Lr.CHECK_INTERVAL);p(T=>({...T,check:M}))}};S()},[v,g,u,n,i]),w=d.useCallback(()=>{h(D=>({...D,status:"checking",checkAttempts:0,error:void 0})),y()},[y]),b=d.useCallback(async D=>{const{delay:S=0,skipApiCall:P=!1}=D??{};if(x.status!=="idle"&&x.status!=="failed")return;if(g(),h({status:"requesting",progress:0,elapsedTime:0,checkAttempts:0,maxAttempts:u}),S>0&&await new Promise(A=>setTimeout(A,S)),P)h(A=>({...A,status:"restarting"}));else try{h(A=>({...A,status:"restarting"})),await Promise.race([i1(),new Promise(A=>setTimeout(A,5e3))])}catch{}const M=setInterval(()=>{h(A=>({...A,progress:A.progress>=90?A.progress:A.progress+1}))},Lr.PROGRESS_INTERVAL),T=setInterval(()=>{h(A=>({...A,elapsedTime:A.elapsedTime+1}))},1e3);p({progress:M,elapsed:T}),setTimeout(()=>{y()},Lr.INITIAL_DELAY)},[x.status,g,u,y]),R={state:x,isRestarting:x.status!=="idle",triggerRestart:b,resetState:N,retryHealthCheck:w};return e.jsx(nv.Provider,{value:R,children:l})}function vn(){const l=d.useContext(nv);if(!l)throw new Error("useRestart must be used within a RestartProvider");return l}function o1(){try{return vn()}catch{return null}}const d1=(l,n,i,c,u)=>({idle:{icon:null,title:"",description:"",tip:""},requesting:{icon:e.jsx(Bs,{className:"h-16 w-16 text-primary animate-spin"}),title:c??"准备重启",description:u??"正在发送重启请求...",tip:"🔄 正在准备重启麦麦..."},restarting:{icon:e.jsx(Bs,{className:"h-16 w-16 text-primary animate-spin"}),title:c??"正在重启麦麦",description:u??"请稍候,麦麦正在重启中...",tip:"🔄 配置已保存,正在重启主程序..."},checking:{icon:e.jsx(Bs,{className:"h-16 w-16 text-primary animate-spin"}),title:"检查服务状态",description:`等待服务恢复... (${n}/${i})`,tip:"⏳ 正在等待服务恢复,请勿关闭页面..."},success:{icon:e.jsx(pt,{className:"h-16 w-16 text-green-500"}),title:"重启成功",description:"正在跳转到登录页面...",tip:"✅ 配置已生效,服务运行正常"},failed:{icon:e.jsx(_t,{className:"h-16 w-16 text-destructive"}),title:"重启超时",description:"服务未能在预期时间内恢复",tip:"⚠️ 如果长时间无响应,请尝试手动重启"}})[l];function Jn({visible:l,onComplete:n,onFailed:i,title:c,description:u,showAnimation:x=!0,className:h}){const f=o1();return(f?f.isRestarting:l)?f?e.jsx(rv,{state:f.state,onRetry:f.retryHealthCheck,onComplete:n,onFailed:i,title:c,description:u,showAnimation:x,className:h}):e.jsx(u1,{onComplete:n,onFailed:i,title:c,description:u,showAnimation:x,className:h}):null}function rv({state:l,onRetry:n,onComplete:i,onFailed:c,title:u,description:x,showAnimation:h,className:f}){const{status:p,progress:g,elapsedTime:N,checkAttempts:v,maxAttempts:y}=l;d.useEffect(()=>{p==="success"&&i?i():p==="failed"&&c&&c()},[p,i,c]);const w=d1(p,v,y,u,x),b=R=>{const D=Math.floor(R/60),S=R%60;return`${D}:${S.toString().padStart(2,"0")}`};return e.jsxs("div",{className:I("fixed inset-0 bg-background/95 backdrop-blur-sm z-50 flex items-center justify-center",f),children:[h&&e.jsx(m1,{}),e.jsxs("div",{className:"max-w-md w-full mx-4 space-y-8 relative z-10",children:[e.jsxs("div",{className:"flex flex-col items-center space-y-4",children:[e.jsxs("div",{className:"relative",children:[w.icon,(p==="restarting"||p==="checking")&&e.jsx("div",{className:"absolute inset-0 rounded-full bg-primary/20 animate-ping"})]}),e.jsx("h2",{className:"text-2xl font-bold",children:w.title}),e.jsx("p",{className:"text-muted-foreground text-center",children:w.description})]}),p!=="failed"&&p!=="idle"&&e.jsxs("div",{className:"space-y-2",children:[e.jsx(Kn,{value:g,className:"h-2"}),e.jsxs("div",{className:"flex justify-between text-sm text-muted-foreground",children:[e.jsxs("span",{children:[g,"%"]}),e.jsxs("span",{children:["已用时: ",b(N)]})]})]}),e.jsx("div",{className:"bg-muted/50 rounded-lg p-4",children:e.jsx("p",{className:"text-sm text-muted-foreground",children:w.tip})}),p==="failed"&&e.jsxs("div",{className:"flex gap-2",children:[e.jsxs(_,{onClick:()=>window.location.reload(),variant:"default",className:"flex-1",children:[e.jsx(dt,{className:"mr-2 h-4 w-4"}),"刷新页面"]}),e.jsxs(_,{onClick:n,variant:"secondary",className:"flex-1",children:[e.jsx(Zi,{className:"mr-2 h-4 w-4"}),"重试检测"]})]})]})]})}function u1({onComplete:l,onFailed:n,title:i,description:c,showAnimation:u,className:x}){const[h,f]=d.useState({status:"restarting",progress:0,elapsedTime:0,checkAttempts:0,maxAttempts:60}),p=d.useCallback(()=>{let g=0;const N=60,v=async()=>{g++,f(y=>({...y,status:"checking",checkAttempts:g}));try{if((await fetch("/api/webui/system/status",{method:"GET",signal:AbortSignal.timeout(3e3)})).ok){f(w=>({...w,status:"success",progress:100})),setTimeout(()=>{l?.(),window.location.href="/auth"},1500);return}}catch{}g>=N?(f(y=>({...y,status:"failed"})),n?.()):setTimeout(v,2e3)};v()},[l,n]);return d.useEffect(()=>{const g=setInterval(()=>{f(y=>({...y,progress:y.progress>=90?y.progress:y.progress+1}))},200),N=setInterval(()=>{f(y=>({...y,elapsedTime:y.elapsedTime+1}))},1e3),v=setTimeout(()=>{p()},3e3);return()=>{clearInterval(g),clearInterval(N),clearTimeout(v)}},[p]),e.jsx(rv,{state:h,onRetry:p,onComplete:l,onFailed:n,title:i,description:c,showAnimation:u,className:x})}function m1(){return e.jsxs("div",{className:"absolute inset-0 overflow-hidden pointer-events-none",children:[e.jsxs("div",{className:"absolute top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2 w-[600px] h-[600px]",children:[e.jsx("div",{className:"absolute inset-0 rounded-full border border-primary/10 animate-[ping_3s_ease-in-out_infinite]"}),e.jsx("div",{className:"absolute inset-8 rounded-full border border-primary/10 animate-[ping_3s_ease-in-out_infinite_0.5s]"}),e.jsx("div",{className:"absolute inset-16 rounded-full border border-primary/10 animate-[ping_3s_ease-in-out_infinite_1s]"})]}),e.jsx("div",{className:"absolute top-1/4 left-1/4 w-2 h-2 bg-primary/20 rounded-full animate-bounce"}),e.jsx("div",{className:"absolute top-3/4 right-1/4 w-3 h-3 bg-primary/15 rounded-full animate-bounce delay-150"}),e.jsx("div",{className:"absolute top-1/2 right-1/3 w-2 h-2 bg-primary/20 rounded-full animate-bounce delay-300"})]})}const Is=_w,Wo=Sw,x1=yw,iv=d.forwardRef(({className:l,...n},i)=>e.jsx(uj,{ref:i,className:I("fixed inset-0 z-50 bg-black/80 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0",l),...n}));iv.displayName=uj.displayName;const Os=d.forwardRef(({className:l,children:n,preventOutsideClose:i=!1,...c},u)=>e.jsxs(x1,{children:[e.jsx(iv,{}),e.jsxs(mj,{ref:u,className:I("fixed left-[50%] top-[50%] z-50 grid w-full max-w-lg translate-x-[-50%] translate-y-[-50%] gap-4 border bg-background p-6 shadow-lg duration-200 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[state=closed]:slide-out-to-left-1/2 data-[state=closed]:slide-out-to-top-[48%] data-[state=open]:slide-in-from-left-1/2 data-[state=open]:slide-in-from-top-[48%] sm:rounded-lg",l),onPointerDownOutside:i?x=>x.preventDefault():void 0,onInteractOutside:i?x=>x.preventDefault():void 0,...c,children:[n,e.jsxs(ww,{className:"absolute right-4 top-4 rounded-sm opacity-70 ring-offset-background transition-opacity hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:pointer-events-none data-[state=open]:bg-accent data-[state=open]:text-muted-foreground",children:[e.jsx(Ea,{className:"h-4 w-4"}),e.jsx("span",{className:"sr-only",children:"Close"})]})]})]}));Os.displayName=mj.displayName;const Ds=({className:l,...n})=>e.jsx("div",{className:I("flex flex-col space-y-1.5 text-center sm:text-left",l),...n});Ds.displayName="DialogHeader";const st=({className:l,...n})=>e.jsx("div",{className:I("flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2",l),...n});st.displayName="DialogFooter";const Rs=d.forwardRef(({className:l,...n},i)=>e.jsx(xj,{ref:i,className:I("text-lg font-semibold leading-none tracking-tight",l),...n}));Rs.displayName=xj.displayName;const Ks=d.forwardRef(({className:l,...n},i)=>e.jsx(hj,{ref:i,className:I("text-sm text-muted-foreground",l),...n}));Ks.displayName=hj.displayName;const le=d.forwardRef(({className:l,type:n,...i},c)=>e.jsx("input",{type:n,className:I("flex h-9 w-full rounded-md border border-input bg-transparent px-3 py-1 text-base shadow-sm transition-colors file:border-0 file:bg-transparent file:text-sm file:font-medium file:text-foreground placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:cursor-not-allowed disabled:opacity-50 md:text-sm",l),ref:c,...i}));le.displayName="Input";const qs=d.forwardRef(({className:l,...n},i)=>e.jsx(fj,{ref:i,className:I("grid place-content-center peer h-4 w-4 shrink-0 rounded-sm border border-primary shadow focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:cursor-not-allowed disabled:opacity-50 data-[state=checked]:bg-primary data-[state=checked]:text-primary-foreground",l),...n,children:e.jsx(kw,{className:I("grid place-content-center text-current"),children:e.jsx(Ct,{className:"h-4 w-4"})})}));qs.displayName=fj.displayName;const h1=5,f1=5e3;let Sm=0;function p1(){return Sm=(Sm+1)%Number.MAX_SAFE_INTEGER,Sm.toString()}const km=new Map,fg=l=>{if(km.has(l))return;const n=setTimeout(()=>{km.delete(l),Yi({type:"REMOVE_TOAST",toastId:l})},f1);km.set(l,n)},g1=(l,n)=>{switch(n.type){case"ADD_TOAST":return{...l,toasts:[n.toast,...l.toasts].slice(0,h1)};case"UPDATE_TOAST":return{...l,toasts:l.toasts.map(i=>i.id===n.toast.id?{...i,...n.toast}:i)};case"DISMISS_TOAST":{const{toastId:i}=n;return i?fg(i):l.toasts.forEach(c=>{fg(c.id)}),{...l,toasts:l.toasts.map(c=>c.id===i||i===void 0?{...c,open:!1}:c)}}case"REMOVE_TOAST":return n.toastId===void 0?{...l,toasts:[]}:{...l,toasts:l.toasts.filter(i=>i.id!==n.toastId)}}},Ao=[];let Oo={toasts:[]};function Yi(l){Oo=g1(Oo,l),Ao.forEach(n=>{n(Oo)})}function Qt({...l}){const n=p1(),i=u=>Yi({type:"UPDATE_TOAST",toast:{...u,id:n}}),c=()=>Yi({type:"DISMISS_TOAST",toastId:n});return Yi({type:"ADD_TOAST",toast:{...l,id:n,open:!0,onOpenChange:u=>{u||c()}}}),{id:n,dismiss:c,update:i}}function Zs(){const[l,n]=d.useState(Oo);return d.useEffect(()=>(Ao.push(n),()=>{const i=Ao.indexOf(n);i>-1&&Ao.splice(i,1)}),[l]),{...l,toast:Qt,dismiss:i=>Yi({type:"DISMISS_TOAST",toastId:i})}}const el="/api/webui/expression";async function Zm(){const l=await we(`${el}/chats`,{});if(!l.ok){const n=await l.json();throw new Error(n.detail||"获取聊天列表失败")}return l.json()}async function j1(l){const n=new URLSearchParams;l.page&&n.append("page",l.page.toString()),l.page_size&&n.append("page_size",l.page_size.toString()),l.search&&n.append("search",l.search),l.chat_id&&n.append("chat_id",l.chat_id);const i=await we(`${el}/list?${n}`,{});if(!i.ok){const c=await i.json();throw new Error(c.detail||"获取表达方式列表失败")}return i.json()}async function v1(l){const n=await we(`${el}/${l}`,{});if(!n.ok){const i=await n.json();throw new Error(i.detail||"获取表达方式详情失败")}return n.json()}async function N1(l){const n=await we(`${el}/`,{method:"POST",body:JSON.stringify(l)});if(!n.ok){const i=await n.json();throw new Error(i.detail||"创建表达方式失败")}return n.json()}async function b1(l,n){const i=await we(`${el}/${l}`,{method:"PATCH",body:JSON.stringify(n)});if(!i.ok){const c=await i.json();throw new Error(c.detail||"更新表达方式失败")}return i.json()}async function y1(l){const n=await we(`${el}/${l}`,{method:"DELETE"});if(!n.ok){const i=await n.json();throw new Error(i.detail||"删除表达方式失败")}return n.json()}async function w1(l){const n=await we(`${el}/batch/delete`,{method:"POST",body:JSON.stringify({ids:l})});if(!n.ok){const i=await n.json();throw new Error(i.detail||"批量删除表达方式失败")}return n.json()}async function _1(){const l=await we(`${el}/stats/summary`,{});if(!l.ok){const n=await l.json();throw new Error(n.detail||"获取统计数据失败")}return l.json()}async function Wm(){const l=await we(`${el}/review/stats`);if(!l.ok){const n=await l.json();throw new Error(n.detail||"获取审核统计失败")}return l.json()}async function S1(l){const n=new URLSearchParams;l.page&&n.append("page",l.page.toString()),l.page_size&&n.append("page_size",l.page_size.toString()),l.filter_type&&n.append("filter_type",l.filter_type),l.search&&n.append("search",l.search),l.chat_id&&n.append("chat_id",l.chat_id);const i=await we(`${el}/review/list?${n}`);if(!i.ok){const c=await i.json();throw new Error(c.detail||"获取审核列表失败")}return i.json()}async function pg(l){const n=await we(`${el}/review/batch`,{method:"POST",body:JSON.stringify({items:l})});if(!n.ok){const i=await n.json();throw new Error(i.detail||"批量审核失败")}return n.json()}function cv({open:l,onOpenChange:n}){const[i,c]=d.useState(null),[u,x]=d.useState([]),[h,f]=d.useState(!1),[p,g]=d.useState(!1),[N,v]=d.useState(0),[y,w]=d.useState(1),[b]=d.useState(20),[R,D]=d.useState("unchecked"),[S,P]=d.useState(""),[M,T]=d.useState(""),[A,F]=d.useState(new Set),[L,J]=d.useState(new Set),[U,ue]=d.useState(new Map),{toast:xe}=Zs(),he=d.useCallback(async()=>{try{g(!0);const k=await Wm();c(k)}catch(k){console.error("加载统计失败:",k)}finally{g(!1)}},[]),ne=d.useCallback(async()=>{try{f(!0);const k=await S1({page:y,page_size:b,filter_type:R,search:S||void 0});x(k.data),v(k.total)}catch(k){xe({title:"加载失败",description:k instanceof Error?k.message:"无法加载列表",variant:"destructive"})}finally{f(!1)}},[y,b,R,S,xe]),ve=d.useCallback(async()=>{try{const k=await Zm();if(k?.data){const H=new Map;k.data.forEach(se=>{H.set(se.chat_id,se.chat_name)}),ue(H)}}catch(k){console.error("加载聊天名称失败:",k)}},[]);d.useEffect(()=>{l&&(he(),ne(),ve())},[l,he,ne,ve]),d.useEffect(()=>{w(1),F(new Set)},[R,S]);const je=()=>{P(M),w(1)},z=k=>U.get(k)||k,V=async(k,H)=>{try{J(Ee=>new Set(Ee).add(k));const se=await pg([{id:k,rejected:H,require_unchecked:R==="unchecked"}]);se.results[0]?.success?(xe({title:H?"已拒绝":"已通过",description:`表达方式 #${k} ${H?"已拒绝":"已通过"}`}),ne(),he()):xe({title:"操作失败",description:se.results[0]?.message||"未知错误",variant:"destructive"})}catch(se){xe({title:"操作失败",description:se instanceof Error?se.message:"未知错误",variant:"destructive"})}finally{J(se=>{const Ee=new Set(se);return Ee.delete(k),Ee})}},B=async k=>{if(A.size===0){xe({title:"请选择",description:"请先选择要审核的表达方式",variant:"destructive"});return}try{f(!0);const H=Array.from(A).map(Ee=>({id:Ee,rejected:k,require_unchecked:R==="unchecked"})),se=await pg(H);xe({title:"批量审核完成",description:`成功 ${se.succeeded} 条,失败 ${se.failed} 条`,variant:se.failed>0?"destructive":"default"}),F(new Set),ne(),he()}catch(H){xe({title:"批量审核失败",description:H instanceof Error?H.message:"未知错误",variant:"destructive"})}finally{f(!1)}},oe=()=>{A.size===u.length?F(new Set):F(new Set(u.map(k=>k.id)))},K=k=>{F(H=>{const se=new Set(H);return se.has(k)?se.delete(k):se.add(k),se})},_e=k=>k?new Date(k*1e3).toLocaleString("zh-CN",{month:"2-digit",day:"2-digit",hour:"2-digit",minute:"2-digit"}):"-",pe=k=>k.checked?k.rejected?e.jsxs(Se,{variant:"destructive",className:"gap-1",children:[e.jsx(Va,{className:"h-3 w-3"}),"已拒绝"]}):e.jsxs(Se,{variant:"default",className:"gap-1 bg-green-600",children:[e.jsx(pt,{className:"h-3 w-3"}),"已通过"]}):e.jsxs(Se,{variant:"outline",className:"gap-1",children:[e.jsx(na,{className:"h-3 w-3"}),"待审核"]}),ke=k=>k?k==="ai"?e.jsxs(Se,{variant:"secondary",className:"gap-1 text-xs",children:[e.jsx(Pn,{className:"h-3 w-3"}),"AI"]}):e.jsxs(Se,{variant:"secondary",className:"gap-1 text-xs",children:[e.jsx(fn,{className:"h-3 w-3"}),"人工"]}):null,O=Math.ceil(N/b);return e.jsx(Is,{open:l,onOpenChange:n,children:e.jsxs(Os,{className:"max-w-5xl h-[85vh] flex flex-col p-0",children:[e.jsxs(Ds,{className:"px-6 pt-6 pb-4 border-b shrink-0",children:[e.jsx(Rs,{className:"text-xl",children:"表达方式审核"}),e.jsx(Ks,{children:"审核麦麦学习到的表达方式。通过审核的项目才会被使用(可在配置中调整),被拒绝的项目永远不会被使用。"}),e.jsxs("div",{className:"grid grid-cols-4 gap-3 mt-4",children:[e.jsxs("div",{className:"rounded-lg border p-3 text-center",children:[e.jsx("div",{className:"text-2xl font-bold text-orange-500",children:p?"-":i?.unchecked??0}),e.jsx("div",{className:"text-xs text-muted-foreground",children:"待审核"})]}),e.jsxs("div",{className:"rounded-lg border p-3 text-center",children:[e.jsx("div",{className:"text-2xl font-bold text-green-500",children:p?"-":i?.passed??0}),e.jsx("div",{className:"text-xs text-muted-foreground",children:"已通过"})]}),e.jsxs("div",{className:"rounded-lg border p-3 text-center",children:[e.jsx("div",{className:"text-2xl font-bold text-red-500",children:p?"-":i?.rejected??0}),e.jsx("div",{className:"text-xs text-muted-foreground",children:"已拒绝"})]}),e.jsxs("div",{className:"rounded-lg border p-3 text-center",children:[e.jsx("div",{className:"text-2xl font-bold text-blue-500",children:p?"-":i?.total??0}),e.jsx("div",{className:"text-xs text-muted-foreground",children:"总计"})]})]})]}),e.jsxs("div",{className:"px-6 py-3 border-b shrink-0 space-y-3",children:[e.jsx(ta,{value:R,onValueChange:k=>D(k),className:"w-full",children:e.jsxs(Xt,{className:"grid w-full grid-cols-4",children:[e.jsxs(Je,{value:"unchecked",className:"gap-1",children:[e.jsx(na,{className:"h-4 w-4"}),"待审核 (",i?.unchecked??0,")"]}),e.jsxs(Je,{value:"passed",className:"gap-1",children:[e.jsx(pt,{className:"h-4 w-4"}),"已通过 (",i?.passed??0,")"]}),e.jsxs(Je,{value:"rejected",className:"gap-1",children:[e.jsx(Va,{className:"h-4 w-4"}),"已拒绝 (",i?.rejected??0,")"]}),e.jsxs(Je,{value:"all",className:"gap-1",children:["全部 (",i?.total??0,")"]})]})}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsxs("div",{className:"relative flex-1",children:[e.jsx(Tt,{className:"absolute left-3 top-1/2 -translate-y-1/2 h-4 w-4 text-muted-foreground"}),e.jsx(le,{placeholder:"搜索情景或风格...",value:M,onChange:k=>T(k.target.value),onKeyDown:k=>k.key==="Enter"&&je(),className:"pl-9"})]}),e.jsx(_,{variant:"outline",size:"icon",onClick:je,children:e.jsx(Tt,{className:"h-4 w-4"})}),e.jsx(_,{variant:"outline",size:"icon",onClick:()=>{ne(),he()},disabled:h,children:e.jsx(dt,{className:I("h-4 w-4",h&&"animate-spin")})}),R==="unchecked"&&A.size>0&&e.jsxs(e.Fragment,{children:[e.jsxs(_,{variant:"default",size:"sm",className:"bg-green-600 hover:bg-green-700",onClick:()=>B(!1),disabled:h,children:[e.jsx(pt,{className:"h-4 w-4 mr-1"}),"批量通过 (",A.size,")"]}),e.jsxs(_,{variant:"destructive",size:"sm",onClick:()=>B(!0),disabled:h,children:[e.jsx(Va,{className:"h-4 w-4 mr-1"}),"批量拒绝 (",A.size,")"]})]})]})]}),e.jsx(Ye,{className:"flex-1 px-6",children:h&&u.length===0?e.jsx("div",{className:"flex items-center justify-center h-40",children:e.jsx(dt,{className:"h-6 w-6 animate-spin text-muted-foreground"})}):u.length===0?e.jsxs("div",{className:"flex flex-col items-center justify-center h-40 text-muted-foreground",children:[e.jsx(_t,{className:"h-8 w-8 mb-2"}),e.jsx("p",{children:"没有找到表达方式"})]}):e.jsxs("div",{className:"space-y-2 py-2",children:[R==="unchecked"&&u.length>0&&e.jsxs("div",{className:"flex items-center gap-2 py-2 px-3 rounded-lg bg-muted/50",children:[e.jsx(qs,{checked:A.size===u.length&&u.length>0,onCheckedChange:oe}),e.jsxs("span",{className:"text-sm text-muted-foreground",children:["全选当前页 (",u.length," 条)"]})]}),u.map(k=>e.jsx("div",{className:I("rounded-lg border p-4 space-y-3 transition-colors",A.has(k.id)&&"bg-accent border-primary",L.has(k.id)&&"opacity-50"),children:e.jsxs("div",{className:"flex items-start gap-3",children:[R==="unchecked"&&e.jsx(qs,{checked:A.has(k.id),onCheckedChange:()=>K(k.id),disabled:L.has(k.id),className:"mt-1"}),e.jsxs("div",{className:"flex-1 min-w-0 space-y-2",children:[e.jsxs("div",{children:[e.jsx("span",{className:"text-xs text-muted-foreground",children:"情景:"}),e.jsx("p",{className:"text-sm font-medium break-words",children:k.situation})]}),e.jsxs("div",{children:[e.jsx("span",{className:"text-xs text-muted-foreground",children:"风格:"}),e.jsx("p",{className:"text-sm text-muted-foreground break-words",children:k.style})]}),e.jsxs("div",{className:"flex flex-wrap items-center gap-2 text-xs text-muted-foreground",children:[e.jsxs("span",{children:["#",k.id]}),e.jsx("span",{children:"·"}),e.jsx("span",{title:z(k.chat_id),className:"truncate max-w-32",children:z(k.chat_id)}),e.jsx("span",{children:"·"}),e.jsx("span",{children:_e(k.create_date)}),pe(k),ke(k.modified_by)]})]}),e.jsx("div",{className:"flex flex-col gap-2 shrink-0",children:R==="unchecked"?e.jsxs(e.Fragment,{children:[e.jsxs(_,{size:"sm",variant:"outline",className:"text-green-600 hover:text-green-700 hover:bg-green-50",onClick:()=>V(k.id,!1),disabled:L.has(k.id),children:[e.jsx(pt,{className:"h-4 w-4 mr-1"}),"通过"]}),e.jsxs(_,{size:"sm",variant:"outline",className:"text-red-600 hover:text-red-700 hover:bg-red-50",onClick:()=>V(k.id,!0),disabled:L.has(k.id),children:[e.jsx(Va,{className:"h-4 w-4 mr-1"}),"拒绝"]})]}):R==="passed"?e.jsxs(_,{size:"sm",variant:"outline",className:"text-red-600 hover:text-red-700 hover:bg-red-50",onClick:()=>V(k.id,!0),disabled:L.has(k.id),children:[e.jsx(Va,{className:"h-4 w-4 mr-1"}),"改为拒绝"]}):R==="rejected"?e.jsxs(_,{size:"sm",variant:"outline",className:"text-green-600 hover:text-green-700 hover:bg-green-50",onClick:()=>V(k.id,!1),disabled:L.has(k.id),children:[e.jsx(pt,{className:"h-4 w-4 mr-1"}),"改为通过"]}):e.jsx(e.Fragment,{children:k.rejected?e.jsxs(_,{size:"sm",variant:"outline",className:"text-green-600 hover:text-green-700 hover:bg-green-50",onClick:()=>V(k.id,!1),disabled:L.has(k.id),children:[e.jsx(pt,{className:"h-4 w-4 mr-1"}),"改为通过"]}):k.checked?e.jsxs(_,{size:"sm",variant:"outline",className:"text-red-600 hover:text-red-700 hover:bg-red-50",onClick:()=>V(k.id,!0),disabled:L.has(k.id),children:[e.jsx(Va,{className:"h-4 w-4 mr-1"}),"改为拒绝"]}):e.jsxs(e.Fragment,{children:[e.jsxs(_,{size:"sm",variant:"outline",className:"text-green-600 hover:text-green-700 hover:bg-green-50",onClick:()=>V(k.id,!1),disabled:L.has(k.id),children:[e.jsx(pt,{className:"h-4 w-4 mr-1"}),"通过"]}),e.jsxs(_,{size:"sm",variant:"outline",className:"text-red-600 hover:text-red-700 hover:bg-red-50",onClick:()=>V(k.id,!0),disabled:L.has(k.id),children:[e.jsx(Va,{className:"h-4 w-4 mr-1"}),"拒绝"]})]})})})]})},k.id))]})}),e.jsxs("div",{className:"px-6 py-3 border-t shrink-0 flex items-center justify-between",children:[e.jsxs("div",{className:"text-sm text-muted-foreground",children:["共 ",N," 条,第 ",y,"/",O||1," 页"]}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsxs(_,{variant:"outline",size:"sm",onClick:()=>w(k=>Math.max(1,k-1)),disabled:y<=1||h,children:[e.jsx(Aa,{className:"h-4 w-4"}),"上一页"]}),e.jsxs(_,{variant:"outline",size:"sm",onClick:()=>w(k=>Math.min(O,k+1)),disabled:y>=O||h,children:["下一页",e.jsx(Zt,{className:"h-4 w-4"})]})]})]})]})})}function k1(){return e.jsx(Yn,{children:e.jsx(T1,{})})}const C1=l=>{const n=[];for(let i=0;i{try{const O=await Wm();M(O.unchecked)}catch(O){console.error("获取审核统计失败:",O)}},[]),L=d.useCallback(async()=>{try{w(!0);const O=await A0.get("https://v1.hitokoto.cn/?c=a&c=b&c=c&c=d&c=h&c=i&c=k");v({hitokoto:O.data.hitokoto,from:O.data.from||O.data.from_who||"未知"})}catch(O){console.error("获取一言失败:",O),v({hitokoto:"人生就像一盒巧克力,你永远不知道下一颗是什么味道。",from:"阿甘正传"})}finally{w(!1)}},[]),J=d.useCallback(async()=>{try{const O=await we("/api/webui/system/status");if(O.ok){const k=await O.json();R(k)}else R(null)}catch(O){console.error("获取机器人状态失败:",O),R(null)}},[]),U=async()=>{await T()},ue=d.useCallback(async()=>{try{const O=await we(`/api/webui/statistics/dashboard?hours=${h}`);if(O.ok){const k=await O.json();n(k)}c(!1),x(100)}catch(O){console.error("Failed to fetch dashboard data:",O),c(!1),x(100)}},[h]);if(d.useEffect(()=>{if(!i)return;x(0);const O=setTimeout(()=>x(15),200),k=setTimeout(()=>x(30),800),H=setTimeout(()=>x(45),2e3),se=setTimeout(()=>x(60),4e3),Ee=setTimeout(()=>x(75),6500),Z=setTimeout(()=>x(85),9e3),Oe=setTimeout(()=>x(92),11e3);return()=>{clearTimeout(O),clearTimeout(k),clearTimeout(H),clearTimeout(se),clearTimeout(Ee),clearTimeout(Z),clearTimeout(Oe)}},[i]),d.useEffect(()=>{ue(),L(),J(),F()},[ue,L,J,F]),d.useEffect(()=>{if(!p)return;const O=setInterval(()=>{ue(),J()},3e4);return()=>clearInterval(O)},[p,ue,J]),i||!l)return e.jsx("div",{className:"flex items-center justify-center h-[calc(100vh-200px)]",children:e.jsxs("div",{className:"text-center space-y-6 w-full max-w-md px-4",children:[e.jsx(dt,{className:"h-12 w-12 animate-spin mx-auto text-primary"}),e.jsxs("div",{className:"space-y-2",children:[e.jsx("p",{className:"text-lg font-medium",children:"加载统计数据中..."}),e.jsx("p",{className:"text-sm text-muted-foreground",children:"正在获取麦麦运行数据"})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsx(Kn,{value:u,className:"h-2"}),e.jsxs("p",{className:"text-xs text-muted-foreground",children:[u,"%"]})]})]})});const{summary:xe,model_stats:he=[],hourly_data:ne=[],daily_data:ve=[],recent_activity:je=[]}=l,z=xe??{total_requests:0,total_cost:0,total_tokens:0,online_time:0,total_messages:0,total_replies:0,avg_response_time:0,cost_per_hour:0,tokens_per_hour:0},V=O=>{const k=Math.floor(O/3600),H=Math.floor(O%3600/60);return`${k}小时${H}分钟`},B=O=>{const k=O.toLocaleString("zh-CN");return O>=1e9?{display:`${(O/1e9).toFixed(2)}B`,exact:k,needsExact:!0}:O>=1e6?{display:`${(O/1e6).toFixed(2)}M`,exact:k,needsExact:!0}:O>=1e4?{display:`${(O/1e3).toFixed(1)}K`,exact:k,needsExact:!0}:O>=1e3?{display:`${(O/1e3).toFixed(2)}K`,exact:k,needsExact:!0}:{display:k,exact:k,needsExact:!1}},oe=O=>{const k=`¥${O.toLocaleString("zh-CN",{minimumFractionDigits:2,maximumFractionDigits:2})}`;return O>=1e6?{display:`¥${(O/1e6).toFixed(2)}M`,exact:k,needsExact:!0}:O>=1e4?{display:`¥${(O/1e3).toFixed(1)}K`,exact:k,needsExact:!0}:O>=1e3?{display:`¥${(O/1e3).toFixed(2)}K`,exact:k,needsExact:!0}:{display:k,exact:k,needsExact:!1}},K=O=>new Date(O).toLocaleString("zh-CN",{month:"2-digit",day:"2-digit",hour:"2-digit",minute:"2-digit"}),_e=C1(he.length),pe=he.map((O,k)=>({name:O.model_name,value:O.request_count,fill:_e[k]})),ke={requests:{label:"请求数",color:"hsl(var(--chart-1))"},cost:{label:"花费(¥)",color:"hsl(var(--chart-2))"},tokens:{label:"Tokens",color:"hsl(var(--chart-3))"}};return e.jsx(Ye,{className:"h-full",children:e.jsxs("div",{className:"space-y-4 sm:space-y-6 p-4 sm:p-6",children:[e.jsxs("div",{className:"flex flex-col sm:flex-row sm:items-center justify-between gap-4",children:[e.jsxs("div",{children:[e.jsx("h1",{className:"text-2xl sm:text-3xl font-bold",children:"实时监控面板"}),e.jsx("p",{className:"text-sm text-muted-foreground mt-1",children:"麦麦运行状态和统计数据一览"})]}),e.jsxs("div",{className:"flex flex-wrap items-center gap-2",children:[e.jsx(ta,{value:h.toString(),onValueChange:O=>f(Number(O)),children:e.jsxs(Xt,{className:"grid grid-cols-3 w-full sm:w-auto",children:[e.jsx(Je,{value:"24",children:"24小时"}),e.jsx(Je,{value:"168",children:"7天"}),e.jsx(Je,{value:"720",children:"30天"})]})}),e.jsxs(_,{variant:p?"default":"outline",size:"sm",onClick:()=>g(!p),className:"gap-2",children:[e.jsx(dt,{className:`h-4 w-4 ${p?"animate-spin":""}`}),e.jsx("span",{className:"hidden sm:inline",children:"自动刷新"})]}),e.jsx(_,{variant:"outline",size:"sm",onClick:ue,children:e.jsx(dt,{className:"h-4 w-4"})})]})]}),e.jsxs("div",{className:"flex items-center gap-3 px-4 py-2 rounded-lg border border-dashed border-muted-foreground/30 bg-muted/20",children:[y?e.jsx(js,{className:"h-5 flex-1"}):N?e.jsxs("p",{className:"flex-1 text-sm text-muted-foreground italic truncate",children:['"',N.hitokoto,'" —— ',N.from]}):null,e.jsx(_,{variant:"ghost",size:"icon",className:"h-7 w-7 shrink-0",onClick:L,disabled:y,children:e.jsx(dt,{className:`h-3.5 w-3.5 ${y?"animate-spin":""}`})})]}),e.jsxs("div",{className:"grid gap-4 grid-cols-1 lg:grid-cols-3",children:[e.jsxs(Ce,{className:"lg:col-span-1",children:[e.jsx(De,{className:"pb-3",children:e.jsxs(Le,{className:"text-sm font-medium flex items-center gap-2",children:[e.jsx(cc,{className:"h-4 w-4"}),"麦麦状态"]})}),e.jsx(Ae,{children:e.jsxs("div",{className:"flex items-center gap-4",children:[e.jsx("div",{className:"flex items-center gap-2",children:b?.running?e.jsxs(e.Fragment,{children:[e.jsx("div",{className:"h-3 w-3 rounded-full bg-green-500 animate-pulse"}),e.jsxs(Se,{variant:"outline",className:"text-green-600 border-green-300 bg-green-50",children:[e.jsx(pt,{className:"h-3 w-3 mr-1"}),"运行中"]})]}):e.jsxs(e.Fragment,{children:[e.jsx("div",{className:"h-3 w-3 rounded-full bg-red-500"}),e.jsxs(Se,{variant:"outline",className:"text-red-600 border-red-300 bg-red-50",children:[e.jsx(_t,{className:"h-3 w-3 mr-1"}),"已停止"]})]})}),b&&e.jsxs("div",{className:"text-xs text-muted-foreground",children:[e.jsxs("span",{children:["v",b.version]}),e.jsx("span",{className:"mx-2",children:"|"}),e.jsxs("span",{children:["运行 ",V(b.uptime)]})]})]})})]}),e.jsxs(Ce,{children:[e.jsx(De,{className:"pb-3",children:e.jsxs(Le,{className:"text-sm font-medium flex items-center gap-2",children:[e.jsx(Za,{className:"h-4 w-4"}),"快速操作"]})}),e.jsx(Ae,{children:e.jsxs("div",{className:"flex flex-wrap gap-2",children:[e.jsxs(_,{variant:"outline",size:"sm",onClick:U,disabled:A,className:"gap-2",children:[e.jsx(Zi,{className:`h-4 w-4 ${A?"animate-spin":""}`}),A?"重启中...":"重启麦麦"]}),e.jsxs(_,{variant:"outline",size:"sm",onClick:()=>S(!0),className:"gap-2",children:[e.jsx(Aj,{className:"h-4 w-4"}),"表达审核",P>0&&e.jsx("span",{className:"ml-1 px-1.5 py-0.5 text-xs rounded-full bg-orange-500 text-white",children:P>99?"99+":P})]}),e.jsx(_,{variant:"outline",size:"sm",asChild:!0,className:"gap-2",children:e.jsxs(Bn,{to:"/logs",children:[e.jsx(Ca,{className:"h-4 w-4"}),"查看日志"]})}),e.jsx(_,{variant:"outline",size:"sm",asChild:!0,className:"gap-2",children:e.jsxs(Bn,{to:"/plugins",children:[e.jsx(Gw,{className:"h-4 w-4"}),"插件管理"]})}),e.jsx(_,{variant:"outline",size:"sm",asChild:!0,className:"gap-2",children:e.jsxs(Bn,{to:"/settings",children:[e.jsx(pn,{className:"h-4 w-4"}),"系统设置"]})})]})})]}),e.jsxs(Ce,{children:[e.jsxs(De,{className:"pb-3",children:[e.jsxs(Le,{className:"text-sm font-medium flex items-center gap-2",children:[e.jsx(Vw,{className:"h-4 w-4"}),"反馈问卷"]}),e.jsx(ws,{className:"text-xs",children:"帮助我们改进产品体验"})]}),e.jsx(Ae,{children:e.jsxs("div",{className:"flex flex-wrap gap-2",children:[e.jsx(_,{variant:"outline",size:"sm",asChild:!0,className:"gap-2",children:e.jsxs(Bn,{to:"/survey/webui-feedback",children:[e.jsx(Ca,{className:"h-4 w-4"}),"WebUI 反馈"]})}),e.jsx(_,{variant:"outline",size:"sm",asChild:!0,className:"gap-2",children:e.jsxs(Bn,{to:"/survey/maibot-feedback",children:[e.jsx(Ma,{className:"h-4 w-4"}),"麦麦反馈"]})})]})})]})]}),e.jsxs("div",{className:"grid gap-4 grid-cols-1 xs:grid-cols-2 lg:grid-cols-4",children:[e.jsxs(Ce,{children:[e.jsxs(De,{className:"flex flex-row items-center justify-between space-y-0 pb-2",children:[e.jsx(Le,{className:"text-sm font-medium",children:"总请求数"}),e.jsx(Gm,{className:"h-4 w-4 text-muted-foreground"})]}),e.jsxs(Ae,{children:[e.jsxs("div",{className:"text-2xl font-bold",children:[B(z.total_requests).display,B(z.total_requests).needsExact&&e.jsxs("span",{className:"text-xs font-normal text-muted-foreground ml-1",children:["(",B(z.total_requests).exact,")"]})]}),e.jsxs("p",{className:"text-xs text-muted-foreground mt-1",children:["最近",h<48?h+"小时":Math.floor(h/24)+"天"]})]})]}),e.jsxs(Ce,{children:[e.jsxs(De,{className:"flex flex-row items-center justify-between space-y-0 pb-2",children:[e.jsx(Le,{className:"text-sm font-medium",children:"总花费"}),e.jsx(qw,{className:"h-4 w-4 text-muted-foreground"})]}),e.jsxs(Ae,{children:[e.jsxs("div",{className:"text-2xl font-bold",children:[oe(z.total_cost).display,oe(z.total_cost).needsExact&&e.jsxs("span",{className:"text-xs font-normal text-muted-foreground ml-1",children:["(",oe(z.total_cost).exact,")"]})]}),e.jsx("p",{className:"text-xs text-muted-foreground mt-1",children:z.cost_per_hour>0?`¥${z.cost_per_hour.toFixed(2)}/小时`:"暂无数据"})]})]}),e.jsxs(Ce,{children:[e.jsxs(De,{className:"flex flex-row items-center justify-between space-y-0 pb-2",children:[e.jsx(Le,{className:"text-sm font-medium",children:"Token消耗"}),e.jsx(Hr,{className:"h-4 w-4 text-muted-foreground"})]}),e.jsxs(Ae,{children:[e.jsxs("div",{className:"text-2xl font-bold",children:[B(z.total_tokens).display,B(z.total_tokens).needsExact&&e.jsxs("span",{className:"text-xs font-normal text-muted-foreground ml-1",children:["(",B(z.total_tokens).exact,")"]})]}),e.jsx("p",{className:"text-xs text-muted-foreground mt-1",children:z.tokens_per_hour>0?`${B(z.tokens_per_hour).display}/小时`:"暂无数据"})]})]}),e.jsxs(Ce,{children:[e.jsxs(De,{className:"flex flex-row items-center justify-between space-y-0 pb-2",children:[e.jsx(Le,{className:"text-sm font-medium",children:"平均响应"}),e.jsx(Za,{className:"h-4 w-4 text-muted-foreground"})]}),e.jsxs(Ae,{children:[e.jsxs("div",{className:"text-2xl font-bold",children:[z.avg_response_time.toFixed(2),"s"]}),e.jsx("p",{className:"text-xs text-muted-foreground mt-1",children:"API平均耗时"})]})]})]}),e.jsxs("div",{className:"grid gap-4 grid-cols-1 sm:grid-cols-3",children:[e.jsxs(Ce,{children:[e.jsxs(De,{className:"flex flex-row items-center justify-between space-y-0 pb-2",children:[e.jsx(Le,{className:"text-sm font-medium",children:"在线时长"}),e.jsx(na,{className:"h-4 w-4 text-muted-foreground"})]}),e.jsx(Ae,{children:e.jsxs("div",{className:"text-xl font-bold",children:[V(z.online_time),e.jsxs("span",{className:"text-xs font-normal text-muted-foreground ml-1",children:["(",z.online_time.toLocaleString(),"秒)"]})]})})]}),e.jsxs(Ce,{children:[e.jsxs(De,{className:"flex flex-row items-center justify-between space-y-0 pb-2",children:[e.jsx(Le,{className:"text-sm font-medium",children:"消息处理"}),e.jsx(Ma,{className:"h-4 w-4 text-muted-foreground"})]}),e.jsxs(Ae,{children:[e.jsxs("div",{className:"text-xl font-bold",children:[B(z.total_messages).display,B(z.total_messages).needsExact&&e.jsxs("span",{className:"text-xs font-normal text-muted-foreground ml-1",children:["(",B(z.total_messages).exact,")"]})]}),e.jsxs("p",{className:"text-xs text-muted-foreground mt-1",children:["回复 ",B(z.total_replies).display,B(z.total_replies).needsExact&&e.jsxs("span",{children:["(",B(z.total_replies).exact,")"]})," 条"]})]})]}),e.jsxs(Ce,{children:[e.jsxs(De,{className:"flex flex-row items-center justify-between space-y-0 pb-2",children:[e.jsx(Le,{className:"text-sm font-medium",children:"成本效率"}),e.jsx(Vm,{className:"h-4 w-4 text-muted-foreground"})]}),e.jsxs(Ae,{children:[e.jsx("div",{className:"text-xl font-bold",children:z.total_messages>0?`¥${(z.total_cost/z.total_messages*100).toFixed(2)}`:"¥0.00"}),e.jsx("p",{className:"text-xs text-muted-foreground mt-1",children:"每100条消息"})]})]})]}),e.jsxs(ta,{defaultValue:"trends",className:"space-y-4",children:[e.jsxs(Xt,{className:"grid w-full grid-cols-2 sm:grid-cols-4",children:[e.jsx(Je,{value:"trends",children:"趋势"}),e.jsx(Je,{value:"models",children:"模型"}),e.jsx(Je,{value:"activity",children:"活动"}),e.jsx(Je,{value:"daily",children:"日统计"})]}),e.jsxs(ys,{value:"trends",className:"space-y-4",children:[e.jsxs(Ce,{children:[e.jsxs(De,{children:[e.jsx(Le,{children:"请求趋势"}),e.jsxs(ws,{children:["最近",h,"小时的请求量变化"]})]}),e.jsx(Ae,{children:e.jsx($r,{config:ke,className:"h-[300px] sm:h-[400px] w-full aspect-auto",children:e.jsxs(pw,{data:ne,children:[e.jsx(Hi,{strokeDasharray:"3 3",stroke:"hsl(var(--muted-foreground) / 0.2)"}),e.jsx(Fi,{dataKey:"timestamp",tickFormatter:O=>K(O),angle:-45,textAnchor:"end",height:60,stroke:"hsl(var(--muted-foreground))",tick:{fill:"hsl(var(--muted-foreground))"}}),e.jsx(Ur,{stroke:"hsl(var(--muted-foreground))",tick:{fill:"hsl(var(--muted-foreground))"}}),e.jsx(Ii,{content:e.jsx(Br,{labelFormatter:O=>K(O)})}),e.jsx(gw,{type:"monotone",dataKey:"requests",stroke:"var(--color-requests)",strokeWidth:2})]})})})]}),e.jsxs("div",{className:"grid gap-4 grid-cols-1 lg:grid-cols-2",children:[e.jsxs(Ce,{children:[e.jsxs(De,{children:[e.jsx(Le,{children:"花费趋势"}),e.jsx(ws,{children:"API调用成本变化"})]}),e.jsx(Ae,{children:e.jsx($r,{config:ke,className:"h-[250px] sm:h-[300px] w-full aspect-auto",children:e.jsxs(Eo,{data:ne,children:[e.jsx(Hi,{strokeDasharray:"3 3",stroke:"hsl(var(--muted-foreground) / 0.2)"}),e.jsx(Fi,{dataKey:"timestamp",tickFormatter:O=>K(O),angle:-45,textAnchor:"end",height:60,stroke:"hsl(var(--muted-foreground))",tick:{fill:"hsl(var(--muted-foreground))"}}),e.jsx(Ur,{stroke:"hsl(var(--muted-foreground))",tick:{fill:"hsl(var(--muted-foreground))"}}),e.jsx(Ii,{content:e.jsx(Br,{labelFormatter:O=>K(O)})}),e.jsx(Gi,{dataKey:"cost",fill:"var(--color-cost)"})]})})})]}),e.jsxs(Ce,{children:[e.jsxs(De,{children:[e.jsx(Le,{children:"Token消耗"}),e.jsx(ws,{children:"Token使用量变化"})]}),e.jsx(Ae,{children:e.jsx($r,{config:ke,className:"h-[250px] sm:h-[300px] w-full aspect-auto",children:e.jsxs(Eo,{data:ne,children:[e.jsx(Hi,{strokeDasharray:"3 3",stroke:"hsl(var(--muted-foreground) / 0.2)"}),e.jsx(Fi,{dataKey:"timestamp",tickFormatter:O=>K(O),angle:-45,textAnchor:"end",height:60,stroke:"hsl(var(--muted-foreground))",tick:{fill:"hsl(var(--muted-foreground))"}}),e.jsx(Ur,{stroke:"hsl(var(--muted-foreground))",tick:{fill:"hsl(var(--muted-foreground))"}}),e.jsx(Ii,{content:e.jsx(Br,{labelFormatter:O=>K(O)})}),e.jsx(Gi,{dataKey:"tokens",fill:"var(--color-tokens)"})]})})})]})]})]}),e.jsx(ys,{value:"models",className:"space-y-4",children:e.jsxs("div",{className:"grid gap-4 grid-cols-1 lg:grid-cols-2",children:[e.jsxs(Ce,{children:[e.jsxs(De,{children:[e.jsx(Le,{children:"模型请求分布"}),e.jsxs(ws,{children:["各模型使用占比 (共 ",he.length," 个模型)"]})]}),e.jsx(Ae,{children:e.jsx($r,{config:Object.fromEntries(he.map((O,k)=>[O.model_name,{label:O.model_name,color:_e[k]}])),className:"h-[300px] sm:h-[400px] w-full aspect-auto",children:e.jsxs(jw,{children:[e.jsx(Ii,{content:e.jsx(Br,{})}),e.jsx(vw,{data:pe,cx:"50%",cy:"50%",labelLine:!1,label:({name:O,percent:k})=>k&&k<.05?"":`${O} ${k?(k*100).toFixed(0):0}%`,outerRadius:100,dataKey:"value",children:pe.map((O,k)=>e.jsx(Nw,{fill:O.fill},`cell-${k}`))})]})})})]}),e.jsxs(Ce,{children:[e.jsxs(De,{children:[e.jsx(Le,{children:"模型详细统计"}),e.jsx(ws,{children:"请求数、花费和性能"})]}),e.jsx(Ae,{children:e.jsx(Ye,{className:"h-[300px] sm:h-[400px]",children:e.jsx("div",{className:"space-y-3",children:he.map((O,k)=>e.jsxs("div",{className:"p-4 rounded-lg border bg-card hover:bg-accent/50 transition-colors",children:[e.jsxs("div",{className:"flex items-center justify-between mb-2",children:[e.jsx("h4",{className:"font-semibold text-sm truncate flex-1 min-w-0",children:O.model_name}),e.jsx("div",{className:"w-3 h-3 rounded-full ml-2 flex-shrink-0",style:{backgroundColor:`hsl(var(--chart-${k%5+1}))`}})]}),e.jsxs("div",{className:"grid grid-cols-2 gap-2 text-xs",children:[e.jsxs("div",{children:[e.jsx("span",{className:"text-muted-foreground",children:"请求数:"}),e.jsx("span",{className:"ml-1 font-medium",children:O.request_count.toLocaleString()})]}),e.jsxs("div",{children:[e.jsx("span",{className:"text-muted-foreground",children:"花费:"}),e.jsxs("span",{className:"ml-1 font-medium",children:["¥",O.total_cost.toFixed(2)]})]}),e.jsxs("div",{children:[e.jsx("span",{className:"text-muted-foreground",children:"Tokens:"}),e.jsxs("span",{className:"ml-1 font-medium",children:[(O.total_tokens/1e3).toFixed(1),"K"]})]}),e.jsxs("div",{children:[e.jsx("span",{className:"text-muted-foreground",children:"平均耗时:"}),e.jsxs("span",{className:"ml-1 font-medium",children:[O.avg_response_time.toFixed(2),"s"]})]})]})]},k))})})})]})]})}),e.jsx(ys,{value:"activity",children:e.jsxs(Ce,{children:[e.jsxs(De,{children:[e.jsx(Le,{children:"最近活动"}),e.jsx(ws,{children:"最新的API调用记录"})]}),e.jsx(Ae,{children:e.jsx(Ye,{className:"h-[400px] sm:h-[500px]",children:e.jsx("div",{className:"space-y-2",children:je.map((O,k)=>e.jsxs("div",{className:"p-3 sm:p-4 rounded-lg border bg-card hover:bg-accent/50 transition-colors",children:[e.jsxs("div",{className:"flex flex-col sm:flex-row sm:items-center justify-between gap-2 mb-2",children:[e.jsxs("div",{className:"flex-1 min-w-0",children:[e.jsx("div",{className:"font-medium text-sm truncate",children:O.model}),e.jsx("div",{className:"text-xs text-muted-foreground",children:O.request_type})]}),e.jsx("div",{className:"text-xs text-muted-foreground flex-shrink-0",children:K(O.timestamp)})]}),e.jsxs("div",{className:"grid grid-cols-2 sm:grid-cols-4 gap-2 text-xs",children:[e.jsxs("div",{children:[e.jsx("span",{className:"text-muted-foreground",children:"Tokens:"}),e.jsx("span",{className:"ml-1",children:O.tokens})]}),e.jsxs("div",{children:[e.jsx("span",{className:"text-muted-foreground",children:"花费:"}),e.jsxs("span",{className:"ml-1",children:["¥",O.cost.toFixed(4)]})]}),e.jsxs("div",{children:[e.jsx("span",{className:"text-muted-foreground",children:"耗时:"}),e.jsxs("span",{className:"ml-1",children:[O.time_cost.toFixed(2),"s"]})]}),e.jsxs("div",{children:[e.jsx("span",{className:"text-muted-foreground",children:"状态:"}),e.jsx("span",{className:`ml-1 ${O.status==="success"?"text-green-600":"text-red-600"}`,children:O.status})]})]})]},k))})})})]})}),e.jsx(ys,{value:"daily",children:e.jsxs(Ce,{children:[e.jsxs(De,{children:[e.jsx(Le,{children:"每日统计"}),e.jsx(ws,{children:"最近7天的数据汇总"})]}),e.jsx(Ae,{children:e.jsx($r,{config:{requests:{label:"请求数",color:"hsl(var(--chart-1))"},cost:{label:"花费(¥)",color:"hsl(var(--chart-2))"}},className:"h-[400px] sm:h-[500px] w-full aspect-auto",children:e.jsxs(Eo,{data:ve,children:[e.jsx(Hi,{strokeDasharray:"3 3",stroke:"hsl(var(--muted-foreground) / 0.2)"}),e.jsx(Fi,{dataKey:"timestamp",tickFormatter:O=>{const k=new Date(O);return`${k.getMonth()+1}/${k.getDate()}`},stroke:"hsl(var(--muted-foreground))",tick:{fill:"hsl(var(--muted-foreground))"}}),e.jsx(Ur,{yAxisId:"left",stroke:"hsl(var(--muted-foreground))",tick:{fill:"hsl(var(--muted-foreground))"}}),e.jsx(Ur,{yAxisId:"right",orientation:"right",stroke:"hsl(var(--muted-foreground))",tick:{fill:"hsl(var(--muted-foreground))"}}),e.jsx(Ii,{content:e.jsx(Br,{labelFormatter:O=>new Date(O).toLocaleDateString("zh-CN")})}),e.jsx(n1,{content:e.jsx(lv,{})}),e.jsx(Gi,{yAxisId:"left",dataKey:"requests",fill:"var(--color-requests)"}),e.jsx(Gi,{yAxisId:"right",dataKey:"cost",fill:"var(--color-cost)"})]})})})]})})]}),e.jsx(Jn,{}),e.jsx(cv,{open:D,onOpenChange:O=>{S(O),O||F()}})]})})}const E1={theme:"system",setTheme:()=>null},ov=d.createContext(E1),ex=()=>{const l=d.useContext(ov);if(l===void 0)throw new Error("useTheme must be used within a ThemeProvider");return l},M1=(l,n,i)=>{const c=document.documentElement.classList.contains("no-animations");if(!document.startViewTransition||c){n(l);return}const u=i.clientX,x=i.clientY,h=Math.hypot(Math.max(u,innerWidth-u),Math.max(x,innerHeight-x));document.startViewTransition(()=>{n(l)}).ready.then(()=>{document.documentElement.animate({clipPath:[`circle(0px at ${u}px ${x}px)`,`circle(${h}px at ${u}px ${x}px)`]},{duration:500,easing:"ease-in-out",pseudoElement:"::view-transition-new(root)"})})},dv=d.createContext(void 0),uv=()=>{const l=d.useContext(dv);if(l===void 0)throw new Error("useAnimation must be used within an AnimationProvider");return l},Fe=d.forwardRef(({className:l,...n},i)=>e.jsx(qg,{className:I("peer inline-flex h-5 w-9 shrink-0 cursor-pointer items-center rounded-full border-2 border-transparent shadow-sm transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background disabled:cursor-not-allowed disabled:opacity-50 data-[state=checked]:bg-primary data-[state=unchecked]:bg-input",l),...n,ref:i,children:e.jsx($0,{className:I("pointer-events-none block h-4 w-4 rounded-full bg-background shadow-lg ring-0 transition-transform data-[state=checked]:translate-x-4 data-[state=unchecked]:translate-x-0")})}));Fe.displayName=qg.displayName;const z1=Kr("text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70"),E=d.forwardRef(({className:l,...n},i)=>e.jsx(pj,{ref:i,className:I(z1(),l),...n}));E.displayName=pj.displayName;const A1=[{id:"minLength",label:"长度至少 10 位",description:"Token 长度必须大于等于 10 个字符",validate:l=>l.length>=10},{id:"hasUppercase",label:"包含大写字母",description:"至少包含一个大写字母 (A-Z)",validate:l=>/[A-Z]/.test(l)},{id:"hasLowercase",label:"包含小写字母",description:"至少包含一个小写字母 (a-z)",validate:l=>/[a-z]/.test(l)},{id:"hasSpecialChar",label:"包含特殊符号",description:"至少包含一个特殊符号 (!@#$%^&*()_+-=[]{}|;:,.<>?/)",validate:l=>/[!@#$%^&*()_+\-=[\]{}|;:,.<>?/]/.test(l)}];function O1(l){const n=A1.map(c=>({id:c.id,label:c.label,description:c.description,passed:c.validate(l)}));return{isValid:n.every(c=>c.passed),rules:n}}const ed="0.12.1",sx="MaiBot Dashboard",D1=`${sx} v${ed}`,R1=(l="v")=>`${l}${ed}`,pa={THEME:"maibot-ui-theme",ACCENT_COLOR:"accent-color",ENABLE_ANIMATIONS:"maibot-animations",ENABLE_WAVES_BACKGROUND:"maibot-waves-background",LOG_CACHE_SIZE:"maibot-log-cache-size",LOG_AUTO_SCROLL:"maibot-log-auto-scroll",LOG_FONT_SIZE:"maibot-log-font-size",LOG_LINE_SPACING:"maibot-log-line-spacing",DATA_SYNC_INTERVAL:"maibot-data-sync-interval",WS_RECONNECT_INTERVAL:"maibot-ws-reconnect-interval",WS_MAX_RECONNECT_ATTEMPTS:"maibot-ws-max-reconnect-attempts",COMPLETED_TOURS:"maibot-completed-tours"},cl={theme:"system",accentColor:"blue",enableAnimations:!0,enableWavesBackground:!0,logCacheSize:1e3,logAutoScroll:!0,logFontSize:"xs",logLineSpacing:4,dataSyncInterval:30,wsReconnectInterval:3e3,wsMaxReconnectAttempts:10};function yt(l){const n=mv(l),i=localStorage.getItem(n);if(i===null)return cl[l];const c=cl[l];if(typeof c=="boolean")return i==="true";if(typeof c=="number"){const u=parseFloat(i);return isNaN(u)?c:u}return i}function Ir(l,n){const i=mv(l);localStorage.setItem(i,String(n)),window.dispatchEvent(new CustomEvent("maibot-settings-change",{detail:{key:l,value:n}}))}function L1(){return{theme:yt("theme"),accentColor:yt("accentColor"),enableAnimations:yt("enableAnimations"),enableWavesBackground:yt("enableWavesBackground"),logCacheSize:yt("logCacheSize"),logAutoScroll:yt("logAutoScroll"),logFontSize:yt("logFontSize"),logLineSpacing:yt("logLineSpacing"),dataSyncInterval:yt("dataSyncInterval"),wsReconnectInterval:yt("wsReconnectInterval"),wsMaxReconnectAttempts:yt("wsMaxReconnectAttempts")}}function U1(){const l=L1(),n=localStorage.getItem(pa.COMPLETED_TOURS),i=n?JSON.parse(n):[];return{...l,completedTours:i}}function $1(l){const n=[],i=[];for(const[c,u]of Object.entries(l)){if(c==="completedTours"){Array.isArray(u)?(localStorage.setItem(pa.COMPLETED_TOURS,JSON.stringify(u)),n.push("completedTours")):i.push("completedTours");continue}if(c in cl){const x=c,h=cl[x];if(typeof u==typeof h){if(x==="theme"&&!["light","dark","system"].includes(u)){i.push(c);continue}if(x==="logFontSize"&&!["xs","sm","base"].includes(u)){i.push(c);continue}Ir(x,u),n.push(c)}else i.push(c)}else i.push(c)}return{success:n.length>0,imported:n,skipped:i}}function B1(){for(const l of Object.keys(cl))Ir(l,cl[l]);localStorage.removeItem(pa.COMPLETED_TOURS),window.dispatchEvent(new CustomEvent("maibot-settings-reset"))}function I1(){const l=[],n=[],i=[];for(let c=0;cc.size-i.size),{used:l,items:localStorage.length,details:n}}function P1(l){if(l===0)return"0 B";const n=1024,i=["B","KB","MB"],c=Math.floor(Math.log(l)/Math.log(n));return parseFloat((l/Math.pow(n,c)).toFixed(2))+" "+i[c]}function mv(l){return{theme:pa.THEME,accentColor:pa.ACCENT_COLOR,enableAnimations:pa.ENABLE_ANIMATIONS,enableWavesBackground:pa.ENABLE_WAVES_BACKGROUND,logCacheSize:pa.LOG_CACHE_SIZE,logAutoScroll:pa.LOG_AUTO_SCROLL,logFontSize:pa.LOG_FONT_SIZE,logLineSpacing:pa.LOG_LINE_SPACING,dataSyncInterval:pa.DATA_SYNC_INTERVAL,wsReconnectInterval:pa.WS_RECONNECT_INTERVAL,wsMaxReconnectAttempts:pa.WS_MAX_RECONNECT_ATTEMPTS}[l]}const qa=d.forwardRef(({className:l,...n},i)=>e.jsxs(Kg,{ref:i,className:I("relative flex w-full touch-none select-none items-center",l),...n,children:[e.jsx(B0,{className:"relative h-1.5 w-full grow overflow-hidden rounded-full bg-primary/20",children:e.jsx(I0,{className:"absolute h-full bg-primary"})}),e.jsx(P0,{className:"block h-4 w-4 rounded-full border border-primary/50 bg-background shadow transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50"})]}));qa.displayName=Kg.displayName;class H1{ws=null;reconnectTimeout=null;reconnectAttempts=0;heartbeatInterval=null;logCallbacks=new Set;connectionCallbacks=new Set;isConnected=!1;logCache=[];getMaxCacheSize(){return yt("logCacheSize")}getMaxReconnectAttempts(){return yt("wsMaxReconnectAttempts")}getReconnectInterval(){return yt("wsReconnectInterval")}getWebSocketUrl(n){let i;{const c=window.location.protocol==="https:"?"wss:":"ws:",u=window.location.host;i=`${c}//${u}/ws/logs`}return n?`${i}?token=${encodeURIComponent(n)}`:i}async getWsToken(){try{const n=await we("/api/webui/ws-token",{method:"GET",credentials:"include"});if(!n.ok)return console.error("获取 WebSocket token 失败:",n.status),null;const i=await n.json();return i.success&&i.token?i.token:null}catch(n){return console.error("获取 WebSocket token 失败:",n),null}}async connect(){if(this.ws?.readyState===WebSocket.OPEN||this.ws?.readyState===WebSocket.CONNECTING)return;if(window.location.pathname==="/auth"){console.log("📡 在登录页面,跳过 WebSocket 连接");return}if(!await tc()){console.log("📡 未登录,跳过 WebSocket 连接");return}const i=await this.getWsToken();if(!i){console.log("📡 无法获取 WebSocket token,跳过连接");return}const c=this.getWebSocketUrl(i);try{this.ws=new WebSocket(c),this.ws.onopen=()=>{this.isConnected=!0,this.reconnectAttempts=0,this.notifyConnection(!0),this.startHeartbeat()},this.ws.onmessage=u=>{try{if(u.data==="pong")return;const x=JSON.parse(u.data);this.notifyLog(x)}catch(x){console.error("解析日志消息失败:",x)}},this.ws.onerror=u=>{console.error("❌ WebSocket 错误:",u),this.isConnected=!1,this.notifyConnection(!1)},this.ws.onclose=()=>{this.isConnected=!1,this.notifyConnection(!1),this.stopHeartbeat(),this.attemptReconnect()}}catch(u){console.error("创建 WebSocket 连接失败:",u),this.attemptReconnect()}}attemptReconnect(){const n=this.getMaxReconnectAttempts();if(this.reconnectAttempts>=n)return;this.reconnectAttempts+=1;const i=this.getReconnectInterval(),c=Math.min(i*this.reconnectAttempts,3e4);this.reconnectTimeout=window.setTimeout(()=>{this.connect()},c)}startHeartbeat(){this.heartbeatInterval=window.setInterval(()=>{this.ws?.readyState===WebSocket.OPEN&&this.ws.send("ping")},3e4)}stopHeartbeat(){this.heartbeatInterval!==null&&(clearInterval(this.heartbeatInterval),this.heartbeatInterval=null)}disconnect(){this.reconnectTimeout!==null&&(clearTimeout(this.reconnectTimeout),this.reconnectTimeout=null),this.stopHeartbeat(),this.ws&&(this.ws.close(),this.ws=null),this.isConnected=!1,this.reconnectAttempts=0}onLog(n){return this.logCallbacks.add(n),()=>this.logCallbacks.delete(n)}onConnectionChange(n){return this.connectionCallbacks.add(n),n(this.isConnected),()=>this.connectionCallbacks.delete(n)}notifyLog(n){if(!this.logCache.some(c=>c.id===n.id)){this.logCache.push(n);const c=this.getMaxCacheSize();this.logCache.length>c&&(this.logCache=this.logCache.slice(-c)),this.logCallbacks.forEach(u=>{try{u(n)}catch(x){console.error("日志回调执行失败:",x)}})}}notifyConnection(n){this.connectionCallbacks.forEach(i=>{try{i(n)}catch(c){console.error("连接状态回调执行失败:",c)}})}getAllLogs(){return[...this.logCache]}clearLogs(){this.logCache=[]}getConnectionStatus(){return this.isConnected}}const In=new H1;typeof window<"u"&&setTimeout(()=>{In.connect()},100);const vs=F0,wt=G0,F1=H0,xv=d.forwardRef(({className:l,...n},i)=>e.jsx(Qg,{className:I("fixed inset-0 z-50 bg-black/80 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0",l),...n,ref:i}));xv.displayName=Qg.displayName;const ds=d.forwardRef(({className:l,...n},i)=>e.jsxs(F1,{children:[e.jsx(xv,{}),e.jsx(Yg,{ref:i,className:I("fixed left-[50%] top-[50%] z-50 grid w-full max-w-lg translate-x-[-50%] translate-y-[-50%] gap-4 border bg-background p-6 shadow-lg duration-200 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[state=closed]:slide-out-to-left-1/2 data-[state=closed]:slide-out-to-top-[48%] data-[state=open]:slide-in-from-left-1/2 data-[state=open]:slide-in-from-top-[48%] sm:rounded-lg",l),...n})]}));ds.displayName=Yg.displayName;const us=({className:l,...n})=>e.jsx("div",{className:I("flex flex-col space-y-2 text-center sm:text-left",l),...n});us.displayName="AlertDialogHeader";const ms=({className:l,...n})=>e.jsx("div",{className:I("flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2",l),...n});ms.displayName="AlertDialogFooter";const xs=d.forwardRef(({className:l,...n},i)=>e.jsx(Jg,{ref:i,className:I("text-lg font-semibold",l),...n}));xs.displayName=Jg.displayName;const hs=d.forwardRef(({className:l,...n},i)=>e.jsx(Xg,{ref:i,className:I("text-sm text-muted-foreground",l),...n}));hs.displayName=Xg.displayName;const fs=d.forwardRef(({className:l,variant:n,...i},c)=>e.jsx(Zg,{ref:c,className:I(qr({variant:n}),l),...i}));fs.displayName=Zg.displayName;const ps=d.forwardRef(({className:l,...n},i)=>e.jsx(Wg,{ref:i,className:I(qr({variant:"outline"}),"mt-2 sm:mt-0",l),...n}));ps.displayName=Wg.displayName;function G1(){return e.jsxs("div",{className:"space-y-4 sm:space-y-6 p-4 sm:p-6",children:[e.jsx("div",{className:"flex flex-col sm:flex-row sm:items-center justify-between gap-4",children:e.jsxs("div",{children:[e.jsx("h1",{className:"text-2xl sm:text-3xl font-bold",children:"系统设置"}),e.jsx("p",{className:"text-muted-foreground mt-1 sm:mt-2 text-sm sm:text-base",children:"管理您的应用偏好设置"})]})}),e.jsxs(ta,{defaultValue:"appearance",className:"w-full",children:[e.jsxs(Xt,{className:"grid w-full grid-cols-2 sm:grid-cols-4 gap-0.5 sm:gap-1 h-auto p-1",children:[e.jsxs(Je,{value:"appearance",className:"gap-1 sm:gap-2 text-xs sm:text-sm px-2 sm:px-3 py-2",children:[e.jsx(Kw,{className:"h-3.5 w-3.5 sm:h-4 sm:w-4",strokeWidth:2,fill:"none"}),e.jsx("span",{children:"外观"})]}),e.jsxs(Je,{value:"security",className:"gap-1 sm:gap-2 text-xs sm:text-sm px-2 sm:px-3 py-2",children:[e.jsx(Oj,{className:"h-3.5 w-3.5 sm:h-4 sm:w-4",strokeWidth:2,fill:"none"}),e.jsx("span",{children:"安全"})]}),e.jsxs(Je,{value:"other",className:"gap-1 sm:gap-2 text-xs sm:text-sm px-2 sm:px-3 py-2",children:[e.jsx(pn,{className:"h-3.5 w-3.5 sm:h-4 sm:w-4",strokeWidth:2,fill:"none"}),e.jsx("span",{children:"其他"})]}),e.jsxs(Je,{value:"about",className:"gap-1 sm:gap-2 text-xs sm:text-sm px-2 sm:px-3 py-2",children:[e.jsx(Ht,{className:"h-3.5 w-3.5 sm:h-4 sm:w-4",strokeWidth:2,fill:"none"}),e.jsx("span",{children:"关于"})]})]}),e.jsxs(Ye,{className:"h-[calc(100vh-240px)] sm:h-[calc(100vh-280px)] mt-4 sm:mt-6",children:[e.jsx(ys,{value:"appearance",className:"mt-0",children:e.jsx(V1,{})}),e.jsx(ys,{value:"security",className:"mt-0",children:e.jsx(q1,{})}),e.jsx(ys,{value:"other",className:"mt-0",children:e.jsx(K1,{})}),e.jsx(ys,{value:"about",className:"mt-0",children:e.jsx(Q1,{})})]})]})]})}function jg(l){const n=document.documentElement,c={blue:{hsl:"221.2 83.2% 53.3%",darkHsl:"217.2 91.2% 59.8%",gradient:null},purple:{hsl:"271 91% 65%",darkHsl:"270 95% 75%",gradient:null},green:{hsl:"142 71% 45%",darkHsl:"142 76% 36%",gradient:null},orange:{hsl:"25 95% 53%",darkHsl:"20 90% 48%",gradient:null},pink:{hsl:"330 81% 60%",darkHsl:"330 85% 70%",gradient:null},red:{hsl:"0 84% 60%",darkHsl:"0 90% 70%",gradient:null},"gradient-sunset":{hsl:"15 95% 60%",darkHsl:"15 95% 65%",gradient:"linear-gradient(135deg, hsl(25 95% 53%) 0%, hsl(330 81% 60%) 100%)"},"gradient-ocean":{hsl:"200 90% 55%",darkHsl:"200 90% 60%",gradient:"linear-gradient(135deg, hsl(221.2 83.2% 53.3%) 0%, hsl(189 94% 43%) 100%)"},"gradient-forest":{hsl:"150 70% 45%",darkHsl:"150 75% 40%",gradient:"linear-gradient(135deg, hsl(142 71% 45%) 0%, hsl(158 64% 52%) 100%)"},"gradient-aurora":{hsl:"310 85% 65%",darkHsl:"310 90% 70%",gradient:"linear-gradient(135deg, hsl(271 91% 65%) 0%, hsl(330 81% 60%) 100%)"},"gradient-fire":{hsl:"15 95% 55%",darkHsl:"15 95% 60%",gradient:"linear-gradient(135deg, hsl(0 84% 60%) 0%, hsl(25 95% 53%) 100%)"},"gradient-twilight":{hsl:"250 90% 60%",darkHsl:"250 95% 65%",gradient:"linear-gradient(135deg, hsl(239 84% 67%) 0%, hsl(271 91% 65%) 100%)"}}[l];if(c)n.style.setProperty("--primary",c.hsl),c.gradient?(n.style.setProperty("--primary-gradient",c.gradient),n.classList.add("has-gradient")):(n.style.removeProperty("--primary-gradient"),n.classList.remove("has-gradient"));else if(l.startsWith("#")){const u=x=>{x=x.replace("#","");const h=parseInt(x.substring(0,2),16)/255,f=parseInt(x.substring(2,4),16)/255,p=parseInt(x.substring(4,6),16)/255,g=Math.max(h,f,p),N=Math.min(h,f,p);let v=0,y=0;const w=(g+N)/2;if(g!==N){const b=g-N;switch(y=w>.5?b/(2-g-N):b/(g+N),g){case h:v=((f-p)/b+(flocalStorage.getItem("accent-color")||"blue");d.useEffect(()=>{const g=localStorage.getItem("accent-color")||"blue";jg(g)},[]);const p=g=>{f(g),localStorage.setItem("accent-color",g),jg(g)};return e.jsxs("div",{className:"space-y-6 sm:space-y-8",children:[e.jsxs("div",{children:[e.jsx("h3",{className:"text-base sm:text-lg font-semibold mb-3 sm:mb-4",children:"主题模式"}),e.jsxs("div",{className:"grid grid-cols-1 sm:grid-cols-3 gap-3 sm:gap-4",children:[e.jsx(Cm,{value:"light",current:l,onChange:n,label:"浅色",description:"始终使用浅色主题"}),e.jsx(Cm,{value:"dark",current:l,onChange:n,label:"深色",description:"始终使用深色主题"}),e.jsx(Cm,{value:"system",current:l,onChange:n,label:"跟随系统",description:"根据系统设置自动切换"})]})]}),e.jsxs("div",{children:[e.jsx("h3",{className:"text-base sm:text-lg font-semibold mb-3 sm:mb-4",children:"主题色"}),e.jsxs("div",{className:"space-y-3 sm:space-y-4",children:[e.jsxs("div",{children:[e.jsx("h4",{className:"text-xs sm:text-sm font-medium mb-2 sm:mb-3",children:"单色"}),e.jsxs("div",{className:"grid grid-cols-3 sm:grid-cols-6 gap-2 sm:gap-3",children:[e.jsx(Ga,{value:"blue",current:h,onChange:p,label:"蓝色",colorClass:"bg-blue-500"}),e.jsx(Ga,{value:"purple",current:h,onChange:p,label:"紫色",colorClass:"bg-purple-500"}),e.jsx(Ga,{value:"green",current:h,onChange:p,label:"绿色",colorClass:"bg-green-500"}),e.jsx(Ga,{value:"orange",current:h,onChange:p,label:"橙色",colorClass:"bg-orange-500"}),e.jsx(Ga,{value:"pink",current:h,onChange:p,label:"粉色",colorClass:"bg-pink-500"}),e.jsx(Ga,{value:"red",current:h,onChange:p,label:"红色",colorClass:"bg-red-500"})]})]}),e.jsxs("div",{children:[e.jsx("h4",{className:"text-xs sm:text-sm font-medium mb-2 sm:mb-3",children:"渐变色"}),e.jsxs("div",{className:"grid grid-cols-3 sm:grid-cols-6 gap-2 sm:gap-3",children:[e.jsx(Ga,{value:"gradient-sunset",current:h,onChange:p,label:"日落",colorClass:"bg-gradient-to-r from-orange-500 to-pink-500"}),e.jsx(Ga,{value:"gradient-ocean",current:h,onChange:p,label:"海洋",colorClass:"bg-gradient-to-r from-blue-500 to-cyan-500"}),e.jsx(Ga,{value:"gradient-forest",current:h,onChange:p,label:"森林",colorClass:"bg-gradient-to-r from-green-500 to-emerald-500"}),e.jsx(Ga,{value:"gradient-aurora",current:h,onChange:p,label:"极光",colorClass:"bg-gradient-to-r from-purple-500 to-pink-500"}),e.jsx(Ga,{value:"gradient-fire",current:h,onChange:p,label:"烈焰",colorClass:"bg-gradient-to-r from-red-500 to-orange-500"}),e.jsx(Ga,{value:"gradient-twilight",current:h,onChange:p,label:"暮光",colorClass:"bg-gradient-to-r from-indigo-500 to-purple-500"})]})]}),e.jsxs("div",{children:[e.jsx("h4",{className:"text-xs sm:text-sm font-medium mb-2 sm:mb-3",children:"自定义颜色"}),e.jsxs("div",{className:"flex flex-col sm:flex-row gap-3 sm:gap-4",children:[e.jsx("div",{className:"flex-1",children:e.jsx("input",{type:"color",value:h.startsWith("#")?h:"#3b82f6",onChange:g=>p(g.target.value),className:"h-10 sm:h-12 w-full rounded-lg border-2 border-border cursor-pointer",title:"选择自定义颜色"})}),e.jsx("div",{className:"flex-1",children:e.jsx(le,{type:"text",value:h,onChange:g=>p(g.target.value),placeholder:"#3b82f6",className:"font-mono text-sm"})})]}),e.jsx("p",{className:"text-[10px] sm:text-xs text-muted-foreground mt-2",children:"点击色块选择颜色,或手动输入 HEX 颜色代码"})]})]})]}),e.jsxs("div",{children:[e.jsx("h3",{className:"text-base sm:text-lg font-semibold mb-3 sm:mb-4",children:"动画效果"}),e.jsxs("div",{className:"space-y-2 sm:space-y-3",children:[e.jsx("div",{className:"rounded-lg border bg-card p-3 sm:p-4",children:e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsxs("div",{className:"space-y-0.5 flex-1",children:[e.jsx(E,{htmlFor:"animations",className:"text-base font-medium cursor-pointer",children:"启用动画效果"}),e.jsx("p",{className:"text-sm text-muted-foreground",children:"关闭后将禁用所有过渡动画和特效,提升性能"})]}),e.jsx(Fe,{id:"animations",checked:i,onCheckedChange:c})]})}),e.jsx("div",{className:"rounded-lg border bg-card p-4",children:e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsxs("div",{className:"space-y-0.5 flex-1",children:[e.jsx(E,{htmlFor:"waves-background",className:"text-base font-medium cursor-pointer",children:"登录页波浪背景"}),e.jsx("p",{className:"text-sm text-muted-foreground",children:"关闭后登录页将使用纯色背景,适合低性能设备"})]}),e.jsx(Fe,{id:"waves-background",checked:u,onCheckedChange:x})]})})]})]})]})}function q1(){const l=ca(),[n,i]=d.useState(""),[c,u]=d.useState(""),[x,h]=d.useState(!1),[f,p]=d.useState(!1),[g,N]=d.useState(!1),[v,y]=d.useState(!1),[w,b]=d.useState(!1),[R,D]=d.useState(!1),[S,P]=d.useState(""),[M,T]=d.useState(!1),{toast:A}=Zs(),F=d.useMemo(()=>O1(c),[c]),L=async ne=>{if(!n){A({title:"无法复制",description:"Token 存储在安全 Cookie 中,请重新生成以获取新 Token",variant:"destructive"});return}try{await navigator.clipboard.writeText(ne),b(!0),A({title:"复制成功",description:"Token 已复制到剪贴板"}),setTimeout(()=>b(!1),2e3)}catch{A({title:"复制失败",description:"请手动复制 Token",variant:"destructive"})}},J=async()=>{if(!c.trim()){A({title:"输入错误",description:"请输入新的 Token",variant:"destructive"});return}if(!F.isValid){const ne=F.rules.filter(ve=>!ve.passed).map(ve=>ve.label).join(", ");A({title:"格式错误",description:`Token 不符合要求: ${ne}`,variant:"destructive"});return}N(!0);try{const ne=await fetch("/api/webui/auth/update",{method:"POST",headers:{"Content-Type":"application/json"},credentials:"include",body:JSON.stringify({new_token:c.trim()})}),ve=await ne.json();ne.ok&&ve.success?(u(""),i(c.trim()),A({title:"更新成功",description:"Access Token 已更新,即将跳转到登录页"}),setTimeout(()=>{l({to:"/auth"})},1500)):A({title:"更新失败",description:ve.message||"无法更新 Token",variant:"destructive"})}catch(ne){console.error("更新 Token 错误:",ne),A({title:"更新失败",description:"连接服务器失败",variant:"destructive"})}finally{N(!1)}},U=async()=>{y(!0);try{const ne=await fetch("/api/webui/auth/regenerate",{method:"POST",headers:{"Content-Type":"application/json"},credentials:"include"}),ve=await ne.json();ne.ok&&ve.success?(i(ve.token),P(ve.token),D(!0),T(!1),A({title:"生成成功",description:"新的 Access Token 已生成,请及时保存"})):A({title:"生成失败",description:ve.message||"无法生成新 Token",variant:"destructive"})}catch(ne){console.error("生成 Token 错误:",ne),A({title:"生成失败",description:"连接服务器失败",variant:"destructive"})}finally{y(!1)}},ue=async()=>{try{await navigator.clipboard.writeText(S),T(!0),A({title:"复制成功",description:"Token 已复制到剪贴板"})}catch{A({title:"复制失败",description:"请手动复制 Token",variant:"destructive"})}},xe=()=>{D(!1),setTimeout(()=>{P(""),T(!1)},300),setTimeout(()=>{l({to:"/auth"})},500)},he=ne=>{ne||xe()};return e.jsxs("div",{className:"space-y-4 sm:space-y-6",children:[e.jsx(Is,{open:R,onOpenChange:he,children:e.jsxs(Os,{className:"sm:max-w-md",children:[e.jsxs(Ds,{children:[e.jsxs(Rs,{className:"flex items-center gap-2",children:[e.jsx(Jt,{className:"h-5 w-5 text-yellow-500"}),"新的 Access Token"]}),e.jsx(Ks,{children:"这是您的新 Token,请立即保存。关闭此窗口后将跳转到登录页面。"})]}),e.jsxs("div",{className:"space-y-4",children:[e.jsxs("div",{className:"rounded-lg border-2 border-primary/20 bg-primary/5 p-4",children:[e.jsx(E,{className:"text-xs text-muted-foreground mb-2 block",children:"您的新 Token (64位安全令牌)"}),e.jsx("div",{className:"font-mono text-sm break-all select-all bg-background p-3 rounded border",children:S})]}),e.jsx("div",{className:"rounded-lg border border-yellow-200 dark:border-yellow-900 bg-yellow-50 dark:bg-yellow-950/30 p-3",children:e.jsxs("div",{className:"flex gap-2",children:[e.jsx(Jt,{className:"h-4 w-4 text-yellow-600 dark:text-yellow-500 flex-shrink-0 mt-0.5"}),e.jsxs("div",{className:"text-sm text-yellow-800 dark:text-yellow-300 space-y-1",children:[e.jsx("p",{className:"font-semibold",children:"重要提示"}),e.jsxs("ul",{className:"list-disc list-inside space-y-0.5 text-xs",children:[e.jsx("li",{children:"此 Token 仅显示一次,关闭后无法再查看"}),e.jsx("li",{children:"请立即复制并保存到安全的位置"}),e.jsx("li",{children:"关闭窗口后将自动跳转到登录页面"}),e.jsx("li",{children:"请使用新 Token 重新登录系统"})]})]})]})})]}),e.jsxs(st,{className:"gap-2 sm:gap-0",children:[e.jsx(_,{variant:"outline",onClick:ue,className:"gap-2",children:M?e.jsxs(e.Fragment,{children:[e.jsx(Ct,{className:"h-4 w-4 text-green-500"}),"已复制"]}):e.jsxs(e.Fragment,{children:[e.jsx(Ro,{className:"h-4 w-4"}),"复制 Token"]})}),e.jsx(_,{onClick:xe,children:"我已保存,关闭"})]})]})}),e.jsxs("div",{className:"rounded-lg border bg-card p-4 sm:p-6",children:[e.jsx("h3",{className:"text-base sm:text-lg font-semibold mb-3 sm:mb-4",children:"当前 Access Token"}),e.jsx("div",{className:"space-y-3 sm:space-y-4",children:e.jsxs("div",{className:"space-y-2",children:[e.jsx(E,{htmlFor:"current-token",className:"text-sm",children:"您的访问令牌"}),e.jsxs("div",{className:"flex flex-col sm:flex-row gap-2",children:[e.jsxs("div",{className:"relative flex-1",children:[e.jsx(le,{id:"current-token",type:x?"text":"password",value:n||"••••••••••••••••••••••••••••••••",readOnly:!0,className:"pr-10 font-mono text-sm",placeholder:"Token 存储在安全 Cookie 中"}),e.jsx("button",{onClick:()=>{n?h(!x):A({title:"无法查看",description:'Token 存储在安全 Cookie 中,如需新 Token 请点击"重新生成"'})},className:"absolute right-2 top-1/2 -translate-y-1/2 p-1.5 hover:bg-accent rounded",title:x?"隐藏":"显示",children:x?e.jsx(Wi,{className:"h-4 w-4 text-muted-foreground"}):e.jsx(ia,{className:"h-4 w-4 text-muted-foreground"})})]}),e.jsxs("div",{className:"flex gap-2 w-full sm:w-auto",children:[e.jsx(_,{variant:"outline",size:"icon",onClick:()=>L(n),title:"复制到剪贴板",className:"flex-shrink-0",disabled:!n,children:w?e.jsx(Ct,{className:"h-4 w-4 text-green-500"}):e.jsx(Ro,{className:"h-4 w-4"})}),e.jsxs(vs,{children:[e.jsx(wt,{asChild:!0,children:e.jsxs(_,{variant:"outline",disabled:v,className:"gap-2 flex-1 sm:flex-none",children:[e.jsx(dt,{className:I("h-4 w-4",v&&"animate-spin")}),e.jsx("span",{className:"hidden sm:inline",children:"重新生成"}),e.jsx("span",{className:"sm:hidden",children:"生成"})]})}),e.jsxs(ds,{children:[e.jsxs(us,{children:[e.jsx(xs,{children:"确认重新生成 Token"}),e.jsx(hs,{children:"这将生成一个新的 64 位安全令牌,并使当前 Token 立即失效。 您需要使用新 Token 重新登录系统。此操作不可撤销,确定要继续吗?"})]}),e.jsxs(ms,{children:[e.jsx(ps,{children:"取消"}),e.jsx(fs,{onClick:U,children:"确认生成"})]})]})]})]})]}),e.jsx("p",{className:"text-[10px] sm:text-xs text-muted-foreground",children:"请妥善保管您的 Access Token,不要泄露给他人"})]})})]}),e.jsxs("div",{className:"rounded-lg border bg-card p-4 sm:p-6",children:[e.jsx("h3",{className:"text-base sm:text-lg font-semibold mb-3 sm:mb-4",children:"自定义 Access Token"}),e.jsxs("div",{className:"space-y-3 sm:space-y-4",children:[e.jsxs("div",{className:"space-y-2",children:[e.jsx(E,{htmlFor:"new-token",className:"text-sm",children:"新的访问令牌"}),e.jsxs("div",{className:"relative",children:[e.jsx(le,{id:"new-token",type:f?"text":"password",value:c,onChange:ne=>u(ne.target.value),className:"pr-10 font-mono text-sm",placeholder:"输入自定义 Token"}),e.jsx("button",{onClick:()=>p(!f),className:"absolute right-2 top-1/2 -translate-y-1/2 p-1.5 hover:bg-accent rounded",title:f?"隐藏":"显示",children:f?e.jsx(Wi,{className:"h-4 w-4 text-muted-foreground"}):e.jsx(ia,{className:"h-4 w-4 text-muted-foreground"})})]}),c&&e.jsxs("div",{className:"mt-3 space-y-2 p-3 rounded-lg bg-muted/50",children:[e.jsx("p",{className:"text-sm font-medium text-foreground",children:"Token 安全要求:"}),e.jsx("div",{className:"space-y-1.5",children:F.rules.map(ne=>e.jsxs("div",{className:"flex items-center gap-2 text-sm",children:[ne.passed?e.jsx(pt,{className:"h-4 w-4 text-green-500 flex-shrink-0"}):e.jsx(Va,{className:"h-4 w-4 text-muted-foreground flex-shrink-0"}),e.jsx("span",{className:I(ne.passed?"text-green-600 dark:text-green-400":"text-muted-foreground"),children:ne.label})]},ne.id))}),F.isValid&&e.jsx("div",{className:"mt-2 pt-2 border-t border-border",children:e.jsxs("div",{className:"flex items-center gap-2 text-sm text-green-600 dark:text-green-400",children:[e.jsx(Ct,{className:"h-4 w-4"}),e.jsx("span",{className:"font-medium",children:"Token 格式正确,可以使用"})]})})]})]}),e.jsx(_,{onClick:J,disabled:g||!F.isValid||!c,className:"w-full sm:w-auto",children:g?"更新中...":"更新自定义 Token"})]})]}),e.jsxs("div",{className:"rounded-lg border border-yellow-200 dark:border-yellow-900 bg-yellow-50 dark:bg-yellow-950/30 p-3 sm:p-4",children:[e.jsx("h4",{className:"text-sm sm:text-base font-semibold text-yellow-900 dark:text-yellow-200 mb-2",children:"安全提示"}),e.jsxs("ul",{className:"text-xs sm:text-sm text-yellow-800 dark:text-yellow-300 space-y-1 list-disc list-inside",children:[e.jsx("li",{children:"重新生成 Token 会创建系统随机生成的 64 位安全令牌"}),e.jsx("li",{children:"自定义 Token 必须满足所有安全要求才能使用"}),e.jsx("li",{children:"更新 Token 后,旧的 Token 将立即失效"}),e.jsx("li",{children:"请在安全的环境下查看和复制 Token"}),e.jsx("li",{children:"如果怀疑 Token 泄露,请立即重新生成或更新"}),e.jsx("li",{children:"建议使用系统生成的 Token 以获得最高安全性"})]})]})]})}function K1(){const l=ca(),{toast:n}=Zs(),[i,c]=d.useState(!1),[u,x]=d.useState(!1),[h,f]=d.useState(()=>yt("logCacheSize")),[p,g]=d.useState(()=>yt("wsReconnectInterval")),[N,v]=d.useState(()=>yt("wsMaxReconnectAttempts")),[y,w]=d.useState(()=>yt("dataSyncInterval")),[b,R]=d.useState(()=>gg()),[D,S]=d.useState(!1),[P,M]=d.useState(!1),T=d.useRef(null);if(u)throw new Error("这是一个手动触发的测试错误,用于验证错误边界组件是否正常工作。");const A=()=>{R(gg())},F=z=>{const V=z[0];f(V),Ir("logCacheSize",V)},L=z=>{const V=z[0];g(V),Ir("wsReconnectInterval",V)},J=z=>{const V=z[0];v(V),Ir("wsMaxReconnectAttempts",V)},U=z=>{const V=z[0];w(V),Ir("dataSyncInterval",V)},ue=()=>{In.clearLogs(),n({title:"日志已清除",description:"日志缓存已清空"})},xe=()=>{const z=I1();A(),n({title:"缓存已清除",description:`已清除 ${z.clearedKeys.length} 项缓存数据`})},he=()=>{S(!0);try{const z=U1(),V=JSON.stringify(z,null,2),B=new Blob([V],{type:"application/json"}),oe=URL.createObjectURL(B),K=document.createElement("a");K.href=oe,K.download=`maibot-webui-settings-${new Date().toISOString().slice(0,10)}.json`,document.body.appendChild(K),K.click(),document.body.removeChild(K),URL.revokeObjectURL(oe),n({title:"导出成功",description:"设置已导出为 JSON 文件"})}catch(z){console.error("导出设置失败:",z),n({title:"导出失败",description:"无法导出设置",variant:"destructive"})}finally{S(!1)}},ne=z=>{const V=z.target.files?.[0];if(!V)return;M(!0);const B=new FileReader;B.onload=oe=>{try{const K=oe.target?.result,_e=JSON.parse(K),pe=$1(_e);pe.success?(f(yt("logCacheSize")),g(yt("wsReconnectInterval")),v(yt("wsMaxReconnectAttempts")),w(yt("dataSyncInterval")),A(),n({title:"导入成功",description:`成功导入 ${pe.imported.length} 项设置${pe.skipped.length>0?`,跳过 ${pe.skipped.length} 项`:""}`}),(pe.imported.includes("theme")||pe.imported.includes("accentColor"))&&n({title:"提示",description:"部分设置需要刷新页面才能完全生效"})):n({title:"导入失败",description:"没有有效的设置项可导入",variant:"destructive"})}catch(K){console.error("导入设置失败:",K),n({title:"导入失败",description:"文件格式无效",variant:"destructive"})}finally{M(!1),T.current&&(T.current.value="")}},B.readAsText(V)},ve=()=>{B1(),f(cl.logCacheSize),g(cl.wsReconnectInterval),v(cl.wsMaxReconnectAttempts),w(cl.dataSyncInterval),A(),n({title:"已重置",description:"所有设置已恢复为默认值,刷新页面以应用更改"})},je=async()=>{c(!0);try{const z=await we("/api/webui/setup/reset",{method:"POST"}),V=await z.json();z.ok&&V.success?(n({title:"重置成功",description:"即将进入初次配置向导"}),setTimeout(()=>{l({to:"/setup"})},1e3)):n({title:"重置失败",description:V.message||"无法重置配置状态",variant:"destructive"})}catch(z){console.error("重置配置状态错误:",z),n({title:"重置失败",description:"连接服务器失败",variant:"destructive"})}finally{c(!1)}};return e.jsxs("div",{className:"space-y-4 sm:space-y-6",children:[e.jsxs("div",{className:"rounded-lg border bg-card p-4 sm:p-6",children:[e.jsxs("h3",{className:"text-base sm:text-lg font-semibold mb-3 sm:mb-4 flex items-center gap-2",children:[e.jsx(Hr,{className:"h-5 w-5"}),"性能与存储"]}),e.jsxs("div",{className:"space-y-4 sm:space-y-5",children:[e.jsxs("div",{className:"rounded-lg bg-muted/50 p-3 sm:p-4",children:[e.jsxs("div",{className:"flex items-center justify-between mb-2",children:[e.jsxs("span",{className:"text-sm font-medium flex items-center gap-2",children:[e.jsx(Qw,{className:"h-4 w-4"}),"本地存储使用"]}),e.jsx(_,{variant:"ghost",size:"sm",onClick:A,className:"h-7 px-2",children:e.jsx(dt,{className:"h-3 w-3"})})]}),e.jsx("div",{className:"text-2xl font-bold text-primary",children:P1(b.used)}),e.jsxs("p",{className:"text-xs text-muted-foreground mt-1",children:[b.items," 个存储项"]})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsx(E,{className:"text-sm font-medium",children:"日志缓存大小"}),e.jsxs("span",{className:"text-sm text-muted-foreground",children:[h," 条"]})]}),e.jsx(qa,{value:[h],onValueChange:F,min:100,max:5e3,step:100,className:"w-full"}),e.jsx("p",{className:"text-xs text-muted-foreground",children:"控制日志查看器最多缓存的日志条数,较大的值会占用更多内存"})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsx(E,{className:"text-sm font-medium",children:"首页数据刷新间隔"}),e.jsxs("span",{className:"text-sm text-muted-foreground",children:[y," 秒"]})]}),e.jsx(qa,{value:[y],onValueChange:U,min:10,max:120,step:5,className:"w-full"}),e.jsx("p",{className:"text-xs text-muted-foreground",children:"控制首页统计数据的自动刷新间隔"})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsx(E,{className:"text-sm font-medium",children:"WebSocket 重连间隔"}),e.jsxs("span",{className:"text-sm text-muted-foreground",children:[p/1e3," 秒"]})]}),e.jsx(qa,{value:[p],onValueChange:L,min:1e3,max:1e4,step:500,className:"w-full"}),e.jsx("p",{className:"text-xs text-muted-foreground",children:"日志 WebSocket 连接断开后的重连基础间隔"})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsx(E,{className:"text-sm font-medium",children:"WebSocket 最大重连次数"}),e.jsxs("span",{className:"text-sm text-muted-foreground",children:[N," 次"]})]}),e.jsx(qa,{value:[N],onValueChange:J,min:3,max:30,step:1,className:"w-full"}),e.jsx("p",{className:"text-xs text-muted-foreground",children:"连接失败后的最大重连尝试次数"})]}),e.jsxs("div",{className:"flex flex-wrap gap-2 pt-2",children:[e.jsxs(_,{variant:"outline",size:"sm",onClick:ue,className:"gap-2",children:[e.jsx(ls,{className:"h-4 w-4"}),"清除日志缓存"]}),e.jsxs(vs,{children:[e.jsx(wt,{asChild:!0,children:e.jsxs(_,{variant:"outline",size:"sm",className:"gap-2",children:[e.jsx(ls,{className:"h-4 w-4"}),"清除本地缓存"]})}),e.jsxs(ds,{children:[e.jsxs(us,{children:[e.jsx(xs,{children:"确认清除本地缓存"}),e.jsx(hs,{children:"这将清除所有本地缓存的设置和数据(不包括登录凭证)。 您可能需要重新配置部分偏好设置。确定要继续吗?"})]}),e.jsxs(ms,{children:[e.jsx(ps,{children:"取消"}),e.jsx(fs,{onClick:xe,children:"确认清除"})]})]})]})]})]})]}),e.jsxs("div",{className:"rounded-lg border bg-card p-4 sm:p-6",children:[e.jsxs("h3",{className:"text-base sm:text-lg font-semibold mb-3 sm:mb-4 flex items-center gap-2",children:[e.jsx(sa,{className:"h-5 w-5"}),"导入/导出设置"]}),e.jsxs("div",{className:"space-y-4",children:[e.jsx("p",{className:"text-xs sm:text-sm text-muted-foreground",children:"导出当前的界面设置以便备份,或从之前导出的文件中恢复设置。"}),e.jsxs("div",{className:"flex flex-wrap gap-2",children:[e.jsxs(_,{variant:"outline",onClick:he,disabled:D,className:"gap-2",children:[e.jsx(sa,{className:"h-4 w-4"}),D?"导出中...":"导出设置"]}),e.jsx("input",{ref:T,type:"file",accept:".json",onChange:ne,className:"hidden"}),e.jsxs(_,{variant:"outline",onClick:()=>T.current?.click(),disabled:P,className:"gap-2",children:[e.jsx(ec,{className:"h-4 w-4"}),P?"导入中...":"导入设置"]})]}),e.jsx("div",{className:"pt-2 border-t",children:e.jsxs(vs,{children:[e.jsx(wt,{asChild:!0,children:e.jsxs(_,{variant:"outline",size:"sm",className:"gap-2 text-destructive hover:text-destructive",children:[e.jsx(Zi,{className:"h-4 w-4"}),"重置所有设置为默认值"]})}),e.jsxs(ds,{children:[e.jsxs(us,{children:[e.jsx(xs,{children:"确认重置所有设置"}),e.jsx(hs,{children:"这将把所有界面设置恢复为默认值,包括主题、颜色、动画等偏好设置。 此操作不会影响您的登录状态。确定要继续吗?"})]}),e.jsxs(ms,{children:[e.jsx(ps,{children:"取消"}),e.jsx(fs,{onClick:ve,children:"确认重置"})]})]})]})})]})]}),e.jsxs("div",{className:"rounded-lg border bg-card p-4 sm:p-6",children:[e.jsx("h3",{className:"text-base sm:text-lg font-semibold mb-3 sm:mb-4",children:"配置向导"}),e.jsxs("div",{className:"space-y-3 sm:space-y-4",children:[e.jsx("div",{className:"space-y-2",children:e.jsx("p",{className:"text-xs sm:text-sm text-muted-foreground",children:"重新进行初次配置向导,可以帮助您重新设置系统的基础配置。"})}),e.jsxs(vs,{children:[e.jsx(wt,{asChild:!0,children:e.jsxs(_,{variant:"outline",disabled:i,className:"gap-2",children:[e.jsx(Zi,{className:I("h-4 w-4",i&&"animate-spin")}),"重新进行初次配置"]})}),e.jsxs(ds,{children:[e.jsxs(us,{children:[e.jsx(xs,{children:"确认重新配置"}),e.jsx(hs,{children:"这将带您重新进入初次配置向导。您可以重新设置系统的基础配置项。确定要继续吗?"})]}),e.jsxs(ms,{children:[e.jsx(ps,{children:"取消"}),e.jsx(fs,{onClick:je,children:"确认重置"})]})]})]})]})]}),e.jsxs("div",{className:"rounded-lg border border-dashed border-yellow-500/50 bg-yellow-500/5 p-4 sm:p-6",children:[e.jsxs("h3",{className:"text-base sm:text-lg font-semibold mb-3 sm:mb-4 flex items-center gap-2",children:[e.jsx(Jt,{className:"h-5 w-5 text-yellow-500"}),"开发者工具"]}),e.jsxs("div",{className:"space-y-3 sm:space-y-4",children:[e.jsx("div",{className:"space-y-2",children:e.jsx("p",{className:"text-xs sm:text-sm text-muted-foreground",children:"以下功能仅供开发调试使用,可能会导致页面崩溃或异常。"})}),e.jsxs(vs,{children:[e.jsx(wt,{asChild:!0,children:e.jsxs(_,{variant:"destructive",className:"gap-2",children:[e.jsx(Jt,{className:"h-4 w-4"}),"触发测试错误"]})}),e.jsxs(ds,{children:[e.jsxs(us,{children:[e.jsx(xs,{children:"确认触发错误"}),e.jsx(hs,{children:"这将手动触发一个 React 错误,用于测试错误边界组件的显示效果。 页面将显示错误界面,您可以通过刷新页面或点击返回首页来恢复。"})]}),e.jsxs(ms,{children:[e.jsx(ps,{children:"取消"}),e.jsx(fs,{onClick:()=>x(!0),className:"bg-destructive text-destructive-foreground hover:bg-destructive/90",children:"确认触发"})]})]})]})]})]})]})}function Q1(){return e.jsxs("div",{className:"space-y-4 sm:space-y-6",children:[e.jsx("div",{className:"rounded-lg border-2 border-primary/30 bg-gradient-to-r from-primary/5 to-primary/10 p-4 sm:p-6",children:e.jsxs("div",{className:"flex items-start gap-3 sm:gap-4",children:[e.jsx("div",{className:"flex-shrink-0 rounded-lg bg-primary/10 p-2 sm:p-3",children:e.jsx("svg",{className:"h-6 w-6 sm:h-8 sm:w-8 text-primary",fill:"currentColor",viewBox:"0 0 24 24","aria-hidden":"true",children:e.jsx("path",{fillRule:"evenodd",d:"M12 2C6.477 2 2 6.484 2 12.017c0 4.425 2.865 8.18 6.839 9.504.5.092.682-.217.682-.483 0-.237-.008-.868-.013-1.703-2.782.605-3.369-1.343-3.369-1.343-.454-1.158-1.11-1.466-1.11-1.466-.908-.62.069-.608.069-.608 1.003.07 1.531 1.032 1.531 1.032.892 1.53 2.341 1.088 2.91.832.092-.647.35-1.088.636-1.338-2.22-.253-4.555-1.113-4.555-4.951 0-1.093.39-1.988 1.029-2.688-.103-.253-.446-1.272.098-2.65 0 0 .84-.27 2.75 1.026A9.564 9.564 0 0112 6.844c.85.004 1.705.115 2.504.337 1.909-1.296 2.747-1.027 2.747-1.027.546 1.379.202 2.398.1 2.651.64.7 1.028 1.595 1.028 2.688 0 3.848-2.339 4.695-4.566 4.943.359.309.678.92.678 1.855 0 1.338-.012 2.419-.012 2.747 0 .268.18.58.688.482A10.019 10.019 0 0022 12.017C22 6.484 17.522 2 12 2z",clipRule:"evenodd"})})}),e.jsxs("div",{className:"flex-1 min-w-0",children:[e.jsx("h3",{className:"text-lg sm:text-xl font-bold text-foreground mb-2",children:"开源项目"}),e.jsx("p",{className:"text-sm sm:text-base text-muted-foreground mb-3",children:"本项目在 GitHub 开源,欢迎 Star ⭐ 支持!"}),e.jsxs("a",{href:"https://github.com/Mai-with-u/MaiBot-Dashboard",target:"_blank",rel:"noopener noreferrer",className:I("inline-flex items-center gap-2 px-4 py-2 rounded-lg","bg-primary text-primary-foreground font-medium text-sm","hover:bg-primary/90 transition-colors","focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2"),children:[e.jsx("svg",{className:"h-4 w-4",fill:"currentColor",viewBox:"0 0 24 24","aria-hidden":"true",children:e.jsx("path",{fillRule:"evenodd",d:"M12 2C6.477 2 2 6.484 2 12.017c0 4.425 2.865 8.18 6.839 9.504.5.092.682-.217.682-.483 0-.237-.008-.868-.013-1.703-2.782.605-3.369-1.343-3.369-1.343-.454-1.158-1.11-1.466-1.11-1.466-.908-.62.069-.608.069-.608 1.003.07 1.531 1.032 1.531 1.032.892 1.53 2.341 1.088 2.91.832.092-.647.35-1.088.636-1.338-2.22-.253-4.555-1.113-4.555-4.951 0-1.093.39-1.988 1.029-2.688-.103-.253-.446-1.272.098-2.65 0 0 .84-.27 2.75 1.026A9.564 9.564 0 0112 6.844c.85.004 1.705.115 2.504.337 1.909-1.296 2.747-1.027 2.747-1.027.546 1.379.202 2.398.1 2.651.64.7 1.028 1.595 1.028 2.688 0 3.848-2.339 4.695-4.566 4.943.359.309.678.92.678 1.855 0 1.338-.012 2.419-.012 2.747 0 .268.18.58.688.482A10.019 10.019 0 0022 12.017C22 6.484 17.522 2 12 2z",clipRule:"evenodd"})}),"前往 GitHub",e.jsx("svg",{className:"h-4 w-4",fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",children:e.jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M10 6H6a2 2 0 00-2 2v10a2 2 0 002 2h10a2 2 0 002-2v-4M14 4h6m0 0v6m0-6L10 14"})})]})]})]})}),e.jsxs("div",{className:"rounded-lg border bg-card p-4 sm:p-6",children:[e.jsxs("h3",{className:"text-base sm:text-lg font-semibold mb-3 sm:mb-4",children:["关于 ",sx]}),e.jsxs("div",{className:"space-y-2 text-xs sm:text-sm text-muted-foreground",children:[e.jsxs("p",{children:["版本: ",ed]}),e.jsx("p",{children:"麦麦(MaiBot)的现代化 Web 管理界面"})]})]}),e.jsxs("div",{className:"rounded-lg border bg-card p-4 sm:p-6",children:[e.jsx("h3",{className:"text-base sm:text-lg font-semibold mb-3 sm:mb-4",children:"作者"}),e.jsxs("div",{className:"space-y-3",children:[e.jsxs("div",{className:"space-y-1",children:[e.jsx("p",{className:"text-sm font-medium",children:"MaiBot 核心"}),e.jsx("p",{className:"text-xs sm:text-sm text-muted-foreground",children:"Mai-with-u"})]}),e.jsxs("div",{className:"space-y-1",children:[e.jsx("p",{className:"text-sm font-medium",children:"WebUI"}),e.jsxs("p",{className:"text-xs sm:text-sm text-muted-foreground",children:["Mai-with-u ",e.jsx("a",{href:"https://github.com/DrSmoothl",target:"_blank",rel:"noopener noreferrer",className:"text-primary underline",children:"@MotricSeven"})]})]})]})]}),e.jsxs("div",{className:"rounded-lg border bg-card p-4 sm:p-6",children:[e.jsx("h3",{className:"text-base sm:text-lg font-semibold mb-3 sm:mb-4",children:"技术栈"}),e.jsxs("div",{className:"grid grid-cols-1 sm:grid-cols-2 gap-3 text-xs sm:text-sm text-muted-foreground",children:[e.jsxs("div",{className:"space-y-1.5",children:[e.jsx("p",{className:"font-medium text-foreground",children:"前端框架"}),e.jsxs("ul",{className:"space-y-0.5 list-disc list-inside",children:[e.jsx("li",{children:"React 19.2.0"}),e.jsx("li",{children:"TypeScript 5.7.2"}),e.jsx("li",{children:"Vite 6.0.7"}),e.jsx("li",{children:"TanStack Router 1.94.2"})]})]}),e.jsxs("div",{className:"space-y-1.5",children:[e.jsx("p",{className:"font-medium text-foreground",children:"UI 组件"}),e.jsxs("ul",{className:"space-y-0.5 list-disc list-inside",children:[e.jsx("li",{children:"shadcn/ui"}),e.jsx("li",{children:"Radix UI"}),e.jsx("li",{children:"Tailwind CSS 3.4.17"}),e.jsx("li",{children:"Lucide Icons"})]})]}),e.jsxs("div",{className:"space-y-1.5",children:[e.jsx("p",{className:"font-medium text-foreground",children:"后端"}),e.jsxs("ul",{className:"space-y-0.5 list-disc list-inside",children:[e.jsx("li",{children:"Python 3.12+"}),e.jsx("li",{children:"FastAPI"}),e.jsx("li",{children:"Uvicorn"}),e.jsx("li",{children:"WebSocket"})]})]}),e.jsxs("div",{className:"space-y-1.5",children:[e.jsx("p",{className:"font-medium text-foreground",children:"构建工具"}),e.jsxs("ul",{className:"space-y-0.5 list-disc list-inside",children:[e.jsx("li",{children:"Bun / npm"}),e.jsx("li",{children:"ESLint 9.17.0"}),e.jsx("li",{children:"PostCSS"})]})]})]})]}),e.jsxs("div",{className:"rounded-lg border bg-card p-4 sm:p-6",children:[e.jsx("h3",{className:"text-base sm:text-lg font-semibold mb-3 sm:mb-4",children:"开源库感谢"}),e.jsx("p",{className:"text-xs sm:text-sm text-muted-foreground mb-3",children:"本项目使用了以下优秀的开源库,感谢他们的贡献:"}),e.jsx(Ye,{className:"h-[300px] sm:h-[400px]",children:e.jsxs("div",{className:"space-y-4 pr-4",children:[e.jsxs("div",{className:"space-y-2",children:[e.jsx("p",{className:"text-sm font-medium text-foreground",children:"UI 框架与组件"}),e.jsxs("div",{className:"grid gap-2 text-xs sm:text-sm",children:[e.jsx(ft,{name:"React",description:"用户界面构建库",license:"MIT"}),e.jsx(ft,{name:"shadcn/ui",description:"优雅的 React 组件库",license:"MIT"}),e.jsx(ft,{name:"Radix UI",description:"无样式的可访问组件库",license:"MIT"}),e.jsx(ft,{name:"Tailwind CSS",description:"实用优先的 CSS 框架",license:"MIT"}),e.jsx(ft,{name:"Lucide React",description:"精美的图标库",license:"ISC"})]})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsx("p",{className:"text-sm font-medium text-foreground",children:"路由与状态管理"}),e.jsxs("div",{className:"grid gap-2 text-xs sm:text-sm",children:[e.jsx(ft,{name:"TanStack Router",description:"类型安全的路由库",license:"MIT"}),e.jsx(ft,{name:"Zustand",description:"轻量级状态管理",license:"MIT"})]})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsx("p",{className:"text-sm font-medium text-foreground",children:"表单处理"}),e.jsxs("div",{className:"grid gap-2 text-xs sm:text-sm",children:[e.jsx(ft,{name:"React Hook Form",description:"高性能表单库",license:"MIT"}),e.jsx(ft,{name:"Zod",description:"TypeScript 优先的 schema 验证",license:"MIT"})]})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsx("p",{className:"text-sm font-medium text-foreground",children:"工具库"}),e.jsxs("div",{className:"grid gap-2 text-xs sm:text-sm",children:[e.jsx(ft,{name:"clsx",description:"条件 className 构建工具",license:"MIT"}),e.jsx(ft,{name:"tailwind-merge",description:"Tailwind 类名合并工具",license:"MIT"}),e.jsx(ft,{name:"class-variance-authority",description:"组件变体管理",license:"Apache-2.0"}),e.jsx(ft,{name:"date-fns",description:"现代化日期处理库",license:"MIT"})]})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsx("p",{className:"text-sm font-medium text-foreground",children:"动画效果"}),e.jsxs("div",{className:"grid gap-2 text-xs sm:text-sm",children:[e.jsx(ft,{name:"Framer Motion",description:"React 动画库",license:"MIT"}),e.jsx(ft,{name:"vaul",description:"抽屉组件动画",license:"MIT"})]})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsx("p",{className:"text-sm font-medium text-foreground",children:"后端框架"}),e.jsxs("div",{className:"grid gap-2 text-xs sm:text-sm",children:[e.jsx(ft,{name:"FastAPI",description:"现代化 Python Web 框架",license:"MIT"}),e.jsx(ft,{name:"Uvicorn",description:"ASGI 服务器",license:"BSD-3-Clause"}),e.jsx(ft,{name:"Pydantic",description:"数据验证库",license:"MIT"}),e.jsx(ft,{name:"python-multipart",description:"文件上传支持",license:"Apache-2.0"})]})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsx("p",{className:"text-sm font-medium text-foreground",children:"开发工具"}),e.jsxs("div",{className:"grid gap-2 text-xs sm:text-sm",children:[e.jsx(ft,{name:"TypeScript",description:"JavaScript 的超集",license:"Apache-2.0"}),e.jsx(ft,{name:"Vite",description:"下一代前端构建工具",license:"MIT"}),e.jsx(ft,{name:"ESLint",description:"JavaScript 代码检查工具",license:"MIT"}),e.jsx(ft,{name:"PostCSS",description:"CSS 转换工具",license:"MIT"})]})]})]})})]}),e.jsxs("div",{className:"rounded-lg border bg-card p-4 sm:p-6",children:[e.jsx("h3",{className:"text-base sm:text-lg font-semibold mb-3 sm:mb-4",children:"开源许可"}),e.jsxs("div",{className:"space-y-3",children:[e.jsx("div",{className:"rounded-lg bg-primary/5 border border-primary/20 p-3 sm:p-4",children:e.jsxs("div",{className:"flex items-start gap-2 sm:gap-3",children:[e.jsx("div",{className:"flex-shrink-0 mt-0.5",children:e.jsx("div",{className:"rounded-md bg-primary/10 px-2 py-1",children:e.jsx("span",{className:"text-xs sm:text-sm font-bold text-primary",children:"GPLv3"})})}),e.jsxs("div",{className:"flex-1 min-w-0",children:[e.jsx("p",{className:"text-sm sm:text-base font-semibold text-foreground mb-1",children:"MaiBot WebUI"}),e.jsx("p",{className:"text-xs sm:text-sm text-muted-foreground",children:"本项目采用 GNU General Public License v3.0 开源许可证。 您可以自由地使用、修改和分发本软件,但必须保持相同的开源许可。"})]})]})}),e.jsx("p",{className:"text-xs sm:text-sm text-muted-foreground",children:"本项目依赖的所有开源库均遵循各自的开源许可证(MIT、Apache-2.0、BSD 等)。 感谢所有开源贡献者的无私奉献。"})]})]})]})}function ft({name:l,description:n,license:i}){return e.jsxs("div",{className:"flex items-start justify-between gap-2 rounded-lg border bg-muted/30 p-2.5 sm:p-3",children:[e.jsxs("div",{className:"flex-1 min-w-0",children:[e.jsx("p",{className:"font-medium text-foreground truncate",children:l}),e.jsx("p",{className:"text-muted-foreground text-xs mt-0.5",children:n})]}),e.jsx("span",{className:"inline-flex items-center rounded-full bg-primary/10 px-2 py-0.5 text-[10px] font-medium text-primary flex-shrink-0",children:i})]})}function Cm({value:l,current:n,onChange:i,label:c,description:u}){const x=n===l;return e.jsxs("button",{onClick:()=>i(l),className:I("relative rounded-lg border-2 p-3 sm:p-4 text-left transition-all","hover:border-primary/50 hover:bg-accent/50",x?"border-primary bg-accent":"border-border"),children:[x&&e.jsx("div",{className:"absolute top-2 right-2 sm:top-3 sm:right-3 h-2 w-2 rounded-full bg-primary"}),e.jsxs("div",{className:"space-y-1",children:[e.jsx("div",{className:"text-sm sm:text-base font-medium",children:c}),e.jsx("div",{className:"text-[10px] sm:text-xs text-muted-foreground",children:u})]}),e.jsxs("div",{className:"mt-2 sm:mt-3 flex gap-1",children:[l==="light"&&e.jsxs(e.Fragment,{children:[e.jsx("div",{className:"h-2 w-2 rounded-full bg-slate-200"}),e.jsx("div",{className:"h-2 w-2 rounded-full bg-slate-300"}),e.jsx("div",{className:"h-2 w-2 rounded-full bg-slate-400"})]}),l==="dark"&&e.jsxs(e.Fragment,{children:[e.jsx("div",{className:"h-2 w-2 rounded-full bg-slate-700"}),e.jsx("div",{className:"h-2 w-2 rounded-full bg-slate-800"}),e.jsx("div",{className:"h-2 w-2 rounded-full bg-slate-900"})]}),l==="system"&&e.jsxs(e.Fragment,{children:[e.jsx("div",{className:"h-2 w-2 rounded-full bg-gradient-to-r from-slate-200 to-slate-700"}),e.jsx("div",{className:"h-2 w-2 rounded-full bg-gradient-to-r from-slate-300 to-slate-800"}),e.jsx("div",{className:"h-2 w-2 rounded-full bg-gradient-to-r from-slate-400 to-slate-900"})]})]})]})}function Ga({value:l,current:n,onChange:i,label:c,colorClass:u}){const x=n===l;return e.jsxs("button",{onClick:()=>i(l),className:I("relative rounded-lg border-2 p-2 sm:p-3 text-left transition-all","hover:border-primary/50 hover:bg-accent/50",x?"border-primary bg-accent":"border-border"),children:[x&&e.jsx("div",{className:"absolute top-1.5 right-1.5 sm:top-2 sm:right-2 h-1.5 w-1.5 sm:h-2 sm:w-2 rounded-full bg-primary"}),e.jsxs("div",{className:"flex flex-col items-center gap-1.5 sm:gap-2",children:[e.jsx("div",{className:I("h-8 w-8 sm:h-10 sm:w-10 rounded-full",u)}),e.jsx("div",{className:"text-[10px] sm:text-xs font-medium text-center",children:c})]})]})}const Y1=Date.now()%1e6;class J1{grad3;p;perm;constructor(n=0){this.grad3=[[1,1,0],[-1,1,0],[1,-1,0],[-1,-1,0],[1,0,1],[-1,0,1],[1,0,-1],[-1,0,-1],[0,1,1],[0,-1,1],[0,1,-1],[0,-1,-1]],this.p=[];for(let i=0;i<256;i++)this.p[i]=Math.floor(Math.random()*256);this.perm=[];for(let i=0;i<512;i++)this.perm[i]=this.p[i&255]}dot(n,i,c){return n[0]*i+n[1]*c}mix(n,i,c){return(1-c)*n+c*i}fade(n){return n*n*n*(n*(n*6-15)+10)}perlin2(n,i){const c=Math.floor(n)&255,u=Math.floor(i)&255;n-=Math.floor(n),i-=Math.floor(i);const x=this.fade(n),h=this.fade(i),f=this.perm[c]+u,p=this.perm[f],g=this.perm[f+1],N=this.perm[c+1]+u,v=this.perm[N],y=this.perm[N+1];return this.mix(this.mix(this.dot(this.grad3[p%12],n,i),this.dot(this.grad3[v%12],n-1,i),x),this.mix(this.dot(this.grad3[g%12],n,i-1),this.dot(this.grad3[y%12],n-1,i-1),x),h)}}function vg(){const l=d.useRef(null),n=d.useRef(null),i=d.useRef(void 0),[c]=d.useState(()=>new J1(Y1)),u=d.useRef({mouse:{x:-10,y:0,lx:0,ly:0,sx:0,sy:0,v:0,vs:0,a:0,set:!1},lines:[],paths:[],noise:c,bounding:null});return d.useEffect(()=>{const x=n.current,h=l.current;if(!x||!h)return;const f=u.current;f.noise=c;const p=()=>{const D=x.getBoundingClientRect();f.bounding=D,h.style.width=`${D.width}px`,h.style.height=`${D.height}px`},g=()=>{if(!f.bounding)return;const{width:D,height:S}=f.bounding;f.lines=[],f.paths.forEach(ue=>ue.remove()),f.paths=[];const P=10,M=32,T=D+200,A=S+30,F=Math.ceil(T/P),L=Math.ceil(A/M),J=(D-P*F)/2,U=(S-M*L)/2;for(let ue=0;ue<=F;ue++){const xe=[];for(let ne=0;ne<=L;ne++){const ve={x:J+P*ue,y:U+M*ne,wave:{x:0,y:0},cursor:{x:0,y:0,vx:0,vy:0}};xe.push(ve)}const he=document.createElementNS("http://www.w3.org/2000/svg","path");h.appendChild(he),f.paths.push(he),f.lines.push(xe)}},N=D=>{const{lines:S,mouse:P,noise:M}=f;S.forEach(T=>{T.forEach(A=>{const F=M.perlin2((A.x+D*.0125)*.002,(A.y+D*.005)*.0015)*12;A.wave.x=Math.cos(F)*32,A.wave.y=Math.sin(F)*16;const L=A.x-P.sx,J=A.y-P.sy,U=Math.hypot(L,J),ue=Math.max(175,P.vs);if(U{const P={x:D.x+D.wave.x+(S?D.cursor.x:0),y:D.y+D.wave.y+(S?D.cursor.y:0)};return P.x=Math.round(P.x*10)/10,P.y=Math.round(P.y*10)/10,P},y=()=>{const{lines:D,paths:S}=f;D.forEach((P,M)=>{let T=v(P[0],!1),A=`M ${T.x} ${T.y}`;P.forEach((F,L)=>{const J=L===P.length-1;T=v(F,!J),A+=`L ${T.x} ${T.y}`}),S[M].setAttribute("d",A)})},w=D=>{const{mouse:S}=f;S.sx+=(S.x-S.sx)*.1,S.sy+=(S.y-S.sy)*.1;const P=S.x-S.lx,M=S.y-S.ly,T=Math.hypot(P,M);S.v=T,S.vs+=(T-S.vs)*.1,S.vs=Math.min(100,S.vs),S.lx=S.x,S.ly=S.y,S.a=Math.atan2(M,P),x&&(x.style.setProperty("--x",`${S.sx}px`),x.style.setProperty("--y",`${S.sy}px`)),N(D),y(),i.current=requestAnimationFrame(w)},b=D=>{if(!f.bounding)return;const{mouse:S}=f;S.x=D.pageX-f.bounding.left,S.y=D.pageY-f.bounding.top+window.scrollY,S.set||(S.sx=S.x,S.sy=S.y,S.lx=S.x,S.ly=S.y,S.set=!0)},R=()=>{p(),g()};return p(),g(),window.addEventListener("resize",R),window.addEventListener("mousemove",b),i.current=requestAnimationFrame(w),()=>{window.removeEventListener("resize",R),window.removeEventListener("mousemove",b),i.current&&cancelAnimationFrame(i.current)}},[c]),e.jsxs("div",{ref:n,className:"waves-background",style:{position:"absolute",top:0,left:0,width:"100%",height:"100%",overflow:"hidden",pointerEvents:"none"},children:[e.jsx("div",{className:"waves-cursor",style:{position:"absolute",top:0,left:0,width:"0.5rem",height:"0.5rem",background:"hsl(var(--primary) / 0.3)",borderRadius:"50%",transform:"translate3d(calc(var(--x, -0.5rem) - 50%), calc(var(--y, 50%) - 50%), 0)",willChange:"transform",pointerEvents:"none"}}),e.jsx("svg",{ref:l,style:{display:"block",width:"100%",height:"100%"},children:e.jsx("style",{children:` path { fill: none; stroke: hsl(var(--primary) / 0.20); stroke-width: 1px; } - `})})]})}function X1(){const[l,n]=d.useState(""),[i,c]=d.useState(!1),[u,x]=d.useState(""),[h,f]=d.useState(!0),p=ca(),{enableWavesBackground:g,setEnableWavesBackground:N}=uv(),{theme:v,setTheme:y}=ex();d.useEffect(()=>{(async()=>{try{await tc()&&p({to:"/"})}catch{}finally{f(!1)}})()},[p]);const b=v==="system"?window.matchMedia("(prefers-color-scheme: dark)").matches?"dark":"light":v,R=()=>{y(b==="dark"?"light":"dark")},D=async S=>{if(S.preventDefault(),x(""),!l.trim()){x("请输入 Access Token");return}c(!0),console.log("开始验证 token...");try{const P=await fetch("/api/webui/auth/verify",{method:"POST",headers:{"Content-Type":"application/json"},credentials:"include",body:JSON.stringify({token:l.trim()})});console.log("Token 验证响应状态:",P.status);const M=await P.json();if(console.log("Token 验证响应数据:",M),P.ok&&M.valid){console.log("Token 验证成功,准备跳转..."),console.log("is_first_setup:",M.is_first_setup),await new Promise(A=>setTimeout(A,100));const T=await tc();console.log("跳转前认证状态检查:",T),M.is_first_setup?(console.log("跳转到首次配置页面"),p({to:"/setup"})):(console.log("跳转到首页"),p({to:"/"}))}else console.error("Token 验证失败:",M.message),x(M.message||"Token 验证失败,请检查后重试")}catch(P){console.error("Token 验证错误:",P),x("连接服务器失败,请检查网络连接")}finally{c(!1)}};return h?e.jsxs("div",{className:"relative flex min-h-screen items-center justify-center overflow-hidden bg-background p-4",children:[g&&e.jsx(vg,{}),e.jsx("div",{className:"text-muted-foreground",children:"正在检查登录状态..."})]}):e.jsxs("div",{className:"relative flex min-h-screen items-center justify-center overflow-hidden bg-background p-4",children:[g&&e.jsx(vg,{}),e.jsxs(Ce,{className:"relative z-10 w-full max-w-md shadow-2xl backdrop-blur-xl bg-card/80 border-border/50",children:[e.jsx("button",{onClick:R,className:"absolute right-4 top-4 rounded-lg p-2 hover:bg-accent transition-colors z-10 text-foreground",title:b==="dark"?"切换到浅色模式":"切换到深色模式",children:b==="dark"?e.jsx(qm,{className:"h-5 w-5",strokeWidth:2.5,fill:"none"}):e.jsx(Qi,{className:"h-5 w-5",strokeWidth:2.5,fill:"none"})}),e.jsxs(De,{className:"space-y-4 text-center",children:[e.jsx("div",{className:"mx-auto flex h-16 w-16 items-center justify-center rounded-2xl bg-primary/10",children:e.jsx(rg,{className:"h-8 w-8 text-primary",strokeWidth:2,fill:"none"})}),e.jsxs("div",{className:"space-y-2",children:[e.jsx(Le,{className:"text-2xl font-bold",children:"欢迎使用 MaiBot"}),e.jsx(ws,{className:"text-base",children:"请输入您的 Access Token 以继续访问系统"})]})]}),e.jsx(Ae,{children:e.jsxs("form",{onSubmit:D,className:"space-y-4",children:[e.jsxs("div",{className:"space-y-2",children:[e.jsx(E,{htmlFor:"token",className:"text-sm font-medium",children:"Access Token"}),e.jsxs("div",{className:"relative",children:[e.jsx(Km,{className:"absolute left-3 top-1/2 h-4 w-4 -translate-y-1/2 text-muted-foreground",strokeWidth:2,fill:"none"}),e.jsx(le,{id:"token",type:"password",placeholder:"请输入您的 Access Token",value:l,onChange:S=>n(S.target.value),className:I("pl-10",u&&"border-red-500 focus-visible:ring-red-500"),disabled:i,autoFocus:!0,autoComplete:"off"})]})]}),u&&e.jsxs("div",{className:"flex items-center gap-2 rounded-md bg-red-50 p-3 text-sm text-red-600 dark:bg-red-950/50 dark:text-red-400",children:[e.jsx(wt,{className:"h-4 w-4 flex-shrink-0",strokeWidth:2,fill:"none"}),e.jsx("span",{children:u})]}),e.jsx(_,{type:"submit",className:"w-full",disabled:i,children:i?e.jsxs(e.Fragment,{children:[e.jsx("div",{className:"mr-2 h-4 w-4 animate-spin rounded-full border-2 border-current border-t-transparent"}),"验证中..."]}):"验证并进入"}),e.jsxs(Is,{children:[e.jsx(Wo,{asChild:!0,children:e.jsxs("button",{className:"w-full text-center text-sm text-primary hover:text-primary/80 transition-colors underline-offset-4 hover:underline flex items-center justify-center gap-1",children:[e.jsx(Dj,{className:"h-4 w-4",strokeWidth:2,fill:"none"}),"我没有 Token,我该去哪里获得 Token?"]})}),e.jsxs(Os,{className:"sm:max-w-md",children:[e.jsxs(Ds,{children:[e.jsxs(Rs,{className:"flex items-center gap-2",children:[e.jsx(rg,{className:"h-5 w-5 text-primary",strokeWidth:2,fill:"none"}),"如何获取 Access Token"]}),e.jsx(Ks,{children:"Access Token 是访问 MaiBot WebUI 的唯一凭证,请按以下方式获取"})]}),e.jsxs("div",{className:"space-y-4",children:[e.jsx("div",{className:"rounded-lg border bg-muted/50 p-4 space-y-2",children:e.jsxs("div",{className:"flex items-start gap-3",children:[e.jsx(Yw,{className:"h-5 w-5 text-primary flex-shrink-0 mt-0.5",strokeWidth:2,fill:"none"}),e.jsxs("div",{className:"flex-1 space-y-2",children:[e.jsx("h4",{className:"font-semibold text-sm",children:"方式一:查看启动日志"}),e.jsx("p",{className:"text-sm text-muted-foreground",children:"在 MaiBot 启动时,控制台会显示 WebUI Access Token。"}),e.jsxs("div",{className:"rounded bg-background p-2 font-mono text-xs",children:[e.jsx("p",{className:"text-muted-foreground",children:"🔑 WebUI Access Token: abc123..."}),e.jsx("p",{className:"text-muted-foreground",children:"💡 请使用此 Token 登录 WebUI"})]})]})]})}),e.jsx("div",{className:"rounded-lg border bg-muted/50 p-4 space-y-2",children:e.jsxs("div",{className:"flex items-start gap-3",children:[e.jsx(ka,{className:"h-5 w-5 text-primary flex-shrink-0 mt-0.5",strokeWidth:2,fill:"none"}),e.jsxs("div",{className:"flex-1 space-y-2",children:[e.jsx("h4",{className:"font-semibold text-sm",children:"方式二:查看配置文件"}),e.jsx("p",{className:"text-sm text-muted-foreground",children:"Token 保存在项目根目录的配置文件中:"}),e.jsx("div",{className:"rounded bg-background p-2 font-mono text-xs break-all",children:e.jsx("code",{className:"text-primary",children:"data/webui.json"})}),e.jsxs("p",{className:"text-xs text-muted-foreground",children:["打开此文件,复制 ",e.jsx("code",{className:"px-1 py-0.5 bg-background rounded",children:"access_token"})," 字段的值"]})]})]})}),e.jsx("div",{className:"rounded-lg border border-yellow-200 dark:border-yellow-900 bg-yellow-50 dark:bg-yellow-950/30 p-3",children:e.jsxs("div",{className:"flex gap-2",children:[e.jsx(wt,{className:"h-4 w-4 text-yellow-600 dark:text-yellow-500 flex-shrink-0 mt-0.5",strokeWidth:2,fill:"none"}),e.jsxs("div",{className:"text-sm text-yellow-800 dark:text-yellow-300 space-y-1",children:[e.jsx("p",{className:"font-semibold",children:"安全提示"}),e.jsxs("ul",{className:"list-disc list-inside space-y-0.5 text-xs",children:[e.jsx("li",{children:"请妥善保管您的 Token,不要泄露给他人"}),e.jsx("li",{children:"如需重置 Token,请在登录后前往系统设置"})]})]})]})})]})]})]}),e.jsxs(vs,{children:[e.jsx(yt,{asChild:!0,children:e.jsxs("button",{className:"w-full text-center text-sm text-muted-foreground hover:text-foreground transition-colors underline-offset-4 hover:underline flex items-center justify-center gap-1",children:[e.jsx(Za,{className:"h-4 w-4",strokeWidth:2,fill:"none"}),"我觉得这个界面很卡怎么办?"]})}),e.jsxs(ds,{children:[e.jsxs(us,{children:[e.jsxs(xs,{className:"flex items-center gap-2",children:[e.jsx(Za,{className:"h-5 w-5 text-primary",strokeWidth:2,fill:"none"}),"关闭背景动画"]}),e.jsx(hs,{children:"背景动画可能会在低性能设备上造成卡顿。关闭动画可以显著提升界面流畅度。"})]}),e.jsx("div",{className:"rounded-lg border bg-muted/50 p-4 space-y-2",children:e.jsx("p",{className:"text-sm text-muted-foreground",children:"关闭动画后,背景将变为纯色,但不影响任何功能的使用。您可以随时在系统设置中重新开启动画。"})}),e.jsxs(ms,{children:[e.jsx(ps,{children:"取消"}),e.jsx(fs,{onClick:()=>N(!1),children:"关闭动画"})]})]})]})]})})]}),e.jsx("div",{className:"absolute bottom-4 left-0 right-0 text-center text-xs text-muted-foreground",children:e.jsx("p",{children:D1})})]})}const ot=d.forwardRef(({className:l,...n},i)=>e.jsx("textarea",{className:I("flex min-h-[60px] w-full rounded-md border border-input bg-transparent px-3 py-2 text-base shadow-sm placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:cursor-not-allowed disabled:opacity-50 md:text-sm",l),ref:i,...n}));ot.displayName="Textarea";const Yt=d.forwardRef(({className:l,orientation:n="horizontal",decorative:i=!0,...c},u)=>e.jsx(ej,{ref:u,decorative:i,orientation:n,className:I("shrink-0 bg-border",n==="horizontal"?"h-[1px] w-full":"h-full w-[1px]",l),...c}));Yt.displayName=ej.displayName;function Z1({config:l,onChange:n}){const i=u=>{u.trim()&&!l.alias_names.includes(u.trim())&&n({...l,alias_names:[...l.alias_names,u.trim()]})},c=u=>{n({...l,alias_names:l.alias_names.filter((x,h)=>h!==u)})};return e.jsxs("div",{className:"space-y-6",children:[e.jsxs("div",{className:"space-y-3",children:[e.jsx(E,{htmlFor:"qq_account",children:"QQ账号 *"}),e.jsx(le,{id:"qq_account",type:"number",placeholder:"请输入机器人的QQ账号",value:l.qq_account||"",onChange:u=>n({...l,qq_account:Number(u.target.value)})}),e.jsx("p",{className:"text-xs text-muted-foreground",children:"机器人登录使用的QQ账号"})]}),e.jsxs("div",{className:"space-y-3",children:[e.jsx(E,{htmlFor:"nickname",children:"昵称 *"}),e.jsx(le,{id:"nickname",placeholder:"请输入机器人的昵称",value:l.nickname,onChange:u=>n({...l,nickname:u.target.value})}),e.jsx("p",{className:"text-xs text-muted-foreground",children:"机器人的主要称呼名称"})]}),e.jsxs("div",{className:"space-y-3",children:[e.jsx(E,{children:"别名"}),e.jsx("div",{className:"flex flex-wrap gap-2 mb-2",children:l.alias_names.map((u,x)=>e.jsxs(Se,{variant:"secondary",className:"gap-1",children:[u,e.jsx("button",{type:"button",onClick:()=>c(x),className:"ml-1 hover:text-destructive",children:e.jsx(Ta,{className:"h-3 w-3"})})]},x))}),e.jsxs("div",{className:"flex gap-2",children:[e.jsx(le,{id:"alias_input",placeholder:"输入别名后按回车添加",onKeyPress:u=>{u.key==="Enter"&&(i(u.target.value),u.target.value="")}}),e.jsx(_,{type:"button",variant:"outline",onClick:()=>{const u=document.getElementById("alias_input");u&&(i(u.value),u.value="")},children:"添加"})]}),e.jsx("p",{className:"text-xs text-muted-foreground",children:"机器人的其他称呼,可以添加多个"})]})]})}function W1({config:l,onChange:n}){return e.jsxs("div",{className:"space-y-6",children:[e.jsxs("div",{className:"space-y-3",children:[e.jsx(E,{htmlFor:"personality",children:"人格特征 *"}),e.jsx(ot,{id:"personality",placeholder:"描述机器人的人格特质和身份特征(建议120字以内)",value:l.personality,onChange:i=>n({...l,personality:i.target.value}),rows:3}),e.jsx("p",{className:"text-xs text-muted-foreground",children:"例如:是一个女大学生,现在在读大二,会刷贴吧"})]}),e.jsxs("div",{className:"space-y-3",children:[e.jsx(E,{htmlFor:"reply_style",children:"表达风格 *"}),e.jsx(ot,{id:"reply_style",placeholder:"描述机器人说话的表达风格、表达习惯",value:l.reply_style,onChange:i=>n({...l,reply_style:i.target.value}),rows:3}),e.jsx("p",{className:"text-xs text-muted-foreground",children:"例如:回复平淡一些,简短一些,说中文,参考贴吧、知乎和微博的回复风格"})]}),e.jsxs("div",{className:"space-y-3",children:[e.jsx(E,{htmlFor:"interest",children:"兴趣 *"}),e.jsx(ot,{id:"interest",placeholder:"描述机器人感兴趣的话题",value:l.interest,onChange:i=>n({...l,interest:i.target.value}),rows:2}),e.jsx("p",{className:"text-xs text-muted-foreground",children:"会影响机器人对什么话题进行回复"})]}),e.jsx(Yt,{}),e.jsxs("div",{className:"space-y-3",children:[e.jsx(E,{htmlFor:"plan_style",children:"群聊说话规则 *"}),e.jsx(ot,{id:"plan_style",placeholder:"机器人在群聊中的行为风格和规则",value:l.plan_style,onChange:i=>n({...l,plan_style:i.target.value}),rows:4}),e.jsx("p",{className:"text-xs text-muted-foreground",children:"定义机器人在群聊中如何行动,例如回复频率、条件等"})]}),e.jsxs("div",{className:"space-y-3",children:[e.jsx(E,{htmlFor:"private_plan_style",children:"私聊说话规则 *"}),e.jsx(ot,{id:"private_plan_style",placeholder:"机器人在私聊中的行为风格和规则",value:l.private_plan_style,onChange:i=>n({...l,private_plan_style:i.target.value}),rows:3}),e.jsx("p",{className:"text-xs text-muted-foreground",children:"定义机器人在私聊中的行为方式"})]})]})}function e2({config:l,onChange:n}){return e.jsxs("div",{className:"space-y-6",children:[e.jsxs("div",{className:"space-y-3",children:[e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsx(E,{htmlFor:"emoji_chance",children:"表情包激活概率"}),e.jsxs("span",{className:"text-sm text-muted-foreground",children:[(l.emoji_chance*100).toFixed(0),"%"]})]}),e.jsx(le,{id:"emoji_chance",type:"range",min:"0",max:"1",step:"0.1",value:l.emoji_chance,onChange:i=>n({...l,emoji_chance:Number(i.target.value)})}),e.jsx("p",{className:"text-xs text-muted-foreground",children:"机器人发送表情包的概率"})]}),e.jsxs("div",{className:"space-y-3",children:[e.jsx(E,{htmlFor:"max_reg_num",children:"最大表情包数量"}),e.jsx(le,{id:"max_reg_num",type:"number",min:"1",max:"200",value:l.max_reg_num,onChange:i=>n({...l,max_reg_num:Number(i.target.value)})}),e.jsx("p",{className:"text-xs text-muted-foreground",children:"机器人最多保存的表情包数量"})]}),e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsxs("div",{className:"space-y-1",children:[e.jsx(E,{htmlFor:"do_replace",children:"达到最大数量时替换"}),e.jsx("p",{className:"text-xs text-muted-foreground",children:"开启后会删除旧表情包,关闭则不再收集新表情包"})]}),e.jsx(Fe,{id:"do_replace",checked:l.do_replace,onCheckedChange:i=>n({...l,do_replace:i})})]}),e.jsxs("div",{className:"space-y-3",children:[e.jsx(E,{htmlFor:"check_interval",children:"检查间隔(分钟)"}),e.jsx(le,{id:"check_interval",type:"number",min:"1",max:"120",value:l.check_interval,onChange:i=>n({...l,check_interval:Number(i.target.value)})}),e.jsx("p",{className:"text-xs text-muted-foreground",children:"检查表情包注册、破损、删除的时间间隔"})]}),e.jsx(Yt,{}),e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsxs("div",{className:"space-y-1",children:[e.jsx(E,{htmlFor:"steal_emoji",children:"偷取表情包"}),e.jsx("p",{className:"text-xs text-muted-foreground",children:"允许机器人将一些表情包据为己有"})]}),e.jsx(Fe,{id:"steal_emoji",checked:l.steal_emoji,onCheckedChange:i=>n({...l,steal_emoji:i})})]}),e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsxs("div",{className:"space-y-1",children:[e.jsx(E,{htmlFor:"content_filtration",children:"启用表情包过滤"}),e.jsx("p",{className:"text-xs text-muted-foreground",children:"只保存符合要求的表情包"})]}),e.jsx(Fe,{id:"content_filtration",checked:l.content_filtration,onCheckedChange:i=>n({...l,content_filtration:i})})]}),l.content_filtration&&e.jsxs("div",{className:"space-y-3",children:[e.jsx(E,{htmlFor:"filtration_prompt",children:"过滤要求"}),e.jsx(le,{id:"filtration_prompt",placeholder:"例如:符合公序良俗",value:l.filtration_prompt,onChange:i=>n({...l,filtration_prompt:i.target.value})}),e.jsx("p",{className:"text-xs text-muted-foreground",children:"描述表情包应该符合的要求"})]})]})}function s2({config:l,onChange:n}){return e.jsxs("div",{className:"space-y-6",children:[e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsxs("div",{className:"space-y-1",children:[e.jsx(E,{htmlFor:"enable_tool",children:"启用工具系统"}),e.jsx("p",{className:"text-xs text-muted-foreground",children:"允许机器人使用各种工具增强功能"})]}),e.jsx(Fe,{id:"enable_tool",checked:l.enable_tool,onCheckedChange:i=>n({...l,enable_tool:i})})]}),e.jsx(Yt,{}),e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsxs("div",{className:"space-y-1",children:[e.jsx(E,{htmlFor:"all_global",children:"启用全局黑话模式"}),e.jsx("p",{className:"text-xs text-muted-foreground",children:"允许机器人学习和使用群组黑话"})]}),e.jsx(Fe,{id:"all_global",checked:l.all_global,onCheckedChange:i=>n({...l,all_global:i})})]})]})}function t2({config:l,onChange:n}){const[i,c]=d.useState(!1);return e.jsxs("div",{className:"space-y-6",children:[e.jsx("div",{className:"rounded-lg bg-blue-50 dark:bg-blue-950/30 border border-blue-200 dark:border-blue-800 p-4",children:e.jsxs("div",{className:"flex items-start gap-3",children:[e.jsx("div",{className:"mt-0.5",children:e.jsx("svg",{className:"h-5 w-5 text-blue-600 dark:text-blue-400",fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",children:e.jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z"})})}),e.jsxs("div",{className:"flex-1 text-sm",children:[e.jsx("p",{className:"font-medium text-blue-900 dark:text-blue-100 mb-1",children:"关于硅基流动 (SiliconFlow)"}),e.jsx("p",{className:"text-blue-700 dark:text-blue-300 mb-2",children:"硅基流动提供了完整的模型覆盖,包括 DeepSeek V3、Qwen、视觉模型、语音识别和嵌入模型。 只需一个 API Key 即可使用麦麦的所有功能!"}),e.jsxs("a",{href:"https://cloud.siliconflow.cn",target:"_blank",rel:"noopener noreferrer",className:"inline-flex items-center gap-1 text-blue-600 dark:text-blue-400 hover:underline font-medium",children:["前往硅基流动获取 API Key",e.jsx(Mo,{className:"h-3 w-3"})]})]})]})}),e.jsxs("div",{className:"space-y-3",children:[e.jsx(E,{htmlFor:"siliconflow_api_key",children:"SiliconFlow API Key *"}),e.jsxs("div",{className:"relative",children:[e.jsx(le,{id:"siliconflow_api_key",type:i?"text":"password",placeholder:"sk-...",value:l.api_key,onChange:u=>n({api_key:u.target.value}),className:"font-mono pr-10"}),e.jsx(_,{type:"button",variant:"ghost",size:"sm",className:"absolute right-0 top-0 h-full px-3 hover:bg-transparent",onClick:()=>c(!i),children:i?e.jsx(Wi,{className:"h-4 w-4 text-muted-foreground"}):e.jsx(ia,{className:"h-4 w-4 text-muted-foreground"})})]}),e.jsx("p",{className:"text-xs text-muted-foreground",children:"请输入您的硅基流动 API 密钥。获取后,麦麦将自动配置所有必需的模型。"})]}),e.jsxs("div",{className:"rounded-lg bg-muted/50 p-4 text-sm space-y-2",children:[e.jsx("p",{className:"font-medium",children:"将自动配置以下模型:"}),e.jsxs("ul",{className:"list-disc list-inside space-y-1 text-muted-foreground ml-2",children:[e.jsx("li",{children:"DeepSeek V3 - 主要对话和工具模型"}),e.jsx("li",{children:"Qwen3 30B - 高频小任务和工具调用"}),e.jsx("li",{children:"Qwen3 VL 30B - 图像识别"}),e.jsx("li",{children:"SenseVoice - 语音识别"}),e.jsx("li",{children:"BGE-M3 - 文本嵌入"}),e.jsx("li",{children:"知识库相关模型 (LPMM)"})]})]}),e.jsx("div",{className:"rounded-lg border border-amber-200 dark:border-amber-800 bg-amber-50 dark:bg-amber-950/30 p-4",children:e.jsxs("p",{className:"text-sm text-amber-900 dark:text-amber-100",children:[e.jsx("span",{className:"font-medium",children:"💡 提示:"}),'完成向导后,您可以在"系统设置 → 模型配置"中添加更多 API 提供商和模型。']})})]})}async function a2(){const l=await we("/api/webui/config/bot",{method:"GET",headers:Fs()});if(!l.ok)throw new Error("读取Bot配置失败");const i=(await l.json()).config.bot||{};return{qq_account:i.qq_account||0,nickname:i.nickname||"",alias_names:i.alias_names||[]}}async function l2(){const l=await we("/api/webui/config/bot",{method:"GET",headers:Fs()});if(!l.ok)throw new Error("读取人格配置失败");const i=(await l.json()).config.personality||{};return{personality:i.personality||"",reply_style:i.reply_style||"",interest:i.interest||"",plan_style:i.plan_style||"",private_plan_style:i.private_plan_style||""}}async function n2(){const l=await we("/api/webui/config/bot",{method:"GET",headers:Fs()});if(!l.ok)throw new Error("读取表情包配置失败");const i=(await l.json()).config.emoji||{};return{emoji_chance:i.emoji_chance??.4,max_reg_num:i.max_reg_num??40,do_replace:i.do_replace??!0,check_interval:i.check_interval??10,steal_emoji:i.steal_emoji??!0,content_filtration:i.content_filtration??!1,filtration_prompt:i.filtration_prompt||""}}async function r2(){const l=await we("/api/webui/config/bot",{method:"GET",headers:Fs()});if(!l.ok)throw new Error("读取其他配置失败");const i=(await l.json()).config,c=i.tool||{},u=i.expression||{};return{enable_tool:c.enable_tool??!0,all_global:u.all_global_jargon??!0}}async function i2(){const l=await we("/api/webui/config/model",{method:"GET",headers:Fs()});if(!l.ok)throw new Error("读取模型配置失败");return{api_key:((await l.json()).config.api_providers||[]).find(x=>x.name==="SiliconFlow")?.api_key||""}}async function c2(l){const n=await we("/api/webui/config/bot/section/bot",{method:"POST",headers:Fs(),body:JSON.stringify(l)});if(!n.ok){const i=await n.json();throw new Error(i.detail||"保存Bot基础配置失败")}return await n.json()}async function o2(l){const n=await we("/api/webui/config/bot/section/personality",{method:"POST",headers:Fs(),body:JSON.stringify(l)});if(!n.ok){const i=await n.json();throw new Error(i.detail||"保存人格配置失败")}return await n.json()}async function d2(l){const n=await we("/api/webui/config/bot/section/emoji",{method:"POST",headers:Fs(),body:JSON.stringify(l)});if(!n.ok){const i=await n.json();throw new Error(i.detail||"保存表情包配置失败")}return await n.json()}async function u2(l){const n=[];n.push(we("/api/webui/config/bot/section/tool",{method:"POST",headers:Fs(),body:JSON.stringify({enable_tool:l.enable_tool})})),n.push(we("/api/webui/config/bot/section/expression",{method:"POST",headers:Fs(),body:JSON.stringify({all_global_jargon:l.all_global})}));const i=await Promise.all(n);for(const c of i)if(!c.ok){const u=await c.json();throw new Error(u.detail||"保存其他配置失败")}return{success:!0}}async function m2(l){const n=await we("/api/webui/config/model",{method:"GET",headers:Fs()});if(!n.ok)throw new Error("读取模型配置失败");const c=(await n.json()).config,u=c.api_providers||[],x=u.findIndex(p=>p.name==="SiliconFlow");x>=0?u[x]={...u[x],api_key:l.api_key}:u.push({name:"SiliconFlow",base_url:"https://api.siliconflow.cn/v1",api_key:l.api_key,client_type:"openai",max_retry:3,timeout:120,retry_interval:5});const h={...c,api_providers:u},f=await we("/api/webui/config/model",{method:"POST",headers:Fs(),body:JSON.stringify(h)});if(!f.ok){const p=await f.json();throw new Error(p.detail||"保存模型配置失败")}return await f.json()}async function Ng(){const l=await we("/api/webui/setup/complete",{method:"POST"});if(!l.ok){const n=await l.json();throw new Error(n.message||"标记配置完成失败")}return await l.json()}function x2(){return e.jsx(Yn,{children:e.jsx(h2,{})})}function h2(){const l=ca(),{toast:n}=Zs(),{triggerRestart:i}=vn(),[c,u]=d.useState(0),[x,h]=d.useState(!1),[f,p]=d.useState(!1),[g,N]=d.useState(!0),[v,y]=d.useState({qq_account:0,nickname:"",alias_names:[]}),[w,b]=d.useState({personality:"是一个女大学生,现在在读大二,会刷贴吧。",reply_style:"请回复的平淡一些,简短一些,说中文,不要刻意突出自身学科背景。可以参考贴吧,知乎和微博的回复风格。",interest:"对技术相关话题,游戏和动漫相关话题感兴趣,也对日常话题感兴趣,不喜欢太过沉重严肃的话题",plan_style:`1.思考**所有**的可用的action中的**每个动作**是否符合当下条件,如果动作使用条件符合聊天内容就使用 + `})})]})}function X1(){const[l,n]=d.useState(""),[i,c]=d.useState(!1),[u,x]=d.useState(""),[h,f]=d.useState(!0),p=ca(),{enableWavesBackground:g,setEnableWavesBackground:N}=uv(),{theme:v,setTheme:y}=ex();d.useEffect(()=>{(async()=>{try{await tc()&&p({to:"/"})}catch{}finally{f(!1)}})()},[p]);const b=v==="system"?window.matchMedia("(prefers-color-scheme: dark)").matches?"dark":"light":v,R=()=>{y(b==="dark"?"light":"dark")},D=async S=>{if(S.preventDefault(),x(""),!l.trim()){x("请输入 Access Token");return}c(!0),console.log("开始验证 token...");try{const P=await fetch("/api/webui/auth/verify",{method:"POST",headers:{"Content-Type":"application/json"},credentials:"include",body:JSON.stringify({token:l.trim()})});console.log("Token 验证响应状态:",P.status);const M=await P.json();if(console.log("Token 验证响应数据:",M),P.ok&&M.valid){console.log("Token 验证成功,准备跳转..."),console.log("is_first_setup:",M.is_first_setup),await new Promise(A=>setTimeout(A,100));const T=await tc();console.log("跳转前认证状态检查:",T),M.is_first_setup?(console.log("跳转到首次配置页面"),p({to:"/setup"})):(console.log("跳转到首页"),p({to:"/"}))}else console.error("Token 验证失败:",M.message),x(M.message||"Token 验证失败,请检查后重试")}catch(P){console.error("Token 验证错误:",P),x("连接服务器失败,请检查网络连接")}finally{c(!1)}};return h?e.jsxs("div",{className:"relative flex min-h-screen items-center justify-center overflow-hidden bg-background p-4",children:[g&&e.jsx(vg,{}),e.jsx("div",{className:"text-muted-foreground",children:"正在检查登录状态..."})]}):e.jsxs("div",{className:"relative flex min-h-screen items-center justify-center overflow-hidden bg-background p-4",children:[g&&e.jsx(vg,{}),e.jsxs(Ce,{className:"relative z-10 w-full max-w-md shadow-2xl backdrop-blur-xl bg-card/80 border-border/50",children:[e.jsx("button",{onClick:R,className:"absolute right-4 top-4 rounded-lg p-2 hover:bg-accent transition-colors z-10 text-foreground",title:b==="dark"?"切换到浅色模式":"切换到深色模式",children:b==="dark"?e.jsx(qm,{className:"h-5 w-5",strokeWidth:2.5,fill:"none"}):e.jsx(Qi,{className:"h-5 w-5",strokeWidth:2.5,fill:"none"})}),e.jsxs(De,{className:"space-y-4 text-center",children:[e.jsx("div",{className:"mx-auto flex h-16 w-16 items-center justify-center rounded-2xl bg-primary/10",children:e.jsx(rg,{className:"h-8 w-8 text-primary",strokeWidth:2,fill:"none"})}),e.jsxs("div",{className:"space-y-2",children:[e.jsx(Le,{className:"text-2xl font-bold",children:"欢迎使用 MaiBot"}),e.jsx(ws,{className:"text-base",children:"请输入您的 Access Token 以继续访问系统"})]})]}),e.jsx(Ae,{children:e.jsxs("form",{onSubmit:D,className:"space-y-4",children:[e.jsxs("div",{className:"space-y-2",children:[e.jsx(E,{htmlFor:"token",className:"text-sm font-medium",children:"Access Token"}),e.jsxs("div",{className:"relative",children:[e.jsx(Km,{className:"absolute left-3 top-1/2 h-4 w-4 -translate-y-1/2 text-muted-foreground",strokeWidth:2,fill:"none"}),e.jsx(le,{id:"token",type:"password",placeholder:"请输入您的 Access Token",value:l,onChange:S=>n(S.target.value),className:I("pl-10",u&&"border-red-500 focus-visible:ring-red-500"),disabled:i,autoFocus:!0,autoComplete:"off"})]})]}),u&&e.jsxs("div",{className:"flex items-center gap-2 rounded-md bg-red-50 p-3 text-sm text-red-600 dark:bg-red-950/50 dark:text-red-400",children:[e.jsx(_t,{className:"h-4 w-4 flex-shrink-0",strokeWidth:2,fill:"none"}),e.jsx("span",{children:u})]}),e.jsx(_,{type:"submit",className:"w-full",disabled:i,children:i?e.jsxs(e.Fragment,{children:[e.jsx("div",{className:"mr-2 h-4 w-4 animate-spin rounded-full border-2 border-current border-t-transparent"}),"验证中..."]}):"验证并进入"}),e.jsxs(Is,{children:[e.jsx(Wo,{asChild:!0,children:e.jsxs("button",{className:"w-full text-center text-sm text-primary hover:text-primary/80 transition-colors underline-offset-4 hover:underline flex items-center justify-center gap-1",children:[e.jsx(Dj,{className:"h-4 w-4",strokeWidth:2,fill:"none"}),"我没有 Token,我该去哪里获得 Token?"]})}),e.jsxs(Os,{className:"sm:max-w-md",children:[e.jsxs(Ds,{children:[e.jsxs(Rs,{className:"flex items-center gap-2",children:[e.jsx(rg,{className:"h-5 w-5 text-primary",strokeWidth:2,fill:"none"}),"如何获取 Access Token"]}),e.jsx(Ks,{children:"Access Token 是访问 MaiBot WebUI 的唯一凭证,请按以下方式获取"})]}),e.jsxs("div",{className:"space-y-4",children:[e.jsx("div",{className:"rounded-lg border bg-muted/50 p-4 space-y-2",children:e.jsxs("div",{className:"flex items-start gap-3",children:[e.jsx(Yw,{className:"h-5 w-5 text-primary flex-shrink-0 mt-0.5",strokeWidth:2,fill:"none"}),e.jsxs("div",{className:"flex-1 space-y-2",children:[e.jsx("h4",{className:"font-semibold text-sm",children:"方式一:查看启动日志"}),e.jsx("p",{className:"text-sm text-muted-foreground",children:"在 MaiBot 启动时,控制台会显示 WebUI Access Token。"}),e.jsxs("div",{className:"rounded bg-background p-2 font-mono text-xs",children:[e.jsx("p",{className:"text-muted-foreground",children:"🔑 WebUI Access Token: abc123..."}),e.jsx("p",{className:"text-muted-foreground",children:"💡 请使用此 Token 登录 WebUI"})]})]})]})}),e.jsx("div",{className:"rounded-lg border bg-muted/50 p-4 space-y-2",children:e.jsxs("div",{className:"flex items-start gap-3",children:[e.jsx(Ca,{className:"h-5 w-5 text-primary flex-shrink-0 mt-0.5",strokeWidth:2,fill:"none"}),e.jsxs("div",{className:"flex-1 space-y-2",children:[e.jsx("h4",{className:"font-semibold text-sm",children:"方式二:查看配置文件"}),e.jsx("p",{className:"text-sm text-muted-foreground",children:"Token 保存在项目根目录的配置文件中:"}),e.jsx("div",{className:"rounded bg-background p-2 font-mono text-xs break-all",children:e.jsx("code",{className:"text-primary",children:"data/webui.json"})}),e.jsxs("p",{className:"text-xs text-muted-foreground",children:["打开此文件,复制 ",e.jsx("code",{className:"px-1 py-0.5 bg-background rounded",children:"access_token"})," 字段的值"]})]})]})}),e.jsx("div",{className:"rounded-lg border border-yellow-200 dark:border-yellow-900 bg-yellow-50 dark:bg-yellow-950/30 p-3",children:e.jsxs("div",{className:"flex gap-2",children:[e.jsx(_t,{className:"h-4 w-4 text-yellow-600 dark:text-yellow-500 flex-shrink-0 mt-0.5",strokeWidth:2,fill:"none"}),e.jsxs("div",{className:"text-sm text-yellow-800 dark:text-yellow-300 space-y-1",children:[e.jsx("p",{className:"font-semibold",children:"安全提示"}),e.jsxs("ul",{className:"list-disc list-inside space-y-0.5 text-xs",children:[e.jsx("li",{children:"请妥善保管您的 Token,不要泄露给他人"}),e.jsx("li",{children:"如需重置 Token,请在登录后前往系统设置"})]})]})]})})]})]})]}),e.jsxs(vs,{children:[e.jsx(wt,{asChild:!0,children:e.jsxs("button",{className:"w-full text-center text-sm text-muted-foreground hover:text-foreground transition-colors underline-offset-4 hover:underline flex items-center justify-center gap-1",children:[e.jsx(Za,{className:"h-4 w-4",strokeWidth:2,fill:"none"}),"我觉得这个界面很卡怎么办?"]})}),e.jsxs(ds,{children:[e.jsxs(us,{children:[e.jsxs(xs,{className:"flex items-center gap-2",children:[e.jsx(Za,{className:"h-5 w-5 text-primary",strokeWidth:2,fill:"none"}),"关闭背景动画"]}),e.jsx(hs,{children:"背景动画可能会在低性能设备上造成卡顿。关闭动画可以显著提升界面流畅度。"})]}),e.jsx("div",{className:"rounded-lg border bg-muted/50 p-4 space-y-2",children:e.jsx("p",{className:"text-sm text-muted-foreground",children:"关闭动画后,背景将变为纯色,但不影响任何功能的使用。您可以随时在系统设置中重新开启动画。"})}),e.jsxs(ms,{children:[e.jsx(ps,{children:"取消"}),e.jsx(fs,{onClick:()=>N(!1),children:"关闭动画"})]})]})]})]})})]}),e.jsx("div",{className:"absolute bottom-4 left-0 right-0 text-center text-xs text-muted-foreground",children:e.jsx("p",{children:D1})})]})}const ot=d.forwardRef(({className:l,...n},i)=>e.jsx("textarea",{className:I("flex min-h-[60px] w-full rounded-md border border-input bg-transparent px-3 py-2 text-base shadow-sm placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:cursor-not-allowed disabled:opacity-50 md:text-sm",l),ref:i,...n}));ot.displayName="Textarea";const Yt=d.forwardRef(({className:l,orientation:n="horizontal",decorative:i=!0,...c},u)=>e.jsx(ej,{ref:u,decorative:i,orientation:n,className:I("shrink-0 bg-border",n==="horizontal"?"h-[1px] w-full":"h-full w-[1px]",l),...c}));Yt.displayName=ej.displayName;function Z1({config:l,onChange:n}){const i=u=>{u.trim()&&!l.alias_names.includes(u.trim())&&n({...l,alias_names:[...l.alias_names,u.trim()]})},c=u=>{n({...l,alias_names:l.alias_names.filter((x,h)=>h!==u)})};return e.jsxs("div",{className:"space-y-6",children:[e.jsxs("div",{className:"space-y-3",children:[e.jsx(E,{htmlFor:"qq_account",children:"QQ账号 *"}),e.jsx(le,{id:"qq_account",type:"number",placeholder:"请输入机器人的QQ账号",value:l.qq_account||"",onChange:u=>n({...l,qq_account:Number(u.target.value)})}),e.jsx("p",{className:"text-xs text-muted-foreground",children:"机器人登录使用的QQ账号"})]}),e.jsxs("div",{className:"space-y-3",children:[e.jsx(E,{htmlFor:"nickname",children:"昵称 *"}),e.jsx(le,{id:"nickname",placeholder:"请输入机器人的昵称",value:l.nickname,onChange:u=>n({...l,nickname:u.target.value})}),e.jsx("p",{className:"text-xs text-muted-foreground",children:"机器人的主要称呼名称"})]}),e.jsxs("div",{className:"space-y-3",children:[e.jsx(E,{children:"别名"}),e.jsx("div",{className:"flex flex-wrap gap-2 mb-2",children:l.alias_names.map((u,x)=>e.jsxs(Se,{variant:"secondary",className:"gap-1",children:[u,e.jsx("button",{type:"button",onClick:()=>c(x),className:"ml-1 hover:text-destructive",children:e.jsx(Ea,{className:"h-3 w-3"})})]},x))}),e.jsxs("div",{className:"flex gap-2",children:[e.jsx(le,{id:"alias_input",placeholder:"输入别名后按回车添加",onKeyPress:u=>{u.key==="Enter"&&(i(u.target.value),u.target.value="")}}),e.jsx(_,{type:"button",variant:"outline",onClick:()=>{const u=document.getElementById("alias_input");u&&(i(u.value),u.value="")},children:"添加"})]}),e.jsx("p",{className:"text-xs text-muted-foreground",children:"机器人的其他称呼,可以添加多个"})]})]})}function W1({config:l,onChange:n}){return e.jsxs("div",{className:"space-y-6",children:[e.jsxs("div",{className:"space-y-3",children:[e.jsx(E,{htmlFor:"personality",children:"人格特征 *"}),e.jsx(ot,{id:"personality",placeholder:"描述机器人的人格特质和身份特征(建议120字以内)",value:l.personality,onChange:i=>n({...l,personality:i.target.value}),rows:3}),e.jsx("p",{className:"text-xs text-muted-foreground",children:"例如:是一个女大学生,现在在读大二,会刷贴吧"})]}),e.jsxs("div",{className:"space-y-3",children:[e.jsx(E,{htmlFor:"reply_style",children:"表达风格 *"}),e.jsx(ot,{id:"reply_style",placeholder:"描述机器人说话的表达风格、表达习惯",value:l.reply_style,onChange:i=>n({...l,reply_style:i.target.value}),rows:3}),e.jsx("p",{className:"text-xs text-muted-foreground",children:"例如:回复平淡一些,简短一些,说中文,参考贴吧、知乎和微博的回复风格"})]}),e.jsxs("div",{className:"space-y-3",children:[e.jsx(E,{htmlFor:"interest",children:"兴趣 *"}),e.jsx(ot,{id:"interest",placeholder:"描述机器人感兴趣的话题",value:l.interest,onChange:i=>n({...l,interest:i.target.value}),rows:2}),e.jsx("p",{className:"text-xs text-muted-foreground",children:"会影响机器人对什么话题进行回复"})]}),e.jsx(Yt,{}),e.jsxs("div",{className:"space-y-3",children:[e.jsx(E,{htmlFor:"plan_style",children:"群聊说话规则 *"}),e.jsx(ot,{id:"plan_style",placeholder:"机器人在群聊中的行为风格和规则",value:l.plan_style,onChange:i=>n({...l,plan_style:i.target.value}),rows:4}),e.jsx("p",{className:"text-xs text-muted-foreground",children:"定义机器人在群聊中如何行动,例如回复频率、条件等"})]}),e.jsxs("div",{className:"space-y-3",children:[e.jsx(E,{htmlFor:"private_plan_style",children:"私聊说话规则 *"}),e.jsx(ot,{id:"private_plan_style",placeholder:"机器人在私聊中的行为风格和规则",value:l.private_plan_style,onChange:i=>n({...l,private_plan_style:i.target.value}),rows:3}),e.jsx("p",{className:"text-xs text-muted-foreground",children:"定义机器人在私聊中的行为方式"})]})]})}function e2({config:l,onChange:n}){return e.jsxs("div",{className:"space-y-6",children:[e.jsxs("div",{className:"space-y-3",children:[e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsx(E,{htmlFor:"emoji_chance",children:"表情包激活概率"}),e.jsxs("span",{className:"text-sm text-muted-foreground",children:[(l.emoji_chance*100).toFixed(0),"%"]})]}),e.jsx(le,{id:"emoji_chance",type:"range",min:"0",max:"1",step:"0.1",value:l.emoji_chance,onChange:i=>n({...l,emoji_chance:Number(i.target.value)})}),e.jsx("p",{className:"text-xs text-muted-foreground",children:"机器人发送表情包的概率"})]}),e.jsxs("div",{className:"space-y-3",children:[e.jsx(E,{htmlFor:"max_reg_num",children:"最大表情包数量"}),e.jsx(le,{id:"max_reg_num",type:"number",min:"1",max:"200",value:l.max_reg_num,onChange:i=>n({...l,max_reg_num:Number(i.target.value)})}),e.jsx("p",{className:"text-xs text-muted-foreground",children:"机器人最多保存的表情包数量"})]}),e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsxs("div",{className:"space-y-1",children:[e.jsx(E,{htmlFor:"do_replace",children:"达到最大数量时替换"}),e.jsx("p",{className:"text-xs text-muted-foreground",children:"开启后会删除旧表情包,关闭则不再收集新表情包"})]}),e.jsx(Fe,{id:"do_replace",checked:l.do_replace,onCheckedChange:i=>n({...l,do_replace:i})})]}),e.jsxs("div",{className:"space-y-3",children:[e.jsx(E,{htmlFor:"check_interval",children:"检查间隔(分钟)"}),e.jsx(le,{id:"check_interval",type:"number",min:"1",max:"120",value:l.check_interval,onChange:i=>n({...l,check_interval:Number(i.target.value)})}),e.jsx("p",{className:"text-xs text-muted-foreground",children:"检查表情包注册、破损、删除的时间间隔"})]}),e.jsx(Yt,{}),e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsxs("div",{className:"space-y-1",children:[e.jsx(E,{htmlFor:"steal_emoji",children:"偷取表情包"}),e.jsx("p",{className:"text-xs text-muted-foreground",children:"允许机器人将一些表情包据为己有"})]}),e.jsx(Fe,{id:"steal_emoji",checked:l.steal_emoji,onCheckedChange:i=>n({...l,steal_emoji:i})})]}),e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsxs("div",{className:"space-y-1",children:[e.jsx(E,{htmlFor:"content_filtration",children:"启用表情包过滤"}),e.jsx("p",{className:"text-xs text-muted-foreground",children:"只保存符合要求的表情包"})]}),e.jsx(Fe,{id:"content_filtration",checked:l.content_filtration,onCheckedChange:i=>n({...l,content_filtration:i})})]}),l.content_filtration&&e.jsxs("div",{className:"space-y-3",children:[e.jsx(E,{htmlFor:"filtration_prompt",children:"过滤要求"}),e.jsx(le,{id:"filtration_prompt",placeholder:"例如:符合公序良俗",value:l.filtration_prompt,onChange:i=>n({...l,filtration_prompt:i.target.value})}),e.jsx("p",{className:"text-xs text-muted-foreground",children:"描述表情包应该符合的要求"})]})]})}function s2({config:l,onChange:n}){return e.jsxs("div",{className:"space-y-6",children:[e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsxs("div",{className:"space-y-1",children:[e.jsx(E,{htmlFor:"enable_tool",children:"启用工具系统"}),e.jsx("p",{className:"text-xs text-muted-foreground",children:"允许机器人使用各种工具增强功能"})]}),e.jsx(Fe,{id:"enable_tool",checked:l.enable_tool,onCheckedChange:i=>n({...l,enable_tool:i})})]}),e.jsx(Yt,{}),e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsxs("div",{className:"space-y-1",children:[e.jsx(E,{htmlFor:"all_global",children:"启用全局黑话模式"}),e.jsx("p",{className:"text-xs text-muted-foreground",children:"允许机器人学习和使用群组黑话"})]}),e.jsx(Fe,{id:"all_global",checked:l.all_global,onCheckedChange:i=>n({...l,all_global:i})})]})]})}function t2({config:l,onChange:n}){const[i,c]=d.useState(!1);return e.jsxs("div",{className:"space-y-6",children:[e.jsx("div",{className:"rounded-lg bg-blue-50 dark:bg-blue-950/30 border border-blue-200 dark:border-blue-800 p-4",children:e.jsxs("div",{className:"flex items-start gap-3",children:[e.jsx("div",{className:"mt-0.5",children:e.jsx("svg",{className:"h-5 w-5 text-blue-600 dark:text-blue-400",fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",children:e.jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z"})})}),e.jsxs("div",{className:"flex-1 text-sm",children:[e.jsx("p",{className:"font-medium text-blue-900 dark:text-blue-100 mb-1",children:"关于硅基流动 (SiliconFlow)"}),e.jsx("p",{className:"text-blue-700 dark:text-blue-300 mb-2",children:"硅基流动提供了完整的模型覆盖,包括 DeepSeek V3、Qwen、视觉模型、语音识别和嵌入模型。 只需一个 API Key 即可使用麦麦的所有功能!"}),e.jsxs("a",{href:"https://cloud.siliconflow.cn",target:"_blank",rel:"noopener noreferrer",className:"inline-flex items-center gap-1 text-blue-600 dark:text-blue-400 hover:underline font-medium",children:["前往硅基流动获取 API Key",e.jsx(Mo,{className:"h-3 w-3"})]})]})]})}),e.jsxs("div",{className:"space-y-3",children:[e.jsx(E,{htmlFor:"siliconflow_api_key",children:"SiliconFlow API Key *"}),e.jsxs("div",{className:"relative",children:[e.jsx(le,{id:"siliconflow_api_key",type:i?"text":"password",placeholder:"sk-...",value:l.api_key,onChange:u=>n({api_key:u.target.value}),className:"font-mono pr-10"}),e.jsx(_,{type:"button",variant:"ghost",size:"sm",className:"absolute right-0 top-0 h-full px-3 hover:bg-transparent",onClick:()=>c(!i),children:i?e.jsx(Wi,{className:"h-4 w-4 text-muted-foreground"}):e.jsx(ia,{className:"h-4 w-4 text-muted-foreground"})})]}),e.jsx("p",{className:"text-xs text-muted-foreground",children:"请输入您的硅基流动 API 密钥。获取后,麦麦将自动配置所有必需的模型。"})]}),e.jsxs("div",{className:"rounded-lg bg-muted/50 p-4 text-sm space-y-2",children:[e.jsx("p",{className:"font-medium",children:"将自动配置以下模型:"}),e.jsxs("ul",{className:"list-disc list-inside space-y-1 text-muted-foreground ml-2",children:[e.jsx("li",{children:"DeepSeek V3 - 主要对话和工具模型"}),e.jsx("li",{children:"Qwen3 30B - 高频小任务和工具调用"}),e.jsx("li",{children:"Qwen3 VL 30B - 图像识别"}),e.jsx("li",{children:"SenseVoice - 语音识别"}),e.jsx("li",{children:"BGE-M3 - 文本嵌入"}),e.jsx("li",{children:"知识库相关模型 (LPMM)"})]})]}),e.jsx("div",{className:"rounded-lg border border-amber-200 dark:border-amber-800 bg-amber-50 dark:bg-amber-950/30 p-4",children:e.jsxs("p",{className:"text-sm text-amber-900 dark:text-amber-100",children:[e.jsx("span",{className:"font-medium",children:"💡 提示:"}),'完成向导后,您可以在"系统设置 → 模型配置"中添加更多 API 提供商和模型。']})})]})}async function a2(){const l=await we("/api/webui/config/bot",{method:"GET",headers:Fs()});if(!l.ok)throw new Error("读取Bot配置失败");const i=(await l.json()).config.bot||{};return{qq_account:i.qq_account||0,nickname:i.nickname||"",alias_names:i.alias_names||[]}}async function l2(){const l=await we("/api/webui/config/bot",{method:"GET",headers:Fs()});if(!l.ok)throw new Error("读取人格配置失败");const i=(await l.json()).config.personality||{};return{personality:i.personality||"",reply_style:i.reply_style||"",interest:i.interest||"",plan_style:i.plan_style||"",private_plan_style:i.private_plan_style||""}}async function n2(){const l=await we("/api/webui/config/bot",{method:"GET",headers:Fs()});if(!l.ok)throw new Error("读取表情包配置失败");const i=(await l.json()).config.emoji||{};return{emoji_chance:i.emoji_chance??.4,max_reg_num:i.max_reg_num??40,do_replace:i.do_replace??!0,check_interval:i.check_interval??10,steal_emoji:i.steal_emoji??!0,content_filtration:i.content_filtration??!1,filtration_prompt:i.filtration_prompt||""}}async function r2(){const l=await we("/api/webui/config/bot",{method:"GET",headers:Fs()});if(!l.ok)throw new Error("读取其他配置失败");const i=(await l.json()).config,c=i.tool||{},u=i.expression||{};return{enable_tool:c.enable_tool??!0,all_global:u.all_global_jargon??!0}}async function i2(){const l=await we("/api/webui/config/model",{method:"GET",headers:Fs()});if(!l.ok)throw new Error("读取模型配置失败");return{api_key:((await l.json()).config.api_providers||[]).find(x=>x.name==="SiliconFlow")?.api_key||""}}async function c2(l){const n=await we("/api/webui/config/bot/section/bot",{method:"POST",headers:Fs(),body:JSON.stringify(l)});if(!n.ok){const i=await n.json();throw new Error(i.detail||"保存Bot基础配置失败")}return await n.json()}async function o2(l){const n=await we("/api/webui/config/bot/section/personality",{method:"POST",headers:Fs(),body:JSON.stringify(l)});if(!n.ok){const i=await n.json();throw new Error(i.detail||"保存人格配置失败")}return await n.json()}async function d2(l){const n=await we("/api/webui/config/bot/section/emoji",{method:"POST",headers:Fs(),body:JSON.stringify(l)});if(!n.ok){const i=await n.json();throw new Error(i.detail||"保存表情包配置失败")}return await n.json()}async function u2(l){const n=[];n.push(we("/api/webui/config/bot/section/tool",{method:"POST",headers:Fs(),body:JSON.stringify({enable_tool:l.enable_tool})})),n.push(we("/api/webui/config/bot/section/expression",{method:"POST",headers:Fs(),body:JSON.stringify({all_global_jargon:l.all_global})}));const i=await Promise.all(n);for(const c of i)if(!c.ok){const u=await c.json();throw new Error(u.detail||"保存其他配置失败")}return{success:!0}}async function m2(l){const n=await we("/api/webui/config/model",{method:"GET",headers:Fs()});if(!n.ok)throw new Error("读取模型配置失败");const c=(await n.json()).config,u=c.api_providers||[],x=u.findIndex(p=>p.name==="SiliconFlow");x>=0?u[x]={...u[x],api_key:l.api_key}:u.push({name:"SiliconFlow",base_url:"https://api.siliconflow.cn/v1",api_key:l.api_key,client_type:"openai",max_retry:3,timeout:120,retry_interval:5});const h={...c,api_providers:u},f=await we("/api/webui/config/model",{method:"POST",headers:Fs(),body:JSON.stringify(h)});if(!f.ok){const p=await f.json();throw new Error(p.detail||"保存模型配置失败")}return await f.json()}async function Ng(){const l=await we("/api/webui/setup/complete",{method:"POST"});if(!l.ok){const n=await l.json();throw new Error(n.message||"标记配置完成失败")}return await l.json()}function x2(){return e.jsx(Yn,{children:e.jsx(h2,{})})}function h2(){const l=ca(),{toast:n}=Zs(),{triggerRestart:i}=vn(),[c,u]=d.useState(0),[x,h]=d.useState(!1),[f,p]=d.useState(!1),[g,N]=d.useState(!0),[v,y]=d.useState({qq_account:0,nickname:"",alias_names:[]}),[w,b]=d.useState({personality:"是一个女大学生,现在在读大二,会刷贴吧。",reply_style:"请回复的平淡一些,简短一些,说中文,不要刻意突出自身学科背景。可以参考贴吧,知乎和微博的回复风格。",interest:"对技术相关话题,游戏和动漫相关话题感兴趣,也对日常话题感兴趣,不喜欢太过沉重严肃的话题",plan_style:`1.思考**所有**的可用的action中的**每个动作**是否符合当下条件,如果动作使用条件符合聊天内容就使用 2.如果相同的内容已经被执行,请不要重复执行 3.请控制你的发言频率,不要太过频繁的发言 4.如果有人对你感到厌烦,请减少回复 5.如果有人对你进行攻击,或者情绪激动,请你以合适的方法应对`,private_plan_style:`1.思考**所有**的可用的action中的**每个动作**是否符合当下条件,如果动作使用条件符合聊天内容就使用 2.如果相同的内容已经被执行,请不要重复执行 -3.某句话如果已经被回复过,不要重复回复`}),[R,D]=d.useState({emoji_chance:.4,max_reg_num:40,do_replace:!0,check_interval:10,steal_emoji:!0,content_filtration:!1,filtration_prompt:"符合公序良俗"}),[S,P]=d.useState({enable_tool:!0,all_global:!0}),[M,T]=d.useState({api_key:""}),A=[{id:"bot-basic",title:"Bot基础",description:"配置机器人的基本信息",icon:Pn},{id:"personality",title:"人格配置",description:"定义机器人的性格和说话风格",icon:fn},{id:"emoji",title:"表情包",description:"配置表情包相关设置",icon:Yo},{id:"other",title:"其他设置",description:"工具、情绪系统等配置",icon:pn},{id:"siliconflow",title:"API配置",description:"配置硅基流动API密钥",icon:Km}],F=(c+1)/A.length*100;d.useEffect(()=>{(async()=>{try{N(!0);const[ve,je,z,V,B]=await Promise.all([a2(),l2(),n2(),r2(),i2()]);y(ve),b(je),D(z),P(V),T(B)}catch(ve){n({title:"加载配置失败",description:ve instanceof Error?ve.message:"无法加载现有配置,将使用默认值",variant:"destructive"})}finally{N(!1)}})()},[n]);const L=async()=>{p(!0);try{switch(c){case 0:await c2(v);break;case 1:await o2(w);break;case 2:await d2(R);break;case 3:await u2(S);break;case 4:await m2(M);break}return n({title:"保存成功",description:`${A[c].title}配置已保存`}),!0}catch(ne){return n({title:"保存失败",description:ne instanceof Error?ne.message:"未知错误",variant:"destructive"}),!1}finally{p(!1)}},J=async()=>{await L()&&c{c>0&&u(c-1)},ue=async()=>{h(!0);try{if(!await L()){h(!1);return}await Ng(),n({title:"配置完成",description:"麦麦正在重启以应用新配置..."}),await i()}catch(ne){n({title:"配置失败",description:ne instanceof Error?ne.message:"未知错误",variant:"destructive"})}finally{h(!1)}},xe=async()=>{try{await Ng(),l({to:"/"})}catch(ne){n({title:"跳过失败",description:ne instanceof Error?ne.message:"未知错误",variant:"destructive"})}},he=()=>{switch(c){case 0:return e.jsx(Z1,{config:v,onChange:y});case 1:return e.jsx(W1,{config:w,onChange:b});case 2:return e.jsx(e2,{config:R,onChange:D});case 3:return e.jsx(s2,{config:S,onChange:P});case 4:return e.jsx(t2,{config:M,onChange:T});default:return null}};return e.jsxs("div",{className:"relative flex min-h-screen flex-col items-center justify-center overflow-hidden bg-gradient-to-br from-primary/5 via-background to-secondary/5 p-4 md:p-6",children:[e.jsx(Jn,{}),e.jsxs("div",{className:"absolute inset-0 overflow-hidden pointer-events-none",children:[e.jsx("div",{className:"absolute left-1/4 top-1/4 h-64 w-64 md:h-96 md:w-96 rounded-full bg-primary/5 blur-3xl"}),e.jsx("div",{className:"absolute right-1/4 bottom-1/4 h-64 w-64 md:h-96 md:w-96 rounded-full bg-secondary/5 blur-3xl"})]}),g?e.jsxs("div",{className:"relative z-10 text-center",children:[e.jsx("div",{className:"mx-auto mb-4 flex h-16 w-16 items-center justify-center",children:e.jsx("div",{className:"h-12 w-12 animate-spin rounded-full border-4 border-primary border-t-transparent"})}),e.jsx("p",{className:"text-lg font-medium",children:"加载配置中..."}),e.jsx("p",{className:"text-sm text-muted-foreground mt-2",children:"正在读取现有配置"})]}):e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"relative z-10 w-full max-w-4xl",children:[e.jsxs("div",{className:"mb-6 md:mb-8 text-center",children:[e.jsx("div",{className:"mx-auto mb-4 flex h-12 w-12 md:h-16 md:w-16 items-center justify-center rounded-2xl bg-primary/10",children:e.jsx(Jw,{className:"h-6 w-6 md:h-8 md:w-8 text-primary",strokeWidth:2,fill:"none"})}),e.jsx("h1",{className:"mb-2 text-2xl md:text-3xl font-bold",children:"首次配置向导"}),e.jsxs("p",{className:"text-sm md:text-base text-muted-foreground",children:["让我们一起完成 ",sx," 的初始配置"]})]}),e.jsxs("div",{className:"mb-6 md:mb-8",children:[e.jsxs("div",{className:"mb-2 flex items-center justify-between text-xs md:text-sm",children:[e.jsxs("span",{className:"text-muted-foreground",children:["步骤 ",c+1," / ",A.length]}),e.jsxs("span",{className:"font-medium text-primary",children:[Math.round(F),"%"]})]}),e.jsx(Kn,{value:F,className:"h-2"})]}),e.jsx("div",{className:"mb-6 md:mb-8 flex justify-between",children:A.map((ne,ve)=>{const je=ne.icon;return e.jsxs("div",{className:I("flex flex-1 flex-col items-center gap-1 md:gap-2",vel({to:"/"}),className:"gap-2 w-full sm:w-auto",children:[e.jsx(Jo,{className:"h-4 w-4"}),"返回首页"]}),e.jsxs(_,{size:"lg",variant:"outline",onClick:()=>window.history.back(),className:"gap-2 w-full sm:w-auto",children:[e.jsx(Ca,{className:"h-4 w-4"}),"返回上一页"]})]}),e.jsx("div",{className:"mt-12 pt-8 border-t border-border",children:e.jsx("p",{className:"text-sm text-muted-foreground",children:"如果您认为这是一个错误,请联系系统管理员"})})]})})}const f2=As.memo(function({config:n,onChange:i}){const c=n.platforms||[],u=n.alias_names||[],x=()=>{i({...n,platforms:[...c,""]})},h=v=>{i({...n,platforms:c.filter((y,w)=>w!==v)})},f=(v,y)=>{const w=[...c];w[v]=y,i({...n,platforms:w})},p=()=>{i({...n,alias_names:[...u,""]})},g=v=>{i({...n,alias_names:u.filter((y,w)=>w!==v)})},N=(v,y)=>{const w=[...u];w[v]=y,i({...n,alias_names:w})};return e.jsx("div",{className:"rounded-lg border bg-card p-4 sm:p-6 space-y-6",children:e.jsxs("div",{children:[e.jsx("h3",{className:"text-lg font-semibold mb-4",children:"基本信息"}),e.jsxs("div",{className:"grid gap-4",children:[e.jsxs("div",{className:"grid gap-2",children:[e.jsx(E,{htmlFor:"platform",children:"平台"}),e.jsx(le,{id:"platform",value:n.platform,onChange:v=>i({...n,platform:v.target.value}),placeholder:"qq"})]}),e.jsxs("div",{className:"grid gap-2",children:[e.jsx(E,{htmlFor:"qq_account",children:"QQ账号"}),e.jsx(le,{id:"qq_account",value:n.qq_account,onChange:v=>i({...n,qq_account:v.target.value}),placeholder:"123456789"})]}),e.jsxs("div",{className:"grid gap-2",children:[e.jsx(E,{htmlFor:"nickname",children:"昵称"}),e.jsx(le,{id:"nickname",value:n.nickname,onChange:v=>i({...n,nickname:v.target.value}),placeholder:"麦麦"})]}),e.jsxs("div",{className:"grid gap-2",children:[e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsx(E,{children:"别名"}),e.jsxs(_,{onClick:p,size:"sm",variant:"outline",children:[e.jsx(et,{className:"h-4 w-4 mr-1"}),"添加"]})]}),e.jsxs("div",{className:"space-y-2",children:[u.map((v,y)=>e.jsxs("div",{className:"flex gap-2",children:[e.jsx(le,{value:v,onChange:w=>N(y,w.target.value),placeholder:"小麦"}),e.jsxs(vs,{children:[e.jsx(yt,{asChild:!0,children:e.jsx(_,{size:"icon",variant:"outline",children:e.jsx(ls,{className:"h-4 w-4"})})}),e.jsxs(ds,{children:[e.jsxs(us,{children:[e.jsx(xs,{children:"确认删除"}),e.jsxs(hs,{children:['确定要删除别名 "',v||"(空)",'" 吗?此操作无法撤销。']})]}),e.jsxs(ms,{children:[e.jsx(ps,{children:"取消"}),e.jsx(fs,{onClick:()=>g(y),children:"删除"})]})]})]})]},y)),u.length===0&&e.jsx("p",{className:"text-sm text-muted-foreground",children:"暂无别名"})]})]}),e.jsxs("div",{className:"grid gap-2",children:[e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsx(E,{children:"其他平台账号"}),e.jsxs(_,{onClick:x,size:"sm",variant:"outline",children:[e.jsx(et,{className:"h-4 w-4 mr-1"}),"添加"]})]}),e.jsxs("div",{className:"space-y-2",children:[c.map((v,y)=>e.jsxs("div",{className:"flex gap-2",children:[e.jsx(le,{value:v,onChange:w=>f(y,w.target.value),placeholder:"wx:114514"}),e.jsxs(vs,{children:[e.jsx(yt,{asChild:!0,children:e.jsx(_,{size:"icon",variant:"outline",children:e.jsx(ls,{className:"h-4 w-4"})})}),e.jsxs(ds,{children:[e.jsxs(us,{children:[e.jsx(xs,{children:"确认删除"}),e.jsxs(hs,{children:['确定要删除平台账号 "',v||"(空)",'" 吗?此操作无法撤销。']})]}),e.jsxs(ms,{children:[e.jsx(ps,{children:"取消"}),e.jsx(fs,{onClick:()=>h(y),children:"删除"})]})]})]})]},y)),c.length===0&&e.jsx("p",{className:"text-sm text-muted-foreground",children:"暂无其他平台账号"})]})]})]})]})})}),p2=As.memo(function({config:n,onChange:i}){const c=()=>{i({...n,states:[...n.states,""]})},u=h=>{i({...n,states:n.states.filter((f,p)=>p!==h)})},x=(h,f)=>{const p=[...n.states];p[h]=f,i({...n,states:p})};return e.jsx("div",{className:"rounded-lg border bg-card p-4 sm:p-6 space-y-6",children:e.jsxs("div",{children:[e.jsx("h3",{className:"text-lg font-semibold mb-4",children:"人格设置"}),e.jsxs("div",{className:"grid gap-4",children:[e.jsxs("div",{className:"grid gap-2",children:[e.jsx(E,{htmlFor:"personality",children:"人格特质"}),e.jsx(ot,{id:"personality",value:n.personality,onChange:h=>i({...n,personality:h.target.value}),placeholder:"描述人格特质和身份特征(建议120字以内)",rows:3}),e.jsx("p",{className:"text-xs text-muted-foreground",children:"建议120字以内,描述人格特质和身份特征"})]}),e.jsxs("div",{className:"grid gap-2",children:[e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsx(E,{children:"多重人格"}),e.jsxs(_,{onClick:c,size:"sm",variant:"outline",children:[e.jsx(et,{className:"h-4 w-4 mr-1"}),"添加人格"]})]}),e.jsx("p",{className:"text-xs text-muted-foreground",children:"可以定义多个不同的人格状态,麦麦会随机切换"}),e.jsx("div",{className:"space-y-2",children:n.states.map((h,f)=>e.jsxs("div",{className:"flex gap-2",children:[e.jsx(ot,{value:h,onChange:p=>x(f,p.target.value),placeholder:"描述一个人格状态",rows:2}),e.jsxs(vs,{children:[e.jsx(yt,{asChild:!0,children:e.jsx(_,{size:"icon",variant:"outline",children:e.jsx(ls,{className:"h-4 w-4"})})}),e.jsxs(ds,{children:[e.jsxs(us,{children:[e.jsx(xs,{children:"确认删除"}),e.jsx(hs,{children:"确定要删除这个人格状态吗?此操作无法撤销。"})]}),e.jsxs(ms,{children:[e.jsx(ps,{children:"取消"}),e.jsx(fs,{onClick:()=>u(f),children:"删除"})]})]})]})]},f))})]}),e.jsxs("div",{className:"grid gap-2",children:[e.jsx(E,{htmlFor:"state_probability",children:"替换为多重人格概率"}),e.jsx(le,{id:"state_probability",type:"number",step:"0.1",min:"0",max:"1",value:n.state_probability,onChange:h=>i({...n,state_probability:parseFloat(h.target.value)})}),e.jsx("p",{className:"text-xs text-muted-foreground",children:"每次构建人格时,用多重人格替换主人格的概率(0.0-1.0)"})]}),e.jsxs("div",{className:"grid gap-2",children:[e.jsx(E,{htmlFor:"reply_style",children:"表达风格"}),e.jsx(ot,{id:"reply_style",value:n.reply_style,onChange:h=>i({...n,reply_style:h.target.value}),placeholder:"描述说话的表达风格和习惯",rows:3})]}),e.jsxs("div",{className:"grid gap-2",children:[e.jsx(E,{htmlFor:"plan_style",children:"说话规则与行为风格"}),e.jsx(ot,{id:"plan_style",value:n.plan_style,onChange:h=>i({...n,plan_style:h.target.value}),placeholder:"麦麦的说话规则和行为风格",rows:5})]}),e.jsxs("div",{className:"grid gap-2",children:[e.jsx(E,{htmlFor:"visual_style",children:"识图规则"}),e.jsx(ot,{id:"visual_style",value:n.visual_style,onChange:h=>i({...n,visual_style:h.target.value}),placeholder:"识图时的处理规则",rows:3})]}),e.jsxs("div",{className:"grid gap-2",children:[e.jsx(E,{htmlFor:"private_plan_style",children:"私聊规则"}),e.jsx(ot,{id:"private_plan_style",value:n.private_plan_style,onChange:h=>i({...n,private_plan_style:h.target.value}),placeholder:"私聊的说话规则和行为风格",rows:4})]})]})]})})}),Ie=Aw,Pe=Ow,$e=d.forwardRef(({className:l,children:n,...i},c)=>e.jsxs(gj,{ref:c,className:I("flex h-9 w-full items-center justify-between whitespace-nowrap rounded-md border border-input bg-transparent px-3 py-2 text-sm shadow-sm ring-offset-background data-[placeholder]:text-muted-foreground focus:outline-none focus:ring-1 focus:ring-ring disabled:cursor-not-allowed disabled:opacity-50 [&>span]:line-clamp-1",l),...i,children:[n,e.jsx(Cw,{asChild:!0,children:e.jsx(Ma,{className:"h-4 w-4 opacity-50"})})]}));$e.displayName=gj.displayName;const fv=d.forwardRef(({className:l,...n},i)=>e.jsx(jj,{ref:i,className:I("flex cursor-default items-center justify-center py-1",l),...n,children:e.jsx(Fr,{className:"h-4 w-4"})}));fv.displayName=jj.displayName;const pv=d.forwardRef(({className:l,...n},i)=>e.jsx(vj,{ref:i,className:I("flex cursor-default items-center justify-center py-1",l),...n,children:e.jsx(Ma,{className:"h-4 w-4"})}));pv.displayName=vj.displayName;const Be=d.forwardRef(({className:l,children:n,position:i="popper",...c},u)=>e.jsx(Tw,{children:e.jsxs(Nj,{ref:u,className:I("relative z-[100] max-h-[--radix-select-content-available-height] min-w-[8rem] overflow-hidden rounded-md border border-border bg-white dark:bg-gray-900 text-gray-900 dark:text-gray-100 shadow-lg data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 origin-[--radix-select-content-transform-origin]",i==="popper"&&"data-[side=bottom]:translate-y-1 data-[side=left]:-translate-x-1 data-[side=right]:translate-x-1 data-[side=top]:-translate-y-1",l),position:i,...c,children:[e.jsx(fv,{}),e.jsx(Ew,{className:I("p-1",i==="popper"&&"h-[var(--radix-select-trigger-height)] w-full min-w-[var(--radix-select-trigger-width)]"),children:n}),e.jsx(pv,{})]})}));Be.displayName=Nj.displayName;const g2=d.forwardRef(({className:l,...n},i)=>e.jsx(bj,{ref:i,className:I("px-2 py-1.5 text-sm font-semibold",l),...n}));g2.displayName=bj.displayName;const X=d.forwardRef(({className:l,children:n,...i},c)=>e.jsxs(yj,{ref:c,className:I("relative flex w-full cursor-default select-none items-center rounded-sm py-2 pl-2 pr-8 text-sm outline-none bg-white dark:bg-gray-900 hover:bg-gray-100 dark:hover:bg-gray-800 focus:bg-gray-100 dark:focus:bg-gray-800 data-[disabled]:pointer-events-none data-[disabled]:opacity-50",l),...i,children:[e.jsx("span",{className:"absolute right-2 flex h-3.5 w-3.5 items-center justify-center",children:e.jsx(Mw,{children:e.jsx(kt,{className:"h-4 w-4"})})}),e.jsx(zw,{children:n})]}));X.displayName=yj.displayName;const j2=d.forwardRef(({className:l,...n},i)=>e.jsx(wj,{ref:i,className:I("-mx-1 my-1 h-px bg-muted",l),...n}));j2.displayName=wj.displayName;const ol=q0,dl=K0,Wa=d.forwardRef(({className:l,align:n="center",sideOffset:i=4,...c},u)=>e.jsx(V0,{children:e.jsx(sj,{ref:u,align:n,sideOffset:i,className:I("z-50 w-72 rounded-md border bg-popover p-4 text-popover-foreground shadow-md outline-none data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 origin-[--radix-popover-content-transform-origin]",l),...c})}));Wa.displayName=sj.displayName;const v2=As.memo(function({value:n,onChange:i}){const c=d.useMemo(()=>{const w=n.split("-");if(w.length===2){const[b,R]=w,[D,S]=b.split(":"),[P,M]=R.split(":");return{startHour:D?D.padStart(2,"0"):"00",startMinute:S?S.padStart(2,"0"):"00",endHour:P?P.padStart(2,"0"):"23",endMinute:M?M.padStart(2,"0"):"59"}}return{startHour:"00",startMinute:"00",endHour:"23",endMinute:"59"}},[n]),[u,x]=d.useState(c.startHour),[h,f]=d.useState(c.startMinute),[p,g]=d.useState(c.endHour),[N,v]=d.useState(c.endMinute);d.useEffect(()=>{x(c.startHour),f(c.startMinute),g(c.endHour),v(c.endMinute)},[c]);const y=(w,b,R,D)=>{const S=`${w}:${b}-${R}:${D}`;i(S)};return e.jsxs(ol,{children:[e.jsx(dl,{asChild:!0,children:e.jsxs(_,{variant:"outline",className:"w-full justify-start font-mono text-sm",children:[e.jsx(na,{className:"h-4 w-4 mr-2"}),n||"选择时间段"]})}),e.jsx(Wa,{className:"w-72 sm:w-80",children:e.jsxs("div",{className:"space-y-4",children:[e.jsxs("div",{children:[e.jsx("h4",{className:"font-medium text-sm mb-3",children:"开始时间"}),e.jsxs("div",{className:"grid grid-cols-2 gap-2 sm:gap-3",children:[e.jsxs("div",{children:[e.jsx(E,{className:"text-xs",children:"小时"}),e.jsxs(Ie,{value:u,onValueChange:w=>{x(w),y(w,h,p,N)},children:[e.jsx($e,{children:e.jsx(Pe,{})}),e.jsx(Be,{children:Array.from({length:24},(w,b)=>b).map(w=>e.jsx(X,{value:w.toString().padStart(2,"0"),children:w.toString().padStart(2,"0")},w))})]})]}),e.jsxs("div",{children:[e.jsx(E,{className:"text-xs",children:"分钟"}),e.jsxs(Ie,{value:h,onValueChange:w=>{f(w),y(u,w,p,N)},children:[e.jsx($e,{children:e.jsx(Pe,{})}),e.jsx(Be,{children:Array.from({length:60},(w,b)=>b).map(w=>e.jsx(X,{value:w.toString().padStart(2,"0"),children:w.toString().padStart(2,"0")},w))})]})]})]})]}),e.jsxs("div",{children:[e.jsx("h4",{className:"font-medium text-sm mb-3",children:"结束时间"}),e.jsxs("div",{className:"grid grid-cols-2 gap-2 sm:gap-3",children:[e.jsxs("div",{children:[e.jsx(E,{className:"text-xs",children:"小时"}),e.jsxs(Ie,{value:p,onValueChange:w=>{g(w),y(u,h,w,N)},children:[e.jsx($e,{children:e.jsx(Pe,{})}),e.jsx(Be,{children:Array.from({length:24},(w,b)=>b).map(w=>e.jsx(X,{value:w.toString().padStart(2,"0"),children:w.toString().padStart(2,"0")},w))})]})]}),e.jsxs("div",{children:[e.jsx(E,{className:"text-xs",children:"分钟"}),e.jsxs(Ie,{value:N,onValueChange:w=>{v(w),y(u,h,p,w)},children:[e.jsx($e,{children:e.jsx(Pe,{})}),e.jsx(Be,{children:Array.from({length:60},(w,b)=>b).map(w=>e.jsx(X,{value:w.toString().padStart(2,"0"),children:w.toString().padStart(2,"0")},w))})]})]})]})]})]})})]})}),N2=As.memo(function({rule:n}){const i=`{ target = "${n.target}", time = "${n.time}", value = ${n.value.toFixed(1)} }`;return e.jsxs(ol,{children:[e.jsx(dl,{asChild:!0,children:e.jsxs(_,{variant:"outline",size:"sm",children:[e.jsx(ia,{className:"h-4 w-4 mr-1"}),"预览"]})}),e.jsx(Wa,{className:"w-80 sm:w-96",children:e.jsxs("div",{className:"space-y-2",children:[e.jsx("h4",{className:"font-medium text-sm",children:"配置预览"}),e.jsx("div",{className:"rounded-md bg-muted p-3 font-mono text-xs break-all",children:i}),e.jsx("p",{className:"text-xs text-muted-foreground",children:"这是保存到 bot_config.toml 文件中的格式"})]})})]})}),b2=As.memo(function({config:n,onChange:i}){const c=()=>{i({...n,talk_value_rules:[...n.talk_value_rules,{target:"",time:"00:00-23:59",value:1}]})},u=h=>{i({...n,talk_value_rules:n.talk_value_rules.filter((f,p)=>p!==h)})},x=(h,f,p)=>{const g=[...n.talk_value_rules];g[h]={...g[h],[f]:p},i({...n,talk_value_rules:g})};return e.jsxs("div",{className:"rounded-lg border bg-card p-4 sm:p-6 space-y-6",children:[e.jsxs("div",{children:[e.jsx("h3",{className:"text-lg font-semibold mb-4",children:"聊天设置"}),e.jsxs("div",{className:"grid gap-4",children:[e.jsxs("div",{className:"grid gap-2",children:[e.jsx(E,{htmlFor:"talk_value",children:"聊天频率(基础值)"}),e.jsx(le,{id:"talk_value",type:"number",step:"0.1",min:"0",max:"1",value:n.talk_value,onChange:h=>i({...n,talk_value:parseFloat(h.target.value)})}),e.jsx("p",{className:"text-xs text-muted-foreground",children:"越小越沉默,范围 0-1"})]}),e.jsxs("div",{className:"grid gap-2",children:[e.jsx(E,{htmlFor:"think_mode",children:"思考模式"}),e.jsxs(Ie,{value:n.think_mode||"classic",onValueChange:h=>i({...n,think_mode:h}),children:[e.jsx($e,{id:"think_mode",children:e.jsx(Pe,{placeholder:"选择思考模式"})}),e.jsxs(Be,{children:[e.jsx(X,{value:"classic",children:"经典模式 - 浅度思考和回复"}),e.jsx(X,{value:"deep",children:"深度模式 - 进行深度思考和回复"}),e.jsx(X,{value:"dynamic",children:"动态模式 - 自动选择思考深度"})]})]}),e.jsx("p",{className:"text-xs text-muted-foreground",children:"控制麦麦的思考深度。经典模式回复快但简单;深度模式更深入但较慢;动态模式根据情况自动选择"})]}),e.jsxs("div",{className:"flex items-center space-x-2",children:[e.jsx(Fe,{id:"mentioned_bot_reply",checked:n.mentioned_bot_reply,onCheckedChange:h=>i({...n,mentioned_bot_reply:h})}),e.jsx(E,{htmlFor:"mentioned_bot_reply",className:"cursor-pointer",children:"启用提及必回复"})]}),e.jsxs("div",{className:"grid gap-2",children:[e.jsx(E,{htmlFor:"max_context_size",children:"上下文长度"}),e.jsx(le,{id:"max_context_size",type:"number",min:"1",value:n.max_context_size,onChange:h=>i({...n,max_context_size:parseInt(h.target.value)})})]}),e.jsxs("div",{className:"grid gap-2",children:[e.jsx(E,{htmlFor:"planner_smooth",children:"规划器平滑"}),e.jsx(le,{id:"planner_smooth",type:"number",step:"1",min:"0",value:n.planner_smooth,onChange:h=>i({...n,planner_smooth:parseFloat(h.target.value)})}),e.jsx("p",{className:"text-xs text-muted-foreground",children:"增大数值会减小 planner 负荷,推荐 1-5,0 为关闭"})]}),e.jsxs("div",{className:"flex items-center space-x-2",children:[e.jsx(Fe,{id:"enable_talk_value_rules",checked:n.enable_talk_value_rules,onCheckedChange:h=>i({...n,enable_talk_value_rules:h})}),e.jsx(E,{htmlFor:"enable_talk_value_rules",className:"cursor-pointer",children:"启用动态发言频率规则"})]})]})]}),n.enable_talk_value_rules&&e.jsxs("div",{className:"border-t pt-6",children:[e.jsxs("div",{className:"flex items-center justify-between mb-4",children:[e.jsxs("div",{children:[e.jsx("h4",{className:"text-base font-semibold",children:"动态发言频率规则"}),e.jsx("p",{className:"text-xs text-muted-foreground mt-1",children:"按时段或聊天流ID调整发言频率,优先匹配具体聊天,再匹配全局规则"})]}),e.jsxs(_,{onClick:c,size:"sm",children:[e.jsx(et,{className:"h-4 w-4 mr-1"}),"添加规则"]})]}),n.talk_value_rules&&n.talk_value_rules.length>0?e.jsx("div",{className:"space-y-4",children:n.talk_value_rules.map((h,f)=>e.jsxs("div",{className:"rounded-lg border p-4 bg-muted/50 space-y-4",children:[e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsxs("span",{className:"text-sm font-medium text-muted-foreground",children:["规则 #",f+1]}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(N2,{rule:h}),e.jsxs(vs,{children:[e.jsx(yt,{asChild:!0,children:e.jsx(_,{variant:"ghost",size:"sm",children:e.jsx(ls,{className:"h-4 w-4 text-destructive"})})}),e.jsxs(ds,{children:[e.jsxs(us,{children:[e.jsx(xs,{children:"确认删除"}),e.jsxs(hs,{children:["确定要删除规则 #",f+1," 吗?此操作无法撤销。"]})]}),e.jsxs(ms,{children:[e.jsx(ps,{children:"取消"}),e.jsx(fs,{onClick:()=>u(f),children:"删除"})]})]})]})]})]}),e.jsxs("div",{className:"space-y-4",children:[e.jsxs("div",{className:"grid gap-2",children:[e.jsx(E,{className:"text-xs font-medium",children:"配置类型"}),e.jsxs(Ie,{value:h.target===""?"global":"specific",onValueChange:p=>{p==="global"?x(f,"target",""):x(f,"target","qq::group")},children:[e.jsx($e,{children:e.jsx(Pe,{})}),e.jsxs(Be,{children:[e.jsx(X,{value:"global",children:"全局配置"}),e.jsx(X,{value:"specific",children:"详细配置"})]})]})]}),h.target!==""&&(()=>{const p=h.target.split(":"),g=p[0]||"qq",N=p[1]||"",v=p[2]||"group";return e.jsxs("div",{className:"grid gap-4 p-3 sm:p-4 rounded-lg bg-muted/50",children:[e.jsxs("div",{className:"grid grid-cols-1 sm:grid-cols-3 gap-3",children:[e.jsxs("div",{className:"grid gap-2",children:[e.jsx(E,{className:"text-xs font-medium",children:"平台"}),e.jsxs(Ie,{value:g,onValueChange:y=>{x(f,"target",`${y}:${N}:${v}`)},children:[e.jsx($e,{children:e.jsx(Pe,{})}),e.jsxs(Be,{children:[e.jsx(X,{value:"qq",children:"QQ"}),e.jsx(X,{value:"wx",children:"微信"})]})]})]}),e.jsxs("div",{className:"grid gap-2",children:[e.jsx(E,{className:"text-xs font-medium",children:"群 ID"}),e.jsx(le,{value:N,onChange:y=>{x(f,"target",`${g}:${y.target.value}:${v}`)},placeholder:"输入群 ID",className:"font-mono text-sm"})]}),e.jsxs("div",{className:"grid gap-2",children:[e.jsx(E,{className:"text-xs font-medium",children:"类型"}),e.jsxs(Ie,{value:v,onValueChange:y=>{x(f,"target",`${g}:${N}:${y}`)},children:[e.jsx($e,{children:e.jsx(Pe,{})}),e.jsxs(Be,{children:[e.jsx(X,{value:"group",children:"群组(group)"}),e.jsx(X,{value:"private",children:"私聊(private)"})]})]})]})]}),e.jsxs("p",{className:"text-xs text-muted-foreground",children:["当前聊天流 ID:",h.target||"(未设置)"]})]})})(),e.jsxs("div",{className:"grid gap-2",children:[e.jsx(E,{className:"text-xs font-medium",children:"时间段 (Time)"}),e.jsx(v2,{value:h.time,onChange:p=>x(f,"time",p)}),e.jsx("p",{className:"text-xs text-muted-foreground",children:"支持跨夜区间,例如 23:00-02:00"})]}),e.jsxs("div",{className:"grid gap-3",children:[e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsx(E,{htmlFor:`rule-value-${f}`,className:"text-xs font-medium",children:"发言频率值 (Value)"}),e.jsx(le,{id:`rule-value-${f}`,type:"number",step:"0.01",min:"0.01",max:"1",value:h.value,onChange:p=>{const g=parseFloat(p.target.value);isNaN(g)||x(f,"value",Math.max(.01,Math.min(1,g)))},className:"w-20 h-8 text-xs"})]}),e.jsx(Va,{value:[h.value],onValueChange:p=>x(f,"value",p[0]),min:.01,max:1,step:.01,className:"w-full"}),e.jsxs("div",{className:"flex justify-between text-xs text-muted-foreground",children:[e.jsx("span",{children:"0.01 (极少发言)"}),e.jsx("span",{children:"0.5"}),e.jsx("span",{children:"1.0 (正常)"})]})]})]})]},f))}):e.jsx("div",{className:"text-center py-8 text-muted-foreground",children:e.jsx("p",{className:"text-sm",children:'暂无规则,点击"添加规则"按钮创建'})}),e.jsxs("div",{className:"mt-4 p-4 bg-blue-50 dark:bg-blue-950/20 border border-blue-200 dark:border-blue-800 rounded-lg",children:[e.jsx("h5",{className:"text-sm font-semibold text-blue-900 dark:text-blue-100 mb-2",children:"📝 规则说明"}),e.jsxs("ul",{className:"text-xs text-blue-800 dark:text-blue-200 space-y-1",children:[e.jsxs("li",{children:["• ",e.jsx("strong",{children:"Target 为空"}),":全局规则,对所有聊天生效"]}),e.jsxs("li",{children:["• ",e.jsx("strong",{children:"Target 指定"}),":仅对特定聊天流生效(格式:platform:id:type)"]}),e.jsxs("li",{children:["• ",e.jsx("strong",{children:"优先级"}),":先匹配具体聊天流规则,再匹配全局规则"]}),e.jsxs("li",{children:["• ",e.jsx("strong",{children:"时间支持跨夜"}),":例如 23:00-02:00 表示晚上11点到次日凌晨2点"]}),e.jsxs("li",{children:["• ",e.jsx("strong",{children:"数值范围"}),":建议 0-1,0 表示完全沉默,1 表示正常发言"]})]})]})]})]})}),y2=As.memo(function({config:n,onChange:i}){const c=S=>{if(!S||!S.includes(":"))return{platform:"qq",userId:""};const[P,M]=S.split(":");return{platform:P,userId:M}},{platform:u,userId:x}=c(n.dream_send),[h,f]=d.useState(u),[p,g]=d.useState(x),N=S=>{const[P,M]=S.split("-");return{startTime:P||"09:00",endTime:M||"22:00"}},v=(S,P)=>{const M=P?`${S}:${P}`:"";i({...n,dream_send:M})},y=S=>{f(S),v(S,p)},w=S=>{g(S),v(h,S)},b=()=>{i({...n,dream_time_ranges:[...n.dream_time_ranges,"09:00-22:00"]})},R=S=>{i({...n,dream_time_ranges:n.dream_time_ranges.filter((P,M)=>M!==S)})},D=(S,P,M)=>{const T=[...n.dream_time_ranges],A=N(T[S]);P==="startTime"?A.startTime=M:A.endTime=M,T[S]=`${A.startTime}-${A.endTime}`,i({...n,dream_time_ranges:T})};return e.jsxs("div",{className:"rounded-lg border bg-card p-4 sm:p-6 space-y-6",children:[e.jsx("h3",{className:"text-lg font-semibold",children:"做梦配置"}),e.jsxs("div",{className:"space-y-2",children:[e.jsx(E,{htmlFor:"interval_minutes",children:"做梦时间间隔(分钟)"}),e.jsx(le,{id:"interval_minutes",type:"number",min:"1",value:n.interval_minutes,onChange:S=>i({...n,interval_minutes:Number(S.target.value)})}),e.jsx("p",{className:"text-xs text-muted-foreground",children:"默认30分钟"})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsx(E,{htmlFor:"max_iterations",children:"做梦最大轮次"}),e.jsx(le,{id:"max_iterations",type:"number",min:"1",value:n.max_iterations,onChange:S=>i({...n,max_iterations:Number(S.target.value)})}),e.jsx("p",{className:"text-xs text-muted-foreground",children:"默认20轮"})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsx(E,{htmlFor:"first_delay_seconds",children:"首次做梦延迟(秒)"}),e.jsx(le,{id:"first_delay_seconds",type:"number",min:"0",value:n.first_delay_seconds,onChange:S=>i({...n,first_delay_seconds:Number(S.target.value)})}),e.jsx("p",{className:"text-xs text-muted-foreground",children:"程序启动后首次做梦前的延迟时间,默认60秒"})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsx(E,{children:"做梦结果推送目标"}),e.jsxs("div",{className:"flex gap-2",children:[e.jsxs(Ie,{value:h,onValueChange:y,children:[e.jsx($e,{className:"w-[120px]",children:e.jsx(Pe,{placeholder:"选择平台"})}),e.jsxs(Be,{children:[e.jsx(X,{value:"qq",children:"QQ"}),e.jsx(X,{value:"wx",children:"微信"}),e.jsx(X,{value:"webui",children:"WebUI"})]})]}),e.jsx(le,{type:"text",placeholder:"输入用户ID (例如: 123456)",value:p,onChange:S=>w(S.target.value),className:"flex-1"})]}),e.jsx("p",{className:"text-xs text-muted-foreground",children:"选择平台并输入用户ID,做梦结束后将梦境发送给该用户。用户ID为空则不推送"})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsx(E,{children:"做梦时间段配置"}),e.jsx(_,{type:"button",size:"sm",onClick:b,children:"添加时间段"})]}),e.jsx("p",{className:"text-xs text-muted-foreground",children:"设置允许做梦的时间段,支持跨夜区间(如 23:00 到次日 02:00)。列表为空则全天允许做梦"}),e.jsxs("div",{className:"space-y-2",children:[n.dream_time_ranges.map((S,P)=>{const{startTime:M,endTime:T}=N(S);return e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(le,{type:"time",value:M,onChange:A=>D(P,"startTime",A.target.value),className:"w-[140px]"}),e.jsx("span",{className:"text-muted-foreground",children:"至"}),e.jsx(le,{type:"time",value:T,onChange:A=>D(P,"endTime",A.target.value),className:"w-[140px]"}),e.jsx(_,{type:"button",variant:"ghost",size:"icon",onClick:()=>R(P),children:e.jsx(Ta,{className:"h-4 w-4"})})]},P)}),n.dream_time_ranges.length===0&&e.jsx("p",{className:"text-sm text-muted-foreground",children:"当前配置为全天允许做梦"})]})]})]})}),w2=As.memo(function({config:n,onChange:i}){return e.jsxs("div",{className:"rounded-lg border bg-card p-4 sm:p-6 space-y-4",children:[e.jsx("h3",{className:"text-lg font-semibold",children:"LPMM 知识库设置"}),e.jsxs("div",{className:"grid gap-4",children:[e.jsxs("div",{className:"flex items-center space-x-2",children:[e.jsx(Fe,{checked:n.enable,onCheckedChange:c=>i({...n,enable:c})}),e.jsx(E,{className:"cursor-pointer",children:"启用 LPMM 知识库"})]}),n.enable&&e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"grid gap-2",children:[e.jsx(E,{children:"LPMM 模式"}),e.jsxs(Ie,{value:n.lpmm_mode,onValueChange:c=>i({...n,lpmm_mode:c}),children:[e.jsx($e,{children:e.jsx(Pe,{placeholder:"选择 LPMM 模式"})}),e.jsxs(Be,{children:[e.jsx(X,{value:"classic",children:"经典模式"}),e.jsx(X,{value:"agent",children:"Agent 模式"})]})]})]}),e.jsxs("div",{className:"grid grid-cols-1 sm:grid-cols-2 gap-4",children:[e.jsxs("div",{className:"grid gap-2",children:[e.jsx(E,{children:"同义词搜索 TopK"}),e.jsx(le,{type:"number",min:"1",value:n.rag_synonym_search_top_k,onChange:c=>i({...n,rag_synonym_search_top_k:parseInt(c.target.value)})})]}),e.jsxs("div",{className:"grid gap-2",children:[e.jsx(E,{children:"同义词阈值"}),e.jsx(le,{type:"number",step:"0.1",min:"0",max:"1",value:n.rag_synonym_threshold,onChange:c=>i({...n,rag_synonym_threshold:parseFloat(c.target.value)})})]}),e.jsxs("div",{className:"grid gap-2",children:[e.jsx(E,{children:"实体提取线程数"}),e.jsx(le,{type:"number",min:"1",value:n.info_extraction_workers,onChange:c=>i({...n,info_extraction_workers:parseInt(c.target.value)})})]}),e.jsxs("div",{className:"grid gap-2",children:[e.jsx(E,{children:"嵌入向量维度"}),e.jsx(le,{type:"number",min:"1",value:n.embedding_dimension,onChange:c=>i({...n,embedding_dimension:parseInt(c.target.value)})})]}),e.jsxs("div",{className:"grid gap-2",children:[e.jsx(E,{children:"嵌入并发线程数"}),e.jsx(le,{type:"number",min:"1",value:n.max_embedding_workers,onChange:c=>i({...n,max_embedding_workers:parseInt(c.target.value)})})]}),e.jsxs("div",{className:"grid gap-2",children:[e.jsx(E,{children:"每批嵌入条数"}),e.jsx(le,{type:"number",min:"1",value:n.embedding_chunk_size,onChange:c=>i({...n,embedding_chunk_size:parseInt(c.target.value)})})]}),e.jsxs("div",{className:"grid gap-2",children:[e.jsx(E,{children:"同义实体数上限"}),e.jsx(le,{type:"number",min:"1",value:n.max_synonym_entities,onChange:c=>i({...n,max_synonym_entities:parseInt(c.target.value)})})]})]}),e.jsxs("div",{className:"flex items-center space-x-2",children:[e.jsx(Fe,{checked:n.enable_ppr,onCheckedChange:c=>i({...n,enable_ppr:c})}),e.jsx(E,{className:"cursor-pointer",children:"启用 PPR (低配机器可关闭)"})]})]})]})]})}),_2=As.memo(function({config:n,onChange:i}){const[c,u]=d.useState(""),[x,h]=d.useState("WARNING"),f=()=>{c&&!n.suppress_libraries.includes(c)&&(i({...n,suppress_libraries:[...n.suppress_libraries,c]}),u(""))},p=b=>{i({...n,suppress_libraries:n.suppress_libraries.filter(R=>R!==b)})},g=()=>{c&&!n.library_log_levels[c]&&(i({...n,library_log_levels:{...n.library_log_levels,[c]:x}}),u(""),h("WARNING"))},N=b=>{const R={...n.library_log_levels};delete R[b],i({...n,library_log_levels:R})},v=["DEBUG","INFO","WARNING","ERROR","CRITICAL"],y=["FULL","compact","lite"],w=["none","title","full"];return e.jsxs("div",{className:"rounded-lg border bg-card p-4 sm:p-6 space-y-6",children:[e.jsxs("div",{children:[e.jsx("h3",{className:"text-lg font-semibold mb-4",children:"日志配置"}),e.jsxs("div",{className:"grid grid-cols-1 sm:grid-cols-2 gap-4",children:[e.jsxs("div",{className:"grid gap-2",children:[e.jsx(E,{children:"日期格式"}),e.jsx(le,{value:n.date_style,onChange:b=>i({...n,date_style:b.target.value}),placeholder:"例如: m-d H:i:s"}),e.jsx("p",{className:"text-xs text-muted-foreground",children:"m=月, d=日, H=时, i=分, s=秒"})]}),e.jsxs("div",{className:"grid gap-2",children:[e.jsx(E,{children:"日志级别样式"}),e.jsxs(Ie,{value:n.log_level_style,onValueChange:b=>i({...n,log_level_style:b}),children:[e.jsx($e,{children:e.jsx(Pe,{})}),e.jsx(Be,{children:y.map(b=>e.jsx(X,{value:b,children:b},b))})]})]}),e.jsxs("div",{className:"grid gap-2",children:[e.jsx(E,{children:"日志文本颜色"}),e.jsxs(Ie,{value:n.color_text,onValueChange:b=>i({...n,color_text:b}),children:[e.jsx($e,{children:e.jsx(Pe,{})}),e.jsx(Be,{children:w.map(b=>e.jsx(X,{value:b,children:b},b))})]})]}),e.jsxs("div",{className:"grid gap-2",children:[e.jsx(E,{children:"全局日志级别"}),e.jsxs(Ie,{value:n.log_level,onValueChange:b=>i({...n,log_level:b}),children:[e.jsx($e,{children:e.jsx(Pe,{})}),e.jsx(Be,{children:v.map(b=>e.jsx(X,{value:b,children:b},b))})]})]}),e.jsxs("div",{className:"grid gap-2",children:[e.jsx(E,{children:"控制台日志级别"}),e.jsxs(Ie,{value:n.console_log_level,onValueChange:b=>i({...n,console_log_level:b}),children:[e.jsx($e,{children:e.jsx(Pe,{})}),e.jsx(Be,{children:v.map(b=>e.jsx(X,{value:b,children:b},b))})]})]}),e.jsxs("div",{className:"grid gap-2",children:[e.jsx(E,{children:"文件日志级别"}),e.jsxs(Ie,{value:n.file_log_level,onValueChange:b=>i({...n,file_log_level:b}),children:[e.jsx($e,{children:e.jsx(Pe,{})}),e.jsx(Be,{children:v.map(b=>e.jsx(X,{value:b,children:b},b))})]})]})]})]}),e.jsxs("div",{children:[e.jsx(E,{className:"mb-2 block",children:"完全屏蔽的库"}),e.jsxs("div",{className:"flex gap-2 mb-2",children:[e.jsx(le,{value:c,onChange:b=>u(b.target.value),placeholder:"输入库名",className:"flex-1",onKeyDown:b=>{b.key==="Enter"&&(b.preventDefault(),f())}}),e.jsx(_,{onClick:f,size:"sm",className:"flex-shrink-0",children:e.jsx(et,{className:"h-4 w-4",strokeWidth:2,fill:"none"})})]}),e.jsx("div",{className:"flex flex-wrap gap-2",children:n.suppress_libraries.map(b=>e.jsxs("div",{className:"flex items-center gap-1 bg-secondary px-3 py-1 rounded-md",children:[e.jsx("span",{className:"text-sm",children:b}),e.jsx(_,{variant:"ghost",size:"sm",className:"h-5 w-5 p-0",onClick:()=>p(b),children:e.jsx(ls,{className:"h-3 w-3",strokeWidth:2,fill:"none"})})]},b))})]}),e.jsxs("div",{children:[e.jsx(E,{className:"mb-2 block",children:"特定库的日志级别"}),e.jsxs("div",{className:"flex gap-2 mb-2",children:[e.jsx(le,{value:c,onChange:b=>u(b.target.value),placeholder:"输入库名",className:"flex-1"}),e.jsxs(Ie,{value:x,onValueChange:h,children:[e.jsx($e,{className:"w-32",children:e.jsx(Pe,{})}),e.jsx(Be,{children:v.map(b=>e.jsx(X,{value:b,children:b},b))})]}),e.jsx(_,{onClick:g,size:"sm",children:e.jsx(et,{className:"h-4 w-4",strokeWidth:2,fill:"none"})})]}),e.jsx("div",{className:"space-y-2",children:Object.entries(n.library_log_levels).map(([b,R])=>e.jsxs("div",{className:"flex items-center justify-between bg-secondary px-3 py-2 rounded-md",children:[e.jsx("span",{className:"text-sm font-medium",children:b}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("span",{className:"text-sm text-muted-foreground",children:R}),e.jsx(_,{variant:"ghost",size:"sm",className:"h-6 w-6 p-0",onClick:()=>N(b),children:e.jsx(ls,{className:"h-3 w-3",strokeWidth:2,fill:"none"})})]})]},b))})]})]})}),S2=As.memo(function({config:n,onChange:i}){return e.jsxs("div",{className:"rounded-lg border bg-card p-4 sm:p-6 space-y-4",children:[e.jsx("h3",{className:"text-lg font-semibold",children:"调试配置"}),e.jsxs("div",{className:"space-y-4",children:[e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsxs("div",{className:"space-y-0.5",children:[e.jsx(E,{children:"显示 Prompt"}),e.jsx("p",{className:"text-sm text-muted-foreground",children:"是否在日志中显示提示词"})]}),e.jsx(Fe,{checked:n.show_prompt,onCheckedChange:c=>i({...n,show_prompt:c})})]}),e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsxs("div",{className:"space-y-0.5",children:[e.jsx(E,{children:"显示回复器 Prompt"}),e.jsx("p",{className:"text-sm text-muted-foreground",children:"是否显示回复器的提示词"})]}),e.jsx(Fe,{checked:n.show_replyer_prompt,onCheckedChange:c=>i({...n,show_replyer_prompt:c})})]}),e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsxs("div",{className:"space-y-0.5",children:[e.jsx(E,{children:"显示回复器推理"}),e.jsx("p",{className:"text-sm text-muted-foreground",children:"是否显示回复器的推理过程"})]}),e.jsx(Fe,{checked:n.show_replyer_reasoning,onCheckedChange:c=>i({...n,show_replyer_reasoning:c})})]}),e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsxs("div",{className:"space-y-0.5",children:[e.jsx(E,{children:"显示 Jargon Prompt"}),e.jsx("p",{className:"text-sm text-muted-foreground",children:"是否显示术语相关的提示词"})]}),e.jsx(Fe,{checked:n.show_jargon_prompt,onCheckedChange:c=>i({...n,show_jargon_prompt:c})})]}),e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsxs("div",{className:"space-y-0.5",children:[e.jsx(E,{children:"显示记忆检索 Prompt"}),e.jsx("p",{className:"text-sm text-muted-foreground",children:"是否显示记忆检索相关的提示词"})]}),e.jsx(Fe,{checked:n.show_memory_prompt,onCheckedChange:c=>i({...n,show_memory_prompt:c})})]}),e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsxs("div",{className:"space-y-0.5",children:[e.jsx(E,{children:"显示 Planner Prompt"}),e.jsx("p",{className:"text-sm text-muted-foreground",children:"是否显示 Planner 的提示词和原始返回结果"})]}),e.jsx(Fe,{checked:n.show_planner_prompt,onCheckedChange:c=>i({...n,show_planner_prompt:c})})]}),e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsxs("div",{className:"space-y-0.5",children:[e.jsx(E,{children:"显示 LPMM 相关文段"}),e.jsx("p",{className:"text-sm text-muted-foreground",children:"是否显示 LPMM 知识库找到的相关文段日志"})]}),e.jsx(Fe,{checked:n.show_lpmm_paragraph,onCheckedChange:c=>i({...n,show_lpmm_paragraph:c})})]})]})]})}),k2=As.memo(function({config:n,onChange:i}){const[c,u]=d.useState(""),[x,h]=d.useState(""),f=()=>{c&&!n.auth_token.includes(c)&&(i({...n,auth_token:[...n.auth_token,c]}),u(""))},p=v=>{i({...n,auth_token:n.auth_token.filter((y,w)=>w!==v)})},g=()=>{x&&!n.api_server_allowed_api_keys.includes(x)&&(i({...n,api_server_allowed_api_keys:[...n.api_server_allowed_api_keys,x]}),h(""))},N=v=>{i({...n,api_server_allowed_api_keys:n.api_server_allowed_api_keys.filter((y,w)=>w!==v)})};return e.jsxs("div",{className:"rounded-lg border bg-card p-4 sm:p-6 space-y-6",children:[e.jsxs("div",{children:[e.jsx("h3",{className:"text-lg font-semibold mb-2",children:"旧版 API 认证令牌"}),e.jsx("p",{className:"text-sm text-muted-foreground mb-3",children:"用于旧版 API 验证,为空则不启用验证"}),e.jsxs("div",{className:"flex gap-2 mb-2",children:[e.jsx(le,{value:c,onChange:v=>u(v.target.value),placeholder:"输入认证令牌",onKeyDown:v=>{v.key==="Enter"&&(v.preventDefault(),f())}}),e.jsx(_,{onClick:f,size:"sm",children:e.jsx(et,{className:"h-4 w-4",strokeWidth:2,fill:"none"})})]}),e.jsx("div",{className:"space-y-2",children:n.auth_token.map((v,y)=>e.jsxs("div",{className:"flex items-center justify-between bg-secondary px-3 py-2 rounded-md",children:[e.jsx("span",{className:"text-sm font-mono",children:v}),e.jsx(_,{variant:"ghost",size:"sm",className:"h-6 w-6 p-0",onClick:()=>p(y),children:e.jsx(ls,{className:"h-3 w-3",strokeWidth:2,fill:"none"})})]},y))})]}),e.jsxs("div",{children:[e.jsx("h3",{className:"text-lg font-semibold mb-4",children:"新版 API Server 配置"}),e.jsxs("div",{className:"space-y-4",children:[e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsxs("div",{className:"space-y-0.5",children:[e.jsx(E,{children:"启用新版 API Server"}),e.jsx("p",{className:"text-sm text-muted-foreground",children:"是否启用额外的新版 API Server(额外监听端口)"})]}),e.jsx(Fe,{checked:n.enable_api_server,onCheckedChange:v=>i({...n,enable_api_server:v})})]}),n.enable_api_server&&e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"grid grid-cols-1 sm:grid-cols-2 gap-4",children:[e.jsxs("div",{className:"grid gap-2",children:[e.jsx(E,{children:"主机地址"}),e.jsx(le,{value:n.api_server_host,onChange:v=>i({...n,api_server_host:v.target.value}),placeholder:"0.0.0.0"})]}),e.jsxs("div",{className:"grid gap-2",children:[e.jsx(E,{children:"端口号"}),e.jsx(le,{type:"number",value:n.api_server_port,onChange:v=>i({...n,api_server_port:parseInt(v.target.value)}),placeholder:"8090"})]})]}),e.jsxs("div",{className:"flex items-center space-x-2",children:[e.jsx(Fe,{checked:n.api_server_use_wss,onCheckedChange:v=>i({...n,api_server_use_wss:v})}),e.jsx(E,{children:"启用 WSS 安全连接"})]}),n.api_server_use_wss&&e.jsxs("div",{className:"grid gap-4",children:[e.jsxs("div",{className:"grid gap-2",children:[e.jsx(E,{children:"SSL 证书文件路径"}),e.jsx(le,{value:n.api_server_cert_file,onChange:v=>i({...n,api_server_cert_file:v.target.value}),placeholder:"cert.pem"})]}),e.jsxs("div",{className:"grid gap-2",children:[e.jsx(E,{children:"SSL 密钥文件路径"}),e.jsx(le,{value:n.api_server_key_file,onChange:v=>i({...n,api_server_key_file:v.target.value}),placeholder:"key.pem"})]})]}),e.jsxs("div",{children:[e.jsx(E,{className:"mb-2 block",children:"允许的 API Key 列表"}),e.jsx("p",{className:"text-sm text-muted-foreground mb-2",children:"为空则允许所有连接"}),e.jsxs("div",{className:"flex gap-2 mb-2",children:[e.jsx(le,{value:x,onChange:v=>h(v.target.value),placeholder:"输入 API Key",onKeyDown:v=>{v.key==="Enter"&&(v.preventDefault(),g())}}),e.jsx(_,{onClick:g,size:"sm",children:e.jsx(et,{className:"h-4 w-4",strokeWidth:2,fill:"none"})})]}),e.jsx("div",{className:"space-y-2",children:n.api_server_allowed_api_keys.map((v,y)=>e.jsxs("div",{className:"flex items-center justify-between bg-secondary px-3 py-2 rounded-md",children:[e.jsx("span",{className:"text-sm font-mono",children:v}),e.jsx(_,{variant:"ghost",size:"sm",className:"h-6 w-6 p-0",onClick:()=>N(y),children:e.jsx(ls,{className:"h-3 w-3",strokeWidth:2,fill:"none"})})]},y))})]})]})]})]})]})}),C2=As.memo(function({config:n,onChange:i}){return e.jsxs("div",{className:"rounded-lg border bg-card p-4 sm:p-6 space-y-4",children:[e.jsx("h3",{className:"text-lg font-semibold",children:"统计信息"}),e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsxs("div",{className:"space-y-0.5",children:[e.jsx(E,{children:"启用统计信息发送"}),e.jsx("p",{className:"text-sm text-muted-foreground",children:"发送匿名统计信息,帮助我们了解全球有多少只麦麦在运行"})]}),e.jsx(Fe,{checked:n.enable,onCheckedChange:c=>i({...n,enable:c})})]})]})}),T2=As.memo(function({emojiConfig:n,memoryConfig:i,toolConfig:c,voiceConfig:u,onEmojiChange:x,onMemoryChange:h,onToolChange:f,onVoiceChange:p}){return e.jsxs("div",{className:"space-y-6",children:[e.jsx("div",{className:"rounded-lg border bg-card p-4 sm:p-6 space-y-4",children:e.jsxs("div",{children:[e.jsx("h3",{className:"text-lg font-semibold mb-4",children:"工具设置"}),e.jsxs("div",{className:"space-y-4",children:[e.jsxs("div",{className:"flex items-center space-x-2",children:[e.jsx(Fe,{id:"enable_tool",checked:c.enable_tool,onCheckedChange:g=>f({...c,enable_tool:g})}),e.jsx(E,{htmlFor:"enable_tool",className:"cursor-pointer",children:"启用工具系统"})]}),e.jsx("p",{className:"text-xs text-muted-foreground -mt-2",children:"允许麦麦使用各种工具来增强功能"}),e.jsxs("div",{className:"flex items-center space-x-2 pt-2",children:[e.jsx(Fe,{id:"enable_asr",checked:u.enable_asr,onCheckedChange:g=>p({...u,enable_asr:g})}),e.jsx(E,{htmlFor:"enable_asr",className:"cursor-pointer",children:"启用语音识别"})]}),e.jsx("p",{className:"text-xs text-muted-foreground -mt-2",children:"启用后麦麦可以识别语音消息,需要配置语音识别模型"})]})]})}),e.jsx("div",{className:"rounded-lg border bg-card p-4 sm:p-6 space-y-4",children:e.jsxs("div",{children:[e.jsx("h3",{className:"text-lg font-semibold mb-4",children:"记忆设置"}),e.jsxs("div",{className:"grid gap-4",children:[e.jsxs("div",{className:"grid gap-2",children:[e.jsx(E,{htmlFor:"max_agent_iterations",children:"记忆思考深度"}),e.jsx(le,{id:"max_agent_iterations",type:"number",min:"1",value:i.max_agent_iterations,onChange:g=>h({...i,max_agent_iterations:parseInt(g.target.value)})}),e.jsx("p",{className:"text-xs text-muted-foreground",children:"最低为 1(不深入思考)"})]}),e.jsxs("div",{className:"grid gap-2",children:[e.jsx(E,{htmlFor:"agent_timeout_seconds",children:"最长回忆时间(秒)"}),e.jsx(le,{id:"agent_timeout_seconds",type:"number",min:"1",step:"0.1",value:i.agent_timeout_seconds??120,onChange:g=>h({...i,agent_timeout_seconds:parseFloat(g.target.value)})}),e.jsx("p",{className:"text-xs text-muted-foreground",children:"记忆检索的超时时间,避免过长的等待"})]}),e.jsxs("div",{className:"flex items-center space-x-2",children:[e.jsx(Fe,{id:"enable_jargon_detection",checked:i.enable_jargon_detection??!0,onCheckedChange:g=>h({...i,enable_jargon_detection:g})}),e.jsx(E,{htmlFor:"enable_jargon_detection",className:"cursor-pointer",children:"启用黑话识别"})]}),e.jsx("p",{className:"text-xs text-muted-foreground -mt-2",children:"记忆检索过程中是否启用黑话识别"}),e.jsxs("div",{className:"flex items-center space-x-2",children:[e.jsx(Fe,{id:"global_memory",checked:i.global_memory??!1,onCheckedChange:g=>h({...i,global_memory:g})}),e.jsx(E,{htmlFor:"global_memory",className:"cursor-pointer",children:"全局记忆查询"})]}),e.jsx("p",{className:"text-xs text-muted-foreground -mt-2",children:"允许记忆检索在所有聊天记录中进行全局查询(忽略当前聊天流)"})]})]})}),e.jsx("div",{className:"rounded-lg border bg-card p-4 sm:p-6 space-y-4",children:e.jsxs("div",{children:[e.jsx("h3",{className:"text-lg font-semibold mb-4",children:"表情包设置"}),e.jsxs("div",{className:"grid gap-4",children:[e.jsxs("div",{className:"grid gap-2",children:[e.jsx(E,{htmlFor:"emoji_chance",children:"表情包激活概率"}),e.jsx(le,{id:"emoji_chance",type:"number",step:"0.1",min:"0",max:"1",value:n.emoji_chance,onChange:g=>x({...n,emoji_chance:parseFloat(g.target.value)})}),e.jsx("p",{className:"text-xs text-muted-foreground",children:"范围 0-1,越大越容易发送表情包"})]}),e.jsxs("div",{className:"grid gap-2",children:[e.jsx(E,{htmlFor:"max_reg_num",children:"最大注册数量"}),e.jsx(le,{id:"max_reg_num",type:"number",min:"1",value:n.max_reg_num,onChange:g=>x({...n,max_reg_num:parseInt(g.target.value)})}),e.jsx("p",{className:"text-xs text-muted-foreground",children:"麦麦最多可以注册的表情包数量"})]}),e.jsxs("div",{className:"grid gap-2",children:[e.jsx(E,{htmlFor:"check_interval",children:"检查间隔(分钟)"}),e.jsx(le,{id:"check_interval",type:"number",min:"1",value:n.check_interval,onChange:g=>x({...n,check_interval:parseInt(g.target.value)})}),e.jsx("p",{className:"text-xs text-muted-foreground",children:"检查表情包(注册、破损、删除)的时间间隔"})]}),e.jsxs("div",{className:"flex items-center space-x-2",children:[e.jsx(Fe,{id:"do_replace",checked:n.do_replace,onCheckedChange:g=>x({...n,do_replace:g})}),e.jsx(E,{htmlFor:"do_replace",className:"cursor-pointer",children:"达到最大数量时替换表情包"})]}),e.jsxs("div",{className:"flex items-center space-x-2",children:[e.jsx(Fe,{id:"steal_emoji",checked:n.steal_emoji,onCheckedChange:g=>x({...n,steal_emoji:g})}),e.jsx(E,{htmlFor:"steal_emoji",className:"cursor-pointer",children:"偷取表情包"})]}),e.jsx("p",{className:"text-xs text-muted-foreground -mt-2",children:"允许麦麦将看到的表情包据为己有"}),e.jsxs("div",{className:"flex items-center space-x-2",children:[e.jsx(Fe,{id:"content_filtration",checked:n.content_filtration,onCheckedChange:g=>x({...n,content_filtration:g})}),e.jsx(E,{htmlFor:"content_filtration",className:"cursor-pointer",children:"启用表情包过滤"})]}),n.content_filtration&&e.jsxs("div",{className:"grid gap-2 pl-6 border-l-2 border-primary/20",children:[e.jsx(E,{htmlFor:"filtration_prompt",children:"过滤要求"}),e.jsx(le,{id:"filtration_prompt",value:n.filtration_prompt,onChange:g=>x({...n,filtration_prompt:g.target.value}),placeholder:"符合公序良俗"}),e.jsx("p",{className:"text-xs text-muted-foreground",children:"只有符合此要求的表情包才会被保存"})]})]})]})})]})}),E2=As.memo(function({member:n,groupIndex:i,memberIndex:c,availableChatIds:u,onUpdate:x,onRemove:h}){const f=u.includes(n)||n==="*",[p,g]=d.useState(!f);return e.jsxs("div",{className:"flex gap-2",children:[e.jsx("div",{className:"flex-1 flex gap-2",children:p?e.jsxs(e.Fragment,{children:[e.jsx(le,{value:n,onChange:N=>x(i,c,N.target.value),placeholder:'输入 "*" 或 "qq:123456:group"',className:"flex-1"}),u.length>0&&e.jsx(_,{size:"sm",variant:"outline",onClick:()=>g(!1),title:"切换到下拉选择",children:"下拉"})]}):e.jsxs(e.Fragment,{children:[e.jsxs(Ie,{value:n,onValueChange:N=>x(i,c,N),children:[e.jsx($e,{className:"flex-1",children:e.jsx(Pe,{placeholder:"选择聊天流"})}),e.jsxs(Be,{children:[e.jsx(X,{value:"*",children:"* (全局共享)"}),u.map((N,v)=>e.jsx(X,{value:N,children:N},v))]})]}),e.jsx(_,{size:"sm",variant:"outline",onClick:()=>g(!0),title:"切换到手动输入",children:"输入"})]})}),e.jsxs(vs,{children:[e.jsx(yt,{asChild:!0,children:e.jsx(_,{size:"icon",variant:"outline",children:e.jsx(ls,{className:"h-4 w-4"})})}),e.jsxs(ds,{children:[e.jsxs(us,{children:[e.jsx(xs,{children:"确认删除"}),e.jsxs(hs,{children:['确定要删除组成员 "',n||"(空)",'" 吗?此操作无法撤销。']})]}),e.jsxs(ms,{children:[e.jsx(ps,{children:"取消"}),e.jsx(fs,{onClick:()=>h(i,c),children:"删除"})]})]})]})]})}),M2=As.memo(function({config:n,onChange:i}){const c=()=>{i({...n,learning_list:[...n.learning_list,["","enable","enable","1.0"]]})},u=y=>{i({...n,learning_list:n.learning_list.filter((w,b)=>b!==y)})},x=(y,w,b)=>{const R=[...n.learning_list];R[y][w]=b,i({...n,learning_list:R})},h=({rule:y})=>{const w=`["${y[0]}", "${y[1]}", "${y[2]}", "${y[3]}"]`;return e.jsxs(ol,{children:[e.jsx(dl,{asChild:!0,children:e.jsxs(_,{variant:"outline",size:"sm",children:[e.jsx(ia,{className:"h-4 w-4 mr-1"}),"预览"]})}),e.jsx(Wa,{className:"w-80 sm:w-96",children:e.jsxs("div",{className:"space-y-2",children:[e.jsx("h4",{className:"font-medium text-sm",children:"配置预览"}),e.jsx("div",{className:"rounded-md bg-muted p-3 font-mono text-xs break-all",children:w}),e.jsx("p",{className:"text-xs text-muted-foreground",children:"这是保存到 bot_config.toml 文件中的格式"})]})})]})},f=()=>{i({...n,expression_groups:[...n.expression_groups,[]]})},p=y=>{i({...n,expression_groups:n.expression_groups.filter((w,b)=>b!==y)})},g=y=>{const w=[...n.expression_groups];w[y]=[...w[y],""],i({...n,expression_groups:w})},N=(y,w)=>{const b=[...n.expression_groups];b[y]=b[y].filter((R,D)=>D!==w),i({...n,expression_groups:b})},v=(y,w,b)=>{const R=[...n.expression_groups];R[y][w]=b,i({...n,expression_groups:R})};return e.jsxs("div",{className:"space-y-6",children:[e.jsxs("div",{className:"rounded-lg border bg-card p-4 sm:p-6 space-y-4",children:[e.jsx("h3",{className:"text-lg font-semibold mb-4",children:"黑话设置"}),e.jsxs("div",{children:[e.jsxs("div",{className:"flex items-center space-x-2",children:[e.jsx(Fe,{id:"all_global_jargon",checked:n.all_global_jargon??!1,onCheckedChange:y=>i({...n,all_global_jargon:y})}),e.jsx(E,{htmlFor:"all_global_jargon",className:"cursor-pointer",children:"全局黑话模式"})]}),e.jsx("p",{className:"text-xs text-muted-foreground mt-2",children:"开启后,新增的黑话将默认设为全局(所有聊天流共享)。关闭后,已记录的全局黑话不会改变,需要手动删除。"})]}),e.jsxs("div",{children:[e.jsxs("div",{className:"flex items-center space-x-2",children:[e.jsx(Fe,{id:"enable_jargon_explanation",checked:n.enable_jargon_explanation??!0,onCheckedChange:y=>i({...n,enable_jargon_explanation:y})}),e.jsx(E,{htmlFor:"enable_jargon_explanation",className:"cursor-pointer",children:"启用黑话解释"})]}),e.jsx("p",{className:"text-xs text-muted-foreground mt-2",children:"在回复前尝试对上下文中的黑话进行解释。关闭可减少一次LLM调用,仅影响回复前的黑话匹配与解释,不影响黑话学习。"})]}),e.jsxs("div",{children:[e.jsx(E,{htmlFor:"jargon_mode",children:"黑话解释来源模式"}),e.jsxs(Ie,{value:n.jargon_mode??"context",onValueChange:y=>i({...n,jargon_mode:y}),children:[e.jsx($e,{id:"jargon_mode",className:"mt-2",children:e.jsx(Pe,{placeholder:"选择黑话解释来源"})}),e.jsxs(Be,{children:[e.jsx(X,{value:"context",children:"上下文模式(自动匹配黑话)"}),e.jsx(X,{value:"planner",children:"Planner模式(使用unknown_words列表)"})]})]}),e.jsxs("p",{className:"text-xs text-muted-foreground mt-2",children:["上下文模式:使用上下文自动匹配黑话并解释",e.jsx("br",{}),"Planner模式:仅使用Planner在reply动作中给出的unknown_words列表进行黑话检索"]})]})]}),e.jsx("div",{className:"rounded-lg border bg-card p-4 sm:p-6 space-y-6",children:e.jsxs("div",{children:[e.jsxs("div",{className:"flex items-center justify-between mb-4",children:[e.jsxs("div",{children:[e.jsx("h3",{className:"text-lg font-semibold",children:"表达学习配置"}),e.jsx("p",{className:"text-sm text-muted-foreground mt-1",children:"配置麦麦如何学习和使用表达方式"})]}),e.jsxs(_,{onClick:c,size:"sm",variant:"outline",children:[e.jsx(et,{className:"h-4 w-4 mr-1"}),"添加规则"]})]}),e.jsxs("div",{className:"space-y-4",children:[n.learning_list.map((y,w)=>{const b=n.learning_list.some((T,A)=>A!==w&&T[0]===""),R=y[0]==="",D=y[0].split(":"),S=D[0]||"qq",P=D[1]||"",M=D[2]||"group";return e.jsxs("div",{className:"rounded-lg border p-4 space-y-4",children:[e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsxs("span",{className:"text-sm font-medium",children:["规则 ",w+1," ",R&&"(全局配置)"]}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(h,{rule:y}),e.jsxs(vs,{children:[e.jsx(yt,{asChild:!0,children:e.jsx(_,{size:"sm",variant:"ghost",children:e.jsx(ls,{className:"h-4 w-4"})})}),e.jsxs(ds,{children:[e.jsxs(us,{children:[e.jsx(xs,{children:"确认删除"}),e.jsxs(hs,{children:["确定要删除学习规则 ",w+1," 吗?此操作无法撤销。"]})]}),e.jsxs(ms,{children:[e.jsx(ps,{children:"取消"}),e.jsx(fs,{onClick:()=>u(w),children:"删除"})]})]})]})]})]}),e.jsxs("div",{className:"space-y-4",children:[e.jsxs("div",{className:"grid gap-2",children:[e.jsx(E,{className:"text-xs font-medium",children:"配置类型"}),e.jsxs(Ie,{value:R?"global":"specific",onValueChange:T=>{T==="global"?x(w,0,""):x(w,0,"qq::group")},disabled:b&&!R,children:[e.jsx($e,{children:e.jsx(Pe,{})}),e.jsxs(Be,{children:[e.jsx(X,{value:"global",children:"全局配置"}),e.jsx(X,{value:"specific",disabled:b&&!R,children:"详细配置"})]})]}),b&&!R&&e.jsx("p",{className:"text-xs text-amber-600",children:"已存在全局配置,无法创建新的全局配置"})]}),!R&&e.jsxs("div",{className:"grid gap-4 p-3 sm:p-4 rounded-lg bg-muted/50",children:[e.jsxs("div",{className:"grid grid-cols-1 sm:grid-cols-3 gap-3",children:[e.jsxs("div",{className:"grid gap-2",children:[e.jsx(E,{className:"text-xs font-medium",children:"平台"}),e.jsxs(Ie,{value:S,onValueChange:T=>{x(w,0,`${T}:${P}:${M}`)},children:[e.jsx($e,{children:e.jsx(Pe,{})}),e.jsxs(Be,{children:[e.jsx(X,{value:"qq",children:"QQ"}),e.jsx(X,{value:"wx",children:"微信"})]})]})]}),e.jsxs("div",{className:"grid gap-2",children:[e.jsx(E,{className:"text-xs font-medium",children:"群 ID"}),e.jsx(le,{value:P,onChange:T=>{x(w,0,`${S}:${T.target.value}:${M}`)},placeholder:"输入群 ID",className:"font-mono text-sm"})]}),e.jsxs("div",{className:"grid gap-2",children:[e.jsx(E,{className:"text-xs font-medium",children:"类型"}),e.jsxs(Ie,{value:M,onValueChange:T=>{x(w,0,`${S}:${P}:${T}`)},children:[e.jsx($e,{children:e.jsx(Pe,{})}),e.jsxs(Be,{children:[e.jsx(X,{value:"group",children:"群组(group)"}),e.jsx(X,{value:"private",children:"私聊(private)"})]})]})]})]}),e.jsxs("p",{className:"text-xs text-muted-foreground",children:["当前聊天流 ID:",y[0]||"(未设置)"]})]}),e.jsx("div",{className:"grid gap-2",children:e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsxs("div",{children:[e.jsx(E,{className:"text-xs font-medium",children:"使用学到的表达"}),e.jsx("p",{className:"text-xs text-muted-foreground mt-1",children:"允许麦麦使用从聊天中学到的表达方式"})]}),e.jsx(Fe,{checked:y[1]==="enable",onCheckedChange:T=>x(w,1,T?"enable":"disable")})]})}),e.jsx("div",{className:"grid gap-2",children:e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsxs("div",{children:[e.jsx(E,{className:"text-xs font-medium",children:"学习表达"}),e.jsx("p",{className:"text-xs text-muted-foreground mt-1",children:"允许麦麦从聊天中学习新的表达方式"})]}),e.jsx(Fe,{checked:y[2]==="enable",onCheckedChange:T=>x(w,2,T?"enable":"disable")})]})}),e.jsx("div",{className:"grid gap-2",children:e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsxs("div",{children:[e.jsx(E,{className:"text-xs font-medium",children:"启用黑话学习"}),e.jsx("p",{className:"text-xs text-muted-foreground mt-1",children:"允许麦麦在此聊天流中学习和记录黑话"})]}),e.jsx(Fe,{checked:y[3]==="true"||y[3]==="enable",onCheckedChange:T=>x(w,3,T?"true":"false")})]})})]})]},w)}),n.learning_list.length===0&&e.jsx("div",{className:"text-center py-8 text-muted-foreground",children:'暂无学习规则,点击"添加规则"开始配置'})]})]})}),e.jsx("div",{className:"rounded-lg border bg-card p-4 sm:p-6 space-y-6",children:e.jsxs("div",{className:"space-y-6",children:[e.jsxs("div",{children:[e.jsx("h3",{className:"text-lg font-semibold",children:"表达优化配置"}),e.jsx("p",{className:"text-sm text-muted-foreground mt-1",children:"配置麦麦如何优化和改进表达方式"})]}),e.jsxs("div",{className:"space-y-4",children:[e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsxs("div",{className:"space-y-1",children:[e.jsx(E,{htmlFor:"expression_self_reflect",className:"cursor-pointer font-medium",children:"自动表达优化"}),e.jsx("p",{className:"text-xs text-muted-foreground",children:"启用后,麦麦会自动检查并优化表达方式,无需管理员手动干预"})]}),e.jsx(Fe,{id:"expression_self_reflect",checked:n.expression_self_reflect??!1,onCheckedChange:y=>i({...n,expression_self_reflect:y})})]}),n.expression_self_reflect&&e.jsxs("div",{className:"space-y-4 pl-4 border-l-2 border-primary/20",children:[e.jsxs("div",{className:"space-y-2",children:[e.jsx(E,{htmlFor:"expression_auto_check_interval",children:"自动检查间隔(秒)"}),e.jsx(le,{id:"expression_auto_check_interval",type:"number",min:"60",value:n.expression_auto_check_interval??3600,onChange:y=>i({...n,expression_auto_check_interval:parseInt(y.target.value)||3600})}),e.jsx("p",{className:"text-xs text-muted-foreground",children:"表达方式自动检查的间隔时间(单位:秒),默认值:3600秒(1小时)"})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsx(E,{htmlFor:"expression_auto_check_count",children:"每次检查数量"}),e.jsx(le,{id:"expression_auto_check_count",type:"number",min:"1",max:"100",value:n.expression_auto_check_count??10,onChange:y=>i({...n,expression_auto_check_count:parseInt(y.target.value)||10})}),e.jsx("p",{className:"text-xs text-muted-foreground",children:"每次自动检查时随机选取的表达方式数量,默认值:10条"})]}),e.jsxs("div",{className:"space-y-3",children:[e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsx(E,{children:"自定义评估标准"}),e.jsxs(_,{onClick:()=>{i({...n,expression_auto_check_custom_criteria:[...n.expression_auto_check_custom_criteria||[],""]})},size:"sm",variant:"outline",children:[e.jsx(et,{className:"h-4 w-4 mr-1"}),"添加标准"]})]}),e.jsxs("div",{className:"space-y-2",children:[(n.expression_auto_check_custom_criteria||[]).map((y,w)=>e.jsxs("div",{className:"flex gap-2",children:[e.jsx(le,{value:y,onChange:b=>{const R=[...n.expression_auto_check_custom_criteria||[]];R[w]=b.target.value,i({...n,expression_auto_check_custom_criteria:R})},placeholder:"输入评估标准,例如:是否符合角色人设",className:"flex-1"}),e.jsx(_,{onClick:()=>{i({...n,expression_auto_check_custom_criteria:(n.expression_auto_check_custom_criteria||[]).filter((b,R)=>R!==w)})},size:"icon",variant:"ghost",children:e.jsx(ls,{className:"h-4 w-4"})})]},w)),(!n.expression_auto_check_custom_criteria||n.expression_auto_check_custom_criteria.length===0)&&e.jsx("div",{className:"text-center py-4 text-muted-foreground text-sm",children:'暂无自定义标准,点击"添加标准"开始配置'})]}),e.jsx("p",{className:"text-xs text-muted-foreground",children:"这些标准会被添加到评估提示词中,作为额外的评估要求"})]})]})]}),e.jsx("div",{className:"space-y-4",children:e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsxs("div",{className:"space-y-1",children:[e.jsx(E,{htmlFor:"expression_checked_only",className:"cursor-pointer font-medium",children:"仅选择已检查且未拒绝的表达方式"}),e.jsx("p",{className:"text-xs text-muted-foreground",children:"当设置为 true 时,只有 checked=True 且 rejected=False 的表达方式才会被选择;当设置为 false 时,保留旧的筛选原则(仅排除 rejected=True 的表达方式)"})]}),e.jsx(Fe,{id:"expression_checked_only",checked:n.expression_checked_only??!1,onCheckedChange:y=>i({...n,expression_checked_only:y})})]})}),e.jsxs("div",{className:"space-y-4",children:[e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsxs("div",{className:"space-y-1",children:[e.jsx(E,{htmlFor:"expression_manual_reflect",className:"cursor-pointer font-medium",children:"手动表达优化"}),e.jsx("p",{className:"text-xs text-muted-foreground",children:"启用后,麦麦会主动向管理员询问表达方式是否合适"})]}),e.jsx(Fe,{id:"expression_manual_reflect",checked:n.expression_manual_reflect??!1,onCheckedChange:y=>i({...n,expression_manual_reflect:y})})]}),n.expression_manual_reflect&&e.jsxs("div",{className:"space-y-4 pl-4 border-l-2 border-primary/20",children:[e.jsxs("div",{className:"rounded-lg border p-4 space-y-4",children:[e.jsx("div",{className:"flex items-center justify-between",children:e.jsx("span",{className:"text-sm font-medium",children:"反思操作员"})}),e.jsx("div",{className:"space-y-4",children:(()=>{const w=(n.manual_reflect_operator_id||"").split(":"),b=w[0]||"qq",R=w[1]||"",D=w[2]||"private";return e.jsxs("div",{className:"grid gap-4 p-3 sm:p-4 rounded-lg bg-muted/50",children:[e.jsxs("div",{className:"grid grid-cols-1 sm:grid-cols-3 gap-3",children:[e.jsxs("div",{className:"grid gap-2",children:[e.jsx(E,{className:"text-xs font-medium",children:"平台"}),e.jsxs(Ie,{value:b,onValueChange:S=>{i({...n,manual_reflect_operator_id:`${S}:${R}:${D}`})},children:[e.jsx($e,{children:e.jsx(Pe,{})}),e.jsxs(Be,{children:[e.jsx(X,{value:"qq",children:"QQ"}),e.jsx(X,{value:"wx",children:"微信"})]})]})]}),e.jsxs("div",{className:"grid gap-2",children:[e.jsx(E,{className:"text-xs font-medium",children:"用户/群 ID"}),e.jsx(le,{value:R,onChange:S=>{i({...n,manual_reflect_operator_id:`${b}:${S.target.value}:${D}`})},placeholder:"输入 ID",className:"font-mono text-sm"})]}),e.jsxs("div",{className:"grid gap-2",children:[e.jsx(E,{className:"text-xs font-medium",children:"类型"}),e.jsxs(Ie,{value:D,onValueChange:S=>{i({...n,manual_reflect_operator_id:`${b}:${R}:${S}`})},children:[e.jsx($e,{children:e.jsx(Pe,{})}),e.jsxs(Be,{children:[e.jsx(X,{value:"private",children:"私聊(private)"}),e.jsx(X,{value:"group",children:"群组(group)"})]})]})]})]}),e.jsxs("p",{className:"text-xs text-muted-foreground",children:["当前操作员 ID:",n.manual_reflect_operator_id||"(未设置)"]}),e.jsx("p",{className:"text-xs text-muted-foreground",children:'手动表达优化操作员ID,格式:platform:id:type (例如 "qq:123456:private" 或 "qq:654321:group")'})]})})()})]}),e.jsxs("div",{className:"rounded-lg border p-4 space-y-4",children:[e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsxs("div",{children:[e.jsx("span",{className:"text-sm font-medium",children:"允许进行表达反思的聊天流"}),e.jsx("p",{className:"text-xs text-muted-foreground mt-1",children:"只有在此列表中的聊天流才会提出问题并跟踪。如果列表为空,则所有聊天流都可以进行表达反思(前提是启用了手动表达优化)"})]}),e.jsxs(_,{onClick:()=>{i({...n,allow_reflect:[...n.allow_reflect||[],"qq::group"]})},size:"sm",variant:"outline",children:[e.jsx(et,{className:"h-4 w-4 mr-1"}),"添加聊天流"]})]}),e.jsxs("div",{className:"space-y-2",children:[(n.allow_reflect||[]).map((y,w)=>{const b=y.split(":"),R=b[0]||"qq",D=b[1]||"",S=b[2]||"group";return e.jsxs("div",{className:"flex items-center gap-2 p-3 rounded-lg bg-muted/50",children:[e.jsxs(Ie,{value:R,onValueChange:P=>{const M=[...n.allow_reflect];M[w]=`${P}:${D}:${S}`,i({...n,allow_reflect:M})},children:[e.jsx($e,{className:"w-24",children:e.jsx(Pe,{})}),e.jsxs(Be,{children:[e.jsx(X,{value:"qq",children:"QQ"}),e.jsx(X,{value:"wx",children:"微信"})]})]}),e.jsx(le,{value:D,onChange:P=>{const M=[...n.allow_reflect];M[w]=`${R}:${P.target.value}:${S}`,i({...n,allow_reflect:M})},placeholder:"ID",className:"flex-1 font-mono text-sm"}),e.jsxs(Ie,{value:S,onValueChange:P=>{const M=[...n.allow_reflect];M[w]=`${R}:${D}:${P}`,i({...n,allow_reflect:M})},children:[e.jsx($e,{className:"w-32",children:e.jsx(Pe,{})}),e.jsxs(Be,{children:[e.jsx(X,{value:"group",children:"群组"}),e.jsx(X,{value:"private",children:"私聊"})]})]}),e.jsx(_,{onClick:()=>{i({...n,allow_reflect:n.allow_reflect.filter((P,M)=>M!==w)})},size:"sm",variant:"ghost",children:e.jsx(ls,{className:"h-4 w-4"})})]},w)}),(!n.allow_reflect||n.allow_reflect.length===0)&&e.jsx("div",{className:"text-center py-4 text-muted-foreground text-sm",children:"列表为空,所有聊天流都可以进行表达反思"})]})]})]})]})]})}),e.jsx("div",{className:"rounded-lg border bg-card p-4 sm:p-6 space-y-6",children:e.jsxs("div",{children:[e.jsxs("div",{className:"flex items-center justify-between mb-4",children:[e.jsxs("div",{children:[e.jsx("h3",{className:"text-lg font-semibold",children:"表达共享组配置"}),e.jsx("p",{className:"text-sm text-muted-foreground mt-1",children:"配置不同聊天流之间如何共享学到的表达方式"})]}),e.jsxs(_,{onClick:f,size:"sm",variant:"outline",children:[e.jsx(et,{className:"h-4 w-4 mr-1"}),"添加共享组"]})]}),e.jsxs("div",{className:"space-y-4",children:[n.expression_groups.map((y,w)=>{const b=n.learning_list.map(R=>R[0]).filter(R=>R!=="");return e.jsxs("div",{className:"rounded-lg border p-4 space-y-3",children:[e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsxs("span",{className:"text-sm font-medium",children:["共享组 ",w+1,y.length===1&&y[0]==="*"&&"(全局共享)"]}),e.jsxs("div",{className:"flex gap-2",children:[e.jsx(_,{onClick:()=>g(w),size:"sm",variant:"outline",children:e.jsx(et,{className:"h-4 w-4"})}),e.jsxs(vs,{children:[e.jsx(yt,{asChild:!0,children:e.jsx(_,{size:"sm",variant:"ghost",children:e.jsx(ls,{className:"h-4 w-4"})})}),e.jsxs(ds,{children:[e.jsxs(us,{children:[e.jsx(xs,{children:"确认删除"}),e.jsxs(hs,{children:["确定要删除共享组 ",w+1," 吗?此操作无法撤销。"]})]}),e.jsxs(ms,{children:[e.jsx(ps,{children:"取消"}),e.jsx(fs,{onClick:()=>p(w),children:"删除"})]})]})]})]})]}),e.jsx("div",{className:"space-y-2",children:y.map((R,D)=>e.jsx(E2,{member:R,groupIndex:w,memberIndex:D,availableChatIds:b,onUpdate:v,onRemove:N},`${w}-${D}`))}),e.jsx("p",{className:"text-xs text-muted-foreground",children:'提示:可以从下拉框选择已配置的聊天流,或手动输入。输入 "*" 启用全局共享'})]},w)}),n.expression_groups.length===0&&e.jsx("div",{className:"text-center py-8 text-muted-foreground",children:'暂无共享组,点击"添加共享组"开始配置'})]})]})})]})});function z2({regex:l,reaction:n,onRegexChange:i,onReactionChange:c}){const[u,x]=d.useState(!1),[h,f]=d.useState(""),[p,g]=d.useState(null),[N,v]=d.useState(""),[y,w]=d.useState({}),[b,R]=d.useState(""),D=d.useRef(null),[S,P]=d.useState("build"),M=L=>L.replace(/\(\?P<([^>]+)>/g,"(?<$1>"),T=(L,J=0)=>{const U=D.current;if(!U)return;const ue=U.selectionStart||0,xe=U.selectionEnd||0,he=l.substring(0,ue)+L+l.substring(xe);i(he),setTimeout(()=>{const ne=ue+L.length+J;U.setSelectionRange(ne,ne),U.focus()},0)};d.useEffect(()=>{if(!l||!h){p!==null&&g(null),Object.keys(y).length>0&&w({}),b!==n&&R(n),N!==""&&v("");return}try{const L=M(l),J=new RegExp(L,"g"),U=h.match(J);g(U),v("");const xe=new RegExp(L).exec(h);if(xe&&xe.groups){w(xe.groups);let he=n;Object.entries(xe.groups).forEach(([ne,ve])=>{he=he.replace(new RegExp(`\\[${ne}\\]`,"g"),ve||"")}),R(he)}else w({}),R(n)}catch(L){v(L.message),g(null),w({}),R(n)}},[l,h,n,p,y,b,N]);const A=()=>{if(!h||!p||p.length===0)return e.jsx("span",{className:"text-muted-foreground",children:h||"请输入测试文本"});try{const L=M(l),J=new RegExp(L,"g");let U=0;const ue=[];let xe;for(;(xe=J.exec(h))!==null;)xe.index>U&&ue.push(e.jsx("span",{children:h.substring(U,xe.index)},`text-${U}`)),ue.push(e.jsx("span",{className:"bg-yellow-200 dark:bg-yellow-900 font-semibold",children:xe[0]},`match-${xe.index}`)),U=xe.index+xe[0].length;return U)",desc:"Python风格命名捕获组",moveCursor:-1},{label:"非捕获组",pattern:"(?:)",desc:"分组但不保存匹配结果",moveCursor:-1}]},{category:"字符类",items:[{label:"字符集",pattern:"[]",desc:"匹配括号内的任意字符",moveCursor:-1},{label:"排除字符",pattern:"[^]",desc:"匹配不在括号内的字符",moveCursor:-1},{label:"范围",pattern:"[a-z]",desc:"匹配a到z的字符"},{label:"中文字符",pattern:"[\\u4e00-\\u9fa5]",desc:"匹配中文汉字"}]},{category:"常用模板",items:[{label:"捕获词语",pattern:"(?P\\S+)",desc:"捕获一个词语"},{label:"捕获句子",pattern:"(?P.+)",desc:"捕获整个句子"},{label:"捕获数字",pattern:"(?P\\d+)",desc:"捕获一个或多个数字"},{label:"可选词语",pattern:"(?:词语1|词语2)",desc:"匹配多个可选项之一"}]}];return e.jsxs(Is,{open:u,onOpenChange:x,children:[e.jsx(Wo,{asChild:!0,children:e.jsxs(_,{variant:"outline",size:"sm",children:[e.jsx(Qm,{className:"h-4 w-4 mr-1"}),"正则编辑器"]})}),e.jsxs(Os,{className:"max-w-[95vw] sm:max-w-[900px] max-h-[90vh]",children:[e.jsxs(Ds,{children:[e.jsx(Rs,{children:"正则表达式编辑器"}),e.jsx(Ks,{className:"text-sm",children:"使用可视化工具构建正则表达式,并实时测试效果"})]}),e.jsx(Ye,{className:"max-h-[calc(90vh-120px)]",children:e.jsxs(ta,{value:S,onValueChange:L=>P(L),className:"w-full",children:[e.jsxs(Xt,{className:"grid w-full grid-cols-2",children:[e.jsx(Je,{value:"build",children:"🔧 构建器"}),e.jsx(Je,{value:"test",children:"🧪 测试器"})]}),e.jsxs(ys,{value:"build",className:"space-y-4 mt-4",children:[e.jsxs("div",{className:"space-y-2",children:[e.jsx(E,{className:"text-sm font-medium",children:"正则表达式"}),e.jsx(le,{ref:D,value:l,onChange:L=>i(L.target.value),className:"font-mono text-sm",placeholder:"点击下方按钮构建正则表达式..."})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsx(E,{className:"text-sm font-medium",children:"Reaction 内容"}),e.jsx(ot,{value:n,onChange:L=>c(L.target.value),placeholder:"使用 [捕获组名] 引用捕获的内容...",rows:3,className:"text-sm"})]}),e.jsxs("div",{className:"space-y-4 border-t pt-4",children:[F.map(L=>e.jsxs("div",{className:"space-y-2",children:[e.jsx("h5",{className:"text-xs font-semibold text-primary",children:L.category}),e.jsx("div",{className:"grid grid-cols-1 sm:grid-cols-2 gap-2",children:L.items.map(J=>e.jsx(_,{variant:"outline",size:"sm",className:"justify-start h-auto py-2 px-3",onClick:()=>T(J.pattern,J.moveCursor||0),children:e.jsxs("div",{className:"flex flex-col items-start w-full",children:[e.jsxs("div",{className:"flex items-center gap-2 w-full",children:[e.jsx("span",{className:"text-xs font-medium",children:J.label}),e.jsx("code",{className:"ml-auto text-xs bg-muted px-1.5 py-0.5 rounded font-mono",children:J.pattern})]}),e.jsx("span",{className:"text-xs text-muted-foreground mt-0.5",children:J.desc})]})},J.label))})]},L.category)),e.jsxs("div",{className:"space-y-2 border-t pt-4",children:[e.jsx("h5",{className:"text-xs font-semibold text-primary",children:"完整示例模板"}),e.jsxs("div",{className:"space-y-2",children:[e.jsx(_,{variant:"outline",size:"sm",className:"w-full justify-start h-auto py-2 px-3",onClick:()=>i("^(?P\\S{1,20})是这样的$"),children:e.jsxs("div",{className:"flex flex-col items-start w-full",children:[e.jsxs("code",{className:"text-xs font-mono bg-muted px-2 py-1 rounded w-full overflow-x-auto",children:["^(?P\\S","{1,20}",")是这样的$"]}),e.jsx("span",{className:"text-xs text-muted-foreground mt-1",children:"匹配「某事物是这样的」并捕获事物名称"})]})}),e.jsx(_,{variant:"outline",size:"sm",className:"w-full justify-start h-auto py-2 px-3",onClick:()=>i("(?:[^,。.\\s]+,\\s*)?我(?:也)?[没沒]要求你\\s*(?P.+?)[.。,,]?$"),children:e.jsxs("div",{className:"flex flex-col items-start w-full",children:[e.jsx("code",{className:"text-xs font-mono bg-muted px-2 py-1 rounded w-full overflow-x-auto",children:"(?:[^,。.\\s]+,\\s*)?我(?:也)?[没沒]要求你\\s*(?P.+?)[.。,,]?$"}),e.jsx("span",{className:"text-xs text-muted-foreground mt-1",children:"匹配「我没要求你做某事」并捕获具体行为"})]})}),e.jsx(_,{variant:"outline",size:"sm",className:"w-full justify-start h-auto py-2 px-3",onClick:()=>i("(?P.+?)(?:是|为什么|怎么)"),children:e.jsxs("div",{className:"flex flex-col items-start w-full",children:[e.jsx("code",{className:"text-xs font-mono bg-muted px-2 py-1 rounded w-full overflow-x-auto",children:"(?P.+?)(?:是|为什么|怎么)"}),e.jsx("span",{className:"text-xs text-muted-foreground mt-1",children:"捕获问题主题词"})]})})]})]})]}),e.jsxs("div",{className:"rounded-md bg-blue-50 dark:bg-blue-950/30 border border-blue-200 dark:border-blue-800 p-3 space-y-1",children:[e.jsx("p",{className:"text-xs font-medium text-blue-900 dark:text-blue-100",children:"💡 使用提示"}),e.jsxs("ul",{className:"text-xs text-blue-700 dark:text-blue-300 space-y-1 list-disc list-inside",children:[e.jsx("li",{children:"点击输入框设置光标位置,然后点击按钮插入模式"}),e.jsxs("li",{children:["命名捕获组格式:",e.jsx("code",{className:"bg-blue-100 dark:bg-blue-900 px-1 rounded",children:"(?P<名称>模式)"})]}),e.jsxs("li",{children:["在 reaction 中使用 ",e.jsx("code",{className:"bg-blue-100 dark:bg-blue-900 px-1 rounded",children:"[名称]"})," 引用捕获的内容"]}),e.jsx("li",{children:"切换到测试器标签页验证正则表达式效果"})]})]})]}),e.jsxs(ys,{value:"test",className:"space-y-4 mt-4",children:[e.jsxs("div",{className:"space-y-2",children:[e.jsx(E,{className:"text-sm font-medium",children:"当前正则表达式"}),e.jsx("div",{className:"rounded-md bg-muted p-3 font-mono text-xs break-all",children:l||"(未设置)"})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsx(E,{htmlFor:"test-text",className:"text-sm font-medium",children:"测试文本"}),e.jsx(ot,{id:"test-text",value:h,onChange:L=>f(L.target.value),placeholder:`在此输入要测试的文本... +3.某句话如果已经被回复过,不要重复回复`}),[R,D]=d.useState({emoji_chance:.4,max_reg_num:40,do_replace:!0,check_interval:10,steal_emoji:!0,content_filtration:!1,filtration_prompt:"符合公序良俗"}),[S,P]=d.useState({enable_tool:!0,all_global:!0}),[M,T]=d.useState({api_key:""}),A=[{id:"bot-basic",title:"Bot基础",description:"配置机器人的基本信息",icon:Pn},{id:"personality",title:"人格配置",description:"定义机器人的性格和说话风格",icon:fn},{id:"emoji",title:"表情包",description:"配置表情包相关设置",icon:Yo},{id:"other",title:"其他设置",description:"工具、情绪系统等配置",icon:pn},{id:"siliconflow",title:"API配置",description:"配置硅基流动API密钥",icon:Km}],F=(c+1)/A.length*100;d.useEffect(()=>{(async()=>{try{N(!0);const[ve,je,z,V,B]=await Promise.all([a2(),l2(),n2(),r2(),i2()]);y(ve),b(je),D(z),P(V),T(B)}catch(ve){n({title:"加载配置失败",description:ve instanceof Error?ve.message:"无法加载现有配置,将使用默认值",variant:"destructive"})}finally{N(!1)}})()},[n]);const L=async()=>{p(!0);try{switch(c){case 0:await c2(v);break;case 1:await o2(w);break;case 2:await d2(R);break;case 3:await u2(S);break;case 4:await m2(M);break}return n({title:"保存成功",description:`${A[c].title}配置已保存`}),!0}catch(ne){return n({title:"保存失败",description:ne instanceof Error?ne.message:"未知错误",variant:"destructive"}),!1}finally{p(!1)}},J=async()=>{await L()&&c{c>0&&u(c-1)},ue=async()=>{h(!0);try{if(!await L()){h(!1);return}await Ng(),n({title:"配置完成",description:"麦麦正在重启以应用新配置..."}),await i()}catch(ne){n({title:"配置失败",description:ne instanceof Error?ne.message:"未知错误",variant:"destructive"})}finally{h(!1)}},xe=async()=>{try{await Ng(),l({to:"/"})}catch(ne){n({title:"跳过失败",description:ne instanceof Error?ne.message:"未知错误",variant:"destructive"})}},he=()=>{switch(c){case 0:return e.jsx(Z1,{config:v,onChange:y});case 1:return e.jsx(W1,{config:w,onChange:b});case 2:return e.jsx(e2,{config:R,onChange:D});case 3:return e.jsx(s2,{config:S,onChange:P});case 4:return e.jsx(t2,{config:M,onChange:T});default:return null}};return e.jsxs("div",{className:"relative flex min-h-screen flex-col items-center justify-center overflow-hidden bg-gradient-to-br from-primary/5 via-background to-secondary/5 p-4 md:p-6",children:[e.jsx(Jn,{}),e.jsxs("div",{className:"absolute inset-0 overflow-hidden pointer-events-none",children:[e.jsx("div",{className:"absolute left-1/4 top-1/4 h-64 w-64 md:h-96 md:w-96 rounded-full bg-primary/5 blur-3xl"}),e.jsx("div",{className:"absolute right-1/4 bottom-1/4 h-64 w-64 md:h-96 md:w-96 rounded-full bg-secondary/5 blur-3xl"})]}),g?e.jsxs("div",{className:"relative z-10 text-center",children:[e.jsx("div",{className:"mx-auto mb-4 flex h-16 w-16 items-center justify-center",children:e.jsx("div",{className:"h-12 w-12 animate-spin rounded-full border-4 border-primary border-t-transparent"})}),e.jsx("p",{className:"text-lg font-medium",children:"加载配置中..."}),e.jsx("p",{className:"text-sm text-muted-foreground mt-2",children:"正在读取现有配置"})]}):e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"relative z-10 w-full max-w-4xl",children:[e.jsxs("div",{className:"mb-6 md:mb-8 text-center",children:[e.jsx("div",{className:"mx-auto mb-4 flex h-12 w-12 md:h-16 md:w-16 items-center justify-center rounded-2xl bg-primary/10",children:e.jsx(Jw,{className:"h-6 w-6 md:h-8 md:w-8 text-primary",strokeWidth:2,fill:"none"})}),e.jsx("h1",{className:"mb-2 text-2xl md:text-3xl font-bold",children:"首次配置向导"}),e.jsxs("p",{className:"text-sm md:text-base text-muted-foreground",children:["让我们一起完成 ",sx," 的初始配置"]})]}),e.jsxs("div",{className:"mb-6 md:mb-8",children:[e.jsxs("div",{className:"mb-2 flex items-center justify-between text-xs md:text-sm",children:[e.jsxs("span",{className:"text-muted-foreground",children:["步骤 ",c+1," / ",A.length]}),e.jsxs("span",{className:"font-medium text-primary",children:[Math.round(F),"%"]})]}),e.jsx(Kn,{value:F,className:"h-2"})]}),e.jsx("div",{className:"mb-6 md:mb-8 flex justify-between",children:A.map((ne,ve)=>{const je=ne.icon;return e.jsxs("div",{className:I("flex flex-1 flex-col items-center gap-1 md:gap-2",vel({to:"/"}),className:"gap-2 w-full sm:w-auto",children:[e.jsx(Jo,{className:"h-4 w-4"}),"返回首页"]}),e.jsxs(_,{size:"lg",variant:"outline",onClick:()=>window.history.back(),className:"gap-2 w-full sm:w-auto",children:[e.jsx(Ta,{className:"h-4 w-4"}),"返回上一页"]})]}),e.jsx("div",{className:"mt-12 pt-8 border-t border-border",children:e.jsx("p",{className:"text-sm text-muted-foreground",children:"如果您认为这是一个错误,请联系系统管理员"})})]})})}const f2=As.memo(function({config:n,onChange:i}){const c=n.platforms||[],u=n.alias_names||[],x=()=>{i({...n,platforms:[...c,""]})},h=v=>{i({...n,platforms:c.filter((y,w)=>w!==v)})},f=(v,y)=>{const w=[...c];w[v]=y,i({...n,platforms:w})},p=()=>{i({...n,alias_names:[...u,""]})},g=v=>{i({...n,alias_names:u.filter((y,w)=>w!==v)})},N=(v,y)=>{const w=[...u];w[v]=y,i({...n,alias_names:w})};return e.jsx("div",{className:"rounded-lg border bg-card p-4 sm:p-6 space-y-6",children:e.jsxs("div",{children:[e.jsx("h3",{className:"text-lg font-semibold mb-4",children:"基本信息"}),e.jsxs("div",{className:"grid gap-4",children:[e.jsxs("div",{className:"grid gap-2",children:[e.jsx(E,{htmlFor:"platform",children:"平台"}),e.jsx(le,{id:"platform",value:n.platform,onChange:v=>i({...n,platform:v.target.value}),placeholder:"qq"})]}),e.jsxs("div",{className:"grid gap-2",children:[e.jsx(E,{htmlFor:"qq_account",children:"QQ账号"}),e.jsx(le,{id:"qq_account",value:n.qq_account,onChange:v=>i({...n,qq_account:v.target.value}),placeholder:"123456789"})]}),e.jsxs("div",{className:"grid gap-2",children:[e.jsx(E,{htmlFor:"nickname",children:"昵称"}),e.jsx(le,{id:"nickname",value:n.nickname,onChange:v=>i({...n,nickname:v.target.value}),placeholder:"麦麦"})]}),e.jsxs("div",{className:"grid gap-2",children:[e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsx(E,{children:"别名"}),e.jsxs(_,{onClick:p,size:"sm",variant:"outline",children:[e.jsx(et,{className:"h-4 w-4 mr-1"}),"添加"]})]}),e.jsxs("div",{className:"space-y-2",children:[u.map((v,y)=>e.jsxs("div",{className:"flex gap-2",children:[e.jsx(le,{value:v,onChange:w=>N(y,w.target.value),placeholder:"小麦"}),e.jsxs(vs,{children:[e.jsx(wt,{asChild:!0,children:e.jsx(_,{size:"icon",variant:"outline",children:e.jsx(ls,{className:"h-4 w-4"})})}),e.jsxs(ds,{children:[e.jsxs(us,{children:[e.jsx(xs,{children:"确认删除"}),e.jsxs(hs,{children:['确定要删除别名 "',v||"(空)",'" 吗?此操作无法撤销。']})]}),e.jsxs(ms,{children:[e.jsx(ps,{children:"取消"}),e.jsx(fs,{onClick:()=>g(y),children:"删除"})]})]})]})]},y)),u.length===0&&e.jsx("p",{className:"text-sm text-muted-foreground",children:"暂无别名"})]})]}),e.jsxs("div",{className:"grid gap-2",children:[e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsx(E,{children:"其他平台账号"}),e.jsxs(_,{onClick:x,size:"sm",variant:"outline",children:[e.jsx(et,{className:"h-4 w-4 mr-1"}),"添加"]})]}),e.jsxs("div",{className:"space-y-2",children:[c.map((v,y)=>e.jsxs("div",{className:"flex gap-2",children:[e.jsx(le,{value:v,onChange:w=>f(y,w.target.value),placeholder:"wx:114514"}),e.jsxs(vs,{children:[e.jsx(wt,{asChild:!0,children:e.jsx(_,{size:"icon",variant:"outline",children:e.jsx(ls,{className:"h-4 w-4"})})}),e.jsxs(ds,{children:[e.jsxs(us,{children:[e.jsx(xs,{children:"确认删除"}),e.jsxs(hs,{children:['确定要删除平台账号 "',v||"(空)",'" 吗?此操作无法撤销。']})]}),e.jsxs(ms,{children:[e.jsx(ps,{children:"取消"}),e.jsx(fs,{onClick:()=>h(y),children:"删除"})]})]})]})]},y)),c.length===0&&e.jsx("p",{className:"text-sm text-muted-foreground",children:"暂无其他平台账号"})]})]})]})]})})}),p2=As.memo(function({config:n,onChange:i}){const c=()=>{i({...n,states:[...n.states,""]})},u=h=>{i({...n,states:n.states.filter((f,p)=>p!==h)})},x=(h,f)=>{const p=[...n.states];p[h]=f,i({...n,states:p})};return e.jsx("div",{className:"rounded-lg border bg-card p-4 sm:p-6 space-y-6",children:e.jsxs("div",{children:[e.jsx("h3",{className:"text-lg font-semibold mb-4",children:"人格设置"}),e.jsxs("div",{className:"grid gap-4",children:[e.jsxs("div",{className:"grid gap-2",children:[e.jsx(E,{htmlFor:"personality",children:"人格特质"}),e.jsx(ot,{id:"personality",value:n.personality,onChange:h=>i({...n,personality:h.target.value}),placeholder:"描述人格特质和身份特征(建议120字以内)",rows:3}),e.jsx("p",{className:"text-xs text-muted-foreground",children:"建议120字以内,描述人格特质和身份特征"})]}),e.jsxs("div",{className:"grid gap-2",children:[e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsx(E,{children:"多重人格"}),e.jsxs(_,{onClick:c,size:"sm",variant:"outline",children:[e.jsx(et,{className:"h-4 w-4 mr-1"}),"添加人格"]})]}),e.jsx("p",{className:"text-xs text-muted-foreground",children:"可以定义多个不同的人格状态,麦麦会随机切换"}),e.jsx("div",{className:"space-y-2",children:n.states.map((h,f)=>e.jsxs("div",{className:"flex gap-2",children:[e.jsx(ot,{value:h,onChange:p=>x(f,p.target.value),placeholder:"描述一个人格状态",rows:2}),e.jsxs(vs,{children:[e.jsx(wt,{asChild:!0,children:e.jsx(_,{size:"icon",variant:"outline",children:e.jsx(ls,{className:"h-4 w-4"})})}),e.jsxs(ds,{children:[e.jsxs(us,{children:[e.jsx(xs,{children:"确认删除"}),e.jsx(hs,{children:"确定要删除这个人格状态吗?此操作无法撤销。"})]}),e.jsxs(ms,{children:[e.jsx(ps,{children:"取消"}),e.jsx(fs,{onClick:()=>u(f),children:"删除"})]})]})]})]},f))})]}),e.jsxs("div",{className:"grid gap-2",children:[e.jsx(E,{htmlFor:"state_probability",children:"替换为多重人格概率"}),e.jsx(le,{id:"state_probability",type:"number",step:"0.1",min:"0",max:"1",value:n.state_probability,onChange:h=>i({...n,state_probability:parseFloat(h.target.value)})}),e.jsx("p",{className:"text-xs text-muted-foreground",children:"每次构建人格时,用多重人格替换主人格的概率(0.0-1.0)"})]}),e.jsxs("div",{className:"grid gap-2",children:[e.jsx(E,{htmlFor:"reply_style",children:"表达风格"}),e.jsx(ot,{id:"reply_style",value:n.reply_style,onChange:h=>i({...n,reply_style:h.target.value}),placeholder:"描述说话的表达风格和习惯",rows:3})]}),e.jsxs("div",{className:"grid gap-2",children:[e.jsx(E,{htmlFor:"plan_style",children:"说话规则与行为风格"}),e.jsx(ot,{id:"plan_style",value:n.plan_style,onChange:h=>i({...n,plan_style:h.target.value}),placeholder:"麦麦的说话规则和行为风格",rows:5})]}),e.jsxs("div",{className:"grid gap-2",children:[e.jsx(E,{htmlFor:"visual_style",children:"识图规则"}),e.jsx(ot,{id:"visual_style",value:n.visual_style,onChange:h=>i({...n,visual_style:h.target.value}),placeholder:"识图时的处理规则",rows:3})]}),e.jsxs("div",{className:"grid gap-2",children:[e.jsx(E,{htmlFor:"private_plan_style",children:"私聊规则"}),e.jsx(ot,{id:"private_plan_style",value:n.private_plan_style,onChange:h=>i({...n,private_plan_style:h.target.value}),placeholder:"私聊的说话规则和行为风格",rows:4})]})]})]})})}),Ie=Aw,Pe=Ow,$e=d.forwardRef(({className:l,children:n,...i},c)=>e.jsxs(gj,{ref:c,className:I("flex h-9 w-full items-center justify-between whitespace-nowrap rounded-md border border-input bg-transparent px-3 py-2 text-sm shadow-sm ring-offset-background data-[placeholder]:text-muted-foreground focus:outline-none focus:ring-1 focus:ring-ring disabled:cursor-not-allowed disabled:opacity-50 [&>span]:line-clamp-1",l),...i,children:[n,e.jsx(Cw,{asChild:!0,children:e.jsx(za,{className:"h-4 w-4 opacity-50"})})]}));$e.displayName=gj.displayName;const fv=d.forwardRef(({className:l,...n},i)=>e.jsx(jj,{ref:i,className:I("flex cursor-default items-center justify-center py-1",l),...n,children:e.jsx(Fr,{className:"h-4 w-4"})}));fv.displayName=jj.displayName;const pv=d.forwardRef(({className:l,...n},i)=>e.jsx(vj,{ref:i,className:I("flex cursor-default items-center justify-center py-1",l),...n,children:e.jsx(za,{className:"h-4 w-4"})}));pv.displayName=vj.displayName;const Be=d.forwardRef(({className:l,children:n,position:i="popper",...c},u)=>e.jsx(Tw,{children:e.jsxs(Nj,{ref:u,className:I("relative z-[100] max-h-[--radix-select-content-available-height] min-w-[8rem] overflow-hidden rounded-md border border-border bg-white dark:bg-gray-900 text-gray-900 dark:text-gray-100 shadow-lg data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 origin-[--radix-select-content-transform-origin]",i==="popper"&&"data-[side=bottom]:translate-y-1 data-[side=left]:-translate-x-1 data-[side=right]:translate-x-1 data-[side=top]:-translate-y-1",l),position:i,...c,children:[e.jsx(fv,{}),e.jsx(Ew,{className:I("p-1",i==="popper"&&"h-[var(--radix-select-trigger-height)] w-full min-w-[var(--radix-select-trigger-width)]"),children:n}),e.jsx(pv,{})]})}));Be.displayName=Nj.displayName;const g2=d.forwardRef(({className:l,...n},i)=>e.jsx(bj,{ref:i,className:I("px-2 py-1.5 text-sm font-semibold",l),...n}));g2.displayName=bj.displayName;const X=d.forwardRef(({className:l,children:n,...i},c)=>e.jsxs(yj,{ref:c,className:I("relative flex w-full cursor-default select-none items-center rounded-sm py-2 pl-2 pr-8 text-sm outline-none bg-white dark:bg-gray-900 hover:bg-gray-100 dark:hover:bg-gray-800 focus:bg-gray-100 dark:focus:bg-gray-800 data-[disabled]:pointer-events-none data-[disabled]:opacity-50",l),...i,children:[e.jsx("span",{className:"absolute right-2 flex h-3.5 w-3.5 items-center justify-center",children:e.jsx(Mw,{children:e.jsx(Ct,{className:"h-4 w-4"})})}),e.jsx(zw,{children:n})]}));X.displayName=yj.displayName;const j2=d.forwardRef(({className:l,...n},i)=>e.jsx(wj,{ref:i,className:I("-mx-1 my-1 h-px bg-muted",l),...n}));j2.displayName=wj.displayName;const ol=q0,dl=K0,Wa=d.forwardRef(({className:l,align:n="center",sideOffset:i=4,...c},u)=>e.jsx(V0,{children:e.jsx(sj,{ref:u,align:n,sideOffset:i,className:I("z-50 w-72 rounded-md border bg-popover p-4 text-popover-foreground shadow-md outline-none data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 origin-[--radix-popover-content-transform-origin]",l),...c})}));Wa.displayName=sj.displayName;const v2=As.memo(function({value:n,onChange:i}){const c=d.useMemo(()=>{const w=n.split("-");if(w.length===2){const[b,R]=w,[D,S]=b.split(":"),[P,M]=R.split(":");return{startHour:D?D.padStart(2,"0"):"00",startMinute:S?S.padStart(2,"0"):"00",endHour:P?P.padStart(2,"0"):"23",endMinute:M?M.padStart(2,"0"):"59"}}return{startHour:"00",startMinute:"00",endHour:"23",endMinute:"59"}},[n]),[u,x]=d.useState(c.startHour),[h,f]=d.useState(c.startMinute),[p,g]=d.useState(c.endHour),[N,v]=d.useState(c.endMinute);d.useEffect(()=>{x(c.startHour),f(c.startMinute),g(c.endHour),v(c.endMinute)},[c]);const y=(w,b,R,D)=>{const S=`${w}:${b}-${R}:${D}`;i(S)};return e.jsxs(ol,{children:[e.jsx(dl,{asChild:!0,children:e.jsxs(_,{variant:"outline",className:"w-full justify-start font-mono text-sm",children:[e.jsx(na,{className:"h-4 w-4 mr-2"}),n||"选择时间段"]})}),e.jsx(Wa,{className:"w-72 sm:w-80",children:e.jsxs("div",{className:"space-y-4",children:[e.jsxs("div",{children:[e.jsx("h4",{className:"font-medium text-sm mb-3",children:"开始时间"}),e.jsxs("div",{className:"grid grid-cols-2 gap-2 sm:gap-3",children:[e.jsxs("div",{children:[e.jsx(E,{className:"text-xs",children:"小时"}),e.jsxs(Ie,{value:u,onValueChange:w=>{x(w),y(w,h,p,N)},children:[e.jsx($e,{children:e.jsx(Pe,{})}),e.jsx(Be,{children:Array.from({length:24},(w,b)=>b).map(w=>e.jsx(X,{value:w.toString().padStart(2,"0"),children:w.toString().padStart(2,"0")},w))})]})]}),e.jsxs("div",{children:[e.jsx(E,{className:"text-xs",children:"分钟"}),e.jsxs(Ie,{value:h,onValueChange:w=>{f(w),y(u,w,p,N)},children:[e.jsx($e,{children:e.jsx(Pe,{})}),e.jsx(Be,{children:Array.from({length:60},(w,b)=>b).map(w=>e.jsx(X,{value:w.toString().padStart(2,"0"),children:w.toString().padStart(2,"0")},w))})]})]})]})]}),e.jsxs("div",{children:[e.jsx("h4",{className:"font-medium text-sm mb-3",children:"结束时间"}),e.jsxs("div",{className:"grid grid-cols-2 gap-2 sm:gap-3",children:[e.jsxs("div",{children:[e.jsx(E,{className:"text-xs",children:"小时"}),e.jsxs(Ie,{value:p,onValueChange:w=>{g(w),y(u,h,w,N)},children:[e.jsx($e,{children:e.jsx(Pe,{})}),e.jsx(Be,{children:Array.from({length:24},(w,b)=>b).map(w=>e.jsx(X,{value:w.toString().padStart(2,"0"),children:w.toString().padStart(2,"0")},w))})]})]}),e.jsxs("div",{children:[e.jsx(E,{className:"text-xs",children:"分钟"}),e.jsxs(Ie,{value:N,onValueChange:w=>{v(w),y(u,h,p,w)},children:[e.jsx($e,{children:e.jsx(Pe,{})}),e.jsx(Be,{children:Array.from({length:60},(w,b)=>b).map(w=>e.jsx(X,{value:w.toString().padStart(2,"0"),children:w.toString().padStart(2,"0")},w))})]})]})]})]})]})})]})}),N2=As.memo(function({rule:n}){const i=`{ target = "${n.target}", time = "${n.time}", value = ${n.value.toFixed(1)} }`;return e.jsxs(ol,{children:[e.jsx(dl,{asChild:!0,children:e.jsxs(_,{variant:"outline",size:"sm",children:[e.jsx(ia,{className:"h-4 w-4 mr-1"}),"预览"]})}),e.jsx(Wa,{className:"w-80 sm:w-96",children:e.jsxs("div",{className:"space-y-2",children:[e.jsx("h4",{className:"font-medium text-sm",children:"配置预览"}),e.jsx("div",{className:"rounded-md bg-muted p-3 font-mono text-xs break-all",children:i}),e.jsx("p",{className:"text-xs text-muted-foreground",children:"这是保存到 bot_config.toml 文件中的格式"})]})})]})}),b2=As.memo(function({config:n,onChange:i}){const c=()=>{i({...n,talk_value_rules:[...n.talk_value_rules,{target:"",time:"00:00-23:59",value:1}]})},u=h=>{i({...n,talk_value_rules:n.talk_value_rules.filter((f,p)=>p!==h)})},x=(h,f,p)=>{const g=[...n.talk_value_rules];g[h]={...g[h],[f]:p},i({...n,talk_value_rules:g})};return e.jsxs("div",{className:"rounded-lg border bg-card p-4 sm:p-6 space-y-6",children:[e.jsxs("div",{children:[e.jsx("h3",{className:"text-lg font-semibold mb-4",children:"聊天设置"}),e.jsxs("div",{className:"grid gap-4",children:[e.jsxs("div",{className:"grid gap-2",children:[e.jsx(E,{htmlFor:"talk_value",children:"聊天频率(基础值)"}),e.jsx(le,{id:"talk_value",type:"number",step:"0.1",min:"0",max:"1",value:n.talk_value,onChange:h=>i({...n,talk_value:parseFloat(h.target.value)})}),e.jsx("p",{className:"text-xs text-muted-foreground",children:"越小越沉默,范围 0-1"})]}),e.jsxs("div",{className:"grid gap-2",children:[e.jsx(E,{htmlFor:"think_mode",children:"思考模式"}),e.jsxs(Ie,{value:n.think_mode||"classic",onValueChange:h=>i({...n,think_mode:h}),children:[e.jsx($e,{id:"think_mode",children:e.jsx(Pe,{placeholder:"选择思考模式"})}),e.jsxs(Be,{children:[e.jsx(X,{value:"classic",children:"经典模式 - 浅度思考和回复"}),e.jsx(X,{value:"deep",children:"深度模式 - 进行深度思考和回复"}),e.jsx(X,{value:"dynamic",children:"动态模式 - 自动选择思考深度"})]})]}),e.jsx("p",{className:"text-xs text-muted-foreground",children:"控制麦麦的思考深度。经典模式回复快但简单;深度模式更深入但较慢;动态模式根据情况自动选择"})]}),e.jsxs("div",{className:"flex items-center space-x-2",children:[e.jsx(Fe,{id:"mentioned_bot_reply",checked:n.mentioned_bot_reply,onCheckedChange:h=>i({...n,mentioned_bot_reply:h})}),e.jsx(E,{htmlFor:"mentioned_bot_reply",className:"cursor-pointer",children:"启用提及必回复"})]}),e.jsxs("div",{className:"grid gap-2",children:[e.jsx(E,{htmlFor:"max_context_size",children:"上下文长度"}),e.jsx(le,{id:"max_context_size",type:"number",min:"1",value:n.max_context_size,onChange:h=>i({...n,max_context_size:parseInt(h.target.value)})})]}),e.jsxs("div",{className:"grid gap-2",children:[e.jsx(E,{htmlFor:"planner_smooth",children:"规划器平滑"}),e.jsx(le,{id:"planner_smooth",type:"number",step:"1",min:"0",value:n.planner_smooth,onChange:h=>i({...n,planner_smooth:parseFloat(h.target.value)})}),e.jsx("p",{className:"text-xs text-muted-foreground",children:"增大数值会减小 planner 负荷,推荐 1-5,0 为关闭"})]}),e.jsxs("div",{className:"flex items-center space-x-2",children:[e.jsx(Fe,{id:"enable_talk_value_rules",checked:n.enable_talk_value_rules,onCheckedChange:h=>i({...n,enable_talk_value_rules:h})}),e.jsx(E,{htmlFor:"enable_talk_value_rules",className:"cursor-pointer",children:"启用动态发言频率规则"})]})]})]}),n.enable_talk_value_rules&&e.jsxs("div",{className:"border-t pt-6",children:[e.jsxs("div",{className:"flex items-center justify-between mb-4",children:[e.jsxs("div",{children:[e.jsx("h4",{className:"text-base font-semibold",children:"动态发言频率规则"}),e.jsx("p",{className:"text-xs text-muted-foreground mt-1",children:"按时段或聊天流ID调整发言频率,优先匹配具体聊天,再匹配全局规则"})]}),e.jsxs(_,{onClick:c,size:"sm",children:[e.jsx(et,{className:"h-4 w-4 mr-1"}),"添加规则"]})]}),n.talk_value_rules&&n.talk_value_rules.length>0?e.jsx("div",{className:"space-y-4",children:n.talk_value_rules.map((h,f)=>e.jsxs("div",{className:"rounded-lg border p-4 bg-muted/50 space-y-4",children:[e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsxs("span",{className:"text-sm font-medium text-muted-foreground",children:["规则 #",f+1]}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(N2,{rule:h}),e.jsxs(vs,{children:[e.jsx(wt,{asChild:!0,children:e.jsx(_,{variant:"ghost",size:"sm",children:e.jsx(ls,{className:"h-4 w-4 text-destructive"})})}),e.jsxs(ds,{children:[e.jsxs(us,{children:[e.jsx(xs,{children:"确认删除"}),e.jsxs(hs,{children:["确定要删除规则 #",f+1," 吗?此操作无法撤销。"]})]}),e.jsxs(ms,{children:[e.jsx(ps,{children:"取消"}),e.jsx(fs,{onClick:()=>u(f),children:"删除"})]})]})]})]})]}),e.jsxs("div",{className:"space-y-4",children:[e.jsxs("div",{className:"grid gap-2",children:[e.jsx(E,{className:"text-xs font-medium",children:"配置类型"}),e.jsxs(Ie,{value:h.target===""?"global":"specific",onValueChange:p=>{p==="global"?x(f,"target",""):x(f,"target","qq::group")},children:[e.jsx($e,{children:e.jsx(Pe,{})}),e.jsxs(Be,{children:[e.jsx(X,{value:"global",children:"全局配置"}),e.jsx(X,{value:"specific",children:"详细配置"})]})]})]}),h.target!==""&&(()=>{const p=h.target.split(":"),g=p[0]||"qq",N=p[1]||"",v=p[2]||"group";return e.jsxs("div",{className:"grid gap-4 p-3 sm:p-4 rounded-lg bg-muted/50",children:[e.jsxs("div",{className:"grid grid-cols-1 sm:grid-cols-3 gap-3",children:[e.jsxs("div",{className:"grid gap-2",children:[e.jsx(E,{className:"text-xs font-medium",children:"平台"}),e.jsxs(Ie,{value:g,onValueChange:y=>{x(f,"target",`${y}:${N}:${v}`)},children:[e.jsx($e,{children:e.jsx(Pe,{})}),e.jsxs(Be,{children:[e.jsx(X,{value:"qq",children:"QQ"}),e.jsx(X,{value:"wx",children:"微信"})]})]})]}),e.jsxs("div",{className:"grid gap-2",children:[e.jsx(E,{className:"text-xs font-medium",children:"群 ID"}),e.jsx(le,{value:N,onChange:y=>{x(f,"target",`${g}:${y.target.value}:${v}`)},placeholder:"输入群 ID",className:"font-mono text-sm"})]}),e.jsxs("div",{className:"grid gap-2",children:[e.jsx(E,{className:"text-xs font-medium",children:"类型"}),e.jsxs(Ie,{value:v,onValueChange:y=>{x(f,"target",`${g}:${N}:${y}`)},children:[e.jsx($e,{children:e.jsx(Pe,{})}),e.jsxs(Be,{children:[e.jsx(X,{value:"group",children:"群组(group)"}),e.jsx(X,{value:"private",children:"私聊(private)"})]})]})]})]}),e.jsxs("p",{className:"text-xs text-muted-foreground",children:["当前聊天流 ID:",h.target||"(未设置)"]})]})})(),e.jsxs("div",{className:"grid gap-2",children:[e.jsx(E,{className:"text-xs font-medium",children:"时间段 (Time)"}),e.jsx(v2,{value:h.time,onChange:p=>x(f,"time",p)}),e.jsx("p",{className:"text-xs text-muted-foreground",children:"支持跨夜区间,例如 23:00-02:00"})]}),e.jsxs("div",{className:"grid gap-3",children:[e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsx(E,{htmlFor:`rule-value-${f}`,className:"text-xs font-medium",children:"发言频率值 (Value)"}),e.jsx(le,{id:`rule-value-${f}`,type:"number",step:"0.01",min:"0.01",max:"1",value:h.value,onChange:p=>{const g=parseFloat(p.target.value);isNaN(g)||x(f,"value",Math.max(.01,Math.min(1,g)))},className:"w-20 h-8 text-xs"})]}),e.jsx(qa,{value:[h.value],onValueChange:p=>x(f,"value",p[0]),min:.01,max:1,step:.01,className:"w-full"}),e.jsxs("div",{className:"flex justify-between text-xs text-muted-foreground",children:[e.jsx("span",{children:"0.01 (极少发言)"}),e.jsx("span",{children:"0.5"}),e.jsx("span",{children:"1.0 (正常)"})]})]})]})]},f))}):e.jsx("div",{className:"text-center py-8 text-muted-foreground",children:e.jsx("p",{className:"text-sm",children:'暂无规则,点击"添加规则"按钮创建'})}),e.jsxs("div",{className:"mt-4 p-4 bg-blue-50 dark:bg-blue-950/20 border border-blue-200 dark:border-blue-800 rounded-lg",children:[e.jsx("h5",{className:"text-sm font-semibold text-blue-900 dark:text-blue-100 mb-2",children:"📝 规则说明"}),e.jsxs("ul",{className:"text-xs text-blue-800 dark:text-blue-200 space-y-1",children:[e.jsxs("li",{children:["• ",e.jsx("strong",{children:"Target 为空"}),":全局规则,对所有聊天生效"]}),e.jsxs("li",{children:["• ",e.jsx("strong",{children:"Target 指定"}),":仅对特定聊天流生效(格式:platform:id:type)"]}),e.jsxs("li",{children:["• ",e.jsx("strong",{children:"优先级"}),":先匹配具体聊天流规则,再匹配全局规则"]}),e.jsxs("li",{children:["• ",e.jsx("strong",{children:"时间支持跨夜"}),":例如 23:00-02:00 表示晚上11点到次日凌晨2点"]}),e.jsxs("li",{children:["• ",e.jsx("strong",{children:"数值范围"}),":建议 0-1,0 表示完全沉默,1 表示正常发言"]})]})]})]})]})}),y2=As.memo(function({config:n,onChange:i}){const c=S=>{if(!S||!S.includes(":"))return{platform:"qq",userId:""};const[P,M]=S.split(":");return{platform:P,userId:M}},{platform:u,userId:x}=c(n.dream_send),[h,f]=d.useState(u),[p,g]=d.useState(x),N=S=>{const[P,M]=S.split("-");return{startTime:P||"09:00",endTime:M||"22:00"}},v=(S,P)=>{const M=P?`${S}:${P}`:"";i({...n,dream_send:M})},y=S=>{f(S),v(S,p)},w=S=>{g(S),v(h,S)},b=()=>{i({...n,dream_time_ranges:[...n.dream_time_ranges,"09:00-22:00"]})},R=S=>{i({...n,dream_time_ranges:n.dream_time_ranges.filter((P,M)=>M!==S)})},D=(S,P,M)=>{const T=[...n.dream_time_ranges],A=N(T[S]);P==="startTime"?A.startTime=M:A.endTime=M,T[S]=`${A.startTime}-${A.endTime}`,i({...n,dream_time_ranges:T})};return e.jsxs("div",{className:"rounded-lg border bg-card p-4 sm:p-6 space-y-6",children:[e.jsx("h3",{className:"text-lg font-semibold",children:"做梦配置"}),e.jsxs("div",{className:"space-y-2",children:[e.jsx(E,{htmlFor:"interval_minutes",children:"做梦时间间隔(分钟)"}),e.jsx(le,{id:"interval_minutes",type:"number",min:"1",value:n.interval_minutes,onChange:S=>i({...n,interval_minutes:Number(S.target.value)})}),e.jsx("p",{className:"text-xs text-muted-foreground",children:"默认30分钟"})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsx(E,{htmlFor:"max_iterations",children:"做梦最大轮次"}),e.jsx(le,{id:"max_iterations",type:"number",min:"1",value:n.max_iterations,onChange:S=>i({...n,max_iterations:Number(S.target.value)})}),e.jsx("p",{className:"text-xs text-muted-foreground",children:"默认20轮"})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsx(E,{htmlFor:"first_delay_seconds",children:"首次做梦延迟(秒)"}),e.jsx(le,{id:"first_delay_seconds",type:"number",min:"0",value:n.first_delay_seconds,onChange:S=>i({...n,first_delay_seconds:Number(S.target.value)})}),e.jsx("p",{className:"text-xs text-muted-foreground",children:"程序启动后首次做梦前的延迟时间,默认60秒"})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsx(E,{children:"做梦结果推送目标"}),e.jsxs("div",{className:"flex gap-2",children:[e.jsxs(Ie,{value:h,onValueChange:y,children:[e.jsx($e,{className:"w-[120px]",children:e.jsx(Pe,{placeholder:"选择平台"})}),e.jsxs(Be,{children:[e.jsx(X,{value:"qq",children:"QQ"}),e.jsx(X,{value:"wx",children:"微信"}),e.jsx(X,{value:"webui",children:"WebUI"})]})]}),e.jsx(le,{type:"text",placeholder:"输入用户ID (例如: 123456)",value:p,onChange:S=>w(S.target.value),className:"flex-1"})]}),e.jsx("p",{className:"text-xs text-muted-foreground",children:"选择平台并输入用户ID,做梦结束后将梦境发送给该用户。用户ID为空则不推送"})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsx(E,{children:"做梦时间段配置"}),e.jsx(_,{type:"button",size:"sm",onClick:b,children:"添加时间段"})]}),e.jsx("p",{className:"text-xs text-muted-foreground",children:"设置允许做梦的时间段,支持跨夜区间(如 23:00 到次日 02:00)。列表为空则全天允许做梦"}),e.jsxs("div",{className:"space-y-2",children:[n.dream_time_ranges.map((S,P)=>{const{startTime:M,endTime:T}=N(S);return e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(le,{type:"time",value:M,onChange:A=>D(P,"startTime",A.target.value),className:"w-[140px]"}),e.jsx("span",{className:"text-muted-foreground",children:"至"}),e.jsx(le,{type:"time",value:T,onChange:A=>D(P,"endTime",A.target.value),className:"w-[140px]"}),e.jsx(_,{type:"button",variant:"ghost",size:"icon",onClick:()=>R(P),children:e.jsx(Ea,{className:"h-4 w-4"})})]},P)}),n.dream_time_ranges.length===0&&e.jsx("p",{className:"text-sm text-muted-foreground",children:"当前配置为全天允许做梦"})]})]})]})}),w2=As.memo(function({config:n,onChange:i}){return e.jsxs("div",{className:"rounded-lg border bg-card p-4 sm:p-6 space-y-4",children:[e.jsx("h3",{className:"text-lg font-semibold",children:"LPMM 知识库设置"}),e.jsxs("div",{className:"grid gap-4",children:[e.jsxs("div",{className:"flex items-center space-x-2",children:[e.jsx(Fe,{checked:n.enable,onCheckedChange:c=>i({...n,enable:c})}),e.jsx(E,{className:"cursor-pointer",children:"启用 LPMM 知识库"})]}),n.enable&&e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"grid gap-2",children:[e.jsx(E,{children:"LPMM 模式"}),e.jsxs(Ie,{value:n.lpmm_mode,onValueChange:c=>i({...n,lpmm_mode:c}),children:[e.jsx($e,{children:e.jsx(Pe,{placeholder:"选择 LPMM 模式"})}),e.jsxs(Be,{children:[e.jsx(X,{value:"classic",children:"经典模式"}),e.jsx(X,{value:"agent",children:"Agent 模式"})]})]})]}),e.jsxs("div",{className:"grid grid-cols-1 sm:grid-cols-2 gap-4",children:[e.jsxs("div",{className:"grid gap-2",children:[e.jsx(E,{children:"同义词搜索 TopK"}),e.jsx(le,{type:"number",min:"1",value:n.rag_synonym_search_top_k,onChange:c=>i({...n,rag_synonym_search_top_k:parseInt(c.target.value)})})]}),e.jsxs("div",{className:"grid gap-2",children:[e.jsx(E,{children:"同义词阈值"}),e.jsx(le,{type:"number",step:"0.1",min:"0",max:"1",value:n.rag_synonym_threshold,onChange:c=>i({...n,rag_synonym_threshold:parseFloat(c.target.value)})})]}),e.jsxs("div",{className:"grid gap-2",children:[e.jsx(E,{children:"实体提取线程数"}),e.jsx(le,{type:"number",min:"1",value:n.info_extraction_workers,onChange:c=>i({...n,info_extraction_workers:parseInt(c.target.value)})})]}),e.jsxs("div",{className:"grid gap-2",children:[e.jsx(E,{children:"嵌入向量维度"}),e.jsx(le,{type:"number",min:"1",value:n.embedding_dimension,onChange:c=>i({...n,embedding_dimension:parseInt(c.target.value)})})]}),e.jsxs("div",{className:"grid gap-2",children:[e.jsx(E,{children:"嵌入并发线程数"}),e.jsx(le,{type:"number",min:"1",value:n.max_embedding_workers,onChange:c=>i({...n,max_embedding_workers:parseInt(c.target.value)})})]}),e.jsxs("div",{className:"grid gap-2",children:[e.jsx(E,{children:"每批嵌入条数"}),e.jsx(le,{type:"number",min:"1",value:n.embedding_chunk_size,onChange:c=>i({...n,embedding_chunk_size:parseInt(c.target.value)})})]}),e.jsxs("div",{className:"grid gap-2",children:[e.jsx(E,{children:"同义实体数上限"}),e.jsx(le,{type:"number",min:"1",value:n.max_synonym_entities,onChange:c=>i({...n,max_synonym_entities:parseInt(c.target.value)})})]})]}),e.jsxs("div",{className:"flex items-center space-x-2",children:[e.jsx(Fe,{checked:n.enable_ppr,onCheckedChange:c=>i({...n,enable_ppr:c})}),e.jsx(E,{className:"cursor-pointer",children:"启用 PPR (低配机器可关闭)"})]})]})]})]})}),_2=As.memo(function({config:n,onChange:i}){const[c,u]=d.useState(""),[x,h]=d.useState("WARNING"),f=()=>{c&&!n.suppress_libraries.includes(c)&&(i({...n,suppress_libraries:[...n.suppress_libraries,c]}),u(""))},p=b=>{i({...n,suppress_libraries:n.suppress_libraries.filter(R=>R!==b)})},g=()=>{c&&!n.library_log_levels[c]&&(i({...n,library_log_levels:{...n.library_log_levels,[c]:x}}),u(""),h("WARNING"))},N=b=>{const R={...n.library_log_levels};delete R[b],i({...n,library_log_levels:R})},v=["DEBUG","INFO","WARNING","ERROR","CRITICAL"],y=["FULL","compact","lite"],w=["none","title","full"];return e.jsxs("div",{className:"rounded-lg border bg-card p-4 sm:p-6 space-y-6",children:[e.jsxs("div",{children:[e.jsx("h3",{className:"text-lg font-semibold mb-4",children:"日志配置"}),e.jsxs("div",{className:"grid grid-cols-1 sm:grid-cols-2 gap-4",children:[e.jsxs("div",{className:"grid gap-2",children:[e.jsx(E,{children:"日期格式"}),e.jsx(le,{value:n.date_style,onChange:b=>i({...n,date_style:b.target.value}),placeholder:"例如: m-d H:i:s"}),e.jsx("p",{className:"text-xs text-muted-foreground",children:"m=月, d=日, H=时, i=分, s=秒"})]}),e.jsxs("div",{className:"grid gap-2",children:[e.jsx(E,{children:"日志级别样式"}),e.jsxs(Ie,{value:n.log_level_style,onValueChange:b=>i({...n,log_level_style:b}),children:[e.jsx($e,{children:e.jsx(Pe,{})}),e.jsx(Be,{children:y.map(b=>e.jsx(X,{value:b,children:b},b))})]})]}),e.jsxs("div",{className:"grid gap-2",children:[e.jsx(E,{children:"日志文本颜色"}),e.jsxs(Ie,{value:n.color_text,onValueChange:b=>i({...n,color_text:b}),children:[e.jsx($e,{children:e.jsx(Pe,{})}),e.jsx(Be,{children:w.map(b=>e.jsx(X,{value:b,children:b},b))})]})]}),e.jsxs("div",{className:"grid gap-2",children:[e.jsx(E,{children:"全局日志级别"}),e.jsxs(Ie,{value:n.log_level,onValueChange:b=>i({...n,log_level:b}),children:[e.jsx($e,{children:e.jsx(Pe,{})}),e.jsx(Be,{children:v.map(b=>e.jsx(X,{value:b,children:b},b))})]})]}),e.jsxs("div",{className:"grid gap-2",children:[e.jsx(E,{children:"控制台日志级别"}),e.jsxs(Ie,{value:n.console_log_level,onValueChange:b=>i({...n,console_log_level:b}),children:[e.jsx($e,{children:e.jsx(Pe,{})}),e.jsx(Be,{children:v.map(b=>e.jsx(X,{value:b,children:b},b))})]})]}),e.jsxs("div",{className:"grid gap-2",children:[e.jsx(E,{children:"文件日志级别"}),e.jsxs(Ie,{value:n.file_log_level,onValueChange:b=>i({...n,file_log_level:b}),children:[e.jsx($e,{children:e.jsx(Pe,{})}),e.jsx(Be,{children:v.map(b=>e.jsx(X,{value:b,children:b},b))})]})]})]})]}),e.jsxs("div",{children:[e.jsx(E,{className:"mb-2 block",children:"完全屏蔽的库"}),e.jsxs("div",{className:"flex gap-2 mb-2",children:[e.jsx(le,{value:c,onChange:b=>u(b.target.value),placeholder:"输入库名",className:"flex-1",onKeyDown:b=>{b.key==="Enter"&&(b.preventDefault(),f())}}),e.jsx(_,{onClick:f,size:"sm",className:"flex-shrink-0",children:e.jsx(et,{className:"h-4 w-4",strokeWidth:2,fill:"none"})})]}),e.jsx("div",{className:"flex flex-wrap gap-2",children:n.suppress_libraries.map(b=>e.jsxs("div",{className:"flex items-center gap-1 bg-secondary px-3 py-1 rounded-md",children:[e.jsx("span",{className:"text-sm",children:b}),e.jsx(_,{variant:"ghost",size:"sm",className:"h-5 w-5 p-0",onClick:()=>p(b),children:e.jsx(ls,{className:"h-3 w-3",strokeWidth:2,fill:"none"})})]},b))})]}),e.jsxs("div",{children:[e.jsx(E,{className:"mb-2 block",children:"特定库的日志级别"}),e.jsxs("div",{className:"flex gap-2 mb-2",children:[e.jsx(le,{value:c,onChange:b=>u(b.target.value),placeholder:"输入库名",className:"flex-1"}),e.jsxs(Ie,{value:x,onValueChange:h,children:[e.jsx($e,{className:"w-32",children:e.jsx(Pe,{})}),e.jsx(Be,{children:v.map(b=>e.jsx(X,{value:b,children:b},b))})]}),e.jsx(_,{onClick:g,size:"sm",children:e.jsx(et,{className:"h-4 w-4",strokeWidth:2,fill:"none"})})]}),e.jsx("div",{className:"space-y-2",children:Object.entries(n.library_log_levels).map(([b,R])=>e.jsxs("div",{className:"flex items-center justify-between bg-secondary px-3 py-2 rounded-md",children:[e.jsx("span",{className:"text-sm font-medium",children:b}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("span",{className:"text-sm text-muted-foreground",children:R}),e.jsx(_,{variant:"ghost",size:"sm",className:"h-6 w-6 p-0",onClick:()=>N(b),children:e.jsx(ls,{className:"h-3 w-3",strokeWidth:2,fill:"none"})})]})]},b))})]})]})}),S2=As.memo(function({config:n,onChange:i}){return e.jsxs("div",{className:"rounded-lg border bg-card p-4 sm:p-6 space-y-4",children:[e.jsx("h3",{className:"text-lg font-semibold",children:"调试配置"}),e.jsxs("div",{className:"space-y-4",children:[e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsxs("div",{className:"space-y-0.5",children:[e.jsx(E,{children:"显示 Prompt"}),e.jsx("p",{className:"text-sm text-muted-foreground",children:"是否在日志中显示提示词"})]}),e.jsx(Fe,{checked:n.show_prompt,onCheckedChange:c=>i({...n,show_prompt:c})})]}),e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsxs("div",{className:"space-y-0.5",children:[e.jsx(E,{children:"显示回复器 Prompt"}),e.jsx("p",{className:"text-sm text-muted-foreground",children:"是否显示回复器的提示词"})]}),e.jsx(Fe,{checked:n.show_replyer_prompt,onCheckedChange:c=>i({...n,show_replyer_prompt:c})})]}),e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsxs("div",{className:"space-y-0.5",children:[e.jsx(E,{children:"显示回复器推理"}),e.jsx("p",{className:"text-sm text-muted-foreground",children:"是否显示回复器的推理过程"})]}),e.jsx(Fe,{checked:n.show_replyer_reasoning,onCheckedChange:c=>i({...n,show_replyer_reasoning:c})})]}),e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsxs("div",{className:"space-y-0.5",children:[e.jsx(E,{children:"显示 Jargon Prompt"}),e.jsx("p",{className:"text-sm text-muted-foreground",children:"是否显示术语相关的提示词"})]}),e.jsx(Fe,{checked:n.show_jargon_prompt,onCheckedChange:c=>i({...n,show_jargon_prompt:c})})]}),e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsxs("div",{className:"space-y-0.5",children:[e.jsx(E,{children:"显示记忆检索 Prompt"}),e.jsx("p",{className:"text-sm text-muted-foreground",children:"是否显示记忆检索相关的提示词"})]}),e.jsx(Fe,{checked:n.show_memory_prompt,onCheckedChange:c=>i({...n,show_memory_prompt:c})})]}),e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsxs("div",{className:"space-y-0.5",children:[e.jsx(E,{children:"显示 Planner Prompt"}),e.jsx("p",{className:"text-sm text-muted-foreground",children:"是否显示 Planner 的提示词和原始返回结果"})]}),e.jsx(Fe,{checked:n.show_planner_prompt,onCheckedChange:c=>i({...n,show_planner_prompt:c})})]}),e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsxs("div",{className:"space-y-0.5",children:[e.jsx(E,{children:"显示 LPMM 相关文段"}),e.jsx("p",{className:"text-sm text-muted-foreground",children:"是否显示 LPMM 知识库找到的相关文段日志"})]}),e.jsx(Fe,{checked:n.show_lpmm_paragraph,onCheckedChange:c=>i({...n,show_lpmm_paragraph:c})})]})]})]})}),k2=As.memo(function({config:n,onChange:i}){const[c,u]=d.useState(""),[x,h]=d.useState(""),f=()=>{c&&!n.auth_token.includes(c)&&(i({...n,auth_token:[...n.auth_token,c]}),u(""))},p=v=>{i({...n,auth_token:n.auth_token.filter((y,w)=>w!==v)})},g=()=>{x&&!n.api_server_allowed_api_keys.includes(x)&&(i({...n,api_server_allowed_api_keys:[...n.api_server_allowed_api_keys,x]}),h(""))},N=v=>{i({...n,api_server_allowed_api_keys:n.api_server_allowed_api_keys.filter((y,w)=>w!==v)})};return e.jsxs("div",{className:"rounded-lg border bg-card p-4 sm:p-6 space-y-6",children:[e.jsxs("div",{children:[e.jsx("h3",{className:"text-lg font-semibold mb-2",children:"旧版 API 认证令牌"}),e.jsx("p",{className:"text-sm text-muted-foreground mb-3",children:"用于旧版 API 验证,为空则不启用验证"}),e.jsxs("div",{className:"flex gap-2 mb-2",children:[e.jsx(le,{value:c,onChange:v=>u(v.target.value),placeholder:"输入认证令牌",onKeyDown:v=>{v.key==="Enter"&&(v.preventDefault(),f())}}),e.jsx(_,{onClick:f,size:"sm",children:e.jsx(et,{className:"h-4 w-4",strokeWidth:2,fill:"none"})})]}),e.jsx("div",{className:"space-y-2",children:n.auth_token.map((v,y)=>e.jsxs("div",{className:"flex items-center justify-between bg-secondary px-3 py-2 rounded-md",children:[e.jsx("span",{className:"text-sm font-mono",children:v}),e.jsx(_,{variant:"ghost",size:"sm",className:"h-6 w-6 p-0",onClick:()=>p(y),children:e.jsx(ls,{className:"h-3 w-3",strokeWidth:2,fill:"none"})})]},y))})]}),e.jsxs("div",{children:[e.jsx("h3",{className:"text-lg font-semibold mb-4",children:"新版 API Server 配置"}),e.jsxs("div",{className:"space-y-4",children:[e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsxs("div",{className:"space-y-0.5",children:[e.jsx(E,{children:"启用新版 API Server"}),e.jsx("p",{className:"text-sm text-muted-foreground",children:"是否启用额外的新版 API Server(额外监听端口)"})]}),e.jsx(Fe,{checked:n.enable_api_server,onCheckedChange:v=>i({...n,enable_api_server:v})})]}),n.enable_api_server&&e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"grid grid-cols-1 sm:grid-cols-2 gap-4",children:[e.jsxs("div",{className:"grid gap-2",children:[e.jsx(E,{children:"主机地址"}),e.jsx(le,{value:n.api_server_host,onChange:v=>i({...n,api_server_host:v.target.value}),placeholder:"0.0.0.0"})]}),e.jsxs("div",{className:"grid gap-2",children:[e.jsx(E,{children:"端口号"}),e.jsx(le,{type:"number",value:n.api_server_port,onChange:v=>i({...n,api_server_port:parseInt(v.target.value)}),placeholder:"8090"})]})]}),e.jsxs("div",{className:"flex items-center space-x-2",children:[e.jsx(Fe,{checked:n.api_server_use_wss,onCheckedChange:v=>i({...n,api_server_use_wss:v})}),e.jsx(E,{children:"启用 WSS 安全连接"})]}),n.api_server_use_wss&&e.jsxs("div",{className:"grid gap-4",children:[e.jsxs("div",{className:"grid gap-2",children:[e.jsx(E,{children:"SSL 证书文件路径"}),e.jsx(le,{value:n.api_server_cert_file,onChange:v=>i({...n,api_server_cert_file:v.target.value}),placeholder:"cert.pem"})]}),e.jsxs("div",{className:"grid gap-2",children:[e.jsx(E,{children:"SSL 密钥文件路径"}),e.jsx(le,{value:n.api_server_key_file,onChange:v=>i({...n,api_server_key_file:v.target.value}),placeholder:"key.pem"})]})]}),e.jsxs("div",{children:[e.jsx(E,{className:"mb-2 block",children:"允许的 API Key 列表"}),e.jsx("p",{className:"text-sm text-muted-foreground mb-2",children:"为空则允许所有连接"}),e.jsxs("div",{className:"flex gap-2 mb-2",children:[e.jsx(le,{value:x,onChange:v=>h(v.target.value),placeholder:"输入 API Key",onKeyDown:v=>{v.key==="Enter"&&(v.preventDefault(),g())}}),e.jsx(_,{onClick:g,size:"sm",children:e.jsx(et,{className:"h-4 w-4",strokeWidth:2,fill:"none"})})]}),e.jsx("div",{className:"space-y-2",children:n.api_server_allowed_api_keys.map((v,y)=>e.jsxs("div",{className:"flex items-center justify-between bg-secondary px-3 py-2 rounded-md",children:[e.jsx("span",{className:"text-sm font-mono",children:v}),e.jsx(_,{variant:"ghost",size:"sm",className:"h-6 w-6 p-0",onClick:()=>N(y),children:e.jsx(ls,{className:"h-3 w-3",strokeWidth:2,fill:"none"})})]},y))})]})]})]})]})]})}),C2=As.memo(function({config:n,onChange:i}){return e.jsxs("div",{className:"rounded-lg border bg-card p-4 sm:p-6 space-y-4",children:[e.jsx("h3",{className:"text-lg font-semibold",children:"统计信息"}),e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsxs("div",{className:"space-y-0.5",children:[e.jsx(E,{children:"启用统计信息发送"}),e.jsx("p",{className:"text-sm text-muted-foreground",children:"发送匿名统计信息,帮助我们了解全球有多少只麦麦在运行"})]}),e.jsx(Fe,{checked:n.enable,onCheckedChange:c=>i({...n,enable:c})})]})]})}),T2=As.memo(function({emojiConfig:n,memoryConfig:i,toolConfig:c,voiceConfig:u,onEmojiChange:x,onMemoryChange:h,onToolChange:f,onVoiceChange:p}){return e.jsxs("div",{className:"space-y-6",children:[e.jsx("div",{className:"rounded-lg border bg-card p-4 sm:p-6 space-y-4",children:e.jsxs("div",{children:[e.jsx("h3",{className:"text-lg font-semibold mb-4",children:"工具设置"}),e.jsxs("div",{className:"space-y-4",children:[e.jsxs("div",{className:"flex items-center space-x-2",children:[e.jsx(Fe,{id:"enable_tool",checked:c.enable_tool,onCheckedChange:g=>f({...c,enable_tool:g})}),e.jsx(E,{htmlFor:"enable_tool",className:"cursor-pointer",children:"启用工具系统"})]}),e.jsx("p",{className:"text-xs text-muted-foreground -mt-2",children:"允许麦麦使用各种工具来增强功能"}),e.jsxs("div",{className:"flex items-center space-x-2 pt-2",children:[e.jsx(Fe,{id:"enable_asr",checked:u.enable_asr,onCheckedChange:g=>p({...u,enable_asr:g})}),e.jsx(E,{htmlFor:"enable_asr",className:"cursor-pointer",children:"启用语音识别"})]}),e.jsx("p",{className:"text-xs text-muted-foreground -mt-2",children:"启用后麦麦可以识别语音消息,需要配置语音识别模型"})]})]})}),e.jsx("div",{className:"rounded-lg border bg-card p-4 sm:p-6 space-y-4",children:e.jsxs("div",{children:[e.jsx("h3",{className:"text-lg font-semibold mb-4",children:"记忆设置"}),e.jsxs("div",{className:"grid gap-4",children:[e.jsxs("div",{className:"grid gap-2",children:[e.jsx(E,{htmlFor:"max_agent_iterations",children:"记忆思考深度"}),e.jsx(le,{id:"max_agent_iterations",type:"number",min:"1",value:i.max_agent_iterations,onChange:g=>h({...i,max_agent_iterations:parseInt(g.target.value)})}),e.jsx("p",{className:"text-xs text-muted-foreground",children:"最低为 1(不深入思考)"})]}),e.jsxs("div",{className:"grid gap-2",children:[e.jsx(E,{htmlFor:"agent_timeout_seconds",children:"最长回忆时间(秒)"}),e.jsx(le,{id:"agent_timeout_seconds",type:"number",min:"1",step:"0.1",value:i.agent_timeout_seconds??120,onChange:g=>h({...i,agent_timeout_seconds:parseFloat(g.target.value)})}),e.jsx("p",{className:"text-xs text-muted-foreground",children:"记忆检索的超时时间,避免过长的等待"})]}),e.jsxs("div",{className:"flex items-center space-x-2",children:[e.jsx(Fe,{id:"enable_jargon_detection",checked:i.enable_jargon_detection??!0,onCheckedChange:g=>h({...i,enable_jargon_detection:g})}),e.jsx(E,{htmlFor:"enable_jargon_detection",className:"cursor-pointer",children:"启用黑话识别"})]}),e.jsx("p",{className:"text-xs text-muted-foreground -mt-2",children:"记忆检索过程中是否启用黑话识别"}),e.jsxs("div",{className:"flex items-center space-x-2",children:[e.jsx(Fe,{id:"global_memory",checked:i.global_memory??!1,onCheckedChange:g=>h({...i,global_memory:g})}),e.jsx(E,{htmlFor:"global_memory",className:"cursor-pointer",children:"全局记忆查询"})]}),e.jsx("p",{className:"text-xs text-muted-foreground -mt-2",children:"允许记忆检索在所有聊天记录中进行全局查询(忽略当前聊天流)"})]})]})}),e.jsx("div",{className:"rounded-lg border bg-card p-4 sm:p-6 space-y-4",children:e.jsxs("div",{children:[e.jsx("h3",{className:"text-lg font-semibold mb-4",children:"表情包设置"}),e.jsxs("div",{className:"grid gap-4",children:[e.jsxs("div",{className:"grid gap-2",children:[e.jsx(E,{htmlFor:"emoji_chance",children:"表情包激活概率"}),e.jsx(le,{id:"emoji_chance",type:"number",step:"0.1",min:"0",max:"1",value:n.emoji_chance,onChange:g=>x({...n,emoji_chance:parseFloat(g.target.value)})}),e.jsx("p",{className:"text-xs text-muted-foreground",children:"范围 0-1,越大越容易发送表情包"})]}),e.jsxs("div",{className:"grid gap-2",children:[e.jsx(E,{htmlFor:"max_reg_num",children:"最大注册数量"}),e.jsx(le,{id:"max_reg_num",type:"number",min:"1",value:n.max_reg_num,onChange:g=>x({...n,max_reg_num:parseInt(g.target.value)})}),e.jsx("p",{className:"text-xs text-muted-foreground",children:"麦麦最多可以注册的表情包数量"})]}),e.jsxs("div",{className:"grid gap-2",children:[e.jsx(E,{htmlFor:"check_interval",children:"检查间隔(分钟)"}),e.jsx(le,{id:"check_interval",type:"number",min:"1",value:n.check_interval,onChange:g=>x({...n,check_interval:parseInt(g.target.value)})}),e.jsx("p",{className:"text-xs text-muted-foreground",children:"检查表情包(注册、破损、删除)的时间间隔"})]}),e.jsxs("div",{className:"flex items-center space-x-2",children:[e.jsx(Fe,{id:"do_replace",checked:n.do_replace,onCheckedChange:g=>x({...n,do_replace:g})}),e.jsx(E,{htmlFor:"do_replace",className:"cursor-pointer",children:"达到最大数量时替换表情包"})]}),e.jsxs("div",{className:"flex items-center space-x-2",children:[e.jsx(Fe,{id:"steal_emoji",checked:n.steal_emoji,onCheckedChange:g=>x({...n,steal_emoji:g})}),e.jsx(E,{htmlFor:"steal_emoji",className:"cursor-pointer",children:"偷取表情包"})]}),e.jsx("p",{className:"text-xs text-muted-foreground -mt-2",children:"允许麦麦将看到的表情包据为己有"}),e.jsxs("div",{className:"flex items-center space-x-2",children:[e.jsx(Fe,{id:"content_filtration",checked:n.content_filtration,onCheckedChange:g=>x({...n,content_filtration:g})}),e.jsx(E,{htmlFor:"content_filtration",className:"cursor-pointer",children:"启用表情包过滤"})]}),n.content_filtration&&e.jsxs("div",{className:"grid gap-2 pl-6 border-l-2 border-primary/20",children:[e.jsx(E,{htmlFor:"filtration_prompt",children:"过滤要求"}),e.jsx(le,{id:"filtration_prompt",value:n.filtration_prompt,onChange:g=>x({...n,filtration_prompt:g.target.value}),placeholder:"符合公序良俗"}),e.jsx("p",{className:"text-xs text-muted-foreground",children:"只有符合此要求的表情包才会被保存"})]})]})]})})]})}),E2=As.memo(function({member:n,groupIndex:i,memberIndex:c,availableChatIds:u,onUpdate:x,onRemove:h}){const f=u.includes(n)||n==="*",[p,g]=d.useState(!f);return e.jsxs("div",{className:"flex gap-2",children:[e.jsx("div",{className:"flex-1 flex gap-2",children:p?e.jsxs(e.Fragment,{children:[e.jsx(le,{value:n,onChange:N=>x(i,c,N.target.value),placeholder:'输入 "*" 或 "qq:123456:group"',className:"flex-1"}),u.length>0&&e.jsx(_,{size:"sm",variant:"outline",onClick:()=>g(!1),title:"切换到下拉选择",children:"下拉"})]}):e.jsxs(e.Fragment,{children:[e.jsxs(Ie,{value:n,onValueChange:N=>x(i,c,N),children:[e.jsx($e,{className:"flex-1",children:e.jsx(Pe,{placeholder:"选择聊天流"})}),e.jsxs(Be,{children:[e.jsx(X,{value:"*",children:"* (全局共享)"}),u.map((N,v)=>e.jsx(X,{value:N,children:N},v))]})]}),e.jsx(_,{size:"sm",variant:"outline",onClick:()=>g(!0),title:"切换到手动输入",children:"输入"})]})}),e.jsxs(vs,{children:[e.jsx(wt,{asChild:!0,children:e.jsx(_,{size:"icon",variant:"outline",children:e.jsx(ls,{className:"h-4 w-4"})})}),e.jsxs(ds,{children:[e.jsxs(us,{children:[e.jsx(xs,{children:"确认删除"}),e.jsxs(hs,{children:['确定要删除组成员 "',n||"(空)",'" 吗?此操作无法撤销。']})]}),e.jsxs(ms,{children:[e.jsx(ps,{children:"取消"}),e.jsx(fs,{onClick:()=>h(i,c),children:"删除"})]})]})]})]})}),M2=As.memo(function({config:n,onChange:i}){const c=()=>{i({...n,learning_list:[...n.learning_list,["","enable","enable","1.0"]]})},u=y=>{i({...n,learning_list:n.learning_list.filter((w,b)=>b!==y)})},x=(y,w,b)=>{const R=[...n.learning_list];R[y][w]=b,i({...n,learning_list:R})},h=({rule:y})=>{const w=`["${y[0]}", "${y[1]}", "${y[2]}", "${y[3]}"]`;return e.jsxs(ol,{children:[e.jsx(dl,{asChild:!0,children:e.jsxs(_,{variant:"outline",size:"sm",children:[e.jsx(ia,{className:"h-4 w-4 mr-1"}),"预览"]})}),e.jsx(Wa,{className:"w-80 sm:w-96",children:e.jsxs("div",{className:"space-y-2",children:[e.jsx("h4",{className:"font-medium text-sm",children:"配置预览"}),e.jsx("div",{className:"rounded-md bg-muted p-3 font-mono text-xs break-all",children:w}),e.jsx("p",{className:"text-xs text-muted-foreground",children:"这是保存到 bot_config.toml 文件中的格式"})]})})]})},f=()=>{i({...n,expression_groups:[...n.expression_groups,[]]})},p=y=>{i({...n,expression_groups:n.expression_groups.filter((w,b)=>b!==y)})},g=y=>{const w=[...n.expression_groups];w[y]=[...w[y],""],i({...n,expression_groups:w})},N=(y,w)=>{const b=[...n.expression_groups];b[y]=b[y].filter((R,D)=>D!==w),i({...n,expression_groups:b})},v=(y,w,b)=>{const R=[...n.expression_groups];R[y][w]=b,i({...n,expression_groups:R})};return e.jsxs("div",{className:"space-y-6",children:[e.jsxs("div",{className:"rounded-lg border bg-card p-4 sm:p-6 space-y-4",children:[e.jsx("h3",{className:"text-lg font-semibold mb-4",children:"黑话设置"}),e.jsxs("div",{children:[e.jsxs("div",{className:"flex items-center space-x-2",children:[e.jsx(Fe,{id:"all_global_jargon",checked:n.all_global_jargon??!1,onCheckedChange:y=>i({...n,all_global_jargon:y})}),e.jsx(E,{htmlFor:"all_global_jargon",className:"cursor-pointer",children:"全局黑话模式"})]}),e.jsx("p",{className:"text-xs text-muted-foreground mt-2",children:"开启后,新增的黑话将默认设为全局(所有聊天流共享)。关闭后,已记录的全局黑话不会改变,需要手动删除。"})]}),e.jsxs("div",{children:[e.jsxs("div",{className:"flex items-center space-x-2",children:[e.jsx(Fe,{id:"enable_jargon_explanation",checked:n.enable_jargon_explanation??!0,onCheckedChange:y=>i({...n,enable_jargon_explanation:y})}),e.jsx(E,{htmlFor:"enable_jargon_explanation",className:"cursor-pointer",children:"启用黑话解释"})]}),e.jsx("p",{className:"text-xs text-muted-foreground mt-2",children:"在回复前尝试对上下文中的黑话进行解释。关闭可减少一次LLM调用,仅影响回复前的黑话匹配与解释,不影响黑话学习。"})]}),e.jsxs("div",{children:[e.jsx(E,{htmlFor:"jargon_mode",children:"黑话解释来源模式"}),e.jsxs(Ie,{value:n.jargon_mode??"context",onValueChange:y=>i({...n,jargon_mode:y}),children:[e.jsx($e,{id:"jargon_mode",className:"mt-2",children:e.jsx(Pe,{placeholder:"选择黑话解释来源"})}),e.jsxs(Be,{children:[e.jsx(X,{value:"context",children:"上下文模式(自动匹配黑话)"}),e.jsx(X,{value:"planner",children:"Planner模式(使用unknown_words列表)"})]})]}),e.jsxs("p",{className:"text-xs text-muted-foreground mt-2",children:["上下文模式:使用上下文自动匹配黑话并解释",e.jsx("br",{}),"Planner模式:仅使用Planner在reply动作中给出的unknown_words列表进行黑话检索"]})]})]}),e.jsx("div",{className:"rounded-lg border bg-card p-4 sm:p-6 space-y-6",children:e.jsxs("div",{children:[e.jsxs("div",{className:"flex items-center justify-between mb-4",children:[e.jsxs("div",{children:[e.jsx("h3",{className:"text-lg font-semibold",children:"表达学习配置"}),e.jsx("p",{className:"text-sm text-muted-foreground mt-1",children:"配置麦麦如何学习和使用表达方式"})]}),e.jsxs(_,{onClick:c,size:"sm",variant:"outline",children:[e.jsx(et,{className:"h-4 w-4 mr-1"}),"添加规则"]})]}),e.jsxs("div",{className:"space-y-4",children:[n.learning_list.map((y,w)=>{const b=n.learning_list.some((T,A)=>A!==w&&T[0]===""),R=y[0]==="",D=y[0].split(":"),S=D[0]||"qq",P=D[1]||"",M=D[2]||"group";return e.jsxs("div",{className:"rounded-lg border p-4 space-y-4",children:[e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsxs("span",{className:"text-sm font-medium",children:["规则 ",w+1," ",R&&"(全局配置)"]}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(h,{rule:y}),e.jsxs(vs,{children:[e.jsx(wt,{asChild:!0,children:e.jsx(_,{size:"sm",variant:"ghost",children:e.jsx(ls,{className:"h-4 w-4"})})}),e.jsxs(ds,{children:[e.jsxs(us,{children:[e.jsx(xs,{children:"确认删除"}),e.jsxs(hs,{children:["确定要删除学习规则 ",w+1," 吗?此操作无法撤销。"]})]}),e.jsxs(ms,{children:[e.jsx(ps,{children:"取消"}),e.jsx(fs,{onClick:()=>u(w),children:"删除"})]})]})]})]})]}),e.jsxs("div",{className:"space-y-4",children:[e.jsxs("div",{className:"grid gap-2",children:[e.jsx(E,{className:"text-xs font-medium",children:"配置类型"}),e.jsxs(Ie,{value:R?"global":"specific",onValueChange:T=>{T==="global"?x(w,0,""):x(w,0,"qq::group")},disabled:b&&!R,children:[e.jsx($e,{children:e.jsx(Pe,{})}),e.jsxs(Be,{children:[e.jsx(X,{value:"global",children:"全局配置"}),e.jsx(X,{value:"specific",disabled:b&&!R,children:"详细配置"})]})]}),b&&!R&&e.jsx("p",{className:"text-xs text-amber-600",children:"已存在全局配置,无法创建新的全局配置"})]}),!R&&e.jsxs("div",{className:"grid gap-4 p-3 sm:p-4 rounded-lg bg-muted/50",children:[e.jsxs("div",{className:"grid grid-cols-1 sm:grid-cols-3 gap-3",children:[e.jsxs("div",{className:"grid gap-2",children:[e.jsx(E,{className:"text-xs font-medium",children:"平台"}),e.jsxs(Ie,{value:S,onValueChange:T=>{x(w,0,`${T}:${P}:${M}`)},children:[e.jsx($e,{children:e.jsx(Pe,{})}),e.jsxs(Be,{children:[e.jsx(X,{value:"qq",children:"QQ"}),e.jsx(X,{value:"wx",children:"微信"})]})]})]}),e.jsxs("div",{className:"grid gap-2",children:[e.jsx(E,{className:"text-xs font-medium",children:"群 ID"}),e.jsx(le,{value:P,onChange:T=>{x(w,0,`${S}:${T.target.value}:${M}`)},placeholder:"输入群 ID",className:"font-mono text-sm"})]}),e.jsxs("div",{className:"grid gap-2",children:[e.jsx(E,{className:"text-xs font-medium",children:"类型"}),e.jsxs(Ie,{value:M,onValueChange:T=>{x(w,0,`${S}:${P}:${T}`)},children:[e.jsx($e,{children:e.jsx(Pe,{})}),e.jsxs(Be,{children:[e.jsx(X,{value:"group",children:"群组(group)"}),e.jsx(X,{value:"private",children:"私聊(private)"})]})]})]})]}),e.jsxs("p",{className:"text-xs text-muted-foreground",children:["当前聊天流 ID:",y[0]||"(未设置)"]})]}),e.jsx("div",{className:"grid gap-2",children:e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsxs("div",{children:[e.jsx(E,{className:"text-xs font-medium",children:"使用学到的表达"}),e.jsx("p",{className:"text-xs text-muted-foreground mt-1",children:"允许麦麦使用从聊天中学到的表达方式"})]}),e.jsx(Fe,{checked:y[1]==="enable",onCheckedChange:T=>x(w,1,T?"enable":"disable")})]})}),e.jsx("div",{className:"grid gap-2",children:e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsxs("div",{children:[e.jsx(E,{className:"text-xs font-medium",children:"学习表达"}),e.jsx("p",{className:"text-xs text-muted-foreground mt-1",children:"允许麦麦从聊天中学习新的表达方式"})]}),e.jsx(Fe,{checked:y[2]==="enable",onCheckedChange:T=>x(w,2,T?"enable":"disable")})]})}),e.jsx("div",{className:"grid gap-2",children:e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsxs("div",{children:[e.jsx(E,{className:"text-xs font-medium",children:"启用黑话学习"}),e.jsx("p",{className:"text-xs text-muted-foreground mt-1",children:"允许麦麦在此聊天流中学习和记录黑话"})]}),e.jsx(Fe,{checked:y[3]==="true"||y[3]==="enable",onCheckedChange:T=>x(w,3,T?"true":"false")})]})})]})]},w)}),n.learning_list.length===0&&e.jsx("div",{className:"text-center py-8 text-muted-foreground",children:'暂无学习规则,点击"添加规则"开始配置'})]})]})}),e.jsx("div",{className:"rounded-lg border bg-card p-4 sm:p-6 space-y-6",children:e.jsxs("div",{className:"space-y-6",children:[e.jsxs("div",{children:[e.jsx("h3",{className:"text-lg font-semibold",children:"表达优化配置"}),e.jsx("p",{className:"text-sm text-muted-foreground mt-1",children:"配置麦麦如何优化和改进表达方式"})]}),e.jsxs("div",{className:"space-y-4",children:[e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsxs("div",{className:"space-y-1",children:[e.jsx(E,{htmlFor:"expression_self_reflect",className:"cursor-pointer font-medium",children:"自动表达优化"}),e.jsx("p",{className:"text-xs text-muted-foreground",children:"启用后,麦麦会自动检查并优化表达方式,无需管理员手动干预"})]}),e.jsx(Fe,{id:"expression_self_reflect",checked:n.expression_self_reflect??!1,onCheckedChange:y=>i({...n,expression_self_reflect:y})})]}),n.expression_self_reflect&&e.jsxs("div",{className:"space-y-4 pl-4 border-l-2 border-primary/20",children:[e.jsxs("div",{className:"space-y-2",children:[e.jsx(E,{htmlFor:"expression_auto_check_interval",children:"自动检查间隔(秒)"}),e.jsx(le,{id:"expression_auto_check_interval",type:"number",min:"60",value:n.expression_auto_check_interval??3600,onChange:y=>i({...n,expression_auto_check_interval:parseInt(y.target.value)||3600})}),e.jsx("p",{className:"text-xs text-muted-foreground",children:"表达方式自动检查的间隔时间(单位:秒),默认值:3600秒(1小时)"})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsx(E,{htmlFor:"expression_auto_check_count",children:"每次检查数量"}),e.jsx(le,{id:"expression_auto_check_count",type:"number",min:"1",max:"100",value:n.expression_auto_check_count??10,onChange:y=>i({...n,expression_auto_check_count:parseInt(y.target.value)||10})}),e.jsx("p",{className:"text-xs text-muted-foreground",children:"每次自动检查时随机选取的表达方式数量,默认值:10条"})]}),e.jsxs("div",{className:"space-y-3",children:[e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsx(E,{children:"自定义评估标准"}),e.jsxs(_,{onClick:()=>{i({...n,expression_auto_check_custom_criteria:[...n.expression_auto_check_custom_criteria||[],""]})},size:"sm",variant:"outline",children:[e.jsx(et,{className:"h-4 w-4 mr-1"}),"添加标准"]})]}),e.jsxs("div",{className:"space-y-2",children:[(n.expression_auto_check_custom_criteria||[]).map((y,w)=>e.jsxs("div",{className:"flex gap-2",children:[e.jsx(le,{value:y,onChange:b=>{const R=[...n.expression_auto_check_custom_criteria||[]];R[w]=b.target.value,i({...n,expression_auto_check_custom_criteria:R})},placeholder:"输入评估标准,例如:是否符合角色人设",className:"flex-1"}),e.jsx(_,{onClick:()=>{i({...n,expression_auto_check_custom_criteria:(n.expression_auto_check_custom_criteria||[]).filter((b,R)=>R!==w)})},size:"icon",variant:"ghost",children:e.jsx(ls,{className:"h-4 w-4"})})]},w)),(!n.expression_auto_check_custom_criteria||n.expression_auto_check_custom_criteria.length===0)&&e.jsx("div",{className:"text-center py-4 text-muted-foreground text-sm",children:'暂无自定义标准,点击"添加标准"开始配置'})]}),e.jsx("p",{className:"text-xs text-muted-foreground",children:"这些标准会被添加到评估提示词中,作为额外的评估要求"})]})]})]}),e.jsx("div",{className:"space-y-4",children:e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsxs("div",{className:"space-y-1",children:[e.jsx(E,{htmlFor:"expression_checked_only",className:"cursor-pointer font-medium",children:"仅使用已审核通过的表达方式"}),e.jsx("p",{className:"text-xs text-muted-foreground",children:"开启后,只有通过审核(已检查)的项目会被使用;关闭时,未审核的项目也会被使用。无论开关状态,被拒绝的项目永远不会被使用。"})]}),e.jsx(Fe,{id:"expression_checked_only",checked:n.expression_checked_only??!1,onCheckedChange:y=>i({...n,expression_checked_only:y})})]})}),e.jsxs("div",{className:"space-y-4",children:[e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsxs("div",{className:"space-y-1",children:[e.jsx(E,{htmlFor:"expression_manual_reflect",className:"cursor-pointer font-medium",children:"手动表达优化"}),e.jsx("p",{className:"text-xs text-muted-foreground",children:"启用后,麦麦会主动向管理员询问表达方式是否合适"})]}),e.jsx(Fe,{id:"expression_manual_reflect",checked:n.expression_manual_reflect??!1,onCheckedChange:y=>i({...n,expression_manual_reflect:y})})]}),n.expression_manual_reflect&&e.jsxs("div",{className:"space-y-4 pl-4 border-l-2 border-primary/20",children:[e.jsxs("div",{className:"rounded-lg border p-4 space-y-4",children:[e.jsx("div",{className:"flex items-center justify-between",children:e.jsx("span",{className:"text-sm font-medium",children:"反思操作员"})}),e.jsx("div",{className:"space-y-4",children:(()=>{const w=(n.manual_reflect_operator_id||"").split(":"),b=w[0]||"qq",R=w[1]||"",D=w[2]||"private";return e.jsxs("div",{className:"grid gap-4 p-3 sm:p-4 rounded-lg bg-muted/50",children:[e.jsxs("div",{className:"grid grid-cols-1 sm:grid-cols-3 gap-3",children:[e.jsxs("div",{className:"grid gap-2",children:[e.jsx(E,{className:"text-xs font-medium",children:"平台"}),e.jsxs(Ie,{value:b,onValueChange:S=>{i({...n,manual_reflect_operator_id:`${S}:${R}:${D}`})},children:[e.jsx($e,{children:e.jsx(Pe,{})}),e.jsxs(Be,{children:[e.jsx(X,{value:"qq",children:"QQ"}),e.jsx(X,{value:"wx",children:"微信"})]})]})]}),e.jsxs("div",{className:"grid gap-2",children:[e.jsx(E,{className:"text-xs font-medium",children:"用户/群 ID"}),e.jsx(le,{value:R,onChange:S=>{i({...n,manual_reflect_operator_id:`${b}:${S.target.value}:${D}`})},placeholder:"输入 ID",className:"font-mono text-sm"})]}),e.jsxs("div",{className:"grid gap-2",children:[e.jsx(E,{className:"text-xs font-medium",children:"类型"}),e.jsxs(Ie,{value:D,onValueChange:S=>{i({...n,manual_reflect_operator_id:`${b}:${R}:${S}`})},children:[e.jsx($e,{children:e.jsx(Pe,{})}),e.jsxs(Be,{children:[e.jsx(X,{value:"private",children:"私聊(private)"}),e.jsx(X,{value:"group",children:"群组(group)"})]})]})]})]}),e.jsxs("p",{className:"text-xs text-muted-foreground",children:["当前操作员 ID:",n.manual_reflect_operator_id||"(未设置)"]}),e.jsx("p",{className:"text-xs text-muted-foreground",children:'手动表达优化操作员ID,格式:platform:id:type (例如 "qq:123456:private" 或 "qq:654321:group")'})]})})()})]}),e.jsxs("div",{className:"rounded-lg border p-4 space-y-4",children:[e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsxs("div",{children:[e.jsx("span",{className:"text-sm font-medium",children:"允许进行表达反思的聊天流"}),e.jsx("p",{className:"text-xs text-muted-foreground mt-1",children:"只有在此列表中的聊天流才会提出问题并跟踪。如果列表为空,则所有聊天流都可以进行表达反思(前提是启用了手动表达优化)"})]}),e.jsxs(_,{onClick:()=>{i({...n,allow_reflect:[...n.allow_reflect||[],"qq::group"]})},size:"sm",variant:"outline",children:[e.jsx(et,{className:"h-4 w-4 mr-1"}),"添加聊天流"]})]}),e.jsxs("div",{className:"space-y-2",children:[(n.allow_reflect||[]).map((y,w)=>{const b=y.split(":"),R=b[0]||"qq",D=b[1]||"",S=b[2]||"group";return e.jsxs("div",{className:"flex items-center gap-2 p-3 rounded-lg bg-muted/50",children:[e.jsxs(Ie,{value:R,onValueChange:P=>{const M=[...n.allow_reflect];M[w]=`${P}:${D}:${S}`,i({...n,allow_reflect:M})},children:[e.jsx($e,{className:"w-24",children:e.jsx(Pe,{})}),e.jsxs(Be,{children:[e.jsx(X,{value:"qq",children:"QQ"}),e.jsx(X,{value:"wx",children:"微信"})]})]}),e.jsx(le,{value:D,onChange:P=>{const M=[...n.allow_reflect];M[w]=`${R}:${P.target.value}:${S}`,i({...n,allow_reflect:M})},placeholder:"ID",className:"flex-1 font-mono text-sm"}),e.jsxs(Ie,{value:S,onValueChange:P=>{const M=[...n.allow_reflect];M[w]=`${R}:${D}:${P}`,i({...n,allow_reflect:M})},children:[e.jsx($e,{className:"w-32",children:e.jsx(Pe,{})}),e.jsxs(Be,{children:[e.jsx(X,{value:"group",children:"群组"}),e.jsx(X,{value:"private",children:"私聊"})]})]}),e.jsx(_,{onClick:()=>{i({...n,allow_reflect:n.allow_reflect.filter((P,M)=>M!==w)})},size:"sm",variant:"ghost",children:e.jsx(ls,{className:"h-4 w-4"})})]},w)}),(!n.allow_reflect||n.allow_reflect.length===0)&&e.jsx("div",{className:"text-center py-4 text-muted-foreground text-sm",children:"列表为空,所有聊天流都可以进行表达反思"})]})]})]})]})]})}),e.jsx("div",{className:"rounded-lg border bg-card p-4 sm:p-6 space-y-6",children:e.jsxs("div",{children:[e.jsxs("div",{className:"flex items-center justify-between mb-4",children:[e.jsxs("div",{children:[e.jsx("h3",{className:"text-lg font-semibold",children:"表达共享组配置"}),e.jsx("p",{className:"text-sm text-muted-foreground mt-1",children:"配置不同聊天流之间如何共享学到的表达方式"})]}),e.jsxs(_,{onClick:f,size:"sm",variant:"outline",children:[e.jsx(et,{className:"h-4 w-4 mr-1"}),"添加共享组"]})]}),e.jsxs("div",{className:"space-y-4",children:[n.expression_groups.map((y,w)=>{const b=n.learning_list.map(R=>R[0]).filter(R=>R!=="");return e.jsxs("div",{className:"rounded-lg border p-4 space-y-3",children:[e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsxs("span",{className:"text-sm font-medium",children:["共享组 ",w+1,y.length===1&&y[0]==="*"&&"(全局共享)"]}),e.jsxs("div",{className:"flex gap-2",children:[e.jsx(_,{onClick:()=>g(w),size:"sm",variant:"outline",children:e.jsx(et,{className:"h-4 w-4"})}),e.jsxs(vs,{children:[e.jsx(wt,{asChild:!0,children:e.jsx(_,{size:"sm",variant:"ghost",children:e.jsx(ls,{className:"h-4 w-4"})})}),e.jsxs(ds,{children:[e.jsxs(us,{children:[e.jsx(xs,{children:"确认删除"}),e.jsxs(hs,{children:["确定要删除共享组 ",w+1," 吗?此操作无法撤销。"]})]}),e.jsxs(ms,{children:[e.jsx(ps,{children:"取消"}),e.jsx(fs,{onClick:()=>p(w),children:"删除"})]})]})]})]})]}),e.jsx("div",{className:"space-y-2",children:y.map((R,D)=>e.jsx(E2,{member:R,groupIndex:w,memberIndex:D,availableChatIds:b,onUpdate:v,onRemove:N},`${w}-${D}`))}),e.jsx("p",{className:"text-xs text-muted-foreground",children:'提示:可以从下拉框选择已配置的聊天流,或手动输入。输入 "*" 启用全局共享'})]},w)}),n.expression_groups.length===0&&e.jsx("div",{className:"text-center py-8 text-muted-foreground",children:'暂无共享组,点击"添加共享组"开始配置'})]})]})})]})});function z2({regex:l,reaction:n,onRegexChange:i,onReactionChange:c}){const[u,x]=d.useState(!1),[h,f]=d.useState(""),[p,g]=d.useState(null),[N,v]=d.useState(""),[y,w]=d.useState({}),[b,R]=d.useState(""),D=d.useRef(null),[S,P]=d.useState("build"),M=L=>L.replace(/\(\?P<([^>]+)>/g,"(?<$1>"),T=(L,J=0)=>{const U=D.current;if(!U)return;const ue=U.selectionStart||0,xe=U.selectionEnd||0,he=l.substring(0,ue)+L+l.substring(xe);i(he),setTimeout(()=>{const ne=ue+L.length+J;U.setSelectionRange(ne,ne),U.focus()},0)};d.useEffect(()=>{if(!l||!h){p!==null&&g(null),Object.keys(y).length>0&&w({}),b!==n&&R(n),N!==""&&v("");return}try{const L=M(l),J=new RegExp(L,"g"),U=h.match(J);g(U),v("");const xe=new RegExp(L).exec(h);if(xe&&xe.groups){w(xe.groups);let he=n;Object.entries(xe.groups).forEach(([ne,ve])=>{he=he.replace(new RegExp(`\\[${ne}\\]`,"g"),ve||"")}),R(he)}else w({}),R(n)}catch(L){v(L.message),g(null),w({}),R(n)}},[l,h,n,p,y,b,N]);const A=()=>{if(!h||!p||p.length===0)return e.jsx("span",{className:"text-muted-foreground",children:h||"请输入测试文本"});try{const L=M(l),J=new RegExp(L,"g");let U=0;const ue=[];let xe;for(;(xe=J.exec(h))!==null;)xe.index>U&&ue.push(e.jsx("span",{children:h.substring(U,xe.index)},`text-${U}`)),ue.push(e.jsx("span",{className:"bg-yellow-200 dark:bg-yellow-900 font-semibold",children:xe[0]},`match-${xe.index}`)),U=xe.index+xe[0].length;return U)",desc:"Python风格命名捕获组",moveCursor:-1},{label:"非捕获组",pattern:"(?:)",desc:"分组但不保存匹配结果",moveCursor:-1}]},{category:"字符类",items:[{label:"字符集",pattern:"[]",desc:"匹配括号内的任意字符",moveCursor:-1},{label:"排除字符",pattern:"[^]",desc:"匹配不在括号内的字符",moveCursor:-1},{label:"范围",pattern:"[a-z]",desc:"匹配a到z的字符"},{label:"中文字符",pattern:"[\\u4e00-\\u9fa5]",desc:"匹配中文汉字"}]},{category:"常用模板",items:[{label:"捕获词语",pattern:"(?P\\S+)",desc:"捕获一个词语"},{label:"捕获句子",pattern:"(?P.+)",desc:"捕获整个句子"},{label:"捕获数字",pattern:"(?P\\d+)",desc:"捕获一个或多个数字"},{label:"可选词语",pattern:"(?:词语1|词语2)",desc:"匹配多个可选项之一"}]}];return e.jsxs(Is,{open:u,onOpenChange:x,children:[e.jsx(Wo,{asChild:!0,children:e.jsxs(_,{variant:"outline",size:"sm",children:[e.jsx(Qm,{className:"h-4 w-4 mr-1"}),"正则编辑器"]})}),e.jsxs(Os,{className:"max-w-[95vw] sm:max-w-[900px] max-h-[90vh]",children:[e.jsxs(Ds,{children:[e.jsx(Rs,{children:"正则表达式编辑器"}),e.jsx(Ks,{className:"text-sm",children:"使用可视化工具构建正则表达式,并实时测试效果"})]}),e.jsx(Ye,{className:"max-h-[calc(90vh-120px)]",children:e.jsxs(ta,{value:S,onValueChange:L=>P(L),className:"w-full",children:[e.jsxs(Xt,{className:"grid w-full grid-cols-2",children:[e.jsx(Je,{value:"build",children:"🔧 构建器"}),e.jsx(Je,{value:"test",children:"🧪 测试器"})]}),e.jsxs(ys,{value:"build",className:"space-y-4 mt-4",children:[e.jsxs("div",{className:"space-y-2",children:[e.jsx(E,{className:"text-sm font-medium",children:"正则表达式"}),e.jsx(le,{ref:D,value:l,onChange:L=>i(L.target.value),className:"font-mono text-sm",placeholder:"点击下方按钮构建正则表达式..."})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsx(E,{className:"text-sm font-medium",children:"Reaction 内容"}),e.jsx(ot,{value:n,onChange:L=>c(L.target.value),placeholder:"使用 [捕获组名] 引用捕获的内容...",rows:3,className:"text-sm"})]}),e.jsxs("div",{className:"space-y-4 border-t pt-4",children:[F.map(L=>e.jsxs("div",{className:"space-y-2",children:[e.jsx("h5",{className:"text-xs font-semibold text-primary",children:L.category}),e.jsx("div",{className:"grid grid-cols-1 sm:grid-cols-2 gap-2",children:L.items.map(J=>e.jsx(_,{variant:"outline",size:"sm",className:"justify-start h-auto py-2 px-3",onClick:()=>T(J.pattern,J.moveCursor||0),children:e.jsxs("div",{className:"flex flex-col items-start w-full",children:[e.jsxs("div",{className:"flex items-center gap-2 w-full",children:[e.jsx("span",{className:"text-xs font-medium",children:J.label}),e.jsx("code",{className:"ml-auto text-xs bg-muted px-1.5 py-0.5 rounded font-mono",children:J.pattern})]}),e.jsx("span",{className:"text-xs text-muted-foreground mt-0.5",children:J.desc})]})},J.label))})]},L.category)),e.jsxs("div",{className:"space-y-2 border-t pt-4",children:[e.jsx("h5",{className:"text-xs font-semibold text-primary",children:"完整示例模板"}),e.jsxs("div",{className:"space-y-2",children:[e.jsx(_,{variant:"outline",size:"sm",className:"w-full justify-start h-auto py-2 px-3",onClick:()=>i("^(?P\\S{1,20})是这样的$"),children:e.jsxs("div",{className:"flex flex-col items-start w-full",children:[e.jsxs("code",{className:"text-xs font-mono bg-muted px-2 py-1 rounded w-full overflow-x-auto",children:["^(?P\\S","{1,20}",")是这样的$"]}),e.jsx("span",{className:"text-xs text-muted-foreground mt-1",children:"匹配「某事物是这样的」并捕获事物名称"})]})}),e.jsx(_,{variant:"outline",size:"sm",className:"w-full justify-start h-auto py-2 px-3",onClick:()=>i("(?:[^,。.\\s]+,\\s*)?我(?:也)?[没沒]要求你\\s*(?P.+?)[.。,,]?$"),children:e.jsxs("div",{className:"flex flex-col items-start w-full",children:[e.jsx("code",{className:"text-xs font-mono bg-muted px-2 py-1 rounded w-full overflow-x-auto",children:"(?:[^,。.\\s]+,\\s*)?我(?:也)?[没沒]要求你\\s*(?P.+?)[.。,,]?$"}),e.jsx("span",{className:"text-xs text-muted-foreground mt-1",children:"匹配「我没要求你做某事」并捕获具体行为"})]})}),e.jsx(_,{variant:"outline",size:"sm",className:"w-full justify-start h-auto py-2 px-3",onClick:()=>i("(?P.+?)(?:是|为什么|怎么)"),children:e.jsxs("div",{className:"flex flex-col items-start w-full",children:[e.jsx("code",{className:"text-xs font-mono bg-muted px-2 py-1 rounded w-full overflow-x-auto",children:"(?P.+?)(?:是|为什么|怎么)"}),e.jsx("span",{className:"text-xs text-muted-foreground mt-1",children:"捕获问题主题词"})]})})]})]})]}),e.jsxs("div",{className:"rounded-md bg-blue-50 dark:bg-blue-950/30 border border-blue-200 dark:border-blue-800 p-3 space-y-1",children:[e.jsx("p",{className:"text-xs font-medium text-blue-900 dark:text-blue-100",children:"💡 使用提示"}),e.jsxs("ul",{className:"text-xs text-blue-700 dark:text-blue-300 space-y-1 list-disc list-inside",children:[e.jsx("li",{children:"点击输入框设置光标位置,然后点击按钮插入模式"}),e.jsxs("li",{children:["命名捕获组格式:",e.jsx("code",{className:"bg-blue-100 dark:bg-blue-900 px-1 rounded",children:"(?P<名称>模式)"})]}),e.jsxs("li",{children:["在 reaction 中使用 ",e.jsx("code",{className:"bg-blue-100 dark:bg-blue-900 px-1 rounded",children:"[名称]"})," 引用捕获的内容"]}),e.jsx("li",{children:"切换到测试器标签页验证正则表达式效果"})]})]})]}),e.jsxs(ys,{value:"test",className:"space-y-4 mt-4",children:[e.jsxs("div",{className:"space-y-2",children:[e.jsx(E,{className:"text-sm font-medium",children:"当前正则表达式"}),e.jsx("div",{className:"rounded-md bg-muted p-3 font-mono text-xs break-all",children:l||"(未设置)"})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsx(E,{htmlFor:"test-text",className:"text-sm font-medium",children:"测试文本"}),e.jsx(ot,{id:"test-text",value:h,onChange:L=>f(L.target.value),placeholder:`在此输入要测试的文本... 例如:打游戏是这样的`,className:"min-h-[100px] text-sm"})]}),N&&e.jsxs("div",{className:"rounded-md bg-destructive/10 border border-destructive/20 p-3",children:[e.jsx("p",{className:"text-sm text-destructive font-medium",children:"正则表达式错误"}),e.jsx("p",{className:"text-xs text-destructive/80 mt-1",children:N})]}),!N&&h&&e.jsxs("div",{className:"space-y-3",children:[e.jsx("div",{className:"flex items-center gap-2",children:p&&p.length>0?e.jsxs(e.Fragment,{children:[e.jsx("div",{className:"h-2 w-2 rounded-full bg-green-500"}),e.jsxs("span",{className:"text-sm font-medium text-green-600 dark:text-green-400",children:["匹配成功 (",p.length," 处)"]})]}):e.jsxs(e.Fragment,{children:[e.jsx("div",{className:"h-2 w-2 rounded-full bg-gray-400"}),e.jsx("span",{className:"text-sm font-medium text-muted-foreground",children:"无匹配"})]})}),e.jsxs("div",{className:"space-y-2",children:[e.jsx(E,{className:"text-sm font-medium",children:"匹配高亮"}),e.jsx(Ye,{className:"h-40 rounded-md bg-muted p-3",children:e.jsx("div",{className:"text-sm break-words",children:A()})})]}),Object.keys(y).length>0&&e.jsxs("div",{className:"space-y-2",children:[e.jsx(E,{className:"text-sm font-medium",children:"命名捕获组"}),e.jsx(Ye,{className:"h-32 rounded-md border p-3",children:e.jsx("div",{className:"space-y-2",children:Object.entries(y).map(([L,J])=>e.jsxs("div",{className:"flex items-start gap-2 text-sm",children:[e.jsxs("span",{className:"font-mono font-semibold text-primary min-w-[80px]",children:["[",L,"]"]}),e.jsx("span",{className:"text-muted-foreground",children:"="}),e.jsx("span",{className:"font-mono bg-muted px-2 py-0.5 rounded",children:J})]},L))})})]}),Object.keys(y).length>0&&n&&e.jsxs("div",{className:"space-y-2",children:[e.jsx(E,{className:"text-sm font-medium",children:"Reaction 替换预览"}),e.jsx(Ye,{className:"h-48 rounded-md bg-blue-50 dark:bg-blue-950/30 border border-blue-200 dark:border-blue-800 p-3",children:e.jsx("div",{className:"text-sm break-words",children:b})}),e.jsx("p",{className:"text-xs text-muted-foreground",children:"reaction 中的 [name] 已被替换为对应的捕获组值"})]})]}),e.jsxs("div",{className:"rounded-md bg-blue-50 dark:bg-blue-950/30 border border-blue-200 dark:border-blue-800 p-3 space-y-1",children:[e.jsx("p",{className:"text-xs font-medium text-blue-900 dark:text-blue-100",children:"💡 测试说明"}),e.jsxs("ul",{className:"text-xs text-blue-700 dark:text-blue-300 space-y-1 list-disc list-inside",children:[e.jsx("li",{children:"匹配的文本会以黄色背景高亮显示"}),e.jsx("li",{children:"命名捕获组的值会显示在下方列表中"}),e.jsx("li",{children:"Reaction 替换预览显示最终生成的反应内容"}),e.jsx("li",{children:"如需修改正则,切换回构建器标签页"})]})]})]})]})})]})]})}const A2=As.memo(function({keywordReactionConfig:n,responsePostProcessConfig:i,chineseTypoConfig:c,responseSplitterConfig:u,onKeywordReactionChange:x,onResponsePostProcessChange:h,onChineseTypoChange:f,onResponseSplitterChange:p}){const g=()=>{x({...n,regex_rules:[...n.regex_rules,{regex:[""],reaction:""}]})},N=T=>{x({...n,regex_rules:n.regex_rules.filter((A,F)=>F!==T)})},v=(T,A,F)=>{const L=[...n.regex_rules];A==="regex"&&typeof F=="string"?L[T]={...L[T],regex:[F]}:A==="reaction"&&typeof F=="string"&&(L[T]={...L[T],reaction:F}),x({...n,regex_rules:L})},y=()=>{x({...n,keyword_rules:[...n.keyword_rules,{keywords:[],reaction:""}]})},w=T=>{x({...n,keyword_rules:n.keyword_rules.filter((A,F)=>F!==T)})},b=(T,A,F)=>{const L=[...n.keyword_rules];typeof F=="string"&&(L[T]={...L[T],reaction:F}),x({...n,keyword_rules:L})},R=T=>{const A=[...n.keyword_rules];A[T]={...A[T],keywords:[...A[T].keywords||[],""]},x({...n,keyword_rules:A})},D=(T,A)=>{const F=[...n.keyword_rules];F[T]={...F[T],keywords:(F[T].keywords||[]).filter((L,J)=>J!==A)},x({...n,keyword_rules:F})},S=(T,A,F)=>{const L=[...n.keyword_rules],J=[...L[T].keywords||[]];J[A]=F,L[T]={...L[T],keywords:J},x({...n,keyword_rules:L})},P=({rule:T})=>{const A=`{ regex = [${(T.regex||[]).map(F=>`"${F}"`).join(", ")}], reaction = "${T.reaction}" }`;return e.jsxs(ol,{children:[e.jsx(dl,{asChild:!0,children:e.jsxs(_,{variant:"outline",size:"sm",children:[e.jsx(ia,{className:"h-4 w-4 mr-1"}),"预览"]})}),e.jsx(Wa,{className:"w-[95vw] sm:w-[500px]",children:e.jsxs("div",{className:"space-y-2",children:[e.jsx("h4",{className:"font-medium text-sm",children:"配置预览"}),e.jsx(Ye,{className:"h-60 rounded-md bg-muted p-3",children:e.jsx("pre",{className:"font-mono text-xs break-all",children:A})}),e.jsx("p",{className:"text-xs text-muted-foreground",children:"这是保存到 bot_config.toml 文件中的格式"})]})})]})},M=({rule:T})=>{const A=`[[keyword_reaction.keyword_rules]] keywords = [${(T.keywords||[]).map(F=>`"${F}"`).join(", ")}] -reaction = "${T.reaction}"`;return e.jsxs(ol,{children:[e.jsx(dl,{asChild:!0,children:e.jsxs(_,{variant:"outline",size:"sm",children:[e.jsx(ia,{className:"h-4 w-4 mr-1"}),"预览"]})}),e.jsx(Wa,{className:"w-[95vw] sm:w-[500px]",children:e.jsxs("div",{className:"space-y-2",children:[e.jsx("h4",{className:"font-medium text-sm",children:"配置预览"}),e.jsx(Ye,{className:"h-60 rounded-md bg-muted p-3",children:e.jsx("pre",{className:"font-mono text-xs whitespace-pre-wrap break-all",children:A})}),e.jsx("p",{className:"text-xs text-muted-foreground",children:"这是保存到 bot_config.toml 文件中的格式"})]})})]})};return e.jsxs("div",{className:"space-y-6",children:[e.jsxs("div",{className:"rounded-lg border bg-card p-4 sm:p-6 space-y-6",children:[e.jsxs("div",{children:[e.jsx("h3",{className:"text-lg font-semibold mb-2",children:"关键词反应配置"}),e.jsx("p",{className:"text-sm text-muted-foreground",children:"配置触发特定反应的关键词和正则表达式规则"})]}),e.jsxs("div",{className:"space-y-4",children:[e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsxs("div",{children:[e.jsx("h4",{className:"text-base font-semibold",children:"正则表达式规则"}),e.jsx("p",{className:"text-xs text-muted-foreground mt-1",children:"使用正则表达式匹配消息内容"})]}),e.jsxs(_,{onClick:g,size:"sm",variant:"outline",children:[e.jsx(et,{className:"h-4 w-4 mr-1"}),"添加正则规则"]})]}),e.jsxs("div",{className:"space-y-3",children:[n.regex_rules.map((T,A)=>e.jsxs("div",{className:"rounded-lg border p-4 space-y-3",children:[e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsxs("span",{className:"text-sm font-medium",children:["正则规则 ",A+1]}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(z2,{regex:T.regex&&T.regex[0]||"",reaction:T.reaction,onRegexChange:F=>v(A,"regex",F),onReactionChange:F=>v(A,"reaction",F)}),e.jsx(P,{rule:T}),e.jsxs(vs,{children:[e.jsx(yt,{asChild:!0,children:e.jsx(_,{size:"sm",variant:"ghost",children:e.jsx(ls,{className:"h-4 w-4"})})}),e.jsxs(ds,{children:[e.jsxs(us,{children:[e.jsx(xs,{children:"确认删除"}),e.jsxs(hs,{children:["确定要删除正则规则 ",A+1," 吗?此操作无法撤销。"]})]}),e.jsxs(ms,{children:[e.jsx(ps,{children:"取消"}),e.jsx(fs,{onClick:()=>N(A),children:"删除"})]})]})]})]})]}),e.jsxs("div",{className:"space-y-3",children:[e.jsxs("div",{className:"grid gap-2",children:[e.jsx(E,{className:"text-xs font-medium",children:"正则表达式(Python 语法)"}),e.jsx(le,{value:T.regex&&T.regex[0]||"",onChange:F=>v(A,"regex",F.target.value),placeholder:"例如:^(?P\\\\S{1,20})是这样的$ (点击正则编辑器按钮可视化构建)",className:"font-mono text-sm"}),e.jsx("p",{className:"text-xs text-muted-foreground",children:'支持命名捕获组 (?Ppattern),可在 reaction 中使用 [name] 引用。点击"正则编辑器"可视化构建和测试!'})]}),e.jsxs("div",{className:"grid gap-2",children:[e.jsx(E,{className:"text-xs font-medium",children:"反应内容"}),e.jsx(ot,{value:T.reaction,onChange:F=>v(A,"reaction",F.target.value),placeholder:`触发后麦麦的反应... -可以使用 [捕获组名] 来引用正则表达式中的内容`,rows:3,className:"text-sm"}),e.jsx("p",{className:"text-xs text-muted-foreground",children:"使用 [捕获组名] 引用正则表达式中的命名捕获组,例如 [n] 会被替换为捕获的内容"})]})]})]},A)),n.regex_rules.length===0&&e.jsx("div",{className:"text-center py-8 text-muted-foreground",children:'暂无正则规则,点击"添加正则规则"开始配置'})]})]}),e.jsxs("div",{className:"space-y-4 border-t pt-6",children:[e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsxs("div",{children:[e.jsx("h4",{className:"text-base font-semibold",children:"关键词规则"}),e.jsx("p",{className:"text-xs text-muted-foreground mt-1",children:"使用关键词列表匹配消息内容"})]}),e.jsxs(_,{onClick:y,size:"sm",variant:"outline",children:[e.jsx(et,{className:"h-4 w-4 mr-1"}),"添加关键词规则"]})]}),e.jsxs("div",{className:"space-y-3",children:[n.keyword_rules.map((T,A)=>e.jsxs("div",{className:"rounded-lg border p-4 space-y-3",children:[e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsxs("span",{className:"text-sm font-medium",children:["关键词规则 ",A+1]}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(M,{rule:T}),e.jsxs(vs,{children:[e.jsx(yt,{asChild:!0,children:e.jsx(_,{size:"sm",variant:"ghost",children:e.jsx(ls,{className:"h-4 w-4"})})}),e.jsxs(ds,{children:[e.jsxs(us,{children:[e.jsx(xs,{children:"确认删除"}),e.jsxs(hs,{children:["确定要删除关键词规则 ",A+1," 吗?此操作无法撤销。"]})]}),e.jsxs(ms,{children:[e.jsx(ps,{children:"取消"}),e.jsx(fs,{onClick:()=>w(A),children:"删除"})]})]})]})]})]}),e.jsxs("div",{className:"space-y-3",children:[e.jsxs("div",{className:"grid gap-2",children:[e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsx(E,{className:"text-xs font-medium",children:"关键词列表"}),e.jsxs(_,{onClick:()=>R(A),size:"sm",variant:"ghost",children:[e.jsx(et,{className:"h-3 w-3 mr-1"}),"添加关键词"]})]}),e.jsxs("div",{className:"space-y-2",children:[(T.keywords||[]).map((F,L)=>e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(le,{value:F,onChange:J=>S(A,L,J.target.value),placeholder:"关键词",className:"flex-1"}),e.jsx(_,{onClick:()=>D(A,L),size:"sm",variant:"ghost",children:e.jsx(ls,{className:"h-4 w-4"})})]},L)),(!T.keywords||T.keywords.length===0)&&e.jsx("p",{className:"text-xs text-muted-foreground text-center py-2",children:'暂无关键词,点击"添加关键词"开始配置'})]})]}),e.jsxs("div",{className:"grid gap-2",children:[e.jsx(E,{className:"text-xs font-medium",children:"反应内容"}),e.jsx(ot,{value:T.reaction,onChange:F=>b(A,"reaction",F.target.value),placeholder:"触发后麦麦的反应...",rows:3,className:"text-sm"})]})]})]},A)),n.keyword_rules.length===0&&e.jsx("div",{className:"text-center py-8 text-muted-foreground",children:'暂无关键词规则,点击"添加关键词规则"开始配置'})]})]})]}),e.jsxs("div",{className:"rounded-lg border bg-card p-4 sm:p-6 space-y-6",children:[e.jsxs("div",{children:[e.jsx("h3",{className:"text-lg font-semibold mb-4",children:"回复后处理配置"}),e.jsxs("div",{className:"flex items-center space-x-2",children:[e.jsx(Fe,{id:"enable_response_post_process",checked:i.enable_response_post_process,onCheckedChange:T=>h({...i,enable_response_post_process:T})}),e.jsx(E,{htmlFor:"enable_response_post_process",className:"cursor-pointer",children:"启用回复后处理"})]}),e.jsx("p",{className:"text-xs text-muted-foreground mt-2",children:"包括错别字生成器和回复分割器"})]}),i.enable_response_post_process&&e.jsxs(e.Fragment,{children:[e.jsx("div",{className:"border-t pt-6 space-y-4",children:e.jsxs("div",{children:[e.jsxs("div",{className:"flex items-center space-x-2 mb-4",children:[e.jsx(Fe,{id:"enable_chinese_typo",checked:c.enable,onCheckedChange:T=>f({...c,enable:T})}),e.jsx(E,{htmlFor:"enable_chinese_typo",className:"cursor-pointer font-semibold",children:"中文错别字生成器"})]}),e.jsx("p",{className:"text-xs text-muted-foreground mb-4",children:"为回复添加随机错别字,让麦麦的回复更自然"}),c.enable&&e.jsxs("div",{className:"grid gap-4 pl-6 border-l-2 border-primary/20",children:[e.jsxs("div",{className:"grid gap-2",children:[e.jsx(E,{htmlFor:"error_rate",className:"text-xs font-medium",children:"单字替换概率"}),e.jsx(le,{id:"error_rate",type:"number",step:"0.001",min:"0",max:"1",value:c.error_rate,onChange:T=>f({...c,error_rate:parseFloat(T.target.value)})})]}),e.jsxs("div",{className:"grid gap-2",children:[e.jsx(E,{htmlFor:"min_freq",className:"text-xs font-medium",children:"最小字频阈值"}),e.jsx(le,{id:"min_freq",type:"number",min:"0",value:c.min_freq,onChange:T=>f({...c,min_freq:parseInt(T.target.value)})})]}),e.jsxs("div",{className:"grid gap-2",children:[e.jsx(E,{htmlFor:"tone_error_rate",className:"text-xs font-medium",children:"声调错误概率"}),e.jsx(le,{id:"tone_error_rate",type:"number",step:"0.01",min:"0",max:"1",value:c.tone_error_rate,onChange:T=>f({...c,tone_error_rate:parseFloat(T.target.value)})})]}),e.jsxs("div",{className:"grid gap-2",children:[e.jsx(E,{htmlFor:"word_replace_rate",className:"text-xs font-medium",children:"整词替换概率"}),e.jsx(le,{id:"word_replace_rate",type:"number",step:"0.001",min:"0",max:"1",value:c.word_replace_rate,onChange:T=>f({...c,word_replace_rate:parseFloat(T.target.value)})})]})]})]})}),e.jsx("div",{className:"border-t pt-6 space-y-4",children:e.jsxs("div",{children:[e.jsxs("div",{className:"flex items-center space-x-2 mb-4",children:[e.jsx(Fe,{id:"enable_response_splitter",checked:u.enable,onCheckedChange:T=>p({...u,enable:T})}),e.jsx(E,{htmlFor:"enable_response_splitter",className:"cursor-pointer font-semibold",children:"回复分割器"})]}),e.jsx("p",{className:"text-xs text-muted-foreground mb-4",children:"控制回复的长度和句子数量"}),u.enable&&e.jsxs("div",{className:"grid gap-4 pl-6 border-l-2 border-primary/20",children:[e.jsxs("div",{className:"grid gap-2",children:[e.jsx(E,{htmlFor:"max_length",className:"text-xs font-medium",children:"最大长度"}),e.jsx(le,{id:"max_length",type:"number",min:"1",value:u.max_length,onChange:T=>p({...u,max_length:parseInt(T.target.value)})}),e.jsx("p",{className:"text-xs text-muted-foreground",children:"回复允许的最大字符数"})]}),e.jsxs("div",{className:"grid gap-2",children:[e.jsx(E,{htmlFor:"max_sentence_num",className:"text-xs font-medium",children:"最大句子数"}),e.jsx(le,{id:"max_sentence_num",type:"number",min:"1",value:u.max_sentence_num,onChange:T=>p({...u,max_sentence_num:parseInt(T.target.value)})}),e.jsx("p",{className:"text-xs text-muted-foreground",children:"回复允许的最大句子数量"})]}),e.jsxs("div",{className:"flex items-center space-x-2",children:[e.jsx(Fe,{id:"enable_kaomoji_protection",checked:u.enable_kaomoji_protection,onCheckedChange:T=>p({...u,enable_kaomoji_protection:T})}),e.jsx(E,{htmlFor:"enable_kaomoji_protection",className:"cursor-pointer",children:"启用颜文字保护"})]}),e.jsxs("div",{className:"flex items-center space-x-2",children:[e.jsx(Fe,{id:"enable_overflow_return_all",checked:u.enable_overflow_return_all,onCheckedChange:T=>p({...u,enable_overflow_return_all:T})}),e.jsx(E,{htmlFor:"enable_overflow_return_all",className:"cursor-pointer",children:"超出时一次性返回全部"})]}),e.jsx("p",{className:"text-xs text-muted-foreground -mt-2",children:"当句子数量超出限制时,合并后一次性返回所有内容"})]})]})})]})]})]})}),O2=As.memo(function({config:n,onChange:i}){const[c,u]=d.useState(""),[x,h]=d.useState(""),[f,p]=d.useState(!1),g=n.allowed_ips?n.allowed_ips.split(",").map(S=>S.trim()).filter(S=>S):[],N=n.trusted_proxies?n.trusted_proxies.split(",").map(S=>S.trim()).filter(S=>S):[],v=()=>{if(!c.trim())return;const S=[...g,c.trim()];i({...n,allowed_ips:S.join(",")}),u("")},y=S=>{const P=g.filter((M,T)=>T!==S);i({...n,allowed_ips:P.join(",")})},w=()=>{if(!x.trim())return;const S=[...N,x.trim()];i({...n,trusted_proxies:S.join(",")}),h("")},b=S=>{const P=N.filter((M,T)=>T!==S);i({...n,trusted_proxies:P.join(",")})},R=S=>{!S&&n.enabled?p(!0):i({...n,enabled:S})},D=()=>{i({...n,enabled:!1}),p(!1)};return e.jsxs("div",{className:"rounded-lg border bg-card p-4 sm:p-6 space-y-4",children:[e.jsx("h3",{className:"text-lg font-semibold",children:"WebUI 服务配置"}),e.jsxs("div",{className:"grid gap-4",children:[e.jsxs("div",{className:"flex items-center space-x-2",children:[e.jsx(Fe,{checked:n.enabled,onCheckedChange:R}),e.jsx(E,{className:"cursor-pointer",children:"启用 WebUI"})]}),n.enabled&&e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"grid gap-2",children:[e.jsx(E,{children:"运行模式"}),e.jsxs(Ie,{value:n.mode,onValueChange:S=>i({...n,mode:S}),children:[e.jsx($e,{children:e.jsx(Pe,{placeholder:"选择运行模式"})}),e.jsxs(Be,{children:[e.jsx(X,{value:"development",children:"开发模式"}),e.jsx(X,{value:"production",children:"生产模式"})]})]}),e.jsx("p",{className:"text-xs text-muted-foreground",children:"注意: WebUI 的监听地址和端口请在 .env 文件中配置 WEBUI_HOST 和 WEBUI_PORT"})]}),e.jsxs("div",{className:"grid gap-2",children:[e.jsx(E,{children:"防爬虫模式"}),e.jsxs(Ie,{value:n.anti_crawler_mode,onValueChange:S=>i({...n,anti_crawler_mode:S}),children:[e.jsx($e,{children:e.jsx(Pe,{placeholder:"选择防爬虫模式"})}),e.jsxs(Be,{children:[e.jsx(X,{value:"false",children:"禁用"}),e.jsx(X,{value:"basic",children:"基础(只记录不阻止)"}),e.jsx(X,{value:"loose",children:"宽松"}),e.jsx(X,{value:"strict",children:"严格"})]})]})]}),e.jsxs("div",{className:"grid gap-2 sm:col-span-2",children:[e.jsx(E,{children:"IP 白名单"}),e.jsxs("div",{className:"flex gap-2",children:[e.jsx(le,{value:c,onChange:S=>u(S.target.value),onKeyDown:S=>{S.key==="Enter"&&(S.preventDefault(),v())},placeholder:"输入IP地址后按回车或点击添加"}),e.jsx(_,{type:"button",size:"sm",onClick:v,disabled:!c.trim(),children:e.jsx(et,{className:"h-4 w-4"})})]}),g.length>0&&e.jsx("div",{className:"flex flex-wrap gap-2 mt-2",children:g.map((S,P)=>e.jsxs(Se,{variant:"secondary",className:"flex items-center gap-1",children:[S,e.jsx("button",{type:"button",onClick:()=>y(P),className:"ml-1 hover:bg-destructive/20 rounded-full p-0.5",children:e.jsx(Ta,{className:"h-3 w-3"})})]},P))}),e.jsx("p",{className:"text-xs text-muted-foreground",children:"支持精确IP、CIDR格式和通配符(如:127.0.0.1、192.168.1.0/24)"})]}),e.jsxs("div",{className:"grid gap-2 sm:col-span-2",children:[e.jsx(E,{children:"信任的代理 IP"}),e.jsxs("div",{className:"flex gap-2",children:[e.jsx(le,{value:x,onChange:S=>h(S.target.value),onKeyDown:S=>{S.key==="Enter"&&(S.preventDefault(),w())},placeholder:"输入代理IP后按回车或点击添加"}),e.jsx(_,{type:"button",size:"sm",onClick:w,disabled:!x.trim(),children:e.jsx(et,{className:"h-4 w-4"})})]}),N.length>0&&e.jsx("div",{className:"flex flex-wrap gap-2 mt-2",children:N.map((S,P)=>e.jsxs(Se,{variant:"secondary",className:"flex items-center gap-1",children:[S,e.jsx("button",{type:"button",onClick:()=>b(P),className:"ml-1 hover:bg-destructive/20 rounded-full p-0.5",children:e.jsx(Ta,{className:"h-3 w-3"})})]},P))}),e.jsx("p",{className:"text-xs text-muted-foreground",children:"只有来自这些IP的X-Forwarded-For头才被信任"})]}),e.jsxs("div",{className:"flex items-center space-x-2",children:[e.jsx(Fe,{checked:n.trust_xff,onCheckedChange:S=>i({...n,trust_xff:S})}),e.jsx(E,{className:"cursor-pointer",children:"启用 X-Forwarded-For 代理解析"})]}),e.jsxs("div",{className:"flex items-center space-x-2",children:[e.jsx(Fe,{checked:n.secure_cookie,onCheckedChange:S=>i({...n,secure_cookie:S})}),e.jsx(E,{className:"cursor-pointer",children:"启用安全 Cookie(仅 HTTPS)"})]})]})]}),e.jsx(vs,{open:f,onOpenChange:p,children:e.jsxs(ds,{children:[e.jsxs(us,{children:[e.jsx(xs,{children:"警告:即将关闭 WebUI"}),e.jsxs(hs,{children:["关闭 WebUI 后,在您下次重启麦麦之前,WebUI 界面将无法访问。",e.jsx("br",{}),e.jsx("br",{}),"您需要通过修改配置文件或命令行重新启用 WebUI 才能再次访问此界面。",e.jsx("br",{}),e.jsx("br",{}),"确定要关闭 WebUI 吗?"]})]}),e.jsxs(ms,{children:[e.jsx(ps,{children:"取消"}),e.jsx(fs,{variant:"destructive",onClick:D,children:"确认关闭"})]})]})})]})}),Nn="/api/webui/config";async function bg(){const n=await(await we(`${Nn}/bot`)).json();if(!n.success)throw new Error("获取配置数据失败");return n.config}async function un(){const n=await(await we(`${Nn}/model`)).json();if(!n.success)throw new Error("获取模型配置数据失败");return n.config}async function yg(l){const i=await(await we(`${Nn}/bot`,{method:"POST",body:JSON.stringify(l)})).json();if(!i.success)throw new Error(i.message||"保存配置失败")}async function D2(){const n=await(await we(`${Nn}/bot/raw`)).json();if(!n.success)throw new Error("获取配置源代码失败");return n.content}async function R2(l){const i=await(await we(`${Nn}/bot/raw`,{method:"POST",body:JSON.stringify({raw_content:l})})).json();if(!i.success)throw new Error(i.message||"保存配置失败")}async function Ji(l){const i=await(await we(`${Nn}/model`,{method:"POST",body:JSON.stringify(l)})).json();if(!i.success)throw new Error(i.message||"保存配置失败")}async function L2(l,n){const c=await(await we(`${Nn}/bot/section/${l}`,{method:"POST",body:JSON.stringify(n)})).json();if(!c.success)throw new Error(c.message||`保存配置节 ${l} 失败`)}async function Bm(l,n){const c=await(await we(`${Nn}/model/section/${l}`,{method:"POST",body:JSON.stringify(n)})).json();if(!c.success)throw new Error(c.message||`保存配置节 ${l} 失败`)}async function U2(l,n="openai",i="/models"){const c=new URLSearchParams({provider_name:l,parser:n,endpoint:i}),u=await we(`/api/webui/models/list?${c}`);if(!u.ok){const h=await u.json().catch(()=>({}));throw new Error(h.detail||`获取模型列表失败 (${u.status})`)}const x=await u.json();if(!x.success)throw new Error("获取模型列表失败");return x.models}async function $2(l){const n=new URLSearchParams({provider_name:l}),i=await we(`/api/webui/models/test-connection-by-name?${n}`,{method:"POST"});if(!i.ok){const c=await i.json().catch(()=>({}));throw new Error(c.detail||`测试连接失败 (${i.status})`)}return await i.json()}const B2=Kr("relative w-full rounded-lg border px-4 py-3 text-sm [&>svg+div]:translate-y-[-3px] [&>svg]:absolute [&>svg]:left-4 [&>svg]:top-4 [&>svg]:text-foreground [&>svg~*]:pl-7",{variants:{variant:{default:"bg-background text-foreground",destructive:"border-destructive/50 text-destructive dark:border-destructive [&>svg]:text-destructive"}},defaultVariants:{variant:"default"}}),at=d.forwardRef(({className:l,variant:n,...i},c)=>e.jsx("div",{ref:c,role:"alert",className:I(B2({variant:n}),l),...i}));at.displayName="Alert";const Hn=d.forwardRef(({className:l,...n},i)=>e.jsx("h5",{ref:i,className:I("mb-1 font-medium leading-none tracking-tight",l),...n}));Hn.displayName="AlertTitle";const lt=d.forwardRef(({className:l,...n},i)=>e.jsx("div",{ref:i,className:I("text-sm [&_p]:leading-relaxed",l),...n}));lt.displayName="AlertDescription";const I2={name:"toml",startState:function(){return{inString:!1,stringType:"",lhs:!0,inArray:0}},token:function(l,n){let i;if(!n.inString&&(i=l.match(/^('''|"""|'|")/))&&(n.stringType=i[0],n.inString=!0),l.sol()&&!n.inString&&n.inArray===0&&(n.lhs=!0),n.inString){for(;n.inString;)if(l.match(n.stringType))n.inString=!1;else if(l.peek()==="\\")l.next(),l.next();else{if(l.eol())break;l.match(/^.[^\\\"\']*/)}return n.lhs?"property":"string"}else{if(n.inArray&&l.peek()==="]")return l.next(),n.inArray--,"bracket";if(n.lhs&&l.peek()==="["&&l.skipTo("]"))return l.next(),l.peek()==="]"&&l.next(),"atom";if(l.peek()==="#")return l.skipToEnd(),"comment";if(l.eatSpace())return null;if(n.lhs&&l.eatWhile(function(c){return c!="="&&c!=" "}))return"property";if(n.lhs&&l.peek()==="=")return l.next(),n.lhs=!1,null;if(!n.lhs&&l.match(/^\d\d\d\d[\d\-\:\.T]*Z/))return"atom";if(!n.lhs&&(l.match("true")||l.match("false")))return"atom";if(!n.lhs&&l.peek()==="[")return n.inArray++,l.next(),"bracket";if(!n.lhs&&l.match(/^\-?\d+(?:\.\d+)?/))return"number";l.eatSpace()||l.next()}return null},languageData:{commentTokens:{line:"#"}}},P2={python:[C_()],json:[T_(),E_()],toml:[k_.define(I2)],text:[]};function gv({value:l,onChange:n,language:i="text",readOnly:c=!1,height:u="400px",minHeight:x,maxHeight:h,placeholder:f,theme:p="dark",className:g=""}){const[N,v]=d.useState(!1);if(d.useEffect(()=>{v(!0)},[]),!N)return e.jsx("div",{className:`rounded-md border bg-muted animate-pulse ${g}`,style:{height:u,minHeight:x,maxHeight:h}});const y=[...P2[i]||[],dg.lineWrapping];return c&&y.push(dg.editable.of(!1)),e.jsx("div",{className:`rounded-md overflow-hidden border ${g}`,children:e.jsx(M_,{value:l,height:u,minHeight:x,maxHeight:h,theme:p==="dark"?z_:void 0,extensions:y,onChange:n,placeholder:f,basicSetup:{lineNumbers:!0,highlightActiveLineGutter:!0,highlightSpecialChars:!0,history:!0,foldGutter:!0,drawSelection:!0,dropCursor:!0,allowMultipleSelections:!0,indentOnInput:!0,syntaxHighlighting:!0,bracketMatching:!0,closeBrackets:!0,autocompletion:!0,rectangularSelection:!0,crosshairCursor:!0,highlightActiveLine:!0,highlightSelectionMatches:!0,closeBracketsKeymap:!0,defaultKeymap:!0,searchKeymap:!0,historyKeymap:!0,foldKeymap:!0,completionKeymap:!0,lintKeymap:!0}})})}function H2({id:l,index:n,itemType:i,itemFields:c,value:u,onChange:x,onRemove:h,disabled:f,canRemove:p,placeholder:g}){const{attributes:N,listeners:v,setNodeRef:y,transform:w,transition:b,isDragging:R}=Wj({id:l,disabled:f}),D={transform:ev.Transform.toString(w),transition:b};return e.jsxs("div",{ref:y,style:D,className:I("flex items-start gap-2 group",R&&"opacity-50 z-50"),children:[e.jsx("button",{type:"button",className:I("flex-shrink-0 p-2 cursor-grab active:cursor-grabbing","text-muted-foreground hover:text-foreground transition-colors","opacity-0 group-hover:opacity-100 focus:opacity-100",f&&"cursor-not-allowed opacity-30"),...N,...v,children:e.jsx(Rj,{className:"h-4 w-4"})}),e.jsx("div",{className:"flex-1 min-w-0",children:i==="object"&&c?e.jsx(F2,{value:u,onChange:x,fields:c,disabled:f}):i==="number"?e.jsx(le,{type:"number",value:u??"",onChange:S=>x(parseFloat(S.target.value)||0),placeholder:g??`第 ${n+1} 项`,disabled:f,className:"font-mono"}):e.jsx(le,{type:"text",value:u??"",onChange:S=>x(S.target.value),placeholder:g??`第 ${n+1} 项`,disabled:f})}),e.jsx(_,{type:"button",variant:"ghost",size:"icon",onClick:h,disabled:f||!p,className:I("flex-shrink-0 text-muted-foreground hover:text-destructive","opacity-0 group-hover:opacity-100 focus:opacity-100 transition-opacity"),children:e.jsx(ls,{className:"h-4 w-4"})})]})}function F2({value:l,onChange:n,fields:i,disabled:c}){const u=d.useCallback((h,f)=>{n({...l,[h]:f})},[l,n]),x=(h,f)=>{const p=l?.[h];if(f.type==="boolean"||f.type==="switch")return e.jsxs("div",{className:"flex items-center justify-between py-1",children:[e.jsx(E,{className:"text-xs text-muted-foreground",children:f.label??h}),e.jsx(Fe,{checked:!!(p??f.default),onCheckedChange:g=>u(h,g),disabled:c})]});if(f.type==="slider"||f.type==="number"&&f.min!=null&&f.max!=null){const g=p??f.default??f.min??0;return e.jsxs("div",{className:"space-y-1",children:[e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsx(E,{className:"text-xs text-muted-foreground",children:f.label??h}),e.jsx("span",{className:"text-xs text-muted-foreground",children:g})]}),e.jsx(Va,{value:[g],onValueChange:N=>u(h,N[0]),min:f.min??0,max:f.max??100,step:f.step??1,disabled:c,className:"py-1"})]})}return f.type==="select"&&f.choices?e.jsxs("div",{className:"space-y-1",children:[e.jsx(E,{className:"text-xs text-muted-foreground",children:f.label??h}),e.jsxs(Ie,{value:String(p??f.default??""),onValueChange:g=>u(h,g),disabled:c,children:[e.jsx($e,{className:"h-8 text-sm",children:e.jsx(Pe,{placeholder:f.placeholder??"请选择"})}),e.jsx(Be,{children:f.choices.map(g=>e.jsx(X,{value:String(g),children:String(g)},String(g)))})]})]}):f.type==="number"?e.jsxs("div",{className:"space-y-1",children:[e.jsx(E,{className:"text-xs text-muted-foreground",children:f.label??h}),e.jsx(le,{type:"number",value:p??f.default??"",onChange:g=>u(h,parseFloat(g.target.value)||0),placeholder:f.placeholder,disabled:c,className:"h-8 text-sm"})]}):e.jsxs("div",{className:"space-y-1",children:[e.jsx(E,{className:"text-xs text-muted-foreground",children:f.label??h}),e.jsx(le,{type:"text",value:p??f.default??"",onChange:g=>u(h,g.target.value),placeholder:f.placeholder,disabled:c,className:"h-8 text-sm"})]})};return e.jsx(Ce,{className:"p-3 space-y-2 bg-muted/30",children:Object.entries(i).map(([h,f])=>e.jsx("div",{children:x(h,f)},h))})}function G2({value:l,onChange:n,itemType:i="string",itemFields:c,minItems:u,maxItems:x,disabled:h,placeholder:f}){const p=d.useMemo(()=>Array.isArray(l)?l:typeof l=="string"&&l.trim()?l.split(",").map(M=>M.trim()):[],[l]),[g]=d.useState(()=>new Map),N=d.useCallback(M=>(g.has(M)||g.set(M,`item-${Date.now()}-${M}-${Math.random().toString(36).slice(2)}`),g.get(M)),[g]),v=d.useMemo(()=>{const M=[];for(let T=0;T{const{active:T,over:A}=M;if(A&&T.id!==A.id){const F=v.indexOf(T.id),L=v.indexOf(A.id),J=Yj(p,F,L);n(J)}},[p,v,n]),b=d.useCallback(()=>{if(x!=null&&p.length>=x)return;let M;i==="object"&&c?M=Object.fromEntries(Object.entries(c).map(([T,A])=>[T,A.default??""])):i==="number"?M=0:M="",n([...p,M])},[p,x,i,c,n]),R=d.useCallback((M,T)=>{const A=[...p];A[M]=T,n(A)},[p,n]),D=d.useCallback(M=>{if(u!=null&&p.length<=u)return;const T=p.filter((A,F)=>F!==M);g.delete(M),n(T)},[p,u,g,n]),S=x==null||p.lengthu;return e.jsxs("div",{className:"space-y-2",children:[p.length===0?e.jsxs("div",{className:"flex items-center gap-2 text-sm text-muted-foreground py-4 justify-center border border-dashed rounded-md",children:[e.jsx(wt,{className:"h-4 w-4"}),e.jsx("span",{children:"暂无数据,点击下方按钮添加"})]}):e.jsx(Jj,{sensors:y,collisionDetection:Xj,onDragEnd:w,children:e.jsx(Zj,{items:v,strategy:A_,children:e.jsx("div",{className:"space-y-2",children:p.map((M,T)=>e.jsx(H2,{id:v[T],index:T,itemType:i,itemFields:c,value:M,onChange:A=>R(T,A),onRemove:()=>D(T),disabled:h,canRemove:P,placeholder:f},v[T]))})})}),e.jsxs(_,{type:"button",variant:"outline",size:"sm",onClick:b,disabled:h||!S,className:"w-full",children:[e.jsx(et,{className:"h-4 w-4 mr-1"}),"添加项目",x!==void 0&&e.jsxs("span",{className:"ml-2 text-xs text-muted-foreground",children:["(",p.length,"/",x,")"]})]}),(u!=null||x!=null)&&(u!==null||x!==null)&&e.jsx("p",{className:"text-xs text-muted-foreground text-center",children:u!=null&&x!=null?`允许 ${u} - ${x} 项`:u!=null?`至少 ${u} 项`:`最多 ${x} 项`})]})}function tx({content:l,className:n=""}){return e.jsx("div",{className:`prose prose-sm dark:prose-invert max-w-none ${n}`,children:e.jsx($_,{remarkPlugins:[I_,P_],rehypePlugins:[B_],components:{code({inline:i,className:c,children:u,...x}){return i?e.jsx("code",{className:"bg-muted px-1.5 py-0.5 rounded text-sm font-mono",...x,children:u}):e.jsx("code",{className:`${c} block bg-muted p-4 rounded-lg overflow-x-auto`,...x,children:u})},table({children:i,...c}){return e.jsx("div",{className:"overflow-x-auto",children:e.jsx("table",{className:"border-collapse border border-border",...c,children:i})})},th({children:i,...c}){return e.jsx("th",{className:"border border-border bg-muted px-4 py-2 text-left font-semibold",...c,children:i})},td({children:i,...c}){return e.jsx("td",{className:"border border-border px-4 py-2",...c,children:i})},a({children:i,...c}){return e.jsx("a",{className:"text-primary hover:underline",target:"_blank",rel:"noopener noreferrer",...c,children:i})},blockquote({children:i,...c}){return e.jsx("blockquote",{className:"border-l-4 border-primary pl-4 italic text-muted-foreground",...c,children:i})},h1({children:i,...c}){return e.jsx("h1",{className:"text-3xl font-bold mt-6 mb-4",...c,children:i})},h2({children:i,...c}){return e.jsx("h2",{className:"text-2xl font-bold mt-5 mb-3",...c,children:i})},h3({children:i,...c}){return e.jsx("h3",{className:"text-xl font-bold mt-4 mb-2",...c,children:i})},h4({children:i,...c}){return e.jsx("h4",{className:"text-lg font-semibold mt-3 mb-2",...c,children:i})},ul({children:i,...c}){return e.jsx("ul",{className:"list-disc list-inside space-y-1 my-2",...c,children:i})},ol({children:i,...c}){return e.jsx("ol",{className:"list-decimal list-inside space-y-1 my-2",...c,children:i})},p({children:i,...c}){return e.jsx("p",{className:"my-2 leading-relaxed",...c,children:i})},hr({...i}){return e.jsx("hr",{className:"my-4 border-border",...i})}},children:l})})}function V2(l,n,i,c={}){const{debounceMs:u=2e3,onSaveSuccess:x,onSaveError:h}=c,f=d.useRef(null),p=d.useCallback(async(y,w)=>{try{n(!0),await L2(y,w),i(!1),x?.()}catch(b){console.error(`自动保存 ${y} 失败:`,b),i(!0),h?.(b instanceof Error?b:new Error(String(b)))}finally{n(!1)}},[n,i,x,h]),g=d.useCallback((y,w)=>{l||(i(!0),f.current&&clearTimeout(f.current),f.current=setTimeout(()=>{p(y,w)},u))},[l,i,p,u]),N=d.useCallback(async(y,w)=>{f.current&&(clearTimeout(f.current),f.current=null),await p(y,w)},[p]),v=d.useCallback(()=>{f.current&&(clearTimeout(f.current),f.current=null)},[]);return d.useEffect(()=>()=>{f.current&&clearTimeout(f.current)},[]),{triggerAutoSave:g,saveNow:N,cancelPendingAutoSave:v}}function Lt(l,n,i,c){d.useEffect(()=>{l&&!i&&c(n,l)},[l])}const q2=500;function K2(){return e.jsx(Yn,{children:e.jsx(Q2,{})})}function Q2(){const[l,n]=d.useState(!0),[i,c]=d.useState(!1),[u,x]=d.useState(!1),[h,f]=d.useState(!1),[p,g]=d.useState("visual"),[N,v]=d.useState(""),[y,w]=d.useState(!1),{toast:b}=Zs(),{triggerRestart:R,isRestarting:D}=vn(),[S,P]=d.useState(null),[M,T]=d.useState(null),[A,F]=d.useState(null),[L,J]=d.useState(null),[U,ue]=d.useState(null),[xe,he]=d.useState(null),[ne,ve]=d.useState(null),[je,z]=d.useState(null),[V,B]=d.useState(null),[oe,K]=d.useState(null),[_e,pe]=d.useState(null),[ke,O]=d.useState(null),[k,H]=d.useState(null),[se,Ee]=d.useState(null),[Z,Oe]=d.useState(null),[ns,Q]=d.useState(null),[ee,Ue]=d.useState(null),[ie,Te]=d.useState(null),[de,Me]=d.useState(null),rs=d.useRef(!0),Ut=d.useRef({}),aa=d.useCallback(ze=>{Ut.current=ze,P(ze.bot),T(ze.personality);const Ns=ze.chat;Ns.talk_value_rules||(Ns.talk_value_rules=[]),F(Ns),J(ze.expression),ue(ze.emoji),he(ze.memory),ve(ze.tool),z(ze.voice),B(ze.dream),K(ze.lpmm_knowledge),pe(ze.keyword_reaction),O(ze.response_post_process),H(ze.chinese_typo),Ee(ze.response_splitter),Oe(ze.log),Q(ze.debug),Ue(ze.maim_message),Te(ze.telemetry),Me(ze.webui)},[]),Ka=d.useCallback(()=>({...Ut.current,bot:S,personality:M,chat:A,expression:L,emoji:U,memory:xe,tool:ne,voice:je,dream:V,lpmm_knowledge:oe,keyword_reaction:_e,response_post_process:ke,chinese_typo:k,response_splitter:se,log:Z,debug:ns,maim_message:ee,telemetry:ie,webui:de}),[S,M,A,L,U,xe,ne,je,V,oe,_e,ke,k,se,Z,ns,ee,ie,de]),Ft=d.useCallback(async()=>{try{const Ns=(await D2()).replace(/"([^"]*)"/g,(as,es)=>`"${es.replace(/\\n/g,` -`).replace(/\\t/g," ").replace(/\\r/g,"\r").replace(/\\"/g,'"').replace(/\\\\/g,"\\")}"`);v(Ns),w(!1)}catch(ze){b({variant:"destructive",title:"加载失败",description:ze instanceof Error?ze.message:"加载源代码失败"})}},[b]),mt=d.useCallback(async()=>{try{n(!0);const ze=await bg();aa(ze),f(!1),rs.current=!1,await Ft()}catch(ze){console.error("加载配置失败:",ze),b({title:"加载失败",description:"无法加载配置文件",variant:"destructive"})}finally{n(!1)}},[b,Ft,aa]);d.useEffect(()=>{mt()},[mt]);const{triggerAutoSave:q,cancelPendingAutoSave:Ve}=V2(rs.current,x,f);Lt(S,"bot",rs.current,q),Lt(M,"personality",rs.current,q),Lt(A,"chat",rs.current,q),Lt(L,"expression",rs.current,q),Lt(U,"emoji",rs.current,q),Lt(xe,"memory",rs.current,q),Lt(ne,"tool",rs.current,q),Lt(je,"voice",rs.current,q),Lt(V,"dream",rs.current,q),Lt(oe,"lpmm_knowledge",rs.current,q),Lt(_e,"keyword_reaction",rs.current,q),Lt(ke,"response_post_process",rs.current,q),Lt(k,"chinese_typo",rs.current,q),Lt(se,"response_splitter",rs.current,q),Lt(Z,"log",rs.current,q),Lt(ns,"debug",rs.current,q),Lt(ee,"maim_message",rs.current,q),Lt(ie,"telemetry",rs.current,q),Lt(de,"webui",rs.current,q);const Ke=async()=>{try{c(!0);const ze=N.replace(/"([^"]*)"/g,(Ns,as)=>`"${as.replace(/\\/g,"\\\\").replace(/"/g,'\\"').replace(/\n/g,"\\n").replace(/\t/g,"\\t").replace(/\r/g,"\\r")}"`);await R2(ze),f(!1),w(!1),b({title:"保存成功",description:"配置已保存"}),await mt()}catch(ze){w(!0),b({variant:"destructive",title:"保存失败",description:ze instanceof Error?ze.message:"保存配置失败"})}finally{c(!1)}},We=async ze=>{if(h){b({variant:"destructive",title:"切换失败",description:"请先保存当前更改"});return}if(g(ze),ze==="source")await Ft();else try{const Ns=await bg();aa(Ns),f(!1)}catch(Ns){console.error("加载配置失败:",Ns),b({title:"加载失败",description:"无法加载配置文件",variant:"destructive"})}},Ls=async()=>{try{c(!0),Ve(),await yg(Ka()),f(!1),b({title:"保存成功",description:"麦麦主程序配置已保存"})}catch(ze){console.error("保存配置失败:",ze),b({title:"保存失败",description:ze.message,variant:"destructive"})}finally{c(!1)}},ts=async()=>{await R()},Cs=async()=>{try{c(!0),Ve(),await yg(Ka()),f(!1),b({title:"保存成功",description:"配置已保存,即将重启麦麦..."}),await new Promise(ze=>setTimeout(ze,q2)),await ts()}catch(ze){console.error("保存失败:",ze),b({title:"保存失败",description:ze.message,variant:"destructive"})}finally{c(!1)}};return l?e.jsx(Ye,{className:"h-full",children:e.jsx("div",{className:"space-y-4 sm:space-y-6 p-4 sm:p-6",children:e.jsx("div",{className:"flex items-center justify-center h-64",children:e.jsx("p",{className:"text-muted-foreground",children:"加载中..."})})})}):e.jsx(Ye,{className:"h-full",children:e.jsxs("div",{className:"space-y-4 sm:space-y-6 p-4 sm:p-6",children:[e.jsxs("div",{className:"flex flex-col gap-3 sm:gap-4",children:[e.jsxs("div",{className:"flex flex-col sm:flex-row sm:items-center sm:justify-between gap-3",children:[e.jsxs("div",{className:"min-w-0",children:[e.jsx("h1",{className:"text-xl sm:text-2xl md:text-3xl font-bold",children:"麦麦主程序配置"}),e.jsx("p",{className:"text-muted-foreground mt-1 text-xs sm:text-sm",children:"管理麦麦的核心功能和行为设置"})]}),e.jsxs("div",{className:"flex gap-2 flex-shrink-0",children:[e.jsxs(_,{onClick:p==="visual"?Ls:Ke,disabled:i||u||!h||D,size:"sm",variant:"outline",className:"w-20 sm:w-24",children:[e.jsx(oc,{className:"h-4 w-4 flex-shrink-0",strokeWidth:2,fill:"none"}),e.jsx("span",{className:"ml-1 truncate text-xs sm:text-sm",children:i?"保存中":u?"自动":h?"保存":"已保存"})]}),e.jsxs(vs,{children:[e.jsx(yt,{asChild:!0,children:e.jsxs(_,{disabled:i||u||D,size:"sm",className:"w-20 sm:w-28",children:[e.jsx(cc,{className:"h-4 w-4 flex-shrink-0"}),e.jsx("span",{className:"ml-1 truncate text-xs sm:text-sm",children:D?"重启中":h?"保存重启":"重启"})]})}),e.jsxs(ds,{children:[e.jsxs(us,{children:[e.jsx(xs,{children:"确认重启麦麦?"}),e.jsx(hs,{asChild:!0,children:e.jsx("div",{children:e.jsx("p",{children:h?"当前有未保存的配置更改。点击确认将先保存配置,然后重启麦麦使新配置生效。重启过程中麦麦将暂时离线。":"即将重启麦麦主程序。重启过程中麦麦将暂时离线,配置将在重启后生效。"})})})]}),e.jsxs(ms,{children:[e.jsx(ps,{children:"取消"}),e.jsx(fs,{onClick:h?Cs:ts,children:h?"保存并重启":"确认重启"})]})]})]})]})]}),e.jsx("div",{className:"flex",children:e.jsx(ta,{value:p,onValueChange:ze=>We(ze),className:"w-full",children:e.jsxs(Xt,{className:"h-8 sm:h-9 w-full grid grid-cols-2",children:[e.jsxs(Je,{value:"visual",className:"text-xs sm:text-sm",children:[e.jsx(Lj,{className:"h-3 w-3 sm:h-4 sm:w-4 mr-1"}),"可视化编辑"]}),e.jsxs(Je,{value:"source",className:"text-xs sm:text-sm",children:[e.jsx(Uj,{className:"h-3 w-3 sm:h-4 sm:w-4 mr-1"}),"源代码编辑"]})]})})})]}),e.jsxs(at,{children:[e.jsx(Ht,{className:"h-4 w-4"}),e.jsxs(lt,{children:["配置更新后需要",e.jsx("strong",{children:"重启麦麦"}),'才能生效。你可以点击右上角的"保存并重启"按钮一键完成保存和重启。']})]}),p==="source"&&e.jsxs("div",{className:"space-y-4",children:[e.jsxs(at,{children:[e.jsx(Ht,{className:"h-4 w-4"}),e.jsxs(lt,{children:[e.jsx("strong",{children:"源代码模式(高级功能):"}),"直接编辑 TOML 配置文件。此功能仅适用于熟悉 TOML 语法的高级用户。保存时会在后端验证格式,只有格式完全正确才能保存。",y&&e.jsx("span",{className:"text-destructive font-semibold ml-2",children:"⚠️ 上次保存失败,请检查 TOML 格式"})]})]}),e.jsx(gv,{value:N,onChange:ze=>{v(ze),f(!0),y&&w(!1)},language:"toml",theme:"dark",height:"calc(100vh - 280px)",minHeight:"500px",placeholder:"TOML 配置内容"})]}),p==="visual"&&e.jsx(e.Fragment,{children:e.jsxs(ta,{defaultValue:"bot",className:"w-full",children:[e.jsxs(Xt,{className:"flex flex-wrap h-auto gap-1 p-1 sm:grid sm:grid-cols-5 lg:grid-cols-10",children:[e.jsx(Je,{value:"bot",className:"text-xs px-2 py-1.5 sm:px-3 sm:py-2 data-[state=active]:shadow-sm",children:"基本信息"}),e.jsx(Je,{value:"personality",className:"text-xs px-2 py-1.5 sm:px-3 sm:py-2 data-[state=active]:shadow-sm",children:"人格"}),e.jsx(Je,{value:"chat",className:"text-xs px-2 py-1.5 sm:px-3 sm:py-2 data-[state=active]:shadow-sm",children:"聊天"}),e.jsx(Je,{value:"expression",className:"text-xs px-2 py-1.5 sm:px-3 sm:py-2 data-[state=active]:shadow-sm",children:"表达"}),e.jsx(Je,{value:"features",className:"text-xs px-2 py-1.5 sm:px-3 sm:py-2 data-[state=active]:shadow-sm",children:"功能"}),e.jsx(Je,{value:"processing",className:"text-xs px-2 py-1.5 sm:px-3 sm:py-2 data-[state=active]:shadow-sm",children:"处理"}),e.jsx(Je,{value:"dream",className:"text-xs px-2 py-1.5 sm:px-3 sm:py-2 data-[state=active]:shadow-sm",children:"做梦"}),e.jsx(Je,{value:"lpmm",className:"text-xs px-2 py-1.5 sm:px-3 sm:py-2 data-[state=active]:shadow-sm",children:"知识库"}),e.jsx(Je,{value:"webui",className:"text-xs px-2 py-1.5 sm:px-3 sm:py-2 data-[state=active]:shadow-sm",children:"WebUI"}),e.jsx(Je,{value:"other",className:"text-xs px-2 py-1.5 sm:px-3 sm:py-2 data-[state=active]:shadow-sm",children:"其他"})]}),e.jsx(ys,{value:"bot",className:"space-y-4",children:S&&e.jsx(f2,{config:S,onChange:P})}),e.jsx(ys,{value:"personality",className:"space-y-4",children:M&&e.jsx(p2,{config:M,onChange:T})}),e.jsx(ys,{value:"chat",className:"space-y-4",children:A&&e.jsx(b2,{config:A,onChange:F})}),e.jsx(ys,{value:"expression",className:"space-y-4",children:L&&e.jsx(M2,{config:L,onChange:J})}),e.jsx(ys,{value:"features",className:"space-y-4",children:U&&xe&&ne&&je&&e.jsx(T2,{emojiConfig:U,memoryConfig:xe,toolConfig:ne,voiceConfig:je,onEmojiChange:ue,onMemoryChange:he,onToolChange:ve,onVoiceChange:z})}),e.jsx(ys,{value:"processing",className:"space-y-4",children:_e&&ke&&k&&se&&e.jsx(A2,{keywordReactionConfig:_e,responsePostProcessConfig:ke,chineseTypoConfig:k,responseSplitterConfig:se,onKeywordReactionChange:pe,onResponsePostProcessChange:O,onChineseTypoChange:H,onResponseSplitterChange:Ee})}),e.jsx(ys,{value:"dream",className:"space-y-4",children:V&&e.jsx(y2,{config:V,onChange:B})}),e.jsx(ys,{value:"lpmm",className:"space-y-4",children:oe&&e.jsx(w2,{config:oe,onChange:K})}),e.jsx(ys,{value:"webui",className:"space-y-4",children:de&&e.jsx(O2,{config:de,onChange:Me})}),e.jsxs(ys,{value:"other",className:"space-y-4",children:[Z&&e.jsx(_2,{config:Z,onChange:Oe}),ns&&e.jsx(S2,{config:ns,onChange:Q}),ee&&e.jsx(k2,{config:ee,onChange:Ue}),ie&&e.jsx(C2,{config:ie,onChange:Te})]})]})}),e.jsx(Jn,{})]})})}const Rl=d.forwardRef(({className:l,...n},i)=>e.jsx("div",{className:"relative w-full overflow-auto",children:e.jsx("table",{ref:i,className:I("w-full caption-bottom text-sm",l),...n})}));Rl.displayName="Table";const Ll=d.forwardRef(({className:l,...n},i)=>e.jsx("thead",{ref:i,className:I("[&_tr]:border-b",l),...n}));Ll.displayName="TableHeader";const Ul=d.forwardRef(({className:l,...n},i)=>e.jsx("tbody",{ref:i,className:I("[&_tr:last-child]:border-0",l),...n}));Ul.displayName="TableBody";const Y2=d.forwardRef(({className:l,...n},i)=>e.jsx("tfoot",{ref:i,className:I("border-t bg-muted/50 font-medium [&>tr]:last:border-b-0",l),...n}));Y2.displayName="TableFooter";const ut=d.forwardRef(({className:l,...n},i)=>e.jsx("tr",{ref:i,className:I("border-b transition-colors hover:bg-muted/50 data-[state=selected]:bg-muted",l),...n}));ut.displayName="TableRow";const Ze=d.forwardRef(({className:l,...n},i)=>e.jsx("th",{ref:i,className:I("h-12 px-4 text-left align-middle font-medium text-muted-foreground [&:has([role=checkbox])]:pr-0 [&>[role=checkbox]]:translate-y-[2px]",l),...n}));Ze.displayName="TableHead";const qe=d.forwardRef(({className:l,...n},i)=>e.jsx("td",{ref:i,className:I("px-4 py-3 align-middle [&:has([role=checkbox])]:pr-0 [&>[role=checkbox]]:translate-y-[2px]",l),...n}));qe.displayName="TableCell";const J2=d.forwardRef(({className:l,...n},i)=>e.jsx("caption",{ref:i,className:I("mt-4 text-sm text-muted-foreground",l),...n}));J2.displayName="TableCaption";const sd=d.forwardRef(({className:l,...n},i)=>e.jsx(ga,{ref:i,className:I("flex h-full w-full flex-col overflow-hidden rounded-md bg-popover text-popover-foreground",l),...n}));sd.displayName=ga.displayName;const td=d.forwardRef(({className:l,...n},i)=>e.jsxs("div",{className:"flex items-center border-b px-3","cmdk-input-wrapper":"",children:[e.jsx(Ct,{className:"mr-2 h-4 w-4 shrink-0 opacity-50"}),e.jsx(ga.Input,{ref:i,className:I("flex h-10 w-full rounded-md bg-transparent py-3 text-sm outline-none placeholder:text-muted-foreground disabled:cursor-not-allowed disabled:opacity-50",l),...n})]}));td.displayName=ga.Input.displayName;const ad=d.forwardRef(({className:l,...n},i)=>e.jsx(ga.List,{ref:i,className:I("max-h-[300px] overflow-y-auto overflow-x-hidden",l),...n}));ad.displayName=ga.List.displayName;const ld=d.forwardRef((l,n)=>e.jsx(ga.Empty,{ref:n,className:"py-6 text-center text-sm",...l}));ld.displayName=ga.Empty.displayName;const ac=d.forwardRef(({className:l,...n},i)=>e.jsx(ga.Group,{ref:i,className:I("overflow-hidden p-1 text-foreground [&_[cmdk-group-heading]]:px-2 [&_[cmdk-group-heading]]:py-1.5 [&_[cmdk-group-heading]]:text-xs [&_[cmdk-group-heading]]:font-medium [&_[cmdk-group-heading]]:text-muted-foreground",l),...n}));ac.displayName=ga.Group.displayName;const X2=d.forwardRef(({className:l,...n},i)=>e.jsx(ga.Separator,{ref:i,className:I("-mx-1 h-px bg-border",l),...n}));X2.displayName=ga.Separator.displayName;const lc=d.forwardRef(({className:l,...n},i)=>e.jsx(ga.Item,{ref:i,className:I("relative flex cursor-default gap-2 select-none items-center rounded-sm px-2 py-1.5 text-sm outline-none data-[disabled=true]:pointer-events-none data-[selected=true]:bg-accent data-[selected=true]:text-accent-foreground data-[disabled=true]:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0",l),...n}));lc.displayName=ga.Item.displayName;const jv=d.createContext(null),vv="maibot-completed-tours";function Z2(){try{const l=localStorage.getItem(vv);return l?new Set(JSON.parse(l)):new Set}catch{return new Set}}function wg(l){localStorage.setItem(vv,JSON.stringify([...l]))}function W2({children:l}){const[n,i]=d.useState({activeTourId:null,stepIndex:0,isRunning:!1}),[c]=d.useState(()=>new Map),[u,x]=d.useState(Z2),[,h]=d.useState(0),f=d.useCallback((M,T)=>{c.set(M,T),h(A=>A+1)},[c]),p=d.useCallback(M=>{c.delete(M),i(T=>T.activeTourId===M?{...T,activeTourId:null,isRunning:!1,stepIndex:0}:T)},[c]),g=d.useCallback((M,T=0)=>{c.has(M)&&i({activeTourId:M,stepIndex:T,isRunning:!0})},[c]),N=d.useCallback(()=>{i(M=>({...M,isRunning:!1}))},[]),v=d.useCallback(M=>{i(T=>({...T,stepIndex:M}))},[]),y=d.useCallback(()=>{i(M=>({...M,stepIndex:M.stepIndex+1}))},[]),w=d.useCallback(()=>{i(M=>({...M,stepIndex:Math.max(0,M.stepIndex-1)}))},[]),b=d.useCallback(()=>n.activeTourId?c.get(n.activeTourId)||[]:[],[n.activeTourId,c]),R=d.useCallback(M=>{x(T=>{const A=new Set(T);return A.add(M),wg(A),A})},[]),D=d.useCallback(M=>{const{action:T,index:A,status:F,type:L}=M,J=["finished","skipped"];if(T==="close"){i(U=>({...U,isRunning:!1,stepIndex:0}));return}J.includes(F)?i(U=>(F==="finished"&&U.activeTourId&&setTimeout(()=>R(U.activeTourId),0),{...U,isRunning:!1,stepIndex:0})):L==="step:after"&&(T==="next"?i(U=>({...U,stepIndex:A+1})):T==="prev"&&i(U=>({...U,stepIndex:A-1})))},[R]),S=d.useCallback(M=>u.has(M),[u]),P=d.useCallback(M=>{x(T=>{const A=new Set(T);return A.delete(M),wg(A),A})},[]);return e.jsx(jv.Provider,{value:{state:n,tours:c,registerTour:f,unregisterTour:p,startTour:g,stopTour:N,goToStep:v,nextStep:y,prevStep:w,getCurrentSteps:b,handleJoyrideCallback:D,isTourCompleted:S,markTourCompleted:R,resetTourCompleted:P},children:l})}function ax(){const l=d.useContext(jv);if(!l)throw new Error("useTour must be used within a TourProvider");return l}const eS={options:{zIndex:1e4,primaryColor:"hsl(var(--primary))",textColor:"hsl(var(--foreground))",backgroundColor:"hsl(var(--background))",arrowColor:"hsl(var(--background))",overlayColor:"rgba(0, 0, 0, 0.5)"},tooltip:{borderRadius:"var(--radius)",padding:"1rem"},tooltipContainer:{textAlign:"left"},tooltipTitle:{fontSize:"1rem",fontWeight:600,marginBottom:"0.5rem"},tooltipContent:{fontSize:"0.875rem",padding:"0.5rem 0"},buttonNext:{backgroundColor:"hsl(var(--primary))",color:"hsl(var(--primary-foreground))",borderRadius:"calc(var(--radius) - 2px)",fontSize:"0.875rem",padding:"0.5rem 1rem"},buttonBack:{color:"hsl(var(--muted-foreground))",fontSize:"0.875rem",marginRight:"0.5rem"},buttonSkip:{color:"hsl(var(--muted-foreground))",fontSize:"0.875rem"},buttonClose:{color:"hsl(var(--muted-foreground))"},spotlight:{borderRadius:"var(--radius)"}},sS={back:"上一步",close:"关闭",last:"完成",next:"下一步",nextLabelWithProgress:"下一步 ({step}/{steps})",open:"打开对话框",skip:"跳过"};function tS(){const{state:l,getCurrentSteps:n,handleJoyrideCallback:i}=ax(),c=n(),[u,x]=d.useState(!1),h=d.useRef(l.stepIndex),f=d.useRef(null);d.useEffect(()=>{h.current!==l.stepIndex&&(x(!1),h.current=l.stepIndex)},[l.stepIndex]),d.useEffect(()=>{if(!l.isRunning||c.length===0){x(!1);return}const v=c[l.stepIndex];if(!v){x(!1);return}const y=v.target;if(y==="body"){x(!0);return}x(!1);const w=setTimeout(()=>{const b=()=>{const P=document.querySelector(y);if(P){const M=P.getBoundingClientRect();if(M.width>0&&M.height>0)return!0}return!1};if(b()){setTimeout(()=>x(!0),100);return}const R=setInterval(()=>{b()&&(clearInterval(R),setTimeout(()=>x(!0),100))},100),D=setTimeout(()=>{clearInterval(R),x(!0)},5e3),S=()=>{clearInterval(R),clearTimeout(D)};f.current=S},150);return()=>{clearTimeout(w),f.current&&(f.current(),f.current=null)}},[l.isRunning,l.stepIndex,c]);const[p,g]=d.useState(null);if(d.useEffect(()=>{let v=document.getElementById("tour-portal-container");return v||(v=document.createElement("div"),v.id="tour-portal-container",v.style.cssText="position: fixed; top: 0; left: 0; z-index: 99999; pointer-events: none;",document.body.appendChild(v)),g(v),()=>{}},[]),!l.isRunning||c.length===0||!u)return null;const N=e.jsx(D_,{steps:c,stepIndex:l.stepIndex,run:l.isRunning,continuous:!0,showSkipButton:!0,showProgress:!0,disableOverlayClose:!0,disableScrolling:!1,disableScrollParentFix:!1,callback:i,styles:eS,locale:sS,scrollOffset:80,scrollToFirstStep:!0,floaterProps:{styles:{floater:{zIndex:99999}},disableAnimation:!0}},`tour-step-${l.stepIndex}`);return p?v0.createPortal(N,p):N}const il="model-assignment-tour",Nv=[{target:"body",content:"本引导旨在帮助你配置模型提供商和对应的模型,并为麦麦的各个组件分配合适的模型。",placement:"center",disableBeacon:!0,disableOverlayClose:!0,hideCloseButton:!1,spotlightClicks:!1},{target:'[data-tour="sidebar-model-provider"]',content:'第一步,你需要配置模型提供商。模型提供商决定了你要使用谁家的模型,无论是单一厂商(如 DeepSeek),还是模型平台(如 Siliconflow),都可以在这里进行配置。点击"下一步"进入配置页面。',placement:"right",disableBeacon:!0,disableOverlayClose:!0,hideCloseButton:!1,spotlightClicks:!1},{target:'[data-tour="add-provider-button"]',content:'点击"添加提供商"按钮,开始配置你的模型提供商。',placement:"bottom",disableBeacon:!0,disableOverlayClose:!0,hideCloseButton:!1,spotlightClicks:!0,hideFooter:!0},{target:'[data-tour="provider-dialog"]',content:"在这里,你可以选择你想要配置的模型提供商,填写相关信息后保存即可。",placement:"left",disableBeacon:!0,disableOverlayClose:!0,hideCloseButton:!1,spotlightClicks:!1},{target:'[data-tour="provider-name-input"]',content:"这里的名称是你为这个模型提供商起的一个名字,方便你在后续使用时识别它。",placement:"bottom",disableBeacon:!0,disableOverlayClose:!0,hideCloseButton:!1,spotlightClicks:!1},{target:'[data-tour="provider-apikey-input"]',content:"这里需要填写你从模型提供商那里获取的 API 密钥,用于验证和调用模型服务。对于不同的提供商,获取 API 密钥的方式可能有所不同,请参考对应提供商的文档。",placement:"bottom",disableBeacon:!0,disableOverlayClose:!0,hideCloseButton:!1,spotlightClicks:!1},{target:'[data-tour="provider-url-input"]',content:"这里需要填写模型提供商的 API 访问地址,确保填写正确以便系统能够连接到模型服务。对于不同的提供商,API 地址可能有所不同,请参考对应提供商的文档。",placement:"bottom",disableBeacon:!0,disableOverlayClose:!0,hideCloseButton:!1,spotlightClicks:!1},{target:'[data-tour="provider-template-select"]',content:"当然,如果你不知道如何填写这些信息,很多模型提供商在这里都提供了预设的模板供你选择,选择对应的模板后,相关信息会自动填充。",placement:"bottom",disableBeacon:!0,disableOverlayClose:!0,hideCloseButton:!1,spotlightClicks:!1},{target:'[data-tour="provider-save-button"]',content:"填写完所有信息后,点击保存按钮,模型提供商就配置完成了。",placement:"top",disableBeacon:!0,disableOverlayClose:!0,hideCloseButton:!1,spotlightClicks:!1},{target:'[data-tour="provider-cancel-button"]',content:"因为这次咱们什么都没有填写,所以点击取消按钮退出吧。",placement:"top",disableBeacon:!0,disableOverlayClose:!0,hideCloseButton:!1,spotlightClicks:!0,hideFooter:!0},{target:'[data-tour="sidebar-model-management"]',content:'配置好模型提供商后,接下来我们需要为麦麦添加模型并分配功能。点击"下一步"进入模型管理页面。',placement:"right",disableBeacon:!0,disableOverlayClose:!0,hideCloseButton:!1,spotlightClicks:!1},{target:'[data-tour="add-model-button"]',content:'在为麦麦的组件分配模型之前,首先需要添加你想要分配的模型,点击"添加模型"按钮开始添加。',placement:"bottom",disableBeacon:!0,disableOverlayClose:!0,hideCloseButton:!1,spotlightClicks:!0,hideFooter:!0},{target:'[data-tour="model-dialog"]',content:"在这里,你可以选择你之前配置好的模型提供商,然后选择对应的模型来添加。",placement:"left",disableBeacon:!0,disableOverlayClose:!0,hideCloseButton:!1,spotlightClicks:!1},{target:'[data-tour="model-name-input"]',content:"这里的模型名称是你为这个模型起的一个名字,方便你在后续使用时识别它。",placement:"bottom",disableBeacon:!0,disableOverlayClose:!0,hideCloseButton:!1,spotlightClicks:!1},{target:'[data-tour="model-provider-select"]',content:"在这里选择你之前配置好的模型提供商,这样系统才能知道你要添加哪个提供商的模型。",placement:"bottom",disableBeacon:!0,disableOverlayClose:!0,hideCloseButton:!1,spotlightClicks:!1},{target:'[data-tour="model-identifier-input"]',content:"这里需要填写你想要添加的模型的标识符,不同的模型提供商可能有不同的标识符格式,请参考对应提供商的文档。",placement:"bottom",disableBeacon:!0,disableOverlayClose:!0,hideCloseButton:!1,spotlightClicks:!1},{target:'[data-tour="model-save-button"]',content:"填写完所有信息后,点击保存按钮,模型就添加完成了。",placement:"top",disableBeacon:!0,disableOverlayClose:!0,hideCloseButton:!1,spotlightClicks:!1},{target:'[data-tour="model-cancel-button"]',content:"当然,因为这次咱们什么都没有填写,所以直接点击取消按钮退出吧,等你准备好了再来添加模型。",placement:"top",disableBeacon:!0,disableOverlayClose:!0,hideCloseButton:!1,spotlightClicks:!0,hideFooter:!0},{target:'[data-tour="tasks-tab-trigger"]',content:'最后一步,添加好模型后,切换到"为模型分配功能"标签页,为麦麦的各个组件分配合适的模型。',placement:"bottom",disableBeacon:!0,disableOverlayClose:!0,hideCloseButton:!1,spotlightClicks:!0,hideFooter:!0},{target:'[data-tour="task-model-select"]',content:"在这里,你可以为每个组件选择一个或多个合适的模型,选择完成后配置会自动保存。恭喜你完成了模型配置的学习!",placement:"bottom",disableBeacon:!0,disableOverlayClose:!0,hideCloseButton:!1,spotlightClicks:!1}],bv={0:"/config/model",1:"/config/model",2:"/config/modelProvider",3:"/config/modelProvider",4:"/config/modelProvider",5:"/config/modelProvider",6:"/config/modelProvider",7:"/config/modelProvider",8:"/config/modelProvider",9:"/config/modelProvider",10:"/config/modelProvider",11:"/config/model",12:"/config/model",13:"/config/model",14:"/config/model",15:"/config/model",16:"/config/model",17:"/config/model",18:"/config/model",19:"/config/model"},Vi=[{id:"siliconflow",name:"SiliconFlow",base_url:"https://api.siliconflow.cn/v1",client_type:"openai",display_name:"硅基流动 (SiliconFlow)",modelFetcher:{endpoint:"/models",parser:"openai"}},{id:"deepseek",name:"DeepSeek",base_url:"https://api.deepseek.com",client_type:"openai",display_name:"DeepSeek",modelFetcher:{endpoint:"/models",parser:"openai"}},{id:"rinkoai",name:"RinkoAI",base_url:"https://rinkoai.com/v1",client_type:"openai",display_name:"RinkoAI",modelFetcher:{endpoint:"/models",parser:"openai"}},{id:"zhipu",name:"ZhipuAI",base_url:"https://open.bigmodel.cn/api/paas/v4",client_type:"openai",display_name:"智谱 AI (ZhipuAI / GLM)",modelFetcher:{endpoint:"/models",parser:"openai"}},{id:"moonshot",name:"Moonshot",base_url:"https://api.moonshot.cn/v1",client_type:"openai",display_name:"月之暗面 (Moonshot / Kimi)",modelFetcher:{endpoint:"/models",parser:"openai"}},{id:"doubao",name:"Doubao",base_url:"https://ark.cn-beijing.volces.com/api/v3",client_type:"openai",display_name:"字节豆包 (Doubao)",modelFetcher:{endpoint:"/models",parser:"openai"}},{id:"alibaba",name:"Alibaba",base_url:"https://dashscope.aliyuncs.com/compatible-mode/v1",client_type:"openai",display_name:"阿里云百炼 (Alibaba Qwen)",modelFetcher:{endpoint:"/models",parser:"openai"}},{id:"baichuan",name:"Baichuan",base_url:"https://api.baichuan-ai.com/v1",client_type:"openai",display_name:"百川智能 (Baichuan)",modelFetcher:{endpoint:"/models",parser:"openai"}},{id:"minimax",name:"MiniMax",base_url:"https://api.minimax.chat/v1",client_type:"openai",display_name:"MiniMax (海螺 AI)",modelFetcher:{endpoint:"/models",parser:"openai"}},{id:"stepfun",name:"StepFun",base_url:"https://api.stepfun.com/v1",client_type:"openai",display_name:"阶跃星辰 (StepFun)",modelFetcher:{endpoint:"/models",parser:"openai"}},{id:"lingyi",name:"Lingyi",base_url:"https://api.lingyiwanwu.com/v1",client_type:"openai",display_name:"零一万物 (Lingyi / Yi)",modelFetcher:{endpoint:"/models",parser:"openai"}},{id:"openai",name:"OpenAI",base_url:"https://api.openai.com/v1",client_type:"openai",display_name:"OpenAI",modelFetcher:{endpoint:"/models",parser:"openai"}},{id:"xai",name:"xAI",base_url:"https://api.x.ai/v1",client_type:"openai",display_name:"xAI (Grok)",modelFetcher:{endpoint:"/models",parser:"openai"}},{id:"anthropic",name:"Anthropic",base_url:"https://api.anthropic.com/v1",client_type:"openai",display_name:"Anthropic (Claude)"},{id:"gemini",name:"Gemini",base_url:"https://generativelanguage.googleapis.com/v1beta",client_type:"gemini",display_name:"Google Gemini",modelFetcher:{endpoint:"/models",parser:"gemini"}},{id:"cohere",name:"Cohere",base_url:"https://api.cohere.ai/v1",client_type:"openai",display_name:"Cohere"},{id:"groq",name:"Groq",base_url:"https://api.groq.com/openai/v1",client_type:"openai",display_name:"Groq",modelFetcher:{endpoint:"/models",parser:"openai"}},{id:"together",name:"Together AI",base_url:"https://api.together.xyz/v1",client_type:"openai",display_name:"Together AI",modelFetcher:{endpoint:"/models",parser:"openai"}},{id:"fireworks",name:"Fireworks",base_url:"https://api.fireworks.ai/inference/v1",client_type:"openai",display_name:"Fireworks AI",modelFetcher:{endpoint:"/models",parser:"openai"}},{id:"mistral",name:"Mistral",base_url:"https://api.mistral.ai/v1",client_type:"openai",display_name:"Mistral AI",modelFetcher:{endpoint:"/models",parser:"openai"}},{id:"perplexity",name:"Perplexity",base_url:"https://api.perplexity.ai",client_type:"openai",display_name:"Perplexity AI"},{id:"custom",name:"",base_url:"",client_type:"openai",display_name:"自定义"}];function _g(l){return l?l.replace(/\/+$/,"").toLowerCase():""}function aS(l){if(!l)return null;const n=_g(l);return Vi.find(i=>i.id!=="custom"&&_g(i.base_url)===n)||null}const Co=l=>({...l,max_retry:l.max_retry??2,timeout:l.timeout??30,retry_interval:l.retry_interval??10}),lS=l=>{const n={};return l?(l.name?.trim()||(n.name="请输入提供商名称"),l.base_url?.trim()||(n.base_url="请输入基础 URL"),l.api_key?.trim()||(n.api_key="请输入 API Key"),{isValid:Object.keys(n).length===0,errors:n}):{isValid:!1,errors:{name:"提供商数据为空"}}};function nS(){return e.jsx(Yn,{children:e.jsx(rS,{})})}function rS(){const[l,n]=d.useState([]),[i,c]=d.useState(!0),[u,x]=d.useState(!1),[h,f]=d.useState(!1),[p,g]=d.useState(!1),[N,v]=d.useState(!1),[y,w]=d.useState(null),[b,R]=d.useState(null),[D,S]=d.useState("custom"),[P,M]=d.useState(!1),[T,A]=d.useState(!1),[F,L]=d.useState(null),[J,U]=d.useState(!1),[ue,xe]=d.useState(""),[he,ne]=d.useState(new Set),[ve,je]=d.useState(!1),[z,V]=d.useState(1),[B,oe]=d.useState(20),[K,_e]=d.useState(""),[pe,ke]=d.useState({isOpen:!1,providersToDelete:[],affectedModels:[],pendingProviders:[],context:"auto",oldProviders:[]}),[O,k]=d.useState({}),[H,se]=d.useState(new Set),[Ee,Z]=d.useState(new Map),{toast:Oe}=Zs(),ns=ca(),{state:Q,goToStep:ee,registerTour:Ue}=ax(),{triggerRestart:ie,isRestarting:Te}=vn(),de=d.useRef(null),Me=d.useRef(!0);d.useEffect(()=>{Ue(il,Nv)},[Ue]),d.useEffect(()=>{if(Q.activeTourId===il&&Q.isRunning){const W=bv[Q.stepIndex];W&&!window.location.pathname.endsWith(W.replace("/config/",""))&&ns({to:W})}},[Q.stepIndex,Q.activeTourId,Q.isRunning,ns]);const rs=d.useRef(Q.stepIndex);d.useEffect(()=>{if(Q.activeTourId===il&&Q.isRunning){const W=rs.current,ye=Q.stepIndex;W>=3&&W<=9&&ye<3&&v(!1),W>=10&&ye>=3&&ye<=9&&(k({}),S("custom"),w({name:"",base_url:"",api_key:"",client_type:"openai",max_retry:2,timeout:30,retry_interval:10}),R(null),U(!1),v(!0)),rs.current=ye}},[Q.stepIndex,Q.activeTourId,Q.isRunning]),d.useEffect(()=>{if(Q.activeTourId!==il||!Q.isRunning)return;const W=ye=>{const Re=ye.target,Hs=Q.stepIndex;Hs===2&&Re.closest('[data-tour="add-provider-button"]')?setTimeout(()=>ee(3),300):Hs===9&&Re.closest('[data-tour="provider-cancel-button"]')&&setTimeout(()=>ee(10),300)};return document.addEventListener("click",W,!0),()=>document.removeEventListener("click",W,!0)},[Q,ee]),d.useEffect(()=>{Ut()},[]);const Ut=async()=>{try{c(!0);const W=await un();n(W.api_providers||[]),g(!1),Me.current=!1}catch(W){console.error("加载配置失败:",W)}finally{c(!1)}},aa=async()=>{await ie()},Ka=async()=>{try{x(!0),de.current&&clearTimeout(de.current);const W=l.map(rt=>({...rt,max_retry:rt.max_retry??2,timeout:rt.timeout??30,retry_interval:rt.retry_interval??10})),{shouldProceed:ye}=await Ft(W,"restart");if(!ye){x(!1);return}const Re=await un(),Hs=new Set(W.map(rt=>rt.name)),Wt=(Re.models||[]).filter(rt=>Hs.has(rt.api_provider));Re.api_providers=W,Re.models=Wt,await Ji(Re),g(!1),Oe({title:"保存成功",description:"正在重启麦麦..."}),await aa()}catch(W){console.error("保存配置失败:",W),Oe({title:"保存失败",description:W.message,variant:"destructive"}),x(!1)}},Ft=d.useCallback(async(W,ye="auto")=>{try{const Re=await un(),Hs=new Set(l.map(xt=>xt.name)),Dt=new Set(W.map(xt=>xt.name)),Wt=Array.from(Hs).filter(xt=>!Dt.has(xt));if(Wt.length===0)return{shouldProceed:!0,providers:W};const ea=(Re.models||[]).filter(xt=>Wt.includes(xt.api_provider));return ea.length===0?{shouldProceed:!0,providers:W}:(ke({isOpen:!0,providersToDelete:Wt,affectedModels:ea,pendingProviders:W,context:ye,oldProviders:[...l]}),{shouldProceed:!1,providers:W})}catch(Re){return console.error("检查删除影响失败:",Re),{shouldProceed:!0,providers:W}}},[l]),mt=async()=>{try{(pe.context==="auto"?f:x)(!0),ke(xt=>({...xt,isOpen:!1}));const ye=await un(),Re=pe.pendingProviders.map(Co),Hs=new Set(Re.map(xt=>xt.name)),Wt=(ye.models||[]).filter(xt=>Hs.has(xt.api_provider)),rt=new Set(pe.affectedModels.map(xt=>xt.name)),ea=ye.model_task_config;ea&&Object.keys(ea).forEach(xt=>{const re=ea[xt];re&&Array.isArray(re.model_list)&&(re.model_list=re.model_list.filter(fe=>!rt.has(fe)))}),ye.api_providers=Re,ye.models=Wt,ye.model_task_config=ea,await Ji(ye),n(pe.pendingProviders),g(!1),Oe({title:"删除成功",description:`已删除 ${pe.providersToDelete.length} 个提供商和 ${pe.affectedModels.length} 个关联模型`}),ke({isOpen:!1,providersToDelete:[],affectedModels:[],pendingProviders:[],context:"auto",oldProviders:[]}),ne(new Set),pe.context==="restart"&&await aa()}catch(W){console.error("删除失败:",W),Oe({title:"删除失败",description:W.message,variant:"destructive"})}finally{pe.context==="auto"?f(!1):x(!1)}},q=()=>{pe.oldProviders.length>0&&n(pe.oldProviders),ke({isOpen:!1,providersToDelete:[],affectedModels:[],pendingProviders:[],context:"auto",oldProviders:[]}),g(!1)},Ve=d.useCallback(async W=>{if(Me.current)return;const{shouldProceed:ye}=await Ft(W,"auto");if(!ye){g(!0);return}try{f(!0);const Re=W.map(Co);await Bm("api_providers",Re),g(!1)}catch(Re){console.error("自动保存失败:",Re),Oe({title:"自动保存失败",description:Re.message,variant:"destructive"}),g(!0)}finally{f(!1)}},[l,Ft]);d.useEffect(()=>{if(!Me.current)return g(!0),de.current&&clearTimeout(de.current),de.current=setTimeout(()=>{Ve(l)},2e3),()=>{de.current&&clearTimeout(de.current)}},[l,Ve]);const Ke=async()=>{try{x(!0),de.current&&clearTimeout(de.current);const W=l.map(Co),{shouldProceed:ye}=await Ft(W,"manual");if(!ye){x(!1);return}const Re=await un(),Hs=new Set(W.map(rt=>rt.name)),Dt=Re.models||[],Wt=Dt.filter(rt=>{const ea=Hs.has(rt.api_provider);return ea||console.warn(`模型 "${rt.name}" 引用了已删除的提供商 "${rt.api_provider}",将被移除`),ea});if(Dt.length!==Wt.length){const rt=Dt.length-Wt.length;Oe({title:"注意",description:`已自动移除 ${rt} 个引用已删除提供商的模型`,variant:"default"})}console.log("发送的 providers 数据:",W),Re.api_providers=W,Re.models=Wt,console.log("完整配置数据:",Re),await Ji(Re),g(!1),Oe({title:"保存成功",description:"模型提供商配置已保存"})}catch(W){console.error("保存配置失败:",W),Oe({title:"保存失败",description:W.message,variant:"destructive"})}finally{x(!1)}},We=(W,ye)=>{if(k({}),W){const Re=Vi.find(Hs=>Hs.base_url===W.base_url&&Hs.client_type===W.client_type);S(Re?.id||"custom"),w(W)}else S("custom"),w({name:"",base_url:"",api_key:"",client_type:"openai",max_retry:2,timeout:30,retry_interval:10});R(ye),U(!1),v(!0)},Ls=d.useCallback(W=>{S(W),M(!1);const ye=Vi.find(Re=>Re.id===W);ye&&ye.id!=="custom"?w(Re=>({...Re,name:ye.name,base_url:ye.base_url,client_type:ye.client_type})):ye?.id==="custom"&&w(Re=>({...Re,name:"",base_url:"",client_type:"openai"}))},[]),ts=d.useMemo(()=>D!=="custom",[D]),Cs=d.useCallback(async()=>{if(y?.api_key)try{await navigator.clipboard.writeText(y.api_key),Oe({title:"复制成功",description:"API Key 已复制到剪贴板"})}catch{Oe({title:"复制失败",description:"无法访问剪贴板",variant:"destructive"})}},[y?.api_key,Oe]),ze=()=>{if(!y)return;const{isValid:W,errors:ye}=lS(y);if(!W){k(ye);return}k({});const Re=Co(y);if(b!==null){const Hs=[...l];Hs[b]=Re,n(Hs)}else n([...l,Re]);v(!1),w(null),R(null)},Ns=W=>{if(!W&&y){const ye={...y,max_retry:y.max_retry??2,timeout:y.timeout??30,retry_interval:y.retry_interval??10};w(ye)}v(W)},as=W=>{L(W),A(!0)},es=async()=>{if(F!==null){const W=l.filter((Re,Hs)=>Hs!==F),{shouldProceed:ye}=await Ft(W,"manual");ye&&(n(W),Oe({title:"删除成功",description:"提供商已从列表中移除"}))}A(!1),L(null)},bs=W=>{const ye=new Set(he);ye.has(W)?ye.delete(W):ye.add(W),ne(ye)},gt=()=>{if(he.size===Ms.length)ne(new Set);else{const W=Ms.map((ye,Re)=>l.findIndex(Hs=>Hs===Ms[Re]));ne(new Set(W))}},$t=()=>{if(he.size===0){Oe({title:"提示",description:"请先选择要删除的提供商",variant:"default"});return}je(!0)},tt=async()=>{const W=l.filter((Re,Hs)=>!he.has(Hs)),{shouldProceed:ye}=await Ft(W,"manual");ye&&(n(W),ne(new Set),Oe({title:"批量删除成功",description:`已删除 ${he.size} 个提供商`})),je(!1)},Ms=d.useMemo(()=>{if(!ue)return l;const W=ue.toLowerCase();return l.filter(ye=>ye.name.toLowerCase().includes(W)||ye.base_url.toLowerCase().includes(W)||ye.client_type.toLowerCase().includes(W))},[l,ue]),{totalPages:Tt,paginatedProviders:Bt}=d.useMemo(()=>{const W=Math.ceil(Ms.length/B),ye=Ms.slice((z-1)*B,z*B);return{totalPages:W,paginatedProviders:ye}},[Ms,z,B]),Aa=d.useCallback(()=>{const W=parseInt(K);W>=1&&W<=Tt&&(V(W),_e(""))},[K,Tt]),tl=async W=>{se(ye=>new Set(ye).add(W));try{const ye=await $2(W);Z(Re=>new Map(Re).set(W,ye)),ye.network_ok?ye.api_key_valid===!0?Oe({title:"连接正常",description:`${W} 网络连接正常,API Key 有效 (${ye.latency_ms}ms)`}):ye.api_key_valid===!1?Oe({title:"连接正常但 Key 无效",description:`${W} 网络连接正常,但 API Key 无效或已过期`,variant:"destructive"}):Oe({title:"网络连接正常",description:`${W} 可以访问 (${ye.latency_ms}ms)`}):Oe({title:"连接失败",description:ye.error||"无法连接到提供商",variant:"destructive"})}catch(ye){Oe({title:"测试失败",description:ye.message,variant:"destructive"})}finally{se(ye=>{const Re=new Set(ye);return Re.delete(W),Re})}},ul=async()=>{for(const W of l)await tl(W.name)},Xn=W=>{const ye=H.has(W),Re=Ee.get(W);return ye?e.jsxs(Se,{variant:"secondary",className:"gap-1",children:[e.jsx(Bs,{className:"h-3 w-3 animate-spin"}),"测试中"]}):Re?Re.network_ok?Re.api_key_valid===!0?e.jsxs(Se,{className:"gap-1 bg-green-600 hover:bg-green-700",children:[e.jsx(pt,{className:"h-3 w-3"}),"正常"]}):Re.api_key_valid===!1?e.jsxs(Se,{variant:"destructive",className:"gap-1",children:[e.jsx(wt,{className:"h-3 w-3"}),"Key无效"]}):e.jsxs(Se,{className:"gap-1 bg-blue-600 hover:bg-blue-700",children:[e.jsx(pt,{className:"h-3 w-3"}),"可访问"]}):e.jsxs(Se,{variant:"destructive",className:"gap-1",children:[e.jsx(Ga,{className:"h-3 w-3"}),"离线"]}):null};return i?e.jsx("div",{className:"space-y-4 sm:space-y-6 p-4 sm:p-6",children:e.jsx("div",{className:"flex items-center justify-center h-64",children:e.jsx("p",{className:"text-muted-foreground",children:"加载中..."})})}):e.jsxs("div",{className:"space-y-4 sm:space-y-6 p-4 sm:p-6",children:[e.jsxs("div",{className:"flex flex-col sm:flex-row sm:items-center justify-between gap-4",children:[e.jsxs("div",{children:[e.jsx("h1",{className:"text-2xl sm:text-3xl font-bold",children:"AI模型厂商配置"}),e.jsx("p",{className:"text-muted-foreground mt-1 sm:mt-2 text-sm sm:text-base",children:"管理 AI 模型厂商的 API 配置"})]}),e.jsxs("div",{className:"flex flex-col sm:flex-row gap-2",children:[he.size>0&&e.jsxs(_,{onClick:$t,size:"sm",variant:"destructive",className:"w-full sm:w-auto",children:[e.jsx(ls,{className:"mr-2 h-4 w-4",strokeWidth:2,fill:"none"}),"批量删除 (",he.size,")"]}),e.jsxs(_,{onClick:ul,size:"sm",variant:"outline",className:"w-full sm:w-auto",disabled:l.length===0||H.size>0,children:[e.jsx(Za,{className:"mr-2 h-4 w-4"}),H.size>0?`测试中 (${H.size})`:"测试全部"]}),e.jsxs(_,{onClick:()=>We(null,null),size:"sm",className:"w-full sm:w-auto","data-tour":"add-provider-button",children:[e.jsx(et,{className:"mr-2 h-4 w-4",strokeWidth:2,fill:"none"}),"添加提供商"]}),e.jsxs(_,{onClick:Ke,disabled:u||h||!p||Te,size:"sm",variant:"outline",className:"w-full sm:w-auto sm:min-w-[120px]",children:[e.jsx(oc,{className:"mr-2 h-4 w-4",strokeWidth:2,fill:"none"}),u?"保存中...":h?"自动保存中...":p?"保存配置":"已保存"]}),e.jsxs(vs,{children:[e.jsx(yt,{asChild:!0,children:e.jsxs(_,{disabled:u||h||Te,size:"sm",className:"w-full sm:w-auto sm:min-w-[120px]",children:[e.jsx(cc,{className:"mr-2 h-4 w-4"}),Te?"重启中...":p?"保存并重启":"重启麦麦"]})}),e.jsxs(ds,{children:[e.jsxs(us,{children:[e.jsx(xs,{children:"确认重启麦麦?"}),e.jsx(hs,{asChild:!0,children:e.jsx("div",{children:e.jsx("p",{children:p?"当前有未保存的配置更改。点击确认将先保存配置,然后重启麦麦使新配置生效。重启过程中麦麦将暂时离线。":"即将重启麦麦主程序。重启过程中麦麦将暂时离线,配置将在重启后生效。"})})})]}),e.jsxs(ms,{children:[e.jsx(ps,{children:"取消"}),e.jsx(fs,{onClick:p?Ka:aa,children:p?"保存并重启":"确认重启"})]})]})]})]})]}),e.jsxs(at,{children:[e.jsx(Ht,{className:"h-4 w-4"}),e.jsxs(lt,{children:["配置更新后需要",e.jsx("strong",{children:"重启麦麦"}),'才能生效。你可以点击右上角的"保存并重启"按钮一键完成保存和重启。']})]}),e.jsxs(Ye,{className:"h-[calc(100vh-260px)]",children:[e.jsxs("div",{className:"flex flex-col sm:flex-row items-start sm:items-center gap-2 mb-4",children:[e.jsxs("div",{className:"relative w-full sm:flex-1 sm:max-w-sm",children:[e.jsx(Ct,{className:"absolute left-3 top-1/2 -translate-y-1/2 h-4 w-4 text-muted-foreground"}),e.jsx(le,{placeholder:"搜索提供商名称、URL 或类型...",value:ue,onChange:W=>xe(W.target.value),className:"pl-9"})]}),ue&&e.jsxs("p",{className:"text-sm text-muted-foreground whitespace-nowrap",children:["找到 ",Ms.length," 个结果"]})]}),e.jsx("div",{className:"md:hidden space-y-3",children:Ms.length===0?e.jsx("div",{className:"text-center text-muted-foreground py-8 rounded-lg border bg-card",children:ue?"未找到匹配的提供商":'暂无提供商配置,点击"添加提供商"开始配置'}):Bt.map((W,ye)=>{const Re=l.findIndex(Hs=>Hs===W);return e.jsxs("div",{className:"rounded-lg border bg-card p-4 space-y-3",children:[e.jsxs("div",{className:"flex items-start justify-between gap-2",children:[e.jsxs("div",{className:"flex-1 min-w-0",children:[e.jsxs("div",{className:"flex items-center gap-2 flex-wrap",children:[e.jsx("h3",{className:"font-semibold text-base truncate",children:W.name}),Xn(W.name)]}),e.jsx("p",{className:"text-xs text-muted-foreground mt-1 break-all",children:W.base_url})]}),e.jsxs("div",{className:"flex gap-1 flex-shrink-0",children:[e.jsx(_,{variant:"outline",size:"sm",onClick:()=>tl(W.name),disabled:H.has(W.name),title:"测试连接",children:H.has(W.name)?e.jsx(Bs,{className:"h-4 w-4 animate-spin"}):e.jsx(Za,{className:"h-4 w-4"})}),e.jsx(_,{variant:"default",size:"sm",onClick:()=>We(W,Re),children:e.jsx(Fn,{className:"h-4 w-4",strokeWidth:2,fill:"none"})}),e.jsx(_,{size:"sm",onClick:()=>as(Re),className:"bg-red-600 hover:bg-red-700 text-white",children:e.jsx(ls,{className:"h-4 w-4",strokeWidth:2,fill:"none"})})]})]}),e.jsxs("div",{className:"grid grid-cols-2 gap-2 text-sm",children:[e.jsxs("div",{children:[e.jsx("span",{className:"text-muted-foreground text-xs",children:"客户端类型"}),e.jsx("p",{className:"font-medium",children:W.client_type})]}),e.jsxs("div",{children:[e.jsx("span",{className:"text-muted-foreground text-xs",children:"最大重试"}),e.jsx("p",{className:"font-medium",children:W.max_retry})]}),e.jsxs("div",{children:[e.jsx("span",{className:"text-muted-foreground text-xs",children:"超时(秒)"}),e.jsx("p",{className:"font-medium",children:W.timeout})]}),e.jsxs("div",{children:[e.jsx("span",{className:"text-muted-foreground text-xs",children:"重试间隔(秒)"}),e.jsx("p",{className:"font-medium",children:W.retry_interval})]})]})]},ye)})}),e.jsx("div",{className:"hidden md:block rounded-lg border bg-card overflow-hidden",children:e.jsx("div",{className:"overflow-x-auto",children:e.jsxs(Rl,{children:[e.jsx(Ll,{children:e.jsxs(ut,{children:[e.jsx(Ze,{className:"w-12",children:e.jsx(qs,{checked:he.size===Ms.length&&Ms.length>0,onCheckedChange:gt})}),e.jsx(Ze,{children:"状态"}),e.jsx(Ze,{children:"名称"}),e.jsx(Ze,{children:"基础URL"}),e.jsx(Ze,{children:"客户端类型"}),e.jsx(Ze,{className:"text-right",children:"最大重试"}),e.jsx(Ze,{className:"text-right",children:"超时(秒)"}),e.jsx(Ze,{className:"text-right",children:"重试间隔(秒)"}),e.jsx(Ze,{className:"text-right",children:"操作"})]})}),e.jsx(Ul,{children:Bt.length===0?e.jsx(ut,{children:e.jsx(qe,{colSpan:9,className:"text-center text-muted-foreground py-8",children:ue?"未找到匹配的提供商":'暂无提供商配置,点击"添加提供商"开始配置'})}):Bt.map((W,ye)=>{const Re=l.findIndex(Hs=>Hs===W);return e.jsxs(ut,{children:[e.jsx(qe,{children:e.jsx(qs,{checked:he.has(Re),onCheckedChange:()=>bs(Re)})}),e.jsx(qe,{children:Xn(W.name)||e.jsx(Se,{variant:"outline",className:"text-muted-foreground",children:"未测试"})}),e.jsx(qe,{className:"font-medium",children:W.name}),e.jsx(qe,{className:"max-w-xs truncate",title:W.base_url,children:W.base_url}),e.jsx(qe,{children:W.client_type}),e.jsx(qe,{className:"text-right",children:W.max_retry}),e.jsx(qe,{className:"text-right",children:W.timeout}),e.jsx(qe,{className:"text-right",children:W.retry_interval}),e.jsx(qe,{className:"text-right",children:e.jsxs("div",{className:"flex justify-end gap-2",children:[e.jsx(_,{variant:"outline",size:"sm",onClick:()=>tl(W.name),disabled:H.has(W.name),title:"测试连接",children:H.has(W.name)?e.jsx(Bs,{className:"h-4 w-4 animate-spin"}):e.jsx(Za,{className:"h-4 w-4"})}),e.jsxs(_,{variant:"default",size:"sm",onClick:()=>We(W,Re),children:[e.jsx(Fn,{className:"h-4 w-4 mr-1",strokeWidth:2,fill:"none"}),"编辑"]}),e.jsxs(_,{size:"sm",onClick:()=>as(Re),className:"bg-red-600 hover:bg-red-700 text-white",children:[e.jsx(ls,{className:"h-4 w-4 mr-1",strokeWidth:2,fill:"none"}),"删除"]})]})})]},ye)})})]})})}),Ms.length>0&&e.jsxs("div",{className:"flex flex-col sm:flex-row items-center justify-between gap-4 mt-4",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(E,{htmlFor:"page-size-provider",className:"text-sm whitespace-nowrap",children:"每页显示"}),e.jsxs(Ie,{value:B.toString(),onValueChange:W=>{oe(parseInt(W)),V(1),ne(new Set)},children:[e.jsx($e,{id:"page-size-provider",className:"w-20",children:e.jsx(Pe,{})}),e.jsxs(Be,{children:[e.jsx(X,{value:"10",children:"10"}),e.jsx(X,{value:"20",children:"20"}),e.jsx(X,{value:"50",children:"50"}),e.jsx(X,{value:"100",children:"100"})]})]}),e.jsxs("span",{className:"text-sm text-muted-foreground",children:["显示 ",(z-1)*B+1," 到"," ",Math.min(z*B,Ms.length)," 条,共 ",Ms.length," 条"]})]}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(_,{variant:"outline",size:"sm",onClick:()=>V(1),disabled:z===1,className:"hidden sm:flex",children:e.jsx(gn,{className:"h-4 w-4"})}),e.jsxs(_,{variant:"outline",size:"sm",onClick:()=>V(W=>Math.max(1,W-1)),disabled:z===1,children:[e.jsx(za,{className:"h-4 w-4 sm:mr-1"}),e.jsx("span",{className:"hidden sm:inline",children:"上一页"})]}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(le,{type:"number",value:K,onChange:W=>_e(W.target.value),onKeyDown:W=>W.key==="Enter"&&Aa(),placeholder:z.toString(),className:"w-16 h-8 text-center",min:1,max:Tt}),e.jsx(_,{variant:"outline",size:"sm",onClick:Aa,disabled:!K,className:"h-8",children:"跳转"})]}),e.jsxs(_,{variant:"outline",size:"sm",onClick:()=>V(W=>W+1),disabled:z>=Tt,children:[e.jsx("span",{className:"hidden sm:inline",children:"下一页"}),e.jsx(Zt,{className:"h-4 w-4 sm:ml-1"})]}),e.jsx(_,{variant:"outline",size:"sm",onClick:()=>V(Tt),disabled:z>=Tt,className:"hidden sm:flex",children:e.jsx(jn,{className:"h-4 w-4"})})]})]})]}),e.jsx(Is,{open:N,onOpenChange:Ns,children:e.jsxs(Os,{className:"max-w-[95vw] sm:max-w-2xl max-h-[90vh] overflow-y-auto","data-tour":"provider-dialog",preventOutsideClose:Q.isRunning,children:[e.jsxs(Ds,{children:[e.jsx(Rs,{children:b!==null?"编辑提供商":"添加提供商"}),e.jsx(Ks,{children:"配置 API 提供商的连接信息和参数"})]}),e.jsxs("form",{onSubmit:W=>{W.preventDefault(),ze()},autoComplete:"off",children:[e.jsxs("div",{className:"grid gap-4 py-4",children:[e.jsxs("div",{className:"grid gap-2","data-tour":"provider-template-select",children:[e.jsx(E,{htmlFor:"template",children:"提供商模板"}),e.jsxs(ol,{open:P,onOpenChange:M,children:[e.jsx(dl,{asChild:!0,children:e.jsxs(_,{variant:"outline",role:"combobox","aria-expanded":P,className:"w-full justify-between",children:[D?Vi.find(W=>W.id===D)?.display_name:"选择提供商模板...",e.jsx(Ym,{className:"ml-2 h-4 w-4 shrink-0 opacity-50"})]})}),e.jsx(Wa,{className:"p-0",align:"start",style:{width:"var(--radix-popover-trigger-width)"},children:e.jsxs(sd,{children:[e.jsx(td,{placeholder:"搜索提供商模板..."}),e.jsx(Ye,{className:"h-[300px]",children:e.jsxs(ad,{className:"max-h-none overflow-visible",children:[e.jsx(ld,{children:"未找到匹配的模板"}),e.jsx(ac,{children:Vi.map(W=>e.jsxs(lc,{value:W.display_name,onSelect:()=>Ls(W.id),children:[e.jsx(kt,{className:`mr-2 h-4 w-4 ${D===W.id?"opacity-100":"opacity-0"}`}),W.display_name]},W.id))})]})})]})})]}),e.jsx("p",{className:"text-xs text-muted-foreground",children:"选择预设模板可自动填充 URL 和客户端类型,支持搜索"})]}),e.jsxs("div",{className:"grid gap-2","data-tour":"provider-name-input",children:[e.jsx(E,{htmlFor:"name",className:O.name?"text-destructive":"",children:"名称 *"}),e.jsx(le,{id:"name",value:y?.name||"",onChange:W=>{w(ye=>ye?{...ye,name:W.target.value}:null),O.name&&k(ye=>({...ye,name:void 0}))},placeholder:"例如: DeepSeek, SiliconFlow",className:O.name?"border-destructive focus-visible:ring-destructive":""}),O.name&&e.jsx("p",{className:"text-xs text-destructive",children:O.name})]}),e.jsxs("div",{className:"grid gap-2","data-tour":"provider-url-input",children:[e.jsx(E,{htmlFor:"base_url",className:O.base_url?"text-destructive":"",children:"基础 URL *"}),e.jsx(le,{id:"base_url",value:y?.base_url||"",onChange:W=>{w(ye=>ye?{...ye,base_url:W.target.value}:null),O.base_url&&k(ye=>({...ye,base_url:void 0}))},placeholder:"https://api.example.com/v1",disabled:ts,className:`${ts?"bg-muted cursor-not-allowed":""} ${O.base_url?"border-destructive focus-visible:ring-destructive":""}`}),O.base_url&&e.jsx("p",{className:"text-xs text-destructive",children:O.base_url}),ts&&!O.base_url&&e.jsx("p",{className:"text-xs text-muted-foreground",children:'使用模板时 URL 不可编辑,切换到"自定义"以手动配置'})]}),e.jsxs("div",{className:"grid gap-2","data-tour":"provider-apikey-input",children:[e.jsx(E,{htmlFor:"api_key",className:O.api_key?"text-destructive":"",children:"API Key *"}),e.jsxs("div",{className:"flex gap-2",children:[e.jsx(le,{id:"api_key",type:J?"text":"password",value:y?.api_key||"",onChange:W=>{w(ye=>ye?{...ye,api_key:W.target.value}:null),O.api_key&&k(ye=>({...ye,api_key:void 0}))},placeholder:"sk-...",className:`flex-1 ${O.api_key?"border-destructive focus-visible:ring-destructive":""}`}),e.jsx(_,{type:"button",variant:"outline",size:"icon",onClick:()=>U(!J),title:J?"隐藏密钥":"显示密钥",children:J?e.jsx(Wi,{className:"h-4 w-4"}):e.jsx(ia,{className:"h-4 w-4"})}),e.jsx(_,{type:"button",variant:"outline",size:"icon",onClick:Cs,title:"复制密钥",children:e.jsx(Ro,{className:"h-4 w-4"})})]}),O.api_key&&e.jsx("p",{className:"text-xs text-destructive",children:O.api_key})]}),e.jsxs("div",{className:"grid gap-2",children:[e.jsx(E,{htmlFor:"client_type",children:"客户端类型"}),e.jsxs(Ie,{value:y?.client_type||"openai",onValueChange:W=>w(ye=>ye?{...ye,client_type:W}:null),disabled:ts,children:[e.jsx($e,{id:"client_type",className:ts?"bg-muted cursor-not-allowed":"",children:e.jsx(Pe,{placeholder:"选择客户端类型"})}),e.jsxs(Be,{children:[e.jsx(X,{value:"openai",children:"OpenAI"}),e.jsx(X,{value:"gemini",children:"Gemini"})]})]}),ts&&e.jsx("p",{className:"text-xs text-muted-foreground",children:'使用模板时客户端类型不可编辑,切换到"自定义"以手动配置'})]}),e.jsxs("div",{className:"grid grid-cols-1 sm:grid-cols-3 gap-4",children:[e.jsxs("div",{className:"grid gap-2",children:[e.jsx(E,{htmlFor:"max_retry",children:"最大重试"}),e.jsx(le,{id:"max_retry",type:"number",min:"0",value:y?.max_retry??"",onChange:W=>{const ye=W.target.value===""?null:parseInt(W.target.value);w(Re=>Re?{...Re,max_retry:ye}:null)},placeholder:"默认: 2"})]}),e.jsxs("div",{className:"grid gap-2",children:[e.jsx(E,{htmlFor:"timeout",children:"超时(秒)"}),e.jsx(le,{id:"timeout",type:"number",min:"1",value:y?.timeout??"",onChange:W=>{const ye=W.target.value===""?null:parseInt(W.target.value);w(Re=>Re?{...Re,timeout:ye}:null)},placeholder:"默认: 30"})]}),e.jsxs("div",{className:"grid gap-2",children:[e.jsx(E,{htmlFor:"retry_interval",children:"重试间隔(秒)"}),e.jsx(le,{id:"retry_interval",type:"number",min:"1",value:y?.retry_interval??"",onChange:W=>{const ye=W.target.value===""?null:parseInt(W.target.value);w(Re=>Re?{...Re,retry_interval:ye}:null)},placeholder:"默认: 10"})]})]})]}),e.jsxs(st,{children:[e.jsx(_,{type:"button",variant:"outline",onClick:()=>v(!1),"data-tour":"provider-cancel-button",children:"取消"}),e.jsx(_,{type:"submit","data-tour":"provider-save-button",children:"保存"})]})]})]})}),e.jsx(vs,{open:T,onOpenChange:A,children:e.jsxs(ds,{children:[e.jsxs(us,{children:[e.jsx(xs,{children:"确认删除"}),e.jsxs(hs,{children:['确定要删除提供商 "',F!==null?l[F]?.name:"",'" 吗? 此操作无法撤销。']})]}),e.jsxs(ms,{children:[e.jsx(ps,{children:"取消"}),e.jsx(fs,{onClick:es,children:"删除"})]})]})}),e.jsx(vs,{open:ve,onOpenChange:je,children:e.jsxs(ds,{children:[e.jsxs(us,{children:[e.jsx(xs,{children:"确认批量删除"}),e.jsxs(hs,{children:["确定要删除选中的 ",he.size," 个提供商吗? 此操作无法撤销。"]})]}),e.jsxs(ms,{children:[e.jsx(ps,{children:"取消"}),e.jsx(fs,{onClick:tt,className:"bg-destructive text-destructive-foreground hover:bg-destructive/90",children:"批量删除"})]})]})}),e.jsx(vs,{open:pe.isOpen,onOpenChange:W=>ke(ye=>({...ye,isOpen:W})),children:e.jsxs(ds,{className:"max-w-2xl",children:[e.jsxs(us,{children:[e.jsx(xs,{children:"确认删除提供商"}),e.jsx(hs,{asChild:!0,children:e.jsxs("div",{className:"space-y-3",children:[e.jsxs("p",{children:["您即将删除以下提供商:",e.jsx("strong",{className:"text-foreground ml-1",children:pe.providersToDelete.join(", ")})]}),e.jsxs("p",{className:"text-yellow-600 dark:text-yellow-500 font-medium",children:["⚠️ 此操作将同时删除 ",pe.affectedModels.length," 个关联的模型:"]}),e.jsx(Ye,{className:"h-32 w-full rounded border p-3",children:e.jsx("div",{className:"space-y-1",children:pe.affectedModels.map((W,ye)=>e.jsxs("div",{className:"text-sm",children:[e.jsx("span",{className:"font-mono text-muted-foreground",children:"•"}),e.jsx("span",{className:"ml-2 font-medium",children:W.name}),e.jsxs("span",{className:"ml-2 text-xs text-muted-foreground",children:["(",W.model_identifier,")"]})]},ye))})}),e.jsx("p",{className:"text-sm text-muted-foreground",children:"这些模型将从模型列表和所有任务分配中移除。此操作无法撤销。"})]})})]}),e.jsxs(ms,{children:[e.jsx(ps,{onClick:q,children:"取消"}),e.jsx(fs,{onClick:mt,className:"bg-destructive text-destructive-foreground hover:bg-destructive/90",children:"确认删除"})]})]})}),e.jsx(Jn,{})]})}function Xi(){return typeof crypto<"u"&&typeof crypto.randomUUID=="function"?crypto.randomUUID():`${Date.now().toString(36)}-${Math.random().toString(36).substring(2,11)}`}function Tm(l){return l===null?"null":Array.isArray(l)?"array":typeof l=="object"?"object":typeof l=="boolean"?"boolean":typeof l=="number"?"number":"string"}function Im(l){return Object.entries(l).map(([n,i])=>{const c=Tm(i),u={id:Xi(),key:n,value:i,type:c,expanded:!0};return c==="object"&&i&&typeof i=="object"?u.children=Im(i):c==="array"&&Array.isArray(i)&&(u.children=i.map((x,h)=>{const f=Tm(x),p={id:Xi(),key:String(h),value:x,type:f,expanded:!0};return f==="object"&&x&&typeof x=="object"?p.children=Im(x):f==="array"&&Array.isArray(x)&&(p.children=x.map((g,N)=>({id:Xi(),key:String(N),value:g,type:Tm(g),expanded:!0}))),p})),u})}function Pm(l){const n={};for(const i of l)i.key.trim()&&(i.type==="object"&&i.children?n[i.key]=Pm(i.children):i.type==="array"&&i.children?n[i.key]=i.children.map(c=>c.type==="object"&&c.children?Pm(c.children):c.type==="array"&&c.children?c.children.map(u=>u.value):c.value):i.type==="null"?n[i.key]=null:n[i.key]=i.value);return n}function Sg(l,n){switch(n){case"boolean":return l==="true";case"number":{const i=parseFloat(l);return isNaN(i)?0:i}case"null":return null;default:return l}}function yv({node:l,level:n,onUpdate:i,onRemove:c,onAddChild:u,onToggleExpand:x}){const h=l.type==="object"||l.type==="array",f=l.children&&l.children.length>0;return e.jsxs("div",{className:"space-y-1",children:[e.jsxs("div",{className:"grid gap-2 items-center",style:{gridTemplateColumns:h?"32px 1fr 90px 64px":"32px 1fr 1fr 90px 32px",paddingLeft:`${n*20}px`},children:[e.jsx(_,{type:"button",variant:"ghost",size:"icon",className:"h-7 w-7",onClick:()=>x(l.id),disabled:!h||!f,children:h&&f?l.expanded?e.jsx(Ma,{className:"h-4 w-4"}):e.jsx(Zt,{className:"h-4 w-4"}):e.jsx("span",{className:"w-4"})}),e.jsx(le,{value:l.key,onChange:p=>i(l.id,"key",p.target.value),placeholder:"key",className:"h-8 text-sm"}),!h&&e.jsx(e.Fragment,{children:l.type==="boolean"?e.jsxs("div",{className:"flex items-center h-8 px-3 border rounded-md bg-background",children:[e.jsx(Fe,{checked:l.value===!0,onCheckedChange:p=>i(l.id,"value",p)}),e.jsx("span",{className:"ml-2 text-sm text-muted-foreground",children:l.value?"true":"false"})]}):l.type==="null"?e.jsx("div",{className:"flex items-center h-8 px-3 border rounded-md bg-muted text-sm text-muted-foreground",children:"null"}):e.jsx(le,{type:l.type==="number"?"number":"text",value:l.value,onChange:p=>i(l.id,"value",p.target.value),placeholder:"value",className:"h-8 text-sm",step:l.type==="number"?"any":void 0})}),e.jsxs(Ie,{value:l.type,onValueChange:p=>i(l.id,"type",p),children:[e.jsx($e,{className:"h-8 text-xs",children:e.jsx(Pe,{})}),e.jsxs(Be,{children:[e.jsx(X,{value:"string",children:"字符串"}),e.jsx(X,{value:"number",children:"数字"}),e.jsx(X,{value:"boolean",children:"布尔"}),e.jsx(X,{value:"null",children:"Null"}),e.jsx(X,{value:"object",children:"对象"}),e.jsx(X,{value:"array",children:"数组"})]})]}),e.jsxs("div",{className:"flex gap-1 justify-end",children:[h&&e.jsx(_,{type:"button",variant:"ghost",size:"icon",className:"h-8 w-8 text-muted-foreground hover:text-primary",onClick:()=>u(l.id),title:"添加子项",children:e.jsx(et,{className:"h-4 w-4"})}),e.jsx(_,{type:"button",variant:"ghost",size:"icon",className:"h-8 w-8 text-muted-foreground hover:text-destructive",onClick:()=>c(l.id),title:"删除",children:e.jsx(ls,{className:"h-4 w-4"})})]})]}),h&&l.expanded&&l.children&&l.children.length>0&&e.jsx("div",{className:"space-y-1",children:l.children.map(p=>e.jsx(yv,{node:p,level:n+1,onUpdate:i,onRemove:c,onAddChild:u,onToggleExpand:x},p.id))})]})}function iS({value:l,onChange:n,placeholder:i="添加参数..."}){const[c,u]=d.useState(()=>Im(l||{})),x=d.useCallback(v=>{u(v),n(Pm(v))},[n]),h=d.useCallback(()=>{const v={id:Xi(),key:"",value:"",type:"string",expanded:!1};x([...c,v])},[c,x]),f=d.useCallback((v,y,w)=>{const b=R=>R.map(D=>{if(D.id===v)if(y==="type"){const S=w;if(S==="object")return{...D,type:S,value:{},children:[]};if(S==="array")return{...D,type:S,value:[],children:[]};if(S==="null")return{...D,type:S,value:null};{const P=Sg(String(D.value),S);return{...D,type:S,value:P,children:void 0}}}else if(y==="value"){const S=Sg(String(w),D.type);return{...D,value:S}}else return{...D,[y]:String(w)};return D.children?{...D,children:b(D.children)}:D});x(b(c))},[c,x]),p=d.useCallback(v=>{const y=w=>w.filter(b=>b.id!==v).map(b=>b.children?{...b,children:y(b.children)}:b);x(y(c))},[c,x]),g=d.useCallback(v=>{const y=w=>w.map(b=>{if(b.id===v){const R={id:Xi(),key:b.type==="array"?String(b.children?.length||0):"",value:"",type:"string",expanded:!0};return{...b,children:[...b.children||[],R]}}return b.children?{...b,children:y(b.children)}:b});x(y(c))},[c,x]),N=d.useCallback(v=>{const y=w=>w.map(b=>b.id===v?{...b,expanded:!b.expanded}:b.children?{...b,children:y(b.children)}:b);u(y(c))},[c]);return e.jsxs("div",{className:"h-full flex flex-col gap-2",children:[e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsxs("span",{className:"text-xs text-muted-foreground",children:[c.length," 个参数"]}),e.jsxs(_,{type:"button",size:"sm",variant:"outline",onClick:h,className:"h-7 text-xs",children:[e.jsx(et,{className:"h-3 w-3 mr-1"}),"添加参数"]})]}),e.jsx("div",{className:"flex-1 overflow-y-auto space-y-1",children:c.length===0?e.jsx("div",{className:"text-sm text-muted-foreground text-center py-4 border border-dashed rounded-md",children:i}):e.jsxs("div",{className:"space-y-1",children:[e.jsxs("div",{className:"grid gap-2 text-xs text-muted-foreground px-1 sticky top-0 bg-background z-10",style:{gridTemplateColumns:"32px 1fr 1fr 90px 32px"},children:[e.jsx("span",{}),e.jsx("span",{children:"键名"}),e.jsx("span",{children:"值"}),e.jsx("span",{children:"类型"}),e.jsx("span",{})]}),c.map(v=>e.jsx(yv,{node:v,level:0,onUpdate:f,onRemove:p,onAddChild:g,onToggleExpand:N},v.id))]})})]})}function kg(l){if(!l.trim())return{valid:!0,parsed:{}};try{const n=JSON.parse(l);return typeof n!="object"||n===null||Array.isArray(n)?{valid:!1,error:"必须是一个 JSON 对象 {}"}:{valid:!0,parsed:n}}catch{return{valid:!1,error:"JSON 格式错误"}}}function cS({value:l,onChange:n,className:i,placeholder:c="添加额外参数..."}){const[u,x]=d.useState("list"),h=d.useMemo(()=>Object.keys(l||{}).length>0?JSON.stringify(l,null,2):"",[l]),[f,p]=d.useState(h),[g,N]=d.useState(null);d.useEffect(()=>{p(h)},[h]);const v=d.useMemo(()=>{const b=kg(f);return b.valid&&b.parsed?{success:!0,data:b.parsed}:{success:!1,data:{}}},[f]),y=d.useCallback(b=>{const R=b;R==="json"&&u==="list"&&(p(Object.keys(l).length>0?JSON.stringify(l,null,2):""),N(null)),x(R)},[u,l]),w=d.useCallback(b=>{p(b);const R=kg(b);R.valid&&R.parsed?(N(null),n(R.parsed)):N(R.error||"JSON 格式错误")},[n]);return e.jsx("div",{className:I("h-full flex flex-col",i),children:e.jsxs(ta,{value:u,onValueChange:y,className:"w-full flex-1 flex flex-col",children:[e.jsxs(Xt,{className:"h-8 p-0.5 bg-muted/60 w-fit",children:[e.jsx(Je,{value:"list",className:"h-7 px-3 text-xs data-[state=active]:bg-background data-[state=active]:shadow-sm",children:"可视化编辑"}),e.jsx(Je,{value:"json",className:"h-7 px-3 text-xs data-[state=active]:bg-background data-[state=active]:shadow-sm",children:"JSON 编辑"})]}),e.jsx(ys,{value:"list",className:"mt-2 flex-1 flex flex-col overflow-hidden data-[state=inactive]:hidden data-[state=inactive]:h-0",children:e.jsx(iS,{value:l,onChange:n,placeholder:c})}),e.jsx(ys,{value:"json",className:"mt-2 flex-1 flex flex-col overflow-hidden data-[state=inactive]:hidden data-[state=inactive]:h-0",children:e.jsxs("div",{className:"grid grid-cols-1 md:grid-cols-2 gap-3 flex-1 overflow-hidden",children:[e.jsxs("div",{className:"flex flex-col gap-2 overflow-hidden",children:[e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsx("span",{className:"text-xs text-muted-foreground",children:"编辑"}),g?e.jsxs("div",{className:"flex items-center gap-1 text-xs text-destructive",children:[e.jsx(wt,{className:"h-3 w-3"}),e.jsx("span",{className:"truncate max-w-[150px]",children:g})]}):f.trim()&&e.jsxs("div",{className:"flex items-center gap-1 text-xs text-green-600 dark:text-green-400",children:[e.jsx(kt,{className:"h-3 w-3"}),e.jsx("span",{children:"有效"})]})]}),e.jsx(ot,{value:f,onChange:b=>w(b.target.value),placeholder:`{ +reaction = "${T.reaction}"`;return e.jsxs(ol,{children:[e.jsx(dl,{asChild:!0,children:e.jsxs(_,{variant:"outline",size:"sm",children:[e.jsx(ia,{className:"h-4 w-4 mr-1"}),"预览"]})}),e.jsx(Wa,{className:"w-[95vw] sm:w-[500px]",children:e.jsxs("div",{className:"space-y-2",children:[e.jsx("h4",{className:"font-medium text-sm",children:"配置预览"}),e.jsx(Ye,{className:"h-60 rounded-md bg-muted p-3",children:e.jsx("pre",{className:"font-mono text-xs whitespace-pre-wrap break-all",children:A})}),e.jsx("p",{className:"text-xs text-muted-foreground",children:"这是保存到 bot_config.toml 文件中的格式"})]})})]})};return e.jsxs("div",{className:"space-y-6",children:[e.jsxs("div",{className:"rounded-lg border bg-card p-4 sm:p-6 space-y-6",children:[e.jsxs("div",{children:[e.jsx("h3",{className:"text-lg font-semibold mb-2",children:"关键词反应配置"}),e.jsx("p",{className:"text-sm text-muted-foreground",children:"配置触发特定反应的关键词和正则表达式规则"})]}),e.jsxs("div",{className:"space-y-4",children:[e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsxs("div",{children:[e.jsx("h4",{className:"text-base font-semibold",children:"正则表达式规则"}),e.jsx("p",{className:"text-xs text-muted-foreground mt-1",children:"使用正则表达式匹配消息内容"})]}),e.jsxs(_,{onClick:g,size:"sm",variant:"outline",children:[e.jsx(et,{className:"h-4 w-4 mr-1"}),"添加正则规则"]})]}),e.jsxs("div",{className:"space-y-3",children:[n.regex_rules.map((T,A)=>e.jsxs("div",{className:"rounded-lg border p-4 space-y-3",children:[e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsxs("span",{className:"text-sm font-medium",children:["正则规则 ",A+1]}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(z2,{regex:T.regex&&T.regex[0]||"",reaction:T.reaction,onRegexChange:F=>v(A,"regex",F),onReactionChange:F=>v(A,"reaction",F)}),e.jsx(P,{rule:T}),e.jsxs(vs,{children:[e.jsx(wt,{asChild:!0,children:e.jsx(_,{size:"sm",variant:"ghost",children:e.jsx(ls,{className:"h-4 w-4"})})}),e.jsxs(ds,{children:[e.jsxs(us,{children:[e.jsx(xs,{children:"确认删除"}),e.jsxs(hs,{children:["确定要删除正则规则 ",A+1," 吗?此操作无法撤销。"]})]}),e.jsxs(ms,{children:[e.jsx(ps,{children:"取消"}),e.jsx(fs,{onClick:()=>N(A),children:"删除"})]})]})]})]})]}),e.jsxs("div",{className:"space-y-3",children:[e.jsxs("div",{className:"grid gap-2",children:[e.jsx(E,{className:"text-xs font-medium",children:"正则表达式(Python 语法)"}),e.jsx(le,{value:T.regex&&T.regex[0]||"",onChange:F=>v(A,"regex",F.target.value),placeholder:"例如:^(?P\\\\S{1,20})是这样的$ (点击正则编辑器按钮可视化构建)",className:"font-mono text-sm"}),e.jsx("p",{className:"text-xs text-muted-foreground",children:'支持命名捕获组 (?Ppattern),可在 reaction 中使用 [name] 引用。点击"正则编辑器"可视化构建和测试!'})]}),e.jsxs("div",{className:"grid gap-2",children:[e.jsx(E,{className:"text-xs font-medium",children:"反应内容"}),e.jsx(ot,{value:T.reaction,onChange:F=>v(A,"reaction",F.target.value),placeholder:`触发后麦麦的反应... +可以使用 [捕获组名] 来引用正则表达式中的内容`,rows:3,className:"text-sm"}),e.jsx("p",{className:"text-xs text-muted-foreground",children:"使用 [捕获组名] 引用正则表达式中的命名捕获组,例如 [n] 会被替换为捕获的内容"})]})]})]},A)),n.regex_rules.length===0&&e.jsx("div",{className:"text-center py-8 text-muted-foreground",children:'暂无正则规则,点击"添加正则规则"开始配置'})]})]}),e.jsxs("div",{className:"space-y-4 border-t pt-6",children:[e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsxs("div",{children:[e.jsx("h4",{className:"text-base font-semibold",children:"关键词规则"}),e.jsx("p",{className:"text-xs text-muted-foreground mt-1",children:"使用关键词列表匹配消息内容"})]}),e.jsxs(_,{onClick:y,size:"sm",variant:"outline",children:[e.jsx(et,{className:"h-4 w-4 mr-1"}),"添加关键词规则"]})]}),e.jsxs("div",{className:"space-y-3",children:[n.keyword_rules.map((T,A)=>e.jsxs("div",{className:"rounded-lg border p-4 space-y-3",children:[e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsxs("span",{className:"text-sm font-medium",children:["关键词规则 ",A+1]}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(M,{rule:T}),e.jsxs(vs,{children:[e.jsx(wt,{asChild:!0,children:e.jsx(_,{size:"sm",variant:"ghost",children:e.jsx(ls,{className:"h-4 w-4"})})}),e.jsxs(ds,{children:[e.jsxs(us,{children:[e.jsx(xs,{children:"确认删除"}),e.jsxs(hs,{children:["确定要删除关键词规则 ",A+1," 吗?此操作无法撤销。"]})]}),e.jsxs(ms,{children:[e.jsx(ps,{children:"取消"}),e.jsx(fs,{onClick:()=>w(A),children:"删除"})]})]})]})]})]}),e.jsxs("div",{className:"space-y-3",children:[e.jsxs("div",{className:"grid gap-2",children:[e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsx(E,{className:"text-xs font-medium",children:"关键词列表"}),e.jsxs(_,{onClick:()=>R(A),size:"sm",variant:"ghost",children:[e.jsx(et,{className:"h-3 w-3 mr-1"}),"添加关键词"]})]}),e.jsxs("div",{className:"space-y-2",children:[(T.keywords||[]).map((F,L)=>e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(le,{value:F,onChange:J=>S(A,L,J.target.value),placeholder:"关键词",className:"flex-1"}),e.jsx(_,{onClick:()=>D(A,L),size:"sm",variant:"ghost",children:e.jsx(ls,{className:"h-4 w-4"})})]},L)),(!T.keywords||T.keywords.length===0)&&e.jsx("p",{className:"text-xs text-muted-foreground text-center py-2",children:'暂无关键词,点击"添加关键词"开始配置'})]})]}),e.jsxs("div",{className:"grid gap-2",children:[e.jsx(E,{className:"text-xs font-medium",children:"反应内容"}),e.jsx(ot,{value:T.reaction,onChange:F=>b(A,"reaction",F.target.value),placeholder:"触发后麦麦的反应...",rows:3,className:"text-sm"})]})]})]},A)),n.keyword_rules.length===0&&e.jsx("div",{className:"text-center py-8 text-muted-foreground",children:'暂无关键词规则,点击"添加关键词规则"开始配置'})]})]})]}),e.jsxs("div",{className:"rounded-lg border bg-card p-4 sm:p-6 space-y-6",children:[e.jsxs("div",{children:[e.jsx("h3",{className:"text-lg font-semibold mb-4",children:"回复后处理配置"}),e.jsxs("div",{className:"flex items-center space-x-2",children:[e.jsx(Fe,{id:"enable_response_post_process",checked:i.enable_response_post_process,onCheckedChange:T=>h({...i,enable_response_post_process:T})}),e.jsx(E,{htmlFor:"enable_response_post_process",className:"cursor-pointer",children:"启用回复后处理"})]}),e.jsx("p",{className:"text-xs text-muted-foreground mt-2",children:"包括错别字生成器和回复分割器"})]}),i.enable_response_post_process&&e.jsxs(e.Fragment,{children:[e.jsx("div",{className:"border-t pt-6 space-y-4",children:e.jsxs("div",{children:[e.jsxs("div",{className:"flex items-center space-x-2 mb-4",children:[e.jsx(Fe,{id:"enable_chinese_typo",checked:c.enable,onCheckedChange:T=>f({...c,enable:T})}),e.jsx(E,{htmlFor:"enable_chinese_typo",className:"cursor-pointer font-semibold",children:"中文错别字生成器"})]}),e.jsx("p",{className:"text-xs text-muted-foreground mb-4",children:"为回复添加随机错别字,让麦麦的回复更自然"}),c.enable&&e.jsxs("div",{className:"grid gap-4 pl-6 border-l-2 border-primary/20",children:[e.jsxs("div",{className:"grid gap-2",children:[e.jsx(E,{htmlFor:"error_rate",className:"text-xs font-medium",children:"单字替换概率"}),e.jsx(le,{id:"error_rate",type:"number",step:"0.001",min:"0",max:"1",value:c.error_rate,onChange:T=>f({...c,error_rate:parseFloat(T.target.value)})})]}),e.jsxs("div",{className:"grid gap-2",children:[e.jsx(E,{htmlFor:"min_freq",className:"text-xs font-medium",children:"最小字频阈值"}),e.jsx(le,{id:"min_freq",type:"number",min:"0",value:c.min_freq,onChange:T=>f({...c,min_freq:parseInt(T.target.value)})})]}),e.jsxs("div",{className:"grid gap-2",children:[e.jsx(E,{htmlFor:"tone_error_rate",className:"text-xs font-medium",children:"声调错误概率"}),e.jsx(le,{id:"tone_error_rate",type:"number",step:"0.01",min:"0",max:"1",value:c.tone_error_rate,onChange:T=>f({...c,tone_error_rate:parseFloat(T.target.value)})})]}),e.jsxs("div",{className:"grid gap-2",children:[e.jsx(E,{htmlFor:"word_replace_rate",className:"text-xs font-medium",children:"整词替换概率"}),e.jsx(le,{id:"word_replace_rate",type:"number",step:"0.001",min:"0",max:"1",value:c.word_replace_rate,onChange:T=>f({...c,word_replace_rate:parseFloat(T.target.value)})})]})]})]})}),e.jsx("div",{className:"border-t pt-6 space-y-4",children:e.jsxs("div",{children:[e.jsxs("div",{className:"flex items-center space-x-2 mb-4",children:[e.jsx(Fe,{id:"enable_response_splitter",checked:u.enable,onCheckedChange:T=>p({...u,enable:T})}),e.jsx(E,{htmlFor:"enable_response_splitter",className:"cursor-pointer font-semibold",children:"回复分割器"})]}),e.jsx("p",{className:"text-xs text-muted-foreground mb-4",children:"控制回复的长度和句子数量"}),u.enable&&e.jsxs("div",{className:"grid gap-4 pl-6 border-l-2 border-primary/20",children:[e.jsxs("div",{className:"grid gap-2",children:[e.jsx(E,{htmlFor:"max_length",className:"text-xs font-medium",children:"最大长度"}),e.jsx(le,{id:"max_length",type:"number",min:"1",value:u.max_length,onChange:T=>p({...u,max_length:parseInt(T.target.value)})}),e.jsx("p",{className:"text-xs text-muted-foreground",children:"回复允许的最大字符数"})]}),e.jsxs("div",{className:"grid gap-2",children:[e.jsx(E,{htmlFor:"max_sentence_num",className:"text-xs font-medium",children:"最大句子数"}),e.jsx(le,{id:"max_sentence_num",type:"number",min:"1",value:u.max_sentence_num,onChange:T=>p({...u,max_sentence_num:parseInt(T.target.value)})}),e.jsx("p",{className:"text-xs text-muted-foreground",children:"回复允许的最大句子数量"})]}),e.jsxs("div",{className:"flex items-center space-x-2",children:[e.jsx(Fe,{id:"enable_kaomoji_protection",checked:u.enable_kaomoji_protection,onCheckedChange:T=>p({...u,enable_kaomoji_protection:T})}),e.jsx(E,{htmlFor:"enable_kaomoji_protection",className:"cursor-pointer",children:"启用颜文字保护"})]}),e.jsxs("div",{className:"flex items-center space-x-2",children:[e.jsx(Fe,{id:"enable_overflow_return_all",checked:u.enable_overflow_return_all,onCheckedChange:T=>p({...u,enable_overflow_return_all:T})}),e.jsx(E,{htmlFor:"enable_overflow_return_all",className:"cursor-pointer",children:"超出时一次性返回全部"})]}),e.jsx("p",{className:"text-xs text-muted-foreground -mt-2",children:"当句子数量超出限制时,合并后一次性返回所有内容"})]})]})})]})]})]})}),O2=As.memo(function({config:n,onChange:i}){const[c,u]=d.useState(""),[x,h]=d.useState(""),[f,p]=d.useState(!1),g=n.allowed_ips?n.allowed_ips.split(",").map(S=>S.trim()).filter(S=>S):[],N=n.trusted_proxies?n.trusted_proxies.split(",").map(S=>S.trim()).filter(S=>S):[],v=()=>{if(!c.trim())return;const S=[...g,c.trim()];i({...n,allowed_ips:S.join(",")}),u("")},y=S=>{const P=g.filter((M,T)=>T!==S);i({...n,allowed_ips:P.join(",")})},w=()=>{if(!x.trim())return;const S=[...N,x.trim()];i({...n,trusted_proxies:S.join(",")}),h("")},b=S=>{const P=N.filter((M,T)=>T!==S);i({...n,trusted_proxies:P.join(",")})},R=S=>{!S&&n.enabled?p(!0):i({...n,enabled:S})},D=()=>{i({...n,enabled:!1}),p(!1)};return e.jsxs("div",{className:"rounded-lg border bg-card p-4 sm:p-6 space-y-4",children:[e.jsx("h3",{className:"text-lg font-semibold",children:"WebUI 服务配置"}),e.jsxs("div",{className:"grid gap-4",children:[e.jsxs("div",{className:"flex items-center space-x-2",children:[e.jsx(Fe,{checked:n.enabled,onCheckedChange:R}),e.jsx(E,{className:"cursor-pointer",children:"启用 WebUI"})]}),n.enabled&&e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"grid gap-2",children:[e.jsx(E,{children:"运行模式"}),e.jsxs(Ie,{value:n.mode,onValueChange:S=>i({...n,mode:S}),children:[e.jsx($e,{children:e.jsx(Pe,{placeholder:"选择运行模式"})}),e.jsxs(Be,{children:[e.jsx(X,{value:"development",children:"开发模式"}),e.jsx(X,{value:"production",children:"生产模式"})]})]}),e.jsx("p",{className:"text-xs text-muted-foreground",children:"注意: WebUI 的监听地址和端口请在 .env 文件中配置 WEBUI_HOST 和 WEBUI_PORT"})]}),e.jsxs("div",{className:"grid gap-2",children:[e.jsx(E,{children:"防爬虫模式"}),e.jsxs(Ie,{value:n.anti_crawler_mode,onValueChange:S=>i({...n,anti_crawler_mode:S}),children:[e.jsx($e,{children:e.jsx(Pe,{placeholder:"选择防爬虫模式"})}),e.jsxs(Be,{children:[e.jsx(X,{value:"false",children:"禁用"}),e.jsx(X,{value:"basic",children:"基础(只记录不阻止)"}),e.jsx(X,{value:"loose",children:"宽松"}),e.jsx(X,{value:"strict",children:"严格"})]})]})]}),e.jsxs("div",{className:"grid gap-2 sm:col-span-2",children:[e.jsx(E,{children:"IP 白名单"}),e.jsxs("div",{className:"flex gap-2",children:[e.jsx(le,{value:c,onChange:S=>u(S.target.value),onKeyDown:S=>{S.key==="Enter"&&(S.preventDefault(),v())},placeholder:"输入IP地址后按回车或点击添加"}),e.jsx(_,{type:"button",size:"sm",onClick:v,disabled:!c.trim(),children:e.jsx(et,{className:"h-4 w-4"})})]}),g.length>0&&e.jsx("div",{className:"flex flex-wrap gap-2 mt-2",children:g.map((S,P)=>e.jsxs(Se,{variant:"secondary",className:"flex items-center gap-1",children:[S,e.jsx("button",{type:"button",onClick:()=>y(P),className:"ml-1 hover:bg-destructive/20 rounded-full p-0.5",children:e.jsx(Ea,{className:"h-3 w-3"})})]},P))}),e.jsx("p",{className:"text-xs text-muted-foreground",children:"支持精确IP、CIDR格式和通配符(如:127.0.0.1、192.168.1.0/24)"})]}),e.jsxs("div",{className:"grid gap-2 sm:col-span-2",children:[e.jsx(E,{children:"信任的代理 IP"}),e.jsxs("div",{className:"flex gap-2",children:[e.jsx(le,{value:x,onChange:S=>h(S.target.value),onKeyDown:S=>{S.key==="Enter"&&(S.preventDefault(),w())},placeholder:"输入代理IP后按回车或点击添加"}),e.jsx(_,{type:"button",size:"sm",onClick:w,disabled:!x.trim(),children:e.jsx(et,{className:"h-4 w-4"})})]}),N.length>0&&e.jsx("div",{className:"flex flex-wrap gap-2 mt-2",children:N.map((S,P)=>e.jsxs(Se,{variant:"secondary",className:"flex items-center gap-1",children:[S,e.jsx("button",{type:"button",onClick:()=>b(P),className:"ml-1 hover:bg-destructive/20 rounded-full p-0.5",children:e.jsx(Ea,{className:"h-3 w-3"})})]},P))}),e.jsx("p",{className:"text-xs text-muted-foreground",children:"只有来自这些IP的X-Forwarded-For头才被信任"})]}),e.jsxs("div",{className:"flex items-center space-x-2",children:[e.jsx(Fe,{checked:n.trust_xff,onCheckedChange:S=>i({...n,trust_xff:S})}),e.jsx(E,{className:"cursor-pointer",children:"启用 X-Forwarded-For 代理解析"})]}),e.jsxs("div",{className:"flex items-center space-x-2",children:[e.jsx(Fe,{checked:n.secure_cookie,onCheckedChange:S=>i({...n,secure_cookie:S})}),e.jsx(E,{className:"cursor-pointer",children:"启用安全 Cookie(仅 HTTPS)"})]})]})]}),e.jsx(vs,{open:f,onOpenChange:p,children:e.jsxs(ds,{children:[e.jsxs(us,{children:[e.jsx(xs,{children:"警告:即将关闭 WebUI"}),e.jsxs(hs,{children:["关闭 WebUI 后,在您下次重启麦麦之前,WebUI 界面将无法访问。",e.jsx("br",{}),e.jsx("br",{}),"您需要通过修改配置文件或命令行重新启用 WebUI 才能再次访问此界面。",e.jsx("br",{}),e.jsx("br",{}),"确定要关闭 WebUI 吗?"]})]}),e.jsxs(ms,{children:[e.jsx(ps,{children:"取消"}),e.jsx(fs,{variant:"destructive",onClick:D,children:"确认关闭"})]})]})})]})}),Nn="/api/webui/config";async function bg(){const n=await(await we(`${Nn}/bot`)).json();if(!n.success)throw new Error("获取配置数据失败");return n.config}async function un(){const n=await(await we(`${Nn}/model`)).json();if(!n.success)throw new Error("获取模型配置数据失败");return n.config}async function yg(l){const i=await(await we(`${Nn}/bot`,{method:"POST",body:JSON.stringify(l)})).json();if(!i.success)throw new Error(i.message||"保存配置失败")}async function D2(){const n=await(await we(`${Nn}/bot/raw`)).json();if(!n.success)throw new Error("获取配置源代码失败");return n.content}async function R2(l){const i=await(await we(`${Nn}/bot/raw`,{method:"POST",body:JSON.stringify({raw_content:l})})).json();if(!i.success)throw new Error(i.message||"保存配置失败")}async function Ji(l){const i=await(await we(`${Nn}/model`,{method:"POST",body:JSON.stringify(l)})).json();if(!i.success)throw new Error(i.message||"保存配置失败")}async function L2(l,n){const c=await(await we(`${Nn}/bot/section/${l}`,{method:"POST",body:JSON.stringify(n)})).json();if(!c.success)throw new Error(c.message||`保存配置节 ${l} 失败`)}async function Bm(l,n){const c=await(await we(`${Nn}/model/section/${l}`,{method:"POST",body:JSON.stringify(n)})).json();if(!c.success)throw new Error(c.message||`保存配置节 ${l} 失败`)}async function U2(l,n="openai",i="/models"){const c=new URLSearchParams({provider_name:l,parser:n,endpoint:i}),u=await we(`/api/webui/models/list?${c}`);if(!u.ok){const h=await u.json().catch(()=>({}));throw new Error(h.detail||`获取模型列表失败 (${u.status})`)}const x=await u.json();if(!x.success)throw new Error("获取模型列表失败");return x.models}async function $2(l){const n=new URLSearchParams({provider_name:l}),i=await we(`/api/webui/models/test-connection-by-name?${n}`,{method:"POST"});if(!i.ok){const c=await i.json().catch(()=>({}));throw new Error(c.detail||`测试连接失败 (${i.status})`)}return await i.json()}const B2=Kr("relative w-full rounded-lg border px-4 py-3 text-sm [&>svg+div]:translate-y-[-3px] [&>svg]:absolute [&>svg]:left-4 [&>svg]:top-4 [&>svg]:text-foreground [&>svg~*]:pl-7",{variants:{variant:{default:"bg-background text-foreground",destructive:"border-destructive/50 text-destructive dark:border-destructive [&>svg]:text-destructive"}},defaultVariants:{variant:"default"}}),at=d.forwardRef(({className:l,variant:n,...i},c)=>e.jsx("div",{ref:c,role:"alert",className:I(B2({variant:n}),l),...i}));at.displayName="Alert";const Hn=d.forwardRef(({className:l,...n},i)=>e.jsx("h5",{ref:i,className:I("mb-1 font-medium leading-none tracking-tight",l),...n}));Hn.displayName="AlertTitle";const lt=d.forwardRef(({className:l,...n},i)=>e.jsx("div",{ref:i,className:I("text-sm [&_p]:leading-relaxed",l),...n}));lt.displayName="AlertDescription";const I2={name:"toml",startState:function(){return{inString:!1,stringType:"",lhs:!0,inArray:0}},token:function(l,n){let i;if(!n.inString&&(i=l.match(/^('''|"""|'|")/))&&(n.stringType=i[0],n.inString=!0),l.sol()&&!n.inString&&n.inArray===0&&(n.lhs=!0),n.inString){for(;n.inString;)if(l.match(n.stringType))n.inString=!1;else if(l.peek()==="\\")l.next(),l.next();else{if(l.eol())break;l.match(/^.[^\\\"\']*/)}return n.lhs?"property":"string"}else{if(n.inArray&&l.peek()==="]")return l.next(),n.inArray--,"bracket";if(n.lhs&&l.peek()==="["&&l.skipTo("]"))return l.next(),l.peek()==="]"&&l.next(),"atom";if(l.peek()==="#")return l.skipToEnd(),"comment";if(l.eatSpace())return null;if(n.lhs&&l.eatWhile(function(c){return c!="="&&c!=" "}))return"property";if(n.lhs&&l.peek()==="=")return l.next(),n.lhs=!1,null;if(!n.lhs&&l.match(/^\d\d\d\d[\d\-\:\.T]*Z/))return"atom";if(!n.lhs&&(l.match("true")||l.match("false")))return"atom";if(!n.lhs&&l.peek()==="[")return n.inArray++,l.next(),"bracket";if(!n.lhs&&l.match(/^\-?\d+(?:\.\d+)?/))return"number";l.eatSpace()||l.next()}return null},languageData:{commentTokens:{line:"#"}}},P2={python:[C_()],json:[T_(),E_()],toml:[k_.define(I2)],text:[]};function gv({value:l,onChange:n,language:i="text",readOnly:c=!1,height:u="400px",minHeight:x,maxHeight:h,placeholder:f,theme:p="dark",className:g=""}){const[N,v]=d.useState(!1);if(d.useEffect(()=>{v(!0)},[]),!N)return e.jsx("div",{className:`rounded-md border bg-muted animate-pulse ${g}`,style:{height:u,minHeight:x,maxHeight:h}});const y=[...P2[i]||[],dg.lineWrapping];return c&&y.push(dg.editable.of(!1)),e.jsx("div",{className:`rounded-md overflow-hidden border ${g}`,children:e.jsx(M_,{value:l,height:u,minHeight:x,maxHeight:h,theme:p==="dark"?z_:void 0,extensions:y,onChange:n,placeholder:f,basicSetup:{lineNumbers:!0,highlightActiveLineGutter:!0,highlightSpecialChars:!0,history:!0,foldGutter:!0,drawSelection:!0,dropCursor:!0,allowMultipleSelections:!0,indentOnInput:!0,syntaxHighlighting:!0,bracketMatching:!0,closeBrackets:!0,autocompletion:!0,rectangularSelection:!0,crosshairCursor:!0,highlightActiveLine:!0,highlightSelectionMatches:!0,closeBracketsKeymap:!0,defaultKeymap:!0,searchKeymap:!0,historyKeymap:!0,foldKeymap:!0,completionKeymap:!0,lintKeymap:!0}})})}function H2({id:l,index:n,itemType:i,itemFields:c,value:u,onChange:x,onRemove:h,disabled:f,canRemove:p,placeholder:g}){const{attributes:N,listeners:v,setNodeRef:y,transform:w,transition:b,isDragging:R}=Wj({id:l,disabled:f}),D={transform:ev.Transform.toString(w),transition:b};return e.jsxs("div",{ref:y,style:D,className:I("flex items-start gap-2 group",R&&"opacity-50 z-50"),children:[e.jsx("button",{type:"button",className:I("flex-shrink-0 p-2 cursor-grab active:cursor-grabbing","text-muted-foreground hover:text-foreground transition-colors","opacity-0 group-hover:opacity-100 focus:opacity-100",f&&"cursor-not-allowed opacity-30"),...N,...v,children:e.jsx(Rj,{className:"h-4 w-4"})}),e.jsx("div",{className:"flex-1 min-w-0",children:i==="object"&&c?e.jsx(F2,{value:u,onChange:x,fields:c,disabled:f}):i==="number"?e.jsx(le,{type:"number",value:u??"",onChange:S=>x(parseFloat(S.target.value)||0),placeholder:g??`第 ${n+1} 项`,disabled:f,className:"font-mono"}):e.jsx(le,{type:"text",value:u??"",onChange:S=>x(S.target.value),placeholder:g??`第 ${n+1} 项`,disabled:f})}),e.jsx(_,{type:"button",variant:"ghost",size:"icon",onClick:h,disabled:f||!p,className:I("flex-shrink-0 text-muted-foreground hover:text-destructive","opacity-0 group-hover:opacity-100 focus:opacity-100 transition-opacity"),children:e.jsx(ls,{className:"h-4 w-4"})})]})}function F2({value:l,onChange:n,fields:i,disabled:c}){const u=d.useCallback((h,f)=>{n({...l,[h]:f})},[l,n]),x=(h,f)=>{const p=l?.[h];if(f.type==="boolean"||f.type==="switch")return e.jsxs("div",{className:"flex items-center justify-between py-1",children:[e.jsx(E,{className:"text-xs text-muted-foreground",children:f.label??h}),e.jsx(Fe,{checked:!!(p??f.default),onCheckedChange:g=>u(h,g),disabled:c})]});if(f.type==="slider"||f.type==="number"&&f.min!=null&&f.max!=null){const g=p??f.default??f.min??0;return e.jsxs("div",{className:"space-y-1",children:[e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsx(E,{className:"text-xs text-muted-foreground",children:f.label??h}),e.jsx("span",{className:"text-xs text-muted-foreground",children:g})]}),e.jsx(qa,{value:[g],onValueChange:N=>u(h,N[0]),min:f.min??0,max:f.max??100,step:f.step??1,disabled:c,className:"py-1"})]})}return f.type==="select"&&f.choices?e.jsxs("div",{className:"space-y-1",children:[e.jsx(E,{className:"text-xs text-muted-foreground",children:f.label??h}),e.jsxs(Ie,{value:String(p??f.default??""),onValueChange:g=>u(h,g),disabled:c,children:[e.jsx($e,{className:"h-8 text-sm",children:e.jsx(Pe,{placeholder:f.placeholder??"请选择"})}),e.jsx(Be,{children:f.choices.map(g=>e.jsx(X,{value:String(g),children:String(g)},String(g)))})]})]}):f.type==="number"?e.jsxs("div",{className:"space-y-1",children:[e.jsx(E,{className:"text-xs text-muted-foreground",children:f.label??h}),e.jsx(le,{type:"number",value:p??f.default??"",onChange:g=>u(h,parseFloat(g.target.value)||0),placeholder:f.placeholder,disabled:c,className:"h-8 text-sm"})]}):e.jsxs("div",{className:"space-y-1",children:[e.jsx(E,{className:"text-xs text-muted-foreground",children:f.label??h}),e.jsx(le,{type:"text",value:p??f.default??"",onChange:g=>u(h,g.target.value),placeholder:f.placeholder,disabled:c,className:"h-8 text-sm"})]})};return e.jsx(Ce,{className:"p-3 space-y-2 bg-muted/30",children:Object.entries(i).map(([h,f])=>e.jsx("div",{children:x(h,f)},h))})}function G2({value:l,onChange:n,itemType:i="string",itemFields:c,minItems:u,maxItems:x,disabled:h,placeholder:f}){const p=d.useMemo(()=>Array.isArray(l)?l:typeof l=="string"&&l.trim()?l.split(",").map(M=>M.trim()):[],[l]),[g]=d.useState(()=>new Map),N=d.useCallback(M=>(g.has(M)||g.set(M,`item-${Date.now()}-${M}-${Math.random().toString(36).slice(2)}`),g.get(M)),[g]),v=d.useMemo(()=>{const M=[];for(let T=0;T{const{active:T,over:A}=M;if(A&&T.id!==A.id){const F=v.indexOf(T.id),L=v.indexOf(A.id),J=Yj(p,F,L);n(J)}},[p,v,n]),b=d.useCallback(()=>{if(x!=null&&p.length>=x)return;let M;i==="object"&&c?M=Object.fromEntries(Object.entries(c).map(([T,A])=>[T,A.default??""])):i==="number"?M=0:M="",n([...p,M])},[p,x,i,c,n]),R=d.useCallback((M,T)=>{const A=[...p];A[M]=T,n(A)},[p,n]),D=d.useCallback(M=>{if(u!=null&&p.length<=u)return;const T=p.filter((A,F)=>F!==M);g.delete(M),n(T)},[p,u,g,n]),S=x==null||p.lengthu;return e.jsxs("div",{className:"space-y-2",children:[p.length===0?e.jsxs("div",{className:"flex items-center gap-2 text-sm text-muted-foreground py-4 justify-center border border-dashed rounded-md",children:[e.jsx(_t,{className:"h-4 w-4"}),e.jsx("span",{children:"暂无数据,点击下方按钮添加"})]}):e.jsx(Jj,{sensors:y,collisionDetection:Xj,onDragEnd:w,children:e.jsx(Zj,{items:v,strategy:A_,children:e.jsx("div",{className:"space-y-2",children:p.map((M,T)=>e.jsx(H2,{id:v[T],index:T,itemType:i,itemFields:c,value:M,onChange:A=>R(T,A),onRemove:()=>D(T),disabled:h,canRemove:P,placeholder:f},v[T]))})})}),e.jsxs(_,{type:"button",variant:"outline",size:"sm",onClick:b,disabled:h||!S,className:"w-full",children:[e.jsx(et,{className:"h-4 w-4 mr-1"}),"添加项目",x!==void 0&&e.jsxs("span",{className:"ml-2 text-xs text-muted-foreground",children:["(",p.length,"/",x,")"]})]}),(u!=null||x!=null)&&(u!==null||x!==null)&&e.jsx("p",{className:"text-xs text-muted-foreground text-center",children:u!=null&&x!=null?`允许 ${u} - ${x} 项`:u!=null?`至少 ${u} 项`:`最多 ${x} 项`})]})}function tx({content:l,className:n=""}){return e.jsx("div",{className:`prose prose-sm dark:prose-invert max-w-none ${n}`,children:e.jsx($_,{remarkPlugins:[I_,P_],rehypePlugins:[B_],components:{code({inline:i,className:c,children:u,...x}){return i?e.jsx("code",{className:"bg-muted px-1.5 py-0.5 rounded text-sm font-mono",...x,children:u}):e.jsx("code",{className:`${c} block bg-muted p-4 rounded-lg overflow-x-auto`,...x,children:u})},table({children:i,...c}){return e.jsx("div",{className:"overflow-x-auto",children:e.jsx("table",{className:"border-collapse border border-border",...c,children:i})})},th({children:i,...c}){return e.jsx("th",{className:"border border-border bg-muted px-4 py-2 text-left font-semibold",...c,children:i})},td({children:i,...c}){return e.jsx("td",{className:"border border-border px-4 py-2",...c,children:i})},a({children:i,...c}){return e.jsx("a",{className:"text-primary hover:underline",target:"_blank",rel:"noopener noreferrer",...c,children:i})},blockquote({children:i,...c}){return e.jsx("blockquote",{className:"border-l-4 border-primary pl-4 italic text-muted-foreground",...c,children:i})},h1({children:i,...c}){return e.jsx("h1",{className:"text-3xl font-bold mt-6 mb-4",...c,children:i})},h2({children:i,...c}){return e.jsx("h2",{className:"text-2xl font-bold mt-5 mb-3",...c,children:i})},h3({children:i,...c}){return e.jsx("h3",{className:"text-xl font-bold mt-4 mb-2",...c,children:i})},h4({children:i,...c}){return e.jsx("h4",{className:"text-lg font-semibold mt-3 mb-2",...c,children:i})},ul({children:i,...c}){return e.jsx("ul",{className:"list-disc list-inside space-y-1 my-2",...c,children:i})},ol({children:i,...c}){return e.jsx("ol",{className:"list-decimal list-inside space-y-1 my-2",...c,children:i})},p({children:i,...c}){return e.jsx("p",{className:"my-2 leading-relaxed",...c,children:i})},hr({...i}){return e.jsx("hr",{className:"my-4 border-border",...i})}},children:l})})}function V2(l,n,i,c={}){const{debounceMs:u=2e3,onSaveSuccess:x,onSaveError:h}=c,f=d.useRef(null),p=d.useCallback(async(y,w)=>{try{n(!0),await L2(y,w),i(!1),x?.()}catch(b){console.error(`自动保存 ${y} 失败:`,b),i(!0),h?.(b instanceof Error?b:new Error(String(b)))}finally{n(!1)}},[n,i,x,h]),g=d.useCallback((y,w)=>{l||(i(!0),f.current&&clearTimeout(f.current),f.current=setTimeout(()=>{p(y,w)},u))},[l,i,p,u]),N=d.useCallback(async(y,w)=>{f.current&&(clearTimeout(f.current),f.current=null),await p(y,w)},[p]),v=d.useCallback(()=>{f.current&&(clearTimeout(f.current),f.current=null)},[]);return d.useEffect(()=>()=>{f.current&&clearTimeout(f.current)},[]),{triggerAutoSave:g,saveNow:N,cancelPendingAutoSave:v}}function Lt(l,n,i,c){d.useEffect(()=>{l&&!i&&c(n,l)},[l])}const q2=500;function K2(){return e.jsx(Yn,{children:e.jsx(Q2,{})})}function Q2(){const[l,n]=d.useState(!0),[i,c]=d.useState(!1),[u,x]=d.useState(!1),[h,f]=d.useState(!1),[p,g]=d.useState("visual"),[N,v]=d.useState(""),[y,w]=d.useState(!1),{toast:b}=Zs(),{triggerRestart:R,isRestarting:D}=vn(),[S,P]=d.useState(null),[M,T]=d.useState(null),[A,F]=d.useState(null),[L,J]=d.useState(null),[U,ue]=d.useState(null),[xe,he]=d.useState(null),[ne,ve]=d.useState(null),[je,z]=d.useState(null),[V,B]=d.useState(null),[oe,K]=d.useState(null),[_e,pe]=d.useState(null),[ke,O]=d.useState(null),[k,H]=d.useState(null),[se,Ee]=d.useState(null),[Z,Oe]=d.useState(null),[ns,Q]=d.useState(null),[ee,Ue]=d.useState(null),[ie,Te]=d.useState(null),[de,Me]=d.useState(null),rs=d.useRef(!0),Ut=d.useRef({}),aa=d.useCallback(ze=>{Ut.current=ze,P(ze.bot),T(ze.personality);const Ns=ze.chat;Ns.talk_value_rules||(Ns.talk_value_rules=[]),F(Ns),J(ze.expression),ue(ze.emoji),he(ze.memory),ve(ze.tool),z(ze.voice),B(ze.dream),K(ze.lpmm_knowledge),pe(ze.keyword_reaction),O(ze.response_post_process),H(ze.chinese_typo),Ee(ze.response_splitter),Oe(ze.log),Q(ze.debug),Ue(ze.maim_message),Te(ze.telemetry),Me(ze.webui)},[]),Qa=d.useCallback(()=>({...Ut.current,bot:S,personality:M,chat:A,expression:L,emoji:U,memory:xe,tool:ne,voice:je,dream:V,lpmm_knowledge:oe,keyword_reaction:_e,response_post_process:ke,chinese_typo:k,response_splitter:se,log:Z,debug:ns,maim_message:ee,telemetry:ie,webui:de}),[S,M,A,L,U,xe,ne,je,V,oe,_e,ke,k,se,Z,ns,ee,ie,de]),Ft=d.useCallback(async()=>{try{const Ns=(await D2()).replace(/"([^"]*)"/g,(as,es)=>`"${es.replace(/\\n/g,` +`).replace(/\\t/g," ").replace(/\\r/g,"\r").replace(/\\"/g,'"').replace(/\\\\/g,"\\")}"`);v(Ns),w(!1)}catch(ze){b({variant:"destructive",title:"加载失败",description:ze instanceof Error?ze.message:"加载源代码失败"})}},[b]),mt=d.useCallback(async()=>{try{n(!0);const ze=await bg();aa(ze),f(!1),rs.current=!1,await Ft()}catch(ze){console.error("加载配置失败:",ze),b({title:"加载失败",description:"无法加载配置文件",variant:"destructive"})}finally{n(!1)}},[b,Ft,aa]);d.useEffect(()=>{mt()},[mt]);const{triggerAutoSave:q,cancelPendingAutoSave:Ve}=V2(rs.current,x,f);Lt(S,"bot",rs.current,q),Lt(M,"personality",rs.current,q),Lt(A,"chat",rs.current,q),Lt(L,"expression",rs.current,q),Lt(U,"emoji",rs.current,q),Lt(xe,"memory",rs.current,q),Lt(ne,"tool",rs.current,q),Lt(je,"voice",rs.current,q),Lt(V,"dream",rs.current,q),Lt(oe,"lpmm_knowledge",rs.current,q),Lt(_e,"keyword_reaction",rs.current,q),Lt(ke,"response_post_process",rs.current,q),Lt(k,"chinese_typo",rs.current,q),Lt(se,"response_splitter",rs.current,q),Lt(Z,"log",rs.current,q),Lt(ns,"debug",rs.current,q),Lt(ee,"maim_message",rs.current,q),Lt(ie,"telemetry",rs.current,q),Lt(de,"webui",rs.current,q);const Ke=async()=>{try{c(!0);const ze=N.replace(/"([^"]*)"/g,(Ns,as)=>`"${as.replace(/\\/g,"\\\\").replace(/"/g,'\\"').replace(/\n/g,"\\n").replace(/\t/g,"\\t").replace(/\r/g,"\\r")}"`);await R2(ze),f(!1),w(!1),b({title:"保存成功",description:"配置已保存"}),await mt()}catch(ze){w(!0),b({variant:"destructive",title:"保存失败",description:ze instanceof Error?ze.message:"保存配置失败"})}finally{c(!1)}},We=async ze=>{if(h){b({variant:"destructive",title:"切换失败",description:"请先保存当前更改"});return}if(g(ze),ze==="source")await Ft();else try{const Ns=await bg();aa(Ns),f(!1)}catch(Ns){console.error("加载配置失败:",Ns),b({title:"加载失败",description:"无法加载配置文件",variant:"destructive"})}},Ls=async()=>{try{c(!0),Ve(),await yg(Qa()),f(!1),b({title:"保存成功",description:"麦麦主程序配置已保存"})}catch(ze){console.error("保存配置失败:",ze),b({title:"保存失败",description:ze.message,variant:"destructive"})}finally{c(!1)}},ts=async()=>{await R()},Cs=async()=>{try{c(!0),Ve(),await yg(Qa()),f(!1),b({title:"保存成功",description:"配置已保存,即将重启麦麦..."}),await new Promise(ze=>setTimeout(ze,q2)),await ts()}catch(ze){console.error("保存失败:",ze),b({title:"保存失败",description:ze.message,variant:"destructive"})}finally{c(!1)}};return l?e.jsx(Ye,{className:"h-full",children:e.jsx("div",{className:"space-y-4 sm:space-y-6 p-4 sm:p-6",children:e.jsx("div",{className:"flex items-center justify-center h-64",children:e.jsx("p",{className:"text-muted-foreground",children:"加载中..."})})})}):e.jsx(Ye,{className:"h-full",children:e.jsxs("div",{className:"space-y-4 sm:space-y-6 p-4 sm:p-6",children:[e.jsxs("div",{className:"flex flex-col gap-3 sm:gap-4",children:[e.jsxs("div",{className:"flex flex-col sm:flex-row sm:items-center sm:justify-between gap-3",children:[e.jsxs("div",{className:"min-w-0",children:[e.jsx("h1",{className:"text-xl sm:text-2xl md:text-3xl font-bold",children:"麦麦主程序配置"}),e.jsx("p",{className:"text-muted-foreground mt-1 text-xs sm:text-sm",children:"管理麦麦的核心功能和行为设置"})]}),e.jsxs("div",{className:"flex gap-2 flex-shrink-0",children:[e.jsxs(_,{onClick:p==="visual"?Ls:Ke,disabled:i||u||!h||D,size:"sm",variant:"outline",className:"w-20 sm:w-24",children:[e.jsx(oc,{className:"h-4 w-4 flex-shrink-0",strokeWidth:2,fill:"none"}),e.jsx("span",{className:"ml-1 truncate text-xs sm:text-sm",children:i?"保存中":u?"自动":h?"保存":"已保存"})]}),e.jsxs(vs,{children:[e.jsx(wt,{asChild:!0,children:e.jsxs(_,{disabled:i||u||D,size:"sm",className:"w-20 sm:w-28",children:[e.jsx(cc,{className:"h-4 w-4 flex-shrink-0"}),e.jsx("span",{className:"ml-1 truncate text-xs sm:text-sm",children:D?"重启中":h?"保存重启":"重启"})]})}),e.jsxs(ds,{children:[e.jsxs(us,{children:[e.jsx(xs,{children:"确认重启麦麦?"}),e.jsx(hs,{asChild:!0,children:e.jsx("div",{children:e.jsx("p",{children:h?"当前有未保存的配置更改。点击确认将先保存配置,然后重启麦麦使新配置生效。重启过程中麦麦将暂时离线。":"即将重启麦麦主程序。重启过程中麦麦将暂时离线,配置将在重启后生效。"})})})]}),e.jsxs(ms,{children:[e.jsx(ps,{children:"取消"}),e.jsx(fs,{onClick:h?Cs:ts,children:h?"保存并重启":"确认重启"})]})]})]})]})]}),e.jsx("div",{className:"flex",children:e.jsx(ta,{value:p,onValueChange:ze=>We(ze),className:"w-full",children:e.jsxs(Xt,{className:"h-8 sm:h-9 w-full grid grid-cols-2",children:[e.jsxs(Je,{value:"visual",className:"text-xs sm:text-sm",children:[e.jsx(Lj,{className:"h-3 w-3 sm:h-4 sm:w-4 mr-1"}),"可视化编辑"]}),e.jsxs(Je,{value:"source",className:"text-xs sm:text-sm",children:[e.jsx(Uj,{className:"h-3 w-3 sm:h-4 sm:w-4 mr-1"}),"源代码编辑"]})]})})})]}),e.jsxs(at,{children:[e.jsx(Ht,{className:"h-4 w-4"}),e.jsxs(lt,{children:["配置更新后需要",e.jsx("strong",{children:"重启麦麦"}),'才能生效。你可以点击右上角的"保存并重启"按钮一键完成保存和重启。']})]}),p==="source"&&e.jsxs("div",{className:"space-y-4",children:[e.jsxs(at,{children:[e.jsx(Ht,{className:"h-4 w-4"}),e.jsxs(lt,{children:[e.jsx("strong",{children:"源代码模式(高级功能):"}),"直接编辑 TOML 配置文件。此功能仅适用于熟悉 TOML 语法的高级用户。保存时会在后端验证格式,只有格式完全正确才能保存。",y&&e.jsx("span",{className:"text-destructive font-semibold ml-2",children:"⚠️ 上次保存失败,请检查 TOML 格式"})]})]}),e.jsx(gv,{value:N,onChange:ze=>{v(ze),f(!0),y&&w(!1)},language:"toml",theme:"dark",height:"calc(100vh - 280px)",minHeight:"500px",placeholder:"TOML 配置内容"})]}),p==="visual"&&e.jsx(e.Fragment,{children:e.jsxs(ta,{defaultValue:"bot",className:"w-full",children:[e.jsxs(Xt,{className:"flex flex-wrap h-auto gap-1 p-1 sm:grid sm:grid-cols-5 lg:grid-cols-10",children:[e.jsx(Je,{value:"bot",className:"text-xs px-2 py-1.5 sm:px-3 sm:py-2 data-[state=active]:shadow-sm",children:"基本信息"}),e.jsx(Je,{value:"personality",className:"text-xs px-2 py-1.5 sm:px-3 sm:py-2 data-[state=active]:shadow-sm",children:"人格"}),e.jsx(Je,{value:"chat",className:"text-xs px-2 py-1.5 sm:px-3 sm:py-2 data-[state=active]:shadow-sm",children:"聊天"}),e.jsx(Je,{value:"expression",className:"text-xs px-2 py-1.5 sm:px-3 sm:py-2 data-[state=active]:shadow-sm",children:"表达"}),e.jsx(Je,{value:"features",className:"text-xs px-2 py-1.5 sm:px-3 sm:py-2 data-[state=active]:shadow-sm",children:"功能"}),e.jsx(Je,{value:"processing",className:"text-xs px-2 py-1.5 sm:px-3 sm:py-2 data-[state=active]:shadow-sm",children:"处理"}),e.jsx(Je,{value:"dream",className:"text-xs px-2 py-1.5 sm:px-3 sm:py-2 data-[state=active]:shadow-sm",children:"做梦"}),e.jsx(Je,{value:"lpmm",className:"text-xs px-2 py-1.5 sm:px-3 sm:py-2 data-[state=active]:shadow-sm",children:"知识库"}),e.jsx(Je,{value:"webui",className:"text-xs px-2 py-1.5 sm:px-3 sm:py-2 data-[state=active]:shadow-sm",children:"WebUI"}),e.jsx(Je,{value:"other",className:"text-xs px-2 py-1.5 sm:px-3 sm:py-2 data-[state=active]:shadow-sm",children:"其他"})]}),e.jsx(ys,{value:"bot",className:"space-y-4",children:S&&e.jsx(f2,{config:S,onChange:P})}),e.jsx(ys,{value:"personality",className:"space-y-4",children:M&&e.jsx(p2,{config:M,onChange:T})}),e.jsx(ys,{value:"chat",className:"space-y-4",children:A&&e.jsx(b2,{config:A,onChange:F})}),e.jsx(ys,{value:"expression",className:"space-y-4",children:L&&e.jsx(M2,{config:L,onChange:J})}),e.jsx(ys,{value:"features",className:"space-y-4",children:U&&xe&&ne&&je&&e.jsx(T2,{emojiConfig:U,memoryConfig:xe,toolConfig:ne,voiceConfig:je,onEmojiChange:ue,onMemoryChange:he,onToolChange:ve,onVoiceChange:z})}),e.jsx(ys,{value:"processing",className:"space-y-4",children:_e&&ke&&k&&se&&e.jsx(A2,{keywordReactionConfig:_e,responsePostProcessConfig:ke,chineseTypoConfig:k,responseSplitterConfig:se,onKeywordReactionChange:pe,onResponsePostProcessChange:O,onChineseTypoChange:H,onResponseSplitterChange:Ee})}),e.jsx(ys,{value:"dream",className:"space-y-4",children:V&&e.jsx(y2,{config:V,onChange:B})}),e.jsx(ys,{value:"lpmm",className:"space-y-4",children:oe&&e.jsx(w2,{config:oe,onChange:K})}),e.jsx(ys,{value:"webui",className:"space-y-4",children:de&&e.jsx(O2,{config:de,onChange:Me})}),e.jsxs(ys,{value:"other",className:"space-y-4",children:[Z&&e.jsx(_2,{config:Z,onChange:Oe}),ns&&e.jsx(S2,{config:ns,onChange:Q}),ee&&e.jsx(k2,{config:ee,onChange:Ue}),ie&&e.jsx(C2,{config:ie,onChange:Te})]})]})}),e.jsx(Jn,{})]})})}const Rl=d.forwardRef(({className:l,...n},i)=>e.jsx("div",{className:"relative w-full overflow-auto",children:e.jsx("table",{ref:i,className:I("w-full caption-bottom text-sm",l),...n})}));Rl.displayName="Table";const Ll=d.forwardRef(({className:l,...n},i)=>e.jsx("thead",{ref:i,className:I("[&_tr]:border-b",l),...n}));Ll.displayName="TableHeader";const Ul=d.forwardRef(({className:l,...n},i)=>e.jsx("tbody",{ref:i,className:I("[&_tr:last-child]:border-0",l),...n}));Ul.displayName="TableBody";const Y2=d.forwardRef(({className:l,...n},i)=>e.jsx("tfoot",{ref:i,className:I("border-t bg-muted/50 font-medium [&>tr]:last:border-b-0",l),...n}));Y2.displayName="TableFooter";const ut=d.forwardRef(({className:l,...n},i)=>e.jsx("tr",{ref:i,className:I("border-b transition-colors hover:bg-muted/50 data-[state=selected]:bg-muted",l),...n}));ut.displayName="TableRow";const Ze=d.forwardRef(({className:l,...n},i)=>e.jsx("th",{ref:i,className:I("h-12 px-4 text-left align-middle font-medium text-muted-foreground [&:has([role=checkbox])]:pr-0 [&>[role=checkbox]]:translate-y-[2px]",l),...n}));Ze.displayName="TableHead";const qe=d.forwardRef(({className:l,...n},i)=>e.jsx("td",{ref:i,className:I("px-4 py-3 align-middle [&:has([role=checkbox])]:pr-0 [&>[role=checkbox]]:translate-y-[2px]",l),...n}));qe.displayName="TableCell";const J2=d.forwardRef(({className:l,...n},i)=>e.jsx("caption",{ref:i,className:I("mt-4 text-sm text-muted-foreground",l),...n}));J2.displayName="TableCaption";const sd=d.forwardRef(({className:l,...n},i)=>e.jsx(ga,{ref:i,className:I("flex h-full w-full flex-col overflow-hidden rounded-md bg-popover text-popover-foreground",l),...n}));sd.displayName=ga.displayName;const td=d.forwardRef(({className:l,...n},i)=>e.jsxs("div",{className:"flex items-center border-b px-3","cmdk-input-wrapper":"",children:[e.jsx(Tt,{className:"mr-2 h-4 w-4 shrink-0 opacity-50"}),e.jsx(ga.Input,{ref:i,className:I("flex h-10 w-full rounded-md bg-transparent py-3 text-sm outline-none placeholder:text-muted-foreground disabled:cursor-not-allowed disabled:opacity-50",l),...n})]}));td.displayName=ga.Input.displayName;const ad=d.forwardRef(({className:l,...n},i)=>e.jsx(ga.List,{ref:i,className:I("max-h-[300px] overflow-y-auto overflow-x-hidden",l),...n}));ad.displayName=ga.List.displayName;const ld=d.forwardRef((l,n)=>e.jsx(ga.Empty,{ref:n,className:"py-6 text-center text-sm",...l}));ld.displayName=ga.Empty.displayName;const ac=d.forwardRef(({className:l,...n},i)=>e.jsx(ga.Group,{ref:i,className:I("overflow-hidden p-1 text-foreground [&_[cmdk-group-heading]]:px-2 [&_[cmdk-group-heading]]:py-1.5 [&_[cmdk-group-heading]]:text-xs [&_[cmdk-group-heading]]:font-medium [&_[cmdk-group-heading]]:text-muted-foreground",l),...n}));ac.displayName=ga.Group.displayName;const X2=d.forwardRef(({className:l,...n},i)=>e.jsx(ga.Separator,{ref:i,className:I("-mx-1 h-px bg-border",l),...n}));X2.displayName=ga.Separator.displayName;const lc=d.forwardRef(({className:l,...n},i)=>e.jsx(ga.Item,{ref:i,className:I("relative flex cursor-default gap-2 select-none items-center rounded-sm px-2 py-1.5 text-sm outline-none data-[disabled=true]:pointer-events-none data-[selected=true]:bg-accent data-[selected=true]:text-accent-foreground data-[disabled=true]:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0",l),...n}));lc.displayName=ga.Item.displayName;const jv=d.createContext(null),vv="maibot-completed-tours";function Z2(){try{const l=localStorage.getItem(vv);return l?new Set(JSON.parse(l)):new Set}catch{return new Set}}function wg(l){localStorage.setItem(vv,JSON.stringify([...l]))}function W2({children:l}){const[n,i]=d.useState({activeTourId:null,stepIndex:0,isRunning:!1}),[c]=d.useState(()=>new Map),[u,x]=d.useState(Z2),[,h]=d.useState(0),f=d.useCallback((M,T)=>{c.set(M,T),h(A=>A+1)},[c]),p=d.useCallback(M=>{c.delete(M),i(T=>T.activeTourId===M?{...T,activeTourId:null,isRunning:!1,stepIndex:0}:T)},[c]),g=d.useCallback((M,T=0)=>{c.has(M)&&i({activeTourId:M,stepIndex:T,isRunning:!0})},[c]),N=d.useCallback(()=>{i(M=>({...M,isRunning:!1}))},[]),v=d.useCallback(M=>{i(T=>({...T,stepIndex:M}))},[]),y=d.useCallback(()=>{i(M=>({...M,stepIndex:M.stepIndex+1}))},[]),w=d.useCallback(()=>{i(M=>({...M,stepIndex:Math.max(0,M.stepIndex-1)}))},[]),b=d.useCallback(()=>n.activeTourId?c.get(n.activeTourId)||[]:[],[n.activeTourId,c]),R=d.useCallback(M=>{x(T=>{const A=new Set(T);return A.add(M),wg(A),A})},[]),D=d.useCallback(M=>{const{action:T,index:A,status:F,type:L}=M,J=["finished","skipped"];if(T==="close"){i(U=>({...U,isRunning:!1,stepIndex:0}));return}J.includes(F)?i(U=>(F==="finished"&&U.activeTourId&&setTimeout(()=>R(U.activeTourId),0),{...U,isRunning:!1,stepIndex:0})):L==="step:after"&&(T==="next"?i(U=>({...U,stepIndex:A+1})):T==="prev"&&i(U=>({...U,stepIndex:A-1})))},[R]),S=d.useCallback(M=>u.has(M),[u]),P=d.useCallback(M=>{x(T=>{const A=new Set(T);return A.delete(M),wg(A),A})},[]);return e.jsx(jv.Provider,{value:{state:n,tours:c,registerTour:f,unregisterTour:p,startTour:g,stopTour:N,goToStep:v,nextStep:y,prevStep:w,getCurrentSteps:b,handleJoyrideCallback:D,isTourCompleted:S,markTourCompleted:R,resetTourCompleted:P},children:l})}function ax(){const l=d.useContext(jv);if(!l)throw new Error("useTour must be used within a TourProvider");return l}const eS={options:{zIndex:1e4,primaryColor:"hsl(var(--primary))",textColor:"hsl(var(--foreground))",backgroundColor:"hsl(var(--background))",arrowColor:"hsl(var(--background))",overlayColor:"rgba(0, 0, 0, 0.5)"},tooltip:{borderRadius:"var(--radius)",padding:"1rem"},tooltipContainer:{textAlign:"left"},tooltipTitle:{fontSize:"1rem",fontWeight:600,marginBottom:"0.5rem"},tooltipContent:{fontSize:"0.875rem",padding:"0.5rem 0"},buttonNext:{backgroundColor:"hsl(var(--primary))",color:"hsl(var(--primary-foreground))",borderRadius:"calc(var(--radius) - 2px)",fontSize:"0.875rem",padding:"0.5rem 1rem"},buttonBack:{color:"hsl(var(--muted-foreground))",fontSize:"0.875rem",marginRight:"0.5rem"},buttonSkip:{color:"hsl(var(--muted-foreground))",fontSize:"0.875rem"},buttonClose:{color:"hsl(var(--muted-foreground))"},spotlight:{borderRadius:"var(--radius)"}},sS={back:"上一步",close:"关闭",last:"完成",next:"下一步",nextLabelWithProgress:"下一步 ({step}/{steps})",open:"打开对话框",skip:"跳过"};function tS(){const{state:l,getCurrentSteps:n,handleJoyrideCallback:i}=ax(),c=n(),[u,x]=d.useState(!1),h=d.useRef(l.stepIndex),f=d.useRef(null);d.useEffect(()=>{h.current!==l.stepIndex&&(x(!1),h.current=l.stepIndex)},[l.stepIndex]),d.useEffect(()=>{if(!l.isRunning||c.length===0){x(!1);return}const v=c[l.stepIndex];if(!v){x(!1);return}const y=v.target;if(y==="body"){x(!0);return}x(!1);const w=setTimeout(()=>{const b=()=>{const P=document.querySelector(y);if(P){const M=P.getBoundingClientRect();if(M.width>0&&M.height>0)return!0}return!1};if(b()){setTimeout(()=>x(!0),100);return}const R=setInterval(()=>{b()&&(clearInterval(R),setTimeout(()=>x(!0),100))},100),D=setTimeout(()=>{clearInterval(R),x(!0)},5e3),S=()=>{clearInterval(R),clearTimeout(D)};f.current=S},150);return()=>{clearTimeout(w),f.current&&(f.current(),f.current=null)}},[l.isRunning,l.stepIndex,c]);const[p,g]=d.useState(null);if(d.useEffect(()=>{let v=document.getElementById("tour-portal-container");return v||(v=document.createElement("div"),v.id="tour-portal-container",v.style.cssText="position: fixed; top: 0; left: 0; z-index: 99999; pointer-events: none;",document.body.appendChild(v)),g(v),()=>{}},[]),!l.isRunning||c.length===0||!u)return null;const N=e.jsx(D_,{steps:c,stepIndex:l.stepIndex,run:l.isRunning,continuous:!0,showSkipButton:!0,showProgress:!0,disableOverlayClose:!0,disableScrolling:!1,disableScrollParentFix:!1,callback:i,styles:eS,locale:sS,scrollOffset:80,scrollToFirstStep:!0,floaterProps:{styles:{floater:{zIndex:99999}},disableAnimation:!0}},`tour-step-${l.stepIndex}`);return p?v0.createPortal(N,p):N}const il="model-assignment-tour",Nv=[{target:"body",content:"本引导旨在帮助你配置模型提供商和对应的模型,并为麦麦的各个组件分配合适的模型。",placement:"center",disableBeacon:!0,disableOverlayClose:!0,hideCloseButton:!1,spotlightClicks:!1},{target:'[data-tour="sidebar-model-provider"]',content:'第一步,你需要配置模型提供商。模型提供商决定了你要使用谁家的模型,无论是单一厂商(如 DeepSeek),还是模型平台(如 Siliconflow),都可以在这里进行配置。点击"下一步"进入配置页面。',placement:"right",disableBeacon:!0,disableOverlayClose:!0,hideCloseButton:!1,spotlightClicks:!1},{target:'[data-tour="add-provider-button"]',content:'点击"添加提供商"按钮,开始配置你的模型提供商。',placement:"bottom",disableBeacon:!0,disableOverlayClose:!0,hideCloseButton:!1,spotlightClicks:!0,hideFooter:!0},{target:'[data-tour="provider-dialog"]',content:"在这里,你可以选择你想要配置的模型提供商,填写相关信息后保存即可。",placement:"left",disableBeacon:!0,disableOverlayClose:!0,hideCloseButton:!1,spotlightClicks:!1},{target:'[data-tour="provider-name-input"]',content:"这里的名称是你为这个模型提供商起的一个名字,方便你在后续使用时识别它。",placement:"bottom",disableBeacon:!0,disableOverlayClose:!0,hideCloseButton:!1,spotlightClicks:!1},{target:'[data-tour="provider-apikey-input"]',content:"这里需要填写你从模型提供商那里获取的 API 密钥,用于验证和调用模型服务。对于不同的提供商,获取 API 密钥的方式可能有所不同,请参考对应提供商的文档。",placement:"bottom",disableBeacon:!0,disableOverlayClose:!0,hideCloseButton:!1,spotlightClicks:!1},{target:'[data-tour="provider-url-input"]',content:"这里需要填写模型提供商的 API 访问地址,确保填写正确以便系统能够连接到模型服务。对于不同的提供商,API 地址可能有所不同,请参考对应提供商的文档。",placement:"bottom",disableBeacon:!0,disableOverlayClose:!0,hideCloseButton:!1,spotlightClicks:!1},{target:'[data-tour="provider-template-select"]',content:"当然,如果你不知道如何填写这些信息,很多模型提供商在这里都提供了预设的模板供你选择,选择对应的模板后,相关信息会自动填充。",placement:"bottom",disableBeacon:!0,disableOverlayClose:!0,hideCloseButton:!1,spotlightClicks:!1},{target:'[data-tour="provider-save-button"]',content:"填写完所有信息后,点击保存按钮,模型提供商就配置完成了。",placement:"top",disableBeacon:!0,disableOverlayClose:!0,hideCloseButton:!1,spotlightClicks:!1},{target:'[data-tour="provider-cancel-button"]',content:"因为这次咱们什么都没有填写,所以点击取消按钮退出吧。",placement:"top",disableBeacon:!0,disableOverlayClose:!0,hideCloseButton:!1,spotlightClicks:!0,hideFooter:!0},{target:'[data-tour="sidebar-model-management"]',content:'配置好模型提供商后,接下来我们需要为麦麦添加模型并分配功能。点击"下一步"进入模型管理页面。',placement:"right",disableBeacon:!0,disableOverlayClose:!0,hideCloseButton:!1,spotlightClicks:!1},{target:'[data-tour="add-model-button"]',content:'在为麦麦的组件分配模型之前,首先需要添加你想要分配的模型,点击"添加模型"按钮开始添加。',placement:"bottom",disableBeacon:!0,disableOverlayClose:!0,hideCloseButton:!1,spotlightClicks:!0,hideFooter:!0},{target:'[data-tour="model-dialog"]',content:"在这里,你可以选择你之前配置好的模型提供商,然后选择对应的模型来添加。",placement:"left",disableBeacon:!0,disableOverlayClose:!0,hideCloseButton:!1,spotlightClicks:!1},{target:'[data-tour="model-name-input"]',content:"这里的模型名称是你为这个模型起的一个名字,方便你在后续使用时识别它。",placement:"bottom",disableBeacon:!0,disableOverlayClose:!0,hideCloseButton:!1,spotlightClicks:!1},{target:'[data-tour="model-provider-select"]',content:"在这里选择你之前配置好的模型提供商,这样系统才能知道你要添加哪个提供商的模型。",placement:"bottom",disableBeacon:!0,disableOverlayClose:!0,hideCloseButton:!1,spotlightClicks:!1},{target:'[data-tour="model-identifier-input"]',content:"这里需要填写你想要添加的模型的标识符,不同的模型提供商可能有不同的标识符格式,请参考对应提供商的文档。",placement:"bottom",disableBeacon:!0,disableOverlayClose:!0,hideCloseButton:!1,spotlightClicks:!1},{target:'[data-tour="model-save-button"]',content:"填写完所有信息后,点击保存按钮,模型就添加完成了。",placement:"top",disableBeacon:!0,disableOverlayClose:!0,hideCloseButton:!1,spotlightClicks:!1},{target:'[data-tour="model-cancel-button"]',content:"当然,因为这次咱们什么都没有填写,所以直接点击取消按钮退出吧,等你准备好了再来添加模型。",placement:"top",disableBeacon:!0,disableOverlayClose:!0,hideCloseButton:!1,spotlightClicks:!0,hideFooter:!0},{target:'[data-tour="tasks-tab-trigger"]',content:'最后一步,添加好模型后,切换到"为模型分配功能"标签页,为麦麦的各个组件分配合适的模型。',placement:"bottom",disableBeacon:!0,disableOverlayClose:!0,hideCloseButton:!1,spotlightClicks:!0,hideFooter:!0},{target:'[data-tour="task-model-select"]',content:"在这里,你可以为每个组件选择一个或多个合适的模型,选择完成后配置会自动保存。恭喜你完成了模型配置的学习!",placement:"bottom",disableBeacon:!0,disableOverlayClose:!0,hideCloseButton:!1,spotlightClicks:!1}],bv={0:"/config/model",1:"/config/model",2:"/config/modelProvider",3:"/config/modelProvider",4:"/config/modelProvider",5:"/config/modelProvider",6:"/config/modelProvider",7:"/config/modelProvider",8:"/config/modelProvider",9:"/config/modelProvider",10:"/config/modelProvider",11:"/config/model",12:"/config/model",13:"/config/model",14:"/config/model",15:"/config/model",16:"/config/model",17:"/config/model",18:"/config/model",19:"/config/model"},Vi=[{id:"siliconflow",name:"SiliconFlow",base_url:"https://api.siliconflow.cn/v1",client_type:"openai",display_name:"硅基流动 (SiliconFlow)",modelFetcher:{endpoint:"/models",parser:"openai"}},{id:"deepseek",name:"DeepSeek",base_url:"https://api.deepseek.com",client_type:"openai",display_name:"DeepSeek",modelFetcher:{endpoint:"/models",parser:"openai"}},{id:"rinkoai",name:"RinkoAI",base_url:"https://rinkoai.com/v1",client_type:"openai",display_name:"RinkoAI",modelFetcher:{endpoint:"/models",parser:"openai"}},{id:"zhipu",name:"ZhipuAI",base_url:"https://open.bigmodel.cn/api/paas/v4",client_type:"openai",display_name:"智谱 AI (ZhipuAI / GLM)",modelFetcher:{endpoint:"/models",parser:"openai"}},{id:"moonshot",name:"Moonshot",base_url:"https://api.moonshot.cn/v1",client_type:"openai",display_name:"月之暗面 (Moonshot / Kimi)",modelFetcher:{endpoint:"/models",parser:"openai"}},{id:"doubao",name:"Doubao",base_url:"https://ark.cn-beijing.volces.com/api/v3",client_type:"openai",display_name:"字节豆包 (Doubao)",modelFetcher:{endpoint:"/models",parser:"openai"}},{id:"alibaba",name:"Alibaba",base_url:"https://dashscope.aliyuncs.com/compatible-mode/v1",client_type:"openai",display_name:"阿里云百炼 (Alibaba Qwen)",modelFetcher:{endpoint:"/models",parser:"openai"}},{id:"baichuan",name:"Baichuan",base_url:"https://api.baichuan-ai.com/v1",client_type:"openai",display_name:"百川智能 (Baichuan)",modelFetcher:{endpoint:"/models",parser:"openai"}},{id:"minimax",name:"MiniMax",base_url:"https://api.minimax.chat/v1",client_type:"openai",display_name:"MiniMax (海螺 AI)",modelFetcher:{endpoint:"/models",parser:"openai"}},{id:"stepfun",name:"StepFun",base_url:"https://api.stepfun.com/v1",client_type:"openai",display_name:"阶跃星辰 (StepFun)",modelFetcher:{endpoint:"/models",parser:"openai"}},{id:"lingyi",name:"Lingyi",base_url:"https://api.lingyiwanwu.com/v1",client_type:"openai",display_name:"零一万物 (Lingyi / Yi)",modelFetcher:{endpoint:"/models",parser:"openai"}},{id:"openai",name:"OpenAI",base_url:"https://api.openai.com/v1",client_type:"openai",display_name:"OpenAI",modelFetcher:{endpoint:"/models",parser:"openai"}},{id:"xai",name:"xAI",base_url:"https://api.x.ai/v1",client_type:"openai",display_name:"xAI (Grok)",modelFetcher:{endpoint:"/models",parser:"openai"}},{id:"anthropic",name:"Anthropic",base_url:"https://api.anthropic.com/v1",client_type:"openai",display_name:"Anthropic (Claude)"},{id:"gemini",name:"Gemini",base_url:"https://generativelanguage.googleapis.com/v1beta",client_type:"gemini",display_name:"Google Gemini",modelFetcher:{endpoint:"/models",parser:"gemini"}},{id:"cohere",name:"Cohere",base_url:"https://api.cohere.ai/v1",client_type:"openai",display_name:"Cohere"},{id:"groq",name:"Groq",base_url:"https://api.groq.com/openai/v1",client_type:"openai",display_name:"Groq",modelFetcher:{endpoint:"/models",parser:"openai"}},{id:"together",name:"Together AI",base_url:"https://api.together.xyz/v1",client_type:"openai",display_name:"Together AI",modelFetcher:{endpoint:"/models",parser:"openai"}},{id:"fireworks",name:"Fireworks",base_url:"https://api.fireworks.ai/inference/v1",client_type:"openai",display_name:"Fireworks AI",modelFetcher:{endpoint:"/models",parser:"openai"}},{id:"mistral",name:"Mistral",base_url:"https://api.mistral.ai/v1",client_type:"openai",display_name:"Mistral AI",modelFetcher:{endpoint:"/models",parser:"openai"}},{id:"perplexity",name:"Perplexity",base_url:"https://api.perplexity.ai",client_type:"openai",display_name:"Perplexity AI"},{id:"custom",name:"",base_url:"",client_type:"openai",display_name:"自定义"}];function _g(l){return l?l.replace(/\/+$/,"").toLowerCase():""}function aS(l){if(!l)return null;const n=_g(l);return Vi.find(i=>i.id!=="custom"&&_g(i.base_url)===n)||null}const Co=l=>({...l,max_retry:l.max_retry??2,timeout:l.timeout??30,retry_interval:l.retry_interval??10}),lS=(l,n=[],i=null)=>{const c={};return l?(l.name?.trim()?n.some((x,h)=>i!==null&&h===i?!1:x.name.trim().toLowerCase()===l.name.trim().toLowerCase())&&(c.name="提供商名称已存在,请使用其他名称"):c.name="请输入提供商名称",l.base_url?.trim()||(c.base_url="请输入基础 URL"),l.api_key?.trim()||(c.api_key="请输入 API Key"),{isValid:Object.keys(c).length===0,errors:c}):{isValid:!1,errors:{name:"提供商数据为空"}}};function nS(){return e.jsx(Yn,{children:e.jsx(rS,{})})}function rS(){const[l,n]=d.useState([]),[i,c]=d.useState(!0),[u,x]=d.useState(!1),[h,f]=d.useState(!1),[p,g]=d.useState(!1),[N,v]=d.useState(!1),[y,w]=d.useState(null),[b,R]=d.useState(null),[D,S]=d.useState("custom"),[P,M]=d.useState(!1),[T,A]=d.useState(!1),[F,L]=d.useState(null),[J,U]=d.useState(!1),[ue,xe]=d.useState(""),[he,ne]=d.useState(new Set),[ve,je]=d.useState(!1),[z,V]=d.useState(1),[B,oe]=d.useState(20),[K,_e]=d.useState(""),[pe,ke]=d.useState({isOpen:!1,providersToDelete:[],affectedModels:[],pendingProviders:[],context:"auto",oldProviders:[]}),[O,k]=d.useState({}),[H,se]=d.useState(new Set),[Ee,Z]=d.useState(new Map),{toast:Oe}=Zs(),ns=ca(),{state:Q,goToStep:ee,registerTour:Ue}=ax(),{triggerRestart:ie,isRestarting:Te}=vn(),de=d.useRef(null),Me=d.useRef(!0);d.useEffect(()=>{Ue(il,Nv)},[Ue]),d.useEffect(()=>{if(Q.activeTourId===il&&Q.isRunning){const W=bv[Q.stepIndex];W&&!window.location.pathname.endsWith(W.replace("/config/",""))&&ns({to:W})}},[Q.stepIndex,Q.activeTourId,Q.isRunning,ns]);const rs=d.useRef(Q.stepIndex);d.useEffect(()=>{if(Q.activeTourId===il&&Q.isRunning){const W=rs.current,ye=Q.stepIndex;W>=3&&W<=9&&ye<3&&v(!1),W>=10&&ye>=3&&ye<=9&&(k({}),S("custom"),w({name:"",base_url:"",api_key:"",client_type:"openai",max_retry:2,timeout:30,retry_interval:10}),R(null),U(!1),v(!0)),rs.current=ye}},[Q.stepIndex,Q.activeTourId,Q.isRunning]),d.useEffect(()=>{if(Q.activeTourId!==il||!Q.isRunning)return;const W=ye=>{const Re=ye.target,Hs=Q.stepIndex;Hs===2&&Re.closest('[data-tour="add-provider-button"]')?setTimeout(()=>ee(3),300):Hs===9&&Re.closest('[data-tour="provider-cancel-button"]')&&setTimeout(()=>ee(10),300)};return document.addEventListener("click",W,!0),()=>document.removeEventListener("click",W,!0)},[Q,ee]),d.useEffect(()=>{Ut()},[]);const Ut=async()=>{try{c(!0);const W=await un();n(W.api_providers||[]),g(!1),Me.current=!1}catch(W){console.error("加载配置失败:",W)}finally{c(!1)}},aa=async()=>{await ie()},Qa=async()=>{try{x(!0),de.current&&clearTimeout(de.current);const W=l.map(rt=>({...rt,max_retry:rt.max_retry??2,timeout:rt.timeout??30,retry_interval:rt.retry_interval??10})),{shouldProceed:ye}=await Ft(W,"restart");if(!ye){x(!1);return}const Re=await un(),Hs=new Set(W.map(rt=>rt.name)),Wt=(Re.models||[]).filter(rt=>Hs.has(rt.api_provider));Re.api_providers=W,Re.models=Wt,await Ji(Re),g(!1),Oe({title:"保存成功",description:"正在重启麦麦..."}),await aa()}catch(W){console.error("保存配置失败:",W),Oe({title:"保存失败",description:W.message,variant:"destructive"}),x(!1)}},Ft=d.useCallback(async(W,ye="auto")=>{try{const Re=await un(),Hs=new Set(l.map(xt=>xt.name)),Dt=new Set(W.map(xt=>xt.name)),Wt=Array.from(Hs).filter(xt=>!Dt.has(xt));if(Wt.length===0)return{shouldProceed:!0,providers:W};const ea=(Re.models||[]).filter(xt=>Wt.includes(xt.api_provider));return ea.length===0?{shouldProceed:!0,providers:W}:(ke({isOpen:!0,providersToDelete:Wt,affectedModels:ea,pendingProviders:W,context:ye,oldProviders:[...l]}),{shouldProceed:!1,providers:W})}catch(Re){return console.error("检查删除影响失败:",Re),{shouldProceed:!0,providers:W}}},[l]),mt=async()=>{try{(pe.context==="auto"?f:x)(!0),ke(xt=>({...xt,isOpen:!1}));const ye=await un(),Re=pe.pendingProviders.map(Co),Hs=new Set(Re.map(xt=>xt.name)),Wt=(ye.models||[]).filter(xt=>Hs.has(xt.api_provider)),rt=new Set(pe.affectedModels.map(xt=>xt.name)),ea=ye.model_task_config;ea&&Object.keys(ea).forEach(xt=>{const re=ea[xt];re&&Array.isArray(re.model_list)&&(re.model_list=re.model_list.filter(fe=>!rt.has(fe)))}),ye.api_providers=Re,ye.models=Wt,ye.model_task_config=ea,await Ji(ye),n(pe.pendingProviders),g(!1),Oe({title:"删除成功",description:`已删除 ${pe.providersToDelete.length} 个提供商和 ${pe.affectedModels.length} 个关联模型`}),ke({isOpen:!1,providersToDelete:[],affectedModels:[],pendingProviders:[],context:"auto",oldProviders:[]}),ne(new Set),pe.context==="restart"&&await aa()}catch(W){console.error("删除失败:",W),Oe({title:"删除失败",description:W.message,variant:"destructive"})}finally{pe.context==="auto"?f(!1):x(!1)}},q=()=>{pe.oldProviders.length>0&&n(pe.oldProviders),ke({isOpen:!1,providersToDelete:[],affectedModels:[],pendingProviders:[],context:"auto",oldProviders:[]}),g(!1)},Ve=d.useCallback(async W=>{if(Me.current)return;const{shouldProceed:ye}=await Ft(W,"auto");if(!ye){g(!0);return}try{f(!0);const Re=W.map(Co);await Bm("api_providers",Re),g(!1)}catch(Re){console.error("自动保存失败:",Re),Oe({title:"自动保存失败",description:Re.message,variant:"destructive"}),g(!0)}finally{f(!1)}},[l,Ft]);d.useEffect(()=>{if(!Me.current)return g(!0),de.current&&clearTimeout(de.current),de.current=setTimeout(()=>{Ve(l)},2e3),()=>{de.current&&clearTimeout(de.current)}},[l,Ve]);const Ke=async()=>{try{x(!0),de.current&&clearTimeout(de.current);const W=l.map(Co),{shouldProceed:ye}=await Ft(W,"manual");if(!ye){x(!1);return}const Re=await un(),Hs=new Set(W.map(rt=>rt.name)),Dt=Re.models||[],Wt=Dt.filter(rt=>{const ea=Hs.has(rt.api_provider);return ea||console.warn(`模型 "${rt.name}" 引用了已删除的提供商 "${rt.api_provider}",将被移除`),ea});if(Dt.length!==Wt.length){const rt=Dt.length-Wt.length;Oe({title:"注意",description:`已自动移除 ${rt} 个引用已删除提供商的模型`,variant:"default"})}console.log("发送的 providers 数据:",W),Re.api_providers=W,Re.models=Wt,console.log("完整配置数据:",Re),await Ji(Re),g(!1),Oe({title:"保存成功",description:"模型提供商配置已保存"})}catch(W){console.error("保存配置失败:",W),Oe({title:"保存失败",description:W.message,variant:"destructive"})}finally{x(!1)}},We=(W,ye)=>{if(k({}),W){const Re=Vi.find(Hs=>Hs.base_url===W.base_url&&Hs.client_type===W.client_type);S(Re?.id||"custom"),w(W)}else S("custom"),w({name:"",base_url:"",api_key:"",client_type:"openai",max_retry:2,timeout:30,retry_interval:10});R(ye),U(!1),v(!0)},Ls=d.useCallback(W=>{S(W),M(!1);const ye=Vi.find(Re=>Re.id===W);ye&&ye.id!=="custom"?w(Re=>({...Re,name:ye.name,base_url:ye.base_url,client_type:ye.client_type})):ye?.id==="custom"&&w(Re=>({...Re,name:"",base_url:"",client_type:"openai"}))},[]),ts=d.useMemo(()=>D!=="custom",[D]),Cs=d.useCallback(async()=>{if(y?.api_key)try{await navigator.clipboard.writeText(y.api_key),Oe({title:"复制成功",description:"API Key 已复制到剪贴板"})}catch{Oe({title:"复制失败",description:"无法访问剪贴板",variant:"destructive"})}},[y?.api_key,Oe]),ze=()=>{if(!y)return;const{isValid:W,errors:ye}=lS(y,l,b);if(!W){k(ye);return}k({});const Re=Co(y);if(b!==null){const Hs=[...l];Hs[b]=Re,n(Hs)}else n([...l,Re]);v(!1),w(null),R(null)},Ns=W=>{if(!W&&y){const ye={...y,max_retry:y.max_retry??2,timeout:y.timeout??30,retry_interval:y.retry_interval??10};w(ye)}v(W)},as=W=>{L(W),A(!0)},es=async()=>{if(F!==null){const W=l.filter((Re,Hs)=>Hs!==F),{shouldProceed:ye}=await Ft(W,"manual");ye&&(n(W),Oe({title:"删除成功",description:"提供商已从列表中移除"}))}A(!1),L(null)},bs=W=>{const ye=new Set(he);ye.has(W)?ye.delete(W):ye.add(W),ne(ye)},gt=()=>{if(he.size===Ms.length)ne(new Set);else{const W=Ms.map((ye,Re)=>l.findIndex(Hs=>Hs===Ms[Re]));ne(new Set(W))}},$t=()=>{if(he.size===0){Oe({title:"提示",description:"请先选择要删除的提供商",variant:"default"});return}je(!0)},tt=async()=>{const W=l.filter((Re,Hs)=>!he.has(Hs)),{shouldProceed:ye}=await Ft(W,"manual");ye&&(n(W),ne(new Set),Oe({title:"批量删除成功",description:`已删除 ${he.size} 个提供商`})),je(!1)},Ms=d.useMemo(()=>{if(!ue)return l;const W=ue.toLowerCase();return l.filter(ye=>ye.name.toLowerCase().includes(W)||ye.base_url.toLowerCase().includes(W)||ye.client_type.toLowerCase().includes(W))},[l,ue]),{totalPages:Et,paginatedProviders:Bt}=d.useMemo(()=>{const W=Math.ceil(Ms.length/B),ye=Ms.slice((z-1)*B,z*B);return{totalPages:W,paginatedProviders:ye}},[Ms,z,B]),Oa=d.useCallback(()=>{const W=parseInt(K);W>=1&&W<=Et&&(V(W),_e(""))},[K,Et]),tl=async W=>{se(ye=>new Set(ye).add(W));try{const ye=await $2(W);Z(Re=>new Map(Re).set(W,ye)),ye.network_ok?ye.api_key_valid===!0?Oe({title:"连接正常",description:`${W} 网络连接正常,API Key 有效 (${ye.latency_ms}ms)`}):ye.api_key_valid===!1?Oe({title:"连接正常但 Key 无效",description:`${W} 网络连接正常,但 API Key 无效或已过期`,variant:"destructive"}):Oe({title:"网络连接正常",description:`${W} 可以访问 (${ye.latency_ms}ms)`}):Oe({title:"连接失败",description:ye.error||"无法连接到提供商",variant:"destructive"})}catch(ye){Oe({title:"测试失败",description:ye.message,variant:"destructive"})}finally{se(ye=>{const Re=new Set(ye);return Re.delete(W),Re})}},ul=async()=>{for(const W of l)await tl(W.name)},Xn=W=>{const ye=H.has(W),Re=Ee.get(W);return ye?e.jsxs(Se,{variant:"secondary",className:"gap-1",children:[e.jsx(Bs,{className:"h-3 w-3 animate-spin"}),"测试中"]}):Re?Re.network_ok?Re.api_key_valid===!0?e.jsxs(Se,{className:"gap-1 bg-green-600 hover:bg-green-700",children:[e.jsx(pt,{className:"h-3 w-3"}),"正常"]}):Re.api_key_valid===!1?e.jsxs(Se,{variant:"destructive",className:"gap-1",children:[e.jsx(_t,{className:"h-3 w-3"}),"Key无效"]}):e.jsxs(Se,{className:"gap-1 bg-blue-600 hover:bg-blue-700",children:[e.jsx(pt,{className:"h-3 w-3"}),"可访问"]}):e.jsxs(Se,{variant:"destructive",className:"gap-1",children:[e.jsx(Va,{className:"h-3 w-3"}),"离线"]}):null};return i?e.jsx("div",{className:"space-y-4 sm:space-y-6 p-4 sm:p-6",children:e.jsx("div",{className:"flex items-center justify-center h-64",children:e.jsx("p",{className:"text-muted-foreground",children:"加载中..."})})}):e.jsxs("div",{className:"space-y-4 sm:space-y-6 p-4 sm:p-6",children:[e.jsxs("div",{className:"flex flex-col sm:flex-row sm:items-center justify-between gap-4",children:[e.jsxs("div",{children:[e.jsx("h1",{className:"text-2xl sm:text-3xl font-bold",children:"AI模型厂商配置"}),e.jsx("p",{className:"text-muted-foreground mt-1 sm:mt-2 text-sm sm:text-base",children:"管理 AI 模型厂商的 API 配置"})]}),e.jsxs("div",{className:"flex flex-col sm:flex-row gap-2",children:[he.size>0&&e.jsxs(_,{onClick:$t,size:"sm",variant:"destructive",className:"w-full sm:w-auto",children:[e.jsx(ls,{className:"mr-2 h-4 w-4",strokeWidth:2,fill:"none"}),"批量删除 (",he.size,")"]}),e.jsxs(_,{onClick:ul,size:"sm",variant:"outline",className:"w-full sm:w-auto",disabled:l.length===0||H.size>0,children:[e.jsx(Za,{className:"mr-2 h-4 w-4"}),H.size>0?`测试中 (${H.size})`:"测试全部"]}),e.jsxs(_,{onClick:()=>We(null,null),size:"sm",className:"w-full sm:w-auto","data-tour":"add-provider-button",children:[e.jsx(et,{className:"mr-2 h-4 w-4",strokeWidth:2,fill:"none"}),"添加提供商"]}),e.jsxs(_,{onClick:Ke,disabled:u||h||!p||Te,size:"sm",variant:"outline",className:"w-full sm:w-auto sm:min-w-[120px]",children:[e.jsx(oc,{className:"mr-2 h-4 w-4",strokeWidth:2,fill:"none"}),u?"保存中...":h?"自动保存中...":p?"保存配置":"已保存"]}),e.jsxs(vs,{children:[e.jsx(wt,{asChild:!0,children:e.jsxs(_,{disabled:u||h||Te,size:"sm",className:"w-full sm:w-auto sm:min-w-[120px]",children:[e.jsx(cc,{className:"mr-2 h-4 w-4"}),Te?"重启中...":p?"保存并重启":"重启麦麦"]})}),e.jsxs(ds,{children:[e.jsxs(us,{children:[e.jsx(xs,{children:"确认重启麦麦?"}),e.jsx(hs,{asChild:!0,children:e.jsx("div",{children:e.jsx("p",{children:p?"当前有未保存的配置更改。点击确认将先保存配置,然后重启麦麦使新配置生效。重启过程中麦麦将暂时离线。":"即将重启麦麦主程序。重启过程中麦麦将暂时离线,配置将在重启后生效。"})})})]}),e.jsxs(ms,{children:[e.jsx(ps,{children:"取消"}),e.jsx(fs,{onClick:p?Qa:aa,children:p?"保存并重启":"确认重启"})]})]})]})]})]}),e.jsxs(at,{children:[e.jsx(Ht,{className:"h-4 w-4"}),e.jsxs(lt,{children:["配置更新后需要",e.jsx("strong",{children:"重启麦麦"}),'才能生效。你可以点击右上角的"保存并重启"按钮一键完成保存和重启。']})]}),e.jsxs(Ye,{className:"h-[calc(100vh-260px)]",children:[e.jsxs("div",{className:"flex flex-col sm:flex-row items-start sm:items-center gap-2 mb-4",children:[e.jsxs("div",{className:"relative w-full sm:flex-1 sm:max-w-sm",children:[e.jsx(Tt,{className:"absolute left-3 top-1/2 -translate-y-1/2 h-4 w-4 text-muted-foreground"}),e.jsx(le,{placeholder:"搜索提供商名称、URL 或类型...",value:ue,onChange:W=>xe(W.target.value),className:"pl-9"})]}),ue&&e.jsxs("p",{className:"text-sm text-muted-foreground whitespace-nowrap",children:["找到 ",Ms.length," 个结果"]})]}),e.jsx("div",{className:"md:hidden space-y-3",children:Ms.length===0?e.jsx("div",{className:"text-center text-muted-foreground py-8 rounded-lg border bg-card",children:ue?"未找到匹配的提供商":'暂无提供商配置,点击"添加提供商"开始配置'}):Bt.map((W,ye)=>{const Re=l.findIndex(Hs=>Hs===W);return e.jsxs("div",{className:"rounded-lg border bg-card p-4 space-y-3",children:[e.jsxs("div",{className:"flex items-start justify-between gap-2",children:[e.jsxs("div",{className:"flex-1 min-w-0",children:[e.jsxs("div",{className:"flex items-center gap-2 flex-wrap",children:[e.jsx("h3",{className:"font-semibold text-base truncate",children:W.name}),Xn(W.name)]}),e.jsx("p",{className:"text-xs text-muted-foreground mt-1 break-all",children:W.base_url})]}),e.jsxs("div",{className:"flex gap-1 flex-shrink-0",children:[e.jsx(_,{variant:"outline",size:"sm",onClick:()=>tl(W.name),disabled:H.has(W.name),title:"测试连接",children:H.has(W.name)?e.jsx(Bs,{className:"h-4 w-4 animate-spin"}):e.jsx(Za,{className:"h-4 w-4"})}),e.jsx(_,{variant:"default",size:"sm",onClick:()=>We(W,Re),children:e.jsx(Fn,{className:"h-4 w-4",strokeWidth:2,fill:"none"})}),e.jsx(_,{size:"sm",onClick:()=>as(Re),className:"bg-red-600 hover:bg-red-700 text-white",children:e.jsx(ls,{className:"h-4 w-4",strokeWidth:2,fill:"none"})})]})]}),e.jsxs("div",{className:"grid grid-cols-2 gap-2 text-sm",children:[e.jsxs("div",{children:[e.jsx("span",{className:"text-muted-foreground text-xs",children:"客户端类型"}),e.jsx("p",{className:"font-medium",children:W.client_type})]}),e.jsxs("div",{children:[e.jsx("span",{className:"text-muted-foreground text-xs",children:"最大重试"}),e.jsx("p",{className:"font-medium",children:W.max_retry})]}),e.jsxs("div",{children:[e.jsx("span",{className:"text-muted-foreground text-xs",children:"超时(秒)"}),e.jsx("p",{className:"font-medium",children:W.timeout})]}),e.jsxs("div",{children:[e.jsx("span",{className:"text-muted-foreground text-xs",children:"重试间隔(秒)"}),e.jsx("p",{className:"font-medium",children:W.retry_interval})]})]})]},ye)})}),e.jsx("div",{className:"hidden md:block rounded-lg border bg-card overflow-hidden",children:e.jsx("div",{className:"overflow-x-auto",children:e.jsxs(Rl,{children:[e.jsx(Ll,{children:e.jsxs(ut,{children:[e.jsx(Ze,{className:"w-12",children:e.jsx(qs,{checked:he.size===Ms.length&&Ms.length>0,onCheckedChange:gt})}),e.jsx(Ze,{children:"状态"}),e.jsx(Ze,{children:"名称"}),e.jsx(Ze,{children:"基础URL"}),e.jsx(Ze,{children:"客户端类型"}),e.jsx(Ze,{className:"text-right",children:"最大重试"}),e.jsx(Ze,{className:"text-right",children:"超时(秒)"}),e.jsx(Ze,{className:"text-right",children:"重试间隔(秒)"}),e.jsx(Ze,{className:"text-right",children:"操作"})]})}),e.jsx(Ul,{children:Bt.length===0?e.jsx(ut,{children:e.jsx(qe,{colSpan:9,className:"text-center text-muted-foreground py-8",children:ue?"未找到匹配的提供商":'暂无提供商配置,点击"添加提供商"开始配置'})}):Bt.map((W,ye)=>{const Re=l.findIndex(Hs=>Hs===W);return e.jsxs(ut,{children:[e.jsx(qe,{children:e.jsx(qs,{checked:he.has(Re),onCheckedChange:()=>bs(Re)})}),e.jsx(qe,{children:Xn(W.name)||e.jsx(Se,{variant:"outline",className:"text-muted-foreground",children:"未测试"})}),e.jsx(qe,{className:"font-medium",children:W.name}),e.jsx(qe,{className:"max-w-xs truncate",title:W.base_url,children:W.base_url}),e.jsx(qe,{children:W.client_type}),e.jsx(qe,{className:"text-right",children:W.max_retry}),e.jsx(qe,{className:"text-right",children:W.timeout}),e.jsx(qe,{className:"text-right",children:W.retry_interval}),e.jsx(qe,{className:"text-right",children:e.jsxs("div",{className:"flex justify-end gap-2",children:[e.jsx(_,{variant:"outline",size:"sm",onClick:()=>tl(W.name),disabled:H.has(W.name),title:"测试连接",children:H.has(W.name)?e.jsx(Bs,{className:"h-4 w-4 animate-spin"}):e.jsx(Za,{className:"h-4 w-4"})}),e.jsxs(_,{variant:"default",size:"sm",onClick:()=>We(W,Re),children:[e.jsx(Fn,{className:"h-4 w-4 mr-1",strokeWidth:2,fill:"none"}),"编辑"]}),e.jsxs(_,{size:"sm",onClick:()=>as(Re),className:"bg-red-600 hover:bg-red-700 text-white",children:[e.jsx(ls,{className:"h-4 w-4 mr-1",strokeWidth:2,fill:"none"}),"删除"]})]})})]},ye)})})]})})}),Ms.length>0&&e.jsxs("div",{className:"flex flex-col sm:flex-row items-center justify-between gap-4 mt-4",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(E,{htmlFor:"page-size-provider",className:"text-sm whitespace-nowrap",children:"每页显示"}),e.jsxs(Ie,{value:B.toString(),onValueChange:W=>{oe(parseInt(W)),V(1),ne(new Set)},children:[e.jsx($e,{id:"page-size-provider",className:"w-20",children:e.jsx(Pe,{})}),e.jsxs(Be,{children:[e.jsx(X,{value:"10",children:"10"}),e.jsx(X,{value:"20",children:"20"}),e.jsx(X,{value:"50",children:"50"}),e.jsx(X,{value:"100",children:"100"})]})]}),e.jsxs("span",{className:"text-sm text-muted-foreground",children:["显示 ",(z-1)*B+1," 到"," ",Math.min(z*B,Ms.length)," 条,共 ",Ms.length," 条"]})]}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(_,{variant:"outline",size:"sm",onClick:()=>V(1),disabled:z===1,className:"hidden sm:flex",children:e.jsx(gn,{className:"h-4 w-4"})}),e.jsxs(_,{variant:"outline",size:"sm",onClick:()=>V(W=>Math.max(1,W-1)),disabled:z===1,children:[e.jsx(Aa,{className:"h-4 w-4 sm:mr-1"}),e.jsx("span",{className:"hidden sm:inline",children:"上一页"})]}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(le,{type:"number",value:K,onChange:W=>_e(W.target.value),onKeyDown:W=>W.key==="Enter"&&Oa(),placeholder:z.toString(),className:"w-16 h-8 text-center",min:1,max:Et}),e.jsx(_,{variant:"outline",size:"sm",onClick:Oa,disabled:!K,className:"h-8",children:"跳转"})]}),e.jsxs(_,{variant:"outline",size:"sm",onClick:()=>V(W=>W+1),disabled:z>=Et,children:[e.jsx("span",{className:"hidden sm:inline",children:"下一页"}),e.jsx(Zt,{className:"h-4 w-4 sm:ml-1"})]}),e.jsx(_,{variant:"outline",size:"sm",onClick:()=>V(Et),disabled:z>=Et,className:"hidden sm:flex",children:e.jsx(jn,{className:"h-4 w-4"})})]})]})]}),e.jsx(Is,{open:N,onOpenChange:Ns,children:e.jsxs(Os,{className:"max-w-[95vw] sm:max-w-2xl max-h-[90vh] overflow-y-auto","data-tour":"provider-dialog",preventOutsideClose:Q.isRunning,children:[e.jsxs(Ds,{children:[e.jsx(Rs,{children:b!==null?"编辑提供商":"添加提供商"}),e.jsx(Ks,{children:"配置 API 提供商的连接信息和参数"})]}),e.jsxs("form",{onSubmit:W=>{W.preventDefault(),ze()},autoComplete:"off",children:[e.jsxs("div",{className:"grid gap-4 py-4",children:[e.jsxs("div",{className:"grid gap-2","data-tour":"provider-template-select",children:[e.jsx(E,{htmlFor:"template",children:"提供商模板"}),e.jsxs(ol,{open:P,onOpenChange:M,children:[e.jsx(dl,{asChild:!0,children:e.jsxs(_,{variant:"outline",role:"combobox","aria-expanded":P,className:"w-full justify-between",children:[D?Vi.find(W=>W.id===D)?.display_name:"选择提供商模板...",e.jsx(Ym,{className:"ml-2 h-4 w-4 shrink-0 opacity-50"})]})}),e.jsx(Wa,{className:"p-0",align:"start",style:{width:"var(--radix-popover-trigger-width)"},children:e.jsxs(sd,{children:[e.jsx(td,{placeholder:"搜索提供商模板..."}),e.jsx(Ye,{className:"h-[300px]",children:e.jsxs(ad,{className:"max-h-none overflow-visible",children:[e.jsx(ld,{children:"未找到匹配的模板"}),e.jsx(ac,{children:Vi.map(W=>e.jsxs(lc,{value:W.display_name,onSelect:()=>Ls(W.id),children:[e.jsx(Ct,{className:`mr-2 h-4 w-4 ${D===W.id?"opacity-100":"opacity-0"}`}),W.display_name]},W.id))})]})})]})})]}),e.jsx("p",{className:"text-xs text-muted-foreground",children:"选择预设模板可自动填充 URL 和客户端类型,支持搜索"})]}),e.jsxs("div",{className:"grid gap-2","data-tour":"provider-name-input",children:[e.jsx(E,{htmlFor:"name",className:O.name?"text-destructive":"",children:"名称 *"}),e.jsx(le,{id:"name",value:y?.name||"",onChange:W=>{w(ye=>ye?{...ye,name:W.target.value}:null),O.name&&k(ye=>({...ye,name:void 0}))},placeholder:"例如: DeepSeek, SiliconFlow",className:O.name?"border-destructive focus-visible:ring-destructive":""}),O.name&&e.jsx("p",{className:"text-xs text-destructive",children:O.name})]}),e.jsxs("div",{className:"grid gap-2","data-tour":"provider-url-input",children:[e.jsx(E,{htmlFor:"base_url",className:O.base_url?"text-destructive":"",children:"基础 URL *"}),e.jsx(le,{id:"base_url",value:y?.base_url||"",onChange:W=>{w(ye=>ye?{...ye,base_url:W.target.value}:null),O.base_url&&k(ye=>({...ye,base_url:void 0}))},placeholder:"https://api.example.com/v1",disabled:ts,className:`${ts?"bg-muted cursor-not-allowed":""} ${O.base_url?"border-destructive focus-visible:ring-destructive":""}`}),O.base_url&&e.jsx("p",{className:"text-xs text-destructive",children:O.base_url}),ts&&!O.base_url&&e.jsx("p",{className:"text-xs text-muted-foreground",children:'使用模板时 URL 不可编辑,切换到"自定义"以手动配置'})]}),e.jsxs("div",{className:"grid gap-2","data-tour":"provider-apikey-input",children:[e.jsx(E,{htmlFor:"api_key",className:O.api_key?"text-destructive":"",children:"API Key *"}),e.jsxs("div",{className:"flex gap-2",children:[e.jsx(le,{id:"api_key",type:J?"text":"password",value:y?.api_key||"",onChange:W=>{w(ye=>ye?{...ye,api_key:W.target.value}:null),O.api_key&&k(ye=>({...ye,api_key:void 0}))},placeholder:"sk-...",className:`flex-1 ${O.api_key?"border-destructive focus-visible:ring-destructive":""}`}),e.jsx(_,{type:"button",variant:"outline",size:"icon",onClick:()=>U(!J),title:J?"隐藏密钥":"显示密钥",children:J?e.jsx(Wi,{className:"h-4 w-4"}):e.jsx(ia,{className:"h-4 w-4"})}),e.jsx(_,{type:"button",variant:"outline",size:"icon",onClick:Cs,title:"复制密钥",children:e.jsx(Ro,{className:"h-4 w-4"})})]}),O.api_key&&e.jsx("p",{className:"text-xs text-destructive",children:O.api_key})]}),e.jsxs("div",{className:"grid gap-2",children:[e.jsx(E,{htmlFor:"client_type",children:"客户端类型"}),e.jsxs(Ie,{value:y?.client_type||"openai",onValueChange:W=>w(ye=>ye?{...ye,client_type:W}:null),disabled:ts,children:[e.jsx($e,{id:"client_type",className:ts?"bg-muted cursor-not-allowed":"",children:e.jsx(Pe,{placeholder:"选择客户端类型"})}),e.jsxs(Be,{children:[e.jsx(X,{value:"openai",children:"OpenAI"}),e.jsx(X,{value:"gemini",children:"Gemini"})]})]}),ts&&e.jsx("p",{className:"text-xs text-muted-foreground",children:'使用模板时客户端类型不可编辑,切换到"自定义"以手动配置'})]}),e.jsxs("div",{className:"grid grid-cols-1 sm:grid-cols-3 gap-4",children:[e.jsxs("div",{className:"grid gap-2",children:[e.jsx(E,{htmlFor:"max_retry",children:"最大重试"}),e.jsx(le,{id:"max_retry",type:"number",min:"0",value:y?.max_retry??"",onChange:W=>{const ye=W.target.value===""?null:parseInt(W.target.value);w(Re=>Re?{...Re,max_retry:ye}:null)},placeholder:"默认: 2"})]}),e.jsxs("div",{className:"grid gap-2",children:[e.jsx(E,{htmlFor:"timeout",children:"超时(秒)"}),e.jsx(le,{id:"timeout",type:"number",min:"1",value:y?.timeout??"",onChange:W=>{const ye=W.target.value===""?null:parseInt(W.target.value);w(Re=>Re?{...Re,timeout:ye}:null)},placeholder:"默认: 30"})]}),e.jsxs("div",{className:"grid gap-2",children:[e.jsx(E,{htmlFor:"retry_interval",children:"重试间隔(秒)"}),e.jsx(le,{id:"retry_interval",type:"number",min:"1",value:y?.retry_interval??"",onChange:W=>{const ye=W.target.value===""?null:parseInt(W.target.value);w(Re=>Re?{...Re,retry_interval:ye}:null)},placeholder:"默认: 10"})]})]})]}),e.jsxs(st,{children:[e.jsx(_,{type:"button",variant:"outline",onClick:()=>v(!1),"data-tour":"provider-cancel-button",children:"取消"}),e.jsx(_,{type:"submit","data-tour":"provider-save-button",children:"保存"})]})]})]})}),e.jsx(vs,{open:T,onOpenChange:A,children:e.jsxs(ds,{children:[e.jsxs(us,{children:[e.jsx(xs,{children:"确认删除"}),e.jsxs(hs,{children:['确定要删除提供商 "',F!==null?l[F]?.name:"",'" 吗? 此操作无法撤销。']})]}),e.jsxs(ms,{children:[e.jsx(ps,{children:"取消"}),e.jsx(fs,{onClick:es,children:"删除"})]})]})}),e.jsx(vs,{open:ve,onOpenChange:je,children:e.jsxs(ds,{children:[e.jsxs(us,{children:[e.jsx(xs,{children:"确认批量删除"}),e.jsxs(hs,{children:["确定要删除选中的 ",he.size," 个提供商吗? 此操作无法撤销。"]})]}),e.jsxs(ms,{children:[e.jsx(ps,{children:"取消"}),e.jsx(fs,{onClick:tt,className:"bg-destructive text-destructive-foreground hover:bg-destructive/90",children:"批量删除"})]})]})}),e.jsx(vs,{open:pe.isOpen,onOpenChange:W=>ke(ye=>({...ye,isOpen:W})),children:e.jsxs(ds,{className:"max-w-2xl",children:[e.jsxs(us,{children:[e.jsx(xs,{children:"确认删除提供商"}),e.jsx(hs,{asChild:!0,children:e.jsxs("div",{className:"space-y-3",children:[e.jsxs("p",{children:["您即将删除以下提供商:",e.jsx("strong",{className:"text-foreground ml-1",children:pe.providersToDelete.join(", ")})]}),e.jsxs("p",{className:"text-yellow-600 dark:text-yellow-500 font-medium",children:["⚠️ 此操作将同时删除 ",pe.affectedModels.length," 个关联的模型:"]}),e.jsx(Ye,{className:"h-32 w-full rounded border p-3",children:e.jsx("div",{className:"space-y-1",children:pe.affectedModels.map((W,ye)=>e.jsxs("div",{className:"text-sm",children:[e.jsx("span",{className:"font-mono text-muted-foreground",children:"•"}),e.jsx("span",{className:"ml-2 font-medium",children:W.name}),e.jsxs("span",{className:"ml-2 text-xs text-muted-foreground",children:["(",W.model_identifier,")"]})]},ye))})}),e.jsx("p",{className:"text-sm text-muted-foreground",children:"这些模型将从模型列表和所有任务分配中移除。此操作无法撤销。"})]})})]}),e.jsxs(ms,{children:[e.jsx(ps,{onClick:q,children:"取消"}),e.jsx(fs,{onClick:mt,className:"bg-destructive text-destructive-foreground hover:bg-destructive/90",children:"确认删除"})]})]})}),e.jsx(Jn,{})]})}function Xi(){return typeof crypto<"u"&&typeof crypto.randomUUID=="function"?crypto.randomUUID():`${Date.now().toString(36)}-${Math.random().toString(36).substring(2,11)}`}function Tm(l){return l===null?"null":Array.isArray(l)?"array":typeof l=="object"?"object":typeof l=="boolean"?"boolean":typeof l=="number"?"number":"string"}function Im(l){return Object.entries(l).map(([n,i])=>{const c=Tm(i),u={id:Xi(),key:n,value:i,type:c,expanded:!0};return c==="object"&&i&&typeof i=="object"?u.children=Im(i):c==="array"&&Array.isArray(i)&&(u.children=i.map((x,h)=>{const f=Tm(x),p={id:Xi(),key:String(h),value:x,type:f,expanded:!0};return f==="object"&&x&&typeof x=="object"?p.children=Im(x):f==="array"&&Array.isArray(x)&&(p.children=x.map((g,N)=>({id:Xi(),key:String(N),value:g,type:Tm(g),expanded:!0}))),p})),u})}function Pm(l){const n={};for(const i of l)i.key.trim()&&(i.type==="object"&&i.children?n[i.key]=Pm(i.children):i.type==="array"&&i.children?n[i.key]=i.children.map(c=>c.type==="object"&&c.children?Pm(c.children):c.type==="array"&&c.children?c.children.map(u=>u.value):c.value):i.type==="null"?n[i.key]=null:n[i.key]=i.value);return n}function Sg(l,n){switch(n){case"boolean":return l==="true";case"number":{const i=parseFloat(l);return isNaN(i)?0:i}case"null":return null;default:return l}}function yv({node:l,level:n,onUpdate:i,onRemove:c,onAddChild:u,onToggleExpand:x}){const h=l.type==="object"||l.type==="array",f=l.children&&l.children.length>0;return e.jsxs("div",{className:"space-y-1",children:[e.jsxs("div",{className:"grid gap-2 items-center",style:{gridTemplateColumns:h?"32px 1fr 90px 64px":"32px 1fr 1fr 90px 32px",paddingLeft:`${n*20}px`},children:[e.jsx(_,{type:"button",variant:"ghost",size:"icon",className:"h-7 w-7",onClick:()=>x(l.id),disabled:!h||!f,children:h&&f?l.expanded?e.jsx(za,{className:"h-4 w-4"}):e.jsx(Zt,{className:"h-4 w-4"}):e.jsx("span",{className:"w-4"})}),e.jsx(le,{value:l.key,onChange:p=>i(l.id,"key",p.target.value),placeholder:"key",className:"h-8 text-sm"}),!h&&e.jsx(e.Fragment,{children:l.type==="boolean"?e.jsxs("div",{className:"flex items-center h-8 px-3 border rounded-md bg-background",children:[e.jsx(Fe,{checked:l.value===!0,onCheckedChange:p=>i(l.id,"value",p)}),e.jsx("span",{className:"ml-2 text-sm text-muted-foreground",children:l.value?"true":"false"})]}):l.type==="null"?e.jsx("div",{className:"flex items-center h-8 px-3 border rounded-md bg-muted text-sm text-muted-foreground",children:"null"}):e.jsx(le,{type:l.type==="number"?"number":"text",value:l.value,onChange:p=>i(l.id,"value",p.target.value),placeholder:"value",className:"h-8 text-sm",step:l.type==="number"?"any":void 0})}),e.jsxs(Ie,{value:l.type,onValueChange:p=>i(l.id,"type",p),children:[e.jsx($e,{className:"h-8 text-xs",children:e.jsx(Pe,{})}),e.jsxs(Be,{children:[e.jsx(X,{value:"string",children:"字符串"}),e.jsx(X,{value:"number",children:"数字"}),e.jsx(X,{value:"boolean",children:"布尔"}),e.jsx(X,{value:"null",children:"Null"}),e.jsx(X,{value:"object",children:"对象"}),e.jsx(X,{value:"array",children:"数组"})]})]}),e.jsxs("div",{className:"flex gap-1 justify-end",children:[h&&e.jsx(_,{type:"button",variant:"ghost",size:"icon",className:"h-8 w-8 text-muted-foreground hover:text-primary",onClick:()=>u(l.id),title:"添加子项",children:e.jsx(et,{className:"h-4 w-4"})}),e.jsx(_,{type:"button",variant:"ghost",size:"icon",className:"h-8 w-8 text-muted-foreground hover:text-destructive",onClick:()=>c(l.id),title:"删除",children:e.jsx(ls,{className:"h-4 w-4"})})]})]}),h&&l.expanded&&l.children&&l.children.length>0&&e.jsx("div",{className:"space-y-1",children:l.children.map(p=>e.jsx(yv,{node:p,level:n+1,onUpdate:i,onRemove:c,onAddChild:u,onToggleExpand:x},p.id))})]})}function iS({value:l,onChange:n,placeholder:i="添加参数..."}){const[c,u]=d.useState(()=>Im(l||{})),x=d.useCallback(v=>{u(v),n(Pm(v))},[n]),h=d.useCallback(()=>{const v={id:Xi(),key:"",value:"",type:"string",expanded:!1};x([...c,v])},[c,x]),f=d.useCallback((v,y,w)=>{const b=R=>R.map(D=>{if(D.id===v)if(y==="type"){const S=w;if(S==="object")return{...D,type:S,value:{},children:[]};if(S==="array")return{...D,type:S,value:[],children:[]};if(S==="null")return{...D,type:S,value:null};{const P=Sg(String(D.value),S);return{...D,type:S,value:P,children:void 0}}}else if(y==="value"){const S=Sg(String(w),D.type);return{...D,value:S}}else return{...D,[y]:String(w)};return D.children?{...D,children:b(D.children)}:D});x(b(c))},[c,x]),p=d.useCallback(v=>{const y=w=>w.filter(b=>b.id!==v).map(b=>b.children?{...b,children:y(b.children)}:b);x(y(c))},[c,x]),g=d.useCallback(v=>{const y=w=>w.map(b=>{if(b.id===v){const R={id:Xi(),key:b.type==="array"?String(b.children?.length||0):"",value:"",type:"string",expanded:!0};return{...b,children:[...b.children||[],R]}}return b.children?{...b,children:y(b.children)}:b});x(y(c))},[c,x]),N=d.useCallback(v=>{const y=w=>w.map(b=>b.id===v?{...b,expanded:!b.expanded}:b.children?{...b,children:y(b.children)}:b);u(y(c))},[c]);return e.jsxs("div",{className:"h-full flex flex-col gap-2",children:[e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsxs("span",{className:"text-xs text-muted-foreground",children:[c.length," 个参数"]}),e.jsxs(_,{type:"button",size:"sm",variant:"outline",onClick:h,className:"h-7 text-xs",children:[e.jsx(et,{className:"h-3 w-3 mr-1"}),"添加参数"]})]}),e.jsx("div",{className:"flex-1 overflow-y-auto space-y-1",children:c.length===0?e.jsx("div",{className:"text-sm text-muted-foreground text-center py-4 border border-dashed rounded-md",children:i}):e.jsxs("div",{className:"space-y-1",children:[e.jsxs("div",{className:"grid gap-2 text-xs text-muted-foreground px-1 sticky top-0 bg-background z-10",style:{gridTemplateColumns:"32px 1fr 1fr 90px 32px"},children:[e.jsx("span",{}),e.jsx("span",{children:"键名"}),e.jsx("span",{children:"值"}),e.jsx("span",{children:"类型"}),e.jsx("span",{})]}),c.map(v=>e.jsx(yv,{node:v,level:0,onUpdate:f,onRemove:p,onAddChild:g,onToggleExpand:N},v.id))]})})]})}function kg(l){if(!l.trim())return{valid:!0,parsed:{}};try{const n=JSON.parse(l);return typeof n!="object"||n===null||Array.isArray(n)?{valid:!1,error:"必须是一个 JSON 对象 {}"}:{valid:!0,parsed:n}}catch{return{valid:!1,error:"JSON 格式错误"}}}function cS({value:l,onChange:n,className:i,placeholder:c="添加额外参数..."}){const[u,x]=d.useState("list"),h=d.useMemo(()=>Object.keys(l||{}).length>0?JSON.stringify(l,null,2):"",[l]),[f,p]=d.useState(h),[g,N]=d.useState(null);d.useEffect(()=>{p(h)},[h]);const v=d.useMemo(()=>{const b=kg(f);return b.valid&&b.parsed?{success:!0,data:b.parsed}:{success:!1,data:{}}},[f]),y=d.useCallback(b=>{const R=b;R==="json"&&u==="list"&&(p(Object.keys(l).length>0?JSON.stringify(l,null,2):""),N(null)),x(R)},[u,l]),w=d.useCallback(b=>{p(b);const R=kg(b);R.valid&&R.parsed?(N(null),n(R.parsed)):N(R.error||"JSON 格式错误")},[n]);return e.jsx("div",{className:I("h-full flex flex-col",i),children:e.jsxs(ta,{value:u,onValueChange:y,className:"w-full flex-1 flex flex-col",children:[e.jsxs(Xt,{className:"h-8 p-0.5 bg-muted/60 w-fit",children:[e.jsx(Je,{value:"list",className:"h-7 px-3 text-xs data-[state=active]:bg-background data-[state=active]:shadow-sm",children:"可视化编辑"}),e.jsx(Je,{value:"json",className:"h-7 px-3 text-xs data-[state=active]:bg-background data-[state=active]:shadow-sm",children:"JSON 编辑"})]}),e.jsx(ys,{value:"list",className:"mt-2 flex-1 flex flex-col overflow-hidden data-[state=inactive]:hidden data-[state=inactive]:h-0",children:e.jsx(iS,{value:l,onChange:n,placeholder:c})}),e.jsx(ys,{value:"json",className:"mt-2 flex-1 flex flex-col overflow-hidden data-[state=inactive]:hidden data-[state=inactive]:h-0",children:e.jsxs("div",{className:"grid grid-cols-1 md:grid-cols-2 gap-3 flex-1 overflow-hidden",children:[e.jsxs("div",{className:"flex flex-col gap-2 overflow-hidden",children:[e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsx("span",{className:"text-xs text-muted-foreground",children:"编辑"}),g?e.jsxs("div",{className:"flex items-center gap-1 text-xs text-destructive",children:[e.jsx(_t,{className:"h-3 w-3"}),e.jsx("span",{className:"truncate max-w-[150px]",children:g})]}):f.trim()&&e.jsxs("div",{className:"flex items-center gap-1 text-xs text-green-600 dark:text-green-400",children:[e.jsx(Ct,{className:"h-3 w-3"}),e.jsx("span",{children:"有效"})]})]}),e.jsx(ot,{value:f,onChange:b=>w(b.target.value),placeholder:`{ "key": "value" }`,className:I("font-mono text-sm flex-1 resize-none",g&&"border-destructive focus-visible:ring-destructive")}),e.jsx("p",{className:"text-xs text-muted-foreground",children:"支持任意 JSON 类型(包括嵌套对象和数组)"})]}),e.jsxs("div",{className:"flex flex-col gap-2 overflow-hidden",children:[e.jsx("span",{className:"text-xs text-muted-foreground",children:"预览"}),e.jsx("div",{className:"flex-1 rounded-md border bg-muted/30 p-3 overflow-auto",children:v.success&&Object.keys(v.data).length>0?e.jsx("pre",{className:"font-mono text-xs whitespace-pre-wrap break-words",children:JSON.stringify(v.data,null,2)}):v.success?e.jsx("div",{className:"flex items-center justify-center h-full text-sm text-muted-foreground",children:"暂无参数"}):e.jsx("div",{className:"flex items-center justify-center h-full text-sm text-destructive",children:"JSON 格式错误"})}),e.jsx("p",{className:"text-xs text-muted-foreground",children:"实时预览解析结果"})]})]})})]})})}function oS({open:l,onOpenChange:n,value:i,onChange:c}){const[u,x]=d.useState(i),h=g=>{g&&x(i),n(g)},f=()=>{c(u),n(!1)},p=()=>{x(i),n(!1)};return e.jsx(Is,{open:l,onOpenChange:h,children:e.jsxs(Os,{className:"max-w-3xl h-[70vh] flex flex-col",children:[e.jsxs(Ds,{children:[e.jsx(Rs,{children:"编辑额外参数"}),e.jsx(Ks,{children:"配置模型调用时的额外参数,支持嵌套对象和数组"})]}),e.jsx("div",{className:"flex-1 overflow-hidden min-h-0",children:e.jsx(cS,{value:u,onChange:x,placeholder:"添加额外参数(如 thinking、top_p 等)..."})}),e.jsxs(st,{children:[e.jsx(_,{variant:"outline",onClick:p,children:"取消"}),e.jsx(_,{onClick:f,children:"保存"})]})]})})}const Qr="https://maibot-plugin-stats.maibot-webui.workers.dev";async function dS(l){const n=new URLSearchParams;l?.status&&n.set("status",l.status),l?.page&&n.set("page",l.page.toString()),l?.page_size&&n.set("page_size",l.page_size.toString()),l?.search&&n.set("search",l.search),l?.sort_by&&n.set("sort_by",l.sort_by),l?.sort_order&&n.set("sort_order",l.sort_order);const i=await fetch(`${Qr}/pack?${n.toString()}`);if(!i.ok)throw new Error(`获取 Pack 列表失败: ${i.status}`);return i.json()}async function uS(l){const n=await fetch(`${Qr}/pack/${l}`);if(!n.ok)throw new Error(`获取 Pack 失败: ${n.status}`);const i=await n.json();if(!i.success)throw new Error(i.error||"获取 Pack 失败");return i.pack}async function mS(l){const i=await(await fetch(`${Qr}/pack`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(l)})).json();if(!i.success)throw new Error(i.error||"创建 Pack 失败");return i}async function xS(l,n){await fetch(`${Qr}/pack/download`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({pack_id:l,user_id:n})})}async function wv(l,n){const c=await(await fetch(`${Qr}/pack/like`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({pack_id:l,user_id:n})})).json();if(!c.success)throw new Error(c.error||"点赞失败");return{likes:c.likes,liked:c.liked}}async function _v(l,n){return(await(await fetch(`${Qr}/pack/like/check?pack_id=${l}&user_id=${n}`)).json()).liked||!1}async function hS(l){const n=await we("/api/webui/config/model");if(!n.ok)throw new Error("获取当前模型配置失败");const i=await n.json(),c=i.config||i;console.log("=== Pack Conflict Detection ==="),console.log("Pack providers:",l.providers),console.log("Local providers:",c.api_providers);const u={existing_providers:[],new_providers:[],conflicting_models:[]},x=c.api_providers||[];for(const f of l.providers){console.log(` Checking pack provider: ${f.name}`),console.log(` Pack URL: ${f.base_url}`),console.log(` Normalized: ${Em(f.base_url)}`);const p=x.filter(g=>{const N=Em(g.base_url),v=Em(f.base_url);return console.log(` Comparing with local "${g.name}": ${g.base_url}`),console.log(` Local normalized: ${N}`),console.log(` Match: ${N===v}`),N===v});p.length>0?(console.log(` ✓ Matched with ${p.length} local provider(s):`,p.map(g=>g.name).join(", ")),u.existing_providers.push({pack_provider:f,local_providers:p.map(g=>({name:g.name,base_url:g.base_url}))})):(console.log(" ✗ No match found - will need API key"),u.new_providers.push(f))}const h=c.models||[];console.log(` === Model Conflict Detection ===`);for(const f of l.models){const p=h.find(g=>g.name===f.name);p&&(console.log(`Model conflict: ${f.name}`),u.conflicting_models.push({pack_model:f.name,local_model:p.name}))}return console.log(` === Detection Summary ===`),console.log(`Existing providers: ${u.existing_providers.length}`),console.log(`New providers: ${u.new_providers.length}`),console.log(`Conflicting models: ${u.conflicting_models.length}`),console.log(`=========================== -`),u}async function fS(l,n,i,c){const u=await we("/api/webui/config/model");if(!u.ok)throw new Error("获取当前模型配置失败");const x=await u.json(),h=x.config||x;if(n.apply_providers){const p=n.selected_providers?l.providers.filter(g=>n.selected_providers.includes(g.name)):l.providers;for(const g of p){if(i[g.name])continue;const N=c[g.name];if(!N)throw new Error(`提供商 "${g.name}" 缺少 API Key`);const v={...g,api_key:N},y=h.api_providers.findIndex(w=>w.name===g.name);y>=0?h.api_providers[y]=v:h.api_providers.push(v)}}if(n.apply_models){const p=n.selected_models?l.models.filter(g=>n.selected_models.includes(g.name)):l.models;for(const g of p){const N=i[g.api_provider]||g.api_provider,v={...g,api_provider:N},y=h.models.findIndex(w=>w.name===g.name);y>=0?h.models[y]=v:h.models.push(v)}}if(n.apply_task_config){const p=n.selected_tasks||Object.keys(l.task_config);for(const g of p){const N=l.task_config[g];if(!N)continue;const v=new Set(n.selected_models||l.models.map(b=>b.name)),y=N.model_list.filter(b=>v.has(b));if(y.length===0)continue;const w={...N,model_list:y};if(n.task_mode==="replace")h.model_task_config[g]=w;else{const b=h.model_task_config[g];if(b){const R=[...new Set([...b.model_list,...y])];h.model_task_config[g]={...b,model_list:R}}else h.model_task_config[g]=w}}}if(!(await we("/api/webui/config/model",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(h)})).ok)throw new Error("保存配置失败")}async function pS(l){const n=await we("/api/webui/config/model");if(!n.ok)throw new Error("获取当前模型配置失败");const i=await n.json();if(!i.success||!i.config)throw new Error("获取配置失败");const c=i.config;let u=(c.api_providers||[]).map(g=>({name:g.name,base_url:g.base_url,client_type:g.client_type,max_retry:g.max_retry,timeout:g.timeout,retry_interval:g.retry_interval}));l.selectedProviders&&(u=u.filter(g=>l.selectedProviders.includes(g.name)));let x=c.models||[];l.selectedModels&&(x=x.filter(g=>l.selectedModels.includes(g.name)));const h={},f=c.model_task_config||{},p=l.selectedTasks||Object.keys(f);for(const g of p)f[g]&&(h[g]=f[g]);return{providers:u,models:x,task_config:h}}function Em(l){try{const n=new URL(l);return`${n.protocol}//${n.host}${n.pathname}`.replace(/\/$/,"").toLowerCase()}catch{return l.toLowerCase().replace(/\/$/,"")}}function Sv(){const l="maibot_pack_user_id";let n=localStorage.getItem(l);return n||(n="pack_user_"+Math.random().toString(36).substring(2,15),localStorage.setItem(l,n)),n}const gS={utils:"通用工具",utils_small:"轻量工具",tool_use:"工具调用",replyer:"回复生成",planner:"规划推理",vlm:"视觉模型",voice:"语音处理",embedding:"向量嵌入",lpmm_entity_extract:"实体提取",lpmm_rdf_build:"RDF构建",lpmm_qa:"问答模型"},jS=["官方推荐","性价比","高性能","免费模型","国内可用","海外模型","OpenAI","Claude","Gemini","国产模型","多模态","轻量级"];function vS({trigger:l}){const[n,i]=d.useState(!1),[c,u]=d.useState(1),[x,h]=d.useState(!1),[f,p]=d.useState(!1),[g,N]=d.useState([]),[v,y]=d.useState([]),[w,b]=d.useState({}),[R,D]=d.useState(new Set),[S,P]=d.useState(new Set),[M,T]=d.useState(new Set),[A,F]=d.useState(""),[L,J]=d.useState(""),[U,ue]=d.useState(""),[xe,he]=d.useState([]);d.useEffect(()=>{n&&c===1&&ne()},[n,c]);const ne=async()=>{h(!0);try{const O=await pS({name:"",description:"",author:""});N(O.providers),y(O.models),b(O.task_config),D(new Set(O.providers.map(k=>k.name))),P(new Set(O.models.map(k=>k.name))),T(new Set(Object.keys(O.task_config)))}catch(O){console.error("加载配置失败:",O),Qt({title:"加载当前配置失败",variant:"destructive"})}finally{h(!1)}},ve=O=>{const k=new Set(R),H=new Set(S),se=new Set(M);k.has(O)?(k.delete(O),v.filter(Z=>Z.api_provider===O).forEach(Z=>H.delete(Z.name)),Object.entries(w).forEach(([Z,Oe])=>{Oe.model_list&&(Oe.model_list.some(Q=>H.has(Q))||se.delete(Z))})):(k.add(O),v.filter(Z=>Z.api_provider===O).forEach(Z=>H.add(Z.name)),Object.entries(w).forEach(([Z,Oe])=>{Oe.model_list&&Oe.model_list.some(Q=>{const ee=v.find(Ue=>Ue.name===Q);return ee&&ee.api_provider===O})&&se.add(Z)})),D(k),P(H),T(se)},je=O=>{const k=new Set(S),H=new Set(M);k.has(O)?(k.delete(O),Object.entries(w).forEach(([se,Ee])=>{Ee.model_list&&(Ee.model_list.some(Oe=>k.has(Oe))||H.delete(se))})):(k.add(O),Object.entries(w).forEach(([se,Ee])=>{Ee.model_list&&Ee.model_list.includes(O)&&H.add(se)})),P(k),T(H)},z=O=>{const k=new Set(M);k.has(O)?k.delete(O):k.add(O),T(k)},V=O=>{xe.includes(O)?he(xe.filter(k=>k!==O)):xe.length<5?he([...xe,O]):Qt({title:"最多选择 5 个标签",variant:"destructive"})},B=()=>{R.size===g.length?D(new Set):D(new Set(g.map(O=>O.name)))},oe=()=>{S.size===v.length?P(new Set):P(new Set(v.map(O=>O.name)))},K=()=>{const O=Object.keys(w);M.size===O.length?T(new Set):T(new Set(O))},_e=async()=>{if(!A.trim()){Qt({title:"请输入模板名称",variant:"destructive"});return}if(!L.trim()){Qt({title:"请输入模板描述",variant:"destructive"});return}if(!U.trim()){Qt({title:"请输入作者名称",variant:"destructive"});return}if(R.size===0&&S.size===0&&M.size===0){Qt({title:"请至少选择一项配置",variant:"destructive"});return}p(!0);try{const O=g.filter(se=>R.has(se.name)),k=v.filter(se=>S.has(se.name)),H={};for(const[se,Ee]of Object.entries(w))M.has(se)&&(H[se]=Ee);await mS({name:A.trim(),description:L.trim(),author:U.trim(),tags:xe,providers:O,models:k,task_config:H}),Qt({title:"模板已提交审核,审核通过后将显示在市场中"}),i(!1),pe()}catch(O){console.error("提交失败:",O),Qt({title:O instanceof Error?O.message:"提交失败",variant:"destructive"})}finally{p(!1)}},pe=()=>{u(1),F(""),J(""),ue(""),he([]),D(new Set),P(new Set),T(new Set)},ke=2;return e.jsxs(Is,{open:n,onOpenChange:i,children:[e.jsx(Wo,{asChild:!0,children:l||e.jsxs(_,{variant:"outline",children:[e.jsx($j,{className:"w-4 h-4 mr-2"}),"分享配置"]})}),e.jsxs(Os,{className:"max-w-2xl max-h-[85vh] flex flex-col",children:[e.jsxs(Ds,{children:[e.jsxs(Rs,{className:"flex items-center gap-2",children:[e.jsx(ra,{className:"w-5 h-5"}),"分享配置模板"]}),e.jsxs(Ks,{children:["步骤 ",c," / ",ke,":",c===1&&"选择要分享的配置",c===2&&"填写模板信息"]})]}),e.jsx(Ye,{className:"h-[calc(85vh-220px)] pr-4",children:x?e.jsxs("div",{className:"py-8 text-center",children:[e.jsx(Bs,{className:"w-8 h-8 mx-auto animate-spin text-primary"}),e.jsx("p",{className:"mt-4 text-muted-foreground",children:"正在加载当前配置..."})]}):e.jsxs(e.Fragment,{children:[c===1&&e.jsxs("div",{className:"space-y-4",children:[e.jsxs(at,{children:[e.jsx(Ht,{className:"h-4 w-4"}),e.jsx(Hn,{children:"安全提示"}),e.jsxs(lt,{children:["分享的配置将",e.jsx("strong",{children:"不包含"})," API Key,其他用户需要自行配置。"]})]}),e.jsxs(ta,{defaultValue:"providers",className:"w-full",children:[e.jsxs(Xt,{className:"grid w-full grid-cols-3",children:[e.jsxs(Je,{value:"providers",children:[e.jsx(Dl,{className:"w-4 h-4 mr-2"}),"API 提供商",e.jsxs(Se,{variant:"secondary",className:"ml-2",children:[R.size,"/",g.length]})]}),e.jsxs(Je,{value:"models",children:[e.jsx(Gn,{className:"w-4 h-4 mr-2"}),"模型配置",e.jsxs(Se,{variant:"secondary",className:"ml-2",children:[S.size,"/",v.length]})]}),e.jsxs(Je,{value:"tasks",children:[e.jsx(Vn,{className:"w-4 h-4 mr-2"}),"任务配置",e.jsxs(Se,{variant:"secondary",className:"ml-2",children:[M.size,"/",Object.keys(w).length]})]})]}),e.jsx(ys,{value:"providers",className:"space-y-2 mt-4",children:e.jsxs("div",{className:"space-y-2",children:[e.jsx("div",{className:"flex justify-end",children:e.jsx(_,{variant:"ghost",size:"sm",onClick:B,children:R.size===g.length?"取消全选":"全选"})}),g.length===0?e.jsx("p",{className:"text-sm text-muted-foreground text-center py-2",children:"暂无提供商配置"}):g.map(O=>e.jsxs("div",{className:"flex items-center space-x-2 p-2 rounded hover:bg-muted",children:[e.jsx(qs,{id:`provider-${O.name}`,checked:R.has(O.name),onCheckedChange:()=>ve(O.name)}),e.jsxs(E,{htmlFor:`provider-${O.name}`,className:"flex-1 cursor-pointer",children:[e.jsx("span",{className:"font-medium",children:O.name}),e.jsx("span",{className:"text-xs text-muted-foreground ml-2",children:O.base_url})]}),e.jsx(Se,{variant:"outline",className:"text-xs",children:O.client_type})]},O.name))]})}),e.jsx(ys,{value:"models",className:"space-y-2 mt-4",children:e.jsxs("div",{className:"space-y-2",children:[e.jsx("div",{className:"flex justify-end",children:e.jsx(_,{variant:"ghost",size:"sm",onClick:oe,children:S.size===v.length?"取消全选":"全选"})}),v.length===0?e.jsx("p",{className:"text-sm text-muted-foreground text-center py-2",children:"暂无模型配置"}):v.map(O=>e.jsxs("div",{className:"flex items-center space-x-2 p-2 rounded hover:bg-muted",children:[e.jsx(qs,{id:`model-${O.name}`,checked:S.has(O.name),onCheckedChange:()=>je(O.name)}),e.jsxs(E,{htmlFor:`model-${O.name}`,className:"flex-1 cursor-pointer",children:[e.jsx("span",{className:"font-medium",children:O.name}),e.jsx("span",{className:"text-xs text-muted-foreground ml-2",children:O.model_identifier})]}),e.jsx("span",{className:"text-xs text-muted-foreground",children:O.api_provider})]},O.name))]})}),e.jsx(ys,{value:"tasks",className:"space-y-2 mt-4",children:e.jsxs("div",{className:"space-y-2",children:[e.jsx("div",{className:"flex justify-end",children:e.jsx(_,{variant:"ghost",size:"sm",onClick:K,children:M.size===Object.keys(w).length?"取消全选":"全选"})}),Object.keys(w).length===0?e.jsx("p",{className:"text-sm text-muted-foreground text-center py-2",children:"暂无任务配置"}):Object.entries(w).map(([O,k])=>e.jsxs("div",{className:"space-y-2 p-2 rounded hover:bg-muted",children:[e.jsxs("div",{className:"flex items-center space-x-2",children:[e.jsx(qs,{id:`task-${O}`,checked:M.has(O),onCheckedChange:()=>z(O)}),e.jsx(E,{htmlFor:`task-${O}`,className:"flex-1 cursor-pointer",children:e.jsx("span",{className:"font-medium",children:gS[O]||O})}),e.jsxs(Se,{variant:"outline",className:"text-xs",children:[k.model_list.length," 个模型"]})]}),k.model_list&&k.model_list.length>0&&e.jsx("div",{className:"ml-6 flex flex-wrap gap-1",children:k.model_list.map(H=>{const se=v.find(Z=>Z.name===H),Ee=S.has(H);return e.jsxs(Se,{variant:Ee?"default":"outline",className:"text-xs cursor-pointer hover:opacity-80 transition-opacity",onClick:()=>je(H),children:[H,se&&e.jsxs("span",{className:"ml-1 opacity-70",children:["(",se.api_provider,")"]})]},H)})})]},O))]})})]})]}),c===2&&e.jsxs("div",{className:"space-y-4",children:[e.jsxs("div",{className:"flex gap-4 text-sm p-3 bg-muted rounded-lg",children:[e.jsxs("span",{className:"flex items-center gap-1",children:[e.jsx(Dl,{className:"w-4 h-4"}),R.size," 个提供商"]}),e.jsxs("span",{className:"flex items-center gap-1",children:[e.jsx(Gn,{className:"w-4 h-4"}),S.size," 个模型"]}),e.jsxs("span",{className:"flex items-center gap-1",children:[e.jsx(Vn,{className:"w-4 h-4"}),M.size," 个任务"]})]}),e.jsx(Yt,{}),e.jsxs("div",{className:"space-y-4",children:[e.jsxs("div",{className:"space-y-2",children:[e.jsx(E,{htmlFor:"pack-name",children:"模板名称 *"}),e.jsx(le,{id:"pack-name",placeholder:"例如:高性价比国产模型配置",value:A,onChange:O=>F(O.target.value),maxLength:50}),e.jsxs("p",{className:"text-xs text-muted-foreground",children:[A.length,"/50"]})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsx(E,{htmlFor:"pack-description",children:"模板描述 *"}),e.jsx(ot,{id:"pack-description",placeholder:"详细描述这个配置模板的特点、适用场景等...",value:L,onChange:O=>J(O.target.value),rows:4,maxLength:500}),e.jsxs("p",{className:"text-xs text-muted-foreground",children:[L.length,"/500"]})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsx(E,{htmlFor:"pack-author",children:"作者名称 *"}),e.jsx(le,{id:"pack-author",placeholder:"你的昵称或 ID",value:U,onChange:O=>ue(O.target.value),maxLength:30})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsx(E,{children:"标签(可选,最多 5 个)"}),e.jsx("div",{className:"flex flex-wrap gap-2",children:jS.map(O=>e.jsxs(Se,{variant:xe.includes(O)?"default":"outline",className:"cursor-pointer transition-colors",onClick:()=>V(O),children:[xe.includes(O)&&e.jsx(kt,{className:"w-3 h-3 mr-1"}),e.jsx(Xo,{className:"w-3 h-3 mr-1"}),O]},O))})]})]}),e.jsxs(at,{children:[e.jsx(Ht,{className:"h-4 w-4"}),e.jsx(Hn,{children:"审核说明"}),e.jsx(lt,{children:"提交后需要经过审核才能在市场中展示。审核通常在 1-3 个工作日内完成。"})]})]})]})}),e.jsxs(st,{className:"flex justify-between pt-4 border-t",children:[e.jsx("div",{children:c>1&&e.jsx(_,{variant:"outline",onClick:()=>u(c-1),disabled:f,children:"上一步"})}),e.jsxs("div",{className:"flex gap-2",children:[e.jsx(_,{variant:"outline",onClick:()=>{i(!1),pe()},disabled:f,children:"取消"}),cu(c+1),disabled:x||R.size===0&&S.size===0&&M.size===0,children:"下一步"}):e.jsxs(_,{onClick:_e,disabled:f,children:[f&&e.jsx(Bs,{className:"w-4 h-4 mr-2 animate-spin"}),"提交审核"]})]})]})]})]})}function NS({value:l,label:n,onRemove:i}){const{attributes:c,listeners:u,setNodeRef:x,transform:h,transition:f,isDragging:p}=Wj({id:l}),g={transform:ev.Transform.toString(h),transition:f,opacity:p?.5:1},N=y=>{y.preventDefault(),y.stopPropagation(),i(l)},v=y=>{y.stopPropagation()};return e.jsx("div",{ref:x,style:g,className:I("inline-flex items-center gap-1",p&&"shadow-lg"),children:e.jsxs(Se,{variant:"secondary",className:"cursor-move hover:bg-secondary/80 flex items-center gap-1",children:[e.jsx("div",{...c,...u,className:"cursor-grab active:cursor-grabbing flex items-center",children:e.jsx(Rj,{className:"h-3 w-3 text-muted-foreground"})}),e.jsx("span",{children:n}),e.jsx("span",{role:"button",tabIndex:0,className:"ml-1 rounded-sm hover:bg-destructive/20 focus:outline-none focus:ring-1 focus:ring-destructive cursor-pointer",onClick:N,onPointerDown:v,onMouseDown:y=>y.stopPropagation(),onKeyDown:y=>{(y.key==="Enter"||y.key===" ")&&(y.preventDefault(),N(y))},children:e.jsx(Ta,{className:"h-3 w-3 hover:text-destructive",strokeWidth:2,fill:"none"})})]})})}function bS({options:l,selected:n,onChange:i,placeholder:c="选择选项...",emptyText:u="未找到选项",className:x}){const[h,f]=d.useState(!1),p=Vj(Bo(Qj,{activationConstraint:{distance:8}}),Bo(Kj,{coordinateGetter:qj})),g=y=>{n.includes(y)?i(n.filter(w=>w!==y)):i([...n,y])},N=y=>{i(n.filter(w=>w!==y))},v=y=>{const{active:w,over:b}=y;if(b&&w.id!==b.id){const R=n.indexOf(w.id),D=n.indexOf(b.id);i(Yj(n,R,D))}};return e.jsxs(ol,{open:h,onOpenChange:f,children:[e.jsx(dl,{asChild:!0,children:e.jsxs(_,{variant:"outline",role:"combobox","aria-expanded":h,className:I("w-full justify-between min-h-10 h-auto",x),children:[e.jsx(Jj,{sensors:p,collisionDetection:Xj,onDragEnd:v,children:e.jsx(Zj,{items:n,strategy:O_,children:e.jsx("div",{className:"flex gap-1 flex-wrap flex-1",children:n.length===0?e.jsx("span",{className:"text-muted-foreground",children:c}):n.map(y=>{const w=l.find(b=>b.value===y);return e.jsx(NS,{value:y,label:w?.label||y,onRemove:N},y)})})})}),e.jsx(Ym,{className:"ml-2 h-4 w-4 shrink-0 opacity-50",strokeWidth:2,fill:"none"})]})}),e.jsx(Wa,{className:"w-full p-0",align:"start",children:e.jsxs(sd,{children:[e.jsx(td,{placeholder:"搜索...",className:"h-9"}),e.jsxs(ad,{children:[e.jsx(ld,{children:u}),e.jsx(ac,{children:l.map(y=>{const w=n.includes(y.value);return e.jsxs(lc,{value:y.value,onSelect:()=>g(y.value),children:[e.jsx("div",{className:I("mr-2 flex h-4 w-4 items-center justify-center rounded-sm border border-primary",w?"bg-primary text-primary-foreground":"opacity-50 [&_svg]:invisible"),children:e.jsx(kt,{className:"h-3 w-3",strokeWidth:2,fill:"none"})}),e.jsx("span",{children:y.label})]},y.value)})})]})]})})]})}const Ml=As.memo(function({title:n,description:i,taskConfig:c,modelNames:u,onChange:x,hideTemperature:h=!1,hideMaxTokens:f=!1,dataTour:p}){const g=N=>{x("model_list",N)};return e.jsxs("div",{className:"rounded-lg border bg-card p-4 sm:p-6 space-y-4",children:[e.jsxs("div",{children:[e.jsx("h4",{className:"font-semibold text-base sm:text-lg",children:n}),e.jsx("p",{className:"text-xs sm:text-sm text-muted-foreground mt-1",children:i})]}),e.jsxs("div",{className:"grid gap-4",children:[e.jsxs("div",{className:"grid gap-2","data-tour":p,children:[e.jsx(E,{children:"模型列表"}),e.jsx(bS,{options:u.map(N=>({label:N,value:N})),selected:c.model_list||[],onChange:g,placeholder:"选择模型...",emptyText:"暂无可用模型"})]}),e.jsxs("div",{className:"grid grid-cols-1 sm:grid-cols-2 gap-4",children:[!h&&e.jsxs("div",{className:"grid gap-3",children:[e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsx(E,{children:"温度"}),e.jsx(le,{type:"number",step:"0.1",min:"0",max:"1",value:c.temperature??.3,onChange:N=>{const v=parseFloat(N.target.value);!isNaN(v)&&v>=0&&v<=1&&x("temperature",v)},className:"w-20 h-8 text-sm"})]}),e.jsx(Va,{value:[c.temperature??.3],onValueChange:N=>x("temperature",N[0]),min:0,max:1,step:.1,className:"w-full"})]}),!f&&e.jsxs("div",{className:"grid gap-2",children:[e.jsx(E,{children:"最大 Token"}),e.jsx(le,{type:"number",step:"1",min:"1",value:c.max_tokens??1024,onChange:N=>x("max_tokens",parseInt(N.target.value))})]})]}),e.jsxs("div",{className:"grid gap-2",children:[e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsx(E,{children:"慢请求阈值 (秒)"}),e.jsx("span",{className:"text-xs text-muted-foreground",children:"超时警告"})]}),e.jsx(le,{type:"number",step:"1",min:"1",value:c.slow_threshold??15,onChange:N=>{const v=parseInt(N.target.value);!isNaN(v)&&v>=1&&x("slow_threshold",v)},placeholder:"15"}),e.jsx("p",{className:"text-xs text-muted-foreground",children:"模型响应时间超过此阈值将输出警告日志"})]}),e.jsxs("div",{className:"grid gap-2",children:[e.jsx(E,{children:"模型选择策略"}),e.jsxs(Ie,{value:c.selection_strategy??"balance",onValueChange:N=>x("selection_strategy",N),children:[e.jsx($e,{children:e.jsx(Pe,{placeholder:"选择模型选择策略"})}),e.jsxs(Be,{children:[e.jsx(X,{value:"balance",children:"负载均衡(balance)"}),e.jsx(X,{value:"random",children:"随机选择(random)"})]})]}),e.jsx("p",{className:"text-xs text-muted-foreground",children:"负载均衡:优先选择使用次数少的模型。随机选择:完全随机从模型列表中选择"})]})]})]})}),yS=As.memo(function({paginatedModels:n,allModels:i,onEdit:c,onDelete:u,isModelUsed:x,searchQuery:h}){return n.length===0?e.jsx("div",{className:"md:hidden text-center text-muted-foreground py-8 rounded-lg border bg-card",children:h?"未找到匹配的模型":"暂无模型配置"}):e.jsx("div",{className:"md:hidden space-y-3",children:n.map((f,p)=>{const g=i.findIndex(v=>v===f),N=x(f.name);return e.jsxs("div",{className:"rounded-lg border bg-card p-4 space-y-3",children:[e.jsxs("div",{className:"flex items-start justify-between gap-2",children:[e.jsxs("div",{className:"flex-1 min-w-0",children:[e.jsxs("div",{className:"flex items-center gap-2 mb-1",children:[e.jsx("h3",{className:"font-semibold text-base",children:f.name}),e.jsx(Se,{variant:N?"default":"secondary",className:N?"bg-green-600 hover:bg-green-700":"",children:N?"已使用":"未使用"})]}),e.jsx("p",{className:"text-xs text-muted-foreground break-all",title:f.model_identifier,children:f.model_identifier})]}),e.jsxs("div",{className:"flex gap-1 flex-shrink-0",children:[e.jsxs(_,{variant:"default",size:"sm",onClick:()=>c(f,g),children:[e.jsx(Fn,{className:"h-4 w-4 mr-1",strokeWidth:2,fill:"none"}),"编辑"]}),e.jsxs(_,{size:"sm",onClick:()=>u(g),className:"bg-red-600 hover:bg-red-700 text-white",children:[e.jsx(ls,{className:"h-4 w-4 mr-1",strokeWidth:2,fill:"none"}),"删除"]})]})]}),e.jsxs("div",{className:"grid grid-cols-2 gap-2 text-sm",children:[e.jsxs("div",{children:[e.jsx("span",{className:"text-muted-foreground text-xs",children:"提供商"}),e.jsx("p",{className:"font-medium",children:f.api_provider})]}),e.jsxs("div",{children:[e.jsx("span",{className:"text-muted-foreground text-xs",children:"模型温度"}),e.jsx("p",{className:"font-medium",children:f.temperature!=null?f.temperature:e.jsx("span",{className:"text-muted-foreground",children:"默认"})})]}),e.jsxs("div",{children:[e.jsx("span",{className:"text-muted-foreground text-xs",children:"输入价格"}),e.jsxs("p",{className:"font-medium",children:["¥",f.price_in,"/M"]})]}),e.jsxs("div",{children:[e.jsx("span",{className:"text-muted-foreground text-xs",children:"输出价格"}),e.jsxs("p",{className:"font-medium",children:["¥",f.price_out,"/M"]})]})]})]},p)})})}),wS=As.memo(function({paginatedModels:n,allModels:i,filteredModels:c,selectedModels:u,onEdit:x,onDelete:h,onToggleSelection:f,onToggleSelectAll:p,isModelUsed:g,searchQuery:N}){return e.jsx("div",{className:"hidden md:block rounded-lg border bg-card overflow-hidden",children:e.jsx("div",{className:"overflow-x-auto",children:e.jsxs(Rl,{children:[e.jsx(Ll,{children:e.jsxs(ut,{children:[e.jsx(Ze,{className:"w-12",children:e.jsx(qs,{checked:u.size===c.length&&c.length>0,onCheckedChange:p})}),e.jsx(Ze,{className:"w-24",children:"使用状态"}),e.jsx(Ze,{children:"模型名称"}),e.jsx(Ze,{children:"模型标识符"}),e.jsx(Ze,{children:"提供商"}),e.jsx(Ze,{className:"text-center",children:"温度"}),e.jsx(Ze,{className:"text-right",children:"输入价格"}),e.jsx(Ze,{className:"text-right",children:"输出价格"}),e.jsx(Ze,{className:"text-right",children:"操作"})]})}),e.jsx(Ul,{children:n.length===0?e.jsx(ut,{children:e.jsx(qe,{colSpan:9,className:"text-center text-muted-foreground py-8",children:N?"未找到匹配的模型":"暂无模型配置"})}):n.map((v,y)=>{const w=i.findIndex(R=>R===v),b=g(v.name);return e.jsxs(ut,{children:[e.jsx(qe,{children:e.jsx(qs,{checked:u.has(w),onCheckedChange:()=>f(w)})}),e.jsx(qe,{children:e.jsx(Se,{variant:b?"default":"secondary",className:b?"bg-green-600 hover:bg-green-700":"",children:b?"已使用":"未使用"})}),e.jsx(qe,{className:"font-medium",children:v.name}),e.jsx(qe,{className:"max-w-xs truncate",title:v.model_identifier,children:v.model_identifier}),e.jsx(qe,{children:v.api_provider}),e.jsx(qe,{className:"text-center",children:v.temperature!=null?v.temperature:e.jsx("span",{className:"text-muted-foreground",children:"-"})}),e.jsxs(qe,{className:"text-right",children:["¥",v.price_in,"/M"]}),e.jsxs(qe,{className:"text-right",children:["¥",v.price_out,"/M"]}),e.jsx(qe,{className:"text-right",children:e.jsxs("div",{className:"flex justify-end gap-2",children:[e.jsxs(_,{variant:"default",size:"sm",onClick:()=>x(v,w),children:[e.jsx(Fn,{className:"h-4 w-4 mr-1",strokeWidth:2,fill:"none"}),"编辑"]}),e.jsxs(_,{size:"sm",onClick:()=>h(w),className:"bg-red-600 hover:bg-red-700 text-white",children:[e.jsx(ls,{className:"h-4 w-4 mr-1",strokeWidth:2,fill:"none"}),"删除"]})]})})]},y)})})]})})})}),_S=300*1e3,Cg=new Map,SS=[10,20,50,100],kS=As.memo(function({page:n,pageSize:i,totalItems:c,jumpToPage:u,onPageChange:x,onPageSizeChange:h,onJumpToPageChange:f,onJumpToPage:p,onSelectionClear:g}){const N=Math.ceil(c/i),v=w=>{h(parseInt(w)),x(1),g?.()},y=w=>{w.key==="Enter"&&p()};return c===0?null:e.jsxs("div",{className:"flex flex-col sm:flex-row items-center justify-between gap-4 mt-4",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(E,{htmlFor:"page-size-model",className:"text-sm whitespace-nowrap",children:"每页显示"}),e.jsxs(Ie,{value:i.toString(),onValueChange:v,children:[e.jsx($e,{id:"page-size-model",className:"w-20",children:e.jsx(Pe,{})}),e.jsx(Be,{children:SS.map(w=>e.jsx(X,{value:w.toString(),children:w},w))})]}),e.jsxs("span",{className:"text-sm text-muted-foreground",children:["显示 ",(n-1)*i+1," 到"," ",Math.min(n*i,c)," 条,共 ",c," 条"]})]}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(_,{variant:"outline",size:"sm",onClick:()=>x(1),disabled:n===1,className:"hidden sm:flex",children:e.jsx(gn,{className:"h-4 w-4"})}),e.jsxs(_,{variant:"outline",size:"sm",onClick:()=>x(Math.max(1,n-1)),disabled:n===1,children:[e.jsx(za,{className:"h-4 w-4 sm:mr-1"}),e.jsx("span",{className:"hidden sm:inline",children:"上一页"})]}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(le,{type:"number",value:u,onChange:w=>f(w.target.value),onKeyDown:y,placeholder:n.toString(),className:"w-16 h-8 text-center",min:1,max:N}),e.jsx(_,{variant:"outline",size:"sm",onClick:p,disabled:!u,className:"h-8",children:"跳转"})]}),e.jsxs(_,{variant:"outline",size:"sm",onClick:()=>x(n+1),disabled:n>=N,children:[e.jsx("span",{className:"hidden sm:inline",children:"下一页"}),e.jsx(Zt,{className:"h-4 w-4 sm:ml-1"})]}),e.jsx(_,{variant:"outline",size:"sm",onClick:()=>x(N),disabled:n>=N,className:"hidden sm:flex",children:e.jsx(jn,{className:"h-4 w-4"})})]})]})});function CS(l){const{models:n,taskConfig:i,debounceMs:c=2e3,onSavingChange:u,onUnsavedChange:x}=l,h=d.useRef(null),f=d.useRef(null),p=d.useRef(!0),g=d.useCallback(()=>{h.current&&(clearTimeout(h.current),h.current=null),f.current&&(clearTimeout(f.current),f.current=null)},[]),N=d.useCallback(w=>{const b={model_identifier:w.model_identifier,name:w.name,api_provider:w.api_provider,price_in:w.price_in??0,price_out:w.price_out??0,force_stream_mode:w.force_stream_mode??!1,extra_params:w.extra_params??{}};return w.temperature!=null&&(b.temperature=w.temperature),w.max_tokens!=null&&(b.max_tokens=w.max_tokens),b},[]),v=d.useCallback(async w=>{try{u?.(!0);const b=w.map(N);await Bm("models",b),x?.(!1)}catch(b){console.error("自动保存模型列表失败:",b),x?.(!0)}finally{u?.(!1)}},[u,x,N]),y=d.useCallback(async w=>{try{u?.(!0),await Bm("model_task_config",w),x?.(!1)}catch(b){console.error("自动保存任务配置失败:",b),x?.(!0)}finally{u?.(!1)}},[u,x]);return d.useEffect(()=>{if(!p.current)return x?.(!0),h.current&&clearTimeout(h.current),h.current=setTimeout(()=>{v(n)},c),()=>{h.current&&clearTimeout(h.current)}},[n,v,c,x]),d.useEffect(()=>{if(!(p.current||!i))return x?.(!0),f.current&&clearTimeout(f.current),f.current=setTimeout(()=>{y(i)},c),()=>{f.current&&clearTimeout(f.current)}},[i,y,c,x]),d.useEffect(()=>()=>{g()},[g]),{clearTimers:g,initialLoadRef:p}}function TS(l={}){const{onCloseEditDialog:n}=l,i=ca(),{registerTour:c,startTour:u,state:x,goToStep:h}=ax(),f=d.useRef(x.stepIndex);return d.useEffect(()=>{c(il,Nv)},[c]),d.useEffect(()=>{if(x.activeTourId===il&&x.isRunning){const g=bv[x.stepIndex];g&&!window.location.pathname.endsWith(g.replace("/config/",""))&&i({to:g})}},[x.stepIndex,x.activeTourId,x.isRunning,i]),d.useEffect(()=>{if(x.activeTourId===il&&x.isRunning){const g=f.current,N=x.stepIndex;g>=12&&g<=17&&N<12&&n?.(),f.current=N}},[x.stepIndex,x.activeTourId,x.isRunning,n]),d.useEffect(()=>{if(x.activeTourId!==il||!x.isRunning)return;const g=N=>{const v=N.target,y=x.stepIndex;y===2&&v.closest('[data-tour="add-provider-button"]')?setTimeout(()=>h(3),300):y===9&&v.closest('[data-tour="provider-cancel-button"]')?setTimeout(()=>h(10),300):y===11&&v.closest('[data-tour="add-model-button"]')?setTimeout(()=>h(12),300):y===17&&v.closest('[data-tour="model-cancel-button"]')?setTimeout(()=>h(18),300):y===18&&v.closest('[data-tour="tasks-tab-trigger"]')&&setTimeout(()=>h(19),300)};return document.addEventListener("click",g,!0),()=>document.removeEventListener("click",g,!0)},[x,h]),{startTour:d.useCallback(()=>{u(il)},[u]),isRunning:x.isRunning&&x.activeTourId===il,stepIndex:x.stepIndex}}function ES(l){const{getProviderConfig:n}=l,[i,c]=d.useState([]),[u,x]=d.useState(!1),[h,f]=d.useState(null),[p,g]=d.useState(null),N=d.useCallback(()=>{c([]),f(null),g(null)},[]),v=d.useCallback(async(y,w=!1)=>{const b=n(y);if(!b?.base_url){c([]),g(null),f('提供商配置不完整,请先在"模型提供商配置"中配置');return}if(!b.api_key){c([]),g(null),f('该提供商未配置 API Key,请先在"模型提供商配置"中填写');return}const R=aS(b.base_url);if(g(R),!R?.modelFetcher){c([]),f(null);return}const D=`${y}:${b.base_url}`,S=Cg.get(D);if(!w&&S&&Date.now()-S.timestamp<_S){c(S.models),f(null);return}x(!0),f(null);try{const P=await U2(y,R.modelFetcher.parser,R.modelFetcher.endpoint);c(P),Cg.set(D,{models:P,timestamp:Date.now()})}catch(P){console.error("获取模型列表失败:",P);const M=P.message||"获取模型列表失败";M.includes("无效")||M.includes("过期")||M.includes("API Key")?f('API Key 无效或已过期,请检查"模型提供商配置"中的密钥'):M.includes("权限")?f("没有权限获取模型列表,请检查 API Key 权限"):M.includes("timeout")||M.includes("超时")?f("请求超时,请检查网络连接后重试"):M.includes("不支持")?f("该提供商不支持自动获取模型列表,请手动输入"):f(M),c([])}finally{x(!1)}},[n]);return{availableModels:i,fetchingModels:u,modelFetchError:h,matchedTemplate:p,fetchModelsForProvider:v,clearModels:N}}function MS(){return e.jsx(Yn,{children:e.jsx(zS,{})})}function zS(){const[l,n]=d.useState([]),[i,c]=d.useState([]),[u,x]=d.useState([]),[h,f]=d.useState([]),[p,g]=d.useState(null),[N,v]=d.useState(!0),[y,w]=d.useState(!1),[b,R]=d.useState(!1),[D,S]=d.useState(!1),[P,M]=d.useState(!1),[T,A]=d.useState(null),[F,L]=d.useState(null),[J,U]=d.useState(!1),[ue,xe]=d.useState(!1),[he,ne]=d.useState(null),[ve,je]=d.useState(""),[z,V]=d.useState(new Set),[B,oe]=d.useState(!1),[K,_e]=d.useState(1),[pe,ke]=d.useState(20),[O,k]=d.useState(""),[H,se]=d.useState(!1),[Ee,Z]=d.useState(!1),Oe=d.useRef([]),ns=d.useRef(null),[Q,ee]=d.useState([]),[Ue,ie]=d.useState([]),[Te,de]=d.useState({}),{toast:Me}=Zs(),{triggerRestart:rs,isRestarting:Ut}=vn(),{startTour:aa,isRunning:Ka}=TS({onCloseEditDialog:()=>M(!1)}),{clearTimers:Ft,initialLoadRef:mt}=CS({models:l,taskConfig:p,onSavingChange:R,onUnsavedChange:S}),q=d.useCallback((re,fe)=>{if(!re)return;const ss=new Set(fe.map(Qa=>Qa.name)),gs=[],cs=[],Et=[{key:"utils",label:"工具模型"},{key:"tool_use",label:"工具调用模型"},{key:"replyer",label:"回复模型"},{key:"planner",label:"规划器模型"},{key:"vlm",label:"视觉模型"},{key:"voice",label:"语音模型"},{key:"embedding",label:"嵌入模型"},{key:"lpmm_entity_extract",label:"LPMM实体抽取"},{key:"lpmm_rdf_build",label:"LPMM关系构建"}];for(const{key:Qa,label:Bl}of Et){const Zn=re[Qa];if(!Zn)continue;if(!Zn.model_list||Zn.model_list.length===0){cs.push(Bl);continue}const Jr=Zn.model_list.filter(bn=>!ss.has(bn));Jr.length>0&&gs.push({taskName:Bl,invalidModels:Jr})}ee(gs),ie(cs)},[]),Ve=d.useCallback(async()=>{try{v(!0);const re=await un(),fe=re.models||[];n(fe),f(fe.map(Et=>Et.name));const ss=re.api_providers||[];c(ss.map(Et=>Et.name)),x(ss);const gs=re.model_task_config||null;g(gs),q(gs,fe);const cs=gs?.embedding?.model_list||[];Oe.current=[...cs],S(!1),mt.current=!1}catch(re){console.error("加载配置失败:",re)}finally{v(!1)}},[mt,q]);d.useEffect(()=>{Ve()},[Ve]);const Ke=d.useCallback(re=>u.find(fe=>fe.name===re),[u]),{availableModels:We,fetchingModels:Ls,modelFetchError:ts,matchedTemplate:Cs,fetchModelsForProvider:ze,clearModels:Ns}=ES({getProviderConfig:Ke});d.useEffect(()=>{P&&T?.api_provider&&ze(T.api_provider)},[P,T?.api_provider,ze]);const as=async()=>{await rs()},es=d.useCallback(()=>{if(!p)return;const re=new Set(l.map(gs=>gs.name)),fe={...p},ss=Object.keys(fe);for(const gs of ss){const cs=fe[gs];cs&&cs.model_list&&(cs.model_list=cs.model_list.filter(Et=>re.has(Et)))}g(fe),ee([]),Me({title:"清理完成",description:"已删除所有无效的模型引用"})},[p,l,Me]),bs=re=>{const fe={model_identifier:re.model_identifier,name:re.name,api_provider:re.api_provider,price_in:re.price_in??0,price_out:re.price_out??0,force_stream_mode:re.force_stream_mode??!1,extra_params:re.extra_params??{}};return re.temperature!=null&&(fe.temperature=re.temperature),re.max_tokens!=null&&(fe.max_tokens=re.max_tokens),fe},gt=async()=>{try{w(!0),Ft();const re=await un();re.models=l.map(bs),re.model_task_config=p,await Ji(re),S(!1),Me({title:"保存成功",description:"正在重启麦麦..."}),await as()}catch(re){console.error("保存配置失败:",re),Me({title:"保存失败",description:re.message,variant:"destructive"}),w(!1)}},$t=async()=>{try{w(!0),Ft();const re=await un();re.models=l.map(bs),re.model_task_config=p,await Ji(re),S(!1),Me({title:"保存成功",description:"模型配置已保存"}),await Ve()}catch(re){console.error("保存配置失败:",re),Me({title:"保存失败",description:re.message,variant:"destructive"})}finally{w(!1)}},tt=(re,fe)=>{de({}),A(re||{model_identifier:"",name:"",api_provider:i[0]||"",price_in:0,price_out:0,temperature:null,max_tokens:null,force_stream_mode:!1,extra_params:{}}),L(fe),M(!0)},Ms=()=>{if(!T)return;const re={};if(T.name?.trim()||(re.name="请输入模型名称"),T.api_provider?.trim()||(re.api_provider="请选择 API 提供商"),T.model_identifier?.trim()||(re.model_identifier="请输入模型标识符"),Object.keys(re).length>0){de(re);return}de({});const fe={model_identifier:T.model_identifier,name:T.name,api_provider:T.api_provider,price_in:T.price_in??0,price_out:T.price_out??0,force_stream_mode:T.force_stream_mode??!1,extra_params:T.extra_params??{}};T.temperature!=null&&(fe.temperature=T.temperature),T.max_tokens!=null&&(fe.max_tokens=T.max_tokens);let ss,gs=null;if(F!==null?(gs=l[F].name,ss=[...l],ss[F]=fe):ss=[...l,fe],n(ss),f(ss.map(cs=>cs.name)),gs&&gs!==fe.name&&p){const cs=Et=>Et.map(Qa=>Qa===gs?fe.name:Qa);g({...p,utils:{...p.utils,model_list:cs(p.utils?.model_list||[])},tool_use:{...p.tool_use,model_list:cs(p.tool_use?.model_list||[])},replyer:{...p.replyer,model_list:cs(p.replyer?.model_list||[])},planner:{...p.planner,model_list:cs(p.planner?.model_list||[])},vlm:{...p.vlm,model_list:cs(p.vlm?.model_list||[])},voice:{...p.voice,model_list:cs(p.voice?.model_list||[])},embedding:{...p.embedding,model_list:cs(p.embedding?.model_list||[])},lpmm_entity_extract:{...p.lpmm_entity_extract,model_list:cs(p.lpmm_entity_extract?.model_list||[])},lpmm_rdf_build:{...p.lpmm_rdf_build,model_list:cs(p.lpmm_rdf_build?.model_list||[])}})}M(!1),A(null),L(null),Me({title:F!==null?"模型已更新":"模型已添加",description:'配置将在 2 秒后自动保存,或点击右上角"保存配置"按钮立即保存'})},Tt=re=>{if(!re&&T){const fe={...T,price_in:T.price_in??0,price_out:T.price_out??0};A(fe)}M(re)},Bt=re=>{ne(re),xe(!0)},Aa=()=>{if(he!==null){const re=l.filter((fe,ss)=>ss!==he);n(re),f(re.map(fe=>fe.name)),q(p,re),Me({title:"删除成功",description:'配置将在 2 秒后自动保存,或点击右上角"保存配置"按钮立即保存'})}xe(!1),ne(null)},tl=re=>{const fe=new Set(z);fe.has(re)?fe.delete(re):fe.add(re),V(fe)},ul=()=>{if(z.size===Dt.length)V(new Set);else{const re=Dt.map((fe,ss)=>l.findIndex(gs=>gs===Dt[ss]));V(new Set(re))}},Xn=()=>{if(z.size===0){Me({title:"提示",description:"请先选择要删除的模型",variant:"default"});return}oe(!0)},W=()=>{const re=z.size,fe=l.filter((ss,gs)=>!z.has(gs));n(fe),f(fe.map(ss=>ss.name)),q(p,fe),V(new Set),oe(!1),Me({title:"批量删除成功",description:`已删除 ${re} 个模型,配置将在 2 秒后自动保存`})},ye=(re,fe,ss)=>{if(!p)return;if(re==="embedding"&&fe==="model_list"&&Array.isArray(ss)){const cs=Oe.current,Et=ss;if((cs.length!==Et.length||cs.some(Bl=>!Et.includes(Bl))||Et.some(Bl=>!cs.includes(Bl)))&&cs.length>0){ns.current={field:fe,value:ss},Z(!0);return}}const gs={...p,[re]:{...p[re],[fe]:ss}};g(gs),q(gs,l),re==="embedding"&&fe==="model_list"&&Array.isArray(ss)&&(Oe.current=[...ss])},Re=()=>{if(!p||!ns.current)return;const{field:re,value:fe}=ns.current,ss={...p,embedding:{...p.embedding,[re]:fe}};g(ss),q(ss,l),re==="model_list"&&Array.isArray(fe)&&(Oe.current=[...fe]),ns.current=null,Z(!1),Me({title:"嵌入模型已更新",description:"建议重新生成知识库向量以确保最佳匹配精度"})},Hs=()=>{ns.current=null,Z(!1)},Dt=l.filter(re=>{if(!ve)return!0;const fe=ve.toLowerCase();return re.name.toLowerCase().includes(fe)||re.model_identifier.toLowerCase().includes(fe)||re.api_provider.toLowerCase().includes(fe)}),Wt=Math.ceil(Dt.length/pe),rt=Dt.slice((K-1)*pe,K*pe),ea=()=>{const re=parseInt(O);re>=1&&re<=Wt&&(_e(re),k(""))},xt=re=>p?[p.utils?.model_list||[],p.tool_use?.model_list||[],p.replyer?.model_list||[],p.planner?.model_list||[],p.vlm?.model_list||[],p.voice?.model_list||[],p.embedding?.model_list||[],p.lpmm_entity_extract?.model_list||[],p.lpmm_rdf_build?.model_list||[]].some(ss=>ss.includes(re)):!1;return N?e.jsx(Ye,{className:"h-full",children:e.jsx("div",{className:"space-y-4 sm:space-y-6 p-4 sm:p-6",children:e.jsx("div",{className:"flex items-center justify-center h-64",children:e.jsx("p",{className:"text-muted-foreground",children:"加载中..."})})})}):e.jsx(Ye,{className:"h-full",children:e.jsxs("div",{className:"space-y-4 sm:space-y-6 p-4 sm:p-6",children:[e.jsxs("div",{className:"flex flex-col sm:flex-row sm:items-center justify-between gap-4",children:[e.jsxs("div",{children:[e.jsx("h1",{className:"text-2xl sm:text-3xl font-bold",children:"模型管理与分配"}),e.jsx("p",{className:"text-muted-foreground mt-1 sm:mt-2 text-sm sm:text-base",children:"添加模型并为模型分配功能"})]}),e.jsxs("div",{className:"flex gap-2 w-full sm:w-auto",children:[e.jsx(vS,{trigger:e.jsxs(_,{variant:"outline",size:"sm",className:"flex-1 sm:flex-none",children:[e.jsx($j,{className:"mr-2 h-4 w-4"}),"分享配置"]})}),e.jsxs(_,{onClick:$t,disabled:y||b||!D||Ut,size:"sm",variant:"outline",className:"flex-1 sm:flex-none sm:min-w-[120px]",children:[e.jsx(oc,{className:"mr-2 h-4 w-4",strokeWidth:2,fill:"none"}),y?"保存中...":b?"自动保存中...":D?"保存配置":"已保存"]}),e.jsxs(vs,{children:[e.jsx(yt,{asChild:!0,children:e.jsxs(_,{disabled:y||b||Ut,size:"sm",className:"flex-1 sm:flex-none sm:min-w-[120px]",children:[e.jsx(cc,{className:"mr-2 h-4 w-4"}),Ut?"重启中...":D?"保存并重启":"重启麦麦"]})}),e.jsxs(ds,{children:[e.jsxs(us,{children:[e.jsx(xs,{children:"确认重启麦麦?"}),e.jsx(hs,{asChild:!0,children:e.jsx("div",{children:e.jsx("p",{children:D?"当前有未保存的配置更改。点击确认将先保存配置,然后重启麦麦使新配置生效。重启过程中麦麦将暂时离线。":"即将重启麦麦主程序。重启过程中麦麦将暂时离线,配置将在重启后生效。"})})})]}),e.jsxs(ms,{children:[e.jsx(ps,{children:"取消"}),e.jsx(fs,{onClick:D?gt:as,children:D?"保存并重启":"确认重启"})]})]})]})]})]}),e.jsxs(at,{children:[e.jsx(Ht,{className:"h-4 w-4"}),e.jsxs(lt,{children:["配置更新后需要",e.jsx("strong",{children:"重启麦麦"}),'才能生效。你可以点击右上角的"保存并重启"按钮一键完成保存和重启。']})]}),Q.length>0&&e.jsxs(at,{variant:"destructive",children:[e.jsx(Jt,{className:"h-4 w-4"}),e.jsxs(lt,{className:"flex items-start justify-between gap-4",children:[e.jsxs("div",{className:"flex-1",children:[e.jsx("strong",{children:"检测到无效的模型引用"}),e.jsx("div",{className:"mt-2 space-y-1",children:Q.map(({taskName:re,invalidModels:fe})=>e.jsxs("div",{className:"text-sm",children:[e.jsx("strong",{children:re})," 引用了不存在的模型: ",fe.join(", ")]},re))})]}),e.jsx(_,{variant:"outline",size:"sm",className:"shrink-0 bg-background hover:bg-accent",onClick:es,children:"一键清理"})]})]}),Ue.length>0&&e.jsxs(at,{variant:"default",className:"border-yellow-500/50 bg-yellow-500/10",children:[e.jsx(Jt,{className:"h-4 w-4 text-yellow-600"}),e.jsxs(lt,{children:[e.jsx("strong",{className:"text-yellow-600",children:"以下任务未配置模型"}),e.jsxs("div",{className:"mt-2 text-sm",children:[Ue.join("、")," 还未分配模型,这些功能将无法正常工作。"]})]})]}),e.jsxs(at,{className:"hidden lg:flex border-primary/30 bg-primary/5 cursor-pointer hover:bg-primary/10 transition-colors",onClick:aa,children:[e.jsx(Ww,{className:"h-4 w-4 text-primary"}),e.jsxs(lt,{className:"flex items-center justify-between",children:[e.jsxs("span",{children:[e.jsx("strong",{className:"text-primary",children:"新手引导:"}),"不知道如何配置模型?点击这里开始学习如何为麦麦的组件分配模型。"]}),e.jsx(_,{variant:"outline",size:"sm",className:"ml-4 shrink-0",children:"开始引导"})]})]}),e.jsxs(ta,{defaultValue:"models",className:"w-full",children:[e.jsxs(Xt,{className:"grid w-full max-w-full sm:max-w-md grid-cols-2",children:[e.jsx(Je,{value:"models",children:"添加模型"}),e.jsx(Je,{value:"tasks","data-tour":"tasks-tab-trigger",children:"为模型分配功能"})]}),e.jsxs(ys,{value:"models",className:"space-y-4 mt-0",children:[e.jsxs("div",{className:"flex flex-col sm:flex-row justify-between items-start sm:items-center gap-2",children:[e.jsx("p",{className:"text-sm text-muted-foreground",children:"配置可用的模型列表"}),e.jsxs("div",{className:"flex gap-2 w-full sm:w-auto",children:[z.size>0&&e.jsxs(_,{onClick:Xn,size:"sm",variant:"destructive",className:"w-full sm:w-auto",children:[e.jsx(ls,{className:"mr-2 h-4 w-4",strokeWidth:2,fill:"none"}),"批量删除 (",z.size,")"]}),e.jsxs(_,{onClick:()=>tt(null,null),size:"sm",variant:"outline",className:"w-full sm:w-auto","data-tour":"add-model-button",children:[e.jsx(et,{className:"mr-2 h-4 w-4",strokeWidth:2,fill:"none"}),"添加模型"]})]})]}),e.jsxs("div",{className:"flex flex-col sm:flex-row items-start sm:items-center gap-2",children:[e.jsxs("div",{className:"relative w-full sm:flex-1 sm:max-w-sm",children:[e.jsx(Ct,{className:"absolute left-3 top-1/2 -translate-y-1/2 h-4 w-4 text-muted-foreground"}),e.jsx(le,{placeholder:"搜索模型名称、标识符或提供商...",value:ve,onChange:re=>je(re.target.value),className:"pl-9"})]}),ve&&e.jsxs("p",{className:"text-sm text-muted-foreground whitespace-nowrap",children:["找到 ",Dt.length," 个结果"]})]}),e.jsx(yS,{paginatedModels:rt,allModels:l,onEdit:tt,onDelete:Bt,isModelUsed:xt,searchQuery:ve}),e.jsx(wS,{paginatedModels:rt,allModels:l,filteredModels:Dt,selectedModels:z,onEdit:tt,onDelete:Bt,onToggleSelection:tl,onToggleSelectAll:ul,isModelUsed:xt,searchQuery:ve}),e.jsx(kS,{page:K,pageSize:pe,totalItems:Dt.length,jumpToPage:O,onPageChange:_e,onPageSizeChange:ke,onJumpToPageChange:k,onJumpToPage:ea,onSelectionClear:()=>V(new Set)})]}),e.jsxs(ys,{value:"tasks",className:"space-y-6 mt-0",children:[e.jsx("p",{className:"text-sm text-muted-foreground",children:"为不同的任务配置使用的模型和参数"}),p&&e.jsxs("div",{className:"grid gap-4 sm:gap-6",children:[e.jsx(Ml,{title:"组件模型 (utils)",description:"用于表情包、取名、关系、情绪变化等组件",taskConfig:p.utils,modelNames:h,onChange:(re,fe)=>ye("utils",re,fe),dataTour:"task-model-select"}),e.jsx(Ml,{title:"工具调用模型 (tool_use)",description:"需要使用支持工具调用的模型",taskConfig:p.tool_use,modelNames:h,onChange:(re,fe)=>ye("tool_use",re,fe)}),e.jsx(Ml,{title:"首要回复模型 (replyer)",description:"用于表达器和表达方式学习",taskConfig:p.replyer,modelNames:h,onChange:(re,fe)=>ye("replyer",re,fe)}),e.jsx(Ml,{title:"决策模型 (planner)",description:"负责决定麦麦该什么时候回复",taskConfig:p.planner,modelNames:h,onChange:(re,fe)=>ye("planner",re,fe)}),e.jsx(Ml,{title:"图像识别模型 (vlm)",description:"视觉语言模型",taskConfig:p.vlm,modelNames:h,onChange:(re,fe)=>ye("vlm",re,fe),hideTemperature:!0}),e.jsx(Ml,{title:"语音识别模型 (voice)",description:"语音转文字",taskConfig:p.voice,modelNames:h,onChange:(re,fe)=>ye("voice",re,fe),hideTemperature:!0,hideMaxTokens:!0}),e.jsx(Ml,{title:"嵌入模型 (embedding)",description:"用于向量化",taskConfig:p.embedding,modelNames:h,onChange:(re,fe)=>ye("embedding",re,fe),hideTemperature:!0,hideMaxTokens:!0}),e.jsxs("div",{className:"space-y-4",children:[e.jsx("h3",{className:"text-lg font-semibold",children:"LPMM 知识库模型"}),e.jsx(Ml,{title:"实体提取模型 (lpmm_entity_extract)",description:"从文本中提取实体",taskConfig:p.lpmm_entity_extract,modelNames:h,onChange:(re,fe)=>ye("lpmm_entity_extract",re,fe)}),e.jsx(Ml,{title:"RDF 构建模型 (lpmm_rdf_build)",description:"构建知识图谱",taskConfig:p.lpmm_rdf_build,modelNames:h,onChange:(re,fe)=>ye("lpmm_rdf_build",re,fe)})]})]})]})]}),e.jsx(Is,{open:P,onOpenChange:Tt,children:e.jsxs(Os,{className:"max-w-[95vw] sm:max-w-2xl max-h-[90vh] overflow-y-auto","data-tour":"model-dialog",preventOutsideClose:Ka,children:[e.jsxs(Ds,{children:[e.jsx(Rs,{children:F!==null?"编辑模型":"添加模型"}),e.jsx(Ks,{children:"配置模型的基本信息和参数"})]}),e.jsxs("div",{className:"grid gap-4 py-4",children:[e.jsxs("div",{className:"grid gap-2","data-tour":"model-name-input",children:[e.jsx(E,{htmlFor:"model_name",className:Te.name?"text-destructive":"",children:"模型名称 *"}),e.jsx(le,{id:"model_name",value:T?.name||"",onChange:re=>{A(fe=>fe?{...fe,name:re.target.value}:null),Te.name&&de(fe=>({...fe,name:void 0}))},placeholder:"例如: qwen3-30b",className:Te.name?"border-destructive focus-visible:ring-destructive":""}),Te.name?e.jsx("p",{className:"text-xs text-destructive",children:Te.name}):e.jsx("p",{className:"text-xs text-muted-foreground",children:"用于在任务配置中引用此模型"})]}),e.jsxs("div",{className:"grid gap-2","data-tour":"model-provider-select",children:[e.jsx(E,{htmlFor:"api_provider",className:Te.api_provider?"text-destructive":"",children:"API 提供商 *"}),e.jsxs(Ie,{value:T?.api_provider||"",onValueChange:re=>{A(fe=>fe?{...fe,api_provider:re}:null),Ns(),Te.api_provider&&de(fe=>({...fe,api_provider:void 0}))},children:[e.jsx($e,{id:"api_provider",className:Te.api_provider?"border-destructive focus-visible:ring-destructive":"",children:e.jsx(Pe,{placeholder:"选择提供商"})}),e.jsx(Be,{children:i.map(re=>e.jsx(X,{value:re,children:re},re))})]}),Te.api_provider&&e.jsx("p",{className:"text-xs text-destructive",children:Te.api_provider})]}),e.jsxs("div",{className:"grid gap-2","data-tour":"model-identifier-input",children:[e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsx(E,{htmlFor:"model_identifier",className:Te.model_identifier?"text-destructive":"",children:"模型标识符 *"}),Cs?.modelFetcher&&e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(Se,{variant:"secondary",className:"text-xs",children:Cs.display_name}),e.jsx(_,{variant:"ghost",size:"sm",className:"h-6 px-2",onClick:()=>T?.api_provider&&ze(T.api_provider,!0),disabled:Ls,children:Ls?e.jsx(Bs,{className:"h-3 w-3 animate-spin"}):e.jsx(dt,{className:"h-3 w-3"})})]})]}),Cs?.modelFetcher?e.jsxs(ol,{open:H,onOpenChange:se,children:[e.jsx(dl,{asChild:!0,children:e.jsxs(_,{variant:"outline",role:"combobox","aria-expanded":H,className:"w-full justify-between font-normal",disabled:Ls||!!ts,children:[Ls?e.jsxs("span",{className:"flex items-center gap-2 text-muted-foreground",children:[e.jsx(Bs,{className:"h-4 w-4 animate-spin"}),"正在获取模型列表..."]}):ts?e.jsx("span",{className:"text-muted-foreground text-sm",children:"点击下方输入框手动填写"}):T?.model_identifier?e.jsx("span",{className:"truncate",children:T.model_identifier}):e.jsx("span",{className:"text-muted-foreground",children:"搜索或选择模型..."}),e.jsx(Ym,{className:"ml-2 h-4 w-4 shrink-0 opacity-50"})]})}),e.jsx(Wa,{className:"p-0",align:"start",style:{width:"var(--radix-popover-trigger-width)"},children:e.jsxs(sd,{children:[e.jsx(td,{placeholder:"搜索模型..."}),e.jsx(Ye,{className:"h-[300px]",children:e.jsxs(ad,{className:"max-h-none overflow-visible",children:[e.jsx(ld,{children:ts?e.jsxs("div",{className:"py-4 px-2 text-center space-y-2",children:[e.jsx("p",{className:"text-sm text-destructive",children:ts}),!ts.includes("API Key")&&e.jsx(_,{variant:"link",size:"sm",onClick:()=>T?.api_provider&&ze(T.api_provider,!0),children:"重试"})]}):"未找到匹配的模型"}),e.jsx(ac,{heading:"可用模型",children:We.map(re=>e.jsxs(lc,{value:re.id,onSelect:()=>{A(fe=>fe?{...fe,model_identifier:re.id}:null),se(!1)},children:[e.jsx(kt,{className:`mr-2 h-4 w-4 ${T?.model_identifier===re.id?"opacity-100":"opacity-0"}`}),e.jsxs("div",{className:"flex flex-col",children:[e.jsx("span",{children:re.id}),re.name!==re.id&&e.jsx("span",{className:"text-xs text-muted-foreground",children:re.name})]})]},re.id))}),e.jsx(ac,{heading:"手动输入",children:e.jsxs(lc,{value:"__manual_input__",onSelect:()=>{se(!1)},children:[e.jsx(Fn,{className:"mr-2 h-4 w-4"}),"手动输入模型标识符..."]})})]})})]})})]}):e.jsx(le,{id:"model_identifier",value:T?.model_identifier||"",onChange:re=>{A(fe=>fe?{...fe,model_identifier:re.target.value}:null),Te.model_identifier&&de(fe=>({...fe,model_identifier:void 0}))},placeholder:"Qwen/Qwen3-30B-A3B-Instruct-2507",className:Te.model_identifier?"border-destructive focus-visible:ring-destructive":""}),Te.model_identifier&&e.jsx("p",{className:"text-xs text-destructive",children:Te.model_identifier}),ts&&Cs?.modelFetcher&&!Te.model_identifier&&e.jsxs(at,{variant:"destructive",className:"mt-2 py-2",children:[e.jsx(Ht,{className:"h-4 w-4"}),e.jsx(lt,{className:"text-xs",children:ts})]}),Cs?.modelFetcher&&e.jsx(le,{value:T?.model_identifier||"",onChange:re=>{A(fe=>fe?{...fe,model_identifier:re.target.value}:null),Te.model_identifier&&de(fe=>({...fe,model_identifier:void 0}))},placeholder:"或手动输入模型标识符",className:`mt-2 ${Te.model_identifier?"border-destructive focus-visible:ring-destructive":""}`}),!Te.model_identifier&&e.jsx("p",{className:"text-xs text-muted-foreground",children:ts?'请手动输入模型标识符,或前往"模型提供商配置"检查 API Key':Cs?.modelFetcher?`已识别为 ${Cs.display_name},支持自动获取模型列表`:"API 提供商提供的模型 ID"})]}),e.jsxs("div",{className:"grid grid-cols-1 sm:grid-cols-2 gap-4",children:[e.jsxs("div",{className:"grid gap-2",children:[e.jsx(E,{htmlFor:"price_in",children:"输入价格 (¥/M token)"}),e.jsx(le,{id:"price_in",type:"number",step:"0.1",min:"0",value:T?.price_in??"",onChange:re=>{const fe=re.target.value===""?null:parseFloat(re.target.value);A(ss=>ss?{...ss,price_in:fe}:null)},placeholder:"默认: 0"})]}),e.jsxs("div",{className:"grid gap-2",children:[e.jsx(E,{htmlFor:"price_out",children:"输出价格 (¥/M token)"}),e.jsx(le,{id:"price_out",type:"number",step:"0.1",min:"0",value:T?.price_out??"",onChange:re=>{const fe=re.target.value===""?null:parseFloat(re.target.value);A(ss=>ss?{...ss,price_out:fe}:null)},placeholder:"默认: 0"})]})]}),e.jsxs("div",{className:"rounded-lg border p-4 space-y-3",children:[e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsxs("div",{className:"space-y-0.5",children:[e.jsx(E,{htmlFor:"enable_model_temperature",className:"cursor-pointer",children:"自定义模型温度"}),e.jsx("p",{className:"text-xs text-muted-foreground",children:"启用后将覆盖「为模型分配功能」中的任务温度配置"})]}),e.jsx(Fe,{id:"enable_model_temperature",checked:T?.temperature!=null,onCheckedChange:re=>{A(re?fe=>fe?{...fe,temperature:.5}:null:fe=>fe?{...fe,temperature:null}:null)}})]}),T?.temperature!=null&&e.jsxs("div",{className:"space-y-2 pt-2 border-t",children:[e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsx(E,{className:"text-sm",children:"温度值"}),e.jsx("span",{className:"text-sm font-medium tabular-nums",children:T.temperature.toFixed(1)})]}),e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx("span",{className:"text-xs text-muted-foreground",children:"0"}),e.jsx(Va,{value:[T.temperature],onValueChange:re=>A(fe=>fe?{...fe,temperature:re[0]}:null),min:0,max:1,step:.1,className:"flex-1"}),e.jsx("span",{className:"text-xs text-muted-foreground",children:"1"})]}),e.jsx("p",{className:"text-xs text-muted-foreground",children:"较低的温度(0.1-0.3)产生更确定的输出,较高的温度(0.7-1.0)产生更多样化的输出"})]})]}),e.jsxs("div",{className:"rounded-lg border p-4 space-y-3",children:[e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsxs("div",{className:"space-y-0.5",children:[e.jsx(E,{htmlFor:"enable_model_max_tokens",className:"cursor-pointer",children:"自定义最大 Token"}),e.jsx("p",{className:"text-xs text-muted-foreground",children:"启用后将覆盖「为模型分配功能」中的任务最大 Token 配置"})]}),e.jsx(Fe,{id:"enable_model_max_tokens",checked:T?.max_tokens!=null,onCheckedChange:re=>{A(re?fe=>fe?{...fe,max_tokens:2048}:null:fe=>fe?{...fe,max_tokens:null}:null)}})]}),T?.max_tokens!=null&&e.jsxs("div",{className:"space-y-2 pt-2 border-t",children:[e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsx(E,{className:"text-sm",children:"最大 Token 数"}),e.jsx(le,{type:"number",min:"1",max:"128000",value:T.max_tokens,onChange:re=>{const fe=parseInt(re.target.value);!isNaN(fe)&&fe>=1&&A(ss=>ss?{...ss,max_tokens:fe}:null)},className:"w-28 h-8 text-sm"})]}),e.jsx("p",{className:"text-xs text-muted-foreground",children:"限制模型单次输出的最大 token 数量,不同模型支持的上限不同"})]})]}),e.jsxs("div",{className:"flex items-center space-x-2",children:[e.jsx(Fe,{id:"force_stream_mode",checked:T?.force_stream_mode||!1,onCheckedChange:re=>A(fe=>fe?{...fe,force_stream_mode:re}:null)}),e.jsx(E,{htmlFor:"force_stream_mode",className:"cursor-pointer",children:"强制流式输出模式"})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsx(E,{className:"text-sm font-medium",children:"额外参数"}),e.jsx("div",{className:"flex items-center gap-2",children:e.jsxs(_,{type:"button",variant:"outline",size:"sm",className:"flex-1 justify-start h-9",onClick:()=>U(!0),children:[e.jsx(pn,{className:"h-4 w-4 mr-2"}),Object.keys(T?.extra_params||{}).length>0?e.jsxs("span",{children:["已配置 ",Object.keys(T?.extra_params||{}).length," 个参数"]}):e.jsx("span",{className:"text-muted-foreground",children:"未配置额外参数"})]})}),Object.keys(T?.extra_params||{}).length>0&&e.jsxs("div",{className:"text-xs text-muted-foreground px-1",children:[Object.keys(T?.extra_params||{}).slice(0,3).map(re=>e.jsx("span",{className:"inline-block mr-2",children:e.jsx("code",{className:"px-1.5 py-0.5 bg-muted rounded",children:re})},re)),Object.keys(T?.extra_params||{}).length>3&&e.jsx("span",{children:"..."})]})]})]}),e.jsxs(st,{children:[e.jsx(_,{variant:"outline",onClick:()=>M(!1),"data-tour":"model-cancel-button",children:"取消"}),e.jsx(_,{onClick:Ms,"data-tour":"model-save-button",children:"保存"})]})]})}),e.jsx(vs,{open:ue,onOpenChange:xe,children:e.jsxs(ds,{children:[e.jsxs(us,{children:[e.jsx(xs,{children:"确认删除"}),e.jsxs(hs,{children:['确定要删除模型 "',he!==null?l[he]?.name:"",'" 吗? 此操作无法撤销。']})]}),e.jsxs(ms,{children:[e.jsx(ps,{children:"取消"}),e.jsx(fs,{onClick:Aa,children:"删除"})]})]})}),e.jsx(vs,{open:B,onOpenChange:oe,children:e.jsxs(ds,{children:[e.jsxs(us,{children:[e.jsx(xs,{children:"确认批量删除"}),e.jsxs(hs,{children:["确定要删除选中的 ",z.size," 个模型吗? 此操作无法撤销。"]})]}),e.jsxs(ms,{children:[e.jsx(ps,{children:"取消"}),e.jsx(fs,{onClick:W,className:"bg-destructive text-destructive-foreground hover:bg-destructive/90",children:"批量删除"})]})]})}),e.jsx(vs,{open:Ee,onOpenChange:Z,children:e.jsxs(ds,{children:[e.jsxs(us,{children:[e.jsxs(xs,{className:"flex items-center gap-2",children:[e.jsx(Jt,{className:"h-5 w-5 text-amber-500"}),"更换嵌入模型警告"]}),e.jsx(hs,{asChild:!0,children:e.jsxs("div",{className:"space-y-3 text-sm",children:[e.jsxs("p",{children:[e.jsx("strong",{className:"text-foreground",children:"注意:"}),"更换嵌入模型可能会影响知识库的匹配精度!"]}),e.jsxs("ul",{className:"space-y-2 ml-4 list-disc text-muted-foreground",children:[e.jsx("li",{children:"不同的嵌入模型会产生不同的向量表示"}),e.jsx("li",{children:"这可能导致现有知识库的检索结果不准确"}),e.jsx("li",{children:"建议更换嵌入模型后重新生成所有知识库的向量"})]}),e.jsx("p",{className:"text-foreground font-medium",children:"确定要更换嵌入模型吗?"})]})})]}),e.jsxs(ms,{children:[e.jsx(ps,{onClick:Hs,children:"取消"}),e.jsx(fs,{onClick:Re,className:"bg-amber-600 hover:bg-amber-700",children:"确认更换"})]})]})}),e.jsx(oS,{open:J,onOpenChange:U,value:T?.extra_params||{},onChange:re=>A(fe=>fe?{...fe,extra_params:re}:null)}),e.jsx(Jn,{})]})})}const nc=tj,rc=Q0,ic=Y0,nd="/api/webui/config";async function AS(){const n=await(await we(`${nd}/adapter-config/path`)).json();return!n.success||!n.path?null:{path:n.path,lastModified:n.lastModified}}async function Tg(l){const i=await(await we(`${nd}/adapter-config/path`,{method:"POST",headers:Fs(),body:JSON.stringify({path:l})})).json();if(!i.success)throw new Error(i.message||"保存路径失败")}async function Eg(l){const i=await(await we(`${nd}/adapter-config?path=${encodeURIComponent(l)}`)).json();if(!i.success)throw new Error("读取配置文件失败");return i.content}async function Mg(l,n){const c=await(await we(`${nd}/adapter-config`,{method:"POST",headers:Fs(),body:JSON.stringify({path:l,content:n})})).json();if(!c.success)throw new Error(c.message||"保存配置失败")}const Nt={inner:{version:"0.1.2"},nickname:{nickname:""},napcat_server:{host:"localhost",port:8095,token:"",heartbeat_interval:30},maibot_server:{host:"localhost",port:8e3},chat:{group_list_type:"whitelist",group_list:[],private_list_type:"whitelist",private_list:[],ban_user_id:[],ban_qq_bot:!1,enable_poke:!0},voice:{use_tts:!1},debug:{level:"INFO"}},Mm={oneclick:{name:"一键包",description:"使用一键包部署的适配器配置",path:"../MaiBot-Napcat-Adapter/config.toml",icon:ra},docker:{name:"Docker",description:"Docker Compose 部署的适配器配置",path:"/MaiMBot/adapters-config/config.toml",icon:e_}};function OS(l,n){let i=l.slice(0,n).split(/\r\n|\n|\r/g);return[i.length,i.pop().length+1]}function DS(l,n,i){let c=l.split(/\r\n|\n|\r/g),u="",x=(Math.log10(n+1)|0)+1;for(let h=n-1;h<=n+1;h++){let f=c[h-1];f&&(u+=h.toString().padEnd(x," "),u+=": ",u+=f,u+=` +`),u}async function fS(l,n,i,c){const u=await we("/api/webui/config/model");if(!u.ok)throw new Error("获取当前模型配置失败");const x=await u.json(),h=x.config||x;if(n.apply_providers){const p=n.selected_providers?l.providers.filter(g=>n.selected_providers.includes(g.name)):l.providers;for(const g of p){if(i[g.name])continue;const N=c[g.name];if(!N)throw new Error(`提供商 "${g.name}" 缺少 API Key`);const v={...g,api_key:N},y=h.api_providers.findIndex(w=>w.name===g.name);y>=0?h.api_providers[y]=v:h.api_providers.push(v)}}if(n.apply_models){const p=n.selected_models?l.models.filter(g=>n.selected_models.includes(g.name)):l.models;for(const g of p){const N=i[g.api_provider]||g.api_provider,v={...g,api_provider:N},y=h.models.findIndex(w=>w.name===g.name);y>=0?h.models[y]=v:h.models.push(v)}}if(n.apply_task_config){const p=n.selected_tasks||Object.keys(l.task_config);for(const g of p){const N=l.task_config[g];if(!N)continue;const v=new Set(n.selected_models||l.models.map(b=>b.name)),y=N.model_list.filter(b=>v.has(b));if(y.length===0)continue;const w={...N,model_list:y};if(n.task_mode==="replace")h.model_task_config[g]=w;else{const b=h.model_task_config[g];if(b){const R=[...new Set([...b.model_list,...y])];h.model_task_config[g]={...b,model_list:R}}else h.model_task_config[g]=w}}}if(!(await we("/api/webui/config/model",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(h)})).ok)throw new Error("保存配置失败")}async function pS(l){const n=await we("/api/webui/config/model");if(!n.ok)throw new Error("获取当前模型配置失败");const i=await n.json();if(!i.success||!i.config)throw new Error("获取配置失败");const c=i.config;let u=(c.api_providers||[]).map(g=>({name:g.name,base_url:g.base_url,client_type:g.client_type,max_retry:g.max_retry,timeout:g.timeout,retry_interval:g.retry_interval}));l.selectedProviders&&(u=u.filter(g=>l.selectedProviders.includes(g.name)));let x=c.models||[];l.selectedModels&&(x=x.filter(g=>l.selectedModels.includes(g.name)));const h={},f=c.model_task_config||{},p=l.selectedTasks||Object.keys(f);for(const g of p)f[g]&&(h[g]=f[g]);return{providers:u,models:x,task_config:h}}function Em(l){try{const n=new URL(l);return`${n.protocol}//${n.host}${n.pathname}`.replace(/\/$/,"").toLowerCase()}catch{return l.toLowerCase().replace(/\/$/,"")}}function Sv(){const l="maibot_pack_user_id";let n=localStorage.getItem(l);return n||(n="pack_user_"+Math.random().toString(36).substring(2,15),localStorage.setItem(l,n)),n}const gS={utils:"通用工具",utils_small:"轻量工具",tool_use:"工具调用",replyer:"回复生成",planner:"规划推理",vlm:"视觉模型",voice:"语音处理",embedding:"向量嵌入",lpmm_entity_extract:"实体提取",lpmm_rdf_build:"RDF构建",lpmm_qa:"问答模型"},jS=["官方推荐","性价比","高性能","免费模型","国内可用","海外模型","OpenAI","Claude","Gemini","国产模型","多模态","轻量级"];function vS({trigger:l}){const[n,i]=d.useState(!1),[c,u]=d.useState(1),[x,h]=d.useState(!1),[f,p]=d.useState(!1),[g,N]=d.useState([]),[v,y]=d.useState([]),[w,b]=d.useState({}),[R,D]=d.useState(new Set),[S,P]=d.useState(new Set),[M,T]=d.useState(new Set),[A,F]=d.useState(""),[L,J]=d.useState(""),[U,ue]=d.useState(""),[xe,he]=d.useState([]);d.useEffect(()=>{n&&c===1&&ne()},[n,c]);const ne=async()=>{h(!0);try{const O=await pS({name:"",description:"",author:""});N(O.providers),y(O.models),b(O.task_config),D(new Set(O.providers.map(k=>k.name))),P(new Set(O.models.map(k=>k.name))),T(new Set(Object.keys(O.task_config)))}catch(O){console.error("加载配置失败:",O),Qt({title:"加载当前配置失败",variant:"destructive"})}finally{h(!1)}},ve=O=>{const k=new Set(R),H=new Set(S),se=new Set(M);k.has(O)?(k.delete(O),v.filter(Z=>Z.api_provider===O).forEach(Z=>H.delete(Z.name)),Object.entries(w).forEach(([Z,Oe])=>{Oe.model_list&&(Oe.model_list.some(Q=>H.has(Q))||se.delete(Z))})):(k.add(O),v.filter(Z=>Z.api_provider===O).forEach(Z=>H.add(Z.name)),Object.entries(w).forEach(([Z,Oe])=>{Oe.model_list&&Oe.model_list.some(Q=>{const ee=v.find(Ue=>Ue.name===Q);return ee&&ee.api_provider===O})&&se.add(Z)})),D(k),P(H),T(se)},je=O=>{const k=new Set(S),H=new Set(M);k.has(O)?(k.delete(O),Object.entries(w).forEach(([se,Ee])=>{Ee.model_list&&(Ee.model_list.some(Oe=>k.has(Oe))||H.delete(se))})):(k.add(O),Object.entries(w).forEach(([se,Ee])=>{Ee.model_list&&Ee.model_list.includes(O)&&H.add(se)})),P(k),T(H)},z=O=>{const k=new Set(M);k.has(O)?k.delete(O):k.add(O),T(k)},V=O=>{xe.includes(O)?he(xe.filter(k=>k!==O)):xe.length<5?he([...xe,O]):Qt({title:"最多选择 5 个标签",variant:"destructive"})},B=()=>{R.size===g.length?D(new Set):D(new Set(g.map(O=>O.name)))},oe=()=>{S.size===v.length?P(new Set):P(new Set(v.map(O=>O.name)))},K=()=>{const O=Object.keys(w);M.size===O.length?T(new Set):T(new Set(O))},_e=async()=>{if(!A.trim()){Qt({title:"请输入模板名称",variant:"destructive"});return}if(!L.trim()){Qt({title:"请输入模板描述",variant:"destructive"});return}if(!U.trim()){Qt({title:"请输入作者名称",variant:"destructive"});return}if(R.size===0&&S.size===0&&M.size===0){Qt({title:"请至少选择一项配置",variant:"destructive"});return}p(!0);try{const O=g.filter(se=>R.has(se.name)),k=v.filter(se=>S.has(se.name)),H={};for(const[se,Ee]of Object.entries(w))M.has(se)&&(H[se]=Ee);await mS({name:A.trim(),description:L.trim(),author:U.trim(),tags:xe,providers:O,models:k,task_config:H}),Qt({title:"模板已提交审核,审核通过后将显示在市场中"}),i(!1),pe()}catch(O){console.error("提交失败:",O),Qt({title:O instanceof Error?O.message:"提交失败",variant:"destructive"})}finally{p(!1)}},pe=()=>{u(1),F(""),J(""),ue(""),he([]),D(new Set),P(new Set),T(new Set)},ke=2;return e.jsxs(Is,{open:n,onOpenChange:i,children:[e.jsx(Wo,{asChild:!0,children:l||e.jsxs(_,{variant:"outline",children:[e.jsx($j,{className:"w-4 h-4 mr-2"}),"分享配置"]})}),e.jsxs(Os,{className:"max-w-2xl max-h-[85vh] flex flex-col",children:[e.jsxs(Ds,{children:[e.jsxs(Rs,{className:"flex items-center gap-2",children:[e.jsx(ra,{className:"w-5 h-5"}),"分享配置模板"]}),e.jsxs(Ks,{children:["步骤 ",c," / ",ke,":",c===1&&"选择要分享的配置",c===2&&"填写模板信息"]})]}),e.jsx(Ye,{className:"h-[calc(85vh-220px)] pr-4",children:x?e.jsxs("div",{className:"py-8 text-center",children:[e.jsx(Bs,{className:"w-8 h-8 mx-auto animate-spin text-primary"}),e.jsx("p",{className:"mt-4 text-muted-foreground",children:"正在加载当前配置..."})]}):e.jsxs(e.Fragment,{children:[c===1&&e.jsxs("div",{className:"space-y-4",children:[e.jsxs(at,{children:[e.jsx(Ht,{className:"h-4 w-4"}),e.jsx(Hn,{children:"安全提示"}),e.jsxs(lt,{children:["分享的配置将",e.jsx("strong",{children:"不包含"})," API Key,其他用户需要自行配置。"]})]}),e.jsxs(ta,{defaultValue:"providers",className:"w-full",children:[e.jsxs(Xt,{className:"grid w-full grid-cols-3",children:[e.jsxs(Je,{value:"providers",children:[e.jsx(Dl,{className:"w-4 h-4 mr-2"}),"API 提供商",e.jsxs(Se,{variant:"secondary",className:"ml-2",children:[R.size,"/",g.length]})]}),e.jsxs(Je,{value:"models",children:[e.jsx(Gn,{className:"w-4 h-4 mr-2"}),"模型配置",e.jsxs(Se,{variant:"secondary",className:"ml-2",children:[S.size,"/",v.length]})]}),e.jsxs(Je,{value:"tasks",children:[e.jsx(Vn,{className:"w-4 h-4 mr-2"}),"任务配置",e.jsxs(Se,{variant:"secondary",className:"ml-2",children:[M.size,"/",Object.keys(w).length]})]})]}),e.jsx(ys,{value:"providers",className:"space-y-2 mt-4",children:e.jsxs("div",{className:"space-y-2",children:[e.jsx("div",{className:"flex justify-end",children:e.jsx(_,{variant:"ghost",size:"sm",onClick:B,children:R.size===g.length?"取消全选":"全选"})}),g.length===0?e.jsx("p",{className:"text-sm text-muted-foreground text-center py-2",children:"暂无提供商配置"}):g.map(O=>e.jsxs("div",{className:"flex items-center space-x-2 p-2 rounded hover:bg-muted",children:[e.jsx(qs,{id:`provider-${O.name}`,checked:R.has(O.name),onCheckedChange:()=>ve(O.name)}),e.jsxs(E,{htmlFor:`provider-${O.name}`,className:"flex-1 cursor-pointer",children:[e.jsx("span",{className:"font-medium",children:O.name}),e.jsx("span",{className:"text-xs text-muted-foreground ml-2",children:O.base_url})]}),e.jsx(Se,{variant:"outline",className:"text-xs",children:O.client_type})]},O.name))]})}),e.jsx(ys,{value:"models",className:"space-y-2 mt-4",children:e.jsxs("div",{className:"space-y-2",children:[e.jsx("div",{className:"flex justify-end",children:e.jsx(_,{variant:"ghost",size:"sm",onClick:oe,children:S.size===v.length?"取消全选":"全选"})}),v.length===0?e.jsx("p",{className:"text-sm text-muted-foreground text-center py-2",children:"暂无模型配置"}):v.map(O=>e.jsxs("div",{className:"flex items-center space-x-2 p-2 rounded hover:bg-muted",children:[e.jsx(qs,{id:`model-${O.name}`,checked:S.has(O.name),onCheckedChange:()=>je(O.name)}),e.jsxs(E,{htmlFor:`model-${O.name}`,className:"flex-1 cursor-pointer",children:[e.jsx("span",{className:"font-medium",children:O.name}),e.jsx("span",{className:"text-xs text-muted-foreground ml-2",children:O.model_identifier})]}),e.jsx("span",{className:"text-xs text-muted-foreground",children:O.api_provider})]},O.name))]})}),e.jsx(ys,{value:"tasks",className:"space-y-2 mt-4",children:e.jsxs("div",{className:"space-y-2",children:[e.jsx("div",{className:"flex justify-end",children:e.jsx(_,{variant:"ghost",size:"sm",onClick:K,children:M.size===Object.keys(w).length?"取消全选":"全选"})}),Object.keys(w).length===0?e.jsx("p",{className:"text-sm text-muted-foreground text-center py-2",children:"暂无任务配置"}):Object.entries(w).map(([O,k])=>e.jsxs("div",{className:"space-y-2 p-2 rounded hover:bg-muted",children:[e.jsxs("div",{className:"flex items-center space-x-2",children:[e.jsx(qs,{id:`task-${O}`,checked:M.has(O),onCheckedChange:()=>z(O)}),e.jsx(E,{htmlFor:`task-${O}`,className:"flex-1 cursor-pointer",children:e.jsx("span",{className:"font-medium",children:gS[O]||O})}),e.jsxs(Se,{variant:"outline",className:"text-xs",children:[k.model_list.length," 个模型"]})]}),k.model_list&&k.model_list.length>0&&e.jsx("div",{className:"ml-6 flex flex-wrap gap-1",children:k.model_list.map(H=>{const se=v.find(Z=>Z.name===H),Ee=S.has(H);return e.jsxs(Se,{variant:Ee?"default":"outline",className:"text-xs cursor-pointer hover:opacity-80 transition-opacity",onClick:()=>je(H),children:[H,se&&e.jsxs("span",{className:"ml-1 opacity-70",children:["(",se.api_provider,")"]})]},H)})})]},O))]})})]})]}),c===2&&e.jsxs("div",{className:"space-y-4",children:[e.jsxs("div",{className:"flex gap-4 text-sm p-3 bg-muted rounded-lg",children:[e.jsxs("span",{className:"flex items-center gap-1",children:[e.jsx(Dl,{className:"w-4 h-4"}),R.size," 个提供商"]}),e.jsxs("span",{className:"flex items-center gap-1",children:[e.jsx(Gn,{className:"w-4 h-4"}),S.size," 个模型"]}),e.jsxs("span",{className:"flex items-center gap-1",children:[e.jsx(Vn,{className:"w-4 h-4"}),M.size," 个任务"]})]}),e.jsx(Yt,{}),e.jsxs("div",{className:"space-y-4",children:[e.jsxs("div",{className:"space-y-2",children:[e.jsx(E,{htmlFor:"pack-name",children:"模板名称 *"}),e.jsx(le,{id:"pack-name",placeholder:"例如:高性价比国产模型配置",value:A,onChange:O=>F(O.target.value),maxLength:50}),e.jsxs("p",{className:"text-xs text-muted-foreground",children:[A.length,"/50"]})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsx(E,{htmlFor:"pack-description",children:"模板描述 *"}),e.jsx(ot,{id:"pack-description",placeholder:"详细描述这个配置模板的特点、适用场景等...",value:L,onChange:O=>J(O.target.value),rows:4,maxLength:500}),e.jsxs("p",{className:"text-xs text-muted-foreground",children:[L.length,"/500"]})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsx(E,{htmlFor:"pack-author",children:"作者名称 *"}),e.jsx(le,{id:"pack-author",placeholder:"你的昵称或 ID",value:U,onChange:O=>ue(O.target.value),maxLength:30})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsx(E,{children:"标签(可选,最多 5 个)"}),e.jsx("div",{className:"flex flex-wrap gap-2",children:jS.map(O=>e.jsxs(Se,{variant:xe.includes(O)?"default":"outline",className:"cursor-pointer transition-colors",onClick:()=>V(O),children:[xe.includes(O)&&e.jsx(Ct,{className:"w-3 h-3 mr-1"}),e.jsx(Xo,{className:"w-3 h-3 mr-1"}),O]},O))})]})]}),e.jsxs(at,{children:[e.jsx(Ht,{className:"h-4 w-4"}),e.jsx(Hn,{children:"审核说明"}),e.jsx(lt,{children:"提交后需要经过审核才能在市场中展示。审核通常在 1-3 个工作日内完成。"})]})]})]})}),e.jsxs(st,{className:"flex justify-between pt-4 border-t",children:[e.jsx("div",{children:c>1&&e.jsx(_,{variant:"outline",onClick:()=>u(c-1),disabled:f,children:"上一步"})}),e.jsxs("div",{className:"flex gap-2",children:[e.jsx(_,{variant:"outline",onClick:()=>{i(!1),pe()},disabled:f,children:"取消"}),cu(c+1),disabled:x||R.size===0&&S.size===0&&M.size===0,children:"下一步"}):e.jsxs(_,{onClick:_e,disabled:f,children:[f&&e.jsx(Bs,{className:"w-4 h-4 mr-2 animate-spin"}),"提交审核"]})]})]})]})]})}function NS({value:l,label:n,onRemove:i}){const{attributes:c,listeners:u,setNodeRef:x,transform:h,transition:f,isDragging:p}=Wj({id:l}),g={transform:ev.Transform.toString(h),transition:f,opacity:p?.5:1},N=y=>{y.preventDefault(),y.stopPropagation(),i(l)},v=y=>{y.stopPropagation()};return e.jsx("div",{ref:x,style:g,className:I("inline-flex items-center gap-1",p&&"shadow-lg"),children:e.jsxs(Se,{variant:"secondary",className:"cursor-move hover:bg-secondary/80 flex items-center gap-1",children:[e.jsx("div",{...c,...u,className:"cursor-grab active:cursor-grabbing flex items-center",children:e.jsx(Rj,{className:"h-3 w-3 text-muted-foreground"})}),e.jsx("span",{children:n}),e.jsx("span",{role:"button",tabIndex:0,className:"ml-1 rounded-sm hover:bg-destructive/20 focus:outline-none focus:ring-1 focus:ring-destructive cursor-pointer",onClick:N,onPointerDown:v,onMouseDown:y=>y.stopPropagation(),onKeyDown:y=>{(y.key==="Enter"||y.key===" ")&&(y.preventDefault(),N(y))},children:e.jsx(Ea,{className:"h-3 w-3 hover:text-destructive",strokeWidth:2,fill:"none"})})]})})}function bS({options:l,selected:n,onChange:i,placeholder:c="选择选项...",emptyText:u="未找到选项",className:x}){const[h,f]=d.useState(!1),p=Vj(Bo(Qj,{activationConstraint:{distance:8}}),Bo(Kj,{coordinateGetter:qj})),g=y=>{n.includes(y)?i(n.filter(w=>w!==y)):i([...n,y])},N=y=>{i(n.filter(w=>w!==y))},v=y=>{const{active:w,over:b}=y;if(b&&w.id!==b.id){const R=n.indexOf(w.id),D=n.indexOf(b.id);i(Yj(n,R,D))}};return e.jsxs(ol,{open:h,onOpenChange:f,children:[e.jsx(dl,{asChild:!0,children:e.jsxs(_,{variant:"outline",role:"combobox","aria-expanded":h,className:I("w-full justify-between min-h-10 h-auto",x),children:[e.jsx(Jj,{sensors:p,collisionDetection:Xj,onDragEnd:v,children:e.jsx(Zj,{items:n,strategy:O_,children:e.jsx("div",{className:"flex gap-1 flex-wrap flex-1",children:n.length===0?e.jsx("span",{className:"text-muted-foreground",children:c}):n.map(y=>{const w=l.find(b=>b.value===y);return e.jsx(NS,{value:y,label:w?.label||y,onRemove:N},y)})})})}),e.jsx(Ym,{className:"ml-2 h-4 w-4 shrink-0 opacity-50",strokeWidth:2,fill:"none"})]})}),e.jsx(Wa,{className:"w-full p-0",align:"start",children:e.jsxs(sd,{children:[e.jsx(td,{placeholder:"搜索...",className:"h-9"}),e.jsxs(ad,{children:[e.jsx(ld,{children:u}),e.jsx(ac,{children:l.map(y=>{const w=n.includes(y.value);return e.jsxs(lc,{value:y.value,onSelect:()=>g(y.value),children:[e.jsx("div",{className:I("mr-2 flex h-4 w-4 items-center justify-center rounded-sm border border-primary",w?"bg-primary text-primary-foreground":"opacity-50 [&_svg]:invisible"),children:e.jsx(Ct,{className:"h-3 w-3",strokeWidth:2,fill:"none"})}),e.jsx("span",{children:y.label})]},y.value)})})]})]})})]})}const Ml=As.memo(function({title:n,description:i,taskConfig:c,modelNames:u,onChange:x,hideTemperature:h=!1,hideMaxTokens:f=!1,dataTour:p}){const g=N=>{x("model_list",N)};return e.jsxs("div",{className:"rounded-lg border bg-card p-4 sm:p-6 space-y-4",children:[e.jsxs("div",{children:[e.jsx("h4",{className:"font-semibold text-base sm:text-lg",children:n}),e.jsx("p",{className:"text-xs sm:text-sm text-muted-foreground mt-1",children:i})]}),e.jsxs("div",{className:"grid gap-4",children:[e.jsxs("div",{className:"grid gap-2","data-tour":p,children:[e.jsx(E,{children:"模型列表"}),e.jsx(bS,{options:u.map(N=>({label:N,value:N})),selected:c.model_list||[],onChange:g,placeholder:"选择模型...",emptyText:"暂无可用模型"})]}),e.jsxs("div",{className:"grid grid-cols-1 sm:grid-cols-2 gap-4",children:[!h&&e.jsxs("div",{className:"grid gap-3",children:[e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsx(E,{children:"温度"}),e.jsx(le,{type:"number",step:"0.1",min:"0",max:"1",value:c.temperature??.3,onChange:N=>{const v=parseFloat(N.target.value);!isNaN(v)&&v>=0&&v<=1&&x("temperature",v)},className:"w-20 h-8 text-sm"})]}),e.jsx(qa,{value:[c.temperature??.3],onValueChange:N=>x("temperature",N[0]),min:0,max:1,step:.1,className:"w-full"})]}),!f&&e.jsxs("div",{className:"grid gap-2",children:[e.jsx(E,{children:"最大 Token"}),e.jsx(le,{type:"number",step:"1",min:"1",value:c.max_tokens??1024,onChange:N=>x("max_tokens",parseInt(N.target.value))})]})]}),e.jsxs("div",{className:"grid gap-2",children:[e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsx(E,{children:"慢请求阈值 (秒)"}),e.jsx("span",{className:"text-xs text-muted-foreground",children:"超时警告"})]}),e.jsx(le,{type:"number",step:"1",min:"1",value:c.slow_threshold??15,onChange:N=>{const v=parseInt(N.target.value);!isNaN(v)&&v>=1&&x("slow_threshold",v)},placeholder:"15"}),e.jsx("p",{className:"text-xs text-muted-foreground",children:"模型响应时间超过此阈值将输出警告日志"})]}),e.jsxs("div",{className:"grid gap-2",children:[e.jsx(E,{children:"模型选择策略"}),e.jsxs(Ie,{value:c.selection_strategy??"balance",onValueChange:N=>x("selection_strategy",N),children:[e.jsx($e,{children:e.jsx(Pe,{placeholder:"选择模型选择策略"})}),e.jsxs(Be,{children:[e.jsx(X,{value:"balance",children:"负载均衡(balance)"}),e.jsx(X,{value:"random",children:"随机选择(random)"})]})]}),e.jsx("p",{className:"text-xs text-muted-foreground",children:"负载均衡:优先选择使用次数少的模型。随机选择:完全随机从模型列表中选择"})]})]})]})}),yS=As.memo(function({paginatedModels:n,allModels:i,onEdit:c,onDelete:u,isModelUsed:x,searchQuery:h}){return n.length===0?e.jsx("div",{className:"md:hidden text-center text-muted-foreground py-8 rounded-lg border bg-card",children:h?"未找到匹配的模型":"暂无模型配置"}):e.jsx("div",{className:"md:hidden space-y-3",children:n.map((f,p)=>{const g=i.findIndex(v=>v===f),N=x(f.name);return e.jsxs("div",{className:"rounded-lg border bg-card p-4 space-y-3",children:[e.jsxs("div",{className:"flex items-start justify-between gap-2",children:[e.jsxs("div",{className:"flex-1 min-w-0",children:[e.jsxs("div",{className:"flex items-center gap-2 mb-1",children:[e.jsx("h3",{className:"font-semibold text-base",children:f.name}),e.jsx(Se,{variant:N?"default":"secondary",className:N?"bg-green-600 hover:bg-green-700":"",children:N?"已使用":"未使用"})]}),e.jsx("p",{className:"text-xs text-muted-foreground break-all",title:f.model_identifier,children:f.model_identifier})]}),e.jsxs("div",{className:"flex gap-1 flex-shrink-0",children:[e.jsxs(_,{variant:"default",size:"sm",onClick:()=>c(f,g),children:[e.jsx(Fn,{className:"h-4 w-4 mr-1",strokeWidth:2,fill:"none"}),"编辑"]}),e.jsxs(_,{size:"sm",onClick:()=>u(g),className:"bg-red-600 hover:bg-red-700 text-white",children:[e.jsx(ls,{className:"h-4 w-4 mr-1",strokeWidth:2,fill:"none"}),"删除"]})]})]}),e.jsxs("div",{className:"grid grid-cols-2 gap-2 text-sm",children:[e.jsxs("div",{children:[e.jsx("span",{className:"text-muted-foreground text-xs",children:"提供商"}),e.jsx("p",{className:"font-medium",children:f.api_provider})]}),e.jsxs("div",{children:[e.jsx("span",{className:"text-muted-foreground text-xs",children:"模型温度"}),e.jsx("p",{className:"font-medium",children:f.temperature!=null?f.temperature:e.jsx("span",{className:"text-muted-foreground",children:"默认"})})]}),e.jsxs("div",{children:[e.jsx("span",{className:"text-muted-foreground text-xs",children:"输入价格"}),e.jsxs("p",{className:"font-medium",children:["¥",f.price_in,"/M"]})]}),e.jsxs("div",{children:[e.jsx("span",{className:"text-muted-foreground text-xs",children:"输出价格"}),e.jsxs("p",{className:"font-medium",children:["¥",f.price_out,"/M"]})]})]})]},p)})})}),wS=As.memo(function({paginatedModels:n,allModels:i,filteredModels:c,selectedModels:u,onEdit:x,onDelete:h,onToggleSelection:f,onToggleSelectAll:p,isModelUsed:g,searchQuery:N}){return e.jsx("div",{className:"hidden md:block rounded-lg border bg-card overflow-hidden",children:e.jsx("div",{className:"overflow-x-auto",children:e.jsxs(Rl,{children:[e.jsx(Ll,{children:e.jsxs(ut,{children:[e.jsx(Ze,{className:"w-12",children:e.jsx(qs,{checked:u.size===c.length&&c.length>0,onCheckedChange:p})}),e.jsx(Ze,{className:"w-24",children:"使用状态"}),e.jsx(Ze,{children:"模型名称"}),e.jsx(Ze,{children:"模型标识符"}),e.jsx(Ze,{children:"提供商"}),e.jsx(Ze,{className:"text-center",children:"温度"}),e.jsx(Ze,{className:"text-right",children:"输入价格"}),e.jsx(Ze,{className:"text-right",children:"输出价格"}),e.jsx(Ze,{className:"text-right",children:"操作"})]})}),e.jsx(Ul,{children:n.length===0?e.jsx(ut,{children:e.jsx(qe,{colSpan:9,className:"text-center text-muted-foreground py-8",children:N?"未找到匹配的模型":"暂无模型配置"})}):n.map((v,y)=>{const w=i.findIndex(R=>R===v),b=g(v.name);return e.jsxs(ut,{children:[e.jsx(qe,{children:e.jsx(qs,{checked:u.has(w),onCheckedChange:()=>f(w)})}),e.jsx(qe,{children:e.jsx(Se,{variant:b?"default":"secondary",className:b?"bg-green-600 hover:bg-green-700":"",children:b?"已使用":"未使用"})}),e.jsx(qe,{className:"font-medium",children:v.name}),e.jsx(qe,{className:"max-w-xs truncate",title:v.model_identifier,children:v.model_identifier}),e.jsx(qe,{children:v.api_provider}),e.jsx(qe,{className:"text-center",children:v.temperature!=null?v.temperature:e.jsx("span",{className:"text-muted-foreground",children:"-"})}),e.jsxs(qe,{className:"text-right",children:["¥",v.price_in,"/M"]}),e.jsxs(qe,{className:"text-right",children:["¥",v.price_out,"/M"]}),e.jsx(qe,{className:"text-right",children:e.jsxs("div",{className:"flex justify-end gap-2",children:[e.jsxs(_,{variant:"default",size:"sm",onClick:()=>x(v,w),children:[e.jsx(Fn,{className:"h-4 w-4 mr-1",strokeWidth:2,fill:"none"}),"编辑"]}),e.jsxs(_,{size:"sm",onClick:()=>h(w),className:"bg-red-600 hover:bg-red-700 text-white",children:[e.jsx(ls,{className:"h-4 w-4 mr-1",strokeWidth:2,fill:"none"}),"删除"]})]})})]},y)})})]})})})}),_S=300*1e3,Cg=new Map,SS=[10,20,50,100],kS=As.memo(function({page:n,pageSize:i,totalItems:c,jumpToPage:u,onPageChange:x,onPageSizeChange:h,onJumpToPageChange:f,onJumpToPage:p,onSelectionClear:g}){const N=Math.ceil(c/i),v=w=>{h(parseInt(w)),x(1),g?.()},y=w=>{w.key==="Enter"&&p()};return c===0?null:e.jsxs("div",{className:"flex flex-col sm:flex-row items-center justify-between gap-4 mt-4",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(E,{htmlFor:"page-size-model",className:"text-sm whitespace-nowrap",children:"每页显示"}),e.jsxs(Ie,{value:i.toString(),onValueChange:v,children:[e.jsx($e,{id:"page-size-model",className:"w-20",children:e.jsx(Pe,{})}),e.jsx(Be,{children:SS.map(w=>e.jsx(X,{value:w.toString(),children:w},w))})]}),e.jsxs("span",{className:"text-sm text-muted-foreground",children:["显示 ",(n-1)*i+1," 到"," ",Math.min(n*i,c)," 条,共 ",c," 条"]})]}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(_,{variant:"outline",size:"sm",onClick:()=>x(1),disabled:n===1,className:"hidden sm:flex",children:e.jsx(gn,{className:"h-4 w-4"})}),e.jsxs(_,{variant:"outline",size:"sm",onClick:()=>x(Math.max(1,n-1)),disabled:n===1,children:[e.jsx(Aa,{className:"h-4 w-4 sm:mr-1"}),e.jsx("span",{className:"hidden sm:inline",children:"上一页"})]}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(le,{type:"number",value:u,onChange:w=>f(w.target.value),onKeyDown:y,placeholder:n.toString(),className:"w-16 h-8 text-center",min:1,max:N}),e.jsx(_,{variant:"outline",size:"sm",onClick:p,disabled:!u,className:"h-8",children:"跳转"})]}),e.jsxs(_,{variant:"outline",size:"sm",onClick:()=>x(n+1),disabled:n>=N,children:[e.jsx("span",{className:"hidden sm:inline",children:"下一页"}),e.jsx(Zt,{className:"h-4 w-4 sm:ml-1"})]}),e.jsx(_,{variant:"outline",size:"sm",onClick:()=>x(N),disabled:n>=N,className:"hidden sm:flex",children:e.jsx(jn,{className:"h-4 w-4"})})]})]})});function CS(l){const{models:n,taskConfig:i,debounceMs:c=2e3,onSavingChange:u,onUnsavedChange:x}=l,h=d.useRef(null),f=d.useRef(null),p=d.useRef(!0),g=d.useCallback(()=>{h.current&&(clearTimeout(h.current),h.current=null),f.current&&(clearTimeout(f.current),f.current=null)},[]),N=d.useCallback(w=>{const b={model_identifier:w.model_identifier,name:w.name,api_provider:w.api_provider,price_in:w.price_in??0,price_out:w.price_out??0,force_stream_mode:w.force_stream_mode??!1,extra_params:w.extra_params??{}};return w.temperature!=null&&(b.temperature=w.temperature),w.max_tokens!=null&&(b.max_tokens=w.max_tokens),b},[]),v=d.useCallback(async w=>{try{u?.(!0);const b=w.map(N);await Bm("models",b),x?.(!1)}catch(b){console.error("自动保存模型列表失败:",b),x?.(!0)}finally{u?.(!1)}},[u,x,N]),y=d.useCallback(async w=>{try{u?.(!0),await Bm("model_task_config",w),x?.(!1)}catch(b){console.error("自动保存任务配置失败:",b),x?.(!0)}finally{u?.(!1)}},[u,x]);return d.useEffect(()=>{if(!p.current)return x?.(!0),h.current&&clearTimeout(h.current),h.current=setTimeout(()=>{v(n)},c),()=>{h.current&&clearTimeout(h.current)}},[n,v,c,x]),d.useEffect(()=>{if(!(p.current||!i))return x?.(!0),f.current&&clearTimeout(f.current),f.current=setTimeout(()=>{y(i)},c),()=>{f.current&&clearTimeout(f.current)}},[i,y,c,x]),d.useEffect(()=>()=>{g()},[g]),{clearTimers:g,initialLoadRef:p}}function TS(l={}){const{onCloseEditDialog:n}=l,i=ca(),{registerTour:c,startTour:u,state:x,goToStep:h}=ax(),f=d.useRef(x.stepIndex);return d.useEffect(()=>{c(il,Nv)},[c]),d.useEffect(()=>{if(x.activeTourId===il&&x.isRunning){const g=bv[x.stepIndex];g&&!window.location.pathname.endsWith(g.replace("/config/",""))&&i({to:g})}},[x.stepIndex,x.activeTourId,x.isRunning,i]),d.useEffect(()=>{if(x.activeTourId===il&&x.isRunning){const g=f.current,N=x.stepIndex;g>=12&&g<=17&&N<12&&n?.(),f.current=N}},[x.stepIndex,x.activeTourId,x.isRunning,n]),d.useEffect(()=>{if(x.activeTourId!==il||!x.isRunning)return;const g=N=>{const v=N.target,y=x.stepIndex;y===2&&v.closest('[data-tour="add-provider-button"]')?setTimeout(()=>h(3),300):y===9&&v.closest('[data-tour="provider-cancel-button"]')?setTimeout(()=>h(10),300):y===11&&v.closest('[data-tour="add-model-button"]')?setTimeout(()=>h(12),300):y===17&&v.closest('[data-tour="model-cancel-button"]')?setTimeout(()=>h(18),300):y===18&&v.closest('[data-tour="tasks-tab-trigger"]')&&setTimeout(()=>h(19),300)};return document.addEventListener("click",g,!0),()=>document.removeEventListener("click",g,!0)},[x,h]),{startTour:d.useCallback(()=>{u(il)},[u]),isRunning:x.isRunning&&x.activeTourId===il,stepIndex:x.stepIndex}}function ES(l){const{getProviderConfig:n}=l,[i,c]=d.useState([]),[u,x]=d.useState(!1),[h,f]=d.useState(null),[p,g]=d.useState(null),N=d.useCallback(()=>{c([]),f(null),g(null)},[]),v=d.useCallback(async(y,w=!1)=>{const b=n(y);if(!b?.base_url){c([]),g(null),f('提供商配置不完整,请先在"模型提供商配置"中配置');return}if(!b.api_key){c([]),g(null),f('该提供商未配置 API Key,请先在"模型提供商配置"中填写');return}const R=aS(b.base_url);if(g(R),!R?.modelFetcher){c([]),f(null);return}const D=`${y}:${b.base_url}`,S=Cg.get(D);if(!w&&S&&Date.now()-S.timestamp<_S){c(S.models),f(null);return}x(!0),f(null);try{const P=await U2(y,R.modelFetcher.parser,R.modelFetcher.endpoint);c(P),Cg.set(D,{models:P,timestamp:Date.now()})}catch(P){console.error("获取模型列表失败:",P);const M=P.message||"获取模型列表失败";M.includes("无效")||M.includes("过期")||M.includes("API Key")?f('API Key 无效或已过期,请检查"模型提供商配置"中的密钥'):M.includes("权限")?f("没有权限获取模型列表,请检查 API Key 权限"):M.includes("timeout")||M.includes("超时")?f("请求超时,请检查网络连接后重试"):M.includes("不支持")?f("该提供商不支持自动获取模型列表,请手动输入"):f(M),c([])}finally{x(!1)}},[n]);return{availableModels:i,fetchingModels:u,modelFetchError:h,matchedTemplate:p,fetchModelsForProvider:v,clearModels:N}}function MS(){return e.jsx(Yn,{children:e.jsx(zS,{})})}function zS(){const[l,n]=d.useState([]),[i,c]=d.useState([]),[u,x]=d.useState([]),[h,f]=d.useState([]),[p,g]=d.useState(null),[N,v]=d.useState(!0),[y,w]=d.useState(!1),[b,R]=d.useState(!1),[D,S]=d.useState(!1),[P,M]=d.useState(!1),[T,A]=d.useState(null),[F,L]=d.useState(null),[J,U]=d.useState(!1),[ue,xe]=d.useState(!1),[he,ne]=d.useState(null),[ve,je]=d.useState(""),[z,V]=d.useState(new Set),[B,oe]=d.useState(!1),[K,_e]=d.useState(1),[pe,ke]=d.useState(20),[O,k]=d.useState(""),[H,se]=d.useState(!1),[Ee,Z]=d.useState(!1),Oe=d.useRef([]),ns=d.useRef(null),[Q,ee]=d.useState([]),[Ue,ie]=d.useState([]),[Te,de]=d.useState({}),{toast:Me}=Zs(),{triggerRestart:rs,isRestarting:Ut}=vn(),{startTour:aa,isRunning:Qa}=TS({onCloseEditDialog:()=>M(!1)}),{clearTimers:Ft,initialLoadRef:mt}=CS({models:l,taskConfig:p,onSavingChange:R,onUnsavedChange:S}),q=d.useCallback((re,fe)=>{if(!re)return;const ss=new Set(fe.map(ja=>ja.name)),gs=[],is=[],jt=[{key:"utils",label:"工具模型"},{key:"tool_use",label:"工具调用模型"},{key:"replyer",label:"回复模型"},{key:"planner",label:"规划器模型"},{key:"vlm",label:"视觉模型"},{key:"voice",label:"语音模型"},{key:"embedding",label:"嵌入模型"},{key:"lpmm_entity_extract",label:"LPMM实体抽取"},{key:"lpmm_rdf_build",label:"LPMM关系构建"}];for(const{key:ja,label:Bl}of jt){const Zn=re[ja];if(!Zn)continue;if(!Zn.model_list||Zn.model_list.length===0){is.push(Bl);continue}const Jr=Zn.model_list.filter(bn=>!ss.has(bn));Jr.length>0&&gs.push({taskName:Bl,invalidModels:Jr})}ee(gs),ie(is)},[]),Ve=d.useCallback(async()=>{try{v(!0);const re=await un(),fe=re.models||[];n(fe),f(fe.map(jt=>jt.name));const ss=re.api_providers||[];c(ss.map(jt=>jt.name)),x(ss);const gs=re.model_task_config||null;g(gs),q(gs,fe);const is=gs?.embedding?.model_list||[];Oe.current=[...is],S(!1),mt.current=!1}catch(re){console.error("加载配置失败:",re)}finally{v(!1)}},[mt,q]);d.useEffect(()=>{Ve()},[Ve]);const Ke=d.useCallback(re=>u.find(fe=>fe.name===re),[u]),{availableModels:We,fetchingModels:Ls,modelFetchError:ts,matchedTemplate:Cs,fetchModelsForProvider:ze,clearModels:Ns}=ES({getProviderConfig:Ke});d.useEffect(()=>{P&&T?.api_provider&&ze(T.api_provider)},[P,T?.api_provider,ze]);const as=async()=>{await rs()},es=d.useCallback(()=>{if(!p)return;const re=new Set(l.map(gs=>gs.name)),fe={...p},ss=Object.keys(fe);for(const gs of ss){const is=fe[gs];is&&is.model_list&&(is.model_list=is.model_list.filter(jt=>re.has(jt)))}g(fe),ee([]),Me({title:"清理完成",description:"已删除所有无效的模型引用"})},[p,l,Me]),bs=re=>{const fe={model_identifier:re.model_identifier,name:re.name,api_provider:re.api_provider,price_in:re.price_in??0,price_out:re.price_out??0,force_stream_mode:re.force_stream_mode??!1,extra_params:re.extra_params??{}};return re.temperature!=null&&(fe.temperature=re.temperature),re.max_tokens!=null&&(fe.max_tokens=re.max_tokens),fe},gt=async()=>{try{w(!0),Ft();const re=await un();re.models=l.map(bs),re.model_task_config=p,await Ji(re),S(!1),Me({title:"保存成功",description:"正在重启麦麦..."}),await as()}catch(re){console.error("保存配置失败:",re),Me({title:"保存失败",description:re.message,variant:"destructive"}),w(!1)}},$t=async()=>{try{w(!0),Ft();const re=await un();re.models=l.map(bs),re.model_task_config=p,await Ji(re),S(!1),Me({title:"保存成功",description:"模型配置已保存"}),await Ve()}catch(re){console.error("保存配置失败:",re),Me({title:"保存失败",description:re.message,variant:"destructive"})}finally{w(!1)}},tt=(re,fe)=>{de({}),A(re||{model_identifier:"",name:"",api_provider:i[0]||"",price_in:0,price_out:0,temperature:null,max_tokens:null,force_stream_mode:!1,extra_params:{}}),L(fe),M(!0)},Ms=()=>{if(!T)return;const re={};if(T.name?.trim()?l.some((jt,ja)=>F!==null&&ja===F?!1:jt.name.trim().toLowerCase()===T.name.trim().toLowerCase())&&(re.name="模型名称已存在,请使用其他名称"):re.name="请输入模型名称",T.api_provider?.trim()||(re.api_provider="请选择 API 提供商"),T.model_identifier?.trim()||(re.model_identifier="请输入模型标识符"),Object.keys(re).length>0){de(re);return}de({});const fe={model_identifier:T.model_identifier,name:T.name,api_provider:T.api_provider,price_in:T.price_in??0,price_out:T.price_out??0,force_stream_mode:T.force_stream_mode??!1,extra_params:T.extra_params??{}};T.temperature!=null&&(fe.temperature=T.temperature),T.max_tokens!=null&&(fe.max_tokens=T.max_tokens);let ss,gs=null;if(F!==null?(gs=l[F].name,ss=[...l],ss[F]=fe):ss=[...l,fe],n(ss),f(ss.map(is=>is.name)),gs&&gs!==fe.name&&p){const is=jt=>jt.map(ja=>ja===gs?fe.name:ja);g({...p,utils:{...p.utils,model_list:is(p.utils?.model_list||[])},tool_use:{...p.tool_use,model_list:is(p.tool_use?.model_list||[])},replyer:{...p.replyer,model_list:is(p.replyer?.model_list||[])},planner:{...p.planner,model_list:is(p.planner?.model_list||[])},vlm:{...p.vlm,model_list:is(p.vlm?.model_list||[])},voice:{...p.voice,model_list:is(p.voice?.model_list||[])},embedding:{...p.embedding,model_list:is(p.embedding?.model_list||[])},lpmm_entity_extract:{...p.lpmm_entity_extract,model_list:is(p.lpmm_entity_extract?.model_list||[])},lpmm_rdf_build:{...p.lpmm_rdf_build,model_list:is(p.lpmm_rdf_build?.model_list||[])}})}M(!1),A(null),L(null),Me({title:F!==null?"模型已更新":"模型已添加",description:'配置将在 2 秒后自动保存,或点击右上角"保存配置"按钮立即保存'})},Et=re=>{if(!re&&T){const fe={...T,price_in:T.price_in??0,price_out:T.price_out??0};A(fe)}M(re)},Bt=re=>{ne(re),xe(!0)},Oa=()=>{if(he!==null){const re=l.filter((fe,ss)=>ss!==he);n(re),f(re.map(fe=>fe.name)),q(p,re),Me({title:"删除成功",description:'配置将在 2 秒后自动保存,或点击右上角"保存配置"按钮立即保存'})}xe(!1),ne(null)},tl=re=>{const fe=new Set(z);fe.has(re)?fe.delete(re):fe.add(re),V(fe)},ul=()=>{if(z.size===Dt.length)V(new Set);else{const re=Dt.map((fe,ss)=>l.findIndex(gs=>gs===Dt[ss]));V(new Set(re))}},Xn=()=>{if(z.size===0){Me({title:"提示",description:"请先选择要删除的模型",variant:"default"});return}oe(!0)},W=()=>{const re=z.size,fe=l.filter((ss,gs)=>!z.has(gs));n(fe),f(fe.map(ss=>ss.name)),q(p,fe),V(new Set),oe(!1),Me({title:"批量删除成功",description:`已删除 ${re} 个模型,配置将在 2 秒后自动保存`})},ye=(re,fe,ss)=>{if(!p)return;if(re==="embedding"&&fe==="model_list"&&Array.isArray(ss)){const is=Oe.current,jt=ss;if((is.length!==jt.length||is.some(Bl=>!jt.includes(Bl))||jt.some(Bl=>!is.includes(Bl)))&&is.length>0){ns.current={field:fe,value:ss},Z(!0);return}}const gs={...p,[re]:{...p[re],[fe]:ss}};g(gs),q(gs,l),re==="embedding"&&fe==="model_list"&&Array.isArray(ss)&&(Oe.current=[...ss])},Re=()=>{if(!p||!ns.current)return;const{field:re,value:fe}=ns.current,ss={...p,embedding:{...p.embedding,[re]:fe}};g(ss),q(ss,l),re==="model_list"&&Array.isArray(fe)&&(Oe.current=[...fe]),ns.current=null,Z(!1),Me({title:"嵌入模型已更新",description:"建议重新生成知识库向量以确保最佳匹配精度"})},Hs=()=>{ns.current=null,Z(!1)},Dt=l.filter(re=>{if(!ve)return!0;const fe=ve.toLowerCase();return re.name.toLowerCase().includes(fe)||re.model_identifier.toLowerCase().includes(fe)||re.api_provider.toLowerCase().includes(fe)}),Wt=Math.ceil(Dt.length/pe),rt=Dt.slice((K-1)*pe,K*pe),ea=()=>{const re=parseInt(O);re>=1&&re<=Wt&&(_e(re),k(""))},xt=re=>p?[p.utils?.model_list||[],p.tool_use?.model_list||[],p.replyer?.model_list||[],p.planner?.model_list||[],p.vlm?.model_list||[],p.voice?.model_list||[],p.embedding?.model_list||[],p.lpmm_entity_extract?.model_list||[],p.lpmm_rdf_build?.model_list||[]].some(ss=>ss.includes(re)):!1;return N?e.jsx(Ye,{className:"h-full",children:e.jsx("div",{className:"space-y-4 sm:space-y-6 p-4 sm:p-6",children:e.jsx("div",{className:"flex items-center justify-center h-64",children:e.jsx("p",{className:"text-muted-foreground",children:"加载中..."})})})}):e.jsx(Ye,{className:"h-full",children:e.jsxs("div",{className:"space-y-4 sm:space-y-6 p-4 sm:p-6",children:[e.jsxs("div",{className:"flex flex-col sm:flex-row sm:items-center justify-between gap-4",children:[e.jsxs("div",{children:[e.jsx("h1",{className:"text-2xl sm:text-3xl font-bold",children:"模型管理与分配"}),e.jsx("p",{className:"text-muted-foreground mt-1 sm:mt-2 text-sm sm:text-base",children:"添加模型并为模型分配功能"})]}),e.jsxs("div",{className:"flex gap-2 w-full sm:w-auto",children:[e.jsx(vS,{trigger:e.jsxs(_,{variant:"outline",size:"sm",className:"flex-1 sm:flex-none",children:[e.jsx($j,{className:"mr-2 h-4 w-4"}),"分享配置"]})}),e.jsxs(_,{onClick:$t,disabled:y||b||!D||Ut,size:"sm",variant:"outline",className:"flex-1 sm:flex-none sm:min-w-[120px]",children:[e.jsx(oc,{className:"mr-2 h-4 w-4",strokeWidth:2,fill:"none"}),y?"保存中...":b?"自动保存中...":D?"保存配置":"已保存"]}),e.jsxs(vs,{children:[e.jsx(wt,{asChild:!0,children:e.jsxs(_,{disabled:y||b||Ut,size:"sm",className:"flex-1 sm:flex-none sm:min-w-[120px]",children:[e.jsx(cc,{className:"mr-2 h-4 w-4"}),Ut?"重启中...":D?"保存并重启":"重启麦麦"]})}),e.jsxs(ds,{children:[e.jsxs(us,{children:[e.jsx(xs,{children:"确认重启麦麦?"}),e.jsx(hs,{asChild:!0,children:e.jsx("div",{children:e.jsx("p",{children:D?"当前有未保存的配置更改。点击确认将先保存配置,然后重启麦麦使新配置生效。重启过程中麦麦将暂时离线。":"即将重启麦麦主程序。重启过程中麦麦将暂时离线,配置将在重启后生效。"})})})]}),e.jsxs(ms,{children:[e.jsx(ps,{children:"取消"}),e.jsx(fs,{onClick:D?gt:as,children:D?"保存并重启":"确认重启"})]})]})]})]})]}),e.jsxs(at,{children:[e.jsx(Ht,{className:"h-4 w-4"}),e.jsxs(lt,{children:["配置更新后需要",e.jsx("strong",{children:"重启麦麦"}),'才能生效。你可以点击右上角的"保存并重启"按钮一键完成保存和重启。']})]}),Q.length>0&&e.jsxs(at,{variant:"destructive",children:[e.jsx(Jt,{className:"h-4 w-4"}),e.jsxs(lt,{className:"flex items-start justify-between gap-4",children:[e.jsxs("div",{className:"flex-1",children:[e.jsx("strong",{children:"检测到无效的模型引用"}),e.jsx("div",{className:"mt-2 space-y-1",children:Q.map(({taskName:re,invalidModels:fe})=>e.jsxs("div",{className:"text-sm",children:[e.jsx("strong",{children:re})," 引用了不存在的模型: ",fe.join(", ")]},re))})]}),e.jsx(_,{variant:"outline",size:"sm",className:"shrink-0 bg-background hover:bg-accent",onClick:es,children:"一键清理"})]})]}),Ue.length>0&&e.jsxs(at,{variant:"default",className:"border-yellow-500/50 bg-yellow-500/10",children:[e.jsx(Jt,{className:"h-4 w-4 text-yellow-600"}),e.jsxs(lt,{children:[e.jsx("strong",{className:"text-yellow-600",children:"以下任务未配置模型"}),e.jsxs("div",{className:"mt-2 text-sm",children:[Ue.join("、")," 还未分配模型,这些功能将无法正常工作。"]})]})]}),e.jsxs(at,{className:"hidden lg:flex border-primary/30 bg-primary/5 cursor-pointer hover:bg-primary/10 transition-colors",onClick:aa,children:[e.jsx(Ww,{className:"h-4 w-4 text-primary"}),e.jsxs(lt,{className:"flex items-center justify-between",children:[e.jsxs("span",{children:[e.jsx("strong",{className:"text-primary",children:"新手引导:"}),"不知道如何配置模型?点击这里开始学习如何为麦麦的组件分配模型。"]}),e.jsx(_,{variant:"outline",size:"sm",className:"ml-4 shrink-0",children:"开始引导"})]})]}),e.jsxs(ta,{defaultValue:"models",className:"w-full",children:[e.jsxs(Xt,{className:"grid w-full max-w-full sm:max-w-md grid-cols-2",children:[e.jsx(Je,{value:"models",children:"添加模型"}),e.jsx(Je,{value:"tasks","data-tour":"tasks-tab-trigger",children:"为模型分配功能"})]}),e.jsxs(ys,{value:"models",className:"space-y-4 mt-0",children:[e.jsxs("div",{className:"flex flex-col sm:flex-row justify-between items-start sm:items-center gap-2",children:[e.jsx("p",{className:"text-sm text-muted-foreground",children:"配置可用的模型列表"}),e.jsxs("div",{className:"flex gap-2 w-full sm:w-auto",children:[z.size>0&&e.jsxs(_,{onClick:Xn,size:"sm",variant:"destructive",className:"w-full sm:w-auto",children:[e.jsx(ls,{className:"mr-2 h-4 w-4",strokeWidth:2,fill:"none"}),"批量删除 (",z.size,")"]}),e.jsxs(_,{onClick:()=>tt(null,null),size:"sm",variant:"outline",className:"w-full sm:w-auto","data-tour":"add-model-button",children:[e.jsx(et,{className:"mr-2 h-4 w-4",strokeWidth:2,fill:"none"}),"添加模型"]})]})]}),e.jsxs("div",{className:"flex flex-col sm:flex-row items-start sm:items-center gap-2",children:[e.jsxs("div",{className:"relative w-full sm:flex-1 sm:max-w-sm",children:[e.jsx(Tt,{className:"absolute left-3 top-1/2 -translate-y-1/2 h-4 w-4 text-muted-foreground"}),e.jsx(le,{placeholder:"搜索模型名称、标识符或提供商...",value:ve,onChange:re=>je(re.target.value),className:"pl-9"})]}),ve&&e.jsxs("p",{className:"text-sm text-muted-foreground whitespace-nowrap",children:["找到 ",Dt.length," 个结果"]})]}),e.jsx(yS,{paginatedModels:rt,allModels:l,onEdit:tt,onDelete:Bt,isModelUsed:xt,searchQuery:ve}),e.jsx(wS,{paginatedModels:rt,allModels:l,filteredModels:Dt,selectedModels:z,onEdit:tt,onDelete:Bt,onToggleSelection:tl,onToggleSelectAll:ul,isModelUsed:xt,searchQuery:ve}),e.jsx(kS,{page:K,pageSize:pe,totalItems:Dt.length,jumpToPage:O,onPageChange:_e,onPageSizeChange:ke,onJumpToPageChange:k,onJumpToPage:ea,onSelectionClear:()=>V(new Set)})]}),e.jsxs(ys,{value:"tasks",className:"space-y-6 mt-0",children:[e.jsx("p",{className:"text-sm text-muted-foreground",children:"为不同的任务配置使用的模型和参数"}),p&&e.jsxs("div",{className:"grid gap-4 sm:gap-6",children:[e.jsx(Ml,{title:"组件模型 (utils)",description:"用于表情包、取名、关系、情绪变化等组件",taskConfig:p.utils,modelNames:h,onChange:(re,fe)=>ye("utils",re,fe),dataTour:"task-model-select"}),e.jsx(Ml,{title:"工具调用模型 (tool_use)",description:"需要使用支持工具调用的模型",taskConfig:p.tool_use,modelNames:h,onChange:(re,fe)=>ye("tool_use",re,fe)}),e.jsx(Ml,{title:"首要回复模型 (replyer)",description:"用于表达器和表达方式学习",taskConfig:p.replyer,modelNames:h,onChange:(re,fe)=>ye("replyer",re,fe)}),e.jsx(Ml,{title:"决策模型 (planner)",description:"负责决定麦麦该什么时候回复",taskConfig:p.planner,modelNames:h,onChange:(re,fe)=>ye("planner",re,fe)}),e.jsx(Ml,{title:"图像识别模型 (vlm)",description:"视觉语言模型",taskConfig:p.vlm,modelNames:h,onChange:(re,fe)=>ye("vlm",re,fe),hideTemperature:!0}),e.jsx(Ml,{title:"语音识别模型 (voice)",description:"语音转文字",taskConfig:p.voice,modelNames:h,onChange:(re,fe)=>ye("voice",re,fe),hideTemperature:!0,hideMaxTokens:!0}),e.jsx(Ml,{title:"嵌入模型 (embedding)",description:"用于向量化",taskConfig:p.embedding,modelNames:h,onChange:(re,fe)=>ye("embedding",re,fe),hideTemperature:!0,hideMaxTokens:!0}),e.jsxs("div",{className:"space-y-4",children:[e.jsx("h3",{className:"text-lg font-semibold",children:"LPMM 知识库模型"}),e.jsx(Ml,{title:"实体提取模型 (lpmm_entity_extract)",description:"从文本中提取实体",taskConfig:p.lpmm_entity_extract,modelNames:h,onChange:(re,fe)=>ye("lpmm_entity_extract",re,fe)}),e.jsx(Ml,{title:"RDF 构建模型 (lpmm_rdf_build)",description:"构建知识图谱",taskConfig:p.lpmm_rdf_build,modelNames:h,onChange:(re,fe)=>ye("lpmm_rdf_build",re,fe)})]})]})]})]}),e.jsx(Is,{open:P,onOpenChange:Et,children:e.jsxs(Os,{className:"max-w-[95vw] sm:max-w-2xl max-h-[90vh] overflow-y-auto","data-tour":"model-dialog",preventOutsideClose:Qa,children:[e.jsxs(Ds,{children:[e.jsx(Rs,{children:F!==null?"编辑模型":"添加模型"}),e.jsx(Ks,{children:"配置模型的基本信息和参数"})]}),e.jsxs("div",{className:"grid gap-4 py-4",children:[e.jsxs("div",{className:"grid gap-2","data-tour":"model-name-input",children:[e.jsx(E,{htmlFor:"model_name",className:Te.name?"text-destructive":"",children:"模型名称 *"}),e.jsx(le,{id:"model_name",value:T?.name||"",onChange:re=>{A(fe=>fe?{...fe,name:re.target.value}:null),Te.name&&de(fe=>({...fe,name:void 0}))},placeholder:"例如: qwen3-30b",className:Te.name?"border-destructive focus-visible:ring-destructive":""}),Te.name?e.jsx("p",{className:"text-xs text-destructive",children:Te.name}):e.jsx("p",{className:"text-xs text-muted-foreground",children:"用于在任务配置中引用此模型"})]}),e.jsxs("div",{className:"grid gap-2","data-tour":"model-provider-select",children:[e.jsx(E,{htmlFor:"api_provider",className:Te.api_provider?"text-destructive":"",children:"API 提供商 *"}),e.jsxs(Ie,{value:T?.api_provider||"",onValueChange:re=>{A(fe=>fe?{...fe,api_provider:re}:null),Ns(),Te.api_provider&&de(fe=>({...fe,api_provider:void 0}))},children:[e.jsx($e,{id:"api_provider",className:Te.api_provider?"border-destructive focus-visible:ring-destructive":"",children:e.jsx(Pe,{placeholder:"选择提供商"})}),e.jsx(Be,{children:i.map(re=>e.jsx(X,{value:re,children:re},re))})]}),Te.api_provider&&e.jsx("p",{className:"text-xs text-destructive",children:Te.api_provider})]}),e.jsxs("div",{className:"grid gap-2","data-tour":"model-identifier-input",children:[e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsx(E,{htmlFor:"model_identifier",className:Te.model_identifier?"text-destructive":"",children:"模型标识符 *"}),Cs?.modelFetcher&&e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(Se,{variant:"secondary",className:"text-xs",children:Cs.display_name}),e.jsx(_,{variant:"ghost",size:"sm",className:"h-6 px-2",onClick:()=>T?.api_provider&&ze(T.api_provider,!0),disabled:Ls,children:Ls?e.jsx(Bs,{className:"h-3 w-3 animate-spin"}):e.jsx(dt,{className:"h-3 w-3"})})]})]}),Cs?.modelFetcher?e.jsxs(ol,{open:H,onOpenChange:se,children:[e.jsx(dl,{asChild:!0,children:e.jsxs(_,{variant:"outline",role:"combobox","aria-expanded":H,className:"w-full justify-between font-normal",disabled:Ls||!!ts,children:[Ls?e.jsxs("span",{className:"flex items-center gap-2 text-muted-foreground",children:[e.jsx(Bs,{className:"h-4 w-4 animate-spin"}),"正在获取模型列表..."]}):ts?e.jsx("span",{className:"text-muted-foreground text-sm",children:"点击下方输入框手动填写"}):T?.model_identifier?e.jsx("span",{className:"truncate",children:T.model_identifier}):e.jsx("span",{className:"text-muted-foreground",children:"搜索或选择模型..."}),e.jsx(Ym,{className:"ml-2 h-4 w-4 shrink-0 opacity-50"})]})}),e.jsx(Wa,{className:"p-0",align:"start",style:{width:"var(--radix-popover-trigger-width)"},children:e.jsxs(sd,{children:[e.jsx(td,{placeholder:"搜索模型..."}),e.jsx(Ye,{className:"h-[300px]",children:e.jsxs(ad,{className:"max-h-none overflow-visible",children:[e.jsx(ld,{children:ts?e.jsxs("div",{className:"py-4 px-2 text-center space-y-2",children:[e.jsx("p",{className:"text-sm text-destructive",children:ts}),!ts.includes("API Key")&&e.jsx(_,{variant:"link",size:"sm",onClick:()=>T?.api_provider&&ze(T.api_provider,!0),children:"重试"})]}):"未找到匹配的模型"}),e.jsx(ac,{heading:"可用模型",children:We.map(re=>e.jsxs(lc,{value:re.id,onSelect:()=>{A(fe=>fe?{...fe,model_identifier:re.id}:null),se(!1)},children:[e.jsx(Ct,{className:`mr-2 h-4 w-4 ${T?.model_identifier===re.id?"opacity-100":"opacity-0"}`}),e.jsxs("div",{className:"flex flex-col",children:[e.jsx("span",{children:re.id}),re.name!==re.id&&e.jsx("span",{className:"text-xs text-muted-foreground",children:re.name})]})]},re.id))}),e.jsx(ac,{heading:"手动输入",children:e.jsxs(lc,{value:"__manual_input__",onSelect:()=>{se(!1)},children:[e.jsx(Fn,{className:"mr-2 h-4 w-4"}),"手动输入模型标识符..."]})})]})})]})})]}):e.jsx(le,{id:"model_identifier",value:T?.model_identifier||"",onChange:re=>{A(fe=>fe?{...fe,model_identifier:re.target.value}:null),Te.model_identifier&&de(fe=>({...fe,model_identifier:void 0}))},placeholder:"Qwen/Qwen3-30B-A3B-Instruct-2507",className:Te.model_identifier?"border-destructive focus-visible:ring-destructive":""}),Te.model_identifier&&e.jsx("p",{className:"text-xs text-destructive",children:Te.model_identifier}),ts&&Cs?.modelFetcher&&!Te.model_identifier&&e.jsxs(at,{variant:"destructive",className:"mt-2 py-2",children:[e.jsx(Ht,{className:"h-4 w-4"}),e.jsx(lt,{className:"text-xs",children:ts})]}),Cs?.modelFetcher&&e.jsx(le,{value:T?.model_identifier||"",onChange:re=>{A(fe=>fe?{...fe,model_identifier:re.target.value}:null),Te.model_identifier&&de(fe=>({...fe,model_identifier:void 0}))},placeholder:"或手动输入模型标识符",className:`mt-2 ${Te.model_identifier?"border-destructive focus-visible:ring-destructive":""}`}),!Te.model_identifier&&e.jsx("p",{className:"text-xs text-muted-foreground",children:ts?'请手动输入模型标识符,或前往"模型提供商配置"检查 API Key':Cs?.modelFetcher?`已识别为 ${Cs.display_name},支持自动获取模型列表`:"API 提供商提供的模型 ID"})]}),e.jsxs("div",{className:"grid grid-cols-1 sm:grid-cols-2 gap-4",children:[e.jsxs("div",{className:"grid gap-2",children:[e.jsx(E,{htmlFor:"price_in",children:"输入价格 (¥/M token)"}),e.jsx(le,{id:"price_in",type:"number",step:"0.1",min:"0",value:T?.price_in??"",onChange:re=>{const fe=re.target.value===""?null:parseFloat(re.target.value);A(ss=>ss?{...ss,price_in:fe}:null)},placeholder:"默认: 0"})]}),e.jsxs("div",{className:"grid gap-2",children:[e.jsx(E,{htmlFor:"price_out",children:"输出价格 (¥/M token)"}),e.jsx(le,{id:"price_out",type:"number",step:"0.1",min:"0",value:T?.price_out??"",onChange:re=>{const fe=re.target.value===""?null:parseFloat(re.target.value);A(ss=>ss?{...ss,price_out:fe}:null)},placeholder:"默认: 0"})]})]}),e.jsxs("div",{className:"rounded-lg border p-4 space-y-3",children:[e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsxs("div",{className:"space-y-0.5",children:[e.jsx(E,{htmlFor:"enable_model_temperature",className:"cursor-pointer",children:"自定义模型温度"}),e.jsx("p",{className:"text-xs text-muted-foreground",children:"启用后将覆盖「为模型分配功能」中的任务温度配置"})]}),e.jsx(Fe,{id:"enable_model_temperature",checked:T?.temperature!=null,onCheckedChange:re=>{A(re?fe=>fe?{...fe,temperature:.5}:null:fe=>fe?{...fe,temperature:null}:null)}})]}),T?.temperature!=null&&e.jsxs("div",{className:"space-y-2 pt-2 border-t",children:[e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsx(E,{className:"text-sm",children:"温度值"}),e.jsx("span",{className:"text-sm font-medium tabular-nums",children:T.temperature.toFixed(1)})]}),e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx("span",{className:"text-xs text-muted-foreground",children:"0"}),e.jsx(qa,{value:[T.temperature],onValueChange:re=>A(fe=>fe?{...fe,temperature:re[0]}:null),min:0,max:1,step:.1,className:"flex-1"}),e.jsx("span",{className:"text-xs text-muted-foreground",children:"1"})]}),e.jsx("p",{className:"text-xs text-muted-foreground",children:"较低的温度(0.1-0.3)产生更确定的输出,较高的温度(0.7-1.0)产生更多样化的输出"})]})]}),e.jsxs("div",{className:"rounded-lg border p-4 space-y-3",children:[e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsxs("div",{className:"space-y-0.5",children:[e.jsx(E,{htmlFor:"enable_model_max_tokens",className:"cursor-pointer",children:"自定义最大 Token"}),e.jsx("p",{className:"text-xs text-muted-foreground",children:"启用后将覆盖「为模型分配功能」中的任务最大 Token 配置"})]}),e.jsx(Fe,{id:"enable_model_max_tokens",checked:T?.max_tokens!=null,onCheckedChange:re=>{A(re?fe=>fe?{...fe,max_tokens:2048}:null:fe=>fe?{...fe,max_tokens:null}:null)}})]}),T?.max_tokens!=null&&e.jsxs("div",{className:"space-y-2 pt-2 border-t",children:[e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsx(E,{className:"text-sm",children:"最大 Token 数"}),e.jsx(le,{type:"number",min:"1",max:"128000",value:T.max_tokens,onChange:re=>{const fe=parseInt(re.target.value);!isNaN(fe)&&fe>=1&&A(ss=>ss?{...ss,max_tokens:fe}:null)},className:"w-28 h-8 text-sm"})]}),e.jsx("p",{className:"text-xs text-muted-foreground",children:"限制模型单次输出的最大 token 数量,不同模型支持的上限不同"})]})]}),e.jsxs("div",{className:"flex items-center space-x-2",children:[e.jsx(Fe,{id:"force_stream_mode",checked:T?.force_stream_mode||!1,onCheckedChange:re=>A(fe=>fe?{...fe,force_stream_mode:re}:null)}),e.jsx(E,{htmlFor:"force_stream_mode",className:"cursor-pointer",children:"强制流式输出模式"})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsx(E,{className:"text-sm font-medium",children:"额外参数"}),e.jsx("div",{className:"flex items-center gap-2",children:e.jsxs(_,{type:"button",variant:"outline",size:"sm",className:"flex-1 justify-start h-9",onClick:()=>U(!0),children:[e.jsx(pn,{className:"h-4 w-4 mr-2"}),Object.keys(T?.extra_params||{}).length>0?e.jsxs("span",{children:["已配置 ",Object.keys(T?.extra_params||{}).length," 个参数"]}):e.jsx("span",{className:"text-muted-foreground",children:"未配置额外参数"})]})}),Object.keys(T?.extra_params||{}).length>0&&e.jsxs("div",{className:"text-xs text-muted-foreground px-1",children:[Object.keys(T?.extra_params||{}).slice(0,3).map(re=>e.jsx("span",{className:"inline-block mr-2",children:e.jsx("code",{className:"px-1.5 py-0.5 bg-muted rounded",children:re})},re)),Object.keys(T?.extra_params||{}).length>3&&e.jsx("span",{children:"..."})]})]})]}),e.jsxs(st,{children:[e.jsx(_,{variant:"outline",onClick:()=>M(!1),"data-tour":"model-cancel-button",children:"取消"}),e.jsx(_,{onClick:Ms,"data-tour":"model-save-button",children:"保存"})]})]})}),e.jsx(vs,{open:ue,onOpenChange:xe,children:e.jsxs(ds,{children:[e.jsxs(us,{children:[e.jsx(xs,{children:"确认删除"}),e.jsxs(hs,{children:['确定要删除模型 "',he!==null?l[he]?.name:"",'" 吗? 此操作无法撤销。']})]}),e.jsxs(ms,{children:[e.jsx(ps,{children:"取消"}),e.jsx(fs,{onClick:Oa,children:"删除"})]})]})}),e.jsx(vs,{open:B,onOpenChange:oe,children:e.jsxs(ds,{children:[e.jsxs(us,{children:[e.jsx(xs,{children:"确认批量删除"}),e.jsxs(hs,{children:["确定要删除选中的 ",z.size," 个模型吗? 此操作无法撤销。"]})]}),e.jsxs(ms,{children:[e.jsx(ps,{children:"取消"}),e.jsx(fs,{onClick:W,className:"bg-destructive text-destructive-foreground hover:bg-destructive/90",children:"批量删除"})]})]})}),e.jsx(vs,{open:Ee,onOpenChange:Z,children:e.jsxs(ds,{children:[e.jsxs(us,{children:[e.jsxs(xs,{className:"flex items-center gap-2",children:[e.jsx(Jt,{className:"h-5 w-5 text-amber-500"}),"更换嵌入模型警告"]}),e.jsx(hs,{asChild:!0,children:e.jsxs("div",{className:"space-y-3 text-sm",children:[e.jsxs("p",{children:[e.jsx("strong",{className:"text-foreground",children:"注意:"}),"更换嵌入模型可能会影响知识库的匹配精度!"]}),e.jsxs("ul",{className:"space-y-2 ml-4 list-disc text-muted-foreground",children:[e.jsx("li",{children:"不同的嵌入模型会产生不同的向量表示"}),e.jsx("li",{children:"这可能导致现有知识库的检索结果不准确"}),e.jsx("li",{children:"建议更换嵌入模型后重新生成所有知识库的向量"})]}),e.jsx("p",{className:"text-foreground font-medium",children:"确定要更换嵌入模型吗?"})]})})]}),e.jsxs(ms,{children:[e.jsx(ps,{onClick:Hs,children:"取消"}),e.jsx(fs,{onClick:Re,className:"bg-amber-600 hover:bg-amber-700",children:"确认更换"})]})]})}),e.jsx(oS,{open:J,onOpenChange:U,value:T?.extra_params||{},onChange:re=>A(fe=>fe?{...fe,extra_params:re}:null)}),e.jsx(Jn,{})]})})}const nc=tj,rc=Q0,ic=Y0,nd="/api/webui/config";async function AS(){const n=await(await we(`${nd}/adapter-config/path`)).json();return!n.success||!n.path?null:{path:n.path,lastModified:n.lastModified}}async function Tg(l){const i=await(await we(`${nd}/adapter-config/path`,{method:"POST",headers:Fs(),body:JSON.stringify({path:l})})).json();if(!i.success)throw new Error(i.message||"保存路径失败")}async function Eg(l){const i=await(await we(`${nd}/adapter-config?path=${encodeURIComponent(l)}`)).json();if(!i.success)throw new Error("读取配置文件失败");return i.content}async function Mg(l,n){const c=await(await we(`${nd}/adapter-config`,{method:"POST",headers:Fs(),body:JSON.stringify({path:l,content:n})})).json();if(!c.success)throw new Error(c.message||"保存配置失败")}const bt={inner:{version:"0.1.2"},nickname:{nickname:""},napcat_server:{host:"localhost",port:8095,token:"",heartbeat_interval:30},maibot_server:{host:"localhost",port:8e3},chat:{group_list_type:"whitelist",group_list:[],private_list_type:"whitelist",private_list:[],ban_user_id:[],ban_qq_bot:!1,enable_poke:!0},voice:{use_tts:!1},debug:{level:"INFO"}},Mm={oneclick:{name:"一键包",description:"使用一键包部署的适配器配置",path:"../MaiBot-Napcat-Adapter/config.toml",icon:ra},docker:{name:"Docker",description:"Docker Compose 部署的适配器配置",path:"/MaiMBot/adapters-config/config.toml",icon:e_}};function OS(l,n){let i=l.slice(0,n).split(/\r\n|\n|\r/g);return[i.length,i.pop().length+1]}function DS(l,n,i){let c=l.split(/\r\n|\n|\r/g),u="",x=(Math.log10(n+1)|0)+1;for(let h=n-1;h<=n+1;h++){let f=c[h-1];f&&(u+=h.toString().padEnd(x," "),u+=": ",u+=f,u+=` `,h===n&&(u+=" ".repeat(x+i+2),u+=`^ `))}return u}class ks extends Error{line;column;codeblock;constructor(n,i){const[c,u]=OS(i.toml,i.ptr),x=DS(i.toml,c,u);super(`Invalid TOML document: ${n} @@ -66,14 +66,14 @@ ${x}`,i),this.line=c,this.column=u,this.codeblock=x}}function RS(l,n){let i=0;fo ${x}`:`[${l}]`),x&&h?`${x} ${h}`:x||h}function JS(l,{maxDepth:n=1e3,numbersAsFloat:i=!1}={}){if(dc(l)!=="object")throw new TypeError("stringify can only be called with an object");let c=cx(0,l,"",n,i);return c[c.length-1]!==` `?c+` -`:c}function zm(l){try{const n=Tv(l);return{inner:{...Nt.inner,...n.inner},nickname:{...Nt.nickname,...n.nickname},napcat_server:{...Nt.napcat_server,...n.napcat_server},maibot_server:{...Nt.maibot_server,...n.maibot_server},chat:{...Nt.chat,...n.chat},voice:{...Nt.voice,...n.voice},debug:{...Nt.debug,...n.debug}}}catch(n){throw console.error("TOML 解析失败:",n),new Error(`无法解析 TOML 文件: ${n instanceof Error?n.message:"未知错误"}`)}}function Am(l){try{const n=(u,x)=>u===""||u===null||u===void 0?x:u,i={inner:{version:n(l.inner.version,Nt.inner.version)},nickname:{nickname:n(l.nickname.nickname,Nt.nickname.nickname)},napcat_server:{host:n(l.napcat_server.host,Nt.napcat_server.host),port:n(l.napcat_server.port||0,Nt.napcat_server.port),token:n(l.napcat_server.token,Nt.napcat_server.token),heartbeat_interval:n(l.napcat_server.heartbeat_interval||0,Nt.napcat_server.heartbeat_interval)},maibot_server:{host:n(l.maibot_server.host,Nt.maibot_server.host),port:n(l.maibot_server.port||0,Nt.maibot_server.port)},chat:{group_list_type:n(l.chat.group_list_type,Nt.chat.group_list_type),group_list:l.chat.group_list||[],private_list_type:n(l.chat.private_list_type,Nt.chat.private_list_type),private_list:l.chat.private_list||[],ban_user_id:l.chat.ban_user_id||[],ban_qq_bot:l.chat.ban_qq_bot??Nt.chat.ban_qq_bot,enable_poke:l.chat.enable_poke??Nt.chat.enable_poke},voice:{use_tts:l.voice.use_tts??Nt.voice.use_tts},debug:{level:n(l.debug.level,Nt.debug.level)}};let c=JS(i);return c=XS(c),c}catch(n){throw console.error("TOML 生成失败:",n),new Error(`无法生成 TOML 文件: ${n instanceof Error?n.message:"未知错误"}`)}}function XS(l){const n=l.split(` +`:c}function zm(l){try{const n=Tv(l);return{inner:{...bt.inner,...n.inner},nickname:{...bt.nickname,...n.nickname},napcat_server:{...bt.napcat_server,...n.napcat_server},maibot_server:{...bt.maibot_server,...n.maibot_server},chat:{...bt.chat,...n.chat},voice:{...bt.voice,...n.voice},debug:{...bt.debug,...n.debug}}}catch(n){throw console.error("TOML 解析失败:",n),new Error(`无法解析 TOML 文件: ${n instanceof Error?n.message:"未知错误"}`)}}function Am(l){try{const n=(u,x)=>u===""||u===null||u===void 0?x:u,i={inner:{version:n(l.inner.version,bt.inner.version)},nickname:{nickname:n(l.nickname.nickname,bt.nickname.nickname)},napcat_server:{host:n(l.napcat_server.host,bt.napcat_server.host),port:n(l.napcat_server.port||0,bt.napcat_server.port),token:n(l.napcat_server.token,bt.napcat_server.token),heartbeat_interval:n(l.napcat_server.heartbeat_interval||0,bt.napcat_server.heartbeat_interval)},maibot_server:{host:n(l.maibot_server.host,bt.maibot_server.host),port:n(l.maibot_server.port||0,bt.maibot_server.port)},chat:{group_list_type:n(l.chat.group_list_type,bt.chat.group_list_type),group_list:l.chat.group_list||[],private_list_type:n(l.chat.private_list_type,bt.chat.private_list_type),private_list:l.chat.private_list||[],ban_user_id:l.chat.ban_user_id||[],ban_qq_bot:l.chat.ban_qq_bot??bt.chat.ban_qq_bot,enable_poke:l.chat.enable_poke??bt.chat.enable_poke},voice:{use_tts:l.voice.use_tts??bt.voice.use_tts},debug:{level:n(l.debug.level,bt.debug.level)}};let c=JS(i);return c=XS(c),c}catch(n){throw console.error("TOML 生成失败:",n),new Error(`无法生成 TOML 文件: ${n instanceof Error?n.message:"未知错误"}`)}}function XS(l){const n=l.split(` `),i=[];for(let c=0;c"|?*\x00-\x1F]/.test(l)?{valid:!1,error:"路径包含非法字符"}:{valid:!0,error:""}}function ZS(){const[l,n]=d.useState("upload"),[i,c]=d.useState(null),[u,x]=d.useState(""),[h,f]=d.useState(""),[p,g]=d.useState("oneclick"),[N,v]=d.useState(""),[y,w]=d.useState(!1),[b,R]=d.useState(!1),[D,S]=d.useState(!1),[P,M]=d.useState(!1),[T,A]=d.useState(null),[F,L]=d.useState(!1),J=d.useRef(null),{toast:U}=Zs(),ue=d.useRef(null),xe=H=>{if(f(H),H.trim()){const se=Om(H);v(se.error)}else v("")},he=d.useCallback(async H=>{const se=Mm[H];R(!0);try{const Ee=await Eg(se.path),Z=zm(Ee);c(Z),g(H),f(se.path),await Tg(se.path),U({title:"加载成功",description:`已从${se.name}预设加载配置`})}catch(Ee){console.error("加载预设配置失败:",Ee),U({title:"加载失败",description:Ee instanceof Error?Ee.message:"无法读取预设配置文件",variant:"destructive"})}finally{R(!1)}},[U]),ne=d.useCallback(async H=>{const se=Om(H);if(!se.valid){v(se.error),U({title:"路径无效",description:se.error,variant:"destructive"});return}v(""),R(!0);try{const Ee=await Eg(H),Z=zm(Ee);c(Z),f(H),await Tg(H),U({title:"加载成功",description:"已从配置文件加载"})}catch(Ee){console.error("加载配置失败:",Ee),U({title:"加载失败",description:Ee instanceof Error?Ee.message:"无法读取配置文件",variant:"destructive"})}finally{R(!1)}},[U]);d.useEffect(()=>{(async()=>{try{const se=await AS();if(se&&se.path){f(se.path);const Ee=Object.entries(Mm).find(([,Z])=>Z.path===se.path);Ee?(n("preset"),g(Ee[0]),await he(Ee[0])):(n("path"),await ne(se.path))}}catch(se){console.error("加载保存的路径失败:",se)}})()},[ne,he]);const ve=d.useCallback(H=>{l!=="path"&&l!=="preset"||!h||(ue.current&&clearTimeout(ue.current),ue.current=setTimeout(async()=>{w(!0);try{const se=Am(H);await Mg(h,se),U({title:"自动保存成功",description:"配置已保存到文件"})}catch(se){console.error("自动保存失败:",se),U({title:"自动保存失败",description:se instanceof Error?se.message:"保存配置失败",variant:"destructive"})}finally{w(!1)}},1e3))},[l,h,U]),je=async()=>{if(!i||!h)return;const H=Om(h);if(!H.valid){U({title:"保存失败",description:H.error,variant:"destructive"});return}w(!0);try{const se=Am(i);await Mg(h,se),U({title:"保存成功",description:"配置已保存到文件"})}catch(se){console.error("保存失败:",se),U({title:"保存失败",description:se instanceof Error?se.message:"保存配置失败",variant:"destructive"})}finally{w(!1)}},z=async()=>{h&&await ne(h)},V=H=>{if(H!==l){if(i){A(H),S(!0);return}B(H)}},B=H=>{c(null),x(""),v(""),n(H),H==="preset"&&he("oneclick"),U({title:"已切换模式",description:{upload:"现在可以上传配置文件",path:"现在可以指定配置文件路径",preset:"现在可以使用预设配置"}[H]})},oe=()=>{T&&(B(T),A(null)),S(!1)},K=()=>{if(i){M(!0);return}_e()},_e=()=>{f(""),c(null),v(""),U({title:"已清空",description:"路径和配置已清空"})},pe=()=>{_e(),M(!1)},ke=H=>{const se=H.target.files?.[0];if(!se)return;const Ee=new FileReader;Ee.onload=Z=>{try{const Oe=Z.target?.result,ns=zm(Oe);c(ns),x(se.name),U({title:"上传成功",description:`已加载配置文件:${se.name}`})}catch(Oe){console.error("解析配置文件失败:",Oe),U({title:"解析失败",description:"配置文件格式错误,请检查文件内容",variant:"destructive"})}},Ee.readAsText(se)},O=()=>{if(!i)return;const H=Am(i),se=new Blob([H],{type:"text/plain;charset=utf-8"}),Ee=URL.createObjectURL(se),Z=document.createElement("a");Z.href=Ee,Z.download=u||"config.toml",document.body.appendChild(Z),Z.click(),document.body.removeChild(Z),URL.revokeObjectURL(Ee),U({title:"下载成功",description:"配置文件已下载,请手动覆盖并重启适配器"})},k=()=>{c(JSON.parse(JSON.stringify(Nt))),x("config.toml"),U({title:"已加载默认配置",description:"可以开始编辑配置"})};return e.jsx(Ye,{className:"h-full",children:e.jsxs("div",{className:"space-y-4 sm:space-y-6 p-4 sm:p-6",children:[e.jsx("div",{className:"flex flex-col sm:flex-row sm:items-center justify-between gap-4",children:e.jsxs("div",{children:[e.jsx("h1",{className:"text-2xl sm:text-3xl font-bold",children:"麦麦适配器配置"}),e.jsx("p",{className:"text-muted-foreground mt-1 sm:mt-2 text-sm sm:text-base",children:"管理麦麦的 QQ 适配器的配置文件"})]})}),e.jsxs("div",{className:"flex items-start gap-2 p-3 rounded-lg border border-amber-500/50 bg-amber-500/10 text-amber-700 dark:text-amber-400",children:[e.jsx(wt,{className:"h-4 w-4 mt-0.5 flex-shrink-0"}),e.jsx("p",{className:"text-sm",children:"适配器配置保存之后使用 WebUI 的重启功能适配器并不会重启,需要手动重启适配器。"})]}),e.jsx(nc,{open:F,onOpenChange:L,children:e.jsxs(Ce,{children:[e.jsx(De,{children:e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsxs("div",{children:[e.jsx(Le,{children:"工作模式"}),e.jsx(ws,{children:"选择配置文件的管理方式"})]}),e.jsx(rc,{asChild:!0,children:e.jsxs(_,{variant:"ghost",size:"sm",className:"w-9 p-0",children:[e.jsx(Ma,{className:`h-4 w-4 transition-transform duration-200 ${F?"transform rotate-180":""}`}),e.jsx("span",{className:"sr-only",children:"切换"})]})})]})}),e.jsx(ic,{children:e.jsxs(Ae,{className:"space-y-4",children:[e.jsxs("div",{className:"grid grid-cols-1 md:grid-cols-3 gap-3 md:gap-4",children:[e.jsx("div",{className:`border-2 rounded-lg p-3 md:p-4 cursor-pointer transition-all ${l==="preset"?"border-primary bg-primary/5":"border-muted hover:border-primary/50 active:border-primary/70"}`,onClick:()=>V("preset"),children:e.jsxs("div",{className:"flex items-start gap-2 md:gap-3",children:[e.jsx(ra,{className:"h-4 w-4 md:h-5 md:w-5 mt-0.5 flex-shrink-0"}),e.jsxs("div",{className:"min-w-0",children:[e.jsx("h3",{className:"font-semibold text-sm md:text-base",children:"预设模式"}),e.jsx("p",{className:"text-xs md:text-sm text-muted-foreground mt-1 line-clamp-2",children:"使用预设的部署配置"})]})]})}),e.jsx("div",{className:`border-2 rounded-lg p-3 md:p-4 cursor-pointer transition-all ${l==="upload"?"border-primary bg-primary/5":"border-muted hover:border-primary/50 active:border-primary/70"}`,onClick:()=>V("upload"),children:e.jsxs("div",{className:"flex items-start gap-2 md:gap-3",children:[e.jsx(ec,{className:"h-4 w-4 md:h-5 md:w-5 mt-0.5 flex-shrink-0"}),e.jsxs("div",{className:"min-w-0",children:[e.jsx("h3",{className:"font-semibold text-sm md:text-base",children:"上传文件模式"}),e.jsx("p",{className:"text-xs md:text-sm text-muted-foreground mt-1 line-clamp-2",children:"上传配置文件,编辑后下载并手动覆盖"})]})]})}),e.jsx("div",{className:`border-2 rounded-lg p-3 md:p-4 cursor-pointer transition-all ${l==="path"?"border-primary bg-primary/5":"border-muted hover:border-primary/50 active:border-primary/70"}`,onClick:()=>V("path"),children:e.jsxs("div",{className:"flex items-start gap-2 md:gap-3",children:[e.jsx(s_,{className:"h-4 w-4 md:h-5 md:w-5 mt-0.5 flex-shrink-0"}),e.jsxs("div",{className:"min-w-0",children:[e.jsx("h3",{className:"font-semibold text-sm md:text-base",children:"指定路径模式"}),e.jsx("p",{className:"text-xs md:text-sm text-muted-foreground mt-1 line-clamp-2",children:"指定配置文件路径,自动加载和保存"})]})]})})]}),l==="preset"&&e.jsxs("div",{className:"space-y-3 pt-2 border-t",children:[e.jsx(E,{className:"text-sm md:text-base",children:"选择部署方式"}),e.jsx("div",{className:"grid grid-cols-1 sm:grid-cols-2 gap-3",children:Object.entries(Mm).map(([H,se])=>{const Ee=se.icon,Z=p===H;return e.jsx("div",{className:`border-2 rounded-lg p-3 cursor-pointer transition-all ${Z?"border-primary bg-primary/5":"border-muted hover:border-primary/50"}`,onClick:()=>{g(H),he(H)},children:e.jsxs("div",{className:"flex items-start gap-3",children:[e.jsx(Ee,{className:"h-5 w-5 mt-0.5 flex-shrink-0"}),e.jsxs("div",{className:"min-w-0 flex-1",children:[e.jsx("h4",{className:"font-semibold text-sm",children:se.name}),e.jsx("p",{className:"text-xs text-muted-foreground mt-1",children:se.description}),e.jsx("p",{className:"text-xs text-muted-foreground mt-1 font-mono break-all",children:se.path})]})]})},H)})})]}),l==="path"&&e.jsxs("div",{className:"space-y-3 pt-2 border-t",children:[e.jsxs("div",{className:"space-y-2",children:[e.jsx(E,{htmlFor:"config-path",className:"text-sm md:text-base",children:"配置文件路径"}),e.jsxs("div",{className:"flex flex-col sm:flex-row gap-2",children:[e.jsxs("div",{className:"flex-1 space-y-1",children:[e.jsx(le,{id:"config-path",value:h,onChange:H=>xe(H.target.value),placeholder:"例: C:\\Adapter\\config.toml",className:`text-sm ${N?"border-destructive":""}`}),N&&e.jsx("p",{className:"text-xs text-destructive",children:N})]}),e.jsx(_,{onClick:()=>ne(h),disabled:b||!h||!!N,className:"w-full sm:w-auto",children:b?e.jsxs(e.Fragment,{children:[e.jsx(dt,{className:"h-4 w-4 animate-spin mr-2"}),e.jsx("span",{className:"sm:hidden",children:"加载中..."})]}):e.jsxs(e.Fragment,{children:[e.jsx("span",{className:"sm:hidden",children:"加载配置"}),e.jsx("span",{className:"hidden sm:inline",children:"加载"})]})})]})]}),e.jsxs("details",{className:"rounded-lg bg-muted/50 p-3 group",children:[e.jsxs("summary",{className:"text-xs font-medium cursor-pointer select-none list-none flex items-center justify-between",children:[e.jsx("span",{children:"路径格式说明"}),e.jsx("svg",{className:"h-4 w-4 transition-transform group-open:rotate-180",fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",children:e.jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M19 9l-7 7-7-7"})})]}),e.jsxs("div",{className:"mt-2 space-y-2 text-xs text-muted-foreground",children:[e.jsxs("div",{className:"space-y-1",children:[e.jsx("div",{className:"flex items-center gap-2",children:e.jsx("span",{className:"font-mono bg-background px-1.5 py-0.5 rounded text-[10px] md:text-xs whitespace-nowrap",children:"Windows"})}),e.jsxs("div",{className:"pl-2 space-y-0.5 text-[10px] md:text-xs break-all",children:[e.jsx("div",{children:"C:\\Adapter\\config.toml"}),e.jsx("div",{className:"hidden sm:block",children:"D:\\MaiBot\\adapter\\config.toml"}),e.jsx("div",{className:"hidden sm:block",children:"\\\\server\\share\\config.toml"})]})]}),e.jsxs("div",{className:"space-y-1",children:[e.jsx("div",{className:"flex items-center gap-2",children:e.jsx("span",{className:"font-mono bg-background px-1.5 py-0.5 rounded text-[10px] md:text-xs whitespace-nowrap",children:"Linux"})}),e.jsxs("div",{className:"pl-2 space-y-0.5 text-[10px] md:text-xs break-all",children:[e.jsx("div",{children:"/opt/adapter/config.toml"}),e.jsx("div",{className:"hidden sm:block",children:"/home/user/adapter/config.toml"}),e.jsx("div",{className:"hidden sm:block",children:"~/adapter/config.toml"})]})]}),e.jsx("p",{className:"pt-1 border-t text-[10px] md:text-xs",children:"💡 配置会自动保存到指定文件,修改后 1 秒自动保存"})]})]})]})]})})]})}),e.jsxs(at,{children:[e.jsx(Ht,{className:"h-4 w-4"}),e.jsx(lt,{children:l==="preset"?e.jsxs(e.Fragment,{children:[e.jsx("strong",{children:"预设模式:"}),"选择预设的部署方式,配置会自动加载,修改后 1 秒自动保存",y&&" (正在保存...)"]}):l==="upload"?e.jsxs(e.Fragment,{children:[e.jsx("strong",{children:"上传文件模式:"}),"上传配置文件 → 在线编辑 → 下载文件 → 手动覆盖并重启适配器"]}):e.jsxs(e.Fragment,{children:[e.jsx("strong",{children:"指定路径模式:"}),"指定配置文件路径后,配置会自动加载,修改后 1 秒自动保存",y&&" (正在保存...)"]})})]}),l==="upload"&&!i&&e.jsxs("div",{className:"flex flex-col sm:flex-row gap-2 w-full",children:[e.jsx("input",{ref:J,type:"file",accept:".toml",className:"hidden",onChange:ke}),e.jsxs(_,{onClick:()=>J.current?.click(),size:"sm",variant:"outline",className:"w-full sm:w-auto",children:[e.jsx(ec,{className:"mr-2 h-4 w-4"}),"上传配置"]}),e.jsxs(_,{onClick:k,size:"sm",className:"w-full sm:w-auto",children:[e.jsx(ka,{className:"mr-2 h-4 w-4"}),"使用默认配置"]})]}),l==="upload"&&i&&e.jsx("div",{className:"flex gap-2",children:e.jsxs(_,{onClick:O,size:"sm",className:"w-full sm:w-auto",children:[e.jsx(sa,{className:"mr-2 h-4 w-4"}),"下载配置"]})}),(l==="preset"||l==="path")&&i&&e.jsxs("div",{className:"flex flex-col sm:flex-row gap-2",children:[e.jsxs(_,{onClick:je,size:"sm",disabled:y||!!N,className:"w-full sm:w-auto",children:[e.jsx(oc,{className:"mr-2 h-4 w-4"}),y?"保存中...":"立即保存"]}),e.jsxs(_,{onClick:z,size:"sm",variant:"outline",disabled:b,className:"w-full sm:w-auto",children:[e.jsx(dt,{className:`mr-2 h-4 w-4 ${b?"animate-spin":""}`}),"刷新"]}),l==="path"&&e.jsxs(_,{onClick:K,size:"sm",variant:"destructive",className:"w-full sm:w-auto",children:[e.jsx(ls,{className:"mr-2 h-4 w-4"}),"清空路径"]})]}),i?e.jsxs(ta,{defaultValue:"napcat",className:"w-full",children:[e.jsx("div",{className:"overflow-x-auto -mx-4 px-4 sm:mx-0 sm:px-0",children:e.jsxs(Xt,{className:"inline-flex w-auto min-w-full sm:grid sm:w-full sm:grid-cols-5",children:[e.jsxs(Je,{value:"napcat",className:"flex-shrink-0 text-xs sm:text-sm whitespace-nowrap",children:[e.jsx("span",{className:"hidden sm:inline",children:"Napcat 连接"}),e.jsx("span",{className:"sm:hidden",children:"Napcat"})]}),e.jsxs(Je,{value:"maibot",className:"flex-shrink-0 text-xs sm:text-sm whitespace-nowrap",children:[e.jsx("span",{className:"hidden sm:inline",children:"麦麦连接"}),e.jsx("span",{className:"sm:hidden",children:"麦麦"})]}),e.jsxs(Je,{value:"chat",className:"flex-shrink-0 text-xs sm:text-sm whitespace-nowrap",children:[e.jsx("span",{className:"hidden sm:inline",children:"聊天控制"}),e.jsx("span",{className:"sm:hidden",children:"聊天"})]}),e.jsxs(Je,{value:"voice",className:"flex-shrink-0 text-xs sm:text-sm whitespace-nowrap",children:[e.jsx("span",{className:"hidden sm:inline",children:"语音设置"}),e.jsx("span",{className:"sm:hidden",children:"语音"})]}),e.jsx(Je,{value:"debug",className:"flex-shrink-0 text-xs sm:text-sm whitespace-nowrap",children:"调试"})]})}),e.jsx(ys,{value:"napcat",className:"space-y-4",children:e.jsx(WS,{config:i,onChange:H=>{c(H),ve(H)}})}),e.jsx(ys,{value:"maibot",className:"space-y-4",children:e.jsx(e4,{config:i,onChange:H=>{c(H),ve(H)}})}),e.jsx(ys,{value:"chat",className:"space-y-4",children:e.jsx(s4,{config:i,onChange:H=>{c(H),ve(H)}})}),e.jsx(ys,{value:"voice",className:"space-y-4",children:e.jsx(t4,{config:i,onChange:H=>{c(H),ve(H)}})}),e.jsx(ys,{value:"debug",className:"space-y-4",children:e.jsx(a4,{config:i,onChange:H=>{c(H),ve(H)}})})]}):e.jsx("div",{className:"rounded-lg border bg-card p-6 md:p-12",children:e.jsxs("div",{className:"text-center space-y-3 md:space-y-4",children:[e.jsx(ka,{className:"h-12 w-12 md:h-16 md:w-16 mx-auto text-muted-foreground"}),e.jsxs("div",{children:[e.jsx("h3",{className:"text-base md:text-lg font-semibold",children:"尚未加载配置"}),e.jsx("p",{className:"text-xs md:text-sm text-muted-foreground mt-2 px-4",children:l==="preset"?"请选择预设的部署方式":l==="upload"?"请上传现有配置文件,或使用默认配置开始编辑":"请指定配置文件路径并点击加载按钮"})]})]})}),e.jsx(vs,{open:D,onOpenChange:S,children:e.jsxs(ds,{children:[e.jsxs(us,{children:[e.jsx(xs,{children:"确认切换模式"}),e.jsxs(hs,{children:["切换模式将清空当前配置,确定要继续吗?",e.jsx("br",{}),e.jsx("span",{className:"text-destructive font-medium",children:"请确保已保存重要配置"})]})]}),e.jsxs(ms,{children:[e.jsx(ps,{onClick:()=>{S(!1),A(null)},children:"取消"}),e.jsx(fs,{onClick:oe,children:"确认切换"})]})]})}),e.jsx(vs,{open:P,onOpenChange:M,children:e.jsxs(ds,{children:[e.jsxs(us,{children:[e.jsx(xs,{children:"确认清空路径"}),e.jsxs(hs,{children:["清空路径将清除当前配置,确定要继续吗?",e.jsx("br",{}),e.jsx("span",{className:"text-muted-foreground text-sm",children:"此操作不会删除配置文件,只是清除界面中的配置"})]})]}),e.jsxs(ms,{children:[e.jsx(ps,{onClick:()=>M(!1),children:"取消"}),e.jsx(fs,{onClick:pe,className:"bg-destructive hover:bg-destructive/90",children:"确认清空"})]})]})})]})})}function WS({config:l,onChange:n}){return e.jsx("div",{className:"rounded-lg border bg-card p-4 md:p-6 space-y-4 md:space-y-6",children:e.jsxs("div",{children:[e.jsx("h3",{className:"text-base md:text-lg font-semibold mb-3 md:mb-4",children:"Napcat WebSocket 服务设置"}),e.jsxs("div",{className:"grid gap-3 md:gap-4",children:[e.jsxs("div",{className:"grid gap-2",children:[e.jsx(E,{htmlFor:"napcat-host",className:"text-sm md:text-base",children:"主机地址"}),e.jsx(le,{id:"napcat-host",value:l.napcat_server.host,onChange:i=>n({...l,napcat_server:{...l.napcat_server,host:i.target.value}}),placeholder:"localhost",className:"text-sm md:text-base"}),e.jsx("p",{className:"text-xs text-muted-foreground",children:"Napcat 设定的主机地址"})]}),e.jsxs("div",{className:"grid gap-2",children:[e.jsx(E,{htmlFor:"napcat-port",className:"text-sm md:text-base",children:"端口"}),e.jsx(le,{id:"napcat-port",type:"number",value:l.napcat_server.port||"",onChange:i=>n({...l,napcat_server:{...l.napcat_server,port:i.target.value?parseInt(i.target.value):0}}),placeholder:"8095",className:"text-sm md:text-base"}),e.jsx("p",{className:"text-xs text-muted-foreground",children:"Napcat 设定的端口(留空使用默认值 8095)"})]}),e.jsxs("div",{className:"grid gap-2",children:[e.jsx(E,{htmlFor:"napcat-token",className:"text-sm md:text-base",children:"访问令牌(Token)"}),e.jsx(le,{id:"napcat-token",type:"password",value:l.napcat_server.token,onChange:i=>n({...l,napcat_server:{...l.napcat_server,token:i.target.value}}),placeholder:"留空表示无需令牌",className:"text-sm md:text-base"}),e.jsx("p",{className:"text-xs text-muted-foreground",children:"Napcat 设定的访问令牌,若无则留空"})]}),e.jsxs("div",{className:"grid gap-2",children:[e.jsx(E,{htmlFor:"napcat-heartbeat",className:"text-sm md:text-base",children:"心跳间隔(秒)"}),e.jsx(le,{id:"napcat-heartbeat",type:"number",value:l.napcat_server.heartbeat_interval||"",onChange:i=>n({...l,napcat_server:{...l.napcat_server,heartbeat_interval:i.target.value?parseInt(i.target.value):0}}),placeholder:"30",className:"text-sm md:text-base"}),e.jsx("p",{className:"text-xs text-muted-foreground",children:"与 Napcat 设置的心跳间隔保持一致(留空使用默认值 30)"})]})]})]})})}function e4({config:l,onChange:n}){return e.jsx("div",{className:"rounded-lg border bg-card p-4 md:p-6 space-y-4 md:space-y-6",children:e.jsxs("div",{children:[e.jsx("h3",{className:"text-base md:text-lg font-semibold mb-3 md:mb-4",children:"麦麦 WebSocket 服务设置"}),e.jsxs("div",{className:"grid gap-3 md:gap-4",children:[e.jsxs("div",{className:"grid gap-2",children:[e.jsx(E,{htmlFor:"maibot-host",className:"text-sm md:text-base",children:"主机地址"}),e.jsx(le,{id:"maibot-host",value:l.maibot_server.host,onChange:i=>n({...l,maibot_server:{...l.maibot_server,host:i.target.value}}),placeholder:"localhost",className:"text-sm md:text-base"}),e.jsx("p",{className:"text-xs text-muted-foreground",children:"麦麦在 .env 文件中设置的 HOST 字段"})]}),e.jsxs("div",{className:"grid gap-2",children:[e.jsx(E,{htmlFor:"maibot-port",className:"text-sm md:text-base",children:"端口"}),e.jsx(le,{id:"maibot-port",type:"number",value:l.maibot_server.port||"",onChange:i=>n({...l,maibot_server:{...l.maibot_server,port:i.target.value?parseInt(i.target.value):0}}),placeholder:"8000",className:"text-sm md:text-base"}),e.jsx("p",{className:"text-xs text-muted-foreground",children:"麦麦在 .env 文件中设置的 PORT 字段(留空使用默认值 8000)"})]})]})]})})}function s4({config:l,onChange:n}){const i=x=>{const h={...l};x==="group"?h.chat.group_list=[...h.chat.group_list,0]:x==="private"?h.chat.private_list=[...h.chat.private_list,0]:h.chat.ban_user_id=[...h.chat.ban_user_id,0],n(h)},c=(x,h)=>{const f={...l};x==="group"?f.chat.group_list=f.chat.group_list.filter((p,g)=>g!==h):x==="private"?f.chat.private_list=f.chat.private_list.filter((p,g)=>g!==h):f.chat.ban_user_id=f.chat.ban_user_id.filter((p,g)=>g!==h),n(f)},u=(x,h,f)=>{const p={...l};x==="group"?p.chat.group_list[h]=f:x==="private"?p.chat.private_list[h]=f:p.chat.ban_user_id[h]=f,n(p)};return e.jsx("div",{className:"rounded-lg border bg-card p-4 md:p-6 space-y-4 md:space-y-6",children:e.jsxs("div",{children:[e.jsx("h3",{className:"text-base md:text-lg font-semibold mb-3 md:mb-4",children:"聊天黑白名单功能"}),e.jsxs("div",{className:"grid gap-4 md:gap-6",children:[e.jsxs("div",{className:"space-y-3 md:space-y-4",children:[e.jsxs("div",{className:"grid gap-2",children:[e.jsx(E,{className:"text-sm md:text-base",children:"群组名单类型"}),e.jsxs(Ie,{value:l.chat.group_list_type,onValueChange:x=>n({...l,chat:{...l.chat,group_list_type:x}}),children:[e.jsx($e,{children:e.jsx(Pe,{})}),e.jsxs(Be,{children:[e.jsx(X,{value:"whitelist",children:"白名单(仅名单内可聊天)"}),e.jsx(X,{value:"blacklist",children:"黑名单(名单内禁止聊天)"})]})]})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsxs("div",{className:"flex flex-col sm:flex-row sm:items-center sm:justify-between gap-2 sm:gap-0",children:[e.jsx(E,{className:"text-sm md:text-base",children:"群组列表"}),e.jsxs(_,{onClick:()=>i("group"),size:"sm",variant:"outline",className:"w-full sm:w-auto",children:[e.jsx(ka,{className:"mr-1 h-4 w-4"}),"添加群号"]})]}),l.chat.group_list.map((x,h)=>e.jsxs("div",{className:"flex gap-2",children:[e.jsx(le,{type:"number",value:x,onChange:f=>u("group",h,parseInt(f.target.value)||0),placeholder:"输入群号",className:"text-sm md:text-base"}),e.jsxs(vs,{children:[e.jsx(yt,{asChild:!0,children:e.jsx(_,{size:"icon",variant:"outline",children:e.jsx(ls,{className:"h-4 w-4"})})}),e.jsxs(ds,{children:[e.jsxs(us,{children:[e.jsx(xs,{children:"确认删除"}),e.jsxs(hs,{children:["确定要删除群号 ",x," 吗?此操作无法撤销。"]})]}),e.jsxs(ms,{children:[e.jsx(ps,{children:"取消"}),e.jsx(fs,{onClick:()=>c("group",h),children:"删除"})]})]})]})]},h)),l.chat.group_list.length===0&&e.jsx("p",{className:"text-sm text-muted-foreground",children:"暂无群组"})]})]}),e.jsxs("div",{className:"space-y-3 md:space-y-4",children:[e.jsxs("div",{className:"grid gap-2",children:[e.jsx(E,{className:"text-sm md:text-base",children:"私聊名单类型"}),e.jsxs(Ie,{value:l.chat.private_list_type,onValueChange:x=>n({...l,chat:{...l.chat,private_list_type:x}}),children:[e.jsx($e,{children:e.jsx(Pe,{})}),e.jsxs(Be,{children:[e.jsx(X,{value:"whitelist",children:"白名单(仅名单内可聊天)"}),e.jsx(X,{value:"blacklist",children:"黑名单(名单内禁止聊天)"})]})]})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsxs("div",{className:"flex flex-col sm:flex-row sm:items-center sm:justify-between gap-2 sm:gap-0",children:[e.jsx(E,{className:"text-sm md:text-base",children:"私聊列表"}),e.jsxs(_,{onClick:()=>i("private"),size:"sm",variant:"outline",className:"w-full sm:w-auto",children:[e.jsx(ka,{className:"mr-1 h-4 w-4"}),"添加用户"]})]}),l.chat.private_list.map((x,h)=>e.jsxs("div",{className:"flex gap-2",children:[e.jsx(le,{type:"number",value:x,onChange:f=>u("private",h,parseInt(f.target.value)||0),placeholder:"输入QQ号",className:"text-sm md:text-base"}),e.jsxs(vs,{children:[e.jsx(yt,{asChild:!0,children:e.jsx(_,{size:"icon",variant:"outline",children:e.jsx(ls,{className:"h-4 w-4"})})}),e.jsxs(ds,{children:[e.jsxs(us,{children:[e.jsx(xs,{children:"确认删除"}),e.jsxs(hs,{children:["确定要删除用户 ",x," 吗?此操作无法撤销。"]})]}),e.jsxs(ms,{children:[e.jsx(ps,{children:"取消"}),e.jsx(fs,{onClick:()=>c("private",h),children:"删除"})]})]})]})]},h)),l.chat.private_list.length===0&&e.jsx("p",{className:"text-sm text-muted-foreground",children:"暂无用户"})]})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsxs("div",{className:"flex flex-col sm:flex-row sm:items-center sm:justify-between gap-2 sm:gap-0",children:[e.jsxs("div",{children:[e.jsx(E,{className:"text-sm md:text-base",children:"全局禁止名单"}),e.jsx("p",{className:"text-xs text-muted-foreground mt-1",children:"名单中的用户无法进行任何聊天"})]}),e.jsxs(_,{onClick:()=>i("ban"),size:"sm",variant:"outline",className:"w-full sm:w-auto",children:[e.jsx(ka,{className:"mr-1 h-4 w-4"}),"添加用户"]})]}),l.chat.ban_user_id.map((x,h)=>e.jsxs("div",{className:"flex gap-2",children:[e.jsx(le,{type:"number",value:x,onChange:f=>u("ban",h,parseInt(f.target.value)||0),placeholder:"输入QQ号",className:"text-sm md:text-base"}),e.jsxs(vs,{children:[e.jsx(yt,{asChild:!0,children:e.jsx(_,{size:"icon",variant:"outline",children:e.jsx(ls,{className:"h-4 w-4"})})}),e.jsxs(ds,{children:[e.jsxs(us,{children:[e.jsx(xs,{children:"确认删除"}),e.jsxs(hs,{children:["确定要从全局禁止名单中删除用户 ",x," 吗?此操作无法撤销。"]})]}),e.jsxs(ms,{children:[e.jsx(ps,{children:"取消"}),e.jsx(fs,{onClick:()=>c("ban",h),children:"删除"})]})]})]})]},h)),l.chat.ban_user_id.length===0&&e.jsx("p",{className:"text-sm text-muted-foreground",children:"暂无禁止用户"})]}),e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsxs("div",{children:[e.jsx(E,{className:"text-sm md:text-base",children:"屏蔽QQ官方机器人"}),e.jsx("p",{className:"text-xs text-muted-foreground mt-1",children:"是否屏蔽来自QQ官方机器人的消息"})]}),e.jsx(Fe,{checked:l.chat.ban_qq_bot,onCheckedChange:x=>n({...l,chat:{...l.chat,ban_qq_bot:x}})})]}),e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsxs("div",{children:[e.jsx(E,{className:"text-sm md:text-base",children:"启用戳一戳功能"}),e.jsx("p",{className:"text-xs text-muted-foreground mt-1",children:"是否响应戳一戳消息"})]}),e.jsx(Fe,{checked:l.chat.enable_poke,onCheckedChange:x=>n({...l,chat:{...l.chat,enable_poke:x}})})]})]})]})})}function t4({config:l,onChange:n}){return e.jsx("div",{className:"rounded-lg border bg-card p-4 md:p-6 space-y-4 md:space-y-6",children:e.jsxs("div",{children:[e.jsx("h3",{className:"text-base md:text-lg font-semibold mb-3 md:mb-4",children:"发送语音设置"}),e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsxs("div",{children:[e.jsx(E,{className:"text-sm md:text-base",children:"使用 TTS 语音"}),e.jsx("p",{className:"text-xs text-muted-foreground mt-1",children:"请确保已配置 TTS 并有对应的适配器"})]}),e.jsx(Fe,{checked:l.voice.use_tts,onCheckedChange:i=>n({...l,voice:{use_tts:i}})})]})]})})}function a4({config:l,onChange:n}){return e.jsx("div",{className:"rounded-lg border bg-card p-4 md:p-6 space-y-4 md:space-y-6",children:e.jsxs("div",{children:[e.jsx("h3",{className:"text-base md:text-lg font-semibold mb-3 md:mb-4",children:"调试设置"}),e.jsx("div",{className:"grid gap-3 md:gap-4",children:e.jsxs("div",{className:"grid gap-2",children:[e.jsx(E,{className:"text-sm md:text-base",children:"日志等级"}),e.jsxs(Ie,{value:l.debug.level,onValueChange:i=>n({...l,debug:{level:i}}),children:[e.jsx($e,{children:e.jsx(Pe,{})}),e.jsxs(Be,{children:[e.jsx(X,{value:"DEBUG",children:"DEBUG(调试)"}),e.jsx(X,{value:"INFO",children:"INFO(信息)"}),e.jsx(X,{value:"WARNING",children:"WARNING(警告)"}),e.jsx(X,{value:"ERROR",children:"ERROR(错误)"}),e.jsx(X,{value:"CRITICAL",children:"CRITICAL(严重)"})]})]}),e.jsx("p",{className:"text-xs text-muted-foreground",children:"设置适配器的日志输出等级"})]})})]})})}const l4=["defaultChecked","defaultValue","suppressContentEditableWarning","suppressHydrationWarning","dangerouslySetInnerHTML","accessKey","className","contentEditable","contextMenu","dir","draggable","hidden","id","lang","placeholder","slot","spellCheck","style","tabIndex","title","translate","radioGroup","role","about","datatype","inlist","prefix","property","resource","typeof","vocab","autoCapitalize","autoCorrect","autoSave","color","itemProp","itemScope","itemType","itemID","itemRef","results","security","unselectable","inputMode","is","onCopy","onCopyCapture","onCut","onCutCapture","onPaste","onPasteCapture","onCompositionEnd","onCompositionEndCapture","onCompositionStart","onCompositionStartCapture","onCompositionUpdate","onCompositionUpdateCapture","onFocus","onFocusCapture","onBlur","onBlurCapture","onChange","onChangeCapture","onBeforeInput","onBeforeInputCapture","onInput","onInputCapture","onReset","onResetCapture","onSubmit","onSubmitCapture","onInvalid","onInvalidCapture","onLoad","onLoadCapture","onError","onErrorCapture","onKeyDown","onKeyDownCapture","onKeyPress","onKeyPressCapture","onKeyUp","onKeyUpCapture","onAbort","onAbortCapture","onCanPlay","onCanPlayCapture","onCanPlayThrough","onCanPlayThroughCapture","onDurationChange","onDurationChangeCapture","onEmptied","onEmptiedCapture","onEncrypted","onEncryptedCapture","onEnded","onEndedCapture","onLoadedData","onLoadedDataCapture","onLoadedMetadata","onLoadedMetadataCapture","onLoadStart","onLoadStartCapture","onPause","onPauseCapture","onPlay","onPlayCapture","onPlaying","onPlayingCapture","onProgress","onProgressCapture","onRateChange","onRateChangeCapture","onSeeked","onSeekedCapture","onSeeking","onSeekingCapture","onStalled","onStalledCapture","onSuspend","onSuspendCapture","onTimeUpdate","onTimeUpdateCapture","onVolumeChange","onVolumeChangeCapture","onWaiting","onWaitingCapture","onAuxClick","onAuxClickCapture","onClick","onClickCapture","onContextMenu","onContextMenuCapture","onDoubleClick","onDoubleClickCapture","onDrag","onDragCapture","onDragEnd","onDragEndCapture","onDragEnter","onDragEnterCapture","onDragExit","onDragExitCapture","onDragLeave","onDragLeaveCapture","onDragOver","onDragOverCapture","onDragStart","onDragStartCapture","onDrop","onDropCapture","onMouseDown","onMouseDownCapture","onMouseEnter","onMouseLeave","onMouseMove","onMouseMoveCapture","onMouseOut","onMouseOutCapture","onMouseOver","onMouseOverCapture","onMouseUp","onMouseUpCapture","onSelect","onSelectCapture","onTouchCancel","onTouchCancelCapture","onTouchEnd","onTouchEndCapture","onTouchMove","onTouchMoveCapture","onTouchStart","onTouchStartCapture","onPointerDown","onPointerDownCapture","onPointerMove","onPointerMoveCapture","onPointerUp","onPointerUpCapture","onPointerCancel","onPointerCancelCapture","onPointerEnter","onPointerEnterCapture","onPointerLeave","onPointerLeaveCapture","onPointerOver","onPointerOverCapture","onPointerOut","onPointerOutCapture","onGotPointerCapture","onGotPointerCaptureCapture","onLostPointerCapture","onLostPointerCaptureCapture","onScroll","onScrollCapture","onWheel","onWheelCapture","onAnimationStart","onAnimationStartCapture","onAnimationEnd","onAnimationEndCapture","onAnimationIteration","onAnimationIterationCapture","onTransitionEnd","onTransitionEndCapture"],n4=/^(aria-|data-)/,Mv=l=>Object.fromEntries(Object.entries(l).filter(([n])=>n4.test(n)||l4.includes(n)));function r4(l,n){const i=Mv(l);return Object.keys(l).some(c=>!Object.hasOwn(i,c)&&l[c]!==n[c])}class i4 extends d.Component{container;plugin;componentDidMount(){this.installPlugin()}componentDidUpdate(n){if(n.uppy!==this.props.uppy)this.uninstallPlugin(n),this.installPlugin();else if(r4(this.props,n)){const{uppy:i,...c}={...this.props,target:this.container};this.plugin.setOptions(c)}}componentWillUnmount(){this.uninstallPlugin()}installPlugin(){const{uppy:n,...i}={id:"Dashboard",...this.props,inline:!0,target:this.container};n.use(L_,i),this.plugin=n.getPlugin(i.id)}uninstallPlugin(n=this.props){const{uppy:i}=n;i.removePlugin(this.plugin)}render(){return d.createElement("div",{className:"uppy-Container",ref:n=>{this.container=n},...Mv(this.props)})}}function c4({src:l,alt:n="表情包",className:i,maxRetries:c=5,retryInterval:u=1500}){const[x,h]=d.useState("loading"),[f,p]=d.useState(0),[g,N]=d.useState(null),[v,y]=d.useState(l);l!==v&&(h("loading"),p(0),N(null),y(l));const w=d.useCallback(async()=>{try{const b=await fetch(l,{credentials:"include"});if(b.status===202){h("generating"),f{p(S=>S+1)},u):h("error");return}if(!b.ok){h("error");return}const R=await b.blob(),D=URL.createObjectURL(R);N(D),h("loaded")}catch(b){console.error("加载缩略图失败:",b),h("error")}},[l,f,c,u]);return d.useEffect(()=>{w()},[w]),d.useEffect(()=>()=>{g&&URL.revokeObjectURL(g)},[g]),x==="loading"||x==="generating"?e.jsx(js,{className:I("w-full h-full",i)}):x==="error"||!g?e.jsx("div",{className:I("w-full h-full flex items-center justify-center bg-muted",i),children:e.jsx(Jm,{className:"h-8 w-8 text-muted-foreground"})}):e.jsx("img",{src:g,alt:n,className:I("w-full h-full object-contain",i)})}function o4({children:l,className:n}){return e.jsx(tx,{content:l,className:n})}const qa="/api/webui/emoji";async function d4(l){const n=new URLSearchParams;l.page&&n.append("page",l.page.toString()),l.page_size&&n.append("page_size",l.page_size.toString()),l.search&&n.append("search",l.search),l.is_registered!==void 0&&n.append("is_registered",l.is_registered.toString()),l.is_banned!==void 0&&n.append("is_banned",l.is_banned.toString()),l.format&&n.append("format",l.format),l.sort_by&&n.append("sort_by",l.sort_by),l.sort_order&&n.append("sort_order",l.sort_order);const i=await we(`${qa}/list?${n}`,{});if(!i.ok)throw new Error(`获取表情包列表失败: ${i.statusText}`);return i.json()}async function u4(l){const n=await we(`${qa}/${l}`,{});if(!n.ok)throw new Error(`获取表情包详情失败: ${n.statusText}`);return n.json()}async function m4(l,n){const i=await we(`${qa}/${l}`,{method:"PATCH",body:JSON.stringify(n)});if(!i.ok)throw new Error(`更新表情包失败: ${i.statusText}`);return i.json()}async function x4(l){const n=await we(`${qa}/${l}`,{method:"DELETE"});if(!n.ok)throw new Error(`删除表情包失败: ${n.statusText}`);return n.json()}async function h4(){const l=await we(`${qa}/stats/summary`,{});if(!l.ok)throw new Error(`获取统计数据失败: ${l.statusText}`);return l.json()}async function f4(l){const n=await we(`${qa}/${l}/register`,{method:"POST"});if(!n.ok)throw new Error(`注册表情包失败: ${n.statusText}`);return n.json()}async function p4(l){const n=await we(`${qa}/${l}/ban`,{method:"POST"});if(!n.ok)throw new Error(`封禁表情包失败: ${n.statusText}`);return n.json()}function g4(l,n=!1){return n?`${qa}/${l}/thumbnail?original=true`:`${qa}/${l}/thumbnail`}function j4(l){return`${qa}/${l}/thumbnail?original=true`}async function v4(l){const n=await we(`${qa}/batch/delete`,{method:"POST",body:JSON.stringify({emoji_ids:l})});if(!n.ok){const i=await n.json();throw new Error(i.detail||"批量删除失败")}return n.json()}function N4(){return`${qa}/upload`}function b4(){const[l,n]=d.useState([]),[i,c]=d.useState(null),[u,x]=d.useState(!1),[h,f]=d.useState(1),[p,g]=d.useState(0),[N,v]=d.useState(20),[y,w]=d.useState("all"),[b,R]=d.useState("all"),[D,S]=d.useState("all"),[P,M]=d.useState("usage_count"),[T,A]=d.useState("desc"),[F,L]=d.useState(null),[J,U]=d.useState(!1),[ue,xe]=d.useState(!1),[he,ne]=d.useState(!1),[ve,je]=d.useState(new Set),[z,V]=d.useState(!1),[B,oe]=d.useState(""),[K,_e]=d.useState("medium"),[pe,ke]=d.useState(!1),{toast:O}=Zs(),k=d.useCallback(async()=>{try{x(!0);const de=await d4({page:h,page_size:N,is_registered:y==="all"?void 0:y==="registered",is_banned:b==="all"?void 0:b==="banned",format:D==="all"?void 0:D,sort_by:P,sort_order:T});n(de.data),g(de.total)}catch(de){const Me=de instanceof Error?de.message:"加载表情包列表失败";O({title:"错误",description:Me,variant:"destructive"})}finally{x(!1)}},[h,N,y,b,D,P,T,O]),H=async()=>{try{const de=await h4();c(de.data)}catch(de){console.error("加载统计数据失败:",de)}};d.useEffect(()=>{k()},[k]),d.useEffect(()=>{H()},[]);const se=async de=>{try{const Me=await u4(de.id);L(Me.data),U(!0)}catch(Me){const rs=Me instanceof Error?Me.message:"加载详情失败";O({title:"错误",description:rs,variant:"destructive"})}},Ee=de=>{L(de),xe(!0)},Z=de=>{L(de),ne(!0)},Oe=async()=>{if(F)try{await x4(F.id),O({title:"成功",description:"表情包已删除"}),ne(!1),L(null),k(),H()}catch(de){const Me=de instanceof Error?de.message:"删除失败";O({title:"错误",description:Me,variant:"destructive"})}},ns=async de=>{try{await f4(de.id),O({title:"成功",description:"表情包已注册"}),k(),H()}catch(Me){const rs=Me instanceof Error?Me.message:"注册失败";O({title:"错误",description:rs,variant:"destructive"})}},Q=async de=>{try{await p4(de.id),O({title:"成功",description:"表情包已封禁"}),k(),H()}catch(Me){const rs=Me instanceof Error?Me.message:"封禁失败";O({title:"错误",description:rs,variant:"destructive"})}},ee=de=>{const Me=new Set(ve);Me.has(de)?Me.delete(de):Me.add(de),je(Me)},Ue=async()=>{try{const de=await v4(Array.from(ve));O({title:"批量删除完成",description:de.message}),je(new Set),V(!1),k(),H()}catch(de){O({title:"批量删除失败",description:de instanceof Error?de.message:"批量删除失败",variant:"destructive"})}},ie=()=>{const de=parseInt(B),Me=Math.ceil(p/N);de>=1&&de<=Me?(f(de),oe("")):O({title:"无效的页码",description:`请输入1-${Me}之间的页码`,variant:"destructive"})},Te=i?.formats?Object.keys(i.formats):[];return e.jsxs("div",{className:"h-[calc(100vh-4rem)] flex flex-col p-4 sm:p-6",children:[e.jsxs("div",{className:"mb-4 sm:mb-6 flex flex-col sm:flex-row sm:items-center sm:justify-between gap-4",children:[e.jsxs("div",{children:[e.jsx("h1",{className:"text-2xl sm:text-3xl font-bold",children:"表情包管理"}),e.jsx("p",{className:"text-sm text-muted-foreground mt-1",children:"管理麦麦的表情包资源"})]}),e.jsxs(_,{onClick:()=>ke(!0),className:"gap-2",children:[e.jsx(ec,{className:"h-4 w-4"}),"上传表情包"]})]}),e.jsx(Ye,{className:"flex-1",children:e.jsxs("div",{className:"space-y-4 sm:space-y-6 pr-4",children:[i&&e.jsxs("div",{className:"grid gap-4 grid-cols-2 lg:grid-cols-4",children:[e.jsx(Ce,{children:e.jsxs(De,{className:"pb-2",children:[e.jsx(ws,{children:"总数"}),e.jsx(Le,{className:"text-2xl",children:i.total})]})}),e.jsx(Ce,{children:e.jsxs(De,{className:"pb-2",children:[e.jsx(ws,{children:"已注册"}),e.jsx(Le,{className:"text-2xl text-green-600",children:i.registered})]})}),e.jsx(Ce,{children:e.jsxs(De,{className:"pb-2",children:[e.jsx(ws,{children:"已封禁"}),e.jsx(Le,{className:"text-2xl text-red-600",children:i.banned})]})}),e.jsx(Ce,{children:e.jsxs(De,{className:"pb-2",children:[e.jsx(ws,{children:"未注册"}),e.jsx(Le,{className:"text-2xl text-gray-600",children:i.unregistered})]})})]}),e.jsxs(Ce,{children:[e.jsx(De,{children:e.jsxs(Le,{className:"flex items-center gap-2",children:[e.jsx(zo,{className:"h-5 w-5"}),"筛选和排序"]})}),e.jsxs(Ae,{className:"space-y-4",children:[e.jsxs("div",{className:"grid gap-4 sm:grid-cols-2 lg:grid-cols-4",children:[e.jsxs("div",{className:"space-y-2",children:[e.jsx(E,{children:"排序方式"}),e.jsxs(Ie,{value:`${P}-${T}`,onValueChange:de=>{const[Me,rs]=de.split("-");M(Me),A(rs),f(1)},children:[e.jsx($e,{children:e.jsx(Pe,{})}),e.jsxs(Be,{children:[e.jsx(X,{value:"usage_count-desc",children:"使用次数 (多→少)"}),e.jsx(X,{value:"usage_count-asc",children:"使用次数 (少→多)"}),e.jsx(X,{value:"register_time-desc",children:"注册时间 (新→旧)"}),e.jsx(X,{value:"register_time-asc",children:"注册时间 (旧→新)"}),e.jsx(X,{value:"record_time-desc",children:"记录时间 (新→旧)"}),e.jsx(X,{value:"record_time-asc",children:"记录时间 (旧→新)"}),e.jsx(X,{value:"last_used_time-desc",children:"最后使用 (新→旧)"}),e.jsx(X,{value:"last_used_time-asc",children:"最后使用 (旧→新)"})]})]})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsx(E,{children:"注册状态"}),e.jsxs(Ie,{value:y,onValueChange:de=>{w(de),f(1)},children:[e.jsx($e,{children:e.jsx(Pe,{})}),e.jsxs(Be,{children:[e.jsx(X,{value:"all",children:"全部"}),e.jsx(X,{value:"registered",children:"已注册"}),e.jsx(X,{value:"unregistered",children:"未注册"})]})]})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsx(E,{children:"封禁状态"}),e.jsxs(Ie,{value:b,onValueChange:de=>{R(de),f(1)},children:[e.jsx($e,{children:e.jsx(Pe,{})}),e.jsxs(Be,{children:[e.jsx(X,{value:"all",children:"全部"}),e.jsx(X,{value:"banned",children:"已封禁"}),e.jsx(X,{value:"unbanned",children:"未封禁"})]})]})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsx(E,{children:"格式"}),e.jsxs(Ie,{value:D,onValueChange:de=>{S(de),f(1)},children:[e.jsx($e,{children:e.jsx(Pe,{})}),e.jsxs(Be,{children:[e.jsx(X,{value:"all",children:"全部"}),Te.map(de=>e.jsxs(X,{value:de,children:[de.toUpperCase()," (",i?.formats[de],")"]},de))]})]})]})]}),e.jsxs("div",{className:"flex flex-col sm:flex-row items-start sm:items-center justify-between gap-3 pt-4 border-t",children:[e.jsxs("div",{className:"flex items-center gap-4",children:[ve.size>0&&e.jsxs("span",{className:"text-sm text-muted-foreground",children:["已选择 ",ve.size," 个表情包"]}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(E,{className:"text-sm whitespace-nowrap",children:"卡片大小"}),e.jsxs(Ie,{value:K,onValueChange:de=>_e(de),children:[e.jsx($e,{className:"w-24",children:e.jsx(Pe,{})}),e.jsxs(Be,{children:[e.jsx(X,{value:"small",children:"小"}),e.jsx(X,{value:"medium",children:"中"}),e.jsx(X,{value:"large",children:"大"})]})]})]})]}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(E,{htmlFor:"emoji-page-size",className:"text-sm whitespace-nowrap",children:"每页显示"}),e.jsxs(Ie,{value:N.toString(),onValueChange:de=>{v(parseInt(de)),f(1),je(new Set)},children:[e.jsx($e,{id:"emoji-page-size",className:"w-20",children:e.jsx(Pe,{})}),e.jsxs(Be,{children:[e.jsx(X,{value:"20",children:"20"}),e.jsx(X,{value:"40",children:"40"}),e.jsx(X,{value:"60",children:"60"}),e.jsx(X,{value:"100",children:"100"})]})]}),ve.size>0&&e.jsxs(e.Fragment,{children:[e.jsx(_,{variant:"outline",size:"sm",onClick:()=>je(new Set),children:"取消选择"}),e.jsxs(_,{variant:"destructive",size:"sm",onClick:()=>V(!0),children:[e.jsx(ls,{className:"h-4 w-4 mr-1"}),"批量删除"]})]})]})]}),e.jsx("div",{className:"flex justify-end pt-4 border-t",children:e.jsxs(_,{variant:"outline",size:"sm",onClick:k,disabled:u,children:[e.jsx(dt,{className:`h-4 w-4 mr-2 ${u?"animate-spin":""}`}),"刷新"]})})]})]}),e.jsxs(Ce,{children:[e.jsxs(De,{children:[e.jsx(Le,{children:"表情包列表"}),e.jsxs(ws,{children:["共 ",p," 个表情包,当前第 ",h," 页"]})]}),e.jsxs(Ae,{children:[l.length===0?e.jsx("div",{className:"text-center py-12 text-muted-foreground",children:"暂无数据"}):e.jsx("div",{className:`grid gap-3 ${K==="small"?"grid-cols-3 sm:grid-cols-4 md:grid-cols-6 lg:grid-cols-8 xl:grid-cols-10":K==="medium"?"grid-cols-2 sm:grid-cols-3 md:grid-cols-4 lg:grid-cols-6 xl:grid-cols-8":"grid-cols-2 sm:grid-cols-2 md:grid-cols-3 lg:grid-cols-4 xl:grid-cols-5"}`,children:l.map(de=>e.jsxs("div",{className:`group relative rounded-lg border bg-card overflow-hidden hover:ring-2 hover:ring-primary transition-all cursor-pointer ${ve.has(de.id)?"ring-2 ring-primary bg-primary/5":""}`,onClick:()=>ee(de.id),children:[e.jsx("div",{className:`absolute top-1 left-1 z-10 transition-opacity ${ve.has(de.id)?"opacity-100":"opacity-0 group-hover:opacity-100"}`,children:e.jsx("div",{className:`w-5 h-5 rounded-full border-2 flex items-center justify-center ${ve.has(de.id)?"bg-primary border-primary text-primary-foreground":"bg-background/80 border-muted-foreground/50"}`,children:ve.has(de.id)&&e.jsx(pt,{className:"h-3 w-3"})})}),e.jsxs("div",{className:"absolute top-1 right-1 z-10 flex flex-col gap-0.5",children:[de.is_registered&&e.jsx(Se,{variant:"default",className:"bg-green-600 text-[10px] px-1 py-0",children:"已注册"}),de.is_banned&&e.jsx(Se,{variant:"destructive",className:"text-[10px] px-1 py-0",children:"已封禁"})]}),e.jsx("div",{className:`aspect-square bg-muted flex items-center justify-center overflow-hidden ${K==="small"?"p-1":K==="medium"?"p-2":"p-3"}`,children:e.jsx(c4,{src:g4(de.id),alt:"表情包"})}),e.jsxs("div",{className:`border-t bg-card ${K==="small"?"p-1":"p-2"}`,children:[e.jsxs("div",{className:"flex items-center justify-between gap-1 text-xs text-muted-foreground mb-1",children:[e.jsx(Se,{variant:"outline",className:"text-[10px] px-1 py-0",children:de.format.toUpperCase()}),e.jsxs("span",{className:"font-mono",children:[de.usage_count,"次"]})]}),e.jsxs("div",{className:`flex gap-1 justify-center opacity-0 group-hover:opacity-100 transition-opacity ${K==="small"?"flex-wrap":""}`,children:[e.jsx(_,{variant:"ghost",size:"icon",className:"h-6 w-6",onClick:Me=>{Me.stopPropagation(),Ee(de)},title:"编辑",children:e.jsx(qn,{className:"h-3 w-3"})}),e.jsx(_,{variant:"ghost",size:"icon",className:"h-6 w-6",onClick:Me=>{Me.stopPropagation(),se(de)},title:"详情",children:e.jsx(Ht,{className:"h-3 w-3"})}),!de.is_registered&&e.jsx(_,{variant:"ghost",size:"icon",className:"h-6 w-6 text-green-600 hover:text-green-700",onClick:Me=>{Me.stopPropagation(),ns(de)},title:"注册",children:e.jsx(pt,{className:"h-3 w-3"})}),!de.is_banned&&e.jsx(_,{variant:"ghost",size:"icon",className:"h-6 w-6 text-orange-600 hover:text-orange-700",onClick:Me=>{Me.stopPropagation(),Q(de)},title:"封禁",children:e.jsx(t_,{className:"h-3 w-3"})}),e.jsx(_,{variant:"ghost",size:"icon",className:"h-6 w-6 text-red-600 hover:text-red-700",onClick:Me=>{Me.stopPropagation(),Z(de)},title:"删除",children:e.jsx(ls,{className:"h-3 w-3"})})]})]})]},de.id))}),p>0&&e.jsxs("div",{className:"flex flex-col sm:flex-row items-center justify-between gap-4 mt-4",children:[e.jsxs("div",{className:"text-sm text-muted-foreground",children:["显示 ",(h-1)*N+1," 到"," ",Math.min(h*N,p)," 条,共 ",p," 条"]}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(_,{variant:"outline",size:"sm",onClick:()=>f(1),disabled:h===1,className:"hidden sm:flex",children:e.jsx(gn,{className:"h-4 w-4"})}),e.jsxs(_,{variant:"outline",size:"sm",onClick:()=>f(de=>Math.max(1,de-1)),disabled:h===1,children:[e.jsx(za,{className:"h-4 w-4 sm:mr-1"}),e.jsx("span",{className:"hidden sm:inline",children:"上一页"})]}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(le,{type:"number",value:B,onChange:de=>oe(de.target.value),onKeyDown:de=>de.key==="Enter"&&ie(),placeholder:h.toString(),className:"w-16 h-8 text-center",min:1,max:Math.ceil(p/N)}),e.jsx(_,{variant:"outline",size:"sm",onClick:ie,disabled:!B,className:"h-8",children:"跳转"})]}),e.jsxs(_,{variant:"outline",size:"sm",onClick:()=>f(de=>de+1),disabled:h>=Math.ceil(p/N),children:[e.jsx("span",{className:"hidden sm:inline",children:"下一页"}),e.jsx(Zt,{className:"h-4 w-4 sm:ml-1"})]}),e.jsx(_,{variant:"outline",size:"sm",onClick:()=>f(Math.ceil(p/N)),disabled:h>=Math.ceil(p/N),className:"hidden sm:flex",children:e.jsx(jn,{className:"h-4 w-4"})})]})]})]})]}),e.jsx(y4,{emoji:F,open:J,onOpenChange:U}),e.jsx(w4,{emoji:F,open:ue,onOpenChange:xe,onSuccess:()=>{k(),H()}}),e.jsx(_4,{open:pe,onOpenChange:ke,onSuccess:()=>{k(),H()}})]})}),e.jsx(vs,{open:z,onOpenChange:V,children:e.jsxs(ds,{children:[e.jsxs(us,{children:[e.jsx(xs,{children:"确认批量删除"}),e.jsxs(hs,{children:["你确定要删除选中的 ",ve.size," 个表情包吗?此操作不可撤销。"]})]}),e.jsxs(ms,{children:[e.jsx(ps,{children:"取消"}),e.jsx(fs,{onClick:Ue,children:"确认删除"})]})]})}),e.jsx(Is,{open:he,onOpenChange:ne,children:e.jsxs(Os,{children:[e.jsxs(Ds,{children:[e.jsx(Rs,{children:"确认删除"}),e.jsx(Ks,{children:"确定要删除这个表情包吗?此操作无法撤销。"})]}),e.jsxs(st,{children:[e.jsx(_,{variant:"outline",onClick:()=>ne(!1),children:"取消"}),e.jsx(_,{variant:"destructive",onClick:Oe,children:"删除"})]})]})})]})}function y4({emoji:l,open:n,onOpenChange:i}){if(!l)return null;const c=u=>u?new Date(u*1e3).toLocaleString("zh-CN"):"-";return e.jsx(Is,{open:n,onOpenChange:i,children:e.jsxs(Os,{className:"max-w-2xl max-h-[90vh]",children:[e.jsx(Ds,{children:e.jsx(Rs,{children:"表情包详情"})}),e.jsx(Ye,{className:"max-h-[calc(90vh-8rem)] pr-4",children:e.jsxs("div",{className:"space-y-4",children:[e.jsx("div",{className:"flex justify-center",children:e.jsx("div",{className:"w-32 h-32 bg-muted rounded-lg flex items-center justify-center overflow-hidden",children:e.jsx("img",{src:j4(l.id),alt:l.description||"表情包",className:"w-full h-full object-cover",onError:u=>{const x=u.target;x.style.display="none";const h=x.parentElement;h&&(h.innerHTML='')}})})}),e.jsxs("div",{className:"grid gap-4 sm:grid-cols-2",children:[e.jsxs("div",{children:[e.jsx(E,{className:"text-muted-foreground",children:"ID"}),e.jsx("div",{className:"mt-1 font-mono",children:l.id})]}),e.jsxs("div",{children:[e.jsx(E,{className:"text-muted-foreground",children:"格式"}),e.jsx("div",{className:"mt-1",children:e.jsx(Se,{variant:"outline",children:l.format.toUpperCase()})})]})]}),e.jsxs("div",{children:[e.jsx(E,{className:"text-muted-foreground",children:"文件路径"}),e.jsx("div",{className:"mt-1 font-mono text-sm break-all bg-muted p-2 rounded",children:l.full_path})]}),e.jsxs("div",{children:[e.jsx(E,{className:"text-muted-foreground",children:"哈希值"}),e.jsx("div",{className:"mt-1 font-mono text-sm break-all bg-muted p-2 rounded",children:l.emoji_hash})]}),e.jsxs("div",{children:[e.jsx(E,{className:"text-muted-foreground",children:"描述"}),l.description?e.jsx("div",{className:"mt-1 rounded-lg border bg-muted/50 p-3",children:e.jsx(o4,{className:"prose-sm",children:l.description})}):e.jsx("div",{className:"mt-1 text-sm text-muted-foreground",children:"-"})]}),e.jsxs("div",{children:[e.jsx(E,{className:"text-muted-foreground",children:"情绪"}),e.jsx("div",{className:"mt-1",children:l.emotion?e.jsx("span",{className:"text-sm",children:l.emotion}):e.jsx("span",{className:"text-sm text-muted-foreground",children:"-"})})]}),e.jsxs("div",{className:"grid gap-4 sm:grid-cols-2",children:[e.jsxs("div",{children:[e.jsx(E,{className:"text-muted-foreground",children:"状态"}),e.jsxs("div",{className:"mt-2 flex gap-2",children:[l.is_registered&&e.jsx(Se,{variant:"default",className:"bg-green-600",children:"已注册"}),l.is_banned&&e.jsx(Se,{variant:"destructive",children:"已封禁"}),!l.is_registered&&!l.is_banned&&e.jsx(Se,{variant:"outline",children:"未注册"})]})]}),e.jsxs("div",{children:[e.jsx(E,{className:"text-muted-foreground",children:"使用次数"}),e.jsx("div",{className:"mt-1 font-mono text-lg",children:l.usage_count})]})]}),e.jsxs("div",{className:"grid gap-4 sm:grid-cols-2",children:[e.jsxs("div",{children:[e.jsx(E,{className:"text-muted-foreground",children:"记录时间"}),e.jsx("div",{className:"mt-1 text-sm",children:c(l.record_time)})]}),e.jsxs("div",{children:[e.jsx(E,{className:"text-muted-foreground",children:"注册时间"}),e.jsx("div",{className:"mt-1 text-sm",children:c(l.register_time)})]})]}),e.jsxs("div",{children:[e.jsx(E,{className:"text-muted-foreground",children:"最后使用"}),e.jsx("div",{className:"mt-1 text-sm",children:c(l.last_used_time)})]})]})})]})})}function w4({emoji:l,open:n,onOpenChange:i,onSuccess:c}){const[u,x]=d.useState(""),[h,f]=d.useState(!1),[p,g]=d.useState(!1),[N,v]=d.useState(!1),{toast:y}=Zs();d.useEffect(()=>{l&&(x(l.emotion||""),f(l.is_registered),g(l.is_banned))},[l]);const w=async()=>{if(l)try{v(!0);const b=u.split(/[,,]/).map(R=>R.trim()).filter(Boolean).join(",");await m4(l.id,{emotion:b||void 0,is_registered:h,is_banned:p}),y({title:"成功",description:"表情包信息已更新"}),i(!1),c()}catch(b){const R=b instanceof Error?b.message:"保存失败";y({title:"错误",description:R,variant:"destructive"})}finally{v(!1)}};return l?e.jsx(Is,{open:n,onOpenChange:i,children:e.jsxs(Os,{className:"max-w-2xl",children:[e.jsxs(Ds,{children:[e.jsx(Rs,{children:"编辑表情包"}),e.jsx(Ks,{children:"修改表情包的情绪和状态信息"})]}),e.jsxs("div",{className:"space-y-4",children:[e.jsxs("div",{children:[e.jsx(E,{children:"情绪"}),e.jsx(ot,{value:u,onChange:b=>x(b.target.value),placeholder:"输入情绪描述...",rows:2,className:"mt-1"}),e.jsx("p",{className:"text-xs text-muted-foreground mt-1",children:"输入情绪相关的文本描述"})]}),e.jsxs("div",{className:"grid gap-4 sm:grid-cols-2",children:[e.jsxs("div",{className:"flex items-center space-x-2",children:[e.jsx(qs,{id:"is_registered",checked:h,onCheckedChange:b=>{b===!0?(f(!0),g(!1)):f(!1)}}),e.jsx(E,{htmlFor:"is_registered",className:"cursor-pointer",children:"已注册"})]}),e.jsxs("div",{className:"flex items-center space-x-2",children:[e.jsx(qs,{id:"is_banned",checked:p,onCheckedChange:b=>{b===!0?(g(!0),f(!1)):g(!1)}}),e.jsx(E,{htmlFor:"is_banned",className:"cursor-pointer",children:"已封禁"})]})]})]}),e.jsxs(st,{children:[e.jsx(_,{variant:"outline",onClick:()=>i(!1),children:"取消"}),e.jsx(_,{onClick:w,disabled:N,children:N?"保存中...":"保存"})]})]})}):null}function _4({open:l,onOpenChange:n,onSuccess:i}){const[c,u]=d.useState("select"),[x,h]=d.useState([]),[f,p]=d.useState(null),[g,N]=d.useState(!1),{toast:v}=Zs(),y=d.useMemo(()=>new U_({id:"emoji-uploader",autoProceed:!1,restrictions:{maxFileSize:10485760,allowedFileTypes:["image/jpeg","image/png","image/gif","image/webp"],maxNumberOfFiles:20},locale:{pluralize:()=>0,strings:{addMoreFiles:"添加更多文件",addingMoreFiles:"正在添加更多文件",allowedFileTypes:"允许的文件类型:%{types}",cancel:"取消",closeModal:"关闭",complete:"完成",connectedToInternet:"已连接到互联网",copyLink:"复制链接",copyLinkToClipboardFallback:"复制下方链接",copyLinkToClipboardSuccess:"链接已复制到剪贴板",dashboardTitle:"选择文件",dashboardWindowTitle:"文件选择窗口(按 ESC 关闭)",done:"完成",dropHereOr:"拖放文件到这里或 %{browse}",dropHint:"将文件拖放到此处",dropPasteFiles:"将文件拖放到这里或 %{browseFiles}",dropPasteFolders:"将文件拖放到这里或 %{browseFolders}",dropPasteBoth:"将文件拖放到这里,%{browseFiles} 或 %{browseFolders}",dropPasteImportFiles:"将文件拖放到这里,%{browseFiles} 或从以下位置导入:",dropPasteImportFolders:"将文件拖放到这里,%{browseFolders} 或从以下位置导入:",dropPasteImportBoth:"将文件拖放到这里,%{browseFiles},%{browseFolders} 或从以下位置导入:",editFile:"编辑文件",editing:"正在编辑 %{file}",emptyFolderAdded:"未从空文件夹添加文件",exceedsSize:"%{file} 超过了最大允许大小 %{size}",failedToUpload:"上传 %{file} 失败",fileSource:"文件来源:%{name}",filesUploadedOfTotal:{0:"已上传 %{complete} / %{smart_count} 个文件",1:"已上传 %{complete} / %{smart_count} 个文件"},filter:"筛选",finishEditingFile:"完成编辑文件",folderAdded:{0:"已从 %{folder} 添加 %{smart_count} 个文件",1:"已从 %{folder} 添加 %{smart_count} 个文件"},generatingThumbnails:"正在生成缩略图...",import:"导入",importFiles:"从以下位置导入文件:",importFrom:"从 %{name} 导入",loading:"加载中...",logOut:"登出",myDevice:"我的设备",noFilesFound:"这里没有文件或文件夹",noInternetConnection:"无网络连接",openFolderNamed:"打开文件夹 %{name}",pause:"暂停",pauseUpload:"暂停上传",paused:"已暂停",poweredBy:"技术支持:%{uppy}",processingXFiles:{0:"正在处理 %{smart_count} 个文件",1:"正在处理 %{smart_count} 个文件"},recording:"录制中",removeFile:"移除文件",resetFilter:"重置筛选",resume:"继续",resumeUpload:"继续上传",retry:"重试",retryUpload:"重试上传",save:"保存",saveChanges:"保存更改",selectFileNamed:"选择文件 %{name}",selectX:{0:"选择 %{smart_count}",1:"选择 %{smart_count}"},smile:"笑一个!",startRecording:"开始录制视频",stopRecording:"停止录制视频",takePicture:"拍照",timedOut:"上传已停滞 %{seconds} 秒,正在中止。",upload:"下一步",uploadComplete:"上传完成",uploadFailed:"上传失败",uploadPaused:"上传已暂停",uploadXFiles:{0:"下一步(%{smart_count} 个文件)",1:"下一步(%{smart_count} 个文件)"},uploadXNewFiles:{0:"下一步(+%{smart_count} 个文件)",1:"下一步(+%{smart_count} 个文件)"},uploading:"正在上传",uploadingXFiles:{0:"正在上传 %{smart_count} 个文件",1:"正在上传 %{smart_count} 个文件"},xFilesSelected:{0:"已选择 %{smart_count} 个文件",1:"已选择 %{smart_count} 个文件"},xMoreFilesAdded:{0:"又添加了 %{smart_count} 个文件",1:"又添加了 %{smart_count} 个文件"},xTimeLeft:"剩余 %{time}",youCanOnlyUploadFileTypes:"您只能上传:%{types}",youCanOnlyUploadX:{0:"您只能上传 %{smart_count} 个文件",1:"您只能上传 %{smart_count} 个文件"},youHaveToAtLeastSelectX:{0:"您至少需要选择 %{smart_count} 个文件",1:"您至少需要选择 %{smart_count} 个文件"},browseFiles:"浏览文件",browseFolders:"浏览文件夹",cancelUpload:"取消上传",addMore:"添加更多",back:"返回",editFileWithFilename:"编辑文件 %{file}"}}}),[]);d.useEffect(()=>{const F=()=>{const L=y.getFiles();if(L.length===0)return;const J=L.map(U=>({id:U.id,name:U.name,previewUrl:U.preview||URL.createObjectURL(U.data),emotion:"",description:"",isRegistered:!0,file:U.data}));h(J),L.length===1?(p(J[0].id),u("edit-single")):u("edit-multiple")};return y.on("upload",F),()=>{y.off("upload",F)}},[y]),d.useEffect(()=>{l||(y.cancelAll(),u("select"),h([]),p(null),N(!1))},[l,y]);const w=d.useCallback((F,L)=>{h(J=>J.map(U=>U.id===F?{...U,...L}:U))},[]),b=d.useCallback(F=>F.emotion.trim().length>0,[]),R=d.useMemo(()=>x.length>0&&x.every(b),[x,b]),D=d.useMemo(()=>x.find(F=>F.id===f)||null,[x,f]),S=d.useCallback(()=>{(c==="edit-single"||c==="edit-multiple")&&(u("select"),h([]),p(null))},[c]),P=d.useCallback(async()=>{if(!R){v({title:"请填写必填项",description:"每个表情包的情感标签都是必填的",variant:"destructive"});return}N(!0);let F=0,L=0;try{for(const J of x){const U=new FormData;U.append("file",J.file),U.append("emotion",J.emotion),U.append("description",J.description),U.append("is_registered",J.isRegistered.toString());try{(await we(N4(),{method:"POST",body:U})).ok?F++:L++}catch{L++}}L===0?(v({title:"上传成功",description:`成功上传 ${F} 个表情包`}),n(!1),i()):(v({title:"部分上传失败",description:`成功 ${F} 个,失败 ${L} 个`,variant:"destructive"}),i())}finally{N(!1)}},[R,x,v,n,i]),M=()=>e.jsx("div",{className:"space-y-4",children:e.jsx("div",{className:"border rounded-lg overflow-hidden w-full",children:e.jsx(i4,{uppy:y,proudlyDisplayPoweredByUppy:!1,hideProgressDetails:!0,height:350,width:"100%",theme:"auto",note:"支持 JPG、PNG、GIF、WebP 格式,最多 20 个文件"})})}),T=()=>{const F=x[0];return F?e.jsxs("div",{className:"space-y-4",children:[e.jsxs("div",{className:"flex items-center gap-4",children:[e.jsxs(_,{variant:"ghost",size:"sm",onClick:S,children:[e.jsx(Ca,{className:"h-4 w-4 mr-1"}),"返回"]}),e.jsx("span",{className:"text-sm text-muted-foreground",children:"编辑表情包信息"})]}),e.jsxs("div",{className:"flex gap-6",children:[e.jsxs("div",{className:"flex-shrink-0",children:[e.jsx("div",{className:"w-32 h-32 rounded-lg border overflow-hidden bg-muted flex items-center justify-center",children:e.jsx("img",{src:F.previewUrl,alt:F.name,className:"max-w-full max-h-full object-contain"})}),e.jsx("p",{className:"text-xs text-muted-foreground mt-2 text-center truncate max-w-32",children:F.name})]}),e.jsxs("div",{className:"flex-1 space-y-4",children:[e.jsxs("div",{className:"space-y-2",children:[e.jsxs(E,{htmlFor:"single-emotion",children:["情感标签 ",e.jsx("span",{className:"text-destructive",children:"*"})]}),e.jsx(le,{id:"single-emotion",value:F.emotion,onChange:L=>w(F.id,{emotion:L.target.value}),placeholder:"多个标签用逗号分隔,如:开心,高兴",className:F.emotion.trim()?"":"border-destructive"}),e.jsx("p",{className:"text-xs text-muted-foreground",children:"用于情感匹配,多个标签用逗号分隔"})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsx(E,{htmlFor:"single-description",children:"描述"}),e.jsx(le,{id:"single-description",value:F.description,onChange:L=>w(F.id,{description:L.target.value}),placeholder:"输入表情包描述..."})]}),e.jsxs("div",{className:"flex items-center space-x-2",children:[e.jsx(qs,{id:"single-is-registered",checked:F.isRegistered,onCheckedChange:L=>w(F.id,{isRegistered:L===!0})}),e.jsx(E,{htmlFor:"single-is-registered",className:"cursor-pointer",children:"上传后立即注册(可被麦麦使用)"})]})]})]}),e.jsx(st,{children:e.jsx(_,{onClick:P,disabled:!R||g,children:g?"上传中...":"上传"})})]}):null},A=()=>{const F=x.filter(b).length,L=x.length;return e.jsxs("div",{className:"space-y-4",children:[e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsxs("div",{className:"flex items-center gap-4",children:[e.jsxs(_,{variant:"ghost",size:"sm",onClick:S,children:[e.jsx(Ca,{className:"h-4 w-4 mr-1"}),"返回"]}),e.jsxs("span",{className:"text-sm text-muted-foreground",children:["编辑表情包信息(",F,"/",L," 已完成)"]})]}),e.jsx(Se,{variant:R?"default":"secondary",children:R?e.jsxs(e.Fragment,{children:[e.jsx(kt,{className:"h-3 w-3 mr-1"}),"全部完成"]}):e.jsxs(e.Fragment,{children:[e.jsx(Ta,{className:"h-3 w-3 mr-1"}),"未完成"]})})]}),e.jsxs("div",{className:"grid grid-cols-2 gap-4",children:[e.jsx(Ye,{className:"h-[350px] pr-2",children:e.jsx("div",{className:"space-y-2",children:x.map(J=>{const U=b(J),ue=f===J.id;return e.jsxs("div",{onClick:()=>p(J.id),className:` +`)}function Om(l){if(!l.trim())return{valid:!1,error:"路径不能为空"};if(!l.toLowerCase().endsWith(".toml"))return{valid:!1,error:"文件必须是 .toml 格式"};const n=/^([a-zA-Z]:\\|\\\\[^\\]+\\[^\\]+\\).+\.toml$/i,i=/^(\/|~\/).+\.toml$/i,c=/^(\.{1,2}[\\/]|[^:\\/]).+\.toml$/i,u=n.test(l),x=i.test(l),h=c.test(l);return!u&&!x&&!h?{valid:!1,error:"路径格式错误"}:/[<>"|?*\x00-\x1F]/.test(l)?{valid:!1,error:"路径包含非法字符"}:{valid:!0,error:""}}function ZS(){const[l,n]=d.useState("upload"),[i,c]=d.useState(null),[u,x]=d.useState(""),[h,f]=d.useState(""),[p,g]=d.useState("oneclick"),[N,v]=d.useState(""),[y,w]=d.useState(!1),[b,R]=d.useState(!1),[D,S]=d.useState(!1),[P,M]=d.useState(!1),[T,A]=d.useState(null),[F,L]=d.useState(!1),J=d.useRef(null),{toast:U}=Zs(),ue=d.useRef(null),xe=H=>{if(f(H),H.trim()){const se=Om(H);v(se.error)}else v("")},he=d.useCallback(async H=>{const se=Mm[H];R(!0);try{const Ee=await Eg(se.path),Z=zm(Ee);c(Z),g(H),f(se.path),await Tg(se.path),U({title:"加载成功",description:`已从${se.name}预设加载配置`})}catch(Ee){console.error("加载预设配置失败:",Ee),U({title:"加载失败",description:Ee instanceof Error?Ee.message:"无法读取预设配置文件",variant:"destructive"})}finally{R(!1)}},[U]),ne=d.useCallback(async H=>{const se=Om(H);if(!se.valid){v(se.error),U({title:"路径无效",description:se.error,variant:"destructive"});return}v(""),R(!0);try{const Ee=await Eg(H),Z=zm(Ee);c(Z),f(H),await Tg(H),U({title:"加载成功",description:"已从配置文件加载"})}catch(Ee){console.error("加载配置失败:",Ee),U({title:"加载失败",description:Ee instanceof Error?Ee.message:"无法读取配置文件",variant:"destructive"})}finally{R(!1)}},[U]);d.useEffect(()=>{(async()=>{try{const se=await AS();if(se&&se.path){f(se.path);const Ee=Object.entries(Mm).find(([,Z])=>Z.path===se.path);Ee?(n("preset"),g(Ee[0]),await he(Ee[0])):(n("path"),await ne(se.path))}}catch(se){console.error("加载保存的路径失败:",se)}})()},[ne,he]);const ve=d.useCallback(H=>{l!=="path"&&l!=="preset"||!h||(ue.current&&clearTimeout(ue.current),ue.current=setTimeout(async()=>{w(!0);try{const se=Am(H);await Mg(h,se),U({title:"自动保存成功",description:"配置已保存到文件"})}catch(se){console.error("自动保存失败:",se),U({title:"自动保存失败",description:se instanceof Error?se.message:"保存配置失败",variant:"destructive"})}finally{w(!1)}},1e3))},[l,h,U]),je=async()=>{if(!i||!h)return;const H=Om(h);if(!H.valid){U({title:"保存失败",description:H.error,variant:"destructive"});return}w(!0);try{const se=Am(i);await Mg(h,se),U({title:"保存成功",description:"配置已保存到文件"})}catch(se){console.error("保存失败:",se),U({title:"保存失败",description:se instanceof Error?se.message:"保存配置失败",variant:"destructive"})}finally{w(!1)}},z=async()=>{h&&await ne(h)},V=H=>{if(H!==l){if(i){A(H),S(!0);return}B(H)}},B=H=>{c(null),x(""),v(""),n(H),H==="preset"&&he("oneclick"),U({title:"已切换模式",description:{upload:"现在可以上传配置文件",path:"现在可以指定配置文件路径",preset:"现在可以使用预设配置"}[H]})},oe=()=>{T&&(B(T),A(null)),S(!1)},K=()=>{if(i){M(!0);return}_e()},_e=()=>{f(""),c(null),v(""),U({title:"已清空",description:"路径和配置已清空"})},pe=()=>{_e(),M(!1)},ke=H=>{const se=H.target.files?.[0];if(!se)return;const Ee=new FileReader;Ee.onload=Z=>{try{const Oe=Z.target?.result,ns=zm(Oe);c(ns),x(se.name),U({title:"上传成功",description:`已加载配置文件:${se.name}`})}catch(Oe){console.error("解析配置文件失败:",Oe),U({title:"解析失败",description:"配置文件格式错误,请检查文件内容",variant:"destructive"})}},Ee.readAsText(se)},O=()=>{if(!i)return;const H=Am(i),se=new Blob([H],{type:"text/plain;charset=utf-8"}),Ee=URL.createObjectURL(se),Z=document.createElement("a");Z.href=Ee,Z.download=u||"config.toml",document.body.appendChild(Z),Z.click(),document.body.removeChild(Z),URL.revokeObjectURL(Ee),U({title:"下载成功",description:"配置文件已下载,请手动覆盖并重启适配器"})},k=()=>{c(JSON.parse(JSON.stringify(bt))),x("config.toml"),U({title:"已加载默认配置",description:"可以开始编辑配置"})};return e.jsx(Ye,{className:"h-full",children:e.jsxs("div",{className:"space-y-4 sm:space-y-6 p-4 sm:p-6",children:[e.jsx("div",{className:"flex flex-col sm:flex-row sm:items-center justify-between gap-4",children:e.jsxs("div",{children:[e.jsx("h1",{className:"text-2xl sm:text-3xl font-bold",children:"麦麦适配器配置"}),e.jsx("p",{className:"text-muted-foreground mt-1 sm:mt-2 text-sm sm:text-base",children:"管理麦麦的 QQ 适配器的配置文件"})]})}),e.jsxs("div",{className:"flex items-start gap-2 p-3 rounded-lg border border-amber-500/50 bg-amber-500/10 text-amber-700 dark:text-amber-400",children:[e.jsx(_t,{className:"h-4 w-4 mt-0.5 flex-shrink-0"}),e.jsx("p",{className:"text-sm",children:"适配器配置保存之后使用 WebUI 的重启功能适配器并不会重启,需要手动重启适配器。"})]}),e.jsx(nc,{open:F,onOpenChange:L,children:e.jsxs(Ce,{children:[e.jsx(De,{children:e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsxs("div",{children:[e.jsx(Le,{children:"工作模式"}),e.jsx(ws,{children:"选择配置文件的管理方式"})]}),e.jsx(rc,{asChild:!0,children:e.jsxs(_,{variant:"ghost",size:"sm",className:"w-9 p-0",children:[e.jsx(za,{className:`h-4 w-4 transition-transform duration-200 ${F?"transform rotate-180":""}`}),e.jsx("span",{className:"sr-only",children:"切换"})]})})]})}),e.jsx(ic,{children:e.jsxs(Ae,{className:"space-y-4",children:[e.jsxs("div",{className:"grid grid-cols-1 md:grid-cols-3 gap-3 md:gap-4",children:[e.jsx("div",{className:`border-2 rounded-lg p-3 md:p-4 cursor-pointer transition-all ${l==="preset"?"border-primary bg-primary/5":"border-muted hover:border-primary/50 active:border-primary/70"}`,onClick:()=>V("preset"),children:e.jsxs("div",{className:"flex items-start gap-2 md:gap-3",children:[e.jsx(ra,{className:"h-4 w-4 md:h-5 md:w-5 mt-0.5 flex-shrink-0"}),e.jsxs("div",{className:"min-w-0",children:[e.jsx("h3",{className:"font-semibold text-sm md:text-base",children:"预设模式"}),e.jsx("p",{className:"text-xs md:text-sm text-muted-foreground mt-1 line-clamp-2",children:"使用预设的部署配置"})]})]})}),e.jsx("div",{className:`border-2 rounded-lg p-3 md:p-4 cursor-pointer transition-all ${l==="upload"?"border-primary bg-primary/5":"border-muted hover:border-primary/50 active:border-primary/70"}`,onClick:()=>V("upload"),children:e.jsxs("div",{className:"flex items-start gap-2 md:gap-3",children:[e.jsx(ec,{className:"h-4 w-4 md:h-5 md:w-5 mt-0.5 flex-shrink-0"}),e.jsxs("div",{className:"min-w-0",children:[e.jsx("h3",{className:"font-semibold text-sm md:text-base",children:"上传文件模式"}),e.jsx("p",{className:"text-xs md:text-sm text-muted-foreground mt-1 line-clamp-2",children:"上传配置文件,编辑后下载并手动覆盖"})]})]})}),e.jsx("div",{className:`border-2 rounded-lg p-3 md:p-4 cursor-pointer transition-all ${l==="path"?"border-primary bg-primary/5":"border-muted hover:border-primary/50 active:border-primary/70"}`,onClick:()=>V("path"),children:e.jsxs("div",{className:"flex items-start gap-2 md:gap-3",children:[e.jsx(s_,{className:"h-4 w-4 md:h-5 md:w-5 mt-0.5 flex-shrink-0"}),e.jsxs("div",{className:"min-w-0",children:[e.jsx("h3",{className:"font-semibold text-sm md:text-base",children:"指定路径模式"}),e.jsx("p",{className:"text-xs md:text-sm text-muted-foreground mt-1 line-clamp-2",children:"指定配置文件路径,自动加载和保存"})]})]})})]}),l==="preset"&&e.jsxs("div",{className:"space-y-3 pt-2 border-t",children:[e.jsx(E,{className:"text-sm md:text-base",children:"选择部署方式"}),e.jsx("div",{className:"grid grid-cols-1 sm:grid-cols-2 gap-3",children:Object.entries(Mm).map(([H,se])=>{const Ee=se.icon,Z=p===H;return e.jsx("div",{className:`border-2 rounded-lg p-3 cursor-pointer transition-all ${Z?"border-primary bg-primary/5":"border-muted hover:border-primary/50"}`,onClick:()=>{g(H),he(H)},children:e.jsxs("div",{className:"flex items-start gap-3",children:[e.jsx(Ee,{className:"h-5 w-5 mt-0.5 flex-shrink-0"}),e.jsxs("div",{className:"min-w-0 flex-1",children:[e.jsx("h4",{className:"font-semibold text-sm",children:se.name}),e.jsx("p",{className:"text-xs text-muted-foreground mt-1",children:se.description}),e.jsx("p",{className:"text-xs text-muted-foreground mt-1 font-mono break-all",children:se.path})]})]})},H)})})]}),l==="path"&&e.jsxs("div",{className:"space-y-3 pt-2 border-t",children:[e.jsxs("div",{className:"space-y-2",children:[e.jsx(E,{htmlFor:"config-path",className:"text-sm md:text-base",children:"配置文件路径"}),e.jsxs("div",{className:"flex flex-col sm:flex-row gap-2",children:[e.jsxs("div",{className:"flex-1 space-y-1",children:[e.jsx(le,{id:"config-path",value:h,onChange:H=>xe(H.target.value),placeholder:"例: C:\\Adapter\\config.toml",className:`text-sm ${N?"border-destructive":""}`}),N&&e.jsx("p",{className:"text-xs text-destructive",children:N})]}),e.jsx(_,{onClick:()=>ne(h),disabled:b||!h||!!N,className:"w-full sm:w-auto",children:b?e.jsxs(e.Fragment,{children:[e.jsx(dt,{className:"h-4 w-4 animate-spin mr-2"}),e.jsx("span",{className:"sm:hidden",children:"加载中..."})]}):e.jsxs(e.Fragment,{children:[e.jsx("span",{className:"sm:hidden",children:"加载配置"}),e.jsx("span",{className:"hidden sm:inline",children:"加载"})]})})]})]}),e.jsxs("details",{className:"rounded-lg bg-muted/50 p-3 group",children:[e.jsxs("summary",{className:"text-xs font-medium cursor-pointer select-none list-none flex items-center justify-between",children:[e.jsx("span",{children:"路径格式说明"}),e.jsx("svg",{className:"h-4 w-4 transition-transform group-open:rotate-180",fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",children:e.jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M19 9l-7 7-7-7"})})]}),e.jsxs("div",{className:"mt-2 space-y-2 text-xs text-muted-foreground",children:[e.jsxs("div",{className:"space-y-1",children:[e.jsx("div",{className:"flex items-center gap-2",children:e.jsx("span",{className:"font-mono bg-background px-1.5 py-0.5 rounded text-[10px] md:text-xs whitespace-nowrap",children:"Windows"})}),e.jsxs("div",{className:"pl-2 space-y-0.5 text-[10px] md:text-xs break-all",children:[e.jsx("div",{children:"C:\\Adapter\\config.toml"}),e.jsx("div",{className:"hidden sm:block",children:"D:\\MaiBot\\adapter\\config.toml"}),e.jsx("div",{className:"hidden sm:block",children:"\\\\server\\share\\config.toml"})]})]}),e.jsxs("div",{className:"space-y-1",children:[e.jsx("div",{className:"flex items-center gap-2",children:e.jsx("span",{className:"font-mono bg-background px-1.5 py-0.5 rounded text-[10px] md:text-xs whitespace-nowrap",children:"Linux"})}),e.jsxs("div",{className:"pl-2 space-y-0.5 text-[10px] md:text-xs break-all",children:[e.jsx("div",{children:"/opt/adapter/config.toml"}),e.jsx("div",{className:"hidden sm:block",children:"/home/user/adapter/config.toml"}),e.jsx("div",{className:"hidden sm:block",children:"~/adapter/config.toml"})]})]}),e.jsx("p",{className:"pt-1 border-t text-[10px] md:text-xs",children:"💡 配置会自动保存到指定文件,修改后 1 秒自动保存"})]})]})]})]})})]})}),e.jsxs(at,{children:[e.jsx(Ht,{className:"h-4 w-4"}),e.jsx(lt,{children:l==="preset"?e.jsxs(e.Fragment,{children:[e.jsx("strong",{children:"预设模式:"}),"选择预设的部署方式,配置会自动加载,修改后 1 秒自动保存",y&&" (正在保存...)"]}):l==="upload"?e.jsxs(e.Fragment,{children:[e.jsx("strong",{children:"上传文件模式:"}),"上传配置文件 → 在线编辑 → 下载文件 → 手动覆盖并重启适配器"]}):e.jsxs(e.Fragment,{children:[e.jsx("strong",{children:"指定路径模式:"}),"指定配置文件路径后,配置会自动加载,修改后 1 秒自动保存",y&&" (正在保存...)"]})})]}),l==="upload"&&!i&&e.jsxs("div",{className:"flex flex-col sm:flex-row gap-2 w-full",children:[e.jsx("input",{ref:J,type:"file",accept:".toml",className:"hidden",onChange:ke}),e.jsxs(_,{onClick:()=>J.current?.click(),size:"sm",variant:"outline",className:"w-full sm:w-auto",children:[e.jsx(ec,{className:"mr-2 h-4 w-4"}),"上传配置"]}),e.jsxs(_,{onClick:k,size:"sm",className:"w-full sm:w-auto",children:[e.jsx(Ca,{className:"mr-2 h-4 w-4"}),"使用默认配置"]})]}),l==="upload"&&i&&e.jsx("div",{className:"flex gap-2",children:e.jsxs(_,{onClick:O,size:"sm",className:"w-full sm:w-auto",children:[e.jsx(sa,{className:"mr-2 h-4 w-4"}),"下载配置"]})}),(l==="preset"||l==="path")&&i&&e.jsxs("div",{className:"flex flex-col sm:flex-row gap-2",children:[e.jsxs(_,{onClick:je,size:"sm",disabled:y||!!N,className:"w-full sm:w-auto",children:[e.jsx(oc,{className:"mr-2 h-4 w-4"}),y?"保存中...":"立即保存"]}),e.jsxs(_,{onClick:z,size:"sm",variant:"outline",disabled:b,className:"w-full sm:w-auto",children:[e.jsx(dt,{className:`mr-2 h-4 w-4 ${b?"animate-spin":""}`}),"刷新"]}),l==="path"&&e.jsxs(_,{onClick:K,size:"sm",variant:"destructive",className:"w-full sm:w-auto",children:[e.jsx(ls,{className:"mr-2 h-4 w-4"}),"清空路径"]})]}),i?e.jsxs(ta,{defaultValue:"napcat",className:"w-full",children:[e.jsx("div",{className:"overflow-x-auto -mx-4 px-4 sm:mx-0 sm:px-0",children:e.jsxs(Xt,{className:"inline-flex w-auto min-w-full sm:grid sm:w-full sm:grid-cols-5",children:[e.jsxs(Je,{value:"napcat",className:"flex-shrink-0 text-xs sm:text-sm whitespace-nowrap",children:[e.jsx("span",{className:"hidden sm:inline",children:"Napcat 连接"}),e.jsx("span",{className:"sm:hidden",children:"Napcat"})]}),e.jsxs(Je,{value:"maibot",className:"flex-shrink-0 text-xs sm:text-sm whitespace-nowrap",children:[e.jsx("span",{className:"hidden sm:inline",children:"麦麦连接"}),e.jsx("span",{className:"sm:hidden",children:"麦麦"})]}),e.jsxs(Je,{value:"chat",className:"flex-shrink-0 text-xs sm:text-sm whitespace-nowrap",children:[e.jsx("span",{className:"hidden sm:inline",children:"聊天控制"}),e.jsx("span",{className:"sm:hidden",children:"聊天"})]}),e.jsxs(Je,{value:"voice",className:"flex-shrink-0 text-xs sm:text-sm whitespace-nowrap",children:[e.jsx("span",{className:"hidden sm:inline",children:"语音设置"}),e.jsx("span",{className:"sm:hidden",children:"语音"})]}),e.jsx(Je,{value:"debug",className:"flex-shrink-0 text-xs sm:text-sm whitespace-nowrap",children:"调试"})]})}),e.jsx(ys,{value:"napcat",className:"space-y-4",children:e.jsx(WS,{config:i,onChange:H=>{c(H),ve(H)}})}),e.jsx(ys,{value:"maibot",className:"space-y-4",children:e.jsx(e4,{config:i,onChange:H=>{c(H),ve(H)}})}),e.jsx(ys,{value:"chat",className:"space-y-4",children:e.jsx(s4,{config:i,onChange:H=>{c(H),ve(H)}})}),e.jsx(ys,{value:"voice",className:"space-y-4",children:e.jsx(t4,{config:i,onChange:H=>{c(H),ve(H)}})}),e.jsx(ys,{value:"debug",className:"space-y-4",children:e.jsx(a4,{config:i,onChange:H=>{c(H),ve(H)}})})]}):e.jsx("div",{className:"rounded-lg border bg-card p-6 md:p-12",children:e.jsxs("div",{className:"text-center space-y-3 md:space-y-4",children:[e.jsx(Ca,{className:"h-12 w-12 md:h-16 md:w-16 mx-auto text-muted-foreground"}),e.jsxs("div",{children:[e.jsx("h3",{className:"text-base md:text-lg font-semibold",children:"尚未加载配置"}),e.jsx("p",{className:"text-xs md:text-sm text-muted-foreground mt-2 px-4",children:l==="preset"?"请选择预设的部署方式":l==="upload"?"请上传现有配置文件,或使用默认配置开始编辑":"请指定配置文件路径并点击加载按钮"})]})]})}),e.jsx(vs,{open:D,onOpenChange:S,children:e.jsxs(ds,{children:[e.jsxs(us,{children:[e.jsx(xs,{children:"确认切换模式"}),e.jsxs(hs,{children:["切换模式将清空当前配置,确定要继续吗?",e.jsx("br",{}),e.jsx("span",{className:"text-destructive font-medium",children:"请确保已保存重要配置"})]})]}),e.jsxs(ms,{children:[e.jsx(ps,{onClick:()=>{S(!1),A(null)},children:"取消"}),e.jsx(fs,{onClick:oe,children:"确认切换"})]})]})}),e.jsx(vs,{open:P,onOpenChange:M,children:e.jsxs(ds,{children:[e.jsxs(us,{children:[e.jsx(xs,{children:"确认清空路径"}),e.jsxs(hs,{children:["清空路径将清除当前配置,确定要继续吗?",e.jsx("br",{}),e.jsx("span",{className:"text-muted-foreground text-sm",children:"此操作不会删除配置文件,只是清除界面中的配置"})]})]}),e.jsxs(ms,{children:[e.jsx(ps,{onClick:()=>M(!1),children:"取消"}),e.jsx(fs,{onClick:pe,className:"bg-destructive hover:bg-destructive/90",children:"确认清空"})]})]})})]})})}function WS({config:l,onChange:n}){return e.jsx("div",{className:"rounded-lg border bg-card p-4 md:p-6 space-y-4 md:space-y-6",children:e.jsxs("div",{children:[e.jsx("h3",{className:"text-base md:text-lg font-semibold mb-3 md:mb-4",children:"Napcat WebSocket 服务设置"}),e.jsxs("div",{className:"grid gap-3 md:gap-4",children:[e.jsxs("div",{className:"grid gap-2",children:[e.jsx(E,{htmlFor:"napcat-host",className:"text-sm md:text-base",children:"主机地址"}),e.jsx(le,{id:"napcat-host",value:l.napcat_server.host,onChange:i=>n({...l,napcat_server:{...l.napcat_server,host:i.target.value}}),placeholder:"localhost",className:"text-sm md:text-base"}),e.jsx("p",{className:"text-xs text-muted-foreground",children:"Napcat 设定的主机地址"})]}),e.jsxs("div",{className:"grid gap-2",children:[e.jsx(E,{htmlFor:"napcat-port",className:"text-sm md:text-base",children:"端口"}),e.jsx(le,{id:"napcat-port",type:"number",value:l.napcat_server.port||"",onChange:i=>n({...l,napcat_server:{...l.napcat_server,port:i.target.value?parseInt(i.target.value):0}}),placeholder:"8095",className:"text-sm md:text-base"}),e.jsx("p",{className:"text-xs text-muted-foreground",children:"Napcat 设定的端口(留空使用默认值 8095)"})]}),e.jsxs("div",{className:"grid gap-2",children:[e.jsx(E,{htmlFor:"napcat-token",className:"text-sm md:text-base",children:"访问令牌(Token)"}),e.jsx(le,{id:"napcat-token",type:"password",value:l.napcat_server.token,onChange:i=>n({...l,napcat_server:{...l.napcat_server,token:i.target.value}}),placeholder:"留空表示无需令牌",className:"text-sm md:text-base"}),e.jsx("p",{className:"text-xs text-muted-foreground",children:"Napcat 设定的访问令牌,若无则留空"})]}),e.jsxs("div",{className:"grid gap-2",children:[e.jsx(E,{htmlFor:"napcat-heartbeat",className:"text-sm md:text-base",children:"心跳间隔(秒)"}),e.jsx(le,{id:"napcat-heartbeat",type:"number",value:l.napcat_server.heartbeat_interval||"",onChange:i=>n({...l,napcat_server:{...l.napcat_server,heartbeat_interval:i.target.value?parseInt(i.target.value):0}}),placeholder:"30",className:"text-sm md:text-base"}),e.jsx("p",{className:"text-xs text-muted-foreground",children:"与 Napcat 设置的心跳间隔保持一致(留空使用默认值 30)"})]})]})]})})}function e4({config:l,onChange:n}){return e.jsx("div",{className:"rounded-lg border bg-card p-4 md:p-6 space-y-4 md:space-y-6",children:e.jsxs("div",{children:[e.jsx("h3",{className:"text-base md:text-lg font-semibold mb-3 md:mb-4",children:"麦麦 WebSocket 服务设置"}),e.jsxs("div",{className:"grid gap-3 md:gap-4",children:[e.jsxs("div",{className:"grid gap-2",children:[e.jsx(E,{htmlFor:"maibot-host",className:"text-sm md:text-base",children:"主机地址"}),e.jsx(le,{id:"maibot-host",value:l.maibot_server.host,onChange:i=>n({...l,maibot_server:{...l.maibot_server,host:i.target.value}}),placeholder:"localhost",className:"text-sm md:text-base"}),e.jsx("p",{className:"text-xs text-muted-foreground",children:"麦麦在 .env 文件中设置的 HOST 字段"})]}),e.jsxs("div",{className:"grid gap-2",children:[e.jsx(E,{htmlFor:"maibot-port",className:"text-sm md:text-base",children:"端口"}),e.jsx(le,{id:"maibot-port",type:"number",value:l.maibot_server.port||"",onChange:i=>n({...l,maibot_server:{...l.maibot_server,port:i.target.value?parseInt(i.target.value):0}}),placeholder:"8000",className:"text-sm md:text-base"}),e.jsx("p",{className:"text-xs text-muted-foreground",children:"麦麦在 .env 文件中设置的 PORT 字段(留空使用默认值 8000)"})]})]})]})})}function s4({config:l,onChange:n}){const i=x=>{const h={...l};x==="group"?h.chat.group_list=[...h.chat.group_list,0]:x==="private"?h.chat.private_list=[...h.chat.private_list,0]:h.chat.ban_user_id=[...h.chat.ban_user_id,0],n(h)},c=(x,h)=>{const f={...l};x==="group"?f.chat.group_list=f.chat.group_list.filter((p,g)=>g!==h):x==="private"?f.chat.private_list=f.chat.private_list.filter((p,g)=>g!==h):f.chat.ban_user_id=f.chat.ban_user_id.filter((p,g)=>g!==h),n(f)},u=(x,h,f)=>{const p={...l};x==="group"?p.chat.group_list[h]=f:x==="private"?p.chat.private_list[h]=f:p.chat.ban_user_id[h]=f,n(p)};return e.jsx("div",{className:"rounded-lg border bg-card p-4 md:p-6 space-y-4 md:space-y-6",children:e.jsxs("div",{children:[e.jsx("h3",{className:"text-base md:text-lg font-semibold mb-3 md:mb-4",children:"聊天黑白名单功能"}),e.jsxs("div",{className:"grid gap-4 md:gap-6",children:[e.jsxs("div",{className:"space-y-3 md:space-y-4",children:[e.jsxs("div",{className:"grid gap-2",children:[e.jsx(E,{className:"text-sm md:text-base",children:"群组名单类型"}),e.jsxs(Ie,{value:l.chat.group_list_type,onValueChange:x=>n({...l,chat:{...l.chat,group_list_type:x}}),children:[e.jsx($e,{children:e.jsx(Pe,{})}),e.jsxs(Be,{children:[e.jsx(X,{value:"whitelist",children:"白名单(仅名单内可聊天)"}),e.jsx(X,{value:"blacklist",children:"黑名单(名单内禁止聊天)"})]})]})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsxs("div",{className:"flex flex-col sm:flex-row sm:items-center sm:justify-between gap-2 sm:gap-0",children:[e.jsx(E,{className:"text-sm md:text-base",children:"群组列表"}),e.jsxs(_,{onClick:()=>i("group"),size:"sm",variant:"outline",className:"w-full sm:w-auto",children:[e.jsx(Ca,{className:"mr-1 h-4 w-4"}),"添加群号"]})]}),l.chat.group_list.map((x,h)=>e.jsxs("div",{className:"flex gap-2",children:[e.jsx(le,{type:"number",value:x,onChange:f=>u("group",h,parseInt(f.target.value)||0),placeholder:"输入群号",className:"text-sm md:text-base"}),e.jsxs(vs,{children:[e.jsx(wt,{asChild:!0,children:e.jsx(_,{size:"icon",variant:"outline",children:e.jsx(ls,{className:"h-4 w-4"})})}),e.jsxs(ds,{children:[e.jsxs(us,{children:[e.jsx(xs,{children:"确认删除"}),e.jsxs(hs,{children:["确定要删除群号 ",x," 吗?此操作无法撤销。"]})]}),e.jsxs(ms,{children:[e.jsx(ps,{children:"取消"}),e.jsx(fs,{onClick:()=>c("group",h),children:"删除"})]})]})]})]},h)),l.chat.group_list.length===0&&e.jsx("p",{className:"text-sm text-muted-foreground",children:"暂无群组"})]})]}),e.jsxs("div",{className:"space-y-3 md:space-y-4",children:[e.jsxs("div",{className:"grid gap-2",children:[e.jsx(E,{className:"text-sm md:text-base",children:"私聊名单类型"}),e.jsxs(Ie,{value:l.chat.private_list_type,onValueChange:x=>n({...l,chat:{...l.chat,private_list_type:x}}),children:[e.jsx($e,{children:e.jsx(Pe,{})}),e.jsxs(Be,{children:[e.jsx(X,{value:"whitelist",children:"白名单(仅名单内可聊天)"}),e.jsx(X,{value:"blacklist",children:"黑名单(名单内禁止聊天)"})]})]})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsxs("div",{className:"flex flex-col sm:flex-row sm:items-center sm:justify-between gap-2 sm:gap-0",children:[e.jsx(E,{className:"text-sm md:text-base",children:"私聊列表"}),e.jsxs(_,{onClick:()=>i("private"),size:"sm",variant:"outline",className:"w-full sm:w-auto",children:[e.jsx(Ca,{className:"mr-1 h-4 w-4"}),"添加用户"]})]}),l.chat.private_list.map((x,h)=>e.jsxs("div",{className:"flex gap-2",children:[e.jsx(le,{type:"number",value:x,onChange:f=>u("private",h,parseInt(f.target.value)||0),placeholder:"输入QQ号",className:"text-sm md:text-base"}),e.jsxs(vs,{children:[e.jsx(wt,{asChild:!0,children:e.jsx(_,{size:"icon",variant:"outline",children:e.jsx(ls,{className:"h-4 w-4"})})}),e.jsxs(ds,{children:[e.jsxs(us,{children:[e.jsx(xs,{children:"确认删除"}),e.jsxs(hs,{children:["确定要删除用户 ",x," 吗?此操作无法撤销。"]})]}),e.jsxs(ms,{children:[e.jsx(ps,{children:"取消"}),e.jsx(fs,{onClick:()=>c("private",h),children:"删除"})]})]})]})]},h)),l.chat.private_list.length===0&&e.jsx("p",{className:"text-sm text-muted-foreground",children:"暂无用户"})]})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsxs("div",{className:"flex flex-col sm:flex-row sm:items-center sm:justify-between gap-2 sm:gap-0",children:[e.jsxs("div",{children:[e.jsx(E,{className:"text-sm md:text-base",children:"全局禁止名单"}),e.jsx("p",{className:"text-xs text-muted-foreground mt-1",children:"名单中的用户无法进行任何聊天"})]}),e.jsxs(_,{onClick:()=>i("ban"),size:"sm",variant:"outline",className:"w-full sm:w-auto",children:[e.jsx(Ca,{className:"mr-1 h-4 w-4"}),"添加用户"]})]}),l.chat.ban_user_id.map((x,h)=>e.jsxs("div",{className:"flex gap-2",children:[e.jsx(le,{type:"number",value:x,onChange:f=>u("ban",h,parseInt(f.target.value)||0),placeholder:"输入QQ号",className:"text-sm md:text-base"}),e.jsxs(vs,{children:[e.jsx(wt,{asChild:!0,children:e.jsx(_,{size:"icon",variant:"outline",children:e.jsx(ls,{className:"h-4 w-4"})})}),e.jsxs(ds,{children:[e.jsxs(us,{children:[e.jsx(xs,{children:"确认删除"}),e.jsxs(hs,{children:["确定要从全局禁止名单中删除用户 ",x," 吗?此操作无法撤销。"]})]}),e.jsxs(ms,{children:[e.jsx(ps,{children:"取消"}),e.jsx(fs,{onClick:()=>c("ban",h),children:"删除"})]})]})]})]},h)),l.chat.ban_user_id.length===0&&e.jsx("p",{className:"text-sm text-muted-foreground",children:"暂无禁止用户"})]}),e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsxs("div",{children:[e.jsx(E,{className:"text-sm md:text-base",children:"屏蔽QQ官方机器人"}),e.jsx("p",{className:"text-xs text-muted-foreground mt-1",children:"是否屏蔽来自QQ官方机器人的消息"})]}),e.jsx(Fe,{checked:l.chat.ban_qq_bot,onCheckedChange:x=>n({...l,chat:{...l.chat,ban_qq_bot:x}})})]}),e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsxs("div",{children:[e.jsx(E,{className:"text-sm md:text-base",children:"启用戳一戳功能"}),e.jsx("p",{className:"text-xs text-muted-foreground mt-1",children:"是否响应戳一戳消息"})]}),e.jsx(Fe,{checked:l.chat.enable_poke,onCheckedChange:x=>n({...l,chat:{...l.chat,enable_poke:x}})})]})]})]})})}function t4({config:l,onChange:n}){return e.jsx("div",{className:"rounded-lg border bg-card p-4 md:p-6 space-y-4 md:space-y-6",children:e.jsxs("div",{children:[e.jsx("h3",{className:"text-base md:text-lg font-semibold mb-3 md:mb-4",children:"发送语音设置"}),e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsxs("div",{children:[e.jsx(E,{className:"text-sm md:text-base",children:"使用 TTS 语音"}),e.jsx("p",{className:"text-xs text-muted-foreground mt-1",children:"请确保已配置 TTS 并有对应的适配器"})]}),e.jsx(Fe,{checked:l.voice.use_tts,onCheckedChange:i=>n({...l,voice:{use_tts:i}})})]})]})})}function a4({config:l,onChange:n}){return e.jsx("div",{className:"rounded-lg border bg-card p-4 md:p-6 space-y-4 md:space-y-6",children:e.jsxs("div",{children:[e.jsx("h3",{className:"text-base md:text-lg font-semibold mb-3 md:mb-4",children:"调试设置"}),e.jsx("div",{className:"grid gap-3 md:gap-4",children:e.jsxs("div",{className:"grid gap-2",children:[e.jsx(E,{className:"text-sm md:text-base",children:"日志等级"}),e.jsxs(Ie,{value:l.debug.level,onValueChange:i=>n({...l,debug:{level:i}}),children:[e.jsx($e,{children:e.jsx(Pe,{})}),e.jsxs(Be,{children:[e.jsx(X,{value:"DEBUG",children:"DEBUG(调试)"}),e.jsx(X,{value:"INFO",children:"INFO(信息)"}),e.jsx(X,{value:"WARNING",children:"WARNING(警告)"}),e.jsx(X,{value:"ERROR",children:"ERROR(错误)"}),e.jsx(X,{value:"CRITICAL",children:"CRITICAL(严重)"})]})]}),e.jsx("p",{className:"text-xs text-muted-foreground",children:"设置适配器的日志输出等级"})]})})]})})}const l4=["defaultChecked","defaultValue","suppressContentEditableWarning","suppressHydrationWarning","dangerouslySetInnerHTML","accessKey","className","contentEditable","contextMenu","dir","draggable","hidden","id","lang","placeholder","slot","spellCheck","style","tabIndex","title","translate","radioGroup","role","about","datatype","inlist","prefix","property","resource","typeof","vocab","autoCapitalize","autoCorrect","autoSave","color","itemProp","itemScope","itemType","itemID","itemRef","results","security","unselectable","inputMode","is","onCopy","onCopyCapture","onCut","onCutCapture","onPaste","onPasteCapture","onCompositionEnd","onCompositionEndCapture","onCompositionStart","onCompositionStartCapture","onCompositionUpdate","onCompositionUpdateCapture","onFocus","onFocusCapture","onBlur","onBlurCapture","onChange","onChangeCapture","onBeforeInput","onBeforeInputCapture","onInput","onInputCapture","onReset","onResetCapture","onSubmit","onSubmitCapture","onInvalid","onInvalidCapture","onLoad","onLoadCapture","onError","onErrorCapture","onKeyDown","onKeyDownCapture","onKeyPress","onKeyPressCapture","onKeyUp","onKeyUpCapture","onAbort","onAbortCapture","onCanPlay","onCanPlayCapture","onCanPlayThrough","onCanPlayThroughCapture","onDurationChange","onDurationChangeCapture","onEmptied","onEmptiedCapture","onEncrypted","onEncryptedCapture","onEnded","onEndedCapture","onLoadedData","onLoadedDataCapture","onLoadedMetadata","onLoadedMetadataCapture","onLoadStart","onLoadStartCapture","onPause","onPauseCapture","onPlay","onPlayCapture","onPlaying","onPlayingCapture","onProgress","onProgressCapture","onRateChange","onRateChangeCapture","onSeeked","onSeekedCapture","onSeeking","onSeekingCapture","onStalled","onStalledCapture","onSuspend","onSuspendCapture","onTimeUpdate","onTimeUpdateCapture","onVolumeChange","onVolumeChangeCapture","onWaiting","onWaitingCapture","onAuxClick","onAuxClickCapture","onClick","onClickCapture","onContextMenu","onContextMenuCapture","onDoubleClick","onDoubleClickCapture","onDrag","onDragCapture","onDragEnd","onDragEndCapture","onDragEnter","onDragEnterCapture","onDragExit","onDragExitCapture","onDragLeave","onDragLeaveCapture","onDragOver","onDragOverCapture","onDragStart","onDragStartCapture","onDrop","onDropCapture","onMouseDown","onMouseDownCapture","onMouseEnter","onMouseLeave","onMouseMove","onMouseMoveCapture","onMouseOut","onMouseOutCapture","onMouseOver","onMouseOverCapture","onMouseUp","onMouseUpCapture","onSelect","onSelectCapture","onTouchCancel","onTouchCancelCapture","onTouchEnd","onTouchEndCapture","onTouchMove","onTouchMoveCapture","onTouchStart","onTouchStartCapture","onPointerDown","onPointerDownCapture","onPointerMove","onPointerMoveCapture","onPointerUp","onPointerUpCapture","onPointerCancel","onPointerCancelCapture","onPointerEnter","onPointerEnterCapture","onPointerLeave","onPointerLeaveCapture","onPointerOver","onPointerOverCapture","onPointerOut","onPointerOutCapture","onGotPointerCapture","onGotPointerCaptureCapture","onLostPointerCapture","onLostPointerCaptureCapture","onScroll","onScrollCapture","onWheel","onWheelCapture","onAnimationStart","onAnimationStartCapture","onAnimationEnd","onAnimationEndCapture","onAnimationIteration","onAnimationIterationCapture","onTransitionEnd","onTransitionEndCapture"],n4=/^(aria-|data-)/,Mv=l=>Object.fromEntries(Object.entries(l).filter(([n])=>n4.test(n)||l4.includes(n)));function r4(l,n){const i=Mv(l);return Object.keys(l).some(c=>!Object.hasOwn(i,c)&&l[c]!==n[c])}class i4 extends d.Component{container;plugin;componentDidMount(){this.installPlugin()}componentDidUpdate(n){if(n.uppy!==this.props.uppy)this.uninstallPlugin(n),this.installPlugin();else if(r4(this.props,n)){const{uppy:i,...c}={...this.props,target:this.container};this.plugin.setOptions(c)}}componentWillUnmount(){this.uninstallPlugin()}installPlugin(){const{uppy:n,...i}={id:"Dashboard",...this.props,inline:!0,target:this.container};n.use(L_,i),this.plugin=n.getPlugin(i.id)}uninstallPlugin(n=this.props){const{uppy:i}=n;i.removePlugin(this.plugin)}render(){return d.createElement("div",{className:"uppy-Container",ref:n=>{this.container=n},...Mv(this.props)})}}function c4({src:l,alt:n="表情包",className:i,maxRetries:c=5,retryInterval:u=1500}){const[x,h]=d.useState("loading"),[f,p]=d.useState(0),[g,N]=d.useState(null),[v,y]=d.useState(l);l!==v&&(h("loading"),p(0),N(null),y(l));const w=d.useCallback(async()=>{try{const b=await fetch(l,{credentials:"include"});if(b.status===202){h("generating"),f{p(S=>S+1)},u):h("error");return}if(!b.ok){h("error");return}const R=await b.blob(),D=URL.createObjectURL(R);N(D),h("loaded")}catch(b){console.error("加载缩略图失败:",b),h("error")}},[l,f,c,u]);return d.useEffect(()=>{w()},[w]),d.useEffect(()=>()=>{g&&URL.revokeObjectURL(g)},[g]),x==="loading"||x==="generating"?e.jsx(js,{className:I("w-full h-full",i)}):x==="error"||!g?e.jsx("div",{className:I("w-full h-full flex items-center justify-center bg-muted",i),children:e.jsx(Jm,{className:"h-8 w-8 text-muted-foreground"})}):e.jsx("img",{src:g,alt:n,className:I("w-full h-full object-contain",i)})}function o4({children:l,className:n}){return e.jsx(tx,{content:l,className:n})}const Ka="/api/webui/emoji";async function d4(l){const n=new URLSearchParams;l.page&&n.append("page",l.page.toString()),l.page_size&&n.append("page_size",l.page_size.toString()),l.search&&n.append("search",l.search),l.is_registered!==void 0&&n.append("is_registered",l.is_registered.toString()),l.is_banned!==void 0&&n.append("is_banned",l.is_banned.toString()),l.format&&n.append("format",l.format),l.sort_by&&n.append("sort_by",l.sort_by),l.sort_order&&n.append("sort_order",l.sort_order);const i=await we(`${Ka}/list?${n}`,{});if(!i.ok)throw new Error(`获取表情包列表失败: ${i.statusText}`);return i.json()}async function u4(l){const n=await we(`${Ka}/${l}`,{});if(!n.ok)throw new Error(`获取表情包详情失败: ${n.statusText}`);return n.json()}async function m4(l,n){const i=await we(`${Ka}/${l}`,{method:"PATCH",body:JSON.stringify(n)});if(!i.ok)throw new Error(`更新表情包失败: ${i.statusText}`);return i.json()}async function x4(l){const n=await we(`${Ka}/${l}`,{method:"DELETE"});if(!n.ok)throw new Error(`删除表情包失败: ${n.statusText}`);return n.json()}async function h4(){const l=await we(`${Ka}/stats/summary`,{});if(!l.ok)throw new Error(`获取统计数据失败: ${l.statusText}`);return l.json()}async function f4(l){const n=await we(`${Ka}/${l}/register`,{method:"POST"});if(!n.ok)throw new Error(`注册表情包失败: ${n.statusText}`);return n.json()}async function p4(l){const n=await we(`${Ka}/${l}/ban`,{method:"POST"});if(!n.ok)throw new Error(`封禁表情包失败: ${n.statusText}`);return n.json()}function g4(l,n=!1){return n?`${Ka}/${l}/thumbnail?original=true`:`${Ka}/${l}/thumbnail`}function j4(l){return`${Ka}/${l}/thumbnail?original=true`}async function v4(l){const n=await we(`${Ka}/batch/delete`,{method:"POST",body:JSON.stringify({emoji_ids:l})});if(!n.ok){const i=await n.json();throw new Error(i.detail||"批量删除失败")}return n.json()}function N4(){return`${Ka}/upload`}function b4(){const[l,n]=d.useState([]),[i,c]=d.useState(null),[u,x]=d.useState(!1),[h,f]=d.useState(1),[p,g]=d.useState(0),[N,v]=d.useState(20),[y,w]=d.useState("all"),[b,R]=d.useState("all"),[D,S]=d.useState("all"),[P,M]=d.useState("usage_count"),[T,A]=d.useState("desc"),[F,L]=d.useState(null),[J,U]=d.useState(!1),[ue,xe]=d.useState(!1),[he,ne]=d.useState(!1),[ve,je]=d.useState(new Set),[z,V]=d.useState(!1),[B,oe]=d.useState(""),[K,_e]=d.useState("medium"),[pe,ke]=d.useState(!1),{toast:O}=Zs(),k=d.useCallback(async()=>{try{x(!0);const de=await d4({page:h,page_size:N,is_registered:y==="all"?void 0:y==="registered",is_banned:b==="all"?void 0:b==="banned",format:D==="all"?void 0:D,sort_by:P,sort_order:T});n(de.data),g(de.total)}catch(de){const Me=de instanceof Error?de.message:"加载表情包列表失败";O({title:"错误",description:Me,variant:"destructive"})}finally{x(!1)}},[h,N,y,b,D,P,T,O]),H=async()=>{try{const de=await h4();c(de.data)}catch(de){console.error("加载统计数据失败:",de)}};d.useEffect(()=>{k()},[k]),d.useEffect(()=>{H()},[]);const se=async de=>{try{const Me=await u4(de.id);L(Me.data),U(!0)}catch(Me){const rs=Me instanceof Error?Me.message:"加载详情失败";O({title:"错误",description:rs,variant:"destructive"})}},Ee=de=>{L(de),xe(!0)},Z=de=>{L(de),ne(!0)},Oe=async()=>{if(F)try{await x4(F.id),O({title:"成功",description:"表情包已删除"}),ne(!1),L(null),k(),H()}catch(de){const Me=de instanceof Error?de.message:"删除失败";O({title:"错误",description:Me,variant:"destructive"})}},ns=async de=>{try{await f4(de.id),O({title:"成功",description:"表情包已注册"}),k(),H()}catch(Me){const rs=Me instanceof Error?Me.message:"注册失败";O({title:"错误",description:rs,variant:"destructive"})}},Q=async de=>{try{await p4(de.id),O({title:"成功",description:"表情包已封禁"}),k(),H()}catch(Me){const rs=Me instanceof Error?Me.message:"封禁失败";O({title:"错误",description:rs,variant:"destructive"})}},ee=de=>{const Me=new Set(ve);Me.has(de)?Me.delete(de):Me.add(de),je(Me)},Ue=async()=>{try{const de=await v4(Array.from(ve));O({title:"批量删除完成",description:de.message}),je(new Set),V(!1),k(),H()}catch(de){O({title:"批量删除失败",description:de instanceof Error?de.message:"批量删除失败",variant:"destructive"})}},ie=()=>{const de=parseInt(B),Me=Math.ceil(p/N);de>=1&&de<=Me?(f(de),oe("")):O({title:"无效的页码",description:`请输入1-${Me}之间的页码`,variant:"destructive"})},Te=i?.formats?Object.keys(i.formats):[];return e.jsxs("div",{className:"h-[calc(100vh-4rem)] flex flex-col p-4 sm:p-6",children:[e.jsxs("div",{className:"mb-4 sm:mb-6 flex flex-col sm:flex-row sm:items-center sm:justify-between gap-4",children:[e.jsxs("div",{children:[e.jsx("h1",{className:"text-2xl sm:text-3xl font-bold",children:"表情包管理"}),e.jsx("p",{className:"text-sm text-muted-foreground mt-1",children:"管理麦麦的表情包资源"})]}),e.jsxs(_,{onClick:()=>ke(!0),className:"gap-2",children:[e.jsx(ec,{className:"h-4 w-4"}),"上传表情包"]})]}),e.jsx(Ye,{className:"flex-1",children:e.jsxs("div",{className:"space-y-4 sm:space-y-6 pr-4",children:[i&&e.jsxs("div",{className:"grid gap-4 grid-cols-2 lg:grid-cols-4",children:[e.jsx(Ce,{children:e.jsxs(De,{className:"pb-2",children:[e.jsx(ws,{children:"总数"}),e.jsx(Le,{className:"text-2xl",children:i.total})]})}),e.jsx(Ce,{children:e.jsxs(De,{className:"pb-2",children:[e.jsx(ws,{children:"已注册"}),e.jsx(Le,{className:"text-2xl text-green-600",children:i.registered})]})}),e.jsx(Ce,{children:e.jsxs(De,{className:"pb-2",children:[e.jsx(ws,{children:"已封禁"}),e.jsx(Le,{className:"text-2xl text-red-600",children:i.banned})]})}),e.jsx(Ce,{children:e.jsxs(De,{className:"pb-2",children:[e.jsx(ws,{children:"未注册"}),e.jsx(Le,{className:"text-2xl text-gray-600",children:i.unregistered})]})})]}),e.jsxs(Ce,{children:[e.jsx(De,{children:e.jsxs(Le,{className:"flex items-center gap-2",children:[e.jsx(zo,{className:"h-5 w-5"}),"筛选和排序"]})}),e.jsxs(Ae,{className:"space-y-4",children:[e.jsxs("div",{className:"grid gap-4 sm:grid-cols-2 lg:grid-cols-4",children:[e.jsxs("div",{className:"space-y-2",children:[e.jsx(E,{children:"排序方式"}),e.jsxs(Ie,{value:`${P}-${T}`,onValueChange:de=>{const[Me,rs]=de.split("-");M(Me),A(rs),f(1)},children:[e.jsx($e,{children:e.jsx(Pe,{})}),e.jsxs(Be,{children:[e.jsx(X,{value:"usage_count-desc",children:"使用次数 (多→少)"}),e.jsx(X,{value:"usage_count-asc",children:"使用次数 (少→多)"}),e.jsx(X,{value:"register_time-desc",children:"注册时间 (新→旧)"}),e.jsx(X,{value:"register_time-asc",children:"注册时间 (旧→新)"}),e.jsx(X,{value:"record_time-desc",children:"记录时间 (新→旧)"}),e.jsx(X,{value:"record_time-asc",children:"记录时间 (旧→新)"}),e.jsx(X,{value:"last_used_time-desc",children:"最后使用 (新→旧)"}),e.jsx(X,{value:"last_used_time-asc",children:"最后使用 (旧→新)"})]})]})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsx(E,{children:"注册状态"}),e.jsxs(Ie,{value:y,onValueChange:de=>{w(de),f(1)},children:[e.jsx($e,{children:e.jsx(Pe,{})}),e.jsxs(Be,{children:[e.jsx(X,{value:"all",children:"全部"}),e.jsx(X,{value:"registered",children:"已注册"}),e.jsx(X,{value:"unregistered",children:"未注册"})]})]})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsx(E,{children:"封禁状态"}),e.jsxs(Ie,{value:b,onValueChange:de=>{R(de),f(1)},children:[e.jsx($e,{children:e.jsx(Pe,{})}),e.jsxs(Be,{children:[e.jsx(X,{value:"all",children:"全部"}),e.jsx(X,{value:"banned",children:"已封禁"}),e.jsx(X,{value:"unbanned",children:"未封禁"})]})]})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsx(E,{children:"格式"}),e.jsxs(Ie,{value:D,onValueChange:de=>{S(de),f(1)},children:[e.jsx($e,{children:e.jsx(Pe,{})}),e.jsxs(Be,{children:[e.jsx(X,{value:"all",children:"全部"}),Te.map(de=>e.jsxs(X,{value:de,children:[de.toUpperCase()," (",i?.formats[de],")"]},de))]})]})]})]}),e.jsxs("div",{className:"flex flex-col sm:flex-row items-start sm:items-center justify-between gap-3 pt-4 border-t",children:[e.jsxs("div",{className:"flex items-center gap-4",children:[ve.size>0&&e.jsxs("span",{className:"text-sm text-muted-foreground",children:["已选择 ",ve.size," 个表情包"]}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(E,{className:"text-sm whitespace-nowrap",children:"卡片大小"}),e.jsxs(Ie,{value:K,onValueChange:de=>_e(de),children:[e.jsx($e,{className:"w-24",children:e.jsx(Pe,{})}),e.jsxs(Be,{children:[e.jsx(X,{value:"small",children:"小"}),e.jsx(X,{value:"medium",children:"中"}),e.jsx(X,{value:"large",children:"大"})]})]})]})]}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(E,{htmlFor:"emoji-page-size",className:"text-sm whitespace-nowrap",children:"每页显示"}),e.jsxs(Ie,{value:N.toString(),onValueChange:de=>{v(parseInt(de)),f(1),je(new Set)},children:[e.jsx($e,{id:"emoji-page-size",className:"w-20",children:e.jsx(Pe,{})}),e.jsxs(Be,{children:[e.jsx(X,{value:"20",children:"20"}),e.jsx(X,{value:"40",children:"40"}),e.jsx(X,{value:"60",children:"60"}),e.jsx(X,{value:"100",children:"100"})]})]}),ve.size>0&&e.jsxs(e.Fragment,{children:[e.jsx(_,{variant:"outline",size:"sm",onClick:()=>je(new Set),children:"取消选择"}),e.jsxs(_,{variant:"destructive",size:"sm",onClick:()=>V(!0),children:[e.jsx(ls,{className:"h-4 w-4 mr-1"}),"批量删除"]})]})]})]}),e.jsx("div",{className:"flex justify-end pt-4 border-t",children:e.jsxs(_,{variant:"outline",size:"sm",onClick:k,disabled:u,children:[e.jsx(dt,{className:`h-4 w-4 mr-2 ${u?"animate-spin":""}`}),"刷新"]})})]})]}),e.jsxs(Ce,{children:[e.jsxs(De,{children:[e.jsx(Le,{children:"表情包列表"}),e.jsxs(ws,{children:["共 ",p," 个表情包,当前第 ",h," 页"]})]}),e.jsxs(Ae,{children:[l.length===0?e.jsx("div",{className:"text-center py-12 text-muted-foreground",children:"暂无数据"}):e.jsx("div",{className:`grid gap-3 ${K==="small"?"grid-cols-3 sm:grid-cols-4 md:grid-cols-6 lg:grid-cols-8 xl:grid-cols-10":K==="medium"?"grid-cols-2 sm:grid-cols-3 md:grid-cols-4 lg:grid-cols-6 xl:grid-cols-8":"grid-cols-2 sm:grid-cols-2 md:grid-cols-3 lg:grid-cols-4 xl:grid-cols-5"}`,children:l.map(de=>e.jsxs("div",{className:`group relative rounded-lg border bg-card overflow-hidden hover:ring-2 hover:ring-primary transition-all cursor-pointer ${ve.has(de.id)?"ring-2 ring-primary bg-primary/5":""}`,onClick:()=>ee(de.id),children:[e.jsx("div",{className:`absolute top-1 left-1 z-10 transition-opacity ${ve.has(de.id)?"opacity-100":"opacity-0 group-hover:opacity-100"}`,children:e.jsx("div",{className:`w-5 h-5 rounded-full border-2 flex items-center justify-center ${ve.has(de.id)?"bg-primary border-primary text-primary-foreground":"bg-background/80 border-muted-foreground/50"}`,children:ve.has(de.id)&&e.jsx(pt,{className:"h-3 w-3"})})}),e.jsxs("div",{className:"absolute top-1 right-1 z-10 flex flex-col gap-0.5",children:[de.is_registered&&e.jsx(Se,{variant:"default",className:"bg-green-600 text-[10px] px-1 py-0",children:"已注册"}),de.is_banned&&e.jsx(Se,{variant:"destructive",className:"text-[10px] px-1 py-0",children:"已封禁"})]}),e.jsx("div",{className:`aspect-square bg-muted flex items-center justify-center overflow-hidden ${K==="small"?"p-1":K==="medium"?"p-2":"p-3"}`,children:e.jsx(c4,{src:g4(de.id),alt:"表情包"})}),e.jsxs("div",{className:`border-t bg-card ${K==="small"?"p-1":"p-2"}`,children:[e.jsxs("div",{className:"flex items-center justify-between gap-1 text-xs text-muted-foreground mb-1",children:[e.jsx(Se,{variant:"outline",className:"text-[10px] px-1 py-0",children:de.format.toUpperCase()}),e.jsxs("span",{className:"font-mono",children:[de.usage_count,"次"]})]}),e.jsxs("div",{className:`flex gap-1 justify-center opacity-0 group-hover:opacity-100 transition-opacity ${K==="small"?"flex-wrap":""}`,children:[e.jsx(_,{variant:"ghost",size:"icon",className:"h-6 w-6",onClick:Me=>{Me.stopPropagation(),Ee(de)},title:"编辑",children:e.jsx(qn,{className:"h-3 w-3"})}),e.jsx(_,{variant:"ghost",size:"icon",className:"h-6 w-6",onClick:Me=>{Me.stopPropagation(),se(de)},title:"详情",children:e.jsx(Ht,{className:"h-3 w-3"})}),!de.is_registered&&e.jsx(_,{variant:"ghost",size:"icon",className:"h-6 w-6 text-green-600 hover:text-green-700",onClick:Me=>{Me.stopPropagation(),ns(de)},title:"注册",children:e.jsx(pt,{className:"h-3 w-3"})}),!de.is_banned&&e.jsx(_,{variant:"ghost",size:"icon",className:"h-6 w-6 text-orange-600 hover:text-orange-700",onClick:Me=>{Me.stopPropagation(),Q(de)},title:"封禁",children:e.jsx(t_,{className:"h-3 w-3"})}),e.jsx(_,{variant:"ghost",size:"icon",className:"h-6 w-6 text-red-600 hover:text-red-700",onClick:Me=>{Me.stopPropagation(),Z(de)},title:"删除",children:e.jsx(ls,{className:"h-3 w-3"})})]})]})]},de.id))}),p>0&&e.jsxs("div",{className:"flex flex-col sm:flex-row items-center justify-between gap-4 mt-4",children:[e.jsxs("div",{className:"text-sm text-muted-foreground",children:["显示 ",(h-1)*N+1," 到"," ",Math.min(h*N,p)," 条,共 ",p," 条"]}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(_,{variant:"outline",size:"sm",onClick:()=>f(1),disabled:h===1,className:"hidden sm:flex",children:e.jsx(gn,{className:"h-4 w-4"})}),e.jsxs(_,{variant:"outline",size:"sm",onClick:()=>f(de=>Math.max(1,de-1)),disabled:h===1,children:[e.jsx(Aa,{className:"h-4 w-4 sm:mr-1"}),e.jsx("span",{className:"hidden sm:inline",children:"上一页"})]}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(le,{type:"number",value:B,onChange:de=>oe(de.target.value),onKeyDown:de=>de.key==="Enter"&&ie(),placeholder:h.toString(),className:"w-16 h-8 text-center",min:1,max:Math.ceil(p/N)}),e.jsx(_,{variant:"outline",size:"sm",onClick:ie,disabled:!B,className:"h-8",children:"跳转"})]}),e.jsxs(_,{variant:"outline",size:"sm",onClick:()=>f(de=>de+1),disabled:h>=Math.ceil(p/N),children:[e.jsx("span",{className:"hidden sm:inline",children:"下一页"}),e.jsx(Zt,{className:"h-4 w-4 sm:ml-1"})]}),e.jsx(_,{variant:"outline",size:"sm",onClick:()=>f(Math.ceil(p/N)),disabled:h>=Math.ceil(p/N),className:"hidden sm:flex",children:e.jsx(jn,{className:"h-4 w-4"})})]})]})]})]}),e.jsx(y4,{emoji:F,open:J,onOpenChange:U}),e.jsx(w4,{emoji:F,open:ue,onOpenChange:xe,onSuccess:()=>{k(),H()}}),e.jsx(_4,{open:pe,onOpenChange:ke,onSuccess:()=>{k(),H()}})]})}),e.jsx(vs,{open:z,onOpenChange:V,children:e.jsxs(ds,{children:[e.jsxs(us,{children:[e.jsx(xs,{children:"确认批量删除"}),e.jsxs(hs,{children:["你确定要删除选中的 ",ve.size," 个表情包吗?此操作不可撤销。"]})]}),e.jsxs(ms,{children:[e.jsx(ps,{children:"取消"}),e.jsx(fs,{onClick:Ue,children:"确认删除"})]})]})}),e.jsx(Is,{open:he,onOpenChange:ne,children:e.jsxs(Os,{children:[e.jsxs(Ds,{children:[e.jsx(Rs,{children:"确认删除"}),e.jsx(Ks,{children:"确定要删除这个表情包吗?此操作无法撤销。"})]}),e.jsxs(st,{children:[e.jsx(_,{variant:"outline",onClick:()=>ne(!1),children:"取消"}),e.jsx(_,{variant:"destructive",onClick:Oe,children:"删除"})]})]})})]})}function y4({emoji:l,open:n,onOpenChange:i}){if(!l)return null;const c=u=>u?new Date(u*1e3).toLocaleString("zh-CN"):"-";return e.jsx(Is,{open:n,onOpenChange:i,children:e.jsxs(Os,{className:"max-w-2xl max-h-[90vh]",children:[e.jsx(Ds,{children:e.jsx(Rs,{children:"表情包详情"})}),e.jsx(Ye,{className:"max-h-[calc(90vh-8rem)] pr-4",children:e.jsxs("div",{className:"space-y-4",children:[e.jsx("div",{className:"flex justify-center",children:e.jsx("div",{className:"w-32 h-32 bg-muted rounded-lg flex items-center justify-center overflow-hidden",children:e.jsx("img",{src:j4(l.id),alt:l.description||"表情包",className:"w-full h-full object-cover",onError:u=>{const x=u.target;x.style.display="none";const h=x.parentElement;h&&(h.innerHTML='')}})})}),e.jsxs("div",{className:"grid gap-4 sm:grid-cols-2",children:[e.jsxs("div",{children:[e.jsx(E,{className:"text-muted-foreground",children:"ID"}),e.jsx("div",{className:"mt-1 font-mono",children:l.id})]}),e.jsxs("div",{children:[e.jsx(E,{className:"text-muted-foreground",children:"格式"}),e.jsx("div",{className:"mt-1",children:e.jsx(Se,{variant:"outline",children:l.format.toUpperCase()})})]})]}),e.jsxs("div",{children:[e.jsx(E,{className:"text-muted-foreground",children:"文件路径"}),e.jsx("div",{className:"mt-1 font-mono text-sm break-all bg-muted p-2 rounded",children:l.full_path})]}),e.jsxs("div",{children:[e.jsx(E,{className:"text-muted-foreground",children:"哈希值"}),e.jsx("div",{className:"mt-1 font-mono text-sm break-all bg-muted p-2 rounded",children:l.emoji_hash})]}),e.jsxs("div",{children:[e.jsx(E,{className:"text-muted-foreground",children:"描述"}),l.description?e.jsx("div",{className:"mt-1 rounded-lg border bg-muted/50 p-3",children:e.jsx(o4,{className:"prose-sm",children:l.description})}):e.jsx("div",{className:"mt-1 text-sm text-muted-foreground",children:"-"})]}),e.jsxs("div",{children:[e.jsx(E,{className:"text-muted-foreground",children:"情绪"}),e.jsx("div",{className:"mt-1",children:l.emotion?e.jsx("span",{className:"text-sm",children:l.emotion}):e.jsx("span",{className:"text-sm text-muted-foreground",children:"-"})})]}),e.jsxs("div",{className:"grid gap-4 sm:grid-cols-2",children:[e.jsxs("div",{children:[e.jsx(E,{className:"text-muted-foreground",children:"状态"}),e.jsxs("div",{className:"mt-2 flex gap-2",children:[l.is_registered&&e.jsx(Se,{variant:"default",className:"bg-green-600",children:"已注册"}),l.is_banned&&e.jsx(Se,{variant:"destructive",children:"已封禁"}),!l.is_registered&&!l.is_banned&&e.jsx(Se,{variant:"outline",children:"未注册"})]})]}),e.jsxs("div",{children:[e.jsx(E,{className:"text-muted-foreground",children:"使用次数"}),e.jsx("div",{className:"mt-1 font-mono text-lg",children:l.usage_count})]})]}),e.jsxs("div",{className:"grid gap-4 sm:grid-cols-2",children:[e.jsxs("div",{children:[e.jsx(E,{className:"text-muted-foreground",children:"记录时间"}),e.jsx("div",{className:"mt-1 text-sm",children:c(l.record_time)})]}),e.jsxs("div",{children:[e.jsx(E,{className:"text-muted-foreground",children:"注册时间"}),e.jsx("div",{className:"mt-1 text-sm",children:c(l.register_time)})]})]}),e.jsxs("div",{children:[e.jsx(E,{className:"text-muted-foreground",children:"最后使用"}),e.jsx("div",{className:"mt-1 text-sm",children:c(l.last_used_time)})]})]})})]})})}function w4({emoji:l,open:n,onOpenChange:i,onSuccess:c}){const[u,x]=d.useState(""),[h,f]=d.useState(!1),[p,g]=d.useState(!1),[N,v]=d.useState(!1),{toast:y}=Zs();d.useEffect(()=>{l&&(x(l.emotion||""),f(l.is_registered),g(l.is_banned))},[l]);const w=async()=>{if(l)try{v(!0);const b=u.split(/[,,]/).map(R=>R.trim()).filter(Boolean).join(",");await m4(l.id,{emotion:b||void 0,is_registered:h,is_banned:p}),y({title:"成功",description:"表情包信息已更新"}),i(!1),c()}catch(b){const R=b instanceof Error?b.message:"保存失败";y({title:"错误",description:R,variant:"destructive"})}finally{v(!1)}};return l?e.jsx(Is,{open:n,onOpenChange:i,children:e.jsxs(Os,{className:"max-w-2xl",children:[e.jsxs(Ds,{children:[e.jsx(Rs,{children:"编辑表情包"}),e.jsx(Ks,{children:"修改表情包的情绪和状态信息"})]}),e.jsxs("div",{className:"space-y-4",children:[e.jsxs("div",{children:[e.jsx(E,{children:"情绪"}),e.jsx(ot,{value:u,onChange:b=>x(b.target.value),placeholder:"输入情绪描述...",rows:2,className:"mt-1"}),e.jsx("p",{className:"text-xs text-muted-foreground mt-1",children:"输入情绪相关的文本描述"})]}),e.jsxs("div",{className:"grid gap-4 sm:grid-cols-2",children:[e.jsxs("div",{className:"flex items-center space-x-2",children:[e.jsx(qs,{id:"is_registered",checked:h,onCheckedChange:b=>{b===!0?(f(!0),g(!1)):f(!1)}}),e.jsx(E,{htmlFor:"is_registered",className:"cursor-pointer",children:"已注册"})]}),e.jsxs("div",{className:"flex items-center space-x-2",children:[e.jsx(qs,{id:"is_banned",checked:p,onCheckedChange:b=>{b===!0?(g(!0),f(!1)):g(!1)}}),e.jsx(E,{htmlFor:"is_banned",className:"cursor-pointer",children:"已封禁"})]})]})]}),e.jsxs(st,{children:[e.jsx(_,{variant:"outline",onClick:()=>i(!1),children:"取消"}),e.jsx(_,{onClick:w,disabled:N,children:N?"保存中...":"保存"})]})]})}):null}function _4({open:l,onOpenChange:n,onSuccess:i}){const[c,u]=d.useState("select"),[x,h]=d.useState([]),[f,p]=d.useState(null),[g,N]=d.useState(!1),{toast:v}=Zs(),y=d.useMemo(()=>new U_({id:"emoji-uploader",autoProceed:!1,restrictions:{maxFileSize:10485760,allowedFileTypes:["image/jpeg","image/png","image/gif","image/webp"],maxNumberOfFiles:20},locale:{pluralize:()=>0,strings:{addMoreFiles:"添加更多文件",addingMoreFiles:"正在添加更多文件",allowedFileTypes:"允许的文件类型:%{types}",cancel:"取消",closeModal:"关闭",complete:"完成",connectedToInternet:"已连接到互联网",copyLink:"复制链接",copyLinkToClipboardFallback:"复制下方链接",copyLinkToClipboardSuccess:"链接已复制到剪贴板",dashboardTitle:"选择文件",dashboardWindowTitle:"文件选择窗口(按 ESC 关闭)",done:"完成",dropHereOr:"拖放文件到这里或 %{browse}",dropHint:"将文件拖放到此处",dropPasteFiles:"将文件拖放到这里或 %{browseFiles}",dropPasteFolders:"将文件拖放到这里或 %{browseFolders}",dropPasteBoth:"将文件拖放到这里,%{browseFiles} 或 %{browseFolders}",dropPasteImportFiles:"将文件拖放到这里,%{browseFiles} 或从以下位置导入:",dropPasteImportFolders:"将文件拖放到这里,%{browseFolders} 或从以下位置导入:",dropPasteImportBoth:"将文件拖放到这里,%{browseFiles},%{browseFolders} 或从以下位置导入:",editFile:"编辑文件",editing:"正在编辑 %{file}",emptyFolderAdded:"未从空文件夹添加文件",exceedsSize:"%{file} 超过了最大允许大小 %{size}",failedToUpload:"上传 %{file} 失败",fileSource:"文件来源:%{name}",filesUploadedOfTotal:{0:"已上传 %{complete} / %{smart_count} 个文件",1:"已上传 %{complete} / %{smart_count} 个文件"},filter:"筛选",finishEditingFile:"完成编辑文件",folderAdded:{0:"已从 %{folder} 添加 %{smart_count} 个文件",1:"已从 %{folder} 添加 %{smart_count} 个文件"},generatingThumbnails:"正在生成缩略图...",import:"导入",importFiles:"从以下位置导入文件:",importFrom:"从 %{name} 导入",loading:"加载中...",logOut:"登出",myDevice:"我的设备",noFilesFound:"这里没有文件或文件夹",noInternetConnection:"无网络连接",openFolderNamed:"打开文件夹 %{name}",pause:"暂停",pauseUpload:"暂停上传",paused:"已暂停",poweredBy:"技术支持:%{uppy}",processingXFiles:{0:"正在处理 %{smart_count} 个文件",1:"正在处理 %{smart_count} 个文件"},recording:"录制中",removeFile:"移除文件",resetFilter:"重置筛选",resume:"继续",resumeUpload:"继续上传",retry:"重试",retryUpload:"重试上传",save:"保存",saveChanges:"保存更改",selectFileNamed:"选择文件 %{name}",selectX:{0:"选择 %{smart_count}",1:"选择 %{smart_count}"},smile:"笑一个!",startRecording:"开始录制视频",stopRecording:"停止录制视频",takePicture:"拍照",timedOut:"上传已停滞 %{seconds} 秒,正在中止。",upload:"下一步",uploadComplete:"上传完成",uploadFailed:"上传失败",uploadPaused:"上传已暂停",uploadXFiles:{0:"下一步(%{smart_count} 个文件)",1:"下一步(%{smart_count} 个文件)"},uploadXNewFiles:{0:"下一步(+%{smart_count} 个文件)",1:"下一步(+%{smart_count} 个文件)"},uploading:"正在上传",uploadingXFiles:{0:"正在上传 %{smart_count} 个文件",1:"正在上传 %{smart_count} 个文件"},xFilesSelected:{0:"已选择 %{smart_count} 个文件",1:"已选择 %{smart_count} 个文件"},xMoreFilesAdded:{0:"又添加了 %{smart_count} 个文件",1:"又添加了 %{smart_count} 个文件"},xTimeLeft:"剩余 %{time}",youCanOnlyUploadFileTypes:"您只能上传:%{types}",youCanOnlyUploadX:{0:"您只能上传 %{smart_count} 个文件",1:"您只能上传 %{smart_count} 个文件"},youHaveToAtLeastSelectX:{0:"您至少需要选择 %{smart_count} 个文件",1:"您至少需要选择 %{smart_count} 个文件"},browseFiles:"浏览文件",browseFolders:"浏览文件夹",cancelUpload:"取消上传",addMore:"添加更多",back:"返回",editFileWithFilename:"编辑文件 %{file}"}}}),[]);d.useEffect(()=>{const F=()=>{const L=y.getFiles();if(L.length===0)return;const J=L.map(U=>({id:U.id,name:U.name,previewUrl:U.preview||URL.createObjectURL(U.data),emotion:"",description:"",isRegistered:!0,file:U.data}));h(J),L.length===1?(p(J[0].id),u("edit-single")):u("edit-multiple")};return y.on("upload",F),()=>{y.off("upload",F)}},[y]),d.useEffect(()=>{l||(y.cancelAll(),u("select"),h([]),p(null),N(!1))},[l,y]);const w=d.useCallback((F,L)=>{h(J=>J.map(U=>U.id===F?{...U,...L}:U))},[]),b=d.useCallback(F=>F.emotion.trim().length>0,[]),R=d.useMemo(()=>x.length>0&&x.every(b),[x,b]),D=d.useMemo(()=>x.find(F=>F.id===f)||null,[x,f]),S=d.useCallback(()=>{(c==="edit-single"||c==="edit-multiple")&&(u("select"),h([]),p(null))},[c]),P=d.useCallback(async()=>{if(!R){v({title:"请填写必填项",description:"每个表情包的情感标签都是必填的",variant:"destructive"});return}N(!0);let F=0,L=0;try{for(const J of x){const U=new FormData;U.append("file",J.file),U.append("emotion",J.emotion),U.append("description",J.description),U.append("is_registered",J.isRegistered.toString());try{(await we(N4(),{method:"POST",body:U})).ok?F++:L++}catch{L++}}L===0?(v({title:"上传成功",description:`成功上传 ${F} 个表情包`}),n(!1),i()):(v({title:"部分上传失败",description:`成功 ${F} 个,失败 ${L} 个`,variant:"destructive"}),i())}finally{N(!1)}},[R,x,v,n,i]),M=()=>e.jsx("div",{className:"space-y-4",children:e.jsx("div",{className:"border rounded-lg overflow-hidden w-full",children:e.jsx(i4,{uppy:y,proudlyDisplayPoweredByUppy:!1,hideProgressDetails:!0,height:350,width:"100%",theme:"auto",note:"支持 JPG、PNG、GIF、WebP 格式,最多 20 个文件"})})}),T=()=>{const F=x[0];return F?e.jsxs("div",{className:"space-y-4",children:[e.jsxs("div",{className:"flex items-center gap-4",children:[e.jsxs(_,{variant:"ghost",size:"sm",onClick:S,children:[e.jsx(Ta,{className:"h-4 w-4 mr-1"}),"返回"]}),e.jsx("span",{className:"text-sm text-muted-foreground",children:"编辑表情包信息"})]}),e.jsxs("div",{className:"flex gap-6",children:[e.jsxs("div",{className:"flex-shrink-0",children:[e.jsx("div",{className:"w-32 h-32 rounded-lg border overflow-hidden bg-muted flex items-center justify-center",children:e.jsx("img",{src:F.previewUrl,alt:F.name,className:"max-w-full max-h-full object-contain"})}),e.jsx("p",{className:"text-xs text-muted-foreground mt-2 text-center truncate max-w-32",children:F.name})]}),e.jsxs("div",{className:"flex-1 space-y-4",children:[e.jsxs("div",{className:"space-y-2",children:[e.jsxs(E,{htmlFor:"single-emotion",children:["情感标签 ",e.jsx("span",{className:"text-destructive",children:"*"})]}),e.jsx(le,{id:"single-emotion",value:F.emotion,onChange:L=>w(F.id,{emotion:L.target.value}),placeholder:"多个标签用逗号分隔,如:开心,高兴",className:F.emotion.trim()?"":"border-destructive"}),e.jsx("p",{className:"text-xs text-muted-foreground",children:"用于情感匹配,多个标签用逗号分隔"})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsx(E,{htmlFor:"single-description",children:"描述"}),e.jsx(le,{id:"single-description",value:F.description,onChange:L=>w(F.id,{description:L.target.value}),placeholder:"输入表情包描述..."})]}),e.jsxs("div",{className:"flex items-center space-x-2",children:[e.jsx(qs,{id:"single-is-registered",checked:F.isRegistered,onCheckedChange:L=>w(F.id,{isRegistered:L===!0})}),e.jsx(E,{htmlFor:"single-is-registered",className:"cursor-pointer",children:"上传后立即注册(可被麦麦使用)"})]})]})]}),e.jsx(st,{children:e.jsx(_,{onClick:P,disabled:!R||g,children:g?"上传中...":"上传"})})]}):null},A=()=>{const F=x.filter(b).length,L=x.length;return e.jsxs("div",{className:"space-y-4",children:[e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsxs("div",{className:"flex items-center gap-4",children:[e.jsxs(_,{variant:"ghost",size:"sm",onClick:S,children:[e.jsx(Ta,{className:"h-4 w-4 mr-1"}),"返回"]}),e.jsxs("span",{className:"text-sm text-muted-foreground",children:["编辑表情包信息(",F,"/",L," 已完成)"]})]}),e.jsx(Se,{variant:R?"default":"secondary",children:R?e.jsxs(e.Fragment,{children:[e.jsx(Ct,{className:"h-3 w-3 mr-1"}),"全部完成"]}):e.jsxs(e.Fragment,{children:[e.jsx(Ea,{className:"h-3 w-3 mr-1"}),"未完成"]})})]}),e.jsxs("div",{className:"grid grid-cols-2 gap-4",children:[e.jsx(Ye,{className:"h-[350px] pr-2",children:e.jsx("div",{className:"space-y-2",children:x.map(J=>{const U=b(J),ue=f===J.id;return e.jsxs("div",{onClick:()=>p(J.id),className:` flex items-center gap-3 p-3 rounded-lg border-2 cursor-pointer transition-all ${ue?"ring-2 ring-primary":""} ${U?"border-green-500 bg-green-50 dark:bg-green-950/20":"border-border hover:border-muted-foreground/50"} - `,children:[e.jsx("div",{className:"w-12 h-12 rounded border overflow-hidden bg-muted flex-shrink-0 flex items-center justify-center",children:e.jsx("img",{src:J.previewUrl,alt:J.name,className:"max-w-full max-h-full object-contain"})}),e.jsxs("div",{className:"flex-1 min-w-0",children:[e.jsx("p",{className:"text-sm font-medium truncate",children:J.name}),e.jsx("p",{className:"text-xs text-muted-foreground truncate",children:J.emotion||"未填写情感标签"})]}),U?e.jsx(pt,{className:"h-5 w-5 text-green-500 flex-shrink-0"}):e.jsx("div",{className:"h-5 w-5 rounded-full border-2 border-muted-foreground/30 flex-shrink-0"})]},J.id)})})}),e.jsx("div",{className:"border rounded-lg p-4",children:D?e.jsxs("div",{className:"space-y-4",children:[e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx("div",{className:"w-16 h-16 rounded border overflow-hidden bg-muted flex items-center justify-center",children:e.jsx("img",{src:D.previewUrl,alt:D.name,className:"max-w-full max-h-full object-contain"})}),e.jsxs("div",{className:"flex-1 min-w-0",children:[e.jsx("p",{className:"font-medium truncate",children:D.name}),b(D)&&e.jsxs(Se,{variant:"outline",className:"text-green-600 border-green-600",children:[e.jsx(kt,{className:"h-3 w-3 mr-1"}),"已完成"]})]})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsxs(E,{htmlFor:"multi-emotion",children:["情感标签 ",e.jsx("span",{className:"text-destructive",children:"*"})]}),e.jsx(le,{id:"multi-emotion",value:D.emotion,onChange:J=>w(D.id,{emotion:J.target.value}),placeholder:"多个标签用逗号分隔,如:开心,高兴",className:D.emotion.trim()?"":"border-destructive"})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsx(E,{htmlFor:"multi-description",children:"描述"}),e.jsx(le,{id:"multi-description",value:D.description,onChange:J=>w(D.id,{description:J.target.value}),placeholder:"输入表情包描述..."})]}),e.jsxs("div",{className:"flex items-center space-x-2",children:[e.jsx(qs,{id:"multi-is-registered",checked:D.isRegistered,onCheckedChange:J=>w(D.id,{isRegistered:J===!0})}),e.jsx(E,{htmlFor:"multi-is-registered",className:"cursor-pointer text-sm",children:"上传后立即注册"})]})]}):e.jsx("div",{className:"h-full flex items-center justify-center text-muted-foreground",children:e.jsxs("div",{className:"text-center",children:[e.jsx(Jm,{className:"h-12 w-12 mx-auto mb-2 opacity-50"}),e.jsx("p",{children:"点击左侧卡片编辑"})]})})})]}),e.jsx(st,{children:e.jsx(_,{onClick:P,disabled:!R||g,children:g?"上传中...":`上传全部 (${L})`})})]})};return e.jsx(Is,{open:l,onOpenChange:n,children:e.jsxs(Os,{className:"max-w-3xl max-h-[90vh] overflow-hidden",children:[e.jsxs(Ds,{children:[e.jsxs(Rs,{className:"flex items-center gap-2",children:[e.jsx(ec,{className:"h-5 w-5"}),c==="select"&&"上传表情包 - 选择文件",c==="edit-single"&&"上传表情包 - 填写信息",c==="edit-multiple"&&"上传表情包 - 批量编辑"]}),e.jsxs(Ks,{children:[c==="select"&&"支持 JPG、PNG、GIF、WebP 格式,单个文件最大 10MB,可同时上传多个文件",c==="edit-single"&&"请填写表情包的情感标签(必填)和描述",c==="edit-multiple"&&"点击左侧卡片编辑每个表情包的信息,情感标签为必填项"]})]}),e.jsxs("div",{className:"overflow-y-auto pr-1",children:[c==="select"&&M(),c==="edit-single"&&T(),c==="edit-multiple"&&A()]})]})})}function S4(){const[l,n]=d.useState([]),[i,c]=d.useState(!0),[u,x]=d.useState(0),[h,f]=d.useState(1),[p,g]=d.useState(20),[N,v]=d.useState(""),[y,w]=d.useState(null),[b,R]=d.useState(!1),[D,S]=d.useState(!1),[P,M]=d.useState(!1),[T,A]=d.useState(null),[F,L]=d.useState(new Set),[J,U]=d.useState(!1),[ue,xe]=d.useState(""),[he,ne]=d.useState({total:0,recent_7days:0,chat_count:0,top_chats:{}}),[ve,je]=d.useState([]),[z,V]=d.useState(new Map),[B,oe]=d.useState(!1),[K,_e]=d.useState(0),{toast:pe}=Zs(),ke=async()=>{try{c(!0);const ie=await j1({page:h,page_size:p,search:N||void 0});n(ie.data),x(ie.total)}catch(ie){pe({title:"加载失败",description:ie instanceof Error?ie.message:"无法加载表达方式",variant:"destructive"})}finally{c(!1)}},O=async()=>{try{const ie=await _1();ie?.data&&ne(ie.data)}catch(ie){console.error("加载统计数据失败:",ie)}},k=async()=>{try{const ie=await Wm();_e(ie.unchecked)}catch(ie){console.error("加载审核统计失败:",ie)}},H=async()=>{try{const ie=await Zm();if(ie?.data){je(ie.data);const Te=new Map;ie.data.forEach(de=>{Te.set(de.chat_id,de.chat_name)}),V(Te)}}catch(ie){console.error("加载聊天列表失败:",ie)}},se=ie=>z.get(ie)||ie;d.useEffect(()=>{ke(),k(),O(),H()},[h,p,N]);const Ee=async ie=>{try{const Te=await v1(ie.id);w(Te.data),R(!0)}catch(Te){pe({title:"加载详情失败",description:Te instanceof Error?Te.message:"无法加载表达方式详情",variant:"destructive"})}},Z=ie=>{w(ie),S(!0)},Oe=async ie=>{try{await y1(ie.id),pe({title:"删除成功",description:`已删除表达方式: ${ie.situation}`}),A(null),ke(),O()}catch(Te){pe({title:"删除失败",description:Te instanceof Error?Te.message:"无法删除表达方式",variant:"destructive"})}},ns=ie=>{const Te=new Set(F);Te.has(ie)?Te.delete(ie):Te.add(ie),L(Te)},Q=()=>{F.size===l.length&&l.length>0?L(new Set):L(new Set(l.map(ie=>ie.id)))},ee=async()=>{try{await w1(Array.from(F)),pe({title:"批量删除成功",description:`已删除 ${F.size} 个表达方式`}),L(new Set),U(!1),ke(),O()}catch(ie){pe({title:"批量删除失败",description:ie instanceof Error?ie.message:"无法批量删除表达方式",variant:"destructive"})}},Ue=()=>{const ie=parseInt(ue),Te=Math.ceil(u/p);ie>=1&&ie<=Te?(f(ie),xe("")):pe({title:"无效的页码",description:`请输入1-${Te}之间的页码`,variant:"destructive"})};return e.jsxs("div",{className:"h-[calc(100vh-4rem)] flex flex-col p-4 sm:p-6",children:[e.jsx("div",{className:"mb-4 sm:mb-6",children:e.jsxs("div",{className:"flex flex-col sm:flex-row sm:items-center justify-between gap-4",children:[e.jsxs("div",{children:[e.jsxs("h1",{className:"text-2xl sm:text-3xl font-bold flex items-center gap-2",children:[e.jsx(Ea,{className:"h-8 w-8",strokeWidth:2}),"表达方式管理"]}),e.jsx("p",{className:"text-muted-foreground mt-1 text-sm sm:text-base",children:"管理麦麦的表达方式和话术模板"})]}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsxs(_,{variant:"outline",onClick:()=>oe(!0),className:"gap-2",children:[e.jsx(Aj,{className:"h-4 w-4"}),"人工审核",K>0&&e.jsx("span",{className:"ml-1 px-1.5 py-0.5 text-xs rounded-full bg-orange-500 text-white",children:K>99?"99+":K})]}),e.jsxs(_,{onClick:()=>M(!0),className:"gap-2",children:[e.jsx(et,{className:"h-4 w-4"}),"新增表达方式"]})]})]})}),e.jsx(Ye,{className:"flex-1",children:e.jsxs("div",{className:"space-y-4 sm:space-y-6 pr-4",children:[e.jsxs("div",{className:"grid grid-cols-1 sm:grid-cols-3 gap-4",children:[e.jsxs("div",{className:"rounded-lg border bg-card p-4",children:[e.jsx("div",{className:"text-sm text-muted-foreground",children:"总数量"}),e.jsx("div",{className:"text-2xl font-bold mt-1",children:he.total})]}),e.jsxs("div",{className:"rounded-lg border bg-card p-4",children:[e.jsx("div",{className:"text-sm text-muted-foreground",children:"近7天新增"}),e.jsx("div",{className:"text-2xl font-bold mt-1 text-green-600",children:he.recent_7days})]}),e.jsxs("div",{className:"rounded-lg border bg-card p-4",children:[e.jsx("div",{className:"text-sm text-muted-foreground",children:"关联聊天数"}),e.jsx("div",{className:"text-2xl font-bold mt-1 text-blue-600",children:he.chat_count})]})]}),e.jsxs("div",{className:"rounded-lg border bg-card p-4",children:[e.jsx(E,{htmlFor:"search",children:"搜索"}),e.jsx("div",{className:"flex flex-col sm:flex-row gap-2 mt-1.5",children:e.jsxs("div",{className:"flex-1 relative",children:[e.jsx(Ct,{className:"absolute left-2.5 top-2.5 h-4 w-4 text-muted-foreground"}),e.jsx(le,{id:"search",placeholder:"搜索情境、风格或上下文...",value:N,onChange:ie=>v(ie.target.value),className:"pl-9"})]})}),e.jsxs("div",{className:"flex flex-col sm:flex-row items-start sm:items-center justify-between gap-3 mt-4 pt-4 border-t",children:[e.jsx("div",{className:"flex items-center gap-2 text-sm text-muted-foreground",children:F.size>0&&e.jsxs("span",{children:["已选择 ",F.size," 个表达方式"]})}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(E,{htmlFor:"page-size",className:"text-sm whitespace-nowrap",children:"每页显示"}),e.jsxs(Ie,{value:p.toString(),onValueChange:ie=>{g(parseInt(ie)),f(1),L(new Set)},children:[e.jsx($e,{id:"page-size",className:"w-20",children:e.jsx(Pe,{})}),e.jsxs(Be,{children:[e.jsx(X,{value:"10",children:"10"}),e.jsx(X,{value:"20",children:"20"}),e.jsx(X,{value:"50",children:"50"}),e.jsx(X,{value:"100",children:"100"})]})]}),F.size>0&&e.jsxs(e.Fragment,{children:[e.jsx(_,{variant:"outline",size:"sm",onClick:()=>L(new Set),children:"取消选择"}),e.jsxs(_,{variant:"destructive",size:"sm",onClick:()=>U(!0),children:[e.jsx(ls,{className:"h-4 w-4 mr-1"}),"批量删除"]})]})]})]})]}),e.jsxs("div",{className:"rounded-lg border bg-card",children:[e.jsx("div",{className:"hidden md:block",children:e.jsxs(Rl,{children:[e.jsx(Ll,{children:e.jsxs(ut,{children:[e.jsx(Ze,{className:"w-12",children:e.jsx(qs,{checked:F.size===l.length&&l.length>0,onCheckedChange:Q})}),e.jsx(Ze,{children:"情境"}),e.jsx(Ze,{children:"风格"}),e.jsx(Ze,{children:"聊天"}),e.jsx(Ze,{className:"text-right",children:"操作"})]})}),e.jsx(Ul,{children:i?e.jsx(ut,{children:e.jsx(qe,{colSpan:5,className:"text-center py-8 text-muted-foreground",children:"加载中..."})}):l.length===0?e.jsx(ut,{children:e.jsx(qe,{colSpan:5,className:"text-center py-8 text-muted-foreground",children:"暂无数据"})}):l.map(ie=>e.jsxs(ut,{children:[e.jsx(qe,{children:e.jsx(qs,{checked:F.has(ie.id),onCheckedChange:()=>ns(ie.id)})}),e.jsx(qe,{className:"font-medium max-w-xs truncate",children:ie.situation}),e.jsx(qe,{className:"max-w-xs truncate",children:ie.style}),e.jsx(qe,{className:"max-w-[200px] truncate",title:se(ie.chat_id),style:{wordBreak:"keep-all"},children:e.jsx("span",{className:"whitespace-nowrap overflow-hidden text-ellipsis block",children:se(ie.chat_id)})}),e.jsx(qe,{className:"text-right",children:e.jsxs("div",{className:"flex justify-end gap-2",children:[e.jsxs(_,{variant:"default",size:"sm",onClick:()=>Z(ie),children:[e.jsx(qn,{className:"h-4 w-4 mr-1"}),"编辑"]}),e.jsx(_,{variant:"outline",size:"icon",className:"h-8 w-8",onClick:()=>Ee(ie),title:"查看详情",children:e.jsx(ia,{className:"h-4 w-4"})}),e.jsxs(_,{size:"sm",onClick:()=>A(ie),className:"bg-red-600 hover:bg-red-700 text-white",children:[e.jsx(ls,{className:"h-4 w-4 mr-1"}),"删除"]})]})})]},ie.id))})]})}),e.jsx("div",{className:"md:hidden space-y-3 p-4",children:i?e.jsx("div",{className:"text-center py-8 text-muted-foreground",children:"加载中..."}):l.length===0?e.jsx("div",{className:"text-center py-8 text-muted-foreground",children:"暂无数据"}):l.map(ie=>e.jsxs("div",{className:"rounded-lg border bg-card p-4 space-y-3 overflow-hidden",children:[e.jsxs("div",{className:"flex items-start gap-3",children:[e.jsx(qs,{checked:F.has(ie.id),onCheckedChange:()=>ns(ie.id),className:"mt-1"}),e.jsxs("div",{className:"min-w-0 flex-1 overflow-hidden space-y-2",children:[e.jsxs("div",{children:[e.jsx("div",{className:"text-xs text-muted-foreground mb-1",children:"情境"}),e.jsx("h3",{className:"font-semibold text-sm line-clamp-2 w-full break-all",title:ie.situation,children:ie.situation})]}),e.jsxs("div",{children:[e.jsx("div",{className:"text-xs text-muted-foreground mb-1",children:"风格"}),e.jsx("p",{className:"text-sm line-clamp-2 w-full break-all",title:ie.style,children:ie.style})]})]})]}),e.jsxs("div",{className:"text-sm",children:[e.jsx("div",{className:"text-xs text-muted-foreground mb-1",children:"聊天"}),e.jsx("p",{className:"text-sm truncate",title:se(ie.chat_id),style:{wordBreak:"keep-all"},children:se(ie.chat_id)})]}),e.jsxs("div",{className:"flex flex-wrap gap-1 pt-2 border-t overflow-hidden",children:[e.jsxs(_,{variant:"outline",size:"sm",onClick:()=>Z(ie),className:"text-xs px-2 py-1 h-auto flex-shrink-0",children:[e.jsx(qn,{className:"h-3 w-3 mr-1"}),"编辑"]}),e.jsx(_,{variant:"outline",size:"sm",onClick:()=>Ee(ie),className:"text-xs px-2 py-1 h-auto flex-shrink-0",children:e.jsx(ia,{className:"h-3 w-3"})}),e.jsxs(_,{variant:"outline",size:"sm",onClick:()=>A(ie),className:"text-xs px-2 py-1 h-auto flex-shrink-0 text-destructive hover:text-destructive",children:[e.jsx(ls,{className:"h-3 w-3 mr-1"}),"删除"]})]})]},ie.id))}),u>0&&e.jsxs("div",{className:"flex flex-col sm:flex-row items-center justify-between gap-4 px-4 py-3 border-t",children:[e.jsxs("div",{className:"text-sm text-muted-foreground",children:["共 ",u," 条记录,第 ",h," / ",Math.ceil(u/p)," 页"]}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(_,{variant:"outline",size:"sm",onClick:()=>f(1),disabled:h===1,className:"hidden sm:flex",children:e.jsx(gn,{className:"h-4 w-4"})}),e.jsxs(_,{variant:"outline",size:"sm",onClick:()=>f(h-1),disabled:h===1,children:[e.jsx(za,{className:"h-4 w-4 sm:mr-1"}),e.jsx("span",{className:"hidden sm:inline",children:"上一页"})]}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(le,{type:"number",value:ue,onChange:ie=>xe(ie.target.value),onKeyDown:ie=>ie.key==="Enter"&&Ue(),placeholder:h.toString(),className:"w-16 h-8 text-center",min:1,max:Math.ceil(u/p)}),e.jsx(_,{variant:"outline",size:"sm",onClick:Ue,disabled:!ue,className:"h-8",children:"跳转"})]}),e.jsxs(_,{variant:"outline",size:"sm",onClick:()=>f(h+1),disabled:h>=Math.ceil(u/p),children:[e.jsx("span",{className:"hidden sm:inline",children:"下一页"}),e.jsx(Zt,{className:"h-4 w-4 sm:ml-1"})]}),e.jsx(_,{variant:"outline",size:"sm",onClick:()=>f(Math.ceil(u/p)),disabled:h>=Math.ceil(u/p),className:"hidden sm:flex",children:e.jsx(jn,{className:"h-4 w-4"})})]})]})]})]})}),e.jsx(k4,{expression:y,open:b,onOpenChange:R,chatNameMap:z}),e.jsx(C4,{open:P,onOpenChange:M,chatList:ve,onSuccess:()=>{ke(),O(),M(!1)}}),e.jsx(T4,{expression:y,open:D,onOpenChange:S,chatList:ve,onSuccess:()=>{ke(),O(),S(!1)}}),e.jsx(vs,{open:!!T,onOpenChange:()=>A(null),children:e.jsxs(ds,{children:[e.jsxs(us,{children:[e.jsx(xs,{children:"确认删除"}),e.jsxs(hs,{children:['确定要删除表达方式 "',T?.situation,'" 吗? 此操作不可撤销。']})]}),e.jsxs(ms,{children:[e.jsx(ps,{children:"取消"}),e.jsx(fs,{onClick:()=>T&&Oe(T),className:"bg-destructive text-destructive-foreground hover:bg-destructive/90",children:"删除"})]})]})}),e.jsx(E4,{open:J,onOpenChange:U,onConfirm:ee,count:F.size}),e.jsx(cv,{open:B,onOpenChange:ie=>{oe(ie),ie||(ke(),O(),k())}})]})}function k4({expression:l,open:n,onOpenChange:i,chatNameMap:c}){if(!l)return null;const u=h=>h?new Date(h*1e3).toLocaleString("zh-CN"):"-",x=h=>c.get(h)||h;return e.jsx(Is,{open:n,onOpenChange:i,children:e.jsxs(Os,{className:"max-w-2xl max-h-[80vh] overflow-y-auto",children:[e.jsxs(Ds,{children:[e.jsx(Rs,{children:"表达方式详情"}),e.jsx(Ks,{children:"查看表达方式的完整信息"})]}),e.jsxs("div",{className:"space-y-4",children:[e.jsxs("div",{className:"grid grid-cols-2 gap-4",children:[e.jsx(Pi,{label:"情境",value:l.situation}),e.jsx(Pi,{label:"风格",value:l.style}),e.jsx(Pi,{label:"聊天",value:x(l.chat_id)}),e.jsx(Pi,{icon:Gr,label:"记录ID",value:l.id.toString(),mono:!0})]}),e.jsx("div",{className:"grid grid-cols-2 gap-4",children:e.jsx(Pi,{icon:na,label:"创建时间",value:u(l.create_date)})}),e.jsxs("div",{className:"rounded-lg border bg-muted/50 p-4",children:[e.jsx(E,{className:"text-xs text-muted-foreground mb-3 block",children:"状态标记"}),e.jsxs("div",{className:"grid grid-cols-2 gap-4",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("div",{className:I("flex h-8 w-8 items-center justify-center rounded-full",l.checked?"bg-green-100 text-green-700 dark:bg-green-900/30 dark:text-green-400":"bg-gray-100 text-gray-400 dark:bg-gray-800 dark:text-gray-600"),children:l.checked?e.jsx(pt,{className:"h-5 w-5"}):e.jsx(Lo,{className:"h-5 w-5"})}),e.jsxs("div",{children:[e.jsx("p",{className:"text-sm font-medium",children:"已检查"}),e.jsx("p",{className:"text-xs text-muted-foreground",children:l.checked?"已通过AI检查":"未检查"})]})]}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("div",{className:I("flex h-8 w-8 items-center justify-center rounded-full",l.rejected?"bg-red-100 text-red-700 dark:bg-red-900/30 dark:text-red-400":"bg-gray-100 text-gray-400 dark:bg-gray-800 dark:text-gray-600"),children:l.rejected?e.jsx(Ga,{className:"h-5 w-5"}):e.jsx(Lo,{className:"h-5 w-5"})}),e.jsxs("div",{children:[e.jsx("p",{className:"text-sm font-medium",children:"已拒绝"}),e.jsx("p",{className:"text-xs text-muted-foreground",children:l.rejected?"已拒绝":"正常"})]})]})]})]})]}),e.jsx(st,{children:e.jsx(_,{onClick:()=>i(!1),children:"关闭"})})]})})}function Pi({icon:l,label:n,value:i,mono:c=!1}){return e.jsxs("div",{className:"space-y-1",children:[e.jsxs(E,{className:"text-xs text-muted-foreground flex items-center gap-1",children:[l&&e.jsx(l,{className:"h-3 w-3"}),n]}),e.jsx("div",{className:I("text-sm",c&&"font-mono",!i&&"text-muted-foreground"),children:i||"-"})]})}function C4({open:l,onOpenChange:n,chatList:i,onSuccess:c}){const[u,x]=d.useState({situation:"",style:"",chat_id:""}),[h,f]=d.useState(!1),{toast:p}=Zs(),g=async()=>{if(!u.situation||!u.style||!u.chat_id){p({title:"验证失败",description:"请填写必填字段:情境、风格和聊天",variant:"destructive"});return}try{f(!0),await N1(u),p({title:"创建成功",description:"表达方式已创建"}),x({situation:"",style:"",chat_id:""}),c()}catch(N){p({title:"创建失败",description:N instanceof Error?N.message:"无法创建表达方式",variant:"destructive"})}finally{f(!1)}};return e.jsx(Is,{open:l,onOpenChange:n,children:e.jsxs(Os,{className:"max-w-2xl max-h-[80vh] overflow-y-auto",children:[e.jsxs(Ds,{children:[e.jsx(Rs,{children:"新增表达方式"}),e.jsx(Ks,{children:"创建新的表达方式记录"})]}),e.jsxs("div",{className:"space-y-4",children:[e.jsxs("div",{className:"grid grid-cols-2 gap-4",children:[e.jsxs("div",{className:"space-y-2",children:[e.jsxs(E,{htmlFor:"situation",children:["情境 ",e.jsx("span",{className:"text-destructive",children:"*"})]}),e.jsx(le,{id:"situation",value:u.situation,onChange:N=>x({...u,situation:N.target.value}),placeholder:"描述使用场景"})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsxs(E,{htmlFor:"style",children:["风格 ",e.jsx("span",{className:"text-destructive",children:"*"})]}),e.jsx(le,{id:"style",value:u.style,onChange:N=>x({...u,style:N.target.value}),placeholder:"描述表达风格"})]})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsxs(E,{htmlFor:"chat_id",children:["聊天 ",e.jsx("span",{className:"text-destructive",children:"*"})]}),e.jsxs(Ie,{value:u.chat_id,onValueChange:N=>x({...u,chat_id:N}),children:[e.jsx($e,{children:e.jsx(Pe,{placeholder:"选择关联的聊天"})}),e.jsx(Be,{children:i.map(N=>e.jsx(X,{value:N.chat_id,children:e.jsxs("span",{className:"truncate",style:{wordBreak:"keep-all"},children:[N.chat_name,N.is_group&&e.jsx("span",{className:"text-muted-foreground ml-1",children:"(群聊)"})]})},N.chat_id))})]})]})]}),e.jsxs(st,{children:[e.jsx(_,{variant:"outline",onClick:()=>n(!1),children:"取消"}),e.jsx(_,{onClick:g,disabled:h,children:h?"创建中...":"创建"})]})]})})}function T4({expression:l,open:n,onOpenChange:i,chatList:c,onSuccess:u}){const[x,h]=d.useState({}),[f,p]=d.useState(!1),{toast:g}=Zs();d.useEffect(()=>{l&&h({situation:l.situation,style:l.style,chat_id:l.chat_id,checked:l.checked,rejected:l.rejected})},[l]);const N=async()=>{if(l)try{p(!0),await b1(l.id,x),g({title:"保存成功",description:"表达方式已更新"}),u()}catch(v){g({title:"保存失败",description:v instanceof Error?v.message:"无法更新表达方式",variant:"destructive"})}finally{p(!1)}};return l?e.jsx(Is,{open:n,onOpenChange:i,children:e.jsxs(Os,{className:"max-w-2xl max-h-[80vh] overflow-y-auto",children:[e.jsxs(Ds,{children:[e.jsx(Rs,{children:"编辑表达方式"}),e.jsx(Ks,{children:"修改表达方式的信息"})]}),e.jsxs("div",{className:"space-y-4",children:[e.jsxs("div",{className:"grid grid-cols-2 gap-4",children:[e.jsxs("div",{className:"space-y-2",children:[e.jsx(E,{htmlFor:"edit_situation",children:"情境"}),e.jsx(le,{id:"edit_situation",value:x.situation||"",onChange:v=>h({...x,situation:v.target.value}),placeholder:"描述使用场景"})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsx(E,{htmlFor:"edit_style",children:"风格"}),e.jsx(le,{id:"edit_style",value:x.style||"",onChange:v=>h({...x,style:v.target.value}),placeholder:"描述表达风格"})]})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsx(E,{htmlFor:"edit_chat_id",children:"聊天"}),e.jsxs(Ie,{value:x.chat_id||"",onValueChange:v=>h({...x,chat_id:v}),children:[e.jsx($e,{children:e.jsx(Pe,{placeholder:"选择关联的聊天"})}),e.jsx(Be,{children:c.map(v=>e.jsx(X,{value:v.chat_id,children:e.jsxs("span",{className:"truncate",style:{wordBreak:"keep-all"},children:[v.chat_name,v.is_group&&e.jsx("span",{className:"text-muted-foreground ml-1",children:"(群聊)"})]})},v.chat_id))})]})]}),e.jsxs(at,{children:[e.jsx(Ht,{className:"h-4 w-4"}),e.jsx(lt,{className:"text-xs",children:e.jsxs("div",{className:"space-y-1",children:[e.jsx("p",{children:e.jsx("strong",{children:"状态标记说明:"})}),e.jsx("p",{children:"• 已检查:表示该表达方式已通过AI自动检查"}),e.jsx("p",{children:"• 已拒绝:表示该表达方式被标记为不合适"}),e.jsxs("p",{className:"text-muted-foreground mt-2",children:['根据配置中的"仅使用已检查的表达方式"设置:',e.jsx("br",{}),'• 开启时:只使用"已检查=是"且"已拒绝=否"的表达方式',e.jsx("br",{}),'• 关闭时:使用所有"已拒绝=否"的表达方式(不看已检查状态)']})]})})]}),e.jsxs("div",{className:"grid grid-cols-2 gap-4",children:[e.jsxs("div",{className:"flex items-center justify-between space-x-2 rounded-lg border p-4",children:[e.jsxs("div",{className:"space-y-0.5",children:[e.jsx(E,{htmlFor:"edit_checked",className:"text-sm font-medium",children:"已检查"}),e.jsx("p",{className:"text-xs text-muted-foreground",children:"通过AI自动检查"})]}),e.jsx(Fe,{id:"edit_checked",checked:x.checked??!1,onCheckedChange:v=>h({...x,checked:v})})]}),e.jsxs("div",{className:"flex items-center justify-between space-x-2 rounded-lg border p-4",children:[e.jsxs("div",{className:"space-y-0.5",children:[e.jsx(E,{htmlFor:"edit_rejected",className:"text-sm font-medium",children:"已拒绝"}),e.jsx("p",{className:"text-xs text-muted-foreground",children:"标记为已拒绝"})]}),e.jsx(Fe,{id:"edit_rejected",checked:x.rejected??!1,onCheckedChange:v=>h({...x,rejected:v})})]})]})]}),e.jsxs(st,{children:[e.jsx(_,{variant:"outline",onClick:()=>i(!1),children:"取消"}),e.jsx(_,{onClick:N,disabled:f,children:f?"保存中...":"保存"})]})]})}):null}function E4({open:l,onOpenChange:n,onConfirm:i,count:c}){return e.jsx(vs,{open:l,onOpenChange:n,children:e.jsxs(ds,{children:[e.jsxs(us,{children:[e.jsx(xs,{children:"确认批量删除"}),e.jsxs(hs,{children:["您即将删除 ",c," 个表达方式,此操作无法撤销。确定要继续吗?"]})]}),e.jsxs(ms,{children:[e.jsx(ps,{children:"取消"}),e.jsx(fs,{onClick:i,className:"bg-destructive text-destructive-foreground hover:bg-destructive/90",children:"确认删除"})]})]})})}const $l="/api/webui/jargon";async function M4(){const l=await we(`${$l}/chats`,{});if(!l.ok){const n=await l.json();throw new Error(n.detail||"获取聊天列表失败")}return l.json()}async function z4(l){const n=new URLSearchParams;l.page&&n.append("page",l.page.toString()),l.page_size&&n.append("page_size",l.page_size.toString()),l.search&&n.append("search",l.search),l.chat_id&&n.append("chat_id",l.chat_id),l.is_jargon!==void 0&&l.is_jargon!==null&&n.append("is_jargon",l.is_jargon.toString()),l.is_global!==void 0&&n.append("is_global",l.is_global.toString());const i=await we(`${$l}/list?${n}`,{});if(!i.ok){const c=await i.json();throw new Error(c.detail||"获取黑话列表失败")}return i.json()}async function A4(l){const n=await we(`${$l}/${l}`,{});if(!n.ok){const i=await n.json();throw new Error(i.detail||"获取黑话详情失败")}return n.json()}async function O4(l){const n=await we(`${$l}/`,{method:"POST",body:JSON.stringify(l)});if(!n.ok){const i=await n.json();throw new Error(i.detail||"创建黑话失败")}return n.json()}async function D4(l,n){const i=await we(`${$l}/${l}`,{method:"PATCH",body:JSON.stringify(n)});if(!i.ok){const c=await i.json();throw new Error(c.detail||"更新黑话失败")}return i.json()}async function R4(l){const n=await we(`${$l}/${l}`,{method:"DELETE"});if(!n.ok){const i=await n.json();throw new Error(i.detail||"删除黑话失败")}return n.json()}async function L4(l){const n=await we(`${$l}/batch/delete`,{method:"POST",body:JSON.stringify({ids:l})});if(!n.ok){const i=await n.json();throw new Error(i.detail||"批量删除黑话失败")}return n.json()}async function U4(){const l=await we(`${$l}/stats/summary`,{});if(!l.ok){const n=await l.json();throw new Error(n.detail||"获取黑话统计失败")}return l.json()}async function $4(l,n){const i=new URLSearchParams;l.forEach(u=>i.append("ids",u.toString())),i.append("is_jargon",n.toString());const c=await we(`${$l}/batch/set-jargon?${i}`,{method:"POST"});if(!c.ok){const u=await c.json();throw new Error(u.detail||"批量设置黑话状态失败")}return c.json()}function B4(){const[l,n]=d.useState([]),[i,c]=d.useState(!0),[u,x]=d.useState(0),[h,f]=d.useState(1),[p,g]=d.useState(20),[N,v]=d.useState(""),[y,w]=d.useState("all"),[b,R]=d.useState("all"),[D,S]=d.useState(null),[P,M]=d.useState(!1),[T,A]=d.useState(!1),[F,L]=d.useState(!1),[J,U]=d.useState(null),[ue,xe]=d.useState(new Set),[he,ne]=d.useState(!1),[ve,je]=d.useState(""),[z,V]=d.useState({total:0,confirmed_jargon:0,confirmed_not_jargon:0,pending:0,global_count:0,complete_count:0,chat_count:0,top_chats:{}}),[B,oe]=d.useState([]),{toast:K}=Zs(),_e=async()=>{try{c(!0);const ee=await z4({page:h,page_size:p,search:N||void 0,chat_id:y==="all"?void 0:y,is_jargon:b==="all"?void 0:b==="true"?!0:b==="false"?!1:void 0});n(ee.data),x(ee.total)}catch(ee){K({title:"加载失败",description:ee instanceof Error?ee.message:"无法加载黑话列表",variant:"destructive"})}finally{c(!1)}},pe=async()=>{try{const ee=await U4();ee?.data&&V(ee.data)}catch(ee){console.error("加载统计数据失败:",ee)}},ke=async()=>{try{const ee=await M4();ee?.data&&oe(ee.data)}catch(ee){console.error("加载聊天列表失败:",ee)}};d.useEffect(()=>{_e(),pe(),ke()},[h,p,N,y,b]);const O=async ee=>{try{const Ue=await A4(ee.id);S(Ue.data),M(!0)}catch(Ue){K({title:"加载详情失败",description:Ue instanceof Error?Ue.message:"无法加载黑话详情",variant:"destructive"})}},k=ee=>{S(ee),A(!0)},H=async ee=>{try{await R4(ee.id),K({title:"删除成功",description:`已删除黑话: ${ee.content}`}),U(null),_e(),pe()}catch(Ue){K({title:"删除失败",description:Ue instanceof Error?Ue.message:"无法删除黑话",variant:"destructive"})}},se=ee=>{const Ue=new Set(ue);Ue.has(ee)?Ue.delete(ee):Ue.add(ee),xe(Ue)},Ee=()=>{ue.size===l.length&&l.length>0?xe(new Set):xe(new Set(l.map(ee=>ee.id)))},Z=async()=>{try{await L4(Array.from(ue)),K({title:"批量删除成功",description:`已删除 ${ue.size} 个黑话`}),xe(new Set),ne(!1),_e(),pe()}catch(ee){K({title:"批量删除失败",description:ee instanceof Error?ee.message:"无法批量删除黑话",variant:"destructive"})}},Oe=async ee=>{try{await $4(Array.from(ue),ee),K({title:"操作成功",description:`已将 ${ue.size} 个词条设为${ee?"黑话":"非黑话"}`}),xe(new Set),_e(),pe()}catch(Ue){K({title:"操作失败",description:Ue instanceof Error?Ue.message:"批量设置失败",variant:"destructive"})}},ns=()=>{const ee=parseInt(ve),Ue=Math.ceil(u/p);ee>=1&&ee<=Ue?(f(ee),je("")):K({title:"无效的页码",description:`请输入1-${Ue}之间的页码`,variant:"destructive"})},Q=ee=>ee===!0?e.jsxs(Se,{variant:"default",className:"bg-green-600 hover:bg-green-700",children:[e.jsx(kt,{className:"h-3 w-3 mr-1"}),"是黑话"]}):ee===!1?e.jsxs(Se,{variant:"secondary",children:[e.jsx(Ta,{className:"h-3 w-3 mr-1"}),"非黑话"]}):e.jsxs(Se,{variant:"outline",children:[e.jsx(Dj,{className:"h-3 w-3 mr-1"}),"未判定"]});return e.jsxs("div",{className:"h-[calc(100vh-4rem)] flex flex-col p-4 sm:p-6",children:[e.jsx("div",{className:"mb-4 sm:mb-6",children:e.jsxs("div",{className:"flex flex-col sm:flex-row sm:items-center justify-between gap-4",children:[e.jsxs("div",{children:[e.jsxs("h1",{className:"text-2xl sm:text-3xl font-bold flex items-center gap-2",children:[e.jsx(a_,{className:"h-8 w-8",strokeWidth:2}),"黑话管理"]}),e.jsx("p",{className:"text-muted-foreground mt-1 text-sm sm:text-base",children:"管理麦麦学习到的黑话和俚语"})]}),e.jsxs(_,{onClick:()=>L(!0),className:"gap-2",children:[e.jsx(et,{className:"h-4 w-4"}),"新增黑话"]})]})}),e.jsx(Ye,{className:"flex-1",children:e.jsxs("div",{className:"space-y-4 sm:space-y-6 pr-4",children:[e.jsxs("div",{className:"grid grid-cols-2 sm:grid-cols-4 lg:grid-cols-7 gap-3",children:[e.jsxs("div",{className:"rounded-lg border bg-card p-3 sm:p-4",children:[e.jsx("div",{className:"text-xs sm:text-sm text-muted-foreground",children:"总数量"}),e.jsx("div",{className:"text-xl sm:text-2xl font-bold mt-1",children:z.total})]}),e.jsxs("div",{className:"rounded-lg border bg-card p-3 sm:p-4",children:[e.jsx("div",{className:"text-xs sm:text-sm text-muted-foreground",children:"已确认黑话"}),e.jsx("div",{className:"text-xl sm:text-2xl font-bold mt-1 text-green-600",children:z.confirmed_jargon})]}),e.jsxs("div",{className:"rounded-lg border bg-card p-3 sm:p-4",children:[e.jsx("div",{className:"text-xs sm:text-sm text-muted-foreground",children:"确认非黑话"}),e.jsx("div",{className:"text-xl sm:text-2xl font-bold mt-1 text-gray-500",children:z.confirmed_not_jargon})]}),e.jsxs("div",{className:"rounded-lg border bg-card p-3 sm:p-4",children:[e.jsx("div",{className:"text-xs sm:text-sm text-muted-foreground",children:"待判定"}),e.jsx("div",{className:"text-xl sm:text-2xl font-bold mt-1 text-yellow-600",children:z.pending})]}),e.jsxs("div",{className:"rounded-lg border bg-card p-3 sm:p-4",children:[e.jsx("div",{className:"text-xs sm:text-sm text-muted-foreground",children:"全局黑话"}),e.jsx("div",{className:"text-xl sm:text-2xl font-bold mt-1 text-blue-600",children:z.global_count})]}),e.jsxs("div",{className:"rounded-lg border bg-card p-3 sm:p-4",children:[e.jsx("div",{className:"text-xs sm:text-sm text-muted-foreground",children:"推断完成"}),e.jsx("div",{className:"text-xl sm:text-2xl font-bold mt-1 text-purple-600",children:z.complete_count})]}),e.jsxs("div",{className:"rounded-lg border bg-card p-3 sm:p-4",children:[e.jsx("div",{className:"text-xs sm:text-sm text-muted-foreground",children:"关联聊天数"}),e.jsx("div",{className:"text-xl sm:text-2xl font-bold mt-1",children:z.chat_count})]})]}),e.jsxs("div",{className:"rounded-lg border bg-card p-4",children:[e.jsxs("div",{className:"grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-4 gap-4",children:[e.jsxs("div",{className:"space-y-1.5",children:[e.jsx(E,{htmlFor:"search",children:"搜索"}),e.jsxs("div",{className:"relative",children:[e.jsx(Ct,{className:"absolute left-2.5 top-2.5 h-4 w-4 text-muted-foreground"}),e.jsx(le,{id:"search",placeholder:"搜索内容、含义...",value:N,onChange:ee=>v(ee.target.value),className:"pl-9"})]})]}),e.jsxs("div",{className:"space-y-1.5",children:[e.jsx(E,{children:"聊天筛选"}),e.jsxs(Ie,{value:y,onValueChange:w,children:[e.jsx($e,{children:e.jsx(Pe,{placeholder:"全部聊天"})}),e.jsxs(Be,{children:[e.jsx(X,{value:"all",children:"全部聊天"}),B.map(ee=>e.jsx(X,{value:ee.chat_id,children:ee.chat_name},ee.chat_id))]})]})]}),e.jsxs("div",{className:"space-y-1.5",children:[e.jsx(E,{children:"状态筛选"}),e.jsxs(Ie,{value:b,onValueChange:R,children:[e.jsx($e,{children:e.jsx(Pe,{placeholder:"全部状态"})}),e.jsxs(Be,{children:[e.jsx(X,{value:"all",children:"全部状态"}),e.jsx(X,{value:"true",children:"是黑话"}),e.jsx(X,{value:"false",children:"非黑话"})]})]})]}),e.jsxs("div",{className:"space-y-1.5",children:[e.jsx(E,{htmlFor:"page-size",children:"每页显示"}),e.jsxs(Ie,{value:p.toString(),onValueChange:ee=>{g(parseInt(ee)),f(1),xe(new Set)},children:[e.jsx($e,{id:"page-size",children:e.jsx(Pe,{})}),e.jsxs(Be,{children:[e.jsx(X,{value:"10",children:"10"}),e.jsx(X,{value:"20",children:"20"}),e.jsx(X,{value:"50",children:"50"}),e.jsx(X,{value:"100",children:"100"})]})]})]})]}),ue.size>0&&e.jsxs("div",{className:"flex flex-wrap items-center gap-2 mt-4 pt-4 border-t",children:[e.jsxs("span",{className:"text-sm text-muted-foreground",children:["已选择 ",ue.size," 个"]}),e.jsxs(_,{variant:"outline",size:"sm",onClick:()=>Oe(!0),children:[e.jsx(kt,{className:"h-4 w-4 mr-1"}),"标记为黑话"]}),e.jsxs(_,{variant:"outline",size:"sm",onClick:()=>Oe(!1),children:[e.jsx(Ta,{className:"h-4 w-4 mr-1"}),"标记为非黑话"]}),e.jsx(_,{variant:"outline",size:"sm",onClick:()=>xe(new Set),children:"取消选择"}),e.jsxs(_,{variant:"destructive",size:"sm",onClick:()=>ne(!0),children:[e.jsx(ls,{className:"h-4 w-4 mr-1"}),"批量删除"]})]})]}),e.jsxs("div",{className:"rounded-lg border bg-card",children:[e.jsx("div",{className:"hidden md:block",children:e.jsxs(Rl,{children:[e.jsx(Ll,{children:e.jsxs(ut,{children:[e.jsx(Ze,{className:"w-12",children:e.jsx(qs,{checked:ue.size===l.length&&l.length>0,onCheckedChange:Ee})}),e.jsx(Ze,{children:"内容"}),e.jsx(Ze,{children:"含义"}),e.jsx(Ze,{children:"聊天"}),e.jsx(Ze,{children:"状态"}),e.jsx(Ze,{className:"text-center",children:"次数"}),e.jsx(Ze,{className:"text-right",children:"操作"})]})}),e.jsx(Ul,{children:i?e.jsx(ut,{children:e.jsx(qe,{colSpan:7,className:"text-center py-8 text-muted-foreground",children:"加载中..."})}):l.length===0?e.jsx(ut,{children:e.jsx(qe,{colSpan:7,className:"text-center py-8 text-muted-foreground",children:"暂无数据"})}):l.map(ee=>e.jsxs(ut,{children:[e.jsx(qe,{children:e.jsx(qs,{checked:ue.has(ee.id),onCheckedChange:()=>se(ee.id)})}),e.jsx(qe,{className:"font-medium max-w-[200px]",children:e.jsxs("div",{className:"flex items-center gap-2",children:[ee.is_global&&e.jsx("span",{title:"全局黑话",children:e.jsx(Uo,{className:"h-4 w-4 text-blue-500 flex-shrink-0"})}),e.jsx("span",{className:"truncate",title:ee.content,children:ee.content})]})}),e.jsx(qe,{className:"max-w-[200px] truncate",title:ee.meaning||"",children:ee.meaning||e.jsx("span",{className:"text-muted-foreground",children:"-"})}),e.jsx(qe,{className:"max-w-[150px] truncate",title:ee.chat_name||ee.chat_id,children:ee.chat_name||ee.chat_id}),e.jsx(qe,{children:Q(ee.is_jargon)}),e.jsx(qe,{className:"text-center",children:ee.count}),e.jsx(qe,{className:"text-right",children:e.jsxs("div",{className:"flex justify-end gap-2",children:[e.jsxs(_,{variant:"default",size:"sm",onClick:()=>k(ee),children:[e.jsx(qn,{className:"h-4 w-4 mr-1"}),"编辑"]}),e.jsx(_,{variant:"outline",size:"icon",className:"h-8 w-8",onClick:()=>O(ee),title:"查看详情",children:e.jsx(ia,{className:"h-4 w-4"})}),e.jsxs(_,{size:"sm",onClick:()=>U(ee),className:"bg-red-600 hover:bg-red-700 text-white",children:[e.jsx(ls,{className:"h-4 w-4 mr-1"}),"删除"]})]})})]},ee.id))})]})}),e.jsx("div",{className:"md:hidden space-y-3 p-4",children:i?e.jsx("div",{className:"text-center py-8 text-muted-foreground",children:"加载中..."}):l.length===0?e.jsx("div",{className:"text-center py-8 text-muted-foreground",children:"暂无数据"}):l.map(ee=>e.jsxs("div",{className:"rounded-lg border bg-card p-4 space-y-3",children:[e.jsxs("div",{className:"flex items-start gap-3",children:[e.jsx(qs,{checked:ue.has(ee.id),onCheckedChange:()=>se(ee.id),className:"mt-1"}),e.jsxs("div",{className:"min-w-0 flex-1 space-y-2",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[ee.is_global&&e.jsx(Uo,{className:"h-4 w-4 text-blue-500 flex-shrink-0"}),e.jsx("h3",{className:"font-semibold text-sm break-all",children:ee.content})]}),ee.meaning&&e.jsx("p",{className:"text-sm text-muted-foreground break-all",children:ee.meaning}),e.jsxs("div",{className:"flex flex-wrap items-center gap-2 text-xs",children:[Q(ee.is_jargon),e.jsxs("span",{className:"text-muted-foreground",children:["次数: ",ee.count]})]}),e.jsxs("div",{className:"text-xs text-muted-foreground truncate",children:["聊天: ",ee.chat_name||ee.chat_id]})]})]}),e.jsxs("div",{className:"flex flex-wrap gap-1 pt-2 border-t",children:[e.jsxs(_,{variant:"outline",size:"sm",onClick:()=>k(ee),className:"text-xs px-2 py-1 h-auto",children:[e.jsx(qn,{className:"h-3 w-3 mr-1"}),"编辑"]}),e.jsx(_,{variant:"outline",size:"sm",onClick:()=>O(ee),className:"text-xs px-2 py-1 h-auto",children:e.jsx(ia,{className:"h-3 w-3"})}),e.jsxs(_,{variant:"outline",size:"sm",onClick:()=>U(ee),className:"text-xs px-2 py-1 h-auto text-destructive hover:text-destructive",children:[e.jsx(ls,{className:"h-3 w-3 mr-1"}),"删除"]})]})]},ee.id))}),u>0&&e.jsxs("div",{className:"flex flex-col sm:flex-row items-center justify-between gap-4 px-4 py-3 border-t",children:[e.jsxs("div",{className:"text-sm text-muted-foreground",children:["共 ",u," 条记录,第 ",h," / ",Math.ceil(u/p)," 页"]}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(_,{variant:"outline",size:"sm",onClick:()=>f(1),disabled:h===1,className:"hidden sm:flex",children:e.jsx(gn,{className:"h-4 w-4"})}),e.jsxs(_,{variant:"outline",size:"sm",onClick:()=>f(h-1),disabled:h===1,children:[e.jsx(za,{className:"h-4 w-4 sm:mr-1"}),e.jsx("span",{className:"hidden sm:inline",children:"上一页"})]}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(le,{type:"number",value:ve,onChange:ee=>je(ee.target.value),onKeyDown:ee=>ee.key==="Enter"&&ns(),placeholder:h.toString(),className:"w-16 h-8 text-center",min:1,max:Math.ceil(u/p)}),e.jsx(_,{variant:"outline",size:"sm",onClick:ns,disabled:!ve,className:"h-8",children:"跳转"})]}),e.jsxs(_,{variant:"outline",size:"sm",onClick:()=>f(h+1),disabled:h>=Math.ceil(u/p),children:[e.jsx("span",{className:"hidden sm:inline",children:"下一页"}),e.jsx(Zt,{className:"h-4 w-4 sm:ml-1"})]}),e.jsx(_,{variant:"outline",size:"sm",onClick:()=>f(Math.ceil(u/p)),disabled:h>=Math.ceil(u/p),className:"hidden sm:flex",children:e.jsx(jn,{className:"h-4 w-4"})})]})]})]})]})}),e.jsx(I4,{jargon:D,open:P,onOpenChange:M}),e.jsx(P4,{open:F,onOpenChange:L,chatList:B,onSuccess:()=>{_e(),pe(),L(!1)}}),e.jsx(H4,{jargon:D,open:T,onOpenChange:A,chatList:B,onSuccess:()=>{_e(),pe(),A(!1)}}),e.jsx(vs,{open:!!J,onOpenChange:()=>U(null),children:e.jsxs(ds,{children:[e.jsxs(us,{children:[e.jsx(xs,{children:"确认删除"}),e.jsxs(hs,{children:['确定要删除黑话 "',J?.content,'" 吗?此操作不可撤销。']})]}),e.jsxs(ms,{children:[e.jsx(ps,{children:"取消"}),e.jsx(fs,{onClick:()=>J&&H(J),className:"bg-destructive text-destructive-foreground hover:bg-destructive/90",children:"删除"})]})]})}),e.jsx(vs,{open:he,onOpenChange:ne,children:e.jsxs(ds,{children:[e.jsxs(us,{children:[e.jsx(xs,{children:"确认批量删除"}),e.jsxs(hs,{children:["您即将删除 ",ue.size," 个黑话,此操作无法撤销。确定要继续吗?"]})]}),e.jsxs(ms,{children:[e.jsx(ps,{children:"取消"}),e.jsx(fs,{onClick:Z,className:"bg-destructive text-destructive-foreground hover:bg-destructive/90",children:"确认删除"})]})]})})]})}function I4({jargon:l,open:n,onOpenChange:i}){return l?e.jsx(Is,{open:n,onOpenChange:i,children:e.jsxs(Os,{className:"max-w-2xl max-h-[80vh] grid grid-rows-[auto_1fr_auto] overflow-hidden",children:[e.jsxs(Ds,{children:[e.jsx(Rs,{children:"黑话详情"}),e.jsx(Ks,{children:"查看黑话的完整信息"})]}),e.jsx(Ye,{className:"h-full pr-4",children:e.jsxs("div",{className:"space-y-4 pb-2",children:[e.jsxs("div",{className:"grid grid-cols-2 gap-4",children:[e.jsx(Dm,{icon:Gr,label:"记录ID",value:l.id.toString(),mono:!0}),e.jsx(Dm,{label:"使用次数",value:l.count.toString()})]}),e.jsxs("div",{className:"space-y-1",children:[e.jsx(E,{className:"text-xs text-muted-foreground",children:"内容"}),e.jsx("div",{className:"text-sm p-2 bg-muted rounded break-all whitespace-pre-wrap",children:l.content})]}),l.raw_content&&e.jsxs("div",{className:"space-y-1",children:[e.jsx(E,{className:"text-xs text-muted-foreground",children:"原始内容"}),e.jsx("div",{className:"text-sm p-2 bg-muted rounded break-all",children:(()=>{try{const c=JSON.parse(l.raw_content);return Array.isArray(c)?c.map((u,x)=>e.jsxs("div",{children:[x>0&&e.jsx("hr",{className:"my-3 border-border"}),e.jsx("div",{className:"whitespace-pre-wrap",children:u})]},x)):e.jsx("div",{className:"whitespace-pre-wrap",children:l.raw_content})}catch{return e.jsx("div",{className:"whitespace-pre-wrap",children:l.raw_content})}})()})]}),e.jsxs("div",{className:"space-y-1",children:[e.jsx(E,{className:"text-xs text-muted-foreground",children:"含义"}),e.jsx("div",{className:"text-sm p-2 bg-muted rounded break-all",children:l.meaning?e.jsx(tx,{content:l.meaning}):"-"})]}),e.jsxs("div",{className:"grid grid-cols-2 gap-4",children:[e.jsx(Dm,{label:"聊天",value:l.chat_name||l.chat_id}),e.jsxs("div",{className:"space-y-1",children:[e.jsx(E,{className:"text-xs text-muted-foreground",children:"状态"}),e.jsxs("div",{className:"flex items-center gap-2",children:[l.is_jargon===!0&&e.jsx(Se,{variant:"default",className:"bg-green-600",children:"是黑话"}),l.is_jargon===!1&&e.jsx(Se,{variant:"secondary",children:"非黑话"}),l.is_jargon===null&&e.jsx(Se,{variant:"outline",children:"未判定"}),l.is_global&&e.jsx(Se,{variant:"outline",className:"border-blue-500 text-blue-500",children:"全局"}),l.is_complete&&e.jsx(Se,{variant:"outline",className:"border-purple-500 text-purple-500",children:"推断完成"})]})]})]}),l.inference_with_context&&e.jsxs("div",{className:"space-y-1",children:[e.jsx(E,{className:"text-xs text-muted-foreground",children:"上下文推断结果"}),e.jsx("div",{className:"p-2 bg-muted rounded break-all whitespace-pre-wrap font-mono text-xs max-h-[200px] overflow-y-auto",children:l.inference_with_context})]}),l.inference_content_only&&e.jsxs("div",{className:"space-y-1",children:[e.jsx(E,{className:"text-xs text-muted-foreground",children:"纯词条推断结果"}),e.jsx("div",{className:"p-2 bg-muted rounded break-all whitespace-pre-wrap font-mono text-xs max-h-[200px] overflow-y-auto",children:l.inference_content_only})]})]})}),e.jsx(st,{className:"flex-shrink-0",children:e.jsx(_,{onClick:()=>i(!1),children:"关闭"})})]})}):null}function Dm({icon:l,label:n,value:i,mono:c=!1}){return e.jsxs("div",{className:"space-y-1",children:[e.jsxs(E,{className:"text-xs text-muted-foreground flex items-center gap-1",children:[l&&e.jsx(l,{className:"h-3 w-3"}),n]}),e.jsx("div",{className:I("text-sm",c&&"font-mono",!i&&"text-muted-foreground"),children:i||"-"})]})}function P4({open:l,onOpenChange:n,chatList:i,onSuccess:c}){const[u,x]=d.useState({content:"",meaning:"",chat_id:"",is_global:!1}),[h,f]=d.useState(!1),{toast:p}=Zs(),g=async()=>{if(!u.content||!u.chat_id){p({title:"验证失败",description:"请填写必填字段:内容和聊天",variant:"destructive"});return}try{f(!0),await O4(u),p({title:"创建成功",description:"黑话已创建"}),x({content:"",meaning:"",chat_id:"",is_global:!1}),c()}catch(N){p({title:"创建失败",description:N instanceof Error?N.message:"无法创建黑话",variant:"destructive"})}finally{f(!1)}};return e.jsx(Is,{open:l,onOpenChange:n,children:e.jsxs(Os,{className:"max-w-2xl max-h-[80vh] overflow-y-auto",children:[e.jsxs(Ds,{children:[e.jsx(Rs,{children:"新增黑话"}),e.jsx(Ks,{children:"创建新的黑话记录"})]}),e.jsxs("div",{className:"space-y-4",children:[e.jsxs("div",{className:"space-y-2",children:[e.jsxs(E,{htmlFor:"content",children:["内容 ",e.jsx("span",{className:"text-destructive",children:"*"})]}),e.jsx(le,{id:"content",value:u.content,onChange:N=>x({...u,content:N.target.value}),placeholder:"输入黑话内容"})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsx(E,{htmlFor:"meaning",children:"含义"}),e.jsx(ot,{id:"meaning",value:u.meaning||"",onChange:N=>x({...u,meaning:N.target.value}),placeholder:"输入黑话含义(可选)",rows:3})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsxs(E,{htmlFor:"chat_id",children:["聊天 ",e.jsx("span",{className:"text-destructive",children:"*"})]}),e.jsxs(Ie,{value:u.chat_id,onValueChange:N=>x({...u,chat_id:N}),children:[e.jsx($e,{children:e.jsx(Pe,{placeholder:"选择关联的聊天"})}),e.jsx(Be,{children:i.map(N=>e.jsx(X,{value:N.chat_id,children:N.chat_name},N.chat_id))})]})]}),e.jsxs("div",{className:"flex items-center space-x-2",children:[e.jsx(Fe,{id:"is_global",checked:u.is_global,onCheckedChange:N=>x({...u,is_global:N})}),e.jsx(E,{htmlFor:"is_global",children:"设为全局黑话"})]})]}),e.jsxs(st,{children:[e.jsx(_,{variant:"outline",onClick:()=>n(!1),children:"取消"}),e.jsx(_,{onClick:g,disabled:h,children:h?"创建中...":"创建"})]})]})})}function H4({jargon:l,open:n,onOpenChange:i,chatList:c,onSuccess:u}){const[x,h]=d.useState({}),[f,p]=d.useState(!1),{toast:g}=Zs();d.useEffect(()=>{l&&h({content:l.content,meaning:l.meaning||"",chat_id:l.stream_id||l.chat_id,is_global:l.is_global,is_jargon:l.is_jargon})},[l]);const N=async()=>{if(l)try{p(!0),await D4(l.id,x),g({title:"保存成功",description:"黑话已更新"}),u()}catch(v){g({title:"保存失败",description:v instanceof Error?v.message:"无法更新黑话",variant:"destructive"})}finally{p(!1)}};return l?e.jsx(Is,{open:n,onOpenChange:i,children:e.jsxs(Os,{className:"max-w-2xl max-h-[80vh] overflow-y-auto",children:[e.jsxs(Ds,{children:[e.jsx(Rs,{children:"编辑黑话"}),e.jsx(Ks,{children:"修改黑话的信息"})]}),e.jsxs("div",{className:"space-y-4",children:[e.jsxs("div",{className:"space-y-2",children:[e.jsx(E,{htmlFor:"edit_content",children:"内容"}),e.jsx(le,{id:"edit_content",value:x.content||"",onChange:v=>h({...x,content:v.target.value}),placeholder:"输入黑话内容"})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsx(E,{htmlFor:"edit_meaning",children:"含义"}),e.jsx(ot,{id:"edit_meaning",value:x.meaning||"",onChange:v=>h({...x,meaning:v.target.value}),placeholder:"输入黑话含义",rows:3})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsx(E,{htmlFor:"edit_chat_id",children:"聊天"}),e.jsxs(Ie,{value:x.chat_id||"",onValueChange:v=>h({...x,chat_id:v}),children:[e.jsx($e,{children:e.jsx(Pe,{placeholder:"选择关联的聊天"})}),e.jsx(Be,{children:c.map(v=>e.jsx(X,{value:v.chat_id,children:v.chat_name},v.chat_id))})]})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsx(E,{children:"黑话状态"}),e.jsxs(Ie,{value:x.is_jargon===null?"null":x.is_jargon?.toString()||"null",onValueChange:v=>h({...x,is_jargon:v==="null"?null:v==="true"}),children:[e.jsx($e,{children:e.jsx(Pe,{})}),e.jsxs(Be,{children:[e.jsx(X,{value:"null",children:"未判定"}),e.jsx(X,{value:"true",children:"是黑话"}),e.jsx(X,{value:"false",children:"非黑话"})]})]})]}),e.jsxs("div",{className:"flex items-center space-x-2",children:[e.jsx(Fe,{id:"edit_is_global",checked:x.is_global,onCheckedChange:v=>h({...x,is_global:v})}),e.jsx(E,{htmlFor:"edit_is_global",children:"全局黑话"})]})]}),e.jsxs(st,{children:[e.jsx(_,{variant:"outline",onClick:()=>i(!1),children:"取消"}),e.jsx(_,{onClick:N,disabled:f,children:f?"保存中...":"保存"})]})]})}):null}const Yr="/api/webui/person";async function F4(l){const n=new URLSearchParams;l.page&&n.append("page",l.page.toString()),l.page_size&&n.append("page_size",l.page_size.toString()),l.search&&n.append("search",l.search),l.is_known!==void 0&&n.append("is_known",l.is_known.toString()),l.platform&&n.append("platform",l.platform);const i=await we(`${Yr}/list?${n}`,{headers:Fs()});if(!i.ok){const c=await i.json();throw new Error(c.detail||"获取人物列表失败")}return i.json()}async function G4(l){const n=await we(`${Yr}/${l}`,{headers:Fs()});if(!n.ok){const i=await n.json();throw new Error(i.detail||"获取人物详情失败")}return n.json()}async function V4(l,n){const i=await we(`${Yr}/${l}`,{method:"PATCH",headers:Fs(),body:JSON.stringify(n)});if(!i.ok){const c=await i.json();throw new Error(c.detail||"更新人物信息失败")}return i.json()}async function q4(l){const n=await we(`${Yr}/${l}`,{method:"DELETE",headers:Fs()});if(!n.ok){const i=await n.json();throw new Error(i.detail||"删除人物信息失败")}return n.json()}async function K4(){const l=await we(`${Yr}/stats/summary`,{headers:Fs()});if(!l.ok){const n=await l.json();throw new Error(n.detail||"获取统计数据失败")}return l.json()}async function Q4(l){const n=await we(`${Yr}/batch/delete`,{method:"POST",headers:Fs(),body:JSON.stringify({person_ids:l})});if(!n.ok){const i=await n.json();throw new Error(i.detail||"批量删除失败")}return n.json()}function Y4(){const[l,n]=d.useState([]),[i,c]=d.useState(!0),[u,x]=d.useState(0),[h,f]=d.useState(1),[p,g]=d.useState(20),[N,v]=d.useState(""),[y,w]=d.useState(void 0),[b,R]=d.useState(void 0),[D,S]=d.useState(null),[P,M]=d.useState(!1),[T,A]=d.useState(!1),[F,L]=d.useState(null),[J,U]=d.useState({total:0,known:0,unknown:0,platforms:{}}),[ue,xe]=d.useState(new Set),[he,ne]=d.useState(!1),[ve,je]=d.useState(""),{toast:z}=Zs(),V=async()=>{try{c(!0);const Z=await F4({page:h,page_size:p,search:N||void 0,is_known:y,platform:b});n(Z.data),x(Z.total)}catch(Z){z({title:"加载失败",description:Z instanceof Error?Z.message:"无法加载人物信息",variant:"destructive"})}finally{c(!1)}},B=async()=>{try{const Z=await K4();Z?.data&&U(Z.data)}catch(Z){console.error("加载统计数据失败:",Z)}};d.useEffect(()=>{V(),B()},[h,p,N,y,b]);const oe=async Z=>{try{const Oe=await G4(Z.person_id);S(Oe.data),M(!0)}catch(Oe){z({title:"加载详情失败",description:Oe instanceof Error?Oe.message:"无法加载人物详情",variant:"destructive"})}},K=Z=>{S(Z),A(!0)},_e=async Z=>{try{await q4(Z.person_id),z({title:"删除成功",description:`已删除人物信息: ${Z.person_name||Z.nickname||Z.user_id}`}),L(null),V(),B()}catch(Oe){z({title:"删除失败",description:Oe instanceof Error?Oe.message:"无法删除人物信息",variant:"destructive"})}},pe=d.useMemo(()=>Object.keys(J.platforms),[J.platforms]),ke=Z=>{const Oe=new Set(ue);Oe.has(Z)?Oe.delete(Z):Oe.add(Z),xe(Oe)},O=()=>{ue.size===l.length&&l.length>0?xe(new Set):xe(new Set(l.map(Z=>Z.person_id)))},k=()=>{if(ue.size===0){z({title:"未选择任何人物",description:"请先选择要删除的人物",variant:"destructive"});return}ne(!0)},H=async()=>{try{const Z=await Q4(Array.from(ue));z({title:"批量删除完成",description:Z.message}),xe(new Set),ne(!1),V(),B()}catch(Z){z({title:"批量删除失败",description:Z instanceof Error?Z.message:"批量删除失败",variant:"destructive"})}},se=()=>{const Z=parseInt(ve),Oe=Math.ceil(u/p);Z>=1&&Z<=Oe?(f(Z),je("")):z({title:"无效的页码",description:`请输入1-${Oe}之间的页码`,variant:"destructive"})},Ee=Z=>Z?new Date(Z*1e3).toLocaleString("zh-CN"):"-";return e.jsxs("div",{className:"h-[calc(100vh-4rem)] flex flex-col p-4 sm:p-6",children:[e.jsx("div",{className:"mb-4 sm:mb-6",children:e.jsx("div",{className:"flex flex-col sm:flex-row sm:items-center justify-between gap-4",children:e.jsxs("div",{children:[e.jsxs("h1",{className:"text-2xl sm:text-3xl font-bold flex items-center gap-2",children:[e.jsx(sc,{className:"h-8 w-8",strokeWidth:2}),"人物信息管理"]}),e.jsx("p",{className:"text-muted-foreground mt-1 text-sm sm:text-base",children:"管理麦麦认识的所有人物信息"})]})})}),e.jsx(Ye,{className:"flex-1",children:e.jsxs("div",{className:"space-y-4 sm:space-y-6 pr-4",children:[e.jsxs("div",{className:"grid grid-cols-1 sm:grid-cols-3 gap-4",children:[e.jsxs("div",{className:"rounded-lg border bg-card p-4",children:[e.jsx("div",{className:"text-sm text-muted-foreground",children:"总人数"}),e.jsx("div",{className:"text-2xl font-bold mt-1",children:J.total})]}),e.jsxs("div",{className:"rounded-lg border bg-card p-4",children:[e.jsx("div",{className:"text-sm text-muted-foreground",children:"已认识"}),e.jsx("div",{className:"text-2xl font-bold mt-1 text-green-600",children:J.known})]}),e.jsxs("div",{className:"rounded-lg border bg-card p-4",children:[e.jsx("div",{className:"text-sm text-muted-foreground",children:"未认识"}),e.jsx("div",{className:"text-2xl font-bold mt-1 text-muted-foreground",children:J.unknown})]})]}),e.jsxs("div",{className:"rounded-lg border bg-card p-4",children:[e.jsxs("div",{className:"grid grid-cols-1 sm:grid-cols-4 gap-4",children:[e.jsxs("div",{className:"sm:col-span-2",children:[e.jsx(E,{htmlFor:"search",children:"搜索"}),e.jsxs("div",{className:"relative mt-1.5",children:[e.jsx(Ct,{className:"absolute left-2.5 top-2.5 h-4 w-4 text-muted-foreground"}),e.jsx(le,{id:"search",placeholder:"搜索名称、昵称或用户ID...",value:N,onChange:Z=>v(Z.target.value),className:"pl-9"})]})]}),e.jsxs("div",{children:[e.jsx(E,{htmlFor:"filter-known",children:"认识状态"}),e.jsxs(Ie,{value:y===void 0?"all":y.toString(),onValueChange:Z=>{w(Z==="all"?void 0:Z==="true"),f(1)},children:[e.jsx($e,{id:"filter-known",className:"mt-1.5",children:e.jsx(Pe,{})}),e.jsxs(Be,{children:[e.jsx(X,{value:"all",children:"全部"}),e.jsx(X,{value:"true",children:"已认识"}),e.jsx(X,{value:"false",children:"未认识"})]})]})]}),e.jsxs("div",{children:[e.jsx(E,{htmlFor:"filter-platform",children:"平台"}),e.jsxs(Ie,{value:b||"all",onValueChange:Z=>{R(Z==="all"?void 0:Z),f(1)},children:[e.jsx($e,{id:"filter-platform",className:"mt-1.5",children:e.jsx(Pe,{})}),e.jsxs(Be,{children:[e.jsx(X,{value:"all",children:"全部平台"}),pe.map(Z=>e.jsxs(X,{value:Z,children:[Z," (",J.platforms[Z],")"]},Z))]})]})]})]}),e.jsxs("div",{className:"flex flex-col sm:flex-row items-start sm:items-center justify-between gap-3 mt-4 pt-4 border-t",children:[e.jsx("div",{className:"flex items-center gap-2 text-sm text-muted-foreground",children:ue.size>0&&e.jsxs("span",{children:["已选择 ",ue.size," 个人物"]})}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(E,{htmlFor:"page-size",className:"text-sm whitespace-nowrap",children:"每页显示"}),e.jsxs(Ie,{value:p.toString(),onValueChange:Z=>{g(parseInt(Z)),f(1),xe(new Set)},children:[e.jsx($e,{id:"page-size",className:"w-20",children:e.jsx(Pe,{})}),e.jsxs(Be,{children:[e.jsx(X,{value:"10",children:"10"}),e.jsx(X,{value:"20",children:"20"}),e.jsx(X,{value:"50",children:"50"}),e.jsx(X,{value:"100",children:"100"})]})]}),ue.size>0&&e.jsxs(e.Fragment,{children:[e.jsx(_,{variant:"outline",size:"sm",onClick:()=>xe(new Set),children:"取消选择"}),e.jsxs(_,{variant:"destructive",size:"sm",onClick:k,children:[e.jsx(ls,{className:"h-4 w-4 mr-1"}),"批量删除"]})]})]})]})]}),e.jsxs("div",{className:"rounded-lg border bg-card",children:[e.jsx("div",{className:"hidden md:block",children:e.jsxs(Rl,{children:[e.jsx(Ll,{children:e.jsxs(ut,{children:[e.jsx(Ze,{className:"w-12",children:e.jsx(qs,{checked:l.length>0&&ue.size===l.length,onCheckedChange:O,"aria-label":"全选"})}),e.jsx(Ze,{children:"状态"}),e.jsx(Ze,{children:"名称"}),e.jsx(Ze,{children:"昵称"}),e.jsx(Ze,{children:"平台"}),e.jsx(Ze,{children:"用户ID"}),e.jsx(Ze,{children:"最后更新"}),e.jsx(Ze,{className:"text-right",children:"操作"})]})}),e.jsx(Ul,{children:i?e.jsx(ut,{children:e.jsx(qe,{colSpan:8,className:"text-center py-8 text-muted-foreground",children:"加载中..."})}):l.length===0?e.jsx(ut,{children:e.jsx(qe,{colSpan:8,className:"text-center py-8 text-muted-foreground",children:"暂无数据"})}):l.map(Z=>e.jsxs(ut,{children:[e.jsx(qe,{children:e.jsx(qs,{checked:ue.has(Z.person_id),onCheckedChange:()=>ke(Z.person_id),"aria-label":`选择 ${Z.person_name||Z.nickname||Z.user_id}`})}),e.jsx(qe,{children:e.jsx("div",{className:I("inline-flex items-center gap-1 px-2 py-1 rounded-full text-xs font-medium",Z.is_known?"bg-green-100 text-green-700 dark:bg-green-900/30 dark:text-green-400":"bg-gray-100 text-gray-700 dark:bg-gray-800 dark:text-gray-400"),children:Z.is_known?"已认识":"未认识"})}),e.jsx(qe,{className:"font-medium",children:Z.person_name||e.jsx("span",{className:"text-muted-foreground",children:"-"})}),e.jsx(qe,{children:Z.nickname||"-"}),e.jsx(qe,{children:Z.platform}),e.jsx(qe,{className:"font-mono text-sm",children:Z.user_id}),e.jsx(qe,{className:"text-sm text-muted-foreground",children:Ee(Z.last_know)}),e.jsx(qe,{className:"text-right",children:e.jsxs("div",{className:"flex justify-end gap-2",children:[e.jsxs(_,{variant:"default",size:"sm",onClick:()=>oe(Z),children:[e.jsx(ia,{className:"h-4 w-4 mr-1"}),"详情"]}),e.jsxs(_,{variant:"default",size:"sm",onClick:()=>K(Z),children:[e.jsx(qn,{className:"h-4 w-4 mr-1"}),"编辑"]}),e.jsxs(_,{size:"sm",onClick:()=>L(Z),className:"bg-red-600 hover:bg-red-700 text-white",children:[e.jsx(ls,{className:"h-4 w-4 mr-1"}),"删除"]})]})})]},Z.id))})]})}),e.jsx("div",{className:"md:hidden space-y-3 p-4",children:i?e.jsx("div",{className:"text-center py-8 text-muted-foreground",children:"加载中..."}):l.length===0?e.jsx("div",{className:"text-center py-8 text-muted-foreground",children:"暂无数据"}):l.map(Z=>e.jsxs("div",{className:"rounded-lg border bg-card p-4 space-y-3 overflow-hidden",children:[e.jsxs("div",{className:"flex items-start gap-3",children:[e.jsx(qs,{checked:ue.has(Z.person_id),onCheckedChange:()=>ke(Z.person_id),className:"mt-1"}),e.jsxs("div",{className:"flex-1 min-w-0",children:[e.jsx("div",{className:I("inline-flex items-center gap-1 px-2 py-1 rounded-full text-xs font-medium mb-2",Z.is_known?"bg-green-100 text-green-700 dark:bg-green-900/30 dark:text-green-400":"bg-gray-100 text-gray-700 dark:bg-gray-800 dark:text-gray-400"),children:Z.is_known?"已认识":"未认识"}),e.jsx("h3",{className:"font-semibold text-sm line-clamp-1 w-full break-all",children:Z.person_name||e.jsx("span",{className:"text-muted-foreground",children:"未命名"})}),Z.nickname&&e.jsxs("p",{className:"text-xs text-muted-foreground mt-1 line-clamp-1 w-full break-all",children:["昵称: ",Z.nickname]})]})]}),e.jsxs("div",{className:"grid grid-cols-2 gap-2 text-sm",children:[e.jsxs("div",{children:[e.jsx("div",{className:"text-xs text-muted-foreground mb-1",children:"平台"}),e.jsx("p",{className:"font-medium text-xs",children:Z.platform})]}),e.jsxs("div",{children:[e.jsx("div",{className:"text-xs text-muted-foreground mb-1",children:"用户ID"}),e.jsx("p",{className:"font-mono text-xs truncate",title:Z.user_id,children:Z.user_id})]}),e.jsxs("div",{className:"col-span-2",children:[e.jsx("div",{className:"text-xs text-muted-foreground mb-1",children:"最后更新"}),e.jsx("p",{className:"text-xs",children:Ee(Z.last_know)})]})]}),e.jsxs("div",{className:"flex flex-wrap gap-1 pt-2 border-t overflow-hidden",children:[e.jsxs(_,{variant:"outline",size:"sm",onClick:()=>oe(Z),className:"text-xs px-2 py-1 h-auto flex-shrink-0",children:[e.jsx(ia,{className:"h-3 w-3 mr-1"}),"查看"]}),e.jsxs(_,{variant:"outline",size:"sm",onClick:()=>K(Z),className:"text-xs px-2 py-1 h-auto flex-shrink-0",children:[e.jsx(qn,{className:"h-3 w-3 mr-1"}),"编辑"]}),e.jsxs(_,{variant:"outline",size:"sm",onClick:()=>L(Z),className:"text-xs px-2 py-1 h-auto flex-shrink-0 text-destructive hover:text-destructive",children:[e.jsx(ls,{className:"h-3 w-3 mr-1"}),"删除"]})]})]},Z.id))}),u>0&&e.jsxs("div",{className:"flex flex-col sm:flex-row items-center justify-between gap-4 px-4 py-3 border-t",children:[e.jsxs("div",{className:"text-sm text-muted-foreground",children:["共 ",u," 条记录,第 ",h," / ",Math.ceil(u/p)," 页"]}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(_,{variant:"outline",size:"sm",onClick:()=>f(1),disabled:h===1,className:"hidden sm:flex",children:e.jsx(gn,{className:"h-4 w-4"})}),e.jsxs(_,{variant:"outline",size:"sm",onClick:()=>f(h-1),disabled:h===1,children:[e.jsx(za,{className:"h-4 w-4 sm:mr-1"}),e.jsx("span",{className:"hidden sm:inline",children:"上一页"})]}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(le,{type:"number",value:ve,onChange:Z=>je(Z.target.value),onKeyDown:Z=>Z.key==="Enter"&&se(),placeholder:h.toString(),className:"w-16 h-8 text-center",min:1,max:Math.ceil(u/p)}),e.jsx(_,{variant:"outline",size:"sm",onClick:se,disabled:!ve,className:"h-8",children:"跳转"})]}),e.jsxs(_,{variant:"outline",size:"sm",onClick:()=>f(h+1),disabled:h>=Math.ceil(u/p),children:[e.jsx("span",{className:"hidden sm:inline",children:"下一页"}),e.jsx(Zt,{className:"h-4 w-4 sm:ml-1"})]}),e.jsx(_,{variant:"outline",size:"sm",onClick:()=>f(Math.ceil(u/p)),disabled:h>=Math.ceil(u/p),className:"hidden sm:flex",children:e.jsx(jn,{className:"h-4 w-4"})})]})]})]})]})}),e.jsx(J4,{person:D,open:P,onOpenChange:M}),e.jsx(X4,{person:D,open:T,onOpenChange:A,onSuccess:()=>{V(),B(),A(!1)}}),e.jsx(vs,{open:!!F,onOpenChange:()=>L(null),children:e.jsxs(ds,{children:[e.jsxs(us,{children:[e.jsx(xs,{children:"确认删除"}),e.jsxs(hs,{children:['确定要删除人物信息 "',F?.person_name||F?.nickname||F?.user_id,'" 吗? 此操作不可撤销。']})]}),e.jsxs(ms,{children:[e.jsx(ps,{children:"取消"}),e.jsx(fs,{onClick:()=>F&&_e(F),className:"bg-destructive text-destructive-foreground hover:bg-destructive/90",children:"删除"})]})]})}),e.jsx(vs,{open:he,onOpenChange:ne,children:e.jsxs(ds,{children:[e.jsxs(us,{children:[e.jsx(xs,{children:"确认批量删除"}),e.jsxs(hs,{children:["确定要删除选中的 ",ue.size," 个人物信息吗? 此操作不可撤销。"]})]}),e.jsxs(ms,{children:[e.jsx(ps,{children:"取消"}),e.jsx(fs,{onClick:H,className:"bg-destructive text-destructive-foreground hover:bg-destructive/90",children:"批量删除"})]})]})})]})}function J4({person:l,open:n,onOpenChange:i}){if(!l)return null;const c=u=>u?new Date(u*1e3).toLocaleString("zh-CN"):"-";return e.jsx(Is,{open:n,onOpenChange:i,children:e.jsxs(Os,{className:"max-w-2xl max-h-[80vh] overflow-y-auto",children:[e.jsxs(Ds,{children:[e.jsx(Rs,{children:"人物详情"}),e.jsxs(Ks,{children:["查看 ",l.person_name||l.nickname||l.user_id," 的完整信息"]})]}),e.jsxs("div",{className:"space-y-4",children:[e.jsxs("div",{className:"grid grid-cols-2 gap-4",children:[e.jsx(zl,{icon:fn,label:"人物名称",value:l.person_name}),e.jsx(zl,{icon:Ea,label:"昵称",value:l.nickname}),e.jsx(zl,{icon:Gr,label:"用户ID",value:l.user_id,mono:!0}),e.jsx(zl,{icon:Gr,label:"人物ID",value:l.person_id,mono:!0}),e.jsx(zl,{label:"平台",value:l.platform}),e.jsx(zl,{label:"状态",value:l.is_known?"已认识":"未认识"})]}),l.name_reason&&e.jsxs("div",{className:"rounded-lg border bg-muted/50 p-3",children:[e.jsx(E,{className:"text-xs text-muted-foreground",children:"名称设定原因"}),e.jsx("p",{className:"mt-1 text-sm",children:l.name_reason})]}),l.memory_points&&e.jsxs("div",{className:"rounded-lg border bg-muted/50 p-3",children:[e.jsx(E,{className:"text-xs text-muted-foreground",children:"个人印象"}),e.jsx("p",{className:"mt-1 text-sm whitespace-pre-wrap",children:l.memory_points})]}),l.group_nick_name&&l.group_nick_name.length>0&&e.jsxs("div",{className:"rounded-lg border bg-muted/50 p-3",children:[e.jsx(E,{className:"text-xs text-muted-foreground",children:"群昵称"}),e.jsx("div",{className:"mt-2 space-y-1",children:l.group_nick_name.map((u,x)=>e.jsxs("div",{className:"text-sm flex items-center gap-2",children:[e.jsx("span",{className:"font-mono text-xs text-muted-foreground",children:u.group_id}),e.jsx("span",{children:"→"}),e.jsx("span",{children:u.group_nick_name})]},x))})]}),e.jsxs("div",{className:"grid grid-cols-3 gap-4",children:[e.jsx(zl,{icon:na,label:"认识时间",value:c(l.know_times)}),e.jsx(zl,{icon:na,label:"首次记录",value:c(l.know_since)}),e.jsx(zl,{icon:na,label:"最后更新",value:c(l.last_know)})]})]}),e.jsx(st,{children:e.jsx(_,{onClick:()=>i(!1),children:"关闭"})})]})})}function zl({icon:l,label:n,value:i,mono:c=!1}){return e.jsxs("div",{className:"space-y-1",children:[e.jsxs(E,{className:"text-xs text-muted-foreground flex items-center gap-1",children:[l&&e.jsx(l,{className:"h-3 w-3"}),n]}),e.jsx("div",{className:I("text-sm",c&&"font-mono",!i&&"text-muted-foreground"),children:i||"-"})]})}function X4({person:l,open:n,onOpenChange:i,onSuccess:c}){const[u,x]=d.useState({}),[h,f]=d.useState(!1),{toast:p}=Zs();d.useEffect(()=>{l&&x({person_name:l.person_name||"",name_reason:l.name_reason||"",nickname:l.nickname||"",is_known:l.is_known})},[l]);const g=async()=>{if(l)try{f(!0),await V4(l.person_id,u),p({title:"保存成功",description:"人物信息已更新"}),c()}catch(N){p({title:"保存失败",description:N instanceof Error?N.message:"无法更新人物信息",variant:"destructive"})}finally{f(!1)}};return l?e.jsx(Is,{open:n,onOpenChange:i,children:e.jsxs(Os,{className:"max-w-2xl max-h-[80vh] overflow-y-auto",children:[e.jsxs(Ds,{children:[e.jsx(Rs,{children:"编辑人物信息"}),e.jsxs(Ks,{children:["修改 ",l.person_name||l.nickname||l.user_id," 的信息"]})]}),e.jsxs("div",{className:"space-y-4",children:[e.jsxs("div",{className:"grid grid-cols-2 gap-4",children:[e.jsxs("div",{className:"space-y-2",children:[e.jsx(E,{htmlFor:"person_name",children:"人物名称"}),e.jsx(le,{id:"person_name",value:u.person_name||"",onChange:N=>x({...u,person_name:N.target.value}),placeholder:"为这个人设置一个名称"})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsx(E,{htmlFor:"nickname",children:"昵称"}),e.jsx(le,{id:"nickname",value:u.nickname||"",onChange:N=>x({...u,nickname:N.target.value}),placeholder:"昵称"})]})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsx(E,{htmlFor:"name_reason",children:"名称设定原因"}),e.jsx(ot,{id:"name_reason",value:u.name_reason||"",onChange:N=>x({...u,name_reason:N.target.value}),placeholder:"为什么这样称呼这个人?",rows:2})]}),e.jsxs("div",{className:"flex items-center justify-between rounded-lg border p-3",children:[e.jsxs("div",{children:[e.jsx(E,{htmlFor:"is_known",className:"text-base font-medium",children:"已认识"}),e.jsx("p",{className:"text-sm text-muted-foreground",children:"标记是否已经认识这个人"})]}),e.jsx(Fe,{id:"is_known",checked:u.is_known,onCheckedChange:N=>x({...u,is_known:N})})]})]}),e.jsxs(st,{children:[e.jsx(_,{variant:"outline",onClick:()=>i(!1),children:"取消"}),e.jsx(_,{onClick:g,disabled:h,children:h?"保存中...":"保存"})]})]})}):null}var Z4=H_();const Dg=E0(Z4),ox="/api/webui";async function W4(l=100,n="all"){const i=`${ox}/knowledge/graph?limit=${l}&node_type=${n}`,c=await fetch(i);if(!c.ok)throw new Error(`获取知识图谱失败: ${c.status}`);return c.json()}async function ek(){const l=await fetch(`${ox}/knowledge/stats`);if(!l.ok)throw new Error("获取知识图谱统计信息失败");return l.json()}async function sk(l){const n=await fetch(`${ox}/knowledge/search?query=${encodeURIComponent(l)}`);if(!n.ok)throw new Error("搜索知识节点失败");return n.json()}const zv=d.memo(({data:l})=>e.jsxs("div",{className:"px-4 py-2 shadow-md rounded-lg bg-gradient-to-br from-blue-500 to-blue-600 border-2 border-blue-700 min-w-[120px]",children:[e.jsx(Io,{type:"target",position:Po.Top}),e.jsx("div",{className:"font-semibold text-white text-sm truncate max-w-[200px]",title:l.content,children:l.label}),e.jsx(Io,{type:"source",position:Po.Bottom})]}));zv.displayName="EntityNode";const Av=d.memo(({data:l})=>e.jsxs("div",{className:"px-3 py-2 shadow-md rounded-md bg-gradient-to-br from-green-500 to-green-600 border-2 border-green-700 min-w-[100px]",children:[e.jsx(Io,{type:"target",position:Po.Top}),e.jsx("div",{className:"font-medium text-white text-xs truncate max-w-[150px]",title:l.content,children:l.label}),e.jsx(Io,{type:"source",position:Po.Bottom})]}));Av.displayName="ParagraphNode";const tk={entity:zv,paragraph:Av};function ak(l,n){const i=new Dg.graphlib.Graph;i.setDefaultEdgeLabel(()=>({})),i.setGraph({rankdir:"TB",ranksep:100,nodesep:80});const c=[],u=[];return l.forEach(x=>{i.setNode(x.id,{width:150,height:50})}),n.forEach(x=>{i.setEdge(x.source,x.target)}),Dg.layout(i),l.forEach(x=>{const h=i.node(x.id);c.push({id:x.id,type:x.type,position:{x:h.x-75,y:h.y-25},data:{label:x.content.slice(0,20)+(x.content.length>20?"...":""),content:x.content}})}),n.forEach((x,h)=>{const f={id:`edge-${h}`,source:x.source,target:x.target,animated:l.length<=200&&x.weight>5,style:{strokeWidth:Math.min(x.weight/2,5),opacity:.6}};x.weight>10&&l.length<100&&(f.label=`${x.weight.toFixed(0)}`),u.push(f)}),{nodes:c,edges:u}}function lk(){const l=ca(),[n,i]=d.useState(!1),[c,u]=d.useState(null),[x,h]=d.useState(""),[f,p]=d.useState("all"),[g,N]=d.useState(50),[v,y]=d.useState("50"),[w,b]=d.useState(!1),[R,D]=d.useState(!0),[S,P]=d.useState(!1),[M,T]=d.useState(!1),[A,F,L]=F_([]),[J,U,ue]=G_([]),[xe,he]=d.useState(0),[ne,ve]=d.useState(null),[je,z]=d.useState(null),{toast:V}=Zs(),B=d.useCallback(H=>H.type==="entity"?"#6366f1":H.type==="paragraph"?"#10b981":"#6b7280",[]),oe=d.useCallback(async(H=!1)=>{try{if(!H&&g>200){T(!0);return}i(!0);const[se,Ee]=await Promise.all([W4(g,f),ek()]);if(u(Ee),se.nodes.length===0){V({title:"提示",description:"知识库为空,请先导入知识数据"}),F([]),U([]);return}const{nodes:Z,edges:Oe}=ak(se.nodes,se.edges);F(Z),U(Oe),he(Z.length),Ee&&Ee.total_nodes>g&&V({title:"提示",description:`知识图谱包含 ${Ee.total_nodes} 个节点,当前显示 ${Z.length} 个`}),V({title:"加载成功",description:`已加载 ${Z.length} 个节点,${Oe.length} 条边`})}catch(se){console.error("加载知识图谱失败:",se),V({title:"加载失败",description:se instanceof Error?se.message:"未知错误",variant:"destructive"})}finally{i(!1)}},[g,f,V]),K=d.useCallback(async()=>{if(!x.trim()){V({title:"提示",description:"请输入搜索关键词"});return}try{const H=await sk(x);if(H.length===0){V({title:"未找到",description:"没有找到匹配的节点"});return}const se=new Set(H.map(Ee=>Ee.id));F(Ee=>Ee.map(Z=>({...Z,style:{...Z.style,opacity:se.has(Z.id)?1:.3,filter:se.has(Z.id)?"brightness(1.2)":"brightness(0.8)"}}))),V({title:"搜索完成",description:`找到 ${H.length} 个匹配节点`})}catch(H){console.error("搜索失败:",H),V({title:"搜索失败",description:H instanceof Error?H.message:"未知错误",variant:"destructive"})}},[x,V]),_e=d.useCallback(()=>{F(H=>H.map(se=>({...se,style:{...se.style,opacity:1,filter:"brightness(1)"}})))},[]),pe=d.useCallback(()=>{D(!1),P(!0),oe()},[oe]),ke=d.useCallback(()=>{T(!1),setTimeout(()=>{oe(!0)},0)},[oe]),O=d.useCallback((H,se)=>{A.find(Z=>Z.id===se.id)&&ve({id:se.id,type:se.type,content:se.data.content})},[A]);d.useEffect(()=>{R||S&&oe()},[g,f,R,S]);const k=d.useCallback((H,se)=>{const Ee=A.find(ns=>ns.id===se.source),Z=A.find(ns=>ns.id===se.target),Oe=J.find(ns=>ns.id===se.id);Ee&&Z&&Oe&&z({source:{id:Ee.id,type:Ee.type,content:Ee.data.content},target:{id:Z.id,type:Z.type,content:Z.data.content},edge:{source:se.source,target:se.target,weight:parseFloat(se.label||"0")}})},[A,J]);return e.jsxs("div",{className:"h-full flex flex-col",children:[e.jsxs("div",{className:"flex-shrink-0 p-4 border-b bg-background",children:[e.jsxs("div",{className:"flex flex-col sm:flex-row justify-between items-start sm:items-center gap-4",children:[e.jsxs("div",{children:[e.jsx("h1",{className:"text-2xl sm:text-3xl font-bold",children:"麦麦知识库图谱"}),e.jsx("p",{className:"text-muted-foreground mt-1",children:"可视化知识实体与关系网络"})]}),c&&e.jsxs("div",{className:"flex gap-2 flex-wrap",children:[e.jsxs(Se,{variant:"outline",className:"gap-1",children:[e.jsx(Hr,{className:"h-3 w-3"}),"节点: ",c.total_nodes]}),e.jsxs(Se,{variant:"outline",className:"gap-1",children:[e.jsx(Bj,{className:"h-3 w-3"}),"边: ",c.total_edges]}),e.jsxs(Se,{variant:"outline",className:"gap-1",children:[e.jsx(Ht,{className:"h-3 w-3"}),"实体: ",c.entity_nodes]}),e.jsxs(Se,{variant:"outline",className:"gap-1",children:[e.jsx(ka,{className:"h-3 w-3"}),"段落: ",c.paragraph_nodes]})]})]}),e.jsxs("div",{className:"flex flex-col sm:flex-row gap-2 mt-4",children:[e.jsxs("div",{className:"flex-1 flex gap-2",children:[e.jsx(le,{placeholder:"搜索节点内容...",value:x,onChange:H=>h(H.target.value),onKeyDown:H=>H.key==="Enter"&&K(),className:"flex-1"}),e.jsx(_,{onClick:K,size:"sm",children:e.jsx(Ct,{className:"h-4 w-4"})}),e.jsx(_,{onClick:_e,variant:"outline",size:"sm",children:"重置"})]}),e.jsxs("div",{className:"flex gap-2",children:[e.jsxs(Ie,{value:f,onValueChange:H=>p(H),children:[e.jsx($e,{className:"w-[120px]",children:e.jsx(Pe,{})}),e.jsxs(Be,{children:[e.jsx(X,{value:"all",children:"全部节点"}),e.jsx(X,{value:"entity",children:"仅实体"}),e.jsx(X,{value:"paragraph",children:"仅段落"})]})]}),e.jsxs(Ie,{value:g===1e4?"all":w?"custom":g.toString(),onValueChange:H=>{H==="custom"?(b(!0),y(g.toString())):H==="all"?(b(!1),N(1e4)):(b(!1),N(Number(H)))},children:[e.jsx($e,{className:"w-[120px]",children:e.jsx(Pe,{})}),e.jsxs(Be,{children:[e.jsx(X,{value:"50",children:"50 节点"}),e.jsx(X,{value:"100",children:"100 节点"}),e.jsx(X,{value:"200",children:"200 节点"}),e.jsx(X,{value:"500",children:"500 节点"}),e.jsx(X,{value:"1000",children:"1000 节点"}),e.jsx(X,{value:"all",children:"全部 (最多10000)"}),e.jsx(X,{value:"custom",children:"自定义..."})]})]}),w&&e.jsx(le,{type:"number",min:"50",value:v,onChange:H=>y(H.target.value),onBlur:()=>{const H=parseInt(v);!isNaN(H)&&H>=50?N(H):(y("50"),N(50))},onKeyDown:H=>{if(H.key==="Enter"){const se=parseInt(v);!isNaN(se)&&se>=50?N(se):(y("50"),N(50))}},placeholder:"最少50个",className:"w-[120px]"}),e.jsx(_,{onClick:()=>oe(),variant:"outline",size:"sm",disabled:n,children:e.jsx(dt,{className:I("h-4 w-4",n&&"animate-spin")})})]})]})]}),e.jsx("div",{className:"flex-1 relative",children:n?e.jsx("div",{className:"absolute inset-0 flex items-center justify-center",children:e.jsxs("div",{className:"text-center",children:[e.jsx(dt,{className:"h-8 w-8 animate-spin mx-auto mb-2 text-muted-foreground"}),e.jsx("p",{className:"text-muted-foreground",children:"加载知识图谱中..."})]})}):A.length===0?e.jsx("div",{className:"absolute inset-0 flex items-center justify-center",children:e.jsxs("div",{className:"text-center",children:[e.jsx(Hr,{className:"h-12 w-12 mx-auto mb-4 text-muted-foreground"}),e.jsx("h3",{className:"text-lg font-semibold mb-2",children:"知识库为空"}),e.jsx("p",{className:"text-muted-foreground",children:"请先导入知识数据"})]})}):e.jsxs(V_,{nodes:A,edges:J,onNodesChange:L,onEdgesChange:ue,onNodeClick:O,onEdgeClick:k,nodeTypes:tk,fitView:!0,minZoom:.05,maxZoom:1.5,defaultViewport:{x:0,y:0,zoom:.5},elevateNodesOnSelect:xe<=500,nodesDraggable:xe<=1e3,attributionPosition:"bottom-left",children:[e.jsx(q_,{variant:K_.Dots,gap:12,size:1}),e.jsx(Q_,{}),xe<=500&&e.jsx(Y_,{nodeColor:B,nodeBorderRadius:8,pannable:!0,zoomable:!0}),e.jsxs(J_,{position:"top-right",className:"bg-background/95 backdrop-blur-sm rounded-lg border p-3 shadow-lg",children:[e.jsx("div",{className:"text-sm font-semibold mb-2",children:"图例"}),e.jsxs("div",{className:"space-y-2 text-xs",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("div",{className:"w-4 h-4 rounded bg-gradient-to-br from-blue-500 to-blue-600 border-2 border-blue-700"}),e.jsx("span",{children:"实体节点"})]}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("div",{className:"w-4 h-4 rounded bg-gradient-to-br from-green-500 to-green-600 border-2 border-green-700"}),e.jsx("span",{children:"段落节点"})]}),xe>200&&e.jsxs("div",{className:"mt-2 pt-2 border-t text-yellow-600 dark:text-yellow-500",children:[e.jsx("div",{className:"font-semibold",children:"性能模式"}),e.jsx("div",{children:"已禁用动画"}),xe>500&&e.jsx("div",{children:"已禁用缩略图"})]})]})]})]})}),e.jsx(Is,{open:!!ne,onOpenChange:H=>!H&&ve(null),children:e.jsxs(Os,{className:"max-w-2xl max-h-[80vh] overflow-y-auto",children:[e.jsx(Ds,{children:e.jsx(Rs,{children:"节点详情"})}),ne&&e.jsxs("div",{className:"space-y-4",children:[e.jsx("div",{className:"grid grid-cols-2 gap-4",children:e.jsxs("div",{children:[e.jsx("label",{className:"text-sm font-medium text-muted-foreground",children:"类型"}),e.jsx("div",{className:"mt-1",children:e.jsx(Se,{variant:ne.type==="entity"?"default":"secondary",children:ne.type==="entity"?"🏷️ 实体":"📄 段落"})})]})}),e.jsxs("div",{children:[e.jsx("label",{className:"text-sm font-medium text-muted-foreground",children:"ID"}),e.jsx("code",{className:"mt-1 block p-2 bg-muted rounded text-xs break-all",children:ne.id})]}),e.jsxs("div",{children:[e.jsx("label",{className:"text-sm font-medium text-muted-foreground",children:"内容"}),e.jsx(Ye,{className:"mt-1 h-40 p-3 bg-muted rounded",children:e.jsx("p",{className:"text-sm whitespace-pre-wrap",children:ne.content})})]})]})]})}),e.jsx(Is,{open:!!je,onOpenChange:H=>!H&&z(null),children:e.jsxs(Os,{className:"max-w-2xl max-h-[80vh] overflow-hidden flex flex-col",children:[e.jsx(Ds,{children:e.jsx(Rs,{children:"边详情"})}),je&&e.jsx(Ye,{className:"flex-1 pr-4",children:e.jsxs("div",{className:"space-y-4",children:[e.jsxs("div",{className:"flex items-center gap-4",children:[e.jsxs("div",{className:"flex-1 min-w-0 p-3 bg-blue-50 dark:bg-blue-950 rounded border-2 border-blue-200 dark:border-blue-800",children:[e.jsx("div",{className:"text-xs text-muted-foreground mb-1",children:"源节点"}),e.jsx("div",{className:"font-medium text-sm mb-2 truncate",children:je.source.content}),e.jsxs("code",{className:"text-xs text-muted-foreground truncate block",children:[je.source.id.slice(0,40),"..."]})]}),e.jsx("div",{className:"text-2xl text-muted-foreground flex-shrink-0",children:"→"}),e.jsxs("div",{className:"flex-1 min-w-0 p-3 bg-green-50 dark:bg-green-950 rounded border-2 border-green-200 dark:border-green-800",children:[e.jsx("div",{className:"text-xs text-muted-foreground mb-1",children:"目标节点"}),e.jsx("div",{className:"font-medium text-sm mb-2 truncate",children:je.target.content}),e.jsxs("code",{className:"text-xs text-muted-foreground truncate block",children:[je.target.id.slice(0,40),"..."]})]})]}),e.jsxs("div",{children:[e.jsx("label",{className:"text-sm font-medium text-muted-foreground",children:"权重"}),e.jsx("div",{className:"mt-1",children:e.jsx(Se,{variant:"outline",className:"text-base font-mono",children:je.edge.weight.toFixed(4)})})]})]})})]})}),e.jsx(vs,{open:R,onOpenChange:D,children:e.jsxs(ds,{children:[e.jsxs(us,{children:[e.jsx(xs,{children:"加载知识图谱"}),e.jsxs(hs,{children:["知识图谱的动态展示会消耗较多系统资源。",e.jsx("br",{}),"确定要加载知识图谱吗?"]})]}),e.jsxs(ms,{children:[e.jsx(ps,{onClick:()=>l({to:"/"}),children:"取消 (返回首页)"}),e.jsx(fs,{onClick:pe,children:"确认加载"})]})]})}),e.jsx(vs,{open:M,onOpenChange:T,children:e.jsxs(ds,{children:[e.jsxs(us,{children:[e.jsx(xs,{children:"⚠️ 节点数量较多"}),e.jsx(hs,{asChild:!0,children:e.jsxs("div",{children:[e.jsxs("p",{children:["您正在尝试加载 ",e.jsx("strong",{className:"text-orange-600",children:g>=1e4?"全部 (最多10000个)":g})," 个节点。"]}),e.jsx("p",{className:"mt-4",children:"节点数量过多可能导致:"}),e.jsxs("ul",{className:"list-disc list-inside mt-2 space-y-1",children:[e.jsx("li",{children:"页面加载时间较长"}),e.jsx("li",{children:"浏览器卡顿或崩溃"}),e.jsx("li",{children:"系统资源占用过高"})]}),e.jsx("p",{className:"mt-4",children:"建议先选择较少的节点数量 (50-200 个)。"})]})})]}),e.jsxs(ms,{children:[e.jsx(ps,{onClick:()=>{T(!1),g>200&&(N(50),b(!1))},children:"取消"}),e.jsx(fs,{onClick:ke,className:"bg-orange-600 hover:bg-orange-700",children:"我了解风险,继续加载"})]})]})})]})}function nk(){return e.jsxs("div",{className:"flex h-full flex-col",children:[e.jsx("div",{className:"flex-none border-b bg-card/50 px-6 py-4",children:e.jsx("div",{className:"flex items-center justify-between",children:e.jsxs("div",{children:[e.jsx("h1",{className:"text-2xl font-bold",children:"麦麦知识库管理"}),e.jsx("p",{className:"mt-1 text-sm text-muted-foreground",children:"管理和组织麦麦的知识库内容"})]})})}),e.jsx("div",{className:"flex-1 overflow-auto p-6",children:e.jsx("div",{className:"mx-auto max-w-4xl",children:e.jsxs(Ce,{children:[e.jsxs(De,{className:"text-center",children:[e.jsx("div",{className:"mx-auto mb-4 flex h-20 w-20 items-center justify-center rounded-full bg-primary/10",children:e.jsx(Hr,{className:"h-10 w-10 text-primary"})}),e.jsx(Le,{className:"text-2xl",children:"麦麦知识库管理"}),e.jsx(ws,{className:"text-base",children:"功能开发中,敬请期待"})]}),e.jsx(Ae,{className:"text-center text-sm text-muted-foreground",children:e.jsx("p",{children:"此功能将提供知识库的创建、编辑、导入和管理能力"})})]})})})]})}function Rg({className:l,classNames:n,showOutsideDays:i=!0,captionLayout:c="label",buttonVariant:u="ghost",formatters:x,components:h,...f}){const p=sv();return e.jsx(R_,{showOutsideDays:i,className:I("bg-background group/calendar p-3 [--cell-size:2rem] [[data-slot=card-content]_&]:bg-transparent [[data-slot=popover-content]_&]:bg-transparent",String.raw`rtl:**:[.rdp-button\_next>svg]:rotate-180`,String.raw`rtl:**:[.rdp-button\_previous>svg]:rotate-180`,l),captionLayout:c,formatters:{formatMonthDropdown:g=>g.toLocaleString("default",{month:"short"}),...x},classNames:{root:I("w-fit",p.root),months:I("relative flex flex-col gap-4 md:flex-row",p.months),month:I("flex w-full flex-col gap-4",p.month),nav:I("absolute inset-x-0 top-0 flex w-full items-center justify-between gap-1",p.nav),button_previous:I(qr({variant:u}),"h-[--cell-size] w-[--cell-size] select-none p-0 aria-disabled:opacity-50",p.button_previous),button_next:I(qr({variant:u}),"h-[--cell-size] w-[--cell-size] select-none p-0 aria-disabled:opacity-50",p.button_next),month_caption:I("flex h-[--cell-size] w-full items-center justify-center px-[--cell-size]",p.month_caption),dropdowns:I("flex h-[--cell-size] w-full items-center justify-center gap-1.5 text-sm font-medium",p.dropdowns),dropdown_root:I("has-focus:border-ring border-input shadow-xs has-focus:ring-ring/50 has-focus:ring-[3px] relative rounded-md border",p.dropdown_root),dropdown:I("bg-popover absolute inset-0 opacity-0",p.dropdown),caption_label:I("select-none font-medium",c==="label"?"text-sm":"[&>svg]:text-muted-foreground flex h-8 items-center gap-1 rounded-md pl-2 pr-1 text-sm [&>svg]:size-3.5",p.caption_label),table:"w-full border-collapse",weekdays:I("flex",p.weekdays),weekday:I("text-muted-foreground flex-1 select-none rounded-md text-[0.8rem] font-normal",p.weekday),week:I("mt-2 flex w-full",p.week),week_number_header:I("w-[--cell-size] select-none",p.week_number_header),week_number:I("text-muted-foreground select-none text-[0.8rem]",p.week_number),day:I("group/day relative aspect-square h-full w-full select-none p-0 text-center [&:first-child[data-selected=true]_button]:rounded-l-md [&:last-child[data-selected=true]_button]:rounded-r-md",p.day),range_start:I("bg-accent rounded-l-md",p.range_start),range_middle:I("rounded-none",p.range_middle),range_end:I("bg-accent rounded-r-md",p.range_end),today:I("bg-accent text-accent-foreground rounded-md data-[selected=true]:rounded-none",p.today),outside:I("text-muted-foreground aria-selected:text-muted-foreground",p.outside),disabled:I("text-muted-foreground opacity-50",p.disabled),hidden:I("invisible",p.hidden),...n},components:{Root:({className:g,rootRef:N,...v})=>e.jsx("div",{"data-slot":"calendar",ref:N,className:I(g),...v}),Chevron:({className:g,orientation:N,...v})=>N==="left"?e.jsx(za,{className:I("size-4",g),...v}):N==="right"?e.jsx(Zt,{className:I("size-4",g),...v}):e.jsx(Ma,{className:I("size-4",g),...v}),DayButton:rk,WeekNumber:({children:g,...N})=>e.jsx("td",{...N,children:e.jsx("div",{className:"flex size-[--cell-size] items-center justify-center text-center",children:g})}),...h},...f})}function rk({className:l,day:n,modifiers:i,...c}){const u=sv(),x=d.useRef(null);return d.useEffect(()=>{i.focused&&x.current?.focus()},[i.focused]),e.jsx(_,{ref:x,variant:"ghost",size:"icon","data-day":n.date.toLocaleDateString(),"data-selected-single":i.selected&&!i.range_start&&!i.range_end&&!i.range_middle,"data-range-start":i.range_start,"data-range-end":i.range_end,"data-range-middle":i.range_middle,className:I("data-[selected-single=true]:bg-primary data-[selected-single=true]:text-primary-foreground data-[range-middle=true]:bg-accent data-[range-middle=true]:text-accent-foreground data-[range-start=true]:bg-primary data-[range-start=true]:text-primary-foreground data-[range-end=true]:bg-primary data-[range-end=true]:text-primary-foreground group-data-[focused=true]/day:border-ring group-data-[focused=true]/day:ring-ring/50 flex aspect-square h-auto w-full min-w-[--cell-size] flex-col gap-1 font-normal leading-none data-[range-end=true]:rounded-md data-[range-middle=true]:rounded-none data-[range-start=true]:rounded-md group-data-[focused=true]/day:relative group-data-[focused=true]/day:z-10 group-data-[focused=true]/day:ring-[3px] [&>span]:text-xs [&>span]:opacity-70",u.day,l),...c})}const To={xs:{label:"小",rowHeight:28,class:"text-[10px] sm:text-xs"},sm:{label:"中",rowHeight:36,class:"text-xs sm:text-sm"},base:{label:"大",rowHeight:44,class:"text-sm sm:text-base"}};function ik(){const[l,n]=d.useState([]),[i,c]=d.useState(""),[u,x]=d.useState("all"),[h,f]=d.useState("all"),[p,g]=d.useState(void 0),[N,v]=d.useState(void 0),[y,w]=d.useState(!0),[b,R]=d.useState(!1),[D,S]=d.useState("xs"),[P,M]=d.useState(4),[T,A]=d.useState(!1),F=d.useRef(null);d.useEffect(()=>{const K=In.getAllLogs();n(K);const _e=In.onLog(()=>{n(In.getAllLogs())}),pe=In.onConnectionChange(ke=>{R(ke)});return()=>{_e(),pe()}},[]);const L=d.useMemo(()=>{const K=new Set(l.map(_e=>_e.module).filter(_e=>_e&&_e.trim()!==""));return Array.from(K).sort()},[l]),J=K=>{switch(K){case"DEBUG":return"text-muted-foreground";case"INFO":return"text-blue-500 dark:text-blue-400";case"WARNING":return"text-yellow-600 dark:text-yellow-500";case"ERROR":return"text-red-600 dark:text-red-500";case"CRITICAL":return"text-red-700 dark:text-red-400 font-bold";default:return"text-foreground"}},U=K=>{switch(K){case"DEBUG":return"bg-gray-800/30 dark:bg-gray-800/50";case"INFO":return"bg-blue-900/20 dark:bg-blue-500/20";case"WARNING":return"bg-yellow-900/20 dark:bg-yellow-500/20";case"ERROR":return"bg-red-900/20 dark:bg-red-500/20";case"CRITICAL":return"bg-red-900/30 dark:bg-red-600/30";default:return"bg-gray-800/20 dark:bg-gray-800/30"}},ue=()=>{window.location.reload()},xe=()=>{In.clearLogs(),n([])},he=()=>{const K=je.map(O=>`${O.timestamp} [${O.level.padEnd(8)}] [${O.module}] ${O.message}`).join(` -`),_e=new Blob([K],{type:"text/plain;charset=utf-8"}),pe=URL.createObjectURL(_e),ke=document.createElement("a");ke.href=pe,ke.download=`logs-${vm(new Date,"yyyy-MM-dd-HHmmss")}.txt`,ke.click(),URL.revokeObjectURL(pe)},ne=()=>{w(!y)},ve=()=>{g(void 0),v(void 0)},je=d.useMemo(()=>l.filter(K=>{const _e=i===""||K.message.toLowerCase().includes(i.toLowerCase())||K.module.toLowerCase().includes(i.toLowerCase()),pe=u==="all"||K.level===u,ke=h==="all"||K.module===h;let O=!0;if(p||N){const k=new Date(K.timestamp);if(p){const H=new Date(p);H.setHours(0,0,0,0),O=O&&k>=H}if(N){const H=new Date(N);H.setHours(23,59,59,999),O=O&&k<=H}}return _e&&pe&&ke&&O}),[l,i,u,h,p,N]),z=To[D].rowHeight+P,V=N0({count:je.length,getScrollElement:()=>F.current,estimateSize:()=>z,overscan:50}),B=d.useRef(!1),oe=d.useRef(je.length);return d.useEffect(()=>{const K=F.current;if(!K)return;const _e=()=>{if(B.current)return;const{scrollTop:pe,scrollHeight:ke,clientHeight:O}=K,k=ke-pe-O;k>100&&y?w(!1):k<50&&!y&&w(!0)};return K.addEventListener("scroll",_e,{passive:!0}),()=>K.removeEventListener("scroll",_e)},[y]),d.useEffect(()=>{const K=je.length>oe.current;oe.current=je.length,y&&je.length>0&&K&&(B.current=!0,V.scrollToIndex(je.length-1,{align:"end",behavior:"auto"}),requestAnimationFrame(()=>{requestAnimationFrame(()=>{B.current=!1})}))},[je.length,y,V]),e.jsxs("div",{className:"h-full flex flex-col overflow-hidden",children:[e.jsxs("div",{className:"flex-shrink-0 space-y-2 sm:space-y-3 p-2 sm:p-3 lg:p-4",children:[e.jsxs("div",{className:"flex items-center justify-between gap-3",children:[e.jsxs("div",{children:[e.jsx("h1",{className:"text-lg sm:text-xl lg:text-2xl font-bold",children:"日志查看器"}),e.jsx("p",{className:"text-xs text-muted-foreground mt-0.5 hidden sm:block",children:"实时查看和分析麦麦运行日志"})]}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("div",{className:I("h-2 w-2 sm:h-2.5 sm:w-2.5 rounded-full",b?"bg-green-500 animate-pulse":"bg-red-500")}),e.jsx("span",{className:"text-xs text-muted-foreground",children:b?"已连接":"未连接"})]})]}),e.jsx(Ce,{className:"p-2 sm:p-3",children:e.jsx(nc,{open:T,onOpenChange:A,children:e.jsxs("div",{className:"flex flex-col gap-2",children:[e.jsxs("div",{className:"flex gap-2",children:[e.jsxs("div",{className:"flex-1 relative min-w-0",children:[e.jsx(Ct,{className:"absolute left-2 top-1/2 -translate-y-1/2 h-3.5 w-3.5 text-muted-foreground"}),e.jsx(le,{placeholder:"搜索日志...",value:i,onChange:K=>c(K.target.value),className:"pl-8 h-8 text-xs sm:text-sm"})]}),e.jsxs("div",{className:"flex gap-1 flex-shrink-0",children:[e.jsxs(_,{variant:y?"default":"outline",size:"sm",onClick:ne,className:"h-8 px-2",title:y?"自动滚动":"已暂停",children:[y?e.jsx(l_,{className:"h-3.5 w-3.5"}):e.jsx(n_,{className:"h-3.5 w-3.5"}),e.jsx("span",{className:"ml-1 text-xs hidden sm:inline",children:y?"滚动":"暂停"})]}),e.jsxs(_,{variant:"outline",size:"sm",onClick:xe,className:"h-8 px-2",title:"清空日志",children:[e.jsx(ls,{className:"h-3.5 w-3.5"}),e.jsx("span",{className:"ml-1 text-xs hidden md:inline",children:"清空"})]}),e.jsxs(_,{variant:"outline",size:"sm",onClick:he,className:"h-8 px-2 hidden sm:flex",title:"导出日志",children:[e.jsx(sa,{className:"h-3.5 w-3.5"}),e.jsx("span",{className:"ml-1 text-xs hidden lg:inline",children:"导出"})]}),e.jsx(rc,{asChild:!0,children:e.jsxs(_,{variant:"outline",size:"sm",className:"h-8 px-2",title:T?"收起筛选":"展开筛选",children:[e.jsx(zo,{className:"h-3.5 w-3.5"}),T?e.jsx(Fr,{className:"h-3.5 w-3.5 ml-1"}):e.jsx(Ma,{className:"h-3.5 w-3.5 ml-1"})]})})]})]}),e.jsxs("div",{className:"text-xs text-muted-foreground text-center sm:text-right -mt-1",children:[e.jsxs("span",{className:"font-mono",children:[je.length," / ",l.length]}),e.jsx("span",{className:"ml-1",children:"条日志"})]}),e.jsxs(ic,{className:"space-y-2",children:[e.jsxs("div",{className:"flex flex-col gap-2 sm:flex-row sm:gap-2",children:[e.jsxs(Ie,{value:u,onValueChange:x,children:[e.jsxs($e,{className:"w-full sm:flex-1 h-8 text-xs",children:[e.jsx(zo,{className:"h-3.5 w-3.5 mr-1.5"}),e.jsx(Pe,{placeholder:"级别"})]}),e.jsxs(Be,{children:[e.jsx(X,{value:"all",children:"全部级别"}),e.jsx(X,{value:"DEBUG",children:"DEBUG"}),e.jsx(X,{value:"INFO",children:"INFO"}),e.jsx(X,{value:"WARNING",children:"WARNING"}),e.jsx(X,{value:"ERROR",children:"ERROR"}),e.jsx(X,{value:"CRITICAL",children:"CRITICAL"})]})]}),e.jsxs(Ie,{value:h,onValueChange:f,children:[e.jsxs($e,{className:"w-full sm:flex-1 h-8 text-xs",children:[e.jsx(zo,{className:"h-3.5 w-3.5 mr-1.5"}),e.jsx(Pe,{placeholder:"模块"})]}),e.jsxs(Be,{children:[e.jsx(X,{value:"all",children:"全部模块"}),L.map(K=>e.jsx(X,{value:K,children:K},K))]})]})]}),e.jsxs("div",{className:"flex flex-col gap-2 sm:flex-row sm:gap-2",children:[e.jsxs(ol,{children:[e.jsx(dl,{asChild:!0,children:e.jsxs(_,{variant:"outline",size:"sm",className:I("w-full sm:flex-1 justify-start text-left font-normal h-8",!p&&"text-muted-foreground"),children:[e.jsx($o,{className:"mr-1.5 h-3.5 w-3.5"}),e.jsx("span",{className:"text-xs",children:p?vm(p,"PP",{locale:ko}):"开始日期"})]})}),e.jsx(Wa,{className:"w-auto p-0",align:"start",children:e.jsx(Rg,{mode:"single",selected:p,onSelect:g,initialFocus:!0,locale:ko})})]}),e.jsxs(ol,{children:[e.jsx(dl,{asChild:!0,children:e.jsxs(_,{variant:"outline",size:"sm",className:I("w-full sm:flex-1 justify-start text-left font-normal h-8",!N&&"text-muted-foreground"),children:[e.jsx($o,{className:"mr-1.5 h-3.5 w-3.5"}),e.jsx("span",{className:"text-xs",children:N?vm(N,"PP",{locale:ko}):"结束日期"})]})}),e.jsx(Wa,{className:"w-auto p-0",align:"start",children:e.jsx(Rg,{mode:"single",selected:N,onSelect:v,initialFocus:!0,locale:ko})})]}),(p||N)&&e.jsxs(_,{variant:"outline",size:"sm",onClick:ve,className:"w-full sm:w-auto h-8",children:[e.jsx(Ta,{className:"h-3.5 w-3.5 sm:mr-1"}),e.jsx("span",{className:"text-xs",children:"清除"})]})]}),e.jsxs("div",{className:"flex flex-col gap-2 sm:flex-row sm:items-center sm:gap-3 pt-2 border-t border-border/50",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsxs("div",{className:"flex items-center gap-1.5 text-xs text-muted-foreground",children:[e.jsx(r_,{className:"h-3.5 w-3.5"}),e.jsx("span",{children:"字号"})]}),e.jsx("div",{className:"flex gap-1",children:Object.keys(To).map(K=>e.jsx(_,{variant:D===K?"default":"outline",size:"sm",onClick:()=>S(K),className:"h-6 px-2 text-xs",children:To[K].label},K))})]}),e.jsxs("div",{className:"flex items-center gap-2 flex-1 max-w-[200px]",children:[e.jsx("span",{className:"text-xs text-muted-foreground whitespace-nowrap",children:"行距"}),e.jsx(Va,{value:[P],onValueChange:([K])=>M(K),min:0,max:12,step:2,className:"flex-1"}),e.jsxs("span",{className:"text-xs text-muted-foreground w-7",children:[P,"px"]})]}),e.jsxs("div",{className:"flex gap-2 sm:hidden",children:[e.jsxs(_,{variant:"outline",size:"sm",onClick:ue,className:"flex-1 h-8",children:[e.jsx(dt,{className:"h-3.5 w-3.5 mr-1"}),e.jsx("span",{className:"text-xs",children:"刷新"})]}),e.jsxs(_,{variant:"outline",size:"sm",onClick:he,className:"flex-1 h-8",children:[e.jsx(sa,{className:"h-3.5 w-3.5 mr-1"}),e.jsx("span",{className:"text-xs",children:"导出"})]})]})]})]})]})})})]}),e.jsx("div",{className:"flex-1 min-h-0 px-2 sm:px-3 lg:px-4 pb-2 sm:pb-3 lg:pb-4",children:e.jsx(Ce,{className:"bg-black dark:bg-gray-950 border-gray-800 dark:border-gray-900 h-full overflow-hidden",children:e.jsx("div",{ref:F,className:I("h-full overflow-auto","[&::-webkit-scrollbar]:w-2.5","[&::-webkit-scrollbar-track]:bg-transparent","[&::-webkit-scrollbar-thumb]:bg-border [&::-webkit-scrollbar-thumb]:rounded-full","[&::-webkit-scrollbar-thumb:hover]:bg-border/80"),children:e.jsx("div",{className:I("p-2 sm:p-3 font-mono relative",To[D].class),style:{height:`${V.getTotalSize()}px`},children:je.length===0?e.jsx("div",{className:"text-gray-500 dark:text-gray-600 text-center py-8 text-xs sm:text-sm",children:"暂无日志数据"}):V.getVirtualItems().map(K=>{const _e=je[K.index];return e.jsxs("div",{"data-index":K.index,ref:V.measureElement,className:I("absolute top-0 left-0 w-full px-2 sm:px-3 rounded hover:bg-white/5 transition-colors",U(_e.level)),style:{transform:`translateY(${K.start}px)`,paddingTop:`${P/2}px`,paddingBottom:`${P/2}px`},children:[e.jsxs("div",{className:"flex flex-col gap-0.5 sm:hidden",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("span",{className:"text-gray-500 dark:text-gray-600 text-[10px]",children:_e.timestamp}),e.jsxs("span",{className:I("font-semibold text-[10px]",J(_e.level)),children:["[",_e.level,"]"]})]}),e.jsx("div",{className:"text-cyan-400 dark:text-cyan-500 truncate text-[10px]",children:_e.module}),e.jsx("div",{className:"text-gray-300 dark:text-gray-400 whitespace-pre-wrap break-words text-[10px]",children:_e.message})]}),e.jsxs("div",{className:"hidden sm:flex gap-2 items-start",children:[e.jsx("span",{className:"text-gray-500 dark:text-gray-600 flex-shrink-0 w-[130px] lg:w-[160px]",children:_e.timestamp}),e.jsxs("span",{className:I("flex-shrink-0 w-[65px] lg:w-[75px] font-semibold",J(_e.level)),children:["[",_e.level,"]"]}),e.jsx("span",{className:"text-cyan-400 dark:text-cyan-500 flex-shrink-0 w-[100px] lg:w-[130px] truncate",children:_e.module}),e.jsx("span",{className:"text-gray-300 dark:text-gray-400 flex-1 whitespace-pre-wrap break-words",children:_e.message})]})]},K.key)})})})})})]})}async function ck(){return(await we("/api/planner/overview")).json()}async function ok(l,n=1,i=20,c){const u=new URLSearchParams({page:n.toString(),page_size:i.toString()});return c&&u.append("search",c),(await we(`/api/planner/chat/${l}/logs?${u}`)).json()}async function dk(l,n){return(await we(`/api/planner/log/${l}/${n}`)).json()}async function uk(){return(await we("/api/replier/overview")).json()}async function mk(l,n=1,i=20,c){const u=new URLSearchParams({page:n.toString(),page_size:i.toString()});return c&&u.append("search",c),(await we(`/api/replier/chat/${l}/logs?${u}`)).json()}async function xk(l,n){return(await we(`/api/replier/log/${l}/${n}`)).json()}function Ov(){const[l,n]=d.useState(new Map),[i,c]=d.useState(!0),u=d.useCallback(async()=>{try{c(!0);const h=await Zm();if(h?.data){const f=new Map;h.data.forEach(p=>{f.set(p.chat_id,p.chat_name)}),n(f)}}catch(h){console.error("加载聊天列表失败:",h)}finally{c(!1)}},[]);d.useEffect(()=>{u()},[u]);const x=d.useCallback(h=>l.get(h)||h,[l]);return{chatNameMap:l,getChatName:x,loading:i,reload:u}}function Fo(l){return new Date(l*1e3).toLocaleString("zh-CN")}function Dv(l){const i=Date.now()/1e3-l;return i<60?"刚刚":i<3600?`${Math.floor(i/60)} 分钟前`:i<86400?`${Math.floor(i/3600)} 小时前`:`${Math.floor(i/86400)} 天前`}function Rv(l,n,i=1e4){d.useEffect(()=>{if(!l)return;const c=setInterval(n,i);return()=>clearInterval(c)},[l,n,i])}function hk({autoRefresh:l,refreshKey:n}){const[i,c]=d.useState("overview"),[u,x]=d.useState(null),{getChatName:h}=Ov(),[f,p]=d.useState(null),[g,N]=d.useState(!0),[v,y]=d.useState(null),[w,b]=d.useState(!1),[R,D]=d.useState(1),[S,P]=d.useState(20),[M,T]=d.useState(""),[A,F]=d.useState(""),[L,J]=d.useState(""),[U,ue]=d.useState(null),[xe,he]=d.useState(!1),[ne,ve]=d.useState(!1),je=d.useCallback(async()=>{try{N(!0);const k=await ck();p(k)}catch(k){console.error("加载规划器总览失败:",k)}finally{N(!1)}},[]),z=d.useCallback(async()=>{if(u)try{b(!0);const k=await ok(u.chat_id,R,S,A||void 0);y(k)}catch(k){console.error("加载聊天日志失败:",k)}finally{b(!1)}},[u,R,S,A]);d.useEffect(()=>{je()},[je]),d.useEffect(()=>{n>0&&(i==="overview"?je():z())},[n,i,je,z]),d.useEffect(()=>{i==="chat-logs"&&u&&z()},[i,u,z]),Rv(l,d.useCallback(()=>{i==="overview"?je():z()},[i,je,z]));const V=k=>{x(k),D(1),F(""),J(""),c("chat-logs")},B=()=>{c("overview"),x(null),y(null),F(""),J("")},oe=()=>{F(L),D(1)},K=()=>{J(""),F(""),D(1)},_e=async(k,H)=>{try{ve(!0),he(!0);const se=await dk(k,H);ue(se)}catch(se){console.error("加载计划详情失败:",se)}finally{ve(!1)}},pe=k=>{P(Number(k)),D(1)},ke=()=>{const k=parseInt(M),H=v?Math.ceil(v.total/v.page_size):0;!isNaN(k)&&k>=1&&k<=H&&(D(k),T(""))},O=v?Math.ceil(v.total/v.page_size):0;return e.jsxs(e.Fragment,{children:[e.jsx("div",{className:"space-y-4",children:i==="overview"?e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"grid gap-4 md:grid-cols-2",children:[e.jsxs(Ce,{children:[e.jsxs(De,{className:"flex flex-row items-center justify-between space-y-0 pb-2",children:[e.jsx(Le,{className:"text-sm font-medium",children:"聊天数量"}),e.jsx(Ea,{className:"h-4 w-4 text-muted-foreground"})]}),e.jsx(Ae,{children:g?e.jsx(js,{className:"h-8 w-16"}):e.jsx("div",{className:"text-2xl font-bold",children:f?.total_chats||0})})]}),e.jsxs(Ce,{children:[e.jsxs(De,{className:"flex flex-row items-center justify-between space-y-0 pb-2",children:[e.jsx(Le,{className:"text-sm font-medium",children:"计划总数"}),e.jsx(Vm,{className:"h-4 w-4 text-muted-foreground"})]}),e.jsx(Ae,{children:g?e.jsx(js,{className:"h-8 w-16"}):e.jsx("div",{className:"text-2xl font-bold",children:f?.total_plans||0})})]})]}),e.jsxs(Ce,{children:[e.jsxs(De,{children:[e.jsx(Le,{children:"聊天列表"}),e.jsx(ws,{children:"点击查看该聊天的所有计划记录"})]}),e.jsx(Ae,{children:g?e.jsx("div",{className:"grid gap-3 md:grid-cols-2 lg:grid-cols-3",children:[...Array(6)].map((k,H)=>e.jsx(js,{className:"h-24 w-full"},H))}):f?.chats&&f.chats.length>0?e.jsx("div",{className:"grid gap-3 md:grid-cols-2 lg:grid-cols-3",children:f.chats.map(k=>e.jsxs("div",{className:"border rounded-lg p-4 hover:bg-accent/50 transition-colors cursor-pointer",onClick:()=>V(k),children:[e.jsxs("div",{className:"flex items-start justify-between mb-2",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(Ea,{className:"h-4 w-4 text-muted-foreground"}),e.jsx("span",{className:"text-sm truncate max-w-[180px]",title:h(k.chat_id),children:h(k.chat_id)})]}),e.jsx(Se,{variant:"secondary",children:k.plan_count})]}),e.jsxs("div",{className:"text-xs text-muted-foreground",children:["最后活动: ",Dv(k.latest_timestamp)]})]},k.chat_id))}):e.jsx("div",{className:"text-center py-8 text-muted-foreground",children:"暂无聊天记录"})})]})]}):e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"flex items-center gap-4 mb-4",children:[e.jsxs(_,{variant:"outline",size:"sm",onClick:B,children:[e.jsx(Ca,{className:"h-4 w-4 mr-2"}),"返回聊天列表"]}),e.jsxs("div",{className:"text-sm text-muted-foreground",children:["当前聊天: ",e.jsx("span",{className:"font-medium",children:u?h(u.chat_id):""}),e.jsx("span",{className:"mx-2",children:"•"}),"共 ",v?.total||0," 条计划记录"]})]}),e.jsxs(Ce,{children:[e.jsxs(De,{children:[e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsxs("div",{children:[e.jsx(Le,{children:"计划执行记录"}),e.jsx(ws,{children:u?h(u.chat_id):""})]}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsxs("div",{className:"flex items-center gap-1",children:[e.jsx(le,{placeholder:"搜索提示词内容...",value:L,onChange:k=>J(k.target.value),onKeyDown:k=>k.key==="Enter"&&oe(),className:"w-48"}),e.jsx(_,{variant:"outline",size:"icon",onClick:oe,children:e.jsx(Ct,{className:"h-4 w-4"})}),A&&e.jsx(_,{variant:"ghost",size:"sm",onClick:K,children:"清除"})]}),e.jsxs(Ie,{value:S.toString(),onValueChange:pe,children:[e.jsx($e,{className:"w-32",children:e.jsx(Pe,{})}),e.jsxs(Be,{children:[e.jsx(X,{value:"10",children:"10条/页"}),e.jsx(X,{value:"20",children:"20条/页"}),e.jsx(X,{value:"50",children:"50条/页"}),e.jsx(X,{value:"100",children:"100条/页"})]})]})]})]}),A&&e.jsxs("div",{className:"text-sm text-muted-foreground mt-2",children:["搜索关键词: ",e.jsxs("span",{className:"font-medium",children:['"',A,'"']})]})]}),e.jsx(Ae,{children:w?e.jsx("div",{className:"space-y-2",children:[...Array(5)].map((k,H)=>e.jsx(js,{className:"h-20 w-full"},H))}):v?.data&&v.data.length>0?e.jsxs(e.Fragment,{children:[e.jsx("div",{className:"space-y-2",children:v.data.map(k=>e.jsxs("div",{className:"border rounded-lg p-3 hover:bg-accent/50 transition-colors cursor-pointer",onClick:()=>_e(k.chat_id,k.filename),children:[e.jsxs("div",{className:"flex items-center justify-between mb-2",children:[e.jsx("span",{className:"text-sm font-medium text-muted-foreground",children:Fo(k.timestamp)}),e.jsxs("div",{className:"flex items-center gap-2 text-xs text-muted-foreground",children:[e.jsxs(Se,{variant:"secondary",className:"text-xs",children:[k.action_count," 个动作"]}),e.jsxs(Se,{variant:"outline",className:"text-xs",children:[k.total_plan_ms.toFixed(0),"ms"]})]})]}),k.action_types&&k.action_types.length>0&&e.jsx("div",{className:"flex flex-wrap gap-1 mb-2",children:k.action_types.map((H,se)=>e.jsx(Se,{variant:"outline",className:"text-xs bg-blue-50 dark:bg-blue-950 text-blue-700 dark:text-blue-300 border-blue-200 dark:border-blue-800",children:H},se))}),e.jsx("p",{className:"text-sm line-clamp-2",children:k.reasoning_preview||"无推理内容"})]},k.filename))}),e.jsxs("div",{className:"flex items-center justify-between mt-4 pt-4 border-t",children:[e.jsxs("div",{className:"text-sm text-muted-foreground",children:["共 ",v.total," 条记录,第 ",R," / ",O," 页"]}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(_,{variant:"outline",size:"sm",onClick:()=>D(1),disabled:R===1,children:e.jsx(gn,{className:"h-4 w-4"})}),e.jsx(_,{variant:"outline",size:"sm",onClick:()=>D(k=>Math.max(1,k-1)),disabled:R===1,children:e.jsx(za,{className:"h-4 w-4"})}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(le,{type:"number",min:1,max:O,value:M,onChange:k=>T(k.target.value),onKeyDown:k=>k.key==="Enter"&&ke(),placeholder:"跳转",className:"w-20 h-8"}),e.jsx(_,{size:"sm",variant:"outline",onClick:ke,children:"跳转"})]}),e.jsx(_,{variant:"outline",size:"sm",onClick:()=>D(k=>Math.min(O,k+1)),disabled:R===O,children:e.jsx(Zt,{className:"h-4 w-4"})}),e.jsx(_,{variant:"outline",size:"sm",onClick:()=>D(O),disabled:R===O,children:e.jsx(jn,{className:"h-4 w-4"})})]})]})]}):e.jsx("div",{className:"text-center py-8 text-muted-foreground",children:"暂无计划记录"})})]})]})}),e.jsx(Is,{open:xe,onOpenChange:he,children:e.jsxs(Os,{className:"max-w-4xl max-h-[80vh] grid grid-rows-[auto_1fr_auto] overflow-hidden",children:[e.jsxs(Ds,{children:[e.jsxs(Rs,{className:"flex items-center gap-2",children:[e.jsx(ka,{className:"h-5 w-5"}),"计划执行详情"]}),e.jsx(Ks,{children:"查看麦麦的详细计划推理过程和执行动作"})]}),e.jsx(Ye,{className:"h-full pr-4",children:e.jsx("div",{className:"space-y-6 pb-4",children:ne?e.jsx("div",{className:"space-y-4",children:[...Array(5)].map((k,H)=>e.jsx(js,{className:"h-24 w-full"},H))}):U?e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"space-y-2",children:[e.jsxs("h3",{className:"text-sm font-semibold flex items-center gap-2",children:[e.jsx(na,{className:"h-4 w-4"}),"基本信息"]}),e.jsxs("div",{className:"grid grid-cols-2 gap-4 p-4 bg-muted/50 rounded-lg",children:[e.jsxs("div",{children:[e.jsx("div",{className:"text-xs text-muted-foreground mb-1",children:"聊天"}),e.jsx("div",{className:"text-sm",title:U.chat_id,children:h(U.chat_id)})]}),e.jsxs("div",{children:[e.jsx("div",{className:"text-xs text-muted-foreground mb-1",children:"时间戳"}),e.jsx("div",{className:"text-sm",children:Fo(U.timestamp)})]}),e.jsxs("div",{children:[e.jsx("div",{className:"text-xs text-muted-foreground mb-1",children:"类型"}),e.jsx(Se,{variant:"outline",children:U.type})]}),e.jsxs("div",{children:[e.jsx("div",{className:"text-xs text-muted-foreground mb-1",children:"动作数量"}),e.jsxs(Se,{children:[U.actions.length," 个动作"]})]})]})]}),e.jsx(Yt,{}),e.jsxs("div",{className:"space-y-2",children:[e.jsxs("h3",{className:"text-sm font-semibold flex items-center gap-2",children:[e.jsx(Za,{className:"h-4 w-4"}),"性能统计"]}),e.jsxs("div",{className:"grid grid-cols-3 gap-3",children:[e.jsxs(Ce,{children:[e.jsx(De,{className:"p-4 pb-2",children:e.jsx(Le,{className:"text-xs text-muted-foreground",children:"提示词构建"})}),e.jsx(Ae,{className:"p-4 pt-0",children:e.jsxs("div",{className:"text-xl font-bold",children:[U.timing.prompt_build_ms?.toFixed(2)||0,"ms"]})})]}),e.jsxs(Ce,{children:[e.jsx(De,{className:"p-4 pb-2",children:e.jsx(Le,{className:"text-xs text-muted-foreground",children:"LLM 推理"})}),e.jsx(Ae,{className:"p-4 pt-0",children:e.jsxs("div",{className:"text-xl font-bold",children:[U.timing.llm_duration_ms?.toFixed(2)||0,"ms"]})})]}),e.jsxs(Ce,{children:[e.jsx(De,{className:"p-4 pb-2",children:e.jsx(Le,{className:"text-xs text-muted-foreground",children:"总计划时间"})}),e.jsx(Ae,{className:"p-4 pt-0",children:e.jsxs("div",{className:"text-xl font-bold",children:[U.timing.total_plan_ms?.toFixed(2)||0,"ms"]})})]})]})]}),e.jsx(Yt,{}),e.jsxs("div",{className:"space-y-2",children:[e.jsxs("h3",{className:"text-sm font-semibold flex items-center gap-2",children:[e.jsx(Xm,{className:"h-4 w-4"}),"推理过程"]}),e.jsx("div",{className:"p-4 bg-muted/50 rounded-lg",children:e.jsx("p",{className:"text-sm whitespace-pre-wrap leading-relaxed",children:U.reasoning||"无推理内容"})})]}),e.jsx(Yt,{}),e.jsxs("div",{className:"space-y-2",children:[e.jsxs("h3",{className:"text-sm font-semibold flex items-center gap-2",children:[e.jsx(i_,{className:"h-4 w-4"}),"执行动作 (",U.actions.length,")"]}),e.jsx("div",{className:"space-y-3",children:U.actions.map((k,H)=>e.jsxs(Ce,{children:[e.jsx(De,{className:"p-4 pb-3",children:e.jsx("div",{className:"flex items-start justify-between",children:e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsxs(Se,{variant:"default",children:["动作 ",H+1]}),e.jsx(Se,{variant:"outline",children:k.action_type})]})})}),e.jsxs(Ae,{className:"p-4 pt-0 space-y-3",children:[k.reasoning&&e.jsxs("div",{children:[e.jsx("div",{className:"text-xs font-medium text-muted-foreground mb-1",children:"推理依据"}),e.jsx("p",{className:"text-sm bg-muted/30 p-2 rounded",children:typeof k.reasoning=="string"?k.reasoning:JSON.stringify(k.reasoning)})]}),k.action_message&&e.jsxs("div",{className:"overflow-hidden",children:[e.jsx("div",{className:"text-xs font-medium text-muted-foreground mb-1",children:"动作消息"}),typeof k.action_message=="string"?e.jsx("p",{className:"text-sm bg-muted/30 p-2 rounded break-all whitespace-pre-wrap",children:k.action_message}):e.jsx("pre",{className:"text-xs bg-muted/30 p-2 rounded overflow-x-auto whitespace-pre-wrap break-all",children:JSON.stringify(k.action_message,null,2)})]}),k.action_data&&Object.keys(k.action_data).length>0&&e.jsxs("div",{children:[e.jsx("div",{className:"text-xs font-medium text-muted-foreground mb-1",children:"动作数据"}),e.jsx("pre",{className:"text-xs bg-muted/30 p-2 rounded overflow-x-auto",children:JSON.stringify(k.action_data,null,2)})]}),k.action_reasoning&&e.jsxs("div",{children:[e.jsx("div",{className:"text-xs font-medium text-muted-foreground mb-1",children:"动作推理"}),e.jsx("p",{className:"text-sm bg-muted/30 p-2 rounded",children:typeof k.action_reasoning=="string"?k.action_reasoning:JSON.stringify(k.action_reasoning)})]})]})]},H))})]}),e.jsx(Yt,{}),U.raw_output&&e.jsxs("div",{className:"space-y-2",children:[e.jsx("h3",{className:"text-sm font-semibold",children:"原始输出"}),e.jsxs("details",{className:"group",children:[e.jsx("summary",{className:"cursor-pointer text-sm text-muted-foreground hover:text-foreground",children:"点击展开查看完整原始输出"}),e.jsx("div",{className:"mt-2 p-4 bg-muted/50 rounded-lg",children:e.jsx("pre",{className:"text-xs whitespace-pre-wrap break-words",children:U.raw_output})})]})]}),U.prompt&&e.jsxs("div",{className:"space-y-2",children:[e.jsx("h3",{className:"text-sm font-semibold",children:"完整提示词"}),e.jsxs("details",{className:"group",children:[e.jsx("summary",{className:"cursor-pointer text-sm text-muted-foreground hover:text-foreground",children:"点击展开查看完整提示词"}),e.jsx("div",{className:"mt-2 p-4 bg-muted/50 rounded-lg",children:e.jsx("pre",{className:"text-xs whitespace-pre-wrap break-words",children:U.prompt})})]})]})]}):e.jsx("div",{className:"flex items-center justify-center py-12",children:e.jsx("p",{className:"text-muted-foreground",children:"无数据"})})})}),e.jsx(st,{className:"flex-shrink-0",children:e.jsx(_,{onClick:()=>he(!1),children:"关闭"})})]})})]})}function fk({autoRefresh:l,refreshKey:n}){const[i,c]=d.useState("overview"),[u,x]=d.useState(null),{getChatName:h}=Ov(),[f,p]=d.useState(null),[g,N]=d.useState(!0),[v,y]=d.useState(null),[w,b]=d.useState(!1),[R,D]=d.useState(1),[S,P]=d.useState(20),[M,T]=d.useState(""),[A,F]=d.useState(""),[L,J]=d.useState(""),[U,ue]=d.useState(null),[xe,he]=d.useState(!1),[ne,ve]=d.useState(!1),je=d.useCallback(async()=>{try{N(!0);const k=await uk();p(k)}catch(k){console.error("加载回复器总览失败:",k)}finally{N(!1)}},[]),z=d.useCallback(async()=>{if(u)try{b(!0);const k=await mk(u.chat_id,R,S,A||void 0);y(k)}catch(k){console.error("加载聊天日志失败:",k)}finally{b(!1)}},[u,R,S,A]);d.useEffect(()=>{je()},[je]),d.useEffect(()=>{n>0&&(i==="overview"?je():z())},[n,i,je,z]),d.useEffect(()=>{i==="chat-logs"&&u&&z()},[i,u,z]),Rv(l,d.useCallback(()=>{i==="overview"?je():z()},[i,je,z]));const V=k=>{x(k),D(1),F(""),J(""),c("chat-logs")},B=()=>{c("overview"),x(null),y(null),F(""),J("")},oe=()=>{F(L),D(1)},K=()=>{J(""),F(""),D(1)},_e=async(k,H)=>{try{ve(!0),he(!0);const se=await xk(k,H);ue(se)}catch(se){console.error("加载回复详情失败:",se)}finally{ve(!1)}},pe=k=>{P(Number(k)),D(1)},ke=()=>{const k=parseInt(M),H=v?Math.ceil(v.total/v.page_size):0;!isNaN(k)&&k>=1&&k<=H&&(D(k),T(""))},O=v?Math.ceil(v.total/v.page_size):0;return e.jsxs(e.Fragment,{children:[e.jsx("div",{className:"space-y-4",children:i==="overview"?e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"grid gap-4 md:grid-cols-2",children:[e.jsxs(Ce,{children:[e.jsxs(De,{className:"flex flex-row items-center justify-between space-y-0 pb-2",children:[e.jsx(Le,{className:"text-sm font-medium",children:"聊天数量"}),e.jsx(Ea,{className:"h-4 w-4 text-muted-foreground"})]}),e.jsx(Ae,{children:g?e.jsx(js,{className:"h-8 w-16"}):e.jsx("div",{className:"text-2xl font-bold",children:f?.total_chats||0})})]}),e.jsxs(Ce,{children:[e.jsxs(De,{className:"flex flex-row items-center justify-between space-y-0 pb-2",children:[e.jsx(Le,{className:"text-sm font-medium",children:"回复总数"}),e.jsx(Vm,{className:"h-4 w-4 text-muted-foreground"})]}),e.jsx(Ae,{children:g?e.jsx(js,{className:"h-8 w-16"}):e.jsx("div",{className:"text-2xl font-bold",children:f?.total_replies||0})})]})]}),e.jsxs(Ce,{children:[e.jsxs(De,{children:[e.jsx(Le,{children:"聊天列表"}),e.jsx(ws,{children:"点击查看该聊天的所有回复记录"})]}),e.jsx(Ae,{children:g?e.jsx("div",{className:"grid gap-3 md:grid-cols-2 lg:grid-cols-3",children:[...Array(6)].map((k,H)=>e.jsx(js,{className:"h-24 w-full"},H))}):f?.chats&&f.chats.length>0?e.jsx("div",{className:"grid gap-3 md:grid-cols-2 lg:grid-cols-3",children:f.chats.map(k=>e.jsxs("div",{className:"border rounded-lg p-4 hover:bg-accent/50 transition-colors cursor-pointer",onClick:()=>V(k),children:[e.jsxs("div",{className:"flex items-start justify-between mb-2",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(Ea,{className:"h-4 w-4 text-muted-foreground"}),e.jsx("span",{className:"text-sm truncate max-w-[180px]",title:h(k.chat_id),children:h(k.chat_id)})]}),e.jsx(Se,{variant:"secondary",children:k.reply_count})]}),e.jsxs("div",{className:"text-xs text-muted-foreground",children:["最后活动: ",Dv(k.latest_timestamp)]})]},k.chat_id))}):e.jsx("div",{className:"text-center py-8 text-muted-foreground",children:"暂无聊天记录"})})]})]}):e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"flex items-center gap-4 mb-4",children:[e.jsxs(_,{variant:"outline",size:"sm",onClick:B,children:[e.jsx(Ca,{className:"h-4 w-4 mr-2"}),"返回聊天列表"]}),e.jsxs("div",{className:"text-sm text-muted-foreground",children:["当前聊天: ",e.jsx("span",{className:"font-medium",children:u?h(u.chat_id):""}),e.jsx("span",{className:"mx-2",children:"•"}),"共 ",v?.total||0," 条回复记录"]})]}),e.jsxs(Ce,{children:[e.jsxs(De,{children:[e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsxs("div",{children:[e.jsx(Le,{children:"回复生成记录"}),e.jsx(ws,{children:u?h(u.chat_id):""})]}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsxs("div",{className:"flex items-center gap-1",children:[e.jsx(le,{placeholder:"搜索提示词内容...",value:L,onChange:k=>J(k.target.value),onKeyDown:k=>k.key==="Enter"&&oe(),className:"w-48"}),e.jsx(_,{variant:"outline",size:"icon",onClick:oe,children:e.jsx(Ct,{className:"h-4 w-4"})}),A&&e.jsx(_,{variant:"ghost",size:"sm",onClick:K,children:"清除"})]}),e.jsxs(Ie,{value:S.toString(),onValueChange:pe,children:[e.jsx($e,{className:"w-32",children:e.jsx(Pe,{})}),e.jsxs(Be,{children:[e.jsx(X,{value:"10",children:"10条/页"}),e.jsx(X,{value:"20",children:"20条/页"}),e.jsx(X,{value:"50",children:"50条/页"}),e.jsx(X,{value:"100",children:"100条/页"})]})]})]})]}),A&&e.jsxs("div",{className:"text-sm text-muted-foreground mt-2",children:["搜索关键词: ",e.jsxs("span",{className:"font-medium",children:['"',A,'"']})]})]}),e.jsx(Ae,{children:w?e.jsx("div",{className:"space-y-2",children:[...Array(5)].map((k,H)=>e.jsx(js,{className:"h-20 w-full"},H))}):v?.data&&v.data.length>0?e.jsxs(e.Fragment,{children:[e.jsx("div",{className:"space-y-2",children:v.data.map(k=>e.jsxs("div",{className:"border rounded-lg p-3 hover:bg-accent/50 transition-colors cursor-pointer",onClick:()=>_e(k.chat_id,k.filename),children:[e.jsxs("div",{className:"flex items-center justify-between mb-2",children:[e.jsx("span",{className:"text-sm font-medium text-muted-foreground",children:Fo(k.timestamp)}),e.jsxs("div",{className:"flex items-center gap-2 text-xs text-muted-foreground",children:[k.success?e.jsxs(Se,{variant:"default",className:"text-xs bg-green-600",children:[e.jsx(ig,{className:"h-3 w-3 mr-1"}),"成功"]}):e.jsxs(Se,{variant:"destructive",className:"text-xs",children:[e.jsx(Ga,{className:"h-3 w-3 mr-1"}),"失败"]}),e.jsx(Se,{variant:"outline",className:"text-xs",children:k.model}),e.jsxs(Se,{variant:"secondary",className:"text-xs",children:[k.overall_ms.toFixed(0),"ms"]})]})]}),e.jsx("p",{className:"text-sm line-clamp-2",children:k.output_preview||"无输出内容"})]},k.filename))}),e.jsxs("div",{className:"flex items-center justify-between mt-4 pt-4 border-t",children:[e.jsxs("div",{className:"text-sm text-muted-foreground",children:["共 ",v.total," 条记录,第 ",R," / ",O," 页"]}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(_,{variant:"outline",size:"sm",onClick:()=>D(1),disabled:R===1,children:e.jsx(gn,{className:"h-4 w-4"})}),e.jsx(_,{variant:"outline",size:"sm",onClick:()=>D(k=>Math.max(1,k-1)),disabled:R===1,children:e.jsx(za,{className:"h-4 w-4"})}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(le,{type:"number",min:1,max:O,value:M,onChange:k=>T(k.target.value),onKeyDown:k=>k.key==="Enter"&&ke(),placeholder:"跳转",className:"w-20 h-8"}),e.jsx(_,{size:"sm",variant:"outline",onClick:ke,children:"跳转"})]}),e.jsx(_,{variant:"outline",size:"sm",onClick:()=>D(k=>Math.min(O,k+1)),disabled:R===O,children:e.jsx(Zt,{className:"h-4 w-4"})}),e.jsx(_,{variant:"outline",size:"sm",onClick:()=>D(O),disabled:R===O,children:e.jsx(jn,{className:"h-4 w-4"})})]})]})]}):e.jsx("div",{className:"text-center py-8 text-muted-foreground",children:"暂无回复记录"})})]})]})}),e.jsx(Is,{open:xe,onOpenChange:he,children:e.jsxs(Os,{className:"max-w-4xl max-h-[80vh] grid grid-rows-[auto_1fr_auto] overflow-hidden",children:[e.jsxs(Ds,{children:[e.jsxs(Rs,{className:"flex items-center gap-2",children:[e.jsx(ka,{className:"h-5 w-5"}),"回复生成详情"]}),e.jsx(Ks,{children:"查看麦麦的详细回复生成过程"})]}),e.jsx(Ye,{className:"h-full pr-4",children:e.jsx("div",{className:"space-y-6 pb-4",children:ne?e.jsx("div",{className:"space-y-4",children:[...Array(5)].map((k,H)=>e.jsx(js,{className:"h-24 w-full"},H))}):U?e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"space-y-2",children:[e.jsxs("h3",{className:"text-sm font-semibold flex items-center gap-2",children:[e.jsx(na,{className:"h-4 w-4"}),"基本信息"]}),e.jsxs("div",{className:"grid grid-cols-2 gap-4 p-4 bg-muted/50 rounded-lg",children:[e.jsxs("div",{children:[e.jsx("div",{className:"text-xs text-muted-foreground mb-1",children:"聊天"}),e.jsx("div",{className:"text-sm",title:U.chat_id,children:h(U.chat_id)})]}),e.jsxs("div",{children:[e.jsx("div",{className:"text-xs text-muted-foreground mb-1",children:"时间戳"}),e.jsx("div",{className:"text-sm",children:Fo(U.timestamp)})]}),e.jsxs("div",{children:[e.jsx("div",{className:"text-xs text-muted-foreground mb-1",children:"状态"}),U.success?e.jsxs(Se,{variant:"default",className:"bg-green-600",children:[e.jsx(ig,{className:"h-3 w-3 mr-1"}),"成功"]}):e.jsxs(Se,{variant:"destructive",children:[e.jsx(Ga,{className:"h-3 w-3 mr-1"}),"失败"]})]}),e.jsxs("div",{children:[e.jsx("div",{className:"text-xs text-muted-foreground mb-1",children:"思考深度"}),e.jsxs(Se,{variant:"outline",children:["Level ",U.think_level]})]})]})]}),e.jsx(Yt,{}),e.jsxs("div",{className:"space-y-2",children:[e.jsxs("h3",{className:"text-sm font-semibold flex items-center gap-2",children:[e.jsx(c_,{className:"h-4 w-4"}),"模型信息"]}),e.jsx("div",{className:"p-4 bg-muted/50 rounded-lg",children:e.jsx(Se,{variant:"secondary",className:"text-sm",children:U.model})})]}),e.jsx(Yt,{}),e.jsxs("div",{className:"space-y-2",children:[e.jsxs("h3",{className:"text-sm font-semibold flex items-center gap-2",children:[e.jsx(Za,{className:"h-4 w-4"}),"性能统计"]}),e.jsxs("div",{className:"grid grid-cols-3 gap-3",children:[e.jsxs(Ce,{children:[e.jsx(De,{className:"p-4 pb-2",children:e.jsx(Le,{className:"text-xs text-muted-foreground",children:"提示词构建"})}),e.jsx(Ae,{className:"p-4 pt-0",children:e.jsxs("div",{className:"text-xl font-bold",children:[U.timing.prompt_ms?.toFixed(2)||0,"ms"]})})]}),e.jsxs(Ce,{children:[e.jsx(De,{className:"p-4 pb-2",children:e.jsx(Le,{className:"text-xs text-muted-foreground",children:"LLM 推理"})}),e.jsx(Ae,{className:"p-4 pt-0",children:e.jsxs("div",{className:"text-xl font-bold",children:[U.timing.llm_ms?.toFixed(2)||0,"ms"]})})]}),e.jsxs(Ce,{children:[e.jsx(De,{className:"p-4 pb-2",children:e.jsx(Le,{className:"text-xs text-muted-foreground",children:"总耗时"})}),e.jsx(Ae,{className:"p-4 pt-0",children:e.jsxs("div",{className:"text-xl font-bold",children:[U.timing.overall_ms?.toFixed(2)||0,"ms"]})})]})]}),U.timing.timing_logs&&U.timing.timing_logs.length>0&&e.jsxs("div",{className:"mt-3 p-3 bg-muted/30 rounded-lg",children:[e.jsx("div",{className:"text-xs font-medium text-muted-foreground mb-2",children:"耗时详情"}),e.jsx("div",{className:"space-y-1",children:U.timing.timing_logs.map((k,H)=>e.jsx("div",{className:"text-xs text-muted-foreground",children:k},H))})]}),U.timing.almost_zero&&e.jsxs("div",{className:"mt-2 text-xs text-muted-foreground",children:[e.jsx("span",{className:"font-medium",children:"近乎零耗时: "}),U.timing.almost_zero]})]}),e.jsx(Yt,{}),e.jsxs("div",{className:"space-y-2",children:[e.jsxs("h3",{className:"text-sm font-semibold flex items-center gap-2",children:[e.jsx(Xm,{className:"h-4 w-4"}),"回复输出"]}),e.jsx("div",{className:"p-4 bg-muted/50 rounded-lg",children:e.jsx("p",{className:"text-sm whitespace-pre-wrap leading-relaxed",children:U.output||"无输出内容"})})]}),U.processed_output&&U.processed_output.length>0&&e.jsxs(e.Fragment,{children:[e.jsx(Yt,{}),e.jsxs("div",{className:"space-y-2",children:[e.jsx("h3",{className:"text-sm font-semibold",children:"处理后的输出"}),e.jsx("div",{className:"space-y-2",children:U.processed_output.map((k,H)=>e.jsx("div",{className:"p-3 bg-muted/30 rounded-lg",children:e.jsx("p",{className:"text-sm whitespace-pre-wrap",children:k})},H))})]})]}),U.reasoning&&e.jsxs(e.Fragment,{children:[e.jsx(Yt,{}),e.jsxs("div",{className:"space-y-2",children:[e.jsx("h3",{className:"text-sm font-semibold",children:"推理过程"}),e.jsx("div",{className:"p-4 bg-muted/50 rounded-lg",children:e.jsx("p",{className:"text-sm whitespace-pre-wrap leading-relaxed",children:U.reasoning})})]})]}),U.error&&e.jsxs(e.Fragment,{children:[e.jsx(Yt,{}),e.jsxs("div",{className:"space-y-2",children:[e.jsx("h3",{className:"text-sm font-semibold text-destructive",children:"错误信息"}),e.jsx("div",{className:"p-4 bg-destructive/10 rounded-lg border border-destructive/20",children:e.jsx("p",{className:"text-sm text-destructive whitespace-pre-wrap",children:U.error})})]})]}),U.prompt&&e.jsxs(e.Fragment,{children:[e.jsx(Yt,{}),e.jsxs("div",{className:"space-y-2",children:[e.jsx("h3",{className:"text-sm font-semibold",children:"完整提示词"}),e.jsxs("details",{className:"group",children:[e.jsx("summary",{className:"cursor-pointer text-sm text-muted-foreground hover:text-foreground",children:"点击展开查看完整提示词"}),e.jsx("div",{className:"mt-2 p-4 bg-muted/50 rounded-lg",children:e.jsx("pre",{className:"text-xs whitespace-pre-wrap break-words",children:U.prompt})})]})]})]})]}):e.jsx("div",{className:"flex items-center justify-center py-12",children:e.jsx("p",{className:"text-muted-foreground",children:"无数据"})})})}),e.jsx(st,{className:"flex-shrink-0",children:e.jsx(_,{onClick:()=>he(!1),children:"关闭"})})]})})]})}function pk(){const[l,n]=d.useState("planner"),[i,c]=d.useState(!1),[u,x]=d.useState(0),h=d.useCallback(()=>{x(f=>f+1)},[]);return e.jsxs("div",{className:"space-y-4 sm:space-y-6 p-4 sm:p-6",children:[e.jsxs("div",{className:"flex flex-col sm:flex-row sm:items-center justify-between gap-4",children:[e.jsxs("div",{children:[e.jsx("h1",{className:"text-2xl sm:text-3xl font-bold",children:"计划器 & 回复器监控"}),e.jsx("p",{className:"text-muted-foreground mt-1 sm:mt-2 text-sm sm:text-base",children:"实时监控麦麦的任务计划器和回复生成器运行状态"})]}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsxs(_,{variant:i?"default":"outline",size:"sm",onClick:()=>c(!i),children:[e.jsx(dt,{className:`h-4 w-4 mr-2 ${i?"animate-spin":""}`}),i?"自动刷新中":"自动刷新"]}),e.jsx(_,{variant:"outline",size:"sm",onClick:h,children:e.jsx(dt,{className:"h-4 w-4"})})]})]}),e.jsxs(ta,{value:l,onValueChange:f=>n(f),className:"w-full",children:[e.jsxs(Xt,{className:"grid w-full grid-cols-2 gap-0.5 sm:gap-1 h-auto p-1",children:[e.jsxs(Je,{value:"planner",className:"gap-1 sm:gap-2 text-xs sm:text-sm px-2 sm:px-3 py-2",children:[e.jsx(Gm,{className:"h-3.5 w-3.5 sm:h-4 sm:w-4",strokeWidth:2,fill:"none"}),e.jsx("span",{children:"计划器监控"})]}),e.jsxs(Je,{value:"replier",className:"gap-1 sm:gap-2 text-xs sm:text-sm px-2 sm:px-3 py-2",children:[e.jsx(o_,{className:"h-3.5 w-3.5 sm:h-4 sm:w-4",strokeWidth:2,fill:"none"}),e.jsx("span",{children:"回复器监控"})]})]}),e.jsxs(Ye,{className:"h-[calc(100vh-240px)] sm:h-[calc(100vh-280px)] mt-4 sm:mt-6",children:[e.jsx(ys,{value:"planner",className:"mt-0",children:e.jsx(hk,{autoRefresh:i,refreshKey:u})}),e.jsx(ys,{value:"replier",className:"mt-0",children:e.jsx(fk,{autoRefresh:i,refreshKey:u})})]})]})]})}const gk="Mai-with-u",jk="plugin-repo",vk="main",Nk="plugin_details.json";async function bk(){try{const l=await we("/api/webui/plugins/fetch-raw",{method:"POST",body:JSON.stringify({owner:gk,repo:jk,branch:vk,file_path:Nk})});if(!l.ok)throw new Error(`HTTP error! status: ${l.status}`);const n=await l.json();if(!n.success||!n.data)throw new Error(n.error||"获取插件列表失败");return JSON.parse(n.data).filter(u=>!u?.id||!u?.manifest?(console.warn("跳过无效插件数据:",u),!1):!u.manifest.name||!u.manifest.version?(console.warn("跳过缺少必需字段的插件:",u.id),!1):!0).map(u=>({id:u.id,manifest:{manifest_version:u.manifest.manifest_version||1,name:u.manifest.name,version:u.manifest.version,description:u.manifest.description||"",author:u.manifest.author||{name:"Unknown"},license:u.manifest.license||"Unknown",host_application:u.manifest.host_application||{min_version:"0.0.0"},homepage_url:u.manifest.homepage_url,repository_url:u.manifest.repository_url,keywords:u.manifest.keywords||[],categories:u.manifest.categories||[],default_locale:u.manifest.default_locale||"zh-CN",locales_path:u.manifest.locales_path},downloads:0,rating:0,review_count:0,installed:!1,published_at:new Date().toISOString(),updated_at:new Date().toISOString()}))}catch(l){throw console.error("Failed to fetch plugin list:",l),l}}async function Lv(){try{const l=await we("/api/webui/plugins/git-status");if(!l.ok)throw new Error(`HTTP error! status: ${l.status}`);return await l.json()}catch(l){return console.error("Failed to check Git status:",l),{installed:!1,error:"无法检测 Git 安装状态"}}}async function Uv(){try{const l=await we("/api/webui/plugins/version");if(!l.ok)throw new Error(`HTTP error! status: ${l.status}`);return await l.json()}catch(l){return console.error("Failed to get Maimai version:",l),{version:"0.0.0",version_major:0,version_minor:0,version_patch:0}}}function $v(l,n,i){const c=l.split(".").map(f=>parseInt(f)||0),u=c[0]||0,x=c[1]||0,h=c[2]||0;if(i.version_majorparseInt(v)||0),p=f[0]||0,g=f[1]||0,N=f[2]||0;if(i.version_major>p||i.version_major===p&&i.version_minor>g||i.version_major===p&&i.version_minor===g&&i.version_patch>N)return!1}return!0}async function yk(){try{const l=await we("/api/webui/ws-token");if(!l.ok)return console.error("获取 WebSocket token 失败:",l.status),null;const n=await l.json();return n.success&&n.token?n.token:null}catch(l){return console.error("获取 WebSocket token 失败:",l),null}}async function wk(l,n){const i=await yk();if(!i)return console.warn("无法获取 WebSocket token,可能未登录"),null;const c=window.location.protocol==="https:"?"wss:":"ws:",u=window.location.host,x=`${c}//${u}/api/webui/ws/plugin-progress?token=${encodeURIComponent(i)}`;try{const h=new WebSocket(x);return h.onopen=()=>{console.log("Plugin progress WebSocket connected");const f=setInterval(()=>{h.readyState===WebSocket.OPEN?h.send("ping"):clearInterval(f)},3e4)},h.onmessage=f=>{try{if(f.data==="pong")return;const p=JSON.parse(f.data);l(p)}catch(p){console.error("Failed to parse progress data:",p)}},h.onerror=f=>{console.error("Plugin progress WebSocket error:",f),n?.(f)},h.onclose=()=>{console.log("Plugin progress WebSocket disconnected")},h}catch(h){return console.error("创建 WebSocket 连接失败:",h),null}}async function Al(){try{const l=await we("/api/webui/plugins/installed",{headers:Fs()});if(!l.ok)throw new Error(`HTTP error! status: ${l.status}`);const n=await l.json();if(!n.success)throw new Error(n.message||"获取已安装插件列表失败");return n.plugins||[]}catch(l){return console.error("Failed to get installed plugins:",l),[]}}function mn(l,n){return n.some(i=>i.id===l)}function xn(l,n){const i=n.find(c=>c.id===l);if(i)return i.manifest?.version||i.version}async function Bv(l,n,i="main"){const c=await we("/api/webui/plugins/install",{method:"POST",body:JSON.stringify({plugin_id:l,repository_url:n,branch:i})});if(!c.ok){const u=await c.json();throw new Error(u.detail||"安装失败")}return await c.json()}async function Iv(l){const n=await we("/api/webui/plugins/uninstall",{method:"POST",body:JSON.stringify({plugin_id:l})});if(!n.ok){const i=await n.json();throw new Error(i.detail||"卸载失败")}return await n.json()}async function Pv(l,n,i="main"){const c=await we("/api/webui/plugins/update",{method:"POST",body:JSON.stringify({plugin_id:l,repository_url:n,branch:i})});if(!c.ok){const u=await c.json();throw new Error(u.detail||"更新失败")}return await c.json()}async function _k(l){const n=await we(`/api/webui/plugins/config/${l}/schema`,{headers:Fs()});if(!n.ok){const c=await n.text();try{const u=JSON.parse(c);throw new Error(u.detail||"获取配置 Schema 失败")}catch{throw new Error(`获取配置 Schema 失败 (${n.status})`)}}const i=await n.json();if(!i.success)throw new Error(i.message||"获取配置 Schema 失败");return i.schema}async function Sk(l){const n=await we(`/api/webui/plugins/config/${l}`,{headers:Fs()});if(!n.ok){const c=await n.text();try{const u=JSON.parse(c);throw new Error(u.detail||"获取配置失败")}catch{throw new Error(`获取配置失败 (${n.status})`)}}const i=await n.json();if(!i.success)throw new Error(i.message||"获取配置失败");return i.config}async function kk(l){const n=await we(`/api/webui/plugins/config/${l}/raw`,{headers:Fs()});if(!n.ok){const c=await n.text();try{const u=JSON.parse(c);throw new Error(u.detail||"获取配置失败")}catch{throw new Error(`获取配置失败 (${n.status})`)}}const i=await n.json();if(!i.success)throw new Error(i.message||"获取配置失败");return i.config}async function Ck(l,n){const i=await we(`/api/webui/plugins/config/${l}`,{method:"PUT",headers:Fs(),body:JSON.stringify({config:n})});if(!i.ok){const c=await i.json();throw new Error(c.detail||"保存配置失败")}return await i.json()}async function Tk(l,n){const i=await we(`/api/webui/plugins/config/${l}/raw`,{method:"PUT",headers:Fs(),body:JSON.stringify({config:n})});if(!i.ok){const c=await i.json();throw new Error(c.detail||"保存配置失败")}return await i.json()}async function Ek(l){const n=await we(`/api/webui/plugins/config/${l}/reset`,{method:"POST",headers:Fs()});if(!n.ok){const i=await n.json();throw new Error(i.detail||"重置配置失败")}return await n.json()}async function Mk(l){const n=await we(`/api/webui/plugins/config/${l}/toggle`,{method:"POST",headers:Fs()});if(!n.ok){const i=await n.json();throw new Error(i.detail||"切换状态失败")}return await n.json()}const uc="https://maibot-plugin-stats.maibot-webui.workers.dev";async function Hv(l){try{const n=await fetch(`${uc}/stats/${l}`);return n.ok?await n.json():(console.error("Failed to fetch plugin stats:",n.statusText),null)}catch(n){return console.error("Error fetching plugin stats:",n),null}}async function zk(l,n){try{const i=n||dx(),c=await fetch(`${uc}/stats/like`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({plugin_id:l,user_id:i})}),u=await c.json();return c.status===429?{success:!1,error:"操作过于频繁,请稍后再试"}:c.ok?{success:!0,...u}:{success:!1,error:u.error||"点赞失败"}}catch(i){return console.error("Error liking plugin:",i),{success:!1,error:"网络错误"}}}async function Ak(l,n){try{const i=n||dx(),c=await fetch(`${uc}/stats/dislike`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({plugin_id:l,user_id:i})}),u=await c.json();return c.status===429?{success:!1,error:"操作过于频繁,请稍后再试"}:c.ok?{success:!0,...u}:{success:!1,error:u.error||"点踩失败"}}catch(i){return console.error("Error disliking plugin:",i),{success:!1,error:"网络错误"}}}async function Ok(l,n,i,c){if(n<1||n>5)return{success:!1,error:"评分必须在 1-5 之间"};try{const u=c||dx(),x=await fetch(`${uc}/stats/rate`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({plugin_id:l,rating:n,comment:i,user_id:u})}),h=await x.json();return x.status===429?{success:!1,error:"每天最多评分 3 次"}:x.ok?{success:!0,...h}:{success:!1,error:h.error||"评分失败"}}catch(u){return console.error("Error rating plugin:",u),{success:!1,error:"网络错误"}}}async function Fv(l){try{const n=await fetch(`${uc}/stats/download`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({plugin_id:l})}),i=await n.json();return n.status===429?(console.warn("Download recording rate limited"),{success:!0}):n.ok?{success:!0,...i}:(console.error("Failed to record download:",i.error),{success:!1,error:i.error})}catch(n){return console.error("Error recording download:",n),{success:!1,error:"网络错误"}}}function Dk(){const l=navigator,n=[navigator.userAgent,navigator.language,navigator.languages?.join(",")||"",navigator.platform,navigator.hardwareConcurrency||0,screen.width,screen.height,screen.colorDepth,screen.pixelDepth,new Date().getTimezoneOffset(),Intl.DateTimeFormat().resolvedOptions().timeZone,navigator.maxTouchPoints||0,l.deviceMemory||0].join("|");let i=0;for(let c=0;c{const ee=Q.map(async Te=>{try{const de=await Hv(Te.id);return{id:Te.id,stats:de}}catch(de){return console.warn(`Failed to load stats for ${Te.id}:`,de),{id:Te.id,stats:null}}}),Ue=await Promise.all(ee),ie={};Ue.forEach(({id:Te,stats:de})=>{de&&(ie[Te]=de)}),U(ie)};d.useEffect(()=>{let Q=null,ee=!1;return(async()=>{if(Q=await wk(ie=>{ee||(T(ie),ie.stage==="success"?setTimeout(()=>{ee||T(null)},2e3):ie.stage==="error"&&(b(!1),D(ie.error||"加载失败")))},ie=>{console.error("WebSocket error:",ie),ee||pe({title:"WebSocket 连接失败",description:"无法实时显示加载进度",variant:"destructive"})}),await new Promise(ie=>{if(!Q){ie();return}const Te=()=>{Q&&Q.readyState===WebSocket.OPEN?(console.log("WebSocket connected, starting to load plugins"),ie()):Q&&Q.readyState===WebSocket.CLOSED?(console.warn("WebSocket closed before loading plugins"),ie()):setTimeout(Te,100)};Te()}),!ee){const ie=await Lv();P(ie),ie.installed||pe({title:"Git 未安装",description:ie.error||"请先安装 Git 才能使用插件安装功能",variant:"destructive"})}if(!ee){const ie=await Uv();F(ie)}if(!ee)try{b(!0),D(null);const ie=await bk();if(!ee){const Te=await Al();L(Te);const de=ie.map(Me=>{const rs=mn(Me.id,Te),Ut=xn(Me.id,Te);return{...Me,installed:rs,installed_version:Ut}});for(const Me of Te)!de.some(Ut=>Ut.id===Me.id)&&Me.manifest&&de.push({id:Me.id,manifest:{manifest_version:Me.manifest.manifest_version||1,name:Me.manifest.name,version:Me.manifest.version,description:Me.manifest.description||"",author:Me.manifest.author,license:Me.manifest.license||"Unknown",host_application:Me.manifest.host_application,homepage_url:Me.manifest.homepage_url,repository_url:Me.manifest.repository_url,keywords:Me.manifest.keywords||[],categories:Me.manifest.categories||[],default_locale:Me.manifest.default_locale||"zh-CN",locales_path:Me.manifest.locales_path},downloads:0,rating:0,review_count:0,installed:!0,installed_version:Me.manifest.version,published_at:new Date().toISOString(),updated_at:new Date().toISOString()});y(de),ke(de)}}catch(ie){if(!ee){const Te=ie instanceof Error?ie.message:"加载插件列表失败";D(Te),pe({title:"加载失败",description:Te,variant:"destructive"})}}finally{ee||b(!1)}})(),()=>{ee=!0,Q&&Q.close()}},[pe]);const O=Q=>{if(!Q.installed&&A&&!k(Q))return e.jsxs(Se,{variant:"destructive",className:"gap-1",children:[e.jsx(wt,{className:"h-3 w-3"}),"不兼容"]});if(Q.installed){const ee=Q.installed_version?.trim(),Ue=Q.manifest.version?.trim();if(ee!==Ue){const ie=ee?.split(".").map(Number)||[0,0,0],Te=Ue?.split(".").map(Number)||[0,0,0];for(let de=0;de<3;de++){if((Te[de]||0)>(ie[de]||0))return e.jsxs(Se,{variant:"outline",className:"gap-1 text-orange-600 border-orange-600",children:[e.jsx(wt,{className:"h-3 w-3"}),"可更新"]});if((Te[de]||0)<(ie[de]||0))break}}return e.jsxs(Se,{variant:"default",className:"gap-1",children:[e.jsx(pt,{className:"h-3 w-3"}),"已安装"]})}return null},k=Q=>!A||!Q.manifest?.host_application?!0:$v(Q.manifest.host_application.min_version,Q.manifest.host_application.max_version,A),H=Q=>{if(!Q.installed||!Q.installed_version||!Q.manifest?.version)return!1;const ee=Q.installed_version.trim(),Ue=Q.manifest.version.trim();if(ee===Ue)return!1;const ie=ee.split(".").map(Number),Te=Ue.split(".").map(Number);for(let de=0;de<3;de++){if((Te[de]||0)>(ie[de]||0))return!0;if((Te[de]||0)<(ie[de]||0))return!1}return!1},se=v.filter(Q=>{if(!Q.manifest)return console.warn("[过滤] 跳过无 manifest 的插件:",Q.id),!1;const ee=c===""||Q.manifest.name?.toLowerCase().includes(c.toLowerCase())||Q.manifest.description?.toLowerCase().includes(c.toLowerCase())||Q.manifest.keywords&&Q.manifest.keywords.some(de=>de.toLowerCase().includes(c.toLowerCase())),Ue=x==="all"||Q.manifest.categories&&Q.manifest.categories.includes(x);let ie=!0;f==="installed"?ie=Q.installed===!0:f==="updates"&&(ie=Q.installed===!0&&H(Q));const Te=!g||!A||k(Q);return ee&&Ue&&ie&&Te}),Ee=Q=>{if(!S?.installed){pe({title:"无法安装",description:"Git 未安装",variant:"destructive"});return}if(A&&!k(Q)){pe({title:"无法安装",description:"插件与当前麦麦版本不兼容",variant:"destructive"});return}ne(Q),je("main"),V(""),oe("preset"),_e(!1),xe(!0)},Z=async()=>{if(!he)return;const Q=B==="custom"?z:ve;if(!Q||Q.trim()===""){pe({title:"分支名称不能为空",variant:"destructive"});return}try{xe(!1),await Bv(he.id,he.manifest.repository_url||"",Q),Fv(he.id).catch(Ue=>{console.warn("Failed to record download:",Ue)}),pe({title:"安装成功",description:`${he.manifest.name} 已成功安装`});const ee=await Al();L(ee),y(Ue=>Ue.map(ie=>{if(ie.id===he.id){const Te=mn(ie.id,ee),de=xn(ie.id,ee);return{...ie,installed:Te,installed_version:de}}return ie}))}catch(ee){pe({title:"安装失败",description:ee instanceof Error?ee.message:"未知错误",variant:"destructive"})}finally{ne(null)}},Oe=async Q=>{try{await Iv(Q.id),pe({title:"卸载成功",description:`${Q.manifest.name} 已成功卸载`});const ee=await Al();L(ee),y(Ue=>Ue.map(ie=>{if(ie.id===Q.id){const Te=mn(ie.id,ee),de=xn(ie.id,ee);return{...ie,installed:Te,installed_version:de}}return ie}))}catch(ee){pe({title:"卸载失败",description:ee instanceof Error?ee.message:"未知错误",variant:"destructive"})}},ns=async Q=>{if(!S?.installed){pe({title:"无法更新",description:"Git 未安装",variant:"destructive"});return}try{const ee=await Pv(Q.id,Q.manifest.repository_url||"","main");pe({title:"更新成功",description:`${Q.manifest.name} 已从 ${ee.old_version} 更新到 ${ee.new_version}`});const Ue=await Al();L(Ue),y(ie=>ie.map(Te=>{if(Te.id===Q.id){const de=mn(Te.id,Ue),Me=xn(Te.id,Ue);return{...Te,installed:de,installed_version:Me}}return Te}))}catch(ee){pe({title:"更新失败",description:ee instanceof Error?ee.message:"未知错误",variant:"destructive"})}};return e.jsx(Ye,{className:"h-full",children:e.jsxs("div",{className:"space-y-6 p-4 sm:p-6",children:[e.jsxs("div",{className:"flex flex-col sm:flex-row sm:items-start sm:justify-between gap-4",children:[e.jsxs("div",{children:[e.jsx("h1",{className:"text-2xl sm:text-3xl font-bold",children:"插件市场"}),e.jsx("p",{className:"text-muted-foreground mt-2",children:"浏览和管理麦麦的插件"})]}),e.jsxs("div",{className:"flex gap-2",children:[e.jsxs(_,{variant:"outline",onClick:()=>n(),disabled:i,children:[e.jsx(Ij,{className:`h-4 w-4 mr-2 ${i?"animate-spin":""}`}),"重启麦麦"]}),e.jsxs(_,{onClick:()=>l({to:"/plugin-mirrors"}),children:[e.jsx(d_,{className:"h-4 w-4 mr-2"}),"配置镜像源"]})]})]}),e.jsx(Ce,{className:"border-blue-200 bg-blue-50 dark:bg-blue-950/20 dark:border-blue-900",children:e.jsx(Ae,{className:"py-3",children:e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(Ht,{className:"h-4 w-4 text-blue-600 flex-shrink-0"}),e.jsxs("p",{className:"text-sm text-blue-800 dark:text-blue-200",children:["安装、卸载或更新插件后,需要",e.jsx("span",{className:"font-semibold",children:"重启麦麦"}),"才能使更改生效"]})]})})}),S&&!S.installed&&e.jsxs(Ce,{className:"border-orange-600 bg-orange-50 dark:bg-orange-950/20",children:[e.jsx(De,{children:e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx(Jt,{className:"h-5 w-5 text-orange-600"}),e.jsxs("div",{children:[e.jsx(Le,{className:"text-lg text-orange-900 dark:text-orange-100",children:"Git 未安装"}),e.jsx(ws,{className:"text-orange-800 dark:text-orange-200",children:S.error||"请先安装 Git 才能使用插件安装功能"})]})]})}),e.jsx(Ae,{children:e.jsxs("p",{className:"text-sm text-orange-800 dark:text-orange-200",children:["您可以从 ",e.jsx("a",{href:"https://git-scm.com/downloads",target:"_blank",rel:"noopener noreferrer",className:"underline font-medium",children:"git-scm.com"})," 下载并安装 Git。 安装完成后,请重启麦麦应用。"]})})]}),e.jsx(Ce,{className:"p-4",children:e.jsxs("div",{className:"flex flex-col gap-4",children:[e.jsxs("div",{className:"flex flex-col sm:flex-row gap-4",children:[e.jsxs("div",{className:"flex-1 relative",children:[e.jsx(Ct,{className:"absolute left-3 top-1/2 -translate-y-1/2 h-4 w-4 text-muted-foreground"}),e.jsx(le,{placeholder:"搜索插件...",value:c,onChange:Q=>u(Q.target.value),className:"pl-9"})]}),e.jsxs(Ie,{value:x,onValueChange:h,children:[e.jsx($e,{className:"w-full sm:w-[200px]",children:e.jsx(Pe,{placeholder:"选择分类"})}),e.jsxs(Be,{children:[e.jsx(X,{value:"all",children:"全部分类"}),e.jsx(X,{value:"Group Management",children:"群组管理"}),e.jsx(X,{value:"Entertainment & Interaction",children:"娱乐互动"}),e.jsx(X,{value:"Utility Tools",children:"实用工具"}),e.jsx(X,{value:"Content Generation",children:"内容生成"}),e.jsx(X,{value:"Multimedia",children:"多媒体"}),e.jsx(X,{value:"External Integration",children:"外部集成"}),e.jsx(X,{value:"Data Analysis & Insights",children:"数据分析与洞察"}),e.jsx(X,{value:"Other",children:"其他"})]})]})]}),e.jsxs("div",{className:"flex items-center space-x-2",children:[e.jsx(qs,{id:"compatible-only",checked:g,onCheckedChange:Q=>N(Q===!0)}),e.jsx("label",{htmlFor:"compatible-only",className:"text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70 cursor-pointer",children:"只显示兼容当前版本的插件"})]})]})}),e.jsx(ta,{value:f,onValueChange:p,className:"w-full",children:e.jsxs(Xt,{className:"grid w-full grid-cols-3",children:[e.jsxs(Je,{value:"all",children:["全部插件 (",v.filter(Q=>{if(!Q.manifest)return!1;const ee=c===""||Q.manifest.name?.toLowerCase().includes(c.toLowerCase())||Q.manifest.description?.toLowerCase().includes(c.toLowerCase())||Q.manifest.keywords&&Q.manifest.keywords.some(Te=>Te.toLowerCase().includes(c.toLowerCase())),Ue=x==="all"||Q.manifest.categories&&Q.manifest.categories.includes(x),ie=!g||!A||k(Q);return ee&&Ue&&ie}).length,")"]}),e.jsxs(Je,{value:"installed",children:["已安装 (",v.filter(Q=>{if(!Q.manifest)return!1;const ee=c===""||Q.manifest.name?.toLowerCase().includes(c.toLowerCase())||Q.manifest.description?.toLowerCase().includes(c.toLowerCase())||Q.manifest.keywords&&Q.manifest.keywords.some(Te=>Te.toLowerCase().includes(c.toLowerCase())),Ue=x==="all"||Q.manifest.categories&&Q.manifest.categories.includes(x),ie=!g||!A||k(Q);return Q.installed&&ee&&Ue&&ie}).length,")"]}),e.jsxs(Je,{value:"updates",children:["可更新 (",v.filter(Q=>{if(!Q.manifest)return!1;const ee=c===""||Q.manifest.name?.toLowerCase().includes(c.toLowerCase())||Q.manifest.description?.toLowerCase().includes(c.toLowerCase())||Q.manifest.keywords&&Q.manifest.keywords.some(Te=>Te.toLowerCase().includes(c.toLowerCase())),Ue=x==="all"||Q.manifest.categories&&Q.manifest.categories.includes(x),ie=!g||!A||k(Q);return Q.installed&&H(Q)&&ee&&Ue&&ie}).length,")"]})]})}),M&&M.stage==="loading"&&M.operation==="fetch"&&e.jsx(Ce,{className:"p-4",children:e.jsxs("div",{className:"space-y-3",children:[e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(Bs,{className:"h-4 w-4 animate-spin"}),e.jsx("span",{className:"text-sm font-medium",children:"加载插件列表"})]}),e.jsxs("span",{className:"text-sm font-medium",children:[M.progress,"%"]})]}),e.jsx(Kn,{value:M.progress,className:"h-2"}),e.jsx("div",{className:"text-xs text-muted-foreground",children:M.message}),M.total_plugins>0&&e.jsxs("div",{className:"text-xs text-muted-foreground text-center",children:["已加载 ",M.loaded_plugins," / ",M.total_plugins," 个插件"]})]})}),M&&M.stage==="error"&&M.error&&e.jsx(Ce,{className:"border-destructive bg-destructive/10",children:e.jsx(De,{children:e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx(Jt,{className:"h-5 w-5 text-destructive"}),e.jsxs("div",{children:[e.jsx(Le,{className:"text-lg text-destructive",children:"加载失败"}),e.jsx(ws,{className:"text-destructive/80",children:M.error})]})]})})}),w?e.jsxs("div",{className:"flex items-center justify-center py-12",children:[e.jsx(Bs,{className:"h-8 w-8 animate-spin text-muted-foreground"}),e.jsx("span",{className:"ml-3 text-muted-foreground",children:"加载插件列表中..."})]}):R?e.jsx(Ce,{className:"p-6",children:e.jsxs("div",{className:"flex flex-col items-center justify-center py-8 text-center",children:[e.jsx(Jt,{className:"h-12 w-12 text-destructive mb-4"}),e.jsx("h3",{className:"text-lg font-semibold mb-2",children:"加载失败"}),e.jsx("p",{className:"text-sm text-muted-foreground mb-4",children:R}),e.jsx(_,{onClick:()=>window.location.reload(),children:"重新加载"})]})}):se.length===0?e.jsx(Ce,{className:"p-6",children:e.jsxs("div",{className:"flex flex-col items-center justify-center py-8 text-center",children:[e.jsx(Ct,{className:"h-12 w-12 text-muted-foreground mb-4"}),e.jsx("h3",{className:"text-lg font-semibold mb-2",children:"未找到插件"}),e.jsx("p",{className:"text-sm text-muted-foreground",children:c||x!=="all"?"尝试调整搜索条件或筛选器":"暂无可用插件"})]})}):e.jsx("div",{className:"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-6",children:se.map(Q=>e.jsxs(Ce,{className:"flex flex-col hover:shadow-lg transition-shadow h-full",children:[e.jsxs(De,{children:[e.jsxs("div",{className:"flex items-start justify-between gap-2",children:[e.jsx(Le,{className:"text-xl",children:Q.manifest?.name||Q.id}),e.jsxs("div",{className:"flex flex-col gap-1",children:[Q.manifest?.categories&&Q.manifest.categories[0]&&e.jsx(Se,{variant:"secondary",className:"text-xs whitespace-nowrap",children:Rk[Q.manifest.categories[0]]||Q.manifest.categories[0]}),O(Q)]})]}),e.jsx(ws,{className:"line-clamp-2",children:Q.manifest?.description||"无描述"})]}),e.jsx(Ae,{className:"flex-1",children:e.jsxs("div",{className:"space-y-3",children:[e.jsxs("div",{className:"flex items-center gap-4 text-sm text-muted-foreground",children:[e.jsxs("div",{className:"flex items-center gap-1",children:[e.jsx(sa,{className:"h-4 w-4"}),e.jsx("span",{children:(J[Q.id]?.downloads??Q.downloads??0).toLocaleString()})]}),e.jsxs("div",{className:"flex items-center gap-1",children:[e.jsx(dn,{className:"h-4 w-4 fill-yellow-400 text-yellow-400"}),e.jsx("span",{children:(J[Q.id]?.rating??Q.rating??0).toFixed(1)})]})]}),e.jsxs("div",{className:"flex flex-wrap gap-2",children:[Q.manifest?.keywords&&Q.manifest.keywords.slice(0,3).map(ee=>e.jsx(Se,{variant:"outline",className:"text-xs",children:ee},ee)),Q.manifest?.keywords&&Q.manifest.keywords.length>3&&e.jsxs(Se,{variant:"outline",className:"text-xs",children:["+",Q.manifest.keywords.length-3]})]}),e.jsxs("div",{className:"text-xs text-muted-foreground pt-2 border-t space-y-1",children:[e.jsxs("div",{children:["v",Q.manifest?.version||"unknown"," · ",Q.manifest?.author?.name||"Unknown"]}),Q.manifest?.host_application&&e.jsxs("div",{className:"flex items-center gap-1",children:[e.jsx("span",{children:"支持:"}),e.jsxs("span",{className:"font-medium",children:[Q.manifest.host_application.min_version,Q.manifest.host_application.max_version?` - ${Q.manifest.host_application.max_version}`:" - 最新版本"]})]})]})]})}),e.jsx(Zo,{className:"pt-4",children:e.jsxs("div",{className:"flex items-center justify-end gap-2 w-full",children:[e.jsx(_,{variant:"outline",size:"sm",onClick:()=>l({to:"/plugin-detail",search:{pluginId:Q.id}}),children:"查看详情"}),Q.installed?H(Q)?e.jsxs(_,{size:"sm",disabled:!S?.installed,title:S?.installed?void 0:"Git 未安装",onClick:()=>ns(Q),children:[e.jsx(dt,{className:"h-4 w-4 mr-1"}),"更新"]}):e.jsxs(_,{variant:"destructive",size:"sm",disabled:!S?.installed,title:S?.installed?void 0:"Git 未安装",onClick:()=>Oe(Q),children:[e.jsx(ls,{className:"h-4 w-4 mr-1"}),"卸载"]}):e.jsxs(_,{size:"sm",disabled:!S?.installed||M?.operation==="install"||A!==null&&!k(Q),title:S?.installed?A!==null&&!k(Q)?`不兼容当前版本 (需要 ${Q.manifest?.host_application?.min_version||"未知"}${Q.manifest?.host_application?.max_version?` - ${Q.manifest.host_application.max_version}`:"+"},当前 ${A?.version})`:void 0:"Git 未安装",onClick:()=>Ee(Q),children:[e.jsx(sa,{className:"h-4 w-4 mr-1"}),M?.operation==="install"&&M?.plugin_id===Q.id?"安装中...":"安装"]})]})}),M&&(M.stage==="loading"||M.stage==="success"||M.stage==="error")&&M.operation!=="fetch"&&M.plugin_id===Q.id&&e.jsx("div",{className:"px-6 pb-4 -mt-2",children:e.jsxs("div",{className:`space-y-2 p-3 rounded-lg border ${M.stage==="success"?"bg-green-50 dark:bg-green-950/20 border-green-200 dark:border-green-900":M.stage==="error"?"bg-red-50 dark:bg-red-950/20 border-red-200 dark:border-red-900":"bg-muted/50"}`,children:[e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[M.stage==="loading"?e.jsx(Bs,{className:"h-3 w-3 animate-spin"}):M.stage==="success"?e.jsx(pt,{className:"h-3 w-3 text-green-600"}):e.jsx(wt,{className:"h-3 w-3 text-red-600"}),e.jsx("span",{className:`text-xs font-medium ${M.stage==="success"?"text-green-700 dark:text-green-300":M.stage==="error"?"text-red-700 dark:text-red-300":""}`,children:M.stage==="loading"?e.jsxs(e.Fragment,{children:[M.operation==="install"&&"正在安装",M.operation==="uninstall"&&"正在卸载",M.operation==="update"&&"正在更新"]}):M.stage==="success"?e.jsxs(e.Fragment,{children:[M.operation==="install"&&"安装完成",M.operation==="uninstall"&&"卸载完成",M.operation==="update"&&"更新完成"]}):e.jsxs(e.Fragment,{children:[M.operation==="install"&&"安装失败",M.operation==="uninstall"&&"卸载失败",M.operation==="update"&&"更新失败"]})})]}),M.stage!=="error"&&e.jsxs("span",{className:`text-xs font-medium ${M.stage==="success"?"text-green-700 dark:text-green-300":""}`,children:[M.progress,"%"]})]}),M.stage!=="error"&&e.jsx(Kn,{value:M.progress,className:`h-1.5 ${M.stage==="success"?"[&>div]:bg-green-500":""}`}),e.jsx("div",{className:`text-xs ${M.stage==="success"?"text-green-600 dark:text-green-400 truncate":M.stage==="error"?"text-red-600 dark:text-red-400":"text-muted-foreground truncate"}`,children:M.stage==="error"?M.error||M.message||"操作失败":M.message})]})})]},Q.id))}),e.jsx(Is,{open:ue,onOpenChange:xe,children:e.jsxs(Os,{children:[e.jsxs(Ds,{children:[e.jsx(Rs,{children:"安装插件"}),e.jsxs(Ks,{children:["安装 ",he?.manifest.name]})]}),e.jsxs("div",{className:"space-y-4",children:[e.jsxs("div",{children:[e.jsxs("p",{className:"text-sm text-muted-foreground",children:["版本: ",he?.manifest.version]}),e.jsxs("p",{className:"text-sm text-muted-foreground",children:["作者: ",typeof he?.manifest.author=="string"?he.manifest.author:he?.manifest.author?.name]})]}),e.jsxs("div",{className:"flex items-center space-x-2",children:[e.jsx(qs,{id:"advanced-options",checked:K,onCheckedChange:Q=>_e(Q)}),e.jsx("label",{htmlFor:"advanced-options",className:"text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70",children:"高级选项"})]}),K&&e.jsx("div",{className:"space-y-4 p-4 border rounded-lg",children:e.jsxs("div",{className:"space-y-2",children:[e.jsx("label",{className:"text-sm font-medium",children:"分支选择"}),e.jsxs(ta,{value:B,onValueChange:Q=>oe(Q),children:[e.jsxs(Xt,{className:"grid w-full grid-cols-2",children:[e.jsx(Je,{value:"preset",className:"text-xs",children:"预设分支"}),e.jsx(Je,{value:"custom",className:"text-xs",children:"自定义分支"})]}),B==="preset"&&e.jsx("div",{className:"mt-3",children:e.jsxs(Ie,{value:ve,onValueChange:je,children:[e.jsx($e,{children:e.jsx(Pe,{placeholder:"选择分支"})}),e.jsxs(Be,{children:[e.jsx(X,{value:"main",children:"main (默认)"}),e.jsx(X,{value:"master",children:"master"}),e.jsx(X,{value:"dev",children:"dev (开发版)"}),e.jsx(X,{value:"develop",children:"develop"}),e.jsx(X,{value:"beta",children:"beta (测试版)"}),e.jsx(X,{value:"stable",children:"stable (稳定版)"})]})]})}),B==="custom"&&e.jsxs("div",{className:"space-y-2 mt-3",children:[e.jsx("input",{type:"text",className:"flex h-10 w-full rounded-md border border-input bg-background px-3 py-2 text-sm ring-offset-background file:border-0 file:bg-transparent file:text-sm file:font-medium placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50",placeholder:"输入分支名称,例如: feature/new-feature",value:z,onChange:Q=>V(Q.target.value)}),e.jsx("p",{className:"text-xs text-muted-foreground",children:"输入 Git 分支名称、标签或提交哈希"})]})]})]})}),!K&&e.jsx("p",{className:"text-sm text-muted-foreground",children:"将从默认分支 (main) 安装插件"})]}),e.jsxs(st,{children:[e.jsx(_,{variant:"outline",onClick:()=>xe(!1),children:"取消"}),e.jsxs(_,{onClick:Z,children:[e.jsx(sa,{className:"h-4 w-4 mr-2"}),"安装"]})]})]})}),e.jsx(Jn,{})]})})}function $k(){return e.jsxs("div",{className:"h-[calc(100vh-4rem)] flex flex-col p-4 sm:p-6",children:[e.jsx("div",{className:"mb-4 sm:mb-6",children:e.jsx("div",{className:"flex flex-col sm:flex-row sm:items-center justify-between gap-4",children:e.jsxs("div",{children:[e.jsxs("h1",{className:"text-2xl sm:text-3xl font-bold flex items-center gap-2",children:[e.jsx(Pj,{className:"h-8 w-8",strokeWidth:2}),"模型分配预设市场"]}),e.jsx("p",{className:"text-muted-foreground mt-1 text-sm sm:text-base",children:"浏览和下载社区共享的模型分配预设配置"})]})})}),e.jsx(Ye,{className:"flex-1",children:e.jsx("div",{className:"flex items-center justify-center h-[calc(100vh-12rem)]",children:e.jsxs(Ce,{className:"max-w-2xl w-full border-dashed",children:[e.jsxs(De,{className:"text-center",children:[e.jsx("div",{className:"flex justify-center mb-4",children:e.jsx(ra,{className:"h-16 w-16 text-muted-foreground"})}),e.jsx(Le,{className:"text-2xl",children:"功能开发中"}),e.jsx(ws,{className:"text-base",children:"模型分配预设市场功能正在开发中,敬请期待!"})]}),e.jsx(Ae,{children:e.jsxs("div",{className:"space-y-3 text-sm text-muted-foreground",children:[e.jsx("p",{className:"font-medium text-foreground",children:"📦 即将推出的功能:"}),e.jsxs("ul",{className:"space-y-2 ml-6",children:[e.jsxs("li",{className:"flex items-start",children:[e.jsx("span",{className:"mr-2",children:"•"}),e.jsx("span",{children:"浏览社区共享的模型分配预设配置"})]}),e.jsxs("li",{className:"flex items-start",children:[e.jsx("span",{className:"mr-2",children:"•"}),e.jsx("span",{children:"一键下载和应用预设配置"})]}),e.jsxs("li",{className:"flex items-start",children:[e.jsx("span",{className:"mr-2",children:"•"}),e.jsx("span",{children:"分享自己的模型分配方案"})]}),e.jsxs("li",{className:"flex items-start",children:[e.jsx("span",{className:"mr-2",children:"•"}),e.jsx("span",{children:"预设配置评分和评论系统"})]}),e.jsxs("li",{className:"flex items-start",children:[e.jsx("span",{className:"mr-2",children:"•"}),e.jsx("span",{children:"根据使用场景智能推荐配置"})]})]})]})})]})})})]})}function Bk({field:l,value:n,onChange:i}){const[c,u]=d.useState(!1);switch(l.ui_type){case"switch":return e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsxs("div",{className:"space-y-0.5",children:[e.jsx(E,{children:l.label}),l.hint&&e.jsx("p",{className:"text-xs text-muted-foreground",children:l.hint})]}),e.jsx(Fe,{checked:!!n,onCheckedChange:i,disabled:l.disabled})]});case"number":return e.jsxs("div",{className:"space-y-2",children:[e.jsx(E,{children:l.label}),e.jsx(le,{type:"number",value:n??l.default,onChange:x=>i(parseFloat(x.target.value)||0),min:l.min,max:l.max,step:l.step??1,placeholder:l.placeholder,disabled:l.disabled}),l.hint&&e.jsx("p",{className:"text-xs text-muted-foreground",children:l.hint})]});case"slider":return e.jsxs("div",{className:"space-y-2",children:[e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsx(E,{children:l.label}),e.jsx("span",{className:"text-sm text-muted-foreground",children:n??l.default})]}),e.jsx(Va,{value:[n??l.default],onValueChange:x=>i(x[0]),min:l.min??0,max:l.max??100,step:l.step??1,disabled:l.disabled}),l.hint&&e.jsx("p",{className:"text-xs text-muted-foreground",children:l.hint})]});case"select":return e.jsxs("div",{className:"space-y-2",children:[e.jsx(E,{children:l.label}),e.jsxs(Ie,{value:String(n??l.default),onValueChange:i,disabled:l.disabled,children:[e.jsx($e,{children:e.jsx(Pe,{placeholder:l.placeholder??"请选择"})}),e.jsx(Be,{children:l.choices?.map(x=>e.jsx(X,{value:String(x),children:String(x)},String(x)))})]}),l.hint&&e.jsx("p",{className:"text-xs text-muted-foreground",children:l.hint})]});case"textarea":return e.jsxs("div",{className:"space-y-2",children:[e.jsx(E,{children:l.label}),e.jsx(ot,{value:n??l.default,onChange:x=>i(x.target.value),placeholder:l.placeholder,rows:l.rows??3,disabled:l.disabled}),l.hint&&e.jsx("p",{className:"text-xs text-muted-foreground",children:l.hint})]});case"password":return e.jsxs("div",{className:"space-y-2",children:[e.jsx(E,{children:l.label}),e.jsxs("div",{className:"relative",children:[e.jsx(le,{type:c?"text":"password",value:n??"",onChange:x=>i(x.target.value),placeholder:l.placeholder,disabled:l.disabled,className:"pr-10"}),e.jsx(_,{type:"button",variant:"ghost",size:"icon",className:"absolute right-0 top-0 h-full px-3",onClick:()=>u(!c),children:c?e.jsx(Wi,{className:"h-4 w-4"}):e.jsx(ia,{className:"h-4 w-4"})})]}),l.hint&&e.jsx("p",{className:"text-xs text-muted-foreground",children:l.hint})]});case"list":return e.jsxs("div",{className:"space-y-2",children:[e.jsx(E,{children:l.label}),e.jsx(G2,{value:Array.isArray(n)?n:[],onChange:x=>i(x),itemType:l.item_type??"string",itemFields:l.item_fields,minItems:l.min_items,maxItems:l.max_items,disabled:l.disabled,placeholder:l.placeholder}),l.hint&&e.jsx("p",{className:"text-xs text-muted-foreground",children:l.hint})]});case"text":default:return e.jsxs("div",{className:"space-y-2",children:[e.jsx(E,{children:l.label}),e.jsx(le,{type:"text",value:n??l.default??"",onChange:x=>i(x.target.value),placeholder:l.placeholder,maxLength:l.max_length,disabled:l.disabled}),l.hint&&e.jsx("p",{className:"text-xs text-muted-foreground",children:l.hint})]})}}function Lg({section:l,config:n,onChange:i}){const[c,u]=d.useState(!l.collapsed),x=Object.entries(l.fields).filter(([,h])=>!h.hidden).sort(([,h],[,f])=>h.order-f.order);return e.jsx(nc,{open:c,onOpenChange:u,children:e.jsxs(Ce,{children:[e.jsx(rc,{asChild:!0,children:e.jsxs(De,{className:"cursor-pointer hover:bg-muted/50 transition-colors",children:[e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[c?e.jsx(Ma,{className:"h-4 w-4 text-muted-foreground"}):e.jsx(Zt,{className:"h-4 w-4 text-muted-foreground"}),e.jsx(Le,{className:"text-lg",children:l.title})]}),e.jsxs(Se,{variant:"secondary",className:"text-xs",children:[x.length," 项"]})]}),l.description&&e.jsx(ws,{className:"ml-6",children:l.description})]})}),e.jsx(ic,{children:e.jsx(Ae,{className:"space-y-4 pt-0",children:x.map(([h,f])=>e.jsx(Bk,{field:f,value:n[l.name]?.[h],onChange:p=>i(l.name,h,p),sectionName:l.name},h))})})]})})}function Ik({plugin:l,onBack:n}){const{toast:i}=Zs(),{triggerRestart:c,isRestarting:u}=vn(),[x,h]=d.useState("visual"),[f,p]=d.useState(null),[g,N]=d.useState({}),[v,y]=d.useState({}),[w,b]=d.useState(""),[R,D]=d.useState(""),[S,P]=d.useState(!0),[M,T]=d.useState(!1),[A,F]=d.useState(!1),[L,J]=d.useState(!1),[U,ue]=d.useState(!1),xe=d.useCallback(async()=>{P(!0);try{const[B,oe,K]=await Promise.all([_k(l.id),Sk(l.id),kk(l.id)]);p(B),N(oe),y(JSON.parse(JSON.stringify(oe))),b(K),D(K)}catch(B){i({title:"加载配置失败",description:B instanceof Error?B.message:"未知错误",variant:"destructive"})}finally{P(!1)}},[l.id,i]);d.useEffect(()=>{xe()},[xe]),d.useEffect(()=>{F(x==="visual"?JSON.stringify(g)!==JSON.stringify(v):w!==R)},[g,v,w,R,x]);const he=(B,oe,K)=>{N(_e=>({..._e,[B]:{..._e[B]||{},[oe]:K}}))},ne=async()=>{T(!0);try{if(x==="source"){try{Tv(w)}catch(B){J(!0),i({title:"TOML 格式错误",description:B instanceof Error?B.message:"无法解析 TOML 配置,请检查语法",variant:"destructive"}),T(!1);return}await Tk(l.id,w),D(w),J(!1)}else await Ck(l.id,g),y(JSON.parse(JSON.stringify(g)));i({title:"配置已保存",description:"更改将在插件重新加载后生效"})}catch(B){i({title:"保存失败",description:B instanceof Error?B.message:"未知错误",variant:"destructive"})}finally{T(!1)}},ve=async()=>{try{await Ek(l.id),i({title:"配置已重置",description:"下次加载插件时将使用默认配置"}),ue(!1),xe()}catch(B){i({title:"重置失败",description:B instanceof Error?B.message:"未知错误",variant:"destructive"})}},je=async()=>{try{const B=await Mk(l.id);i({title:B.message,description:B.note}),xe()}catch(B){i({title:"切换状态失败",description:B instanceof Error?B.message:"未知错误",variant:"destructive"})}};if(S)return e.jsx("div",{className:"flex items-center justify-center h-64",children:e.jsx(Bs,{className:"h-8 w-8 animate-spin text-muted-foreground"})});if(!f)return e.jsxs("div",{className:"flex flex-col items-center justify-center h-64 space-y-4",children:[e.jsx(wt,{className:"h-12 w-12 text-muted-foreground"}),e.jsx("p",{className:"text-muted-foreground",children:"无法加载配置"}),e.jsxs(_,{onClick:n,variant:"outline",children:[e.jsx(Ca,{className:"h-4 w-4 mr-2"}),"返回"]})]});const z=Object.values(f.sections).sort((B,oe)=>B.order-oe.order),V=g.plugin?.enabled!==!1;return e.jsxs("div",{className:"space-y-4 sm:space-y-6",children:[e.jsxs("div",{className:"flex flex-col sm:flex-row sm:items-start sm:justify-between gap-4",children:[e.jsxs("div",{className:"flex items-start gap-3",children:[e.jsx(_,{variant:"ghost",size:"icon",onClick:n,children:e.jsx(Ca,{className:"h-5 w-5"})}),e.jsxs("div",{children:[e.jsx("h1",{className:"text-2xl sm:text-3xl font-bold",children:f.plugin_info.name||l.manifest.name}),e.jsxs("div",{className:"flex items-center gap-2 mt-1",children:[e.jsx(Se,{variant:V?"default":"secondary",children:V?"已启用":"已禁用"}),e.jsxs("span",{className:"text-sm text-muted-foreground",children:["v",f.plugin_info.version||l.manifest.version]})]})]})]}),e.jsxs("div",{className:"flex gap-2 ml-10 sm:ml-0",children:[e.jsx(_,{variant:"outline",size:"sm",onClick:()=>h(x==="visual"?"source":"visual"),children:x==="visual"?e.jsxs(e.Fragment,{children:[e.jsx(Uj,{className:"h-4 w-4 mr-2"}),"源代码"]}):e.jsxs(e.Fragment,{children:[e.jsx(Lj,{className:"h-4 w-4 mr-2"}),"可视化"]})}),e.jsxs(_,{variant:"outline",size:"sm",onClick:()=>c(),disabled:u,children:[e.jsx(Ij,{className:`h-4 w-4 mr-2 ${u?"animate-spin":""}`}),"重启麦麦"]}),e.jsxs(_,{variant:"outline",size:"sm",onClick:je,children:[e.jsx(cc,{className:"h-4 w-4 mr-2"}),V?"禁用":"启用"]}),e.jsxs(_,{variant:"outline",size:"sm",onClick:()=>ue(!0),children:[e.jsx(Zi,{className:"h-4 w-4 mr-2"}),"重置"]}),e.jsxs(_,{size:"sm",onClick:ne,disabled:!A||M,children:[M?e.jsx(Bs,{className:"h-4 w-4 mr-2 animate-spin"}):e.jsx(oc,{className:"h-4 w-4 mr-2"}),"保存"]})]})]}),A&&e.jsx(Ce,{className:"border-orange-200 bg-orange-50 dark:bg-orange-950/20 dark:border-orange-900",children:e.jsx(Ae,{className:"py-3",children:e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(Ht,{className:"h-4 w-4 text-orange-600"}),e.jsx("p",{className:"text-sm text-orange-800 dark:text-orange-200",children:"有未保存的更改"})]})})}),x==="source"&&e.jsxs("div",{className:"space-y-4",children:[e.jsxs(at,{children:[e.jsx(wt,{className:"h-4 w-4"}),e.jsxs(lt,{children:[e.jsx("strong",{children:"源代码模式(高级功能):"}),"直接编辑 TOML 配置文件。保存时会验证格式,只有格式正确才能保存。",L&&e.jsx("span",{className:"text-destructive font-semibold ml-2",children:"⚠️ 上次保存失败,请检查 TOML 格式"})]})]}),e.jsx(gv,{value:w,onChange:B=>{b(B),L&&J(!1)},language:"toml",theme:"dark",height:"calc(100vh - 350px)",minHeight:"500px",placeholder:"TOML 配置内容"})]}),x==="visual"&&e.jsxs(e.Fragment,{children:[e.jsxs(at,{children:[e.jsx(Ht,{className:"h-4 w-4"}),e.jsxs(lt,{children:[e.jsx("strong",{children:"提示:"}),"如果插件当前未加载或未启用,WebUI 适配器的高级插件可视化编辑功能可能会不可用。 请确保插件已启用并成功加载后,再进行配置编辑。"]})]}),f.layout.type==="tabs"&&f.layout.tabs.length>0?e.jsxs(ta,{defaultValue:f.layout.tabs[0]?.id,children:[e.jsx(Xt,{children:f.layout.tabs.map(B=>e.jsxs(Je,{value:B.id,children:[B.title,B.badge&&e.jsx(Se,{variant:"secondary",className:"ml-2 text-xs",children:B.badge})]},B.id))}),f.layout.tabs.map(B=>e.jsx(ys,{value:B.id,className:"space-y-4 mt-4",children:B.sections.map(oe=>{const K=f.sections[oe];return K?e.jsx(Lg,{section:K,config:g,onChange:he},oe):null})},B.id))]}):e.jsx("div",{className:"space-y-4",children:z.map(B=>e.jsx(Lg,{section:B,config:g,onChange:he},B.name))})]}),e.jsx(Is,{open:U,onOpenChange:ue,children:e.jsxs(Os,{children:[e.jsxs(Ds,{children:[e.jsx(Rs,{children:"确认重置配置"}),e.jsx(Ks,{children:"这将删除当前配置文件,下次加载插件时将使用默认配置。此操作不可撤销。"})]}),e.jsxs(st,{children:[e.jsx(_,{variant:"outline",onClick:()=>ue(!1),children:"取消"}),e.jsx(_,{variant:"destructive",onClick:ve,children:"确认重置"})]})]})})]})}function Pk(){return e.jsx(Yn,{children:e.jsx(Hk,{})})}function Hk(){const{toast:l}=Zs(),[n,i]=d.useState([]),[c,u]=d.useState(!0),[x,h]=d.useState(""),[f,p]=d.useState(null),g=async()=>{u(!0);try{const b=await Al();i(b)}catch(b){l({title:"加载插件列表失败",description:b instanceof Error?b.message:"未知错误",variant:"destructive"})}finally{u(!1)}};d.useEffect(()=>{g()},[]);const v=n.filter(b=>{const R=x.toLowerCase();return b.id.toLowerCase().includes(R)||b.manifest.name.toLowerCase().includes(R)||b.manifest.description?.toLowerCase().includes(R)}).filter((b,R,D)=>R===D.findIndex(S=>S.id===b.id)),y=n.length,w=0;return f?e.jsxs(e.Fragment,{children:[e.jsx(Ye,{className:"h-full",children:e.jsx("div",{className:"p-4 sm:p-6",children:e.jsx(Ik,{plugin:f,onBack:()=>p(null)})})}),e.jsx(Jn,{})]}):e.jsx(Ye,{className:"h-full",children:e.jsxs("div",{className:"space-y-4 sm:space-y-6 p-4 sm:p-6",children:[e.jsxs("div",{className:"flex flex-col sm:flex-row sm:items-start sm:justify-between gap-4",children:[e.jsxs("div",{children:[e.jsx("h1",{className:"text-2xl sm:text-3xl font-bold",children:"插件配置"}),e.jsx("p",{className:"text-muted-foreground mt-1 sm:mt-2 text-sm sm:text-base",children:"管理和配置已安装的插件"})]}),e.jsxs(_,{variant:"outline",size:"sm",onClick:g,children:[e.jsx(dt,{className:`h-4 w-4 mr-2 ${c?"animate-spin":""}`}),"刷新"]})]}),e.jsxs("div",{className:"grid gap-4 grid-cols-1 xs:grid-cols-2 lg:grid-cols-3",children:[e.jsxs(Ce,{children:[e.jsxs(De,{className:"flex flex-row items-center justify-between space-y-0 pb-2",children:[e.jsx(Le,{className:"text-sm font-medium",children:"已安装插件"}),e.jsx(ra,{className:"h-4 w-4 text-muted-foreground"})]}),e.jsxs(Ae,{children:[e.jsx("div",{className:"text-2xl font-bold",children:n.length}),e.jsx("p",{className:"text-xs text-muted-foreground mt-1",children:c?"正在加载...":"个插件"})]})]}),e.jsxs(Ce,{children:[e.jsxs(De,{className:"flex flex-row items-center justify-between space-y-0 pb-2",children:[e.jsx(Le,{className:"text-sm font-medium",children:"已启用"}),e.jsx(pt,{className:"h-4 w-4 text-green-600"})]}),e.jsxs(Ae,{children:[e.jsx("div",{className:"text-2xl font-bold",children:y}),e.jsx("p",{className:"text-xs text-muted-foreground mt-1",children:"运行中的插件"})]})]}),e.jsxs(Ce,{children:[e.jsxs(De,{className:"flex flex-row items-center justify-between space-y-0 pb-2",children:[e.jsx(Le,{className:"text-sm font-medium",children:"已禁用"}),e.jsx(wt,{className:"h-4 w-4 text-orange-600"})]}),e.jsxs(Ae,{children:[e.jsx("div",{className:"text-2xl font-bold",children:w}),e.jsx("p",{className:"text-xs text-muted-foreground mt-1",children:"未激活的插件"})]})]})]}),e.jsxs("div",{className:"relative",children:[e.jsx(Ct,{className:"absolute left-3 top-1/2 -translate-y-1/2 h-4 w-4 text-muted-foreground"}),e.jsx(le,{placeholder:"搜索插件...",value:x,onChange:b=>h(b.target.value),className:"pl-9"})]}),e.jsxs(Ce,{children:[e.jsxs(De,{children:[e.jsx(Le,{children:"已安装的插件"}),e.jsx(ws,{children:"点击插件查看和编辑配置"})]}),e.jsx(Ae,{children:c?e.jsx("div",{className:"flex items-center justify-center py-12",children:e.jsx(Bs,{className:"h-8 w-8 animate-spin text-muted-foreground"})}):v.length===0?e.jsxs("div",{className:"flex flex-col items-center justify-center py-12 space-y-4",children:[e.jsx(ra,{className:"h-16 w-16 text-muted-foreground/50"}),e.jsxs("div",{className:"text-center space-y-2",children:[e.jsx("p",{className:"text-lg font-medium text-muted-foreground",children:x?"没有找到匹配的插件":"暂无已安装的插件"}),e.jsx("p",{className:"text-sm text-muted-foreground",children:x?"尝试其他搜索关键词":"前往插件市场安装插件"})]})]}):e.jsx("div",{className:"space-y-2",children:v.map(b=>e.jsxs("div",{className:"flex items-center justify-between p-4 rounded-lg border hover:bg-muted/50 cursor-pointer transition-colors",onClick:()=>p(b),children:[e.jsxs("div",{className:"flex items-center gap-3 min-w-0",children:[e.jsx("div",{className:"h-10 w-10 rounded-lg bg-primary/10 flex items-center justify-center flex-shrink-0",children:e.jsx(ra,{className:"h-5 w-5 text-primary"})}),e.jsxs("div",{className:"min-w-0",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("h3",{className:"font-medium truncate",children:b.manifest.name}),e.jsxs(Se,{variant:"secondary",className:"text-xs flex-shrink-0",children:["v",b.manifest.version]})]}),e.jsx("p",{className:"text-sm text-muted-foreground truncate",children:b.manifest.description||"暂无描述"})]})]}),e.jsxs("div",{className:"flex items-center gap-2 flex-shrink-0",children:[e.jsx(_,{variant:"ghost",size:"sm",children:e.jsx(pn,{className:"h-4 w-4"})}),e.jsx(Zt,{className:"h-4 w-4 text-muted-foreground"})]})]},b.id))})})]})]})})}function Fk(){const l=ca(),{toast:n}=Zs(),[i,c]=d.useState([]),[u,x]=d.useState(!0),[h,f]=d.useState(null),[p,g]=d.useState(null),[N,v]=d.useState(!1),[y,w]=d.useState(!1),[b,R]=d.useState({id:"",name:"",raw_prefix:"",clone_prefix:"",enabled:!0,priority:1}),D=d.useCallback(async()=>{try{x(!0),f(null);const L=await we("/api/webui/plugins/mirrors");if(!L.ok)throw new Error("获取镜像源列表失败");const J=await L.json();c(J.mirrors||[])}catch(L){const J=L instanceof Error?L.message:"加载镜像源失败";f(J),n({title:"加载失败",description:J,variant:"destructive"})}finally{x(!1)}},[n]);d.useEffect(()=>{D()},[D]);const S=async()=>{try{const L=await we("/api/webui/plugins/mirrors",{method:"POST",body:JSON.stringify(b)});if(!L.ok){const J=await L.json();throw new Error(J.detail||"添加镜像源失败")}n({title:"添加成功",description:"镜像源已添加"}),v(!1),R({id:"",name:"",raw_prefix:"",clone_prefix:"",enabled:!0,priority:1}),D()}catch(L){n({title:"添加失败",description:L instanceof Error?L.message:"未知错误",variant:"destructive"})}},P=async()=>{if(p)try{if(!(await we(`/api/webui/plugins/mirrors/${p.id}`,{method:"PUT",body:JSON.stringify({name:b.name,raw_prefix:b.raw_prefix,clone_prefix:b.clone_prefix,enabled:b.enabled,priority:b.priority})})).ok)throw new Error("更新镜像源失败");n({title:"更新成功",description:"镜像源已更新"}),w(!1),g(null),D()}catch(L){n({title:"更新失败",description:L instanceof Error?L.message:"未知错误",variant:"destructive"})}},M=async L=>{if(confirm("确定要删除这个镜像源吗?"))try{if(!(await we(`/api/webui/plugins/mirrors/${L}`,{method:"DELETE"})).ok)throw new Error("删除镜像源失败");n({title:"删除成功",description:"镜像源已删除"}),D()}catch(J){n({title:"删除失败",description:J instanceof Error?J.message:"未知错误",variant:"destructive"})}},T=async L=>{try{if(!(await we(`/api/webui/plugins/mirrors/${L.id}`,{method:"PUT",body:JSON.stringify({enabled:!L.enabled})})).ok)throw new Error("更新状态失败");D()}catch(J){n({title:"更新失败",description:J instanceof Error?J.message:"未知错误",variant:"destructive"})}},A=L=>{g(L),R({id:L.id,name:L.name,raw_prefix:L.raw_prefix,clone_prefix:L.clone_prefix,enabled:L.enabled,priority:L.priority}),w(!0)},F=async(L,J)=>{const U=J==="up"?L.priority-1:L.priority+1;if(!(U<1))try{if(!(await we(`/api/webui/plugins/mirrors/${L.id}`,{method:"PUT",body:JSON.stringify({priority:U})})).ok)throw new Error("更新优先级失败");D()}catch(ue){n({title:"更新失败",description:ue instanceof Error?ue.message:"未知错误",variant:"destructive"})}};return e.jsx(Ye,{className:"h-full",children:e.jsxs("div",{className:"space-y-6 p-4 sm:p-6",children:[e.jsxs("div",{className:"flex flex-col sm:flex-row sm:items-center sm:justify-between gap-4",children:[e.jsxs("div",{className:"flex items-center gap-4",children:[e.jsx(_,{variant:"ghost",size:"icon",onClick:()=>l({to:"/plugins"}),children:e.jsx(Ca,{className:"h-5 w-5"})}),e.jsxs("div",{children:[e.jsx("h1",{className:"text-2xl sm:text-3xl font-bold",children:"镜像源配置"}),e.jsx("p",{className:"text-sm text-muted-foreground mt-1",children:"管理 Git 克隆和文件下载的镜像源"})]})]}),e.jsxs(_,{onClick:()=>v(!0),children:[e.jsx(et,{className:"h-4 w-4 mr-2"}),"添加镜像源"]})]}),u?e.jsx(Ce,{className:"p-6",children:e.jsx("div",{className:"flex items-center justify-center py-8",children:e.jsx(Bs,{className:"h-8 w-8 animate-spin text-primary"})})}):h?e.jsx(Ce,{className:"p-6",children:e.jsxs("div",{className:"flex flex-col items-center justify-center py-8 text-center",children:[e.jsx(Jt,{className:"h-12 w-12 text-destructive mb-4"}),e.jsx("h3",{className:"text-lg font-semibold mb-2",children:"加载失败"}),e.jsx("p",{className:"text-sm text-muted-foreground mb-4",children:h}),e.jsx(_,{onClick:D,children:"重新加载"})]})}):e.jsxs(Ce,{children:[e.jsx("div",{className:"hidden md:block",children:e.jsxs(Rl,{children:[e.jsx(Ll,{children:e.jsxs(ut,{children:[e.jsx(Ze,{children:"状态"}),e.jsx(Ze,{children:"名称"}),e.jsx(Ze,{children:"ID"}),e.jsx(Ze,{children:"优先级"}),e.jsx(Ze,{className:"text-right",children:"操作"})]})}),e.jsx(Ul,{children:i.map(L=>e.jsxs(ut,{children:[e.jsx(qe,{children:e.jsx(Fe,{checked:L.enabled,onCheckedChange:()=>T(L)})}),e.jsx(qe,{children:e.jsxs("div",{children:[e.jsx("div",{className:"font-medium",children:L.name}),e.jsxs("div",{className:"text-xs text-muted-foreground mt-1",children:["Raw: ",L.raw_prefix]})]})}),e.jsx(qe,{children:e.jsx(Se,{variant:"outline",children:L.id})}),e.jsx(qe,{children:e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("span",{className:"font-mono",children:L.priority}),e.jsxs("div",{className:"flex flex-col gap-1",children:[e.jsx(_,{variant:"ghost",size:"icon",className:"h-5 w-5",onClick:()=>F(L,"up"),disabled:L.priority===1,children:e.jsx(Fr,{className:"h-3 w-3"})}),e.jsx(_,{variant:"ghost",size:"icon",className:"h-5 w-5",onClick:()=>F(L,"down"),children:e.jsx(Ma,{className:"h-3 w-3"})})]})]})}),e.jsx(qe,{className:"text-right",children:e.jsxs("div",{className:"flex items-center justify-end gap-2",children:[e.jsx(_,{variant:"ghost",size:"icon",onClick:()=>A(L),children:e.jsx(Fn,{className:"h-4 w-4"})}),e.jsx(_,{variant:"ghost",size:"icon",onClick:()=>M(L.id),children:e.jsx(ls,{className:"h-4 w-4 text-destructive"})})]})})]},L.id))})]})}),e.jsx("div",{className:"md:hidden p-4 space-y-4",children:i.map(L=>e.jsx(Ce,{className:"p-4",children:e.jsxs("div",{className:"space-y-3",children:[e.jsxs("div",{className:"flex items-start justify-between",children:[e.jsxs("div",{className:"flex-1",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("h3",{className:"font-semibold",children:L.name}),L.enabled&&e.jsx(Se,{variant:"default",className:"text-xs",children:"启用"})]}),e.jsx(Se,{variant:"outline",className:"mt-1 text-xs",children:L.id})]}),e.jsx(Fe,{checked:L.enabled,onCheckedChange:()=>T(L)})]}),e.jsxs("div",{className:"text-sm space-y-1",children:[e.jsxs("div",{className:"text-muted-foreground",children:[e.jsx("span",{className:"font-medium",children:"Raw: "}),e.jsx("span",{className:"break-all",children:L.raw_prefix})]}),e.jsxs("div",{className:"text-muted-foreground",children:[e.jsx("span",{className:"font-medium",children:"优先级: "}),e.jsx("span",{className:"font-mono",children:L.priority})]})]}),e.jsxs("div",{className:"flex items-center gap-2 pt-2 border-t",children:[e.jsxs(_,{variant:"outline",size:"sm",className:"flex-1",onClick:()=>A(L),children:[e.jsx(Fn,{className:"h-4 w-4 mr-1"}),"编辑"]}),e.jsx(_,{variant:"outline",size:"sm",onClick:()=>F(L,"up"),disabled:L.priority===1,children:e.jsx(Fr,{className:"h-4 w-4"})}),e.jsx(_,{variant:"outline",size:"sm",onClick:()=>F(L,"down"),children:e.jsx(Ma,{className:"h-4 w-4"})}),e.jsx(_,{variant:"destructive",size:"sm",onClick:()=>M(L.id),children:e.jsx(ls,{className:"h-4 w-4"})})]})]})},L.id))})]}),e.jsx(Is,{open:N,onOpenChange:v,children:e.jsxs(Os,{className:"max-w-lg",children:[e.jsxs(Ds,{children:[e.jsx(Rs,{children:"添加镜像源"}),e.jsx(Ks,{children:"添加新的 Git 镜像源配置"})]}),e.jsxs("div",{className:"space-y-4 py-4",children:[e.jsxs("div",{className:"space-y-2",children:[e.jsx(E,{htmlFor:"add-id",children:"镜像源 ID *"}),e.jsx(le,{id:"add-id",placeholder:"例如: my-mirror",value:b.id,onChange:L=>R({...b,id:L.target.value})})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsx(E,{htmlFor:"add-name",children:"名称 *"}),e.jsx(le,{id:"add-name",placeholder:"例如: 我的镜像源",value:b.name,onChange:L=>R({...b,name:L.target.value})})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsx(E,{htmlFor:"add-raw",children:"Raw 文件前缀 *"}),e.jsx(le,{id:"add-raw",placeholder:"https://example.com/raw",value:b.raw_prefix,onChange:L=>R({...b,raw_prefix:L.target.value})})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsx(E,{htmlFor:"add-clone",children:"克隆前缀 *"}),e.jsx(le,{id:"add-clone",placeholder:"https://example.com/clone",value:b.clone_prefix,onChange:L=>R({...b,clone_prefix:L.target.value})})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsx(E,{htmlFor:"add-priority",children:"优先级"}),e.jsx(le,{id:"add-priority",type:"number",min:"1",value:b.priority,onChange:L=>R({...b,priority:parseInt(L.target.value)||1})}),e.jsx("p",{className:"text-xs text-muted-foreground",children:"数字越小优先级越高"})]}),e.jsxs("div",{className:"flex items-center space-x-2",children:[e.jsx(Fe,{id:"add-enabled",checked:b.enabled,onCheckedChange:L=>R({...b,enabled:L})}),e.jsx(E,{htmlFor:"add-enabled",children:"启用此镜像源"})]})]}),e.jsxs(st,{children:[e.jsx(_,{variant:"outline",onClick:()=>v(!1),children:"取消"}),e.jsx(_,{onClick:S,children:"添加"})]})]})}),e.jsx(Is,{open:y,onOpenChange:w,children:e.jsxs(Os,{className:"max-w-lg",children:[e.jsxs(Ds,{children:[e.jsx(Rs,{children:"编辑镜像源"}),e.jsx(Ks,{children:"修改镜像源配置"})]}),e.jsxs("div",{className:"space-y-4 py-4",children:[e.jsxs("div",{className:"space-y-2",children:[e.jsx(E,{children:"镜像源 ID"}),e.jsx(le,{value:b.id,disabled:!0})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsx(E,{htmlFor:"edit-name",children:"名称 *"}),e.jsx(le,{id:"edit-name",value:b.name,onChange:L=>R({...b,name:L.target.value})})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsx(E,{htmlFor:"edit-raw",children:"Raw 文件前缀 *"}),e.jsx(le,{id:"edit-raw",value:b.raw_prefix,onChange:L=>R({...b,raw_prefix:L.target.value})})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsx(E,{htmlFor:"edit-clone",children:"克隆前缀 *"}),e.jsx(le,{id:"edit-clone",value:b.clone_prefix,onChange:L=>R({...b,clone_prefix:L.target.value})})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsx(E,{htmlFor:"edit-priority",children:"优先级"}),e.jsx(le,{id:"edit-priority",type:"number",min:"1",value:b.priority,onChange:L=>R({...b,priority:parseInt(L.target.value)||1})}),e.jsx("p",{className:"text-xs text-muted-foreground",children:"数字越小优先级越高"})]}),e.jsxs("div",{className:"flex items-center space-x-2",children:[e.jsx(Fe,{id:"edit-enabled",checked:b.enabled,onCheckedChange:L=>R({...b,enabled:L})}),e.jsx(E,{htmlFor:"edit-enabled",children:"启用此镜像源"})]})]}),e.jsxs(st,{children:[e.jsx(_,{variant:"outline",onClick:()=>w(!1),children:"取消"}),e.jsx(_,{onClick:P,children:"保存"})]})]})})]})})}function Gk({pluginId:l,compact:n=!1}){const[i,c]=d.useState(null),[u,x]=d.useState(!0),[h,f]=d.useState(0),[p,g]=d.useState(""),[N,v]=d.useState(!1),{toast:y}=Zs(),w=async()=>{x(!0);const S=await Hv(l);S&&c(S),x(!1)};d.useEffect(()=>{w()},[l]);const b=async()=>{const S=await zk(l);S.success?(y({title:"已点赞",description:"感谢你的支持!"}),w()):y({title:"点赞失败",description:S.error||"未知错误",variant:"destructive"})},R=async()=>{const S=await Ak(l);S.success?(y({title:"已反馈",description:"感谢你的反馈!"}),w()):y({title:"操作失败",description:S.error||"未知错误",variant:"destructive"})},D=async()=>{if(h===0){y({title:"请选择评分",description:"至少选择 1 颗星",variant:"destructive"});return}const S=await Ok(l,h,p||void 0);S.success?(y({title:"评分成功",description:"感谢你的评价!"}),v(!1),f(0),g(""),w()):y({title:"评分失败",description:S.error||"未知错误",variant:"destructive"})};return u?e.jsxs("div",{className:"flex items-center gap-4 text-sm text-muted-foreground",children:[e.jsxs("div",{className:"flex items-center gap-1",children:[e.jsx(sa,{className:"h-4 w-4"}),e.jsx("span",{children:"-"})]}),e.jsxs("div",{className:"flex items-center gap-1",children:[e.jsx(dn,{className:"h-4 w-4"}),e.jsx("span",{children:"-"})]})]}):i?n?e.jsxs("div",{className:"flex items-center gap-4 text-sm text-muted-foreground",children:[e.jsxs("div",{className:"flex items-center gap-1",title:`下载量: ${i.downloads.toLocaleString()}`,children:[e.jsx(sa,{className:"h-4 w-4"}),e.jsx("span",{children:i.downloads.toLocaleString()})]}),e.jsxs("div",{className:"flex items-center gap-1",title:`评分: ${i.rating.toFixed(1)} (${i.rating_count} 条评价)`,children:[e.jsx(dn,{className:"h-4 w-4 fill-yellow-400 text-yellow-400"}),e.jsx("span",{children:i.rating.toFixed(1)})]}),e.jsxs("div",{className:"flex items-center gap-1",title:`点赞数: ${i.likes}`,children:[e.jsx(Nm,{className:"h-4 w-4"}),e.jsx("span",{children:i.likes})]})]}):e.jsxs("div",{className:"space-y-4",children:[e.jsxs("div",{className:"grid grid-cols-2 sm:grid-cols-4 gap-4",children:[e.jsxs("div",{className:"flex flex-col items-center p-3 rounded-lg border bg-card",children:[e.jsx(sa,{className:"h-5 w-5 text-muted-foreground mb-1"}),e.jsx("span",{className:"text-2xl font-bold",children:i.downloads.toLocaleString()}),e.jsx("span",{className:"text-xs text-muted-foreground",children:"下载量"})]}),e.jsxs("div",{className:"flex flex-col items-center p-3 rounded-lg border bg-card",children:[e.jsx(dn,{className:"h-5 w-5 text-yellow-400 mb-1 fill-yellow-400"}),e.jsx("span",{className:"text-2xl font-bold",children:i.rating.toFixed(1)}),e.jsxs("span",{className:"text-xs text-muted-foreground",children:[i.rating_count," 条评价"]})]}),e.jsxs("div",{className:"flex flex-col items-center p-3 rounded-lg border bg-card",children:[e.jsx(Nm,{className:"h-5 w-5 text-green-500 mb-1"}),e.jsx("span",{className:"text-2xl font-bold",children:i.likes}),e.jsx("span",{className:"text-xs text-muted-foreground",children:"点赞"})]}),e.jsxs("div",{className:"flex flex-col items-center p-3 rounded-lg border bg-card",children:[e.jsx(cg,{className:"h-5 w-5 text-red-500 mb-1"}),e.jsx("span",{className:"text-2xl font-bold",children:i.dislikes}),e.jsx("span",{className:"text-xs text-muted-foreground",children:"点踩"})]})]}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsxs(_,{variant:"outline",size:"sm",onClick:b,children:[e.jsx(Nm,{className:"h-4 w-4 mr-1"}),"点赞"]}),e.jsxs(_,{variant:"outline",size:"sm",onClick:R,children:[e.jsx(cg,{className:"h-4 w-4 mr-1"}),"点踩"]}),e.jsxs(Is,{open:N,onOpenChange:v,children:[e.jsx(Wo,{asChild:!0,children:e.jsxs(_,{variant:"default",size:"sm",children:[e.jsx(dn,{className:"h-4 w-4 mr-1"}),"评分"]})}),e.jsxs(Os,{children:[e.jsxs(Ds,{children:[e.jsx(Rs,{children:"为插件评分"}),e.jsx(Ks,{children:"分享你的使用体验,帮助其他用户"})]}),e.jsxs("div",{className:"space-y-4 py-4",children:[e.jsxs("div",{className:"flex flex-col items-center gap-2",children:[e.jsx("div",{className:"flex gap-2",children:[1,2,3,4,5].map(S=>e.jsx("button",{onClick:()=>f(S),className:"focus:outline-none",children:e.jsx(dn,{className:`h-8 w-8 transition-colors ${S<=h?"fill-yellow-400 text-yellow-400":"text-muted-foreground hover:text-yellow-300"}`})},S))}),e.jsxs("span",{className:"text-sm text-muted-foreground",children:[h===0&&"点击星星进行评分",h===1&&"很差",h===2&&"一般",h===3&&"还行",h===4&&"不错",h===5&&"非常好"]})]}),e.jsxs("div",{children:[e.jsx("label",{className:"text-sm font-medium mb-2 block",children:"评论(可选)"}),e.jsx(ot,{value:p,onChange:S=>g(S.target.value),placeholder:"分享你的使用体验...",rows:4,maxLength:500}),e.jsxs("div",{className:"text-xs text-muted-foreground mt-1 text-right",children:[p.length," / 500"]})]})]}),e.jsxs(st,{children:[e.jsx(_,{variant:"outline",onClick:()=>v(!1),children:"取消"}),e.jsx(_,{onClick:D,disabled:h===0,children:"提交评分"})]})]})]})]}),i.recent_ratings&&i.recent_ratings.length>0&&e.jsxs("div",{className:"space-y-2",children:[e.jsx("h4",{className:"text-sm font-semibold",children:"最近评价"}),e.jsx("div",{className:"space-y-3",children:i.recent_ratings.map((S,P)=>e.jsxs("div",{className:"p-3 rounded-lg border bg-muted/50",children:[e.jsxs("div",{className:"flex items-center justify-between mb-2",children:[e.jsx("div",{className:"flex gap-1",children:[1,2,3,4,5].map(M=>e.jsx(dn,{className:`h-3 w-3 ${M<=S.rating?"fill-yellow-400 text-yellow-400":"text-muted-foreground"}`},M))}),e.jsx("span",{className:"text-xs text-muted-foreground",children:new Date(S.created_at).toLocaleDateString()})]}),S.comment&&e.jsx("p",{className:"text-sm text-muted-foreground",children:S.comment})]},P))})]})]}):null}const Vk={"Group Management":"群组管理","Entertainment & Interaction":"娱乐互动","Utility Tools":"实用工具","Content Generation":"内容生成",Multimedia:"多媒体","External Integration":"外部集成","Data Analysis & Insights":"数据分析与洞察",Other:"其他"};function qk(){const l=ca(),n=b0({strict:!1}),{toast:i}=Zs(),[c,u]=d.useState(null),[x,h]=d.useState(""),[f,p]=d.useState(!0),[g,N]=d.useState(!0),[v,y]=d.useState(null),[w,b]=d.useState(null),[R,D]=d.useState(null),[S,P]=d.useState(!1),[M,T]=d.useState(),[A,F]=d.useState(!1);d.useEffect(()=>{(async()=>{if(!n.pluginId){y("缺少插件 ID"),p(!1);return}try{p(!0),y(null);const ve=await we("/api/webui/plugins/fetch-raw",{method:"POST",body:JSON.stringify({owner:"Mai-with-u",repo:"plugin-repo",branch:"main",file_path:"plugin_details.json"})});if(!ve.ok)throw new Error("获取插件列表失败");const je=await ve.json();if(!je.success||!je.data)throw new Error(je.error||"获取插件列表失败");const V=JSON.parse(je.data).find(pe=>pe.id===n.pluginId);if(!V)throw new Error("未找到该插件");const B={id:V.id,manifest:V.manifest,downloads:0,rating:0,review_count:0,installed:!1,published_at:new Date().toISOString(),updated_at:new Date().toISOString()};u(B);const[oe,K,_e]=await Promise.all([Lv(),Uv(),Al()]);b(oe),D(K),P(mn(n.pluginId,_e)),T(xn(n.pluginId,_e))}catch(ve){y(ve instanceof Error?ve.message:"加载失败")}finally{p(!1)}})()},[n.pluginId]),d.useEffect(()=>{(async()=>{if(!c?.manifest?.repository_url){N(!1);return}try{if(N(!0),S&&n.pluginId)try{const K=await we(`/api/webui/plugins/local-readme/${n.pluginId}`);if(K.ok){const _e=await K.json();if(_e.success&&_e.data){h(_e.data),N(!1);return}}}catch(K){console.log("本地 README 获取失败,尝试远程获取:",K)}const ve=c.manifest.repository_url.match(/github\.com\/([^/]+)\/([^/\s]+)/);if(!ve){h("无法解析仓库地址");return}const[,je,z]=ve,V=z.replace(/\.git$/,""),B=await we("/api/webui/plugins/fetch-raw",{method:"POST",body:JSON.stringify({owner:je,repo:V,branch:"main",file_path:"README.md"})});if(!B.ok)throw new Error("获取 README 失败");const oe=await B.json();oe.success&&oe.data?h(oe.data):h("该插件暂无 README 文档")}catch(ve){console.error("加载 README 失败:",ve),h("加载 README 失败")}finally{N(!1)}})()},[c,S,n.pluginId]);const L=()=>!c||!S||!M?!1:M!==c.manifest.version,J=()=>!c||!R?!0:$v(c.manifest.host_application.min_version,c.manifest.host_application.max_version,R),U=async()=>{if(!(!c||!w?.installed))try{F(!0),await Bv(c.id,c.manifest.repository_url||"","main"),Fv(c.id).catch(ve=>{console.warn("Failed to record download:",ve)}),i({title:"安装成功",description:`${c.manifest.name} 已成功安装`});const ne=await Al();P(mn(c.id,ne)),T(xn(c.id,ne))}catch(ne){i({title:"安装失败",description:ne instanceof Error?ne.message:"未知错误",variant:"destructive"})}finally{F(!1)}},ue=async()=>{if(c)try{F(!0),await Iv(c.id),i({title:"卸载成功",description:`${c.manifest.name} 已成功卸载`});const ne=await Al();P(mn(c.id,ne)),T(xn(c.id,ne))}catch(ne){i({title:"卸载失败",description:ne instanceof Error?ne.message:"未知错误",variant:"destructive"})}finally{F(!1)}},xe=async()=>{if(!(!c||!w?.installed))try{F(!0);const ne=await Pv(c.id,c.manifest.repository_url||"","main");i({title:"更新成功",description:`${c.manifest.name} 已从 ${ne.old_version} 更新到 ${ne.new_version}`});const ve=await Al();P(mn(c.id,ve)),T(xn(c.id,ve))}catch(ne){i({title:"更新失败",description:ne instanceof Error?ne.message:"未知错误",variant:"destructive"})}finally{F(!1)}};if(f)return e.jsxs("div",{className:"space-y-4 sm:space-y-6 p-4 sm:p-6",children:[e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx(_,{variant:"ghost",size:"icon",onClick:()=>l({to:"/plugins"}),children:e.jsx(Ca,{className:"h-5 w-5"})}),e.jsx("div",{children:e.jsx("h1",{className:"text-2xl sm:text-3xl font-bold",children:"插件详情"})})]}),e.jsxs("div",{className:"flex items-center justify-center py-12",children:[e.jsx(Bs,{className:"h-8 w-8 animate-spin text-muted-foreground"}),e.jsx("span",{className:"ml-3 text-muted-foreground",children:"加载插件信息中..."})]})]});if(v||!c)return e.jsxs("div",{className:"space-y-4 sm:space-y-6 p-4 sm:p-6",children:[e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx(_,{variant:"ghost",size:"icon",onClick:()=>l({to:"/plugins"}),children:e.jsx(Ca,{className:"h-5 w-5"})}),e.jsx("div",{children:e.jsx("h1",{className:"text-2xl sm:text-3xl font-bold",children:"插件详情"})})]}),e.jsx(Ce,{className:"p-6",children:e.jsxs("div",{className:"flex flex-col items-center justify-center py-8 text-center",children:[e.jsx(wt,{className:"h-12 w-12 text-destructive mb-4"}),e.jsx("h3",{className:"text-lg font-semibold mb-2",children:"加载失败"}),e.jsx("p",{className:"text-sm text-muted-foreground mb-4",children:v}),e.jsx(_,{onClick:()=>l({to:"/plugins"}),children:"返回插件列表"})]})})]});const he=J();return e.jsxs("div",{className:"space-y-4 sm:space-y-6 p-4 sm:p-6",children:[e.jsxs("div",{className:"flex flex-col sm:flex-row sm:items-center justify-between gap-4",children:[e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx(_,{variant:"ghost",size:"icon",onClick:()=>l({to:"/plugins"}),className:"shrink-0",children:e.jsx(Ca,{className:"h-5 w-5"})}),e.jsxs("div",{children:[e.jsx("h1",{className:"text-2xl sm:text-3xl font-bold",children:"插件详情"}),e.jsx("p",{className:"text-muted-foreground mt-1 sm:mt-2 text-sm sm:text-base",children:c.manifest.name})]})]}),e.jsx("div",{className:"flex flex-wrap gap-2",children:S?e.jsxs(e.Fragment,{children:[L()?e.jsx(_,{disabled:!w?.installed||A,onClick:xe,title:w?.installed?void 0:"Git 未安装",children:A?e.jsxs(e.Fragment,{children:[e.jsx(Bs,{className:"h-4 w-4 mr-2 animate-spin"}),"更新中..."]}):e.jsxs(e.Fragment,{children:[e.jsx(dt,{className:"h-4 w-4 mr-2"}),"更新"]})}):null,e.jsx(_,{variant:"destructive",disabled:!w?.installed||A,onClick:ue,title:w?.installed?void 0:"Git 未安装",children:A?e.jsxs(e.Fragment,{children:[e.jsx(Bs,{className:"h-4 w-4 mr-2 animate-spin"}),"卸载中..."]}):e.jsxs(e.Fragment,{children:[e.jsx(ls,{className:"h-4 w-4 mr-2"}),"卸载"]})})]}):e.jsx(_,{disabled:!w?.installed||!he||A,onClick:U,title:w?.installed?he?void 0:`不兼容当前版本 (需要 ${c.manifest.host_application.min_version}${c.manifest.host_application.max_version?` - ${c.manifest.host_application.max_version}`:"+"},当前 ${R?.version})`:"Git 未安装",children:A?e.jsxs(e.Fragment,{children:[e.jsx(Bs,{className:"h-4 w-4 mr-2 animate-spin"}),"安装中..."]}):e.jsxs(e.Fragment,{children:[e.jsx(sa,{className:"h-4 w-4 mr-2"}),"安装"]})})})]}),e.jsx(Ye,{className:"h-[calc(100vh-200px)] sm:h-[calc(100vh-220px)]",children:e.jsxs("div",{className:"space-y-6 pr-4",children:[e.jsx(Ce,{children:e.jsx(De,{children:e.jsx("div",{className:"flex items-start justify-between gap-4",children:e.jsxs("div",{className:"flex-1 space-y-2",children:[e.jsxs("div",{className:"flex items-center gap-3 flex-wrap",children:[e.jsx(Le,{className:"text-2xl",children:c.manifest.name}),e.jsxs(Se,{variant:"secondary",className:"text-sm",children:["v",c.manifest.version]}),S&&e.jsxs(Se,{variant:"default",className:"text-sm",children:[e.jsx(pt,{className:"h-3 w-3 mr-1"}),"已安装 ",M&&`(v${M})`]}),L()&&e.jsxs(Se,{variant:"outline",className:"text-sm border-orange-500 text-orange-500",children:[e.jsx(dt,{className:"h-3 w-3 mr-1"}),"可更新"]}),!he&&e.jsxs(Se,{variant:"destructive",className:"text-sm",children:[e.jsx(wt,{className:"h-3 w-3 mr-1"}),"不兼容"]})]}),e.jsx(ws,{className:"text-base",children:c.manifest.description})]})})})}),e.jsxs("div",{className:"grid grid-cols-1 lg:grid-cols-3 gap-6",children:[e.jsxs("div",{className:"lg:col-span-1 space-y-6",children:[e.jsxs(Ce,{children:[e.jsx(De,{children:e.jsx(Le,{className:"text-lg",children:"统计信息"})}),e.jsx(Ae,{children:e.jsx(Gk,{pluginId:c.id})})]}),e.jsxs(Ce,{children:[e.jsx(De,{children:e.jsx(Le,{className:"text-lg",children:"基本信息"})}),e.jsx(Ae,{className:"space-y-4",children:e.jsxs("div",{className:"space-y-3",children:[e.jsxs("div",{className:"flex items-center gap-2 text-sm",children:[e.jsx(fn,{className:"h-4 w-4 text-muted-foreground"}),e.jsx("span",{className:"text-muted-foreground",children:"作者:"}),e.jsx("span",{className:"font-medium",children:c.manifest.author?.name||"Unknown"}),c.manifest.author?.url&&e.jsx("a",{href:c.manifest.author.url,target:"_blank",rel:"noopener noreferrer",className:"text-primary hover:underline",children:e.jsx(Mo,{className:"h-3 w-3"})})]}),e.jsxs("div",{className:"flex items-center gap-2 text-sm",children:[e.jsx(ra,{className:"h-4 w-4 text-muted-foreground"}),e.jsx("span",{className:"text-muted-foreground",children:"版本:"}),e.jsxs("span",{className:"font-medium",children:["v",c.manifest.version]})]}),e.jsxs("div",{className:"flex items-center gap-2 text-sm",children:[e.jsx(Oj,{className:"h-4 w-4 text-muted-foreground"}),e.jsx("span",{className:"text-muted-foreground",children:"许可证:"}),e.jsx("span",{className:"font-medium",children:c.manifest.license})]}),c.manifest.homepage_url&&e.jsxs("div",{className:"flex items-center gap-2 text-sm",children:[e.jsx(Uo,{className:"h-4 w-4 text-muted-foreground"}),e.jsx("span",{className:"text-muted-foreground",children:"主页:"}),e.jsxs("a",{href:c.manifest.homepage_url,target:"_blank",rel:"noopener noreferrer",className:"text-primary hover:underline flex items-center gap-1",children:["访问",e.jsx(Mo,{className:"h-3 w-3"})]})]}),c.manifest.repository_url&&e.jsxs("div",{className:"flex items-center gap-2 text-sm",children:[e.jsx(u_,{className:"h-4 w-4 text-muted-foreground"}),e.jsx("span",{className:"text-muted-foreground",children:"仓库:"}),e.jsxs("a",{href:c.manifest.repository_url,target:"_blank",rel:"noopener noreferrer",className:"text-primary hover:underline flex items-center gap-1",children:["GitHub",e.jsx(Mo,{className:"h-3 w-3"})]})]}),e.jsxs("div",{className:"pt-2 border-t",children:[e.jsxs("div",{className:"flex items-center gap-2 text-sm mb-2",children:[e.jsx(Ht,{className:"h-4 w-4 text-muted-foreground"}),e.jsx("span",{className:"text-muted-foreground",children:"支持版本:"})]}),e.jsxs("div",{className:"text-sm pl-6 font-medium",children:[c.manifest.host_application.min_version,c.manifest.host_application.max_version?` - ${c.manifest.host_application.max_version}`:" - 最新版本"]})]})]})})]}),(c.manifest.categories||c.manifest.keywords)&&e.jsxs(Ce,{children:[e.jsx(De,{children:e.jsx(Le,{className:"text-lg",children:"分类与标签"})}),e.jsxs(Ae,{className:"space-y-4",children:[c.manifest.categories&&c.manifest.categories.length>0&&e.jsxs("div",{children:[e.jsx("p",{className:"text-sm text-muted-foreground mb-2",children:"分类"}),e.jsx("div",{className:"flex flex-wrap gap-2",children:c.manifest.categories.map(ne=>e.jsx(Se,{variant:"secondary",children:Vk[ne]||ne},ne))})]}),c.manifest.keywords&&c.manifest.keywords.length>0&&e.jsxs("div",{children:[e.jsx("p",{className:"text-sm text-muted-foreground mb-2",children:"标签"}),e.jsx("div",{className:"flex flex-wrap gap-2",children:c.manifest.keywords.map(ne=>e.jsxs(Se,{variant:"outline",className:"text-xs",children:[e.jsx(Xo,{className:"h-3 w-3 mr-1"}),ne]},ne))})]})]})]})]}),e.jsxs(Ce,{className:"lg:col-span-2",children:[e.jsx(De,{children:e.jsx(Le,{className:"text-lg",children:"插件说明"})}),e.jsx(Ae,{children:e.jsx(Ye,{className:"h-[600px] pr-4",children:g?e.jsxs("div",{className:"flex items-center justify-center py-12",children:[e.jsx(Bs,{className:"h-6 w-6 animate-spin text-muted-foreground"}),e.jsx("span",{className:"ml-3 text-sm text-muted-foreground",children:"加载说明文档中..."})]}):x?e.jsx(tx,{content:x}):e.jsx("div",{className:"text-center text-muted-foreground py-12",children:"暂无说明文档"})})})]})]})]})})]})}const qi=d.forwardRef(({className:l,...n},i)=>e.jsx(aj,{ref:i,className:I("relative flex h-10 w-10 shrink-0 overflow-hidden rounded-full",l),...n}));qi.displayName=aj.displayName;const Kk=d.forwardRef(({className:l,...n},i)=>e.jsx(lj,{ref:i,className:I("aspect-square h-full w-full",l),...n}));Kk.displayName=lj.displayName;const Ki=d.forwardRef(({className:l,...n},i)=>e.jsx(nj,{ref:i,className:I("flex h-full w-full items-center justify-center rounded-full bg-muted",l),...n}));Ki.displayName=nj.displayName;function Qk(){return"webui_"+Math.random().toString(36).substr(2,9)+"_"+Date.now().toString(36)}function Yk(){const l="maibot_webui_user_id";let n=localStorage.getItem(l);return n||(n=Qk(),localStorage.setItem(l,n)),n}function Jk(){return localStorage.getItem("maibot_webui_user_name")||"WebUI用户"}function Xk(l){localStorage.setItem("maibot_webui_user_name",l)}const Gv="maibot_webui_virtual_tabs";function Zk(){try{const l=localStorage.getItem(Gv);if(l)return JSON.parse(l)}catch(l){console.error("[Chat] 加载虚拟标签页失败:",l)}return[]}function Ug(l){try{localStorage.setItem(Gv,JSON.stringify(l))}catch(n){console.error("[Chat] 保存虚拟标签页失败:",n)}}function Wk({segment:l}){switch(l.type){case"text":return e.jsx("span",{className:"whitespace-pre-wrap",children:String(l.data)});case"image":case"emoji":return e.jsx("img",{src:String(l.data),alt:l.type==="emoji"?"表情包":"图片",className:I("rounded-lg max-w-full",l.type==="emoji"?"max-h-32":"max-h-64"),loading:"lazy",onError:n=>{const i=n.target;i.style.display="none",i.parentElement?.insertAdjacentHTML("beforeend",`[${l.type==="emoji"?"表情包":"图片"}加载失败]`)}});case"voice":return e.jsx("div",{className:"flex items-center gap-2",children:e.jsx("audio",{controls:!0,src:String(l.data),className:"max-w-[200px] h-8",children:"您的浏览器不支持音频播放"})});case"video":return e.jsx("video",{controls:!0,src:String(l.data),className:"rounded-lg max-w-full max-h-64",children:"您的浏览器不支持视频播放"});case"face":return e.jsxs("span",{className:"text-muted-foreground",children:["[表情:",String(l.data),"]"]});case"music":return e.jsx("span",{className:"text-muted-foreground",children:"[音乐分享]"});case"file":return e.jsxs("span",{className:"text-muted-foreground",children:["[文件: ",String(l.data),"]"]});case"reply":return e.jsx("span",{className:"text-muted-foreground text-xs",children:"[回复消息]"});case"forward":return e.jsx("span",{className:"text-muted-foreground",children:"[转发消息]"});case"unknown":default:return e.jsxs("span",{className:"text-muted-foreground",children:["[",l.original_type||"未知消息","]"]})}}function eC({message:l,isBot:n}){return l.message_type==="rich"&&l.segments&&l.segments.length>0?e.jsx("div",{className:"flex flex-col gap-2",children:l.segments.map((i,c)=>e.jsx(Wk,{segment:i},c))}):e.jsx("span",{className:"whitespace-pre-wrap",children:l.content})}function sC(){const l={id:"webui-default",type:"webui",label:"WebUI",messages:[],isConnected:!1,isTyping:!1,sessionInfo:{}},n=()=>{const Ve=Zk().map(Ke=>{const We=Ke.virtualConfig;return!We.groupId&&We.platform&&We.userId&&(We.groupId=`webui_virtual_group_${We.platform}_${We.userId}`),{id:Ke.id,type:"virtual",label:Ke.label,virtualConfig:We,messages:[],isConnected:!1,isTyping:!1,sessionInfo:{}}});return[l,...Ve]},[i,c]=d.useState(n),[u,x]=d.useState("webui-default"),h=i.find(q=>q.id===u)||i[0],[f,p]=d.useState(""),[g,N]=d.useState(!1),[v,y]=d.useState(!0),[w,b]=d.useState(Jk()),[R,D]=d.useState(!1),[S,P]=d.useState(""),[M,T]=d.useState(!1),[A,F]=d.useState([]),[L,J]=d.useState([]),[U,ue]=d.useState(!1),[xe,he]=d.useState(!1),[ne,ve]=d.useState(""),[je,z]=d.useState({platform:"",personId:"",userId:"",userName:"",groupName:"",groupId:""}),V=d.useRef(Yk()),B=d.useRef(new Map),oe=d.useRef(null),K=d.useRef(new Map),_e=d.useRef(0),pe=d.useRef(new Map),{toast:ke}=Zs(),O=q=>(_e.current+=1,`${q}-${Date.now()}-${_e.current}-${Math.random().toString(36).substr(2,9)}`),k=d.useCallback((q,Ve)=>{c(Ke=>Ke.map(We=>We.id===q?{...We,...Ve}:We))},[]),H=d.useCallback((q,Ve)=>{c(Ke=>Ke.map(We=>We.id===q?{...We,messages:[...We.messages,Ve]}:We))},[]),se=d.useCallback(()=>{oe.current?.scrollIntoView({behavior:"smooth"})},[]);d.useEffect(()=>{se()},[h?.messages,se]);const Ee=d.useCallback(async()=>{ue(!0);try{const q=await we("/api/chat/platforms");if(console.log("[Chat] 平台列表响应:",q.status,q.headers.get("content-type")),q.ok){const Ve=q.headers.get("content-type");if(Ve&&Ve.includes("application/json")){const Ke=await q.json();console.log("[Chat] 平台列表数据:",Ke),F(Ke.platforms||[])}else{const Ke=await q.text();console.error("[Chat] 获取平台列表失败: 非 JSON 响应:",Ke.substring(0,200)),ke({title:"连接失败",description:"无法连接到后端服务,请确保 MaiBot 已启动",variant:"destructive"})}}else console.error("[Chat] 获取平台列表失败: HTTP",q.status),ke({title:"获取平台失败",description:`服务器返回错误: ${q.status}`,variant:"destructive"})}catch(q){console.error("[Chat] 获取平台列表失败:",q),ke({title:"网络错误",description:"无法连接到后端服务",variant:"destructive"})}finally{ue(!1)}},[ke]),Z=d.useCallback(async(q,Ve)=>{he(!0);try{const Ke=new URLSearchParams;q&&Ke.append("platform",q),Ve&&Ke.append("search",Ve),Ke.append("limit","50");const We=await we(`/api/chat/persons?${Ke.toString()}`);if(We.ok){const Ls=We.headers.get("content-type");if(Ls&&Ls.includes("application/json")){const ts=await We.json();J(ts.persons||[])}else console.error("[Chat] 获取用户列表失败: 后端返回非 JSON 响应")}}catch(Ke){console.error("[Chat] 获取用户列表失败:",Ke)}finally{he(!1)}},[]);d.useEffect(()=>{je.platform&&Z(je.platform,ne)},[je.platform,ne,Z]);const Oe=d.useCallback(async(q,Ve)=>{y(!0);try{const Ke=new URLSearchParams;Ke.append("user_id",V.current),Ke.append("limit","50"),Ve&&Ke.append("group_id",Ve);const We=`/api/chat/history?${Ke.toString()}`;console.log("[Chat] 正在加载历史消息:",We);const Ls=await we(We);if(Ls.ok){const ts=await Ls.text();try{const Cs=JSON.parse(ts);if(Cs.messages&&Cs.messages.length>0){const ze=Cs.messages.map(as=>({id:as.id,type:as.type,content:as.content,timestamp:as.timestamp,sender:{name:as.sender_name||(as.is_bot?"麦麦":"WebUI用户"),user_id:as.user_id,is_bot:as.is_bot}}));k(q,{messages:ze});const Ns=pe.current.get(q)||new Set;ze.forEach(as=>{if(as.type==="bot"){const es=`bot-${as.content}-${Math.floor(as.timestamp*1e3)}`;Ns.add(es)}}),pe.current.set(q,Ns)}}catch(Cs){console.error("[Chat] JSON 解析失败:",Cs)}}}catch(Ke){console.error("[Chat] 加载历史消息失败:",Ke)}finally{y(!1)}},[k]),ns=d.useCallback(async(q,Ve,Ke)=>{const We=B.current.get(q);if(We?.readyState===WebSocket.OPEN||We?.readyState===WebSocket.CONNECTING){console.log(`[Tab ${q}] WebSocket 已存在,跳过连接`);return}N(!0);let Ls=null;try{const Ns=await we("/api/webui/ws-token");if(Ns.ok){const as=await Ns.json();if(as.success&&as.token)Ls=as.token;else{console.warn(`[Tab ${q}] 获取 WebSocket token 失败: ${as.message||"未登录"}`),N(!1);return}}}catch(Ns){console.error(`[Tab ${q}] 获取 WebSocket token 失败:`,Ns),N(!1);return}if(!Ls){N(!1);return}const ts=window.location.protocol==="https:"?"wss:":"ws:",Cs=new URLSearchParams;Cs.append("token",Ls),Ve==="virtual"&&Ke?(Cs.append("user_id",Ke.userId),Cs.append("user_name",Ke.userName),Cs.append("platform",Ke.platform),Cs.append("person_id",Ke.personId),Cs.append("group_name",Ke.groupName||"WebUI虚拟群聊"),Ke.groupId&&Cs.append("group_id",Ke.groupId)):(Cs.append("user_id",V.current),Cs.append("user_name",w));const ze=`${ts}//${window.location.host}/api/chat/ws?${Cs.toString()}`;console.log(`[Tab ${q}] 正在连接 WebSocket:`,ze);try{const Ns=new WebSocket(ze);B.current.set(q,Ns),Ns.onopen=()=>{k(q,{isConnected:!0}),N(!1),console.log(`[Tab ${q}] WebSocket 已连接`)},Ns.onmessage=as=>{try{const es=JSON.parse(as.data);switch(es.type){case"session_info":k(q,{sessionInfo:{session_id:es.session_id,user_id:es.user_id,user_name:es.user_name,bot_name:es.bot_name}});break;case"system":H(q,{id:O("sys"),type:"system",content:es.content||"",timestamp:es.timestamp||Date.now()/1e3});break;case"user_message":{const bs=es.sender?.user_id,gt=Ve==="virtual"&&Ke?Ke.userId:V.current;console.log(`[Tab ${q}] 收到 user_message, sender: ${bs}, current: ${gt}`);const $t=bs?bs.replace(/^webui_user_/,""):"",tt=gt?gt.replace(/^webui_user_/,""):"";if($t&&tt&&$t===tt){console.log(`[Tab ${q}] 跳过自己的消息(user_id 匹配)`);break}const Ms=pe.current.get(q)||new Set,Tt=`user-${es.content}-${Math.floor((es.timestamp||0)*1e3)}`;if(Ms.has(Tt)){console.log(`[Tab ${q}] 跳过自己的消息(内容去重)`);break}if(Ms.add(Tt),pe.current.set(q,Ms),Ms.size>100){const Bt=Ms.values().next().value;Bt&&Ms.delete(Bt)}H(q,{id:es.message_id||O("user"),type:"user",content:es.content||"",timestamp:es.timestamp||Date.now()/1e3,sender:es.sender});break}case"bot_message":{k(q,{isTyping:!1});const bs=pe.current.get(q)||new Set,gt=`bot-${es.content}-${Math.floor((es.timestamp||0)*1e3)}`;if(bs.has(gt))break;if(bs.add(gt),pe.current.set(q,bs),bs.size>100){const $t=bs.values().next().value;$t&&bs.delete($t)}c($t=>$t.map(tt=>{if(tt.id!==q)return tt;const Ms=tt.messages.filter(Bt=>Bt.type!=="thinking"),Tt={id:O("bot"),type:"bot",content:es.content||"",message_type:es.message_type==="rich"?"rich":"text",segments:es.segments,timestamp:es.timestamp||Date.now()/1e3,sender:es.sender};return{...tt,messages:[...Ms,Tt]}}));break}case"typing":k(q,{isTyping:es.is_typing||!1});break;case"error":c(bs=>bs.map(gt=>{if(gt.id!==q)return gt;const $t=gt.messages.filter(tt=>tt.type!=="thinking");return{...gt,messages:[...$t,{id:O("error"),type:"error",content:es.content||"发生错误",timestamp:es.timestamp||Date.now()/1e3}]}})),ke({title:"错误",description:es.content,variant:"destructive"});break;case"pong":break;case"history":{const bs=es.messages||[];if(bs.length>0){const gt=pe.current.get(q)||new Set,$t=bs.map(tt=>{const Ms=tt.is_bot||!1,Tt=tt.id||O(Ms?"bot":"user"),Bt=`${Ms?"bot":"user"}-${tt.content}-${Math.floor(tt.timestamp*1e3)}`;return gt.add(Bt),{id:Tt,type:Ms?"bot":"user",content:tt.content,timestamp:tt.timestamp,sender:{name:tt.sender_name||(Ms?"麦麦":"用户"),user_id:tt.sender_id,is_bot:Ms}}});pe.current.set(q,gt),k(q,{messages:$t}),console.log(`[Tab ${q}] 已加载 ${$t.length} 条历史消息`)}break}default:console.log("未知消息类型:",es.type)}}catch(es){console.error("解析消息失败:",es)}},Ns.onclose=()=>{k(q,{isConnected:!1}),N(!1),B.current.delete(q),console.log(`[Tab ${q}] WebSocket 已断开`);const as=K.current.get(q);as&&clearTimeout(as);const es=window.setTimeout(()=>{if(!Q.current){const bs=i.find(gt=>gt.id===q);bs&&ns(q,bs.type,bs.virtualConfig)}},5e3);K.current.set(q,es)},Ns.onerror=as=>{console.error(`[Tab ${q}] WebSocket 错误:`,as),N(!1)}}catch(Ns){console.error(`[Tab ${q}] 创建 WebSocket 失败:`,Ns),N(!1)}},[w,k,H,ke,i]),Q=d.useRef(!1);d.useEffect(()=>{Q.current=!1;const q=B.current,Ve=K.current,Ke=pe.current;Oe("webui-default");const We=setTimeout(()=>{Q.current||(ns("webui-default","webui"),i.forEach(ts=>{ts.type==="virtual"&&ts.virtualConfig&&(Ke.set(ts.id,new Set),setTimeout(()=>{Q.current||ns(ts.id,"virtual",ts.virtualConfig)},200))}))},100),Ls=setInterval(()=>{q.forEach(ts=>{ts.readyState===WebSocket.OPEN&&ts.send(JSON.stringify({type:"ping"}))})},3e4);return()=>{Q.current=!0,clearTimeout(We),clearInterval(Ls),Ve.forEach(ts=>{clearTimeout(ts)}),Ve.clear(),q.forEach(ts=>{ts.close()}),q.clear()}},[]);const ee=d.useCallback(()=>{const q=B.current.get(u);if(!f.trim()||!q||q.readyState!==WebSocket.OPEN)return;const Ve=h?.type==="virtual"&&h.virtualConfig?.userName||w,Ke=f.trim(),We=Date.now()/1e3;q.send(JSON.stringify({type:"message",content:Ke,user_name:Ve}));const Ls=pe.current.get(u)||new Set,ts=`user-${Ke}-${Math.floor(We*1e3)}`;if(Ls.add(ts),pe.current.set(u,Ls),Ls.size>100){const Ns=Ls.values().next().value;Ns&&Ls.delete(Ns)}const Cs={id:O("user"),type:"user",content:Ke,timestamp:We,sender:{name:Ve,is_bot:!1}};H(u,Cs);const ze={id:O("thinking"),type:"thinking",content:"",timestamp:We+.001,sender:{name:h?.sessionInfo.bot_name||"麦麦",is_bot:!0}};H(u,ze),p("")},[f,w,u,h,H]),Ue=q=>{q.key==="Enter"&&!q.shiftKey&&(q.preventDefault(),ee())},ie=()=>{P(w),D(!0)},Te=()=>{const q=S.trim()||"WebUI用户";b(q),Xk(q),D(!1);const Ve=B.current.get(u);Ve?.readyState===WebSocket.OPEN&&Ve.send(JSON.stringify({type:"update_nickname",user_name:q}))},de=()=>{P(""),D(!1)},Me=q=>new Date(q*1e3).toLocaleTimeString("zh-CN",{hour:"2-digit",minute:"2-digit"}),rs=()=>{const q=B.current.get(u);q&&(q.close(),B.current.delete(u)),ns(u,h?.type||"webui",h?.virtualConfig)},Ut=()=>{z({platform:"",personId:"",userId:"",userName:"",groupName:"",groupId:""}),ve(""),Ee(),T(!0)},aa=()=>{if(!je.platform||!je.personId){ke({title:"配置不完整",description:"请选择平台和用户",variant:"destructive"});return}const q=`webui_virtual_group_${je.platform}_${je.userId}`,Ve=`virtual-${je.platform}-${je.userId}-${Date.now()}`,Ke=je.userName||je.userId,We={id:Ve,type:"virtual",label:Ke,virtualConfig:{...je,groupId:q},messages:[],isConnected:!1,isTyping:!1,sessionInfo:{}};c(Ls=>{const ts=[...Ls,We],Cs=ts.filter(ze=>ze.type==="virtual"&&ze.virtualConfig).map(ze=>({id:ze.id,label:ze.label,virtualConfig:ze.virtualConfig,createdAt:Date.now()}));return Ug(Cs),ts}),x(Ve),T(!1),pe.current.set(Ve,new Set),setTimeout(()=>{ns(Ve,"virtual",je)},100),ke({title:"虚拟身份标签页",description:`已创建 ${Ke} 的对话`})},Ka=(q,Ve)=>{if(Ve?.stopPropagation(),q==="webui-default")return;const Ke=B.current.get(q);Ke&&(Ke.close(),B.current.delete(q));const We=K.current.get(q);We&&(clearTimeout(We),K.current.delete(q)),pe.current.delete(q),c(Ls=>{const ts=Ls.filter(ze=>ze.id!==q),Cs=ts.filter(ze=>ze.type==="virtual"&&ze.virtualConfig).map(ze=>({id:ze.id,label:ze.label,virtualConfig:ze.virtualConfig,createdAt:Date.now()}));return Ug(Cs),ts}),u===q&&x("webui-default")},Ft=q=>{x(q)},mt=q=>{z(Ve=>({...Ve,personId:q.person_id,userId:q.user_id,userName:q.nickname||q.person_name}))};return e.jsxs("div",{className:"h-full flex flex-col",children:[e.jsx(Is,{open:M,onOpenChange:T,children:e.jsxs(Os,{className:"sm:max-w-[500px] max-h-[85vh] overflow-hidden flex flex-col",children:[e.jsxs(Ds,{children:[e.jsxs(Rs,{className:"flex items-center gap-2",children:[e.jsx(bm,{className:"h-5 w-5"}),"新建虚拟身份对话"]}),e.jsx(Ks,{children:"选择一个麦麦已认识的用户,以该用户的身份与麦麦对话。麦麦将使用她对该用户的记忆和认知来回应。"})]}),e.jsxs("div",{className:"space-y-4 flex-1 overflow-hidden flex flex-col",children:[e.jsxs("div",{className:"space-y-2",children:[e.jsxs(E,{className:"flex items-center gap-2",children:[e.jsx(Uo,{className:"h-4 w-4"}),"选择平台"]}),e.jsxs(Ie,{value:je.platform,onValueChange:q=>{z(Ve=>({...Ve,platform:q,personId:"",userId:"",userName:""})),J([])},children:[e.jsx($e,{disabled:U,children:e.jsx(Pe,{placeholder:U?"加载中...":"选择平台"})}),e.jsx(Be,{children:A.map(q=>e.jsxs(X,{value:q.platform,children:[q.platform," (",q.count," 人)"]},q.platform))})]})]}),je.platform&&e.jsxs("div",{className:"space-y-2 flex-1 overflow-hidden flex flex-col",children:[e.jsxs(E,{className:"flex items-center gap-2",children:[e.jsx(sc,{className:"h-4 w-4"}),"选择用户"]}),e.jsxs("div",{className:"relative",children:[e.jsx(Ct,{className:"absolute left-3 top-1/2 -translate-y-1/2 h-4 w-4 text-muted-foreground"}),e.jsx(le,{placeholder:"搜索用户名...",value:ne,onChange:q=>ve(q.target.value),className:"pl-9"})]}),e.jsx(Ye,{className:"h-[250px] border rounded-md",children:e.jsx("div",{className:"p-2",children:xe?e.jsx("div",{className:"flex items-center justify-center py-8",children:e.jsx(Bs,{className:"h-6 w-6 animate-spin text-muted-foreground"})}):L.length===0?e.jsxs("div",{className:"flex flex-col items-center justify-center py-8 text-muted-foreground",children:[e.jsx(sc,{className:"h-8 w-8 mb-2 opacity-50"}),e.jsx("p",{className:"text-sm",children:"没有找到用户"})]}):e.jsx("div",{className:"space-y-1",children:L.map(q=>e.jsxs("button",{onClick:()=>mt(q),className:I("w-full flex items-center gap-3 p-2 rounded-md text-left transition-colors",je.personId===q.person_id?"bg-primary text-primary-foreground":"hover:bg-muted"),children:[e.jsx(qi,{className:"h-8 w-8 shrink-0",children:e.jsx(Ki,{className:I("text-xs",je.personId===q.person_id?"bg-primary-foreground/20":"bg-muted"),children:(q.nickname||q.person_name||"?").charAt(0)})}),e.jsxs("div",{className:"min-w-0 flex-1",children:[e.jsx("div",{className:"font-medium truncate",children:q.nickname||q.person_name}),e.jsxs("div",{className:I("text-xs truncate",je.personId===q.person_id?"text-primary-foreground/70":"text-muted-foreground"),children:["ID: ",q.user_id,q.is_known&&" · 已认识"]})]})]},q.person_id))})})})]}),je.personId&&e.jsxs("div",{className:"space-y-2",children:[e.jsx(E,{children:"虚拟群名(可选)"}),e.jsx(le,{placeholder:"WebUI虚拟群聊",value:je.groupName,onChange:q=>z(Ve=>({...Ve,groupName:q.target.value}))}),e.jsx("p",{className:"text-xs text-muted-foreground",children:"麦麦会认为这是一个名为此名称的群聊"})]})]}),e.jsxs(st,{className:"gap-2 sm:gap-0",children:[e.jsx(_,{variant:"outline",onClick:()=>T(!1),children:"取消"}),e.jsx(_,{onClick:aa,disabled:!je.platform||!je.personId,children:"创建对话"})]})]})}),e.jsx("div",{className:"shrink-0 border-b bg-muted/30",children:e.jsx("div",{className:"max-w-4xl mx-auto px-2 sm:px-4",children:e.jsxs("div",{className:"flex items-center gap-1 overflow-x-auto py-1.5 scrollbar-thin",children:[i.map(q=>e.jsxs("div",{className:I("flex items-center gap-1.5 px-3 py-1.5 rounded-md text-sm whitespace-nowrap transition-colors cursor-pointer","hover:bg-muted",u===q.id?"bg-background shadow-sm border":"text-muted-foreground"),onClick:()=>Ft(q.id),children:[q.type==="webui"?e.jsx(Ea,{className:"h-3.5 w-3.5"}):e.jsx(bm,{className:"h-3.5 w-3.5"}),e.jsx("span",{className:"max-w-[100px] truncate",children:q.label}),e.jsx("span",{className:I("w-1.5 h-1.5 rounded-full",q.isConnected?"bg-green-500":"bg-muted-foreground/50")}),q.id!=="webui-default"&&e.jsx("span",{onClick:Ve=>Ka(q.id,Ve),className:"ml-0.5 p-0.5 rounded hover:bg-muted-foreground/20 cursor-pointer",role:"button",tabIndex:0,onKeyDown:Ve=>{(Ve.key==="Enter"||Ve.key===" ")&&(Ve.preventDefault(),Ka(q.id,Ve))},children:e.jsx(Ta,{className:"h-3 w-3"})})]},q.id)),e.jsx("button",{onClick:Ut,className:"flex items-center gap-1 px-2 py-1.5 rounded-md text-sm text-muted-foreground hover:bg-muted hover:text-foreground transition-colors",title:"新建虚拟身份对话",children:e.jsx(et,{className:"h-3.5 w-3.5"})})]})})}),e.jsx("div",{className:"shrink-0 border-b bg-background/95 backdrop-blur supports-[backdrop-filter]:bg-background/60",children:e.jsxs("div",{className:"p-3 sm:p-4 max-w-4xl mx-auto",children:[e.jsxs("div",{className:"flex items-center justify-between gap-2",children:[e.jsxs("div",{className:"flex items-center gap-2 sm:gap-3 min-w-0",children:[e.jsx(qi,{className:"h-8 w-8 sm:h-10 sm:w-10 shrink-0",children:e.jsx(Ki,{className:"bg-primary/10 text-primary",children:e.jsx(Pn,{className:"h-4 w-4 sm:h-5 sm:w-5"})})}),e.jsxs("div",{className:"min-w-0",children:[e.jsx("h1",{className:"text-base sm:text-lg font-semibold truncate",children:h?.sessionInfo.bot_name||"麦麦"}),e.jsx("div",{className:"flex items-center gap-1.5 text-xs text-muted-foreground",children:h?.isConnected?e.jsxs(e.Fragment,{children:[e.jsx(m_,{className:"h-3 w-3 text-green-500"}),e.jsx("span",{className:"text-green-600 dark:text-green-400",children:"已连接"})]}):g?e.jsxs(e.Fragment,{children:[e.jsx(Bs,{className:"h-3 w-3 animate-spin"}),e.jsx("span",{children:"连接中..."})]}):e.jsxs(e.Fragment,{children:[e.jsx(x_,{className:"h-3 w-3 text-red-500"}),e.jsx("span",{className:"text-red-600 dark:text-red-400",children:"未连接"})]})})]})]}),e.jsxs("div",{className:"flex items-center gap-1 shrink-0",children:[v&&e.jsx(Bs,{className:"h-4 w-4 animate-spin text-muted-foreground"}),e.jsx(_,{variant:"ghost",size:"icon",className:"h-8 w-8",onClick:rs,disabled:g,title:"重新连接",children:e.jsx(dt,{className:I("h-4 w-4",g&&"animate-spin")})})]})]}),e.jsx("div",{className:"hidden sm:flex items-center gap-2 mt-2 text-sm text-muted-foreground",children:h?.type==="virtual"&&h.virtualConfig?e.jsxs(e.Fragment,{children:[e.jsx(bm,{className:"h-3 w-3 text-primary"}),e.jsx("span",{children:"虚拟身份:"}),e.jsx("span",{className:"font-medium text-primary",children:h.virtualConfig.userName}),e.jsxs("span",{className:"text-xs",children:["(",h.virtualConfig.platform,")"]}),h.virtualConfig.groupName&&e.jsxs(e.Fragment,{children:[e.jsx("span",{className:"mx-1",children:"·"}),e.jsxs("span",{className:"text-xs",children:["群:",h.virtualConfig.groupName]})]})]}):e.jsxs(e.Fragment,{children:[e.jsx(fn,{className:"h-3 w-3"}),e.jsx("span",{children:"当前身份:"}),R?e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(le,{value:S,onChange:q=>P(q.target.value),onKeyDown:q=>{q.key==="Enter"&&Te(),q.key==="Escape"&&de()},className:"h-7 w-32",placeholder:"输入昵称",autoFocus:!0}),e.jsx(_,{size:"sm",variant:"ghost",className:"h-7 px-2",onClick:Te,children:"保存"}),e.jsx(_,{size:"sm",variant:"ghost",className:"h-7 px-2",onClick:de,children:"取消"})]}):e.jsxs("div",{className:"flex items-center gap-1",children:[e.jsx("span",{className:"font-medium text-foreground",children:w}),e.jsx(_,{size:"sm",variant:"ghost",className:"h-6 w-6 p-0",onClick:ie,title:"修改昵称",children:e.jsx(h_,{className:"h-3 w-3"})})]})]})})]})}),e.jsx("div",{className:"flex-1 overflow-hidden",children:e.jsx(Ye,{className:"h-full",children:e.jsxs("div",{className:"p-3 sm:p-4 max-w-4xl mx-auto space-y-3 sm:space-y-4",children:[h?.messages.length===0&&!v&&e.jsxs("div",{className:"flex flex-col items-center justify-center py-12 text-muted-foreground",children:[e.jsx(Pn,{className:"h-12 w-12 mb-4 opacity-50"}),e.jsxs("p",{className:"text-sm",children:["开始与 ",h?.sessionInfo.bot_name||"麦麦"," 对话吧!"]})]}),h?.messages.map(q=>e.jsxs("div",{className:I("flex gap-2 sm:gap-3",q.type==="user"&&"flex-row-reverse",q.type==="system"&&"justify-center",q.type==="error"&&"justify-center"),children:[q.type==="system"&&e.jsx("div",{className:"text-xs text-muted-foreground bg-muted/50 px-3 py-1 rounded-full max-w-[90%]",children:q.content}),q.type==="error"&&e.jsx("div",{className:"text-xs text-red-600 dark:text-red-400 bg-red-100 dark:bg-red-900/30 px-3 py-1 rounded-full max-w-[90%]",children:q.content}),q.type==="thinking"&&e.jsxs(e.Fragment,{children:[e.jsx(qi,{className:"h-7 w-7 sm:h-8 sm:w-8 shrink-0",children:e.jsx(Ki,{className:"bg-primary/10 text-primary",children:e.jsx(Pn,{className:"h-3.5 w-3.5 sm:h-4 sm:w-4"})})}),e.jsxs("div",{className:"flex flex-col gap-1 max-w-[75%] sm:max-w-[70%]",children:[e.jsx("div",{className:"flex items-center gap-2 text-[10px] sm:text-xs text-muted-foreground",children:e.jsx("span",{className:"hidden sm:inline",children:q.sender?.name||h?.sessionInfo.bot_name})}),e.jsx("div",{className:"bg-muted rounded-2xl rounded-tl-sm px-4 py-3",children:e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsxs("div",{className:"flex gap-1",children:[e.jsx("span",{className:"w-2 h-2 bg-primary/60 rounded-full animate-bounce",style:{animationDelay:"0ms"}}),e.jsx("span",{className:"w-2 h-2 bg-primary/60 rounded-full animate-bounce",style:{animationDelay:"150ms"}}),e.jsx("span",{className:"w-2 h-2 bg-primary/60 rounded-full animate-bounce",style:{animationDelay:"300ms"}})]}),e.jsx("span",{className:"text-xs text-muted-foreground ml-1",children:"思考中..."})]})})]})]}),(q.type==="user"||q.type==="bot")&&e.jsxs(e.Fragment,{children:[e.jsx(qi,{className:"h-7 w-7 sm:h-8 sm:w-8 shrink-0",children:e.jsx(Ki,{className:I("text-xs",q.type==="bot"?"bg-primary/10 text-primary":"bg-secondary text-secondary-foreground"),children:q.type==="bot"?e.jsx(Pn,{className:"h-3.5 w-3.5 sm:h-4 sm:w-4"}):e.jsx(fn,{className:"h-3.5 w-3.5 sm:h-4 sm:w-4"})})}),e.jsxs("div",{className:I("flex flex-col gap-1 max-w-[75%] sm:max-w-[70%]",q.type==="user"&&"items-end"),children:[e.jsxs("div",{className:"flex items-center gap-2 text-[10px] sm:text-xs text-muted-foreground",children:[e.jsx("span",{className:"hidden sm:inline",children:q.sender?.name||(q.type==="bot"?h?.sessionInfo.bot_name:w)}),e.jsx("span",{children:Me(q.timestamp)})]}),e.jsx("div",{className:I("rounded-2xl px-3 py-2 text-sm break-words",q.type==="bot"?"bg-muted rounded-tl-sm":"bg-primary text-primary-foreground rounded-tr-sm"),children:e.jsx(eC,{message:q,isBot:q.type==="bot"})})]})]})]},q.id)),e.jsx("div",{ref:oe})]})})}),e.jsx("div",{className:"shrink-0 border-t bg-background/95 backdrop-blur supports-[backdrop-filter]:bg-background/60",children:e.jsx("div",{className:"p-3 sm:p-4 max-w-4xl mx-auto",children:e.jsxs("div",{className:"flex gap-2",children:[e.jsx(le,{value:f,onChange:q=>p(q.target.value),onKeyDown:Ue,placeholder:h?.isConnected?"输入消息...":"等待连接...",disabled:!h?.isConnected,className:"flex-1 h-10 sm:h-10"}),e.jsx(_,{onClick:ee,disabled:!h?.isConnected||!f.trim(),size:"icon",className:"h-10 w-10 shrink-0",children:e.jsx(f_,{className:"h-4 w-4"})})]})})})]})}var ux="Radio",[tC,Vv]=Ko(ux),[aC,lC]=tC(ux),qv=d.forwardRef((l,n)=>{const{__scopeRadio:i,name:c,checked:u=!1,required:x,disabled:h,value:f="on",onCheck:p,form:g,...N}=l,[v,y]=d.useState(null),w=Qo(n,D=>y(D)),b=d.useRef(!1),R=v?g||!!v.closest("form"):!0;return e.jsxs(aC,{scope:i,checked:u,disabled:h,children:[e.jsx(Qn.button,{type:"button",role:"radio","aria-checked":u,"data-state":Jv(u),"data-disabled":h?"":void 0,disabled:h,value:f,...N,ref:w,onClick:hn(l.onClick,D=>{u||p?.(),R&&(b.current=D.isPropagationStopped(),b.current||D.stopPropagation())})}),R&&e.jsx(Yv,{control:v,bubbles:!b.current,name:c,value:f,checked:u,required:x,disabled:h,form:g,style:{transform:"translateX(-100%)"}})]})});qv.displayName=ux;var Kv="RadioIndicator",Qv=d.forwardRef((l,n)=>{const{__scopeRadio:i,forceMount:c,...u}=l,x=lC(Kv,i);return e.jsx(Dw,{present:c||x.checked,children:e.jsx(Qn.span,{"data-state":Jv(x.checked),"data-disabled":x.disabled?"":void 0,...u,ref:n})})});Qv.displayName=Kv;var nC="RadioBubbleInput",Yv=d.forwardRef(({__scopeRadio:l,control:n,checked:i,bubbles:c=!0,...u},x)=>{const h=d.useRef(null),f=Qo(h,x),p=Rw(i),g=Lw(n);return d.useEffect(()=>{const N=h.current;if(!N)return;const v=window.HTMLInputElement.prototype,w=Object.getOwnPropertyDescriptor(v,"checked").set;if(p!==i&&w){const b=new Event("click",{bubbles:c});w.call(N,i),N.dispatchEvent(b)}},[p,i,c]),e.jsx(Qn.input,{type:"radio","aria-hidden":!0,defaultChecked:i,...u,tabIndex:-1,ref:f,style:{...u.style,...g,position:"absolute",pointerEvents:"none",opacity:0,margin:0}})});Yv.displayName=nC;function Jv(l){return l?"checked":"unchecked"}var rC=["ArrowUp","ArrowDown","ArrowLeft","ArrowRight"],rd="RadioGroup",[iC]=Ko(rd,[rj,Vv]),Xv=rj(),Zv=Vv(),[cC,oC]=iC(rd),Wv=d.forwardRef((l,n)=>{const{__scopeRadioGroup:i,name:c,defaultValue:u,value:x,required:h=!1,disabled:f=!1,orientation:p,dir:g,loop:N=!0,onValueChange:v,...y}=l,w=Xv(i),b=_j(g),[R,D]=qo({prop:x,defaultProp:u??null,onChange:v,caller:rd});return e.jsx(cC,{scope:i,name:c,required:h,disabled:f,value:R,onValueChange:D,children:e.jsx(J0,{asChild:!0,...w,orientation:p,dir:b,loop:N,children:e.jsx(Qn.div,{role:"radiogroup","aria-required":h,"aria-orientation":p,"data-disabled":f?"":void 0,dir:b,...y,ref:n})})})});Wv.displayName=rd;var eN="RadioGroupItem",sN=d.forwardRef((l,n)=>{const{__scopeRadioGroup:i,disabled:c,...u}=l,x=oC(eN,i),h=x.disabled||c,f=Xv(i),p=Zv(i),g=d.useRef(null),N=Qo(n,g),v=x.value===u.value,y=d.useRef(!1);return d.useEffect(()=>{const w=R=>{rC.includes(R.key)&&(y.current=!0)},b=()=>y.current=!1;return document.addEventListener("keydown",w),document.addEventListener("keyup",b),()=>{document.removeEventListener("keydown",w),document.removeEventListener("keyup",b)}},[]),e.jsx(X0,{asChild:!0,...f,focusable:!h,active:v,children:e.jsx(qv,{disabled:h,required:x.required,checked:v,...p,...u,name:x.name,ref:N,onCheck:()=>x.onValueChange(u.value),onKeyDown:hn(w=>{w.key==="Enter"&&w.preventDefault()}),onFocus:hn(u.onFocus,()=>{y.current&&g.current?.click()})})})});sN.displayName=eN;var dC="RadioGroupIndicator",tN=d.forwardRef((l,n)=>{const{__scopeRadioGroup:i,...c}=l,u=Zv(i);return e.jsx(Qv,{...u,...c,ref:n})});tN.displayName=dC;var aN=Wv,lN=sN,uC=tN;const mx=d.forwardRef(({className:l,...n},i)=>e.jsx(aN,{className:I("grid gap-2",l),...n,ref:i}));mx.displayName=aN.displayName;const Go=d.forwardRef(({className:l,...n},i)=>e.jsx(lN,{ref:i,className:I("aspect-square h-4 w-4 rounded-full border border-primary text-primary shadow focus:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:cursor-not-allowed disabled:opacity-50",l),...n,children:e.jsx(uC,{className:"flex items-center justify-center",children:e.jsx(Lo,{className:"h-2.5 w-2.5 fill-current text-current"})})}));Go.displayName=lN.displayName;function mC({question:l,value:n,onChange:i,error:c,disabled:u=!1}){const[x,h]=d.useState(null),f=u||l.readOnly,p=()=>{switch(l.type){case"single":return e.jsx(mx,{value:n||"",onValueChange:i,disabled:f,className:"space-y-2",children:l.options?.map(g=>e.jsxs("div",{className:"flex items-center space-x-2",children:[e.jsx(Go,{value:g.value,id:`${l.id}-${g.id}`}),e.jsx(E,{htmlFor:`${l.id}-${g.id}`,className:"cursor-pointer font-normal",children:g.label})]},g.id))});case"multiple":{const g=n||[];return e.jsxs("div",{className:"space-y-2",children:[l.options?.map(N=>e.jsxs("div",{className:"flex items-center space-x-2",children:[e.jsx(qs,{id:`${l.id}-${N.id}`,checked:g.includes(N.value),disabled:f||l.maxSelections!==void 0&&g.length>=l.maxSelections&&!g.includes(N.value),onCheckedChange:v=>{i(v?[...g,N.value]:g.filter(y=>y!==N.value))}}),e.jsx(E,{htmlFor:`${l.id}-${N.id}`,className:"cursor-pointer font-normal",children:N.label})]},N.id)),l.maxSelections&&e.jsxs("p",{className:"text-xs text-muted-foreground",children:["最多选择 ",l.maxSelections," 项"]})]})}case"text":return e.jsx(le,{value:n||"",onChange:g=>i(g.target.value),placeholder:l.placeholder||"请输入...",disabled:f,readOnly:l.readOnly,maxLength:l.maxLength,className:I(l.readOnly&&"bg-muted cursor-not-allowed")});case"textarea":return e.jsxs("div",{className:"space-y-1",children:[e.jsx(ot,{value:n||"",onChange:g=>i(g.target.value),placeholder:l.placeholder||"请输入...",disabled:f,readOnly:l.readOnly,maxLength:l.maxLength,rows:4,className:I(l.readOnly&&"bg-muted cursor-not-allowed")}),l.maxLength&&e.jsxs("p",{className:"text-xs text-muted-foreground text-right",children:[(n||"").length," / ",l.maxLength]})]});case"rating":{const g=n||0,N=x!==null?x:g;return e.jsxs("div",{className:"flex items-center gap-1",children:[[1,2,3,4,5].map(v=>e.jsx("button",{type:"button",disabled:f,className:I("p-1 transition-colors focus:outline-none focus:ring-2 focus:ring-ring rounded",f&&"cursor-not-allowed opacity-50"),onMouseEnter:()=>!f&&h(v),onMouseLeave:()=>h(null),onClick:()=>!f&&i(v),children:e.jsx(dn,{className:I("h-6 w-6 transition-colors",v<=N?"fill-yellow-400 text-yellow-400":"text-muted-foreground")})},v)),g>0&&e.jsxs("span",{className:"ml-2 text-sm text-muted-foreground",children:[g," / 5"]})]})}case"scale":{const g=l.min??1,N=l.max??10,v=l.step??1,y=n??g;return e.jsxs("div",{className:"space-y-4",children:[e.jsx(Va,{value:[y],onValueChange:([w])=>i(w),min:g,max:N,step:v,disabled:f}),e.jsxs("div",{className:"flex justify-between text-xs text-muted-foreground",children:[e.jsx("span",{children:l.minLabel||g}),e.jsx("span",{className:"font-medium text-foreground",children:y}),e.jsx("span",{children:l.maxLabel||N})]})]})}case"dropdown":return e.jsxs(Ie,{value:n||"",onValueChange:i,disabled:f,children:[e.jsx($e,{children:e.jsx(Pe,{placeholder:l.placeholder||"请选择..."})}),e.jsx(Be,{children:l.options?.map(g=>e.jsx(X,{value:g.value,children:g.label},g.id))})]});default:return e.jsx("div",{className:"text-muted-foreground",children:"不支持的问题类型"})}};return e.jsxs("div",{className:"space-y-3",children:[e.jsxs("div",{className:"space-y-1",children:[e.jsxs(E,{className:"text-base font-medium",children:[l.title,l.required&&e.jsx("span",{className:"text-destructive ml-1",children:"*"})]}),l.description&&e.jsx("p",{className:"text-sm text-muted-foreground",children:l.description})]}),p(),c&&e.jsx("p",{className:"text-sm text-destructive",children:c})]})}const nN="https://maibot-plugin-stats.maibot-webui.workers.dev";function rN(){const l="maibot_user_id";let n=localStorage.getItem(l);if(!n){const i=Math.random().toString(36).substring(2,10),c=Date.now().toString(36),u=Math.random().toString(36).substring(2,10);n=`fp_${i}_${c}_${u}`,localStorage.setItem(l,n)}return n}async function xC(l,n,i,c){try{const u=c?.userId||rN(),x={surveyId:l,surveyVersion:n,userId:u,answers:i,submittedAt:new Date().toISOString(),allowMultiple:c?.allowMultiple,metadata:{userAgent:navigator.userAgent,language:navigator.language}},h=await fetch(`${nN}/survey/submit`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(x)}),f=await h.json();return h.status===429?{success:!1,error:"提交过于频繁,请稍后再试"}:h.status===409?{success:!1,error:f.error||"你已经提交过这份问卷了"}:h.ok?{success:!0,submissionId:f.submissionId,message:f.message}:{success:!1,error:f.error||"提交失败"}}catch(u){return console.error("Error submitting survey:",u),{success:!1,error:"网络错误"}}}async function hC(l,n){try{const i=n||rN(),c=new URLSearchParams({user_id:i,survey_id:l}),u=await fetch(`${nN}/survey/check?${c}`);return u.ok?{success:!0,hasSubmitted:(await u.json()).hasSubmitted}:{success:!1,error:(await u.json()).error||"检查失败"}}catch(i){return console.error("Error checking submission:",i),{success:!1,error:"网络错误"}}}function iN({config:l,initialAnswers:n,onSubmitSuccess:i,onSubmitError:c,showProgress:u=!0,paginateQuestions:x=!1,className:h}){const f=d.useCallback(()=>!n||n.length===0?{}:n.reduce((B,oe)=>(B[oe.questionId]=oe.value,B),{}),[n]),[p,g]=d.useState(()=>f()),[N,v]=d.useState({}),[y,w]=d.useState(0),[b,R]=d.useState(!1),[D,S]=d.useState(!1),[P,M]=d.useState(null),[T,A]=d.useState(null),[F,L]=d.useState(!1),[J,U]=d.useState(!0);d.useEffect(()=>{n&&n.length>0&&g(B=>({...B,...f()}))},[n,f]),d.useEffect(()=>{(async()=>{if(!l.settings?.allowMultiple){const oe=await hC(l.id);oe.success&&oe.hasSubmitted&&L(!0)}U(!1)})()},[l.id,l.settings?.allowMultiple]);const ue=d.useCallback(()=>{const B=new Date;return!(l.settings?.startTime&&new Date(l.settings.startTime)>B||l.settings?.endTime&&new Date(l.settings.endTime){const oe=p[B.id];return oe==null?!1:Array.isArray(oe)?oe.length>0:typeof oe=="string"?oe.trim()!=="":!0}).length,he=xe/l.questions.length*100,ne=d.useCallback((B,oe)=>{g(K=>({...K,[B]:oe})),v(K=>{const _e={...K};return delete _e[B],_e})},[]),ve=d.useCallback(()=>{const B={};for(const oe of l.questions){if(oe.required){const K=p[oe.id];if(K==null){B[oe.id]="此题为必填项";continue}if(Array.isArray(K)&&K.length===0){B[oe.id]="请至少选择一项";continue}if(typeof K=="string"&&K.trim()===""){B[oe.id]="此题为必填项";continue}}oe.minLength&&typeof p[oe.id]=="string"&&p[oe.id].length{if(!ve()){if(x){const B=l.questions.findIndex(oe=>N[oe.id]);B>=0&&w(B)}return}R(!0),M(null);try{const B=l.questions.filter(K=>p[K.id]!==void 0).map(K=>({questionId:K.id,value:p[K.id]})),oe=await xC(l.id,l.version,B,{allowMultiple:l.settings?.allowMultiple});if(oe.success&&oe.submissionId)S(!0),A(oe.submissionId),i?.(oe.submissionId);else{const K=oe.error||"提交失败";M(K),c?.(K)}}catch(B){const oe=B instanceof Error?B.message:"提交失败";M(oe),c?.(oe)}finally{R(!1)}},[ve,x,l,p,N,i,c]),z=d.useCallback(B=>{B>=0&&Be.jsxs("div",{className:I("p-4 rounded-lg border bg-card",N[B.id]?"border-destructive bg-destructive/5":"border-border"),children:[x&&e.jsxs("div",{className:"text-xs text-muted-foreground mb-2",children:["问题 ",y+1," / ",l.questions.length]}),!x&&e.jsxs("div",{className:"text-xs text-muted-foreground mb-2",children:[oe+1,"."]}),e.jsx(mC,{question:B,value:p[B.id],onChange:K=>ne(B.id,K),error:N[B.id],disabled:b})]},B.id)),P&&e.jsxs(at,{variant:"destructive",children:[e.jsx(wt,{className:"h-4 w-4"}),e.jsx(lt,{children:P})]}),e.jsx("div",{className:"flex justify-between items-center py-4",children:x?e.jsxs(e.Fragment,{children:[e.jsxs(_,{variant:"outline",onClick:()=>z(y-1),disabled:y===0||b,children:[e.jsx(za,{className:"h-4 w-4 mr-1"}),"上一题"]}),y===l.questions.length-1?e.jsxs(_,{onClick:je,disabled:b,children:[b&&e.jsx(Bs,{className:"h-4 w-4 mr-2 animate-spin"}),"提交问卷"]}):e.jsxs(_,{onClick:()=>z(y+1),disabled:b,children:["下一题",e.jsx(Zt,{className:"h-4 w-4 ml-1"})]})]}):e.jsxs(e.Fragment,{children:[e.jsx("div",{className:"text-sm text-muted-foreground",children:Object.keys(N).length>0&&e.jsxs("span",{className:"text-destructive",children:["还有 ",Object.keys(N).length," 个必填项未完成"]})}),e.jsxs(_,{onClick:je,disabled:b,size:"lg",children:[b&&e.jsx(Bs,{className:"h-4 w-4 mr-2 animate-spin"}),"提交问卷"]})]})})]})})]})}const fC={id:"webui-feedback-v1",version:"1.0.0",title:"麦麦 WebUI 使用反馈问卷",description:"感谢您使用麦麦 WebUI!您的反馈将帮助我们不断改进产品体验。",questions:[{id:"webui_version",type:"text",title:"你正在使用的 WebUI 版本",description:"此项由系统自动填写",required:!0,readOnly:!0,placeholder:"自动检测中..."},{id:"ui_design_satisfaction",type:"single",title:"你觉得当前的 WebUI 界面设计如何?",required:!0,options:[{id:"very_satisfied",label:"非常满意",value:"very_satisfied"},{id:"satisfied",label:"满意",value:"satisfied"},{id:"neutral",label:"一般",value:"neutral"},{id:"dissatisfied",label:"不满意",value:"dissatisfied"},{id:"very_dissatisfied",label:"非常不满意",value:"very_dissatisfied"}]},{id:"problems_encountered",type:"multiple",title:"你在使用 WebUI 时遇到过哪些问题?",description:"可多选",required:!0,options:[{id:"lag",label:"界面卡顿",value:"lag"},{id:"incomplete",label:"功能不完整",value:"incomplete"},{id:"complex",label:"操作复杂",value:"complex"},{id:"bugs",label:"存在 Bug",value:"bugs"},{id:"none",label:"没有遇到问题",value:"none"},{id:"other",label:"其他",value:"other"}]},{id:"problems_other",type:"text",title:'如选择"其他",请说明遇到的问题',required:!1,placeholder:"请描述你遇到的其他问题...",maxLength:500},{id:"useful_features",type:"textarea",title:"你觉得哪些功能是最有用的?",required:!0,placeholder:"请分享你认为最有价值的功能...",maxLength:1e3},{id:"feature_requests",type:"textarea",title:"你希望在未来的版本中增加哪些功能?",required:!0,placeholder:"请告诉我们你期望的新功能...",maxLength:1e3},{id:"overall_satisfaction",type:"single",title:"你对麦麦 WebUI 的整体满意度如何?",required:!0,options:[{id:"very_satisfied",label:"非常满意",value:"very_satisfied"},{id:"satisfied",label:"满意",value:"satisfied"},{id:"neutral",label:"一般",value:"neutral"},{id:"dissatisfied",label:"不满意",value:"dissatisfied"},{id:"very_dissatisfied",label:"非常不满意",value:"very_dissatisfied"}]},{id:"would_recommend",type:"single",title:"你愿意推荐麦麦 WebUI 给其他人使用吗?",required:!0,options:[{id:"yes",label:"是",value:"yes"},{id:"no",label:"否",value:"no"}]},{id:"other_suggestions",type:"textarea",title:"其他建议或意见",description:"此项为选填",required:!1,placeholder:"如果你有任何其他想法或建议,请在此分享...",maxLength:2e3}],settings:{allowMultiple:!1,thankYouMessage:"感谢你的反馈!你的意见对我们非常重要,我们会认真考虑每一条建议。"}},pC={id:"maibot-feedback-v1",version:"1.0.0",title:"麦麦使用体验反馈问卷",description:"感谢您使用麦麦!您的反馈将帮助我们打造更好的 AI 伙伴。",questions:[{id:"maibot_version",type:"text",title:"你正在使用的麦麦版本",description:"此项由系统自动填写",required:!0,readOnly:!0,placeholder:"自动检测中..."},{id:"improvement_areas",type:"textarea",title:"你认为麦麦还有哪些部分可以改进?",required:!0,placeholder:"请分享你认为可以改进的方面...",maxLength:1e3},{id:"problems_encountered",type:"multiple",title:"你在使用麦麦时遇到过哪些问题?",description:"可多选",required:!0,options:[{id:"incomplete",label:"功能不完整",value:"incomplete"},{id:"slow_response",label:"响应速度慢",value:"slow_response"},{id:"complex",label:"操作复杂",value:"complex"},{id:"unstable",label:"运行不稳定",value:"unstable"},{id:"config_difficult",label:"配置困难",value:"config_difficult"},{id:"none",label:"没有遇到问题",value:"none"},{id:"other",label:"其他",value:"other"}]},{id:"problems_other",type:"text",title:'如选择"其他",请说明遇到的问题',required:!1,placeholder:"请描述你遇到的其他问题...",maxLength:500},{id:"helpful_features",type:"textarea",title:"你觉得麦麦的哪些功能对你最有帮助?",required:!0,placeholder:"请分享对你最有帮助的功能...",maxLength:1e3},{id:"feature_requests",type:"textarea",title:"你希望在未来的版本中增加哪些功能?",required:!0,placeholder:"请告诉我们你期望的新功能...",maxLength:1e3},{id:"overall_satisfaction",type:"single",title:"你对麦麦的整体满意度如何?",required:!0,options:[{id:"very_satisfied",label:"非常满意",value:"very_satisfied"},{id:"satisfied",label:"满意",value:"satisfied"},{id:"neutral",label:"一般",value:"neutral"},{id:"dissatisfied",label:"不满意",value:"dissatisfied"},{id:"very_dissatisfied",label:"非常不满意",value:"very_dissatisfied"}]},{id:"would_recommend",type:"single",title:"你愿意推荐麦麦给其他人使用吗?",required:!0,options:[{id:"yes",label:"是",value:"yes"},{id:"no",label:"否",value:"no"}]},{id:"other_suggestions",type:"textarea",title:"其他建议或意见",description:"此项为选填",required:!1,placeholder:"如果你有任何其他想法或建议,请在此分享...",maxLength:2e3}],settings:{allowMultiple:!1,thankYouMessage:"感谢你的反馈!你的意见对麦麦的成长非常重要,我们会认真考虑每一条建议。"}};function gC(){const[l,n]=d.useState(!0),i=d.useMemo(()=>JSON.parse(JSON.stringify(fC)),[]);d.useEffect(()=>{n(!1)},[]);const c=d.useMemo(()=>[{questionId:"webui_version",value:`v${ed}`}],[]),u=d.useCallback(h=>{console.log("WebUI Survey submitted:",h)},[]),x=d.useCallback(h=>{console.error("WebUI Survey submission error:",h)},[]);return l?e.jsx("div",{className:"flex items-center justify-center min-h-[400px]",children:e.jsx(Bs,{className:"h-8 w-8 animate-spin text-muted-foreground"})}):i?e.jsxs("div",{className:"h-[calc(100vh-4rem)] flex flex-col p-4 sm:p-6",children:[e.jsxs("div",{className:"mb-4 sm:mb-6 shrink-0",children:[e.jsxs("h1",{className:"text-2xl sm:text-3xl font-bold flex items-center gap-2",children:[e.jsx(Hj,{className:"h-8 w-8",strokeWidth:2}),"WebUI 使用反馈问卷"]}),e.jsx("p",{className:"text-muted-foreground mt-1 text-sm sm:text-base",children:"感谢您的反馈,帮助我们持续改进产品体验"})]}),e.jsx("div",{className:"flex-1 min-h-0",children:e.jsx(iN,{config:i,initialAnswers:c,showProgress:!0,paginateQuestions:!1,onSubmitSuccess:u,onSubmitError:x})})]}):e.jsxs("div",{className:"flex flex-col items-center justify-center min-h-[400px] gap-4",children:[e.jsxs(at,{variant:"destructive",className:"max-w-md",children:[e.jsx(wt,{className:"h-4 w-4"}),e.jsx(lt,{children:"无法加载问卷配置"})]}),e.jsx(_,{variant:"outline",onClick:()=>window.location.reload(),children:"重试"})]})}function jC(){const[l,n]=d.useState(null),[i,c]=d.useState(!0),[u,x]=d.useState("未知版本");d.useEffect(()=>{(async()=>{try{const v=await c1();x(v.version||"未知版本")}catch(v){console.error("Failed to get MaiBot version:",v),x("获取失败")}const N=JSON.parse(JSON.stringify(pC));n(N),c(!1)})()},[]);const h=d.useMemo(()=>[{questionId:"maibot_version",value:u}],[u]),f=d.useCallback(g=>{console.log("MaiBot Survey submitted:",g)},[]),p=d.useCallback(g=>{console.error("MaiBot Survey submission error:",g)},[]);return i?e.jsx("div",{className:"flex items-center justify-center min-h-[400px]",children:e.jsx(Bs,{className:"h-8 w-8 animate-spin text-muted-foreground"})}):l?e.jsxs("div",{className:"h-[calc(100vh-4rem)] flex flex-col p-4 sm:p-6",children:[e.jsxs("div",{className:"mb-4 sm:mb-6 shrink-0",children:[e.jsxs("h1",{className:"text-2xl sm:text-3xl font-bold flex items-center gap-2",children:[e.jsx(Hj,{className:"h-8 w-8",strokeWidth:2}),"麦麦使用体验反馈问卷"]}),e.jsx("p",{className:"text-muted-foreground mt-1 text-sm sm:text-base",children:"感谢您的反馈,帮助我们打造更好的 AI 伙伴"})]}),e.jsx("div",{className:"flex-1 min-h-0",children:e.jsx(iN,{config:l,initialAnswers:h,showProgress:!0,paginateQuestions:!1,onSubmitSuccess:f,onSubmitError:p})})]}):e.jsxs("div",{className:"flex flex-col items-center justify-center min-h-[400px] gap-4",children:[e.jsxs(at,{variant:"destructive",className:"max-w-md",children:[e.jsx(wt,{className:"h-4 w-4"}),e.jsx(lt,{children:"无法加载问卷配置"})]}),e.jsx(_,{variant:"outline",onClick:()=>window.location.reload(),children:"重试"})]})}async function vC(l=2025){const n=await we(`/api/webui/annual-report/full?year=${l}`);if(!n.ok){const i=await n.json();throw new Error(i.detail||"获取年度报告失败")}return n.json()}const $g=["#0088FE","#00C49F","#FFBB28","#FF8042","#8884d8","#82ca9d"];function NC(){const[l]=d.useState(2025),[n,i]=d.useState(null),[c,u]=d.useState(!0),[x,h]=d.useState(null),f=d.useRef(null),p=d.useCallback(async()=>{try{u(!0),h(null);const g=await vC(l);i(g)}catch(g){h(g instanceof Error?g:new Error("获取年度报告失败"))}finally{u(!1)}},[l]);return d.useEffect(()=>{p()},[p]),c?e.jsx(bC,{}):x?e.jsxs("div",{className:"flex h-screen items-center justify-center text-red-500",children:["获取年度报告失败: ",x.message]}):n?e.jsx(Ye,{className:"h-[calc(100vh-4rem)]",children:e.jsx("div",{className:"min-h-screen bg-gradient-to-b from-background to-muted/50 p-4 md:p-8 print:p-0",children:e.jsxs("div",{className:"mx-auto max-w-5xl space-y-8 print:space-y-4",ref:f,children:[e.jsxs("header",{className:"relative overflow-hidden rounded-3xl bg-primary p-8 text-primary-foreground shadow-2xl print:rounded-none print:shadow-none",children:[e.jsxs("div",{className:"relative z-10 flex flex-col items-center text-center",children:[e.jsx(Pn,{className:"mb-4 h-16 w-16 animate-bounce"}),e.jsxs("h1",{className:"text-4xl font-bold tracking-tighter sm:text-6xl",children:["麦麦 ",n.year," 年度总结"]}),e.jsx("p",{className:"mt-4 max-w-2xl text-lg opacity-90",children:"连接与成长 · Connection & Growth"}),e.jsxs("div",{className:"mt-6 flex items-center gap-2 text-sm opacity-75",children:[e.jsx($o,{className:"h-4 w-4"}),e.jsxs("span",{children:["生成时间: ",n.generated_at]})]})]}),e.jsx("div",{className:"absolute -right-20 -top-20 h-64 w-64 rounded-full bg-white/10 blur-3xl"}),e.jsx("div",{className:"absolute -bottom-20 -left-20 h-64 w-64 rounded-full bg-white/10 blur-3xl"})]}),e.jsxs("section",{className:"space-y-4 break-inside-avoid",children:[e.jsxs("div",{className:"flex items-center gap-2 text-2xl font-bold text-primary",children:[e.jsx(na,{className:"h-8 w-8"}),e.jsx("h2",{children:"时光足迹"})]}),e.jsxs("div",{className:"grid gap-4 md:grid-cols-2 lg:grid-cols-4",children:[e.jsx(Sa,{title:"年度在线时长",value:`${n.time_footprint.total_online_hours} 小时`,description:"相当于陪伴大家绕了太阳一圈",icon:e.jsx(na,{className:"h-4 w-4"})}),e.jsx(Sa,{title:"最忙碌的一天",value:n.time_footprint.busiest_day||"N/A",description:`处理了 ${n.time_footprint.busiest_day_count} 条消息`,icon:e.jsx($o,{className:"h-4 w-4"})}),e.jsx(Sa,{title:"深夜互动 (0-4点)",value:`${n.time_footprint.midnight_chat_count} 次`,description:"在万籁俱寂时交换秘密",icon:e.jsx(Qi,{className:"h-4 w-4"})}),e.jsx(Sa,{title:"作息属性",value:n.time_footprint.is_night_owl?"夜猫子":"早起鸟",description:n.time_footprint.is_night_owl?"越夜越精神":"早睡早起身体好",icon:n.time_footprint.is_night_owl?e.jsx(Qi,{className:"h-4 w-4"}):e.jsx(qm,{className:"h-4 w-4"})})]}),e.jsxs(Ce,{className:"overflow-hidden",children:[e.jsxs(De,{children:[e.jsx(Le,{children:"24小时活跃时钟"}),e.jsx(ws,{children:"麦麦在一天中各个时段的活跃程度"})]}),e.jsx(Ae,{className:"h-[300px]",children:e.jsx(oj,{width:"100%",height:"100%",children:e.jsxs(Eo,{data:n.time_footprint.hourly_distribution.map((g,N)=>({hour:`${N}点`,count:g})),children:[e.jsx(Hi,{strokeDasharray:"3 3",vertical:!1}),e.jsx(Fi,{dataKey:"hour"}),e.jsx(Ur,{}),e.jsx(dj,{contentStyle:{borderRadius:"8px",border:"none",boxShadow:"0 4px 12px rgba(0,0,0,0.1)"},cursor:{fill:"transparent"}}),e.jsx(Gi,{dataKey:"count",fill:"hsl(var(--primary))",radius:[4,4,0,0]})]})})})]}),n.time_footprint.first_message_time&&e.jsx(Ce,{className:"bg-muted/30 border-dashed",children:e.jsxs(Ae,{className:"flex flex-col items-center justify-center p-6 text-center",children:[e.jsx("p",{className:"text-muted-foreground mb-2",children:"2025年的故事开始于"}),e.jsx("div",{className:"text-xl font-bold text-primary mb-1",children:n.time_footprint.first_message_time}),e.jsxs("p",{className:"text-lg",children:[e.jsx("span",{className:"font-semibold text-foreground",children:n.time_footprint.first_message_user})," 说:",e.jsxs("span",{className:"italic text-muted-foreground",children:['"',n.time_footprint.first_message_content,'"']})]})]})})]}),e.jsxs("section",{className:"space-y-4 break-inside-avoid",children:[e.jsxs("div",{className:"flex items-center gap-2 text-2xl font-bold text-primary",children:[e.jsx(sc,{className:"h-8 w-8"}),e.jsx("h2",{children:"社交网络"})]}),e.jsxs("div",{className:"grid gap-4 md:grid-cols-3",children:[e.jsx(Sa,{title:"社交圈子",value:`${n.social_network.total_groups} 个群组`,description:`今年新认识了 ${n.social_network.new_friends_count} 位朋友`,icon:e.jsx(sc,{className:"h-4 w-4"})}),e.jsx(Sa,{title:"被呼叫次数",value:`${n.social_network.at_count+n.social_network.mentioned_count} 次`,description:"我的名字被大家频繁提起",icon:e.jsx(p_,{className:"h-4 w-4"})}),e.jsx(Sa,{title:"最长情陪伴",value:n.social_network.longest_companion_user||"N/A",description:`始终都在,已陪伴 ${n.social_network.longest_companion_days} 天`,icon:e.jsx(Vr,{className:"h-4 w-4 text-red-500"})})]}),e.jsxs("div",{className:"grid gap-4 md:grid-cols-2",children:[e.jsxs(Ce,{children:[e.jsx(De,{children:e.jsx(Le,{children:"话痨群组 TOP3"})}),e.jsx(Ae,{children:e.jsx("div",{className:"space-y-4",children:n.social_network.top_groups.map((g,N)=>e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx(Se,{variant:N===0?"default":"secondary",className:"h-6 w-6 rounded-full p-0 flex items-center justify-center",children:N+1}),e.jsx("span",{className:"font-medium truncate max-w-[150px]",children:g.group_name})]}),e.jsxs("span",{className:"text-muted-foreground text-sm",children:[g.message_count," 条消息"]})]},g.group_id))})})]}),e.jsxs(Ce,{children:[e.jsx(De,{children:e.jsx(Le,{children:"年度最佳损友 TOP3"})}),e.jsx(Ae,{children:e.jsx("div",{className:"space-y-4",children:n.social_network.top_users.map((g,N)=>e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx(Se,{variant:N===0?"default":"secondary",className:"h-6 w-6 rounded-full p-0 flex items-center justify-center",children:N+1}),e.jsx("span",{className:"font-medium truncate max-w-[150px]",children:g.user_nickname})]}),e.jsxs("span",{className:"text-muted-foreground text-sm",children:[g.message_count," 次互动"]})]},g.user_id))})})]})]})]}),e.jsxs("section",{className:"space-y-4 break-inside-avoid",children:[e.jsxs("div",{className:"flex items-center gap-2 text-2xl font-bold text-primary",children:[e.jsx(Xm,{className:"h-8 w-8"}),e.jsx("h2",{children:"最强大脑"})]}),e.jsxs("div",{className:"grid gap-4 md:grid-cols-2 lg:grid-cols-4",children:[e.jsx(Sa,{title:"年度 Token 消耗",value:(n.brain_power.total_tokens/1e6).toFixed(2)+" M",description:"连起来可以绕地球 0.5 圈",icon:e.jsx(Za,{className:"h-4 w-4"})}),e.jsx(Sa,{title:"年度总花费",value:`$${n.brain_power.total_cost.toFixed(2)}`,description:"为了陪大家聊天也是拼了",icon:e.jsx("span",{className:"font-bold",children:"$"})}),e.jsx(Sa,{title:"高冷指数",value:`${n.brain_power.silence_rate}%`,description:`有 ${n.brain_power.no_reply_count} 次选择了沉默`,icon:e.jsx(Qi,{className:"h-4 w-4"})}),e.jsx(Sa,{title:"最高兴趣值",value:n.brain_power.max_interest_value??"N/A",description:n.brain_power.max_interest_time?`出现在 ${n.brain_power.max_interest_time}`:"暂无数据",icon:e.jsx(Vr,{className:"h-4 w-4"})})]}),e.jsxs("div",{className:"grid gap-4 md:grid-cols-2",children:[e.jsxs(Ce,{children:[e.jsx(De,{children:e.jsx(Le,{children:"模型偏好分布"})}),e.jsx(Ae,{children:e.jsx("div",{className:"space-y-3",children:n.brain_power.model_distribution.slice(0,5).map((g,N)=>{const v=n.brain_power.model_distribution[0]?.count||1,y=Math.round(g.count/v*100);return e.jsxs("div",{className:"space-y-1",children:[e.jsxs("div",{className:"flex justify-between text-sm",children:[e.jsx("span",{className:"font-medium truncate max-w-[200px]",children:g.model}),e.jsxs("span",{className:"text-muted-foreground",children:[g.count.toLocaleString()," 次"]})]}),e.jsx("div",{className:"h-2 w-full overflow-hidden rounded-full bg-secondary",children:e.jsx("div",{className:"h-full transition-all duration-500",style:{width:`${y}%`,backgroundColor:$g[N%$g.length]}})})]},g.model)})})})]}),e.jsxs(Ce,{children:[e.jsxs(De,{children:[e.jsx(Le,{children:"烧钱大户 TOP3"}),e.jsx(ws,{children:"谁消耗了最多的 API 额度"})]}),e.jsx(Ae,{children:e.jsx("div",{className:"space-y-6",children:n.brain_power.top_token_consumers.map(g=>e.jsxs("div",{className:"space-y-2",children:[e.jsxs("div",{className:"flex justify-between text-sm font-medium",children:[e.jsxs("span",{children:["用户 ",g.user_id]}),e.jsxs("span",{children:["$",g.cost.toFixed(2)]})]}),e.jsx("div",{className:"h-2 w-full overflow-hidden rounded-full bg-secondary",children:e.jsx("div",{className:"h-full bg-primary transition-all duration-500",style:{width:`${g.cost/(n.brain_power.top_token_consumers[0]?.cost||1)*100}%`}})})]},g.user_id))})})]})]}),e.jsxs("div",{className:"grid gap-4 md:grid-cols-2",children:[e.jsxs(Ce,{className:"bg-gradient-to-br from-amber-50 to-orange-50 dark:from-amber-950/20 dark:to-orange-950/20",children:[e.jsx(De,{children:e.jsxs(Le,{className:"flex items-center gap-2",children:[e.jsx("span",{className:"text-2xl",children:"💰"}),"最昂贵的一次思考"]})}),e.jsxs(Ae,{className:"text-center",children:[e.jsxs("div",{className:"text-4xl font-bold text-amber-600 dark:text-amber-400",children:["$",n.brain_power.most_expensive_cost.toFixed(4)]}),n.brain_power.most_expensive_time&&e.jsxs("p",{className:"mt-2 text-sm text-muted-foreground",children:["发生在 ",n.brain_power.most_expensive_time]}),e.jsx("p",{className:"mt-4 text-sm text-muted-foreground",children:"为了让你满意,这次我可是下了血本!"})]})]}),e.jsxs(Ce,{className:"bg-gradient-to-br from-indigo-50 to-blue-50 dark:from-indigo-950/20 dark:to-blue-950/20",children:[e.jsx(De,{children:e.jsxs(Le,{className:"flex items-center gap-2",children:[e.jsx("span",{className:"text-2xl",children:"🧠"}),"思考深度"]})}),e.jsxs(Ae,{children:[e.jsxs("div",{className:"grid grid-cols-2 gap-4 text-center",children:[e.jsxs("div",{children:[e.jsx("div",{className:"text-2xl font-bold text-indigo-600 dark:text-indigo-400",children:n.brain_power.avg_reasoning_length?.toFixed(0)||0}),e.jsx("div",{className:"text-xs text-muted-foreground",children:"平均思考字数"})]}),e.jsxs("div",{children:[e.jsx("div",{className:"text-2xl font-bold text-blue-600 dark:text-blue-400",children:n.brain_power.max_reasoning_length?.toLocaleString()||0}),e.jsx("div",{className:"text-xs text-muted-foreground",children:"最长思考字数"})]})]}),n.brain_power.max_reasoning_time&&e.jsxs("p",{className:"mt-4 text-center text-xs text-muted-foreground",children:["最深沉的思考发生在 ",n.brain_power.max_reasoning_time]})]})]})]})]}),e.jsxs("section",{className:"space-y-4 break-inside-avoid",children:[e.jsxs("div",{className:"flex items-center gap-2 text-2xl font-bold text-primary",children:[e.jsx(Yo,{className:"h-8 w-8"}),e.jsx("h2",{children:"个性与表达"})]}),e.jsxs("div",{className:"grid gap-4 md:grid-cols-2",children:[e.jsxs(Ce,{className:"bg-gradient-to-br from-pink-50 to-purple-50 dark:from-pink-950/20 dark:to-purple-950/20",children:[e.jsxs(De,{children:[e.jsx(Le,{children:"表情包之王"}),e.jsx(ws,{children:"年度使用次数最多的表情包"})]}),e.jsx(Ae,{className:"flex flex-col items-center justify-center",children:n.expression_vibe.top_emoji?e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"relative mb-4 h-48 w-48 overflow-hidden rounded-lg shadow-lg transition-transform hover:scale-105",children:[e.jsx("img",{src:`/api/webui/emoji/${n.expression_vibe.top_emoji.id}/thumbnail?original=true`,alt:"Top Emoji",className:"h-full w-full object-cover"}),e.jsx(Se,{className:"absolute right-2 top-2 bg-yellow-500",children:"NO.1"})]}),e.jsxs("p",{className:"text-center font-medium text-lg",children:['"',n.expression_vibe.top_emoji.description,'"']}),e.jsxs("p",{className:"text-muted-foreground",children:["使用了 ",n.expression_vibe.top_emoji.usage_count," 次"]})]}):e.jsx("div",{className:"flex h-48 items-center justify-center text-muted-foreground",children:"暂无数据"})})]}),e.jsxs("div",{className:"space-y-4",children:[e.jsxs(Ce,{children:[e.jsxs(De,{children:[e.jsx(Le,{children:"百变麦麦"}),e.jsx(ws,{children:"最常使用的表达风格"})]}),e.jsx(Ae,{children:e.jsx("div",{className:"flex flex-wrap gap-2",children:n.expression_vibe.top_expressions.map((g,N)=>e.jsxs(Se,{variant:"outline",className:I("px-3 py-1 text-sm",N===0&&"border-primary bg-primary/10 text-primary text-base px-4 py-2"),children:[g.style," (",g.count,")"]},g.style))})})]}),e.jsxs("div",{className:"grid grid-cols-2 gap-4",children:[e.jsx(Sa,{title:"图片鉴赏",value:`${n.expression_vibe.image_processed_count} 张`,description:"我看过的图比你吃过的盐还多",icon:e.jsx(Jm,{className:"h-4 w-4"})}),e.jsx(Sa,{title:"成长的足迹",value:`${n.expression_vibe.rejected_expression_count} 次`,description:"被大家纠正表达的次数",icon:e.jsx(Za,{className:"h-4 w-4"})})]})]})]}),n.expression_vibe.action_types.length>0&&e.jsxs(Ce,{children:[e.jsxs(De,{children:[e.jsxs(Le,{className:"flex items-center gap-2",children:[e.jsx("span",{className:"text-2xl",children:"⚡"}),"行动派"]}),e.jsx(ws,{children:"除了聊天,我还帮大家做了这些事"})]}),e.jsx(Ae,{children:e.jsx("div",{className:"flex flex-wrap gap-3",children:n.expression_vibe.action_types.map(g=>e.jsxs("div",{className:"flex items-center gap-2 rounded-full bg-primary/10 px-4 py-2",children:[e.jsx("span",{className:"font-medium text-primary",children:g.action}),e.jsxs(Se,{variant:"secondary",children:[g.count," 次"]})]},g.action))})})]})]}),e.jsxs("section",{className:"space-y-4 break-inside-avoid",children:[e.jsxs("div",{className:"flex items-center gap-2 text-2xl font-bold text-primary",children:[e.jsx(g_,{className:"h-8 w-8"}),e.jsx("h2",{children:"趣味成就"})]}),e.jsxs("div",{className:"grid gap-4 md:grid-cols-3",children:[e.jsxs(Ce,{className:"col-span-1 md:col-span-2",children:[e.jsxs(De,{children:[e.jsx(Le,{children:'新学到的"黑话"'}),e.jsxs(ws,{children:["今年我学会了 ",n.achievements.new_jargon_count," 个新词"]})]}),e.jsx(Ae,{children:e.jsx("div",{className:"flex flex-wrap gap-3",children:n.achievements.sample_jargons.map(g=>e.jsxs("div",{className:"group relative rounded-lg border bg-card p-3 shadow-sm transition-all hover:shadow-md",children:[e.jsx("div",{className:"font-bold text-primary",children:g.content}),e.jsx("div",{className:"text-xs text-muted-foreground mt-1 line-clamp-2 max-w-[200px]",children:g.meaning||"暂无解释"})]},g.content))})})]}),e.jsx(Ce,{className:"flex flex-col justify-center items-center bg-primary text-primary-foreground",children:e.jsxs(Ae,{className:"flex flex-col items-center justify-center p-6 text-center",children:[e.jsx(Ea,{className:"h-12 w-12 mb-4 opacity-80"}),e.jsx("div",{className:"text-4xl font-bold mb-2",children:n.achievements.total_messages.toLocaleString()}),e.jsx("div",{className:"text-sm opacity-80",children:"年度总消息数"}),e.jsxs("div",{className:"mt-4 text-xs opacity-60",children:["其中回复了 ",n.achievements.total_replies.toLocaleString()," 次"]})]})})]})]}),e.jsxs("footer",{className:"mt-12 text-center text-muted-foreground",children:[e.jsx("p",{children:"MaiBot 2025 Annual Report"}),e.jsx("p",{className:"text-sm",children:"Generated with ❤️ by MaiBot Team"})]})]})})}):null}function Sa({title:l,value:n,description:i,icon:c}){return e.jsxs(Ce,{children:[e.jsxs(De,{className:"flex flex-row items-center justify-between space-y-0 pb-2",children:[e.jsx(Le,{className:"text-sm font-medium",children:l}),e.jsx("div",{className:"text-muted-foreground",children:c})]}),e.jsxs(Ae,{children:[e.jsx("div",{className:"text-2xl font-bold",children:n}),e.jsx("p",{className:"text-xs text-muted-foreground",children:i})]})]})}function bC(){return e.jsxs("div",{className:"container mx-auto space-y-8 p-8",children:[e.jsx(js,{className:"h-64 w-full rounded-3xl"}),e.jsx("div",{className:"grid gap-4 md:grid-cols-4",children:[...Array(4)].map((l,n)=>e.jsx(js,{className:"h-32 w-full"},n))}),e.jsx(js,{className:"h-96 w-full"})]})}var id="DropdownMenu",[yC]=Ko(id,[ij]),oa=ij(),[wC,cN]=yC(id),oN=l=>{const{__scopeDropdownMenu:n,children:i,dir:c,open:u,defaultOpen:x,onOpenChange:h,modal:f=!0}=l,p=oa(n),g=d.useRef(null),[N,v]=qo({prop:u,defaultProp:x??!1,onChange:h,caller:id});return e.jsx(wC,{scope:n,triggerId:Lm(),triggerRef:g,contentId:Lm(),open:N,onOpenChange:v,onOpenToggle:d.useCallback(()=>v(y=>!y),[v]),modal:f,children:e.jsx(cw,{...p,open:N,onOpenChange:v,dir:c,modal:f,children:i})})};oN.displayName=id;var dN="DropdownMenuTrigger",uN=d.forwardRef((l,n)=>{const{__scopeDropdownMenu:i,disabled:c=!1,...u}=l,x=cN(dN,i),h=oa(i);return e.jsx(ow,{asChild:!0,...h,children:e.jsx(Qn.button,{type:"button",id:x.triggerId,"aria-haspopup":"menu","aria-expanded":x.open,"aria-controls":x.open?x.contentId:void 0,"data-state":x.open?"open":"closed","data-disabled":c?"":void 0,disabled:c,...u,ref:Uw(n,x.triggerRef),onPointerDown:hn(l.onPointerDown,f=>{!c&&f.button===0&&f.ctrlKey===!1&&(x.onOpenToggle(),x.open||f.preventDefault())}),onKeyDown:hn(l.onKeyDown,f=>{c||(["Enter"," "].includes(f.key)&&x.onOpenToggle(),f.key==="ArrowDown"&&x.onOpenChange(!0),["Enter"," ","ArrowDown"].includes(f.key)&&f.preventDefault())})})})});uN.displayName=dN;var _C="DropdownMenuPortal",mN=l=>{const{__scopeDropdownMenu:n,...i}=l,c=oa(n);return e.jsx(ew,{...c,...i})};mN.displayName=_C;var xN="DropdownMenuContent",hN=d.forwardRef((l,n)=>{const{__scopeDropdownMenu:i,...c}=l,u=cN(xN,i),x=oa(i),h=d.useRef(!1);return e.jsx(sw,{id:u.contentId,"aria-labelledby":u.triggerId,...x,...c,ref:n,onCloseAutoFocus:hn(l.onCloseAutoFocus,f=>{h.current||u.triggerRef.current?.focus(),h.current=!1,f.preventDefault()}),onInteractOutside:hn(l.onInteractOutside,f=>{const p=f.detail.originalEvent,g=p.button===0&&p.ctrlKey===!0,N=p.button===2||g;(!u.modal||N)&&(h.current=!0)}),style:{...l.style,"--radix-dropdown-menu-content-transform-origin":"var(--radix-popper-transform-origin)","--radix-dropdown-menu-content-available-width":"var(--radix-popper-available-width)","--radix-dropdown-menu-content-available-height":"var(--radix-popper-available-height)","--radix-dropdown-menu-trigger-width":"var(--radix-popper-anchor-width)","--radix-dropdown-menu-trigger-height":"var(--radix-popper-anchor-height)"}})});hN.displayName=xN;var SC="DropdownMenuGroup",kC=d.forwardRef((l,n)=>{const{__scopeDropdownMenu:i,...c}=l,u=oa(i);return e.jsx(dw,{...u,...c,ref:n})});kC.displayName=SC;var CC="DropdownMenuLabel",fN=d.forwardRef((l,n)=>{const{__scopeDropdownMenu:i,...c}=l,u=oa(i);return e.jsx(rw,{...u,...c,ref:n})});fN.displayName=CC;var TC="DropdownMenuItem",pN=d.forwardRef((l,n)=>{const{__scopeDropdownMenu:i,...c}=l,u=oa(i);return e.jsx(tw,{...u,...c,ref:n})});pN.displayName=TC;var EC="DropdownMenuCheckboxItem",gN=d.forwardRef((l,n)=>{const{__scopeDropdownMenu:i,...c}=l,u=oa(i);return e.jsx(aw,{...u,...c,ref:n})});gN.displayName=EC;var MC="DropdownMenuRadioGroup",zC=d.forwardRef((l,n)=>{const{__scopeDropdownMenu:i,...c}=l,u=oa(i);return e.jsx(uw,{...u,...c,ref:n})});zC.displayName=MC;var AC="DropdownMenuRadioItem",jN=d.forwardRef((l,n)=>{const{__scopeDropdownMenu:i,...c}=l,u=oa(i);return e.jsx(nw,{...u,...c,ref:n})});jN.displayName=AC;var OC="DropdownMenuItemIndicator",vN=d.forwardRef((l,n)=>{const{__scopeDropdownMenu:i,...c}=l,u=oa(i);return e.jsx(lw,{...u,...c,ref:n})});vN.displayName=OC;var DC="DropdownMenuSeparator",NN=d.forwardRef((l,n)=>{const{__scopeDropdownMenu:i,...c}=l,u=oa(i);return e.jsx(iw,{...u,...c,ref:n})});NN.displayName=DC;var RC="DropdownMenuArrow",LC=d.forwardRef((l,n)=>{const{__scopeDropdownMenu:i,...c}=l,u=oa(i);return e.jsx(mw,{...u,...c,ref:n})});LC.displayName=RC;var UC="DropdownMenuSubTrigger",bN=d.forwardRef((l,n)=>{const{__scopeDropdownMenu:i,...c}=l,u=oa(i);return e.jsx(Z0,{...u,...c,ref:n})});bN.displayName=UC;var $C="DropdownMenuSubContent",yN=d.forwardRef((l,n)=>{const{__scopeDropdownMenu:i,...c}=l,u=oa(i);return e.jsx(W0,{...u,...c,ref:n,style:{...l.style,"--radix-dropdown-menu-content-transform-origin":"var(--radix-popper-transform-origin)","--radix-dropdown-menu-content-available-width":"var(--radix-popper-available-width)","--radix-dropdown-menu-content-available-height":"var(--radix-popper-available-height)","--radix-dropdown-menu-trigger-width":"var(--radix-popper-anchor-width)","--radix-dropdown-menu-trigger-height":"var(--radix-popper-anchor-height)"}})});yN.displayName=$C;var BC=oN,IC=uN,PC=mN,wN=hN,_N=fN,SN=pN,kN=gN,CN=jN,TN=vN,EN=NN,MN=bN,zN=yN;const HC=BC,FC=IC,GC=d.forwardRef(({className:l,inset:n,children:i,...c},u)=>e.jsxs(MN,{ref:u,className:I("flex cursor-default select-none items-center rounded-sm px-2 py-1.5 text-sm outline-none focus:bg-accent data-[state=open]:bg-accent",n&&"pl-8",l),...c,children:[i,e.jsx(Zt,{className:"ml-auto h-4 w-4"})]}));GC.displayName=MN.displayName;const VC=d.forwardRef(({className:l,...n},i)=>e.jsx(zN,{ref:i,className:I("z-50 min-w-[8rem] overflow-hidden rounded-md border bg-popover p-1 text-popover-foreground shadow-lg data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2",l),...n}));VC.displayName=zN.displayName;const AN=d.forwardRef(({className:l,sideOffset:n=4,...i},c)=>e.jsx(PC,{children:e.jsx(wN,{ref:c,sideOffset:n,className:I("z-50 min-w-[8rem] overflow-hidden rounded-md border bg-popover p-1 text-popover-foreground shadow-md data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2",l),...i})}));AN.displayName=wN.displayName;const ON=d.forwardRef(({className:l,inset:n,...i},c)=>e.jsx(SN,{ref:c,className:I("relative flex cursor-default select-none items-center rounded-sm px-2 py-1.5 text-sm outline-none transition-colors focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50",n&&"pl-8",l),...i}));ON.displayName=SN.displayName;const qC=d.forwardRef(({className:l,children:n,checked:i,...c},u)=>e.jsxs(kN,{ref:u,className:I("relative flex cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none transition-colors focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50",l),checked:i,...c,children:[e.jsx("span",{className:"absolute left-2 flex h-3.5 w-3.5 items-center justify-center",children:e.jsx(TN,{children:e.jsx(kt,{className:"h-4 w-4"})})}),n]}));qC.displayName=kN.displayName;const KC=d.forwardRef(({className:l,children:n,...i},c)=>e.jsxs(CN,{ref:c,className:I("relative flex cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none transition-colors focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50",l),...i,children:[e.jsx("span",{className:"absolute left-2 flex h-3.5 w-3.5 items-center justify-center",children:e.jsx(TN,{children:e.jsx(Lo,{className:"h-2 w-2 fill-current"})})}),n]}));KC.displayName=CN.displayName;const QC=d.forwardRef(({className:l,inset:n,...i},c)=>e.jsx(_N,{ref:c,className:I("px-2 py-1.5 text-sm font-semibold",n&&"pl-8",l),...i}));QC.displayName=_N.displayName;const YC=d.forwardRef(({className:l,...n},i)=>e.jsx(EN,{ref:i,className:I("-mx-1 my-1 h-px bg-muted",l),...n}));YC.displayName=EN.displayName;const DN=({className:l,...n})=>e.jsx("nav",{role:"navigation","aria-label":"pagination",className:I("mx-auto flex w-full justify-center",l),...n});DN.displayName="Pagination";const RN=d.forwardRef(({className:l,...n},i)=>e.jsx("ul",{ref:i,className:I("flex flex-row items-center gap-1",l),...n}));RN.displayName="PaginationContent";const Do=d.forwardRef(({className:l,...n},i)=>e.jsx("li",{ref:i,className:I("",l),...n}));Do.displayName="PaginationItem";const cd=({className:l,isActive:n,size:i="icon",...c})=>e.jsx("a",{"aria-current":n?"page":void 0,className:I(qr({variant:n?"outline":"ghost",size:i}),l),...c});cd.displayName="PaginationLink";const LN=({className:l,...n})=>e.jsxs(cd,{"aria-label":"Go to previous page",size:"default",className:I("gap-1 pl-2.5",l),...n,children:[e.jsx(za,{className:"h-4 w-4"}),e.jsx("span",{children:"上一页"})]});LN.displayName="PaginationPrevious";const UN=({className:l,...n})=>e.jsxs(cd,{"aria-label":"Go to next page",size:"default",className:I("gap-1 pr-2.5",l),...n,children:[e.jsx("span",{children:"下一页"}),e.jsx(Zt,{className:"h-4 w-4"})]});UN.displayName="PaginationNext";const Rm=[{value:"created_at",label:"最新发布",icon:na},{value:"downloads",label:"下载最多",icon:sa},{value:"likes",label:"最受欢迎",icon:Vr}];function JC(){const l=ca(),[n,i]=d.useState([]),[c,u]=d.useState(!0),[x,h]=d.useState(""),[f,p]=d.useState("downloads"),[g,N]=d.useState(1),[v,y]=d.useState(1),[w,b]=d.useState(0),[R,D]=d.useState(new Set),[S,P]=d.useState(new Set),M=Sv(),T=d.useCallback(async()=>{u(!0);try{const U=await dS({status:"approved",page:g,page_size:12,search:x||void 0,sort_by:f,sort_order:"desc"});i(U.packs),y(U.total_pages),b(U.total);const ue=new Set;for(const xe of U.packs)await _v(xe.id,M)&&ue.add(xe.id);D(ue)}catch(U){console.error("加载 Pack 列表失败:",U),Qt({title:"加载 Pack 列表失败",variant:"destructive"})}finally{u(!1)}},[g,x,f,M]);d.useEffect(()=>{T()},[T]);const A=U=>{U.preventDefault(),N(1),T()},F=async U=>{if(!S.has(U)){P(ue=>new Set(ue).add(U));try{const ue=await wv(U,M);D(xe=>{const he=new Set(xe);return ue.liked?he.add(U):he.delete(U),he}),i(xe=>xe.map(he=>he.id===U?{...he,likes:ue.likes}:he))}catch(ue){console.error("点赞失败:",ue),Qt({title:"点赞失败",variant:"destructive"})}finally{P(ue=>{const xe=new Set(ue);return xe.delete(U),xe})}}},L=U=>{l({to:"/config/pack-market/$packId",params:{packId:U}})},J=Rm.find(U=>U.value===f)||Rm[0];return e.jsxs("div",{className:"h-[calc(100vh-4rem)] flex flex-col p-4 sm:p-6",children:[e.jsx("div",{className:"mb-4 sm:mb-6",children:e.jsxs("div",{className:"flex flex-col sm:flex-row sm:items-center justify-between gap-4",children:[e.jsxs("div",{children:[e.jsxs("h1",{className:"text-2xl sm:text-3xl font-bold flex items-center gap-2",children:[e.jsx(ra,{className:"h-8 w-8",strokeWidth:2}),"配置模板市场"]}),e.jsx("p",{className:"text-muted-foreground mt-1 text-sm sm:text-base",children:"浏览和应用社区分享的模型配置模板,快速配置你的 MaiBot"})]}),e.jsxs(_,{variant:"outline",onClick:T,disabled:c,className:"gap-2",children:[e.jsx(dt,{className:`h-4 w-4 ${c?"animate-spin":""}`}),"刷新"]})]})}),e.jsx(Ye,{className:"flex-1",children:e.jsxs("div",{className:"space-y-4",children:[e.jsxs("div",{className:"flex gap-4 flex-wrap",children:[e.jsx("form",{onSubmit:A,className:"flex-1 min-w-[200px] max-w-md",children:e.jsxs("div",{className:"relative",children:[e.jsx(Ct,{className:"absolute left-3 top-1/2 -translate-y-1/2 w-4 h-4 text-muted-foreground"}),e.jsx(le,{placeholder:"搜索模板名称、描述...",value:x,onChange:U=>h(U.target.value),className:"pl-10"})]})}),e.jsxs(HC,{children:[e.jsx(FC,{asChild:!0,children:e.jsxs(_,{variant:"outline",className:"min-w-[140px] gap-2",children:[e.jsx(j_,{className:"w-4 h-4"}),J.label,e.jsx(Ma,{className:"w-4 h-4 ml-auto"})]})}),e.jsx(AN,{align:"end",children:Rm.map(U=>e.jsxs(ON,{onClick:()=>{p(U.value),N(1)},children:[e.jsx(U.icon,{className:"w-4 h-4 mr-2"}),U.label]},U.value))})]})]}),e.jsxs("div",{className:"text-sm text-muted-foreground",children:["共找到 ",e.jsx("span",{className:"font-medium text-foreground",children:w})," 个模板"]}),c?e.jsx("div",{className:"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4",children:Array.from({length:6}).map((U,ue)=>e.jsxs(Ce,{children:[e.jsxs(De,{children:[e.jsx(js,{className:"h-6 w-3/4"}),e.jsx(js,{className:"h-4 w-full mt-2"})]}),e.jsx(Ae,{children:e.jsx(js,{className:"h-20 w-full"})}),e.jsx(Zo,{children:e.jsx(js,{className:"h-9 w-full"})})]},ue))}):n.length===0?e.jsx(Ce,{className:"py-12",children:e.jsxs(Ae,{className:"text-center text-muted-foreground",children:[e.jsx(ra,{className:"w-12 h-12 mx-auto mb-4 opacity-50"}),e.jsx("p",{className:"text-lg font-medium",children:"暂无模板"}),e.jsx("p",{className:"mt-1",children:"还没有人分享配置模板,快来分享第一个吧!"})]})}):e.jsx("div",{className:"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4",children:n.map(U=>e.jsx(XC,{pack:U,liked:R.has(U.id),liking:S.has(U.id),onLike:()=>F(U.id),onView:()=>L(U.id)},U.id))}),v>1&&e.jsx(DN,{children:e.jsxs(RN,{children:[e.jsx(Do,{children:e.jsx(LN,{onClick:()=>N(U=>Math.max(1,U-1)),className:g===1?"pointer-events-none opacity-50":"cursor-pointer"})}),Array.from({length:v},(U,ue)=>ue+1).filter(U=>U===1||U===v||Math.abs(U-g)<=1).map((U,ue,xe)=>{const he=ue>0&&U-xe[ue-1]>1;return e.jsxs(Do,{children:[he&&e.jsx("span",{className:"px-2",children:"..."}),e.jsx(cd,{onClick:()=>N(U),isActive:U===g,className:"cursor-pointer",children:U})]},U)}),e.jsx(Do,{children:e.jsx(UN,{onClick:()=>N(U=>Math.min(v,U+1)),className:g===v?"pointer-events-none opacity-50":"cursor-pointer"})})]})})]})})]})}function XC({pack:l,liked:n,liking:i,onLike:c,onView:u}){const x=h=>new Date(h).toLocaleDateString("zh-CN",{year:"numeric",month:"short",day:"numeric"});return e.jsxs(Ce,{className:"flex flex-col hover:shadow-md transition-shadow",children:[e.jsxs(De,{className:"pb-3",children:[e.jsxs("div",{className:"flex items-start justify-between",children:[e.jsx(Le,{className:"text-lg line-clamp-1",children:l.name}),e.jsxs(Se,{variant:"secondary",className:"text-xs",children:["v",l.version]})]}),e.jsx(ws,{className:"line-clamp-2 min-h-[40px]",children:l.description})]}),e.jsxs(Ae,{className:"flex-1 space-y-3",children:[e.jsxs("div",{className:"flex items-center justify-between text-sm text-muted-foreground",children:[e.jsxs("span",{className:"flex items-center gap-1",children:[e.jsx(fn,{className:"w-3.5 h-3.5"}),l.author]}),e.jsxs("span",{className:"flex items-center gap-1",children:[e.jsx(na,{className:"w-3.5 h-3.5"}),x(l.created_at)]})]}),e.jsxs("div",{className:"flex gap-4 text-sm",children:[e.jsxs("span",{className:"flex items-center gap-1 text-muted-foreground",title:"提供商数量",children:[e.jsx(Dl,{className:"w-3.5 h-3.5"}),l.provider_count]}),e.jsxs("span",{className:"flex items-center gap-1 text-muted-foreground",title:"模型数量",children:[e.jsx(Gn,{className:"w-3.5 h-3.5"}),l.model_count]}),e.jsxs("span",{className:"flex items-center gap-1 text-muted-foreground",title:"任务配置数",children:[e.jsx(Vn,{className:"w-3.5 h-3.5"}),l.task_count]})]}),l.tags&&l.tags.length>0&&e.jsxs("div",{className:"flex flex-wrap gap-1",children:[l.tags.slice(0,3).map(h=>e.jsxs(Se,{variant:"outline",className:"text-xs",children:[e.jsx(Xo,{className:"w-2.5 h-2.5 mr-1"}),h]},h)),l.tags.length>3&&e.jsxs(Se,{variant:"outline",className:"text-xs",children:["+",l.tags.length-3]})]})]}),e.jsx(Zo,{className:"pt-3 border-t",children:e.jsxs("div",{className:"flex items-center justify-between w-full",children:[e.jsxs("div",{className:"flex items-center gap-3 text-sm text-muted-foreground",children:[e.jsxs("span",{className:"flex items-center gap-1",children:[e.jsx(sa,{className:"w-4 h-4"}),l.downloads]}),e.jsxs("button",{onClick:h=>{h.stopPropagation(),c()},disabled:i,className:`flex items-center gap-1 transition-colors ${n?"text-red-500":"hover:text-red-500"} ${i?"opacity-50":""}`,children:[e.jsx(Vr,{className:`w-4 h-4 ${n?"fill-current":""}`}),l.likes]})]}),e.jsx(_,{size:"sm",onClick:u,children:"查看详情"})]})})]})}var sl="Accordion",ZC=["Home","End","ArrowDown","ArrowUp","ArrowLeft","ArrowRight"],[xx,WC,e3]=$w(sl),[od]=Ko(sl,[e3,cj]),hx=cj(),$N=As.forwardRef((l,n)=>{const{type:i,...c}=l,u=c,x=c;return e.jsx(xx.Provider,{scope:l.__scopeAccordion,children:i==="multiple"?e.jsx(l3,{...x,ref:n}):e.jsx(a3,{...u,ref:n})})});$N.displayName=sl;var[BN,s3]=od(sl),[IN,t3]=od(sl,{collapsible:!1}),a3=As.forwardRef((l,n)=>{const{value:i,defaultValue:c,onValueChange:u=()=>{},collapsible:x=!1,...h}=l,[f,p]=qo({prop:i,defaultProp:c??"",onChange:u,caller:sl});return e.jsx(BN,{scope:l.__scopeAccordion,value:As.useMemo(()=>f?[f]:[],[f]),onItemOpen:p,onItemClose:As.useCallback(()=>x&&p(""),[x,p]),children:e.jsx(IN,{scope:l.__scopeAccordion,collapsible:x,children:e.jsx(PN,{...h,ref:n})})})}),l3=As.forwardRef((l,n)=>{const{value:i,defaultValue:c,onValueChange:u=()=>{},...x}=l,[h,f]=qo({prop:i,defaultProp:c??[],onChange:u,caller:sl}),p=As.useCallback(N=>f((v=[])=>[...v,N]),[f]),g=As.useCallback(N=>f((v=[])=>v.filter(y=>y!==N)),[f]);return e.jsx(BN,{scope:l.__scopeAccordion,value:h,onItemOpen:p,onItemClose:g,children:e.jsx(IN,{scope:l.__scopeAccordion,collapsible:!0,children:e.jsx(PN,{...x,ref:n})})})}),[n3,dd]=od(sl),PN=As.forwardRef((l,n)=>{const{__scopeAccordion:i,disabled:c,dir:u,orientation:x="vertical",...h}=l,f=As.useRef(null),p=Qo(f,n),g=WC(i),v=_j(u)==="ltr",y=hn(l.onKeyDown,w=>{if(!ZC.includes(w.key))return;const b=w.target,R=g().filter(J=>!J.ref.current?.disabled),D=R.findIndex(J=>J.ref.current===b),S=R.length;if(D===-1)return;w.preventDefault();let P=D;const M=0,T=S-1,A=()=>{P=D+1,P>T&&(P=M)},F=()=>{P=D-1,P{const{__scopeAccordion:i,value:c,...u}=l,x=dd(Vo,i),h=s3(Vo,i),f=hx(i),p=Lm(),g=c&&h.value.includes(c)||!1,N=x.disabled||l.disabled;return e.jsx(r3,{scope:i,open:g,disabled:N,triggerId:p,children:e.jsx(tj,{"data-orientation":x.orientation,"data-state":QN(g),...f,...u,ref:n,disabled:N,open:g,onOpenChange:v=>{v?h.onItemOpen(c):h.onItemClose(c)}})})});HN.displayName=Vo;var FN="AccordionHeader",GN=As.forwardRef((l,n)=>{const{__scopeAccordion:i,...c}=l,u=dd(sl,i),x=fx(FN,i);return e.jsx(Qn.h3,{"data-orientation":u.orientation,"data-state":QN(x.open),"data-disabled":x.disabled?"":void 0,...c,ref:n})});GN.displayName=FN;var Fm="AccordionTrigger",VN=As.forwardRef((l,n)=>{const{__scopeAccordion:i,...c}=l,u=dd(sl,i),x=fx(Fm,i),h=t3(Fm,i),f=hx(i);return e.jsx(xx.ItemSlot,{scope:i,children:e.jsx(xw,{"aria-disabled":x.open&&!h.collapsible||void 0,"data-orientation":u.orientation,id:x.triggerId,...f,...c,ref:n})})});VN.displayName=Fm;var qN="AccordionContent",KN=As.forwardRef((l,n)=>{const{__scopeAccordion:i,...c}=l,u=dd(sl,i),x=fx(qN,i),h=hx(i);return e.jsx(hw,{role:"region","aria-labelledby":x.triggerId,"data-orientation":u.orientation,...h,...c,ref:n,style:{"--radix-accordion-content-height":"var(--radix-collapsible-content-height)","--radix-accordion-content-width":"var(--radix-collapsible-content-width)",...l.style}})});KN.displayName=qN;function QN(l){return l?"open":"closed"}var i3=$N,c3=HN,o3=GN,YN=VN,JN=KN;const d3=i3,XN=d.forwardRef(({className:l,...n},i)=>e.jsx(c3,{ref:i,className:I("border-b",l),...n}));XN.displayName="AccordionItem";const ZN=d.forwardRef(({className:l,children:n,...i},c)=>e.jsx(o3,{className:"flex",children:e.jsxs(YN,{ref:c,className:I("flex flex-1 items-center justify-between py-4 font-medium transition-all hover:underline [&[data-state=open]>svg]:rotate-180",l),...i,children:[n,e.jsx(Ma,{className:"h-4 w-4 shrink-0 transition-transform duration-200"})]})}));ZN.displayName=YN.displayName;const WN=d.forwardRef(({className:l,children:n,...i},c)=>e.jsx(JN,{ref:c,className:"overflow-hidden text-sm transition-all data-[state=closed]:animate-accordion-up data-[state=open]:animate-accordion-down",...i,children:e.jsx("div",{className:I("pb-4 pt-0",l),children:n})}));WN.displayName=JN.displayName;const u3={utils:"通用工具",utils_small:"轻量工具",tool_use:"工具调用",replyer:"回复生成",planner:"规划推理",vlm:"视觉模型",voice:"语音处理",embedding:"向量嵌入",lpmm_entity_extract:"实体提取",lpmm_rdf_build:"RDF构建",lpmm_qa:"问答模型"};function m3(){const{packId:l}=lb.useParams(),n=ca(),[i,c]=d.useState(null),[u,x]=d.useState(!0),[h,f]=d.useState(!1),[p,g]=d.useState(!1),[N,v]=d.useState(!1),[y,w]=d.useState(1),[b,R]=d.useState(null),[D,S]=d.useState(!1),[P,M]=d.useState(!1),[T,A]=d.useState({apply_providers:!0,apply_models:!0,apply_task_config:!0,task_mode:"append",selected_providers:void 0,selected_models:void 0,selected_tasks:void 0}),[F,L]=d.useState({}),[J,U]=d.useState({}),ue=Sv(),xe=d.useCallback(async()=>{if(l){x(!0);try{const z=await uS(l);c(z);const V=await _v(l,ue);f(V)}catch(z){console.error("加载 Pack 失败:",z),Qt({title:"加载模板失败",variant:"destructive"})}finally{x(!1)}}},[l,ue]);d.useEffect(()=>{xe()},[xe]);const he=async()=>{if(!(!l||p)){g(!0);try{const z=await wv(l,ue);f(z.liked),i&&c({...i,likes:z.likes})}catch(z){console.error("点赞失败:",z),Qt({title:"点赞失败",variant:"destructive"})}finally{g(!1)}}},ne=async()=>{if(i){v(!0),w(1),S(!0);try{const z=await hS(i);R(z);const V={};for(const oe of z.existing_providers)V[oe.pack_provider.name]=oe.local_providers[0].name;L(V);const B={};for(const oe of z.new_providers)B[oe.name]="";U(B)}catch(z){console.error("检测冲突失败:",z),Qt({title:"检测配置冲突失败",variant:"destructive"}),v(!1)}finally{S(!1)}}},ve=async()=>{if(i){if(T.apply_providers&&b){for(const z of b.new_providers)if(!J[z.name]){Qt({title:`请填写提供商 "${z.name}" 的 API Key`,variant:"destructive"});return}}M(!0);try{await fS(i,T,F,J),await xS(i.id,ue),c({...i,downloads:i.downloads+1}),Qt({title:"配置模板应用成功!"}),v(!1)}catch(z){console.error("应用 Pack 失败:",z),Qt({title:z instanceof Error?z.message:"应用配置失败",variant:"destructive"})}finally{M(!1)}}},je=z=>new Date(z).toLocaleDateString("zh-CN",{year:"numeric",month:"long",day:"numeric"});return u?e.jsx(h3,{}):i?e.jsx("div",{className:"h-[calc(100vh-4rem)] flex flex-col p-4 sm:p-6",children:e.jsx(Ye,{className:"flex-1",children:e.jsxs("div",{className:"space-y-4 sm:space-y-6",children:[e.jsxs(_,{variant:"ghost",size:"sm",onClick:()=>n({to:"/config/pack-market"}),className:"gap-2",children:[e.jsx(Ca,{className:"w-4 h-4"}),"返回市场"]}),e.jsxs("div",{className:"flex flex-col md:flex-row gap-6",children:[e.jsxs("div",{className:"flex-1 space-y-4",children:[e.jsxs("div",{className:"flex items-start gap-3",children:[e.jsx(ra,{className:"w-10 h-10 text-primary mt-1"}),e.jsxs("div",{children:[e.jsxs("h1",{className:"text-2xl font-bold flex items-center gap-2",children:[i.name,e.jsxs(Se,{variant:"secondary",children:["v",i.version]})]}),e.jsx("p",{className:"text-muted-foreground mt-1",children:i.description})]})]}),e.jsxs("div",{className:"flex flex-wrap gap-4 text-sm text-muted-foreground",children:[e.jsxs("span",{className:"flex items-center gap-1",children:[e.jsx(fn,{className:"w-4 h-4"}),i.author]}),e.jsxs("span",{className:"flex items-center gap-1",children:[e.jsx(na,{className:"w-4 h-4"}),je(i.created_at)]}),e.jsxs("span",{className:"flex items-center gap-1",children:[e.jsx(sa,{className:"w-4 h-4"}),i.downloads," 次下载"]}),e.jsxs("span",{className:"flex items-center gap-1",children:[e.jsx(Vr,{className:`w-4 h-4 ${h?"fill-red-500 text-red-500":""}`}),i.likes," 赞"]})]}),i.tags&&i.tags.length>0&&e.jsx("div",{className:"flex flex-wrap gap-2",children:i.tags.map(z=>e.jsxs(Se,{variant:"outline",children:[e.jsx(Xo,{className:"w-3 h-3 mr-1"}),z]},z))})]}),e.jsxs("div",{className:"flex flex-col gap-2 min-w-[160px]",children:[e.jsxs(_,{size:"lg",onClick:ne,children:[e.jsx(sa,{className:"w-4 h-4 mr-2"}),"应用模板"]}),e.jsxs(_,{variant:"outline",onClick:he,disabled:p,className:h?"text-red-500 border-red-200":"",children:[e.jsx(Vr,{className:`w-4 h-4 mr-2 ${h?"fill-current":""}`}),h?"已点赞":"点赞"]})]})]}),e.jsx(Yt,{}),e.jsxs("div",{className:"grid grid-cols-3 gap-4",children:[e.jsx(Ce,{children:e.jsxs(Ae,{className:"flex items-center gap-3 py-4",children:[e.jsx(Dl,{className:"w-8 h-8 text-blue-500"}),e.jsxs("div",{children:[e.jsx("p",{className:"text-2xl font-bold",children:i.providers.length}),e.jsx("p",{className:"text-sm text-muted-foreground",children:"API 提供商"})]})]})}),e.jsx(Ce,{children:e.jsxs(Ae,{className:"flex items-center gap-3 py-4",children:[e.jsx(Gn,{className:"w-8 h-8 text-green-500"}),e.jsxs("div",{children:[e.jsx("p",{className:"text-2xl font-bold",children:i.models.length}),e.jsx("p",{className:"text-sm text-muted-foreground",children:"模型配置"})]})]})}),e.jsx(Ce,{children:e.jsxs(Ae,{className:"flex items-center gap-3 py-4",children:[e.jsx(Vn,{className:"w-8 h-8 text-purple-500"}),e.jsxs("div",{children:[e.jsx("p",{className:"text-2xl font-bold",children:Object.keys(i.task_config).length}),e.jsx("p",{className:"text-sm text-muted-foreground",children:"任务配置"})]})]})})]}),e.jsxs(ta,{defaultValue:"providers",className:"space-y-4",children:[e.jsxs(Xt,{children:[e.jsxs(Je,{value:"providers",children:[e.jsx(Dl,{className:"w-4 h-4 mr-2"}),"提供商 (",i.providers.length,")"]}),e.jsxs(Je,{value:"models",children:[e.jsx(Gn,{className:"w-4 h-4 mr-2"}),"模型 (",i.models.length,")"]}),e.jsxs(Je,{value:"tasks",children:[e.jsx(Vn,{className:"w-4 h-4 mr-2"}),"任务配置 (",Object.keys(i.task_config).length,")"]})]}),e.jsx(ys,{value:"providers",children:e.jsxs(Ce,{children:[e.jsxs(De,{children:[e.jsx(Le,{children:"API 提供商"}),e.jsx(ws,{children:"模板中包含的 API 提供商配置(不含 API Key)"})]}),e.jsx(Ae,{children:e.jsxs(Rl,{children:[e.jsx(Ll,{children:e.jsxs(ut,{children:[e.jsx(Ze,{children:"名称"}),e.jsx(Ze,{children:"Base URL"}),e.jsx(Ze,{children:"类型"})]})}),e.jsx(Ul,{children:i.providers.map(z=>e.jsxs(ut,{children:[e.jsx(qe,{className:"font-medium",children:z.name}),e.jsx(qe,{className:"text-muted-foreground font-mono text-sm",children:z.base_url}),e.jsx(qe,{children:e.jsx(Se,{variant:"outline",children:z.client_type})})]},z.name))})]})})]})}),e.jsx(ys,{value:"models",children:e.jsxs(Ce,{children:[e.jsxs(De,{children:[e.jsx(Le,{children:"模型配置"}),e.jsx(ws,{children:"模板中包含的模型配置"})]}),e.jsx(Ae,{children:e.jsxs(Rl,{children:[e.jsx(Ll,{children:e.jsxs(ut,{children:[e.jsx(Ze,{children:"模型名称"}),e.jsx(Ze,{children:"标识符"}),e.jsx(Ze,{children:"提供商"}),e.jsx(Ze,{className:"text-right",children:"价格 (入/出)"})]})}),e.jsx(Ul,{children:i.models.map(z=>e.jsxs(ut,{children:[e.jsx(qe,{className:"font-medium",children:z.name}),e.jsx(qe,{className:"text-muted-foreground font-mono text-sm",children:z.model_identifier}),e.jsx(qe,{children:z.api_provider}),e.jsxs(qe,{className:"text-right text-muted-foreground",children:["¥",z.price_in," / ¥",z.price_out]})]},z.name))})]})})]})}),e.jsx(ys,{value:"tasks",children:e.jsxs(Ce,{children:[e.jsxs(De,{children:[e.jsx(Le,{children:"任务配置"}),e.jsx(ws,{children:"模板中各任务类型的模型分配"})]}),e.jsx(Ae,{children:e.jsx(d3,{type:"multiple",className:"w-full",children:Object.entries(i.task_config).map(([z,V])=>e.jsxs(XN,{value:z,children:[e.jsx(ZN,{children:e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(pn,{className:"w-4 h-4"}),u3[z]||z,e.jsxs(Se,{variant:"secondary",className:"ml-2",children:[V.model_list.length," 个模型"]})]})}),e.jsx(WN,{children:e.jsxs("div",{className:"space-y-2 pl-6",children:[e.jsx("div",{className:"text-sm text-muted-foreground",children:"分配的模型:"}),e.jsx("div",{className:"flex flex-wrap gap-2",children:V.model_list.map(B=>e.jsx(Se,{variant:"outline",children:B},B))}),V.temperature!==void 0&&e.jsxs("div",{className:"text-sm",children:["Temperature: ",e.jsx("span",{className:"font-mono",children:V.temperature})]}),V.max_tokens!==void 0&&e.jsxs("div",{className:"text-sm",children:["Max Tokens: ",e.jsx("span",{className:"font-mono",children:V.max_tokens})]})]})})]},z))})})]})})]}),e.jsx(x3,{open:N,onOpenChange:v,pack:i,step:y,setStep:w,conflicts:b,detectingConflicts:D,applying:P,options:T,setOptions:A,_providerMapping:F,_setProviderMapping:L,newProviderApiKeys:J,setNewProviderApiKeys:U,onApply:ve})]})})}):e.jsxs("div",{className:"text-center py-12",children:[e.jsx(ra,{className:"w-16 h-16 mx-auto mb-4 opacity-50"}),e.jsx("h2",{className:"text-xl font-semibold",children:"模板不存在"}),e.jsx("p",{className:"text-muted-foreground mt-2",children:"该配置模板可能已被删除或尚未通过审核"}),e.jsxs(_,{className:"mt-4",onClick:()=>n({to:"/config/pack-market"}),children:[e.jsx(Ca,{className:"w-4 h-4 mr-2"}),"返回市场"]})]})}function x3({open:l,onOpenChange:n,pack:i,step:c,setStep:u,conflicts:x,detectingConflicts:h,applying:f,options:p,setOptions:g,_providerMapping:N,_setProviderMapping:v,newProviderApiKeys:y,setNewProviderApiKeys:w,onApply:b}){return e.jsx(Is,{open:l,onOpenChange:n,children:e.jsxs(Os,{className:"max-w-2xl max-h-[80vh] overflow-y-auto",children:[e.jsxs(Ds,{children:[e.jsxs(Rs,{className:"flex items-center gap-2",children:[e.jsx(ra,{className:"w-5 h-5"}),"应用配置模板"]}),e.jsxs(Ks,{children:["步骤 ",c," / ",3,":",c===1&&"选择要应用的内容",c===2&&"配置提供商映射",c===3&&"确认并应用"]})]}),h?e.jsxs("div",{className:"py-8 text-center",children:[e.jsx(Bs,{className:"w-8 h-8 mx-auto animate-spin text-primary"}),e.jsx("p",{className:"mt-4 text-muted-foreground",children:"正在检测配置冲突..."})]}):e.jsxs(e.Fragment,{children:[c===1&&e.jsxs("div",{className:"space-y-4",children:[e.jsxs("div",{className:"space-y-3",children:[e.jsxs("div",{className:"flex items-center space-x-2",children:[e.jsx(qs,{id:"apply_providers",checked:p.apply_providers,onCheckedChange:D=>g({...p,apply_providers:D})}),e.jsxs(E,{htmlFor:"apply_providers",className:"flex items-center gap-2",children:[e.jsx(Dl,{className:"w-4 h-4"}),"应用提供商配置 (",i.providers.length," 个)"]})]}),e.jsxs("div",{className:"flex items-center space-x-2",children:[e.jsx(qs,{id:"apply_models",checked:p.apply_models,onCheckedChange:D=>g({...p,apply_models:D})}),e.jsxs(E,{htmlFor:"apply_models",className:"flex items-center gap-2",children:[e.jsx(Gn,{className:"w-4 h-4"}),"应用模型配置 (",i.models.length," 个)"]})]}),e.jsxs("div",{className:"flex items-center space-x-2",children:[e.jsx(qs,{id:"apply_task_config",checked:p.apply_task_config,onCheckedChange:D=>g({...p,apply_task_config:D})}),e.jsxs(E,{htmlFor:"apply_task_config",className:"flex items-center gap-2",children:[e.jsx(Vn,{className:"w-4 h-4"}),"应用任务配置 (",Object.keys(i.task_config).length," 个)"]})]})]}),p.apply_task_config&&e.jsxs("div",{className:"pl-6 space-y-2 border-l-2 border-muted",children:[e.jsx(E,{className:"text-sm font-medium",children:"任务配置应用模式"}),e.jsxs(mx,{value:p.task_mode,onValueChange:D=>g({...p,task_mode:D}),children:[e.jsxs("div",{className:"flex items-center space-x-2",children:[e.jsx(Go,{value:"append",id:"mode_append"}),e.jsx(E,{htmlFor:"mode_append",className:"font-normal",children:"追加模式 - 将模板中的模型添加到现有配置"})]}),e.jsxs("div",{className:"flex items-center space-x-2",children:[e.jsx(Go,{value:"replace",id:"mode_replace"}),e.jsx(E,{htmlFor:"mode_replace",className:"font-normal",children:"替换模式 - 用模板配置完全替换现有配置"})]})]})]})]}),c===2&&x&&e.jsxs("div",{className:"space-y-4",children:[p.apply_providers&&x.existing_providers.length>0&&e.jsxs("div",{className:"space-y-3",children:[e.jsxs(at,{children:[e.jsx(Ht,{className:"h-4 w-4"}),e.jsx(Hn,{children:"发现已有的提供商"}),e.jsx(lt,{children:"以下提供商的 URL 与您本地配置中的提供商匹配,将自动使用本地提供商:"})]}),e.jsx("div",{className:"space-y-2",children:x.existing_providers.map(({pack_provider:D,local_providers:S})=>e.jsxs("div",{className:"flex items-center gap-2 p-3 bg-muted rounded-lg",children:[e.jsx(kt,{className:"w-4 h-4 text-green-500 flex-shrink-0"}),e.jsx("span",{className:"font-medium flex-shrink-0",children:D.name}),e.jsx(Zt,{className:"w-4 h-4 text-muted-foreground flex-shrink-0"}),S.length===1?e.jsxs(e.Fragment,{children:[e.jsx("span",{className:"text-muted-foreground",children:S[0].name}),e.jsx(Se,{variant:"outline",className:"ml-auto",children:"URL 匹配"})]}):e.jsxs(e.Fragment,{children:[e.jsxs(Ie,{value:N[D.name]||S[0].name,onValueChange:P=>v({...N,[D.name]:P}),children:[e.jsx($e,{className:"w-[200px]",children:e.jsx(Pe,{})}),e.jsx(Be,{children:S.map(P=>e.jsx(X,{value:P.name,children:P.name},P.name))})]}),e.jsxs(Se,{variant:"outline",className:"ml-auto",children:[S.length," 个匹配"]})]})]},D.name))})]}),p.apply_providers&&x.new_providers.length>0&&e.jsxs("div",{className:"space-y-3",children:[e.jsxs(at,{variant:"destructive",children:[e.jsx(Jt,{className:"h-4 w-4"}),e.jsx(Hn,{children:"需要配置 API Key"}),e.jsx(lt,{children:"以下提供商在您的本地配置中不存在,需要填写 API Key:"})]}),e.jsx("div",{className:"space-y-4",children:x.new_providers.map(D=>e.jsxs("div",{className:"space-y-2",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(Km,{className:"w-4 h-4 text-amber-500"}),e.jsx("span",{className:"font-medium",children:D.name}),e.jsxs("span",{className:"text-xs text-muted-foreground",children:["(",D.base_url,")"]})]}),e.jsx(le,{type:"password",placeholder:`输入 ${D.name} 的 API Key`,value:y[D.name]||"",onChange:S=>w({...y,[D.name]:S.target.value})})]},D.name))})]}),(!p.apply_providers||x.existing_providers.length===0&&x.new_providers.length===0)&&e.jsxs(at,{children:[e.jsx(kt,{className:"h-4 w-4"}),e.jsx(Hn,{children:"无需配置"}),e.jsx(lt,{children:"模板中没有提供商配置,或您选择不应用提供商。"})]})]}),c===3&&e.jsxs("div",{className:"space-y-4",children:[e.jsxs(at,{children:[e.jsx(Ht,{className:"h-4 w-4"}),e.jsx(Hn,{children:"确认应用"}),e.jsx(lt,{children:"请确认以下将要应用的内容:"})]}),e.jsxs("div",{className:"space-y-2",children:[p.apply_providers&&e.jsxs("div",{className:"flex items-center gap-2 text-sm",children:[e.jsx(kt,{className:"w-4 h-4 text-green-500"}),e.jsx(Dl,{className:"w-4 h-4"}),e.jsxs("span",{children:["应用 ",i.providers.length," 个提供商配置"]})]}),p.apply_models&&e.jsxs("div",{className:"flex items-center gap-2 text-sm",children:[e.jsx(kt,{className:"w-4 h-4 text-green-500"}),e.jsx(Gn,{className:"w-4 h-4"}),e.jsxs("span",{children:["应用 ",i.models.length," 个模型配置"]})]}),p.apply_task_config&&e.jsxs("div",{className:"flex items-center gap-2 text-sm",children:[e.jsx(kt,{className:"w-4 h-4 text-green-500"}),e.jsx(Vn,{className:"w-4 h-4"}),e.jsxs("span",{children:[p.task_mode==="append"?"追加":"替换"," ",Object.keys(i.task_config).length," 个任务配置"]})]})]}),x&&x.new_providers.length>0&&e.jsxs(at,{variant:"destructive",children:[e.jsx(Jt,{className:"h-4 w-4"}),e.jsxs(lt,{children:["将添加 ",x.new_providers.length," 个新提供商,请确保已填写正确的 API Key。"]})]})]})]}),e.jsxs(st,{className:"flex justify-between",children:[e.jsx("div",{children:c>1&&!h&&e.jsx(_,{variant:"outline",onClick:()=>u(c-1),disabled:f,children:"上一步"})}),e.jsxs("div",{className:"flex gap-2",children:[e.jsx(_,{variant:"outline",onClick:()=>n(!1),disabled:f,children:"取消"}),c<3?e.jsx(_,{onClick:()=>u(c+1),disabled:h,children:"下一步"}):e.jsxs(_,{onClick:b,disabled:f,children:[f&&e.jsx(Bs,{className:"w-4 h-4 mr-2 animate-spin"}),"应用模板"]})]})]})]})})}function h3(){return e.jsx("div",{className:"h-[calc(100vh-4rem)] flex flex-col p-4 sm:p-6",children:e.jsx(Ye,{className:"flex-1",children:e.jsxs("div",{className:"space-y-4 sm:space-y-6",children:[e.jsx(js,{className:"h-9 w-24"}),e.jsxs("div",{className:"flex flex-col md:flex-row gap-6",children:[e.jsxs("div",{className:"flex-1 space-y-4",children:[e.jsxs("div",{className:"flex items-start gap-3",children:[e.jsx(js,{className:"w-10 h-10"}),e.jsxs("div",{className:"flex-1 space-y-2",children:[e.jsx(js,{className:"h-8 w-2/3"}),e.jsx(js,{className:"h-4 w-full"})]})]}),e.jsxs("div",{className:"flex flex-wrap gap-4",children:[e.jsx(js,{className:"h-4 w-24"}),e.jsx(js,{className:"h-4 w-32"}),e.jsx(js,{className:"h-4 w-28"}),e.jsx(js,{className:"h-4 w-20"})]}),e.jsxs("div",{className:"flex flex-wrap gap-2",children:[e.jsx(js,{className:"h-6 w-20"}),e.jsx(js,{className:"h-6 w-24"}),e.jsx(js,{className:"h-6 w-16"})]})]}),e.jsxs("div",{className:"flex flex-col gap-2 min-w-[160px]",children:[e.jsx(js,{className:"h-10 w-full"}),e.jsx(js,{className:"h-10 w-full"})]})]}),e.jsx(js,{className:"h-px w-full"}),e.jsxs("div",{className:"grid grid-cols-3 gap-4",children:[e.jsx(js,{className:"h-24"}),e.jsx(js,{className:"h-24"}),e.jsx(js,{className:"h-24"})]}),e.jsxs("div",{className:"space-y-4",children:[e.jsxs("div",{className:"flex gap-2",children:[e.jsx(js,{className:"h-10 w-32"}),e.jsx(js,{className:"h-10 w-32"}),e.jsx(js,{className:"h-10 w-32"})]}),e.jsx(js,{className:"h-96 w-full"})]})]})})})}function f3(){const l=ca(),[n,i]=d.useState(!0);return d.useEffect(()=>{let c=!1;return(async()=>{try{const x=await tc();!c&&!x&&l({to:"/auth"})}catch{c||l({to:"/auth"})}finally{c||i(!1)}})(),()=>{c=!0}},[l]),{checking:n}}async function p3(){return await tc()}const g3=Kr("pointer-events-none inline-flex select-none items-center gap-1 rounded border bg-muted px-1.5 font-mono font-medium opacity-100",{variants:{size:{sm:"h-5 text-[10px]",default:"h-6 text-xs",lg:"h-7 text-sm"}},defaultVariants:{size:"default"}}),eb=d.forwardRef(({className:l,size:n,abbrTitle:i,children:c,...u},x)=>e.jsx("kbd",{className:I(g3({size:n,className:l})),ref:x,...u,children:i?e.jsx("abbr",{title:i,children:c}):c}));eb.displayName="Kbd";const j3=[{icon:Jo,title:"首页",description:"查看仪表板概览",path:"/",category:"概览"},{icon:ka,title:"麦麦主程序配置",description:"配置麦麦的核心设置",path:"/config/bot",category:"配置"},{icon:Dl,title:"麦麦模型提供商配置",description:"配置模型提供商",path:"/config/modelProvider",category:"配置"},{icon:Fj,title:"麦麦模型配置",description:"配置模型参数",path:"/config/model",category:"配置"},{icon:Yo,title:"表情包管理",description:"管理麦麦的表情包",path:"/resource/emoji",category:"资源"},{icon:Ea,title:"表达方式管理",description:"管理麦麦的表达方式",path:"/resource/expression",category:"资源"},{icon:Gj,title:"人物信息管理",description:"管理人物信息",path:"/resource/person",category:"资源"},{icon:Gr,title:"黑话管理",description:"管理麦麦学习到的黑话和俚语",path:"/resource/jargon",category:"资源"},{icon:v_,title:"统计信息",description:"查看使用统计",path:"/statistics",category:"监控"},{icon:ra,title:"插件市场",description:"浏览和安装插件",path:"/plugins",category:"扩展"},{icon:Qm,title:"日志查看器",description:"查看系统日志",path:"/logs",category:"监控"},{icon:pn,title:"系统设置",description:"配置系统参数",path:"/settings",category:"系统"}];function v3({open:l,onOpenChange:n}){const[i,c]=d.useState(""),[u,x]=d.useState(0),h=ca(),f=j3.filter(N=>N.title.toLowerCase().includes(i.toLowerCase())||N.description.toLowerCase().includes(i.toLowerCase())||N.category.toLowerCase().includes(i.toLowerCase())),p=d.useCallback(N=>{h({to:N}),n(!1),c(""),x(0)},[h,n]),g=d.useCallback(N=>{N.key==="ArrowDown"?(N.preventDefault(),x(v=>(v+1)%f.length)):N.key==="ArrowUp"?(N.preventDefault(),x(v=>(v-1+f.length)%f.length)):N.key==="Enter"&&f[u]&&(N.preventDefault(),p(f[u].path))},[f,u,p]);return e.jsx(Is,{open:l,onOpenChange:n,children:e.jsxs(Os,{className:"max-w-2xl p-0 gap-0",children:[e.jsxs(Ds,{className:"px-4 pt-4 pb-0",children:[e.jsx(Rs,{className:"sr-only",children:"搜索"}),e.jsxs("div",{className:"relative",children:[e.jsx(Ct,{className:"absolute left-3 top-1/2 h-5 w-5 -translate-y-1/2 text-muted-foreground"}),e.jsx(le,{value:i,onChange:N=>{c(N.target.value),x(0)},onKeyDown:g,placeholder:"搜索页面...",className:"h-12 pl-11 text-base border-0 focus-visible:ring-0 shadow-none",autoFocus:!0})]})]}),e.jsx("div",{className:"border-t",children:e.jsx(Ye,{className:"h-[400px]",children:f.length>0?e.jsx("div",{className:"p-2",children:f.map((N,v)=>{const y=N.icon;return e.jsxs("button",{onClick:()=>p(N.path),onMouseEnter:()=>x(v),className:I("w-full flex items-center gap-3 px-3 py-2.5 rounded-md text-left transition-colors",v===u?"bg-accent text-accent-foreground":"hover:bg-accent/50"),children:[e.jsx(y,{className:"h-5 w-5 flex-shrink-0"}),e.jsxs("div",{className:"flex-1 min-w-0",children:[e.jsx("div",{className:"font-medium text-sm",children:N.title}),e.jsx("div",{className:"text-xs text-muted-foreground truncate",children:N.description})]}),e.jsx("div",{className:"text-xs text-muted-foreground px-2 py-1 bg-muted rounded",children:N.category})]},N.path)})}):e.jsxs("div",{className:"flex flex-col items-center justify-center py-12 text-center",children:[e.jsx(Ct,{className:"h-12 w-12 text-muted-foreground/50 mb-4"}),e.jsx("p",{className:"text-sm text-muted-foreground",children:i?"未找到匹配的页面":"输入关键词开始搜索"})]})})}),e.jsx("div",{className:"border-t px-4 py-3 flex items-center justify-between text-xs text-muted-foreground",children:e.jsxs("div",{className:"flex items-center gap-4",children:[e.jsxs("span",{className:"flex items-center gap-1",children:[e.jsx("kbd",{className:"px-1.5 py-0.5 bg-muted rounded border",children:"↑"}),e.jsx("kbd",{className:"px-1.5 py-0.5 bg-muted rounded border",children:"↓"}),"导航"]}),e.jsxs("span",{className:"flex items-center gap-1",children:[e.jsx("kbd",{className:"px-1.5 py-0.5 bg-muted rounded border",children:"Enter"}),"选择"]}),e.jsxs("span",{className:"flex items-center gap-1",children:[e.jsx("kbd",{className:"px-1.5 py-0.5 bg-muted rounded border",children:"Esc"}),"关闭"]})]})})]})})}function N3(){const l=window.location.protocol==="http:",n=window.location.hostname.toLowerCase(),i=n==="localhost"||n==="127.0.0.1"||n==="::1",c=sessionStorage.getItem("http-warning-dismissed")==="true",[u,x]=d.useState(l&&!i&&!c),[h,f]=d.useState(!1),p=()=>{f(!0),x(!1),sessionStorage.setItem("http-warning-dismissed","true")};return!u||h?null:e.jsx("div",{className:"relative bg-amber-500/10 border-b border-amber-500/20 backdrop-blur-sm",children:e.jsx("div",{className:"container mx-auto px-4 py-3",children:e.jsxs("div",{className:"flex items-center justify-between gap-4",children:[e.jsxs("div",{className:"flex items-center gap-3 flex-1",children:[e.jsx(Jt,{className:"h-5 w-5 text-amber-600 dark:text-amber-500 flex-shrink-0"}),e.jsxs("div",{className:"flex-1",children:[e.jsxs("p",{className:"text-sm font-medium text-amber-900 dark:text-amber-100",children:[e.jsx("span",{className:"font-semibold",children:"安全警告:"}),"您正在使用 ",e.jsx("strong",{children:"HTTP"})," 访问 MaiBot WebUI"]}),e.jsx("p",{className:"text-xs text-amber-800 dark:text-amber-200 mt-1",children:"如果这是公网服务器,您的数据(包括 Token、聊天记录等)可能在传输过程中被窃取。强烈建议使用 HTTPS 访问或仅在本地网络使用。"})]})]}),e.jsx(_,{variant:"ghost",size:"icon",onClick:p,className:"h-8 w-8 text-amber-700 hover:text-amber-900 dark:text-amber-400 dark:hover:text-amber-200 flex-shrink-0","aria-label":"关闭警告",children:e.jsx(Ta,{className:"h-4 w-4"})})]})})})}function b3(){const[l,n]=d.useState(0),[i,c]=d.useState(!1),u=d.useRef(null);d.useEffect(()=>{const g=N=>{const v=N.target;if(v.scrollHeight>v.clientHeight+100){u.current=v;const y=v.scrollTop,w=v.scrollHeight-v.clientHeight,b=w>0?y/w*100:0;n(b),c(y>300)}};return window.addEventListener("scroll",g,{capture:!0,passive:!0}),()=>window.removeEventListener("scroll",g,{capture:!0})},[]);const x=()=>{u.current?.scrollTo({top:0,behavior:"smooth"})},h=18,f=2*Math.PI*h,p=f-l/100*f;return e.jsx("div",{className:I("fixed bottom-24 right-8 z-50 transition-all duration-500 ease-in-out transform",i?"translate-x-0 opacity-100":"translate-x-32 opacity-0 pointer-events-none"),children:e.jsxs(_,{variant:"outline",size:"icon",className:I("relative h-12 w-12 rounded-full shadow-xl","bg-background/80 backdrop-blur-md border-border/50","hover:bg-accent hover:scale-110 hover:shadow-2xl hover:border-primary/50","transition-all duration-300","group"),onClick:x,"aria-label":"回到顶部",children:[e.jsxs("svg",{className:"absolute inset-0 h-full w-full -rotate-90 transform p-1",viewBox:"0 0 44 44",children:[e.jsx("circle",{className:"text-muted-foreground/10",strokeWidth:"3",stroke:"currentColor",fill:"transparent",r:h,cx:"22",cy:"22"}),e.jsx("circle",{className:"text-primary transition-all duration-100 ease-out",strokeWidth:"3",strokeDasharray:f,strokeDashoffset:p,strokeLinecap:"round",stroke:"currentColor",fill:"transparent",r:h,cx:"22",cy:"22"})]}),e.jsx(N_,{className:"h-5 w-5 text-primary transition-transform duration-300 group-hover:-translate-y-1 group-hover:scale-110",strokeWidth:2.5}),e.jsx("div",{className:"absolute inset-0 rounded-full bg-primary/5 opacity-0 group-hover:opacity-100 transition-opacity duration-300"})]})})}const y3=Iw,w3=Pw,_3=Hw,sb=d.forwardRef(({className:l,sideOffset:n=4,...i},c)=>e.jsx(Bw,{children:e.jsx(Sj,{ref:c,sideOffset:n,className:I("z-50 overflow-hidden rounded-md bg-primary px-3 py-1.5 text-xs text-primary-foreground animate-in fade-in-0 zoom-in-95 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 origin-[--radix-tooltip-content-transform-origin]",l),...i})}));sb.displayName=Sj.displayName;function S3({children:l}){const{checking:n}=f3(),[i,c]=d.useState(!0),[u,x]=d.useState(!1),[h,f]=d.useState(!1),{theme:p,setTheme:g}=ex(),N=y0();if(d.useEffect(()=>{const R=D=>{(D.metaKey||D.ctrlKey)&&D.key==="k"&&(D.preventDefault(),f(!0))};return window.addEventListener("keydown",R),()=>window.removeEventListener("keydown",R)},[]),n)return e.jsx("div",{className:"flex h-screen items-center justify-center bg-background",children:e.jsx("div",{className:"text-muted-foreground",children:"正在验证登录状态..."})});const v=[{title:"概览",items:[{icon:Jo,label:"首页",path:"/"}]},{title:"麦麦配置编辑",items:[{icon:ka,label:"麦麦主程序配置",path:"/config/bot"},{icon:Dl,label:"AI模型厂商配置",path:"/config/modelProvider",tourId:"sidebar-model-provider"},{icon:Fj,label:"模型管理与分配",path:"/config/model",tourId:"sidebar-model-management"},{icon:og,label:"麦麦适配器配置",path:"/config/adapter"}]},{title:"麦麦资源管理",items:[{icon:Yo,label:"表情包管理",path:"/resource/emoji"},{icon:Ea,label:"表达方式管理",path:"/resource/expression"},{icon:Gr,label:"黑话管理",path:"/resource/jargon"},{icon:Gj,label:"人物信息管理",path:"/resource/person"},{icon:Bj,label:"知识库图谱可视化",path:"/resource/knowledge-graph"},{icon:Hr,label:"麦麦知识库管理",path:"/resource/knowledge-base"}]},{title:"扩展与监控",items:[{icon:ra,label:"插件市场",path:"/plugins"},{icon:Pj,label:"配置模板市场",path:"/config/pack-market"},{icon:og,label:"插件配置",path:"/plugin-config"},{icon:Qm,label:"日志查看器",path:"/logs"},{icon:Gm,label:"计划器&回复器监控",path:"/planner-monitor"},{icon:Ea,label:"本地聊天室",path:"/chat"}]},{title:"系统",items:[{icon:pn,label:"系统设置",path:"/settings"}]}],w=p==="system"?window.matchMedia("(prefers-color-scheme: dark)").matches?"dark":"light":p,b=async()=>{await t1()};return e.jsx(y3,{delayDuration:300,children:e.jsxs("div",{className:"flex h-screen overflow-hidden",children:[e.jsxs("aside",{className:I("fixed inset-y-0 left-0 z-50 flex flex-col border-r bg-card transition-all duration-300 lg:relative lg:z-0","w-64 lg:w-auto",i?"lg:w-64":"lg:w-16",u?"translate-x-0":"-translate-x-full lg:translate-x-0"),children:[e.jsx("div",{className:"flex h-16 items-center border-b px-4",children:e.jsxs("div",{className:I("relative flex items-center justify-center flex-1 transition-all overflow-hidden","lg:flex-1",!i&&"lg:flex-none lg:w-8"),children:[e.jsxs("div",{className:I("flex items-baseline gap-2",!i&&"lg:hidden"),children:[e.jsx("span",{className:"font-bold text-xl text-primary-gradient whitespace-nowrap",children:"MaiBot WebUI"}),e.jsx("span",{className:"text-xs text-primary/60 whitespace-nowrap",children:R1()})]}),!i&&e.jsx("span",{className:"hidden lg:block font-bold text-primary-gradient text-2xl",children:"M"})]})}),e.jsx(Ye,{className:I("flex-1 overflow-x-hidden",!i&&"lg:w-16"),children:e.jsx("nav",{className:I("p-4",!i&&"lg:p-2 lg:w-16"),children:e.jsx("ul",{className:I("space-y-6",!i&&"lg:space-y-3 lg:w-full"),children:v.map((R,D)=>e.jsxs("li",{children:[e.jsx("div",{className:I("px-3 h-[1.25rem]","mb-2",!i&&"lg:mb-1 lg:invisible"),children:e.jsx("h3",{className:"text-xs font-semibold uppercase tracking-wider text-muted-foreground/60 whitespace-nowrap",children:R.title})}),!i&&D>0&&e.jsx("div",{className:"hidden lg:block mb-2 border-t border-border"}),e.jsx("ul",{className:"space-y-1",children:R.items.map(S=>{const P=N({to:S.path}),M=S.icon,T=e.jsxs(e.Fragment,{children:[P&&e.jsx("div",{className:"absolute left-0 top-1/2 h-8 w-1 -translate-y-1/2 rounded-r-full bg-primary transition-opacity duration-300"}),e.jsxs("div",{className:I("flex items-center transition-all duration-300",i?"gap-3":"gap-3 lg:gap-0"),children:[e.jsx(M,{className:I("h-5 w-5 flex-shrink-0",P&&"text-primary"),strokeWidth:2,fill:"none"}),e.jsx("span",{className:I("text-sm font-medium whitespace-nowrap transition-all duration-300",P&&"font-semibold",i?"opacity-100 max-w-[200px]":"opacity-100 max-w-[200px] lg:opacity-0 lg:max-w-0 lg:overflow-hidden"),children:S.label})]})]});return e.jsx("li",{className:"relative",children:e.jsxs(w3,{children:[e.jsx(_3,{asChild:!0,children:e.jsx(Bn,{to:S.path,"data-tour":S.tourId,className:I("relative flex items-center rounded-lg py-2 transition-all duration-300","hover:bg-accent hover:text-accent-foreground",P?"bg-accent text-foreground":"text-muted-foreground hover:text-foreground",i?"px-3":"px-3 lg:px-0 lg:justify-center lg:w-12 lg:mx-auto"),onClick:()=>x(!1),children:T})}),!i&&e.jsx(sb,{side:"right",className:"hidden lg:block",children:e.jsx("p",{children:S.label})})]})},S.path)})})]},R.title))})})})]}),u&&e.jsx("div",{className:"fixed inset-0 z-40 bg-black/50 lg:hidden",onClick:()=>x(!1)}),e.jsxs("div",{className:"flex flex-1 flex-col overflow-hidden",children:[e.jsx(N3,{}),e.jsxs("header",{className:"flex h-16 items-center justify-between border-b bg-card/80 backdrop-blur-md px-4 sticky top-0 z-10",children:[e.jsxs("div",{className:"flex items-center gap-4",children:[e.jsx("button",{onClick:()=>x(!u),className:"rounded-lg p-2 hover:bg-accent lg:hidden",children:e.jsx(b_,{className:"h-5 w-5"})}),e.jsx("button",{onClick:()=>c(!i),className:"hidden rounded-lg p-2 hover:bg-accent lg:block",title:i?"收起侧边栏":"展开侧边栏",children:e.jsx(za,{className:I("h-5 w-5 transition-transform",!i&&"rotate-180")})})]}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(Bn,{to:"/annual-report",children:e.jsxs(_,{variant:"ghost",size:"sm",className:"gap-2 bg-gradient-to-r from-pink-500/10 to-purple-500/10 hover:from-pink-500/20 hover:to-purple-500/20 border border-pink-500/20",title:"查看年度总结",children:[e.jsx(y_,{className:"h-4 w-4 text-pink-500"}),e.jsx("span",{className:"hidden sm:inline bg-gradient-to-r from-pink-500 to-purple-500 bg-clip-text text-transparent font-medium",children:"2025 年度总结"})]})}),e.jsxs("button",{onClick:()=>f(!0),className:"relative hidden md:flex items-center w-64 h-9 pl-9 pr-16 bg-background/50 border rounded-md hover:bg-accent/50 transition-colors text-left",children:[e.jsx(Ct,{className:"absolute left-3 top-1/2 h-4 w-4 -translate-y-1/2 text-muted-foreground"}),e.jsx("span",{className:"text-sm text-muted-foreground",children:"搜索..."}),e.jsxs(eb,{size:"sm",className:"absolute right-2 top-1/2 -translate-y-1/2",children:[e.jsx("span",{className:"text-xs",children:"⌘"}),"K"]})]}),e.jsx(v3,{open:h,onOpenChange:f}),e.jsxs(_,{variant:"ghost",size:"sm",onClick:()=>window.open("https://docs.mai-mai.org","_blank"),className:"gap-2",title:"查看麦麦文档",children:[e.jsx(w_,{className:"h-4 w-4"}),e.jsx("span",{className:"hidden sm:inline",children:"麦麦文档"})]}),e.jsx("button",{onClick:R=>{M1(w==="dark"?"light":"dark",g,R)},className:"rounded-lg p-2 hover:bg-accent",title:w==="dark"?"切换到浅色模式":"切换到深色模式",children:w==="dark"?e.jsx(qm,{className:"h-5 w-5"}):e.jsx(Qi,{className:"h-5 w-5"})}),e.jsx("div",{className:"h-6 w-px bg-border"}),e.jsxs(_,{variant:"ghost",size:"sm",onClick:b,className:"gap-2",title:"登出系统",children:[e.jsx(__,{className:"h-4 w-4"}),e.jsx("span",{className:"hidden sm:inline",children:"登出"})]})]})]}),e.jsx("main",{className:"flex-1 overflow-hidden bg-background",children:l}),e.jsx(b3,{})]})]})})}function k3(l){const n=l.split(` + `,children:[e.jsx("div",{className:"w-12 h-12 rounded border overflow-hidden bg-muted flex-shrink-0 flex items-center justify-center",children:e.jsx("img",{src:J.previewUrl,alt:J.name,className:"max-w-full max-h-full object-contain"})}),e.jsxs("div",{className:"flex-1 min-w-0",children:[e.jsx("p",{className:"text-sm font-medium truncate",children:J.name}),e.jsx("p",{className:"text-xs text-muted-foreground truncate",children:J.emotion||"未填写情感标签"})]}),U?e.jsx(pt,{className:"h-5 w-5 text-green-500 flex-shrink-0"}):e.jsx("div",{className:"h-5 w-5 rounded-full border-2 border-muted-foreground/30 flex-shrink-0"})]},J.id)})})}),e.jsx("div",{className:"border rounded-lg p-4",children:D?e.jsxs("div",{className:"space-y-4",children:[e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx("div",{className:"w-16 h-16 rounded border overflow-hidden bg-muted flex items-center justify-center",children:e.jsx("img",{src:D.previewUrl,alt:D.name,className:"max-w-full max-h-full object-contain"})}),e.jsxs("div",{className:"flex-1 min-w-0",children:[e.jsx("p",{className:"font-medium truncate",children:D.name}),b(D)&&e.jsxs(Se,{variant:"outline",className:"text-green-600 border-green-600",children:[e.jsx(Ct,{className:"h-3 w-3 mr-1"}),"已完成"]})]})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsxs(E,{htmlFor:"multi-emotion",children:["情感标签 ",e.jsx("span",{className:"text-destructive",children:"*"})]}),e.jsx(le,{id:"multi-emotion",value:D.emotion,onChange:J=>w(D.id,{emotion:J.target.value}),placeholder:"多个标签用逗号分隔,如:开心,高兴",className:D.emotion.trim()?"":"border-destructive"})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsx(E,{htmlFor:"multi-description",children:"描述"}),e.jsx(le,{id:"multi-description",value:D.description,onChange:J=>w(D.id,{description:J.target.value}),placeholder:"输入表情包描述..."})]}),e.jsxs("div",{className:"flex items-center space-x-2",children:[e.jsx(qs,{id:"multi-is-registered",checked:D.isRegistered,onCheckedChange:J=>w(D.id,{isRegistered:J===!0})}),e.jsx(E,{htmlFor:"multi-is-registered",className:"cursor-pointer text-sm",children:"上传后立即注册"})]})]}):e.jsx("div",{className:"h-full flex items-center justify-center text-muted-foreground",children:e.jsxs("div",{className:"text-center",children:[e.jsx(Jm,{className:"h-12 w-12 mx-auto mb-2 opacity-50"}),e.jsx("p",{children:"点击左侧卡片编辑"})]})})})]}),e.jsx(st,{children:e.jsx(_,{onClick:P,disabled:!R||g,children:g?"上传中...":`上传全部 (${L})`})})]})};return e.jsx(Is,{open:l,onOpenChange:n,children:e.jsxs(Os,{className:"max-w-3xl max-h-[90vh] overflow-hidden",children:[e.jsxs(Ds,{children:[e.jsxs(Rs,{className:"flex items-center gap-2",children:[e.jsx(ec,{className:"h-5 w-5"}),c==="select"&&"上传表情包 - 选择文件",c==="edit-single"&&"上传表情包 - 填写信息",c==="edit-multiple"&&"上传表情包 - 批量编辑"]}),e.jsxs(Ks,{children:[c==="select"&&"支持 JPG、PNG、GIF、WebP 格式,单个文件最大 10MB,可同时上传多个文件",c==="edit-single"&&"请填写表情包的情感标签(必填)和描述",c==="edit-multiple"&&"点击左侧卡片编辑每个表情包的信息,情感标签为必填项"]})]}),e.jsxs("div",{className:"overflow-y-auto pr-1",children:[c==="select"&&M(),c==="edit-single"&&T(),c==="edit-multiple"&&A()]})]})})}function S4(){const[l,n]=d.useState([]),[i,c]=d.useState(!0),[u,x]=d.useState(0),[h,f]=d.useState(1),[p,g]=d.useState(20),[N,v]=d.useState(""),[y,w]=d.useState(null),[b,R]=d.useState(!1),[D,S]=d.useState(!1),[P,M]=d.useState(!1),[T,A]=d.useState(null),[F,L]=d.useState(new Set),[J,U]=d.useState(!1),[ue,xe]=d.useState(""),[he,ne]=d.useState({total:0,recent_7days:0,chat_count:0,top_chats:{}}),[ve,je]=d.useState([]),[z,V]=d.useState(new Map),[B,oe]=d.useState(!1),[K,_e]=d.useState(0),{toast:pe}=Zs(),ke=async()=>{try{c(!0);const ie=await j1({page:h,page_size:p,search:N||void 0});n(ie.data),x(ie.total)}catch(ie){pe({title:"加载失败",description:ie instanceof Error?ie.message:"无法加载表达方式",variant:"destructive"})}finally{c(!1)}},O=async()=>{try{const ie=await _1();ie?.data&&ne(ie.data)}catch(ie){console.error("加载统计数据失败:",ie)}},k=async()=>{try{const ie=await Wm();_e(ie.unchecked)}catch(ie){console.error("加载审核统计失败:",ie)}},H=async()=>{try{const ie=await Zm();if(ie?.data){je(ie.data);const Te=new Map;ie.data.forEach(de=>{Te.set(de.chat_id,de.chat_name)}),V(Te)}}catch(ie){console.error("加载聊天列表失败:",ie)}},se=ie=>z.get(ie)||ie;d.useEffect(()=>{ke(),k(),O(),H()},[h,p,N]);const Ee=async ie=>{try{const Te=await v1(ie.id);w(Te.data),R(!0)}catch(Te){pe({title:"加载详情失败",description:Te instanceof Error?Te.message:"无法加载表达方式详情",variant:"destructive"})}},Z=ie=>{w(ie),S(!0)},Oe=async ie=>{try{await y1(ie.id),pe({title:"删除成功",description:`已删除表达方式: ${ie.situation}`}),A(null),ke(),O()}catch(Te){pe({title:"删除失败",description:Te instanceof Error?Te.message:"无法删除表达方式",variant:"destructive"})}},ns=ie=>{const Te=new Set(F);Te.has(ie)?Te.delete(ie):Te.add(ie),L(Te)},Q=()=>{F.size===l.length&&l.length>0?L(new Set):L(new Set(l.map(ie=>ie.id)))},ee=async()=>{try{await w1(Array.from(F)),pe({title:"批量删除成功",description:`已删除 ${F.size} 个表达方式`}),L(new Set),U(!1),ke(),O()}catch(ie){pe({title:"批量删除失败",description:ie instanceof Error?ie.message:"无法批量删除表达方式",variant:"destructive"})}},Ue=()=>{const ie=parseInt(ue),Te=Math.ceil(u/p);ie>=1&&ie<=Te?(f(ie),xe("")):pe({title:"无效的页码",description:`请输入1-${Te}之间的页码`,variant:"destructive"})};return e.jsxs("div",{className:"h-[calc(100vh-4rem)] flex flex-col p-4 sm:p-6",children:[e.jsx("div",{className:"mb-4 sm:mb-6",children:e.jsxs("div",{className:"flex flex-col sm:flex-row sm:items-center justify-between gap-4",children:[e.jsxs("div",{children:[e.jsxs("h1",{className:"text-2xl sm:text-3xl font-bold flex items-center gap-2",children:[e.jsx(Ma,{className:"h-8 w-8",strokeWidth:2}),"表达方式管理"]}),e.jsx("p",{className:"text-muted-foreground mt-1 text-sm sm:text-base",children:"管理麦麦的表达方式和话术模板"})]}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsxs(_,{variant:"outline",onClick:()=>oe(!0),className:"gap-2",children:[e.jsx(Aj,{className:"h-4 w-4"}),"人工审核",K>0&&e.jsx("span",{className:"ml-1 px-1.5 py-0.5 text-xs rounded-full bg-orange-500 text-white",children:K>99?"99+":K})]}),e.jsxs(_,{onClick:()=>M(!0),className:"gap-2",children:[e.jsx(et,{className:"h-4 w-4"}),"新增表达方式"]})]})]})}),e.jsx(Ye,{className:"flex-1",children:e.jsxs("div",{className:"space-y-4 sm:space-y-6 pr-4",children:[e.jsxs("div",{className:"grid grid-cols-1 sm:grid-cols-3 gap-4",children:[e.jsxs("div",{className:"rounded-lg border bg-card p-4",children:[e.jsx("div",{className:"text-sm text-muted-foreground",children:"总数量"}),e.jsx("div",{className:"text-2xl font-bold mt-1",children:he.total})]}),e.jsxs("div",{className:"rounded-lg border bg-card p-4",children:[e.jsx("div",{className:"text-sm text-muted-foreground",children:"近7天新增"}),e.jsx("div",{className:"text-2xl font-bold mt-1 text-green-600",children:he.recent_7days})]}),e.jsxs("div",{className:"rounded-lg border bg-card p-4",children:[e.jsx("div",{className:"text-sm text-muted-foreground",children:"关联聊天数"}),e.jsx("div",{className:"text-2xl font-bold mt-1 text-blue-600",children:he.chat_count})]})]}),e.jsxs("div",{className:"rounded-lg border bg-card p-4",children:[e.jsx(E,{htmlFor:"search",children:"搜索"}),e.jsx("div",{className:"flex flex-col sm:flex-row gap-2 mt-1.5",children:e.jsxs("div",{className:"flex-1 relative",children:[e.jsx(Tt,{className:"absolute left-2.5 top-2.5 h-4 w-4 text-muted-foreground"}),e.jsx(le,{id:"search",placeholder:"搜索情境、风格或上下文...",value:N,onChange:ie=>v(ie.target.value),className:"pl-9"})]})}),e.jsxs("div",{className:"flex flex-col sm:flex-row items-start sm:items-center justify-between gap-3 mt-4 pt-4 border-t",children:[e.jsx("div",{className:"flex items-center gap-2 text-sm text-muted-foreground",children:F.size>0&&e.jsxs("span",{children:["已选择 ",F.size," 个表达方式"]})}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(E,{htmlFor:"page-size",className:"text-sm whitespace-nowrap",children:"每页显示"}),e.jsxs(Ie,{value:p.toString(),onValueChange:ie=>{g(parseInt(ie)),f(1),L(new Set)},children:[e.jsx($e,{id:"page-size",className:"w-20",children:e.jsx(Pe,{})}),e.jsxs(Be,{children:[e.jsx(X,{value:"10",children:"10"}),e.jsx(X,{value:"20",children:"20"}),e.jsx(X,{value:"50",children:"50"}),e.jsx(X,{value:"100",children:"100"})]})]}),F.size>0&&e.jsxs(e.Fragment,{children:[e.jsx(_,{variant:"outline",size:"sm",onClick:()=>L(new Set),children:"取消选择"}),e.jsxs(_,{variant:"destructive",size:"sm",onClick:()=>U(!0),children:[e.jsx(ls,{className:"h-4 w-4 mr-1"}),"批量删除"]})]})]})]})]}),e.jsxs("div",{className:"rounded-lg border bg-card",children:[e.jsx("div",{className:"hidden md:block",children:e.jsxs(Rl,{children:[e.jsx(Ll,{children:e.jsxs(ut,{children:[e.jsx(Ze,{className:"w-12",children:e.jsx(qs,{checked:F.size===l.length&&l.length>0,onCheckedChange:Q})}),e.jsx(Ze,{children:"情境"}),e.jsx(Ze,{children:"风格"}),e.jsx(Ze,{children:"聊天"}),e.jsx(Ze,{className:"text-right",children:"操作"})]})}),e.jsx(Ul,{children:i?e.jsx(ut,{children:e.jsx(qe,{colSpan:5,className:"text-center py-8 text-muted-foreground",children:"加载中..."})}):l.length===0?e.jsx(ut,{children:e.jsx(qe,{colSpan:5,className:"text-center py-8 text-muted-foreground",children:"暂无数据"})}):l.map(ie=>e.jsxs(ut,{children:[e.jsx(qe,{children:e.jsx(qs,{checked:F.has(ie.id),onCheckedChange:()=>ns(ie.id)})}),e.jsx(qe,{className:"font-medium max-w-xs truncate",children:ie.situation}),e.jsx(qe,{className:"max-w-xs truncate",children:ie.style}),e.jsx(qe,{className:"max-w-[200px] truncate",title:se(ie.chat_id),style:{wordBreak:"keep-all"},children:e.jsx("span",{className:"whitespace-nowrap overflow-hidden text-ellipsis block",children:se(ie.chat_id)})}),e.jsx(qe,{className:"text-right",children:e.jsxs("div",{className:"flex justify-end gap-2",children:[e.jsxs(_,{variant:"default",size:"sm",onClick:()=>Z(ie),children:[e.jsx(qn,{className:"h-4 w-4 mr-1"}),"编辑"]}),e.jsx(_,{variant:"outline",size:"icon",className:"h-8 w-8",onClick:()=>Ee(ie),title:"查看详情",children:e.jsx(ia,{className:"h-4 w-4"})}),e.jsxs(_,{size:"sm",onClick:()=>A(ie),className:"bg-red-600 hover:bg-red-700 text-white",children:[e.jsx(ls,{className:"h-4 w-4 mr-1"}),"删除"]})]})})]},ie.id))})]})}),e.jsx("div",{className:"md:hidden space-y-3 p-4",children:i?e.jsx("div",{className:"text-center py-8 text-muted-foreground",children:"加载中..."}):l.length===0?e.jsx("div",{className:"text-center py-8 text-muted-foreground",children:"暂无数据"}):l.map(ie=>e.jsxs("div",{className:"rounded-lg border bg-card p-4 space-y-3 overflow-hidden",children:[e.jsxs("div",{className:"flex items-start gap-3",children:[e.jsx(qs,{checked:F.has(ie.id),onCheckedChange:()=>ns(ie.id),className:"mt-1"}),e.jsxs("div",{className:"min-w-0 flex-1 overflow-hidden space-y-2",children:[e.jsxs("div",{children:[e.jsx("div",{className:"text-xs text-muted-foreground mb-1",children:"情境"}),e.jsx("h3",{className:"font-semibold text-sm line-clamp-2 w-full break-all",title:ie.situation,children:ie.situation})]}),e.jsxs("div",{children:[e.jsx("div",{className:"text-xs text-muted-foreground mb-1",children:"风格"}),e.jsx("p",{className:"text-sm line-clamp-2 w-full break-all",title:ie.style,children:ie.style})]})]})]}),e.jsxs("div",{className:"text-sm",children:[e.jsx("div",{className:"text-xs text-muted-foreground mb-1",children:"聊天"}),e.jsx("p",{className:"text-sm truncate",title:se(ie.chat_id),style:{wordBreak:"keep-all"},children:se(ie.chat_id)})]}),e.jsxs("div",{className:"flex flex-wrap gap-1 pt-2 border-t overflow-hidden",children:[e.jsxs(_,{variant:"outline",size:"sm",onClick:()=>Z(ie),className:"text-xs px-2 py-1 h-auto flex-shrink-0",children:[e.jsx(qn,{className:"h-3 w-3 mr-1"}),"编辑"]}),e.jsx(_,{variant:"outline",size:"sm",onClick:()=>Ee(ie),className:"text-xs px-2 py-1 h-auto flex-shrink-0",children:e.jsx(ia,{className:"h-3 w-3"})}),e.jsxs(_,{variant:"outline",size:"sm",onClick:()=>A(ie),className:"text-xs px-2 py-1 h-auto flex-shrink-0 text-destructive hover:text-destructive",children:[e.jsx(ls,{className:"h-3 w-3 mr-1"}),"删除"]})]})]},ie.id))}),u>0&&e.jsxs("div",{className:"flex flex-col sm:flex-row items-center justify-between gap-4 px-4 py-3 border-t",children:[e.jsxs("div",{className:"text-sm text-muted-foreground",children:["共 ",u," 条记录,第 ",h," / ",Math.ceil(u/p)," 页"]}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(_,{variant:"outline",size:"sm",onClick:()=>f(1),disabled:h===1,className:"hidden sm:flex",children:e.jsx(gn,{className:"h-4 w-4"})}),e.jsxs(_,{variant:"outline",size:"sm",onClick:()=>f(h-1),disabled:h===1,children:[e.jsx(Aa,{className:"h-4 w-4 sm:mr-1"}),e.jsx("span",{className:"hidden sm:inline",children:"上一页"})]}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(le,{type:"number",value:ue,onChange:ie=>xe(ie.target.value),onKeyDown:ie=>ie.key==="Enter"&&Ue(),placeholder:h.toString(),className:"w-16 h-8 text-center",min:1,max:Math.ceil(u/p)}),e.jsx(_,{variant:"outline",size:"sm",onClick:Ue,disabled:!ue,className:"h-8",children:"跳转"})]}),e.jsxs(_,{variant:"outline",size:"sm",onClick:()=>f(h+1),disabled:h>=Math.ceil(u/p),children:[e.jsx("span",{className:"hidden sm:inline",children:"下一页"}),e.jsx(Zt,{className:"h-4 w-4 sm:ml-1"})]}),e.jsx(_,{variant:"outline",size:"sm",onClick:()=>f(Math.ceil(u/p)),disabled:h>=Math.ceil(u/p),className:"hidden sm:flex",children:e.jsx(jn,{className:"h-4 w-4"})})]})]})]})]})}),e.jsx(k4,{expression:y,open:b,onOpenChange:R,chatNameMap:z}),e.jsx(C4,{open:P,onOpenChange:M,chatList:ve,onSuccess:()=>{ke(),O(),M(!1)}}),e.jsx(T4,{expression:y,open:D,onOpenChange:S,chatList:ve,onSuccess:()=>{ke(),O(),S(!1)}}),e.jsx(vs,{open:!!T,onOpenChange:()=>A(null),children:e.jsxs(ds,{children:[e.jsxs(us,{children:[e.jsx(xs,{children:"确认删除"}),e.jsxs(hs,{children:['确定要删除表达方式 "',T?.situation,'" 吗? 此操作不可撤销。']})]}),e.jsxs(ms,{children:[e.jsx(ps,{children:"取消"}),e.jsx(fs,{onClick:()=>T&&Oe(T),className:"bg-destructive text-destructive-foreground hover:bg-destructive/90",children:"删除"})]})]})}),e.jsx(E4,{open:J,onOpenChange:U,onConfirm:ee,count:F.size}),e.jsx(cv,{open:B,onOpenChange:ie=>{oe(ie),ie||(ke(),O(),k())}})]})}function k4({expression:l,open:n,onOpenChange:i,chatNameMap:c}){if(!l)return null;const u=h=>h?new Date(h*1e3).toLocaleString("zh-CN"):"-",x=h=>c.get(h)||h;return e.jsx(Is,{open:n,onOpenChange:i,children:e.jsxs(Os,{className:"max-w-2xl max-h-[80vh] overflow-y-auto",children:[e.jsxs(Ds,{children:[e.jsx(Rs,{children:"表达方式详情"}),e.jsx(Ks,{children:"查看表达方式的完整信息"})]}),e.jsxs("div",{className:"space-y-4",children:[e.jsxs("div",{className:"grid grid-cols-2 gap-4",children:[e.jsx(Pi,{label:"情境",value:l.situation}),e.jsx(Pi,{label:"风格",value:l.style}),e.jsx(Pi,{label:"聊天",value:x(l.chat_id)}),e.jsx(Pi,{icon:Gr,label:"记录ID",value:l.id.toString(),mono:!0})]}),e.jsx("div",{className:"grid grid-cols-2 gap-4",children:e.jsx(Pi,{icon:na,label:"创建时间",value:u(l.create_date)})}),e.jsxs("div",{className:"rounded-lg border bg-muted/50 p-4",children:[e.jsx(E,{className:"text-xs text-muted-foreground mb-3 block",children:"状态标记"}),e.jsxs("div",{className:"grid grid-cols-2 gap-4",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("div",{className:I("flex h-8 w-8 items-center justify-center rounded-full",l.checked?"bg-green-100 text-green-700 dark:bg-green-900/30 dark:text-green-400":"bg-gray-100 text-gray-400 dark:bg-gray-800 dark:text-gray-600"),children:l.checked?e.jsx(pt,{className:"h-5 w-5"}):e.jsx(Lo,{className:"h-5 w-5"})}),e.jsxs("div",{children:[e.jsx("p",{className:"text-sm font-medium",children:"已检查"}),e.jsx("p",{className:"text-xs text-muted-foreground",children:l.checked?"已通过审核":"未审核"})]})]}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("div",{className:I("flex h-8 w-8 items-center justify-center rounded-full",l.rejected?"bg-red-100 text-red-700 dark:bg-red-900/30 dark:text-red-400":"bg-gray-100 text-gray-400 dark:bg-gray-800 dark:text-gray-600"),children:l.rejected?e.jsx(Va,{className:"h-5 w-5"}):e.jsx(Lo,{className:"h-5 w-5"})}),e.jsxs("div",{children:[e.jsx("p",{className:"text-sm font-medium",children:"已拒绝"}),e.jsx("p",{className:"text-xs text-muted-foreground",children:l.rejected?"不会被使用":"正常"})]})]})]})]})]}),e.jsx(st,{children:e.jsx(_,{onClick:()=>i(!1),children:"关闭"})})]})})}function Pi({icon:l,label:n,value:i,mono:c=!1}){return e.jsxs("div",{className:"space-y-1",children:[e.jsxs(E,{className:"text-xs text-muted-foreground flex items-center gap-1",children:[l&&e.jsx(l,{className:"h-3 w-3"}),n]}),e.jsx("div",{className:I("text-sm",c&&"font-mono",!i&&"text-muted-foreground"),children:i||"-"})]})}function C4({open:l,onOpenChange:n,chatList:i,onSuccess:c}){const[u,x]=d.useState({situation:"",style:"",chat_id:""}),[h,f]=d.useState(!1),{toast:p}=Zs(),g=async()=>{if(!u.situation||!u.style||!u.chat_id){p({title:"验证失败",description:"请填写必填字段:情境、风格和聊天",variant:"destructive"});return}try{f(!0),await N1(u),p({title:"创建成功",description:"表达方式已创建"}),x({situation:"",style:"",chat_id:""}),c()}catch(N){p({title:"创建失败",description:N instanceof Error?N.message:"无法创建表达方式",variant:"destructive"})}finally{f(!1)}};return e.jsx(Is,{open:l,onOpenChange:n,children:e.jsxs(Os,{className:"max-w-2xl max-h-[80vh] overflow-y-auto",children:[e.jsxs(Ds,{children:[e.jsx(Rs,{children:"新增表达方式"}),e.jsx(Ks,{children:"创建新的表达方式记录"})]}),e.jsxs("div",{className:"space-y-4",children:[e.jsxs("div",{className:"grid grid-cols-2 gap-4",children:[e.jsxs("div",{className:"space-y-2",children:[e.jsxs(E,{htmlFor:"situation",children:["情境 ",e.jsx("span",{className:"text-destructive",children:"*"})]}),e.jsx(le,{id:"situation",value:u.situation,onChange:N=>x({...u,situation:N.target.value}),placeholder:"描述使用场景"})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsxs(E,{htmlFor:"style",children:["风格 ",e.jsx("span",{className:"text-destructive",children:"*"})]}),e.jsx(le,{id:"style",value:u.style,onChange:N=>x({...u,style:N.target.value}),placeholder:"描述表达风格"})]})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsxs(E,{htmlFor:"chat_id",children:["聊天 ",e.jsx("span",{className:"text-destructive",children:"*"})]}),e.jsxs(Ie,{value:u.chat_id,onValueChange:N=>x({...u,chat_id:N}),children:[e.jsx($e,{children:e.jsx(Pe,{placeholder:"选择关联的聊天"})}),e.jsx(Be,{children:i.map(N=>e.jsx(X,{value:N.chat_id,children:e.jsxs("span",{className:"truncate",style:{wordBreak:"keep-all"},children:[N.chat_name,N.is_group&&e.jsx("span",{className:"text-muted-foreground ml-1",children:"(群聊)"})]})},N.chat_id))})]})]})]}),e.jsxs(st,{children:[e.jsx(_,{variant:"outline",onClick:()=>n(!1),children:"取消"}),e.jsx(_,{onClick:g,disabled:h,children:h?"创建中...":"创建"})]})]})})}function T4({expression:l,open:n,onOpenChange:i,chatList:c,onSuccess:u}){const[x,h]=d.useState({}),[f,p]=d.useState(!1),{toast:g}=Zs();d.useEffect(()=>{l&&h({situation:l.situation,style:l.style,chat_id:l.chat_id,checked:l.checked,rejected:l.rejected})},[l]);const N=async()=>{if(l)try{p(!0),await b1(l.id,x),g({title:"保存成功",description:"表达方式已更新"}),u()}catch(v){g({title:"保存失败",description:v instanceof Error?v.message:"无法更新表达方式",variant:"destructive"})}finally{p(!1)}};return l?e.jsx(Is,{open:n,onOpenChange:i,children:e.jsxs(Os,{className:"max-w-2xl max-h-[80vh] overflow-y-auto",children:[e.jsxs(Ds,{children:[e.jsx(Rs,{children:"编辑表达方式"}),e.jsx(Ks,{children:"修改表达方式的信息"})]}),e.jsxs("div",{className:"space-y-4",children:[e.jsxs("div",{className:"grid grid-cols-2 gap-4",children:[e.jsxs("div",{className:"space-y-2",children:[e.jsx(E,{htmlFor:"edit_situation",children:"情境"}),e.jsx(le,{id:"edit_situation",value:x.situation||"",onChange:v=>h({...x,situation:v.target.value}),placeholder:"描述使用场景"})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsx(E,{htmlFor:"edit_style",children:"风格"}),e.jsx(le,{id:"edit_style",value:x.style||"",onChange:v=>h({...x,style:v.target.value}),placeholder:"描述表达风格"})]})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsx(E,{htmlFor:"edit_chat_id",children:"聊天"}),e.jsxs(Ie,{value:x.chat_id||"",onValueChange:v=>h({...x,chat_id:v}),children:[e.jsx($e,{children:e.jsx(Pe,{placeholder:"选择关联的聊天"})}),e.jsx(Be,{children:c.map(v=>e.jsx(X,{value:v.chat_id,children:e.jsxs("span",{className:"truncate",style:{wordBreak:"keep-all"},children:[v.chat_name,v.is_group&&e.jsx("span",{className:"text-muted-foreground ml-1",children:"(群聊)"})]})},v.chat_id))})]})]}),e.jsxs(at,{children:[e.jsx(Ht,{className:"h-4 w-4"}),e.jsx(lt,{className:"text-xs",children:e.jsxs("div",{className:"space-y-1",children:[e.jsx("p",{children:e.jsx("strong",{children:"状态标记说明:"})}),e.jsx("p",{children:"• 已检查:表示该表达方式已通过审核(可由AI自动检查或人工审核)"}),e.jsx("p",{children:"• 已拒绝:表示该表达方式被标记为不合适,将永远不会被使用"}),e.jsxs("p",{className:"text-muted-foreground mt-2",children:['根据配置中"仅使用已审核通过的表达方式"设置:',e.jsx("br",{}),"• 开启时:只有通过审核(已检查)的项目会被使用",e.jsx("br",{}),"• 关闭时:未审核的项目也会被使用"]})]})})]}),e.jsxs("div",{className:"grid grid-cols-2 gap-4",children:[e.jsxs("div",{className:"flex items-center justify-between space-x-2 rounded-lg border p-4",children:[e.jsxs("div",{className:"space-y-0.5",children:[e.jsx(E,{htmlFor:"edit_checked",className:"text-sm font-medium",children:"已检查"}),e.jsx("p",{className:"text-xs text-muted-foreground",children:"已通过审核"})]}),e.jsx(Fe,{id:"edit_checked",checked:x.checked??!1,onCheckedChange:v=>h({...x,checked:v})})]}),e.jsxs("div",{className:"flex items-center justify-between space-x-2 rounded-lg border p-4",children:[e.jsxs("div",{className:"space-y-0.5",children:[e.jsx(E,{htmlFor:"edit_rejected",className:"text-sm font-medium",children:"已拒绝"}),e.jsx("p",{className:"text-xs text-muted-foreground",children:"不会被使用"})]}),e.jsx(Fe,{id:"edit_rejected",checked:x.rejected??!1,onCheckedChange:v=>h({...x,rejected:v})})]})]})]}),e.jsxs(st,{children:[e.jsx(_,{variant:"outline",onClick:()=>i(!1),children:"取消"}),e.jsx(_,{onClick:N,disabled:f,children:f?"保存中...":"保存"})]})]})}):null}function E4({open:l,onOpenChange:n,onConfirm:i,count:c}){return e.jsx(vs,{open:l,onOpenChange:n,children:e.jsxs(ds,{children:[e.jsxs(us,{children:[e.jsx(xs,{children:"确认批量删除"}),e.jsxs(hs,{children:["您即将删除 ",c," 个表达方式,此操作无法撤销。确定要继续吗?"]})]}),e.jsxs(ms,{children:[e.jsx(ps,{children:"取消"}),e.jsx(fs,{onClick:i,className:"bg-destructive text-destructive-foreground hover:bg-destructive/90",children:"确认删除"})]})]})})}const $l="/api/webui/jargon";async function M4(){const l=await we(`${$l}/chats`,{});if(!l.ok){const n=await l.json();throw new Error(n.detail||"获取聊天列表失败")}return l.json()}async function z4(l){const n=new URLSearchParams;l.page&&n.append("page",l.page.toString()),l.page_size&&n.append("page_size",l.page_size.toString()),l.search&&n.append("search",l.search),l.chat_id&&n.append("chat_id",l.chat_id),l.is_jargon!==void 0&&l.is_jargon!==null&&n.append("is_jargon",l.is_jargon.toString()),l.is_global!==void 0&&n.append("is_global",l.is_global.toString());const i=await we(`${$l}/list?${n}`,{});if(!i.ok){const c=await i.json();throw new Error(c.detail||"获取黑话列表失败")}return i.json()}async function A4(l){const n=await we(`${$l}/${l}`,{});if(!n.ok){const i=await n.json();throw new Error(i.detail||"获取黑话详情失败")}return n.json()}async function O4(l){const n=await we(`${$l}/`,{method:"POST",body:JSON.stringify(l)});if(!n.ok){const i=await n.json();throw new Error(i.detail||"创建黑话失败")}return n.json()}async function D4(l,n){const i=await we(`${$l}/${l}`,{method:"PATCH",body:JSON.stringify(n)});if(!i.ok){const c=await i.json();throw new Error(c.detail||"更新黑话失败")}return i.json()}async function R4(l){const n=await we(`${$l}/${l}`,{method:"DELETE"});if(!n.ok){const i=await n.json();throw new Error(i.detail||"删除黑话失败")}return n.json()}async function L4(l){const n=await we(`${$l}/batch/delete`,{method:"POST",body:JSON.stringify({ids:l})});if(!n.ok){const i=await n.json();throw new Error(i.detail||"批量删除黑话失败")}return n.json()}async function U4(){const l=await we(`${$l}/stats/summary`,{});if(!l.ok){const n=await l.json();throw new Error(n.detail||"获取黑话统计失败")}return l.json()}async function $4(l,n){const i=new URLSearchParams;l.forEach(u=>i.append("ids",u.toString())),i.append("is_jargon",n.toString());const c=await we(`${$l}/batch/set-jargon?${i}`,{method:"POST"});if(!c.ok){const u=await c.json();throw new Error(u.detail||"批量设置黑话状态失败")}return c.json()}function B4(){const[l,n]=d.useState([]),[i,c]=d.useState(!0),[u,x]=d.useState(0),[h,f]=d.useState(1),[p,g]=d.useState(20),[N,v]=d.useState(""),[y,w]=d.useState("all"),[b,R]=d.useState("all"),[D,S]=d.useState(null),[P,M]=d.useState(!1),[T,A]=d.useState(!1),[F,L]=d.useState(!1),[J,U]=d.useState(null),[ue,xe]=d.useState(new Set),[he,ne]=d.useState(!1),[ve,je]=d.useState(""),[z,V]=d.useState({total:0,confirmed_jargon:0,confirmed_not_jargon:0,pending:0,global_count:0,complete_count:0,chat_count:0,top_chats:{}}),[B,oe]=d.useState([]),{toast:K}=Zs(),_e=async()=>{try{c(!0);const ee=await z4({page:h,page_size:p,search:N||void 0,chat_id:y==="all"?void 0:y,is_jargon:b==="all"?void 0:b==="true"?!0:b==="false"?!1:void 0});n(ee.data),x(ee.total)}catch(ee){K({title:"加载失败",description:ee instanceof Error?ee.message:"无法加载黑话列表",variant:"destructive"})}finally{c(!1)}},pe=async()=>{try{const ee=await U4();ee?.data&&V(ee.data)}catch(ee){console.error("加载统计数据失败:",ee)}},ke=async()=>{try{const ee=await M4();ee?.data&&oe(ee.data)}catch(ee){console.error("加载聊天列表失败:",ee)}};d.useEffect(()=>{_e(),pe(),ke()},[h,p,N,y,b]);const O=async ee=>{try{const Ue=await A4(ee.id);S(Ue.data),M(!0)}catch(Ue){K({title:"加载详情失败",description:Ue instanceof Error?Ue.message:"无法加载黑话详情",variant:"destructive"})}},k=ee=>{S(ee),A(!0)},H=async ee=>{try{await R4(ee.id),K({title:"删除成功",description:`已删除黑话: ${ee.content}`}),U(null),_e(),pe()}catch(Ue){K({title:"删除失败",description:Ue instanceof Error?Ue.message:"无法删除黑话",variant:"destructive"})}},se=ee=>{const Ue=new Set(ue);Ue.has(ee)?Ue.delete(ee):Ue.add(ee),xe(Ue)},Ee=()=>{ue.size===l.length&&l.length>0?xe(new Set):xe(new Set(l.map(ee=>ee.id)))},Z=async()=>{try{await L4(Array.from(ue)),K({title:"批量删除成功",description:`已删除 ${ue.size} 个黑话`}),xe(new Set),ne(!1),_e(),pe()}catch(ee){K({title:"批量删除失败",description:ee instanceof Error?ee.message:"无法批量删除黑话",variant:"destructive"})}},Oe=async ee=>{try{await $4(Array.from(ue),ee),K({title:"操作成功",description:`已将 ${ue.size} 个词条设为${ee?"黑话":"非黑话"}`}),xe(new Set),_e(),pe()}catch(Ue){K({title:"操作失败",description:Ue instanceof Error?Ue.message:"批量设置失败",variant:"destructive"})}},ns=()=>{const ee=parseInt(ve),Ue=Math.ceil(u/p);ee>=1&&ee<=Ue?(f(ee),je("")):K({title:"无效的页码",description:`请输入1-${Ue}之间的页码`,variant:"destructive"})},Q=ee=>ee===!0?e.jsxs(Se,{variant:"default",className:"bg-green-600 hover:bg-green-700",children:[e.jsx(Ct,{className:"h-3 w-3 mr-1"}),"是黑话"]}):ee===!1?e.jsxs(Se,{variant:"secondary",children:[e.jsx(Ea,{className:"h-3 w-3 mr-1"}),"非黑话"]}):e.jsxs(Se,{variant:"outline",children:[e.jsx(Dj,{className:"h-3 w-3 mr-1"}),"未判定"]});return e.jsxs("div",{className:"h-[calc(100vh-4rem)] flex flex-col p-4 sm:p-6",children:[e.jsx("div",{className:"mb-4 sm:mb-6",children:e.jsxs("div",{className:"flex flex-col sm:flex-row sm:items-center justify-between gap-4",children:[e.jsxs("div",{children:[e.jsxs("h1",{className:"text-2xl sm:text-3xl font-bold flex items-center gap-2",children:[e.jsx(a_,{className:"h-8 w-8",strokeWidth:2}),"黑话管理"]}),e.jsx("p",{className:"text-muted-foreground mt-1 text-sm sm:text-base",children:"管理麦麦学习到的黑话和俚语"})]}),e.jsxs(_,{onClick:()=>L(!0),className:"gap-2",children:[e.jsx(et,{className:"h-4 w-4"}),"新增黑话"]})]})}),e.jsx(Ye,{className:"flex-1",children:e.jsxs("div",{className:"space-y-4 sm:space-y-6 pr-4",children:[e.jsxs("div",{className:"grid grid-cols-2 sm:grid-cols-4 lg:grid-cols-7 gap-3",children:[e.jsxs("div",{className:"rounded-lg border bg-card p-3 sm:p-4",children:[e.jsx("div",{className:"text-xs sm:text-sm text-muted-foreground",children:"总数量"}),e.jsx("div",{className:"text-xl sm:text-2xl font-bold mt-1",children:z.total})]}),e.jsxs("div",{className:"rounded-lg border bg-card p-3 sm:p-4",children:[e.jsx("div",{className:"text-xs sm:text-sm text-muted-foreground",children:"已确认黑话"}),e.jsx("div",{className:"text-xl sm:text-2xl font-bold mt-1 text-green-600",children:z.confirmed_jargon})]}),e.jsxs("div",{className:"rounded-lg border bg-card p-3 sm:p-4",children:[e.jsx("div",{className:"text-xs sm:text-sm text-muted-foreground",children:"确认非黑话"}),e.jsx("div",{className:"text-xl sm:text-2xl font-bold mt-1 text-gray-500",children:z.confirmed_not_jargon})]}),e.jsxs("div",{className:"rounded-lg border bg-card p-3 sm:p-4",children:[e.jsx("div",{className:"text-xs sm:text-sm text-muted-foreground",children:"待判定"}),e.jsx("div",{className:"text-xl sm:text-2xl font-bold mt-1 text-yellow-600",children:z.pending})]}),e.jsxs("div",{className:"rounded-lg border bg-card p-3 sm:p-4",children:[e.jsx("div",{className:"text-xs sm:text-sm text-muted-foreground",children:"全局黑话"}),e.jsx("div",{className:"text-xl sm:text-2xl font-bold mt-1 text-blue-600",children:z.global_count})]}),e.jsxs("div",{className:"rounded-lg border bg-card p-3 sm:p-4",children:[e.jsx("div",{className:"text-xs sm:text-sm text-muted-foreground",children:"推断完成"}),e.jsx("div",{className:"text-xl sm:text-2xl font-bold mt-1 text-purple-600",children:z.complete_count})]}),e.jsxs("div",{className:"rounded-lg border bg-card p-3 sm:p-4",children:[e.jsx("div",{className:"text-xs sm:text-sm text-muted-foreground",children:"关联聊天数"}),e.jsx("div",{className:"text-xl sm:text-2xl font-bold mt-1",children:z.chat_count})]})]}),e.jsxs("div",{className:"rounded-lg border bg-card p-4",children:[e.jsxs("div",{className:"grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-4 gap-4",children:[e.jsxs("div",{className:"space-y-1.5",children:[e.jsx(E,{htmlFor:"search",children:"搜索"}),e.jsxs("div",{className:"relative",children:[e.jsx(Tt,{className:"absolute left-2.5 top-2.5 h-4 w-4 text-muted-foreground"}),e.jsx(le,{id:"search",placeholder:"搜索内容、含义...",value:N,onChange:ee=>v(ee.target.value),className:"pl-9"})]})]}),e.jsxs("div",{className:"space-y-1.5",children:[e.jsx(E,{children:"聊天筛选"}),e.jsxs(Ie,{value:y,onValueChange:w,children:[e.jsx($e,{children:e.jsx(Pe,{placeholder:"全部聊天"})}),e.jsxs(Be,{children:[e.jsx(X,{value:"all",children:"全部聊天"}),B.map(ee=>e.jsx(X,{value:ee.chat_id,children:ee.chat_name},ee.chat_id))]})]})]}),e.jsxs("div",{className:"space-y-1.5",children:[e.jsx(E,{children:"状态筛选"}),e.jsxs(Ie,{value:b,onValueChange:R,children:[e.jsx($e,{children:e.jsx(Pe,{placeholder:"全部状态"})}),e.jsxs(Be,{children:[e.jsx(X,{value:"all",children:"全部状态"}),e.jsx(X,{value:"true",children:"是黑话"}),e.jsx(X,{value:"false",children:"非黑话"})]})]})]}),e.jsxs("div",{className:"space-y-1.5",children:[e.jsx(E,{htmlFor:"page-size",children:"每页显示"}),e.jsxs(Ie,{value:p.toString(),onValueChange:ee=>{g(parseInt(ee)),f(1),xe(new Set)},children:[e.jsx($e,{id:"page-size",children:e.jsx(Pe,{})}),e.jsxs(Be,{children:[e.jsx(X,{value:"10",children:"10"}),e.jsx(X,{value:"20",children:"20"}),e.jsx(X,{value:"50",children:"50"}),e.jsx(X,{value:"100",children:"100"})]})]})]})]}),ue.size>0&&e.jsxs("div",{className:"flex flex-wrap items-center gap-2 mt-4 pt-4 border-t",children:[e.jsxs("span",{className:"text-sm text-muted-foreground",children:["已选择 ",ue.size," 个"]}),e.jsxs(_,{variant:"outline",size:"sm",onClick:()=>Oe(!0),children:[e.jsx(Ct,{className:"h-4 w-4 mr-1"}),"标记为黑话"]}),e.jsxs(_,{variant:"outline",size:"sm",onClick:()=>Oe(!1),children:[e.jsx(Ea,{className:"h-4 w-4 mr-1"}),"标记为非黑话"]}),e.jsx(_,{variant:"outline",size:"sm",onClick:()=>xe(new Set),children:"取消选择"}),e.jsxs(_,{variant:"destructive",size:"sm",onClick:()=>ne(!0),children:[e.jsx(ls,{className:"h-4 w-4 mr-1"}),"批量删除"]})]})]}),e.jsxs("div",{className:"rounded-lg border bg-card",children:[e.jsx("div",{className:"hidden md:block",children:e.jsxs(Rl,{children:[e.jsx(Ll,{children:e.jsxs(ut,{children:[e.jsx(Ze,{className:"w-12",children:e.jsx(qs,{checked:ue.size===l.length&&l.length>0,onCheckedChange:Ee})}),e.jsx(Ze,{children:"内容"}),e.jsx(Ze,{children:"含义"}),e.jsx(Ze,{children:"聊天"}),e.jsx(Ze,{children:"状态"}),e.jsx(Ze,{className:"text-center",children:"次数"}),e.jsx(Ze,{className:"text-right",children:"操作"})]})}),e.jsx(Ul,{children:i?e.jsx(ut,{children:e.jsx(qe,{colSpan:7,className:"text-center py-8 text-muted-foreground",children:"加载中..."})}):l.length===0?e.jsx(ut,{children:e.jsx(qe,{colSpan:7,className:"text-center py-8 text-muted-foreground",children:"暂无数据"})}):l.map(ee=>e.jsxs(ut,{children:[e.jsx(qe,{children:e.jsx(qs,{checked:ue.has(ee.id),onCheckedChange:()=>se(ee.id)})}),e.jsx(qe,{className:"font-medium max-w-[200px]",children:e.jsxs("div",{className:"flex items-center gap-2",children:[ee.is_global&&e.jsx("span",{title:"全局黑话",children:e.jsx(Uo,{className:"h-4 w-4 text-blue-500 flex-shrink-0"})}),e.jsx("span",{className:"truncate",title:ee.content,children:ee.content})]})}),e.jsx(qe,{className:"max-w-[200px] truncate",title:ee.meaning||"",children:ee.meaning||e.jsx("span",{className:"text-muted-foreground",children:"-"})}),e.jsx(qe,{className:"max-w-[150px] truncate",title:ee.chat_name||ee.chat_id,children:ee.chat_name||ee.chat_id}),e.jsx(qe,{children:Q(ee.is_jargon)}),e.jsx(qe,{className:"text-center",children:ee.count}),e.jsx(qe,{className:"text-right",children:e.jsxs("div",{className:"flex justify-end gap-2",children:[e.jsxs(_,{variant:"default",size:"sm",onClick:()=>k(ee),children:[e.jsx(qn,{className:"h-4 w-4 mr-1"}),"编辑"]}),e.jsx(_,{variant:"outline",size:"icon",className:"h-8 w-8",onClick:()=>O(ee),title:"查看详情",children:e.jsx(ia,{className:"h-4 w-4"})}),e.jsxs(_,{size:"sm",onClick:()=>U(ee),className:"bg-red-600 hover:bg-red-700 text-white",children:[e.jsx(ls,{className:"h-4 w-4 mr-1"}),"删除"]})]})})]},ee.id))})]})}),e.jsx("div",{className:"md:hidden space-y-3 p-4",children:i?e.jsx("div",{className:"text-center py-8 text-muted-foreground",children:"加载中..."}):l.length===0?e.jsx("div",{className:"text-center py-8 text-muted-foreground",children:"暂无数据"}):l.map(ee=>e.jsxs("div",{className:"rounded-lg border bg-card p-4 space-y-3",children:[e.jsxs("div",{className:"flex items-start gap-3",children:[e.jsx(qs,{checked:ue.has(ee.id),onCheckedChange:()=>se(ee.id),className:"mt-1"}),e.jsxs("div",{className:"min-w-0 flex-1 space-y-2",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[ee.is_global&&e.jsx(Uo,{className:"h-4 w-4 text-blue-500 flex-shrink-0"}),e.jsx("h3",{className:"font-semibold text-sm break-all",children:ee.content})]}),ee.meaning&&e.jsx("p",{className:"text-sm text-muted-foreground break-all",children:ee.meaning}),e.jsxs("div",{className:"flex flex-wrap items-center gap-2 text-xs",children:[Q(ee.is_jargon),e.jsxs("span",{className:"text-muted-foreground",children:["次数: ",ee.count]})]}),e.jsxs("div",{className:"text-xs text-muted-foreground truncate",children:["聊天: ",ee.chat_name||ee.chat_id]})]})]}),e.jsxs("div",{className:"flex flex-wrap gap-1 pt-2 border-t",children:[e.jsxs(_,{variant:"outline",size:"sm",onClick:()=>k(ee),className:"text-xs px-2 py-1 h-auto",children:[e.jsx(qn,{className:"h-3 w-3 mr-1"}),"编辑"]}),e.jsx(_,{variant:"outline",size:"sm",onClick:()=>O(ee),className:"text-xs px-2 py-1 h-auto",children:e.jsx(ia,{className:"h-3 w-3"})}),e.jsxs(_,{variant:"outline",size:"sm",onClick:()=>U(ee),className:"text-xs px-2 py-1 h-auto text-destructive hover:text-destructive",children:[e.jsx(ls,{className:"h-3 w-3 mr-1"}),"删除"]})]})]},ee.id))}),u>0&&e.jsxs("div",{className:"flex flex-col sm:flex-row items-center justify-between gap-4 px-4 py-3 border-t",children:[e.jsxs("div",{className:"text-sm text-muted-foreground",children:["共 ",u," 条记录,第 ",h," / ",Math.ceil(u/p)," 页"]}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(_,{variant:"outline",size:"sm",onClick:()=>f(1),disabled:h===1,className:"hidden sm:flex",children:e.jsx(gn,{className:"h-4 w-4"})}),e.jsxs(_,{variant:"outline",size:"sm",onClick:()=>f(h-1),disabled:h===1,children:[e.jsx(Aa,{className:"h-4 w-4 sm:mr-1"}),e.jsx("span",{className:"hidden sm:inline",children:"上一页"})]}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(le,{type:"number",value:ve,onChange:ee=>je(ee.target.value),onKeyDown:ee=>ee.key==="Enter"&&ns(),placeholder:h.toString(),className:"w-16 h-8 text-center",min:1,max:Math.ceil(u/p)}),e.jsx(_,{variant:"outline",size:"sm",onClick:ns,disabled:!ve,className:"h-8",children:"跳转"})]}),e.jsxs(_,{variant:"outline",size:"sm",onClick:()=>f(h+1),disabled:h>=Math.ceil(u/p),children:[e.jsx("span",{className:"hidden sm:inline",children:"下一页"}),e.jsx(Zt,{className:"h-4 w-4 sm:ml-1"})]}),e.jsx(_,{variant:"outline",size:"sm",onClick:()=>f(Math.ceil(u/p)),disabled:h>=Math.ceil(u/p),className:"hidden sm:flex",children:e.jsx(jn,{className:"h-4 w-4"})})]})]})]})]})}),e.jsx(I4,{jargon:D,open:P,onOpenChange:M}),e.jsx(P4,{open:F,onOpenChange:L,chatList:B,onSuccess:()=>{_e(),pe(),L(!1)}}),e.jsx(H4,{jargon:D,open:T,onOpenChange:A,chatList:B,onSuccess:()=>{_e(),pe(),A(!1)}}),e.jsx(vs,{open:!!J,onOpenChange:()=>U(null),children:e.jsxs(ds,{children:[e.jsxs(us,{children:[e.jsx(xs,{children:"确认删除"}),e.jsxs(hs,{children:['确定要删除黑话 "',J?.content,'" 吗?此操作不可撤销。']})]}),e.jsxs(ms,{children:[e.jsx(ps,{children:"取消"}),e.jsx(fs,{onClick:()=>J&&H(J),className:"bg-destructive text-destructive-foreground hover:bg-destructive/90",children:"删除"})]})]})}),e.jsx(vs,{open:he,onOpenChange:ne,children:e.jsxs(ds,{children:[e.jsxs(us,{children:[e.jsx(xs,{children:"确认批量删除"}),e.jsxs(hs,{children:["您即将删除 ",ue.size," 个黑话,此操作无法撤销。确定要继续吗?"]})]}),e.jsxs(ms,{children:[e.jsx(ps,{children:"取消"}),e.jsx(fs,{onClick:Z,className:"bg-destructive text-destructive-foreground hover:bg-destructive/90",children:"确认删除"})]})]})})]})}function I4({jargon:l,open:n,onOpenChange:i}){return l?e.jsx(Is,{open:n,onOpenChange:i,children:e.jsxs(Os,{className:"max-w-2xl max-h-[80vh] grid grid-rows-[auto_1fr_auto] overflow-hidden",children:[e.jsxs(Ds,{children:[e.jsx(Rs,{children:"黑话详情"}),e.jsx(Ks,{children:"查看黑话的完整信息"})]}),e.jsx(Ye,{className:"h-full pr-4",children:e.jsxs("div",{className:"space-y-4 pb-2",children:[e.jsxs("div",{className:"grid grid-cols-2 gap-4",children:[e.jsx(Dm,{icon:Gr,label:"记录ID",value:l.id.toString(),mono:!0}),e.jsx(Dm,{label:"使用次数",value:l.count.toString()})]}),e.jsxs("div",{className:"space-y-1",children:[e.jsx(E,{className:"text-xs text-muted-foreground",children:"内容"}),e.jsx("div",{className:"text-sm p-2 bg-muted rounded break-all whitespace-pre-wrap",children:l.content})]}),l.raw_content&&e.jsxs("div",{className:"space-y-1",children:[e.jsx(E,{className:"text-xs text-muted-foreground",children:"原始内容"}),e.jsx("div",{className:"text-sm p-2 bg-muted rounded break-all",children:(()=>{try{const c=JSON.parse(l.raw_content);return Array.isArray(c)?c.map((u,x)=>e.jsxs("div",{children:[x>0&&e.jsx("hr",{className:"my-3 border-border"}),e.jsx("div",{className:"whitespace-pre-wrap",children:u})]},x)):e.jsx("div",{className:"whitespace-pre-wrap",children:l.raw_content})}catch{return e.jsx("div",{className:"whitespace-pre-wrap",children:l.raw_content})}})()})]}),e.jsxs("div",{className:"space-y-1",children:[e.jsx(E,{className:"text-xs text-muted-foreground",children:"含义"}),e.jsx("div",{className:"text-sm p-2 bg-muted rounded break-all",children:l.meaning?e.jsx(tx,{content:l.meaning}):"-"})]}),e.jsxs("div",{className:"grid grid-cols-2 gap-4",children:[e.jsx(Dm,{label:"聊天",value:l.chat_name||l.chat_id}),e.jsxs("div",{className:"space-y-1",children:[e.jsx(E,{className:"text-xs text-muted-foreground",children:"状态"}),e.jsxs("div",{className:"flex items-center gap-2",children:[l.is_jargon===!0&&e.jsx(Se,{variant:"default",className:"bg-green-600",children:"是黑话"}),l.is_jargon===!1&&e.jsx(Se,{variant:"secondary",children:"非黑话"}),l.is_jargon===null&&e.jsx(Se,{variant:"outline",children:"未判定"}),l.is_global&&e.jsx(Se,{variant:"outline",className:"border-blue-500 text-blue-500",children:"全局"}),l.is_complete&&e.jsx(Se,{variant:"outline",className:"border-purple-500 text-purple-500",children:"推断完成"})]})]})]}),l.inference_with_context&&e.jsxs("div",{className:"space-y-1",children:[e.jsx(E,{className:"text-xs text-muted-foreground",children:"上下文推断结果"}),e.jsx("div",{className:"p-2 bg-muted rounded break-all whitespace-pre-wrap font-mono text-xs max-h-[200px] overflow-y-auto",children:l.inference_with_context})]}),l.inference_content_only&&e.jsxs("div",{className:"space-y-1",children:[e.jsx(E,{className:"text-xs text-muted-foreground",children:"纯词条推断结果"}),e.jsx("div",{className:"p-2 bg-muted rounded break-all whitespace-pre-wrap font-mono text-xs max-h-[200px] overflow-y-auto",children:l.inference_content_only})]})]})}),e.jsx(st,{className:"flex-shrink-0",children:e.jsx(_,{onClick:()=>i(!1),children:"关闭"})})]})}):null}function Dm({icon:l,label:n,value:i,mono:c=!1}){return e.jsxs("div",{className:"space-y-1",children:[e.jsxs(E,{className:"text-xs text-muted-foreground flex items-center gap-1",children:[l&&e.jsx(l,{className:"h-3 w-3"}),n]}),e.jsx("div",{className:I("text-sm",c&&"font-mono",!i&&"text-muted-foreground"),children:i||"-"})]})}function P4({open:l,onOpenChange:n,chatList:i,onSuccess:c}){const[u,x]=d.useState({content:"",meaning:"",chat_id:"",is_global:!1}),[h,f]=d.useState(!1),{toast:p}=Zs(),g=async()=>{if(!u.content||!u.chat_id){p({title:"验证失败",description:"请填写必填字段:内容和聊天",variant:"destructive"});return}try{f(!0),await O4(u),p({title:"创建成功",description:"黑话已创建"}),x({content:"",meaning:"",chat_id:"",is_global:!1}),c()}catch(N){p({title:"创建失败",description:N instanceof Error?N.message:"无法创建黑话",variant:"destructive"})}finally{f(!1)}};return e.jsx(Is,{open:l,onOpenChange:n,children:e.jsxs(Os,{className:"max-w-2xl max-h-[80vh] overflow-y-auto",children:[e.jsxs(Ds,{children:[e.jsx(Rs,{children:"新增黑话"}),e.jsx(Ks,{children:"创建新的黑话记录"})]}),e.jsxs("div",{className:"space-y-4",children:[e.jsxs("div",{className:"space-y-2",children:[e.jsxs(E,{htmlFor:"content",children:["内容 ",e.jsx("span",{className:"text-destructive",children:"*"})]}),e.jsx(le,{id:"content",value:u.content,onChange:N=>x({...u,content:N.target.value}),placeholder:"输入黑话内容"})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsx(E,{htmlFor:"meaning",children:"含义"}),e.jsx(ot,{id:"meaning",value:u.meaning||"",onChange:N=>x({...u,meaning:N.target.value}),placeholder:"输入黑话含义(可选)",rows:3})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsxs(E,{htmlFor:"chat_id",children:["聊天 ",e.jsx("span",{className:"text-destructive",children:"*"})]}),e.jsxs(Ie,{value:u.chat_id,onValueChange:N=>x({...u,chat_id:N}),children:[e.jsx($e,{children:e.jsx(Pe,{placeholder:"选择关联的聊天"})}),e.jsx(Be,{children:i.map(N=>e.jsx(X,{value:N.chat_id,children:N.chat_name},N.chat_id))})]})]}),e.jsxs("div",{className:"flex items-center space-x-2",children:[e.jsx(Fe,{id:"is_global",checked:u.is_global,onCheckedChange:N=>x({...u,is_global:N})}),e.jsx(E,{htmlFor:"is_global",children:"设为全局黑话"})]})]}),e.jsxs(st,{children:[e.jsx(_,{variant:"outline",onClick:()=>n(!1),children:"取消"}),e.jsx(_,{onClick:g,disabled:h,children:h?"创建中...":"创建"})]})]})})}function H4({jargon:l,open:n,onOpenChange:i,chatList:c,onSuccess:u}){const[x,h]=d.useState({}),[f,p]=d.useState(!1),{toast:g}=Zs();d.useEffect(()=>{l&&h({content:l.content,meaning:l.meaning||"",chat_id:l.stream_id||l.chat_id,is_global:l.is_global,is_jargon:l.is_jargon})},[l]);const N=async()=>{if(l)try{p(!0),await D4(l.id,x),g({title:"保存成功",description:"黑话已更新"}),u()}catch(v){g({title:"保存失败",description:v instanceof Error?v.message:"无法更新黑话",variant:"destructive"})}finally{p(!1)}};return l?e.jsx(Is,{open:n,onOpenChange:i,children:e.jsxs(Os,{className:"max-w-2xl max-h-[80vh] overflow-y-auto",children:[e.jsxs(Ds,{children:[e.jsx(Rs,{children:"编辑黑话"}),e.jsx(Ks,{children:"修改黑话的信息"})]}),e.jsxs("div",{className:"space-y-4",children:[e.jsxs("div",{className:"space-y-2",children:[e.jsx(E,{htmlFor:"edit_content",children:"内容"}),e.jsx(le,{id:"edit_content",value:x.content||"",onChange:v=>h({...x,content:v.target.value}),placeholder:"输入黑话内容"})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsx(E,{htmlFor:"edit_meaning",children:"含义"}),e.jsx(ot,{id:"edit_meaning",value:x.meaning||"",onChange:v=>h({...x,meaning:v.target.value}),placeholder:"输入黑话含义",rows:3})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsx(E,{htmlFor:"edit_chat_id",children:"聊天"}),e.jsxs(Ie,{value:x.chat_id||"",onValueChange:v=>h({...x,chat_id:v}),children:[e.jsx($e,{children:e.jsx(Pe,{placeholder:"选择关联的聊天"})}),e.jsx(Be,{children:c.map(v=>e.jsx(X,{value:v.chat_id,children:v.chat_name},v.chat_id))})]})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsx(E,{children:"黑话状态"}),e.jsxs(Ie,{value:x.is_jargon===null?"null":x.is_jargon?.toString()||"null",onValueChange:v=>h({...x,is_jargon:v==="null"?null:v==="true"}),children:[e.jsx($e,{children:e.jsx(Pe,{})}),e.jsxs(Be,{children:[e.jsx(X,{value:"null",children:"未判定"}),e.jsx(X,{value:"true",children:"是黑话"}),e.jsx(X,{value:"false",children:"非黑话"})]})]})]}),e.jsxs("div",{className:"flex items-center space-x-2",children:[e.jsx(Fe,{id:"edit_is_global",checked:x.is_global,onCheckedChange:v=>h({...x,is_global:v})}),e.jsx(E,{htmlFor:"edit_is_global",children:"全局黑话"})]})]}),e.jsxs(st,{children:[e.jsx(_,{variant:"outline",onClick:()=>i(!1),children:"取消"}),e.jsx(_,{onClick:N,disabled:f,children:f?"保存中...":"保存"})]})]})}):null}const Yr="/api/webui/person";async function F4(l){const n=new URLSearchParams;l.page&&n.append("page",l.page.toString()),l.page_size&&n.append("page_size",l.page_size.toString()),l.search&&n.append("search",l.search),l.is_known!==void 0&&n.append("is_known",l.is_known.toString()),l.platform&&n.append("platform",l.platform);const i=await we(`${Yr}/list?${n}`,{headers:Fs()});if(!i.ok){const c=await i.json();throw new Error(c.detail||"获取人物列表失败")}return i.json()}async function G4(l){const n=await we(`${Yr}/${l}`,{headers:Fs()});if(!n.ok){const i=await n.json();throw new Error(i.detail||"获取人物详情失败")}return n.json()}async function V4(l,n){const i=await we(`${Yr}/${l}`,{method:"PATCH",headers:Fs(),body:JSON.stringify(n)});if(!i.ok){const c=await i.json();throw new Error(c.detail||"更新人物信息失败")}return i.json()}async function q4(l){const n=await we(`${Yr}/${l}`,{method:"DELETE",headers:Fs()});if(!n.ok){const i=await n.json();throw new Error(i.detail||"删除人物信息失败")}return n.json()}async function K4(){const l=await we(`${Yr}/stats/summary`,{headers:Fs()});if(!l.ok){const n=await l.json();throw new Error(n.detail||"获取统计数据失败")}return l.json()}async function Q4(l){const n=await we(`${Yr}/batch/delete`,{method:"POST",headers:Fs(),body:JSON.stringify({person_ids:l})});if(!n.ok){const i=await n.json();throw new Error(i.detail||"批量删除失败")}return n.json()}function Y4(){const[l,n]=d.useState([]),[i,c]=d.useState(!0),[u,x]=d.useState(0),[h,f]=d.useState(1),[p,g]=d.useState(20),[N,v]=d.useState(""),[y,w]=d.useState(void 0),[b,R]=d.useState(void 0),[D,S]=d.useState(null),[P,M]=d.useState(!1),[T,A]=d.useState(!1),[F,L]=d.useState(null),[J,U]=d.useState({total:0,known:0,unknown:0,platforms:{}}),[ue,xe]=d.useState(new Set),[he,ne]=d.useState(!1),[ve,je]=d.useState(""),{toast:z}=Zs(),V=async()=>{try{c(!0);const Z=await F4({page:h,page_size:p,search:N||void 0,is_known:y,platform:b});n(Z.data),x(Z.total)}catch(Z){z({title:"加载失败",description:Z instanceof Error?Z.message:"无法加载人物信息",variant:"destructive"})}finally{c(!1)}},B=async()=>{try{const Z=await K4();Z?.data&&U(Z.data)}catch(Z){console.error("加载统计数据失败:",Z)}};d.useEffect(()=>{V(),B()},[h,p,N,y,b]);const oe=async Z=>{try{const Oe=await G4(Z.person_id);S(Oe.data),M(!0)}catch(Oe){z({title:"加载详情失败",description:Oe instanceof Error?Oe.message:"无法加载人物详情",variant:"destructive"})}},K=Z=>{S(Z),A(!0)},_e=async Z=>{try{await q4(Z.person_id),z({title:"删除成功",description:`已删除人物信息: ${Z.person_name||Z.nickname||Z.user_id}`}),L(null),V(),B()}catch(Oe){z({title:"删除失败",description:Oe instanceof Error?Oe.message:"无法删除人物信息",variant:"destructive"})}},pe=d.useMemo(()=>Object.keys(J.platforms),[J.platforms]),ke=Z=>{const Oe=new Set(ue);Oe.has(Z)?Oe.delete(Z):Oe.add(Z),xe(Oe)},O=()=>{ue.size===l.length&&l.length>0?xe(new Set):xe(new Set(l.map(Z=>Z.person_id)))},k=()=>{if(ue.size===0){z({title:"未选择任何人物",description:"请先选择要删除的人物",variant:"destructive"});return}ne(!0)},H=async()=>{try{const Z=await Q4(Array.from(ue));z({title:"批量删除完成",description:Z.message}),xe(new Set),ne(!1),V(),B()}catch(Z){z({title:"批量删除失败",description:Z instanceof Error?Z.message:"批量删除失败",variant:"destructive"})}},se=()=>{const Z=parseInt(ve),Oe=Math.ceil(u/p);Z>=1&&Z<=Oe?(f(Z),je("")):z({title:"无效的页码",description:`请输入1-${Oe}之间的页码`,variant:"destructive"})},Ee=Z=>Z?new Date(Z*1e3).toLocaleString("zh-CN"):"-";return e.jsxs("div",{className:"h-[calc(100vh-4rem)] flex flex-col p-4 sm:p-6",children:[e.jsx("div",{className:"mb-4 sm:mb-6",children:e.jsx("div",{className:"flex flex-col sm:flex-row sm:items-center justify-between gap-4",children:e.jsxs("div",{children:[e.jsxs("h1",{className:"text-2xl sm:text-3xl font-bold flex items-center gap-2",children:[e.jsx(sc,{className:"h-8 w-8",strokeWidth:2}),"人物信息管理"]}),e.jsx("p",{className:"text-muted-foreground mt-1 text-sm sm:text-base",children:"管理麦麦认识的所有人物信息"})]})})}),e.jsx(Ye,{className:"flex-1",children:e.jsxs("div",{className:"space-y-4 sm:space-y-6 pr-4",children:[e.jsxs("div",{className:"grid grid-cols-1 sm:grid-cols-3 gap-4",children:[e.jsxs("div",{className:"rounded-lg border bg-card p-4",children:[e.jsx("div",{className:"text-sm text-muted-foreground",children:"总人数"}),e.jsx("div",{className:"text-2xl font-bold mt-1",children:J.total})]}),e.jsxs("div",{className:"rounded-lg border bg-card p-4",children:[e.jsx("div",{className:"text-sm text-muted-foreground",children:"已认识"}),e.jsx("div",{className:"text-2xl font-bold mt-1 text-green-600",children:J.known})]}),e.jsxs("div",{className:"rounded-lg border bg-card p-4",children:[e.jsx("div",{className:"text-sm text-muted-foreground",children:"未认识"}),e.jsx("div",{className:"text-2xl font-bold mt-1 text-muted-foreground",children:J.unknown})]})]}),e.jsxs("div",{className:"rounded-lg border bg-card p-4",children:[e.jsxs("div",{className:"grid grid-cols-1 sm:grid-cols-4 gap-4",children:[e.jsxs("div",{className:"sm:col-span-2",children:[e.jsx(E,{htmlFor:"search",children:"搜索"}),e.jsxs("div",{className:"relative mt-1.5",children:[e.jsx(Tt,{className:"absolute left-2.5 top-2.5 h-4 w-4 text-muted-foreground"}),e.jsx(le,{id:"search",placeholder:"搜索名称、昵称或用户ID...",value:N,onChange:Z=>v(Z.target.value),className:"pl-9"})]})]}),e.jsxs("div",{children:[e.jsx(E,{htmlFor:"filter-known",children:"认识状态"}),e.jsxs(Ie,{value:y===void 0?"all":y.toString(),onValueChange:Z=>{w(Z==="all"?void 0:Z==="true"),f(1)},children:[e.jsx($e,{id:"filter-known",className:"mt-1.5",children:e.jsx(Pe,{})}),e.jsxs(Be,{children:[e.jsx(X,{value:"all",children:"全部"}),e.jsx(X,{value:"true",children:"已认识"}),e.jsx(X,{value:"false",children:"未认识"})]})]})]}),e.jsxs("div",{children:[e.jsx(E,{htmlFor:"filter-platform",children:"平台"}),e.jsxs(Ie,{value:b||"all",onValueChange:Z=>{R(Z==="all"?void 0:Z),f(1)},children:[e.jsx($e,{id:"filter-platform",className:"mt-1.5",children:e.jsx(Pe,{})}),e.jsxs(Be,{children:[e.jsx(X,{value:"all",children:"全部平台"}),pe.map(Z=>e.jsxs(X,{value:Z,children:[Z," (",J.platforms[Z],")"]},Z))]})]})]})]}),e.jsxs("div",{className:"flex flex-col sm:flex-row items-start sm:items-center justify-between gap-3 mt-4 pt-4 border-t",children:[e.jsx("div",{className:"flex items-center gap-2 text-sm text-muted-foreground",children:ue.size>0&&e.jsxs("span",{children:["已选择 ",ue.size," 个人物"]})}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(E,{htmlFor:"page-size",className:"text-sm whitespace-nowrap",children:"每页显示"}),e.jsxs(Ie,{value:p.toString(),onValueChange:Z=>{g(parseInt(Z)),f(1),xe(new Set)},children:[e.jsx($e,{id:"page-size",className:"w-20",children:e.jsx(Pe,{})}),e.jsxs(Be,{children:[e.jsx(X,{value:"10",children:"10"}),e.jsx(X,{value:"20",children:"20"}),e.jsx(X,{value:"50",children:"50"}),e.jsx(X,{value:"100",children:"100"})]})]}),ue.size>0&&e.jsxs(e.Fragment,{children:[e.jsx(_,{variant:"outline",size:"sm",onClick:()=>xe(new Set),children:"取消选择"}),e.jsxs(_,{variant:"destructive",size:"sm",onClick:k,children:[e.jsx(ls,{className:"h-4 w-4 mr-1"}),"批量删除"]})]})]})]})]}),e.jsxs("div",{className:"rounded-lg border bg-card",children:[e.jsx("div",{className:"hidden md:block",children:e.jsxs(Rl,{children:[e.jsx(Ll,{children:e.jsxs(ut,{children:[e.jsx(Ze,{className:"w-12",children:e.jsx(qs,{checked:l.length>0&&ue.size===l.length,onCheckedChange:O,"aria-label":"全选"})}),e.jsx(Ze,{children:"状态"}),e.jsx(Ze,{children:"名称"}),e.jsx(Ze,{children:"昵称"}),e.jsx(Ze,{children:"平台"}),e.jsx(Ze,{children:"用户ID"}),e.jsx(Ze,{children:"最后更新"}),e.jsx(Ze,{className:"text-right",children:"操作"})]})}),e.jsx(Ul,{children:i?e.jsx(ut,{children:e.jsx(qe,{colSpan:8,className:"text-center py-8 text-muted-foreground",children:"加载中..."})}):l.length===0?e.jsx(ut,{children:e.jsx(qe,{colSpan:8,className:"text-center py-8 text-muted-foreground",children:"暂无数据"})}):l.map(Z=>e.jsxs(ut,{children:[e.jsx(qe,{children:e.jsx(qs,{checked:ue.has(Z.person_id),onCheckedChange:()=>ke(Z.person_id),"aria-label":`选择 ${Z.person_name||Z.nickname||Z.user_id}`})}),e.jsx(qe,{children:e.jsx("div",{className:I("inline-flex items-center gap-1 px-2 py-1 rounded-full text-xs font-medium",Z.is_known?"bg-green-100 text-green-700 dark:bg-green-900/30 dark:text-green-400":"bg-gray-100 text-gray-700 dark:bg-gray-800 dark:text-gray-400"),children:Z.is_known?"已认识":"未认识"})}),e.jsx(qe,{className:"font-medium",children:Z.person_name||e.jsx("span",{className:"text-muted-foreground",children:"-"})}),e.jsx(qe,{children:Z.nickname||"-"}),e.jsx(qe,{children:Z.platform}),e.jsx(qe,{className:"font-mono text-sm",children:Z.user_id}),e.jsx(qe,{className:"text-sm text-muted-foreground",children:Ee(Z.last_know)}),e.jsx(qe,{className:"text-right",children:e.jsxs("div",{className:"flex justify-end gap-2",children:[e.jsxs(_,{variant:"default",size:"sm",onClick:()=>oe(Z),children:[e.jsx(ia,{className:"h-4 w-4 mr-1"}),"详情"]}),e.jsxs(_,{variant:"default",size:"sm",onClick:()=>K(Z),children:[e.jsx(qn,{className:"h-4 w-4 mr-1"}),"编辑"]}),e.jsxs(_,{size:"sm",onClick:()=>L(Z),className:"bg-red-600 hover:bg-red-700 text-white",children:[e.jsx(ls,{className:"h-4 w-4 mr-1"}),"删除"]})]})})]},Z.id))})]})}),e.jsx("div",{className:"md:hidden space-y-3 p-4",children:i?e.jsx("div",{className:"text-center py-8 text-muted-foreground",children:"加载中..."}):l.length===0?e.jsx("div",{className:"text-center py-8 text-muted-foreground",children:"暂无数据"}):l.map(Z=>e.jsxs("div",{className:"rounded-lg border bg-card p-4 space-y-3 overflow-hidden",children:[e.jsxs("div",{className:"flex items-start gap-3",children:[e.jsx(qs,{checked:ue.has(Z.person_id),onCheckedChange:()=>ke(Z.person_id),className:"mt-1"}),e.jsxs("div",{className:"flex-1 min-w-0",children:[e.jsx("div",{className:I("inline-flex items-center gap-1 px-2 py-1 rounded-full text-xs font-medium mb-2",Z.is_known?"bg-green-100 text-green-700 dark:bg-green-900/30 dark:text-green-400":"bg-gray-100 text-gray-700 dark:bg-gray-800 dark:text-gray-400"),children:Z.is_known?"已认识":"未认识"}),e.jsx("h3",{className:"font-semibold text-sm line-clamp-1 w-full break-all",children:Z.person_name||e.jsx("span",{className:"text-muted-foreground",children:"未命名"})}),Z.nickname&&e.jsxs("p",{className:"text-xs text-muted-foreground mt-1 line-clamp-1 w-full break-all",children:["昵称: ",Z.nickname]})]})]}),e.jsxs("div",{className:"grid grid-cols-2 gap-2 text-sm",children:[e.jsxs("div",{children:[e.jsx("div",{className:"text-xs text-muted-foreground mb-1",children:"平台"}),e.jsx("p",{className:"font-medium text-xs",children:Z.platform})]}),e.jsxs("div",{children:[e.jsx("div",{className:"text-xs text-muted-foreground mb-1",children:"用户ID"}),e.jsx("p",{className:"font-mono text-xs truncate",title:Z.user_id,children:Z.user_id})]}),e.jsxs("div",{className:"col-span-2",children:[e.jsx("div",{className:"text-xs text-muted-foreground mb-1",children:"最后更新"}),e.jsx("p",{className:"text-xs",children:Ee(Z.last_know)})]})]}),e.jsxs("div",{className:"flex flex-wrap gap-1 pt-2 border-t overflow-hidden",children:[e.jsxs(_,{variant:"outline",size:"sm",onClick:()=>oe(Z),className:"text-xs px-2 py-1 h-auto flex-shrink-0",children:[e.jsx(ia,{className:"h-3 w-3 mr-1"}),"查看"]}),e.jsxs(_,{variant:"outline",size:"sm",onClick:()=>K(Z),className:"text-xs px-2 py-1 h-auto flex-shrink-0",children:[e.jsx(qn,{className:"h-3 w-3 mr-1"}),"编辑"]}),e.jsxs(_,{variant:"outline",size:"sm",onClick:()=>L(Z),className:"text-xs px-2 py-1 h-auto flex-shrink-0 text-destructive hover:text-destructive",children:[e.jsx(ls,{className:"h-3 w-3 mr-1"}),"删除"]})]})]},Z.id))}),u>0&&e.jsxs("div",{className:"flex flex-col sm:flex-row items-center justify-between gap-4 px-4 py-3 border-t",children:[e.jsxs("div",{className:"text-sm text-muted-foreground",children:["共 ",u," 条记录,第 ",h," / ",Math.ceil(u/p)," 页"]}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(_,{variant:"outline",size:"sm",onClick:()=>f(1),disabled:h===1,className:"hidden sm:flex",children:e.jsx(gn,{className:"h-4 w-4"})}),e.jsxs(_,{variant:"outline",size:"sm",onClick:()=>f(h-1),disabled:h===1,children:[e.jsx(Aa,{className:"h-4 w-4 sm:mr-1"}),e.jsx("span",{className:"hidden sm:inline",children:"上一页"})]}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(le,{type:"number",value:ve,onChange:Z=>je(Z.target.value),onKeyDown:Z=>Z.key==="Enter"&&se(),placeholder:h.toString(),className:"w-16 h-8 text-center",min:1,max:Math.ceil(u/p)}),e.jsx(_,{variant:"outline",size:"sm",onClick:se,disabled:!ve,className:"h-8",children:"跳转"})]}),e.jsxs(_,{variant:"outline",size:"sm",onClick:()=>f(h+1),disabled:h>=Math.ceil(u/p),children:[e.jsx("span",{className:"hidden sm:inline",children:"下一页"}),e.jsx(Zt,{className:"h-4 w-4 sm:ml-1"})]}),e.jsx(_,{variant:"outline",size:"sm",onClick:()=>f(Math.ceil(u/p)),disabled:h>=Math.ceil(u/p),className:"hidden sm:flex",children:e.jsx(jn,{className:"h-4 w-4"})})]})]})]})]})}),e.jsx(J4,{person:D,open:P,onOpenChange:M}),e.jsx(X4,{person:D,open:T,onOpenChange:A,onSuccess:()=>{V(),B(),A(!1)}}),e.jsx(vs,{open:!!F,onOpenChange:()=>L(null),children:e.jsxs(ds,{children:[e.jsxs(us,{children:[e.jsx(xs,{children:"确认删除"}),e.jsxs(hs,{children:['确定要删除人物信息 "',F?.person_name||F?.nickname||F?.user_id,'" 吗? 此操作不可撤销。']})]}),e.jsxs(ms,{children:[e.jsx(ps,{children:"取消"}),e.jsx(fs,{onClick:()=>F&&_e(F),className:"bg-destructive text-destructive-foreground hover:bg-destructive/90",children:"删除"})]})]})}),e.jsx(vs,{open:he,onOpenChange:ne,children:e.jsxs(ds,{children:[e.jsxs(us,{children:[e.jsx(xs,{children:"确认批量删除"}),e.jsxs(hs,{children:["确定要删除选中的 ",ue.size," 个人物信息吗? 此操作不可撤销。"]})]}),e.jsxs(ms,{children:[e.jsx(ps,{children:"取消"}),e.jsx(fs,{onClick:H,className:"bg-destructive text-destructive-foreground hover:bg-destructive/90",children:"批量删除"})]})]})})]})}function J4({person:l,open:n,onOpenChange:i}){if(!l)return null;const c=u=>u?new Date(u*1e3).toLocaleString("zh-CN"):"-";return e.jsx(Is,{open:n,onOpenChange:i,children:e.jsxs(Os,{className:"max-w-2xl max-h-[80vh] overflow-y-auto",children:[e.jsxs(Ds,{children:[e.jsx(Rs,{children:"人物详情"}),e.jsxs(Ks,{children:["查看 ",l.person_name||l.nickname||l.user_id," 的完整信息"]})]}),e.jsxs("div",{className:"space-y-4",children:[e.jsxs("div",{className:"grid grid-cols-2 gap-4",children:[e.jsx(zl,{icon:fn,label:"人物名称",value:l.person_name}),e.jsx(zl,{icon:Ma,label:"昵称",value:l.nickname}),e.jsx(zl,{icon:Gr,label:"用户ID",value:l.user_id,mono:!0}),e.jsx(zl,{icon:Gr,label:"人物ID",value:l.person_id,mono:!0}),e.jsx(zl,{label:"平台",value:l.platform}),e.jsx(zl,{label:"状态",value:l.is_known?"已认识":"未认识"})]}),l.name_reason&&e.jsxs("div",{className:"rounded-lg border bg-muted/50 p-3",children:[e.jsx(E,{className:"text-xs text-muted-foreground",children:"名称设定原因"}),e.jsx("p",{className:"mt-1 text-sm",children:l.name_reason})]}),l.memory_points&&e.jsxs("div",{className:"rounded-lg border bg-muted/50 p-3",children:[e.jsx(E,{className:"text-xs text-muted-foreground",children:"个人印象"}),e.jsx("p",{className:"mt-1 text-sm whitespace-pre-wrap",children:l.memory_points})]}),l.group_nick_name&&l.group_nick_name.length>0&&e.jsxs("div",{className:"rounded-lg border bg-muted/50 p-3",children:[e.jsx(E,{className:"text-xs text-muted-foreground",children:"群昵称"}),e.jsx("div",{className:"mt-2 space-y-1",children:l.group_nick_name.map((u,x)=>e.jsxs("div",{className:"text-sm flex items-center gap-2",children:[e.jsx("span",{className:"font-mono text-xs text-muted-foreground",children:u.group_id}),e.jsx("span",{children:"→"}),e.jsx("span",{children:u.group_nick_name})]},x))})]}),e.jsxs("div",{className:"grid grid-cols-3 gap-4",children:[e.jsx(zl,{icon:na,label:"认识时间",value:c(l.know_times)}),e.jsx(zl,{icon:na,label:"首次记录",value:c(l.know_since)}),e.jsx(zl,{icon:na,label:"最后更新",value:c(l.last_know)})]})]}),e.jsx(st,{children:e.jsx(_,{onClick:()=>i(!1),children:"关闭"})})]})})}function zl({icon:l,label:n,value:i,mono:c=!1}){return e.jsxs("div",{className:"space-y-1",children:[e.jsxs(E,{className:"text-xs text-muted-foreground flex items-center gap-1",children:[l&&e.jsx(l,{className:"h-3 w-3"}),n]}),e.jsx("div",{className:I("text-sm",c&&"font-mono",!i&&"text-muted-foreground"),children:i||"-"})]})}function X4({person:l,open:n,onOpenChange:i,onSuccess:c}){const[u,x]=d.useState({}),[h,f]=d.useState(!1),{toast:p}=Zs();d.useEffect(()=>{l&&x({person_name:l.person_name||"",name_reason:l.name_reason||"",nickname:l.nickname||"",is_known:l.is_known})},[l]);const g=async()=>{if(l)try{f(!0),await V4(l.person_id,u),p({title:"保存成功",description:"人物信息已更新"}),c()}catch(N){p({title:"保存失败",description:N instanceof Error?N.message:"无法更新人物信息",variant:"destructive"})}finally{f(!1)}};return l?e.jsx(Is,{open:n,onOpenChange:i,children:e.jsxs(Os,{className:"max-w-2xl max-h-[80vh] overflow-y-auto",children:[e.jsxs(Ds,{children:[e.jsx(Rs,{children:"编辑人物信息"}),e.jsxs(Ks,{children:["修改 ",l.person_name||l.nickname||l.user_id," 的信息"]})]}),e.jsxs("div",{className:"space-y-4",children:[e.jsxs("div",{className:"grid grid-cols-2 gap-4",children:[e.jsxs("div",{className:"space-y-2",children:[e.jsx(E,{htmlFor:"person_name",children:"人物名称"}),e.jsx(le,{id:"person_name",value:u.person_name||"",onChange:N=>x({...u,person_name:N.target.value}),placeholder:"为这个人设置一个名称"})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsx(E,{htmlFor:"nickname",children:"昵称"}),e.jsx(le,{id:"nickname",value:u.nickname||"",onChange:N=>x({...u,nickname:N.target.value}),placeholder:"昵称"})]})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsx(E,{htmlFor:"name_reason",children:"名称设定原因"}),e.jsx(ot,{id:"name_reason",value:u.name_reason||"",onChange:N=>x({...u,name_reason:N.target.value}),placeholder:"为什么这样称呼这个人?",rows:2})]}),e.jsxs("div",{className:"flex items-center justify-between rounded-lg border p-3",children:[e.jsxs("div",{children:[e.jsx(E,{htmlFor:"is_known",className:"text-base font-medium",children:"已认识"}),e.jsx("p",{className:"text-sm text-muted-foreground",children:"标记是否已经认识这个人"})]}),e.jsx(Fe,{id:"is_known",checked:u.is_known,onCheckedChange:N=>x({...u,is_known:N})})]})]}),e.jsxs(st,{children:[e.jsx(_,{variant:"outline",onClick:()=>i(!1),children:"取消"}),e.jsx(_,{onClick:g,disabled:h,children:h?"保存中...":"保存"})]})]})}):null}var Z4=H_();const Dg=E0(Z4),ox="/api/webui";async function W4(l=100,n="all"){const i=`${ox}/knowledge/graph?limit=${l}&node_type=${n}`,c=await fetch(i);if(!c.ok)throw new Error(`获取知识图谱失败: ${c.status}`);return c.json()}async function ek(){const l=await fetch(`${ox}/knowledge/stats`);if(!l.ok)throw new Error("获取知识图谱统计信息失败");return l.json()}async function sk(l){const n=await fetch(`${ox}/knowledge/search?query=${encodeURIComponent(l)}`);if(!n.ok)throw new Error("搜索知识节点失败");return n.json()}const zv=d.memo(({data:l})=>e.jsxs("div",{className:"px-4 py-2 shadow-md rounded-lg bg-gradient-to-br from-blue-500 to-blue-600 border-2 border-blue-700 min-w-[120px]",children:[e.jsx(Io,{type:"target",position:Po.Top}),e.jsx("div",{className:"font-semibold text-white text-sm truncate max-w-[200px]",title:l.content,children:l.label}),e.jsx(Io,{type:"source",position:Po.Bottom})]}));zv.displayName="EntityNode";const Av=d.memo(({data:l})=>e.jsxs("div",{className:"px-3 py-2 shadow-md rounded-md bg-gradient-to-br from-green-500 to-green-600 border-2 border-green-700 min-w-[100px]",children:[e.jsx(Io,{type:"target",position:Po.Top}),e.jsx("div",{className:"font-medium text-white text-xs truncate max-w-[150px]",title:l.content,children:l.label}),e.jsx(Io,{type:"source",position:Po.Bottom})]}));Av.displayName="ParagraphNode";const tk={entity:zv,paragraph:Av};function ak(l,n){const i=new Dg.graphlib.Graph;i.setDefaultEdgeLabel(()=>({})),i.setGraph({rankdir:"TB",ranksep:100,nodesep:80});const c=[],u=[];return l.forEach(x=>{i.setNode(x.id,{width:150,height:50})}),n.forEach(x=>{i.setEdge(x.source,x.target)}),Dg.layout(i),l.forEach(x=>{const h=i.node(x.id);c.push({id:x.id,type:x.type,position:{x:h.x-75,y:h.y-25},data:{label:x.content.slice(0,20)+(x.content.length>20?"...":""),content:x.content}})}),n.forEach((x,h)=>{const f={id:`edge-${h}`,source:x.source,target:x.target,animated:l.length<=200&&x.weight>5,style:{strokeWidth:Math.min(x.weight/2,5),opacity:.6}};x.weight>10&&l.length<100&&(f.label=`${x.weight.toFixed(0)}`),u.push(f)}),{nodes:c,edges:u}}function lk(){const l=ca(),[n,i]=d.useState(!1),[c,u]=d.useState(null),[x,h]=d.useState(""),[f,p]=d.useState("all"),[g,N]=d.useState(50),[v,y]=d.useState("50"),[w,b]=d.useState(!1),[R,D]=d.useState(!0),[S,P]=d.useState(!1),[M,T]=d.useState(!1),[A,F,L]=F_([]),[J,U,ue]=G_([]),[xe,he]=d.useState(0),[ne,ve]=d.useState(null),[je,z]=d.useState(null),{toast:V}=Zs(),B=d.useCallback(H=>H.type==="entity"?"#6366f1":H.type==="paragraph"?"#10b981":"#6b7280",[]),oe=d.useCallback(async(H=!1)=>{try{if(!H&&g>200){T(!0);return}i(!0);const[se,Ee]=await Promise.all([W4(g,f),ek()]);if(u(Ee),se.nodes.length===0){V({title:"提示",description:"知识库为空,请先导入知识数据"}),F([]),U([]);return}const{nodes:Z,edges:Oe}=ak(se.nodes,se.edges);F(Z),U(Oe),he(Z.length),Ee&&Ee.total_nodes>g&&V({title:"提示",description:`知识图谱包含 ${Ee.total_nodes} 个节点,当前显示 ${Z.length} 个`}),V({title:"加载成功",description:`已加载 ${Z.length} 个节点,${Oe.length} 条边`})}catch(se){console.error("加载知识图谱失败:",se),V({title:"加载失败",description:se instanceof Error?se.message:"未知错误",variant:"destructive"})}finally{i(!1)}},[g,f,V]),K=d.useCallback(async()=>{if(!x.trim()){V({title:"提示",description:"请输入搜索关键词"});return}try{const H=await sk(x);if(H.length===0){V({title:"未找到",description:"没有找到匹配的节点"});return}const se=new Set(H.map(Ee=>Ee.id));F(Ee=>Ee.map(Z=>({...Z,style:{...Z.style,opacity:se.has(Z.id)?1:.3,filter:se.has(Z.id)?"brightness(1.2)":"brightness(0.8)"}}))),V({title:"搜索完成",description:`找到 ${H.length} 个匹配节点`})}catch(H){console.error("搜索失败:",H),V({title:"搜索失败",description:H instanceof Error?H.message:"未知错误",variant:"destructive"})}},[x,V]),_e=d.useCallback(()=>{F(H=>H.map(se=>({...se,style:{...se.style,opacity:1,filter:"brightness(1)"}})))},[]),pe=d.useCallback(()=>{D(!1),P(!0),oe()},[oe]),ke=d.useCallback(()=>{T(!1),setTimeout(()=>{oe(!0)},0)},[oe]),O=d.useCallback((H,se)=>{A.find(Z=>Z.id===se.id)&&ve({id:se.id,type:se.type,content:se.data.content})},[A]);d.useEffect(()=>{R||S&&oe()},[g,f,R,S]);const k=d.useCallback((H,se)=>{const Ee=A.find(ns=>ns.id===se.source),Z=A.find(ns=>ns.id===se.target),Oe=J.find(ns=>ns.id===se.id);Ee&&Z&&Oe&&z({source:{id:Ee.id,type:Ee.type,content:Ee.data.content},target:{id:Z.id,type:Z.type,content:Z.data.content},edge:{source:se.source,target:se.target,weight:parseFloat(se.label||"0")}})},[A,J]);return e.jsxs("div",{className:"h-full flex flex-col",children:[e.jsxs("div",{className:"flex-shrink-0 p-4 border-b bg-background",children:[e.jsxs("div",{className:"flex flex-col sm:flex-row justify-between items-start sm:items-center gap-4",children:[e.jsxs("div",{children:[e.jsx("h1",{className:"text-2xl sm:text-3xl font-bold",children:"麦麦知识库图谱"}),e.jsx("p",{className:"text-muted-foreground mt-1",children:"可视化知识实体与关系网络"})]}),c&&e.jsxs("div",{className:"flex gap-2 flex-wrap",children:[e.jsxs(Se,{variant:"outline",className:"gap-1",children:[e.jsx(Hr,{className:"h-3 w-3"}),"节点: ",c.total_nodes]}),e.jsxs(Se,{variant:"outline",className:"gap-1",children:[e.jsx(Bj,{className:"h-3 w-3"}),"边: ",c.total_edges]}),e.jsxs(Se,{variant:"outline",className:"gap-1",children:[e.jsx(Ht,{className:"h-3 w-3"}),"实体: ",c.entity_nodes]}),e.jsxs(Se,{variant:"outline",className:"gap-1",children:[e.jsx(Ca,{className:"h-3 w-3"}),"段落: ",c.paragraph_nodes]})]})]}),e.jsxs("div",{className:"flex flex-col sm:flex-row gap-2 mt-4",children:[e.jsxs("div",{className:"flex-1 flex gap-2",children:[e.jsx(le,{placeholder:"搜索节点内容...",value:x,onChange:H=>h(H.target.value),onKeyDown:H=>H.key==="Enter"&&K(),className:"flex-1"}),e.jsx(_,{onClick:K,size:"sm",children:e.jsx(Tt,{className:"h-4 w-4"})}),e.jsx(_,{onClick:_e,variant:"outline",size:"sm",children:"重置"})]}),e.jsxs("div",{className:"flex gap-2",children:[e.jsxs(Ie,{value:f,onValueChange:H=>p(H),children:[e.jsx($e,{className:"w-[120px]",children:e.jsx(Pe,{})}),e.jsxs(Be,{children:[e.jsx(X,{value:"all",children:"全部节点"}),e.jsx(X,{value:"entity",children:"仅实体"}),e.jsx(X,{value:"paragraph",children:"仅段落"})]})]}),e.jsxs(Ie,{value:g===1e4?"all":w?"custom":g.toString(),onValueChange:H=>{H==="custom"?(b(!0),y(g.toString())):H==="all"?(b(!1),N(1e4)):(b(!1),N(Number(H)))},children:[e.jsx($e,{className:"w-[120px]",children:e.jsx(Pe,{})}),e.jsxs(Be,{children:[e.jsx(X,{value:"50",children:"50 节点"}),e.jsx(X,{value:"100",children:"100 节点"}),e.jsx(X,{value:"200",children:"200 节点"}),e.jsx(X,{value:"500",children:"500 节点"}),e.jsx(X,{value:"1000",children:"1000 节点"}),e.jsx(X,{value:"all",children:"全部 (最多10000)"}),e.jsx(X,{value:"custom",children:"自定义..."})]})]}),w&&e.jsx(le,{type:"number",min:"50",value:v,onChange:H=>y(H.target.value),onBlur:()=>{const H=parseInt(v);!isNaN(H)&&H>=50?N(H):(y("50"),N(50))},onKeyDown:H=>{if(H.key==="Enter"){const se=parseInt(v);!isNaN(se)&&se>=50?N(se):(y("50"),N(50))}},placeholder:"最少50个",className:"w-[120px]"}),e.jsx(_,{onClick:()=>oe(),variant:"outline",size:"sm",disabled:n,children:e.jsx(dt,{className:I("h-4 w-4",n&&"animate-spin")})})]})]})]}),e.jsx("div",{className:"flex-1 relative",children:n?e.jsx("div",{className:"absolute inset-0 flex items-center justify-center",children:e.jsxs("div",{className:"text-center",children:[e.jsx(dt,{className:"h-8 w-8 animate-spin mx-auto mb-2 text-muted-foreground"}),e.jsx("p",{className:"text-muted-foreground",children:"加载知识图谱中..."})]})}):A.length===0?e.jsx("div",{className:"absolute inset-0 flex items-center justify-center",children:e.jsxs("div",{className:"text-center",children:[e.jsx(Hr,{className:"h-12 w-12 mx-auto mb-4 text-muted-foreground"}),e.jsx("h3",{className:"text-lg font-semibold mb-2",children:"知识库为空"}),e.jsx("p",{className:"text-muted-foreground",children:"请先导入知识数据"})]})}):e.jsxs(V_,{nodes:A,edges:J,onNodesChange:L,onEdgesChange:ue,onNodeClick:O,onEdgeClick:k,nodeTypes:tk,fitView:!0,minZoom:.05,maxZoom:1.5,defaultViewport:{x:0,y:0,zoom:.5},elevateNodesOnSelect:xe<=500,nodesDraggable:xe<=1e3,attributionPosition:"bottom-left",children:[e.jsx(q_,{variant:K_.Dots,gap:12,size:1}),e.jsx(Q_,{}),xe<=500&&e.jsx(Y_,{nodeColor:B,nodeBorderRadius:8,pannable:!0,zoomable:!0}),e.jsxs(J_,{position:"top-right",className:"bg-background/95 backdrop-blur-sm rounded-lg border p-3 shadow-lg",children:[e.jsx("div",{className:"text-sm font-semibold mb-2",children:"图例"}),e.jsxs("div",{className:"space-y-2 text-xs",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("div",{className:"w-4 h-4 rounded bg-gradient-to-br from-blue-500 to-blue-600 border-2 border-blue-700"}),e.jsx("span",{children:"实体节点"})]}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("div",{className:"w-4 h-4 rounded bg-gradient-to-br from-green-500 to-green-600 border-2 border-green-700"}),e.jsx("span",{children:"段落节点"})]}),xe>200&&e.jsxs("div",{className:"mt-2 pt-2 border-t text-yellow-600 dark:text-yellow-500",children:[e.jsx("div",{className:"font-semibold",children:"性能模式"}),e.jsx("div",{children:"已禁用动画"}),xe>500&&e.jsx("div",{children:"已禁用缩略图"})]})]})]})]})}),e.jsx(Is,{open:!!ne,onOpenChange:H=>!H&&ve(null),children:e.jsxs(Os,{className:"max-w-2xl max-h-[80vh] overflow-y-auto",children:[e.jsx(Ds,{children:e.jsx(Rs,{children:"节点详情"})}),ne&&e.jsxs("div",{className:"space-y-4",children:[e.jsx("div",{className:"grid grid-cols-2 gap-4",children:e.jsxs("div",{children:[e.jsx("label",{className:"text-sm font-medium text-muted-foreground",children:"类型"}),e.jsx("div",{className:"mt-1",children:e.jsx(Se,{variant:ne.type==="entity"?"default":"secondary",children:ne.type==="entity"?"🏷️ 实体":"📄 段落"})})]})}),e.jsxs("div",{children:[e.jsx("label",{className:"text-sm font-medium text-muted-foreground",children:"ID"}),e.jsx("code",{className:"mt-1 block p-2 bg-muted rounded text-xs break-all",children:ne.id})]}),e.jsxs("div",{children:[e.jsx("label",{className:"text-sm font-medium text-muted-foreground",children:"内容"}),e.jsx(Ye,{className:"mt-1 h-40 p-3 bg-muted rounded",children:e.jsx("p",{className:"text-sm whitespace-pre-wrap",children:ne.content})})]})]})]})}),e.jsx(Is,{open:!!je,onOpenChange:H=>!H&&z(null),children:e.jsxs(Os,{className:"max-w-2xl max-h-[80vh] overflow-hidden flex flex-col",children:[e.jsx(Ds,{children:e.jsx(Rs,{children:"边详情"})}),je&&e.jsx(Ye,{className:"flex-1 pr-4",children:e.jsxs("div",{className:"space-y-4",children:[e.jsxs("div",{className:"flex items-center gap-4",children:[e.jsxs("div",{className:"flex-1 min-w-0 p-3 bg-blue-50 dark:bg-blue-950 rounded border-2 border-blue-200 dark:border-blue-800",children:[e.jsx("div",{className:"text-xs text-muted-foreground mb-1",children:"源节点"}),e.jsx("div",{className:"font-medium text-sm mb-2 truncate",children:je.source.content}),e.jsxs("code",{className:"text-xs text-muted-foreground truncate block",children:[je.source.id.slice(0,40),"..."]})]}),e.jsx("div",{className:"text-2xl text-muted-foreground flex-shrink-0",children:"→"}),e.jsxs("div",{className:"flex-1 min-w-0 p-3 bg-green-50 dark:bg-green-950 rounded border-2 border-green-200 dark:border-green-800",children:[e.jsx("div",{className:"text-xs text-muted-foreground mb-1",children:"目标节点"}),e.jsx("div",{className:"font-medium text-sm mb-2 truncate",children:je.target.content}),e.jsxs("code",{className:"text-xs text-muted-foreground truncate block",children:[je.target.id.slice(0,40),"..."]})]})]}),e.jsxs("div",{children:[e.jsx("label",{className:"text-sm font-medium text-muted-foreground",children:"权重"}),e.jsx("div",{className:"mt-1",children:e.jsx(Se,{variant:"outline",className:"text-base font-mono",children:je.edge.weight.toFixed(4)})})]})]})})]})}),e.jsx(vs,{open:R,onOpenChange:D,children:e.jsxs(ds,{children:[e.jsxs(us,{children:[e.jsx(xs,{children:"加载知识图谱"}),e.jsxs(hs,{children:["知识图谱的动态展示会消耗较多系统资源。",e.jsx("br",{}),"确定要加载知识图谱吗?"]})]}),e.jsxs(ms,{children:[e.jsx(ps,{onClick:()=>l({to:"/"}),children:"取消 (返回首页)"}),e.jsx(fs,{onClick:pe,children:"确认加载"})]})]})}),e.jsx(vs,{open:M,onOpenChange:T,children:e.jsxs(ds,{children:[e.jsxs(us,{children:[e.jsx(xs,{children:"⚠️ 节点数量较多"}),e.jsx(hs,{asChild:!0,children:e.jsxs("div",{children:[e.jsxs("p",{children:["您正在尝试加载 ",e.jsx("strong",{className:"text-orange-600",children:g>=1e4?"全部 (最多10000个)":g})," 个节点。"]}),e.jsx("p",{className:"mt-4",children:"节点数量过多可能导致:"}),e.jsxs("ul",{className:"list-disc list-inside mt-2 space-y-1",children:[e.jsx("li",{children:"页面加载时间较长"}),e.jsx("li",{children:"浏览器卡顿或崩溃"}),e.jsx("li",{children:"系统资源占用过高"})]}),e.jsx("p",{className:"mt-4",children:"建议先选择较少的节点数量 (50-200 个)。"})]})})]}),e.jsxs(ms,{children:[e.jsx(ps,{onClick:()=>{T(!1),g>200&&(N(50),b(!1))},children:"取消"}),e.jsx(fs,{onClick:ke,className:"bg-orange-600 hover:bg-orange-700",children:"我了解风险,继续加载"})]})]})})]})}function nk(){return e.jsxs("div",{className:"flex h-full flex-col",children:[e.jsx("div",{className:"flex-none border-b bg-card/50 px-6 py-4",children:e.jsx("div",{className:"flex items-center justify-between",children:e.jsxs("div",{children:[e.jsx("h1",{className:"text-2xl font-bold",children:"麦麦知识库管理"}),e.jsx("p",{className:"mt-1 text-sm text-muted-foreground",children:"管理和组织麦麦的知识库内容"})]})})}),e.jsx("div",{className:"flex-1 overflow-auto p-6",children:e.jsx("div",{className:"mx-auto max-w-4xl",children:e.jsxs(Ce,{children:[e.jsxs(De,{className:"text-center",children:[e.jsx("div",{className:"mx-auto mb-4 flex h-20 w-20 items-center justify-center rounded-full bg-primary/10",children:e.jsx(Hr,{className:"h-10 w-10 text-primary"})}),e.jsx(Le,{className:"text-2xl",children:"麦麦知识库管理"}),e.jsx(ws,{className:"text-base",children:"功能开发中,敬请期待"})]}),e.jsx(Ae,{className:"text-center text-sm text-muted-foreground",children:e.jsx("p",{children:"此功能将提供知识库的创建、编辑、导入和管理能力"})})]})})})]})}function Rg({className:l,classNames:n,showOutsideDays:i=!0,captionLayout:c="label",buttonVariant:u="ghost",formatters:x,components:h,...f}){const p=sv();return e.jsx(R_,{showOutsideDays:i,className:I("bg-background group/calendar p-3 [--cell-size:2rem] [[data-slot=card-content]_&]:bg-transparent [[data-slot=popover-content]_&]:bg-transparent",String.raw`rtl:**:[.rdp-button\_next>svg]:rotate-180`,String.raw`rtl:**:[.rdp-button\_previous>svg]:rotate-180`,l),captionLayout:c,formatters:{formatMonthDropdown:g=>g.toLocaleString("default",{month:"short"}),...x},classNames:{root:I("w-fit",p.root),months:I("relative flex flex-col gap-4 md:flex-row",p.months),month:I("flex w-full flex-col gap-4",p.month),nav:I("absolute inset-x-0 top-0 flex w-full items-center justify-between gap-1",p.nav),button_previous:I(qr({variant:u}),"h-[--cell-size] w-[--cell-size] select-none p-0 aria-disabled:opacity-50",p.button_previous),button_next:I(qr({variant:u}),"h-[--cell-size] w-[--cell-size] select-none p-0 aria-disabled:opacity-50",p.button_next),month_caption:I("flex h-[--cell-size] w-full items-center justify-center px-[--cell-size]",p.month_caption),dropdowns:I("flex h-[--cell-size] w-full items-center justify-center gap-1.5 text-sm font-medium",p.dropdowns),dropdown_root:I("has-focus:border-ring border-input shadow-xs has-focus:ring-ring/50 has-focus:ring-[3px] relative rounded-md border",p.dropdown_root),dropdown:I("bg-popover absolute inset-0 opacity-0",p.dropdown),caption_label:I("select-none font-medium",c==="label"?"text-sm":"[&>svg]:text-muted-foreground flex h-8 items-center gap-1 rounded-md pl-2 pr-1 text-sm [&>svg]:size-3.5",p.caption_label),table:"w-full border-collapse",weekdays:I("flex",p.weekdays),weekday:I("text-muted-foreground flex-1 select-none rounded-md text-[0.8rem] font-normal",p.weekday),week:I("mt-2 flex w-full",p.week),week_number_header:I("w-[--cell-size] select-none",p.week_number_header),week_number:I("text-muted-foreground select-none text-[0.8rem]",p.week_number),day:I("group/day relative aspect-square h-full w-full select-none p-0 text-center [&:first-child[data-selected=true]_button]:rounded-l-md [&:last-child[data-selected=true]_button]:rounded-r-md",p.day),range_start:I("bg-accent rounded-l-md",p.range_start),range_middle:I("rounded-none",p.range_middle),range_end:I("bg-accent rounded-r-md",p.range_end),today:I("bg-accent text-accent-foreground rounded-md data-[selected=true]:rounded-none",p.today),outside:I("text-muted-foreground aria-selected:text-muted-foreground",p.outside),disabled:I("text-muted-foreground opacity-50",p.disabled),hidden:I("invisible",p.hidden),...n},components:{Root:({className:g,rootRef:N,...v})=>e.jsx("div",{"data-slot":"calendar",ref:N,className:I(g),...v}),Chevron:({className:g,orientation:N,...v})=>N==="left"?e.jsx(Aa,{className:I("size-4",g),...v}):N==="right"?e.jsx(Zt,{className:I("size-4",g),...v}):e.jsx(za,{className:I("size-4",g),...v}),DayButton:rk,WeekNumber:({children:g,...N})=>e.jsx("td",{...N,children:e.jsx("div",{className:"flex size-[--cell-size] items-center justify-center text-center",children:g})}),...h},...f})}function rk({className:l,day:n,modifiers:i,...c}){const u=sv(),x=d.useRef(null);return d.useEffect(()=>{i.focused&&x.current?.focus()},[i.focused]),e.jsx(_,{ref:x,variant:"ghost",size:"icon","data-day":n.date.toLocaleDateString(),"data-selected-single":i.selected&&!i.range_start&&!i.range_end&&!i.range_middle,"data-range-start":i.range_start,"data-range-end":i.range_end,"data-range-middle":i.range_middle,className:I("data-[selected-single=true]:bg-primary data-[selected-single=true]:text-primary-foreground data-[range-middle=true]:bg-accent data-[range-middle=true]:text-accent-foreground data-[range-start=true]:bg-primary data-[range-start=true]:text-primary-foreground data-[range-end=true]:bg-primary data-[range-end=true]:text-primary-foreground group-data-[focused=true]/day:border-ring group-data-[focused=true]/day:ring-ring/50 flex aspect-square h-auto w-full min-w-[--cell-size] flex-col gap-1 font-normal leading-none data-[range-end=true]:rounded-md data-[range-middle=true]:rounded-none data-[range-start=true]:rounded-md group-data-[focused=true]/day:relative group-data-[focused=true]/day:z-10 group-data-[focused=true]/day:ring-[3px] [&>span]:text-xs [&>span]:opacity-70",u.day,l),...c})}const To={xs:{label:"小",rowHeight:28,class:"text-[10px] sm:text-xs"},sm:{label:"中",rowHeight:36,class:"text-xs sm:text-sm"},base:{label:"大",rowHeight:44,class:"text-sm sm:text-base"}};function ik(){const[l,n]=d.useState([]),[i,c]=d.useState(""),[u,x]=d.useState("all"),[h,f]=d.useState("all"),[p,g]=d.useState(void 0),[N,v]=d.useState(void 0),[y,w]=d.useState(!0),[b,R]=d.useState(!1),[D,S]=d.useState("xs"),[P,M]=d.useState(4),[T,A]=d.useState(!1),F=d.useRef(null);d.useEffect(()=>{const K=In.getAllLogs();n(K);const _e=In.onLog(()=>{n(In.getAllLogs())}),pe=In.onConnectionChange(ke=>{R(ke)});return()=>{_e(),pe()}},[]);const L=d.useMemo(()=>{const K=new Set(l.map(_e=>_e.module).filter(_e=>_e&&_e.trim()!==""));return Array.from(K).sort()},[l]),J=K=>{switch(K){case"DEBUG":return"text-muted-foreground";case"INFO":return"text-blue-500 dark:text-blue-400";case"WARNING":return"text-yellow-600 dark:text-yellow-500";case"ERROR":return"text-red-600 dark:text-red-500";case"CRITICAL":return"text-red-700 dark:text-red-400 font-bold";default:return"text-foreground"}},U=K=>{switch(K){case"DEBUG":return"bg-gray-800/30 dark:bg-gray-800/50";case"INFO":return"bg-blue-900/20 dark:bg-blue-500/20";case"WARNING":return"bg-yellow-900/20 dark:bg-yellow-500/20";case"ERROR":return"bg-red-900/20 dark:bg-red-500/20";case"CRITICAL":return"bg-red-900/30 dark:bg-red-600/30";default:return"bg-gray-800/20 dark:bg-gray-800/30"}},ue=()=>{window.location.reload()},xe=()=>{In.clearLogs(),n([])},he=()=>{const K=je.map(O=>`${O.timestamp} [${O.level.padEnd(8)}] [${O.module}] ${O.message}`).join(` +`),_e=new Blob([K],{type:"text/plain;charset=utf-8"}),pe=URL.createObjectURL(_e),ke=document.createElement("a");ke.href=pe,ke.download=`logs-${vm(new Date,"yyyy-MM-dd-HHmmss")}.txt`,ke.click(),URL.revokeObjectURL(pe)},ne=()=>{w(!y)},ve=()=>{g(void 0),v(void 0)},je=d.useMemo(()=>l.filter(K=>{const _e=i===""||K.message.toLowerCase().includes(i.toLowerCase())||K.module.toLowerCase().includes(i.toLowerCase()),pe=u==="all"||K.level===u,ke=h==="all"||K.module===h;let O=!0;if(p||N){const k=new Date(K.timestamp);if(p){const H=new Date(p);H.setHours(0,0,0,0),O=O&&k>=H}if(N){const H=new Date(N);H.setHours(23,59,59,999),O=O&&k<=H}}return _e&&pe&&ke&&O}),[l,i,u,h,p,N]),z=To[D].rowHeight+P,V=N0({count:je.length,getScrollElement:()=>F.current,estimateSize:()=>z,overscan:50}),B=d.useRef(!1),oe=d.useRef(je.length);return d.useEffect(()=>{const K=F.current;if(!K)return;const _e=()=>{if(B.current)return;const{scrollTop:pe,scrollHeight:ke,clientHeight:O}=K,k=ke-pe-O;k>100&&y?w(!1):k<50&&!y&&w(!0)};return K.addEventListener("scroll",_e,{passive:!0}),()=>K.removeEventListener("scroll",_e)},[y]),d.useEffect(()=>{const K=je.length>oe.current;oe.current=je.length,y&&je.length>0&&K&&(B.current=!0,V.scrollToIndex(je.length-1,{align:"end",behavior:"auto"}),requestAnimationFrame(()=>{requestAnimationFrame(()=>{B.current=!1})}))},[je.length,y,V]),e.jsxs("div",{className:"h-full flex flex-col overflow-hidden",children:[e.jsxs("div",{className:"flex-shrink-0 space-y-2 sm:space-y-3 p-2 sm:p-3 lg:p-4",children:[e.jsxs("div",{className:"flex items-center justify-between gap-3",children:[e.jsxs("div",{children:[e.jsx("h1",{className:"text-lg sm:text-xl lg:text-2xl font-bold",children:"日志查看器"}),e.jsx("p",{className:"text-xs text-muted-foreground mt-0.5 hidden sm:block",children:"实时查看和分析麦麦运行日志"})]}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("div",{className:I("h-2 w-2 sm:h-2.5 sm:w-2.5 rounded-full",b?"bg-green-500 animate-pulse":"bg-red-500")}),e.jsx("span",{className:"text-xs text-muted-foreground",children:b?"已连接":"未连接"})]})]}),e.jsx(Ce,{className:"p-2 sm:p-3",children:e.jsx(nc,{open:T,onOpenChange:A,children:e.jsxs("div",{className:"flex flex-col gap-2",children:[e.jsxs("div",{className:"flex gap-2",children:[e.jsxs("div",{className:"flex-1 relative min-w-0",children:[e.jsx(Tt,{className:"absolute left-2 top-1/2 -translate-y-1/2 h-3.5 w-3.5 text-muted-foreground"}),e.jsx(le,{placeholder:"搜索日志...",value:i,onChange:K=>c(K.target.value),className:"pl-8 h-8 text-xs sm:text-sm"})]}),e.jsxs("div",{className:"flex gap-1 flex-shrink-0",children:[e.jsxs(_,{variant:y?"default":"outline",size:"sm",onClick:ne,className:"h-8 px-2",title:y?"自动滚动":"已暂停",children:[y?e.jsx(l_,{className:"h-3.5 w-3.5"}):e.jsx(n_,{className:"h-3.5 w-3.5"}),e.jsx("span",{className:"ml-1 text-xs hidden sm:inline",children:y?"滚动":"暂停"})]}),e.jsxs(_,{variant:"outline",size:"sm",onClick:xe,className:"h-8 px-2",title:"清空日志",children:[e.jsx(ls,{className:"h-3.5 w-3.5"}),e.jsx("span",{className:"ml-1 text-xs hidden md:inline",children:"清空"})]}),e.jsxs(_,{variant:"outline",size:"sm",onClick:he,className:"h-8 px-2 hidden sm:flex",title:"导出日志",children:[e.jsx(sa,{className:"h-3.5 w-3.5"}),e.jsx("span",{className:"ml-1 text-xs hidden lg:inline",children:"导出"})]}),e.jsx(rc,{asChild:!0,children:e.jsxs(_,{variant:"outline",size:"sm",className:"h-8 px-2",title:T?"收起筛选":"展开筛选",children:[e.jsx(zo,{className:"h-3.5 w-3.5"}),T?e.jsx(Fr,{className:"h-3.5 w-3.5 ml-1"}):e.jsx(za,{className:"h-3.5 w-3.5 ml-1"})]})})]})]}),e.jsxs("div",{className:"text-xs text-muted-foreground text-center sm:text-right -mt-1",children:[e.jsxs("span",{className:"font-mono",children:[je.length," / ",l.length]}),e.jsx("span",{className:"ml-1",children:"条日志"})]}),e.jsxs(ic,{className:"space-y-2",children:[e.jsxs("div",{className:"flex flex-col gap-2 sm:flex-row sm:gap-2",children:[e.jsxs(Ie,{value:u,onValueChange:x,children:[e.jsxs($e,{className:"w-full sm:flex-1 h-8 text-xs",children:[e.jsx(zo,{className:"h-3.5 w-3.5 mr-1.5"}),e.jsx(Pe,{placeholder:"级别"})]}),e.jsxs(Be,{children:[e.jsx(X,{value:"all",children:"全部级别"}),e.jsx(X,{value:"DEBUG",children:"DEBUG"}),e.jsx(X,{value:"INFO",children:"INFO"}),e.jsx(X,{value:"WARNING",children:"WARNING"}),e.jsx(X,{value:"ERROR",children:"ERROR"}),e.jsx(X,{value:"CRITICAL",children:"CRITICAL"})]})]}),e.jsxs(Ie,{value:h,onValueChange:f,children:[e.jsxs($e,{className:"w-full sm:flex-1 h-8 text-xs",children:[e.jsx(zo,{className:"h-3.5 w-3.5 mr-1.5"}),e.jsx(Pe,{placeholder:"模块"})]}),e.jsxs(Be,{children:[e.jsx(X,{value:"all",children:"全部模块"}),L.map(K=>e.jsx(X,{value:K,children:K},K))]})]})]}),e.jsxs("div",{className:"flex flex-col gap-2 sm:flex-row sm:gap-2",children:[e.jsxs(ol,{children:[e.jsx(dl,{asChild:!0,children:e.jsxs(_,{variant:"outline",size:"sm",className:I("w-full sm:flex-1 justify-start text-left font-normal h-8",!p&&"text-muted-foreground"),children:[e.jsx($o,{className:"mr-1.5 h-3.5 w-3.5"}),e.jsx("span",{className:"text-xs",children:p?vm(p,"PP",{locale:ko}):"开始日期"})]})}),e.jsx(Wa,{className:"w-auto p-0",align:"start",children:e.jsx(Rg,{mode:"single",selected:p,onSelect:g,initialFocus:!0,locale:ko})})]}),e.jsxs(ol,{children:[e.jsx(dl,{asChild:!0,children:e.jsxs(_,{variant:"outline",size:"sm",className:I("w-full sm:flex-1 justify-start text-left font-normal h-8",!N&&"text-muted-foreground"),children:[e.jsx($o,{className:"mr-1.5 h-3.5 w-3.5"}),e.jsx("span",{className:"text-xs",children:N?vm(N,"PP",{locale:ko}):"结束日期"})]})}),e.jsx(Wa,{className:"w-auto p-0",align:"start",children:e.jsx(Rg,{mode:"single",selected:N,onSelect:v,initialFocus:!0,locale:ko})})]}),(p||N)&&e.jsxs(_,{variant:"outline",size:"sm",onClick:ve,className:"w-full sm:w-auto h-8",children:[e.jsx(Ea,{className:"h-3.5 w-3.5 sm:mr-1"}),e.jsx("span",{className:"text-xs",children:"清除"})]})]}),e.jsxs("div",{className:"flex flex-col gap-2 sm:flex-row sm:items-center sm:gap-3 pt-2 border-t border-border/50",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsxs("div",{className:"flex items-center gap-1.5 text-xs text-muted-foreground",children:[e.jsx(r_,{className:"h-3.5 w-3.5"}),e.jsx("span",{children:"字号"})]}),e.jsx("div",{className:"flex gap-1",children:Object.keys(To).map(K=>e.jsx(_,{variant:D===K?"default":"outline",size:"sm",onClick:()=>S(K),className:"h-6 px-2 text-xs",children:To[K].label},K))})]}),e.jsxs("div",{className:"flex items-center gap-2 flex-1 max-w-[200px]",children:[e.jsx("span",{className:"text-xs text-muted-foreground whitespace-nowrap",children:"行距"}),e.jsx(qa,{value:[P],onValueChange:([K])=>M(K),min:0,max:12,step:2,className:"flex-1"}),e.jsxs("span",{className:"text-xs text-muted-foreground w-7",children:[P,"px"]})]}),e.jsxs("div",{className:"flex gap-2 sm:hidden",children:[e.jsxs(_,{variant:"outline",size:"sm",onClick:ue,className:"flex-1 h-8",children:[e.jsx(dt,{className:"h-3.5 w-3.5 mr-1"}),e.jsx("span",{className:"text-xs",children:"刷新"})]}),e.jsxs(_,{variant:"outline",size:"sm",onClick:he,className:"flex-1 h-8",children:[e.jsx(sa,{className:"h-3.5 w-3.5 mr-1"}),e.jsx("span",{className:"text-xs",children:"导出"})]})]})]})]})]})})})]}),e.jsx("div",{className:"flex-1 min-h-0 px-2 sm:px-3 lg:px-4 pb-2 sm:pb-3 lg:pb-4",children:e.jsx(Ce,{className:"bg-black dark:bg-gray-950 border-gray-800 dark:border-gray-900 h-full overflow-hidden",children:e.jsx("div",{ref:F,className:I("h-full overflow-auto","[&::-webkit-scrollbar]:w-2.5","[&::-webkit-scrollbar-track]:bg-transparent","[&::-webkit-scrollbar-thumb]:bg-border [&::-webkit-scrollbar-thumb]:rounded-full","[&::-webkit-scrollbar-thumb:hover]:bg-border/80"),children:e.jsx("div",{className:I("p-2 sm:p-3 font-mono relative",To[D].class),style:{height:`${V.getTotalSize()}px`},children:je.length===0?e.jsx("div",{className:"text-gray-500 dark:text-gray-600 text-center py-8 text-xs sm:text-sm",children:"暂无日志数据"}):V.getVirtualItems().map(K=>{const _e=je[K.index];return e.jsxs("div",{"data-index":K.index,ref:V.measureElement,className:I("absolute top-0 left-0 w-full px-2 sm:px-3 rounded hover:bg-white/5 transition-colors",U(_e.level)),style:{transform:`translateY(${K.start}px)`,paddingTop:`${P/2}px`,paddingBottom:`${P/2}px`},children:[e.jsxs("div",{className:"flex flex-col gap-0.5 sm:hidden",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("span",{className:"text-gray-500 dark:text-gray-600 text-[10px]",children:_e.timestamp}),e.jsxs("span",{className:I("font-semibold text-[10px]",J(_e.level)),children:["[",_e.level,"]"]})]}),e.jsx("div",{className:"text-cyan-400 dark:text-cyan-500 truncate text-[10px]",children:_e.module}),e.jsx("div",{className:"text-gray-300 dark:text-gray-400 whitespace-pre-wrap break-words text-[10px]",children:_e.message})]}),e.jsxs("div",{className:"hidden sm:flex gap-2 items-start",children:[e.jsx("span",{className:"text-gray-500 dark:text-gray-600 flex-shrink-0 w-[130px] lg:w-[160px]",children:_e.timestamp}),e.jsxs("span",{className:I("flex-shrink-0 w-[65px] lg:w-[75px] font-semibold",J(_e.level)),children:["[",_e.level,"]"]}),e.jsx("span",{className:"text-cyan-400 dark:text-cyan-500 flex-shrink-0 w-[100px] lg:w-[130px] truncate",children:_e.module}),e.jsx("span",{className:"text-gray-300 dark:text-gray-400 flex-1 whitespace-pre-wrap break-words",children:_e.message})]})]},K.key)})})})})})]})}async function ck(){return(await we("/api/planner/overview")).json()}async function ok(l,n=1,i=20,c){const u=new URLSearchParams({page:n.toString(),page_size:i.toString()});return c&&u.append("search",c),(await we(`/api/planner/chat/${l}/logs?${u}`)).json()}async function dk(l,n){return(await we(`/api/planner/log/${l}/${n}`)).json()}async function uk(){return(await we("/api/replier/overview")).json()}async function mk(l,n=1,i=20,c){const u=new URLSearchParams({page:n.toString(),page_size:i.toString()});return c&&u.append("search",c),(await we(`/api/replier/chat/${l}/logs?${u}`)).json()}async function xk(l,n){return(await we(`/api/replier/log/${l}/${n}`)).json()}function Ov(){const[l,n]=d.useState(new Map),[i,c]=d.useState(!0),u=d.useCallback(async()=>{try{c(!0);const h=await Zm();if(h?.data){const f=new Map;h.data.forEach(p=>{f.set(p.chat_id,p.chat_name)}),n(f)}}catch(h){console.error("加载聊天列表失败:",h)}finally{c(!1)}},[]);d.useEffect(()=>{u()},[u]);const x=d.useCallback(h=>l.get(h)||h,[l]);return{chatNameMap:l,getChatName:x,loading:i,reload:u}}function Fo(l){return new Date(l*1e3).toLocaleString("zh-CN")}function Dv(l){const i=Date.now()/1e3-l;return i<60?"刚刚":i<3600?`${Math.floor(i/60)} 分钟前`:i<86400?`${Math.floor(i/3600)} 小时前`:`${Math.floor(i/86400)} 天前`}function Rv(l,n,i=1e4){d.useEffect(()=>{if(!l)return;const c=setInterval(n,i);return()=>clearInterval(c)},[l,n,i])}function hk({autoRefresh:l,refreshKey:n}){const[i,c]=d.useState("overview"),[u,x]=d.useState(null),{getChatName:h}=Ov(),[f,p]=d.useState(null),[g,N]=d.useState(!0),[v,y]=d.useState(null),[w,b]=d.useState(!1),[R,D]=d.useState(1),[S,P]=d.useState(20),[M,T]=d.useState(""),[A,F]=d.useState(""),[L,J]=d.useState(""),[U,ue]=d.useState(null),[xe,he]=d.useState(!1),[ne,ve]=d.useState(!1),je=d.useCallback(async()=>{try{N(!0);const k=await ck();p(k)}catch(k){console.error("加载规划器总览失败:",k)}finally{N(!1)}},[]),z=d.useCallback(async()=>{if(u)try{b(!0);const k=await ok(u.chat_id,R,S,A||void 0);y(k)}catch(k){console.error("加载聊天日志失败:",k)}finally{b(!1)}},[u,R,S,A]);d.useEffect(()=>{je()},[je]),d.useEffect(()=>{n>0&&(i==="overview"?je():z())},[n,i,je,z]),d.useEffect(()=>{i==="chat-logs"&&u&&z()},[i,u,z]),Rv(l,d.useCallback(()=>{i==="overview"?je():z()},[i,je,z]));const V=k=>{x(k),D(1),F(""),J(""),c("chat-logs")},B=()=>{c("overview"),x(null),y(null),F(""),J("")},oe=()=>{F(L),D(1)},K=()=>{J(""),F(""),D(1)},_e=async(k,H)=>{try{ve(!0),he(!0);const se=await dk(k,H);ue(se)}catch(se){console.error("加载计划详情失败:",se)}finally{ve(!1)}},pe=k=>{P(Number(k)),D(1)},ke=()=>{const k=parseInt(M),H=v?Math.ceil(v.total/v.page_size):0;!isNaN(k)&&k>=1&&k<=H&&(D(k),T(""))},O=v?Math.ceil(v.total/v.page_size):0;return e.jsxs(e.Fragment,{children:[e.jsx("div",{className:"space-y-4",children:i==="overview"?e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"grid gap-4 md:grid-cols-2",children:[e.jsxs(Ce,{children:[e.jsxs(De,{className:"flex flex-row items-center justify-between space-y-0 pb-2",children:[e.jsx(Le,{className:"text-sm font-medium",children:"聊天数量"}),e.jsx(Ma,{className:"h-4 w-4 text-muted-foreground"})]}),e.jsx(Ae,{children:g?e.jsx(js,{className:"h-8 w-16"}):e.jsx("div",{className:"text-2xl font-bold",children:f?.total_chats||0})})]}),e.jsxs(Ce,{children:[e.jsxs(De,{className:"flex flex-row items-center justify-between space-y-0 pb-2",children:[e.jsx(Le,{className:"text-sm font-medium",children:"计划总数"}),e.jsx(Vm,{className:"h-4 w-4 text-muted-foreground"})]}),e.jsx(Ae,{children:g?e.jsx(js,{className:"h-8 w-16"}):e.jsx("div",{className:"text-2xl font-bold",children:f?.total_plans||0})})]})]}),e.jsxs(Ce,{children:[e.jsxs(De,{children:[e.jsx(Le,{children:"聊天列表"}),e.jsx(ws,{children:"点击查看该聊天的所有计划记录"})]}),e.jsx(Ae,{children:g?e.jsx("div",{className:"grid gap-3 md:grid-cols-2 lg:grid-cols-3",children:[...Array(6)].map((k,H)=>e.jsx(js,{className:"h-24 w-full"},H))}):f?.chats&&f.chats.length>0?e.jsx("div",{className:"grid gap-3 md:grid-cols-2 lg:grid-cols-3",children:f.chats.map(k=>e.jsxs("div",{className:"border rounded-lg p-4 hover:bg-accent/50 transition-colors cursor-pointer",onClick:()=>V(k),children:[e.jsxs("div",{className:"flex items-start justify-between mb-2",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(Ma,{className:"h-4 w-4 text-muted-foreground"}),e.jsx("span",{className:"text-sm truncate max-w-[180px]",title:h(k.chat_id),children:h(k.chat_id)})]}),e.jsx(Se,{variant:"secondary",children:k.plan_count})]}),e.jsxs("div",{className:"text-xs text-muted-foreground",children:["最后活动: ",Dv(k.latest_timestamp)]})]},k.chat_id))}):e.jsx("div",{className:"text-center py-8 text-muted-foreground",children:"暂无聊天记录"})})]})]}):e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"flex items-center gap-4 mb-4",children:[e.jsxs(_,{variant:"outline",size:"sm",onClick:B,children:[e.jsx(Ta,{className:"h-4 w-4 mr-2"}),"返回聊天列表"]}),e.jsxs("div",{className:"text-sm text-muted-foreground",children:["当前聊天: ",e.jsx("span",{className:"font-medium",children:u?h(u.chat_id):""}),e.jsx("span",{className:"mx-2",children:"•"}),"共 ",v?.total||0," 条计划记录"]})]}),e.jsxs(Ce,{children:[e.jsxs(De,{children:[e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsxs("div",{children:[e.jsx(Le,{children:"计划执行记录"}),e.jsx(ws,{children:u?h(u.chat_id):""})]}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsxs("div",{className:"flex items-center gap-1",children:[e.jsx(le,{placeholder:"搜索提示词内容...",value:L,onChange:k=>J(k.target.value),onKeyDown:k=>k.key==="Enter"&&oe(),className:"w-48"}),e.jsx(_,{variant:"outline",size:"icon",onClick:oe,children:e.jsx(Tt,{className:"h-4 w-4"})}),A&&e.jsx(_,{variant:"ghost",size:"sm",onClick:K,children:"清除"})]}),e.jsxs(Ie,{value:S.toString(),onValueChange:pe,children:[e.jsx($e,{className:"w-32",children:e.jsx(Pe,{})}),e.jsxs(Be,{children:[e.jsx(X,{value:"10",children:"10条/页"}),e.jsx(X,{value:"20",children:"20条/页"}),e.jsx(X,{value:"50",children:"50条/页"}),e.jsx(X,{value:"100",children:"100条/页"})]})]})]})]}),A&&e.jsxs("div",{className:"text-sm text-muted-foreground mt-2",children:["搜索关键词: ",e.jsxs("span",{className:"font-medium",children:['"',A,'"']})]})]}),e.jsx(Ae,{children:w?e.jsx("div",{className:"space-y-2",children:[...Array(5)].map((k,H)=>e.jsx(js,{className:"h-20 w-full"},H))}):v?.data&&v.data.length>0?e.jsxs(e.Fragment,{children:[e.jsx("div",{className:"space-y-2",children:v.data.map(k=>e.jsxs("div",{className:"border rounded-lg p-3 hover:bg-accent/50 transition-colors cursor-pointer",onClick:()=>_e(k.chat_id,k.filename),children:[e.jsxs("div",{className:"flex items-center justify-between mb-2",children:[e.jsx("span",{className:"text-sm font-medium text-muted-foreground",children:Fo(k.timestamp)}),e.jsxs("div",{className:"flex items-center gap-2 text-xs text-muted-foreground",children:[e.jsxs(Se,{variant:"secondary",className:"text-xs",children:[k.action_count," 个动作"]}),e.jsxs(Se,{variant:"outline",className:"text-xs",children:[k.total_plan_ms.toFixed(0),"ms"]})]})]}),k.action_types&&k.action_types.length>0&&e.jsx("div",{className:"flex flex-wrap gap-1 mb-2",children:k.action_types.map((H,se)=>e.jsx(Se,{variant:"outline",className:"text-xs bg-blue-50 dark:bg-blue-950 text-blue-700 dark:text-blue-300 border-blue-200 dark:border-blue-800",children:H},se))}),e.jsx("p",{className:"text-sm line-clamp-2",children:k.reasoning_preview||"无推理内容"})]},k.filename))}),e.jsxs("div",{className:"flex items-center justify-between mt-4 pt-4 border-t",children:[e.jsxs("div",{className:"text-sm text-muted-foreground",children:["共 ",v.total," 条记录,第 ",R," / ",O," 页"]}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(_,{variant:"outline",size:"sm",onClick:()=>D(1),disabled:R===1,children:e.jsx(gn,{className:"h-4 w-4"})}),e.jsx(_,{variant:"outline",size:"sm",onClick:()=>D(k=>Math.max(1,k-1)),disabled:R===1,children:e.jsx(Aa,{className:"h-4 w-4"})}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(le,{type:"number",min:1,max:O,value:M,onChange:k=>T(k.target.value),onKeyDown:k=>k.key==="Enter"&&ke(),placeholder:"跳转",className:"w-20 h-8"}),e.jsx(_,{size:"sm",variant:"outline",onClick:ke,children:"跳转"})]}),e.jsx(_,{variant:"outline",size:"sm",onClick:()=>D(k=>Math.min(O,k+1)),disabled:R===O,children:e.jsx(Zt,{className:"h-4 w-4"})}),e.jsx(_,{variant:"outline",size:"sm",onClick:()=>D(O),disabled:R===O,children:e.jsx(jn,{className:"h-4 w-4"})})]})]})]}):e.jsx("div",{className:"text-center py-8 text-muted-foreground",children:"暂无计划记录"})})]})]})}),e.jsx(Is,{open:xe,onOpenChange:he,children:e.jsxs(Os,{className:"max-w-4xl max-h-[80vh] grid grid-rows-[auto_1fr_auto] overflow-hidden",children:[e.jsxs(Ds,{children:[e.jsxs(Rs,{className:"flex items-center gap-2",children:[e.jsx(Ca,{className:"h-5 w-5"}),"计划执行详情"]}),e.jsx(Ks,{children:"查看麦麦的详细计划推理过程和执行动作"})]}),e.jsx(Ye,{className:"h-full pr-4",children:e.jsx("div",{className:"space-y-6 pb-4",children:ne?e.jsx("div",{className:"space-y-4",children:[...Array(5)].map((k,H)=>e.jsx(js,{className:"h-24 w-full"},H))}):U?e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"space-y-2",children:[e.jsxs("h3",{className:"text-sm font-semibold flex items-center gap-2",children:[e.jsx(na,{className:"h-4 w-4"}),"基本信息"]}),e.jsxs("div",{className:"grid grid-cols-2 gap-4 p-4 bg-muted/50 rounded-lg",children:[e.jsxs("div",{children:[e.jsx("div",{className:"text-xs text-muted-foreground mb-1",children:"聊天"}),e.jsx("div",{className:"text-sm",title:U.chat_id,children:h(U.chat_id)})]}),e.jsxs("div",{children:[e.jsx("div",{className:"text-xs text-muted-foreground mb-1",children:"时间戳"}),e.jsx("div",{className:"text-sm",children:Fo(U.timestamp)})]}),e.jsxs("div",{children:[e.jsx("div",{className:"text-xs text-muted-foreground mb-1",children:"类型"}),e.jsx(Se,{variant:"outline",children:U.type})]}),e.jsxs("div",{children:[e.jsx("div",{className:"text-xs text-muted-foreground mb-1",children:"动作数量"}),e.jsxs(Se,{children:[U.actions.length," 个动作"]})]})]})]}),e.jsx(Yt,{}),e.jsxs("div",{className:"space-y-2",children:[e.jsxs("h3",{className:"text-sm font-semibold flex items-center gap-2",children:[e.jsx(Za,{className:"h-4 w-4"}),"性能统计"]}),e.jsxs("div",{className:"grid grid-cols-3 gap-3",children:[e.jsxs(Ce,{children:[e.jsx(De,{className:"p-4 pb-2",children:e.jsx(Le,{className:"text-xs text-muted-foreground",children:"提示词构建"})}),e.jsx(Ae,{className:"p-4 pt-0",children:e.jsxs("div",{className:"text-xl font-bold",children:[U.timing.prompt_build_ms?.toFixed(2)||0,"ms"]})})]}),e.jsxs(Ce,{children:[e.jsx(De,{className:"p-4 pb-2",children:e.jsx(Le,{className:"text-xs text-muted-foreground",children:"LLM 推理"})}),e.jsx(Ae,{className:"p-4 pt-0",children:e.jsxs("div",{className:"text-xl font-bold",children:[U.timing.llm_duration_ms?.toFixed(2)||0,"ms"]})})]}),e.jsxs(Ce,{children:[e.jsx(De,{className:"p-4 pb-2",children:e.jsx(Le,{className:"text-xs text-muted-foreground",children:"总计划时间"})}),e.jsx(Ae,{className:"p-4 pt-0",children:e.jsxs("div",{className:"text-xl font-bold",children:[U.timing.total_plan_ms?.toFixed(2)||0,"ms"]})})]})]})]}),e.jsx(Yt,{}),e.jsxs("div",{className:"space-y-2",children:[e.jsxs("h3",{className:"text-sm font-semibold flex items-center gap-2",children:[e.jsx(Xm,{className:"h-4 w-4"}),"推理过程"]}),e.jsx("div",{className:"p-4 bg-muted/50 rounded-lg",children:e.jsx("p",{className:"text-sm whitespace-pre-wrap leading-relaxed",children:U.reasoning||"无推理内容"})})]}),e.jsx(Yt,{}),e.jsxs("div",{className:"space-y-2",children:[e.jsxs("h3",{className:"text-sm font-semibold flex items-center gap-2",children:[e.jsx(i_,{className:"h-4 w-4"}),"执行动作 (",U.actions.length,")"]}),e.jsx("div",{className:"space-y-3",children:U.actions.map((k,H)=>e.jsxs(Ce,{children:[e.jsx(De,{className:"p-4 pb-3",children:e.jsx("div",{className:"flex items-start justify-between",children:e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsxs(Se,{variant:"default",children:["动作 ",H+1]}),e.jsx(Se,{variant:"outline",children:k.action_type})]})})}),e.jsxs(Ae,{className:"p-4 pt-0 space-y-3",children:[k.reasoning&&e.jsxs("div",{children:[e.jsx("div",{className:"text-xs font-medium text-muted-foreground mb-1",children:"推理依据"}),e.jsx("p",{className:"text-sm bg-muted/30 p-2 rounded",children:typeof k.reasoning=="string"?k.reasoning:JSON.stringify(k.reasoning)})]}),k.action_message&&e.jsxs("div",{className:"overflow-hidden",children:[e.jsx("div",{className:"text-xs font-medium text-muted-foreground mb-1",children:"动作消息"}),typeof k.action_message=="string"?e.jsx("p",{className:"text-sm bg-muted/30 p-2 rounded break-all whitespace-pre-wrap",children:k.action_message}):e.jsx("pre",{className:"text-xs bg-muted/30 p-2 rounded overflow-x-auto whitespace-pre-wrap break-all",children:JSON.stringify(k.action_message,null,2)})]}),k.action_data&&Object.keys(k.action_data).length>0&&e.jsxs("div",{children:[e.jsx("div",{className:"text-xs font-medium text-muted-foreground mb-1",children:"动作数据"}),e.jsx("pre",{className:"text-xs bg-muted/30 p-2 rounded overflow-x-auto",children:JSON.stringify(k.action_data,null,2)})]}),k.action_reasoning&&e.jsxs("div",{children:[e.jsx("div",{className:"text-xs font-medium text-muted-foreground mb-1",children:"动作推理"}),e.jsx("p",{className:"text-sm bg-muted/30 p-2 rounded",children:typeof k.action_reasoning=="string"?k.action_reasoning:JSON.stringify(k.action_reasoning)})]})]})]},H))})]}),e.jsx(Yt,{}),U.raw_output&&e.jsxs("div",{className:"space-y-2",children:[e.jsx("h3",{className:"text-sm font-semibold",children:"原始输出"}),e.jsxs("details",{className:"group",children:[e.jsx("summary",{className:"cursor-pointer text-sm text-muted-foreground hover:text-foreground",children:"点击展开查看完整原始输出"}),e.jsx("div",{className:"mt-2 p-4 bg-muted/50 rounded-lg",children:e.jsx("pre",{className:"text-xs whitespace-pre-wrap break-words",children:U.raw_output})})]})]}),U.prompt&&e.jsxs("div",{className:"space-y-2",children:[e.jsx("h3",{className:"text-sm font-semibold",children:"完整提示词"}),e.jsxs("details",{className:"group",children:[e.jsx("summary",{className:"cursor-pointer text-sm text-muted-foreground hover:text-foreground",children:"点击展开查看完整提示词"}),e.jsx("div",{className:"mt-2 p-4 bg-muted/50 rounded-lg",children:e.jsx("pre",{className:"text-xs whitespace-pre-wrap break-words",children:U.prompt})})]})]})]}):e.jsx("div",{className:"flex items-center justify-center py-12",children:e.jsx("p",{className:"text-muted-foreground",children:"无数据"})})})}),e.jsx(st,{className:"flex-shrink-0",children:e.jsx(_,{onClick:()=>he(!1),children:"关闭"})})]})})]})}function fk({autoRefresh:l,refreshKey:n}){const[i,c]=d.useState("overview"),[u,x]=d.useState(null),{getChatName:h}=Ov(),[f,p]=d.useState(null),[g,N]=d.useState(!0),[v,y]=d.useState(null),[w,b]=d.useState(!1),[R,D]=d.useState(1),[S,P]=d.useState(20),[M,T]=d.useState(""),[A,F]=d.useState(""),[L,J]=d.useState(""),[U,ue]=d.useState(null),[xe,he]=d.useState(!1),[ne,ve]=d.useState(!1),je=d.useCallback(async()=>{try{N(!0);const k=await uk();p(k)}catch(k){console.error("加载回复器总览失败:",k)}finally{N(!1)}},[]),z=d.useCallback(async()=>{if(u)try{b(!0);const k=await mk(u.chat_id,R,S,A||void 0);y(k)}catch(k){console.error("加载聊天日志失败:",k)}finally{b(!1)}},[u,R,S,A]);d.useEffect(()=>{je()},[je]),d.useEffect(()=>{n>0&&(i==="overview"?je():z())},[n,i,je,z]),d.useEffect(()=>{i==="chat-logs"&&u&&z()},[i,u,z]),Rv(l,d.useCallback(()=>{i==="overview"?je():z()},[i,je,z]));const V=k=>{x(k),D(1),F(""),J(""),c("chat-logs")},B=()=>{c("overview"),x(null),y(null),F(""),J("")},oe=()=>{F(L),D(1)},K=()=>{J(""),F(""),D(1)},_e=async(k,H)=>{try{ve(!0),he(!0);const se=await xk(k,H);ue(se)}catch(se){console.error("加载回复详情失败:",se)}finally{ve(!1)}},pe=k=>{P(Number(k)),D(1)},ke=()=>{const k=parseInt(M),H=v?Math.ceil(v.total/v.page_size):0;!isNaN(k)&&k>=1&&k<=H&&(D(k),T(""))},O=v?Math.ceil(v.total/v.page_size):0;return e.jsxs(e.Fragment,{children:[e.jsx("div",{className:"space-y-4",children:i==="overview"?e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"grid gap-4 md:grid-cols-2",children:[e.jsxs(Ce,{children:[e.jsxs(De,{className:"flex flex-row items-center justify-between space-y-0 pb-2",children:[e.jsx(Le,{className:"text-sm font-medium",children:"聊天数量"}),e.jsx(Ma,{className:"h-4 w-4 text-muted-foreground"})]}),e.jsx(Ae,{children:g?e.jsx(js,{className:"h-8 w-16"}):e.jsx("div",{className:"text-2xl font-bold",children:f?.total_chats||0})})]}),e.jsxs(Ce,{children:[e.jsxs(De,{className:"flex flex-row items-center justify-between space-y-0 pb-2",children:[e.jsx(Le,{className:"text-sm font-medium",children:"回复总数"}),e.jsx(Vm,{className:"h-4 w-4 text-muted-foreground"})]}),e.jsx(Ae,{children:g?e.jsx(js,{className:"h-8 w-16"}):e.jsx("div",{className:"text-2xl font-bold",children:f?.total_replies||0})})]})]}),e.jsxs(Ce,{children:[e.jsxs(De,{children:[e.jsx(Le,{children:"聊天列表"}),e.jsx(ws,{children:"点击查看该聊天的所有回复记录"})]}),e.jsx(Ae,{children:g?e.jsx("div",{className:"grid gap-3 md:grid-cols-2 lg:grid-cols-3",children:[...Array(6)].map((k,H)=>e.jsx(js,{className:"h-24 w-full"},H))}):f?.chats&&f.chats.length>0?e.jsx("div",{className:"grid gap-3 md:grid-cols-2 lg:grid-cols-3",children:f.chats.map(k=>e.jsxs("div",{className:"border rounded-lg p-4 hover:bg-accent/50 transition-colors cursor-pointer",onClick:()=>V(k),children:[e.jsxs("div",{className:"flex items-start justify-between mb-2",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(Ma,{className:"h-4 w-4 text-muted-foreground"}),e.jsx("span",{className:"text-sm truncate max-w-[180px]",title:h(k.chat_id),children:h(k.chat_id)})]}),e.jsx(Se,{variant:"secondary",children:k.reply_count})]}),e.jsxs("div",{className:"text-xs text-muted-foreground",children:["最后活动: ",Dv(k.latest_timestamp)]})]},k.chat_id))}):e.jsx("div",{className:"text-center py-8 text-muted-foreground",children:"暂无聊天记录"})})]})]}):e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"flex items-center gap-4 mb-4",children:[e.jsxs(_,{variant:"outline",size:"sm",onClick:B,children:[e.jsx(Ta,{className:"h-4 w-4 mr-2"}),"返回聊天列表"]}),e.jsxs("div",{className:"text-sm text-muted-foreground",children:["当前聊天: ",e.jsx("span",{className:"font-medium",children:u?h(u.chat_id):""}),e.jsx("span",{className:"mx-2",children:"•"}),"共 ",v?.total||0," 条回复记录"]})]}),e.jsxs(Ce,{children:[e.jsxs(De,{children:[e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsxs("div",{children:[e.jsx(Le,{children:"回复生成记录"}),e.jsx(ws,{children:u?h(u.chat_id):""})]}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsxs("div",{className:"flex items-center gap-1",children:[e.jsx(le,{placeholder:"搜索提示词内容...",value:L,onChange:k=>J(k.target.value),onKeyDown:k=>k.key==="Enter"&&oe(),className:"w-48"}),e.jsx(_,{variant:"outline",size:"icon",onClick:oe,children:e.jsx(Tt,{className:"h-4 w-4"})}),A&&e.jsx(_,{variant:"ghost",size:"sm",onClick:K,children:"清除"})]}),e.jsxs(Ie,{value:S.toString(),onValueChange:pe,children:[e.jsx($e,{className:"w-32",children:e.jsx(Pe,{})}),e.jsxs(Be,{children:[e.jsx(X,{value:"10",children:"10条/页"}),e.jsx(X,{value:"20",children:"20条/页"}),e.jsx(X,{value:"50",children:"50条/页"}),e.jsx(X,{value:"100",children:"100条/页"})]})]})]})]}),A&&e.jsxs("div",{className:"text-sm text-muted-foreground mt-2",children:["搜索关键词: ",e.jsxs("span",{className:"font-medium",children:['"',A,'"']})]})]}),e.jsx(Ae,{children:w?e.jsx("div",{className:"space-y-2",children:[...Array(5)].map((k,H)=>e.jsx(js,{className:"h-20 w-full"},H))}):v?.data&&v.data.length>0?e.jsxs(e.Fragment,{children:[e.jsx("div",{className:"space-y-2",children:v.data.map(k=>e.jsxs("div",{className:"border rounded-lg p-3 hover:bg-accent/50 transition-colors cursor-pointer",onClick:()=>_e(k.chat_id,k.filename),children:[e.jsxs("div",{className:"flex items-center justify-between mb-2",children:[e.jsx("span",{className:"text-sm font-medium text-muted-foreground",children:Fo(k.timestamp)}),e.jsxs("div",{className:"flex items-center gap-2 text-xs text-muted-foreground",children:[k.success?e.jsxs(Se,{variant:"default",className:"text-xs bg-green-600",children:[e.jsx(ig,{className:"h-3 w-3 mr-1"}),"成功"]}):e.jsxs(Se,{variant:"destructive",className:"text-xs",children:[e.jsx(Va,{className:"h-3 w-3 mr-1"}),"失败"]}),e.jsx(Se,{variant:"outline",className:"text-xs",children:k.model}),e.jsxs(Se,{variant:"secondary",className:"text-xs",children:[k.overall_ms.toFixed(0),"ms"]})]})]}),e.jsx("p",{className:"text-sm line-clamp-2",children:k.output_preview||"无输出内容"})]},k.filename))}),e.jsxs("div",{className:"flex items-center justify-between mt-4 pt-4 border-t",children:[e.jsxs("div",{className:"text-sm text-muted-foreground",children:["共 ",v.total," 条记录,第 ",R," / ",O," 页"]}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(_,{variant:"outline",size:"sm",onClick:()=>D(1),disabled:R===1,children:e.jsx(gn,{className:"h-4 w-4"})}),e.jsx(_,{variant:"outline",size:"sm",onClick:()=>D(k=>Math.max(1,k-1)),disabled:R===1,children:e.jsx(Aa,{className:"h-4 w-4"})}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(le,{type:"number",min:1,max:O,value:M,onChange:k=>T(k.target.value),onKeyDown:k=>k.key==="Enter"&&ke(),placeholder:"跳转",className:"w-20 h-8"}),e.jsx(_,{size:"sm",variant:"outline",onClick:ke,children:"跳转"})]}),e.jsx(_,{variant:"outline",size:"sm",onClick:()=>D(k=>Math.min(O,k+1)),disabled:R===O,children:e.jsx(Zt,{className:"h-4 w-4"})}),e.jsx(_,{variant:"outline",size:"sm",onClick:()=>D(O),disabled:R===O,children:e.jsx(jn,{className:"h-4 w-4"})})]})]})]}):e.jsx("div",{className:"text-center py-8 text-muted-foreground",children:"暂无回复记录"})})]})]})}),e.jsx(Is,{open:xe,onOpenChange:he,children:e.jsxs(Os,{className:"max-w-4xl max-h-[80vh] grid grid-rows-[auto_1fr_auto] overflow-hidden",children:[e.jsxs(Ds,{children:[e.jsxs(Rs,{className:"flex items-center gap-2",children:[e.jsx(Ca,{className:"h-5 w-5"}),"回复生成详情"]}),e.jsx(Ks,{children:"查看麦麦的详细回复生成过程"})]}),e.jsx(Ye,{className:"h-full pr-4",children:e.jsx("div",{className:"space-y-6 pb-4",children:ne?e.jsx("div",{className:"space-y-4",children:[...Array(5)].map((k,H)=>e.jsx(js,{className:"h-24 w-full"},H))}):U?e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"space-y-2",children:[e.jsxs("h3",{className:"text-sm font-semibold flex items-center gap-2",children:[e.jsx(na,{className:"h-4 w-4"}),"基本信息"]}),e.jsxs("div",{className:"grid grid-cols-2 gap-4 p-4 bg-muted/50 rounded-lg",children:[e.jsxs("div",{children:[e.jsx("div",{className:"text-xs text-muted-foreground mb-1",children:"聊天"}),e.jsx("div",{className:"text-sm",title:U.chat_id,children:h(U.chat_id)})]}),e.jsxs("div",{children:[e.jsx("div",{className:"text-xs text-muted-foreground mb-1",children:"时间戳"}),e.jsx("div",{className:"text-sm",children:Fo(U.timestamp)})]}),e.jsxs("div",{children:[e.jsx("div",{className:"text-xs text-muted-foreground mb-1",children:"状态"}),U.success?e.jsxs(Se,{variant:"default",className:"bg-green-600",children:[e.jsx(ig,{className:"h-3 w-3 mr-1"}),"成功"]}):e.jsxs(Se,{variant:"destructive",children:[e.jsx(Va,{className:"h-3 w-3 mr-1"}),"失败"]})]}),e.jsxs("div",{children:[e.jsx("div",{className:"text-xs text-muted-foreground mb-1",children:"思考深度"}),e.jsxs(Se,{variant:"outline",children:["Level ",U.think_level]})]})]})]}),e.jsx(Yt,{}),e.jsxs("div",{className:"space-y-2",children:[e.jsxs("h3",{className:"text-sm font-semibold flex items-center gap-2",children:[e.jsx(c_,{className:"h-4 w-4"}),"模型信息"]}),e.jsx("div",{className:"p-4 bg-muted/50 rounded-lg",children:e.jsx(Se,{variant:"secondary",className:"text-sm",children:U.model})})]}),e.jsx(Yt,{}),e.jsxs("div",{className:"space-y-2",children:[e.jsxs("h3",{className:"text-sm font-semibold flex items-center gap-2",children:[e.jsx(Za,{className:"h-4 w-4"}),"性能统计"]}),e.jsxs("div",{className:"grid grid-cols-3 gap-3",children:[e.jsxs(Ce,{children:[e.jsx(De,{className:"p-4 pb-2",children:e.jsx(Le,{className:"text-xs text-muted-foreground",children:"提示词构建"})}),e.jsx(Ae,{className:"p-4 pt-0",children:e.jsxs("div",{className:"text-xl font-bold",children:[U.timing.prompt_ms?.toFixed(2)||0,"ms"]})})]}),e.jsxs(Ce,{children:[e.jsx(De,{className:"p-4 pb-2",children:e.jsx(Le,{className:"text-xs text-muted-foreground",children:"LLM 推理"})}),e.jsx(Ae,{className:"p-4 pt-0",children:e.jsxs("div",{className:"text-xl font-bold",children:[U.timing.llm_ms?.toFixed(2)||0,"ms"]})})]}),e.jsxs(Ce,{children:[e.jsx(De,{className:"p-4 pb-2",children:e.jsx(Le,{className:"text-xs text-muted-foreground",children:"总耗时"})}),e.jsx(Ae,{className:"p-4 pt-0",children:e.jsxs("div",{className:"text-xl font-bold",children:[U.timing.overall_ms?.toFixed(2)||0,"ms"]})})]})]}),U.timing.timing_logs&&U.timing.timing_logs.length>0&&e.jsxs("div",{className:"mt-3 p-3 bg-muted/30 rounded-lg",children:[e.jsx("div",{className:"text-xs font-medium text-muted-foreground mb-2",children:"耗时详情"}),e.jsx("div",{className:"space-y-1",children:U.timing.timing_logs.map((k,H)=>e.jsx("div",{className:"text-xs text-muted-foreground",children:k},H))})]}),U.timing.almost_zero&&e.jsxs("div",{className:"mt-2 text-xs text-muted-foreground",children:[e.jsx("span",{className:"font-medium",children:"近乎零耗时: "}),U.timing.almost_zero]})]}),e.jsx(Yt,{}),e.jsxs("div",{className:"space-y-2",children:[e.jsxs("h3",{className:"text-sm font-semibold flex items-center gap-2",children:[e.jsx(Xm,{className:"h-4 w-4"}),"回复输出"]}),e.jsx("div",{className:"p-4 bg-muted/50 rounded-lg",children:e.jsx("p",{className:"text-sm whitespace-pre-wrap leading-relaxed",children:U.output||"无输出内容"})})]}),U.processed_output&&U.processed_output.length>0&&e.jsxs(e.Fragment,{children:[e.jsx(Yt,{}),e.jsxs("div",{className:"space-y-2",children:[e.jsx("h3",{className:"text-sm font-semibold",children:"处理后的输出"}),e.jsx("div",{className:"space-y-2",children:U.processed_output.map((k,H)=>e.jsx("div",{className:"p-3 bg-muted/30 rounded-lg",children:e.jsx("p",{className:"text-sm whitespace-pre-wrap",children:k})},H))})]})]}),U.reasoning&&e.jsxs(e.Fragment,{children:[e.jsx(Yt,{}),e.jsxs("div",{className:"space-y-2",children:[e.jsx("h3",{className:"text-sm font-semibold",children:"推理过程"}),e.jsx("div",{className:"p-4 bg-muted/50 rounded-lg",children:e.jsx("p",{className:"text-sm whitespace-pre-wrap leading-relaxed",children:U.reasoning})})]})]}),U.error&&e.jsxs(e.Fragment,{children:[e.jsx(Yt,{}),e.jsxs("div",{className:"space-y-2",children:[e.jsx("h3",{className:"text-sm font-semibold text-destructive",children:"错误信息"}),e.jsx("div",{className:"p-4 bg-destructive/10 rounded-lg border border-destructive/20",children:e.jsx("p",{className:"text-sm text-destructive whitespace-pre-wrap",children:U.error})})]})]}),U.prompt&&e.jsxs(e.Fragment,{children:[e.jsx(Yt,{}),e.jsxs("div",{className:"space-y-2",children:[e.jsx("h3",{className:"text-sm font-semibold",children:"完整提示词"}),e.jsxs("details",{className:"group",children:[e.jsx("summary",{className:"cursor-pointer text-sm text-muted-foreground hover:text-foreground",children:"点击展开查看完整提示词"}),e.jsx("div",{className:"mt-2 p-4 bg-muted/50 rounded-lg",children:e.jsx("pre",{className:"text-xs whitespace-pre-wrap break-words",children:U.prompt})})]})]})]})]}):e.jsx("div",{className:"flex items-center justify-center py-12",children:e.jsx("p",{className:"text-muted-foreground",children:"无数据"})})})}),e.jsx(st,{className:"flex-shrink-0",children:e.jsx(_,{onClick:()=>he(!1),children:"关闭"})})]})})]})}function pk(){const[l,n]=d.useState("planner"),[i,c]=d.useState(!1),[u,x]=d.useState(0),h=d.useCallback(()=>{x(f=>f+1)},[]);return e.jsxs("div",{className:"space-y-4 sm:space-y-6 p-4 sm:p-6",children:[e.jsxs("div",{className:"flex flex-col sm:flex-row sm:items-center justify-between gap-4",children:[e.jsxs("div",{children:[e.jsx("h1",{className:"text-2xl sm:text-3xl font-bold",children:"计划器 & 回复器监控"}),e.jsx("p",{className:"text-muted-foreground mt-1 sm:mt-2 text-sm sm:text-base",children:"实时监控麦麦的任务计划器和回复生成器运行状态"})]}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsxs(_,{variant:i?"default":"outline",size:"sm",onClick:()=>c(!i),children:[e.jsx(dt,{className:`h-4 w-4 mr-2 ${i?"animate-spin":""}`}),i?"自动刷新中":"自动刷新"]}),e.jsx(_,{variant:"outline",size:"sm",onClick:h,children:e.jsx(dt,{className:"h-4 w-4"})})]})]}),e.jsxs(ta,{value:l,onValueChange:f=>n(f),className:"w-full",children:[e.jsxs(Xt,{className:"grid w-full grid-cols-2 gap-0.5 sm:gap-1 h-auto p-1",children:[e.jsxs(Je,{value:"planner",className:"gap-1 sm:gap-2 text-xs sm:text-sm px-2 sm:px-3 py-2",children:[e.jsx(Gm,{className:"h-3.5 w-3.5 sm:h-4 sm:w-4",strokeWidth:2,fill:"none"}),e.jsx("span",{children:"计划器监控"})]}),e.jsxs(Je,{value:"replier",className:"gap-1 sm:gap-2 text-xs sm:text-sm px-2 sm:px-3 py-2",children:[e.jsx(o_,{className:"h-3.5 w-3.5 sm:h-4 sm:w-4",strokeWidth:2,fill:"none"}),e.jsx("span",{children:"回复器监控"})]})]}),e.jsxs(Ye,{className:"h-[calc(100vh-240px)] sm:h-[calc(100vh-280px)] mt-4 sm:mt-6",children:[e.jsx(ys,{value:"planner",className:"mt-0",children:e.jsx(hk,{autoRefresh:i,refreshKey:u})}),e.jsx(ys,{value:"replier",className:"mt-0",children:e.jsx(fk,{autoRefresh:i,refreshKey:u})})]})]})]})}const gk="Mai-with-u",jk="plugin-repo",vk="main",Nk="plugin_details.json";async function bk(){try{const l=await we("/api/webui/plugins/fetch-raw",{method:"POST",body:JSON.stringify({owner:gk,repo:jk,branch:vk,file_path:Nk})});if(!l.ok)throw new Error(`HTTP error! status: ${l.status}`);const n=await l.json();if(!n.success||!n.data)throw new Error(n.error||"获取插件列表失败");return JSON.parse(n.data).filter(u=>!u?.id||!u?.manifest?(console.warn("跳过无效插件数据:",u),!1):!u.manifest.name||!u.manifest.version?(console.warn("跳过缺少必需字段的插件:",u.id),!1):!0).map(u=>({id:u.id,manifest:{manifest_version:u.manifest.manifest_version||1,name:u.manifest.name,version:u.manifest.version,description:u.manifest.description||"",author:u.manifest.author||{name:"Unknown"},license:u.manifest.license||"Unknown",host_application:u.manifest.host_application||{min_version:"0.0.0"},homepage_url:u.manifest.homepage_url,repository_url:u.manifest.repository_url,keywords:u.manifest.keywords||[],categories:u.manifest.categories||[],default_locale:u.manifest.default_locale||"zh-CN",locales_path:u.manifest.locales_path},downloads:0,rating:0,review_count:0,installed:!1,published_at:new Date().toISOString(),updated_at:new Date().toISOString()}))}catch(l){throw console.error("Failed to fetch plugin list:",l),l}}async function Lv(){try{const l=await we("/api/webui/plugins/git-status");if(!l.ok)throw new Error(`HTTP error! status: ${l.status}`);return await l.json()}catch(l){return console.error("Failed to check Git status:",l),{installed:!1,error:"无法检测 Git 安装状态"}}}async function Uv(){try{const l=await we("/api/webui/plugins/version");if(!l.ok)throw new Error(`HTTP error! status: ${l.status}`);return await l.json()}catch(l){return console.error("Failed to get Maimai version:",l),{version:"0.0.0",version_major:0,version_minor:0,version_patch:0}}}function $v(l,n,i){const c=l.split(".").map(f=>parseInt(f)||0),u=c[0]||0,x=c[1]||0,h=c[2]||0;if(i.version_majorparseInt(v)||0),p=f[0]||0,g=f[1]||0,N=f[2]||0;if(i.version_major>p||i.version_major===p&&i.version_minor>g||i.version_major===p&&i.version_minor===g&&i.version_patch>N)return!1}return!0}async function yk(){try{const l=await we("/api/webui/ws-token");if(!l.ok)return console.error("获取 WebSocket token 失败:",l.status),null;const n=await l.json();return n.success&&n.token?n.token:null}catch(l){return console.error("获取 WebSocket token 失败:",l),null}}async function wk(l,n){const i=await yk();if(!i)return console.warn("无法获取 WebSocket token,可能未登录"),null;const c=window.location.protocol==="https:"?"wss:":"ws:",u=window.location.host,x=`${c}//${u}/api/webui/ws/plugin-progress?token=${encodeURIComponent(i)}`;try{const h=new WebSocket(x);return h.onopen=()=>{console.log("Plugin progress WebSocket connected");const f=setInterval(()=>{h.readyState===WebSocket.OPEN?h.send("ping"):clearInterval(f)},3e4)},h.onmessage=f=>{try{if(f.data==="pong")return;const p=JSON.parse(f.data);l(p)}catch(p){console.error("Failed to parse progress data:",p)}},h.onerror=f=>{console.error("Plugin progress WebSocket error:",f),n?.(f)},h.onclose=()=>{console.log("Plugin progress WebSocket disconnected")},h}catch(h){return console.error("创建 WebSocket 连接失败:",h),null}}async function Al(){try{const l=await we("/api/webui/plugins/installed",{headers:Fs()});if(!l.ok)throw new Error(`HTTP error! status: ${l.status}`);const n=await l.json();if(!n.success)throw new Error(n.message||"获取已安装插件列表失败");return n.plugins||[]}catch(l){return console.error("Failed to get installed plugins:",l),[]}}function mn(l,n){return n.some(i=>i.id===l)}function xn(l,n){const i=n.find(c=>c.id===l);if(i)return i.manifest?.version||i.version}async function Bv(l,n,i="main"){const c=await we("/api/webui/plugins/install",{method:"POST",body:JSON.stringify({plugin_id:l,repository_url:n,branch:i})});if(!c.ok){const u=await c.json();throw new Error(u.detail||"安装失败")}return await c.json()}async function Iv(l){const n=await we("/api/webui/plugins/uninstall",{method:"POST",body:JSON.stringify({plugin_id:l})});if(!n.ok){const i=await n.json();throw new Error(i.detail||"卸载失败")}return await n.json()}async function Pv(l,n,i="main"){const c=await we("/api/webui/plugins/update",{method:"POST",body:JSON.stringify({plugin_id:l,repository_url:n,branch:i})});if(!c.ok){const u=await c.json();throw new Error(u.detail||"更新失败")}return await c.json()}async function _k(l){const n=await we(`/api/webui/plugins/config/${l}/schema`,{headers:Fs()});if(!n.ok){const c=await n.text();try{const u=JSON.parse(c);throw new Error(u.detail||"获取配置 Schema 失败")}catch{throw new Error(`获取配置 Schema 失败 (${n.status})`)}}const i=await n.json();if(!i.success)throw new Error(i.message||"获取配置 Schema 失败");return i.schema}async function Sk(l){const n=await we(`/api/webui/plugins/config/${l}`,{headers:Fs()});if(!n.ok){const c=await n.text();try{const u=JSON.parse(c);throw new Error(u.detail||"获取配置失败")}catch{throw new Error(`获取配置失败 (${n.status})`)}}const i=await n.json();if(!i.success)throw new Error(i.message||"获取配置失败");return i.config}async function kk(l){const n=await we(`/api/webui/plugins/config/${l}/raw`,{headers:Fs()});if(!n.ok){const c=await n.text();try{const u=JSON.parse(c);throw new Error(u.detail||"获取配置失败")}catch{throw new Error(`获取配置失败 (${n.status})`)}}const i=await n.json();if(!i.success)throw new Error(i.message||"获取配置失败");return i.config}async function Ck(l,n){const i=await we(`/api/webui/plugins/config/${l}`,{method:"PUT",headers:Fs(),body:JSON.stringify({config:n})});if(!i.ok){const c=await i.json();throw new Error(c.detail||"保存配置失败")}return await i.json()}async function Tk(l,n){const i=await we(`/api/webui/plugins/config/${l}/raw`,{method:"PUT",headers:Fs(),body:JSON.stringify({config:n})});if(!i.ok){const c=await i.json();throw new Error(c.detail||"保存配置失败")}return await i.json()}async function Ek(l){const n=await we(`/api/webui/plugins/config/${l}/reset`,{method:"POST",headers:Fs()});if(!n.ok){const i=await n.json();throw new Error(i.detail||"重置配置失败")}return await n.json()}async function Mk(l){const n=await we(`/api/webui/plugins/config/${l}/toggle`,{method:"POST",headers:Fs()});if(!n.ok){const i=await n.json();throw new Error(i.detail||"切换状态失败")}return await n.json()}const uc="https://maibot-plugin-stats.maibot-webui.workers.dev";async function Hv(l){try{const n=await fetch(`${uc}/stats/${l}`);return n.ok?await n.json():(console.error("Failed to fetch plugin stats:",n.statusText),null)}catch(n){return console.error("Error fetching plugin stats:",n),null}}async function zk(l,n){try{const i=n||dx(),c=await fetch(`${uc}/stats/like`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({plugin_id:l,user_id:i})}),u=await c.json();return c.status===429?{success:!1,error:"操作过于频繁,请稍后再试"}:c.ok?{success:!0,...u}:{success:!1,error:u.error||"点赞失败"}}catch(i){return console.error("Error liking plugin:",i),{success:!1,error:"网络错误"}}}async function Ak(l,n){try{const i=n||dx(),c=await fetch(`${uc}/stats/dislike`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({plugin_id:l,user_id:i})}),u=await c.json();return c.status===429?{success:!1,error:"操作过于频繁,请稍后再试"}:c.ok?{success:!0,...u}:{success:!1,error:u.error||"点踩失败"}}catch(i){return console.error("Error disliking plugin:",i),{success:!1,error:"网络错误"}}}async function Ok(l,n,i,c){if(n<1||n>5)return{success:!1,error:"评分必须在 1-5 之间"};try{const u=c||dx(),x=await fetch(`${uc}/stats/rate`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({plugin_id:l,rating:n,comment:i,user_id:u})}),h=await x.json();return x.status===429?{success:!1,error:"每天最多评分 3 次"}:x.ok?{success:!0,...h}:{success:!1,error:h.error||"评分失败"}}catch(u){return console.error("Error rating plugin:",u),{success:!1,error:"网络错误"}}}async function Fv(l){try{const n=await fetch(`${uc}/stats/download`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({plugin_id:l})}),i=await n.json();return n.status===429?(console.warn("Download recording rate limited"),{success:!0}):n.ok?{success:!0,...i}:(console.error("Failed to record download:",i.error),{success:!1,error:i.error})}catch(n){return console.error("Error recording download:",n),{success:!1,error:"网络错误"}}}function Dk(){const l=navigator,n=[navigator.userAgent,navigator.language,navigator.languages?.join(",")||"",navigator.platform,navigator.hardwareConcurrency||0,screen.width,screen.height,screen.colorDepth,screen.pixelDepth,new Date().getTimezoneOffset(),Intl.DateTimeFormat().resolvedOptions().timeZone,navigator.maxTouchPoints||0,l.deviceMemory||0].join("|");let i=0;for(let c=0;c{const ee=Q.map(async Te=>{try{const de=await Hv(Te.id);return{id:Te.id,stats:de}}catch(de){return console.warn(`Failed to load stats for ${Te.id}:`,de),{id:Te.id,stats:null}}}),Ue=await Promise.all(ee),ie={};Ue.forEach(({id:Te,stats:de})=>{de&&(ie[Te]=de)}),U(ie)};d.useEffect(()=>{let Q=null,ee=!1;return(async()=>{if(Q=await wk(ie=>{ee||(T(ie),ie.stage==="success"?setTimeout(()=>{ee||T(null)},2e3):ie.stage==="error"&&(b(!1),D(ie.error||"加载失败")))},ie=>{console.error("WebSocket error:",ie),ee||pe({title:"WebSocket 连接失败",description:"无法实时显示加载进度",variant:"destructive"})}),await new Promise(ie=>{if(!Q){ie();return}const Te=()=>{Q&&Q.readyState===WebSocket.OPEN?(console.log("WebSocket connected, starting to load plugins"),ie()):Q&&Q.readyState===WebSocket.CLOSED?(console.warn("WebSocket closed before loading plugins"),ie()):setTimeout(Te,100)};Te()}),!ee){const ie=await Lv();P(ie),ie.installed||pe({title:"Git 未安装",description:ie.error||"请先安装 Git 才能使用插件安装功能",variant:"destructive"})}if(!ee){const ie=await Uv();F(ie)}if(!ee)try{b(!0),D(null);const ie=await bk();if(!ee){const Te=await Al();L(Te);const de=ie.map(Me=>{const rs=mn(Me.id,Te),Ut=xn(Me.id,Te);return{...Me,installed:rs,installed_version:Ut}});for(const Me of Te)!de.some(Ut=>Ut.id===Me.id)&&Me.manifest&&de.push({id:Me.id,manifest:{manifest_version:Me.manifest.manifest_version||1,name:Me.manifest.name,version:Me.manifest.version,description:Me.manifest.description||"",author:Me.manifest.author,license:Me.manifest.license||"Unknown",host_application:Me.manifest.host_application,homepage_url:Me.manifest.homepage_url,repository_url:Me.manifest.repository_url,keywords:Me.manifest.keywords||[],categories:Me.manifest.categories||[],default_locale:Me.manifest.default_locale||"zh-CN",locales_path:Me.manifest.locales_path},downloads:0,rating:0,review_count:0,installed:!0,installed_version:Me.manifest.version,published_at:new Date().toISOString(),updated_at:new Date().toISOString()});y(de),ke(de)}}catch(ie){if(!ee){const Te=ie instanceof Error?ie.message:"加载插件列表失败";D(Te),pe({title:"加载失败",description:Te,variant:"destructive"})}}finally{ee||b(!1)}})(),()=>{ee=!0,Q&&Q.close()}},[pe]);const O=Q=>{if(!Q.installed&&A&&!k(Q))return e.jsxs(Se,{variant:"destructive",className:"gap-1",children:[e.jsx(_t,{className:"h-3 w-3"}),"不兼容"]});if(Q.installed){const ee=Q.installed_version?.trim(),Ue=Q.manifest.version?.trim();if(ee!==Ue){const ie=ee?.split(".").map(Number)||[0,0,0],Te=Ue?.split(".").map(Number)||[0,0,0];for(let de=0;de<3;de++){if((Te[de]||0)>(ie[de]||0))return e.jsxs(Se,{variant:"outline",className:"gap-1 text-orange-600 border-orange-600",children:[e.jsx(_t,{className:"h-3 w-3"}),"可更新"]});if((Te[de]||0)<(ie[de]||0))break}}return e.jsxs(Se,{variant:"default",className:"gap-1",children:[e.jsx(pt,{className:"h-3 w-3"}),"已安装"]})}return null},k=Q=>!A||!Q.manifest?.host_application?!0:$v(Q.manifest.host_application.min_version,Q.manifest.host_application.max_version,A),H=Q=>{if(!Q.installed||!Q.installed_version||!Q.manifest?.version)return!1;const ee=Q.installed_version.trim(),Ue=Q.manifest.version.trim();if(ee===Ue)return!1;const ie=ee.split(".").map(Number),Te=Ue.split(".").map(Number);for(let de=0;de<3;de++){if((Te[de]||0)>(ie[de]||0))return!0;if((Te[de]||0)<(ie[de]||0))return!1}return!1},se=v.filter(Q=>{if(!Q.manifest)return console.warn("[过滤] 跳过无 manifest 的插件:",Q.id),!1;const ee=c===""||Q.manifest.name?.toLowerCase().includes(c.toLowerCase())||Q.manifest.description?.toLowerCase().includes(c.toLowerCase())||Q.manifest.keywords&&Q.manifest.keywords.some(de=>de.toLowerCase().includes(c.toLowerCase())),Ue=x==="all"||Q.manifest.categories&&Q.manifest.categories.includes(x);let ie=!0;f==="installed"?ie=Q.installed===!0:f==="updates"&&(ie=Q.installed===!0&&H(Q));const Te=!g||!A||k(Q);return ee&&Ue&&ie&&Te}),Ee=Q=>{if(!S?.installed){pe({title:"无法安装",description:"Git 未安装",variant:"destructive"});return}if(A&&!k(Q)){pe({title:"无法安装",description:"插件与当前麦麦版本不兼容",variant:"destructive"});return}ne(Q),je("main"),V(""),oe("preset"),_e(!1),xe(!0)},Z=async()=>{if(!he)return;const Q=B==="custom"?z:ve;if(!Q||Q.trim()===""){pe({title:"分支名称不能为空",variant:"destructive"});return}try{xe(!1),await Bv(he.id,he.manifest.repository_url||"",Q),Fv(he.id).catch(Ue=>{console.warn("Failed to record download:",Ue)}),pe({title:"安装成功",description:`${he.manifest.name} 已成功安装`});const ee=await Al();L(ee),y(Ue=>Ue.map(ie=>{if(ie.id===he.id){const Te=mn(ie.id,ee),de=xn(ie.id,ee);return{...ie,installed:Te,installed_version:de}}return ie}))}catch(ee){pe({title:"安装失败",description:ee instanceof Error?ee.message:"未知错误",variant:"destructive"})}finally{ne(null)}},Oe=async Q=>{try{await Iv(Q.id),pe({title:"卸载成功",description:`${Q.manifest.name} 已成功卸载`});const ee=await Al();L(ee),y(Ue=>Ue.map(ie=>{if(ie.id===Q.id){const Te=mn(ie.id,ee),de=xn(ie.id,ee);return{...ie,installed:Te,installed_version:de}}return ie}))}catch(ee){pe({title:"卸载失败",description:ee instanceof Error?ee.message:"未知错误",variant:"destructive"})}},ns=async Q=>{if(!S?.installed){pe({title:"无法更新",description:"Git 未安装",variant:"destructive"});return}try{const ee=await Pv(Q.id,Q.manifest.repository_url||"","main");pe({title:"更新成功",description:`${Q.manifest.name} 已从 ${ee.old_version} 更新到 ${ee.new_version}`});const Ue=await Al();L(Ue),y(ie=>ie.map(Te=>{if(Te.id===Q.id){const de=mn(Te.id,Ue),Me=xn(Te.id,Ue);return{...Te,installed:de,installed_version:Me}}return Te}))}catch(ee){pe({title:"更新失败",description:ee instanceof Error?ee.message:"未知错误",variant:"destructive"})}};return e.jsx(Ye,{className:"h-full",children:e.jsxs("div",{className:"space-y-6 p-4 sm:p-6",children:[e.jsxs("div",{className:"flex flex-col sm:flex-row sm:items-start sm:justify-between gap-4",children:[e.jsxs("div",{children:[e.jsx("h1",{className:"text-2xl sm:text-3xl font-bold",children:"插件市场"}),e.jsx("p",{className:"text-muted-foreground mt-2",children:"浏览和管理麦麦的插件"})]}),e.jsxs("div",{className:"flex gap-2",children:[e.jsxs(_,{variant:"outline",onClick:()=>n(),disabled:i,children:[e.jsx(Ij,{className:`h-4 w-4 mr-2 ${i?"animate-spin":""}`}),"重启麦麦"]}),e.jsxs(_,{onClick:()=>l({to:"/plugin-mirrors"}),children:[e.jsx(d_,{className:"h-4 w-4 mr-2"}),"配置镜像源"]})]})]}),e.jsx(Ce,{className:"border-blue-200 bg-blue-50 dark:bg-blue-950/20 dark:border-blue-900",children:e.jsx(Ae,{className:"py-3",children:e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(Ht,{className:"h-4 w-4 text-blue-600 flex-shrink-0"}),e.jsxs("p",{className:"text-sm text-blue-800 dark:text-blue-200",children:["安装、卸载或更新插件后,需要",e.jsx("span",{className:"font-semibold",children:"重启麦麦"}),"才能使更改生效"]})]})})}),S&&!S.installed&&e.jsxs(Ce,{className:"border-orange-600 bg-orange-50 dark:bg-orange-950/20",children:[e.jsx(De,{children:e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx(Jt,{className:"h-5 w-5 text-orange-600"}),e.jsxs("div",{children:[e.jsx(Le,{className:"text-lg text-orange-900 dark:text-orange-100",children:"Git 未安装"}),e.jsx(ws,{className:"text-orange-800 dark:text-orange-200",children:S.error||"请先安装 Git 才能使用插件安装功能"})]})]})}),e.jsx(Ae,{children:e.jsxs("p",{className:"text-sm text-orange-800 dark:text-orange-200",children:["您可以从 ",e.jsx("a",{href:"https://git-scm.com/downloads",target:"_blank",rel:"noopener noreferrer",className:"underline font-medium",children:"git-scm.com"})," 下载并安装 Git。 安装完成后,请重启麦麦应用。"]})})]}),e.jsx(Ce,{className:"p-4",children:e.jsxs("div",{className:"flex flex-col gap-4",children:[e.jsxs("div",{className:"flex flex-col sm:flex-row gap-4",children:[e.jsxs("div",{className:"flex-1 relative",children:[e.jsx(Tt,{className:"absolute left-3 top-1/2 -translate-y-1/2 h-4 w-4 text-muted-foreground"}),e.jsx(le,{placeholder:"搜索插件...",value:c,onChange:Q=>u(Q.target.value),className:"pl-9"})]}),e.jsxs(Ie,{value:x,onValueChange:h,children:[e.jsx($e,{className:"w-full sm:w-[200px]",children:e.jsx(Pe,{placeholder:"选择分类"})}),e.jsxs(Be,{children:[e.jsx(X,{value:"all",children:"全部分类"}),e.jsx(X,{value:"Group Management",children:"群组管理"}),e.jsx(X,{value:"Entertainment & Interaction",children:"娱乐互动"}),e.jsx(X,{value:"Utility Tools",children:"实用工具"}),e.jsx(X,{value:"Content Generation",children:"内容生成"}),e.jsx(X,{value:"Multimedia",children:"多媒体"}),e.jsx(X,{value:"External Integration",children:"外部集成"}),e.jsx(X,{value:"Data Analysis & Insights",children:"数据分析与洞察"}),e.jsx(X,{value:"Other",children:"其他"})]})]})]}),e.jsxs("div",{className:"flex items-center space-x-2",children:[e.jsx(qs,{id:"compatible-only",checked:g,onCheckedChange:Q=>N(Q===!0)}),e.jsx("label",{htmlFor:"compatible-only",className:"text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70 cursor-pointer",children:"只显示兼容当前版本的插件"})]})]})}),e.jsx(ta,{value:f,onValueChange:p,className:"w-full",children:e.jsxs(Xt,{className:"grid w-full grid-cols-3",children:[e.jsxs(Je,{value:"all",children:["全部插件 (",v.filter(Q=>{if(!Q.manifest)return!1;const ee=c===""||Q.manifest.name?.toLowerCase().includes(c.toLowerCase())||Q.manifest.description?.toLowerCase().includes(c.toLowerCase())||Q.manifest.keywords&&Q.manifest.keywords.some(Te=>Te.toLowerCase().includes(c.toLowerCase())),Ue=x==="all"||Q.manifest.categories&&Q.manifest.categories.includes(x),ie=!g||!A||k(Q);return ee&&Ue&&ie}).length,")"]}),e.jsxs(Je,{value:"installed",children:["已安装 (",v.filter(Q=>{if(!Q.manifest)return!1;const ee=c===""||Q.manifest.name?.toLowerCase().includes(c.toLowerCase())||Q.manifest.description?.toLowerCase().includes(c.toLowerCase())||Q.manifest.keywords&&Q.manifest.keywords.some(Te=>Te.toLowerCase().includes(c.toLowerCase())),Ue=x==="all"||Q.manifest.categories&&Q.manifest.categories.includes(x),ie=!g||!A||k(Q);return Q.installed&&ee&&Ue&&ie}).length,")"]}),e.jsxs(Je,{value:"updates",children:["可更新 (",v.filter(Q=>{if(!Q.manifest)return!1;const ee=c===""||Q.manifest.name?.toLowerCase().includes(c.toLowerCase())||Q.manifest.description?.toLowerCase().includes(c.toLowerCase())||Q.manifest.keywords&&Q.manifest.keywords.some(Te=>Te.toLowerCase().includes(c.toLowerCase())),Ue=x==="all"||Q.manifest.categories&&Q.manifest.categories.includes(x),ie=!g||!A||k(Q);return Q.installed&&H(Q)&&ee&&Ue&&ie}).length,")"]})]})}),M&&M.stage==="loading"&&M.operation==="fetch"&&e.jsx(Ce,{className:"p-4",children:e.jsxs("div",{className:"space-y-3",children:[e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(Bs,{className:"h-4 w-4 animate-spin"}),e.jsx("span",{className:"text-sm font-medium",children:"加载插件列表"})]}),e.jsxs("span",{className:"text-sm font-medium",children:[M.progress,"%"]})]}),e.jsx(Kn,{value:M.progress,className:"h-2"}),e.jsx("div",{className:"text-xs text-muted-foreground",children:M.message}),M.total_plugins>0&&e.jsxs("div",{className:"text-xs text-muted-foreground text-center",children:["已加载 ",M.loaded_plugins," / ",M.total_plugins," 个插件"]})]})}),M&&M.stage==="error"&&M.error&&e.jsx(Ce,{className:"border-destructive bg-destructive/10",children:e.jsx(De,{children:e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx(Jt,{className:"h-5 w-5 text-destructive"}),e.jsxs("div",{children:[e.jsx(Le,{className:"text-lg text-destructive",children:"加载失败"}),e.jsx(ws,{className:"text-destructive/80",children:M.error})]})]})})}),w?e.jsxs("div",{className:"flex items-center justify-center py-12",children:[e.jsx(Bs,{className:"h-8 w-8 animate-spin text-muted-foreground"}),e.jsx("span",{className:"ml-3 text-muted-foreground",children:"加载插件列表中..."})]}):R?e.jsx(Ce,{className:"p-6",children:e.jsxs("div",{className:"flex flex-col items-center justify-center py-8 text-center",children:[e.jsx(Jt,{className:"h-12 w-12 text-destructive mb-4"}),e.jsx("h3",{className:"text-lg font-semibold mb-2",children:"加载失败"}),e.jsx("p",{className:"text-sm text-muted-foreground mb-4",children:R}),e.jsx(_,{onClick:()=>window.location.reload(),children:"重新加载"})]})}):se.length===0?e.jsx(Ce,{className:"p-6",children:e.jsxs("div",{className:"flex flex-col items-center justify-center py-8 text-center",children:[e.jsx(Tt,{className:"h-12 w-12 text-muted-foreground mb-4"}),e.jsx("h3",{className:"text-lg font-semibold mb-2",children:"未找到插件"}),e.jsx("p",{className:"text-sm text-muted-foreground",children:c||x!=="all"?"尝试调整搜索条件或筛选器":"暂无可用插件"})]})}):e.jsx("div",{className:"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-6",children:se.map(Q=>e.jsxs(Ce,{className:"flex flex-col hover:shadow-lg transition-shadow h-full",children:[e.jsxs(De,{children:[e.jsxs("div",{className:"flex items-start justify-between gap-2",children:[e.jsx(Le,{className:"text-xl",children:Q.manifest?.name||Q.id}),e.jsxs("div",{className:"flex flex-col gap-1",children:[Q.manifest?.categories&&Q.manifest.categories[0]&&e.jsx(Se,{variant:"secondary",className:"text-xs whitespace-nowrap",children:Rk[Q.manifest.categories[0]]||Q.manifest.categories[0]}),O(Q)]})]}),e.jsx(ws,{className:"line-clamp-2",children:Q.manifest?.description||"无描述"})]}),e.jsx(Ae,{className:"flex-1",children:e.jsxs("div",{className:"space-y-3",children:[e.jsxs("div",{className:"flex items-center gap-4 text-sm text-muted-foreground",children:[e.jsxs("div",{className:"flex items-center gap-1",children:[e.jsx(sa,{className:"h-4 w-4"}),e.jsx("span",{children:(J[Q.id]?.downloads??Q.downloads??0).toLocaleString()})]}),e.jsxs("div",{className:"flex items-center gap-1",children:[e.jsx(dn,{className:"h-4 w-4 fill-yellow-400 text-yellow-400"}),e.jsx("span",{children:(J[Q.id]?.rating??Q.rating??0).toFixed(1)})]})]}),e.jsxs("div",{className:"flex flex-wrap gap-2",children:[Q.manifest?.keywords&&Q.manifest.keywords.slice(0,3).map(ee=>e.jsx(Se,{variant:"outline",className:"text-xs",children:ee},ee)),Q.manifest?.keywords&&Q.manifest.keywords.length>3&&e.jsxs(Se,{variant:"outline",className:"text-xs",children:["+",Q.manifest.keywords.length-3]})]}),e.jsxs("div",{className:"text-xs text-muted-foreground pt-2 border-t space-y-1",children:[e.jsxs("div",{children:["v",Q.manifest?.version||"unknown"," · ",Q.manifest?.author?.name||"Unknown"]}),Q.manifest?.host_application&&e.jsxs("div",{className:"flex items-center gap-1",children:[e.jsx("span",{children:"支持:"}),e.jsxs("span",{className:"font-medium",children:[Q.manifest.host_application.min_version,Q.manifest.host_application.max_version?` - ${Q.manifest.host_application.max_version}`:" - 最新版本"]})]})]})]})}),e.jsx(Zo,{className:"pt-4",children:e.jsxs("div",{className:"flex items-center justify-end gap-2 w-full",children:[e.jsx(_,{variant:"outline",size:"sm",onClick:()=>l({to:"/plugin-detail",search:{pluginId:Q.id}}),children:"查看详情"}),Q.installed?H(Q)?e.jsxs(_,{size:"sm",disabled:!S?.installed,title:S?.installed?void 0:"Git 未安装",onClick:()=>ns(Q),children:[e.jsx(dt,{className:"h-4 w-4 mr-1"}),"更新"]}):e.jsxs(_,{variant:"destructive",size:"sm",disabled:!S?.installed,title:S?.installed?void 0:"Git 未安装",onClick:()=>Oe(Q),children:[e.jsx(ls,{className:"h-4 w-4 mr-1"}),"卸载"]}):e.jsxs(_,{size:"sm",disabled:!S?.installed||M?.operation==="install"||A!==null&&!k(Q),title:S?.installed?A!==null&&!k(Q)?`不兼容当前版本 (需要 ${Q.manifest?.host_application?.min_version||"未知"}${Q.manifest?.host_application?.max_version?` - ${Q.manifest.host_application.max_version}`:"+"},当前 ${A?.version})`:void 0:"Git 未安装",onClick:()=>Ee(Q),children:[e.jsx(sa,{className:"h-4 w-4 mr-1"}),M?.operation==="install"&&M?.plugin_id===Q.id?"安装中...":"安装"]})]})}),M&&(M.stage==="loading"||M.stage==="success"||M.stage==="error")&&M.operation!=="fetch"&&M.plugin_id===Q.id&&e.jsx("div",{className:"px-6 pb-4 -mt-2",children:e.jsxs("div",{className:`space-y-2 p-3 rounded-lg border ${M.stage==="success"?"bg-green-50 dark:bg-green-950/20 border-green-200 dark:border-green-900":M.stage==="error"?"bg-red-50 dark:bg-red-950/20 border-red-200 dark:border-red-900":"bg-muted/50"}`,children:[e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[M.stage==="loading"?e.jsx(Bs,{className:"h-3 w-3 animate-spin"}):M.stage==="success"?e.jsx(pt,{className:"h-3 w-3 text-green-600"}):e.jsx(_t,{className:"h-3 w-3 text-red-600"}),e.jsx("span",{className:`text-xs font-medium ${M.stage==="success"?"text-green-700 dark:text-green-300":M.stage==="error"?"text-red-700 dark:text-red-300":""}`,children:M.stage==="loading"?e.jsxs(e.Fragment,{children:[M.operation==="install"&&"正在安装",M.operation==="uninstall"&&"正在卸载",M.operation==="update"&&"正在更新"]}):M.stage==="success"?e.jsxs(e.Fragment,{children:[M.operation==="install"&&"安装完成",M.operation==="uninstall"&&"卸载完成",M.operation==="update"&&"更新完成"]}):e.jsxs(e.Fragment,{children:[M.operation==="install"&&"安装失败",M.operation==="uninstall"&&"卸载失败",M.operation==="update"&&"更新失败"]})})]}),M.stage!=="error"&&e.jsxs("span",{className:`text-xs font-medium ${M.stage==="success"?"text-green-700 dark:text-green-300":""}`,children:[M.progress,"%"]})]}),M.stage!=="error"&&e.jsx(Kn,{value:M.progress,className:`h-1.5 ${M.stage==="success"?"[&>div]:bg-green-500":""}`}),e.jsx("div",{className:`text-xs ${M.stage==="success"?"text-green-600 dark:text-green-400 truncate":M.stage==="error"?"text-red-600 dark:text-red-400":"text-muted-foreground truncate"}`,children:M.stage==="error"?M.error||M.message||"操作失败":M.message})]})})]},Q.id))}),e.jsx(Is,{open:ue,onOpenChange:xe,children:e.jsxs(Os,{children:[e.jsxs(Ds,{children:[e.jsx(Rs,{children:"安装插件"}),e.jsxs(Ks,{children:["安装 ",he?.manifest.name]})]}),e.jsxs("div",{className:"space-y-4",children:[e.jsxs("div",{children:[e.jsxs("p",{className:"text-sm text-muted-foreground",children:["版本: ",he?.manifest.version]}),e.jsxs("p",{className:"text-sm text-muted-foreground",children:["作者: ",typeof he?.manifest.author=="string"?he.manifest.author:he?.manifest.author?.name]})]}),e.jsxs("div",{className:"flex items-center space-x-2",children:[e.jsx(qs,{id:"advanced-options",checked:K,onCheckedChange:Q=>_e(Q)}),e.jsx("label",{htmlFor:"advanced-options",className:"text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70",children:"高级选项"})]}),K&&e.jsx("div",{className:"space-y-4 p-4 border rounded-lg",children:e.jsxs("div",{className:"space-y-2",children:[e.jsx("label",{className:"text-sm font-medium",children:"分支选择"}),e.jsxs(ta,{value:B,onValueChange:Q=>oe(Q),children:[e.jsxs(Xt,{className:"grid w-full grid-cols-2",children:[e.jsx(Je,{value:"preset",className:"text-xs",children:"预设分支"}),e.jsx(Je,{value:"custom",className:"text-xs",children:"自定义分支"})]}),B==="preset"&&e.jsx("div",{className:"mt-3",children:e.jsxs(Ie,{value:ve,onValueChange:je,children:[e.jsx($e,{children:e.jsx(Pe,{placeholder:"选择分支"})}),e.jsxs(Be,{children:[e.jsx(X,{value:"main",children:"main (默认)"}),e.jsx(X,{value:"master",children:"master"}),e.jsx(X,{value:"dev",children:"dev (开发版)"}),e.jsx(X,{value:"develop",children:"develop"}),e.jsx(X,{value:"beta",children:"beta (测试版)"}),e.jsx(X,{value:"stable",children:"stable (稳定版)"})]})]})}),B==="custom"&&e.jsxs("div",{className:"space-y-2 mt-3",children:[e.jsx("input",{type:"text",className:"flex h-10 w-full rounded-md border border-input bg-background px-3 py-2 text-sm ring-offset-background file:border-0 file:bg-transparent file:text-sm file:font-medium placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50",placeholder:"输入分支名称,例如: feature/new-feature",value:z,onChange:Q=>V(Q.target.value)}),e.jsx("p",{className:"text-xs text-muted-foreground",children:"输入 Git 分支名称、标签或提交哈希"})]})]})]})}),!K&&e.jsx("p",{className:"text-sm text-muted-foreground",children:"将从默认分支 (main) 安装插件"})]}),e.jsxs(st,{children:[e.jsx(_,{variant:"outline",onClick:()=>xe(!1),children:"取消"}),e.jsxs(_,{onClick:Z,children:[e.jsx(sa,{className:"h-4 w-4 mr-2"}),"安装"]})]})]})}),e.jsx(Jn,{})]})})}function $k(){return e.jsxs("div",{className:"h-[calc(100vh-4rem)] flex flex-col p-4 sm:p-6",children:[e.jsx("div",{className:"mb-4 sm:mb-6",children:e.jsx("div",{className:"flex flex-col sm:flex-row sm:items-center justify-between gap-4",children:e.jsxs("div",{children:[e.jsxs("h1",{className:"text-2xl sm:text-3xl font-bold flex items-center gap-2",children:[e.jsx(Pj,{className:"h-8 w-8",strokeWidth:2}),"模型分配预设市场"]}),e.jsx("p",{className:"text-muted-foreground mt-1 text-sm sm:text-base",children:"浏览和下载社区共享的模型分配预设配置"})]})})}),e.jsx(Ye,{className:"flex-1",children:e.jsx("div",{className:"flex items-center justify-center h-[calc(100vh-12rem)]",children:e.jsxs(Ce,{className:"max-w-2xl w-full border-dashed",children:[e.jsxs(De,{className:"text-center",children:[e.jsx("div",{className:"flex justify-center mb-4",children:e.jsx(ra,{className:"h-16 w-16 text-muted-foreground"})}),e.jsx(Le,{className:"text-2xl",children:"功能开发中"}),e.jsx(ws,{className:"text-base",children:"模型分配预设市场功能正在开发中,敬请期待!"})]}),e.jsx(Ae,{children:e.jsxs("div",{className:"space-y-3 text-sm text-muted-foreground",children:[e.jsx("p",{className:"font-medium text-foreground",children:"📦 即将推出的功能:"}),e.jsxs("ul",{className:"space-y-2 ml-6",children:[e.jsxs("li",{className:"flex items-start",children:[e.jsx("span",{className:"mr-2",children:"•"}),e.jsx("span",{children:"浏览社区共享的模型分配预设配置"})]}),e.jsxs("li",{className:"flex items-start",children:[e.jsx("span",{className:"mr-2",children:"•"}),e.jsx("span",{children:"一键下载和应用预设配置"})]}),e.jsxs("li",{className:"flex items-start",children:[e.jsx("span",{className:"mr-2",children:"•"}),e.jsx("span",{children:"分享自己的模型分配方案"})]}),e.jsxs("li",{className:"flex items-start",children:[e.jsx("span",{className:"mr-2",children:"•"}),e.jsx("span",{children:"预设配置评分和评论系统"})]}),e.jsxs("li",{className:"flex items-start",children:[e.jsx("span",{className:"mr-2",children:"•"}),e.jsx("span",{children:"根据使用场景智能推荐配置"})]})]})]})})]})})})]})}function Bk({field:l,value:n,onChange:i}){const[c,u]=d.useState(!1);switch(l.ui_type){case"switch":return e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsxs("div",{className:"space-y-0.5",children:[e.jsx(E,{children:l.label}),l.hint&&e.jsx("p",{className:"text-xs text-muted-foreground",children:l.hint})]}),e.jsx(Fe,{checked:!!n,onCheckedChange:i,disabled:l.disabled})]});case"number":return e.jsxs("div",{className:"space-y-2",children:[e.jsx(E,{children:l.label}),e.jsx(le,{type:"number",value:n??l.default,onChange:x=>i(parseFloat(x.target.value)||0),min:l.min,max:l.max,step:l.step??1,placeholder:l.placeholder,disabled:l.disabled}),l.hint&&e.jsx("p",{className:"text-xs text-muted-foreground",children:l.hint})]});case"slider":return e.jsxs("div",{className:"space-y-2",children:[e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsx(E,{children:l.label}),e.jsx("span",{className:"text-sm text-muted-foreground",children:n??l.default})]}),e.jsx(qa,{value:[n??l.default],onValueChange:x=>i(x[0]),min:l.min??0,max:l.max??100,step:l.step??1,disabled:l.disabled}),l.hint&&e.jsx("p",{className:"text-xs text-muted-foreground",children:l.hint})]});case"select":return e.jsxs("div",{className:"space-y-2",children:[e.jsx(E,{children:l.label}),e.jsxs(Ie,{value:String(n??l.default),onValueChange:i,disabled:l.disabled,children:[e.jsx($e,{children:e.jsx(Pe,{placeholder:l.placeholder??"请选择"})}),e.jsx(Be,{children:l.choices?.map(x=>e.jsx(X,{value:String(x),children:String(x)},String(x)))})]}),l.hint&&e.jsx("p",{className:"text-xs text-muted-foreground",children:l.hint})]});case"textarea":return e.jsxs("div",{className:"space-y-2",children:[e.jsx(E,{children:l.label}),e.jsx(ot,{value:n??l.default,onChange:x=>i(x.target.value),placeholder:l.placeholder,rows:l.rows??3,disabled:l.disabled}),l.hint&&e.jsx("p",{className:"text-xs text-muted-foreground",children:l.hint})]});case"password":return e.jsxs("div",{className:"space-y-2",children:[e.jsx(E,{children:l.label}),e.jsxs("div",{className:"relative",children:[e.jsx(le,{type:c?"text":"password",value:n??"",onChange:x=>i(x.target.value),placeholder:l.placeholder,disabled:l.disabled,className:"pr-10"}),e.jsx(_,{type:"button",variant:"ghost",size:"icon",className:"absolute right-0 top-0 h-full px-3",onClick:()=>u(!c),children:c?e.jsx(Wi,{className:"h-4 w-4"}):e.jsx(ia,{className:"h-4 w-4"})})]}),l.hint&&e.jsx("p",{className:"text-xs text-muted-foreground",children:l.hint})]});case"list":return e.jsxs("div",{className:"space-y-2",children:[e.jsx(E,{children:l.label}),e.jsx(G2,{value:Array.isArray(n)?n:[],onChange:x=>i(x),itemType:l.item_type??"string",itemFields:l.item_fields,minItems:l.min_items,maxItems:l.max_items,disabled:l.disabled,placeholder:l.placeholder}),l.hint&&e.jsx("p",{className:"text-xs text-muted-foreground",children:l.hint})]});case"text":default:return e.jsxs("div",{className:"space-y-2",children:[e.jsx(E,{children:l.label}),e.jsx(le,{type:"text",value:n??l.default??"",onChange:x=>i(x.target.value),placeholder:l.placeholder,maxLength:l.max_length,disabled:l.disabled}),l.hint&&e.jsx("p",{className:"text-xs text-muted-foreground",children:l.hint})]})}}function Lg({section:l,config:n,onChange:i}){const[c,u]=d.useState(!l.collapsed),x=Object.entries(l.fields).filter(([,h])=>!h.hidden).sort(([,h],[,f])=>h.order-f.order);return e.jsx(nc,{open:c,onOpenChange:u,children:e.jsxs(Ce,{children:[e.jsx(rc,{asChild:!0,children:e.jsxs(De,{className:"cursor-pointer hover:bg-muted/50 transition-colors",children:[e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[c?e.jsx(za,{className:"h-4 w-4 text-muted-foreground"}):e.jsx(Zt,{className:"h-4 w-4 text-muted-foreground"}),e.jsx(Le,{className:"text-lg",children:l.title})]}),e.jsxs(Se,{variant:"secondary",className:"text-xs",children:[x.length," 项"]})]}),l.description&&e.jsx(ws,{className:"ml-6",children:l.description})]})}),e.jsx(ic,{children:e.jsx(Ae,{className:"space-y-4 pt-0",children:x.map(([h,f])=>e.jsx(Bk,{field:f,value:n[l.name]?.[h],onChange:p=>i(l.name,h,p),sectionName:l.name},h))})})]})})}function Ik({plugin:l,onBack:n}){const{toast:i}=Zs(),{triggerRestart:c,isRestarting:u}=vn(),[x,h]=d.useState("visual"),[f,p]=d.useState(null),[g,N]=d.useState({}),[v,y]=d.useState({}),[w,b]=d.useState(""),[R,D]=d.useState(""),[S,P]=d.useState(!0),[M,T]=d.useState(!1),[A,F]=d.useState(!1),[L,J]=d.useState(!1),[U,ue]=d.useState(!1),xe=d.useCallback(async()=>{P(!0);try{const[B,oe,K]=await Promise.all([_k(l.id),Sk(l.id),kk(l.id)]);p(B),N(oe),y(JSON.parse(JSON.stringify(oe))),b(K),D(K)}catch(B){i({title:"加载配置失败",description:B instanceof Error?B.message:"未知错误",variant:"destructive"})}finally{P(!1)}},[l.id,i]);d.useEffect(()=>{xe()},[xe]),d.useEffect(()=>{F(x==="visual"?JSON.stringify(g)!==JSON.stringify(v):w!==R)},[g,v,w,R,x]);const he=(B,oe,K)=>{N(_e=>({..._e,[B]:{..._e[B]||{},[oe]:K}}))},ne=async()=>{T(!0);try{if(x==="source"){try{Tv(w)}catch(B){J(!0),i({title:"TOML 格式错误",description:B instanceof Error?B.message:"无法解析 TOML 配置,请检查语法",variant:"destructive"}),T(!1);return}await Tk(l.id,w),D(w),J(!1)}else await Ck(l.id,g),y(JSON.parse(JSON.stringify(g)));i({title:"配置已保存",description:"更改将在插件重新加载后生效"})}catch(B){i({title:"保存失败",description:B instanceof Error?B.message:"未知错误",variant:"destructive"})}finally{T(!1)}},ve=async()=>{try{await Ek(l.id),i({title:"配置已重置",description:"下次加载插件时将使用默认配置"}),ue(!1),xe()}catch(B){i({title:"重置失败",description:B instanceof Error?B.message:"未知错误",variant:"destructive"})}},je=async()=>{try{const B=await Mk(l.id);i({title:B.message,description:B.note}),xe()}catch(B){i({title:"切换状态失败",description:B instanceof Error?B.message:"未知错误",variant:"destructive"})}};if(S)return e.jsx("div",{className:"flex items-center justify-center h-64",children:e.jsx(Bs,{className:"h-8 w-8 animate-spin text-muted-foreground"})});if(!f)return e.jsxs("div",{className:"flex flex-col items-center justify-center h-64 space-y-4",children:[e.jsx(_t,{className:"h-12 w-12 text-muted-foreground"}),e.jsx("p",{className:"text-muted-foreground",children:"无法加载配置"}),e.jsxs(_,{onClick:n,variant:"outline",children:[e.jsx(Ta,{className:"h-4 w-4 mr-2"}),"返回"]})]});const z=Object.values(f.sections).sort((B,oe)=>B.order-oe.order),V=g.plugin?.enabled!==!1;return e.jsxs("div",{className:"space-y-4 sm:space-y-6",children:[e.jsxs("div",{className:"flex flex-col sm:flex-row sm:items-start sm:justify-between gap-4",children:[e.jsxs("div",{className:"flex items-start gap-3",children:[e.jsx(_,{variant:"ghost",size:"icon",onClick:n,children:e.jsx(Ta,{className:"h-5 w-5"})}),e.jsxs("div",{children:[e.jsx("h1",{className:"text-2xl sm:text-3xl font-bold",children:f.plugin_info.name||l.manifest.name}),e.jsxs("div",{className:"flex items-center gap-2 mt-1",children:[e.jsx(Se,{variant:V?"default":"secondary",children:V?"已启用":"已禁用"}),e.jsxs("span",{className:"text-sm text-muted-foreground",children:["v",f.plugin_info.version||l.manifest.version]})]})]})]}),e.jsxs("div",{className:"flex gap-2 ml-10 sm:ml-0",children:[e.jsx(_,{variant:"outline",size:"sm",onClick:()=>h(x==="visual"?"source":"visual"),children:x==="visual"?e.jsxs(e.Fragment,{children:[e.jsx(Uj,{className:"h-4 w-4 mr-2"}),"源代码"]}):e.jsxs(e.Fragment,{children:[e.jsx(Lj,{className:"h-4 w-4 mr-2"}),"可视化"]})}),e.jsxs(_,{variant:"outline",size:"sm",onClick:()=>c(),disabled:u,children:[e.jsx(Ij,{className:`h-4 w-4 mr-2 ${u?"animate-spin":""}`}),"重启麦麦"]}),e.jsxs(_,{variant:"outline",size:"sm",onClick:je,children:[e.jsx(cc,{className:"h-4 w-4 mr-2"}),V?"禁用":"启用"]}),e.jsxs(_,{variant:"outline",size:"sm",onClick:()=>ue(!0),children:[e.jsx(Zi,{className:"h-4 w-4 mr-2"}),"重置"]}),e.jsxs(_,{size:"sm",onClick:ne,disabled:!A||M,children:[M?e.jsx(Bs,{className:"h-4 w-4 mr-2 animate-spin"}):e.jsx(oc,{className:"h-4 w-4 mr-2"}),"保存"]})]})]}),A&&e.jsx(Ce,{className:"border-orange-200 bg-orange-50 dark:bg-orange-950/20 dark:border-orange-900",children:e.jsx(Ae,{className:"py-3",children:e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(Ht,{className:"h-4 w-4 text-orange-600"}),e.jsx("p",{className:"text-sm text-orange-800 dark:text-orange-200",children:"有未保存的更改"})]})})}),x==="source"&&e.jsxs("div",{className:"space-y-4",children:[e.jsxs(at,{children:[e.jsx(_t,{className:"h-4 w-4"}),e.jsxs(lt,{children:[e.jsx("strong",{children:"源代码模式(高级功能):"}),"直接编辑 TOML 配置文件。保存时会验证格式,只有格式正确才能保存。",L&&e.jsx("span",{className:"text-destructive font-semibold ml-2",children:"⚠️ 上次保存失败,请检查 TOML 格式"})]})]}),e.jsx(gv,{value:w,onChange:B=>{b(B),L&&J(!1)},language:"toml",theme:"dark",height:"calc(100vh - 350px)",minHeight:"500px",placeholder:"TOML 配置内容"})]}),x==="visual"&&e.jsxs(e.Fragment,{children:[e.jsxs(at,{children:[e.jsx(Ht,{className:"h-4 w-4"}),e.jsxs(lt,{children:[e.jsx("strong",{children:"提示:"}),"如果插件当前未加载或未启用,WebUI 适配器的高级插件可视化编辑功能可能会不可用。 请确保插件已启用并成功加载后,再进行配置编辑。"]})]}),f.layout.type==="tabs"&&f.layout.tabs.length>0?e.jsxs(ta,{defaultValue:f.layout.tabs[0]?.id,children:[e.jsx(Xt,{children:f.layout.tabs.map(B=>e.jsxs(Je,{value:B.id,children:[B.title,B.badge&&e.jsx(Se,{variant:"secondary",className:"ml-2 text-xs",children:B.badge})]},B.id))}),f.layout.tabs.map(B=>e.jsx(ys,{value:B.id,className:"space-y-4 mt-4",children:B.sections.map(oe=>{const K=f.sections[oe];return K?e.jsx(Lg,{section:K,config:g,onChange:he},oe):null})},B.id))]}):e.jsx("div",{className:"space-y-4",children:z.map(B=>e.jsx(Lg,{section:B,config:g,onChange:he},B.name))})]}),e.jsx(Is,{open:U,onOpenChange:ue,children:e.jsxs(Os,{children:[e.jsxs(Ds,{children:[e.jsx(Rs,{children:"确认重置配置"}),e.jsx(Ks,{children:"这将删除当前配置文件,下次加载插件时将使用默认配置。此操作不可撤销。"})]}),e.jsxs(st,{children:[e.jsx(_,{variant:"outline",onClick:()=>ue(!1),children:"取消"}),e.jsx(_,{variant:"destructive",onClick:ve,children:"确认重置"})]})]})})]})}function Pk(){return e.jsx(Yn,{children:e.jsx(Hk,{})})}function Hk(){const{toast:l}=Zs(),[n,i]=d.useState([]),[c,u]=d.useState(!0),[x,h]=d.useState(""),[f,p]=d.useState(null),g=async()=>{u(!0);try{const b=await Al();i(b)}catch(b){l({title:"加载插件列表失败",description:b instanceof Error?b.message:"未知错误",variant:"destructive"})}finally{u(!1)}};d.useEffect(()=>{g()},[]);const v=n.filter(b=>{const R=x.toLowerCase();return b.id.toLowerCase().includes(R)||b.manifest.name.toLowerCase().includes(R)||b.manifest.description?.toLowerCase().includes(R)}).filter((b,R,D)=>R===D.findIndex(S=>S.id===b.id)),y=n.length,w=0;return f?e.jsxs(e.Fragment,{children:[e.jsx(Ye,{className:"h-full",children:e.jsx("div",{className:"p-4 sm:p-6",children:e.jsx(Ik,{plugin:f,onBack:()=>p(null)})})}),e.jsx(Jn,{})]}):e.jsx(Ye,{className:"h-full",children:e.jsxs("div",{className:"space-y-4 sm:space-y-6 p-4 sm:p-6",children:[e.jsxs("div",{className:"flex flex-col sm:flex-row sm:items-start sm:justify-between gap-4",children:[e.jsxs("div",{children:[e.jsx("h1",{className:"text-2xl sm:text-3xl font-bold",children:"插件配置"}),e.jsx("p",{className:"text-muted-foreground mt-1 sm:mt-2 text-sm sm:text-base",children:"管理和配置已安装的插件"})]}),e.jsxs(_,{variant:"outline",size:"sm",onClick:g,children:[e.jsx(dt,{className:`h-4 w-4 mr-2 ${c?"animate-spin":""}`}),"刷新"]})]}),e.jsxs("div",{className:"grid gap-4 grid-cols-1 xs:grid-cols-2 lg:grid-cols-3",children:[e.jsxs(Ce,{children:[e.jsxs(De,{className:"flex flex-row items-center justify-between space-y-0 pb-2",children:[e.jsx(Le,{className:"text-sm font-medium",children:"已安装插件"}),e.jsx(ra,{className:"h-4 w-4 text-muted-foreground"})]}),e.jsxs(Ae,{children:[e.jsx("div",{className:"text-2xl font-bold",children:n.length}),e.jsx("p",{className:"text-xs text-muted-foreground mt-1",children:c?"正在加载...":"个插件"})]})]}),e.jsxs(Ce,{children:[e.jsxs(De,{className:"flex flex-row items-center justify-between space-y-0 pb-2",children:[e.jsx(Le,{className:"text-sm font-medium",children:"已启用"}),e.jsx(pt,{className:"h-4 w-4 text-green-600"})]}),e.jsxs(Ae,{children:[e.jsx("div",{className:"text-2xl font-bold",children:y}),e.jsx("p",{className:"text-xs text-muted-foreground mt-1",children:"运行中的插件"})]})]}),e.jsxs(Ce,{children:[e.jsxs(De,{className:"flex flex-row items-center justify-between space-y-0 pb-2",children:[e.jsx(Le,{className:"text-sm font-medium",children:"已禁用"}),e.jsx(_t,{className:"h-4 w-4 text-orange-600"})]}),e.jsxs(Ae,{children:[e.jsx("div",{className:"text-2xl font-bold",children:w}),e.jsx("p",{className:"text-xs text-muted-foreground mt-1",children:"未激活的插件"})]})]})]}),e.jsxs("div",{className:"relative",children:[e.jsx(Tt,{className:"absolute left-3 top-1/2 -translate-y-1/2 h-4 w-4 text-muted-foreground"}),e.jsx(le,{placeholder:"搜索插件...",value:x,onChange:b=>h(b.target.value),className:"pl-9"})]}),e.jsxs(Ce,{children:[e.jsxs(De,{children:[e.jsx(Le,{children:"已安装的插件"}),e.jsx(ws,{children:"点击插件查看和编辑配置"})]}),e.jsx(Ae,{children:c?e.jsx("div",{className:"flex items-center justify-center py-12",children:e.jsx(Bs,{className:"h-8 w-8 animate-spin text-muted-foreground"})}):v.length===0?e.jsxs("div",{className:"flex flex-col items-center justify-center py-12 space-y-4",children:[e.jsx(ra,{className:"h-16 w-16 text-muted-foreground/50"}),e.jsxs("div",{className:"text-center space-y-2",children:[e.jsx("p",{className:"text-lg font-medium text-muted-foreground",children:x?"没有找到匹配的插件":"暂无已安装的插件"}),e.jsx("p",{className:"text-sm text-muted-foreground",children:x?"尝试其他搜索关键词":"前往插件市场安装插件"})]})]}):e.jsx("div",{className:"space-y-2",children:v.map(b=>e.jsxs("div",{className:"flex items-center justify-between p-4 rounded-lg border hover:bg-muted/50 cursor-pointer transition-colors",onClick:()=>p(b),children:[e.jsxs("div",{className:"flex items-center gap-3 min-w-0",children:[e.jsx("div",{className:"h-10 w-10 rounded-lg bg-primary/10 flex items-center justify-center flex-shrink-0",children:e.jsx(ra,{className:"h-5 w-5 text-primary"})}),e.jsxs("div",{className:"min-w-0",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("h3",{className:"font-medium truncate",children:b.manifest.name}),e.jsxs(Se,{variant:"secondary",className:"text-xs flex-shrink-0",children:["v",b.manifest.version]})]}),e.jsx("p",{className:"text-sm text-muted-foreground truncate",children:b.manifest.description||"暂无描述"})]})]}),e.jsxs("div",{className:"flex items-center gap-2 flex-shrink-0",children:[e.jsx(_,{variant:"ghost",size:"sm",children:e.jsx(pn,{className:"h-4 w-4"})}),e.jsx(Zt,{className:"h-4 w-4 text-muted-foreground"})]})]},b.id))})})]})]})})}function Fk(){const l=ca(),{toast:n}=Zs(),[i,c]=d.useState([]),[u,x]=d.useState(!0),[h,f]=d.useState(null),[p,g]=d.useState(null),[N,v]=d.useState(!1),[y,w]=d.useState(!1),[b,R]=d.useState({id:"",name:"",raw_prefix:"",clone_prefix:"",enabled:!0,priority:1}),D=d.useCallback(async()=>{try{x(!0),f(null);const L=await we("/api/webui/plugins/mirrors");if(!L.ok)throw new Error("获取镜像源列表失败");const J=await L.json();c(J.mirrors||[])}catch(L){const J=L instanceof Error?L.message:"加载镜像源失败";f(J),n({title:"加载失败",description:J,variant:"destructive"})}finally{x(!1)}},[n]);d.useEffect(()=>{D()},[D]);const S=async()=>{try{const L=await we("/api/webui/plugins/mirrors",{method:"POST",body:JSON.stringify(b)});if(!L.ok){const J=await L.json();throw new Error(J.detail||"添加镜像源失败")}n({title:"添加成功",description:"镜像源已添加"}),v(!1),R({id:"",name:"",raw_prefix:"",clone_prefix:"",enabled:!0,priority:1}),D()}catch(L){n({title:"添加失败",description:L instanceof Error?L.message:"未知错误",variant:"destructive"})}},P=async()=>{if(p)try{if(!(await we(`/api/webui/plugins/mirrors/${p.id}`,{method:"PUT",body:JSON.stringify({name:b.name,raw_prefix:b.raw_prefix,clone_prefix:b.clone_prefix,enabled:b.enabled,priority:b.priority})})).ok)throw new Error("更新镜像源失败");n({title:"更新成功",description:"镜像源已更新"}),w(!1),g(null),D()}catch(L){n({title:"更新失败",description:L instanceof Error?L.message:"未知错误",variant:"destructive"})}},M=async L=>{if(confirm("确定要删除这个镜像源吗?"))try{if(!(await we(`/api/webui/plugins/mirrors/${L}`,{method:"DELETE"})).ok)throw new Error("删除镜像源失败");n({title:"删除成功",description:"镜像源已删除"}),D()}catch(J){n({title:"删除失败",description:J instanceof Error?J.message:"未知错误",variant:"destructive"})}},T=async L=>{try{if(!(await we(`/api/webui/plugins/mirrors/${L.id}`,{method:"PUT",body:JSON.stringify({enabled:!L.enabled})})).ok)throw new Error("更新状态失败");D()}catch(J){n({title:"更新失败",description:J instanceof Error?J.message:"未知错误",variant:"destructive"})}},A=L=>{g(L),R({id:L.id,name:L.name,raw_prefix:L.raw_prefix,clone_prefix:L.clone_prefix,enabled:L.enabled,priority:L.priority}),w(!0)},F=async(L,J)=>{const U=J==="up"?L.priority-1:L.priority+1;if(!(U<1))try{if(!(await we(`/api/webui/plugins/mirrors/${L.id}`,{method:"PUT",body:JSON.stringify({priority:U})})).ok)throw new Error("更新优先级失败");D()}catch(ue){n({title:"更新失败",description:ue instanceof Error?ue.message:"未知错误",variant:"destructive"})}};return e.jsx(Ye,{className:"h-full",children:e.jsxs("div",{className:"space-y-6 p-4 sm:p-6",children:[e.jsxs("div",{className:"flex flex-col sm:flex-row sm:items-center sm:justify-between gap-4",children:[e.jsxs("div",{className:"flex items-center gap-4",children:[e.jsx(_,{variant:"ghost",size:"icon",onClick:()=>l({to:"/plugins"}),children:e.jsx(Ta,{className:"h-5 w-5"})}),e.jsxs("div",{children:[e.jsx("h1",{className:"text-2xl sm:text-3xl font-bold",children:"镜像源配置"}),e.jsx("p",{className:"text-sm text-muted-foreground mt-1",children:"管理 Git 克隆和文件下载的镜像源"})]})]}),e.jsxs(_,{onClick:()=>v(!0),children:[e.jsx(et,{className:"h-4 w-4 mr-2"}),"添加镜像源"]})]}),u?e.jsx(Ce,{className:"p-6",children:e.jsx("div",{className:"flex items-center justify-center py-8",children:e.jsx(Bs,{className:"h-8 w-8 animate-spin text-primary"})})}):h?e.jsx(Ce,{className:"p-6",children:e.jsxs("div",{className:"flex flex-col items-center justify-center py-8 text-center",children:[e.jsx(Jt,{className:"h-12 w-12 text-destructive mb-4"}),e.jsx("h3",{className:"text-lg font-semibold mb-2",children:"加载失败"}),e.jsx("p",{className:"text-sm text-muted-foreground mb-4",children:h}),e.jsx(_,{onClick:D,children:"重新加载"})]})}):e.jsxs(Ce,{children:[e.jsx("div",{className:"hidden md:block",children:e.jsxs(Rl,{children:[e.jsx(Ll,{children:e.jsxs(ut,{children:[e.jsx(Ze,{children:"状态"}),e.jsx(Ze,{children:"名称"}),e.jsx(Ze,{children:"ID"}),e.jsx(Ze,{children:"优先级"}),e.jsx(Ze,{className:"text-right",children:"操作"})]})}),e.jsx(Ul,{children:i.map(L=>e.jsxs(ut,{children:[e.jsx(qe,{children:e.jsx(Fe,{checked:L.enabled,onCheckedChange:()=>T(L)})}),e.jsx(qe,{children:e.jsxs("div",{children:[e.jsx("div",{className:"font-medium",children:L.name}),e.jsxs("div",{className:"text-xs text-muted-foreground mt-1",children:["Raw: ",L.raw_prefix]})]})}),e.jsx(qe,{children:e.jsx(Se,{variant:"outline",children:L.id})}),e.jsx(qe,{children:e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("span",{className:"font-mono",children:L.priority}),e.jsxs("div",{className:"flex flex-col gap-1",children:[e.jsx(_,{variant:"ghost",size:"icon",className:"h-5 w-5",onClick:()=>F(L,"up"),disabled:L.priority===1,children:e.jsx(Fr,{className:"h-3 w-3"})}),e.jsx(_,{variant:"ghost",size:"icon",className:"h-5 w-5",onClick:()=>F(L,"down"),children:e.jsx(za,{className:"h-3 w-3"})})]})]})}),e.jsx(qe,{className:"text-right",children:e.jsxs("div",{className:"flex items-center justify-end gap-2",children:[e.jsx(_,{variant:"ghost",size:"icon",onClick:()=>A(L),children:e.jsx(Fn,{className:"h-4 w-4"})}),e.jsx(_,{variant:"ghost",size:"icon",onClick:()=>M(L.id),children:e.jsx(ls,{className:"h-4 w-4 text-destructive"})})]})})]},L.id))})]})}),e.jsx("div",{className:"md:hidden p-4 space-y-4",children:i.map(L=>e.jsx(Ce,{className:"p-4",children:e.jsxs("div",{className:"space-y-3",children:[e.jsxs("div",{className:"flex items-start justify-between",children:[e.jsxs("div",{className:"flex-1",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("h3",{className:"font-semibold",children:L.name}),L.enabled&&e.jsx(Se,{variant:"default",className:"text-xs",children:"启用"})]}),e.jsx(Se,{variant:"outline",className:"mt-1 text-xs",children:L.id})]}),e.jsx(Fe,{checked:L.enabled,onCheckedChange:()=>T(L)})]}),e.jsxs("div",{className:"text-sm space-y-1",children:[e.jsxs("div",{className:"text-muted-foreground",children:[e.jsx("span",{className:"font-medium",children:"Raw: "}),e.jsx("span",{className:"break-all",children:L.raw_prefix})]}),e.jsxs("div",{className:"text-muted-foreground",children:[e.jsx("span",{className:"font-medium",children:"优先级: "}),e.jsx("span",{className:"font-mono",children:L.priority})]})]}),e.jsxs("div",{className:"flex items-center gap-2 pt-2 border-t",children:[e.jsxs(_,{variant:"outline",size:"sm",className:"flex-1",onClick:()=>A(L),children:[e.jsx(Fn,{className:"h-4 w-4 mr-1"}),"编辑"]}),e.jsx(_,{variant:"outline",size:"sm",onClick:()=>F(L,"up"),disabled:L.priority===1,children:e.jsx(Fr,{className:"h-4 w-4"})}),e.jsx(_,{variant:"outline",size:"sm",onClick:()=>F(L,"down"),children:e.jsx(za,{className:"h-4 w-4"})}),e.jsx(_,{variant:"destructive",size:"sm",onClick:()=>M(L.id),children:e.jsx(ls,{className:"h-4 w-4"})})]})]})},L.id))})]}),e.jsx(Is,{open:N,onOpenChange:v,children:e.jsxs(Os,{className:"max-w-lg",children:[e.jsxs(Ds,{children:[e.jsx(Rs,{children:"添加镜像源"}),e.jsx(Ks,{children:"添加新的 Git 镜像源配置"})]}),e.jsxs("div",{className:"space-y-4 py-4",children:[e.jsxs("div",{className:"space-y-2",children:[e.jsx(E,{htmlFor:"add-id",children:"镜像源 ID *"}),e.jsx(le,{id:"add-id",placeholder:"例如: my-mirror",value:b.id,onChange:L=>R({...b,id:L.target.value})})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsx(E,{htmlFor:"add-name",children:"名称 *"}),e.jsx(le,{id:"add-name",placeholder:"例如: 我的镜像源",value:b.name,onChange:L=>R({...b,name:L.target.value})})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsx(E,{htmlFor:"add-raw",children:"Raw 文件前缀 *"}),e.jsx(le,{id:"add-raw",placeholder:"https://example.com/raw",value:b.raw_prefix,onChange:L=>R({...b,raw_prefix:L.target.value})})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsx(E,{htmlFor:"add-clone",children:"克隆前缀 *"}),e.jsx(le,{id:"add-clone",placeholder:"https://example.com/clone",value:b.clone_prefix,onChange:L=>R({...b,clone_prefix:L.target.value})})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsx(E,{htmlFor:"add-priority",children:"优先级"}),e.jsx(le,{id:"add-priority",type:"number",min:"1",value:b.priority,onChange:L=>R({...b,priority:parseInt(L.target.value)||1})}),e.jsx("p",{className:"text-xs text-muted-foreground",children:"数字越小优先级越高"})]}),e.jsxs("div",{className:"flex items-center space-x-2",children:[e.jsx(Fe,{id:"add-enabled",checked:b.enabled,onCheckedChange:L=>R({...b,enabled:L})}),e.jsx(E,{htmlFor:"add-enabled",children:"启用此镜像源"})]})]}),e.jsxs(st,{children:[e.jsx(_,{variant:"outline",onClick:()=>v(!1),children:"取消"}),e.jsx(_,{onClick:S,children:"添加"})]})]})}),e.jsx(Is,{open:y,onOpenChange:w,children:e.jsxs(Os,{className:"max-w-lg",children:[e.jsxs(Ds,{children:[e.jsx(Rs,{children:"编辑镜像源"}),e.jsx(Ks,{children:"修改镜像源配置"})]}),e.jsxs("div",{className:"space-y-4 py-4",children:[e.jsxs("div",{className:"space-y-2",children:[e.jsx(E,{children:"镜像源 ID"}),e.jsx(le,{value:b.id,disabled:!0})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsx(E,{htmlFor:"edit-name",children:"名称 *"}),e.jsx(le,{id:"edit-name",value:b.name,onChange:L=>R({...b,name:L.target.value})})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsx(E,{htmlFor:"edit-raw",children:"Raw 文件前缀 *"}),e.jsx(le,{id:"edit-raw",value:b.raw_prefix,onChange:L=>R({...b,raw_prefix:L.target.value})})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsx(E,{htmlFor:"edit-clone",children:"克隆前缀 *"}),e.jsx(le,{id:"edit-clone",value:b.clone_prefix,onChange:L=>R({...b,clone_prefix:L.target.value})})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsx(E,{htmlFor:"edit-priority",children:"优先级"}),e.jsx(le,{id:"edit-priority",type:"number",min:"1",value:b.priority,onChange:L=>R({...b,priority:parseInt(L.target.value)||1})}),e.jsx("p",{className:"text-xs text-muted-foreground",children:"数字越小优先级越高"})]}),e.jsxs("div",{className:"flex items-center space-x-2",children:[e.jsx(Fe,{id:"edit-enabled",checked:b.enabled,onCheckedChange:L=>R({...b,enabled:L})}),e.jsx(E,{htmlFor:"edit-enabled",children:"启用此镜像源"})]})]}),e.jsxs(st,{children:[e.jsx(_,{variant:"outline",onClick:()=>w(!1),children:"取消"}),e.jsx(_,{onClick:P,children:"保存"})]})]})})]})})}function Gk({pluginId:l,compact:n=!1}){const[i,c]=d.useState(null),[u,x]=d.useState(!0),[h,f]=d.useState(0),[p,g]=d.useState(""),[N,v]=d.useState(!1),{toast:y}=Zs(),w=async()=>{x(!0);const S=await Hv(l);S&&c(S),x(!1)};d.useEffect(()=>{w()},[l]);const b=async()=>{const S=await zk(l);S.success?(y({title:"已点赞",description:"感谢你的支持!"}),w()):y({title:"点赞失败",description:S.error||"未知错误",variant:"destructive"})},R=async()=>{const S=await Ak(l);S.success?(y({title:"已反馈",description:"感谢你的反馈!"}),w()):y({title:"操作失败",description:S.error||"未知错误",variant:"destructive"})},D=async()=>{if(h===0){y({title:"请选择评分",description:"至少选择 1 颗星",variant:"destructive"});return}const S=await Ok(l,h,p||void 0);S.success?(y({title:"评分成功",description:"感谢你的评价!"}),v(!1),f(0),g(""),w()):y({title:"评分失败",description:S.error||"未知错误",variant:"destructive"})};return u?e.jsxs("div",{className:"flex items-center gap-4 text-sm text-muted-foreground",children:[e.jsxs("div",{className:"flex items-center gap-1",children:[e.jsx(sa,{className:"h-4 w-4"}),e.jsx("span",{children:"-"})]}),e.jsxs("div",{className:"flex items-center gap-1",children:[e.jsx(dn,{className:"h-4 w-4"}),e.jsx("span",{children:"-"})]})]}):i?n?e.jsxs("div",{className:"flex items-center gap-4 text-sm text-muted-foreground",children:[e.jsxs("div",{className:"flex items-center gap-1",title:`下载量: ${i.downloads.toLocaleString()}`,children:[e.jsx(sa,{className:"h-4 w-4"}),e.jsx("span",{children:i.downloads.toLocaleString()})]}),e.jsxs("div",{className:"flex items-center gap-1",title:`评分: ${i.rating.toFixed(1)} (${i.rating_count} 条评价)`,children:[e.jsx(dn,{className:"h-4 w-4 fill-yellow-400 text-yellow-400"}),e.jsx("span",{children:i.rating.toFixed(1)})]}),e.jsxs("div",{className:"flex items-center gap-1",title:`点赞数: ${i.likes}`,children:[e.jsx(Nm,{className:"h-4 w-4"}),e.jsx("span",{children:i.likes})]})]}):e.jsxs("div",{className:"space-y-4",children:[e.jsxs("div",{className:"grid grid-cols-2 sm:grid-cols-4 gap-4",children:[e.jsxs("div",{className:"flex flex-col items-center p-3 rounded-lg border bg-card",children:[e.jsx(sa,{className:"h-5 w-5 text-muted-foreground mb-1"}),e.jsx("span",{className:"text-2xl font-bold",children:i.downloads.toLocaleString()}),e.jsx("span",{className:"text-xs text-muted-foreground",children:"下载量"})]}),e.jsxs("div",{className:"flex flex-col items-center p-3 rounded-lg border bg-card",children:[e.jsx(dn,{className:"h-5 w-5 text-yellow-400 mb-1 fill-yellow-400"}),e.jsx("span",{className:"text-2xl font-bold",children:i.rating.toFixed(1)}),e.jsxs("span",{className:"text-xs text-muted-foreground",children:[i.rating_count," 条评价"]})]}),e.jsxs("div",{className:"flex flex-col items-center p-3 rounded-lg border bg-card",children:[e.jsx(Nm,{className:"h-5 w-5 text-green-500 mb-1"}),e.jsx("span",{className:"text-2xl font-bold",children:i.likes}),e.jsx("span",{className:"text-xs text-muted-foreground",children:"点赞"})]}),e.jsxs("div",{className:"flex flex-col items-center p-3 rounded-lg border bg-card",children:[e.jsx(cg,{className:"h-5 w-5 text-red-500 mb-1"}),e.jsx("span",{className:"text-2xl font-bold",children:i.dislikes}),e.jsx("span",{className:"text-xs text-muted-foreground",children:"点踩"})]})]}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsxs(_,{variant:"outline",size:"sm",onClick:b,children:[e.jsx(Nm,{className:"h-4 w-4 mr-1"}),"点赞"]}),e.jsxs(_,{variant:"outline",size:"sm",onClick:R,children:[e.jsx(cg,{className:"h-4 w-4 mr-1"}),"点踩"]}),e.jsxs(Is,{open:N,onOpenChange:v,children:[e.jsx(Wo,{asChild:!0,children:e.jsxs(_,{variant:"default",size:"sm",children:[e.jsx(dn,{className:"h-4 w-4 mr-1"}),"评分"]})}),e.jsxs(Os,{children:[e.jsxs(Ds,{children:[e.jsx(Rs,{children:"为插件评分"}),e.jsx(Ks,{children:"分享你的使用体验,帮助其他用户"})]}),e.jsxs("div",{className:"space-y-4 py-4",children:[e.jsxs("div",{className:"flex flex-col items-center gap-2",children:[e.jsx("div",{className:"flex gap-2",children:[1,2,3,4,5].map(S=>e.jsx("button",{onClick:()=>f(S),className:"focus:outline-none",children:e.jsx(dn,{className:`h-8 w-8 transition-colors ${S<=h?"fill-yellow-400 text-yellow-400":"text-muted-foreground hover:text-yellow-300"}`})},S))}),e.jsxs("span",{className:"text-sm text-muted-foreground",children:[h===0&&"点击星星进行评分",h===1&&"很差",h===2&&"一般",h===3&&"还行",h===4&&"不错",h===5&&"非常好"]})]}),e.jsxs("div",{children:[e.jsx("label",{className:"text-sm font-medium mb-2 block",children:"评论(可选)"}),e.jsx(ot,{value:p,onChange:S=>g(S.target.value),placeholder:"分享你的使用体验...",rows:4,maxLength:500}),e.jsxs("div",{className:"text-xs text-muted-foreground mt-1 text-right",children:[p.length," / 500"]})]})]}),e.jsxs(st,{children:[e.jsx(_,{variant:"outline",onClick:()=>v(!1),children:"取消"}),e.jsx(_,{onClick:D,disabled:h===0,children:"提交评分"})]})]})]})]}),i.recent_ratings&&i.recent_ratings.length>0&&e.jsxs("div",{className:"space-y-2",children:[e.jsx("h4",{className:"text-sm font-semibold",children:"最近评价"}),e.jsx("div",{className:"space-y-3",children:i.recent_ratings.map((S,P)=>e.jsxs("div",{className:"p-3 rounded-lg border bg-muted/50",children:[e.jsxs("div",{className:"flex items-center justify-between mb-2",children:[e.jsx("div",{className:"flex gap-1",children:[1,2,3,4,5].map(M=>e.jsx(dn,{className:`h-3 w-3 ${M<=S.rating?"fill-yellow-400 text-yellow-400":"text-muted-foreground"}`},M))}),e.jsx("span",{className:"text-xs text-muted-foreground",children:new Date(S.created_at).toLocaleDateString()})]}),S.comment&&e.jsx("p",{className:"text-sm text-muted-foreground",children:S.comment})]},P))})]})]}):null}const Vk={"Group Management":"群组管理","Entertainment & Interaction":"娱乐互动","Utility Tools":"实用工具","Content Generation":"内容生成",Multimedia:"多媒体","External Integration":"外部集成","Data Analysis & Insights":"数据分析与洞察",Other:"其他"};function qk(){const l=ca(),n=b0({strict:!1}),{toast:i}=Zs(),[c,u]=d.useState(null),[x,h]=d.useState(""),[f,p]=d.useState(!0),[g,N]=d.useState(!0),[v,y]=d.useState(null),[w,b]=d.useState(null),[R,D]=d.useState(null),[S,P]=d.useState(!1),[M,T]=d.useState(),[A,F]=d.useState(!1);d.useEffect(()=>{(async()=>{if(!n.pluginId){y("缺少插件 ID"),p(!1);return}try{p(!0),y(null);const ve=await we("/api/webui/plugins/fetch-raw",{method:"POST",body:JSON.stringify({owner:"Mai-with-u",repo:"plugin-repo",branch:"main",file_path:"plugin_details.json"})});if(!ve.ok)throw new Error("获取插件列表失败");const je=await ve.json();if(!je.success||!je.data)throw new Error(je.error||"获取插件列表失败");const V=JSON.parse(je.data).find(pe=>pe.id===n.pluginId);if(!V)throw new Error("未找到该插件");const B={id:V.id,manifest:V.manifest,downloads:0,rating:0,review_count:0,installed:!1,published_at:new Date().toISOString(),updated_at:new Date().toISOString()};u(B);const[oe,K,_e]=await Promise.all([Lv(),Uv(),Al()]);b(oe),D(K),P(mn(n.pluginId,_e)),T(xn(n.pluginId,_e))}catch(ve){y(ve instanceof Error?ve.message:"加载失败")}finally{p(!1)}})()},[n.pluginId]),d.useEffect(()=>{(async()=>{if(!c?.manifest?.repository_url){N(!1);return}try{if(N(!0),S&&n.pluginId)try{const K=await we(`/api/webui/plugins/local-readme/${n.pluginId}`);if(K.ok){const _e=await K.json();if(_e.success&&_e.data){h(_e.data),N(!1);return}}}catch(K){console.log("本地 README 获取失败,尝试远程获取:",K)}const ve=c.manifest.repository_url.match(/github\.com\/([^/]+)\/([^/\s]+)/);if(!ve){h("无法解析仓库地址");return}const[,je,z]=ve,V=z.replace(/\.git$/,""),B=await we("/api/webui/plugins/fetch-raw",{method:"POST",body:JSON.stringify({owner:je,repo:V,branch:"main",file_path:"README.md"})});if(!B.ok)throw new Error("获取 README 失败");const oe=await B.json();oe.success&&oe.data?h(oe.data):h("该插件暂无 README 文档")}catch(ve){console.error("加载 README 失败:",ve),h("加载 README 失败")}finally{N(!1)}})()},[c,S,n.pluginId]);const L=()=>!c||!S||!M?!1:M!==c.manifest.version,J=()=>!c||!R?!0:$v(c.manifest.host_application.min_version,c.manifest.host_application.max_version,R),U=async()=>{if(!(!c||!w?.installed))try{F(!0),await Bv(c.id,c.manifest.repository_url||"","main"),Fv(c.id).catch(ve=>{console.warn("Failed to record download:",ve)}),i({title:"安装成功",description:`${c.manifest.name} 已成功安装`});const ne=await Al();P(mn(c.id,ne)),T(xn(c.id,ne))}catch(ne){i({title:"安装失败",description:ne instanceof Error?ne.message:"未知错误",variant:"destructive"})}finally{F(!1)}},ue=async()=>{if(c)try{F(!0),await Iv(c.id),i({title:"卸载成功",description:`${c.manifest.name} 已成功卸载`});const ne=await Al();P(mn(c.id,ne)),T(xn(c.id,ne))}catch(ne){i({title:"卸载失败",description:ne instanceof Error?ne.message:"未知错误",variant:"destructive"})}finally{F(!1)}},xe=async()=>{if(!(!c||!w?.installed))try{F(!0);const ne=await Pv(c.id,c.manifest.repository_url||"","main");i({title:"更新成功",description:`${c.manifest.name} 已从 ${ne.old_version} 更新到 ${ne.new_version}`});const ve=await Al();P(mn(c.id,ve)),T(xn(c.id,ve))}catch(ne){i({title:"更新失败",description:ne instanceof Error?ne.message:"未知错误",variant:"destructive"})}finally{F(!1)}};if(f)return e.jsxs("div",{className:"space-y-4 sm:space-y-6 p-4 sm:p-6",children:[e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx(_,{variant:"ghost",size:"icon",onClick:()=>l({to:"/plugins"}),children:e.jsx(Ta,{className:"h-5 w-5"})}),e.jsx("div",{children:e.jsx("h1",{className:"text-2xl sm:text-3xl font-bold",children:"插件详情"})})]}),e.jsxs("div",{className:"flex items-center justify-center py-12",children:[e.jsx(Bs,{className:"h-8 w-8 animate-spin text-muted-foreground"}),e.jsx("span",{className:"ml-3 text-muted-foreground",children:"加载插件信息中..."})]})]});if(v||!c)return e.jsxs("div",{className:"space-y-4 sm:space-y-6 p-4 sm:p-6",children:[e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx(_,{variant:"ghost",size:"icon",onClick:()=>l({to:"/plugins"}),children:e.jsx(Ta,{className:"h-5 w-5"})}),e.jsx("div",{children:e.jsx("h1",{className:"text-2xl sm:text-3xl font-bold",children:"插件详情"})})]}),e.jsx(Ce,{className:"p-6",children:e.jsxs("div",{className:"flex flex-col items-center justify-center py-8 text-center",children:[e.jsx(_t,{className:"h-12 w-12 text-destructive mb-4"}),e.jsx("h3",{className:"text-lg font-semibold mb-2",children:"加载失败"}),e.jsx("p",{className:"text-sm text-muted-foreground mb-4",children:v}),e.jsx(_,{onClick:()=>l({to:"/plugins"}),children:"返回插件列表"})]})})]});const he=J();return e.jsxs("div",{className:"space-y-4 sm:space-y-6 p-4 sm:p-6",children:[e.jsxs("div",{className:"flex flex-col sm:flex-row sm:items-center justify-between gap-4",children:[e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx(_,{variant:"ghost",size:"icon",onClick:()=>l({to:"/plugins"}),className:"shrink-0",children:e.jsx(Ta,{className:"h-5 w-5"})}),e.jsxs("div",{children:[e.jsx("h1",{className:"text-2xl sm:text-3xl font-bold",children:"插件详情"}),e.jsx("p",{className:"text-muted-foreground mt-1 sm:mt-2 text-sm sm:text-base",children:c.manifest.name})]})]}),e.jsx("div",{className:"flex flex-wrap gap-2",children:S?e.jsxs(e.Fragment,{children:[L()?e.jsx(_,{disabled:!w?.installed||A,onClick:xe,title:w?.installed?void 0:"Git 未安装",children:A?e.jsxs(e.Fragment,{children:[e.jsx(Bs,{className:"h-4 w-4 mr-2 animate-spin"}),"更新中..."]}):e.jsxs(e.Fragment,{children:[e.jsx(dt,{className:"h-4 w-4 mr-2"}),"更新"]})}):null,e.jsx(_,{variant:"destructive",disabled:!w?.installed||A,onClick:ue,title:w?.installed?void 0:"Git 未安装",children:A?e.jsxs(e.Fragment,{children:[e.jsx(Bs,{className:"h-4 w-4 mr-2 animate-spin"}),"卸载中..."]}):e.jsxs(e.Fragment,{children:[e.jsx(ls,{className:"h-4 w-4 mr-2"}),"卸载"]})})]}):e.jsx(_,{disabled:!w?.installed||!he||A,onClick:U,title:w?.installed?he?void 0:`不兼容当前版本 (需要 ${c.manifest.host_application.min_version}${c.manifest.host_application.max_version?` - ${c.manifest.host_application.max_version}`:"+"},当前 ${R?.version})`:"Git 未安装",children:A?e.jsxs(e.Fragment,{children:[e.jsx(Bs,{className:"h-4 w-4 mr-2 animate-spin"}),"安装中..."]}):e.jsxs(e.Fragment,{children:[e.jsx(sa,{className:"h-4 w-4 mr-2"}),"安装"]})})})]}),e.jsx(Ye,{className:"h-[calc(100vh-200px)] sm:h-[calc(100vh-220px)]",children:e.jsxs("div",{className:"space-y-6 pr-4",children:[e.jsx(Ce,{children:e.jsx(De,{children:e.jsx("div",{className:"flex items-start justify-between gap-4",children:e.jsxs("div",{className:"flex-1 space-y-2",children:[e.jsxs("div",{className:"flex items-center gap-3 flex-wrap",children:[e.jsx(Le,{className:"text-2xl",children:c.manifest.name}),e.jsxs(Se,{variant:"secondary",className:"text-sm",children:["v",c.manifest.version]}),S&&e.jsxs(Se,{variant:"default",className:"text-sm",children:[e.jsx(pt,{className:"h-3 w-3 mr-1"}),"已安装 ",M&&`(v${M})`]}),L()&&e.jsxs(Se,{variant:"outline",className:"text-sm border-orange-500 text-orange-500",children:[e.jsx(dt,{className:"h-3 w-3 mr-1"}),"可更新"]}),!he&&e.jsxs(Se,{variant:"destructive",className:"text-sm",children:[e.jsx(_t,{className:"h-3 w-3 mr-1"}),"不兼容"]})]}),e.jsx(ws,{className:"text-base",children:c.manifest.description})]})})})}),e.jsxs("div",{className:"grid grid-cols-1 lg:grid-cols-3 gap-6",children:[e.jsxs("div",{className:"lg:col-span-1 space-y-6",children:[e.jsxs(Ce,{children:[e.jsx(De,{children:e.jsx(Le,{className:"text-lg",children:"统计信息"})}),e.jsx(Ae,{children:e.jsx(Gk,{pluginId:c.id})})]}),e.jsxs(Ce,{children:[e.jsx(De,{children:e.jsx(Le,{className:"text-lg",children:"基本信息"})}),e.jsx(Ae,{className:"space-y-4",children:e.jsxs("div",{className:"space-y-3",children:[e.jsxs("div",{className:"flex items-center gap-2 text-sm",children:[e.jsx(fn,{className:"h-4 w-4 text-muted-foreground"}),e.jsx("span",{className:"text-muted-foreground",children:"作者:"}),e.jsx("span",{className:"font-medium",children:c.manifest.author?.name||"Unknown"}),c.manifest.author?.url&&e.jsx("a",{href:c.manifest.author.url,target:"_blank",rel:"noopener noreferrer",className:"text-primary hover:underline",children:e.jsx(Mo,{className:"h-3 w-3"})})]}),e.jsxs("div",{className:"flex items-center gap-2 text-sm",children:[e.jsx(ra,{className:"h-4 w-4 text-muted-foreground"}),e.jsx("span",{className:"text-muted-foreground",children:"版本:"}),e.jsxs("span",{className:"font-medium",children:["v",c.manifest.version]})]}),e.jsxs("div",{className:"flex items-center gap-2 text-sm",children:[e.jsx(Oj,{className:"h-4 w-4 text-muted-foreground"}),e.jsx("span",{className:"text-muted-foreground",children:"许可证:"}),e.jsx("span",{className:"font-medium",children:c.manifest.license})]}),c.manifest.homepage_url&&e.jsxs("div",{className:"flex items-center gap-2 text-sm",children:[e.jsx(Uo,{className:"h-4 w-4 text-muted-foreground"}),e.jsx("span",{className:"text-muted-foreground",children:"主页:"}),e.jsxs("a",{href:c.manifest.homepage_url,target:"_blank",rel:"noopener noreferrer",className:"text-primary hover:underline flex items-center gap-1",children:["访问",e.jsx(Mo,{className:"h-3 w-3"})]})]}),c.manifest.repository_url&&e.jsxs("div",{className:"flex items-center gap-2 text-sm",children:[e.jsx(u_,{className:"h-4 w-4 text-muted-foreground"}),e.jsx("span",{className:"text-muted-foreground",children:"仓库:"}),e.jsxs("a",{href:c.manifest.repository_url,target:"_blank",rel:"noopener noreferrer",className:"text-primary hover:underline flex items-center gap-1",children:["GitHub",e.jsx(Mo,{className:"h-3 w-3"})]})]}),e.jsxs("div",{className:"pt-2 border-t",children:[e.jsxs("div",{className:"flex items-center gap-2 text-sm mb-2",children:[e.jsx(Ht,{className:"h-4 w-4 text-muted-foreground"}),e.jsx("span",{className:"text-muted-foreground",children:"支持版本:"})]}),e.jsxs("div",{className:"text-sm pl-6 font-medium",children:[c.manifest.host_application.min_version,c.manifest.host_application.max_version?` - ${c.manifest.host_application.max_version}`:" - 最新版本"]})]})]})})]}),(c.manifest.categories||c.manifest.keywords)&&e.jsxs(Ce,{children:[e.jsx(De,{children:e.jsx(Le,{className:"text-lg",children:"分类与标签"})}),e.jsxs(Ae,{className:"space-y-4",children:[c.manifest.categories&&c.manifest.categories.length>0&&e.jsxs("div",{children:[e.jsx("p",{className:"text-sm text-muted-foreground mb-2",children:"分类"}),e.jsx("div",{className:"flex flex-wrap gap-2",children:c.manifest.categories.map(ne=>e.jsx(Se,{variant:"secondary",children:Vk[ne]||ne},ne))})]}),c.manifest.keywords&&c.manifest.keywords.length>0&&e.jsxs("div",{children:[e.jsx("p",{className:"text-sm text-muted-foreground mb-2",children:"标签"}),e.jsx("div",{className:"flex flex-wrap gap-2",children:c.manifest.keywords.map(ne=>e.jsxs(Se,{variant:"outline",className:"text-xs",children:[e.jsx(Xo,{className:"h-3 w-3 mr-1"}),ne]},ne))})]})]})]})]}),e.jsxs(Ce,{className:"lg:col-span-2",children:[e.jsx(De,{children:e.jsx(Le,{className:"text-lg",children:"插件说明"})}),e.jsx(Ae,{children:e.jsx(Ye,{className:"h-[600px] pr-4",children:g?e.jsxs("div",{className:"flex items-center justify-center py-12",children:[e.jsx(Bs,{className:"h-6 w-6 animate-spin text-muted-foreground"}),e.jsx("span",{className:"ml-3 text-sm text-muted-foreground",children:"加载说明文档中..."})]}):x?e.jsx(tx,{content:x}):e.jsx("div",{className:"text-center text-muted-foreground py-12",children:"暂无说明文档"})})})]})]})]})})]})}const qi=d.forwardRef(({className:l,...n},i)=>e.jsx(aj,{ref:i,className:I("relative flex h-10 w-10 shrink-0 overflow-hidden rounded-full",l),...n}));qi.displayName=aj.displayName;const Kk=d.forwardRef(({className:l,...n},i)=>e.jsx(lj,{ref:i,className:I("aspect-square h-full w-full",l),...n}));Kk.displayName=lj.displayName;const Ki=d.forwardRef(({className:l,...n},i)=>e.jsx(nj,{ref:i,className:I("flex h-full w-full items-center justify-center rounded-full bg-muted",l),...n}));Ki.displayName=nj.displayName;function Qk(){return"webui_"+Math.random().toString(36).substr(2,9)+"_"+Date.now().toString(36)}function Yk(){const l="maibot_webui_user_id";let n=localStorage.getItem(l);return n||(n=Qk(),localStorage.setItem(l,n)),n}function Jk(){return localStorage.getItem("maibot_webui_user_name")||"WebUI用户"}function Xk(l){localStorage.setItem("maibot_webui_user_name",l)}const Gv="maibot_webui_virtual_tabs";function Zk(){try{const l=localStorage.getItem(Gv);if(l)return JSON.parse(l)}catch(l){console.error("[Chat] 加载虚拟标签页失败:",l)}return[]}function Ug(l){try{localStorage.setItem(Gv,JSON.stringify(l))}catch(n){console.error("[Chat] 保存虚拟标签页失败:",n)}}function Wk({segment:l}){switch(l.type){case"text":return e.jsx("span",{className:"whitespace-pre-wrap",children:String(l.data)});case"image":case"emoji":return e.jsx("img",{src:String(l.data),alt:l.type==="emoji"?"表情包":"图片",className:I("rounded-lg max-w-full",l.type==="emoji"?"max-h-32":"max-h-64"),loading:"lazy",onError:n=>{const i=n.target;i.style.display="none",i.parentElement?.insertAdjacentHTML("beforeend",`[${l.type==="emoji"?"表情包":"图片"}加载失败]`)}});case"voice":return e.jsx("div",{className:"flex items-center gap-2",children:e.jsx("audio",{controls:!0,src:String(l.data),className:"max-w-[200px] h-8",children:"您的浏览器不支持音频播放"})});case"video":return e.jsx("video",{controls:!0,src:String(l.data),className:"rounded-lg max-w-full max-h-64",children:"您的浏览器不支持视频播放"});case"face":return e.jsxs("span",{className:"text-muted-foreground",children:["[表情:",String(l.data),"]"]});case"music":return e.jsx("span",{className:"text-muted-foreground",children:"[音乐分享]"});case"file":return e.jsxs("span",{className:"text-muted-foreground",children:["[文件: ",String(l.data),"]"]});case"reply":return e.jsx("span",{className:"text-muted-foreground text-xs",children:"[回复消息]"});case"forward":return e.jsx("span",{className:"text-muted-foreground",children:"[转发消息]"});case"unknown":default:return e.jsxs("span",{className:"text-muted-foreground",children:["[",l.original_type||"未知消息","]"]})}}function eC({message:l,isBot:n}){return l.message_type==="rich"&&l.segments&&l.segments.length>0?e.jsx("div",{className:"flex flex-col gap-2",children:l.segments.map((i,c)=>e.jsx(Wk,{segment:i},c))}):e.jsx("span",{className:"whitespace-pre-wrap",children:l.content})}function sC(){const l={id:"webui-default",type:"webui",label:"WebUI",messages:[],isConnected:!1,isTyping:!1,sessionInfo:{}},n=()=>{const Ve=Zk().map(Ke=>{const We=Ke.virtualConfig;return!We.groupId&&We.platform&&We.userId&&(We.groupId=`webui_virtual_group_${We.platform}_${We.userId}`),{id:Ke.id,type:"virtual",label:Ke.label,virtualConfig:We,messages:[],isConnected:!1,isTyping:!1,sessionInfo:{}}});return[l,...Ve]},[i,c]=d.useState(n),[u,x]=d.useState("webui-default"),h=i.find(q=>q.id===u)||i[0],[f,p]=d.useState(""),[g,N]=d.useState(!1),[v,y]=d.useState(!0),[w,b]=d.useState(Jk()),[R,D]=d.useState(!1),[S,P]=d.useState(""),[M,T]=d.useState(!1),[A,F]=d.useState([]),[L,J]=d.useState([]),[U,ue]=d.useState(!1),[xe,he]=d.useState(!1),[ne,ve]=d.useState(""),[je,z]=d.useState({platform:"",personId:"",userId:"",userName:"",groupName:"",groupId:""}),V=d.useRef(Yk()),B=d.useRef(new Map),oe=d.useRef(null),K=d.useRef(new Map),_e=d.useRef(0),pe=d.useRef(new Map),{toast:ke}=Zs(),O=q=>(_e.current+=1,`${q}-${Date.now()}-${_e.current}-${Math.random().toString(36).substr(2,9)}`),k=d.useCallback((q,Ve)=>{c(Ke=>Ke.map(We=>We.id===q?{...We,...Ve}:We))},[]),H=d.useCallback((q,Ve)=>{c(Ke=>Ke.map(We=>We.id===q?{...We,messages:[...We.messages,Ve]}:We))},[]),se=d.useCallback(()=>{oe.current?.scrollIntoView({behavior:"smooth"})},[]);d.useEffect(()=>{se()},[h?.messages,se]);const Ee=d.useCallback(async()=>{ue(!0);try{const q=await we("/api/chat/platforms");if(console.log("[Chat] 平台列表响应:",q.status,q.headers.get("content-type")),q.ok){const Ve=q.headers.get("content-type");if(Ve&&Ve.includes("application/json")){const Ke=await q.json();console.log("[Chat] 平台列表数据:",Ke),F(Ke.platforms||[])}else{const Ke=await q.text();console.error("[Chat] 获取平台列表失败: 非 JSON 响应:",Ke.substring(0,200)),ke({title:"连接失败",description:"无法连接到后端服务,请确保 MaiBot 已启动",variant:"destructive"})}}else console.error("[Chat] 获取平台列表失败: HTTP",q.status),ke({title:"获取平台失败",description:`服务器返回错误: ${q.status}`,variant:"destructive"})}catch(q){console.error("[Chat] 获取平台列表失败:",q),ke({title:"网络错误",description:"无法连接到后端服务",variant:"destructive"})}finally{ue(!1)}},[ke]),Z=d.useCallback(async(q,Ve)=>{he(!0);try{const Ke=new URLSearchParams;q&&Ke.append("platform",q),Ve&&Ke.append("search",Ve),Ke.append("limit","50");const We=await we(`/api/chat/persons?${Ke.toString()}`);if(We.ok){const Ls=We.headers.get("content-type");if(Ls&&Ls.includes("application/json")){const ts=await We.json();J(ts.persons||[])}else console.error("[Chat] 获取用户列表失败: 后端返回非 JSON 响应")}}catch(Ke){console.error("[Chat] 获取用户列表失败:",Ke)}finally{he(!1)}},[]);d.useEffect(()=>{je.platform&&Z(je.platform,ne)},[je.platform,ne,Z]);const Oe=d.useCallback(async(q,Ve)=>{y(!0);try{const Ke=new URLSearchParams;Ke.append("user_id",V.current),Ke.append("limit","50"),Ve&&Ke.append("group_id",Ve);const We=`/api/chat/history?${Ke.toString()}`;console.log("[Chat] 正在加载历史消息:",We);const Ls=await we(We);if(Ls.ok){const ts=await Ls.text();try{const Cs=JSON.parse(ts);if(Cs.messages&&Cs.messages.length>0){const ze=Cs.messages.map(as=>({id:as.id,type:as.type,content:as.content,timestamp:as.timestamp,sender:{name:as.sender_name||(as.is_bot?"麦麦":"WebUI用户"),user_id:as.user_id,is_bot:as.is_bot}}));k(q,{messages:ze});const Ns=pe.current.get(q)||new Set;ze.forEach(as=>{if(as.type==="bot"){const es=`bot-${as.content}-${Math.floor(as.timestamp*1e3)}`;Ns.add(es)}}),pe.current.set(q,Ns)}}catch(Cs){console.error("[Chat] JSON 解析失败:",Cs)}}}catch(Ke){console.error("[Chat] 加载历史消息失败:",Ke)}finally{y(!1)}},[k]),ns=d.useCallback(async(q,Ve,Ke)=>{const We=B.current.get(q);if(We?.readyState===WebSocket.OPEN||We?.readyState===WebSocket.CONNECTING){console.log(`[Tab ${q}] WebSocket 已存在,跳过连接`);return}N(!0);let Ls=null;try{const Ns=await we("/api/webui/ws-token");if(Ns.ok){const as=await Ns.json();if(as.success&&as.token)Ls=as.token;else{console.warn(`[Tab ${q}] 获取 WebSocket token 失败: ${as.message||"未登录"}`),N(!1);return}}}catch(Ns){console.error(`[Tab ${q}] 获取 WebSocket token 失败:`,Ns),N(!1);return}if(!Ls){N(!1);return}const ts=window.location.protocol==="https:"?"wss:":"ws:",Cs=new URLSearchParams;Cs.append("token",Ls),Ve==="virtual"&&Ke?(Cs.append("user_id",Ke.userId),Cs.append("user_name",Ke.userName),Cs.append("platform",Ke.platform),Cs.append("person_id",Ke.personId),Cs.append("group_name",Ke.groupName||"WebUI虚拟群聊"),Ke.groupId&&Cs.append("group_id",Ke.groupId)):(Cs.append("user_id",V.current),Cs.append("user_name",w));const ze=`${ts}//${window.location.host}/api/chat/ws?${Cs.toString()}`;console.log(`[Tab ${q}] 正在连接 WebSocket:`,ze);try{const Ns=new WebSocket(ze);B.current.set(q,Ns),Ns.onopen=()=>{k(q,{isConnected:!0}),N(!1),console.log(`[Tab ${q}] WebSocket 已连接`)},Ns.onmessage=as=>{try{const es=JSON.parse(as.data);switch(es.type){case"session_info":k(q,{sessionInfo:{session_id:es.session_id,user_id:es.user_id,user_name:es.user_name,bot_name:es.bot_name}});break;case"system":H(q,{id:O("sys"),type:"system",content:es.content||"",timestamp:es.timestamp||Date.now()/1e3});break;case"user_message":{const bs=es.sender?.user_id,gt=Ve==="virtual"&&Ke?Ke.userId:V.current;console.log(`[Tab ${q}] 收到 user_message, sender: ${bs}, current: ${gt}`);const $t=bs?bs.replace(/^webui_user_/,""):"",tt=gt?gt.replace(/^webui_user_/,""):"";if($t&&tt&&$t===tt){console.log(`[Tab ${q}] 跳过自己的消息(user_id 匹配)`);break}const Ms=pe.current.get(q)||new Set,Et=`user-${es.content}-${Math.floor((es.timestamp||0)*1e3)}`;if(Ms.has(Et)){console.log(`[Tab ${q}] 跳过自己的消息(内容去重)`);break}if(Ms.add(Et),pe.current.set(q,Ms),Ms.size>100){const Bt=Ms.values().next().value;Bt&&Ms.delete(Bt)}H(q,{id:es.message_id||O("user"),type:"user",content:es.content||"",timestamp:es.timestamp||Date.now()/1e3,sender:es.sender});break}case"bot_message":{k(q,{isTyping:!1});const bs=pe.current.get(q)||new Set,gt=`bot-${es.content}-${Math.floor((es.timestamp||0)*1e3)}`;if(bs.has(gt))break;if(bs.add(gt),pe.current.set(q,bs),bs.size>100){const $t=bs.values().next().value;$t&&bs.delete($t)}c($t=>$t.map(tt=>{if(tt.id!==q)return tt;const Ms=tt.messages.filter(Bt=>Bt.type!=="thinking"),Et={id:O("bot"),type:"bot",content:es.content||"",message_type:es.message_type==="rich"?"rich":"text",segments:es.segments,timestamp:es.timestamp||Date.now()/1e3,sender:es.sender};return{...tt,messages:[...Ms,Et]}}));break}case"typing":k(q,{isTyping:es.is_typing||!1});break;case"error":c(bs=>bs.map(gt=>{if(gt.id!==q)return gt;const $t=gt.messages.filter(tt=>tt.type!=="thinking");return{...gt,messages:[...$t,{id:O("error"),type:"error",content:es.content||"发生错误",timestamp:es.timestamp||Date.now()/1e3}]}})),ke({title:"错误",description:es.content,variant:"destructive"});break;case"pong":break;case"history":{const bs=es.messages||[];if(bs.length>0){const gt=pe.current.get(q)||new Set,$t=bs.map(tt=>{const Ms=tt.is_bot||!1,Et=tt.id||O(Ms?"bot":"user"),Bt=`${Ms?"bot":"user"}-${tt.content}-${Math.floor(tt.timestamp*1e3)}`;return gt.add(Bt),{id:Et,type:Ms?"bot":"user",content:tt.content,timestamp:tt.timestamp,sender:{name:tt.sender_name||(Ms?"麦麦":"用户"),user_id:tt.sender_id,is_bot:Ms}}});pe.current.set(q,gt),k(q,{messages:$t}),console.log(`[Tab ${q}] 已加载 ${$t.length} 条历史消息`)}break}default:console.log("未知消息类型:",es.type)}}catch(es){console.error("解析消息失败:",es)}},Ns.onclose=()=>{k(q,{isConnected:!1}),N(!1),B.current.delete(q),console.log(`[Tab ${q}] WebSocket 已断开`);const as=K.current.get(q);as&&clearTimeout(as);const es=window.setTimeout(()=>{if(!Q.current){const bs=i.find(gt=>gt.id===q);bs&&ns(q,bs.type,bs.virtualConfig)}},5e3);K.current.set(q,es)},Ns.onerror=as=>{console.error(`[Tab ${q}] WebSocket 错误:`,as),N(!1)}}catch(Ns){console.error(`[Tab ${q}] 创建 WebSocket 失败:`,Ns),N(!1)}},[w,k,H,ke,i]),Q=d.useRef(!1);d.useEffect(()=>{Q.current=!1;const q=B.current,Ve=K.current,Ke=pe.current;Oe("webui-default");const We=setTimeout(()=>{Q.current||(ns("webui-default","webui"),i.forEach(ts=>{ts.type==="virtual"&&ts.virtualConfig&&(Ke.set(ts.id,new Set),setTimeout(()=>{Q.current||ns(ts.id,"virtual",ts.virtualConfig)},200))}))},100),Ls=setInterval(()=>{q.forEach(ts=>{ts.readyState===WebSocket.OPEN&&ts.send(JSON.stringify({type:"ping"}))})},3e4);return()=>{Q.current=!0,clearTimeout(We),clearInterval(Ls),Ve.forEach(ts=>{clearTimeout(ts)}),Ve.clear(),q.forEach(ts=>{ts.close()}),q.clear()}},[]);const ee=d.useCallback(()=>{const q=B.current.get(u);if(!f.trim()||!q||q.readyState!==WebSocket.OPEN)return;const Ve=h?.type==="virtual"&&h.virtualConfig?.userName||w,Ke=f.trim(),We=Date.now()/1e3;q.send(JSON.stringify({type:"message",content:Ke,user_name:Ve}));const Ls=pe.current.get(u)||new Set,ts=`user-${Ke}-${Math.floor(We*1e3)}`;if(Ls.add(ts),pe.current.set(u,Ls),Ls.size>100){const Ns=Ls.values().next().value;Ns&&Ls.delete(Ns)}const Cs={id:O("user"),type:"user",content:Ke,timestamp:We,sender:{name:Ve,is_bot:!1}};H(u,Cs);const ze={id:O("thinking"),type:"thinking",content:"",timestamp:We+.001,sender:{name:h?.sessionInfo.bot_name||"麦麦",is_bot:!0}};H(u,ze),p("")},[f,w,u,h,H]),Ue=q=>{q.key==="Enter"&&!q.shiftKey&&(q.preventDefault(),ee())},ie=()=>{P(w),D(!0)},Te=()=>{const q=S.trim()||"WebUI用户";b(q),Xk(q),D(!1);const Ve=B.current.get(u);Ve?.readyState===WebSocket.OPEN&&Ve.send(JSON.stringify({type:"update_nickname",user_name:q}))},de=()=>{P(""),D(!1)},Me=q=>new Date(q*1e3).toLocaleTimeString("zh-CN",{hour:"2-digit",minute:"2-digit"}),rs=()=>{const q=B.current.get(u);q&&(q.close(),B.current.delete(u)),ns(u,h?.type||"webui",h?.virtualConfig)},Ut=()=>{z({platform:"",personId:"",userId:"",userName:"",groupName:"",groupId:""}),ve(""),Ee(),T(!0)},aa=()=>{if(!je.platform||!je.personId){ke({title:"配置不完整",description:"请选择平台和用户",variant:"destructive"});return}const q=`webui_virtual_group_${je.platform}_${je.userId}`,Ve=`virtual-${je.platform}-${je.userId}-${Date.now()}`,Ke=je.userName||je.userId,We={id:Ve,type:"virtual",label:Ke,virtualConfig:{...je,groupId:q},messages:[],isConnected:!1,isTyping:!1,sessionInfo:{}};c(Ls=>{const ts=[...Ls,We],Cs=ts.filter(ze=>ze.type==="virtual"&&ze.virtualConfig).map(ze=>({id:ze.id,label:ze.label,virtualConfig:ze.virtualConfig,createdAt:Date.now()}));return Ug(Cs),ts}),x(Ve),T(!1),pe.current.set(Ve,new Set),setTimeout(()=>{ns(Ve,"virtual",je)},100),ke({title:"虚拟身份标签页",description:`已创建 ${Ke} 的对话`})},Qa=(q,Ve)=>{if(Ve?.stopPropagation(),q==="webui-default")return;const Ke=B.current.get(q);Ke&&(Ke.close(),B.current.delete(q));const We=K.current.get(q);We&&(clearTimeout(We),K.current.delete(q)),pe.current.delete(q),c(Ls=>{const ts=Ls.filter(ze=>ze.id!==q),Cs=ts.filter(ze=>ze.type==="virtual"&&ze.virtualConfig).map(ze=>({id:ze.id,label:ze.label,virtualConfig:ze.virtualConfig,createdAt:Date.now()}));return Ug(Cs),ts}),u===q&&x("webui-default")},Ft=q=>{x(q)},mt=q=>{z(Ve=>({...Ve,personId:q.person_id,userId:q.user_id,userName:q.nickname||q.person_name}))};return e.jsxs("div",{className:"h-full flex flex-col",children:[e.jsx(Is,{open:M,onOpenChange:T,children:e.jsxs(Os,{className:"sm:max-w-[500px] max-h-[85vh] overflow-hidden flex flex-col",children:[e.jsxs(Ds,{children:[e.jsxs(Rs,{className:"flex items-center gap-2",children:[e.jsx(bm,{className:"h-5 w-5"}),"新建虚拟身份对话"]}),e.jsx(Ks,{children:"选择一个麦麦已认识的用户,以该用户的身份与麦麦对话。麦麦将使用她对该用户的记忆和认知来回应。"})]}),e.jsxs("div",{className:"space-y-4 flex-1 overflow-hidden flex flex-col",children:[e.jsxs("div",{className:"space-y-2",children:[e.jsxs(E,{className:"flex items-center gap-2",children:[e.jsx(Uo,{className:"h-4 w-4"}),"选择平台"]}),e.jsxs(Ie,{value:je.platform,onValueChange:q=>{z(Ve=>({...Ve,platform:q,personId:"",userId:"",userName:""})),J([])},children:[e.jsx($e,{disabled:U,children:e.jsx(Pe,{placeholder:U?"加载中...":"选择平台"})}),e.jsx(Be,{children:A.map(q=>e.jsxs(X,{value:q.platform,children:[q.platform," (",q.count," 人)"]},q.platform))})]})]}),je.platform&&e.jsxs("div",{className:"space-y-2 flex-1 overflow-hidden flex flex-col",children:[e.jsxs(E,{className:"flex items-center gap-2",children:[e.jsx(sc,{className:"h-4 w-4"}),"选择用户"]}),e.jsxs("div",{className:"relative",children:[e.jsx(Tt,{className:"absolute left-3 top-1/2 -translate-y-1/2 h-4 w-4 text-muted-foreground"}),e.jsx(le,{placeholder:"搜索用户名...",value:ne,onChange:q=>ve(q.target.value),className:"pl-9"})]}),e.jsx(Ye,{className:"h-[250px] border rounded-md",children:e.jsx("div",{className:"p-2",children:xe?e.jsx("div",{className:"flex items-center justify-center py-8",children:e.jsx(Bs,{className:"h-6 w-6 animate-spin text-muted-foreground"})}):L.length===0?e.jsxs("div",{className:"flex flex-col items-center justify-center py-8 text-muted-foreground",children:[e.jsx(sc,{className:"h-8 w-8 mb-2 opacity-50"}),e.jsx("p",{className:"text-sm",children:"没有找到用户"})]}):e.jsx("div",{className:"space-y-1",children:L.map(q=>e.jsxs("button",{onClick:()=>mt(q),className:I("w-full flex items-center gap-3 p-2 rounded-md text-left transition-colors",je.personId===q.person_id?"bg-primary text-primary-foreground":"hover:bg-muted"),children:[e.jsx(qi,{className:"h-8 w-8 shrink-0",children:e.jsx(Ki,{className:I("text-xs",je.personId===q.person_id?"bg-primary-foreground/20":"bg-muted"),children:(q.nickname||q.person_name||"?").charAt(0)})}),e.jsxs("div",{className:"min-w-0 flex-1",children:[e.jsx("div",{className:"font-medium truncate",children:q.nickname||q.person_name}),e.jsxs("div",{className:I("text-xs truncate",je.personId===q.person_id?"text-primary-foreground/70":"text-muted-foreground"),children:["ID: ",q.user_id,q.is_known&&" · 已认识"]})]})]},q.person_id))})})})]}),je.personId&&e.jsxs("div",{className:"space-y-2",children:[e.jsx(E,{children:"虚拟群名(可选)"}),e.jsx(le,{placeholder:"WebUI虚拟群聊",value:je.groupName,onChange:q=>z(Ve=>({...Ve,groupName:q.target.value}))}),e.jsx("p",{className:"text-xs text-muted-foreground",children:"麦麦会认为这是一个名为此名称的群聊"})]})]}),e.jsxs(st,{className:"gap-2 sm:gap-0",children:[e.jsx(_,{variant:"outline",onClick:()=>T(!1),children:"取消"}),e.jsx(_,{onClick:aa,disabled:!je.platform||!je.personId,children:"创建对话"})]})]})}),e.jsx("div",{className:"shrink-0 border-b bg-muted/30",children:e.jsx("div",{className:"max-w-4xl mx-auto px-2 sm:px-4",children:e.jsxs("div",{className:"flex items-center gap-1 overflow-x-auto py-1.5 scrollbar-thin",children:[i.map(q=>e.jsxs("div",{className:I("flex items-center gap-1.5 px-3 py-1.5 rounded-md text-sm whitespace-nowrap transition-colors cursor-pointer","hover:bg-muted",u===q.id?"bg-background shadow-sm border":"text-muted-foreground"),onClick:()=>Ft(q.id),children:[q.type==="webui"?e.jsx(Ma,{className:"h-3.5 w-3.5"}):e.jsx(bm,{className:"h-3.5 w-3.5"}),e.jsx("span",{className:"max-w-[100px] truncate",children:q.label}),e.jsx("span",{className:I("w-1.5 h-1.5 rounded-full",q.isConnected?"bg-green-500":"bg-muted-foreground/50")}),q.id!=="webui-default"&&e.jsx("span",{onClick:Ve=>Qa(q.id,Ve),className:"ml-0.5 p-0.5 rounded hover:bg-muted-foreground/20 cursor-pointer",role:"button",tabIndex:0,onKeyDown:Ve=>{(Ve.key==="Enter"||Ve.key===" ")&&(Ve.preventDefault(),Qa(q.id,Ve))},children:e.jsx(Ea,{className:"h-3 w-3"})})]},q.id)),e.jsx("button",{onClick:Ut,className:"flex items-center gap-1 px-2 py-1.5 rounded-md text-sm text-muted-foreground hover:bg-muted hover:text-foreground transition-colors",title:"新建虚拟身份对话",children:e.jsx(et,{className:"h-3.5 w-3.5"})})]})})}),e.jsx("div",{className:"shrink-0 border-b bg-background/95 backdrop-blur supports-[backdrop-filter]:bg-background/60",children:e.jsxs("div",{className:"p-3 sm:p-4 max-w-4xl mx-auto",children:[e.jsxs("div",{className:"flex items-center justify-between gap-2",children:[e.jsxs("div",{className:"flex items-center gap-2 sm:gap-3 min-w-0",children:[e.jsx(qi,{className:"h-8 w-8 sm:h-10 sm:w-10 shrink-0",children:e.jsx(Ki,{className:"bg-primary/10 text-primary",children:e.jsx(Pn,{className:"h-4 w-4 sm:h-5 sm:w-5"})})}),e.jsxs("div",{className:"min-w-0",children:[e.jsx("h1",{className:"text-base sm:text-lg font-semibold truncate",children:h?.sessionInfo.bot_name||"麦麦"}),e.jsx("div",{className:"flex items-center gap-1.5 text-xs text-muted-foreground",children:h?.isConnected?e.jsxs(e.Fragment,{children:[e.jsx(m_,{className:"h-3 w-3 text-green-500"}),e.jsx("span",{className:"text-green-600 dark:text-green-400",children:"已连接"})]}):g?e.jsxs(e.Fragment,{children:[e.jsx(Bs,{className:"h-3 w-3 animate-spin"}),e.jsx("span",{children:"连接中..."})]}):e.jsxs(e.Fragment,{children:[e.jsx(x_,{className:"h-3 w-3 text-red-500"}),e.jsx("span",{className:"text-red-600 dark:text-red-400",children:"未连接"})]})})]})]}),e.jsxs("div",{className:"flex items-center gap-1 shrink-0",children:[v&&e.jsx(Bs,{className:"h-4 w-4 animate-spin text-muted-foreground"}),e.jsx(_,{variant:"ghost",size:"icon",className:"h-8 w-8",onClick:rs,disabled:g,title:"重新连接",children:e.jsx(dt,{className:I("h-4 w-4",g&&"animate-spin")})})]})]}),e.jsx("div",{className:"hidden sm:flex items-center gap-2 mt-2 text-sm text-muted-foreground",children:h?.type==="virtual"&&h.virtualConfig?e.jsxs(e.Fragment,{children:[e.jsx(bm,{className:"h-3 w-3 text-primary"}),e.jsx("span",{children:"虚拟身份:"}),e.jsx("span",{className:"font-medium text-primary",children:h.virtualConfig.userName}),e.jsxs("span",{className:"text-xs",children:["(",h.virtualConfig.platform,")"]}),h.virtualConfig.groupName&&e.jsxs(e.Fragment,{children:[e.jsx("span",{className:"mx-1",children:"·"}),e.jsxs("span",{className:"text-xs",children:["群:",h.virtualConfig.groupName]})]})]}):e.jsxs(e.Fragment,{children:[e.jsx(fn,{className:"h-3 w-3"}),e.jsx("span",{children:"当前身份:"}),R?e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(le,{value:S,onChange:q=>P(q.target.value),onKeyDown:q=>{q.key==="Enter"&&Te(),q.key==="Escape"&&de()},className:"h-7 w-32",placeholder:"输入昵称",autoFocus:!0}),e.jsx(_,{size:"sm",variant:"ghost",className:"h-7 px-2",onClick:Te,children:"保存"}),e.jsx(_,{size:"sm",variant:"ghost",className:"h-7 px-2",onClick:de,children:"取消"})]}):e.jsxs("div",{className:"flex items-center gap-1",children:[e.jsx("span",{className:"font-medium text-foreground",children:w}),e.jsx(_,{size:"sm",variant:"ghost",className:"h-6 w-6 p-0",onClick:ie,title:"修改昵称",children:e.jsx(h_,{className:"h-3 w-3"})})]})]})})]})}),e.jsx("div",{className:"flex-1 overflow-hidden",children:e.jsx(Ye,{className:"h-full",children:e.jsxs("div",{className:"p-3 sm:p-4 max-w-4xl mx-auto space-y-3 sm:space-y-4",children:[h?.messages.length===0&&!v&&e.jsxs("div",{className:"flex flex-col items-center justify-center py-12 text-muted-foreground",children:[e.jsx(Pn,{className:"h-12 w-12 mb-4 opacity-50"}),e.jsxs("p",{className:"text-sm",children:["开始与 ",h?.sessionInfo.bot_name||"麦麦"," 对话吧!"]})]}),h?.messages.map(q=>e.jsxs("div",{className:I("flex gap-2 sm:gap-3",q.type==="user"&&"flex-row-reverse",q.type==="system"&&"justify-center",q.type==="error"&&"justify-center"),children:[q.type==="system"&&e.jsx("div",{className:"text-xs text-muted-foreground bg-muted/50 px-3 py-1 rounded-full max-w-[90%]",children:q.content}),q.type==="error"&&e.jsx("div",{className:"text-xs text-red-600 dark:text-red-400 bg-red-100 dark:bg-red-900/30 px-3 py-1 rounded-full max-w-[90%]",children:q.content}),q.type==="thinking"&&e.jsxs(e.Fragment,{children:[e.jsx(qi,{className:"h-7 w-7 sm:h-8 sm:w-8 shrink-0",children:e.jsx(Ki,{className:"bg-primary/10 text-primary",children:e.jsx(Pn,{className:"h-3.5 w-3.5 sm:h-4 sm:w-4"})})}),e.jsxs("div",{className:"flex flex-col gap-1 max-w-[75%] sm:max-w-[70%]",children:[e.jsx("div",{className:"flex items-center gap-2 text-[10px] sm:text-xs text-muted-foreground",children:e.jsx("span",{className:"hidden sm:inline",children:q.sender?.name||h?.sessionInfo.bot_name})}),e.jsx("div",{className:"bg-muted rounded-2xl rounded-tl-sm px-4 py-3",children:e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsxs("div",{className:"flex gap-1",children:[e.jsx("span",{className:"w-2 h-2 bg-primary/60 rounded-full animate-bounce",style:{animationDelay:"0ms"}}),e.jsx("span",{className:"w-2 h-2 bg-primary/60 rounded-full animate-bounce",style:{animationDelay:"150ms"}}),e.jsx("span",{className:"w-2 h-2 bg-primary/60 rounded-full animate-bounce",style:{animationDelay:"300ms"}})]}),e.jsx("span",{className:"text-xs text-muted-foreground ml-1",children:"思考中..."})]})})]})]}),(q.type==="user"||q.type==="bot")&&e.jsxs(e.Fragment,{children:[e.jsx(qi,{className:"h-7 w-7 sm:h-8 sm:w-8 shrink-0",children:e.jsx(Ki,{className:I("text-xs",q.type==="bot"?"bg-primary/10 text-primary":"bg-secondary text-secondary-foreground"),children:q.type==="bot"?e.jsx(Pn,{className:"h-3.5 w-3.5 sm:h-4 sm:w-4"}):e.jsx(fn,{className:"h-3.5 w-3.5 sm:h-4 sm:w-4"})})}),e.jsxs("div",{className:I("flex flex-col gap-1 max-w-[75%] sm:max-w-[70%]",q.type==="user"&&"items-end"),children:[e.jsxs("div",{className:"flex items-center gap-2 text-[10px] sm:text-xs text-muted-foreground",children:[e.jsx("span",{className:"hidden sm:inline",children:q.sender?.name||(q.type==="bot"?h?.sessionInfo.bot_name:w)}),e.jsx("span",{children:Me(q.timestamp)})]}),e.jsx("div",{className:I("rounded-2xl px-3 py-2 text-sm break-words",q.type==="bot"?"bg-muted rounded-tl-sm":"bg-primary text-primary-foreground rounded-tr-sm"),children:e.jsx(eC,{message:q,isBot:q.type==="bot"})})]})]})]},q.id)),e.jsx("div",{ref:oe})]})})}),e.jsx("div",{className:"shrink-0 border-t bg-background/95 backdrop-blur supports-[backdrop-filter]:bg-background/60",children:e.jsx("div",{className:"p-3 sm:p-4 max-w-4xl mx-auto",children:e.jsxs("div",{className:"flex gap-2",children:[e.jsx(le,{value:f,onChange:q=>p(q.target.value),onKeyDown:Ue,placeholder:h?.isConnected?"输入消息...":"等待连接...",disabled:!h?.isConnected,className:"flex-1 h-10 sm:h-10"}),e.jsx(_,{onClick:ee,disabled:!h?.isConnected||!f.trim(),size:"icon",className:"h-10 w-10 shrink-0",children:e.jsx(f_,{className:"h-4 w-4"})})]})})})]})}var ux="Radio",[tC,Vv]=Ko(ux),[aC,lC]=tC(ux),qv=d.forwardRef((l,n)=>{const{__scopeRadio:i,name:c,checked:u=!1,required:x,disabled:h,value:f="on",onCheck:p,form:g,...N}=l,[v,y]=d.useState(null),w=Qo(n,D=>y(D)),b=d.useRef(!1),R=v?g||!!v.closest("form"):!0;return e.jsxs(aC,{scope:i,checked:u,disabled:h,children:[e.jsx(Qn.button,{type:"button",role:"radio","aria-checked":u,"data-state":Jv(u),"data-disabled":h?"":void 0,disabled:h,value:f,...N,ref:w,onClick:hn(l.onClick,D=>{u||p?.(),R&&(b.current=D.isPropagationStopped(),b.current||D.stopPropagation())})}),R&&e.jsx(Yv,{control:v,bubbles:!b.current,name:c,value:f,checked:u,required:x,disabled:h,form:g,style:{transform:"translateX(-100%)"}})]})});qv.displayName=ux;var Kv="RadioIndicator",Qv=d.forwardRef((l,n)=>{const{__scopeRadio:i,forceMount:c,...u}=l,x=lC(Kv,i);return e.jsx(Dw,{present:c||x.checked,children:e.jsx(Qn.span,{"data-state":Jv(x.checked),"data-disabled":x.disabled?"":void 0,...u,ref:n})})});Qv.displayName=Kv;var nC="RadioBubbleInput",Yv=d.forwardRef(({__scopeRadio:l,control:n,checked:i,bubbles:c=!0,...u},x)=>{const h=d.useRef(null),f=Qo(h,x),p=Rw(i),g=Lw(n);return d.useEffect(()=>{const N=h.current;if(!N)return;const v=window.HTMLInputElement.prototype,w=Object.getOwnPropertyDescriptor(v,"checked").set;if(p!==i&&w){const b=new Event("click",{bubbles:c});w.call(N,i),N.dispatchEvent(b)}},[p,i,c]),e.jsx(Qn.input,{type:"radio","aria-hidden":!0,defaultChecked:i,...u,tabIndex:-1,ref:f,style:{...u.style,...g,position:"absolute",pointerEvents:"none",opacity:0,margin:0}})});Yv.displayName=nC;function Jv(l){return l?"checked":"unchecked"}var rC=["ArrowUp","ArrowDown","ArrowLeft","ArrowRight"],rd="RadioGroup",[iC]=Ko(rd,[rj,Vv]),Xv=rj(),Zv=Vv(),[cC,oC]=iC(rd),Wv=d.forwardRef((l,n)=>{const{__scopeRadioGroup:i,name:c,defaultValue:u,value:x,required:h=!1,disabled:f=!1,orientation:p,dir:g,loop:N=!0,onValueChange:v,...y}=l,w=Xv(i),b=_j(g),[R,D]=qo({prop:x,defaultProp:u??null,onChange:v,caller:rd});return e.jsx(cC,{scope:i,name:c,required:h,disabled:f,value:R,onValueChange:D,children:e.jsx(J0,{asChild:!0,...w,orientation:p,dir:b,loop:N,children:e.jsx(Qn.div,{role:"radiogroup","aria-required":h,"aria-orientation":p,"data-disabled":f?"":void 0,dir:b,...y,ref:n})})})});Wv.displayName=rd;var eN="RadioGroupItem",sN=d.forwardRef((l,n)=>{const{__scopeRadioGroup:i,disabled:c,...u}=l,x=oC(eN,i),h=x.disabled||c,f=Xv(i),p=Zv(i),g=d.useRef(null),N=Qo(n,g),v=x.value===u.value,y=d.useRef(!1);return d.useEffect(()=>{const w=R=>{rC.includes(R.key)&&(y.current=!0)},b=()=>y.current=!1;return document.addEventListener("keydown",w),document.addEventListener("keyup",b),()=>{document.removeEventListener("keydown",w),document.removeEventListener("keyup",b)}},[]),e.jsx(X0,{asChild:!0,...f,focusable:!h,active:v,children:e.jsx(qv,{disabled:h,required:x.required,checked:v,...p,...u,name:x.name,ref:N,onCheck:()=>x.onValueChange(u.value),onKeyDown:hn(w=>{w.key==="Enter"&&w.preventDefault()}),onFocus:hn(u.onFocus,()=>{y.current&&g.current?.click()})})})});sN.displayName=eN;var dC="RadioGroupIndicator",tN=d.forwardRef((l,n)=>{const{__scopeRadioGroup:i,...c}=l,u=Zv(i);return e.jsx(Qv,{...u,...c,ref:n})});tN.displayName=dC;var aN=Wv,lN=sN,uC=tN;const mx=d.forwardRef(({className:l,...n},i)=>e.jsx(aN,{className:I("grid gap-2",l),...n,ref:i}));mx.displayName=aN.displayName;const Go=d.forwardRef(({className:l,...n},i)=>e.jsx(lN,{ref:i,className:I("aspect-square h-4 w-4 rounded-full border border-primary text-primary shadow focus:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:cursor-not-allowed disabled:opacity-50",l),...n,children:e.jsx(uC,{className:"flex items-center justify-center",children:e.jsx(Lo,{className:"h-2.5 w-2.5 fill-current text-current"})})}));Go.displayName=lN.displayName;function mC({question:l,value:n,onChange:i,error:c,disabled:u=!1}){const[x,h]=d.useState(null),f=u||l.readOnly,p=()=>{switch(l.type){case"single":return e.jsx(mx,{value:n||"",onValueChange:i,disabled:f,className:"space-y-2",children:l.options?.map(g=>e.jsxs("div",{className:"flex items-center space-x-2",children:[e.jsx(Go,{value:g.value,id:`${l.id}-${g.id}`}),e.jsx(E,{htmlFor:`${l.id}-${g.id}`,className:"cursor-pointer font-normal",children:g.label})]},g.id))});case"multiple":{const g=n||[];return e.jsxs("div",{className:"space-y-2",children:[l.options?.map(N=>e.jsxs("div",{className:"flex items-center space-x-2",children:[e.jsx(qs,{id:`${l.id}-${N.id}`,checked:g.includes(N.value),disabled:f||l.maxSelections!==void 0&&g.length>=l.maxSelections&&!g.includes(N.value),onCheckedChange:v=>{i(v?[...g,N.value]:g.filter(y=>y!==N.value))}}),e.jsx(E,{htmlFor:`${l.id}-${N.id}`,className:"cursor-pointer font-normal",children:N.label})]},N.id)),l.maxSelections&&e.jsxs("p",{className:"text-xs text-muted-foreground",children:["最多选择 ",l.maxSelections," 项"]})]})}case"text":return e.jsx(le,{value:n||"",onChange:g=>i(g.target.value),placeholder:l.placeholder||"请输入...",disabled:f,readOnly:l.readOnly,maxLength:l.maxLength,className:I(l.readOnly&&"bg-muted cursor-not-allowed")});case"textarea":return e.jsxs("div",{className:"space-y-1",children:[e.jsx(ot,{value:n||"",onChange:g=>i(g.target.value),placeholder:l.placeholder||"请输入...",disabled:f,readOnly:l.readOnly,maxLength:l.maxLength,rows:4,className:I(l.readOnly&&"bg-muted cursor-not-allowed")}),l.maxLength&&e.jsxs("p",{className:"text-xs text-muted-foreground text-right",children:[(n||"").length," / ",l.maxLength]})]});case"rating":{const g=n||0,N=x!==null?x:g;return e.jsxs("div",{className:"flex items-center gap-1",children:[[1,2,3,4,5].map(v=>e.jsx("button",{type:"button",disabled:f,className:I("p-1 transition-colors focus:outline-none focus:ring-2 focus:ring-ring rounded",f&&"cursor-not-allowed opacity-50"),onMouseEnter:()=>!f&&h(v),onMouseLeave:()=>h(null),onClick:()=>!f&&i(v),children:e.jsx(dn,{className:I("h-6 w-6 transition-colors",v<=N?"fill-yellow-400 text-yellow-400":"text-muted-foreground")})},v)),g>0&&e.jsxs("span",{className:"ml-2 text-sm text-muted-foreground",children:[g," / 5"]})]})}case"scale":{const g=l.min??1,N=l.max??10,v=l.step??1,y=n??g;return e.jsxs("div",{className:"space-y-4",children:[e.jsx(qa,{value:[y],onValueChange:([w])=>i(w),min:g,max:N,step:v,disabled:f}),e.jsxs("div",{className:"flex justify-between text-xs text-muted-foreground",children:[e.jsx("span",{children:l.minLabel||g}),e.jsx("span",{className:"font-medium text-foreground",children:y}),e.jsx("span",{children:l.maxLabel||N})]})]})}case"dropdown":return e.jsxs(Ie,{value:n||"",onValueChange:i,disabled:f,children:[e.jsx($e,{children:e.jsx(Pe,{placeholder:l.placeholder||"请选择..."})}),e.jsx(Be,{children:l.options?.map(g=>e.jsx(X,{value:g.value,children:g.label},g.id))})]});default:return e.jsx("div",{className:"text-muted-foreground",children:"不支持的问题类型"})}};return e.jsxs("div",{className:"space-y-3",children:[e.jsxs("div",{className:"space-y-1",children:[e.jsxs(E,{className:"text-base font-medium",children:[l.title,l.required&&e.jsx("span",{className:"text-destructive ml-1",children:"*"})]}),l.description&&e.jsx("p",{className:"text-sm text-muted-foreground",children:l.description})]}),p(),c&&e.jsx("p",{className:"text-sm text-destructive",children:c})]})}const nN="https://maibot-plugin-stats.maibot-webui.workers.dev";function rN(){const l="maibot_user_id";let n=localStorage.getItem(l);if(!n){const i=Math.random().toString(36).substring(2,10),c=Date.now().toString(36),u=Math.random().toString(36).substring(2,10);n=`fp_${i}_${c}_${u}`,localStorage.setItem(l,n)}return n}async function xC(l,n,i,c){try{const u=c?.userId||rN(),x={surveyId:l,surveyVersion:n,userId:u,answers:i,submittedAt:new Date().toISOString(),allowMultiple:c?.allowMultiple,metadata:{userAgent:navigator.userAgent,language:navigator.language}},h=await fetch(`${nN}/survey/submit`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(x)}),f=await h.json();return h.status===429?{success:!1,error:"提交过于频繁,请稍后再试"}:h.status===409?{success:!1,error:f.error||"你已经提交过这份问卷了"}:h.ok?{success:!0,submissionId:f.submissionId,message:f.message}:{success:!1,error:f.error||"提交失败"}}catch(u){return console.error("Error submitting survey:",u),{success:!1,error:"网络错误"}}}async function hC(l,n){try{const i=n||rN(),c=new URLSearchParams({user_id:i,survey_id:l}),u=await fetch(`${nN}/survey/check?${c}`);return u.ok?{success:!0,hasSubmitted:(await u.json()).hasSubmitted}:{success:!1,error:(await u.json()).error||"检查失败"}}catch(i){return console.error("Error checking submission:",i),{success:!1,error:"网络错误"}}}function iN({config:l,initialAnswers:n,onSubmitSuccess:i,onSubmitError:c,showProgress:u=!0,paginateQuestions:x=!1,className:h}){const f=d.useCallback(()=>!n||n.length===0?{}:n.reduce((B,oe)=>(B[oe.questionId]=oe.value,B),{}),[n]),[p,g]=d.useState(()=>f()),[N,v]=d.useState({}),[y,w]=d.useState(0),[b,R]=d.useState(!1),[D,S]=d.useState(!1),[P,M]=d.useState(null),[T,A]=d.useState(null),[F,L]=d.useState(!1),[J,U]=d.useState(!0);d.useEffect(()=>{n&&n.length>0&&g(B=>({...B,...f()}))},[n,f]),d.useEffect(()=>{(async()=>{if(!l.settings?.allowMultiple){const oe=await hC(l.id);oe.success&&oe.hasSubmitted&&L(!0)}U(!1)})()},[l.id,l.settings?.allowMultiple]);const ue=d.useCallback(()=>{const B=new Date;return!(l.settings?.startTime&&new Date(l.settings.startTime)>B||l.settings?.endTime&&new Date(l.settings.endTime){const oe=p[B.id];return oe==null?!1:Array.isArray(oe)?oe.length>0:typeof oe=="string"?oe.trim()!=="":!0}).length,he=xe/l.questions.length*100,ne=d.useCallback((B,oe)=>{g(K=>({...K,[B]:oe})),v(K=>{const _e={...K};return delete _e[B],_e})},[]),ve=d.useCallback(()=>{const B={};for(const oe of l.questions){if(oe.required){const K=p[oe.id];if(K==null){B[oe.id]="此题为必填项";continue}if(Array.isArray(K)&&K.length===0){B[oe.id]="请至少选择一项";continue}if(typeof K=="string"&&K.trim()===""){B[oe.id]="此题为必填项";continue}}oe.minLength&&typeof p[oe.id]=="string"&&p[oe.id].length{if(!ve()){if(x){const B=l.questions.findIndex(oe=>N[oe.id]);B>=0&&w(B)}return}R(!0),M(null);try{const B=l.questions.filter(K=>p[K.id]!==void 0).map(K=>({questionId:K.id,value:p[K.id]})),oe=await xC(l.id,l.version,B,{allowMultiple:l.settings?.allowMultiple});if(oe.success&&oe.submissionId)S(!0),A(oe.submissionId),i?.(oe.submissionId);else{const K=oe.error||"提交失败";M(K),c?.(K)}}catch(B){const oe=B instanceof Error?B.message:"提交失败";M(oe),c?.(oe)}finally{R(!1)}},[ve,x,l,p,N,i,c]),z=d.useCallback(B=>{B>=0&&Be.jsxs("div",{className:I("p-4 rounded-lg border bg-card",N[B.id]?"border-destructive bg-destructive/5":"border-border"),children:[x&&e.jsxs("div",{className:"text-xs text-muted-foreground mb-2",children:["问题 ",y+1," / ",l.questions.length]}),!x&&e.jsxs("div",{className:"text-xs text-muted-foreground mb-2",children:[oe+1,"."]}),e.jsx(mC,{question:B,value:p[B.id],onChange:K=>ne(B.id,K),error:N[B.id],disabled:b})]},B.id)),P&&e.jsxs(at,{variant:"destructive",children:[e.jsx(_t,{className:"h-4 w-4"}),e.jsx(lt,{children:P})]}),e.jsx("div",{className:"flex justify-between items-center py-4",children:x?e.jsxs(e.Fragment,{children:[e.jsxs(_,{variant:"outline",onClick:()=>z(y-1),disabled:y===0||b,children:[e.jsx(Aa,{className:"h-4 w-4 mr-1"}),"上一题"]}),y===l.questions.length-1?e.jsxs(_,{onClick:je,disabled:b,children:[b&&e.jsx(Bs,{className:"h-4 w-4 mr-2 animate-spin"}),"提交问卷"]}):e.jsxs(_,{onClick:()=>z(y+1),disabled:b,children:["下一题",e.jsx(Zt,{className:"h-4 w-4 ml-1"})]})]}):e.jsxs(e.Fragment,{children:[e.jsx("div",{className:"text-sm text-muted-foreground",children:Object.keys(N).length>0&&e.jsxs("span",{className:"text-destructive",children:["还有 ",Object.keys(N).length," 个必填项未完成"]})}),e.jsxs(_,{onClick:je,disabled:b,size:"lg",children:[b&&e.jsx(Bs,{className:"h-4 w-4 mr-2 animate-spin"}),"提交问卷"]})]})})]})})]})}const fC={id:"webui-feedback-v1",version:"1.0.0",title:"麦麦 WebUI 使用反馈问卷",description:"感谢您使用麦麦 WebUI!您的反馈将帮助我们不断改进产品体验。",questions:[{id:"webui_version",type:"text",title:"你正在使用的 WebUI 版本",description:"此项由系统自动填写",required:!0,readOnly:!0,placeholder:"自动检测中..."},{id:"ui_design_satisfaction",type:"single",title:"你觉得当前的 WebUI 界面设计如何?",required:!0,options:[{id:"very_satisfied",label:"非常满意",value:"very_satisfied"},{id:"satisfied",label:"满意",value:"satisfied"},{id:"neutral",label:"一般",value:"neutral"},{id:"dissatisfied",label:"不满意",value:"dissatisfied"},{id:"very_dissatisfied",label:"非常不满意",value:"very_dissatisfied"}]},{id:"problems_encountered",type:"multiple",title:"你在使用 WebUI 时遇到过哪些问题?",description:"可多选",required:!0,options:[{id:"lag",label:"界面卡顿",value:"lag"},{id:"incomplete",label:"功能不完整",value:"incomplete"},{id:"complex",label:"操作复杂",value:"complex"},{id:"bugs",label:"存在 Bug",value:"bugs"},{id:"none",label:"没有遇到问题",value:"none"},{id:"other",label:"其他",value:"other"}]},{id:"problems_other",type:"text",title:'如选择"其他",请说明遇到的问题',required:!1,placeholder:"请描述你遇到的其他问题...",maxLength:500},{id:"useful_features",type:"textarea",title:"你觉得哪些功能是最有用的?",required:!0,placeholder:"请分享你认为最有价值的功能...",maxLength:1e3},{id:"feature_requests",type:"textarea",title:"你希望在未来的版本中增加哪些功能?",required:!0,placeholder:"请告诉我们你期望的新功能...",maxLength:1e3},{id:"overall_satisfaction",type:"single",title:"你对麦麦 WebUI 的整体满意度如何?",required:!0,options:[{id:"very_satisfied",label:"非常满意",value:"very_satisfied"},{id:"satisfied",label:"满意",value:"satisfied"},{id:"neutral",label:"一般",value:"neutral"},{id:"dissatisfied",label:"不满意",value:"dissatisfied"},{id:"very_dissatisfied",label:"非常不满意",value:"very_dissatisfied"}]},{id:"would_recommend",type:"single",title:"你愿意推荐麦麦 WebUI 给其他人使用吗?",required:!0,options:[{id:"yes",label:"是",value:"yes"},{id:"no",label:"否",value:"no"}]},{id:"other_suggestions",type:"textarea",title:"其他建议或意见",description:"此项为选填",required:!1,placeholder:"如果你有任何其他想法或建议,请在此分享...",maxLength:2e3}],settings:{allowMultiple:!1,thankYouMessage:"感谢你的反馈!你的意见对我们非常重要,我们会认真考虑每一条建议。"}},pC={id:"maibot-feedback-v1",version:"1.0.0",title:"麦麦使用体验反馈问卷",description:"感谢您使用麦麦!您的反馈将帮助我们打造更好的 AI 伙伴。",questions:[{id:"maibot_version",type:"text",title:"你正在使用的麦麦版本",description:"此项由系统自动填写",required:!0,readOnly:!0,placeholder:"自动检测中..."},{id:"improvement_areas",type:"textarea",title:"你认为麦麦还有哪些部分可以改进?",required:!0,placeholder:"请分享你认为可以改进的方面...",maxLength:1e3},{id:"problems_encountered",type:"multiple",title:"你在使用麦麦时遇到过哪些问题?",description:"可多选",required:!0,options:[{id:"incomplete",label:"功能不完整",value:"incomplete"},{id:"slow_response",label:"响应速度慢",value:"slow_response"},{id:"complex",label:"操作复杂",value:"complex"},{id:"unstable",label:"运行不稳定",value:"unstable"},{id:"config_difficult",label:"配置困难",value:"config_difficult"},{id:"none",label:"没有遇到问题",value:"none"},{id:"other",label:"其他",value:"other"}]},{id:"problems_other",type:"text",title:'如选择"其他",请说明遇到的问题',required:!1,placeholder:"请描述你遇到的其他问题...",maxLength:500},{id:"helpful_features",type:"textarea",title:"你觉得麦麦的哪些功能对你最有帮助?",required:!0,placeholder:"请分享对你最有帮助的功能...",maxLength:1e3},{id:"feature_requests",type:"textarea",title:"你希望在未来的版本中增加哪些功能?",required:!0,placeholder:"请告诉我们你期望的新功能...",maxLength:1e3},{id:"overall_satisfaction",type:"single",title:"你对麦麦的整体满意度如何?",required:!0,options:[{id:"very_satisfied",label:"非常满意",value:"very_satisfied"},{id:"satisfied",label:"满意",value:"satisfied"},{id:"neutral",label:"一般",value:"neutral"},{id:"dissatisfied",label:"不满意",value:"dissatisfied"},{id:"very_dissatisfied",label:"非常不满意",value:"very_dissatisfied"}]},{id:"would_recommend",type:"single",title:"你愿意推荐麦麦给其他人使用吗?",required:!0,options:[{id:"yes",label:"是",value:"yes"},{id:"no",label:"否",value:"no"}]},{id:"other_suggestions",type:"textarea",title:"其他建议或意见",description:"此项为选填",required:!1,placeholder:"如果你有任何其他想法或建议,请在此分享...",maxLength:2e3}],settings:{allowMultiple:!1,thankYouMessage:"感谢你的反馈!你的意见对麦麦的成长非常重要,我们会认真考虑每一条建议。"}};function gC(){const[l,n]=d.useState(!0),i=d.useMemo(()=>JSON.parse(JSON.stringify(fC)),[]);d.useEffect(()=>{n(!1)},[]);const c=d.useMemo(()=>[{questionId:"webui_version",value:`v${ed}`}],[]),u=d.useCallback(h=>{console.log("WebUI Survey submitted:",h)},[]),x=d.useCallback(h=>{console.error("WebUI Survey submission error:",h)},[]);return l?e.jsx("div",{className:"flex items-center justify-center min-h-[400px]",children:e.jsx(Bs,{className:"h-8 w-8 animate-spin text-muted-foreground"})}):i?e.jsxs("div",{className:"h-[calc(100vh-4rem)] flex flex-col p-4 sm:p-6",children:[e.jsxs("div",{className:"mb-4 sm:mb-6 shrink-0",children:[e.jsxs("h1",{className:"text-2xl sm:text-3xl font-bold flex items-center gap-2",children:[e.jsx(Hj,{className:"h-8 w-8",strokeWidth:2}),"WebUI 使用反馈问卷"]}),e.jsx("p",{className:"text-muted-foreground mt-1 text-sm sm:text-base",children:"感谢您的反馈,帮助我们持续改进产品体验"})]}),e.jsx("div",{className:"flex-1 min-h-0",children:e.jsx(iN,{config:i,initialAnswers:c,showProgress:!0,paginateQuestions:!1,onSubmitSuccess:u,onSubmitError:x})})]}):e.jsxs("div",{className:"flex flex-col items-center justify-center min-h-[400px] gap-4",children:[e.jsxs(at,{variant:"destructive",className:"max-w-md",children:[e.jsx(_t,{className:"h-4 w-4"}),e.jsx(lt,{children:"无法加载问卷配置"})]}),e.jsx(_,{variant:"outline",onClick:()=>window.location.reload(),children:"重试"})]})}function jC(){const[l,n]=d.useState(null),[i,c]=d.useState(!0),[u,x]=d.useState("未知版本");d.useEffect(()=>{(async()=>{try{const v=await c1();x(v.version||"未知版本")}catch(v){console.error("Failed to get MaiBot version:",v),x("获取失败")}const N=JSON.parse(JSON.stringify(pC));n(N),c(!1)})()},[]);const h=d.useMemo(()=>[{questionId:"maibot_version",value:u}],[u]),f=d.useCallback(g=>{console.log("MaiBot Survey submitted:",g)},[]),p=d.useCallback(g=>{console.error("MaiBot Survey submission error:",g)},[]);return i?e.jsx("div",{className:"flex items-center justify-center min-h-[400px]",children:e.jsx(Bs,{className:"h-8 w-8 animate-spin text-muted-foreground"})}):l?e.jsxs("div",{className:"h-[calc(100vh-4rem)] flex flex-col p-4 sm:p-6",children:[e.jsxs("div",{className:"mb-4 sm:mb-6 shrink-0",children:[e.jsxs("h1",{className:"text-2xl sm:text-3xl font-bold flex items-center gap-2",children:[e.jsx(Hj,{className:"h-8 w-8",strokeWidth:2}),"麦麦使用体验反馈问卷"]}),e.jsx("p",{className:"text-muted-foreground mt-1 text-sm sm:text-base",children:"感谢您的反馈,帮助我们打造更好的 AI 伙伴"})]}),e.jsx("div",{className:"flex-1 min-h-0",children:e.jsx(iN,{config:l,initialAnswers:h,showProgress:!0,paginateQuestions:!1,onSubmitSuccess:f,onSubmitError:p})})]}):e.jsxs("div",{className:"flex flex-col items-center justify-center min-h-[400px] gap-4",children:[e.jsxs(at,{variant:"destructive",className:"max-w-md",children:[e.jsx(_t,{className:"h-4 w-4"}),e.jsx(lt,{children:"无法加载问卷配置"})]}),e.jsx(_,{variant:"outline",onClick:()=>window.location.reload(),children:"重试"})]})}async function vC(l=2025){const n=await we(`/api/webui/annual-report/full?year=${l}`);if(!n.ok){const i=await n.json();throw new Error(i.detail||"获取年度报告失败")}return n.json()}const $g=["#0088FE","#00C49F","#FFBB28","#FF8042","#8884d8","#82ca9d"];function NC(){const[l]=d.useState(2025),[n,i]=d.useState(null),[c,u]=d.useState(!0),[x,h]=d.useState(null),f=d.useRef(null),p=d.useCallback(async()=>{try{u(!0),h(null);const g=await vC(l);i(g)}catch(g){h(g instanceof Error?g:new Error("获取年度报告失败"))}finally{u(!1)}},[l]);return d.useEffect(()=>{p()},[p]),c?e.jsx(bC,{}):x?e.jsxs("div",{className:"flex h-screen items-center justify-center text-red-500",children:["获取年度报告失败: ",x.message]}):n?e.jsx(Ye,{className:"h-[calc(100vh-4rem)]",children:e.jsx("div",{className:"min-h-screen bg-gradient-to-b from-background to-muted/50 p-4 md:p-8 print:p-0",children:e.jsxs("div",{className:"mx-auto max-w-5xl space-y-8 print:space-y-4",ref:f,children:[e.jsxs("header",{className:"relative overflow-hidden rounded-3xl bg-primary p-8 text-primary-foreground shadow-2xl print:rounded-none print:shadow-none",children:[e.jsxs("div",{className:"relative z-10 flex flex-col items-center text-center",children:[e.jsx(Pn,{className:"mb-4 h-16 w-16 animate-bounce"}),e.jsxs("h1",{className:"text-4xl font-bold tracking-tighter sm:text-6xl",children:["麦麦 ",n.year," 年度总结"]}),e.jsx("p",{className:"mt-4 max-w-2xl text-lg opacity-90",children:"连接与成长 · Connection & Growth"}),e.jsxs("div",{className:"mt-6 flex items-center gap-2 text-sm opacity-75",children:[e.jsx($o,{className:"h-4 w-4"}),e.jsxs("span",{children:["生成时间: ",n.generated_at]})]})]}),e.jsx("div",{className:"absolute -right-20 -top-20 h-64 w-64 rounded-full bg-white/10 blur-3xl"}),e.jsx("div",{className:"absolute -bottom-20 -left-20 h-64 w-64 rounded-full bg-white/10 blur-3xl"})]}),e.jsxs("section",{className:"space-y-4 break-inside-avoid",children:[e.jsxs("div",{className:"flex items-center gap-2 text-2xl font-bold text-primary",children:[e.jsx(na,{className:"h-8 w-8"}),e.jsx("h2",{children:"时光足迹"})]}),e.jsxs("div",{className:"grid gap-4 md:grid-cols-2 lg:grid-cols-4",children:[e.jsx(ka,{title:"年度在线时长",value:`${n.time_footprint.total_online_hours} 小时`,description:"相当于陪伴大家绕了太阳一圈",icon:e.jsx(na,{className:"h-4 w-4"})}),e.jsx(ka,{title:"最忙碌的一天",value:n.time_footprint.busiest_day||"N/A",description:`处理了 ${n.time_footprint.busiest_day_count} 条消息`,icon:e.jsx($o,{className:"h-4 w-4"})}),e.jsx(ka,{title:"深夜互动 (0-4点)",value:`${n.time_footprint.midnight_chat_count} 次`,description:"在万籁俱寂时交换秘密",icon:e.jsx(Qi,{className:"h-4 w-4"})}),e.jsx(ka,{title:"作息属性",value:n.time_footprint.is_night_owl?"夜猫子":"早起鸟",description:n.time_footprint.is_night_owl?"越夜越精神":"早睡早起身体好",icon:n.time_footprint.is_night_owl?e.jsx(Qi,{className:"h-4 w-4"}):e.jsx(qm,{className:"h-4 w-4"})})]}),e.jsxs(Ce,{className:"overflow-hidden",children:[e.jsxs(De,{children:[e.jsx(Le,{children:"24小时活跃时钟"}),e.jsx(ws,{children:"麦麦在一天中各个时段的活跃程度"})]}),e.jsx(Ae,{className:"h-[300px]",children:e.jsx(oj,{width:"100%",height:"100%",children:e.jsxs(Eo,{data:n.time_footprint.hourly_distribution.map((g,N)=>({hour:`${N}点`,count:g})),children:[e.jsx(Hi,{strokeDasharray:"3 3",vertical:!1}),e.jsx(Fi,{dataKey:"hour"}),e.jsx(Ur,{}),e.jsx(dj,{contentStyle:{borderRadius:"8px",border:"none",boxShadow:"0 4px 12px rgba(0,0,0,0.1)"},cursor:{fill:"transparent"}}),e.jsx(Gi,{dataKey:"count",fill:"hsl(var(--primary))",radius:[4,4,0,0]})]})})})]}),n.time_footprint.first_message_time&&e.jsx(Ce,{className:"bg-muted/30 border-dashed",children:e.jsxs(Ae,{className:"flex flex-col items-center justify-center p-6 text-center",children:[e.jsx("p",{className:"text-muted-foreground mb-2",children:"2025年的故事开始于"}),e.jsx("div",{className:"text-xl font-bold text-primary mb-1",children:n.time_footprint.first_message_time}),e.jsxs("p",{className:"text-lg",children:[e.jsx("span",{className:"font-semibold text-foreground",children:n.time_footprint.first_message_user})," 说:",e.jsxs("span",{className:"italic text-muted-foreground",children:['"',n.time_footprint.first_message_content,'"']})]})]})})]}),e.jsxs("section",{className:"space-y-4 break-inside-avoid",children:[e.jsxs("div",{className:"flex items-center gap-2 text-2xl font-bold text-primary",children:[e.jsx(sc,{className:"h-8 w-8"}),e.jsx("h2",{children:"社交网络"})]}),e.jsxs("div",{className:"grid gap-4 md:grid-cols-3",children:[e.jsx(ka,{title:"社交圈子",value:`${n.social_network.total_groups} 个群组`,description:`今年新认识了 ${n.social_network.new_friends_count} 位朋友`,icon:e.jsx(sc,{className:"h-4 w-4"})}),e.jsx(ka,{title:"被呼叫次数",value:`${n.social_network.at_count+n.social_network.mentioned_count} 次`,description:"我的名字被大家频繁提起",icon:e.jsx(p_,{className:"h-4 w-4"})}),e.jsx(ka,{title:"最长情陪伴",value:n.social_network.longest_companion_user||"N/A",description:`始终都在,已陪伴 ${n.social_network.longest_companion_days} 天`,icon:e.jsx(Vr,{className:"h-4 w-4 text-red-500"})})]}),e.jsxs("div",{className:"grid gap-4 md:grid-cols-2",children:[e.jsxs(Ce,{children:[e.jsx(De,{children:e.jsx(Le,{children:"话痨群组 TOP3"})}),e.jsx(Ae,{children:e.jsx("div",{className:"space-y-4",children:n.social_network.top_groups.map((g,N)=>e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx(Se,{variant:N===0?"default":"secondary",className:"h-6 w-6 rounded-full p-0 flex items-center justify-center",children:N+1}),e.jsx("span",{className:"font-medium truncate max-w-[150px]",children:g.group_name})]}),e.jsxs("span",{className:"text-muted-foreground text-sm",children:[g.message_count," 条消息"]})]},g.group_id))})})]}),e.jsxs(Ce,{children:[e.jsx(De,{children:e.jsx(Le,{children:"年度最佳损友 TOP3"})}),e.jsx(Ae,{children:e.jsx("div",{className:"space-y-4",children:n.social_network.top_users.map((g,N)=>e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx(Se,{variant:N===0?"default":"secondary",className:"h-6 w-6 rounded-full p-0 flex items-center justify-center",children:N+1}),e.jsx("span",{className:"font-medium truncate max-w-[150px]",children:g.user_nickname})]}),e.jsxs("span",{className:"text-muted-foreground text-sm",children:[g.message_count," 次互动"]})]},g.user_id))})})]})]})]}),e.jsxs("section",{className:"space-y-4 break-inside-avoid",children:[e.jsxs("div",{className:"flex items-center gap-2 text-2xl font-bold text-primary",children:[e.jsx(Xm,{className:"h-8 w-8"}),e.jsx("h2",{children:"最强大脑"})]}),e.jsxs("div",{className:"grid gap-4 md:grid-cols-2 lg:grid-cols-4",children:[e.jsx(ka,{title:"年度 Token 消耗",value:(n.brain_power.total_tokens/1e6).toFixed(2)+" M",description:"连起来可以绕地球 0.5 圈",icon:e.jsx(Za,{className:"h-4 w-4"})}),e.jsx(ka,{title:"年度总花费",value:`$${n.brain_power.total_cost.toFixed(2)}`,description:"为了陪大家聊天也是拼了",icon:e.jsx("span",{className:"font-bold",children:"$"})}),e.jsx(ka,{title:"高冷指数",value:`${n.brain_power.silence_rate}%`,description:`有 ${n.brain_power.no_reply_count} 次选择了沉默`,icon:e.jsx(Qi,{className:"h-4 w-4"})}),e.jsx(ka,{title:"最高兴趣值",value:n.brain_power.max_interest_value??"N/A",description:n.brain_power.max_interest_time?`出现在 ${n.brain_power.max_interest_time}`:"暂无数据",icon:e.jsx(Vr,{className:"h-4 w-4"})})]}),e.jsxs("div",{className:"grid gap-4 md:grid-cols-2",children:[e.jsxs(Ce,{children:[e.jsx(De,{children:e.jsx(Le,{children:"模型偏好分布"})}),e.jsx(Ae,{children:e.jsx("div",{className:"space-y-3",children:n.brain_power.model_distribution.slice(0,5).map((g,N)=>{const v=n.brain_power.model_distribution[0]?.count||1,y=Math.round(g.count/v*100);return e.jsxs("div",{className:"space-y-1",children:[e.jsxs("div",{className:"flex justify-between text-sm",children:[e.jsx("span",{className:"font-medium truncate max-w-[200px]",children:g.model}),e.jsxs("span",{className:"text-muted-foreground",children:[g.count.toLocaleString()," 次"]})]}),e.jsx("div",{className:"h-2 w-full overflow-hidden rounded-full bg-secondary",children:e.jsx("div",{className:"h-full transition-all duration-500",style:{width:`${y}%`,backgroundColor:$g[N%$g.length]}})})]},g.model)})})})]}),e.jsxs(Ce,{children:[e.jsxs(De,{children:[e.jsx(Le,{children:"烧钱大户 TOP3"}),e.jsx(ws,{children:"谁消耗了最多的 API 额度"})]}),e.jsx(Ae,{children:e.jsx("div",{className:"space-y-6",children:n.brain_power.top_token_consumers.map(g=>e.jsxs("div",{className:"space-y-2",children:[e.jsxs("div",{className:"flex justify-between text-sm font-medium",children:[e.jsxs("span",{children:["用户 ",g.user_id]}),e.jsxs("span",{children:["$",g.cost.toFixed(2)]})]}),e.jsx("div",{className:"h-2 w-full overflow-hidden rounded-full bg-secondary",children:e.jsx("div",{className:"h-full bg-primary transition-all duration-500",style:{width:`${g.cost/(n.brain_power.top_token_consumers[0]?.cost||1)*100}%`}})})]},g.user_id))})})]})]}),e.jsxs("div",{className:"grid gap-4 md:grid-cols-2",children:[e.jsxs(Ce,{className:"bg-gradient-to-br from-amber-50 to-orange-50 dark:from-amber-950/20 dark:to-orange-950/20",children:[e.jsx(De,{children:e.jsxs(Le,{className:"flex items-center gap-2",children:[e.jsx("span",{className:"text-2xl",children:"💰"}),"最昂贵的一次思考"]})}),e.jsxs(Ae,{className:"text-center",children:[e.jsxs("div",{className:"text-4xl font-bold text-amber-600 dark:text-amber-400",children:["$",n.brain_power.most_expensive_cost.toFixed(4)]}),n.brain_power.most_expensive_time&&e.jsxs("p",{className:"mt-2 text-sm text-muted-foreground",children:["发生在 ",n.brain_power.most_expensive_time]}),e.jsx("p",{className:"mt-4 text-sm text-muted-foreground",children:"为了让你满意,这次我可是下了血本!"})]})]}),e.jsxs(Ce,{className:"bg-gradient-to-br from-indigo-50 to-blue-50 dark:from-indigo-950/20 dark:to-blue-950/20",children:[e.jsx(De,{children:e.jsxs(Le,{className:"flex items-center gap-2",children:[e.jsx("span",{className:"text-2xl",children:"🧠"}),"思考深度"]})}),e.jsxs(Ae,{children:[e.jsxs("div",{className:"grid grid-cols-2 gap-4 text-center",children:[e.jsxs("div",{children:[e.jsx("div",{className:"text-2xl font-bold text-indigo-600 dark:text-indigo-400",children:n.brain_power.avg_reasoning_length?.toFixed(0)||0}),e.jsx("div",{className:"text-xs text-muted-foreground",children:"平均思考字数"})]}),e.jsxs("div",{children:[e.jsx("div",{className:"text-2xl font-bold text-blue-600 dark:text-blue-400",children:n.brain_power.max_reasoning_length?.toLocaleString()||0}),e.jsx("div",{className:"text-xs text-muted-foreground",children:"最长思考字数"})]})]}),n.brain_power.max_reasoning_time&&e.jsxs("p",{className:"mt-4 text-center text-xs text-muted-foreground",children:["最深沉的思考发生在 ",n.brain_power.max_reasoning_time]})]})]})]})]}),e.jsxs("section",{className:"space-y-4 break-inside-avoid",children:[e.jsxs("div",{className:"flex items-center gap-2 text-2xl font-bold text-primary",children:[e.jsx(Yo,{className:"h-8 w-8"}),e.jsx("h2",{children:"个性与表达"})]}),e.jsxs("div",{className:"grid gap-4 md:grid-cols-2",children:[e.jsxs(Ce,{className:"bg-gradient-to-br from-pink-50 to-purple-50 dark:from-pink-950/20 dark:to-purple-950/20",children:[e.jsxs(De,{children:[e.jsx(Le,{children:"表情包之王"}),e.jsx(ws,{children:"年度使用次数最多的表情包"})]}),e.jsx(Ae,{className:"flex flex-col items-center justify-center",children:n.expression_vibe.top_emoji?e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"relative mb-4 h-48 w-48 overflow-hidden rounded-lg shadow-lg transition-transform hover:scale-105",children:[e.jsx("img",{src:`/api/webui/emoji/${n.expression_vibe.top_emoji.id}/thumbnail?original=true`,alt:"Top Emoji",className:"h-full w-full object-cover"}),e.jsx(Se,{className:"absolute right-2 top-2 bg-yellow-500",children:"NO.1"})]}),e.jsxs("p",{className:"text-center font-medium text-lg",children:['"',n.expression_vibe.top_emoji.description,'"']}),e.jsxs("p",{className:"text-muted-foreground",children:["使用了 ",n.expression_vibe.top_emoji.usage_count," 次"]})]}):e.jsx("div",{className:"flex h-48 items-center justify-center text-muted-foreground",children:"暂无数据"})})]}),e.jsxs("div",{className:"space-y-4",children:[e.jsxs(Ce,{children:[e.jsxs(De,{children:[e.jsx(Le,{children:"百变麦麦"}),e.jsx(ws,{children:"最常使用的表达风格"})]}),e.jsx(Ae,{children:e.jsx("div",{className:"flex flex-wrap gap-2",children:n.expression_vibe.top_expressions.map((g,N)=>e.jsxs(Se,{variant:"outline",className:I("px-3 py-1 text-sm",N===0&&"border-primary bg-primary/10 text-primary text-base px-4 py-2"),children:[g.style," (",g.count,")"]},g.style))})})]}),e.jsxs("div",{className:"grid grid-cols-2 gap-4",children:[e.jsx(ka,{title:"图片鉴赏",value:`${n.expression_vibe.image_processed_count} 张`,description:"我看过的图比你吃过的盐还多",icon:e.jsx(Jm,{className:"h-4 w-4"})}),e.jsx(ka,{title:"成长的足迹",value:`${n.expression_vibe.rejected_expression_count} 次`,description:"被大家纠正表达的次数",icon:e.jsx(Za,{className:"h-4 w-4"})})]})]})]}),n.expression_vibe.action_types.length>0&&e.jsxs(Ce,{children:[e.jsxs(De,{children:[e.jsxs(Le,{className:"flex items-center gap-2",children:[e.jsx("span",{className:"text-2xl",children:"⚡"}),"行动派"]}),e.jsx(ws,{children:"除了聊天,我还帮大家做了这些事"})]}),e.jsx(Ae,{children:e.jsx("div",{className:"flex flex-wrap gap-3",children:n.expression_vibe.action_types.map(g=>e.jsxs("div",{className:"flex items-center gap-2 rounded-full bg-primary/10 px-4 py-2",children:[e.jsx("span",{className:"font-medium text-primary",children:g.action}),e.jsxs(Se,{variant:"secondary",children:[g.count," 次"]})]},g.action))})})]})]}),e.jsxs("section",{className:"space-y-4 break-inside-avoid",children:[e.jsxs("div",{className:"flex items-center gap-2 text-2xl font-bold text-primary",children:[e.jsx(g_,{className:"h-8 w-8"}),e.jsx("h2",{children:"趣味成就"})]}),e.jsxs("div",{className:"grid gap-4 md:grid-cols-3",children:[e.jsxs(Ce,{className:"col-span-1 md:col-span-2",children:[e.jsxs(De,{children:[e.jsx(Le,{children:'新学到的"黑话"'}),e.jsxs(ws,{children:["今年我学会了 ",n.achievements.new_jargon_count," 个新词"]})]}),e.jsx(Ae,{children:e.jsx("div",{className:"flex flex-wrap gap-3",children:n.achievements.sample_jargons.map(g=>e.jsxs("div",{className:"group relative rounded-lg border bg-card p-3 shadow-sm transition-all hover:shadow-md",children:[e.jsx("div",{className:"font-bold text-primary",children:g.content}),e.jsx("div",{className:"text-xs text-muted-foreground mt-1 line-clamp-2 max-w-[200px]",children:g.meaning||"暂无解释"})]},g.content))})})]}),e.jsx(Ce,{className:"flex flex-col justify-center items-center bg-primary text-primary-foreground",children:e.jsxs(Ae,{className:"flex flex-col items-center justify-center p-6 text-center",children:[e.jsx(Ma,{className:"h-12 w-12 mb-4 opacity-80"}),e.jsx("div",{className:"text-4xl font-bold mb-2",children:n.achievements.total_messages.toLocaleString()}),e.jsx("div",{className:"text-sm opacity-80",children:"年度总消息数"}),e.jsxs("div",{className:"mt-4 text-xs opacity-60",children:["其中回复了 ",n.achievements.total_replies.toLocaleString()," 次"]})]})})]})]}),e.jsxs("footer",{className:"mt-12 text-center text-muted-foreground",children:[e.jsx("p",{children:"MaiBot 2025 Annual Report"}),e.jsx("p",{className:"text-sm",children:"Generated with ❤️ by MaiBot Team"})]})]})})}):null}function ka({title:l,value:n,description:i,icon:c}){return e.jsxs(Ce,{children:[e.jsxs(De,{className:"flex flex-row items-center justify-between space-y-0 pb-2",children:[e.jsx(Le,{className:"text-sm font-medium",children:l}),e.jsx("div",{className:"text-muted-foreground",children:c})]}),e.jsxs(Ae,{children:[e.jsx("div",{className:"text-2xl font-bold",children:n}),e.jsx("p",{className:"text-xs text-muted-foreground",children:i})]})]})}function bC(){return e.jsxs("div",{className:"container mx-auto space-y-8 p-8",children:[e.jsx(js,{className:"h-64 w-full rounded-3xl"}),e.jsx("div",{className:"grid gap-4 md:grid-cols-4",children:[...Array(4)].map((l,n)=>e.jsx(js,{className:"h-32 w-full"},n))}),e.jsx(js,{className:"h-96 w-full"})]})}var id="DropdownMenu",[yC]=Ko(id,[ij]),oa=ij(),[wC,cN]=yC(id),oN=l=>{const{__scopeDropdownMenu:n,children:i,dir:c,open:u,defaultOpen:x,onOpenChange:h,modal:f=!0}=l,p=oa(n),g=d.useRef(null),[N,v]=qo({prop:u,defaultProp:x??!1,onChange:h,caller:id});return e.jsx(wC,{scope:n,triggerId:Lm(),triggerRef:g,contentId:Lm(),open:N,onOpenChange:v,onOpenToggle:d.useCallback(()=>v(y=>!y),[v]),modal:f,children:e.jsx(cw,{...p,open:N,onOpenChange:v,dir:c,modal:f,children:i})})};oN.displayName=id;var dN="DropdownMenuTrigger",uN=d.forwardRef((l,n)=>{const{__scopeDropdownMenu:i,disabled:c=!1,...u}=l,x=cN(dN,i),h=oa(i);return e.jsx(ow,{asChild:!0,...h,children:e.jsx(Qn.button,{type:"button",id:x.triggerId,"aria-haspopup":"menu","aria-expanded":x.open,"aria-controls":x.open?x.contentId:void 0,"data-state":x.open?"open":"closed","data-disabled":c?"":void 0,disabled:c,...u,ref:Uw(n,x.triggerRef),onPointerDown:hn(l.onPointerDown,f=>{!c&&f.button===0&&f.ctrlKey===!1&&(x.onOpenToggle(),x.open||f.preventDefault())}),onKeyDown:hn(l.onKeyDown,f=>{c||(["Enter"," "].includes(f.key)&&x.onOpenToggle(),f.key==="ArrowDown"&&x.onOpenChange(!0),["Enter"," ","ArrowDown"].includes(f.key)&&f.preventDefault())})})})});uN.displayName=dN;var _C="DropdownMenuPortal",mN=l=>{const{__scopeDropdownMenu:n,...i}=l,c=oa(n);return e.jsx(ew,{...c,...i})};mN.displayName=_C;var xN="DropdownMenuContent",hN=d.forwardRef((l,n)=>{const{__scopeDropdownMenu:i,...c}=l,u=cN(xN,i),x=oa(i),h=d.useRef(!1);return e.jsx(sw,{id:u.contentId,"aria-labelledby":u.triggerId,...x,...c,ref:n,onCloseAutoFocus:hn(l.onCloseAutoFocus,f=>{h.current||u.triggerRef.current?.focus(),h.current=!1,f.preventDefault()}),onInteractOutside:hn(l.onInteractOutside,f=>{const p=f.detail.originalEvent,g=p.button===0&&p.ctrlKey===!0,N=p.button===2||g;(!u.modal||N)&&(h.current=!0)}),style:{...l.style,"--radix-dropdown-menu-content-transform-origin":"var(--radix-popper-transform-origin)","--radix-dropdown-menu-content-available-width":"var(--radix-popper-available-width)","--radix-dropdown-menu-content-available-height":"var(--radix-popper-available-height)","--radix-dropdown-menu-trigger-width":"var(--radix-popper-anchor-width)","--radix-dropdown-menu-trigger-height":"var(--radix-popper-anchor-height)"}})});hN.displayName=xN;var SC="DropdownMenuGroup",kC=d.forwardRef((l,n)=>{const{__scopeDropdownMenu:i,...c}=l,u=oa(i);return e.jsx(dw,{...u,...c,ref:n})});kC.displayName=SC;var CC="DropdownMenuLabel",fN=d.forwardRef((l,n)=>{const{__scopeDropdownMenu:i,...c}=l,u=oa(i);return e.jsx(rw,{...u,...c,ref:n})});fN.displayName=CC;var TC="DropdownMenuItem",pN=d.forwardRef((l,n)=>{const{__scopeDropdownMenu:i,...c}=l,u=oa(i);return e.jsx(tw,{...u,...c,ref:n})});pN.displayName=TC;var EC="DropdownMenuCheckboxItem",gN=d.forwardRef((l,n)=>{const{__scopeDropdownMenu:i,...c}=l,u=oa(i);return e.jsx(aw,{...u,...c,ref:n})});gN.displayName=EC;var MC="DropdownMenuRadioGroup",zC=d.forwardRef((l,n)=>{const{__scopeDropdownMenu:i,...c}=l,u=oa(i);return e.jsx(uw,{...u,...c,ref:n})});zC.displayName=MC;var AC="DropdownMenuRadioItem",jN=d.forwardRef((l,n)=>{const{__scopeDropdownMenu:i,...c}=l,u=oa(i);return e.jsx(nw,{...u,...c,ref:n})});jN.displayName=AC;var OC="DropdownMenuItemIndicator",vN=d.forwardRef((l,n)=>{const{__scopeDropdownMenu:i,...c}=l,u=oa(i);return e.jsx(lw,{...u,...c,ref:n})});vN.displayName=OC;var DC="DropdownMenuSeparator",NN=d.forwardRef((l,n)=>{const{__scopeDropdownMenu:i,...c}=l,u=oa(i);return e.jsx(iw,{...u,...c,ref:n})});NN.displayName=DC;var RC="DropdownMenuArrow",LC=d.forwardRef((l,n)=>{const{__scopeDropdownMenu:i,...c}=l,u=oa(i);return e.jsx(mw,{...u,...c,ref:n})});LC.displayName=RC;var UC="DropdownMenuSubTrigger",bN=d.forwardRef((l,n)=>{const{__scopeDropdownMenu:i,...c}=l,u=oa(i);return e.jsx(Z0,{...u,...c,ref:n})});bN.displayName=UC;var $C="DropdownMenuSubContent",yN=d.forwardRef((l,n)=>{const{__scopeDropdownMenu:i,...c}=l,u=oa(i);return e.jsx(W0,{...u,...c,ref:n,style:{...l.style,"--radix-dropdown-menu-content-transform-origin":"var(--radix-popper-transform-origin)","--radix-dropdown-menu-content-available-width":"var(--radix-popper-available-width)","--radix-dropdown-menu-content-available-height":"var(--radix-popper-available-height)","--radix-dropdown-menu-trigger-width":"var(--radix-popper-anchor-width)","--radix-dropdown-menu-trigger-height":"var(--radix-popper-anchor-height)"}})});yN.displayName=$C;var BC=oN,IC=uN,PC=mN,wN=hN,_N=fN,SN=pN,kN=gN,CN=jN,TN=vN,EN=NN,MN=bN,zN=yN;const HC=BC,FC=IC,GC=d.forwardRef(({className:l,inset:n,children:i,...c},u)=>e.jsxs(MN,{ref:u,className:I("flex cursor-default select-none items-center rounded-sm px-2 py-1.5 text-sm outline-none focus:bg-accent data-[state=open]:bg-accent",n&&"pl-8",l),...c,children:[i,e.jsx(Zt,{className:"ml-auto h-4 w-4"})]}));GC.displayName=MN.displayName;const VC=d.forwardRef(({className:l,...n},i)=>e.jsx(zN,{ref:i,className:I("z-50 min-w-[8rem] overflow-hidden rounded-md border bg-popover p-1 text-popover-foreground shadow-lg data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2",l),...n}));VC.displayName=zN.displayName;const AN=d.forwardRef(({className:l,sideOffset:n=4,...i},c)=>e.jsx(PC,{children:e.jsx(wN,{ref:c,sideOffset:n,className:I("z-50 min-w-[8rem] overflow-hidden rounded-md border bg-popover p-1 text-popover-foreground shadow-md data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2",l),...i})}));AN.displayName=wN.displayName;const ON=d.forwardRef(({className:l,inset:n,...i},c)=>e.jsx(SN,{ref:c,className:I("relative flex cursor-default select-none items-center rounded-sm px-2 py-1.5 text-sm outline-none transition-colors focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50",n&&"pl-8",l),...i}));ON.displayName=SN.displayName;const qC=d.forwardRef(({className:l,children:n,checked:i,...c},u)=>e.jsxs(kN,{ref:u,className:I("relative flex cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none transition-colors focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50",l),checked:i,...c,children:[e.jsx("span",{className:"absolute left-2 flex h-3.5 w-3.5 items-center justify-center",children:e.jsx(TN,{children:e.jsx(Ct,{className:"h-4 w-4"})})}),n]}));qC.displayName=kN.displayName;const KC=d.forwardRef(({className:l,children:n,...i},c)=>e.jsxs(CN,{ref:c,className:I("relative flex cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none transition-colors focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50",l),...i,children:[e.jsx("span",{className:"absolute left-2 flex h-3.5 w-3.5 items-center justify-center",children:e.jsx(TN,{children:e.jsx(Lo,{className:"h-2 w-2 fill-current"})})}),n]}));KC.displayName=CN.displayName;const QC=d.forwardRef(({className:l,inset:n,...i},c)=>e.jsx(_N,{ref:c,className:I("px-2 py-1.5 text-sm font-semibold",n&&"pl-8",l),...i}));QC.displayName=_N.displayName;const YC=d.forwardRef(({className:l,...n},i)=>e.jsx(EN,{ref:i,className:I("-mx-1 my-1 h-px bg-muted",l),...n}));YC.displayName=EN.displayName;const DN=({className:l,...n})=>e.jsx("nav",{role:"navigation","aria-label":"pagination",className:I("mx-auto flex w-full justify-center",l),...n});DN.displayName="Pagination";const RN=d.forwardRef(({className:l,...n},i)=>e.jsx("ul",{ref:i,className:I("flex flex-row items-center gap-1",l),...n}));RN.displayName="PaginationContent";const Do=d.forwardRef(({className:l,...n},i)=>e.jsx("li",{ref:i,className:I("",l),...n}));Do.displayName="PaginationItem";const cd=({className:l,isActive:n,size:i="icon",...c})=>e.jsx("a",{"aria-current":n?"page":void 0,className:I(qr({variant:n?"outline":"ghost",size:i}),l),...c});cd.displayName="PaginationLink";const LN=({className:l,...n})=>e.jsxs(cd,{"aria-label":"Go to previous page",size:"default",className:I("gap-1 pl-2.5",l),...n,children:[e.jsx(Aa,{className:"h-4 w-4"}),e.jsx("span",{children:"上一页"})]});LN.displayName="PaginationPrevious";const UN=({className:l,...n})=>e.jsxs(cd,{"aria-label":"Go to next page",size:"default",className:I("gap-1 pr-2.5",l),...n,children:[e.jsx("span",{children:"下一页"}),e.jsx(Zt,{className:"h-4 w-4"})]});UN.displayName="PaginationNext";const Rm=[{value:"created_at",label:"最新发布",icon:na},{value:"downloads",label:"下载最多",icon:sa},{value:"likes",label:"最受欢迎",icon:Vr}];function JC(){const l=ca(),[n,i]=d.useState([]),[c,u]=d.useState(!0),[x,h]=d.useState(""),[f,p]=d.useState("downloads"),[g,N]=d.useState(1),[v,y]=d.useState(1),[w,b]=d.useState(0),[R,D]=d.useState(new Set),[S,P]=d.useState(new Set),M=Sv(),T=d.useCallback(async()=>{u(!0);try{const U=await dS({status:"approved",page:g,page_size:12,search:x||void 0,sort_by:f,sort_order:"desc"});i(U.packs),y(U.total_pages),b(U.total);const ue=new Set;for(const xe of U.packs)await _v(xe.id,M)&&ue.add(xe.id);D(ue)}catch(U){console.error("加载 Pack 列表失败:",U),Qt({title:"加载 Pack 列表失败",variant:"destructive"})}finally{u(!1)}},[g,x,f,M]);d.useEffect(()=>{T()},[T]);const A=U=>{U.preventDefault(),N(1),T()},F=async U=>{if(!S.has(U)){P(ue=>new Set(ue).add(U));try{const ue=await wv(U,M);D(xe=>{const he=new Set(xe);return ue.liked?he.add(U):he.delete(U),he}),i(xe=>xe.map(he=>he.id===U?{...he,likes:ue.likes}:he))}catch(ue){console.error("点赞失败:",ue),Qt({title:"点赞失败",variant:"destructive"})}finally{P(ue=>{const xe=new Set(ue);return xe.delete(U),xe})}}},L=U=>{l({to:"/config/pack-market/$packId",params:{packId:U}})},J=Rm.find(U=>U.value===f)||Rm[0];return e.jsxs("div",{className:"h-[calc(100vh-4rem)] flex flex-col p-4 sm:p-6",children:[e.jsx("div",{className:"mb-4 sm:mb-6",children:e.jsxs("div",{className:"flex flex-col sm:flex-row sm:items-center justify-between gap-4",children:[e.jsxs("div",{children:[e.jsxs("h1",{className:"text-2xl sm:text-3xl font-bold flex items-center gap-2",children:[e.jsx(ra,{className:"h-8 w-8",strokeWidth:2}),"配置模板市场"]}),e.jsx("p",{className:"text-muted-foreground mt-1 text-sm sm:text-base",children:"浏览和应用社区分享的模型配置模板,快速配置你的 MaiBot"})]}),e.jsxs(_,{variant:"outline",onClick:T,disabled:c,className:"gap-2",children:[e.jsx(dt,{className:`h-4 w-4 ${c?"animate-spin":""}`}),"刷新"]})]})}),e.jsx(Ye,{className:"flex-1",children:e.jsxs("div",{className:"space-y-4",children:[e.jsxs("div",{className:"flex gap-4 flex-wrap",children:[e.jsx("form",{onSubmit:A,className:"flex-1 min-w-[200px] max-w-md",children:e.jsxs("div",{className:"relative",children:[e.jsx(Tt,{className:"absolute left-3 top-1/2 -translate-y-1/2 w-4 h-4 text-muted-foreground"}),e.jsx(le,{placeholder:"搜索模板名称、描述...",value:x,onChange:U=>h(U.target.value),className:"pl-10"})]})}),e.jsxs(HC,{children:[e.jsx(FC,{asChild:!0,children:e.jsxs(_,{variant:"outline",className:"min-w-[140px] gap-2",children:[e.jsx(j_,{className:"w-4 h-4"}),J.label,e.jsx(za,{className:"w-4 h-4 ml-auto"})]})}),e.jsx(AN,{align:"end",children:Rm.map(U=>e.jsxs(ON,{onClick:()=>{p(U.value),N(1)},children:[e.jsx(U.icon,{className:"w-4 h-4 mr-2"}),U.label]},U.value))})]})]}),e.jsxs("div",{className:"text-sm text-muted-foreground",children:["共找到 ",e.jsx("span",{className:"font-medium text-foreground",children:w})," 个模板"]}),c?e.jsx("div",{className:"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4",children:Array.from({length:6}).map((U,ue)=>e.jsxs(Ce,{children:[e.jsxs(De,{children:[e.jsx(js,{className:"h-6 w-3/4"}),e.jsx(js,{className:"h-4 w-full mt-2"})]}),e.jsx(Ae,{children:e.jsx(js,{className:"h-20 w-full"})}),e.jsx(Zo,{children:e.jsx(js,{className:"h-9 w-full"})})]},ue))}):n.length===0?e.jsx(Ce,{className:"py-12",children:e.jsxs(Ae,{className:"text-center text-muted-foreground",children:[e.jsx(ra,{className:"w-12 h-12 mx-auto mb-4 opacity-50"}),e.jsx("p",{className:"text-lg font-medium",children:"暂无模板"}),e.jsx("p",{className:"mt-1",children:"还没有人分享配置模板,快来分享第一个吧!"})]})}):e.jsx("div",{className:"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4",children:n.map(U=>e.jsx(XC,{pack:U,liked:R.has(U.id),liking:S.has(U.id),onLike:()=>F(U.id),onView:()=>L(U.id)},U.id))}),v>1&&e.jsx(DN,{children:e.jsxs(RN,{children:[e.jsx(Do,{children:e.jsx(LN,{onClick:()=>N(U=>Math.max(1,U-1)),className:g===1?"pointer-events-none opacity-50":"cursor-pointer"})}),Array.from({length:v},(U,ue)=>ue+1).filter(U=>U===1||U===v||Math.abs(U-g)<=1).map((U,ue,xe)=>{const he=ue>0&&U-xe[ue-1]>1;return e.jsxs(Do,{children:[he&&e.jsx("span",{className:"px-2",children:"..."}),e.jsx(cd,{onClick:()=>N(U),isActive:U===g,className:"cursor-pointer",children:U})]},U)}),e.jsx(Do,{children:e.jsx(UN,{onClick:()=>N(U=>Math.min(v,U+1)),className:g===v?"pointer-events-none opacity-50":"cursor-pointer"})})]})})]})})]})}function XC({pack:l,liked:n,liking:i,onLike:c,onView:u}){const x=h=>new Date(h).toLocaleDateString("zh-CN",{year:"numeric",month:"short",day:"numeric"});return e.jsxs(Ce,{className:"flex flex-col hover:shadow-md transition-shadow",children:[e.jsxs(De,{className:"pb-3",children:[e.jsxs("div",{className:"flex items-start justify-between",children:[e.jsx(Le,{className:"text-lg line-clamp-1",children:l.name}),e.jsxs(Se,{variant:"secondary",className:"text-xs",children:["v",l.version]})]}),e.jsx(ws,{className:"line-clamp-2 min-h-[40px]",children:l.description})]}),e.jsxs(Ae,{className:"flex-1 space-y-3",children:[e.jsxs("div",{className:"flex items-center justify-between text-sm text-muted-foreground",children:[e.jsxs("span",{className:"flex items-center gap-1",children:[e.jsx(fn,{className:"w-3.5 h-3.5"}),l.author]}),e.jsxs("span",{className:"flex items-center gap-1",children:[e.jsx(na,{className:"w-3.5 h-3.5"}),x(l.created_at)]})]}),e.jsxs("div",{className:"flex gap-4 text-sm",children:[e.jsxs("span",{className:"flex items-center gap-1 text-muted-foreground",title:"提供商数量",children:[e.jsx(Dl,{className:"w-3.5 h-3.5"}),l.provider_count]}),e.jsxs("span",{className:"flex items-center gap-1 text-muted-foreground",title:"模型数量",children:[e.jsx(Gn,{className:"w-3.5 h-3.5"}),l.model_count]}),e.jsxs("span",{className:"flex items-center gap-1 text-muted-foreground",title:"任务配置数",children:[e.jsx(Vn,{className:"w-3.5 h-3.5"}),l.task_count]})]}),l.tags&&l.tags.length>0&&e.jsxs("div",{className:"flex flex-wrap gap-1",children:[l.tags.slice(0,3).map(h=>e.jsxs(Se,{variant:"outline",className:"text-xs",children:[e.jsx(Xo,{className:"w-2.5 h-2.5 mr-1"}),h]},h)),l.tags.length>3&&e.jsxs(Se,{variant:"outline",className:"text-xs",children:["+",l.tags.length-3]})]})]}),e.jsx(Zo,{className:"pt-3 border-t",children:e.jsxs("div",{className:"flex items-center justify-between w-full",children:[e.jsxs("div",{className:"flex items-center gap-3 text-sm text-muted-foreground",children:[e.jsxs("span",{className:"flex items-center gap-1",children:[e.jsx(sa,{className:"w-4 h-4"}),l.downloads]}),e.jsxs("button",{onClick:h=>{h.stopPropagation(),c()},disabled:i,className:`flex items-center gap-1 transition-colors ${n?"text-red-500":"hover:text-red-500"} ${i?"opacity-50":""}`,children:[e.jsx(Vr,{className:`w-4 h-4 ${n?"fill-current":""}`}),l.likes]})]}),e.jsx(_,{size:"sm",onClick:u,children:"查看详情"})]})})]})}var sl="Accordion",ZC=["Home","End","ArrowDown","ArrowUp","ArrowLeft","ArrowRight"],[xx,WC,e3]=$w(sl),[od]=Ko(sl,[e3,cj]),hx=cj(),$N=As.forwardRef((l,n)=>{const{type:i,...c}=l,u=c,x=c;return e.jsx(xx.Provider,{scope:l.__scopeAccordion,children:i==="multiple"?e.jsx(l3,{...x,ref:n}):e.jsx(a3,{...u,ref:n})})});$N.displayName=sl;var[BN,s3]=od(sl),[IN,t3]=od(sl,{collapsible:!1}),a3=As.forwardRef((l,n)=>{const{value:i,defaultValue:c,onValueChange:u=()=>{},collapsible:x=!1,...h}=l,[f,p]=qo({prop:i,defaultProp:c??"",onChange:u,caller:sl});return e.jsx(BN,{scope:l.__scopeAccordion,value:As.useMemo(()=>f?[f]:[],[f]),onItemOpen:p,onItemClose:As.useCallback(()=>x&&p(""),[x,p]),children:e.jsx(IN,{scope:l.__scopeAccordion,collapsible:x,children:e.jsx(PN,{...h,ref:n})})})}),l3=As.forwardRef((l,n)=>{const{value:i,defaultValue:c,onValueChange:u=()=>{},...x}=l,[h,f]=qo({prop:i,defaultProp:c??[],onChange:u,caller:sl}),p=As.useCallback(N=>f((v=[])=>[...v,N]),[f]),g=As.useCallback(N=>f((v=[])=>v.filter(y=>y!==N)),[f]);return e.jsx(BN,{scope:l.__scopeAccordion,value:h,onItemOpen:p,onItemClose:g,children:e.jsx(IN,{scope:l.__scopeAccordion,collapsible:!0,children:e.jsx(PN,{...x,ref:n})})})}),[n3,dd]=od(sl),PN=As.forwardRef((l,n)=>{const{__scopeAccordion:i,disabled:c,dir:u,orientation:x="vertical",...h}=l,f=As.useRef(null),p=Qo(f,n),g=WC(i),v=_j(u)==="ltr",y=hn(l.onKeyDown,w=>{if(!ZC.includes(w.key))return;const b=w.target,R=g().filter(J=>!J.ref.current?.disabled),D=R.findIndex(J=>J.ref.current===b),S=R.length;if(D===-1)return;w.preventDefault();let P=D;const M=0,T=S-1,A=()=>{P=D+1,P>T&&(P=M)},F=()=>{P=D-1,P{const{__scopeAccordion:i,value:c,...u}=l,x=dd(Vo,i),h=s3(Vo,i),f=hx(i),p=Lm(),g=c&&h.value.includes(c)||!1,N=x.disabled||l.disabled;return e.jsx(r3,{scope:i,open:g,disabled:N,triggerId:p,children:e.jsx(tj,{"data-orientation":x.orientation,"data-state":QN(g),...f,...u,ref:n,disabled:N,open:g,onOpenChange:v=>{v?h.onItemOpen(c):h.onItemClose(c)}})})});HN.displayName=Vo;var FN="AccordionHeader",GN=As.forwardRef((l,n)=>{const{__scopeAccordion:i,...c}=l,u=dd(sl,i),x=fx(FN,i);return e.jsx(Qn.h3,{"data-orientation":u.orientation,"data-state":QN(x.open),"data-disabled":x.disabled?"":void 0,...c,ref:n})});GN.displayName=FN;var Fm="AccordionTrigger",VN=As.forwardRef((l,n)=>{const{__scopeAccordion:i,...c}=l,u=dd(sl,i),x=fx(Fm,i),h=t3(Fm,i),f=hx(i);return e.jsx(xx.ItemSlot,{scope:i,children:e.jsx(xw,{"aria-disabled":x.open&&!h.collapsible||void 0,"data-orientation":u.orientation,id:x.triggerId,...f,...c,ref:n})})});VN.displayName=Fm;var qN="AccordionContent",KN=As.forwardRef((l,n)=>{const{__scopeAccordion:i,...c}=l,u=dd(sl,i),x=fx(qN,i),h=hx(i);return e.jsx(hw,{role:"region","aria-labelledby":x.triggerId,"data-orientation":u.orientation,...h,...c,ref:n,style:{"--radix-accordion-content-height":"var(--radix-collapsible-content-height)","--radix-accordion-content-width":"var(--radix-collapsible-content-width)",...l.style}})});KN.displayName=qN;function QN(l){return l?"open":"closed"}var i3=$N,c3=HN,o3=GN,YN=VN,JN=KN;const d3=i3,XN=d.forwardRef(({className:l,...n},i)=>e.jsx(c3,{ref:i,className:I("border-b",l),...n}));XN.displayName="AccordionItem";const ZN=d.forwardRef(({className:l,children:n,...i},c)=>e.jsx(o3,{className:"flex",children:e.jsxs(YN,{ref:c,className:I("flex flex-1 items-center justify-between py-4 font-medium transition-all hover:underline [&[data-state=open]>svg]:rotate-180",l),...i,children:[n,e.jsx(za,{className:"h-4 w-4 shrink-0 transition-transform duration-200"})]})}));ZN.displayName=YN.displayName;const WN=d.forwardRef(({className:l,children:n,...i},c)=>e.jsx(JN,{ref:c,className:"overflow-hidden text-sm transition-all data-[state=closed]:animate-accordion-up data-[state=open]:animate-accordion-down",...i,children:e.jsx("div",{className:I("pb-4 pt-0",l),children:n})}));WN.displayName=JN.displayName;const u3={utils:"通用工具",utils_small:"轻量工具",tool_use:"工具调用",replyer:"回复生成",planner:"规划推理",vlm:"视觉模型",voice:"语音处理",embedding:"向量嵌入",lpmm_entity_extract:"实体提取",lpmm_rdf_build:"RDF构建",lpmm_qa:"问答模型"};function m3(){const{packId:l}=lb.useParams(),n=ca(),[i,c]=d.useState(null),[u,x]=d.useState(!0),[h,f]=d.useState(!1),[p,g]=d.useState(!1),[N,v]=d.useState(!1),[y,w]=d.useState(1),[b,R]=d.useState(null),[D,S]=d.useState(!1),[P,M]=d.useState(!1),[T,A]=d.useState({apply_providers:!0,apply_models:!0,apply_task_config:!0,task_mode:"append",selected_providers:void 0,selected_models:void 0,selected_tasks:void 0}),[F,L]=d.useState({}),[J,U]=d.useState({}),ue=Sv(),xe=d.useCallback(async()=>{if(l){x(!0);try{const z=await uS(l);c(z);const V=await _v(l,ue);f(V)}catch(z){console.error("加载 Pack 失败:",z),Qt({title:"加载模板失败",variant:"destructive"})}finally{x(!1)}}},[l,ue]);d.useEffect(()=>{xe()},[xe]);const he=async()=>{if(!(!l||p)){g(!0);try{const z=await wv(l,ue);f(z.liked),i&&c({...i,likes:z.likes})}catch(z){console.error("点赞失败:",z),Qt({title:"点赞失败",variant:"destructive"})}finally{g(!1)}}},ne=async()=>{if(i){v(!0),w(1),S(!0);try{const z=await hS(i);R(z);const V={};for(const oe of z.existing_providers)V[oe.pack_provider.name]=oe.local_providers[0].name;L(V);const B={};for(const oe of z.new_providers)B[oe.name]="";U(B)}catch(z){console.error("检测冲突失败:",z),Qt({title:"检测配置冲突失败",variant:"destructive"}),v(!1)}finally{S(!1)}}},ve=async()=>{if(i){if(T.apply_providers&&b){for(const z of b.new_providers)if(!J[z.name]){Qt({title:`请填写提供商 "${z.name}" 的 API Key`,variant:"destructive"});return}}M(!0);try{await fS(i,T,F,J),await xS(i.id,ue),c({...i,downloads:i.downloads+1}),Qt({title:"配置模板应用成功!"}),v(!1)}catch(z){console.error("应用 Pack 失败:",z),Qt({title:z instanceof Error?z.message:"应用配置失败",variant:"destructive"})}finally{M(!1)}}},je=z=>new Date(z).toLocaleDateString("zh-CN",{year:"numeric",month:"long",day:"numeric"});return u?e.jsx(h3,{}):i?e.jsx("div",{className:"h-[calc(100vh-4rem)] flex flex-col p-4 sm:p-6",children:e.jsx(Ye,{className:"flex-1",children:e.jsxs("div",{className:"space-y-4 sm:space-y-6",children:[e.jsxs(_,{variant:"ghost",size:"sm",onClick:()=>n({to:"/config/pack-market"}),className:"gap-2",children:[e.jsx(Ta,{className:"w-4 h-4"}),"返回市场"]}),e.jsxs("div",{className:"flex flex-col md:flex-row gap-6",children:[e.jsxs("div",{className:"flex-1 space-y-4",children:[e.jsxs("div",{className:"flex items-start gap-3",children:[e.jsx(ra,{className:"w-10 h-10 text-primary mt-1"}),e.jsxs("div",{children:[e.jsxs("h1",{className:"text-2xl font-bold flex items-center gap-2",children:[i.name,e.jsxs(Se,{variant:"secondary",children:["v",i.version]})]}),e.jsx("p",{className:"text-muted-foreground mt-1",children:i.description})]})]}),e.jsxs("div",{className:"flex flex-wrap gap-4 text-sm text-muted-foreground",children:[e.jsxs("span",{className:"flex items-center gap-1",children:[e.jsx(fn,{className:"w-4 h-4"}),i.author]}),e.jsxs("span",{className:"flex items-center gap-1",children:[e.jsx(na,{className:"w-4 h-4"}),je(i.created_at)]}),e.jsxs("span",{className:"flex items-center gap-1",children:[e.jsx(sa,{className:"w-4 h-4"}),i.downloads," 次下载"]}),e.jsxs("span",{className:"flex items-center gap-1",children:[e.jsx(Vr,{className:`w-4 h-4 ${h?"fill-red-500 text-red-500":""}`}),i.likes," 赞"]})]}),i.tags&&i.tags.length>0&&e.jsx("div",{className:"flex flex-wrap gap-2",children:i.tags.map(z=>e.jsxs(Se,{variant:"outline",children:[e.jsx(Xo,{className:"w-3 h-3 mr-1"}),z]},z))})]}),e.jsxs("div",{className:"flex flex-col gap-2 min-w-[160px]",children:[e.jsxs(_,{size:"lg",onClick:ne,children:[e.jsx(sa,{className:"w-4 h-4 mr-2"}),"应用模板"]}),e.jsxs(_,{variant:"outline",onClick:he,disabled:p,className:h?"text-red-500 border-red-200":"",children:[e.jsx(Vr,{className:`w-4 h-4 mr-2 ${h?"fill-current":""}`}),h?"已点赞":"点赞"]})]})]}),e.jsx(Yt,{}),e.jsxs("div",{className:"grid grid-cols-3 gap-4",children:[e.jsx(Ce,{children:e.jsxs(Ae,{className:"flex items-center gap-3 py-4",children:[e.jsx(Dl,{className:"w-8 h-8 text-blue-500"}),e.jsxs("div",{children:[e.jsx("p",{className:"text-2xl font-bold",children:i.providers.length}),e.jsx("p",{className:"text-sm text-muted-foreground",children:"API 提供商"})]})]})}),e.jsx(Ce,{children:e.jsxs(Ae,{className:"flex items-center gap-3 py-4",children:[e.jsx(Gn,{className:"w-8 h-8 text-green-500"}),e.jsxs("div",{children:[e.jsx("p",{className:"text-2xl font-bold",children:i.models.length}),e.jsx("p",{className:"text-sm text-muted-foreground",children:"模型配置"})]})]})}),e.jsx(Ce,{children:e.jsxs(Ae,{className:"flex items-center gap-3 py-4",children:[e.jsx(Vn,{className:"w-8 h-8 text-purple-500"}),e.jsxs("div",{children:[e.jsx("p",{className:"text-2xl font-bold",children:Object.keys(i.task_config).length}),e.jsx("p",{className:"text-sm text-muted-foreground",children:"任务配置"})]})]})})]}),e.jsxs(ta,{defaultValue:"providers",className:"space-y-4",children:[e.jsxs(Xt,{children:[e.jsxs(Je,{value:"providers",children:[e.jsx(Dl,{className:"w-4 h-4 mr-2"}),"提供商 (",i.providers.length,")"]}),e.jsxs(Je,{value:"models",children:[e.jsx(Gn,{className:"w-4 h-4 mr-2"}),"模型 (",i.models.length,")"]}),e.jsxs(Je,{value:"tasks",children:[e.jsx(Vn,{className:"w-4 h-4 mr-2"}),"任务配置 (",Object.keys(i.task_config).length,")"]})]}),e.jsx(ys,{value:"providers",children:e.jsxs(Ce,{children:[e.jsxs(De,{children:[e.jsx(Le,{children:"API 提供商"}),e.jsx(ws,{children:"模板中包含的 API 提供商配置(不含 API Key)"})]}),e.jsx(Ae,{children:e.jsxs(Rl,{children:[e.jsx(Ll,{children:e.jsxs(ut,{children:[e.jsx(Ze,{children:"名称"}),e.jsx(Ze,{children:"Base URL"}),e.jsx(Ze,{children:"类型"})]})}),e.jsx(Ul,{children:i.providers.map(z=>e.jsxs(ut,{children:[e.jsx(qe,{className:"font-medium",children:z.name}),e.jsx(qe,{className:"text-muted-foreground font-mono text-sm",children:z.base_url}),e.jsx(qe,{children:e.jsx(Se,{variant:"outline",children:z.client_type})})]},z.name))})]})})]})}),e.jsx(ys,{value:"models",children:e.jsxs(Ce,{children:[e.jsxs(De,{children:[e.jsx(Le,{children:"模型配置"}),e.jsx(ws,{children:"模板中包含的模型配置"})]}),e.jsx(Ae,{children:e.jsxs(Rl,{children:[e.jsx(Ll,{children:e.jsxs(ut,{children:[e.jsx(Ze,{children:"模型名称"}),e.jsx(Ze,{children:"标识符"}),e.jsx(Ze,{children:"提供商"}),e.jsx(Ze,{className:"text-right",children:"价格 (入/出)"})]})}),e.jsx(Ul,{children:i.models.map(z=>e.jsxs(ut,{children:[e.jsx(qe,{className:"font-medium",children:z.name}),e.jsx(qe,{className:"text-muted-foreground font-mono text-sm",children:z.model_identifier}),e.jsx(qe,{children:z.api_provider}),e.jsxs(qe,{className:"text-right text-muted-foreground",children:["¥",z.price_in," / ¥",z.price_out]})]},z.name))})]})})]})}),e.jsx(ys,{value:"tasks",children:e.jsxs(Ce,{children:[e.jsxs(De,{children:[e.jsx(Le,{children:"任务配置"}),e.jsx(ws,{children:"模板中各任务类型的模型分配"})]}),e.jsx(Ae,{children:e.jsx(d3,{type:"multiple",className:"w-full",children:Object.entries(i.task_config).map(([z,V])=>e.jsxs(XN,{value:z,children:[e.jsx(ZN,{children:e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(pn,{className:"w-4 h-4"}),u3[z]||z,e.jsxs(Se,{variant:"secondary",className:"ml-2",children:[V.model_list.length," 个模型"]})]})}),e.jsx(WN,{children:e.jsxs("div",{className:"space-y-2 pl-6",children:[e.jsx("div",{className:"text-sm text-muted-foreground",children:"分配的模型:"}),e.jsx("div",{className:"flex flex-wrap gap-2",children:V.model_list.map(B=>e.jsx(Se,{variant:"outline",children:B},B))}),V.temperature!==void 0&&e.jsxs("div",{className:"text-sm",children:["Temperature: ",e.jsx("span",{className:"font-mono",children:V.temperature})]}),V.max_tokens!==void 0&&e.jsxs("div",{className:"text-sm",children:["Max Tokens: ",e.jsx("span",{className:"font-mono",children:V.max_tokens})]})]})})]},z))})})]})})]}),e.jsx(x3,{open:N,onOpenChange:v,pack:i,step:y,setStep:w,conflicts:b,detectingConflicts:D,applying:P,options:T,setOptions:A,_providerMapping:F,_setProviderMapping:L,newProviderApiKeys:J,setNewProviderApiKeys:U,onApply:ve})]})})}):e.jsxs("div",{className:"text-center py-12",children:[e.jsx(ra,{className:"w-16 h-16 mx-auto mb-4 opacity-50"}),e.jsx("h2",{className:"text-xl font-semibold",children:"模板不存在"}),e.jsx("p",{className:"text-muted-foreground mt-2",children:"该配置模板可能已被删除或尚未通过审核"}),e.jsxs(_,{className:"mt-4",onClick:()=>n({to:"/config/pack-market"}),children:[e.jsx(Ta,{className:"w-4 h-4 mr-2"}),"返回市场"]})]})}function x3({open:l,onOpenChange:n,pack:i,step:c,setStep:u,conflicts:x,detectingConflicts:h,applying:f,options:p,setOptions:g,_providerMapping:N,_setProviderMapping:v,newProviderApiKeys:y,setNewProviderApiKeys:w,onApply:b}){return e.jsx(Is,{open:l,onOpenChange:n,children:e.jsxs(Os,{className:"max-w-2xl max-h-[80vh] overflow-y-auto",children:[e.jsxs(Ds,{children:[e.jsxs(Rs,{className:"flex items-center gap-2",children:[e.jsx(ra,{className:"w-5 h-5"}),"应用配置模板"]}),e.jsxs(Ks,{children:["步骤 ",c," / ",3,":",c===1&&"选择要应用的内容",c===2&&"配置提供商映射",c===3&&"确认并应用"]})]}),h?e.jsxs("div",{className:"py-8 text-center",children:[e.jsx(Bs,{className:"w-8 h-8 mx-auto animate-spin text-primary"}),e.jsx("p",{className:"mt-4 text-muted-foreground",children:"正在检测配置冲突..."})]}):e.jsxs(e.Fragment,{children:[c===1&&e.jsxs("div",{className:"space-y-4",children:[e.jsxs("div",{className:"space-y-3",children:[e.jsxs("div",{className:"flex items-center space-x-2",children:[e.jsx(qs,{id:"apply_providers",checked:p.apply_providers,onCheckedChange:D=>g({...p,apply_providers:D})}),e.jsxs(E,{htmlFor:"apply_providers",className:"flex items-center gap-2",children:[e.jsx(Dl,{className:"w-4 h-4"}),"应用提供商配置 (",i.providers.length," 个)"]})]}),e.jsxs("div",{className:"flex items-center space-x-2",children:[e.jsx(qs,{id:"apply_models",checked:p.apply_models,onCheckedChange:D=>g({...p,apply_models:D})}),e.jsxs(E,{htmlFor:"apply_models",className:"flex items-center gap-2",children:[e.jsx(Gn,{className:"w-4 h-4"}),"应用模型配置 (",i.models.length," 个)"]})]}),e.jsxs("div",{className:"flex items-center space-x-2",children:[e.jsx(qs,{id:"apply_task_config",checked:p.apply_task_config,onCheckedChange:D=>g({...p,apply_task_config:D})}),e.jsxs(E,{htmlFor:"apply_task_config",className:"flex items-center gap-2",children:[e.jsx(Vn,{className:"w-4 h-4"}),"应用任务配置 (",Object.keys(i.task_config).length," 个)"]})]})]}),p.apply_task_config&&e.jsxs("div",{className:"pl-6 space-y-2 border-l-2 border-muted",children:[e.jsx(E,{className:"text-sm font-medium",children:"任务配置应用模式"}),e.jsxs(mx,{value:p.task_mode,onValueChange:D=>g({...p,task_mode:D}),children:[e.jsxs("div",{className:"flex items-center space-x-2",children:[e.jsx(Go,{value:"append",id:"mode_append"}),e.jsx(E,{htmlFor:"mode_append",className:"font-normal",children:"追加模式 - 将模板中的模型添加到现有配置"})]}),e.jsxs("div",{className:"flex items-center space-x-2",children:[e.jsx(Go,{value:"replace",id:"mode_replace"}),e.jsx(E,{htmlFor:"mode_replace",className:"font-normal",children:"替换模式 - 用模板配置完全替换现有配置"})]})]})]})]}),c===2&&x&&e.jsxs("div",{className:"space-y-4",children:[p.apply_providers&&x.existing_providers.length>0&&e.jsxs("div",{className:"space-y-3",children:[e.jsxs(at,{children:[e.jsx(Ht,{className:"h-4 w-4"}),e.jsx(Hn,{children:"发现已有的提供商"}),e.jsx(lt,{children:"以下提供商的 URL 与您本地配置中的提供商匹配,将自动使用本地提供商:"})]}),e.jsx("div",{className:"space-y-2",children:x.existing_providers.map(({pack_provider:D,local_providers:S})=>e.jsxs("div",{className:"flex items-center gap-2 p-3 bg-muted rounded-lg",children:[e.jsx(Ct,{className:"w-4 h-4 text-green-500 flex-shrink-0"}),e.jsx("span",{className:"font-medium flex-shrink-0",children:D.name}),e.jsx(Zt,{className:"w-4 h-4 text-muted-foreground flex-shrink-0"}),S.length===1?e.jsxs(e.Fragment,{children:[e.jsx("span",{className:"text-muted-foreground",children:S[0].name}),e.jsx(Se,{variant:"outline",className:"ml-auto",children:"URL 匹配"})]}):e.jsxs(e.Fragment,{children:[e.jsxs(Ie,{value:N[D.name]||S[0].name,onValueChange:P=>v({...N,[D.name]:P}),children:[e.jsx($e,{className:"w-[200px]",children:e.jsx(Pe,{})}),e.jsx(Be,{children:S.map(P=>e.jsx(X,{value:P.name,children:P.name},P.name))})]}),e.jsxs(Se,{variant:"outline",className:"ml-auto",children:[S.length," 个匹配"]})]})]},D.name))})]}),p.apply_providers&&x.new_providers.length>0&&e.jsxs("div",{className:"space-y-3",children:[e.jsxs(at,{variant:"destructive",children:[e.jsx(Jt,{className:"h-4 w-4"}),e.jsx(Hn,{children:"需要配置 API Key"}),e.jsx(lt,{children:"以下提供商在您的本地配置中不存在,需要填写 API Key:"})]}),e.jsx("div",{className:"space-y-4",children:x.new_providers.map(D=>e.jsxs("div",{className:"space-y-2",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(Km,{className:"w-4 h-4 text-amber-500"}),e.jsx("span",{className:"font-medium",children:D.name}),e.jsxs("span",{className:"text-xs text-muted-foreground",children:["(",D.base_url,")"]})]}),e.jsx(le,{type:"password",placeholder:`输入 ${D.name} 的 API Key`,value:y[D.name]||"",onChange:S=>w({...y,[D.name]:S.target.value})})]},D.name))})]}),(!p.apply_providers||x.existing_providers.length===0&&x.new_providers.length===0)&&e.jsxs(at,{children:[e.jsx(Ct,{className:"h-4 w-4"}),e.jsx(Hn,{children:"无需配置"}),e.jsx(lt,{children:"模板中没有提供商配置,或您选择不应用提供商。"})]})]}),c===3&&e.jsxs("div",{className:"space-y-4",children:[e.jsxs(at,{children:[e.jsx(Ht,{className:"h-4 w-4"}),e.jsx(Hn,{children:"确认应用"}),e.jsx(lt,{children:"请确认以下将要应用的内容:"})]}),e.jsxs("div",{className:"space-y-2",children:[p.apply_providers&&e.jsxs("div",{className:"flex items-center gap-2 text-sm",children:[e.jsx(Ct,{className:"w-4 h-4 text-green-500"}),e.jsx(Dl,{className:"w-4 h-4"}),e.jsxs("span",{children:["应用 ",i.providers.length," 个提供商配置"]})]}),p.apply_models&&e.jsxs("div",{className:"flex items-center gap-2 text-sm",children:[e.jsx(Ct,{className:"w-4 h-4 text-green-500"}),e.jsx(Gn,{className:"w-4 h-4"}),e.jsxs("span",{children:["应用 ",i.models.length," 个模型配置"]})]}),p.apply_task_config&&e.jsxs("div",{className:"flex items-center gap-2 text-sm",children:[e.jsx(Ct,{className:"w-4 h-4 text-green-500"}),e.jsx(Vn,{className:"w-4 h-4"}),e.jsxs("span",{children:[p.task_mode==="append"?"追加":"替换"," ",Object.keys(i.task_config).length," 个任务配置"]})]})]}),x&&x.new_providers.length>0&&e.jsxs(at,{variant:"destructive",children:[e.jsx(Jt,{className:"h-4 w-4"}),e.jsxs(lt,{children:["将添加 ",x.new_providers.length," 个新提供商,请确保已填写正确的 API Key。"]})]})]})]}),e.jsxs(st,{className:"flex justify-between",children:[e.jsx("div",{children:c>1&&!h&&e.jsx(_,{variant:"outline",onClick:()=>u(c-1),disabled:f,children:"上一步"})}),e.jsxs("div",{className:"flex gap-2",children:[e.jsx(_,{variant:"outline",onClick:()=>n(!1),disabled:f,children:"取消"}),c<3?e.jsx(_,{onClick:()=>u(c+1),disabled:h,children:"下一步"}):e.jsxs(_,{onClick:b,disabled:f,children:[f&&e.jsx(Bs,{className:"w-4 h-4 mr-2 animate-spin"}),"应用模板"]})]})]})]})})}function h3(){return e.jsx("div",{className:"h-[calc(100vh-4rem)] flex flex-col p-4 sm:p-6",children:e.jsx(Ye,{className:"flex-1",children:e.jsxs("div",{className:"space-y-4 sm:space-y-6",children:[e.jsx(js,{className:"h-9 w-24"}),e.jsxs("div",{className:"flex flex-col md:flex-row gap-6",children:[e.jsxs("div",{className:"flex-1 space-y-4",children:[e.jsxs("div",{className:"flex items-start gap-3",children:[e.jsx(js,{className:"w-10 h-10"}),e.jsxs("div",{className:"flex-1 space-y-2",children:[e.jsx(js,{className:"h-8 w-2/3"}),e.jsx(js,{className:"h-4 w-full"})]})]}),e.jsxs("div",{className:"flex flex-wrap gap-4",children:[e.jsx(js,{className:"h-4 w-24"}),e.jsx(js,{className:"h-4 w-32"}),e.jsx(js,{className:"h-4 w-28"}),e.jsx(js,{className:"h-4 w-20"})]}),e.jsxs("div",{className:"flex flex-wrap gap-2",children:[e.jsx(js,{className:"h-6 w-20"}),e.jsx(js,{className:"h-6 w-24"}),e.jsx(js,{className:"h-6 w-16"})]})]}),e.jsxs("div",{className:"flex flex-col gap-2 min-w-[160px]",children:[e.jsx(js,{className:"h-10 w-full"}),e.jsx(js,{className:"h-10 w-full"})]})]}),e.jsx(js,{className:"h-px w-full"}),e.jsxs("div",{className:"grid grid-cols-3 gap-4",children:[e.jsx(js,{className:"h-24"}),e.jsx(js,{className:"h-24"}),e.jsx(js,{className:"h-24"})]}),e.jsxs("div",{className:"space-y-4",children:[e.jsxs("div",{className:"flex gap-2",children:[e.jsx(js,{className:"h-10 w-32"}),e.jsx(js,{className:"h-10 w-32"}),e.jsx(js,{className:"h-10 w-32"})]}),e.jsx(js,{className:"h-96 w-full"})]})]})})})}function f3(){const l=ca(),[n,i]=d.useState(!0);return d.useEffect(()=>{let c=!1;return(async()=>{try{const x=await tc();!c&&!x&&l({to:"/auth"})}catch{c||l({to:"/auth"})}finally{c||i(!1)}})(),()=>{c=!0}},[l]),{checking:n}}async function p3(){return await tc()}const g3=Kr("pointer-events-none inline-flex select-none items-center gap-1 rounded border bg-muted px-1.5 font-mono font-medium opacity-100",{variants:{size:{sm:"h-5 text-[10px]",default:"h-6 text-xs",lg:"h-7 text-sm"}},defaultVariants:{size:"default"}}),eb=d.forwardRef(({className:l,size:n,abbrTitle:i,children:c,...u},x)=>e.jsx("kbd",{className:I(g3({size:n,className:l})),ref:x,...u,children:i?e.jsx("abbr",{title:i,children:c}):c}));eb.displayName="Kbd";const j3=[{icon:Jo,title:"首页",description:"查看仪表板概览",path:"/",category:"概览"},{icon:Ca,title:"麦麦主程序配置",description:"配置麦麦的核心设置",path:"/config/bot",category:"配置"},{icon:Dl,title:"麦麦模型提供商配置",description:"配置模型提供商",path:"/config/modelProvider",category:"配置"},{icon:Fj,title:"麦麦模型配置",description:"配置模型参数",path:"/config/model",category:"配置"},{icon:Yo,title:"表情包管理",description:"管理麦麦的表情包",path:"/resource/emoji",category:"资源"},{icon:Ma,title:"表达方式管理",description:"管理麦麦的表达方式",path:"/resource/expression",category:"资源"},{icon:Gj,title:"人物信息管理",description:"管理人物信息",path:"/resource/person",category:"资源"},{icon:Gr,title:"黑话管理",description:"管理麦麦学习到的黑话和俚语",path:"/resource/jargon",category:"资源"},{icon:v_,title:"统计信息",description:"查看使用统计",path:"/statistics",category:"监控"},{icon:ra,title:"插件市场",description:"浏览和安装插件",path:"/plugins",category:"扩展"},{icon:Qm,title:"日志查看器",description:"查看系统日志",path:"/logs",category:"监控"},{icon:pn,title:"系统设置",description:"配置系统参数",path:"/settings",category:"系统"}];function v3({open:l,onOpenChange:n}){const[i,c]=d.useState(""),[u,x]=d.useState(0),h=ca(),f=j3.filter(N=>N.title.toLowerCase().includes(i.toLowerCase())||N.description.toLowerCase().includes(i.toLowerCase())||N.category.toLowerCase().includes(i.toLowerCase())),p=d.useCallback(N=>{h({to:N}),n(!1),c(""),x(0)},[h,n]),g=d.useCallback(N=>{N.key==="ArrowDown"?(N.preventDefault(),x(v=>(v+1)%f.length)):N.key==="ArrowUp"?(N.preventDefault(),x(v=>(v-1+f.length)%f.length)):N.key==="Enter"&&f[u]&&(N.preventDefault(),p(f[u].path))},[f,u,p]);return e.jsx(Is,{open:l,onOpenChange:n,children:e.jsxs(Os,{className:"max-w-2xl p-0 gap-0",children:[e.jsxs(Ds,{className:"px-4 pt-4 pb-0",children:[e.jsx(Rs,{className:"sr-only",children:"搜索"}),e.jsxs("div",{className:"relative",children:[e.jsx(Tt,{className:"absolute left-3 top-1/2 h-5 w-5 -translate-y-1/2 text-muted-foreground"}),e.jsx(le,{value:i,onChange:N=>{c(N.target.value),x(0)},onKeyDown:g,placeholder:"搜索页面...",className:"h-12 pl-11 text-base border-0 focus-visible:ring-0 shadow-none",autoFocus:!0})]})]}),e.jsx("div",{className:"border-t",children:e.jsx(Ye,{className:"h-[400px]",children:f.length>0?e.jsx("div",{className:"p-2",children:f.map((N,v)=>{const y=N.icon;return e.jsxs("button",{onClick:()=>p(N.path),onMouseEnter:()=>x(v),className:I("w-full flex items-center gap-3 px-3 py-2.5 rounded-md text-left transition-colors",v===u?"bg-accent text-accent-foreground":"hover:bg-accent/50"),children:[e.jsx(y,{className:"h-5 w-5 flex-shrink-0"}),e.jsxs("div",{className:"flex-1 min-w-0",children:[e.jsx("div",{className:"font-medium text-sm",children:N.title}),e.jsx("div",{className:"text-xs text-muted-foreground truncate",children:N.description})]}),e.jsx("div",{className:"text-xs text-muted-foreground px-2 py-1 bg-muted rounded",children:N.category})]},N.path)})}):e.jsxs("div",{className:"flex flex-col items-center justify-center py-12 text-center",children:[e.jsx(Tt,{className:"h-12 w-12 text-muted-foreground/50 mb-4"}),e.jsx("p",{className:"text-sm text-muted-foreground",children:i?"未找到匹配的页面":"输入关键词开始搜索"})]})})}),e.jsx("div",{className:"border-t px-4 py-3 flex items-center justify-between text-xs text-muted-foreground",children:e.jsxs("div",{className:"flex items-center gap-4",children:[e.jsxs("span",{className:"flex items-center gap-1",children:[e.jsx("kbd",{className:"px-1.5 py-0.5 bg-muted rounded border",children:"↑"}),e.jsx("kbd",{className:"px-1.5 py-0.5 bg-muted rounded border",children:"↓"}),"导航"]}),e.jsxs("span",{className:"flex items-center gap-1",children:[e.jsx("kbd",{className:"px-1.5 py-0.5 bg-muted rounded border",children:"Enter"}),"选择"]}),e.jsxs("span",{className:"flex items-center gap-1",children:[e.jsx("kbd",{className:"px-1.5 py-0.5 bg-muted rounded border",children:"Esc"}),"关闭"]})]})})]})})}function N3(){const l=window.location.protocol==="http:",n=window.location.hostname.toLowerCase(),i=n==="localhost"||n==="127.0.0.1"||n==="::1",c=sessionStorage.getItem("http-warning-dismissed")==="true",[u,x]=d.useState(l&&!i&&!c),[h,f]=d.useState(!1),p=()=>{f(!0),x(!1),sessionStorage.setItem("http-warning-dismissed","true")};return!u||h?null:e.jsx("div",{className:"relative bg-amber-500/10 border-b border-amber-500/20 backdrop-blur-sm",children:e.jsx("div",{className:"container mx-auto px-4 py-3",children:e.jsxs("div",{className:"flex items-center justify-between gap-4",children:[e.jsxs("div",{className:"flex items-center gap-3 flex-1",children:[e.jsx(Jt,{className:"h-5 w-5 text-amber-600 dark:text-amber-500 flex-shrink-0"}),e.jsxs("div",{className:"flex-1",children:[e.jsxs("p",{className:"text-sm font-medium text-amber-900 dark:text-amber-100",children:[e.jsx("span",{className:"font-semibold",children:"安全警告:"}),"您正在使用 ",e.jsx("strong",{children:"HTTP"})," 访问 MaiBot WebUI"]}),e.jsx("p",{className:"text-xs text-amber-800 dark:text-amber-200 mt-1",children:"如果这是公网服务器,您的数据(包括 Token、聊天记录等)可能在传输过程中被窃取。强烈建议使用 HTTPS 访问或仅在本地网络使用。"})]})]}),e.jsx(_,{variant:"ghost",size:"icon",onClick:p,className:"h-8 w-8 text-amber-700 hover:text-amber-900 dark:text-amber-400 dark:hover:text-amber-200 flex-shrink-0","aria-label":"关闭警告",children:e.jsx(Ea,{className:"h-4 w-4"})})]})})})}function b3(){const[l,n]=d.useState(0),[i,c]=d.useState(!1),u=d.useRef(null);d.useEffect(()=>{const g=N=>{const v=N.target;if(v.scrollHeight>v.clientHeight+100){u.current=v;const y=v.scrollTop,w=v.scrollHeight-v.clientHeight,b=w>0?y/w*100:0;n(b),c(y>300)}};return window.addEventListener("scroll",g,{capture:!0,passive:!0}),()=>window.removeEventListener("scroll",g,{capture:!0})},[]);const x=()=>{u.current?.scrollTo({top:0,behavior:"smooth"})},h=18,f=2*Math.PI*h,p=f-l/100*f;return e.jsx("div",{className:I("fixed bottom-24 right-8 z-50 transition-all duration-500 ease-in-out transform",i?"translate-x-0 opacity-100":"translate-x-32 opacity-0 pointer-events-none"),children:e.jsxs(_,{variant:"outline",size:"icon",className:I("relative h-12 w-12 rounded-full shadow-xl","bg-background/80 backdrop-blur-md border-border/50","hover:bg-accent hover:scale-110 hover:shadow-2xl hover:border-primary/50","transition-all duration-300","group"),onClick:x,"aria-label":"回到顶部",children:[e.jsxs("svg",{className:"absolute inset-0 h-full w-full -rotate-90 transform p-1",viewBox:"0 0 44 44",children:[e.jsx("circle",{className:"text-muted-foreground/10",strokeWidth:"3",stroke:"currentColor",fill:"transparent",r:h,cx:"22",cy:"22"}),e.jsx("circle",{className:"text-primary transition-all duration-100 ease-out",strokeWidth:"3",strokeDasharray:f,strokeDashoffset:p,strokeLinecap:"round",stroke:"currentColor",fill:"transparent",r:h,cx:"22",cy:"22"})]}),e.jsx(N_,{className:"h-5 w-5 text-primary transition-transform duration-300 group-hover:-translate-y-1 group-hover:scale-110",strokeWidth:2.5}),e.jsx("div",{className:"absolute inset-0 rounded-full bg-primary/5 opacity-0 group-hover:opacity-100 transition-opacity duration-300"})]})})}const y3=Iw,w3=Pw,_3=Hw,sb=d.forwardRef(({className:l,sideOffset:n=4,...i},c)=>e.jsx(Bw,{children:e.jsx(Sj,{ref:c,sideOffset:n,className:I("z-50 overflow-hidden rounded-md bg-primary px-3 py-1.5 text-xs text-primary-foreground animate-in fade-in-0 zoom-in-95 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 origin-[--radix-tooltip-content-transform-origin]",l),...i})}));sb.displayName=Sj.displayName;function S3({children:l}){const{checking:n}=f3(),[i,c]=d.useState(!0),[u,x]=d.useState(!1),[h,f]=d.useState(!1),{theme:p,setTheme:g}=ex(),N=y0();if(d.useEffect(()=>{const R=D=>{(D.metaKey||D.ctrlKey)&&D.key==="k"&&(D.preventDefault(),f(!0))};return window.addEventListener("keydown",R),()=>window.removeEventListener("keydown",R)},[]),n)return e.jsx("div",{className:"flex h-screen items-center justify-center bg-background",children:e.jsx("div",{className:"text-muted-foreground",children:"正在验证登录状态..."})});const v=[{title:"概览",items:[{icon:Jo,label:"首页",path:"/"}]},{title:"麦麦配置编辑",items:[{icon:Ca,label:"麦麦主程序配置",path:"/config/bot"},{icon:Dl,label:"AI模型厂商配置",path:"/config/modelProvider",tourId:"sidebar-model-provider"},{icon:Fj,label:"模型管理与分配",path:"/config/model",tourId:"sidebar-model-management"},{icon:og,label:"麦麦适配器配置",path:"/config/adapter"}]},{title:"麦麦资源管理",items:[{icon:Yo,label:"表情包管理",path:"/resource/emoji"},{icon:Ma,label:"表达方式管理",path:"/resource/expression"},{icon:Gr,label:"黑话管理",path:"/resource/jargon"},{icon:Gj,label:"人物信息管理",path:"/resource/person"},{icon:Bj,label:"知识库图谱可视化",path:"/resource/knowledge-graph"},{icon:Hr,label:"麦麦知识库管理",path:"/resource/knowledge-base"}]},{title:"扩展与监控",items:[{icon:ra,label:"插件市场",path:"/plugins"},{icon:Pj,label:"配置模板市场",path:"/config/pack-market"},{icon:og,label:"插件配置",path:"/plugin-config"},{icon:Qm,label:"日志查看器",path:"/logs"},{icon:Gm,label:"计划器&回复器监控",path:"/planner-monitor"},{icon:Ma,label:"本地聊天室",path:"/chat"}]},{title:"系统",items:[{icon:pn,label:"系统设置",path:"/settings"}]}],w=p==="system"?window.matchMedia("(prefers-color-scheme: dark)").matches?"dark":"light":p,b=async()=>{await t1()};return e.jsx(y3,{delayDuration:300,children:e.jsxs("div",{className:"flex h-screen overflow-hidden",children:[e.jsxs("aside",{className:I("fixed inset-y-0 left-0 z-50 flex flex-col border-r bg-card transition-all duration-300 lg:relative lg:z-0","w-64 lg:w-auto",i?"lg:w-64":"lg:w-16",u?"translate-x-0":"-translate-x-full lg:translate-x-0"),children:[e.jsx("div",{className:"flex h-16 items-center border-b px-4",children:e.jsxs("div",{className:I("relative flex items-center justify-center flex-1 transition-all overflow-hidden","lg:flex-1",!i&&"lg:flex-none lg:w-8"),children:[e.jsxs("div",{className:I("flex items-baseline gap-2",!i&&"lg:hidden"),children:[e.jsx("span",{className:"font-bold text-xl text-primary-gradient whitespace-nowrap",children:"MaiBot WebUI"}),e.jsx("span",{className:"text-xs text-primary/60 whitespace-nowrap",children:R1()})]}),!i&&e.jsx("span",{className:"hidden lg:block font-bold text-primary-gradient text-2xl",children:"M"})]})}),e.jsx(Ye,{className:I("flex-1 overflow-x-hidden",!i&&"lg:w-16"),children:e.jsx("nav",{className:I("p-4",!i&&"lg:p-2 lg:w-16"),children:e.jsx("ul",{className:I("space-y-6",!i&&"lg:space-y-3 lg:w-full"),children:v.map((R,D)=>e.jsxs("li",{children:[e.jsx("div",{className:I("px-3 h-[1.25rem]","mb-2",!i&&"lg:mb-1 lg:invisible"),children:e.jsx("h3",{className:"text-xs font-semibold uppercase tracking-wider text-muted-foreground/60 whitespace-nowrap",children:R.title})}),!i&&D>0&&e.jsx("div",{className:"hidden lg:block mb-2 border-t border-border"}),e.jsx("ul",{className:"space-y-1",children:R.items.map(S=>{const P=N({to:S.path}),M=S.icon,T=e.jsxs(e.Fragment,{children:[P&&e.jsx("div",{className:"absolute left-0 top-1/2 h-8 w-1 -translate-y-1/2 rounded-r-full bg-primary transition-opacity duration-300"}),e.jsxs("div",{className:I("flex items-center transition-all duration-300",i?"gap-3":"gap-3 lg:gap-0"),children:[e.jsx(M,{className:I("h-5 w-5 flex-shrink-0",P&&"text-primary"),strokeWidth:2,fill:"none"}),e.jsx("span",{className:I("text-sm font-medium whitespace-nowrap transition-all duration-300",P&&"font-semibold",i?"opacity-100 max-w-[200px]":"opacity-100 max-w-[200px] lg:opacity-0 lg:max-w-0 lg:overflow-hidden"),children:S.label})]})]});return e.jsx("li",{className:"relative",children:e.jsxs(w3,{children:[e.jsx(_3,{asChild:!0,children:e.jsx(Bn,{to:S.path,"data-tour":S.tourId,className:I("relative flex items-center rounded-lg py-2 transition-all duration-300","hover:bg-accent hover:text-accent-foreground",P?"bg-accent text-foreground":"text-muted-foreground hover:text-foreground",i?"px-3":"px-3 lg:px-0 lg:justify-center lg:w-12 lg:mx-auto"),onClick:()=>x(!1),children:T})}),!i&&e.jsx(sb,{side:"right",className:"hidden lg:block",children:e.jsx("p",{children:S.label})})]})},S.path)})})]},R.title))})})})]}),u&&e.jsx("div",{className:"fixed inset-0 z-40 bg-black/50 lg:hidden",onClick:()=>x(!1)}),e.jsxs("div",{className:"flex flex-1 flex-col overflow-hidden",children:[e.jsx(N3,{}),e.jsxs("header",{className:"flex h-16 items-center justify-between border-b bg-card/80 backdrop-blur-md px-4 sticky top-0 z-10",children:[e.jsxs("div",{className:"flex items-center gap-4",children:[e.jsx("button",{onClick:()=>x(!u),className:"rounded-lg p-2 hover:bg-accent lg:hidden",children:e.jsx(b_,{className:"h-5 w-5"})}),e.jsx("button",{onClick:()=>c(!i),className:"hidden rounded-lg p-2 hover:bg-accent lg:block",title:i?"收起侧边栏":"展开侧边栏",children:e.jsx(Aa,{className:I("h-5 w-5 transition-transform",!i&&"rotate-180")})})]}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(Bn,{to:"/annual-report",children:e.jsxs(_,{variant:"ghost",size:"sm",className:"gap-2 bg-gradient-to-r from-pink-500/10 to-purple-500/10 hover:from-pink-500/20 hover:to-purple-500/20 border border-pink-500/20",title:"查看年度总结",children:[e.jsx(y_,{className:"h-4 w-4 text-pink-500"}),e.jsx("span",{className:"hidden sm:inline bg-gradient-to-r from-pink-500 to-purple-500 bg-clip-text text-transparent font-medium",children:"2025 年度总结"})]})}),e.jsxs("button",{onClick:()=>f(!0),className:"relative hidden md:flex items-center w-64 h-9 pl-9 pr-16 bg-background/50 border rounded-md hover:bg-accent/50 transition-colors text-left",children:[e.jsx(Tt,{className:"absolute left-3 top-1/2 h-4 w-4 -translate-y-1/2 text-muted-foreground"}),e.jsx("span",{className:"text-sm text-muted-foreground",children:"搜索..."}),e.jsxs(eb,{size:"sm",className:"absolute right-2 top-1/2 -translate-y-1/2",children:[e.jsx("span",{className:"text-xs",children:"⌘"}),"K"]})]}),e.jsx(v3,{open:h,onOpenChange:f}),e.jsxs(_,{variant:"ghost",size:"sm",onClick:()=>window.open("https://docs.mai-mai.org","_blank"),className:"gap-2",title:"查看麦麦文档",children:[e.jsx(w_,{className:"h-4 w-4"}),e.jsx("span",{className:"hidden sm:inline",children:"麦麦文档"})]}),e.jsx("button",{onClick:R=>{M1(w==="dark"?"light":"dark",g,R)},className:"rounded-lg p-2 hover:bg-accent",title:w==="dark"?"切换到浅色模式":"切换到深色模式",children:w==="dark"?e.jsx(qm,{className:"h-5 w-5"}):e.jsx(Qi,{className:"h-5 w-5"})}),e.jsx("div",{className:"h-6 w-px bg-border"}),e.jsxs(_,{variant:"ghost",size:"sm",onClick:b,className:"gap-2",title:"登出系统",children:[e.jsx(__,{className:"h-4 w-4"}),e.jsx("span",{className:"hidden sm:inline",children:"登出"})]})]})]}),e.jsx("main",{className:"flex-1 overflow-hidden bg-background",children:l}),e.jsx(b3,{})]})]})})}function k3(l){const n=l.split(` `).slice(1),i=[];for(const c of n){const u=c.trim();if(!u.startsWith("at "))continue;const x=u.match(/at\s+(?:(.+?)\s+\()?(.+?):(\d+):(\d+)\)?$/);x?i.push({functionName:x[1]||"",fileName:x[2],lineNumber:x[3],columnNumber:x[4],raw:u}):i.push({functionName:"",fileName:"",lineNumber:"",columnNumber:"",raw:u})}return i}function C3({error:l,errorInfo:n}){const[i,c]=d.useState(!0),[u,x]=d.useState(!1),[h,f]=d.useState(!1),p=l.stack?k3(l.stack):[],g=async()=>{const N=` Error: ${l.name} Message: ${l.message} @@ -87,4 +87,4 @@ ${n?.componentStack||"No component stack available"} URL: ${window.location.href} User Agent: ${navigator.userAgent} Time: ${new Date().toISOString()} - `.trim();try{await navigator.clipboard.writeText(N),f(!0),setTimeout(()=>f(!1),2e3)}catch(v){console.error("Failed to copy:",v)}};return e.jsxs("div",{className:"space-y-4",children:[e.jsxs(at,{variant:"destructive",className:"border-red-500/50 bg-red-500/10",children:[e.jsx(Jt,{className:"h-4 w-4"}),e.jsxs(lt,{className:"font-mono text-sm",children:[e.jsxs("span",{className:"font-semibold",children:[l.name,":"]})," ",l.message]})]}),p.length>0&&e.jsxs(nc,{open:i,onOpenChange:c,children:[e.jsx(rc,{asChild:!0,children:e.jsxs(_,{variant:"ghost",className:"w-full justify-between p-3 h-auto",children:[e.jsxs("span",{className:"font-semibold text-sm flex items-center gap-2",children:[e.jsx(S_,{className:"h-4 w-4"}),"Stack Trace (",p.length," frames)"]}),i?e.jsx(Fr,{className:"h-4 w-4"}):e.jsx(Ma,{className:"h-4 w-4"})]})}),e.jsx(ic,{children:e.jsx(Ye,{className:"h-[280px] rounded-md border bg-muted/30",children:e.jsx("div",{className:"p-3 space-y-1",children:p.map((N,v)=>e.jsx("div",{className:"font-mono text-xs p-2 rounded hover:bg-muted/50 transition-colors",children:e.jsxs("div",{className:"flex items-start gap-2",children:[e.jsxs("span",{className:"text-muted-foreground w-6 text-right flex-shrink-0",children:[v+1,"."]}),e.jsxs("div",{className:"flex-1 min-w-0",children:[e.jsx("span",{className:"text-primary font-medium",children:N.functionName}),N.fileName&&e.jsxs("div",{className:"text-muted-foreground mt-0.5 break-all",children:[N.fileName,N.lineNumber&&e.jsxs("span",{className:"text-yellow-600 dark:text-yellow-400",children:[":",N.lineNumber,":",N.columnNumber]})]})]})]})},v))})})})]}),n?.componentStack&&e.jsxs(nc,{open:u,onOpenChange:x,children:[e.jsx(rc,{asChild:!0,children:e.jsxs(_,{variant:"ghost",className:"w-full justify-between p-3 h-auto",children:[e.jsxs("span",{className:"font-semibold text-sm flex items-center gap-2",children:[e.jsx(Jt,{className:"h-4 w-4"}),"Component Stack"]}),u?e.jsx(Fr,{className:"h-4 w-4"}):e.jsx(Ma,{className:"h-4 w-4"})]})}),e.jsx(ic,{children:e.jsx(Ye,{className:"h-[200px] rounded-md border bg-muted/30",children:e.jsx("pre",{className:"p-3 font-mono text-xs whitespace-pre-wrap text-muted-foreground",children:n.componentStack})})})]}),e.jsx(_,{variant:"outline",size:"sm",onClick:g,className:"w-full",children:h?e.jsxs(e.Fragment,{children:[e.jsx(kt,{className:"mr-2 h-4 w-4 text-green-500"}),"已复制到剪贴板"]}):e.jsxs(e.Fragment,{children:[e.jsx(Ro,{className:"mr-2 h-4 w-4"}),"复制错误信息"]})})]})}function tb({error:l,errorInfo:n}){const i=()=>{window.location.href="/"},c=()=>{window.location.reload()};return e.jsx("div",{className:"min-h-screen flex items-center justify-center bg-background p-4",children:e.jsxs(Ce,{className:"w-full max-w-2xl shadow-lg",children:[e.jsxs(De,{className:"text-center pb-2",children:[e.jsx("div",{className:"mx-auto flex h-16 w-16 items-center justify-center rounded-full bg-red-100 dark:bg-red-900/30 mb-4",children:e.jsx(Jt,{className:"h-8 w-8 text-red-600 dark:text-red-400"})}),e.jsx(Le,{className:"text-2xl font-bold",children:"页面出现了问题"}),e.jsx(ws,{className:"text-base mt-2",children:"应用程序遇到了意外错误。您可以尝试刷新页面或返回首页。"})]}),e.jsxs(Ae,{className:"space-y-4",children:[e.jsx(C3,{error:l,errorInfo:n}),e.jsxs("div",{className:"flex flex-col sm:flex-row gap-2 pt-2",children:[e.jsxs(_,{onClick:c,className:"flex-1",children:[e.jsx(dt,{className:"mr-2 h-4 w-4"}),"刷新页面"]}),e.jsxs(_,{onClick:i,variant:"outline",className:"flex-1",children:[e.jsx(Jo,{className:"mr-2 h-4 w-4"}),"返回首页"]})]}),e.jsx("p",{className:"text-xs text-center text-muted-foreground pt-2",children:"如果问题持续存在,请将错误信息复制并反馈给开发者"})]})]})})}class T3 extends d.Component{constructor(n){super(n),this.state={hasError:!1,error:null,errorInfo:null}}static getDerivedStateFromError(n){return{hasError:!0,error:n}}componentDidCatch(n,i){console.error("ErrorBoundary caught an error:",n,i),this.setState({errorInfo:i})}handleReset=()=>{this.setState({hasError:!1,error:null,errorInfo:null})};render(){return this.state.hasError&&this.state.error?this.props.fallback?this.props.fallback:e.jsx(tb,{error:this.state.error,errorInfo:this.state.errorInfo}):this.props.children}}function ab({error:l}){return e.jsx(tb,{error:l,errorInfo:null})}const mc=w0({component:()=>e.jsxs(e.Fragment,{children:[e.jsx(Bg,{}),!1]}),beforeLoad:()=>{if(window.location.pathname==="/"&&!p3())throw S0({to:"/auth"})}}),E3=Qs({getParentRoute:()=>mc,path:"/auth",component:X1}),M3=Qs({getParentRoute:()=>mc,path:"/setup",component:x2}),nt=Qs({getParentRoute:()=>mc,id:"protected",component:()=>e.jsx(S3,{children:e.jsx(Bg,{})}),errorComponent:({error:l})=>e.jsx(ab,{error:l})}),z3=Qs({getParentRoute:()=>nt,path:"/",component:k1}),A3=Qs({getParentRoute:()=>nt,path:"/config/bot",component:K2}),O3=Qs({getParentRoute:()=>nt,path:"/config/modelProvider",component:nS}),D3=Qs({getParentRoute:()=>nt,path:"/config/model",component:MS}),R3=Qs({getParentRoute:()=>nt,path:"/config/adapter",component:ZS}),L3=Qs({getParentRoute:()=>nt,path:"/resource/emoji",component:b4}),U3=Qs({getParentRoute:()=>nt,path:"/resource/expression",component:S4}),$3=Qs({getParentRoute:()=>nt,path:"/resource/person",component:Y4}),B3=Qs({getParentRoute:()=>nt,path:"/resource/jargon",component:B4}),I3=Qs({getParentRoute:()=>nt,path:"/resource/knowledge-graph",component:lk}),P3=Qs({getParentRoute:()=>nt,path:"/resource/knowledge-base",component:nk}),H3=Qs({getParentRoute:()=>nt,path:"/logs",component:ik}),F3=Qs({getParentRoute:()=>nt,path:"/planner-monitor",component:pk}),G3=Qs({getParentRoute:()=>nt,path:"/chat",component:sC}),V3=Qs({getParentRoute:()=>nt,path:"/plugins",component:Lk}),q3=Qs({getParentRoute:()=>nt,path:"/plugin-detail",component:qk}),K3=Qs({getParentRoute:()=>nt,path:"/model-presets",component:$k}),Q3=Qs({getParentRoute:()=>nt,path:"/plugin-config",component:Pk}),Y3=Qs({getParentRoute:()=>nt,path:"/plugin-mirrors",component:Fk}),J3=Qs({getParentRoute:()=>nt,path:"/settings",component:G1}),X3=Qs({getParentRoute:()=>nt,path:"/config/pack-market",component:JC}),lb=Qs({getParentRoute:()=>nt,path:"/config/pack-market/$packId",component:m3}),Z3=Qs({getParentRoute:()=>nt,path:"/survey/webui-feedback",component:gC}),W3=Qs({getParentRoute:()=>nt,path:"/survey/maibot-feedback",component:jC}),e5=Qs({getParentRoute:()=>nt,path:"/annual-report",component:NC}),s5=Qs({getParentRoute:()=>mc,path:"*",component:hv}),t5=mc.addChildren([E3,M3,nt.addChildren([z3,A3,O3,D3,R3,L3,U3,B3,$3,I3,P3,V3,q3,K3,Q3,Y3,H3,F3,G3,J3,X3,lb,Z3,W3,e5]),s5]),a5=_0({routeTree:t5,defaultNotFoundComponent:hv,defaultErrorComponent:({error:l})=>e.jsx(ab,{error:l})});function l5({children:l,defaultTheme:n="system",storageKey:i="ui-theme",...c}){const[u,x]=d.useState(()=>localStorage.getItem(i)||n);d.useEffect(()=>{const f=window.document.documentElement;if(f.classList.remove("light","dark"),u==="system"){const p=window.matchMedia("(prefers-color-scheme: dark)").matches?"dark":"light";f.classList.add(p);return}f.classList.add(u)},[u]),d.useEffect(()=>{const f=localStorage.getItem("accent-color");if(f){const p=document.documentElement,N={blue:{hsl:"221.2 83.2% 53.3%",darkHsl:"217.2 91.2% 59.8%",gradient:null},purple:{hsl:"271 91% 65%",darkHsl:"270 95% 75%",gradient:null},green:{hsl:"142 71% 45%",darkHsl:"142 76% 36%",gradient:null},orange:{hsl:"25 95% 53%",darkHsl:"20 90% 48%",gradient:null},pink:{hsl:"330 81% 60%",darkHsl:"330 85% 70%",gradient:null},red:{hsl:"0 84% 60%",darkHsl:"0 90% 70%",gradient:null},"gradient-sunset":{hsl:"15 95% 60%",darkHsl:"15 95% 65%",gradient:"linear-gradient(135deg, hsl(25 95% 53%) 0%, hsl(330 81% 60%) 100%)"},"gradient-ocean":{hsl:"200 90% 55%",darkHsl:"200 90% 60%",gradient:"linear-gradient(135deg, hsl(221.2 83.2% 53.3%) 0%, hsl(189 94% 43%) 100%)"},"gradient-forest":{hsl:"150 70% 45%",darkHsl:"150 75% 40%",gradient:"linear-gradient(135deg, hsl(142 71% 45%) 0%, hsl(158 64% 52%) 100%)"},"gradient-aurora":{hsl:"310 85% 65%",darkHsl:"310 90% 70%",gradient:"linear-gradient(135deg, hsl(271 91% 65%) 0%, hsl(330 81% 60%) 100%)"},"gradient-fire":{hsl:"15 95% 55%",darkHsl:"15 95% 60%",gradient:"linear-gradient(135deg, hsl(0 84% 60%) 0%, hsl(25 95% 53%) 100%)"},"gradient-twilight":{hsl:"250 90% 60%",darkHsl:"250 95% 65%",gradient:"linear-gradient(135deg, hsl(239 84% 67%) 0%, hsl(271 91% 65%) 100%)"}}[f];N&&(p.style.setProperty("--primary",N.hsl),N.gradient?(p.style.setProperty("--primary-gradient",N.gradient),p.classList.add("has-gradient")):(p.style.removeProperty("--primary-gradient"),p.classList.remove("has-gradient")))}},[]);const h={theme:u,setTheme:f=>{localStorage.setItem(i,f),x(f)}};return e.jsx(ov.Provider,{...c,value:h,children:l})}function n5({children:l,defaultEnabled:n=!0,defaultWavesEnabled:i=!0,storageKey:c="enable-animations",wavesStorageKey:u="enable-waves-background"}){const[x,h]=d.useState(()=>{const N=localStorage.getItem(c);return N!==null?N==="true":n}),[f,p]=d.useState(()=>{const N=localStorage.getItem(u);return N!==null?N==="true":i});d.useEffect(()=>{const N=document.documentElement;x?N.classList.remove("no-animations"):N.classList.add("no-animations"),localStorage.setItem(c,String(x))},[x,c]),d.useEffect(()=>{localStorage.setItem(u,String(f))},[f,u]);const g={enableAnimations:x,setEnableAnimations:h,enableWavesBackground:f,setEnableWavesBackground:p};return e.jsx(dv.Provider,{value:g,children:l})}const r5=Fw,nb=d.forwardRef(({className:l,...n},i)=>e.jsx(kj,{ref:i,className:I("fixed bottom-0 right-0 z-[100] flex max-h-screen w-full flex-col-reverse p-4 sm:max-w-[420px] gap-2",l),...n}));nb.displayName=kj.displayName;const i5=Kr("group pointer-events-auto relative flex w-full items-center justify-between space-x-2 overflow-hidden rounded-md border p-4 pr-6 shadow-lg transition-all data-[swipe=cancel]:translate-x-0 data-[swipe=end]:translate-x-[var(--radix-toast-swipe-end-x)] data-[swipe=move]:translate-x-[var(--radix-toast-swipe-move-x)] data-[swipe=move]:transition-none data-[state=open]:animate-slide-in-from-right data-[state=open]:animate-fade-in data-[state=closed]:animate-slide-out-to-right data-[state=closed]:animate-fade-out data-[swipe=end]:animate-slide-out-to-right",{variants:{variant:{default:"border bg-primary/5 text-foreground backdrop-blur-sm",destructive:"destructive group border-destructive bg-destructive/10 text-destructive-foreground backdrop-blur-sm"}},defaultVariants:{variant:"default"}}),rb=d.forwardRef(({className:l,variant:n,...i},c)=>e.jsx(Cj,{ref:c,className:I(i5({variant:n}),l),...i}));rb.displayName=Cj.displayName;const c5=d.forwardRef(({className:l,...n},i)=>e.jsx(Tj,{ref:i,className:I("inline-flex h-8 shrink-0 items-center justify-center rounded-md border bg-transparent px-3 text-sm font-medium transition-colors hover:bg-secondary focus:outline-none focus:ring-1 focus:ring-ring disabled:pointer-events-none disabled:opacity-50 group-[.destructive]:border-muted/40 group-[.destructive]:hover:border-destructive/30 group-[.destructive]:hover:bg-destructive group-[.destructive]:hover:text-destructive-foreground group-[.destructive]:focus:ring-destructive",l),...n}));c5.displayName=Tj.displayName;const ib=d.forwardRef(({className:l,...n},i)=>e.jsx(Ej,{ref:i,className:I("absolute right-1 top-1 rounded-md p-1 text-foreground/50 opacity-0 transition-opacity hover:text-foreground focus:opacity-100 focus:outline-none focus:ring-1 group-hover:opacity-100 group-[.destructive]:text-red-300 group-[.destructive]:hover:text-red-50 group-[.destructive]:focus:ring-red-400 group-[.destructive]:focus:ring-offset-red-600",l),"toast-close":"",...n,children:e.jsx(Ta,{className:"h-4 w-4"})}));ib.displayName=Ej.displayName;const cb=d.forwardRef(({className:l,...n},i)=>e.jsx(Mj,{ref:i,className:I("text-sm font-semibold [&+div]:text-xs",l),...n}));cb.displayName=Mj.displayName;const ob=d.forwardRef(({className:l,...n},i)=>e.jsx(zj,{ref:i,className:I("text-sm opacity-90",l),...n}));ob.displayName=zj.displayName;function o5(){const{toasts:l}=Zs();return e.jsxs(r5,{children:[l.map(function({id:n,title:i,description:c,action:u,...x}){return e.jsxs(rb,{...x,children:[e.jsxs("div",{className:"grid gap-1",children:[i&&e.jsx(cb,{children:i}),c&&e.jsx(ob,{children:c})]}),u,e.jsx(ib,{})]},n)}),e.jsx(nb,{})]})}s1.createRoot(document.getElementById("root")).render(e.jsx(d.StrictMode,{children:e.jsx(T3,{children:e.jsx(l5,{defaultTheme:"system",children:e.jsx(n5,{children:e.jsxs(W2,{children:[e.jsx(k0,{router:a5}),e.jsx(tS,{}),e.jsx(o5,{})]})})})})})); + `.trim();try{await navigator.clipboard.writeText(N),f(!0),setTimeout(()=>f(!1),2e3)}catch(v){console.error("Failed to copy:",v)}};return e.jsxs("div",{className:"space-y-4",children:[e.jsxs(at,{variant:"destructive",className:"border-red-500/50 bg-red-500/10",children:[e.jsx(Jt,{className:"h-4 w-4"}),e.jsxs(lt,{className:"font-mono text-sm",children:[e.jsxs("span",{className:"font-semibold",children:[l.name,":"]})," ",l.message]})]}),p.length>0&&e.jsxs(nc,{open:i,onOpenChange:c,children:[e.jsx(rc,{asChild:!0,children:e.jsxs(_,{variant:"ghost",className:"w-full justify-between p-3 h-auto",children:[e.jsxs("span",{className:"font-semibold text-sm flex items-center gap-2",children:[e.jsx(S_,{className:"h-4 w-4"}),"Stack Trace (",p.length," frames)"]}),i?e.jsx(Fr,{className:"h-4 w-4"}):e.jsx(za,{className:"h-4 w-4"})]})}),e.jsx(ic,{children:e.jsx(Ye,{className:"h-[280px] rounded-md border bg-muted/30",children:e.jsx("div",{className:"p-3 space-y-1",children:p.map((N,v)=>e.jsx("div",{className:"font-mono text-xs p-2 rounded hover:bg-muted/50 transition-colors",children:e.jsxs("div",{className:"flex items-start gap-2",children:[e.jsxs("span",{className:"text-muted-foreground w-6 text-right flex-shrink-0",children:[v+1,"."]}),e.jsxs("div",{className:"flex-1 min-w-0",children:[e.jsx("span",{className:"text-primary font-medium",children:N.functionName}),N.fileName&&e.jsxs("div",{className:"text-muted-foreground mt-0.5 break-all",children:[N.fileName,N.lineNumber&&e.jsxs("span",{className:"text-yellow-600 dark:text-yellow-400",children:[":",N.lineNumber,":",N.columnNumber]})]})]})]})},v))})})})]}),n?.componentStack&&e.jsxs(nc,{open:u,onOpenChange:x,children:[e.jsx(rc,{asChild:!0,children:e.jsxs(_,{variant:"ghost",className:"w-full justify-between p-3 h-auto",children:[e.jsxs("span",{className:"font-semibold text-sm flex items-center gap-2",children:[e.jsx(Jt,{className:"h-4 w-4"}),"Component Stack"]}),u?e.jsx(Fr,{className:"h-4 w-4"}):e.jsx(za,{className:"h-4 w-4"})]})}),e.jsx(ic,{children:e.jsx(Ye,{className:"h-[200px] rounded-md border bg-muted/30",children:e.jsx("pre",{className:"p-3 font-mono text-xs whitespace-pre-wrap text-muted-foreground",children:n.componentStack})})})]}),e.jsx(_,{variant:"outline",size:"sm",onClick:g,className:"w-full",children:h?e.jsxs(e.Fragment,{children:[e.jsx(Ct,{className:"mr-2 h-4 w-4 text-green-500"}),"已复制到剪贴板"]}):e.jsxs(e.Fragment,{children:[e.jsx(Ro,{className:"mr-2 h-4 w-4"}),"复制错误信息"]})})]})}function tb({error:l,errorInfo:n}){const i=()=>{window.location.href="/"},c=()=>{window.location.reload()};return e.jsx("div",{className:"min-h-screen flex items-center justify-center bg-background p-4",children:e.jsxs(Ce,{className:"w-full max-w-2xl shadow-lg",children:[e.jsxs(De,{className:"text-center pb-2",children:[e.jsx("div",{className:"mx-auto flex h-16 w-16 items-center justify-center rounded-full bg-red-100 dark:bg-red-900/30 mb-4",children:e.jsx(Jt,{className:"h-8 w-8 text-red-600 dark:text-red-400"})}),e.jsx(Le,{className:"text-2xl font-bold",children:"页面出现了问题"}),e.jsx(ws,{className:"text-base mt-2",children:"应用程序遇到了意外错误。您可以尝试刷新页面或返回首页。"})]}),e.jsxs(Ae,{className:"space-y-4",children:[e.jsx(C3,{error:l,errorInfo:n}),e.jsxs("div",{className:"flex flex-col sm:flex-row gap-2 pt-2",children:[e.jsxs(_,{onClick:c,className:"flex-1",children:[e.jsx(dt,{className:"mr-2 h-4 w-4"}),"刷新页面"]}),e.jsxs(_,{onClick:i,variant:"outline",className:"flex-1",children:[e.jsx(Jo,{className:"mr-2 h-4 w-4"}),"返回首页"]})]}),e.jsx("p",{className:"text-xs text-center text-muted-foreground pt-2",children:"如果问题持续存在,请将错误信息复制并反馈给开发者"})]})]})})}class T3 extends d.Component{constructor(n){super(n),this.state={hasError:!1,error:null,errorInfo:null}}static getDerivedStateFromError(n){return{hasError:!0,error:n}}componentDidCatch(n,i){console.error("ErrorBoundary caught an error:",n,i),this.setState({errorInfo:i})}handleReset=()=>{this.setState({hasError:!1,error:null,errorInfo:null})};render(){return this.state.hasError&&this.state.error?this.props.fallback?this.props.fallback:e.jsx(tb,{error:this.state.error,errorInfo:this.state.errorInfo}):this.props.children}}function ab({error:l}){return e.jsx(tb,{error:l,errorInfo:null})}const mc=w0({component:()=>e.jsxs(e.Fragment,{children:[e.jsx(Bg,{}),!1]}),beforeLoad:()=>{if(window.location.pathname==="/"&&!p3())throw S0({to:"/auth"})}}),E3=Qs({getParentRoute:()=>mc,path:"/auth",component:X1}),M3=Qs({getParentRoute:()=>mc,path:"/setup",component:x2}),nt=Qs({getParentRoute:()=>mc,id:"protected",component:()=>e.jsx(S3,{children:e.jsx(Bg,{})}),errorComponent:({error:l})=>e.jsx(ab,{error:l})}),z3=Qs({getParentRoute:()=>nt,path:"/",component:k1}),A3=Qs({getParentRoute:()=>nt,path:"/config/bot",component:K2}),O3=Qs({getParentRoute:()=>nt,path:"/config/modelProvider",component:nS}),D3=Qs({getParentRoute:()=>nt,path:"/config/model",component:MS}),R3=Qs({getParentRoute:()=>nt,path:"/config/adapter",component:ZS}),L3=Qs({getParentRoute:()=>nt,path:"/resource/emoji",component:b4}),U3=Qs({getParentRoute:()=>nt,path:"/resource/expression",component:S4}),$3=Qs({getParentRoute:()=>nt,path:"/resource/person",component:Y4}),B3=Qs({getParentRoute:()=>nt,path:"/resource/jargon",component:B4}),I3=Qs({getParentRoute:()=>nt,path:"/resource/knowledge-graph",component:lk}),P3=Qs({getParentRoute:()=>nt,path:"/resource/knowledge-base",component:nk}),H3=Qs({getParentRoute:()=>nt,path:"/logs",component:ik}),F3=Qs({getParentRoute:()=>nt,path:"/planner-monitor",component:pk}),G3=Qs({getParentRoute:()=>nt,path:"/chat",component:sC}),V3=Qs({getParentRoute:()=>nt,path:"/plugins",component:Lk}),q3=Qs({getParentRoute:()=>nt,path:"/plugin-detail",component:qk}),K3=Qs({getParentRoute:()=>nt,path:"/model-presets",component:$k}),Q3=Qs({getParentRoute:()=>nt,path:"/plugin-config",component:Pk}),Y3=Qs({getParentRoute:()=>nt,path:"/plugin-mirrors",component:Fk}),J3=Qs({getParentRoute:()=>nt,path:"/settings",component:G1}),X3=Qs({getParentRoute:()=>nt,path:"/config/pack-market",component:JC}),lb=Qs({getParentRoute:()=>nt,path:"/config/pack-market/$packId",component:m3}),Z3=Qs({getParentRoute:()=>nt,path:"/survey/webui-feedback",component:gC}),W3=Qs({getParentRoute:()=>nt,path:"/survey/maibot-feedback",component:jC}),e5=Qs({getParentRoute:()=>nt,path:"/annual-report",component:NC}),s5=Qs({getParentRoute:()=>mc,path:"*",component:hv}),t5=mc.addChildren([E3,M3,nt.addChildren([z3,A3,O3,D3,R3,L3,U3,B3,$3,I3,P3,V3,q3,K3,Q3,Y3,H3,F3,G3,J3,X3,lb,Z3,W3,e5]),s5]),a5=_0({routeTree:t5,defaultNotFoundComponent:hv,defaultErrorComponent:({error:l})=>e.jsx(ab,{error:l})});function l5({children:l,defaultTheme:n="system",storageKey:i="ui-theme",...c}){const[u,x]=d.useState(()=>localStorage.getItem(i)||n);d.useEffect(()=>{const f=window.document.documentElement;if(f.classList.remove("light","dark"),u==="system"){const p=window.matchMedia("(prefers-color-scheme: dark)").matches?"dark":"light";f.classList.add(p);return}f.classList.add(u)},[u]),d.useEffect(()=>{const f=localStorage.getItem("accent-color");if(f){const p=document.documentElement,N={blue:{hsl:"221.2 83.2% 53.3%",darkHsl:"217.2 91.2% 59.8%",gradient:null},purple:{hsl:"271 91% 65%",darkHsl:"270 95% 75%",gradient:null},green:{hsl:"142 71% 45%",darkHsl:"142 76% 36%",gradient:null},orange:{hsl:"25 95% 53%",darkHsl:"20 90% 48%",gradient:null},pink:{hsl:"330 81% 60%",darkHsl:"330 85% 70%",gradient:null},red:{hsl:"0 84% 60%",darkHsl:"0 90% 70%",gradient:null},"gradient-sunset":{hsl:"15 95% 60%",darkHsl:"15 95% 65%",gradient:"linear-gradient(135deg, hsl(25 95% 53%) 0%, hsl(330 81% 60%) 100%)"},"gradient-ocean":{hsl:"200 90% 55%",darkHsl:"200 90% 60%",gradient:"linear-gradient(135deg, hsl(221.2 83.2% 53.3%) 0%, hsl(189 94% 43%) 100%)"},"gradient-forest":{hsl:"150 70% 45%",darkHsl:"150 75% 40%",gradient:"linear-gradient(135deg, hsl(142 71% 45%) 0%, hsl(158 64% 52%) 100%)"},"gradient-aurora":{hsl:"310 85% 65%",darkHsl:"310 90% 70%",gradient:"linear-gradient(135deg, hsl(271 91% 65%) 0%, hsl(330 81% 60%) 100%)"},"gradient-fire":{hsl:"15 95% 55%",darkHsl:"15 95% 60%",gradient:"linear-gradient(135deg, hsl(0 84% 60%) 0%, hsl(25 95% 53%) 100%)"},"gradient-twilight":{hsl:"250 90% 60%",darkHsl:"250 95% 65%",gradient:"linear-gradient(135deg, hsl(239 84% 67%) 0%, hsl(271 91% 65%) 100%)"}}[f];N&&(p.style.setProperty("--primary",N.hsl),N.gradient?(p.style.setProperty("--primary-gradient",N.gradient),p.classList.add("has-gradient")):(p.style.removeProperty("--primary-gradient"),p.classList.remove("has-gradient")))}},[]);const h={theme:u,setTheme:f=>{localStorage.setItem(i,f),x(f)}};return e.jsx(ov.Provider,{...c,value:h,children:l})}function n5({children:l,defaultEnabled:n=!0,defaultWavesEnabled:i=!0,storageKey:c="enable-animations",wavesStorageKey:u="enable-waves-background"}){const[x,h]=d.useState(()=>{const N=localStorage.getItem(c);return N!==null?N==="true":n}),[f,p]=d.useState(()=>{const N=localStorage.getItem(u);return N!==null?N==="true":i});d.useEffect(()=>{const N=document.documentElement;x?N.classList.remove("no-animations"):N.classList.add("no-animations"),localStorage.setItem(c,String(x))},[x,c]),d.useEffect(()=>{localStorage.setItem(u,String(f))},[f,u]);const g={enableAnimations:x,setEnableAnimations:h,enableWavesBackground:f,setEnableWavesBackground:p};return e.jsx(dv.Provider,{value:g,children:l})}const r5=Fw,nb=d.forwardRef(({className:l,...n},i)=>e.jsx(kj,{ref:i,className:I("fixed bottom-0 right-0 z-[100] flex max-h-screen w-full flex-col-reverse p-4 sm:max-w-[420px] gap-2",l),...n}));nb.displayName=kj.displayName;const i5=Kr("group pointer-events-auto relative flex w-full items-center justify-between space-x-2 overflow-hidden rounded-md border p-4 pr-6 shadow-lg transition-all data-[swipe=cancel]:translate-x-0 data-[swipe=end]:translate-x-[var(--radix-toast-swipe-end-x)] data-[swipe=move]:translate-x-[var(--radix-toast-swipe-move-x)] data-[swipe=move]:transition-none data-[state=open]:animate-slide-in-from-right data-[state=open]:animate-fade-in data-[state=closed]:animate-slide-out-to-right data-[state=closed]:animate-fade-out data-[swipe=end]:animate-slide-out-to-right",{variants:{variant:{default:"border bg-primary/5 text-foreground backdrop-blur-sm",destructive:"destructive group border-destructive bg-destructive/10 text-destructive-foreground backdrop-blur-sm"}},defaultVariants:{variant:"default"}}),rb=d.forwardRef(({className:l,variant:n,...i},c)=>e.jsx(Cj,{ref:c,className:I(i5({variant:n}),l),...i}));rb.displayName=Cj.displayName;const c5=d.forwardRef(({className:l,...n},i)=>e.jsx(Tj,{ref:i,className:I("inline-flex h-8 shrink-0 items-center justify-center rounded-md border bg-transparent px-3 text-sm font-medium transition-colors hover:bg-secondary focus:outline-none focus:ring-1 focus:ring-ring disabled:pointer-events-none disabled:opacity-50 group-[.destructive]:border-muted/40 group-[.destructive]:hover:border-destructive/30 group-[.destructive]:hover:bg-destructive group-[.destructive]:hover:text-destructive-foreground group-[.destructive]:focus:ring-destructive",l),...n}));c5.displayName=Tj.displayName;const ib=d.forwardRef(({className:l,...n},i)=>e.jsx(Ej,{ref:i,className:I("absolute right-1 top-1 rounded-md p-1 text-foreground/50 opacity-0 transition-opacity hover:text-foreground focus:opacity-100 focus:outline-none focus:ring-1 group-hover:opacity-100 group-[.destructive]:text-red-300 group-[.destructive]:hover:text-red-50 group-[.destructive]:focus:ring-red-400 group-[.destructive]:focus:ring-offset-red-600",l),"toast-close":"",...n,children:e.jsx(Ea,{className:"h-4 w-4"})}));ib.displayName=Ej.displayName;const cb=d.forwardRef(({className:l,...n},i)=>e.jsx(Mj,{ref:i,className:I("text-sm font-semibold [&+div]:text-xs",l),...n}));cb.displayName=Mj.displayName;const ob=d.forwardRef(({className:l,...n},i)=>e.jsx(zj,{ref:i,className:I("text-sm opacity-90",l),...n}));ob.displayName=zj.displayName;function o5(){const{toasts:l}=Zs();return e.jsxs(r5,{children:[l.map(function({id:n,title:i,description:c,action:u,...x}){return e.jsxs(rb,{...x,children:[e.jsxs("div",{className:"grid gap-1",children:[i&&e.jsx(cb,{children:i}),c&&e.jsx(ob,{children:c})]}),u,e.jsx(ib,{})]},n)}),e.jsx(nb,{})]})}s1.createRoot(document.getElementById("root")).render(e.jsx(d.StrictMode,{children:e.jsx(T3,{children:e.jsx(l5,{defaultTheme:"system",children:e.jsx(n5,{children:e.jsxs(W2,{children:[e.jsx(k0,{router:a5}),e.jsx(tS,{}),e.jsx(o5,{})]})})})})})); diff --git a/webui/dist/index.html b/webui/dist/index.html index 104a089f..828e6183 100644 --- a/webui/dist/index.html +++ b/webui/dist/index.html @@ -11,7 +11,7 @@ MaiBot Dashboard - +