jishushell 0.4.17 → 0.4.24-beta.2

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 (241) hide show
  1. package/Dockerfile.hermes-slim +193 -0
  2. package/apps/hermes-container.yaml +35 -0
  3. package/apps/ollama-binary.yaml +164 -0
  4. package/apps/ollama-cpu-container.yaml +37 -0
  5. package/apps/ollama-with-hollama-binary.yaml +159 -0
  6. package/apps/openclaw-binary.yaml +69 -0
  7. package/apps/openclaw-container.yaml +37 -0
  8. package/apps/openclaw-with-ollama-container.yaml +42 -0
  9. package/apps/openclaw-with-searxng-container.yaml +136 -0
  10. package/apps/openwebui-container.yaml +53 -0
  11. package/apps/playwright-container.yaml +120 -0
  12. package/apps/searxng-container.yaml +115 -0
  13. package/dist/auth.d.ts +1 -0
  14. package/dist/auth.js +15 -14
  15. package/dist/auth.js.map +1 -1
  16. package/dist/cli/app.d.ts +1 -0
  17. package/dist/cli/app.js +770 -52
  18. package/dist/cli/app.js.map +1 -1
  19. package/dist/cli/backup.d.ts +3 -0
  20. package/dist/cli/backup.js +434 -0
  21. package/dist/cli/backup.js.map +1 -0
  22. package/dist/cli/doctor.d.ts +1 -0
  23. package/dist/cli/doctor.js +61 -35
  24. package/dist/cli/doctor.js.map +1 -1
  25. package/dist/cli/job.d.ts +1 -0
  26. package/dist/cli/job.js +37 -99
  27. package/dist/cli/job.js.map +1 -1
  28. package/dist/cli/llm.d.ts +1 -0
  29. package/dist/cli/llm.js +20 -14
  30. package/dist/cli/llm.js.map +1 -1
  31. package/dist/cli/managed-list.d.ts +30 -0
  32. package/dist/cli/managed-list.js +129 -0
  33. package/dist/cli/managed-list.js.map +1 -0
  34. package/dist/cli/panel.d.ts +4 -3
  35. package/dist/cli/panel.js +94 -24
  36. package/dist/cli/panel.js.map +1 -1
  37. package/dist/cli/version.d.ts +1 -0
  38. package/dist/cli/version.js +12 -0
  39. package/dist/cli/version.js.map +1 -0
  40. package/dist/cli.js +47 -516
  41. package/dist/cli.js.map +1 -1
  42. package/dist/config.d.ts +68 -0
  43. package/dist/config.js +266 -12
  44. package/dist/config.js.map +1 -1
  45. package/dist/control.d.ts +10 -6
  46. package/dist/control.js +87 -6
  47. package/dist/control.js.map +1 -1
  48. package/dist/install.d.ts +16 -0
  49. package/dist/install.js +75 -26
  50. package/dist/install.js.map +1 -1
  51. package/dist/routes/agent-apps.d.ts +15 -0
  52. package/dist/routes/agent-apps.js +78 -0
  53. package/dist/routes/agent-apps.js.map +1 -0
  54. package/dist/routes/apps.js +186 -7
  55. package/dist/routes/apps.js.map +1 -1
  56. package/dist/routes/backup.js +3 -3
  57. package/dist/routes/backup.js.map +1 -1
  58. package/dist/routes/instances.d.ts +6 -0
  59. package/dist/routes/instances.js +862 -879
  60. package/dist/routes/instances.js.map +1 -1
  61. package/dist/routes/llm.js +9 -8
  62. package/dist/routes/llm.js.map +1 -1
  63. package/dist/routes/runtime.d.ts +15 -0
  64. package/dist/routes/runtime.js +69 -0
  65. package/dist/routes/runtime.js.map +1 -0
  66. package/dist/routes/setup.js +103 -8
  67. package/dist/routes/setup.js.map +1 -1
  68. package/dist/routes/system.js +25 -3
  69. package/dist/routes/system.js.map +1 -1
  70. package/dist/server.js +71 -7
  71. package/dist/server.js.map +1 -1
  72. package/dist/services/agent-apps/catalog.d.ts +30 -0
  73. package/dist/services/agent-apps/catalog.js +60 -0
  74. package/dist/services/agent-apps/catalog.js.map +1 -0
  75. package/dist/services/agent-apps/index.d.ts +36 -0
  76. package/dist/services/agent-apps/index.js +171 -0
  77. package/dist/services/agent-apps/index.js.map +1 -0
  78. package/dist/services/agent-apps/installers/adapter-probes.d.ts +49 -0
  79. package/dist/services/agent-apps/installers/adapter-probes.js +223 -0
  80. package/dist/services/agent-apps/installers/adapter-probes.js.map +1 -0
  81. package/dist/services/agent-apps/installers/adapter.d.ts +30 -0
  82. package/dist/services/agent-apps/installers/adapter.js +171 -0
  83. package/dist/services/agent-apps/installers/adapter.js.map +1 -0
  84. package/dist/services/agent-apps/installers/registry-probe.d.ts +38 -0
  85. package/dist/services/agent-apps/installers/registry-probe.js +183 -0
  86. package/dist/services/agent-apps/installers/registry-probe.js.map +1 -0
  87. package/dist/services/agent-apps/installers/shell-script.d.ts +47 -0
  88. package/dist/services/agent-apps/installers/shell-script.js +471 -0
  89. package/dist/services/agent-apps/installers/shell-script.js.map +1 -0
  90. package/dist/services/agent-apps/types.d.ts +125 -0
  91. package/dist/services/agent-apps/types.js +17 -0
  92. package/dist/services/agent-apps/types.js.map +1 -0
  93. package/dist/services/{app-compiler.d.ts → app/app-compiler.d.ts} +3 -3
  94. package/dist/services/{app-compiler.js → app/app-compiler.js} +10 -7
  95. package/dist/services/app/app-compiler.js.map +1 -0
  96. package/dist/services/app/app-manager.d.ts +142 -0
  97. package/dist/services/app/app-manager.js +2148 -0
  98. package/dist/services/app/app-manager.js.map +1 -0
  99. package/dist/services/app/custom-manager.d.ts +27 -0
  100. package/dist/services/app/custom-manager.js +285 -0
  101. package/dist/services/app/custom-manager.js.map +1 -0
  102. package/dist/services/app/hermes-agent-manager.d.ts +20 -0
  103. package/dist/services/app/hermes-agent-manager.js +289 -0
  104. package/dist/services/app/hermes-agent-manager.js.map +1 -0
  105. package/dist/services/app/id-normalizer.d.ts +27 -0
  106. package/dist/services/app/id-normalizer.js +77 -0
  107. package/dist/services/app/id-normalizer.js.map +1 -0
  108. package/dist/services/app/ollama-manager.d.ts +18 -0
  109. package/dist/services/app/ollama-manager.js +207 -0
  110. package/dist/services/app/ollama-manager.js.map +1 -0
  111. package/dist/services/app/openclaw-manager.d.ts +63 -0
  112. package/dist/services/app/openclaw-manager.js +1178 -0
  113. package/dist/services/app/openclaw-manager.js.map +1 -0
  114. package/dist/services/app/paths.d.ts +47 -0
  115. package/dist/services/app/paths.js +68 -0
  116. package/dist/services/app/paths.js.map +1 -0
  117. package/dist/services/app/registry.d.ts +17 -0
  118. package/dist/services/app/registry.js +31 -0
  119. package/dist/services/app/registry.js.map +1 -0
  120. package/dist/services/app/remote-spec.d.ts +14 -0
  121. package/dist/services/app/remote-spec.js +58 -0
  122. package/dist/services/app/remote-spec.js.map +1 -0
  123. package/dist/services/app/terminal-session-manager.d.ts +27 -0
  124. package/dist/services/app/terminal-session-manager.js +157 -0
  125. package/dist/services/app/terminal-session-manager.js.map +1 -0
  126. package/dist/services/app/types.d.ts +72 -0
  127. package/dist/services/app/types.js +16 -0
  128. package/dist/services/app/types.js.map +1 -0
  129. package/dist/services/backup-manager.js +60 -22
  130. package/dist/services/backup-manager.js.map +1 -1
  131. package/dist/services/instance-manager.d.ts +82 -39
  132. package/dist/services/instance-manager.js +575 -1142
  133. package/dist/services/instance-manager.js.map +1 -1
  134. package/dist/services/llm-proxy/circuit-breaker.js +10 -2
  135. package/dist/services/llm-proxy/circuit-breaker.js.map +1 -1
  136. package/dist/services/llm-proxy/index.d.ts +14 -1
  137. package/dist/services/llm-proxy/index.js +51 -6
  138. package/dist/services/llm-proxy/index.js.map +1 -1
  139. package/dist/services/nomad-manager.d.ts +260 -3
  140. package/dist/services/nomad-manager.js +2866 -449
  141. package/dist/services/nomad-manager.js.map +1 -1
  142. package/dist/services/panel-manager.d.ts +10 -0
  143. package/dist/services/panel-manager.js +97 -0
  144. package/dist/services/panel-manager.js.map +1 -1
  145. package/dist/services/plugin-installer.js +28 -2
  146. package/dist/services/plugin-installer.js.map +1 -1
  147. package/dist/services/process-manager.js +22 -0
  148. package/dist/services/process-manager.js.map +1 -1
  149. package/dist/services/runtime/adapters/custom.d.ts +20 -0
  150. package/dist/services/runtime/adapters/custom.js +90 -0
  151. package/dist/services/runtime/adapters/custom.js.map +1 -0
  152. package/dist/services/runtime/adapters/hermes.d.ts +174 -0
  153. package/dist/services/runtime/adapters/hermes.js +1316 -0
  154. package/dist/services/runtime/adapters/hermes.js.map +1 -0
  155. package/dist/services/runtime/adapters/openclaw-routes.d.ts +17 -0
  156. package/dist/services/runtime/adapters/openclaw-routes.js +946 -0
  157. package/dist/services/runtime/adapters/openclaw-routes.js.map +1 -0
  158. package/dist/services/runtime/adapters/openclaw.d.ts +188 -0
  159. package/dist/services/runtime/adapters/openclaw.js +2195 -0
  160. package/dist/services/runtime/adapters/openclaw.js.map +1 -0
  161. package/dist/services/runtime/errors.d.ts +28 -0
  162. package/dist/services/runtime/errors.js +31 -0
  163. package/dist/services/runtime/errors.js.map +1 -0
  164. package/dist/services/runtime/index.d.ts +34 -0
  165. package/dist/services/runtime/index.js +51 -0
  166. package/dist/services/runtime/index.js.map +1 -0
  167. package/dist/services/runtime/instance.d.ts +24 -0
  168. package/dist/services/runtime/instance.js +143 -0
  169. package/dist/services/runtime/instance.js.map +1 -0
  170. package/dist/services/runtime/migrations.d.ts +15 -0
  171. package/dist/services/runtime/migrations.js +25 -0
  172. package/dist/services/runtime/migrations.js.map +1 -0
  173. package/dist/services/runtime/registry.d.ts +13 -0
  174. package/dist/services/runtime/registry.js +32 -0
  175. package/dist/services/runtime/registry.js.map +1 -0
  176. package/dist/services/runtime/types.d.ts +545 -0
  177. package/dist/services/runtime/types.js +14 -0
  178. package/dist/services/runtime/types.js.map +1 -0
  179. package/dist/services/setup-manager.d.ts +70 -29
  180. package/dist/services/setup-manager.js +278 -597
  181. package/dist/services/setup-manager.js.map +1 -1
  182. package/dist/services/task-registry.d.ts +44 -0
  183. package/dist/services/task-registry.js +74 -0
  184. package/dist/services/task-registry.js.map +1 -0
  185. package/dist/services/telemetry/heartbeat.d.ts +6 -6
  186. package/dist/services/telemetry/heartbeat.js +29 -30
  187. package/dist/services/telemetry/heartbeat.js.map +1 -1
  188. package/dist/types.d.ts +164 -2
  189. package/dist/utils/docker-host.d.ts +15 -0
  190. package/dist/utils/docker-host.js +64 -0
  191. package/dist/utils/docker-host.js.map +1 -0
  192. package/install/jishu-install.sh +25 -2
  193. package/package.json +14 -4
  194. package/public/assets/Dashboard-rh9qpYRR.js +1 -0
  195. package/public/assets/HermesChatPanel-D6JI6lLY.js +1 -0
  196. package/public/assets/HermesConfigForm-DcbSemaj.js +4 -0
  197. package/public/assets/InitPassword-CFTKsED4.js +1 -0
  198. package/public/assets/InstanceDetail-BhNIKA6Z.js +91 -0
  199. package/public/assets/{Login-D1Bt-Lyk.js → Login-KB9qrtM0.js} +1 -1
  200. package/public/assets/NewInstance-CxkO8Hlq.js +1 -0
  201. package/public/assets/Settings-BVWJvOkU.js +1 -0
  202. package/public/assets/Setup-X-lzuaUT.js +1 -0
  203. package/public/assets/WeixinLoginPanel-gca0QTic.js +9 -0
  204. package/public/assets/index-C8B0cFJM.js +19 -0
  205. package/public/assets/index-CPhVFEsx.css +1 -0
  206. package/public/assets/input-paste-CrNVAyOy.js +1 -0
  207. package/public/assets/registry-fVUSujib.js +2 -0
  208. package/public/assets/{usePolling-CK0DfI4h.js → usePolling-Do5Erqm_.js} +1 -1
  209. package/public/assets/vendor-i18n-ucpM0OR0.js +9 -0
  210. package/public/assets/{vendor-react-B1-3Yrt-.js → vendor-react-Bk1hRGiY.js} +1 -1
  211. package/public/favicon.png +0 -0
  212. package/public/index.html +9 -4
  213. package/public/logos/hermes.png +0 -0
  214. package/public/logos/ollama.png +0 -0
  215. package/public/logos/openclaw.svg +60 -0
  216. package/scripts/build-hermes-image.sh +21 -0
  217. package/scripts/build-local.sh +54 -0
  218. package/scripts/check-adapter-isolation.ts +293 -0
  219. package/scripts/fixtures/instances/hermes-sample/instance.json +37 -0
  220. package/scripts/fixtures/instances/legacy-openclaw-sample/instance.json +7 -0
  221. package/scripts/smoke/hermes-bootstrap.sh +195 -0
  222. package/templates/hermes-entrypoint.sh +154 -0
  223. package/dist/cli/openclaw.d.ts +0 -12
  224. package/dist/cli/openclaw.js +0 -156
  225. package/dist/cli/openclaw.js.map +0 -1
  226. package/dist/services/app-compiler.js.map +0 -1
  227. package/dist/services/app-manager.d.ts +0 -17
  228. package/dist/services/app-manager.js +0 -168
  229. package/dist/services/app-manager.js.map +0 -1
  230. package/dist/services/job-manager.d.ts +0 -22
  231. package/dist/services/job-manager.js +0 -102
  232. package/dist/services/job-manager.js.map +0 -1
  233. package/public/assets/Dashboard-CQsp1Mr9.js +0 -1
  234. package/public/assets/InitPassword-BEC8SE4A.js +0 -1
  235. package/public/assets/InstanceDetail-B5wTgNEg.js +0 -17
  236. package/public/assets/NewInstance-GQzm3K9D.js +0 -1
  237. package/public/assets/Settings-ByjGlqhP.js +0 -1
  238. package/public/assets/Setup-cMF21Y-8.js +0 -1
  239. package/public/assets/index-B6qQP4mH.css +0 -1
  240. package/public/assets/index-BuTQtuNy.js +0 -16
  241. package/public/assets/vendor-i18n-CfW0RvgE.js +0 -9
