nastechai-desktop 18.1.0

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 (546) hide show
  1. package/.prettierrc +11 -0
  2. package/DESIGN.md +167 -0
  3. package/README.md +141 -0
  4. package/assets/icon.icns +0 -0
  5. package/assets/icon.ico +0 -0
  6. package/assets/icon.png +0 -0
  7. package/components.json +21 -0
  8. package/electron/backend-env.cjs +112 -0
  9. package/electron/backend-env.test.cjs +111 -0
  10. package/electron/backend-probes.cjs +106 -0
  11. package/electron/backend-probes.test.cjs +82 -0
  12. package/electron/backend-ready.cjs +66 -0
  13. package/electron/bootstrap-platform.cjs +91 -0
  14. package/electron/bootstrap-platform.test.cjs +111 -0
  15. package/electron/bootstrap-runner.cjs +720 -0
  16. package/electron/bootstrap-runner.test.cjs +138 -0
  17. package/electron/connection-config.cjs +254 -0
  18. package/electron/connection-config.test.cjs +329 -0
  19. package/electron/dashboard-token.cjs +99 -0
  20. package/electron/dashboard-token.test.cjs +142 -0
  21. package/electron/desktop-uninstall.cjs +232 -0
  22. package/electron/desktop-uninstall.test.cjs +246 -0
  23. package/electron/entitlements.mac.inherit.plist +14 -0
  24. package/electron/entitlements.mac.plist +14 -0
  25. package/electron/fs-read-dir.cjs +109 -0
  26. package/electron/fs-read-dir.test.cjs +364 -0
  27. package/electron/gateway-ws-probe.cjs +188 -0
  28. package/electron/gateway-ws-probe.test.cjs +122 -0
  29. package/electron/git-root.cjs +54 -0
  30. package/electron/git-root.test.cjs +40 -0
  31. package/electron/git-worktrees.cjs +174 -0
  32. package/electron/hardening.cjs +184 -0
  33. package/electron/hardening.test.cjs +116 -0
  34. package/electron/main.cjs +5762 -0
  35. package/electron/oauth-net-request.cjs +20 -0
  36. package/electron/oauth-net-request.test.cjs +34 -0
  37. package/electron/preload.cjs +135 -0
  38. package/electron/session-windows.cjs +99 -0
  39. package/electron/session-windows.test.cjs +177 -0
  40. package/electron/update-remote.cjs +56 -0
  41. package/electron/update-remote.test.cjs +78 -0
  42. package/electron/vscode-marketplace.cjs +331 -0
  43. package/electron/vscode-marketplace.test.cjs +113 -0
  44. package/electron/windows-child-process.test.cjs +57 -0
  45. package/electron/windows-user-env.cjs +76 -0
  46. package/electron/windows-user-env.test.cjs +90 -0
  47. package/electron/workspace-cwd.cjs +38 -0
  48. package/electron/workspace-cwd.test.cjs +45 -0
  49. package/eslint.config.mjs +122 -0
  50. package/index.html +17 -0
  51. package/package.json +254 -0
  52. package/pr-assets/session-source-folders.png +0 -0
  53. package/preview-demo.html +65 -0
  54. package/public/apple-touch-icon.png +0 -0
  55. package/public/ds-assets/filler-bg0.jpg +0 -0
  56. package/public/nastech-frames/nastech-frame-0.png +0 -0
  57. package/public/nastech-frames/nastech-frame-1.png +0 -0
  58. package/public/nastech-frames/nastech-frame-2.png +0 -0
  59. package/public/nastech-frames/nastech-frame-3.png +0 -0
  60. package/public/nastech-frames/nastech-frame-4.png +0 -0
  61. package/public/nastech-frames/nastech-frame-5.png +0 -0
  62. package/public/nastech-frames/nastech-frame-6.png +0 -0
  63. package/public/nastech-frames/nastech-frame-7.png +0 -0
  64. package/public/nastech-girl.jpg +0 -0
  65. package/public/nastech-sprite.png +0 -0
  66. package/public/nastech.png +0 -0
  67. package/scripts/after-pack.cjs +41 -0
  68. package/scripts/assert-dist-built.cjs +70 -0
  69. package/scripts/assert-dist-built.test.cjs +84 -0
  70. package/scripts/assert-root-install.cjs +13 -0
  71. package/scripts/before-build.cjs +11 -0
  72. package/scripts/before-pack.cjs +78 -0
  73. package/scripts/before-pack.test.cjs +53 -0
  74. package/scripts/click-session.mjs +51 -0
  75. package/scripts/dev-no-hmr.mjs +22 -0
  76. package/scripts/diag-jump.mjs +115 -0
  77. package/scripts/diag-scroll-reset.mjs +229 -0
  78. package/scripts/eval.mjs +21 -0
  79. package/scripts/leak-typing.mjs +222 -0
  80. package/scripts/measure-jump.mjs +108 -0
  81. package/scripts/measure-latency.mjs +184 -0
  82. package/scripts/measure-real-stream.mjs +252 -0
  83. package/scripts/measure-submit.mjs +179 -0
  84. package/scripts/measure-synthetic-stream.mjs +322 -0
  85. package/scripts/notarize-artifact.cjs +77 -0
  86. package/scripts/notarize.cjs +100 -0
  87. package/scripts/patch-electron-builder-mac-binary.cjs +59 -0
  88. package/scripts/probe-renderer.mjs +38 -0
  89. package/scripts/probe-thread.mjs +40 -0
  90. package/scripts/profile-long-stream.mjs +191 -0
  91. package/scripts/profile-real-stream.mjs +137 -0
  92. package/scripts/profile-synth-stream.mjs +103 -0
  93. package/scripts/profile-typing-lag.md +381 -0
  94. package/scripts/profile-typing.mjs +260 -0
  95. package/scripts/reload-renderer.mjs +25 -0
  96. package/scripts/reload.mjs +36 -0
  97. package/scripts/set-exe-identity.cjs +94 -0
  98. package/scripts/stage-native-deps.cjs +159 -0
  99. package/scripts/test-desktop.mjs +425 -0
  100. package/scripts/write-build-stamp.cjs +126 -0
  101. package/src/app/agents/index.tsx +398 -0
  102. package/src/app/artifacts/index.test.ts +62 -0
  103. package/src/app/artifacts/index.tsx +906 -0
  104. package/src/app/chat/chat-drop-overlay.tsx +48 -0
  105. package/src/app/chat/chat-swap-overlay.tsx +47 -0
  106. package/src/app/chat/composer/attachments.tsx +114 -0
  107. package/src/app/chat/composer/completion-drawer.tsx +63 -0
  108. package/src/app/chat/composer/context-menu.tsx +172 -0
  109. package/src/app/chat/composer/controls.tsx +289 -0
  110. package/src/app/chat/composer/drop-affordance.ts +2 -0
  111. package/src/app/chat/composer/enter-submit-dom-race.test.tsx +218 -0
  112. package/src/app/chat/composer/focus.ts +134 -0
  113. package/src/app/chat/composer/help-hint.tsx +59 -0
  114. package/src/app/chat/composer/hooks/use-at-completions.ts +141 -0
  115. package/src/app/chat/composer/hooks/use-live-completion-adapter.ts +119 -0
  116. package/src/app/chat/composer/hooks/use-mic-recorder.ts +291 -0
  117. package/src/app/chat/composer/hooks/use-slash-completions.ts +114 -0
  118. package/src/app/chat/composer/hooks/use-voice-conversation.ts +390 -0
  119. package/src/app/chat/composer/hooks/use-voice-recorder.ts +116 -0
  120. package/src/app/chat/composer/ime-composition-dom-repro.test.tsx +108 -0
  121. package/src/app/chat/composer/index.tsx +1611 -0
  122. package/src/app/chat/composer/inline-refs.ts +138 -0
  123. package/src/app/chat/composer/model-pill.tsx +86 -0
  124. package/src/app/chat/composer/queue-panel.tsx +130 -0
  125. package/src/app/chat/composer/rich-editor.test.ts +18 -0
  126. package/src/app/chat/composer/rich-editor.ts +165 -0
  127. package/src/app/chat/composer/skin-slash-popover.tsx +61 -0
  128. package/src/app/chat/composer/slash-nav-dom-repro.test.tsx +186 -0
  129. package/src/app/chat/composer/status-stack/index.tsx +202 -0
  130. package/src/app/chat/composer/status-stack/status-row.tsx +155 -0
  131. package/src/app/chat/composer/text-utils.test.ts +77 -0
  132. package/src/app/chat/composer/text-utils.ts +107 -0
  133. package/src/app/chat/composer/trigger-popover.test.tsx +42 -0
  134. package/src/app/chat/composer/trigger-popover.tsx +116 -0
  135. package/src/app/chat/composer/types.ts +64 -0
  136. package/src/app/chat/composer/url-dialog.tsx +82 -0
  137. package/src/app/chat/composer/voice-activity.tsx +252 -0
  138. package/src/app/chat/hooks/use-composer-actions.test.ts +57 -0
  139. package/src/app/chat/hooks/use-composer-actions.ts +525 -0
  140. package/src/app/chat/hooks/use-file-drop-zone.ts +118 -0
  141. package/src/app/chat/index.tsx +390 -0
  142. package/src/app/chat/perf-probe.tsx +269 -0
  143. package/src/app/chat/right-rail/index.ts +1 -0
  144. package/src/app/chat/right-rail/preview-console-state.ts +82 -0
  145. package/src/app/chat/right-rail/preview-console.tsx +290 -0
  146. package/src/app/chat/right-rail/preview-file.tsx +559 -0
  147. package/src/app/chat/right-rail/preview-pane.test.tsx +43 -0
  148. package/src/app/chat/right-rail/preview-pane.tsx +657 -0
  149. package/src/app/chat/right-rail/preview.tsx +171 -0
  150. package/src/app/chat/scroll-to-bottom-button.test.tsx +67 -0
  151. package/src/app/chat/scroll-to-bottom-button.tsx +74 -0
  152. package/src/app/chat/sidebar/cron-jobs-section.tsx +325 -0
  153. package/src/app/chat/sidebar/index.tsx +1219 -0
  154. package/src/app/chat/sidebar/load-more-row.tsx +30 -0
  155. package/src/app/chat/sidebar/order.test.ts +21 -0
  156. package/src/app/chat/sidebar/order.ts +17 -0
  157. package/src/app/chat/sidebar/profile-switcher.tsx +516 -0
  158. package/src/app/chat/sidebar/session-actions-menu.tsx +264 -0
  159. package/src/app/chat/sidebar/session-row.tsx +257 -0
  160. package/src/app/chat/sidebar/virtual-session-list.tsx +154 -0
  161. package/src/app/chat/sidebar/workspace-groups.test.ts +149 -0
  162. package/src/app/chat/sidebar/workspace-groups.ts +326 -0
  163. package/src/app/chat/thread-loading.test.ts +34 -0
  164. package/src/app/chat/thread-loading.ts +26 -0
  165. package/src/app/command-center/index.tsx +654 -0
  166. package/src/app/command-palette/index.tsx +513 -0
  167. package/src/app/command-palette/marketplace-theme-page.tsx +157 -0
  168. package/src/app/cron/index.tsx +942 -0
  169. package/src/app/cron/job-state.ts +29 -0
  170. package/src/app/desktop-controller.tsx +938 -0
  171. package/src/app/floating-hud.ts +22 -0
  172. package/src/app/gateway/hooks/use-gateway-boot.test.tsx +265 -0
  173. package/src/app/gateway/hooks/use-gateway-boot.ts +387 -0
  174. package/src/app/gateway/hooks/use-gateway-request.ts +138 -0
  175. package/src/app/hooks/use-keybinds.ts +186 -0
  176. package/src/app/hooks/use-refresh-hotkey.ts +45 -0
  177. package/src/app/hooks/use-route-enum-param.ts +38 -0
  178. package/src/app/index.tsx +1 -0
  179. package/src/app/layout-constants.ts +13 -0
  180. package/src/app/messaging/index.tsx +648 -0
  181. package/src/app/messaging/platform-icon.tsx +93 -0
  182. package/src/app/model-picker-overlay.tsx +42 -0
  183. package/src/app/model-visibility-overlay.tsx +31 -0
  184. package/src/app/overlays/overlay-chrome.tsx +66 -0
  185. package/src/app/overlays/overlay-search-input.tsx +33 -0
  186. package/src/app/overlays/overlay-split-layout.tsx +130 -0
  187. package/src/app/overlays/overlay-view.tsx +91 -0
  188. package/src/app/page-search-shell.tsx +75 -0
  189. package/src/app/profiles/create-profile-dialog.tsx +154 -0
  190. package/src/app/profiles/delete-profile-dialog.tsx +65 -0
  191. package/src/app/profiles/index.tsx +671 -0
  192. package/src/app/profiles/rename-profile-dialog.tsx +125 -0
  193. package/src/app/right-sidebar/files/dnd-manager.ts +27 -0
  194. package/src/app/right-sidebar/files/ipc.test.ts +100 -0
  195. package/src/app/right-sidebar/files/ipc.ts +161 -0
  196. package/src/app/right-sidebar/files/remote-picker.tsx +177 -0
  197. package/src/app/right-sidebar/files/tree.tsx +224 -0
  198. package/src/app/right-sidebar/files/use-project-tree.test.ts +190 -0
  199. package/src/app/right-sidebar/files/use-project-tree.ts +268 -0
  200. package/src/app/right-sidebar/index.test.tsx +75 -0
  201. package/src/app/right-sidebar/index.tsx +395 -0
  202. package/src/app/right-sidebar/store.ts +15 -0
  203. package/src/app/right-sidebar/terminal/buffer.ts +65 -0
  204. package/src/app/right-sidebar/terminal/index.tsx +98 -0
  205. package/src/app/right-sidebar/terminal/persistent.tsx +122 -0
  206. package/src/app/right-sidebar/terminal/selection.ts +75 -0
  207. package/src/app/right-sidebar/terminal/use-terminal-session.ts +504 -0
  208. package/src/app/routes.ts +88 -0
  209. package/src/app/session/hooks/use-context-suggestions.ts +58 -0
  210. package/src/app/session/hooks/use-cwd-actions.ts +109 -0
  211. package/src/app/session/hooks/use-message-stream.ts +957 -0
  212. package/src/app/session/hooks/use-model-controls.test.tsx +198 -0
  213. package/src/app/session/hooks/use-model-controls.ts +106 -0
  214. package/src/app/session/hooks/use-nastech-config.ts +74 -0
  215. package/src/app/session/hooks/use-preview-routing.test.tsx +168 -0
  216. package/src/app/session/hooks/use-preview-routing.ts +223 -0
  217. package/src/app/session/hooks/use-prompt-actions.test.tsx +316 -0
  218. package/src/app/session/hooks/use-prompt-actions.ts +1030 -0
  219. package/src/app/session/hooks/use-route-resume.test.tsx +136 -0
  220. package/src/app/session/hooks/use-route-resume.ts +115 -0
  221. package/src/app/session/hooks/use-session-actions.test.tsx +119 -0
  222. package/src/app/session/hooks/use-session-actions.ts +885 -0
  223. package/src/app/session/hooks/use-session-state-cache.test.tsx +118 -0
  224. package/src/app/session/hooks/use-session-state-cache.ts +191 -0
  225. package/src/app/session-picker-overlay.tsx +32 -0
  226. package/src/app/session-switcher.tsx +107 -0
  227. package/src/app/settings/about-settings.tsx +173 -0
  228. package/src/app/settings/appearance-settings.tsx +162 -0
  229. package/src/app/settings/config-settings.tsx +384 -0
  230. package/src/app/settings/constants.ts +545 -0
  231. package/src/app/settings/credential-key-ui.tsx +373 -0
  232. package/src/app/settings/env-credentials.tsx +198 -0
  233. package/src/app/settings/env-var-actions-menu.tsx +136 -0
  234. package/src/app/settings/field-copy.ts +56 -0
  235. package/src/app/settings/gateway-settings.tsx +620 -0
  236. package/src/app/settings/helpers.test.ts +138 -0
  237. package/src/app/settings/helpers.ts +151 -0
  238. package/src/app/settings/index.tsx +237 -0
  239. package/src/app/settings/keys-settings.tsx +96 -0
  240. package/src/app/settings/mcp-settings.tsx +271 -0
  241. package/src/app/settings/model-settings.test.tsx +157 -0
  242. package/src/app/settings/model-settings.tsx +559 -0
  243. package/src/app/settings/notifications-settings.tsx +150 -0
  244. package/src/app/settings/primitives.tsx +115 -0
  245. package/src/app/settings/providers-settings.test.tsx +100 -0
  246. package/src/app/settings/providers-settings.tsx +258 -0
  247. package/src/app/settings/sessions-settings.tsx +276 -0
  248. package/src/app/settings/toolset-config-panel.test.tsx +289 -0
  249. package/src/app/settings/toolset-config-panel.tsx +449 -0
  250. package/src/app/settings/types.ts +42 -0
  251. package/src/app/settings/uninstall-section.tsx +185 -0
  252. package/src/app/settings/use-deep-link-highlight.ts +60 -0
  253. package/src/app/shell/app-shell.tsx +167 -0
  254. package/src/app/shell/gateway-menu-panel.tsx +150 -0
  255. package/src/app/shell/hooks/use-overlay-routing.ts +71 -0
  256. package/src/app/shell/hooks/use-status-snapshot.ts +57 -0
  257. package/src/app/shell/hooks/use-statusbar-items.tsx +403 -0
  258. package/src/app/shell/keybind-panel.tsx +220 -0
  259. package/src/app/shell/model-edit-submenu.test.tsx +84 -0
  260. package/src/app/shell/model-edit-submenu.tsx +245 -0
  261. package/src/app/shell/model-menu-panel.tsx +295 -0
  262. package/src/app/shell/sidebar-label.tsx +22 -0
  263. package/src/app/shell/statusbar-controls.tsx +185 -0
  264. package/src/app/shell/titlebar-controls.tsx +244 -0
  265. package/src/app/shell/titlebar.test.ts +26 -0
  266. package/src/app/shell/titlebar.ts +45 -0
  267. package/src/app/shell/use-group-registry.ts +39 -0
  268. package/src/app/skills/index.test.tsx +103 -0
  269. package/src/app/skills/index.tsx +371 -0
  270. package/src/app/types.ts +99 -0
  271. package/src/app/updates-overlay.tsx +369 -0
  272. package/src/components/Backdrop.tsx +114 -0
  273. package/src/components/assistant-ui/ansi-text.tsx +34 -0
  274. package/src/components/assistant-ui/clarify-tool.tsx +281 -0
  275. package/src/components/assistant-ui/directive-text.test.ts +39 -0
  276. package/src/components/assistant-ui/directive-text.tsx +389 -0
  277. package/src/components/assistant-ui/markdown-text.test.ts +204 -0
  278. package/src/components/assistant-ui/markdown-text.tsx +497 -0
  279. package/src/components/assistant-ui/message-render-boundary.test.tsx +80 -0
  280. package/src/components/assistant-ui/message-render-boundary.tsx +48 -0
  281. package/src/components/assistant-ui/streaming.test.tsx +739 -0
  282. package/src/components/assistant-ui/thread-list.tsx +307 -0
  283. package/src/components/assistant-ui/thread-virtualizer.tsx +512 -0
  284. package/src/components/assistant-ui/thread.tsx +1474 -0
  285. package/src/components/assistant-ui/todo-tool.tsx +109 -0
  286. package/src/components/assistant-ui/tool-approval-group.test.tsx +158 -0
  287. package/src/components/assistant-ui/tool-approval.test.tsx +81 -0
  288. package/src/components/assistant-ui/tool-approval.tsx +209 -0
  289. package/src/components/assistant-ui/tool-fallback-model.test.ts +66 -0
  290. package/src/components/assistant-ui/tool-fallback-model.ts +1368 -0
  291. package/src/components/assistant-ui/tool-fallback.tsx +466 -0
  292. package/src/components/assistant-ui/tooltip-icon-button.tsx +33 -0
  293. package/src/components/assistant-ui/user-message-edit.test.tsx +141 -0
  294. package/src/components/assistant-ui/user-message-text.tsx +150 -0
  295. package/src/components/boot-failure-overlay.tsx +246 -0
  296. package/src/components/boot-failure-reauth.test.ts +100 -0
  297. package/src/components/boot-failure-reauth.ts +81 -0
  298. package/src/components/brand-mark.tsx +19 -0
  299. package/src/components/chat/activity-timer-text.tsx +24 -0
  300. package/src/components/chat/activity-timer.test.tsx +43 -0
  301. package/src/components/chat/activity-timer.ts +64 -0
  302. package/src/components/chat/code-card.tsx +78 -0
  303. package/src/components/chat/compact-markdown.tsx +113 -0
  304. package/src/components/chat/composer-dock.ts +31 -0
  305. package/src/components/chat/diff-lines.tsx +54 -0
  306. package/src/components/chat/disclosure-row.tsx +63 -0
  307. package/src/components/chat/generated-image-context.tsx +19 -0
  308. package/src/components/chat/generated-image-result.tsx +174 -0
  309. package/src/components/chat/image-generation-placeholder.tsx +279 -0
  310. package/src/components/chat/intro-copy.jsonl +75 -0
  311. package/src/components/chat/intro.tsx +182 -0
  312. package/src/components/chat/preview-attachment.tsx +125 -0
  313. package/src/components/chat/shiki-highlighter.tsx +107 -0
  314. package/src/components/chat/status-row.tsx +70 -0
  315. package/src/components/chat/status-section.tsx +42 -0
  316. package/src/components/chat/terminal-output.tsx +50 -0
  317. package/src/components/chat/zoomable-image.tsx +177 -0
  318. package/src/components/desktop-install-overlay.tsx +595 -0
  319. package/src/components/desktop-onboarding-overlay.test.tsx +100 -0
  320. package/src/components/desktop-onboarding-overlay.tsx +1286 -0
  321. package/src/components/error-boundary.tsx +77 -0
  322. package/src/components/gateway-connecting-overlay.test.tsx +143 -0
  323. package/src/components/gateway-connecting-overlay.tsx +183 -0
  324. package/src/components/haptics-provider.tsx +19 -0
  325. package/src/components/language-switcher.test.tsx +53 -0
  326. package/src/components/language-switcher.tsx +175 -0
  327. package/src/components/model-picker.tsx +340 -0
  328. package/src/components/model-visibility-dialog.tsx +155 -0
  329. package/src/components/notifications.tsx +196 -0
  330. package/src/components/page-loader.tsx +34 -0
  331. package/src/components/pane-shell/context.ts +14 -0
  332. package/src/components/pane-shell/index.ts +4 -0
  333. package/src/components/pane-shell/pane-shell.test.tsx +333 -0
  334. package/src/components/pane-shell/pane-shell.tsx +330 -0
  335. package/src/components/prompt-overlays.tsx +234 -0
  336. package/src/components/session-picker.tsx +108 -0
  337. package/src/components/status-dot.tsx +26 -0
  338. package/src/components/ui/action-status.tsx +25 -0
  339. package/src/components/ui/alert.tsx +53 -0
  340. package/src/components/ui/badge.tsx +35 -0
  341. package/src/components/ui/braille-spinner.tsx +61 -0
  342. package/src/components/ui/button.tsx +81 -0
  343. package/src/components/ui/checkbox.tsx +27 -0
  344. package/src/components/ui/codicon.tsx +20 -0
  345. package/src/components/ui/command.tsx +111 -0
  346. package/src/components/ui/confirm-dialog.tsx +109 -0
  347. package/src/components/ui/context-menu.tsx +141 -0
  348. package/src/components/ui/control.ts +25 -0
  349. package/src/components/ui/copy-button.test.tsx +36 -0
  350. package/src/components/ui/copy-button.tsx +229 -0
  351. package/src/components/ui/dialog.tsx +152 -0
  352. package/src/components/ui/disclosure-caret.tsx +20 -0
  353. package/src/components/ui/dropdown-menu.tsx +291 -0
  354. package/src/components/ui/error-state.tsx +50 -0
  355. package/src/components/ui/fade-text.tsx +110 -0
  356. package/src/components/ui/glyph-spinner.tsx +63 -0
  357. package/src/components/ui/input.tsx +22 -0
  358. package/src/components/ui/kbd.tsx +37 -0
  359. package/src/components/ui/loader.tsx +558 -0
  360. package/src/components/ui/log-view.tsx +17 -0
  361. package/src/components/ui/pagination.tsx +114 -0
  362. package/src/components/ui/popover.tsx +44 -0
  363. package/src/components/ui/scroll-area.tsx +43 -0
  364. package/src/components/ui/search-field.tsx +80 -0
  365. package/src/components/ui/segmented-control.tsx +51 -0
  366. package/src/components/ui/select.tsx +92 -0
  367. package/src/components/ui/separator.tsx +26 -0
  368. package/src/components/ui/sheet.tsx +116 -0
  369. package/src/components/ui/sidebar.tsx +674 -0
  370. package/src/components/ui/skeleton.tsx +7 -0
  371. package/src/components/ui/switch.tsx +49 -0
  372. package/src/components/ui/tabs.tsx +36 -0
  373. package/src/components/ui/text-tab.tsx +43 -0
  374. package/src/components/ui/textarea.tsx +11 -0
  375. package/src/components/ui/tool-icon.tsx +65 -0
  376. package/src/components/ui/tooltip.tsx +69 -0
  377. package/src/fonts/JetBrainsMono-Bold.woff2 +0 -0
  378. package/src/fonts/JetBrainsMono-Italic.woff2 +0 -0
  379. package/src/fonts/JetBrainsMono-Regular.woff2 +0 -0
  380. package/src/global.d.ts +457 -0
  381. package/src/hooks/use-image-download.ts +85 -0
  382. package/src/hooks/use-media-query.ts +24 -0
  383. package/src/hooks/use-mobile.ts +3 -0
  384. package/src/hooks/use-resize-observer.ts +38 -0
  385. package/src/hooks/use-worktree-info.ts +68 -0
  386. package/src/i18n/catalog.ts +12 -0
  387. package/src/i18n/context.test.tsx +232 -0
  388. package/src/i18n/context.tsx +183 -0
  389. package/src/i18n/define-locale.ts +41 -0
  390. package/src/i18n/en.ts +1779 -0
  391. package/src/i18n/index.ts +20 -0
  392. package/src/i18n/ja.ts +1890 -0
  393. package/src/i18n/languages.test.ts +43 -0
  394. package/src/i18n/languages.ts +86 -0
  395. package/src/i18n/runtime.test.ts +75 -0
  396. package/src/i18n/runtime.ts +53 -0
  397. package/src/i18n/types.ts +1452 -0
  398. package/src/i18n/zh-hant.ts +1849 -0
  399. package/src/i18n/zh.ts +1923 -0
  400. package/src/lib/ansi.test.ts +123 -0
  401. package/src/lib/ansi.ts +175 -0
  402. package/src/lib/chat-messages.test.ts +708 -0
  403. package/src/lib/chat-messages.ts +885 -0
  404. package/src/lib/chat-runtime.test.ts +18 -0
  405. package/src/lib/chat-runtime.ts +335 -0
  406. package/src/lib/clipboard.ts +28 -0
  407. package/src/lib/commit-changelog.test.ts +114 -0
  408. package/src/lib/commit-changelog.ts +177 -0
  409. package/src/lib/completion-sound.ts +519 -0
  410. package/src/lib/desktop-fs.test.ts +116 -0
  411. package/src/lib/desktop-fs.ts +113 -0
  412. package/src/lib/desktop-slash-commands.test.ts +126 -0
  413. package/src/lib/desktop-slash-commands.ts +286 -0
  414. package/src/lib/embedded-images.test.ts +35 -0
  415. package/src/lib/embedded-images.ts +60 -0
  416. package/src/lib/external-link.test.tsx +168 -0
  417. package/src/lib/external-link.tsx +303 -0
  418. package/src/lib/gateway-events.test.ts +27 -0
  419. package/src/lib/gateway-events.ts +49 -0
  420. package/src/lib/gateway-ws-url.test.ts +78 -0
  421. package/src/lib/gateway-ws-url.ts +91 -0
  422. package/src/lib/generated-images.test.ts +97 -0
  423. package/src/lib/generated-images.ts +116 -0
  424. package/src/lib/haptics.ts +129 -0
  425. package/src/lib/icons.ts +203 -0
  426. package/src/lib/incremental-external-store-runtime.ts +188 -0
  427. package/src/lib/katex-memo.ts +260 -0
  428. package/src/lib/keybinds/actions.ts +125 -0
  429. package/src/lib/keybinds/combo.test.ts +86 -0
  430. package/src/lib/keybinds/combo.ts +169 -0
  431. package/src/lib/local-preview.ts +126 -0
  432. package/src/lib/markdown-code.test.ts +23 -0
  433. package/src/lib/markdown-code.ts +195 -0
  434. package/src/lib/markdown-preprocess.ts +386 -0
  435. package/src/lib/media.remote.test.ts +58 -0
  436. package/src/lib/media.ts +111 -0
  437. package/src/lib/model-status-label.test.ts +31 -0
  438. package/src/lib/model-status-label.ts +103 -0
  439. package/src/lib/mutable-ref.ts +6 -0
  440. package/src/lib/preview-targets.test.ts +27 -0
  441. package/src/lib/preview-targets.ts +63 -0
  442. package/src/lib/profile-color.ts +58 -0
  443. package/src/lib/provider-setup-errors.test.ts +26 -0
  444. package/src/lib/provider-setup-errors.ts +12 -0
  445. package/src/lib/query-client.ts +13 -0
  446. package/src/lib/remend-tail.test.ts +105 -0
  447. package/src/lib/remend-tail.ts +108 -0
  448. package/src/lib/runtime-readiness.test.ts +65 -0
  449. package/src/lib/runtime-readiness.ts +147 -0
  450. package/src/lib/session-export.ts +57 -0
  451. package/src/lib/session-search.test.ts +58 -0
  452. package/src/lib/session-search.ts +19 -0
  453. package/src/lib/session-source.ts +62 -0
  454. package/src/lib/speech-text.ts +35 -0
  455. package/src/lib/statusbar.ts +91 -0
  456. package/src/lib/storage.test.ts +25 -0
  457. package/src/lib/storage.ts +107 -0
  458. package/src/lib/todos.test.ts +35 -0
  459. package/src/lib/todos.ts +51 -0
  460. package/src/lib/tool-result-summary.test.ts +106 -0
  461. package/src/lib/tool-result-summary.ts +467 -0
  462. package/src/lib/update-copy.test.ts +38 -0
  463. package/src/lib/update-copy.ts +44 -0
  464. package/src/lib/use-enter-animation.ts +100 -0
  465. package/src/lib/utils.ts +6 -0
  466. package/src/lib/voice-playback.ts +128 -0
  467. package/src/lib/yolo-session.ts +26 -0
  468. package/src/main.tsx +43 -0
  469. package/src/nastech.test.ts +49 -0
  470. package/src/nastech.ts +718 -0
  471. package/src/store/activity.ts +100 -0
  472. package/src/store/boot.ts +91 -0
  473. package/src/store/clarify.test.ts +81 -0
  474. package/src/store/clarify.ts +69 -0
  475. package/src/store/command-palette.ts +20 -0
  476. package/src/store/compaction.test.ts +53 -0
  477. package/src/store/compaction.ts +38 -0
  478. package/src/store/completion-sound.ts +32 -0
  479. package/src/store/composer-input-history.test.ts +147 -0
  480. package/src/store/composer-input-history.ts +158 -0
  481. package/src/store/composer-queue.test.ts +148 -0
  482. package/src/store/composer-queue.ts +239 -0
  483. package/src/store/composer-status.test.ts +99 -0
  484. package/src/store/composer-status.ts +277 -0
  485. package/src/store/composer.test.ts +106 -0
  486. package/src/store/composer.ts +184 -0
  487. package/src/store/cron.ts +19 -0
  488. package/src/store/gateway.ts +290 -0
  489. package/src/store/haptics.ts +17 -0
  490. package/src/store/keybinds.ts +139 -0
  491. package/src/store/layout.ts +176 -0
  492. package/src/store/model-presets.test.ts +51 -0
  493. package/src/store/model-presets.ts +86 -0
  494. package/src/store/model-visibility.test.ts +37 -0
  495. package/src/store/model-visibility.ts +108 -0
  496. package/src/store/native-notifications.test.ts +192 -0
  497. package/src/store/native-notifications.ts +203 -0
  498. package/src/store/notifications.ts +165 -0
  499. package/src/store/onboarding.test.ts +372 -0
  500. package/src/store/onboarding.ts +866 -0
  501. package/src/store/panes.test.ts +146 -0
  502. package/src/store/panes.ts +145 -0
  503. package/src/store/preview.test.ts +135 -0
  504. package/src/store/preview.ts +466 -0
  505. package/src/store/profile.test.ts +89 -0
  506. package/src/store/profile.ts +365 -0
  507. package/src/store/prompts.test.ts +121 -0
  508. package/src/store/prompts.ts +115 -0
  509. package/src/store/session-switcher.test.ts +115 -0
  510. package/src/store/session-switcher.ts +128 -0
  511. package/src/store/session-sync.ts +25 -0
  512. package/src/store/session.test.ts +131 -0
  513. package/src/store/session.ts +255 -0
  514. package/src/store/subagents.test.ts +111 -0
  515. package/src/store/subagents.ts +260 -0
  516. package/src/store/thread-scroll.ts +46 -0
  517. package/src/store/todos.test.ts +47 -0
  518. package/src/store/todos.ts +64 -0
  519. package/src/store/tool-diffs.ts +23 -0
  520. package/src/store/tool-dismiss.ts +45 -0
  521. package/src/store/tool-view.ts +91 -0
  522. package/src/store/translucency.ts +38 -0
  523. package/src/store/updates.test.ts +77 -0
  524. package/src/store/updates.ts +315 -0
  525. package/src/store/voice-playback.ts +24 -0
  526. package/src/store/windows.test.ts +143 -0
  527. package/src/store/windows.ts +77 -0
  528. package/src/styles.css +1235 -0
  529. package/src/themes/color.ts +142 -0
  530. package/src/themes/context.tsx +339 -0
  531. package/src/themes/index.ts +3 -0
  532. package/src/themes/install.test.ts +119 -0
  533. package/src/themes/install.ts +95 -0
  534. package/src/themes/presets.test.ts +33 -0
  535. package/src/themes/presets.ts +293 -0
  536. package/src/themes/profile-theme.test.ts +41 -0
  537. package/src/themes/types.ts +66 -0
  538. package/src/themes/use-skin-command.ts +60 -0
  539. package/src/themes/user-themes.test.ts +63 -0
  540. package/src/themes/user-themes.ts +122 -0
  541. package/src/themes/vscode.test.ts +171 -0
  542. package/src/themes/vscode.ts +343 -0
  543. package/src/types/nastech.ts +646 -0
  544. package/src/vite-env.d.ts +1 -0
  545. package/tsconfig.json +25 -0
  546. package/vite.config.ts +56 -0
