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,545 @@
1
+ import {
2
+ Brain,
3
+ type IconComponent,
4
+ Lock,
5
+ MessageCircle,
6
+ Mic,
7
+ Monitor,
8
+ Moon,
9
+ Palette,
10
+ Sparkles,
11
+ Sun,
12
+ Wrench
13
+ } from '@/lib/icons'
14
+ import type { ThemeMode } from '@/themes/context'
15
+
16
+ import type { DesktopConfigSection } from './types'
17
+ import { defineFieldCopy } from './field-copy'
18
+
19
+ // Provider group definitions used to fold raw env-var names like
20
+ // ``XAI_API_KEY`` into a single "xAI" card with a friendly label, short
21
+ // description, and signup URL. Membership is determined by longest
22
+ // prefix match (see ``providerGroup`` in helpers.ts) so more specific
23
+ // prefixes (``MINIMAX_CN_``) correctly beat their general parents
24
+ // (``MINIMAX_``). New providers should be added here so they get their
25
+ // own card in Settings → Keys instead of being lumped into "Other".
26
+ interface ProviderPrefix {
27
+ prefix: string
28
+ name: string
29
+ /** Optional one-line tagline shown beneath the group name. */
30
+ description?: string
31
+ /** Optional canonical signup/console URL surfaced from the card header. */
32
+ docsUrl?: string
33
+ /** Lower numbers float to the top of the providers list. */
34
+ priority: number
35
+ }
36
+
37
+ export const EMPTY_SELECT_VALUE = '__NASTECH_empty__'
38
+ export const CONTROL_TEXT = 'text-xs'
39
+
40
+ export const PROVIDER_GROUPS: ProviderPrefix[] = [
41
+ {
42
+ prefix: 'NASTECH_',
43
+ name: 'NasTech Portal',
44
+ description: 'Hosted NasTech & NasTech-trained models',
45
+ docsUrl: 'https://portal.nastechai.com',
46
+ priority: 0
47
+ },
48
+ {
49
+ prefix: 'OPENROUTER_',
50
+ name: 'OpenRouter',
51
+ description: 'Aggregator for hundreds of frontier models',
52
+ docsUrl: 'https://openrouter.ai/keys',
53
+ priority: 1
54
+ },
55
+ {
56
+ prefix: 'ANTHROPIC_',
57
+ name: 'Anthropic',
58
+ description: 'Claude API access (Sonnet, Opus, Haiku)',
59
+ docsUrl: 'https://console.anthropic.com/settings/keys',
60
+ priority: 2
61
+ },
62
+ {
63
+ prefix: 'XAI_',
64
+ name: 'xAI',
65
+ description: 'Grok models (use OAuth for SuperGrok / Premium+)',
66
+ docsUrl: 'https://console.x.ai/',
67
+ priority: 3
68
+ },
69
+ {
70
+ prefix: 'GOOGLE_',
71
+ name: 'Gemini',
72
+ description: 'Google AI Studio (Gemini 1.5 / 2.0 / 2.5)',
73
+ docsUrl: 'https://aistudio.google.com/app/apikey',
74
+ priority: 4
75
+ },
76
+ { prefix: 'GEMINI_', name: 'Gemini', priority: 4 },
77
+ { prefix: 'NASTECH_GEMINI_', name: 'Gemini', priority: 4 },
78
+ {
79
+ prefix: 'DEEPSEEK_',
80
+ name: 'DeepSeek',
81
+ description: 'Direct DeepSeek API (V3.x, R1)',
82
+ docsUrl: 'https://platform.deepseek.com/api_keys',
83
+ priority: 5
84
+ },
85
+ {
86
+ prefix: 'DASHSCOPE_',
87
+ name: 'DashScope (Qwen)',
88
+ description: 'Alibaba Cloud DashScope — Qwen and multi-vendor models',
89
+ docsUrl: 'https://modelstudio.console.alibabacloud.com/',
90
+ priority: 6
91
+ },
92
+ { prefix: 'NASTECH_QWEN_', name: 'DashScope (Qwen)', priority: 6 },
93
+ {
94
+ prefix: 'GLM_',
95
+ name: 'GLM / Z.AI',
96
+ description: 'Zhipu GLM-4.6 and Z.AI hosted endpoints',
97
+ docsUrl: 'https://z.ai/',
98
+ priority: 7
99
+ },
100
+ { prefix: 'ZAI_', name: 'GLM / Z.AI', priority: 7 },
101
+ { prefix: 'Z_AI_', name: 'GLM / Z.AI', priority: 7 },
102
+ {
103
+ prefix: 'KIMI_',
104
+ name: 'Kimi / Moonshot',
105
+ description: 'Moonshot Kimi K2 / coding endpoints',
106
+ docsUrl: 'https://platform.moonshot.cn/',
107
+ priority: 8
108
+ },
109
+ {
110
+ prefix: 'KIMI_CN_',
111
+ name: 'Kimi (China)',
112
+ description: 'Moonshot China endpoint',
113
+ docsUrl: 'https://platform.moonshot.cn/',
114
+ priority: 9
115
+ },
116
+ {
117
+ prefix: 'MINIMAX_',
118
+ name: 'MiniMax',
119
+ description: 'MiniMax-M2 and Hailuo international endpoints',
120
+ docsUrl: 'https://www.minimax.io/',
121
+ priority: 10
122
+ },
123
+ {
124
+ prefix: 'MINIMAX_CN_',
125
+ name: 'MiniMax (China)',
126
+ description: 'MiniMax mainland China endpoint',
127
+ docsUrl: 'https://www.minimaxi.com/',
128
+ priority: 11
129
+ },
130
+ {
131
+ prefix: 'HF_',
132
+ name: 'Hugging Face',
133
+ description: 'Inference Providers — 20+ open models via router.huggingface.co',
134
+ docsUrl: 'https://huggingface.co/settings/tokens',
135
+ priority: 12
136
+ },
137
+ {
138
+ prefix: 'OPENCODE_ZEN_',
139
+ name: 'OpenCode Zen',
140
+ description: 'Pay-as-you-go access to curated coding models',
141
+ docsUrl: 'https://opencode.ai/auth',
142
+ priority: 13
143
+ },
144
+ {
145
+ prefix: 'OPENCODE_GO_',
146
+ name: 'OpenCode Go',
147
+ description: '$10/month subscription for open coding models',
148
+ docsUrl: 'https://opencode.ai/auth',
149
+ priority: 14
150
+ },
151
+ {
152
+ prefix: 'NVIDIA_',
153
+ name: 'NVIDIA NIM',
154
+ description: 'build.nvidia.com or your own local NIM endpoint',
155
+ docsUrl: 'https://build.nvidia.com/',
156
+ priority: 15
157
+ },
158
+ {
159
+ prefix: 'OLLAMA_',
160
+ name: 'Ollama Cloud',
161
+ description: 'Cloud-hosted open models from ollama.com',
162
+ docsUrl: 'https://ollama.com/settings',
163
+ priority: 16
164
+ },
165
+ {
166
+ prefix: 'LM_',
167
+ name: 'LM Studio',
168
+ description: 'Local LM Studio server (OpenAI-compatible)',
169
+ docsUrl: 'https://lmstudio.ai/docs/local-server',
170
+ priority: 17
171
+ },
172
+ {
173
+ prefix: 'STEPFUN_',
174
+ name: 'StepFun',
175
+ description: 'StepFun Step Plan coding models',
176
+ docsUrl: 'https://platform.stepfun.com/',
177
+ priority: 18
178
+ },
179
+ {
180
+ prefix: 'XIAOMI_',
181
+ name: 'Xiaomi MiMo',
182
+ description: 'MiMo-V2.5 and Xiaomi proprietary models',
183
+ docsUrl: 'https://platform.xiaomimimo.com',
184
+ priority: 19
185
+ },
186
+ {
187
+ prefix: 'ARCEEAI_',
188
+ name: 'Arcee AI',
189
+ description: 'Arcee-hosted small + medium models',
190
+ docsUrl: 'https://chat.arcee.ai/',
191
+ priority: 20
192
+ },
193
+ { prefix: 'ARCEE_', name: 'Arcee AI', priority: 20 },
194
+ {
195
+ prefix: 'GMI_',
196
+ name: 'GMI Cloud',
197
+ description: 'GMI Cloud GPU + model serving',
198
+ docsUrl: 'https://www.gmicloud.ai/',
199
+ priority: 21
200
+ },
201
+ {
202
+ prefix: 'AZURE_FOUNDRY_',
203
+ name: 'Azure Foundry',
204
+ description: 'Azure AI Foundry custom endpoints (OpenAI / Anthropic-compatible)',
205
+ docsUrl: 'https://ai.azure.com/',
206
+ priority: 22
207
+ },
208
+ {
209
+ prefix: 'AWS_',
210
+ name: 'AWS Bedrock',
211
+ description: 'Authenticate via AWS profile + region',
212
+ docsUrl: 'https://docs.aws.amazon.com/bedrock/latest/userguide/bedrock-regions.html',
213
+ priority: 23
214
+ }
215
+ ]
216
+
217
+ export const BUILTIN_PERSONALITIES = [
218
+ 'helpful',
219
+ 'concise',
220
+ 'technical',
221
+ 'creative',
222
+ 'teacher',
223
+ 'kawaii',
224
+ 'catgirl',
225
+ 'pirate',
226
+ 'shakespeare',
227
+ 'surfer',
228
+ 'noir',
229
+ 'uwu',
230
+ 'philosopher',
231
+ 'hype'
232
+ ]
233
+
234
+ // Schema-side select overrides for desktop-relevant enum fields whose
235
+ // backend schema only declares a string type.
236
+ export const ENUM_OPTIONS: Record<string, string[]> = {
237
+ 'agent.image_input_mode': ['auto', 'native', 'text'],
238
+ 'approvals.mode': ['manual', 'smart', 'off'],
239
+ 'code_execution.mode': ['project', 'strict'],
240
+ 'context.engine': ['compressor', 'default', 'custom'],
241
+ 'delegation.reasoning_effort': ['', 'minimal', 'low', 'medium', 'high', 'xhigh'],
242
+ 'memory.provider': ['', 'builtin', 'honcho'],
243
+ 'stt.elevenlabs.model_id': ['scribe_v2', 'scribe_v1'],
244
+ 'stt.local.model': ['tiny', 'base', 'small', 'medium', 'large-v3'],
245
+ 'tts.openai.voice': ['alloy', 'echo', 'fable', 'onyx', 'nova', 'shimmer'],
246
+ 'updates.non_interactive_local_changes': ['stash', 'discard']
247
+ }
248
+
249
+ export const FIELD_LABELS: Record<string, string> = defineFieldCopy({
250
+ model: 'Default Model',
251
+ modelContextLength: 'Context Window',
252
+ fallbackProviders: 'Fallback Models',
253
+ toolsets: 'Enabled Toolsets',
254
+ timezone: 'Timezone',
255
+ display: {
256
+ personality: 'Personality',
257
+ showReasoning: 'Reasoning Blocks'
258
+ },
259
+ agent: {
260
+ maxTurns: 'Max Agent Steps',
261
+ imageInputMode: 'Image Attachments',
262
+ apiMaxRetries: 'API Retries',
263
+ serviceTier: 'Service Tier',
264
+ toolUseEnforcement: 'Tool-Use Enforcement'
265
+ },
266
+ terminal: {
267
+ cwd: 'Working Directory',
268
+ backend: 'Execution Backend',
269
+ timeout: 'Command Timeout',
270
+ persistentShell: 'Persistent Shell',
271
+ envPassthrough: 'Environment Passthrough'
272
+ },
273
+ fileReadMaxChars: 'File Read Limit',
274
+ toolOutput: {
275
+ maxBytes: 'Terminal Output Limit',
276
+ maxLines: 'File Page Limit',
277
+ maxLineLength: 'Line Length Limit'
278
+ },
279
+ codeExecution: {
280
+ mode: 'Code Execution Mode'
281
+ },
282
+ approvals: {
283
+ mode: 'Approval Mode',
284
+ timeout: 'Approval Timeout',
285
+ mcpReloadConfirm: 'Confirm MCP Reloads'
286
+ },
287
+ commandAllowlist: 'Command Allowlist',
288
+ security: {
289
+ redactSecrets: 'Redact Secrets',
290
+ allowPrivateUrls: 'Allow Private URLs'
291
+ },
292
+ browser: {
293
+ allowPrivateUrls: 'Browser Private URLs',
294
+ autoLocalForPrivateUrls: 'Local Browser For Private URLs'
295
+ },
296
+ checkpoints: {
297
+ enabled: 'File Checkpoints',
298
+ maxSnapshots: 'Checkpoint Limit'
299
+ },
300
+ voice: {
301
+ recordKey: 'Voice Shortcut',
302
+ maxRecordingSeconds: 'Max Recording Length',
303
+ autoTts: 'Read Responses Aloud'
304
+ },
305
+ stt: {
306
+ enabled: 'Speech To Text',
307
+ provider: 'Speech-To-Text Provider',
308
+ local: {
309
+ model: 'Local Transcription Model',
310
+ language: 'Transcription Language'
311
+ },
312
+ elevenlabs: {
313
+ modelId: 'ElevenLabs STT Model',
314
+ languageCode: 'ElevenLabs Language',
315
+ tagAudioEvents: 'Tag Audio Events',
316
+ diarize: 'Speaker Diarization'
317
+ }
318
+ },
319
+ tts: {
320
+ provider: 'Text-To-Speech Provider',
321
+ edge: {
322
+ voice: 'Edge Voice'
323
+ },
324
+ openai: {
325
+ model: 'OpenAI TTS Model',
326
+ voice: 'OpenAI Voice'
327
+ },
328
+ elevenlabs: {
329
+ voiceId: 'ElevenLabs Voice',
330
+ modelId: 'ElevenLabs Model'
331
+ }
332
+ },
333
+ memory: {
334
+ memoryEnabled: 'Persistent Memory',
335
+ userProfileEnabled: 'User Profile',
336
+ memoryCharLimit: 'Memory Budget',
337
+ userCharLimit: 'Profile Budget',
338
+ provider: 'Memory Provider'
339
+ },
340
+ context: {
341
+ engine: 'Context Engine'
342
+ },
343
+ compression: {
344
+ enabled: 'Auto-Compression',
345
+ threshold: 'Compression Threshold',
346
+ targetRatio: 'Compression Target',
347
+ protectLastN: 'Protected Recent Messages'
348
+ },
349
+ delegation: {
350
+ model: 'Subagent Model',
351
+ provider: 'Subagent Provider',
352
+ maxIterations: 'Subagent Turn Limit',
353
+ maxConcurrentChildren: 'Parallel Subagents',
354
+ childTimeoutSeconds: 'Subagent Timeout',
355
+ reasoningEffort: 'Subagent Reasoning Effort'
356
+ },
357
+ updates: {
358
+ nonInteractiveLocalChanges: 'In-App Update Local Changes'
359
+ }
360
+ })
361
+
362
+ export const FIELD_DESCRIPTIONS: Record<string, string> = defineFieldCopy({
363
+ model: 'Used for new chats unless you pick a different model in the composer.',
364
+ modelContextLength: "Leave at 0 to use the selected model's detected context window.",
365
+ fallbackProviders: 'Backup provider:model entries to try if the default model fails.',
366
+ display: {
367
+ personality: 'Default assistant style for new sessions.',
368
+ showReasoning: 'Show reasoning sections when the backend provides them.'
369
+ },
370
+ timezone: 'Used when NasTech needs local time context. Blank uses the system timezone.',
371
+ agent: {
372
+ imageInputMode: 'Controls how image attachments are sent to the model.',
373
+ maxTurns: 'Upper bound for tool-calling turns before NasTech stops a run.'
374
+ },
375
+ terminal: {
376
+ cwd: 'Default project folder for tool and terminal work.',
377
+ persistentShell: 'Keep shell state between commands when the backend supports it.',
378
+ envPassthrough: 'Environment variables to pass into tool execution.'
379
+ },
380
+ codeExecution: {
381
+ mode: 'How strictly code execution is scoped to the current project.'
382
+ },
383
+ fileReadMaxChars: 'Maximum characters NasTech can read from one file request.',
384
+ approvals: {
385
+ mode: 'How NasTech handles commands that need explicit approval.',
386
+ timeout: 'How long approval prompts wait before timing out.'
387
+ },
388
+ security: {
389
+ redactSecrets: 'Hide detected secrets from model-visible content when possible.'
390
+ },
391
+ checkpoints: {
392
+ enabled: 'Create rollback snapshots before file edits.'
393
+ },
394
+ memory: {
395
+ memoryEnabled: 'Save durable memories that can help future sessions.',
396
+ userProfileEnabled: 'Maintain a compact profile of user preferences.'
397
+ },
398
+ context: {
399
+ engine: 'Strategy for managing long conversations near the context limit.'
400
+ },
401
+ compression: {
402
+ enabled: 'Summarize older context when conversations get large.'
403
+ },
404
+ voice: {
405
+ autoTts: 'Automatically speak assistant responses.'
406
+ },
407
+ stt: {
408
+ enabled: 'Enable local or provider-backed speech transcription.',
409
+ elevenlabs: {
410
+ languageCode: 'Optional ISO-639-3 language code. Blank lets ElevenLabs auto-detect.'
411
+ }
412
+ },
413
+ updates: {
414
+ nonInteractiveLocalChanges:
415
+ 'When NasTech updates itself from the app (no terminal prompt), keep local source edits (stash) or throw them away (discard). Terminal updates always ask.'
416
+ }
417
+ })
418
+
419
+ // Curated desktop config surface: only fields a user might tune from the app.
420
+ export const SECTIONS: DesktopConfigSection[] = [
421
+ {
422
+ id: 'model',
423
+ label: 'Model',
424
+ icon: Sparkles,
425
+ keys: ['model_context_length', 'fallback_providers']
426
+ },
427
+ {
428
+ id: 'chat',
429
+ label: 'Chat',
430
+ icon: MessageCircle,
431
+ keys: ['display.personality', 'timezone', 'display.show_reasoning', 'agent.image_input_mode']
432
+ },
433
+ {
434
+ id: 'appearance',
435
+ label: 'Appearance',
436
+ icon: Palette,
437
+ keys: []
438
+ },
439
+ {
440
+ id: 'workspace',
441
+ label: 'Workspace',
442
+ icon: Monitor,
443
+ keys: [
444
+ 'terminal.cwd',
445
+ 'code_execution.mode',
446
+ 'terminal.persistent_shell',
447
+ 'terminal.env_passthrough',
448
+ 'file_read_max_chars'
449
+ ]
450
+ },
451
+ {
452
+ id: 'safety',
453
+ label: 'Safety',
454
+ icon: Lock,
455
+ keys: [
456
+ 'approvals.mode',
457
+ 'approvals.timeout',
458
+ 'approvals.mcp_reload_confirm',
459
+ 'command_allowlist',
460
+ 'security.redact_secrets',
461
+ 'security.allow_private_urls',
462
+ 'browser.allow_private_urls',
463
+ 'browser.auto_local_for_private_urls',
464
+ 'checkpoints.enabled'
465
+ ]
466
+ },
467
+ {
468
+ id: 'memory',
469
+ label: 'Memory & Context',
470
+ icon: Brain,
471
+ keys: [
472
+ 'memory.memory_enabled',
473
+ 'memory.user_profile_enabled',
474
+ 'memory.memory_char_limit',
475
+ 'memory.user_char_limit',
476
+ 'memory.provider',
477
+ 'context.engine',
478
+ 'compression.enabled',
479
+ 'compression.threshold',
480
+ 'compression.target_ratio',
481
+ 'compression.protect_last_n'
482
+ ]
483
+ },
484
+ {
485
+ id: 'voice',
486
+ label: 'Voice',
487
+ icon: Mic,
488
+ keys: [
489
+ 'tts.provider',
490
+ 'stt.enabled',
491
+ 'stt.provider',
492
+ 'voice.auto_tts',
493
+ 'tts.edge.voice',
494
+ 'tts.openai.model',
495
+ 'tts.openai.voice',
496
+ 'tts.elevenlabs.voice_id',
497
+ 'tts.elevenlabs.model_id',
498
+ 'stt.local.model',
499
+ 'stt.local.language',
500
+ 'stt.elevenlabs.model_id',
501
+ 'stt.elevenlabs.language_code',
502
+ 'stt.elevenlabs.tag_audio_events',
503
+ 'stt.elevenlabs.diarize',
504
+ 'voice.record_key',
505
+ 'voice.max_recording_seconds'
506
+ ]
507
+ },
508
+ {
509
+ id: 'advanced',
510
+ label: 'Advanced',
511
+ icon: Wrench,
512
+ keys: [
513
+ 'toolsets',
514
+ 'terminal.backend',
515
+ 'terminal.timeout',
516
+ 'tool_output.max_bytes',
517
+ 'tool_output.max_lines',
518
+ 'tool_output.max_line_length',
519
+ 'checkpoints.max_snapshots',
520
+ 'agent.max_turns',
521
+ 'agent.api_max_retries',
522
+ 'agent.service_tier',
523
+ 'agent.tool_use_enforcement',
524
+ 'delegation.model',
525
+ 'delegation.provider',
526
+ 'delegation.max_iterations',
527
+ 'delegation.max_concurrent_children',
528
+ 'delegation.child_timeout_seconds',
529
+ 'delegation.reasoning_effort',
530
+ 'updates.non_interactive_local_changes'
531
+ ]
532
+ }
533
+ ]
534
+
535
+ export interface ModeOption {
536
+ id: ThemeMode
537
+ label: string
538
+ icon: IconComponent
539
+ }
540
+
541
+ export const MODE_OPTIONS: ModeOption[] = [
542
+ { id: 'light', label: 'Light', icon: Sun },
543
+ { id: 'dark', label: 'Dark', icon: Moon },
544
+ { id: 'system', label: 'System', icon: Monitor }
545
+ ]