xiaozhi-client 2.2.0 → 2.3.0-beta.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (31) hide show
  1. package/README.md +1 -1
  2. package/dist/backend/WebServer.js +10 -32
  3. package/dist/backend/WebServer.js.map +1 -1
  4. package/dist/backend/WebServerLauncher.js +10 -32
  5. package/dist/backend/WebServerLauncher.js.map +1 -1
  6. package/dist/backend/package.json +52 -8
  7. package/dist/frontend/assets/form-utils-n2_wJnKb.js +41 -0
  8. package/dist/frontend/assets/form-utils-n2_wJnKb.js.map +1 -0
  9. package/dist/frontend/assets/index-C3xvW3AQ.js +81 -0
  10. package/dist/frontend/assets/index-C3xvW3AQ.js.map +1 -0
  11. package/dist/frontend/assets/index-CLIN00a1.css +1 -0
  12. package/dist/frontend/assets/radix-ui-B9D1KdKb.js +2 -0
  13. package/dist/frontend/assets/radix-ui-B9D1KdKb.js.map +1 -0
  14. package/dist/frontend/assets/react-vendor-CmWLnLSk.js +67 -0
  15. package/dist/frontend/assets/react-vendor-CmWLnLSk.js.map +1 -0
  16. package/dist/frontend/assets/rolldown-runtime-Dw2cE7zH.js +1 -0
  17. package/dist/frontend/assets/utils-UasCLNM3.js +2 -0
  18. package/dist/frontend/assets/utils-UasCLNM3.js.map +1 -0
  19. package/dist/frontend/index.html +7 -6
  20. package/package.json +25 -11
  21. package/dist/frontend/assets/form-utils-Bskf0D3l.js +0 -41
  22. package/dist/frontend/assets/form-utils-Bskf0D3l.js.map +0 -1
  23. package/dist/frontend/assets/index-BAV6nu4X.js +0 -81
  24. package/dist/frontend/assets/index-BAV6nu4X.js.map +0 -1
  25. package/dist/frontend/assets/index-HDlbxheg.css +0 -1
  26. package/dist/frontend/assets/radix-ui-BQCqNqg0.js +0 -2
  27. package/dist/frontend/assets/radix-ui-BQCqNqg0.js.map +0 -1
  28. package/dist/frontend/assets/react-vendor-BPQojLhf.js +0 -67
  29. package/dist/frontend/assets/react-vendor-BPQojLhf.js.map +0 -1
  30. package/dist/frontend/assets/utils-BWIWSmq9.js +0 -2
  31. package/dist/frontend/assets/utils-BWIWSmq9.js.map +0 -1
