fss-link 1.0.40 → 1.0.45

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 (428) hide show
  1. package/dist/commands/mcp/add.test.ts +122 -0
  2. package/dist/commands/mcp/add.ts +222 -0
  3. package/dist/commands/mcp/list.test.ts +154 -0
  4. package/dist/commands/mcp/list.ts +139 -0
  5. package/dist/commands/mcp/remove.test.ts +69 -0
  6. package/dist/commands/mcp/remove.ts +60 -0
  7. package/dist/commands/mcp.test.ts +55 -0
  8. package/dist/commands/mcp.ts +27 -0
  9. package/dist/config/apiValidation.test.ts +118 -0
  10. package/dist/config/auth.test.ts +79 -0
  11. package/dist/config/auth.ts +100 -0
  12. package/dist/config/config.integration.test.ts +407 -0
  13. package/dist/config/config.test.ts +1952 -0
  14. package/dist/config/config.ts +690 -0
  15. package/dist/config/database.test.ts +96 -0
  16. package/dist/config/database.ts +752 -0
  17. package/dist/config/extension.test.ts +236 -0
  18. package/dist/config/extension.ts +180 -0
  19. package/dist/config/keyBindings.test.ts +62 -0
  20. package/dist/config/keyBindings.ts +184 -0
  21. package/dist/config/modelManager.ts +275 -0
  22. package/dist/config/providerManager.ts +244 -0
  23. package/dist/config/providerPersistence.test.ts +377 -0
  24. package/dist/config/providerPersistence.ts +105 -0
  25. package/dist/config/sandboxConfig.ts +107 -0
  26. package/dist/config/settings.test.ts +1424 -0
  27. package/dist/config/settings.ts +517 -0
  28. package/dist/config/settingsSchema.test.ts +252 -0
  29. package/dist/config/settingsSchema.ts +728 -0
  30. package/dist/config/trustedFolders.test.ts +208 -0
  31. package/dist/config/trustedFolders.ts +167 -0
  32. package/dist/gemini.test.tsx +252 -0
  33. package/dist/gemini.tsx +357 -0
  34. package/dist/generated/git-commit.ts +10 -0
  35. package/dist/index.ts +21 -0
  36. package/dist/nonInteractiveCli.test.ts +276 -0
  37. package/dist/nonInteractiveCli.ts +143 -0
  38. package/dist/package.json +87 -87
  39. package/dist/patches/is-in-ci.ts +17 -0
  40. package/dist/services/BuiltinCommandLoader.test.ts +127 -0
  41. package/dist/services/BuiltinCommandLoader.ts +95 -0
  42. package/dist/services/CommandService.test.ts +352 -0
  43. package/dist/services/CommandService.ts +103 -0
  44. package/dist/services/FileCommandLoader.test.ts +1002 -0
  45. package/dist/services/FileCommandLoader.ts +289 -0
  46. package/dist/services/McpPromptLoader.ts +231 -0
  47. package/dist/services/SearchEngineConfigProvider.ts +100 -0
  48. package/dist/services/prompt-processors/argumentProcessor.test.ts +41 -0
  49. package/dist/services/prompt-processors/argumentProcessor.ts +23 -0
  50. package/dist/services/prompt-processors/shellProcessor.test.ts +709 -0
  51. package/dist/services/prompt-processors/shellProcessor.ts +248 -0
  52. package/dist/services/prompt-processors/types.ts +44 -0
  53. package/dist/services/types.ts +24 -0
  54. package/dist/src/config/apiValidation.test.d.ts +6 -0
  55. package/dist/src/config/apiValidation.test.js +99 -0
  56. package/dist/src/config/apiValidation.test.js.map +1 -0
  57. package/dist/src/config/database.d.ts +32 -0
  58. package/dist/src/config/database.js +281 -2
  59. package/dist/src/config/database.js.map +1 -1
  60. package/dist/src/config/database.test.d.ts +6 -0
  61. package/dist/src/config/database.test.js +80 -0
  62. package/dist/src/config/database.test.js.map +1 -0
  63. package/dist/src/config/providerManager.d.ts +74 -0
  64. package/dist/src/config/providerManager.js +203 -0
  65. package/dist/src/config/providerManager.js.map +1 -0
  66. package/dist/src/config/providerPersistence.d.ts +75 -0
  67. package/dist/src/config/providerPersistence.js +55 -0
  68. package/dist/src/config/providerPersistence.js.map +1 -0
  69. package/dist/src/config/providerPersistence.test.d.ts +6 -0
  70. package/dist/src/config/providerPersistence.test.js +283 -0
  71. package/dist/src/config/providerPersistence.test.js.map +1 -0
  72. package/dist/src/config/settingsSchema.d.ts +9 -0
  73. package/dist/src/config/settingsSchema.js +9 -0
  74. package/dist/src/config/settingsSchema.js.map +1 -1
  75. package/dist/src/generated/git-commit.d.ts +1 -1
  76. package/dist/src/generated/git-commit.js +1 -1
  77. package/dist/src/services/BuiltinCommandLoader.js +2 -0
  78. package/dist/src/services/BuiltinCommandLoader.js.map +1 -1
  79. package/dist/src/ui/App.js +14 -2
  80. package/dist/src/ui/App.js.map +1 -1
  81. package/dist/src/ui/commands/contextCommand.d.ts +7 -0
  82. package/dist/src/ui/commands/contextCommand.js +115 -0
  83. package/dist/src/ui/commands/contextCommand.js.map +1 -0
  84. package/dist/src/ui/components/ContextUsageDisplay.d.ts +3 -1
  85. package/dist/src/ui/components/ContextUsageDisplay.js +43 -3
  86. package/dist/src/ui/components/ContextUsageDisplay.js.map +1 -1
  87. package/dist/src/ui/components/Footer.d.ts +1 -0
  88. package/dist/src/ui/components/Footer.js +2 -2
  89. package/dist/src/ui/components/Footer.js.map +1 -1
  90. package/dist/src/ui/components/GeminiKeyDialog.d.ts +11 -0
  91. package/dist/src/ui/components/GeminiKeyDialog.js +156 -0
  92. package/dist/src/ui/components/GeminiKeyDialog.js.map +1 -0
  93. package/dist/src/ui/components/OpenAIEndpointDialog.d.ts +19 -0
  94. package/dist/src/ui/components/OpenAIEndpointDialog.js +163 -0
  95. package/dist/src/ui/components/OpenAIEndpointDialog.js.map +1 -0
  96. package/dist/src/ui/components/WelcomeBackDialog.d.ts +36 -0
  97. package/dist/src/ui/components/WelcomeBackDialog.js +109 -0
  98. package/dist/src/ui/components/WelcomeBackDialog.js.map +1 -0
  99. package/dist/src/ui/hooks/useWelcomeBack.d.ts +52 -0
  100. package/dist/src/ui/hooks/useWelcomeBack.js +214 -0
  101. package/dist/src/ui/hooks/useWelcomeBack.js.map +1 -0
  102. package/dist/src/zed-integration/schema.d.ts +1516 -1516
  103. package/dist/test-setup.ts +12 -0
  104. package/dist/test-utils/customMatchers.ts +65 -0
  105. package/dist/test-utils/mockCommandContext.test.ts +62 -0
  106. package/dist/test-utils/mockCommandContext.ts +105 -0
  107. package/dist/test-utils/render.tsx +18 -0
  108. package/dist/tsconfig.tsbuildinfo +1 -1
  109. package/dist/ui/App.test.tsx +2181 -0
  110. package/dist/ui/App.tsx +1344 -0
  111. package/dist/ui/IdeIntegrationNudge.tsx +98 -0
  112. package/dist/ui/__snapshots__/App.test.tsx.snap +124 -0
  113. package/dist/ui/colors.ts +56 -0
  114. package/dist/ui/commands/aboutCommand.test.ts +153 -0
  115. package/dist/ui/commands/aboutCommand.ts +49 -0
  116. package/dist/ui/commands/authCommand.test.ts +36 -0
  117. package/dist/ui/commands/authCommand.ts +17 -0
  118. package/dist/ui/commands/bugCommand.test.ts +114 -0
  119. package/dist/ui/commands/bugCommand.ts +92 -0
  120. package/dist/ui/commands/chatCommand.test.ts +414 -0
  121. package/dist/ui/commands/chatCommand.ts +280 -0
  122. package/dist/ui/commands/clearCommand.test.ts +100 -0
  123. package/dist/ui/commands/clearCommand.ts +29 -0
  124. package/dist/ui/commands/compressCommand.test.ts +129 -0
  125. package/dist/ui/commands/compressCommand.ts +78 -0
  126. package/dist/ui/commands/contextCommand.ts +132 -0
  127. package/dist/ui/commands/copyCommand.test.ts +296 -0
  128. package/dist/ui/commands/copyCommand.ts +67 -0
  129. package/dist/ui/commands/corgiCommand.test.ts +34 -0
  130. package/dist/ui/commands/corgiCommand.ts +16 -0
  131. package/dist/ui/commands/directoryCommand.test.tsx +185 -0
  132. package/dist/ui/commands/directoryCommand.tsx +179 -0
  133. package/dist/ui/commands/docsCommand.test.ts +99 -0
  134. package/dist/ui/commands/docsCommand.ts +42 -0
  135. package/dist/ui/commands/editorCommand.test.ts +30 -0
  136. package/dist/ui/commands/editorCommand.ts +21 -0
  137. package/dist/ui/commands/extensionsCommand.test.ts +67 -0
  138. package/dist/ui/commands/extensionsCommand.ts +46 -0
  139. package/dist/ui/commands/helpCommand.test.ts +52 -0
  140. package/dist/ui/commands/helpCommand.ts +23 -0
  141. package/dist/ui/commands/ideCommand.test.ts +255 -0
  142. package/dist/ui/commands/ideCommand.ts +283 -0
  143. package/dist/ui/commands/initCommand.test.ts +127 -0
  144. package/dist/ui/commands/initCommand.ts +117 -0
  145. package/dist/ui/commands/mcpCommand.test.ts +1057 -0
  146. package/dist/ui/commands/mcpCommand.ts +531 -0
  147. package/dist/ui/commands/memoryCommand.test.ts +344 -0
  148. package/dist/ui/commands/memoryCommand.ts +305 -0
  149. package/dist/ui/commands/privacyCommand.test.ts +38 -0
  150. package/dist/ui/commands/privacyCommand.ts +17 -0
  151. package/dist/ui/commands/quitCommand.test.ts +55 -0
  152. package/dist/ui/commands/quitCommand.ts +36 -0
  153. package/dist/ui/commands/restoreCommand.test.ts +250 -0
  154. package/dist/ui/commands/restoreCommand.ts +157 -0
  155. package/dist/ui/commands/searchEngineSetupCommand.ts +18 -0
  156. package/dist/ui/commands/settingsCommand.test.ts +36 -0
  157. package/dist/ui/commands/settingsCommand.ts +17 -0
  158. package/dist/ui/commands/setupGithubCommand.test.ts +238 -0
  159. package/dist/ui/commands/setupGithubCommand.ts +212 -0
  160. package/dist/ui/commands/speakCommand.ts +175 -0
  161. package/dist/ui/commands/statsCommand.test.ts +78 -0
  162. package/dist/ui/commands/statsCommand.ts +70 -0
  163. package/dist/ui/commands/terminalSetupCommand.test.ts +85 -0
  164. package/dist/ui/commands/terminalSetupCommand.ts +45 -0
  165. package/dist/ui/commands/themeCommand.test.ts +38 -0
  166. package/dist/ui/commands/themeCommand.ts +17 -0
  167. package/dist/ui/commands/toolsCommand.test.ts +105 -0
  168. package/dist/ui/commands/toolsCommand.ts +71 -0
  169. package/dist/ui/commands/ttsCommand.ts +143 -0
  170. package/dist/ui/commands/types.ts +204 -0
  171. package/dist/ui/commands/vimCommand.ts +25 -0
  172. package/dist/ui/commands/voiceCommand.ts +125 -0
  173. package/dist/ui/components/AboutBox.tsx +133 -0
  174. package/dist/ui/components/AsciiArt.ts +54 -0
  175. package/dist/ui/components/AuthDialog.test.tsx +334 -0
  176. package/dist/ui/components/AuthDialog.tsx +289 -0
  177. package/dist/ui/components/AuthInProgress.tsx +62 -0
  178. package/dist/ui/components/AutoAcceptIndicator.tsx +47 -0
  179. package/dist/ui/components/ConsoleSummaryDisplay.tsx +35 -0
  180. package/dist/ui/components/ContextSummaryDisplay.test.tsx +85 -0
  181. package/dist/ui/components/ContextSummaryDisplay.tsx +120 -0
  182. package/dist/ui/components/ContextUsageDisplay.tsx +77 -0
  183. package/dist/ui/components/DebugProfiler.tsx +36 -0
  184. package/dist/ui/components/DetailedMessagesDisplay.tsx +82 -0
  185. package/dist/ui/components/EditorSettingsDialog.tsx +172 -0
  186. package/dist/ui/components/FolderTrustDialog.test.tsx +36 -0
  187. package/dist/ui/components/FolderTrustDialog.tsx +74 -0
  188. package/dist/ui/components/Footer.test.tsx +159 -0
  189. package/dist/ui/components/Footer.tsx +158 -0
  190. package/dist/ui/components/GeminiKeyDialog.tsx +252 -0
  191. package/dist/ui/components/GeminiRespondingSpinner.tsx +34 -0
  192. package/dist/ui/components/Header.test.tsx +44 -0
  193. package/dist/ui/components/Header.tsx +70 -0
  194. package/dist/ui/components/Help.tsx +174 -0
  195. package/dist/ui/components/HistoryItemDisplay.test.tsx +125 -0
  196. package/dist/ui/components/HistoryItemDisplay.tsx +98 -0
  197. package/dist/ui/components/InputPrompt.test.tsx +1467 -0
  198. package/dist/ui/components/InputPrompt.tsx +641 -0
  199. package/dist/ui/components/LMStudioModelPrompt.tsx +215 -0
  200. package/dist/ui/components/LoadingIndicator.test.tsx +296 -0
  201. package/dist/ui/components/LoadingIndicator.tsx +82 -0
  202. package/dist/ui/components/MemoryUsageDisplay.tsx +36 -0
  203. package/dist/ui/components/ModelStatsDisplay.test.tsx +252 -0
  204. package/dist/ui/components/ModelStatsDisplay.tsx +197 -0
  205. package/dist/ui/components/OllamaModelPrompt.tsx +206 -0
  206. package/dist/ui/components/OpenAIEndpointDialog.tsx +261 -0
  207. package/dist/ui/components/OpenAIKeyPrompt.test.tsx +64 -0
  208. package/dist/ui/components/OpenAIKeyPrompt.tsx +197 -0
  209. package/dist/ui/components/PrepareLabel.tsx +48 -0
  210. package/dist/ui/components/SearchEngineConfigDialog.tsx +280 -0
  211. package/dist/ui/components/SessionSummaryDisplay.test.tsx +75 -0
  212. package/dist/ui/components/SessionSummaryDisplay.tsx +18 -0
  213. package/dist/ui/components/SettingsDialog.test.tsx +865 -0
  214. package/dist/ui/components/SettingsDialog.tsx +753 -0
  215. package/dist/ui/components/ShellConfirmationDialog.test.tsx +53 -0
  216. package/dist/ui/components/ShellConfirmationDialog.tsx +103 -0
  217. package/dist/ui/components/ShellModeIndicator.tsx +18 -0
  218. package/dist/ui/components/ShowMoreLines.tsx +40 -0
  219. package/dist/ui/components/StatsDisplay.test.tsx +401 -0
  220. package/dist/ui/components/StatsDisplay.tsx +273 -0
  221. package/dist/ui/components/SuggestionsDisplay.tsx +102 -0
  222. package/dist/ui/components/ThemeDialog.tsx +310 -0
  223. package/dist/ui/components/Tips.tsx +45 -0
  224. package/dist/ui/components/TodoDisplay.test.tsx +97 -0
  225. package/dist/ui/components/TodoDisplay.tsx +72 -0
  226. package/dist/ui/components/ToolStatsDisplay.test.tsx +180 -0
  227. package/dist/ui/components/ToolStatsDisplay.tsx +208 -0
  228. package/dist/ui/components/UpdateNotification.tsx +23 -0
  229. package/dist/ui/components/WelcomeBackDialog.tsx +290 -0
  230. package/dist/ui/components/__snapshots__/IDEContextDetailDisplay.test.tsx.snap +24 -0
  231. package/dist/ui/components/__snapshots__/ModelStatsDisplay.test.tsx.snap +121 -0
  232. package/dist/ui/components/__snapshots__/SessionSummaryDisplay.test.tsx.snap +30 -0
  233. package/dist/ui/components/__snapshots__/ShellConfirmationDialog.test.tsx.snap +21 -0
  234. package/dist/ui/components/__snapshots__/StatsDisplay.test.tsx.snap +264 -0
  235. package/dist/ui/components/__snapshots__/ToolStatsDisplay.test.tsx.snap +91 -0
  236. package/dist/ui/components/messages/CompressionMessage.tsx +49 -0
  237. package/dist/ui/components/messages/DiffRenderer.test.tsx +365 -0
  238. package/dist/ui/components/messages/DiffRenderer.tsx +358 -0
  239. package/dist/ui/components/messages/ErrorMessage.tsx +31 -0
  240. package/dist/ui/components/messages/GeminiMessage.tsx +43 -0
  241. package/dist/ui/components/messages/GeminiMessageContent.tsx +43 -0
  242. package/dist/ui/components/messages/InfoMessage.tsx +32 -0
  243. package/dist/ui/components/messages/ToolConfirmationMessage.test.tsx +58 -0
  244. package/dist/ui/components/messages/ToolConfirmationMessage.tsx +297 -0
  245. package/dist/ui/components/messages/ToolGroupMessage.tsx +126 -0
  246. package/dist/ui/components/messages/ToolMessage.test.tsx +183 -0
  247. package/dist/ui/components/messages/ToolMessage.tsx +296 -0
  248. package/dist/ui/components/messages/UserMessage.tsx +43 -0
  249. package/dist/ui/components/messages/UserShellMessage.tsx +25 -0
  250. package/dist/ui/components/shared/MaxSizedBox.test.tsx +425 -0
  251. package/dist/ui/components/shared/MaxSizedBox.tsx +624 -0
  252. package/dist/ui/components/shared/RadioButtonSelect.test.tsx +181 -0
  253. package/dist/ui/components/shared/RadioButtonSelect.tsx +234 -0
  254. package/dist/ui/components/shared/__snapshots__/RadioButtonSelect.test.tsx.snap +47 -0
  255. package/dist/ui/components/shared/text-buffer.test.ts +1728 -0
  256. package/dist/ui/components/shared/text-buffer.ts +2227 -0
  257. package/dist/ui/components/shared/vim-buffer-actions.test.ts +1119 -0
  258. package/dist/ui/components/shared/vim-buffer-actions.ts +814 -0
  259. package/dist/ui/constants.ts +17 -0
  260. package/dist/ui/contexts/KeypressContext.test.tsx +391 -0
  261. package/dist/ui/contexts/KeypressContext.tsx +440 -0
  262. package/dist/ui/contexts/OverflowContext.tsx +87 -0
  263. package/dist/ui/contexts/SessionContext.test.tsx +132 -0
  264. package/dist/ui/contexts/SessionContext.tsx +143 -0
  265. package/dist/ui/contexts/SettingsContext.tsx +20 -0
  266. package/dist/ui/contexts/StreamingContext.tsx +22 -0
  267. package/dist/ui/contexts/VimModeContext.tsx +79 -0
  268. package/dist/ui/editors/editorSettingsManager.ts +66 -0
  269. package/dist/ui/hooks/atCommandProcessor.test.ts +1102 -0
  270. package/dist/ui/hooks/atCommandProcessor.ts +485 -0
  271. package/dist/ui/hooks/shellCommandProcessor.test.ts +481 -0
  272. package/dist/ui/hooks/shellCommandProcessor.ts +314 -0
  273. package/dist/ui/hooks/slashCommandProcessor.test.ts +1044 -0
  274. package/dist/ui/hooks/slashCommandProcessor.ts +595 -0
  275. package/dist/ui/hooks/useAtCompletion.test.ts +497 -0
  276. package/dist/ui/hooks/useAtCompletion.ts +244 -0
  277. package/dist/ui/hooks/useAuthCommand.ts +129 -0
  278. package/dist/ui/hooks/useAutoAcceptIndicator.test.ts +300 -0
  279. package/dist/ui/hooks/useAutoAcceptIndicator.ts +52 -0
  280. package/dist/ui/hooks/useBracketedPaste.ts +37 -0
  281. package/dist/ui/hooks/useCommandCompletion.test.ts +518 -0
  282. package/dist/ui/hooks/useCommandCompletion.tsx +238 -0
  283. package/dist/ui/hooks/useCompletion.ts +128 -0
  284. package/dist/ui/hooks/useConsoleMessages.test.ts +147 -0
  285. package/dist/ui/hooks/useConsoleMessages.ts +110 -0
  286. package/dist/ui/hooks/useEditorSettings.test.ts +283 -0
  287. package/dist/ui/hooks/useEditorSettings.ts +75 -0
  288. package/dist/ui/hooks/useFocus.test.ts +119 -0
  289. package/dist/ui/hooks/useFocus.ts +48 -0
  290. package/dist/ui/hooks/useFolderTrust.test.ts +159 -0
  291. package/dist/ui/hooks/useFolderTrust.ts +72 -0
  292. package/dist/ui/hooks/useGeminiStream.test.tsx +1998 -0
  293. package/dist/ui/hooks/useGeminiStream.ts +1017 -0
  294. package/dist/ui/hooks/useGitBranchName.test.ts +280 -0
  295. package/dist/ui/hooks/useGitBranchName.ts +79 -0
  296. package/dist/ui/hooks/useHistoryManager.test.ts +202 -0
  297. package/dist/ui/hooks/useHistoryManager.ts +111 -0
  298. package/dist/ui/hooks/useInputHistory.test.ts +261 -0
  299. package/dist/ui/hooks/useInputHistory.ts +111 -0
  300. package/dist/ui/hooks/useKeypress.test.ts +280 -0
  301. package/dist/ui/hooks/useKeypress.ts +39 -0
  302. package/dist/ui/hooks/useKittyKeyboardProtocol.ts +31 -0
  303. package/dist/ui/hooks/useLoadingIndicator.test.ts +139 -0
  304. package/dist/ui/hooks/useLoadingIndicator.ts +57 -0
  305. package/dist/ui/hooks/useLogger.ts +32 -0
  306. package/dist/ui/hooks/useMessageQueue.test.ts +226 -0
  307. package/dist/ui/hooks/useMessageQueue.ts +69 -0
  308. package/dist/ui/hooks/usePhraseCycler.test.ts +145 -0
  309. package/dist/ui/hooks/usePhraseCycler.ts +198 -0
  310. package/dist/ui/hooks/usePrivacySettings.test.ts +242 -0
  311. package/dist/ui/hooks/usePrivacySettings.ts +150 -0
  312. package/dist/ui/hooks/useReactToolScheduler.ts +309 -0
  313. package/dist/ui/hooks/useRefreshMemoryCommand.ts +7 -0
  314. package/dist/ui/hooks/useReverseSearchCompletion.test.tsx +260 -0
  315. package/dist/ui/hooks/useReverseSearchCompletion.tsx +95 -0
  316. package/dist/ui/hooks/useSettingsCommand.ts +25 -0
  317. package/dist/ui/hooks/useShellHistory.test.ts +219 -0
  318. package/dist/ui/hooks/useShellHistory.ts +133 -0
  319. package/dist/ui/hooks/useShowMemoryCommand.ts +75 -0
  320. package/dist/ui/hooks/useSlashCompletion.test.ts +434 -0
  321. package/dist/ui/hooks/useSlashCompletion.ts +187 -0
  322. package/dist/ui/hooks/useStateAndRef.ts +36 -0
  323. package/dist/ui/hooks/useTerminalSize.ts +32 -0
  324. package/dist/ui/hooks/useThemeCommand.ts +110 -0
  325. package/dist/ui/hooks/useTimer.test.ts +120 -0
  326. package/dist/ui/hooks/useTimer.ts +65 -0
  327. package/dist/ui/hooks/useToolScheduler.test.ts +1123 -0
  328. package/dist/ui/hooks/useWelcomeBack.ts +253 -0
  329. package/dist/ui/hooks/vim.test.ts +1691 -0
  330. package/dist/ui/hooks/vim.ts +784 -0
  331. package/dist/ui/keyMatchers.test.ts +337 -0
  332. package/dist/ui/keyMatchers.ts +105 -0
  333. package/dist/ui/privacy/CloudFreePrivacyNotice.tsx +117 -0
  334. package/dist/ui/privacy/CloudPaidPrivacyNotice.tsx +59 -0
  335. package/dist/ui/privacy/GeminiPrivacyNotice.tsx +62 -0
  336. package/dist/ui/privacy/PrivacyNotice.tsx +42 -0
  337. package/dist/ui/semantic-colors.ts +26 -0
  338. package/dist/ui/themes/ansi-light.ts +150 -0
  339. package/dist/ui/themes/ansi.ts +159 -0
  340. package/dist/ui/themes/atom-one-dark.ts +147 -0
  341. package/dist/ui/themes/ayu-light.ts +139 -0
  342. package/dist/ui/themes/ayu.ts +113 -0
  343. package/dist/ui/themes/color-utils.test.ts +221 -0
  344. package/dist/ui/themes/color-utils.ts +231 -0
  345. package/dist/ui/themes/default-light.ts +108 -0
  346. package/dist/ui/themes/default.ts +151 -0
  347. package/dist/ui/themes/dracula.ts +124 -0
  348. package/dist/ui/themes/fss-code-dark.ts +156 -0
  349. package/dist/ui/themes/fss-dark.ts +113 -0
  350. package/dist/ui/themes/fss-light.ts +139 -0
  351. package/dist/ui/themes/github-dark.ts +147 -0
  352. package/dist/ui/themes/github-light.ts +149 -0
  353. package/dist/ui/themes/googlecode.ts +146 -0
  354. package/dist/ui/themes/no-color.ts +125 -0
  355. package/dist/ui/themes/qwen-dark.ts +118 -0
  356. package/dist/ui/themes/qwen-light.ts +144 -0
  357. package/dist/ui/themes/semantic-tokens.ts +127 -0
  358. package/dist/ui/themes/shades-of-purple.ts +352 -0
  359. package/dist/ui/themes/theme-manager.test.ts +99 -0
  360. package/dist/ui/themes/theme-manager.ts +257 -0
  361. package/dist/ui/themes/theme.test.ts +97 -0
  362. package/dist/ui/themes/theme.ts +451 -0
  363. package/dist/ui/themes/xcode.ts +154 -0
  364. package/dist/ui/types.ts +255 -0
  365. package/dist/ui/utils/CodeColorizer.tsx +217 -0
  366. package/dist/ui/utils/ConsolePatcher.ts +71 -0
  367. package/dist/ui/utils/InlineMarkdownRenderer.tsx +173 -0
  368. package/dist/ui/utils/MarkdownDisplay.test.tsx +244 -0
  369. package/dist/ui/utils/MarkdownDisplay.tsx +415 -0
  370. package/dist/ui/utils/TableRenderer.tsx +159 -0
  371. package/dist/ui/utils/__snapshots__/MarkdownDisplay.test.tsx.snap +93 -0
  372. package/dist/ui/utils/clipboardUtils.test.ts +76 -0
  373. package/dist/ui/utils/clipboardUtils.ts +149 -0
  374. package/dist/ui/utils/commandUtils.test.ts +384 -0
  375. package/dist/ui/utils/commandUtils.ts +106 -0
  376. package/dist/ui/utils/computeStats.test.ts +292 -0
  377. package/dist/ui/utils/computeStats.ts +86 -0
  378. package/dist/ui/utils/displayUtils.test.ts +58 -0
  379. package/dist/ui/utils/displayUtils.ts +32 -0
  380. package/dist/ui/utils/formatters.test.ts +72 -0
  381. package/dist/ui/utils/formatters.ts +63 -0
  382. package/dist/ui/utils/isNarrowWidth.ts +9 -0
  383. package/dist/ui/utils/kittyProtocolDetector.ts +105 -0
  384. package/dist/ui/utils/markdownUtilities.test.ts +50 -0
  385. package/dist/ui/utils/markdownUtilities.ts +125 -0
  386. package/dist/ui/utils/platformConstants.ts +52 -0
  387. package/dist/ui/utils/terminalSetup.ts +342 -0
  388. package/dist/ui/utils/textUtils.ts +40 -0
  389. package/dist/ui/utils/updateCheck.test.ts +163 -0
  390. package/dist/ui/utils/updateCheck.ts +100 -0
  391. package/dist/utils/checks.ts +28 -0
  392. package/dist/utils/cleanup.test.ts +68 -0
  393. package/dist/utils/cleanup.ts +36 -0
  394. package/dist/utils/dialogScopeUtils.ts +64 -0
  395. package/dist/utils/events.ts +14 -0
  396. package/dist/utils/gitUtils.test.ts +149 -0
  397. package/dist/utils/gitUtils.ts +116 -0
  398. package/dist/utils/handleAutoUpdate.test.ts +272 -0
  399. package/dist/utils/handleAutoUpdate.ts +145 -0
  400. package/dist/utils/installationInfo.test.ts +315 -0
  401. package/dist/utils/installationInfo.ts +176 -0
  402. package/dist/utils/package.ts +38 -0
  403. package/dist/utils/readStdin.ts +51 -0
  404. package/dist/utils/resolvePath.ts +21 -0
  405. package/dist/utils/sandbox-macos-permissive-closed.sb +32 -0
  406. package/dist/utils/sandbox-macos-permissive-open.sb +25 -0
  407. package/dist/utils/sandbox-macos-permissive-proxied.sb +37 -0
  408. package/dist/utils/sandbox-macos-restrictive-closed.sb +93 -0
  409. package/dist/utils/sandbox-macos-restrictive-open.sb +96 -0
  410. package/dist/utils/sandbox-macos-restrictive-proxied.sb +98 -0
  411. package/dist/utils/sandbox.ts +962 -0
  412. package/dist/utils/settingsUtils.test.ts +797 -0
  413. package/dist/utils/settingsUtils.ts +489 -0
  414. package/dist/utils/spawnWrapper.ts +9 -0
  415. package/dist/utils/startupWarnings.test.ts +83 -0
  416. package/dist/utils/startupWarnings.ts +40 -0
  417. package/dist/utils/updateEventEmitter.ts +13 -0
  418. package/dist/utils/userStartupWarnings.test.ts +87 -0
  419. package/dist/utils/userStartupWarnings.ts +69 -0
  420. package/dist/utils/version.ts +12 -0
  421. package/dist/validateNonInterActiveAuth.test.ts +260 -0
  422. package/dist/validateNonInterActiveAuth.ts +51 -0
  423. package/dist/vitest.config.ts +37 -0
  424. package/dist/zed-integration/acp.ts +366 -0
  425. package/dist/zed-integration/fileSystemService.ts +47 -0
  426. package/dist/zed-integration/schema.ts +466 -0
  427. package/dist/zed-integration/zedIntegration.ts +944 -0
  428. package/package.json +2 -2