@@ -1 +0,0 @@
1
- import{ae as je,af as Ne,n as ye,H as we,j as e,I as J,a as Y,ag as Fe,s as ke,ah as Me,p as Ce,ai as Se,aj as Ae,ak as $e,al as Ie,am as Pe}from"./index-BuTQtuNy.js";import{r as d}from"./vendor-react-B1-3Yrt-.js";import{P as S}from"./providers-V-vwrExZ.js";import{u as Q}from"./vendor-i18n-CfW0RvgE.js";function Ke({showToast:a}){var te;const{t:l}=Q("settings"),{t:f}=Q("instance"),[m,A]=d.useState([]),[$,I]=d.useState(!0),[i,P]=d.useState(null),[L,K]=d.useState(!1),[U,g]=d.useState(!1),[E,q]=d.useState(null),[j,N]=d.useState([]),[n,y]=d.useState(""),[r,u]=d.useState(""),[v,x]=d.useState(""),[X,V]=d.useState(!1),[Z,B]=d.useState(""),[H,z]=d.useState(""),[D,T]=d.useState(!1),[w,_]=d.useState([]),re={name:"",baseUrl:"",api:"openai",apiKey:"",authHeader:"",selectedModelId:""},[o,h]=d.useState(re),[ee,ne]=d.useState(!1),F=d.useCallback(()=>{I(!0),Me().then(A).catch(()=>A([])).finally(()=>I(!1))},[]);d.useEffect(()=>{F()},[F]);const b="w-full bg-[var(--input-bg)] border border-[var(--border)] rounded-md px-3 py-2 text-sm text-foreground placeholder-[var(--muted)] focus:outline-none focus:ring-1 focus:ring-[#0066FF]/60 focus:border-[#0066FF]/60 transition-colors duration-200",O="w-full bg-background border border-[var(--border)] rounded-md px-3 py-2 text-sm text-foreground focus:outline-none focus:ring-1 focus:ring-[#0066FF]/60 focus:border-[#0066FF]/60 transition-colors duration-200 appearance-none",oe=()=>{P(null),y(""),u(""),x(""),B(""),z(""),V(!1),_([]),N([]),K(!0)},ie=s=>{K(!1),N([]),h({name:s.name||s.id,baseUrl:s.baseUrl,api:s.api,apiKey:"",authHeader:s.authHeader||"",selectedModelId:s.selectedModelId||""}),P(s.id)},R=()=>{K(!1),P(null),N([]),y(""),u(""),x(""),B(""),z(""),V(!1),_([])},ce=async()=>{var de;if(!n){a(l("llm.presetRequired"),"error");return}const s=S.find(c=>c.id===n),t=s.local===!0;if(!t&&!r.trim()){a(l("llm.apiKeyRequired"),"error");return}if(t&&!v.trim()&&!s.baseUrl){a(l("llm.baseUrlRequired"),"error");return}const C=m.map(c=>c.id),p=H.trim().toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-|-$/g,"");let W=p?`${n}-${p}`:n;if(C.includes(W)){if(p){a(l("llm.aliasConflict"),"error");return}let c=2;for(;C.includes(`${n}-${c}`);)c++;W=`${n}-${c}`}const ve=H.trim()?`${s.label} (${H.trim()})`:s.label,ae=w.length>0?w.map(c=>({id:c.id,name:c.id,contextWindow:0})):s.models,fe=Z||((de=ae[0])==null?void 0:de.id)||"";g(!0);try{await Se({id:W,name:ve,baseUrl:(t?v.trim():void 0)||s.baseUrl,api:s.api,apiKey:r||void 0,authHeader:s.authHeader?"x-api-key":void 0,models:ae,selectedModelId:fe}),a(l("llm.added"),"success"),R(),F()}catch(c){a(c.message||l("llm.saveFailed"),"error")}finally{g(!1)}},se=async()=>{if(!n)return;const s=S.find(p=>p.id===n),t=s.authHeader?"x-api-key":"Authorization",C=s.local===!0&&v.trim()?v.trim():s.baseUrl;T(!0);try{const{models:p}=await Ce(C,r,t);_(p),a(l("llm.modelsFetched",{count:p.length}),"success")}catch(p){a(p.message||l("llm.modelsFetchFailed"),"error")}finally{T(!1)}},me=async()=>{if(i){if(!o.baseUrl.trim()){a(l("llm.baseUrlRequired"),"error");return}g(!0);try{await Ae(i,{name:o.name||i,baseUrl:o.baseUrl.trim(),api:o.api,apiKey:o.apiKey||void 0,authHeader:o.authHeader||void 0,selectedModelId:o.selectedModelId||void 0}),a(l("llm.updated"),"success"),R(),F()}catch(s){a(s.message||l("llm.saveFailed"),"error")}finally{g(!1)}}},ue=async s=>{if(window.confirm(l("llm.confirmDelete",{id:s})))try{await Pe(s),a(l("llm.deleted"),"success"),F()}catch(t){a(t.message||l("llm.deleteFailed"),"error")}},xe=async s=>{try{await $e(s),a(l("llm.defaultSet",{id:s}),"success"),F()}catch(t){a(t.message,"error")}},pe=async s=>{q(s);try{const{models:t}=await Ie(s);N(t),a(l("llm.modelsFetched",{count:t.length}),"success")}catch(t){a(t.message||l("llm.modelsFetchFailed"),"error")}finally{q(null)}},he=[...new Set(S.map(s=>s.group))],k=S.find(s=>s.id===n),le=(k==null?void 0:k.local)===!0,G=w.length>0?w.map(s=>({id:s.id,label:s.id})):((k==null?void 0:k.models)||[]).map(s=>({id:s.id,label:`${s.name} (${Math.round(s.contextWindow/1e3)}K)`})),be=e.jsxs("div",{className:"mt-3 border border-[var(--border)] rounded-lg p-4 space-y-3 bg-[var(--input-bg)]/40",children:[e.jsx("h3",{className:"text-sm font-medium",children:l("llm.addTitle")}),e.jsxs("div",{className:"space-y-3",children:[e.jsxs("div",{children:[e.jsx("label",{className:"block text-xs text-muted mb-1",children:l("llm.presetLabel")}),e.jsxs("select",{value:n,onChange:s=>{const t=S.find(C=>C.id===s.target.value);y(s.target.value),x((t==null?void 0:t.baseUrl)||""),B(""),_([])},className:O,children:[e.jsx("option",{value:"",children:l("llm.presetPlaceholder")}),he.map(s=>e.jsx("optgroup",{label:f(`configForm.providerGroup.${s}`,{defaultValue:s}),children:S.filter(t=>t.group===s).map(t=>e.jsx("option",{value:t.id,children:f(`configForm.providerLabel.${t.id}`,{defaultValue:t.label})},t.id))},s))]})]}),n&&e.jsxs("div",{children:[e.jsx("label",{className:"block text-xs text-muted mb-1",children:l("llm.alias")}),e.jsx("input",{value:H,onChange:s=>z(s.target.value),placeholder:l("llm.aliasPlaceholder"),className:b}),e.jsx("p",{className:"text-[11px] text-muted mt-0.5",children:l("llm.aliasHint")})]}),n&&!le&&e.jsxs("div",{children:[e.jsx("label",{className:"block text-xs text-muted mb-1",children:l("llm.fieldApiKey")}),e.jsxs("div",{className:"flex gap-2",children:[e.jsxs("div",{className:"relative flex-1",children:[e.jsx("input",{type:X?"text":"password",value:r,onChange:s=>u(s.target.value),placeholder:l("llm.apiKeyPlaceholder"),className:`${b} pr-9 font-mono`}),e.jsx("button",{type:"button",onClick:()=>V(s=>!s),className:"absolute right-2.5 top-1/2 -translate-y-1/2 text-muted hover:text-foreground transition-colors",children:X?e.jsx(J,{className:"w-3.5 h-3.5"}):e.jsx(Y,{className:"w-3.5 h-3.5"})})]}),e.jsx("button",{type:"button",onClick:se,disabled:D,className:"px-3 py-1.5 text-xs border border-[var(--border)] rounded-md hover:bg-[var(--input-bg)] disabled:opacity-40 transition-all whitespace-nowrap",children:l(D?"llm.fetchingModels":"llm.fetchModels")})]})]}),n&&le&&e.jsxs("div",{children:[e.jsx("label",{className:"block text-xs text-muted mb-1",children:l("llm.fieldBaseUrl")}),e.jsxs("div",{className:"flex gap-2",children:[e.jsx("input",{value:v,onChange:s=>x(s.target.value),className:`${b} flex-1`}),e.jsx("button",{type:"button",onClick:se,disabled:D,className:"px-3 py-1.5 text-xs border border-[var(--border)] rounded-md hover:bg-[var(--input-bg)] disabled:opacity-40 transition-all whitespace-nowrap",children:l(D?"llm.fetchingModels":"llm.fetchModels")})]})]}),n&&G.length>0&&e.jsxs("div",{children:[e.jsxs("label",{className:"block text-xs text-muted mb-1",children:[l("llm.fieldModel"),w.length>0&&e.jsxs("span",{className:"ml-1 text-green-500 text-[10px]",children:["(",w.length," ",l("llm.liveModels"),")"]})]}),e.jsx("select",{value:Z||((te=G[0])==null?void 0:te.id)||"",onChange:s=>B(s.target.value),className:O,children:G.map(s=>e.jsx("option",{value:s.id,children:s.label},s.id))})]})]}),e.jsxs("div",{className:"flex gap-2 pt-1",children:[e.jsx("button",{onClick:ce,disabled:U,className:"px-4 py-1.5 bg-[#0066FF] text-white rounded-md text-sm font-medium hover:bg-[#0066FF]/90 disabled:opacity-40 transition-all",children:l(U?"llm.saving":"llm.save")}),e.jsx("button",{onClick:R,className:"px-4 py-1.5 border border-[var(--border)] rounded-md text-sm hover:bg-[var(--input-bg)] transition-all",children:l("llm.cancel")})]})]}),M=m.find(s=>s.id===i),ge=e.jsxs("div",{className:"mt-3 border border-[var(--border)] rounded-lg p-4 space-y-3 bg-[var(--input-bg)]/40",children:[e.jsx("h3",{className:"text-sm font-medium",children:l("llm.editTitle",{id:i})}),e.jsxs("div",{className:"grid grid-cols-2 gap-3",children:[e.jsxs("div",{className:"col-span-2",children:[e.jsx("label",{className:"block text-xs text-muted mb-1",children:l("llm.fieldName")}),e.jsx("input",{value:o.name,onChange:s=>h(t=>({...t,name:s.target.value})),placeholder:l("llm.fieldNamePlaceholder"),className:b})]}),e.jsxs("div",{className:"col-span-2",children:[e.jsxs("label",{className:"block text-xs text-muted mb-1",children:[l("llm.fieldBaseUrl")," *"]}),e.jsx("input",{value:o.baseUrl,onChange:s=>h(t=>({...t,baseUrl:s.target.value})),placeholder:"https://api.openai.com",className:b})]}),e.jsxs("div",{className:"col-span-2 sm:col-span-1",children:[e.jsx("label",{className:"block text-xs text-muted mb-1",children:l("llm.fieldApi")}),e.jsxs("select",{value:o.api,onChange:s=>h(t=>({...t,api:s.target.value})),className:O,children:[e.jsx("option",{value:"openai",children:"OpenAI"}),e.jsx("option",{value:"openai-completions",children:"OpenAI Completions"}),e.jsx("option",{value:"anthropic",children:"Anthropic"}),e.jsx("option",{value:"anthropic-messages",children:"Anthropic Messages"})]})]}),e.jsxs("div",{className:"col-span-2 sm:col-span-1",children:[e.jsx("label",{className:"block text-xs text-muted mb-1",children:l("llm.fieldAuthHeader")}),e.jsx("input",{value:o.authHeader,onChange:s=>h(t=>({...t,authHeader:s.target.value})),placeholder:"Authorization",className:b})]}),e.jsxs("div",{className:"col-span-2",children:[e.jsxs("label",{className:"block text-xs text-muted mb-1",children:[l("llm.fieldApiKey"),M!=null&&M.hasApiKey?` (${l("llm.apiKeyConfigured")})`:""]}),e.jsxs("div",{className:"relative",children:[e.jsx("input",{type:ee?"text":"password",value:o.apiKey,onChange:s=>h(t=>({...t,apiKey:s.target.value})),placeholder:M!=null&&M.hasApiKey?l("llm.apiKeyLeaveBlank"):l("llm.apiKeyPlaceholder"),className:`${b} pr-9 font-mono`}),e.jsx("button",{type:"button",onClick:()=>ne(s=>!s),className:"absolute right-2.5 top-1/2 -translate-y-1/2 text-muted hover:text-foreground transition-colors",children:ee?e.jsx(J,{className:"w-3.5 h-3.5"}):e.jsx(Y,{className:"w-3.5 h-3.5"})})]})]}),e.jsxs("div",{className:"col-span-2",children:[e.jsx("label",{className:"block text-xs text-muted mb-1",children:l("llm.fieldModel")}),j.length>0?e.jsxs("select",{value:o.selectedModelId,onChange:s=>h(t=>({...t,selectedModelId:s.target.value})),className:O,children:[e.jsx("option",{value:"",children:l("llm.noModel")}),j.map(s=>e.jsx("option",{value:s.id,children:s.id},s.id))]}):e.jsx("input",{value:o.selectedModelId,onChange:s=>h(t=>({...t,selectedModelId:s.target.value})),placeholder:"gpt-4o",className:b})]})]}),e.jsxs("div",{className:"flex gap-2 pt-1",children:[e.jsx("button",{onClick:me,disabled:U,className:"px-4 py-1.5 bg-[#0066FF] text-white rounded-md text-sm font-medium hover:bg-[#0066FF]/90 disabled:opacity-40 transition-all",children:l(U?"llm.saving":"llm.save")}),e.jsx("button",{onClick:R,className:"px-4 py-1.5 border border-[var(--border)] rounded-md text-sm hover:bg-[var(--input-bg)] transition-all",children:l("llm.cancel")})]})]});return e.jsxs("div",{className:"bg-[var(--card)] border border-[var(--border)] rounded-xl p-4",children:[e.jsxs("div",{className:"flex items-center justify-between mb-3",children:[e.jsxs("div",{children:[e.jsx("h2",{className:"text-sm font-medium text-foreground",children:l("llm.title")}),e.jsx("p",{className:"text-xs text-muted mt-0.5",children:l("llm.desc")})]}),!L&&!i&&e.jsxs("button",{onClick:oe,className:"px-3 py-1.5 bg-[#0066FF] text-white rounded-md text-xs font-medium hover:bg-[#0066FF]/90 transition-all",children:["+ ",l("llm.add")]})]}),L&&be,$?e.jsx("p",{className:"text-sm text-muted py-3",children:l("llm.loading")}):m.length===0&&!L?e.jsx("p",{className:"text-sm text-muted py-3",children:l("llm.empty")}):e.jsx("div",{className:"space-y-2 mt-2",children:m.map(s=>e.jsxs("div",{className:`border rounded-lg p-3 transition-all ${s.isDefault?"border-[#0066FF]/40 bg-[#0066FF]/5":"border-[var(--border)]"}`,children:[e.jsxs("div",{className:"flex items-start justify-between gap-2",children:[e.jsxs("div",{className:"min-w-0 flex-1",children:[e.jsxs("div",{className:"flex items-center gap-2 flex-wrap",children:[e.jsx("span",{className:"text-sm font-medium truncate",children:s.name||s.id}),s.isDefault&&e.jsx("span",{className:"text-[10px] px-1.5 py-0.5 bg-[#0066FF]/15 text-[#0066FF] rounded font-medium",children:l("llm.default")}),e.jsx("span",{className:"text-[10px] px-1.5 py-0.5 bg-[var(--input-bg)] text-muted rounded",children:s.api}),s.hasApiKey&&e.jsx("span",{className:"text-[10px] text-green-500",children:"🔑"})]}),e.jsx("p",{className:"text-xs text-muted truncate mt-0.5",children:s.baseUrl}),s.selectedModelId&&e.jsxs("p",{className:"text-xs text-muted mt-0.5",children:[l("llm.model"),": ",e.jsx("span",{className:"font-mono",children:s.selectedModelId})]})]}),e.jsxs("div",{className:"flex gap-1 flex-shrink-0",children:[!s.isDefault&&e.jsx("button",{onClick:()=>xe(s.id),className:"px-2 py-1 text-xs border border-[var(--border)] rounded hover:bg-[var(--input-bg)] transition-all",children:l("llm.setDefault")}),e.jsx("button",{onClick:()=>{ie(s),pe(s.id)},disabled:E===s.id,className:"px-2 py-1 text-xs border border-[var(--border)] rounded hover:bg-[var(--input-bg)] transition-all disabled:opacity-40",children:E===s.id?"...":l("llm.edit")}),e.jsx("button",{onClick:()=>ue(s.id),disabled:m.length<=1,title:m.length<=1?l("llm.deleteLastForbidden"):void 0,className:"px-2 py-1 text-xs border border-red-500/30 text-red-400 rounded hover:bg-red-500/10 transition-all disabled:opacity-30 disabled:cursor-not-allowed disabled:pointer-events-none",children:l("llm.delete")})]})]}),i===s.id&&ge,E===null&&j.length>0&&i!==s.id&&e.jsxs("div",{className:"mt-2 pt-2 border-t border-[var(--border)]",children:[e.jsxs("p",{className:"text-xs text-muted mb-1",children:[l("llm.availableModels")," (",j.length,")"]}),e.jsx("div",{className:"flex flex-wrap gap-1 max-h-20 overflow-y-auto",children:j.map(t=>e.jsx("span",{className:"text-[11px] font-mono px-1.5 py-0.5 bg-[var(--input-bg)] rounded",children:t.id},t.id))})]})]},s.id))})]})}function He(){const{t:a}=Q("settings"),{system:l,showToast:f}=je(),[m,A]=d.useState(""),[$,I]=d.useState(""),[i,P]=d.useState(!1),[L,K]=d.useState([]),[U,g]=d.useState(!1),[E,q]=d.useState(!1),[j,N]=d.useState(!1);d.useEffect(()=>{g(!0),Ne().then(K).catch(()=>{}).finally(()=>g(!1)),ye().then(async r=>{try{const u=await Promise.all(r.map(x=>we(x.id).catch(()=>({enabled:!1})))),v=r.length>0&&u.every(x=>x==null?void 0:x.enabled);N(v)}catch{}}).catch(()=>{})},[]);const n=async r=>{r.preventDefault();try{const u=await Fe(m,$);u.token&&ke(u.token),f(a("password.updated"),"success"),A(""),I("")}catch(u){f(u.message||a("password.failed"),"error")}},y="w-full bg-[var(--input-bg)] border border-[var(--border)] rounded-md px-3 py-2 text-sm text-foreground placeholder-[var(--muted)] focus:outline-none focus:ring-1 focus:ring-[#0066FF]/60 focus:border-[#0066FF]/60 transition-colors duration-200";return e.jsxs("div",{className:"p-6 max-w-4xl mx-auto",children:[e.jsxs("div",{className:"mb-5",children:[e.jsx("h1",{className:"text-lg font-semibold text-foreground",children:a("title")}),e.jsx("p",{className:"text-sm text-muted mt-0.5",children:a("subtitle")})]}),e.jsxs("div",{className:"space-y-4",children:[e.jsxs("div",{className:"bg-[var(--card)] border border-[var(--border)] rounded-xl p-4",children:[e.jsxs("div",{children:[e.jsx("h2",{className:"text-sm font-medium text-foreground",children:a("proxy.title")}),e.jsx("p",{className:"text-sm text-muted mt-1",children:a("proxy.desc")})]}),e.jsx("div",{className:"mt-3 bg-red-500/10 border border-red-500/20 text-red-400 text-sm rounded-lg px-4 py-3",children:a("proxy.status")})]}),e.jsx(Ke,{showToast:f}),e.jsxs("div",{className:"bg-[var(--card)] border border-[var(--border)] rounded-xl p-4",children:[e.jsx("h2",{className:"text-sm font-medium text-foreground mb-3",children:a("password.title")}),e.jsxs("form",{onSubmit:n,className:"space-y-3",children:[e.jsxs("div",{children:[e.jsx("label",{className:"block text-sm text-muted mb-1.5",children:a("password.current")}),e.jsxs("div",{className:"relative",children:[e.jsx("input",{type:i?"text":"password",value:m,onChange:r=>A(r.target.value),placeholder:a("password.currentPlaceholder"),className:`${y} pr-9`}),e.jsx("button",{type:"button",onClick:()=>P(!i),className:"absolute right-2.5 top-1/2 -translate-y-1/2 text-muted hover:text-foreground transition-colors",children:i?e.jsx(J,{className:"w-3.5 h-3.5"}):e.jsx(Y,{className:"w-3.5 h-3.5"})})]})]}),e.jsxs("div",{children:[e.jsx("label",{className:"block text-sm text-muted mb-1.5",children:a("password.new")}),e.jsx("input",{type:i?"text":"password",value:$,onChange:r=>I(r.target.value),placeholder:a("password.newPlaceholder"),className:y})]}),e.jsx("button",{type:"submit",disabled:!m||$.length<8,className:"px-4 py-2 bg-[#0066FF] text-white rounded-md text-sm font-medium hover:bg-[#0066FF]/90 disabled:opacity-40 transition-all duration-200",children:a("password.submit")})]})]}),l&&e.jsxs("div",{className:"bg-[var(--card)] border border-[var(--border)] rounded-xl p-4",children:[e.jsx("h2",{className:"text-sm font-medium text-foreground mb-3",children:a("system.title")}),e.jsxs("div",{className:"space-y-3",children:[[{label:a("system.cpuUsage"),value:`${l.cpu_percent}%`,percent:l.cpu_percent,warn:l.cpu_percent>90,color:"bg-[#0066FF]"},{label:a("system.memory"),value:`${l.memory.used_mb}MB / ${l.memory.total_mb}MB (${l.memory.percent}%)`,percent:l.memory.percent,warn:!1,color:"bg-[#00D4AA]"},{label:a("system.disk"),value:`${l.disk.used_gb}GB / ${l.disk.total_gb}GB (${l.disk.percent}%)`,percent:l.disk.percent,warn:l.disk.percent>90,color:"bg-[#0066FF]"}].map(r=>e.jsxs("div",{children:[e.jsxs("div",{className:"flex justify-between text-sm mb-1.5",children:[e.jsx("span",{className:"text-muted",children:r.label}),e.jsx("span",{className:`font-medium font-mono text-[13px] ${r.warn?"text-red-400":"text-foreground"}`,children:r.value})]}),e.jsx("div",{className:"w-full bg-[var(--input-bg)] rounded-full h-1.5",children:e.jsx("div",{className:`h-1.5 rounded-full transition-all duration-500 ${r.warn?"bg-red-500":r.color}`,style:{width:`${r.percent}%`}})})]},r.label)),l.temperature&&e.jsxs("div",{className:"flex justify-between text-sm pt-2 border-t border-[var(--border)]",children:[e.jsx("span",{className:"text-muted",children:a("system.cpuTemp")}),e.jsxs("span",{className:"font-medium font-mono text-[13px] text-foreground",children:[l.temperature,"°C"]})]})]})]}),e.jsxs("div",{className:"bg-[var(--card)] border border-[var(--border)] rounded-xl p-4",children:[e.jsx("h2",{className:"text-sm font-medium text-foreground mb-2",children:a("about.title")}),e.jsx("div",{className:"text-sm text-muted space-y-1",children:e.jsxs("p",{children:["JishuShell ","0.4.17"]})})]})]})]})}export{He as default};
@@ -1 +0,0 @@
1
- import{g as de,d as ke,j as e,L as we,T as Ne,e as oe,i as C,f as ye,r as Fe,p as Se,u as _e}from"./index-BuTQtuNy.js";import{r as c}from"./vendor-react-B1-3Yrt-.js";import{P as w}from"./providers-V-vwrExZ.js";import{u as ie}from"./vendor-i18n-CfW0RvgE.js";const L=[{id:"check",label:"环境检测"},{id:"node",label:"Node.js"},{id:"docker",label:"Docker"},{id:"nomad",label:"Nomad"},{id:"openclaw",label:"OpenClaw"},{id:"provider",label:"模型配置"},{id:"done",label:"完成"}];function Ie({ok:u}){return u?e.jsx("span",{className:"inline-block w-2 h-2 rounded-full bg-emerald-500 shadow-[0_0_6px_rgba(16,185,129,0.7)]"}):e.jsx("span",{className:"inline-block w-2 h-2 rounded-full bg-[var(--border)]"})}function U({dep:u,label:s,required:t,extra:M}){const{t:m}=ie("setup"),j=u.needsUpgrade;return e.jsxs("div",{className:"flex items-center justify-between py-2.5 border-b border-[var(--border)] last:border-0",children:[e.jsxs("div",{className:"flex items-center gap-2.5",children:[j?e.jsx("span",{className:"inline-block w-2 h-2 rounded-full bg-amber-400 shadow-[0_0_6px_rgba(251,191,36,0.6)]"}):e.jsx(Ie,{ok:u.installed}),e.jsx("span",{className:"text-sm text-foreground",children:s||u.name}),j&&e.jsx("span",{className:"text-xs text-amber-400",children:m("versionTooOld")}),t&&!u.installed&&!j&&e.jsx("span",{className:"text-xs text-red-400",children:m("required")})]}),e.jsxs("div",{className:"flex items-center gap-2",children:[M,e.jsx("span",{className:"text-xs text-muted font-mono",children:u.installed?u.version||"installed":"not installed"})]})]})}function F(){return e.jsx("span",{className:"w-3.5 h-3.5 border-2 border-white/30 border-t-white rounded-full animate-spin"})}function le(u){return/失败|error|denied|forbidden|unauthorized/i.test(u)?"error":/完成|已就绪|已启动|已存在|成功|built|installed/i.test(u)?"success":/正在|等待|下载|安装|构建|启动|升级|progress|exporting|transferring/i.test(u)?"progress":"info"}function Ce(u){switch(u){case"progress":return{dot:"bg-sky-400 shadow-[0_0_8px_rgba(56,189,248,0.55)]",text:"text-sky-100"};case"success":return{dot:"bg-emerald-400 shadow-[0_0_8px_rgba(52,211,153,0.55)]",text:"text-emerald-100"};case"error":return{dot:"bg-red-400 shadow-[0_0_8px_rgba(248,113,113,0.55)]",text:"text-red-200"};default:return{dot:"bg-slate-500 shadow-[0_0_8px_rgba(148,163,184,0.35)]",text:"text-slate-200/90"}}}function De({onDone:u}){var te,re,ne,ae;const{t:s}=ie(["setup","common","instance"]),[t,M]=c.useState(null),[m,j]=c.useState("check"),[x,N]=c.useState(null),[A,q]=c.useState([]),[T,g]=c.useState(""),[z,O]=c.useState(!1),[f,ce]=c.useState(""),[S,ue]=c.useState(""),[B,me]=c.useState(!1),[K,$]=c.useState(""),[W,V]=c.useState(!1),[y,R]=c.useState([]),[D,H]=c.useState(!1),[_,G]=c.useState(""),J=c.useRef(new Set),Q=c.useCallback((n,r)=>{if(J.current.has(n))return;J.current.add(n);const a=r==="openclaw-docker"?s("setup:dockerImageBuild"):r==="docker"?s("setup:dockerInstall"):r==="openclaw"?s("setup:openclawInstall"):r;N(r),h(s("setup:resumeTask",{label:a}),"progress"),X(n,a).then(()=>{b(!0)}).catch(o=>{g(o.message||s("setup:taskFailed"))}).finally(()=>{N(null)})},[]),b=c.useCallback((n=!1)=>{de().then(r=>{var a;if(M(r),(a=r.runningTasks)!=null&&a.length)for(const o of r.runningTasks)Q(o.id,o.name);if(!n&&r.ready){j("provider");return}}).catch(()=>{})},[u,Q]);c.useEffect(()=>{b()},[b]),c.useEffect(()=>{var r,a;if(m!=="nomad"||!((r=t==null?void 0:t.nomad)!=null&&r.installed)||(a=t==null?void 0:t.nomad)!=null&&a.running)return;const n=setInterval(()=>{b(!0)},3e3);return()=>clearInterval(n)},[m,(te=t==null?void 0:t.nomad)==null?void 0:te.installed,(re=t==null?void 0:t.nomad)==null?void 0:re.running,b]);const h=(n,r=le(n))=>q(a=>[...a,{message:n,tone:r}].slice(-200)),pe=(n,r)=>r.type==="progress"&&typeof r.progress=="number"?`${n}: ${r.message} [${r.progress}%]`:r.type==="done"?`${n}: ${r.message}`:r.type==="error"?s("setup:taskErrorPrefix",{label:n,message:r.message}):r.message,X=async(n,r)=>{let a=0,o=0,l=s("setup:taskCompleted",{label:r});const d=Date.now()+30*60*1e3;for(;Date.now()<d;){try{const p=await ke(n);o=0;const v=p.events.slice(a);a=p.events.length;for(const k of v){const je=k.type==="done"?"success":k.type==="error"?"error":k.type==="progress"?"progress":le(k.message);h(pe(r,k),je),k.message&&(l=k.message)}if(p.status==="done")return l;if(p.status==="error")throw new Error(l)}catch(p){if(o+=1,o>=5)throw new Error((p==null?void 0:p.message)||s("setup:taskStatusFailed",{label:r}))}const i=Math.min(1e3+a*200,3e3);await new Promise(p=>setTimeout(p,i))}throw new Error(s("setup:taskTimeout",{label:r}))},I=async(n,r,a)=>{N(n),g(""),h(s("setup:installing",{label:r}),"progress");try{const o=await a();let l=o.message||s("setup:taskStarted",{label:r});return o!=null&&o.taskId?l=await X(o.taskId,r):h(`${r}: ${l}`,"success"),b(!0),!0}catch(o){const l=o.message||s("setup:defaultInstallFailed");return h(s("setup:installFailed",{label:r,error:l}),"error"),g(l),!1}finally{N(null)}},Y=async()=>{await I("node","Node.js",()=>_e())},xe=async()=>{await I("docker","Docker",()=>C("docker"))},[Z,ee]=c.useState(!1),be=async()=>{const n=await I("openclaw",s("setup:dockerImageBuild"),()=>C("openclaw"));ee(n),b(!0)},he=async()=>{const n=await I("openclaw-docker",s("setup:dockerImageBuild"),()=>C("openclaw-docker"));ee(n),b(!0)},ge=async()=>{var r;if(await I("nomad","Nomad",()=>C("nomad"))){h(s("setup:configuringNomadSystemd"),"progress"),N("nomad-systemd");try{await C("nomad-systemd"),h(s("setup:nomadServiceStarted"),"success")}catch{try{await ye("nomad"),h(s("setup:nomadStarted"),"success")}catch(a){h(s("setup:nomadStartFailed",{error:a.message}),"error"),g(a.message)}}N(null),h(s("setup:waitingNomad"),"progress");for(let a=0;a<10;a++){await new Promise(l=>setTimeout(l,2e3));const o=await de();if((r=o.nomad)!=null&&r.running){M(o),h(s("setup:nomadReady"),"success");return}}b(!0)}},E=!!((ne=t==null?void 0:t.node)!=null&&ne.installed)&&!((ae=t==null?void 0:t.node)!=null&&ae.needsUpgrade),P=async()=>{var o,l,d,i,p;const n=L.findIndex(v=>v.id===m);if(n>=L.length-1)return;let r=n+1;for(;r<L.length-1;){const v=L[r].id;if(v==="node"&&E){r++;continue}if(v==="docker"&&((o=t==null?void 0:t.docker)!=null&&o.installed)&&((l=t==null?void 0:t.docker)!=null&&l.running)){r++;continue}if(v==="nomad"&&((d=t==null?void 0:t.nomad)!=null&&d.installed)&&((i=t==null?void 0:t.nomad)!=null&&i.running)){r++;continue}if(v==="openclaw"&&((p=t==null?void 0:t.openclaw)!=null&&p.installed)&&(t!=null&&t.dockerImageReady)){r++;continue}break}const a=L[r].id;if(g(""),q([]),a==="done"){j("done"),O(!0);try{await Fe({installNomad:!1,buildDockerImage:!1})}catch(v){g(v.message||s("setup:configWriteFailed"))}finally{O(!1)}}else j(a)},fe=n=>{if(!t)return!1;switch(n){case"check":return E;case"node":return E;case"docker":return t.docker.installed&&t.docker.running;case"nomad":return t.nomad.installed&&t.nomad.running;case"openclaw":return t.openclaw.installed&&(Z||t.dockerImageReady);case"provider":return!0;case"done":return!0;default:return!1}},se=async()=>{if(!f)return;const n=w.find(l=>l.id===f);if(!n)return;const a=n.local===!0&&_.trim()?_.trim():n.baseUrl,o=n.authHeader?"x-api-key":"Authorization";H(!0),g("");try{const{models:l}=await Se(a,S,o);R(l),l.length>0&&$(l[0].id)}catch(l){g(l.message||s("setup:provider.fetchModelsFailed"))}finally{H(!1)}},ve=async()=>{var d;if(!f)return!1;const n=w.find(i=>i.id===f);if(!n)return!1;const r=n.local===!0,a=r&&_.trim()?_.trim():n.baseUrl;if(r&&!a)return g(s("setup:provider.baseUrlRequired",{defaultValue:"Base URL is required"})),!1;const o=y.length>0?y.map(i=>({id:i.id,name:i.name||i.id,contextWindow:128e3})):n.models,l=K||((d=o[0])==null?void 0:d.id)||"";V(!0);try{return await oe({providerId:n.id,baseUrl:a,api:n.api,authHeader:n.authHeader?"x-api-key":void 0,models:o,selectedModelId:l,apiKey:S||""}),!0}catch(i){return g(i.message||s("setup:provider.saveFailed")),!1}finally{V(!1)}};return t?e.jsxs("div",{className:"min-h-screen flex items-center justify-center p-4 bg-background relative overflow-hidden",children:[e.jsx("div",{className:"grid-bg absolute inset-0 pointer-events-none"}),e.jsx("div",{className:"absolute top-1/3 left-1/2 -translate-x-1/2 -translate-y-1/2 w-[600px] h-[400px] rounded-full bg-[#0066FF]/[0.06] blur-[100px] pointer-events-none"}),e.jsx("div",{className:"absolute top-4 right-4 z-20",children:e.jsx(we,{})}),e.jsxs("div",{className:"w-full max-w-lg relative z-10",children:[e.jsxs("div",{className:"text-center mb-8",children:[e.jsx(Ne,{className:"w-48 h-48 mx-auto mb-4 object-contain"}),e.jsx("p",{className:"text-sm text-muted mt-1",children:s("setup:title")})]}),e.jsxs("div",{className:"bg-card border border-[var(--border)] rounded-xl p-6 backdrop-blur-sm",children:[m==="check"&&e.jsxs("div",{children:[e.jsx("h2",{className:"text-base font-medium text-foreground mb-1",children:s("setup:check.title")}),e.jsx("p",{className:"text-sm text-muted mb-4",children:s("setup:check.desc")}),e.jsx("p",{className:"text-xs text-muted mb-1.5 font-medium",children:s("setup:check.requiredComponents")}),e.jsxs("div",{className:"bg-card rounded-md border border-[var(--border)] px-4",children:[e.jsx(U,{dep:t.node,label:"Node.js",required:!0,extra:t.node.needsUpgrade?e.jsx("button",{onClick:Y,disabled:!!x,className:"text-xs bg-amber-500/20 text-amber-400 border border-amber-500/30 rounded px-2 py-0.5 hover:bg-amber-500/30 disabled:opacity-40 transition-colors duration-200",children:s(x==="node"?"setup:check.upgrading":"setup:check.upgrade")}):void 0}),e.jsx(U,{dep:t.docker,label:"Docker",required:!0}),e.jsx(U,{dep:t.nomad,label:"Nomad",required:!0}),e.jsx(U,{dep:t.openclaw,label:"OpenClaw",required:!0})]})]}),m==="node"&&e.jsxs("div",{children:[e.jsx("h2",{className:"text-base font-medium text-foreground mb-1",children:s("setup:node.title")}),e.jsx("p",{className:"text-sm text-muted mb-4",children:s("setup:node.desc")}),E?e.jsx("div",{className:"bg-emerald-500/10 border border-emerald-500/20 text-emerald-400 text-sm rounded-md px-3 py-2.5",children:s("setup:node.ready",{version:t.node.version})}):t.hasSudo?e.jsxs("div",{className:"space-y-3",children:[e.jsx("div",{className:"bg-amber-500/10 border border-amber-500/20 text-amber-400 text-sm rounded-md px-3 py-2.5",children:s("setup:node.currentVersion",{version:t.node.version})}),e.jsx("button",{onClick:Y,disabled:!!x,className:"bg-[#0066FF] text-white rounded-md px-4 py-2 text-sm font-medium hover:bg-[#0066FF]/90 disabled:opacity-40 transition-all duration-200",children:x?e.jsxs("span",{className:"inline-flex items-center gap-2",children:[e.jsx(F,{}),s("setup:node.upgrading")]}):s("setup:node.upgradeBtn")}),e.jsx("p",{className:"text-xs text-muted",children:s("setup:node.sudoRequired")})]}):e.jsxs("div",{className:"space-y-3",children:[e.jsx("div",{className:"bg-amber-500/10 border border-amber-500/20 text-amber-400 text-sm rounded-md px-3 py-2.5",children:s("setup:node.noSudo",{version:t.node.version})}),e.jsxs("div",{className:"bg-card border border-[var(--border)] rounded-md p-3",children:[e.jsx("p",{className:"text-xs text-muted mb-1.5",children:s("setup:node.contactAdmin")}),e.jsx("code",{className:"text-xs text-foreground font-mono block whitespace-pre-wrap",children:"curl -fsSL https://deb.nodesource.com/setup_22.x | sudo -E bash - && sudo apt-get install -y nodejs"})]}),e.jsx("button",{onClick:()=>b(!0),className:"text-xs text-muted hover:text-foreground underline transition-colors duration-200",children:s("setup:node.refreshAfterInstall")})]})]}),m==="docker"&&e.jsxs("div",{children:[e.jsx("h2",{className:"text-base font-medium text-foreground mb-1",children:s("setup:docker.title")}),e.jsx("p",{className:"text-sm text-muted mb-4",children:s("setup:docker.desc")}),t.docker.installed&&t.docker.running?e.jsx("div",{className:"bg-emerald-500/10 border border-emerald-500/20 text-emerald-400 text-sm rounded-md px-3 py-2.5",children:s("setup:docker.running",{version:t.docker.version})}):t.docker.installed&&!t.docker.running?e.jsxs("div",{className:"space-y-3",children:[e.jsx("div",{className:"bg-amber-500/10 border border-amber-500/20 text-amber-400 text-sm rounded-md px-3 py-2.5",children:s("setup:docker.notRunning")}),e.jsx("div",{className:"bg-card border border-[var(--border)] rounded-md p-3",children:e.jsx("code",{className:"text-xs text-foreground font-mono block",children:"sudo systemctl start docker"})}),e.jsx("button",{onClick:()=>b(!0),className:"text-xs text-muted hover:text-foreground underline transition-colors duration-200",children:s("setup:docker.refreshAfterStart")})]}):t.hasSudo?e.jsxs("div",{className:"space-y-3",children:[e.jsx("button",{onClick:xe,disabled:!!x,className:"bg-[#0066FF] text-white rounded-md px-4 py-2 text-sm font-medium hover:bg-[#0066FF]/90 disabled:opacity-40 transition-all duration-200",children:x?e.jsxs("span",{className:"inline-flex items-center gap-2",children:[e.jsx(F,{}),s("setup:docker.installing")]}):s("setup:docker.installBtn")}),e.jsx("p",{className:"text-xs text-muted",children:s("setup:docker.sudoRequired")})]}):e.jsxs("div",{className:"space-y-3",children:[e.jsx("div",{className:"bg-amber-500/10 border border-amber-500/20 text-amber-400 text-sm rounded-md px-3 py-2.5",children:s("setup:docker.noSudo")}),e.jsxs("div",{className:"bg-card border border-[var(--border)] rounded-md p-3",children:[e.jsx("p",{className:"text-xs text-muted mb-1.5",children:s("setup:docker.contactAdmin")}),e.jsx("code",{className:"text-xs text-foreground font-mono block",children:"curl -fsSL https://get.docker.com | sh"})]}),e.jsx("button",{onClick:()=>b(!0),className:"text-xs text-muted hover:text-foreground underline transition-colors duration-200",children:s("setup:docker.refreshAfterInstall")})]})]}),m==="nomad"&&e.jsxs("div",{children:[e.jsx("h2",{className:"text-base font-medium text-foreground mb-1",children:s("setup:nomad.title")}),e.jsx("p",{className:"text-sm text-muted mb-4",children:s("setup:nomad.desc")}),t.nomad.installed&&t.nomad.running?e.jsx("div",{className:"bg-emerald-500/10 border border-emerald-500/20 text-emerald-400 text-sm rounded-md px-3 py-2.5",children:s("setup:nomad.running",{version:t.nomad.version})}):t.nomad.installed?e.jsx("div",{className:"space-y-3",children:e.jsxs("div",{className:"flex items-center gap-2 bg-amber-500/10 border border-amber-500/20 text-amber-400 text-sm rounded-md px-3 py-2.5",children:[e.jsx(F,{}),e.jsx("span",{children:s("setup:nomad.starting")})]})}):e.jsx("button",{onClick:ge,disabled:!!x,className:"bg-[#0066FF] text-white rounded-md px-4 py-2 text-sm font-medium hover:bg-[#0066FF]/90 disabled:opacity-40 transition-all duration-200",children:x?e.jsxs("span",{className:"inline-flex items-center gap-2",children:[e.jsx(F,{}),s("setup:nomad.installing")]}):s("setup:nomad.installBtn")})]}),m==="openclaw"&&e.jsxs("div",{children:[e.jsx("h2",{className:"text-base font-medium text-foreground mb-1",children:s("setup:openclaw.title")}),e.jsx("p",{className:"text-sm text-muted mb-4",children:s("setup:openclaw.desc")}),t.openclaw.installed?e.jsxs("div",{className:"space-y-3",children:[e.jsx("div",{className:"bg-emerald-500/10 border border-emerald-500/20 text-emerald-400 text-sm rounded-md px-3 py-2.5",children:s("setup:openclaw.installed",{version:t.openclaw.version})}),x==="openclaw-docker"?e.jsxs("div",{className:"flex items-center gap-2 bg-amber-500/10 border border-amber-500/20 text-amber-400 text-sm rounded-md px-3 py-2.5",children:[e.jsx(F,{}),e.jsx("span",{children:s("setup:openclaw.buildingImage")})]}):!Z&&!t.dockerImageReady?e.jsx("button",{onClick:he,disabled:!!x,className:"bg-[#0066FF] text-white rounded-md px-4 py-2 text-sm font-medium hover:bg-[#0066FF]/90 disabled:opacity-40 transition-all duration-200",children:s("setup:openclaw.buildImageBtn")}):null]}):e.jsxs("div",{className:"space-y-3",children:[e.jsx("button",{onClick:be,disabled:!!x,className:"bg-[#0066FF] text-white rounded-md px-4 py-2 text-sm font-medium hover:bg-[#0066FF]/90 disabled:opacity-40 transition-all duration-200",children:x?e.jsxs("span",{className:"inline-flex items-center gap-2",children:[e.jsx(F,{}),s("setup:openclaw.installing")]}):s("setup:openclaw.installBtn")}),e.jsx("p",{className:"text-xs text-muted",children:s("setup:openclaw.npmHint")})]})]}),m==="done"&&e.jsx("div",{className:"text-center py-4",children:z?e.jsxs(e.Fragment,{children:[e.jsx("div",{className:"w-12 h-12 mx-auto mb-3 flex items-center justify-center",children:e.jsx("div",{className:"w-8 h-8 border-2 border-white/10 border-t-[#0066FF] rounded-full animate-spin"})}),e.jsx("h2",{className:"text-base font-medium text-foreground mb-1",children:s("setup:done.finalizing")}),e.jsx("p",{className:"text-sm text-muted",children:s("setup:done.finalizingDesc")})]}):e.jsxs(e.Fragment,{children:[e.jsx("div",{className:"w-12 h-12 mx-auto mb-3 rounded-full bg-emerald-500/10 border border-emerald-500/20 flex items-center justify-center",children:e.jsx("svg",{className:"w-6 h-6 text-emerald-400",fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",children:e.jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M5 13l4 4L19 7"})})}),e.jsx("h2",{className:"text-base font-medium text-foreground mb-1",children:s("setup:done.complete")}),e.jsx("p",{className:"text-sm text-muted",children:s("setup:done.completeDesc")})]})}),m==="provider"&&(()=>{var l;const n=w.find(d=>d.id===f),r=[...new Set(w.map(d=>d.group))],a=(n==null?void 0:n.local)===!0,o=y.length>0?y.map(d=>({id:d.id,label:d.name||d.id})):((n==null?void 0:n.models)||[]).map(d=>({id:d.id,label:`${d.name} (${Math.round(d.contextWindow/1e3)}K)`}));return e.jsxs("div",{children:[e.jsx("h2",{className:"text-base font-medium text-foreground mb-1",children:s("setup:provider.title")}),e.jsx("p",{className:"text-sm text-muted mb-4",children:s("setup:provider.desc")}),e.jsxs("div",{className:"space-y-4",children:[e.jsxs("div",{children:[e.jsx("label",{className:"block text-sm font-medium text-muted mb-1.5",children:s("setup:provider.label")}),e.jsxs("select",{value:f,onChange:d=>{ce(d.target.value),$(""),R([]);const i=w.find(p=>p.id===d.target.value);G((i==null?void 0:i.baseUrl)||"")},className:"w-full bg-background border border-[var(--border)] rounded-md px-3 py-2 text-sm text-foreground focus:outline-none focus:ring-1 focus:ring-[#0066FF]/60",children:[e.jsx("option",{value:"",children:s("setup:provider.placeholder")}),r.map(d=>e.jsx("optgroup",{label:s(`instance:configForm.providerGroup.${d}`,{defaultValue:d}),children:w.filter(i=>i.group===d).map(i=>e.jsx("option",{value:i.id,children:s(`instance:configForm.providerLabel.${i.id}`,{defaultValue:i.label})},i.id))},d))]})]}),f&&a&&e.jsxs("div",{children:[e.jsx("label",{className:"block text-sm font-medium text-muted mb-1.5",children:s("setup:provider.baseUrl")}),e.jsxs("div",{className:"flex gap-2",children:[e.jsx("input",{value:_,onChange:d=>{G(d.target.value),R([])},className:"flex-1 bg-[var(--input-bg)] border border-[var(--border)] rounded-md px-3 py-2 text-sm text-foreground font-mono focus:outline-none focus:ring-1 focus:ring-[#0066FF]/60"}),e.jsx("button",{type:"button",onClick:se,disabled:D,className:"px-3 py-1.5 text-xs border border-[var(--border)] rounded-md hover:bg-[var(--input-bg)] disabled:opacity-40 transition-all whitespace-nowrap",children:s(D?"setup:provider.fetchingModels":"setup:provider.fetchModels")})]})]}),f&&!a&&e.jsxs("div",{children:[e.jsx("label",{className:"block text-sm font-medium text-muted mb-1.5",children:s("setup:provider.apiKey")}),e.jsxs("div",{className:"flex gap-2",children:[e.jsxs("div",{className:"relative flex-1",children:[e.jsx("input",{type:B?"text":"password",value:S,onChange:d=>{ue(d.target.value),R([])},placeholder:s("setup:provider.apiKeyPlaceholder"),className:"w-full bg-[var(--input-bg)] border border-[var(--border)] rounded-md px-3 py-2 pr-9 text-sm text-foreground font-mono placeholder-[var(--muted)] focus:outline-none focus:ring-1 focus:ring-[#0066FF]/60"}),e.jsx("button",{type:"button",onClick:()=>me(!B),className:"absolute right-2.5 top-1/2 -translate-y-1/2 text-muted hover:text-foreground",children:e.jsx("svg",{className:"w-3.5 h-3.5",fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",children:B?e.jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M13.875 18.825A10.05 10.05 0 0112 19c-4.478 0-8.268-2.943-9.543-7a9.97 9.97 0 011.563-3.029m5.858.908a3 3 0 114.243 4.243M9.878 9.878l4.242 4.242M9.878 9.878L3 3m6.878 6.878L21 21"}):e.jsxs(e.Fragment,{children:[e.jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M15 12a3 3 0 11-6 0 3 3 0 016 0z"}),e.jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M2.458 12C3.732 7.943 7.523 5 12 5c4.478 0 8.268 2.943 9.542 7-1.274 4.057-5.064 7-9.542 7-4.477 0-8.268-2.943-9.542-7z"})]})})})]}),e.jsx("button",{type:"button",onClick:se,disabled:D||!S.trim(),className:"px-3 py-1.5 text-xs border border-[var(--border)] rounded-md hover:bg-[var(--input-bg)] disabled:opacity-40 transition-all whitespace-nowrap",children:s(D?"setup:provider.fetchingModels":"setup:provider.fetchModels")})]})]}),n&&o.length>0&&e.jsxs("div",{children:[e.jsxs("label",{className:"block text-sm font-medium text-muted mb-1.5",children:[s("setup:provider.defaultModel"),y.length>0&&e.jsxs("span",{className:"ml-1.5 text-emerald-400 text-xs",children:["(",y.length," ",s("setup:provider.liveModels"),")"]})]}),e.jsx("select",{value:K||((l=o[0])==null?void 0:l.id)||"",onChange:d=>$(d.target.value),className:"w-full bg-background border border-[var(--border)] rounded-md px-3 py-2 text-sm text-foreground focus:outline-none focus:ring-1 focus:ring-[#0066FF]/60",children:o.map(d=>e.jsx("option",{value:d.id,children:d.label},d.id))})]})]})]})})(),A.length>0&&m!=="done"&&e.jsxs("div",{className:"mt-4 rounded-lg border border-[var(--border)] bg-[linear-gradient(180deg,rgba(2,6,23,0.96),rgba(15,23,42,0.92))] p-3 shadow-[inset_0_1px_0_rgba(255,255,255,0.04)] max-h-40 overflow-y-auto",children:[A.map((n,r)=>{const a=Ce(n.tone);return e.jsxs("div",{className:"flex items-start gap-2 py-0.5",children:[e.jsx("span",{className:`mt-1.5 h-1.5 w-1.5 shrink-0 rounded-full ${a.dot}`}),e.jsx("div",{className:`min-w-0 whitespace-pre-wrap break-words text-xs font-mono leading-5 ${a.text}`,children:n.message})]},r)}),e.jsx("div",{className:"pointer-events-none sticky bottom-0 h-4 bg-gradient-to-t from-slate-950/85 to-transparent"})]}),T&&e.jsx("div",{className:"mt-4 bg-red-500/10 border border-red-500/20 text-red-400 text-sm rounded-md px-3 py-2.5",children:T})]}),e.jsx("div",{className:"flex justify-between mt-6",children:m==="provider"?(()=>{var a;const n=((a=w.find(o=>o.id===f))==null?void 0:a.local)===!0,r=f&&(n||S.trim());return e.jsxs(e.Fragment,{children:[e.jsx("button",{onClick:async()=>{await oe({skipped:!0}).catch(()=>{}),P()},className:"bg-[var(--card)] border border-[var(--border)] text-foreground rounded-md px-6 py-2 text-sm font-medium hover:bg-[var(--card-hover)] transition-all duration-200",children:s("setup:provider.skip")}),e.jsx("button",{onClick:async()=>{await ve()&&P()},disabled:!r||W,className:"bg-[#0066FF] text-white rounded-md px-6 py-2 text-sm font-medium hover:bg-[#0066FF]/90 disabled:opacity-40 disabled:cursor-not-allowed transition-all duration-200 shadow-[0_0_20px_rgba(0,102,255,0.3)]",children:s(W?"setup:provider.saving":"setup:provider.saveAndContinue")})]})})():m!=="done"?e.jsxs(e.Fragment,{children:[e.jsx("div",{}),e.jsx("button",{onClick:P,disabled:!fe(m)||!!x,className:"bg-[#0066FF] text-white rounded-md px-6 py-2 text-sm font-medium hover:bg-[#0066FF]/90 disabled:opacity-40 disabled:cursor-not-allowed transition-all duration-200 shadow-[0_0_20px_rgba(0,102,255,0.3)] hover:shadow-[0_0_28px_rgba(0,102,255,0.45)]",children:s("setup:nav.next")})]}):e.jsx("button",{onClick:T?()=>P():u,disabled:z,className:"w-full bg-[#0066FF] text-white rounded-md py-2.5 text-sm font-medium hover:bg-[#0066FF]/90 disabled:opacity-40 disabled:cursor-not-allowed transition-all duration-200 shadow-[0_0_20px_rgba(0,102,255,0.3)]",children:s(T?"setup:nav.retry":"setup:nav.enterPanel")})})]})]}):e.jsx("div",{className:"min-h-screen flex items-center justify-center bg-background",children:e.jsx("div",{className:"w-5 h-5 border-2 border-[var(--border)] border-t-foreground rounded-full animate-spin"})})}export{De as default};
@@ -1 +0,0 @@
1
- @import"https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=Geist:wght@400;500;600;700&family=Geist+Mono:wght@400;500&display=swap";*,:before,:after{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }::backdrop{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }*,:before,:after{box-sizing:border-box;border-width:0;border-style:solid;border-color:#e5e7eb}:before,:after{--tw-content: ""}html,:host{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;font-family:Geist,Inter,-apple-system,BlinkMacSystemFont,PingFang SC,Microsoft YaHei,sans-serif;font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent}body{margin:0;line-height:inherit}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:Geist Mono,JetBrains Mono,SF Mono,Fira Code,ui-monospace,monospace;font-feature-settings:normal;font-variation-settings:normal;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-family:inherit;font-feature-settings:inherit;font-variation-settings:inherit;font-size:100%;font-weight:inherit;line-height:inherit;letter-spacing:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}button,input:where([type=button]),input:where([type=reset]),input:where([type=submit]){-webkit-appearance:button;background-color:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dl,dd,h1,h2,h3,h4,h5,h6,hr,figure,p,pre{margin:0}fieldset{margin:0;padding:0}legend{padding:0}ol,ul,menu{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{opacity:1;color:#9ca3af}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}button,[role=button]{cursor:pointer}:disabled{cursor:default}img,svg,video,canvas,audio,iframe,embed,object{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]:where(:not([hidden=until-found])){display:none}:root{--background: #F8FAFC;--foreground: #0F172A;--muted: #64748B;--card: rgba(0,0,0,.03);--card-hover: rgba(0,0,0,.055);--border: rgba(0,0,0,.09);--border-hover: rgba(0, 102, 255, .35);--primary: #0066FF;--primary-hover: #0052CC;--accent: #00D4AA;--sidebar-bg: #F1F5F9;--input-bg: rgba(0,0,0,.04)}@media (prefers-color-scheme: dark){:root{color-scheme:dark;--background: #0A0A0F;--foreground: #FAFAFA;--muted: rgba(255,255,255,.5);--card: rgba(255,255,255,.04);--card-hover: rgba(255,255,255,.07);--border: rgba(255,255,255,.08);--border-hover: rgba(0, 102, 255, .5);--primary: #0066FF;--primary-hover: #3385FF;--accent: #00D4AA;--sidebar-bg: rgba(255,255,255,.025);--input-bg: rgba(255,255,255,.06)}}html{font-family:Geist,Inter,-apple-system,BlinkMacSystemFont,PingFang SC,Microsoft YaHei,sans-serif;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}body,select,select option,select optgroup{background-color:var(--background);color:var(--foreground)}.font-mono{font-family:Geist Mono,JetBrains Mono,SF Mono,Fira Code,ui-monospace,monospace}.container{width:100%}@media (min-width: 640px){.container{max-width:640px}}@media (min-width: 768px){.container{max-width:768px}}@media (min-width: 1024px){.container{max-width:1024px}}@media (min-width: 1280px){.container{max-width:1280px}}@media (min-width: 1536px){.container{max-width:1536px}}.pointer-events-none{pointer-events:none}.pointer-events-auto{pointer-events:auto}.visible{visibility:visible}.static{position:static}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.sticky{position:sticky}.inset-0{top:0;right:0;bottom:0;left:0}.-right-0\.5{right:-.125rem}.-top-0\.5{top:-.125rem}.bottom-0{bottom:0}.left-0{left:0}.left-1\/2{left:50%}.left-3{left:.75rem}.left-\[18px\]{left:18px}.left-\[3px\]{left:3px}.right-0{right:0}.right-2\.5{right:.625rem}.right-3{right:.75rem}.right-4{right:1rem}.top-0{top:0}.top-1\/2{top:50%}.top-1\/3{top:33.333333%}.top-1\/4{top:25%}.top-3{top:.75rem}.top-4{top:1rem}.top-\[3px\]{top:3px}.top-full{top:100%}.z-10{z-index:10}.z-20{z-index:20}.z-40{z-index:40}.z-50{z-index:50}.col-span-2{grid-column:span 2 / span 2}.-mx-6{margin-left:-1.5rem;margin-right:-1.5rem}.mx-2{margin-left:.5rem;margin-right:.5rem}.mx-3{margin-left:.75rem;margin-right:.75rem}.mx-4{margin-left:1rem;margin-right:1rem}.mx-auto{margin-left:auto;margin-right:auto}.my-0\.5{margin-top:.125rem;margin-bottom:.125rem}.my-1{margin-top:.25rem;margin-bottom:.25rem}.mb-1{margin-bottom:.25rem}.mb-1\.5{margin-bottom:.375rem}.mb-2{margin-bottom:.5rem}.mb-3{margin-bottom:.75rem}.mb-4{margin-bottom:1rem}.mb-5{margin-bottom:1.25rem}.mb-6{margin-bottom:1.5rem}.mb-8{margin-bottom:2rem}.ml-1{margin-left:.25rem}.ml-1\.5{margin-left:.375rem}.ml-2{margin-left:.5rem}.ml-3{margin-left:.75rem}.ml-auto{margin-left:auto}.mr-1{margin-right:.25rem}.mt-0\.5{margin-top:.125rem}.mt-1{margin-top:.25rem}.mt-1\.5{margin-top:.375rem}.mt-2{margin-top:.5rem}.mt-3{margin-top:.75rem}.mt-4{margin-top:1rem}.mt-6{margin-top:1.5rem}.block{display:block}.inline-block{display:inline-block}.flex{display:flex}.inline-flex{display:inline-flex}.table{display:table}.grid{display:grid}.hidden{display:none}.h-1\.5{height:.375rem}.h-10{height:2.5rem}.h-11{height:2.75rem}.h-12{height:3rem}.h-16{height:4rem}.h-2{height:.5rem}.h-20{height:5rem}.h-3{height:.75rem}.h-3\.5{height:.875rem}.h-4{height:1rem}.h-40{height:10rem}.h-48{height:12rem}.h-5{height:1.25rem}.h-6{height:1.5rem}.h-60{height:15rem}.h-8{height:2rem}.h-\[300px\]{height:300px}.h-\[400px\]{height:400px}.h-\[600px\]{height:600px}.h-full{height:100%}.h-screen{height:100vh}.max-h-20{max-height:5rem}.max-h-40{max-height:10rem}.max-h-\[480px\]{max-height:480px}.max-h-\[70vh\]{max-height:70vh}.max-h-\[80vh\]{max-height:80vh}.min-h-0{min-height:0px}.min-h-\[400px\]{min-height:400px}.min-h-screen{min-height:100vh}.w-1\.5{width:.375rem}.w-12{width:3rem}.w-16{width:4rem}.w-2{width:.5rem}.w-20{width:5rem}.w-3{width:.75rem}.w-3\.5{width:.875rem}.w-4{width:1rem}.w-40{width:10rem}.w-48{width:12rem}.w-5{width:1.25rem}.w-52{width:13rem}.w-6{width:1.5rem}.w-60{width:15rem}.w-8{width:2rem}.w-80{width:20rem}.w-9{width:2.25rem}.w-\[500px\]{width:500px}.w-\[600px\]{width:600px}.w-full{width:100%}.min-w-0{min-width:0px}.min-w-\[200px\]{min-width:200px}.max-w-2xl{max-width:42rem}.max-w-4xl{max-width:56rem}.max-w-5xl{max-width:64rem}.max-w-lg{max-width:32rem}.max-w-md{max-width:28rem}.max-w-sm{max-width:24rem}.max-w-xs{max-width:20rem}.flex-1{flex:1 1 0%}.flex-shrink-0,.shrink-0{flex-shrink:0}.-translate-x-1\/2{--tw-translate-x: -50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.-translate-y-1\/2{--tw-translate-y: -50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-x-0\.5{--tw-translate-x: .125rem;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-x-4{--tw-translate-x: 1rem;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.rotate-180{--tw-rotate: 180deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}@keyframes pulse{50%{opacity:.5}}.animate-pulse{animation:pulse 2s cubic-bezier(.4,0,.6,1) infinite}@keyframes spin{to{transform:rotate(360deg)}}.animate-spin{animation:spin 1s linear infinite}.cursor-pointer{cursor:pointer}.cursor-text{cursor:text}.resize-none{resize:none}.resize-y{resize:vertical}.list-inside{list-style-position:inside}.list-disc{list-style-type:disc}.appearance-none{-webkit-appearance:none;-moz-appearance:none;appearance:none}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-start{align-items:flex-start}.items-center{align-items:center}.justify-end{justify-content:flex-end}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.gap-0\.5{gap:.125rem}.gap-1{gap:.25rem}.gap-1\.5{gap:.375rem}.gap-2{gap:.5rem}.gap-2\.5{gap:.625rem}.gap-3{gap:.75rem}.gap-4{gap:1rem}.gap-x-1{-moz-column-gap:.25rem;column-gap:.25rem}.gap-y-0\.5{row-gap:.125rem}.space-y-0\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.125rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.125rem * var(--tw-space-y-reverse))}.space-y-1>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.25rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.25rem * var(--tw-space-y-reverse))}.space-y-1\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.375rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.375rem * var(--tw-space-y-reverse))}.space-y-2>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.5rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.5rem * var(--tw-space-y-reverse))}.space-y-3>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.75rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.75rem * var(--tw-space-y-reverse))}.space-y-4>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(1rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1rem * var(--tw-space-y-reverse))}.divide-y>:not([hidden])~:not([hidden]){--tw-divide-y-reverse: 0;border-top-width:calc(1px * calc(1 - var(--tw-divide-y-reverse)));border-bottom-width:calc(1px * var(--tw-divide-y-reverse))}.divide-\[var\(--border\)\]>:not([hidden])~:not([hidden]){border-color:var(--border)}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.whitespace-nowrap{white-space:nowrap}.whitespace-pre-wrap{white-space:pre-wrap}.break-words{overflow-wrap:break-word}.break-all{word-break:break-all}.rounded{border-radius:.25rem}.rounded-\[22px\]{border-radius:22px}.rounded-full{border-radius:9999px}.rounded-lg{border-radius:.5rem}.rounded-md{border-radius:.375rem}.rounded-xl{border-radius:.75rem}.border{border-width:1px}.border-2{border-width:2px}.border-b{border-bottom-width:1px}.border-b-2{border-bottom-width:2px}.border-l-2{border-left-width:2px}.border-r{border-right-width:1px}.border-t{border-top-width:1px}.border-dashed{border-style:dashed}.border-\[\#0066FF\]{--tw-border-opacity: 1;border-color:rgb(0 102 255 / var(--tw-border-opacity, 1))}.border-\[\#0066FF\]\/20{border-color:#06f3}.border-\[\#0066FF\]\/30{border-color:#0066ff4d}.border-\[\#0066FF\]\/40{border-color:#06f6}.border-\[\#0066FF\]\/50{border-color:#0066ff80}.border-\[\#07C160\]\/30{border-color:#07c1604d}.border-\[\#3370FF\]\/30{border-color:#3370ff4d}.border-\[var\(--border\)\]{border-color:var(--border)}.border-\[var\(--primary\)\]{border-color:var(--primary)}.border-amber-500\/20{border-color:#f59e0b33}.border-amber-500\/30{border-color:#f59e0b4d}.border-emerald-500\/20{border-color:#10b98133}.border-emerald-500\/30{border-color:#10b9814d}.border-red-500\/20{border-color:#ef444433}.border-red-500\/30{border-color:#ef44444d}.border-sky-500\/30{border-color:#0ea5e94d}.border-transparent{border-color:transparent}.border-white\/10{border-color:#ffffff1a}.border-white\/30{border-color:#ffffff4d}.border-white\/40{border-color:#fff6}.border-l-\[\#0066FF\]{--tw-border-opacity: 1;border-left-color:rgb(0 102 255 / var(--tw-border-opacity, 1))}.border-l-\[\#00D4AA\]{--tw-border-opacity: 1;border-left-color:rgb(0 212 170 / var(--tw-border-opacity, 1))}.border-l-red-400{--tw-border-opacity: 1;border-left-color:rgb(248 113 113 / var(--tw-border-opacity, 1))}.border-t-\[\#0066FF\]{--tw-border-opacity: 1;border-top-color:rgb(0 102 255 / var(--tw-border-opacity, 1))}.border-t-\[\#07C160\]{--tw-border-opacity: 1;border-top-color:rgb(7 193 96 / var(--tw-border-opacity, 1))}.border-t-\[\#3370FF\]{--tw-border-opacity: 1;border-top-color:rgb(51 112 255 / var(--tw-border-opacity, 1))}.border-t-foreground{border-top-color:var(--foreground)}.border-t-muted{border-top-color:var(--muted)}.border-t-white{--tw-border-opacity: 1;border-top-color:rgb(255 255 255 / var(--tw-border-opacity, 1))}.bg-\[\#0066FF\]{--tw-bg-opacity: 1;background-color:rgb(0 102 255 / var(--tw-bg-opacity, 1))}.bg-\[\#0066FF\]\/10{background-color:#0066ff1a}.bg-\[\#0066FF\]\/15{background-color:#0066ff26}.bg-\[\#0066FF\]\/5{background-color:#0066ff0d}.bg-\[\#0066FF\]\/\[0\.06\]{background-color:#0066ff0f}.bg-\[\#0066FF\]\/\[0\.07\]{background-color:#0066ff12}.bg-\[\#00D4AA\]{--tw-bg-opacity: 1;background-color:rgb(0 212 170 / var(--tw-bg-opacity, 1))}.bg-\[\#07C160\]{--tw-bg-opacity: 1;background-color:rgb(7 193 96 / var(--tw-bg-opacity, 1))}.bg-\[\#07C160\]\/5{background-color:#07c1600d}.bg-\[\#3370FF\]{--tw-bg-opacity: 1;background-color:rgb(51 112 255 / var(--tw-bg-opacity, 1))}.bg-\[\#3370FF\]\/5{background-color:#3370ff0d}.bg-\[var\(--bg\)\]{background-color:var(--bg)}.bg-\[var\(--border\)\]{background-color:var(--border)}.bg-\[var\(--card\)\]{background-color:var(--card)}.bg-\[var\(--card-hover\)\]{background-color:var(--card-hover)}.bg-\[var\(--input-bg\)\]{background-color:var(--input-bg)}.bg-\[var\(--muted\)\]{background-color:var(--muted)}.bg-amber-400{--tw-bg-opacity: 1;background-color:rgb(251 191 36 / var(--tw-bg-opacity, 1))}.bg-amber-500{--tw-bg-opacity: 1;background-color:rgb(245 158 11 / var(--tw-bg-opacity, 1))}.bg-amber-500\/10{background-color:#f59e0b1a}.bg-amber-500\/15{background-color:#f59e0b26}.bg-amber-500\/20{background-color:#f59e0b33}.bg-background{background-color:var(--background)}.bg-black\/60{background-color:#0009}.bg-card{background-color:var(--card)}.bg-emerald-400{--tw-bg-opacity: 1;background-color:rgb(52 211 153 / var(--tw-bg-opacity, 1))}.bg-emerald-500{--tw-bg-opacity: 1;background-color:rgb(16 185 129 / var(--tw-bg-opacity, 1))}.bg-emerald-500\/10{background-color:#10b9811a}.bg-emerald-500\/15{background-color:#10b98126}.bg-green-400{--tw-bg-opacity: 1;background-color:rgb(74 222 128 / var(--tw-bg-opacity, 1))}.bg-green-500{--tw-bg-opacity: 1;background-color:rgb(34 197 94 / var(--tw-bg-opacity, 1))}.bg-red-400{--tw-bg-opacity: 1;background-color:rgb(248 113 113 / var(--tw-bg-opacity, 1))}.bg-red-500{--tw-bg-opacity: 1;background-color:rgb(239 68 68 / var(--tw-bg-opacity, 1))}.bg-red-500\/10{background-color:#ef44441a}.bg-red-500\/15{background-color:#ef444426}.bg-red-500\/5{background-color:#ef44440d}.bg-red-600{--tw-bg-opacity: 1;background-color:rgb(220 38 38 / var(--tw-bg-opacity, 1))}.bg-red-950\/20{background-color:#450a0a33}.bg-sky-400{--tw-bg-opacity: 1;background-color:rgb(56 189 248 / var(--tw-bg-opacity, 1))}.bg-sky-500{--tw-bg-opacity: 1;background-color:rgb(14 165 233 / var(--tw-bg-opacity, 1))}.bg-sky-500\/10{background-color:#0ea5e91a}.bg-slate-500{--tw-bg-opacity: 1;background-color:rgb(100 116 139 / var(--tw-bg-opacity, 1))}.bg-transparent{background-color:transparent}.bg-white{--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1))}.bg-\[linear-gradient\(180deg\,rgba\(2\,6\,23\,0\.96\)\,rgba\(15\,23\,42\,0\.92\)\)\]{background-image:linear-gradient(180deg,#020617f5,#0f172aeb)}.bg-\[radial-gradient\(circle\,rgba\(0\,102\,255\,0\.08\)_0\%\,transparent_70\%\)\]{background-image:radial-gradient(circle,rgba(0,102,255,.08) 0%,transparent 70%)}.bg-gradient-to-t{background-image:linear-gradient(to top,var(--tw-gradient-stops))}.from-slate-950\/85{--tw-gradient-from: rgb(2 6 23 / .85) var(--tw-gradient-from-position);--tw-gradient-to: rgb(2 6 23 / 0) var(--tw-gradient-to-position);--tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to)}.to-transparent{--tw-gradient-to: transparent var(--tw-gradient-to-position)}.object-contain{-o-object-fit:contain;object-fit:contain}.p-1{padding:.25rem}.p-1\.5{padding:.375rem}.p-2{padding:.5rem}.p-3{padding:.75rem}.p-4{padding:1rem}.p-5{padding:1.25rem}.p-6{padding:1.5rem}.px-1{padding-left:.25rem;padding-right:.25rem}.px-1\.5{padding-left:.375rem;padding-right:.375rem}.px-2{padding-left:.5rem;padding-right:.5rem}.px-2\.5{padding-left:.625rem;padding-right:.625rem}.px-3{padding-left:.75rem;padding-right:.75rem}.px-4{padding-left:1rem;padding-right:1rem}.px-6{padding-left:1.5rem;padding-right:1.5rem}.py-0\.5{padding-top:.125rem;padding-bottom:.125rem}.py-1{padding-top:.25rem;padding-bottom:.25rem}.py-1\.5{padding-top:.375rem;padding-bottom:.375rem}.py-12{padding-top:3rem;padding-bottom:3rem}.py-2{padding-top:.5rem;padding-bottom:.5rem}.py-2\.5{padding-top:.625rem;padding-bottom:.625rem}.py-3{padding-top:.75rem;padding-bottom:.75rem}.py-4{padding-top:1rem;padding-bottom:1rem}.py-5{padding-top:1.25rem;padding-bottom:1.25rem}.py-6{padding-top:1.5rem;padding-bottom:1.5rem}.py-8{padding-top:2rem;padding-bottom:2rem}.pb-0\.5{padding-bottom:.125rem}.pb-4{padding-bottom:1rem}.pl-9{padding-left:2.25rem}.pl-\[6px\]{padding-left:6px}.pr-10{padding-right:2.5rem}.pr-3{padding-right:.75rem}.pr-9{padding-right:2.25rem}.pt-1{padding-top:.25rem}.pt-1\.5{padding-top:.375rem}.pt-2{padding-top:.5rem}.pt-3{padding-top:.75rem}.pt-4{padding-top:1rem}.text-left{text-align:left}.text-center{text-align:center}.text-right{text-align:right}.font-mono{font-family:Geist Mono,JetBrains Mono,SF Mono,Fira Code,ui-monospace,monospace}.text-2xl{font-size:1.5rem;line-height:2rem}.text-3xl{font-size:1.875rem;line-height:2.25rem}.text-4xl{font-size:2.25rem;line-height:2.5rem}.text-\[10px\]{font-size:10px}.text-\[11px\]{font-size:11px}.text-\[13px\]{font-size:13px}.text-\[9px\]{font-size:9px}.text-base{font-size:1rem;line-height:1.5rem}.text-lg{font-size:1.125rem;line-height:1.75rem}.text-sm{font-size:.875rem;line-height:1.25rem}.text-xs{font-size:.75rem;line-height:1rem}.font-medium{font-weight:500}.font-normal{font-weight:400}.font-semibold{font-weight:600}.uppercase{text-transform:uppercase}.tabular-nums{--tw-numeric-spacing: tabular-nums;font-variant-numeric:var(--tw-ordinal) var(--tw-slashed-zero) var(--tw-numeric-figure) var(--tw-numeric-spacing) var(--tw-numeric-fraction)}.leading-5{line-height:1.25rem}.leading-none{line-height:1}.leading-tight{line-height:1.25}.tracking-wider{letter-spacing:.05em}.tracking-widest{letter-spacing:.1em}.text-\[\#0066FF\]{--tw-text-opacity: 1;color:rgb(0 102 255 / var(--tw-text-opacity, 1))}.text-\[\#0066FF\]\/80{color:#06fc}.text-\[\#0066FF\]\/90{color:#0066ffe6}.text-\[\#00D4AA\]{--tw-text-opacity: 1;color:rgb(0 212 170 / var(--tw-text-opacity, 1))}.text-\[\#07C160\]{--tw-text-opacity: 1;color:rgb(7 193 96 / var(--tw-text-opacity, 1))}.text-\[\#3370FF\]{--tw-text-opacity: 1;color:rgb(51 112 255 / var(--tw-text-opacity, 1))}.text-\[var\(--muted\)\]{color:var(--muted)}.text-amber-200{--tw-text-opacity: 1;color:rgb(253 230 138 / var(--tw-text-opacity, 1))}.text-amber-300{--tw-text-opacity: 1;color:rgb(252 211 77 / var(--tw-text-opacity, 1))}.text-amber-300\/80{color:#fcd34dcc}.text-amber-400{--tw-text-opacity: 1;color:rgb(251 191 36 / var(--tw-text-opacity, 1))}.text-amber-400\/60{color:#fbbf2499}.text-amber-400\/90{color:#fbbf24e6}.text-amber-500{--tw-text-opacity: 1;color:rgb(245 158 11 / var(--tw-text-opacity, 1))}.text-black{--tw-text-opacity: 1;color:rgb(0 0 0 / var(--tw-text-opacity, 1))}.text-current{color:currentColor}.text-emerald-100{--tw-text-opacity: 1;color:rgb(209 250 229 / var(--tw-text-opacity, 1))}.text-emerald-200{--tw-text-opacity: 1;color:rgb(167 243 208 / var(--tw-text-opacity, 1))}.text-emerald-200\/80{color:#a7f3d0cc}.text-emerald-400{--tw-text-opacity: 1;color:rgb(52 211 153 / var(--tw-text-opacity, 1))}.text-foreground{color:var(--foreground)}.text-green-400{--tw-text-opacity: 1;color:rgb(74 222 128 / var(--tw-text-opacity, 1))}.text-green-500{--tw-text-opacity: 1;color:rgb(34 197 94 / var(--tw-text-opacity, 1))}.text-muted{color:var(--muted)}.text-red-100{--tw-text-opacity: 1;color:rgb(254 226 226 / var(--tw-text-opacity, 1))}.text-red-200{--tw-text-opacity: 1;color:rgb(254 202 202 / var(--tw-text-opacity, 1))}.text-red-200\/80{color:#fecacacc}.text-red-400{--tw-text-opacity: 1;color:rgb(248 113 113 / var(--tw-text-opacity, 1))}.text-sky-100{--tw-text-opacity: 1;color:rgb(224 242 254 / var(--tw-text-opacity, 1))}.text-sky-200{--tw-text-opacity: 1;color:rgb(186 230 253 / var(--tw-text-opacity, 1))}.text-sky-200\/80{color:#bae6fdcc}.text-sky-400{--tw-text-opacity: 1;color:rgb(56 189 248 / var(--tw-text-opacity, 1))}.text-slate-200\/90{color:#e2e8f0e6}.text-white{--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity, 1))}.underline{text-decoration-line:underline}.no-underline{text-decoration-line:none}.decoration-current{text-decoration-color:currentColor}.underline-offset-2{text-underline-offset:2px}.placeholder-\[var\(--muted\)\]::-moz-placeholder{color:var(--muted)}.placeholder-\[var\(--muted\)\]::placeholder{color:var(--muted)}.opacity-0{opacity:0}.opacity-100{opacity:1}.opacity-30{opacity:.3}.opacity-40{opacity:.4}.opacity-50{opacity:.5}.opacity-60{opacity:.6}.opacity-70{opacity:.7}.opacity-80{opacity:.8}.shadow-2xl{--tw-shadow: 0 25px 50px -12px rgb(0 0 0 / .25);--tw-shadow-colored: 0 25px 50px -12px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-\[0_0_12px_rgba\(0\,102\,255\,0\.3\)\]{--tw-shadow: 0 0 12px rgba(0,102,255,.3);--tw-shadow-colored: 0 0 12px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-\[0_0_20px_rgba\(0\,102\,255\,0\.3\)\]{--tw-shadow: 0 0 20px rgba(0,102,255,.3);--tw-shadow-colored: 0 0 20px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-\[0_0_6px_rgba\(16\,185\,129\,0\.6\)\]{--tw-shadow: 0 0 6px rgba(16,185,129,.6);--tw-shadow-colored: 0 0 6px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-\[0_0_6px_rgba\(16\,185\,129\,0\.7\)\]{--tw-shadow: 0 0 6px rgba(16,185,129,.7);--tw-shadow-colored: 0 0 6px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-\[0_0_6px_rgba\(239\,68\,68\,0\.6\)\]{--tw-shadow: 0 0 6px rgba(239,68,68,.6);--tw-shadow-colored: 0 0 6px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-\[0_0_6px_rgba\(251\,191\,36\,0\.5\)\]{--tw-shadow: 0 0 6px rgba(251,191,36,.5);--tw-shadow-colored: 0 0 6px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-\[0_0_6px_rgba\(251\,191\,36\,0\.6\)\]{--tw-shadow: 0 0 6px rgba(251,191,36,.6);--tw-shadow-colored: 0 0 6px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-\[0_0_8px_rgba\(148\,163\,184\,0\.35\)\]{--tw-shadow: 0 0 8px rgba(148,163,184,.35);--tw-shadow-colored: 0 0 8px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-\[0_0_8px_rgba\(248\,113\,113\,0\.55\)\]{--tw-shadow: 0 0 8px rgba(248,113,113,.55);--tw-shadow-colored: 0 0 8px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-\[0_0_8px_rgba\(52\,211\,153\,0\.55\)\]{--tw-shadow: 0 0 8px rgba(52,211,153,.55);--tw-shadow-colored: 0 0 8px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-\[0_0_8px_rgba\(56\,189\,248\,0\.55\)\]{--tw-shadow: 0 0 8px rgba(56,189,248,.55);--tw-shadow-colored: 0 0 8px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-\[0_18px_48px_rgba\(15\,23\,42\,0\.06\)\]{--tw-shadow: 0 18px 48px rgba(15,23,42,.06);--tw-shadow-colored: 0 18px 48px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-\[inset_0_1px_0_rgba\(255\,255\,255\,0\.04\)\]{--tw-shadow: inset 0 1px 0 rgba(255,255,255,.04);--tw-shadow-colored: inset 0 1px 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-xl{--tw-shadow: 0 20px 25px -5px rgb(0 0 0 / .1), 0 8px 10px -6px rgb(0 0 0 / .1);--tw-shadow-colored: 0 20px 25px -5px var(--tw-shadow-color), 0 8px 10px -6px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.outline-none{outline:2px solid transparent;outline-offset:2px}.blur-\[100px\]{--tw-blur: blur(100px);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.blur-\[90px\]{--tw-blur: blur(90px);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.backdrop-blur-sm{--tw-backdrop-blur: blur(4px);-webkit-backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.backdrop-blur-xl{--tw-backdrop-blur: blur(24px);-webkit-backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.transition-all{transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-colors{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-opacity{transition-property:opacity;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-transform{transition-property:transform;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.duration-150{transition-duration:.15s}.duration-200{transition-duration:.2s}.duration-300{transition-duration:.3s}.duration-500{transition-duration:.5s}::-webkit-scrollbar{width:6px;height:6px}::-webkit-scrollbar-track{background:transparent}::-webkit-scrollbar-thumb{background:var(--border);border-radius:3px}::-webkit-scrollbar-thumb:hover{background:#8080804d}.sidebar-scroll::-webkit-scrollbar{width:4px}.sidebar-scroll::-webkit-scrollbar-thumb{background:var(--border);border-radius:2px}.grid-bg{background-image:linear-gradient(to right,var(--border) 1px,transparent 1px),linear-gradient(to bottom,var(--border) 1px,transparent 1px);background-size:40px 40px}.glow-blue{background:radial-gradient(circle,rgba(0,102,255,.08) 0%,transparent 70%)}.placeholder\:text-muted::-moz-placeholder{color:var(--muted)}.placeholder\:text-muted::placeholder{color:var(--muted)}.last\:border-0:last-child{border-width:0px}.hover\:border-\[\#0066FF\]\/40:hover{border-color:#06f6}.hover\:border-\[var\(--border-hover\)\]:hover{border-color:var(--border-hover)}.hover\:bg-\[\#0066FF\]\/10:hover{background-color:#0066ff1a}.hover\:bg-\[\#0066FF\]\/15:hover{background-color:#0066ff26}.hover\:bg-\[\#0066FF\]\/20:hover{background-color:#06f3}.hover\:bg-\[\#0066FF\]\/90:hover{background-color:#0066ffe6}.hover\:bg-\[\#07C160\]\/10:hover{background-color:#07c1601a}.hover\:bg-\[\#07C160\]\/90:hover{background-color:#07c160e6}.hover\:bg-\[\#3370FF\]\/10:hover{background-color:#3370ff1a}.hover\:bg-\[\#3370FF\]\/90:hover{background-color:#3370ffe6}.hover\:bg-\[var\(--card\)\]:hover{background-color:var(--card)}.hover\:bg-\[var\(--card-hover\)\]:hover{background-color:var(--card-hover)}.hover\:bg-\[var\(--input-bg\)\]:hover{background-color:var(--input-bg)}.hover\:bg-amber-400:hover{--tw-bg-opacity: 1;background-color:rgb(251 191 36 / var(--tw-bg-opacity, 1))}.hover\:bg-amber-500\/30:hover{background-color:#f59e0b4d}.hover\:bg-emerald-400:hover{--tw-bg-opacity: 1;background-color:rgb(52 211 153 / var(--tw-bg-opacity, 1))}.hover\:bg-emerald-500\/10:hover{background-color:#10b9811a}.hover\:bg-red-400:hover{--tw-bg-opacity: 1;background-color:rgb(248 113 113 / var(--tw-bg-opacity, 1))}.hover\:bg-red-500\/10:hover{background-color:#ef44441a}.hover\:bg-red-500\/15:hover{background-color:#ef444426}.hover\:bg-red-500\/20:hover{background-color:#ef444433}.hover\:bg-red-500\/90:hover{background-color:#ef4444e6}.hover\:bg-red-700:hover{--tw-bg-opacity: 1;background-color:rgb(185 28 28 / var(--tw-bg-opacity, 1))}.hover\:bg-sky-400:hover{--tw-bg-opacity: 1;background-color:rgb(56 189 248 / var(--tw-bg-opacity, 1))}.hover\:text-\[\#0066FF\]:hover{--tw-text-opacity: 1;color:rgb(0 102 255 / var(--tw-text-opacity, 1))}.hover\:text-\[\#0066FF\]\/80:hover{color:#06fc}.hover\:text-amber-400:hover{--tw-text-opacity: 1;color:rgb(251 191 36 / var(--tw-text-opacity, 1))}.hover\:text-emerald-400:hover{--tw-text-opacity: 1;color:rgb(52 211 153 / var(--tw-text-opacity, 1))}.hover\:text-foreground:hover{color:var(--foreground)}.hover\:text-red-300:hover{--tw-text-opacity: 1;color:rgb(252 165 165 / var(--tw-text-opacity, 1))}.hover\:text-red-400:hover{--tw-text-opacity: 1;color:rgb(248 113 113 / var(--tw-text-opacity, 1))}.hover\:underline:hover{text-decoration-line:underline}.hover\:opacity-100:hover{opacity:1}.hover\:opacity-90:hover{opacity:.9}.hover\:shadow-\[0_0_28px_rgba\(0\,102\,255\,0\.45\)\]:hover{--tw-shadow: 0 0 28px rgba(0,102,255,.45);--tw-shadow-colored: 0 0 28px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.focus\:border-\[\#0066FF\]\/60:focus{border-color:#06f9}.focus\:border-amber-500\/60:focus{border-color:#f59e0b99}.focus\:border-red-500\/60:focus{border-color:#ef444499}.focus\:outline-none:focus{outline:2px solid transparent;outline-offset:2px}.focus\:ring-1:focus{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.focus\:ring-\[\#0066FF\]\/60:focus{--tw-ring-color: rgb(0 102 255 / .6)}.focus\:ring-amber-500\/60:focus{--tw-ring-color: rgb(245 158 11 / .6)}.focus\:ring-red-500\/60:focus{--tw-ring-color: rgb(239 68 68 / .6)}.disabled\:pointer-events-none:disabled{pointer-events:none}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:opacity-30:disabled{opacity:.3}.disabled\:opacity-40:disabled{opacity:.4}.disabled\:opacity-50:disabled{opacity:.5}.disabled\:opacity-60:disabled{opacity:.6}@media (min-width: 640px){.sm\:col-span-1{grid-column:span 1 / span 1}.sm\:inline{display:inline}.sm\:table-cell{display:table-cell}.sm\:flex-row{flex-direction:row}.sm\:items-center{align-items:center}.sm\:justify-between{justify-content:space-between}}@media (min-width: 768px){.md\:table-cell{display:table-cell}}@media (min-width: 1024px){.lg\:flex{display:flex}.lg\:hidden{display:none}.lg\:min-h-\[500px\]{min-height:500px}.lg\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.lg\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.lg\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}}
@@ -1,16 +0,0 @@
1
- const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/Login-D1Bt-Lyk.js","assets/vendor-react-B1-3Yrt-.js","assets/vendor-i18n-CfW0RvgE.js","assets/InitPassword-BEC8SE4A.js","assets/Setup-cMF21Y-8.js","assets/providers-V-vwrExZ.js","assets/Dashboard-CQsp1Mr9.js","assets/usePolling-CK0DfI4h.js","assets/InstanceDetail-B5wTgNEg.js","assets/NewInstance-GQzm3K9D.js","assets/Settings-ByjGlqhP.js"])))=>i.map(i=>d[i]);
2
- var Se=Object.defineProperty;var Fe=(e,t,o)=>t in e?Se(e,t,{enumerable:!0,configurable:!0,writable:!0,value:o}):e[t]=o;var X=(e,t,o)=>Fe(e,typeof t!="symbol"?t+"":t,o);import{r as c,a as Ce,u as ie,b as Pe,L as D,R as Ie,c as I,N as E,d as je,e as Ne,B as Le}from"./vendor-react-B1-3Yrt-.js";import{i as Ae,a as Te,u as R}from"./vendor-i18n-CfW0RvgE.js";(function(){const t=document.createElement("link").relList;if(t&&t.supports&&t.supports("modulepreload"))return;for(const d of document.querySelectorAll('link[rel="modulepreload"]'))l(d);new MutationObserver(d=>{for(const a of d)if(a.type==="childList")for(const r of a.addedNodes)r.tagName==="LINK"&&r.rel==="modulepreload"&&l(r)}).observe(document,{childList:!0,subtree:!0});function o(d){const a={};return d.integrity&&(a.integrity=d.integrity),d.referrerPolicy&&(a.referrerPolicy=d.referrerPolicy),d.crossOrigin==="use-credentials"?a.credentials="include":d.crossOrigin==="anonymous"?a.credentials="omit":a.credentials="same-origin",a}function l(d){if(d.ep)return;d.ep=!0;const a=o(d);fetch(d.href,a)}})();var se={exports:{}},B={};/**
3
- * @license React
4
- * react-jsx-runtime.production.min.js
5
- *
6
- * Copyright (c) Facebook, Inc. and its affiliates.
7
- *
8
- * This source code is licensed under the MIT license found in the
9
- * LICENSE file in the root directory of this source tree.
10
- */var Oe=c,De=Symbol.for("react.element"),Me=Symbol.for("react.fragment"),Ee=Object.prototype.hasOwnProperty,Re=Oe.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner,qe={key:!0,ref:!0,__self:!0,__source:!0};function re(e,t,o){var l,d={},a=null,r=null;o!==void 0&&(a=""+o),t.key!==void 0&&(a=""+t.key),t.ref!==void 0&&(r=t.ref);for(l in t)Ee.call(t,l)&&!qe.hasOwnProperty(l)&&(d[l]=t[l]);if(e&&e.defaultProps)for(l in t=e.defaultProps,t)d[l]===void 0&&(d[l]=t[l]);return{$$typeof:De,type:e,key:a,ref:r,props:d,_owner:Re.current}}B.Fragment=Me;B.jsx=re;B.jsxs=re;se.exports=B;var n=se.exports,V={},Y=Ce;V.createRoot=Y.createRoot,V.hydrateRoot=Y.hydrateRoot;const Be={"status.running":"运行中","status.starting":"启动中","status.failed":"失败","status.crashed":"已崩溃","status.stopped":"已停止","action.start":"启动","action.stop":"停止","action.restart":"重启","action.retry":"重试","action.save":"保存","action.cancel":"取消","action.delete":"删除","action.close":"关闭","action.confirm":"确认","action.refresh":"刷新","action.copyAll":"复制全部","action.startDone":"已启动","action.stopDone":"已停止","action.restartDone":"已重启","error.loadFailed":"加载失败","error.operationFailed":"操作失败","error.saveFailed":"保存失败","error.deleteFailed":"删除失败","error.connectionFailed":"无法连接服务器","error.checkBackend":"请检查 JishuShell 后端是否正在运行","nav.overview":"概览","nav.settings":"设置","nav.logout":"退出","nav.instances":"实例","nav.navigation":"导航","nav.newInstance":"新建实例","nav.importInstance":"导入实例","label.password":"密码","label.enabled":"启用","label.disabled":"禁用","nav.switchLanguage":"切换语言"},Ue="概览",$e="系统状态和实例管理",Ve={title:Ue,subtitle:$e,"stats.runningInstances":"运行实例","stats.engineRunning":"引擎运行中","stats.engineStopped":"引擎未启动","stats.cpu":"CPU","stats.memory":"内存","stats.disk":"磁盘","instances.title":"实例","instances.new":"+ 新建","instances.import":"导入","instances.restartEngine":"重启引擎","instances.restartEngineTitle":"重启 Nomad 引擎(会中断运行中的实例)","instances.restarting":"重启中...","instances.empty":"还没有实例","instances.emptyHint":"创建第一个 OpenClaw 实例开始使用","instances.loadError":"加载失败: {{error}}","table.name":"名称","table.status":"状态","table.uptime":"运行时间","table.memory":"内存","table.actions":"操作","update.found":"发现新版本:","update.upgradeNow":"立即升级","update.upgrading":"升级中…","update.confirm":`升级 JishuShell {{currentVersion}} → {{latestVersion}}?
11
- 面板将自动重启,页面需手动刷新。`,"update.started":"升级已启动,面板即将重启,请稍后刷新页面","update.restarting":"新版本已安装,正在等待面板重启…","update.completed":"升级成功:JishuShell {{latestVersion}} 已就绪","update.failed":"升级失败","update.refreshPrompt":"JishuShell 已升级到 {{latestVersion}}。刷新页面后更新生效,是否现在刷新?","engine.restarted":"引擎已重启","engine.restartFailed":"引擎重启失败","engine.restartConfirm":"重启引擎将中断所有运行中的实例,确认继续?","openclawUpdate.found":"发现 OpenClaw 新版本:","openclawUpdate.noRebuild":"无需重建镜像","openclawUpdate.upgradeNow":"立即升级","openclawUpdate.upgrading":"升级中…","openclawUpdate.confirm":`升级 OpenClaw {{currentVersion}} → {{latestVersion}}?
12
- 运行中的实例将自动重启以使用新版本,无需重建 Docker 镜像。`,"openclawUpdate.started":"OpenClaw 升级完成,运行中的实例已重启","openclawUpdate.failed":"OpenClaw 升级失败"},We={"login.title":"登录管理面板","login.password":"密码","login.placeholder":"输入密码","login.submit":"登 录","login.loading":"登录中","login.failed":"登录失败","login.forgotPassword":"忘记密码?请在终端执行","init.title":"首次使用,请设置管理密码","init.password":"密码","init.passwordPlaceholder":"至少 8 位","init.confirm":"确认密码","init.confirmPlaceholder":"再次输入密码","init.mismatch":"两次密码不一致","init.submit":"完成设置","init.loading":"设置中","init.failed":"设置失败"},Ke="设置",_e="系统配置和安全",He={title:Ke,subtitle:_e,"proxy.title":"内置代理","proxy.desc":"内置代理始终运行,由系统自动管理。用户只需在设置页面或实例页填写真实上游 API Key,保存后由代理转发。","proxy.status":"请勿在 OpenClaw 配置页面自行修改 API Key","password.title":"修改密码","password.current":"当前密码","password.currentPlaceholder":"当前密码","password.new":"新密码","password.newPlaceholder":"至少 8 位","password.submit":"更新密码","password.updated":"密码已更新","password.failed":"修改失败","system.title":"系统信息","system.cpuUsage":"CPU 使用率","system.memory":"内存","system.disk":"磁盘","system.cpuTemp":"CPU 温度","about.title":"关于","llm.title":"模型供应商","llm.desc":"配置 AI 模型接口,可添加、编辑、删除和设置默认供应商","llm.add":"添加","llm.addTitle":"添加供应商","llm.editTitle":"编辑: {{id}}","llm.save":"保存","llm.saving":"保存中…","llm.cancel":"取消","llm.edit":"编辑","llm.delete":"删除","llm.setDefault":"设为默认","llm.default":"默认","llm.availableModels":"可用模型","llm.model":"默认模型","llm.noModel":"不指定","llm.loading":"加载中…","llm.empty":"尚未配置任何供应商","llm.added":"供应商已添加","llm.updated":"供应商已更新","llm.deleted":"供应商已删除","llm.defaultSet":"{{id}} 已设为默认供应商","llm.saveFailed":"保存失败","llm.deleteFailed":"删除失败","llm.confirmDelete":'确认删除供应商 "{{id}}"?',"llm.deleteLastForbidden":"至少需要保留一个 Provider","llm.presetLabel":"模型供应商","llm.presetPlaceholder":"选择供应商","llm.presetRequired":"请选择供应商","llm.alias":"标签(可选)","llm.aliasPlaceholder":"work / 个人 / 备用(可选)","llm.aliasHint":"用于同一供应商添加多个账号,留空则自动编号","llm.aliasConflict":"该标签已存在,请换一个","llm.fetchModels":"获取模型","llm.fetchingModels":"获取中…","llm.liveModels":"个在线模型","llm.apiKeyRequired":"请输入 API Key","llm.baseUrlRequired":"Base URL 不能为空","llm.fieldName":"显示名称","llm.fieldNamePlaceholder":"OpenAI","llm.fieldBaseUrl":"Base URL","llm.fieldApi":"接口格式","llm.fieldAuthHeader":"鉴权请求头","llm.fieldApiKey":"API Key","llm.apiKeyConfigured":"已配置","llm.apiKeyLeaveBlank":"不修改则留空","llm.apiKeyPlaceholder":"sk-...","llm.fieldModel":"默认模型","llm.modelsFetched":"获取到 {{count}} 个模型","llm.modelsFetchFailed":"获取模型列表失败"},Je="新建实例",ze="创建新的 OpenClaw 实例",Ge="新实例会自动分配独立的 OpenClaw 数据目录和端口。选择复制只会复制配置,不共用运行目录。",Qe="创建实例",Xe="创建中",Ye="创建失败",Ze={title:Je,subtitle:ze,info:Ge,"name.label":"实例名称","name.placeholder":"例:极术龙虾","id.label":"实例 ID","id.placeholder":"jishu-claw","id.invalid":"名称无法生成有效 ID,请手动填写","id.hint":"小写字母、数字和连字符,创建后不可修改","description.label":"说明","description.placeholder":"可选","clone.label":"从已有实例复制配置","clone.none":"不复制",submit:Qe,loading:Xe,failed:Ye,"clone.preview":"将复制以下内容:","clone.config":"Agent 配置 (openclaw.json)","clone.plugins":"插件 (extensions)","clone.workspace":"工作区 / Skills / 人设文件","clone.apikey":"API Key 配置","clone.memory":"Agent 记忆","clone.sessions":"对话历史","clone.channelNote":"IM 通道凭证不会复制(同一通道不能绑定多个实例)","import.title":"从文件导入","import.uploadDesc":"上传 .tar.gz 文件(支持 JishuShell 导出包、备份包、OpenClaw 官方备份)","import.upload":"上传并预览","import.uploading":"上传中...","import.name":"名称","import.type":"类型","import.size":"大小","import.platform":"平台","import.noSessions":"不含对话历史","import.create":"创建实例","import.creating":"正在创建实例...","import.success":"导入成功","import.failed":"导入失败","import.fromFile":"从文件导入(导出包 / 备份 / OpenClaw 官方备份)","import.selectFile":"点击选择 .tar.gz 文件","backup.fromExisting":"从已有实例的备份创建","backup.fromExistingTitle":"从备份创建新实例","backup.selectInstance":"选择源实例","backup.selectPlaceholder":"选择实例...","backup.selectBackup":"选择备份","backup.selectBackupPlaceholder":"选择备份...","backup.noBackupsAvailable":"该实例没有备份","backup.newName":"新实例名称","backup.newId":"新实例 ID","backup.creating":"创建中...","backup.createInstance":"创建实例"},en="← 概览",nn="← 返回对话",tn="端口 {{port}}",on="实例运行失败,请查看日志排查原因。",an="查看日志",sn="独立窗口",rn="重新加载",ln="快捷技能",cn="获取 gateway launch URL 失败",dn={"uptime.days":"{{d}}天{{h}}小时","uptime.hours":"{{h}}小时{{m}}分钟","uptime.minutes":"{{m}}分钟","tab.chat":"对话","tab.config":"配置","tab.logs":"日志","tab.usage":"使用情况","action.restarting":"重启中...","action.stopping":"停止中...","action.starting":"启动中...","action.startHint":"启动中...","action.stopDone":"已停止","action.restartHint":"重启中...","action.loadInstanceFailed":"加载实例失败","action.loadConfigFailed":"加载配置失败","action.loadUsageFailed":"加载用量失败","action.operationFailed":"操作失败",backToOverview:en,backToChat:nn,port:tn,failedHint:on,viewLogs:an,openInWindow:sn,reload:rn,quickSkill:ln,"quickSkill.im":"即时通讯","quickSkill.skills":"技能","quickSkill.mcp":"MCP","quickSkill.slash":"命令","quickSkill.installed":"已安装","quickSkill.installing":"安装中…","quickSkill.install":"安装","quickSkill.allInstalled":"全部已安装","quickSkill.noInstalled":"暂无已安装的 Skill","quickSkill.noSkills":"该分类暂无技能,敬请期待","quickSkill.loading":"加载中…","quickSkill.customSkillPlaceholder":"自定义 Skill 链接 (clawhub.ai/...)","quickSkill.visit":"访问 →","quickSkill.bound":"已绑定","quickSkill.scanToBind":"扫码绑定","quickSkill.pluginInstalling":"插件安装中...","quickSkill.clickToInstall":"点击安装插件","quickSkill.moreImConfig":"更多渠道配置","quickSkill.configured":"已配置","quickSkill.oneClickConfig":"一键配置","quickSkill.detecting":"检测中…","quickSkill.mcporterDesc":"MCP 服务安装与管理工具","quickSkill.mcpJsonLabel":"填入 MCP 配置(JSON)","quickSkill.addToConfig":"添加到配置","quickSkill.mcpJsonNotObject":'JSON 格式错误,应为对象({ "serverName": {...} })',"quickSkill.mcpJsonEmpty":"未检测到有效的 MCP server 条目","quickSkill.mcpJsonParseFailed":"JSON 解析失败:{{error}}","quickSkill.mcpJsonValueNotObject":'"{{name}}" 的值必须是对象',"quickSkill.mcpJsonMissingField":'"{{name}}" 缺少 command 或 baseUrl 字段',"quickSkill.mcpWritten":"已写入 MCPorter 配置","quickSkill.mcpAdded":"已添加 {{label}} 到 MCPorter 配置","quickSkill.mcpWriteFailed":"写入失败","quickSkill.mcpAddFailed":"添加失败","quickSkill.mcporterConfigured":"MCPorter 已配置","quickSkill.statusNormal":"正常","quickSkill.statusNormalWithTools":"正常 · {{count}}工具","feishu.pluginInstalled":"飞书插件安装完成,实例将自动重启加载插件","feishu.pluginFailed":"飞书插件安装失败","weixin.pluginInstalled":"微信插件安装完成,实例将自动重启加载插件","weixin.pluginFailed":"微信插件安装失败","feishu.installing":"正在安装飞书插件...","weixin.installing":"正在安装微信插件...","feishu.waitingInstall":"飞书插件安装中,请稍候","weixin.waitingInstall":"微信插件安装中,请稍候","qr.gettingQr":"正在获取二维码...","qr.getFailed":"获取二维码失败","qr.scanFeishu":"请使用飞书或 Lark 扫描二维码","qr.scanWeixin":"请使用微信扫描二维码","qr.loginSuccess":"登录成功!","qr.expired":"二维码已过期","qr.refreshed":"二维码已刷新,请重新扫描","qr.scaned":"已扫码,请在手机上确认...","qr.credSaved":"凭证已自动保存,重启实例后生效。","qr.feishuTitle":"飞书 / Lark 登录","qr.weixinTitle":"微信 ClawBot 登录","qr.retry":"重新获取","config.modified":"配置已修改,需保存后生效","config.discard":"放弃修改","config.form":"表单","config.json":"JSON","config.jsonHelp":"JSON 编辑说明","config.jsonHelp1":'API Key 配置位于 <code class="bg-[#0066FF]/10 px-1 rounded">x-jishushell.proxy.upstream.apiKey</code>,已保存的 Key 不会回显,留空即保持不变',"config.jsonHelp2":'<code class="bg-[#0066FF]/10 px-1 rounded">models.providers</code> 会在保存时自动重写为内置代理配置,请勿手动修改',"config.jsonHelp3":"模型/厂商切换建议使用表单模式,JSON 模式适合微调 channels、plugins 等高级配置","config.saving":"保存中...","config.save":"保存","config.processing":"处理中...","config.saveAndRestart":"保存并重启","config.savedAndRestarted":"配置已保存并重启","config.savedButRestartFailed":"配置已保存,但重启失败: {{error}}","config.restartFailed":"重启失败: {{error}}","config.saved":"配置已保存","config.jsonError":"JSON 格式错误","config.jsonParseError":"JSON 格式错误: {{error}}","config.unsavedWarning":"配置尚未保存,确定离开?","config.presetAdded":"预设已添加,请填写必要字段后保存","config.navigatingToConfig":"正在跳转到配置页,预设将自动填入","delete.title":"删除实例","delete.warning":'此操作将删除实例 <strong class="text-foreground">{{name}}</strong> 的所有配置和数据,不可恢复。',"delete.warningBefore":"此操作将删除实例 ","delete.warningAfter":" 的所有配置和数据,不可恢复。","delete.confirmHint":"请输入实例名称确认:","delete.confirm":"确认删除","delete.failed":"删除失败","delete.skillConfirm":'确定删除 Skill "{{name}}"?',"delete.mcpConfirm":'确定删除 MCP "{{name}}"?',"logs.searchPlaceholder":"搜索日志...","logs.empty":"暂无日志","logs.copied":"已复制","logs.copyFailed":"复制失败","usage.noTokenData":"当前模型提供商未返回 Token 用量数据,消息计数仍然有效。","usage.messages":"消息数","usage.totalTokens":"总 Tokens","usage.totalCost":"总费用","usage.sessions":"会话","usage.noSessions":"暂无会话数据","usage.time":"时间","usage.model":"模型","usage.source":"来源","usage.messagesShort":"消息","usage.input":"输入","usage.output":"输出","usage.tokens":"总 Tokens","usage.cost":"费用","chat.notReady":"对话服务未就绪","chat.startHint":"请先启动实例,启动后对话界面将自动加载","chat.startInstance":"启动实例","chat.waitingGateway":"正在等待网关就绪...","status.gatewayPending":"网关就绪中","chat.loadingChat":"正在加载对话界面...","update.confirm":`升级 JishuShell {{currentVersion}} → {{latestVersion}}?
13
- 面板将自动重启,页面需手动刷新。`,"update.started":"升级已启动,面板即将重启,请稍后刷新页面","update.restarting":"新版本已安装,正在等待面板重启…","update.completed":"升级成功:JishuShell {{latestVersion}} 已就绪","update.failed":"升级失败","update.refreshPrompt":"JishuShell 已升级到 {{latestVersion}}。刷新页面后更新生效,是否现在刷新?","update.found":"发现新版本:","update.upgrading":"升级中…","update.upgradeNow":"立即升级",gatewayLaunchFailed:cn,"configForm.modelConfig":"模型配置","configForm.imChannelConfig":"IM 通道配置","configForm.proxyChain":"内置代理链路","configForm.proxyChainDesc":"OpenClaw 固定使用 `jsproxy/default`,真实上游 API Key 只会保存在代理侧。","configForm.proxyAddress":"代理地址:","configForm.notConfigured":"未配置","configForm.proxyStatus":"代理状态:","configForm.running":"运行中","configForm.notRunning":"未运行","configForm.virtualKeyLabel":"实例虚拟 Key:","configForm.generated":"已生成","configForm.notGenerated":"未生成","configForm.editModelConfig":"修改模型配置","configForm.upstreamProvider":"上游模型提供商","configForm.upstreamProviderHint":"这里配置的是内置代理背后的真实 provider,而不是 OpenClaw 直接连接的 provider","configForm.selectProvider":"选择上游 provider","configForm.custom":"(自定义)","configForm.switchProviderConfirm":"切换 Provider 将清空已输入的 API Key,确定继续?","configForm.upstreamApiKey":"上游 API Key","configForm.apiKeyHintSaved":"已保存在代理侧,留空则保持不变","configForm.apiKeyHintNew":"从真实 provider 平台获取","configForm.enterApiKey":"输入 API Key","configForm.markedForClear":"已标记为清空","configForm.clearSavedApiKey":"清空已保存 API Key","configForm.upstreamModel":"上游默认模型","configForm.upstreamModelHint":"已自动选择推荐模型,如需切换可在此更改","configForm.modelId":"模型 ID","configForm.modelIdHint":"必填,如 llama3、qwen2.5:7b","configForm.modelName":"模型名称","configForm.modelNamePlaceholder":"可选,留空同模型 ID","configForm.contextWindow":"上下文窗口","configForm.collapseAdvanced":"收起高级选项","configForm.advancedOptions":"高级选项","configForm.upstreamBaseUrl":"上游 Base URL","configForm.baseUrlPlaceholder":"API 地址","configForm.upstreamApiProtocol":"上游 API 协议","configForm.localServiceAddress":"本地服务地址","configForm.providerGroup.国内厂商":"国内厂商","configForm.providerGroup.国际厂商":"国际厂商","configForm.providerGroup.推理加速":"推理加速","configForm.providerGroup.聚合平台":"聚合平台","configForm.providerGroup.本地部署":"本地部署","configForm.providerLabel.minimax":"MiniMax (国内)","configForm.providerLabel.minimax-intl":"MiniMax (国际)","configForm.providerLabel.moonshot-coding":"Kimi (编码计划)","configForm.providerLabel.moonshot-intl":"Kimi (国际)","configForm.providerLabel.zhipu":"智谱AI (GLM)","configForm.providerLabel.zhipu-intl":"Z.AI (GLM)","configForm.providerLabel.volcengine":"火山引擎 (豆包)","configForm.providerLabel.qianfan":"百度千帆 (ERNIE)","configForm.providerLabel.dashscope":"阿里云百炼","configForm.providerLabel.modelstudio":"阿里云百炼 (国际/Coding)","configForm.providerLabel.tencent":"腾讯混元","configForm.providerLabel.stepfun":"阶跃星辰","configForm.providerLabel.baichuan":"百川智能","configForm.providerLabel.xiaomi":"MiMo (小米)","configForm.providerLabel.byteplus":"火山引擎国际版 (Doubao)","configForm.providerLabel.spark":"讯飞星火","configForm.providerLabel.siliconflow":"SiliconFlow","configForm.providerLabel.infini":"Infini-AI","configForm.providerLabel.ollama":"Ollama (本地)","configForm.providerLabel.vllm":"vLLM (本地)","configForm.providerLabel.sglang":"SGLang (本地)","channel.feishu":"飞书 / Lark","channel.weixin":"微信","configForm.channel.feishu":"飞书 / Lark","configForm.channel.openclaw-weixin":"微信","configForm.channel.telegram":"Telegram","configForm.channel.discord":"Discord","configForm.channel.slack":"Slack","configForm.channel.whatsapp":"WhatsApp","configForm.channel.msteams":"Microsoft Teams","configForm.channel.signal":"Signal","configForm.channel.line":"LINE","configForm.channel.googlechat":"Google Chat","configForm.apiProtocol":"API 协议","configForm.proxyNote":"OpenClaw 的实际 provider 会在保存时自动改写为 `jsproxy/default`。这里的高级参数只影响内置代理背后的真实上游连接。","configForm.hint.moonshot-coding":"使用 Anthropic 兼容接口对接 Kimi K2 系列模型,专为 Coding/Agent 场景优化。推荐模型:kimi-k2-thinking-turbo(高速思考)或 kimi-k2.5(全能多模态)。","configForm.hint.volcengine":"火山引擎需要先在控制台创建「推理接入点」,然后将接入点 ID 填入下方模型 ID 中。","configForm.hint.byteplus":"BytePlus 需要先在控制台创建 Endpoint,然后将 Endpoint ID 填入下方模型 ID 中。","configForm.hint.openrouter":"OpenRouter 聚合了多家模型,选择 Auto 会自动路由到最优模型。API Key 从 openrouter.ai/keys 获取。","configForm.hint.ollama":"请确保 Ollama 服务已启动,并在下方填写实际部署的模型名称。","configForm.hint.vllm":"请确保 vLLM 服务已启动,并在下方填写实际加载的模型名称。","configForm.hint.sglang":"请确保 SGLang 服务已启动,并在下方填写实际加载的模型名称。","configForm.sessionIsolation":"对话隔离模式","configForm.sessionIsolationHint":"控制不同用户、不同通道的对话是否共享上下文","configForm.sessionMain":"所有人共享对话","configForm.sessionPerPeer":"每人独立对话","configForm.sessionPerChannelPeer":"每人每通道独立对话","configForm.sessionPerAccountChannelPeer":"每人每账号独立对话","configForm.pluginInstalling":"{{label}}插件安装中...","configForm.installPlugin":"安装{{label}}插件","configForm.installPluginHint":"安装插件后即可配置{{label}}通道","configForm.remove":"移除","configForm.addImChannel":"添加 IM 通道","configForm.whatsappTitle":"WhatsApp 通过二维码配对","configForm.whatsappHint":"启用后启动实例,在「日志」Tab 中查看 QR 码,用手机 WhatsApp 扫描即可。首次配对后凭证会自动保存,后续无需重复扫码。","configForm.feishu.platform":"平台: {{platform}}。凭证已自动保存,重启实例后生效。","configForm.feishu.platformLark":"Lark (国际版)","configForm.feishu.platformFeishu":"飞书","configForm.feishu.added":"已添加","configForm.feishu.addBot":"添加飞书 / Lark 机器人","configForm.feishu.addBotHint":"使用飞书或 Lark APP 扫码,自动创建并配置机器人。系统自动识别平台。","configForm.feishu.gettingQr":"正在获取二维码...","configForm.feishu.scanHint":"请使用飞书或 Lark 扫描二维码","configForm.feishu.cancel":"取消","configForm.feishu.refresh":"刷新","configForm.weixin.accountId":"账号 ID:","configForm.weixin.restartHint":"保存并重启实例后生效。可再次扫码添加更多微信号。","configForm.weixin.addAnother":"添加另一个微信号","configForm.weixin.added":"已添加","configForm.weixin.addClawBot":"添加微信 ClawBot","configForm.weixin.addClawBotHint":"点击后显示二维码,用手机微信扫码即可。{{extra}}","configForm.weixin.addClawBotHintRestart":"保存并重启后生效。","configForm.weixin.addClawBotHintMulti":"支持多账号。","configForm.weixin.gettingQr":"正在获取二维码...","configForm.weixin.scanHint":"请使用微信扫描二维码","configForm.weixin.cancel":"取消","configForm.weixin.refresh":"刷新","config.clickToEdit":"点击输入新值","backup.manageMenu":"备份管理","backup.autoBackup":"自动备份","backup.autoEnabled":"自动备份已开启","backup.autoDisabled":"自动备份已关闭","backup.notConfigured":"自动备份未开启","backup.enableNow":"立即开启","backup.enabling":"开启中...","backup.interval":"每{{h}}小时备份","backup.keep":"保留{{n}}份","backup.failed":"失败","backup.manageTitle":"备份管理","backup.noBackups":"暂无备份","backup.typeAuto":"自动","backup.typeManual":"手动","backup.typePreRestore":"恢复前","backup.restore":"恢复","backup.createNew":"创建新实例","backup.download":"下载","backup.delete":"删除","backup.createNew2":"创建新备份","backup.create":"备份","backup.createTitle":"创建备份","backup.createDesc":"备份当前实例的配置、插件和数据。","backup.includeSessions":"包含对话历史(体积较大)","backup.creating":"备份中...","backup.created":"备份完成","backup.deleted":"已删除","backup.processing":"处理中...","backup.queueNote":"任务将按顺序执行","backup.restoreTitle":"恢复将覆盖当前数据","backup.restoreDesc":"已自动创建恢复前备份,如有问题可回滚。","backup.restoreConfirmLabel":"输入实例名确认恢复:","backup.confirmRestore":"确认恢复","backup.restoring":"恢复中...","backup.restoreSuccess":"恢复完成","backup.restoreOk":"实例已恢复。","backup.restoreFailed":"恢复失败","backup.restoreFailedRolledBack":"恢复失败 — 已自动回滚","backup.apiKeyLost":"备份来自不同平台/架构,请确认 API Key 配置是否仍然适用。","backup.configApiKey":"配置 API Key","backup.createFromTitle":"从备份创建新实例","backup.newName":"新实例名称","backup.newNamePlaceholder":"我的 Agent 副本","backup.newId":"新实例 ID","backup.newIdPlaceholder":"my-agent-copy","backup.createFromNote":"API Key 和 IM 凭证不会复制,需自行配置。","backup.createInstance":"创建","backup.createFromBackupOk":"新实例创建成功","backup.createFromBackupFail":"创建实例失败","backup.export":"导出(分享)","backup.exportTitle":"导出(分享)","backup.exportDesc":"生成可分享的导出包,API Key 和凭证将自动移除。","backup.exportConfig":"配置 (openclaw.json, 已清洗)","backup.exportPlugins":"插件 (extensions)","backup.exportWorkspace":"工作区 / Skills","backup.exportNoKeys":"API Key / 凭证 — 已移除","backup.exportIncludeSessions":"包含对话历史","backup.exportBtn":"导出","backup.exporting":"导出中...","backup.exportDone":"导出完成","backup.downloadExport":"下载","backup.scopeFull":"完整备份(含运行时)","backup.scopeState":"仅数据(更小、可移植)","backup.scopeFullDesc":"包含升级后的 OpenClaw 运行时——恢复后保持当前版本","backup.scopeStateDesc":"仅 .openclaw/ 数据——体积小,兼容官方 OpenClaw 格式","clone.preview":"将复制以下内容:","clone.config":"Agent 配置 (openclaw.json)","clone.plugins":"插件 (extensions)","clone.workspace":"工作区 / Skills / 人设文件","clone.apikey":"API Key 配置","clone.memory":"Agent 记忆","clone.sessions":"对话历史","clone.channelNote":"IM 通道凭证不会复制(同一通道不能绑定多个实例)","import.title":"从文件导入 OpenClaw 实例","import.uploadDesc":"上传 .tar.gz 文件(支持 JishuShell 导出包、备份包、OpenClaw 官方备份)","import.upload":"上传并预览","import.uploading":"上传中...","import.name":"名称","import.type":"类型","import.size":"大小","import.platform":"平台","import.noSessions":"不含对话历史","import.create":"创建实例","import.creating":"正在创建实例...","import.success":"导入成功"},un="配置运行环境",pn="版本过低",mn="必需",gn="恢复任务: {{label}}...",fn="任务失败",hn="{{label}} 已完成",kn="{{label}} 任务状态获取失败",bn="{{label}} 超时(超过 10 分钟),请检查后端日志",vn="正在安装 {{label}}...",xn="{{label}} 已开始",wn="{{label}} 安装失败: {{error}}",yn="安装失败",Sn="Docker 镜像构建",Fn="Docker 安装",Cn="OpenClaw 安装",Pn="正在配置 Nomad systemd 服务...",In="Nomad 服务已启动",jn="Nomad 已启动",Nn="Nomad 启动失败: {{error}}",Ln="等待 Nomad 就绪...",An="Nomad 已就绪",Tn="配置写入失败",On="保存失败",Dn="{{label}} 失败: {{message}}",Mn={title:un,"steps.check":"环境检测","steps.modelConfig":"模型配置","steps.done":"完成",versionTooOld:pn,required:mn,resumeTask:gn,taskFailed:fn,taskCompleted:hn,taskStatusFailed:kn,taskTimeout:bn,installing:vn,taskStarted:xn,installFailed:wn,defaultInstallFailed:yn,dockerImageBuild:Sn,dockerInstall:Fn,openclawInstall:Cn,configuringNomadSystemd:Pn,nomadServiceStarted:In,nomadStarted:jn,nomadStartFailed:Nn,waitingNomad:Ln,nomadReady:An,configWriteFailed:Tn,saveFailed:On,"check.title":"环境检测","check.desc":"检查系统已安装的组件","check.requiredComponents":"必需组件","check.upgrading":"升级中...","check.upgrade":"升级","node.title":"升级 Node.js","node.desc":"OpenClaw 需要 Node.js 22+,当前版本过低","node.ready":"Node.js 已就绪 ({{version}})","node.currentVersion":"当前版本 {{version}},需升级到 22+","node.noSudo":"当前版本 {{version}},需升级到 22+,但当前用户没有 sudo 权限","node.upgrading":"升级中...","node.upgradeBtn":"升级 Node.js","node.sudoRequired":"需要 sudo 权限,通过 NodeSource 安装","node.contactAdmin":"请联系管理员执行以下命令:","node.refreshAfterInstall":"安装完成后点此刷新","docker.title":"安装 Docker","docker.desc":"容器运行时,用于隔离运行 OpenClaw 实例","docker.running":"Docker 运行中 ({{version}})","docker.notRunning":"Docker 已安装但服务未运行,请启动 Docker 服务","docker.refreshAfterStart":"启动后点此刷新","docker.installing":"安装中,请稍候...","docker.installBtn":"安装 Docker","docker.sudoRequired":"需要 sudo 权限,可能需要几分钟","docker.noSudo":"当前用户没有 sudo 权限,无法自动安装","docker.contactAdmin":"请联系管理员执行以下命令:","docker.refreshAfterInstall":"安装完成后点此刷新","nomad.title":"安装 Nomad","nomad.desc":"编排引擎,管理 OpenClaw 容器的生命周期","nomad.running":"Nomad 运行中 ({{version}})","nomad.starting":"Nomad 已安装,正在启动...","nomad.installing":"安装中...","nomad.installBtn":"安装 Nomad","openclaw.title":"安装 OpenClaw","openclaw.desc":"AI 智能体运行时,JishuShell 的核心组件","openclaw.installed":"OpenClaw 已安装 ({{version}})","openclaw.buildingImage":"正在构建 Docker 镜像,首次构建需要几分钟...","openclaw.buildImageBtn":"构建 Docker 镜像","openclaw.installing":"安装中,请稍候...","openclaw.installBtn":"安装 OpenClaw","openclaw.npmHint":"通过 npm 安装,需要网络连接","done.finalizing":"正在完成配置...","done.finalizingDesc":"写入系统配置,请稍候","done.complete":"环境配置完成","done.completeDesc":"基础环境已就绪","provider.title":"配置默认模型","provider.desc":"新建实例时将自动使用此配置,可随时在实例详情中修改","provider.label":"模型提供商","provider.placeholder":"选择提供商","provider.apiKey":"API Key","provider.apiKeyPlaceholder":"输入 API Key","provider.baseUrl":"服务地址","provider.fetchModels":"获取模型","provider.fetchingModels":"获取中…","provider.liveModels":"个在线模型","provider.fetchModelsFailed":"获取模型列表失败","provider.defaultModel":"默认模型","provider.skip":"跳过","provider.saving":"保存中...","provider.save":"保存","provider.saved":"模型配置已保存","provider.saveFailed":"保存失败","provider.apiKeyConfigured":"••••••••(已配置)","provider.saveAndContinue":"保存并继续","nav.next":"下一步","nav.retry":"重试","nav.enterPanel":"进入面板",taskErrorPrefix:Dn},En={"im.feishu.desc":"飞书机器人(WebSocket 模式)","im.openclaw-weixin.desc":"微信扫码接入","skills.group.hubs":"热门Hub","skills.group.general":"通用基础","skills.group.productivity":"工作效率","skills.group.life":"生活辅助","skills.group.dev":"开发工具","skills.clawhub.desc":"OpenClaw 官方 Skill 市场","skills.skillhub-tencent.label":"腾讯 SkillHub","skills.skillhub-tencent.desc":"腾讯技能中心,官方出品","skills.skills-sh.desc":"第三方 Skill 聚合社区","skills.skill-vetter.desc":"安全审计 Skill,安装前建议先审查","skills.self-improving-agent.desc":"自我优化的 Agent,持续改进任务执行","skills.proactive-agent.desc":"主动式 Agent,自动感知并提前完成任务","skills.multi-search-engine.desc":"多搜索引擎聚合搜索","skills.exa-web-search-free.desc":"免费 Exa 网页语义搜索","skills.lobehub-skills.label":"LobeHub Skills","skills.lobehub-skills.desc":"LobeHub 社区 Skill 市场","skills.findskills.label":"FindSkills.org","skills.findskills.desc":"开源 Skill 搜索与聚合平台","skills.playbooks-skills.label":"Playbooks Skills","skills.playbooks-skills.desc":"Playbooks 社区 Skill 目录","skills.pdf-reader.label":"PDF Reader","skills.pdf-reader.desc":"PDF 文档读取与分析","skills.powerpoint-pptx.label":"PowerPoint / PPTX","skills.powerpoint-pptx.desc":"PPT 演示文稿生成与编辑","skills.word-docx.label":"Word / DOCX","skills.word-docx.desc":"Word 文档生成与编辑","skills.excel-xlsx.label":"Excel / XLSX","skills.excel-xlsx.desc":"Excel 表格生成与数据处理","skills.todo-manager.label":"Todo Manager","skills.todo-manager.desc":"任务与待办事项管理","skills.12306.label":"12306 火车票","skills.12306.desc":"查询与购买 12306 火车票","skills.youtube-watcher.label":"YouTube Watcher","skills.youtube-watcher.desc":"YouTube 视频摘要与内容分析","skills.cli-developer.label":"CLI Developer","skills.cli-developer.desc":"命令行工具开发辅助","skills.home-assistant.label":"Home Assistant","skills.home-assistant.desc":"Home Assistant 智能家居集成","mcp.12306-mcp.label":"12306-MCP车票查询工具","mcp.12306-mcp.desc":"12306-MCP车票查询工具","slash.group.会话":"会话","slash.group.模型":"模型","slash.group.工具":"工具","slash.slash-new.desc":"开启新会话","slash.slash-reset.desc":"重置当前会话","slash.slash-compact.desc":"压缩会话上下文","slash.slash-stop.desc":"停止当前运行","slash.slash-clear.desc":"清空聊天记录","slash.slash-focus.desc":"切换专注模式","slash.slash-model.desc":"查看或切换模型","slash.slash-think.desc":"设置思考深度","slash.slash-verbose.desc":"切换详细输出模式","slash.slash-fast.desc":"切换快速模式","slash.slash-help.desc":"查看可用命令","slash.slash-status.desc":"显示会话状态(agent)","slash.slash-export.desc":"导出会话为 Markdown","slash.slash-usage.desc":"显示 Token 用量"},Rn={"status.running":"Running","status.starting":"Starting","status.failed":"Failed","status.crashed":"Crashed","status.stopped":"Stopped","action.start":"Start","action.stop":"Stop","action.restart":"Restart","action.retry":"Retry","action.save":"Save","action.cancel":"Cancel","action.delete":"Delete","action.close":"Close","action.confirm":"Confirm","action.refresh":"Refresh","action.copyAll":"Copy All","action.startDone":"Started","action.stopDone":"Stopped","action.restartDone":"Restarted","error.loadFailed":"Failed to load","error.operationFailed":"Operation failed","error.saveFailed":"Save failed","error.deleteFailed":"Delete failed","error.connectionFailed":"Cannot connect to server","error.checkBackend":"Please check if JishuShell backend is running","nav.overview":"Overview","nav.settings":"Settings","nav.logout":"Logout","nav.instances":"Instances","nav.navigation":"Navigation","nav.newInstance":"New Instance","nav.importInstance":"Import","label.password":"Password","label.enabled":"Enabled","label.disabled":"Disabled","nav.switchLanguage":"Switch language"},qn="Overview",Bn="System status and instance management",Un={title:qn,subtitle:Bn,"stats.runningInstances":"Running","stats.engineRunning":"Engine running","stats.engineStopped":"Engine not running","stats.cpu":"CPU","stats.memory":"Memory","stats.disk":"Disk","instances.title":"Instances","instances.new":"+ New","instances.import":"Import","instances.restartEngine":"Restart Engine","instances.restartEngineTitle":"Restart Nomad engine (will interrupt running instances)","instances.restarting":"Restarting...","instances.empty":"No instances yet","instances.emptyHint":"Create your first OpenClaw instance to get started","instances.loadError":"Failed to load: {{error}}","table.name":"Name","table.status":"Status","table.uptime":"Uptime","table.memory":"Memory","table.actions":"Actions","update.found":"New version available:","update.upgradeNow":"Upgrade Now","update.upgrading":"Upgrading…","update.confirm":`Upgrade JishuShell {{currentVersion}} → {{latestVersion}}?
14
- The panel will restart automatically. Please refresh the page manually.`,"update.started":"Upgrade started. The panel will restart shortly. Please refresh later.","update.restarting":"The new version is installed. Waiting for the panel to restart…","update.completed":"Upgrade complete: JishuShell {{latestVersion}} is ready","update.failed":"Upgrade failed","update.refreshPrompt":"JishuShell has been upgraded to {{latestVersion}}. Refresh the page to apply the update now?","engine.restarted":"Engine restarted","engine.restartFailed":"Engine restart failed","engine.restartConfirm":"Restarting the engine will interrupt all running instances. Continue?","openclawUpdate.found":"OpenClaw update available:","openclawUpdate.noRebuild":"No image rebuild needed","openclawUpdate.upgradeNow":"Upgrade Now","openclawUpdate.upgrading":"Upgrading…","openclawUpdate.confirm":`Upgrade OpenClaw {{currentVersion}} → {{latestVersion}}?
15
- Running instances will be restarted automatically. No Docker image rebuild required.`,"openclawUpdate.started":"OpenClaw upgraded. Running instances have been restarted.","openclawUpdate.failed":"OpenClaw upgrade failed"},$n={"login.title":"Login to Admin Panel","login.password":"Password","login.placeholder":"Enter password","login.submit":"Login","login.loading":"Logging in","login.failed":"Login failed","login.forgotPassword":"Forgot password? Run in terminal:","init.title":"First time setup — set your admin password","init.password":"Password","init.passwordPlaceholder":"At least 8 characters","init.confirm":"Confirm Password","init.confirmPlaceholder":"Enter password again","init.mismatch":"Passwords do not match","init.submit":"Complete Setup","init.loading":"Setting up","init.failed":"Setup failed"},Vn="Settings",Wn="System configuration and security",Kn={title:Vn,subtitle:Wn,"proxy.title":"Built-in Proxy","proxy.desc":"The built-in proxy is always running and managed automatically by the system. Simply fill in the real upstream API Key on the Settings page or instance page, and the proxy will handle forwarding.","proxy.status":"Do not manually modify the API Key in the OpenClaw configuration page.","password.title":"Change Password","password.current":"Current Password","password.currentPlaceholder":"Current password","password.new":"New Password","password.newPlaceholder":"At least 8 characters","password.submit":"Update Password","password.updated":"Password updated","password.failed":"Update failed","system.title":"System Info","system.cpuUsage":"CPU Usage","system.memory":"Memory","system.disk":"Disk","system.cpuTemp":"CPU Temperature","about.title":"About","llm.title":"Model Providers","llm.desc":"Configure AI model providers: add, edit, delete and set the default","llm.add":"Add","llm.addTitle":"Add Provider","llm.editTitle":"Edit: {{id}}","llm.save":"Save","llm.saving":"Saving…","llm.cancel":"Cancel","llm.edit":"Edit","llm.delete":"Delete","llm.setDefault":"Set Default","llm.default":"Default","llm.availableModels":"Available models","llm.model":"Default model","llm.noModel":"None","llm.loading":"Loading…","llm.empty":"No providers configured yet","llm.added":"Provider added","llm.updated":"Provider updated","llm.deleted":"Provider deleted","llm.defaultSet":"{{id}} set as default provider","llm.saveFailed":"Save failed","llm.deleteFailed":"Delete failed","llm.confirmDelete":'Delete provider "{{id}}"?',"llm.deleteLastForbidden":"At least one provider must remain","llm.presetLabel":"Provider","llm.presetPlaceholder":"Select a provider","llm.presetRequired":"Please select a provider","llm.alias":"Tag (optional)","llm.aliasPlaceholder":"work / personal / backup (optional)","llm.aliasHint":"Allows multiple accounts for the same provider. Leave blank for auto-numbering.","llm.aliasConflict":"This tag already exists, please use a different one","llm.fetchModels":"Fetch Models","llm.fetchingModels":"Fetching…","llm.liveModels":"live models","llm.apiKeyRequired":"API Key is required","llm.baseUrlRequired":"Base URL is required","llm.fieldName":"Display name","llm.fieldNamePlaceholder":"OpenAI","llm.fieldBaseUrl":"Base URL","llm.fieldApi":"API format","llm.fieldAuthHeader":"Auth header","llm.fieldApiKey":"API Key","llm.apiKeyConfigured":"Configured","llm.apiKeyLeaveBlank":"Leave blank to keep existing","llm.apiKeyPlaceholder":"sk-...","llm.fieldModel":"Default model","llm.modelsFetched":"{{count}} models fetched","llm.modelsFetchFailed":"Failed to fetch models"},_n="New Instance",Hn="Create a new OpenClaw instance",Jn="A new instance gets its own OpenClaw data directory and port. Cloning only copies the configuration, not the runtime directory.",zn="Create Instance",Gn="Creating",Qn="Creation failed",Xn={title:_n,subtitle:Hn,info:Jn,"name.label":"Instance Name","name.placeholder":"e.g. My Claw","id.label":"Instance ID","id.placeholder":"my-claw","id.invalid":"Name cannot generate a valid ID. Please enter manually.","id.hint":"Lowercase letters, numbers, and hyphens. Cannot be changed after creation.","description.label":"Description","description.placeholder":"Optional","clone.label":"Clone config from existing instance","clone.none":"Don't clone",submit:zn,loading:Gn,failed:Qn,"clone.preview":"Will copy the following:","clone.config":"Agent Config (openclaw.json)","clone.plugins":"Plugins (extensions)","clone.workspace":"Workspace / Skills / Persona Files","clone.apikey":"API Key Config","clone.memory":"Agent Memory","clone.sessions":"Conversation History","clone.channelNote":"IM channel credentials will not be copied (same channel cannot bind multiple instances)","import.title":"Import from File","import.uploadDesc":"Upload a .tar.gz file (JishuShell export, backup, or OpenClaw official backup)","import.upload":"Upload & Preview","import.uploading":"Uploading...","import.name":"Name","import.type":"Type","import.size":"Size","import.platform":"Platform","import.noSessions":"No conversation history","import.create":"Create Instance","import.creating":"Creating instance...","import.success":"Import Successful","import.failed":"Import failed","import.fromFile":"Import from file (export / backup / OpenClaw official backup)","import.selectFile":"Click to select a .tar.gz file","backup.fromExisting":"Create from existing instance backup","backup.fromExistingTitle":"Create Instance from Backup","backup.selectInstance":"Select source instance","backup.selectPlaceholder":"Select instance...","backup.selectBackup":"Select backup","backup.selectBackupPlaceholder":"Select backup...","backup.noBackupsAvailable":"No backups available for this instance","backup.newName":"New Instance Name","backup.newId":"New Instance ID","backup.creating":"Creating...","backup.createInstance":"Create Instance"},Yn="← Overview",Zn="← Back to Chat",et="Port {{port}}",nt="Instance failed. Check logs for details.",tt="View Logs",ot="Open in Window",at="Reload",it="Quick Skills",st="Failed to get gateway launch URL",rt={"uptime.days":"{{d}}d {{h}}h","uptime.hours":"{{h}}h {{m}}m","uptime.minutes":"{{m}}m","tab.chat":"Chat","tab.config":"Config","tab.logs":"Logs","tab.usage":"Usage","action.restarting":"Restarting...","action.stopping":"Stopping...","action.starting":"Starting...","action.startHint":"Starting...","action.stopDone":"Stopped","action.restartHint":"Restarting...","action.loadInstanceFailed":"Failed to load instance","action.loadConfigFailed":"Failed to load config","action.loadUsageFailed":"Failed to load usage","action.operationFailed":"Operation failed",backToOverview:Yn,backToChat:Zn,port:et,failedHint:nt,viewLogs:tt,openInWindow:ot,reload:at,quickSkill:it,"quickSkill.im":"IM","quickSkill.skills":"Skills","quickSkill.mcp":"MCP","quickSkill.slash":"Commands","quickSkill.installed":"Installed","quickSkill.installing":"Installing…","quickSkill.install":"Install","quickSkill.allInstalled":"All Installed","quickSkill.noInstalled":"No skills installed yet","quickSkill.noSkills":"No skills in this category yet","quickSkill.loading":"Loading…","quickSkill.customSkillPlaceholder":"Custom skill URL (clawhub.ai/...)","quickSkill.visit":"Visit →","quickSkill.bound":"Bound","quickSkill.scanToBind":"Scan to bind","quickSkill.pluginInstalling":"Plugin installing...","quickSkill.clickToInstall":"Click to install plugin","quickSkill.moreImConfig":"More channel settings","quickSkill.configured":"Configured","quickSkill.oneClickConfig":"One-click setup","quickSkill.detecting":"Detecting…","quickSkill.mcporterDesc":"MCP service installer and manager","quickSkill.mcpJsonLabel":"Paste MCP config (JSON)","quickSkill.addToConfig":"Add to config","quickSkill.mcpJsonNotObject":'Invalid JSON format. Expected an object ({ "serverName": {...} })',"quickSkill.mcpJsonEmpty":"No valid MCP server entries detected","quickSkill.mcpJsonParseFailed":"JSON parse failed: {{error}}","quickSkill.mcpJsonValueNotObject":'"{{name}}" value must be an object',"quickSkill.mcpJsonMissingField":'"{{name}}" is missing command or baseUrl field',"quickSkill.mcpWritten":"MCPorter config saved","quickSkill.mcpAdded":"Added {{label}} to MCPorter config","quickSkill.mcpWriteFailed":"Write failed","quickSkill.mcpAddFailed":"Add failed","quickSkill.mcporterConfigured":"MCPorter Configured","quickSkill.statusNormal":"OK","quickSkill.statusNormalWithTools":"OK · {{count}} tools","feishu.pluginInstalled":"Feishu plugin installed. Instance will restart to load it.","feishu.pluginFailed":"Feishu plugin installation failed","weixin.pluginInstalled":"WeChat plugin installed. Instance will restart to load it.","weixin.pluginFailed":"WeChat plugin installation failed","feishu.installing":"Installing Feishu plugin...","weixin.installing":"Installing WeChat plugin...","feishu.waitingInstall":"Feishu plugin is installing, please wait","weixin.waitingInstall":"WeChat plugin is installing, please wait","qr.gettingQr":"Getting QR code...","qr.getFailed":"Failed to get QR code","qr.scanFeishu":"Scan with Feishu or Lark","qr.scanWeixin":"Scan with WeChat","qr.loginSuccess":"Login successful!","qr.expired":"QR code expired","qr.refreshed":"QR code refreshed. Please scan again.","qr.scaned":"Scanned. Please confirm on your phone...","qr.credSaved":"Credentials saved. Restart instance to apply.","qr.feishuTitle":"Feishu / Lark Login","qr.weixinTitle":"WeChat ClawBot Login","qr.retry":"Retry","config.modified":"Config modified. Save to apply.","config.discard":"Discard changes","config.form":"Form","config.json":"JSON","config.jsonHelp":"JSON Editing Notes","config.jsonHelp1":'API Key is at <code class="bg-[#0066FF]/10 px-1 rounded">x-jishushell.proxy.upstream.apiKey</code>. Saved keys are hidden; leave empty to keep current.',"config.jsonHelp2":'<code class="bg-[#0066FF]/10 px-1 rounded">models.providers</code> is auto-rewritten to built-in proxy config on save. Do not edit manually.',"config.jsonHelp3":"Use Form mode for model/provider changes. JSON mode is for fine-tuning channels, plugins, etc.","config.saving":"Saving...","config.save":"Save","config.processing":"Processing...","config.saveAndRestart":"Save & Restart","config.savedAndRestarted":"Config saved and restarted","config.savedButRestartFailed":"Config saved, but restart failed: {{error}}","config.restartFailed":"Restart failed: {{error}}","config.saved":"Config saved","config.jsonError":"Invalid JSON","config.jsonParseError":"Invalid JSON: {{error}}","config.unsavedWarning":"Config has unsaved changes. Leave anyway?","config.presetAdded":"Preset added. Fill in required fields and save.","config.navigatingToConfig":"Navigating to config. Preset will be auto-filled.","delete.title":"Delete Instance","delete.warning":'This will delete all config and data for <strong class="text-foreground">{{name}}</strong>. This cannot be undone.',"delete.warningBefore":"This will delete all config and data for ","delete.warningAfter":". This cannot be undone.","delete.confirmHint":"Type the instance name to confirm:","delete.confirm":"Delete","delete.failed":"Delete failed","delete.skillConfirm":'Delete Skill "{{name}}"?',"delete.mcpConfirm":'Delete MCP "{{name}}"?',"logs.searchPlaceholder":"Search logs...","logs.empty":"No logs yet","logs.copied":"Copied","logs.copyFailed":"Copy failed","usage.noTokenData":"The current model provider does not return token usage data. Message counts are still valid.","usage.messages":"Messages","usage.totalTokens":"Total Tokens","usage.totalCost":"Total Cost","usage.sessions":"Sessions","usage.noSessions":"No session data","usage.time":"Time","usage.model":"Model","usage.source":"Source","usage.messagesShort":"Messages","usage.input":"Input","usage.output":"Output","usage.tokens":"Total Tokens","usage.cost":"Cost","chat.notReady":"Chat service not ready","chat.startHint":"Start the instance first. Chat will load automatically.","chat.startInstance":"Start Instance","chat.waitingGateway":"Waiting for gateway...","status.gatewayPending":"Gateway pending","chat.loadingChat":"Loading chat interface...","update.confirm":`Upgrade JishuShell {{currentVersion}} → {{latestVersion}}?
16
- The panel will restart automatically. Please refresh manually.`,"update.started":"Upgrade started. Panel will restart shortly.","update.restarting":"The new version is installed. Waiting for the panel to restart…","update.completed":"Upgrade complete: JishuShell {{latestVersion}} is ready","update.failed":"Upgrade failed","update.refreshPrompt":"JishuShell has been upgraded to {{latestVersion}}. Refresh the page to apply the update now?","update.found":"New version available:","update.upgrading":"Upgrading…","update.upgradeNow":"Upgrade Now",gatewayLaunchFailed:st,"configForm.modelConfig":"Model Config","configForm.imChannelConfig":"IM Channel Config","configForm.proxyChain":"Built-in Proxy Chain","configForm.proxyChainDesc":"OpenClaw uses `jsproxy/default`. The real upstream API Key is only stored on the proxy side.","configForm.proxyAddress":"Proxy address:","configForm.notConfigured":"Not configured","configForm.proxyStatus":"Proxy status:","configForm.running":"Running","configForm.notRunning":"Not running","configForm.virtualKeyLabel":"Instance virtual key:","configForm.generated":"Generated","configForm.notGenerated":"Not generated","configForm.editModelConfig":"Edit Model Config","configForm.upstreamProvider":"Upstream Provider","configForm.upstreamProviderHint":"This configures the real provider behind the built-in proxy, not the provider OpenClaw connects to directly","configForm.selectProvider":"Select upstream provider","configForm.custom":"(custom)","configForm.switchProviderConfirm":"Switching provider will clear the entered API Key. Continue?","configForm.upstreamApiKey":"Upstream API Key","configForm.apiKeyHintSaved":"Saved on proxy side. Leave empty to keep current.","configForm.apiKeyHintNew":"Get from the real provider platform","configForm.enterApiKey":"Enter API Key","configForm.markedForClear":"Marked for clearing","configForm.clearSavedApiKey":"Clear saved API Key","configForm.upstreamModel":"Upstream Default Model","configForm.upstreamModelHint":"Recommended model auto-selected. Change here if needed.","configForm.modelId":"Model ID","configForm.modelIdHint":"Required, e.g. llama3, qwen2.5:7b","configForm.modelName":"Model Name","configForm.modelNamePlaceholder":"Optional, defaults to Model ID","configForm.contextWindow":"Context Window","configForm.collapseAdvanced":"Collapse advanced","configForm.advancedOptions":"Advanced Options","configForm.upstreamBaseUrl":"Upstream Base URL","configForm.baseUrlPlaceholder":"API address","configForm.upstreamApiProtocol":"Upstream API Protocol","configForm.localServiceAddress":"Local service address","configForm.providerGroup.国内厂商":"China Providers","configForm.providerGroup.国际厂商":"International","configForm.providerGroup.推理加速":"Inference Acceleration","configForm.providerGroup.聚合平台":"Aggregation Platforms","configForm.providerGroup.本地部署":"Local Deployment","configForm.providerLabel.minimax":"MiniMax (China)","configForm.providerLabel.minimax-intl":"MiniMax (Intl)","configForm.providerLabel.moonshot-coding":"Kimi (Coding Plan)","configForm.providerLabel.moonshot-intl":"Kimi (Intl)","configForm.providerLabel.zhipu":"ZhipuAI (GLM)","configForm.providerLabel.zhipu-intl":"Z.AI (GLM)","configForm.providerLabel.volcengine":"Volcengine (Doubao)","configForm.providerLabel.qianfan":"Baidu Qianfan (ERNIE)","configForm.providerLabel.dashscope":"Alibaba Bailian","configForm.providerLabel.modelstudio":"Alibaba Bailian (Intl/Coding)","configForm.providerLabel.tencent":"Tencent Hunyuan","configForm.providerLabel.stepfun":"StepFun","configForm.providerLabel.baichuan":"Baichuan","configForm.providerLabel.xiaomi":"MiMo (Xiaomi)","configForm.providerLabel.byteplus":"Volcengine Intl (Doubao)","configForm.providerLabel.spark":"iFlytek Spark","configForm.providerLabel.siliconflow":"SiliconFlow","configForm.providerLabel.infini":"Infini-AI","configForm.providerLabel.ollama":"Ollama (Local)","configForm.providerLabel.vllm":"vLLM (Local)","configForm.providerLabel.sglang":"SGLang (Local)","channel.feishu":"Feishu / Lark","channel.weixin":"WeChat","configForm.channel.feishu":"Feishu / Lark","configForm.channel.openclaw-weixin":"WeChat","configForm.channel.telegram":"Telegram","configForm.channel.discord":"Discord","configForm.channel.slack":"Slack","configForm.channel.whatsapp":"WhatsApp","configForm.channel.msteams":"Microsoft Teams","configForm.channel.signal":"Signal","configForm.channel.line":"LINE","configForm.channel.googlechat":"Google Chat","configForm.apiProtocol":"API Protocol","configForm.proxyNote":"OpenClaw's actual provider is auto-rewritten to `jsproxy/default` on save. These advanced settings only affect the real upstream connection behind the built-in proxy.","configForm.hint.moonshot-coding":"Uses Anthropic-compatible API for Kimi K2 series models, optimized for Coding/Agent scenarios. Recommended: kimi-k2-thinking-turbo (fast thinking) or kimi-k2.5 (all-round multimodal).","configForm.hint.volcengine":"Volcengine requires creating an inference endpoint in the console first. Enter the endpoint ID in the Model ID field below.","configForm.hint.byteplus":"BytePlus requires creating an Endpoint in the console first. Enter the Endpoint ID in the Model ID field below.","configForm.hint.openrouter":"OpenRouter aggregates multiple models. Auto routes to the best model. Get API Key from openrouter.ai/keys.","configForm.hint.ollama":"Make sure Ollama is running and enter the actual model name below.","configForm.hint.vllm":"Make sure vLLM is running and enter the actual model name below.","configForm.hint.sglang":"Make sure SGLang is running and enter the actual model name below.","configForm.sessionIsolation":"Session Isolation","configForm.sessionIsolationHint":"Controls whether different users and channels share conversation context","configForm.sessionMain":"Shared conversation for all","configForm.sessionPerPeer":"Separate conversation per user","configForm.sessionPerChannelPeer":"Separate per user per channel","configForm.sessionPerAccountChannelPeer":"Separate per user per account per channel","configForm.pluginInstalling":"{{label}} plugin installing...","configForm.installPlugin":"Install {{label}} plugin","configForm.installPluginHint":"Install plugin to configure {{label}} channel","configForm.remove":"Remove","configForm.addImChannel":"Add IM Channel","configForm.whatsappTitle":"WhatsApp pairs via QR code","configForm.whatsappHint":"After enabling and starting the instance, check the Logs tab for the QR code. Scan with your phone's WhatsApp. Credentials are auto-saved after first pairing.","configForm.feishu.platform":"Platform: {{platform}}. Credentials saved. Restart instance to apply.","configForm.feishu.platformLark":"Lark (International)","configForm.feishu.platformFeishu":"Feishu","configForm.feishu.added":"Added","configForm.feishu.addBot":"Add Feishu / Lark Bot","configForm.feishu.addBotHint":"Scan with Feishu or Lark app to auto-create and configure a bot. Platform is auto-detected.","configForm.feishu.gettingQr":"Getting QR code...","configForm.feishu.scanHint":"Scan with Feishu or Lark","configForm.feishu.cancel":"Cancel","configForm.feishu.refresh":"Refresh","configForm.weixin.accountId":"Account ID:","configForm.weixin.restartHint":"Save and restart instance to apply. Scan again to add more accounts.","configForm.weixin.addAnother":"Add another WeChat account","configForm.weixin.added":"Added","configForm.weixin.addClawBot":"Add WeChat ClawBot","configForm.weixin.addClawBotHint":"Click to show QR code, scan with WeChat. {{extra}}","configForm.weixin.addClawBotHintRestart":"Save and restart to apply.","configForm.weixin.addClawBotHintMulti":"Supports multiple accounts.","configForm.weixin.gettingQr":"Getting QR code...","configForm.weixin.scanHint":"Scan with WeChat","configForm.weixin.cancel":"Cancel","configForm.weixin.refresh":"Refresh","config.clickToEdit":"Click to enter new value","backup.manageMenu":"Backup Manager","backup.autoBackup":"Auto Backup","backup.autoEnabled":"Auto backup enabled","backup.autoDisabled":"Auto backup disabled","backup.notConfigured":"Auto backup not enabled","backup.enableNow":"Enable Now","backup.enabling":"Enabling...","backup.interval":"Every {{h}}h","backup.keep":"Keep {{n}}","backup.failed":"Failed","backup.manageTitle":"Backup Manager","backup.noBackups":"No backups yet","backup.typeAuto":"Auto","backup.typeManual":"Manual","backup.typePreRestore":"Pre-restore","backup.restore":"Restore","backup.createNew":"Create new instance","backup.download":"Download","backup.delete":"Delete","backup.createNew2":"New Backup","backup.create":"Backup","backup.createTitle":"Create Backup","backup.createDesc":"Back up the instance config, plugins and data.","backup.includeSessions":"Include conversation history (larger size)","backup.creating":"Backing up...","backup.created":"Backup Complete","backup.deleted":"Deleted","backup.processing":"Processing...","backup.queueNote":"Tasks run in sequence","backup.restoreTitle":"Restore will overwrite current data","backup.restoreDesc":"A pre-restore backup has been created automatically. You can roll back if needed.","backup.restoreConfirmLabel":"Type instance name to confirm:","backup.confirmRestore":"Confirm Restore","backup.restoring":"Restoring...","backup.restoreSuccess":"Restore Complete","backup.restoreOk":"Instance restored.","backup.restoreFailed":"Restore Failed","backup.restoreFailedRolledBack":"Restore Failed — Auto Rolled Back","backup.apiKeyLost":"Backup was built on a different platform/arch; verify the API Key configuration still matches this host.","backup.configApiKey":"Configure API Key","backup.createFromTitle":"Create Instance from Backup","backup.newName":"New Instance Name","backup.newNamePlaceholder":"My Agent Copy","backup.newId":"New Instance ID","backup.newIdPlaceholder":"my-agent-copy","backup.createFromNote":"API Key and IM credentials will not be copied.","backup.createInstance":"Create","backup.createFromBackupOk":"New instance created","backup.createFromBackupFail":"Failed to create instance","backup.export":"Export (Share)","backup.exportTitle":"Export (Share)","backup.exportDesc":"Generate a shareable package. API keys and credentials will be removed.","backup.exportConfig":"Config (openclaw.json, scrubbed)","backup.exportPlugins":"Plugins (extensions)","backup.exportWorkspace":"Workspace / Skills","backup.exportNoKeys":"API Key / Credentials — Removed","backup.exportIncludeSessions":"Include conversation history","backup.exportBtn":"Export","backup.exporting":"Exporting...","backup.exportDone":"Export Complete","backup.downloadExport":"Download","backup.scopeFull":"Full backup (with runtime)","backup.scopeState":"Data only (smaller, portable)","backup.scopeFullDesc":"Includes upgraded OpenClaw runtime — restore preserves the exact version you have now","backup.scopeStateDesc":"Only .openclaw/ data — smaller, compatible with official OpenClaw format","clone.preview":"Will copy the following:","clone.config":"Agent Config (openclaw.json)","clone.plugins":"Plugins (extensions)","clone.workspace":"Workspace / Skills / Persona Files","clone.apikey":"API Key Config","clone.memory":"Agent Memory","clone.sessions":"Conversation History","clone.channelNote":"IM channel credentials will not be copied (same channel cannot bind multiple instances)","import.title":"Import OpenClaw Instance from File","import.uploadDesc":"Upload a .tar.gz file (JishuShell export, backup, or OpenClaw official backup)","import.upload":"Upload & Preview","import.uploading":"Uploading...","import.name":"Name","import.type":"Type","import.size":"Size","import.platform":"Platform","import.noSessions":"No conversation history","import.create":"Create Instance","import.creating":"Creating instance...","import.success":"Import Successful"},lt="Configure Environment",ct="Version too old",dt="Required",ut="Resuming task: {{label}}...",pt="Task failed",mt="{{label}} completed",gt="Failed to get {{label}} task status",ft="{{label}} timed out (over 10 minutes), please check backend logs",ht="Installing {{label}}...",kt="{{label}} started",bt="{{label}} installation failed: {{error}}",vt="Installation failed",xt="Docker image build",wt="Docker installation",yt="OpenClaw installation",St="Configuring Nomad systemd service...",Ft="Nomad service started",Ct="Nomad started",Pt="Nomad start failed: {{error}}",It="Waiting for Nomad to be ready...",jt="Nomad is ready",Nt="Config write failed",Lt="Save failed",At="{{label}} failed: {{message}}",Tt={title:lt,"steps.check":"Check","steps.modelConfig":"Model Config","steps.done":"Done",versionTooOld:ct,required:dt,resumeTask:ut,taskFailed:pt,taskCompleted:mt,taskStatusFailed:gt,taskTimeout:ft,installing:ht,taskStarted:kt,installFailed:bt,defaultInstallFailed:vt,dockerImageBuild:xt,dockerInstall:wt,openclawInstall:yt,configuringNomadSystemd:St,nomadServiceStarted:Ft,nomadStarted:Ct,nomadStartFailed:Pt,waitingNomad:It,nomadReady:jt,configWriteFailed:Nt,saveFailed:Lt,"check.title":"Environment Check","check.desc":"Check installed system components","check.requiredComponents":"Required Components","check.upgrading":"Upgrading...","check.upgrade":"Upgrade","node.title":"Upgrade Node.js","node.desc":"OpenClaw requires Node.js 22+, current version is too old","node.ready":"Node.js is ready ({{version}})","node.currentVersion":"Current version {{version}}, needs upgrade to 22+","node.noSudo":"Current version {{version}}, needs upgrade to 22+, but current user lacks sudo privileges","node.upgrading":"Upgrading...","node.upgradeBtn":"Upgrade Node.js","node.sudoRequired":"Requires sudo privileges, installs via NodeSource","node.contactAdmin":"Please ask an administrator to run the following command:","node.refreshAfterInstall":"Click to refresh after installation","docker.title":"Install Docker","docker.desc":"Container runtime for running OpenClaw instances in isolation","docker.running":"Docker is running ({{version}})","docker.notRunning":"Docker is installed but the service is not running, please start the Docker service","docker.refreshAfterStart":"Click to refresh after starting","docker.installing":"Installing, please wait...","docker.installBtn":"Install Docker","docker.sudoRequired":"Requires sudo privileges, may take a few minutes","docker.noSudo":"Current user lacks sudo privileges, cannot install automatically","docker.contactAdmin":"Please ask an administrator to run the following command:","docker.refreshAfterInstall":"Click to refresh after installation","nomad.title":"Install Nomad","nomad.desc":"Orchestration engine for managing OpenClaw container lifecycle","nomad.running":"Nomad is running ({{version}})","nomad.starting":"Nomad is installed, starting...","nomad.installing":"Installing...","nomad.installBtn":"Install Nomad","openclaw.title":"Install OpenClaw","openclaw.desc":"AI agent runtime, the core component of JishuShell","openclaw.installed":"OpenClaw is installed ({{version}})","openclaw.buildingImage":"Building Docker image, first build may take a few minutes...","openclaw.buildImageBtn":"Build Docker Image","openclaw.installing":"Installing, please wait...","openclaw.installBtn":"Install OpenClaw","openclaw.npmHint":"Installs via npm, requires network connection","done.finalizing":"Finalizing configuration...","done.finalizingDesc":"Writing system configuration, please wait","done.complete":"Environment setup complete","done.completeDesc":"Base environment is ready","provider.title":"Configure Default Model","provider.desc":"New instances will use this configuration by default, can be changed in instance details anytime","provider.label":"Model Provider","provider.placeholder":"Select a provider","provider.apiKey":"API Key","provider.apiKeyPlaceholder":"Enter API Key","provider.baseUrl":"Service URL","provider.fetchModels":"Fetch Models","provider.fetchingModels":"Fetching…","provider.liveModels":"live models","provider.fetchModelsFailed":"Failed to fetch model list","provider.defaultModel":"Default Model","provider.skip":"Skip","provider.saving":"Saving...","provider.save":"Save","provider.saved":"Model configuration saved","provider.saveFailed":"Save failed","provider.apiKeyConfigured":"•••••••• (Configured)","provider.saveAndContinue":"Save & Continue","nav.next":"Next","nav.retry":"Retry","nav.enterPanel":"Enter Panel",taskErrorPrefix:At},Ot={"im.feishu.desc":"Feishu bot (WebSocket mode)","im.openclaw-weixin.desc":"WeChat QR code login","skills.group.hubs":"Popular Hubs","skills.group.general":"General","skills.group.productivity":"Productivity","skills.group.life":"Life Assistant","skills.group.dev":"Dev Tools","skills.clawhub.desc":"Official OpenClaw Skill marketplace","skills.skillhub-tencent.label":"Tencent SkillHub","skills.skillhub-tencent.desc":"Tencent's official skill center","skills.skills-sh.desc":"Community skill aggregator","skills.skill-vetter.desc":"Security audit skill — review before installing","skills.self-improving-agent.desc":"Self-improving agent for continuous task optimization","skills.proactive-agent.desc":"Proactive agent that anticipates and completes tasks","skills.multi-search-engine.desc":"Multi search engine aggregation","skills.exa-web-search-free.desc":"Free Exa semantic web search","skills.lobehub-skills.label":"LobeHub Skills","skills.lobehub-skills.desc":"LobeHub community Skill marketplace","skills.findskills.label":"FindSkills.org","skills.findskills.desc":"Open-source skill search and aggregation platform","skills.playbooks-skills.label":"Playbooks Skills","skills.playbooks-skills.desc":"Playbooks community Skill directory","skills.pdf-reader.label":"PDF Reader","skills.pdf-reader.desc":"PDF document reading and analysis","skills.powerpoint-pptx.label":"PowerPoint / PPTX","skills.powerpoint-pptx.desc":"PowerPoint presentation generation and editing","skills.word-docx.label":"Word / DOCX","skills.word-docx.desc":"Word document generation and editing","skills.excel-xlsx.label":"Excel / XLSX","skills.excel-xlsx.desc":"Excel spreadsheet generation and data processing","skills.todo-manager.label":"Todo Manager","skills.todo-manager.desc":"Task and todo list management","skills.12306.label":"12306 Train Tickets","skills.12306.desc":"Search and book 12306 train tickets","skills.youtube-watcher.label":"YouTube Watcher","skills.youtube-watcher.desc":"YouTube video summaries and content analysis","skills.cli-developer.label":"CLI Developer","skills.cli-developer.desc":"Command-line tool development assistant","skills.home-assistant.label":"Home Assistant","skills.home-assistant.desc":"Home Assistant smart home integration","mcp.12306-mcp.label":"12306 Train Ticket MCP","mcp.12306-mcp.desc":"12306 train ticket search tool","slash.group.会话":"Sessions","slash.group.模型":"Models","slash.group.工具":"Tools","slash.slash-new.desc":"Start new session","slash.slash-reset.desc":"Reset current session","slash.slash-compact.desc":"Compress session context","slash.slash-stop.desc":"Stop current execution","slash.slash-clear.desc":"Clear chat history","slash.slash-focus.desc":"Toggle focus mode","slash.slash-model.desc":"View or switch model","slash.slash-think.desc":"Set thinking depth","slash.slash-verbose.desc":"Toggle verbose output","slash.slash-fast.desc":"Toggle fast mode","slash.slash-help.desc":"Show available commands","slash.slash-status.desc":"Show session status (agent)","slash.slash-export.desc":"Export session as Markdown","slash.slash-usage.desc":"Show token usage"},Dt=localStorage.getItem("jishushell-lang")||(navigator.language.startsWith("zh")?"zh":"en");Ae.use(Te).init({resources:{zh:{common:Be,dashboard:Ve,auth:We,settings:He,newInstance:Ze,instance:dn,setup:Mn,data:En},en:{common:Rn,dashboard:Un,auth:$n,settings:Kn,newInstance:Xn,instance:rt,setup:Tt,data:Ot}},lng:Dt,fallbackLng:"zh",defaultNS:"common",interpolation:{escapeValue:!1}});const Mt="modulepreload",Et=function(e){return"/"+e},Z={},L=function(t,o,l){let d=Promise.resolve();if(o&&o.length>0){document.getElementsByTagName("link");const r=document.querySelector("meta[property=csp-nonce]"),s=(r==null?void 0:r.nonce)||(r==null?void 0:r.getAttribute("nonce"));d=Promise.allSettled(o.map(u=>{if(u=Et(u),u in Z)return;Z[u]=!0;const b=u.endsWith(".css"),m=b?'[rel="stylesheet"]':"";if(document.querySelector(`link[href="${u}"]${m}`))return;const g=document.createElement("link");if(g.rel=b?"stylesheet":Mt,b||(g.as="script"),g.crossOrigin="",g.href=u,s&&g.setAttribute("nonce",s),document.head.appendChild(g),b)return new Promise((v,x)=>{g.addEventListener("load",v),g.addEventListener("error",()=>x(new Error(`Unable to preload CSS for ${u}`)))})}))}function a(r){const s=new Event("vite:preloadError",{cancelable:!0});if(s.payload=r,window.dispatchEvent(s),!s.defaultPrevented)throw r}return d.then(r=>{for(const s of r||[])s.status==="rejected"&&a(s.reason);return t().catch(a)})},U="/api";let A=null;function le(){return A}function Rt(e){A=e}function ce(){A=null,fetch(`${U}/auth/logout`,{method:"POST",credentials:"same-origin"}).catch(()=>{})}async function i(e,t={}){const o=le(),l={...t.headers||{}};t.body&&(l["Content-Type"]="application/json"),o&&(l.Authorization=`Bearer ${o}`);const d=new AbortController,a=setTimeout(()=>d.abort(),6e4);let r;try{r=await fetch(`${U}${e}`,{...t,headers:l,credentials:"same-origin",signal:d.signal})}catch(s){throw clearTimeout(a),s.name==="AbortError"?new Error("Request timeout"):s}if(clearTimeout(a),r.status===401)throw A=null,window.location.pathname!=="/login"&&(window.dispatchEvent(new CustomEvent("jishushell:auth-expired")),window.location.replace("/login")),new Error("Unauthorized");if(!r.ok){const s=await r.json().catch(()=>({}));throw new Error(s.message||s.error||s.detail||`HTTP ${r.status}`)}return r.status===204||r.headers.get("content-length")==="0"?null:r.json()}async function de(){try{const e={};return A&&(e.Authorization=`Bearer ${A}`),(await fetch(`${U}/instances`,{headers:e,credentials:"same-origin"})).ok}catch{return!1}}const ue=()=>i("/auth/status"),qt=e=>i("/auth/init",{method:"POST",body:JSON.stringify({password:e})}),Bt=e=>i("/auth/login",{method:"POST",body:JSON.stringify({password:e})}),Ut=(e,t)=>i("/auth/change-password",{method:"POST",body:JSON.stringify({old_password:e,new_password:t})}),pe=()=>i("/instances"),$t=e=>i(`/instances/${e}`),Vt=e=>i(`/instances/${e}/gateway-launch`),Wt=e=>i("/instances",{method:"POST",body:JSON.stringify(e)}),Kt=(e,t=!1)=>i(`/instances/${e}${t?"?purge_backups=true":""}`,{method:"DELETE"}),_t=e=>i(`/instances/${e}/config`),Ht=(e,t)=>i(`/instances/${e}/config`,{method:"PUT",body:JSON.stringify(t)}),Jt=e=>i(`/instances/${e}/plugins/status`),zt=(e,t)=>i(`/instances/${e}/plugins/install`,{method:"POST",body:JSON.stringify({channelId:t})}),Gt=(e,t)=>i(`/instances/${e}/feishu/login`,{method:"POST",body:JSON.stringify({channelKey:t||"feishu"})}),Qt=(e,t)=>i(`/instances/${e}/feishu/login/${t}`),Xt=e=>i(`/instances/${e}/weixin/accounts`),Yt=e=>i(`/instances/${e}/weixin/login`,{method:"POST"}),Zt=(e,t)=>i(`/instances/${e}/weixin/login/${t}`),eo=e=>i(`/instances/${e}/service/start`,{method:"POST"}),no=e=>i(`/instances/${e}/service/stop`,{method:"POST"}),to=e=>i(`/instances/${e}/service/restart`,{method:"POST"}),oo=e=>i(`/instances/${e}/quick-status`),ao=e=>i(`/instances/${e}/mcporter/list`),io=(e,t)=>i(`/instances/${e}/mcporter/add`,{method:"POST",body:JSON.stringify({servers:t})}),so=(e,t)=>i(`/instances/${e}/mcporter/${encodeURIComponent(t)}`,{method:"DELETE"}),ro=(e,t)=>i(`/instances/${e}/skills/${encodeURIComponent(t)}`,{method:"DELETE"}),lo=(e,t=200,o="stderr")=>i(`/instances/${e}/logs?lines=${t}&log_type=${o}`),co=e=>i(`/instances/${e}/usage`),me=()=>i("/system/status"),uo=()=>i("/system/restart-nomad",{method:"POST"}),ge=()=>i("/system/update-check"),W=()=>i("/system/update-status"),fe=()=>i("/system/update",{method:"POST"}),he=()=>{const e={},t=le();return t&&(e.Authorization=`Bearer ${t}`),fetch(`${U}/setup/status`,{headers:e,credentials:"same-origin"}).then(o=>o.json())},po=e=>i(`/setup/install/${e}`,{method:"POST"}),mo=e=>i(`/setup/start/${e}`,{method:"POST"}),go=()=>i("/setup/upgrade/node",{method:"POST"}),fo=e=>i("/setup/install/all",{method:"POST",body:JSON.stringify(e||{})}),ho=e=>i("/setup/default-provider",{method:"POST",body:JSON.stringify(e)}),ko=e=>i(`/setup/tasks/${e}`),bo=()=>i("/llm/providers"),vo=e=>i("/llm/providers",{method:"POST",body:JSON.stringify(e)}),xo=(e,t)=>i(`/llm/providers/${encodeURIComponent(e)}`,{method:"PUT",body:JSON.stringify(t)}),wo=e=>i(`/llm/providers/${encodeURIComponent(e)}`,{method:"DELETE"}),yo=e=>i(`/llm/providers/${encodeURIComponent(e)}/default`,{method:"POST"}),So=e=>i(`/llm/providers/${encodeURIComponent(e)}/models`),Fo=(e,t,o)=>i("/llm/probe-models",{method:"POST",body:JSON.stringify({baseUrl:e,apiKey:t,authHeader:o})}),Co=e=>i(`/instances/${e}/backups`),Po=(e,t)=>i(`/instances/${e}/backup`,{method:"POST",body:JSON.stringify(t||{})}),Io=(e,t)=>`/api/instances/${e}/backup/download/${encodeURIComponent(t)}`,jo=(e,t)=>i(`/instances/${e}/backups/${encodeURIComponent(t)}`,{method:"DELETE"}),No=(e,t)=>i(`/instances/${e}/restore/${encodeURIComponent(t)}`,{method:"POST"}),Lo=e=>i("/instances/create-from-backup",{method:"POST",body:JSON.stringify(e)}),Ao=()=>i("/backups/orphaned"),To=(e,t)=>i(`/instances/${e}/export`,{method:"POST",body:JSON.stringify(t||{})}),Oo=(e,t)=>`/api/instances/${e}/export/download/${encodeURIComponent(t)}`,Do=async e=>{const t=new FormData;t.append("file",e);const o=await fetch("/api/instances/import/upload",{method:"POST",body:t});if(!o.ok){const l=await o.json().catch(()=>({detail:o.statusText}));throw new Error(l.detail||"Upload failed")}return o.json()},Mo=e=>i("/instances/import/preview",{method:"POST",body:JSON.stringify({temp_id:e})}),Eo=e=>i("/instances/import",{method:"POST",body:JSON.stringify(e)}),Ro=e=>i(`/instances/${e}/auto-backup`),qo=(e,t)=>i(`/instances/${e}/auto-backup`,{method:"PUT",body:JSON.stringify(t)}),Bo=e=>i(`/backup/jobs/${e}`),Sa=Object.freeze(Object.defineProperty({__proto__:null,addLlmProvider:vo,addMcporterServers:io,authChangePassword:Ut,authInit:qt,authLogin:Bt,authStatus:ue,checkSession:de,checkUpdate:ge,clearToken:ce,confirmImport:Eo,createBackup:Po,createExport:To,createFromBackup:Lo,createInstance:Wt,deleteBackup:jo,deleteInstance:Kt,deleteLlmProvider:wo,deleteMcporterServer:so,deleteSkill:ro,downloadBackupUrl:Io,downloadExportUrl:Oo,getAutoBackupConfig:Ro,getBackupJob:Bo,getConfig:_t,getGatewayLaunch:Vt,getInstance:$t,getLlmModels:So,getLogs:lo,getMcporterList:ao,getPluginStatuses:Jt,getQuickStatus:oo,getSetupStatus:he,getSetupTask:ko,getSystemStatus:me,getUpdateStatus:W,getUsage:co,getWeixinAccounts:Xt,installDep:po,installPlugin:zt,listBackups:Co,listInstances:pe,listLlmProviders:bo,listOrphanedBackups:Ao,pollFeishuLogin:Qt,pollWeixinLogin:Zt,previewImport:Mo,probeModels:Fo,restartNomad:uo,restartService:to,restoreFromBackup:No,runFullSetup:fo,runUpdate:fe,saveConfig:Ht,saveDefaultProvider:ho,setDefaultLlmProvider:yo,setToken:Rt,startDep:mo,startFeishuLogin:Gt,startService:eo,startWeixinLogin:Yt,stopService:no,updateAutoBackupConfig:qo,updateLlmProvider:xo,upgradeNode:go,uploadForImport:Do},Symbol.toStringTag,{value:"Module"}));function Fa({className:e="w-4 h-4"}){return n.jsx("svg",{className:e,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:2,strokeLinecap:"round",strokeLinejoin:"round",children:n.jsx("path",{d:"M6 9l6 6 6-6"})})}function Ca({className:e="w-4 h-4"}){return n.jsx("svg",{className:e,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:2,strokeLinecap:"round",strokeLinejoin:"round",children:n.jsx("path",{d:"M9 18l6-6-6-6"})})}function Uo({className:e="w-4 h-4"}){return n.jsxs("svg",{className:e,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:2,strokeLinecap:"round",strokeLinejoin:"round",children:[n.jsx("line",{x1:"12",y1:"5",x2:"12",y2:"19"}),n.jsx("line",{x1:"5",y1:"12",x2:"19",y2:"12"})]})}function $o({className:e="w-4 h-4"}){return n.jsxs("svg",{className:e,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:1.5,strokeLinecap:"round",strokeLinejoin:"round",children:[n.jsx("path",{d:"M12.22 2h-.44a2 2 0 0 0-2 2v.18a2 2 0 0 1-1 1.73l-.43.25a2 2 0 0 1-2 0l-.15-.08a2 2 0 0 0-2.73.73l-.22.38a2 2 0 0 0 .73 2.73l.15.1a2 2 0 0 1 1 1.72v.51a2 2 0 0 1-1 1.74l-.15.09a2 2 0 0 0-.73 2.73l.22.38a2 2 0 0 0 2.73.73l.15-.08a2 2 0 0 1 2 0l.43.25a2 2 0 0 1 1 1.73V20a2 2 0 0 0 2 2h.44a2 2 0 0 0 2-2v-.18a2 2 0 0 1 1-1.73l.43-.25a2 2 0 0 1 2 0l.15.08a2 2 0 0 0 2.73-.73l.22-.39a2 2 0 0 0-.73-2.73l-.15-.08a2 2 0 0 1-1-1.74v-.5a2 2 0 0 1 1-1.74l.15-.09a2 2 0 0 0 .73-2.73l-.22-.38a2 2 0 0 0-2.73-.73l-.15.08a2 2 0 0 1-2 0l-.43-.25a2 2 0 0 1-1-1.73V4a2 2 0 0 0-2-2z"}),n.jsx("circle",{cx:"12",cy:"12",r:"3"})]})}function Vo({className:e="w-4 h-4"}){return n.jsxs("svg",{className:e,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:1.5,strokeLinecap:"round",strokeLinejoin:"round",children:[n.jsx("path",{d:"M9 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h4"}),n.jsx("polyline",{points:"16 17 21 12 16 7"}),n.jsx("line",{x1:"21",y1:"12",x2:"9",y2:"12"})]})}function Wo({className:e="w-5 h-5"}){return n.jsxs("svg",{className:e,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:1.5,strokeLinecap:"round",strokeLinejoin:"round",children:[n.jsx("line",{x1:"4",y1:"6",x2:"20",y2:"6"}),n.jsx("line",{x1:"4",y1:"12",x2:"20",y2:"12"}),n.jsx("line",{x1:"4",y1:"18",x2:"20",y2:"18"})]})}function Ko({className:e="w-5 h-5"}){return n.jsxs("svg",{className:e,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:1.5,strokeLinecap:"round",strokeLinejoin:"round",children:[n.jsx("line",{x1:"18",y1:"6",x2:"6",y2:"18"}),n.jsx("line",{x1:"6",y1:"6",x2:"18",y2:"18"})]})}function Pa({className:e="w-4 h-4"}){return n.jsx("svg",{className:e,viewBox:"0 0 24 24",fill:"currentColor",children:n.jsx("polygon",{points:"5 3 19 12 5 21 5 3"})})}function Ia({className:e="w-4 h-4"}){return n.jsx("svg",{className:e,viewBox:"0 0 24 24",fill:"currentColor",children:n.jsx("rect",{x:"4",y:"4",width:"16",height:"16",rx:"2"})})}function ja({className:e="w-4 h-4"}){return n.jsxs("svg",{className:e,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:1.5,strokeLinecap:"round",strokeLinejoin:"round",children:[n.jsx("polyline",{points:"23 4 23 10 17 10"}),n.jsx("path",{d:"M20.49 15a9 9 0 1 1-2.12-9.36L23 10"})]})}function Na({className:e="w-4 h-4"}){return n.jsxs("svg",{className:e,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:1.5,strokeLinecap:"round",strokeLinejoin:"round",children:[n.jsx("rect",{x:"9",y:"9",width:"13",height:"13",rx:"2",ry:"2"}),n.jsx("path",{d:"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"})]})}function La({className:e="w-4 h-4"}){return n.jsxs("svg",{className:e,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:1.5,strokeLinecap:"round",strokeLinejoin:"round",children:[n.jsx("circle",{cx:"11",cy:"11",r:"8"}),n.jsx("line",{x1:"21",y1:"21",x2:"16.65",y2:"16.65"})]})}function Aa({className:e="w-4 h-4"}){return n.jsxs("svg",{className:e,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:1.5,strokeLinecap:"round",strokeLinejoin:"round",children:[n.jsx("path",{d:"M1 12s4-8 11-8 11 8 11 8-4 8-11 8-11-8-11-8z"}),n.jsx("circle",{cx:"12",cy:"12",r:"3"})]})}function Ta({className:e="w-4 h-4"}){return n.jsxs("svg",{className:e,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:1.5,strokeLinecap:"round",strokeLinejoin:"round",children:[n.jsx("path",{d:"M17.94 17.94A10.07 10.07 0 0 1 12 20c-7 0-11-8-11-8a18.45 18.45 0 0 1 5.06-5.94M9.9 4.24A9.12 9.12 0 0 1 12 4c7 0 11 8 11 8a18.5 18.5 0 0 1-2.16 3.19m-6.72-1.07a3 3 0 1 1-4.24-4.24"}),n.jsx("line",{x1:"1",y1:"1",x2:"23",y2:"23"})]})}function Oa({className:e="w-4 h-4"}){return n.jsxs("svg",{className:e,viewBox:"0 0 24 24",fill:"currentColor",children:[n.jsx("circle",{cx:"12",cy:"5",r:"1.5"}),n.jsx("circle",{cx:"12",cy:"12",r:"1.5"}),n.jsx("circle",{cx:"12",cy:"19",r:"1.5"})]})}function Da({className:e="w-4 h-4"}){return n.jsxs("svg",{className:e,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:1.5,strokeLinecap:"round",strokeLinejoin:"round",children:[n.jsx("path",{d:"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"}),n.jsx("polyline",{points:"15 3 21 3 21 9"}),n.jsx("line",{x1:"10",y1:"14",x2:"21",y2:"3"})]})}function _o({className:e="w-4 h-4"}){return n.jsxs("svg",{className:e,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:1.5,strokeLinecap:"round",strokeLinejoin:"round",children:[n.jsx("path",{d:"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4"}),n.jsx("polyline",{points:"7 10 12 15 17 10"}),n.jsx("line",{x1:"12",y1:"15",x2:"12",y2:"3"})]})}function Ho({className:e=""}){const{i18n:t,t:o}=R(),l=t.language==="en",d=()=>{const a=l?"zh":"en";t.changeLanguage(a),localStorage.setItem("jishushell-lang",a)};return n.jsxs("button",{onClick:d,title:o("nav.switchLanguage"),className:`inline-flex items-center justify-center gap-1 px-2 py-1 rounded-md text-xs font-medium text-muted hover:bg-[var(--card)] hover:text-foreground border border-[var(--border)] transition-all duration-200 ${e}`,children:[n.jsxs("svg",{className:"w-3 h-3",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:1.5,strokeLinecap:"round",strokeLinejoin:"round",children:[n.jsx("circle",{cx:"12",cy:"12",r:"10"}),n.jsx("path",{d:"M2 12h20"}),n.jsx("path",{d:"M12 2a15.3 15.3 0 0 1 4 10 15.3 15.3 0 0 1-4 10 15.3 15.3 0 0 1-4-10 15.3 15.3 0 0 1 4-10z"})]}),n.jsx("span",{children:l?"中":"EN"})]})}const Jo="/assets/logo-black-theme-DywLAtFy.png",zo="/assets/logo-white-theme-DXffFAWw.png";function Go({className:e="",alt:t="JishuShell"}){const[o,l]=c.useState(()=>window.matchMedia("(prefers-color-scheme: dark)").matches);return c.useEffect(()=>{const d=window.matchMedia("(prefers-color-scheme: dark)"),a=r=>l(r.matches);return d.addEventListener("change",a),()=>d.removeEventListener("change",a)},[]),n.jsx("img",{src:o?Jo:zo,alt:t,className:e})}const ee=3e4,Qo=15,K="jishushell:self-update:status",_="jishushell:self-update:dismissed-completed-version",H="jishushell:self-update:dismissed-failed-version";function Xo(e,t){const o=b=>b.replace(/^v/,"").split(".").map(m=>Number.parseInt(m,10)||0),[l=0,d=0,a=0]=o(e),[r=0,s=0,u=0]=o(t);return l!==r?l-r:d!==s?d-s:a-u}function Yo(e,t){return Xo(e,t)>=0}function J(e){return e.installedVersion||e.targetVersion||e.currentVersion}function ne(){try{const e=window.sessionStorage.getItem(K);return e?JSON.parse(e):null}catch{return null}}function $(e){try{if(!e||e.status==="failed"){window.sessionStorage.removeItem(K);return}window.sessionStorage.setItem(K,JSON.stringify(e))}catch{}}function Zo(){try{return window.sessionStorage.getItem(H)}catch{return null}}function ea(e){try{if(!e){window.sessionStorage.removeItem(H);return}window.sessionStorage.setItem(H,e)}catch{}}function na(e){return!e||e.status!=="failed"?!1:Zo()===(e.targetVersion||e.currentVersion)}function ta(){try{return window.sessionStorage.getItem(_)}catch{return null}}function te(e){try{if(!e){window.sessionStorage.removeItem(_);return}window.sessionStorage.setItem(_,e)}catch{}}function q(e){return!e||e.status!=="completed"?!1:ta()===J(e)}function oe(e){const{status:t,...o}=e;return t==="idle"?null:{status:t,...o}}function oa(e,t){const{t:o}=R(e),[l,d]=c.useState(null),[a,r]=c.useState(()=>{const p=ne();return q(p)?null:p}),s=c.useRef(null),u=c.useRef(0),b=(a==null?void 0:a.status)==="running"||(a==null?void 0:a.status)==="restarting",m=c.useCallback(p=>{if(q(p)||na(p)){r(null),$(null);return}r(p),$(p)},[]),g=c.useCallback(()=>{s.current!==null&&(window.clearTimeout(s.current),s.current=null)},[]),v=c.useCallback(async()=>{try{const p=await ge();if(p.hasUpdate){d({currentVersion:p.currentVersion,latestVersion:p.latestVersion});return}d(null)}catch{}},[]),x=c.useCallback(()=>{a&&(a.status==="completed"?(te(J(a)),window.location.reload()):a.status==="failed"&&(ea(a.targetVersion||a.currentVersion),$(null),window.location.reload()))},[a]),y=c.useCallback(p=>{g(),m(p)},[m,g]),h=c.useCallback(p=>{g();const w={status:"failed",currentVersion:(a==null?void 0:a.currentVersion)||(l==null?void 0:l.currentVersion)||"unknown",installedVersion:(a==null?void 0:a.installedVersion)||(l==null?void 0:l.currentVersion)||"unknown",targetVersion:(a==null?void 0:a.targetVersion)||(l==null?void 0:l.latestVersion),updatedAt:Date.now(),error:p,inProgress:!1};m(w),t(p||o("update.failed"),"error")},[m,g,t,o,l,a]);c.useEffect(()=>{let p=!1;return(async()=>{const j=ne();let k=j&&!q(j)?j:null;k&&m(k);try{const P=oe(await W());if(p)return;k=P&&!q(P)?P:null,m(k)}catch{if(p)return}if(k!=null&&k.inProgress&&k.targetVersion){const P=++u.current;g(),s.current=window.setTimeout(()=>{P===u.current&&F(k.targetVersion)},ee)}await v()})(),()=>{p=!0,u.current+=1,g()}},[m,g,v]);const F=c.useCallback((p,w=Qo)=>{const j=++u.current;g(),s.current=window.setTimeout(async()=>{if(j===u.current)try{const k=oe(await W());if(!k){if(w<=1){h(o("update.failed"));return}F(p,w-1);return}if(m(k),k.status==="running"||k.status==="restarting"||k.inProgress){if(w<=1){h(o("update.failed"));return}F(p,w-1);return}if(k.status==="completed"){const P=J(k);if(P&&Yo(P,p)){y(k);return}h(k.error||o("update.failed"));return}if(k.status==="failed"){h(k.error||o("update.failed"));return}h(o("update.failed"))}catch{if(w<=1){h(o("update.failed"));return}F(p,w-1)}},ee)},[m,g,h,y,o]),N=c.useCallback(async()=>{if(l){te(null),m({status:"running",currentVersion:l.currentVersion,installedVersion:l.currentVersion,targetVersion:l.latestVersion,updatedAt:Date.now(),inProgress:!0});try{const p=await fe();if(t(o("update.started"),"success"),p.status==="completed"){y({status:"completed",currentVersion:p.targetVersion,installedVersion:p.targetVersion,targetVersion:p.targetVersion,updatedAt:Date.now(),inProgress:!1});return}F(p.targetVersion||l.latestVersion)}catch(p){const w=p.message||o("update.failed");if(/already in progress/i.test(w)){await v();return}h(w)}}},[m,h,y,v,F,t,o,l]);return{updateInfo:l,updateStatus:a,updateLoading:b,handleUpdate:N,handleRefresh:x,refreshUpdateInfo:v}}function aa(e){return e.installedVersion||e.targetVersion||e.currentVersion}function ia({status:e,className:t}){return e==="completed"?n.jsx("svg",{className:t,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:1.8,children:n.jsx("path",{d:"M5 12.5 9.5 17 19 7.5"})}):e==="failed"?n.jsxs("svg",{className:t,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:1.8,children:[n.jsx("circle",{cx:"12",cy:"12",r:"9"}),n.jsx("path",{d:"M9 9l6 6m0-6-6 6"})]}):e==="restarting"?n.jsxs("svg",{className:t,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:1.8,children:[n.jsx("path",{d:"M12 3a9 9 0 1 1-6.36 2.64"}),n.jsx("path",{d:"M4 4v5h5"})]}):n.jsx("svg",{className:t,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:1.8,children:n.jsx("path",{d:"M12 2v6m0 0 2-2m-2 2-2-2M4.93 10.93A10 10 0 1 0 21 12"})})}function sa({namespace:e,updateInfo:t,updateStatus:o,updateLoading:l,onUpdate:d,onRefresh:a}){const{t:r}=R([e,"common"]);if(!t&&!o)return null;let s="available";o&&(s=o.status);const u=s==="completed"?{container:"bg-emerald-500/10 border-emerald-500/30",text:"text-emerald-200",secondary:"text-emerald-200/80",icon:"text-emerald-400",version:"text-emerald-100",arrow:"text-emerald-400",button:"bg-emerald-500 hover:bg-emerald-400 text-black"}:s==="failed"?{container:"bg-red-500/10 border-red-500/30",text:"text-red-200",secondary:"text-red-200/80",icon:"text-red-400",version:"text-red-100",arrow:"text-red-400",button:"bg-red-500 hover:bg-red-400 text-white"}:s==="restarting"?{container:"bg-sky-500/10 border-sky-500/30",text:"text-sky-200",secondary:"text-sky-200/80",icon:"text-sky-400",version:"text-sky-100",arrow:"text-sky-400",button:"bg-sky-500 hover:bg-sky-400 text-black"}:{container:"bg-amber-500/10 border-amber-500/30",text:"text-amber-300",secondary:"text-amber-300/80",icon:"text-amber-400",version:"text-amber-200",arrow:"text-amber-500",button:"bg-amber-500 hover:bg-amber-400 text-black"},b=(o==null?void 0:o.currentVersion)||(t==null?void 0:t.currentVersion),m=(o==null?void 0:o.targetVersion)||(t==null?void 0:t.latestVersion),g=o?aa(o):null;let v="",x="",y=!1,h=null;return s==="available"?(x=r("update.upgradeNow"),h=d):s==="running"?(v=r("update.started"),x=r("update.upgrading"),y=!0):s==="restarting"?(v=r("update.restarting"),x=r("update.upgrading"),y=!0):(s==="completed"||s==="failed")&&(x=r("common:action.refresh"),h=a),s==="failed"&&(o!=null&&o.error)&&(v=o.error),n.jsxs("div",{className:`mb-4 flex flex-col gap-3 rounded-lg border px-4 py-2.5 sm:flex-row sm:items-center sm:justify-between ${u.container}`,children:[n.jsxs("div",{className:"flex min-w-0 items-start gap-2 text-sm",children:[n.jsx(ia,{status:s,className:`mt-0.5 h-4 w-4 shrink-0 ${u.icon} ${s==="running"?"animate-spin":""}`}),n.jsxs("div",{className:"min-w-0",children:[n.jsxs("div",{className:`flex flex-wrap items-center gap-x-1 gap-y-0.5 ${u.text}`,children:[s==="available"&&n.jsxs(n.Fragment,{children:[n.jsx("span",{children:r("update.found")}),n.jsx("span",{className:`font-mono ${u.version}`,children:t==null?void 0:t.currentVersion}),n.jsx("span",{className:u.arrow,children:"→"}),n.jsx("span",{className:`font-mono ${u.version}`,children:t==null?void 0:t.latestVersion})]}),s==="running"&&n.jsxs(n.Fragment,{children:[n.jsx("span",{children:r("update.upgrading")}),b&&m&&n.jsxs(n.Fragment,{children:[n.jsx("span",{className:`font-mono ${u.version}`,children:b}),n.jsx("span",{className:u.arrow,children:"→"}),n.jsx("span",{className:`font-mono ${u.version}`,children:m})]})]}),s==="restarting"&&n.jsxs(n.Fragment,{children:[n.jsx("span",{children:r("update.restarting")}),m&&n.jsx("span",{className:`font-mono ${u.version}`,children:m})]}),s==="completed"&&n.jsx("span",{children:r("update.completed",{latestVersion:g})}),s==="failed"&&n.jsxs(n.Fragment,{children:[n.jsx("span",{children:r("update.failed")}),b&&m&&n.jsxs(n.Fragment,{children:[n.jsx("span",{className:`font-mono ${u.version}`,children:b}),n.jsx("span",{className:u.arrow,children:"→"}),n.jsx("span",{className:`font-mono ${u.version}`,children:m})]})]})]}),v&&n.jsx("div",{className:`mt-0.5 break-all text-xs ${u.secondary}`,children:v})]})]}),x&&n.jsx("button",{onClick:h||void 0,disabled:y||l,className:`shrink-0 rounded-md px-3 py-1 text-xs font-semibold transition-colors disabled:cursor-not-allowed disabled:opacity-50 ${u.button}`,children:x})]})}const z=c.createContext({showToast:()=>{},instances:[],system:null,refreshInstances:()=>{}});function Ma(){return c.useContext(z)}function Ea(){return c.useContext(z)}function ra({toasts:e,onDismiss:t}){return n.jsx("div",{className:"fixed top-4 right-4 z-50 flex flex-col gap-2 pointer-events-none",children:e.map(o=>n.jsxs("div",{className:`pointer-events-auto flex items-center gap-2 px-4 py-2.5 rounded-lg text-sm shadow-xl border backdrop-blur-sm animate-in slide-in-from-right ${o.type==="error"?"bg-red-500/10 border-red-500/20 text-red-400":o.type==="success"?"bg-emerald-500/10 border-emerald-500/20 text-emerald-400":"bg-amber-500/10 border-amber-500/20 text-amber-400"}`,children:[n.jsx("span",{className:"flex-1",children:o.message}),n.jsx("button",{onClick:()=>t(o.id),className:"text-current opacity-50 hover:opacity-100 ml-2",children:"×"})]},o.id))})}function la(e){return e==="running"?"bg-emerald-500 shadow-[0_0_6px_rgba(16,185,129,0.6)]":e==="pending"?"bg-amber-400 animate-pulse shadow-[0_0_6px_rgba(251,191,36,0.5)]":e==="failed"||e==="dead"?"bg-red-500 shadow-[0_0_6px_rgba(239,68,68,0.6)]":"bg-[var(--muted)] opacity-40"}function ca({children:e}){var Q;const{t}=R(),[o,l]=c.useState([]),[d,a]=c.useState(null),[r,s]=c.useState(!1),[u,b]=c.useState([]),[m,g]=c.useState([]),[v,x]=c.useState(new Set),y=ie(),h=Pe(),F=c.useRef(0),N=c.useCallback(()=>{pe().then(l).catch(()=>{}),me().then(a).catch(()=>{})},[]);c.useEffect(()=>{N();const f=setInterval(N,1e4);return()=>clearInterval(f)},[N]),c.useEffect(()=>{s(!1)},[h.pathname]),c.useEffect(()=>{var C;if(!(o!=null&&o.length))return;const f=[];for(const S of o){const T=S.auto_backup;if((C=T==null?void 0:T.warnings)!=null&&C.length)for(const O of T.warnings)f.push({instanceId:S.id,instanceName:S.name,warning:O})}g(f)},[o]);const p=c.useCallback((f,C="info")=>{const S=++F.current;b(O=>[...O,{id:S,message:f,type:C}]),setTimeout(()=>b(O=>O.filter(ye=>ye.id!==S)),C==="error"?1e4:4e3)},[]),{updateInfo:w,updateStatus:j,updateLoading:k,handleUpdate:P,handleRefresh:ke}=oa("dashboard",p),be=f=>{b(C=>C.filter(S=>S.id!==f))},ve=()=>{ce(),y("/login")},xe=(Q=h.pathname.match(/^\/instances\/([^/]+)/))==null?void 0:Q[1],G=n.jsxs("div",{className:"flex flex-col h-full",children:[n.jsx("div",{className:"flex items-center gap-2.5 px-4 h-12 border-b border-[var(--border)] shrink-0",children:n.jsx(Go,{className:"w-20 h-20 object-contain"})}),n.jsxs("div",{className:"flex-1 overflow-y-auto sidebar-scroll py-1.5",children:[n.jsx("div",{className:"px-3 mb-1 mt-1",children:n.jsx("span",{className:"text-[10px] font-medium text-muted uppercase tracking-wider opacity-70",children:t("nav.instances")})}),o.map(f=>{var S;const C=f.id===xe;return n.jsxs(D,{to:`/instances/${f.id}`,className:`flex items-center gap-2 mx-2 px-2 py-1.5 rounded-md text-sm transition-all duration-200 ${C?"bg-[var(--card-hover)] text-foreground font-medium border-l-2 border-[var(--primary)] pl-[6px]":"text-muted hover:bg-[var(--card)] hover:text-foreground"}`,children:[n.jsx("span",{className:`w-1.5 h-1.5 rounded-full shrink-0 ${la((S=f.service)==null?void 0:S.status)}`}),n.jsx("span",{className:"truncate",children:f.name})]},f.id)}),n.jsxs(D,{to:"/instances/new",className:"flex items-center gap-2 mx-2 px-2 py-1.5 rounded-md text-sm text-muted hover:bg-[var(--card)] hover:text-foreground transition-all duration-200 mt-0.5",children:[n.jsx(Uo,{className:"w-3.5 h-3.5"}),n.jsx("span",{children:t("nav.newInstance")})]}),n.jsxs(D,{to:"/instances/new?import=true",className:"flex items-center gap-2 mx-2 px-2 py-1.5 rounded-md text-sm text-muted hover:bg-[var(--card)] hover:text-foreground transition-all duration-200",children:[n.jsx(_o,{className:"w-3.5 h-3.5"}),n.jsx("span",{children:t("nav.importInstance")})]})]}),n.jsxs("div",{className:"border-t border-[var(--border)] py-1.5 shrink-0",children:[n.jsx("div",{className:"px-3 mb-1",children:n.jsx("span",{className:"text-[10px] font-medium text-muted uppercase tracking-wider opacity-70",children:t("nav.navigation")})}),n.jsxs(D,{to:"/",className:`flex items-center gap-2 mx-2 px-2 py-1.5 rounded-md text-sm transition-all duration-200 ${h.pathname==="/"?"bg-[var(--card-hover)] text-foreground font-medium border-l-2 border-[var(--primary)] pl-[6px]":"text-muted hover:bg-[var(--card)] hover:text-foreground"}`,children:[n.jsxs("svg",{className:"w-3.5 h-3.5",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:1.5,strokeLinecap:"round",strokeLinejoin:"round",children:[n.jsx("rect",{x:"3",y:"3",width:"7",height:"7"}),n.jsx("rect",{x:"14",y:"3",width:"7",height:"7"}),n.jsx("rect",{x:"3",y:"14",width:"7",height:"7"}),n.jsx("rect",{x:"14",y:"14",width:"7",height:"7"})]}),n.jsx("span",{children:t("nav.overview")})]}),n.jsxs(D,{to:"/settings",className:`flex items-center gap-2 mx-2 px-2 py-1.5 rounded-md text-sm transition-all duration-200 ${h.pathname==="/settings"?"bg-[var(--card-hover)] text-foreground font-medium border-l-2 border-[var(--primary)] pl-[6px]":"text-muted hover:bg-[var(--card)] hover:text-foreground"}`,children:[n.jsx($o,{className:"w-3.5 h-3.5"}),n.jsx("span",{children:t("nav.settings")})]}),n.jsxs("button",{onClick:ve,className:"flex items-center gap-2 mx-2 px-2 py-1.5 rounded-md text-sm text-muted hover:bg-[var(--card)] hover:text-foreground transition-all duration-200 w-full text-left",children:[n.jsx(Vo,{className:"w-3.5 h-3.5"}),n.jsx("span",{children:t("nav.logout")})]}),n.jsx("div",{className:"mx-2 mt-1",children:n.jsx(Ho,{className:"w-full"})})]})]}),we=c.useMemo(()=>({showToast:p,instances:o,system:d,refreshInstances:N}),[p,o,d,N]);return n.jsxs(z.Provider,{value:we,children:[n.jsxs("div",{className:"flex h-screen overflow-hidden bg-background",children:[n.jsx("aside",{className:"hidden lg:flex w-52 border-r border-[var(--border)] flex-col shrink-0",style:{background:"var(--sidebar-bg)"},children:G}),r&&n.jsxs("div",{className:"fixed inset-0 z-40 lg:hidden",onClick:()=>s(!1),children:[n.jsx("div",{className:"absolute inset-0 bg-black/60 backdrop-blur-sm"}),n.jsxs("aside",{className:"absolute left-0 top-0 bottom-0 w-60 border-r border-[var(--border)] shadow-2xl",style:{background:"var(--sidebar-bg)"},onClick:f=>f.stopPropagation(),children:[n.jsx("button",{onClick:()=>s(!1),className:"absolute top-3 right-3 p-1 text-muted hover:text-foreground transition-colors",children:n.jsx(Ko,{})}),G]})]}),n.jsxs("main",{className:"flex-1 overflow-y-auto bg-background",children:[n.jsxs("div",{className:"lg:hidden flex items-center gap-3 px-4 h-11 border-b border-[var(--border)] bg-background sticky top-0 z-10",children:[n.jsx("button",{onClick:()=>s(!0),className:"text-muted hover:text-foreground transition-colors",children:n.jsx(Wo,{})}),n.jsx("span",{className:"font-semibold text-sm text-foreground",children:"JishuShell"})]}),m.filter(f=>!v.has(f.instanceId+f.warning)).map((f,C)=>n.jsxs("div",{className:"mx-4 mt-2 bg-amber-500/10 border border-amber-500/20 text-amber-400 text-sm rounded-lg px-4 py-2.5 flex items-center justify-between",children:[n.jsxs("span",{children:[n.jsx("strong",{children:f.instanceName}),": ",f.warning]}),n.jsx("button",{onClick:()=>x(S=>new Set([...S,f.instanceId+f.warning])),className:"text-amber-400/60 hover:text-amber-400 ml-3 text-lg leading-none",children:"×"})]},C)),(w||j)&&n.jsx("div",{className:"max-w-5xl mx-auto px-4 pt-3",children:n.jsx(sa,{namespace:"dashboard",updateInfo:w,updateStatus:j,updateLoading:k,onUpdate:P,onRefresh:ke})}),e]})]}),n.jsx(ra,{toasts:u,onDismiss:be})]})}const da=c.lazy(()=>L(()=>import("./Login-D1Bt-Lyk.js"),__vite__mapDeps([0,1,2]))),ua=c.lazy(()=>L(()=>import("./InitPassword-BEC8SE4A.js"),__vite__mapDeps([3,1,2]))),pa=c.lazy(()=>L(()=>import("./Setup-cMF21Y-8.js"),__vite__mapDeps([4,1,5,2]))),ma=c.lazy(()=>L(()=>import("./Dashboard-CQsp1Mr9.js"),__vite__mapDeps([6,1,7,2]))),ga=c.lazy(()=>L(()=>import("./InstanceDetail-B5wTgNEg.js"),__vite__mapDeps([8,1,7,5,2]))),fa=c.lazy(()=>L(()=>import("./NewInstance-GQzm3K9D.js"),__vite__mapDeps([9,1,2]))),ha=c.lazy(()=>L(()=>import("./Settings-ByjGlqhP.js"),__vite__mapDeps([10,1,5,2])));class ka extends c.Component{constructor(){super(...arguments);X(this,"state",{hasError:!1,error:null})}static getDerivedStateFromError(o){return{hasError:!0,error:o}}componentDidCatch(o,l){console.error("[ErrorBoundary]",o,l.componentStack)}render(){var o;return this.state.hasError?n.jsx("div",{className:"flex items-center justify-center min-h-screen bg-background",children:n.jsxs("div",{className:"text-center space-y-4",children:[n.jsx("div",{className:"text-red-400 text-lg font-medium",children:"UI Error"}),n.jsx("p",{className:"text-muted text-sm max-w-md",children:(o=this.state.error)==null?void 0:o.message}),n.jsx("button",{onClick:()=>{this.setState({hasError:!1,error:null}),window.location.reload()},className:"px-4 py-2 bg-[#0066FF] text-white text-sm rounded-md hover:bg-[#0066FF]/90 transition-colors",children:"Reload"})]})}):this.props.children}}function ae(){const{id:e}=je();return n.jsx(ga,{},e)}function ba({authed:e,children:t}){return e?n.jsx(n.Fragment,{children:t}):n.jsx(E,{to:"/login",replace:!0})}function M({authed:e,setupDone:t,children:o}){return e?t?n.jsx(ca,{children:o}):n.jsx(E,{to:"/setup",replace:!0}):n.jsx(E,{to:"/login",replace:!0})}function va(){const{t:e}=R(),[t,o]=c.useState(!0),[l,d]=c.useState(!0),[a,r]=c.useState(!0),[s,u]=c.useState(!1),[b,m]=c.useState(!1),g=ie(),v=()=>{m(!1),o(!0),Promise.all([ue(),he().catch(()=>({ready:!0,providerConfigured:!0}))]).then(async([y,h])=>{if(d(y.initialized),r(h.ready&&h.providerConfigured!==!1),!y.initialized)g("/init",{replace:!0});else{const F=await de();u(F),F&&!h.ready&&g("/setup",{replace:!0})}o(!1)}).catch(()=>{m(!0),o(!1)})};if(c.useEffect(()=>{v()},[]),t)return n.jsx("div",{className:"flex items-center justify-center min-h-screen bg-background",children:n.jsx("div",{className:"w-5 h-5 border-2 border-[var(--border)] border-t-foreground rounded-full animate-spin"})});if(b)return n.jsx("div",{className:"flex items-center justify-center min-h-screen bg-background",children:n.jsxs("div",{className:"text-center space-y-4",children:[n.jsx("div",{className:"text-red-400 text-lg font-medium",children:e("error.connectionFailed")}),n.jsx("p",{className:"text-muted text-sm",children:e("error.checkBackend")}),n.jsx("button",{onClick:v,className:"px-4 py-2 bg-[#0066FF] text-white text-sm rounded-md hover:bg-[#0066FF]/90 transition-colors",children:e("action.retry")})]})});const x=n.jsx("div",{className:"flex items-center justify-center min-h-screen bg-background",children:n.jsx("div",{className:"w-5 h-5 border-2 border-[var(--border)] border-t-foreground rounded-full animate-spin"})});return n.jsx(ka,{children:n.jsx(c.Suspense,{fallback:x,children:n.jsxs(Ie,{children:[n.jsx(I,{path:"/init",element:n.jsx(ua,{onDone:()=>{d(!0),u(!0),r(!1),g("/setup",{replace:!0})}})}),n.jsx(I,{path:"/setup",element:n.jsx(ba,{authed:s,children:n.jsx(pa,{onDone:()=>{r(!0),g("/",{replace:!0})}})})}),n.jsx(I,{path:"/login",element:l?n.jsx(da,{onLogin:()=>u(!0)}):n.jsx(E,{to:"/init",replace:!0})}),n.jsx(I,{path:"/",element:n.jsx(M,{authed:s,setupDone:a,children:n.jsx(ma,{})})}),n.jsx(I,{path:"/instances/new",element:n.jsx(M,{authed:s,setupDone:a,children:n.jsx(fa,{})})}),n.jsx(I,{path:"/instances/:id",element:n.jsx(M,{authed:s,setupDone:a,children:n.jsx(ae,{})})}),n.jsx(I,{path:"/instances/:id/:tab",element:n.jsx(M,{authed:s,setupDone:a,children:n.jsx(ae,{})})}),n.jsx(I,{path:"/settings",element:n.jsx(M,{authed:s,setupDone:a,children:n.jsx(ha,{})})}),n.jsx(I,{path:"*",element:n.jsx(E,{to:"/",replace:!0})})]})})})}V.createRoot(document.getElementById("root")).render(n.jsx(Ne.StrictMode,{children:n.jsx(Le,{children:n.jsx(va,{})})}));export{co as $,Gt as A,Yt as B,Qt as C,Zt as D,La as E,Na as F,Co as G,Ro as H,Ta as I,qo as J,Io as K,Ho as L,Oo as M,Bo as N,Po as O,No as P,Lo as Q,jo as R,To as S,Go as T,oo as U,ao as V,$t as W,Vt as X,Jt as Y,_t as Z,L as _,Aa as a,Da as a0,$o as a1,ro as a2,io as a3,so as a4,Oa as a5,zt as a6,lo as a7,Ht as a8,Kt as a9,Do as aa,Mo as ab,Eo as ac,Wt as ad,Ea as ae,Ao as af,Ut as ag,bo as ah,vo as ai,xo as aj,yo as ak,So as al,wo as am,Sa as an,Bt as b,qt as c,ko as d,ho as e,mo as f,he as g,Ma as h,po as i,n as j,ja as k,Ia as l,Pa as m,pe as n,me as o,Fo as p,uo as q,fo as r,Rt as s,eo as t,go as u,no as v,to as w,Fa as x,Ca as y,Xt as z};