@@ -0,0 +1,81 @@
1
+ import{r as e,t}from"./rolldown-runtime-Dw2cE7zH.js";import{$ as n,A as r,At as i,B as a,C as o,Ct as s,D as c,Dt as l,E as u,Et as d,F as f,Ft as p,G as m,Gt as h,H as g,I as _,It as v,J as y,Jt as b,K as x,Kt as ee,L as S,Lt as C,M as w,Mt as te,N as ne,Nt as re,O as ie,Ot as ae,P as oe,Pt as se,Q as T,R as ce,Rt as le,S as ue,St as de,T as fe,Tt as pe,U as me,Ut as he,V as ge,Vt as E,W as _e,Wt as ve,X as ye,Y as be,Z as xe,_ as Se,_t as Ce,a as we,at as Te,b as Ee,bt as De,c as Oe,ct as ke,d as Ae,dt as je,et as Me,f as Ne,ft as Pe,g as Fe,gt as Ie,h as Le,ht as Re,i as ze,it as Be,j as Ve,jt as He,k as Ue,kt as We,l as Ge,lt as Ke,m as qe,mt as Je,n as Ye,nt as Xe,o as Ze,ot as Qe,p as $e,pt as et,q as tt,qt as nt,r as rt,rt as it,s as at,st as ot,t as st,tt as ct,u as lt,ut,v as dt,vt as ft,w as pt,wt as mt,x as ht,xt as gt,y as _t,yt as vt,z as yt,zt as bt}from"./react-vendor-CmWLnLSk.js";import{i as xt,n as St,r as Ct,t as wt}from"./utils-UasCLNM3.js";import{a as Tt,c as Et,d as Dt,i as Ot,l as kt,n as At,o as jt,r as Mt,s as Nt,t as D,u as Pt}from"./form-utils-n2_wJnKb.js";(function(){let e=document.createElement(`link`).relList;if(e&&e.supports&&e.supports(`modulepreload`))return;for(let e of document.querySelectorAll(`link[rel="modulepreload"]`))n(e);new MutationObserver(e=>{for(let t of e)if(t.type===`childList`)for(let e of t.addedNodes)e.tagName===`LINK`&&e.rel===`modulepreload`&&n(e)}).observe(document,{childList:!0,subtree:!0});function t(e){let t={};return e.integrity&&(t.integrity=e.integrity),e.referrerPolicy&&(t.referrerPolicy=e.referrerPolicy),e.crossOrigin===`use-credentials`?t.credentials=`include`:e.crossOrigin===`anonymous`?t.credentials=`omit`:t.credentials=`same-origin`,t}function n(e){if(e.ep)return;e.ep=!0;let n=t(e);fetch(e.href,n)}})();var O=e(b(),1),Ft=e(nt(),1),k=new class{baseUrl;constructor(e){if(e)this.baseUrl=e;else{let e=window.location.protocol,t=window.location.hostname,n=window.location.port;this.baseUrl=`${e}//${t}${n?`:${n}`:``}`}}async request(e,t={}){let n=`${this.baseUrl}${e}`,r={headers:{"Content-Type":`application/json`,...t.headers}},i=await fetch(n,{...r,...t});if(!i.ok){let e=`HTTP ${i.status}: ${i.statusText}`;try{e=(await i.json()).error?.message||e}catch{}throw Error(e)}return i.json()}async getConfig(){let e=await this.request(`/api/config`);if(!e.success||!e.data)throw Error(`获取配置失败`);return e.data}async updateConfig(e){let t=await this.request(`/api/config`,{method:`PUT`,body:JSON.stringify(e)});if(!t.success)throw Error(t.error?.message||`配置更新失败`)}async getMcpEndpoint(){let e=await this.request(`/api/config/mcp-endpoint`);if(!e.success||!e.data)throw Error(`获取 MCP 端点失败`);return e.data.endpoint}async getMcpEndpoints(){let e=await this.request(`/api/config/mcp-endpoints`);if(!e.success||!e.data)throw Error(`获取 MCP 端点列表失败`);return e.data.endpoints}async getMcpServers(){let e=await this.request(`/api/config/mcp-servers`);if(!e.success||!e.data)throw Error(`获取 MCP 服务配置失败`);return e.data.servers}async getConnectionConfig(){let e=await this.request(`/api/config/connection`);if(!e.success||!e.data)throw Error(`获取连接配置失败`);return e.data.connection}async reloadConfig(){let e=await this.request(`/api/config/reload`,{method:`POST`});if(!e.success||!e.data)throw Error(`重新加载配置失败`);return e.data}async getConfigPath(){let e=await this.request(`/api/config/path`);if(!e.success||!e.data)throw Error(`获取配置文件路径失败`);return e.data.path}async checkConfigExists(){let e=await this.request(`/api/config/exists`);if(!e.success||e.data?.exists===void 0)throw Error(`检查配置是否存在失败`);return e.data.exists}async getPromptFiles(){let e=await this.request(`/api/config/prompts`);if(!e.success||!e.data)throw Error(`获取提示词文件列表失败`);return e.data.prompts}async getPromptFileContent(e){let t=await this.request(`/api/config/prompts/content?path=${encodeURIComponent(e)}`);if(!t.success||!t.data)throw Error(t.error?.message||`获取提示词文件内容失败`);return t.data}async updatePromptFileContent(e,t){let n=await this.request(`/api/config/prompts/content`,{method:`PUT`,body:JSON.stringify({path:e,content:t})});if(!n.success||!n.data)throw Error(n.error?.message||`更新提示词文件内容失败`);return n.data}async createPromptFile(e,t){let n=await this.request(`/api/config/prompts/content`,{method:`POST`,body:JSON.stringify({fileName:e,content:t})});if(!n.success||!n.data)throw Error(n.error?.message||`创建提示词文件失败`);return n.data}async deletePromptFile(e){let t=await this.request(`/api/config/prompts/content?path=${encodeURIComponent(e)}`,{method:`DELETE`});if(!t.success)throw Error(t.error?.message||`删除提示词文件失败`)}async getStatus(){let e=await this.request(`/api/status`);if(!e.success||!e.data)throw Error(`获取状态失败`);return e.data}async getClientStatus(){let e=await this.request(`/api/status/client`);if(!e.success||!e.data)throw Error(`获取客户端状态失败`);return e.data}async getRestartStatus(){let e=await this.request(`/api/status/restart`);if(!e.success)throw Error(`获取重启状态失败`);return e.data||null}async checkClientConnected(){let e=await this.request(`/api/status/connected`);if(!e.success||e.data?.connected===void 0)throw Error(`检查客户端连接失败`);return e.data.connected}async getLastHeartbeat(){let e=await this.request(`/api/status/heartbeat`);if(!e.success)throw Error(`获取最后心跳时间失败`);return e.data?.lastHeartbeat||null}async getActiveMCPServers(){let e=await this.request(`/api/status/mcp-servers`);if(!e.success||!e.data)throw Error(`获取活跃 MCP 服务器失败`);return e.data.servers}async updateClientStatus(e){let t=await this.request(`/api/status/client`,{method:`PUT`,body:JSON.stringify(e)});if(!t.success)throw Error(t.error?.message||`更新客户端状态失败`)}async setActiveMCPServers(e){let t=await this.request(`/api/status/mcp-servers`,{method:`PUT`,body:JSON.stringify({servers:e})});if(!t.success)throw Error(t.error?.message||`设置活跃 MCP 服务器失败`)}async resetStatus(){let e=await this.request(`/api/status/reset`,{method:`POST`});if(!e.success)throw Error(e.error?.message||`重置状态失败`)}async addCustomTool(e,t,n,r){if(typeof e==`object`&&`type`in e&&`data`in e){let t=await this.request(`/api/tools/custom`,{method:`POST`,body:JSON.stringify(e)});if(!t.success||!t.data)throw Error(t.error?.message||`添加自定义工具失败`);return t.data.tool}let i=e,a=await this.request(`/api/tools/custom`,{method:`POST`,body:JSON.stringify({workflow:i,customName:t,customDescription:n,parameterConfig:r})});if(!a.success||!a.data)throw Error(a.error?.message||`添加自定义工具失败`);return a.data.tool}async updateCustomTool(e,t){let n=await this.request(`/api/tools/custom/${encodeURIComponent(e)}`,{method:`PUT`,body:JSON.stringify(t)});if(!n.success||!n.data)throw Error(n.error?.message||`更新自定义工具失败`);return n.data.tool}async removeCustomTool(e){let t=await this.request(`/api/tools/custom/${encodeURIComponent(e)}`,{method:`DELETE`});if(!t.success)throw Error(t.error?.message||`删除自定义工具失败`)}async getCustomTools(){let e=await this.request(`/api/tools/custom`);if(!e.success||!e.data)throw Error(`获取自定义工具列表失败`);return e.data.tools}async getToolsList(e=`all`,t){let n=new URLSearchParams;e!==`all`&&n.append(`status`,e),t&&n.append(`sortBy`,t.field);let r=`/api/tools/list${n.toString()?`?${n.toString()}`:``}`,i=await this.request(r);if(!i.success||!i.data)throw Error(`获取工具列表失败`);return i.data.list}async restartService(){let e=await this.request(`/api/services/restart`,{method:`POST`});if(!e.success)throw Error(e.error?.message||`重启服务失败`)}async stopService(){let e=await this.request(`/api/services/stop`,{method:`POST`});if(!e.success)throw Error(e.error?.message||`停止服务失败`)}async startService(){let e=await this.request(`/api/services/start`,{method:`POST`});if(!e.success)throw Error(e.error?.message||`启动服务失败`)}async getServiceStatus(){let e=await this.request(`/api/services/status`);if(!e.success||!e.data)throw Error(`获取服务状态失败`);return e.data}async getServiceHealth(){let e=await this.request(`/api/services/health`);if(!e.success||!e.data)throw Error(`获取服务健康状态失败`);return e.data}async getTTSVoices(){let e=await this.request(`/api/tts/voices`);if(!e.success||!e.data)throw Error(`获取音色列表失败`);return e.data}async getVersion(){let e=await this.request(`/api/version`);if(!e.success||!e.data)throw Error(`获取版本信息失败`);return e.data}async getVersionSimple(){let e=await this.request(`/api/version/simple`);if(!e.success||!e.data)throw Error(`获取版本号失败`);return e.data}async getAvailableVersions(e=`stable`){let t=new URLSearchParams;e!==`stable`&&t.append(`type`,e);let n=`/api/version/available${t.toString()?`?${t.toString()}`:``}`,r=await this.request(n);if(!r.success||!r.data)throw Error(`获取可用版本列表失败`);return r.data}async getLatestVersion(){let e=await this.request(`/api/version/latest`);if(!e.success||!e.data)throw Error(`检查最新版本失败`);return e.data}async clearVersionCache(){let e=await this.request(`/api/version/cache/clear`,{method:`POST`});if(!e.success)throw Error(e.error?.message||`清除版本缓存失败`)}async updateVersion(e){let t=await this.request(`/api/update`,{method:`POST`,body:JSON.stringify({version:e})});if(!t.success)throw Error(t.error?.message||`版本更新失败`);return t.data}async getEndpointStatus(e){let t=await this.request(`/api/endpoint/status`,{method:`POST`,body:JSON.stringify({endpoint:e})});if(!t.success||!t.data)throw Error(`获取接入点状态失败`);return t.data}async connectEndpoint(e){let t=await this.request(`/api/endpoint/connect`,{method:`POST`,body:JSON.stringify({endpoint:e})});if(!t.success)throw Error(t.error?.message||`连接接入点失败`)}async disconnectEndpoint(e){let t=await this.request(`/api/endpoint/disconnect`,{method:`POST`,body:JSON.stringify({endpoint:e})});if(!t.success)throw Error(t.error?.message||`断开接入点失败`)}async reconnectEndpoint(e){let t=await this.request(`/api/endpoint/reconnect`,{method:`POST`,body:JSON.stringify({endpoint:e})});if(!t.success)throw Error(t.error?.message||`重连接入点失败`)}async addEndpoint(e){let t=await this.request(`/api/endpoint/add`,{method:`POST`,body:JSON.stringify({endpoint:e})});if(!t.success||!t.data)throw Error(t.error?.message||`添加接入点失败`);return t.data}async removeEndpoint(e){let t=await this.request(`/api/endpoint/remove`,{method:`POST`,body:JSON.stringify({endpoint:e})});if(!t.success)throw Error(t.error?.message||`移除接入点失败`)}async addMCPServer(e,t){let n={name:e,config:t},r=await this.request(`/api/mcp-servers`,{method:`POST`,body:JSON.stringify(n)});if(!r.success||!r.data)throw Error(r.error?.message||`添加 MCP 服务器失败`);return r.data}async removeMCPServer(e){let t=await this.request(`/api/mcp-servers/${encodeURIComponent(e)}`,{method:`DELETE`});if(!t.success||!t.data)throw Error(t.error?.message||`删除 MCP 服务器失败`);return t.data}async getMCPServerStatus(e){let t=await this.request(`/api/mcp-servers/${encodeURIComponent(e)}/status`);if(!t.success||!t.data)throw Error(t.error?.message||`获取 MCP 服务器状态失败`);return t.data}async listMCPServers(){let e=await this.request(`/api/mcp-servers`);if(!e.success||!e.data)throw Error(e.error?.message||`获取 MCP 服务器列表失败`);return e.data}async checkMCPServerExists(e){try{let t=await this.request(`/api/mcp-servers/${encodeURIComponent(e)}/exists`);return t.success&&t.data?.exists||!1}catch(e){if(e instanceof Error&&e.message.includes(`404`))return!1;throw e}}async updateMCPServer(e,t){let n=await this.request(`/api/mcp-servers/${encodeURIComponent(e)}`,{method:`PUT`,body:JSON.stringify({config:t})});if(!n.success||!n.data)throw Error(n.error?.message||`更新 MCP 服务器配置失败`);return n.data}async callTool(e,t,n={}){let r=await this.request(`/api/tools/call`,{method:`POST`,body:JSON.stringify({serviceName:e,toolName:t,args:n})});if(!r.success)throw Error(r.error?.message||`调用工具失败`);return r.data}async restartMCPServer(e){let t=await this.request(`/api/mcp-servers/${encodeURIComponent(e)}/restart`,{method:`POST`});if(!t.success||!t.data)throw Error(t.error?.message||`重启 MCP 服务器失败`);return t.data}async manageMCPTool(e){let t=await this.request(`/api/tools/mcp/manage`,{method:`POST`,body:JSON.stringify(e)});if(!t.success||!t.data)throw Error(t.error?.message||`MCP 工具管理操作失败`);return t.data}async listMCPTools(e){let t=await this.request(`/api/tools/mcp/list`,{method:`POST`,body:JSON.stringify(e||{})});if(!t.success||!t.data)throw Error(t.error?.message||`获取 MCP 工具列表失败`);return t.data}},It=1e3,A=function(e){return e.DISCONNECTED=`disconnected`,e.CONNECTING=`connecting`,e.CONNECTED=`connected`,e.RECONNECTING=`reconnecting`,e}(A||{}),Lt=class{listeners=new Map;on(e,t){return this.listeners.has(e)||this.listeners.set(e,new Set),this.listeners.get(e).add(t),()=>{this.off(e,t)}}off(e,t){let n=this.listeners.get(e);n&&(n.delete(t),n.size===0&&this.listeners.delete(e))}emit(e,t){let n=this.listeners.get(e);if(n)for(let r of n)try{r(t)}catch(t){console.error(`[EventBus] 事件监听器执行失败 (${e}):`,t)}}clear(){this.listeners.clear()}getListenerCount(e){return e?this.listeners.get(e)?.size||0:Array.from(this.listeners.values()).reduce((e,t)=>e+t.size,0)}},j=class e{static instance=null;static isCreating=!1;ws=null;url;state=A.DISCONNECTED;eventBus=new Lt;reconnectAttempts=0;maxReconnectAttempts;reconnectInterval;reconnectTimer;heartbeatTimer;heartbeatInterval;heartbeatTimeout;lastHeartbeat=0;constructor(e={}){this.url=e.url||this.getDefaultWebSocketUrl(),this.maxReconnectAttempts=e.maxReconnectAttempts||5,this.reconnectInterval=e.reconnectInterval||3e3,this.heartbeatInterval=e.heartbeatInterval||3e4,this.heartbeatTimeout=e.heartbeatTimeout||35e3}static getInstance(t){if(e.instance)return e.instance;if(e.isCreating)throw Error(`[WebSocketManager] 检测到循环创建,请检查代码逻辑`);e.isCreating=!0;try{return e.instance=new e(t),console.log(`[WebSocketManager] 单例实例已创建`),e.instance}finally{e.isCreating=!1}}static resetInstance(){e.instance&&(e.instance.disconnect(),e.instance.eventBus.clear(),e.instance=null,console.log(`[WebSocketManager] 单例实例已重置`))}getDefaultWebSocketUrl(){return localStorage.getItem(`xiaozhi-ws-url`)||`${window.location.protocol===`https:`?`wss:`:`ws:`}//${window.location.hostname}:9999`}connect(){if(!(this.state===A.CONNECTED||this.state===A.CONNECTING)){this.state=A.CONNECTING,console.log(`[WebSocket] 连接到: ${this.url}`),this.eventBus.emit(`connection:connecting`,void 0);try{this.ws=new WebSocket(this.url),this.setupEventHandlers()}catch(e){console.error(`[WebSocket] 连接失败:`,e),this.handleConnectionError(e)}}}disconnect(){console.log(`[WebSocket] 主动断开连接`),this.clearTimers(),this.state=A.DISCONNECTED,this.reconnectAttempts=0,this.ws&&=(this.ws.close(),null)}subscribe(e,t){return this.eventBus.on(e,t)}unsubscribe(e,t){this.eventBus.off(e,t)}getEventBus(){return this.eventBus}getState(){return this.state}isConnected(){return this.state===A.CONNECTED&&this.ws?.readyState===WebSocket.OPEN}setUrl(e){this.url!==e&&(this.url=e,localStorage.setItem(`xiaozhi-ws-url`,e),this.isConnected()&&(this.disconnect(),setTimeout(()=>this.connect(),It)))}send(e){if(!this.isConnected())return console.warn(`[WebSocket] 连接未建立,无法发送消息`),!1;try{let t=typeof e==`string`?e:JSON.stringify(e);return this.ws.send(t),!0}catch(e){return console.error(`[WebSocket] 发送消息失败:`,e),this.eventBus.emit(`connection:error`,{error:e,context:`send_message`}),!1}}getUrl(){return this.url}getConnectionStats(){return{state:this.state,url:this.url,reconnectAttempts:this.reconnectAttempts,maxReconnectAttempts:this.maxReconnectAttempts,lastHeartbeat:this.lastHeartbeat,eventListenerCount:this.eventBus.getListenerCount()}}setupEventHandlers(){this.ws&&(this.ws.onopen=()=>{console.log(`[WebSocket] 连接已建立`),this.state=A.CONNECTED,this.reconnectAttempts=0,this.startHeartbeat(),this.eventBus.emit(`connection:connected`,void 0)},this.ws.onmessage=e=>{try{let t=JSON.parse(e.data);this.handleMessage(t)}catch(e){console.error(`[WebSocket] 消息解析失败:`,e)}},this.ws.onclose=e=>{console.log(`[WebSocket] 连接已关闭 (code: ${e.code})`),this.handleConnectionClose()},this.ws.onerror=e=>{console.error(`[WebSocket] 连接错误:`,e),this.handleConnectionError(Error(`WebSocket 连接错误`))})}handleMessage(e){console.log(`[WebSocket] 收到消息:`,e.type),this.eventBus.emit(`system:message`,e);try{switch(e.type){case`configUpdate`:case`config`:e.data&&this.eventBus.emit(`data:configUpdate`,e.data);break;case`statusUpdate`:case`status`:e.data&&this.eventBus.emit(`data:statusUpdate`,e.data);break;case`restartStatus`:e.data&&this.eventBus.emit(`data:restartStatus`,e.data);break;case`endpoint_status_changed`:e.data&&this.eventBus.emit(`data:endpointStatusChanged`,e.data);break;case`npm:install:started`:e.data&&this.eventBus.emit(`data:npmInstallStarted`,e.data);break;case`npm:install:log`:e.data&&this.eventBus.emit(`data:npmInstallLog`,e.data);break;case`npm:install:completed`:e.data&&this.eventBus.emit(`data:npmInstallCompleted`,e.data);break;case`npm:install:failed`:e.data&&this.eventBus.emit(`data:npmInstallFailed`,e.data);break;case`heartbeatResponse`:this.lastHeartbeat=Date.now(),this.eventBus.emit(`system:heartbeat`,{timestamp:this.lastHeartbeat});break;case`error`:{let t=Error(e.error?.message||`服务器错误`);console.error(`[WebSocket] 服务器错误:`,e.error),this.eventBus.emit(`system:error`,{error:t,message:e}),this.eventBus.emit(`connection:error`,{error:t,context:`server_error`});break}default:console.log(`[WebSocket] 未处理的消息类型:`,e.type)}}catch(t){console.error(`[WebSocket] 消息处理失败:`,t),this.eventBus.emit(`system:error`,{error:t,message:e})}}handleConnectionClose(){this.state=A.DISCONNECTED,this.clearTimers(),this.eventBus.emit(`connection:disconnected`,void 0),this.reconnectAttempts<this.maxReconnectAttempts?this.scheduleReconnect():(console.error(`[WebSocket] 达到最大重连次数,停止重连`),this.eventBus.emit(`connection:error`,{error:Error(`达到最大重连次数`),context:`max_reconnect_attempts`}))}handleConnectionError(e){this.state=A.DISCONNECTED,this.clearTimers(),this.eventBus.emit(`connection:error`,{error:e,context:`connection_error`}),this.reconnectAttempts<this.maxReconnectAttempts?this.scheduleReconnect():console.error(`[WebSocket] 达到最大重连次数,停止重连`)}scheduleReconnect(){this.reconnectAttempts++,this.state=A.RECONNECTING,console.log(`[WebSocket] 安排重连 (${this.reconnectAttempts}/${this.maxReconnectAttempts}) 在 ${this.reconnectInterval}ms 后`),this.eventBus.emit(`connection:reconnecting`,{attempt:this.reconnectAttempts,maxAttempts:this.maxReconnectAttempts}),this.reconnectTimer=setTimeout(()=>{this.connect()},this.reconnectInterval)}startHeartbeat(){this.lastHeartbeat=Date.now(),this.heartbeatTimer=setInterval(()=>{this.isConnected()&&(this.sendHeartbeat(),Date.now()-this.lastHeartbeat>this.heartbeatTimeout&&(console.warn(`[WebSocket] 心跳超时,重新连接`),this.disconnect(),this.connect()))},this.heartbeatInterval)}sendHeartbeat(){if(this.isConnected()){let e={type:`clientStatus`,data:{status:`connected`,timestamp:Date.now()}};this.ws?.send(JSON.stringify(e))}}clearTimers(){this.reconnectTimer&&=(clearTimeout(this.reconnectTimer),void 0),this.heartbeatTimer&&=(clearInterval(this.heartbeatTimer),void 0)}}.getInstance(),Rt={clientStatus:null,restartStatus:null,serviceStatus:null,serviceHealth:null,fullStatus:null,loading:{isLoading:!1,isRefreshing:!1,isRestarting:!1,lastUpdated:null,lastError:null},polling:{enabled:!1,interval:3e4,maxRetries:3,currentRetries:0},restartPolling:{enabled:!1,interval:1e3,maxAttempts:60,currentAttempts:0,timeout:6e4,startTime:null},lastSource:null},zt=null,Bt=null,Vt=le()(C((e,t)=>({...Rt,setClientStatus:(t,n=`http`)=>{console.log(`[StatusStore] 设置客户端状态,来源: ${n}`),e(e=>({clientStatus:t,lastSource:n,loading:{...e.loading,lastUpdated:Date.now(),lastError:null}}),!1,`setClientStatus`)},setRestartStatus:(t,n=`http`)=>{console.log(`[StatusStore] 设置重启状态,来源: ${n}`),e(e=>({restartStatus:t,lastSource:n,loading:{...e.loading,lastUpdated:Date.now(),lastError:null}}),!1,`setRestartStatus`)},setServiceStatus:t=>{console.log(`[StatusStore] 设置服务状态`),e({serviceStatus:t},!1,`setServiceStatus`)},setServiceHealth:t=>{console.log(`[StatusStore] 设置服务健康状态`),e({serviceHealth:t},!1,`setServiceHealth`)},setFullStatus:(t,n=`http`)=>{console.log(`[StatusStore] 设置完整状态,来源: ${n}`),e(e=>({fullStatus:t,clientStatus:t.client,restartStatus:t.restart||null,lastSource:n,loading:{...e.loading,lastUpdated:Date.now(),lastError:null}}),!1,`setFullStatus`)},setLoading:t=>{e(e=>({loading:{...e.loading,...t}}),!1,`setLoading`)},setError:t=>{e(e=>({loading:{...e.loading,lastError:t}}),!1,`setError`)},getStatus:async()=>{let{fullStatus:e,loading:n}=t();return e&&n.lastUpdated&&Date.now()-n.lastUpdated<30*1e3?e:t().refreshStatus()},refreshStatus:async()=>{let{setLoading:e,setFullStatus:n,setError:r,polling:i}=t();try{e({isRefreshing:!0,lastError:null}),console.log(`[StatusStore] 开始刷新状态`);let r=await k.getStatus();return n(r,`http`),i.enabled&&t().setPollingConfig({currentRetries:0}),console.log(`[StatusStore] 状态刷新成功`),r}catch(e){let n=e instanceof Error?e:Error(`状态刷新失败`);if(console.error(`[StatusStore] 状态刷新失败:`,n),r(n),i.enabled){let e=i.currentRetries+1;t().setPollingConfig({currentRetries:e}),e>=i.maxRetries&&(console.warn(`[StatusStore] 达到最大重试次数,停止轮询`),t().stopPolling())}throw n}finally{e({isRefreshing:!1})}},restartService:async()=>{let{setLoading:e,setRestartStatus:n,setError:r,startRestartPolling:i}=t();try{e({isRestarting:!0,lastError:null}),console.log(`[StatusStore] 开始重启服务`),n({status:`restarting`,timestamp:Date.now()},`http`),await k.restartService(),console.log(`[StatusStore] 服务重启请求已发送,开始重连检查`),i()}catch(t){let i=t instanceof Error?t:Error(`服务重启失败`);throw console.error(`[StatusStore] 服务重启失败:`,i),n({status:`failed`,error:i.message,timestamp:Date.now()},`http`),r(i),e({isRestarting:!1}),i}},getServiceStatus:async()=>{try{console.log(`[StatusStore] 获取服务状态`);let e=await k.getServiceStatus();return t().setServiceStatus(e),e}catch(e){let n=e instanceof Error?e:Error(`获取服务状态失败`);throw console.error(`[StatusStore] 获取服务状态失败:`,n),t().setError(n),n}},getServiceHealth:async()=>{try{console.log(`[StatusStore] 获取服务健康状态`);let e=await k.getServiceHealth();return t().setServiceHealth(e),e}catch(e){let n=e instanceof Error?e:Error(`获取服务健康状态失败`);throw console.error(`[StatusStore] 获取服务健康状态失败:`,n),t().setError(n),n}},startPolling:(n=3e4)=>{let{polling:r,refreshStatus:i}=t();if(r.enabled){console.log(`[StatusStore] 轮询已启用,跳过启动`);return}console.log(`[StatusStore] 启动状态轮询,间隔: ${n}ms`),e(e=>({polling:{...e.polling,enabled:!0,interval:n,currentRetries:0}}),!1,`startPolling`),i().catch(e=>{console.error(`[StatusStore] 轮询初始刷新失败:`,e)}),zt=setInterval(()=>{t().polling.enabled&&i().catch(e=>{console.error(`[StatusStore] 轮询刷新失败:`,e)})},n)},stopPolling:()=>{console.log(`[StatusStore] 停止状态轮询`),e(e=>({polling:{...e.polling,enabled:!1,currentRetries:0}}),!1,`stopPolling`),zt&&=(clearInterval(zt),null)},setPollingConfig:t=>{e(e=>({polling:{...e.polling,...t}}),!1,`setPollingConfig`)},startRestartPolling:()=>{let{restartPolling:n,refreshStatus:r,setRestartStatus:i,setLoading:a}=t();if(n.enabled){console.log(`[StatusStore] 重启轮询已启用,跳过启动`);return}console.log(`[StatusStore] 启动重启后重连检查轮询`);let o=Date.now();e(e=>({restartPolling:{...e.restartPolling,enabled:!0,currentAttempts:0,startTime:o}}),!1,`startRestartPolling`),Bt=setInterval(async()=>{let e=t(),{restartPolling:n}=e;if(!n.enabled)return;let o=Date.now()-(n.startTime||0),s=n.currentAttempts+1;console.log(`[StatusStore] 重启重连检查 (第 ${s} 次,已用时 ${Math.round(o/1e3)}s)`);try{if((await r()).client?.status===`connected`){console.log(`[StatusStore] 服务重连成功,停止重启轮询`),i({status:`completed`,timestamp:Date.now()},`polling`),e.stopRestartPolling(),a({isRestarting:!1});return}e.setRestartPollingConfig({currentAttempts:s}),(o>=n.timeout||s>=n.maxAttempts)&&(console.warn(`[StatusStore] 重启重连检查超时或达到最大尝试次数`),i({status:`failed`,error:`重连超时,服务可能未成功重启`,timestamp:Date.now()},`polling`),e.stopRestartPolling(),a({isRestarting:!1}))}catch(t){console.log(`[StatusStore] 重启重连检查失败 (第 ${s} 次):`,t),e.setRestartPollingConfig({currentAttempts:s}),(o>=n.timeout||s>=n.maxAttempts)&&(console.error(`[StatusStore] 重启重连检查超时或达到最大尝试次数`),i({status:`failed`,error:`重连超时,服务可能未成功重启`,timestamp:Date.now()},`polling`),e.stopRestartPolling(),a({isRestarting:!1}))}},n.interval)},stopRestartPolling:()=>{console.log(`[StatusStore] 停止重启轮询`),e(e=>({restartPolling:{...e.restartPolling,enabled:!1,currentAttempts:0,startTime:null}}),!1,`stopRestartPolling`),Bt&&=(clearInterval(Bt),null)},setRestartPollingConfig:t=>{e(e=>({restartPolling:{...e.restartPolling,...t}}),!1,`setRestartPollingConfig`)},reset:()=>{console.log(`[StatusStore] 重置状态`),t().stopPolling(),t().stopRestartPolling(),e(Rt,!1,`reset`)},initialize:async()=>{let{setLoading:e,refreshStatus:n}=t();try{e({isLoading:!0}),console.log(`[StatusStore] 初始化状态 Store`),j.subscribe(`data:statusUpdate`,e=>{console.log(`[StatusStore] 收到 WebSocket 状态更新`),t().setClientStatus(e,`websocket`)}),j.subscribe(`data:restartStatus`,e=>{console.log(`[StatusStore] 收到 WebSocket 重启状态更新`),t().setRestartStatus(e,`websocket`)}),await n(),console.log(`[StatusStore] 状态 Store 初始化完成`)}catch(e){throw console.error(`[StatusStore] 状态 Store 初始化失败:`,e),e}finally{e({isLoading:!1})}}}),{name:`status-store`})),Ht=()=>Vt(e=>e.restartStatus),Ut=()=>Vt(e=>e.restartPolling);function Wt(){let e=Ht(),t=Ut(),n=(0,O.useRef)(null),r=(0,O.useRef)(null);(0,O.useEffect)(()=>{if(!e)return;let{status:i,timestamp:a,error:o}=e;if(!(n.current===i&&r.current===a))switch(n.current=i,r.current=a,i){case`restarting`:E.info(`正在重启服务...`,{id:`restart-status-progress`,description:`请耐心等待`,duration:0});break;case`completed`:{let e=t.enabled?`服务重启成功!重连检查完成 (${t.currentAttempts}次检查)`:`服务重启成功!`;E.dismiss(`restart-status-progress`),E.success(e,{id:`restart-status-success`,description:`服务已恢复正常运行`});break}case`failed`:{let e=o||`服务重启失败`,n=t.enabled?`重连检查超时 (${t.currentAttempts}/${t.maxAttempts}次)`:`请检查服务状态或稍后重试`;E.dismiss(`restart-status-progress`),E.error(e,{id:`restart-status-failed`,description:n});break}}},[e,t]),(0,O.useEffect)(()=>()=>{n.current=null,r.current=null},[])}function Gt(){return Wt(),null}var M=bt();function Kt({showValue:e=!0,value:t=0,maxValue:n=100,size:r=60,activeColor:i=`#3b82f6`,inactiveColor:a=`#e5e7eb`,symbol:o=`%`,ariaLabel:s}){let c=(r-6)/2,l=c*2*Math.PI,u=l,d=n===0?l:l-t/n*l;return(0,M.jsxs)(`div`,{className:`relative inline-flex items-center justify-center`,role:`progressbar`,tabIndex:0,"aria-valuenow":t,"aria-valuemin":0,"aria-valuemax":n,"aria-label":s||`进度:${t}/${n}`,children:[(0,M.jsxs)(`svg`,{width:r,height:r,className:`transform -rotate-90`,children:[(0,M.jsx)(`circle`,{cx:r/2,cy:r/2,r:c,stroke:a,strokeWidth:6,fill:`none`}),(0,M.jsx)(`circle`,{cx:r/2,cy:r/2,r:c,stroke:i,strokeWidth:6,fill:`none`,strokeDasharray:u,strokeDashoffset:d,strokeLinecap:`round`,className:`transition-all duration-300 ease-in-out`})]}),e&&(0,M.jsx)(`div`,{className:`absolute inset-0 flex items-center justify-center`,children:(0,M.jsxs)(`span`,{className:`text-xs font-medium`,children:[t,o]})})]})}function N(...e){return wt(Ct(e))}var qt=St(`inline-flex items-center rounded-full 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 hover:bg-primary/80`,secondary:`border-transparent bg-secondary text-secondary-foreground hover:bg-secondary/80`,destructive:`border-transparent bg-destructive text-destructive-foreground hover:bg-destructive/80`,outline:`text-foreground`}},defaultVariants:{variant:`default`}});function P({className:e,variant:t,...n}){return(0,M.jsx)(`div`,{className:N(qt({variant:t}),e),...n})}var Jt=St(`inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 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 hover:bg-primary/90`,destructive:`bg-destructive text-destructive-foreground hover:bg-destructive/90`,outline:`border border-input bg-background hover:bg-accent hover:text-accent-foreground`,secondary:`bg-secondary text-secondary-foreground hover:bg-secondary/80`,ghost:`hover:bg-accent hover:text-accent-foreground`,link:`text-primary underline-offset-4 hover:underline`},size:{default:`h-10 px-4 py-2`,sm:`h-9 rounded-md px-3`,lg:`h-11 rounded-md px-8`,icon:`h-10 w-10`}},defaultVariants:{variant:`default`,size:`default`}}),F=O.forwardRef(({className:e,variant:t,size:n,asChild:r=!1,...i},a)=>(0,M.jsx)(r?p:`button`,{className:N(Jt({variant:t,size:n,className:e})),ref:a,...i}));F.displayName=`Button`;var Yt=mt,Xt=d,Zt=s,Qt=O.forwardRef(({className:e,...t},n)=>(0,M.jsx)(de,{className:N(`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`,e),...t,ref:n}));Qt.displayName=de.displayName;var $t=O.forwardRef(({className:e,...t},n)=>(0,M.jsxs)(Zt,{children:[(0,M.jsx)(Qt,{}),(0,M.jsx)(De,{ref:n,className:N(`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`,e),...t})]}));$t.displayName=De.displayName;var en=({className:e,...t})=>(0,M.jsx)(`div`,{className:N(`flex flex-col space-y-2 text-center sm:text-left`,e),...t});en.displayName=`AlertDialogHeader`;var tn=({className:e,...t})=>(0,M.jsx)(`div`,{className:N(`flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2`,e),...t});tn.displayName=`AlertDialogFooter`;var nn=O.forwardRef(({className:e,...t},n)=>(0,M.jsx)(pe,{ref:n,className:N(`text-lg font-semibold`,e),...t}));nn.displayName=pe.displayName;var rn=O.forwardRef(({className:e,...t},n)=>(0,M.jsx)(gt,{ref:n,className:N(`text-sm text-muted-foreground`,e),...t}));rn.displayName=gt.displayName;var an=O.forwardRef(({className:e,...t},n)=>(0,M.jsx)(ft,{ref:n,className:N(Jt(),e),...t}));an.displayName=ft.displayName;var on=O.forwardRef(({className:e,...t},n)=>(0,M.jsx)(vt,{ref:n,className:N(Jt({variant:`outline`}),`mt-2 sm:mt-0`,e),...t}));on.displayName=vt.displayName;var I=te,sn=se,cn=He,ln=l,un=O.forwardRef(({className:e,...t},n)=>(0,M.jsx)(i,{ref:n,className:N(`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`,e),...t}));un.displayName=i.displayName;var L=O.forwardRef(({className:e,children:t,...n},r)=>(0,M.jsxs)(cn,{children:[(0,M.jsx)(un,{}),(0,M.jsxs)(ae,{ref:r,className:N(`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`,e),...n,children:[t,(0,M.jsxs)(l,{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:[(0,M.jsx)(f,{className:`h-4 w-4`}),(0,M.jsx)(`span`,{className:`sr-only`,children:`Close`})]})]})]}));L.displayName=ae.displayName;var R=({className:e,...t})=>(0,M.jsx)(`div`,{className:N(`flex flex-col space-y-1.5 text-center sm:text-left`,e),...t});R.displayName=`DialogHeader`;var dn=({className:e,...t})=>(0,M.jsx)(`div`,{className:N(`flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2`,e),...t});dn.displayName=`DialogFooter`;var z=O.forwardRef(({className:e,...t},n)=>(0,M.jsx)(re,{ref:n,className:N(`text-lg font-semibold leading-none tracking-tight`,e),...t}));z.displayName=re.displayName;var fn=O.forwardRef(({className:e,...t},n)=>(0,M.jsx)(We,{ref:n,className:N(`text-sm text-muted-foreground`,e),...t}));fn.displayName=We.displayName;var B=O.forwardRef(({className:e,type:t,...n},r)=>(0,M.jsx)(`input`,{type:t,className:N(`flex h-10 w-full rounded-md border border-input bg-background px-3 py-2 text-base ring-offset-background 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-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 md:text-sm`,e),ref:r,"data-1p-ignore":!0,...n}));B.displayName=`Input`;var pn={config:null,loading:{isLoading:!1,isUpdating:!1,isRefreshing:!1,lastUpdated:null,lastError:null},lastSource:null,mcpServerStatuses:[],mcpServerStatusLoading:!1,mcpServerStatusLastUpdate:null},V=le()(C((e,t)=>({...pn,setConfig:(t,n=`http`)=>{console.log(`[ConfigStore] 设置配置数据,来源: ${n}`),e(e=>({config:t,lastSource:n,loading:{...e.loading,lastUpdated:Date.now(),lastError:null}}),!1,`setConfig`)},setLoading:t=>{e(e=>({loading:{...e.loading,...t}}),!1,`setLoading`)},setError:t=>{e(e=>({loading:{...e.loading,lastError:t}}),!1,`setError`)},getConfig:async()=>{let{config:e,loading:n}=t();return e&&n.lastUpdated&&Date.now()-n.lastUpdated<300*1e3?e:t().refreshConfig()},updateConfig:async e=>{let{setLoading:n,setConfig:r,setError:i}=t();try{n({isUpdating:!0,lastError:null}),console.log(`[ConfigStore] 开始更新配置`),await k.updateConfig(e),r(e,`http`),console.log(`[ConfigStore] 配置更新成功`)}catch(e){let t=e instanceof Error?e:Error(`配置更新失败`);throw console.error(`[ConfigStore] 配置更新失败:`,t),i(t),t}finally{n({isUpdating:!1})}},refreshConfig:async()=>{let{setLoading:e,setConfig:n,setError:r}=t();try{e({isRefreshing:!0,lastError:null}),console.log(`[ConfigStore] 开始刷新配置`);let t=await k.getConfig();return n(t,`http`),console.log(`[ConfigStore] 配置刷新成功`),t}catch(e){let t=e instanceof Error?e:Error(`配置刷新失败`);throw console.error(`[ConfigStore] 配置刷新失败:`,t),r(t),t}finally{e({isRefreshing:!1})}},reloadConfig:async()=>{let{setLoading:e,setConfig:n,setError:r}=t();try{e({isRefreshing:!0,lastError:null}),console.log(`[ConfigStore] 开始重新加载配置`);let t=await k.reloadConfig();return n(t,`http`),console.log(`[ConfigStore] 配置重新加载成功`),t}catch(e){let t=e instanceof Error?e:Error(`配置重新加载失败`);throw console.error(`[ConfigStore] 配置重新加载失败:`,t),r(t),t}finally{e({isRefreshing:!1})}},updateMcpEndpoint:async e=>{let{config:n,updateConfig:r}=t();if(!n)throw Error(`配置未加载,无法更新 MCP 端点`);await r({...n,mcpEndpoint:e})},updateMcpServers:async e=>{let{config:n,updateConfig:r}=t();if(!n)throw Error(`配置未加载,无法更新 MCP 服务`);await r({...n,mcpServers:e})},updateConnectionConfig:async e=>{let{config:n,updateConfig:r}=t();if(!n)throw Error(`配置未加载,无法更新连接配置`);await r({...n,connection:e})},updateModelScopeConfig:async e=>{let{config:n,updateConfig:r}=t();if(!n)throw Error(`配置未加载,无法更新 ModelScope 配置`);await r({...n,modelscope:e})},updateWebUIConfig:async e=>{let{config:n,updateConfig:r}=t();if(!n)throw Error(`配置未加载,无法更新 Web UI 配置`);await r({...n,webUI:e})},reset:()=>{console.log(`[ConfigStore] 重置状态`),e(pn,!1,`reset`)},initialize:async()=>{let{setLoading:e,refreshConfig:n}=t();try{e({isLoading:!0}),console.log(`[ConfigStore] 初始化配置 Store`),j.subscribe(`data:configUpdate`,e=>{console.log(`[ConfigStore] 收到 WebSocket 配置更新`),t().setConfig(e,`websocket`)}),await n(),console.log(`[ConfigStore] 配置 Store 初始化完成`)}catch(e){throw console.error(`[ConfigStore] 配置 Store 初始化失败:`,e),e}finally{e({isLoading:!1})}},setMcpServerStatuses:t=>{e(()=>({mcpServerStatuses:t,mcpServerStatusLastUpdate:Date.now()}),!1,`setMcpServerStatuses`)},setMcpServerStatusLoading:t=>{e(()=>({mcpServerStatusLoading:t}),!1,`setMcpServerStatusLoading`)},refreshMcpServerStatuses:async()=>{let e=t(),{setMcpServerStatuses:n,setMcpServerStatusLoading:r,setConfig:i}=e;try{r(!0),console.log(`[ConfigStore] 开始刷新 MCP 服务器状态`);let t=await k.listMCPServers();if(n(t.servers),e.config){let n={};for(let e of t.servers)n[e.name]=e.config;i({...e.config,mcpServers:n},`http`)}return console.log(`[ConfigStore] MCP 服务器状态刷新成功,共 ${t.servers.length} 个服务器`),t.servers}catch(e){let t=e instanceof Error?e:Error(`MCP 服务器状态刷新失败`);throw console.error(`[ConfigStore] MCP 服务器状态刷新失败:`,t),n([]),t}finally{r(!1)}},getMcpServerStatus:e=>t().mcpServerStatuses.find(t=>t.name===e)}),{name:`config-store`})),mn=()=>V(e=>e.config),hn=()=>V(e=>e.config?.mcpEndpoint),gn=()=>V(v(e=>({asr:e.config?.asr,llm:e.config?.llm,tts:e.config?.tts}))),_n=()=>V(v(e=>({getConfig:e.getConfig,updateConfig:e.updateConfig,refreshConfig:e.refreshConfig,reloadConfig:e.reloadConfig,updateMcpEndpoint:e.updateMcpEndpoint,updateMcpServers:e.updateMcpServers,updateConnectionConfig:e.updateConnectionConfig,updateModelScopeConfig:e.updateModelScopeConfig,updateWebUIConfig:e.updateWebUIConfig,reset:e.reset,initialize:e.initialize}))),vn=()=>V(v(e=>({servers:e.mcpServerStatuses,loading:e.mcpServerStatusLoading,refresh:e.refreshMcpServerStatuses,lastUpdate:e.mcpServerStatusLastUpdate}))),yn=e=>`${e.slice(0,30)}...${e.slice(-10)}`,bn=e=>{if(!e.trim())return`请输入接入点地址`;if(!e.startsWith(`ws://`)&&!e.startsWith(`wss://`))return`接入点格式无效,请输入正确的WebSocket URL (ws:// 或 wss://)`;try{new URL(e)}catch{return`接入点格式无效,请输入正确的URL格式`}return null};function xn(){let[e,t]=(0,O.useState)(!1),[n,r]=(0,O.useState)(!1),[i,a]=(0,O.useState)(``),[o,s]=(0,O.useState)(!1),[c,l]=(0,O.useState)(!1),[u,d]=(0,O.useState)(``),[f,p]=(0,O.useState)(!1),[m,h]=(0,O.useState)(``),[g,v]=(0,O.useState)({}),y=mn(),b=hn(),{refreshConfig:x}=_n(),ee=(0,O.useCallback)(async e=>{try{return await k.getEndpointStatus(e)}catch(t){return console.error(`获取接入点状态失败: ${e}`,t),{endpoint:e,connected:!1,initialized:!1,isReconnecting:!1,reconnectAttempts:0,reconnectDelay:0}}},[]),C=(0,O.useCallback)((e,t)=>{v(n=>({...n,[e]:{...n[e],...t}}))},[]),w=(0,O.useCallback)(async e=>{let t={};for(let n of e)try{t[n]={connected:(await ee(n)).connected,isOperating:!1,lastOperation:{type:null,success:!1,message:``,timestamp:0}}}catch{t[n]={connected:!1,isOperating:!1,lastOperation:{type:null,success:!1,message:``,timestamp:0}}}v(t)},[ee]),te=async e=>{C(e,{isOperating:!0});try{await k.connectEndpoint(e),C(e,{connected:!0,isOperating:!1,lastOperation:{type:`connect`,success:!0,message:`连接成功`,timestamp:Date.now()}}),E.success(`接入点连接成功`)}catch(t){C(e,{isOperating:!1,lastOperation:{type:`connect`,success:!1,message:t instanceof Error?t.message:`连接失败`,timestamp:Date.now()}}),E.error(t instanceof Error?t.message:`接入点连接失败`)}},ne=async e=>{C(e,{isOperating:!0});try{await k.disconnectEndpoint(e),C(e,{connected:!1,isOperating:!1,lastOperation:{type:`disconnect`,success:!0,message:`断开成功`,timestamp:Date.now()}}),E.success(`接入点断开成功`)}catch(t){C(e,{isOperating:!1,lastOperation:{type:`disconnect`,success:!1,message:t instanceof Error?t.message:`断开失败`,timestamp:Date.now()}}),E.error(t instanceof Error?t.message:`接入点断开失败`)}},re=async e=>{try{if(navigator.clipboard?.writeText)await navigator.clipboard.writeText(e),E.success(`接入点地址已复制到剪贴板`);else{let t=document.createElement(`textarea`);t.value=e,t.style.position=`fixed`,t.style.opacity=`0`,document.body.appendChild(t),t.select();let n=document.execCommand(`copy`);if(document.body.removeChild(t),n)E.success(`接入点地址已复制到剪贴板`);else throw Error(`复制命令执行失败`)}}catch(e){console.error(`复制失败:`,e),E.error(`复制失败,请手动复制`)}},ie=async()=>{s(!0);try{await k.removeEndpoint(i),await x(),v(e=>{let t={...e};return delete t[i],t}),E.success(`接入点已删除`),r(!1),a(``)}catch(e){console.error(`删除接入点失败:`,e),E.error(e instanceof Error?e.message:`删除接入点失败`)}finally{s(!1)}},ae=async()=>{let e=bn(u);if(e){h(e);return}if((Array.isArray(b)?b:[b]).includes(u)){h(`该接入点已存在`);return}if(!y){E.error(`配置数据未加载,请稍后重试`);return}p(!0);try{let e=await k.addEndpoint(u);await x(),v(t=>({...t,[u]:{connected:e.connected,isOperating:!1,lastOperation:{type:null,success:!1,message:``,timestamp:0}}})),E.success(`接入点添加成功`),l(!1),d(``),h(``)}catch(e){console.error(`添加接入点失败:`,e),E.error(e instanceof Error?e.message:`添加接入点失败`)}finally{p(!1)}},oe=()=>{d(``),h(``),l(!0)},se=e=>{d(e),m&&h(``)},le=e=>{a(e),r(!0)},ue=(0,O.useMemo)(()=>{let e=[];return Array.isArray(b)&&(e=b),typeof b==`string`&&b.length&&e.push(b),e},[b]);return(0,O.useEffect)(()=>{e&&ue.length>0&&w(ue)},[e,ue,w]),(0,O.useEffect)(()=>{if(!e||ue.length===0)return;let t=ue.map(e=>j.subscribe(`data:endpointStatusChanged`,t=>{t.endpoint===e&&(console.log(`[McpEndpointSettingButton] 接收到端点 ${e} 状态变更:`,t),C(e,{connected:t.connected,isOperating:!1,lastOperation:{type:t.operation,success:t.success,message:t.message||(t.connected?`连接成功`:`断开成功`),timestamp:t.timestamp}}),t.success?E.success(`端点 ${t.operation===`connect`?`连接`:t.operation===`disconnect`?`断开`:`重连`}成功`):E.error(`端点 ${t.operation===`connect`?`连接`:t.operation===`disconnect`?`断开`:`重连`}失败: ${t.message||`未知错误`}`))}));return()=>{for(let e of t)e()}},[e,ue,C]),(0,M.jsxs)(I,{open:e,onOpenChange:t,children:[(0,M.jsx)(sn,{asChild:!0,children:(0,M.jsx)(F,{variant:`secondary`,size:`icon`,className:`size-8`,children:(0,M.jsx)(me,{className:`size-4`})})}),(0,M.jsxs)(L,{className:`min-w-[600px] max-w-[800px] max-h-[80vh] overflow-y-auto`,children:[(0,M.jsxs)(R,{className:`mb-4`,children:[(0,M.jsx)(z,{children:`配置小智服务端接入点`}),(0,M.jsx)(fn,{children:`点击保存后,需要重启服务才会生效。`})]}),(0,M.jsxs)(`div`,{className:`flex flex-col gap-2`,children:[ue.map(e=>{let t=g[e],n=t?.connected||!1,r=t?.isOperating||!1;return(0,M.jsxs)(`div`,{className:`flex flex-col sm:flex-row items-start sm:items-center justify-between p-4 bg-slate-50 rounded-md font-mono gap-3 transition-all duration-200 hover:bg-slate-100`,children:[(0,M.jsxs)(`div`,{className:`flex flex-col sm:flex-row items-start sm:items-center gap-2 sm:gap-3 flex-1 min-w-0`,children:[(0,M.jsx)(`span`,{className:`flex-1 text-ellipsis overflow-hidden whitespace-nowrap text-sm sm:text-base`,children:yn(e)}),(0,M.jsxs)(P,{className:`flex items-center gap-1 transition-all duration-200 text-xs sm:text-sm ${n?`bg-green-100 text-green-800 border-green-200 hover:text-green-800 hover:border-green-200 hover:bg-green-100`:`bg-gray-100 text-gray-600 border-gray-200 hover:bg-gray-100 hover:text-gray-600 hover:border-gray-200`}`,children:[r?(0,M.jsx)(T,{className:`size-3 animate-spin`}):n?(0,M.jsx)(_,{className:`size-3`}):(0,M.jsx)(S,{className:`size-3`}),r?`操作中`:n?`已连接`:`未连接`]})]}),(0,M.jsxs)(`div`,{className:`flex items-center gap-1 sm:gap-2 flex-wrap justify-end`,children:[(0,M.jsx)(F,{variant:`outline`,size:`icon`,onClick:()=>re(e),title:`复制完整地址`,className:`transition-all duration-200 hover:scale-105`,children:(0,M.jsx)(Te,{className:`size-4`})}),n?(0,M.jsx)(F,{variant:`outline`,size:`icon`,onClick:()=>ne(e),title:`断开连接`,disabled:r,className:`text-red-600 hover:text-red-700 hover:bg-red-50 transition-all duration-200 hover:scale-105 disabled:scale-100 disabled:opacity-50`,children:r?(0,M.jsx)(T,{className:`size-4 animate-spin`}):(0,M.jsx)(S,{className:`size-4`})}):(0,M.jsx)(F,{variant:`outline`,size:`icon`,onClick:()=>te(e),title:`连接`,disabled:r,className:`text-green-600 hover:text-green-700 hover:bg-green-50 transition-all duration-200 hover:scale-105 disabled:scale-100 disabled:opacity-50`,children:r?(0,M.jsx)(T,{className:`size-4 animate-spin`}):(0,M.jsx)(_,{className:`size-4`})}),(0,M.jsx)(F,{variant:`outline`,size:`icon`,onClick:()=>le(e),title:`删除此接入点`,className:`transition-all duration-200 hover:scale-105 hover:text-red-600`,children:(0,M.jsx)(ce,{className:`size-4 text-red-500`})})]})]},e)}),ue.length===0&&(0,M.jsxs)(`div`,{className:`flex flex-col items-center flex-1 text-sm text-muted-foreground text-center justify-center gap-2`,children:[(0,M.jsx)(Ce,{}),(0,M.jsx)(`span`,{children:`暂无接入点,请添加`})]}),(0,M.jsxs)(`div`,{className:`flex flex-col sm:flex-row items-center gap-2 mt-4`,children:[(0,M.jsxs)(F,{className:`flex-1 flex items-center gap-2`,onClick:oe,children:[(0,M.jsx)(ye,{className:`size-4`}),(0,M.jsx)(`span`,{className:`text-sm sm:text-base`,children:`添加小智服务端接入点`})]}),(0,M.jsx)(F,{variant:`outline`,className:`flex-1 flex items-center gap-2`,onClick:()=>window.open(`https://xiaozhi.me/console/agents`,`_blank`),children:(0,M.jsx)(`span`,{className:`text-sm sm:text-base`,children:`打开小智服务端`})})]})]})]}),(0,M.jsx)(Yt,{open:n,onOpenChange:r,children:(0,M.jsxs)($t,{children:[(0,M.jsxs)(en,{children:[(0,M.jsx)(nn,{children:`确认删除接入点`}),(0,M.jsxs)(rn,{children:[`确定要删除接入点 "`,yn(i),`" 吗?此操作无法撤销。`]})]}),(0,M.jsxs)(tn,{children:[(0,M.jsx)(on,{disabled:o,children:`取消`}),(0,M.jsx)(an,{onClick:ie,disabled:o,className:`bg-destructive text-destructive-foreground hover:bg-destructive/90`,children:o?`删除中...`:`确定删除`})]})]})}),(0,M.jsx)(I,{open:c,onOpenChange:l,children:(0,M.jsxs)(L,{className:`sm:max-w-[500px]`,children:[(0,M.jsxs)(R,{children:[(0,M.jsx)(z,{children:`添加新的接入点`}),(0,M.jsx)(fn,{children:`请输入小智服务端接入点地址`})]}),(0,M.jsx)(`div`,{className:`grid gap-4 py-4`,children:(0,M.jsxs)(`div`,{className:`space-y-2`,children:[(0,M.jsx)(B,{placeholder:`请输入接入点地址,例如:wss://api.xiaozhi.me/mcp/?token=... 或 ws(s)://<hostname>:<port>`,value:u,onChange:e=>se(e.target.value),disabled:f,className:`font-mono text-sm`}),m&&(0,M.jsx)(`p`,{className:`text-sm text-red-500`,children:m})]})}),(0,M.jsxs)(dn,{children:[(0,M.jsx)(ln,{asChild:!0,children:(0,M.jsx)(F,{variant:`outline`,disabled:f,children:`取消`})}),(0,M.jsx)(F,{onClick:ae,disabled:f||!u.trim(),children:f?`添加中...`:`确定`})]})]})})]})}var Sn=O.forwardRef(({className:e,...t},n)=>(0,M.jsx)(`div`,{ref:n,className:N(`rounded-lg border bg-card text-card-foreground shadow-sm`,e),...t}));Sn.displayName=`Card`;var Cn=O.forwardRef(({className:e,...t},n)=>(0,M.jsx)(`div`,{ref:n,className:N(`flex flex-col space-y-1.5 p-6`,e),...t}));Cn.displayName=`CardHeader`;var wn=O.forwardRef(({className:e,...t},n)=>(0,M.jsx)(`div`,{ref:n,className:N(`text-2xl font-semibold leading-none tracking-tight`,e),...t}));wn.displayName=`CardTitle`;var Tn=O.forwardRef(({className:e,...t},n)=>(0,M.jsx)(`div`,{ref:n,className:N(`text-sm text-muted-foreground`,e),...t}));Tn.displayName=`CardDescription`;var En=O.forwardRef(({className:e,...t},n)=>(0,M.jsx)(`div`,{ref:n,className:N(`p-6 pt-0`,e),...t}));En.displayName=`CardContent`;var Dn=O.forwardRef(({className:e,...t},n)=>(0,M.jsx)(`div`,{ref:n,className:N(`flex items-center p-6 pt-0`,e),...t}));Dn.displayName=`CardFooter`;function On(){let e=hn(),t=Array.isArray(e)?e.length:+!!e;return(0,M.jsxs)(Sn,{className:`@container/card`,children:[(0,M.jsxs)(Cn,{className:`relative`,children:[(0,M.jsx)(Tn,{children:`小智接入点`}),(0,M.jsx)(wn,{className:`@[250px]/card:text-3xl text-2xl font-semibold tabular-nums`,children:t}),(0,M.jsx)(`div`,{className:`absolute right-4 top-4 flex flex-col items-center`,children:(0,M.jsx)(Kt,{showValue:!1,value:t,maxValue:Math.max(t,1),activeColor:`#16a34a`,inactiveColor:`#f87171`,size:30,symbol:``})})]}),(0,M.jsx)(Dn,{className:`flex-col items-end gap-1 text-sm`,children:(0,M.jsx)(xn,{})})]})}var kn=St(`text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70`),An=O.forwardRef(({className:e,...t},n)=>(0,M.jsx)(ie,{ref:n,className:N(kn(),e),...t}));An.displayName=ie.displayName;var jn=r,Mn=O.createContext({}),H=({...e})=>(0,M.jsx)(Mn.Provider,{value:{name:e.name},children:(0,M.jsx)(Ue,{...e})}),Nn=()=>{let e=O.useContext(Mn),t=O.useContext(Pn),{getFieldState:n,formState:r}=ne(),i=n(e.name,r);if(!e)throw Error(`useFormField should be used within <FormField>`);let{id:a}=t;return{id:a,name:e.name,formItemId:`${a}-form-item`,formDescriptionId:`${a}-form-item-description`,formMessageId:`${a}-form-item-message`,...i}},Pn=O.createContext({}),U=O.forwardRef(({className:e,...t},n)=>{let r=O.useId();return(0,M.jsx)(Pn.Provider,{value:{id:r},children:(0,M.jsx)(`div`,{ref:n,className:N(`space-y-2`,e),...t})})});U.displayName=`FormItem`;var W=O.forwardRef(({className:e,...t},n)=>{let{error:r,formItemId:i}=Nn();return(0,M.jsx)(An,{ref:n,className:N(r&&`text-destructive`,e),htmlFor:i,...t})});W.displayName=`FormLabel`;var G=O.forwardRef(({...e},t)=>{let{error:n,formItemId:r,formDescriptionId:i,formMessageId:a}=Nn();return(0,M.jsx)(p,{ref:t,id:r,"aria-describedby":n?`${i} ${a}`:`${i}`,"aria-invalid":!!n,...e})});G.displayName=`FormControl`;var Fn=O.forwardRef(({className:e,...t},n)=>{let{formDescriptionId:r}=Nn();return(0,M.jsx)(`p`,{ref:n,id:r,className:N(`text-sm text-muted-foreground`,e),...t})});Fn.displayName=`FormDescription`;var K=O.forwardRef(({className:e,children:t,...n},r)=>{let{error:i,formMessageId:a}=Nn(),o=i?String(i?.message??``):t;return o?(0,M.jsx)(`p`,{ref:r,id:a,className:N(`text-sm font-medium text-destructive`,e),...n,children:o}):null});K.displayName=`FormMessage`,new class{baseUrl;constructor(e){if(e)this.baseUrl=e;else{let e=window.location.protocol,t=window.location.hostname,n=window.location.port;this.baseUrl=`${e}//${t}${n?`:${n}`:``}`}}async request(e,t={}){let n=`${this.baseUrl}${e}`,r={headers:{"Content-Type":`application/json`,...t.headers}},i=await fetch(n,{...r,...t});if(!i.ok){let e=`HTTP ${i.status}: ${i.statusText}`;try{e=(await i.json()).error?.message||e}catch{}throw Error(e)}return i.json()}async fetchWorkspaces(){try{let e=await this.request(`/api/coze/workspaces`);if(!e.success||!e.data)throw Error(e.message||`获取工作空间列表失败`);return e.data}catch(e){throw console.error(`获取工作空间列表失败:`,e),e}}async fetchWorkflows(e){try{let t=new URLSearchParams;t.append(`workspace_id`,e.workspace_id),e.page_num!==void 0&&t.append(`page_num`,e.page_num.toString()),e.page_size!==void 0&&t.append(`page_size`,e.page_size.toString());let n=await this.request(`/api/coze/workflows?${t.toString()}`);if(!n.success||!n.data)throw Error(n.message||`获取工作流列表失败`);return n.data}catch(e){throw console.error(`获取工作流列表失败:`,e),e}}async clearCache(){try{let e=await this.request(`/api/coze/cache/clear`,{method:`POST`});if(!e.success)throw Error(e.message||`清除缓存失败`)}catch(e){throw console.error(`清除缓存失败:`,e),e}}async getCacheStats(){try{let e=await this.request(`/api/coze/cache/stats`);if(!e.success||!e.data)throw Error(e.message||`获取缓存统计失败`);return e.data}catch(e){throw console.error(`获取缓存统计失败:`,e),e}}};var q=new class{apiClient;webSocketManager;initialized=!1;constructor(){this.apiClient=k,this.webSocketManager=j}async initialize(){this.initialized||(console.log(`[NetworkService] 初始化网络服务`),this.webSocketManager.connect(),this.initialized=!0,console.log(`[NetworkService] 网络服务初始化完成`))}destroy(){console.log(`[NetworkService] 销毁网络服务`),this.webSocketManager.disconnect(),this.initialized=!1}async getConfig(){return this.apiClient.getConfig()}async updateConfig(e){return this.apiClient.updateConfig(e)}async getStatus(){return this.apiClient.getStatus()}async getClientStatus(){return this.apiClient.getClientStatus()}async restartService(){return this.apiClient.restartService()}async stopService(){return this.apiClient.stopService()}async startService(){return this.apiClient.startService()}async getServiceStatus(){return this.apiClient.getServiceStatus()}async getServiceHealth(){return this.apiClient.getServiceHealth()}async getMcpEndpoint(){return this.apiClient.getMcpEndpoint()}async getMcpEndpoints(){return this.apiClient.getMcpEndpoints()}async getMcpServers(){return this.apiClient.getMcpServers()}async getConnectionConfig(){return this.apiClient.getConnectionConfig()}async reloadConfig(){return this.apiClient.reloadConfig()}async getConfigPath(){return this.apiClient.getConfigPath()}async checkConfigExists(){return this.apiClient.checkConfigExists()}async getRestartStatus(){return this.apiClient.getRestartStatus()}async checkClientConnected(){return this.apiClient.checkClientConnected()}async getLastHeartbeat(){return this.apiClient.getLastHeartbeat()}async getActiveMCPServers(){return this.apiClient.getActiveMCPServers()}async updateClientStatus(e){return this.apiClient.updateClientStatus(e)}async setActiveMCPServers(e){return this.apiClient.setActiveMCPServers(e)}async resetStatus(){return this.apiClient.resetStatus()}getWebSocketState(){return this.webSocketManager.getState()}isWebSocketConnected(){return this.webSocketManager.isConnected()}setWebSocketUrl(e){this.webSocketManager.setUrl(e)}onWebSocketEvent(e,t){return this.webSocketManager.subscribe(e,t)}reconnectWebSocket(){this.webSocketManager.disconnect(),setTimeout(()=>{this.webSocketManager.connect()},1e3)}send(e){return this.webSocketManager.send(e)}async getFullAppState(){let[e,t]=await Promise.all([this.getConfig(),this.getStatus()]);return{config:e,status:t,webSocketConnected:this.isWebSocketConnected()}}async updateConfigWithNotification(e,t=5e3){return new Promise((n,r)=>{let i=this.webSocketManager.subscribe(`data:configUpdate`,()=>{clearTimeout(a),i(),n()}),a=setTimeout(()=>{i(),r(Error(`等待配置更新通知超时`))},t);this.updateConfig(e).catch(e=>{clearTimeout(a),i?.(),r(e)})})}async restartServiceWithNotification(e=3e4){return new Promise((t,n)=>{let r=this.webSocketManager.subscribe(`data:restartStatus`,e=>{e.status===`completed`?(clearTimeout(i),r(),t()):e.status===`failed`&&(clearTimeout(i),r(),n(Error(e.error||`服务重启失败`)))}),i=setTimeout(()=>{r(),n(Error(`等待重启状态通知超时`))},e);this.restartService().catch(e=>{clearTimeout(i),r?.(),n(e)})})}},In={connectionState:A.DISCONNECTED,wsUrl:``,connectionStats:{reconnectAttempts:0,maxReconnectAttempts:5,lastHeartbeat:0,eventListenerCount:0},portChangeStatus:void 0,lastError:null,connectedAt:null,disconnectedAt:null},Ln=le()(C((e,t)=>({...In,setConnectionState:n=>{console.log(`[WebSocketStore] 更新连接状态:`,n);let r=Date.now(),i={connectionState:n};n===A.CONNECTED?(i.connectedAt=r,i.lastError=null):n===A.DISCONNECTED&&(i.disconnectedAt=r),e(i,!1,`setConnectionState`);let a=j.getConnectionStats();t().setConnectionStats(a)},setWsUrl:t=>{console.log(`[WebSocketStore] 更新 WebSocket URL:`,t),e({wsUrl:t},!1,`setWsUrl`)},setConnectionStats:t=>{e({connectionStats:t},!1,`setConnectionStats`)},setLastError:t=>{console.log(`[WebSocketStore] 更新连接错误:`,t?.message),e({lastError:t},!1,`setLastError`)},setPortChangeStatus:t=>{console.log(`[WebSocketStore] 更新端口变更状态:`,t?.status),e({portChangeStatus:t},!1,`setPortChangeStatus`)},connect:async()=>{try{console.log(`[WebSocketStore] 开始连接 WebSocket`),j.connect()}catch(e){let n=e instanceof Error?e:Error(`连接失败`);throw console.error(`[WebSocketStore] 连接失败:`,n),t().setLastError(n),n}},disconnect:()=>{console.log(`[WebSocketStore] 断开 WebSocket 连接`),j.disconnect()},reconnect:async()=>{try{console.log(`[WebSocketStore] 重新连接 WebSocket`),j.disconnect(),await new Promise(e=>setTimeout(e,It)),j.connect()}catch(e){let n=e instanceof Error?e:Error(`重连失败`);throw console.error(`[WebSocketStore] 重连失败:`,n),t().setLastError(n),n}},send:e=>{try{return j.send(e)}catch(e){let n=e instanceof Error?e:Error(`发送消息失败`);return console.error(`[WebSocketStore] 发送消息失败:`,n),t().setLastError(n),!1}},updateUrl:e=>{console.log(`[WebSocketStore] 更新 WebSocket URL:`,e),j.setUrl(e),t().setWsUrl(e)},getConnectionInfo:()=>{let e=t();return{state:e.connectionState,url:e.wsUrl,stats:e.connectionStats,isConnected:e.connectionState===A.CONNECTED}},reset:()=>{console.log(`[WebSocketStore] 重置状态`),e(In,!1,`reset`)},initialize:()=>{console.log(`[WebSocketStore] 初始化 WebSocket Store`),j.subscribe(`connection:connecting`,()=>{t().setConnectionState(A.CONNECTING)}),j.subscribe(`connection:connected`,()=>{t().setConnectionState(A.CONNECTED)}),j.subscribe(`connection:disconnected`,()=>{t().setConnectionState(A.DISCONNECTED)}),j.subscribe(`connection:reconnecting`,()=>{t().setConnectionState(A.RECONNECTING);let e=j.getConnectionStats();t().setConnectionStats(e)}),j.subscribe(`connection:error`,({error:e})=>{t().setLastError(e)}),j.subscribe(`system:heartbeat`,()=>{let e=j.getConnectionStats();t().setConnectionStats(e)});let e=j.getConnectionStats();t().setConnectionStats(e),t().setWsUrl(j.getUrl()),console.log(`[WebSocketStore] WebSocket Store 初始化完成`)},setConnected:e=>{console.warn(`[WebSocketStore] setConnected 方法已废弃,请使用 setConnectionState`);let n=e?A.CONNECTED:A.DISCONNECTED;t().setConnectionState(n)}}),{name:`websocket-store`})),Rn=()=>Ln(e=>e.connectionState===A.CONNECTED),zn=()=>Ln(e=>e.wsUrl),Bn=()=>Ln(e=>e.portChangeStatus),Vn=()=>Ln(v(e=>({setConnectionState:e.setConnectionState,setWsUrl:e.setWsUrl,setConnectionStats:e.setConnectionStats,setLastError:e.setLastError,setPortChangeStatus:e.setPortChangeStatus,connect:e.connect,disconnect:e.disconnect,reconnect:e.reconnect,send:e.send,updateUrl:e.updateUrl,reset:e.reset,initialize:e.initialize,getConnectionInfo:e.getConnectionInfo,setConnected:e.setConnected})));function Hn(){let e=Vn(),t=(0,O.useRef)(!1);(0,O.useEffect)(()=>{if(t.current)return;console.log(`[NetworkService] 初始化网络服务`),t.current=!0,q.initialize().catch(e=>{console.error(`[NetworkService] 初始化失败:`,e)});let r=[q.onWebSocketEvent(`connection:connected`,()=>{console.log(`[NetworkService] WebSocket 已连接`),e.setConnectionState(A.CONNECTED),n()}),q.onWebSocketEvent(`connection:disconnected`,()=>{console.log(`[NetworkService] WebSocket 已断开`),e.setConnectionState(A.DISCONNECTED)}),q.onWebSocketEvent(`data:configUpdate`,e=>{console.log(`[NetworkService] 收到配置更新通知`),V.getState().setConfig(e,`websocket`)}),q.onWebSocketEvent(`data:statusUpdate`,e=>{console.log(`[NetworkService] 收到状态更新通知`),Vt.getState().setClientStatus(e,`websocket`)}),q.onWebSocketEvent(`data:restartStatus`,e=>{console.log(`[NetworkService] 收到重启状态通知:`,e),Vt.getState().setRestartStatus(e,`websocket`)}),q.onWebSocketEvent(`system:error`,({error:e})=>{console.error(`[NetworkService] WebSocket 错误:`,e);let t=`WebSocket 连接错误: ${e.message}`;Vt.getState().setError(Error(t)),e.message.includes(`ECONNREFUSED`)||e.message.includes(`连接被拒绝`)?console.warn(`[NetworkService] 连接被拒绝,可能是服务未启动`):e.message.includes(`timeout`)||e.message.includes(`超时`)?console.warn(`[NetworkService] 连接超时,请检查网络连接`):console.warn(`[NetworkService] 未知的 WebSocket 错误:`,e)})];return()=>{console.log(`[NetworkService] 清理网络服务`);for(let e of r)try{e?.()}catch(e){console.error(`[NetworkService] 清理事件监听器失败:`,e)}q.destroy(),t.current=!1}},[e]);let n=(0,O.useCallback)(async()=>{try{console.log(`[NetworkService] 加载初始数据`);let[e,t]=await Promise.all([q.getConfig(),q.getClientStatus()]);console.log(`[NetworkService] 初始数据加载成功`),V.getState().setConfig(e,`http`),Vt.getState().setClientStatus(t,`http`)}catch(e){console.error(`[NetworkService] 加载初始数据失败:`,e)}},[]),r=(0,O.useCallback)(async()=>{try{let e=await q.getConfig();return V.getState().setConfig(e,`http`),e}catch(e){throw console.error(`[NetworkService] 获取配置失败:`,e),e}},[]),i=(0,O.useCallback)(async e=>{try{console.log(`[NetworkService] 更新配置`),await q.updateConfig(e),V.getState().setConfig(e,`http`),console.log(`[NetworkService] 配置更新成功`)}catch(e){throw console.error(`[NetworkService] 配置更新失败:`,e),e}},[]),a=(0,O.useCallback)(async()=>{try{let e=await q.getStatus();return Vt.getState().setClientStatus(e.client,`http`),e}catch(e){throw console.error(`[NetworkService] 获取状态失败:`,e),e}},[]),o=(0,O.useCallback)(async()=>{try{await a()}catch(e){console.error(`[NetworkService] 刷新状态失败:`,e)}},[a]),s=(0,O.useCallback)(async()=>{try{console.log(`[NetworkService] 重启服务`),await q.restartService(),console.log(`[NetworkService] 重启请求已发送`)}catch(e){throw console.error(`[NetworkService] 重启服务失败:`,e),e}},[]),c=(0,O.useCallback)(async(e=3e4)=>{try{console.log(`[NetworkService] 重启服务并等待通知`),await q.restartServiceWithNotification(e),console.log(`[NetworkService] 服务重启完成`)}catch(e){throw console.error(`[NetworkService] 重启服务失败:`,e),e}},[]),l=(0,O.useCallback)(async(e,t=5e3)=>{try{console.log(`[NetworkService] 更新配置并等待通知`),await q.updateConfigWithNotification(e,t),console.log(`[NetworkService] 配置更新完成`)}catch(e){throw console.error(`[NetworkService] 配置更新失败:`,e),e}},[]),u=(0,O.useCallback)(t=>{console.log(`[NetworkService] 设置自定义 WebSocket URL:`,t),q.setWebSocketUrl(t),e.setWsUrl(t)},[e]),d=(0,O.useCallback)(async t=>{try{console.log(`[NetworkService] 切换到端口 ${t}`),e.setPortChangeStatus({status:`checking`,targetPort:t,timestamp:Date.now()});let n=`${window.location.protocol===`https:`?`wss:`:`ws:`}//${window.location.hostname}:${t}`;await s(),await new Promise(e=>setTimeout(e,5e3)),u(n),window.location.reload()}catch(n){throw console.error(`[NetworkService] 端口切换失败:`,n),e.setPortChangeStatus({status:`failed`,targetPort:t,error:n instanceof Error?n.message:`端口切换失败`,timestamp:Date.now()}),n}},[e,s,u]);return{getConfig:r,updateConfig:i,getStatus:a,refreshStatus:o,restartService:s,updateConfigWithNotification:l,restartServiceWithNotification:c,setCustomWsUrl:u,getWebSocketUrl:(0,O.useCallback)(()=>{let e=localStorage.getItem(`xiaozhi-ws-url`);if(e)return e;let t=window.location.protocol===`https:`?`wss:`:`ws:`,n=window.location.hostname,r=window.location.port;return`${t}//${n}${r?`:${r}`:``}`},[]),changePort:d,loadInitialData:n,isWebSocketConnected:()=>q.isWebSocketConnected(),getWebSocketState:()=>q.getWebSocketState()}}async function Un(){console.log(`[Stores] 开始初始化所有 stores`);try{console.log(`[Stores] 初始化 WebSocket store`),Ln.getState().initialize(),console.log(`[Stores] 初始化配置 store`),await V.getState().initialize(),console.log(`[Stores] 初始化 MCP 服务器状态`),await V.getState().refreshMcpServerStatuses(),console.log(`[Stores] 初始化状态 store`),await Vt.getState().initialize(),console.log(`[Stores] 所有 stores 初始化完成`)}catch(e){throw console.error(`[Stores] Stores 初始化失败:`,e),e}}var Wn=(0,O.createContext)(null);function Gn({children:e}){let t=Hn(),[n,r]=(0,O.useState)(!1);return(0,O.useEffect)(()=>{let e=!0;return(async()=>{try{console.log(`[WebSocketProvider] 开始初始化 stores`),await Un(),e&&(r(!0),console.log(`[WebSocketProvider] Stores 初始化完成`))}catch(t){console.error(`[WebSocketProvider] Stores 初始化失败:`,t),e&&r(!0)}})(),()=>{e=!1}},[]),n?(0,M.jsx)(Wn.Provider,{value:t,children:e}):(0,M.jsx)(`div`,{className:`flex items-center justify-center min-h-screen`,children:(0,M.jsxs)(`div`,{className:`text-center`,children:[(0,M.jsx)(`div`,{className:`animate-spin rounded-full h-8 w-8 border-b-2 border-blue-600 mx-auto mb-2`}),(0,M.jsx)(`p`,{className:`text-sm text-gray-600`,children:`正在初始化应用...`})]})})}function Kn(){let e=(0,O.useContext)(Wn);if(!e)throw Error(`useNetworkServiceActions must be used within a NetworkServiceProvider`);return e}var qn=Gn,Jn=Kn,Yn=D.object({port:D.string().min(1,{message:`端口号不能为空`}).refine(e=>!Number.isNaN(Number(e)),{message:`请输入有效的数字`}).refine(e=>Number(e)>=1&&Number(e)<=65535,{message:`端口号必须在 1-65535 之间`}).refine(e=>Number.isInteger(Number(e)),{message:`端口号必须是整数`})});function Xn(){let[e,t]=(0,O.useState)(!1),[n,r]=(0,O.useState)(!1),i=mn(),a=Rn(),o=Bn(),{changePort:s}=Kn(),l=w({resolver:c(Yn),defaultValues:{port:`9999`}});(0,O.useEffect)(()=>{i?.webUI?.port&&l.reset({port:i.webUI.port.toString()})},[i,l]);let u=()=>{if(n)return`处理中...`;if(o?.status===`checking`)return`检测端口...`;if(o?.status===`polling`){let{currentAttempt:e,maxAttempts:t}=o;return`等待服务重启 (${e||0}/${t||45})`}return o?.status===`connecting`?`连接中...`:a?`保存并重启`:`保存并连接`};async function d(e){let n=Number(e.port),o=i?.webUI?.port;if(n===o){t(!1);return}console.log(`[WebUrlSettingButton] 开始端口切换: ${o} -> ${n}`),r(!0);try{E.info(a?`正在将端口从 ${o} 切换到 ${n}...`:`正在连接到端口 ${n}...`),await s(n),E.success(a?`端口已成功切换到 ${n},页面即将刷新...`:`已成功连接到端口 ${n},页面即将刷新...`),t(!1)}catch(e){console.error(`端口切换失败:`,e);let t=e instanceof Error?e.message:`端口切换失败`;E.error(`端口切换失败: ${t}`)}finally{r(!1)}}return(0,M.jsxs)(I,{open:e,onOpenChange:t,children:[(0,M.jsx)(sn,{asChild:!0,children:(0,M.jsx)(F,{variant:`secondary`,size:`icon`,className:`size-8`,children:(0,M.jsx)(me,{className:`h-4 w-4`})})}),(0,M.jsx)(L,{className:`sm:max-w-[250px]`,children:(0,M.jsx)(jn,{...l,children:(0,M.jsxs)(`form`,{onSubmit:l.handleSubmit(d),children:[(0,M.jsxs)(R,{className:`mb-4`,children:[(0,M.jsx)(z,{children:`配置服务端端口`}),(0,M.jsx)(fn,{children:a?`修改端口后将自动重启服务并重新连接。`:`请输入服务端端口号,系统将尝试连接。`})]}),(0,M.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,M.jsxs)(`div`,{children:[`ws://`,window.location.hostname,`:`]}),(0,M.jsx)(`div`,{className:`w-[100px]`,children:(0,M.jsx)(H,{control:l.control,name:`port`,render:({field:e})=>(0,M.jsxs)(U,{children:[(0,M.jsx)(G,{children:(0,M.jsx)(B,{placeholder:`服务端端口,默认9999`,className:`font-mono text-sm`,disabled:n,type:`number`,...e})}),(0,M.jsx)(K,{})]})})})]}),(0,M.jsxs)(dn,{className:`mt-4`,children:[(0,M.jsx)(ln,{asChild:!0,children:(0,M.jsx)(F,{variant:`outline`,disabled:n,children:`取消`})}),(0,M.jsx)(F,{type:`submit`,disabled:n||o?.status===`polling`,children:u()})]})]})})})]})}function Zn(){let e=Rn(),t=zn();return(0,M.jsxs)(Sn,{className:`@container/card`,children:[(0,M.jsxs)(Cn,{className:`relative`,children:[(0,M.jsx)(Tn,{children:`Xiaozhi Client`}),(0,M.jsx)(wn,{className:`@[250px]/card:text-3xl text-2xl font-semibold tabular-nums`,children:e?`已连接`:`未连接`}),(0,M.jsx)(`div`,{className:`absolute right-4 top-4`,children:(0,M.jsx)(Kt,{showValue:!1,value:1,maxValue:1,activeColor:e?`#16a34a`:`#f87171`,inactiveColor:e?`#16a34a`:`#f87171`,size:30,symbol:``})})]}),(0,M.jsxs)(Dn,{className:`flex items-center justify-between gap-1 text-sm`,children:[(0,M.jsx)(`div`,{className:`text-muted-foreground`,children:t}),(0,M.jsx)(Xn,{})]})]})}var Qn=Ee,$n=$e,er=fe,J=O.forwardRef(({className:e,children:t,...n},r)=>(0,M.jsxs)(pt,{ref:r,className:N(`flex h-10 w-full items-center justify-between rounded-md border border-input bg-background px-3 py-2 text-sm ring-offset-background data-[placeholder]:text-muted-foreground focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 [&>span]:line-clamp-1`,e),...n,children:[t,(0,M.jsx)(qe,{asChild:!0,children:(0,M.jsx)(Je,{className:`h-4 w-4 opacity-50`})})]}));J.displayName=pt.displayName;var tr=O.forwardRef(({className:e,...t},n)=>(0,M.jsx)(ue,{ref:n,className:N(`flex cursor-default items-center justify-center py-1`,e),...t,children:(0,M.jsx)(je,{className:`h-4 w-4`})}));tr.displayName=ue.displayName;var nr=O.forwardRef(({className:e,...t},n)=>(0,M.jsx)(ht,{ref:n,className:N(`flex cursor-default items-center justify-center py-1`,e),...t,children:(0,M.jsx)(Je,{className:`h-4 w-4`})}));nr.displayName=ht.displayName;var Y=O.forwardRef(({className:e,children:t,position:n=`popper`,...r},i)=>(0,M.jsx)(_t,{children:(0,M.jsxs)(Ne,{ref:i,className:N(`relative z-50 max-h-[--radix-select-content-available-height] min-w-[8rem] overflow-y-auto overflow-x-hidden rounded-md border bg-popover 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 origin-[--radix-select-content-transform-origin]`,n===`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`,e),position:n,...r,children:[(0,M.jsx)(tr,{}),(0,M.jsx)(u,{className:N(`p-1`,n===`popper`&&`h-[var(--radix-select-trigger-height)] w-full min-w-[var(--radix-select-trigger-width)]`),children:t}),(0,M.jsx)(nr,{})]})}));Y.displayName=Ne.displayName;var rr=O.forwardRef(({className:e,...t},n)=>(0,M.jsx)(dt,{ref:n,className:N(`py-1.5 pl-8 pr-2 text-sm font-semibold`,e),...t}));rr.displayName=dt.displayName;var X=O.forwardRef(({className:e,children:t,...n},r)=>(0,M.jsxs)(Le,{ref:r,className:N(`relative flex w-full cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50`,e),...n,children:[(0,M.jsx)(`span`,{className:`absolute left-2 flex h-3.5 w-3.5 items-center justify-center`,children:(0,M.jsx)(Fe,{children:(0,M.jsx)(Re,{className:`h-4 w-4`})})}),(0,M.jsx)(Se,{children:t})]}));X.displayName=Le.displayName;var ir=O.forwardRef(({className:e,...t},n)=>(0,M.jsx)(o,{ref:n,className:N(`-mx-1 my-1 h-px bg-muted`,e),...t}));ir.displayName=o.displayName;var ar=O.forwardRef(({className:e,...t},n)=>(0,M.jsx)(`textarea`,{className:N(`flex min-h-[80px] w-full rounded-md border border-input bg-background px-3 py-2 text-base ring-offset-background 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 md:text-sm`,e),ref:n,...t}));ar.displayName=`Textarea`;function or(e,t,n){let{name:r,type:i,label:a,required:o,placeholder:s,description:c,condition:l,options:u,inputType:d}=e;if(l&&!l(t))return null;let f=n??e.disabled,p=t=>{switch(i){case`text`:return(0,M.jsx)(B,{...t,type:d,placeholder:s,disabled:f,className:e.className});case`textarea`:return(0,M.jsx)(ar,{...t,placeholder:s,className:e.className,rows:e.rows,disabled:f});case`select`:return(0,M.jsxs)(Qn,{value:t.value,onValueChange:t.onChange,disabled:f,children:[(0,M.jsx)(J,{children:(0,M.jsx)(er,{placeholder:s})}),(0,M.jsx)(Y,{children:u?.map(e=>(0,M.jsx)(X,{value:e.value,children:e.label},e.value))})]});default:return null}};return(0,M.jsx)(H,{control:t.control,name:String(r),render:({field:e})=>(0,M.jsxs)(U,{children:[(0,M.jsxs)(W,{children:[o&&(0,M.jsx)(`span`,{className:`text-red-500 mr-1`,children:`*`}),a]}),(0,M.jsx)(G,{children:p(e)}),typeof c==`function`?(0,M.jsx)(Fn,{children:c(t)}):c?(0,M.jsx)(Fn,{children:c}):null,(0,M.jsx)(K,{})]})},String(r))}function sr(e,t,n,r){let{name:i,type:a,label:o,required:s,placeholder:c,description:l,options:u}=e;return a===`select`?(0,M.jsx)(H,{control:t.control,name:String(i),render:({field:i})=>(0,M.jsxs)(U,{children:[(0,M.jsxs)(W,{children:[s&&(0,M.jsx)(`span`,{className:`text-red-500 mr-1`,children:`*`}),o]}),(0,M.jsx)(G,{children:(0,M.jsxs)(Qn,{value:i.value,onValueChange:n,disabled:r??e.disabled,children:[(0,M.jsx)(J,{children:(0,M.jsx)(er,{placeholder:c})}),(0,M.jsx)(Y,{children:u?.map(e=>(0,M.jsx)(X,{value:e.value,children:e.label},e.value))})]})}),typeof l==`function`?(0,M.jsx)(Fn,{children:l(t)}):l?(0,M.jsx)(Fn,{children:l}):null,(0,M.jsx)(K,{})]})},String(i)):(console.warn(`renderSelectFieldWithHandler 只能用于 select 类型字段`),or(e,t,r))}var cr=[{name:`type`,type:`select`,label:`MCP 类型`,required:!0,placeholder:`选择 MCP 类型`,description:e=>{let t=e.watch(`type`);return t===`stdio`?`本地通过命令行启动的 MCP 服务`:t===`http`?`通过 HTTP 协议访问的远程 MCP 服务`:t===`sse`?`通过 SSE 协议访问的远程 MCP 服务`:``},options:[{value:`stdio`,label:`本地进程 (stdio)`},{value:`http`,label:`远程服务 (HTTP)`},{value:`sse`,label:`服务器推送 (SSE)`}]},{name:`name`,type:`text`,label:`MCP 名称`,required:!0,placeholder:`例如: xxx-mcp`,description:`服务的唯一标识符,建议使用小写字母和连字符`},{name:`command`,type:`text`,label:`启动命令`,required:!0,placeholder:`例如: npx -y xxx`,description:`完整的启动命令,空格分隔命令和参数`,condition:e=>e.watch(`type`)===`stdio`},{name:`env`,type:`textarea`,label:`环境变量 (可选)`,placeholder:`KEY1=value1
2
+ KEY2=value2`,description:`每行一个环境变量,支持 KEY=value 或 KEY: value 格式`,className:`min-h-[100px] font-mono text-sm`,condition:e=>e.watch(`type`)===`stdio`},{name:`url`,type:`text`,label:`服务地址`,required:!0,inputType:`url`,placeholder:`https://example.com/mcp`,description:`MCP 服务的完整 URL 地址`,condition:e=>{let t=e.watch(`type`);return t===`http`||t===`sse`}},{name:`headers`,type:`textarea`,label:`请求头 (可选)`,placeholder:`Authorization: Bearer your-key
3
+ Content-Type: application/json`,description:`每行一个请求头,格式: Header-Name: value`,className:`min-h-[100px] font-mono text-sm`,condition:e=>{let t=e.watch(`type`);return t===`http`||t===`sse`}}],lr=Dt().trim(),ur=Dt().min(1,`MCP 名称不能为空`).regex(/^[a-z0-9]([a-z0-9-]*[a-z0-9])?$/,`MCP 名称只能包含小写字母、数字和连字符,且必须以字母或数字开头和结尾`),dr=jt(`type`,[kt({type:Nt(`stdio`),name:ur,command:Dt().min(1,`启动命令不能为空`),env:lr}),kt({type:Nt(`http`),name:ur,url:Dt().url(`请输入有效的 URL 地址`),headers:lr}),kt({type:Nt(`sse`),name:ur,url:Dt().url(`请输入有效的 URL 地址`),headers:lr})]);function fr({form:e,defaultValues:t,onSubmit:n,disabled:r=!1,submitText:i=`保存配置`}){let a=e||w({resolver:c(dr),defaultValues:t||{type:`stdio`,name:``,command:``,env:``}}),o=e=>{a.setValue(`type`,e);let t=a;e===`stdio`?(t.setValue(`url`,``),t.setValue(`headers`,``)):(t.setValue(`command`,``),t.setValue(`env`,``))};return(0,M.jsx)(jn,{...a,children:(0,M.jsxs)(`form`,{onSubmit:a.handleSubmit(n),className:`space-y-4 py-2`,children:[cr.map(e=>e.name===`type`?sr(e,a,o,r):or(e,a,r)),(0,M.jsx)(F,{type:`submit`,className:`w-full`,disabled:r,children:i})]})})}var pr=lt,mr=O.forwardRef(({className:e,...t},n)=>(0,M.jsx)(Ge,{ref:n,className:N(`inline-flex h-10 items-center justify-center rounded-md bg-muted p-1 text-muted-foreground`,e),...t}));mr.displayName=Ge.displayName;var hr=O.forwardRef(({className:e,...t},n)=>(0,M.jsx)(Ae,{ref:n,className:N(`inline-flex items-center justify-center whitespace-nowrap rounded-sm px-3 py-1.5 text-sm font-medium ring-offset-background transition-all 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-sm`,e),...t}));hr.displayName=Ae.displayName;var gr=O.forwardRef(({className:e,...t},n)=>(0,M.jsx)(Oe,{ref:n,className:N(`mt-2 ring-offset-background focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2`,e),...t}));gr.displayName=Oe.displayName;function _r(e){let t=e.trim();if(!t)throw Error(`命令不能为空`);let n=[],r=``,i=!1,a=``;for(let e=0;e<t.length;e++){let o=t[e];(o===`"`||o===`'`)&&(e===0||t[e-1]!==`\\`)?i&&o===a?(i=!1,a=``):i?r+=o:(i=!0,a=o):o===` `&&!i?r&&=(n.push(r),``):r+=o}if(r&&n.push(r),n.length===0)throw Error(`命令不能为空`);return{command:n[0],args:n.slice(1)}}function vr(e){if(e.length>=2){let t=e[0],n=e[e.length-1];if(t===`"`&&n===`"`||t===`'`&&n===`'`)return e.slice(1,-1)}return e}function yr(e){let t={};for(let n of e.split(`
4
+ `)){let e=n.trim();if(!e||e.startsWith(`#`))continue;let r=e.indexOf(`=`);if(r>0){let n=e.slice(0,r).trim(),i=e.slice(r+1).trim();i=vr(i),t[n]=i;continue}let i=e.indexOf(`:`);if(i>0){let n=e.slice(0,i).trim(),r=e.slice(i+1).trim();r=vr(r),t[n]=r}}return t}function br(e){let{command:t,args:n}=_r(e.command),r=yr(e.env),i={command:t,args:n};return Object.keys(r).length>0&&(i.env=r),i}function xr(e){let t=yr(e.headers),n={type:`streamable-http`,url:e.url};return Object.keys(t).length>0&&(n.headers=t),n}function Sr(e){let t=yr(e.headers),n={type:`sse`,url:e.url};return Object.keys(t).length>0&&(n.headers=t),n}function Cr(e){let{name:t,type:n}=e,r;switch(n){case`stdio`:r=br(e);break;case`http`:r=xr(e);break;case`sse`:r=Sr(e);break;default:throw Error(`不支持的 MCP 类型`)}return{name:t,config:r}}function wr(e){return`command`in e?`stdio`:`type`in e&&e.type===`sse`?`sse`:`http`}function Tr(e){let t=[e.command];return e.args&&e.args.length>0&&t.push(...e.args),t.join(` `)}function Er(e){return!e||Object.keys(e).length===0?``:Object.entries(e).map(([e,t])=>`${e}: ${t}`).join(`
5
+ `)}function Dr(e,t){let n=t;return{type:`stdio`,name:e,command:Tr(n),env:Er(n.env)}}function Or(e,t){let n=t;return{type:`http`,name:e,url:n.url,headers:Er(n.headers)}}function kr(e,t){let n=t;return{type:`sse`,name:e,url:n.url,headers:Er(n.headers)}}function Ar(e,t){switch(wr(t)){case`stdio`:return Dr(e,t);case`http`:return Or(e,t);case`sse`:return kr(e,t);default:throw Error(`无法识别的 MCP 类型`)}}function jr(e){try{let t=JSON.parse(e);if(t.mcpServers&&typeof t.mcpServers==`object`){let e=Object.entries(t.mcpServers);if(e.length===0)return null;let[n,r]=e[0];return Ar(n,r)}if(typeof t==`object`&&t&&(`command`in t||`type`in t||`url`in t)){let e;return e=`command`in t&&t.command?t.command.split(`/`).pop()||`mcp-server`:`type`in t&&t.type===`sse`?`sse-server`:`http-server`,Ar(e,t)}return null}catch{return null}}function Mr(e){let{name:t,config:n}=Cr(e);return JSON.stringify({mcpServers:{[t]:n}},null,2)}function Nr(e,t){if(!t||typeof t!=`object`)return{valid:!1,error:`服务 "${e}" 的配置必须是一个对象`};let n=t,r=`command`in n,i=`type`in n,a=`url`in n;if(r){if(!n.command||typeof n.command!=`string`)return{valid:!1,error:`服务 "${e}" 缺少必需的 command 字段或字段类型不正确`};if(!Array.isArray(n.args))return{valid:!1,error:`服务 "${e}" 的 args 字段必须是数组`}}else if(i&&n.type===`sse`){if(!n.url||typeof n.url!=`string`)return{valid:!1,error:`服务 "${e}" 缺少必需的 url 字段或字段类型不正确`}}else if(a){if(!n.url||typeof n.url!=`string`)return{valid:!1,error:`服务 "${e}" 缺少必需的 url 字段或字段类型不正确`}}else return{valid:!1,error:`服务 "${e}" 的配置无效: 必须包含 command 字段(stdio)、type: 'sse' 字段(sse)或 url 字段(streamable-http)`};return{valid:!0}}function Pr(e){try{let t=e.trim();if(!t)return{success:!1,error:`配置不能为空`};let n=JSON.parse(t),r;if(n.mcpServers&&typeof n.mcpServers==`object`)r=n.mcpServers;else if(typeof n==`object`&&!Array.isArray(n)){let e=`command`in n,t=`type`in n,i=`url`in n;if(e||t||i)r={[e?String(n.command).split(`/`).pop()||`mcp-server`:t&&n.type===`sse`?`sse-server`:`http-server`]:n};else return{success:!1,error:`配置格式错误: 必须是对象格式`}}else return{success:!1,error:`配置格式错误: 必须是对象格式`};for(let[e,t]of Object.entries(r)){let n=Nr(e,t);if(!n.valid)return{success:!1,error:n.error}}return{success:!0,data:r}}catch(e){return{success:!1,error:`JSON 格式错误: ${e instanceof Error?e.message:`无法解析 JSON`}`}}}var Fr=D.object({config:D.string().min(2,{message:`配置不能为空`})});function Ir(){let[e,t]=(0,O.useState)(!1),[n,r]=(0,O.useState)(!1),[i,a]=(0,O.useState)(`form`),[o,s]=(0,O.useState)(``),l=w({resolver:c(dr),defaultValues:{type:`stdio`,name:``,command:``,env:``}}),u=w({resolver:c(Fr),defaultValues:{config:``}}),d=(0,O.useCallback)(e=>{e||(l.reset(),u.reset(),s(``),a(`form`)),t(e)},[l,u]),f=(0,O.useCallback)(e=>{if(!(e!==`form`&&e!==`json`)){if(e===`json`&&i===`form`){let e=l.getValues();try{s(Mr(e))}catch{s(``)}}else if(e===`form`&&i===`json`){let e=jr(o);e&&l.reset(e)}a(e)}},[i,l,o]),p=(0,O.useCallback)(async e=>{r(!0);try{let{name:n,config:r}=Cr(e);if((await k.listMCPServers()).servers.some(e=>e.name===n)){E.error(`服务名称 "${n}" 已存在`);return}if(!await k.addMCPServer(n,r))throw Error(`添加服务器失败`);E.success(`已添加 MCP 服务 "${n}"`),l.reset(),t(!1)}catch(e){console.error(`更新配置失败:`,e),E.error(e instanceof Error?e.message:`更新配置失败`)}finally{r(!1)}},[l]),m=(0,O.useCallback)(async e=>{r(!0);try{let n=Pr(e.config);if(!n.success){E.error(n.error||`配置验证失败`);return}let r=n.data,i=await k.listMCPServers(),a=Object.keys(r).filter(e=>i.servers.some(t=>t.name===e));if(a.length>0){E.error(`服务名称冲突: 以下服务已存在: ${a.join(`, `)}`);return}for(let[e,t]of Object.entries(r))if(!await k.addMCPServer(e,t))throw Error(`添加服务器失败`);let o=Object.keys(r).length;E.success(o===1?`已添加 MCP 服务 "${Object.keys(r)[0]}"`:`已添加 ${o} 个 MCP 服务`),u.reset(),t(!1)}catch(e){console.error(`更新配置失败:`,e),E.error(e instanceof Error?e.message:`更新配置失败`)}finally{r(!1)}},[u]);return(0,M.jsxs)(I,{open:e,onOpenChange:d,children:[(0,M.jsx)(sn,{asChild:!0,children:(0,M.jsx)(F,{variant:`secondary`,size:`icon`,className:`size-8`,"aria-label":`添加MCP服务`,title:`添加MCP服务`,children:(0,M.jsx)(ye,{className:`size-4`})})}),(0,M.jsxs)(L,{className:`sm:max-w-[600px]`,children:[(0,M.jsxs)(R,{className:`mb-4`,children:[(0,M.jsx)(z,{children:`添加MCP服务`}),(0,M.jsx)(fn,{children:`添加后,需要重启服务才会生效。`})]}),(0,M.jsxs)(pr,{value:i,onValueChange:f,children:[(0,M.jsxs)(mr,{className:`grid w-full grid-cols-2`,children:[(0,M.jsx)(hr,{value:`form`,children:`表单模式`}),(0,M.jsx)(hr,{value:`json`,children:`高级模式`})]}),(0,M.jsx)(gr,{value:`form`,className:`mt-4`,children:(0,M.jsx)(fr,{form:l,onSubmit:p,disabled:n,submitText:n?`保存中...`:`保存配置`})}),(0,M.jsx)(gr,{value:`json`,className:`mt-4`,children:(0,M.jsx)(jn,{...u,children:(0,M.jsxs)(`form`,{onSubmit:u.handleSubmit(m),children:[(0,M.jsx)(`div`,{className:`grid gap-4`,children:(0,M.jsx)(H,{control:u.control,name:`config`,render:({field:e})=>(0,M.jsxs)(U,{children:[(0,M.jsx)(G,{children:(0,M.jsx)(ar,{className:`resize-none h-[300px] font-mono text-sm`,disabled:n,placeholder:`支持三种通信方式:
6
+
7
+ 1. 本地进程 (stdio):
8
+ {
9
+ "mcpServers": {
10
+ "local-server": {
11
+ "command": "npx",
12
+ "args": ["-y", "@example/mcp-server"]
13
+ }
14
+ }
15
+ }
16
+
17
+ 2. 服务器推送 (SSE):
18
+ {
19
+ "mcpServers": {
20
+ "sse-server": {
21
+ "type": "sse",
22
+ "url": "https://example.com/sse"
23
+ }
24
+ }
25
+ }
26
+
27
+ 3. 流式 HTTP:
28
+ {
29
+ "mcpServers": {
30
+ "http-server": {
31
+ "url": "https://example.com/mcp"
32
+ }
33
+ }
34
+ }`,...e,onChange:t=>{e.onChange(t),s(t.target.value)}})}),(0,M.jsx)(K,{})]})})}),(0,M.jsxs)(dn,{className:`mt-4`,children:[(0,M.jsx)(ln,{asChild:!0,children:(0,M.jsx)(F,{variant:`outline`,disabled:n,children:`取消`})}),(0,M.jsx)(F,{type:`submit`,disabled:n,children:n?`保存中...`:`保存`})]})]})})})]})]})]})}var Lr=O.createContext({size:`default`}),Rr=St(`w-full caption-bottom text-sm`,{variants:{size:{default:`text-sm`,compact:`text-xs`}},defaultVariants:{size:`default`}}),zr=St(`text-left align-middle font-medium text-muted-foreground [&:has([role=checkbox])]:pr-0`,{variants:{size:{default:`h-12 px-4`,compact:`h-10 p-4`}},defaultVariants:{size:`default`}}),Br=St(`align-middle [&:has([role=checkbox])]:pr-0`,{variants:{size:{default:`p-4`,compact:`py-2 px-4`}},defaultVariants:{size:`default`}}),Vr=O.forwardRef(({className:e,size:t,children:n,...r},i)=>{let a=t??`default`;return(0,M.jsx)(Lr.Provider,{value:{size:a},children:(0,M.jsx)(`div`,{className:`relative w-full overflow-auto`,children:(0,M.jsx)(`table`,{ref:i,className:N(Rr({size:a,className:e})),...r,children:n})})})});Vr.displayName=`Table`;var Hr=O.forwardRef(({className:e,...t},n)=>(0,M.jsx)(`thead`,{ref:n,className:N(`[&_tr]:border-b`,e),...t}));Hr.displayName=`TableHeader`;var Ur=O.forwardRef(({className:e,...t},n)=>(0,M.jsx)(`tbody`,{ref:n,className:N(`[&_tr:last-child]:border-0`,e),...t}));Ur.displayName=`TableBody`;var Wr=O.forwardRef(({className:e,...t},n)=>(0,M.jsx)(`tfoot`,{ref:n,className:N(`border-t bg-muted/50 font-medium [&>tr]:last:border-b-0`,e),...t}));Wr.displayName=`TableFooter`;var Gr=O.forwardRef(({className:e,...t},n)=>(0,M.jsx)(`tr`,{ref:n,className:N(`border-b transition-colors hover:bg-muted/50 data-[state=selected]:bg-muted`,e),...t}));Gr.displayName=`TableRow`;var Z=O.forwardRef(({className:e,...t},n)=>{let{size:r}=O.useContext(Lr);return(0,M.jsx)(`th`,{ref:n,className:N(zr({size:r,className:e})),...t})});Z.displayName=`TableHead`;var Q=O.forwardRef(({className:e,...t},n)=>{let{size:r}=O.useContext(Lr);return(0,M.jsx)(`td`,{ref:n,className:N(Br({size:r,className:e})),...t})});Q.displayName=`TableCell`;var Kr=O.forwardRef(({className:e,...t},n)=>(0,M.jsx)(`caption`,{ref:n,className:N(`mt-4 text-sm text-muted-foreground`,e),...t}));Kr.displayName=`TableCaption`;var qr={stdio:`本地进程`,sse:`服务器推送`,"streamable-http":`流式 HTTP`};function Jr(e){return qr[e]}function Yr(e){let[t,n]=(0,O.useState)(``),r=Array.isArray(e)?e:[];return{searchValue:t,setSearchValue:n,filteredServers:(0,O.useMemo)(()=>{if(!t.trim())return r;let e=t.toLowerCase();return r.filter(t=>{let n=(t?.name?.toLowerCase()||``).includes(e),r=(t?.communicationType?.toLowerCase()||``).includes(e),i=t?.communicationType?Jr(t.communicationType).toLowerCase().includes(e):!1;return n||r||i})},[r,t]),clearSearch:(0,O.useCallback)(()=>{n(``)},[])}}function Xr(e){let{storageKey:t,defaultConfig:n,validFields:r,loggerName:i}=e,[a,o]=(0,O.useState)(()=>{if(typeof window<`u`)try{let e=localStorage.getItem(t);if(e){let t=JSON.parse(e);if(t&&r.includes(t.field))return t;console.warn(`[${i}] 无效的排序字段,使用默认配置`)}}catch(e){console.warn(`[${i}] 读取排序配置失败:`,e)}return n});return(0,O.useEffect)(()=>{if(typeof window<`u`)try{localStorage.setItem(t,JSON.stringify(a))}catch(e){console.warn(`[${i}] 保存排序配置失败:`,e)}},[a,t]),{sortConfig:a,setSortConfig:o}}var Zr=[`name`,`communicationType`,`toolCount`];function Qr(){return Xr({storageKey:`mcp-server-sort-config`,defaultConfig:{field:`name`},validFields:Zr,loggerName:`useServerSortPersistence`})}function $r(e,t=10){let[n,r]=(0,O.useState)(1),[i,a]=(0,O.useState)(t),o=Array.isArray(e)?e:[],s=(0,O.useMemo)(()=>Math.ceil(o.length/i)||1,[o.length,i]);return{currentPage:n,pageSize:i,totalPages:s,paginatedTools:(0,O.useMemo)(()=>{let e=(n-1)*i,t=e+i;return o.slice(e,t)},[o,n,i]),setPage:(0,O.useCallback)(e=>{r(Math.max(1,Math.min(e,s)))},[s]),setPageSize:(0,O.useCallback)(e=>{a(e),r(1)},[]),resetPage:(0,O.useCallback)(()=>{r(1)},[])}}var ei=D.object({config:D.string().min(2,{message:`配置不能为空`})});function ti({mcpServer:e,mcpServerName:t}){let[n,r]=(0,O.useState)(!1),[i,a]=(0,O.useState)(!1),[o,s]=(0,O.useState)(`form`),[l,u]=(0,O.useState)(``),d=mn(),{updateConfig:f}=Kn(),p=Ar(t,e),m=w({resolver:c(dr),defaultValues:p}),h=w({resolver:c(ei),defaultValues:{config:JSON.stringify({mcpServers:{[t]:e}},null,2)}}),g=(0,O.useCallback)(e=>{e||(m.reset(p),h.reset(),u(``),s(`form`)),r(e)},[m,h,p]),_=(0,O.useCallback)(e=>{if(!(e!==`form`&&e!==`json`)){if(e===`json`&&o===`form`){let e=m.getValues();try{u(Mr(e))}catch{u(``)}}else if(e===`form`&&o===`json`){let e=jr(l);e&&m.reset(e)}s(e)}},[o,m,l]),v=(0,O.useCallback)(async e=>{if(!d){E.error(`配置数据未加载,请稍后重试`);return}a(!0);try{let{name:n,config:i}=Cr(e),a={...d};if(n!==t){let{[t]:e,...n}=a.mcpServers;a.mcpServers=n}a={...a,mcpServers:{...a.mcpServers,[n]:i}},await f(a);let o=n!==t;E.success(o?`MCP 服务 "${t}" 已重命名为 "${n}"`:`MCP 服务 "${n}" 配置已更新`),r(!1)}catch(e){console.error(`更新配置失败:`,e),E.error(e instanceof Error?e.message:`更新配置失败`)}finally{a(!1)}},[d,t,f]),y=(0,O.useCallback)(async e=>{if(!d){E.error(`配置数据未加载,请稍后重试`);return}a(!0);try{let n=Pr(e.config);if(!n.success){E.error(n.error||`配置验证失败`);return}let i=n.data,a=Object.entries(i);if(a.length!==1){E.error(`编辑模式只能修改单个 MCP 服务配置`);return}let[o,s]=a[0],c={...d};if(o!==t){let{[t]:e,...n}=c.mcpServers;c.mcpServers=n}c={...c,mcpServers:{...c.mcpServers,[o]:s}},await f(c);let l=o!==t;E.success(l?`MCP 服务 "${t}" 已重命名为 "${o}"`:`MCP 服务 "${o}" 配置已更新`),r(!1)}catch(e){console.error(`更新配置失败:`,e),E.error(e instanceof Error?e.message:`更新配置失败`)}finally{a(!1)}},[d,t,f]);return(0,M.jsxs)(I,{open:n,onOpenChange:g,children:[(0,M.jsx)(sn,{asChild:!0,children:(0,M.jsxs)(`button`,{type:`button`,className:`flex items-center gap-1 hover:cursor-pointer hover:text-primary transition-all duration-100`,children:[(0,M.jsx)(me,{size:14}),(0,M.jsx)(`span`,{children:`配置`})]})}),(0,M.jsxs)(L,{className:`sm:max-w-[600px]`,children:[(0,M.jsxs)(R,{className:`mb-4`,children:[(0,M.jsxs)(z,{children:[`配置 `,t,` MCP`]}),(0,M.jsx)(fn,{children:`点击保存后,需要重启服务才会生效。`})]}),(0,M.jsxs)(pr,{value:o,onValueChange:_,children:[(0,M.jsxs)(mr,{className:`grid w-full grid-cols-2`,children:[(0,M.jsx)(hr,{value:`form`,children:`表单模式`}),(0,M.jsx)(hr,{value:`json`,children:`高级模式 (JSON)`})]}),(0,M.jsx)(gr,{value:`form`,className:`mt-4`,children:(0,M.jsx)(fr,{form:m,defaultValues:p,onSubmit:v,disabled:i,submitText:i?`保存中...`:`保存`})}),(0,M.jsx)(gr,{value:`json`,className:`mt-4`,children:(0,M.jsx)(jn,{...h,children:(0,M.jsxs)(`form`,{onSubmit:h.handleSubmit(y),children:[(0,M.jsx)(`div`,{className:`grid gap-4`,children:(0,M.jsx)(H,{control:h.control,name:`config`,render:({field:e})=>(0,M.jsxs)(U,{children:[(0,M.jsx)(G,{children:(0,M.jsx)(ar,{className:`resize-none h-[300px] font-mono text-sm`,disabled:i,placeholder:`支持三种通信方式:
35
+
36
+ 1. 本地进程 (stdio):
37
+ {
38
+ "mcpServers": {
39
+ "local-server": {
40
+ "command": "npx",
41
+ "args": ["-y", "@example/mcp-server"]
42
+ }
43
+ }
44
+ }
45
+
46
+ 2. 服务器推送 (SSE):
47
+ {
48
+ "mcpServers": {
49
+ "sse-server": {
50
+ "type": "sse",
51
+ "url": "https://example.com/sse"
52
+ }
53
+ }
54
+ }
55
+
56
+ 3. 流式 HTTP:
57
+ {
58
+ "mcpServers": {
59
+ "http-server": {
60
+ "url": "https://example.com/mcp"
61
+ }
62
+ }
63
+ }`,...e,onChange:t=>{e.onChange(t),u(t.target.value)}})}),(0,M.jsx)(K,{})]})})}),(0,M.jsxs)(dn,{className:`mt-4`,children:[(0,M.jsx)(ln,{asChild:!0,children:(0,M.jsx)(F,{variant:`outline`,disabled:i,children:`取消`})}),(0,M.jsx)(F,{type:`submit`,disabled:i,children:i?`保存中...`:`保存`})]})]})})})]})]})]})}function ni({mcpServerName:e,onRemoveSuccess:t,disabled:n=!1}){let[r,i]=(0,O.useState)(!1);return(0,M.jsxs)(Yt,{children:[(0,M.jsx)(Xt,{asChild:!0,children:(0,M.jsxs)(`button`,{type:`button`,disabled:n||r,className:N(`flex items-center gap-1 hover:cursor-pointer text-destructive hover:text-red-700 transition-all duration-100`,(n||r)&&`opacity-50 cursor-not-allowed`),children:[(0,M.jsx)(ce,{size:14}),(0,M.jsx)(`span`,{children:`卸载`})]})}),(0,M.jsxs)($t,{children:[(0,M.jsxs)(en,{children:[(0,M.jsxs)(nn,{children:[`确定要删除这个(`,e,`)MCP服务吗?`]}),(0,M.jsx)(rn,{children:`删除后,对应的工具列表也会移除。`})]}),(0,M.jsxs)(tn,{children:[(0,M.jsx)(on,{children:`取消`}),(0,M.jsx)(an,{onClick:async()=>{try{if(i(!0),!await k.removeMCPServer(e))throw Error(`删除服务器失败`);E.success(`MCP 服务 "${e}" 已删除`),t&&await t()}catch(e){console.error(`删除 MCP 服务失败:`,e),E.error(`删除 MCP 服务失败: ${e instanceof Error?e.message:`未知错误`}`)}finally{i(!1)}},disabled:n||r,className:`bg-destructive text-destructive-foreground hover:bg-destructive/90`,children:r?`删除中...`:`确定`})]})]})]})}var ri=({className:e,...t})=>(0,M.jsx)(`nav`,{"aria-label":`pagination`,className:N(`mx-auto flex w-full justify-center`,e),...t});ri.displayName=`Pagination`;var ii=O.forwardRef(({className:e,...t},n)=>(0,M.jsx)(`ul`,{ref:n,className:N(`flex flex-row items-center gap-1`,e),...t}));ii.displayName=`PaginationContent`;var ai=O.forwardRef(({className:e,...t},n)=>(0,M.jsx)(`li`,{ref:n,className:N(``,e),...t}));ai.displayName=`PaginationItem`;var oi=({className:e,isActive:t,size:n=`icon`,...r})=>(0,M.jsx)(`a`,{"aria-current":t?`page`:void 0,className:N(Jt({variant:t?`outline`:`ghost`,size:n}),e),...r});oi.displayName=`PaginationLink`;var si=({className:e,...t})=>(0,M.jsxs)(oi,{"aria-label":`Go to previous page`,size:`default`,className:N(`gap-1 pl-2.5`,e),...t,children:[(0,M.jsx)(et,{className:`h-4 w-4`}),(0,M.jsx)(`span`,{children:`上一页`})]});si.displayName=`PaginationPrevious`;var ci=({className:e,...t})=>(0,M.jsxs)(oi,{"aria-label":`Go to next page`,size:`default`,className:N(`gap-1 pr-2.5`,e),...t,children:[(0,M.jsx)(`span`,{children:`下一页`}),(0,M.jsx)(Pe,{className:`h-4 w-4`})]});ci.displayName=`PaginationNext`;var li=({className:e,...t})=>(0,M.jsxs)(`span`,{"aria-hidden":!0,className:N(`flex h-9 w-9 items-center justify-center`,e),...t,children:[(0,M.jsx)(it,{className:`h-4 w-4`}),(0,M.jsx)(`span`,{className:`sr-only`,children:`更多页`})]});li.displayName=`PaginationEllipsis`;function ui(e,t){let n=[];if(t<=7)for(let e=1;e<=t;e++)n.push(e);else if(e<=4){for(let e=1;e<=5;e++)n.push(e);n.push(-2,t)}else if(e>=t-3){n.push(1,-1);for(let e=t-3;e<=t;e++)n.push(e)}else n.push(1,-1,e-1,e,e+1,-2,t);return n}function di({currentPage:e,totalPages:t,setPage:n}){let r=(0,O.useMemo)(()=>ui(e,t),[e,t]);return t>1?(0,M.jsx)(`div`,{className:`flex items-end justify-start py-4`,children:(0,M.jsx)(ri,{children:(0,M.jsxs)(ii,{children:[(0,M.jsx)(ai,{children:(0,M.jsx)(si,{onClick:()=>n(e-1),className:N(`cursor-pointer`,e===1&&`pointer-events-none opacity-50`)})}),r.map(t=>t===-1?(0,M.jsx)(ai,{children:(0,M.jsx)(li,{})},`ellipsis-start`):t===-2?(0,M.jsx)(ai,{children:(0,M.jsx)(li,{})},`ellipsis-end`):(0,M.jsx)(ai,{children:(0,M.jsx)(oi,{onClick:()=>n(t),isActive:e===t,className:`cursor-pointer`,children:t})},`page-${t}`)),(0,M.jsx)(ai,{children:(0,M.jsx)(ci,{onClick:()=>n(e+1),className:N(`cursor-pointer`,e===t&&`pointer-events-none opacity-50`)})})]})})}):null}function fi({value:e,onChange:t,placeholder:n=`搜索服务名、工具名、描述...`,className:r}){let i=O.useRef(null);return(0,M.jsx)(`div`,{className:N(`relative`,r),children:(0,M.jsxs)(`div`,{className:`relative flex items-center`,children:[(0,M.jsx)(m,{className:`absolute left-3 h-4 w-4 text-muted-foreground pointer-events-none`}),(0,M.jsx)(B,{ref:i,type:`text`,value:e,onChange:e=>{t(e.target.value)},placeholder:n,className:`pl-9 pr-9 w-64`,"aria-label":`搜索工具`}),e&&(0,M.jsx)(`button`,{type:`button`,onClick:()=>{t(``),i.current?.focus()},className:`absolute right-3 text-muted-foreground hover:text-foreground transition-colors`,"aria-label":`清除搜索`,children:(0,M.jsx)(f,{className:`h-4 w-4`})})]})})}var pi=[{value:`name`,label:`按名称排序`},{value:`communicationType`,label:`按通信类型排序`},{value:`toolCount`,label:`按工具数量排序`}];function mi({value:e,onChange:t}){return(0,M.jsx)(`div`,{className:`flex items-center gap-2`,children:(0,M.jsxs)(Qn,{value:e.field,onValueChange:e=>t({field:e}),children:[(0,M.jsx)(J,{id:`server-sort-field`,className:`w-40`,children:(0,M.jsx)(er,{})}),(0,M.jsx)(Y,{children:pi.map(e=>(0,M.jsx)(X,{value:e.value,children:e.label},e.value))})]})})}function hi({status:e}){let t={connected:`bg-green-500`,disconnected:`bg-red-500`,connecting:`bg-yellow-500`,error:`bg-gray-500`},n={connected:`已连接`,disconnected:`未连接`,connecting:`连接中`,error:`错误`};return(0,M.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,M.jsx)(`span`,{className:N(`flex size-2 rounded-full`,t[e]),title:n[e]}),n[e]]})}function gi(e,t,n,r,i){return{name:e,config:t,communicationType:n,toolCount:r,status:i}}function _i(e){return`command`in e&&typeof e.command==`string`?`stdio`:`type`in e&&e.type===`sse`?`sse`:`streamable-http`}var vi={stdio:`stdio`,sse:`sse`,"streamable-http":`http`};function yi({className:e}){let{servers:t,loading:n,refresh:r}=vn(),{sortConfig:i,setSortConfig:a}=Qr();(0,O.useEffect)(()=>{r()},[r]);let o=(0,O.useMemo)(()=>t.map(e=>gi(e.name,e.config,_i(e.config),e.tools.length,e.status)),[t]),{searchValue:s,setSearchValue:c,filteredServers:l,clearSearch:u}=Yr((0,O.useMemo)(()=>{let e=[...o],{field:t}=i;return e.sort((e,n)=>{switch(t){case`name`:return e.name.localeCompare(n.name,`zh-CN`);case`communicationType`:return e.communicationType.localeCompare(n.communicationType);case`toolCount`:return(n.toolCount??0)-(e.toolCount??0);default:return 0}}),e},[o,i])),{currentPage:d,totalPages:f,paginatedTools:p,setPage:m}=$r(l,10),h=p,g=(0,O.useCallback)(async()=>{try{await r(),E.success(`刷新成功`)}catch{E.error(`刷新失败`)}},[r]);return(0,O.useEffect)(()=>{m(1)},[s,m]),(0,M.jsxs)(`div`,{className:N(`flex flex-col gap-4 w-full`,e),children:[(0,M.jsxs)(`div`,{className:`flex items-center justify-between gap-4`,children:[(0,M.jsx)(mi,{value:i,onChange:a}),(0,M.jsx)(fi,{value:s,onChange:c,placeholder:`搜索服务器名称、通信类型...`})]}),s&&(0,M.jsxs)(`div`,{className:`text-sm text-muted-foreground`,children:[`找到 `,l.length,` 个结果`,l.length>0&&(0,M.jsx)(`button`,{type:`button`,onClick:u,className:`ml-2 text-primary hover:underline`,children:`清除搜索`})]}),(0,M.jsx)(`div`,{className:`rounded-md border`,children:h.length===0?(0,M.jsxs)(`div`,{className:`flex flex-col items-center justify-center py-12 gap-4`,children:[(0,M.jsx)(Qe,{className:`h-12 w-12 text-muted-foreground`}),(0,M.jsx)(`span`,{className:`text-sm text-muted-foreground`,children:s?`没有找到匹配的服务器`:`暂无可用服务器`}),s&&(0,M.jsx)(F,{variant:`outline`,size:`sm`,onClick:u,children:`清除搜索`})]}):(0,M.jsxs)(M.Fragment,{children:[(0,M.jsxs)(Vr,{size:`compact`,children:[(0,M.jsx)(Hr,{children:(0,M.jsxs)(Gr,{children:[(0,M.jsx)(Z,{children:`服务器名称`}),(0,M.jsx)(Z,{className:`w-[100px]`,children:`状态`}),(0,M.jsx)(Z,{className:`w-[120px]`,children:`通信类型`}),(0,M.jsx)(Z,{className:`w-[100px] text-right`,children:`工具数量`}),(0,M.jsx)(Z,{className:`w-[220px] text-right`,children:`操作`})]})}),(0,M.jsx)(Ur,{children:h.map(e=>(0,M.jsxs)(Gr,{children:[(0,M.jsx)(Q,{className:`font-medium`,children:e.name}),(0,M.jsx)(Q,{children:e.status?(0,M.jsx)(hi,{status:e.status}):`-`}),(0,M.jsx)(Q,{children:(0,M.jsx)(P,{variant:`secondary`,className:`rounded-md`,children:vi[e.communicationType]})}),(0,M.jsx)(Q,{className:`text-right text-muted-foreground`,children:e.toolCount??`-`}),(0,M.jsx)(Q,{children:(0,M.jsxs)(`div`,{className:`flex items-center justify-end gap-2`,children:[(0,M.jsx)(ti,{mcpServerName:e.name,mcpServer:e.config}),(0,M.jsx)(ni,{mcpServerName:e.name,onRemoveSuccess:g,disabled:n})]})})]},e.name))})]}),(0,M.jsx)(di,{currentPage:d,totalPages:f,setPage:m})]})})]})}function bi(){let[e,t]=(0,O.useState)(!1);return(0,M.jsxs)(I,{open:e,onOpenChange:t,children:[(0,M.jsx)(sn,{asChild:!0,children:(0,M.jsx)(F,{variant:`secondary`,size:`icon`,className:`size-8`,"aria-label":`MCP服务列表`,title:`MCP服务列表`,children:(0,M.jsx)(_e,{className:`size-4`})})}),(0,M.jsxs)(L,{className:`max-w-5xl max-h-[85vh]`,children:[(0,M.jsx)(R,{children:(0,M.jsx)(z,{children:`MCP 服务器列表`})}),(0,M.jsx)(yi,{})]})]})}var xi=O.forwardRef(({className:e,children:t,...n},r)=>(0,M.jsx)(`div`,{ref:r,className:N(`relative overflow-auto`,e),...n,children:t}));xi.displayName=`ScrollArea`;var Si=O.forwardRef(({className:e,orientation:t=`vertical`,...n},r)=>(0,M.jsx)(`div`,{ref:r,className:N(`flex touch-none select-none transition-colors`,t===`vertical`&&`h-full w-2.5 border-l border-l-transparent p-[1px]`,t===`horizontal`&&`h-2.5 w-full border-t border-t-transparent p-[1px]`,e),...n,children:(0,M.jsx)(`div`,{className:`relative flex-1 rounded-full bg-border`})}));Si.displayName=`ScrollBar`;var Ci=O.forwardRef(({className:e,orientation:t=`horizontal`,decorative:n=!0,...r},i)=>(0,M.jsx)(at,{ref:i,decorative:n,orientation:t,className:N(`shrink-0 bg-border`,t===`horizontal`?`h-[1px] w-full`:`h-full w-[1px]`,e),...r}));Ci.displayName=at.displayName;var wi=e=>e?new Date(e).toLocaleString(`zh-CN`,{year:`numeric`,month:`2-digit`,day:`2-digit`,hour:`2-digit`,minute:`2-digit`,second:`2-digit`}):`未知时间`,Ti=e=>e?e<1e3?`${e}ms`:`${(e/1e3).toFixed(1)}s`:`-`,Ei=(e,t)=>{let n=e.timestamp||Date.now();return`${e.toolName}-${n}-${t}`},Di=e=>{if(!e)return null;try{return JSON.stringify(e,null,2)}catch{return String(e)}};function Oi(){let[e,t]=(0,O.useState)(!1),[n,r]=(0,O.useState)([]),[i,a]=(0,O.useState)(!1),[o,s]=(0,O.useState)(!1),[c,l]=(0,O.useState)(null),[u,d]=(0,O.useState)(null),[f,p]=(0,O.useState)(null),[m]=(0,O.useState)(50),[h,g]=(0,O.useState)(0),_=(0,O.useCallback)(async(e=!1)=>{e?s(!0):a(!0),l(null);try{let e=await(await fetch(`/api/tool-calls/logs?limit=${m}`)).json();e.success&&e.data?(r(e.data.records),g(e.data.total)):l(e.error?.message||`获取日志失败`)}catch(e){l(`网络请求失败`),console.error(`获取工具调用日志失败:`,e)}finally{e?s(!1):a(!1)}},[m]);(0,O.useEffect)(()=>{e?_():(d(null),p(null))},[e,_]);let v=(e,t)=>{f!==t&&(d(e),p(t))};return(0,M.jsxs)(I,{open:e,onOpenChange:t,children:[(0,M.jsx)(sn,{asChild:!0,children:(0,M.jsx)(F,{variant:`secondary`,size:`icon`,className:`size-8`,"aria-label":`MCP工具调用日志`,title:`MCP工具调用日志`,children:(0,M.jsx)(Me,{className:`size-4`})})}),(0,M.jsxs)(L,{className:`max-w-6xl max-h-[80vh]`,onMouseLeave:()=>{d(null),p(null)},children:[(0,M.jsx)(R,{children:(0,M.jsx)(`div`,{className:`flex items-center justify-between`,children:(0,M.jsxs)(z,{className:`flex items-center gap-2`,children:[(0,M.jsx)(Me,{className:`h-5 w-5`}),`MCP 工具调用日志`,h>0&&(0,M.jsxs)(`span`,{className:`text-sm font-normal text-muted-foreground ml-2`,children:[`(共 `,h,` 条记录)`]}),(0,M.jsxs)(F,{variant:`ghost`,size:`sm`,onClick:()=>_(!0),disabled:o,children:[(0,M.jsx)(x,{className:`h-4 w-4 ${o?`animate-spin`:``}`}),`刷新`]})]})})}),(0,M.jsxs)(`div`,{className:`flex-1 flex gap-4`,children:[(0,M.jsx)(`div`,{className:`flex-1`,children:i?(0,M.jsxs)(`div`,{className:`flex flex-col items-center justify-center py-8`,children:[(0,M.jsxs)(`div`,{className:`relative`,children:[(0,M.jsx)(T,{className:`h-8 w-8 animate-spin text-muted-foreground`}),(0,M.jsx)(`div`,{className:`absolute inset-0 flex items-center justify-center`,children:(0,M.jsx)(Me,{className:`h-4 w-4 text-muted-foreground/50`})})]}),(0,M.jsxs)(`div`,{className:`mt-4 text-center`,children:[(0,M.jsx)(`p`,{className:`text-muted-foreground font-medium`,children:`正在加载日志数据`}),(0,M.jsx)(`p`,{className:`text-muted-foreground/70 text-sm mt-1`,children:`请稍候片刻...`})]})]}):c?(0,M.jsx)(`div`,{className:`text-center py-8`,children:(0,M.jsxs)(`div`,{className:`bg-destructive/10 border border-destructive/20 rounded-lg p-6 max-w-md mx-auto`,children:[(0,M.jsx)(ke,{className:`h-12 w-12 text-destructive mx-auto mb-4`}),(0,M.jsx)(`h3`,{className:`text-destructive font-semibold text-lg mb-2`,children:`加载失败`}),(0,M.jsx)(`p`,{className:`text-muted-foreground text-sm mb-4 leading-relaxed`,children:c}),(0,M.jsxs)(`div`,{className:`flex flex-col gap-2`,children:[(0,M.jsxs)(F,{onClick:()=>_(),variant:`outline`,size:`sm`,className:`gap-2`,children:[(0,M.jsx)(y,{className:`h-4 w-4`}),`重试加载`]}),(0,M.jsx)(F,{onClick:()=>_(!0),variant:`ghost`,size:`sm`,className:`text-xs`,children:`强制刷新`})]})]})}):n.length===0?(0,M.jsx)(`div`,{className:`text-center py-8`,children:(0,M.jsxs)(`div`,{className:`bg-muted/30 border border-muted rounded-lg p-6 max-w-md mx-auto`,children:[(0,M.jsx)(Me,{className:`h-12 w-12 text-muted-foreground mx-auto mb-4`}),(0,M.jsx)(`h3`,{className:`font-medium text-lg mb-2`,children:`暂无工具调用记录`}),(0,M.jsx)(`p`,{className:`text-muted-foreground text-sm leading-relaxed mb-4`,children:`当前还没有任何工具调用记录。当您开始使用工具时,相关的调用信息会在这里显示。`}),(0,M.jsxs)(F,{onClick:()=>_(!0),variant:`outline`,size:`sm`,className:`gap-2`,children:[(0,M.jsx)(y,{className:`h-4 w-4`}),`检查更新`]})]})}):(0,M.jsx)(xi,{className:`h-[60vh]`,children:(0,M.jsxs)(Vr,{children:[(0,M.jsx)(Hr,{children:(0,M.jsxs)(Gr,{children:[(0,M.jsx)(Z,{children:`工具名称`}),(0,M.jsx)(Z,{children:`服务器`}),(0,M.jsx)(Z,{children:`状态`}),(0,M.jsx)(Z,{children:`耗时`}),(0,M.jsx)(Z,{children:`时间`})]})}),(0,M.jsx)(Ur,{children:n.map((e,t)=>(0,M.jsxs)(Gr,{className:`cursor-pointer transition-colors ${f===t?`bg-muted/50`:`hover:bg-muted/30`}`,onMouseEnter:()=>v(e,t),children:[(0,M.jsx)(Q,{className:`font-medium`,children:(0,M.jsxs)(`div`,{children:[(0,M.jsx)(`div`,{children:e.toolName}),e.originalToolName&&e.originalToolName!==e.toolName&&(0,M.jsxs)(`div`,{className:`text-xs text-muted-foreground`,children:[`原始: `,e.originalToolName]})]})}),(0,M.jsx)(Q,{children:e.serverName||(0,M.jsx)(`span`,{className:`text-muted-foreground`,children:`-`})}),(0,M.jsx)(Q,{children:(0,M.jsx)(P,{variant:e.success?void 0:`destructive`,className:`gap-1 w-[50px] text-center ${e.success?`bg-green-600 hover:bg-green-600`:`bg-red-600 hover:bg-red-600`}`,children:e.success?`成功`:`失败`})}),(0,M.jsx)(Q,{children:Ti(e.duration)}),(0,M.jsx)(Q,{className:`text-muted-foreground text-sm`,children:wi(e.timestamp)})]},Ei(e,t)))})]})})}),u&&(0,M.jsx)(`div`,{className:`w-96 border-l pl-4`,onMouseEnter:()=>{},children:(0,M.jsx)(Ai,{log:u})})]})]})]})}function ki({size:e=`sm`,copyContent:t,className:n=``}){let[r,i]=(0,O.useState)(!1),a=(0,O.useRef)(null);return(0,O.useEffect)(()=>()=>{a.current&&clearTimeout(a.current)},[]),(0,M.jsx)(F,{variant:`ghost`,size:e,className:`${n} ${r?`text-green-600 hover:text-green-700`:``}`,onClick:async()=>{try{await navigator.clipboard.writeText(t),i(!0),a.current&&clearTimeout(a.current),a.current=setTimeout(()=>{i(!1)},3e3)}catch(e){console.error(`复制失败:`,e)}},children:r?(0,M.jsx)(Re,{}):(0,M.jsx)(Te,{})})}function Ai({log:e}){let t=e=>{try{return JSON.stringify(e,null,2)}catch{return String(e)}};return(0,M.jsx)(Sn,{className:`h-[60vh]`,children:(0,M.jsxs)(`div`,{className:`p-4 h-full flex flex-col`,children:[(0,M.jsxs)(pr,{defaultValue:`arguments`,className:`flex-1 flex flex-col min-h-0`,children:[(0,M.jsxs)(mr,{className:`grid w-full grid-cols-3 flex-shrink-0`,children:[(0,M.jsx)(hr,{value:`arguments`,children:`入参`}),(0,M.jsx)(hr,{value:`result`,children:`出参`}),(0,M.jsx)(hr,{value:`raw`,children:`原始数据`})]}),(0,M.jsxs)(`div`,{className:`flex-1 min-h-0`,children:[(0,M.jsx)(gr,{value:`arguments`,className:`h-full data-[state=active]:flex data-[state=active]:flex-col`,children:(0,M.jsx)(xi,{className:`h-full`,children:e.arguments?(0,M.jsxs)(`div`,{className:`relative`,children:[(0,M.jsx)(`pre`,{className:`text-xs bg-muted p-3 rounded-md overflow-x-auto text-wrap break-words`,children:Di(e.arguments)}),(0,M.jsx)(ki,{copyContent:Di(e.arguments)||``,className:`absolute top-2 right-2 hover:bg-slate-200 w-[30px] h-[30px]`})]}):(0,M.jsxs)(`div`,{className:`text-center text-muted-foreground py-8`,children:[(0,M.jsx)(ot,{className:`h-8 w-8 mx-auto mb-2 opacity-50`}),(0,M.jsx)(`p`,{children:`无入参`})]})})}),(0,M.jsx)(gr,{value:`result`,className:`h-full data-[state=active]:flex data-[state=active]:flex-col`,children:(0,M.jsx)(xi,{className:`h-full`,children:e.success?e.result?(0,M.jsxs)(`div`,{className:`relative`,children:[(0,M.jsx)(`pre`,{className:`text-xs bg-muted p-3 rounded-md overflow-x-auto text-wrap break-words`,children:Di(e.result)}),(0,M.jsx)(ki,{copyContent:Di(e.result)||``,className:`absolute top-2 right-2 hover:bg-slate-200 w-[30px] h-[30px]`})]}):(0,M.jsxs)(`div`,{className:`text-center text-muted-foreground py-8`,children:[(0,M.jsx)(Ke,{className:`h-8 w-8 mx-auto mb-2 opacity-50`}),(0,M.jsx)(`p`,{children:`无出参`})]}):(0,M.jsxs)(`div`,{className:`relative`,children:[(0,M.jsxs)(`div`,{className:`bg-destructive/10 border border-destructive/20 p-3 rounded-md`,children:[(0,M.jsxs)(`div`,{className:`flex items-center gap-2 mb-2`,children:[(0,M.jsx)(ke,{className:`h-4 w-4 text-destructive`}),(0,M.jsx)(`span`,{className:`font-medium text-destructive`,children:`调用失败`})]}),e.error&&(0,M.jsx)(`pre`,{className:`text-xs text-destructive/80 whitespace-pre-wrap`,children:e.error})]}),e.error&&(0,M.jsx)(ki,{copyContent:e.error||``,className:`absolute top-2 right-2`})]})})}),(0,M.jsx)(gr,{value:`raw`,className:`h-full data-[state=active]:flex data-[state=active]:flex-col`,children:(0,M.jsx)(xi,{className:`h-full`,children:(0,M.jsxs)(`div`,{className:`relative`,children:[(0,M.jsx)(`pre`,{className:`text-xs bg-muted p-3 rounded-md overflow-x-auto text-wrap break-words`,children:t(e)}),(0,M.jsx)(ki,{copyContent:t(e),className:`absolute top-2 right-2 hover:bg-slate-200 w-[30px] h-[30px]`})]})})})]})]}),(0,M.jsx)(Ci,{className:`my-4 flex-shrink-0`}),(0,M.jsxs)(`div`,{className:`text-xs text-muted-foreground flex justify-between flex-shrink-0`,children:[(0,M.jsxs)(`span`,{children:[`耗时: `,Ti(e.duration)]}),(0,M.jsx)(`span`,{children:wi(e.timestamp)})]})]})})}function ji(){let{servers:e}=vn(),t=e.length,n=e.filter(e=>e.connected).length;return(0,M.jsxs)(Sn,{className:`@container/card`,children:[(0,M.jsxs)(Cn,{className:`relative`,children:[(0,M.jsx)(Tn,{children:`MCP服务`}),(0,M.jsxs)(wn,{className:`@[250px]/card:text-3xl text-2xl font-semibold tabular-nums`,children:[n,`/`,t]}),(0,M.jsx)(`div`,{className:`absolute right-4 top-4`,children:(0,M.jsx)(Kt,{showValue:!1,value:n,maxValue:Math.max(t,1),activeColor:`#16a34a`,inactiveColor:`#f87171`,size:30,symbol:``})})]}),(0,M.jsxs)(Dn,{className:`flex items-center justify-between gap-1 text-sm`,children:[(0,M.jsxs)(`div`,{className:`text-muted-foreground`,children:[`已连接 `,n,` 个,共 `,t,` 个服务`]}),(0,M.jsxs)(`div`,{className:`flex gap-2`,children:[(0,M.jsx)(Ir,{}),(0,M.jsx)(bi,{}),(0,M.jsx)(Oi,{})]})]})]})}function Mi({disabled:e=!1,variant:t=`outline`,className:n=``,restartingText:r=`重启中...`,defaultText:i=`重启服务`,iconMode:a=!1}){let{loading:{isRestarting:o},restartService:s}=Vt(),c=Ut(),l=async()=>{try{await s()}catch(e){console.error(`[RestartButton] 重启失败:`,e)}};return a?(0,M.jsx)(F,{type:`button`,onClick:l,variant:`secondary`,size:`icon`,className:`size-8`,disabled:o||e,"aria-label":`重启服务`,title:`重启服务`,children:o?(0,M.jsx)(T,{className:`size-4 animate-spin`}):(0,M.jsx)(be,{className:`size-4`})}):(0,M.jsxs)(F,{type:`button`,onClick:l,variant:t,disabled:o||e,className:Ct(`flex items-center gap-2 w-[120px]`,n),children:[o?(0,M.jsx)(T,{className:`size-4 animate-spin`}):(0,M.jsx)(be,{className:`size-4`}),o?c.enabled&&c.startTime?`重连中...`:r:i]})}var Ni=D.object({modelscope:D.object({apiKey:D.string().optional()}),platforms:D.object({coze:D.object({token:D.string().optional()})}),connection:D.object({heartbeatInterval:D.number().min(1e3,{message:`心跳间隔不能小于1000毫秒`}),heartbeatTimeout:D.number().min(1e3,{message:`心跳超时不能小于1000毫秒`}),reconnectInterval:D.number().min(1e3,{message:`重连间隔不能小于1000毫秒`})})});function Pi(){let[e,t]=(0,O.useState)(!1),[n,r]=(0,O.useState)(!1),i=mn(),{updateConfig:a}=Jn(),o=w({resolver:c(Ni),defaultValues:{platforms:{coze:{token:i?.platforms?.coze?.token||``}},modelscope:{apiKey:i?.modelscope?.apiKey||``},connection:{heartbeatInterval:i?.connection?.heartbeatInterval||3e4,heartbeatTimeout:i?.connection?.heartbeatTimeout||1e4,reconnectInterval:i?.connection?.reconnectInterval||5e3}}});(0,O.useEffect)(()=>{o.reset({modelscope:{apiKey:i?.modelscope?.apiKey||``},connection:{heartbeatInterval:i?.connection?.heartbeatInterval||3e4,heartbeatTimeout:i?.connection?.heartbeatTimeout||1e4,reconnectInterval:i?.connection?.reconnectInterval||5e3}})},[i,o]);async function s(e){if(!i){E.error(`配置数据未加载,请稍后重试`);return}r(!0);try{await a({...i,modelscope:{apiKey:e.modelscope.apiKey},connection:{heartbeatInterval:e.connection.heartbeatInterval,heartbeatTimeout:e.connection.heartbeatTimeout,reconnectInterval:e.connection.reconnectInterval},platforms:{...i?.platforms??{},coze:{...i?.platforms?.coze??{},token:e.platforms.coze.token}}}),E.success(`配置已更新`),t(!1)}catch(e){console.error(`更新配置失败:`,e),E.error(e instanceof Error?e.message:`更新配置失败`)}finally{r(!1)}}return(0,M.jsxs)(I,{open:e,onOpenChange:t,children:[(0,M.jsx)(sn,{asChild:!0,children:(0,M.jsx)(F,{variant:`secondary`,size:`icon`,className:`size-8`,children:(0,M.jsx)(me,{className:`size-4`})})}),(0,M.jsxs)(L,{className:`sm:max-w-[600px]`,children:[(0,M.jsxs)(R,{children:[(0,M.jsx)(z,{children:`系统设置`}),(0,M.jsx)(fn,{children:`配置平台认证和连接参数`})]}),(0,M.jsx)(jn,{...o,children:(0,M.jsxs)(`form`,{onSubmit:o.handleSubmit(s),children:[(0,M.jsxs)(`div`,{className:`grid gap-4 max-h-[60vh] overflow-y-auto`,children:[(0,M.jsx)(H,{control:o.control,name:`modelscope.apiKey`,render:({field:e})=>(0,M.jsxs)(U,{children:[(0,M.jsx)(W,{children:`魔搭社区 API Key`}),(0,M.jsxs)(`div`,{className:`flex gap-2`,children:[(0,M.jsx)(G,{children:(0,M.jsx)(B,{placeholder:`魔搭社区 API Key`,className:`font-mono text-sm`,type:`password`,disabled:n,autoComplete:`off`,"data-1p-ignore":!0,...e})}),(0,M.jsx)(F,{variant:`outline`,type:`button`,onClick:()=>{window.open(`https://www.modelscope.cn/my/myaccesstoken`,`_blank`)},children:`打开魔搭社区`})]}),(0,M.jsx)(K,{})]})}),(0,M.jsx)(H,{control:o.control,name:`platforms.coze.token`,render:({field:e})=>(0,M.jsxs)(U,{children:[(0,M.jsx)(W,{children:`扣子身份凭证`}),(0,M.jsxs)(`div`,{className:`flex gap-2`,children:[(0,M.jsx)(G,{children:(0,M.jsx)(B,{placeholder:`扣子身份凭证`,className:`font-mono text-sm`,type:`password`,autoComplete:`off`,"data-1p-ignore":!0,disabled:n,...e})}),(0,M.jsx)(F,{variant:`outline`,type:`button`,onClick:()=>{window.open(`https://www.coze.cn/open/oauth/sats`,`_blank`)},children:`打开扣子平台`})]}),(0,M.jsx)(K,{})]})}),(0,M.jsx)(H,{control:o.control,name:`connection.heartbeatInterval`,render:({field:e})=>(0,M.jsxs)(U,{children:[(0,M.jsx)(W,{children:`心跳间隔(毫秒)`}),(0,M.jsxs)(`div`,{className:`flex gap-2 items-center`,children:[(0,M.jsx)(G,{children:(0,M.jsx)(B,{placeholder:`心跳间隔(毫秒)`,className:`font-mono text-sm`,type:`number`,disabled:n,...e,value:e.value||``,onChange:t=>{let n=t.target.value;e.onChange(n===``?``:Number(n))}})}),(0,M.jsx)(`span`,{className:`text-sm text-muted-foreground w-[50px]`,children:`毫秒`})]}),(0,M.jsx)(K,{})]})}),(0,M.jsx)(H,{control:o.control,name:`connection.heartbeatTimeout`,render:({field:e})=>(0,M.jsxs)(U,{children:[(0,M.jsx)(W,{children:`心跳超时(毫秒)`}),(0,M.jsxs)(`div`,{className:`flex gap-2 items-center`,children:[(0,M.jsx)(G,{children:(0,M.jsx)(B,{placeholder:`心跳超时(毫秒)`,className:`font-mono text-sm`,type:`number`,disabled:n,...e,value:e.value||``,onChange:t=>{let n=t.target.value;e.onChange(n===``?``:Number(n))}})}),(0,M.jsx)(`span`,{className:`text-sm text-muted-foreground w-[50px]`,children:`毫秒`})]}),(0,M.jsx)(K,{})]})}),(0,M.jsx)(H,{control:o.control,name:`connection.reconnectInterval`,render:({field:e})=>(0,M.jsxs)(U,{children:[(0,M.jsx)(W,{children:`重连间隔(毫秒)`}),(0,M.jsxs)(`div`,{className:`flex gap-2 items-center`,children:[(0,M.jsx)(G,{children:(0,M.jsx)(B,{placeholder:`重连间隔(毫秒)`,className:`font-mono text-sm`,type:`number`,disabled:n,...e,value:e.value||``,onChange:t=>{let n=t.target.value;e.onChange(n===``?``:Number(n))}})}),(0,M.jsx)(`span`,{className:`text-sm text-muted-foreground w-[50px]`,children:`毫秒`})]}),(0,M.jsx)(K,{})]})})]}),(0,M.jsxs)(dn,{className:`mt-4`,children:[(0,M.jsx)(ln,{asChild:!0,children:(0,M.jsx)(F,{variant:`outline`,disabled:n,children:`取消`})}),(0,M.jsx)(F,{type:`submit`,disabled:n,children:n?`保存中...`:`保存`})]})]})})]})]})}var Fi=5;function Ii(){let e=mn(),t=(0,O.useMemo)(()=>{if(!e)return 0;let t=0;return e.modelscope?.apiKey&&t++,e.platforms?.coze?.token&&t++,e.connection?.heartbeatInterval&&t++,e.connection?.heartbeatTimeout&&t++,e.connection?.reconnectInterval&&t++,t},[e]),n=t/Fi;return(0,M.jsxs)(Sn,{className:`@container/card`,children:[(0,M.jsxs)(Cn,{className:`relative`,children:[(0,M.jsx)(Tn,{children:`系统设置`}),(0,M.jsxs)(wn,{className:`@[250px]/card:text-3xl text-2xl font-semibold tabular-nums`,children:[`已配置 `,t,`/`,Fi]}),(0,M.jsx)(`div`,{className:`absolute right-4 top-4`,children:(0,M.jsx)(Kt,{showValue:!0,value:t,maxValue:Fi,activeColor:n>=.8?`#16a34a`:n>=.5?`#f59e0b`:`#f87171`,inactiveColor:`#e5e7eb`,size:30,symbol:``})})]}),(0,M.jsxs)(Dn,{className:`flex items-center justify-between gap-1 text-sm`,children:[(0,M.jsx)(`div`,{className:`text-muted-foreground`,children:n===1?`配置已完成`:n>=.6?`还差 ${Fi-t} 项配置`:`请完善系统配置`}),(0,M.jsxs)(`div`,{className:`flex gap-2`,children:[(0,M.jsx)(Mi,{iconMode:!0}),(0,M.jsx)(Pi,{})]})]})]})}var Li=St(`relative w-full rounded-lg border p-4 [&>svg~*]:pl-7 [&>svg+div]:translate-y-[-3px] [&>svg]:absolute [&>svg]:left-4 [&>svg]:top-4 [&>svg]:text-foreground`,{variants:{variant:{default:`bg-background text-foreground`,destructive:`border-destructive/50 text-destructive dark:border-destructive [&>svg]:text-destructive`}},defaultVariants:{variant:`default`}}),Ri=O.forwardRef(({className:e,variant:t,...n},r)=>(0,M.jsx)(`div`,{ref:r,role:`alert`,className:N(Li({variant:t}),e),...n}));Ri.displayName=`Alert`;var zi=O.forwardRef(({className:e,...t},n)=>(0,M.jsx)(`h5`,{ref:n,className:N(`mb-1 font-medium leading-none tracking-tight`,e),...t}));zi.displayName=`AlertTitle`;var Bi=O.forwardRef(({className:e,...t},n)=>(0,M.jsx)(`div`,{ref:n,className:N(`text-sm [&_p]:leading-relaxed`,e),...t}));Bi.displayName=`AlertDescription`;function Vi({open:e,onOpenChange:t,selectedPath:n,onPromptUpdated:r,onPromptCreated:i,onPromptDeleted:a}){let[o,s]=(0,O.useState)(`view`),[c,l]=(0,O.useState)(!1),[u,d]=(0,O.useState)(!1),[f,p]=(0,O.useState)(``),[m,h]=(0,O.useState)(``),[g,_]=(0,O.useState)(``),[v,y]=(0,O.useState)(null),b=(0,O.useCallback)(async e=>{l(!0),y(null);try{let t=await k.getPromptFileContent(e);p(t.content),h(t.content),_(t.fileName)}catch(e){y(e instanceof Error?e.message:`加载提示词文件失败`)}finally{l(!1)}},[]);(0,O.useEffect)(()=>{e&&(o===`create`?(p(``),h(``),_(``),y(null)):n?b(n):(s(`create`),p(``),h(``),_(``),y(null)))},[e,n,o,b]),(0,O.useEffect)(()=>{e||s(`view`)},[e]);let x=async()=>{if(o===`create`){if(!g.trim()){y(`请输入文件名`);return}if(!g.endsWith(`.md`)){y(`文件名必须以 .md 结尾`);return}}d(!0),y(null);try{if(o===`create`){let e=await k.createPromptFile(g,f);E.success(`提示词文件创建成功`),i?.(e.relativePath),t(!1)}else n&&(await k.updatePromptFileContent(n,f),E.success(`提示词文件保存成功`),h(f),r?.(),s(`view`))}catch(e){y(e instanceof Error?e.message:`保存失败`)}finally{d(!1)}},ee=async()=>{if(n&&window.confirm(`确定要删除文件 "${g}" 吗?此操作无法撤销。`)){d(!0),y(null);try{await k.deletePromptFile(n),E.success(`提示词文件删除成功`),a?.(),t(!1)}catch(e){y(e instanceof Error?e.message:`删除失败`)}finally{d(!1)}}},S=f!==m;return(0,M.jsx)(I,{open:e,onOpenChange:t,children:(0,M.jsxs)(L,{className:`sm:max-w-[700px]`,children:[(0,M.jsxs)(R,{children:[(0,M.jsxs)(z,{className:`flex items-center gap-2`,children:[(0,M.jsx)(Me,{className:`size-5`}),(()=>{switch(o){case`create`:return`新建提示词文件`;case`edit`:return`编辑提示词`;default:return`查看提示词`}})()]}),(0,M.jsx)(fn,{children:o===`create`?`创建一个新的系统提示词文件`:n||`提示词文件`})]}),(0,M.jsxs)(`div`,{className:`space-y-4 py-4`,children:[v&&(0,M.jsxs)(Ri,{variant:`destructive`,children:[(0,M.jsx)(ut,{className:`size-4`}),(0,M.jsx)(Bi,{children:v})]}),o===`create`&&(0,M.jsxs)(`div`,{className:`space-y-2`,children:[(0,M.jsx)(An,{htmlFor:`fileName`,children:`文件名`}),(0,M.jsx)(B,{id:`fileName`,placeholder:`例如:custom-prompt.md`,value:g,onChange:e=>_(e.target.value),disabled:u})]}),c?(0,M.jsxs)(`div`,{className:`flex items-center justify-center py-8`,children:[(0,M.jsx)(T,{className:`size-6 animate-spin text-muted-foreground`}),(0,M.jsx)(`span`,{className:`ml-2 text-muted-foreground`,children:`加载中...`})]}):(0,M.jsxs)(`div`,{className:`space-y-2`,children:[(0,M.jsx)(An,{htmlFor:`content`,children:`提示词内容`}),(0,M.jsx)(ar,{id:`content`,placeholder:`请输入系统提示词内容...`,className:`min-h-[300px] font-mono text-sm`,value:f,onChange:e=>p(e.target.value),disabled:u||o===`view`&&!u})]})]}),(0,M.jsxs)(dn,{className:`gap-2 sm:gap-0`,children:[o===`view`&&n&&(0,M.jsxs)(M.Fragment,{children:[(0,M.jsxs)(F,{variant:`destructive`,size:`sm`,onClick:ee,disabled:u,className:`mr-auto`,children:[(0,M.jsx)(yt,{className:`size-4 mr-1`}),`删除`]}),(0,M.jsx)(F,{variant:`outline`,onClick:()=>s(`edit`),disabled:u,children:`编辑`}),(0,M.jsx)(ln,{asChild:!0,children:(0,M.jsx)(F,{variant:`secondary`,children:`关闭`})})]}),o===`edit`&&(0,M.jsxs)(M.Fragment,{children:[(0,M.jsx)(F,{variant:`outline`,onClick:()=>{s(`view`),p(m),y(null)},disabled:u,children:`取消`}),(0,M.jsx)(F,{onClick:x,disabled:u||!S,children:u?(0,M.jsxs)(M.Fragment,{children:[(0,M.jsx)(T,{className:`size-4 mr-1 animate-spin`}),`保存中...`]}):`保存`})]}),o===`create`&&(0,M.jsxs)(M.Fragment,{children:[(0,M.jsx)(ln,{asChild:!0,children:(0,M.jsx)(F,{variant:`outline`,disabled:u,children:`取消`})}),(0,M.jsx)(F,{onClick:x,disabled:u||!f.trim()||!g.trim(),children:u?(0,M.jsxs)(M.Fragment,{children:[(0,M.jsx)(T,{className:`size-4 mr-1 animate-spin`}),`创建中...`]}):(0,M.jsxs)(M.Fragment,{children:[(0,M.jsx)(ye,{className:`size-4 mr-1`}),`创建`]})})]})]})]})})}var Hi=O.forwardRef(({className:e,showPassword:t,onShowPasswordChange:n,...r},i)=>{let[a,o]=O.useState(!1),s=t!==void 0,c=s?t:a,l=()=>{s&&n?n(!t):o(!a)};return(0,M.jsxs)(`div`,{className:`relative`,children:[(0,M.jsx)(B,{type:c?`text`:`password`,className:N(`pr-10`,e),ref:i,...r}),(0,M.jsxs)(F,{type:`button`,variant:`ghost`,size:`icon`,className:`absolute right-0 top-0 h-full px-3 hover:bg-transparent`,onClick:l,"aria-label":c?`隐藏密码`:`显示密码`,"aria-pressed":c,children:[c?(0,M.jsx)(Xe,{className:`h-4 w-4 text-muted-foreground hover:text-foreground`}):(0,M.jsx)(ct,{className:`h-4 w-4 text-muted-foreground hover:text-foreground`}),(0,M.jsx)(`span`,{className:`sr-only`,children:c?`隐藏密码`:`显示密码`})]})]})});Hi.displayName=`PasswordInput`;var Ui=D.object({asr:D.object({appid:D.string().optional(),accessToken:D.string().optional()}),llm:D.object({model:D.string().min(1,{message:`模型名称不能为空`}),apiKey:D.string().min(1,{message:`API 密钥不能为空`}),baseURL:D.string().url({message:`请输入有效的 URL`}),prompt:D.string().optional()}),tts:D.object({appid:D.string().optional(),accessToken:D.string().optional(),voice_type:D.string().optional()})});function Wi(){let[e,t]=(0,O.useState)(!1),[n,r]=(0,O.useState)(!1),[i,a]=(0,O.useState)([]),[o,s]=(0,O.useState)(!1),[l,u]=(0,O.useState)(!1),[d,f]=(0,O.useState)(void 0),[p,m]=(0,O.useState)([]),[h,g]=(0,O.useState)(!1),_=mn(),{updateConfig:v}=Jn(),y=w({resolver:c(Ui),defaultValues:{asr:{appid:_?.asr?.appid||``,accessToken:_?.asr?.accessToken||``},llm:{model:_?.llm?.model||``,apiKey:_?.llm?.apiKey||``,baseURL:_?.llm?.baseURL||``,prompt:_?.llm?.prompt||``},tts:{appid:_?.tts?.appid||``,accessToken:_?.tts?.accessToken||``,voice_type:_?.tts?.voice_type||``}}}),b=(0,O.useRef)(!1);(0,O.useEffect)(()=>{e&&!b.current&&_&&(y.reset({asr:{appid:_.asr?.appid||``,accessToken:_.asr?.accessToken||``},llm:{model:_.llm?.model||``,apiKey:_.llm?.apiKey||``,baseURL:_.llm?.baseURL||``,prompt:_.llm?.prompt||``},tts:{appid:_.tts?.appid||``,accessToken:_.tts?.accessToken||``,voice_type:_.tts?.voice_type||``}}),b.current=!0),e||(b.current=!1,y.reset())},[e,_,y]);let x=(0,O.useCallback)(async()=>{s(!0);try{a(await k.getPromptFiles())}catch(e){console.error(`加载提示词文件列表失败:`,e),a([])}finally{s(!1)}},[]),ee=(0,O.useCallback)(async()=>{g(!0);try{m((await k.getTTSVoices()).voices)}catch(e){console.error(`加载音色列表失败:`,e),m([])}finally{g(!1)}},[]);(0,O.useEffect)(()=>{e&&(x(),ee())},[e,x,ee]);let S=(0,O.useCallback)(()=>{let e=y.getValues(`llm.prompt`);f(e&&e!==`__none__`?e:void 0),u(!0)},[y]),C=(0,O.useCallback)(()=>{f(void 0),u(!0)},[]),te=(0,O.useCallback)(()=>{x()},[x]),ne=(0,O.useCallback)(e=>{x(),y.setValue(`llm.prompt`,e)},[x,y]),re=(0,O.useCallback)(()=>{x(),y.setValue(`llm.prompt`,``)},[x,y]);async function ie(e){if(!_){E.error(`配置数据未加载,请稍后重试`);return}r(!0);try{let n=e.asr.appid||e.asr.accessToken?{appid:e.asr.appid||void 0,accessToken:e.asr.accessToken||void 0}:{},r={model:e.llm.model,apiKey:e.llm.apiKey,baseURL:e.llm.baseURL,prompt:e.llm.prompt||void 0},i=e.tts.appid||e.tts.accessToken||e.tts.voice_type?{appid:e.tts.appid||void 0,accessToken:e.tts.accessToken||void 0,voice_type:e.tts.voice_type||void 0}:{};await v({..._,asr:n,llm:r,tts:i}),E.success(`语音交互配置已更新`),t(!1)}catch(e){console.error(`更新语音交互配置失败:`,e),E.error(e instanceof Error?e.message:`更新配置失败`)}finally{r(!1)}}return(0,M.jsxs)(M.Fragment,{children:[(0,M.jsxs)(I,{open:e,onOpenChange:t,children:[(0,M.jsx)(sn,{asChild:!0,children:(0,M.jsx)(F,{variant:`secondary`,size:`icon`,className:`size-8`,children:(0,M.jsx)(me,{className:`size-4`})})}),(0,M.jsxs)(L,{className:`sm:max-w-[600px]`,children:[(0,M.jsxs)(R,{children:[(0,M.jsx)(z,{children:`语音交互设置`}),(0,M.jsx)(fn,{children:`配置 ASR(语音识别)、LLM(大语言模型)、TTS(语音合成)服务`})]}),(0,M.jsx)(jn,{...y,children:(0,M.jsxs)(`form`,{onSubmit:y.handleSubmit(ie),children:[(0,M.jsxs)(`div`,{className:`max-h-[60vh] overflow-y-auto pr-2`,children:[(0,M.jsxs)(`div`,{className:`mb-4`,children:[(0,M.jsx)(`h3`,{className:`text-sm font-medium text-foreground mb-3`,children:`ASR 配置`}),(0,M.jsxs)(`div`,{className:`grid gap-4`,children:[(0,M.jsx)(H,{control:y.control,name:`asr.appid`,render:({field:e})=>(0,M.jsxs)(U,{children:[(0,M.jsx)(W,{children:`应用 ID`}),(0,M.jsx)(G,{children:(0,M.jsx)(B,{placeholder:`请输入火山引擎语音识别应用 ID`,className:`font-mono text-sm`,disabled:n,...e})}),(0,M.jsx)(K,{})]})}),(0,M.jsx)(H,{control:y.control,name:`asr.accessToken`,render:({field:e})=>(0,M.jsxs)(U,{children:[(0,M.jsx)(W,{children:`访问令牌`}),(0,M.jsx)(G,{children:(0,M.jsx)(Hi,{placeholder:`请输入访问令牌`,className:`font-mono text-sm`,disabled:n,autoComplete:`off`,...e})}),(0,M.jsx)(K,{})]})})]})]}),(0,M.jsx)(Ci,{className:`my-4`}),(0,M.jsxs)(`div`,{className:`mb-4`,children:[(0,M.jsx)(`h3`,{className:`text-sm font-medium text-foreground mb-3`,children:`LLM 配置`}),(0,M.jsxs)(`div`,{className:`grid gap-4`,children:[(0,M.jsx)(H,{control:y.control,name:`llm.model`,render:({field:e})=>(0,M.jsxs)(U,{children:[(0,M.jsxs)(W,{children:[`模型名称 `,(0,M.jsx)(`span`,{className:`text-red-500`,children:`*`})]}),(0,M.jsx)(G,{children:(0,M.jsx)(B,{placeholder:`如:gpt-4、deepseek-chat`,className:`font-mono text-sm`,disabled:n,...e})}),(0,M.jsx)(K,{})]})}),(0,M.jsx)(H,{control:y.control,name:`llm.apiKey`,render:({field:e})=>(0,M.jsxs)(U,{children:[(0,M.jsxs)(W,{children:[`API 密钥 `,(0,M.jsx)(`span`,{className:`text-red-500`,children:`*`})]}),(0,M.jsx)(G,{children:(0,M.jsx)(Hi,{placeholder:`请输入 API 密钥`,className:`font-mono text-sm`,disabled:n,autoComplete:`off`,...e})}),(0,M.jsx)(K,{})]})}),(0,M.jsx)(H,{control:y.control,name:`llm.baseURL`,render:({field:e})=>(0,M.jsxs)(U,{children:[(0,M.jsxs)(W,{children:[`API 基础地址 `,(0,M.jsx)(`span`,{className:`text-red-500`,children:`*`})]}),(0,M.jsx)(G,{children:(0,M.jsx)(B,{placeholder:`如:https://api.openai.com/v1`,className:`font-mono text-sm`,disabled:n,...e})}),(0,M.jsx)(K,{})]})}),(0,M.jsx)(H,{control:y.control,name:`llm.prompt`,render:({field:e})=>(0,M.jsxs)(U,{children:[(0,M.jsx)(W,{children:`系统提示词文件`}),(0,M.jsxs)(`div`,{className:`flex gap-2`,children:[(0,M.jsx)(G,{children:(0,M.jsxs)(Qn,{disabled:n||o,value:e.value||`__none__`,onValueChange:t=>{e.onChange(t===`__none__`?``:t)},children:[(0,M.jsx)(J,{className:`font-mono text-sm flex-1`,children:(0,M.jsx)(er,{placeholder:`选择提示词文件(可选)`})}),(0,M.jsxs)(Y,{children:[(0,M.jsx)(X,{value:`__none__`,children:`不使用提示词文件`}),i.map(e=>(0,M.jsx)(X,{value:e.relativePath,children:e.fileName},e.relativePath))]})]})}),(0,M.jsx)(F,{type:`button`,variant:`outline`,size:`icon`,onClick:S,disabled:n||o||!y.watch(`llm.prompt`)||y.watch(`llm.prompt`)===`__none__`,title:`编辑选中的提示词文件`,children:(0,M.jsx)(ge,{className:`size-4`})}),(0,M.jsx)(F,{type:`button`,variant:`outline`,size:`icon`,onClick:C,disabled:n||o,title:`新建提示词文件`,children:(0,M.jsx)(ye,{className:`size-4`})})]}),(0,M.jsx)(K,{})]})})]})]}),(0,M.jsx)(Ci,{className:`my-4`}),(0,M.jsxs)(`div`,{className:`mb-4`,children:[(0,M.jsx)(`h3`,{className:`text-sm font-medium text-foreground mb-3`,children:`TTS 配置`}),(0,M.jsxs)(`div`,{className:`grid gap-4`,children:[(0,M.jsx)(H,{control:y.control,name:`tts.appid`,render:({field:e})=>(0,M.jsxs)(U,{children:[(0,M.jsx)(W,{children:`应用 ID`}),(0,M.jsx)(G,{children:(0,M.jsx)(B,{placeholder:`请输入火山引擎语音合成应用 ID`,className:`font-mono text-sm`,disabled:n,...e})}),(0,M.jsx)(K,{})]})}),(0,M.jsx)(H,{control:y.control,name:`tts.accessToken`,render:({field:e})=>(0,M.jsxs)(U,{children:[(0,M.jsx)(W,{children:`访问令牌`}),(0,M.jsx)(G,{children:(0,M.jsx)(Hi,{placeholder:`请输入访问令牌`,className:`font-mono text-sm`,disabled:n,autoComplete:`off`,...e})}),(0,M.jsx)(K,{})]})}),(0,M.jsx)(H,{control:y.control,name:`tts.voice_type`,render:({field:e})=>(0,M.jsxs)(U,{children:[(0,M.jsx)(W,{children:`声音类型`}),(0,M.jsx)(G,{children:(0,M.jsxs)(Qn,{disabled:n||h,value:e.value||`__none__`,onValueChange:t=>{e.onChange(t===`__none__`?``:t)},children:[(0,M.jsx)(J,{className:`font-mono text-sm`,children:(0,M.jsx)(er,{placeholder:`选择音色(可选)`})}),(0,M.jsxs)(Y,{children:[(0,M.jsx)(X,{value:`__none__`,children:`不指定音色`}),e.value&&e.value!==`__none__`&&!p.some(t=>t.voiceType===e.value)&&(0,M.jsxs)(X,{value:e.value,children:[e.value,` (自定义音色)`]}),Object.entries(p.reduce((e,t)=>(e[t.scene]||(e[t.scene]=[]),e[t.scene].push(t),e),{})).map(([e,t])=>(0,M.jsxs)($n,{children:[(0,M.jsx)(rr,{children:e}),t.map(e=>(0,M.jsx)(X,{value:e.voiceType,children:e.name},e.voiceType))]},e))]})]})}),(0,M.jsx)(K,{})]})})]})]})]}),(0,M.jsxs)(dn,{className:`mt-4`,children:[(0,M.jsx)(ln,{asChild:!0,children:(0,M.jsx)(F,{type:`button`,variant:`outline`,disabled:n,children:`取消`})}),(0,M.jsx)(F,{type:`submit`,disabled:n,children:n?`保存中...`:`保存`})]})]})})]})]}),(0,M.jsx)(Vi,{open:l,onOpenChange:u,selectedPath:d,onPromptUpdated:te,onPromptCreated:ne,onPromptDeleted:re})]})}function Gi(e){return!!(e?.appid&&e?.accessToken)}function Ki(e){return!!(e?.model&&e?.apiKey&&e?.baseURL)}function qi(e){return!!(e?.appid&&e?.accessToken&&e?.voice_type)}function Ji(){let{asr:e,llm:t,tts:n}=gn(),r=(0,O.useMemo)(()=>{let r=0;return Gi(e)&&r++,Ki(t)&&r++,qi(n)&&r++,r},[e,t,n]),i=r/3,a=[];return Gi(e)&&a.push(`ASR`),Ki(t)&&a.push(`LLM`),qi(n)&&a.push(`TTS`),(0,M.jsxs)(Sn,{className:`@container/card`,children:[(0,M.jsxs)(Cn,{className:`relative`,children:[(0,M.jsx)(Tn,{children:`实时语音`}),(0,M.jsxs)(wn,{className:`@[250px]/card:text-3xl text-2xl font-semibold tabular-nums`,children:[r,`/`,3,` 就绪`]}),(0,M.jsx)(`div`,{className:`absolute right-4 top-4`,children:(0,M.jsx)(Kt,{showValue:!0,value:r,maxValue:3,activeColor:i>=1?`#16a34a`:i>=.66?`#f59e0b`:`#f87171`,inactiveColor:`#e5e7eb`,size:30,symbol:``})})]}),(0,M.jsxs)(Dn,{className:`flex items-center justify-between gap-1 text-sm`,children:[(0,M.jsx)(`div`,{className:`text-muted-foreground`,children:i===1?`语音交互已就绪`:a.length>0?`${a.join(`、`)} 已配置`:`请配置语音服务`}),(0,M.jsx)(Wi,{})]})]})}function Yi(){return(0,M.jsxs)(`div`,{className:`*:data-[slot=card]:shadow-xs @xl/main:grid-cols-2 @5xl/main:grid-cols-5 grid grid-cols-1 gap-4 px-4 *:data-[slot=card]:bg-gradient-to-t *:data-[slot=card]:from-primary/5 *:data-[slot=card]:to-card dark:*:data-[slot=card]:bg-card lg:px-6`,children:[(0,M.jsx)(On,{}),(0,M.jsx)(Zn,{}),(0,M.jsx)(ji,{}),(0,M.jsx)(Ji,{}),(0,M.jsx)(Ii,{})]})}function Xi({text:e,maxLength:t=100,storageKey:n,className:r,textSize:i=`text-sm`}){let[a,o]=(0,O.useState)(()=>{if(!n)return!1;try{return localStorage.getItem(n)===`true`}catch{return!1}});(0,O.useEffect)(()=>{if(n)try{localStorage.setItem(n,String(a))}catch(e){console.warn(`无法写入 localStorage:`,e)}},[a,n]),(0,O.useEffect)(()=>{n&&o(localStorage.getItem(n)===`true`)},[n]);let s=()=>{o(e=>!e)},c=e||`-`,l=c.length>t;return(0,M.jsxs)(`div`,{className:N(`flex flex-col gap-1`,r),children:[a||!l?(0,M.jsx)(`p`,{className:N(`break-words`,i),children:c}):(0,M.jsxs)(`p`,{className:N(`break-words`,i),children:[c.slice(0,t),(0,M.jsx)(`span`,{className:`text-muted-foreground`,children:`...`})]}),l&&(0,M.jsx)(`button`,{type:`button`,onClick:s,className:N(`text-primary hover:underline flex items-center gap-1 w-fit`,i),children:a?(0,M.jsxs)(M.Fragment,{children:[`收起 `,(0,M.jsx)(je,{className:`h-4 w-4`})]}):(0,M.jsxs)(M.Fragment,{children:[`展开 `,(0,M.jsx)(Je,{className:`h-4 w-4`})]})})]})}var Zi=ze,Qi=we,$i=Ze,ea=O.forwardRef(({className:e,sideOffset:t=4,...n},r)=>(0,M.jsx)(rt,{ref:r,sideOffset:t,className:N(`z-50 overflow-hidden rounded-md border bg-popover px-3 py-1.5 text-sm text-popover-foreground shadow-md 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]`,e),...n}));ea.displayName=rt.displayName;function ta(e){if(!e||typeof e!=`object`)return Mt();switch(e.type){case`string`:{if(e.enum)return At(e.enum);let t=Dt();return e.minLength&&(t=t.min(e.minLength)),e.maxLength&&(t=t.max(e.maxLength)),e.pattern&&(t=t.regex(new RegExp(e.pattern))),t}case`number`:case`integer`:{let t=Et();return e.type===`integer`&&(t=t.int()),typeof e.minimum==`number`&&(t=t.min(e.minimum)),typeof e.maximum==`number`&&(t=t.max(e.maximum)),typeof e.multipleOf==`number`&&(t=t.multipleOf(e.multipleOf)),t}case`boolean`:return Tt();case`array`:if(e.items){let t=Ot(ta(e.items));return typeof e.minItems==`number`&&(t=t.min(e.minItems)),typeof e.maxItems==`number`&&(t=t.max(e.maxItems)),t}return Ot(Mt());case`object`:if(e.properties&&Object.keys(e.properties).length>0){let t={},n=e.required||[];for(let[r,i]of Object.entries(e.properties)){let e=ta(i);n.includes(r)||(e=e.optional()),t[r]=e}return kt(t)}return Pt(Dt(),Mt());default:return Mt()}}function na(e){if(e)switch(e.type){case`string`:return e.enum?e.enum[0]:``;case`number`:case`integer`:return 0;case`boolean`:return!1;case`array`:return[];case`object`:if(e.properties){let t={};for(let[n,r]of Object.entries(e.properties))t[n]=na(r);return t}return{};default:return}}function ra(e){if(!e||!e.properties)return{};let t={},n=e.required||[];for(let[r,i]of Object.entries(e.properties))if(n.includes(r))t[r]=na(i);else{let e=na(i);e!==void 0&&e!==``&&(t[r]=e)}return t}var ia=(0,O.memo)(function({name:e,schema:t,form:n,renderFormField:r}){let{fields:i,append:a,remove:o}=Ve({control:n.control,name:e});return(0,M.jsxs)(`div`,{className:`space-y-2`,children:[(0,M.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,M.jsxs)(`span`,{className:`text-sm font-medium`,children:[`数组项目 (`,t.items?.type||`unknown`,`)`]}),(0,M.jsxs)(F,{type:`button`,variant:`outline`,size:`sm`,onClick:()=>{let e=t.items,n;switch(e.type){case`string`:n=e.enum?e.enum[0]:``;break;case`number`:case`integer`:n=0;break;case`boolean`:n=!1;break;case`array`:n=[];break;case`object`:n={};break;default:n=``}a(n)},className:`h-8 px-2`,children:[(0,M.jsx)(ye,{className:`h-3 w-3 mr-1`}),`添加`]})]}),i.length===0?(0,M.jsx)(`div`,{className:`text-center py-4 border border-dashed rounded-md`,children:(0,M.jsx)(`span`,{className:`text-sm text-muted-foreground`,children:`暂无数组项目`})}):(0,M.jsx)(`div`,{className:`space-y-3`,children:i.map((i,a)=>(0,M.jsxs)(`div`,{className:`relative p-3 border rounded-md bg-muted/20`,children:[(0,M.jsx)(`div`,{className:`absolute top-2 right-2`,children:(0,M.jsx)(F,{type:`button`,variant:`ghost`,size:`sm`,onClick:()=>o(a),className:`h-6 w-6 p-0 text-red-500 hover:text-red-700`,children:(0,M.jsx)(yt,{className:`h-3 w-3`})})}),(0,M.jsxs)(`div`,{className:`pr-8`,children:[(0,M.jsxs)(`span`,{className:`text-xs font-medium text-muted-foreground mb-2 block`,children:[`项目 `,a+1]}),(0,M.jsx)(H,{control:n.control,name:`${e}.${a}`,render:()=>(0,M.jsx)(U,{children:t.items?.type===`object`||t.items?.type===`array`?(0,M.jsx)(`div`,{className:`ml-6 border-l-2 border-muted pl-4`,children:r(`${e}.${a}`,t.items)}):r(`${e}.${a}`,t.items)})})]})]},i.id))})]})}),aa=(0,O.memo)(function({name:e,schema:t,form:r,renderFormField:i,getTypeBadge:a}){return!t.properties||Object.keys(t.properties).length===0?(0,M.jsx)(`div`,{className:`text-center py-4 border border-dashed rounded-md`,children:(0,M.jsx)(`span`,{className:`text-sm text-muted-foreground`,children:`对象无定义字段`})}):(0,M.jsxs)(`div`,{className:`space-y-4`,children:[(0,M.jsx)(`span`,{className:`text-sm font-medium`,children:`对象字段`}),Object.entries(t.properties).map(([o,s])=>(0,M.jsx)(`div`,{className:`ml-6 border-l-2 border-muted pl-4`,children:(0,M.jsx)(H,{control:r.control,name:`${e}.${o}`,render:()=>(0,M.jsxs)(U,{children:[(0,M.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,M.jsxs)(W,{children:[t.required?.includes(o)&&(0,M.jsx)(`span`,{className:`text-red-500 mr-1`,children:`*`}),o]}),(0,M.jsx)(P,{variant:`secondary`,className:`text-xs ${a(s.type)}`,children:s.type}),s.description&&(0,M.jsxs)(Qi,{children:[(0,M.jsx)($i,{children:(0,M.jsx)(n,{className:`h-4 w-4 text-muted-foreground`})}),(0,M.jsx)(ea,{children:(0,M.jsx)(`p`,{className:`max-w-xs whitespace-pre-wrap`,children:s.description})})]})]}),i(`${e}.${o}`,s),s.description&&(0,M.jsx)(Fn,{children:s.description}),(0,M.jsx)(K,{})]})})},`${e}-${o}`))]})}),oa=(0,O.memo)(function(){return(0,M.jsx)(`div`,{className:`h-full flex items-center justify-center`,children:(0,M.jsxs)(`div`,{className:`text-center space-y-4 max-w-sm mx-auto p-6`,children:[(0,M.jsx)(`div`,{className:`mx-auto w-16 h-16 bg-green-100 rounded-full flex items-center justify-center`,children:(0,M.jsx)(Re,{className:`h-8 w-8 text-green-600`})}),(0,M.jsxs)(`div`,{className:`space-y-2`,children:[(0,M.jsx)(`h3`,{className:`text-lg font-semibold text-foreground`,children:`无需输入参数`}),(0,M.jsx)(`p`,{className:`text-sm text-muted-foreground`,children:`点击"调用工具"按钮执行,无需输入任何参数。`})]})]})})}),sa=(0,O.memo)(function({tool:e,form:t,renderFormField:r}){return e?.inputSchema?.properties?(0,M.jsx)(jn,{...t,children:(0,M.jsx)(xi,{className:`h-full`,children:(0,M.jsx)(`div`,{className:`space-y-4 p-2`,children:Object.entries(e.inputSchema.properties).map(([i,a])=>(0,M.jsx)(H,{control:t.control,name:i,render:()=>(0,M.jsxs)(U,{children:[(0,M.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,M.jsxs)(W,{children:[e.inputSchema.required?.includes(i)&&(0,M.jsx)(`span`,{className:`text-red-500 mr-1`,children:`*`}),i]}),(0,M.jsx)(P,{variant:`secondary`,className:`text-xs ${a.type===`string`?`bg-blue-100 text-blue-800`:a.type===`number`||a.type===`integer`?`bg-green-100 text-green-800`:a.type===`boolean`?`bg-purple-100 text-purple-800`:a.type===`array`?`bg-orange-100 text-orange-800`:(a.type,`bg-gray-100 text-gray-800`)}`,children:a.type}),a.description&&(0,M.jsxs)(Qi,{children:[(0,M.jsx)($i,{children:(0,M.jsx)(n,{className:`h-4 w-4 text-muted-foreground`})}),(0,M.jsx)(ea,{children:(0,M.jsx)(`p`,{className:`max-w-xs whitespace-pre-wrap`,children:a.description})})]})]}),r(i,a),(0,M.jsx)(K,{})]})},`${e.name}-${i}`))})})}):(0,M.jsxs)(`div`,{className:`text-center py-8`,children:[(0,M.jsx)(ot,{className:`h-8 w-8 mx-auto mb-2 opacity-50`}),(0,M.jsx)(`p`,{className:`text-muted-foreground`,children:`该工具无参数定义`})]})});function ca({open:e,onOpenChange:t,tool:n}){let[r,i]=(0,O.useState)(`form`),[a,o]=(0,O.useState)(`{
64
+
65
+ }`),[s,l]=(0,O.useState)(null),[u,d]=(0,O.useState)(!1),[f,p]=(0,O.useState)(null),[m,h]=(0,O.useState)(!1),g=(0,O.useRef)(null),_=(0,O.useMemo)(()=>n?.inputSchema?ta(n.inputSchema):kt({}),[n?.inputSchema]),v=(0,O.useMemo)(()=>n?.inputSchema?ra(n.inputSchema):{},[n?.inputSchema]),y=w({resolver:c(_),defaultValues:v,mode:`onChange`});(0,O.useEffect)(()=>{if(n?.inputSchema){y.reset(v);try{o(JSON.stringify(v,null,2))}catch{o(`{
66
+
67
+ }`)}}else y.reset({}),o(`{
68
+
69
+ }`)},[n?.inputSchema,v,y]),(0,O.useEffect)(()=>()=>{g.current&&clearTimeout(g.current)},[]);let b=(0,O.useCallback)(()=>{i(`form`),o(`{
70
+
71
+ }`),l(null),p(null),h(!1),n?.inputSchema&&y.reset(v)},[n?.inputSchema,v,y]),x=(0,O.useCallback)(e=>{if(e===`json`&&r===`form`){let e=y.getValues();try{o(JSON.stringify(e,null,2))}catch{o(`{
72
+
73
+ }`)}}else if(e===`form`&&r===`json`)try{let e=JSON.parse(a);for(let t of Object.keys(e))y.setValue(t,e[t])}catch{}i(e)},[r,a,y]),ee=(0,O.useCallback)(e=>{e||b(),t(e)},[t,b]),S=(0,O.useCallback)(e=>{try{return JSON.parse(e),!0}catch{return!1}},[]),C=(0,O.useCallback)(async()=>{if(!n)return;let e;if(!n?.inputSchema?.properties||Object.keys(n.inputSchema.properties).length===0)e={};else if(r===`form`){let t=y.getValues();if(!await y.trigger()){E.error(`请检查表单中的错误`);return}e=t}else{if(!S(a)){E.error(`输入参数不是有效的JSON格式`);return}e=JSON.parse(a)}d(!0),p(null),l(null);try{l(await k.callTool(n.serverName,n.toolName,e)),E.success(`工具调用成功`)}catch(e){let t=e instanceof Error?e.message:`调用工具失败`;p(t),E.error(t)}finally{d(!1)}},[n,r,y,a,S]),te=(0,O.useCallback)(async()=>{let e=s?JSON.stringify(s,null,2):f||``;try{await navigator.clipboard.writeText(e),h(!0),E.success(`已复制到剪贴板`),g.current&&clearTimeout(g.current),g.current=setTimeout(()=>h(!1),2e3)}catch{E.error(`复制失败`)}},[s,f]),ne=(0,O.useCallback)(()=>{if(l(null),p(null),r===`form`&&n?.inputSchema){y.reset(v);try{o(JSON.stringify(v,null,2))}catch{o(`{
74
+
75
+ }`)}}else o(`{
76
+
77
+ }`),n?.inputSchema?y.reset(v):y.reset({})},[r,n?.inputSchema,v,y]),re=(0,O.useMemo)(()=>{let e=e=>({string:`bg-blue-100 text-blue-800`,number:`bg-green-100 text-green-800`,integer:`bg-green-100 text-green-800`,boolean:`bg-purple-100 text-purple-800`,array:`bg-orange-100 text-orange-800`,object:`bg-gray-100 text-gray-800`})[e]||`bg-gray-100 text-gray-800`;return(t,n)=>{switch(n.type){case`string`:return n.enum?(0,M.jsx)(Ue,{name:t,control:y.control,render:({field:e})=>(0,M.jsxs)(Qn,{value:e.value,onValueChange:e.onChange,children:[(0,M.jsx)(G,{children:(0,M.jsx)(J,{children:(0,M.jsx)(er,{placeholder:`选择${t}`})})}),(0,M.jsx)(Y,{children:n.enum.map(e=>(0,M.jsx)(X,{value:e,children:e},e))})]})}):(0,M.jsx)(Ue,{name:t,control:y.control,render:({field:e})=>(0,M.jsx)(G,{children:(0,M.jsx)(B,{...e,placeholder:`输入${t}`,type:n.format===`password`?`password`:`text`})})});case`number`:case`integer`:return(0,M.jsx)(Ue,{name:t,control:y.control,render:({field:e})=>(0,M.jsx)(G,{children:(0,M.jsx)(B,{...e,type:`number`,placeholder:`输入${t}`,step:n.type===`integer`?`1`:`0.1`,onChange:t=>{let n=t.target.value;e.onChange(n===``?``:Number(n))}})})});case`boolean`:return(0,M.jsx)(Ue,{name:t,control:y.control,render:({field:e})=>(0,M.jsxs)(Qn,{value:e.value?.toString(),onValueChange:t=>e.onChange(t===`true`),children:[(0,M.jsx)(G,{children:(0,M.jsx)(J,{children:(0,M.jsx)(er,{placeholder:`选择${t}`})})}),(0,M.jsxs)(Y,{children:[(0,M.jsx)(X,{value:`true`,children:`true`}),(0,M.jsx)(X,{value:`false`,children:`false`})]})]})});case`array`:return(0,M.jsx)(ia,{name:t,schema:n,form:y,renderFormField:re});case`object`:return(0,M.jsx)(aa,{name:t,schema:n,form:y,renderFormField:re,getTypeBadge:e});default:return(0,M.jsx)(Ue,{name:t,control:y.control,render:({field:e})=>(0,M.jsx)(G,{children:(0,M.jsx)(B,{...e,placeholder:`输入${t}`})})})}}},[y]),ie=(0,O.useCallback)(e=>{try{return JSON.stringify(e,null,2)}catch{return String(e)}},[]),ae=(0,O.useCallback)(()=>typeof window>`u`||/Mac|iPhone|iPad|iPod/.test(navigator.platform)?`⌘+Enter`:`Ctrl+Enter`,[]),se=(0,O.useCallback)(async t=>{if((/Mac|iPhone|iPad|iPod/.test(navigator.platform)?t.metaKey&&t.key===`Enter`:t.ctrlKey&&t.key===`Enter`)&&e&&!u){if(t.preventDefault(),!(!n?.inputSchema?.properties||Object.keys(n.inputSchema.properties).length===0)&&r===`json`&&!S(a)){E.error(`输入参数不是有效的JSON格式`);return}await C()}},[e,u,r,a,S,C,n?.inputSchema?.properties]);return(0,O.useEffect)(()=>{if(e)return window.addEventListener(`keydown`,se),()=>{window.removeEventListener(`keydown`,se)}},[e,se]),(0,M.jsx)(I,{open:e,onOpenChange:ee,children:(0,M.jsx)(Zi,{children:(0,M.jsxs)(L,{className:`max-w-4xl max-h-[90vh] flex flex-col`,children:[(0,M.jsx)(R,{children:(0,M.jsxs)(z,{className:`flex items-center gap-2`,children:[(0,M.jsx)(oe,{className:`h-5 w-5`}),`工具调试`]})}),n&&(0,M.jsxs)(`div`,{className:`flex flex-col gap-4 h-[80vh]`,children:[(0,M.jsxs)(Sn,{children:[(0,M.jsx)(Cn,{className:`pb-0`,children:(0,M.jsxs)(wn,{className:`text-base flex items-center gap-2`,children:[(0,M.jsx)(P,{variant:`secondary`,children:n.serverName}),n.toolName]})}),(0,M.jsx)(En,{children:n.description&&(0,M.jsx)(`p`,{className:`text-sm text-muted-foreground mt-2`,children:n.description})})]}),(0,M.jsxs)(`div`,{className:`flex-1 flex min-h-0 w-full overflow-hidden`,children:[(0,M.jsxs)(`div`,{className:`w-1/2 flex flex-col gap-2 flex-shrink-0 overflow-hidden pr-0.5`,children:[(0,M.jsxs)(`div`,{className:`flex items-center justify-between h-[40px]`,children:[(0,M.jsx)(`h3`,{className:`text-sm font-medium`,children:`输入参数`}),n?.inputSchema?.properties&&Object.keys(n.inputSchema.properties).length>0&&(0,M.jsx)(pr,{value:r,onValueChange:e=>x(e),children:(0,M.jsxs)(mr,{className:`grid w-full grid-cols-2`,children:[(0,M.jsx)(hr,{value:`form`,className:`text-xs`,children:`表单模式`}),(0,M.jsx)(hr,{value:`json`,className:`text-xs`,children:`高级模式`})]})})]}),(0,M.jsx)(`div`,{className:`flex-1 min-h-0`,children:n?.inputSchema?.properties&&Object.keys(n.inputSchema.properties).length>0?(0,M.jsxs)(pr,{value:r,onValueChange:e=>x(e),className:`h-full flex flex-col`,children:[(0,M.jsx)(gr,{value:`form`,className:`flex-1 data-[state=active]:flex data-[state=active]:flex-col mt-0`,children:(0,M.jsx)(sa,{tool:n,form:y,renderFormField:re})}),(0,M.jsx)(gr,{value:`json`,className:`flex-1 data-[state=active]:flex data-[state=active]:flex-col mt-0`,children:(0,M.jsxs)(`div`,{className:`flex-1 flex flex-col`,children:[(0,M.jsx)(ar,{value:a,onChange:e=>o(e.target.value),placeholder:`请输入JSON格式的参数...`,className:`flex-1 font-mono text-sm resize-none min-h-[200px]`,disabled:u}),!S(a)&&a.trim()!==`{
78
+
79
+ }`&&(0,M.jsxs)(Ri,{className:`mt-2`,children:[(0,M.jsx)(ut,{className:`h-4 w-4`}),(0,M.jsx)(Bi,{children:`JSON格式错误,请检查输入`})]})]})})]}):(0,M.jsx)(oa,{})})]}),(0,M.jsxs)(`div`,{className:`w-1/2 flex flex-col gap-2 flex-shrink-0 overflow-hidden pl-0.5`,children:[(0,M.jsxs)(`div`,{className:`flex items-center justify-between h-[40px]`,children:[(0,M.jsx)(`h3`,{className:`text-sm font-medium`,children:`调用结果`}),(s||f)&&(0,M.jsx)(F,{variant:`outline`,size:`sm`,onClick:te,className:`gap-0`,children:m?(0,M.jsxs)(M.Fragment,{children:[(0,M.jsx)(Re,{className:`h-4 w-4 mr-1`}),`已复制`]}):(0,M.jsxs)(M.Fragment,{children:[(0,M.jsx)(Te,{className:`h-4 w-4 mr-1`}),`复制结果`]})})]}),(0,M.jsx)(`div`,{className:`flex-1 min-h-0`,children:u?(0,M.jsx)(`div`,{className:`h-full flex items-center justify-center border rounded-md`,children:(0,M.jsxs)(`div`,{className:`flex flex-col items-center gap-2`,children:[(0,M.jsx)(T,{className:`h-8 w-8 animate-spin`}),(0,M.jsx)(`span`,{className:`text-sm text-muted-foreground`,children:`正在调用工具...`})]})}):f?(0,M.jsx)(`div`,{className:`h-full`,children:(0,M.jsx)(Ri,{variant:`destructive`,className:`h-full`,children:(0,M.jsx)(Bi,{className:`font-mono text-sm whitespace-pre-wrap break-words`,children:f})})}):s?(0,M.jsx)(xi,{className:`h-full border rounded-md`,children:(0,M.jsx)(`pre`,{className:`p-3 text-sm font-mono whitespace-pre-wrap break-words min-w-0`,children:ie(s)})}):(0,M.jsx)(`div`,{className:`h-full flex items-center justify-center border rounded-md`,children:(0,M.jsxs)(`div`,{className:`text-center text-muted-foreground`,children:[(0,M.jsx)(ot,{className:`h-8 w-8 mx-auto mb-2 opacity-50`}),(0,M.jsx)(`p`,{children:`等待调用工具...`})]})})})]})]}),(0,M.jsxs)(`div`,{className:`flex justify-end gap-2 pt-4 border-t`,children:[(0,M.jsxs)(F,{variant:`outline`,onClick:ne,disabled:u,children:[(0,M.jsx)(Ie,{className:`h-4 w-4`}),`清空`]}),(0,M.jsx)(F,{onClick:C,disabled:u||!(!n?.inputSchema?.properties||Object.keys(n.inputSchema.properties).length===0)&&r===`json`&&!S(a),children:u?(0,M.jsxs)(M.Fragment,{children:[(0,M.jsx)(T,{className:`h-4 w-4 mr-2 animate-spin`}),`调用中...`]}):(0,M.jsxs)(M.Fragment,{children:[(0,M.jsx)(xe,{className:`h-4 w-4`}),!n?.inputSchema?.properties||Object.keys(n.inputSchema.properties).length===0?`直接调用`:`调用工具`,` (`,ae(),`)`]})})]})]})]})})})}var la=O.forwardRef(({className:e,...t},n)=>(0,M.jsx)(st,{className:N(`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`,e),...t,ref:n,children:(0,M.jsx)(Ye,{className:N(`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`)})}));la.displayName=st.displayName;function ua(e){let[t,n]=(0,O.useState)(``),r=Array.isArray(e)?e:[];return{searchValue:t,setSearchValue:n,filteredTools:(0,O.useMemo)(()=>{if(!t.trim())return r;let e=t.toLowerCase();return r.filter(t=>(t?.serverName?.toLowerCase()||``).includes(e)||(t?.toolName?.toLowerCase()||``).includes(e)||(t?.description?.toLowerCase()||``).includes(e))},[r,t]),clearSearch:(0,O.useCallback)(()=>{n(``)},[])}}var da=[`name`,`enabled`,`usageCount`,`lastUsedTime`];function fa(){return Xr({storageKey:`mcp-tool-sort-config`,defaultConfig:{field:`name`},validFields:da,loggerName:`useToolSortPersistence`})}var pa=[{value:`name`,label:`按名称排序`},{value:`enabled`,label:`按状态排序`},{value:`usageCount`,label:`按使用次数排序`},{value:`lastUsedTime`,label:`按最近使用排序`}];function ma({value:e,onChange:t}){return(0,M.jsx)(`div`,{className:`flex items-center gap-2`,children:(0,M.jsxs)(Qn,{value:e.field,onValueChange:e=>t({field:e}),children:[(0,M.jsx)(J,{id:`sort-field`,className:`w-40`,children:(0,M.jsx)(er,{})}),(0,M.jsx)(Y,{children:pa.map(e=>(0,M.jsx)(X,{value:e.value,children:e.label},e.value))})]})})}var ha=`未知服务`,ga=`自定义服务`;function _a(e){if(!e)return`-`;try{let t=new Date(e),n=new Date().getTime()-t.getTime(),r=Math.floor(n/6e4);return r<1?`刚刚`:r<60?`${r}分钟前`:r<1440?`${Math.floor(r/60)}小时前`:`${Math.floor(r/1440)}天前`}catch{return e}}function va({initialStatus:e=`all`,className:t}){let{sortConfig:n,setSortConfig:r}=fa(),[i,a]=(0,O.useState)([]),{searchValue:o,setSearchValue:s,filteredTools:c,clearSearch:l}=ua(i),{currentPage:u,totalPages:d,paginatedTools:f,setPage:p,resetPage:m}=$r(c,10),[h,g]=(0,O.useState)(!0),[_,v]=(0,O.useState)(null),[,y]=(0,O.useState)(!1),[b,x]=(0,O.useState)(null),[ee,S]=(0,O.useState)({open:!1}),C=(0,O.useCallback)((e,t)=>{let{serviceName:n,toolName:r}=!e||!e.handler?{serviceName:ha,toolName:e?.name||ha}:e.handler.type===`mcp`?{serviceName:e.handler.config?.serviceName||ha,toolName:e.handler.config?.toolName||e.name}:e.handler.type===`proxy`&&e.handler.platform===`coze`?{serviceName:`customMCP`,toolName:e.name}:{serviceName:ga,toolName:e.name};return{name:e.name,serverName:n,toolName:r,description:e.description||``,enabled:t,usageCount:e.usageCount||0,lastUsedTime:e.lastUsedTime||``,inputSchema:e.inputSchema}},[]),w=(0,O.useCallback)(async()=>{a((await k.getToolsList(e,n)).map(e=>C(e,e.enabled??!1)))},[e,n,C]),te=(0,O.useCallback)(async()=>{g(!0),v(null);try{await w()}catch(e){console.error(`获取工具列表失败:`,e),v(e instanceof Error?e.message:`获取工具列表失败`),E.error(`获取工具列表失败`)}finally{g(!1)}},[w]),ne=(0,O.useCallback)(async()=>{try{await w()}catch(e){console.error(`刷新工具列表失败:`,e),E.error(`刷新工具列表失败`)}},[w]),re=(0,O.useCallback)(async()=>{y(!0);try{await te(),E.success(`刷新成功`)}catch{E.error(`刷新失败`)}finally{y(!1)}},[te]),ie=(0,O.useCallback)(async(e,t)=>{try{let n=i.find(t=>t.name===e);if(!n){E.error(`找不到对应的工具信息`);return}if(n.serverName===`customMCP`){if(t){x(e);return}await k.addCustomTool({workflow_id:``,workflow_name:e,description:n.description||``,icon_url:``,app_id:``},e,n.description||``),E.success(`添加工具 ${e} 成功`)}else{let r=t?`disable`:`enable`;await k.manageMCPTool({action:r,serverName:n.serverName,toolName:n.toolName,description:n.description}),E.success(`${t?`禁用`:`启用`}工具 ${e} 成功`)}await ne()}catch(e){console.error(`切换工具状态失败:`,e),E.error(e instanceof Error?e.message:`切换工具状态失败`)}},[i,ne]),ae=(0,O.useCallback)(async()=>{if(b)try{await k.removeCustomTool(b),E.success(`删除工具 ${b} 成功`),await ne()}catch(e){console.error(`删除 Coze 工具失败:`,e),E.error(e instanceof Error?e.message:`删除 Coze 工具失败`)}finally{x(null)}},[b,ne]),se=(0,O.useCallback)(()=>{x(null)},[]),ce=(0,O.useCallback)(e=>{S({open:!0,tool:{name:e.name,serverName:e.serverName,toolName:e.toolName,description:e.description,inputSchema:e.inputSchema}})},[]);return(0,O.useEffect)(()=>{te()},[te]),(0,O.useEffect)(()=>{m()},[o,m]),(0,M.jsxs)(`div`,{className:N(`flex flex-col gap-4`,t),children:[(0,M.jsxs)(`div`,{className:`flex items-center justify-between gap-4`,children:[(0,M.jsx)(ma,{value:n,onChange:r}),(0,M.jsx)(fi,{value:o,onChange:s,placeholder:`搜索服务名、工具名...`})]}),o&&(0,M.jsxs)(`div`,{className:`text-sm text-muted-foreground`,children:[`找到 `,c.length,` 个结果`,c.length>0&&(0,M.jsx)(`button`,{type:`button`,onClick:l,className:`ml-2 text-primary hover:underline`,children:`清除搜索`})]}),(0,M.jsx)(`div`,{className:`rounded-md border`,children:h?(0,M.jsx)(`div`,{className:`flex items-center justify-center py-12`,children:(0,M.jsxs)(`div`,{className:`flex flex-col items-center gap-2`,children:[(0,M.jsx)(T,{className:`h-8 w-8 animate-spin text-muted-foreground`}),(0,M.jsx)(`span`,{className:`text-sm text-muted-foreground`,children:`加载工具列表中...`})]})}):_?(0,M.jsxs)(`div`,{className:`flex flex-col items-center justify-center py-12 gap-4`,children:[(0,M.jsx)(`div`,{className:`text-red-500 text-sm`,children:_}),(0,M.jsx)(F,{variant:`outline`,size:`sm`,onClick:re,children:`重试`})]}):c.length===0?(0,M.jsxs)(`div`,{className:`flex flex-col items-center justify-center py-12 gap-4`,children:[(0,M.jsx)(Qe,{className:`h-12 w-12 text-muted-foreground`}),(0,M.jsx)(`span`,{className:`text-sm text-muted-foreground`,children:o?`没有找到匹配的工具`:e===`enabled`?`没有已启用的工具`:e===`disabled`?`没有已禁用的工具`:`暂无可用工具`}),o&&(0,M.jsx)(F,{variant:`outline`,size:`sm`,onClick:l,children:`清除搜索`})]}):(0,M.jsxs)(M.Fragment,{children:[(0,M.jsxs)(Vr,{size:`compact`,children:[(0,M.jsx)(Hr,{children:(0,M.jsxs)(Gr,{children:[(0,M.jsx)(Z,{children:`服务名`}),(0,M.jsx)(Z,{children:`工具名`}),(0,M.jsx)(Z,{children:`描述`}),(0,M.jsx)(Z,{children:`使用次数`}),(0,M.jsx)(Z,{children:`最近使用`}),(0,M.jsx)(Z,{children:`状态`}),(0,M.jsx)(Z,{children:`操作`})]})}),(0,M.jsx)(Ur,{children:f.map(e=>(0,M.jsxs)(Gr,{children:[(0,M.jsx)(Q,{children:(0,M.jsx)(P,{variant:`secondary`,className:`rounded-md`,children:e.serverName})}),(0,M.jsx)(Q,{className:`font-medium`,children:e.toolName}),(0,M.jsx)(Q,{className:`text-muted-foreground max-w-[300px]`,children:(0,M.jsx)(Xi,{text:e.description,maxLength:100,textSize:`text-xs`,storageKey:`mcp-tool-desc-${e.name}`})}),(0,M.jsx)(Q,{className:`text-right`,children:e.usageCount}),(0,M.jsx)(Q,{className:`text-right text-muted-foreground`,children:_a(e.lastUsedTime)}),(0,M.jsx)(Q,{children:(0,M.jsx)(`div`,{className:`flex justify-end`,children:(0,M.jsx)(la,{checked:e.enabled,onCheckedChange:t=>ie(e.name,!t)})})}),(0,M.jsx)(Q,{children:(0,M.jsx)(`div`,{className:`flex items-center justify-end gap-2`,children:(0,M.jsxs)(`button`,{type:`button`,className:`flex items-center gap-1 hover:cursor-pointer hover:text-primary transition-all duration-100`,onClick:()=>ce(e),title:`调试工具`,children:[(0,M.jsx)(oe,{size:14}),(0,M.jsx)(`span`,{children:`调试`})]})})})]},e.name))})]}),(0,M.jsx)(di,{currentPage:u,totalPages:d,setPage:p})]})}),(0,M.jsx)(Yt,{open:b!==null,onOpenChange:e=>!e&&x(null),children:(0,M.jsxs)($t,{children:[(0,M.jsxs)(en,{children:[(0,M.jsx)(nn,{children:`确认移除 Coze 工作流工具`}),(0,M.jsxs)(rn,{children:[`移除后需要通过【工作流集成】重新添加并配置入参,确定要移除工具 "`,b,`" 吗?`]})]}),(0,M.jsxs)(tn,{children:[(0,M.jsx)(on,{onClick:se,children:`取消`}),(0,M.jsx)(an,{onClick:ae,className:`bg-destructive text-destructive-foreground hover:bg-destructive/90`,children:`确认移除`})]})]})}),(0,M.jsx)(ca,{open:ee.open,onOpenChange:e=>S(t=>({...t,open:e})),tool:ee.tool||null})]})}var ya=({size:e=24,color:t=`currentColor`,...n})=>(0,M.jsx)(`svg`,{width:e,height:e,viewBox:`0 0 1024 1024`,fill:`none`,stroke:t,strokeWidth:`2`,strokeLinecap:`round`,strokeLinejoin:`round`,...n,children:(0,M.jsx)(`path`,{d:`M980.79827 694.105946c-21.144216-122.796973-109.844757-203.250162-109.844757-203.250162 12.647784-111.477622-33.792-131.26573-33.792-131.26573C827.392 14.668108 530.985514 20.67373 524.730811 20.839784 518.476108 20.67373 222.01427 14.668108 212.300108 359.590054c0 0-46.467459 19.788108-33.819676 131.26573 0 0-88.700541 80.453189-109.817081 203.250162 0 0-11.291676 207.484541 101.403676 25.40627 0 0 25.350919 69.161514 71.790703 131.26573 0 0-83.082378 28.256865-75.997405 101.625081 0 0-2.87827 81.836973 177.401081 76.218811 0 0 126.699243-9.852541 164.753297-63.515676l16.605405 0 0.276757 0 16.633081 0c38.026378 53.635459 164.725622 63.515676 164.725622 63.515676 180.224 5.618162 177.401081-76.218811 177.401081-76.218811 7.029622-73.368216-75.997405-101.625081-75.997405-101.625081 46.439784-62.104216 71.790703-131.26573 71.790703-131.26573C992.034595 901.590486 980.79827 694.105946 980.79827 694.105946z`})}),ba=({size:e=24,color:t=`currentColor`,...n})=>(0,M.jsx)(`svg`,{width:e,height:e,viewBox:`0 0 1024 1024`,fill:`none`,stroke:t,strokeWidth:`2`,strokeLinecap:`round`,strokeLinejoin:`round`,...n,children:(0,M.jsx)(`path`,{d:`M0 524.992q0 166.016 95.488 298.496t247.488 185.504q6.016 0.992 10.016 0.992t6.496-1.504 4-3.008 2.016-4.992 0.512-4.992v-100.512q-36.992 4-66.016-0.512t-45.504-14.016-28.992-23.488-16.992-25.504-8.992-24-5.504-14.496q-8.992-15.008-27.008-27.488t-27.008-20-2.016-14.496q50.016-26.016 112.992 66.016 34.016 51.008 119.008 30.016 10.016-40.992 40-70.016Q293.984 736 237.984 670.976t-56-158.016q0-87.008 55.008-151.008-22.016-64.992 6.016-136.992 28.992-2.016 64.992 11.488t50.496 23.008 25.504 17.504q56.992-16 128.512-16t129.504 16q12.992-8.992 28.992-19.008t48.992-21.504 60.992-9.504q27.008 71.008 7.008 135.008 56 64 56 151.008 0 92.992-56.992 158.496t-172 85.504q43.008 43.008 43.008 104v128.992q0 0.992 0.992 3.008 0 6.016 0.512 8.992t4.512 6.016 12 3.008q152.992-52 250.496-185.504t97.504-300.512q0-104-40.512-199.008t-108.992-163.488-163.488-108.992T512.032 12.96 313.024 53.472 149.536 162.464t-108.992 163.488-40.512 199.008z`,"p-id":`4674`})});function xa(){let[e,t]=(0,O.useState)({status:`idle`,logs:[]});return(0,O.useEffect)(()=>{let e=j.subscribe(`data:npmInstallStarted`,e=>{console.log(`[useNPMInstall] 安装开始:`,e),t({status:`installing`,version:e.version,installId:e.installId,logs:[]})}),n=j.subscribe(`data:npmInstallLog`,e=>{console.log(`[useNPMInstall] 收到日志:`,e),t(t=>t.installId===e.installId?{...t,logs:[...t.logs,{type:e.type,message:e.message,timestamp:e.timestamp}]}:t)}),r=j.subscribe(`data:npmInstallCompleted`,e=>{console.log(`[useNPMInstall] 安装完成:`,e),t(t=>t.installId===e.installId?{...t,status:`completed`,duration:e.duration}:t)}),i=j.subscribe(`data:npmInstallFailed`,e=>{console.log(`[useNPMInstall] 安装失败:`,e),t(t=>t.installId===e.installId?{...t,status:`failed`,error:e.error,duration:e.duration}:t)});return()=>{e(),n(),r(),i()}},[]),{installStatus:e,startInstall:(0,O.useCallback)(async e=>{try{console.log(`[useNPMInstall] 开始安装版本:`,e);let t=await(await fetch(`/api/update`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({version:e})})).json();if(!t.success)throw Error(t.error?.message||`安装请求失败`);return console.log(`[useNPMInstall] 安装请求已接受:`,t),t}catch(e){throw console.error(`[useNPMInstall] 安装请求失败:`,e),t(t=>({...t,status:`failed`,error:e instanceof Error?e.message:`未知错误`})),e}},[]),clearStatus:(0,O.useCallback)(()=>{console.log(`[useNPMInstall] 清除安装状态`),t({status:`idle`,logs:[]})},[]),getStatusText:(0,O.useCallback)(()=>{switch(e.status){case`installing`:return`正在安装 xiaozhi-client@${e.version}...`;case`completed`:return`安装完成!`;case`failed`:return`安装失败: ${e.error}`;default:return``}},[e]),getStatusColor:(0,O.useCallback)(()=>{switch(e.status){case`installing`:return`text-blue-600`;case`completed`:return`text-green-600`;case`failed`:return`text-red-600`;default:return`text-gray-600`}},[e]),isInstalling:(0,O.useCallback)(()=>e.status===`installing`,[e.status]),canCloseDialog:(0,O.useCallback)(()=>e.status!==`installing`,[e.status])}}var Sa=t(((e,t)=>{var n=`2.0.0`,r=256;t.exports={MAX_LENGTH:r,MAX_SAFE_COMPONENT_LENGTH:16,MAX_SAFE_BUILD_LENGTH:r-6,MAX_SAFE_INTEGER:2**53-1||9007199254740991,RELEASE_TYPES:[`major`,`premajor`,`minor`,`preminor`,`patch`,`prepatch`,`prerelease`],SEMVER_SPEC_VERSION:n,FLAG_INCLUDE_PRERELEASE:1,FLAG_LOOSE:2}})),Ca=t(((e,t)=>{t.exports=typeof process==`object`&&{}.NODE_DEBUG&&/\bsemver\b/i.test({}.NODE_DEBUG)?(...e)=>console.error(`SEMVER`,...e):()=>{}})),wa=t(((e,t)=>{var{MAX_SAFE_COMPONENT_LENGTH:n,MAX_SAFE_BUILD_LENGTH:r,MAX_LENGTH:i}=Sa(),a=Ca();e=t.exports={};var o=e.re=[],s=e.safeRe=[],c=e.src=[],l=e.safeSrc=[],u=e.t={},d=0,f=`[a-zA-Z0-9-]`,p=[[`\\s`,1],[`\\d`,i],[f,r]],m=e=>{for(let[t,n]of p)e=e.split(`${t}*`).join(`${t}{0,${n}}`).split(`${t}+`).join(`${t}{1,${n}}`);return e},h=(e,t,n)=>{let r=m(t),i=d++;a(e,i,t),u[e]=i,c[i]=t,l[i]=r,o[i]=new RegExp(t,n?`g`:void 0),s[i]=new RegExp(r,n?`g`:void 0)};h(`NUMERICIDENTIFIER`,`0|[1-9]\\d*`),h(`NUMERICIDENTIFIERLOOSE`,`\\d+`),h(`NONNUMERICIDENTIFIER`,`\\d*[a-zA-Z-]${f}*`),h(`MAINVERSION`,`(${c[u.NUMERICIDENTIFIER]})\\.(${c[u.NUMERICIDENTIFIER]})\\.(${c[u.NUMERICIDENTIFIER]})`),h(`MAINVERSIONLOOSE`,`(${c[u.NUMERICIDENTIFIERLOOSE]})\\.(${c[u.NUMERICIDENTIFIERLOOSE]})\\.(${c[u.NUMERICIDENTIFIERLOOSE]})`),h(`PRERELEASEIDENTIFIER`,`(?:${c[u.NONNUMERICIDENTIFIER]}|${c[u.NUMERICIDENTIFIER]})`),h(`PRERELEASEIDENTIFIERLOOSE`,`(?:${c[u.NONNUMERICIDENTIFIER]}|${c[u.NUMERICIDENTIFIERLOOSE]})`),h(`PRERELEASE`,`(?:-(${c[u.PRERELEASEIDENTIFIER]}(?:\\.${c[u.PRERELEASEIDENTIFIER]})*))`),h(`PRERELEASELOOSE`,`(?:-?(${c[u.PRERELEASEIDENTIFIERLOOSE]}(?:\\.${c[u.PRERELEASEIDENTIFIERLOOSE]})*))`),h(`BUILDIDENTIFIER`,`${f}+`),h(`BUILD`,`(?:\\+(${c[u.BUILDIDENTIFIER]}(?:\\.${c[u.BUILDIDENTIFIER]})*))`),h(`FULLPLAIN`,`v?${c[u.MAINVERSION]}${c[u.PRERELEASE]}?${c[u.BUILD]}?`),h(`FULL`,`^${c[u.FULLPLAIN]}$`),h(`LOOSEPLAIN`,`[v=\\s]*${c[u.MAINVERSIONLOOSE]}${c[u.PRERELEASELOOSE]}?${c[u.BUILD]}?`),h(`LOOSE`,`^${c[u.LOOSEPLAIN]}$`),h(`GTLT`,`((?:<|>)?=?)`),h(`XRANGEIDENTIFIERLOOSE`,`${c[u.NUMERICIDENTIFIERLOOSE]}|x|X|\\*`),h(`XRANGEIDENTIFIER`,`${c[u.NUMERICIDENTIFIER]}|x|X|\\*`),h(`XRANGEPLAIN`,`[v=\\s]*(${c[u.XRANGEIDENTIFIER]})(?:\\.(${c[u.XRANGEIDENTIFIER]})(?:\\.(${c[u.XRANGEIDENTIFIER]})(?:${c[u.PRERELEASE]})?${c[u.BUILD]}?)?)?`),h(`XRANGEPLAINLOOSE`,`[v=\\s]*(${c[u.XRANGEIDENTIFIERLOOSE]})(?:\\.(${c[u.XRANGEIDENTIFIERLOOSE]})(?:\\.(${c[u.XRANGEIDENTIFIERLOOSE]})(?:${c[u.PRERELEASELOOSE]})?${c[u.BUILD]}?)?)?`),h(`XRANGE`,`^${c[u.GTLT]}\\s*${c[u.XRANGEPLAIN]}$`),h(`XRANGELOOSE`,`^${c[u.GTLT]}\\s*${c[u.XRANGEPLAINLOOSE]}$`),h(`COERCEPLAIN`,`(^|[^\\d])(\\d{1,${n}})(?:\\.(\\d{1,${n}}))?(?:\\.(\\d{1,${n}}))?`),h(`COERCE`,`${c[u.COERCEPLAIN]}(?:$|[^\\d])`),h(`COERCEFULL`,c[u.COERCEPLAIN]+`(?:${c[u.PRERELEASE]})?(?:${c[u.BUILD]})?(?:$|[^\\d])`),h(`COERCERTL`,c[u.COERCE],!0),h(`COERCERTLFULL`,c[u.COERCEFULL],!0),h(`LONETILDE`,`(?:~>?)`),h(`TILDETRIM`,`(\\s*)${c[u.LONETILDE]}\\s+`,!0),e.tildeTrimReplace=`$1~`,h(`TILDE`,`^${c[u.LONETILDE]}${c[u.XRANGEPLAIN]}$`),h(`TILDELOOSE`,`^${c[u.LONETILDE]}${c[u.XRANGEPLAINLOOSE]}$`),h(`LONECARET`,`(?:\\^)`),h(`CARETTRIM`,`(\\s*)${c[u.LONECARET]}\\s+`,!0),e.caretTrimReplace=`$1^`,h(`CARET`,`^${c[u.LONECARET]}${c[u.XRANGEPLAIN]}$`),h(`CARETLOOSE`,`^${c[u.LONECARET]}${c[u.XRANGEPLAINLOOSE]}$`),h(`COMPARATORLOOSE`,`^${c[u.GTLT]}\\s*(${c[u.LOOSEPLAIN]})$|^$`),h(`COMPARATOR`,`^${c[u.GTLT]}\\s*(${c[u.FULLPLAIN]})$|^$`),h(`COMPARATORTRIM`,`(\\s*)${c[u.GTLT]}\\s*(${c[u.LOOSEPLAIN]}|${c[u.XRANGEPLAIN]})`,!0),e.comparatorTrimReplace=`$1$2$3`,h(`HYPHENRANGE`,`^\\s*(${c[u.XRANGEPLAIN]})\\s+-\\s+(${c[u.XRANGEPLAIN]})\\s*$`),h(`HYPHENRANGELOOSE`,`^\\s*(${c[u.XRANGEPLAINLOOSE]})\\s+-\\s+(${c[u.XRANGEPLAINLOOSE]})\\s*$`),h(`STAR`,`(<|>)?=?\\s*\\*`),h(`GTE0`,`^\\s*>=\\s*0\\.0\\.0\\s*$`),h(`GTE0PRE`,`^\\s*>=\\s*0\\.0\\.0-0\\s*$`)})),Ta=t(((e,t)=>{var n=Object.freeze({loose:!0}),r=Object.freeze({});t.exports=e=>e?typeof e==`object`?e:n:r})),Ea=t(((e,t)=>{var n=/^[0-9]+$/,r=(e,t)=>{if(typeof e==`number`&&typeof t==`number`)return e===t?0:e<t?-1:1;let r=n.test(e),i=n.test(t);return r&&i&&(e=+e,t=+t),e===t?0:r&&!i?-1:i&&!r?1:e<t?-1:1};t.exports={compareIdentifiers:r,rcompareIdentifiers:(e,t)=>r(t,e)}})),$=t(((e,t)=>{var n=Ca(),{MAX_LENGTH:r,MAX_SAFE_INTEGER:i}=Sa(),{safeRe:a,t:o}=wa(),s=Ta(),{compareIdentifiers:c}=Ea();t.exports=class e{constructor(t,c){if(c=s(c),t instanceof e){if(t.loose===!!c.loose&&t.includePrerelease===!!c.includePrerelease)return t;t=t.version}else if(typeof t!=`string`)throw TypeError(`Invalid version. Must be a string. Got type "${typeof t}".`);if(t.length>r)throw TypeError(`version is longer than ${r} characters`);n(`SemVer`,t,c),this.options=c,this.loose=!!c.loose,this.includePrerelease=!!c.includePrerelease;let l=t.trim().match(c.loose?a[o.LOOSE]:a[o.FULL]);if(!l)throw TypeError(`Invalid Version: ${t}`);if(this.raw=t,this.major=+l[1],this.minor=+l[2],this.patch=+l[3],this.major>i||this.major<0)throw TypeError(`Invalid major version`);if(this.minor>i||this.minor<0)throw TypeError(`Invalid minor version`);if(this.patch>i||this.patch<0)throw TypeError(`Invalid patch version`);l[4]?this.prerelease=l[4].split(`.`).map(e=>{if(/^[0-9]+$/.test(e)){let t=+e;if(t>=0&&t<i)return t}return e}):this.prerelease=[],this.build=l[5]?l[5].split(`.`):[],this.format()}format(){return this.version=`${this.major}.${this.minor}.${this.patch}`,this.prerelease.length&&(this.version+=`-${this.prerelease.join(`.`)}`),this.version}toString(){return this.version}compare(t){if(n(`SemVer.compare`,this.version,this.options,t),!(t instanceof e)){if(typeof t==`string`&&t===this.version)return 0;t=new e(t,this.options)}return t.version===this.version?0:this.compareMain(t)||this.comparePre(t)}compareMain(t){return t instanceof e||(t=new e(t,this.options)),this.major<t.major?-1:this.major>t.major?1:this.minor<t.minor?-1:this.minor>t.minor?1:this.patch<t.patch?-1:+(this.patch>t.patch)}comparePre(t){if(t instanceof e||(t=new e(t,this.options)),this.prerelease.length&&!t.prerelease.length)return-1;if(!this.prerelease.length&&t.prerelease.length)return 1;if(!this.prerelease.length&&!t.prerelease.length)return 0;let r=0;do{let e=this.prerelease[r],i=t.prerelease[r];if(n(`prerelease compare`,r,e,i),e===void 0&&i===void 0)return 0;if(i===void 0)return 1;if(e===void 0)return-1;if(e===i)continue;return c(e,i)}while(++r)}compareBuild(t){t instanceof e||(t=new e(t,this.options));let r=0;do{let e=this.build[r],i=t.build[r];if(n(`build compare`,r,e,i),e===void 0&&i===void 0)return 0;if(i===void 0)return 1;if(e===void 0)return-1;if(e===i)continue;return c(e,i)}while(++r)}inc(e,t,n){if(e.startsWith(`pre`)){if(!t&&n===!1)throw Error(`invalid increment argument: identifier is empty`);if(t){let e=`-${t}`.match(this.options.loose?a[o.PRERELEASELOOSE]:a[o.PRERELEASE]);if(!e||e[1]!==t)throw Error(`invalid identifier: ${t}`)}}switch(e){case`premajor`:this.prerelease.length=0,this.patch=0,this.minor=0,this.major++,this.inc(`pre`,t,n);break;case`preminor`:this.prerelease.length=0,this.patch=0,this.minor++,this.inc(`pre`,t,n);break;case`prepatch`:this.prerelease.length=0,this.inc(`patch`,t,n),this.inc(`pre`,t,n);break;case`prerelease`:this.prerelease.length===0&&this.inc(`patch`,t,n),this.inc(`pre`,t,n);break;case`release`:if(this.prerelease.length===0)throw Error(`version ${this.raw} is not a prerelease`);this.prerelease.length=0;break;case`major`:(this.minor!==0||this.patch!==0||this.prerelease.length===0)&&this.major++,this.minor=0,this.patch=0,this.prerelease=[];break;case`minor`:(this.patch!==0||this.prerelease.length===0)&&this.minor++,this.patch=0,this.prerelease=[];break;case`patch`:this.prerelease.length===0&&this.patch++,this.prerelease=[];break;case`pre`:{let e=+!!Number(n);if(this.prerelease.length===0)this.prerelease=[e];else{let r=this.prerelease.length;for(;--r>=0;)typeof this.prerelease[r]==`number`&&(this.prerelease[r]++,r=-2);if(r===-1){if(t===this.prerelease.join(`.`)&&n===!1)throw Error(`invalid increment argument: identifier already exists`);this.prerelease.push(e)}}if(t){let r=[t,e];n===!1&&(r=[t]),c(this.prerelease[0],t)===0?isNaN(this.prerelease[1])&&(this.prerelease=r):this.prerelease=r}break}default:throw Error(`invalid increment argument: ${e}`)}return this.raw=this.format(),this.build.length&&(this.raw+=`+${this.build.join(`.`)}`),this}}})),Da=t(((e,t)=>{var n=$();t.exports=(e,t,r=!1)=>{if(e instanceof n)return e;try{return new n(e,t)}catch(e){if(!r)return null;throw e}}})),Oa=t(((e,t)=>{var n=Da();t.exports=(e,t)=>{let r=n(e,t);return r?r.version:null}})),ka=t(((e,t)=>{var n=Da();t.exports=(e,t)=>{let r=n(e.trim().replace(/^[=v]+/,``),t);return r?r.version:null}})),Aa=t(((e,t)=>{var n=$();t.exports=(e,t,r,i,a)=>{typeof r==`string`&&(a=i,i=r,r=void 0);try{return new n(e instanceof n?e.version:e,r).inc(t,i,a).version}catch{return null}}})),ja=t(((e,t)=>{var n=Da();t.exports=(e,t)=>{let r=n(e,null,!0),i=n(t,null,!0),a=r.compare(i);if(a===0)return null;let o=a>0,s=o?r:i,c=o?i:r,l=!!s.prerelease.length;if(c.prerelease.length&&!l){if(!c.patch&&!c.minor)return`major`;if(c.compareMain(s)===0)return c.minor&&!c.patch?`minor`:`patch`}let u=l?`pre`:``;return r.major===i.major?r.minor===i.minor?r.patch===i.patch?`prerelease`:u+`patch`:u+`minor`:u+`major`}})),Ma=t(((e,t)=>{var n=$();t.exports=(e,t)=>new n(e,t).major})),Na=t(((e,t)=>{var n=$();t.exports=(e,t)=>new n(e,t).minor})),Pa=t(((e,t)=>{var n=$();t.exports=(e,t)=>new n(e,t).patch})),Fa=t(((e,t)=>{var n=Da();t.exports=(e,t)=>{let r=n(e,t);return r&&r.prerelease.length?r.prerelease:null}})),Ia=t(((e,t)=>{var n=$();t.exports=(e,t,r)=>new n(e,r).compare(new n(t,r))})),La=t(((e,t)=>{var n=Ia();t.exports=(e,t,r)=>n(t,e,r)})),Ra=t(((e,t)=>{var n=Ia();t.exports=(e,t)=>n(e,t,!0)})),za=t(((e,t)=>{var n=$();t.exports=(e,t,r)=>{let i=new n(e,r),a=new n(t,r);return i.compare(a)||i.compareBuild(a)}})),Ba=t(((e,t)=>{var n=za();t.exports=(e,t)=>e.sort((e,r)=>n(e,r,t))})),Va=t(((e,t)=>{var n=za();t.exports=(e,t)=>e.sort((e,r)=>n(r,e,t))})),Ha=t(((e,t)=>{var n=Ia();t.exports=(e,t,r)=>n(e,t,r)>0})),Ua=t(((e,t)=>{var n=Ia();t.exports=(e,t,r)=>n(e,t,r)<0})),Wa=t(((e,t)=>{var n=Ia();t.exports=(e,t,r)=>n(e,t,r)===0})),Ga=t(((e,t)=>{var n=Ia();t.exports=(e,t,r)=>n(e,t,r)!==0})),Ka=t(((e,t)=>{var n=Ia();t.exports=(e,t,r)=>n(e,t,r)>=0})),qa=t(((e,t)=>{var n=Ia();t.exports=(e,t,r)=>n(e,t,r)<=0})),Ja=t(((e,t)=>{var n=Wa(),r=Ga(),i=Ha(),a=Ka(),o=Ua(),s=qa();t.exports=(e,t,c,l)=>{switch(t){case`===`:return typeof e==`object`&&(e=e.version),typeof c==`object`&&(c=c.version),e===c;case`!==`:return typeof e==`object`&&(e=e.version),typeof c==`object`&&(c=c.version),e!==c;case``:case`=`:case`==`:return n(e,c,l);case`!=`:return r(e,c,l);case`>`:return i(e,c,l);case`>=`:return a(e,c,l);case`<`:return o(e,c,l);case`<=`:return s(e,c,l);default:throw TypeError(`Invalid operator: ${t}`)}}})),Ya=t(((e,t)=>{var n=$(),r=Da(),{safeRe:i,t:a}=wa();t.exports=(e,t)=>{if(e instanceof n)return e;if(typeof e==`number`&&(e=String(e)),typeof e!=`string`)return null;t||={};let o=null;if(!t.rtl)o=e.match(t.includePrerelease?i[a.COERCEFULL]:i[a.COERCE]);else{let n=t.includePrerelease?i[a.COERCERTLFULL]:i[a.COERCERTL],r;for(;(r=n.exec(e))&&(!o||o.index+o[0].length!==e.length);)(!o||r.index+r[0].length!==o.index+o[0].length)&&(o=r),n.lastIndex=r.index+r[1].length+r[2].length;n.lastIndex=-1}if(o===null)return null;let s=o[2];return r(`${s}.${o[3]||`0`}.${o[4]||`0`}${t.includePrerelease&&o[5]?`-${o[5]}`:``}${t.includePrerelease&&o[6]?`+${o[6]}`:``}`,t)}})),Xa=t(((e,t)=>{t.exports=class{constructor(){this.max=1e3,this.map=new Map}get(e){let t=this.map.get(e);if(t!==void 0)return this.map.delete(e),this.map.set(e,t),t}delete(e){return this.map.delete(e)}set(e,t){if(!this.delete(e)&&t!==void 0){if(this.map.size>=this.max){let e=this.map.keys().next().value;this.delete(e)}this.map.set(e,t)}return this}}})),Za=t(((e,t)=>{var n=/\s+/g;t.exports=class e{constructor(t,r){if(r=i(r),t instanceof e)return t.loose===!!r.loose&&t.includePrerelease===!!r.includePrerelease?t:new e(t.raw,r);if(t instanceof a)return this.raw=t.value,this.set=[[t]],this.formatted=void 0,this;if(this.options=r,this.loose=!!r.loose,this.includePrerelease=!!r.includePrerelease,this.raw=t.trim().replace(n,` `),this.set=this.raw.split(`||`).map(e=>this.parseRange(e.trim())).filter(e=>e.length),!this.set.length)throw TypeError(`Invalid SemVer Range: ${this.raw}`);if(this.set.length>1){let e=this.set[0];if(this.set=this.set.filter(e=>!h(e[0])),this.set.length===0)this.set=[e];else if(this.set.length>1){for(let e of this.set)if(e.length===1&&g(e[0])){this.set=[e];break}}}this.formatted=void 0}get range(){if(this.formatted===void 0){this.formatted=``;for(let e=0;e<this.set.length;e++){e>0&&(this.formatted+=`||`);let t=this.set[e];for(let e=0;e<t.length;e++)e>0&&(this.formatted+=` `),this.formatted+=t[e].toString().trim()}}return this.formatted}format(){return this.range}toString(){return this.range}parseRange(e){let t=((this.options.includePrerelease&&p)|(this.options.loose&&m))+`:`+e,n=r.get(t);if(n)return n;let i=this.options.loose,s=i?c[l.HYPHENRANGELOOSE]:c[l.HYPHENRANGE];e=e.replace(s,re(this.options.includePrerelease)),o(`hyphen replace`,e),e=e.replace(c[l.COMPARATORTRIM],u),o(`comparator trim`,e),e=e.replace(c[l.TILDETRIM],d),o(`tilde trim`,e),e=e.replace(c[l.CARETTRIM],f),o(`caret trim`,e);let g=e.split(` `).map(e=>v(e,this.options)).join(` `).split(/\s+/).map(e=>ne(e,this.options));i&&(g=g.filter(e=>(o(`loose invalid filter`,e,this.options),!!e.match(c[l.COMPARATORLOOSE])))),o(`range list`,g);let _=new Map,y=g.map(e=>new a(e,this.options));for(let e of y){if(h(e))return[e];_.set(e.value,e)}_.size>1&&_.has(``)&&_.delete(``);let b=[..._.values()];return r.set(t,b),b}intersects(t,n){if(!(t instanceof e))throw TypeError(`a Range is required`);return this.set.some(e=>_(e,n)&&t.set.some(t=>_(t,n)&&e.every(e=>t.every(t=>e.intersects(t,n)))))}test(e){if(!e)return!1;if(typeof e==`string`)try{e=new s(e,this.options)}catch{return!1}for(let t=0;t<this.set.length;t++)if(ie(this.set[t],e,this.options))return!0;return!1}};var r=new(Xa()),i=Ta(),a=Qa(),o=Ca(),s=$(),{safeRe:c,t:l,comparatorTrimReplace:u,tildeTrimReplace:d,caretTrimReplace:f}=wa(),{FLAG_INCLUDE_PRERELEASE:p,FLAG_LOOSE:m}=Sa(),h=e=>e.value===`<0.0.0-0`,g=e=>e.value===``,_=(e,t)=>{let n=!0,r=e.slice(),i=r.pop();for(;n&&r.length;)n=r.every(e=>i.intersects(e,t)),i=r.pop();return n},v=(e,t)=>(e=e.replace(c[l.BUILD],``),o(`comp`,e,t),e=ee(e,t),o(`caret`,e),e=b(e,t),o(`tildes`,e),e=C(e,t),o(`xrange`,e),e=te(e,t),o(`stars`,e),e),y=e=>!e||e.toLowerCase()===`x`||e===`*`,b=(e,t)=>e.trim().split(/\s+/).map(e=>x(e,t)).join(` `),x=(e,t)=>{let n=t.loose?c[l.TILDELOOSE]:c[l.TILDE];return e.replace(n,(t,n,r,i,a)=>{o(`tilde`,e,t,n,r,i,a);let s;return y(n)?s=``:y(r)?s=`>=${n}.0.0 <${+n+1}.0.0-0`:y(i)?s=`>=${n}.${r}.0 <${n}.${+r+1}.0-0`:a?(o(`replaceTilde pr`,a),s=`>=${n}.${r}.${i}-${a} <${n}.${+r+1}.0-0`):s=`>=${n}.${r}.${i} <${n}.${+r+1}.0-0`,o(`tilde return`,s),s})},ee=(e,t)=>e.trim().split(/\s+/).map(e=>S(e,t)).join(` `),S=(e,t)=>{o(`caret`,e,t);let n=t.loose?c[l.CARETLOOSE]:c[l.CARET],r=t.includePrerelease?`-0`:``;return e.replace(n,(t,n,i,a,s)=>{o(`caret`,e,t,n,i,a,s);let c;return y(n)?c=``:y(i)?c=`>=${n}.0.0${r} <${+n+1}.0.0-0`:y(a)?c=n===`0`?`>=${n}.${i}.0${r} <${n}.${+i+1}.0-0`:`>=${n}.${i}.0${r} <${+n+1}.0.0-0`:s?(o(`replaceCaret pr`,s),c=n===`0`?i===`0`?`>=${n}.${i}.${a}-${s} <${n}.${i}.${+a+1}-0`:`>=${n}.${i}.${a}-${s} <${n}.${+i+1}.0-0`:`>=${n}.${i}.${a}-${s} <${+n+1}.0.0-0`):(o(`no pr`),c=n===`0`?i===`0`?`>=${n}.${i}.${a}${r} <${n}.${i}.${+a+1}-0`:`>=${n}.${i}.${a}${r} <${n}.${+i+1}.0-0`:`>=${n}.${i}.${a} <${+n+1}.0.0-0`),o(`caret return`,c),c})},C=(e,t)=>(o(`replaceXRanges`,e,t),e.split(/\s+/).map(e=>w(e,t)).join(` `)),w=(e,t)=>{e=e.trim();let n=t.loose?c[l.XRANGELOOSE]:c[l.XRANGE];return e.replace(n,(n,r,i,a,s,c)=>{o(`xRange`,e,n,r,i,a,s,c);let l=y(i),u=l||y(a),d=u||y(s),f=d;return r===`=`&&f&&(r=``),c=t.includePrerelease?`-0`:``,l?n=r===`>`||r===`<`?`<0.0.0-0`:`*`:r&&f?(u&&(a=0),s=0,r===`>`?(r=`>=`,u?(i=+i+1,a=0,s=0):(a=+a+1,s=0)):r===`<=`&&(r=`<`,u?i=+i+1:a=+a+1),r===`<`&&(c=`-0`),n=`${r+i}.${a}.${s}${c}`):u?n=`>=${i}.0.0${c} <${+i+1}.0.0-0`:d&&(n=`>=${i}.${a}.0${c} <${i}.${+a+1}.0-0`),o(`xRange return`,n),n})},te=(e,t)=>(o(`replaceStars`,e,t),e.trim().replace(c[l.STAR],``)),ne=(e,t)=>(o(`replaceGTE0`,e,t),e.trim().replace(c[t.includePrerelease?l.GTE0PRE:l.GTE0],``)),re=e=>(t,n,r,i,a,o,s,c,l,u,d,f)=>(n=y(r)?``:y(i)?`>=${r}.0.0${e?`-0`:``}`:y(a)?`>=${r}.${i}.0${e?`-0`:``}`:o?`>=${n}`:`>=${n}${e?`-0`:``}`,c=y(l)?``:y(u)?`<${+l+1}.0.0-0`:y(d)?`<${l}.${+u+1}.0-0`:f?`<=${l}.${u}.${d}-${f}`:e?`<${l}.${u}.${+d+1}-0`:`<=${c}`,`${n} ${c}`.trim()),ie=(e,t,n)=>{for(let n=0;n<e.length;n++)if(!e[n].test(t))return!1;if(t.prerelease.length&&!n.includePrerelease){for(let n=0;n<e.length;n++)if(o(e[n].semver),e[n].semver!==a.ANY&&e[n].semver.prerelease.length>0){let r=e[n].semver;if(r.major===t.major&&r.minor===t.minor&&r.patch===t.patch)return!0}return!1}return!0}})),Qa=t(((e,t)=>{var n=Symbol(`SemVer ANY`);t.exports=class e{static get ANY(){return n}constructor(t,i){if(i=r(i),t instanceof e){if(t.loose===!!i.loose)return t;t=t.value}t=t.trim().split(/\s+/).join(` `),s(`comparator`,t,i),this.options=i,this.loose=!!i.loose,this.parse(t),this.semver===n?this.value=``:this.value=this.operator+this.semver.version,s(`comp`,this)}parse(e){let t=this.options.loose?i[a.COMPARATORLOOSE]:i[a.COMPARATOR],r=e.match(t);if(!r)throw TypeError(`Invalid comparator: ${e}`);this.operator=r[1]===void 0?``:r[1],this.operator===`=`&&(this.operator=``),r[2]?this.semver=new c(r[2],this.options.loose):this.semver=n}toString(){return this.value}test(e){if(s(`Comparator.test`,e,this.options.loose),this.semver===n||e===n)return!0;if(typeof e==`string`)try{e=new c(e,this.options)}catch{return!1}return o(e,this.operator,this.semver,this.options)}intersects(t,n){if(!(t instanceof e))throw TypeError(`a Comparator is required`);return this.operator===``?this.value===``?!0:new l(t.value,n).test(this.value):t.operator===``?t.value===``?!0:new l(this.value,n).test(t.semver):(n=r(n),n.includePrerelease&&(this.value===`<0.0.0-0`||t.value===`<0.0.0-0`)||!n.includePrerelease&&(this.value.startsWith(`<0.0.0`)||t.value.startsWith(`<0.0.0`))?!1:!!(this.operator.startsWith(`>`)&&t.operator.startsWith(`>`)||this.operator.startsWith(`<`)&&t.operator.startsWith(`<`)||this.semver.version===t.semver.version&&this.operator.includes(`=`)&&t.operator.includes(`=`)||o(this.semver,`<`,t.semver,n)&&this.operator.startsWith(`>`)&&t.operator.startsWith(`<`)||o(this.semver,`>`,t.semver,n)&&this.operator.startsWith(`<`)&&t.operator.startsWith(`>`)))}};var r=Ta(),{safeRe:i,t:a}=wa(),o=Ja(),s=Ca(),c=$(),l=Za()})),$a=t(((e,t)=>{var n=Za();t.exports=(e,t,r)=>{try{t=new n(t,r)}catch{return!1}return t.test(e)}})),eo=t(((e,t)=>{var n=Za();t.exports=(e,t)=>new n(e,t).set.map(e=>e.map(e=>e.value).join(` `).trim().split(` `))})),to=t(((e,t)=>{var n=$(),r=Za();t.exports=(e,t,i)=>{let a=null,o=null,s=null;try{s=new r(t,i)}catch{return null}return e.forEach(e=>{s.test(e)&&(!a||o.compare(e)===-1)&&(a=e,o=new n(a,i))}),a}})),no=t(((e,t)=>{var n=$(),r=Za();t.exports=(e,t,i)=>{let a=null,o=null,s=null;try{s=new r(t,i)}catch{return null}return e.forEach(e=>{s.test(e)&&(!a||o.compare(e)===1)&&(a=e,o=new n(a,i))}),a}})),ro=t(((e,t)=>{var n=$(),r=Za(),i=Ha();t.exports=(e,t)=>{e=new r(e,t);let a=new n(`0.0.0`);if(e.test(a)||(a=new n(`0.0.0-0`),e.test(a)))return a;a=null;for(let t=0;t<e.set.length;++t){let r=e.set[t],o=null;r.forEach(e=>{let t=new n(e.semver.version);switch(e.operator){case`>`:t.prerelease.length===0?t.patch++:t.prerelease.push(0),t.raw=t.format();case``:case`>=`:(!o||i(t,o))&&(o=t);break;case`<`:case`<=`:break;default:throw Error(`Unexpected operation: ${e.operator}`)}}),o&&(!a||i(a,o))&&(a=o)}return a&&e.test(a)?a:null}})),io=t(((e,t)=>{var n=Za();t.exports=(e,t)=>{try{return new n(e,t).range||`*`}catch{return null}}})),ao=t(((e,t)=>{var n=$(),r=Qa(),{ANY:i}=r,a=Za(),o=$a(),s=Ha(),c=Ua(),l=qa(),u=Ka();t.exports=(e,t,d,f)=>{e=new n(e,f),t=new a(t,f);let p,m,h,g,_;switch(d){case`>`:p=s,m=l,h=c,g=`>`,_=`>=`;break;case`<`:p=c,m=u,h=s,g=`<`,_=`<=`;break;default:throw TypeError(`Must provide a hilo val of "<" or ">"`)}if(o(e,t,f))return!1;for(let n=0;n<t.set.length;++n){let a=t.set[n],o=null,s=null;if(a.forEach(e=>{e.semver===i&&(e=new r(`>=0.0.0`)),o||=e,s||=e,p(e.semver,o.semver,f)?o=e:h(e.semver,s.semver,f)&&(s=e)}),o.operator===g||o.operator===_||(!s.operator||s.operator===g)&&m(e,s.semver)||s.operator===_&&h(e,s.semver))return!1}return!0}})),oo=t(((e,t)=>{var n=ao();t.exports=(e,t,r)=>n(e,t,`>`,r)})),so=t(((e,t)=>{var n=ao();t.exports=(e,t,r)=>n(e,t,`<`,r)})),co=t(((e,t)=>{var n=Za();t.exports=(e,t,r)=>(e=new n(e,r),t=new n(t,r),e.intersects(t,r))})),lo=t(((e,t)=>{var n=$a(),r=Ia();t.exports=(e,t,i)=>{let a=[],o=null,s=null,c=e.sort((e,t)=>r(e,t,i));for(let e of c)n(e,t,i)?(s=e,o||=e):(s&&a.push([o,s]),s=null,o=null);o&&a.push([o,null]);let l=[];for(let[e,t]of a)e===t?l.push(e):!t&&e===c[0]?l.push(`*`):t?e===c[0]?l.push(`<=${t}`):l.push(`${e} - ${t}`):l.push(`>=${e}`);let u=l.join(` || `),d=typeof t.raw==`string`?t.raw:String(t);return u.length<d.length?u:t}})),uo=t(((e,t)=>{var n=Za(),r=Qa(),{ANY:i}=r,a=$a(),o=Ia(),s=(e,t,r={})=>{if(e===t)return!0;e=new n(e,r),t=new n(t,r);let i=!1;OUTER:for(let n of e.set){for(let e of t.set){let t=u(n,e,r);if(i||=t!==null,t)continue OUTER}if(i)return!1}return!0},c=[new r(`>=0.0.0-0`)],l=[new r(`>=0.0.0`)],u=(e,t,n)=>{if(e===t)return!0;if(e.length===1&&e[0].semver===i){if(t.length===1&&t[0].semver===i)return!0;e=n.includePrerelease?c:l}if(t.length===1&&t[0].semver===i){if(n.includePrerelease)return!0;t=l}let r=new Set,s,u;for(let t of e)t.operator===`>`||t.operator===`>=`?s=d(s,t,n):t.operator===`<`||t.operator===`<=`?u=f(u,t,n):r.add(t.semver);if(r.size>1)return null;let p;if(s&&u&&(p=o(s.semver,u.semver,n),p>0||p===0&&(s.operator!==`>=`||u.operator!==`<=`)))return null;for(let e of r){if(s&&!a(e,String(s),n)||u&&!a(e,String(u),n))return null;for(let r of t)if(!a(e,String(r),n))return!1;return!0}let m,h,g,_,v=u&&!n.includePrerelease&&u.semver.prerelease.length?u.semver:!1,y=s&&!n.includePrerelease&&s.semver.prerelease.length?s.semver:!1;v&&v.prerelease.length===1&&u.operator===`<`&&v.prerelease[0]===0&&(v=!1);for(let e of t){if(_=_||e.operator===`>`||e.operator===`>=`,g=g||e.operator===`<`||e.operator===`<=`,s){if(y&&e.semver.prerelease&&e.semver.prerelease.length&&e.semver.major===y.major&&e.semver.minor===y.minor&&e.semver.patch===y.patch&&(y=!1),e.operator===`>`||e.operator===`>=`){if(m=d(s,e,n),m===e&&m!==s)return!1}else if(s.operator===`>=`&&!a(s.semver,String(e),n))return!1}if(u){if(v&&e.semver.prerelease&&e.semver.prerelease.length&&e.semver.major===v.major&&e.semver.minor===v.minor&&e.semver.patch===v.patch&&(v=!1),e.operator===`<`||e.operator===`<=`){if(h=f(u,e,n),h===e&&h!==u)return!1}else if(u.operator===`<=`&&!a(u.semver,String(e),n))return!1}if(!e.operator&&(u||s)&&p!==0)return!1}return!(s&&g&&!u&&p!==0||u&&_&&!s&&p!==0||y||v)},d=(e,t,n)=>{if(!e)return t;let r=o(e.semver,t.semver,n);return r>0?e:r<0||t.operator===`>`&&e.operator===`>=`?t:e},f=(e,t,n)=>{if(!e)return t;let r=o(e.semver,t.semver,n);return r<0?e:r>0||t.operator===`<`&&e.operator===`<=`?t:e};t.exports=s})),fo=e(t(((e,t)=>{var n=wa(),r=Sa(),i=$(),a=Ea();t.exports={parse:Da(),valid:Oa(),clean:ka(),inc:Aa(),diff:ja(),major:Ma(),minor:Na(),patch:Pa(),prerelease:Fa(),compare:Ia(),rcompare:La(),compareLoose:Ra(),compareBuild:za(),sort:Ba(),rsort:Va(),gt:Ha(),lt:Ua(),eq:Wa(),neq:Ga(),gte:Ka(),lte:qa(),cmp:Ja(),coerce:Ya(),Comparator:Qa(),Range:Za(),satisfies:$a(),toComparators:eo(),maxSatisfying:to(),minSatisfying:no(),minVersion:ro(),validRange:io(),outside:ao(),gtr:oo(),ltr:so(),intersects:co(),simplifyRange:lo(),subset:uo(),SemVer:i,re:n.re,src:n.src,tokens:n.t,SEMVER_SPEC_VERSION:r.SEMVER_SPEC_VERSION,RELEASE_TYPES:r.RELEASE_TYPES,compareIdentifiers:a.compareIdentifiers,rcompareIdentifiers:a.rcompareIdentifiers}}))(),1),po=O.forwardRef(({className:e,value:t,status:n=`idle`,...r},i)=>{let a=()=>{switch(n){case`installing`:return`bg-blue-500`;case`completed`:return`bg-green-500`;case`failed`:return`bg-red-500`;default:return`bg-gray-300`}};return(0,M.jsx)(`div`,{ref:i,className:N(`relative h-4 w-full overflow-hidden rounded-full bg-gray-200 dark:bg-gray-800`,e),...r,children:(0,M.jsx)(`div`,{className:N(`h-full transition-all duration-300 ease-in-out`,a()),style:{width:`${t||0}%`}})})});po.displayName=`Progress`;var mo=/\[(0|31|32|33|34|35|36|37|90|91|92|93|94|95|96|97)m/g;function ho({isOpen:e,onClose:t,version:n}){let{installStatus:r,startInstall:i,clearStatus:o,isInstalling:s,canCloseDialog:c}=xa(),l=(0,O.useRef)(null),[u,d]=(0,O.useState)(!1);(0,O.useEffect)(()=>{e&&n&&(console.log(`[InstallLogDialog] 对话框打开,开始安装版本:`,n),o(),i(n).catch(e=>{console.error(`[InstallLogDialog] 启动安装失败:`,e)}))},[e,n,i,o]),(0,O.useEffect)(()=>{let e=setTimeout(()=>{l.current&&(l.current.scrollTop=l.current.scrollHeight)},100);return()=>clearTimeout(e)});let f=()=>{switch(r.status){case`idle`:return 0;case`installing`:return Math.min(90,r.logs.length*2);case`completed`:return 100;case`failed`:return 100;default:return 0}},p=()=>{switch(r.status){case`installing`:return`正在安装...`;case`completed`:return`安装完成`;case`failed`:return`安装失败`;default:return`准备安装`}},m=()=>{switch(r.status){case`installing`:return(0,M.jsx)(a,{className:`h-4 w-4 animate-pulse`});case`completed`:return(0,M.jsx)(Ke,{className:`h-4 w-4 text-green-600`});case`failed`:return(0,M.jsx)(ke,{className:`h-4 w-4 text-red-600`});default:return null}},h=()=>{switch(r.status){case`installing`:return`default`;case`completed`:return`secondary`;case`failed`:return`destructive`;default:return`outline`}},g=e=>e.replace(mo,``).split(`
80
+ `).filter(e=>e.trim()).map((e,t)=>(0,M.jsx)(`div`,{className:`leading-relaxed`,children:e},`${e.slice(0,20)}-${t}`)),_=()=>{c()?(o(),t()):E.error(`安装过程中无法关闭对话框,请等待安装完成`)};return(0,M.jsx)(I,{open:e,onOpenChange:_,children:(0,M.jsxs)(L,{className:`max-w-2xl max-h-[80vh] flex flex-col`,onKeyDown:e=>{e.key===`Escape`&&c()&&_()},children:[(0,M.jsx)(R,{className:`flex flex-row items-center justify-between space-y-0 pb-4`,children:(0,M.jsxs)(`div`,{className:`flex items-center gap-3`,children:[(0,M.jsx)(z,{className:`text-lg font-semibold`,children:`正在安装`}),r.status!==`idle`&&(0,M.jsxs)(P,{variant:h(),className:`flex items-center gap-1`,children:[m(),p()]})]})}),(0,M.jsxs)(`div`,{className:`space-y-4`,children:[(0,M.jsxs)(`div`,{className:`space-y-2`,children:[(0,M.jsxs)(`div`,{className:`flex items-center justify-between text-sm`,children:[(0,M.jsx)(`span`,{className:`font-medium`,children:`安装进度`}),r.version&&(0,M.jsxs)(P,{variant:`outline`,className:`text-xs`,children:[`v`,r.version]})]}),(0,M.jsx)(po,{value:f(),status:r.status,className:`w-full h-2`}),(0,M.jsxs)(`div`,{className:`flex items-center justify-between text-xs text-muted-foreground`,children:[(0,M.jsx)(`span`,{children:p()}),r.duration&&(0,M.jsxs)(`span`,{children:[`耗时: `,(r.duration/1e3).toFixed(1),`s`]})]})]}),r.status===`failed`&&(0,M.jsx)(Ri,{variant:`destructive`,children:(0,M.jsx)(Bi,{children:`安装失败,请查看详细日志了解具体原因。`})}),(0,M.jsxs)(`div`,{children:[(0,M.jsxs)(`button`,{type:`button`,onClick:()=>{d(!u)},className:`flex w-full items-center justify-between h-auto p-0 gap-0 hover:bg-none bg-none text-sm mb-2`,children:[(0,M.jsx)(`h4`,{className:`font-medium`,children:`安装日志`}),(0,M.jsx)(`div`,{className:`flex items-center gap-1`,children:u?(0,M.jsxs)(M.Fragment,{children:[`收起 `,(0,M.jsx)(je,{className:`h-4 w-4`})]}):(0,M.jsxs)(M.Fragment,{children:[`展开 `,(0,M.jsx)(Je,{className:`h-4 w-4`})]})})]}),u&&(0,M.jsx)(xi,{ref:l,className:`h-[300px] w-full rounded-md border bg-background`,children:(0,M.jsx)(`div`,{className:`p-4 font-mono text-xs`,children:r.logs.length===0?(0,M.jsxs)(`div`,{className:`text-muted-foreground flex items-center gap-2`,children:[(0,M.jsx)(a,{className:`h-4 w-4 animate-pulse`}),`等待日志输出...`]}):(0,M.jsx)(`div`,{className:`space-y-1`,children:r.logs.map(e=>(0,M.jsx)(`div`,{className:`${e.type===`stderr`?`text-orange-600`:`text-foreground`} break-words`,children:g(e.message)},`${e.timestamp}-${e.message.slice(0,50)}`))})})})]})]}),(0,M.jsx)(dn,{className:`flex items-center justify-between pt-4 border-t`,children:(0,M.jsxs)(`div`,{className:`flex gap-2`,children:[r.status===`completed`&&(0,M.jsxs)(F,{variant:`outline`,onClick:()=>window.location.reload(),className:`flex items-center gap-2`,children:[(0,M.jsx)(Ke,{className:`h-4 w-4`}),`重启应用`]}),(0,M.jsx)(F,{onClick:_,disabled:!c(),variant:r.status===`failed`?`destructive`:`default`,children:s()?`安装中...`:r.status===`completed`?`完成`:(r.status,`关闭`)})]})})]})})}var go=[{value:`stable`,label:`正式版`},{value:`rc`,label:`预览版`},{value:`beta`,label:`测试版`},{value:`all`,label:`全部版本`}];function _o({children:e,defaultSelectedVersion:t}){let[n,r]=(0,O.useState)(!1),[i,a]=(0,O.useState)(``),[o,s]=(0,O.useState)(`stable`),[c,l]=(0,O.useState)(!1),[u,d]=(0,O.useState)([]),[f,p]=(0,O.useState)(!1),{startInstall:m}=xa(),h=(0,O.useCallback)(async e=>{try{p(!0);let n=await k.getAvailableVersions(e);d(n.versions.map(e=>({value:e,label:`v${e}`}))),console.log(`[VersionUpgradeDialog] 获取到 ${n.total} 个${e}版本`),t&&n.versions.includes(t||``)&&a(t||``)}catch(e){console.error(`[VersionUpgradeDialog] 获取版本列表失败:`,e),d([])}finally{p(!1)}},[t]);return(0,O.useEffect)(()=>{n&&h(o)},[n,o,h]),(0,M.jsxs)(M.Fragment,{children:[(0,M.jsxs)(I,{open:n,onOpenChange:e=>{e||(a(``),s(`stable`)),r(e)},children:[(0,M.jsx)(sn,{asChild:!0,children:e||(0,M.jsxs)(F,{className:`flex items-center gap-2`,children:[(0,M.jsx)(Be,{className:`h-4 w-4`}),`升级版本`]})}),(0,M.jsxs)(L,{className:`sm:max-w-md`,children:[(0,M.jsxs)(R,{children:[(0,M.jsx)(z,{children:`选择安装版本`}),(0,M.jsx)(fn,{children:`请选择要安装的 xiaozhi-client 版本`})]}),(0,M.jsx)(`div`,{className:`space-y-4 py-4`,children:(0,M.jsxs)(`div`,{className:`space-y-2`,children:[(0,M.jsx)(`label`,{htmlFor:`version-select`,className:`text-sm font-medium`,children:`版本选择`}),(0,M.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,M.jsxs)(Qn,{value:o,onValueChange:e=>{s(e),a(``)},children:[(0,M.jsx)(J,{id:`version-type-select`,className:`w-[150px]`,children:(0,M.jsx)(er,{placeholder:`请选择版本类型`})}),(0,M.jsx)(Y,{children:go.map(e=>(0,M.jsx)(X,{value:e.value,children:e.label},e.value))})]}),(0,M.jsxs)(Qn,{value:i,onValueChange:e=>{a(e)},disabled:f,children:[(0,M.jsx)(J,{id:`version-select`,children:(0,M.jsx)(er,{placeholder:f?`正在获取版本列表...`:`请选择版本`})}),(0,M.jsx)(Y,{children:f?(0,M.jsx)(X,{value:`loading`,disabled:!0,children:`正在获取版本列表...`}):u.length===0?(0,M.jsx)(X,{value:`empty`,disabled:!0,children:`暂无可用版本`}):u.map(e=>(0,M.jsx)(X,{value:e.value,children:e.label},e.value))})]})]}),!f&&u.length===0&&(0,M.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`当前版本类型暂无可用版本`}),i&&fo.default.lt(i,`1.8.0`)&&(0,M.jsxs)(Ri,{variant:`destructive`,children:[(0,M.jsx)(g,{size:18}),(0,M.jsx)(zi,{children:`重要提醒`}),(0,M.jsx)(Bi,{children:`指定版本低于1.8.0,安装后无法再使用Web界面重装,需手动通过命令操作,请谨慎操作!`})]})]})}),(0,M.jsxs)(`div`,{className:`flex justify-end gap-2`,children:[(0,M.jsx)(F,{variant:`outline`,onClick:()=>r(!1),children:`取消`}),(0,M.jsx)(F,{onClick:async()=>{if(i)try{console.log(`[VersionUpgradeDialog] 开始安装版本:`,i),r(!1),l(!0),await m(i)}catch(e){console.error(`[VersionUpgradeDialog] 安装失败:`,e),l(!1)}},disabled:!i||f,children:`确定安装`})]})]})]}),(0,M.jsx)(ho,{isOpen:c,onClose:()=>{l(!1),a(``)},version:i})]})}function vo({className:e}){let[t,r]=(0,O.useState)(null),[i,a]=(0,O.useState)(null),[o,s]=(0,O.useState)(!0),[c,l]=(0,O.useState)(!0),[u,d]=(0,O.useState)(null),[f,p]=(0,O.useState)(!1),m=(0,O.useRef)(null);(0,O.useEffect)(()=>{(async()=>{try{s(!0),d(null),r(await k.getVersion())}catch(e){d(e instanceof Error?e.message:`获取版本信息失败`),console.error(`获取版本信息失败:`,e)}finally{s(!1)}})()},[]),(0,O.useEffect)(()=>()=>{m.current&&clearTimeout(m.current)},[]),(0,O.useEffect)(()=>{t&&(async()=>{try{l(!0),a(await k.getLatestVersion())}catch(e){console.error(`检查更新失败:`,e),a({currentVersion:t?.version||`unknown`,latestVersion:null,hasUpdate:!1,error:e instanceof Error?e.message:`检查更新失败`})}finally{l(!1)}})()},[t]);let h=async()=>{if(t?.version)try{await navigator.clipboard.writeText(t.version),p(!0),m.current&&clearTimeout(m.current),m.current=setTimeout(()=>p(!1),2e3)}catch(e){console.error(`复制版本号失败:`,e)}};if(o)return(0,M.jsx)(P,{variant:`outline`,className:e,children:(0,M.jsx)(`span`,{className:`text-xs`,children:`加载中...`})});if(u||!t)return(0,M.jsx)(P,{variant:`outline`,className:e,children:(0,M.jsx)(`span`,{className:`text-xs text-muted-foreground`,children:`版本未知`})});let g=(0,M.jsxs)(`div`,{className:`space-y-1`,children:[(0,M.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,M.jsx)(n,{className:`h-3 w-3`}),(0,M.jsx)(`span`,{className:`font-semibold`,children:`版本详情`})]}),(0,M.jsxs)(`div`,{className:`text-xs space-y-0.5`,children:[(0,M.jsxs)(`div`,{children:[(0,M.jsx)(`strong`,{children:`名称:`}),` `,t.name]}),(0,M.jsxs)(`div`,{children:[(0,M.jsx)(`strong`,{children:`版本:`}),` `,t.version]}),i&&(0,M.jsxs)(M.Fragment,{children:[(0,M.jsxs)(`div`,{children:[(0,M.jsx)(`strong`,{children:`最新版本:`}),` `,i.latestVersion||`未知`]}),(0,M.jsxs)(`div`,{children:[(0,M.jsx)(`strong`,{children:`状态:`}),c?`检查中...`:i.hasUpdate?`有新版本`:`已是最新`]})]}),(0,M.jsxs)(`div`,{children:[(0,M.jsx)(`strong`,{children:`描述:`}),` `,t.description]}),(0,M.jsxs)(`div`,{children:[(0,M.jsx)(`strong`,{children:`作者:`}),` `,t.author]})]}),(0,M.jsx)(`div`,{className:`pt-1 border-t`,children:(0,M.jsxs)(`button`,{type:`button`,onClick:h,className:`text-xs text-primary hover:underline flex items-center gap-1`,children:[(0,M.jsx)(Te,{className:`h-3 w-3`}),f?`已复制!`:`复制版本号`]})})]});return(0,M.jsx)(Zi,{children:(0,M.jsxs)(`div`,{className:`flex items-center gap-2`,children:[c?null:i?.hasUpdate&&i.latestVersion?(0,M.jsx)(_o,{defaultSelectedVersion:i.latestVersion,children:(0,M.jsxs)(F,{variant:`link`,className:`p-0 gap-1`,children:[(0,M.jsx)(tt,{}),`升级版本`]})}):(0,M.jsx)(_o,{defaultSelectedVersion:t.version,children:(0,M.jsx)(F,{variant:`link`,className:`p-0 gap-1`,children:`切换版本`})}),(0,M.jsxs)(Qi,{children:[(0,M.jsx)($i,{asChild:!0,children:(0,M.jsxs)(`span`,{className:`text-sm cursor-help`,children:[`v`,t.version]})}),(0,M.jsx)(ea,{children:g})]})]})})}function yo({title:e}){return(0,M.jsxs)(`header`,{className:`flex h-12 shrink-0 items-center gap-2 border-b px-4`,children:[(0,M.jsx)(`h1`,{className:`text-base font-medium`,children:e}),(0,M.jsxs)(`div`,{className:`flex flex-1 justify-end items-center gap-4`,children:[(0,M.jsx)(vo,{}),(0,M.jsx)(`a`,{href:`https://qun.qq.com/universal-share/share?ac=1&authKey=c08PvS2zvAF1NN%2F%2BuaOi0ze1AElTIsvFBLwbWUMFc2ixjaZYxqZTUQHzipwd8Kka&busi_data=eyJncm91cENvZGUiOiIxMDU0ODg4NDczIiwidG9rZW4iOiJuSmJUN2cyUEVkNEQ5WXovM3RQbFVNcDluMGVibUNZTUQvL1RuQnFJRjBkZmRZQnRBRTdwU0szL3V2Y0dLc1ZmIiwidWluIjoiMzkxMTcyMDYwMCJ9&data=9cH6_zEC-sN3xYlwzKEWiYF71RLY9CId5taN-gy6XZo7axSlSWDpd1Ojui5hYMQKIgEJYSPw59XYgF5vH2wLog&svctype=4&tempid=h5_group_info`,target:`_blank`,rel:`noopener noreferrer`,children:(0,M.jsx)(ya,{size:24,className:`text-slate-800`,fill:`currentColor`})}),(0,M.jsx)(`a`,{href:`https://github.com/shenjingnan/xiaozhi-client`,target:`_blank`,rel:`noopener noreferrer`,children:(0,M.jsx)(ba,{size:24,className:`text-slate-800`,fill:`currentColor`})})]})]})}function bo(){return(0,M.jsxs)(`div`,{className:`flex h-screen flex-col`,children:[(0,M.jsx)(yo,{title:`看板`}),(0,M.jsx)(`div`,{className:`flex flex-1 flex-col`,children:(0,M.jsx)(`div`,{className:`@container/main flex flex-1 flex-col gap-2`,children:(0,M.jsxs)(`div`,{className:`flex flex-col gap-4 py-4 md:gap-6 md:py-6`,children:[(0,M.jsx)(Yi,{}),(0,M.jsx)(`div`,{className:`flex flex-col gap-4 px-4 lg:px-6`,children:(0,M.jsx)(va,{initialStatus:`all`})})]})})})]})}function xo(){return(0,M.jsxs)(qn,{children:[(0,M.jsx)(Gt,{}),(0,M.jsxs)(ee,{children:[(0,M.jsx)(h,{path:`/`,element:(0,M.jsx)(ve,{to:`/dashboard`})}),(0,M.jsx)(h,{path:`/dashboard`,element:(0,M.jsx)(bo,{})}),(0,M.jsx)(h,{path:`*`,element:(0,M.jsx)(ve,{to:`/dashboard`,replace:!0})})]}),(0,M.jsx)(xt,{richColors:!0,closeButton:!0,swipeDirections:[],toastOptions:{classNames:{description:`group-[.toast]:text-muted-foreground`,actionButton:`group-[.toast]:bg-primary group-[.toast]:text-primary-foreground`,cancelButton:`group-[.toast]:bg-white group-[.toast]:text-black`,error:`group toast group-[.toaster]:bg-red group-[.toaster]:text-red-600 dark:group-[.toaster]:text-foreground group-[.toaster]:shadow-lg`,success:`group toast group-[.toaster]:bg-green group-[.toaster]:text-green-600 dark:group-[.toaster]:text-foreground group-[.toaster]:shadow-lg`,warning:`group toast group-[.toaster]:bg-yellow group-[.toaster]:text-yellow-600 dark:group-[.toaster]:text-foreground group-[.toaster]:shadow-lg`,info:`group toast group-[.toaster]:bg-blue group-[.toaster]:text-blue-600 dark:group-[.toaster]:text-foreground group-[.toaster]:shadow-lg`}}})]})}Ft.createRoot(document.getElementById(`root`)).render((0,M.jsx)(O.StrictMode,{children:(0,M.jsx)(he,{children:(0,M.jsx)(xo,{})})}));
81
+ //# sourceMappingURL=index-C3xvW3AQ.js.map