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
package/src/i18n/zh.ts ADDED
@@ -0,0 +1,1923 @@
1
+ import { defineFieldCopy } from '@/app/settings/field-copy'
2
+
3
+ import type { Translations } from './types'
4
+
5
+ export const zh: Translations = {
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 桌面版已就绪',
47
+ desktopBootFailedWithMessage: message => `桌面启动失败:${message}`,
48
+ steps: {
49
+ connectingGateway: '正在连接桌面网关',
50
+ loadingSettings: '正在加载 NasTech 设置',
51
+ loadingSessions: '正在加载最近会话',
52
+ startingDesktopConnection: '正在启动桌面连接',
53
+ startingNasTechDesktop: '正在启动 NasTech 桌面版…'
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 key (401)。',
106
+ methodNotAllowed: '桌面后端拒绝了该请求 (405 Method Not Allowed)。请尝试重启 NasTech Desktop。',
107
+ microphonePermission: '麦克风权限已被拒绝。',
108
+ openaiRejectedApiKey: 'OpenAI 拒绝了该 API key。',
109
+ openaiRejectedApiKeyWithStatus: status => `OpenAI 拒绝了该 API key (${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
+ openKeybinds: '键盘快捷键'
146
+ },
147
+
148
+ keybinds: {
149
+ title: '键盘快捷键',
150
+ subtitle: open => `点击快捷键即可重新绑定 · ${open} 可重新打开此面板。`,
151
+ rebind: '重新绑定',
152
+ reset: '恢复默认',
153
+ resetAll: '全部重置',
154
+ pressKey: '请按下按键…',
155
+ set: '设置',
156
+ conflictWith: label => `已绑定到“${label}”`,
157
+ categories: {
158
+ composer: '输入框',
159
+ profiles: '配置',
160
+ session: '会话',
161
+ navigation: '导航',
162
+ view: '视图'
163
+ },
164
+ actions: {
165
+ 'keybinds.openPanel': '打开键盘快捷键',
166
+ 'nav.commandPalette': '打开命令面板',
167
+ 'nav.commandCenter': '打开命令中心',
168
+ 'nav.settings': '打开设置',
169
+ 'nav.profiles': '打开配置',
170
+ 'nav.skills': '打开技能',
171
+ 'nav.messaging': '打开消息',
172
+ 'nav.artifacts': '打开制品',
173
+ 'nav.cron': '打开定时任务',
174
+ 'nav.agents': '打开智能体',
175
+ 'session.new': '新建会话',
176
+ 'session.next': '下一个会话',
177
+ 'session.prev': '上一个会话',
178
+ 'session.focusSearch': '搜索会话',
179
+ 'session.togglePin': '固定/取消固定当前会话',
180
+ 'composer.focus': '聚焦输入框',
181
+ 'composer.modelPicker': '打开模型选择器',
182
+ 'view.toggleSidebar': '切换会话侧边栏',
183
+ 'view.toggleRightSidebar': '切换文件浏览器',
184
+ 'view.showFiles': '显示文件浏览器',
185
+ 'view.showTerminal': '显示终端',
186
+ 'view.terminalSelection': '将终端选区发送到输入框',
187
+ 'view.closePreviewTab': '关闭预览标签',
188
+ 'view.flipPanes': '交换侧边栏位置',
189
+ 'appearance.toggleMode': '切换浅色/深色',
190
+ 'profile.default': '切换到默认配置',
191
+ 'profile.switch.1': '切换到配置 1',
192
+ 'profile.switch.2': '切换到配置 2',
193
+ 'profile.switch.3': '切换到配置 3',
194
+ 'profile.switch.4': '切换到配置 4',
195
+ 'profile.switch.5': '切换到配置 5',
196
+ 'profile.switch.6': '切换到配置 6',
197
+ 'profile.switch.7': '切换到配置 7',
198
+ 'profile.switch.8': '切换到配置 8',
199
+ 'profile.switch.9': '切换到配置 9',
200
+ 'profile.switch.10': '切换到配置 10',
201
+ 'profile.switch.11': '切换到配置 11',
202
+ 'profile.switch.12': '切换到配置 12',
203
+ 'profile.switch.13': '切换到配置 13',
204
+ 'profile.switch.14': '切换到配置 14',
205
+ 'profile.switch.15': '切换到配置 15',
206
+ 'profile.switch.16': '切换到配置 16',
207
+ 'profile.switch.17': '切换到配置 17',
208
+ 'profile.switch.18': '切换到配置 18',
209
+ 'profile.next': '下一个配置',
210
+ 'profile.prev': '上一个配置',
211
+ 'profile.toggleAll': '切换全部配置视图',
212
+ 'profile.create': '创建配置',
213
+ 'composer.send': '发送消息',
214
+ 'composer.newline': '插入换行',
215
+ 'composer.steer': '引导正在运行的回合',
216
+ 'composer.sendQueued': '发送下一条排队消息',
217
+ 'composer.mention': '引用文件、文件夹、网址',
218
+ 'composer.slash': '斜杠命令面板',
219
+ 'composer.help': '快速帮助',
220
+ 'composer.history': '切换弹窗/历史',
221
+ 'composer.cancel': '关闭弹窗·取消运行'
222
+ }
223
+ },
224
+
225
+ language: {
226
+ label: '语言',
227
+ description: '选择桌面界面的语言。',
228
+ saving: '正在保存语言…',
229
+ saveError: '语言更新失败',
230
+ switchTo: '切换语言',
231
+ searchPlaceholder: '搜索语言…',
232
+ noResults: '未找到语言'
233
+ },
234
+
235
+ settings: {
236
+ closeSettings: '关闭设置',
237
+ exportConfig: '导出配置',
238
+ importConfig: '导入配置',
239
+ resetToDefaults: '恢复默认',
240
+ resetConfirm: '将所有设置恢复为 NasTech 默认值?',
241
+ exportFailed: '导出失败',
242
+ resetFailed: '重置失败',
243
+ nav: {
244
+ providers: '提供方',
245
+ providerAccounts: '账号',
246
+ providerApiKeys: 'API 密钥',
247
+ gateway: '网关',
248
+ apiKeys: '工具与密钥',
249
+ keysTools: '工具',
250
+ keysSettings: '设置',
251
+ mcp: 'MCP',
252
+ archivedChats: '已归档对话',
253
+ about: '关于'
254
+ },
255
+ sections: {
256
+ model: '模型',
257
+ chat: '对话',
258
+ appearance: '外观',
259
+ workspace: '工作区',
260
+ safety: '安全',
261
+ memory: '记忆与上下文',
262
+ voice: '语音',
263
+ advanced: '高级'
264
+ },
265
+ searchPlaceholder: {
266
+ about: '关于 NasTech Desktop',
267
+ config: '搜索设置…',
268
+ gateway: '网关连接…',
269
+ keys: '搜索 API 密钥…',
270
+ mcp: '搜索 MCP 服务器…',
271
+ sessions: '搜索已归档会话…'
272
+ },
273
+ modeOptions: {
274
+ light: { label: '明亮', description: '明亮的桌面界面' },
275
+ dark: { label: '暗色', description: '低眩光工作区' },
276
+ system: { label: '跟随系统', description: '跟随系统外观' }
277
+ },
278
+ appearance: {
279
+ title: '外观',
280
+ intro: '这些是仅桌面端的显示偏好。模式控制明暗;主题控制强调色与对话界面样式。',
281
+ colorMode: '颜色模式',
282
+ colorModeDesc: '选择固定模式,或让 NasTech 跟随系统设置。',
283
+ toolViewTitle: '工具调用显示',
284
+ toolViewDesc: '产品模式隐藏原始工具数据;技术模式显示完整输入/输出。',
285
+ product: '产品',
286
+ productDesc: '易读的工具活动与简洁摘要。',
287
+ technical: '技术',
288
+ technicalDesc: '包含原始工具参数/结果及底层细节。',
289
+ themeTitle: '主题',
290
+ themeDesc: '仅桌面端调色板。所选模式叠加其上。'
291
+ },
292
+ fieldLabels: defineFieldCopy({
293
+ model: '默认模型',
294
+ modelContextLength: '上下文窗口',
295
+ fallbackProviders: '备用模型',
296
+ toolsets: '启用的工具集',
297
+ timezone: '时区',
298
+ display: {
299
+ personality: '人格',
300
+ showReasoning: '推理过程块'
301
+ },
302
+ agent: {
303
+ maxTurns: '最大智能体步数',
304
+ imageInputMode: '图片附件',
305
+ apiMaxRetries: 'API 重试次数',
306
+ serviceTier: '服务等级',
307
+ toolUseEnforcement: '工具调用强制'
308
+ },
309
+ terminal: {
310
+ cwd: '工作目录',
311
+ backend: '执行后端',
312
+ timeout: '命令超时',
313
+ persistentShell: '持久化 Shell',
314
+ envPassthrough: '环境变量透传'
315
+ },
316
+ fileReadMaxChars: '文件读取上限',
317
+ toolOutput: {
318
+ maxBytes: '终端输出上限',
319
+ maxLines: '文件分页上限',
320
+ maxLineLength: '行长度上限'
321
+ },
322
+ codeExecution: {
323
+ mode: '代码执行模式'
324
+ },
325
+ approvals: {
326
+ mode: '审批模式',
327
+ timeout: '审批超时',
328
+ mcpReloadConfirm: '确认 MCP 重载'
329
+ },
330
+ commandAllowlist: '命令白名单',
331
+ security: {
332
+ redactSecrets: '隐去密钥',
333
+ allowPrivateUrls: '允许私有 URL'
334
+ },
335
+ browser: {
336
+ allowPrivateUrls: '浏览器私有 URL',
337
+ autoLocalForPrivateUrls: '私有 URL 使用本地浏览器'
338
+ },
339
+ checkpoints: {
340
+ enabled: '文件检查点',
341
+ maxSnapshots: '检查点上限'
342
+ },
343
+ voice: {
344
+ recordKey: '语音快捷键',
345
+ maxRecordingSeconds: '最长录音时长',
346
+ autoTts: '朗读回复'
347
+ },
348
+ stt: {
349
+ enabled: '语音转文字',
350
+ provider: '语音转文字提供方',
351
+ local: {
352
+ model: '本地转写模型',
353
+ language: '转写语言'
354
+ },
355
+ elevenlabs: {
356
+ modelId: 'ElevenLabs STT 模型',
357
+ languageCode: 'ElevenLabs 语言',
358
+ tagAudioEvents: '标记音频事件',
359
+ diarize: '说话人区分'
360
+ }
361
+ },
362
+ tts: {
363
+ provider: '文字转语音提供方',
364
+ edge: {
365
+ voice: 'Edge 语音'
366
+ },
367
+ openai: {
368
+ model: 'OpenAI TTS 模型',
369
+ voice: 'OpenAI 语音'
370
+ },
371
+ elevenlabs: {
372
+ voiceId: 'ElevenLabs 语音',
373
+ modelId: 'ElevenLabs 模型'
374
+ }
375
+ },
376
+ memory: {
377
+ memoryEnabled: '持久记忆',
378
+ userProfileEnabled: '用户画像',
379
+ memoryCharLimit: '记忆预算',
380
+ userCharLimit: '画像预算',
381
+ provider: '记忆提供方'
382
+ },
383
+ context: {
384
+ engine: '上下文引擎'
385
+ },
386
+ compression: {
387
+ enabled: '自动压缩',
388
+ threshold: '压缩阈值',
389
+ targetRatio: '压缩目标',
390
+ protectLastN: '保护最近消息'
391
+ },
392
+ delegation: {
393
+ model: '子智能体模型',
394
+ provider: '子智能体提供方',
395
+ maxIterations: '子智能体轮次上限',
396
+ maxConcurrentChildren: '并行子智能体',
397
+ childTimeoutSeconds: '子智能体超时',
398
+ reasoningEffort: '子智能体推理强度'
399
+ },
400
+ updates: {
401
+ nonInteractiveLocalChanges: '应用内更新本地更改'
402
+ }
403
+ }),
404
+ fieldDescriptions: defineFieldCopy({
405
+ model: '用于新对话,除非你在输入框中选择其他模型。',
406
+ modelContextLength: '保持为 0 则使用所选模型检测到的上下文窗口。',
407
+ fallbackProviders: '默认模型失败时尝试的备用 provider:model 条目。',
408
+ display: {
409
+ personality: '新会话的默认助手风格。',
410
+ showReasoning: '当后端提供推理内容时予以显示。'
411
+ },
412
+ timezone: '当 NasTech 需要本地时间上下文时使用。留空则使用系统时区。',
413
+ agent: {
414
+ imageInputMode: '控制图片附件如何发送给模型。',
415
+ maxTurns: 'NasTech 停止一次运行前工具调用轮次的上限。'
416
+ },
417
+ terminal: {
418
+ cwd: '工具与终端操作的默认项目目录。',
419
+ persistentShell: '当后端支持时,在命令之间保留 Shell 状态。',
420
+ envPassthrough: '传入工具执行的环境变量。'
421
+ },
422
+ codeExecution: {
423
+ mode: '代码执行被限定到当前项目的严格程度。'
424
+ },
425
+ fileReadMaxChars: 'NasTech 单次文件读取可读取的最大字符数。',
426
+ approvals: {
427
+ mode: 'NasTech 如何处理需要显式审批的命令。',
428
+ timeout: '审批提示在超时前等待的时长。'
429
+ },
430
+ security: {
431
+ redactSecrets: '尽可能从模型可见内容中隐藏检测到的密钥。'
432
+ },
433
+ checkpoints: {
434
+ enabled: '在文件编辑前创建可回滚的快照。'
435
+ },
436
+ memory: {
437
+ memoryEnabled: '保存有助于未来会话的持久记忆。',
438
+ userProfileEnabled: '维护一份精简的用户偏好画像。'
439
+ },
440
+ context: {
441
+ engine: '在接近上下文上限时管理长对话的策略。'
442
+ },
443
+ compression: {
444
+ enabled: '当对话变大时对较早的上下文进行摘要。'
445
+ },
446
+ voice: {
447
+ autoTts: '自动朗读助手回复。'
448
+ },
449
+ stt: {
450
+ enabled: '启用本地或提供方支持的语音转写。',
451
+ elevenlabs: {
452
+ languageCode: '可选的 ISO-639-3 语言代码。留空让 ElevenLabs 自动检测。'
453
+ }
454
+ },
455
+ updates: {
456
+ nonInteractiveLocalChanges:
457
+ 'NasTech 从应用内更新时(无终端提示),保留本地源码修改(暂存)或丢弃(放弃)。通过终端更新时始终会询问。'
458
+ }
459
+ }),
460
+ about: {
461
+ heading: 'NasTech Desktop',
462
+ version: value => `版本 ${value}`,
463
+ versionUnavailable: '版本不可用',
464
+ updates: '更新',
465
+ checkNow: '立即检查',
466
+ checking: '检查中…',
467
+ seeWhatsNew: '查看新增内容',
468
+ releaseNotes: '发行说明',
469
+ onLatest: '你已是最新版本。',
470
+ installing: '正在安装更新。',
471
+ cantUpdate: '此版本无法在应用内自我更新。',
472
+ cantReach: '无法连接更新服务器。',
473
+ tapCheck: '点击"立即检查"以查找更新。',
474
+ updateReady: count => `已准备好新更新 (包含 ${count} 项更改)。`,
475
+ lastChecked: age => `上次检查:${age}`,
476
+ justNowSuffix: ' · 刚刚',
477
+ automaticUpdates: '自动更新',
478
+ automaticUpdatesDesc: 'NasTech 会在后台自动检查更新,并在有可用更新时通知你。',
479
+ branchCommit: (branch, commit) => `分支 ${branch} · 提交 ${commit}`,
480
+ never: '从未',
481
+ justNow: '刚刚',
482
+ minAgo: count => `${count} 分钟前`,
483
+ hoursAgo: count => `${count} 小时前`,
484
+ daysAgo: count => `${count} 天前`
485
+ },
486
+ config: {
487
+ none: '无',
488
+ noneParen: '(无)',
489
+ notSet: '未设置',
490
+ commaSeparated: '逗号分隔的值',
491
+ loading: '正在加载 NasTech 配置...',
492
+ emptyTitle: '无可配置项',
493
+ emptyDesc: '此分区没有可调整的设置。',
494
+ failedLoad: '设置加载失败',
495
+ autosaveFailed: '自动保存失败',
496
+ imported: '配置已导入',
497
+ invalidJson: '配置 JSON 无效'
498
+ },
499
+ credentials: {
500
+ pasteKey: '粘贴密钥',
501
+ pasteLabelKey: label => `粘贴 ${label} 密钥`,
502
+ optional: '可选',
503
+ enterValueFirst: '请先输入一个值。',
504
+ couldNotSave: '无法保存凭据。',
505
+ remove: '移除',
506
+ or: '或',
507
+ escToCancel: '按 esc 取消',
508
+ getKey: '获取密钥',
509
+ saving: '保存中'
510
+ },
511
+ envActions: {
512
+ actionsFor: label => `${label} 的操作`,
513
+ credentialActions: '凭据操作',
514
+ docs: '文档',
515
+ hideValue: '隐藏值',
516
+ revealValue: '显示值',
517
+ replace: '替换',
518
+ set: '设置',
519
+ clear: '清除'
520
+ },
521
+ gateway: {
522
+ loading: '正在加载网关设置...',
523
+ unavailableTitle: '网关设置不可用',
524
+ unavailableDesc: '桌面 IPC 桥未暴露网关设置。',
525
+ title: '网关连接',
526
+ envOverride: '环境变量覆盖',
527
+ intro:
528
+ 'NasTech Desktop 默认会启动自己的本地网关。当你希望此应用控制另一台机器上或可信代理后的现有 NasTech 后端时,可以使用远程网关。下面可按 profile 指定各自的远程主机。',
529
+ appliesTo: '应用于',
530
+ allProfiles: '所有 profile',
531
+ defaultConnection: '默认连接会用于所有没有自定义覆盖的 profile。',
532
+ profileConnection: profile => `仅当“${profile}”是当前 profile 时使用此连接。设为本地即可继承默认连接。`,
533
+ envOverrideTitle: '环境变量正在控制此桌面会话。',
534
+ envOverrideDesc: '取消设置 NASTECH_DESKTOP_REMOTE_URL 和 NASTECH_DESKTOP_REMOTE_TOKEN 后才会使用下面保存的设置。',
535
+ localTitle: '本地网关',
536
+ localDesc: '在 localhost 启动私有 NasTech 后端。这是默认方式,并且可离线工作。',
537
+ remoteTitle: '远程网关',
538
+ remoteDesc:
539
+ '将此桌面外壳连接到远程 NasTech 后端。托管网关使用 OAuth 或用户名密码;自托管网关也可能使用会话 token。',
540
+ remoteUrlTitle: '远程 URL',
541
+ remoteUrlDesc: '远程 dashboard 后端的基础 URL。支持路径前缀,例如 /NASTECH。',
542
+ probing: '正在检查此网关的认证方式…',
543
+ probeError: '暂时无法访问此网关。请检查 URL;网关响应后会显示认证方式。',
544
+ signedIn: '已登录',
545
+ signIn: '登录',
546
+ signOut: '退出登录',
547
+ signInWith: provider => `使用 ${provider} 登录`,
548
+ authTitle: '认证',
549
+ authSignedInPassword: '此网关使用用户名和密码。你已登录,会话会自动刷新。',
550
+ authSignedInOauth: '此网关使用 OAuth。你已登录,会话会自动刷新。',
551
+ authNeedsPassword: '此网关使用用户名和密码。请登录以授权此桌面应用。',
552
+ authNeedsOauth: provider => `此网关使用 OAuth。请使用 ${provider} 登录以授权此桌面应用。`,
553
+ tokenTitle: '会话 token',
554
+ tokenDesc: '用于 REST 和 WebSocket 访问的 dashboard 会话 token。留空则保留已保存的 token。',
555
+ existingToken: value => `现有 token ${value}`,
556
+ savedToken: '已保存',
557
+ pasteSessionToken: '粘贴会话 token',
558
+ testRemote: '测试远程',
559
+ saveForRestart: '保存到下次重启',
560
+ saveAndReconnect: '保存并重连',
561
+ diagnostics: '诊断',
562
+ diagnosticsDesc: '在文件管理器中显示 desktop.log,网关启动失败时很有用。',
563
+ openLogs: '打开日志',
564
+ incompleteTitle: '远程网关配置不完整',
565
+ incompleteSignIn: '切换到远程前,请输入远程 URL 并完成登录。',
566
+ incompleteToken: '切换到远程前,请输入远程 URL 和会话 token。',
567
+ incompleteSignInTest: '测试前,请输入远程 URL 并完成登录。',
568
+ incompleteTokenTest: '测试前,请输入远程 URL 和会话 token。',
569
+ enterUrlFirst: '请先输入远程 URL。',
570
+ restartingTitle: '网关连接正在重启',
571
+ savedTitle: '网关设置已保存',
572
+ restartingMessage: 'NasTech Desktop 将使用已保存设置重新连接。',
573
+ savedMessage: '已保存,下一次重启生效。',
574
+ connectedTo: (baseUrl, version) => `已连接到 ${baseUrl}${version ? ` · NasTech ${version}` : ''}`,
575
+ reachableTitle: '远程网关可访问',
576
+ signedOutTitle: '已退出登录',
577
+ signedOutMessage: '已清除远程网关会话。',
578
+ failedLoad: '网关设置加载失败',
579
+ signInFailed: '登录失败',
580
+ signOutFailed: '退出登录失败',
581
+ testFailed: '远程网关测试失败',
582
+ applyFailed: '无法应用网关设置',
583
+ saveFailed: '无法保存网关设置'
584
+ },
585
+ keys: {
586
+ loading: '正在加载 API 密钥和凭据...',
587
+ failedLoad: 'API 密钥加载失败',
588
+ empty: '此类别暂时没有配置项。'
589
+ },
590
+ mcp: {
591
+ loading: '正在加载 MCP 服务器...',
592
+ failedLoad: 'MCP 配置加载失败',
593
+ nameRequiredTitle: '需要名称',
594
+ nameRequiredMessage: '请为此 MCP 服务器提供配置键。',
595
+ objectRequired: '服务器配置必须是 JSON 对象',
596
+ invalidJson: 'MCP JSON 无效',
597
+ saveFailed: '保存失败',
598
+ removeFailed: '移除失败',
599
+ gatewayUnavailableTitle: '网关不可用',
600
+ gatewayUnavailableMessage: '重新加载 MCP 前请先重连网关。',
601
+ reloadedTitle: 'MCP 工具已重新加载',
602
+ reloadedMessage: '新的工具 schema 将应用到后续回合。',
603
+ reloadFailed: 'MCP 重新加载失败',
604
+ savedTitle: 'MCP 服务器已保存',
605
+ savedMessage: name => `${name} 会在 MCP 重新加载后生效。`,
606
+ newServer: '新服务器',
607
+ reload: '重新加载 MCP',
608
+ reloading: '重新加载中...',
609
+ emptyTitle: '没有 MCP 服务器',
610
+ emptyDesc: '添加 stdio 或 HTTP 服务器以暴露 MCP 工具。',
611
+ disabled: '已禁用',
612
+ editServer: '编辑服务器',
613
+ name: '名称',
614
+ serverJson: '服务器 JSON',
615
+ remove: '移除',
616
+ saveServer: '保存服务器'
617
+ },
618
+ model: {
619
+ loading: '正在加载模型配置...',
620
+ appliesDesc: '应用于新会话。可在输入框的模型选择器中临时切换当前对话。',
621
+ provider: '提供方',
622
+ model: '模型',
623
+ applying: '应用中...',
624
+ auxiliaryTitle: '辅助模型',
625
+ resetAllToMain: '全部重置为主模型',
626
+ auxiliaryDesc: '辅助任务默认使用主模型。你可以为任意任务指定专用模型。',
627
+ setToMain: '设为主模型',
628
+ change: '更改',
629
+ autoUseMain: '自动 · 使用主模型',
630
+ providerDefault: '(提供方默认)',
631
+ tasks: {
632
+ vision: { label: '视觉', hint: '图片分析' },
633
+ web_extract: { label: '网页提取', hint: '页面总结' },
634
+ compression: { label: '压缩', hint: '上下文压缩' },
635
+ skills_hub: { label: '技能中心', hint: '技能搜索' },
636
+ approval: { label: '审批', hint: '智能自动批准' },
637
+ mcp: { label: 'MCP', hint: 'MCP 工具路由' },
638
+ title_generation: { label: '标题生成', hint: '会话标题' },
639
+ curator: { label: '维护器', hint: '技能使用审查' }
640
+ }
641
+ },
642
+ providers: {
643
+ connectAccount: '连接账号',
644
+ haveApiKey: '改用 API 密钥?',
645
+ intro: '使用订阅登录,无需复制 API 密钥。NasTech 会在应用中为你完成浏览器登录。',
646
+ connected: '已连接',
647
+ collapse: '收起',
648
+ connectAnother: '连接其他提供方',
649
+ otherProviders: '其他提供方',
650
+ noProviderKeys: '没有可用的提供方 API 密钥。',
651
+ loading: '正在加载提供方...'
652
+ },
653
+ sessions: {
654
+ loading: '正在加载已归档会话…',
655
+ archivedTitle: '已归档会话',
656
+ archivedIntro: '已归档对话会从侧边栏隐藏,但会保留全部消息。在侧边栏 Ctrl/⌘ 点击对话即可归档。',
657
+ emptyArchivedTitle: '暂无归档',
658
+ emptyArchivedDesc: '归档一个对话后会显示在这里。',
659
+ unarchive: '取消归档',
660
+ deletePermanently: '永久删除',
661
+ messages: count => `${count} 条消息`,
662
+ restored: '已恢复',
663
+ deleteConfirm: title => `永久删除“${title}”?此操作无法撤销。`,
664
+ defaultDirTitle: '默认项目目录',
665
+ defaultDirDesc: '新会话默认从此文件夹开始,除非你选择其他目录。留空则使用你的 home 目录。',
666
+ defaultDirUpdated: '默认项目目录已更新',
667
+ defaultsTo: label => `默认使用 ${label}。`,
668
+ change: '更改',
669
+ choose: '选择',
670
+ clear: '清除',
671
+ notSet: '未设置',
672
+ failedLoad: '无法加载已归档会话',
673
+ unarchiveFailed: '取消归档失败',
674
+ deleteFailed: '删除失败',
675
+ updateDirFailed: '无法更新默认目录',
676
+ clearDirFailed: '无法清除默认目录'
677
+ },
678
+ toolsets: {
679
+ loadingConfig: '正在加载配置',
680
+ savedTitle: '凭据已保存',
681
+ savedMessage: key => `${key} 已更新。`,
682
+ removedTitle: '凭据已移除',
683
+ removedMessage: key => `${key} 已移除。`,
684
+ failedSave: key => `保存 ${key} 失败`,
685
+ failedRemove: key => `移除 ${key} 失败`,
686
+ failedReveal: key => `显示 ${key} 失败`,
687
+ removeConfirm: key => `从 .env 中移除 ${key}?`,
688
+ set: '已设置',
689
+ notSet: '未设置',
690
+ selectedTitle: '已选择提供方',
691
+ selectedMessage: provider => `${provider} 现在处于活动状态。`,
692
+ failedSelect: provider => `选择 ${provider} 失败`,
693
+ failedLoad: '工具配置加载失败',
694
+ noProviderOptions: '此工具集没有提供方选项;启用后即可使用当前配置。',
695
+ noProviders: '此工具集当前没有可用提供方。',
696
+ ready: '就绪',
697
+ nousIncluded: '包含在 NasTech 订阅中;登录 NasTech Portal 即可激活。',
698
+ noApiKeyRequired: '不需要 API 密钥。',
699
+ postSetupHint: step => `此后端需要一次性安装 (${step})。将在此机器上执行,可能需要几分钟。`,
700
+ postSetupRun: '运行设置',
701
+ postSetupRunning: '安装中…',
702
+ postSetupStarting: '启动中…',
703
+ postSetupCompleteTitle: '设置完成',
704
+ postSetupCompleteMessage: step => `已安装 ${step}。`,
705
+ postSetupErrorTitle: '设置完成但有错误',
706
+ postSetupErrorMessage: step => `请检查 ${step} 日志。`,
707
+ postSetupFailed: step => `运行 ${step} 设置失败`
708
+ }
709
+ },
710
+
711
+ skills: {
712
+ tabSkills: '技能',
713
+ tabToolsets: '工具集',
714
+ all: '全部',
715
+ searchSkills: '搜索技能…',
716
+ searchToolsets: '搜索工具集…',
717
+ refresh: '刷新技能',
718
+ refreshing: '正在刷新技能',
719
+ loading: '正在加载能力…',
720
+ noSkillsTitle: '未找到技能',
721
+ noSkillsDesc: '尝试更宽泛的搜索或其他分类。',
722
+ noToolsetsTitle: '未找到工具集',
723
+ noToolsetsDesc: '尝试更宽泛的搜索词。',
724
+ noDescription: '暂无描述。',
725
+ configured: '已配置',
726
+ needsKeys: '需要密钥',
727
+ toolsetsEnabled: (enabled, total) => `已启用 ${enabled}/${total} 个工具集`,
728
+ configureToolset: label => `配置 ${label}`,
729
+ toggleToolset: label => `切换 ${label} 工具集`,
730
+ skillsLoadFailed: '技能加载失败',
731
+ toolsetsRefreshFailed: '工具集刷新失败',
732
+ skillEnabled: '技能已启用',
733
+ skillDisabled: '技能已禁用',
734
+ toolsetEnabled: '工具集已启用',
735
+ toolsetDisabled: '工具集已禁用',
736
+ appliesToNewSessions: name => `${name} 将应用于新会话。`,
737
+ failedToUpdate: name => `更新 ${name} 失败`
738
+ },
739
+
740
+ agents: {
741
+ close: '关闭代理',
742
+ title: '派生树',
743
+ subtitle: '当前回合的子代理实时活动。',
744
+ emptyTitle: '暂无活跃子代理',
745
+ emptyDesc: '当某个回合派发任务时,子代理会在此实时显示进度。',
746
+ running: '运行中',
747
+ failed: '失败',
748
+ done: '完成',
749
+ streaming: '流式传输',
750
+ files: '文件',
751
+ moreFiles: count => `还有 ${count} 个文件`,
752
+ delegation: index => `派发 ${index}`,
753
+ workers: count => `${count} 个工作单元`,
754
+ workersActive: count => `${count} 个活跃`,
755
+ agentsCount: count => `${count} 个代理`,
756
+ activeCount: count => `${count} 个活跃`,
757
+ failedCount: count => `${count} 个失败`,
758
+ toolsCount: count => `${count} 个工具`,
759
+ filesCount: count => `${count} 个文件`,
760
+ updatedAgo: age => `更新于 ${age}`,
761
+ ageNow: '刚刚',
762
+ ageSeconds: seconds => `${seconds} 秒前`,
763
+ ageMinutes: minutes => `${minutes} 分钟前`,
764
+ ageHours: hours => `${hours} 小时前`,
765
+ durationSeconds: seconds => `${seconds} 秒`,
766
+ durationMinutes: (minutes, seconds) => `${minutes} 分 ${seconds} 秒`,
767
+ tokensK: k => `${k}k 词元`,
768
+ tokens: value => `${value} 词元`
769
+ },
770
+
771
+ commandCenter: {
772
+ close: '关闭命令中心',
773
+ paletteTitle: '命令面板',
774
+ back: '返回',
775
+ searchPlaceholder: '搜索会话、视图与操作',
776
+ goTo: '前往',
777
+ commandCenter: '命令中心',
778
+ appearance: '外观',
779
+ settings: '设置',
780
+ changeTheme: '更改主题...',
781
+ changeColorMode: '更改颜色模式...',
782
+ installTheme: {
783
+ title: '安装主题...',
784
+ placeholder: '搜索 VS Code 市场...',
785
+ loading: '正在搜索市场...',
786
+ error: '无法访问市场。',
787
+ empty: '没有匹配的主题。',
788
+ install: '安装',
789
+ installing: '安装中...',
790
+ installed: '已安装',
791
+ installs: count => `${count} 次安装`
792
+ },
793
+ settingsFields: '设置字段',
794
+ mcpServers: 'MCP 服务器',
795
+ archivedChats: '已归档对话',
796
+ sections: { sessions: '会话', system: '系统', usage: '用量' },
797
+ sectionDescriptions: {
798
+ sessions: '搜索与管理会话',
799
+ system: '状态、日志与系统操作',
800
+ usage: '一段时间内的词元、成本与技能活动'
801
+ },
802
+ nav: {
803
+ newChat: { title: '新建会话', detail: '开始一个新会话' },
804
+ settings: { title: '设置', detail: '配置 NasTech 桌面端' },
805
+ skills: { title: '技能与工具', detail: '启用技能、工具集与提供方' },
806
+ messaging: { title: '消息平台', detail: '配置 Telegram、Slack、Discord 等' },
807
+ artifacts: { title: '产物', detail: '浏览生成的输出' }
808
+ },
809
+ sectionEntries: {
810
+ sessions: { title: '会话面板', detail: '搜索、置顶与管理会话' },
811
+ system: { title: '系统面板', detail: '网关状态、日志、重启/更新' },
812
+ usage: { title: '用量面板', detail: '词元、成本与技能活动' }
813
+ },
814
+ providerNavigate: '导航',
815
+ providerSessions: '会话',
816
+ refresh: '刷新',
817
+ refreshing: '刷新中…',
818
+ noResults: '未找到匹配结果。',
819
+ pinSession: '置顶会话',
820
+ unpinSession: '取消置顶',
821
+ exportSession: '导出会话',
822
+ deleteSession: '删除会话',
823
+ noSessions: '暂无会话。',
824
+ gatewayRunning: '消息网关运行中',
825
+ gatewayStopped: '消息网关已停止',
826
+ NASTECHActiveSessions: (version, count) => `NasTech ${version} · 活跃会话 ${count}`,
827
+ restartMessaging: '重启消息服务',
828
+ updateNasTech: '更新 NasTech',
829
+ actionRunning: '运行中',
830
+ actionDone: '完成',
831
+ actionFailed: '失败',
832
+ actionStartedWaiting: '操作已启动,等待状态…',
833
+ loadingStatus: '正在加载状态…',
834
+ recentLogs: '最近日志',
835
+ noLogs: '尚未加载日志。',
836
+ days: count => `${count} 天`,
837
+ statSessions: '会话',
838
+ statApiCalls: 'API 调用',
839
+ statTokens: '输入/输出词元',
840
+ statCost: '预估成本',
841
+ actualCost: cost => `实际 ${cost}`,
842
+ loadingUsage: '正在加载用量…',
843
+ noUsage: period => `最近 ${period} 天暂无用量。`,
844
+ retry: '重试',
845
+ dailyTokens: '每日词元',
846
+ input: '输入',
847
+ output: '输出',
848
+ noDailyActivity: '暂无每日活动。',
849
+ topModels: '常用模型',
850
+ noModelUsage: '暂无模型用量。',
851
+ topSkills: '常用技能',
852
+ noSkillActivity: '暂无技能活动。',
853
+ actions: count => `${count} 次操作`
854
+ },
855
+
856
+ messaging: {
857
+ search: '搜索消息平台…',
858
+ loading: '正在加载消息平台…',
859
+ loadFailed: '消息平台加载失败',
860
+ states: {
861
+ connected: '已连接',
862
+ connecting: '连接中',
863
+ disabled: '已禁用',
864
+ fatal: '错误',
865
+ gateway_stopped: '消息网关已停止',
866
+ not_configured: '需要设置',
867
+ pending_restart: '需要重启',
868
+ retrying: '重试中',
869
+ startup_failed: '启动失败'
870
+ },
871
+ unknown: '未知',
872
+ hintPendingRestart: '在状态栏重启网关以应用此更改。',
873
+ hintGatewayStopped: '在状态栏启动网关以建立连接。',
874
+ credentialsSet: '凭据已设置',
875
+ needsSetup: '需要设置',
876
+ gatewayStopped: '消息网关已停止',
877
+ getCredentials: '获取你的凭据',
878
+ openSetupGuide: '打开设置指南',
879
+ required: '必填',
880
+ recommended: '推荐',
881
+ advanced: count => `高级 (${count})`,
882
+ noTokenNeeded: '此平台无需在此填写令牌。请按上方设置指南操作,然后在下方启用。',
883
+ enabled: '已启用',
884
+ disabled: '已禁用',
885
+ unsavedChanges: '有未保存的更改',
886
+ saving: '保存中…',
887
+ saveChanges: '保存更改',
888
+ saved: '已保存',
889
+ replaceValue: '替换当前值',
890
+ openDocs: '打开文档',
891
+ clearField: key => `清除 ${key}`,
892
+ enableAria: name => `启用 ${name}`,
893
+ disableAria: name => `禁用 ${name}`,
894
+ platformEnabled: name => `${name} 已启用`,
895
+ platformDisabled: name => `${name} 已禁用`,
896
+ restartToApply: '重启网关后此更改才会生效。',
897
+ setupSaved: name => `${name} 设置已保存`,
898
+ restartToReconnect: '重启网关以使用新凭据重新连接。',
899
+ keyCleared: key => `${key} 已清除`,
900
+ setupUpdated: name => `${name} 设置已更新。`,
901
+ failedUpdate: name => `更新 ${name} 失败`,
902
+ failedSave: name => `保存 ${name} 失败`,
903
+ failedClear: key => `清除 ${key} 失败`,
904
+ fieldCopy: {
905
+ TELEGRAM_BOT_TOKEN: {
906
+ label: 'Bot 令牌',
907
+ help: '用 @BotFather 创建一个机器人,然后粘贴它给你的令牌。',
908
+ placeholder: '粘贴 Telegram bot 令牌'
909
+ },
910
+ TELEGRAM_ALLOWED_USERS: {
911
+ label: '允许的 Telegram 用户 ID',
912
+ help: '推荐。来自 @userinfobot 的逗号分隔数字 ID。不设置则任何人都能私信你的机器人。'
913
+ },
914
+ TELEGRAM_PROXY: { label: '代理 URL', help: '仅在 Telegram 被屏蔽的网络中需要。' },
915
+ DISCORD_BOT_TOKEN: { label: 'Bot 令牌', help: '在 Discord 开发者门户创建应用,添加机器人,然后粘贴其令牌。' },
916
+ DISCORD_ALLOWED_USERS: { label: '允许的 Discord 用户 ID', help: '推荐。逗号分隔的 Discord 用户 ID。' },
917
+ DISCORD_REPLY_TO_MODE: { label: '回复方式', help: 'first、all 或 off。' },
918
+ DISCORD_ALLOW_ALL_USERS: {
919
+ label: '允许所有 Discord 用户',
920
+ help: '仅用于开发。为 true 时,任何人都可以私信 bot,不需要允许列表。'
921
+ },
922
+ DISCORD_HOME_CHANNEL: { label: '主页频道 ID', help: 'bot 主动发送消息的频道(cron 输出、提醒等)。' },
923
+ DISCORD_HOME_CHANNEL_NAME: { label: '主页频道名称', help: '日志和状态输出中显示的主页频道名称。' },
924
+ BLUEBUBBLES_ALLOW_ALL_USERS: { label: '允许所有 iMessage 用户', help: '为 true 时跳过 BlueBubbles 允许列表。' },
925
+ MATTERMOST_ALLOW_ALL_USERS: { label: '允许所有 Mattermost 用户' },
926
+ MATTERMOST_HOME_CHANNEL: { label: '主页频道' },
927
+ QQ_ALLOW_ALL_USERS: { label: '允许所有 QQ 用户' },
928
+ QQBOT_HOME_CHANNEL: { label: 'QQ 主页频道', help: 'cron 投递的默认频道或群组。' },
929
+ QQBOT_HOME_CHANNEL_NAME: { label: 'QQ 主页频道名称' },
930
+ SLACK_BOT_TOKEN: {
931
+ label: 'Slack bot 令牌',
932
+ help: '安装 Slack 应用后,在 OAuth & Permissions 中找到 bot 令牌。',
933
+ placeholder: '粘贴 Slack bot 令牌'
934
+ },
935
+ SLACK_APP_TOKEN: {
936
+ label: 'Slack app 令牌',
937
+ help: 'Socket Mode 需要 app 级令牌。',
938
+ placeholder: '粘贴 Slack app 令牌'
939
+ },
940
+ SLACK_ALLOWED_USERS: { label: '允许的 Slack 用户 ID', help: '推荐。逗号分隔的 Slack 用户 ID。' },
941
+ MATTERMOST_URL: { label: '服务器 URL', placeholder: 'https://mattermost.example.com' },
942
+ MATTERMOST_TOKEN: { label: 'Bot 令牌' },
943
+ MATTERMOST_ALLOWED_USERS: { label: '允许的用户 ID', help: '推荐。逗号分隔的 Mattermost 用户 ID。' },
944
+ MATRIX_HOMESERVER: { label: 'Homeserver URL', placeholder: 'https://matrix.org' },
945
+ MATRIX_ACCESS_TOKEN: { label: '访问令牌' },
946
+ MATRIX_USER_ID: { label: 'Bot 用户 ID', placeholder: '@NASTECH:example.org' },
947
+ MATRIX_ALLOWED_USERS: { label: '允许的 Matrix 用户 ID', help: '推荐。@user:server 格式的逗号分隔用户 ID。' },
948
+ SIGNAL_HTTP_URL: {
949
+ label: 'Signal 桥接 URL',
950
+ placeholder: 'http://127.0.0.1:8080',
951
+ help: '运行中的 signal-cli REST 桥接的 URL。'
952
+ },
953
+ SIGNAL_ACCOUNT: { label: '电话号码', help: '在 signal-cli 桥接中注册的号码。' },
954
+ SIGNAL_ALLOWED_USERS: { label: '允许的 Signal 用户', help: '推荐。逗号分隔的 Signal 标识符。' },
955
+ WHATSAPP_ENABLED: { label: '启用 WhatsApp 桥接', help: '由下方开关自动设置。除非确知需要,否则请勿改动。' },
956
+ WHATSAPP_MODE: { label: '桥接模式' },
957
+ WHATSAPP_ALLOWED_USERS: { label: '允许的 WhatsApp 用户', help: '推荐。逗号分隔的电话号码或 WhatsApp ID。' }
958
+ },
959
+ platformIntro: {
960
+ telegram:
961
+ '在 Telegram 中,与 @BotFather 对话,运行 /newbot,复制它给你的令牌。然后从 @userinfobot 获取你的数字用户 ID。',
962
+ discord: '打开 Discord 开发者门户,创建应用,添加 Bot,然后复制其令牌。用正确的权限范围把机器人邀请到你的服务器。',
963
+ slack: '创建 Slack 应用,启用 Socket Mode,安装到你的工作区,然后复制 bot 令牌和 app 级令牌。',
964
+ mattermost: '在你的 Mattermost 服务器上,创建机器人账户或个人访问令牌,然后在此粘贴服务器 URL 和令牌。',
965
+ matrix: '用机器人账户登录你的 homeserver,然后复制访问令牌、用户 ID 和 homeserver URL。',
966
+ signal: '在可访问的位置运行 signal-cli REST 桥接,然后把 NasTech 指向该 URL 和已注册的电话号码。',
967
+ whatsapp: '启动 NasTech 自带的 WhatsApp 桥接,首次运行时扫描二维码,然后启用该平台。',
968
+ bluebubbles: '在装有 iMessage 的 Mac 上运行 BlueBubbles Server,暴露其 API,然后用服务器密码把 NasTech 指向该 URL。',
969
+ homeassistant: '在 Home Assistant 中打开你的个人资料并创建长期访问令牌。把它连同你的 HA URL 一起粘贴到这里。',
970
+ email: '使用专用邮箱。对于 Gmail/Workspace,创建应用专用密码并使用 imap.gmail.com / smtp.gmail.com。',
971
+ sms: '从 Twilio 控制台获取你的 Account SID 和 Auth Token,以及一个可发送短信的电话号码。',
972
+ dingtalk: '在开发者控制台创建钉钉应用,然后在此复制 Client ID(App key) 和 Client Secret。',
973
+ feishu: '创建飞书 / Lark 应用,配置机器人能力,复制 App ID、App secret 和事件加密密钥。',
974
+ wecom: '在企业微信中添加群机器人,复制其 webhook key 作为 WECOM_BOT_ID。仅可发送——双向请用企业微信 (应用) 选项。',
975
+ wecom_callback: '设置一个企业微信自建应用,暴露其回调 URL,并提供 corp ID、secret、agent ID 和 AES key。',
976
+ weixin: '登录微信公众平台,复制 AppID 和 Token,并把消息回调 URL 指向 NasTech。',
977
+ qqbot: '在 QQ 开放平台 (q.qq.com) 注册一个应用,复制 App ID 和 Client Secret。',
978
+ api_server:
979
+ '把 NasTech 暴露为兼容 OpenAI 的 API。设置一个鉴权密钥,然后把 Open WebUI / LobeChat 等指向 host:port。',
980
+ webhook: '运行一个 HTTP 服务器,供其他工具 (GitHub、GitLab、自定义应用)POST。用 secret 验证签名。'
981
+ }
982
+ },
983
+
984
+ profiles: {
985
+ close: '关闭配置档案',
986
+ nameHint: '小写字母、数字、连字符和下划线。必须以字母或数字开头。',
987
+ title: '配置档案',
988
+ count: count => `${count} 个配置档案`,
989
+ loading: '正在加载配置档案…',
990
+ newProfile: '新建配置档案',
991
+ allProfiles: '全部配置档案',
992
+ showAllProfiles: '显示全部配置档案',
993
+ switchToProfile: name => `切换到 ${name}`,
994
+ manageProfiles: '管理配置档案...',
995
+ actionsFor: name => `${name} 的操作`,
996
+ color: '颜色...',
997
+ colorFor: name => `${name} 的颜色`,
998
+ setColor: color => `设置颜色 ${color}`,
999
+ autoColor: '自动',
1000
+ noProfiles: '暂无配置档案。',
1001
+ selectPrompt: '选择一个配置档案以查看其详情。',
1002
+ refresh: '刷新配置档案',
1003
+ refreshing: '正在刷新配置档案',
1004
+ default: '默认',
1005
+ skills: count => `${count} 个技能`,
1006
+ env: 'env',
1007
+ defaultBadge: '默认',
1008
+ rename: '重命名',
1009
+ copySetup: '复制安装命令',
1010
+ copying: '复制中…',
1011
+ modelLabel: '模型',
1012
+ skillsLabel: '技能',
1013
+ notSet: '未设置',
1014
+ soulDesc: '内置于此配置档案的系统提示词与人格指令。',
1015
+ soulOptional: '可选',
1016
+ soulPlaceholder: mode => `此配置档案的系统提示词 / 人格说明。\n留空则保留${mode}默认值。`,
1017
+ soulPlaceholderCloned: '克隆的',
1018
+ soulPlaceholderEmpty: '空的',
1019
+ unsavedChanges: '有未保存的更改',
1020
+ loadingSoul: '正在加载 SOUL.md…',
1021
+ emptySoul: '空的 SOUL.md —— 开始撰写人格设定…',
1022
+ saving: '保存中…',
1023
+ saveSoul: '保存 SOUL.md',
1024
+ deleteTitle: '删除配置档案?',
1025
+ deleteDescPrefix: '这将删除 ',
1026
+ deleteDescMid: ' 并移除其 ',
1027
+ deleteDescSuffix: ' 目录。此操作无法撤销。',
1028
+ deleting: '删除中…',
1029
+ createDesc: '配置档案是相互独立的 NasTech 环境:各自拥有独立的配置、技能和 SOUL.md。',
1030
+ nameLabel: '名称',
1031
+ cloneFromDefault: '从默认档案克隆',
1032
+ cloneFromDefaultDesc: '从你的默认配置档案复制配置、技能和 SOUL.md。',
1033
+ invalidName: hint => `名称无效。${hint}`,
1034
+ nameRequired: '名称为必填项。',
1035
+ creating: '创建中…',
1036
+ createAction: '创建配置档案',
1037
+ renameTitle: '重命名配置档案',
1038
+ renameDescPrefix: '重命名会更新配置档案目录以及 ',
1039
+ renameDescSuffix: ' 中的所有包装脚本。',
1040
+ newNameLabel: '新名称',
1041
+ renaming: '重命名中…',
1042
+ created: '配置档案已创建',
1043
+ renamed: '配置档案已重命名',
1044
+ deleted: '配置档案已删除',
1045
+ setupCopied: '安装命令已复制',
1046
+ soulSaved: 'SOUL.md 已保存',
1047
+ failedLoad: '加载配置档案失败',
1048
+ failedDelete: '删除配置档案失败',
1049
+ failedCopy: '复制安装命令失败',
1050
+ failedLoadSoul: '加载 SOUL.md 失败',
1051
+ failedSaveSoul: '保存 SOUL.md 失败',
1052
+ failedCreate: '创建配置档案失败',
1053
+ failedRename: '重命名配置档案失败'
1054
+ },
1055
+
1056
+ cron: {
1057
+ close: '关闭定时任务',
1058
+ search: '搜索定时任务…',
1059
+ loading: '正在加载定时任务…',
1060
+ states: {
1061
+ enabled: '已启用',
1062
+ scheduled: '已排程',
1063
+ running: '运行中',
1064
+ paused: '已暂停',
1065
+ disabled: '已禁用',
1066
+ error: '错误',
1067
+ completed: '已完成'
1068
+ },
1069
+ deliveryLabels: {
1070
+ local: '此桌面',
1071
+ telegram: 'Telegram',
1072
+ discord: 'Discord',
1073
+ slack: 'Slack',
1074
+ email: '电子邮件'
1075
+ },
1076
+ scheduleLabels: {
1077
+ daily: '每天',
1078
+ weekdays: '工作日',
1079
+ weekly: '每周',
1080
+ monthly: '每月',
1081
+ hourly: '每小时',
1082
+ 'every-15-minutes': '每 15 分钟',
1083
+ custom: '自定义'
1084
+ },
1085
+ scheduleHints: {
1086
+ daily: '每天上午 9:00',
1087
+ weekdays: '周一至周五上午 9:00',
1088
+ weekly: '每周一上午 9:00',
1089
+ monthly: '每月第一天上午 9:00',
1090
+ hourly: '每个整点',
1091
+ 'every-15-minutes': '每 15 分钟',
1092
+ custom: 'Cron 语法或自然语言'
1093
+ },
1094
+ days: {
1095
+ '0': '周日',
1096
+ '1': '周一',
1097
+ '2': '周二',
1098
+ '3': '周三',
1099
+ '4': '周四',
1100
+ '5': '周五',
1101
+ '6': '周六',
1102
+ '7': '周日'
1103
+ },
1104
+ dayFallback: value => `第 ${value} 天`,
1105
+ everyDayAt: time => `每天 ${time}`,
1106
+ weekdaysAt: time => `工作日 ${time}`,
1107
+ everyDayOfWeekAt: (day, time) => `每${day} ${time}`,
1108
+ monthlyOnDayAt: (dayOfMonth, time) => `每月 ${dayOfMonth} 日 ${time}`,
1109
+ topOfHour: '每个整点',
1110
+ everyHourAt: minute => `每小时的 :${minute}`,
1111
+ active: (enabled, total) => `${enabled}/${total} 个活跃`,
1112
+ newCron: '新建定时任务',
1113
+ emptyDescNew: '按 cron 表达式排程一个提示词。NasTech 会运行它,并把结果发送到你选择的目的地。',
1114
+ emptyDescSearch: '尝试更宽泛的搜索词。',
1115
+ emptyTitleNew: '暂无排程任务',
1116
+ emptyTitleSearch: '无匹配项',
1117
+ last: '上次:',
1118
+ next: '下次:',
1119
+ noRuns: '尚无运行',
1120
+ manage: '管理',
1121
+ showRuns: '显示运行记录',
1122
+ hideRuns: '隐藏运行记录',
1123
+ runHistory: '运行记录',
1124
+ actionsFor: title => `${title} 的操作`,
1125
+ actionsTitle: '定时任务操作',
1126
+ resume: '恢复定时任务',
1127
+ pause: '暂停定时任务',
1128
+ resumeTitle: '恢复',
1129
+ pauseTitle: '暂停',
1130
+ triggerNow: '立即触发',
1131
+ edit: '编辑定时任务',
1132
+ deleteTitle: '删除定时任务?',
1133
+ deleteDescPrefix: '这将永久移除 ',
1134
+ deleteDescSuffix: '。它会立即停止触发。',
1135
+ deleting: '删除中…',
1136
+ resumed: '定时任务已恢复',
1137
+ paused: '定时任务已暂停',
1138
+ triggered: '定时任务已触发',
1139
+ deleted: '定时任务已删除',
1140
+ created: '定时任务已创建',
1141
+ updated: '定时任务已更新',
1142
+ failedLoad: '加载定时任务失败',
1143
+ failedUpdate: '更新定时任务失败',
1144
+ failedTrigger: '触发定时任务失败',
1145
+ failedDelete: '删除定时任务失败',
1146
+ failedSave: '保存定时任务失败',
1147
+ editTitle: '编辑定时任务',
1148
+ createTitle: '新建定时任务',
1149
+ editDesc: '更新排程、提示词或投递目标。更改将在下次运行时生效。',
1150
+ createDesc: '排程一个提示词以自动运行。使用 cron 语法或类似"每 15 分钟"的自然语言。',
1151
+ nameLabel: '名称',
1152
+ namePlaceholder: '晨间简报',
1153
+ promptLabel: '提示词',
1154
+ promptPlaceholder: '总结我未读的 Slack 话题,并把前 5 条邮件发给我…',
1155
+ frequencyLabel: '频率',
1156
+ deliverLabel: '投递至',
1157
+ customScheduleLabel: '自定义排程',
1158
+ customPlaceholder: '0 9 * * * 或 weekdays at 9am',
1159
+ customHint: 'Cron 表达式,或类似"每小时""工作日上午 9 点"的短语。',
1160
+ optional: '可选',
1161
+ promptScheduleRequired: '提示词和排程为必填项。',
1162
+ saveChanges: '保存更改',
1163
+ createAction: '创建定时任务'
1164
+ },
1165
+
1166
+ artifacts: {
1167
+ search: '搜索产物…',
1168
+ refresh: '刷新产物',
1169
+ refreshing: '正在刷新产物',
1170
+ indexing: '正在索引最近会话的产物',
1171
+ tabAll: '全部',
1172
+ tabImages: '图片',
1173
+ tabFiles: '文件',
1174
+ tabLinks: '链接',
1175
+ noArtifactsTitle: '未找到产物',
1176
+ noArtifactsDesc: '当会话生成图片和文件输出时,它们会显示在这里。',
1177
+ failedLoad: '产物加载失败',
1178
+ openFailed: '打开失败',
1179
+ itemsImage: '张图片',
1180
+ itemsLink: '个链接',
1181
+ itemsFile: '个文件',
1182
+ itemsGeneric: '项',
1183
+ zero: '0',
1184
+ rangeOf: (start, end, total) => `${start}-${end},共 ${total}`,
1185
+ goToPage: (itemLabel, page) => `前往${itemLabel}第 ${page} 页`,
1186
+ colTitleLink: '链接标题',
1187
+ colTitleFile: '名称',
1188
+ colTitleDefault: '标题 / 名称',
1189
+ colLocationLink: 'URL',
1190
+ colLocationFile: '路径',
1191
+ colLocationDefault: '位置',
1192
+ colSession: '会话',
1193
+ kindImage: '图片',
1194
+ kindFile: '文件',
1195
+ kindLink: '链接',
1196
+ chat: '对话',
1197
+ copyUrl: '复制 URL',
1198
+ copyPath: '复制路径'
1199
+ },
1200
+
1201
+ sidebar: {
1202
+ nav: {
1203
+ 'new-session': '新建会话',
1204
+ skills: '技能与工具',
1205
+ messaging: '消息平台',
1206
+ artifacts: '产物'
1207
+ },
1208
+ searchAria: '搜索会话',
1209
+ searchPlaceholder: '搜索会话…',
1210
+ clearSearch: '清除搜索',
1211
+ noMatch: query => `没有会话匹配"${query}"。`,
1212
+ results: '结果',
1213
+ pinned: '已置顶',
1214
+ sessions: '会话',
1215
+ cronJobs: '定时任务',
1216
+ groupAriaGrouped: '以单一列表显示会话',
1217
+ groupAriaUngrouped: '按工作区分组会话',
1218
+ groupTitleGrouped: '取消分组',
1219
+ groupTitleUngrouped: '按工作区分组',
1220
+ allPinned: '这里的全部已置顶。取消置顶某个对话即可在最近中显示。',
1221
+ shiftClickHint: 'Shift+ 单击对话以置顶 · 拖动以重新排序',
1222
+ noWorkspace: '无工作区',
1223
+ newSessionIn: label => `在 ${label} 中新建会话`,
1224
+ reorderWorkspace: label => `重新排序工作区 ${label}`,
1225
+ showMoreIn: (count, label) => `在 ${label} 中再显示 ${count} 个`,
1226
+ loading: '加载中…',
1227
+ loadMore: '加载更多',
1228
+ loadCount: step => `再加载 ${step} 个`,
1229
+ row: {
1230
+ pin: '置顶',
1231
+ unpin: '取消置顶',
1232
+ copyId: '复制 ID',
1233
+ export: '导出',
1234
+ rename: '重命名',
1235
+ archive: '归档',
1236
+ copyIdFailed: '无法复制会话 ID',
1237
+ actionsFor: title => `${title} 的操作`,
1238
+ sessionActions: '会话操作',
1239
+ sessionRunning: '会话运行中',
1240
+ needsInput: '需要你输入',
1241
+ waitingForAnswer: '正在等待你的回答',
1242
+ renamed: '已重命名',
1243
+ renameFailed: '重命名失败',
1244
+ renameTitle: '重命名会话',
1245
+ renameDesc: '给这个对话起一个好记的标题。留空则清除。',
1246
+ untitledPlaceholder: '无标题会话',
1247
+ ageNow: '刚刚',
1248
+ ageDay: '天',
1249
+ ageHour: '时',
1250
+ ageMin: '分'
1251
+ }
1252
+ },
1253
+
1254
+ composer: {
1255
+ message: '消息',
1256
+ wakingProfile: profile => `正在唤醒 ${profile}…`,
1257
+ placeholderStarting: '正在启动 NasTech…',
1258
+ placeholderReconnecting: '正在重新连接 NasTech…',
1259
+ placeholderFollowUp: '发送后续消息',
1260
+ newSessionPlaceholders: [
1261
+ '我们要构建什么?',
1262
+ '给 NasTech 一个任务',
1263
+ '你在想什么?',
1264
+ '描述你需要什么',
1265
+ '我们该处理什么?',
1266
+ '随便问点什么',
1267
+ '从一个目标开始'
1268
+ ],
1269
+ followUpPlaceholders: [
1270
+ '发送后续消息',
1271
+ '补充更多上下文',
1272
+ '细化这个请求',
1273
+ '下一步是什么?',
1274
+ '继续推进',
1275
+ '再深入一点',
1276
+ '调整或继续'
1277
+ ],
1278
+ startVoice: '开始语音对话',
1279
+ queueMessage: '排队消息',
1280
+ steer: '引导当前运行 (⌘⏎)',
1281
+ stop: '停止',
1282
+ send: '发送',
1283
+ speaking: '讲话中',
1284
+ transcribing: '转写中',
1285
+ thinking: '思考中',
1286
+ muted: '已静音',
1287
+ listening: '聆听中',
1288
+ muteMic: '麦克风静音',
1289
+ unmuteMic: '取消麦克风静音',
1290
+ stopListening: '停止聆听并发送',
1291
+ stopShort: '停止',
1292
+ endConversation: '结束语音对话',
1293
+ endShort: '结束',
1294
+ stopDictation: '停止听写',
1295
+ transcribingDictation: '正在转写听写',
1296
+ voiceDictation: '语音听写',
1297
+ lookupLoading: '查找中…',
1298
+ lookupNoMatches: '没有匹配项。',
1299
+ lookupTry: '试试',
1300
+ lookupOr: '或',
1301
+ commonCommands: '常用命令',
1302
+ hotkeys: '快捷键',
1303
+ helpFooter: '打开完整面板 · 退格键关闭',
1304
+ commandDescs: {
1305
+ '/help': '命令与快捷键的完整列表',
1306
+ '/clear': '开始新会话',
1307
+ '/resume': '恢复之前的会话',
1308
+ '/details': '控制对话记录的详细程度',
1309
+ '/copy': '复制所选内容或最后一条助手消息',
1310
+ '/quit': '退出 NASTECH'
1311
+ },
1312
+ hotkeyDescs: {
1313
+ '@': '引用文件、文件夹、URL、git',
1314
+ '/': '斜杠命令面板',
1315
+ '?': '此快速帮助 (删除以关闭)',
1316
+ Enter: '发送 · Shift+Enter 换行',
1317
+ 'Cmd/Ctrl+K': '发送下一条排队的回合',
1318
+ 'Cmd/Ctrl+L': '重绘',
1319
+ Esc: '关闭弹窗 · 取消运行',
1320
+ '↑ / ↓': '循环弹窗 / 历史'
1321
+ },
1322
+ attachUrlTitle: '附加 URL',
1323
+ attachUrlDesc: 'NasTech 将抓取该页面并作为本回合的上下文。',
1324
+ urlPlaceholder: 'https://example.com/post',
1325
+ urlHintPre: '请包含完整 URL,例如 ',
1326
+ attach: '附加',
1327
+ queued: count => `${count} 条排队`,
1328
+ attachmentOnly: '仅附件回合',
1329
+ emptyTurn: '空回合',
1330
+ attachments: count => `${count} 个附件`,
1331
+ editingInComposer: '正在输入框中编辑',
1332
+ editingQueuedInComposer: '正在输入框中编辑排队回合',
1333
+ editQueued: '编辑排队回合',
1334
+ sendQueuedNext: '下一个发送排队回合',
1335
+ sendQueuedNow: '立即发送排队回合',
1336
+ deleteQueued: '删除排队回合',
1337
+ previewUnavailable: '预览不可用',
1338
+ previewLabel: label => `预览 ${label}`,
1339
+ couldNotPreview: label => `无法预览 ${label}`,
1340
+ removeAttachment: label => `移除 ${label}`,
1341
+ dictating: '听写中',
1342
+ preparingAudio: '正在准备音频',
1343
+ speakingResponse: '正在朗读回复',
1344
+ readingAloud: '朗读中',
1345
+ themeSuggestions: '桌面主题建议',
1346
+ noMatchingThemes: '没有匹配的主题。',
1347
+ themeTryPre: '试试 ',
1348
+ themeTryPost: '。',
1349
+ attachLabel: '附加',
1350
+ files: '文件…',
1351
+ folder: '文件夹…',
1352
+ images: '图片…',
1353
+ pasteImage: '粘贴图片',
1354
+ url: 'URL…',
1355
+ promptSnippets: '提示词片段…',
1356
+ tipPre: '提示:输入 ',
1357
+ tipPost: ' 以内联引用文件。',
1358
+ snippetsTitle: '提示词片段',
1359
+ snippetsDesc: '选择一个起始提示词放入输入框。',
1360
+ dropFiles: '拖放文件以附加',
1361
+ dropSession: '拖放以链接此对话',
1362
+ snippets: {
1363
+ codeReview: {
1364
+ label: '代码审查',
1365
+ description: '审查当前更改是否存在回归、遗漏的边界情况和缺失的测试。',
1366
+ text: '请审查这部分是否存在缺陷、回归和缺失的测试。'
1367
+ },
1368
+ implementationPlan: {
1369
+ label: '实现计划',
1370
+ description: '在动代码之前先勾勒方案,让 diff 保持聚焦。',
1371
+ text: '请在修改代码前制定一个简洁的实现计划。'
1372
+ },
1373
+ explainThis: {
1374
+ label: '解释这段',
1375
+ description: '讲解所选代码的工作方式,并链接到关键文件。',
1376
+ text: '请解释这是如何工作的,并指给我关键文件。'
1377
+ }
1378
+ }
1379
+ },
1380
+
1381
+ statusStack: {
1382
+ agents: 'Agents',
1383
+ background: count => `${count} Background`,
1384
+ subagents: count => `${count} Subagent${count === 1 ? '' : 's'}`,
1385
+ todos: (done, total) => `Tasks ${done}/${total}`,
1386
+ running: 'Running',
1387
+ stop: 'Stop',
1388
+ dismiss: 'Dismiss',
1389
+ exit: code => `exit ${code}`,
1390
+ },
1391
+
1392
+ updates: {
1393
+ stages: {
1394
+ idle: '准备中…',
1395
+ prepare: '准备中…',
1396
+ fetch: '下载中…',
1397
+ pull: '马上完成…',
1398
+ pydeps: '收尾中…',
1399
+ restart: '正在重启 NasTech…',
1400
+ manual: '从终端更新',
1401
+ error: '更新已暂停'
1402
+ },
1403
+ checking: '正在检查更新…',
1404
+ checkFailedTitle: '无法检查更新',
1405
+ tryAgain: '重试',
1406
+ notAvailableTitle: '更新不可用',
1407
+ unsupportedMessage: '此版本的 NasTech 无法在应用内自行更新。',
1408
+ connectionRetry: '请检查网络连接后重试。',
1409
+ latestBody: '你正在运行最新版本。',
1410
+ allSetTitle: '已是最新',
1411
+ availableTitle: '有可用更新',
1412
+ availableBody: '新版 NasTech 已可安装。',
1413
+ updateNow: '立即更新',
1414
+ maybeLater: '稍后再说',
1415
+ moreChanges: count => `另有 ${count} 项更改。`,
1416
+ manualTitle: '从终端更新',
1417
+ manualBody: '你是从命令行安装的 NasTech,因此更新也需要在那里运行。请将此命令粘贴到终端:',
1418
+ manualPickedUp: '下次启动 NasTech 时会使用新版本。',
1419
+ copy: '复制',
1420
+ copied: '已复制',
1421
+ done: '完成',
1422
+ applyingBody: 'NasTech 更新器会在自己的窗口中接管,并在完成后重新打开 NasTech。',
1423
+ applyingClose: 'NasTech 将关闭以应用更新。',
1424
+ errorTitle: '更新未完成',
1425
+ errorBody: '没有数据丢失。你可以现在重试。',
1426
+ notNow: '暂不'
1427
+ },
1428
+
1429
+ install: {
1430
+ stageStates: {
1431
+ pending: '等待中',
1432
+ running: '安装中',
1433
+ succeeded: '完成',
1434
+ skipped: '已跳过',
1435
+ failed: '失败'
1436
+ },
1437
+ oneTimeTitle: 'NasTech 需要一次性安装',
1438
+ unsupportedDesc: platform =>
1439
+ `${platform} 暂不支持自动首次启动安装。请打开终端并运行下面的命令,然后重新启动此应用。之后启动会跳过此步骤。`,
1440
+ installCommand: '安装命令',
1441
+ copyCommand: '复制命令',
1442
+ viewDocs: '查看安装文档',
1443
+ installTo: '将安装到',
1444
+ retryAfterRun: '我已运行 -- 重试',
1445
+ failedTitle: '安装失败',
1446
+ settingUpTitle: '正在设置 NasTech Agent',
1447
+ finishingTitle: '正在收尾',
1448
+ failedDesc:
1449
+ '某个安装步骤失败。在 Windows 上,如果另一个 NasTech CLI 或桌面实例正在运行,可能会出现这种情况。请停止正在运行的 NasTech 实例后重试。可查看下面的详情或 desktop 日志中的完整记录。',
1450
+ activeDesc: '这是一次性设置。NasTech 安装器正在下载依赖并配置你的机器。之后启动会跳过此步骤。',
1451
+ progress: (completed, total) => `${completed}/${total} 个步骤已完成`,
1452
+ currentStage: stage => ` -- 当前:${stage}`,
1453
+ fetchingManifest: '正在获取安装器 manifest...',
1454
+ error: '错误',
1455
+ hideOutput: '隐藏安装器输出',
1456
+ showOutput: '显示安装器输出',
1457
+ lines: count => `${count} 行`,
1458
+ noOutput: '暂无输出。',
1459
+ cancelling: '取消中...',
1460
+ cancelInstall: '取消安装',
1461
+ transcriptSaved: '完整记录已保存到',
1462
+ copiedOutput: '已复制!',
1463
+ copyOutput: '复制输出',
1464
+ reloadRetry: '重新加载并重试'
1465
+ },
1466
+
1467
+ onboarding: {
1468
+ headerTitle: '开始设置 NasTech Agent',
1469
+ headerDesc: '连接模型提供方即可开始对话。大多数选项只需一次点击。',
1470
+ preparingInstall: 'NasTech 正在完成安装。首次运行通常不到一分钟。',
1471
+ starting: '正在启动 NasTech…',
1472
+ lookingUpProviders: '正在查找提供方...',
1473
+ collapse: '收起',
1474
+ otherProviders: '其他提供方',
1475
+ haveApiKey: '我有 API 密钥',
1476
+ chooseLater: '稍后再选择提供方',
1477
+ recommended: '推荐',
1478
+ connected: '已连接',
1479
+ featuredPitch: '一个订阅,300+ 前沿模型 — 运行 NasTech 的推荐方式',
1480
+ openRouterPitch: '一个密钥,数百个模型 — 稳妥的默认选择',
1481
+ apiKeyOptions: {
1482
+ openrouter: { short: '一个密钥,多个模型', description: '用一个密钥访问数百个模型。适合新安装的默认选择。' },
1483
+ openai: { short: 'GPT 级模型', description: '直接访问 OpenAI 模型。' },
1484
+ gemini: { short: 'Gemini 模型', description: '直接访问 Google Gemini 模型。' },
1485
+ xai: { short: 'Grok 模型', description: '直接访问 xAI Grok 模型。' },
1486
+ local: {
1487
+ short: '自托管',
1488
+ description: '将 NasTech 指向本地或自托管的 OpenAI 兼容端点 (vLLM、llama.cpp、Ollama 等)。'
1489
+ }
1490
+ },
1491
+ backToSignIn: '返回登录',
1492
+ getKey: '获取密钥',
1493
+ replaceCurrent: '替换当前值',
1494
+ pasteApiKey: '粘贴 API 密钥',
1495
+ couldNotSave: '无法保存凭据。',
1496
+ connecting: '连接中',
1497
+ update: '更新',
1498
+ flowSubtitles: {
1499
+ pkce: '打开浏览器登录,然后回到这里继续',
1500
+ device_code: '在浏览器中打开验证页面 — NasTech 会自动连接',
1501
+ loopback: '打开浏览器登录 — NasTech 会自动连接',
1502
+ external: '先在终端登录一次,然后回来继续对话'
1503
+ },
1504
+ startingSignIn: provider => `正在为 ${provider} 启动登录...`,
1505
+ verifyingCode: provider => `正在通过 ${provider} 验证你的代码...`,
1506
+ connectedProvider: provider => `${provider} 已连接`,
1507
+ connectedPicking: provider => `${provider} 已连接。正在选择默认模型...`,
1508
+ signInFailed: '登录失败,请重试。',
1509
+ pickDifferentProvider: '选择其他提供方',
1510
+ signInWith: provider => `使用 ${provider} 登录`,
1511
+ openedBrowser: provider => `已在浏览器中打开 ${provider}。`,
1512
+ authorizeThere: '请在那里授权 NasTech。',
1513
+ copyAuthCode: '复制授权码并粘贴到下面。',
1514
+ pasteAuthCode: '粘贴授权码',
1515
+ reopenAuthPage: '重新打开授权页面',
1516
+ autoBrowser: provider => `已在浏览器中打开 ${provider}。请在那里授权 NasTech,连接会自动完成,无需复制或粘贴。`,
1517
+ reopenSignInPage: '重新打开登录页面',
1518
+ waitingAuthorize: '等待你授权...',
1519
+ externalPending: provider => `${provider} 通过自己的 CLI 登录。请在终端运行此命令,然后回来选择“我已登录”:`,
1520
+ signedIn: '我已登录',
1521
+ deviceCodeOpened: provider => `已在浏览器中打开 ${provider}。请在那里输入此代码:`,
1522
+ reopenVerification: '重新打开验证页面',
1523
+ copy: '复制',
1524
+ defaultModel: '默认模型',
1525
+ freeTier: '免费层',
1526
+ pro: 'Pro',
1527
+ free: '免费',
1528
+ price: (input, output) => `${input} 输入 / ${output} 输出每 Mtok`,
1529
+ change: '更改',
1530
+ startChatting: '开始',
1531
+ docs: provider => `${provider} 文档`
1532
+ },
1533
+
1534
+ modelPicker: {
1535
+ title: '切换模型',
1536
+ current: '当前:',
1537
+ unknown: '(未知)',
1538
+ search: '筛选提供方和模型...',
1539
+ noModels: '未找到模型。',
1540
+ persistGlobalSession: '全局保存 (否则仅当前会话)',
1541
+ persistGlobal: '全局保存',
1542
+ addProvider: '添加提供方',
1543
+ loadFailed: '无法加载模型',
1544
+ noAuthenticatedProviders: '没有已认证的提供方。',
1545
+ pro: 'Pro',
1546
+ proNeedsSubscription: 'Pro 模型需要付费 NasTech Portal 订阅。',
1547
+ free: '免费',
1548
+ freeTier: '免费层',
1549
+ priceTitle: '每百万 token 的输入/输出价格'
1550
+ },
1551
+
1552
+ modelVisibility: {
1553
+ title: '模型',
1554
+ search: '搜索模型',
1555
+ noAuthenticatedProviders: '没有已认证的提供方。',
1556
+ addProvider: '添加提供方…'
1557
+ },
1558
+
1559
+ shell: {
1560
+ windowControls: '窗口控件',
1561
+ paneControls: '面板控件',
1562
+ appControls: '应用控件',
1563
+ modelMenu: {
1564
+ search: '搜索模型',
1565
+ noModels: '未找到模型',
1566
+ editModels: '编辑模型…',
1567
+ fast: '快速',
1568
+ medium: '中'
1569
+ },
1570
+ modelOptions: {
1571
+ noOptions: '此模型没有可用选项',
1572
+ options: '选项',
1573
+ thinking: '思考',
1574
+ fast: '快速',
1575
+ effort: '推理强度',
1576
+ minimal: '最小',
1577
+ low: '低',
1578
+ medium: '中',
1579
+ high: '高',
1580
+ max: '最高',
1581
+ updateFailed: '模型选项更新失败',
1582
+ fastFailed: '快速模式更新失败'
1583
+ },
1584
+ gatewayMenu: {
1585
+ gateway: '网关',
1586
+ connected: '已连接',
1587
+ connecting: '连接中',
1588
+ offline: '离线',
1589
+ inferenceReady: '推理已就绪',
1590
+ inferenceNotReady: '推理未就绪',
1591
+ checkingInference: '正在检查推理',
1592
+ disconnected: '已断开',
1593
+ openSystem: '打开系统面板',
1594
+ connection: label => `连接:${label}`,
1595
+ recentActivity: '最近活动',
1596
+ viewAllLogs: '查看全部日志 →',
1597
+ messagingPlatforms: '消息平台'
1598
+ },
1599
+ statusbar: {
1600
+ unknown: '未知',
1601
+ restart: '重启',
1602
+ update: '更新',
1603
+ updateInProgress: '正在更新',
1604
+ commitsBehind: (count, branch) => `落后 ${branch} ${count} 个提交`,
1605
+ desktopVersion: version => `NasTech Desktop v${version}`,
1606
+ commit: sha => `提交 ${sha}`,
1607
+ branch: branch => `分支 ${branch}`,
1608
+ closeCommandCenter: '关闭命令中心',
1609
+ openCommandCenter: '打开命令中心',
1610
+ gateway: '网关',
1611
+ gatewayReady: '就绪',
1612
+ gatewayNeedsSetup: '需要设置',
1613
+ gatewayChecking: '检查中',
1614
+ gatewayConnecting: '连接中',
1615
+ gatewayOffline: '离线',
1616
+ gatewayTitle: 'NasTech 推理网关状态',
1617
+ agents: '代理',
1618
+ closeAgents: '关闭代理',
1619
+ openAgents: '打开代理',
1620
+ subagents: count => `${count} 个子代理`,
1621
+ failed: count => `${count} 个失败`,
1622
+ running: count => `${count} 个运行中`,
1623
+ cron: '排程',
1624
+ openCron: '打开排程任务',
1625
+ turnRunning: '运行中',
1626
+ currentTurnElapsed: '当前回合已用时间',
1627
+ contextUsage: '上下文用量',
1628
+ session: '会话',
1629
+ runtimeSessionElapsed: '运行时会话已用时间',
1630
+ yoloOn: 'YOLO 已开启 - 自动批准危险命令。点击关闭。',
1631
+ yoloOff: 'YOLO 已关闭 - 点击自动批准危险命令。',
1632
+ modelNone: '无',
1633
+ noModel: '无模型',
1634
+ switchModel: '切换模型',
1635
+ openModelPicker: '打开模型选择器',
1636
+ modelTitle: (provider, model) => `模型 · ${provider}: ${model}`,
1637
+ providerModelTitle: (provider, model) => `${provider} · ${model}`
1638
+ }
1639
+ },
1640
+
1641
+ rightSidebar: {
1642
+ aria: '右侧边栏',
1643
+ panelsAria: '右侧边栏面板',
1644
+ files: '文件系统',
1645
+ terminal: '终端',
1646
+ noFolderSelected: '未选择文件夹',
1647
+ changeCwdTitle: '更改工作目录',
1648
+ folderTip: cwd => `${cwd} — 点击更改文件夹`,
1649
+ openFolder: '打开文件夹',
1650
+ refreshTree: '刷新文件树',
1651
+ collapseAll: '折叠所有文件夹',
1652
+ previewUnavailable: '预览不可用',
1653
+ couldNotPreview: path => `无法预览 ${path}`,
1654
+ noProjectTitle: '没有项目',
1655
+ noProjectBody: '从状态栏设置工作目录后即可浏览文件。',
1656
+ unreadableTitle: '无法读取',
1657
+ unreadableBody: error => `无法读取此文件夹 (${error})。`,
1658
+ emptyTitle: '空文件夹',
1659
+ emptyBody: '此文件夹为空。',
1660
+ treeErrorTitle: '文件树错误',
1661
+ treeErrorBody: '文件树渲染此文件夹时出错。',
1662
+ tryAgain: '重试',
1663
+ loadingTree: '正在加载文件树',
1664
+ loadingFiles: '正在加载文件',
1665
+ terminalFocus: '聚焦终端视图',
1666
+ terminalSplit: '返回分栏视图',
1667
+ addToChat: '添加到对话',
1668
+ remotePickerTitle: '选择远程文件夹'
1669
+ },
1670
+
1671
+ preview: {
1672
+ tab: '预览',
1673
+ closeTab: label => `关闭 ${label}`,
1674
+ closePane: '关闭预览面板',
1675
+ loading: '正在加载预览',
1676
+ unavailable: '预览不可用',
1677
+ opening: '正在打开...',
1678
+ hide: '隐藏',
1679
+ openPreview: '打开预览',
1680
+ sourceLineTitle: '点击选择 · shift 点击扩展 · 拖到输入框',
1681
+ source: '源码',
1682
+ renderedPreview: '预览',
1683
+ unknownSize: '大小未知',
1684
+ binaryTitle: '这看起来像二进制文件',
1685
+ binaryBody: label => `预览 ${label} 可能会显示不可读文本。`,
1686
+ largeTitle: '此文件较大',
1687
+ largeBody: (label, size) => `${label} 大小为 ${size}。NasTech 只会显示前 512 KB。`,
1688
+ previewAnyway: '仍然预览',
1689
+ truncated: '显示前 512 KB。',
1690
+ noInlineTitle: '没有内联预览',
1691
+ noInlineBody: mimeType => `${mimeType || '此文件类型'} 仍可作为上下文附件。`,
1692
+ console: {
1693
+ deselect: '取消选择条目',
1694
+ select: '选择条目',
1695
+ copyFailed: '无法复制控制台输出',
1696
+ copyEntry: '复制此条目',
1697
+ sendEntry: '将此条目发送到对话',
1698
+ messages: count => `${count} 条控制台消息`,
1699
+ resize: '调整预览控制台大小',
1700
+ title: '预览控制台',
1701
+ selected: count => `已选择 ${count} 条`,
1702
+ sendToChat: '发送到对话',
1703
+ copySelected: '复制所选到剪贴板',
1704
+ copyAll: '全部复制到剪贴板',
1705
+ copy: '复制',
1706
+ clear: '清除',
1707
+ empty: '暂无控制台消息。',
1708
+ promptHeader: '预览控制台:',
1709
+ sentTitle: '已发送到对话',
1710
+ sentMessage: count => `已将 ${count} 条日志添加到输入框`
1711
+ },
1712
+ web: {
1713
+ appFailedToBoot: '预览应用启动失败',
1714
+ serverNotFound: '未找到服务器',
1715
+ failedToLoad: '预览加载失败',
1716
+ tryAgain: '重试',
1717
+ restarting: 'NasTech 正在重启...',
1718
+ askRestart: '让 NasTech 重启服务器',
1719
+ lookingRestart: taskId => `NasTech 正在查找要重启的预览服务器 (${taskId})`,
1720
+ restartingTitle: '正在重启预览服务器',
1721
+ restartingMessage: 'NasTech 正在后台工作。可在预览控制台查看进度。',
1722
+ startRestartFailed: message => `无法启动服务器重启:${message}`,
1723
+ restartFailed: '服务器重启失败',
1724
+ hideConsole: '隐藏预览控制台',
1725
+ showConsole: '显示预览控制台',
1726
+ hideDevTools: '隐藏预览 DevTools',
1727
+ openDevTools: '打开预览 DevTools',
1728
+ finishedRestarting: message => `NasTech 已完成预览服务器重启${message ? `: ${message}` : ''}`,
1729
+ failedRestarting: message => `服务器重启失败:${message}`,
1730
+ unknownError: '未知错误',
1731
+ restartedTitle: '预览服务器已重启',
1732
+ reloadingNow: '正在重新加载预览。',
1733
+ restartFailedTitle: '预览重启失败',
1734
+ restartFailedMessage: 'NasTech 无法重启服务器。',
1735
+ stillWorking: 'NasTech 仍在工作,但还没有收到重启结果。服务器命令可能正在前台运行。',
1736
+ workspaceReloading: '工作区已变更,正在重新加载预览',
1737
+ fileChanged: url => `文件已变更,正在重新加载预览:${url}`,
1738
+ filesChanged: (count, url) => `${count} 个文件变更,正在重新加载预览:${url}`,
1739
+ watchFailed: message => `无法监听预览文件:${message}`,
1740
+ moduleMimeDescription:
1741
+ '模块脚本使用了错误的 MIME 类型。这通常表示静态文件服务器正在服务 Vite/React 应用,而不是项目开发服务器。',
1742
+ loadFailedConsole: (code, message) => `加载失败${code ? ` (${code})` : ''}: ${message}`,
1743
+ unreachableDescription: '无法访问预览页面。',
1744
+ openTarget: url => `打开 ${url}`,
1745
+ fallbackTitle: '预览'
1746
+ }
1747
+ },
1748
+
1749
+ assistant: {
1750
+ thread: {
1751
+ loadingSession: '正在加载会话',
1752
+ loadingResponse: 'NasTech 正在加载回复',
1753
+ thinking: '思考中',
1754
+ today: time => `今天,${time}`,
1755
+ yesterday: time => `昨天,${time}`,
1756
+ copy: '复制',
1757
+ refresh: '刷新',
1758
+ moreActions: '更多操作',
1759
+ branchNewChat: '在新对话中分支',
1760
+ readAloudFailed: '朗读失败',
1761
+ preparingAudio: '正在准备音频...',
1762
+ stopReading: '停止朗读',
1763
+ readAloud: '朗读',
1764
+ editMessage: '编辑消息',
1765
+ stop: '停止',
1766
+ editableCheckpoint: '可编辑检查点',
1767
+ restorePrevious: '恢复上一个检查点',
1768
+ restoreCheckpoint: '恢复检查点',
1769
+ restoreNext: '恢复下一个检查点',
1770
+ goForward: '前进',
1771
+ sendEdited: '发送编辑后的消息',
1772
+ scrollToBottom: '滚动到底部'
1773
+ },
1774
+ approval: {
1775
+ gatewayDisconnected: 'NasTech 网关未连接',
1776
+ sendFailed: '无法发送审批响应',
1777
+ run: '运行',
1778
+ moreOptions: '更多审批选项',
1779
+ allowSession: '允许本会话',
1780
+ alwaysAllowMenu: '始终允许…',
1781
+ jumpToApproval: '需要审批',
1782
+ reject: '拒绝',
1783
+ alwaysTitle: '始终允许此命令?',
1784
+ alwaysDescription: pattern =>
1785
+ `这会将“${pattern}”模式加入永久允许列表 (~/.NASTECH/config.yaml)。NasTech 对类似命令将不再询问,包括当前会话和未来会话。`,
1786
+ alwaysAllow: '始终允许'
1787
+ },
1788
+ clarify: {
1789
+ notReady: '澄清请求尚未就绪',
1790
+ gatewayDisconnected: 'NasTech 网关未连接',
1791
+ sendFailed: '无法发送澄清响应',
1792
+ loadingQuestion: '正在加载问题…',
1793
+ other: '其他 (输入你的答案)',
1794
+ placeholder: '输入你的答案…',
1795
+ shortcut: '⌘/Ctrl + Enter 发送',
1796
+ back: '返回',
1797
+ skip: '跳过',
1798
+ send: '发送'
1799
+ },
1800
+ tool: {
1801
+ code: '代码',
1802
+ copyCode: '复制代码',
1803
+ renderingImage: '正在渲染图片',
1804
+ copyOutput: '复制输出',
1805
+ copyCommand: '复制命令',
1806
+ copyContent: '复制内容',
1807
+ copyUrl: '复制 URL',
1808
+ copyResults: '复制结果',
1809
+ copyQuery: '复制查询',
1810
+ copyFile: '复制文件',
1811
+ copyPath: '复制路径',
1812
+ outputAlt: '工具输出',
1813
+ rawResponse: '原始响应',
1814
+ copyActivity: '复制活动',
1815
+ recoveredOne: '在 1 个失败步骤后已恢复',
1816
+ recoveredMany: count => `在 ${count} 个失败步骤后已恢复`,
1817
+ failedOne: '1 个步骤失败',
1818
+ failedMany: count => `${count} 个步骤失败`,
1819
+ statusRunning: '运行中',
1820
+ statusError: '错误',
1821
+ statusRecovered: '已恢复',
1822
+ statusDone: '完成'
1823
+ }
1824
+ },
1825
+
1826
+ prompts: {
1827
+ gatewayDisconnected: 'NasTech 网关未连接',
1828
+ sudoSendFailed: '无法发送 sudo 密码',
1829
+ secretSendFailed: '无法发送密钥',
1830
+ sudoTitle: '管理员密码',
1831
+ sudoDesc: 'NasTech 需要你的 sudo 密码来运行特权命令。它只会发送给你的本地 agent。',
1832
+ sudoPlaceholder: 'sudo 密码',
1833
+ secretTitle: '需要密钥',
1834
+ secretDesc: 'NasTech 需要一个凭据才能继续。',
1835
+ secretPlaceholder: '密钥值'
1836
+ },
1837
+
1838
+ desktop: {
1839
+ audioReadFailed: '无法读取录制的音频',
1840
+ sessionUnavailable: '会话不可用',
1841
+ createSessionFailed: '无法创建新会话',
1842
+ promptFailed: '提示词发送失败',
1843
+ providerCredentialRequired: '发送第一条消息前请先添加提供方凭据。',
1844
+ emptySlashCommand: '空 slash 命令',
1845
+ desktopCommands: '桌面端命令',
1846
+ skillCommandsAvailable: count => `${count} 个技能命令可用。`,
1847
+ warningLine: message => `警告:${message}`,
1848
+ yoloArmed: '此对话已启用 YOLO',
1849
+ yoloOff: 'YOLO 已关闭',
1850
+ yoloSystem: active => `此会话 YOLO ${active ? '已开启' : '已关闭'}`,
1851
+ yoloTitle: 'YOLO',
1852
+ yoloToggleFailed: '无法切换 YOLO',
1853
+ profileStatus: current => `配置档案:${current}。使用 /profile <name> 或“新建会话”选择器在其他配置档案中开始对话。`,
1854
+ unknownProfile: '未知配置档案',
1855
+ noProfileNamed: (target, available) => `没有名为“${target}”的配置档案。可用:${available}`,
1856
+ newChatsProfile: name => `新对话将使用配置档案 ${name}。`,
1857
+ setProfileFailed: '设置配置档案失败',
1858
+ sttDisabled: '设置中已禁用语音转文字。',
1859
+ stopFailed: '停止失败',
1860
+ regenerateFailed: '重新生成失败',
1861
+ editFailed: '编辑失败',
1862
+ resumeFailed: '恢复失败',
1863
+ nothingToBranch: '没有可分支的内容',
1864
+ branchNeedsChat: '分支前请先开始或恢复一个对话。',
1865
+ sessionBusy: '会话忙碌中',
1866
+ branchStopCurrent: '分支此对话前请先停止当前回合。',
1867
+ branchNoText: '此消息没有可用于分支的文本。',
1868
+ branchTitle: '分支',
1869
+ branchFailed: '分支失败',
1870
+ deleteFailed: '删除失败',
1871
+ archived: '已归档',
1872
+ archiveFailed: '归档失败',
1873
+ cwdChangeFailed: '工作目录更改失败',
1874
+ cwdStagedTitle: '工作目录已暂存',
1875
+ cwdStagedMessage: '重启桌面后端后,工作目录更改才会应用到当前活跃会话。',
1876
+ modelSwitchFailed: '模型切换失败',
1877
+ sessionExported: '会话已导出',
1878
+ sessionExportFailed: '无法导出会话',
1879
+ imageSaved: '图片已保存',
1880
+ downloadStarted: '下载已开始',
1881
+ restartToUseSaveImage: '重启 NasTech 桌面版后可使用保存图片。',
1882
+ restartToSaveImages: '重启 NasTech 桌面版以保存图片',
1883
+ imageDownloadFailed: '图片下载失败',
1884
+ openImage: '打开图片',
1885
+ downloadImage: '下载图片',
1886
+ savingImage: '正在保存图片',
1887
+ imagePreviewFailed: '图片预览失败',
1888
+ imageAttach: '附加图片',
1889
+ imageWriteFailed: '无法将图片写入磁盘。',
1890
+ imageAttachFailed: '附加图片失败',
1891
+ attachImages: '附加图片',
1892
+ clipboard: '剪贴板',
1893
+ noClipboardImage: '剪贴板中没有图片',
1894
+ clipboardPasteFailed: '粘贴剪贴板失败',
1895
+ dropFiles: '拖放文件'
1896
+ },
1897
+
1898
+ errors: {
1899
+ genericFailure: '发生错误',
1900
+ boundaryTitle: '界面出错了',
1901
+ boundaryDesc: '此视图遇到意外错误。你的对话和设置是安全的。',
1902
+ reloadWindow: '重新加载窗口',
1903
+ openLogs: '打开日志'
1904
+ },
1905
+
1906
+ ui: {
1907
+ search: {
1908
+ clear: '清除搜索'
1909
+ },
1910
+ pagination: {
1911
+ label: '分页',
1912
+ previous: '上一页',
1913
+ previousAria: '前往上一页',
1914
+ next: '下一页',
1915
+ nextAria: '前往下一页'
1916
+ },
1917
+ sidebar: {
1918
+ title: '侧边栏',
1919
+ description: '显示移动端侧边栏。',
1920
+ toggle: '切换侧边栏'
1921
+ }
1922
+ }
1923
+ }