@jingyi0605/codingns 0.6.0 → 0.6.5

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 (253) hide show
  1. package/bin/codingns.mjs +240 -2
  2. package/dist/public/assets/AdaptiveButlerPage-CfsUVZKl.js +3 -0
  3. package/dist/public/assets/{App-BZvapsi8.js → App-B9HcTkMT.js} +3 -3
  4. package/dist/public/assets/{BootstrapPage-gHSoa4JN.js → BootstrapPage-BgLdZEKQ.js} +1 -1
  5. package/dist/public/assets/ConversationPage-Cj8go7L0.js +4 -0
  6. package/dist/public/assets/{DesktopDetachPreviewPage-4eMRxiBW.js → DesktopDetachPreviewPage-YCBnyC58.js} +1 -1
  7. package/dist/public/assets/DesktopWindowPage-CrvndE23.js +2 -0
  8. package/dist/public/assets/FileContextPanel-CdC7GGw5.js +1 -0
  9. package/dist/public/assets/GitSidebar-z2SBinQh.js +6 -0
  10. package/dist/public/assets/MobileCreateSessionSheet-Cb2HM-y3.js +1 -0
  11. package/dist/public/assets/{MobileTopHeaderFrame-Bwv8Ovm_.js → MobileTopHeaderFrame-etF2HKlm.js} +1 -1
  12. package/dist/public/assets/MobileWorkspaceSwitcherHeader-CuGJ31kb.js +1 -0
  13. package/dist/public/assets/{RelayConnectEntryPage-D_4YL-YH.js → RelayConnectEntryPage-BB6DbGtP.js} +1 -1
  14. package/dist/public/assets/{ServerSettingsModal-CMSm3BZU.js → ServerSettingsModal-Bl1sacZg.js} +1 -1
  15. package/dist/public/assets/SessionIndexPage-NbF9gJnp.js +1 -0
  16. package/dist/public/assets/SettingsPage-DGsmQpLv.js +1 -0
  17. package/dist/public/assets/TerminalManagerPanel-BOm8Hi_v.js +1 -0
  18. package/dist/public/assets/{TerminalPage-DaooFaJ4.js → TerminalPage-B5JNFU6w.js} +19 -19
  19. package/dist/public/assets/TerminalRuntimeFallbackModal-CM3LRKOJ.js +1 -0
  20. package/dist/public/assets/{ToolFilesPage-CGxBvYG0.js → ToolFilesPage-GSqKQsj_.js} +1 -1
  21. package/dist/public/assets/ToolGitPage-BVFWMMQp.js +1 -0
  22. package/dist/public/assets/ToolProcessesPage-DZ456fYz.js +1 -0
  23. package/dist/public/assets/ToolsHomePage-DsJp0y8A.js +1 -0
  24. package/dist/public/assets/WorkbenchLandingPage-DyPei0e-.js +1 -0
  25. package/dist/public/assets/WorkbenchLayout-DlbgBT3n.js +4 -0
  26. package/dist/public/assets/WorkbenchModal-LNfB69qx.js +1 -0
  27. package/dist/public/assets/WorkbenchShellRoute-BsxumYx5.js +1 -0
  28. package/dist/public/assets/WorkbenchShellRoute-DhQo_0vu.css +1 -0
  29. package/dist/public/assets/WorkspaceDebugDetailPage-CaXj5zVI.js +1 -0
  30. package/dist/public/assets/WorkspaceDetailPage-DOexuuaw.js +1 -0
  31. package/dist/public/assets/WorkspaceHomePage-DkCHNjKD.js +1 -0
  32. package/dist/public/assets/{client-runtime-manager-BZpL17fc.js → client-runtime-manager-6OoYHXGd.js} +1 -1
  33. package/dist/public/assets/{file-tree-icon-Db5LXC8h.js → file-tree-icon-9pt1OStn.js} +1 -1
  34. package/dist/public/assets/index-BwlbvwaA.css +1 -0
  35. package/dist/public/assets/index-DSw-TkQL.js +42 -0
  36. package/dist/public/assets/legna-code-6TqgZ4Ls.png +0 -0
  37. package/dist/public/assets/{login-direct-candidate-resolver-1mxe_Oh8.js → login-direct-candidate-resolver-CLlYtBRq.js} +1 -1
  38. package/dist/public/assets/model-switch-api-C-l8-E1S.js +1 -0
  39. package/dist/public/assets/{preferences-service-DWnzl5a0.js → preferences-service-BCcfYP_d.js} +1 -1
  40. package/dist/public/assets/{relay-entry-C5_Iay0I.js → relay-entry-BmLkMKuq.js} +1 -1
  41. package/dist/public/assets/session-runtime-machine-DgtvREca.js +21 -0
  42. package/dist/public/assets/{terminal-runtime-meta-cdtWVfCm.js → terminal-runtime-meta-0h-75uRy.js} +1 -1
  43. package/dist/public/assets/useRegisteredDebugTemplates-rBVmAqh3.js +1 -0
  44. package/dist/public/index.html +2 -2
  45. package/dist/server/config/env.d.ts +2 -0
  46. package/dist/server/config/env.js +7 -0
  47. package/dist/server/config/env.js.map +1 -1
  48. package/dist/server/modules/assistant-capability/assistant-capability-service.d.ts +4 -1
  49. package/dist/server/modules/assistant-capability/assistant-capability-service.js +12 -1
  50. package/dist/server/modules/assistant-capability/assistant-capability-service.js.map +1 -1
  51. package/dist/server/modules/butler/butler-control-session-service.d.ts +4 -1
  52. package/dist/server/modules/butler/butler-control-session-service.js +17 -1
  53. package/dist/server/modules/butler/butler-control-session-service.js.map +1 -1
  54. package/dist/server/modules/butler/butler-profile-service.d.ts +3 -1
  55. package/dist/server/modules/butler/butler-profile-service.js +16 -4
  56. package/dist/server/modules/butler/butler-profile-service.js.map +1 -1
  57. package/dist/server/modules/model-switch/cc-switch-adapter.d.ts +7 -0
  58. package/dist/server/modules/model-switch/cc-switch-adapter.js +17 -0
  59. package/dist/server/modules/model-switch/cc-switch-adapter.js.map +1 -1
  60. package/dist/server/modules/opencli/opencli-bridge-skill-service.d.ts +12 -0
  61. package/dist/server/modules/opencli/opencli-bridge-skill-service.js +124 -0
  62. package/dist/server/modules/opencli/opencli-bridge-skill-service.js.map +1 -0
  63. package/dist/server/modules/opencli/opencli-catalog-service.d.ts +50 -0
  64. package/dist/server/modules/opencli/opencli-catalog-service.js +345 -0
  65. package/dist/server/modules/opencli/opencli-catalog-service.js.map +1 -0
  66. package/dist/server/modules/opencli/opencli-controller.d.ts +13 -0
  67. package/dist/server/modules/opencli/opencli-controller.js +30 -0
  68. package/dist/server/modules/opencli/opencli-controller.js.map +1 -0
  69. package/dist/server/modules/opencli/opencli-health-service.d.ts +28 -0
  70. package/dist/server/modules/opencli/opencli-health-service.js +106 -0
  71. package/dist/server/modules/opencli/opencli-health-service.js.map +1 -0
  72. package/dist/server/modules/opencli/opencli-install-discovery.d.ts +23 -0
  73. package/dist/server/modules/opencli/opencli-install-discovery.js +130 -0
  74. package/dist/server/modules/opencli/opencli-install-discovery.js.map +1 -0
  75. package/dist/server/modules/opencli/opencli-management-service.d.ts +59 -0
  76. package/dist/server/modules/opencli/opencli-management-service.js +152 -0
  77. package/dist/server/modules/opencli/opencli-management-service.js.map +1 -0
  78. package/dist/server/modules/opencli/opencli-runtime-builder.d.ts +11 -0
  79. package/dist/server/modules/opencli/opencli-runtime-builder.js +214 -0
  80. package/dist/server/modules/opencli/opencli-runtime-builder.js.map +1 -0
  81. package/dist/server/modules/opencli/opencli-runtime-layout.d.ts +3 -0
  82. package/dist/server/modules/opencli/opencli-runtime-layout.js +11 -0
  83. package/dist/server/modules/opencli/opencli-runtime-layout.js.map +1 -0
  84. package/dist/server/modules/opencli/opencli-runtime-profile-service.d.ts +29 -0
  85. package/dist/server/modules/opencli/opencli-runtime-profile-service.js +104 -0
  86. package/dist/server/modules/opencli/opencli-runtime-profile-service.js.map +1 -0
  87. package/dist/server/modules/opencli/opencli-runtime-resolver.d.ts +29 -0
  88. package/dist/server/modules/opencli/opencli-runtime-resolver.js +110 -0
  89. package/dist/server/modules/opencli/opencli-runtime-resolver.js.map +1 -0
  90. package/dist/server/modules/opencli/opencli-session-prompt-service.d.ts +11 -0
  91. package/dist/server/modules/opencli/opencli-session-prompt-service.js +66 -0
  92. package/dist/server/modules/opencli/opencli-session-prompt-service.js.map +1 -0
  93. package/dist/server/modules/parallel-sessions/parallel-session-controller.d.ts +4 -0
  94. package/dist/server/modules/parallel-sessions/parallel-session-controller.js +7 -0
  95. package/dist/server/modules/parallel-sessions/parallel-session-controller.js.map +1 -1
  96. package/dist/server/modules/parallel-sessions/parallel-session-group-service.d.ts +6 -1
  97. package/dist/server/modules/parallel-sessions/parallel-session-group-service.js +36 -2
  98. package/dist/server/modules/parallel-sessions/parallel-session-group-service.js.map +1 -1
  99. package/dist/server/modules/provider/opencode-model-options.d.ts +1 -0
  100. package/dist/server/modules/provider/opencode-model-options.js +54 -12
  101. package/dist/server/modules/provider/opencode-model-options.js.map +1 -1
  102. package/dist/server/modules/provider/provider-catalog-service.d.ts +46 -0
  103. package/dist/server/modules/provider/provider-catalog-service.js +249 -0
  104. package/dist/server/modules/provider/provider-catalog-service.js.map +1 -0
  105. package/dist/server/modules/provider/provider-controller.d.ts +20 -2
  106. package/dist/server/modules/provider/provider-controller.js +65 -5
  107. package/dist/server/modules/provider/provider-controller.js.map +1 -1
  108. package/dist/server/modules/provider/provider-disabled.d.ts +8 -0
  109. package/dist/server/modules/provider/provider-disabled.js +45 -0
  110. package/dist/server/modules/provider/provider-disabled.js.map +1 -0
  111. package/dist/server/modules/provider/provider-discovery-helper-client.d.ts +3 -0
  112. package/dist/server/modules/provider/provider-discovery-helper-client.js.map +1 -1
  113. package/dist/server/modules/provider/provider-discovery-helper-process.js +4 -4
  114. package/dist/server/modules/provider/provider-discovery-helper-process.js.map +1 -1
  115. package/dist/server/modules/provider/provider-discovery-runtime.d.ts +1 -1
  116. package/dist/server/modules/provider/provider-discovery-runtime.js +17 -9
  117. package/dist/server/modules/provider/provider-discovery-runtime.js.map +1 -1
  118. package/dist/server/modules/sessions/claude-compatible-provider-registry.d.ts +16 -0
  119. package/dist/server/modules/sessions/claude-compatible-provider-registry.js +91 -0
  120. package/dist/server/modules/sessions/claude-compatible-provider-registry.js.map +1 -0
  121. package/dist/server/modules/sessions/claude-runtime-helper-client.d.ts +1 -0
  122. package/dist/server/modules/sessions/claude-runtime-helper-client.js +14 -0
  123. package/dist/server/modules/sessions/claude-runtime-helper-client.js.map +1 -1
  124. package/dist/server/modules/sessions/codex-app-server-helper-client.d.ts +1 -0
  125. package/dist/server/modules/sessions/codex-app-server-helper-client.js +10 -0
  126. package/dist/server/modules/sessions/codex-app-server-helper-client.js.map +1 -1
  127. package/dist/server/modules/sessions/provider-session-delete-cli.js +2 -0
  128. package/dist/server/modules/sessions/provider-session-delete-cli.js.map +1 -1
  129. package/dist/server/modules/sessions/session-controller.d.ts +7 -0
  130. package/dist/server/modules/sessions/session-controller.js +22 -0
  131. package/dist/server/modules/sessions/session-controller.js.map +1 -1
  132. package/dist/server/modules/sessions/session-history-service.d.ts +18 -2
  133. package/dist/server/modules/sessions/session-history-service.js +330 -29
  134. package/dist/server/modules/sessions/session-history-service.js.map +1 -1
  135. package/dist/server/modules/sessions/session-live-runtime-router-service.js +9 -4
  136. package/dist/server/modules/sessions/session-live-runtime-router-service.js.map +1 -1
  137. package/dist/server/modules/sessions/session-live-runtime-service.d.ts +22 -5
  138. package/dist/server/modules/sessions/session-live-runtime-service.js +350 -122
  139. package/dist/server/modules/sessions/session-live-runtime-service.js.map +1 -1
  140. package/dist/server/modules/sessions/session-message-attachment-service.js +2 -2
  141. package/dist/server/modules/sessions/session-message-attachment-service.js.map +1 -1
  142. package/dist/server/modules/sessions/session-permission-request-service.d.ts +5 -2
  143. package/dist/server/modules/sessions/session-permission-request-service.js +26 -27
  144. package/dist/server/modules/sessions/session-permission-request-service.js.map +1 -1
  145. package/dist/server/modules/sessions/session-provider-config-service.d.ts +82 -0
  146. package/dist/server/modules/sessions/session-provider-config-service.js +925 -0
  147. package/dist/server/modules/sessions/session-provider-config-service.js.map +1 -0
  148. package/dist/server/modules/sessions/session-provider-error-mapper.d.ts +2 -0
  149. package/dist/server/modules/sessions/session-provider-error-mapper.js +42 -0
  150. package/dist/server/modules/sessions/session-provider-error-mapper.js.map +1 -1
  151. package/dist/server/modules/skills/skill-manager-service.d.ts +5 -0
  152. package/dist/server/modules/skills/skill-manager-service.js +26 -0
  153. package/dist/server/modules/skills/skill-manager-service.js.map +1 -1
  154. package/dist/server/modules/tasks/task-helper-process-handlers.d.ts +1 -0
  155. package/dist/server/modules/tasks/task-helper-process-handlers.js +1 -1
  156. package/dist/server/modules/tasks/task-helper-process-handlers.js.map +1 -1
  157. package/dist/server/routes/opencli.d.ts +3 -0
  158. package/dist/server/routes/opencli.js +7 -0
  159. package/dist/server/routes/opencli.js.map +1 -0
  160. package/dist/server/routes/providers.js +4 -2
  161. package/dist/server/routes/providers.js.map +1 -1
  162. package/dist/server/server/create-server.d.ts +8 -0
  163. package/dist/server/server/create-server.js +48 -12
  164. package/dist/server/server/create-server.js.map +1 -1
  165. package/dist/server/storage/repositories/opencli-catalog-entry-repository.d.ts +9 -0
  166. package/dist/server/storage/repositories/opencli-catalog-entry-repository.js +85 -0
  167. package/dist/server/storage/repositories/opencli-catalog-entry-repository.js.map +1 -0
  168. package/dist/server/storage/repositories/opencli-provider-repository.d.ts +8 -0
  169. package/dist/server/storage/repositories/opencli-provider-repository.js +88 -0
  170. package/dist/server/storage/repositories/opencli-provider-repository.js.map +1 -0
  171. package/dist/server/storage/repositories/opencli-runtime-profile-repository.d.ts +11 -0
  172. package/dist/server/storage/repositories/opencli-runtime-profile-repository.js +127 -0
  173. package/dist/server/storage/repositories/opencli-runtime-profile-repository.js.map +1 -0
  174. package/dist/server/storage/repositories/provider-control-repository.d.ts +9 -0
  175. package/dist/server/storage/repositories/provider-control-repository.js +51 -0
  176. package/dist/server/storage/repositories/provider-control-repository.js.map +1 -0
  177. package/dist/server/storage/repositories/session-binding-repository.js +44 -5
  178. package/dist/server/storage/repositories/session-binding-repository.js.map +1 -1
  179. package/dist/server/storage/repositories/session-index-repository.js +6 -0
  180. package/dist/server/storage/repositories/session-index-repository.js.map +1 -1
  181. package/dist/server/storage/sqlite/client.js +72 -0
  182. package/dist/server/storage/sqlite/client.js.map +1 -1
  183. package/dist/server/storage/sqlite/schema.sql +71 -0
  184. package/dist/server/types/domain.d.ts +56 -0
  185. package/node_modules/@codingns/session-sync-core/dist/claude-message-utils.d.ts +5 -2
  186. package/node_modules/@codingns/session-sync-core/dist/claude-message-utils.js +40 -8
  187. package/node_modules/@codingns/session-sync-core/dist/claude-message-utils.js.map +1 -1
  188. package/node_modules/@codingns/session-sync-core/dist/index.d.ts +2 -0
  189. package/node_modules/@codingns/session-sync-core/dist/index.js +2 -0
  190. package/node_modules/@codingns/session-sync-core/dist/index.js.map +1 -1
  191. package/node_modules/@codingns/session-sync-core/dist/providers/claude-code.d.ts +10 -1
  192. package/node_modules/@codingns/session-sync-core/dist/providers/claude-code.js +110 -35
  193. package/node_modules/@codingns/session-sync-core/dist/providers/claude-code.js.map +1 -1
  194. package/node_modules/@codingns/session-sync-core/dist/providers/claude-session-store.d.ts +11 -0
  195. package/node_modules/@codingns/session-sync-core/dist/providers/claude-session-store.js +105 -0
  196. package/node_modules/@codingns/session-sync-core/dist/providers/claude-session-store.js.map +1 -0
  197. package/node_modules/@codingns/session-sync-core/dist/providers/gemini.js +131 -39
  198. package/node_modules/@codingns/session-sync-core/dist/providers/gemini.js.map +1 -1
  199. package/node_modules/@codingns/session-sync-core/dist/providers/legna-code.d.ts +9 -0
  200. package/node_modules/@codingns/session-sync-core/dist/providers/legna-code.js +17 -0
  201. package/node_modules/@codingns/session-sync-core/dist/providers/legna-code.js.map +1 -0
  202. package/node_modules/@codingns/session-sync-core/dist/providers/opencode-shared.d.ts +8 -1
  203. package/node_modules/@codingns/session-sync-core/dist/providers/opencode-shared.js +19 -6
  204. package/node_modules/@codingns/session-sync-core/dist/providers/opencode-shared.js.map +1 -1
  205. package/node_modules/@codingns/session-sync-core/dist/providers/opencode.d.ts +1 -0
  206. package/node_modules/@codingns/session-sync-core/dist/providers/opencode.js +13 -8
  207. package/node_modules/@codingns/session-sync-core/dist/providers/opencode.js.map +1 -1
  208. package/node_modules/@codingns/session-sync-core/dist/runtime/claude-runtime.d.ts +5 -1
  209. package/node_modules/@codingns/session-sync-core/dist/runtime/claude-runtime.js +103 -51
  210. package/node_modules/@codingns/session-sync-core/dist/runtime/claude-runtime.js.map +1 -1
  211. package/node_modules/@codingns/session-sync-core/dist/runtime/codex-runtime.d.ts +2 -1
  212. package/node_modules/@codingns/session-sync-core/dist/runtime/codex-runtime.js +41 -21
  213. package/node_modules/@codingns/session-sync-core/dist/runtime/codex-runtime.js.map +1 -1
  214. package/node_modules/@codingns/session-sync-core/dist/runtime/gemini-runtime.js +32 -8
  215. package/node_modules/@codingns/session-sync-core/dist/runtime/gemini-runtime.js.map +1 -1
  216. package/node_modules/@codingns/session-sync-core/dist/runtime/legna-runtime.d.ts +15 -0
  217. package/node_modules/@codingns/session-sync-core/dist/runtime/legna-runtime.js +16 -0
  218. package/node_modules/@codingns/session-sync-core/dist/runtime/legna-runtime.js.map +1 -0
  219. package/node_modules/@codingns/session-sync-core/dist/runtime/opencode-runtime.js +167 -10
  220. package/node_modules/@codingns/session-sync-core/dist/runtime/opencode-runtime.js.map +1 -1
  221. package/node_modules/@codingns/session-sync-core/dist/runtime/types.d.ts +2 -0
  222. package/node_modules/@codingns/session-sync-core/dist/types.d.ts +1 -1
  223. package/node_modules/@codingns/session-sync-core/dist/types.js +1 -1
  224. package/node_modules/@codingns/session-sync-core/dist/types.js.map +1 -1
  225. package/package.json +1 -1
  226. package/dist/public/assets/AdaptiveButlerPage-uFwDdN-F.js +0 -3
  227. package/dist/public/assets/ConversationPage-z3sXtKZ7.js +0 -4
  228. package/dist/public/assets/DesktopWindowPage-CZcoGApB.js +0 -2
  229. package/dist/public/assets/FileContextPanel-C3qex8bb.js +0 -1
  230. package/dist/public/assets/GitSidebar-BK6H16XU.js +0 -6
  231. package/dist/public/assets/MobileCreateSessionSheet-BYfbvK8o.js +0 -1
  232. package/dist/public/assets/MobileSheet-Ckug8hTb.js +0 -1
  233. package/dist/public/assets/MobileWorkspaceSwitcherHeader-RqWrBdn2.js +0 -1
  234. package/dist/public/assets/SessionIndexPage-DuK10DL5.js +0 -1
  235. package/dist/public/assets/SettingsPage-fyD-xaHL.js +0 -1
  236. package/dist/public/assets/TerminalManagerPanel-CCLr1Ypk.js +0 -1
  237. package/dist/public/assets/TerminalRuntimeFallbackModal-aUzjEBwP.js +0 -1
  238. package/dist/public/assets/ToolGitPage-C264yjS9.js +0 -1
  239. package/dist/public/assets/ToolProcessesPage-BOP4A1cb.js +0 -1
  240. package/dist/public/assets/ToolsHomePage-CQxGiKQA.js +0 -1
  241. package/dist/public/assets/WorkbenchLandingPage-CvAY68ca.js +0 -1
  242. package/dist/public/assets/WorkbenchLayout-DGm8Tc5M.js +0 -3
  243. package/dist/public/assets/WorkbenchModal-0tPIIhca.js +0 -1
  244. package/dist/public/assets/WorkbenchShellRoute-BF0nHWOk.css +0 -1
  245. package/dist/public/assets/WorkbenchShellRoute-DBBOsJo9.js +0 -1
  246. package/dist/public/assets/WorkspaceDebugDetailPage-CDerFYd2.js +0 -1
  247. package/dist/public/assets/WorkspaceDetailPage-BlJc1CHE.js +0 -1
  248. package/dist/public/assets/WorkspaceHomePage-BUsKJ3lv.js +0 -1
  249. package/dist/public/assets/default-session-permission-mode-DT4SGiwp.js +0 -1
  250. package/dist/public/assets/index-BZLcEHW3.js +0 -42
  251. package/dist/public/assets/index-BbspQPC2.css +0 -1
  252. package/dist/public/assets/session-runtime-machine-DdLeDqQr.js +0 -17
  253. package/dist/public/assets/useRegisteredDebugTemplates-oFAQNIqh.js +0 -1
@@ -0,0 +1,42 @@
1
+ const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/App-B9HcTkMT.js","assets/App-CcDXqFl1.css"])))=>i.map(i=>d[i]);
2
+ var fh=Object.defineProperty;var gh=(o,i,a)=>i in o?fh(o,i,{enumerable:!0,configurable:!0,writable:!0,value:a}):o[i]=a;var L=(o,i,a)=>gh(o,typeof i!="symbol"?i+"":i,a);function bh(o,i){for(var a=0;a<i.length;a++){const c=i[a];if(typeof c!="string"&&!Array.isArray(c)){for(const d in c)if(d!=="default"&&!(d in o)){const p=Object.getOwnPropertyDescriptor(c,d);p&&Object.defineProperty(o,d,p.get?p:{enumerable:!0,get:()=>c[d]})}}}return Object.freeze(Object.defineProperty(o,Symbol.toStringTag,{value:"Module"}))}(function(){const i=document.createElement("link").relList;if(i&&i.supports&&i.supports("modulepreload"))return;for(const d of document.querySelectorAll('link[rel="modulepreload"]'))c(d);new MutationObserver(d=>{for(const p of d)if(p.type==="childList")for(const w of p.addedNodes)w.tagName==="LINK"&&w.rel==="modulepreload"&&c(w)}).observe(document,{childList:!0,subtree:!0});function a(d){const p={};return d.integrity&&(p.integrity=d.integrity),d.referrerPolicy&&(p.referrerPolicy=d.referrerPolicy),d.crossOrigin==="use-credentials"?p.credentials="include":d.crossOrigin==="anonymous"?p.credentials="omit":p.credentials="same-origin",p}function c(d){if(d.ep)return;d.ep=!0;const p=a(d);fetch(d.href,p)}})();function Sd(o){return o&&o.__esModule&&Object.prototype.hasOwnProperty.call(o,"default")?o.default:o}var yl={exports:{}},Wr={},Sl={exports:{}},G={};/**
3
+ * @license React
4
+ * react.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 Ou;function yh(){if(Ou)return G;Ou=1;var o=Symbol.for("react.element"),i=Symbol.for("react.portal"),a=Symbol.for("react.fragment"),c=Symbol.for("react.strict_mode"),d=Symbol.for("react.profiler"),p=Symbol.for("react.provider"),w=Symbol.for("react.context"),v=Symbol.for("react.forward_ref"),R=Symbol.for("react.suspense"),U=Symbol.for("react.memo"),M=Symbol.for("react.lazy"),B=Symbol.iterator;function V(g){return g===null||typeof g!="object"?null:(g=B&&g[B]||g["@@iterator"],typeof g=="function"?g:null)}var X={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},fe=Object.assign,ne={};function re(g,C,q){this.props=g,this.context=C,this.refs=ne,this.updater=q||X}re.prototype.isReactComponent={},re.prototype.setState=function(g,C){if(typeof g!="object"&&typeof g!="function"&&g!=null)throw Error("setState(...): takes an object of state variables to update or a function which returns an object of state variables.");this.updater.enqueueSetState(this,g,C,"setState")},re.prototype.forceUpdate=function(g){this.updater.enqueueForceUpdate(this,g,"forceUpdate")};function Rt(){}Rt.prototype=re.prototype;function St(g,C,q){this.props=g,this.context=C,this.refs=ne,this.updater=q||X}var st=St.prototype=new Rt;st.constructor=St,fe(st,re.prototype),st.isPureReactComponent=!0;var Re=Array.isArray,ct=Object.prototype.hasOwnProperty,Fe={current:null},Oe={key:!0,ref:!0,__self:!0,__source:!0};function et(g,C,q){var K,$={},Y=null,ie=null;if(C!=null)for(K in C.ref!==void 0&&(ie=C.ref),C.key!==void 0&&(Y=""+C.key),C)ct.call(C,K)&&!Oe.hasOwnProperty(K)&&($[K]=C[K]);var ee=arguments.length-2;if(ee===1)$.children=q;else if(1<ee){for(var se=Array(ee),$e=0;$e<ee;$e++)se[$e]=arguments[$e+2];$.children=se}if(g&&g.defaultProps)for(K in ee=g.defaultProps,ee)$[K]===void 0&&($[K]=ee[K]);return{$$typeof:o,type:g,key:Y,ref:ie,props:$,_owner:Fe.current}}function Bt(g,C){return{$$typeof:o,type:g.type,key:C,ref:g.ref,props:g.props,_owner:g._owner}}function At(g){return typeof g=="object"&&g!==null&&g.$$typeof===o}function sn(g){var C={"=":"=0",":":"=2"};return"$"+g.replace(/[=:]/g,function(q){return C[q]})}var wt=/\/+/g;function Qe(g,C){return typeof g=="object"&&g!==null&&g.key!=null?sn(""+g.key):C.toString(36)}function ut(g,C,q,K,$){var Y=typeof g;(Y==="undefined"||Y==="boolean")&&(g=null);var ie=!1;if(g===null)ie=!0;else switch(Y){case"string":case"number":ie=!0;break;case"object":switch(g.$$typeof){case o:case i:ie=!0}}if(ie)return ie=g,$=$(ie),g=K===""?"."+Qe(ie,0):K,Re($)?(q="",g!=null&&(q=g.replace(wt,"$&/")+"/"),ut($,C,q,"",function($e){return $e})):$!=null&&(At($)&&($=Bt($,q+(!$.key||ie&&ie.key===$.key?"":(""+$.key).replace(wt,"$&/")+"/")+g)),C.push($)),1;if(ie=0,K=K===""?".":K+":",Re(g))for(var ee=0;ee<g.length;ee++){Y=g[ee];var se=K+Qe(Y,ee);ie+=ut(Y,C,q,se,$)}else if(se=V(g),typeof se=="function")for(g=se.call(g),ee=0;!(Y=g.next()).done;)Y=Y.value,se=K+Qe(Y,ee++),ie+=ut(Y,C,q,se,$);else if(Y==="object")throw C=String(g),Error("Objects are not valid as a React child (found: "+(C==="[object Object]"?"object with keys {"+Object.keys(g).join(", ")+"}":C)+"). If you meant to render a collection of children, use an array instead.");return ie}function vt(g,C,q){if(g==null)return g;var K=[],$=0;return ut(g,K,"","",function(Y){return C.call(q,Y,$++)}),K}function _e(g){if(g._status===-1){var C=g._result;C=C(),C.then(function(q){(g._status===0||g._status===-1)&&(g._status=1,g._result=q)},function(q){(g._status===0||g._status===-1)&&(g._status=2,g._result=q)}),g._status===-1&&(g._status=0,g._result=C)}if(g._status===1)return g._result.default;throw g._result}var pe={current:null},A={transition:null},W={ReactCurrentDispatcher:pe,ReactCurrentBatchConfig:A,ReactCurrentOwner:Fe};function F(){throw Error("act(...) is not supported in production builds of React.")}return G.Children={map:vt,forEach:function(g,C,q){vt(g,function(){C.apply(this,arguments)},q)},count:function(g){var C=0;return vt(g,function(){C++}),C},toArray:function(g){return vt(g,function(C){return C})||[]},only:function(g){if(!At(g))throw Error("React.Children.only expected to receive a single React element child.");return g}},G.Component=re,G.Fragment=a,G.Profiler=d,G.PureComponent=St,G.StrictMode=c,G.Suspense=R,G.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED=W,G.act=F,G.cloneElement=function(g,C,q){if(g==null)throw Error("React.cloneElement(...): The argument must be a React element, but you passed "+g+".");var K=fe({},g.props),$=g.key,Y=g.ref,ie=g._owner;if(C!=null){if(C.ref!==void 0&&(Y=C.ref,ie=Fe.current),C.key!==void 0&&($=""+C.key),g.type&&g.type.defaultProps)var ee=g.type.defaultProps;for(se in C)ct.call(C,se)&&!Oe.hasOwnProperty(se)&&(K[se]=C[se]===void 0&&ee!==void 0?ee[se]:C[se])}var se=arguments.length-2;if(se===1)K.children=q;else if(1<se){ee=Array(se);for(var $e=0;$e<se;$e++)ee[$e]=arguments[$e+2];K.children=ee}return{$$typeof:o,type:g.type,key:$,ref:Y,props:K,_owner:ie}},G.createContext=function(g){return g={$$typeof:w,_currentValue:g,_currentValue2:g,_threadCount:0,Provider:null,Consumer:null,_defaultValue:null,_globalName:null},g.Provider={$$typeof:p,_context:g},g.Consumer=g},G.createElement=et,G.createFactory=function(g){var C=et.bind(null,g);return C.type=g,C},G.createRef=function(){return{current:null}},G.forwardRef=function(g){return{$$typeof:v,render:g}},G.isValidElement=At,G.lazy=function(g){return{$$typeof:M,_payload:{_status:-1,_result:g},_init:_e}},G.memo=function(g,C){return{$$typeof:U,type:g,compare:C===void 0?null:C}},G.startTransition=function(g){var C=A.transition;A.transition={};try{g()}finally{A.transition=C}},G.unstable_act=F,G.useCallback=function(g,C){return pe.current.useCallback(g,C)},G.useContext=function(g){return pe.current.useContext(g)},G.useDebugValue=function(){},G.useDeferredValue=function(g){return pe.current.useDeferredValue(g)},G.useEffect=function(g,C){return pe.current.useEffect(g,C)},G.useId=function(){return pe.current.useId()},G.useImperativeHandle=function(g,C,q){return pe.current.useImperativeHandle(g,C,q)},G.useInsertionEffect=function(g,C){return pe.current.useInsertionEffect(g,C)},G.useLayoutEffect=function(g,C){return pe.current.useLayoutEffect(g,C)},G.useMemo=function(g,C){return pe.current.useMemo(g,C)},G.useReducer=function(g,C,q){return pe.current.useReducer(g,C,q)},G.useRef=function(g){return pe.current.useRef(g)},G.useState=function(g){return pe.current.useState(g)},G.useSyncExternalStore=function(g,C,q){return pe.current.useSyncExternalStore(g,C,q)},G.useTransition=function(){return pe.current.useTransition()},G.version="18.3.1",G}var _u;function xl(){return _u||(_u=1,Sl.exports=yh()),Sl.exports}/**
11
+ * @license React
12
+ * react-jsx-runtime.production.min.js
13
+ *
14
+ * Copyright (c) Facebook, Inc. and its affiliates.
15
+ *
16
+ * This source code is licensed under the MIT license found in the
17
+ * LICENSE file in the root directory of this source tree.
18
+ */var Wu;function Sh(){if(Wu)return Wr;Wu=1;var o=xl(),i=Symbol.for("react.element"),a=Symbol.for("react.fragment"),c=Object.prototype.hasOwnProperty,d=o.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner,p={key:!0,ref:!0,__self:!0,__source:!0};function w(v,R,U){var M,B={},V=null,X=null;U!==void 0&&(V=""+U),R.key!==void 0&&(V=""+R.key),R.ref!==void 0&&(X=R.ref);for(M in R)c.call(R,M)&&!p.hasOwnProperty(M)&&(B[M]=R[M]);if(v&&v.defaultProps)for(M in R=v.defaultProps,R)B[M]===void 0&&(B[M]=R[M]);return{$$typeof:i,type:v,key:V,ref:X,props:B,_owner:d.current}}return Wr.Fragment=a,Wr.jsx=w,Wr.jsxs=w,Wr}var ju;function wh(){return ju||(ju=1,yl.exports=Sh()),yl.exports}var an=wh(),io={},wl={exports:{}},Ge={},vl={exports:{}},kl={};/**
19
+ * @license React
20
+ * scheduler.production.min.js
21
+ *
22
+ * Copyright (c) Facebook, Inc. and its affiliates.
23
+ *
24
+ * This source code is licensed under the MIT license found in the
25
+ * LICENSE file in the root directory of this source tree.
26
+ */var zu;function vh(){return zu||(zu=1,(function(o){function i(A,W){var F=A.length;A.push(W);e:for(;0<F;){var g=F-1>>>1,C=A[g];if(0<d(C,W))A[g]=W,A[F]=C,F=g;else break e}}function a(A){return A.length===0?null:A[0]}function c(A){if(A.length===0)return null;var W=A[0],F=A.pop();if(F!==W){A[0]=F;e:for(var g=0,C=A.length,q=C>>>1;g<q;){var K=2*(g+1)-1,$=A[K],Y=K+1,ie=A[Y];if(0>d($,F))Y<C&&0>d(ie,$)?(A[g]=ie,A[Y]=F,g=Y):(A[g]=$,A[K]=F,g=K);else if(Y<C&&0>d(ie,F))A[g]=ie,A[Y]=F,g=Y;else break e}}return W}function d(A,W){var F=A.sortIndex-W.sortIndex;return F!==0?F:A.id-W.id}if(typeof performance=="object"&&typeof performance.now=="function"){var p=performance;o.unstable_now=function(){return p.now()}}else{var w=Date,v=w.now();o.unstable_now=function(){return w.now()-v}}var R=[],U=[],M=1,B=null,V=3,X=!1,fe=!1,ne=!1,re=typeof setTimeout=="function"?setTimeout:null,Rt=typeof clearTimeout=="function"?clearTimeout:null,St=typeof setImmediate<"u"?setImmediate:null;typeof navigator<"u"&&navigator.scheduling!==void 0&&navigator.scheduling.isInputPending!==void 0&&navigator.scheduling.isInputPending.bind(navigator.scheduling);function st(A){for(var W=a(U);W!==null;){if(W.callback===null)c(U);else if(W.startTime<=A)c(U),W.sortIndex=W.expirationTime,i(R,W);else break;W=a(U)}}function Re(A){if(ne=!1,st(A),!fe)if(a(R)!==null)fe=!0,_e(ct);else{var W=a(U);W!==null&&pe(Re,W.startTime-A)}}function ct(A,W){fe=!1,ne&&(ne=!1,Rt(et),et=-1),X=!0;var F=V;try{for(st(W),B=a(R);B!==null&&(!(B.expirationTime>W)||A&&!sn());){var g=B.callback;if(typeof g=="function"){B.callback=null,V=B.priorityLevel;var C=g(B.expirationTime<=W);W=o.unstable_now(),typeof C=="function"?B.callback=C:B===a(R)&&c(R),st(W)}else c(R);B=a(R)}if(B!==null)var q=!0;else{var K=a(U);K!==null&&pe(Re,K.startTime-W),q=!1}return q}finally{B=null,V=F,X=!1}}var Fe=!1,Oe=null,et=-1,Bt=5,At=-1;function sn(){return!(o.unstable_now()-At<Bt)}function wt(){if(Oe!==null){var A=o.unstable_now();At=A;var W=!0;try{W=Oe(!0,A)}finally{W?Qe():(Fe=!1,Oe=null)}}else Fe=!1}var Qe;if(typeof St=="function")Qe=function(){St(wt)};else if(typeof MessageChannel<"u"){var ut=new MessageChannel,vt=ut.port2;ut.port1.onmessage=wt,Qe=function(){vt.postMessage(null)}}else Qe=function(){re(wt,0)};function _e(A){Oe=A,Fe||(Fe=!0,Qe())}function pe(A,W){et=re(function(){A(o.unstable_now())},W)}o.unstable_IdlePriority=5,o.unstable_ImmediatePriority=1,o.unstable_LowPriority=4,o.unstable_NormalPriority=3,o.unstable_Profiling=null,o.unstable_UserBlockingPriority=2,o.unstable_cancelCallback=function(A){A.callback=null},o.unstable_continueExecution=function(){fe||X||(fe=!0,_e(ct))},o.unstable_forceFrameRate=function(A){0>A||125<A?console.error("forceFrameRate takes a positive int between 0 and 125, forcing frame rates higher than 125 fps is not supported"):Bt=0<A?Math.floor(1e3/A):5},o.unstable_getCurrentPriorityLevel=function(){return V},o.unstable_getFirstCallbackNode=function(){return a(R)},o.unstable_next=function(A){switch(V){case 1:case 2:case 3:var W=3;break;default:W=V}var F=V;V=W;try{return A()}finally{V=F}},o.unstable_pauseExecution=function(){},o.unstable_requestPaint=function(){},o.unstable_runWithPriority=function(A,W){switch(A){case 1:case 2:case 3:case 4:case 5:break;default:A=3}var F=V;V=A;try{return W()}finally{V=F}},o.unstable_scheduleCallback=function(A,W,F){var g=o.unstable_now();switch(typeof F=="object"&&F!==null?(F=F.delay,F=typeof F=="number"&&0<F?g+F:g):F=g,A){case 1:var C=-1;break;case 2:C=250;break;case 5:C=1073741823;break;case 4:C=1e4;break;default:C=5e3}return C=F+C,A={id:M++,callback:W,priorityLevel:A,startTime:F,expirationTime:C,sortIndex:-1},F>g?(A.sortIndex=F,i(U,A),a(R)===null&&A===a(U)&&(ne?(Rt(et),et=-1):ne=!0,pe(Re,F-g))):(A.sortIndex=C,i(R,A),fe||X||(fe=!0,_e(ct))),A},o.unstable_shouldYield=sn,o.unstable_wrapCallback=function(A){var W=V;return function(){var F=V;V=W;try{return A.apply(this,arguments)}finally{V=F}}}})(kl)),kl}var Vu;function kh(){return Vu||(Vu=1,vl.exports=vh()),vl.exports}/**
27
+ * @license React
28
+ * react-dom.production.min.js
29
+ *
30
+ * Copyright (c) Facebook, Inc. and its affiliates.
31
+ *
32
+ * This source code is licensed under the MIT license found in the
33
+ * LICENSE file in the root directory of this source tree.
34
+ */var qu;function Ch(){if(qu)return Ge;qu=1;var o=xl(),i=kh();function a(e){for(var t="https://reactjs.org/docs/error-decoder.html?invariant="+e,n=1;n<arguments.length;n++)t+="&args[]="+encodeURIComponent(arguments[n]);return"Minified React error #"+e+"; visit "+t+" for the full message or use the non-minified dev environment for full errors and additional helpful warnings."}var c=new Set,d={};function p(e,t){w(e,t),w(e+"Capture",t)}function w(e,t){for(d[e]=t,e=0;e<t.length;e++)c.add(t[e])}var v=!(typeof window>"u"||typeof window.document>"u"||typeof window.document.createElement>"u"),R=Object.prototype.hasOwnProperty,U=/^[:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD][:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD\-.0-9\u00B7\u0300-\u036F\u203F-\u2040]*$/,M={},B={};function V(e){return R.call(B,e)?!0:R.call(M,e)?!1:U.test(e)?B[e]=!0:(M[e]=!0,!1)}function X(e,t,n,r){if(n!==null&&n.type===0)return!1;switch(typeof t){case"function":case"symbol":return!0;case"boolean":return r?!1:n!==null?!n.acceptsBooleans:(e=e.toLowerCase().slice(0,5),e!=="data-"&&e!=="aria-");default:return!1}}function fe(e,t,n,r){if(t===null||typeof t>"u"||X(e,t,n,r))return!0;if(r)return!1;if(n!==null)switch(n.type){case 3:return!t;case 4:return t===!1;case 5:return isNaN(t);case 6:return isNaN(t)||1>t}return!1}function ne(e,t,n,r,l,s,u){this.acceptsBooleans=t===2||t===3||t===4,this.attributeName=r,this.attributeNamespace=l,this.mustUseProperty=n,this.propertyName=e,this.type=t,this.sanitizeURL=s,this.removeEmptyString=u}var re={};"children dangerouslySetInnerHTML defaultValue defaultChecked innerHTML suppressContentEditableWarning suppressHydrationWarning style".split(" ").forEach(function(e){re[e]=new ne(e,0,!1,e,null,!1,!1)}),[["acceptCharset","accept-charset"],["className","class"],["htmlFor","for"],["httpEquiv","http-equiv"]].forEach(function(e){var t=e[0];re[t]=new ne(t,1,!1,e[1],null,!1,!1)}),["contentEditable","draggable","spellCheck","value"].forEach(function(e){re[e]=new ne(e,2,!1,e.toLowerCase(),null,!1,!1)}),["autoReverse","externalResourcesRequired","focusable","preserveAlpha"].forEach(function(e){re[e]=new ne(e,2,!1,e,null,!1,!1)}),"allowFullScreen async autoFocus autoPlay controls default defer disabled disablePictureInPicture disableRemotePlayback formNoValidate hidden loop noModule noValidate open playsInline readOnly required reversed scoped seamless itemScope".split(" ").forEach(function(e){re[e]=new ne(e,3,!1,e.toLowerCase(),null,!1,!1)}),["checked","multiple","muted","selected"].forEach(function(e){re[e]=new ne(e,3,!0,e,null,!1,!1)}),["capture","download"].forEach(function(e){re[e]=new ne(e,4,!1,e,null,!1,!1)}),["cols","rows","size","span"].forEach(function(e){re[e]=new ne(e,6,!1,e,null,!1,!1)}),["rowSpan","start"].forEach(function(e){re[e]=new ne(e,5,!1,e.toLowerCase(),null,!1,!1)});var Rt=/[\-:]([a-z])/g;function St(e){return e[1].toUpperCase()}"accent-height alignment-baseline arabic-form baseline-shift cap-height clip-path clip-rule color-interpolation color-interpolation-filters color-profile color-rendering dominant-baseline enable-background fill-opacity fill-rule flood-color flood-opacity font-family font-size font-size-adjust font-stretch font-style font-variant font-weight glyph-name glyph-orientation-horizontal glyph-orientation-vertical horiz-adv-x horiz-origin-x image-rendering letter-spacing lighting-color marker-end marker-mid marker-start overline-position overline-thickness paint-order panose-1 pointer-events rendering-intent shape-rendering stop-color stop-opacity strikethrough-position strikethrough-thickness stroke-dasharray stroke-dashoffset stroke-linecap stroke-linejoin stroke-miterlimit stroke-opacity stroke-width text-anchor text-decoration text-rendering underline-position underline-thickness unicode-bidi unicode-range units-per-em v-alphabetic v-hanging v-ideographic v-mathematical vector-effect vert-adv-y vert-origin-x vert-origin-y word-spacing writing-mode xmlns:xlink x-height".split(" ").forEach(function(e){var t=e.replace(Rt,St);re[t]=new ne(t,1,!1,e,null,!1,!1)}),"xlink:actuate xlink:arcrole xlink:role xlink:show xlink:title xlink:type".split(" ").forEach(function(e){var t=e.replace(Rt,St);re[t]=new ne(t,1,!1,e,"http://www.w3.org/1999/xlink",!1,!1)}),["xml:base","xml:lang","xml:space"].forEach(function(e){var t=e.replace(Rt,St);re[t]=new ne(t,1,!1,e,"http://www.w3.org/XML/1998/namespace",!1,!1)}),["tabIndex","crossOrigin"].forEach(function(e){re[e]=new ne(e,1,!1,e.toLowerCase(),null,!1,!1)}),re.xlinkHref=new ne("xlinkHref",1,!1,"xlink:href","http://www.w3.org/1999/xlink",!0,!1),["src","href","action","formAction"].forEach(function(e){re[e]=new ne(e,1,!1,e.toLowerCase(),null,!0,!0)});function st(e,t,n,r){var l=re.hasOwnProperty(t)?re[t]:null;(l!==null?l.type!==0:r||!(2<t.length)||t[0]!=="o"&&t[0]!=="O"||t[1]!=="n"&&t[1]!=="N")&&(fe(t,n,l,r)&&(n=null),r||l===null?V(t)&&(n===null?e.removeAttribute(t):e.setAttribute(t,""+n)):l.mustUseProperty?e[l.propertyName]=n===null?l.type===3?!1:"":n:(t=l.attributeName,r=l.attributeNamespace,n===null?e.removeAttribute(t):(l=l.type,n=l===3||l===4&&n===!0?"":""+n,r?e.setAttributeNS(r,t,n):e.setAttribute(t,n))))}var Re=o.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED,ct=Symbol.for("react.element"),Fe=Symbol.for("react.portal"),Oe=Symbol.for("react.fragment"),et=Symbol.for("react.strict_mode"),Bt=Symbol.for("react.profiler"),At=Symbol.for("react.provider"),sn=Symbol.for("react.context"),wt=Symbol.for("react.forward_ref"),Qe=Symbol.for("react.suspense"),ut=Symbol.for("react.suspense_list"),vt=Symbol.for("react.memo"),_e=Symbol.for("react.lazy"),pe=Symbol.for("react.offscreen"),A=Symbol.iterator;function W(e){return e===null||typeof e!="object"?null:(e=A&&e[A]||e["@@iterator"],typeof e=="function"?e:null)}var F=Object.assign,g;function C(e){if(g===void 0)try{throw Error()}catch(n){var t=n.stack.trim().match(/\n( *(at )?)/);g=t&&t[1]||""}return`
35
+ `+g+e}var q=!1;function K(e,t){if(!e||q)return"";q=!0;var n=Error.prepareStackTrace;Error.prepareStackTrace=void 0;try{if(t)if(t=function(){throw Error()},Object.defineProperty(t.prototype,"props",{set:function(){throw Error()}}),typeof Reflect=="object"&&Reflect.construct){try{Reflect.construct(t,[])}catch(S){var r=S}Reflect.construct(e,[],t)}else{try{t.call()}catch(S){r=S}e.call(t.prototype)}else{try{throw Error()}catch(S){r=S}e()}}catch(S){if(S&&r&&typeof S.stack=="string"){for(var l=S.stack.split(`
36
+ `),s=r.stack.split(`
37
+ `),u=l.length-1,m=s.length-1;1<=u&&0<=m&&l[u]!==s[m];)m--;for(;1<=u&&0<=m;u--,m--)if(l[u]!==s[m]){if(u!==1||m!==1)do if(u--,m--,0>m||l[u]!==s[m]){var h=`
38
+ `+l[u].replace(" at new "," at ");return e.displayName&&h.includes("<anonymous>")&&(h=h.replace("<anonymous>",e.displayName)),h}while(1<=u&&0<=m);break}}}finally{q=!1,Error.prepareStackTrace=n}return(e=e?e.displayName||e.name:"")?C(e):""}function $(e){switch(e.tag){case 5:return C(e.type);case 16:return C("Lazy");case 13:return C("Suspense");case 19:return C("SuspenseList");case 0:case 2:case 15:return e=K(e.type,!1),e;case 11:return e=K(e.type.render,!1),e;case 1:return e=K(e.type,!0),e;default:return""}}function Y(e){if(e==null)return null;if(typeof e=="function")return e.displayName||e.name||null;if(typeof e=="string")return e;switch(e){case Oe:return"Fragment";case Fe:return"Portal";case Bt:return"Profiler";case et:return"StrictMode";case Qe:return"Suspense";case ut:return"SuspenseList"}if(typeof e=="object")switch(e.$$typeof){case sn:return(e.displayName||"Context")+".Consumer";case At:return(e._context.displayName||"Context")+".Provider";case wt:var t=e.render;return e=e.displayName,e||(e=t.displayName||t.name||"",e=e!==""?"ForwardRef("+e+")":"ForwardRef"),e;case vt:return t=e.displayName||null,t!==null?t:Y(e.type)||"Memo";case _e:t=e._payload,e=e._init;try{return Y(e(t))}catch{}}return null}function ie(e){var t=e.type;switch(e.tag){case 24:return"Cache";case 9:return(t.displayName||"Context")+".Consumer";case 10:return(t._context.displayName||"Context")+".Provider";case 18:return"DehydratedFragment";case 11:return e=t.render,e=e.displayName||e.name||"",t.displayName||(e!==""?"ForwardRef("+e+")":"ForwardRef");case 7:return"Fragment";case 5:return t;case 4:return"Portal";case 3:return"Root";case 6:return"Text";case 16:return Y(t);case 8:return t===et?"StrictMode":"Mode";case 22:return"Offscreen";case 12:return"Profiler";case 21:return"Scope";case 13:return"Suspense";case 19:return"SuspenseList";case 25:return"TracingMarker";case 1:case 0:case 17:case 2:case 14:case 15:if(typeof t=="function")return t.displayName||t.name||null;if(typeof t=="string")return t}return null}function ee(e){switch(typeof e){case"boolean":case"number":case"string":case"undefined":return e;case"object":return e;default:return""}}function se(e){var t=e.type;return(e=e.nodeName)&&e.toLowerCase()==="input"&&(t==="checkbox"||t==="radio")}function $e(e){var t=se(e)?"checked":"value",n=Object.getOwnPropertyDescriptor(e.constructor.prototype,t),r=""+e[t];if(!e.hasOwnProperty(t)&&typeof n<"u"&&typeof n.get=="function"&&typeof n.set=="function"){var l=n.get,s=n.set;return Object.defineProperty(e,t,{configurable:!0,get:function(){return l.call(this)},set:function(u){r=""+u,s.call(this,u)}}),Object.defineProperty(e,t,{enumerable:n.enumerable}),{getValue:function(){return r},setValue:function(u){r=""+u},stopTracking:function(){e._valueTracker=null,delete e[t]}}}}function Qr(e){e._valueTracker||(e._valueTracker=$e(e))}function ql(e){if(!e)return!1;var t=e._valueTracker;if(!t)return!0;var n=t.getValue(),r="";return e&&(r=se(e)?e.checked?"true":"false":e.value),e=r,e!==n?(t.setValue(e),!0):!1}function $r(e){if(e=e||(typeof document<"u"?document:void 0),typeof e>"u")return null;try{return e.activeElement||e.body}catch{return e.body}}function To(e,t){var n=t.checked;return F({},t,{defaultChecked:void 0,defaultValue:void 0,value:void 0,checked:n??e._wrapperState.initialChecked})}function Gl(e,t){var n=t.defaultValue==null?"":t.defaultValue,r=t.checked!=null?t.checked:t.defaultChecked;n=ee(t.value!=null?t.value:n),e._wrapperState={initialChecked:r,initialValue:n,controlled:t.type==="checkbox"||t.type==="radio"?t.checked!=null:t.value!=null}}function Kl(e,t){t=t.checked,t!=null&&st(e,"checked",t,!1)}function Po(e,t){Kl(e,t);var n=ee(t.value),r=t.type;if(n!=null)r==="number"?(n===0&&e.value===""||e.value!=n)&&(e.value=""+n):e.value!==""+n&&(e.value=""+n);else if(r==="submit"||r==="reset"){e.removeAttribute("value");return}t.hasOwnProperty("value")?Ro(e,t.type,n):t.hasOwnProperty("defaultValue")&&Ro(e,t.type,ee(t.defaultValue)),t.checked==null&&t.defaultChecked!=null&&(e.defaultChecked=!!t.defaultChecked)}function Ql(e,t,n){if(t.hasOwnProperty("value")||t.hasOwnProperty("defaultValue")){var r=t.type;if(!(r!=="submit"&&r!=="reset"||t.value!==void 0&&t.value!==null))return;t=""+e._wrapperState.initialValue,n||t===e.value||(e.value=t),e.defaultValue=t}n=e.name,n!==""&&(e.name=""),e.defaultChecked=!!e._wrapperState.initialChecked,n!==""&&(e.name=n)}function Ro(e,t,n){(t!=="number"||$r(e.ownerDocument)!==e)&&(n==null?e.defaultValue=""+e._wrapperState.initialValue:e.defaultValue!==""+n&&(e.defaultValue=""+n))}var nr=Array.isArray;function Tn(e,t,n,r){if(e=e.options,t){t={};for(var l=0;l<n.length;l++)t["$"+n[l]]=!0;for(n=0;n<e.length;n++)l=t.hasOwnProperty("$"+e[n].value),e[n].selected!==l&&(e[n].selected=l),l&&r&&(e[n].defaultSelected=!0)}else{for(n=""+ee(n),t=null,l=0;l<e.length;l++){if(e[l].value===n){e[l].selected=!0,r&&(e[l].defaultSelected=!0);return}t!==null||e[l].disabled||(t=e[l])}t!==null&&(t.selected=!0)}}function Ao(e,t){if(t.dangerouslySetInnerHTML!=null)throw Error(a(91));return F({},t,{value:void 0,defaultValue:void 0,children:""+e._wrapperState.initialValue})}function $l(e,t){var n=t.value;if(n==null){if(n=t.children,t=t.defaultValue,n!=null){if(t!=null)throw Error(a(92));if(nr(n)){if(1<n.length)throw Error(a(93));n=n[0]}t=n}t==null&&(t=""),n=t}e._wrapperState={initialValue:ee(n)}}function Yl(e,t){var n=ee(t.value),r=ee(t.defaultValue);n!=null&&(n=""+n,n!==e.value&&(e.value=n),t.defaultValue==null&&e.defaultValue!==n&&(e.defaultValue=n)),r!=null&&(e.defaultValue=""+r)}function Zl(e){var t=e.textContent;t===e._wrapperState.initialValue&&t!==""&&t!==null&&(e.value=t)}function Jl(e){switch(e){case"svg":return"http://www.w3.org/2000/svg";case"math":return"http://www.w3.org/1998/Math/MathML";default:return"http://www.w3.org/1999/xhtml"}}function Lo(e,t){return e==null||e==="http://www.w3.org/1999/xhtml"?Jl(t):e==="http://www.w3.org/2000/svg"&&t==="foreignObject"?"http://www.w3.org/1999/xhtml":e}var Yr,Xl=(function(e){return typeof MSApp<"u"&&MSApp.execUnsafeLocalFunction?function(t,n,r,l){MSApp.execUnsafeLocalFunction(function(){return e(t,n,r,l)})}:e})(function(e,t){if(e.namespaceURI!=="http://www.w3.org/2000/svg"||"innerHTML"in e)e.innerHTML=t;else{for(Yr=Yr||document.createElement("div"),Yr.innerHTML="<svg>"+t.valueOf().toString()+"</svg>",t=Yr.firstChild;e.firstChild;)e.removeChild(e.firstChild);for(;t.firstChild;)e.appendChild(t.firstChild)}});function rr(e,t){if(t){var n=e.firstChild;if(n&&n===e.lastChild&&n.nodeType===3){n.nodeValue=t;return}}e.textContent=t}var ir={animationIterationCount:!0,aspectRatio:!0,borderImageOutset:!0,borderImageSlice:!0,borderImageWidth:!0,boxFlex:!0,boxFlexGroup:!0,boxOrdinalGroup:!0,columnCount:!0,columns:!0,flex:!0,flexGrow:!0,flexPositive:!0,flexShrink:!0,flexNegative:!0,flexOrder:!0,gridArea:!0,gridRow:!0,gridRowEnd:!0,gridRowSpan:!0,gridRowStart:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnSpan:!0,gridColumnStart:!0,fontWeight:!0,lineClamp:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,tabSize:!0,widows:!0,zIndex:!0,zoom:!0,fillOpacity:!0,floodOpacity:!0,stopOpacity:!0,strokeDasharray:!0,strokeDashoffset:!0,strokeMiterlimit:!0,strokeOpacity:!0,strokeWidth:!0},Sp=["Webkit","ms","Moz","O"];Object.keys(ir).forEach(function(e){Sp.forEach(function(t){t=t+e.charAt(0).toUpperCase()+e.substring(1),ir[t]=ir[e]})});function es(e,t,n){return t==null||typeof t=="boolean"||t===""?"":n||typeof t!="number"||t===0||ir.hasOwnProperty(e)&&ir[e]?(""+t).trim():t+"px"}function ts(e,t){e=e.style;for(var n in t)if(t.hasOwnProperty(n)){var r=n.indexOf("--")===0,l=es(n,t[n],r);n==="float"&&(n="cssFloat"),r?e.setProperty(n,l):e[n]=l}}var wp=F({menuitem:!0},{area:!0,base:!0,br:!0,col:!0,embed:!0,hr:!0,img:!0,input:!0,keygen:!0,link:!0,meta:!0,param:!0,source:!0,track:!0,wbr:!0});function Eo(e,t){if(t){if(wp[e]&&(t.children!=null||t.dangerouslySetInnerHTML!=null))throw Error(a(137,e));if(t.dangerouslySetInnerHTML!=null){if(t.children!=null)throw Error(a(60));if(typeof t.dangerouslySetInnerHTML!="object"||!("__html"in t.dangerouslySetInnerHTML))throw Error(a(61))}if(t.style!=null&&typeof t.style!="object")throw Error(a(62))}}function Io(e,t){if(e.indexOf("-")===-1)return typeof t.is=="string";switch(e){case"annotation-xml":case"color-profile":case"font-face":case"font-face-src":case"font-face-uri":case"font-face-format":case"font-face-name":case"missing-glyph":return!1;default:return!0}}var Fo=null;function xo(e){return e=e.target||e.srcElement||window,e.correspondingUseElement&&(e=e.correspondingUseElement),e.nodeType===3?e.parentNode:e}var Mo=null,Pn=null,Rn=null;function ns(e){if(e=Pr(e)){if(typeof Mo!="function")throw Error(a(280));var t=e.stateNode;t&&(t=Si(t),Mo(e.stateNode,e.type,t))}}function rs(e){Pn?Rn?Rn.push(e):Rn=[e]:Pn=e}function is(){if(Pn){var e=Pn,t=Rn;if(Rn=Pn=null,ns(e),t)for(e=0;e<t.length;e++)ns(t[e])}}function os(e,t){return e(t)}function as(){}var No=!1;function ls(e,t,n){if(No)return e(t,n);No=!0;try{return os(e,t,n)}finally{No=!1,(Pn!==null||Rn!==null)&&(as(),is())}}function or(e,t){var n=e.stateNode;if(n===null)return null;var r=Si(n);if(r===null)return null;n=r[t];e:switch(t){case"onClick":case"onClickCapture":case"onDoubleClick":case"onDoubleClickCapture":case"onMouseDown":case"onMouseDownCapture":case"onMouseMove":case"onMouseMoveCapture":case"onMouseUp":case"onMouseUpCapture":case"onMouseEnter":(r=!r.disabled)||(e=e.type,r=!(e==="button"||e==="input"||e==="select"||e==="textarea")),e=!r;break e;default:e=!1}if(e)return null;if(n&&typeof n!="function")throw Error(a(231,t,typeof n));return n}var Ho=!1;if(v)try{var ar={};Object.defineProperty(ar,"passive",{get:function(){Ho=!0}}),window.addEventListener("test",ar,ar),window.removeEventListener("test",ar,ar)}catch{Ho=!1}function vp(e,t,n,r,l,s,u,m,h){var S=Array.prototype.slice.call(arguments,3);try{t.apply(n,S)}catch(D){this.onError(D)}}var lr=!1,Zr=null,Jr=!1,Uo=null,kp={onError:function(e){lr=!0,Zr=e}};function Cp(e,t,n,r,l,s,u,m,h){lr=!1,Zr=null,vp.apply(kp,arguments)}function Dp(e,t,n,r,l,s,u,m,h){if(Cp.apply(this,arguments),lr){if(lr){var S=Zr;lr=!1,Zr=null}else throw Error(a(198));Jr||(Jr=!0,Uo=S)}}function cn(e){var t=e,n=e;if(e.alternate)for(;t.return;)t=t.return;else{e=t;do t=e,(t.flags&4098)!==0&&(n=t.return),e=t.return;while(e)}return t.tag===3?n:null}function ss(e){if(e.tag===13){var t=e.memoizedState;if(t===null&&(e=e.alternate,e!==null&&(t=e.memoizedState)),t!==null)return t.dehydrated}return null}function cs(e){if(cn(e)!==e)throw Error(a(188))}function Tp(e){var t=e.alternate;if(!t){if(t=cn(e),t===null)throw Error(a(188));return t!==e?null:e}for(var n=e,r=t;;){var l=n.return;if(l===null)break;var s=l.alternate;if(s===null){if(r=l.return,r!==null){n=r;continue}break}if(l.child===s.child){for(s=l.child;s;){if(s===n)return cs(l),e;if(s===r)return cs(l),t;s=s.sibling}throw Error(a(188))}if(n.return!==r.return)n=l,r=s;else{for(var u=!1,m=l.child;m;){if(m===n){u=!0,n=l,r=s;break}if(m===r){u=!0,r=l,n=s;break}m=m.sibling}if(!u){for(m=s.child;m;){if(m===n){u=!0,n=s,r=l;break}if(m===r){u=!0,r=s,n=l;break}m=m.sibling}if(!u)throw Error(a(189))}}if(n.alternate!==r)throw Error(a(190))}if(n.tag!==3)throw Error(a(188));return n.stateNode.current===n?e:t}function us(e){return e=Tp(e),e!==null?ds(e):null}function ds(e){if(e.tag===5||e.tag===6)return e;for(e=e.child;e!==null;){var t=ds(e);if(t!==null)return t;e=e.sibling}return null}var ps=i.unstable_scheduleCallback,ms=i.unstable_cancelCallback,Pp=i.unstable_shouldYield,Rp=i.unstable_requestPaint,ge=i.unstable_now,Ap=i.unstable_getCurrentPriorityLevel,Bo=i.unstable_ImmediatePriority,hs=i.unstable_UserBlockingPriority,Xr=i.unstable_NormalPriority,Lp=i.unstable_LowPriority,fs=i.unstable_IdlePriority,ei=null,kt=null;function Ep(e){if(kt&&typeof kt.onCommitFiberRoot=="function")try{kt.onCommitFiberRoot(ei,e,void 0,(e.current.flags&128)===128)}catch{}}var dt=Math.clz32?Math.clz32:xp,Ip=Math.log,Fp=Math.LN2;function xp(e){return e>>>=0,e===0?32:31-(Ip(e)/Fp|0)|0}var ti=64,ni=4194304;function sr(e){switch(e&-e){case 1:return 1;case 2:return 2;case 4:return 4;case 8:return 8;case 16:return 16;case 32:return 32;case 64:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return e&4194240;case 4194304:case 8388608:case 16777216:case 33554432:case 67108864:return e&130023424;case 134217728:return 134217728;case 268435456:return 268435456;case 536870912:return 536870912;case 1073741824:return 1073741824;default:return e}}function ri(e,t){var n=e.pendingLanes;if(n===0)return 0;var r=0,l=e.suspendedLanes,s=e.pingedLanes,u=n&268435455;if(u!==0){var m=u&~l;m!==0?r=sr(m):(s&=u,s!==0&&(r=sr(s)))}else u=n&~l,u!==0?r=sr(u):s!==0&&(r=sr(s));if(r===0)return 0;if(t!==0&&t!==r&&(t&l)===0&&(l=r&-r,s=t&-t,l>=s||l===16&&(s&4194240)!==0))return t;if((r&4)!==0&&(r|=n&16),t=e.entangledLanes,t!==0)for(e=e.entanglements,t&=r;0<t;)n=31-dt(t),l=1<<n,r|=e[n],t&=~l;return r}function Mp(e,t){switch(e){case 1:case 2:case 4:return t+250;case 8:case 16:case 32:case 64:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return t+5e3;case 4194304:case 8388608:case 16777216:case 33554432:case 67108864:return-1;case 134217728:case 268435456:case 536870912:case 1073741824:return-1;default:return-1}}function Np(e,t){for(var n=e.suspendedLanes,r=e.pingedLanes,l=e.expirationTimes,s=e.pendingLanes;0<s;){var u=31-dt(s),m=1<<u,h=l[u];h===-1?((m&n)===0||(m&r)!==0)&&(l[u]=Mp(m,t)):h<=t&&(e.expiredLanes|=m),s&=~m}}function Oo(e){return e=e.pendingLanes&-1073741825,e!==0?e:e&1073741824?1073741824:0}function gs(){var e=ti;return ti<<=1,(ti&4194240)===0&&(ti=64),e}function _o(e){for(var t=[],n=0;31>n;n++)t.push(e);return t}function cr(e,t,n){e.pendingLanes|=t,t!==536870912&&(e.suspendedLanes=0,e.pingedLanes=0),e=e.eventTimes,t=31-dt(t),e[t]=n}function Hp(e,t){var n=e.pendingLanes&~t;e.pendingLanes=t,e.suspendedLanes=0,e.pingedLanes=0,e.expiredLanes&=t,e.mutableReadLanes&=t,e.entangledLanes&=t,t=e.entanglements;var r=e.eventTimes;for(e=e.expirationTimes;0<n;){var l=31-dt(n),s=1<<l;t[l]=0,r[l]=-1,e[l]=-1,n&=~s}}function Wo(e,t){var n=e.entangledLanes|=t;for(e=e.entanglements;n;){var r=31-dt(n),l=1<<r;l&t|e[r]&t&&(e[r]|=t),n&=~l}}var te=0;function bs(e){return e&=-e,1<e?4<e?(e&268435455)!==0?16:536870912:4:1}var ys,jo,Ss,ws,vs,zo=!1,ii=[],Ot=null,_t=null,Wt=null,ur=new Map,dr=new Map,jt=[],Up="mousedown mouseup touchcancel touchend touchstart auxclick dblclick pointercancel pointerdown pointerup dragend dragstart drop compositionend compositionstart keydown keypress keyup input textInput copy cut paste click change contextmenu reset submit".split(" ");function ks(e,t){switch(e){case"focusin":case"focusout":Ot=null;break;case"dragenter":case"dragleave":_t=null;break;case"mouseover":case"mouseout":Wt=null;break;case"pointerover":case"pointerout":ur.delete(t.pointerId);break;case"gotpointercapture":case"lostpointercapture":dr.delete(t.pointerId)}}function pr(e,t,n,r,l,s){return e===null||e.nativeEvent!==s?(e={blockedOn:t,domEventName:n,eventSystemFlags:r,nativeEvent:s,targetContainers:[l]},t!==null&&(t=Pr(t),t!==null&&jo(t)),e):(e.eventSystemFlags|=r,t=e.targetContainers,l!==null&&t.indexOf(l)===-1&&t.push(l),e)}function Bp(e,t,n,r,l){switch(t){case"focusin":return Ot=pr(Ot,e,t,n,r,l),!0;case"dragenter":return _t=pr(_t,e,t,n,r,l),!0;case"mouseover":return Wt=pr(Wt,e,t,n,r,l),!0;case"pointerover":var s=l.pointerId;return ur.set(s,pr(ur.get(s)||null,e,t,n,r,l)),!0;case"gotpointercapture":return s=l.pointerId,dr.set(s,pr(dr.get(s)||null,e,t,n,r,l)),!0}return!1}function Cs(e){var t=un(e.target);if(t!==null){var n=cn(t);if(n!==null){if(t=n.tag,t===13){if(t=ss(n),t!==null){e.blockedOn=t,vs(e.priority,function(){Ss(n)});return}}else if(t===3&&n.stateNode.current.memoizedState.isDehydrated){e.blockedOn=n.tag===3?n.stateNode.containerInfo:null;return}}}e.blockedOn=null}function oi(e){if(e.blockedOn!==null)return!1;for(var t=e.targetContainers;0<t.length;){var n=qo(e.domEventName,e.eventSystemFlags,t[0],e.nativeEvent);if(n===null){n=e.nativeEvent;var r=new n.constructor(n.type,n);Fo=r,n.target.dispatchEvent(r),Fo=null}else return t=Pr(n),t!==null&&jo(t),e.blockedOn=n,!1;t.shift()}return!0}function Ds(e,t,n){oi(e)&&n.delete(t)}function Op(){zo=!1,Ot!==null&&oi(Ot)&&(Ot=null),_t!==null&&oi(_t)&&(_t=null),Wt!==null&&oi(Wt)&&(Wt=null),ur.forEach(Ds),dr.forEach(Ds)}function mr(e,t){e.blockedOn===t&&(e.blockedOn=null,zo||(zo=!0,i.unstable_scheduleCallback(i.unstable_NormalPriority,Op)))}function hr(e){function t(l){return mr(l,e)}if(0<ii.length){mr(ii[0],e);for(var n=1;n<ii.length;n++){var r=ii[n];r.blockedOn===e&&(r.blockedOn=null)}}for(Ot!==null&&mr(Ot,e),_t!==null&&mr(_t,e),Wt!==null&&mr(Wt,e),ur.forEach(t),dr.forEach(t),n=0;n<jt.length;n++)r=jt[n],r.blockedOn===e&&(r.blockedOn=null);for(;0<jt.length&&(n=jt[0],n.blockedOn===null);)Cs(n),n.blockedOn===null&&jt.shift()}var An=Re.ReactCurrentBatchConfig,ai=!0;function _p(e,t,n,r){var l=te,s=An.transition;An.transition=null;try{te=1,Vo(e,t,n,r)}finally{te=l,An.transition=s}}function Wp(e,t,n,r){var l=te,s=An.transition;An.transition=null;try{te=4,Vo(e,t,n,r)}finally{te=l,An.transition=s}}function Vo(e,t,n,r){if(ai){var l=qo(e,t,n,r);if(l===null)sa(e,t,r,li,n),ks(e,r);else if(Bp(l,e,t,n,r))r.stopPropagation();else if(ks(e,r),t&4&&-1<Up.indexOf(e)){for(;l!==null;){var s=Pr(l);if(s!==null&&ys(s),s=qo(e,t,n,r),s===null&&sa(e,t,r,li,n),s===l)break;l=s}l!==null&&r.stopPropagation()}else sa(e,t,r,null,n)}}var li=null;function qo(e,t,n,r){if(li=null,e=xo(r),e=un(e),e!==null)if(t=cn(e),t===null)e=null;else if(n=t.tag,n===13){if(e=ss(t),e!==null)return e;e=null}else if(n===3){if(t.stateNode.current.memoizedState.isDehydrated)return t.tag===3?t.stateNode.containerInfo:null;e=null}else t!==e&&(e=null);return li=e,null}function Ts(e){switch(e){case"cancel":case"click":case"close":case"contextmenu":case"copy":case"cut":case"auxclick":case"dblclick":case"dragend":case"dragstart":case"drop":case"focusin":case"focusout":case"input":case"invalid":case"keydown":case"keypress":case"keyup":case"mousedown":case"mouseup":case"paste":case"pause":case"play":case"pointercancel":case"pointerdown":case"pointerup":case"ratechange":case"reset":case"resize":case"seeked":case"submit":case"touchcancel":case"touchend":case"touchstart":case"volumechange":case"change":case"selectionchange":case"textInput":case"compositionstart":case"compositionend":case"compositionupdate":case"beforeblur":case"afterblur":case"beforeinput":case"blur":case"fullscreenchange":case"focus":case"hashchange":case"popstate":case"select":case"selectstart":return 1;case"drag":case"dragenter":case"dragexit":case"dragleave":case"dragover":case"mousemove":case"mouseout":case"mouseover":case"pointermove":case"pointerout":case"pointerover":case"scroll":case"toggle":case"touchmove":case"wheel":case"mouseenter":case"mouseleave":case"pointerenter":case"pointerleave":return 4;case"message":switch(Ap()){case Bo:return 1;case hs:return 4;case Xr:case Lp:return 16;case fs:return 536870912;default:return 16}default:return 16}}var zt=null,Go=null,si=null;function Ps(){if(si)return si;var e,t=Go,n=t.length,r,l="value"in zt?zt.value:zt.textContent,s=l.length;for(e=0;e<n&&t[e]===l[e];e++);var u=n-e;for(r=1;r<=u&&t[n-r]===l[s-r];r++);return si=l.slice(e,1<r?1-r:void 0)}function ci(e){var t=e.keyCode;return"charCode"in e?(e=e.charCode,e===0&&t===13&&(e=13)):e=t,e===10&&(e=13),32<=e||e===13?e:0}function ui(){return!0}function Rs(){return!1}function Ye(e){function t(n,r,l,s,u){this._reactName=n,this._targetInst=l,this.type=r,this.nativeEvent=s,this.target=u,this.currentTarget=null;for(var m in e)e.hasOwnProperty(m)&&(n=e[m],this[m]=n?n(s):s[m]);return this.isDefaultPrevented=(s.defaultPrevented!=null?s.defaultPrevented:s.returnValue===!1)?ui:Rs,this.isPropagationStopped=Rs,this}return F(t.prototype,{preventDefault:function(){this.defaultPrevented=!0;var n=this.nativeEvent;n&&(n.preventDefault?n.preventDefault():typeof n.returnValue!="unknown"&&(n.returnValue=!1),this.isDefaultPrevented=ui)},stopPropagation:function(){var n=this.nativeEvent;n&&(n.stopPropagation?n.stopPropagation():typeof n.cancelBubble!="unknown"&&(n.cancelBubble=!0),this.isPropagationStopped=ui)},persist:function(){},isPersistent:ui}),t}var Ln={eventPhase:0,bubbles:0,cancelable:0,timeStamp:function(e){return e.timeStamp||Date.now()},defaultPrevented:0,isTrusted:0},Ko=Ye(Ln),fr=F({},Ln,{view:0,detail:0}),jp=Ye(fr),Qo,$o,gr,di=F({},fr,{screenX:0,screenY:0,clientX:0,clientY:0,pageX:0,pageY:0,ctrlKey:0,shiftKey:0,altKey:0,metaKey:0,getModifierState:Zo,button:0,buttons:0,relatedTarget:function(e){return e.relatedTarget===void 0?e.fromElement===e.srcElement?e.toElement:e.fromElement:e.relatedTarget},movementX:function(e){return"movementX"in e?e.movementX:(e!==gr&&(gr&&e.type==="mousemove"?(Qo=e.screenX-gr.screenX,$o=e.screenY-gr.screenY):$o=Qo=0,gr=e),Qo)},movementY:function(e){return"movementY"in e?e.movementY:$o}}),As=Ye(di),zp=F({},di,{dataTransfer:0}),Vp=Ye(zp),qp=F({},fr,{relatedTarget:0}),Yo=Ye(qp),Gp=F({},Ln,{animationName:0,elapsedTime:0,pseudoElement:0}),Kp=Ye(Gp),Qp=F({},Ln,{clipboardData:function(e){return"clipboardData"in e?e.clipboardData:window.clipboardData}}),$p=Ye(Qp),Yp=F({},Ln,{data:0}),Ls=Ye(Yp),Zp={Esc:"Escape",Spacebar:" ",Left:"ArrowLeft",Up:"ArrowUp",Right:"ArrowRight",Down:"ArrowDown",Del:"Delete",Win:"OS",Menu:"ContextMenu",Apps:"ContextMenu",Scroll:"ScrollLock",MozPrintableKey:"Unidentified"},Jp={8:"Backspace",9:"Tab",12:"Clear",13:"Enter",16:"Shift",17:"Control",18:"Alt",19:"Pause",20:"CapsLock",27:"Escape",32:" ",33:"PageUp",34:"PageDown",35:"End",36:"Home",37:"ArrowLeft",38:"ArrowUp",39:"ArrowRight",40:"ArrowDown",45:"Insert",46:"Delete",112:"F1",113:"F2",114:"F3",115:"F4",116:"F5",117:"F6",118:"F7",119:"F8",120:"F9",121:"F10",122:"F11",123:"F12",144:"NumLock",145:"ScrollLock",224:"Meta"},Xp={Alt:"altKey",Control:"ctrlKey",Meta:"metaKey",Shift:"shiftKey"};function em(e){var t=this.nativeEvent;return t.getModifierState?t.getModifierState(e):(e=Xp[e])?!!t[e]:!1}function Zo(){return em}var tm=F({},fr,{key:function(e){if(e.key){var t=Zp[e.key]||e.key;if(t!=="Unidentified")return t}return e.type==="keypress"?(e=ci(e),e===13?"Enter":String.fromCharCode(e)):e.type==="keydown"||e.type==="keyup"?Jp[e.keyCode]||"Unidentified":""},code:0,location:0,ctrlKey:0,shiftKey:0,altKey:0,metaKey:0,repeat:0,locale:0,getModifierState:Zo,charCode:function(e){return e.type==="keypress"?ci(e):0},keyCode:function(e){return e.type==="keydown"||e.type==="keyup"?e.keyCode:0},which:function(e){return e.type==="keypress"?ci(e):e.type==="keydown"||e.type==="keyup"?e.keyCode:0}}),nm=Ye(tm),rm=F({},di,{pointerId:0,width:0,height:0,pressure:0,tangentialPressure:0,tiltX:0,tiltY:0,twist:0,pointerType:0,isPrimary:0}),Es=Ye(rm),im=F({},fr,{touches:0,targetTouches:0,changedTouches:0,altKey:0,metaKey:0,ctrlKey:0,shiftKey:0,getModifierState:Zo}),om=Ye(im),am=F({},Ln,{propertyName:0,elapsedTime:0,pseudoElement:0}),lm=Ye(am),sm=F({},di,{deltaX:function(e){return"deltaX"in e?e.deltaX:"wheelDeltaX"in e?-e.wheelDeltaX:0},deltaY:function(e){return"deltaY"in e?e.deltaY:"wheelDeltaY"in e?-e.wheelDeltaY:"wheelDelta"in e?-e.wheelDelta:0},deltaZ:0,deltaMode:0}),cm=Ye(sm),um=[9,13,27,32],Jo=v&&"CompositionEvent"in window,br=null;v&&"documentMode"in document&&(br=document.documentMode);var dm=v&&"TextEvent"in window&&!br,Is=v&&(!Jo||br&&8<br&&11>=br),Fs=" ",xs=!1;function Ms(e,t){switch(e){case"keyup":return um.indexOf(t.keyCode)!==-1;case"keydown":return t.keyCode!==229;case"keypress":case"mousedown":case"focusout":return!0;default:return!1}}function Ns(e){return e=e.detail,typeof e=="object"&&"data"in e?e.data:null}var En=!1;function pm(e,t){switch(e){case"compositionend":return Ns(t);case"keypress":return t.which!==32?null:(xs=!0,Fs);case"textInput":return e=t.data,e===Fs&&xs?null:e;default:return null}}function mm(e,t){if(En)return e==="compositionend"||!Jo&&Ms(e,t)?(e=Ps(),si=Go=zt=null,En=!1,e):null;switch(e){case"paste":return null;case"keypress":if(!(t.ctrlKey||t.altKey||t.metaKey)||t.ctrlKey&&t.altKey){if(t.char&&1<t.char.length)return t.char;if(t.which)return String.fromCharCode(t.which)}return null;case"compositionend":return Is&&t.locale!=="ko"?null:t.data;default:return null}}var hm={color:!0,date:!0,datetime:!0,"datetime-local":!0,email:!0,month:!0,number:!0,password:!0,range:!0,search:!0,tel:!0,text:!0,time:!0,url:!0,week:!0};function Hs(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return t==="input"?!!hm[e.type]:t==="textarea"}function Us(e,t,n,r){rs(r),t=gi(t,"onChange"),0<t.length&&(n=new Ko("onChange","change",null,n,r),e.push({event:n,listeners:t}))}var yr=null,Sr=null;function fm(e){tc(e,0)}function pi(e){var t=Nn(e);if(ql(t))return e}function gm(e,t){if(e==="change")return t}var Bs=!1;if(v){var Xo;if(v){var ea="oninput"in document;if(!ea){var Os=document.createElement("div");Os.setAttribute("oninput","return;"),ea=typeof Os.oninput=="function"}Xo=ea}else Xo=!1;Bs=Xo&&(!document.documentMode||9<document.documentMode)}function _s(){yr&&(yr.detachEvent("onpropertychange",Ws),Sr=yr=null)}function Ws(e){if(e.propertyName==="value"&&pi(Sr)){var t=[];Us(t,Sr,e,xo(e)),ls(fm,t)}}function bm(e,t,n){e==="focusin"?(_s(),yr=t,Sr=n,yr.attachEvent("onpropertychange",Ws)):e==="focusout"&&_s()}function ym(e){if(e==="selectionchange"||e==="keyup"||e==="keydown")return pi(Sr)}function Sm(e,t){if(e==="click")return pi(t)}function wm(e,t){if(e==="input"||e==="change")return pi(t)}function vm(e,t){return e===t&&(e!==0||1/e===1/t)||e!==e&&t!==t}var pt=typeof Object.is=="function"?Object.is:vm;function wr(e,t){if(pt(e,t))return!0;if(typeof e!="object"||e===null||typeof t!="object"||t===null)return!1;var n=Object.keys(e),r=Object.keys(t);if(n.length!==r.length)return!1;for(r=0;r<n.length;r++){var l=n[r];if(!R.call(t,l)||!pt(e[l],t[l]))return!1}return!0}function js(e){for(;e&&e.firstChild;)e=e.firstChild;return e}function zs(e,t){var n=js(e);e=0;for(var r;n;){if(n.nodeType===3){if(r=e+n.textContent.length,e<=t&&r>=t)return{node:n,offset:t-e};e=r}e:{for(;n;){if(n.nextSibling){n=n.nextSibling;break e}n=n.parentNode}n=void 0}n=js(n)}}function Vs(e,t){return e&&t?e===t?!0:e&&e.nodeType===3?!1:t&&t.nodeType===3?Vs(e,t.parentNode):"contains"in e?e.contains(t):e.compareDocumentPosition?!!(e.compareDocumentPosition(t)&16):!1:!1}function qs(){for(var e=window,t=$r();t instanceof e.HTMLIFrameElement;){try{var n=typeof t.contentWindow.location.href=="string"}catch{n=!1}if(n)e=t.contentWindow;else break;t=$r(e.document)}return t}function ta(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return t&&(t==="input"&&(e.type==="text"||e.type==="search"||e.type==="tel"||e.type==="url"||e.type==="password")||t==="textarea"||e.contentEditable==="true")}function km(e){var t=qs(),n=e.focusedElem,r=e.selectionRange;if(t!==n&&n&&n.ownerDocument&&Vs(n.ownerDocument.documentElement,n)){if(r!==null&&ta(n)){if(t=r.start,e=r.end,e===void 0&&(e=t),"selectionStart"in n)n.selectionStart=t,n.selectionEnd=Math.min(e,n.value.length);else if(e=(t=n.ownerDocument||document)&&t.defaultView||window,e.getSelection){e=e.getSelection();var l=n.textContent.length,s=Math.min(r.start,l);r=r.end===void 0?s:Math.min(r.end,l),!e.extend&&s>r&&(l=r,r=s,s=l),l=zs(n,s);var u=zs(n,r);l&&u&&(e.rangeCount!==1||e.anchorNode!==l.node||e.anchorOffset!==l.offset||e.focusNode!==u.node||e.focusOffset!==u.offset)&&(t=t.createRange(),t.setStart(l.node,l.offset),e.removeAllRanges(),s>r?(e.addRange(t),e.extend(u.node,u.offset)):(t.setEnd(u.node,u.offset),e.addRange(t)))}}for(t=[],e=n;e=e.parentNode;)e.nodeType===1&&t.push({element:e,left:e.scrollLeft,top:e.scrollTop});for(typeof n.focus=="function"&&n.focus(),n=0;n<t.length;n++)e=t[n],e.element.scrollLeft=e.left,e.element.scrollTop=e.top}}var Cm=v&&"documentMode"in document&&11>=document.documentMode,In=null,na=null,vr=null,ra=!1;function Gs(e,t,n){var r=n.window===n?n.document:n.nodeType===9?n:n.ownerDocument;ra||In==null||In!==$r(r)||(r=In,"selectionStart"in r&&ta(r)?r={start:r.selectionStart,end:r.selectionEnd}:(r=(r.ownerDocument&&r.ownerDocument.defaultView||window).getSelection(),r={anchorNode:r.anchorNode,anchorOffset:r.anchorOffset,focusNode:r.focusNode,focusOffset:r.focusOffset}),vr&&wr(vr,r)||(vr=r,r=gi(na,"onSelect"),0<r.length&&(t=new Ko("onSelect","select",null,t,n),e.push({event:t,listeners:r}),t.target=In)))}function mi(e,t){var n={};return n[e.toLowerCase()]=t.toLowerCase(),n["Webkit"+e]="webkit"+t,n["Moz"+e]="moz"+t,n}var Fn={animationend:mi("Animation","AnimationEnd"),animationiteration:mi("Animation","AnimationIteration"),animationstart:mi("Animation","AnimationStart"),transitionend:mi("Transition","TransitionEnd")},ia={},Ks={};v&&(Ks=document.createElement("div").style,"AnimationEvent"in window||(delete Fn.animationend.animation,delete Fn.animationiteration.animation,delete Fn.animationstart.animation),"TransitionEvent"in window||delete Fn.transitionend.transition);function hi(e){if(ia[e])return ia[e];if(!Fn[e])return e;var t=Fn[e],n;for(n in t)if(t.hasOwnProperty(n)&&n in Ks)return ia[e]=t[n];return e}var Qs=hi("animationend"),$s=hi("animationiteration"),Ys=hi("animationstart"),Zs=hi("transitionend"),Js=new Map,Xs="abort auxClick cancel canPlay canPlayThrough click close contextMenu copy cut drag dragEnd dragEnter dragExit dragLeave dragOver dragStart drop durationChange emptied encrypted ended error gotPointerCapture input invalid keyDown keyPress keyUp load loadedData loadedMetadata loadStart lostPointerCapture mouseDown mouseMove mouseOut mouseOver mouseUp paste pause play playing pointerCancel pointerDown pointerMove pointerOut pointerOver pointerUp progress rateChange reset resize seeked seeking stalled submit suspend timeUpdate touchCancel touchEnd touchStart volumeChange scroll toggle touchMove waiting wheel".split(" ");function Vt(e,t){Js.set(e,t),p(t,[e])}for(var oa=0;oa<Xs.length;oa++){var aa=Xs[oa],Dm=aa.toLowerCase(),Tm=aa[0].toUpperCase()+aa.slice(1);Vt(Dm,"on"+Tm)}Vt(Qs,"onAnimationEnd"),Vt($s,"onAnimationIteration"),Vt(Ys,"onAnimationStart"),Vt("dblclick","onDoubleClick"),Vt("focusin","onFocus"),Vt("focusout","onBlur"),Vt(Zs,"onTransitionEnd"),w("onMouseEnter",["mouseout","mouseover"]),w("onMouseLeave",["mouseout","mouseover"]),w("onPointerEnter",["pointerout","pointerover"]),w("onPointerLeave",["pointerout","pointerover"]),p("onChange","change click focusin focusout input keydown keyup selectionchange".split(" ")),p("onSelect","focusout contextmenu dragend focusin keydown keyup mousedown mouseup selectionchange".split(" ")),p("onBeforeInput",["compositionend","keypress","textInput","paste"]),p("onCompositionEnd","compositionend focusout keydown keypress keyup mousedown".split(" ")),p("onCompositionStart","compositionstart focusout keydown keypress keyup mousedown".split(" ")),p("onCompositionUpdate","compositionupdate focusout keydown keypress keyup mousedown".split(" "));var kr="abort canplay canplaythrough durationchange emptied encrypted ended error loadeddata loadedmetadata loadstart pause play playing progress ratechange resize seeked seeking stalled suspend timeupdate volumechange waiting".split(" "),Pm=new Set("cancel close invalid load scroll toggle".split(" ").concat(kr));function ec(e,t,n){var r=e.type||"unknown-event";e.currentTarget=n,Dp(r,t,void 0,e),e.currentTarget=null}function tc(e,t){t=(t&4)!==0;for(var n=0;n<e.length;n++){var r=e[n],l=r.event;r=r.listeners;e:{var s=void 0;if(t)for(var u=r.length-1;0<=u;u--){var m=r[u],h=m.instance,S=m.currentTarget;if(m=m.listener,h!==s&&l.isPropagationStopped())break e;ec(l,m,S),s=h}else for(u=0;u<r.length;u++){if(m=r[u],h=m.instance,S=m.currentTarget,m=m.listener,h!==s&&l.isPropagationStopped())break e;ec(l,m,S),s=h}}}if(Jr)throw e=Uo,Jr=!1,Uo=null,e}function ae(e,t){var n=t[ha];n===void 0&&(n=t[ha]=new Set);var r=e+"__bubble";n.has(r)||(nc(t,e,2,!1),n.add(r))}function la(e,t,n){var r=0;t&&(r|=4),nc(n,e,r,t)}var fi="_reactListening"+Math.random().toString(36).slice(2);function Cr(e){if(!e[fi]){e[fi]=!0,c.forEach(function(n){n!=="selectionchange"&&(Pm.has(n)||la(n,!1,e),la(n,!0,e))});var t=e.nodeType===9?e:e.ownerDocument;t===null||t[fi]||(t[fi]=!0,la("selectionchange",!1,t))}}function nc(e,t,n,r){switch(Ts(t)){case 1:var l=_p;break;case 4:l=Wp;break;default:l=Vo}n=l.bind(null,t,n,e),l=void 0,!Ho||t!=="touchstart"&&t!=="touchmove"&&t!=="wheel"||(l=!0),r?l!==void 0?e.addEventListener(t,n,{capture:!0,passive:l}):e.addEventListener(t,n,!0):l!==void 0?e.addEventListener(t,n,{passive:l}):e.addEventListener(t,n,!1)}function sa(e,t,n,r,l){var s=r;if((t&1)===0&&(t&2)===0&&r!==null)e:for(;;){if(r===null)return;var u=r.tag;if(u===3||u===4){var m=r.stateNode.containerInfo;if(m===l||m.nodeType===8&&m.parentNode===l)break;if(u===4)for(u=r.return;u!==null;){var h=u.tag;if((h===3||h===4)&&(h=u.stateNode.containerInfo,h===l||h.nodeType===8&&h.parentNode===l))return;u=u.return}for(;m!==null;){if(u=un(m),u===null)return;if(h=u.tag,h===5||h===6){r=s=u;continue e}m=m.parentNode}}r=r.return}ls(function(){var S=s,D=xo(n),T=[];e:{var k=Js.get(e);if(k!==void 0){var E=Ko,x=e;switch(e){case"keypress":if(ci(n)===0)break e;case"keydown":case"keyup":E=nm;break;case"focusin":x="focus",E=Yo;break;case"focusout":x="blur",E=Yo;break;case"beforeblur":case"afterblur":E=Yo;break;case"click":if(n.button===2)break e;case"auxclick":case"dblclick":case"mousedown":case"mousemove":case"mouseup":case"mouseout":case"mouseover":case"contextmenu":E=As;break;case"drag":case"dragend":case"dragenter":case"dragexit":case"dragleave":case"dragover":case"dragstart":case"drop":E=Vp;break;case"touchcancel":case"touchend":case"touchmove":case"touchstart":E=om;break;case Qs:case $s:case Ys:E=Kp;break;case Zs:E=lm;break;case"scroll":E=jp;break;case"wheel":E=cm;break;case"copy":case"cut":case"paste":E=$p;break;case"gotpointercapture":case"lostpointercapture":case"pointercancel":case"pointerdown":case"pointermove":case"pointerout":case"pointerover":case"pointerup":E=Es}var N=(t&4)!==0,be=!N&&e==="scroll",b=N?k!==null?k+"Capture":null:k;N=[];for(var f=S,y;f!==null;){y=f;var P=y.stateNode;if(y.tag===5&&P!==null&&(y=P,b!==null&&(P=or(f,b),P!=null&&N.push(Dr(f,P,y)))),be)break;f=f.return}0<N.length&&(k=new E(k,x,null,n,D),T.push({event:k,listeners:N}))}}if((t&7)===0){e:{if(k=e==="mouseover"||e==="pointerover",E=e==="mouseout"||e==="pointerout",k&&n!==Fo&&(x=n.relatedTarget||n.fromElement)&&(un(x)||x[Lt]))break e;if((E||k)&&(k=D.window===D?D:(k=D.ownerDocument)?k.defaultView||k.parentWindow:window,E?(x=n.relatedTarget||n.toElement,E=S,x=x?un(x):null,x!==null&&(be=cn(x),x!==be||x.tag!==5&&x.tag!==6)&&(x=null)):(E=null,x=S),E!==x)){if(N=As,P="onMouseLeave",b="onMouseEnter",f="mouse",(e==="pointerout"||e==="pointerover")&&(N=Es,P="onPointerLeave",b="onPointerEnter",f="pointer"),be=E==null?k:Nn(E),y=x==null?k:Nn(x),k=new N(P,f+"leave",E,n,D),k.target=be,k.relatedTarget=y,P=null,un(D)===S&&(N=new N(b,f+"enter",x,n,D),N.target=y,N.relatedTarget=be,P=N),be=P,E&&x)t:{for(N=E,b=x,f=0,y=N;y;y=xn(y))f++;for(y=0,P=b;P;P=xn(P))y++;for(;0<f-y;)N=xn(N),f--;for(;0<y-f;)b=xn(b),y--;for(;f--;){if(N===b||b!==null&&N===b.alternate)break t;N=xn(N),b=xn(b)}N=null}else N=null;E!==null&&rc(T,k,E,N,!1),x!==null&&be!==null&&rc(T,be,x,N,!0)}}e:{if(k=S?Nn(S):window,E=k.nodeName&&k.nodeName.toLowerCase(),E==="select"||E==="input"&&k.type==="file")var H=gm;else if(Hs(k))if(Bs)H=wm;else{H=ym;var O=bm}else(E=k.nodeName)&&E.toLowerCase()==="input"&&(k.type==="checkbox"||k.type==="radio")&&(H=Sm);if(H&&(H=H(e,S))){Us(T,H,n,D);break e}O&&O(e,k,S),e==="focusout"&&(O=k._wrapperState)&&O.controlled&&k.type==="number"&&Ro(k,"number",k.value)}switch(O=S?Nn(S):window,e){case"focusin":(Hs(O)||O.contentEditable==="true")&&(In=O,na=S,vr=null);break;case"focusout":vr=na=In=null;break;case"mousedown":ra=!0;break;case"contextmenu":case"mouseup":case"dragend":ra=!1,Gs(T,n,D);break;case"selectionchange":if(Cm)break;case"keydown":case"keyup":Gs(T,n,D)}var _;if(Jo)e:{switch(e){case"compositionstart":var j="onCompositionStart";break e;case"compositionend":j="onCompositionEnd";break e;case"compositionupdate":j="onCompositionUpdate";break e}j=void 0}else En?Ms(e,n)&&(j="onCompositionEnd"):e==="keydown"&&n.keyCode===229&&(j="onCompositionStart");j&&(Is&&n.locale!=="ko"&&(En||j!=="onCompositionStart"?j==="onCompositionEnd"&&En&&(_=Ps()):(zt=D,Go="value"in zt?zt.value:zt.textContent,En=!0)),O=gi(S,j),0<O.length&&(j=new Ls(j,e,null,n,D),T.push({event:j,listeners:O}),_?j.data=_:(_=Ns(n),_!==null&&(j.data=_)))),(_=dm?pm(e,n):mm(e,n))&&(S=gi(S,"onBeforeInput"),0<S.length&&(D=new Ls("onBeforeInput","beforeinput",null,n,D),T.push({event:D,listeners:S}),D.data=_))}tc(T,t)})}function Dr(e,t,n){return{instance:e,listener:t,currentTarget:n}}function gi(e,t){for(var n=t+"Capture",r=[];e!==null;){var l=e,s=l.stateNode;l.tag===5&&s!==null&&(l=s,s=or(e,n),s!=null&&r.unshift(Dr(e,s,l)),s=or(e,t),s!=null&&r.push(Dr(e,s,l))),e=e.return}return r}function xn(e){if(e===null)return null;do e=e.return;while(e&&e.tag!==5);return e||null}function rc(e,t,n,r,l){for(var s=t._reactName,u=[];n!==null&&n!==r;){var m=n,h=m.alternate,S=m.stateNode;if(h!==null&&h===r)break;m.tag===5&&S!==null&&(m=S,l?(h=or(n,s),h!=null&&u.unshift(Dr(n,h,m))):l||(h=or(n,s),h!=null&&u.push(Dr(n,h,m)))),n=n.return}u.length!==0&&e.push({event:t,listeners:u})}var Rm=/\r\n?/g,Am=/\u0000|\uFFFD/g;function ic(e){return(typeof e=="string"?e:""+e).replace(Rm,`
39
+ `).replace(Am,"")}function bi(e,t,n){if(t=ic(t),ic(e)!==t&&n)throw Error(a(425))}function yi(){}var ca=null,ua=null;function da(e,t){return e==="textarea"||e==="noscript"||typeof t.children=="string"||typeof t.children=="number"||typeof t.dangerouslySetInnerHTML=="object"&&t.dangerouslySetInnerHTML!==null&&t.dangerouslySetInnerHTML.__html!=null}var pa=typeof setTimeout=="function"?setTimeout:void 0,Lm=typeof clearTimeout=="function"?clearTimeout:void 0,oc=typeof Promise=="function"?Promise:void 0,Em=typeof queueMicrotask=="function"?queueMicrotask:typeof oc<"u"?function(e){return oc.resolve(null).then(e).catch(Im)}:pa;function Im(e){setTimeout(function(){throw e})}function ma(e,t){var n=t,r=0;do{var l=n.nextSibling;if(e.removeChild(n),l&&l.nodeType===8)if(n=l.data,n==="/$"){if(r===0){e.removeChild(l),hr(t);return}r--}else n!=="$"&&n!=="$?"&&n!=="$!"||r++;n=l}while(n);hr(t)}function qt(e){for(;e!=null;e=e.nextSibling){var t=e.nodeType;if(t===1||t===3)break;if(t===8){if(t=e.data,t==="$"||t==="$!"||t==="$?")break;if(t==="/$")return null}}return e}function ac(e){e=e.previousSibling;for(var t=0;e;){if(e.nodeType===8){var n=e.data;if(n==="$"||n==="$!"||n==="$?"){if(t===0)return e;t--}else n==="/$"&&t++}e=e.previousSibling}return null}var Mn=Math.random().toString(36).slice(2),Ct="__reactFiber$"+Mn,Tr="__reactProps$"+Mn,Lt="__reactContainer$"+Mn,ha="__reactEvents$"+Mn,Fm="__reactListeners$"+Mn,xm="__reactHandles$"+Mn;function un(e){var t=e[Ct];if(t)return t;for(var n=e.parentNode;n;){if(t=n[Lt]||n[Ct]){if(n=t.alternate,t.child!==null||n!==null&&n.child!==null)for(e=ac(e);e!==null;){if(n=e[Ct])return n;e=ac(e)}return t}e=n,n=e.parentNode}return null}function Pr(e){return e=e[Ct]||e[Lt],!e||e.tag!==5&&e.tag!==6&&e.tag!==13&&e.tag!==3?null:e}function Nn(e){if(e.tag===5||e.tag===6)return e.stateNode;throw Error(a(33))}function Si(e){return e[Tr]||null}var fa=[],Hn=-1;function Gt(e){return{current:e}}function le(e){0>Hn||(e.current=fa[Hn],fa[Hn]=null,Hn--)}function oe(e,t){Hn++,fa[Hn]=e.current,e.current=t}var Kt={},Ae=Gt(Kt),We=Gt(!1),dn=Kt;function Un(e,t){var n=e.type.contextTypes;if(!n)return Kt;var r=e.stateNode;if(r&&r.__reactInternalMemoizedUnmaskedChildContext===t)return r.__reactInternalMemoizedMaskedChildContext;var l={},s;for(s in n)l[s]=t[s];return r&&(e=e.stateNode,e.__reactInternalMemoizedUnmaskedChildContext=t,e.__reactInternalMemoizedMaskedChildContext=l),l}function je(e){return e=e.childContextTypes,e!=null}function wi(){le(We),le(Ae)}function lc(e,t,n){if(Ae.current!==Kt)throw Error(a(168));oe(Ae,t),oe(We,n)}function sc(e,t,n){var r=e.stateNode;if(t=t.childContextTypes,typeof r.getChildContext!="function")return n;r=r.getChildContext();for(var l in r)if(!(l in t))throw Error(a(108,ie(e)||"Unknown",l));return F({},n,r)}function vi(e){return e=(e=e.stateNode)&&e.__reactInternalMemoizedMergedChildContext||Kt,dn=Ae.current,oe(Ae,e),oe(We,We.current),!0}function cc(e,t,n){var r=e.stateNode;if(!r)throw Error(a(169));n?(e=sc(e,t,dn),r.__reactInternalMemoizedMergedChildContext=e,le(We),le(Ae),oe(Ae,e)):le(We),oe(We,n)}var Et=null,ki=!1,ga=!1;function uc(e){Et===null?Et=[e]:Et.push(e)}function Mm(e){ki=!0,uc(e)}function Qt(){if(!ga&&Et!==null){ga=!0;var e=0,t=te;try{var n=Et;for(te=1;e<n.length;e++){var r=n[e];do r=r(!0);while(r!==null)}Et=null,ki=!1}catch(l){throw Et!==null&&(Et=Et.slice(e+1)),ps(Bo,Qt),l}finally{te=t,ga=!1}}return null}var Bn=[],On=0,Ci=null,Di=0,tt=[],nt=0,pn=null,It=1,Ft="";function mn(e,t){Bn[On++]=Di,Bn[On++]=Ci,Ci=e,Di=t}function dc(e,t,n){tt[nt++]=It,tt[nt++]=Ft,tt[nt++]=pn,pn=e;var r=It;e=Ft;var l=32-dt(r)-1;r&=~(1<<l),n+=1;var s=32-dt(t)+l;if(30<s){var u=l-l%5;s=(r&(1<<u)-1).toString(32),r>>=u,l-=u,It=1<<32-dt(t)+l|n<<l|r,Ft=s+e}else It=1<<s|n<<l|r,Ft=e}function ba(e){e.return!==null&&(mn(e,1),dc(e,1,0))}function ya(e){for(;e===Ci;)Ci=Bn[--On],Bn[On]=null,Di=Bn[--On],Bn[On]=null;for(;e===pn;)pn=tt[--nt],tt[nt]=null,Ft=tt[--nt],tt[nt]=null,It=tt[--nt],tt[nt]=null}var Ze=null,Je=null,ce=!1,mt=null;function pc(e,t){var n=at(5,null,null,0);n.elementType="DELETED",n.stateNode=t,n.return=e,t=e.deletions,t===null?(e.deletions=[n],e.flags|=16):t.push(n)}function mc(e,t){switch(e.tag){case 5:var n=e.type;return t=t.nodeType!==1||n.toLowerCase()!==t.nodeName.toLowerCase()?null:t,t!==null?(e.stateNode=t,Ze=e,Je=qt(t.firstChild),!0):!1;case 6:return t=e.pendingProps===""||t.nodeType!==3?null:t,t!==null?(e.stateNode=t,Ze=e,Je=null,!0):!1;case 13:return t=t.nodeType!==8?null:t,t!==null?(n=pn!==null?{id:It,overflow:Ft}:null,e.memoizedState={dehydrated:t,treeContext:n,retryLane:1073741824},n=at(18,null,null,0),n.stateNode=t,n.return=e,e.child=n,Ze=e,Je=null,!0):!1;default:return!1}}function Sa(e){return(e.mode&1)!==0&&(e.flags&128)===0}function wa(e){if(ce){var t=Je;if(t){var n=t;if(!mc(e,t)){if(Sa(e))throw Error(a(418));t=qt(n.nextSibling);var r=Ze;t&&mc(e,t)?pc(r,n):(e.flags=e.flags&-4097|2,ce=!1,Ze=e)}}else{if(Sa(e))throw Error(a(418));e.flags=e.flags&-4097|2,ce=!1,Ze=e}}}function hc(e){for(e=e.return;e!==null&&e.tag!==5&&e.tag!==3&&e.tag!==13;)e=e.return;Ze=e}function Ti(e){if(e!==Ze)return!1;if(!ce)return hc(e),ce=!0,!1;var t;if((t=e.tag!==3)&&!(t=e.tag!==5)&&(t=e.type,t=t!=="head"&&t!=="body"&&!da(e.type,e.memoizedProps)),t&&(t=Je)){if(Sa(e))throw fc(),Error(a(418));for(;t;)pc(e,t),t=qt(t.nextSibling)}if(hc(e),e.tag===13){if(e=e.memoizedState,e=e!==null?e.dehydrated:null,!e)throw Error(a(317));e:{for(e=e.nextSibling,t=0;e;){if(e.nodeType===8){var n=e.data;if(n==="/$"){if(t===0){Je=qt(e.nextSibling);break e}t--}else n!=="$"&&n!=="$!"&&n!=="$?"||t++}e=e.nextSibling}Je=null}}else Je=Ze?qt(e.stateNode.nextSibling):null;return!0}function fc(){for(var e=Je;e;)e=qt(e.nextSibling)}function _n(){Je=Ze=null,ce=!1}function va(e){mt===null?mt=[e]:mt.push(e)}var Nm=Re.ReactCurrentBatchConfig;function Rr(e,t,n){if(e=n.ref,e!==null&&typeof e!="function"&&typeof e!="object"){if(n._owner){if(n=n._owner,n){if(n.tag!==1)throw Error(a(309));var r=n.stateNode}if(!r)throw Error(a(147,e));var l=r,s=""+e;return t!==null&&t.ref!==null&&typeof t.ref=="function"&&t.ref._stringRef===s?t.ref:(t=function(u){var m=l.refs;u===null?delete m[s]:m[s]=u},t._stringRef=s,t)}if(typeof e!="string")throw Error(a(284));if(!n._owner)throw Error(a(290,e))}return e}function Pi(e,t){throw e=Object.prototype.toString.call(t),Error(a(31,e==="[object Object]"?"object with keys {"+Object.keys(t).join(", ")+"}":e))}function gc(e){var t=e._init;return t(e._payload)}function bc(e){function t(b,f){if(e){var y=b.deletions;y===null?(b.deletions=[f],b.flags|=16):y.push(f)}}function n(b,f){if(!e)return null;for(;f!==null;)t(b,f),f=f.sibling;return null}function r(b,f){for(b=new Map;f!==null;)f.key!==null?b.set(f.key,f):b.set(f.index,f),f=f.sibling;return b}function l(b,f){return b=nn(b,f),b.index=0,b.sibling=null,b}function s(b,f,y){return b.index=y,e?(y=b.alternate,y!==null?(y=y.index,y<f?(b.flags|=2,f):y):(b.flags|=2,f)):(b.flags|=1048576,f)}function u(b){return e&&b.alternate===null&&(b.flags|=2),b}function m(b,f,y,P){return f===null||f.tag!==6?(f=pl(y,b.mode,P),f.return=b,f):(f=l(f,y),f.return=b,f)}function h(b,f,y,P){var H=y.type;return H===Oe?D(b,f,y.props.children,P,y.key):f!==null&&(f.elementType===H||typeof H=="object"&&H!==null&&H.$$typeof===_e&&gc(H)===f.type)?(P=l(f,y.props),P.ref=Rr(b,f,y),P.return=b,P):(P=Yi(y.type,y.key,y.props,null,b.mode,P),P.ref=Rr(b,f,y),P.return=b,P)}function S(b,f,y,P){return f===null||f.tag!==4||f.stateNode.containerInfo!==y.containerInfo||f.stateNode.implementation!==y.implementation?(f=ml(y,b.mode,P),f.return=b,f):(f=l(f,y.children||[]),f.return=b,f)}function D(b,f,y,P,H){return f===null||f.tag!==7?(f=vn(y,b.mode,P,H),f.return=b,f):(f=l(f,y),f.return=b,f)}function T(b,f,y){if(typeof f=="string"&&f!==""||typeof f=="number")return f=pl(""+f,b.mode,y),f.return=b,f;if(typeof f=="object"&&f!==null){switch(f.$$typeof){case ct:return y=Yi(f.type,f.key,f.props,null,b.mode,y),y.ref=Rr(b,null,f),y.return=b,y;case Fe:return f=ml(f,b.mode,y),f.return=b,f;case _e:var P=f._init;return T(b,P(f._payload),y)}if(nr(f)||W(f))return f=vn(f,b.mode,y,null),f.return=b,f;Pi(b,f)}return null}function k(b,f,y,P){var H=f!==null?f.key:null;if(typeof y=="string"&&y!==""||typeof y=="number")return H!==null?null:m(b,f,""+y,P);if(typeof y=="object"&&y!==null){switch(y.$$typeof){case ct:return y.key===H?h(b,f,y,P):null;case Fe:return y.key===H?S(b,f,y,P):null;case _e:return H=y._init,k(b,f,H(y._payload),P)}if(nr(y)||W(y))return H!==null?null:D(b,f,y,P,null);Pi(b,y)}return null}function E(b,f,y,P,H){if(typeof P=="string"&&P!==""||typeof P=="number")return b=b.get(y)||null,m(f,b,""+P,H);if(typeof P=="object"&&P!==null){switch(P.$$typeof){case ct:return b=b.get(P.key===null?y:P.key)||null,h(f,b,P,H);case Fe:return b=b.get(P.key===null?y:P.key)||null,S(f,b,P,H);case _e:var O=P._init;return E(b,f,y,O(P._payload),H)}if(nr(P)||W(P))return b=b.get(y)||null,D(f,b,P,H,null);Pi(f,P)}return null}function x(b,f,y,P){for(var H=null,O=null,_=f,j=f=0,Ce=null;_!==null&&j<y.length;j++){_.index>j?(Ce=_,_=null):Ce=_.sibling;var Z=k(b,_,y[j],P);if(Z===null){_===null&&(_=Ce);break}e&&_&&Z.alternate===null&&t(b,_),f=s(Z,f,j),O===null?H=Z:O.sibling=Z,O=Z,_=Ce}if(j===y.length)return n(b,_),ce&&mn(b,j),H;if(_===null){for(;j<y.length;j++)_=T(b,y[j],P),_!==null&&(f=s(_,f,j),O===null?H=_:O.sibling=_,O=_);return ce&&mn(b,j),H}for(_=r(b,_);j<y.length;j++)Ce=E(_,b,j,y[j],P),Ce!==null&&(e&&Ce.alternate!==null&&_.delete(Ce.key===null?j:Ce.key),f=s(Ce,f,j),O===null?H=Ce:O.sibling=Ce,O=Ce);return e&&_.forEach(function(rn){return t(b,rn)}),ce&&mn(b,j),H}function N(b,f,y,P){var H=W(y);if(typeof H!="function")throw Error(a(150));if(y=H.call(y),y==null)throw Error(a(151));for(var O=H=null,_=f,j=f=0,Ce=null,Z=y.next();_!==null&&!Z.done;j++,Z=y.next()){_.index>j?(Ce=_,_=null):Ce=_.sibling;var rn=k(b,_,Z.value,P);if(rn===null){_===null&&(_=Ce);break}e&&_&&rn.alternate===null&&t(b,_),f=s(rn,f,j),O===null?H=rn:O.sibling=rn,O=rn,_=Ce}if(Z.done)return n(b,_),ce&&mn(b,j),H;if(_===null){for(;!Z.done;j++,Z=y.next())Z=T(b,Z.value,P),Z!==null&&(f=s(Z,f,j),O===null?H=Z:O.sibling=Z,O=Z);return ce&&mn(b,j),H}for(_=r(b,_);!Z.done;j++,Z=y.next())Z=E(_,b,j,Z.value,P),Z!==null&&(e&&Z.alternate!==null&&_.delete(Z.key===null?j:Z.key),f=s(Z,f,j),O===null?H=Z:O.sibling=Z,O=Z);return e&&_.forEach(function(hh){return t(b,hh)}),ce&&mn(b,j),H}function be(b,f,y,P){if(typeof y=="object"&&y!==null&&y.type===Oe&&y.key===null&&(y=y.props.children),typeof y=="object"&&y!==null){switch(y.$$typeof){case ct:e:{for(var H=y.key,O=f;O!==null;){if(O.key===H){if(H=y.type,H===Oe){if(O.tag===7){n(b,O.sibling),f=l(O,y.props.children),f.return=b,b=f;break e}}else if(O.elementType===H||typeof H=="object"&&H!==null&&H.$$typeof===_e&&gc(H)===O.type){n(b,O.sibling),f=l(O,y.props),f.ref=Rr(b,O,y),f.return=b,b=f;break e}n(b,O);break}else t(b,O);O=O.sibling}y.type===Oe?(f=vn(y.props.children,b.mode,P,y.key),f.return=b,b=f):(P=Yi(y.type,y.key,y.props,null,b.mode,P),P.ref=Rr(b,f,y),P.return=b,b=P)}return u(b);case Fe:e:{for(O=y.key;f!==null;){if(f.key===O)if(f.tag===4&&f.stateNode.containerInfo===y.containerInfo&&f.stateNode.implementation===y.implementation){n(b,f.sibling),f=l(f,y.children||[]),f.return=b,b=f;break e}else{n(b,f);break}else t(b,f);f=f.sibling}f=ml(y,b.mode,P),f.return=b,b=f}return u(b);case _e:return O=y._init,be(b,f,O(y._payload),P)}if(nr(y))return x(b,f,y,P);if(W(y))return N(b,f,y,P);Pi(b,y)}return typeof y=="string"&&y!==""||typeof y=="number"?(y=""+y,f!==null&&f.tag===6?(n(b,f.sibling),f=l(f,y),f.return=b,b=f):(n(b,f),f=pl(y,b.mode,P),f.return=b,b=f),u(b)):n(b,f)}return be}var Wn=bc(!0),yc=bc(!1),Ri=Gt(null),Ai=null,jn=null,ka=null;function Ca(){ka=jn=Ai=null}function Da(e){var t=Ri.current;le(Ri),e._currentValue=t}function Ta(e,t,n){for(;e!==null;){var r=e.alternate;if((e.childLanes&t)!==t?(e.childLanes|=t,r!==null&&(r.childLanes|=t)):r!==null&&(r.childLanes&t)!==t&&(r.childLanes|=t),e===n)break;e=e.return}}function zn(e,t){Ai=e,ka=jn=null,e=e.dependencies,e!==null&&e.firstContext!==null&&((e.lanes&t)!==0&&(ze=!0),e.firstContext=null)}function rt(e){var t=e._currentValue;if(ka!==e)if(e={context:e,memoizedValue:t,next:null},jn===null){if(Ai===null)throw Error(a(308));jn=e,Ai.dependencies={lanes:0,firstContext:e}}else jn=jn.next=e;return t}var hn=null;function Pa(e){hn===null?hn=[e]:hn.push(e)}function Sc(e,t,n,r){var l=t.interleaved;return l===null?(n.next=n,Pa(t)):(n.next=l.next,l.next=n),t.interleaved=n,xt(e,r)}function xt(e,t){e.lanes|=t;var n=e.alternate;for(n!==null&&(n.lanes|=t),n=e,e=e.return;e!==null;)e.childLanes|=t,n=e.alternate,n!==null&&(n.childLanes|=t),n=e,e=e.return;return n.tag===3?n.stateNode:null}var $t=!1;function Ra(e){e.updateQueue={baseState:e.memoizedState,firstBaseUpdate:null,lastBaseUpdate:null,shared:{pending:null,interleaved:null,lanes:0},effects:null}}function wc(e,t){e=e.updateQueue,t.updateQueue===e&&(t.updateQueue={baseState:e.baseState,firstBaseUpdate:e.firstBaseUpdate,lastBaseUpdate:e.lastBaseUpdate,shared:e.shared,effects:e.effects})}function Mt(e,t){return{eventTime:e,lane:t,tag:0,payload:null,callback:null,next:null}}function Yt(e,t,n){var r=e.updateQueue;if(r===null)return null;if(r=r.shared,(Q&2)!==0){var l=r.pending;return l===null?t.next=t:(t.next=l.next,l.next=t),r.pending=t,xt(e,n)}return l=r.interleaved,l===null?(t.next=t,Pa(r)):(t.next=l.next,l.next=t),r.interleaved=t,xt(e,n)}function Li(e,t,n){if(t=t.updateQueue,t!==null&&(t=t.shared,(n&4194240)!==0)){var r=t.lanes;r&=e.pendingLanes,n|=r,t.lanes=n,Wo(e,n)}}function vc(e,t){var n=e.updateQueue,r=e.alternate;if(r!==null&&(r=r.updateQueue,n===r)){var l=null,s=null;if(n=n.firstBaseUpdate,n!==null){do{var u={eventTime:n.eventTime,lane:n.lane,tag:n.tag,payload:n.payload,callback:n.callback,next:null};s===null?l=s=u:s=s.next=u,n=n.next}while(n!==null);s===null?l=s=t:s=s.next=t}else l=s=t;n={baseState:r.baseState,firstBaseUpdate:l,lastBaseUpdate:s,shared:r.shared,effects:r.effects},e.updateQueue=n;return}e=n.lastBaseUpdate,e===null?n.firstBaseUpdate=t:e.next=t,n.lastBaseUpdate=t}function Ei(e,t,n,r){var l=e.updateQueue;$t=!1;var s=l.firstBaseUpdate,u=l.lastBaseUpdate,m=l.shared.pending;if(m!==null){l.shared.pending=null;var h=m,S=h.next;h.next=null,u===null?s=S:u.next=S,u=h;var D=e.alternate;D!==null&&(D=D.updateQueue,m=D.lastBaseUpdate,m!==u&&(m===null?D.firstBaseUpdate=S:m.next=S,D.lastBaseUpdate=h))}if(s!==null){var T=l.baseState;u=0,D=S=h=null,m=s;do{var k=m.lane,E=m.eventTime;if((r&k)===k){D!==null&&(D=D.next={eventTime:E,lane:0,tag:m.tag,payload:m.payload,callback:m.callback,next:null});e:{var x=e,N=m;switch(k=t,E=n,N.tag){case 1:if(x=N.payload,typeof x=="function"){T=x.call(E,T,k);break e}T=x;break e;case 3:x.flags=x.flags&-65537|128;case 0:if(x=N.payload,k=typeof x=="function"?x.call(E,T,k):x,k==null)break e;T=F({},T,k);break e;case 2:$t=!0}}m.callback!==null&&m.lane!==0&&(e.flags|=64,k=l.effects,k===null?l.effects=[m]:k.push(m))}else E={eventTime:E,lane:k,tag:m.tag,payload:m.payload,callback:m.callback,next:null},D===null?(S=D=E,h=T):D=D.next=E,u|=k;if(m=m.next,m===null){if(m=l.shared.pending,m===null)break;k=m,m=k.next,k.next=null,l.lastBaseUpdate=k,l.shared.pending=null}}while(!0);if(D===null&&(h=T),l.baseState=h,l.firstBaseUpdate=S,l.lastBaseUpdate=D,t=l.shared.interleaved,t!==null){l=t;do u|=l.lane,l=l.next;while(l!==t)}else s===null&&(l.shared.lanes=0);bn|=u,e.lanes=u,e.memoizedState=T}}function kc(e,t,n){if(e=t.effects,t.effects=null,e!==null)for(t=0;t<e.length;t++){var r=e[t],l=r.callback;if(l!==null){if(r.callback=null,r=n,typeof l!="function")throw Error(a(191,l));l.call(r)}}}var Ar={},Dt=Gt(Ar),Lr=Gt(Ar),Er=Gt(Ar);function fn(e){if(e===Ar)throw Error(a(174));return e}function Aa(e,t){switch(oe(Er,t),oe(Lr,e),oe(Dt,Ar),e=t.nodeType,e){case 9:case 11:t=(t=t.documentElement)?t.namespaceURI:Lo(null,"");break;default:e=e===8?t.parentNode:t,t=e.namespaceURI||null,e=e.tagName,t=Lo(t,e)}le(Dt),oe(Dt,t)}function Vn(){le(Dt),le(Lr),le(Er)}function Cc(e){fn(Er.current);var t=fn(Dt.current),n=Lo(t,e.type);t!==n&&(oe(Lr,e),oe(Dt,n))}function La(e){Lr.current===e&&(le(Dt),le(Lr))}var ue=Gt(0);function Ii(e){for(var t=e;t!==null;){if(t.tag===13){var n=t.memoizedState;if(n!==null&&(n=n.dehydrated,n===null||n.data==="$?"||n.data==="$!"))return t}else if(t.tag===19&&t.memoizedProps.revealOrder!==void 0){if((t.flags&128)!==0)return t}else if(t.child!==null){t.child.return=t,t=t.child;continue}if(t===e)break;for(;t.sibling===null;){if(t.return===null||t.return===e)return null;t=t.return}t.sibling.return=t.return,t=t.sibling}return null}var Ea=[];function Ia(){for(var e=0;e<Ea.length;e++)Ea[e]._workInProgressVersionPrimary=null;Ea.length=0}var Fi=Re.ReactCurrentDispatcher,Fa=Re.ReactCurrentBatchConfig,gn=0,de=null,Se=null,ve=null,xi=!1,Ir=!1,Fr=0,Hm=0;function Le(){throw Error(a(321))}function xa(e,t){if(t===null)return!1;for(var n=0;n<t.length&&n<e.length;n++)if(!pt(e[n],t[n]))return!1;return!0}function Ma(e,t,n,r,l,s){if(gn=s,de=t,t.memoizedState=null,t.updateQueue=null,t.lanes=0,Fi.current=e===null||e.memoizedState===null?_m:Wm,e=n(r,l),Ir){s=0;do{if(Ir=!1,Fr=0,25<=s)throw Error(a(301));s+=1,ve=Se=null,t.updateQueue=null,Fi.current=jm,e=n(r,l)}while(Ir)}if(Fi.current=Hi,t=Se!==null&&Se.next!==null,gn=0,ve=Se=de=null,xi=!1,t)throw Error(a(300));return e}function Na(){var e=Fr!==0;return Fr=0,e}function Tt(){var e={memoizedState:null,baseState:null,baseQueue:null,queue:null,next:null};return ve===null?de.memoizedState=ve=e:ve=ve.next=e,ve}function it(){if(Se===null){var e=de.alternate;e=e!==null?e.memoizedState:null}else e=Se.next;var t=ve===null?de.memoizedState:ve.next;if(t!==null)ve=t,Se=e;else{if(e===null)throw Error(a(310));Se=e,e={memoizedState:Se.memoizedState,baseState:Se.baseState,baseQueue:Se.baseQueue,queue:Se.queue,next:null},ve===null?de.memoizedState=ve=e:ve=ve.next=e}return ve}function xr(e,t){return typeof t=="function"?t(e):t}function Ha(e){var t=it(),n=t.queue;if(n===null)throw Error(a(311));n.lastRenderedReducer=e;var r=Se,l=r.baseQueue,s=n.pending;if(s!==null){if(l!==null){var u=l.next;l.next=s.next,s.next=u}r.baseQueue=l=s,n.pending=null}if(l!==null){s=l.next,r=r.baseState;var m=u=null,h=null,S=s;do{var D=S.lane;if((gn&D)===D)h!==null&&(h=h.next={lane:0,action:S.action,hasEagerState:S.hasEagerState,eagerState:S.eagerState,next:null}),r=S.hasEagerState?S.eagerState:e(r,S.action);else{var T={lane:D,action:S.action,hasEagerState:S.hasEagerState,eagerState:S.eagerState,next:null};h===null?(m=h=T,u=r):h=h.next=T,de.lanes|=D,bn|=D}S=S.next}while(S!==null&&S!==s);h===null?u=r:h.next=m,pt(r,t.memoizedState)||(ze=!0),t.memoizedState=r,t.baseState=u,t.baseQueue=h,n.lastRenderedState=r}if(e=n.interleaved,e!==null){l=e;do s=l.lane,de.lanes|=s,bn|=s,l=l.next;while(l!==e)}else l===null&&(n.lanes=0);return[t.memoizedState,n.dispatch]}function Ua(e){var t=it(),n=t.queue;if(n===null)throw Error(a(311));n.lastRenderedReducer=e;var r=n.dispatch,l=n.pending,s=t.memoizedState;if(l!==null){n.pending=null;var u=l=l.next;do s=e(s,u.action),u=u.next;while(u!==l);pt(s,t.memoizedState)||(ze=!0),t.memoizedState=s,t.baseQueue===null&&(t.baseState=s),n.lastRenderedState=s}return[s,r]}function Dc(){}function Tc(e,t){var n=de,r=it(),l=t(),s=!pt(r.memoizedState,l);if(s&&(r.memoizedState=l,ze=!0),r=r.queue,Ba(Ac.bind(null,n,r,e),[e]),r.getSnapshot!==t||s||ve!==null&&ve.memoizedState.tag&1){if(n.flags|=2048,Mr(9,Rc.bind(null,n,r,l,t),void 0,null),ke===null)throw Error(a(349));(gn&30)!==0||Pc(n,t,l)}return l}function Pc(e,t,n){e.flags|=16384,e={getSnapshot:t,value:n},t=de.updateQueue,t===null?(t={lastEffect:null,stores:null},de.updateQueue=t,t.stores=[e]):(n=t.stores,n===null?t.stores=[e]:n.push(e))}function Rc(e,t,n,r){t.value=n,t.getSnapshot=r,Lc(t)&&Ec(e)}function Ac(e,t,n){return n(function(){Lc(t)&&Ec(e)})}function Lc(e){var t=e.getSnapshot;e=e.value;try{var n=t();return!pt(e,n)}catch{return!0}}function Ec(e){var t=xt(e,1);t!==null&&bt(t,e,1,-1)}function Ic(e){var t=Tt();return typeof e=="function"&&(e=e()),t.memoizedState=t.baseState=e,e={pending:null,interleaved:null,lanes:0,dispatch:null,lastRenderedReducer:xr,lastRenderedState:e},t.queue=e,e=e.dispatch=Om.bind(null,de,e),[t.memoizedState,e]}function Mr(e,t,n,r){return e={tag:e,create:t,destroy:n,deps:r,next:null},t=de.updateQueue,t===null?(t={lastEffect:null,stores:null},de.updateQueue=t,t.lastEffect=e.next=e):(n=t.lastEffect,n===null?t.lastEffect=e.next=e:(r=n.next,n.next=e,e.next=r,t.lastEffect=e)),e}function Fc(){return it().memoizedState}function Mi(e,t,n,r){var l=Tt();de.flags|=e,l.memoizedState=Mr(1|t,n,void 0,r===void 0?null:r)}function Ni(e,t,n,r){var l=it();r=r===void 0?null:r;var s=void 0;if(Se!==null){var u=Se.memoizedState;if(s=u.destroy,r!==null&&xa(r,u.deps)){l.memoizedState=Mr(t,n,s,r);return}}de.flags|=e,l.memoizedState=Mr(1|t,n,s,r)}function xc(e,t){return Mi(8390656,8,e,t)}function Ba(e,t){return Ni(2048,8,e,t)}function Mc(e,t){return Ni(4,2,e,t)}function Nc(e,t){return Ni(4,4,e,t)}function Hc(e,t){if(typeof t=="function")return e=e(),t(e),function(){t(null)};if(t!=null)return e=e(),t.current=e,function(){t.current=null}}function Uc(e,t,n){return n=n!=null?n.concat([e]):null,Ni(4,4,Hc.bind(null,t,e),n)}function Oa(){}function Bc(e,t){var n=it();t=t===void 0?null:t;var r=n.memoizedState;return r!==null&&t!==null&&xa(t,r[1])?r[0]:(n.memoizedState=[e,t],e)}function Oc(e,t){var n=it();t=t===void 0?null:t;var r=n.memoizedState;return r!==null&&t!==null&&xa(t,r[1])?r[0]:(e=e(),n.memoizedState=[e,t],e)}function _c(e,t,n){return(gn&21)===0?(e.baseState&&(e.baseState=!1,ze=!0),e.memoizedState=n):(pt(n,t)||(n=gs(),de.lanes|=n,bn|=n,e.baseState=!0),t)}function Um(e,t){var n=te;te=n!==0&&4>n?n:4,e(!0);var r=Fa.transition;Fa.transition={};try{e(!1),t()}finally{te=n,Fa.transition=r}}function Wc(){return it().memoizedState}function Bm(e,t,n){var r=en(e);if(n={lane:r,action:n,hasEagerState:!1,eagerState:null,next:null},jc(e))zc(t,n);else if(n=Sc(e,t,n,r),n!==null){var l=Me();bt(n,e,r,l),Vc(n,t,r)}}function Om(e,t,n){var r=en(e),l={lane:r,action:n,hasEagerState:!1,eagerState:null,next:null};if(jc(e))zc(t,l);else{var s=e.alternate;if(e.lanes===0&&(s===null||s.lanes===0)&&(s=t.lastRenderedReducer,s!==null))try{var u=t.lastRenderedState,m=s(u,n);if(l.hasEagerState=!0,l.eagerState=m,pt(m,u)){var h=t.interleaved;h===null?(l.next=l,Pa(t)):(l.next=h.next,h.next=l),t.interleaved=l;return}}catch{}finally{}n=Sc(e,t,l,r),n!==null&&(l=Me(),bt(n,e,r,l),Vc(n,t,r))}}function jc(e){var t=e.alternate;return e===de||t!==null&&t===de}function zc(e,t){Ir=xi=!0;var n=e.pending;n===null?t.next=t:(t.next=n.next,n.next=t),e.pending=t}function Vc(e,t,n){if((n&4194240)!==0){var r=t.lanes;r&=e.pendingLanes,n|=r,t.lanes=n,Wo(e,n)}}var Hi={readContext:rt,useCallback:Le,useContext:Le,useEffect:Le,useImperativeHandle:Le,useInsertionEffect:Le,useLayoutEffect:Le,useMemo:Le,useReducer:Le,useRef:Le,useState:Le,useDebugValue:Le,useDeferredValue:Le,useTransition:Le,useMutableSource:Le,useSyncExternalStore:Le,useId:Le,unstable_isNewReconciler:!1},_m={readContext:rt,useCallback:function(e,t){return Tt().memoizedState=[e,t===void 0?null:t],e},useContext:rt,useEffect:xc,useImperativeHandle:function(e,t,n){return n=n!=null?n.concat([e]):null,Mi(4194308,4,Hc.bind(null,t,e),n)},useLayoutEffect:function(e,t){return Mi(4194308,4,e,t)},useInsertionEffect:function(e,t){return Mi(4,2,e,t)},useMemo:function(e,t){var n=Tt();return t=t===void 0?null:t,e=e(),n.memoizedState=[e,t],e},useReducer:function(e,t,n){var r=Tt();return t=n!==void 0?n(t):t,r.memoizedState=r.baseState=t,e={pending:null,interleaved:null,lanes:0,dispatch:null,lastRenderedReducer:e,lastRenderedState:t},r.queue=e,e=e.dispatch=Bm.bind(null,de,e),[r.memoizedState,e]},useRef:function(e){var t=Tt();return e={current:e},t.memoizedState=e},useState:Ic,useDebugValue:Oa,useDeferredValue:function(e){return Tt().memoizedState=e},useTransition:function(){var e=Ic(!1),t=e[0];return e=Um.bind(null,e[1]),Tt().memoizedState=e,[t,e]},useMutableSource:function(){},useSyncExternalStore:function(e,t,n){var r=de,l=Tt();if(ce){if(n===void 0)throw Error(a(407));n=n()}else{if(n=t(),ke===null)throw Error(a(349));(gn&30)!==0||Pc(r,t,n)}l.memoizedState=n;var s={value:n,getSnapshot:t};return l.queue=s,xc(Ac.bind(null,r,s,e),[e]),r.flags|=2048,Mr(9,Rc.bind(null,r,s,n,t),void 0,null),n},useId:function(){var e=Tt(),t=ke.identifierPrefix;if(ce){var n=Ft,r=It;n=(r&~(1<<32-dt(r)-1)).toString(32)+n,t=":"+t+"R"+n,n=Fr++,0<n&&(t+="H"+n.toString(32)),t+=":"}else n=Hm++,t=":"+t+"r"+n.toString(32)+":";return e.memoizedState=t},unstable_isNewReconciler:!1},Wm={readContext:rt,useCallback:Bc,useContext:rt,useEffect:Ba,useImperativeHandle:Uc,useInsertionEffect:Mc,useLayoutEffect:Nc,useMemo:Oc,useReducer:Ha,useRef:Fc,useState:function(){return Ha(xr)},useDebugValue:Oa,useDeferredValue:function(e){var t=it();return _c(t,Se.memoizedState,e)},useTransition:function(){var e=Ha(xr)[0],t=it().memoizedState;return[e,t]},useMutableSource:Dc,useSyncExternalStore:Tc,useId:Wc,unstable_isNewReconciler:!1},jm={readContext:rt,useCallback:Bc,useContext:rt,useEffect:Ba,useImperativeHandle:Uc,useInsertionEffect:Mc,useLayoutEffect:Nc,useMemo:Oc,useReducer:Ua,useRef:Fc,useState:function(){return Ua(xr)},useDebugValue:Oa,useDeferredValue:function(e){var t=it();return Se===null?t.memoizedState=e:_c(t,Se.memoizedState,e)},useTransition:function(){var e=Ua(xr)[0],t=it().memoizedState;return[e,t]},useMutableSource:Dc,useSyncExternalStore:Tc,useId:Wc,unstable_isNewReconciler:!1};function ht(e,t){if(e&&e.defaultProps){t=F({},t),e=e.defaultProps;for(var n in e)t[n]===void 0&&(t[n]=e[n]);return t}return t}function _a(e,t,n,r){t=e.memoizedState,n=n(r,t),n=n==null?t:F({},t,n),e.memoizedState=n,e.lanes===0&&(e.updateQueue.baseState=n)}var Ui={isMounted:function(e){return(e=e._reactInternals)?cn(e)===e:!1},enqueueSetState:function(e,t,n){e=e._reactInternals;var r=Me(),l=en(e),s=Mt(r,l);s.payload=t,n!=null&&(s.callback=n),t=Yt(e,s,l),t!==null&&(bt(t,e,l,r),Li(t,e,l))},enqueueReplaceState:function(e,t,n){e=e._reactInternals;var r=Me(),l=en(e),s=Mt(r,l);s.tag=1,s.payload=t,n!=null&&(s.callback=n),t=Yt(e,s,l),t!==null&&(bt(t,e,l,r),Li(t,e,l))},enqueueForceUpdate:function(e,t){e=e._reactInternals;var n=Me(),r=en(e),l=Mt(n,r);l.tag=2,t!=null&&(l.callback=t),t=Yt(e,l,r),t!==null&&(bt(t,e,r,n),Li(t,e,r))}};function qc(e,t,n,r,l,s,u){return e=e.stateNode,typeof e.shouldComponentUpdate=="function"?e.shouldComponentUpdate(r,s,u):t.prototype&&t.prototype.isPureReactComponent?!wr(n,r)||!wr(l,s):!0}function Gc(e,t,n){var r=!1,l=Kt,s=t.contextType;return typeof s=="object"&&s!==null?s=rt(s):(l=je(t)?dn:Ae.current,r=t.contextTypes,s=(r=r!=null)?Un(e,l):Kt),t=new t(n,s),e.memoizedState=t.state!==null&&t.state!==void 0?t.state:null,t.updater=Ui,e.stateNode=t,t._reactInternals=e,r&&(e=e.stateNode,e.__reactInternalMemoizedUnmaskedChildContext=l,e.__reactInternalMemoizedMaskedChildContext=s),t}function Kc(e,t,n,r){e=t.state,typeof t.componentWillReceiveProps=="function"&&t.componentWillReceiveProps(n,r),typeof t.UNSAFE_componentWillReceiveProps=="function"&&t.UNSAFE_componentWillReceiveProps(n,r),t.state!==e&&Ui.enqueueReplaceState(t,t.state,null)}function Wa(e,t,n,r){var l=e.stateNode;l.props=n,l.state=e.memoizedState,l.refs={},Ra(e);var s=t.contextType;typeof s=="object"&&s!==null?l.context=rt(s):(s=je(t)?dn:Ae.current,l.context=Un(e,s)),l.state=e.memoizedState,s=t.getDerivedStateFromProps,typeof s=="function"&&(_a(e,t,s,n),l.state=e.memoizedState),typeof t.getDerivedStateFromProps=="function"||typeof l.getSnapshotBeforeUpdate=="function"||typeof l.UNSAFE_componentWillMount!="function"&&typeof l.componentWillMount!="function"||(t=l.state,typeof l.componentWillMount=="function"&&l.componentWillMount(),typeof l.UNSAFE_componentWillMount=="function"&&l.UNSAFE_componentWillMount(),t!==l.state&&Ui.enqueueReplaceState(l,l.state,null),Ei(e,n,l,r),l.state=e.memoizedState),typeof l.componentDidMount=="function"&&(e.flags|=4194308)}function qn(e,t){try{var n="",r=t;do n+=$(r),r=r.return;while(r);var l=n}catch(s){l=`
40
+ Error generating stack: `+s.message+`
41
+ `+s.stack}return{value:e,source:t,stack:l,digest:null}}function ja(e,t,n){return{value:e,source:null,stack:n??null,digest:t??null}}function za(e,t){try{console.error(t.value)}catch(n){setTimeout(function(){throw n})}}var zm=typeof WeakMap=="function"?WeakMap:Map;function Qc(e,t,n){n=Mt(-1,n),n.tag=3,n.payload={element:null};var r=t.value;return n.callback=function(){Vi||(Vi=!0,il=r),za(e,t)},n}function $c(e,t,n){n=Mt(-1,n),n.tag=3;var r=e.type.getDerivedStateFromError;if(typeof r=="function"){var l=t.value;n.payload=function(){return r(l)},n.callback=function(){za(e,t)}}var s=e.stateNode;return s!==null&&typeof s.componentDidCatch=="function"&&(n.callback=function(){za(e,t),typeof r!="function"&&(Jt===null?Jt=new Set([this]):Jt.add(this));var u=t.stack;this.componentDidCatch(t.value,{componentStack:u!==null?u:""})}),n}function Yc(e,t,n){var r=e.pingCache;if(r===null){r=e.pingCache=new zm;var l=new Set;r.set(t,l)}else l=r.get(t),l===void 0&&(l=new Set,r.set(t,l));l.has(n)||(l.add(n),e=rh.bind(null,e,t,n),t.then(e,e))}function Zc(e){do{var t;if((t=e.tag===13)&&(t=e.memoizedState,t=t!==null?t.dehydrated!==null:!0),t)return e;e=e.return}while(e!==null);return null}function Jc(e,t,n,r,l){return(e.mode&1)===0?(e===t?e.flags|=65536:(e.flags|=128,n.flags|=131072,n.flags&=-52805,n.tag===1&&(n.alternate===null?n.tag=17:(t=Mt(-1,1),t.tag=2,Yt(n,t,1))),n.lanes|=1),e):(e.flags|=65536,e.lanes=l,e)}var Vm=Re.ReactCurrentOwner,ze=!1;function xe(e,t,n,r){t.child=e===null?yc(t,null,n,r):Wn(t,e.child,n,r)}function Xc(e,t,n,r,l){n=n.render;var s=t.ref;return zn(t,l),r=Ma(e,t,n,r,s,l),n=Na(),e!==null&&!ze?(t.updateQueue=e.updateQueue,t.flags&=-2053,e.lanes&=~l,Nt(e,t,l)):(ce&&n&&ba(t),t.flags|=1,xe(e,t,r,l),t.child)}function eu(e,t,n,r,l){if(e===null){var s=n.type;return typeof s=="function"&&!dl(s)&&s.defaultProps===void 0&&n.compare===null&&n.defaultProps===void 0?(t.tag=15,t.type=s,tu(e,t,s,r,l)):(e=Yi(n.type,null,r,t,t.mode,l),e.ref=t.ref,e.return=t,t.child=e)}if(s=e.child,(e.lanes&l)===0){var u=s.memoizedProps;if(n=n.compare,n=n!==null?n:wr,n(u,r)&&e.ref===t.ref)return Nt(e,t,l)}return t.flags|=1,e=nn(s,r),e.ref=t.ref,e.return=t,t.child=e}function tu(e,t,n,r,l){if(e!==null){var s=e.memoizedProps;if(wr(s,r)&&e.ref===t.ref)if(ze=!1,t.pendingProps=r=s,(e.lanes&l)!==0)(e.flags&131072)!==0&&(ze=!0);else return t.lanes=e.lanes,Nt(e,t,l)}return Va(e,t,n,r,l)}function nu(e,t,n){var r=t.pendingProps,l=r.children,s=e!==null?e.memoizedState:null;if(r.mode==="hidden")if((t.mode&1)===0)t.memoizedState={baseLanes:0,cachePool:null,transitions:null},oe(Kn,Xe),Xe|=n;else{if((n&1073741824)===0)return e=s!==null?s.baseLanes|n:n,t.lanes=t.childLanes=1073741824,t.memoizedState={baseLanes:e,cachePool:null,transitions:null},t.updateQueue=null,oe(Kn,Xe),Xe|=e,null;t.memoizedState={baseLanes:0,cachePool:null,transitions:null},r=s!==null?s.baseLanes:n,oe(Kn,Xe),Xe|=r}else s!==null?(r=s.baseLanes|n,t.memoizedState=null):r=n,oe(Kn,Xe),Xe|=r;return xe(e,t,l,n),t.child}function ru(e,t){var n=t.ref;(e===null&&n!==null||e!==null&&e.ref!==n)&&(t.flags|=512,t.flags|=2097152)}function Va(e,t,n,r,l){var s=je(n)?dn:Ae.current;return s=Un(t,s),zn(t,l),n=Ma(e,t,n,r,s,l),r=Na(),e!==null&&!ze?(t.updateQueue=e.updateQueue,t.flags&=-2053,e.lanes&=~l,Nt(e,t,l)):(ce&&r&&ba(t),t.flags|=1,xe(e,t,n,l),t.child)}function iu(e,t,n,r,l){if(je(n)){var s=!0;vi(t)}else s=!1;if(zn(t,l),t.stateNode===null)Oi(e,t),Gc(t,n,r),Wa(t,n,r,l),r=!0;else if(e===null){var u=t.stateNode,m=t.memoizedProps;u.props=m;var h=u.context,S=n.contextType;typeof S=="object"&&S!==null?S=rt(S):(S=je(n)?dn:Ae.current,S=Un(t,S));var D=n.getDerivedStateFromProps,T=typeof D=="function"||typeof u.getSnapshotBeforeUpdate=="function";T||typeof u.UNSAFE_componentWillReceiveProps!="function"&&typeof u.componentWillReceiveProps!="function"||(m!==r||h!==S)&&Kc(t,u,r,S),$t=!1;var k=t.memoizedState;u.state=k,Ei(t,r,u,l),h=t.memoizedState,m!==r||k!==h||We.current||$t?(typeof D=="function"&&(_a(t,n,D,r),h=t.memoizedState),(m=$t||qc(t,n,m,r,k,h,S))?(T||typeof u.UNSAFE_componentWillMount!="function"&&typeof u.componentWillMount!="function"||(typeof u.componentWillMount=="function"&&u.componentWillMount(),typeof u.UNSAFE_componentWillMount=="function"&&u.UNSAFE_componentWillMount()),typeof u.componentDidMount=="function"&&(t.flags|=4194308)):(typeof u.componentDidMount=="function"&&(t.flags|=4194308),t.memoizedProps=r,t.memoizedState=h),u.props=r,u.state=h,u.context=S,r=m):(typeof u.componentDidMount=="function"&&(t.flags|=4194308),r=!1)}else{u=t.stateNode,wc(e,t),m=t.memoizedProps,S=t.type===t.elementType?m:ht(t.type,m),u.props=S,T=t.pendingProps,k=u.context,h=n.contextType,typeof h=="object"&&h!==null?h=rt(h):(h=je(n)?dn:Ae.current,h=Un(t,h));var E=n.getDerivedStateFromProps;(D=typeof E=="function"||typeof u.getSnapshotBeforeUpdate=="function")||typeof u.UNSAFE_componentWillReceiveProps!="function"&&typeof u.componentWillReceiveProps!="function"||(m!==T||k!==h)&&Kc(t,u,r,h),$t=!1,k=t.memoizedState,u.state=k,Ei(t,r,u,l);var x=t.memoizedState;m!==T||k!==x||We.current||$t?(typeof E=="function"&&(_a(t,n,E,r),x=t.memoizedState),(S=$t||qc(t,n,S,r,k,x,h)||!1)?(D||typeof u.UNSAFE_componentWillUpdate!="function"&&typeof u.componentWillUpdate!="function"||(typeof u.componentWillUpdate=="function"&&u.componentWillUpdate(r,x,h),typeof u.UNSAFE_componentWillUpdate=="function"&&u.UNSAFE_componentWillUpdate(r,x,h)),typeof u.componentDidUpdate=="function"&&(t.flags|=4),typeof u.getSnapshotBeforeUpdate=="function"&&(t.flags|=1024)):(typeof u.componentDidUpdate!="function"||m===e.memoizedProps&&k===e.memoizedState||(t.flags|=4),typeof u.getSnapshotBeforeUpdate!="function"||m===e.memoizedProps&&k===e.memoizedState||(t.flags|=1024),t.memoizedProps=r,t.memoizedState=x),u.props=r,u.state=x,u.context=h,r=S):(typeof u.componentDidUpdate!="function"||m===e.memoizedProps&&k===e.memoizedState||(t.flags|=4),typeof u.getSnapshotBeforeUpdate!="function"||m===e.memoizedProps&&k===e.memoizedState||(t.flags|=1024),r=!1)}return qa(e,t,n,r,s,l)}function qa(e,t,n,r,l,s){ru(e,t);var u=(t.flags&128)!==0;if(!r&&!u)return l&&cc(t,n,!1),Nt(e,t,s);r=t.stateNode,Vm.current=t;var m=u&&typeof n.getDerivedStateFromError!="function"?null:r.render();return t.flags|=1,e!==null&&u?(t.child=Wn(t,e.child,null,s),t.child=Wn(t,null,m,s)):xe(e,t,m,s),t.memoizedState=r.state,l&&cc(t,n,!0),t.child}function ou(e){var t=e.stateNode;t.pendingContext?lc(e,t.pendingContext,t.pendingContext!==t.context):t.context&&lc(e,t.context,!1),Aa(e,t.containerInfo)}function au(e,t,n,r,l){return _n(),va(l),t.flags|=256,xe(e,t,n,r),t.child}var Ga={dehydrated:null,treeContext:null,retryLane:0};function Ka(e){return{baseLanes:e,cachePool:null,transitions:null}}function lu(e,t,n){var r=t.pendingProps,l=ue.current,s=!1,u=(t.flags&128)!==0,m;if((m=u)||(m=e!==null&&e.memoizedState===null?!1:(l&2)!==0),m?(s=!0,t.flags&=-129):(e===null||e.memoizedState!==null)&&(l|=1),oe(ue,l&1),e===null)return wa(t),e=t.memoizedState,e!==null&&(e=e.dehydrated,e!==null)?((t.mode&1)===0?t.lanes=1:e.data==="$!"?t.lanes=8:t.lanes=1073741824,null):(u=r.children,e=r.fallback,s?(r=t.mode,s=t.child,u={mode:"hidden",children:u},(r&1)===0&&s!==null?(s.childLanes=0,s.pendingProps=u):s=Zi(u,r,0,null),e=vn(e,r,n,null),s.return=t,e.return=t,s.sibling=e,t.child=s,t.child.memoizedState=Ka(n),t.memoizedState=Ga,e):Qa(t,u));if(l=e.memoizedState,l!==null&&(m=l.dehydrated,m!==null))return qm(e,t,u,r,m,l,n);if(s){s=r.fallback,u=t.mode,l=e.child,m=l.sibling;var h={mode:"hidden",children:r.children};return(u&1)===0&&t.child!==l?(r=t.child,r.childLanes=0,r.pendingProps=h,t.deletions=null):(r=nn(l,h),r.subtreeFlags=l.subtreeFlags&14680064),m!==null?s=nn(m,s):(s=vn(s,u,n,null),s.flags|=2),s.return=t,r.return=t,r.sibling=s,t.child=r,r=s,s=t.child,u=e.child.memoizedState,u=u===null?Ka(n):{baseLanes:u.baseLanes|n,cachePool:null,transitions:u.transitions},s.memoizedState=u,s.childLanes=e.childLanes&~n,t.memoizedState=Ga,r}return s=e.child,e=s.sibling,r=nn(s,{mode:"visible",children:r.children}),(t.mode&1)===0&&(r.lanes=n),r.return=t,r.sibling=null,e!==null&&(n=t.deletions,n===null?(t.deletions=[e],t.flags|=16):n.push(e)),t.child=r,t.memoizedState=null,r}function Qa(e,t){return t=Zi({mode:"visible",children:t},e.mode,0,null),t.return=e,e.child=t}function Bi(e,t,n,r){return r!==null&&va(r),Wn(t,e.child,null,n),e=Qa(t,t.pendingProps.children),e.flags|=2,t.memoizedState=null,e}function qm(e,t,n,r,l,s,u){if(n)return t.flags&256?(t.flags&=-257,r=ja(Error(a(422))),Bi(e,t,u,r)):t.memoizedState!==null?(t.child=e.child,t.flags|=128,null):(s=r.fallback,l=t.mode,r=Zi({mode:"visible",children:r.children},l,0,null),s=vn(s,l,u,null),s.flags|=2,r.return=t,s.return=t,r.sibling=s,t.child=r,(t.mode&1)!==0&&Wn(t,e.child,null,u),t.child.memoizedState=Ka(u),t.memoizedState=Ga,s);if((t.mode&1)===0)return Bi(e,t,u,null);if(l.data==="$!"){if(r=l.nextSibling&&l.nextSibling.dataset,r)var m=r.dgst;return r=m,s=Error(a(419)),r=ja(s,r,void 0),Bi(e,t,u,r)}if(m=(u&e.childLanes)!==0,ze||m){if(r=ke,r!==null){switch(u&-u){case 4:l=2;break;case 16:l=8;break;case 64:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:case 4194304:case 8388608:case 16777216:case 33554432:case 67108864:l=32;break;case 536870912:l=268435456;break;default:l=0}l=(l&(r.suspendedLanes|u))!==0?0:l,l!==0&&l!==s.retryLane&&(s.retryLane=l,xt(e,l),bt(r,e,l,-1))}return ul(),r=ja(Error(a(421))),Bi(e,t,u,r)}return l.data==="$?"?(t.flags|=128,t.child=e.child,t=ih.bind(null,e),l._reactRetry=t,null):(e=s.treeContext,Je=qt(l.nextSibling),Ze=t,ce=!0,mt=null,e!==null&&(tt[nt++]=It,tt[nt++]=Ft,tt[nt++]=pn,It=e.id,Ft=e.overflow,pn=t),t=Qa(t,r.children),t.flags|=4096,t)}function su(e,t,n){e.lanes|=t;var r=e.alternate;r!==null&&(r.lanes|=t),Ta(e.return,t,n)}function $a(e,t,n,r,l){var s=e.memoizedState;s===null?e.memoizedState={isBackwards:t,rendering:null,renderingStartTime:0,last:r,tail:n,tailMode:l}:(s.isBackwards=t,s.rendering=null,s.renderingStartTime=0,s.last=r,s.tail=n,s.tailMode=l)}function cu(e,t,n){var r=t.pendingProps,l=r.revealOrder,s=r.tail;if(xe(e,t,r.children,n),r=ue.current,(r&2)!==0)r=r&1|2,t.flags|=128;else{if(e!==null&&(e.flags&128)!==0)e:for(e=t.child;e!==null;){if(e.tag===13)e.memoizedState!==null&&su(e,n,t);else if(e.tag===19)su(e,n,t);else if(e.child!==null){e.child.return=e,e=e.child;continue}if(e===t)break e;for(;e.sibling===null;){if(e.return===null||e.return===t)break e;e=e.return}e.sibling.return=e.return,e=e.sibling}r&=1}if(oe(ue,r),(t.mode&1)===0)t.memoizedState=null;else switch(l){case"forwards":for(n=t.child,l=null;n!==null;)e=n.alternate,e!==null&&Ii(e)===null&&(l=n),n=n.sibling;n=l,n===null?(l=t.child,t.child=null):(l=n.sibling,n.sibling=null),$a(t,!1,l,n,s);break;case"backwards":for(n=null,l=t.child,t.child=null;l!==null;){if(e=l.alternate,e!==null&&Ii(e)===null){t.child=l;break}e=l.sibling,l.sibling=n,n=l,l=e}$a(t,!0,n,null,s);break;case"together":$a(t,!1,null,null,void 0);break;default:t.memoizedState=null}return t.child}function Oi(e,t){(t.mode&1)===0&&e!==null&&(e.alternate=null,t.alternate=null,t.flags|=2)}function Nt(e,t,n){if(e!==null&&(t.dependencies=e.dependencies),bn|=t.lanes,(n&t.childLanes)===0)return null;if(e!==null&&t.child!==e.child)throw Error(a(153));if(t.child!==null){for(e=t.child,n=nn(e,e.pendingProps),t.child=n,n.return=t;e.sibling!==null;)e=e.sibling,n=n.sibling=nn(e,e.pendingProps),n.return=t;n.sibling=null}return t.child}function Gm(e,t,n){switch(t.tag){case 3:ou(t),_n();break;case 5:Cc(t);break;case 1:je(t.type)&&vi(t);break;case 4:Aa(t,t.stateNode.containerInfo);break;case 10:var r=t.type._context,l=t.memoizedProps.value;oe(Ri,r._currentValue),r._currentValue=l;break;case 13:if(r=t.memoizedState,r!==null)return r.dehydrated!==null?(oe(ue,ue.current&1),t.flags|=128,null):(n&t.child.childLanes)!==0?lu(e,t,n):(oe(ue,ue.current&1),e=Nt(e,t,n),e!==null?e.sibling:null);oe(ue,ue.current&1);break;case 19:if(r=(n&t.childLanes)!==0,(e.flags&128)!==0){if(r)return cu(e,t,n);t.flags|=128}if(l=t.memoizedState,l!==null&&(l.rendering=null,l.tail=null,l.lastEffect=null),oe(ue,ue.current),r)break;return null;case 22:case 23:return t.lanes=0,nu(e,t,n)}return Nt(e,t,n)}var uu,Ya,du,pu;uu=function(e,t){for(var n=t.child;n!==null;){if(n.tag===5||n.tag===6)e.appendChild(n.stateNode);else if(n.tag!==4&&n.child!==null){n.child.return=n,n=n.child;continue}if(n===t)break;for(;n.sibling===null;){if(n.return===null||n.return===t)return;n=n.return}n.sibling.return=n.return,n=n.sibling}},Ya=function(){},du=function(e,t,n,r){var l=e.memoizedProps;if(l!==r){e=t.stateNode,fn(Dt.current);var s=null;switch(n){case"input":l=To(e,l),r=To(e,r),s=[];break;case"select":l=F({},l,{value:void 0}),r=F({},r,{value:void 0}),s=[];break;case"textarea":l=Ao(e,l),r=Ao(e,r),s=[];break;default:typeof l.onClick!="function"&&typeof r.onClick=="function"&&(e.onclick=yi)}Eo(n,r);var u;n=null;for(S in l)if(!r.hasOwnProperty(S)&&l.hasOwnProperty(S)&&l[S]!=null)if(S==="style"){var m=l[S];for(u in m)m.hasOwnProperty(u)&&(n||(n={}),n[u]="")}else S!=="dangerouslySetInnerHTML"&&S!=="children"&&S!=="suppressContentEditableWarning"&&S!=="suppressHydrationWarning"&&S!=="autoFocus"&&(d.hasOwnProperty(S)?s||(s=[]):(s=s||[]).push(S,null));for(S in r){var h=r[S];if(m=l!=null?l[S]:void 0,r.hasOwnProperty(S)&&h!==m&&(h!=null||m!=null))if(S==="style")if(m){for(u in m)!m.hasOwnProperty(u)||h&&h.hasOwnProperty(u)||(n||(n={}),n[u]="");for(u in h)h.hasOwnProperty(u)&&m[u]!==h[u]&&(n||(n={}),n[u]=h[u])}else n||(s||(s=[]),s.push(S,n)),n=h;else S==="dangerouslySetInnerHTML"?(h=h?h.__html:void 0,m=m?m.__html:void 0,h!=null&&m!==h&&(s=s||[]).push(S,h)):S==="children"?typeof h!="string"&&typeof h!="number"||(s=s||[]).push(S,""+h):S!=="suppressContentEditableWarning"&&S!=="suppressHydrationWarning"&&(d.hasOwnProperty(S)?(h!=null&&S==="onScroll"&&ae("scroll",e),s||m===h||(s=[])):(s=s||[]).push(S,h))}n&&(s=s||[]).push("style",n);var S=s;(t.updateQueue=S)&&(t.flags|=4)}},pu=function(e,t,n,r){n!==r&&(t.flags|=4)};function Nr(e,t){if(!ce)switch(e.tailMode){case"hidden":t=e.tail;for(var n=null;t!==null;)t.alternate!==null&&(n=t),t=t.sibling;n===null?e.tail=null:n.sibling=null;break;case"collapsed":n=e.tail;for(var r=null;n!==null;)n.alternate!==null&&(r=n),n=n.sibling;r===null?t||e.tail===null?e.tail=null:e.tail.sibling=null:r.sibling=null}}function Ee(e){var t=e.alternate!==null&&e.alternate.child===e.child,n=0,r=0;if(t)for(var l=e.child;l!==null;)n|=l.lanes|l.childLanes,r|=l.subtreeFlags&14680064,r|=l.flags&14680064,l.return=e,l=l.sibling;else for(l=e.child;l!==null;)n|=l.lanes|l.childLanes,r|=l.subtreeFlags,r|=l.flags,l.return=e,l=l.sibling;return e.subtreeFlags|=r,e.childLanes=n,t}function Km(e,t,n){var r=t.pendingProps;switch(ya(t),t.tag){case 2:case 16:case 15:case 0:case 11:case 7:case 8:case 12:case 9:case 14:return Ee(t),null;case 1:return je(t.type)&&wi(),Ee(t),null;case 3:return r=t.stateNode,Vn(),le(We),le(Ae),Ia(),r.pendingContext&&(r.context=r.pendingContext,r.pendingContext=null),(e===null||e.child===null)&&(Ti(t)?t.flags|=4:e===null||e.memoizedState.isDehydrated&&(t.flags&256)===0||(t.flags|=1024,mt!==null&&(ll(mt),mt=null))),Ya(e,t),Ee(t),null;case 5:La(t);var l=fn(Er.current);if(n=t.type,e!==null&&t.stateNode!=null)du(e,t,n,r,l),e.ref!==t.ref&&(t.flags|=512,t.flags|=2097152);else{if(!r){if(t.stateNode===null)throw Error(a(166));return Ee(t),null}if(e=fn(Dt.current),Ti(t)){r=t.stateNode,n=t.type;var s=t.memoizedProps;switch(r[Ct]=t,r[Tr]=s,e=(t.mode&1)!==0,n){case"dialog":ae("cancel",r),ae("close",r);break;case"iframe":case"object":case"embed":ae("load",r);break;case"video":case"audio":for(l=0;l<kr.length;l++)ae(kr[l],r);break;case"source":ae("error",r);break;case"img":case"image":case"link":ae("error",r),ae("load",r);break;case"details":ae("toggle",r);break;case"input":Gl(r,s),ae("invalid",r);break;case"select":r._wrapperState={wasMultiple:!!s.multiple},ae("invalid",r);break;case"textarea":$l(r,s),ae("invalid",r)}Eo(n,s),l=null;for(var u in s)if(s.hasOwnProperty(u)){var m=s[u];u==="children"?typeof m=="string"?r.textContent!==m&&(s.suppressHydrationWarning!==!0&&bi(r.textContent,m,e),l=["children",m]):typeof m=="number"&&r.textContent!==""+m&&(s.suppressHydrationWarning!==!0&&bi(r.textContent,m,e),l=["children",""+m]):d.hasOwnProperty(u)&&m!=null&&u==="onScroll"&&ae("scroll",r)}switch(n){case"input":Qr(r),Ql(r,s,!0);break;case"textarea":Qr(r),Zl(r);break;case"select":case"option":break;default:typeof s.onClick=="function"&&(r.onclick=yi)}r=l,t.updateQueue=r,r!==null&&(t.flags|=4)}else{u=l.nodeType===9?l:l.ownerDocument,e==="http://www.w3.org/1999/xhtml"&&(e=Jl(n)),e==="http://www.w3.org/1999/xhtml"?n==="script"?(e=u.createElement("div"),e.innerHTML="<script><\/script>",e=e.removeChild(e.firstChild)):typeof r.is=="string"?e=u.createElement(n,{is:r.is}):(e=u.createElement(n),n==="select"&&(u=e,r.multiple?u.multiple=!0:r.size&&(u.size=r.size))):e=u.createElementNS(e,n),e[Ct]=t,e[Tr]=r,uu(e,t,!1,!1),t.stateNode=e;e:{switch(u=Io(n,r),n){case"dialog":ae("cancel",e),ae("close",e),l=r;break;case"iframe":case"object":case"embed":ae("load",e),l=r;break;case"video":case"audio":for(l=0;l<kr.length;l++)ae(kr[l],e);l=r;break;case"source":ae("error",e),l=r;break;case"img":case"image":case"link":ae("error",e),ae("load",e),l=r;break;case"details":ae("toggle",e),l=r;break;case"input":Gl(e,r),l=To(e,r),ae("invalid",e);break;case"option":l=r;break;case"select":e._wrapperState={wasMultiple:!!r.multiple},l=F({},r,{value:void 0}),ae("invalid",e);break;case"textarea":$l(e,r),l=Ao(e,r),ae("invalid",e);break;default:l=r}Eo(n,l),m=l;for(s in m)if(m.hasOwnProperty(s)){var h=m[s];s==="style"?ts(e,h):s==="dangerouslySetInnerHTML"?(h=h?h.__html:void 0,h!=null&&Xl(e,h)):s==="children"?typeof h=="string"?(n!=="textarea"||h!=="")&&rr(e,h):typeof h=="number"&&rr(e,""+h):s!=="suppressContentEditableWarning"&&s!=="suppressHydrationWarning"&&s!=="autoFocus"&&(d.hasOwnProperty(s)?h!=null&&s==="onScroll"&&ae("scroll",e):h!=null&&st(e,s,h,u))}switch(n){case"input":Qr(e),Ql(e,r,!1);break;case"textarea":Qr(e),Zl(e);break;case"option":r.value!=null&&e.setAttribute("value",""+ee(r.value));break;case"select":e.multiple=!!r.multiple,s=r.value,s!=null?Tn(e,!!r.multiple,s,!1):r.defaultValue!=null&&Tn(e,!!r.multiple,r.defaultValue,!0);break;default:typeof l.onClick=="function"&&(e.onclick=yi)}switch(n){case"button":case"input":case"select":case"textarea":r=!!r.autoFocus;break e;case"img":r=!0;break e;default:r=!1}}r&&(t.flags|=4)}t.ref!==null&&(t.flags|=512,t.flags|=2097152)}return Ee(t),null;case 6:if(e&&t.stateNode!=null)pu(e,t,e.memoizedProps,r);else{if(typeof r!="string"&&t.stateNode===null)throw Error(a(166));if(n=fn(Er.current),fn(Dt.current),Ti(t)){if(r=t.stateNode,n=t.memoizedProps,r[Ct]=t,(s=r.nodeValue!==n)&&(e=Ze,e!==null))switch(e.tag){case 3:bi(r.nodeValue,n,(e.mode&1)!==0);break;case 5:e.memoizedProps.suppressHydrationWarning!==!0&&bi(r.nodeValue,n,(e.mode&1)!==0)}s&&(t.flags|=4)}else r=(n.nodeType===9?n:n.ownerDocument).createTextNode(r),r[Ct]=t,t.stateNode=r}return Ee(t),null;case 13:if(le(ue),r=t.memoizedState,e===null||e.memoizedState!==null&&e.memoizedState.dehydrated!==null){if(ce&&Je!==null&&(t.mode&1)!==0&&(t.flags&128)===0)fc(),_n(),t.flags|=98560,s=!1;else if(s=Ti(t),r!==null&&r.dehydrated!==null){if(e===null){if(!s)throw Error(a(318));if(s=t.memoizedState,s=s!==null?s.dehydrated:null,!s)throw Error(a(317));s[Ct]=t}else _n(),(t.flags&128)===0&&(t.memoizedState=null),t.flags|=4;Ee(t),s=!1}else mt!==null&&(ll(mt),mt=null),s=!0;if(!s)return t.flags&65536?t:null}return(t.flags&128)!==0?(t.lanes=n,t):(r=r!==null,r!==(e!==null&&e.memoizedState!==null)&&r&&(t.child.flags|=8192,(t.mode&1)!==0&&(e===null||(ue.current&1)!==0?we===0&&(we=3):ul())),t.updateQueue!==null&&(t.flags|=4),Ee(t),null);case 4:return Vn(),Ya(e,t),e===null&&Cr(t.stateNode.containerInfo),Ee(t),null;case 10:return Da(t.type._context),Ee(t),null;case 17:return je(t.type)&&wi(),Ee(t),null;case 19:if(le(ue),s=t.memoizedState,s===null)return Ee(t),null;if(r=(t.flags&128)!==0,u=s.rendering,u===null)if(r)Nr(s,!1);else{if(we!==0||e!==null&&(e.flags&128)!==0)for(e=t.child;e!==null;){if(u=Ii(e),u!==null){for(t.flags|=128,Nr(s,!1),r=u.updateQueue,r!==null&&(t.updateQueue=r,t.flags|=4),t.subtreeFlags=0,r=n,n=t.child;n!==null;)s=n,e=r,s.flags&=14680066,u=s.alternate,u===null?(s.childLanes=0,s.lanes=e,s.child=null,s.subtreeFlags=0,s.memoizedProps=null,s.memoizedState=null,s.updateQueue=null,s.dependencies=null,s.stateNode=null):(s.childLanes=u.childLanes,s.lanes=u.lanes,s.child=u.child,s.subtreeFlags=0,s.deletions=null,s.memoizedProps=u.memoizedProps,s.memoizedState=u.memoizedState,s.updateQueue=u.updateQueue,s.type=u.type,e=u.dependencies,s.dependencies=e===null?null:{lanes:e.lanes,firstContext:e.firstContext}),n=n.sibling;return oe(ue,ue.current&1|2),t.child}e=e.sibling}s.tail!==null&&ge()>Qn&&(t.flags|=128,r=!0,Nr(s,!1),t.lanes=4194304)}else{if(!r)if(e=Ii(u),e!==null){if(t.flags|=128,r=!0,n=e.updateQueue,n!==null&&(t.updateQueue=n,t.flags|=4),Nr(s,!0),s.tail===null&&s.tailMode==="hidden"&&!u.alternate&&!ce)return Ee(t),null}else 2*ge()-s.renderingStartTime>Qn&&n!==1073741824&&(t.flags|=128,r=!0,Nr(s,!1),t.lanes=4194304);s.isBackwards?(u.sibling=t.child,t.child=u):(n=s.last,n!==null?n.sibling=u:t.child=u,s.last=u)}return s.tail!==null?(t=s.tail,s.rendering=t,s.tail=t.sibling,s.renderingStartTime=ge(),t.sibling=null,n=ue.current,oe(ue,r?n&1|2:n&1),t):(Ee(t),null);case 22:case 23:return cl(),r=t.memoizedState!==null,e!==null&&e.memoizedState!==null!==r&&(t.flags|=8192),r&&(t.mode&1)!==0?(Xe&1073741824)!==0&&(Ee(t),t.subtreeFlags&6&&(t.flags|=8192)):Ee(t),null;case 24:return null;case 25:return null}throw Error(a(156,t.tag))}function Qm(e,t){switch(ya(t),t.tag){case 1:return je(t.type)&&wi(),e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 3:return Vn(),le(We),le(Ae),Ia(),e=t.flags,(e&65536)!==0&&(e&128)===0?(t.flags=e&-65537|128,t):null;case 5:return La(t),null;case 13:if(le(ue),e=t.memoizedState,e!==null&&e.dehydrated!==null){if(t.alternate===null)throw Error(a(340));_n()}return e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 19:return le(ue),null;case 4:return Vn(),null;case 10:return Da(t.type._context),null;case 22:case 23:return cl(),null;case 24:return null;default:return null}}var _i=!1,Ie=!1,$m=typeof WeakSet=="function"?WeakSet:Set,I=null;function Gn(e,t){var n=e.ref;if(n!==null)if(typeof n=="function")try{n(null)}catch(r){me(e,t,r)}else n.current=null}function Za(e,t,n){try{n()}catch(r){me(e,t,r)}}var mu=!1;function Ym(e,t){if(ca=ai,e=qs(),ta(e)){if("selectionStart"in e)var n={start:e.selectionStart,end:e.selectionEnd};else e:{n=(n=e.ownerDocument)&&n.defaultView||window;var r=n.getSelection&&n.getSelection();if(r&&r.rangeCount!==0){n=r.anchorNode;var l=r.anchorOffset,s=r.focusNode;r=r.focusOffset;try{n.nodeType,s.nodeType}catch{n=null;break e}var u=0,m=-1,h=-1,S=0,D=0,T=e,k=null;t:for(;;){for(var E;T!==n||l!==0&&T.nodeType!==3||(m=u+l),T!==s||r!==0&&T.nodeType!==3||(h=u+r),T.nodeType===3&&(u+=T.nodeValue.length),(E=T.firstChild)!==null;)k=T,T=E;for(;;){if(T===e)break t;if(k===n&&++S===l&&(m=u),k===s&&++D===r&&(h=u),(E=T.nextSibling)!==null)break;T=k,k=T.parentNode}T=E}n=m===-1||h===-1?null:{start:m,end:h}}else n=null}n=n||{start:0,end:0}}else n=null;for(ua={focusedElem:e,selectionRange:n},ai=!1,I=t;I!==null;)if(t=I,e=t.child,(t.subtreeFlags&1028)!==0&&e!==null)e.return=t,I=e;else for(;I!==null;){t=I;try{var x=t.alternate;if((t.flags&1024)!==0)switch(t.tag){case 0:case 11:case 15:break;case 1:if(x!==null){var N=x.memoizedProps,be=x.memoizedState,b=t.stateNode,f=b.getSnapshotBeforeUpdate(t.elementType===t.type?N:ht(t.type,N),be);b.__reactInternalSnapshotBeforeUpdate=f}break;case 3:var y=t.stateNode.containerInfo;y.nodeType===1?y.textContent="":y.nodeType===9&&y.documentElement&&y.removeChild(y.documentElement);break;case 5:case 6:case 4:case 17:break;default:throw Error(a(163))}}catch(P){me(t,t.return,P)}if(e=t.sibling,e!==null){e.return=t.return,I=e;break}I=t.return}return x=mu,mu=!1,x}function Hr(e,t,n){var r=t.updateQueue;if(r=r!==null?r.lastEffect:null,r!==null){var l=r=r.next;do{if((l.tag&e)===e){var s=l.destroy;l.destroy=void 0,s!==void 0&&Za(t,n,s)}l=l.next}while(l!==r)}}function Wi(e,t){if(t=t.updateQueue,t=t!==null?t.lastEffect:null,t!==null){var n=t=t.next;do{if((n.tag&e)===e){var r=n.create;n.destroy=r()}n=n.next}while(n!==t)}}function Ja(e){var t=e.ref;if(t!==null){var n=e.stateNode;switch(e.tag){case 5:e=n;break;default:e=n}typeof t=="function"?t(e):t.current=e}}function hu(e){var t=e.alternate;t!==null&&(e.alternate=null,hu(t)),e.child=null,e.deletions=null,e.sibling=null,e.tag===5&&(t=e.stateNode,t!==null&&(delete t[Ct],delete t[Tr],delete t[ha],delete t[Fm],delete t[xm])),e.stateNode=null,e.return=null,e.dependencies=null,e.memoizedProps=null,e.memoizedState=null,e.pendingProps=null,e.stateNode=null,e.updateQueue=null}function fu(e){return e.tag===5||e.tag===3||e.tag===4}function gu(e){e:for(;;){for(;e.sibling===null;){if(e.return===null||fu(e.return))return null;e=e.return}for(e.sibling.return=e.return,e=e.sibling;e.tag!==5&&e.tag!==6&&e.tag!==18;){if(e.flags&2||e.child===null||e.tag===4)continue e;e.child.return=e,e=e.child}if(!(e.flags&2))return e.stateNode}}function Xa(e,t,n){var r=e.tag;if(r===5||r===6)e=e.stateNode,t?n.nodeType===8?n.parentNode.insertBefore(e,t):n.insertBefore(e,t):(n.nodeType===8?(t=n.parentNode,t.insertBefore(e,n)):(t=n,t.appendChild(e)),n=n._reactRootContainer,n!=null||t.onclick!==null||(t.onclick=yi));else if(r!==4&&(e=e.child,e!==null))for(Xa(e,t,n),e=e.sibling;e!==null;)Xa(e,t,n),e=e.sibling}function el(e,t,n){var r=e.tag;if(r===5||r===6)e=e.stateNode,t?n.insertBefore(e,t):n.appendChild(e);else if(r!==4&&(e=e.child,e!==null))for(el(e,t,n),e=e.sibling;e!==null;)el(e,t,n),e=e.sibling}var Te=null,ft=!1;function Zt(e,t,n){for(n=n.child;n!==null;)bu(e,t,n),n=n.sibling}function bu(e,t,n){if(kt&&typeof kt.onCommitFiberUnmount=="function")try{kt.onCommitFiberUnmount(ei,n)}catch{}switch(n.tag){case 5:Ie||Gn(n,t);case 6:var r=Te,l=ft;Te=null,Zt(e,t,n),Te=r,ft=l,Te!==null&&(ft?(e=Te,n=n.stateNode,e.nodeType===8?e.parentNode.removeChild(n):e.removeChild(n)):Te.removeChild(n.stateNode));break;case 18:Te!==null&&(ft?(e=Te,n=n.stateNode,e.nodeType===8?ma(e.parentNode,n):e.nodeType===1&&ma(e,n),hr(e)):ma(Te,n.stateNode));break;case 4:r=Te,l=ft,Te=n.stateNode.containerInfo,ft=!0,Zt(e,t,n),Te=r,ft=l;break;case 0:case 11:case 14:case 15:if(!Ie&&(r=n.updateQueue,r!==null&&(r=r.lastEffect,r!==null))){l=r=r.next;do{var s=l,u=s.destroy;s=s.tag,u!==void 0&&((s&2)!==0||(s&4)!==0)&&Za(n,t,u),l=l.next}while(l!==r)}Zt(e,t,n);break;case 1:if(!Ie&&(Gn(n,t),r=n.stateNode,typeof r.componentWillUnmount=="function"))try{r.props=n.memoizedProps,r.state=n.memoizedState,r.componentWillUnmount()}catch(m){me(n,t,m)}Zt(e,t,n);break;case 21:Zt(e,t,n);break;case 22:n.mode&1?(Ie=(r=Ie)||n.memoizedState!==null,Zt(e,t,n),Ie=r):Zt(e,t,n);break;default:Zt(e,t,n)}}function yu(e){var t=e.updateQueue;if(t!==null){e.updateQueue=null;var n=e.stateNode;n===null&&(n=e.stateNode=new $m),t.forEach(function(r){var l=oh.bind(null,e,r);n.has(r)||(n.add(r),r.then(l,l))})}}function gt(e,t){var n=t.deletions;if(n!==null)for(var r=0;r<n.length;r++){var l=n[r];try{var s=e,u=t,m=u;e:for(;m!==null;){switch(m.tag){case 5:Te=m.stateNode,ft=!1;break e;case 3:Te=m.stateNode.containerInfo,ft=!0;break e;case 4:Te=m.stateNode.containerInfo,ft=!0;break e}m=m.return}if(Te===null)throw Error(a(160));bu(s,u,l),Te=null,ft=!1;var h=l.alternate;h!==null&&(h.return=null),l.return=null}catch(S){me(l,t,S)}}if(t.subtreeFlags&12854)for(t=t.child;t!==null;)Su(t,e),t=t.sibling}function Su(e,t){var n=e.alternate,r=e.flags;switch(e.tag){case 0:case 11:case 14:case 15:if(gt(t,e),Pt(e),r&4){try{Hr(3,e,e.return),Wi(3,e)}catch(N){me(e,e.return,N)}try{Hr(5,e,e.return)}catch(N){me(e,e.return,N)}}break;case 1:gt(t,e),Pt(e),r&512&&n!==null&&Gn(n,n.return);break;case 5:if(gt(t,e),Pt(e),r&512&&n!==null&&Gn(n,n.return),e.flags&32){var l=e.stateNode;try{rr(l,"")}catch(N){me(e,e.return,N)}}if(r&4&&(l=e.stateNode,l!=null)){var s=e.memoizedProps,u=n!==null?n.memoizedProps:s,m=e.type,h=e.updateQueue;if(e.updateQueue=null,h!==null)try{m==="input"&&s.type==="radio"&&s.name!=null&&Kl(l,s),Io(m,u);var S=Io(m,s);for(u=0;u<h.length;u+=2){var D=h[u],T=h[u+1];D==="style"?ts(l,T):D==="dangerouslySetInnerHTML"?Xl(l,T):D==="children"?rr(l,T):st(l,D,T,S)}switch(m){case"input":Po(l,s);break;case"textarea":Yl(l,s);break;case"select":var k=l._wrapperState.wasMultiple;l._wrapperState.wasMultiple=!!s.multiple;var E=s.value;E!=null?Tn(l,!!s.multiple,E,!1):k!==!!s.multiple&&(s.defaultValue!=null?Tn(l,!!s.multiple,s.defaultValue,!0):Tn(l,!!s.multiple,s.multiple?[]:"",!1))}l[Tr]=s}catch(N){me(e,e.return,N)}}break;case 6:if(gt(t,e),Pt(e),r&4){if(e.stateNode===null)throw Error(a(162));l=e.stateNode,s=e.memoizedProps;try{l.nodeValue=s}catch(N){me(e,e.return,N)}}break;case 3:if(gt(t,e),Pt(e),r&4&&n!==null&&n.memoizedState.isDehydrated)try{hr(t.containerInfo)}catch(N){me(e,e.return,N)}break;case 4:gt(t,e),Pt(e);break;case 13:gt(t,e),Pt(e),l=e.child,l.flags&8192&&(s=l.memoizedState!==null,l.stateNode.isHidden=s,!s||l.alternate!==null&&l.alternate.memoizedState!==null||(rl=ge())),r&4&&yu(e);break;case 22:if(D=n!==null&&n.memoizedState!==null,e.mode&1?(Ie=(S=Ie)||D,gt(t,e),Ie=S):gt(t,e),Pt(e),r&8192){if(S=e.memoizedState!==null,(e.stateNode.isHidden=S)&&!D&&(e.mode&1)!==0)for(I=e,D=e.child;D!==null;){for(T=I=D;I!==null;){switch(k=I,E=k.child,k.tag){case 0:case 11:case 14:case 15:Hr(4,k,k.return);break;case 1:Gn(k,k.return);var x=k.stateNode;if(typeof x.componentWillUnmount=="function"){r=k,n=k.return;try{t=r,x.props=t.memoizedProps,x.state=t.memoizedState,x.componentWillUnmount()}catch(N){me(r,n,N)}}break;case 5:Gn(k,k.return);break;case 22:if(k.memoizedState!==null){ku(T);continue}}E!==null?(E.return=k,I=E):ku(T)}D=D.sibling}e:for(D=null,T=e;;){if(T.tag===5){if(D===null){D=T;try{l=T.stateNode,S?(s=l.style,typeof s.setProperty=="function"?s.setProperty("display","none","important"):s.display="none"):(m=T.stateNode,h=T.memoizedProps.style,u=h!=null&&h.hasOwnProperty("display")?h.display:null,m.style.display=es("display",u))}catch(N){me(e,e.return,N)}}}else if(T.tag===6){if(D===null)try{T.stateNode.nodeValue=S?"":T.memoizedProps}catch(N){me(e,e.return,N)}}else if((T.tag!==22&&T.tag!==23||T.memoizedState===null||T===e)&&T.child!==null){T.child.return=T,T=T.child;continue}if(T===e)break e;for(;T.sibling===null;){if(T.return===null||T.return===e)break e;D===T&&(D=null),T=T.return}D===T&&(D=null),T.sibling.return=T.return,T=T.sibling}}break;case 19:gt(t,e),Pt(e),r&4&&yu(e);break;case 21:break;default:gt(t,e),Pt(e)}}function Pt(e){var t=e.flags;if(t&2){try{e:{for(var n=e.return;n!==null;){if(fu(n)){var r=n;break e}n=n.return}throw Error(a(160))}switch(r.tag){case 5:var l=r.stateNode;r.flags&32&&(rr(l,""),r.flags&=-33);var s=gu(e);el(e,s,l);break;case 3:case 4:var u=r.stateNode.containerInfo,m=gu(e);Xa(e,m,u);break;default:throw Error(a(161))}}catch(h){me(e,e.return,h)}e.flags&=-3}t&4096&&(e.flags&=-4097)}function Zm(e,t,n){I=e,wu(e)}function wu(e,t,n){for(var r=(e.mode&1)!==0;I!==null;){var l=I,s=l.child;if(l.tag===22&&r){var u=l.memoizedState!==null||_i;if(!u){var m=l.alternate,h=m!==null&&m.memoizedState!==null||Ie;m=_i;var S=Ie;if(_i=u,(Ie=h)&&!S)for(I=l;I!==null;)u=I,h=u.child,u.tag===22&&u.memoizedState!==null?Cu(l):h!==null?(h.return=u,I=h):Cu(l);for(;s!==null;)I=s,wu(s),s=s.sibling;I=l,_i=m,Ie=S}vu(e)}else(l.subtreeFlags&8772)!==0&&s!==null?(s.return=l,I=s):vu(e)}}function vu(e){for(;I!==null;){var t=I;if((t.flags&8772)!==0){var n=t.alternate;try{if((t.flags&8772)!==0)switch(t.tag){case 0:case 11:case 15:Ie||Wi(5,t);break;case 1:var r=t.stateNode;if(t.flags&4&&!Ie)if(n===null)r.componentDidMount();else{var l=t.elementType===t.type?n.memoizedProps:ht(t.type,n.memoizedProps);r.componentDidUpdate(l,n.memoizedState,r.__reactInternalSnapshotBeforeUpdate)}var s=t.updateQueue;s!==null&&kc(t,s,r);break;case 3:var u=t.updateQueue;if(u!==null){if(n=null,t.child!==null)switch(t.child.tag){case 5:n=t.child.stateNode;break;case 1:n=t.child.stateNode}kc(t,u,n)}break;case 5:var m=t.stateNode;if(n===null&&t.flags&4){n=m;var h=t.memoizedProps;switch(t.type){case"button":case"input":case"select":case"textarea":h.autoFocus&&n.focus();break;case"img":h.src&&(n.src=h.src)}}break;case 6:break;case 4:break;case 12:break;case 13:if(t.memoizedState===null){var S=t.alternate;if(S!==null){var D=S.memoizedState;if(D!==null){var T=D.dehydrated;T!==null&&hr(T)}}}break;case 19:case 17:case 21:case 22:case 23:case 25:break;default:throw Error(a(163))}Ie||t.flags&512&&Ja(t)}catch(k){me(t,t.return,k)}}if(t===e){I=null;break}if(n=t.sibling,n!==null){n.return=t.return,I=n;break}I=t.return}}function ku(e){for(;I!==null;){var t=I;if(t===e){I=null;break}var n=t.sibling;if(n!==null){n.return=t.return,I=n;break}I=t.return}}function Cu(e){for(;I!==null;){var t=I;try{switch(t.tag){case 0:case 11:case 15:var n=t.return;try{Wi(4,t)}catch(h){me(t,n,h)}break;case 1:var r=t.stateNode;if(typeof r.componentDidMount=="function"){var l=t.return;try{r.componentDidMount()}catch(h){me(t,l,h)}}var s=t.return;try{Ja(t)}catch(h){me(t,s,h)}break;case 5:var u=t.return;try{Ja(t)}catch(h){me(t,u,h)}}}catch(h){me(t,t.return,h)}if(t===e){I=null;break}var m=t.sibling;if(m!==null){m.return=t.return,I=m;break}I=t.return}}var Jm=Math.ceil,ji=Re.ReactCurrentDispatcher,tl=Re.ReactCurrentOwner,ot=Re.ReactCurrentBatchConfig,Q=0,ke=null,ye=null,Pe=0,Xe=0,Kn=Gt(0),we=0,Ur=null,bn=0,zi=0,nl=0,Br=null,Ve=null,rl=0,Qn=1/0,Ht=null,Vi=!1,il=null,Jt=null,qi=!1,Xt=null,Gi=0,Or=0,ol=null,Ki=-1,Qi=0;function Me(){return(Q&6)!==0?ge():Ki!==-1?Ki:Ki=ge()}function en(e){return(e.mode&1)===0?1:(Q&2)!==0&&Pe!==0?Pe&-Pe:Nm.transition!==null?(Qi===0&&(Qi=gs()),Qi):(e=te,e!==0||(e=window.event,e=e===void 0?16:Ts(e.type)),e)}function bt(e,t,n,r){if(50<Or)throw Or=0,ol=null,Error(a(185));cr(e,n,r),((Q&2)===0||e!==ke)&&(e===ke&&((Q&2)===0&&(zi|=n),we===4&&tn(e,Pe)),qe(e,r),n===1&&Q===0&&(t.mode&1)===0&&(Qn=ge()+500,ki&&Qt()))}function qe(e,t){var n=e.callbackNode;Np(e,t);var r=ri(e,e===ke?Pe:0);if(r===0)n!==null&&ms(n),e.callbackNode=null,e.callbackPriority=0;else if(t=r&-r,e.callbackPriority!==t){if(n!=null&&ms(n),t===1)e.tag===0?Mm(Tu.bind(null,e)):uc(Tu.bind(null,e)),Em(function(){(Q&6)===0&&Qt()}),n=null;else{switch(bs(r)){case 1:n=Bo;break;case 4:n=hs;break;case 16:n=Xr;break;case 536870912:n=fs;break;default:n=Xr}n=xu(n,Du.bind(null,e))}e.callbackPriority=t,e.callbackNode=n}}function Du(e,t){if(Ki=-1,Qi=0,(Q&6)!==0)throw Error(a(327));var n=e.callbackNode;if($n()&&e.callbackNode!==n)return null;var r=ri(e,e===ke?Pe:0);if(r===0)return null;if((r&30)!==0||(r&e.expiredLanes)!==0||t)t=$i(e,r);else{t=r;var l=Q;Q|=2;var s=Ru();(ke!==e||Pe!==t)&&(Ht=null,Qn=ge()+500,Sn(e,t));do try{th();break}catch(m){Pu(e,m)}while(!0);Ca(),ji.current=s,Q=l,ye!==null?t=0:(ke=null,Pe=0,t=we)}if(t!==0){if(t===2&&(l=Oo(e),l!==0&&(r=l,t=al(e,l))),t===1)throw n=Ur,Sn(e,0),tn(e,r),qe(e,ge()),n;if(t===6)tn(e,r);else{if(l=e.current.alternate,(r&30)===0&&!Xm(l)&&(t=$i(e,r),t===2&&(s=Oo(e),s!==0&&(r=s,t=al(e,s))),t===1))throw n=Ur,Sn(e,0),tn(e,r),qe(e,ge()),n;switch(e.finishedWork=l,e.finishedLanes=r,t){case 0:case 1:throw Error(a(345));case 2:wn(e,Ve,Ht);break;case 3:if(tn(e,r),(r&130023424)===r&&(t=rl+500-ge(),10<t)){if(ri(e,0)!==0)break;if(l=e.suspendedLanes,(l&r)!==r){Me(),e.pingedLanes|=e.suspendedLanes&l;break}e.timeoutHandle=pa(wn.bind(null,e,Ve,Ht),t);break}wn(e,Ve,Ht);break;case 4:if(tn(e,r),(r&4194240)===r)break;for(t=e.eventTimes,l=-1;0<r;){var u=31-dt(r);s=1<<u,u=t[u],u>l&&(l=u),r&=~s}if(r=l,r=ge()-r,r=(120>r?120:480>r?480:1080>r?1080:1920>r?1920:3e3>r?3e3:4320>r?4320:1960*Jm(r/1960))-r,10<r){e.timeoutHandle=pa(wn.bind(null,e,Ve,Ht),r);break}wn(e,Ve,Ht);break;case 5:wn(e,Ve,Ht);break;default:throw Error(a(329))}}}return qe(e,ge()),e.callbackNode===n?Du.bind(null,e):null}function al(e,t){var n=Br;return e.current.memoizedState.isDehydrated&&(Sn(e,t).flags|=256),e=$i(e,t),e!==2&&(t=Ve,Ve=n,t!==null&&ll(t)),e}function ll(e){Ve===null?Ve=e:Ve.push.apply(Ve,e)}function Xm(e){for(var t=e;;){if(t.flags&16384){var n=t.updateQueue;if(n!==null&&(n=n.stores,n!==null))for(var r=0;r<n.length;r++){var l=n[r],s=l.getSnapshot;l=l.value;try{if(!pt(s(),l))return!1}catch{return!1}}}if(n=t.child,t.subtreeFlags&16384&&n!==null)n.return=t,t=n;else{if(t===e)break;for(;t.sibling===null;){if(t.return===null||t.return===e)return!0;t=t.return}t.sibling.return=t.return,t=t.sibling}}return!0}function tn(e,t){for(t&=~nl,t&=~zi,e.suspendedLanes|=t,e.pingedLanes&=~t,e=e.expirationTimes;0<t;){var n=31-dt(t),r=1<<n;e[n]=-1,t&=~r}}function Tu(e){if((Q&6)!==0)throw Error(a(327));$n();var t=ri(e,0);if((t&1)===0)return qe(e,ge()),null;var n=$i(e,t);if(e.tag!==0&&n===2){var r=Oo(e);r!==0&&(t=r,n=al(e,r))}if(n===1)throw n=Ur,Sn(e,0),tn(e,t),qe(e,ge()),n;if(n===6)throw Error(a(345));return e.finishedWork=e.current.alternate,e.finishedLanes=t,wn(e,Ve,Ht),qe(e,ge()),null}function sl(e,t){var n=Q;Q|=1;try{return e(t)}finally{Q=n,Q===0&&(Qn=ge()+500,ki&&Qt())}}function yn(e){Xt!==null&&Xt.tag===0&&(Q&6)===0&&$n();var t=Q;Q|=1;var n=ot.transition,r=te;try{if(ot.transition=null,te=1,e)return e()}finally{te=r,ot.transition=n,Q=t,(Q&6)===0&&Qt()}}function cl(){Xe=Kn.current,le(Kn)}function Sn(e,t){e.finishedWork=null,e.finishedLanes=0;var n=e.timeoutHandle;if(n!==-1&&(e.timeoutHandle=-1,Lm(n)),ye!==null)for(n=ye.return;n!==null;){var r=n;switch(ya(r),r.tag){case 1:r=r.type.childContextTypes,r!=null&&wi();break;case 3:Vn(),le(We),le(Ae),Ia();break;case 5:La(r);break;case 4:Vn();break;case 13:le(ue);break;case 19:le(ue);break;case 10:Da(r.type._context);break;case 22:case 23:cl()}n=n.return}if(ke=e,ye=e=nn(e.current,null),Pe=Xe=t,we=0,Ur=null,nl=zi=bn=0,Ve=Br=null,hn!==null){for(t=0;t<hn.length;t++)if(n=hn[t],r=n.interleaved,r!==null){n.interleaved=null;var l=r.next,s=n.pending;if(s!==null){var u=s.next;s.next=l,r.next=u}n.pending=r}hn=null}return e}function Pu(e,t){do{var n=ye;try{if(Ca(),Fi.current=Hi,xi){for(var r=de.memoizedState;r!==null;){var l=r.queue;l!==null&&(l.pending=null),r=r.next}xi=!1}if(gn=0,ve=Se=de=null,Ir=!1,Fr=0,tl.current=null,n===null||n.return===null){we=1,Ur=t,ye=null;break}e:{var s=e,u=n.return,m=n,h=t;if(t=Pe,m.flags|=32768,h!==null&&typeof h=="object"&&typeof h.then=="function"){var S=h,D=m,T=D.tag;if((D.mode&1)===0&&(T===0||T===11||T===15)){var k=D.alternate;k?(D.updateQueue=k.updateQueue,D.memoizedState=k.memoizedState,D.lanes=k.lanes):(D.updateQueue=null,D.memoizedState=null)}var E=Zc(u);if(E!==null){E.flags&=-257,Jc(E,u,m,s,t),E.mode&1&&Yc(s,S,t),t=E,h=S;var x=t.updateQueue;if(x===null){var N=new Set;N.add(h),t.updateQueue=N}else x.add(h);break e}else{if((t&1)===0){Yc(s,S,t),ul();break e}h=Error(a(426))}}else if(ce&&m.mode&1){var be=Zc(u);if(be!==null){(be.flags&65536)===0&&(be.flags|=256),Jc(be,u,m,s,t),va(qn(h,m));break e}}s=h=qn(h,m),we!==4&&(we=2),Br===null?Br=[s]:Br.push(s),s=u;do{switch(s.tag){case 3:s.flags|=65536,t&=-t,s.lanes|=t;var b=Qc(s,h,t);vc(s,b);break e;case 1:m=h;var f=s.type,y=s.stateNode;if((s.flags&128)===0&&(typeof f.getDerivedStateFromError=="function"||y!==null&&typeof y.componentDidCatch=="function"&&(Jt===null||!Jt.has(y)))){s.flags|=65536,t&=-t,s.lanes|=t;var P=$c(s,m,t);vc(s,P);break e}}s=s.return}while(s!==null)}Lu(n)}catch(H){t=H,ye===n&&n!==null&&(ye=n=n.return);continue}break}while(!0)}function Ru(){var e=ji.current;return ji.current=Hi,e===null?Hi:e}function ul(){(we===0||we===3||we===2)&&(we=4),ke===null||(bn&268435455)===0&&(zi&268435455)===0||tn(ke,Pe)}function $i(e,t){var n=Q;Q|=2;var r=Ru();(ke!==e||Pe!==t)&&(Ht=null,Sn(e,t));do try{eh();break}catch(l){Pu(e,l)}while(!0);if(Ca(),Q=n,ji.current=r,ye!==null)throw Error(a(261));return ke=null,Pe=0,we}function eh(){for(;ye!==null;)Au(ye)}function th(){for(;ye!==null&&!Pp();)Au(ye)}function Au(e){var t=Fu(e.alternate,e,Xe);e.memoizedProps=e.pendingProps,t===null?Lu(e):ye=t,tl.current=null}function Lu(e){var t=e;do{var n=t.alternate;if(e=t.return,(t.flags&32768)===0){if(n=Km(n,t,Xe),n!==null){ye=n;return}}else{if(n=Qm(n,t),n!==null){n.flags&=32767,ye=n;return}if(e!==null)e.flags|=32768,e.subtreeFlags=0,e.deletions=null;else{we=6,ye=null;return}}if(t=t.sibling,t!==null){ye=t;return}ye=t=e}while(t!==null);we===0&&(we=5)}function wn(e,t,n){var r=te,l=ot.transition;try{ot.transition=null,te=1,nh(e,t,n,r)}finally{ot.transition=l,te=r}return null}function nh(e,t,n,r){do $n();while(Xt!==null);if((Q&6)!==0)throw Error(a(327));n=e.finishedWork;var l=e.finishedLanes;if(n===null)return null;if(e.finishedWork=null,e.finishedLanes=0,n===e.current)throw Error(a(177));e.callbackNode=null,e.callbackPriority=0;var s=n.lanes|n.childLanes;if(Hp(e,s),e===ke&&(ye=ke=null,Pe=0),(n.subtreeFlags&2064)===0&&(n.flags&2064)===0||qi||(qi=!0,xu(Xr,function(){return $n(),null})),s=(n.flags&15990)!==0,(n.subtreeFlags&15990)!==0||s){s=ot.transition,ot.transition=null;var u=te;te=1;var m=Q;Q|=4,tl.current=null,Ym(e,n),Su(n,e),km(ua),ai=!!ca,ua=ca=null,e.current=n,Zm(n),Rp(),Q=m,te=u,ot.transition=s}else e.current=n;if(qi&&(qi=!1,Xt=e,Gi=l),s=e.pendingLanes,s===0&&(Jt=null),Ep(n.stateNode),qe(e,ge()),t!==null)for(r=e.onRecoverableError,n=0;n<t.length;n++)l=t[n],r(l.value,{componentStack:l.stack,digest:l.digest});if(Vi)throw Vi=!1,e=il,il=null,e;return(Gi&1)!==0&&e.tag!==0&&$n(),s=e.pendingLanes,(s&1)!==0?e===ol?Or++:(Or=0,ol=e):Or=0,Qt(),null}function $n(){if(Xt!==null){var e=bs(Gi),t=ot.transition,n=te;try{if(ot.transition=null,te=16>e?16:e,Xt===null)var r=!1;else{if(e=Xt,Xt=null,Gi=0,(Q&6)!==0)throw Error(a(331));var l=Q;for(Q|=4,I=e.current;I!==null;){var s=I,u=s.child;if((I.flags&16)!==0){var m=s.deletions;if(m!==null){for(var h=0;h<m.length;h++){var S=m[h];for(I=S;I!==null;){var D=I;switch(D.tag){case 0:case 11:case 15:Hr(8,D,s)}var T=D.child;if(T!==null)T.return=D,I=T;else for(;I!==null;){D=I;var k=D.sibling,E=D.return;if(hu(D),D===S){I=null;break}if(k!==null){k.return=E,I=k;break}I=E}}}var x=s.alternate;if(x!==null){var N=x.child;if(N!==null){x.child=null;do{var be=N.sibling;N.sibling=null,N=be}while(N!==null)}}I=s}}if((s.subtreeFlags&2064)!==0&&u!==null)u.return=s,I=u;else e:for(;I!==null;){if(s=I,(s.flags&2048)!==0)switch(s.tag){case 0:case 11:case 15:Hr(9,s,s.return)}var b=s.sibling;if(b!==null){b.return=s.return,I=b;break e}I=s.return}}var f=e.current;for(I=f;I!==null;){u=I;var y=u.child;if((u.subtreeFlags&2064)!==0&&y!==null)y.return=u,I=y;else e:for(u=f;I!==null;){if(m=I,(m.flags&2048)!==0)try{switch(m.tag){case 0:case 11:case 15:Wi(9,m)}}catch(H){me(m,m.return,H)}if(m===u){I=null;break e}var P=m.sibling;if(P!==null){P.return=m.return,I=P;break e}I=m.return}}if(Q=l,Qt(),kt&&typeof kt.onPostCommitFiberRoot=="function")try{kt.onPostCommitFiberRoot(ei,e)}catch{}r=!0}return r}finally{te=n,ot.transition=t}}return!1}function Eu(e,t,n){t=qn(n,t),t=Qc(e,t,1),e=Yt(e,t,1),t=Me(),e!==null&&(cr(e,1,t),qe(e,t))}function me(e,t,n){if(e.tag===3)Eu(e,e,n);else for(;t!==null;){if(t.tag===3){Eu(t,e,n);break}else if(t.tag===1){var r=t.stateNode;if(typeof t.type.getDerivedStateFromError=="function"||typeof r.componentDidCatch=="function"&&(Jt===null||!Jt.has(r))){e=qn(n,e),e=$c(t,e,1),t=Yt(t,e,1),e=Me(),t!==null&&(cr(t,1,e),qe(t,e));break}}t=t.return}}function rh(e,t,n){var r=e.pingCache;r!==null&&r.delete(t),t=Me(),e.pingedLanes|=e.suspendedLanes&n,ke===e&&(Pe&n)===n&&(we===4||we===3&&(Pe&130023424)===Pe&&500>ge()-rl?Sn(e,0):nl|=n),qe(e,t)}function Iu(e,t){t===0&&((e.mode&1)===0?t=1:(t=ni,ni<<=1,(ni&130023424)===0&&(ni=4194304)));var n=Me();e=xt(e,t),e!==null&&(cr(e,t,n),qe(e,n))}function ih(e){var t=e.memoizedState,n=0;t!==null&&(n=t.retryLane),Iu(e,n)}function oh(e,t){var n=0;switch(e.tag){case 13:var r=e.stateNode,l=e.memoizedState;l!==null&&(n=l.retryLane);break;case 19:r=e.stateNode;break;default:throw Error(a(314))}r!==null&&r.delete(t),Iu(e,n)}var Fu;Fu=function(e,t,n){if(e!==null)if(e.memoizedProps!==t.pendingProps||We.current)ze=!0;else{if((e.lanes&n)===0&&(t.flags&128)===0)return ze=!1,Gm(e,t,n);ze=(e.flags&131072)!==0}else ze=!1,ce&&(t.flags&1048576)!==0&&dc(t,Di,t.index);switch(t.lanes=0,t.tag){case 2:var r=t.type;Oi(e,t),e=t.pendingProps;var l=Un(t,Ae.current);zn(t,n),l=Ma(null,t,r,e,l,n);var s=Na();return t.flags|=1,typeof l=="object"&&l!==null&&typeof l.render=="function"&&l.$$typeof===void 0?(t.tag=1,t.memoizedState=null,t.updateQueue=null,je(r)?(s=!0,vi(t)):s=!1,t.memoizedState=l.state!==null&&l.state!==void 0?l.state:null,Ra(t),l.updater=Ui,t.stateNode=l,l._reactInternals=t,Wa(t,r,e,n),t=qa(null,t,r,!0,s,n)):(t.tag=0,ce&&s&&ba(t),xe(null,t,l,n),t=t.child),t;case 16:r=t.elementType;e:{switch(Oi(e,t),e=t.pendingProps,l=r._init,r=l(r._payload),t.type=r,l=t.tag=lh(r),e=ht(r,e),l){case 0:t=Va(null,t,r,e,n);break e;case 1:t=iu(null,t,r,e,n);break e;case 11:t=Xc(null,t,r,e,n);break e;case 14:t=eu(null,t,r,ht(r.type,e),n);break e}throw Error(a(306,r,""))}return t;case 0:return r=t.type,l=t.pendingProps,l=t.elementType===r?l:ht(r,l),Va(e,t,r,l,n);case 1:return r=t.type,l=t.pendingProps,l=t.elementType===r?l:ht(r,l),iu(e,t,r,l,n);case 3:e:{if(ou(t),e===null)throw Error(a(387));r=t.pendingProps,s=t.memoizedState,l=s.element,wc(e,t),Ei(t,r,null,n);var u=t.memoizedState;if(r=u.element,s.isDehydrated)if(s={element:r,isDehydrated:!1,cache:u.cache,pendingSuspenseBoundaries:u.pendingSuspenseBoundaries,transitions:u.transitions},t.updateQueue.baseState=s,t.memoizedState=s,t.flags&256){l=qn(Error(a(423)),t),t=au(e,t,r,n,l);break e}else if(r!==l){l=qn(Error(a(424)),t),t=au(e,t,r,n,l);break e}else for(Je=qt(t.stateNode.containerInfo.firstChild),Ze=t,ce=!0,mt=null,n=yc(t,null,r,n),t.child=n;n;)n.flags=n.flags&-3|4096,n=n.sibling;else{if(_n(),r===l){t=Nt(e,t,n);break e}xe(e,t,r,n)}t=t.child}return t;case 5:return Cc(t),e===null&&wa(t),r=t.type,l=t.pendingProps,s=e!==null?e.memoizedProps:null,u=l.children,da(r,l)?u=null:s!==null&&da(r,s)&&(t.flags|=32),ru(e,t),xe(e,t,u,n),t.child;case 6:return e===null&&wa(t),null;case 13:return lu(e,t,n);case 4:return Aa(t,t.stateNode.containerInfo),r=t.pendingProps,e===null?t.child=Wn(t,null,r,n):xe(e,t,r,n),t.child;case 11:return r=t.type,l=t.pendingProps,l=t.elementType===r?l:ht(r,l),Xc(e,t,r,l,n);case 7:return xe(e,t,t.pendingProps,n),t.child;case 8:return xe(e,t,t.pendingProps.children,n),t.child;case 12:return xe(e,t,t.pendingProps.children,n),t.child;case 10:e:{if(r=t.type._context,l=t.pendingProps,s=t.memoizedProps,u=l.value,oe(Ri,r._currentValue),r._currentValue=u,s!==null)if(pt(s.value,u)){if(s.children===l.children&&!We.current){t=Nt(e,t,n);break e}}else for(s=t.child,s!==null&&(s.return=t);s!==null;){var m=s.dependencies;if(m!==null){u=s.child;for(var h=m.firstContext;h!==null;){if(h.context===r){if(s.tag===1){h=Mt(-1,n&-n),h.tag=2;var S=s.updateQueue;if(S!==null){S=S.shared;var D=S.pending;D===null?h.next=h:(h.next=D.next,D.next=h),S.pending=h}}s.lanes|=n,h=s.alternate,h!==null&&(h.lanes|=n),Ta(s.return,n,t),m.lanes|=n;break}h=h.next}}else if(s.tag===10)u=s.type===t.type?null:s.child;else if(s.tag===18){if(u=s.return,u===null)throw Error(a(341));u.lanes|=n,m=u.alternate,m!==null&&(m.lanes|=n),Ta(u,n,t),u=s.sibling}else u=s.child;if(u!==null)u.return=s;else for(u=s;u!==null;){if(u===t){u=null;break}if(s=u.sibling,s!==null){s.return=u.return,u=s;break}u=u.return}s=u}xe(e,t,l.children,n),t=t.child}return t;case 9:return l=t.type,r=t.pendingProps.children,zn(t,n),l=rt(l),r=r(l),t.flags|=1,xe(e,t,r,n),t.child;case 14:return r=t.type,l=ht(r,t.pendingProps),l=ht(r.type,l),eu(e,t,r,l,n);case 15:return tu(e,t,t.type,t.pendingProps,n);case 17:return r=t.type,l=t.pendingProps,l=t.elementType===r?l:ht(r,l),Oi(e,t),t.tag=1,je(r)?(e=!0,vi(t)):e=!1,zn(t,n),Gc(t,r,l),Wa(t,r,l,n),qa(null,t,r,!0,e,n);case 19:return cu(e,t,n);case 22:return nu(e,t,n)}throw Error(a(156,t.tag))};function xu(e,t){return ps(e,t)}function ah(e,t,n,r){this.tag=e,this.key=n,this.sibling=this.child=this.return=this.stateNode=this.type=this.elementType=null,this.index=0,this.ref=null,this.pendingProps=t,this.dependencies=this.memoizedState=this.updateQueue=this.memoizedProps=null,this.mode=r,this.subtreeFlags=this.flags=0,this.deletions=null,this.childLanes=this.lanes=0,this.alternate=null}function at(e,t,n,r){return new ah(e,t,n,r)}function dl(e){return e=e.prototype,!(!e||!e.isReactComponent)}function lh(e){if(typeof e=="function")return dl(e)?1:0;if(e!=null){if(e=e.$$typeof,e===wt)return 11;if(e===vt)return 14}return 2}function nn(e,t){var n=e.alternate;return n===null?(n=at(e.tag,t,e.key,e.mode),n.elementType=e.elementType,n.type=e.type,n.stateNode=e.stateNode,n.alternate=e,e.alternate=n):(n.pendingProps=t,n.type=e.type,n.flags=0,n.subtreeFlags=0,n.deletions=null),n.flags=e.flags&14680064,n.childLanes=e.childLanes,n.lanes=e.lanes,n.child=e.child,n.memoizedProps=e.memoizedProps,n.memoizedState=e.memoizedState,n.updateQueue=e.updateQueue,t=e.dependencies,n.dependencies=t===null?null:{lanes:t.lanes,firstContext:t.firstContext},n.sibling=e.sibling,n.index=e.index,n.ref=e.ref,n}function Yi(e,t,n,r,l,s){var u=2;if(r=e,typeof e=="function")dl(e)&&(u=1);else if(typeof e=="string")u=5;else e:switch(e){case Oe:return vn(n.children,l,s,t);case et:u=8,l|=8;break;case Bt:return e=at(12,n,t,l|2),e.elementType=Bt,e.lanes=s,e;case Qe:return e=at(13,n,t,l),e.elementType=Qe,e.lanes=s,e;case ut:return e=at(19,n,t,l),e.elementType=ut,e.lanes=s,e;case pe:return Zi(n,l,s,t);default:if(typeof e=="object"&&e!==null)switch(e.$$typeof){case At:u=10;break e;case sn:u=9;break e;case wt:u=11;break e;case vt:u=14;break e;case _e:u=16,r=null;break e}throw Error(a(130,e==null?e:typeof e,""))}return t=at(u,n,t,l),t.elementType=e,t.type=r,t.lanes=s,t}function vn(e,t,n,r){return e=at(7,e,r,t),e.lanes=n,e}function Zi(e,t,n,r){return e=at(22,e,r,t),e.elementType=pe,e.lanes=n,e.stateNode={isHidden:!1},e}function pl(e,t,n){return e=at(6,e,null,t),e.lanes=n,e}function ml(e,t,n){return t=at(4,e.children!==null?e.children:[],e.key,t),t.lanes=n,t.stateNode={containerInfo:e.containerInfo,pendingChildren:null,implementation:e.implementation},t}function sh(e,t,n,r,l){this.tag=t,this.containerInfo=e,this.finishedWork=this.pingCache=this.current=this.pendingChildren=null,this.timeoutHandle=-1,this.callbackNode=this.pendingContext=this.context=null,this.callbackPriority=0,this.eventTimes=_o(0),this.expirationTimes=_o(-1),this.entangledLanes=this.finishedLanes=this.mutableReadLanes=this.expiredLanes=this.pingedLanes=this.suspendedLanes=this.pendingLanes=0,this.entanglements=_o(0),this.identifierPrefix=r,this.onRecoverableError=l,this.mutableSourceEagerHydrationData=null}function hl(e,t,n,r,l,s,u,m,h){return e=new sh(e,t,n,m,h),t===1?(t=1,s===!0&&(t|=8)):t=0,s=at(3,null,null,t),e.current=s,s.stateNode=e,s.memoizedState={element:r,isDehydrated:n,cache:null,transitions:null,pendingSuspenseBoundaries:null},Ra(s),e}function ch(e,t,n){var r=3<arguments.length&&arguments[3]!==void 0?arguments[3]:null;return{$$typeof:Fe,key:r==null?null:""+r,children:e,containerInfo:t,implementation:n}}function Mu(e){if(!e)return Kt;e=e._reactInternals;e:{if(cn(e)!==e||e.tag!==1)throw Error(a(170));var t=e;do{switch(t.tag){case 3:t=t.stateNode.context;break e;case 1:if(je(t.type)){t=t.stateNode.__reactInternalMemoizedMergedChildContext;break e}}t=t.return}while(t!==null);throw Error(a(171))}if(e.tag===1){var n=e.type;if(je(n))return sc(e,n,t)}return t}function Nu(e,t,n,r,l,s,u,m,h){return e=hl(n,r,!0,e,l,s,u,m,h),e.context=Mu(null),n=e.current,r=Me(),l=en(n),s=Mt(r,l),s.callback=t??null,Yt(n,s,l),e.current.lanes=l,cr(e,l,r),qe(e,r),e}function Ji(e,t,n,r){var l=t.current,s=Me(),u=en(l);return n=Mu(n),t.context===null?t.context=n:t.pendingContext=n,t=Mt(s,u),t.payload={element:e},r=r===void 0?null:r,r!==null&&(t.callback=r),e=Yt(l,t,u),e!==null&&(bt(e,l,u,s),Li(e,l,u)),u}function Xi(e){if(e=e.current,!e.child)return null;switch(e.child.tag){case 5:return e.child.stateNode;default:return e.child.stateNode}}function Hu(e,t){if(e=e.memoizedState,e!==null&&e.dehydrated!==null){var n=e.retryLane;e.retryLane=n!==0&&n<t?n:t}}function fl(e,t){Hu(e,t),(e=e.alternate)&&Hu(e,t)}function uh(){return null}var Uu=typeof reportError=="function"?reportError:function(e){console.error(e)};function gl(e){this._internalRoot=e}eo.prototype.render=gl.prototype.render=function(e){var t=this._internalRoot;if(t===null)throw Error(a(409));Ji(e,t,null,null)},eo.prototype.unmount=gl.prototype.unmount=function(){var e=this._internalRoot;if(e!==null){this._internalRoot=null;var t=e.containerInfo;yn(function(){Ji(null,e,null,null)}),t[Lt]=null}};function eo(e){this._internalRoot=e}eo.prototype.unstable_scheduleHydration=function(e){if(e){var t=ws();e={blockedOn:null,target:e,priority:t};for(var n=0;n<jt.length&&t!==0&&t<jt[n].priority;n++);jt.splice(n,0,e),n===0&&Cs(e)}};function bl(e){return!(!e||e.nodeType!==1&&e.nodeType!==9&&e.nodeType!==11)}function to(e){return!(!e||e.nodeType!==1&&e.nodeType!==9&&e.nodeType!==11&&(e.nodeType!==8||e.nodeValue!==" react-mount-point-unstable "))}function Bu(){}function dh(e,t,n,r,l){if(l){if(typeof r=="function"){var s=r;r=function(){var S=Xi(u);s.call(S)}}var u=Nu(t,r,e,0,null,!1,!1,"",Bu);return e._reactRootContainer=u,e[Lt]=u.current,Cr(e.nodeType===8?e.parentNode:e),yn(),u}for(;l=e.lastChild;)e.removeChild(l);if(typeof r=="function"){var m=r;r=function(){var S=Xi(h);m.call(S)}}var h=hl(e,0,!1,null,null,!1,!1,"",Bu);return e._reactRootContainer=h,e[Lt]=h.current,Cr(e.nodeType===8?e.parentNode:e),yn(function(){Ji(t,h,n,r)}),h}function no(e,t,n,r,l){var s=n._reactRootContainer;if(s){var u=s;if(typeof l=="function"){var m=l;l=function(){var h=Xi(u);m.call(h)}}Ji(t,u,e,l)}else u=dh(n,t,e,l,r);return Xi(u)}ys=function(e){switch(e.tag){case 3:var t=e.stateNode;if(t.current.memoizedState.isDehydrated){var n=sr(t.pendingLanes);n!==0&&(Wo(t,n|1),qe(t,ge()),(Q&6)===0&&(Qn=ge()+500,Qt()))}break;case 13:yn(function(){var r=xt(e,1);if(r!==null){var l=Me();bt(r,e,1,l)}}),fl(e,1)}},jo=function(e){if(e.tag===13){var t=xt(e,134217728);if(t!==null){var n=Me();bt(t,e,134217728,n)}fl(e,134217728)}},Ss=function(e){if(e.tag===13){var t=en(e),n=xt(e,t);if(n!==null){var r=Me();bt(n,e,t,r)}fl(e,t)}},ws=function(){return te},vs=function(e,t){var n=te;try{return te=e,t()}finally{te=n}},Mo=function(e,t,n){switch(t){case"input":if(Po(e,n),t=n.name,n.type==="radio"&&t!=null){for(n=e;n.parentNode;)n=n.parentNode;for(n=n.querySelectorAll("input[name="+JSON.stringify(""+t)+'][type="radio"]'),t=0;t<n.length;t++){var r=n[t];if(r!==e&&r.form===e.form){var l=Si(r);if(!l)throw Error(a(90));ql(r),Po(r,l)}}}break;case"textarea":Yl(e,n);break;case"select":t=n.value,t!=null&&Tn(e,!!n.multiple,t,!1)}},os=sl,as=yn;var ph={usingClientEntryPoint:!1,Events:[Pr,Nn,Si,rs,is,sl]},_r={findFiberByHostInstance:un,bundleType:0,version:"18.3.1",rendererPackageName:"react-dom"},mh={bundleType:_r.bundleType,version:_r.version,rendererPackageName:_r.rendererPackageName,rendererConfig:_r.rendererConfig,overrideHookState:null,overrideHookStateDeletePath:null,overrideHookStateRenamePath:null,overrideProps:null,overridePropsDeletePath:null,overridePropsRenamePath:null,setErrorHandler:null,setSuspenseHandler:null,scheduleUpdate:null,currentDispatcherRef:Re.ReactCurrentDispatcher,findHostInstanceByFiber:function(e){return e=us(e),e===null?null:e.stateNode},findFiberByHostInstance:_r.findFiberByHostInstance||uh,findHostInstancesForRefresh:null,scheduleRefresh:null,scheduleRoot:null,setRefreshHandler:null,getCurrentFiber:null,reconcilerVersion:"18.3.1-next-f1338f8080-20240426"};if(typeof __REACT_DEVTOOLS_GLOBAL_HOOK__<"u"){var ro=__REACT_DEVTOOLS_GLOBAL_HOOK__;if(!ro.isDisabled&&ro.supportsFiber)try{ei=ro.inject(mh),kt=ro}catch{}}return Ge.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED=ph,Ge.createPortal=function(e,t){var n=2<arguments.length&&arguments[2]!==void 0?arguments[2]:null;if(!bl(t))throw Error(a(200));return ch(e,t,null,n)},Ge.createRoot=function(e,t){if(!bl(e))throw Error(a(299));var n=!1,r="",l=Uu;return t!=null&&(t.unstable_strictMode===!0&&(n=!0),t.identifierPrefix!==void 0&&(r=t.identifierPrefix),t.onRecoverableError!==void 0&&(l=t.onRecoverableError)),t=hl(e,1,!1,null,null,n,!1,r,l),e[Lt]=t.current,Cr(e.nodeType===8?e.parentNode:e),new gl(t)},Ge.findDOMNode=function(e){if(e==null)return null;if(e.nodeType===1)return e;var t=e._reactInternals;if(t===void 0)throw typeof e.render=="function"?Error(a(188)):(e=Object.keys(e).join(","),Error(a(268,e)));return e=us(t),e=e===null?null:e.stateNode,e},Ge.flushSync=function(e){return yn(e)},Ge.hydrate=function(e,t,n){if(!to(t))throw Error(a(200));return no(null,e,t,!0,n)},Ge.hydrateRoot=function(e,t,n){if(!bl(e))throw Error(a(405));var r=n!=null&&n.hydratedSources||null,l=!1,s="",u=Uu;if(n!=null&&(n.unstable_strictMode===!0&&(l=!0),n.identifierPrefix!==void 0&&(s=n.identifierPrefix),n.onRecoverableError!==void 0&&(u=n.onRecoverableError)),t=Nu(t,null,e,1,n??null,l,!1,s,u),e[Lt]=t.current,Cr(e),r)for(e=0;e<r.length;e++)n=r[e],l=n._getVersion,l=l(n._source),t.mutableSourceEagerHydrationData==null?t.mutableSourceEagerHydrationData=[n,l]:t.mutableSourceEagerHydrationData.push(n,l);return new eo(t)},Ge.render=function(e,t,n){if(!to(t))throw Error(a(200));return no(null,e,t,!1,n)},Ge.unmountComponentAtNode=function(e){if(!to(e))throw Error(a(40));return e._reactRootContainer?(yn(function(){no(null,null,e,!1,function(){e._reactRootContainer=null,e[Lt]=null})}),!0):!1},Ge.unstable_batchedUpdates=sl,Ge.unstable_renderSubtreeIntoContainer=function(e,t,n,r){if(!to(n))throw Error(a(200));if(e==null||e._reactInternals===void 0)throw Error(a(38));return no(e,t,n,!1,r)},Ge.version="18.3.1-next-f1338f8080-20240426",Ge}var Gu;function Dh(){if(Gu)return wl.exports;Gu=1;function o(){if(!(typeof __REACT_DEVTOOLS_GLOBAL_HOOK__>"u"||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!="function"))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(o)}catch(i){console.error(i)}}return o(),wl.exports=Ch(),wl.exports}var Ku;function Th(){if(Ku)return io;Ku=1;var o=Dh();return io.createRoot=o.createRoot,io.hydrateRoot=o.hydrateRoot,io}var Ph=Th();const Rh=Sd(Ph),Ah="modulepreload",Lh=function(o){return"/"+o},Qu={},Ut=function(i,a,c){let d=Promise.resolve();if(a&&a.length>0){let w=function(U){return Promise.all(U.map(M=>Promise.resolve(M).then(B=>({status:"fulfilled",value:B}),B=>({status:"rejected",reason:B}))))};document.getElementsByTagName("link");const v=document.querySelector("meta[property=csp-nonce]"),R=(v==null?void 0:v.nonce)||(v==null?void 0:v.getAttribute("nonce"));d=w(a.map(U=>{if(U=Lh(U),U in Qu)return;Qu[U]=!0;const M=U.endsWith(".css"),B=M?'[rel="stylesheet"]':"";if(document.querySelector(`link[href="${U}"]${B}`))return;const V=document.createElement("link");if(V.rel=M?"stylesheet":Ah,M||(V.as="script"),V.crossOrigin="",V.href=U,R&&V.setAttribute("nonce",R),document.head.appendChild(V),M)return new Promise((X,fe)=>{V.addEventListener("load",X),V.addEventListener("error",()=>fe(new Error(`Unable to preload CSS for ${U}`)))})}))}function p(w){const v=new Event("vite:preloadError",{cancelable:!0});if(v.payload=w,window.dispatchEvent(v),!v.defaultPrevented)throw w}return d.then(w=>{for(const v of w||[])v.status==="rejected"&&p(v.reason);return i().catch(p)})};var Ne=xl();const Eh=Sd(Ne),qb=bh({__proto__:null,default:Eh},[Ne]),Ih={common:{appName:"CodingNS",loading:"Loading...",retry:"Retry",back:"Back",save:"Save",connectionRouteRelay:"CodingNS Connect",connectionRouteLan:"LAN Direct",connectionRouteLoopback:"Local Direct",connectionRouteTailscale:"Tailscale Direct",connectionRouteDirect:"Direct Connection",logout:"Log out",unknown:"Unknown session",close:"Close",cancel:"Cancel",language:"Language"},auth:{loginTitle:"Resume your coding session",loginSubtitle:"INITIALIZING DEVELOPMENT ENVIRONMENT...",serverPreset:"Server Preset",serverCustomOption:"Use custom server",serverAddress:"Server Address",serverPlaceholder:"For example: http://127.0.0.1:3002",serverHint:"Login, realtime messages, and terminals all connect through this host. Point the client at the Host API endpoint such as http://127.0.0.1:3002; frontend dev ports like 4174 or 5173 are not meant for packaged clients and only work for temporary debugging when proxying and CORS are configured correctly.",serverInvalid:"Invalid server address. Check it and try again.",serverDiscoveredTag:"Auto-discovered",serverCurrent:"Current Server",bootstrapTitle:"Complete the first-time bootstrap",bootstrapSubtitle:"This Host does not have an admin account yet. Create the minimal login entry first.",username:"Username",password:"Password",rememberPassword:"Remember Password",confirmPassword:"Confirm Password",submitLogin:"Enter Workspace",submitBootstrap:"Create Admin Account",bootstrapSuccess:"Bootstrap completed. You can log in now.",bootstrapMismatch:"The two passwords do not match.",authUnavailable:"Host is unreachable right now. Check the server and try again.",logoutSuccess:"The current login state has been cleared.",demoBanner:"Demo environment — all account data is public and cleared on logout",demoSessionExpired:"Demo session expired. Please log in again.",captcha:"Captcha",captchaPlaceholder:"Enter the characters in the image",captchaHint:"After three failed attempts, complete the captcha before trying again.",captchaImageAlt:"Login captcha image",serverSettings:"Server Settings",serverSettingsTitle:"Server Configuration",saveServerSettings:"Save Settings",relayEntryTitle:"Connecting To Remote Host",relayEntryDescription:"Switching to this Host's trusted remote entry. You will be returned to the login page automatically.",relayEntryInvalid:"The remote access entry parameters are incomplete. Open the access URL again.",trustedEntryOnlyTitle:"Open This Through Your Remote Access URL",trustedEntryOnlyDescription:"This trusted frontend only loads the connection UI. It is not the Host API entry itself. Open the device's remote access URL again.",trustedEntryOnlyHintTitle:"How to enter",trustedEntryOnlyHint:"Use a remote access URL like https://xxxx.channel.codingns.com:1443. The tunnel domain will redirect you to the correct trusted entry automatically."},settings:{title:"Settings",appearance:"Appearance",appearanceSectionSummary:"Language, theme, and interface colors",language:"Language",languageDescription:"Choose the display language used by the interface.",theme:"Theme",themeDescription:"Choose the color theme that fits the way you work.",autoTheme:"Follow system theme automatically",autoThemeDescription:"When enabled, switch between day and night mode based on the system or browser color scheme.",fileManager:"File Manager",workspaceSessionSortMode:"Workspace session sort order",workspaceSessionSortModeDescription:"Controls the default sort order for session lists across the workspace. This setting only applies to the current device.",sessionSortModeCreatedAt:"By session created time",sessionSortModeUpdatedAt:"By session updated time",sessionSortModeTitle:"By session name",showSystemFiles:"Show system files",showSystemFilesDescription:"Display common macOS and Windows system files in the file manager, such as .DS_Store and Thumbs.db. This setting only applies to the current device.",serverConnection:"Server Connection",serverConnectionSectionSummary:"Server address and reconnection behavior",remoteAccess:"Remote Access",remoteAccessSectionSummary:"Connect to this Host from outside through CodingNS Connect or Tailscale.",remoteAccessNavValue:"CodingNS Connect / Tailscale",remoteAccessManageTitle:"Remote Access",remoteAccessManageDescription:"Choose and configure how external devices connect to this Host.",remoteAccessManageAction:"Manage Remote Access",remoteAccessModalTitle:"Access Method Management",remoteAccessModalDescription:"Choose and configure the remote access method you want to use.",remoteAccessTabsLabel:"Remote access method tabs",remoteAccessTunnelTab:"CodingNS Connect",remoteAccessTailscaleTab:"Tailscale Access",remoteAccessFeatureDisabledValue:"Off",abilityManagement:"Capability Management",abilityManagementSectionSummary:"Manage which CLI providers stay available and switch model profile presets from one place.",abilityManagementNavValue:"Providers / Profiles",modelManagement:"Model Management",modelManagementSectionSummary:"Read cc-switch presets and quickly switch models for Codex, Claude Code, Gemini, and OpenCode.",modelManagementNavValue:"Quick switch",modelManagementSectionTitle:"Model Profile Management",providerManagement:"CLI Providers",providerManagementSectionSummary:"Control which CLIs appear in session, fork, assistant, and Skill entry points.",providerManagementNavValue:"Availability",providerManagementDescription:"Control which CLIs this Host is allowed to expose. Open the dialog to review the matrix, status, and enable switches.",providerManagementManageAction:"Manage CLI Providers",providerManagementModalTitle:"CLI Provider Management",providerManagementModalDescription:"Review what each CLI can do in the product, its current state, and whether it stays visible.",providerManagementRefresh:"Refresh list",providerManagementRefreshSuccess:"CLI provider list refreshed.",providerManagementLoading:"Loading available CLI providers...",providerManagementEmpty:"No CLI providers are available to manage yet.",providerManagementEmptyDescription:"This list will appear automatically once the Host reports available CLI providers.",providerManagementLoginRequired:"Sign in before managing CLI providers.",providerManagementLoadFailed:"Failed to load the CLI provider list.",providerManagementSaveFailed:"Failed to save the CLI provider status.",providerManagementSummaryTitle:"Provider Overview",providerManagementSummaryDescription:"Check the totals first, then decide which CLI should stay enabled.",providerManagementSummaryEnabled:"Enabled",providerManagementSummaryDisabled:"Disabled",providerManagementSummaryTotal:"Total",providerManagementMatrixTitle:"Capability Matrix",providerManagementMatrixDescription:"Rows are CLI providers and columns are product capabilities. Turning a provider off hides it across related entry points.",providerManagementTableProvider:"CLI Provider",providerManagementTableStatus:"Status",providerManagementTableEnabled:"Enabled",providerManagementStatusEnabled:"Enabled",providerManagementStatusDisabled:"Disabled",providerManagementInstallReady:"Installed",providerManagementInstallMissing:"Not detected",providerManagementInstallUnknown:"Unknown",providerManagementStateEnabled:"This CLI is currently shown in new session, fork, assistant, and Skill-related entry points.",providerManagementStateDisabled:"This CLI is hidden from new entry points, and its old sessions are also hidden from normal lists.",providerManagementStateMissing:"This CLI is allowed, but the local runtime is not ready yet, so it cannot be used until installation is complete.",providerManagementToggleLabel:"Toggle {provider}",providerManagementEnableSuccess:"{provider} has been enabled again.",providerManagementDisableSuccess:"{provider} has been disabled.",providerManagementCapabilityStreaming:"Streaming output",providerManagementCapabilityToolCalls:"Tool calls",providerManagementCapabilityAssistant:"Assistant service",providerManagementCapabilityFork:"Session fork",providerManagementCapabilitySkill:"Skill usage",providerManagementCapabilityAvailable:"Available",providerManagementCapabilityUnavailable:"Unavailable",providerManagementImpactSessionStart:"new session start",providerManagementImpactFork:"session fork",providerManagementImpactAssistant:"assistant follow-up",providerManagementImpactSkill:"new Skill targets",providerManagementImpactEnabled:"If you turn it off now, old sessions will be hidden and {actions} will be blocked.",providerManagementImpactDisabled:"It is currently blocking {actions}; once re-enabled, those entry points will show up again.",providerManagementImpactEnabledFallback:"If you turn it off now, this CLI will disappear from new entry points across the product.",providerManagementImpactDisabledFallback:"Once re-enabled, this CLI will return to the normal entry points across the product.",modelManagementTitle:"Quick Model Switching",modelManagementDescription:"This page does not add or edit presets. It only exposes the presets already managed by cc-switch so you can switch quickly.",modelManagementRefresh:"Refresh Models",modelManagementRefreshSuccess:"Model presets refreshed.",modelManagementLoadFailed:"Failed to load model presets.",modelManagementScannedAt:"Last Scanned",modelManagementScannedAtUnknown:"Not scanned yet",modelManagementCurrentProfile:"Current Profile",modelManagementCurrentModel:"Current Model",modelManagementCurrentPreset:"Current Preset",modelManagementModelUnknown:"Unknown",modelManagementPresetMissing:"Not set",modelManagementCurrentTag:"Current",modelManagementOpenSwitcher:"Switch Profile",modelManagementModalTitle:"Provider Profile Switching",modelManagementModalDescription:"Review the existing cc-switch profiles by app and switch the active one here.",modelManagementTabsLabel:"Model app tabs",modelManagementSwitchAction:"Switch",modelManagementSwitchSuccess:"{app} switched to {preset}.",modelManagementOptionsEmpty:"No switchable presets were found.",modelManagementStatusReady:"Ready",modelManagementStatusUnconfigured:"Unconfigured",modelManagementStatusUnavailable:"cc-switch-cli missing",modelManagementStatusError:"Read failed",skills:"Skills",skillsSectionSummary:"Read and sync the local skills owned by each CLI. No marketplace and no remote catalog in this phase.",skillsNavValue:"Local sync",skillManagerTitle:"Local Skill Management",skillManagerDescription:"Read the local skill folders used by Codex, Claude Code, Gemini, and OpenCode, then import unmanaged entries or sync them again.",skillSummaryManagedSkills:"My Skills",skillSummaryManagedEntries:"Active",skillSummaryUnmanagedEntries:"Unmanaged folders",skillSummaryConflictedEntries:"Needs Attention",skillSummaryAssistantRuntimeEntries:"Assistant-only",skillSummaryDiagnostics:"Notices",skillManageAction:"Skill Settings",skillConfigModalTitle:"Skill Settings",skillConfigModalDescription:"Review your skills, built-in assistant skills, and anything that needs your attention.",skillCreateAction:"Add Skill",skillCreateModalTitle:"Add Skill",skillCreateModalDescription:"Bring a new SKILL.md under management. File upload and pasted markdown share the same validation and import flow.",skillCreateSourceTabsLabel:"Add Method",skillCreateSourceFile:"Choose File",skillCreateSourcePaste:"Paste Text",skillCreateSubmitAction:"Add",skillRefresh:"Refresh",skillRefreshSuccess:"Skill list refreshed.",skillScannedAt:"Last Scanned",skillUploadSectionTitle:"Upload Skill",skillUploadSectionDescription:"Choose a SKILL.md file, decide whether it belongs to the workspace or the assistant runtime, then let the app validate, fix, and manage it.",skillUploadPickAction:"Choose SKILL.md",skillUploadSubmitAction:"Upload & Manage",skillUploadEmpty:"No SKILL.md file has been selected yet.",skillUploadPickedFile:"Selected File",skillUploadScopeLabel:"Scope",skillUploadScopeWorkspace:"Workspace Skill",skillUploadScopeAssistant:"Assistant Skill",skillUploadDirectoryLabel:"Directory Name",skillUploadDirectoryPlaceholder:"For example: team-helper",skillUploadDirectoryHint:"Used for the managed folder name and sync target folder. It is generated from the file name or heading by default, so you usually do not need to change it.",skillUploadDirectoryInvalid:"The directory name is invalid. Only letters, numbers, dots, underscores, and dashes are allowed.",skillUploadTargetsLabel:"Target CLI",skillPasteLabel:"Paste SKILL Content",skillPastePlaceholder:"Paste the full SKILL.md content here",skillPasteEmpty:"There is no SKILL content ready to manage yet.",skillUploadDirectoryRequiredNote:"The file name does not produce a valid directory name, so you need to fill one in manually.",skillUploadTargetRequired:"Select at least one target CLI.",skillUploadHeadingNote:"The markdown does not contain a level-one heading. One will be added automatically during import.",skillUploadNormalizedNote:"Whitespace and line endings were normalized for upload.",skillUploadReadFailed:"Failed to read the uploaded SKILL.md file.",skillUploadContentEmpty:"The uploaded SKILL.md file cannot be empty.",skillUploadSuccess:"{name} was added.",skillManagedListTitle:"My Skills",skillManagedEmpty:"You have not added any skills yet.",skillManagedItemDescription:"Added to {targets}.",skillManagedItemNoTarget:"This skill has not been applied to any client yet.",skillUnmanagedListTitle:"Skills to Add",skillUnmanagedEmpty:"There are no new skills to add right now.",skillUnmanagedItemDescription:"Found in {target}. You can add it to your list.",skillUnmanagedItemDisabledDescription:"Found in {target}, but that target is disabled right now, so it cannot be added again yet.",skillAssistantRuntimeListTitle:"Built-in Assistant Skills",skillAssistantRuntimeListDescription:"These skills are provided by the system and only used by the assistant.",skillAssistantRuntimeEmpty:"There are no built-in assistant skills right now.",skillAssistantRuntimeItemDescription:"This is a built-in skill. You do not need to manage it yourself.",skillAssistantRuntimeUsedBy:"Available In",skillAssistantRuntimeSourcePath:"Built-in Source Path",skillConflictedListTitle:"Needs Attention",skillConflictedEmpty:"There is nothing to fix right now.",skillConflictedItemDescription:"This item in {target} needs attention.",skillConflictedItemDisabledDescription:"This item still exists in {target}, but that target is disabled right now.",skillDiagnosticsTitle:"Notices",skillDiagnosticsEmpty:"There are no new notices right now.",skillDiagnosticTargetMissingTitle:"{target} Is Not Ready Yet",skillDiagnosticTargetMissingDetail:"The skill folder for {target} was not found yet.",skillDiagnosticReadFailedTitle:"{target} Is Temporarily Unavailable",skillDiagnosticReadFailedDetail:"The skill information for {target} cannot be read right now. Try again later.",skillDiagnosticSyncMissingTitle:"{target} Needs To Be Applied Again",skillDiagnosticSyncMissingDetail:"Some skills have not taken effect in {target} yet.",skillDiagnosticGenericTitle:"{target} Needs Attention",skillDiagnosticGenericDetail:"Something is not ready yet. Refresh and check again later.",skillDirectoryName:"Directory Name",skillSsotPath:"SSOT Path",skillSourceCli:"Source CLI",skillDirectoryPath:"Directory Path",skillImportAction:"Add",skillImportSuccess:"{name} was added and applied to {target}.",skillSyncAction:"Apply Again",skillSyncSuccess:"{name} was applied again.",skillSyncTargetMissing:"This skill has no target yet, so it cannot be applied again.",skillSyncTargetDisabled:"This skill currently only points at disabled targets. Re-enable a provider before applying it again.",skillLoadFailed:"Failed to load the skill overview.",skillTargetCodex:"Codex",skillTargetClaudeCode:"Claude Code",skillTargetGemini:"Gemini",skillTargetOpenCode:"OpenCode",skillBindingPending:"Preparing",skillBindingSynced:"Available",skillBindingFailed:"Unavailable",skillBindingConflicted:"Needs Attention",skillUploadTargetDisabled:"All available Skill targets are disabled right now. Re-enable a provider in settings first.",skillTargetDisabledTag:"Disabled",skillTagAssistantOnly:"Assistant Only",securityPrivacy:"Security & Privacy",securityPrivacySectionSummary:"Session permissions, risk boundaries, and default approval policy",softwareUpdate:"Software Update",softwareUpdateSectionSummary:"Server and client versions",serverAddress:"Server Address",serverDescription:"Login, API requests, and realtime connections all use this Host entry, while the frontend UI is bundled inside the client itself.",serverRelayTunnelProfileTitle:"CodingNS Connect Entry For This Host",serverRelayTunnelProfileDescription:"Attach a CodingNS Connect entry to the saved Host profile. When enabled, the client connects through the CodingNS Connect domain and control site with end-to-end encryption instead of calling this address directly.",serverRelayTunnelEnabled:"Connect Through CodingNS Connect",serverRelayTunnelUsageHint:"The server address should usually stay as this Host's public entry, for example https://demo.codingns.example .",serverRelayTunnelDomain:"CodingNS Connect Domain",serverRelayTunnelDomainPlaceholder:"For example: demo.codingns.example",serverRelayTunnelControlBaseUrl:"Control Site URL",serverRelayTunnelControlBaseUrlPlaceholder:"For example: https://control.codingns.example",relayTunnelServerAddressDescription:"The official CodingNS Connect address is used by default. If you know the current control site address, you can override it in advanced settings.",relayTunnelServerAddressHint:"This only changes the CodingNS Connect control site used for login, binding, and traffic queries. It does not change the current Host's local API address.",relayTunnelStatus:"CodingNS Connect Status",relayTunnelDescription:"Use CodingNS Connect to let external devices reach this Host securely.",relayTunnelMasterSwitchLabel:"Enable CodingNS Connect",relayTunnelActivationHint:"Turn this on before checking CodingNS Connect status or allowing this Host to accept external access.",relayTunnelPhase:"Current State",relayTunnelDomain:"Access Address",relayTunnelUnbound:"Not bound yet",relayTunnelTrafficRemaining:"Remaining Traffic",relayTunnelHostFingerprint:"Host Fingerprint",relayTunnelTrustBoundaryNotice:"CodingNS Connect only forwards encrypted traffic and cannot read the content between the client and this Host.",relayTunnelRecentError:"Recent error: {message}",relayTunnelAccessTitle:"Connection Settings",relayTunnelAccessDescription:"Sign in with your CodingNS Connect account first, then turn the switch on to bring this device online for external access.",relayTunnelLearnService:"Learn About CodingNS Connect",relayTunnelWizardTitle:"Remote Access Wizard",relayTunnelWizardDescription:"Finish account login, host label confirmation, and CodingNS Connect startup in three steps. After that, the panel stays focused on the actual remote access info.",relayTunnelStatusErrorTitle:"Remote access status is unavailable right now",relayTunnelStatusNetworkError:"The client cannot reach this Host right now ({address}), so the remote access status may be outdated. Check the server address, port, and network connection first.",relayTunnelStepPending:"Pending",relayTunnelStepCurrent:"In Progress",relayTunnelStepDone:"Done",relayTunnelStepLocked:"Finish the previous step first.",relayTunnelStepLoginTitle:"Log In",relayTunnelStepLoginDescription:"Connect your CodingNS Connect account first. Host label checks and traffic queries both depend on it.",relayTunnelStepLoginConnected:"The account is already connected. Continue to the next step.",relayTunnelStepHostLabelTitle:"Set Host Label",relayTunnelStepHostLabelDescription:"Choose the fourth-level domain prefix you will use later and verify that it is available now.",relayTunnelStepStartTitle:"Start CodingNS Connect",relayTunnelStepStartDescription:"After the first two steps are ready, bring the current Host online through CodingNS Connect.",relayTunnelStepStartReady:"The host label is confirmed. You can start CodingNS Connect now.",relayTunnelStartAction:"Start CodingNS Connect",relayTunnelLoginErrorTitle:"Failed to log in to CodingNS Connect",relayTunnelAdvancedSettings:"Advanced Settings",relayTunnelAdvancedSettingsHide:"Hide Advanced Settings",relayTunnelAdvancedSettingsDescription:"The official CodingNS Connect address is used by default. Only override it when you know the exact control site address.",relayTunnelLoginNetworkError:"The login request never reached this Host because it is unavailable right now ({address}). Check the server address and network connection, then try again.",relayTunnelReadyTitle:"Remote Access Is Ready",relayTunnelReadyDescription:"The setup is complete. This view now keeps only the access URL, traffic info, and maintenance actions.",relayTunnelAccessUrlLabel:"Remote Access URL",relayTunnelCopyAccessUrl:"Copy URL",relayTunnelOpenAccessUrl:"Open Page",relayTunnelAccessUrlCopied:"The access URL has been copied.",relayTunnelCopyAccessUrlFailed:"Failed to copy the access URL.",relayTunnelOpenAccessUrlFailed:"Failed to open the access URL.",relayTunnelClientRouteLabel:"Current Client Route",relayTunnelClientRouteAddressLabel:"Current Client Address",relayTunnelClientRouteHintRelay:"The client is still using CodingNS Connect for this Host. If a reachable local address is confirmed, it will switch to a lower-traffic direct route automatically.",relayTunnelClientRouteHintRelayProbing:"The client is checking local direct addresses now. When the check finishes, it will switch to the lower-traffic route automatically.",relayTunnelClientRouteHintLan:"The client has already switched to a LAN direct route, which uses less traffic. The remote access URL can still be used on external devices.",relayTunnelClientRouteHintLoopback:"The client is connecting to this device through its local address, without going through CodingNS Connect.",relayTunnelClientRouteHintTailscale:"The client has already switched to a Tailscale address, without going through CodingNS Connect.",relayTunnelClientRouteHintDirect:"The client is requesting this Host address directly, without going through CodingNS Connect.",relayTunnelReconnectAction:"Reconnect",relayTunnelManageAccountAction:"Manage Account",relayTunnelDisconnectDeviceAction:"Sign Out Device",relayTunnelEnableToggleLabel:"Enable CodingNS Connect",relayTunnelConfigTitle:"CodingNS Connect Site Configuration",relayTunnelConfigDescription:"Configure the CodingNS Connect endpoint and control site here. Login, binding, and traffic operations below all use these addresses.",relayTunnelConfigErrorTitle:"Failed to save the CodingNS Connect site address",relayTunnelConfigNetworkError:"The new tunnel site address has not been saved to this Host because it is unavailable right now ({address}). Check the server address and network connection first.",relayTunnelRelayBaseUrl:"CodingNS Connect Endpoint URL",relayTunnelControlBaseUrl:"Control Site URL",relayTunnelSaveConfig:"Save Configuration",relayTunnelRefresh:"Refresh Status",relayTunnelAccountTitle:"CodingNS Connect Account",relayTunnelAccountDescription:"Sign in with your CodingNS Connect account to bind this Host and review the remaining traffic quota.",relayTunnelAccountEmail:"Email",relayTunnelAccountEmailPlaceholder:"Enter your email",relayTunnelAccountPassword:"Password",relayTunnelAccountPasswordPlaceholder:"Enter your password",relayTunnelLoginAccount:"Log In",relayTunnelLoggedInAs:"Logged in as: {email}",relayTunnelConnectedBannerTitle:"Account Connected",relayTunnelConnectedBannerDescription:"You can now turn on CodingNS Connect so external devices can reach this Host.",relayTunnelConnectedBannerActiveTitle:"CodingNS Connect Is On",relayTunnelConnectedBannerActiveDescription:"This device is now reachable from outside through CodingNS Connect.",relayTunnelConnectedDevice:"Current device: {name}",relayTunnelBoundDomain:"Current access address: {domain}",relayTunnelBindTitle:"Bind Current Host",relayTunnelBindDescription:"Binding first reads the current Host long-term public key, then registers this machine on CodingNS Connect.",relayTunnelHostLabelTitle:"Device Name",relayTunnelHostLabelDescription:"After you sign in, enter the fourth-level domain prefix you plan to use later and check whether that name is currently available.",relayTunnelHostLabel:"Host Label",relayTunnelHostLabelPlaceholder:"Enter the prefix",relayTunnelHostLabelSuffix:".channel.codingns.com",relayTunnelHostLabelCheck:"Check Name",relayTunnelHostLabelChecking:"Checking whether this name is available.",relayTunnelHostLabelAvailable:"This name is available. The public access address will be {domain}",relayTunnelHostLabelReserved:"This name hits a reserved prefix. Choose a different name.",relayTunnelHostLabelOccupied:"This name is already taken. Choose a different name.",relayTunnelHostLabelUnavailable:"The name cannot be verified right now. Try again later.",relayTunnelHostLabelRequired:"Enter a device name first.",relayTunnelBindAction:"Login And Bind Host",relayTunnelActionsTitle:"CodingNS Connect Controls",relayTunnelActionsDescription:"After binding, you can enable, disable, or unbind CodingNS Connect here.",relayTunnelEnable:"Enable CodingNS Connect",relayTunnelDisable:"Disable CodingNS Connect",relayTunnelUnbind:"Disconnect This Device",relayTunnelWalletTitle:"Traffic Wallet",relayTunnelWalletDescription:"This shows the total traffic granted, traffic used, and remaining quota recorded by the control site.",relayTunnelTrafficGranted:"Granted Traffic",relayTunnelTrafficUsed:"Used Traffic",relayTunnelPackagesTitle:"Traffic Packages",relayTunnelPackagesDescription:"Selecting a package opens the official checkout page. After payment succeeds, the quota is granted to the current account automatically.",relayTunnelFeaturedPackage:"Featured",relayTunnelBuyPackage:"Buy Traffic",relayTunnelOrdersTitle:"Recent Orders",relayTunnelOrdersDescription:"Only the most recent orders are shown here so you can confirm payment and quota status quickly.",relayTunnelOrderPending:"Pending",relayTunnelOrderPaid:"Paid",relayTunnelOrderExpired:"Expired",relayTunnelOrderFailed:"Failed",relayTunnelControlBaseUrlRequired:"Fill in the control site URL first.",relayTunnelAccountRequired:"Enter the CodingNS Connect account email and password first.",relayTunnelIdentityUnavailable:"The current Host identity key is not ready yet. Try again later.",relayTunnelLoadFailed:"Failed to load the CodingNS Connect status.",relayTunnelPhaseDisabled:"Disabled",relayTunnelPhaseBlockedUninitialized:"Blocked Until Bootstrap Finishes",relayTunnelPhaseUnbound:"Not Bound",relayTunnelPhaseBinding:"Binding",relayTunnelPhaseConnecting:"Connecting",relayTunnelPhaseRunning:"Running",relayTunnelPhaseQuotaExhausted:"Quota Exhausted",relayTunnelPhaseError:"Error",tailscaleBrand:"Tailscale",tailscaleSectionTitle:"Tailscale Access",tailscaleSectionDescription:"Let this Host stay reachable across your devices with Tailscale.",tailscaleMasterSwitchLabel:"Enable Tailscale",tailscaleActivationHint:"Turn this on before checking Tailscale status or continuing with setup and account binding.",tailscaleCurrentState:"Current State",tailscaleSwitchLabel:"Enabled",tailscaleStatusIndicator:"Status",tailscaleServerAddress:"Server Address",tailscaleAccountName:"Account",tailscaleIpAddress:"IP Address",tailscaleConfigure:"Configure",tailscaleConfigModalTitle:"Configure Tailscale",tailscaleConfigModalDescription:"Edit connectivity settings",tailscaleControlServer:"Control Server",tailscaleControlServerDescription:"Leave empty to use the default control server.",tailscaleControlServerPlaceholder:"Leave empty to use the default control server",tailscaleHostname:"Hostname",tailscaleHostnameDescription:"Optional.",tailscaleHostnamePlaceholder:"For example: codingns-host",tailscaleReachableBaseUrl:"Reachable Base URL",tailscaleTailnetFqdn:"Tailnet FQDN",tailscaleTailnetIpv4:"Tailnet IPv4",tailscaleTailnetIpv6:"Tailnet IPv6",tailscaleDetailAddresses:"Detailed Addresses",tailscaleRefresh:"Refresh",tailscaleInstallAction:"Install Tailscale",tailscaleInstallOpenFailed:"Failed to open the Tailscale install page.",tailscaleEnable:"Enable Tailscale",tailscaleDisable:"Disable Tailscale",tailscaleLogin:"Bind Account",tailscaleLogout:"Unbind Account",tailscaleUnavailable:"Unavailable",tailscaleLoadFailed:"Failed to load Tailscale status.",tailscalePhaseDisabled:"Disabled",tailscalePhaseBlockedUninitialized:"Blocked until bootstrap finishes",tailscalePhaseStarting:"Starting",tailscalePhaseNeedsLogin:"Waiting for login",tailscalePhaseRunning:"Running",tailscalePhaseStopping:"Stopping",tailscalePhaseError:"Error",tailscaleOverviewDisabled:"Remote access is not enabled yet.",tailscaleOverviewBlockedUninitialized:"Finish bootstrap before enabling remote access.",tailscaleOverviewStarting:"Connecting to Tailscale. Please wait.",tailscaleOverviewNeedsLogin:"Tailscale is enabled, but account binding is still required.",tailscaleOverviewRunning:"This instance is reachable through Tailscale now.",tailscaleOverviewStopping:"Remote access is being turned off.",tailscaleOverviewError:"Remote access hit an error. Refresh or reconfigure it first.",releaseChannel:"Release Channel",releaseChannelDescription:"Stable or beta",releaseStable:"Stable",releaseBeta:"Beta",autoReconnect:"Auto Reconnect",autoReconnectDescription:"Retry HTTP and WebSocket links automatically when Host is briefly unavailable.",autoCheckUpdate:"Auto Check Client Updates",autoCheckUpdateDescription:"Clients only",defaultPermissionMode:"Default Session Permissions",defaultPermissionModeDescription:"Controls the default tool permissions for new and resumed sessions. Full access disables approval prompts and should only be used for trusted projects and environments.",authDeviceManagement:"Login Devices",authDeviceManagementDescription:"View the current device, other active devices, and the latest 10 login records, and sign out specific active devices one by one from a primary device.",authDeviceEntryHint:"Open device management to view the current device, other active devices, and recent login records in a dialog.",authDeviceOpenManager:"Manage Devices",authDeviceCurrentTitle:"Current Device",authDeviceOthersTitle:"Other Active Devices",authDeviceRecentTitle:"Recent Login Records",authDeviceCurrentTag:"Current",authDevicePrimaryTag:"Primary",authDeviceLegacyTag:"Legacy",authDeviceLegacyHiddenHint:"Detected {count} compatibility records from legacy sessions. They are hidden by default.",authDeviceLegacyReveal:"Show Compatibility Records",authDeviceLegacyHide:"Hide Compatibility Records",authDeviceLegacyDevicesTitle:"Legacy Active Records",authDeviceLegacyRecentTitle:"Legacy Login Records",authDeviceLegacyLabel:"Unknown Device (Legacy Session)",authDeviceClientDesktop:"Desktop",authDeviceClientWeb:"Web",authDeviceClientIos:"iOS",authDeviceClientAndroid:"Android",authDeviceClientUnknown:"Unknown Device",authDeviceCurrentEmpty:"The current session does not have identifiable device metadata yet. Please sign in again.",authDeviceOthersEmpty:"There are no other active devices.",authDeviceRecentEmpty:"There are no recent login records yet.",authDeviceBrowserValue:"Browser: {value}",authDeviceOsValue:"OS: {value}",authDeviceLastSeen:"Last seen: {value}",authDeviceLoginAt:"Login time: {value}",authDeviceSourceAddressValue:"Source address: {value}",authDeviceSourceAddressUnknown:"Source address: unknown",authDeviceEnablePrimary:"Set as Primary",authDeviceDisablePrimary:"Remove Primary",authDevicePrimaryUnavailable:"The current session does not have a stable device identity yet, so it cannot become a primary device.",authDeviceLogoutOthers:"Sign Out Other Devices",authDeviceLogoutDevice:"Sign Out Device",authDevicePrimaryEnabled:"The current device is now a primary device.",authDevicePrimaryDisabled:"The current device is no longer a primary device.",authDeviceLogoutOthersSuccess:"Signed out other devices. Processed {count}.",authDeviceLogoutDeviceSuccess:'Signed out device "{device}". Processed {count} session(s).',authDeviceLoadFailed:"Failed to load login device information.",authDeviceEnablePrimaryModalTitle:"Set as Primary Device",authDeviceEnablePrimaryModalDescription:"Enter the admin password to confirm that the current device should become a primary device.",authDeviceDisablePrimaryModalTitle:"Remove Primary Device",authDeviceDisablePrimaryModalDescription:"Enter the admin password to confirm that the current device should no longer be a primary device.",authDevicePasswordLabel:"Admin password",permissionModeDefault:"Follow CLI defaults",permissionModeAcceptEdits:"Allow workspace edits without asking",permissionModeBypassPermissions:"Full access without asking",enabled:"Enabled",disabled:"Disabled",serverUpdate:"Server Update",serverUpdateDescription:"",clientUpdate:"Client Update",clientUpdateDescription:"",serverCurrentVersion:"Server Current Version",serverTargetVersion:"Server Target Version",serverPackageName:"npm Package",serverUpdateCommand:"Upgrade Command",serverCheckNow:"Check Server",serverOpenPage:"Open npm",serverLatestUnknown:"Unavailable",serverUpdateReady:"New version found",serverUpToDate:"Up to date",serverCheckFailed:"Check failed",serverInstallWarning:"Installing the update will restart the CodingNS service through PM2 and briefly interrupt the connection.",serverInstallConfirmTitle:"Install Server Update",serverInstallConfirmDescription:"Continuing will install the new version first, then let PM2 restart the current CodingNS service automatically.",serverInstallConfirmAction:"Install And Restart",serverRestarting:"Update installed. Restarting the CodingNS service",serverOpenPageFailed:"Failed to open page",releaseCurrentVersion:"Current Version",releaseTargetVersion:"Target Version",releaseTargetTag:"Target Tag",releasePublishedAt:"Published At",releaseUnknownVersion:"Unknown",releaseNotes:"What's New",releaseNotesEmpty:"No details",releaseCheckNow:"Check Client",releaseInstallNow:"Install",releaseOpenPage:"Open Release",releaseRollback:"Rollback",releaseUpdateBadge:"Update",releaseUpdateReady:"New version found",releaseUpToDate:"Up to date",releaseCheckFailed:"Check failed",releaseInstallerMissing:"A new version is available, but this release does not include a supported installer yet.",releaseSignatureMissing:"A new version is available, but this release does not provide checksum information yet.",releaseInstallStarted:"Install started",releaseInstallFailed:"Install failed",releaseRestartRequired:"Install completed. Please restart the app.",releaseRestartDialogTitle:"Install completed",releaseRestartDialogDescription:"Version {version} has been installed. Restart the app to finish switching to the new build.",releaseRestartLater:"Later",releaseRestartConfirm:"Yes, restart now",releaseRestartFailed:"Failed to restart the app",releasePageOpenFailed:"Failed to open page",androidInstallerStarted:"Handed off to the Android installer. You can still cancel there.",androidInstallPermissionRequired:"Allow installs from this source before retrying.",androidInstallCancelled:"Install was cancelled or not completed. You can try again.",androidInstallSucceeded:"The new version has been detected as installed.",releaseRollbackStarted:"Rollback started",releaseRollbackFailed:"Rollback failed",clientUpdateUnsupported:"Install updates are not supported here",logout:"Log out"},home:{title:"Continue from a session, not from a backend table",subtitle:"Pick a workspace and session here first. The real work starts in the next step.",terminalsEntry:"Open Terminal",workspaceSection:"Workspaces",sessionSection:"Recent Sessions",emptyWorkspaces:"No workspace has been imported yet. Import one on the Host side first, and the entry will appear here.",emptySessions:"There is no session to continue in the current workspace yet.",noActivity:"No activity yet"},terminal:{title:"Terminal",heroTitle:"Keep the real PTY on Host, keep the control surface in the workspace",heroSubtitle:"This page does not fake output and does not mix terminal with process management. It only consumes the real terminal stream managed by Host.",workspaceSection:"Workspace & Terminal",workspaceField:"Current Workspace",shellField:"Shell for New Terminal",runtimeField:"Runtime",runtimeAutoOption:"Auto",runtimeAutoShortLabel:"auto",runtimeAutoDescription:"Use the Host default policy for this terminal runtime.",runtimePersistentLabel:"Persistent Session",runtimePersistentShortLabel:"persist",runtimeTmuxDescription:"Use a persistent external session, ideal for development terminals that should stay alive.",runtimeWindowsPersistentDescription:"Use a Windows persistent session backed by ConPTY so the shell can survive Host restarts.",runtimeEmbeddedDescription:"Managed directly by the current Host and useful as the lightweight fallback.",runtimeConptyPowerShellLabel:"PowerShell Persistent",runtimeConptyCmdLabel:"CMD Persistent",runtimeConptyGitBashLabel:"Git Bash Persistent",runtimeMissingDialogTitle:"tmux is not installed on this system",runtimeMissingDialogDescription:"The tmux runtime cannot create a persistent terminal right now. Install tmux first, or temporarily switch to embedded-pty to continue.",runtimeMissingInstallDescription:"Installing tmux is recommended if you want terminals to survive Host restarts.",runtimeMissingInstallMacArm:"macOS (Apple Silicon / Homebrew): arch -arm64 brew install tmux",runtimeMissingInstallMacIntel:"macOS (Intel Mac / Homebrew): brew install tmux",runtimeMissingInstallDebian:"Ubuntu / Debian: sudo apt install tmux",runtimeMissingInstallFedora:"Fedora: sudo dnf install tmux",runtimeMissingFallbackDescription:"If you switch to embedded-pty now, the terminal can still start, but it will not stay as an external persistent session.",runtimeMissingKeepAction:"Not now",runtimeMissingFallbackAction:"Switch to embedded-pty",runtimeMissingFallbackPending:"Switching...",shellUnavailable:"Unavailable",workspaceLoadFailed:"The workspace or terminal list is not available right now.",terminalSection:"Terminal Instances",templateSection:"Command Templates",stageEmptyTitle:"No terminal selected yet",stageEmptySubtitle:"Create a terminal first, or run a command template.",emptyTerminals:"There is no terminal instance in the current workspace yet.",emptyTemplates:"There is no command template in the current workspace yet.",createButton:"Create Terminal",creating:"Creating terminal...",creationPendingDescription:"Host is starting the real PTY. This pane will take over as soon as the stream is ready.",defaultTerminalName:"Workspace Terminal",created:"The terminal has been created and connected to Host.",createFailed:"Failed to create terminal.",closeButton:"Close Terminal",closing:"Closing terminal...",closed:"The terminal close request has been submitted.",closeCompleted:"Terminal closed.",closePendingDescription:"The close request has been sent to Host. The page stays responsive and keeps syncing the final result in the background.",closeSyncDelayed:"Host is still finishing the close in the background. The list will keep syncing on the next refresh.",closeFailed:"Failed to close terminal.",inputLabel:"Send command to current terminal",inputPlaceholder:"For example: npm test",sendButton:"Send to Terminal",inputFailed:"Failed to send terminal input.",outputEmpty:"The terminal is connected, but there is no output yet.",outputTruncated:"Some output exceeded the cache window while disconnected. Only the retained part has been restored.",connectedHint:"Current output is coming from the real PTY stream on Host.",moreActions:"Terminal Actions",duplicateAction:"Duplicate Tab",duplicateSuccess:"A new terminal tab has been created with the same setup.",duplicateFailed:"Failed to duplicate the terminal tab.",disconnectAction:"Disconnect",disconnected:"Terminal connection has been disconnected.",reconnectAction:"Reconnect",reconnectRequested:"Reconnect request sent.",deleteAction:"Delete",deleting:"Deleting terminal...",deleted:"Terminal record deleted.",deletePendingDescription:"The delete request has been sent to Host. The page stays responsive and keeps syncing the list in the background.",deleteSyncDelayed:"Host is still finishing the delete in the background. The list will keep syncing on the next refresh.",deleteFailed:"Failed to delete the terminal record.",closePendingBadge:"Closing",deletePendingBadge:"Deleting",pinAction:"Pin",unpinAction:"Unpin",zoomLabel:"Terminal Zoom",zoomInAction:"Zoom in terminal display",zoomOutAction:"Zoom out terminal display",zoomResetAction:"Reset terminal zoom",openExternalAction:"Open in Separate Window",openExternalFailed:"Failed to open the detached terminal window.",toolbarToggleAction:"Open terminal tools menu",mobileSwipeHint:"Swipe left or right to switch terminals",mobileSwipePosition:"{current} / {total}",mobileDrawerAction:"Open quick terminal list",mobileDrawerTitle:"Quick Terminals",mobileDrawerDescription:"Swipe right to reveal the list, then tap to jump to another terminal.",mobilePinnedSectionTitle:"Pinned Terminals",mobileDrawerEmptyTitle:"No terminals yet",mobileDrawerEmptyDescription:"Create one first and the quick switcher will appear here.",mobileCreateSheetTitle:"Create Terminal",mobileCreateShellLabel:"Terminal Type",mobileCreateShellDescription:"Pick the shell for this terminal instead of squeezing desktop dropdowns onto mobile.",mobileCreateRuntimeLabel:"Session Type",mobileCreateRuntimeDescription:"Choose whether this terminal should stay persistent or only live in the current runtime.",mobileCreateLoadingShells:"Loading available terminal types for this system...",mobileCreateConfirm:"Create this terminal",createDialogTitle:"Create Terminal",createDialogShellDescription:"Choose the shell for this terminal before creation. On Windows we should not silently fall back to CMD anymore.",createDialogRuntimeDescription:"Choose whether this terminal should stay persistent or only live in the current runtime.",createDialogConfirm:"Create Terminal",mobileRuntimePersistentTitle:"Persistent Session",mobileRuntimePersistentDescription:"Best for development terminals that should stay alive and reconnect as a recoverable session.",mobileRuntimeSessionTitle:"runtime (current session)",mobileRuntimeSessionDescription:"Managed directly by the current Host. Lighter, but not an external persistent session.",mobileWorkspaceSwitcherPlaceholder:"Choose Workspace",mobileEmptyTitle:"No terminal content yet",mobileEmptyDescription:"Create a terminal first, or swipe right to open the quick list and switch to an existing one.",layoutLabel:"Layout",layoutSingleAction:"Single pane",layoutVerticalAction:"Split left and right",layoutHorizontalAction:"Split top and bottom",saveLogAction:"Save Log",saveLogSuccess:"The terminal log has been saved.",saveLogFailed:"Failed to save the terminal log.",logEmpty:"There is no terminal log to save yet.",bindToPaneAction:"Bind to current pane",bindToPrimaryPaneAction:"Bind to main pane",bindToSecondaryPaneAction:"Bind to side pane",panePrimary:"Main Pane",paneSecondary:"Side Pane",splitEmptySubtitle:"Pick a tab or create a terminal first, then bind it to this pane.",statusBadge:{creating:"starting",running:"running",closed:"closed",error:"error"},recoveryComplete:"Recovered to the terminal from before refresh. Key cached output has been restored.",recoveryTruncated:"Recovered to the previous terminal, but some disconnected output exceeded the cache window.",recoveryIdleClosed:"The previous terminal was auto-closed by Host after being idle too long. You are seeing the output kept before close.",reconnect:"Reconnect",liveConnected:"Live stream connected",templateName:"Template Name",templateCommand:"Main Command",templateArgs:"Arguments (space separated)",templateCreateButton:"Save Template",templateCreated:"The command template has been saved.",templateCreateFailed:"Failed to save the command template.",templateRunSent:"The command template has been sent to the current terminal.",templateRunCreatedTerminal:"The command template started in a new terminal.",templateRunFailed:"Failed to run the command template.",connection:{connected:"Connected",reconnecting:"Reconnecting",reconnect_failed:"Reconnect failed",closed:"Closed"}},conversation:{titleFallback:"Continue Conversation",historyLoading:"Loading message history from Host...",historyLoadingOlder:"Loading older messages...",historyLoadFailed:"Message history is not available right now. Try again later.",timelineEmpty:"There are no messages in this session yet. Your first message will go straight into the Host chain.",turnAbortedUser:"The previous turn was stopped by you.",turnAbortedUnexpected:"The previous turn was interrupted unexpectedly and did not finish cleanly.",turnAbortedGeneric:"The previous turn was interrupted before it finished cleanly.",scrollToBottomAction:"Jump to bottom",rawRefLabel:"Source",copyAction:"Copy",copyContentSuccess:"Content copied.",copyContentFailed:"Failed to copy the content.",selectionTodoAction:"Todo",selectionActionButton:"Action",selectionActionSubmit:"Open action child session",selectionActionPromptLabel:"What should it do",selectionActionPromptPlaceholder:"For example: explain this, turn it into notes, or send it to a specific API",selectionActionIncludeContext:"Include current context",selectionActionContextUnavailable:"This selection spans multiple messages, so context inheritance is disabled for safety.",selectionActionDefaultPrompt:"Please process this content.",selectionActionQuotedLabel:"Selected text",selectionActionFailed:"Failed to create the action child session.",actionSessionBadge:"Action",actionInheritedSelectionSummary:'Collapsed the selected text from "{parentTitle}" by default.',forkFromHereAction:"Fork from here",forkingAction:"Forking...",forkMessageSucceeded:"Created a new branch from this message.",forkMessageFailed:"Failed to fork from this message.",forkDraftLabel:"Fork Quote",forkDraftEmpty:"This message does not contain text to quote.",forkDraftClear:"Cancel this fork quote",forkTargetProviderLabel:"Target CLI",forkTargetModelLabel:"Target Model",forkTargetSummary:"Source CLI: {sourceProvider} · Target CLI: {targetProvider}",forkInlineModelLoading:"Loading model options...",forkInlineNativeHint:"Stay on the same CLI and use native fork.",forkInlineCrossHint:"Switched to another CLI. The child session will be reconstructed from text history.",forkSwitchConfirmTitle:"Switch to another CLI?",forkSwitchConfirmDescription:"Using the same CLI keeps the native fork experience. Switching CLI changes this into a cross-provider fork.",forkSwitchConfirmKeepTitle:"Will keep",forkSwitchConfirmKeepBody:"User messages and assistant text before the fork point.",forkSwitchConfirmConvertTitle:"Will convert",forkSwitchConfirmConvertBody:"Reusable text history will be rebuilt into the new CLI session.",forkSwitchConfirmDropTitle:"Will lose",forkSwitchConfirmDropBody:"Tool calls, permission prompts, attachments, and running state.",forkSwitchConfirmAction:"Confirm switch",forkSwitchKeepNative:"Keep native",forkProviderNativeUnsupported:"This provider does not support native fork yet",forkProviderReconstructedUnsupported:"This provider cannot be used as a cross-provider fork target yet",loadMore:"Load More",composerPlaceholder:"State the next step clearly. Let the rest continue inside this session.",sendButton:"Send Message",queueTitle:"Queued Messages",queueDescription:"After the current run finishes, these messages will be processed automatically in order.",queueOrderPrefix:"Queue Position",queueStatusQueued:"Queued",queueStatusFailed:"Dispatch Failed",queueDelete:"Delete",queueDeleting:"Deleting",queueImageOnly:"Image attachments only",sendGuidanceButton:"Add Guidance",queueGuidanceButton:"Queue Guidance",queueSteer:"Steer",queueSteering:"Steering",resendButton:"Resend",quickPhraseTrigger:"Quick Phrases",quickPhraseModalTitle:"Quick Phrases",quickPhraseModalDescription:"Keep the prompts you reuse often in one place and drop them straight into the current composer.",quickPhraseCreateLabel:"New Phrase",quickPhraseOpenCreateAction:"Add Phrase",quickPhraseCreateModalTitle:"Create Quick Phrase",quickPhraseCreateModalDescription:"Save a reusable prompt on its own so it is ready across devices whenever you need it.",quickPhraseCreatePlaceholder:"Write a phrase you want to reuse later.",quickPhraseCreateAction:"Add Phrase",quickPhraseListLabel:"Quick phrase list",quickPhraseEmpty:"There are no quick phrases yet. Add the first one you actually reuse.",quickPhraseOrderLabel:"Item {index}",quickPhraseMoveUp:"Move phrase up",quickPhraseMoveDown:"Move phrase down",quickPhraseDelete:"Delete phrase",quickPhraseSaveFailed:"Failed to save quick phrases. Try again later.",sendingState:"Sending",sentState:"Synced",failedState:"Send failed",contextUsageTitle:"Context Usage",contextUsageUnavailable:"Context usage is not available yet",contextUsageEstimated:"Window is estimated",contextUsageCachedTokens:"{count} cached",contextUsageSourceProviderLog:"window from provider log",contextUsageSourceProviderRuntime:"window from provider runtime",contextUsageSourceProviderConfig:"window from provider config",contextUsageSourceModelMap:"window from model map",headerWorkspace:"Workspace",headerProvider:"Provider",headerCapability:"Capability Summary",connectionConnected:"Connected",connectionReconnecting:"Reconnecting",connectionReconnectFailed:"Reconnect failed",connectionClosed:"Connection closed",runtimeErrorTitle:"Session run failed",permissionRequestSectionTitle:"Pending approvals",permissionRequestSectionDescription:"Provider-side approvals are unified here so you do not need to learn three different dialogs.",permissionRequestToastTitle:"Approval needed",permissionRequestReplyFailed:"Failed to reply to the approval request.",permissionRequestSubmitting:"Submitting...",permissionRequestReasonLabel:"Reason",permissionRequestCommandLabel:"Command",permissionRequestToolLabel:"Tool",permissionRequestCwdLabel:"Working directory",permissionRequestPathsLabel:"Related paths",permissionRequestPermissionsLabel:"Requested permissions",permissionRequestReadLabel:"Read",permissionRequestWriteLabel:"Write",permissionRequestNetworkLabel:"Network",permissionRequestQuestionsLabel:"Questions",permissionRequestDetailLabel:"Details",permissionRequestEmpty:"None",permissionRequestUnknown:"Unknown",permissionRequestKindCommand:"Command",permissionRequestKindFileChange:"File Change",permissionRequestKindPermissions:"Permissions",permissionRequestKindUserInput:"User Input",permissionRequestKindToolCall:"Tool Call",reconnectExplain:"The realtime link is broken. The system is replaying missing messages.",reconnectFailedExplain:"Automatic recovery failed. Retry manually, or reopen the session later.",reconnectExplainWithRoute:"The realtime link is broken. The system is replaying missing messages. Current route: {route}.",reconnectFailedExplainWithRoute:"Automatic recovery failed. Retry manually, or reopen the session later. Current route: {route}.",capabilityDenied:"This action is not supported in the current session.",capabilitySendDisabled:"The current provider does not support sending new messages.",capabilityAttachmentDisabled:"This session does not support attachment input yet.",capabilityInterruptDisabled:"This session does not support interruption.",sidebarTitle:"Current Session Context",sidebarSubtitle:"This sidebar only keeps the minimum capability summary. It does not turn the page into an admin console.",reconnectButton:"Restore Realtime Sync",headerResumedAt:"Last Resumed",headerLastSyncAt:"Last Synced",historyPages:"History Pages",syncStatusIdle:"Sync Idle",syncStatusSyncing:"Syncing",syncStatusError:"Sync Error",capabilityResume:"Resumable",capabilitySend:"Send Enabled",capabilityInterrupt:"Interrupt Enabled",capabilityTools:"Tool Calls",attachmentsLabel:"Attachments",filePanelTitle:"File Manager",filePanelSubtitle:"File capabilities here only serve the current session. This is not a heavy IDE shell.",filePanelNoWorkspace:"There is no selected workspace yet. Browsing or attaching files is unavailable.",filePanelRefresh:"Refresh",filePanelCopyPath:"Copy Path",filePanelCopyAbsolutePath:"Copy Absolute Path",filePanelCopyRelativePath:"Copy Relative Path",filePanelCopyAbsolutePathSuccess:"Absolute path copied.",filePanelCopyRelativePathSuccess:"Relative path copied.",filePanelCopyPathFailed:"Failed to copy the path.",filePanelCopy:"Copy",filePanelCut:"Cut",filePanelPaste:"Paste",filePanelCopySelectionSuccess:"{count} item(s) copied. Paste them into a target folder.",filePanelCutSelectionSuccess:"{count} item(s) cut. Paste them into a target folder.",filePanelPasteSuccess:"{count} item(s) pasted.",filePanelPasteFailed:"Paste failed. Check the target folder and name conflicts.",filePanelSelectionCount:"{count} item(s) selected",filePanelClipboardCopyReady:"{count} item(s) ready to copy",filePanelClipboardCutReady:"{count} item(s) ready to move",filePanelOpenFile:"Open File",filePanelExpandDirectory:"Expand Folder",filePanelCollapseDirectory:"Collapse Folder",filePanelActionsMenu:"File Actions",filePanelSearchPlaceholder:"Enter a file name or path fragment",filePanelSearchButton:"Search",filePanelShowSearch:"Open Search",filePanelHideSearch:"Hide Search",filePanelSearchEmpty:"No matching files found.",filePanelSearchResults:"Search Results",filePanelSearchFailed:"File search failed. Try again later.",filePanelBrowse:"Workspace Files",filePanelCollapseCurrent:"Collapse Current",filePanelCollapseAll:"Collapse All",filePanelBackDirectory:"Go to Parent",filePanelEmptyDirectory:"There are no files to show in this directory.",filePanelRecentTitle:"Recently Opened",filePanelEmptyRecent:"There is no recently opened file yet.",filePanelContextTitle:"Attached Files",filePanelEmptyContexts:"No file is attached to the current session yet.",filePanelEditorTitle:"Preview & Editor",filePanelEditorPlaceholder:"This is a lightweight text editor, not a full IDE.",filePanelSelectHint:"Pick a file first from browse, search, or recent items.",filePanelUnsupported:"This file cannot be edited directly in the sidebar right now.",filePanelAttach:"Attach to Session",filePanelAttached:"Attached",filePanelDetach:"Detach",filePanelSave:"Save",filePanelSaving:"Saving...",filePanelLoadFailed:"Failed to load the file panel.",filePanelOpenFailed:"Failed to open the file.",filePanelSaveSuccess:"File saved.",filePanelSaveFailed:"Failed to save the file.",fileViewerHint:"Opened in {language} mode. Preview and save after editing are supported.",fileViewerModeLabel:"File View Mode",fileViewerPreview:"Preview",fileViewerCode:"Code",fileViewerEdit:"Edit",fileViewerPlainText:"Plain Text",fileViewerImage:"Image",fileViewerPdf:"PDF",fileViewerRefreshPreview:"Refresh",fileViewerRefreshFailed:"Failed to refresh the file preview.",fileViewerOpenExternal:"Open Externally",fileViewerOpenExternalFailed:"Failed to open the file externally.",fileViewerZoomIn:"Zoom In",fileViewerZoomOut:"Zoom Out",fileViewerFit:"Fit",fileViewerActualSize:"Actual Size",fileViewerFitWidth:"Fit Width",fileViewerPreviousPage:"Previous Page",fileViewerNextPage:"Next Page",fileViewerPageIndicator:"Page {page}",fileViewerSizeLabel:"Viewer Size",fileViewerSizeDefault:"Default",fileViewerSizeWide:"Wide",fileViewerSizeFull:"Full",fileViewerImageUnavailable:"The image preview is unavailable right now. Try refreshing or opening it externally.",fileViewerPdfUnavailable:"The PDF preview is unavailable right now. Try refreshing or opening it externally.",fileViewerEnterFullscreen:"Full Screen",fileViewerExitFullscreen:"Exit",fileViewerOpenInBrowser:"Open in Browser",fileViewerOpenInBrowserFailed:"Failed to open the browser preview.",fileViewerHtmlPreviewLoading:"Loading the HTML preview...",fileViewerHtmlPreviewUnavailable:"The HTML preview is unavailable right now. Switch to code view instead.",fileViewerHtmlPreviewFailed:"Failed to create the HTML preview link.",filePanelAttachSuccess:"The file has been attached to the current session.",filePanelAttachFailed:"Failed to attach the file.",filePanelDetachSuccess:"The file has been detached from the current session.",filePanelDetachFailed:"Failed to detach the file.",filePanelNewFile:"New File",filePanelNewDirectory:"New Directory",filePanelUpload:"Upload File",filePanelDownload:"Download File",filePanelUploadSuccess:"{name} uploaded.",filePanelUploadFailed:"Failed to upload the file.",filePanelDownloadSuccess:"Started downloading {name}.",filePanelDownloadFailed:"Failed to download the file.",filePanelDelete:"Delete",filePanelDeleting:"Deleting...",filePanelDeleteSuccess:"Deleted {name}.",filePanelDeleteConfirmTitle:"Confirm Deletion",filePanelDeleteConfirmDescription:"The selected item will be removed from this workspace immediately and cannot be undone.",filePanelDeleteSelectionConfirm:"Delete the selected {count} items?",filePanelDeleteSelectionSuccess:"Deleted {count} items.",filePanelRenameMove:"Rename / Move",filePanelRenameSuccess:"Renamed to {name}.",filePanelMutateFailed:"File operation failed. Check the path and current state.",filePanelCreateFilePrompt:"Enter the relative path of the file to create",filePanelCreateDirectoryPrompt:"Enter the relative path of the directory to create",filePanelCreateFileDescription:"Enter a relative path inside the workspace. The file will be created immediately.",filePanelCreateDirectoryDescription:"Enter a relative path inside the workspace. The folder will be created immediately.",filePanelPathFieldLabel:"Relative Path",filePanelPathFieldPlaceholder:"For example: src/features/files/index.ts",filePanelCreateFileSubmit:"Create File",filePanelCreateDirectorySubmit:"Create Folder",filePanelCreatingFile:"Creating file...",filePanelCreatingDirectory:"Creating folder...",filePanelFilterChanges:"Changes Only",filePanelShowAll:"Show All",filePanelNoChanges:"No changed files.",filePanelBinaryPreview:"Binary files cannot be previewed.",filePanelDeleteFileConfirm:"Delete this file? {path}",filePanelDeleteDirectoryConfirm:"Delete this folder? {path}",filePanelRenameMovePrompt:"Enter the new relative path",filePanelRenameDescription:"Only the path changes. Use a new relative path if you also want to move it.",filePanelRenameSubmit:"Confirm Rename",filePanelRenaming:"Renaming...",unavailableAction:"Unavailable",roleUser:"User",roleAssistant:"Assistant",roleTool:"Tool",roleSystem:"System"},git:{title:"Git Context",subtitle:"This is the session-side support area. It only handles Git facts inside the current workspace.",loading:"Loading Git context for the current workspace...",refresh:"Refresh",panelLoadFailed:"Git context is not available right now.",uninitializedTitle:"Git is not enabled in this folder yet",uninitializedDescription:"Initialize a Git workspace here first, then you can review changes, commit, and browse history.",initRepository:"Initialize Git Workspace",initInProgress:"Initializing...",initSuccess:"The Git workspace has been initialized.",initFailed:"Failed to initialize the Git workspace.",ahead:"Ahead",behind:"Behind",dirty:"Dirty",clean:"Clean",changeCount:"{count} changed files in the current workspace",noChanges:"There are no pending changes right now.",changesTitle:"Current Changes",rulesFirstHint:"Rules come first. Drafts must not bypass validation.",stage:"Stage",unstage:"Unstage",preview:"Preview",stageFailed:"Stage operation failed.",diffTitle:"Diff Preview",diffLoadFailed:"Diff content is not available right now.",binaryDiff:"This file is a binary change. The sidebar does not render its content directly.",stagedDiff:"Staged diff",worktreeDiff:"Working tree diff",emptyDiff:"There is no text diff to display right now.",diffTruncated:"The diff is too long and has been truncated for safety.",commitTitle:"Commit Draft",defaultRuleName:"Default Commit Rule",language:"Language",maxLength:"Max Length",bodyRequired:"Body Required",bodyOptional:"Body Optional",issueRequired:"Issue Required",issueOptional:"Issue Optional",commitSubject:"Commit Subject",commitSubjectPlaceholder:"Enter the commit message here",commitBody:"Commit Body",commitBodyPlaceholder:"Explain the change clearly. Do not write empty words.",commitFooter:"Commit Footer",commitFooterPlaceholder:"For example: Refs: #123",generateDraft:"AI Draft",validate:"Validate Draft",commit:"Commit",draftFailed:"Failed to generate the commit draft.",validateFailed:"Commit rule validation failed.",commitFailed:"Commit failed.",commitSuccess:"The commit has been written to the current repository.",validationPassed:"Rule validation passed. You can continue to commit.",validationFailed:"Rule validation failed. Fix the issues below first.",branchTitle:"Branch",branchPlaceholder:"Enter the branch name to switch to or create",switchBranch:"Switch",createBranch:"Create",branchFailed:"Branch operation failed.",historyTitle:"Recent History",historyHint:"Only keep the latest few entries here. This is not a graphical history tree.",noHistory:"There is no commit history to show right now.",viewAllVersions:"View All Versions",viewAllVersionsDescription:"Loaded commit history for the current repository. Total entries: {count}.",viewCommitChanges:"View Changed Files and DIFF",copyCommitMessage:"Copy Commit Message",copyCommitMessageSuccess:"The commit message has been copied.",copyCommitVersion:"Copy Git Version",copyCommitVersionSuccess:"The Git version has been copied.",commitDetailTitle:"Commit Detail",commitDetailDescription:"Showing the full change for commit {hash}.",commitDetailLoading:"Loading commit detail...",commitDetailEmpty:"There is no commit detail to show right now.",commitDetailLoadFailed:"The commit detail is not available right now.",commitVersionLabel:"Git Version",commitHashLabel:"Commit Hash",commitAuthorLabel:"Author",commitTimeLabel:"Commit Time",commitMessageLabel:"Commit Message",changedFilesTitle:"Changed Files",commitDiffLabel:"Commit DIFF",renamedFromLabel:"Renamed from {path}",explainCommitTitle:"Explain Commit Change",explainCommitDescription:"Choose a CLI provider first, then start a new session to analyze this commit.",explainCommitAction:"Explain Change",startExplainCommit:"Start Explaining",explainCommitStarted:"The explanation session has been created.",explainCommitFailed:"Failed to explain the commit change.",remoteTitle:"Remote Sync",remoteReady:"A remote is configured for the current repository.",remoteMissing:"The current repository has no remote configured yet.",fetch:"Fetch",pull:"Pull",push:"Push",pushNow:"Push Now",publish:"Publish",remoteFailed:"Remote sync failed.",remoteAuthAction:"Remote Auth",remoteAuthTitle:"Configure Remote Authentication",remoteAuthDescription:"Enter the username, password, or token to use for authenticated remote operations in this page session.",remoteAuthDescriptionGithub:"The current remote points to GitHub. For GitHub HTTPS Git operations, use a Personal Access Token (PAT) instead of your GitHub login password.",remoteAuthStatusLabel:"Authentication",remoteAuthConfigured:"Configured",remoteAuthNotConfigured:"Not Configured",remoteAuthGithubPatLabel:"Personal Access Token (PAT)",remoteAuthGithubPatPlaceholder:"Enter GitHub PAT",remoteAuthGithubUsernamePlaceholder:"Enter GitHub username",remoteAuthGithubPatHint:"GitHub does not support account passwords for Git HTTPS authentication. In basic mode, enter GitHub username + PAT. In token mode, you can paste the PAT directly.",remoteAuthRemember:"Remember On Host",remoteAuthSessionHint:"By default this only applies to the current page session. If you enable “Remember On Host”, the credential will be stored on the Host after a successful remote sync and reused later.",remoteAuthRememberHint:"When remember is enabled, this credential will be written to the Host after the remote sync succeeds.",remoteAuthSave:"Save Auth",remoteAuthSaved:"Remote authentication saved. Retry the remote sync now.",remoteAuthCleared:"Remote authentication for this page session has been cleared.",selectRemoteTitle:"Select Remote to Push",selectRemoteDesc:"Select remote repositories to push to. Multiple selection supported.",noRemotes:"No remote repositories are configured.",pushSelected:"Push ({count})",pushing:"Pushing…",pushAllSuccess:"Successfully pushed to {count} remote(s).",errors:{unauthorized:"The current login is no longer valid. Log in again and retry.",workspaceNotFound:"The workspace bound to the current session does not exist. Check whether it is still available.",invalidWorkspace:"The current workspace config is invalid. The Git sidebar must not operate outside the repo root.",notGitRepository:"The current workspace is not a Git repository. The Git sidebar will not fake a state.",repoNotFound:"No usable Git repository root was found for the current workspace.",pathOutOfWorkspace:"The Git target is outside the current workspace repository boundary. The operation was blocked.",invalidTarget:"The Git target path is invalid. Refresh the sidebar and try again.",notStaged:"The target file is not staged yet. Check the current change state first.",emptyStagedChanges:"The staging area is empty. Stage the changes before committing.",branchConflict:"The current branch has conflicts or is not a fast-forward update. Sync and resolve differences first.",branchNotFound:"The target branch does not exist. Check the branch name first.",remoteNotFound:"The current repository does not have a usable origin remote yet.",remoteAuthFailed:"Remote repository authentication failed. Check the current credentials first.",pushFailed:"Push failed. Check remote state and local commits first.",pullFailed:"Pull failed. Check the remote branch state first.",remoteFailed:"Remote sync failed. Check Git output and network state.",initFailed:"Failed to initialize the Git workspace. Make sure the directory is writable and Git is available.",commitValidationFailed:"The commit draft has not passed validation yet. Fix validation issues first.",commandTimeout:"The Git operation timed out. Check repository state and network conditions."}},theme:{light:"浅色",dark:"深色",skyBlue:"赛博",eyeGreen:"护眼",switchLabel:"Theme"},locale:{zhCN:"Simplified Chinese",enUS:"English"}},Fh={common:{appName:"CodingNS",loading:"正在准备会话工作区…",retry:"重新尝试",back:"返回",save:"保存",close:"关闭",cancel:"取消",connectionRouteRelay:"CodingNS Connect",connectionRouteLan:"局域网直连",connectionRouteLoopback:"本机直连",connectionRouteTailscale:"Tailscale 直连",connectionRouteDirect:"直接连接",logout:"退出登录",unknown:"未命名会话"},auth:{loginTitle:"继续你的编码会话",loginSubtitle:"INITIALIZING DEVELOPMENT ENVIRONMENT...",serverPreset:"服务器列表",serverCustomOption:"使用自定义服务器",serverAddress:"服务器地址",serverPlaceholder:"例如:http://127.0.0.1:3002",serverHint:"登录、实时消息和终端都会连接到这里。客户端应填写 Host API 地址,例如 http://127.0.0.1:3002;4174、5173 这类前端开发端口不是给正式客户端直接连接的,只有代理和跨域都配好时才适合临时调试。",serverInvalid:"服务器地址无效,请检查后再试。",serverDiscoveredTag:"自动发现",serverCurrent:"当前服务器",bootstrapTitle:"先完成首次初始化",bootstrapSubtitle:"这个 Host 还没有管理员账号,先创建一个最小登录入口。",username:"用户名",password:"密码",rememberPassword:"保存密码",confirmPassword:"确认密码",submitLogin:"进入工作台",submitBootstrap:"创建管理员账号",bootstrapSuccess:"初始化完成,现在可以登录了。",bootstrapMismatch:"两次输入的密码不一致。",authUnavailable:"暂时连不上 Host,请确认服务可访问。",logoutSuccess:"当前登录态已经清空。",demoBanner:"演示环境 — 所有账号数据公开可见,注销后自动清除",demoSessionExpired:"演示会话已过期,请重新登录",captcha:"图形验证码",captchaPlaceholder:"输入图中的字符",captchaHint:"连续输错三次后,需要先完成图形验证码才能继续登录。",captchaImageAlt:"登录图形验证码",serverSettings:"服务器设置",serverSettingsTitle:"服务器配置",saveServerSettings:"保存设置",relayEntryTitle:"正在连接远程 Host",relayEntryDescription:"正在切换到这台 Host 的可信连接入口,完成后会自动回到登录页。",relayEntryInvalid:"当前远程访问入口参数不完整,请重新打开访问地址。",trustedEntryOnlyTitle:"请通过远程访问地址进入",trustedEntryOnlyDescription:"这个可信前端站点只负责加载连接页面,不直接承载 Host API。请重新打开设备的远程访问地址。",trustedEntryOnlyHintTitle:"如何进入",trustedEntryOnlyHint:"请使用类似 https://xxxx.channel.codingns.com:1443 的远程访问地址进入;四级域名会自动把你带到正确的连接入口。"},settings:{title:"设置",appearance:"外观",appearanceSectionSummary:"语言、主题与界面配色",language:"语言",languageDescription:"选择界面显示语言,切换后立即应用到当前页面。",theme:"主题",themeDescription:"选择适合你的界面配色方案",autoTheme:"自动跟随系统主题",autoThemeDescription:"开启后根据系统或浏览器的深浅色偏好自动切换日间和夜间模式。",fileManager:"文件管理",workspaceSessionSortMode:"工作区的会话显示排序方式",workspaceSessionSortModeDescription:"控制工作区里各处会话列表的默认排序,只影响当前设备。",sessionSortModeCreatedAt:"按照会话创建时间",sessionSortModeUpdatedAt:"按照会话更新时间",sessionSortModeTitle:"按照会话名称",showSystemFiles:"显示系统文件",showSystemFilesDescription:"在文件管理里显示 macOS 和 Windows 常见的系统文件,例如 .DS_Store、Thumbs.db。这个开关只影响当前设备。",serverConnection:"服务器连接",serverConnectionSectionSummary:"服务器地址与连接恢复策略",remoteAccess:"远程访问",remoteAccessSectionSummary:"通过 CodingNS Connect 或 Tailscale,从外部设备连接这台 Host。",remoteAccessNavValue:"CodingNS Connect / Tailscale",remoteAccessManageTitle:"远程访问方式",remoteAccessManageDescription:"需要从外部访问这台 Host 时,在这里选择并配置连接方式。",remoteAccessManageAction:"管理远程访问",remoteAccessModalTitle:"访问方式管理",remoteAccessModalDescription:"选择并配置你要使用的远程访问方式。",remoteAccessTabsLabel:"远程访问方式标签",remoteAccessTunnelTab:"CodingNS Connect",remoteAccessTailscaleTab:"Tailscale接入",remoteAccessFeatureDisabledValue:"未开启",abilityManagement:"能力管理",abilityManagementSectionSummary:"统一管理 CLI 提供方的启用状态,以及模型配置文件的快速切换入口。",abilityManagementNavValue:"提供方 / 配置文件",modelManagement:"模型管理",modelManagementSectionSummary:"快速切换模型配置文件",modelManagementNavValue:"快速切换",modelManagementSectionTitle:"模型配置文件管理",providerManagement:"CLI 提供方",providerManagementSectionSummary:"控制哪些 CLI 会出现在会话、Fork、助手和 Skill 入口里。",providerManagementNavValue:"启用控制",providerManagementDescription:"统一控制这台 Host 当前允许使用的 CLI。能力矩阵、状态和启用开关都放在弹窗里查看和修改。",providerManagementManageAction:"管理 CLI 提供方",providerManagementModalTitle:"CLI 提供方管理",providerManagementModalDescription:"查看每个 CLI 在项目里的能力、当前状态,以及是否继续对外显示。",providerManagementRefresh:"刷新列表",providerManagementRefreshSuccess:"CLI 提供方列表已刷新。",providerManagementLoading:"正在读取可管理的 CLI 提供方...",providerManagementEmpty:"当前还没有可管理的 CLI 提供方。",providerManagementEmptyDescription:"等 Host 注册出可用的 CLI 提供方后,这里会自动出现。",providerManagementLoginRequired:"登录后才能管理 CLI 提供方。",providerManagementLoadFailed:"CLI 提供方列表加载失败。",providerManagementSaveFailed:"CLI 提供方状态保存失败。",providerManagementSummaryTitle:"提供方概况",providerManagementSummaryDescription:"这里先看总量,再决定要不要禁用某个 CLI。",providerManagementSummaryEnabled:"已启用",providerManagementSummaryDisabled:"已禁用",providerManagementSummaryTotal:"总数",providerManagementMatrixTitle:"能力矩阵",providerManagementMatrixDescription:"纵向是 CLI 提供方,横向是产品能力。关闭某个提供方后,它会从项目里的相关入口整体消失。",providerManagementTableProvider:"CLI 提供方",providerManagementTableStatus:"状态",providerManagementTableEnabled:"启用",providerManagementStatusEnabled:"已启用",providerManagementStatusDisabled:"已禁用",providerManagementInstallReady:"已安装",providerManagementInstallMissing:"未检测到",providerManagementInstallUnknown:"状态未知",providerManagementStateEnabled:"当前会出现在新的会话、Fork、助手和 Skill 相关入口里。",providerManagementStateDisabled:"当前已经从新的会话入口里隐藏,旧会话也会从正常列表里收起。",providerManagementStateMissing:"已经允许显示,但本地 CLI 还没准备好,等安装完成后才会真正可用。",providerManagementToggleLabel:"切换 {provider} 的启用状态",providerManagementEnableSuccess:"{provider} 已重新启用。",providerManagementDisableSuccess:"{provider} 已禁用。",providerManagementCapabilityStreaming:"流式输出",providerManagementCapabilityToolCalls:"工具调用",providerManagementCapabilityAssistant:"助手服务",providerManagementCapabilityFork:"会话 Fork",providerManagementCapabilitySkill:"Skill 使用",providerManagementCapabilityAvailable:"可用",providerManagementCapabilityUnavailable:"不可用",providerManagementImpactSessionStart:"新会话启动",providerManagementImpactFork:"会话 Fork",providerManagementImpactAssistant:"助手跟进",providerManagementImpactSkill:"Skill 新目标",providerManagementImpactEnabled:"如果现在关掉,会隐藏旧会话,并阻止 {actions}。",providerManagementImpactDisabled:"当前已经阻止 {actions};重新打开后,这些入口会重新出现。",providerManagementImpactEnabledFallback:"如果现在关掉,这个 CLI 会从项目里的新入口中一起消失。",providerManagementImpactDisabledFallback:"重新打开后,这个 CLI 会重新回到项目里的正常入口中。",modelManagementTitle:"模型快速切换",modelManagementDescription:"这里不新增也不编辑预设,只把 cc-switch 已有预设图形化展示出来,方便你一键切换。",modelManagementRefresh:"刷新模型",modelManagementRefreshSuccess:"模型预设列表已刷新。",modelManagementLoadFailed:"模型预设加载失败。",modelManagementScannedAt:"最近扫描",modelManagementScannedAtUnknown:"暂未扫描",modelManagementCurrentProfile:"当前配置文件",modelManagementCurrentModel:"当前模型",modelManagementCurrentPreset:"当前预设",modelManagementModelUnknown:"未识别",modelManagementPresetMissing:"未设置",modelManagementCurrentTag:"当前",modelManagementOpenSwitcher:"切换配置",modelManagementModalTitle:"供应商配置切换",modelManagementModalDescription:"这里按应用查看 cc-switch 已有配置文件,并切换当前启用项。",modelManagementTabsLabel:"模型应用标签",modelManagementSwitchAction:"切换",modelManagementSwitchSuccess:"{app} 已切换到 {preset}。",modelManagementOptionsEmpty:"当前没有可切换的预设。",modelManagementStatusReady:"可切换",modelManagementStatusUnconfigured:"未配置",modelManagementStatusUnavailable:"未安装 cc-switch-cli",modelManagementStatusError:"读取失败",skills:"Skills",skillsSectionSummary:"读取并同步各个 CLI 自己的本地 skill,不做市场,不接远端仓库。",skillsNavValue:"本地同步",skillManagerTitle:"本地 Skill 管理",skillManagerDescription:"统一读取 Codex、Claude Code、Gemini、OpenCode 的 skill 目录,支持导入未纳管项并重新同步。",skillSummaryManagedSkills:"我的技能",skillSummaryManagedEntries:"已生效",skillSummaryUnmanagedEntries:"未纳管目录",skillSummaryConflictedEntries:"待处理",skillSummaryAssistantRuntimeEntries:"助手专用目录",skillSummaryDiagnostics:"提醒",skillManageAction:"技能配置",skillConfigModalTitle:"技能配置",skillConfigModalDescription:"在这里查看你的技能、系统自带技能和需要处理的项目。",skillCreateAction:"添加技能",skillCreateModalTitle:"添加技能",skillCreateModalDescription:"把新的 SKILL.md 纳管进来。文件上传和粘贴文本都走同一套校验与纳管流程。",skillCreateSourceTabsLabel:"添加方式",skillCreateSourceFile:"选择文件",skillCreateSourcePaste:"粘贴文本",skillCreateSubmitAction:"添加",skillRefresh:"刷新",skillRefreshSuccess:"技能列表已刷新。",skillScannedAt:"最近扫描",skillUploadSectionTitle:"上传 Skill",skillUploadSectionDescription:"选择一个 SKILL.md 文件,先选它属于工作区还是助手运行时,再做基础校验和轻量纠正并纳管。",skillUploadPickAction:"选择 SKILL.md",skillUploadSubmitAction:"上传并纳管",skillUploadEmpty:"当前还没有选择要上传的 SKILL.md 文件。",skillUploadPickedFile:"已选文件",skillUploadScopeLabel:"作用域",skillUploadScopeWorkspace:"工作区 Skill",skillUploadScopeAssistant:"助手专用 Skill",skillUploadDirectoryLabel:"目录名",skillUploadDirectoryPlaceholder:"例如 team-helper",skillUploadDirectoryHint:"用于生成纳管目录和同步目标目录。默认按文件名或标题自动生成,通常不用手动改。",skillUploadDirectoryInvalid:"目录名不合法,只允许字母、数字、点、下划线和短横线。",skillUploadTargetsLabel:"应用 CLI",skillPasteLabel:"粘贴 SKILL 内容",skillPastePlaceholder:"直接粘贴完整的 SKILL.md 内容",skillPasteEmpty:"当前还没有可纳管的 SKILL 内容。",skillUploadDirectoryRequiredNote:"当前文件名推不出合法目录名,请手动补一个。",skillUploadTargetRequired:"至少选择一个目标 CLI。",skillUploadHeadingNote:"当前 markdown 缺少一级标题,纳管时会自动补一个。",skillUploadNormalizedNote:"已按系统规则预处理空白和换行。",skillUploadReadFailed:"读取上传的 SKILL.md 失败。",skillUploadContentEmpty:"上传的 SKILL.md 不能为空。",skillUploadSuccess:"已添加 {name}。",skillManagedListTitle:"我的技能",skillManagedEmpty:"你还没有添加任何技能。",skillManagedItemDescription:"已添加到 {targets}。",skillManagedItemNoTarget:"这项技能还没有应用到任何客户端。",skillUnmanagedListTitle:"待添加技能",skillUnmanagedEmpty:"目前没有新的技能可添加。",skillUnmanagedItemDescription:"已在 {target} 中发现,你可以把它添加到列表。",skillUnmanagedItemDisabledDescription:"已在 {target} 中发现,但这个目标当前已禁用,暂时不能继续添加。",skillAssistantRuntimeListTitle:"助手内置技能",skillAssistantRuntimeListDescription:"这些技能由系统自动提供,只给助手自己使用。",skillAssistantRuntimeEmpty:"当前没有助手内置技能。",skillAssistantRuntimeItemDescription:"这是系统自带技能,你不需要手动处理。",skillAssistantRuntimeUsedBy:"可用于",skillAssistantRuntimeSourcePath:"内置来源路径",skillConflictedListTitle:"待处理",skillConflictedEmpty:"当前没有需要处理的项目。",skillConflictedItemDescription:"{target} 里的这项内容需要处理。",skillConflictedItemDisabledDescription:"{target} 里的这项内容还保留着,但这个目标当前已禁用。",skillDiagnosticsTitle:"提醒",skillDiagnosticsEmpty:"当前没有新的提醒。",skillDiagnosticTargetMissingTitle:"{target} 还没准备好",skillDiagnosticTargetMissingDetail:"当前还没有找到 {target} 的技能目录。",skillDiagnosticReadFailedTitle:"{target} 暂时不可用",skillDiagnosticReadFailedDetail:"暂时无法读取 {target} 的技能信息,请稍后再试。",skillDiagnosticSyncMissingTitle:"{target} 需要重新应用",skillDiagnosticSyncMissingDetail:"有技能还没有在 {target} 中生效。",skillDiagnosticGenericTitle:"{target} 需要留意",skillDiagnosticGenericDetail:"有一项内容暂时没准备好,可以稍后刷新再看。",skillDirectoryName:"目录名",skillSsotPath:"统一存储目录",skillSourceCli:"来源 CLI",skillDirectoryPath:"目录路径",skillImportAction:"添加",skillImportSuccess:"已添加 {name},并应用到 {target}。",skillSyncAction:"重新应用",skillSyncSuccess:"已重新应用 {name}。",skillSyncTargetMissing:"这项技能还没有应用目标,暂时不能重新应用。",skillSyncTargetDisabled:"这项技能当前只剩已禁用目标,先重新启用对应 provider 再继续。",skillLoadFailed:"Skill 概况加载失败。",skillTargetCodex:"Codex",skillTargetClaudeCode:"Claude Code",skillTargetGemini:"Gemini",skillTargetOpenCode:"OpenCode",skillBindingPending:"准备中",skillBindingSynced:"可用",skillBindingFailed:"暂不可用",skillBindingConflicted:"需要处理",skillUploadTargetDisabled:"当前可选的 Skill 目标都已经被禁用,先去 provider 设置里重新启用一个。",skillTargetDisabledTag:"已禁用",skillTagAssistantOnly:"仅助手使用",securityPrivacy:"安全与隐私",securityPrivacySectionSummary:"会话权限、风险边界与默认授权策略",softwareUpdate:"软件更新",softwareUpdateSectionSummary:"服务端和客户端版本",serverAddress:"服务器地址",serverDescription:"客户端的登录、接口请求和实时连接都通过这个 Host 入口工作;前端界面资源由应用自身携带。",serverRelayTunnelProfileTitle:"当前 Host 的 CodingNS Connect 入口",serverRelayTunnelProfileDescription:"给当前保存的 Host profile 指定 CodingNS Connect 入口。开启后,客户端会通过 CodingNS Connect 域名和控制站点建立端到端加密连接,而不是直接请求这个地址。",serverRelayTunnelEnabled:"通过 CodingNS Connect 连接",serverRelayTunnelUsageHint:"服务器地址建议填写这台 Host 的公开入口地址,例如 https://demo.codingns.example 。",serverRelayTunnelDomain:"CodingNS Connect 域名",serverRelayTunnelDomainPlaceholder:"例如:demo.codingns.example",serverRelayTunnelControlBaseUrl:"控制站点地址",serverRelayTunnelControlBaseUrlPlaceholder:"例如:https://control.codingns.example",relayTunnelServerAddressDescription:"默认使用官方 CodingNS Connect 地址;如果你明确知道当前控制站地址,也可以在高级设置里手动覆盖。",relayTunnelServerAddressHint:"这里只改 CodingNS Connect 控制站点地址,用来覆盖登录、绑定和流量查询使用的站点,不影响当前 Host 的本地 API 地址。",relayTunnelStatus:"CodingNS Connect 状态",relayTunnelDescription:"通过 CodingNS Connect,让外部设备安全连接到这台 Host。",relayTunnelMasterSwitchLabel:"启用 CodingNS Connect",relayTunnelActivationHint:"开启后才会检查 CodingNS Connect 状态,并允许这台 Host 接入公网访问。",relayTunnelPhase:"当前状态",relayTunnelDomain:"访问地址",relayTunnelUnbound:"还没有绑定",relayTunnelTrafficRemaining:"剩余流量",relayTunnelHostFingerprint:"Host 指纹",relayTunnelTrustBoundaryNotice:"CodingNS Connect 只负责转发加密后的流量,无法看到你和 Host 之间的通信内容。",relayTunnelRecentError:"最近错误:{message}",relayTunnelAccessTitle:"连接设置",relayTunnelAccessDescription:"先登录 CodingNS Connect 账号,再打开开关把这台设备接入公网访问。",relayTunnelLearnService:"了解 CodingNS Connect",relayTunnelWizardTitle:"远程访问向导",relayTunnelWizardDescription:"按下面三步完成账号登录、主机名确认和 CodingNS Connect 启动,收住以后就能稳定从外部访问这台 Host。",relayTunnelStatusErrorTitle:"暂时无法读取远程访问状态",relayTunnelStatusNetworkError:"当前连不上这台 Host({address}),远程访问状态可能不是最新的。请先确认服务器地址、端口和网络连接。",relayTunnelStepPending:"待完成",relayTunnelStepCurrent:"进行中",relayTunnelStepDone:"已完成",relayTunnelStepLocked:"先完成上一步,这一步才会开放。",relayTunnelStepLoginTitle:"登录账号",relayTunnelStepLoginDescription:"先连接你的 CodingNS Connect 账号,后续的主机名检查和流量读取都依赖这个账号。",relayTunnelStepLoginConnected:"账号已经连接,可以继续下一步。",relayTunnelStepHostLabelTitle:"设置主机名",relayTunnelStepHostLabelDescription:"填写你以后要访问的四级域名前缀,并先检查这个名称现在能不能用。",relayTunnelStepStartTitle:"启动 CodingNS Connect",relayTunnelStepStartDescription:"前两步都完成后,再把当前 Host 正式接入 CodingNS Connect。",relayTunnelStepStartReady:"主机名已经确认,可以启动 CodingNS Connect 了。",relayTunnelStartAction:"启动 CodingNS Connect",relayTunnelLoginErrorTitle:"登录 CodingNS Connect 账号失败",relayTunnelAdvancedSettings:"高级设置",relayTunnelAdvancedSettingsHide:"收起高级设置",relayTunnelAdvancedSettingsDescription:"默认使用官方 CodingNS Connect 地址。只有在你明确知道当前控制站地址时,才需要在这里覆盖。",relayTunnelLoginNetworkError:"登录请求没有发出去,因为当前连不上这台 Host({address})。请先确认服务器地址和网络连接,再重新尝试。",relayTunnelReadyTitle:"远程访问已开启",relayTunnelReadyDescription:"当前配置已经收住。这里仅保留访问地址、流量信息和维护动作。",relayTunnelAccessUrlLabel:"远程访问地址",relayTunnelCopyAccessUrl:"复制地址",relayTunnelOpenAccessUrl:"打开页面",relayTunnelAccessUrlCopied:"访问地址已复制。",relayTunnelCopyAccessUrlFailed:"访问地址复制失败。",relayTunnelOpenAccessUrlFailed:"访问地址打开失败。",relayTunnelClientRouteLabel:"当前客户端链路",relayTunnelClientRouteAddressLabel:"当前客户端地址",relayTunnelClientRouteHintRelay:"当前客户端还在通过 CodingNS Connect 连接这台 Host;如果系统确认本地地址可达,会自动切到更省流量的直连链路。",relayTunnelClientRouteHintRelayProbing:"正在检查本地可直连地址。检查完成后,会自动切到更省流量的链路。",relayTunnelClientRouteHintLan:"当前客户端已经切到局域网直连,这条链路更省流量;远程访问地址仍然可以继续给外部设备使用。",relayTunnelClientRouteHintLoopback:"当前客户端直接连到这台设备的本机地址,不经过 CodingNS Connect。",relayTunnelClientRouteHintTailscale:"当前客户端已经切到 Tailscale 地址,不经过 CodingNS Connect。",relayTunnelClientRouteHintDirect:"当前客户端直接请求这个 Host 地址,不经过 CodingNS Connect。",relayTunnelReconnectAction:"重新连接",relayTunnelManageAccountAction:"管理账号",relayTunnelDisconnectDeviceAction:"注销设备",relayTunnelEnableToggleLabel:"启用 CodingNS Connect",relayTunnelConfigTitle:"CodingNS Connect 站点配置",relayTunnelConfigDescription:"这里填写 CodingNS Connect 接入地址和控制面的地址。保存后,下面的登录、绑定和流量操作都会走这里。",relayTunnelConfigErrorTitle:"服务地址保存失败",relayTunnelConfigNetworkError:"新的服务地址还没有保存到这台 Host,因为当前连不上它({address})。请先确认服务器地址和网络连接。",relayTunnelRelayBaseUrl:"CodingNS Connect 接入地址",relayTunnelControlBaseUrl:"控制站点地址",relayTunnelSaveConfig:"保存配置",relayTunnelRefresh:"刷新状态",relayTunnelAccountTitle:"CodingNS Connect 账号登录",relayTunnelAccountDescription:"使用 CodingNS Connect 账号登录后,可以绑定当前 Host 并查看剩余流量。",relayTunnelAccountEmail:"邮箱",relayTunnelAccountEmailPlaceholder:"输入你的邮箱",relayTunnelAccountPassword:"密码",relayTunnelAccountPasswordPlaceholder:"输入你的密码",relayTunnelLoginAccount:"登录",relayTunnelLoggedInAs:"当前已登录:{email}",relayTunnelConnectedBannerTitle:"账号已连接",relayTunnelConnectedBannerDescription:"现在可以打开 CodingNS Connect 开关,让外部设备访问这台 Host。",relayTunnelConnectedBannerActiveTitle:"CodingNS Connect 已开启",relayTunnelConnectedBannerActiveDescription:"这台设备已经可以通过 CodingNS Connect 从外部访问。",relayTunnelConnectedDevice:"当前设备:{name}",relayTunnelBoundDomain:"当前访问地址:{domain}",relayTunnelBindTitle:"绑定当前 Host",relayTunnelBindDescription:"绑定时会先读取当前 Host 的长期公钥,再把这台机器登记到 CodingNS Connect 站点。",relayTunnelHostLabelTitle:"设备名称",relayTunnelHostLabelDescription:"登录成功后,在这里填写你将来要使用的四级域名前缀,并检查这个名称当前能不能使用。",relayTunnelHostLabel:"Host 名称",relayTunnelHostLabelPlaceholder:"填写前缀",relayTunnelHostLabelSuffix:".channel.codingns.com",relayTunnelHostLabelCheck:"检查名称",relayTunnelHostLabelChecking:"正在检查这个名称是否可用。",relayTunnelHostLabelAvailable:"名称可用,公开访问地址将会是 {domain}",relayTunnelHostLabelReserved:"这个名称会命中保留前缀,请换一个名称。",relayTunnelHostLabelOccupied:"这个名称已经被占用,请换一个名称。",relayTunnelHostLabelUnavailable:"暂时无法确认这个名称是否可用,请稍后重试。",relayTunnelHostLabelRequired:"请先填写设备名称。",relayTunnelBindAction:"登录并绑定 Host",relayTunnelActionsTitle:"CodingNS Connect 开关",relayTunnelActionsDescription:"绑定完成后,可以在这里启用、停用或解绑 CodingNS Connect。",relayTunnelEnable:"启用 CodingNS Connect",relayTunnelDisable:"停用 CodingNS Connect",relayTunnelUnbind:"断开此设备",relayTunnelWalletTitle:"流量钱包",relayTunnelWalletDescription:"这里显示控制站点记录的总流量、已用流量和剩余额度。",relayTunnelTrafficGranted:"总流量",relayTunnelTrafficUsed:"已用流量",relayTunnelPackagesTitle:"流量套餐",relayTunnelPackagesDescription:"选择一个套餐后会跳转到官方支付页完成付款,支付成功后自动发放到当前账号钱包。",relayTunnelFeaturedPackage:"推荐",relayTunnelBuyPackage:"购买流量",relayTunnelOrdersTitle:"最近订单",relayTunnelOrdersDescription:"这里只显示最近几笔套餐订单,方便确认支付和到账状态。",relayTunnelOrderPending:"待支付",relayTunnelOrderPaid:"已支付",relayTunnelOrderExpired:"已过期",relayTunnelOrderFailed:"支付失败",relayTunnelControlBaseUrlRequired:"请先填写控制站点地址。",relayTunnelAccountRequired:"请先输入 CodingNS Connect 账号邮箱和密码。",relayTunnelIdentityUnavailable:"当前 Host 身份公钥还没有准备好,请稍后重试。",relayTunnelLoadFailed:"CodingNS Connect 状态读取失败。",relayTunnelPhaseDisabled:"未启用",relayTunnelPhaseBlockedUninitialized:"实例未初始化,已阻断暴露",relayTunnelPhaseUnbound:"还没有绑定",relayTunnelPhaseBinding:"正在绑定",relayTunnelPhaseConnecting:"正在连接",relayTunnelPhaseRunning:"运行中",relayTunnelPhaseQuotaExhausted:"流量耗尽",relayTunnelPhaseError:"状态异常",tailscaleBrand:"Tailscale",tailscaleSectionTitle:"Tailscale 接入",tailscaleSectionDescription:"让这台 Host 通过 Tailscale 在你的设备间可访问。",tailscaleMasterSwitchLabel:"启用 Tailscale",tailscaleActivationHint:"开启后才会检查 Tailscale 状态,并允许继续配置和绑定账号。",tailscaleCurrentState:"当前状态",tailscaleSwitchLabel:"启用开关",tailscaleStatusIndicator:"状态指示器",tailscaleServerAddress:"服务器地址",tailscaleAccountName:"账号名",tailscaleIpAddress:"IP 地址",tailscaleConfigure:"配置",tailscaleConfigModalTitle:"配置 Tailscale",tailscaleConfigModalDescription:"修改接入参数",tailscaleControlServer:"Control Server",tailscaleControlServerDescription:"留空时使用默认 control server。",tailscaleControlServerPlaceholder:"留空表示使用默认 control server",tailscaleHostname:"设备名称",tailscaleHostnameDescription:"可选。",tailscaleHostnamePlaceholder:"例如:codingns-host",tailscaleReachableBaseUrl:"外部访问地址",tailscaleTailnetFqdn:"Tailnet FQDN",tailscaleTailnetIpv4:"Tailnet IPv4",tailscaleTailnetIpv6:"Tailnet IPv6",tailscaleDetailAddresses:"详细地址",tailscaleRefresh:"刷新状态",tailscaleInstallAction:"安装 Tailscale",tailscaleInstallOpenFailed:"打开 Tailscale 安装页面失败。",tailscaleEnable:"启用 Tailscale",tailscaleDisable:"停用 Tailscale",tailscaleLogin:"开始绑定",tailscaleLogout:"解绑账号",tailscaleUnavailable:"暂不可用",tailscaleLoadFailed:"Tailscale 状态读取失败。",tailscalePhaseDisabled:"未启用",tailscalePhaseBlockedUninitialized:"实例未初始化,已阻断暴露",tailscalePhaseStarting:"正在启动",tailscalePhaseNeedsLogin:"等待绑定账号",tailscalePhaseRunning:"运行中",tailscalePhaseStopping:"正在停止",tailscalePhaseError:"状态异常",tailscaleOverviewDisabled:"当前还没有启用远程访问。",tailscaleOverviewBlockedUninitialized:"先完成初始化,再启用远程访问。",tailscaleOverviewStarting:"正在接入 Tailscale,请稍等。",tailscaleOverviewNeedsLogin:"启用完成后,还需要绑定账号。",tailscaleOverviewRunning:"当前实例已经可以通过 Tailscale 访问。",tailscaleOverviewStopping:"正在关闭远程访问。",tailscaleOverviewError:"远程访问状态异常,请先刷新或重新配置。",releaseChannel:"发布通道",releaseChannelDescription:"稳定版或测试版",releaseStable:"稳定版",releaseBeta:"测试版",autoReconnect:"自动重连",autoReconnectDescription:"当 Host 短暂不可达时,自动尝试恢复 HTTP 和 WebSocket 链路。",autoCheckUpdate:"自动检查客户端更新",autoCheckUpdateDescription:"仅客户端",defaultPermissionMode:"默认会话权限",defaultPermissionModeDescription:"控制新建和继续会话时默认使用的工具权限。完整权限会关闭询问,只适合你已经信任当前项目和运行环境时使用。",authDeviceManagement:"登录设备管理",authDeviceManagementDescription:"查看当前设备、其他在线设备和最近 10 条登录记录,并在主设备上按设备逐个退出其他在线设备。",authDeviceEntryHint:"点击“设备管理”后,可在弹窗中查看当前设备、其他在线设备和最近登录记录。",authDeviceOpenManager:"设备管理",authDeviceCurrentTitle:"当前设备",authDeviceOthersTitle:"其他在线设备",authDeviceRecentTitle:"最近登录记录",authDeviceCurrentTag:"当前设备",authDevicePrimaryTag:"主设备",authDeviceLegacyTag:"旧登录态",authDeviceLegacyHiddenHint:"检测到 {count} 条兼容旧登录态记录,默认已隐藏。",authDeviceLegacyReveal:"查看兼容记录",authDeviceLegacyHide:"隐藏兼容记录",authDeviceLegacyDevicesTitle:"兼容旧在线记录",authDeviceLegacyRecentTitle:"兼容旧登录记录",authDeviceLegacyLabel:"未知设备(旧登录态)",authDeviceClientDesktop:"Desktop",authDeviceClientWeb:"Web",authDeviceClientIos:"iOS",authDeviceClientAndroid:"Android",authDeviceClientUnknown:"未知设备",authDeviceCurrentEmpty:"当前登录态还没有可识别的设备信息,请重新登录后重试。",authDeviceOthersEmpty:"当前没有其他在线设备。",authDeviceRecentEmpty:"当前还没有最近登录记录。",authDeviceBrowserValue:"浏览器:{value}",authDeviceOsValue:"系统:{value}",authDeviceLastSeen:"最近在线:{value}",authDeviceLoginAt:"登录时间:{value}",authDeviceSourceAddressValue:"来源地址:{value}",authDeviceSourceAddressUnknown:"来源地址:未知",authDeviceEnablePrimary:"设为主设备",authDeviceDisablePrimary:"取消主设备",authDevicePrimaryUnavailable:"当前登录态缺少稳定设备标识,暂时不能设置主设备。",authDeviceLogoutOthers:"退出其他设备",authDeviceLogoutDevice:"退出设备",authDevicePrimaryEnabled:"当前设备已设为主设备。",authDevicePrimaryDisabled:"当前设备已取消主设备。",authDeviceLogoutOthersSuccess:"已退出其他设备,共处理 {count} 台。",authDeviceLogoutDeviceSuccess:"已退出设备“{device}”,共处理 {count} 个会话。",authDeviceLoadFailed:"登录设备信息加载失败。",authDeviceEnablePrimaryModalTitle:"设为主设备",authDeviceEnablePrimaryModalDescription:"请输入管理员密码,确认把当前设备设为主设备。",authDeviceDisablePrimaryModalTitle:"取消主设备",authDeviceDisablePrimaryModalDescription:"请输入管理员密码,确认取消当前设备的主设备状态。",authDevicePasswordLabel:"管理员密码",permissionModeDefault:"跟随 CLI 默认策略",permissionModeAcceptEdits:"允许编辑工作区,不询问",permissionModeBypassPermissions:"完整权限,不询问",enabled:"已启用",disabled:"已关闭",serverUpdate:"服务端更新",serverUpdateDescription:"",clientUpdate:"客户端更新",clientUpdateDescription:"",serverCurrentVersion:"服务端当前版本",serverTargetVersion:"服务端目标版本",serverPackageName:"npm 包名",serverUpdateCommand:"升级命令",serverCheckNow:"检查服务端",serverOpenPage:"打开 npm",serverLatestUnknown:"暂未获取",serverUpdateReady:"发现新版本",serverUpToDate:"已是最新版本",serverCheckFailed:"检查失败",serverInstallWarning:"安装更新会通过 PM2 自动重启 CodingNS 服务,连接会短暂中断。",serverInstallConfirmTitle:"安装服务端更新",serverInstallConfirmDescription:"继续后会先安装新版本,再由 PM2 自动重启当前 CodingNS 服务。",serverInstallConfirmAction:"继续安装并重启服务",serverRestarting:"更新已安装,正在重启 CodingNS 服务",serverOpenPageFailed:"打开页面失败",releaseCurrentVersion:"当前版本",releaseTargetVersion:"目标版本",releaseTargetTag:"目标 Tag",releasePublishedAt:"发布时间",releaseUnknownVersion:"未知",releaseNotes:"更新内容",releaseNotesEmpty:"暂无更新内容",releaseCheckNow:"检查客户端",releaseInstallNow:"安装更新",releaseOpenPage:"打开发布页",releaseRollback:"回退版本",releaseUpdateBadge:"新版本",releaseUpdateReady:"发现新版本",releaseUpToDate:"已是最新版本",releaseCheckFailed:"检查失败",releaseInstallerMissing:"有新版本,暂无安装包",releaseSignatureMissing:"有新版本,缺少校验信息",releaseInstallStarted:"安装已开始",releaseInstallFailed:"安装失败",releaseRestartRequired:"安装成功,请重启应用程序",releaseRestartDialogTitle:"安装成功",releaseRestartDialogDescription:"新版本 {version} 已安装完成,请重启应用程序后继续使用。",releaseRestartLater:"稍后",releaseRestartConfirm:"是,立即重启",releaseRestartFailed:"重启应用失败",releasePageOpenFailed:"打开页面失败",androidInstallerStarted:"已交给系统安装器,安装完成前你仍可以取消",androidInstallPermissionRequired:"请先允许当前应用安装未知来源应用",androidInstallCancelled:"安装已取消或未完成,可重新触发安装",androidInstallSucceeded:"已检测到新版本完成安装",releaseRollbackStarted:"已开始回退",releaseRollbackFailed:"回退失败",clientUpdateUnsupported:"当前不支持安装更新",logout:"退出登录"},home:{title:"从一条会话继续,而不是从后台表格开始",subtitle:"这里先挑一个工作区和会话,真正的工作区在下一步。",terminalsEntry:"进入终端页",workspaceSection:"工作区",sessionSection:"最近会话",emptyWorkspaces:"还没有导入工作区。先在 Host 侧导入后,这里会出现入口。",emptySessions:"当前工作区还没有可继续的会话。",noActivity:"暂时还没有活动"},terminal:{title:"终端",heroTitle:"把真实 PTY 留在 Host,把操作入口留在工作台",heroSubtitle:"这里不伪造输出,不把终端和进程搅在一起,只消费 Host 统一托管的真实终端流。",workspaceSection:"工作区与终端",workspaceField:"当前工作区",shellField:"新终端使用的 Shell",runtimeField:"Runtime",runtimeAutoOption:"自动选择",runtimeAutoShortLabel:"auto",runtimeAutoDescription:"按 Host 默认策略选择当前终端 runtime。",runtimePersistentLabel:"持久会话",runtimePersistentShortLabel:"持久",runtimeTmuxDescription:"持久化外部会话,适合需要后台常驻的开发终端。",runtimeWindowsPersistentDescription:"使用基于 ConPTY 的 Windows 持久化会话,让终端在 Host 重启后仍可继续保留。",runtimeEmbeddedDescription:"由当前 Host 直接托管,适合作为轻量回退方案。",runtimeConptyPowerShellLabel:"PowerShell 持久会话",runtimeConptyCmdLabel:"CMD 持久会话",runtimeConptyGitBashLabel:"Git Bash 持久会话",runtimeMissingDialogTitle:"当前系统没有安装 tmux",runtimeMissingDialogDescription:"tmux runtime 无法继续创建持久化终端。你可以先安装 tmux,或者临时切换到 embedded-pty 继续。",runtimeMissingInstallDescription:"建议优先安装 tmux,这样终端才能在 Host 重启后继续保留。",runtimeMissingInstallMacArm:"macOS(Apple Silicon / Homebrew):arch -arm64 brew install tmux",runtimeMissingInstallMacIntel:"macOS(Intel Mac / Homebrew):brew install tmux",runtimeMissingInstallDebian:"Ubuntu / Debian:sudo apt install tmux",runtimeMissingInstallFedora:"Fedora:sudo dnf install tmux",runtimeMissingFallbackDescription:"如果现在先切到 embedded-pty,本次终端可以继续创建,但它不会作为外部持久会话保留。",runtimeMissingKeepAction:"先不切换",runtimeMissingFallbackAction:"切换到 embedded-pty 并继续",runtimeMissingFallbackPending:"正在切换…",shellUnavailable:"当前不可用",workspaceLoadFailed:"工作区或终端列表暂时没有拉回来。",terminalSection:"终端实例",templateSection:"命令模板",stageEmptyTitle:"还没有选中终端",stageEmptySubtitle:"先创建一个终端,或者运行一个命令模板。",emptyTerminals:"当前工作区还没有终端实例。",emptyTemplates:"当前工作区还没有命令模板。",createButton:"新建终端",creating:"正在创建终端…",creationPendingDescription:"Host 正在启动真实 PTY,连上以后这个窗口会立刻接管显示。",defaultTerminalName:"工作终端",created:"终端已经创建并接入 Host。",createFailed:"终端创建失败。",closeButton:"关闭终端",closing:"正在关闭终端…",closed:"终端关闭请求已经提交。",closeCompleted:"终端已关闭。",closePendingDescription:"关闭请求已经发给 Host,前台不会阻塞,系统会继续同步最终结果。",closeSyncDelayed:"Host 还在后台处理关闭,列表会在后续刷新时继续同步。",closeFailed:"终端关闭失败。",inputLabel:"向当前终端发送命令",inputPlaceholder:"例如:pnpm test",sendButton:"发送到终端",inputFailed:"终端输入发送失败。",outputEmpty:"终端已经连上,但暂时还没有输出。",outputTruncated:"断线期间有一段输出超出缓存窗口,当前只补回了仍保留的部分。",connectedHint:"当前输出来自 Host 真实 PTY 流。",moreActions:"终端操作",duplicateAction:"复制标签",duplicateSuccess:"已按当前终端配置新建一个标签。",duplicateFailed:"复制终端标签失败。",disconnectAction:"断开",disconnected:"终端连接已断开。",reconnectAction:"重连",reconnectRequested:"终端重连请求已发出。",deleteAction:"删除",deleting:"正在删除终端…",deleted:"终端记录已删除。",deletePendingDescription:"删除请求已经发给 Host,前台不会阻塞,系统会在后台继续同步列表。",deleteSyncDelayed:"Host 还在后台处理删除,列表会在后续刷新时继续同步。",deleteFailed:"终端记录删除失败。",closePendingBadge:"关闭中",deletePendingBadge:"删除中",pinAction:"固定",unpinAction:"取消固定",zoomLabel:"终端缩放",zoomInAction:"放大终端显示",zoomOutAction:"缩小终端显示",zoomResetAction:"恢复默认缩放",openExternalAction:"独立窗口",openExternalFailed:"打开终端独立窗口失败。",toolbarToggleAction:"展开终端工具菜单",mobileSwipeHint:"左右滑动切换终端",mobileSwipePosition:"{current} / {total}",mobileDrawerAction:"打开快捷终端列表",mobileDrawerTitle:"快捷终端",mobileDrawerDescription:"右滑呼出列表,点一下就切到别的终端。",mobilePinnedSectionTitle:"已固定终端",mobileDrawerEmptyTitle:"当前还没有终端",mobileDrawerEmptyDescription:"先新建一个终端,这里才会出现可切换的列表。",mobileCreateSheetTitle:"新建终端",mobileCreateShellLabel:"终端类型",mobileCreateShellDescription:"先选这次要开的 Shell,别把桌面端那套下拉框搬到手机上。",mobileCreateRuntimeLabel:"会话方式",mobileCreateRuntimeDescription:"再决定它是持久保留,还是只作为当前 runtime 会话。",mobileCreateLoadingShells:"正在读取当前系统可用的终端类型…",mobileCreateConfirm:"创建这个终端",createDialogTitle:"新建终端",createDialogShellDescription:"先选这次要开的 Shell,再创建终端。Windows 下不再偷偷按默认值直接起。",createDialogRuntimeDescription:"再决定它是持久保留,还是只作为当前 runtime 会话。",createDialogConfirm:"创建终端",mobileRuntimePersistentTitle:"持久会话",mobileRuntimePersistentDescription:"适合需要一直挂着的开发终端,创建后会作为可恢复会话保留。",mobileRuntimeSessionTitle:"runtime(当前会话)",mobileRuntimeSessionDescription:"直接由当前 Host 托管,创建更轻,但不会保留成外部持久会话。",mobileWorkspaceSwitcherPlaceholder:"选择项目",mobileEmptyTitle:"这里还没有终端内容",mobileEmptyDescription:"先新建一个终端,或者右滑呼出快捷列表,切到当前工作区已有的终端。",layoutLabel:"分栏布局",layoutSingleAction:"单栏显示",layoutVerticalAction:"左右分栏",layoutHorizontalAction:"上下分栏",saveLogAction:"保存日志",saveLogSuccess:"终端日志已保存。",saveLogFailed:"终端日志保存失败。",logEmpty:"当前终端还没有可保存的日志内容。",bindToPaneAction:"绑定到当前分栏",bindToPrimaryPaneAction:"绑定到主分栏",bindToSecondaryPaneAction:"绑定到副分栏",panePrimary:"主分栏",paneSecondary:"副分栏",splitEmptySubtitle:"先点一个标签,或者新建一个终端,把它绑定到当前分栏。",statusBadge:{creating:"启动中",running:"运行中",closed:"已关闭",error:"异常"},recoveryComplete:"已回到刷新前的终端,缓存内的关键输出已经补回。",recoveryTruncated:"已恢复到上一个终端,但断线期间的部分输出已经超出缓存窗口。",recoveryIdleClosed:"上一个终端已因空闲超时被 Host 自动关闭,你现在看到的是关闭前保留的输出。",reconnect:"手动重连",liveConnected:"实时流已接入",templateName:"模板名称",templateCommand:"主命令",templateArgs:"参数(空格分隔)",templateCreateButton:"保存模板",templateCreated:"命令模板已经保存。",templateCreateFailed:"命令模板保存失败。",templateRunSent:"命令模板已经发送到当前终端。",templateRunCreatedTerminal:"命令模板已在新终端中启动。",templateRunFailed:"命令模板执行失败。",connection:{connected:"已连接",reconnecting:"正在重连",reconnect_failed:"重连失败",closed:"已关闭"}},conversation:{titleFallback:"继续对话",historyLoading:"正在从 Host 拉取消息历史…",historyLoadingOlder:"正在加载更早的消息…",historyLoadFailed:"历史消息暂时没有拉回来,可以稍后再试。",timelineEmpty:"这条会话还没有消息。你发出的第一句话会直接进入 Host 链路。",turnAbortedUser:"上一轮已由你手动停止。",turnAbortedUnexpected:"上一轮意外中断,没有正常结束。",turnAbortedGeneric:"上一轮已中断,没有正常结束。",scrollToBottomAction:"回到底部",rawRefLabel:"来源",copyAction:"复制",copyContentSuccess:"内容已复制。",copyContentFailed:"内容复制失败。",selectionTodoAction:"代办",selectionActionButton:"操作",selectionActionSubmit:"新开操作子会话",selectionActionPromptLabel:"你想让它做什么",selectionActionPromptPlaceholder:"比如:解释这段话、整理成笔记,或调用指定接口处理它",selectionActionIncludeContext:"包含当前上下文",selectionActionContextUnavailable:"当前选区跨了多条消息,没法安全继承上下文,只能按无上下文新建子会话。",selectionActionDefaultPrompt:"请处理这段内容。",selectionActionPreviewLabel:"已选内容",selectionActionTargetLabel:"新会话设置",selectionActionQuotedLabel:"选中文本",selectionActionFailed:"创建操作子会话失败。",actionSessionBadge:"操作",actionInheritedSelectionSummary:"已默认折叠来自“{parentTitle}”的一段选中文本。",forkFromHereAction:"从这里分叉",forkingAction:"正在分叉…",forkMessageSucceeded:"已从这条消息创建新分支。",forkMessageFailed:"从这条消息分叉失败。",forkDraftLabel:"分叉引用",forkDraftEmpty:"这条消息没有可引用的文本内容。",forkDraftClear:"取消这次分叉引用",forkTargetProviderLabel:"目标 CLI",forkTargetModelLabel:"目标模型",forkTargetSummary:"源 CLI:{sourceProvider} · 目标 CLI:{targetProvider}",forkInlineModelLoading:"正在读取模型列表…",forkInlineNativeHint:"保持同一 CLI,继续走原生分叉。",forkInlineCrossHint:"已切到不同 CLI,将按文本历史重建新会话。",forkSwitchConfirmTitle:"切换到其他 CLI?",forkSwitchConfirmDescription:"同一 CLI 会尽量保留原生分叉体验;切到其他 CLI 会改成跨供应商分叉。",forkSwitchConfirmKeepTitle:"会保留",forkSwitchConfirmKeepBody:"分叉点之前的用户消息和助手文本。",forkSwitchConfirmConvertTitle:"会转换",forkSwitchConfirmConvertBody:"可继承文本会重建到新的 CLI 会话里。",forkSwitchConfirmDropTitle:"会丢失",forkSwitchConfirmDropBody:"工具调用、权限交互、附件和运行中状态。",forkSwitchConfirmAction:"确认切换",forkSwitchKeepNative:"保持原生",forkProviderNativeUnsupported:"当前 provider 还不支持原生 fork",forkProviderReconstructedUnsupported:"当前 provider 还不能作为跨 provider 分叉目标",loadMore:"加载更多消息",composerPlaceholder:"把下一步交代清楚,剩下的交给这条会话继续跑。",sendButton:"发送消息",queueTitle:"待发队列",queueDescription:"当前这轮结束后,队列里的消息会按顺序自动继续处理。",queueOrderPrefix:"队列序号",queueStatusQueued:"等待中",queueStatusFailed:"发送失败",queueDelete:"删除",queueDeleting:"删除中",queueImageOnly:"仅图片附件",sendGuidanceButton:"追加引导",queueGuidanceButton:"加入队列",queueSteer:"引导",queueSteering:"引导中",resendButton:"重试发送",quickPhraseTrigger:"快捷短语",quickPhraseModalTitle:"快捷短语",quickPhraseModalDescription:"这里集中管理你常用的会话指令,点一下就能直接填回当前输入框。",quickPhraseCreateLabel:"新增短语",quickPhraseOpenCreateAction:"新增短语",quickPhraseCreateModalTitle:"新增快捷短语",quickPhraseCreateModalDescription:"把常用指令单独存起来,后面在任何设备上都能直接复用。",quickPhraseCreatePlaceholder:"输入一条常用短语,保存后下次可以直接复用。",quickPhraseCreateAction:"添加短语",quickPhraseListLabel:"快捷短语列表",quickPhraseEmpty:"还没有可用的快捷短语,先加一条最常用的。",quickPhraseOrderLabel:"第 {index} 条",quickPhraseMoveUp:"上移短语",quickPhraseMoveDown:"下移短语",quickPhraseDelete:"删除短语",quickPhraseSaveFailed:"快捷短语保存失败,请稍后再试。",sendingState:"发送中",sentState:"已同步",failedState:"发送失败",contextUsageTitle:"当前上下文占用",contextUsageUnavailable:"当前上下文占用暂时不可用",contextUsageEstimated:"上限为估算值",contextUsageCachedTokens:"缓存命中 {count}",contextUsageSourceProviderLog:"上限来自 provider 运行日志",contextUsageSourceProviderRuntime:"上限来自 provider runtime",contextUsageSourceProviderConfig:"上限来自 provider 配置",contextUsageSourceModelMap:"上限来自模型映射",headerWorkspace:"工作区",headerProvider:"Provider",headerCapability:"能力摘要",connectionConnected:"已连接",connectionReconnecting:"正在重连",connectionReconnectFailed:"重连失败",connectionClosed:"连接已关闭",runtimeErrorTitle:"会话运行失败",reconnectExplain:"实时链路断开了,系统正在补回缺失消息。",reconnectFailedExplain:"自动恢复没有成功。你可以手动重试,或者稍后重新进入会话。",reconnectExplainWithRoute:"实时链路断开了,系统正在补回缺失消息。当前连接方式:{route}。",reconnectFailedExplainWithRoute:"自动恢复没有成功。你可以手动重试,或者稍后重新进入会话。当前连接方式:{route}。",capabilityDenied:"当前会话不支持这个动作",capabilitySendDisabled:"当前 provider 不支持发送新消息",capabilityAttachmentDisabled:"当前会话还不支持附件输入",capabilityInterruptDisabled:"当前会话不支持中断运行",sidebarTitle:"当前会话上下文",sidebarSubtitle:"这里只保留最小能力摘要,不把页面做成后台控制台。",reconnectButton:"手动恢复实时同步",headerResumedAt:"最近续接",headerLastSyncAt:"最近同步",historyPages:"历史分页",syncStatusIdle:"同步空闲",syncStatusSyncing:"同步中",syncStatusError:"同步异常",capabilityResume:"可续接",capabilitySend:"可发送",capabilityInterrupt:"可中断",capabilityTools:"工具调用",attachmentsLabel:"附件",filePanelTitle:"文件管理",filePanelSubtitle:"这里的文件能力只服务当前会话,不把页面拉成重型 IDE。",filePanelNoWorkspace:"当前还没有选中项目,暂时不能浏览或挂载文件。",filePanelRefresh:"刷新",filePanelCopyPath:"复制路径",filePanelCopyAbsolutePath:"复制绝对路径",filePanelCopyRelativePath:"复制相对路径",filePanelCopyAbsolutePathSuccess:"绝对路径已复制。",filePanelCopyRelativePathSuccess:"相对路径已复制。",filePanelCopyPathFailed:"路径复制失败。",filePanelCopy:"复制",filePanelCut:"剪切",filePanelPaste:"粘贴",filePanelCopySelectionSuccess:"已复制 {count} 项,可到目标目录粘贴。",filePanelCutSelectionSuccess:"已剪切 {count} 项,可到目标目录粘贴。",filePanelPasteSuccess:"已粘贴 {count} 项。",filePanelPasteFailed:"粘贴失败,请检查目标目录和重名冲突。",filePanelSelectionCount:"已选 {count} 项",filePanelClipboardCopyReady:"剪贴板中有 {count} 个待复制项目",filePanelClipboardCutReady:"剪贴板中有 {count} 个待移动项目",filePanelOpenFile:"打开文件",filePanelExpandDirectory:"展开文件夹",filePanelCollapseDirectory:"折叠文件夹",filePanelActionsMenu:"文件操作",filePanelSearchPlaceholder:"输入文件名或路径片段",filePanelSearchButton:"搜索",filePanelShowSearch:"打开搜索",filePanelHideSearch:"收起搜索",filePanelSearchEmpty:"没有找到匹配的文件。",filePanelSearchResults:"搜索结果",filePanelSearchFailed:"文件搜索失败,请稍后再试。",filePanelBrowse:"工作区文件",filePanelCollapseCurrent:"折叠当前选中",filePanelCollapseAll:"全部折叠",filePanelBackDirectory:"返回上级",filePanelEmptyDirectory:"这个目录里暂时没有可显示的文件。",filePanelRecentTitle:"最近打开",filePanelEmptyRecent:"最近还没有打开记录。",filePanelContextTitle:"已挂载文件",filePanelEmptyContexts:"当前会话还没有挂载文件管理。",filePanelEditorTitle:"预览与编辑",filePanelEditorPlaceholder:"这里只做轻量文本编辑,不在这里做完整 IDE。",filePanelSelectHint:"先从目录、搜索或最近打开里选一个文件。",filePanelUnsupported:"这个文件当前不能在侧栏里直接编辑。",filePanelAttach:"挂到会话",filePanelAttached:"已挂载",filePanelDetach:"解绑",filePanelSave:"保存",filePanelSaving:"保存中",filePanelLoadFailed:"文件管理面板加载失败。",filePanelOpenFailed:"文件打开失败。",filePanelSaveSuccess:"文件已经保存。",filePanelSaveFailed:"文件保存失败。",fileViewerHint:"当前以 {language} 模式打开,支持预览与编辑保存。",fileViewerModeLabel:"文件查看模式",fileViewerPreview:"预览",fileViewerCode:"代码",fileViewerEdit:"编辑",fileViewerPlainText:"纯文本",fileViewerImage:"图片",fileViewerPdf:"PDF",fileViewerRefreshPreview:"刷新",fileViewerRefreshFailed:"文件预览刷新失败。",fileViewerOpenExternal:"外部打开",fileViewerOpenExternalFailed:"外部打开失败。",fileViewerZoomIn:"放大",fileViewerZoomOut:"缩小",fileViewerFit:"适配",fileViewerActualSize:"原始大小",fileViewerFitWidth:"适宽",fileViewerPreviousPage:"上一页",fileViewerNextPage:"下一页",fileViewerPageIndicator:"第 {page} 页",fileViewerSizeLabel:"查看器尺寸",fileViewerSizeDefault:"默认",fileViewerSizeWide:"加宽",fileViewerSizeFull:"铺满",fileViewerImageUnavailable:"当前无法显示图片预览,请尝试刷新或外部打开。",fileViewerPdfUnavailable:"当前无法显示 PDF 预览,请尝试刷新或外部打开。",fileViewerEnterFullscreen:"全屏",fileViewerExitFullscreen:"退出",fileViewerOpenInBrowser:"在浏览器中打开",fileViewerOpenInBrowserFailed:"打开浏览器预览失败。",fileViewerHtmlPreviewLoading:"正在加载 HTML 预览...",fileViewerHtmlPreviewUnavailable:"当前无法显示 HTML 预览,请先切到代码模式查看。",fileViewerHtmlPreviewFailed:"HTML 预览链接生成失败。",filePanelAttachSuccess:"文件已经挂到当前会话。",filePanelAttachFailed:"文件挂载失败。",filePanelDetachSuccess:"文件已经从当前会话解绑。",filePanelDetachFailed:"文件解绑失败。",filePanelNewFile:"新建文件",filePanelNewDirectory:"新建目录",filePanelUpload:"上传文件",filePanelDownload:"下载文件",filePanelUploadSuccess:"已上传 {name}。",filePanelUploadFailed:"文件上传失败。",filePanelDownloadSuccess:"已开始下载 {name}。",filePanelDownloadFailed:"文件下载失败。",filePanelDelete:"删除",filePanelDeleting:"删除中...",filePanelDeleteSuccess:"已删除 {name}。",filePanelDeleteConfirmTitle:"确认删除",filePanelDeleteConfirmDescription:"删除后会立即从当前项目移除,这一步不能撤销。",filePanelDeleteSelectionConfirm:"确认删除选中的 {count} 项吗?",filePanelDeleteSelectionSuccess:"已删除 {count} 项。",filePanelRenameMove:"重命名/移动",filePanelRenameSuccess:"已重命名为 {name}。",filePanelMutateFailed:"文件操作失败,请检查路径和当前状态。",filePanelCreateFilePrompt:"输入要创建的相对文件路径",filePanelCreateDirectoryPrompt:"输入要创建的相对目录路径",filePanelCreateFileDescription:"输入工作区内的相对路径,文件会立刻创建出来。",filePanelCreateDirectoryDescription:"输入工作区内的相对路径,文件夹会立刻创建出来。",filePanelPathFieldLabel:"相对路径",filePanelPathFieldPlaceholder:"例如 src/features/files/index.ts",filePanelCreateFileSubmit:"创建文件",filePanelCreateDirectorySubmit:"创建文件夹",filePanelCreatingFile:"创建文件中...",filePanelCreatingDirectory:"创建文件夹中...",filePanelFilterChanges:"仅显示变更",filePanelShowAll:"显示全部",filePanelNoChanges:"当前没有变更文件。",filePanelBinaryPreview:"二进制文件不支持预览。",filePanelDeleteFileConfirm:"确认删除这个文件吗?{path}",filePanelDeleteDirectoryConfirm:"确认删除这个文件夹吗?{path}",filePanelRenameMovePrompt:"输入新的相对路径",filePanelRenameDescription:"只改路径,不改文件内容。填新路径就会同时支持移动目录层级。",filePanelRenameSubmit:"确认重命名",filePanelRenaming:"重命名中...",unavailableAction:"当前不可用",roleUser:"你",roleAssistant:"助手",roleTool:"工具",roleSystem:"系统"},git:{title:"Git 上下文",subtitle:"这里是会话侧边的辅助区,只处理当前工作区里的 Git 事实。",loading:"正在读取当前工作区的 Git 上下文。",refresh:"刷新",panelLoadFailed:"Git 上下文暂时没有加载出来。",uninitializedTitle:"当前目录还没有启用 Git",uninitializedDescription:"先初始化这个目录的 Git 工作区,后面才能查看改动、写提交和追踪历史。",initRepository:"初始化 Git 工作区",initInProgress:"正在初始化…",initSuccess:"Git 工作区已初始化。",initFailed:"初始化 Git 工作区失败。",ahead:"领先",behind:"落后",dirty:"有改动",clean:"已干净",changeCount:"当前有 {count} 个变更文件",noChanges:"当前没有待处理改动。",changesTitle:"当前变更",rulesFirstHint:"规则先于生成,草稿不能绕过校验。",stage:"暂存",unstage:"取消暂存",preview:"预览",stageFailed:"暂存操作失败。",diffTitle:"差异预览",diffLoadFailed:"差异内容暂时没有拉回来。",binaryDiff:"这个文件是二进制改动,侧栏不直接展示内容。",stagedDiff:"暂存区 diff",worktreeDiff:"工作区 diff",emptyDiff:"当前没有可展示的文本差异。",diffTruncated:"差异内容过长,已经做了截断保护。",commitTitle:"提交草稿",defaultRuleName:"默认提交规则",language:"语言",maxLength:"长度",bodyRequired:"正文必填",bodyOptional:"正文可选",issueRequired:"Issue 必填",issueOptional:"Issue 可选",commitSubject:"提交标题",commitSubjectPlaceholder:"在这里输入提交信息",commitBody:"提交正文",commitBodyPlaceholder:"把这次改动说清楚,别写空话。",commitFooter:"提交脚注",commitFooterPlaceholder:"例如:Refs: #123",generateDraft:"AI 起草",validate:"校验草稿",commit:"执行提交",draftFailed:"提交草稿生成失败。",validateFailed:"提交规则校验失败。",commitFailed:"提交失败。",commitSuccess:"提交已经写入当前仓库。",validationPassed:"规则校验通过,可以继续提交。",validationFailed:"规则校验没有通过,先把下面的问题修掉。",branchTitle:"分支",branchPlaceholder:"输入要切换或创建的分支名",switchBranch:"切换",createBranch:"新建",branchFailed:"分支操作失败。",historyTitle:"最近历史",historyHint:"只放最近几条,不做图形历史树。",noHistory:"当前没有可展示的提交历史。",viewAllVersions:"查看所有版本",viewAllVersionsDescription:"这里展示当前仓库已加载的版本历史,共 {count} 条。",viewCommitChanges:"查看更改文件与 DIFF",copyCommitMessage:"复制提交信息",copyCommitMessageSuccess:"提交信息已复制。",copyCommitVersion:"复制 Git 版本号",copyCommitVersionSuccess:"Git 版本号已复制。",commitDetailTitle:"版本详情",commitDetailDescription:"当前查看提交 {hash} 的完整改动。",commitDetailLoading:"正在读取提交详情…",commitDetailEmpty:"当前没有可展示的提交详情。",commitDetailLoadFailed:"提交详情暂时没有拉回来。",commitVersionLabel:"Git 版本号",commitHashLabel:"提交 Hash",commitAuthorLabel:"作者",commitTimeLabel:"提交时间",commitMessageLabel:"提交信息",changedFilesTitle:"变更文件",commitDiffLabel:"提交 DIFF",renamedFromLabel:"从 {path} 重命名",explainCommitTitle:"解释版本更改",explainCommitDescription:"先选择一个 CLI 供应商,再新建会话分析这个提交。",explainCommitAction:"解释更改",startExplainCommit:"开始解释",explainCommitStarted:"解释会话已经创建。",explainCommitFailed:"解释更改失败。",remoteTitle:"远程同步",remoteReady:"当前仓库已配置远程。",remoteMissing:"当前仓库还没有远程。",fetch:"Fetch",pull:"Pull",push:"Push",pushNow:"立即推送",publish:"Publish",remoteFailed:"远程同步失败。",remoteAuthAction:"远程认证",remoteAuthTitle:"设置远程仓库认证",remoteAuthDescription:"需要认证的远程仓库,在这里填写本次页面会话使用的用户名、密码或 token。",remoteAuthDescriptionGithub:"检测到当前远程仓库来自 GitHub。GitHub 的 HTTPS Git 操作请使用 Personal Access Token (PAT),不要填写 GitHub 登录密码。",remoteAuthStatusLabel:"认证状态",remoteAuthConfigured:"已配置",remoteAuthNotConfigured:"未配置",remoteAuthGithubPatLabel:"Personal Access Token (PAT)",remoteAuthGithubPatPlaceholder:"输入 GitHub PAT",remoteAuthGithubUsernamePlaceholder:"输入 GitHub 用户名",remoteAuthGithubPatHint:"GitHub 不支持用账号密码做 Git HTTPS 认证。basic 模式请填写 GitHub 用户名 + PAT;token 模式可以直接填写 PAT。",remoteAuthRemember:"记住账号密码到 Host",remoteAuthSessionHint:"默认只在当前页面会话里生效;勾选“记住账号密码到 Host”后,远程同步成功时会写到 Host,后续自动复用。",remoteAuthRememberHint:"勾选记住后,本次远程同步成功时会把认证写到 Host。",remoteAuthSave:"保存认证",remoteAuthSaved:"远程仓库认证已保存,请重新执行同步。",remoteAuthCleared:"已清除当前页面会话里的远程认证设置。",selectRemoteTitle:"选择推送仓库",selectRemoteDesc:"勾选要推送到的远程仓库,支持多选。",noRemotes:"当前仓库没有配置任何远程仓库。",pushSelected:"推送 ({count})",pushing:"推送中…",pushAllSuccess:"已成功推送到 {count} 个远程仓库。",errors:{unauthorized:"当前登录态已经失效,请重新登录后再试。",workspaceNotFound:"当前会话绑定的工作区不存在,先确认工作区是否还可用。",invalidWorkspace:"当前工作区配置无效,Git 侧栏不能脱离仓库根目录执行。",notGitRepository:"当前工作区不是 Git 仓库,Git 侧栏不会伪造状态。",repoNotFound:"当前工作区找不到可用的 Git 仓库根目录。",pathOutOfWorkspace:"Git 目标超出了当前工作区仓库边界,操作已被拦截。",invalidTarget:"Git 目标路径无效,请先刷新侧栏后重试。",notStaged:"目标文件还不在暂存区里,先确认当前变更状态。",emptyStagedChanges:"暂存区为空,先把要提交的改动放进暂存区。",branchConflict:"当前分支存在冲突或不是快进更新,先同步并处理差异。",branchNotFound:"目标分支不存在,先确认分支名是否正确。",remoteNotFound:"当前仓库还没有可用的 origin 远程,先配置远程再同步。",remoteAuthFailed:"远程仓库认证失败,请先确认当前仓库凭据可用。",pushFailed:"推送失败,请先检查远程状态和本地提交。",pullFailed:"拉取失败,请先确认远程分支状态。",remoteFailed:"远程同步失败,请检查 Git 输出和网络状态。",initFailed:"Git 工作区初始化失败,请确认当前目录可写且 Git 可用。",commitValidationFailed:"提交草稿还没通过规则校验,先把校验问题修掉。",commandTimeout:"Git 操作超时了,先确认仓库状态和网络环境。"}}},Ml="default-host";function wd(o){return!!(o&&"discoveryKey"in o&&typeof o.discoveryKey=="string")}function xh(o,i){var a;return i?o.hosts.find(c=>c.id===i)??((a=o.discoveredHosts)==null?void 0:a.find(c=>c.id===i))??null:null}function Mh(o,i){var a;return i?o.hosts.find(c=>c.baseUrl===i)??((a=o.discoveredHosts)==null?void 0:a.find(c=>c.baseUrl===i))??null:null}function mo(o){var i,a,c,d;return o.activeDiscoveredHostId&&((i=o.discoveredHosts)!=null&&i.some(p=>p.id===o.activeDiscoveredHostId))?o.activeDiscoveredHostId:o.activeHostId&&o.hosts.some(p=>p.id===o.activeHostId)?o.activeHostId:((a=o.hosts[0])==null?void 0:a.id)??((d=(c=o.discoveredHosts)==null?void 0:c[0])==null?void 0:d.id)??null}function Cn(o){return xh(o,mo(o))}function Nh(o){var i;return((i=Cn(o))==null?void 0:i.baseUrl)??null}function Hh(o){return o==="http:"||o==="https:"}function Be(o){const i=o.trim();if(!i)throw new Error("EMPTY_SERVER_URL");const a=/^[a-zA-Z][a-zA-Z\d+.-]*:\/\//.test(i)?i:`http://${i}`,c=new URL(a);if(!Hh(c.protocol))throw new Error("INVALID_SERVER_PROTOCOL");c.hash="",c.search="";const d=c.pathname.replace(/\/+$/,"");return`${c.origin}${d==="/"?"":d}`}const yt="codingns.auth.remembered-login";function Gr(){return typeof window<"u"&&typeof window.localStorage<"u"}function Gb(o){return o.isNativeMobile?!0:o.isDesktop?o.ui.osFamily==="windows"||o.ui.osFamily==="macos":!1}function Uh(o){const i={credentials:null,legacyServerBaseUrl:null};if(!Gr())return i;const a=window.localStorage.getItem(yt);if(!a)return i;try{const c=JSON.parse(a);if(Nl(c))return{credentials:o?c[o]??null:null,legacyServerBaseUrl:null};const d=kd(c);if(!d||!o)return{credentials:null,legacyServerBaseUrl:(d==null?void 0:d.serverBaseUrl)??null};const p={hostId:o,username:d.username,password:d.password,savedAt:Date.now()},w={[o]:p};return window.localStorage.setItem(yt,JSON.stringify(w)),{credentials:p,legacyServerBaseUrl:d.serverBaseUrl}}catch{return window.localStorage.removeItem(yt),i}}function Kb(o){return Uh(o).credentials}function Qb(o){if(!Gr())return;const i=vd(),a={hostId:o.hostId,username:o.username.trim(),password:o.password,savedAt:Date.now()};!a.hostId||!a.username||!a.password||window.localStorage.setItem(yt,JSON.stringify({...i,[a.hostId]:a}))}function Bh(o){if(!Gr())return;const i=window.localStorage.getItem(yt);if(i)try{const a=JSON.parse(i);if(Nl(a))return;const c=kd(a);if(!c){window.localStorage.removeItem(yt);return}window.localStorage.setItem(yt,JSON.stringify({...c,serverBaseUrl:Be(o)}))}catch{window.localStorage.removeItem(yt)}}function $b(o){if(!Gr()||!o)return;const i=vd();if(!i[o])return;const a={...i};if(delete a[o],Object.keys(a).length===0){window.localStorage.removeItem(yt);return}window.localStorage.setItem(yt,JSON.stringify(a))}function vd(){if(!Gr())return{};const o=window.localStorage.getItem(yt);if(!o)return{};try{const i=JSON.parse(o);return Nl(i)?i:{}}catch{return{}}}function Nl(o){return typeof o!="object"||o===null||Array.isArray(o)?!1:Object.values(o).every(i=>Oh(i))}function Oh(o){if(typeof o!="object"||o===null)return!1;const i=o;return typeof i.hostId=="string"&&typeof i.username=="string"&&typeof i.password=="string"&&typeof i.savedAt=="number"&&i.username.trim().length>0&&i.password.length>0}function kd(o){if(typeof o!="object"||o===null)return null;const i=o;if(typeof i.username!="string"||typeof i.password!="string"||typeof i.serverBaseUrl!="string")return null;const a=i.username.trim(),c=i.password,d=Be(i.serverBaseUrl);return!a||!c?null:{username:a,password:c,serverBaseUrl:d}}function Cd(o={}){return{x:o.x??null,y:o.y??null,width:o.width??1200,height:o.height??780,minWidth:o.minWidth??720,minHeight:o.minHeight??480}}function Yb(o){return{windowId:o.windowId,kind:o.kind,workspaceId:o.workspaceId??null,workspaceName:o.workspaceName??null,sessionId:o.sessionId??null,mode:o.mode??"docked",bounds:Cd(o.bounds),focusOwner:o.focusOwner??null}}function Zn(o){return{...o,bounds:{...o.bounds}}}function _h(o){return{descriptors:Object.fromEntries(Object.entries(o.descriptors).map(([a,c])=>[a,Zn(c)])),openWindowIds:[...o.openWindowIds],lastActiveWindowId:o.lastActiveWindowId}}function $u(){return{descriptors:{},openWindowIds:[],lastActiveWindowId:null}}function Wh(o,i){return{...o,...i,windowId:o.windowId,bounds:Cd({...o.bounds,...i.bounds})}}class jh{constructor(){L(this,"state",$u());L(this,"listeners",new Set);L(this,"subscribe",i=>(this.listeners.add(i),()=>{this.listeners.delete(i)}));L(this,"getState",()=>_h(this.state))}registerDescriptor(i){const a=Zn(i),c=this.state.openWindowIds.includes(a.windowId);return this.state={...this.state,descriptors:{...this.state.descriptors,[a.windowId]:a},lastActiveWindowId:c?a.windowId:this.state.lastActiveWindowId},this.emit(),Zn(a)}updateDescriptor(i,a){const c=this.state.descriptors[i];if(!c)return null;const d=Wh(c,a);return this.state={...this.state,descriptors:{...this.state.descriptors,[i]:d}},this.emit(),Zn(d)}getDescriptor(i){const a=this.state.descriptors[i];return a?Zn(a):null}getWindows(){return Object.values(this.state.descriptors).map(i=>({descriptor:Zn(i),isOpen:this.state.openWindowIds.includes(i.windowId)}))}markWindowOpen(i){if(!this.state.descriptors[i])return!1;const a=this.state.openWindowIds.filter(c=>c!==i);return this.state={...this.state,openWindowIds:[...a,i],lastActiveWindowId:i},this.emit(),!0}markWindowClosed(i){if(!this.state.openWindowIds.includes(i))return!1;const a=this.state.openWindowIds.filter(c=>c!==i);return this.state={...this.state,openWindowIds:a,lastActiveWindowId:this.state.lastActiveWindowId===i?a.at(-1)??null:this.state.lastActiveWindowId},this.emit(),!0}isWindowOpen(i){return this.state.openWindowIds.includes(i)}removeWindow(i){if(!this.state.descriptors[i])return!1;const a={...this.state.descriptors};delete a[i];const c=this.state.openWindowIds.filter(d=>d!==i);return this.state={descriptors:a,openWindowIds:c,lastActiveWindowId:this.state.lastActiveWindowId===i?c.at(-1)??null:this.state.lastActiveWindowId},this.emit(),!0}clear(){const i=this.state.openWindowIds.length>0||this.state.lastActiveWindowId!==null||Object.keys(this.state.descriptors).length>0;this.state=$u(),i&&this.emit()}emit(){for(const i of this.listeners)i()}}function zh(){return new jh}const Tl=zh();function Vh(){return Tl}function Zb(o){return Ne.useSyncExternalStore(Tl.subscribe,()=>o(Tl.getState()))}const qh=Vh();function Dd(){return typeof window<"u"&&typeof window.__TAURI_INTERNALS__<"u"}function Td(){var p,w;if(typeof navigator>"u")return"unknown";const o=navigator.userAgent.toLowerCase(),i=navigator.userAgentData,a=((p=i==null?void 0:i.platform)==null?void 0:p.toLowerCase())??((w=navigator.platform)==null?void 0:w.toLowerCase())??"",c=`${a} ${o}`,d=a.includes("mac")&&navigator.maxTouchPoints>1;return c.includes("android")?"android":c.includes("iphone")||c.includes("ipad")||c.includes("ipod")||d?"ios":c.includes("mac")?"macos":c.includes("win")?"windows":c.includes("linux")?"linux":"unknown"}function Gh(o){var i;return typeof o=="number"&&Number.isFinite(o)&&o>0?o:typeof window<"u"&&Number.isFinite(window.innerWidth)&&window.innerWidth>0?window.innerWidth:typeof document<"u"&&Number.isFinite((i=document.documentElement)==null?void 0:i.clientWidth)&&document.documentElement.clientWidth>0?document.documentElement.clientWidth:1280}function Kh(o){const i=Gh(o);return i<768?"compact":i<1024?"medium":"expanded"}function Qh(o){const i=Td();return o==="desktop"?{osFamily:i,windowControlsStyle:i==="macos"?"traffic-lights":i==="windows"?"windows":"none",prefersDesktopChrome:!0,prefersOverlayTitlebar:i==="macos",prefersSystemFontStack:!0}:{osFamily:i,windowControlsStyle:"none",prefersDesktopChrome:!1,prefersOverlayTitlebar:!1,prefersSystemFontStack:!0}}function z(o){return{ok:!1,errorCode:"PLATFORM_NOT_SUPPORTED",detail:o}}async function he(o,i){return Vr(o,i)}async function Vr(o,i){if(!Dd())return z("当前运行环境不支持桌面壳能力。");try{return{ok:!0,value:await window.__TAURI_INTERNALS__.invoke(o,i)}}catch(a){return{ok:!1,errorCode:"SHELL_BRIDGE_ERROR",detail:a instanceof Error?a.message:"桌面壳调用失败。"}}}function $h(o){switch(o){case"selection":return 10;case"action":return[12];case"gesture":return[10,18,10];case"success":return[16,30,20];case"warning":return[20,36,18];case"error":return[24,40,24,40,20];default:return 10}}function Pd(){return typeof navigator<"u"&&typeof navigator.vibrate=="function"}async function Rd(o){if(Pd())try{navigator.vibrate($h(o))}catch{return}}async function Hl(o,i){if(typeof window>"u"||typeof Notification>"u")return z("当前环境不支持系统通知。");try{if(Notification.permission==="default"&&await Notification.requestPermission()!=="granted"||Notification.permission!=="granted")return z("系统通知权限未授予。");const a=new Notification(o,{body:i});return a.onerror=()=>{},{ok:!0}}catch(a){return{ok:!1,errorCode:"NOTIFICATION_FAILED",detail:a instanceof Error?a.message:"系统通知发送失败。"}}}class Yh{constructor(){L(this,"supported",!1)}openExternal(i){return typeof window>"u"?Promise.resolve(z("当前环境无法打开外部链接。")):(window.open(i,"_blank","noopener,noreferrer"),Promise.resolve({ok:!0}))}showNotification(i,a){return Hl(i,a)}writeClipboardText(){return Promise.resolve(z("当前不是桌面端运行环境。"))}setWindowState(){return Promise.resolve(z("当前不是桌面端运行环境。"))}readDesktopConfig(){return Promise.resolve(z("当前不是桌面端运行环境。"))}writeDesktopConfig(){return Promise.resolve(z("当前不是桌面端运行环境。"))}scanLocalHosts(){return Promise.resolve(z("当前不是桌面端运行环境。"))}getRuntimeInfo(){return Promise.resolve(z("当前不是桌面端运行环境。"))}checkForUpdate(){return Promise.resolve(z("当前不是桌面端运行环境。"))}installUpdate(){return Promise.resolve({ok:!1,errorCode:"PLATFORM_NOT_SUPPORTED",detail:"当前不是桌面端运行环境。"})}getAndroidRuntimeInfo(){return Promise.resolve(z("当前不是 Android 原生运行环境。"))}installAndroidUpdate(){return Promise.resolve({ok:!1,status:"failed",detail:"当前不是 Android 原生运行环境。"})}rollbackToPreviousVersion(){return Promise.resolve(z("当前不是桌面端运行环境。"))}pickDirectory(){return Promise.resolve(z("当前不是桌面端运行环境。"))}createWindow(){return Promise.resolve(z("当前不是桌面端运行环境。"))}closeWindow(){return Promise.resolve(z("当前不是桌面端运行环境。"))}focusWindow(){return Promise.resolve(z("当前不是桌面端运行环境。"))}listWindows(){return Promise.resolve(z("当前不是桌面端运行环境。"))}isWindowOpen(){return Promise.resolve(z("当前不是桌面端运行环境。"))}getWindowDescriptor(){return Promise.resolve(z("当前不是桌面端运行环境。"))}syncWindowDescriptor(){return Promise.resolve(z("当前不是桌面端运行环境。"))}updateWindowBounds(){return Promise.resolve(z("当前不是桌面端运行环境。"))}syncNativeSidebarLayout(){return Promise.resolve(z("当前不是桌面端运行环境。"))}}class Zh{constructor(){L(this,"supported",Pd())}trigger(i){return Rd(i)}}class Jh{constructor(){L(this,"supported",!0)}openExternal(i){return he("open_external",{url:i})}async showNotification(i,a){const c=await Hl(i,a);return c.ok?c:he("show_notification",{title:i,body:a})}writeClipboardText(i){return he("copy_text",{text:i})}setWindowState(i){return he("set_window_state",{state:i})}readDesktopConfig(){return he("read_desktop_config")}writeDesktopConfig(i){return he("write_desktop_config",{patch:i})}scanLocalHosts(){return he("scan_local_hosts")}getRuntimeInfo(){return he("get_runtime_info")}checkForUpdate(i){return he("check_for_update",{channel:i})}async installUpdate(i){const a=await he("install_update",{channel:i});return a.ok?a.value??{ok:!0}:{ok:!1,errorCode:a.errorCode,detail:a.detail}}getAndroidRuntimeInfo(){return Promise.resolve(z("当前不是 Android 原生运行环境。"))}installAndroidUpdate(){return Promise.resolve({ok:!1,status:"failed",detail:"当前不是 Android 原生运行环境。"})}rollbackToPreviousVersion(){return he("rollback_to_previous_version")}pickDirectory(){return he("pick_directory")}createWindow(i){return he("create_window",{descriptor:i})}closeWindow(i){return he("close_window",{windowId:i})}focusWindow(i){return he("focus_window",{windowId:i})}listWindows(){return he("list_windows")}isWindowOpen(i){return he("is_window_open",{windowId:i})}getWindowDescriptor(i){return typeof i=="string"?he("get_window_descriptor",{windowId:i}):he("get_window_descriptor")}syncWindowDescriptor(i){return he("sync_window_descriptor",{descriptor:i})}updateWindowBounds(i,a){return he("update_window_bounds",{windowId:i,bounds:a})}syncNativeSidebarLayout(i){return he("sync_native_sidebar_layout",{layout:i})}}class Xh{constructor(){L(this,"supported",!0)}async trigger(i){(await Vr("perform_haptic_feedback",{kind:i})).ok||await Rd(i)}}class ef{constructor(i){L(this,"supported",!0);this.platform=i}openExternal(i){return typeof window>"u"?Promise.resolve(z("当前环境无法打开外部链接。")):(window.open(i,"_blank","noopener,noreferrer"),Promise.resolve({ok:!0}))}showNotification(i,a){return Hl(i,a)}writeClipboardText(i){return Vr("copy_text",{text:i})}setWindowState(){return Promise.resolve(z("当前平台不支持窗口控制。"))}readDesktopConfig(){return Promise.resolve(z("当前不是桌面端运行环境。"))}writeDesktopConfig(){return Promise.resolve(z("当前不是桌面端运行环境。"))}scanLocalHosts(){return Promise.resolve(z("当前不是桌面端运行环境。"))}getRuntimeInfo(){return Promise.resolve(z("当前不是桌面端运行环境。"))}checkForUpdate(){return Promise.resolve(z("当前不是桌面端运行环境。"))}installUpdate(){return Promise.resolve({ok:!1,errorCode:"PLATFORM_NOT_SUPPORTED",detail:"当前不是桌面端运行环境。"})}getAndroidRuntimeInfo(){return this.platform!=="android"?Promise.resolve(z("当前不是 Android 原生运行环境。")):Vr("get_android_runtime_info")}async installAndroidUpdate(i){if(this.platform!=="android")return{ok:!1,status:"failed",detail:"当前不是 Android 原生运行环境。"};const a=await Vr("install_android_update",{manifest:i});return a.ok?a.value??{ok:!1,status:"failed",detail:"Android 更新结果为空。"}:{ok:!1,status:"failed",detail:a.detail}}rollbackToPreviousVersion(){return Promise.resolve(z("当前不是桌面端运行环境。"))}pickDirectory(){return Promise.resolve(z("当前不是桌面端运行环境。"))}createWindow(){return Promise.resolve(z("当前不是桌面端运行环境。"))}closeWindow(){return Promise.resolve(z("当前不是桌面端运行环境。"))}focusWindow(){return Promise.resolve(z("当前不是桌面端运行环境。"))}listWindows(){return Promise.resolve(z("当前不是桌面端运行环境。"))}isWindowOpen(){return Promise.resolve(z("当前不是桌面端运行环境。"))}getWindowDescriptor(){return Promise.resolve(z("当前不是桌面端运行环境。"))}syncWindowDescriptor(){return Promise.resolve(z("当前不是桌面端运行环境。"))}updateWindowBounds(){return Promise.resolve(z("当前不是桌面端运行环境。"))}syncNativeSidebarLayout(){return Promise.resolve(z("当前不是桌面端运行环境。"))}}function Ul(){if(!Dd())return"web";const o=Td();return o==="ios"?"ios":o==="android"?"android":"desktop"}function vo(o={}){const i=Ul(),a=Kh(o.viewportWidth),c=i==="ios"||i==="android";return{platform:i,isDesktop:i==="desktop",isWeb:i==="web",isMobile:a!=="expanded",isNativeMobile:c,viewportClass:a,ui:Qh(i),bridge:i==="desktop"?new Jh:c?new ef(i):new Yh,windows:qh,haptics:c?new Xh:new Zh}}const Pl="codingns.client.runtime-config";function tf(o){return o==="desktop"||o==="ios"||o==="android"}function Rl(o){return o==="en"||o==="en-US"?"en-US":"zh-CN"}function nf(){return typeof navigator>"u"?"zh-CN":Rl(navigator.language)}function Yu(o){return o==="acceptEdits"||o==="bypassPermissions"?o:"default"}function Ad(){return typeof window<"u"&&typeof window.localStorage<"u"}function rf(){if(!Ad())return null;const o=window.localStorage.getItem(Pl);if(!o)return null;try{return JSON.parse(o)}catch{return window.localStorage.removeItem(Pl),null}}function Ld(o){Ad()&&window.localStorage.setItem(Pl,JSON.stringify(Md(o)))}function of(){var o;return typeof window>"u"||!((o=window.location)!=null&&o.origin)?null:window.location.origin}function af(o){if(!o)return null;try{return Be(o)}catch{return null}}function Ed(o){if(o==="web"){const i=af(of());if(i)return i}return Be("http://127.0.0.1:3002")}function Id(){return new Date().toISOString()}function lf(){return{status:"idle",lastScannedAt:null,cooldownUntil:null,errorCode:null,errorDetail:null}}function De(o){return typeof o=="string"&&o.trim()?o.trim():null}function Zu(o,i){return De(o)??i}function Fd(o){try{const i=new URL(o).hostname.toLowerCase();return i==="localhost"||i==="127.0.0.1"||i==="::1"||i==="[::1]"?"local":/^10\./.test(i)||/^192\.168\./.test(i)||/^172\.(1[6-9]|2\d|3[0-1])\./.test(i)?"lan":"remote"}catch{return"custom"}}function xd(o){try{const i=new URL(o),a=i.pathname==="/"?"":i.pathname.replace(/\/+$/,"");return`${i.host}${a}`}catch{return o}}function ho(o,i,a={}){const c=Be(o);return{id:De(a.id)??Ml,name:De(a.name)??xd(c),baseUrl:c,kind:a.kind??Fd(c),createdAt:Zu(a.createdAt,i),updatedAt:Zu(a.updatedAt,i),lastConnectedAt:De(a.lastConnectedAt)??null,lastUserId:De(a.lastUserId)??null,lastUsername:De(a.lastUsername)??null,relayTunnel:uf(a.relayTunnel)}}function sf(o){return typeof o=="object"&&o!==null}function Ju(o,i){if(!Array.isArray(o))return[];const a=new Set,c=[];for(let d=0;d<o.length;d+=1){const p=o[d];if(!sf(p))continue;const w=De(p.baseUrl);if(w)try{const v=d===0?Ml:`host-${d+1}`,R=ho(w,i,{...p,id:De(p.id)??v});if(a.has(R.id))continue;a.add(R.id),c.push(R)}catch{continue}}return c}function cf(o){return typeof o=="object"&&o!==null}function uf(o){if(typeof o!="object"||o===null||Array.isArray(o))return null;const i=De(o.provider),a=o.enabled,c=De(o.tunnelDomain),d=De(o.controlBaseUrl),p=De(o.bindingId),w=De(o.hostFingerprint),v=df(o.candidateEndpoints);if(i!=="codingns_relay"||typeof a!="boolean"||!c||!d)return null;try{const R=Be(d);return/^[a-z0-9-]+(\.[a-z0-9-]+)+$/i.test(c)?{provider:i,enabled:a,tunnelDomain:c.trim().toLowerCase(),controlBaseUrl:R,bindingId:p,hostFingerprint:w,candidateEndpoints:v}:null}catch{return null}}function df(o){if(!Array.isArray(o))return[];const i=[],a=new Set;for(const c of o){if(typeof c!="object"||c===null||Array.isArray(c))continue;const d=De(c.endpointId),p=De(c.kind),w=De(c.url),v=c.priority,R=De(c.expiresAt),U=De(c.source);if(!(!d||!w||typeof v!="number"||!Number.isFinite(v)||p!=="relay"&&p!=="lan"&&p!=="loopback"&&p!=="tailscale"&&p!=="custom"||U!=="host_reported"&&U!=="desktop_scan"&&U!=="user_saved"))try{const M=Be(w);if(a.has(M))continue;i.push({endpointId:d,kind:p,url:M,priority:v,expiresAt:R,source:U}),a.add(M)}catch{continue}}return i.sort((c,d)=>c.priority!==d.priority?c.priority-d.priority:c.url.localeCompare(d.url))}function Xu(o,i,a){const c=Be(i),d=Cn(o);return d?o.hosts.map(p=>p.id===d.id?ho(c,a,{...p,name:xd(c),kind:Fd(c),createdAt:p.createdAt,updatedAt:a}):p):[ho(c,a)]}function Bl(o){const i=Id();return{platform:o,activeHostId:Ml,hosts:[ho(Ed(o),i)],discoveredHosts:[],activeDiscoveredHostId:null,localHostDiscovery:lf(),releaseChannel:"stable",autoReconnect:!0,autoCheckUpdate:o==="desktop",language:nf(),defaultPermissionMode:"default"}}function fo(o,i){var R,U;if(!i||!cf(i))return o;const a=i.platform??o.platform,c=Bl(a),d=Id();if(!tf(a)){let M=i.hosts!==void 0?Ju(i.hosts,d):c.hosts;i.hostBaseUrl&&(M=Xu(o,i.hostBaseUrl,d)),M.length===0&&(M=c.hosts);const B=i.activeHostId??o.activeHostId??c.activeHostId,V=M.some(X=>X.id===B)?B:((R=M[0])==null?void 0:R.id)??null;return{platform:a,activeHostId:V,hosts:M,discoveredHosts:o.discoveredHosts,activeDiscoveredHostId:null,localHostDiscovery:o.localHostDiscovery,releaseChannel:i.releaseChannel??o.releaseChannel,autoReconnect:i.autoReconnect??o.autoReconnect,autoCheckUpdate:i.autoCheckUpdate??o.autoCheckUpdate,language:Rl(i.language??o.language),defaultPermissionMode:Yu(i.defaultPermissionMode??o.defaultPermissionMode)}}let p=i.hosts!==void 0?Ju(i.hosts,d):o.hosts;i.hostBaseUrl&&(p=Xu(o,i.hostBaseUrl,d)),p.length===0&&(p=c.hosts);const w=i.activeHostId??o.activeHostId,v=p.some(M=>M.id===w)?w:((U=p[0])==null?void 0:U.id)??null;return{platform:a,activeHostId:v,hosts:p,discoveredHosts:o.discoveredHosts,activeDiscoveredHostId:o.activeDiscoveredHostId&&o.discoveredHosts.some(M=>M.id===o.activeDiscoveredHostId)?o.activeDiscoveredHostId:null,localHostDiscovery:o.localHostDiscovery,releaseChannel:i.releaseChannel??o.releaseChannel,autoReconnect:i.autoReconnect??o.autoReconnect,autoCheckUpdate:i.autoCheckUpdate??o.autoCheckUpdate,language:Rl(i.language??o.language),defaultPermissionMode:Yu(i.defaultPermissionMode??o.defaultPermissionMode)}}function Md(o){return{platform:o.platform,activeHostId:o.activeHostId,hosts:o.hosts,releaseChannel:o.releaseChannel,autoReconnect:o.autoReconnect,autoCheckUpdate:o.autoCheckUpdate,language:o.language,defaultPermissionMode:o.defaultPermissionMode}}function Nd(o,i){return fo(Bl(i),o)}async function pf(){const o=vo(),i=Bl(o.platform),a=rf();let c=null;if(o.isDesktop){const p=await o.bridge.readDesktopConfig();p.ok&&p.value&&(c=p.value)}const d=fo(fo(i,a),c);return Ld(d),d}async function mf(o,i){var p;const a=fo(o,i);Ld(a);const c=(p=Cn(a))==null?void 0:p.baseUrl;c&&Bh(c);const d=vo();return d.isDesktop&&await d.bridge.writeDesktopConfig(Md(a)),a}function hf(){return Nd(null,Ul())}class ff{constructor(){L(this,"state",hf());L(this,"listeners",new Set);L(this,"subscribe",i=>(this.listeners.add(i),()=>{this.listeners.delete(i)}));L(this,"getState",()=>this.state)}hydrate(i){this.state=Nd(i,this.state.platform),this.emit()}updateRuntime(i){const a=i.discoveredHosts??this.state.discoveredHosts,c=i.activeDiscoveredHostId!==void 0?i.activeDiscoveredHostId:this.state.activeDiscoveredHostId,d=c&&a.some(w=>w.id===c)?c:null,p=i.localHostDiscovery??this.state.localHostDiscovery;a===this.state.discoveredHosts&&d===this.state.activeDiscoveredHostId&&p===this.state.localHostDiscovery||(this.state={...this.state,discoveredHosts:a,activeDiscoveredHostId:d,localHostDiscovery:p},this.emit())}async initialize(){const i=await pf();return this.hydrate(i),i}async update(i){const a=await mf(this.state,i);return this.hydrate(a),a}emit(){for(const i of this.listeners)i()}}const J=new ff;function Jb(o){return Ne.useSyncExternalStore(J.subscribe,()=>o(J.getState()))}const gf=3e4;class bf{constructor(){L(this,"hints",new Map);L(this,"listeners",new Set);L(this,"subscribe",i=>(this.listeners.add(i),()=>{this.listeners.delete(i)}))}remember(i,a){const c=i.trim(),d=a.trim();!c||!d||(this.hints.set(c,{hostId:c,baseUrl:d,savedAt:Date.now()}),this.emit())}forget(i){const a=i==null?void 0:i.trim();!a||!this.hints.delete(a)||this.emit()}clear(){this.hints.size!==0&&(this.hints.clear(),this.emit())}get(i){const a=i==null?void 0:i.trim();if(!a)return null;const c=this.hints.get(a);return c?Date.now()-c.savedAt>gf?(this.hints.delete(a),this.emit(),null):c:null}emit(){for(const i of this.listeners)i()}}const kn=new bf;class Jn extends Error{constructor(a,c){super(c.detail);L(this,"status");L(this,"errorCode");L(this,"field");L(this,"data");this.name="ApiError",this.status=a,this.errorCode=c.error_code,this.field=c.field,this.data=c.data}}const oo="codingns.auth.session",yf=3e3;class Sf{constructor(){L(this,"state",{status:"anonymous",session:null});L(this,"listeners",new Set);L(this,"sessionMap",{});L(this,"lastRuntimeConfigSyncKey",null);L(this,"subscribe",i=>(this.listeners.add(i),()=>{this.listeners.delete(i)}));L(this,"getState",()=>this.state);this.syncCurrentHostSession(),J.subscribe(()=>{this.syncCurrentHostSession()})}async login(i,a){const c=this.getCurrentHost();if(!c){const{loginRequest:p}=await Ut(async()=>{const{loginRequest:v}=await Promise.resolve().then(()=>lo);return{loginRequest:v}},void 0),w=await p(i,a);return this.updateState({status:"authenticated",session:w}),w}const d=await this.loginForHost(c,i,a);return this.updateState({status:"authenticated",session:d}),d}async loginForHost(i,a,c){var U;const{loginRequest:d}=await Ut(async()=>{const{loginRequest:M}=await Promise.resolve().then(()=>lo);return{loginRequest:M}},void 0),{resolveLoginBaseUrlWithDirectCandidates:p}=await Ut(async()=>{const{resolveLoginBaseUrlWithDirectCandidates:M}=await import("./login-direct-candidate-resolver-CLlYtBRq.js");return{resolveLoginBaseUrlWithDirectCandidates:M}},[]),w=c??i.baseUrl,v=await p({host:i,requestedBaseUrl:w,platform:J.getState().platform}),R=await d(a,v);return v!==i.baseUrl?kn.remember(i.id,v):kn.forget(i.id),this.persistSession(i,R),((U=this.getCurrentHost())==null?void 0:U.id)===i.id&&(this.updateState({status:"authenticated",session:R}),this.scheduleRuntimeConfigSync(i,R)),R}async bootstrap(i,a,c){const{setupRequest:d}=await Ut(async()=>{const{setupRequest:p}=await Promise.resolve().then(()=>lo);return{setupRequest:p}},void 0);await d({username:i,password:a},c)}hydrate(i){if(!i){this.clear();return}this.setSession(i)}async refresh(){const{refreshRequest:i}=await Ut(async()=>{const{refreshRequest:p}=await Promise.resolve().then(()=>lo);return{refreshRequest:p}},void 0),a=this.state.session,c=a==null?void 0:a.refreshToken,d=this.getCurrentHost();if(!c)return this.clear(),{status:"invalid",session:null};this.state={...this.state,status:"refreshing"},this.emit();try{const p=await i({refreshToken:c},d==null?void 0:d.baseUrl);return this.setSession(p,d),this.scheduleRuntimeConfigSync(d,p),{status:"refreshed",session:p}}catch(p){return Pf(p)?(this.clear(),{status:"invalid",session:null}):(this.state={status:a?"authenticated":"anonymous",session:a},this.emit(),{status:"deferred",session:a,error:p})}}clear(){const i=this.getCurrentHost();if(this.lastRuntimeConfigSyncKey=null,!i){kn.clear(),this.sessionMap={},this.persistSessionMap(),this.updateState({status:"anonymous",session:null});return}if(kn.forget(i.id),this.sessionMap[i.id]){const a={...this.sessionMap};delete a[i.id],this.sessionMap=a,this.persistSessionMap()}this.updateState({status:"anonymous",session:null})}clearHostSession(i){var c;if(!i||(kn.forget(i),!this.sessionMap[i]))return;const a={...this.sessionMap};delete a[i],this.sessionMap=a,this.persistSessionMap(),((c=this.getCurrentHost())==null?void 0:c.id)===i&&(this.lastRuntimeConfigSyncKey=null,this.updateState({status:"anonymous",session:null}))}setSession(i,a=this.getCurrentHost()){a&&(this.persistSession(a,i),this.updateState({status:"authenticated",session:i}))}persistSession(i,a){this.sessionMap={...this.sessionMap,[i.id]:{hostId:i.id,session:a,savedAt:Date.now()}},this.persistSessionMap();const c=new Date().toISOString();if(wd(i)){J.updateRuntime({discoveredHosts:J.getState().discoveredHosts.map(d=>d.id===i.id?{...d,lastConnectedAt:c,lastUserId:a.user.userId,lastUsername:a.user.username,updatedAt:c}:d)});return}J.update({hosts:J.getState().hosts.map(d=>d.id===i.id?{...d,lastConnectedAt:c,lastUserId:a.user.userId,lastUsername:a.user.username,updatedAt:c}:d)}).catch(()=>{})}syncCurrentHostSession(){var w;const i=this.getCurrentHost(),{sessionMap:a,migrated:c}=this.readSessionMapFromStorage(i),d=Rf(a);this.sessionMap=d,(c||Object.keys(d).length!==Object.keys(a).length)&&this.persistSessionMap();const p=i?((w=d[i.id])==null?void 0:w.session)??null:null;if(this.updateState({status:p?"authenticated":"anonymous",session:p}),!i||!p){this.lastRuntimeConfigSyncKey=null;return}this.scheduleRuntimeConfigSync(i,p)}getCurrentHost(){return Cn(J.getState())}readSessionMapFromStorage(i){if(typeof window>"u"||typeof window.localStorage>"u")return{sessionMap:{},migrated:!1};const a=window.localStorage.getItem(oo);if(!a)return{sessionMap:{},migrated:!1};try{const c=JSON.parse(a);if(kf(c))return{sessionMap:c,migrated:!1};const d=Df(c,i);if(d)return{sessionMap:d,migrated:!0}}catch{}return window.localStorage.removeItem(oo),{sessionMap:{},migrated:!1}}persistSessionMap(){if(!(typeof window>"u"||typeof window.localStorage>"u")){if(Object.keys(this.sessionMap).length===0){window.localStorage.removeItem(oo);return}window.localStorage.setItem(oo,JSON.stringify(this.sessionMap))}}updateState(i){this.state.status===i.status&&this.state.session===i.session||(this.state=i,this.emit())}async ensureRuntimeConfigSynced(i,a){var d;if(!i||!a){this.lastRuntimeConfigSyncKey=null;return}if(((d=this.getCurrentHost())==null?void 0:d.id)!==i.id)return;const c=`${i.id}:${a.accessToken}`;if(this.lastRuntimeConfigSyncKey!==c){this.lastRuntimeConfigSyncKey=c;try{const{syncActiveHostAuthenticatedRuntimeConfig:p}=await Ut(async()=>{const{syncActiveHostAuthenticatedRuntimeConfig:w}=await import("./client-runtime-manager-6OoYHXGd.js");return{syncActiveHostAuthenticatedRuntimeConfig:w}},[]);await vf(p(),yf,"runtime_config_sync_timeout")}catch{this.lastRuntimeConfigSyncKey===c&&(this.lastRuntimeConfigSyncKey=null)}}}scheduleRuntimeConfigSync(i,a){this.ensureRuntimeConfigSynced(i,a)}emit(){for(const i of this.listeners)i()}}const Ke=new Sf;function Xb(o){return Ne.useSyncExternalStore(Ke.subscribe,()=>o(Ke.getState()))}function wf(o){if(typeof o!="object"||o===null)return!1;const i=o;return typeof i.hostId=="string"&&typeof i.savedAt=="number"&&Ol(i.session)}function vf(o,i,a){return new Promise((c,d)=>{const p=globalThis.setTimeout(()=>{d(new Error(a))},i);o.then(w=>{globalThis.clearTimeout(p),c(w)},w=>{globalThis.clearTimeout(p),d(w)})})}function kf(o){return typeof o!="object"||o===null||Array.isArray(o)?!1:Object.values(o).every(i=>wf(i))}function Cf(o){return typeof o!="object"||o===null?!1:"session"in o&&Ol(o.session)}function Ol(o){if(typeof o!="object"||o===null)return!1;const i=o;return typeof i.accessToken=="string"&&typeof i.refreshToken=="string"&&typeof i.expiresIn=="number"&&typeof i.user=="object"&&i.user!==null}function Df(o,i){const a=(i==null?void 0:i.id)??null;if(!a)return null;if(Cf(o)){const c=Tf(o.serverBaseUrl,i)??a;return{[c]:{hostId:c,session:o.session,savedAt:Date.now()}}}return Ol(o)?{[a]:{hostId:a,session:o,savedAt:Date.now()}}:null}function Tf(o,i){if(!o)return(i==null?void 0:i.id)??null;const c=J.getState().hosts.find(d=>d.baseUrl===o);return(c==null?void 0:c.id)??(i==null?void 0:i.id)??null}function Pf(o){return o instanceof Jn?o.status===401?!0:o.status===403&&o.errorCode==="BOOTSTRAP_REQUIRED":!1}function Rf(o){const i=Object.entries(o).filter(([,a])=>!Af(a));return Object.fromEntries(i)}function Af(o){var a;const i=(a=o.session)==null?void 0:a.expiresIn;return typeof i!="number"||!Number.isFinite(i)||i<=0?!0:o.savedAt+i*1e3<=Date.now()}const ko=["claude-code","codex","opencode","gemini","kimi"],Hd="codingns.account.preferences.shadow",Lf="codingns.client.runtime-config",Ef="codingns-theme",If="composer-selected-model:",Ff="composer-reasoning-level:",_l={start:43e3,end:47999};function Kr(){return typeof window<"u"&&typeof window.localStorage<"u"}function Wl(o){return o==="en-US"||o==="en"?"en-US":o==="zh-CN"?"zh-CN":null}function xf(){return typeof navigator>"u"?"zh-CN":Wl(navigator.language)??"zh-CN"}function Ud(o){return o==="light"||o==="dark"||o==="sky-blue"||o==="eye-green"?o:null}function Mf(){return typeof window>"u"||typeof window.matchMedia!="function"?"light":window.matchMedia("(prefers-color-scheme: dark)").matches?"dark":"light"}function Nf(o){return typeof o=="boolean"?o:null}function Bd(o){return o==="acceptEdits"||o==="bypassPermissions"||o==="default"?o:null}function Od(o){return o==="low"||o==="medium"||o==="high"||o==="xhigh"?o:null}function _d(){return{"claude-code":{defaultModel:null,defaultReasoningLevel:null},codex:{defaultModel:null,defaultReasoningLevel:null},opencode:{defaultModel:null,defaultReasoningLevel:null},gemini:{defaultModel:null,defaultReasoningLevel:null},kimi:{defaultModel:null,defaultReasoningLevel:null}}}function Wd(){return{initialized:!0,profile:{language:xf(),theme:Mf(),autoTheme:!1,defaultPermissionMode:"default",debugPortPools:yo(_l)},providers:_d(),updatedAt:null,source:"default"}}function Hf(){const o=J.getState(),i={language:o.language,defaultPermissionMode:o.defaultPermissionMode};if(!Kr())return i;const a=window.localStorage.getItem(Lf);if(!a)return i;try{const c=JSON.parse(a);return{language:Wl(c.language)??i.language,defaultPermissionMode:Bd(c.defaultPermissionMode)??i.defaultPermissionMode}}catch{return i}}function Uf(){return Kr()?Ud(window.localStorage.getItem(Ef)):null}function Bf(){var i;if(!Kr())return;const o={};for(const a of ko){const c=((i=window.localStorage.getItem(`${If}${a}`))==null?void 0:i.trim())||null,d=Od(window.localStorage.getItem(`${Ff}${a}`));c===null&&d===null||(o[a]={defaultModel:c,defaultReasoningLevel:d})}return Object.keys(o).length>0?o:void 0}function jd(){const o=Hf(),i=Uf(),a=Bf(),c={};return o.language&&(c.language=o.language),i&&(c.theme=i),o.defaultPermissionMode&&(c.defaultPermissionMode=o.defaultPermissionMode),a&&(c.providers=a),zd(c)?c:null}function zd(o){return o?o.language!==void 0||o.theme!==void 0||o.autoTheme!==void 0||o.defaultPermissionMode!==void 0||o.debugPortPools!==void 0||o.providers!==void 0&&Object.keys(o.providers).length>0:!1}function go(o){var c;const i=Wd(),a=_d();for(const d of ko){const p=(c=o==null?void 0:o.providers)==null?void 0:c[d];a[d]={defaultModel:typeof(p==null?void 0:p.defaultModel)=="string"&&p.defaultModel.trim()||null,defaultReasoningLevel:Od(p==null?void 0:p.defaultReasoningLevel)??null}}return{language:Wl(o==null?void 0:o.language)??i.profile.language,theme:Ud(o==null?void 0:o.theme)??i.profile.theme,autoTheme:Nf(o==null?void 0:o.autoTheme)??i.profile.autoTheme,defaultPermissionMode:Bd(o==null?void 0:o.defaultPermissionMode)??i.profile.defaultPermissionMode,debugPortPools:_f(o==null?void 0:o.debugPortPools)??i.profile.debugPortPools,providers:a,updatedAt:typeof(o==null?void 0:o.updatedAt)=="string"?o.updatedAt:null}}function Of(){var i,a,c,d,p;if(!Kr())return null;const o=window.localStorage.getItem(Hd);if(!o)return null;try{const w=JSON.parse(o),v=go({language:(i=w.profile)==null?void 0:i.language,theme:(a=w.profile)==null?void 0:a.theme,autoTheme:(c=w.profile)==null?void 0:c.autoTheme,defaultPermissionMode:(d=w.profile)==null?void 0:d.defaultPermissionMode,debugPortPools:(p=w.profile)==null?void 0:p.debugPortPools,providers:w.providers,updatedAt:w.updatedAt});return{profile:{language:v.language,theme:v.theme,autoTheme:v.autoTheme,defaultPermissionMode:v.defaultPermissionMode,debugPortPools:v.debugPortPools},providers:v.providers,updatedAt:v.updatedAt}}catch{return null}}function bo(o){if(!Kr())return;const i={profile:o.profile,providers:o.providers,updatedAt:o.updatedAt};window.localStorage.setItem(Hd,JSON.stringify(i))}function Yn(){const o=Wd(),i=jd(),a=i?Vd(o,i,"default"):o,c=Of();return c?{initialized:!0,profile:c.profile,providers:c.providers,updatedAt:c.updatedAt,source:"shadow"}:a}function Al(o,i){return{initialized:!0,profile:{language:o.language,theme:o.theme,autoTheme:o.autoTheme,defaultPermissionMode:o.defaultPermissionMode,debugPortPools:yo(o.debugPortPools??_l)},providers:o.providers,updatedAt:o.updatedAt,source:i}}function Vd(o,i,a){const c={...o.providers};if(i.providers)for(const d of ko){const p=i.providers[d];p&&(c[d]={defaultModel:p.defaultModel!==void 0?p.defaultModel??null:o.providers[d].defaultModel,defaultReasoningLevel:p.defaultReasoningLevel!==void 0?p.defaultReasoningLevel??null:o.providers[d].defaultReasoningLevel})}return{initialized:!0,profile:{language:i.language??o.profile.language,theme:i.theme??o.profile.theme,autoTheme:i.autoTheme??o.profile.autoTheme,defaultPermissionMode:i.defaultPermissionMode??o.profile.defaultPermissionMode,debugPortPools:i.debugPortPools?yo(i.debugPortPools):o.profile.debugPortPools??yo(_l)},providers:c,updatedAt:o.updatedAt,source:a}}function _f(o){if(!o||typeof o!="object"||Array.isArray(o))return null;const i=qd(o);return i||Wf(o)}function ed(o){if(!Number.isInteger(o))return null;const i=Number(o);return i>=1024&&i<=65535?i:null}function qd(o){if(!o||typeof o!="object"||Array.isArray(o))return null;const i=o;if(!Object.prototype.hasOwnProperty.call(i,"start")||!Object.prototype.hasOwnProperty.call(i,"end"))return null;const a=ed(i.start),c=ed(i.end);return a===null||c===null||a>=c?null:{start:a,end:c}}function Wf(o){if(!o||typeof o!="object"||Array.isArray(o))return null;const i=["frontend","backend","worker","mock","custom"];let a=Number.POSITIVE_INFINITY,c=Number.NEGATIVE_INFINITY;for(const d of i){const p=qd(o[d]);if(!p)return null;a=Math.min(a,p.start),c=Math.max(c,p.end)}return Number.isFinite(a)&&Number.isFinite(c)&&a<c?{start:a,end:c}:null}function yo(o){return{...o}}async function jf(){const{fetchPreferencesProfile:o,updatePreferencesProfile:i}=await Ut(async()=>{const{fetchPreferencesProfile:d,updatePreferencesProfile:p}=await import("./preferences-service-BCcfYP_d.js");return{fetchPreferencesProfile:d,updatePreferencesProfile:p}},[]),a=go(await o());if(a.updatedAt===null){const d=jd();if(zd(d)){const p=go(await i(d)),w=Al(p,"remote");return bo(w),w}}const c=Al(a,"remote");return bo(c),c}class zf{constructor(){L(this,"state",Yn());L(this,"listeners",new Set);L(this,"subscribe",i=>(this.listeners.add(i),()=>{this.listeners.delete(i)}));L(this,"getState",()=>this.state);J.subscribe(()=>{Ke.getState().session||this.state.source==="remote"||this.hydrate(Yn())})}hydrate(i){this.state=i,this.emit()}resetToLocalFallback(){this.hydrate(Yn())}async initialize(){if(!Ke.getState().session){const i=Yn();return this.hydrate(i),i}return this.refreshForAuthenticatedUser()}async refreshForAuthenticatedUser(){if(!Ke.getState().session){const i=Yn();return this.hydrate(i),i}try{const i=await jf();return this.hydrate(i),i}catch{const i=Yn();return this.hydrate(i),i}}async updateProfile(i){const a=this.state,c=Vd(a,i,a.source);if(this.hydrate(c),!Ke.getState().session)return bo(c),c;try{const{updatePreferencesProfile:d}=await Ut(async()=>{const{updatePreferencesProfile:v}=await import("./preferences-service-BCcfYP_d.js");return{updatePreferencesProfile:v}},[]),p=go(await d(i)),w=Al(p,"remote");return bo(w),this.hydrate(w),w}catch(d){throw this.hydrate(a),d}}async updateProviderPreference(i,a){return this.updateProfile({providers:{[i]:a}})}emit(){for(const i of this.listeners)i()}}const er=new zf;function Gd(o){return Ne.useSyncExternalStore(er.subscribe,()=>o(er.getState()))}function Vf(o){return ko.includes(o)}const ey=Object.freeze(Object.defineProperty({__proto__:null,isPreferenceProviderId:Vf,useUserPreferenceSelector:Gd,userPreferenceStore:er},Symbol.toStringTag,{value:"Module"}));function qf(){return er.initialize()}function ty(o){return er.updateProfile(o)}function Gf(o){return Gd(i=>o({profile:{...i.profile,providers:i.providers,updatedAt:i.updatedAt},isFetching:!1,error:null}))}const Kf={common:{close:"关闭",cancel:"取消",logout:"退出登录",language:"语言"},locale:{zhCN:"简体中文",enUS:"English"},settings:{title:"设置",appearance:"外观",language:"语言",languageDescription:"选择界面显示语言,切换后立即应用到当前页面。",theme:"主题",themeDescription:"选择适合你的界面配色方案",connection:"连接与更新",serverAddress:"服务地址",serverDescription:"桌面端和 H5 都通过这个 Host 入口工作。",releaseChannel:"发布通道",releaseChannelDescription:"稳定版或测试版",releaseStable:"Stable",releaseBeta:"Beta",autoReconnect:"自动重连",autoReconnectDescription:"当 Host 短暂不可达时,自动尝试恢复 HTTP 和 WebSocket 链路。",autoCheckUpdate:"自动检查客户端更新",autoCheckUpdateDescription:"仅客户端",notificationSettings:"通知",notificationSettingsDescription:"单独控制会话相关的系统通知提醒。",notifyOnPermissionRequest:"会话等待审批时通知",notifyOnPermissionRequestDescription:"后台会话出现新的权限申请时推送通知。",notifyOnSessionCompleted:"会话完成时通知",notifyOnSessionCompletedDescription:"后台会话变为已完成时推送通知。",notifyOnSessionFailed:"会话异常时通知",notifyOnSessionFailedDescription:"后台会话运行失败时推送通知。",enabled:"已启用",disabled:"已关闭",serverUpdate:"服务端更新",serverUpdateDescription:"",clientUpdate:"客户端更新",clientUpdateDescription:"",serverCurrentVersion:"服务端当前版本",serverTargetVersion:"服务端目标版本",serverPackageName:"npm 包名",serverUpdateCommand:"升级命令",serverCheckNow:"检查服务端",serverInstallNow:"安装更新",serverOpenPage:"打开 npm",serverLatestUnknown:"暂未获取",serverUpdateReady:"发现新版本",serverUpToDate:"已是最新版本",serverCheckFailed:"检查失败",serverInstallWarning:"安装更新会通过 PM2 自动重启 CodingNS 服务,连接会短暂中断。",serverInstallConfirmTitle:"安装服务端更新",serverInstallConfirmDescription:"继续后会先安装新版本,再由 PM2 自动重启当前 CodingNS 服务。",serverInstallConfirmAction:"继续安装并重启服务",serverRestarting:"更新已安装,正在重启 CodingNS 服务",serverInstallQueued:"已加入更新队列",serverInstalling:"正在安装更新",serverInstallSucceeded:"更新已完成",serverInstallFailed:"安装失败",serverInstallCancelled:"安装已取消",serverInstallTimeout:"安装超时",serverRestartRequired:"新版本已安装,重启 Host 后生效",serverOpenPageFailed:"打开页面失败",runtimePlatform:"当前运行平台",runtimePlatformDescription:"用来确认现在是 Web/H5、Desktop、iOS 还是 Android 运行环境。",platformDesktop:"Desktop",platformWeb:"Web",platformIos:"iOS",platformAndroid:"Android",releaseDesktopOnly:"当前是 Web/H5 运行环境,不支持桌面更新。",releaseCurrentVersion:"当前版本",releaseTargetVersion:"目标版本",releaseUnknownVersion:"未知",releaseNotes:"更新内容",releaseNotesEmpty:"暂无更新内容",releaseCheckNow:"检查客户端",releaseInstallNow:"安装更新",releaseOpenPage:"打开发布页",releaseManualOnly:"当前版本只能手动安装",releaseUpdateBadge:"新版本",releaseUpdateReady:"发现新版本",releaseUpToDate:"已是最新版本",releaseCheckFailed:"检查失败",releaseInstallStarted:"安装已开始",releaseInstallFailed:"安装失败",releasePageOpenFailed:"打开发布页失败",androidInstallerStarted:"已交给系统安装器,安装完成前你仍可以取消",androidInstallPermissionRequired:"请先允许当前应用安装未知来源应用",androidInstallCancelled:"安装已取消或未完成,可重新触发安装",androidInstallSucceeded:"已检测到新版本完成安装",clientUpdateUnsupported:"当前不支持安装更新",account:"账号",logout:"退出登录",logoutDescription:"退出当前账号并返回登录页面",advancedSettings:"高级设置",parallelTaskDebug:"并行任务调试",parallelTaskDebugDescription:"打开后才会启用运行时采样,用来实时看后台任务、调度器和主线程压力指标。",debugPortPool:"调试端口池",debugPortPoolDescription:"给子工作区的已登记启动项分配可用端口。所有调试服务统一从这个范围里拿空闲端口,不再分前后端和 Worker。",debugPortPoolRangeLabel:"端口范围",debugPortPoolRangeHint:"子工作区里的前端、后端、Worker、Mock 和自定义服务统一从这里取可用端口",debugPortPoolStart:"起始",debugPortPoolEnd:"结束",debugPortPoolRangeSeparator:"到",debugPortPoolSaveAction:"保存端口池",debugPortPoolSaved:"端口池已保存",debugPortPoolSaveFailed:"端口池保存失败",debugPortPoolValidationInteger:"端口池的起止值必须是整数",debugPortPoolValidationRange:"端口池必须在 1024 到 65535 之间,且起始值必须小于结束值",debugPortPoolValidationOverlap:"各角色的端口池不能重叠",debugPortPoolRoleFrontend:"前端",debugPortPoolRoleBackend:"后端",debugPortPoolRoleWorker:"Worker",debugPortPoolRoleMock:"Mock",debugPortPoolRoleCustom:"自定义",debugPortPoolRoleHint:"{role} 统一从这个范围里拿可用端口",parallelTaskDebugAction:"打开调试面板",parallelTaskDebugModalTitle:"并行任务调试",parallelTaskDebugModalDescription:"这个窗口打开时才会继续采集任务活动和 event loop 指标,关掉后立即停止。",parallelTaskDebugClose:"关闭并行任务调试",parallelTaskDebugLoading:"正在建立观测会话并拉取快照…",parallelTaskDebugLoadFailed:"加载并行任务调试信息失败",parallelTaskDebugEmpty:"当前没有可展示的执行记录。",parallelTaskDebugStatusActive:"采集中",parallelTaskDebugStatusError:"采集异常",parallelTaskDebugObservedAt:"最后更新",parallelTaskDebugSessionExpireAt:"会话到期时间",parallelTaskDebugSessionTtl:"会话 TTL",parallelTaskDebugCollectorState:"采集器状态",parallelTaskDebugCollectorEnabled:"已启用",parallelTaskDebugCollectorDisabled:"未启用",parallelTaskDebugAutoRefresh:"每秒自动刷新",parallelTaskDebugCountersTitle:"总指标",parallelTaskDebugTaskMetricsTitle:"后台任务指标",parallelTaskDebugSchedulerTitle:"调度器指标",parallelTaskDebugEventLoopTitle:"Event Loop",parallelTaskDebugRecentActivitiesTitle:"最近执行记录",parallelTaskDebugWaitAvg:"平均等待",parallelTaskDebugRunAvg:"平均执行",parallelTaskDebugRunMax:"最长执行",parallelTaskDebugStartedCount:"启动次数",parallelTaskDebugFinishedCount:"完成次数",parallelTaskDebugFailedCount:"失败次数",parallelTaskDebugCacheHitCount:"缓存命中",parallelTaskDebugIdle:"空转",parallelTaskDebugBusy:"已命中任务",parallelTaskDebugTickTotal:"tick 总数",parallelTaskDebugIdleTickTotal:"空转 tick",parallelTaskDebugTaskCountTotal:"命中任务",parallelTaskDebugSchedulerErrorTotal:"异常次数",parallelTaskDebugLastDuration:"上次耗时",parallelTaskDebugNextDelay:"下次延迟",parallelTaskDebugEventLoopResolution:"采样粒度",parallelTaskDebugEventLoopMean:"平均延迟",parallelTaskDebugEventLoopP95:"P95 延迟",parallelTaskDebugEventLoopP99:"P99 延迟",parallelTaskDebugEventLoopMax:"最大延迟",parallelTaskDebugTaskKey:"任务 Key",parallelTaskDebugStatus:"状态",parallelTaskDebugAttempt:"尝试",parallelTaskDebugWaitMs:"等待",parallelTaskDebugRunMs:"执行",parallelTaskDebugSource:"来源",parallelTaskDebugError:"错误",parallelTaskDebugMetricEnqueue:"入队",parallelTaskDebugMetricDedupe:"去重",parallelTaskDebugMetricStarted:"已启动",parallelTaskDebugMetricFinished:"已完成",parallelTaskDebugMetricFailed:"失败",parallelTaskDebugMetricCancelled:"已取消",parallelTaskDebugMetricTimeout:"超时",parallelTaskDebugMetricCacheHit:"缓存命中",parallelTaskDebugLaneRequestMainThread:"请求主线程",parallelTaskDebugLaneHostBackground:"Host 后台",parallelTaskDebugLaneHelperProcess:"Helper 进程",parallelTaskDebugLaneExternalProcess:"外部进程",parallelTaskDebugEventEnqueued:"入队",parallelTaskDebugEventDeduped:"去重复用",parallelTaskDebugEventStarted:"开始",parallelTaskDebugEventFinished:"完成",parallelTaskDebugEventFailed:"失败",parallelTaskDebugEventCancelled:"取消",parallelTaskDebugEventTimeout:"超时",parallelTaskDebugEventCacheHit:"命中缓存",parallelTaskDebugTaskStatusQueued:"排队中",parallelTaskDebugTaskStatusRunning:"运行中",parallelTaskDebugTaskStatusSucceeded:"已成功",parallelTaskDebugTaskStatusFailed:"已失败",parallelTaskDebugTaskStatusCancelled:"已取消",parallelTaskDebugTaskStatusTimeout:"已超时",opencliSectionTitle:"OpenCLI 接入",opencliSectionDescription:"这里管理 CodingNS 会话里可见的 OpenCLI CLI技能,不改你机器上的全局安装。",opencliEnableAction:"启用",opencliRefreshAction:"刷新",opencliSaveAction:"保存",opencliLoading:"正在读取 OpenCLI 状态…",opencliLoadFailed:"读取 OpenCLI 状态失败",opencliSummaryInstallState:"安装状态",opencliSummaryCatalogCount:"目录总数",opencliSummaryEnabledCount:"当前启用",opencliSummaryBrowserCount:"依赖浏览器",opencliProviderToggleLabel:"在新会话里启用 OpenCLI",opencliProviderHint:"这里控制的是 CodingNS 托管会话里能不能用,不会改你自己终端里的全局 opencli。",opencliVersionLabel:"版本",opencliCatalogSourceLabel:"目录来源",opencliLastCheckedLabel:"最近检查",opencliCatalogRefreshedLabel:"最近刷新",opencliInstallPathLabel:"安装目录",opencliInstallInstalled:"已安装",opencliInstallBroken:"安装损坏",opencliInstallMissing:"未安装",opencliHealthReady:"可运行",opencliHealthBridgeMissing:"浏览器桥缺失",opencliHealthBinaryReady:"命令可用",opencliHealthRuntimeBuildFailed:"运行时构建失败",opencliHealthUnknown:"未检查",opencliCatalogSourceManifest:"安装目录 manifest",opencliCatalogSourceCliList:"opencli list",opencliCatalogSourceLocalManifest:"本地 manifest",opencliCatalogSourceCache:"最近一次缓存",opencliRuntimeReady:"裁剪运行时已就绪",opencliRuntimeFailed:"裁剪运行时失败",opencliRuntimePending:"裁剪运行时构建中",opencliRuntimeStale:"裁剪运行时已过期",opencliRuntimeIdle:"还没生成运行时",opencliRefreshDone:"OpenCLI 状态已刷新",opencliRefreshReady:"OpenCLI 状态已刷新,新会话可使用当前运行时",opencliRefreshCacheRetained:"刷新失败,已保留最近一次成功目录缓存",opencliRefreshUnavailable:"当前无法读取 OpenCLI 目录",opencliSaveReady:"OpenCLI 设置已保存,新会话会使用新的裁剪运行时",opencliSaveEnabled:"OpenCLI 设置已保存,但当前运行时还不可用",opencliSaveDisabled:"OpenCLI 已从新会话里关闭",opencliEmpty:"当前没有可展示的 OpenCLI 命令目录。",opencliEmptyNotInstalled:"当前机器还没发现 OpenCLI 安装,先装好后再回来刷新。",opencliCatalogGridTitle:"CLI技能目录",opencliCatalogGridDescription:"先用标签缩小范围,再按站点卡片查看和切换具体命令。",opencliDetailAction:"详情",opencliDetailTitle:"OpenCLI 详情",opencliDetailStatusHeading:"当前状态",opencliDetailRuntimeIdLabel:"运行时 ID",opencliDetailRuntimeRootLabel:"运行时目录",opencliDetailErrorHeading:"最近错误",opencliEnabledStateLabel:"新会话启用",opencliEnabledStateOn:"已启用",opencliEnabledStateOff:"已关闭",opencliFilterTabsLabel:"OpenCLI CLI技能筛选",opencliFilterAll:"全部",opencliFilterEnabled:"已启用",opencliFilterBrowser:"依赖浏览器",opencliFilterDirect:"可直接运行",opencliFilterStrategy:"策略 {strategy}",opencliFilteredEmpty:"当前筛选条件下没有可展示的 CLI技能。",opencliSiteToggleLabel:"切换站点 {site}",opencliSiteSummary:"已启用 {enabled}/{total},其中 {browser} 条依赖浏览器桥。",opencliSiteSummaryCompact:"{enabled}/{total} 已启用",opencliSiteBrowserCompact:"{count} 条依赖浏览器",opencliSiteDirectCompact:"无需浏览器桥",opencliSiteCommandCount:"{count} 条命令",opencliSiteDescriptionEmpty:"这个站点暂时没有补充说明,你可以展开下面的命令明细继续筛选。",opencliSiteViewAction:"查看",opencliSiteSelectedAction:"正在查看",opencliSiteEnableAction:"启用",opencliSiteDetailTitle:"{site} 命令",opencliSiteDetailDescription:"当前筛选命中 {count} 条,可在这里逐条控制;这个站点总共 {total} 条。",opencliSiteDescriptionHeading:"站点说明",opencliCommandModalFallbackTitle:"命令列表",opencliCommandModalEmpty:"当前筛选条件下,这个 CLI技能站点没有可展示的命令。",opencliCommandSearchLabel:"搜索命令",opencliCommandSearchPlaceholder:"按命令名、说明或策略筛选",opencliCommandSortLabel:"排序方式",opencliCommandSortStatus:"按状态",opencliCommandSortBrowser:"浏览器优先",opencliCommandSortName:"按名称",opencliCommandResultCount:"当前显示 {count} 条",opencliCommandToggleLabel:"切换命令 {commandId}",opencliBrowserTag:"浏览器桥",opencliHttpTag:"HTTP",opencliCommandDescriptionEmpty:"这条目录项没有提供额外说明。",opencliStrategyUnknown:"策略未知",opencliStrategyLabel:"类型:{strategy}",opencliStrategyShortLabel:"{strategy}",opencliStrategyCookie:"Cookie",opencliStrategyHeader:"请求头",opencliStrategyIntercept:"拦截",opencliStrategyLocal:"本地",opencliStrategyPublic:"公开",opencliStrategyUi:"界面",skillConfigTabsLabel:"技能管理标签页",skillConfigTabSkills:"SKILL",skillConfigTabOpenCli:"OpenCLI"},shell:{title:"工作台",subtitle:"管理代码项目里的 AI 会话",mobileWorkspacesEntry:"工作区",mobileTerminalsEntry:"终端",mobileSessionsEntry:"对话",mobileToolsEntry:"工具",mobileSettingsEntry:"设置",mobileNavigationAction:"打开工作台菜单",mobileSearchAction:"打开搜索",mobileAuxiliaryAction:"打开工具面板",mobileRevealNavigationAction:"显示主导航",mobileHideNavigationAction:"收起主导航",mobileConversationPreviewTitle:"快速预览",mobileConversationCurrentWorkspaceSection:"当前工作区",mobileConversationCollapsePreviewAction:"收起预览",mobileConversationRestorePreviewAction:"恢复会话预览",iosMoreAction:"更多操作",androidMoreAction:"更多操作",conversationEntry:"对话",terminalsEntry:"终端",butlerEntry:"助手",skillsEntry:"技能",globalNotificationsAction:"通知",globalNotificationsUnreadAria:"未读通知 {count}",globalNotificationsPanelTitle:"通知中心",globalNotificationsPanelDescription:"这里集中看需要你拍板、代办分析结果、跟进状态和验证失败的提醒。",globalNotificationsEmpty:"当前没有新的全局通知。",globalNotificationsShowArchived:"显示已归档通知",globalNotificationsArchiveAction:"归档",globalNotificationsRemoveArchiveAction:"移除归档",globalNotificationsArchiveFailed:"通知归档更新失败",globalNotificationKindWaitingUser:"等待你决定",globalNotificationKindTodoAnalyzed:"代办分析完成",globalNotificationKindTodoAnalyzeFailed:"代办分析失败",globalNotificationKindFollowUpFailed:"跟进失败",globalNotificationKindFollowUpCompleted:"跟进完成",globalNotificationKindVerificationFailed:"验证失败",globalNotificationTodoAnalyzedTitle:"代办分析完成:{title}",globalNotificationTodoAnalyzeFailedTitle:"代办分析失败:{title}",globalNotificationFollowUpWaitingTitle:"需要你决定:{title}",globalNotificationFollowUpFailedTitle:"跟进失败:{title}",globalNotificationFollowUpCompletedTitle:"跟进完成:{title}",globalNotificationVerificationFailedTitle:"验证失败:{title}",globalNotificationVerificationFailedFallback:"最近一次验证没有通过,请尽快查看。",searchEntry:"搜索",butlerInitTitle:"初始化助手",butlerInitDescription:"先设置助手的称呼、provider 和工作方式。助手工作目录和第一版 AGENTS.md 会由系统自动创建。",butlerInitPreviewTitle:"当前预览",butlerInitPreviewDescription:"这不是花架子,下面这些选择会直接决定首版规则的语气和汇报方式。",butlerInitBasicsTitle:"基础设置",butlerInitBasicsDescription:"先把名字、provider 和规则载体定下来,别让初始化阶段长成配置地狱。",butlerInitPersonaTitle:"表达方式",butlerInitPersonaDescription:"语气、语言和总结风格决定它怎么说,不决定它会不会胡来。",butlerInitPreferenceTitle:"默认偏好",butlerInitPreferenceDescription:"这里控制它默认先盯什么风险、先汇报什么结果。",butlerInitRuleLabel:"规则载体",butlerInitTipAutoWorkspace:"系统会自动创建助手目录和首版 AGENTS.md,你现在只需要定默认偏好。",butlerInitTipProviderSwitch:"Provider 后续还能切,不用在第一次初始化时把自己困死。",butlerInitTipReportPriority:"汇报优先级会影响它先告诉你风险、阻塞,还是验证结果。",butlerDisplayNameLabel:"助手称呼",butlerDisplayNamePlaceholder:"例如:阿尔文、小助手",butlerDisplayNameHint:"这是助手的自称,系统会写入 AGENTS.md 首版规则。",butlerProviderLabel:"Provider",butlerWorkspacePathLabel:"助手工作目录",butlerWorkspacePathPlaceholder:"例如:/Users/you/WorkFile/butler-home",butlerAgentsModeLabel:"AGENTS 模式",butlerAgentsModeInline:"内联",butlerAgentsModeFile:"文件",butlerAgentsModeInlineDescription:"内联:系统按你的初始化选项生成规则,后续由系统管理为主。",butlerAgentsModeFileDescription:"文件:系统会在助手独立工作目录下写入 AGENTS.md,后续可以直接改这个文件。",butlerAgentsFilePathLabel:"AGENTS.md 文件路径",butlerAgentsFilePathPlaceholder:"例如:/Users/you/WorkFile/butler-home/AGENTS.md",butlerAgentsContentLabel:"AGENTS 规则内容",butlerAgentsContentPlaceholder:"输入助手的工作规则和解答风格",butlerAgentsContentHint:"这里维护助手的正式规则正文,保存后会直接回写 Butler 专用 AGENTS.md 或内联规则。",butlerPersonaToneLabel:"语气",butlerPersonaLanguageLabel:"使用语言",butlerPersonaSummaryStyleLabel:"总结风格",butlerFocusRiskPreferenceLabel:"风险倾向",butlerFocusReportPriorityLabel:"汇报优先级(逗号分隔)",butlerFocusReportPriorityPlaceholder:"例如:risk,blocker,verification",butlerToneDirect:"直接明确",butlerToneSteady:"稳健克制",butlerToneFriendly:"友好耐心",butlerLanguageZhCn:"中文优先",butlerLanguageEnUs:"英文优先",butlerLanguageBilingual:"中英双语",butlerSummaryBrief:"简明扫一眼",butlerSummaryStructured:"分段清晰",butlerSummaryThorough:"详细展开",butlerRiskConservative:"保守稳妥",butlerRiskBalanced:"推进/风险平衡",butlerRiskProactive:"主动预警",butlerReportPriorityPresetLabel:"汇报优先级",butlerReportRiskFirst:"风险优先",butlerReportBlockerFirst:"阻塞优先",butlerReportVerificationFirst:"验证优先",butlerReportProgressFirst:"进展优先",butlerSummaryDebounceLabel:"会话摘要防抖",butlerSummaryDebounceOption1Minute:"1 分钟",butlerSummaryDebounceOption3Minutes:"3 分钟",butlerSummaryDebounceOption5Minutes:"5 分钟(默认)",butlerSummaryDebounceOption10Minutes:"10 分钟",butlerSummaryDebounceOption15Minutes:"15 分钟",butlerSummaryDebounceOption30Minutes:"30 分钟",butlerSettingsTitle:"助手设置",butlerSettingsSaveAction:"保存设置",butlerSettingsSaving:"保存中...",butlerSettingsSaved:"助手设置已保存",butlerSettingsSaveFailed:"保存助手设置失败",butlerInitSubmitting:"初始化中...",butlerInitSubmit:"完成初始化",butlerInitSuccess:"助手初始化成功",butlerInitFailed:"助手初始化失败",butlerInitNameRequired:"请先输入助手称呼",butlerInitWorkspaceRequired:"请先填写助手工作目录",butlerInitAgentsFileRequired:"文件模式下请填写 AGENTS.md 路径",butlerWorkbenchTitle:"助手工作台",butlerWorkbenchSubtitle:"在这里与助手对话,并查看聚合上下文和动作事件。",butlerWorkspaceHint:"助手工作目录:{workspacePath}",butlerDisplayNameActiveHint:"当前助手称呼:{displayName}",butlerNewSessionAction:"新建会话",butlerNewSessionStarted:"已为助手新建会话",butlerNewSessionFailed:"新建助手会话失败",butlerRefreshAction:"刷新",butlerHistoryAction:"最近会话",butlerHistoryTitle:"最近会话",butlerHistoryDescription:"这里保留所有 Butler 会话,代办分析和普通聊天都会持久化保存。",butlerHistoryEmpty:"还没有助手历史会话。",butlerHistorySearchLabel:"搜索会话",butlerHistorySearchPlaceholder:"搜索会话标题或内容",butlerHistorySearchEmpty:"没有找到匹配的会话。",butlerHistoryActiveSection:"活跃会话",butlerHistoryInactiveSection:"较早会话",butlerHistoryOpenAction:"打开这条会话",butlerHistoryDeleteAction:"删除这条会话",butlerCurrentSessionBadge:"当前会话",butlerControlSessionKindChat:"普通聊天",butlerControlSessionKindTodoAnalysis:"代办分析",butlerLoadingTitle:"助手页面加载中",butlerLoadingDescription:"正在整理当前助手的会话、摘要和控制状态,请稍候。",butlerSidebarInfoTab:"信息",butlerSidebarAutomationTab:"自动化",butlerSidebarSettingsTab:"设置",butlerSidebarTabsLabel:"助手信息栏标签",butlerSidebarLoadFailed:"助手信息栏读取失败",butlerSandboxEntryTitle:"沙箱工作区",butlerSandboxEntryDescription:"助手临时保存的文件会放在这里。",butlerSandboxEntrySessionSummary:"已关联 {count} 个沙箱",butlerSandboxEntryEmptySummary:"",butlerSandboxManageAction:"管理沙箱",butlerSandboxManagerTitle:"沙箱管理",butlerSandboxManagerDescription:"查看当前会话的沙箱和文件。",butlerSandboxBrowseAllAction:"查看所有沙箱",butlerSandboxManagerCurrentDescription:"这里显示当前会话正在用的沙箱。",butlerSandboxManagerIdleDescription:"当前会话有沙箱时会显示在这里。",butlerSandboxCreateTitle:"新建沙箱",butlerSandboxCreateDescription:"默认空白沙箱;需要复现实仓问题时再直接 clone。",butlerSandboxListTitle:"现有沙箱",butlerSandboxListDescription:"只保留临时用途的工作区,能删就删,别把垃圾一直堆着。",butlerSandboxCurrentTitle:"当前沙箱",butlerSandboxCurrentPanelDescription:"这里显示当前正在查看的沙箱。",butlerSandboxCurrentDescription:"这里只显示当前会话正在用的沙箱。",butlerSandboxLibraryTitle:"所有沙箱",butlerSandboxLibraryDescription:"这里可以查看或删除已有沙箱。",butlerSandboxLibraryEmpty:"还没有可查看的沙箱。",butlerSandboxCurrentSessionHint:"当前会话:{session}",butlerSandboxNoControlSession:"暂无沙箱",butlerSandboxTitleLabel:"沙箱标题",butlerSandboxTitlePlaceholder:"例如:CodingNS 临时排查",butlerSandboxSourceKindLabel:"来源方式",butlerSandboxSourceBlank:"空白沙箱",butlerSandboxSourceClone:"Clone 仓库",butlerSandboxPurposeLabel:"用途",butlerSandboxPurposePlaceholder:"一句话说明这个沙箱拿来干什么",butlerSandboxRepositoryLabel:"仓库地址",butlerSandboxRepositoryPlaceholder:"例如:https://github.com/org/repo.git",butlerSandboxDirectoryLabel:"目录名(可选)",butlerSandboxDirectoryPlaceholder:"不填就按标题或仓库名自动生成",butlerSandboxProjectProviderHint:"晋升为项目时会默认使用 {provider}。",butlerSandboxLoading:"正在读取沙箱列表...",butlerSandboxEmpty:"当前没有沙箱。",butlerSandboxWorkspaceMissing:"对应工作区已不存在",butlerSandboxPurposeEmpty:"没有额外说明",butlerSandboxCreateAction:"创建沙箱",butlerSandboxCreating:"创建中...",butlerSandboxOpenAction:"查看",butlerSandboxPromoteAction:"晋升为项目",butlerSandboxExpireAction:"标记过期",butlerSandboxRemoveAction:"删除沙箱",butlerSandboxActionRunning:"处理中...",butlerSandboxLoadFailed:"读取沙箱列表失败",butlerSandboxCreateSucceeded:"沙箱已创建",butlerSandboxCreateFailed:"创建沙箱失败",butlerSandboxPromoteSucceeded:"沙箱已晋升为项目",butlerSandboxPromoteFailed:"晋升沙箱失败",butlerSandboxExpireSucceeded:"沙箱已标记为过期",butlerSandboxExpireFailed:"标记沙箱过期失败",butlerSandboxRemoveSucceeded:"沙箱已删除",butlerSandboxRemoveFailed:"删除沙箱失败",butlerSandboxRepositoryRequired:"Clone 沙箱必须填写仓库地址",butlerSandboxVisibilityLabel:"可见性",butlerSandboxVisibilityAssistantOnly:"仅助手可见",butlerSandboxVisibilityPinned:"已固定保留",butlerSandboxStatusOrphaned:"已孤立",butlerSandboxUpdatedAtLabel:"最近更新",butlerSandboxWorkspaceLabel:"沙箱目录",butlerSandboxFilesTitle:"沙箱文件",butlerSandboxFilesDescription:"选中一个沙箱后,在这里查看文件。",butlerSandboxSelectHint:"请选择一个沙箱。",butlerInfoContextTitle:"当前上下文",butlerInfoContextDescription:"这里先告诉你助手这一轮正在看什么,不把无关信息一股脑塞进来。",butlerInfoCurrentScopeLabel:"当前范围",butlerInfoCurrentScopeProject:"项目:{projectName}",butlerInfoCurrentScopeGlobal:"全局总览",butlerInfoManagedProjectsLabel:"已跟踪项目",butlerInfoManagedProjectsValue:"活跃 {activeCount} / 全部 {totalCount}",butlerInfoCurrentContextProjectHint:"当前已经切到 {projectName},助手后续补查会优先围绕这个项目展开。",butlerInfoCurrentContextGlobalHint:"当前还是全局视角,只有你点进项目或追问细节时,助手才继续补查更深的信息。",butlerInfoProjectSelectedAction:"当前已选中",butlerInfoProjectViewAction:"查看这个项目",butlerInfoProjectBlockedBadge:"有阻塞",butlerInfoProjectRiskBadge:"风险:{riskLevel}",butlerInfoProjectRiskShortBadge:"风险 {riskLevel}",butlerInfoProjectLastActivityBadge:"最近活跃:{updatedAt}",butlerInfoLatestSessionAction:"打开最近会话",butlerInfoProgressTitle:"当前进展",butlerInfoAttentionTitle:"需要留意",butlerInfoNextStepTitle:"建议下一步",butlerInfoFollowUpRecordsTitle:"会话跟进",butlerInfoFollowUpRecordsDescription:"这里只显示最近 5 条会话跟进状态,完整历史通过按钮展开查看。",butlerInfoFollowUpRecordsEmpty:"还没有会话跟进记录。",butlerInfoFollowUpUntitled:"未命名会话",butlerInfoFollowUpFallback:"最近更新时间:{updatedAt}",butlerFollowUpHistoryAction:"查看历史",butlerFollowUpHistoryTitle:"会话跟进历史",butlerFollowUpHistoryDescription:"这里查看完整的会话跟进状态历史,并可继续下钻轮次详情。",butlerInfoVerificationRecordsTitle:"会话验证",butlerInfoVerificationRecordsDescription:"这里看全局的功能验证记录。",butlerInfoVerificationRecordsEmpty:"还没有会话验证记录。",butlerInfoVerificationFallback:"当前状态:{status}",butlerVerificationHistoryTitle:"会话验证历史",butlerVerificationHistoryDescription:"这里只收口非进行中的验证记录,进行中的验证仍留在信息栏主列表。",butlerVerificationHistoryEmpty:"还没有可查看的历史验证记录。",butlerInfoTodoRecordsTitle:"代办进度",butlerInfoTodoRecordsDescription:"这里看当前汇总出来的代办推进情况。",butlerInfoTodoRecordsEmpty:"还没有代办进度记录。",butlerInfoShowCompletedAction:"显示已完成记录",butlerInfoTodoItemTitle:"代办 {index}",butlerInfoTodoPending:"待处理",butlerInfoTodoInProgress:"进行中",butlerInfoTodoClosed:"已关闭",butlerTodoLifecyclePending:"待分析",butlerTodoLifecycleAnalyzing:"分析中",butlerTodoLifecycleAnalyzed:"已生成提示词",butlerTodoLifecycleSessionCreated:"已创建会话",butlerTodoLifecycleFollowUpActive:"助手处理中",butlerTodoLifecycleCompleted:"已完成",butlerTodoLifecycleFailed:"处理失败",butlerTodoLifecycleEmpty:"这条代办还没有生成分析摘要。",butlerTodoPromptPreviewAction:"查看开发提示词",butlerTodoAnalyzeAction:"分析仓库",butlerTodoReanalyzeAction:"重新分析",butlerTodoAnalyzeRunning:"分析中...",butlerTodoAnalyzeQueued:"已加入后台分析队列",butlerTodoAnalyzeSucceeded:"已生成开发提示词",butlerTodoAnalyzeFailed:"代办仓库分析失败",butlerTodoAnalyzeFirstAction:"先分析代办",butlerTodoWaitForPromptAction:"等待分析完成",butlerTodoStartSessionAction:"创建会话",butlerTodoStartSessionRunning:"创建中...",butlerTodoCopyPromptAction:"复制提示词",butlerTodoOpenSessionAction:"打开会话",butlerTodoCopyPromptSucceeded:"开发提示词已复制",butlerTodoStartSessionSucceeded:"已为代办创建开发会话",butlerTodoStartSessionFailed:"代办会话创建失败",butlerAutomationTasksTitle:"自动化任务",butlerAutomationTasksDescription:"这里只看自动化任务本身:有哪些任务、现在什么状态、下一次什么时候运行。",butlerAutomationTasksEmpty:"当前还没有自动化任务。",butlerAutomationMobileOverviewDescription:"主列表只保留关键状态,点卡片再看完整配置和编辑项。",butlerAutomationRunsTitle:"最近运行记录",butlerAutomationRunsDescription:"这里只看自动化任务最近执行了什么,以及每次运行的结果。",butlerAutomationRunsEmpty:"最近还没有自动化运行记录。",butlerAutomationHistoryTitle:"自动化历史",butlerAutomationHistoryDescription:"这里只收口非进行中的自动化任务和历史运行记录,进行中的自动化继续留在主列表。",butlerAutomationHistoryEmpty:"还没有可查看的自动化历史记录。",butlerAutomationStatusActive:"进行中",butlerAutomationStatusWaitingUser:"等你决定",butlerAutomationStatusCompleted:"已完成",butlerAutomationStatusFailed:"失败",butlerAutomationStatusCancelled:"已取消",butlerAutomationTaskTypeLabel:"任务类型",butlerAutomationTaskTypeManual:"手动计划任务",butlerAutomationTaskTypeInterval:"定时计划任务",butlerAutomationTaskTypeCron:"Cron 计划任务",butlerAutomationTaskTypeFollowUp:"条件跟进任务",butlerAutomationTaskTypeControlTimer:"助手计时器",butlerAutomationTaskEnabled:"已启用",butlerAutomationTaskDisabled:"已停用",butlerAutomationStatusLabel:"当前状态",butlerAutomationTaskLastRunLabel:"最近运行",butlerAutomationTaskNextRunLabel:"下一次运行",butlerAutomationOpenDetailsAction:"查看配置",butlerAutomationCollapseDetailsAction:"收起详情",butlerAutomationDetailTitle:"自动化配置",butlerAutomationDetailDescription:"这里直接改触发条件和动作内容,保存后立刻生效。",butlerAutomationSaveAction:"保存配置",butlerAutomationSaving:"保存中...",butlerAutomationSaveSucceeded:"自动化配置已保存",butlerAutomationSaveFailed:"自动化配置保存失败",butlerAutomationTitleLabel:"自动化名称",butlerAutomationPromptLabel:"动作内容",butlerAutomationPromptRequired:"动作内容不能为空。",butlerAutomationIncludeTriggerContextLabel:"把触发上下文一并带给助手",butlerAutomationTargetSessionLabel:"目标会话",butlerAutomationDueAtLabel:"执行时间",butlerAutomationEverySecondsLabel:"每隔秒数",butlerAutomationEveryMinutesLabel:"每隔分钟",butlerAutomationEveryHoursLabel:"每隔小时",butlerAutomationStopAtLabel:"停止时间",butlerAutomationCronMinuteLabel:"Cron 分钟",butlerAutomationCronHourLabel:"Cron 小时",butlerAutomationCronDaysOfWeekLabel:"执行星期",butlerAutomationPollIntervalLabel:"轮询间隔(秒)",butlerAutomationExpiresAtLabel:"过期时间",butlerAutomationMaxChecksLabel:"最多检查次数",butlerAutomationInvalidDateSuffix:"格式不对,请重新填写时间。",butlerAutomationRequiredSuffix:"不能为空。",butlerAutomationInvalidNumberSuffix:"必须是整数。",butlerAutomationInvalidPositiveNumberSuffix:"必须大于 0。",butlerAutomationCronDaysValidation:"执行星期必须写成 0 到 6 的逗号分隔整数。",butlerAutomationRunSourceLabel:"来源",butlerAutomationRunSourcePatrol:"计划任务运行",butlerAutomationRunSourceFollowUp:"条件跟进运行",butlerAutomationRunSourceControlTimer:"助手定时续接",butlerAutomationRunSummaryLabel:"运行结果",butlerAutomationRunProcessedAtLabel:"运行时间",butlerAutomationRunEmptySummary:"本次运行没有返回摘要。",butlerAutomationPatrolRunTitle:"巡视任务运行",butlerControlTimerBannerTitle:"等待中的下一步",butlerControlTimerCountdownActive:"助手将在 {duration} 后继续下一步",butlerControlTimerCountdownDueNow:"助手即将继续下一步",butlerControlTimerCountdownLead:"助手将在",butlerControlTimerCountdownTail:"后继续下一步",butlerControlTimerCountdownDueLead:"助手即将",butlerControlTimerCountdownDueTail:"继续下一步",butlerControlTimerDueAtLabel:"预计时间:{time}",butlerControlTimerTypeOnce:"单次",butlerControlTimerTypeRepeat:"重复",butlerControlTimerTypeConditional:"条件",butlerControlTimerTypeOther:"其他",butlerControlTimerWorkspaceLabel:"目标工作区",butlerControlTimerSessionLabel:"目标会话",butlerControlTimerTargetSessionLabel:"目标会话:{sessionId}",butlerControlTimerDetailAction:"查看提示词详情",butlerControlTimerPromptTitle:"续接提示词",butlerControlTimerUnknownWorkspace:"未关联工作区",butlerControlTimerUnknownSession:"未关联会话",butlerControlTimerStopAction:"停止动作",butlerControlTimerCancelOperationAction:"取消操作",butlerControlTimerExecuteNowAction:"停止计时",butlerControlTimerExecutingNow:"立即执行中...",butlerControlTimerExecuteNowSucceeded:"已结束等待并立即执行这步动作",butlerControlTimerExecuteNowFailed:"结束等待并立即执行失败",butlerControlTimerActionNote:"停止动作:取消本轮自动续接。停止计时:结束等待并立刻执行。",butlerControlTimerCancelAction:"取消计时",butlerControlTimerCancelling:"取消中...",butlerControlTimerCancelSucceeded:"已取消这条助手计时器",butlerControlTimerCancelFailed:"取消助手计时器失败",butlerControlTimerRunCompletedSummary:"计时器已到点,助手已经继续下一步。",butlerControlTimerRunCancelledSummary:"这条计时器已手动取消。",butlerControlTimerRunFailedSummary:"计时器触发失败,请查看错误信息。",butlerControlTimerNoProject:"未关联项目",butlerAutomationObjectiveLabel:"当前目标",butlerAutomationLatestAssessmentLabel:"最近判断",butlerAutomationWaitingReasonLabel:"等你决定什么",butlerAutomationNextCheckLabel:"下一次查看",butlerAutomationFinishedAtLabel:"结束时间",butlerAutomationViewRoundsAction:"查看每轮详情",butlerAutomationRoundDetailsTitle:"跟进轮次详情",butlerAutomationRoundDetailsDescription:"查看这个跟进任务每一轮的判断和动作。",butlerAutomationRoundLoading:"正在读取跟进轮次详情...",butlerAutomationRoundLoadFailed:"读取跟进轮次详情失败",butlerAutomationRoundEmpty:"当前还没有可展示的跟进轮次详情。",butlerAutomationRoundLabel:"第 {round} 轮",butlerAutomationRoundProcessedAtLabel:"处理时间",butlerAutomationRoundStatusLabel:"任务状态",butlerAutomationRoundObservedStateLabel:"会话运行状态",butlerAutomationRoundSummaryLabel:"这一轮判断",butlerAutomationRoundWaitingReasonLabel:"等待原因",butlerAutomationRoundPromptLabel:"代理发送内容",butlerAutomationRoundKindStarted:"开始跟进",butlerAutomationRoundKindContinue:"已直接续接",butlerAutomationRoundKindQueued:"已进入消息队列",butlerAutomationRoundKindWaitingUser:"等待用户处理",butlerAutomationRoundKindCompleted:"确认完成",butlerAutomationRoundKindFailed:"跟进失败",butlerAutomationRoundKindCancelled:"手动终止",butlerAutomationRoundKindLimitReached:"达到轮数上限",butlerInboxAction:"收件箱",butlerInboxModalTitle:"收件箱",butlerInboxModalDescription:"在这里记录项目代办,并按项目维护当前推进情况。",butlerInboxLoading:"正在读取收件箱...",butlerInboxLoadFailed:"收件箱读取失败",butlerInboxProjectsEmpty:"还没有可绑定的项目,请先在管家里管理项目。",butlerInboxEmpty:"还没有收件箱记录。",butlerInboxCreateTitle:"新增代办",butlerInboxEditingTitle:"编辑代办",butlerInboxFormDescription:"每条代办都必须绑定到一个项目,后续助手才能围绕它继续跟进。",butlerInboxListTitle:"当前代办",butlerInboxListDescription:"这里会列出你管理的项目代办,方便统一收口处理。",butlerInboxShowClosedAction:"显示已关闭",butlerInboxQuickStatusLabel:"快速设置进度",butlerInboxProjectLabel:"绑定项目",butlerInboxTypeLabel:"类型",butlerInboxTitleLabel:"标题",butlerInboxTitlePlaceholder:"例如:登录页验证码收尾",butlerInboxContentLabel:"内容",butlerInboxContentPlaceholder:"写清楚当前问题、目标或你希望助手后续继续推进的点。",butlerInboxStatusLabel:"进度",butlerInboxTypeTask:"任务",butlerInboxTypeBug:"缺陷",butlerInboxTypeFeature:"新功能",butlerInboxTypeChange:"修改",butlerInboxStatusPending:"待处理",butlerInboxStatusInProgress:"进行中",butlerInboxStatusClosed:"已关闭",butlerInboxCreateAction:"新增代办",butlerInboxUpdateAction:"保存修改",butlerInboxCancelEditAction:"取消编辑",butlerInboxEditAction:"编辑",butlerInboxDeleteAction:"删除",butlerInboxCreated:"代办已新增",butlerInboxUpdated:"代办已更新",butlerInboxDeleted:"代办已删除",butlerInboxSaveFailed:"代办保存失败",butlerInboxDeleteFailed:"代办删除失败",butlerProviderSwitched:"Provider 已切换",butlerProviderSwitchedDescription:"已切换到 {provider},当前视图已重置并重新加载。",butlerProviderSwitchFailed:"Provider 切换失败",butlerAttachmentUnsupported:"助手对话暂不支持附件",butlerOverviewTitle:"整体情况",butlerOverviewDescription:"这里会先帮你整理当前最值得关注的内容。",butlerMetricProjectCount:"项目",butlerMetricBlockedCount:"阻塞",butlerMetricHighRiskCount:"高风险",butlerTopRisksTitle:"优先风险",butlerNextActionsTitle:"建议动作",butlerOverviewEmpty:"暂无",butlerOverviewLoading:"正在读取助手聚合摘要...",butlerEventsTitle:"最近操作",butlerEventsDescription:"助手最近帮你做过什么,这里会记下来。",butlerEventsEmpty:"暂无动作事件",butlerLoadFailed:"助手工作台加载失败",butlerContextStrategyTitle:"按需上下文",butlerContextStrategyDescription:"默认只给助手全局摘要,只有你点到某个项目时,才再向后端补拉该项目的会话、记忆、巡视和验证摘要。",butlerConversationTitle:"与助手对话",butlerConversationDescription:"这个对话窗口只属于 {displayName}。需要细节时,{displayName} 会先用聚合摘要回答,再按需直达后端补查具体项目、会话、巡视或验证信息。",butlerComposerPlaceholder:"直接对 {displayName} 说你现在想搞清楚什么",butlerProjectsTitle:"项目",butlerProjectsDescription:"选一个项目,助手就会继续帮你查它的进展和记录。",butlerProjectsEmpty:"暂无可下钻的项目",butlerProjectWorkspaceLabel:"所属工作区:{workspaceId}",butlerProjectSummaryEmpty:"暂无可用摘要",butlerProjectOpenDetailAction:"查看详情",butlerProjectSyncAction:"同步到时间线",butlerProjectSyncSucceeded:"已把项目 {projectName} 同步到助手时间线",butlerProjectActionRequiresSession:"先和助手说一句话,然后再让它继续处理项目。",butlerProjectContextTitle:"当前项目",butlerProjectContextDescription:"这里会显示这个项目的会话、记录和结果。",butlerProjectContextEmpty:"先从上面的项目列表或动作事件里选一个项目。",butlerProjectContextLoading:"正在读取项目关联信息...",butlerProjectContextMeta:"项目状态:{status} · 风险级别:{riskLevel}",butlerProjectActionSucceeded:"助手动作已执行",butlerProjectActionFailed:"助手动作失败",butlerProjectActionPending:"处理中...",butlerProjectSessionsTitle:"项目会话",butlerProjectMemoriesTitle:"项目记忆",butlerProjectPatrolsTitle:"巡视记录",butlerProjectVerificationsTitle:"验证记录",butlerProjectOpenConversationAction:"打开真实会话",butlerProjectResumeAction:"续接会话",butlerProjectResumeSucceeded:"已续接会话:{sessionTitle}",butlerProjectStartPatrolAction:"发起巡视",butlerProjectPatrolSucceeded:"已为 {projectName} 发起巡视",butlerProjectStartVerificationAction:"发起验证",butlerProjectVerificationSucceeded:"已为 {projectName} 发起验证",butlerProjectMemoryMeta:"类型:{memoryType} · 状态:{status}",butlerProjectSessionMeta:"角色:{role} · 状态:{status}",butlerProjectPatrolMeta:"状态:{status} · 风险:{riskLevel}",butlerProjectVerificationMeta:"类型:{verificationType} · 状态:{status}",butlerProjectRunSummaryEmpty:"暂无摘要",butlerProjectFocusAction:"定位这条记录",butlerProjectUpdatedAtLabel:"更新时间:{updatedAt}",butlerFocusedBadge:"当前定位",searchModalTitle:"搜索",searchModalDescription:"支持搜会话标题,或在当前工作区里搜代码文件。",searchModeLabel:"搜索模式",searchModeSessions:"会话",searchModeCode:"代码",searchKeywordLabel:"关键词",searchWorkspaceLabel:"工作区",searchSessionPlaceholder:"输入会话名称、工作区或 provider",searchCodePlaceholder:"输入文件名或路径片段",searchSessionHint:"输入关键词后,这里会立即列出匹配的会话。",searchCodeHint:"选一个工作区,然后搜文件名或路径。",searchSessionEmpty:"没找到匹配的会话。",searchCodeEmpty:"没找到匹配的文件。",searchCodeFailed:"代码搜索失败,请稍后重试。",searchSubmit:"开始搜索",filesEntry:"文件",gitEntry:"GIT",terminalManagerEntry:"调试",workspaceSectionTitle:"工作区",goBack:"后退",goForward:"前进",workspaceCount:"项目",sessionCount:"会话",manageWorkspaceAction:"管理项目",manageWorkspaceTitle:"管理项目",manageWorkspaceDescription:"默认只列出当前已加载的项目,展开后可以查看路径、Git 摘要、代码类型组成,也可以从当前工作台列表里移除。",manageWorkspaceImportAction:"导入项目",manageWorkspaceCloneAction:"Clone项目",manageWorkspaceEmpty:"当前没有可管理的项目。",manageWorkspaceLoading:"正在读取项目详情...",manageWorkspaceLoadFailed:"项目详情加载失败",manageWorkspacePathLabel:"路径",manageWorkspaceGitCommitCount:"Git 提交版本数",manageWorkspaceGitInfoLabel:"Git 仓库信息",manageWorkspaceRepoRoot:"仓库根目录",manageWorkspaceCurrentBranch:"当前分支",manageWorkspaceRemoteLabel:"远程",manageWorkspaceNoRemote:"未配置远程",manageWorkspaceNotGit:"当前项目不是 Git 仓库。",manageWorkspaceCodeCompositionLabel:"代码类型组成",manageWorkspaceCodeCompositionFiles:"文件",manageWorkspaceCodeCompositionOther:"其他",manageWorkspaceNoCodeComposition:"暂时没有识别到可统计的代码文件。",manageWorkspaceCodeTruncated:"文件过多,只统计了前 {count} 个可识别文件。",manageWorkspaceColorLabel:"背景颜色",manageWorkspaceColorSelectSwatch:"使用颜色 {color}",manageWorkspaceColorClearAction:"清除颜色",manageWorkspaceColorUnset:"未设置,当前使用默认颜色",manageWorkspaceColorSaveFailed:"工作区颜色保存失败",manageWorkspaceRemoveAction:"移除项目",manageWorkspaceRemoving:"移除中...",manageWorkspaceRemoveSuccess:"项目已从当前工作台移除",manageWorkspaceRemoveFailed:"移除项目失败",manageWorkspaceRemoveConfirmTitle:"确认移除项目",manageWorkspaceRemoveConfirmDescription:"这只会把项目从当前工作台列表移除,不会删除任何磁盘数据或历史记录。后续重新加载同一路径时,旧记录会直接恢复显示。",manageWorkspaceRemoveConfirmTarget:"确定移除「{name}」吗?",manageWorkspaceRemoveConfirmAction:"确认移除",importWorkspaceTitle:"添加项目",importWorkspaceHint:"导入本地代码目录",importExpand:"展开",importCollapse:"收起",importPathLabel:"项目路径",importPathPlaceholder:"输入项目文件夹路径",importNameLabel:"项目名称",importNamePlaceholder:"可选",importSubmit:"添加项目",importSubmitting:"添加中...",importChooseFolder:"选择文件夹",importPickFolderFailed:"打开文件夹选择器失败",importDesktopDropHint:"支持把本地项目文件夹直接拖到这个区域",importHint:"输入本地代码目录后就能开始工作",importServerDirectoryHint:"浏览并选择运行服务器上的项目目录",importBrowserTitle:"选择服务器目录",importBrowserDescription:"这里浏览的是项目运行所在服务器上的目录,不是当前设备的本地目录。",importBrowserCurrentPath:"当前目录",importBrowserRoots:"根目录",importBrowserOpenParent:"返回上一级",importBrowserOpenPath:"打开路径",importBrowserCreateDirectory:"新建文件夹",importBrowserCreateDirectoryTitle:"新建文件夹",importBrowserCreateDirectoryDescription:"只在当前服务器目录下新建一层子文件夹,不接受带路径的输入。",importBrowserCreateDirectoryLabel:"文件夹名称",importBrowserCreateDirectoryPlaceholder:"输入新文件夹名称",importBrowserCreateDirectorySuccess:"文件夹已创建",importBrowserCreateDirectoryFailed:"新建文件夹失败",importBrowserCreateDirectorySubmit:"确认新建",importBrowserCreatingDirectory:"新建中...",importBrowserEmpty:"当前目录下没有可选的子目录",importBrowserBrowseFailed:"加载服务器目录失败",importBrowserSubmit:"导入当前目录",importPathRequired:"请输入项目路径",importSuccess:"项目已添加",importFailed:"添加失败",cloneWorkspaceTitle:"Clone项目",cloneWorkspaceHint:"从 Git 仓库拉取代码到服务端目录,完成后直接加入项目列表。",cloneSubmit:"Clone项目",cloneSubmitting:"Clone 中...",cloneRepositoryLabel:"Git 仓库地址",cloneRepositoryPlaceholder:"例如:https://github.com/org/repo.git",cloneParentPathLabel:"目标父目录",cloneParentPathPlaceholder:"选择后端服务上已存在的目录",cloneDirectoryNameLabel:"新项目目录名",cloneDirectoryNamePlaceholder:"留空时默认使用仓库名",clonePickDirectory:"选择目录",cloneAuthModeLabel:"认证方式",cloneAuthModeNone:"无认证",cloneAuthModeBasic:"用户名 + 密码",cloneAuthModeToken:"Token",cloneUsernameLabel:"用户名",cloneUsernamePlaceholder:"输入 Git 用户名",clonePasswordLabel:"密码",clonePasswordPlaceholder:"输入 Git 密码",cloneTokenLabel:"Token",cloneTokenPlaceholder:"输入 access token",cloneTokenUsernamePlaceholder:"可选,留空时默认使用 git",cloneRepoRequired:"请输入 Git 仓库地址",clonePathRequired:"请选择目标父目录",cloneSuccess:"项目已成功 Clone",cloneFailed:"Clone 失败",cloneHint:"目标父目录必须已经存在,Clone 时会在这个目录下新建仓库文件夹。",cloneBrowserTitle:"选择 Clone 目标父目录",cloneBrowserDescription:"这里选的是服务端已存在的父目录,Clone 时会在其下新建一个项目文件夹。",cloneBrowserSubmit:"使用当前目录",refreshNavigation:"刷新",desktopChromeLabel:"桌面工作台",windowMinimize:"最小化窗口",windowMaximize:"最大化或还原窗口",windowClose:"关闭窗口",contextOpenSession:"打开会话",navigationLoadFailed:"加载失败,请重试",emptyNavigationTitle:"还没有项目",emptyNavigationBody:"添加本地代码目录开始工作",emptyWorkspaceSessions:"暂无会话",favoriteSectionTitle:"收藏会话",favoriteSectionEmpty:"收藏后的会话会固定放在这里,方便你快速回到常用链路。",worktreeSectionTitle:"子工作树",worktreeSectionExpand:"展开子工作树",worktreeSectionCollapse:"收起子工作树",worktreeMergePanelLabel:"工作树合并",worktreeMergePanelTitle:"合回直接父工作区",worktreeMergeExpandDetails:"展开详情",worktreeMergeCollapseDetails:"收起详情",worktreeMergePreviewAction:"预检",worktreeMergePreviewRefresh:"预检",worktreeMergePreviewIdle:"尚未预检",worktreeMergePreviewLoading:"预检中...",worktreeMergeReady:"可以合并",worktreeMergeBlocked:"当前不能合并",worktreeMergeApplying:"合并中...",worktreeMergeApplyAction:"合并",worktreeMergeApplySuccess:"子工作树已经合回直接父工作区",worktreeMergeApplyFailed:"合并子工作树失败",worktreeMergePreviewFailed:"读取工作树合并预检失败",worktreeMergeAlreadyMerged:"已合回直接父工作区",worktreeMergeMergedHint:"代码已经合回直接父工作区,下一步可以继续做清理。",worktreeMergeMergedDirtyHint:"提交历史已经同步到父工作区,但当前子工作树还有未处理事项,暂时不能清理。",worktreeMergeChecklistTitle:"合并检查清单",worktreeMergeChecklistSourceState:"工作树状态正常",worktreeMergeChecklistSourceStateBlocked:"当前子工作树状态异常,系统暂时没有把它当作活跃工作树",worktreeMergeChecklistSourceClean:"子工作区已清理",worktreeMergeChecklistSourceCleanBlocked:"当前子工作树存在未提交改动,请先提交",worktreeMergeChecklistTargetClean:"父工作区可接收合并",worktreeMergeChecklistTargetCleanBlocked:"直接父工作区存在未提交改动,不能接收合并",worktreeMergeChecklistChildren:"没有活跃子工作树",worktreeMergeChecklistChildrenBlocked:"当前子工作树下面还有活跃子节点,必须先从叶子节点开始回收",worktreeMergeChecklistCommits:"存在待合并提交",worktreeMergeChecklistCommitsBlocked:"当前子工作树没有领先父工作区的提交",worktreeMergeChecklistConflicts:"合并不会产生冲突",worktreeMergeChecklistConflictsBlocked:"检测到合并冲突,先处理冲突后再继续",worktreeMergeChecklistResultPending:"等待预检结果",worktreeMergeChecklistResultReady:"可以执行合并",worktreeMergeChecklistResultReadyDetail:"所有条件已满足,可以开始合并",worktreeMergeChecklistResultBlocked:"暂时不能执行合并",worktreeMergeChecklistResultBlockedDetail:"上面的阻塞项解决后,才可以继续",worktreeMergeChecklistResultMerged:"已完成合并,可继续清理",worktreeMergeCompactPending:"待预检",worktreeMergeCompactChecking:"预检中",worktreeMergeCompactReady:"可合并",worktreeMergeCompactBlocked:"受阻",worktreeMergeCompactMerged:"已合并",worktreeMergeCompactMerging:"合并中",worktreeMergeCompactCleaning:"清理中",worktreeMergeCompactInactive:"状态异常",worktreeMergeCompactDirty:"未提交",worktreeMergeCompactTargetDirty:"父区脏",worktreeMergeCompactConflict:"有冲突",worktreeMergeCompactChildren:"有子树",worktreeMergeCompactNoCommits:"无提交",worktreeCleanupAction:"清理",worktreeCleanupRunning:"清理中...",worktreeCleanupSuccess:"工作树已经清理完成",worktreeCleanupFailed:"清理工作树失败",worktreeCleanupModalTitle:"确认清理工作树",worktreeCleanupModalDescription:"默认只清理工作树目录和系统记录。只有分支已经合并进父分支后,才允许额外删除分支。",worktreeCleanupConfirm:"确认清理 {name} 吗?默认会保留 git 分支。",worktreeCleanupDeleteBranchLabel:"同时删除分支 {branch}",worktreeCleanupDeleteBranchHint:"只有分支已经合并进父分支后,才允许删除分支。",worktreeCleanupDeleteBranchAction:"清理并删除分支",worktreeCleanupDeleteBranchSuccess:"工作树和分支 {branch} 已清理完成",worktreeCleanupDeleteBranchPartialFailed:"工作树已清理,但分支 {branch} 删除失败",worktreeMergeCurrentBranch:"当前分支:{branch}",worktreeMergeParentBranch:"父分支:{branch}",worktreeMergeTargetWorkspace:"目标父工作区:{name}",worktreeMergeAheadBehindPending:"提交差异:待预检",worktreeMergeAheadBehind:"提交差异:领先 {ahead} / 落后 {behind}",worktreeMergeBaseCommit:"merge base:{commit}",worktreeMergeConflictLabel:"冲突文件",favoriteAction:"收藏会话",unfavoriteAction:"取消收藏",favoriteAdded:"会话已加入收藏",favoriteRemoved:"会话已取消收藏",favoriteToggleFailed:"收藏状态更新失败",sessionMoreAction:"更多操作",deleteSessionAction:"删除会话",deleteSessionConfirmTitle:"确认删除会话",deleteSessionConfirmDescription:"删除后,这条会话会从助手历史和工作区列表里消失,真实会话记录也会一并清掉,不能恢复。",deleteSessionSuccess:"会话已删除",deleteSessionFailed:"删除会话失败",sessionStateInferred:"推断",renameAction:"重命名",renameSuccess:"会话名称已更新",renameFailed:"会话重命名失败",renameModalTitle:"重命名会话",renameModalDescription:"改成你自己能一眼认出来的名字,只改标题,不改消息内容。",renameInputLabel:"会话名称",renameInputPlaceholder:"输入新的会话名称",renamingSession:"保存中...",archiveFolderLabel:"归档会话",archiveFolderAction:"打开归档文件夹",archiveAction:"归档会话",archiveCurrentSessionAction:"归档当前会话",archiveAdded:"会话已归档",archiveConfirmTitle:"确认归档会话",archiveConfirmDescription:"归档后,这条会话会从当前工作区主列表里隐藏,你仍然可以在归档区恢复它。",unarchiveAction:"取消归档",archiveRestored:"会话已恢复到主列表",archiveModalTitle:"归档会话",archiveModalDescription:"这里列出当前项目暂时隐藏的会话,需要时可以恢复到主列表。",archiveEmpty:"这个项目还没有归档会话。",archiveSearchAction:"搜索",archiveSearchLabel:"搜索归档会话",archiveSearchPlaceholder:"按会话名称或摘要搜索",archiveSearchEmpty:"没有找到匹配的归档会话。",archiveSearchSummaryLoading:"正在补全归档会话摘要...",archiveSearchSummaryFailed:"部分归档会话摘要暂时读取失败,当前只能先按名称搜索。",archiveViewAction:"查看归档会话",parallelCreateAction:"新建并行会话",parallelCreateModalTitle:"创建并行会话",parallelCreateModalDescription:"先定下这组并行会话要解决什么问题,再分别补充每个会话的设置。",parallelCreateSharedPromptLabel:"本次并行会话的目标是",parallelCreateSharedPromptPlaceholder:"例如:围绕同一个需求分别给出不同实现方案、技术路线或问题排查方向。",parallelCreateCountLabel:"并行数量",parallelCreateMembersTitle:"分别设置每个会话",parallelCreateMembersDescription:"每个会话都是真实独立成员,可以单独选择供应商、模型和是否启用临时隔离工作区。",parallelCreateMemberTitle:"成员 {index}",parallelCreateModelLabel:"模型",parallelCreateMemberPromptLabel:"还有特殊的要求吗?",parallelCreateMemberPromptPlaceholder:"例如:更保守、偏重重构、优先排查性能问题,或限定技术栈与输出形式。",parallelCreateIsolationLabel:"启用临时隔离工作区",parallelCreateIsolationHint:"只对需要独立代码目录的成员开启,升级成功前不会进入正式子工作区体系。",parallelCreateProvidersLoading:"正在读取已安装供应商…",parallelCreateNoAvailableProviders:"当前工作区还没有可用的模型供应商,请先安装并接入后再创建并行会话。",parallelCreateNoModelsAvailable:"当前供应商没有可选模型",parallelCreatePromptRequired:"公共提示词不能为空",parallelCreatePartialFailure:"已成功创建 {successCount} 个成员,另有 {failureCount} 个成员未创建成功。",parallelCreateAllFailed:"{failureCount} 个成员都创建失败了,请直接修改对应成员配置后重试。",parallelCreateContinuePartial:"继续查看已创建分屏",parallelCreateMemberSucceeded:"已创建",parallelCreateMemberFailed:"未创建",parallelCreateMemberErrorTitle:"这一条成员没有创建成功",parallelCreateSubmit:"开始并行创建",parallelCreateSubmitting:"正在创建并行会话…",parallelCreateSucceeded:"并行会话已创建",parallelAppendAction:"追加并行会话",parallelAppendModalTitle:"追加并行会话",parallelAppendModalDescription:"沿用这组并行会话最初的用户消息,只补充这次新加成员的设置。",parallelAppendSharedPromptLabel:"本组最初的用户消息",parallelAppendSharedPromptDescription:"这段内容来自当前并行会话组的起始消息,追加成员时不能修改。",parallelAppendCountLabel:"新增数量",parallelAppendSubmit:"追加并行会话",parallelAppendSubmitting:"正在追加并行会话…",parallelAppendSucceeded:"并行会话已追加",parallelAppendNoRemainingSlots:"当前并行会话组已经有 4 个成员,不能继续追加。",parallelGroupBadge:"并行",parallelGroupAnchorBadge:"锚点",parallelGroupMemberBadge:"成员",parallelWorkspacePromotedBadge:"已升级工作区",parallelGroupLoadFailed:"读取并行会话组失败",parallelGroupEmpty:"这组并行会话还没有可展示的成员。",parallelPaneOpenAction:"打开会话",parallelPaneToolsAction:"工具",parallelPanePinAction:"钉住浮窗",parallelPaneDetachAction:"独立窗口",parallelPaneResizeAction:"调整浮窗尺寸",parallelPaneMoreAction:"更多选项",parallelPaneInfoAction:"查看信息",parallelPaneProcessesEntry:"进程",parallelPaneTerminalEntryDescription:"终端更适合输入密集和滚动密集的操作,这里保留独立入口,不硬塞进浮层里。",parallelPaneTerminalOpenAction:"打开终端",parallelPaneInfoTitle:"会话信息",parallelPaneModelFallback:"默认模型",parallelPaneIsolatedWorkspaceTitle:"临时隔离工作区",parallelPanePromptFallback:"未补充特殊要求",parallelPaneColorPaletteLabel:"色板",parallelPaneColorPaletteDescription:"调整这个并行会话 pane 的分色,方便你快速区分不同分支。",parallelPaneColorPaletteReset:"恢复默认分色",parallelPaneRemoveAction:"移除并行会话",parallelPaneRemoveDescription:"移除后,这个并行会话会从当前并行组里消失;如果它仍在临时隔离工作区中,对应工作区和分支也会一起清掉。",parallelPaneRemovePromotedDescription:"移除后,这个并行会话会从当前并行组里消失;已升级为正式子工作区的目录和分支会保留。",parallelPanePromoteAction:"升级为正式子工作区",parallelPanePromoteDescription:"确认这个临时工作区已经值得长期保留后,再把它升级成正式子工作区。",parallelPanePromoting:"正在升级…",parallelPaneRemoving:"正在移除…",subagentBadge:"子代理",sessionForkSession:"会话分叉",sessionForkMessage:"消息分叉",sessionForkReconstructed:"重建分叉",subagentExpand:"展开子代理列表",subagentCollapse:"收起子代理列表",subagentExpandMore:"展开更多子会话",favoriteExpandMore:"显示更多收藏",sessionExpandMore:"显示更多会话",archiveExpandMore:"查看更多归档会话",worktreeCollapse:"收起工作树",worktreeExpand:"展开工作树",workspaceCollapse:"收起项目",workspaceExpand:"展开项目",reorderWorkspace:"拖拽调整项目顺序",switchWorkspace:"切换到此项目",workspaceReorderFailed:"项目排序保存失败",workspaceCollapseStateSaveFailed:"项目折叠状态保存失败",workspaceHomeSwitcherLabel:"切换工作区",workspaceHomeSwitcherTitle:"工作区",hostWorkspaceSwitcherTitle:"HOST 与工作区",hostSwitcherAriaLabel:"切换 HOST",hostSwitcherTitle:"HOST 切换",hostSwitcherSavedSection:"手动保存",hostSwitcherDiscoveredSection:"自动发现",hostSwitcherCurrentBadge:"当前",hostSwitcherDiscoveredBadge:"自动发现",hostSwitcherNodeBadge:"HOST",hostSwitcherAddAction:"新增 HOST",hostSwitcherNameLabel:"HOST 名称",hostSwitcherNamePlaceholder:"例如:办公室 Host",hostSwitcherUrlLabel:"HOST 地址",hostSwitcherUrlPlaceholder:"例如:http://192.168.1.20:3002",hostSwitcherSaveAction:"保存 HOST",hostSwitcherSwitching:"切换中",hostSwitcherDetailAction:"详情",hostSwitcherDetailAriaLabel:"查看 HOST {name} 连接详情",hostSwitcherDetailTitle:"连接详情",hostSwitcherDetailStatusLabel:"连接状态",hostSwitcherDetailStatusRelay:"CodingNS Connect",hostSwitcherDetailStatusDirect:"直连",hostSwitcherDetailRouteLabel:"当前链路",hostSwitcherDetailAddressLabel:"当前地址",hostSwitcherDetailLatencyLabel:"CodingNS Connect 链路延时",hostSwitcherDetailLatencyLoading:"检测中...",hostSwitcherDetailTrafficLabel:"本次会话流量",hostSwitcherDetailUnavailable:"暂时无法获取",hostSwitcherWorkspaceCount:"{count} 个工作区",hostSwitcherWorkspaceCountWithUser:"{username} · {count} 个工作区",hostSwitchFailed:"切换 HOST 失败",hostSwitchUnreachable:"{name} 当前不可达",hostSwitchMissing:"目标 HOST 不存在",hostDeleteAction:"删除 HOST",hostDeleteAriaLabel:"删除 HOST {name}",hostDeleteBusy:"删除中",hostDeleteConfirmAction:"确认删除",hostDeleteConfirm:"确定删除 HOST “{name}”吗?已保存的登录信息也会一起清理。",hostDeleteSuccess:"已删除 HOST:{name}",hostDeleteFailed:"删除 HOST 失败:{name}",hostAddIncompleteCredentials:"用户名和密码要么都填写,要么都留空",hostAddInvalidUrl:"HOST 地址无效",hostAddDuplicate:"这个 HOST 已经存在",hostAddFailed:"新增 HOST 失败",hostAddSuccess:"已新增 HOST:{name}",hostDiscoveryRefreshing:"正在扫描本机 HOST…",hostDiscoveryFailed:"本机 HOST 扫描失败",mobileWorktreeBadge:"工作树",workspaceHomeStatusSectionTitle:"当前工作区",workspaceHomeViewAllAction:"查看全部会话",workspaceHomeMetricActive:"活动",workspaceHomeMetricUnread:"通知",workspaceHomeMetricTerminal:"终端",workspaceHomeMetricChanges:"变更",workspaceHomeActiveSessionsSectionTitle:"活动会话",workspaceHomeQuickLaunchStatusLabel:"快捷调试",workspaceHomeQuickLaunchRunning:"运行中",workspaceHomeQuickLaunchStopped:"未运行",workspaceHomeWaitingInputLabel:"等待输入",workspaceHomeButlerLabel:"助手",mobileButlerEntry:"助手",mobileConversationToolCloseAction:"返回对话",mobileConversationToolTabsLabel:"文件、Git 与调试标签",mobileConversationToolProcessesTab:"调试",mobileButlerEmptyTitle:"助手还没准备好",mobileButlerEmptyBody:"当前还没有完成助手初始化,先在桌面端做完首轮初始化,再回到手机端看跟进和自动化。",butlerProjectSyncEmptyState:"直接给助手一句明确目标,它就会在这里继续推进当前工作。",mobileButlerSummaryTitle:"当前工作区摘要",mobileButlerSummaryProjects:"项目",mobileButlerSummaryFollowUps:"进行中任务",mobileButlerSummaryWaitingUser:"待你处理",mobileButlerSummaryInbox:"未完成代办",mobileButlerAssistantWorkspaceLabel:"助手工作目录",mobileButlerAssistantToneLabel:"沟通风格",mobileButlerAssistantLanguageLabel:"工作语言",mobileButlerAssistantUpdatedAtLabel:"最近更新",workspaceOverviewTitle:"把项目入口放到看得见的地方",workspaceOverviewBody:"先选项目,再决定是继续已有会话,还是开一条新的工作链路。",workspaceListBody:"这里保留当前工作台里的全部项目,并把高频操作直接放到首页。",workspaceDetailTitle:"项目详情",workspaceDetailSummaryTitle:"项目概览",workspaceDetailSummaryBody:"先看当前项目路径、Git 摘要和代码规模,再决定下一步去哪做事。",workspaceDetailMissingTitle:"没找到这个项目",workspaceDetailMissingBody:"这个项目可能已经被移除,或者当前快照还没加载到它。",workspaceDetailDebugTitle:"服务状态",manageWorkspaceDebugDescription:"查看当前项目里的服务识别结果、最近一次启动情况和支持说明。",workspaceDetailDebugAnalyzeFailed:"读取服务状态失败",workspaceDetailDebugFrameworkLabel:"识别类型",workspaceDetailDebugConfidenceLabel:"识别把握",workspaceDetailDebugCompatibilityLabel:"可用程度",workspaceDetailDebugInjectionLabel:"推荐处理方式",workspaceDetailDebugRuntimeStatusLabel:"当前状态",workspaceDetailDebugFailureStageLabel:"卡住位置",workspaceDetailDebugServiceDiscoveryLabel:"服务地址处理",workspaceDetailDebugHmrLabel:"热更新处理",workspaceDetailDebugCallbackLabel:"回调处理",workspaceDetailDebugAiFallbackLabel:"人工处理策略",workspaceDetailDebugFrameworkNoteLabel:"说明",workspaceDetailDebugReasonsLabel:"当前说明",workspaceDetailDebugFilesLabel:"参考文件",workspaceDetailDebugFailureStageEmpty:"暂无",workspaceDetailDebugRuntimeEmpty:"当前还没有运行记录。",workspaceDetailDebugFrameworkNoteEmpty:"当前没有额外兼容说明。",workspaceDetailDebugEmptyReasons:"暂无",workspaceDetailDebugEmptyFiles:"暂无",workspaceDetailDebugConfidenceHigh:"高",workspaceDetailDebugConfidenceMedium:"中",workspaceDetailDebugConfidenceLow:"低",workspaceDetailDebugCompatibilitySupported:"可以直接使用",workspaceDetailDebugCompatibilityConditional:"需要补充处理",workspaceDetailDebugCompatibilityUnsupported:"暂不建议直接使用",workspaceDetailDebugCompatibilityUnknown:"未知",workspaceDetailDebugInjectionCli:"启动参数",workspaceDetailDebugInjectionEnv:"环境变量",workspaceDetailDebugInjectionOverride:"调整启动命令",workspaceDetailDebugInjectionAiFallback:"需要人工辅助",workspaceDetailDebugInjectionNone:"暂不自动处理",workspaceDetailDebugRuntimePreparing:"准备中",workspaceDetailDebugRuntimeRunning:"运行中",workspaceDetailDebugRuntimeFailed:"启动失败",workspaceDetailDebugRuntimeStopped:"已停止",workspaceDetailDebugRuntimeNotStarted:"未启动",workspaceDetailDebugRequirementRequired:"需要补充",workspaceDetailDebugRequirementNotRequired:"不需要补充",workspaceDetailDebugAiPolicyNever:"不建议自动处理",workspaceDetailDebugAiPolicyConditional:"视情况处理",workspaceDetailDebugAiPolicyAllowed:"可以处理",workspaceDetailDebugRuntimeServicesTitle:"最近一次启动",workspaceDetailDebugRuntimeHistoryTitle:"最近几次启动记录",workspaceDetailDebugRuntimeHistoryTimeLabel:"启动时间",workspaceDetailDebugRuntimeHistoryServiceLabel:"涉及服务",workspaceDetailDebugRuntimeHistoryResultLabel:"结果",workspaceDetailDebugRuntimeHistoryTitleWithIndex:"启动记录 #{id}",workspaceDetailDebugRuntimeHistoryFailedSummary:"这次启动里,{services} 没有正常启动。",workspaceDetailDebugRuntimeHistoryGenericSummary:"这里保留最近几次启动结果,方便回看问题是否重复出现。",workspaceDetailDebugRuntimeHistoryNoServices:"暂无",workspaceDetailDebugRuntimeHistoryResultRunning:"仍在运行",workspaceDetailDebugRuntimeHistoryResultFailed:"启动失败",workspaceDetailDebugRuntimeHistoryResultStopped:"已结束",workspaceDetailDebugRuntimeHistoryResultPreparing:"准备中",workspaceDetailDebugRuntimeServicePortLabel:"分配端口",workspaceDetailDebugRuntimeServiceBindingLabel:"端口状态",workspaceDetailDebugRuntimeServiceProcessLabel:"服务进程",workspaceDetailDebugRuntimeServiceFailureLabel:"问题位置",workspaceDetailDebugRuntimeServiceAiLabel:"人工处理记录",workspaceDetailDebugDetectedServicesTitle:"识别到的服务",workspaceDetailDebugServicePathLabel:"所在位置",workspaceDetailDebugServiceFrameworkLabel:"识别结果",workspaceDetailDebugServiceCommandLabel:"启动方式",workspaceDetailDebugServiceRequirementsLabel:"需要补充处理",workspaceDetailDebugServiceActionLabel:"建议动作",workspaceDetailDebugOpenPageAction:"服务",workspaceDetailDebugPageTitle:"服务",workspaceDetailDebugPageDescription:"查看启动项和当前状态。",workspaceDetailRegisteredDebugPageHeroEyebrow:"已注册启动项",workspaceDetailRegisteredDebugPageDescription:"只看已登记的启动项和状态。",workspaceDetailRegisteredDebugLoadFailed:"读取已注册启动项失败",workspaceDetailRegisteredDebugOverallStatusReady:"可启动",workspaceDetailRegisteredDebugOverallStatusPartial:"需处理",workspaceDetailRegisteredDebugOverallStatusEmpty:"未配置",workspaceDetailRegisteredDebugOverallSummary:"{runnable} 可启动 · {orchestrated} 需调整 · {blocked} 阻断",workspaceDetailRegisteredDebugSummaryRegisteredCountLabel:"启动项",workspaceDetailRegisteredDebugSummaryConfiguredPortLabel:"已配置端口",workspaceDetailRegisteredDebugSummaryRunnableCountLabel:"可直接启动",workspaceDetailRegisteredDebugSummaryOrchestratedCountLabel:"需调整",workspaceDetailRegisteredDebugSummaryBlockedCountLabel:"阻断",workspaceDetailRegisteredDebugSummaryLastRefreshLabel:"更新时间",workspaceDetailRegisteredDebugChipRegisteredOnly:"只认调试登记项",workspaceDetailRegisteredDebugChipNoGuessing:"不再猜框架和命令",workspaceDetailRegisteredDebugChipPortDriven:"运行态只按端口占用判断",workspaceDetailRegisteredDebugAnalysisTitle:"项目识别",workspaceDetailRegisteredDebugAnalysisDescription:"查看项目信息。",workspaceDetailRegisteredDebugAnalysisReadonlyNote:"仅供查看",workspaceDetailRegisteredDebugAnalysisDisplayOnlyHint:"仅供查看",workspaceDetailRegisteredDebugAnalysisRoleLabel:"类型",workspaceDetailRegisteredDebugAnalysisNoService:"暂无识别结果。",workspaceDetailRegisteredDebugAnalysisSourceSummary:"分析来源:{sourceType}",workspaceDetailRegisteredDebugTemplatesTitle:"启动项",workspaceDetailRegisteredDebugTemplatesDescription:"这里只显示已登记的启动项。",workspaceDetailRegisteredDebugTemplatesEmpty:"还没有启动项,请先到调试里添加。",workspaceDetailRegisteredDebugOpenProcessManagerAction:"打开调试",workspaceDetailRegisteredDebugActionSyncTemplates:"刷新",workspaceDetailRegisteredDebugActionSyncingTemplates:"刷新中…",workspaceDetailRegisteredDebugActionSyncTemplatesSuccess:"已经同步调试里的启动项",workspaceDetailRegisteredDebugActionSyncTemplatesFailed:"刷新启动项失败",workspaceDetailRegisteredDebugActionRunRegistered:"启动",workspaceDetailRegisteredDebugActionRunningRegistered:"启动中…",workspaceDetailRegisteredDebugActionRunRegisteredSuccess:"已提交可启动项",workspaceDetailRegisteredDebugActionRunRegisteredFailed:"启动已注册项失败",workspaceDetailRegisteredDebugActionRunRegisteredSkipped:"当前没有可启动项,请先处理阻断。",workspaceDetailRegisteredDebugActionPlanHint:"先看方案",workspaceDetailDebugPageHeroEyebrow:"项目服务概览",workspaceDetailDebugOverallStatusLabel:"整体状态",workspaceDetailDebugOverallSummaryLabel:"整体说明",workspaceDetailDebugOverallStatusSupported:"可以直接启动",workspaceDetailDebugOverallStatusConditional:"部分服务还要补充设置",workspaceDetailDebugOverallStatusBlocked:"当前不建议整体直接启动",workspaceDetailDebugOverallSummaryEmpty:"暂时还没拿到可用的服务检查结果。",workspaceDetailDebugOverallSummaryMixed:"当前识别到 {webCount} 个网页服务,以及 {desktopCount} 个桌面壳服务。桌面壳服务会单独展示,不参与网页服务的自动处理。",workspaceDetailDebugOverallSummaryDesktopOnly:"当前识别到 {count} 个桌面壳服务,还没有明确识别出网页服务。",workspaceDetailDebugOverallSummaryWebOnly:"当前识别到 {count} 个可以参与网页调试的服务。",workspaceDetailDebugSummaryServiceCountLabel:"分析条目数",workspaceDetailDebugSummaryWebCountLabel:"网页服务",workspaceDetailDebugSummaryDesktopShellCountLabel:"桌面壳服务",workspaceDetailDebugSummaryWebServicesChip:"{count} 个网页服务",workspaceDetailDebugSummaryDesktopShellChip:"{count} 个桌面壳",workspaceDetailDebugSummaryUnsupportedChip:"{count} 个阻断项",workspaceDetailDebugAutoInjectionEligible:"当前网页服务已经满足自动处理条件",workspaceDetailDebugAutoInjectionBlocked:"当前还不建议把整个项目当成可自动处理目标",workspaceDetailDebugDesktopShellSummaryHint:"桌面壳服务单独识别,不参与网页服务协调",workspaceDetailDebugCompatibilityBreakdown:"可直接使用 {supported} / 需要补充 {conditional} / 暂不建议 {unsupported}",workspaceDetailDebugLastAnalyzedAtLabel:"最近检查时间",workspaceDetailDebugTargetSourceRepo:"检查范围:仓库根目录",workspaceDetailDebugTargetSourceWorktree:"检查范围:当前工作树",workspaceDetailDebugRequirementsNone:"目前没有额外要求",workspaceDetailDebugServiceSectionDescription:"把项目拆成单个服务来看,方便确认哪些可以直接启动,哪些还要补充设置。",workspaceDetailDebugRuntimeSectionDescription:"这里只显示最近一次启动结果,方便快速确认是哪一个服务没有正常跑起来。",workspaceDetailDebugMatrixSectionDescription:"这里展示不同类型服务的默认支持情况,帮助你判断下一步怎么处理。",workspaceDetailDebugMatrixTitle:"支持说明",workspaceDetailDebugMatrixOpenAction:"查看支持矩阵",workspaceDetailDebugMatrixModalDescription:"把不同服务类型的默认支持情况放到一张矩阵里,别再靠长列表硬扫。",workspaceDetailDebugMatrixFrameworkHeader:"框架",workspaceDetailDebugMatrixCompatibilityHeader:"支持",workspaceDetailDebugMatrixInjectionHeader:"方式",workspaceDetailDebugMatrixDiscoveryHeader:"发现",workspaceDetailDebugMatrixHmrHeader:"HMR",workspaceDetailDebugMatrixCallbackHeader:"回调",workspaceDetailDebugMatrixAiHeader:"人工",workspaceDetailDebugMatrixNotesHeader:"说明",workspaceDetailDebugMatrixCompatibilitySupportedShort:"可直接",workspaceDetailDebugMatrixCompatibilityConditionalShort:"先补充",workspaceDetailDebugMatrixCompatibilityUnsupportedShort:"不建议",workspaceDetailDebugMatrixCompatibilityUnknownShort:"未知",workspaceDetailDebugMatrixInjectionCliShort:"参数",workspaceDetailDebugMatrixInjectionEnvShort:"环境",workspaceDetailDebugMatrixInjectionOverrideShort:"改命令",workspaceDetailDebugMatrixInjectionAiFallbackShort:"人工",workspaceDetailDebugMatrixInjectionNoneShort:"无",workspaceDetailDebugMatrixRequirementRequiredShort:"需处理",workspaceDetailDebugMatrixRequirementNotRequiredShort:"无需",workspaceDetailDebugMatrixAiNeverShort:"不处理",workspaceDetailDebugMatrixAiConditionalShort:"视情况",workspaceDetailDebugMatrixAiAllowedShort:"可处理",workspaceDetailDebugMatrixLegendSummary:"表格里的图标含义是:勾表示默认可过,警示表示启动前还要补设置,叉表示当前不建议自动处理。下面把短表头补成人话,省得你猜。",workspaceDetailDebugMatrixDiscoveryNote:"服务地址、代理、rewrites 这一类处理。",workspaceDetailDebugMatrixHmrNote:"热更新、前端开发长连这类处理。",workspaceDetailDebugMatrixCallbackNote:"登录回调、OAuth、Webhook 这类回调入口。",workspaceDetailDebugMatrixAiNote:"遇到边界情况时,是否允许转人工辅助。",workspaceDetailDebugActionAnalyze:"重新分析",workspaceDetailDebugActionPlan:"生成方案",workspaceDetailDebugActionRun:"开始运行",workspaceDetailDebugActionRefresh:"刷新状态",workspaceDetailDebugActionAnalyzing:"分析中…",workspaceDetailDebugActionPlanning:"生成中…",workspaceDetailDebugActionRunning:"运行中…",workspaceDetailDebugActionRefreshing:"刷新中…",workspaceDetailDebugActionAnalyzeSuccess:"已经重新读取服务分析结果",workspaceDetailDebugActionPlanSuccess:"已生成启动方案",workspaceDetailDebugActionRunSuccess:"已经提交启动命令,正在刷新最新运行态",workspaceDetailDebugActionRefreshSuccess:"已刷新状态",workspaceDetailDebugActionWorkspaceMissing:"当前工作区信息不完整,暂时不能执行这个操作。",workspaceDetailDebugActionTargetMissing:"当前还没有可用的调试目标,请先完成分析。",workspaceDetailDebugActionAnalyzeFailed:"重新分析失败",workspaceDetailDebugActionPlanFailed:"生成启动方案失败",workspaceDetailDebugActionRunFailed:"启动服务失败",workspaceDetailDebugActionRefreshFailed:"刷新运行态失败",workspaceDetailDebugLaunchPlanTitle:"启动方案",workspaceDetailDebugLaunchPlanDescription:"查看本次生成的方案。",workspaceDetailRegisteredDebugLaunchPlanDescription:"查看本次方案。",workspaceDetailRegisteredDebugLaunchPlanGeneratedAtLabel:"时间",workspaceDetailRegisteredDebugLaunchPlanRunnableLabel:"可直接启动",workspaceDetailRegisteredDebugLaunchPlanOrchestratedLabel:"需调整",workspaceDetailRegisteredDebugLaunchPlanBlockedLabel:"阻断",workspaceDetailRegisteredDebugLaunchPlanNote:"按当前设置生成。",workspaceDetailDebugLaunchPlanRuntimeIdLabel:"准备记录",workspaceDetailDebugLaunchPlanAutoStartLabel:"结果",workspaceDetailDebugLaunchPlanAutoStartAllowed:"可直接运行",workspaceDetailDebugLaunchPlanAutoStartBlocked:"需先处理",workspaceDetailDebugLaunchPlanSideEffectNote:"注意:当前“检查启动方案”不是纯预览,后端会生成一条准备记录。",workspaceDetailDebugLaunchPlanServicePortLabel:"计划端口",workspaceDetailDebugLaunchPlanServiceAdapterLabel:"处理方式",workspaceDetailDebugLaunchPlanServiceFailureLabel:"阻断位置",workspaceDetailDebugLaunchPlanServiceRequirementsLabel:"缺少条件",workspaceDetailDebugLaunchPlanServiceAttemptsLabel:"处理链路",workspaceDetailDebugLaunchPlanServiceAiLabel:"人工兜底",workspaceDetailDebugLaunchPlanServiceAllowedFilesLabel:"允许触达文件",workspaceDetailDebugLaunchPlanServiceNoRequirements:"当前没有额外阻断条件",workspaceDetailDebugLaunchPlanServiceNoEnvPatch:"没有额外环境变量补丁",workspaceDetailDebugLaunchPlanServiceEnvPatchLabel:"环境变量补丁",workspaceDetailDebugLaunchPlanDismissAction:"清空方案",workspaceDetailDebugFailureStageServiceDiscovery:"还缺少服务地址相关处理",workspaceDetailDebugFailureStageHmr:"还缺少热更新相关处理",workspaceDetailDebugFailureStageCallback:"还缺少回调处理",workspaceDetailDebugFailureStageAiFallbackRequired:"需要转人工处理",workspaceDetailDebugFailureStageAdapterSelection:"还没找到合适的启动方式",workspaceDetailDebugFailureStageLaunchRequirements:"启动前还有条件没有满足",workspaceDetailDebugFailureStageCommandExecution:"启动命令没有正常执行",workspaceDetailDebugFailureStageProcessExit:"服务启动后很快退出了",workspaceDetailDebugFailureStageProcessRuntimeError:"服务运行时出现错误",workspaceDetailDebugFailureStageStaleRuntimeBinding:"这次启动记录已经失效",workspaceDetailDebugFailureStageUnknown:"未知阶段({code})",workspaceDetailDebugBindingAllocated:"已分配",workspaceDetailDebugBindingListening:"可访问",workspaceDetailDebugBindingFailed:"未就绪",workspaceDetailDebugBindingReleased:"已释放",workspaceDetailDebugBindingUnknown:"未知",workspaceDetailDebugProcessCreating:"启动中",workspaceDetailDebugProcessRunning:"运行中",workspaceDetailDebugProcessClosed:"已结束",workspaceDetailDebugProcessError:"异常",workspaceDetailDebugProcessUnknown:"未知",workspaceDetailDebugPortEmpty:"暂无",workspaceDetailRegisteredDebugTemplatePortMissing:"未配置",workspaceDetailRegisteredDebugTemplatePathLabel:"登记位置",workspaceDetailRegisteredDebugTemplatePortLabel:"端口",workspaceDetailRegisteredDebugTemplateRuntimeTypeLabel:"运行时",workspaceDetailRegisteredDebugTemplateSourceLabel:"来源",workspaceDetailRegisteredDebugTemplateSourceManual:"手动添加",workspaceDetailRegisteredDebugTemplateSourceDebugService:"自动生成",workspaceDetailRegisteredDebugTemplateSourceManaged:"系统生成",workspaceDetailRegisteredDebugTemplateProxyLabel:"代理",workspaceDetailRegisteredDebugTemplateProxyEnabled:"已开启",workspaceDetailRegisteredDebugTemplateProxyDisabled:"未开启",workspaceDetailRegisteredDebugTemplateInjectionModeLabel:"端口注入方式",workspaceDetailRegisteredDebugTemplateInjectionModeUnknown:"未标注",workspaceDetailRegisteredDebugTemplateServiceDiscoveryLabel:"服务地址联动",workspaceDetailRegisteredDebugTemplateServiceDiscoverySameOrigin:"同源访问",workspaceDetailRegisteredDebugTemplateServiceDiscoveryApiBaseUrl:"注入 API_BASE_URL",workspaceDetailRegisteredDebugTemplateServiceDiscoveryNone:"不额外处理",workspaceDetailRegisteredDebugTemplateServiceDiscoveryUnknown:"未标注",workspaceDetailRegisteredDebugTemplateStatusOccupied:"占用中",workspaceDetailRegisteredDebugTemplateStatusIdle:"空闲",workspaceDetailRegisteredDebugTemplateStatusUntracked:"未判断",workspaceDetailRegisteredDebugPlanItemCommandLabel:"命令",workspaceDetailRegisteredDebugPlanItemRuntimeLabel:"运行时",workspaceDetailRegisteredDebugPlanItemActionLabel:"结果",workspaceDetailRegisteredDebugPlanItemReasonLabel:"说明",workspaceDetailRegisteredDebugPlanActionStart:"直接启动",workspaceDetailRegisteredDebugPlanActionOrchestrated:"调整后启动",workspaceDetailRegisteredDebugPlanActionBlocked:"暂不能启动",workspaceDetailRegisteredDebugPlanReasonPortMissing:"未设置端口",workspaceDetailRegisteredDebugPlanReasonDuplicatePort:"存在重复登记端口,当前不能自动启动。",workspaceDetailRegisteredDebugPlanReasonDuplicatePortWillOrchestrate:"端口冲突,将自动分配新端口",workspaceDetailRegisteredDebugPlanReasonPortOccupied:"端口已占用",workspaceDetailRegisteredDebugPlanReasonPortOccupiedWillOrchestrate:"端口已占用,将自动分配新端口",workspaceDetailRegisteredDebugPlanReasonPortOrchestrated:"将改用端口 {port}",workspaceDetailRegisteredDebugPlanReasonServiceDiscoveryInjected:"已自动完成地址联动",workspaceDetailRegisteredDebugPlanReasonAnalysisMissing:"缺少可用的项目识别结果,请先刷新启动项后再生成方案",workspaceDetailRegisteredDebugPlanReasonServiceDiscoveryMissing:"缺少可联动的后端启动项,请先到调试里补登记;端口会自动注入,不需要手动改项目",workspaceDetailRegisteredDebugPlanReasonCallbackMissing:"当前回调场景还不能自动处理,请先手动确认启动方式",workspaceDetailRegisteredDebugPlanReasonRunnable:"可以直接启动",workspaceDetailRegisteredDebugLaunchPlanServiceDiscoveryHelp:"如果这里提示缺少地址联动,去调试里补登记后端启动项即可。端口会在启动时自动改配,不需要手动修改项目。",workspaceDetailRegisteredDebugRuntimeScopeNote:"未配端口的不计入。",workspaceDetailRegisteredDebugRuntimeIdle:"当前空闲",workspaceDetailRegisteredDebugRuntimeUnknown:"暂无状态",workspaceDetailRegisteredDebugRuntimeProcessLabel:"进程",workspaceDetailRegisteredDebugRuntimeCommandLabel:"进程命令行",workspaceDetailDebugRoleFrontend:"网页服务",workspaceDetailDebugRoleBackend:"后端服务",workspaceDetailDebugRoleWorker:"后台任务",workspaceDetailDebugRoleMock:"模拟服务",workspaceDetailDebugRoleDesktopShell:"桌面壳服务",workspaceDetailDebugRoleCustom:"自定义",workspaceDetailDebugServiceOverviewSupported:"这个服务已经识别清楚,按推荐方式处理后通常可以直接启动。",workspaceDetailDebugServiceOverviewConditional:"这个服务已经识别出来,但启动前还需要补充一些设置或配套处理。",workspaceDetailDebugServiceOverviewUnsupported:"这个服务目前不建议直接自动处理,建议先手动确认启动方式。",workspaceDetailDebugServiceOverviewUnknown:"这个服务还没有识别清楚,先保留结果,后续再补充判断。",workspaceDetailDebugServiceOverviewDesktopShell:"这是桌面壳服务,会单独展示,不参与网页服务的自动端口处理。",workspaceDetailDebugServiceActionSupported:"可直接启动",workspaceDetailDebugServiceActionConditional:"先补配置",workspaceDetailDebugServiceActionUnsupported:"建议手动处理",workspaceDetailDebugServiceActionUnknown:"先确认服务类型",workspaceDetailDebugServiceActionDesktopShell:"按桌面壳方式单独处理",workspaceDetailDebugAiEditEmpty:"无",workspaceDetailDebugAiEditPending:"待处理",workspaceDetailDebugAiEditApplied:"已应用",workspaceDetailDebugAiEditRolledBack:"已回滚",workspaceDetailDebugAiEditRejected:"已拒绝",workspaceSessionListBody:"项目里的会话、收藏和归档操作都收在这里,不再让你先去翻侧栏。",recentSessionsSectionTitle:"最近会话",recentSessionsSectionBody:"先回到最近在做的事情,别让手机端还要你猜入口。",currentWorkspaceSectionTitle:"当前项目会话",currentWorkspaceSectionBody:"当前项目下的会话都集中在这里,方便继续刚才的上下文。",sessionIndexTitle:"会话入口单独成页",sessionIndexBody:"最近、收藏、当前项目三块分开看,手机上找会话别再靠侧栏折叠。",toolsMoreAction:"更多",toolsSwipeHint:"左右滑动切换文件管理和 Git 管理",toolsSwipePosition:"{current} / {total}",toolFilesBody:"查看项目文件、变更文件和代码上下文,不再靠桌面右栏概念。",toolGitBody:"把当前项目的 Git 状态、提交和分支操作收进一个明确入口。",toolTerminalsBody:"进入终端主页面,处理输入密集和滚动密集的操作。",toolProcessesBody:"查看当前项目的终端模板、运行状态和调试入口。",toolsWorkspaceRequiredBody:"先选一个项目,再打开对应的工具页。",createSession:"新建会话",createSessionModalTitle:"选择新会话类型",createSessionModalDescription:"先选会话类型,再启动真正的会话进程。",createSessionWorkspaceLabel:"选择工作区",createSessionProviderLabel:"选择供应商",createSessionTarget:"当前项目",createWorktreeSectionTitle:"子工作区",createWorktreeSectionDescription:"先从当前项目分出子工作区,再决定用哪个供应商开新会话。",createWorktreeAction:"新增子工作区",createWorktreeCollapseAction:"收起子工作区表单",createWorktreeBranchLabel:"分支名",createWorktreeBranchPlaceholder:"例如:feat/login-codex",createWorktreeBranchRequired:"请先输入子工作区分支名",createWorktreeBranchInvalid:"分支名只能包含英文、数字、-、_、/,并且不能以 / 开头、结尾或连续出现 /",createWorktreeDisplayNameLabel:"显示名称(可选)",createWorktreeDisplayNamePlaceholder:"默认沿用分支名",createWorktreeBaseRefLabel:"从哪个分支/提交创建(可选)",createWorktreeBaseRefPlaceholder:"默认沿用当前分支",createWorktreeBaseRefHint:"可选当前仓库的本地分支 {localCount} 个、远端分支 {remoteCount} 个、标签 {tagCount} 个;也可以手填 commit hash。",createWorktreeBaseRefLoading:"正在读取当前仓库的分支和标签...",createWorktreeBaseRefLoadFailed:"分支和标签列表读取失败,仍然可以手动输入分支、标签或 commit hash。",createWorktreeBaseRefLocalGroup:"本地分支",createWorktreeBaseRefRemoteGroup:"远端分支",createWorktreeBaseRefTagGroup:"标签",createWorktreeBaseRefCurrentBadge:"当前分支",createWorktreeBaseRefRecommendedBadge:"推荐",createWorktreeBaseRefEmpty:"没有找到匹配项。你也可以直接输入想使用的分支、标签或 commit hash。",createWorktreeBaseRefToggle:"展开可选分支和标签",createWorktreeHelpAction:"填写说明",createWorktreeHelpTitle:"这三个内容怎么填",createWorktreeHelpBranchTitle:"分支名",createWorktreeHelpBranchBody:"这是新子工作区自己的名字,后面在列表里也会用它区分。一般填类似 feat/login 这种短名字就够了。",createWorktreeHelpDisplayNameTitle:"显示名称",createWorktreeHelpDisplayNameBody:"如果你想让列表里更好认,可以填一个更直白的名字。不填也没关系,系统会直接用分支名。",createWorktreeHelpBaseRefTitle:"从哪个分支/提交创建",createWorktreeHelpBaseRefBody:"这决定新子工作区从哪里开始。大多数时候保持默认就行;只有你想从别的分支、标签,或者某次提交继续时再改。",createWorktreeSubmit:"创建子工作区",createWorktreeSubmitting:"创建中...",createWorktreeSucceeded:"子工作区已创建:{name}",createWorktreeFailed:"创建子工作区失败",providerClaudeCode:"Claude Code",providerLegnaCode:"Legna Code",providerCodexDescription:"创建 Codex 会话,适合继续当前默认工作流。",providerClaudeDescription:"创建 Claude Code 会话,适合切换另一条会话链路。",providerLegnaDescription:"创建 Legna Code 会话,底层复用 Claude 兼容 runtime,但使用独立会话存储路径。",providerOpenCodeDescription:"创建 OpenCode 会话,适合通过 OpenCode server 延续当前上下文。",providerGeminiDescription:"创建 Gemini 会话,适合接入 Gemini CLI 的原生工作流。",providerKimiDescription:"创建 Kimi 会话,适合接入 Kimi CLI 的原生工作流。",createSessionPresetLabel:"会话配置",createSessionPresetHint:"默认沿用当前全局 preset;只对 Codex、Claude Code、Gemini 开放会话级 preset。",createSessionPresetDefault:"使用当前默认 preset",createSessionPresetLoading:"正在读取 cc-switch preset...",createSessionPresetUnavailable:"暂时无法读取 cc-switch preset,先按默认配置创建。",createSessionStartAction:"进入会话草稿",providerChecking:"检查中...",startClaude:"Claude",startCodex:"Codex",startingSession:"创建中...",startClaudeSuccess:"Claude 会话已创建",startCodexSuccess:"Codex 会话已创建",startSessionFailed:"创建失败",auxiliaryTitle:"信息",auxiliarySubtitle:"文件与 Git 状态",expandAuxiliary:"展开",collapseAuxiliary:"收起",auxiliaryEmptyTitle:"选择一个会话",auxiliaryEmptyBody:"会话文件和 Git 信息将显示在这里",batchSelectSessions:"批量选择会话",batchSelectionMode:"批量选择",selectAllSessions:"全选",clearSelectedSessions:"清空选择",batchArchiveAction:"归档已选",batchArchiving:"归档中...",batchArchiveSuccess:"已归档选中的会话",batchArchivePartialFailed:"部分会话归档失败,请重试",batchArchiveFailed:"批量归档失败",batchDeleteAction:"删除已选",batchDeleting:"删除中...",batchDeleteSuccess:"已删除选中的会话",batchDeletePartialFailed:"部分会话删除失败,请重试",batchDeleteFailed:"批量删除失败",batchDeleteConfirmTitle:"确认删除已选会话",batchDeleteConfirmDescription:"删除后,选中的 {count} 条会话会从助手历史和工作区列表里消失,真实会话记录也会一并清掉,不能恢复。",batchDeleteSelectionSummary:"已选择 {count} 条会话",hideSessionSidebar:"隐藏会话列表",showSessionSidebar:"显示会话列表",hideInfoSidebar:"隐藏信息栏",showInfoSidebar:"显示信息栏",centerTabsLabel:"中间区域标签",infoTabsLabel:"信息栏标签",leftResizerLabel:"调整左侧宽度",rightResizerLabel:"调整右侧宽度",filesPanelEmpty:"先导入或选中一个项目,文件管理才能显示。",gitPanelEmpty:"先导入或选中一个工作区,Git 信息才能显示。",infoPanelDeferred:"左侧会话列表优先加载,右侧附属面板稍后再挂载。"},workbench:{emptyEyebrow:"开始",emptyTitle:"先选一个会话",emptyBody:"从左侧继续之前的内容,或新建一个会话。",emptyResumeTitle:"继续",emptyResumeBody:"回到上次停下的地方。",emptyNewTitle:"新建",emptyNewBody:"把新问题放进新会话。",emptyCompanionTitle:"查看辅助信息",emptyCompanionBody:"需要文件、Git 或终端时,再看右侧。",emptyTip:"准备好后,从左侧选一个会话开始。"},conversation:{resendButton:"重发",historyLoading:"加载中...",historyLoadingOlder:"加载更早的消息...",historyLoadFailed:"加载失败",inheritedContextLoading:"正在整理从父会话继承的上下文...",inheritedContextMessageLabel:"继承自某条消息之前的上下文",inheritedContextSessionLabel:"继承自主会话的上下文",inheritedContextSummary:"已默认折叠从“{parentTitle}”继承的 {count} 条消息。",actionInheritedSelectionSummary:"已默认折叠来自“{parentTitle}”的一段选中文本。",inheritedContextExpand:"展开完整上文",inheritedContextCollapse:"收起继承上文",inheritedContextParentFallback:"父会话",timelineEmpty:"开始对话",composerPlaceholder:"把下一步交代清楚,剩下的交给这条会话继续跑。",sendButton:"发送消息",attachFiles:"附加文件",attachmentSourceSheetTitle:"添加附件",attachmentSourceSheetDescription:"可以从文件中选择一个或多个文件,也可以直接拍照。",attachmentTakePhoto:"拍照",attachmentTakePhotoHint:"直接打开相机添加一张照片",attachmentChooseFromLibrary:"从文件中选择",attachmentChooseFromLibraryHint:"通过系统文件选择器添加一个或多个文件",pasteImagesHint:"支持直接粘贴文件",attachmentImageOnly:"当前只支持图片附件",attachmentReadFailed:"附件读取失败,请重试",attachmentPreviewAlt:"已选图片预览",attachmentPreviewOpen:"打开附件",attachmentPreviewClose:"关闭预览",attachmentPreviewLoading:"附件加载中",attachmentPreviewUnavailable:"附件暂时不可用",attachmentDownload:"下载附件",attachmentDropHint:"拖拽文件到这里即可添加",imageAttachmentLabel:"图片附件",fileAttachmentLabel:"文件附件",imagePreviewTitle:"图片预览",imagePreviewHint:"点击遮罩或按 Esc 可以关闭预览",removeAttachment:"移除附件",selectionTodoAction:"代办",selectionActionButton:"操作",selectionActionSubmit:"新开操作子会话",selectionActionPromptLabel:"你想让它做什么",selectionActionPromptPlaceholder:"比如:解释这段话、整理成笔记,或调用指定接口处理它",selectionActionIncludeContext:"包含当前上下文",selectionActionContextUnavailable:"当前选区跨了多条消息,没法安全继承上下文,只能按无上下文新建子会话。",selectionActionDefaultPrompt:"请处理这段内容。",selectionActionPreviewLabel:"已选内容",selectionActionTargetLabel:"新会话设置",selectionActionQuotedLabel:"选中文本",selectionActionFailed:"创建操作子会话失败。",actionSessionBadge:"操作",modelSelectorLabel:"选择模型",modelUseCliDefault:"默认",deploymentDefaultPreset:"默认",deploymentConfigColumn:"配置文件",deploymentModelColumn:"模型",deploymentLoading:"正在读取部署...",deploymentModelLoading:"正在加载模型...",deploymentModelEmpty:"这个配置文件下暂时没有可选模型",modelUseCodexConfig:"跟随当前 Codex 配置",modelUseOpenCodeConfig:"跟随当前 OpenCode 配置",reasoningSelectorLabel:"选择推理强度",reasoningLow:"低",reasoningMedium:"中",reasoningHigh:"高",reasoningMaximum:"极高",slashMenu:"命令",slashMenuTitle:"快捷命令",slashCommandPlan:"先让对方给出执行路线",slashCommandReview:"直接进入代码审查模式",slashCommandExplain:"要求用更清楚的方式解释",toolInputLabel:"输入",toolResultLabel:"结果",toolResultEmpty:"暂无输出",toolPreviewCommand:"命令",toolPreviewTerminal:"终端",toolStatusRunning:"运行中",toolStatusFailed:"已失败",toolStatusCompleted:"已完成",runtimeThinkingPlaceholder:"{provider} 正在思考...",applyPatchEditedLabel:"已编辑",applyPatchAddedLabel:"已新增",applyPatchDeletedLabel:"已删除",applyPatchDialogTitle:"Patch 变更预览",applyPatchDialogDescription:"这里按文件显示 apply_patch 将要执行的变更。",applyPatchOpenDiff:"查看 diff",applyPatchEditedStat:"已编辑",applyPatchAddedStat:"新增",applyPatchRemovedStat:"减少",applyPatchEmpty:"这个 patch 暂时没有可展示的文件变更。",titleFallback:"继续对话",draftTitleCodex:"New Codex session",draftTitleClaude:"New Claude Code session",draftTitleLegna:"New LegnaCode session",draftTitleOpenCode:"New OpenCode session",draftTitleGemini:"New Gemini session",draftTitleKimi:"New Kimi session",headerWorkspace:"工作区",headerWorkspaceUnknown:"未知工作区",headerProvider:"Provider",headerConnection:"连接",headerRuntime:"运行态",providerCodex:"Codex",branchTreeAction:"分支树",branchTreeTitle:"分支树",branchTreeDescription:"这里只看当前会话所在的父子链,不把整个工作区会话列表混进来。",branchTreeUpstreamLabel:"上游链路",branchTreeCurrentLabel:"当前会话",branchTreeChildrenLabel:"下游分支",branchTreeCurrentBadge:"当前",branchTreeArchivedBadge:"已归档",branchTreeEmpty:"这条会话当前还没有下游分支。",branchTreeMapTitle:"分支关系图",branchTreeMapDescription:"这里会把当前会话所在主干和所有关联分支一起展开。",branchTreePreviewTitle:"会话预览",branchTreePreviewDescription:"点一下节点就会浮出最近几条消息,再决定要不要切过去。",branchTreePreviewLoading:"正在读取这条会话的最近消息...",branchTreePreviewFailed:"会话预览读取失败。",branchTreePreviewEmpty:"这条会话最近没有可预览的消息。",branchTreeResizeHandle:"调整分支树宽度",branchTreeZoomInAction:"放大分支图",branchTreeZoomOutAction:"缩小分支图",branchTreeZoomResetAction:"重置分支图缩放",branchTreeSwitchAction:"切换到这个会话",branchTreeCurrentAction:"已在当前会话",branchTreeToolMessageFallback:"工具消息",branchTreeMessageEmpty:"这条消息当前没有可展示的正文。",moreSessionActions:"更多会话操作",branchAction:"分支",moreSessionActionsTitle:"更多会话操作",moreSessionActionsDescription:"分支树和助手入口统一收在这里,避免移动端标题栏被按钮挤满。",branchTreeTab:"分支树",aiAssistantTab:"助手",aiAssistantTabDescription:"这里保留当前会话的助手入口,需要继续跟进或发起验证时直接点下面这个按钮。",providerClaude:"Claude",providerLegna:"Legna",providerOpenCode:"OpenCode",providerGemini:"Gemini",providerKimi:"Kimi",capabilitySend:"可发送",queueTitle:"待发队列",queueDescription:"当前运行结束后,会按顺序自动继续处理下面的消息。",queueOrderPrefix:"等待顺序",queueStatusQueued:"等待中",queueStatusFailed:"续跑失败",queueDelete:"删除",queueDeleting:"删除中",permissionRequestSectionTitle:"待处理审批",permissionRequestSectionDescription:"这里把供应商原生的权限申请统一收口,不再让你面对三套不同的确认框。",permissionRequestToastTitle:"需要审批",backgroundPermissionToastDescription:"{title} · {requestTitle}",backgroundCompletionToastTitle:"会话已完成",backgroundCompletionToastDescription:"{title}",backgroundFailureToastTitle:"会话异常",backgroundFailureToastDescription:"{title} · {detail}",permissionRequestReplyFailed:"回复权限申请失败。",permissionRequestSubmitting:"提交中...",permissionRequestReasonLabel:"原因",permissionRequestCommandLabel:"命令",permissionRequestToolLabel:"工具",permissionRequestCwdLabel:"工作目录",permissionRequestPathsLabel:"相关路径",permissionRequestPermissionsLabel:"申请权限",permissionRequestReadLabel:"读取",permissionRequestWriteLabel:"写入",permissionRequestNetworkLabel:"网络",permissionRequestQuestionsLabel:"补充问题",permissionRequestDetailLabel:"详情",permissionRequestEmpty:"无",permissionRequestUnknown:"未知",permissionRequestKindCommand:"命令",permissionRequestKindFileChange:"文件改动",permissionRequestKindPermissions:"权限扩展",permissionRequestKindUserInput:"补充输入",permissionRequestKindToolCall:"工具调用",queueImageOnly:"只包含图片附件",sendGuidanceButton:"追加指导",queueGuidanceButton:"加入队列",capabilityDenied:"受限",capabilitySendDisabled:"发送受限",connectionConnected:"实时已连接",connectionReconnecting:"正在重连",connectionReconnectFailed:"重连失败",connectionClosed:"连接已关闭",runtimeIdle:"空闲",runtimeStarting:"启动中",runtimeRunning:"运行中",runtimeReconnecting:"恢复中",runtimeStale:"运行待确认",runtimeUnknown:"状态待确认",runtimeCompleted:"已完成",runtimeInterrupted:"已中断",runtimeFailed:"失败",rulesMessageTitle:"规则信息",rulesMessageHint:"这是一段会话启动规则,默认折叠显示,需要时再展开查看。",rulesMessageExpand:"展开规则",rulesMessageCollapse:"收起规则",skillContextTitle:"助手 Skill",skillContextHint:"这是 Claude Code 会话启动时注入的 Skill 上下文,默认折叠显示,需要时再展开查看。",skillContextExpand:"展开 Skill",skillContextCollapse:"收起 Skill",systemPromptTitle:"系统提示",systemPromptHint:"这是 Kimi 会话开头的系统提示词,默认折叠显示,需要时再展开查看。",systemPromptExpand:"展开提示词",systemPromptCollapse:"收起提示词",taskProgressButton:"任务进度({count})",taskProgressModalTitle:"任务进度",taskProgressModalDescription:"当前会话已记录 {count} 条任务,这里直接看最新进度。",taskProgressExplanationTitle:"本轮更新说明",taskProgressSummaryTotal:"总数",taskProgressStatusPending:"待处理",taskProgressStatusInProgress:"进行中",taskProgressStatusCompleted:"已完成",taskProgressStatusFailed:"已失败",taskProgressStatusCancelled:"已取消",taskCardPlanTitle:"计划更新",taskCardTodoTitle:"任务更新",taskCardPlanUpdated:"最新计划",taskCardTodoUpdated:"最新任务列表",taskCardRawExpand:"展开原始调用",taskCardRawCollapse:"收起原始调用",taskCardSummaryTotal:"共 {count} 项",taskCardSummaryInProgress:"进行中 {count}",taskCardSummaryPending:"待处理 {count}",taskCardSummaryCompleted:"已完成 {count}",taskCardSummaryFailed:"已失败 {count}",butlerActionButton:"助手",butlerActionModalTitle:"助手动作",butlerActionModalDescription:"让助手继续跟进当前开发会话,或发起一次开发验证。",butlerActionLoading:"正在连接助手记录...",butlerActionLoadFailed:"读取助手动作信息失败",butlerActionProjectLabel:"当前项目",butlerActionSessionLabel:"当前会话",butlerFollowUpAction:"继续跟进",butlerFollowUpActionDescription:"让助手持续盯住这条开发会话,并在结束或阻塞后继续推动。",butlerFollowUpProviderLabel:"跟进助手",butlerFollowUpProviderHint:"选择由哪种 CLI 助手负责这条跟进会话。后续每轮跟进都会复用这条可见助手会话。",butlerFollowUpObjectiveLabel:"跟进目标",butlerFollowUpObjectivePlaceholder:"例如:帮我把这个会话的功能真正做完,若 spec 还有未完成项就继续补齐。",butlerFollowUpCompletionCriteriaLabel:"结束条件",butlerFollowUpCompletionCriteriaPlaceholder:"例如:只有当当前功能按既定需求完成,且不再存在必须继续推进的未完成项时,才停止自动跟进。",butlerFollowUpCompletionCriteriaRequired:"请先选择或填写明确的结束条件,助手必须知道什么时候停下",butlerCompletionTemplateSectionLabel:"结束模板",butlerCompletionTemplateSectionHint:"请选择一条明确模板;模板会直接覆盖结束条件,且必须在达到轮数上限后停止自动续接。",butlerCompletionTemplateRecommendedLabel:"标准收口",butlerCompletionTemplateRecommendedDescription:"功能完成并验证通过后结束",butlerCompletionTemplateRecommendedValue:"只有当当前功能已经按本次需求完成、已完成一次开发验证或人工确认,且不存在必须继续推进的阻塞项时,才停止自动跟进;如果 AI 推荐的下一步相对于核心目标不是必选项,也必须停止;达到自动跟进轮数上限后也必须停止,不再无限续接会话。",butlerCompletionTemplateSpecLabel:"Spec 收尾",butlerCompletionTemplateSpecDescription:"把当前 spec 的必做项收干净",butlerCompletionTemplateSpecValue:"只有当当前 spec 的必做任务已经完成,相关代码、文档和必要验证已补齐,且没有必须继续推进的阻塞项时,才停止自动跟进;如果 AI 推荐的下一步相对于核心目标不是必选项,也必须停止;不主动扩展到新的需求范围;达到自动跟进轮数上限后也必须停止。",butlerCompletionTemplateBugfixLabel:"问题修复",butlerCompletionTemplateBugfixDescription:"问题修复并确认没有高优先级回归",butlerCompletionTemplateBugfixValue:"只有当这次问题已经定位并修复,相关验证已经通过,且没有新的高优先级回归需要立即处理时,才停止自动跟进;如果 AI 推荐的下一步相对于核心目标不是必选项,也必须停止;优化建议和后续想法不算必须继续推进的理由;达到自动跟进轮数上限后也必须停止。",butlerFollowUpRoundLimitLabel:"最多自动跟进轮数",butlerFollowUpRoundLimitHint:"达到上限后,助手会停止自动续接,避免无限扩展会话。",butlerCurrentFollowUpLabel:"当前跟进任务",butlerCurrentFollowUpProgress:"已自动推进 {current} / {max} 轮",butlerFollowUpStopping:"正在停止跟进...",butlerStopFollowUpAction:"停止当前跟进",butlerFollowUpObjectiveRequired:"请先写清楚这次希望助手持续推动的目标",butlerCurrentVerificationLabel:"当前验证任务",butlerStopVerificationAction:"停止当前验证",butlerVerificationAction:"开始验证",butlerVerificationActionDescription:"让助手从用户视角对当前会话对应功能发起一次验证。",butlerFollowUpStarted:"已交给助手继续跟进",butlerFollowUpStartedDescription:"助手会继续跟进 {projectName} 的当前开发会话。",butlerFollowUpFailed:"助手跟进启动失败",butlerFollowUpStopped:"已停止当前助手跟进",butlerFollowUpStoppedDescription:"当前会话的自动跟进已经停止,不会继续自动续接。",butlerFollowUpStopFailed:"停止助手跟进失败",butlerVerificationStarted:"已发起开发验证",butlerVerificationStartedDescription:"助手会对 {projectName} 发起一次开发验证。",butlerVerificationFailed:"开发验证启动失败",butlerVerificationStopping:"正在停止验证...",butlerVerificationStopped:"已停止当前开发验证",butlerVerificationStoppedDescription:"当前会话的验证已经停止,并且关联自动化执行也已一并结束。",butlerVerificationStopFailed:"停止开发验证失败",butlerAnalysisTitle:"助手分析过程",butlerAnalysisLoadFailed:"读取助手分析失败",butlerAnalysisObjectiveLabel:"当前目标",butlerAnalysisStatusLabel:"当前判断",butlerAnalysisSummaryLabel:"最近分析",butlerAnalysisWaitingReasonLabel:"等待原因",butlerAnalysisEmpty:"当前还没有可展示的助手分析记录。",butlerProxyMessageBadge:"代理发送",butlerOriginDetailTitle:"对应的助手跟进",butlerOriginDetailLoading:"正在读取对应的助手跟进记录...",butlerOriginDetailLoadFailed:"读取对应的助手跟进记录失败",butlerOriginDetailObjectiveLabel:"跟进目标",butlerOriginDetailStatusLabel:"当前状态",butlerOriginDetailSummaryLabel:"最近分析",butlerOriginDetailWaitingReasonLabel:"等待原因",assistantCapabilityBadgeSession:"助手会话",assistantCapabilityBadgeAutomation:"助手自动化",assistantCapabilityBadgeTerminal:"助手终端",assistantCapabilityBadgeWorkspace:"助手工作区",assistantCapabilityBadgeDebug:"助手调试",assistantCapabilityBadgeQuery:"助手查询",assistantCapabilityProjectSessionStartTitle:"新建会话",assistantCapabilitySessionSendTitle:"会话发送",assistantCapabilitySessionForkTitle:"会话分叉",assistantCapabilityTimerCreateTitle:"创建自动化",assistantCapabilityTimerCancelTitle:"取消自动化",assistantCapabilityTerminalInputTitle:"终端输入",assistantCapabilityTerminalCloseTitle:"关闭终端",assistantCapabilityWorkspaceDirectoryCreateTitle:"创建目录",assistantCapabilityWorkspaceImportTitle:"导入工作区",assistantCapabilityWorkspaceCloneTitle:"克隆工作区",assistantCapabilityWorkspaceNavigationUpdateTitle:"更新工作区视图",assistantCapabilityWorkspaceRemoveTitle:"移除工作区",assistantCapabilityWorktreeCreateTitle:"创建工作树",assistantCapabilityWorktreeMergeTitle:"合并工作树",assistantCapabilityWorktreeCleanupTitle:"清理工作树",assistantCapabilityDebugRunTitle:"启动调试",assistantCapabilitySessionReadTitle:"读取会话信息",assistantCapabilityAutomationReadTitle:"读取自动化信息",assistantCapabilityTerminalReadTitle:"读取终端信息",assistantCapabilityWorkspaceReadTitle:"读取工作区信息",assistantCapabilityDebugReadTitle:"读取调试信息",assistantCapabilityQueryTitle:"助手操作",assistantCapabilitySummarySessionStart:"已按当前助手配置创建真实会话。",assistantCapabilitySummarySessionSend:"消息已提交到目标真实会话。",assistantCapabilitySummarySessionFork:"已从当前上下文分叉出新会话。",assistantCapabilitySummaryTimerCreate:"已创建后续自动继续动作。",assistantCapabilitySummaryTimerCancel:"已取消等待中的自动继续动作。",assistantCapabilitySummaryTerminalInput:"输入已发送到目标终端。",assistantCapabilitySummaryTerminalClose:"目标终端已关闭。",assistantCapabilitySummaryWorkspace:"工作区相关操作已执行。",assistantCapabilitySummaryWorktree:"工作树相关操作已执行。",assistantCapabilitySummaryDebug:"调试动作已触发。",assistantCapabilitySummaryRead:"助手已完成这次读取操作。",assistantCliSummaryHelp:"已查询对应的助手命令帮助。",assistantCliSummaryCommand:"已发起助手命令调用。",assistantCliHelpRootTitle:"查看助手帮助",assistantCliHelpSessionsTitle:"查看会话帮助",assistantCliHelpSessionActionTitle:"查看会话动作帮助:{action}",assistantCliHelpTimersTitle:"查看自动化帮助",assistantCliHelpTerminalsTitle:"查看终端帮助",assistantCliHelpWorkspacesTitle:"查看工作区帮助",assistantCliHelpGenericTitle:"查看 {group} 帮助",assistantCapabilityRawExpand:"查看原始",assistantCapabilityRawCollapse:"收起原始",assistantCapabilityLabelWorkspace:"工作区",assistantCapabilityLabelSession:"会话",assistantCapabilityLabelTerminal:"终端",assistantCapabilityLabelTimer:"自动化",assistantCapabilityLabelProvider:"Provider",assistantCapabilityLabelDueAt:"时间",assistantCapabilityLabelStatus:"状态",assistantCapabilityLabelPath:"路径",assistantCapabilityLabelBranch:"分支",assistantCapabilityLabelRuntime:"运行实例",assistantCapabilityLabelCount:"数量",assistantCapabilityLabelDebugTarget:"调试目标",assistantCliLabelScope:"范围",assistantCliLabelAction:"动作",assistantCliLabelProject:"项目",assistantCliLabelMessage:"消息",assistantCliLabelInput:"输入",assistantCliLabelDelay:"延迟",assistantCliScopeRoot:"根命令",assistantCapabilityNavigationCollapsed:"已折叠",assistantCapabilityNavigationExpanded:"已展开",assistantCapabilityStatusActive:"进行中",assistantCapabilityStatusCompleted:"已完成",assistantCapabilityStatusCancelled:"已取消",assistantCapabilityStatusFailed:"已失败",thinkingLabel:"思考中",filePanelWorkspaceTab:"工作区",filePanelSessionTab:"本次会话",filePanelSessionViewLabel:"本次会话视图",filePanelSessionTreeView:"树状",filePanelSessionListView:"列表",filePanelSessionLoading:"正在整理本次会话修改的文件...",filePanelSessionEmpty:"这条会话还没识别到可暂存的修改文件。",filePanelSessionNoSession:"当前只选中了项目,还没选中会话,无法查看“本次会话”文件。",filePanelSessionStageAll:"全部暂存",filePanelSessionStageSuccess:"已把本次会话的修改加入暂存区。",filePanelSessionLoadFailed:"本次会话修改文件加载失败。",filePanelSessionSummary:"已识别文件",filePanelSessionUnstagedSummary:"未暂存",filePanelSessionDeleted:"已删除",filePanelOpenExternalWindow:"在新窗口打开",filePanelOpenExternalFailed:"打开文件外部窗口失败。"},desktopWindow:{invalidWindowId:"缺少窗口 ID,无法加载外部窗口。",loadDescriptorFailed:"读取窗口描述失败。",unsupportedKind:"暂不支持渲染 {kind} 窗口。"},git:{recentVersionsTitle:"最近版本",stagedChangesTitle:"暂存的更改",expandRecentVersions:"展开最近版本",collapseRecentVersions:"折叠最近版本",stagedLabel:"暂存区",workingTreeLabel:"工作区",changeTreeHint:"按目录层级展示当前变更",discard:"放弃改动",discardFailed:"放弃改动失败",operationMenu:"操作菜单",currentBranch:"当前分支",resizePanels:"调整文件区和最近版本高度",switchBranchTo:"切换到",undoLastCommit:"撤销上次提交",undoLastCommitFailed:"撤销上次提交失败",undoLastCommitSuccess:"已撤销上次提交",historyKindLocal:"本地",historyKindRemote:"远程",historyKindShared:"已同步",pushNow:"推送",commitNow:"提交",refreshNow:"刷新",openExternalWindow:"在新窗口打开 Git",openExternalFailed:"打开 Git 外部窗口失败。",stageAll:"暂存全部",unstageAll:"取消暂存全部",discardAll:"放弃全部改动",selectedFiles:"已选文件",clearSelection:"清空选中",selectFile:"选中文件",discardConfirm:"确认放弃这些改动吗?{path}",historyItemMenu:"版本操作",copyCommitHash:"复制 Commit Hash",copyCommitHashSuccess:"Commit Hash 已复制。",copyCommitSubject:"复制提交标题",copyCommitSubjectSuccess:"提交标题已复制。"},terminalManager:{workspaceField:"当前工作区",refresh:"刷新列表",loadFailed:"终端管理面板加载失败",shellLoadFailed:"终端 Shell 列表加载失败",emptyWorkspaceBody:"还没有可用工作区。",noCurrentWorkspaceBody:"先选中一条会话,进程管理才能绑定对应的工作区。",emptyTerminalBody:"当前工作区还没有终端实例。",emptyTemplateBody:"还没有快捷启动项,可以先保存一条命令或脚本。",shellField:"新终端 Shell",shellUnavailable:"当前不可用",cwdField:"启动目录",cwdLabel:"目录",cwdPlaceholder:"留空时默认使用工作区根目录",modeField:"启动方式",commandMode:"命令",scriptMode:"脚本",quickLaunchDescription:"先保存启动方式,需要时一键拉起到新终端。",desktopPanelDescription:"默认只看启动决策所需的信息,路径和命令行收进详情层。",openExternalWindow:"在新窗口打开",openExternalFailed:"打开进程管理外部窗口失败。",runningCountLabel:"运行中",portWatchCountLabel:"已监控端口",terminalCountLabel:"终端数",templateSectionTitle:"启动项",templateSectionDescription:"右侧优先显示启动项的端口状态,看清楚是否已被占用。",openWorkspaceDebugAction:"调试服务",openCreateModalAction:"添加快捷启动项",createModalTitle:"添加快捷启动项",createModalDescription:"在这里保存命令或脚本,可以附带端口,后面就能一键启动并判断是否在跑。",editAction:"编辑启动项",editModalTitle:"编辑快捷启动项",editModalDescription:"直接修改这条快捷启动的名称、命令、目录和端口配置。",saveTemplateChangesAction:"保存修改",templateUpdating:"保存修改中...",templateUpdateSuccess:"快捷启动项已更新。",templateUpdateFailed:"快捷启动项更新失败",removeAction:"移除启动项",templateRemoving:"移除中...",removeConfirmTitle:"确认移除启动项",removeConfirmAction:"确认移除",removeConfirmTarget:"确认移除“{name}”吗?移除后将不再出现在快捷启动列表中。",removeRunningConfirmTarget:"“{name}”对应的进程还在跑。现在移除的是启动项配置,不会自动结束已经运行的进程。确认继续吗?",templateDeleteSuccess:"快捷启动项已移除。",templateDeleteFailed:"快捷启动项移除失败",terminalSectionTitle:"终端实例",terminalSectionDescription:"这里显示当前工作区由 CodingNS 托管的终端。",closeAction:"关闭终端",closing:"关闭中...",closeSuccess:"终端关闭请求已提交。",closeFailed:"终端关闭失败",createTerminalAction:"新建空终端",creatingTerminal:"创建中...",createTerminalSuccess:"新终端已创建。",createTerminalFailed:"新终端创建失败",defaultTerminalName:"工作终端",templateNameField:"名称",templateNamePlaceholder:"留空时会自动生成",commandField:"启动命令",commandPlaceholder:"例如:npm",scriptPathField:"脚本路径",scriptPathPlaceholder:"例如:scripts/dev.ps1 或 scripts/dev.sh",argsField:"参数",argsPlaceholder:"例如:run dev 或 --watch",portField:"监听端口",portLabel:"端口",portPlaceholder:"例如:3000",proxyField:"反向代理",proxyToggleLabel:"开启反向代理",proxyEnabled:"代理已启用",proxyEnabledDescription:"开启后会生成随机 URL 码,可通过 /proxy/地址访问当前开发服务。",proxyDisabledDescription:"未开启反向代理",proxyPortRequired:"开启反向代理时,必须同时配置端口",openProxyUrlAction:"在浏览器打开代理地址",openProxyUrlFailed:"打开代理地址失败",invalidPort:"端口必须是 1 到 65535 的整数",saveLaunchAction:"保存为快速启动",templateSaving:"保存中...",templateSaveSuccess:"快捷启动项已保存。",templateSaveFailed:"快捷启动项保存失败",runTemplateAction:"启动到新终端",runningTemplate:"启动中...",templateRunSuccess:"快捷启动已发送到新终端。",templateRunFailed:"快捷启动执行失败",showDetailsAction:"显示详细信息",hideDetailsAction:"隐藏详细信息",detailsSectionTitle:"启动项详情",commandPreviewLabel:"启动命令",processIdLabel:"监听进程 PID",processGroupIdLabel:"进程组 PGID",processCommandLabel:"监听命令行",parentProcessIdLabel:"父进程 PID",parentProcessCommandLabel:"父进程命令行",terminationScopeLabel:"结束范围",terminationScopeProcess:"仅监听进程",terminationScopeProcessGroup:"整个进程组",stopProcessAction:"结束进程",stoppingProcess:"结束中...",stopProcessSuccess:"监听进程或所属进程组已结束。",stopProcessFailed:"结束监听进程或进程组失败",defaultCommandName:"新启动命令",defaultScriptName:"新启动脚本",lastActiveAt:"最近活跃",updatedAt:"最后更新",processCommandFallback:"这个进程没有暴露命令行",portUnset:"未配置端口",portUnsetDescription:"没有端口时,只能启动,不能自动判断服务是否在跑。",portOccupied:"进程已启动",portAvailable:"端口暂未被占用",portAvailableDescription:"这个启动项对应的端口目前还没有监听进程。",statusRunning:"运行中",statusStopped:"未运行",exitCode:"Exit Code",runningValue:"运行中"},theme:{light:"浅色",dark:"深色",skyBlue:"赛博",eyeGreen:"护眼",switchLabel:"主题"}},Qf={common:{close:"Close",cancel:"Cancel",logout:"Log out",language:"Language"},locale:{zhCN:"Simplified Chinese",enUS:"English"},settings:{title:"Settings",appearance:"Appearance",language:"Language",languageDescription:"Choose the display language used by the interface. The page updates immediately.",theme:"Theme",themeDescription:"Choose the color theme that fits the way you work.",connection:"Connection & Updates",serverAddress:"Server Address",serverDescription:"Desktop and H5 both work through this host entry.",releaseChannel:"Release Channel",releaseChannelDescription:"Stable or beta",releaseStable:"Stable",releaseBeta:"Beta",autoReconnect:"Auto Reconnect",autoReconnectDescription:"Retry HTTP and WebSocket links automatically when Host is briefly unavailable.",autoCheckUpdate:"Auto Check Client Updates",autoCheckUpdateDescription:"Clients only",notificationSettings:"Notifications",notificationSettingsDescription:"Control each session-related system notification independently.",notifyOnPermissionRequest:"Notify on permission requests",notifyOnPermissionRequestDescription:"Notify when a background session needs a new permission approval.",notifyOnSessionCompleted:"Notify when sessions complete",notifyOnSessionCompletedDescription:"Notify when a background session finishes.",notifyOnSessionFailed:"Notify when sessions fail",notifyOnSessionFailedDescription:"Notify when a background session fails.",enabled:"Enabled",disabled:"Disabled",serverUpdate:"Server Update",serverUpdateDescription:"",clientUpdate:"Client Update",clientUpdateDescription:"",serverCurrentVersion:"Server Current Version",serverTargetVersion:"Server Target Version",serverPackageName:"npm Package",serverUpdateCommand:"Upgrade Command",serverCheckNow:"Check Server",serverInstallNow:"Install",serverOpenPage:"Open npm",serverLatestUnknown:"Unavailable",serverUpdateReady:"New version found",serverUpToDate:"Up to date",serverCheckFailed:"Check failed",serverInstallWarning:"Installing the update will restart the CodingNS service through PM2 and briefly interrupt the connection.",serverInstallConfirmTitle:"Install Server Update",serverInstallConfirmDescription:"Continuing will install the new version first, then let PM2 restart the current CodingNS service automatically.",serverInstallConfirmAction:"Install And Restart",serverRestarting:"Update installed. Restarting the CodingNS service",serverInstallQueued:"Queued",serverInstalling:"Installing update",serverInstallSucceeded:"Update completed",serverInstallFailed:"Install failed",serverInstallCancelled:"Install cancelled",serverInstallTimeout:"Install timed out",serverRestartRequired:"New version installed. Restart Host to apply it.",serverOpenPageFailed:"Failed to open page",runtimePlatform:"Runtime Platform",runtimePlatformDescription:"Shows whether the app is running in Web/H5, Desktop, iOS, or Android.",platformDesktop:"Desktop",platformWeb:"Web",platformIos:"iOS",platformAndroid:"Android",releaseDesktopOnly:"Desktop updates are not available in the current Web/H5 runtime.",releaseCurrentVersion:"Current Version",releaseTargetVersion:"Target Version",releaseUnknownVersion:"Unknown",releaseNotes:"What's New",releaseNotesEmpty:"No details",releaseCheckNow:"Check Client",releaseInstallNow:"Install",releaseOpenPage:"Open Release",releaseManualOnly:"This version requires manual installation",releaseUpdateBadge:"Update",releaseUpdateReady:"New version found",releaseUpToDate:"Up to date",releaseCheckFailed:"Check failed",releaseInstallStarted:"Install started",releaseInstallFailed:"Install failed",releasePageOpenFailed:"Failed to open release page",androidInstallerStarted:"Handed off to the Android installer. You can still cancel there.",androidInstallPermissionRequired:"Allow installs from this source before retrying.",androidInstallCancelled:"Install was cancelled or not completed. You can try again.",androidInstallSucceeded:"The new version has been detected as installed.",clientUpdateUnsupported:"Install updates are not supported here",account:"Account",logout:"Log out",logoutDescription:"Sign out of the current account and return to the login page.",advancedSettings:"Advanced Settings",parallelTaskDebug:"Parallel Task Debug",parallelTaskDebugDescription:"Runtime sampling stays off until you open this panel. Use it to inspect background tasks, schedulers, and main-thread pressure in real time.",debugPortPool:"Debug Port Pool",debugPortPoolDescription:"Assign available ports to registered launchers in child workspaces. All debug services now share one port range instead of separate pools per role.",debugPortPoolRangeLabel:"Port Range",debugPortPoolRangeHint:"Frontend, backend, worker, mock, and custom services all draw ports from this shared range",debugPortPoolStart:"Start",debugPortPoolEnd:"End",debugPortPoolRangeSeparator:"to",debugPortPoolSaveAction:"Save Port Pool",debugPortPoolSaved:"Port pool saved",debugPortPoolSaveFailed:"Failed to save the port pool",debugPortPoolValidationInteger:"Port pool bounds must be integers",debugPortPoolValidationRange:"Port pools must stay within 1024-65535 and start must be smaller than end",debugPortPoolValidationOverlap:"Port pool ranges must not overlap",debugPortPoolRoleFrontend:"Frontend",debugPortPoolRoleBackend:"Backend",debugPortPoolRoleWorker:"Worker",debugPortPoolRoleMock:"Mock",debugPortPoolRoleCustom:"Custom",debugPortPoolRoleHint:"{role} launchers will draw ports from this range",parallelTaskDebugAction:"Open Debug Panel",parallelTaskDebugModalTitle:"Parallel Task Debug",parallelTaskDebugModalDescription:"Task activity and event loop sampling only stay active while this window is open. Closing it stops collection immediately.",parallelTaskDebugClose:"Close parallel task debug",parallelTaskDebugLoading:"Opening observability session and loading runtime snapshot...",parallelTaskDebugLoadFailed:"Failed to load parallel task debug information",parallelTaskDebugEmpty:"No execution records are available right now.",parallelTaskDebugStatusActive:"Collecting",parallelTaskDebugStatusError:"Collection Error",parallelTaskDebugObservedAt:"Last Updated",parallelTaskDebugSessionExpireAt:"Session Expires At",parallelTaskDebugSessionTtl:"Session TTL",parallelTaskDebugCollectorState:"Collector State",parallelTaskDebugCollectorEnabled:"Enabled",parallelTaskDebugCollectorDisabled:"Disabled",parallelTaskDebugAutoRefresh:"Auto refresh every second",parallelTaskDebugCountersTitle:"Overall Counters",parallelTaskDebugTaskMetricsTitle:"Background Task Metrics",parallelTaskDebugSchedulerTitle:"Scheduler Metrics",parallelTaskDebugEventLoopTitle:"Event Loop",parallelTaskDebugRecentActivitiesTitle:"Recent Execution Records",parallelTaskDebugWaitAvg:"Average Wait",parallelTaskDebugRunAvg:"Average Run",parallelTaskDebugRunMax:"Longest Run",parallelTaskDebugStartedCount:"Started",parallelTaskDebugFinishedCount:"Finished",parallelTaskDebugFailedCount:"Failed",parallelTaskDebugCacheHitCount:"Cache Hits",parallelTaskDebugIdle:"Idle",parallelTaskDebugBusy:"Busy",parallelTaskDebugTickTotal:"Tick Total",parallelTaskDebugIdleTickTotal:"Idle Ticks",parallelTaskDebugTaskCountTotal:"Task Hits",parallelTaskDebugSchedulerErrorTotal:"Errors",parallelTaskDebugLastDuration:"Last Duration",parallelTaskDebugNextDelay:"Next Delay",parallelTaskDebugEventLoopResolution:"Resolution",parallelTaskDebugEventLoopMean:"Mean Delay",parallelTaskDebugEventLoopP95:"P95 Delay",parallelTaskDebugEventLoopP99:"P99 Delay",parallelTaskDebugEventLoopMax:"Max Delay",parallelTaskDebugTaskKey:"Task Key",parallelTaskDebugStatus:"Status",parallelTaskDebugAttempt:"Attempt",parallelTaskDebugWaitMs:"Wait",parallelTaskDebugRunMs:"Run",parallelTaskDebugSource:"Source",parallelTaskDebugError:"Error",parallelTaskDebugMetricEnqueue:"Enqueue",parallelTaskDebugMetricDedupe:"Dedupe",parallelTaskDebugMetricStarted:"Started",parallelTaskDebugMetricFinished:"Finished",parallelTaskDebugMetricFailed:"Failed",parallelTaskDebugMetricCancelled:"Cancelled",parallelTaskDebugMetricTimeout:"Timeout",parallelTaskDebugMetricCacheHit:"Cache Hit",parallelTaskDebugLaneRequestMainThread:"Request Main Thread",parallelTaskDebugLaneHostBackground:"Host Background",parallelTaskDebugLaneHelperProcess:"Helper Process",parallelTaskDebugLaneExternalProcess:"External Process",parallelTaskDebugEventEnqueued:"Enqueued",parallelTaskDebugEventDeduped:"Deduped",parallelTaskDebugEventStarted:"Started",parallelTaskDebugEventFinished:"Finished",parallelTaskDebugEventFailed:"Failed",parallelTaskDebugEventCancelled:"Cancelled",parallelTaskDebugEventTimeout:"Timeout",parallelTaskDebugEventCacheHit:"Cache Hit",parallelTaskDebugTaskStatusQueued:"Queued",parallelTaskDebugTaskStatusRunning:"Running",parallelTaskDebugTaskStatusSucceeded:"Succeeded",parallelTaskDebugTaskStatusFailed:"Failed",parallelTaskDebugTaskStatusCancelled:"Cancelled",parallelTaskDebugTaskStatusTimeout:"Timeout",opencliSectionTitle:"OpenCLI Access",opencliSectionDescription:"Manage which OpenCLI CLI skills are exposed inside CodingNS sessions without touching the global installation on this machine.",opencliEnableAction:"Enable",opencliRefreshAction:"Refresh",opencliSaveAction:"Save",opencliLoading:"Loading OpenCLI status...",opencliLoadFailed:"Failed to load OpenCLI status",opencliSummaryInstallState:"Install State",opencliSummaryCatalogCount:"Catalog Count",opencliSummaryEnabledCount:"Enabled Now",opencliSummaryBrowserCount:"Browser-Dependent",opencliProviderToggleLabel:"Enable OpenCLI in new sessions",opencliProviderHint:"This only controls CodingNS-managed sessions. It does not rewrite the global opencli in your own terminal.",opencliVersionLabel:"Version",opencliCatalogSourceLabel:"Catalog Source",opencliLastCheckedLabel:"Last Check",opencliCatalogRefreshedLabel:"Last Refresh",opencliInstallPathLabel:"Install Path",opencliInstallInstalled:"Installed",opencliInstallBroken:"Broken Install",opencliInstallMissing:"Not Installed",opencliHealthReady:"Runnable",opencliHealthBridgeMissing:"Browser Bridge Missing",opencliHealthBinaryReady:"Binary Ready",opencliHealthRuntimeBuildFailed:"Runtime Build Failed",opencliHealthUnknown:"Unchecked",opencliCatalogSourceManifest:"Installed manifest",opencliCatalogSourceCliList:"opencli list",opencliCatalogSourceLocalManifest:"Local manifest",opencliCatalogSourceCache:"Retained cache",opencliRuntimeReady:"Trimmed runtime ready",opencliRuntimeFailed:"Trimmed runtime failed",opencliRuntimePending:"Trimmed runtime building",opencliRuntimeStale:"Trimmed runtime stale",opencliRuntimeIdle:"No runtime yet",opencliRefreshDone:"OpenCLI status refreshed",opencliRefreshReady:"OpenCLI status refreshed and the current runtime is ready for new sessions",opencliRefreshCacheRetained:"Refresh failed. The latest successful catalog cache was kept.",opencliRefreshUnavailable:"OpenCLI catalog is unavailable right now",opencliSaveReady:"OpenCLI settings saved. New sessions will use the rebuilt trimmed runtime.",opencliSaveEnabled:"OpenCLI settings saved, but the runtime is not ready yet.",opencliSaveDisabled:"OpenCLI has been disabled for new sessions",opencliEmpty:"There is no OpenCLI catalog to display right now.",opencliEmptyNotInstalled:"OpenCLI is not installed on this machine yet. Install it first, then refresh.",opencliCatalogGridTitle:"CLI Skill Catalog",opencliCatalogGridDescription:"Filter first, then use site cards to inspect and switch individual commands.",opencliDetailAction:"Details",opencliDetailTitle:"OpenCLI Details",opencliDetailStatusHeading:"Current Status",opencliDetailRuntimeIdLabel:"Runtime ID",opencliDetailRuntimeRootLabel:"Runtime Root",opencliDetailErrorHeading:"Recent Errors",opencliEnabledStateLabel:"Enabled in New Sessions",opencliEnabledStateOn:"Enabled",opencliEnabledStateOff:"Disabled",opencliFilterTabsLabel:"OpenCLI CLI skill filters",opencliFilterAll:"All",opencliFilterEnabled:"Enabled",opencliFilterBrowser:"Browser",opencliFilterDirect:"Direct",opencliFilterStrategy:"Strategy {strategy}",opencliFilteredEmpty:"No CLI skills match the current filter.",opencliSiteToggleLabel:"Toggle site {site}",opencliSiteSummary:"{enabled}/{total} enabled, with {browser} commands depending on the browser bridge.",opencliSiteSummaryCompact:"{enabled}/{total} enabled",opencliSiteBrowserCompact:"{count} browser-dependent",opencliSiteDirectCompact:"No browser bridge",opencliSiteCommandCount:"{count} commands",opencliSiteDescriptionEmpty:"This site does not provide an extra summary yet. Open the command list below to keep filtering.",opencliSiteViewAction:"View",opencliSiteSelectedAction:"Viewing",opencliSiteEnableAction:"Enable",opencliSiteDetailTitle:"{site} Commands",opencliSiteDetailDescription:"{count} commands match the current filter, out of {total} total commands for this site.",opencliSiteDescriptionHeading:"Site Summary",opencliCommandModalFallbackTitle:"Command List",opencliCommandModalEmpty:"No commands are available for this CLI skill site under the current filter.",opencliCommandSearchLabel:"Search Commands",opencliCommandSearchPlaceholder:"Filter by command name, description, or strategy",opencliCommandSortLabel:"Sort",opencliCommandSortStatus:"By Status",opencliCommandSortBrowser:"Browser First",opencliCommandSortName:"By Name",opencliCommandResultCount:"{count} visible",opencliCommandToggleLabel:"Toggle command {commandId}",opencliBrowserTag:"Browser Bridge",opencliHttpTag:"HTTP",opencliCommandDescriptionEmpty:"This catalog entry does not provide an extra description.",opencliStrategyUnknown:"Unknown strategy",opencliStrategyLabel:"Type: {strategy}",opencliStrategyShortLabel:"{strategy}",opencliStrategyCookie:"Cookie",opencliStrategyHeader:"Header",opencliStrategyIntercept:"Intercept",opencliStrategyLocal:"Local",opencliStrategyPublic:"Public",opencliStrategyUi:"UI",skillConfigTabsLabel:"Skill manager tabs",skillConfigTabSkills:"SKILL",skillConfigTabOpenCli:"OpenCLI"},shell:{title:"Workbench",subtitle:"Manage AI sessions inside code projects",mobileWorkspacesEntry:"Workspaces",mobileTerminalsEntry:"Terminal",mobileSessionsEntry:"Conversation",mobileToolsEntry:"Tools",mobileSettingsEntry:"Settings",mobileNavigationAction:"Open workbench menu",mobileSearchAction:"Open search",mobileAuxiliaryAction:"Open tools panel",mobileRevealNavigationAction:"Show primary navigation",mobileHideNavigationAction:"Hide primary navigation",mobileConversationPreviewTitle:"Quick Preview",mobileConversationCurrentWorkspaceSection:"Current Workspace",mobileConversationCollapsePreviewAction:"Hide Preview",mobileConversationRestorePreviewAction:"Restore Session Preview",iosMoreAction:"More actions",androidMoreAction:"More actions",conversationEntry:"Conversation",terminalsEntry:"Terminal",butlerEntry:"Assistant",skillsEntry:"Skills",globalNotificationsAction:"Notifications",globalNotificationsUnreadAria:"{count} unread notifications",globalNotificationsPanelTitle:"Notification Center",globalNotificationsPanelDescription:"Review items waiting for your decision, todo analysis results, follow-up updates, and failed verifications.",globalNotificationsEmpty:"There are no new global notifications right now.",globalNotificationsShowArchived:"Show archived notifications",globalNotificationsArchiveAction:"Archive",globalNotificationsRemoveArchiveAction:"Remove Archive",globalNotificationsArchiveFailed:"Failed to update notification archive state",globalNotificationKindWaitingUser:"Waiting for You",globalNotificationKindTodoAnalyzed:"Todo Analyzed",globalNotificationKindTodoAnalyzeFailed:"Todo Analysis Failed",globalNotificationKindFollowUpFailed:"Follow-up Failed",globalNotificationKindFollowUpCompleted:"Follow-up Completed",globalNotificationKindVerificationFailed:"Verification Failed",globalNotificationTodoAnalyzedTitle:"Todo analysis completed: {title}",globalNotificationTodoAnalyzeFailedTitle:"Todo analysis failed: {title}",globalNotificationFollowUpWaitingTitle:"Needs your decision: {title}",globalNotificationFollowUpFailedTitle:"Follow-up failed: {title}",globalNotificationFollowUpCompletedTitle:"Follow-up completed: {title}",globalNotificationVerificationFailedTitle:"Verification failed: {title}",globalNotificationVerificationFailedFallback:"The latest verification did not pass. Please review it soon.",searchEntry:"Search",butlerInitTitle:"Initialize Assistant",butlerInitDescription:"Set the Butler name, provider, and work style first. The dedicated workspace and first AGENTS.md will be created automatically.",butlerInitPreviewTitle:"Live Preview",butlerInitPreviewDescription:"These choices directly shape the first rule set, so show the result instead of dumping a plain form.",butlerInitBasicsTitle:"Basics",butlerInitBasicsDescription:"Lock in the name, provider, and rule storage first so initialization does not become config soup.",butlerInitPersonaTitle:"Expression Style",butlerInitPersonaDescription:"Tone, language, and summary style decide how Butler speaks, not whether it gets to be sloppy.",butlerInitPreferenceTitle:"Default Priorities",butlerInitPreferenceDescription:"This decides which risks Butler watches first and what it surfaces first in reports.",butlerInitRuleLabel:"Rule Format",butlerInitTipAutoWorkspace:"The system creates the Butler workspace and first AGENTS.md automatically, so you only set the defaults here.",butlerInitTipProviderSwitch:"You can switch provider later, so do not overthink the first initialization pass.",butlerInitTipReportPriority:"Report priority changes whether Butler leads with risk, blockers, or verification results.",butlerDisplayNameLabel:"Butler Name",butlerDisplayNamePlaceholder:"Example: Arvin, Butler",butlerDisplayNameHint:"This is the Butler's self-name. The system writes it into the first generated AGENTS.md.",butlerProviderLabel:"Provider",butlerWorkspacePathLabel:"Butler Workspace Path",butlerWorkspacePathPlaceholder:"Example: /Users/you/WorkFile/butler-home",butlerAgentsModeLabel:"AGENTS Mode",butlerAgentsModeInline:"Inline",butlerAgentsModeFile:"File",butlerAgentsModeInlineDescription:"Inline: the system generates rules from your initialization choices and manages them for you.",butlerAgentsModeFileDescription:"File: the system writes AGENTS.md into the Butler workspace so you can edit the file directly later.",butlerAgentsFilePathLabel:"AGENTS.md File Path",butlerAgentsFilePathPlaceholder:"Example: /Users/you/WorkFile/butler-home/AGENTS.md",butlerAgentsContentLabel:"AGENTS Instructions",butlerAgentsContentPlaceholder:"Describe the Butler's work rules and response style",butlerAgentsContentHint:"Maintain Butler's formal rules here. Saving will write back to the dedicated AGENTS.md or inline instructions.",butlerPersonaToneLabel:"Tone",butlerPersonaLanguageLabel:"Language",butlerPersonaSummaryStyleLabel:"Summary Style",butlerFocusRiskPreferenceLabel:"Risk Preference",butlerFocusReportPriorityLabel:"Report Priorities (comma-separated)",butlerFocusReportPriorityPlaceholder:"Example: risk,blocker,verification",butlerToneDirect:"Direct and Clear",butlerToneSteady:"Steady and Controlled",butlerToneFriendly:"Friendly and Patient",butlerLanguageZhCn:"Chinese First",butlerLanguageEnUs:"English First",butlerLanguageBilingual:"Bilingual",butlerSummaryBrief:"Brief",butlerSummaryStructured:"Structured",butlerSummaryThorough:"Thorough",butlerRiskConservative:"Conservative",butlerRiskBalanced:"Balanced",butlerRiskProactive:"Proactive",butlerReportPriorityPresetLabel:"Report Priority",butlerReportRiskFirst:"Risk First",butlerReportBlockerFirst:"Blockers First",butlerReportVerificationFirst:"Verification First",butlerReportProgressFirst:"Progress First",butlerSummaryDebounceLabel:"Session Summary Debounce",butlerSummaryDebounceOption1Minute:"1 minute",butlerSummaryDebounceOption3Minutes:"3 minutes",butlerSummaryDebounceOption5Minutes:"5 minutes (default)",butlerSummaryDebounceOption10Minutes:"10 minutes",butlerSummaryDebounceOption15Minutes:"15 minutes",butlerSummaryDebounceOption30Minutes:"30 minutes",butlerSettingsTitle:"Butler Settings",butlerSettingsSaveAction:"Save Settings",butlerSettingsSaving:"Saving...",butlerSettingsSaved:"Butler settings saved",butlerSettingsSaveFailed:"Failed to save Butler settings",butlerInitSubmitting:"Initializing...",butlerInitSubmit:"Initialize Butler",butlerInitSuccess:"Assistant initialized",butlerInitFailed:"Failed to initialize Assistant",butlerInitNameRequired:"Assistant name is required",butlerInitWorkspaceRequired:"Assistant workspace path is required",butlerInitAgentsFileRequired:"AGENTS.md path is required in file mode",butlerWorkbenchTitle:"Assistant Workbench",butlerWorkbenchSubtitle:"Chat with Butler here and review aggregated context with action events.",butlerWorkspaceHint:"Butler workspace: {workspacePath}",butlerDisplayNameActiveHint:"Current Butler name: {displayName}",butlerNewSessionAction:"New Session",butlerNewSessionStarted:"Started a fresh Butler session",butlerNewSessionFailed:"Failed to start a fresh Butler session",butlerRefreshAction:"Refresh",butlerHistoryAction:"Recent Sessions",butlerHistoryTitle:"Recent Sessions",butlerHistoryDescription:"All assistant sessions are kept here, including todo analysis runs and regular chats.",butlerHistoryEmpty:"There is no assistant history yet.",butlerHistorySearchLabel:"Search sessions",butlerHistorySearchPlaceholder:"Search by title or preview",butlerHistorySearchEmpty:"No matching sessions found.",butlerHistoryActiveSection:"Active",butlerHistoryInactiveSection:"Earlier",butlerHistoryOpenAction:"Open Session",butlerHistoryDeleteAction:"Delete Session",butlerCurrentSessionBadge:"Current",butlerControlSessionKindChat:"Chat",butlerControlSessionKindTodoAnalysis:"Todo Analysis",butlerLoadingTitle:"Loading Butler",butlerLoadingDescription:"Pulling the current assistant session, summaries, and control state. Please wait a moment.",butlerSidebarInfoTab:"Info",butlerSidebarAutomationTab:"Automation",butlerSidebarSettingsTab:"Settings",butlerSidebarTabsLabel:"Butler sidebar tabs",butlerSidebarLoadFailed:"Failed to load Butler sidebar",butlerSandboxEntryTitle:"Sandbox Workspaces",butlerSandboxEntryDescription:"Temporary files saved by Butler appear here.",butlerSandboxEntrySessionSummary:"{count} sandboxes linked",butlerSandboxEntryEmptySummary:"",butlerSandboxManageAction:"Manage Sandboxes",butlerSandboxManagerTitle:"Sandbox Manager",butlerSandboxManagerDescription:"View sandboxes and files for the current session.",butlerSandboxBrowseAllAction:"View All Sandboxes",butlerSandboxManagerCurrentDescription:"This list only shows sandboxes used by the current session.",butlerSandboxManagerIdleDescription:"Sandboxes will appear here when the current session uses them.",butlerSandboxCreateTitle:"Create Sandbox",butlerSandboxCreateDescription:"Start with a blank sandbox by default. Clone a repo only when you actually need to reproduce something real.",butlerSandboxListTitle:"Current Sandboxes",butlerSandboxListDescription:"These workspaces are temporary by design. Delete them when they stop being useful.",butlerSandboxCurrentTitle:"Current Sandbox",butlerSandboxCurrentPanelDescription:"This section shows the sandbox you are viewing now.",butlerSandboxCurrentDescription:"This list only shows sandboxes used by the current session.",butlerSandboxLibraryTitle:"All Sandboxes",butlerSandboxLibraryDescription:"Browse or delete existing sandboxes here.",butlerSandboxLibraryEmpty:"No sandboxes available.",butlerSandboxCurrentSessionHint:"Currently viewing control session: {session}",butlerSandboxNoControlSession:"No sandboxes",butlerSandboxTitleLabel:"Sandbox Title",butlerSandboxTitlePlaceholder:"Example: CodingNS temporary triage",butlerSandboxSourceKindLabel:"Source",butlerSandboxSourceBlank:"Blank sandbox",butlerSandboxSourceClone:"Clone repository",butlerSandboxPurposeLabel:"Use",butlerSandboxPurposePlaceholder:"Describe what this sandbox is for in one sentence",butlerSandboxRepositoryLabel:"Repository URL",butlerSandboxRepositoryPlaceholder:"Example: https://github.com/org/repo.git",butlerSandboxDirectoryLabel:"Directory Name (optional)",butlerSandboxDirectoryPlaceholder:"Leave empty to derive it from the title or repository name",butlerSandboxProjectProviderHint:"Promotion will use {provider} as the default provider.",butlerSandboxLoading:"Loading sandboxes...",butlerSandboxEmpty:"No sandboxes.",butlerSandboxWorkspaceMissing:"The linked workspace no longer exists",butlerSandboxPurposeEmpty:"No extra note",butlerSandboxCreateAction:"Create Sandbox",butlerSandboxCreating:"Creating...",butlerSandboxOpenAction:"View",butlerSandboxPromoteAction:"Promote to Project",butlerSandboxExpireAction:"Mark Expired",butlerSandboxRemoveAction:"Delete Sandbox",butlerSandboxActionRunning:"Working...",butlerSandboxLoadFailed:"Failed to load sandboxes",butlerSandboxCreateSucceeded:"Sandbox created",butlerSandboxCreateFailed:"Failed to create sandbox",butlerSandboxPromoteSucceeded:"Sandbox promoted to project",butlerSandboxPromoteFailed:"Failed to promote sandbox",butlerSandboxExpireSucceeded:"Sandbox marked as expired",butlerSandboxExpireFailed:"Failed to mark sandbox as expired",butlerSandboxRemoveSucceeded:"Sandbox deleted",butlerSandboxRemoveFailed:"Failed to delete sandbox",butlerSandboxRepositoryRequired:"A repository URL is required for clone sandboxes",butlerSandboxVisibilityLabel:"Visibility",butlerSandboxVisibilityAssistantOnly:"Assistant only",butlerSandboxVisibilityPinned:"Pinned",butlerSandboxStatusOrphaned:"Orphaned",butlerSandboxUpdatedAtLabel:"Updated",butlerSandboxWorkspaceLabel:"Sandbox Path",butlerSandboxFilesTitle:"Sandbox Files",butlerSandboxFilesDescription:"Select a sandbox to browse its files here.",butlerSandboxSelectHint:"Select a sandbox.",butlerInfoContextTitle:"Current Context",butlerInfoContextDescription:"Show only what the Butler is using in this round, without flooding the panel with unrelated details.",butlerInfoCurrentScopeLabel:"Current Scope",butlerInfoCurrentScopeProject:"Project: {projectName}",butlerInfoCurrentScopeGlobal:"Global Overview",butlerInfoManagedProjectsLabel:"Tracked Projects",butlerInfoManagedProjectsValue:"Active {activeCount} / Total {totalCount}",butlerInfoCurrentContextProjectHint:"{projectName} is selected, so follow-up lookups will stay centered on this project first.",butlerInfoCurrentContextGlobalHint:"The Butler is still in global view. It only drills down when you pick a project or ask for details.",butlerInfoProjectSelectedAction:"Currently Selected",butlerInfoProjectViewAction:"View Project",butlerInfoProjectBlockedBadge:"Blocked",butlerInfoProjectRiskBadge:"Risk: {riskLevel}",butlerInfoProjectRiskShortBadge:"Risk {riskLevel}",butlerInfoProjectLastActivityBadge:"Active: {updatedAt}",butlerInfoLatestSessionAction:"Open Latest Session",butlerInfoProgressTitle:"Current Progress",butlerInfoAttentionTitle:"Watch For",butlerInfoNextStepTitle:"Next Step",butlerInfoFollowUpRecordsTitle:"Follow-up Records",butlerInfoFollowUpRecordsDescription:"Only the latest 5 follow-up states are shown here; open the full history for more.",butlerInfoFollowUpRecordsEmpty:"No follow-up records yet.",butlerInfoFollowUpUntitled:"Untitled Session",butlerInfoFollowUpFallback:"Last updated: {updatedAt}",butlerFollowUpHistoryAction:"View History",butlerFollowUpHistoryTitle:"Follow-up History",butlerFollowUpHistoryDescription:"Review the complete follow-up status history and continue drilling into round details.",butlerInfoVerificationRecordsTitle:"Verification Records",butlerInfoVerificationRecordsDescription:"A global view of feature verification records.",butlerInfoVerificationRecordsEmpty:"No verification records yet.",butlerInfoVerificationFallback:"Current status: {status}",butlerVerificationHistoryTitle:"Verification History",butlerVerificationHistoryDescription:"Only non-active verification records are collected here. Active verifications stay in the main info list.",butlerVerificationHistoryEmpty:"There are no historical verification records yet.",butlerInfoTodoRecordsTitle:"Todo Progress",butlerInfoTodoRecordsDescription:"A global view of current todo progress.",butlerInfoTodoRecordsEmpty:"No todo progress records yet.",butlerInfoShowCompletedAction:"Show completed",butlerInfoTodoItemTitle:"Todo {index}",butlerInfoTodoPending:"Pending",butlerInfoTodoInProgress:"In Progress",butlerInfoTodoClosed:"Closed",butlerTodoLifecyclePending:"Pending analysis",butlerTodoLifecycleAnalyzing:"Analyzing",butlerTodoLifecycleAnalyzed:"Prompt ready",butlerTodoLifecycleSessionCreated:"Session created",butlerTodoLifecycleFollowUpActive:"Assistant working",butlerTodoLifecycleCompleted:"Completed",butlerTodoLifecycleFailed:"Failed",butlerTodoLifecycleEmpty:"No analysis summary has been generated for this todo yet.",butlerTodoPromptPreviewAction:"View prompt",butlerTodoAnalyzeAction:"Analyze repo",butlerTodoReanalyzeAction:"Analyze again",butlerTodoAnalyzeRunning:"Analyzing...",butlerTodoAnalyzeQueued:"Queued for background analysis",butlerTodoAnalyzeSucceeded:"Development prompt generated",butlerTodoAnalyzeFailed:"Failed to analyze the todo repository context",butlerTodoAnalyzeFirstAction:"Analyze first",butlerTodoWaitForPromptAction:"Waiting for prompt",butlerTodoStartSessionAction:"Create session",butlerTodoStartSessionRunning:"Creating...",butlerTodoCopyPromptAction:"Copy prompt",butlerTodoOpenSessionAction:"Open session",butlerTodoCopyPromptSucceeded:"Prompt copied",butlerTodoStartSessionSucceeded:"Created a development session for the todo",butlerTodoStartSessionFailed:"Failed to create a development session for the todo",butlerAutomationTasksTitle:"Automation Tasks",butlerAutomationTasksDescription:"Only automation tasks live here: what exists, what state it is in, and when it runs next.",butlerAutomationTasksEmpty:"No automation tasks yet.",butlerAutomationMobileOverviewDescription:"The main list only keeps the signals worth scanning. Open a card to view and edit the full configuration.",butlerAutomationRunsTitle:"Recent Automation Runs",butlerAutomationRunsDescription:"This view only shows recent automation executions and their outcomes.",butlerAutomationRunsEmpty:"No automation run records yet.",butlerAutomationHistoryTitle:"Automation History",butlerAutomationHistoryDescription:"Only non-active automation tasks and completed run records are collected here. Active automation stays in the main list.",butlerAutomationHistoryEmpty:"There are no automation history records yet.",butlerAutomationStatusActive:"Running",butlerAutomationStatusWaitingUser:"Waiting for You",butlerAutomationStatusCompleted:"Completed",butlerAutomationStatusFailed:"Failed",butlerAutomationStatusCancelled:"Cancelled",butlerAutomationTaskTypeLabel:"Task type",butlerAutomationTaskTypeManual:"Manual plan task",butlerAutomationTaskTypeInterval:"Scheduled plan task",butlerAutomationTaskTypeCron:"Cron plan task",butlerAutomationTaskTypeFollowUp:"Conditional follow-up task",butlerAutomationTaskTypeControlTimer:"Assistant timer",butlerAutomationTaskEnabled:"Enabled",butlerAutomationTaskDisabled:"Disabled",butlerAutomationStatusLabel:"Status",butlerAutomationTaskLastRunLabel:"Last run",butlerAutomationTaskNextRunLabel:"Next run",butlerAutomationOpenDetailsAction:"Open Details",butlerAutomationCollapseDetailsAction:"Hide Details",butlerAutomationDetailTitle:"Automation Config",butlerAutomationDetailDescription:"Edit the trigger rules and action content here. Changes apply immediately after saving.",butlerAutomationSaveAction:"Save Changes",butlerAutomationSaving:"Saving...",butlerAutomationSaveSucceeded:"Automation config saved",butlerAutomationSaveFailed:"Failed to save automation config",butlerAutomationTitleLabel:"Automation name",butlerAutomationPromptLabel:"Action content",butlerAutomationPromptRequired:"Action content is required.",butlerAutomationIncludeTriggerContextLabel:"Include trigger context in the assistant message",butlerAutomationTargetSessionLabel:"Target session",butlerAutomationDueAtLabel:"Run at",butlerAutomationEverySecondsLabel:"Every seconds",butlerAutomationEveryMinutesLabel:"Every minutes",butlerAutomationEveryHoursLabel:"Every hours",butlerAutomationStopAtLabel:"Stop at",butlerAutomationCronMinuteLabel:"Cron minute",butlerAutomationCronHourLabel:"Cron hour",butlerAutomationCronDaysOfWeekLabel:"Days of week",butlerAutomationPollIntervalLabel:"Poll interval (seconds)",butlerAutomationExpiresAtLabel:"Expires at",butlerAutomationMaxChecksLabel:"Max checks",butlerAutomationInvalidDateSuffix:" has an invalid datetime value.",butlerAutomationRequiredSuffix:" is required.",butlerAutomationInvalidNumberSuffix:" must be an integer.",butlerAutomationInvalidPositiveNumberSuffix:" must be greater than 0.",butlerAutomationCronDaysValidation:"Days of week must be comma-separated integers from 0 to 6.",butlerAutomationRunSourceLabel:"Source",butlerAutomationRunSourcePatrol:"Plan task run",butlerAutomationRunSourceFollowUp:"Conditional follow-up run",butlerAutomationRunSourceControlTimer:"Assistant timed resume",butlerAutomationRunSummaryLabel:"Outcome",butlerAutomationRunProcessedAtLabel:"Processed at",butlerAutomationRunEmptySummary:"No summary was returned for this run.",butlerAutomationPatrolRunTitle:"Patrol Task Run",butlerControlTimerBannerTitle:"Next timed step",butlerControlTimerCountdownActive:"The assistant will continue in {duration}",butlerControlTimerCountdownDueNow:"The assistant is about to continue",butlerControlTimerCountdownLead:"The assistant will",butlerControlTimerCountdownTail:"before continuing",butlerControlTimerCountdownDueLead:"The assistant is about to",butlerControlTimerCountdownDueTail:"continue",butlerControlTimerDueAtLabel:"Scheduled for: {time}",butlerControlTimerTypeOnce:"One-time",butlerControlTimerTypeRepeat:"Repeating",butlerControlTimerTypeConditional:"Conditional",butlerControlTimerTypeOther:"Other",butlerControlTimerWorkspaceLabel:"Target workspace",butlerControlTimerSessionLabel:"Target session",butlerControlTimerTargetSessionLabel:"Target session: {sessionId}",butlerControlTimerDetailAction:"View prompt details",butlerControlTimerPromptTitle:"Resume prompt",butlerControlTimerUnknownWorkspace:"No workspace linked",butlerControlTimerUnknownSession:"No session linked",butlerControlTimerStopAction:"Stop action",butlerControlTimerCancelOperationAction:"Cancel action",butlerControlTimerExecuteNowAction:"Stop timer",butlerControlTimerExecutingNow:"Executing now...",butlerControlTimerExecuteNowSucceeded:"The wait ended and the next action started immediately",butlerControlTimerExecuteNowFailed:"Failed to end the wait and execute immediately",butlerControlTimerActionNote:"Stop action cancels this timed continuation. Stop timer ends the wait and runs it now.",butlerControlTimerCancelAction:"Cancel timer",butlerControlTimerCancelling:"Cancelling...",butlerControlTimerCancelSucceeded:"The assistant timer was cancelled",butlerControlTimerCancelFailed:"Failed to cancel the assistant timer",butlerControlTimerRunCompletedSummary:"The timer fired and the assistant continued the next step.",butlerControlTimerRunCancelledSummary:"This timer was cancelled manually.",butlerControlTimerRunFailedSummary:"The timer failed to resume the assistant.",butlerControlTimerNoProject:"No linked project",butlerAutomationViewRoundsAction:"View Round Details",butlerAutomationRoundDetailsTitle:"Follow-up Round Details",butlerAutomationRoundDetailsDescription:"Review each Butler follow-up round for this task.",butlerAutomationRoundLoading:"Loading follow-up round details...",butlerAutomationRoundLoadFailed:"Failed to load follow-up round details",butlerAutomationRoundEmpty:"There are no follow-up round details yet.",butlerAutomationRoundLabel:"Round {round}",butlerAutomationRoundProcessedAtLabel:"Processed at",butlerAutomationRoundStatusLabel:"Task status",butlerAutomationRoundObservedStateLabel:"Session runtime state",butlerAutomationRoundSummaryLabel:"Round decision",butlerAutomationRoundWaitingReasonLabel:"Waiting reason",butlerAutomationRoundPromptLabel:"Proxy-sent content",butlerAutomationRoundKindStarted:"Follow-up started",butlerAutomationRoundKindContinue:"Resumed immediately",butlerAutomationRoundKindQueued:"Queued for send",butlerAutomationRoundKindWaitingUser:"Waiting for user",butlerAutomationRoundKindCompleted:"Marked completed",butlerAutomationRoundKindFailed:"Follow-up failed",butlerAutomationRoundKindCancelled:"Stopped manually",butlerAutomationRoundKindLimitReached:"Round limit reached",butlerInboxAction:"Inbox",butlerInboxModalTitle:"Inbox",butlerInboxModalDescription:"Track project todos here and keep their current progress tied to real projects.",butlerInboxLoading:"Loading inbox...",butlerInboxLoadFailed:"Failed to load inbox",butlerInboxProjectsEmpty:"No managed project is available to bind yet.",butlerInboxEmpty:"No inbox records yet.",butlerInboxCreateTitle:"Add Todo",butlerInboxEditingTitle:"Edit Todo",butlerInboxFormDescription:"Every todo must be bound to a project so the assistant can keep following it later.",butlerInboxListTitle:"Current Todos",butlerInboxListDescription:"This list shows todos across your managed projects so you can handle them in one place.",butlerInboxShowClosedAction:"Show closed",butlerInboxQuickStatusLabel:"Quick status update",butlerInboxProjectLabel:"Project",butlerInboxTypeLabel:"Type",butlerInboxTitleLabel:"Title",butlerInboxTitlePlaceholder:"For example: Finish login captcha flow",butlerInboxContentLabel:"Details",butlerInboxContentPlaceholder:"Describe the current issue, target, or what you want the assistant to keep pushing forward.",butlerInboxStatusLabel:"Progress",butlerInboxTypeTask:"Task",butlerInboxTypeBug:"Bug",butlerInboxTypeFeature:"Feature",butlerInboxTypeChange:"Change",butlerInboxStatusPending:"Pending",butlerInboxStatusInProgress:"In Progress",butlerInboxStatusClosed:"Closed",butlerInboxCreateAction:"Add Todo",butlerInboxUpdateAction:"Save Changes",butlerInboxCancelEditAction:"Cancel Edit",butlerInboxEditAction:"Edit",butlerInboxDeleteAction:"Delete",butlerInboxCreated:"Todo created",butlerInboxUpdated:"Todo updated",butlerInboxDeleted:"Todo deleted",butlerInboxSaveFailed:"Failed to save todo",butlerInboxDeleteFailed:"Failed to delete todo",butlerProviderSwitched:"Provider switched",butlerProviderSwitchedDescription:"Switched to {provider}. The current view was reset and reloaded.",butlerProviderSwitchFailed:"Failed to switch provider",butlerAttachmentUnsupported:"Attachments are not supported in Butler chat yet",butlerOverviewTitle:"Overview",butlerOverviewDescription:"This area pulls together the most important things to pay attention to right now.",butlerMetricProjectCount:"Projects",butlerMetricBlockedCount:"Blocked",butlerMetricHighRiskCount:"High Risk",butlerTopRisksTitle:"Top Risks",butlerNextActionsTitle:"Next Actions",butlerOverviewEmpty:"No data",butlerOverviewLoading:"Loading Butler context summary...",butlerEventsTitle:"Recent Actions",butlerEventsDescription:"Anything Butler just helped you do is listed here.",butlerEventsEmpty:"No action events yet",butlerLoadFailed:"Failed to load Butler workbench",butlerContextStrategyTitle:"Context On Demand",butlerContextStrategyDescription:"Butler only receives the global summary by default. Project sessions, memories, patrols, and verifications are fetched from the backend only after you drill into a specific project.",butlerConversationTitle:"Talk to Assistant",butlerConversationDescription:"This conversation belongs to {displayName} only. When details are needed, {displayName} answers from the aggregated summary first, then pulls the relevant project, session, patrol, or verification data from the backend on demand.",butlerComposerPlaceholder:"Tell {displayName} what you want to inspect or decide next",butlerProjectsTitle:"Projects",butlerProjectsDescription:"Pick a project here and Butler will continue with its latest progress and records.",butlerProjectsEmpty:"No projects available for drilldown",butlerProjectWorkspaceLabel:"Workspace: {workspaceId}",butlerProjectSummaryEmpty:"No summary available yet",butlerProjectOpenDetailAction:"Open Details",butlerProjectSyncAction:"Sync to Timeline",butlerProjectSyncSucceeded:"Project {projectName} was synced into Butler's timeline",butlerProjectActionRequiresSession:"Send Butler a message first, then ask it to continue working on a project.",butlerProjectContextTitle:"Current Project",butlerProjectContextDescription:"This area shows the sessions, records, and results tied to the project you selected.",butlerProjectContextEmpty:"Pick a project from the list or action events first.",butlerProjectContextLoading:"Loading project-related context...",butlerProjectContextMeta:"Project status: {status} · Risk level: {riskLevel}",butlerProjectActionSucceeded:"Butler action completed",butlerProjectActionFailed:"Butler action failed",butlerProjectActionPending:"Processing...",butlerProjectSessionsTitle:"Project Sessions",butlerProjectMemoriesTitle:"Project Memories",butlerProjectPatrolsTitle:"Patrol Runs",butlerProjectVerificationsTitle:"Verification Runs",butlerProjectOpenConversationAction:"Open Real Session",butlerProjectResumeAction:"Resume Session",butlerProjectResumeSucceeded:"Session resumed: {sessionTitle}",butlerProjectStartPatrolAction:"Start Patrol",butlerProjectPatrolSucceeded:"Started a patrol for {projectName}",butlerProjectStartVerificationAction:"Start Verification",butlerProjectVerificationSucceeded:"Started a verification for {projectName}",butlerProjectMemoryMeta:"Type: {memoryType} · Status: {status}",butlerProjectSessionMeta:"Role: {role} · Status: {status}",butlerProjectPatrolMeta:"Status: {status} · Risk: {riskLevel}",butlerProjectVerificationMeta:"Type: {verificationType} · Status: {status}",butlerProjectRunSummaryEmpty:"No summary yet",butlerProjectFocusAction:"Focus This Record",butlerProjectUpdatedAtLabel:"Updated: {updatedAt}",butlerFocusedBadge:"Focused",searchModalTitle:"Search",searchModalDescription:"Search sessions by title, or search code files inside the selected workspace.",searchModeLabel:"Search mode",searchModeSessions:"Sessions",searchModeCode:"Code",searchKeywordLabel:"Keyword",searchWorkspaceLabel:"Workspace",searchSessionPlaceholder:"Search by session title, workspace, or provider",searchCodePlaceholder:"Search by file name or path fragment",searchSessionHint:"Type a keyword to instantly filter matching sessions.",searchCodeHint:"Pick a workspace, then search by file name or path.",searchSessionEmpty:"No matching sessions found.",searchCodeEmpty:"No matching files found.",searchCodeFailed:"Code search failed. Please try again later.",searchSubmit:"Search",filesEntry:"Files",gitEntry:"GIT",terminalManagerEntry:"Debug",workspaceSectionTitle:"Workspaces",goBack:"Back",goForward:"Forward",workspaceCount:"Projects",sessionCount:"Sessions",manageWorkspaceAction:"Manage Projects",manageWorkspaceTitle:"Manage Projects",manageWorkspaceDescription:"The list starts with the currently loaded projects. Expand one to inspect its path, Git summary, and code composition, or remove it from the current workbench list.",manageWorkspaceImportAction:"Import Project",manageWorkspaceCloneAction:"Clone Project",manageWorkspaceEmpty:"There are no projects to manage right now.",manageWorkspaceLoading:"Loading project details...",manageWorkspaceLoadFailed:"Failed to load project details.",manageWorkspacePathLabel:"Path",manageWorkspaceGitCommitCount:"Git Commit Count",manageWorkspaceGitInfoLabel:"Git Repository Info",manageWorkspaceRepoRoot:"Repository Root",manageWorkspaceCurrentBranch:"Current Branch",manageWorkspaceRemoteLabel:"Remote",manageWorkspaceNoRemote:"No remote configured",manageWorkspaceNotGit:"This project is not a Git repository.",manageWorkspaceCodeCompositionLabel:"Code Composition",manageWorkspaceCodeCompositionFiles:"files",manageWorkspaceCodeCompositionOther:"Other",manageWorkspaceNoCodeComposition:"No recognizable code files were found for composition stats.",manageWorkspaceCodeTruncated:"The project is large, so only the first {count} recognizable files were counted.",manageWorkspaceColorLabel:"Background Color",manageWorkspaceColorSelectSwatch:"Use color {color}",manageWorkspaceColorClearAction:"Clear Color",manageWorkspaceColorUnset:"Not set. The default worktree color is in use.",manageWorkspaceColorSaveFailed:"Failed to save the workspace color.",manageWorkspaceRemoveAction:"Remove Project",manageWorkspaceRemoving:"Removing...",manageWorkspaceRemoveSuccess:"Project removed from the current workbench list",manageWorkspaceRemoveFailed:"Failed to remove the project",manageWorkspaceRemoveConfirmTitle:"Confirm Project Removal",manageWorkspaceRemoveConfirmDescription:"This only removes the project from the current workbench list. It does not delete any files on disk or historical records. If you load the same path again later, the old records will appear again.",manageWorkspaceRemoveConfirmTarget:'Remove "{name}" from the current workbench?',manageWorkspaceRemoveConfirmAction:"Remove Project",importWorkspaceTitle:"Add Project",importWorkspaceHint:"Import a local code directory",importExpand:"Expand",importCollapse:"Collapse",importPathLabel:"Project Path",importPathPlaceholder:"Enter the project folder path",importNameLabel:"Project Name",importNamePlaceholder:"Optional",importSubmit:"Add Project",importSubmitting:"Adding...",importChooseFolder:"Choose Folder",importPickFolderFailed:"Failed to open the folder picker",importDesktopDropHint:"You can drag a local project folder directly into this area",importHint:"Enter a local code directory and start working",importServerDirectoryHint:"Browse and select the project directory on the server",importBrowserTitle:"Select Server Directory",importBrowserDescription:"You are browsing directories on the server, not on the current device.",importBrowserCurrentPath:"Current Path",importBrowserRoots:"Root Directories",importBrowserOpenParent:"Go Up",importBrowserOpenPath:"Open Path",importBrowserCreateDirectory:"New Folder",importBrowserCreateDirectoryTitle:"New Folder",importBrowserCreateDirectoryDescription:"Create a single child folder in the current server path. Path separators are not accepted.",importBrowserCreateDirectoryLabel:"Folder Name",importBrowserCreateDirectoryPlaceholder:"Enter the new folder name",importBrowserCreateDirectorySuccess:"Folder created",importBrowserCreateDirectoryFailed:"Failed to create folder",importBrowserCreateDirectorySubmit:"Create Folder",importBrowserCreatingDirectory:"Creating...",importBrowserEmpty:"No subdirectory is available in the current path",importBrowserBrowseFailed:"Failed to load server directories",importBrowserSubmit:"Import Current Directory",importPathRequired:"Enter the project path",importSuccess:"Project added",importFailed:"Failed to add project",cloneWorkspaceTitle:"Clone Project",cloneWorkspaceHint:"Clone a Git repository into a server directory and add it to the project list.",cloneSubmit:"Clone Project",cloneSubmitting:"Cloning...",cloneRepositoryLabel:"Git Repository URL",cloneRepositoryPlaceholder:"For example: https://github.com/org/repo.git",cloneParentPathLabel:"Target Parent Directory",cloneParentPathPlaceholder:"Choose an existing directory on the backend server",cloneDirectoryNameLabel:"New Project Directory Name",cloneDirectoryNamePlaceholder:"Defaults to the repository name when left empty",clonePickDirectory:"Choose Directory",cloneAuthModeLabel:"Authentication",cloneAuthModeNone:"No Authentication",cloneAuthModeBasic:"Username + Password",cloneAuthModeToken:"Token",cloneUsernameLabel:"Username",cloneUsernamePlaceholder:"Enter Git username",clonePasswordLabel:"Password",clonePasswordPlaceholder:"Enter Git password",cloneTokenLabel:"Token",cloneTokenPlaceholder:"Enter access token",cloneTokenUsernamePlaceholder:"Optional, defaults to git when left empty",cloneRepoRequired:"Enter the Git repository URL",clonePathRequired:"Select the target parent directory",cloneSuccess:"Project cloned successfully",cloneFailed:"Clone failed",cloneHint:"The target parent directory must already exist. Clone creates a new repository folder under it.",cloneBrowserTitle:"Select Clone Parent Directory",cloneBrowserDescription:"Choose an existing server-side parent directory. Clone will create a new project folder under it.",cloneBrowserSubmit:"Use Current Directory",refreshNavigation:"Refresh",desktopChromeLabel:"Desktop Workbench",windowMinimize:"Minimize Window",windowMaximize:"Maximize or Restore Window",windowClose:"Close Window",contextOpenSession:"Open Session",navigationLoadFailed:"Load failed. Retry.",emptyNavigationTitle:"No project yet",emptyNavigationBody:"Add a local code directory to start working",emptyWorkspaceSessions:"No sessions",favoriteSectionTitle:"Pinned Sessions",favoriteSectionEmpty:"Pinned sessions stay here for quick access.",worktreeSectionTitle:"Child Worktrees",worktreeSectionExpand:"Expand Child Worktrees",worktreeSectionCollapse:"Collapse Child Worktrees",worktreeMergePanelLabel:"Worktree Merge",worktreeMergePanelTitle:"Merge Into Direct Parent",worktreeMergePreviewAction:"Preview",worktreeMergePreviewRefresh:"Preview",worktreeMergePreviewIdle:"Preview not loaded",worktreeMergePreviewLoading:"Checking...",worktreeMergeReady:"Ready to merge",worktreeMergeBlocked:"Merge blocked",worktreeMergeApplying:"Merging...",worktreeMergeApplyAction:"Merge",worktreeMergeApplySuccess:"The worktree has been merged into its direct parent",worktreeMergeApplyFailed:"Failed to merge worktree",worktreeMergePreviewFailed:"Failed to load merge preview",worktreeMergeAlreadyMerged:"Already merged into parent",worktreeMergeMergedHint:"The code is already back in the parent. Cleanup can be done next.",worktreeMergeMergedDirtyHint:"Committed history is already in the parent, but this worktree still has pending work and cannot be cleaned up yet.",worktreeMergeChecklistTitle:"Merge Checklist",worktreeMergeChecklistSourceState:"Worktree state is valid",worktreeMergeChecklistSourceStateBlocked:"The worktree state is inconsistent. The system is not treating it as an active worktree yet.",worktreeMergeChecklistSourceClean:"Source worktree is clean",worktreeMergeChecklistSourceCleanBlocked:"The source worktree still has uncommitted changes. Commit them first.",worktreeMergeChecklistTargetClean:"Parent workspace is clean",worktreeMergeChecklistTargetCleanBlocked:"The direct parent workspace has uncommitted changes and cannot receive the merge.",worktreeMergeChecklistChildren:"No active child worktrees",worktreeMergeChecklistChildrenBlocked:"There are still active child worktrees under this node. Clean leaf nodes first.",worktreeMergeChecklistCommits:"There are commits to merge",worktreeMergeChecklistCommitsBlocked:"This worktree has no commits ahead of the parent workspace.",worktreeMergeChecklistConflicts:"No merge conflicts detected",worktreeMergeChecklistConflictsBlocked:"Merge conflicts were detected. Resolve them before continuing.",worktreeMergeChecklistResultPending:"Waiting for preview",worktreeMergeChecklistResultReady:"Merge can proceed",worktreeMergeChecklistResultReadyDetail:"All checks passed. You can start the merge now.",worktreeMergeChecklistResultBlocked:"Merge cannot proceed yet",worktreeMergeChecklistResultBlockedDetail:"Resolve the blockers above before continuing.",worktreeMergeChecklistResultMerged:"Merged. Cleanup can continue",worktreeMergeCompactPending:"Pending",worktreeMergeCompactChecking:"Checking",worktreeMergeCompactReady:"Ready",worktreeMergeCompactBlocked:"Blocked",worktreeMergeCompactMerged:"Merged",worktreeMergeCompactMerging:"Merging",worktreeMergeCompactCleaning:"Cleaning",worktreeMergeCompactInactive:"State Error",worktreeMergeCompactDirty:"Dirty",worktreeMergeCompactTargetDirty:"Parent Dirty",worktreeMergeCompactConflict:"Conflict",worktreeMergeCompactChildren:"Has Children",worktreeMergeCompactNoCommits:"No Commits",worktreeCleanupAction:"Cleanup",worktreeCleanupRunning:"Cleaning...",worktreeCleanupSuccess:"The worktree has been cleaned up",worktreeCleanupFailed:"Failed to clean up worktree",worktreeCleanupModalTitle:"Confirm Worktree Cleanup",worktreeCleanupModalDescription:"Cleanup removes the worktree directory and app metadata by default. Deleting the branch is only available after it has been merged into the parent branch.",worktreeCleanupConfirm:"Clean up {name}? The git branch will be kept by default.",worktreeCleanupDeleteBranchLabel:"Also delete branch {branch}",worktreeCleanupDeleteBranchHint:"Branch deletion is only available after the branch has been merged into the parent branch.",worktreeCleanupDeleteBranchAction:"Cleanup and Delete Branch",worktreeCleanupDeleteBranchSuccess:"The worktree and branch {branch} have been cleaned up",worktreeCleanupDeleteBranchPartialFailed:"The worktree was cleaned up, but branch {branch} could not be deleted",worktreeMergeCurrentBranch:"Current branch: {branch}",worktreeMergeParentBranch:"Parent branch: {branch}",worktreeMergeTargetWorkspace:"Target parent: {name}",worktreeMergeAheadBehind:"Commit delta: ahead {ahead} / behind {behind}",worktreeMergeBaseCommit:"merge base: {commit}",worktreeMergeConflictLabel:"Conflicting files",favoriteAction:"Pin Session",unfavoriteAction:"Unpin",favoriteAdded:"Session pinned",favoriteRemoved:"Session unpinned",favoriteToggleFailed:"Failed to update pinned state",sessionMoreAction:"More Actions",deleteSessionAction:"Delete Session",deleteSessionConfirmTitle:"Delete This Session",deleteSessionConfirmDescription:"Deleting a session removes it from assistant history and workspace lists, and also clears the real session record. This cannot be undone.",deleteSessionSuccess:"Session deleted",deleteSessionFailed:"Failed to delete session",sessionStateInferred:"Inferred",renameAction:"Rename",renameSuccess:"Session name updated",renameFailed:"Failed to rename session",renameModalTitle:"Rename Session",renameModalDescription:"Use a name you can recognize at a glance. This changes only the title, not the content.",renameInputLabel:"Session Name",renameInputPlaceholder:"Enter a new session name",renamingSession:"Saving...",archiveFolderLabel:"Archived Sessions",archiveFolderAction:"Open Archive Folder",archiveAction:"Archive Session",archiveCurrentSessionAction:"Archive Current Session",archiveAdded:"Session archived",archiveConfirmTitle:"Archive This Session",archiveConfirmDescription:"After archiving, this session will be hidden from the main list for the current workspace, and you can still restore it from archive.",unarchiveAction:"Restore from Archive",archiveRestored:"Session restored to the main list",archiveModalTitle:"Archived Sessions",archiveModalDescription:"This list shows sessions temporarily hidden in the current project. Restore them when needed.",archiveEmpty:"There are no archived sessions in this project yet.",archiveSearchAction:"Search",archiveSearchLabel:"Search Archived Sessions",archiveSearchPlaceholder:"Search by session name or summary",archiveSearchEmpty:"No archived sessions match your search.",archiveSearchSummaryLoading:"Loading archived session summaries...",archiveSearchSummaryFailed:"Some archived summaries could not be loaded yet, so search currently falls back to titles.",archiveViewAction:"View Archived Sessions",parallelCreateAction:"Create Parallel Session",parallelCreateModalTitle:"Create Parallel Sessions",parallelCreateModalDescription:"Set the goal for this parallel run first, then adjust each session separately.",parallelCreateSharedPromptLabel:"The goal for this parallel run is",parallelCreateSharedPromptPlaceholder:"For example: explore multiple implementation paths, compare technical directions, or split the same debugging task into parallel angles.",parallelCreateCountLabel:"Parallel Count",parallelCreateMembersTitle:"Configure Each Session",parallelCreateMembersDescription:"Each pane is a real session member, with its own provider, model, and temporary workspace choice.",parallelCreateMemberTitle:"Member {index}",parallelCreateModelLabel:"Model",parallelCreateMemberPromptLabel:"Any special requirement?",parallelCreateMemberPromptPlaceholder:"For example: be more conservative, focus on refactoring, prioritize performance investigation, or constrain the stack and output style.",parallelCreateIsolationLabel:"Use Temporary Isolated Workspace",parallelCreateIsolationHint:"Only enable this for members that need an independent code directory. It stays out of formal worktrees until promotion succeeds.",parallelCreateProvidersLoading:"Loading installed providers...",parallelCreateNoAvailableProviders:"No available model provider is installed for this workspace yet.",parallelCreateNoModelsAvailable:"No models are available for this provider",parallelCreatePromptRequired:"The shared prompt cannot be empty",parallelCreatePartialFailure:"{successCount} members were created, and {failureCount} members failed to start.",parallelCreateAllFailed:"All {failureCount} members failed to start. Adjust the failed member settings and try again.",parallelCreateContinuePartial:"Open Created Split View",parallelCreateMemberSucceeded:"Created",parallelCreateMemberFailed:"Failed",parallelCreateMemberErrorTitle:"This member was not created",parallelCreateSubmit:"Create Parallel Sessions",parallelCreateSubmitting:"Creating parallel sessions...",parallelCreateSucceeded:"Parallel sessions created",parallelAppendAction:"Add Parallel Session",parallelAppendModalTitle:"Add Parallel Sessions",parallelAppendModalDescription:"Reuse the original user prompt for this group and only configure the newly added members.",parallelAppendSharedPromptLabel:"Original User Prompt",parallelAppendSharedPromptDescription:"This comes from the first user message in the current parallel group and cannot be edited here.",parallelAppendCountLabel:"Add Count",parallelAppendSubmit:"Add Parallel Sessions",parallelAppendSubmitting:"Adding parallel sessions...",parallelAppendSucceeded:"Parallel sessions added",parallelAppendNoRemainingSlots:"This parallel group already has 4 members and cannot accept more.",parallelGroupBadge:"Parallel",parallelGroupAnchorBadge:"Anchor",parallelGroupMemberBadge:"Member",parallelWorkspacePromotedBadge:"Promoted Workspace",parallelGroupLoadFailed:"Failed to load the parallel session group",parallelGroupEmpty:"No parallel members are available yet.",parallelPaneOpenAction:"Open Session",parallelPaneToolsAction:"Tools",parallelPanePinAction:"Pin Panel",parallelPaneDetachAction:"Open in Window",parallelPaneResizeAction:"Resize Panel",parallelPaneMoreAction:"More Options",parallelPaneInfoAction:"View Info",parallelPaneProcessesEntry:"Processes",parallelPaneTerminalEntryDescription:"Terminal work is input-heavy and scroll-heavy, so it stays as a dedicated entry instead of being forced into this floating panel.",parallelPaneTerminalOpenAction:"Open Terminal",parallelPaneInfoTitle:"Session Info",parallelPaneModelFallback:"Default Model",parallelPaneIsolatedWorkspaceTitle:"Temporary Isolated Workspace",parallelPanePromptFallback:"No special requirement",parallelPaneColorPaletteLabel:"Palette",parallelPaneColorPaletteDescription:"Adjust this pane color so it is easier to tell branches apart at a glance.",parallelPaneColorPaletteReset:"Use Default Split Colors",parallelPaneRemoveAction:"Remove Parallel Session",parallelPaneRemoveDescription:"Removing this session takes it out of the current parallel group. If it is still using a temporary isolated workspace, the workspace and branch are cleaned up too.",parallelPaneRemovePromotedDescription:"Removing this session takes it out of the current parallel group. Promoted child worktrees and branches are kept.",parallelPanePromoteAction:"Promote to Formal Worktree",parallelPanePromoteDescription:"Only promote this temporary workspace after you are sure it should be kept as a formal child worktree.",parallelPanePromoting:"Promoting...",parallelPaneRemoving:"Removing...",subagentBadge:"Sub-agent",sessionForkSession:"Session Fork",sessionForkMessage:"Message Fork",sessionForkReconstructed:"Reconstructed Fork",subagentExpand:"Expand Sub-agent List",subagentCollapse:"Collapse Sub-agent List",subagentExpandMore:"Show More Sub-agents",favoriteExpandMore:"Show More Pinned",sessionExpandMore:"Show More Sessions",archiveExpandMore:"Show More Archived Sessions",worktreeCollapse:"Collapse Worktree",worktreeExpand:"Expand Worktree",workspaceCollapse:"Collapse Project",workspaceExpand:"Expand Project",reorderWorkspace:"Drag to Reorder Projects",switchWorkspace:"Switch to Project",workspaceReorderFailed:"Failed to save project order.",workspaceCollapseStateSaveFailed:"Failed to save project collapse state.",workspaceHomeSwitcherLabel:"Switch Workspace",workspaceHomeSwitcherTitle:"Workspace",hostWorkspaceSwitcherTitle:"Hosts and Workspaces",hostSwitcherAriaLabel:"Switch Host",hostSwitcherTitle:"Hosts",hostSwitcherSavedSection:"Saved",hostSwitcherDiscoveredSection:"Discovered",hostSwitcherCurrentBadge:"Current",hostSwitcherDiscoveredBadge:"Auto",hostSwitcherNodeBadge:"HOST",hostSwitcherAddAction:"Add Host",hostSwitcherNameLabel:"Host Name",hostSwitcherNamePlaceholder:"For example: Office Host",hostSwitcherUrlLabel:"Host URL",hostSwitcherUrlPlaceholder:"For example: http://192.168.1.20:3002",hostSwitcherSaveAction:"Save Host",hostSwitcherSwitching:"Switching",hostSwitcherDetailAction:"Details",hostSwitcherDetailAriaLabel:"View connection details for host {name}",hostSwitcherDetailTitle:"Connection Details",hostSwitcherDetailStatusLabel:"Connection Status",hostSwitcherDetailStatusRelay:"CodingNS Connect",hostSwitcherDetailStatusDirect:"Direct",hostSwitcherDetailRouteLabel:"Current Route",hostSwitcherDetailAddressLabel:"Current Address",hostSwitcherDetailLatencyLabel:"CodingNS Connect Latency",hostSwitcherDetailLatencyLoading:"Checking...",hostSwitcherDetailTrafficLabel:"Session Traffic",hostSwitcherDetailUnavailable:"Unavailable",hostSwitcherWorkspaceCount:"{count} workspaces",hostSwitcherWorkspaceCountWithUser:"{username} · {count} workspaces",hostSwitchFailed:"Failed to switch host.",hostSwitchUnreachable:"{name} is unreachable right now.",hostSwitchMissing:"The target host no longer exists.",hostDeleteAction:"Delete Host",hostDeleteAriaLabel:"Delete host {name}",hostDeleteBusy:"Removing",hostDeleteConfirmAction:"Confirm",hostDeleteConfirm:'Delete host "{name}"? Saved sign-in info will also be cleared.',hostDeleteSuccess:"Removed host: {name}",hostDeleteFailed:"Failed to remove host: {name}",hostAddIncompleteCredentials:"Fill in both the username and password, or leave both blank.",hostAddInvalidUrl:"The host URL is invalid.",hostAddDuplicate:"This host already exists.",hostAddFailed:"Failed to add the host.",hostAddSuccess:"Added host: {name}",hostDiscoveryRefreshing:"Scanning local hosts...",hostDiscoveryFailed:"Failed to scan local hosts.",mobileWorktreeBadge:"Worktree",workspaceHomeStatusSectionTitle:"Current Workspace",workspaceHomeViewAllAction:"View All Sessions",workspaceHomeMetricActive:"Active",workspaceHomeMetricUnread:"Notifications",workspaceHomeMetricTerminal:"Terminals",workspaceHomeMetricChanges:"Changes",workspaceHomeActiveSessionsSectionTitle:"Active Sessions",workspaceHomeQuickLaunchStatusLabel:"Quick Debug",workspaceHomeQuickLaunchRunning:"Running",workspaceHomeQuickLaunchStopped:"Stopped",workspaceHomeWaitingInputLabel:"Waiting Input",workspaceHomeButlerLabel:"Assistant",mobileButlerEntry:"Assistant",mobileConversationToolCloseAction:"Back to Conversation",mobileConversationToolTabsLabel:"Files, Git, and Debug Tabs",mobileConversationToolProcessesTab:"Debug",mobileButlerEmptyTitle:"Assistant is not ready yet",mobileButlerEmptyBody:"The first assistant setup has not been completed yet. Finish the initial setup on desktop, then come back on mobile to review follow-ups and automations.",butlerProjectSyncEmptyState:"Give the assistant a concrete goal and it will continue the work here.",mobileButlerSummaryTitle:"Workspace Summary",mobileButlerSummaryProjects:"Projects",mobileButlerSummaryFollowUps:"Active Tasks",mobileButlerSummaryWaitingUser:"Waiting on You",mobileButlerSummaryInbox:"Open Todos",mobileButlerAssistantWorkspaceLabel:"Butler Workspace",mobileButlerAssistantToneLabel:"Tone",mobileButlerAssistantLanguageLabel:"Language",mobileButlerAssistantUpdatedAtLabel:"Updated",workspaceOverviewTitle:"Put project entry points where you can actually see them",workspaceOverviewBody:"Choose a project first, then decide whether to continue or start a new session.",workspaceListBody:"Keep every loaded project here and surface the frequent actions on the page.",workspaceDetailTitle:"Project Details",workspaceDetailSummaryTitle:"Project Overview",workspaceDetailSummaryBody:"See the path, Git summary, and code footprint first, then jump into the right tool.",workspaceDetailMissingTitle:"Project not found",workspaceDetailMissingBody:"This project may have been removed, or the current snapshot has not loaded it yet.",workspaceDetailDebugTitle:"Service Status",manageWorkspaceDebugDescription:"Review detected services, recent start status, and support guidance for the current project.",workspaceDetailDebugAnalyzeFailed:"Failed to load service status",workspaceDetailDebugFrameworkLabel:"Detected Type",workspaceDetailDebugConfidenceLabel:"Confidence",workspaceDetailDebugCompatibilityLabel:"Readiness",workspaceDetailDebugInjectionLabel:"Recommended Handling",workspaceDetailDebugRuntimeStatusLabel:"Current Status",workspaceDetailDebugFailureStageLabel:"Blocked At",workspaceDetailDebugServiceDiscoveryLabel:"Service Address Handling",workspaceDetailDebugHmrLabel:"Hot Reload Handling",workspaceDetailDebugCallbackLabel:"Callback Handling",workspaceDetailDebugAiFallbackLabel:"Manual Handling Policy",workspaceDetailDebugFrameworkNoteLabel:"Notes",workspaceDetailDebugReasonsLabel:"Summary",workspaceDetailDebugFilesLabel:"Reference Files",workspaceDetailDebugFailureStageEmpty:"None",workspaceDetailDebugRuntimeEmpty:"No runtime record yet.",workspaceDetailDebugFrameworkNoteEmpty:"No extra compatibility note.",workspaceDetailDebugEmptyReasons:"None",workspaceDetailDebugEmptyFiles:"None",workspaceDetailDebugConfidenceHigh:"High",workspaceDetailDebugConfidenceMedium:"Medium",workspaceDetailDebugConfidenceLow:"Low",workspaceDetailDebugCompatibilitySupported:"Ready to Use",workspaceDetailDebugCompatibilityConditional:"Needs More Setup",workspaceDetailDebugCompatibilityUnsupported:"Not Recommended Yet",workspaceDetailDebugCompatibilityUnknown:"Unknown",workspaceDetailDebugInjectionCli:"Startup Args",workspaceDetailDebugInjectionEnv:"Environment",workspaceDetailDebugInjectionOverride:"Adjust Command",workspaceDetailDebugInjectionAiFallback:"Needs Manual Help",workspaceDetailDebugInjectionNone:"Do Not Auto Handle Yet",workspaceDetailDebugRuntimePreparing:"Preparing",workspaceDetailDebugRuntimeRunning:"Running",workspaceDetailDebugRuntimeFailed:"Start Failed",workspaceDetailDebugRuntimeStopped:"Stopped",workspaceDetailDebugRuntimeNotStarted:"Not Started",workspaceDetailDebugRequirementRequired:"Needs Extra Setup",workspaceDetailDebugRequirementNotRequired:"No Extra Setup",workspaceDetailDebugAiPolicyNever:"Do Not Auto Handle",workspaceDetailDebugAiPolicyConditional:"Case by Case",workspaceDetailDebugAiPolicyAllowed:"Allowed",workspaceDetailDebugRuntimeServicesTitle:"Most Recent Start",workspaceDetailDebugRuntimeHistoryTitle:"Recent Starts",workspaceDetailDebugRuntimeHistoryTimeLabel:"Started At",workspaceDetailDebugRuntimeHistoryServiceLabel:"Services",workspaceDetailDebugRuntimeHistoryResultLabel:"Result",workspaceDetailDebugRuntimeHistoryTitleWithIndex:"Run #{id}",workspaceDetailDebugRuntimeHistoryFailedSummary:"{services} did not start correctly in this run.",workspaceDetailDebugRuntimeHistoryGenericSummary:"Recent start records are kept here so repeated failures are easier to spot.",workspaceDetailDebugRuntimeHistoryNoServices:"None",workspaceDetailDebugRuntimeHistoryResultRunning:"Still Running",workspaceDetailDebugRuntimeHistoryResultFailed:"Start Failed",workspaceDetailDebugRuntimeHistoryResultStopped:"Stopped",workspaceDetailDebugRuntimeHistoryResultPreparing:"Preparing",workspaceDetailDebugRuntimeServicePortLabel:"Assigned Port",workspaceDetailDebugRuntimeServiceBindingLabel:"Port State",workspaceDetailDebugRuntimeServiceProcessLabel:"Process",workspaceDetailDebugRuntimeServiceFailureLabel:"Issue Stage",workspaceDetailDebugRuntimeServiceAiLabel:"Manual Handling Record",workspaceDetailDebugDetectedServicesTitle:"Detected Services",workspaceDetailDebugServicePathLabel:"Location",workspaceDetailDebugServiceFrameworkLabel:"Detected As",workspaceDetailDebugServiceCommandLabel:"Start Command",workspaceDetailDebugServiceRequirementsLabel:"Extra Setup Needed",workspaceDetailDebugServiceActionLabel:"Recommended Action",workspaceDetailDebugOpenPageAction:"Services",workspaceDetailDebugPageTitle:"Services",workspaceDetailDebugPageDescription:"View launchers and current status.",workspaceDetailRegisteredDebugPageHeroEyebrow:"Registered Launchers",workspaceDetailRegisteredDebugPageDescription:"Shows registered launchers and status only.",workspaceDetailRegisteredDebugLoadFailed:"Failed to load registered launchers",workspaceDetailRegisteredDebugOverallStatusReady:"Ready",workspaceDetailRegisteredDebugOverallStatusPartial:"Needs Attention",workspaceDetailRegisteredDebugOverallStatusEmpty:"Not Set",workspaceDetailRegisteredDebugOverallSummary:"{runnable} ready · {orchestrated} adjust · {blocked} blocked",workspaceDetailRegisteredDebugSummaryRegisteredCountLabel:"Launchers",workspaceDetailRegisteredDebugSummaryConfiguredPortLabel:"Port Configured",workspaceDetailRegisteredDebugSummaryRunnableCountLabel:"Runnable Now",workspaceDetailRegisteredDebugSummaryOrchestratedCountLabel:"Needs Adjust",workspaceDetailRegisteredDebugSummaryBlockedCountLabel:"Blocked",workspaceDetailRegisteredDebugSummaryLastRefreshLabel:"Updated",workspaceDetailRegisteredDebugChipRegisteredOnly:"Only Debug entries",workspaceDetailRegisteredDebugChipNoGuessing:"No framework guessing",workspaceDetailRegisteredDebugChipPortDriven:"Runtime is port-driven only",workspaceDetailRegisteredDebugAnalysisTitle:"Project Info",workspaceDetailRegisteredDebugAnalysisDescription:"Shows project info.",workspaceDetailRegisteredDebugAnalysisReadonlyNote:"View only",workspaceDetailRegisteredDebugAnalysisDisplayOnlyHint:"View only",workspaceDetailRegisteredDebugAnalysisRoleLabel:"Type",workspaceDetailRegisteredDebugAnalysisNoService:"No result yet.",workspaceDetailRegisteredDebugAnalysisSourceSummary:"Analysis Source: {sourceType}",workspaceDetailRegisteredDebugTemplatesTitle:"Launchers",workspaceDetailRegisteredDebugTemplatesDescription:"Shows registered launchers only.",workspaceDetailRegisteredDebugTemplatesEmpty:"No launcher yet. Add one in Debug.",workspaceDetailRegisteredDebugOpenProcessManagerAction:"Open Debug",workspaceDetailRegisteredDebugActionSyncTemplates:"Refresh",workspaceDetailRegisteredDebugActionSyncingTemplates:"Refreshing…",workspaceDetailRegisteredDebugActionSyncTemplatesSuccess:"Registered launchers were synced from Debug",workspaceDetailRegisteredDebugActionSyncTemplatesFailed:"Failed to refresh registered launchers",workspaceDetailRegisteredDebugActionRunRegistered:"Start",workspaceDetailRegisteredDebugActionRunningRegistered:"Starting…",workspaceDetailRegisteredDebugActionRunRegisteredSuccess:"Runnable items were dispatched",workspaceDetailRegisteredDebugActionRunRegisteredFailed:"Failed to start registered items",workspaceDetailRegisteredDebugActionRunRegisteredSkipped:"Nothing is ready yet. Clear blockers first.",workspaceDetailRegisteredDebugActionPlanHint:"Check plan first",workspaceDetailDebugPageHeroEyebrow:"Service Overview",workspaceDetailDebugOverallStatusLabel:"Overall Status",workspaceDetailDebugOverallSummaryLabel:"Summary",workspaceDetailDebugOverallStatusSupported:"Ready to Start",workspaceDetailDebugOverallStatusConditional:"Some Services Need More Setup",workspaceDetailDebugOverallStatusBlocked:"Do Not Start Everything Yet",workspaceDetailDebugOverallSummaryEmpty:"No usable service check result is available yet.",workspaceDetailDebugOverallSummaryMixed:"Detected {webCount} web services and {desktopCount} desktop-shell services. Desktop shells are shown separately and excluded from web auto handling.",workspaceDetailDebugOverallSummaryDesktopOnly:"Detected {count} desktop-shell services and no clear web service yet.",workspaceDetailDebugOverallSummaryWebOnly:"Detected {count} web services that can join the web debug flow.",workspaceDetailDebugSummaryServiceCountLabel:"Analysis Items",workspaceDetailDebugSummaryWebCountLabel:"Web Services",workspaceDetailDebugSummaryDesktopShellCountLabel:"Desktop Shells",workspaceDetailDebugSummaryWebServicesChip:"{count} web services",workspaceDetailDebugSummaryDesktopShellChip:"{count} desktop shells",workspaceDetailDebugSummaryUnsupportedChip:"{count} blocking items",workspaceDetailDebugAutoInjectionEligible:"Current web services are ready for automatic handling",workspaceDetailDebugAutoInjectionBlocked:"Do not treat this whole project as auto-ready yet",workspaceDetailDebugDesktopShellSummaryHint:"Desktop shell services are shown separately from web service handling",workspaceDetailDebugCompatibilityBreakdown:"Ready {supported} / Needs setup {conditional} / Not recommended {unsupported}",workspaceDetailDebugLastAnalyzedAtLabel:"Last Check",workspaceDetailDebugTargetSourceRepo:"Scope: Repository Root",workspaceDetailDebugTargetSourceWorktree:"Scope: Current Worktree",workspaceDetailDebugRequirementsNone:"No extra setup required",workspaceDetailDebugServiceSectionDescription:"View the project one service at a time so you can tell what is ready and what still needs setup.",workspaceDetailDebugRuntimeSectionDescription:"This only shows the most recent start result so you can quickly see which service failed to come up.",workspaceDetailDebugMatrixSectionDescription:"This section explains the default support level for each detected service type.",workspaceDetailDebugMatrixTitle:"Support Guidance",workspaceDetailDebugMatrixOpenAction:"Open Support Matrix",workspaceDetailDebugMatrixModalDescription:"Use a real matrix table so people can scan support rules without reading a wall of cards.",workspaceDetailDebugMatrixFrameworkHeader:"Framework",workspaceDetailDebugMatrixCompatibilityHeader:"Support",workspaceDetailDebugMatrixInjectionHeader:"Mode",workspaceDetailDebugMatrixDiscoveryHeader:"Discovery",workspaceDetailDebugMatrixHmrHeader:"HMR",workspaceDetailDebugMatrixCallbackHeader:"Callback",workspaceDetailDebugMatrixAiHeader:"Manual",workspaceDetailDebugMatrixNotesHeader:"Notes",workspaceDetailDebugMatrixCompatibilitySupportedShort:"Ready",workspaceDetailDebugMatrixCompatibilityConditionalShort:"Needs Setup",workspaceDetailDebugMatrixCompatibilityUnsupportedShort:"Avoid",workspaceDetailDebugMatrixCompatibilityUnknownShort:"Unknown",workspaceDetailDebugMatrixInjectionCliShort:"CLI",workspaceDetailDebugMatrixInjectionEnvShort:"ENV",workspaceDetailDebugMatrixInjectionOverrideShort:"CMD",workspaceDetailDebugMatrixInjectionAiFallbackShort:"Manual",workspaceDetailDebugMatrixInjectionNoneShort:"None",workspaceDetailDebugMatrixRequirementRequiredShort:"Needs Work",workspaceDetailDebugMatrixRequirementNotRequiredShort:"Not Needed",workspaceDetailDebugMatrixAiNeverShort:"Do Not Use",workspaceDetailDebugMatrixAiConditionalShort:"Conditional",workspaceDetailDebugMatrixAiAllowedShort:"Allowed",workspaceDetailDebugMatrixLegendSummary:"Icon meanings: check means the default path is clear, warning means you still need setup, and cross means this path is not recommended for automatic handling yet.",workspaceDetailDebugMatrixDiscoveryNote:"Service address handling such as proxy, rewrites, and discovery.",workspaceDetailDebugMatrixHmrNote:"Hot reload and other long-lived frontend dev connections.",workspaceDetailDebugMatrixCallbackNote:"Callback-style entries such as OAuth, login callback, or webhook.",workspaceDetailDebugMatrixAiNote:"Whether edge cases are allowed to fall back to manual help.",workspaceDetailDebugActionAnalyze:"Reanalyze",workspaceDetailDebugActionPlan:"Create Plan",workspaceDetailDebugActionRun:"Start Services",workspaceDetailDebugActionRefresh:"Refresh Status",workspaceDetailDebugActionAnalyzing:"Analyzing…",workspaceDetailDebugActionPlanning:"Creating…",workspaceDetailDebugActionRunning:"Starting…",workspaceDetailDebugActionRefreshing:"Refreshing…",workspaceDetailDebugActionAnalyzeSuccess:"Service analysis has been refreshed",workspaceDetailDebugActionPlanSuccess:"Launch plan created",workspaceDetailDebugActionRunSuccess:"Start command was dispatched and the latest runtime is being refreshed",workspaceDetailDebugActionRefreshSuccess:"Status refreshed",workspaceDetailDebugActionWorkspaceMissing:"The current workspace information is incomplete, so this action cannot run yet.",workspaceDetailDebugActionTargetMissing:"No usable debug target is available yet. Finish analysis first.",workspaceDetailDebugActionAnalyzeFailed:"Failed to refresh analysis",workspaceDetailDebugActionPlanFailed:"Failed to create the launch plan",workspaceDetailDebugActionRunFailed:"Failed to start services",workspaceDetailDebugActionRefreshFailed:"Failed to refresh runtime",workspaceDetailDebugLaunchPlanTitle:"Launch Plan",workspaceDetailDebugLaunchPlanDescription:"View the current plan.",workspaceDetailRegisteredDebugLaunchPlanDescription:"Shows the latest plan.",workspaceDetailRegisteredDebugLaunchPlanGeneratedAtLabel:"Time",workspaceDetailRegisteredDebugLaunchPlanRunnableLabel:"Ready",workspaceDetailRegisteredDebugLaunchPlanOrchestratedLabel:"Adjust",workspaceDetailRegisteredDebugLaunchPlanBlockedLabel:"Blocked",workspaceDetailRegisteredDebugLaunchPlanNote:"Built from current settings.",workspaceDetailDebugLaunchPlanRuntimeIdLabel:"Preparation Record",workspaceDetailDebugLaunchPlanAutoStartLabel:"Result",workspaceDetailDebugLaunchPlanAutoStartAllowed:"Ready to run",workspaceDetailDebugLaunchPlanAutoStartBlocked:"Needs attention",workspaceDetailDebugLaunchPlanSideEffectNote:"Note: “Check Launch Plan” is not a pure preview right now. The backend will create a preparation record.",workspaceDetailDebugLaunchPlanServicePortLabel:"Planned Port",workspaceDetailDebugLaunchPlanServiceAdapterLabel:"Handling Mode",workspaceDetailDebugLaunchPlanServiceFailureLabel:"Blocked At",workspaceDetailDebugLaunchPlanServiceRequirementsLabel:"Missing Requirements",workspaceDetailDebugLaunchPlanServiceAttemptsLabel:"Resolution Chain",workspaceDetailDebugLaunchPlanServiceAiLabel:"Manual Fallback",workspaceDetailDebugLaunchPlanServiceAllowedFilesLabel:"Allowed Files",workspaceDetailDebugLaunchPlanServiceNoRequirements:"No extra blocking requirement right now",workspaceDetailDebugLaunchPlanServiceNoEnvPatch:"No additional environment patch",workspaceDetailDebugLaunchPlanServiceEnvPatchLabel:"Environment Patch",workspaceDetailDebugLaunchPlanDismissAction:"Clear Plan",workspaceDetailDebugFailureStageServiceDiscovery:"Still needs service address handling",workspaceDetailDebugFailureStageHmr:"Still needs hot reload handling",workspaceDetailDebugFailureStageCallback:"Still needs callback handling",workspaceDetailDebugFailureStageAiFallbackRequired:"Needs manual review",workspaceDetailDebugFailureStageAdapterSelection:"No suitable start method was found",workspaceDetailDebugFailureStageLaunchRequirements:"Some launch requirements are still missing",workspaceDetailDebugFailureStageCommandExecution:"The start command did not run correctly",workspaceDetailDebugFailureStageProcessExit:"The service exited right after start",workspaceDetailDebugFailureStageProcessRuntimeError:"The service hit a runtime error",workspaceDetailDebugFailureStageStaleRuntimeBinding:"This start record is no longer valid",workspaceDetailDebugFailureStageUnknown:"Unknown stage ({code})",workspaceDetailDebugBindingAllocated:"Assigned",workspaceDetailDebugBindingListening:"Reachable",workspaceDetailDebugBindingFailed:"Not Ready",workspaceDetailDebugBindingReleased:"Released",workspaceDetailDebugBindingUnknown:"Unknown",workspaceDetailDebugProcessCreating:"Starting",workspaceDetailDebugProcessRunning:"Running",workspaceDetailDebugProcessClosed:"Stopped",workspaceDetailDebugProcessError:"Error",workspaceDetailDebugProcessUnknown:"Unknown",workspaceDetailDebugPortEmpty:"None",workspaceDetailRegisteredDebugTemplatePortMissing:"Not Set",workspaceDetailRegisteredDebugTemplatePathLabel:"Registered Path",workspaceDetailRegisteredDebugTemplatePortLabel:"Port",workspaceDetailRegisteredDebugTemplateRuntimeTypeLabel:"Runtime",workspaceDetailRegisteredDebugTemplateSourceLabel:"Source",workspaceDetailRegisteredDebugTemplateSourceManual:"Manual",workspaceDetailRegisteredDebugTemplateSourceDebugService:"Auto",workspaceDetailRegisteredDebugTemplateSourceManaged:"Generated by System",workspaceDetailRegisteredDebugTemplateProxyLabel:"Proxy",workspaceDetailRegisteredDebugTemplateProxyEnabled:"Enabled",workspaceDetailRegisteredDebugTemplateProxyDisabled:"Disabled",workspaceDetailRegisteredDebugTemplateInjectionModeLabel:"Port Injection",workspaceDetailRegisteredDebugTemplateInjectionModeUnknown:"Not Marked",workspaceDetailRegisteredDebugTemplateServiceDiscoveryLabel:"Service Address Sync",workspaceDetailRegisteredDebugTemplateServiceDiscoverySameOrigin:"Same Origin",workspaceDetailRegisteredDebugTemplateServiceDiscoveryApiBaseUrl:"Inject API_BASE_URL",workspaceDetailRegisteredDebugTemplateServiceDiscoveryNone:"No Extra Handling",workspaceDetailRegisteredDebugTemplateServiceDiscoveryUnknown:"Not Marked",workspaceDetailRegisteredDebugTemplateStatusOccupied:"Busy",workspaceDetailRegisteredDebugTemplateStatusIdle:"Idle",workspaceDetailRegisteredDebugTemplateStatusUntracked:"Unknown",workspaceDetailRegisteredDebugPlanItemCommandLabel:"Command",workspaceDetailRegisteredDebugPlanItemRuntimeLabel:"Runtime",workspaceDetailRegisteredDebugPlanItemActionLabel:"Status",workspaceDetailRegisteredDebugPlanItemReasonLabel:"Reason",workspaceDetailRegisteredDebugPlanActionStart:"Start Directly",workspaceDetailRegisteredDebugPlanActionOrchestrated:"Start After Adjust",workspaceDetailRegisteredDebugPlanActionBlocked:"Cannot Start",workspaceDetailRegisteredDebugPlanReasonPortMissing:"Port is not set",workspaceDetailRegisteredDebugPlanReasonDuplicatePort:"Multiple launchers are registered with the same port, so auto-start is blocked.",workspaceDetailRegisteredDebugPlanReasonDuplicatePortWillOrchestrate:"Port conflict, a new port will be assigned",workspaceDetailRegisteredDebugPlanReasonPortOccupied:"Port is occupied",workspaceDetailRegisteredDebugPlanReasonPortOccupiedWillOrchestrate:"Port is occupied, a new port will be assigned",workspaceDetailRegisteredDebugPlanReasonPortOrchestrated:"Will switch to port {port}",workspaceDetailRegisteredDebugPlanReasonServiceDiscoveryInjected:"Address sync is ready",workspaceDetailRegisteredDebugPlanReasonAnalysisMissing:"Project analysis is missing. Refresh launchers and create the plan again.",workspaceDetailRegisteredDebugPlanReasonServiceDiscoveryMissing:"A backend launcher is required for address sync. Register it in Debug. Ports will be injected automatically.",workspaceDetailRegisteredDebugPlanReasonCallbackMissing:"This callback flow is not handled automatically yet. Confirm the startup flow manually.",workspaceDetailRegisteredDebugPlanReasonRunnable:"Ready to start",workspaceDetailRegisteredDebugLaunchPlanServiceDiscoveryHelp:"If address sync is missing, register the backend launcher in Debug. Ports are adjusted automatically at start time.",workspaceDetailRegisteredDebugRuntimeScopeNote:"Items without a port are skipped.",workspaceDetailRegisteredDebugRuntimeIdle:"Idle",workspaceDetailRegisteredDebugRuntimeUnknown:"No status",workspaceDetailRegisteredDebugRuntimeProcessLabel:"Process",workspaceDetailRegisteredDebugRuntimeCommandLabel:"Process Command Line",workspaceDetailDebugRoleFrontend:"Web Service",workspaceDetailDebugRoleBackend:"Backend Service",workspaceDetailDebugRoleWorker:"Background Worker",workspaceDetailDebugRoleMock:"Mock Service",workspaceDetailDebugRoleDesktopShell:"Desktop Shell",workspaceDetailDebugRoleCustom:"Custom",workspaceDetailDebugServiceOverviewSupported:"This service is clearly identified and is usually ready to start once you follow the recommended handling.",workspaceDetailDebugServiceOverviewConditional:"This service is identified, but still needs a few extra setup steps before it can start cleanly.",workspaceDetailDebugServiceOverviewUnsupported:"This service is not recommended for direct automatic handling yet. Confirm the start flow manually first.",workspaceDetailDebugServiceOverviewUnknown:"This service has not been identified clearly yet. The current result is kept for later review.",workspaceDetailDebugServiceOverviewDesktopShell:"This is a desktop shell service. It is shown separately and does not participate in automatic web-port handling.",workspaceDetailDebugServiceActionSupported:"Start Directly",workspaceDetailDebugServiceActionConditional:"Complete Setup First",workspaceDetailDebugServiceActionUnsupported:"Handle Manually",workspaceDetailDebugServiceActionUnknown:"Confirm Service Type First",workspaceDetailDebugServiceActionDesktopShell:"Handle as Desktop Shell",workspaceDetailDebugAiEditEmpty:"None",workspaceDetailDebugAiEditPending:"Pending",workspaceDetailDebugAiEditApplied:"Applied",workspaceDetailDebugAiEditRolledBack:"Rolled Back",workspaceDetailDebugAiEditRejected:"Rejected",workspaceSessionListBody:"Project sessions, favorites, and archive actions live here instead of hiding in a sidebar.",recentSessionsSectionTitle:"Recent Sessions",recentSessionsSectionBody:"Jump back into the work you touched most recently.",currentWorkspaceSectionTitle:"Current Project Sessions",currentWorkspaceSectionBody:"Keep the sessions for the current project together so the context stays obvious.",sessionIndexTitle:"Sessions deserve their own page",sessionIndexBody:"Recent, favorites, and current-project sessions are split into clear sections for mobile.",toolsMoreAction:"More",toolsSwipeHint:"Swipe left or right to switch between files and Git",toolsSwipePosition:"{current} / {total}",toolFilesBody:"Browse project files, changed files, and code context without relying on a desktop sidebar.",toolGitBody:"Open a clear Git entry for status, commits, and branches in the current project.",toolTerminalsBody:"Open the full terminal page for input-heavy and scroll-heavy tasks.",toolProcessesBody:"Review terminal templates, runtime status, and debug entry points for the current project.",toolsWorkspaceRequiredBody:"Pick a project before opening this tool page.",createSession:"New Session",createSessionModalTitle:"Choose Session Type",createSessionModalDescription:"Pick the session type first, then start the actual session process.",createSessionWorkspaceLabel:"Choose Workspace",createSessionProviderLabel:"Choose Provider",createSessionTarget:"Current Project",createWorktreeSectionTitle:"Child Workspace",createWorktreeSectionDescription:"Create a child workspace from the current project first, then choose the provider for the new session.",createWorktreeAction:"Add Child Workspace",createWorktreeCollapseAction:"Hide Child Workspace Form",createWorktreeBranchLabel:"Branch Name",createWorktreeBranchPlaceholder:"For example: feat/login-codex",createWorktreeBranchRequired:"Enter the child workspace branch name first.",createWorktreeBranchInvalid:"Branch names may only contain letters, numbers, -, _, and /. They cannot start or end with / or contain //.",createWorktreeDisplayNameLabel:"Display Name (Optional)",createWorktreeDisplayNamePlaceholder:"Defaults to the branch name",createWorktreeBaseRefLabel:"Create From Branch/Commit (Optional)",createWorktreeBaseRefPlaceholder:"Defaults to the current branch",createWorktreeBaseRefHint:"You can choose from {localCount} local branches, {remoteCount} remote branches, and {tagCount} tags, or enter a commit hash manually.",createWorktreeBaseRefLoading:"Loading branches and tags from the current repository...",createWorktreeBaseRefLoadFailed:"Failed to load branches and tags. You can still enter a branch, tag, or commit hash manually.",createWorktreeBaseRefLocalGroup:"Local Branches",createWorktreeBaseRefRemoteGroup:"Remote Branches",createWorktreeBaseRefTagGroup:"Tags",createWorktreeBaseRefCurrentBadge:"Current",createWorktreeBaseRefRecommendedBadge:"Recommended",createWorktreeBaseRefEmpty:"No matches found. You can still enter a branch, tag, or commit hash manually.",createWorktreeBaseRefToggle:"Show available branches and tags",createWorktreeHelpAction:"How to Fill This",createWorktreeHelpTitle:"What These Fields Mean",createWorktreeHelpBranchTitle:"Branch Name",createWorktreeHelpBranchBody:"This is the name of the new child workspace. It is also what you will see in the list later. A short name like feat/login is usually enough.",createWorktreeHelpDisplayNameTitle:"Display Name",createWorktreeHelpDisplayNameBody:"Use this if you want a clearer name in the list. If you leave it empty, the branch name will be used automatically.",createWorktreeHelpBaseRefTitle:"Create From Branch/Commit",createWorktreeHelpBaseRefBody:"This decides where the new child workspace starts from. Most of the time, you can keep the default. Only change it if you want to start from another branch, tag, or specific commit.",createWorktreeSubmit:"Create Child Workspace",createWorktreeSubmitting:"Creating...",createWorktreeSucceeded:"Child workspace created: {name}",createWorktreeFailed:"Failed to create child workspace",providerClaudeCode:"Claude Code",providerLegnaCode:"Legna Code",providerCodexDescription:"Create a Codex session for the current default workflow.",providerClaudeDescription:"Create a Claude Code session when you want to switch to another conversation chain.",providerLegnaDescription:"Create a Legna Code session that reuses the Claude-compatible runtime with an independent session store.",providerOpenCodeDescription:"Create an OpenCode session to continue context via the OpenCode service.",providerGeminiDescription:"Create a Gemini session for the native Gemini CLI workflow.",providerKimiDescription:"Create a Kimi session for the native Kimi CLI workflow.",createSessionPresetLabel:"Session Config",createSessionPresetHint:"The default follows the current global preset. Session-level presets are only available for Codex, Claude Code, and Gemini.",createSessionPresetDefault:"Use current default preset",createSessionPresetLoading:"Loading cc-switch presets...",createSessionPresetUnavailable:"cc-switch presets are unavailable right now. You can still start with the default config.",createSessionStartAction:"Open Draft Session",providerChecking:"Checking...",startClaude:"Claude",startCodex:"Codex",startingSession:"Creating...",startClaudeSuccess:"Claude session created",startCodexSuccess:"Codex session created",startSessionFailed:"Failed to create session",auxiliaryTitle:"Info",auxiliarySubtitle:"Files and Git status",expandAuxiliary:"Expand",collapseAuxiliary:"Collapse",auxiliaryEmptyTitle:"Select a session",auxiliaryEmptyBody:"Session files and Git info will appear here",batchSelectSessions:"Select Sessions in Bulk",batchSelectionMode:"Batch Selection",selectAllSessions:"Select All",clearSelectedSessions:"Clear Selection",batchArchiveAction:"Archive Selected",batchArchiving:"Archiving...",batchArchiveSuccess:"Selected sessions archived",batchArchivePartialFailed:"Some sessions failed to archive. Retry.",batchArchiveFailed:"Batch archive failed",batchDeleteAction:"Delete Selected",batchDeleting:"Deleting...",batchDeleteSuccess:"Selected sessions deleted",batchDeletePartialFailed:"Some sessions failed to delete. Retry.",batchDeleteFailed:"Batch delete failed",batchDeleteConfirmTitle:"Delete Selected Sessions",batchDeleteConfirmDescription:"The selected {count} sessions will be removed from the assistant history and workspace list, and the underlying records will be deleted permanently.",batchDeleteSelectionSummary:"{count} sessions selected",hideSessionSidebar:"Hide Session List",showSessionSidebar:"Show Session List",hideInfoSidebar:"Hide Info Sidebar",showInfoSidebar:"Show Info Sidebar",centerTabsLabel:"Center Area Tabs",infoTabsLabel:"Info Sidebar Tabs",leftResizerLabel:"Resize Left Sidebar",rightResizerLabel:"Resize Right Sidebar",filesPanelEmpty:"Import or select a workspace first to use file management.",gitPanelEmpty:"Import or select a workspace first to view Git info.",infoPanelDeferred:"The left session list loads first. The right auxiliary panel mounts slightly later."},workbench:{emptyEyebrow:"Start",emptyTitle:"Choose a session first",emptyBody:"Continue from the left, or create a new session.",emptyResumeTitle:"Continue",emptyResumeBody:"Go back to where you stopped.",emptyNewTitle:"New session",emptyNewBody:"Put a new question into a clean session.",emptyCompanionTitle:"Side details",emptyCompanionBody:"Open files, Git, or terminal on the right when needed.",emptyTip:"When you are ready, pick a session from the left."},conversation:{resendButton:"Resend",historyLoading:"Loading...",historyLoadingOlder:"Loading older messages...",historyLoadFailed:"Load failed",inheritedContextLoading:"Preparing inherited context from the parent session...",inheritedContextMessageLabel:"Inherited context before the forked message",inheritedContextSessionLabel:"Inherited context from the parent session",inheritedContextSummary:'Collapsed {count} inherited messages from "{parentTitle}" by default.',actionInheritedSelectionSummary:'Collapsed the selected text from "{parentTitle}" by default.',inheritedContextExpand:"Show inherited context",inheritedContextCollapse:"Hide inherited context",inheritedContextParentFallback:"Parent session",timelineEmpty:"Start Conversation",composerPlaceholder:"State the next step clearly. Let the session continue from there.",sendButton:"Send Message",attachFiles:"Attach File",attachmentSourceSheetTitle:"Add Files",attachmentSourceSheetDescription:"Choose one or more files from the system picker, or capture a photo.",attachmentTakePhoto:"Take Photo",attachmentTakePhotoHint:"Open the camera and attach a new photo",attachmentChooseFromLibrary:"Choose Files",attachmentChooseFromLibraryHint:"Open the system file picker and add one or more files",pasteImagesHint:"Supports pasting files directly",attachmentImageOnly:"Only image attachments are supported right now",attachmentReadFailed:"Failed to read attachment. Retry.",attachmentPreviewAlt:"Selected image preview",attachmentPreviewOpen:"Open attachment",attachmentPreviewClose:"Close preview",attachmentPreviewLoading:"Loading attachment...",attachmentPreviewUnavailable:"Attachment unavailable",attachmentDownload:"Download attachment",attachmentDropHint:"Drop files here to attach them",imageAttachmentLabel:"Image Attachment",fileAttachmentLabel:"File Attachment",imagePreviewTitle:"Image Preview",imagePreviewHint:"Click the backdrop or press Esc to close the preview",removeAttachment:"Remove Attachment",selectionTodoAction:"Todo",selectionActionButton:"Action",selectionActionSubmit:"Open action child session",selectionActionPromptLabel:"What should it do",selectionActionPromptPlaceholder:"For example: explain this, turn it into notes, or send it to a specific API",selectionActionIncludeContext:"Include current context",selectionActionContextUnavailable:"This selection spans multiple messages, so context inheritance is disabled for safety.",selectionActionDefaultPrompt:"Please process this content.",selectionActionPreviewLabel:"Selected content",selectionActionTargetLabel:"New session settings",selectionActionQuotedLabel:"Selected text",selectionActionFailed:"Failed to create the action child session.",actionSessionBadge:"Action",modelSelectorLabel:"Model",modelUseCliDefault:"Default",deploymentDefaultPreset:"Default",deploymentConfigColumn:"Config",deploymentModelColumn:"Model",deploymentLoading:"Loading deployments...",deploymentModelLoading:"Loading models...",deploymentModelEmpty:"No models are available for this config yet.",modelUseCodexConfig:"Follow current Codex config",modelUseOpenCodeConfig:"Follow current OpenCode config",reasoningSelectorLabel:"Reasoning Effort",reasoningLow:"Low",reasoningMedium:"Medium",reasoningHigh:"High",reasoningMaximum:"Maximum",slashMenu:"Commands",slashMenuTitle:"Quick Commands",slashCommandPlan:"Ask for an execution plan first",slashCommandReview:"Switch directly to code review mode",slashCommandExplain:"Ask for a clearer explanation",toolInputLabel:"Input",toolResultLabel:"Result",toolResultEmpty:"No output yet",toolPreviewCommand:"Command",toolPreviewTerminal:"Terminal",toolStatusRunning:"Running",toolStatusFailed:"Failed",toolStatusCompleted:"Completed",runtimeThinkingPlaceholder:"{provider} is thinking...",applyPatchEditedLabel:"Edited",applyPatchAddedLabel:"Added",applyPatchDeletedLabel:"Deleted",applyPatchDialogTitle:"Patch Change Preview",applyPatchDialogDescription:"This shows the file-level changes that apply_patch is about to perform.",applyPatchOpenDiff:"View Diff",applyPatchEditedStat:"Edited",applyPatchAddedStat:"Added",applyPatchRemovedStat:"Removed",applyPatchEmpty:"This patch does not contain any file change that can be displayed right now.",titleFallback:"Continue Conversation",draftTitleCodex:"New Codex session",draftTitleClaude:"New Claude Code session",draftTitleLegna:"New LegnaCode session",draftTitleOpenCode:"New OpenCode session",draftTitleGemini:"New Gemini session",draftTitleKimi:"New Kimi session",headerWorkspace:"Workspace",headerWorkspaceUnknown:"Unknown Workspace",headerProvider:"Provider",headerConnection:"Connection",headerRuntime:"Runtime",providerCodex:"Codex",branchTreeAction:"Branch Tree",branchTreeTitle:"Branch Tree",branchTreeDescription:"This panel only shows the parent-child chain around the current session.",branchTreeUpstreamLabel:"Upstream Chain",branchTreeCurrentLabel:"Current Session",branchTreeChildrenLabel:"Child Branches",branchTreeCurrentBadge:"Current",branchTreeArchivedBadge:"Archived",branchTreeEmpty:"This session does not have any child branches yet.",branchTreeMapTitle:"Branch Map",branchTreeMapDescription:"This view expands the full branch family around the current session.",branchTreePreviewTitle:"Session Preview",branchTreePreviewDescription:"Click a node to float its latest messages before switching.",branchTreePreviewLoading:"Loading recent messages for this session...",branchTreePreviewFailed:"Failed to load the session preview.",branchTreePreviewEmpty:"There are no recent messages to preview for this session.",branchTreeResizeHandle:"Resize branch tree width",branchTreeZoomInAction:"Zoom in branch map",branchTreeZoomOutAction:"Zoom out branch map",branchTreeZoomResetAction:"Reset branch map zoom",branchTreeSwitchAction:"Switch to This Session",branchTreeCurrentAction:"Already Current",branchTreeToolMessageFallback:"tool message",branchTreeMessageEmpty:"This message does not have visible text.",moreSessionActions:"More session actions",branchAction:"Branch",moreSessionActionsTitle:"More Session Actions",moreSessionActionsDescription:"Branch navigation and assistant actions live here so the mobile header stays clean.",branchTreeTab:"Branch Tree",aiAssistantTab:"Assistant",aiAssistantTabDescription:"Use the assistant entry here when you want to continue follow-up or start verification for this session.",providerClaude:"Claude",providerLegna:"Legna",providerOpenCode:"OpenCode",providerGemini:"Gemini",providerKimi:"Kimi",capabilitySend:"Send Enabled",queueTitle:"Queued Messages",queueDescription:"After the current run finishes, these messages will be processed automatically in order.",queueOrderPrefix:"Queue Position",queueStatusQueued:"Queued",queueStatusFailed:"Dispatch Failed",queueDelete:"Delete",queueDeleting:"Deleting",permissionRequestSectionTitle:"Pending approvals",permissionRequestSectionDescription:"Provider-side approvals are unified here so you do not need to learn three different dialogs.",permissionRequestToastTitle:"Approval needed",backgroundPermissionToastDescription:"{title} · {requestTitle}",backgroundCompletionToastTitle:"Session completed",backgroundCompletionToastDescription:"{title}",backgroundFailureToastTitle:"Session failed",backgroundFailureToastDescription:"{title} · {detail}",permissionRequestReplyFailed:"Failed to reply to the approval request.",permissionRequestSubmitting:"Submitting...",permissionRequestReasonLabel:"Reason",permissionRequestCommandLabel:"Command",permissionRequestToolLabel:"Tool",permissionRequestCwdLabel:"Working directory",permissionRequestPathsLabel:"Related paths",permissionRequestPermissionsLabel:"Requested permissions",permissionRequestReadLabel:"Read",permissionRequestWriteLabel:"Write",permissionRequestNetworkLabel:"Network",permissionRequestQuestionsLabel:"Questions",permissionRequestDetailLabel:"Details",permissionRequestEmpty:"None",permissionRequestUnknown:"Unknown",permissionRequestKindCommand:"Command",permissionRequestKindFileChange:"File Change",permissionRequestKindPermissions:"Permissions",permissionRequestKindUserInput:"User Input",permissionRequestKindToolCall:"Tool Call",queueImageOnly:"Image attachments only",sendGuidanceButton:"Add Guidance",queueGuidanceButton:"Queue Guidance",capabilityDenied:"Restricted",capabilitySendDisabled:"Sending disabled",connectionConnected:"Realtime connected",connectionReconnecting:"Reconnecting",connectionReconnectFailed:"Reconnect failed",connectionClosed:"Connection closed",runtimeIdle:"Idle",runtimeStarting:"Starting",runtimeRunning:"Running",runtimeReconnecting:"Recovering",runtimeStale:"Awaiting confirmation",runtimeUnknown:"Status pending",runtimeCompleted:"Completed",runtimeInterrupted:"Interrupted",runtimeFailed:"Failed",rulesMessageTitle:"Rules",rulesMessageHint:"This is the startup rule block for the session. It is collapsed by default and can be expanded when needed.",rulesMessageExpand:"Expand Rules",rulesMessageCollapse:"Collapse Rules",skillContextTitle:"Assistant Skill",skillContextHint:"This is the Skill context injected at Claude Code session startup. It is collapsed by default and can be expanded when needed.",skillContextExpand:"Expand Skill",skillContextCollapse:"Collapse Skill",systemPromptTitle:"System Prompt",systemPromptHint:"This is the Kimi startup system prompt for the session. It is collapsed by default and can be expanded when needed.",systemPromptExpand:"Expand Prompt",systemPromptCollapse:"Collapse Prompt",taskProgressButton:"Task Progress ({count})",taskProgressModalTitle:"Task Progress",taskProgressModalDescription:"This session has recorded {count} tasks. Check the latest progress here.",taskProgressExplanationTitle:"Latest Update Note",taskProgressSummaryTotal:"Total",taskProgressStatusPending:"Pending",taskProgressStatusInProgress:"In Progress",taskProgressStatusCompleted:"Completed",taskProgressStatusFailed:"Failed",taskProgressStatusCancelled:"Cancelled",taskCardPlanTitle:"Plan Update",taskCardTodoTitle:"Task Update",taskCardPlanUpdated:"Latest Plan",taskCardTodoUpdated:"Latest Task List",taskCardRawExpand:"Show Raw Call",taskCardRawCollapse:"Hide Raw Call",taskCardSummaryTotal:"{count} total",taskCardSummaryInProgress:"{count} in progress",taskCardSummaryPending:"{count} pending",taskCardSummaryCompleted:"{count} completed",taskCardSummaryFailed:"{count} failed",butlerActionButton:"Assistant",butlerActionModalTitle:"Butler Actions",butlerActionModalDescription:"Ask Butler to continue this development session or start a development verification run.",butlerActionLoading:"Loading Butler action context...",butlerActionLoadFailed:"Failed to load Butler action context",butlerActionProjectLabel:"Project",butlerActionSessionLabel:"Session",butlerFollowUpAction:"Continue Follow-up",butlerFollowUpActionDescription:"Let Butler keep watching this session and continue pushing it after each stop or blocker.",butlerFollowUpProviderLabel:"Follow-up Assistant",butlerFollowUpProviderHint:"Choose which CLI-backed assistant should own this follow-up session. Later rounds reuse the same visible assistant session.",butlerFollowUpObjectiveLabel:"Follow-up Goal",butlerFollowUpObjectivePlaceholder:"Example: finish this feature for me; if the spec still has unfinished work, keep going.",butlerFollowUpCompletionCriteriaLabel:"Finish Conditions",butlerFollowUpCompletionCriteriaPlaceholder:"Example: only stop once the current feature is finished against the agreed requirements.",butlerFollowUpCompletionCriteriaRequired:"Choose or write an explicit stop condition first so Butler knows exactly when to stop",butlerCompletionTemplateSectionLabel:"Stop Templates",butlerCompletionTemplateSectionHint:"Pick one explicit template. It replaces the stop condition and must still stop when the round limit is reached.",butlerCompletionTemplateRecommendedLabel:"Standard Finish",butlerCompletionTemplateRecommendedDescription:"Stop after the feature is done and verified",butlerCompletionTemplateRecommendedValue:"Stop only when the current feature is complete for this request, one development verification or manual confirmation has finished, and there is no blocking item that must still be pushed forward; if the next step recommended by AI is not required for the core goal, it must also stop; once the auto-continue round limit is reached, it must also stop and must not keep extending the session.",butlerCompletionTemplateSpecLabel:"Spec Wrap-up",butlerCompletionTemplateSpecDescription:"Finish the must-do items in the current spec",butlerCompletionTemplateSpecValue:"Stop only when the must-do tasks in the current spec are complete, the related code, docs, and required verification are all in place, and there is no blocking item that still must be pushed forward; if the next step recommended by AI is not required for the core goal, it must also stop; do not expand into new scope; once the auto-continue round limit is reached, it must also stop.",butlerCompletionTemplateBugfixLabel:"Bug Fix",butlerCompletionTemplateBugfixDescription:"Fix the issue and confirm there is no high-priority regression",butlerCompletionTemplateBugfixValue:"Stop only when this issue has been diagnosed and fixed, the related verification has passed, and there is no new high-priority regression that needs immediate work; if the next step recommended by AI is not required for the core goal, it must also stop; follow-up ideas and optimizations are not valid reasons to keep pushing; once the auto-continue round limit is reached, it must also stop.",butlerFollowUpRoundLimitLabel:"Max Auto Follow-up Rounds",butlerFollowUpRoundLimitHint:"Once the limit is reached, Butler stops auto-resuming so the session does not expand forever.",butlerCurrentFollowUpLabel:"Current Follow-up",butlerCurrentFollowUpProgress:"Auto-continued {current} / {max} rounds",butlerFollowUpStopping:"Stopping follow-up...",butlerStopFollowUpAction:"Stop Current Follow-up",butlerFollowUpObjectiveRequired:"Please describe the goal you want Butler to keep pushing",butlerCurrentVerificationLabel:"Current Verification",butlerStopVerificationAction:"Stop Current Verification",butlerVerificationAction:"Start Verification",butlerVerificationActionDescription:"Let Butler start a user-facing verification run for the feature behind this session.",butlerFollowUpStarted:"Butler follow-up started",butlerFollowUpStartedDescription:"Butler will continue following the current development session for {projectName}.",butlerFollowUpFailed:"Failed to start Butler follow-up",butlerFollowUpStopped:"Current Butler follow-up stopped",butlerFollowUpStoppedDescription:"Automatic follow-up for the current session has been stopped and will not auto-resume.",butlerFollowUpStopFailed:"Failed to stop Butler follow-up",butlerVerificationStarted:"Development verification started",butlerVerificationStartedDescription:"Butler will start a development verification run for {projectName}.",butlerVerificationFailed:"Failed to start development verification",butlerVerificationStopping:"Stopping verification...",butlerVerificationStopped:"Current development verification stopped",butlerVerificationStoppedDescription:"The current verification has been stopped, and the linked automation has been ended as well.",butlerVerificationStopFailed:"Failed to stop development verification",butlerAnalysisTitle:"Butler Analysis",butlerAnalysisLoadFailed:"Failed to load Butler analysis",butlerAnalysisObjectiveLabel:"Objective",butlerAnalysisStatusLabel:"Decision",butlerAnalysisSummaryLabel:"Latest analysis",butlerAnalysisWaitingReasonLabel:"Waiting reason",butlerAnalysisEmpty:"There is no Butler analysis record yet.",butlerProxyMessageBadge:"Sent by Butler",butlerOriginDetailTitle:"Related Butler Follow-up",butlerOriginDetailLoading:"Loading the related Butler follow-up...",butlerOriginDetailLoadFailed:"Failed to load the related Butler follow-up",butlerOriginDetailObjectiveLabel:"Objective",butlerOriginDetailStatusLabel:"Status",butlerOriginDetailSummaryLabel:"Latest analysis",butlerOriginDetailWaitingReasonLabel:"Waiting reason",assistantCapabilityBadgeSession:"Assistant Session",assistantCapabilityBadgeAutomation:"Assistant Automation",assistantCapabilityBadgeTerminal:"Assistant Terminal",assistantCapabilityBadgeWorkspace:"Assistant Workspace",assistantCapabilityBadgeDebug:"Assistant Debug",assistantCapabilityBadgeQuery:"Assistant Query",assistantCapabilityProjectSessionStartTitle:"Create Session",assistantCapabilitySessionSendTitle:"Send Message",assistantCapabilitySessionForkTitle:"Fork Session",assistantCapabilityTimerCreateTitle:"Create Automation",assistantCapabilityTimerCancelTitle:"Cancel Automation",assistantCapabilityTerminalInputTitle:"Send Terminal Input",assistantCapabilityTerminalCloseTitle:"Close Terminal",assistantCapabilityWorkspaceDirectoryCreateTitle:"Create Directory",assistantCapabilityWorkspaceImportTitle:"Import Workspace",assistantCapabilityWorkspaceCloneTitle:"Clone Workspace",assistantCapabilityWorkspaceNavigationUpdateTitle:"Update Workspace View",assistantCapabilityWorkspaceRemoveTitle:"Remove Workspace",assistantCapabilityWorktreeCreateTitle:"Create Worktree",assistantCapabilityWorktreeMergeTitle:"Merge Worktree",assistantCapabilityWorktreeCleanupTitle:"Clean Up Worktree",assistantCapabilityDebugRunTitle:"Start Debug Run",assistantCapabilitySessionReadTitle:"Read Session Info",assistantCapabilityAutomationReadTitle:"Read Automation Info",assistantCapabilityTerminalReadTitle:"Read Terminal Info",assistantCapabilityWorkspaceReadTitle:"Read Workspace Info",assistantCapabilityDebugReadTitle:"Read Debug Info",assistantCapabilityQueryTitle:"Assistant Action",assistantCapabilitySummarySessionStart:"A real session was created with the current assistant settings.",assistantCapabilitySummarySessionSend:"The message was submitted to the target real session.",assistantCapabilitySummarySessionFork:"A new session was forked from the current context.",assistantCapabilitySummaryTimerCreate:"A follow-up automation was created.",assistantCapabilitySummaryTimerCancel:"The pending follow-up automation was cancelled.",assistantCapabilitySummaryTerminalInput:"Input was sent to the target terminal.",assistantCapabilitySummaryTerminalClose:"The target terminal was closed.",assistantCapabilitySummaryWorkspace:"The workspace action has been executed.",assistantCapabilitySummaryWorktree:"The worktree action has been executed.",assistantCapabilitySummaryDebug:"The debug action has been triggered.",assistantCapabilitySummaryRead:"The assistant finished this read operation.",assistantCliSummaryHelp:"The matching assistant help command has been queried.",assistantCliSummaryCommand:"The assistant command has been issued.",assistantCliHelpRootTitle:"View Assistant Help",assistantCliHelpSessionsTitle:"View Session Help",assistantCliHelpSessionActionTitle:"View Session Action Help: {action}",assistantCliHelpTimersTitle:"View Automation Help",assistantCliHelpTerminalsTitle:"View Terminal Help",assistantCliHelpWorkspacesTitle:"View Workspace Help",assistantCliHelpGenericTitle:"View {group} Help",assistantCapabilityRawExpand:"View Raw",assistantCapabilityRawCollapse:"Hide Raw",assistantCapabilityLabelWorkspace:"Workspace",assistantCapabilityLabelSession:"Session",assistantCapabilityLabelTerminal:"Terminal",assistantCapabilityLabelTimer:"Automation",assistantCapabilityLabelProvider:"Provider",assistantCapabilityLabelDueAt:"Time",assistantCapabilityLabelStatus:"Status",assistantCapabilityLabelPath:"Path",assistantCapabilityLabelBranch:"Branch",assistantCapabilityLabelRuntime:"Runtime",assistantCapabilityLabelCount:"Count",assistantCapabilityLabelDebugTarget:"Debug Target",assistantCliLabelScope:"Scope",assistantCliLabelAction:"Action",assistantCliLabelProject:"Project",assistantCliLabelMessage:"Message",assistantCliLabelInput:"Input",assistantCliLabelDelay:"Delay",assistantCliScopeRoot:"Root Command",assistantCapabilityNavigationCollapsed:"Collapsed",assistantCapabilityNavigationExpanded:"Expanded",assistantCapabilityStatusActive:"Active",assistantCapabilityStatusCompleted:"Completed",assistantCapabilityStatusCancelled:"Cancelled",assistantCapabilityStatusFailed:"Failed",thinkingLabel:"Thinking",filePanelWorkspaceTab:"Workspace",filePanelSessionTab:"Session",filePanelSessionViewLabel:"Session File View",filePanelSessionTreeView:"Tree",filePanelSessionListView:"List",filePanelSessionLoading:"Collecting files changed in this session...",filePanelSessionEmpty:"No cacheable changed files have been detected in this session yet.",filePanelSessionNoSession:"Only the workspace is selected right now. Pick a session before viewing session-scoped files.",filePanelSessionStageAll:"Stage All",filePanelSessionStageSuccess:"Changes from this session have been added to the staging area.",filePanelSessionLoadFailed:"Failed to load changed files for this session.",filePanelSessionSummary:"Detected Files",filePanelSessionUnstagedSummary:"Unstaged",filePanelSessionDeleted:"Deleted",filePanelOpenExternalWindow:"Open in New Window",filePanelOpenExternalFailed:"Failed to open the file window externally."},desktopWindow:{invalidWindowId:"The external window is missing a window id.",loadDescriptorFailed:"Failed to load the window descriptor.",unsupportedKind:"Rendering the {kind} window is not supported yet."},git:{recentVersionsTitle:"Recent Versions",stagedChangesTitle:"Staged Changes",expandRecentVersions:"Expand Recent Versions",collapseRecentVersions:"Collapse Recent Versions",stagedLabel:"Staged",workingTreeLabel:"Working Tree",changeTreeHint:"Show current changes by directory hierarchy",discard:"Discard Changes",discardFailed:"Failed to discard changes",operationMenu:"Actions",currentBranch:"Current Branch",resizePanels:"Resize file and recent-version panels",switchBranchTo:"Switch To",undoLastCommit:"Undo Last Commit",undoLastCommitFailed:"Failed to undo last commit",undoLastCommitSuccess:"Last commit undone",historyKindLocal:"Local",historyKindRemote:"Remote",historyKindShared:"Synced",pushNow:"Push",commitNow:"Commit",refreshNow:"Refresh",openExternalWindow:"Open Git in New Window",openExternalFailed:"Failed to open the Git window externally.",stageAll:"Stage All",unstageAll:"Unstage All",discardAll:"Discard All Changes",selectedFiles:"Selected Files",clearSelection:"Clear Selection",selectFile:"Select File",discardConfirm:"Discard these changes? {path}",historyItemMenu:"Commit Actions",copyCommitHash:"Copy Commit Hash",copyCommitHashSuccess:"Commit hash copied.",copyCommitSubject:"Copy Commit Title",copyCommitSubjectSuccess:"Commit title copied."},terminalManager:{workspaceField:"Current Workspace",refresh:"Refresh List",loadFailed:"Failed to load the terminal management panel",shellLoadFailed:"Failed to load the terminal shell list",emptyWorkspaceBody:"There is no available workspace yet.",noCurrentWorkspaceBody:"Select a session first so process management can bind to its workspace.",emptyTerminalBody:"There is no terminal instance in the current workspace yet.",emptyTemplateBody:"There is no quick launch item yet. Save a command or script first.",shellField:"Shell for New Terminal",shellUnavailable:"Unavailable",cwdField:"Startup Directory",cwdLabel:"Directory",cwdPlaceholder:"Defaults to the workspace root when left empty",modeField:"Launch Mode",commandMode:"Command",scriptMode:"Script",quickLaunchDescription:"Save a launch preset here so you can start it in a new terminal with one click later.",desktopPanelDescription:"Keep the default view focused on launch decisions, while paths and command lines stay inside the details layer.",openExternalWindow:"Open in New Window",openExternalFailed:"Failed to open the process management window externally.",runningCountLabel:"Running",portWatchCountLabel:"Watched Ports",terminalCountLabel:"Terminals",templateSectionTitle:"Launch Items",templateSectionDescription:"The right side prioritizes the port status of launch items so you can see whether a service is already in use.",openWorkspaceDebugAction:"Debug Services",openCreateModalAction:"Add Quick Launch Item",createModalTitle:"Add Quick Launch Item",createModalDescription:"Save a command or script here. You can attach a port and then start it with one click while checking whether it is already running.",editAction:"Edit Launch Item",editModalTitle:"Edit Quick Launch Item",editModalDescription:"Update the name, command, directory, and port for this quick launch item.",saveTemplateChangesAction:"Save Changes",templateUpdating:"Saving changes...",templateUpdateSuccess:"Quick launch item updated.",templateUpdateFailed:"Failed to update quick launch item",removeAction:"Remove Launch Item",templateRemoving:"Removing...",removeConfirmTitle:"Remove Quick Launch Item",removeConfirmAction:"Remove Item",removeConfirmTarget:'Remove "{name}"? It will disappear from the quick launch list after removal.',removeRunningConfirmTarget:'"{name}" is still running. Removing it only deletes the launch item configuration and will not stop the active process. Continue?',templateDeleteSuccess:"Quick launch item removed.",templateDeleteFailed:"Failed to remove quick launch item",terminalSectionTitle:"Terminal Instances",terminalSectionDescription:"This area shows terminals currently managed by CodingNS for the workspace.",closeAction:"Close Terminal",closing:"Closing...",closeSuccess:"Terminal close request submitted.",closeFailed:"Failed to close terminal",createTerminalAction:"New Empty Terminal",creatingTerminal:"Creating...",createTerminalSuccess:"New terminal created.",createTerminalFailed:"Failed to create a new terminal",defaultTerminalName:"Workspace Terminal",templateNameField:"Name",templateNamePlaceholder:"Generated automatically when left empty",commandField:"Launch Command",commandPlaceholder:"For example: npm",scriptPathField:"Script Path",scriptPathPlaceholder:"For example: scripts/dev.ps1 or scripts/dev.sh",argsField:"Arguments",argsPlaceholder:"For example: run dev or --watch",portField:"Listening Port",portLabel:"Port",portPlaceholder:"For example: 3000",proxyField:"Reverse Proxy",proxyToggleLabel:"Enable Reverse Proxy",proxyEnabled:"Proxy Enabled",proxyEnabledDescription:"When enabled, the system generates a random URL code and exposes your dev service under /proxy/.",proxyDisabledDescription:"Reverse proxy is disabled",proxyPortRequired:"A listening port is required when reverse proxy is enabled",openProxyUrlAction:"Open Proxy URL",openProxyUrlFailed:"Failed to open proxy URL",invalidPort:"Port must be an integer between 1 and 65535",saveLaunchAction:"Save as Quick Launch",templateSaving:"Saving...",templateSaveSuccess:"Quick launch item saved.",templateSaveFailed:"Failed to save quick launch item",runTemplateAction:"Run in New Terminal",runningTemplate:"Starting...",templateRunSuccess:"Quick launch item sent to a new terminal.",templateRunFailed:"Failed to run quick launch item",showDetailsAction:"Show details",hideDetailsAction:"Hide details",detailsSectionTitle:"Launch item details",commandPreviewLabel:"Launch Command",processIdLabel:"Listener PID",processGroupIdLabel:"Process Group PGID",processCommandLabel:"Listener Command Line",parentProcessIdLabel:"Parent PID",parentProcessCommandLabel:"Parent Command Line",terminationScopeLabel:"Stop Scope",terminationScopeProcess:"Listener only",terminationScopeProcessGroup:"Whole process group",stopProcessAction:"Stop Process",stoppingProcess:"Stopping...",stopProcessSuccess:"The listening process or its process group has been stopped.",stopProcessFailed:"Failed to stop the listening process or process group",defaultCommandName:"New Launch Command",defaultScriptName:"New Launch Script",lastActiveAt:"Last Active",updatedAt:"Updated At",processCommandFallback:"This process did not expose its command line",portUnset:"Port Not Configured",portUnsetDescription:"Without a port, the item can only be started. The system cannot determine automatically whether the service is running.",portOccupied:"Process Started",portAvailable:"Port Available",portAvailableDescription:"There is currently no listening process on the port used by this launch item.",statusRunning:"Running",statusStopped:"Stopped",exitCode:"Exit Code",runningValue:"Running"},theme:{light:"浅色",dark:"深色",skyBlue:"赛博",eyeGreen:"护眼",switchLabel:"Theme"}},Kd={"zh-CN":Fh,"en-US":Ih},$f={butlerInitTitle:"设置助手",butlerInitDescription:"先完成几个基本设置。",butlerInitPreviewTitle:"当前效果",butlerInitPreviewDescription:"",butlerInitBasicsTitle:"基本信息",butlerInitBasicsDescription:"",butlerInitPersonaTitle:"说话方式",butlerInitPersonaDescription:"",butlerInitPreferenceTitle:"默认偏好",butlerInitPreferenceDescription:"",butlerInitRuleLabel:"规则方式",butlerInitPreviewRuleLabel:"管理方式",butlerInitTipAutoWorkspace:"",butlerInitTipProviderSwitch:"",butlerInitTipReportPriority:"",butlerDisplayNameLabel:"助手称呼",butlerDisplayNamePlaceholder:"例如:小助手",butlerDisplayNameHint:"这个名字会显示在助手页面里。",butlerProviderLabel:"助手引擎",butlerAgentsModeLabel:"规则方式",butlerAgentsModeInline:"自动管理",butlerAgentsModeFile:"手动编辑",butlerAgentsModeInlineDescription:"规则由系统自动管理。",butlerAgentsModeFileDescription:"会生成一份可编辑的规则文件。",butlerPersonaToneLabel:"语气",butlerPersonaLanguageLabel:"使用语言",butlerPersonaSummaryStyleLabel:"回答风格",butlerFocusRiskPreferenceLabel:"处理方式",butlerFocusReportPriorityLabel:"优先提醒",butlerToneDirect:"直接",butlerToneSteady:"稳重",butlerToneFriendly:"亲切",butlerLanguageZhCn:"中文",butlerLanguageEnUs:"英文",butlerLanguageBilingual:"中英双语",butlerSummaryBrief:"简洁",butlerSummaryStructured:"清晰",butlerSummaryThorough:"详细",butlerRiskConservative:"保守稳妥",butlerRiskBalanced:"平衡",butlerRiskProactive:"主动提醒",butlerReportPriorityPresetLabel:"优先提醒",butlerSummaryDebounceLabel:"摘要节奏",butlerSettingsTitle:"助手设置",butlerSettingsSaveAction:"保存设置",butlerSettingsSaving:"保存中...",butlerSettingsSaved:"助手设置已保存",butlerSettingsSaveFailed:"保存助手设置失败",butlerInitSubmitting:"保存中...",butlerInitSubmit:"完成设置",butlerInitSuccess:"助手已设置完成",butlerInitFailed:"助手设置失败",butlerInitNameRequired:"请先填写助手名称"},Yf={butlerInitTitle:"Set Up Butler",butlerInitDescription:"Finish a few basic settings first.",butlerInitPreviewTitle:"Preview",butlerInitPreviewDescription:"",butlerInitBasicsTitle:"Basic Info",butlerInitBasicsDescription:"",butlerInitPersonaTitle:"Voice",butlerInitPersonaDescription:"",butlerInitPreferenceTitle:"Default Preferences",butlerInitPreferenceDescription:"",butlerInitRuleLabel:"Rule Style",butlerInitPreviewRuleLabel:"Mode",butlerInitTipAutoWorkspace:"",butlerInitTipProviderSwitch:"",butlerInitTipReportPriority:"",butlerDisplayNameLabel:"Butler Name",butlerDisplayNamePlaceholder:"Example: Butler",butlerDisplayNameHint:"This name appears on the Butler page.",butlerProviderLabel:"Engine",butlerAgentsModeLabel:"Rule Style",butlerAgentsModeInline:"Auto",butlerAgentsModeFile:"Editable File",butlerAgentsModeInlineDescription:"Rules are managed automatically.",butlerAgentsModeFileDescription:"An editable rule file will be created.",butlerPersonaToneLabel:"Tone",butlerPersonaLanguageLabel:"Language",butlerPersonaSummaryStyleLabel:"Reply Style",butlerFocusRiskPreferenceLabel:"Work Style",butlerFocusReportPriorityLabel:"Priority",butlerToneDirect:"Direct",butlerToneSteady:"Steady",butlerToneFriendly:"Friendly",butlerLanguageZhCn:"Chinese",butlerLanguageEnUs:"English",butlerLanguageBilingual:"Bilingual",butlerSummaryBrief:"Brief",butlerSummaryStructured:"Clear",butlerSummaryThorough:"Detailed",butlerRiskConservative:"Conservative",butlerRiskBalanced:"Balanced",butlerRiskProactive:"Proactive",butlerReportPriorityPresetLabel:"Priority",butlerSummaryDebounceLabel:"Summary Cadence",butlerSettingsTitle:"Butler Settings",butlerSettingsSaveAction:"Save Settings",butlerSettingsSaving:"Saving...",butlerSettingsSaved:"Butler settings saved",butlerSettingsSaveFailed:"Failed to save Butler settings",butlerInitSubmitting:"Saving...",butlerInitSubmit:"Finish Setup",butlerInitSuccess:"Butler is ready",butlerInitFailed:"Failed to save Butler settings",butlerInitNameRequired:"Please enter a Butler name"};function td(o,i){const a=o.shell;return{...o,shell:{...a&&typeof a=="object"?a:{},...i}}}const Qd={"zh-CN":td(Kf,$f),"en-US":td(Qf,Yf)};function So(o,i){const a=o.split(".");let c=i;for(const d of a){if(!c||typeof c=="string")return o;const p=c[d];if(p==null)return o;c=p}return typeof c=="string"?c:o}function Zf(){return er.getState().profile.language??"zh-CN"}function nd(o,i){const c=Zf()==="en-US"?["en-US","zh-CN"]:["zh-CN"];for(const d of c){const p=So(o,Qd[d]);if(p!==o)return Cl(p,i);const w=So(o,Kd[d]);if(w!==o)return Cl(w,i)}return Cl(o,i)}function Cl(o,i){return i?o.replace(/\{([^}]+)\}/g,(a,c)=>{const d=i[c];return d==null?a:String(d)}):o}function ny({children:o,language:i}){return Ne.useEffect(()=>{document.documentElement.setAttribute("lang",i)},[i]),o}function ry(){const o=Gf(i=>i.profile.language);return i=>{const a=o==="en-US"?["en-US","zh-CN"]:["zh-CN"];for(const c of a){const d=So(i,Qd[c]);if(d!==i)return d;const p=So(i,Kd[c]);if(p!==i)return p}return i}}function Jf(o){return o.endsWith("/")?o:`${o}/`}function Xf(o){return o.replace(/^\/+/,"")}function jl(){const o=J.getState();return Nh(o)??Ed(o.platform)}function zl(o,i=jl()){return new URL(Xf(o),Jf(i)).toString()}function iy(o,i=jl()){const a=new URL(zl(o,i));return a.protocol=a.protocol==="https:"?"wss:":"ws:",a.toString()}const rd="codingns.auth.client-instance-id",eg="x-codingns-client-type",tg="x-codingns-client-instance-id";let on=null;function ng(){return{[eg]:rg(),[tg]:ig()}}function rg(){const o=Ul();switch(o){case"desktop":case"ios":case"android":return o;default:return"web"}}function ig(){var a;if(on)return on;if(!og())return on=id(),on;const o=(a=window.localStorage.getItem(rd))==null?void 0:a.trim();if(o)return on=o,on;const i=id();return window.localStorage.setItem(rd,i),on=i,on}function id(){var o;return typeof((o=globalThis.crypto)==null?void 0:o.randomUUID)=="function"?globalThis.crypto.randomUUID():`client-${Math.random().toString(36).slice(2)}-${Date.now().toString(36)}`}function og(){return typeof window<"u"&&typeof window.localStorage<"u"}const Ll="codingns.auth_expired_at";function ag(){sessionStorage.setItem(Ll,String(Date.now()))}function oy(){const o=sessionStorage.getItem(Ll);return o?(sessionStorage.removeItem(Ll),Date.now()-Number(o)<5e3):!1}async function lg(o){var c,d;const i=new Date().toISOString(),a=zl(`/api/client/runtime-config?platform=${encodeURIComponent(o.platform)}`,o.baseUrl);try{const p=await fetch(a,{method:"GET",headers:{Authorization:`Bearer ${o.accessToken}`}}),w=await sg(p);if(!p.ok){const B=jr(w==null?void 0:w.error_code),V=jr(w==null?void 0:w.detail)??`HTTP ${p.status}`;return p.status===401||p.status===403?{status:"unauthorized",checkedAt:i,errorCode:B??"UNAUTHORIZED",errorDetail:V,responseHostBaseUrl:null,responseBindingId:null,responseHostFingerprint:null}:{status:"mismatch",checkedAt:i,errorCode:B??"HTTP_ERROR",errorDetail:V,responseHostBaseUrl:null,responseBindingId:null,responseHostFingerprint:null}}const v=w,R=jr((c=v==null?void 0:v.relayTunnel)==null?void 0:c.bindingId),U=jr((d=v==null?void 0:v.relayTunnel)==null?void 0:d.hostFingerprint),M=jr(v==null?void 0:v.hostBaseUrl);return R&&U&&R===o.expectedBindingId&&U===o.expectedHostFingerprint?{status:"verified",checkedAt:i,errorCode:null,errorDetail:null,responseHostBaseUrl:M,responseBindingId:R,responseHostFingerprint:U}:{status:"mismatch",checkedAt:i,errorCode:"HOST_IDENTITY_MISMATCH",errorDetail:"候选入口返回的 Host 身份与当前激活 Host 不一致",responseHostBaseUrl:M,responseBindingId:R,responseHostFingerprint:U}}catch(p){return{status:"unreachable",checkedAt:i,errorCode:"NETWORK_ERROR",errorDetail:p instanceof Error?p.message:"未知网络错误",responseHostBaseUrl:null,responseBindingId:null,responseHostFingerprint:null}}}async function sg(o){const i=await o.text();if(!i.trim())return null;try{return JSON.parse(i)}catch{return null}}function jr(o){return typeof o=="string"&&o.trim()?o.trim():null}class cg{constructor(){L(this,"state",{epoch:0,activeHostId:mo(J.getState()),connectionSignature:od(J.getState()),candidateProbeSignature:null,candidateProbePhase:"idle",candidateProbeStartedAt:null,candidateProbeFinishedAt:null,candidateEndpoints:[],preferredCandidateEndpointId:null,preferredDirectCandidateEndpointId:null});L(this,"listeners",new Set);L(this,"probeRunId",0);L(this,"subscribe",i=>(this.listeners.add(i),()=>{this.listeners.delete(i)}));L(this,"getState",()=>this.state);J.subscribe(()=>{this.handleDependencyChange()}),Ke.subscribe(()=>{this.handleDependencyChange()}),this.handleDependencyChange()}handleDependencyChange(){var R;const i=J.getState(),a=mo(i),c=od(i),d=ug(i,((R=Ke.getState().session)==null?void 0:R.accessToken)??null),p=(d==null?void 0:d.signature)??null;let w=!1,v=this.state;if((a!==this.state.activeHostId||c!==this.state.connectionSignature)&&(v={...v,epoch:this.state.epoch+1,activeHostId:a,connectionSignature:c},w=!0),p!==this.state.candidateProbeSignature)if(this.probeRunId+=1,!d)v={...v,candidateProbeSignature:null,candidateProbePhase:"idle",candidateProbeStartedAt:null,candidateProbeFinishedAt:null,candidateEndpoints:[],preferredCandidateEndpointId:null,preferredDirectCandidateEndpointId:null},w=!0;else{const U=new Date().toISOString();v={...v,candidateProbeSignature:p,candidateProbePhase:"probing",candidateProbeStartedAt:U,candidateProbeFinishedAt:null,candidateEndpoints:d.candidateEndpoints.map(M=>({...M,status:"pending",checkedAt:null,errorCode:null,errorDetail:null,responseHostBaseUrl:null,responseBindingId:null,responseHostFingerprint:null})),preferredCandidateEndpointId:null,preferredDirectCandidateEndpointId:null},w=!0,this.runCandidateProbe(d,this.probeRunId)}w&&(this.state=v,this.emit())}async runCandidateProbe(i,a){const c=await Promise.all(i.candidateEndpoints.map(async d=>{const p=await lg({baseUrl:d.url,accessToken:i.accessToken,platform:i.platform,expectedBindingId:i.expectedBindingId,expectedHostFingerprint:i.expectedHostFingerprint});return{...d,status:p.status,checkedAt:p.checkedAt,errorCode:p.errorCode,errorDetail:p.errorDetail,responseHostBaseUrl:p.responseHostBaseUrl,responseBindingId:p.responseBindingId,responseHostFingerprint:p.responseHostFingerprint}}));a===this.probeRunId&&(this.state={...this.state,candidateProbePhase:"ready",candidateProbeFinishedAt:new Date().toISOString(),candidateEndpoints:c,preferredCandidateEndpointId:pg(c),preferredDirectCandidateEndpointId:mg(c)},this.emit())}emit(){for(const i of this.listeners)i()}}const qr=new cg;function ay(){return Ne.useSyncExternalStore(qr.subscribe,()=>{const o=qr.getState();return`${o.activeHostId??"anonymous"}:${o.epoch}`})}function ly(o){return Ne.useSyncExternalStore(qr.subscribe,()=>o(qr.getState()))}function od(o){const i=Cn(o);return i?JSON.stringify({id:i.id,baseUrl:i.baseUrl,relayTunnel:i.relayTunnel}):"no-host"}function ug(o,i){var U,M;const a=Cn(o),c=a==null?void 0:a.relayTunnel,d=(U=c==null?void 0:c.bindingId)==null?void 0:U.trim(),p=(M=c==null?void 0:c.hostFingerprint)==null?void 0:M.trim(),w=(c==null?void 0:c.candidateEndpoints)??[];if(!a||!i||!d||!p||w.length===0)return null;const v=o.platform==="web"?"web":"desktop";if(v==="web")return null;const R=w.filter(B=>dg(B,v));return R.length===0?null:{signature:JSON.stringify({hostId:a.id,platform:v,accessToken:i,bindingId:d,hostFingerprint:p,candidateEndpoints:R.map(B=>({endpointId:B.endpointId,url:B.url,kind:B.kind,priority:B.priority}))}),platform:v,accessToken:i,expectedBindingId:d,expectedHostFingerprint:p,candidateEndpoints:R}}function dg(o,i){return i!=="web"}function pg(o){var i;return((i=o.find(a=>a.status==="verified"))==null?void 0:i.endpointId)??null}function mg(o){var i;return((i=o.find(a=>a.status==="verified"&&a.kind!=="relay"))==null?void 0:i.endpointId)??null}const $d=Be("https://channel.codingns.com:1443");function sy(){return $d}function cy(){return!1}function hg(o){if(!(o!=null&&o.trim()))return null;try{return Be(o)}catch{return null}}function uy(o){return hg(o)??$d}function fg(o){try{const i=Be(o),c=new URL(i).hostname.trim().toLowerCase(),d=c.split(".");if(d.length<4||d[1]!=="channel")return null;const p=new URL(i);return p.hostname=d.slice(1).join("."),p.pathname="",p.search="",p.hash="",{tunnelDomain:c,controlBaseUrl:Be(p.toString()),relayBaseUrl:i}}catch{return null}}class gg{async fetch(i){return fetch(i.url,i.init)}createWebSocket(i){return new WebSocket(i.url,i.protocols)}}const El=new gg;class bg{constructor(i){L(this,"nextStreamId",0);L(this,"pendingHttpRequests",new Map);L(this,"sockets",new Map);L(this,"unsubscribe");this.session=i,this.unsubscribe=i.subscribe(a=>{this.handlePacket(a)})}async fetch(i){const a=this.createStreamId("http"),c={type:"http.request",streamId:a,method:wg(i.init.method),path:ad(i.path,i.url),headers:vg(i.init.headers),bodyBase64Url:await kg(i.init.body)};return await new Promise((d,p)=>{this.pendingHttpRequests.set(a,{resolve:d,reject:p,streamController:null,responseStarted:!1}),this.session.send(c)})}createWebSocket(i){const a=this.createStreamId("ws"),c=new yg({streamId:a,path:ad(i.path,i.url),headers:{},protocols:Sg(i.protocols)},this.session,()=>{this.sockets.delete(a)});return this.sockets.set(a,c),c}close(){var i;this.unsubscribe();for(const a of this.pendingHttpRequests.values()){const c=new Error("隧道会话已经关闭");if(a.responseStarted){(i=a.streamController)==null||i.error(c);continue}a.reject(c)}this.pendingHttpRequests.clear();for(const a of this.sockets.values())a.forceClose(1011,"隧道会话已经关闭");this.sockets.clear()}handlePacket(i){var a,c,d;switch(i.type){case"http.response":this.handleHttpResponse(i);return;case"http.response.start":this.handleHttpResponseStart(i);return;case"http.response.chunk":this.handleHttpResponseChunk(i);return;case"http.response.end":this.handleHttpResponseEnd(i);return;case"ws.opened":(a=this.sockets.get(i.streamId))==null||a.handleOpened(i);return;case"ws.message":(c=this.sockets.get(i.streamId))==null||c.handleMessage(i);return;case"ws.closed":(d=this.sockets.get(i.streamId))==null||d.handleClosed(i);return;case"error":this.handleError(i);return;default:return}}handleHttpResponse(i){const a=this.pendingHttpRequests.get(i.streamId);a&&(this.pendingHttpRequests.delete(i.streamId),a.resolve(new Response(Tg(i.bodyBase64Url),{status:i.status,headers:i.headers})))}handleHttpResponseStart(i){const a=this.pendingHttpRequests.get(i.streamId);if(!a||a.responseStarted)return;if(a.responseStarted=!0,Pg(i.status)){this.pendingHttpRequests.delete(i.streamId),a.resolve(new Response(null,{status:i.status,headers:i.headers}));return}const c=new ReadableStream({start:d=>{a.streamController=d},cancel:()=>{a.streamController=null}});a.resolve(new Response(c,{status:i.status,headers:i.headers}))}handleHttpResponseChunk(i){var d;const a=this.pendingHttpRequests.get(i.streamId);if(!(a!=null&&a.responseStarted))return;const c=Yd(i.bodyChunkBase64Url);(d=a.streamController)==null||d.enqueue(c)}handleHttpResponseEnd(i){var c;const a=this.pendingHttpRequests.get(i.streamId);a&&((c=a.streamController)==null||c.close(),a.streamController=null,this.pendingHttpRequests.delete(i.streamId))}handleError(i){var a,c;if(i.streamId&&this.pendingHttpRequests.has(i.streamId)){const d=this.pendingHttpRequests.get(i.streamId),p=new Error(`${i.errorCode}: ${i.detail}`);this.pendingHttpRequests.delete(i.streamId),d!=null&&d.responseStarted?(a=d.streamController)==null||a.error(p):d==null||d.reject(p);return}i.streamId&&((c=this.sockets.get(i.streamId))==null||c.handleError(i))}createStreamId(i){return this.nextStreamId+=1,`${i}-${this.nextStreamId}`}}class yg extends EventTarget{constructor(a,c,d){super();L(this,"streamId");L(this,"mutableReadyState",0);L(this,"closed",!1);this.options=a,this.session=c,this.onClosed=d,this.streamId=a.streamId,this.open()}get readyState(){return this.mutableReadyState}send(a){if(this.mutableReadyState!==1)throw new Error("当前隧道 WebSocket 尚未打开");const c=Ag(a),d={type:"ws.message",streamId:this.streamId,binary:typeof c!="string",dataBase64Url:Dg(c)};this.session.send(d)}close(a,c){this.closed||(this.closed=!0,this.mutableReadyState=2,this.session.send({type:"ws.closed",streamId:this.streamId,code:a??1e3,reason:c??null}))}handleOpened(a){this.closed||(this.mutableReadyState=1,this.dispatchEvent(new Event("open")))}handleMessage(a){if(this.closed)return;const c=a.binary?Vl(a.dataBase64Url):Rg(a.dataBase64Url);this.dispatchEvent(new MessageEvent("message",{data:c}))}handleClosed(a){this.forceClose(a.code,a.reason??"")}handleError(a){this.closed||(this.dispatchEvent(new ErrorEvent("error",{message:`${a.errorCode}: ${a.detail}`})),this.forceClose(1011,a.detail))}forceClose(a,c){this.mutableReadyState!==3&&(this.closed=!0,this.mutableReadyState=3,this.dispatchEvent(new CloseEvent("close",{code:a,reason:c})),this.onClosed())}open(){const a={type:"ws.open",streamId:this.streamId,path:this.options.path,headers:this.options.headers,protocols:this.options.protocols.length>0?this.options.protocols:void 0};this.session.send(a)}}function Sg(o){if(!o)return[];const i=Array.isArray(o)?o:[o],a=new Set,c=[];for(const d of i){const p=d.trim();!p||a.has(p)||(a.add(p),c.push(p))}return c}function wg(o){return(o==null?void 0:o.trim().toUpperCase())||"GET"}function vg(o){const i=new Headers(o),a={};return i.forEach((c,d)=>{a[d]=c}),a}async function kg(o){if(o==null)return null;const i=await Cg(o);return i.byteLength>0?so(i):null}async function Cg(o){if(typeof o=="string")return Il.encode(o);if(o instanceof URLSearchParams)return Il.encode(o.toString());if(o instanceof ArrayBuffer)return new Uint8Array(o);if(ArrayBuffer.isView(o))return new Uint8Array(o.buffer,o.byteOffset,o.byteLength);if(typeof Blob<"u"&&o instanceof Blob)return new Uint8Array(await o.arrayBuffer());throw new Error("当前隧道 transport 不支持这种请求体类型")}function ad(o,i){const a=new URL(i),c=o.trim();return c?c.includes("?")||!a.search?c:`${c}${a.search}`:`${a.pathname}${a.search}`}function Dg(o){return typeof o=="string"?so(Il.encode(o)):ArrayBuffer.isView(o)?so(new Uint8Array(o.buffer,o.byteOffset,o.byteLength)):so(new Uint8Array(o))}function Vl(o){return o?Yd(o):null}function Tg(o){const i=Vl(o);if(!i)return null;const a=new Uint8Array(i.byteLength);return a.set(i),a.buffer}function Pg(o){return o===101||o===103||o===204||o===205||o===304}function Rg(o){const i=Vl(o);return i?Eg.decode(i):""}function Ag(o){if(Lg(o))throw new Error("当前隧道 WebSocket 暂不支持直接发送 Blob");return o}function Lg(o){return typeof Blob<"u"&&o instanceof Blob}function so(o){let i="";for(let a=0;a<o.length;a+=ld){const c=o.subarray(a,a+ld);i+=String.fromCharCode(...c)}return btoa(i).replace(/\+/g,"-").replace(/\//g,"_").replace(/=+$/g,"")}function Yd(o){const i=o.replace(/-/g,"+").replace(/_/g,"/"),a=i.padEnd(Math.ceil(i.length/4)*4,"="),c=atob(a),d=new Uint8Array(c.length);for(let p=0;p<c.length;p+=1)d[p]=c.charCodeAt(p);return d}const Il=new TextEncoder,Eg=new TextDecoder,ld=32768,Dn=1,ln="x25519-hkdf-sha256-aes-256-gcm",Ig=12,co=16,Fg=32;class He extends Error{constructor(i,a){super(a),this.code=i,this.name="RelayTunnelProtocolError"}}async function Zd(o){const i=ep(o,"PUBLIC KEY"),a=await lt().digest("SHA-256",Ue(i));return`SHA256:${Qg(new Uint8Array(a))}`}async function xg(o){const i=dd(o.expectedHostFingerprint,"expectedHostFingerprint"),a=dd(o.expectedHostPublicKey,"expectedHostPublicKey");if(await Zd(a)!==i)throw new He("RELAY_TUNNEL_HOST_FINGERPRINT_MISMATCH","客户端持有的 Host 公钥和指纹不一致");const d=lt(),p=await d.generateKey(Co,!0,["deriveBits"]),w={version:Dn,cipherSuite:ln,clientEphemeralPublicKey:Xn(new Uint8Array(await d.exportKey("spki",p.publicKey))),clientNonce:Xn(np(16)),expectedHostFingerprint:i};return{pendingHandshake:{expectedHostPublicKey:a,expectedHostFingerprint:i,clientEphemeralPrivateKey:p.privateKey,clientHello:w},clientHello:w}}async function Mg(o){if(Og(o.pendingHandshake.clientHello),_g(o.serverHello),o.serverHello.hostKeyFingerprint!==o.pendingHandshake.expectedHostFingerprint)throw new He("RELAY_TUNNEL_HOST_FINGERPRINT_MISMATCH","服务端返回的 Host 指纹和客户端预期不一致");if(await Zd(o.serverHello.hostPublicKey)!==o.pendingHandshake.expectedHostFingerprint)throw new He("RELAY_TUNNEL_HOST_FINGERPRINT_MISMATCH","服务端返回的 Host 公钥与指纹不一致");if(wo(o.serverHello.hostPublicKey)!==wo(o.pendingHandshake.expectedHostPublicKey))throw new He("RELAY_TUNNEL_HOST_PUBLIC_KEY_MISMATCH","服务端返回的 Host 公钥和客户端持有的公钥不一致");const a=await jg(o.pendingHandshake.clientHello,o.serverHello),c=await Vg(o.pendingHandshake.expectedHostPublicKey),d=await qg(o.serverHello.serverEphemeralPublicKey),p=await ud(o.pendingHandshake.clientEphemeralPrivateKey,c),w=await ud(o.pendingHandshake.clientEphemeralPrivateKey,d),v=tp([p,w]),R=await zg(v,a),U=tr.encode(R),M=tr.encode(o.serverHello.proof);if(!Kg(U,M))throw new He("RELAY_TUNNEL_HANDSHAKE_PROOF_INVALID","服务端握手证明无效");return await Ug({sessionId:o.serverHello.sessionId,peerHostFingerprint:o.serverHello.hostKeyFingerprint,ikm:v,transcriptHash:a})}async function Ng(o,i){const a=lt(),c=o.sendSequence+1,d="client_to_host",p=np(Ig),w=Xd({sessionId:o.sessionId,direction:d,sequence:c}),v=Gg(i),R=new Uint8Array(await a.encrypt({name:"AES-GCM",iv:Ue(p),additionalData:Ue(w),tagLength:co*8},o.sendKey,Ue(v)));return o.sendSequence=c,{version:Dn,cipherSuite:ln,sessionId:o.sessionId,direction:d,sequence:c,iv:Xn(p),authTag:Xn(R.slice(-co)),ciphertext:Xn(R.slice(0,-co))}}async function Hg(o,i){if(Wg(i),i.sessionId!==o.sessionId)throw new He("RELAY_TUNNEL_FRAME_SESSION_MISMATCH","加密帧的会话标识和当前会话不匹配");if(i.direction!=="host_to_client")throw new He("RELAY_TUNNEL_FRAME_DIRECTION_MISMATCH","加密帧方向和当前接收方向不匹配");const a=o.receiveSequence+1,c=Bg(i);if(i.sequence===o.receiveSequence&&o.lastReceivedFrameFingerprint===c)return null;if(i.sequence!==a)throw new He("RELAY_TUNNEL_FRAME_SEQUENCE_MISMATCH",`加密帧序号错误,期望 ${a},实际 ${i.sequence}`);const d=lt(),p=Xd({sessionId:i.sessionId,direction:i.direction,sequence:i.sequence}),w=uo(i.ciphertext),v=uo(i.authTag),R=tp([w,v]);try{const U=new Uint8Array(await d.decrypt({name:"AES-GCM",iv:Ue(uo(i.iv)),additionalData:Ue(p),tagLength:co*8},o.receiveKey,Ue(R)));return o.receiveSequence=i.sequence,o.lastReceivedFrameFingerprint=c,U}catch{throw new He("RELAY_TUNNEL_FRAME_AUTH_INVALID","加密帧完整性校验失败")}}async function Ug(o){const i=await sd(o.ikm,o.transcriptHash,"codingns-relay-client-to-host"),a=await sd(o.ikm,o.transcriptHash,"codingns-relay-host-to-client");return{sessionId:o.sessionId,role:"client",cipherSuite:ln,peerHostFingerprint:o.peerHostFingerprint,sendSequence:0,receiveSequence:0,lastReceivedFrameFingerprint:null,sendKey:await cd(i,"encrypt"),receiveKey:await cd(a,"decrypt")}}function Bg(o){return[o.sessionId,o.direction,String(o.sequence),o.iv,o.authTag,o.ciphertext].join(":")}function Og(o){if(o.version!==Dn||o.cipherSuite!==ln)throw new He("RELAY_TUNNEL_PROTOCOL_UNSUPPORTED","客户端握手协议版本或套件不受支持")}function _g(o){if(o.version!==Dn||o.cipherSuite!==ln)throw new He("RELAY_TUNNEL_PROTOCOL_UNSUPPORTED","服务端握手协议版本或套件不受支持")}function Wg(o){if(o.version!==Dn||o.cipherSuite!==ln)throw new He("RELAY_TUNNEL_PROTOCOL_UNSUPPORTED","加密帧协议版本或套件不受支持")}async function jg(o,i){const a=JSON.stringify({version:Dn,cipherSuite:ln,clientEphemeralPublicKey:o.clientEphemeralPublicKey,clientNonce:o.clientNonce,expectedHostFingerprint:o.expectedHostFingerprint,hostPublicKey:wo(i.hostPublicKey),hostKeyFingerprint:i.hostKeyFingerprint,serverEphemeralPublicKey:i.serverEphemeralPublicKey,serverNonce:i.serverNonce,sessionId:i.sessionId});return new Uint8Array(await lt().digest("SHA-256",tr.encode(a)))}async function zg(o,i){const a=await Jd(o,i,"codingns-relay-handshake-proof"),c=await lt().importKey("raw",Ue(a),Zg,!1,["sign"]),d=new Uint8Array(await lt().sign("HMAC",c,Ue(i)));return Xn(d)}async function sd(o,i,a){return await Jd(o,i,a)}async function Jd(o,i,a){const c=lt(),d=await c.importKey("raw",Ue(o),"HKDF",!1,["deriveBits"]),p=await c.deriveBits({name:"HKDF",hash:"SHA-256",salt:Ue(i),info:Ue(tr.encode(a))},d,Fg*8);return new Uint8Array(p)}async function cd(o,i){return await lt().importKey("raw",Ue(o),Yg,!1,[i])}async function Vg(o){return await lt().importKey("spki",Ue(ep(o,"PUBLIC KEY")),Co,!1,[])}async function qg(o){return await lt().importKey("spki",Ue(uo(o)),Co,!1,[])}async function ud(o,i){const a=await lt().deriveBits({...Co,public:i},o,256);return new Uint8Array(a)}function Xd(o){return tr.encode(JSON.stringify({version:Dn,cipherSuite:ln,sessionId:o.sessionId,direction:o.direction,sequence:o.sequence}))}function Gg(o){return typeof o=="string"?tr.encode(o):o instanceof Uint8Array?o:new Uint8Array(o)}function dd(o,i){const a=o.trim();if(!a)throw new He("RELAY_TUNNEL_PROTOCOL_UNSUPPORTED",`${i} 不能为空`);return a}function wo(o){return o.trim().replace(/\r\n/g,`
42
+ `)}function ep(o,i){const a=wo(o),c=`-----BEGIN ${i}-----`,d=`-----END ${i}-----`;if(!a.includes(c)||!a.includes(d))throw new He("RELAY_TUNNEL_PROTOCOL_UNSUPPORTED",`无效的 ${i} PEM`);const p=a.replace(c,"").replace(d,"").replace(/\s+/g,"");return $g(p)}function Kg(o,i){if(o.length!==i.length)return!1;let a=0;for(let c=0;c<o.length;c+=1)a|=o[c]^i[c];return a===0}function tp(o){const i=o.reduce((d,p)=>d+p.length,0),a=new Uint8Array(i);let c=0;for(const d of o)a.set(d,c),c+=d.length;return a}function np(o){const i=new Uint8Array(o);return op().getRandomValues(i),i}function Qg(o){return rp(o)}function Xn(o){return rp(o).replace(/\+/g,"-").replace(/\//g,"_").replace(/=+$/g,"")}function $g(o){return ip(o)}function uo(o){const i=o.replace(/-/g,"+").replace(/_/g,"/"),a=i.padEnd(Math.ceil(i.length/4)*4,"=");return ip(a)}function rp(o){let i="";for(let a=0;a<o.length;a+=pd)i+=String.fromCharCode(...o.subarray(a,a+pd));return btoa(i)}function ip(o){const i=atob(o),a=new Uint8Array(i.length);for(let c=0;c<i.length;c+=1)a[c]=i.charCodeAt(c);return a}function Ue(o){return Uint8Array.from(o)}function op(){if(typeof globalThis.crypto>"u")throw new He("RELAY_TUNNEL_PROTOCOL_UNSUPPORTED","当前运行环境不支持 Web Crypto");return globalThis.crypto}function lt(){return op().subtle}const tr=new TextEncoder,pd=32768,Co={name:"X25519"},Yg={name:"AES-GCM",length:256},Zg={name:"HMAC",hash:"SHA-256"};function Jg(o){return JSON.stringify(o)}function Xg(o){return JSON.parse(o)}class ap{constructor(i,a){L(this,"listeners",new Set);L(this,"unsubscribeFromChannel");L(this,"closeListeners",new Set);L(this,"unsubscribeFromChannelClose");L(this,"connectPromise",null);L(this,"textEncoder",new TextEncoder);L(this,"textDecoder",new TextDecoder);L(this,"incomingPayloadChain",Promise.resolve());L(this,"outgoingPacketChain",Promise.resolve());L(this,"pendingPackets",[]);L(this,"closedByClient",!1);L(this,"terminationNotified",!1);L(this,"handshakeState",{status:"idle"});this.channel=i,this.options=a,this.unsubscribeFromChannel=i.subscribe(c=>{this.enqueueIncomingPayload(c)}),this.unsubscribeFromChannelClose=i.subscribeClose?i.subscribeClose(c=>{this.handleChannelClosed(c)}):null}async connect(){if(this.handshakeState.status==="ready")return;if(this.connectPromise)return await this.connectPromise;if(this.handshakeState.status==="failed")throw this.handshakeState.error;const{pendingHandshake:i,clientHello:a}=await xg({expectedHostPublicKey:this.options.expectedHostPublicKey,expectedHostFingerprint:this.options.expectedHostFingerprint});return this.connectPromise=new Promise((c,d)=>{this.handshakeState={status:"waiting_server_hello",pendingHandshake:i,resolve:c,reject:d},this.sendControlPayload(JSON.stringify({type:"client_hello",hello:a}))}),await this.connectPromise}send(i){if(this.handshakeState.status==="ready"){this.enqueueOutgoingPacket(i,this.handshakeState.session);return}if(this.handshakeState.status==="failed")throw this.handshakeState.error;if(this.handshakeState.status==="waiting_server_hello"&&this.connectPromise){this.pendingPackets.push(i);return}throw new Error("当前 CodingNS Connect 会话尚未建立完成")}subscribe(i){return this.listeners.add(i),()=>{this.listeners.delete(i)}}subscribeClose(i){return this.closeListeners.add(i),()=>{this.closeListeners.delete(i)}}close(i,a){var c;this.closedByClient=!0,this.unsubscribeFromChannel(),(c=this.unsubscribeFromChannelClose)==null||c.call(this),this.channel.close(i,a)}async handleIncomingPayload(i){this.recordWireBytes("downstream",i);const a=JSON.parse(i);if(a.type==="server_hello"){await this.handleServerHello(a);return}if(a.type==="encrypted_frame"){await this.handleEncryptedFrame(a);return}a.type==="error"&&this.failSession(new Error(`${a.errorCode}: ${a.detail}`))}async handleServerHello(i){if(this.handshakeState.status==="waiting_server_hello")try{const a=await Mg({pendingHandshake:this.handshakeState.pendingHandshake,serverHello:i.hello}),c=this.handshakeState.resolve;this.handshakeState={status:"ready",session:a},this.connectPromise=null,await this.flushPendingPackets(a),c()}catch(a){this.failSession(zr(a))}}async handleEncryptedFrame(i){const a=this.requireReadySession();try{const c=await Hg(a.session,i.frame);if(!c)return;const d=Xg(this.textDecoder.decode(c));for(const p of this.listeners)p(d)}catch(c){this.failSession(zr(c))}}requireReadySession(){if(this.handshakeState.status==="failed")throw this.handshakeState.error;if(this.handshakeState.status!=="ready")throw new Error("当前 CodingNS Connect 会话尚未建立完成");return this.handshakeState}failSession(i){if(this.pendingPackets=[],this.handshakeState.status==="waiting_server_hello"){const a=this.handshakeState.reject;this.handshakeState={status:"failed",error:i},this.connectPromise=null,this.notifyTermination(i),a(i);return}this.handshakeState={status:"failed",error:i},this.connectPromise=null,this.notifyTermination(i)}handleChannelClosed(i){this.closedByClient||this.failSession(i)}sendControlPayload(i){return this.recordWireBytes("upstream",i),this.channel.send(i)}enqueueIncomingPayload(i){this.incomingPayloadChain=this.incomingPayloadChain.catch(()=>{}).then(async()=>{await this.handleIncomingPayload(i)}).catch(a=>{this.failSession(zr(a))})}async flushPendingPackets(i){const a=this.pendingPackets;if(a.length!==0){this.pendingPackets=[];for(const c of a)await this.sendEncryptedPacket(c,i)}}enqueueOutgoingPacket(i,a){this.outgoingPacketChain=this.outgoingPacketChain.catch(()=>{}).then(async()=>{await this.sendEncryptedPacket(i,a)}).catch(c=>{this.failSession(zr(c))})}async sendEncryptedPacket(i,a){try{const c=await Ng(a,Jg(i));await this.sendControlPayload(JSON.stringify({type:"encrypted_frame",frame:c}))}catch(c){const d=zr(c);throw this.failSession(d),d}}recordWireBytes(i,a){var c,d;(d=(c=this.options).onWireBytes)==null||d.call(c,i,this.textEncoder.encode(a).byteLength)}notifyTermination(i){if(!this.terminationNotified){this.terminationNotified=!0;for(const a of this.closeListeners)a(i)}}}function zr(o){return o instanceof Error?o:new Error(String(o))}const lp=3,eb=250;async function tb(o){const i=o.fetchFn??fetch,a=new URL(`/api/v1/tunnels/${encodeURIComponent(lb(o.tunnelDomain))}/connect-init`,dp(o.controlBaseUrl)).toString(),c=await i(a,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({clientContext:sb()})});if(!c.ok)throw await ab(c,"初始化隧道连接失败");return await c.json()}async function nb(o,i={}){const a=await tb({controlBaseUrl:o.controlBaseUrl,tunnelDomain:o.tunnelDomain,fetchFn:i.fetchFn}),c={bindingId:a.bindingId,tunnelDomain:a.tunnelDomain,hostPublicKey:a.hostPublicKey,hostFingerprint:a.hostFingerprint,relayBaseUrl:a.relayBaseUrl,controlBaseUrl:a.controlBaseUrl,status:a.status},d={sessionId:a.sessionId,bindingId:a.bindingId,tunnelDomain:a.tunnelDomain,connectTicket:a.connectTicket,remainingBytes:a.remainingBytes,sessionRateLimitBytesPerSecond:a.sessionRateLimitBytesPerSecond,upstreamConnected:a.upstreamConnected,downstreamConnected:a.downstreamConnected,expiresAt:a.expiresAt},w=(i.createWebSocket??pp)(cp(c.relayBaseUrl,d.sessionId,mp(d)));return await up(w),{binding:c,reservation:d,channel:new sp(w)}}async function rb(o,i={}){const c=(i.createWebSocket??pp)(cp(o.binding.relayBaseUrl,o.reservation.sessionId,mp(o.reservation)));return await up(c),{binding:o.binding,reservation:o.reservation,channel:new sp(c)}}async function ib(o,i={}){let a=null;for(let c=1;c<=lp;c+=1){let d=null;try{d=await nb(o,i);const p=new ap(d.channel,{expectedHostPublicKey:d.binding.hostPublicKey,expectedHostFingerprint:d.binding.hostFingerprint,onWireBytes:o.onWireBytes});return await p.connect(),{...d,clientSession:p}}catch(p){const w=mb(p);if(a=w,d==null||d.channel.close(1011,"relay_client_session_connect_failed"),!db(w,c))throw w;await pb(eb*c)}}throw a??new Error("当前 CodingNS Connect 会话建立失败")}async function ob(o,i={}){const a=await rb({binding:o.binding,reservation:o.reservation},i),c=new ap(a.channel,{expectedHostPublicKey:a.binding.hostPublicKey,expectedHostFingerprint:a.binding.hostFingerprint,onWireBytes:o.onWireBytes});return await c.connect(),{...a,clientSession:c}}class sp{constructor(i){L(this,"terminalError",null);L(this,"closeNotified",!1);L(this,"closeListeners",new Set);L(this,"handleClose",i=>{const a=i;this.terminalError=new Error(`relay-edge 原始链路关闭:${a.code}${a.reason?` ${a.reason}`:""}`),this.notifyClose(this.terminalError)});L(this,"handleError",()=>{this.terminalError||(this.terminalError=new Error("relay-edge 原始链路建立失败")),this.notifyClose(this.terminalError)});this.socket=i,this.socket.addEventListener("close",this.handleClose),this.socket.addEventListener("error",this.handleError)}send(i){if(this.socket.readyState!==1)throw this.terminalError??new Error("当前 relay-edge 原始链路尚未建立完成");this.socket.send(i)}subscribe(i){const a=c=>{const d=c;typeof d.data=="string"&&i(d.data)};return this.socket.addEventListener("message",a),()=>{this.socket.removeEventListener("message",a)}}subscribeClose(i){return this.closeListeners.add(i),()=>{this.closeListeners.delete(i)}}close(i,a){this.socket.removeEventListener("close",this.handleClose),this.socket.removeEventListener("error",this.handleError),this.socket.close(i,a)}notifyClose(i){if(!this.closeNotified){this.closeNotified=!0;for(const a of this.closeListeners)a(i)}}}function cp(o,i,a){const c=ub(o,"ws");return c.searchParams.set("sessionId",i),c.searchParams.set("role","downstream"),c.searchParams.set("connectTicket",a),c.protocol=c.protocol==="https:"||c.protocol==="wss:"?"wss:":"ws:",c.toString()}async function up(o){o.readyState!==1&&await new Promise((i,a)=>{const c=()=>{w(),i()},d=v=>{w();const R=v;a(new Error(`relay-edge 原始链路关闭:${R.code}${R.reason?` ${R.reason}`:""}`))},p=()=>{w(),a(new Error("relay-edge 原始链路建立失败"))},w=()=>{o.removeEventListener("open",c),o.removeEventListener("close",d),o.removeEventListener("error",p)};o.addEventListener("open",c),o.addEventListener("close",d),o.addEventListener("error",p)})}async function ab(o,i){const c=(await o.text()).trim();if(!c)return new Error(`${i}(HTTP ${o.status})`);try{const d=JSON.parse(c);if(typeof d.detail=="string"&&typeof d.errorCode=="string")return new Error(`${d.errorCode}: ${d.detail}`)}catch{}return new Error(`${i}:${c}`)}function lb(o){const i=o.trim().toLowerCase();if(!i)throw new Error("tunnelDomain 不能为空");return i}function dp(o){return o.endsWith("/")?o:`${o}/`}function sb(){const o=J.getState().platform??null,i=typeof navigator>"u"?null:po(navigator.userAgent),a=typeof navigator>"u"?null:po(navigator.platform),c=typeof navigator>"u"?null:po(navigator.language),d=cb();return{runtimePlatform:o,systemPlatform:a,userAgent:i,language:c,timezone:d}}function cb(){try{return po(Intl.DateTimeFormat().resolvedOptions().timeZone)}catch{return null}}function ub(o,i){return new URL(i.replace(/^\/+/,""),dp(o))}function pp(o){return new WebSocket(o)}function mp(o){var a;const i=(a=o.connectTicket)==null?void 0:a.trim();if(!i)throw new Error("当前 CodingNS Connect 会话缺少 connectTicket,不能继续续接");return i}function db(o,i){if(i>=lp)return!1;const a=o.message;return a.includes("relay-edge 原始链路")||a.includes("HOST_NOT_CONNECTED")||a.includes("HOST_UPSTREAM_DISCONNECTED")}async function pb(o){await new Promise(i=>{setTimeout(i,o)})}function po(o){const i=o==null?void 0:o.trim();return i||null}function mb(o){return o instanceof Error?o:new Error(String(o))}const Dl={startedAt:null,updatedAt:null,upstreamBytes:0,downstreamBytes:0,totalBytes:0};class hb{constructor(){L(this,"state",{byHostId:{}});L(this,"listeners",new Set);L(this,"subscribe",i=>(this.listeners.add(i),()=>{this.listeners.delete(i)}));Ke.subscribe(()=>{Ke.getState().session||this.reset()})}getSummary(i){return i?this.state.byHostId[i]??Dl:Dl}recordWireBytes(i,a,c){if(!i||!Number.isFinite(c)||c<=0)return;const d=this.state.byHostId[i]??Dl,p=new Date().toISOString(),w={startedAt:d.startedAt??p,updatedAt:p,upstreamBytes:a==="upstream"?d.upstreamBytes+c:d.upstreamBytes,downstreamBytes:a==="downstream"?d.downstreamBytes+c:d.downstreamBytes,totalBytes:d.totalBytes+c};this.state={byHostId:{...this.state.byHostId,[i]:w}},this.emit()}reset(){Object.keys(this.state.byHostId).length!==0&&(this.state={byHostId:{}},this.emit())}emit(){for(const i of this.listeners)i()}}const Fl=new hb;function md(o,i,a){Fl.recordWireBytes(o,i,a)}function dy(o){return Ne.useSyncExternalStore(Fl.subscribe,()=>Fl.getSummary(o))}class hd{constructor(i,a={}){L(this,"connectPromise",null);L(this,"fallbackTransport",null);L(this,"resumeState",null);this.options=i,this.dependencies=a}async fetch(i){return await(await this.getActiveTransport()).transport.fetch(i)}createWebSocket(i){return new fb(this.getActiveTransport(),i)}close(){const i=this.connectPromise;this.connectPromise=null,this.fallbackTransport=null,this.resumeState=null,i&&i.then(a=>{a.close()}).catch(()=>{})}async getActiveTransport(){return this.fallbackTransport?{transport:this.fallbackTransport,close:()=>{}}:(this.connectPromise||(this.connectPromise=this.createActiveTransport()),await this.connectPromise)}async createActiveTransport(){var d,p;const i=this.dependencies.connectSession??ib,a=this.dependencies.resumeSession??ob,c=this.dependencies.createTransport??(w=>new bg(w));try{const w=await this.connectWithResume(i,a),v=c(w.clientSession);this.resumeState={binding:w.binding,reservation:w.reservation};let R=!1;const U=((p=(d=w.clientSession).subscribeClose)==null?void 0:p.call(d,M=>{var B;R||(R=!0,(B=v.close)==null||B.call(v),this.connectPromise&&(this.connectPromise=null),fd(M)&&(this.resumeState=null))}))??(()=>{});return{transport:v,close:()=>{var M;R=!0,U(),(M=v.close)==null||M.call(v),w.clientSession.close(1e3,"host_transport_closed")}}}catch(w){const v=this.dependencies.fallbackTransport;if(!v)throw w;return this.fallbackTransport=v,this.connectPromise=null,{transport:v,close:()=>{}}}}async connectWithResume(i,a){if(this.resumeState)try{return await a({binding:this.resumeState.binding,reservation:this.resumeState.reservation,onWireBytes:(c,d)=>{md(this.options.hostId,c,d)}})}catch(c){if(fd(c))this.resumeState=null;else throw c}return await i({controlBaseUrl:this.options.controlBaseUrl,tunnelDomain:this.options.tunnelDomain,onWireBytes:(c,d)=>{md(this.options.hostId,c,d)}})}}function fd(o){const i=o instanceof Error?o.message:String(o);return i.includes("SESSION_NOT_FOUND")||i.includes("CONNECT_TICKET_INVALID")||i.includes("SESSION_INSTANCE_MISMATCH")||i.includes("缺少 connectTicket")}class fb extends EventTarget{constructor(a,c){super();L(this,"innerSocket",null);L(this,"mutableReadyState",0);L(this,"closed",!1);a.then(d=>{if(this.closed)return;const p=d.transport.createWebSocket(c);this.innerSocket=p,this.mutableReadyState=p.readyState,p.addEventListener("open",()=>{this.mutableReadyState=1,this.dispatchEvent(new Event("open"))}),p.addEventListener("message",w=>{const v=w;this.dispatchEvent(new MessageEvent("message",{data:v.data}))}),p.addEventListener("error",w=>{const v=w;this.dispatchEvent(new ErrorEvent("error",{message:v.message}))}),p.addEventListener("close",w=>{const v=w;this.mutableReadyState=3,this.closed=!0,this.dispatchEvent(new CloseEvent("close",{code:v.code,reason:v.reason,wasClean:v.wasClean}))})}).catch(d=>{this.closed||(this.mutableReadyState=3,this.closed=!0,this.dispatchEvent(new ErrorEvent("error",{message:d instanceof Error?d.message:String(d)})),this.dispatchEvent(new CloseEvent("close",{code:1011,reason:d instanceof Error?d.message:String(d)})))})}get readyState(){var a;return((a=this.innerSocket)==null?void 0:a.readyState)??this.mutableReadyState}send(a){if(!this.innerSocket)throw new Error("当前 CodingNS Connect WebSocket 尚未建立完成");this.innerSocket.send(a)}close(a,c){if(!this.closed){if(this.closed=!0,this.mutableReadyState=2,this.innerSocket){this.innerSocket.close(a,c);return}this.mutableReadyState=3,this.dispatchEvent(new CloseEvent("close",{code:a??1e3,reason:c??""}))}}}const ao=new Map,gd=new Map,gb=({baseUrl:o})=>{const i=Mh(J.getState(),o),a=i==null?void 0:i.relayTunnel;if(i&&(a!=null&&a.enabled)&&wb(o,i.baseUrl,a)){const d=JSON.stringify({baseUrl:i.baseUrl,relayTunnel:a}),p=ao.get(i.id);if(p&&p.signature===d)return p.transport;p==null||p.transport.close();const w=new hd({hostId:i.id,controlBaseUrl:a.controlBaseUrl,tunnelDomain:a.tunnelDomain},{fallbackTransport:bd(J.getState().platform,i.baseUrl,a.tunnelDomain)});return ao.set(i.id,{signature:d,transport:w}),w}if(i){const d=ao.get(i.id);if(d&&(d.transport.close(),ao.delete(i.id)),(a==null?void 0:a.provider)==="codingns_relay"&&!a.enabled)return El}const c=fg(o);if(c){const d=JSON.stringify({tunnelDomain:c.tunnelDomain,controlBaseUrl:c.controlBaseUrl}),p=gd.get(d);if(p)return p;const w=new hd({hostId:`inferred:${c.tunnelDomain}`,controlBaseUrl:c.controlBaseUrl,tunnelDomain:c.tunnelDomain},{fallbackTransport:bd(J.getState().platform,o,c.tunnelDomain)});return gd.set(d,w),w}return El};let bb=gb;function yb(o){const i=Sb(o);return{baseUrl:i,transport:bb({baseUrl:i})}}function Sb(o){var w;const i=J.getState(),a=Cn(i);if(!a||a.baseUrl!==o||i.platform==="web"&&((w=a.relayTunnel)!=null&&w.enabled))return o;const c=qr.getState();if(c.activeHostId!==a.id||c.candidateProbePhase!=="ready"){const v=kn.get(a.id);return(v==null?void 0:v.baseUrl)??o}const d=c.preferredDirectCandidateEndpointId??c.preferredCandidateEndpointId;if(!d){const v=kn.get(a.id);return(v==null?void 0:v.baseUrl)??o}const p=c.candidateEndpoints.find(v=>v.endpointId===d&&v.status==="verified");return(p==null?void 0:p.url)??o}function wb(o,i,a){var d;const c=(d=a==null?void 0:a.candidateEndpoints)==null?void 0:d.find(p=>p.url===o);if(c)return c.kind==="relay";if(!(a!=null&&a.tunnelDomain))return!1;try{return new URL(o).hostname.toLowerCase()===a.tunnelDomain.trim().toLowerCase()}catch{try{return new URL(i).hostname.toLowerCase()===a.tunnelDomain.trim().toLowerCase()}catch{return!1}}}function bd(o,i,a){if(o!=="web")return El}class vb{async request(i,a={}){const c=await this.performRequest(i,a);if(c.status===204||c.status===205)return;const d=await c.text();if(d)return JSON.parse(d)}async requestBlob(i,a={}){return(await this.performRequest(i,a)).blob()}async performRequest(i,a){var V;const c=new Headers(a.headers),d=a.body!==void 0&&a.body!==null,p=a.baseUrl??jl(),w=yb(p),v=w.baseUrl,R=zl(i,v),U=w.transport,M=a.omitCompatibilityHeaders||kb(p);if(M&&Cb(c),d&&!c.has("Content-Type")&&c.set("Content-Type","application/json"),!M)for(const[X,fe]of Object.entries(ng()))c.has(X)||c.set(X,fe);if(!a.skipAuth){const X=(V=Ke.getState().session)==null?void 0:V.accessToken;if(!X)throw Ke.clear(),new Jn(401,{detail:"当前没有可用的登录态",error_code:"UNAUTHORIZED"});c.set("Authorization",`Bearer ${X}`)}let B;try{B=await U.fetch({path:i,baseUrl:v,url:R,init:{...a,headers:c}})}catch(X){if(!M&&Db(X)){const ne=await this.performRequest(i,{...a,omitCompatibilityHeaders:!0}).catch(()=>null);if(ne)return hp.add(p),ne}const fe=X instanceof Error?X.message:"未知网络错误";throw new Jn(0,{detail:`请求 ${R} 失败:${fe}`,error_code:"NETWORK_ERROR"})}if(!B.ok){const X=await Tb(B);if(fp(B.status,X.error_code)&&!a.skipAuth&&!a.retryAfterRefresh){const fe=await Ke.refresh();if(fe.status==="refreshed")return this.performRequest(i,{...a,retryAfterRefresh:!0});throw fe.status==="invalid"?new Jn(401,{detail:"登录态已经失效,请重新登录",error_code:"UNAUTHORIZED"}):new Jn(0,{detail:"登录态暂时无法恢复,请稍后重试",error_code:"AUTH_REFRESH_UNAVAILABLE"})}throw!a.skipAuth&&Rb(B.status,X.error_code)&&(ag(),Ke.clear()),new Jn(B.status,X)}return B}}const Do=new vb,hp=new Set;function kb(o){return hp.has(o)}function Cb(o){for(const i of Array.from(o.keys()))i.toLowerCase().startsWith("x-codingns-")&&o.delete(i)}function Db(o){if(!(o instanceof Error))return!1;const i=o.message.trim().toLowerCase();return i==="load failed"||i==="failed to fetch"}async function Tb(o){const i=await o.text();if(!i)return yd(o.status);try{const a=JSON.parse(i);if(typeof a.detail=="string"&&typeof a.error_code=="string")return{detail:a.detail,error_code:a.error_code,field:typeof a.field=="string"?a.field:void 0,data:Pb(a.data)?a.data:void 0,timestamp:typeof a.timestamp=="string"?a.timestamp:void 0}}catch{}return yd(o.status,i)}function yd(o,i){return{detail:(i==null?void 0:i.trim())||`请求失败(HTTP ${o})`,error_code:o===401?"UNAUTHORIZED":"HTTP_ERROR"}}function Pb(o){return typeof o=="object"&&o!==null&&!Array.isArray(o)}function fp(o,i){return o!==401?!1:i==="UNAUTHORIZED"||i==="TOKEN_EXPIRED"||i==="TOKEN_INVALID"}function Rb(o,i){return o===403&&i==="BOOTSTRAP_REQUIRED"?!0:fp(o,i)}function gp(o){return Do.request("/api/public/bootstrap-status",{baseUrl:o,skipAuth:!0})}function Ab(o,i){return Do.request("/api/public/setup",{method:"POST",body:JSON.stringify(o),baseUrl:i,skipAuth:!0})}function Lb(o,i){return Do.request("/api/auth/login",{method:"POST",body:JSON.stringify(o),baseUrl:i,skipAuth:!0})}function Eb(o,i){return Do.request("/api/auth/refresh",{method:"POST",body:JSON.stringify(o),baseUrl:i,skipAuth:!0})}const lo=Object.freeze(Object.defineProperty({__proto__:null,getBootstrapStatus:gp,loginRequest:Lb,refreshRequest:Eb,setupRequest:Ab},Symbol.toStringTag,{value:"Module"}));async function bp(o){try{return{...await gp(o),reachable:!0}}catch{return{initialized:!1,reachable:!1}}}const py=Object.freeze(Object.defineProperty({__proto__:null,probeHost:bp},Symbol.toStringTag,{value:"Module"})),Ib=1e4;function yp(){return new Date().toISOString()}function Fb(o){return typeof o!="string"||!o.trim()?null:o.trim().replace(/\\/g,"/").replace(/\/+/g,"/").replace(/\/$/,"")}function xb(o,i){return i?`local-discovered:${o}:${i}`:`local-discovered:${o}`}function Mb(o){try{return new URL(o).host}catch{return o}}function Nb(o,i){return!o.dataDir&&i.dataDir||(o.pid??Number.MAX_SAFE_INTEGER)>(i.pid??Number.MAX_SAFE_INTEGER)?i:o}function Hb(o){const i=new Map;for(const a of o){if(!a.baseUrl)continue;let c;try{c=Be(a.baseUrl)}catch{continue}const d=i.get(c);if(!d){i.set(c,{...a,baseUrl:c});continue}i.set(c,Nb(d,{...a,baseUrl:c}))}return Array.from(i.values())}async function Ub(o){const i=Hb(o),a=yp();return(await Promise.all(i.map(async d=>{const p=d.baseUrl;if(!p||!(await bp(p)).reachable)return null;const v=Fb(d.dataDir),R=xb(p,v);return{id:R,discoveryKey:R,name:Mb(p),baseUrl:p,kind:"local",createdAt:a,updatedAt:a,lastConnectedAt:null,lastUserId:null,lastUsername:null,source:"desktop-process-scan",pid:d.pid??null,executable:d.executable??null,dataDir:v,discoveredAt:a,lastReachableAt:a}}))).filter(d=>d!==null)}function my(o){const i=new Set(o.hosts.map(a=>Be(a.baseUrl)));return o.discoveredHosts.filter(a=>!i.has(Be(a.baseUrl)))}function Bb(o){const i=mo(o);return i?o.hosts.find(a=>a.id===i)??o.discoveredHosts.find(a=>a.id===i)??null:null}class Ob{constructor(){L(this,"inFlight",null)}initialize(){this.refresh()}async refresh(i={}){if(this.inFlight)return this.inFlight;const a=this.performRefresh(i).finally(()=>{this.inFlight===a&&(this.inFlight=null)});return this.inFlight=a,a}setActiveDiscoveredHost(i){const a=J.getState(),c=i&&a.discoveredHosts.some(d=>d.id===i)?i:null;c!==a.activeDiscoveredHostId&&J.updateRuntime({activeDiscoveredHostId:c})}async performRefresh({force:i=!1}){const a=vo(),c=J.getState();if(!a.isDesktop||a.ui.osFamily!=="windows"&&a.ui.osFamily!=="macos"){J.updateRuntime({discoveredHosts:[],activeDiscoveredHostId:null,localHostDiscovery:{status:"unsupported",lastScannedAt:c.localHostDiscovery.lastScannedAt,cooldownUntil:null,errorCode:"PLATFORM_NOT_SUPPORTED",errorDetail:"当前平台不支持本机 HOST 自动发现。"}});return}const d=c.localHostDiscovery.cooldownUntil?Date.parse(c.localHostDiscovery.cooldownUntil):Number.NaN;if(!i&&Number.isFinite(d)&&d>Date.now())return;J.updateRuntime({localHostDiscovery:{...c.localHostDiscovery,status:"refreshing",errorCode:null,errorDetail:null}});const p=await a.bridge.scanLocalHosts(),w=yp(),v=new Date(Date.now()+Ib).toISOString();if(!p.ok){J.updateRuntime({localHostDiscovery:{status:p.errorCode==="PLATFORM_NOT_SUPPORTED"?"unsupported":"failed",lastScannedAt:w,cooldownUntil:v,errorCode:p.errorCode??"LOCAL_HOST_DISCOVERY_FAILED",errorDetail:p.detail??"本机 HOST 扫描失败。"}});return}const R=await Ub(p.value??[]),U=Bb(J.getState()),M=wd(U)&&R.some(B=>B.id===U.id)?U.id:null;J.updateRuntime({discoveredHosts:R,activeDiscoveredHostId:M,localHostDiscovery:{status:"ready",lastScannedAt:w,cooldownUntil:v,errorCode:null,errorDetail:null}})}}const _b=new Ob;async function Wb(){const o=vo();return await J.initialize(),_b.initialize(),qf().catch(()=>{}),{platform:o.platform}}const jb=Ne.lazy(async()=>({default:(await Ut(()=>import("./App-B9HcTkMT.js").then(i=>i.A),__vite__mapDeps([0,1]))).App}));function zb(){const[o,i]=Ne.useState(!1),[a,c]=Ne.useState(null);return Ne.useEffect(()=>{let d=!1;return Wb().then(()=>{d||i(!0)}).catch(p=>{d||c(p instanceof Error&&p.message.trim()?p.message:nd("shell.navigationLoadFailed"))}),()=>{d=!0}},[]),o?an.jsx(Ne.Suspense,{fallback:null,children:an.jsx(jb,{})}):an.jsx("main",{className:"page-center app-shell",children:an.jsxs("section",{className:"auth-card surface-card",children:[an.jsx("h1",{children:"CodingNS"}),an.jsx("p",{className:"status-text",children:nd("common.loading")}),a?an.jsx("p",{className:"status-text","data-tone":"error",children:a}):null]})})}Rh.createRoot(document.getElementById("root")).render(an.jsx(zb,{}));export{py as $,Jn as A,ay as B,Do as C,zl as D,Vf as E,iy as F,Zb as G,jl as H,ny as I,yb as J,Yb as K,xh as L,bp as M,Kb as N,_b as O,dy as P,Eh as Q,qb as R,sy as S,cy as T,uy as U,hg as V,Nh as W,Gd as X,ly as Y,ey as Z,Ut as _,ty as a,Ne as b,vo as c,er as d,J as e,Jb as f,Sd as g,Cn as h,wd as i,an as j,fg as k,my as l,Ke as m,Be as n,ry as o,mo as p,tf as q,Dh as r,Gb as s,nd as t,Gf as u,Uh as v,Xb as w,oy as x,$b as y,Qb as z};