@@ -0,0 +1,1849 @@
1
+ import { defineFieldCopy } from '@/app/settings/field-copy'
2
+
3
+ import { defineLocale } from './define-locale'
4
+
5
+ export const zhHant = defineLocale({
6
+ common: {
7
+ apply: '套用',
8
+ back: '返回',
9
+ save: '儲存',
10
+ saving: '儲存中…',
11
+ cancel: '取消',
12
+ change: '變更',
13
+ choose: '選擇',
14
+ clear: '清除',
15
+ close: '關閉',
16
+ collapse: '收合',
17
+ confirm: '確認',
18
+ connect: '連線',
19
+ connecting: '連線中',
20
+ continue: '繼續',
21
+ copied: '已複製',
22
+ copy: '複製',
23
+ copyFailed: '複製失敗',
24
+ delete: '刪除',
25
+ docs: '文件',
26
+ done: '完成',
27
+ error: '錯誤',
28
+ failed: '失敗',
29
+ free: '免費',
30
+ loading: '載入中…',
31
+ notSet: '未設定',
32
+ refresh: '重新整理',
33
+ remove: '移除',
34
+ replace: '取代',
35
+ retry: '重試',
36
+ run: '執行',
37
+ send: '傳送',
38
+ set: '設定',
39
+ skip: '略過',
40
+ update: '更新',
41
+ on: '開啟',
42
+ off: '關閉'
43
+ },
44
+
45
+ boot: {
46
+ ready: 'NasTech Desktop 已就緒',
47
+ desktopBootFailedWithMessage: message => `桌面啟動失敗:${message}`,
48
+ steps: {
49
+ connectingGateway: '正在連線桌面閘道',
50
+ loadingSettings: '正在載入 NasTech 設定',
51
+ loadingSessions: '正在載入最近工作階段',
52
+ startingDesktopConnection: '正在啟動桌面連線',
53
+ startingNasTechDesktop: '正在啟動 NasTech Desktop…'
54
+ },
55
+ errors: {
56
+ backgroundExited: 'NasTech 背景程序已結束。',
57
+ backgroundExitedDuringStartup: 'NasTech 背景程序在啟動期間結束。',
58
+ backendStopped: '後端已停止',
59
+ desktopBootFailed: '桌面啟動失敗',
60
+ gatewaySignInRequired: '需要閘道登入',
61
+ ipcBridgeUnavailable: '桌面 IPC 橋接器不可用。'
62
+ },
63
+ failure: {
64
+ title: 'NasTech 無法啟動',
65
+ description: '背景閘道未啟動。請嘗試下面的復原步驟。這裡的操作不會刪除您的聊天或設定。',
66
+ remoteTitle: '需要重新登入遠端閘道',
67
+ remoteDescription: '您的遠端閘道工作階段已過期。請重新登入以重新連線。這裡的操作不會刪除您的聊天或設定。',
68
+ retry: '重試',
69
+ repairInstall: '修復安裝',
70
+ useLocalGateway: '使用本機閘道',
71
+ openLogs: '開啟記錄',
72
+ repairHint: '修復會重新執行安裝程式,在新機器上可能需要幾分鐘。',
73
+ remoteSignInHint: '開啟閘道登入視窗。使用本機閘道可切換至內建後端。',
74
+ hideRecentLogs: '隱藏最近記錄',
75
+ showRecentLogs: '顯示最近記錄',
76
+ signedInTitle: '已登入',
77
+ signedInMessage: '正在重新連線至遠端閘道…',
78
+ signInIncompleteTitle: '登入未完成',
79
+ signInIncompleteMessage: '登入視窗在驗證完成前關閉。',
80
+ signInFailed: '登入失敗',
81
+ signInToRemoteGateway: '登入遠端閘道',
82
+ signInWithProvider: provider => `使用 ${provider} 登入`,
83
+ identityProvider: '您的身分提供方'
84
+ }
85
+ },
86
+
87
+ notifications: {
88
+ region: '通知',
89
+ hide: '隱藏',
90
+ show: '顯示',
91
+ more: count => `另外 ${count} 則通知`,
92
+ clearAll: '全部清除',
93
+ dismiss: '關閉通知',
94
+ details: '詳細資訊',
95
+ copyDetail: '複製詳情',
96
+ copyDetailFailed: '無法複製通知詳情',
97
+ backendOutOfDateTitle: '後端版本過舊',
98
+ backendOutOfDateMessage: '您的 NasTech 後端早於目前的桌面版本,可能無法正常運作。請更新以保持一致。',
99
+ updateNasTech: '更新 NasTech',
100
+ updateReadyTitle: '有可用更新',
101
+ updateReadyMessage: count => `有 ${count} 項新變更可用。`,
102
+ seeWhatsNew: '查看新增內容',
103
+ errors: {
104
+ elevenLabsNeedsKey: 'ElevenLabs STT 需要 ELEVENLABS_API_KEY。',
105
+ elevenLabsRejectedKey: 'ElevenLabs 拒絕了該 API 金鑰 (401)。',
106
+ methodNotAllowed: '桌面後端拒絕了該請求 (405 Method Not Allowed)。請嘗試重新啟動 NasTech Desktop。',
107
+ microphonePermission: '麥克風權限已被拒絕。',
108
+ openaiRejectedApiKey: 'OpenAI 拒絕了該 API 金鑰。',
109
+ openaiRejectedApiKeyWithStatus: status => `OpenAI 拒絕了該 API 金鑰 (${status} invalid_api_key)。`,
110
+ openaiTtsNeedsKey: 'OpenAI TTS 需要 VOICE_TOOLS_OPENAI_KEY 或 OPENAI_API_KEY。'
111
+ },
112
+ voice: {
113
+ configureSpeechToText: '設定語音轉文字後即可使用語音模式。',
114
+ couldNotStartSession: '無法啟動語音工作階段',
115
+ microphoneAccessDenied: '麥克風存取被拒絕。',
116
+ microphoneConstraintsUnsupported: '此裝置不支援目前的麥克風限制條件。',
117
+ microphoneFailed: '麥克風發生錯誤',
118
+ microphoneInUse: '麥克風正被其他應用程式使用中。',
119
+ microphonePermissionDenied: '麥克風權限被拒絕。',
120
+ microphoneStartFailed: '無法開始麥克風錄音。',
121
+ microphoneUnsupported: '目前執行環境不支援麥克風錄音。',
122
+ noMicrophone: '找不到麥克風。',
123
+ noSpeechDetected: '未偵測到語音',
124
+ playbackFailed: '語音播放失敗',
125
+ recordingFailed: '語音錄製失敗',
126
+ transcriptionFailed: '語音轉寫失敗',
127
+ transcriptionUnavailable: '語音轉寫暫不可用。',
128
+ tryRecordingAgain: '請再錄製一次。',
129
+ unavailable: '語音不可用'
130
+ }
131
+ },
132
+
133
+ titlebar: {
134
+ hideSidebar: '隱藏側邊欄',
135
+ showSidebar: '顯示側邊欄',
136
+ search: '搜尋',
137
+ searchTitle: '搜尋工作階段、檢視和動作',
138
+ swapSidebarSides: '交換側邊欄位置',
139
+ swapSidebarSidesTitle: '交換工作階段欄和檔案瀏覽器的位置',
140
+ hideRightSidebar: '隱藏右側邊欄',
141
+ showRightSidebar: '顯示右側邊欄',
142
+ muteHaptics: '靜音觸感回饋',
143
+ unmuteHaptics: '開啟觸感回饋',
144
+ openSettings: '開啟設定'
145
+ },
146
+
147
+ language: {
148
+ label: '語言',
149
+ description: '選擇桌面介面的語言。',
150
+ saving: '正在儲存語言…',
151
+ saveError: '語言更新失敗',
152
+ switchTo: '切換語言',
153
+ searchPlaceholder: '搜尋語言…',
154
+ noResults: '找不到語言'
155
+ },
156
+
157
+ settings: {
158
+ closeSettings: '關閉設定',
159
+ exportConfig: '匯出設定',
160
+ importConfig: '匯入設定',
161
+ resetToDefaults: '恢復預設值',
162
+ resetConfirm: '要將所有設定恢復為 NasTech 預設值嗎?',
163
+ exportFailed: '匯出失敗',
164
+ resetFailed: '重設失敗',
165
+ nav: {
166
+ providers: '提供方',
167
+ providerAccounts: '帳號',
168
+ providerApiKeys: 'API 金鑰',
169
+ gateway: '閘道',
170
+ apiKeys: '工具與金鑰',
171
+ keysTools: '工具',
172
+ keysSettings: '設定',
173
+ mcp: 'MCP',
174
+ archivedChats: '已封存聊天',
175
+ about: '關於'
176
+ },
177
+ sections: {
178
+ model: '模型',
179
+ chat: '聊天',
180
+ appearance: '外觀',
181
+ workspace: '工作區',
182
+ safety: '安全性',
183
+ memory: '記憶與上下文',
184
+ voice: '語音',
185
+ advanced: '進階'
186
+ },
187
+ searchPlaceholder: {
188
+ about: '關於 NasTech Desktop',
189
+ config: '搜尋設定…',
190
+ gateway: '閘道連線…',
191
+ keys: '搜尋 API 金鑰…',
192
+ mcp: '搜尋 MCP 伺服器…',
193
+ sessions: '搜尋已封存工作階段…'
194
+ },
195
+ modeOptions: {
196
+ light: { label: '明亮', description: '明亮的桌面介面' },
197
+ dark: { label: '深色', description: '降低眩光的工作區' },
198
+ system: { label: '跟隨系統', description: '跟隨作業系統外觀' }
199
+ },
200
+ appearance: {
201
+ title: '外觀',
202
+ intro: '這些是僅限桌面端的顯示偏好。模式控制亮度;主題控制強調色與聊天介面樣式。',
203
+ colorMode: '色彩模式',
204
+ colorModeDesc: '選擇固定模式,或讓 NasTech 跟隨系統設定。',
205
+ toolViewTitle: '工具呼叫顯示',
206
+ toolViewDesc: '產品模式會隱藏原始工具 payload;技術模式會顯示完整輸入/輸出。',
207
+ product: '產品',
208
+ productDesc: '易讀的工具活動與精簡摘要。',
209
+ technical: '技術',
210
+ technicalDesc: '包含原始工具參數、結果與底層細節。',
211
+ themeTitle: '主題',
212
+ themeDesc: '僅限桌面端的調色盤。所選模式會套用在其上。'
213
+ },
214
+ fieldLabels: defineFieldCopy({
215
+ model: '預設模型',
216
+ modelContextLength: '上下文視窗',
217
+ fallbackProviders: '備用模型',
218
+ toolsets: '已啟用工具集',
219
+ timezone: '時區',
220
+ display: {
221
+ personality: '人格',
222
+ showReasoning: '推理區塊'
223
+ },
224
+ agent: {
225
+ maxTurns: '最大代理步數',
226
+ imageInputMode: '圖片附件',
227
+ apiMaxRetries: 'API 重試次數',
228
+ serviceTier: '服務層級',
229
+ toolUseEnforcement: '工具使用強制'
230
+ },
231
+ terminal: {
232
+ cwd: '工作目錄',
233
+ backend: '執行後端',
234
+ timeout: '指令逾時',
235
+ persistentShell: '持久化 Shell',
236
+ envPassthrough: '環境變數傳遞'
237
+ },
238
+ fileReadMaxChars: '檔案讀取上限',
239
+ toolOutput: {
240
+ maxBytes: '終端機輸出上限',
241
+ maxLines: '檔案頁面上限',
242
+ maxLineLength: '行長上限'
243
+ },
244
+ codeExecution: {
245
+ mode: '程式碼執行模式'
246
+ },
247
+ approvals: {
248
+ mode: '批准模式',
249
+ timeout: '批准逾時',
250
+ mcpReloadConfirm: '確認 MCP 重新載入'
251
+ },
252
+ commandAllowlist: '指令允許清單',
253
+ security: {
254
+ redactSecrets: '遮蔽密鑰',
255
+ allowPrivateUrls: '允許私有 URL'
256
+ },
257
+ browser: {
258
+ allowPrivateUrls: '瀏覽器私有 URL',
259
+ autoLocalForPrivateUrls: '私有 URL 使用本機瀏覽器'
260
+ },
261
+ checkpoints: {
262
+ enabled: '檔案檢查點',
263
+ maxSnapshots: '檢查點上限'
264
+ },
265
+ voice: {
266
+ recordKey: '語音快捷鍵',
267
+ maxRecordingSeconds: '最長錄音時間',
268
+ autoTts: '朗讀回覆'
269
+ },
270
+ stt: {
271
+ enabled: '語音轉文字',
272
+ provider: '語音轉文字提供方',
273
+ local: {
274
+ model: '本機轉寫模型',
275
+ language: '轉寫語言'
276
+ },
277
+ elevenlabs: {
278
+ modelId: 'ElevenLabs STT 模型',
279
+ languageCode: 'ElevenLabs 語言',
280
+ tagAudioEvents: '標記音訊事件',
281
+ diarize: '說話者分離'
282
+ }
283
+ },
284
+ tts: {
285
+ provider: '文字轉語音提供方',
286
+ edge: {
287
+ voice: 'Edge 語音'
288
+ },
289
+ openai: {
290
+ model: 'OpenAI TTS 模型',
291
+ voice: 'OpenAI 語音'
292
+ },
293
+ elevenlabs: {
294
+ voiceId: 'ElevenLabs 語音',
295
+ modelId: 'ElevenLabs 模型'
296
+ }
297
+ },
298
+ memory: {
299
+ memoryEnabled: '持久記憶',
300
+ userProfileEnabled: '使用者設定檔',
301
+ memoryCharLimit: '記憶預算',
302
+ userCharLimit: '設定檔預算',
303
+ provider: '記憶提供方'
304
+ },
305
+ context: {
306
+ engine: '上下文引擎'
307
+ },
308
+ compression: {
309
+ enabled: '自動壓縮',
310
+ threshold: '壓縮閾值',
311
+ targetRatio: '壓縮目標',
312
+ protectLastN: '保護最近訊息'
313
+ },
314
+ delegation: {
315
+ model: '子代理模型',
316
+ provider: '子代理提供方',
317
+ maxIterations: '子代理輪次上限',
318
+ maxConcurrentChildren: '平行子代理',
319
+ childTimeoutSeconds: '子代理逾時',
320
+ reasoningEffort: '子代理推理強度'
321
+ },
322
+ updates: {
323
+ nonInteractiveLocalChanges: '應用程式內更新的本機變更'
324
+ }
325
+ }),
326
+ fieldDescriptions: defineFieldCopy({
327
+ model: '除非你在輸入框選擇其他模型,否則新聊天會使用此模型。',
328
+ modelContextLength: '保留 0 會使用所選模型偵測到的上下文視窗。',
329
+ fallbackProviders: '預設模型失敗時要嘗試的備用 provider:model 項目。',
330
+ display: {
331
+ personality: '新工作階段的預設助手風格。',
332
+ showReasoning: '後端提供推理內容時顯示該區塊。'
333
+ },
334
+ timezone: 'NasTech 需要本機時間上下文時使用。留空則使用系統時區。',
335
+ agent: {
336
+ imageInputMode: '控制圖片附件如何傳送給模型。',
337
+ maxTurns: 'NasTech 停止一次執行前的工具呼叫輪次上限。'
338
+ },
339
+ terminal: {
340
+ cwd: '工具與終端機操作的預設專案資料夾。',
341
+ persistentShell: '後端支援時,在指令之間保留 Shell 狀態。',
342
+ envPassthrough: '傳入工具執行的環境變數。'
343
+ },
344
+ codeExecution: {
345
+ mode: '程式碼執行被限制在目前專案中的嚴格程度。'
346
+ },
347
+ fileReadMaxChars: 'NasTech 單次檔案讀取可讀取的最大字元數。',
348
+ approvals: {
349
+ mode: 'NasTech 如何處理需要明確批准的指令。',
350
+ timeout: '批准提示逾時前等待的時間。'
351
+ },
352
+ security: {
353
+ redactSecrets: '盡可能從模型可見內容中隱藏偵測到的密鑰。'
354
+ },
355
+ checkpoints: {
356
+ enabled: '在檔案編輯前建立可回復的快照。'
357
+ },
358
+ memory: {
359
+ memoryEnabled: '儲存有助於未來工作階段的持久記憶。',
360
+ userProfileEnabled: '維護一份精簡的使用者偏好設定檔。'
361
+ },
362
+ context: {
363
+ engine: '長對話接近上下文上限時的管理策略。'
364
+ },
365
+ compression: {
366
+ enabled: '對話變大時摘要較早的上下文。'
367
+ },
368
+ voice: {
369
+ autoTts: '自動朗讀助手回覆。'
370
+ },
371
+ stt: {
372
+ enabled: '啟用本機或提供方支援的語音轉寫。',
373
+ elevenlabs: {
374
+ languageCode: '可選的 ISO-639-3 語言代碼。留空讓 ElevenLabs 自動偵測。'
375
+ }
376
+ },
377
+ updates: {
378
+ nonInteractiveLocalChanges:
379
+ 'NasTech 從應用程式內更新自身時,保留本機原始碼變更(stash)或丟棄(discard)。終端機更新一律會詢問。'
380
+ }
381
+ }),
382
+ about: {
383
+ heading: 'NasTech Desktop',
384
+ version: value => `版本 ${value}`,
385
+ versionUnavailable: '版本不可用',
386
+ updates: '更新',
387
+ checkNow: '立即檢查',
388
+ checking: '檢查中…',
389
+ seeWhatsNew: '查看新增內容',
390
+ releaseNotes: '發行說明',
391
+ onLatest: '你已是最新版本。',
392
+ installing: '正在安裝更新。',
393
+ cantUpdate: '此版本無法從應用程式內自行更新。',
394
+ cantReach: '無法連線到更新伺服器。',
395
+ tapCheck: '點選「立即檢查」以尋找更新。',
396
+ updateReady: count => `新更新已就緒(包含 ${count} 項變更)。`,
397
+ lastChecked: age => `上次檢查:${age}`,
398
+ justNowSuffix: ' · 剛剛',
399
+ automaticUpdates: '自動更新',
400
+ automaticUpdatesDesc: 'NasTech 會在背景自動檢查更新,並在有可用更新時通知你。',
401
+ branchCommit: (branch, commit) => `分支 ${branch} · 提交 ${commit}`,
402
+ never: '從未',
403
+ justNow: '剛剛',
404
+ minAgo: count => `${count} 分鐘前`,
405
+ hoursAgo: count => `${count} 小時前`,
406
+ daysAgo: count => `${count} 天前`
407
+ },
408
+ config: {
409
+ none: '無',
410
+ noneParen: '(無)',
411
+ notSet: '未設定',
412
+ commaSeparated: '逗號分隔的值',
413
+ loading: '正在載入 NasTech 設定...',
414
+ emptyTitle: '無可設定項目',
415
+ emptyDesc: '此區段沒有可調整的設定。',
416
+ failedLoad: '設定載入失敗',
417
+ autosaveFailed: '自動儲存失敗',
418
+ imported: '設定已匯入',
419
+ invalidJson: '設定 JSON 無效'
420
+ },
421
+ credentials: {
422
+ pasteKey: '貼上金鑰',
423
+ pasteLabelKey: label => `貼上 ${label} 金鑰`,
424
+ optional: '選填',
425
+ enterValueFirst: '請先輸入一個值。',
426
+ couldNotSave: '無法儲存憑證。',
427
+ remove: '移除',
428
+ or: '或',
429
+ escToCancel: '按 esc 取消',
430
+ getKey: '取得金鑰',
431
+ saving: '儲存中'
432
+ },
433
+ envActions: {
434
+ actionsFor: label => `${label} 的動作`,
435
+ credentialActions: '憑證動作',
436
+ docs: '文件',
437
+ hideValue: '隱藏值',
438
+ revealValue: '顯示值',
439
+ replace: '取代',
440
+ set: '設定',
441
+ clear: '清除'
442
+ },
443
+ gateway: {
444
+ loading: '正在載入閘道設定...',
445
+ unavailableTitle: '閘道設定不可用',
446
+ unavailableDesc: '桌面 IPC 橋接器未公開閘道設定。',
447
+ title: '閘道連線',
448
+ envOverride: '環境變數覆寫',
449
+ intro:
450
+ 'NasTech Desktop 預設會啟動自己的本機閘道。如果您希望此應用程式控制另一台機器或可信代理後面已執行的 NasTech 後端,請使用遠端閘道。在下方按設定檔指定各自的遠端主機。',
451
+ appliesTo: '套用至',
452
+ allProfiles: '全部設定檔',
453
+ defaultConnection: '預設連線適用於所有沒有自訂覆寫的設定檔。',
454
+ profileConnection: profile => `僅當「${profile}」為作用中設定檔時使用此連線。設為本機可繼承預設連線。`,
455
+ envOverrideTitle: '環境變數正在控制此桌面工作階段。',
456
+ envOverrideDesc:
457
+ '取消設定 NASTECH_DESKTOP_REMOTE_URL 和 NASTECH_DESKTOP_REMOTE_TOKEN 後才會使用下方儲存的設定。',
458
+ localTitle: '本機閘道',
459
+ localDesc: '在 localhost 啟動私有 NasTech 後端。這是預設方式,可離線使用。',
460
+ remoteTitle: '遠端閘道',
461
+ remoteDesc:
462
+ '將此桌面殼層連線至遠端 NasTech 後端。託管閘道使用 OAuth 或帳號密碼;自託管閘道也可使用工作階段 Token。',
463
+ remoteUrlTitle: '遠端 URL',
464
+ remoteUrlDesc: '遠端儀表板後端的基礎 URL。支援路徑前綴,例如 /NASTECH。',
465
+ probing: '正在檢查此閘道的驗證方式…',
466
+ probeError: '暫時無法連線此閘道。請檢查 URL;閘道回應後將顯示驗證方式。',
467
+ signedIn: '已登入',
468
+ signIn: '登入',
469
+ signOut: '登出',
470
+ signInWith: provider => `使用 ${provider} 登入`,
471
+ authTitle: '驗證',
472
+ authSignedInPassword: '此閘道使用帳號和密碼。您已登入,工作階段會自動重新整理。',
473
+ authSignedInOauth: '此閘道使用 OAuth。您已登入,工作階段會自動重新整理。',
474
+ authNeedsPassword: '此閘道使用帳號和密碼。請登入以授權此桌面應用程式。',
475
+ authNeedsOauth: provider => `此閘道使用 OAuth。請使用 ${provider} 登入以授權此桌面應用程式。`,
476
+ tokenTitle: '工作階段 Token',
477
+ tokenDesc: '用於 REST 和 WebSocket 存取的儀表板工作階段 Token。留空則保留已儲存的 Token。',
478
+ existingToken: value => `現有 Token ${value}`,
479
+ savedToken: '已儲存',
480
+ pasteSessionToken: '貼上工作階段 Token',
481
+ testRemote: '測試遠端',
482
+ saveForRestart: '儲存至下次重新啟動',
483
+ saveAndReconnect: '儲存並重新連線',
484
+ diagnostics: '診斷',
485
+ diagnosticsDesc: '在檔案管理員中顯示 desktop.log,閘道啟動失敗時很有用。',
486
+ openLogs: '開啟記錄',
487
+ incompleteTitle: '遠端閘道設定不完整',
488
+ incompleteSignIn: '切換至遠端前,請輸入遠端 URL 並完成登入。',
489
+ incompleteToken: '切換至遠端前,請輸入遠端 URL 和工作階段 Token。',
490
+ incompleteSignInTest: '測試前,請輸入遠端 URL 並完成登入。',
491
+ incompleteTokenTest: '測試前,請輸入遠端 URL 和工作階段 Token。',
492
+ enterUrlFirst: '請先輸入遠端 URL。',
493
+ restartingTitle: '閘道連線正在重新啟動',
494
+ savedTitle: '閘道設定已儲存',
495
+ restartingMessage: 'NasTech Desktop 將使用已儲存的設定重新連線。',
496
+ savedMessage: '已儲存,下次重新啟動後生效。',
497
+ connectedTo: (baseUrl, version) => `已連線至 ${baseUrl}${version ? ` · NasTech ${version}` : ''}`,
498
+ reachableTitle: '遠端閘道可連線',
499
+ signedOutTitle: '已登出',
500
+ signedOutMessage: '已清除遠端閘道工作階段。',
501
+ failedLoad: '閘道設定載入失敗',
502
+ signInFailed: '登入失敗',
503
+ signOutFailed: '登出失敗',
504
+ testFailed: '遠端閘道測試失敗',
505
+ applyFailed: '無法套用閘道設定',
506
+ saveFailed: '無法儲存閘道設定'
507
+ },
508
+ keys: {
509
+ loading: '正在載入 API 金鑰和憑證...',
510
+ failedLoad: 'API 金鑰載入失敗',
511
+ empty: '此類別尚未有任何設定。'
512
+ },
513
+ mcp: {
514
+ loading: '正在載入 MCP 伺服器...',
515
+ failedLoad: 'MCP 設定載入失敗',
516
+ nameRequiredTitle: '需要名稱',
517
+ nameRequiredMessage: '請為此 MCP 伺服器提供設定鍵。',
518
+ objectRequired: '伺服器設定必須是 JSON 物件',
519
+ invalidJson: 'MCP JSON 無效',
520
+ saveFailed: '儲存失敗',
521
+ removeFailed: '移除失敗',
522
+ gatewayUnavailableTitle: '閘道不可用',
523
+ gatewayUnavailableMessage: '重新載入 MCP 前請先重新連線閘道。',
524
+ reloadedTitle: 'MCP 工具已重新載入',
525
+ reloadedMessage: '新的工具 Schema 將套用至後續回合。',
526
+ reloadFailed: 'MCP 重新載入失敗',
527
+ savedTitle: 'MCP 伺服器已儲存',
528
+ savedMessage: name => `${name} 會在 MCP 重新載入後生效。`,
529
+ newServer: '新伺服器',
530
+ reload: '重新載入 MCP',
531
+ reloading: '重新載入中...',
532
+ emptyTitle: '沒有 MCP 伺服器',
533
+ emptyDesc: '新增 stdio 或 HTTP 伺服器以公開 MCP 工具。',
534
+ disabled: '已停用',
535
+ editServer: '編輯伺服器',
536
+ name: '名稱',
537
+ serverJson: '伺服器 JSON',
538
+ remove: '移除',
539
+ saveServer: '儲存伺服器'
540
+ },
541
+ model: {
542
+ loading: '正在載入模型設定...',
543
+ appliesDesc: '套用至新工作階段。可在輸入框的模型選擇器中臨時切換目前對話。',
544
+ provider: '提供方',
545
+ model: '模型',
546
+ applying: '套用中...',
547
+ auxiliaryTitle: '輔助模型',
548
+ resetAllToMain: '全部重設為主要模型',
549
+ auxiliaryDesc: '輔助任務預設使用主要模型。您可以為任何任務指定專用模型。',
550
+ setToMain: '設為主要模型',
551
+ change: '變更',
552
+ autoUseMain: '自動 · 使用主要模型',
553
+ providerDefault: '(提供方預設)',
554
+ tasks: {
555
+ vision: { label: '視覺', hint: '圖片分析' },
556
+ web_extract: { label: '網頁擷取', hint: '頁面摘要' },
557
+ compression: { label: '壓縮', hint: '上下文壓縮' },
558
+ skills_hub: { label: '技能中心', hint: '技能搜尋' },
559
+ approval: { label: '核准', hint: '智慧自動核准' },
560
+ mcp: { label: 'MCP', hint: 'MCP 工具路由' },
561
+ title_generation: { label: '標題生成', hint: '工作階段標題' },
562
+ curator: { label: '策展器', hint: '技能使用審查' }
563
+ }
564
+ },
565
+ providers: {
566
+ connectAccount: '連結帳號',
567
+ haveApiKey: '改用 API 金鑰?',
568
+ intro: '使用訂閱登入,無需複製 API 金鑰。NasTech 會在應用程式中為您完成瀏覽器登入。',
569
+ connected: '已連線',
570
+ collapse: '收合',
571
+ connectAnother: '連結其他提供方',
572
+ otherProviders: '其他提供方',
573
+ noProviderKeys: '沒有可用的提供方 API 金鑰。',
574
+ loading: '正在載入提供方...'
575
+ },
576
+ sessions: {
577
+ loading: '正在載入已封存工作階段…',
578
+ archivedTitle: '已封存工作階段',
579
+ archivedIntro:
580
+ '已封存的聊天會從側邊欄隱藏,但保留全部訊息。在側邊欄 Ctrl/⌘ 點擊聊天即可封存。',
581
+ emptyArchivedTitle: '暫無封存',
582
+ emptyArchivedDesc: '封存一個聊天後會顯示在這裡。',
583
+ unarchive: '取消封存',
584
+ deletePermanently: '永久刪除',
585
+ messages: count => `${count} 則訊息`,
586
+ restored: '已還原',
587
+ deleteConfirm: title => `永久刪除「${title}」?此操作無法復原。`,
588
+ defaultDirTitle: '預設專案目錄',
589
+ defaultDirDesc:
590
+ '新工作階段預設從此資料夾開始,除非您選擇其他目錄。留空則使用您的家目錄。',
591
+ defaultDirUpdated: '預設專案目錄已更新',
592
+ defaultsTo: label => `預設使用 ${label}。`,
593
+ change: '變更',
594
+ choose: '選擇',
595
+ clear: '清除',
596
+ notSet: '未設定',
597
+ failedLoad: '無法載入已封存工作階段',
598
+ unarchiveFailed: '取消封存失敗',
599
+ deleteFailed: '刪除失敗',
600
+ updateDirFailed: '無法更新預設目錄',
601
+ clearDirFailed: '無法清除預設目錄'
602
+ },
603
+ toolsets: {
604
+ loadingConfig: '正在載入設定',
605
+ savedTitle: '憑證已儲存',
606
+ savedMessage: key => `${key} 已更新。`,
607
+ removedTitle: '憑證已移除',
608
+ removedMessage: key => `${key} 已移除。`,
609
+ failedSave: key => `儲存 ${key} 失敗`,
610
+ failedRemove: key => `移除 ${key} 失敗`,
611
+ failedReveal: key => `顯示 ${key} 失敗`,
612
+ removeConfirm: key => `從 .env 中移除 ${key}?`,
613
+ set: '已設定',
614
+ notSet: '未設定',
615
+ selectedTitle: '已選擇提供方',
616
+ selectedMessage: provider => `${provider} 現在處於作用中狀態。`,
617
+ failedSelect: provider => `選擇 ${provider} 失敗`,
618
+ failedLoad: '工具設定載入失敗',
619
+ noProviderOptions: '此工具集沒有提供方選項;啟用後即可使用目前設定。',
620
+ noProviders: '此工具集目前沒有可用提供方。',
621
+ ready: '就緒',
622
+ nousIncluded: '包含在 NasTech 訂閱中;登入 NasTech Portal 即可啟用。',
623
+ noApiKeyRequired: '不需要 API 金鑰。',
624
+ postSetupHint: step => `此後端需要一次性安裝 (${step})。將在此機器上執行,可能需要幾分鐘。`,
625
+ postSetupRun: '執行設定',
626
+ postSetupRunning: '安裝中…',
627
+ postSetupStarting: '啟動中…',
628
+ postSetupCompleteTitle: '設定完成',
629
+ postSetupCompleteMessage: step => `已安裝 ${step}。`,
630
+ postSetupErrorTitle: '設定完成但有錯誤',
631
+ postSetupErrorMessage: step => `請檢查 ${step} 日誌。`,
632
+ postSetupFailed: step => `執行 ${step} 設定失敗`
633
+ }
634
+ },
635
+
636
+ skills: {
637
+ tabSkills: '技能',
638
+ tabToolsets: '工具集',
639
+ all: '全部',
640
+ searchSkills: '搜尋技能...',
641
+ searchToolsets: '搜尋工具集...',
642
+ refresh: '重新整理技能',
643
+ refreshing: '正在重新整理技能',
644
+ loading: '正在載入功能…',
645
+ noSkillsTitle: '找不到技能',
646
+ noSkillsDesc: '請嘗試更廣泛的搜尋或不同類別。',
647
+ noToolsetsTitle: '找不到工具集',
648
+ noToolsetsDesc: '請嘗試更廣泛的搜尋詞。',
649
+ noDescription: '無可用描述。',
650
+ configured: '已設定',
651
+ needsKeys: '需要金鑰',
652
+ toolsetsEnabled: (enabled, total) => `已啟用 ${enabled}/${total} 個工具集`,
653
+ configureToolset: label => `設定 ${label}`,
654
+ toggleToolset: label => `切換 ${label} 工具集`,
655
+ skillsLoadFailed: '技能載入失敗',
656
+ toolsetsRefreshFailed: '工具集重新整理失敗',
657
+ skillEnabled: '技能已啟用',
658
+ skillDisabled: '技能已停用',
659
+ toolsetEnabled: '工具集已啟用',
660
+ toolsetDisabled: '工具集已停用',
661
+ appliesToNewSessions: name => `${name} 將套用至新工作階段。`,
662
+ failedToUpdate: name => `更新 ${name} 失敗`
663
+ },
664
+
665
+ agents: {
666
+ close: '關閉代理',
667
+ title: '派生樹',
668
+ subtitle: '目前回合的子代理即時活動。',
669
+ emptyTitle: '暫無活躍子代理',
670
+ emptyDesc: '當某個回合派發任務時,子代理會在此即時顯示進度。',
671
+ running: '執行中',
672
+ failed: '失敗',
673
+ done: '完成',
674
+ streaming: '串流傳輸中',
675
+ files: '檔案',
676
+ moreFiles: count => `還有 ${count} 個檔案`,
677
+ delegation: index => `派發 ${index}`,
678
+ workers: count => `${count} 個工作單元`,
679
+ workersActive: count => `${count} 個活躍`,
680
+ agentsCount: count => `${count} 個代理`,
681
+ activeCount: count => `${count} 個活躍`,
682
+ failedCount: count => `${count} 個失敗`,
683
+ toolsCount: count => `${count} 個工具`,
684
+ filesCount: count => `${count} 個檔案`,
685
+ updatedAgo: age => `更新於 ${age}`,
686
+ ageNow: '剛才',
687
+ ageSeconds: seconds => `${seconds} 秒前`,
688
+ ageMinutes: minutes => `${minutes} 分鐘前`,
689
+ ageHours: hours => `${hours} 小時前`,
690
+ durationSeconds: seconds => `${seconds} 秒`,
691
+ durationMinutes: (minutes, seconds) => `${minutes} 分 ${seconds} 秒`,
692
+ tokensK: k => `${k}k 詞元`,
693
+ tokens: value => `${value} 詞元`
694
+ },
695
+
696
+ commandCenter: {
697
+ close: '關閉命令中心',
698
+ paletteTitle: '命令面板',
699
+ back: '返回',
700
+ searchPlaceholder: '搜尋工作階段、檢視和動作',
701
+ goTo: '前往',
702
+ commandCenter: '命令中心',
703
+ appearance: '外觀',
704
+ settings: '設定',
705
+ changeTheme: '變更主題...',
706
+ changeColorMode: '變更色彩模式...',
707
+ installTheme: {
708
+ title: '安裝佈景主題...',
709
+ placeholder: '搜尋 VS Code Marketplace...',
710
+ loading: '正在搜尋 Marketplace...',
711
+ error: '無法連線至 Marketplace。',
712
+ empty: '沒有符合的佈景主題。',
713
+ install: '安裝',
714
+ installing: '安裝中...',
715
+ installed: '已安裝',
716
+ installs: count => `${count} 次安裝`
717
+ },
718
+ settingsFields: '設定欄位',
719
+ mcpServers: 'MCP 伺服器',
720
+ archivedChats: '已封存聊天',
721
+ sections: { sessions: '工作階段', system: '系統', usage: '使用量' },
722
+ sectionDescriptions: {
723
+ sessions: '搜尋和管理工作階段',
724
+ system: '狀態、記錄和系統動作',
725
+ usage: '一段時間內的詞元、費用和技能活動'
726
+ },
727
+ nav: {
728
+ newChat: { title: '新工作階段', detail: '開始新的工作階段' },
729
+ settings: { title: '設定', detail: '設定 NasTech 桌面端' },
730
+ skills: { title: '技能與工具', detail: '啟用技能、工具集和提供方' },
731
+ messaging: { title: '訊息平台', detail: '設定 Telegram、Slack、Discord 等' },
732
+ artifacts: { title: '成品', detail: '瀏覽產生的輸出' }
733
+ },
734
+ sectionEntries: {
735
+ sessions: { title: '工作階段面板', detail: '搜尋、釘選和管理工作階段' },
736
+ system: { title: '系統面板', detail: '閘道狀態、記錄、重新啟動/更新' },
737
+ usage: { title: '使用量面板', detail: '詞元、費用和技能活動' }
738
+ },
739
+ providerNavigate: '導覽',
740
+ providerSessions: '工作階段',
741
+ refresh: '重新整理',
742
+ refreshing: '重新整理中…',
743
+ noResults: '找不到相符的結果。',
744
+ pinSession: '釘選工作階段',
745
+ unpinSession: '取消釘選',
746
+ exportSession: '匯出工作階段',
747
+ deleteSession: '刪除工作階段',
748
+ noSessions: '暫無工作階段。',
749
+ gatewayRunning: '訊息閘道執行中',
750
+ gatewayStopped: '訊息閘道已停止',
751
+ NASTECHActiveSessions: (version, count) => `NasTech ${version} · 活躍工作階段 ${count}`,
752
+ restartMessaging: '重新啟動訊息服務',
753
+ updateNasTech: '更新 NasTech',
754
+ actionRunning: '執行中',
755
+ actionDone: '完成',
756
+ actionFailed: '失敗',
757
+ actionStartedWaiting: '動作已啟動,等待狀態…',
758
+ loadingStatus: '正在載入狀態…',
759
+ recentLogs: '最近記錄',
760
+ noLogs: '尚未載入記錄。',
761
+ days: count => `${count} 天`,
762
+ statSessions: '工作階段',
763
+ statApiCalls: 'API 呼叫',
764
+ statTokens: '輸入/輸出詞元',
765
+ statCost: '預估費用',
766
+ actualCost: cost => `實際 ${cost}`,
767
+ loadingUsage: '正在載入使用量…',
768
+ noUsage: period => `最近 ${period} 天暫無使用量。`,
769
+ retry: '重試',
770
+ dailyTokens: '每日詞元',
771
+ input: '輸入',
772
+ output: '輸出',
773
+ noDailyActivity: '暫無每日活動。',
774
+ topModels: '常用模型',
775
+ noModelUsage: '暫無模型使用量。',
776
+ topSkills: '常用技能',
777
+ noSkillActivity: '暫無技能活動。',
778
+ actions: count => `${count} 次動作`
779
+ },
780
+
781
+ messaging: {
782
+ search: '搜尋訊息平台…',
783
+ loading: '正在載入訊息平台…',
784
+ loadFailed: '訊息平台載入失敗',
785
+ states: {
786
+ connected: '已連線',
787
+ connecting: '連線中',
788
+ disabled: '已停用',
789
+ fatal: '錯誤',
790
+ gateway_stopped: '訊息閘道已停止',
791
+ not_configured: '需要設定',
792
+ pending_restart: '需要重新啟動',
793
+ retrying: '重試中',
794
+ startup_failed: '啟動失敗'
795
+ },
796
+ unknown: '未知',
797
+ hintPendingRestart: '在狀態列重新啟動閘道以套用此變更。',
798
+ hintGatewayStopped: '在狀態列啟動閘道以建立連線。',
799
+ credentialsSet: '憑證已設定',
800
+ needsSetup: '需要設定',
801
+ gatewayStopped: '訊息閘道已停止',
802
+ getCredentials: '取得您的憑證',
803
+ openSetupGuide: '開啟設定指南',
804
+ required: '必填',
805
+ recommended: '建議',
806
+ advanced: count => `進階 (${count})`,
807
+ noTokenNeeded: '此平台不需要在此填寫 Token。請按照上方設定指南操作,然後在下方啟用。',
808
+ enabled: '已啟用',
809
+ disabled: '已停用',
810
+ unsavedChanges: '有未儲存的變更',
811
+ saving: '儲存中…',
812
+ saveChanges: '儲存變更',
813
+ saved: '已儲存',
814
+ replaceValue: '取代目前值',
815
+ openDocs: '開啟文件',
816
+ clearField: key => `清除 ${key}`,
817
+ enableAria: name => `啟用 ${name}`,
818
+ disableAria: name => `停用 ${name}`,
819
+ platformEnabled: name => `${name} 已啟用`,
820
+ platformDisabled: name => `${name} 已停用`,
821
+ restartToApply: '重新啟動閘道後此變更才會生效。',
822
+ setupSaved: name => `${name} 設定已儲存`,
823
+ restartToReconnect: '重新啟動閘道以使用新憑證重新連線。',
824
+ keyCleared: key => `${key} 已清除`,
825
+ setupUpdated: name => `${name} 設定已更新。`,
826
+ failedUpdate: name => `更新 ${name} 失敗`,
827
+ failedSave: name => `儲存 ${name} 失敗`,
828
+ failedClear: key => `清除 ${key} 失敗`,
829
+ fieldCopy: {
830
+ TELEGRAM_BOT_TOKEN: {
831
+ label: 'Bot Token',
832
+ help: '用 @BotFather 建立機器人,然後貼上它給您的 Token。',
833
+ placeholder: '貼上 Telegram bot Token'
834
+ },
835
+ TELEGRAM_ALLOWED_USERS: {
836
+ label: '允許的 Telegram 使用者 ID',
837
+ help: '建議設定。來自 @userinfobot 的逗號分隔數字 ID。不設定則任何人都能私訊您的機器人。'
838
+ },
839
+ TELEGRAM_PROXY: { label: '代理 URL', help: '僅在 Telegram 被封鎖的網路中需要。' },
840
+ DISCORD_BOT_TOKEN: {
841
+ label: 'Bot Token',
842
+ help: '在 Discord 開發者入口網站建立應用程式,新增機器人,然後貼上其 Token。'
843
+ },
844
+ DISCORD_ALLOWED_USERS: { label: '允許的 Discord 使用者 ID', help: '建議設定。逗號分隔的 Discord 使用者 ID。' },
845
+ DISCORD_REPLY_TO_MODE: { label: '回覆方式', help: 'first、all 或 off。' },
846
+ DISCORD_ALLOW_ALL_USERS: {
847
+ label: '允許所有 Discord 使用者',
848
+ help: '僅供開發使用。為 true 時,任何人都可以私訊機器人,不需要允許清單。'
849
+ },
850
+ DISCORD_HOME_CHANNEL: {
851
+ label: '主頻道 ID',
852
+ help: '機器人主動傳送訊息的頻道(cron 輸出、提醒等)。'
853
+ },
854
+ DISCORD_HOME_CHANNEL_NAME: {
855
+ label: '主頻道名稱',
856
+ help: '記錄和狀態輸出中顯示的主頻道名稱。'
857
+ },
858
+ BLUEBUBBLES_ALLOW_ALL_USERS: { label: '允許所有 iMessage 使用者', help: '為 true 時略過 BlueBubbles 允許清單。' },
859
+ MATTERMOST_ALLOW_ALL_USERS: { label: '允許所有 Mattermost 使用者' },
860
+ MATTERMOST_HOME_CHANNEL: { label: '主頻道' },
861
+ QQ_ALLOW_ALL_USERS: { label: '允許所有 QQ 使用者' },
862
+ QQBOT_HOME_CHANNEL: { label: 'QQ 主頻道', help: 'cron 傳遞的預設頻道或群組。' },
863
+ QQBOT_HOME_CHANNEL_NAME: { label: 'QQ 主頻道名稱' },
864
+ SLACK_BOT_TOKEN: {
865
+ label: 'Slack bot Token',
866
+ help: '安裝 Slack 應用程式後,在 OAuth & Permissions 中找到 bot Token。',
867
+ placeholder: '貼上 Slack bot Token'
868
+ },
869
+ SLACK_APP_TOKEN: {
870
+ label: 'Slack app Token',
871
+ help: 'Socket Mode 需要 app 層級 Token。',
872
+ placeholder: '貼上 Slack app Token'
873
+ },
874
+ SLACK_ALLOWED_USERS: { label: '允許的 Slack 使用者 ID', help: '建議設定。逗號分隔的 Slack 使用者 ID。' },
875
+ MATTERMOST_URL: { label: '伺服器 URL', placeholder: 'https://mattermost.example.com' },
876
+ MATTERMOST_TOKEN: { label: 'Bot Token' },
877
+ MATTERMOST_ALLOWED_USERS: { label: '允許的使用者 ID', help: '建議設定。逗號分隔的 Mattermost 使用者 ID。' },
878
+ MATRIX_HOMESERVER: { label: 'Homeserver URL', placeholder: 'https://matrix.org' },
879
+ MATRIX_ACCESS_TOKEN: { label: '存取 Token' },
880
+ MATRIX_USER_ID: { label: 'Bot 使用者 ID', placeholder: '@NASTECH:example.org' },
881
+ MATRIX_ALLOWED_USERS: {
882
+ label: '允許的 Matrix 使用者 ID',
883
+ help: '建議設定。@user:server 格式的逗號分隔使用者 ID。'
884
+ },
885
+ SIGNAL_HTTP_URL: {
886
+ label: 'Signal 橋接 URL',
887
+ placeholder: 'http://127.0.0.1:8080',
888
+ help: '執行中的 signal-cli REST 橋接的 URL。'
889
+ },
890
+ SIGNAL_ACCOUNT: { label: '電話號碼', help: '在 signal-cli 橋接中註冊的號碼。' },
891
+ SIGNAL_ALLOWED_USERS: { label: '允許的 Signal 使用者', help: '建議設定。逗號分隔的 Signal 識別碼。' },
892
+ WHATSAPP_ENABLED: {
893
+ label: '啟用 WhatsApp 橋接',
894
+ help: '由下方切換開關自動設定。除非確知需要,否則請勿變更。'
895
+ },
896
+ WHATSAPP_MODE: { label: '橋接模式' },
897
+ WHATSAPP_ALLOWED_USERS: {
898
+ label: '允許的 WhatsApp 使用者',
899
+ help: '建議設定。逗號分隔的電話號碼或 WhatsApp ID。'
900
+ }
901
+ },
902
+ platformIntro: {}
903
+ },
904
+
905
+ profiles: {
906
+ close: '關閉設定檔',
907
+ nameHint: '小寫字母、數字、連字號和底線。必須以字母或數字開頭。',
908
+ title: '設定檔',
909
+ count: count => `${count} 個設定檔`,
910
+ loading: '正在載入設定檔…',
911
+ newProfile: '新增設定檔',
912
+ allProfiles: '全部設定檔',
913
+ showAllProfiles: '顯示全部設定檔',
914
+ switchToProfile: name => `切換至 ${name}`,
915
+ manageProfiles: '管理設定檔...',
916
+ actionsFor: name => `${name} 的動作`,
917
+ color: '顏色...',
918
+ colorFor: name => `${name} 的顏色`,
919
+ setColor: color => `設定顏色 ${color}`,
920
+ autoColor: '自動',
921
+ noProfiles: '找不到設定檔。',
922
+ selectPrompt: '選擇一個設定檔以檢視其詳細資訊。',
923
+ refresh: '重新整理設定檔',
924
+ refreshing: '正在重新整理設定檔',
925
+ default: '預設',
926
+ skills: count => `${count} 個技能`,
927
+ env: 'env',
928
+ defaultBadge: '預設',
929
+ rename: '重新命名',
930
+ copySetup: '複製安裝指令',
931
+ copying: '複製中…',
932
+ modelLabel: '模型',
933
+ skillsLabel: '技能',
934
+ notSet: '未設定',
935
+ soulDesc: '內建於此設定檔的系統提示詞與角色指令。',
936
+ soulOptional: '選填',
937
+ soulPlaceholder: mode => `此設定檔的系統提示詞 / 角色說明。\n留空則保留${mode}預設值。`,
938
+ soulPlaceholderCloned: '複製的',
939
+ soulPlaceholderEmpty: '空的',
940
+ unsavedChanges: '有未儲存的變更',
941
+ loadingSoul: '正在載入 SOUL.md…',
942
+ emptySoul: '空的 SOUL.md — 開始撰寫角色設定…',
943
+ saving: '儲存中…',
944
+ saveSoul: '儲存 SOUL.md',
945
+ deleteTitle: '刪除設定檔?',
946
+ deleteDescPrefix: '這將刪除 ',
947
+ deleteDescMid: ' 並移除其 ',
948
+ deleteDescSuffix: ' 目錄。此操作無法復原。',
949
+ deleting: '刪除中…',
950
+ createDesc: '設定檔是獨立的 NasTech 環境:各自擁有獨立的設定、技能和 SOUL.md。',
951
+ nameLabel: '名稱',
952
+ cloneFromDefault: '從預設設定檔複製設定',
953
+ cloneFromDefaultDesc: '從您的預設設定檔複製設定、技能和 SOUL.md。',
954
+ invalidName: hint => `設定檔名稱無效。${hint}`,
955
+ nameRequired: '名稱為必填',
956
+ creating: '建立中…',
957
+ createAction: '建立設定檔',
958
+ renameTitle: '重新命名設定檔',
959
+ renameDescPrefix: '重新命名會更新設定檔目錄以及 ',
960
+ renameDescSuffix: ' 中的所有包裝指令碼。',
961
+ newNameLabel: '新名稱',
962
+ renaming: '重新命名中…',
963
+ created: '已建立',
964
+ renamed: '已重新命名',
965
+ deleted: '已刪除',
966
+ setupCopied: '安裝指令已複製',
967
+ soulSaved: 'SOUL.md 已儲存',
968
+ failedLoad: '載入設定檔失敗',
969
+ failedDelete: '刪除設定檔失敗',
970
+ failedCopy: '複製安裝指令失敗',
971
+ failedLoadSoul: '載入 SOUL.md 失敗',
972
+ failedSaveSoul: '儲存 SOUL.md 失敗',
973
+ failedCreate: '建立設定檔失敗',
974
+ failedRename: '重新命名設定檔失敗'
975
+ },
976
+
977
+ cron: {
978
+ close: '關閉排程',
979
+ search: '搜尋排程工作…',
980
+ loading: '正在載入排程工作…',
981
+ states: {
982
+ enabled: '已啟用',
983
+ scheduled: '已排程',
984
+ running: '執行中',
985
+ paused: '已暫停',
986
+ disabled: '已停用',
987
+ error: '錯誤',
988
+ completed: '已完成'
989
+ },
990
+ deliveryLabels: {
991
+ local: '此桌面',
992
+ telegram: 'Telegram',
993
+ discord: 'Discord',
994
+ slack: 'Slack',
995
+ email: '電子郵件'
996
+ },
997
+ scheduleLabels: {
998
+ daily: '每天',
999
+ weekdays: '工作日',
1000
+ weekly: '每週',
1001
+ monthly: '每月',
1002
+ hourly: '每小時',
1003
+ 'every-15-minutes': '每 15 分鐘',
1004
+ custom: '自訂'
1005
+ },
1006
+ scheduleHints: {
1007
+ daily: '每天上午 9:00',
1008
+ weekdays: '週一至週五上午 9:00',
1009
+ weekly: '每週一上午 9:00',
1010
+ monthly: '每月第一天上午 9:00',
1011
+ hourly: '每個整點',
1012
+ 'every-15-minutes': '每 15 分鐘',
1013
+ custom: 'Cron 語法或自然語言'
1014
+ },
1015
+ days: {
1016
+ '0': '週日',
1017
+ '1': '週一',
1018
+ '2': '週二',
1019
+ '3': '週三',
1020
+ '4': '週四',
1021
+ '5': '週五',
1022
+ '6': '週六',
1023
+ '7': '週日'
1024
+ },
1025
+ dayFallback: value => `第 ${value} 天`,
1026
+ everyDayAt: time => `每天 ${time}`,
1027
+ weekdaysAt: time => `工作日 ${time}`,
1028
+ everyDayOfWeekAt: (day, time) => `每${day} ${time}`,
1029
+ monthlyOnDayAt: (dayOfMonth, time) => `每月 ${dayOfMonth} 日 ${time}`,
1030
+ topOfHour: '每個整點',
1031
+ everyHourAt: minute => `每小時的 :${minute}`,
1032
+ active: (enabled, total) => `${enabled}/${total} 個活躍`,
1033
+ newCron: '新排程工作',
1034
+ emptyDescNew:
1035
+ '按 cron 表達式排程一個提示詞。NasTech 會執行它,並將結果傳送至您選擇的目的地。',
1036
+ emptyDescSearch: '請嘗試更廣泛的搜尋詞。',
1037
+ emptyTitleNew: '暫無排程工作',
1038
+ emptyTitleSearch: '無相符項目',
1039
+ last: '上次:',
1040
+ next: '下次:',
1041
+ noRuns: '尚無執行',
1042
+ manage: '管理',
1043
+ showRuns: '顯示執行記錄',
1044
+ hideRuns: '隱藏執行記錄',
1045
+ runHistory: '執行記錄',
1046
+ actionsFor: title => `${title} 的動作`,
1047
+ actionsTitle: '排程工作動作',
1048
+ resume: '繼續',
1049
+ pause: '暫停',
1050
+ resumeTitle: '繼續',
1051
+ pauseTitle: '暫停',
1052
+ triggerNow: '立即觸發',
1053
+ edit: '編輯排程工作',
1054
+ deleteTitle: '刪除排程工作?',
1055
+ deleteDescPrefix: '這將永久移除 ',
1056
+ deleteDescSuffix: '。它會立即停止觸發。',
1057
+ deleting: '刪除中…',
1058
+ resumed: '排程工作已繼續',
1059
+ paused: '排程工作已暫停',
1060
+ triggered: '排程工作已觸發',
1061
+ deleted: '排程工作已刪除',
1062
+ created: '排程工作已建立',
1063
+ updated: '排程工作已更新',
1064
+ failedLoad: '載入排程工作失敗',
1065
+ failedUpdate: '更新排程工作失敗',
1066
+ failedTrigger: '觸發排程工作失敗',
1067
+ failedDelete: '刪除排程工作失敗',
1068
+ failedSave: '儲存排程工作失敗',
1069
+ editTitle: '編輯排程工作',
1070
+ createTitle: '新排程工作',
1071
+ editDesc: '更新排程、提示詞或傳遞目標。變更將在下次執行時生效。',
1072
+ createDesc: '排程一個提示詞以自動執行。使用 cron 語法或類似「每 15 分鐘」的自然語言。',
1073
+ nameLabel: '名稱',
1074
+ namePlaceholder: '例如:每日摘要',
1075
+ promptLabel: '提示詞',
1076
+ promptPlaceholder: '代理每次執行時應做什麼?',
1077
+ frequencyLabel: '頻率',
1078
+ deliverLabel: '傳遞至',
1079
+ customScheduleLabel: '自訂排程',
1080
+ customPlaceholder: '0 9 * * * 或 weekdays at 9am',
1081
+ customHint: 'Cron 表達式,或類似「每小時」「工作日上午 9 點」的短語。',
1082
+ optional: '選填',
1083
+ promptScheduleRequired: '提示詞和排程為必填項目。',
1084
+ saveChanges: '儲存變更',
1085
+ createAction: '建立排程工作'
1086
+ },
1087
+
1088
+ artifacts: {
1089
+ search: '搜尋成品…',
1090
+ refresh: '重新整理成品',
1091
+ refreshing: '正在重新整理成品',
1092
+ indexing: '正在索引最近工作階段的成品',
1093
+ tabAll: '全部',
1094
+ tabImages: '圖片',
1095
+ tabFiles: '檔案',
1096
+ tabLinks: '連結',
1097
+ noArtifactsTitle: '找不到成品',
1098
+ noArtifactsDesc: '當工作階段產生圖片和檔案輸出時,它們會顯示在這裡。',
1099
+ failedLoad: '成品載入失敗',
1100
+ openFailed: '開啟失敗',
1101
+ itemsImage: '張圖片',
1102
+ itemsLink: '個連結',
1103
+ itemsFile: '個檔案',
1104
+ itemsGeneric: '項',
1105
+ zero: '0',
1106
+ rangeOf: (start, end, total) => `${start}-${end},共 ${total}`,
1107
+ goToPage: (itemLabel, page) => `前往${itemLabel}第 ${page} 頁`,
1108
+ colTitleLink: '連結標題',
1109
+ colTitleFile: '名稱',
1110
+ colTitleDefault: '標題 / 名稱',
1111
+ colLocationLink: 'URL',
1112
+ colLocationFile: '路徑',
1113
+ colLocationDefault: '位置',
1114
+ colSession: '工作階段',
1115
+ kindImage: '圖片',
1116
+ kindFile: '檔案',
1117
+ kindLink: '連結',
1118
+ chat: '聊天',
1119
+ copyUrl: '複製 URL',
1120
+ copyPath: '複製路徑'
1121
+ },
1122
+
1123
+ sidebar: {
1124
+ nav: {
1125
+ 'new-session': '新工作階段',
1126
+ skills: '技能與工具',
1127
+ messaging: '訊息平台',
1128
+ artifacts: '成品'
1129
+ },
1130
+ searchAria: '搜尋工作階段',
1131
+ searchPlaceholder: '搜尋工作階段…',
1132
+ clearSearch: '清除搜尋',
1133
+ noMatch: query => `沒有工作階段符合「${query}」。`,
1134
+ results: '結果',
1135
+ pinned: '已釘選',
1136
+ sessions: '工作階段',
1137
+ cronJobs: '排程任務',
1138
+ groupAriaGrouped: '以單一清單顯示工作階段',
1139
+ groupAriaUngrouped: '依工作區分組工作階段',
1140
+ groupTitleGrouped: '取消分組',
1141
+ groupTitleUngrouped: '依工作區分組',
1142
+ allPinned: '這裡的全部已釘選。取消釘選某個聊天即可在最近中顯示。',
1143
+ shiftClickHint: 'Shift + 點擊聊天以釘選 · 拖曳以重新排序',
1144
+ noWorkspace: '無工作區',
1145
+ newSessionIn: label => `在 ${label} 中新建工作階段`,
1146
+ reorderWorkspace: label => `重新排序工作區 ${label}`,
1147
+ showMoreIn: (count, label) => `在 ${label} 中再顯示 ${count} 個`,
1148
+ loading: '載入中…',
1149
+ loadMore: '載入更多',
1150
+ loadCount: step => `再載入 ${step} 個`,
1151
+ row: {
1152
+ pin: '釘選',
1153
+ unpin: '取消釘選',
1154
+ copyId: '複製 ID',
1155
+ export: '匯出',
1156
+ rename: '重新命名',
1157
+ archive: '封存',
1158
+ copyIdFailed: '無法複製工作階段 ID',
1159
+ actionsFor: title => `${title} 的動作`,
1160
+ sessionActions: '工作階段動作',
1161
+ sessionRunning: '工作階段執行中',
1162
+ needsInput: '需要您的輸入',
1163
+ waitingForAnswer: '等待您的回答',
1164
+ renamed: '已重新命名',
1165
+ renameFailed: '重新命名失敗',
1166
+ renameTitle: '重新命名工作階段',
1167
+ renameDesc: '為此聊天取一個好記的標題。留空則清除。',
1168
+ untitledPlaceholder: '未命名工作階段',
1169
+ ageNow: '剛才',
1170
+ ageDay: '天',
1171
+ ageHour: '時',
1172
+ ageMin: '分'
1173
+ }
1174
+ },
1175
+
1176
+ composer: {
1177
+ message: '訊息',
1178
+ wakingProfile: profile => `正在喚醒 ${profile}…`,
1179
+ placeholderStarting: '正在啟動 NasTech...',
1180
+ placeholderReconnecting: '正在重新連線至 NasTech…',
1181
+ placeholderFollowUp: '傳送後續訊息',
1182
+ newSessionPlaceholders: [
1183
+ '我們要建立什麼?',
1184
+ '給 NasTech 一個任務',
1185
+ '您在想什麼?',
1186
+ '描述您需要什麼',
1187
+ '我們該處理什麼?',
1188
+ '盡管問',
1189
+ '從一個目標開始'
1190
+ ],
1191
+ followUpPlaceholders: [
1192
+ '傳送後續訊息',
1193
+ '補充更多脈絡',
1194
+ '細化此請求',
1195
+ '下一步是什麼?',
1196
+ '繼續推進',
1197
+ '再深入一點',
1198
+ '調整或繼續'
1199
+ ],
1200
+ startVoice: '開始語音對話',
1201
+ queueMessage: '排隊訊息',
1202
+ stop: '停止',
1203
+ send: '傳送',
1204
+ speaking: '說話中',
1205
+ transcribing: '轉寫中',
1206
+ thinking: '思考中',
1207
+ muted: '已靜音',
1208
+ listening: '聆聽中',
1209
+ muteMic: '麥克風靜音',
1210
+ unmuteMic: '取消麥克風靜音',
1211
+ stopListening: '停止聆聽並傳送',
1212
+ stopShort: '停止',
1213
+ endConversation: '結束語音對話',
1214
+ endShort: '結束',
1215
+ stopDictation: '停止聽寫',
1216
+ transcribingDictation: '正在轉寫聽寫',
1217
+ voiceDictation: '語音聽寫',
1218
+ lookupLoading: '查詢中…',
1219
+ lookupNoMatches: '沒有相符項目。',
1220
+ lookupTry: '試試',
1221
+ lookupOr: '或',
1222
+ commonCommands: '常用指令',
1223
+ hotkeys: '快捷鍵',
1224
+ helpFooter: '開啟完整面板 · 退格鍵關閉',
1225
+ commandDescs: {
1226
+ '/help': '指令與快捷鍵的完整清單',
1227
+ '/clear': '開始新工作階段',
1228
+ '/resume': '繼續之前的工作階段',
1229
+ '/details': '控制對話記錄的詳細程度',
1230
+ '/copy': '複製所選內容或最後一條助手訊息',
1231
+ '/quit': '結束 NASTECH'
1232
+ },
1233
+ hotkeyDescs: {
1234
+ '@': '參照檔案、資料夾、URL、git',
1235
+ '/': '斜線指令面板',
1236
+ '?': '此快速說明(刪除以關閉)',
1237
+ Enter: '傳送 · Shift+Enter 換行',
1238
+ 'Cmd/Ctrl+K': '傳送下一個排隊的回合',
1239
+ 'Cmd/Ctrl+L': '重繪',
1240
+ Esc: '關閉彈出視窗 · 取消執行',
1241
+ '↑ / ↓': '循環彈出視窗 / 歷史記錄'
1242
+ },
1243
+ attachUrlTitle: '附加 URL',
1244
+ attachUrlDesc: 'NasTech 將擷取該頁面並作為此回合的脈絡。',
1245
+ urlPlaceholder: 'https://example.com/post',
1246
+ urlHintPre: '請輸入完整 URL,例如 ',
1247
+ attach: '附加',
1248
+ queued: count => `${count} 個排隊中`,
1249
+ attachmentOnly: '僅附件回合',
1250
+ emptyTurn: '空回合',
1251
+ attachments: count => `${count} 個附件`,
1252
+ editingInComposer: '在輸入框中編輯',
1253
+ editingQueuedInComposer: '在輸入框中編輯排隊回合',
1254
+ editQueued: '編輯排隊回合',
1255
+ sendQueuedNow: '立即傳送排隊回合',
1256
+ deleteQueued: '刪除排隊回合',
1257
+ previewUnavailable: '預覽不可用',
1258
+ previewLabel: label => `預覽 ${label}`,
1259
+ couldNotPreview: label => `無法預覽 ${label}`,
1260
+ removeAttachment: label => `移除 ${label}`,
1261
+ dictating: '聽寫中',
1262
+ preparingAudio: '正在準備音訊',
1263
+ speakingResponse: '正在朗讀回覆',
1264
+ readingAloud: '朗讀中',
1265
+ themeSuggestions: '桌面主題建議',
1266
+ noMatchingThemes: '沒有相符的主題。',
1267
+ themeTryPre: '試試 ',
1268
+ themeTryPost: '。',
1269
+ attachLabel: '附加',
1270
+ files: '檔案…',
1271
+ folder: '資料夾…',
1272
+ images: '圖片…',
1273
+ pasteImage: '貼上圖片',
1274
+ url: 'URL…',
1275
+ promptSnippets: '提示詞片段…',
1276
+ tipPre: '提示:輸入 ',
1277
+ tipPost: ' 以行內參照檔案。',
1278
+ snippetsTitle: '提示詞片段',
1279
+ snippetsDesc: '選擇一個起始提示詞放入輸入框。',
1280
+ dropFiles: '拖曳檔案以附加',
1281
+ dropSession: '拖曳以連結此聊天',
1282
+ snippets: {
1283
+ codeReview: {
1284
+ label: '程式碼審查',
1285
+ description: '審查目前的變更是否有回歸、遺漏的邊緣情況和缺少的測試。',
1286
+ text: '請審查這部分是否有錯誤、回歸和缺少的測試。'
1287
+ },
1288
+ implementationPlan: {
1289
+ label: '實作計劃',
1290
+ description: '在動程式碼之前先勾勒方案,讓 diff 保持聚焦。',
1291
+ text: '請在修改程式碼前制定一個簡潔的實作計劃。'
1292
+ },
1293
+ explainThis: {
1294
+ label: '解釋這段',
1295
+ description: '說明所選程式碼的運作方式,並連結到關鍵檔案。',
1296
+ text: '請解釋這是如何運作的,並告訴我關鍵檔案在哪裡。'
1297
+ }
1298
+ }
1299
+ },
1300
+
1301
+ statusStack: {
1302
+ agents: 'Agents',
1303
+ background: count => `${count} Background`,
1304
+ subagents: count => `${count} Subagent${count === 1 ? '' : 's'}`,
1305
+ todos: (done, total) => `Tasks ${done}/${total}`,
1306
+ running: 'Running',
1307
+ stop: 'Stop',
1308
+ dismiss: 'Dismiss',
1309
+ exit: code => `exit ${code}`,
1310
+ },
1311
+
1312
+ updates: {
1313
+ stages: {
1314
+ idle: '準備中…',
1315
+ prepare: '準備中…',
1316
+ fetch: '下載中…',
1317
+ pull: '快完成了…',
1318
+ pydeps: '收尾中…',
1319
+ restart: '正在重新啟動 NasTech…',
1320
+ manual: '從終端機更新',
1321
+ error: '更新已暫停'
1322
+ },
1323
+ checking: '正在檢查更新…',
1324
+ checkFailedTitle: '無法檢查更新',
1325
+ tryAgain: '重試',
1326
+ notAvailableTitle: '更新不可用',
1327
+ unsupportedMessage: '此版本的 NasTech 無法在應用程式內自行更新。',
1328
+ connectionRetry: '請檢查網路連線後重試。',
1329
+ latestBody: '您正在執行最新版本。',
1330
+ allSetTitle: '已是最新版本',
1331
+ availableTitle: '有可用更新',
1332
+ availableBody: '新版 NasTech 已可安裝。',
1333
+ updateNow: '立即更新',
1334
+ maybeLater: '稍後再說',
1335
+ moreChanges: count => `另有 ${count} 項變更。`,
1336
+ manualTitle: '從終端機更新',
1337
+ manualBody: '您是從命令列安裝的 NasTech,因此更新也需要在那裡執行。請將此指令貼到終端機:',
1338
+ manualPickedUp: '下次啟動 NasTech 時會使用新版本。',
1339
+ copy: '複製',
1340
+ copied: '已複製',
1341
+ done: '完成',
1342
+ applyingBody: 'NasTech 更新程式會在自己的視窗中接管,並在完成後重新開啟 NasTech。',
1343
+ applyingClose: 'NasTech 將關閉以套用更新。',
1344
+ errorTitle: '更新未完成',
1345
+ errorBody: '沒有資料遺失。您可以現在重試。',
1346
+ notNow: '暫不'
1347
+ },
1348
+
1349
+ install: {
1350
+ stageStates: {
1351
+ pending: '等待中',
1352
+ running: '安裝中',
1353
+ succeeded: '完成',
1354
+ skipped: '已略過',
1355
+ failed: '失敗'
1356
+ },
1357
+ oneTimeTitle: 'NasTech 需要一次性安裝',
1358
+ unsupportedDesc: platform =>
1359
+ `${platform} 暫不支援自動首次啟動安裝。請開啟終端機並執行下面的指令,然後重新啟動此應用程式。之後啟動會略過此步驟。`,
1360
+ installCommand: '安裝指令',
1361
+ copyCommand: '複製指令',
1362
+ viewDocs: '檢視安裝文件',
1363
+ installTo: '將安裝至',
1364
+ retryAfterRun: '我已執行 -- 重試',
1365
+ failedTitle: '安裝失敗',
1366
+ settingUpTitle: '正在設定 NasTech Agent',
1367
+ finishingTitle: '正在收尾',
1368
+ failedDesc:
1369
+ '某個安裝步驟失敗。在 Windows 上,如果另一個 NasTech CLI 或桌面執行個體正在執行,可能會出現這種情況。請停止正在執行的 NasTech 執行個體後重試。可查看下方的詳細資訊或 desktop 記錄中的完整記錄。',
1370
+ activeDesc:
1371
+ '這是一次性設定。NasTech 安裝程式正在下載相依套件並設定您的電腦。之後啟動會略過此步驟。',
1372
+ progress: (completed, total) => `${completed}/${total} 個步驟已完成`,
1373
+ currentStage: stage => ` -- 目前:${stage}`,
1374
+ fetchingManifest: '正在取得安裝程式 manifest...',
1375
+ error: '錯誤',
1376
+ hideOutput: '隱藏安裝程式輸出',
1377
+ showOutput: '顯示安裝程式輸出',
1378
+ lines: count => `${count} 行`,
1379
+ noOutput: '暫無輸出。',
1380
+ cancelling: '取消中...',
1381
+ cancelInstall: '取消安裝',
1382
+ transcriptSaved: '完整記錄已儲存至',
1383
+ copiedOutput: '已複製!',
1384
+ copyOutput: '複製輸出',
1385
+ reloadRetry: '重新載入並重試'
1386
+ },
1387
+
1388
+ onboarding: {
1389
+ headerTitle: '開始設定 NasTech Agent',
1390
+ headerDesc: '連線模型提供方即可開始聊天。大多數選項只需一次點擊。',
1391
+ preparingInstall: 'NasTech 正在完成安裝。首次執行通常不到一分鐘。',
1392
+ starting: '正在啟動 NasTech…',
1393
+ lookingUpProviders: '正在查詢提供方...',
1394
+ collapse: '收合',
1395
+ otherProviders: '其他提供方',
1396
+ haveApiKey: '我有 API 金鑰',
1397
+ chooseLater: '稍後再選擇提供方',
1398
+ recommended: '建議',
1399
+ connected: '已連線',
1400
+ featuredPitch: '一個訂閱,300+ 前沿模型 — 執行 NasTech 的建議方式',
1401
+ openRouterPitch: '一個金鑰,數百個模型 — 穩定的預設選擇',
1402
+ apiKeyOptions: {
1403
+ openrouter: { short: '一個金鑰,多個模型', description: '用一個金鑰存取數百個模型。適合新安裝的預設選擇。' },
1404
+ openai: { short: 'GPT 等級模型', description: '直接存取 OpenAI 模型。' },
1405
+ gemini: { short: 'Gemini 模型', description: '直接存取 Google Gemini 模型。' },
1406
+ xai: { short: 'Grok 模型', description: '直接存取 xAI Grok 模型。' },
1407
+ local: {
1408
+ short: '自託管',
1409
+ description: '將 NasTech 指向本機或自託管的 OpenAI 相容端點(vLLM、llama.cpp、Ollama 等)。'
1410
+ }
1411
+ },
1412
+ backToSignIn: '返回登入',
1413
+ getKey: '取得金鑰',
1414
+ replaceCurrent: '取代目前值',
1415
+ pasteApiKey: '貼上 API 金鑰',
1416
+ couldNotSave: '無法儲存憑證。',
1417
+ connecting: '連線中',
1418
+ update: '更新',
1419
+ flowSubtitles: {
1420
+ pkce: '開啟瀏覽器登入,然後回到這裡繼續',
1421
+ device_code: '在瀏覽器中開啟驗證頁面 — NasTech 會自動連線',
1422
+ loopback: '開啟瀏覽器登入 — NasTech 會自動連線',
1423
+ external: '先在終端機登入一次,然後回來繼續聊天'
1424
+ },
1425
+ startingSignIn: provider => `正在為 ${provider} 啟動登入...`,
1426
+ verifyingCode: provider => `正在透過 ${provider} 驗證您的代碼...`,
1427
+ connectedProvider: provider => `${provider} 已連線`,
1428
+ connectedPicking: provider => `${provider} 已連線。正在選擇預設模型...`,
1429
+ signInFailed: '登入失敗,請重試。',
1430
+ pickDifferentProvider: '選擇其他提供方',
1431
+ signInWith: provider => `使用 ${provider} 登入`,
1432
+ openedBrowser: provider => `已在瀏覽器中開啟 ${provider}。`,
1433
+ authorizeThere: '請在那裡授權 NasTech。',
1434
+ copyAuthCode: '複製授權碼並貼到下方。',
1435
+ pasteAuthCode: '貼上授權碼',
1436
+ reopenAuthPage: '重新開啟授權頁面',
1437
+ autoBrowser: provider =>
1438
+ `已在瀏覽器中開啟 ${provider}。請在那裡授權 NasTech,連線會自動完成,無需複製或貼上。`,
1439
+ reopenSignInPage: '重新開啟登入頁面',
1440
+ waitingAuthorize: '等待您授權...',
1441
+ externalPending: provider =>
1442
+ `${provider} 透過自己的 CLI 登入。請在終端機執行此指令,然後回來選擇「我已登入」:`,
1443
+ signedIn: '我已登入',
1444
+ deviceCodeOpened: provider => `已在瀏覽器中開啟 ${provider}。請在那裡輸入此代碼:`,
1445
+ reopenVerification: '重新開啟驗證頁面',
1446
+ copy: '複製',
1447
+ defaultModel: '預設模型',
1448
+ freeTier: '免費層',
1449
+ pro: 'Pro',
1450
+ free: '免費',
1451
+ price: (input, output) => `${input} 輸入 / ${output} 輸出 每 Mtok`,
1452
+ change: '變更',
1453
+ startChatting: '開始',
1454
+ docs: provider => `${provider} 文件`
1455
+ },
1456
+
1457
+ modelPicker: {
1458
+ title: '切換模型',
1459
+ current: '目前:',
1460
+ unknown: '(未知)',
1461
+ search: '篩選提供方和模型...',
1462
+ noModels: '找不到模型。',
1463
+ persistGlobalSession: '全域儲存(否則僅限此工作階段)',
1464
+ persistGlobal: '全域儲存',
1465
+ addProvider: '新增提供方',
1466
+ loadFailed: '無法載入模型',
1467
+ noAuthenticatedProviders: '沒有已驗證的提供方。',
1468
+ pro: 'Pro',
1469
+ proNeedsSubscription: 'Pro 模型需要付費 NasTech Portal 訂閱。',
1470
+ free: '免費',
1471
+ freeTier: '免費層',
1472
+ priceTitle: '每百萬 Token 的輸入/輸出價格'
1473
+ },
1474
+
1475
+ modelVisibility: {
1476
+ title: '模型',
1477
+ search: '搜尋模型',
1478
+ noAuthenticatedProviders: '沒有已驗證的提供方。',
1479
+ addProvider: '新增提供方…'
1480
+ },
1481
+
1482
+ shell: {
1483
+ windowControls: '視窗控制項',
1484
+ paneControls: '窗格控制項',
1485
+ appControls: '應用程式控制項',
1486
+ modelMenu: {
1487
+ search: '搜尋模型',
1488
+ noModels: '找不到模型',
1489
+ editModels: '編輯模型…',
1490
+ fast: '快速',
1491
+ medium: '中'
1492
+ },
1493
+ modelOptions: {
1494
+ noOptions: '此模型沒有可用選項',
1495
+ options: '選項',
1496
+ thinking: '思考',
1497
+ fast: '快速',
1498
+ effort: '推理強度',
1499
+ minimal: '最小',
1500
+ low: '低',
1501
+ medium: '中',
1502
+ high: '高',
1503
+ max: '最高',
1504
+ updateFailed: '模型選項更新失敗',
1505
+ fastFailed: '快速模式更新失敗'
1506
+ },
1507
+ gatewayMenu: {
1508
+ gateway: '閘道',
1509
+ connected: '已連線',
1510
+ connecting: '連線中',
1511
+ offline: '離線',
1512
+ inferenceReady: '推論已就緒',
1513
+ inferenceNotReady: '推論未就緒',
1514
+ checkingInference: '正在檢查推論',
1515
+ disconnected: '已中斷連線',
1516
+ openSystem: '開啟系統面板',
1517
+ connection: label => `連線:${label}`,
1518
+ recentActivity: '最近活動',
1519
+ viewAllLogs: '查看全部記錄 →',
1520
+ messagingPlatforms: '訊息平台'
1521
+ },
1522
+ statusbar: {
1523
+ unknown: '未知',
1524
+ restart: '重新啟動',
1525
+ update: '更新',
1526
+ updateInProgress: '更新中',
1527
+ commitsBehind: (count, branch) => `落後 ${branch} ${count} 個提交`,
1528
+ desktopVersion: version => `NasTech Desktop v${version}`,
1529
+ commit: sha => `提交 ${sha}`,
1530
+ branch: branch => `分支 ${branch}`,
1531
+ closeCommandCenter: '關閉命令中心',
1532
+ openCommandCenter: '開啟命令中心',
1533
+ gateway: '閘道',
1534
+ gatewayReady: '就緒',
1535
+ gatewayNeedsSetup: '需要設定',
1536
+ gatewayChecking: '檢查中',
1537
+ gatewayConnecting: '連線中',
1538
+ gatewayOffline: '離線',
1539
+ gatewayTitle: 'NasTech 推論閘道狀態',
1540
+ agents: '代理',
1541
+ closeAgents: '關閉代理',
1542
+ openAgents: '開啟代理',
1543
+ subagents: count => `${count} 個子代理`,
1544
+ failed: count => `${count} 個失敗`,
1545
+ running: count => `${count} 個執行中`,
1546
+ cron: '排程',
1547
+ openCron: '開啟排程工作',
1548
+ turnRunning: '執行中',
1549
+ currentTurnElapsed: '目前回合已用時間',
1550
+ contextUsage: '上下文使用量',
1551
+ session: '工作階段',
1552
+ runtimeSessionElapsed: '執行時工作階段已用時間',
1553
+ yoloOn: 'YOLO 已開啟 — 自動核准危險指令。點擊關閉。',
1554
+ yoloOff: 'YOLO 已關閉 — 點擊自動核准危險指令。',
1555
+ modelNone: '無',
1556
+ noModel: '無模型',
1557
+ switchModel: '切換模型',
1558
+ openModelPicker: '開啟模型選擇器',
1559
+ modelTitle: (provider, model) => `模型 · ${provider}:${model}`,
1560
+ providerModelTitle: (provider, model) => `${provider} · ${model}`
1561
+ }
1562
+ },
1563
+
1564
+ rightSidebar: {
1565
+ aria: '右側邊欄',
1566
+ panelsAria: '右側邊欄面板',
1567
+ files: '檔案系統',
1568
+ terminal: '終端機',
1569
+ noFolderSelected: '未選擇資料夾',
1570
+ changeCwdTitle: '變更工作目錄',
1571
+ folderTip: cwd => `${cwd} — 點擊以變更資料夾`,
1572
+ openFolder: '開啟資料夾',
1573
+ refreshTree: '重新整理檔案樹',
1574
+ collapseAll: '收合所有資料夾',
1575
+ previewUnavailable: '預覽不可用',
1576
+ couldNotPreview: path => `無法預覽 ${path}`,
1577
+ noProjectTitle: '沒有專案',
1578
+ noProjectBody: '從狀態列設定工作目錄後即可瀏覽檔案。',
1579
+ unreadableTitle: '無法讀取',
1580
+ unreadableBody: error => `無法讀取此資料夾 (${error})。`,
1581
+ emptyTitle: '空資料夾',
1582
+ emptyBody: '此資料夾是空的。',
1583
+ treeErrorTitle: '檔案樹錯誤',
1584
+ treeErrorBody: '檔案樹在渲染此資料夾時發生錯誤。',
1585
+ tryAgain: '重試',
1586
+ loadingTree: '正在載入檔案樹',
1587
+ loadingFiles: '正在載入檔案',
1588
+ terminalFocus: '聚焦終端機檢視',
1589
+ terminalSplit: '返回分割檢視',
1590
+ addToChat: '新增至聊天',
1591
+ remotePickerTitle: '選擇遠端資料夾'
1592
+ },
1593
+
1594
+ preview: {
1595
+ tab: '預覽',
1596
+ closeTab: label => `關閉 ${label}`,
1597
+ closePane: '關閉預覽窗格',
1598
+ loading: '正在載入預覽',
1599
+ unavailable: '預覽不可用',
1600
+ opening: '開啟中...',
1601
+ hide: '隱藏',
1602
+ openPreview: '開啟預覽',
1603
+ sourceLineTitle: '點擊選取 · shift 點擊擴展 · 拖曳至輸入框',
1604
+ source: '原始碼',
1605
+ renderedPreview: '預覽',
1606
+ unknownSize: '大小未知',
1607
+ binaryTitle: '這看起來像二進位檔案',
1608
+ binaryBody: label => `預覽 ${label} 可能會顯示無法讀取的文字。`,
1609
+ largeTitle: '此檔案較大',
1610
+ largeBody: (label, size) => `${label} 大小為 ${size}。NasTech 只會顯示前 512 KB。`,
1611
+ previewAnyway: '仍然預覽',
1612
+ truncated: '顯示前 512 KB。',
1613
+ noInlineTitle: '沒有行內預覽',
1614
+ noInlineBody: mimeType => `${mimeType || '此檔案類型'} 仍可作為脈絡附件。`,
1615
+ console: {
1616
+ deselect: '取消選取項目',
1617
+ select: '選取項目',
1618
+ copyFailed: '無法複製主控台輸出',
1619
+ copyEntry: '複製此項目',
1620
+ sendEntry: '將此項目傳送至聊天',
1621
+ messages: count => `${count} 則主控台訊息`,
1622
+ resize: '調整預覽主控台大小',
1623
+ title: '預覽主控台',
1624
+ selected: count => `已選取 ${count} 個`,
1625
+ sendToChat: '傳送至聊天',
1626
+ copySelected: '複製所選至剪貼簿',
1627
+ copyAll: '全部複製至剪貼簿',
1628
+ copy: '複製',
1629
+ clear: '清除',
1630
+ empty: '暫無主控台訊息。',
1631
+ promptHeader: '預覽主控台:',
1632
+ sentTitle: '已傳送至聊天',
1633
+ sentMessage: count => `已將 ${count} 條記錄新增至輸入框`
1634
+ },
1635
+ web: {
1636
+ appFailedToBoot: '預覽應用程式啟動失敗',
1637
+ serverNotFound: '找不到伺服器',
1638
+ failedToLoad: '預覽載入失敗',
1639
+ tryAgain: '重試',
1640
+ restarting: 'NasTech 正在重新啟動...',
1641
+ askRestart: '請 NasTech 重新啟動伺服器',
1642
+ lookingRestart: taskId => `NasTech 正在尋找要重新啟動的預覽伺服器 (${taskId})`,
1643
+ restartingTitle: '正在重新啟動預覽伺服器',
1644
+ restartingMessage: 'NasTech 正在背景執行。可在預覽主控台查看進度。',
1645
+ startRestartFailed: message => `無法啟動伺服器重新啟動:${message}`,
1646
+ restartFailed: '伺服器重新啟動失敗',
1647
+ hideConsole: '隱藏預覽主控台',
1648
+ showConsole: '顯示預覽主控台',
1649
+ hideDevTools: '隱藏預覽 DevTools',
1650
+ openDevTools: '開啟預覽 DevTools',
1651
+ finishedRestarting: message =>
1652
+ `NasTech 已完成預覽伺服器重新啟動${message ? `:${message}` : ''}`,
1653
+ failedRestarting: message => `伺服器重新啟動失敗:${message}`,
1654
+ unknownError: '未知錯誤',
1655
+ restartedTitle: '預覽伺服器已重新啟動',
1656
+ reloadingNow: '正在重新載入預覽。',
1657
+ restartFailedTitle: '預覽重新啟動失敗',
1658
+ restartFailedMessage: 'NasTech 無法重新啟動伺服器。',
1659
+ stillWorking:
1660
+ 'NasTech 仍在執行,但尚未收到重新啟動結果。伺服器指令可能正在前台執行。',
1661
+ workspaceReloading: '工作區已變更,正在重新載入預覽',
1662
+ fileChanged: url => `檔案已變更,正在重新載入預覽:${url}`,
1663
+ filesChanged: (count, url) => `${count} 個檔案變更,正在重新載入預覽:${url}`,
1664
+ watchFailed: message => `無法監看預覽檔案:${message}`,
1665
+ moduleMimeDescription:
1666
+ '模組指令碼使用了錯誤的 MIME 類型。這通常表示靜態檔案伺服器正在服務 Vite/React 應用程式,而不是專案開發伺服器。',
1667
+ loadFailedConsole: (code, message) => `載入失敗${code ? ` (${code})` : ''}:${message}`,
1668
+ unreachableDescription: '無法連線至預覽頁面。',
1669
+ openTarget: url => `開啟 ${url}`,
1670
+ fallbackTitle: '預覽'
1671
+ }
1672
+ },
1673
+
1674
+ assistant: {
1675
+ thread: {
1676
+ loadingSession: '正在載入工作階段',
1677
+ loadingResponse: 'NasTech 正在載入回覆',
1678
+ thinking: '思考中',
1679
+ today: time => `今天,${time}`,
1680
+ yesterday: time => `昨天,${time}`,
1681
+ copy: '複製',
1682
+ refresh: '重新整理',
1683
+ moreActions: '更多動作',
1684
+ branchNewChat: '在新聊天中分支',
1685
+ readAloudFailed: '朗讀失敗',
1686
+ preparingAudio: '正在準備音訊...',
1687
+ stopReading: '停止朗讀',
1688
+ readAloud: '朗讀',
1689
+ editMessage: '編輯訊息',
1690
+ stop: '停止',
1691
+ editableCheckpoint: '可編輯的檢查點',
1692
+ restorePrevious: '還原至上一個檢查點',
1693
+ restoreCheckpoint: '還原檢查點',
1694
+ restoreNext: '還原至下一個檢查點',
1695
+ goForward: '前進',
1696
+ sendEdited: '傳送編輯後的訊息',
1697
+ scrollToBottom: '捲動至底部'
1698
+ },
1699
+ approval: {
1700
+ gatewayDisconnected: 'NasTech 閘道未連線',
1701
+ sendFailed: '無法傳送核准回應',
1702
+ run: '執行',
1703
+ moreOptions: '更多核准選項',
1704
+ allowSession: '允許本工作階段',
1705
+ alwaysAllowMenu: '一律允許…',
1706
+ jumpToApproval: '需要審核',
1707
+ reject: '拒絕',
1708
+ alwaysTitle: '一律允許此指令?',
1709
+ alwaysDescription: pattern =>
1710
+ `這會將「${pattern}」模式加入永久允許清單(~/.NASTECH/config.yaml)。NasTech 對類似指令將不再詢問,包括目前工作階段和未來工作階段。`,
1711
+ alwaysAllow: '一律允許'
1712
+ },
1713
+ clarify: {
1714
+ notReady: '澄清請求尚未就緒',
1715
+ gatewayDisconnected: 'NasTech 閘道未連線',
1716
+ sendFailed: '無法傳送澄清回應',
1717
+ loadingQuestion: '正在載入問題…',
1718
+ other: '其他(輸入您的答案)',
1719
+ placeholder: '輸入您的答案…',
1720
+ shortcut: '⌘/Ctrl + Enter 傳送',
1721
+ back: '返回',
1722
+ skip: '略過',
1723
+ send: '傳送'
1724
+ },
1725
+ tool: {
1726
+ code: '程式碼',
1727
+ copyCode: '複製程式碼',
1728
+ renderingImage: '正在渲染圖片',
1729
+ copyOutput: '複製輸出',
1730
+ copyCommand: '複製指令',
1731
+ copyContent: '複製內容',
1732
+ copyUrl: '複製 URL',
1733
+ copyResults: '複製結果',
1734
+ copyQuery: '複製查詢',
1735
+ copyFile: '複製檔案',
1736
+ copyPath: '複製路徑',
1737
+ outputAlt: '工具輸出',
1738
+ rawResponse: '原始回應',
1739
+ copyActivity: '複製活動',
1740
+ recoveredOne: '在 1 個失敗步驟後已復原',
1741
+ recoveredMany: count => `在 ${count} 個失敗步驟後已復原`,
1742
+ failedOne: '1 個步驟失敗',
1743
+ failedMany: count => `${count} 個步驟失敗`,
1744
+ statusRunning: '執行中',
1745
+ statusError: '錯誤',
1746
+ statusRecovered: '已復原',
1747
+ statusDone: '完成'
1748
+ }
1749
+ },
1750
+
1751
+ prompts: {
1752
+ gatewayDisconnected: 'NasTech 閘道未連線',
1753
+ sudoSendFailed: '無法傳送 sudo 密碼',
1754
+ secretSendFailed: '無法傳送密鑰',
1755
+ sudoTitle: '管理員密碼',
1756
+ sudoDesc: 'NasTech 需要您的 sudo 密碼來執行特權指令。它只會傳送給您的本機代理。',
1757
+ sudoPlaceholder: 'sudo 密碼',
1758
+ secretTitle: '需要密鑰',
1759
+ secretDesc: 'NasTech 需要一個憑證才能繼續。',
1760
+ secretPlaceholder: '密鑰值'
1761
+ },
1762
+
1763
+ desktop: {
1764
+ audioReadFailed: '無法讀取錄製的音訊',
1765
+ sessionUnavailable: '工作階段不可用',
1766
+ createSessionFailed: '無法建立新工作階段',
1767
+ promptFailed: '提示詞傳送失敗',
1768
+ providerCredentialRequired: '傳送第一則訊息前請先新增提供方憑證。',
1769
+ emptySlashCommand: '空的斜線指令',
1770
+ desktopCommands: '桌面端指令',
1771
+ skillCommandsAvailable: count => `${count} 個技能指令可用。`,
1772
+ warningLine: message => `警告:${message}`,
1773
+ yoloArmed: '此聊天已啟用 YOLO',
1774
+ yoloOff: 'YOLO 已關閉',
1775
+ yoloSystem: active => `此工作階段 YOLO ${active ? '已開啟' : '已關閉'}`,
1776
+ yoloTitle: 'YOLO',
1777
+ yoloToggleFailed: '無法切換 YOLO',
1778
+ profileStatus: current =>
1779
+ `設定檔:${current}。使用 /profile <name> 或「新工作階段」選擇器在其他設定檔中開始聊天。`,
1780
+ unknownProfile: '未知設定檔',
1781
+ noProfileNamed: (target, available) => `沒有名為「${target}」的設定檔。可用的:${available}`,
1782
+ newChatsProfile: name => `新聊天將使用設定檔 ${name}。`,
1783
+ setProfileFailed: '設定設定檔失敗',
1784
+ sttDisabled: '設定中已停用語音轉文字。',
1785
+ stopFailed: '停止失敗',
1786
+ regenerateFailed: '重新生成失敗',
1787
+ editFailed: '編輯失敗',
1788
+ resumeFailed: '繼續失敗',
1789
+ nothingToBranch: '沒有可分支的內容',
1790
+ branchNeedsChat: '分支前請先開始或繼續一個聊天。',
1791
+ sessionBusy: '工作階段忙碌中',
1792
+ branchStopCurrent: '分支此聊天前請先停止目前回合。',
1793
+ branchNoText: '此訊息沒有可用於分支的文字。',
1794
+ branchTitle: '分支',
1795
+ branchFailed: '分支失敗',
1796
+ deleteFailed: '刪除失敗',
1797
+ archived: '已封存',
1798
+ archiveFailed: '封存失敗',
1799
+ cwdChangeFailed: '工作目錄變更失敗',
1800
+ cwdStagedTitle: '工作目錄已暫存',
1801
+ cwdStagedMessage: '重新啟動桌面後端後,工作目錄變更才會套用至此作用中工作階段。',
1802
+ modelSwitchFailed: '模型切換失敗',
1803
+ sessionExported: '工作階段已匯出',
1804
+ sessionExportFailed: '無法匯出工作階段',
1805
+ imageSaved: '圖片已儲存',
1806
+ downloadStarted: '下載已開始',
1807
+ restartToUseSaveImage: '重新啟動 NasTech Desktop 後可使用儲存圖片。',
1808
+ restartToSaveImages: '重新啟動 NasTech Desktop 以儲存圖片',
1809
+ imageDownloadFailed: '圖片下載失敗',
1810
+ openImage: '開啟圖片',
1811
+ downloadImage: '下載圖片',
1812
+ savingImage: '正在儲存圖片',
1813
+ imagePreviewFailed: '圖片預覽失敗',
1814
+ imageAttach: '附加圖片',
1815
+ imageWriteFailed: '無法將圖片寫入磁碟。',
1816
+ imageAttachFailed: '附加圖片失敗',
1817
+ attachImages: '附加圖片',
1818
+ clipboard: '剪貼簿',
1819
+ noClipboardImage: '剪貼簿中沒有圖片',
1820
+ clipboardPasteFailed: '剪貼簿貼上失敗',
1821
+ dropFiles: '拖曳檔案'
1822
+ },
1823
+
1824
+ errors: {
1825
+ genericFailure: '發生錯誤',
1826
+ boundaryTitle: '介面出現問題',
1827
+ boundaryDesc: '此檢視遇到意外錯誤。您的聊天和設定是安全的。',
1828
+ reloadWindow: '重新載入視窗',
1829
+ openLogs: '開啟記錄'
1830
+ },
1831
+
1832
+ ui: {
1833
+ search: {
1834
+ clear: '清除搜尋'
1835
+ },
1836
+ pagination: {
1837
+ label: '分頁',
1838
+ previous: '上一頁',
1839
+ previousAria: '前往上一頁',
1840
+ next: '下一頁',
1841
+ nextAria: '前往下一頁'
1842
+ },
1843
+ sidebar: {
1844
+ title: '側邊欄',
1845
+ description: '顯示行動裝置側邊欄。',
1846
+ toggle: '切換側邊欄'
1847
+ }
1848
+ }
1849
+ })