@@ -0,0 +1,203 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import { getFSSLinkDatabase } from './database.js';
7
+ /**
8
+ * Comprehensive Provider Manager
9
+ * Handles all provider configurations, persistence, and smart defaults
10
+ */
11
+ export class ProviderManager {
12
+ static instance;
13
+ static getInstance() {
14
+ if (!ProviderManager.instance) {
15
+ ProviderManager.instance = new ProviderManager();
16
+ }
17
+ return ProviderManager.instance;
18
+ }
19
+ /**
20
+ * Get all configured providers with usage statistics
21
+ */
22
+ async getAllProviders() {
23
+ const db = await getFSSLinkDatabase();
24
+ return await db.getAllModels();
25
+ }
26
+ /**
27
+ * Get smart default provider based on usage and user preferences
28
+ */
29
+ async getDefaultProvider() {
30
+ const db = await getFSSLinkDatabase();
31
+ return await db.getSmartDefaultProvider();
32
+ }
33
+ /**
34
+ * Save provider configuration with automatic usage tracking setup
35
+ */
36
+ async saveProvider(config) {
37
+ const db = await getFSSLinkDatabase();
38
+ const providerId = await db.upsertModelConfig(config);
39
+ // Save additional settings if present
40
+ if (config.additionalSettings) {
41
+ for (const [key, value] of Object.entries(config.additionalSettings)) {
42
+ await db.saveProviderSetting(providerId, key, JSON.stringify(value));
43
+ }
44
+ }
45
+ return providerId;
46
+ }
47
+ /**
48
+ * Record provider usage for intelligent defaults
49
+ */
50
+ async recordUsage(providerId, tokensUsed, sessionDurationMs) {
51
+ const db = await getFSSLinkDatabase();
52
+ await db.recordProviderUsage(providerId, tokensUsed, Math.floor(sessionDurationMs / 1000));
53
+ }
54
+ /**
55
+ * Get custom endpoints for a provider
56
+ */
57
+ async getCustomEndpoints(providerId) {
58
+ const db = await getFSSLinkDatabase();
59
+ return await db.getCustomEndpoints(providerId);
60
+ }
61
+ /**
62
+ * Save custom endpoint
63
+ */
64
+ async saveCustomEndpoint(providerId, name, url, description, isDefault = false) {
65
+ const db = await getFSSLinkDatabase();
66
+ return await db.saveCustomEndpoint(providerId, name, url, description, isDefault);
67
+ }
68
+ /**
69
+ * Get provider-specific settings (like sampling params, API keys, etc.)
70
+ */
71
+ async getProviderSettings(providerId) {
72
+ const db = await getFSSLinkDatabase();
73
+ const settings = await db.getProviderSettings(providerId);
74
+ // Parse JSON values back to their original types
75
+ const parsed = {};
76
+ for (const [key, value] of Object.entries(settings)) {
77
+ try {
78
+ parsed[key] = JSON.parse(value);
79
+ }
80
+ catch {
81
+ parsed[key] = value; // Keep as string if not valid JSON
82
+ }
83
+ }
84
+ return parsed;
85
+ }
86
+ /**
87
+ * Save provider-specific setting
88
+ */
89
+ async saveProviderSetting(providerId, key, value) {
90
+ const db = await getFSSLinkDatabase();
91
+ const serializedValue = typeof value === 'string' ? value : JSON.stringify(value);
92
+ await db.saveProviderSetting(providerId, key, serializedValue);
93
+ }
94
+ /**
95
+ * Get providers by type (OpenAI, Ollama, etc.)
96
+ */
97
+ async getProvidersByType(authType) {
98
+ const allProviders = await this.getAllProviders();
99
+ return allProviders.filter(p => p.authType === authType);
100
+ }
101
+ /**
102
+ * Mark provider as favorite (affects smart default selection)
103
+ */
104
+ async setFavoriteProvider(providerId, isFavorite) {
105
+ const db = await getFSSLinkDatabase();
106
+ // If setting as favorite, unmark others as favorite for this auth type
107
+ if (isFavorite) {
108
+ const provider = await db.getModelById(providerId);
109
+ if (provider) {
110
+ const sameTypeProviders = await this.getProvidersByType(provider.authType);
111
+ for (const otherProvider of sameTypeProviders) {
112
+ if (otherProvider.id !== providerId && otherProvider.isFavorite) {
113
+ await this.updateProvider(otherProvider.id, { ...otherProvider, isFavorite: false });
114
+ }
115
+ }
116
+ }
117
+ }
118
+ const existingProvider = await db.getModelById(providerId);
119
+ if (existingProvider) {
120
+ await db.upsertModelConfig({ ...existingProvider, isFavorite });
121
+ }
122
+ }
123
+ /**
124
+ * Update provider configuration
125
+ */
126
+ async updateProvider(providerId, updates) {
127
+ const db = await getFSSLinkDatabase();
128
+ const existing = await db.getModelById(providerId);
129
+ if (existing) {
130
+ const updated = { ...existing, ...updates };
131
+ await db.upsertModelConfig(updated);
132
+ }
133
+ }
134
+ /**
135
+ * Delete provider configuration
136
+ */
137
+ async deleteProvider(providerId) {
138
+ const _db = await getFSSLinkDatabase();
139
+ // Note: This would need to be added to the database class
140
+ // For now, we can mark as inactive
141
+ await this.updateProvider(providerId, { isActive: false });
142
+ }
143
+ /**
144
+ * Get usage statistics for all providers
145
+ */
146
+ async getUsageStatistics() {
147
+ const _db = await getFSSLinkDatabase();
148
+ const allProviders = await this.getAllProviders();
149
+ const stats = {};
150
+ for (const provider of allProviders) {
151
+ if (provider.id) {
152
+ // This would need to be implemented in the database class
153
+ // stats[provider.id] = await db.getProviderUsageStats(provider.id);
154
+ }
155
+ }
156
+ return stats;
157
+ }
158
+ /**
159
+ * Auto-configure provider based on successful authentication
160
+ */
161
+ async autoConfigureFromSuccess(authType, modelName, endpointUrl, apiKey, additionalConfig) {
162
+ const config = {
163
+ authType,
164
+ modelName,
165
+ endpointUrl,
166
+ apiKey,
167
+ displayName: `${authType} - ${modelName}`,
168
+ isFavorite: false,
169
+ isActive: true,
170
+ additionalSettings: additionalConfig
171
+ };
172
+ const providerId = await this.saveProvider(config);
173
+ // Mark as recently used
174
+ await this.recordUsage(providerId, 0, 0);
175
+ return providerId;
176
+ }
177
+ /**
178
+ * Get recommended providers based on usage patterns
179
+ */
180
+ async getRecommendedProviders(limit = 5) {
181
+ // This would implement intelligent recommendations based on:
182
+ // - Recent usage
183
+ // - Success rates
184
+ // - Performance metrics
185
+ // - User preferences
186
+ const allProviders = await this.getAllProviders();
187
+ // For now, return most recently used active providers
188
+ return allProviders
189
+ .filter(p => p.isActive)
190
+ .sort((a, b) => {
191
+ // Sort by favorite first, then by last used
192
+ if (a.isFavorite && !b.isFavorite)
193
+ return -1;
194
+ if (!a.isFavorite && b.isFavorite)
195
+ return 1;
196
+ const aTime = a.lastUsed?.getTime() || 0;
197
+ const bTime = b.lastUsed?.getTime() || 0;
198
+ return bTime - aTime;
199
+ })
200
+ .slice(0, limit);
201
+ }
202
+ }
203
+ //# sourceMappingURL=providerManager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"providerManager.js","sourceRoot":"","sources":["../../../src/config/providerManager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,75 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import { AuthType } from 'fss-link-core';
7
+ /**
8
+ * Provider configuration with full persistence support
9
+ */
10
+ export interface ProviderConfig {
11
+ id?: number;
12
+ provider: AuthType;
13
+ displayName: string;
14
+ baseUrl?: string;
15
+ apiKey?: string;
16
+ model?: string;
17
+ isDefault: boolean;
18
+ usageCount: number;
19
+ lastUsed: Date;
20
+ customEndpoints?: CustomEndpoint[];
21
+ additionalSettings?: Record<string, unknown>;
22
+ }
23
+ /**
24
+ * Custom endpoint configuration
25
+ */
26
+ export interface CustomEndpoint {
27
+ id?: number;
28
+ providerId: number;
29
+ name: string;
30
+ url: string;
31
+ description?: string;
32
+ isDefault: boolean;
33
+ created: Date;
34
+ }
35
+ /**
36
+ * Provider usage tracking
37
+ */
38
+ export interface ProviderUsage {
39
+ providerId: number;
40
+ sessionCount: number;
41
+ totalTokens: number;
42
+ lastSession: Date;
43
+ averageSessionLength: number;
44
+ }
45
+ /**
46
+ * Enhanced provider persistence manager
47
+ */
48
+ export declare class ProviderPersistenceManager {
49
+ private static instance;
50
+ static getInstance(): ProviderPersistenceManager;
51
+ /**
52
+ * Save provider configuration with usage tracking
53
+ */
54
+ saveProviderConfig(_config: ProviderConfig): Promise<number>;
55
+ /**
56
+ * Get all saved providers with usage statistics
57
+ */
58
+ getAllProviders(): Promise<ProviderConfig[]>;
59
+ /**
60
+ * Get smart default provider based on usage and configuration
61
+ */
62
+ getDefaultProvider(): Promise<ProviderConfig | null>;
63
+ /**
64
+ * Track provider usage for intelligent defaults
65
+ */
66
+ recordProviderUsage(_providerId: number, _tokens: number, _sessionDuration: number): Promise<void>;
67
+ /**
68
+ * Get custom endpoints for a provider
69
+ */
70
+ getCustomEndpoints(_providerId: number): Promise<CustomEndpoint[]>;
71
+ /**
72
+ * Save custom endpoint
73
+ */
74
+ saveCustomEndpoint(_endpoint: CustomEndpoint): Promise<number>;
75
+ }
@@ -0,0 +1,55 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ /**
7
+ * Enhanced provider persistence manager
8
+ */
9
+ export class ProviderPersistenceManager {
10
+ static instance;
11
+ static getInstance() {
12
+ if (!ProviderPersistenceManager.instance) {
13
+ ProviderPersistenceManager.instance = new ProviderPersistenceManager();
14
+ }
15
+ return ProviderPersistenceManager.instance;
16
+ }
17
+ /**
18
+ * Save provider configuration with usage tracking
19
+ */
20
+ async saveProviderConfig(_config) {
21
+ // Implementation will integrate with existing database
22
+ throw new Error('Implementation pending');
23
+ }
24
+ /**
25
+ * Get all saved providers with usage statistics
26
+ */
27
+ async getAllProviders() {
28
+ throw new Error('Implementation pending');
29
+ }
30
+ /**
31
+ * Get smart default provider based on usage and configuration
32
+ */
33
+ async getDefaultProvider() {
34
+ throw new Error('Implementation pending');
35
+ }
36
+ /**
37
+ * Track provider usage for intelligent defaults
38
+ */
39
+ async recordProviderUsage(_providerId, _tokens, _sessionDuration) {
40
+ throw new Error('Implementation pending');
41
+ }
42
+ /**
43
+ * Get custom endpoints for a provider
44
+ */
45
+ async getCustomEndpoints(_providerId) {
46
+ throw new Error('Implementation pending');
47
+ }
48
+ /**
49
+ * Save custom endpoint
50
+ */
51
+ async saveCustomEndpoint(_endpoint) {
52
+ throw new Error('Implementation pending');
53
+ }
54
+ }
55
+ //# sourceMappingURL=providerPersistence.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"providerPersistence.js","sourceRoot":"","sources":["../../../src/config/providerPersistence.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AA6CH;;GAEG;AACH,MAAM,OAAO,0BAA0B;IAC7B,MAAM,CAAC,QAAQ,CAA6B;IAEpD,MAAM,CAAC,WAAW;QAChB,IAAI,CAAC,0BAA0B,CAAC,QAAQ,EAAE,CAAC;YACzC,0BAA0B,CAAC,QAAQ,GAAG,IAAI,0BAA0B,EAAE,CAAC;QACzE,CAAC;QACD,OAAO,0BAA0B,CAAC,QAAQ,CAAC;IAC7C,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,kBAAkB,CAAC,OAAuB;QAC9C,uDAAuD;QACvD,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAC;IAC5C,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,eAAe;QACnB,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAC;IAC5C,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,kBAAkB;QACtB,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAC;IAC5C,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,mBAAmB,CAAC,WAAmB,EAAE,OAAe,EAAE,gBAAwB;QACtF,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAC;IAC5C,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,kBAAkB,CAAC,WAAmB;QAC1C,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAC;IAC5C,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,kBAAkB,CAAC,SAAyB;QAChD,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAC;IAC5C,CAAC;CACF"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ export {};
@@ -0,0 +1,283 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import { describe, it, expect, beforeEach, afterEach } from 'vitest';
7
+ import { AuthType } from 'fss-link-core';
8
+ import { ProviderManager } from './providerManager.js';
9
+ import { getFSSLinkDatabase, closeFSSLinkDatabase } from './database.js';
10
+ import * as fs from 'fs';
11
+ import * as path from 'path';
12
+ import * as os from 'os';
13
+ describe('Provider Persistence System', () => {
14
+ let providerManager;
15
+ let testDbPath;
16
+ beforeEach(async () => {
17
+ // Create temporary database for testing
18
+ testDbPath = path.join(os.tmpdir(), `test-fss-link-${Date.now()}.db`);
19
+ // Override the database path for testing
20
+ process.env.FSS_LINK_TEST_DB = testDbPath;
21
+ providerManager = ProviderManager.getInstance();
22
+ // Initialize clean database
23
+ const db = await getFSSLinkDatabase();
24
+ await db.initialize();
25
+ });
26
+ afterEach(async () => {
27
+ // Clean up test database
28
+ closeFSSLinkDatabase();
29
+ if (fs.existsSync(testDbPath)) {
30
+ fs.unlinkSync(testDbPath);
31
+ }
32
+ delete process.env.FSS_LINK_TEST_DB;
33
+ });
34
+ describe('Provider Configuration Management', () => {
35
+ it('should save and retrieve provider configurations', async () => {
36
+ const testConfig = {
37
+ authType: AuthType.OPENAI_API_KEY,
38
+ modelName: 'gpt-4',
39
+ endpointUrl: 'https://api.openai.com/v1',
40
+ apiKey: 'test-key-123',
41
+ displayName: 'GPT-4 Test',
42
+ isFavorite: false,
43
+ isActive: true
44
+ };
45
+ const providerId = await providerManager.saveProvider(testConfig);
46
+ expect(providerId).toBeGreaterThan(0);
47
+ const allProviders = await providerManager.getAllProviders();
48
+ expect(allProviders).toHaveLength(1);
49
+ expect(allProviders[0].modelName).toBe('gpt-4');
50
+ expect(allProviders[0].displayName).toBe('GPT-4 Test');
51
+ });
52
+ it('should handle provider updates correctly', async () => {
53
+ const testConfig = {
54
+ authType: AuthType.OLLAMA,
55
+ modelName: 'llama2',
56
+ endpointUrl: 'http://localhost:11434/v1',
57
+ displayName: 'Llama 2 Local',
58
+ isFavorite: false,
59
+ isActive: true
60
+ };
61
+ const providerId = await providerManager.saveProvider(testConfig);
62
+ // Update the provider
63
+ await providerManager.updateProvider(providerId, {
64
+ modelName: 'llama2-updated',
65
+ isFavorite: true
66
+ });
67
+ const allProviders = await providerManager.getAllProviders();
68
+ const updated = allProviders.find(p => p.id === providerId);
69
+ expect(updated?.modelName).toBe('llama2-updated');
70
+ expect(updated?.isFavorite).toBe(true);
71
+ expect(updated?.displayName).toBe('Llama 2 Local'); // Should remain unchanged
72
+ });
73
+ it('should track usage statistics correctly', async () => {
74
+ const testConfig = {
75
+ authType: AuthType.OPENAI_API_KEY,
76
+ modelName: 'gpt-3.5-turbo',
77
+ displayName: 'GPT-3.5 Test',
78
+ isActive: true
79
+ };
80
+ const providerId = await providerManager.saveProvider(testConfig);
81
+ // Record multiple usage sessions
82
+ await providerManager.recordUsage(providerId, 1000, 30000); // 1000 tokens, 30 seconds
83
+ await providerManager.recordUsage(providerId, 500, 15000); // 500 tokens, 15 seconds
84
+ await providerManager.recordUsage(providerId, 2000, 60000); // 2000 tokens, 60 seconds
85
+ const stats = await providerManager.getUsageStatistics();
86
+ expect(stats[providerId]).toBeDefined();
87
+ // Note: Actual validation depends on database implementation
88
+ });
89
+ });
90
+ describe('Custom Endpoints Management', () => {
91
+ it('should save and retrieve custom endpoints', async () => {
92
+ const testConfig = {
93
+ authType: AuthType.OPENAI_API_KEY,
94
+ modelName: 'custom-model',
95
+ displayName: 'Custom Provider',
96
+ isActive: true
97
+ };
98
+ const providerId = await providerManager.saveProvider(testConfig);
99
+ // Add custom endpoints
100
+ const endpoint1Id = await providerManager.saveCustomEndpoint(providerId, 'Production API', 'https://api.custom.com/v1', 'Production endpoint', true);
101
+ const endpoint2Id = await providerManager.saveCustomEndpoint(providerId, 'Staging API', 'https://staging-api.custom.com/v1', 'Staging endpoint', false);
102
+ expect(endpoint1Id).toBeGreaterThan(0);
103
+ expect(endpoint2Id).toBeGreaterThan(0);
104
+ const endpoints = await providerManager.getCustomEndpoints(providerId);
105
+ expect(endpoints).toHaveLength(2);
106
+ const defaultEndpoint = endpoints.find(e => e.is_default);
107
+ expect(defaultEndpoint?.name).toBe('Production API');
108
+ });
109
+ it('should handle default endpoint switching', async () => {
110
+ const testConfig = {
111
+ authType: AuthType.OPENAI_API_KEY,
112
+ modelName: 'test-model',
113
+ isActive: true
114
+ };
115
+ const providerId = await providerManager.saveProvider(testConfig);
116
+ // Add first endpoint as default
117
+ await providerManager.saveCustomEndpoint(providerId, 'Endpoint 1', 'https://api1.com/v1', undefined, true);
118
+ // Add second endpoint as default (should unset first)
119
+ await providerManager.saveCustomEndpoint(providerId, 'Endpoint 2', 'https://api2.com/v1', undefined, true);
120
+ const endpoints = await providerManager.getCustomEndpoints(providerId);
121
+ const defaultEndpoints = endpoints.filter(e => e.is_default);
122
+ expect(defaultEndpoints).toHaveLength(1);
123
+ expect(defaultEndpoints[0].name).toBe('Endpoint 2');
124
+ });
125
+ });
126
+ describe('Provider Settings Management', () => {
127
+ it('should save and retrieve provider-specific settings', async () => {
128
+ const testConfig = {
129
+ authType: AuthType.OLLAMA,
130
+ modelName: 'test-model',
131
+ isActive: true
132
+ };
133
+ const providerId = await providerManager.saveProvider(testConfig);
134
+ // Save various settings
135
+ await providerManager.saveProviderSetting(providerId, 'num_ctx', 32768);
136
+ await providerManager.saveProviderSetting(providerId, 'temperature', 0.7);
137
+ await providerManager.saveProviderSetting(providerId, 'custom_prompt', 'You are a helpful assistant');
138
+ const settings = await providerManager.getProviderSettings(providerId);
139
+ expect(settings.num_ctx).toBe(32768);
140
+ expect(settings.temperature).toBe(0.7);
141
+ expect(settings.custom_prompt).toBe('You are a helpful assistant');
142
+ });
143
+ it('should handle complex setting values', async () => {
144
+ const testConfig = {
145
+ authType: AuthType.OPENAI_API_KEY,
146
+ modelName: 'complex-config',
147
+ isActive: true
148
+ };
149
+ const providerId = await providerManager.saveProvider(testConfig);
150
+ const complexSetting = {
151
+ samplingParams: {
152
+ temperature: 0.8,
153
+ max_tokens: 2000,
154
+ top_p: 0.9
155
+ },
156
+ customHeaders: {
157
+ 'X-Custom-Header': 'value'
158
+ }
159
+ };
160
+ await providerManager.saveProviderSetting(providerId, 'advanced_config', complexSetting);
161
+ const settings = await providerManager.getProviderSettings(providerId);
162
+ expect(settings.advanced_config).toEqual(complexSetting);
163
+ });
164
+ });
165
+ describe('Smart Default Selection', () => {
166
+ it('should select favorite provider as default', async () => {
167
+ // Create multiple providers
168
+ const _provider1Id = await providerManager.saveProvider({
169
+ authType: AuthType.OPENAI_API_KEY,
170
+ modelName: 'gpt-4',
171
+ displayName: 'GPT-4',
172
+ isFavorite: false,
173
+ isActive: true
174
+ });
175
+ const _provider2Id = await providerManager.saveProvider({
176
+ authType: AuthType.OLLAMA,
177
+ modelName: 'llama2',
178
+ displayName: 'Llama 2',
179
+ isFavorite: true, // This should be selected as default
180
+ isActive: true
181
+ });
182
+ const provider3Id = await providerManager.saveProvider({
183
+ authType: AuthType.LM_STUDIO,
184
+ modelName: 'local-model',
185
+ displayName: 'Local Model',
186
+ isFavorite: false,
187
+ isActive: true
188
+ });
189
+ // Record usage for provider3 to make it most used
190
+ await providerManager.recordUsage(provider3Id, 5000, 120000);
191
+ await providerManager.recordUsage(provider3Id, 3000, 90000);
192
+ const defaultProvider = await providerManager.getDefaultProvider();
193
+ expect(defaultProvider?.displayName).toBe('Llama 2'); // Should prefer favorite over usage
194
+ });
195
+ it('should select most used provider when no favorite is set', async () => {
196
+ const provider1Id = await providerManager.saveProvider({
197
+ authType: AuthType.OPENAI_API_KEY,
198
+ modelName: 'gpt-4',
199
+ displayName: 'GPT-4',
200
+ isActive: true
201
+ });
202
+ const provider2Id = await providerManager.saveProvider({
203
+ authType: AuthType.OLLAMA,
204
+ modelName: 'llama2',
205
+ displayName: 'Llama 2',
206
+ isActive: true
207
+ });
208
+ // Make provider2 most used
209
+ await providerManager.recordUsage(provider2Id, 10000, 300000);
210
+ await providerManager.recordUsage(provider2Id, 8000, 200000);
211
+ await providerManager.recordUsage(provider1Id, 2000, 60000);
212
+ const defaultProvider = await providerManager.getDefaultProvider();
213
+ expect(defaultProvider?.displayName).toBe('Llama 2');
214
+ });
215
+ });
216
+ describe('Provider Filtering and Querying', () => {
217
+ it('should filter providers by type correctly', async () => {
218
+ // Create providers of different types
219
+ await providerManager.saveProvider({
220
+ authType: AuthType.OPENAI_API_KEY,
221
+ modelName: 'gpt-4',
222
+ isActive: true
223
+ });
224
+ await providerManager.saveProvider({
225
+ authType: AuthType.OLLAMA,
226
+ modelName: 'llama2',
227
+ isActive: true
228
+ });
229
+ await providerManager.saveProvider({
230
+ authType: AuthType.OPENAI_API_KEY,
231
+ modelName: 'gpt-3.5-turbo',
232
+ isActive: true
233
+ });
234
+ const openaiProviders = await providerManager.getProvidersByType(AuthType.OPENAI_API_KEY);
235
+ const ollamaProviders = await providerManager.getProvidersByType(AuthType.OLLAMA);
236
+ expect(openaiProviders).toHaveLength(2);
237
+ expect(ollamaProviders).toHaveLength(1);
238
+ expect(ollamaProviders[0].modelName).toBe('llama2');
239
+ });
240
+ it('should get recommended providers based on usage', async () => {
241
+ // Create several providers with different usage patterns
242
+ const providers = [];
243
+ for (let i = 0; i < 8; i++) {
244
+ const id = await providerManager.saveProvider({
245
+ authType: AuthType.OPENAI_API_KEY,
246
+ modelName: `model-${i}`,
247
+ displayName: `Model ${i}`,
248
+ isActive: true,
249
+ isFavorite: i === 2 // Make one a favorite
250
+ });
251
+ providers.push(id);
252
+ // Record different amounts of usage
253
+ if (i < 5) {
254
+ await providerManager.recordUsage(id, i * 1000, i * 30000);
255
+ }
256
+ }
257
+ const recommended = await providerManager.getRecommendedProviders(3);
258
+ expect(recommended).toHaveLength(3);
259
+ // First should be the favorite
260
+ expect(recommended[0].displayName).toBe('Model 2');
261
+ });
262
+ });
263
+ describe('Auto-Configuration', () => {
264
+ it('should auto-configure provider from successful authentication', async () => {
265
+ const providerId = await providerManager.autoConfigureFromSuccess(AuthType.USE_GEMINI, 'gemini-2.0-flash', undefined, 'test-gemini-key', {
266
+ temperature: 0.7,
267
+ max_tokens: 2048
268
+ });
269
+ expect(providerId).toBeGreaterThan(0);
270
+ const allProviders = await providerManager.getAllProviders();
271
+ const newProvider = allProviders.find(p => p.id === providerId);
272
+ expect(newProvider?.authType).toBe(AuthType.USE_GEMINI);
273
+ expect(newProvider?.modelName).toBe('gemini-2.0-flash');
274
+ expect(newProvider?.apiKey).toBe('test-gemini-key');
275
+ expect(newProvider?.displayName).toContain('gemini-2.0-flash');
276
+ // Check additional settings were saved
277
+ const settings = await providerManager.getProviderSettings(providerId);
278
+ expect(settings.temperature).toBe(0.7);
279
+ expect(settings.max_tokens).toBe(2048);
280
+ });
281
+ });
282
+ });
283
+ //# sourceMappingURL=providerPersistence.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"providerPersistence.test.js","sourceRoot":"","sources":["../../../src/config/providerPersistence.test.ts"],"names":[],"mappings":"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"}