@vybestack/llxprt-code 0.1.20 → 0.1.21

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 (341) hide show
  1. package/README.md +31 -0
  2. package/dist/package.json +3 -3
  3. package/dist/src/config/auth.test.d.ts +6 -0
  4. package/dist/src/config/auth.test.js +57 -0
  5. package/dist/src/config/auth.test.js.map +1 -0
  6. package/dist/src/config/config.d.ts +1 -1
  7. package/dist/src/config/config.js +27 -14
  8. package/dist/src/config/config.js.map +1 -1
  9. package/dist/src/config/keyBindings.js +2 -2
  10. package/dist/src/config/keyBindings.test.d.ts +6 -0
  11. package/dist/src/config/keyBindings.test.js +51 -0
  12. package/dist/src/config/keyBindings.test.js.map +1 -0
  13. package/dist/src/config/logging/loggingConfig.test.d.ts +6 -0
  14. package/dist/src/config/logging/loggingConfig.test.js +363 -0
  15. package/dist/src/config/logging/loggingConfig.test.js.map +1 -0
  16. package/dist/src/config/settingsSchema.d.ts +0 -9
  17. package/dist/src/config/settingsSchema.js +0 -9
  18. package/dist/src/config/settingsSchema.js.map +1 -1
  19. package/dist/src/config/settingsSchema.test.d.ts +6 -0
  20. package/dist/src/config/settingsSchema.test.js +195 -0
  21. package/dist/src/config/settingsSchema.test.js.map +1 -0
  22. package/dist/src/config/trustedFolders.test.d.ts +6 -0
  23. package/dist/src/config/trustedFolders.test.js +156 -0
  24. package/dist/src/config/trustedFolders.test.js.map +1 -0
  25. package/dist/src/gemini.js +14 -4
  26. package/dist/src/gemini.js.map +1 -1
  27. package/dist/src/gemini.test.d.ts +6 -0
  28. package/dist/src/gemini.test.js +199 -0
  29. package/dist/src/gemini.test.js.map +1 -0
  30. package/dist/src/generated/git-commit.d.ts +1 -1
  31. package/dist/src/generated/git-commit.js +1 -1
  32. package/dist/src/integration-tests/base-url-behavior.integration.test.d.ts +6 -0
  33. package/dist/src/integration-tests/base-url-behavior.integration.test.js +492 -0
  34. package/dist/src/integration-tests/base-url-behavior.integration.test.js.map +1 -0
  35. package/dist/src/integration-tests/cli-args.integration.test.d.ts +6 -0
  36. package/dist/src/integration-tests/cli-args.integration.test.js +398 -0
  37. package/dist/src/integration-tests/cli-args.integration.test.js.map +1 -0
  38. package/dist/src/integration-tests/compression-settings-apply.integration.test.d.ts +6 -0
  39. package/dist/src/integration-tests/compression-settings-apply.integration.test.js +436 -0
  40. package/dist/src/integration-tests/compression-settings-apply.integration.test.js.map +1 -0
  41. package/dist/src/integration-tests/ephemeral-settings.integration.test.d.ts +6 -0
  42. package/dist/src/integration-tests/ephemeral-settings.integration.test.js +290 -0
  43. package/dist/src/integration-tests/ephemeral-settings.integration.test.js.map +1 -0
  44. package/dist/src/integration-tests/model-params-isolation.integration.test.d.ts +6 -0
  45. package/dist/src/integration-tests/model-params-isolation.integration.test.js +564 -0
  46. package/dist/src/integration-tests/model-params-isolation.integration.test.js.map +1 -0
  47. package/dist/src/integration-tests/modelParams.integration.test.d.ts +6 -0
  48. package/dist/src/integration-tests/modelParams.integration.test.js +784 -0
  49. package/dist/src/integration-tests/modelParams.integration.test.js.map +1 -0
  50. package/dist/src/integration-tests/profile-keyfile.integration.test.d.ts +6 -0
  51. package/dist/src/integration-tests/profile-keyfile.integration.test.js +429 -0
  52. package/dist/src/integration-tests/profile-keyfile.integration.test.js.map +1 -0
  53. package/dist/src/integration-tests/profile-system.integration.test.d.ts +6 -0
  54. package/dist/src/integration-tests/profile-system.integration.test.js +364 -0
  55. package/dist/src/integration-tests/profile-system.integration.test.js.map +1 -0
  56. package/dist/src/integration-tests/provider-switching.integration.test.d.ts +6 -0
  57. package/dist/src/integration-tests/provider-switching.integration.test.js +207 -0
  58. package/dist/src/integration-tests/provider-switching.integration.test.js.map +1 -0
  59. package/dist/src/integration-tests/security.integration.test.d.ts +6 -0
  60. package/dist/src/integration-tests/security.integration.test.js +319 -0
  61. package/dist/src/integration-tests/security.integration.test.js.map +1 -0
  62. package/dist/src/integration-tests/test-utils.test.d.ts +6 -0
  63. package/dist/src/integration-tests/test-utils.test.js +221 -0
  64. package/dist/src/integration-tests/test-utils.test.js.map +1 -0
  65. package/dist/src/integration-tests/todo-continuation.integration.test.d.ts +6 -0
  66. package/dist/src/integration-tests/todo-continuation.integration.test.js +559 -0
  67. package/dist/src/integration-tests/todo-continuation.integration.test.js.map +1 -0
  68. package/dist/src/providers/logging/LoggingProviderWrapper.test.d.ts +6 -0
  69. package/dist/src/providers/logging/LoggingProviderWrapper.test.js +305 -0
  70. package/dist/src/providers/logging/LoggingProviderWrapper.test.js.map +1 -0
  71. package/dist/src/providers/logging/git-stats.integration.test.d.ts +6 -0
  72. package/dist/src/providers/logging/git-stats.integration.test.js +245 -0
  73. package/dist/src/providers/logging/git-stats.integration.test.js.map +1 -0
  74. package/dist/src/providers/logging/git-stats.test.d.ts +6 -0
  75. package/dist/src/providers/logging/git-stats.test.js +432 -0
  76. package/dist/src/providers/logging/git-stats.test.js.map +1 -0
  77. package/dist/src/providers/logging/multi-provider-logging.integration.test.d.ts +6 -0
  78. package/dist/src/providers/logging/multi-provider-logging.integration.test.js +531 -0
  79. package/dist/src/providers/logging/multi-provider-logging.integration.test.js.map +1 -0
  80. package/dist/src/providers/logging/performance.test.d.ts +6 -0
  81. package/dist/src/providers/logging/performance.test.js +465 -0
  82. package/dist/src/providers/logging/performance.test.js.map +1 -0
  83. package/dist/src/providers/provider-gemini-switching.test.d.ts +6 -0
  84. package/dist/src/providers/provider-gemini-switching.test.js +129 -0
  85. package/dist/src/providers/provider-gemini-switching.test.js.map +1 -0
  86. package/dist/src/providers/provider-switching.integration.test.d.ts +6 -0
  87. package/dist/src/providers/provider-switching.integration.test.js +113 -0
  88. package/dist/src/providers/provider-switching.integration.test.js.map +1 -0
  89. package/dist/src/providers/providerManagerInstance.test.d.ts +6 -0
  90. package/dist/src/providers/providerManagerInstance.test.js +104 -0
  91. package/dist/src/providers/providerManagerInstance.test.js.map +1 -0
  92. package/dist/src/services/BuiltinCommandLoader.test.d.ts +6 -0
  93. package/dist/src/services/BuiltinCommandLoader.test.js +118 -0
  94. package/dist/src/services/BuiltinCommandLoader.test.js.map +1 -0
  95. package/dist/src/services/CommandService.test.d.ts +6 -0
  96. package/dist/src/services/CommandService.test.js +232 -0
  97. package/dist/src/services/CommandService.test.js.map +1 -0
  98. package/dist/src/storage/ConversationStorage.test.d.ts +6 -0
  99. package/dist/src/storage/ConversationStorage.test.js +379 -0
  100. package/dist/src/storage/ConversationStorage.test.js.map +1 -0
  101. package/dist/src/test-utils/customMatchers.d.ts +14 -0
  102. package/dist/src/test-utils/customMatchers.js +46 -0
  103. package/dist/src/test-utils/customMatchers.js.map +1 -0
  104. package/dist/src/test-utils/mockCommandContext.d.ts +18 -0
  105. package/dist/src/test-utils/mockCommandContext.js +86 -0
  106. package/dist/src/test-utils/mockCommandContext.js.map +1 -0
  107. package/dist/src/test-utils/mockCommandContext.test.d.ts +6 -0
  108. package/dist/src/test-utils/mockCommandContext.test.js +51 -0
  109. package/dist/src/test-utils/mockCommandContext.test.js.map +1 -0
  110. package/dist/src/test-utils/responsive-testing.d.ts +14 -0
  111. package/dist/src/test-utils/responsive-testing.js +35 -0
  112. package/dist/src/test-utils/responsive-testing.js.map +1 -0
  113. package/dist/src/test-utils/responsive-testing.test.d.ts +6 -0
  114. package/dist/src/test-utils/responsive-testing.test.js +89 -0
  115. package/dist/src/test-utils/responsive-testing.test.js.map +1 -0
  116. package/dist/src/test-utils/testProviderConfig.d.ts +18 -0
  117. package/dist/src/test-utils/testProviderConfig.js +19 -0
  118. package/dist/src/test-utils/testProviderConfig.js.map +1 -0
  119. package/dist/src/ui/App.js +1 -1
  120. package/dist/src/ui/App.js.map +1 -1
  121. package/dist/src/ui/IdeIntegrationNudge.js +1 -1
  122. package/dist/src/ui/IdeIntegrationNudge.js.map +1 -1
  123. package/dist/src/ui/commands/chatCommand.js +8 -6
  124. package/dist/src/ui/commands/chatCommand.js.map +1 -1
  125. package/dist/src/ui/commands/diagnosticsCommand.js +0 -1
  126. package/dist/src/ui/commands/diagnosticsCommand.js.map +1 -1
  127. package/dist/src/ui/commands/ideCommand.js +5 -5
  128. package/dist/src/ui/commands/ideCommand.js.map +1 -1
  129. package/dist/src/ui/commands/keyCommand.test.d.ts +6 -0
  130. package/dist/src/ui/commands/keyCommand.test.js +128 -0
  131. package/dist/src/ui/commands/keyCommand.test.js.map +1 -0
  132. package/dist/src/ui/commands/profileCommand.test.d.ts +6 -0
  133. package/dist/src/ui/commands/profileCommand.test.js +343 -0
  134. package/dist/src/ui/commands/profileCommand.test.js.map +1 -0
  135. package/dist/src/ui/commands/setCommand.test.d.ts +6 -0
  136. package/dist/src/ui/commands/setCommand.test.js +431 -0
  137. package/dist/src/ui/commands/setCommand.test.js.map +1 -0
  138. package/dist/src/ui/commands/setupGithubCommand.test.d.ts +6 -0
  139. package/dist/src/ui/commands/setupGithubCommand.test.js +69 -0
  140. package/dist/src/ui/commands/setupGithubCommand.test.js.map +1 -0
  141. package/dist/src/ui/commands/toolformatCommand.test.d.ts +1 -0
  142. package/dist/src/ui/commands/toolformatCommand.test.js +145 -0
  143. package/dist/src/ui/commands/toolformatCommand.test.js.map +1 -0
  144. package/dist/src/ui/components/AuthDialog.js +1 -1
  145. package/dist/src/ui/components/AuthDialog.js.map +1 -1
  146. package/dist/src/ui/components/AuthDialog.test.d.ts +6 -0
  147. package/dist/src/ui/components/AuthDialog.test.js +252 -0
  148. package/dist/src/ui/components/AuthDialog.test.js.map +1 -0
  149. package/dist/src/ui/components/ContextIndicator.ui.test.d.ts +1 -0
  150. package/dist/src/ui/components/ContextIndicator.ui.test.js +89 -0
  151. package/dist/src/ui/components/ContextIndicator.ui.test.js.map +1 -0
  152. package/dist/src/ui/components/ContextSummaryDisplay.js +1 -1
  153. package/dist/src/ui/components/ContextUsageDisplay.semantic.test.d.ts +6 -0
  154. package/dist/src/ui/components/ContextUsageDisplay.semantic.test.js +75 -0
  155. package/dist/src/ui/components/ContextUsageDisplay.semantic.test.js.map +1 -0
  156. package/dist/src/ui/components/FolderTrustDialog.test.d.ts +6 -0
  157. package/dist/src/ui/components/FolderTrustDialog.test.js +26 -0
  158. package/dist/src/ui/components/FolderTrustDialog.test.js.map +1 -0
  159. package/dist/src/ui/components/Footer.d.ts +1 -0
  160. package/dist/src/ui/components/Footer.js +2 -2
  161. package/dist/src/ui/components/Footer.js.map +1 -1
  162. package/dist/src/ui/components/Footer.responsive.test.d.ts +6 -0
  163. package/dist/src/ui/components/Footer.responsive.test.js +262 -0
  164. package/dist/src/ui/components/Footer.responsive.test.js.map +1 -0
  165. package/dist/src/ui/components/HistoryItemDisplay.test.d.ts +6 -0
  166. package/dist/src/ui/components/HistoryItemDisplay.test.js +92 -0
  167. package/dist/src/ui/components/HistoryItemDisplay.test.js.map +1 -0
  168. package/dist/src/ui/components/InputPrompt.paste.test.d.ts +6 -0
  169. package/dist/src/ui/components/InputPrompt.paste.test.js +263 -0
  170. package/dist/src/ui/components/InputPrompt.paste.test.js.map +1 -0
  171. package/dist/src/ui/components/LoadingIndicator.test.d.ts +6 -0
  172. package/dist/src/ui/components/LoadingIndicator.test.js +149 -0
  173. package/dist/src/ui/components/LoadingIndicator.test.js.map +1 -0
  174. package/dist/src/ui/components/MemoryUsageDisplay.semantic.test.d.ts +6 -0
  175. package/dist/src/ui/components/MemoryUsageDisplay.semantic.test.js +127 -0
  176. package/dist/src/ui/components/MemoryUsageDisplay.semantic.test.js.map +1 -0
  177. package/dist/src/ui/components/ProviderDialog.responsive.test.d.ts +6 -0
  178. package/dist/src/ui/components/ProviderDialog.responsive.test.js +153 -0
  179. package/dist/src/ui/components/ProviderDialog.responsive.test.js.map +1 -0
  180. package/dist/src/ui/components/ProviderModelDialog.responsive.test.d.ts +6 -0
  181. package/dist/src/ui/components/ProviderModelDialog.responsive.test.js +252 -0
  182. package/dist/src/ui/components/ProviderModelDialog.responsive.test.js.map +1 -0
  183. package/dist/src/ui/components/ProviderModelDialog.test.d.ts +6 -0
  184. package/dist/src/ui/components/ProviderModelDialog.test.js +197 -0
  185. package/dist/src/ui/components/ProviderModelDialog.test.js.map +1 -0
  186. package/dist/src/ui/components/SettingsDialog.test.d.ts +6 -0
  187. package/dist/src/ui/components/SettingsDialog.test.js +555 -0
  188. package/dist/src/ui/components/SettingsDialog.test.js.map +1 -0
  189. package/dist/src/ui/components/ShellConfirmationDialog.test.d.ts +6 -0
  190. package/dist/src/ui/components/ShellConfirmationDialog.test.js +40 -0
  191. package/dist/src/ui/components/ShellConfirmationDialog.test.js.map +1 -0
  192. package/dist/src/ui/components/TodoPanel.responsive.test.d.ts +6 -0
  193. package/dist/src/ui/components/TodoPanel.responsive.test.js +221 -0
  194. package/dist/src/ui/components/TodoPanel.responsive.test.js.map +1 -0
  195. package/dist/src/ui/components/TodoPanel.semantic.test.d.ts +6 -0
  196. package/dist/src/ui/components/TodoPanel.semantic.test.js +137 -0
  197. package/dist/src/ui/components/TodoPanel.semantic.test.js.map +1 -0
  198. package/dist/src/ui/components/__tests__/LayoutManager.test.d.ts +6 -0
  199. package/dist/src/ui/components/__tests__/LayoutManager.test.js +94 -0
  200. package/dist/src/ui/components/__tests__/LayoutManager.test.js.map +1 -0
  201. package/dist/src/ui/components/messages/DiffRenderer.js +9 -7
  202. package/dist/src/ui/components/messages/DiffRenderer.js.map +1 -1
  203. package/dist/src/ui/components/messages/DiffRenderer.test.d.ts +6 -0
  204. package/dist/src/ui/components/messages/DiffRenderer.test.js +239 -0
  205. package/dist/src/ui/components/messages/DiffRenderer.test.js.map +1 -0
  206. package/dist/src/ui/components/messages/ToolConfirmationMessage.js +13 -4
  207. package/dist/src/ui/components/messages/ToolConfirmationMessage.js.map +1 -1
  208. package/dist/src/ui/components/messages/ToolConfirmationMessage.responsive.test.d.ts +6 -0
  209. package/dist/src/ui/components/messages/ToolConfirmationMessage.responsive.test.js +172 -0
  210. package/dist/src/ui/components/messages/ToolConfirmationMessage.responsive.test.js.map +1 -0
  211. package/dist/src/ui/components/messages/ToolConfirmationMessage.test.d.ts +6 -0
  212. package/dist/src/ui/components/messages/ToolConfirmationMessage.test.js +37 -0
  213. package/dist/src/ui/components/messages/ToolConfirmationMessage.test.js.map +1 -0
  214. package/dist/src/ui/components/messages/ToolMessage.test.d.ts +6 -0
  215. package/dist/src/ui/components/messages/ToolMessage.test.js +118 -0
  216. package/dist/src/ui/components/messages/ToolMessage.test.js.map +1 -0
  217. package/dist/src/ui/components/shared/MaxSizedBox.test.d.ts +6 -0
  218. package/dist/src/ui/components/shared/MaxSizedBox.test.js +154 -0
  219. package/dist/src/ui/components/shared/MaxSizedBox.test.js.map +1 -0
  220. package/dist/src/ui/components/shared/RadioButtonSelect.js +1 -1
  221. package/dist/src/ui/components/shared/RadioButtonSelect.js.map +1 -1
  222. package/dist/src/ui/components/shared/RadioButtonSelect.test.d.ts +6 -0
  223. package/dist/src/ui/components/shared/RadioButtonSelect.test.js +112 -0
  224. package/dist/src/ui/components/shared/RadioButtonSelect.test.js.map +1 -0
  225. package/dist/src/ui/containers/SessionController.test.d.ts +6 -0
  226. package/dist/src/ui/containers/SessionController.test.js +440 -0
  227. package/dist/src/ui/containers/SessionController.test.js.map +1 -0
  228. package/dist/src/ui/hooks/atCommandProcessor.test.d.ts +6 -0
  229. package/dist/src/ui/hooks/atCommandProcessor.test.js +830 -0
  230. package/dist/src/ui/hooks/atCommandProcessor.test.js.map +1 -0
  231. package/dist/src/ui/hooks/shellCommandProcessor.test.d.ts +6 -0
  232. package/dist/src/ui/hooks/shellCommandProcessor.test.js +328 -0
  233. package/dist/src/ui/hooks/shellCommandProcessor.test.js.map +1 -0
  234. package/dist/src/ui/hooks/useAutoAcceptIndicator.test.d.ts +6 -0
  235. package/dist/src/ui/hooks/useAutoAcceptIndicator.test.js +191 -0
  236. package/dist/src/ui/hooks/useAutoAcceptIndicator.test.js.map +1 -0
  237. package/dist/src/ui/hooks/useEditorSettings.test.d.ts +6 -0
  238. package/dist/src/ui/hooks/useEditorSettings.test.js +221 -0
  239. package/dist/src/ui/hooks/useEditorSettings.test.js.map +1 -0
  240. package/dist/src/ui/hooks/useGeminiStream.integration.test.d.ts +6 -0
  241. package/dist/src/ui/hooks/useGeminiStream.integration.test.js +800 -0
  242. package/dist/src/ui/hooks/useGeminiStream.integration.test.js.map +1 -0
  243. package/dist/src/ui/hooks/useGeminiStream.js +12 -47
  244. package/dist/src/ui/hooks/useGeminiStream.js.map +1 -1
  245. package/dist/src/ui/hooks/useGitBranchName.test.d.ts +6 -0
  246. package/dist/src/ui/hooks/useGitBranchName.test.js +170 -0
  247. package/dist/src/ui/hooks/useGitBranchName.test.js.map +1 -0
  248. package/dist/src/ui/hooks/useHistoryManager.test.d.ts +6 -0
  249. package/dist/src/ui/hooks/useHistoryManager.test.js +171 -0
  250. package/dist/src/ui/hooks/useHistoryManager.test.js.map +1 -0
  251. package/dist/src/ui/hooks/useInputHistory.test.d.ts +6 -0
  252. package/dist/src/ui/hooks/useInputHistory.test.js +207 -0
  253. package/dist/src/ui/hooks/useInputHistory.test.js.map +1 -0
  254. package/dist/src/ui/hooks/useKeypress.test.d.ts +6 -0
  255. package/dist/src/ui/hooks/useKeypress.test.js +171 -0
  256. package/dist/src/ui/hooks/useKeypress.test.js.map +1 -0
  257. package/dist/src/ui/hooks/useResponsive.test.d.ts +6 -0
  258. package/dist/src/ui/hooks/useResponsive.test.js +124 -0
  259. package/dist/src/ui/hooks/useResponsive.test.js.map +1 -0
  260. package/dist/src/ui/hooks/useReverseSearchCompletion.test.d.ts +6 -0
  261. package/dist/src/ui/hooks/useReverseSearchCompletion.test.js +163 -0
  262. package/dist/src/ui/hooks/useReverseSearchCompletion.test.js.map +1 -0
  263. package/dist/src/ui/hooks/useShellHistory.test.d.ts +6 -0
  264. package/dist/src/ui/hooks/useShellHistory.test.js +162 -0
  265. package/dist/src/ui/hooks/useShellHistory.test.js.map +1 -0
  266. package/dist/src/ui/hooks/useSlashCompletion.test.d.ts +6 -0
  267. package/dist/src/ui/hooks/useSlashCompletion.test.js +929 -0
  268. package/dist/src/ui/hooks/useSlashCompletion.test.js.map +1 -0
  269. package/dist/src/ui/hooks/useStableCallback.test.d.ts +6 -0
  270. package/dist/src/ui/hooks/useStableCallback.test.js +57 -0
  271. package/dist/src/ui/hooks/useStableCallback.test.js.map +1 -0
  272. package/dist/src/ui/keyMatchers.test.d.ts +6 -0
  273. package/dist/src/ui/keyMatchers.test.js +276 -0
  274. package/dist/src/ui/keyMatchers.test.js.map +1 -0
  275. package/dist/src/ui/reducers/appReducer.test.d.ts +6 -0
  276. package/dist/src/ui/reducers/appReducer.test.js +519 -0
  277. package/dist/src/ui/reducers/appReducer.test.js.map +1 -0
  278. package/dist/src/ui/themes/color-utils.test.d.ts +6 -0
  279. package/dist/src/ui/themes/color-utils.test.js +197 -0
  280. package/dist/src/ui/themes/color-utils.test.js.map +1 -0
  281. package/dist/src/ui/themes/semantic-resolver.test.d.ts +6 -0
  282. package/dist/src/ui/themes/semantic-resolver.test.js +210 -0
  283. package/dist/src/ui/themes/semantic-resolver.test.js.map +1 -0
  284. package/dist/src/ui/themes/semantic-tokens.test.d.ts +6 -0
  285. package/dist/src/ui/themes/semantic-tokens.test.js +272 -0
  286. package/dist/src/ui/themes/semantic-tokens.test.js.map +1 -0
  287. package/dist/src/ui/themes/theme-manager.test.d.ts +6 -0
  288. package/dist/src/ui/themes/theme-manager.test.js +151 -0
  289. package/dist/src/ui/themes/theme-manager.test.js.map +1 -0
  290. package/dist/src/ui/utils/MarkdownDisplay.test.d.ts +6 -0
  291. package/dist/src/ui/utils/MarkdownDisplay.test.js +151 -0
  292. package/dist/src/ui/utils/MarkdownDisplay.test.js.map +1 -0
  293. package/dist/src/ui/utils/clipboardUtils.test.d.ts +6 -0
  294. package/dist/src/ui/utils/clipboardUtils.test.js +65 -0
  295. package/dist/src/ui/utils/clipboardUtils.test.js.map +1 -0
  296. package/dist/src/ui/utils/commandUtils.test.d.ts +6 -0
  297. package/dist/src/ui/utils/commandUtils.test.js +294 -0
  298. package/dist/src/ui/utils/commandUtils.test.js.map +1 -0
  299. package/dist/src/ui/utils/displayUtils.test.d.ts +6 -0
  300. package/dist/src/ui/utils/displayUtils.test.js +42 -0
  301. package/dist/src/ui/utils/displayUtils.test.js.map +1 -0
  302. package/dist/src/ui/utils/formatters.test.d.ts +6 -0
  303. package/dist/src/ui/utils/formatters.test.js +56 -0
  304. package/dist/src/ui/utils/formatters.test.js.map +1 -0
  305. package/dist/src/ui/utils/markdownUtilities.test.d.ts +6 -0
  306. package/dist/src/ui/utils/markdownUtilities.test.js +42 -0
  307. package/dist/src/ui/utils/markdownUtilities.test.js.map +1 -0
  308. package/dist/src/ui/utils/responsive.test.d.ts +6 -0
  309. package/dist/src/ui/utils/responsive.test.js +107 -0
  310. package/dist/src/ui/utils/responsive.test.js.map +1 -0
  311. package/dist/src/ui/utils/secureInputHandler.test.d.ts +6 -0
  312. package/dist/src/ui/utils/secureInputHandler.test.js +274 -0
  313. package/dist/src/ui/utils/secureInputHandler.test.js.map +1 -0
  314. package/dist/src/ui/utils/updateCheck.test.d.ts +6 -0
  315. package/dist/src/ui/utils/updateCheck.test.js +202 -0
  316. package/dist/src/ui/utils/updateCheck.test.js.map +1 -0
  317. package/dist/src/utils/ConversationContext.test.d.ts +6 -0
  318. package/dist/src/utils/ConversationContext.test.js +64 -0
  319. package/dist/src/utils/ConversationContext.test.js.map +1 -0
  320. package/dist/src/utils/gitUtils.test.d.ts +6 -0
  321. package/dist/src/utils/gitUtils.test.js +113 -0
  322. package/dist/src/utils/gitUtils.test.js.map +1 -0
  323. package/dist/src/utils/installationInfo.test.d.ts +6 -0
  324. package/dist/src/utils/installationInfo.test.js +242 -0
  325. package/dist/src/utils/installationInfo.test.js.map +1 -0
  326. package/dist/src/utils/privacy/ConversationDataRedactor.test.d.ts +6 -0
  327. package/dist/src/utils/privacy/ConversationDataRedactor.test.js +463 -0
  328. package/dist/src/utils/privacy/ConversationDataRedactor.test.js.map +1 -0
  329. package/dist/src/utils/readStdin.js +10 -0
  330. package/dist/src/utils/readStdin.js.map +1 -1
  331. package/dist/src/utils/sandbox.js +2 -2
  332. package/dist/src/utils/sandbox.js.map +1 -1
  333. package/dist/src/utils/settingsUtils.test.d.ts +6 -0
  334. package/dist/src/utils/settingsUtils.test.js +514 -0
  335. package/dist/src/utils/settingsUtils.test.js.map +1 -0
  336. package/dist/src/utils/userStartupWarnings.js +2 -2
  337. package/dist/src/utils/userStartupWarnings.test.d.ts +6 -0
  338. package/dist/src/utils/userStartupWarnings.test.js +67 -0
  339. package/dist/src/utils/userStartupWarnings.test.js.map +1 -0
  340. package/dist/tsconfig.tsbuildinfo +1 -1
  341. package/package.json +3 -3
@@ -0,0 +1,364 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Vybestack LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import { describe, it, expect, beforeEach, afterEach } from 'vitest';
7
+ import * as fs from 'fs/promises';
8
+ import * as path from 'path';
9
+ import { ProfileManager } from '@vybestack/llxprt-code-core';
10
+ import { createTempDirectory, cleanupTempDirectory, createTempKeyfile, } from './test-utils.js';
11
+ describe('Profile Save/Load Cycle Integration Tests', () => {
12
+ let tempDir;
13
+ let profileManager;
14
+ let originalHome;
15
+ beforeEach(async () => {
16
+ // Store original HOME environment variable
17
+ originalHome = process.env.HOME;
18
+ // Create a temporary directory for our test
19
+ tempDir = await createTempDirectory();
20
+ // Set HOME to our temp directory so ProfileManager uses it
21
+ process.env.HOME = tempDir;
22
+ // Create a new ProfileManager instance (will use our temp HOME)
23
+ profileManager = new ProfileManager();
24
+ });
25
+ afterEach(async () => {
26
+ // Restore original HOME
27
+ if (originalHome !== undefined) {
28
+ process.env.HOME = originalHome;
29
+ }
30
+ else {
31
+ delete process.env.HOME;
32
+ }
33
+ // Clean up temp directory
34
+ await cleanupTempDirectory(tempDir);
35
+ });
36
+ describe('Basic Save/Load Operations', () => {
37
+ it('should save a profile to disk and load it back', async () => {
38
+ // Create a test profile
39
+ const testProfile = {
40
+ version: 1,
41
+ provider: 'anthropic',
42
+ model: 'claude-3-5-sonnet-20240620',
43
+ modelParams: {
44
+ temperature: 0.7,
45
+ max_tokens: 4096,
46
+ top_p: 0.95,
47
+ },
48
+ ephemeralSettings: {
49
+ 'context-limit': 200000,
50
+ 'compression-threshold': 0.8,
51
+ 'auth-key': 'test-api-key-123',
52
+ 'base-url': 'https://api.anthropic.com',
53
+ },
54
+ };
55
+ // Save the profile
56
+ await profileManager.saveProfile('test-profile', testProfile);
57
+ // Verify the file was created
58
+ const profilePath = path.join(tempDir, '.llxprt', 'profiles', 'test-profile.json');
59
+ const fileExists = await fs
60
+ .access(profilePath)
61
+ .then(() => true)
62
+ .catch(() => false);
63
+ expect(fileExists).toBe(true);
64
+ // Load the profile back
65
+ const loadedProfile = await profileManager.loadProfile('test-profile');
66
+ // Verify all fields match
67
+ expect(loadedProfile).toEqual(testProfile);
68
+ expect(loadedProfile.version).toBe(1);
69
+ expect(loadedProfile.provider).toBe('anthropic');
70
+ expect(loadedProfile.model).toBe('claude-3-5-sonnet-20240620');
71
+ expect(loadedProfile.modelParams.temperature).toBe(0.7);
72
+ expect(loadedProfile.ephemeralSettings['auth-key']).toBe('test-api-key-123');
73
+ });
74
+ it('should save multiple profiles and list them all', async () => {
75
+ const profiles = {
76
+ 'openai-gpt4': {
77
+ version: 1,
78
+ provider: 'openai',
79
+ model: 'gpt-4o',
80
+ modelParams: { temperature: 0.5, max_tokens: 8192 },
81
+ ephemeralSettings: { 'auth-key': 'sk-test-123' },
82
+ },
83
+ 'google-gemini': {
84
+ version: 1,
85
+ provider: 'google',
86
+ model: 'gemini-pro',
87
+ modelParams: { temperature: 0.8, top_k: 40 },
88
+ ephemeralSettings: { 'auth-key': 'google-key-456' },
89
+ },
90
+ 'azure-deployment': {
91
+ version: 1,
92
+ provider: 'azureopenai',
93
+ model: 'gpt-4o',
94
+ modelParams: { temperature: 0.6 },
95
+ ephemeralSettings: {
96
+ 'auth-key': 'azure-key-789',
97
+ 'base-url': 'https://myazure.openai.azure.com',
98
+ 'api-version': '2024-02-01',
99
+ },
100
+ },
101
+ };
102
+ // Save all profiles
103
+ for (const [name, profile] of Object.entries(profiles)) {
104
+ await profileManager.saveProfile(name, profile);
105
+ }
106
+ // List all profiles
107
+ const profileList = await profileManager.listProfiles();
108
+ expect(profileList).toHaveLength(3);
109
+ expect(profileList).toContain('openai-gpt4');
110
+ expect(profileList).toContain('google-gemini');
111
+ expect(profileList).toContain('azure-deployment');
112
+ // Load and verify each profile
113
+ for (const [name, expectedProfile] of Object.entries(profiles)) {
114
+ const loadedProfile = await profileManager.loadProfile(name);
115
+ expect(loadedProfile).toEqual(expectedProfile);
116
+ }
117
+ });
118
+ });
119
+ describe('JSON File Structure', () => {
120
+ it('should save profiles with proper JSON formatting', async () => {
121
+ const profile = {
122
+ version: 1,
123
+ provider: 'anthropic',
124
+ model: 'claude-3-opus-20240229',
125
+ modelParams: {
126
+ temperature: 0.3,
127
+ max_tokens: 2048,
128
+ presence_penalty: 0.1,
129
+ frequency_penalty: 0.2,
130
+ },
131
+ ephemeralSettings: {
132
+ 'context-limit': 100000,
133
+ 'compression-threshold': 0.7,
134
+ 'auth-keyfile': '/path/to/keyfile',
135
+ 'custom-headers': {
136
+ 'X-Custom-Header': 'test-value',
137
+ 'X-Another-Header': 'another-value',
138
+ },
139
+ },
140
+ };
141
+ await profileManager.saveProfile('json-test', profile);
142
+ // Read the raw JSON file
143
+ const profilePath = path.join(tempDir, '.llxprt', 'profiles', 'json-test.json');
144
+ const rawContent = await fs.readFile(profilePath, 'utf8');
145
+ const parsedContent = JSON.parse(rawContent);
146
+ // Verify JSON structure
147
+ expect(parsedContent).toEqual(profile);
148
+ // Verify formatting (should be pretty-printed with 2-space indentation)
149
+ expect(rawContent).toContain(' "version": 1');
150
+ expect(rawContent).toContain(' "provider": "anthropic"');
151
+ expect(rawContent).toContain(' "temperature": 0.3');
152
+ });
153
+ });
154
+ describe('Edge Cases and Error Handling', () => {
155
+ it('should throw error when loading non-existent profile', async () => {
156
+ await expect(profileManager.loadProfile('does-not-exist')).rejects.toThrow("Profile 'does-not-exist' not found");
157
+ });
158
+ it('should throw error when loading profile with invalid JSON', async () => {
159
+ // Create a profile with invalid JSON
160
+ const profilesDir = path.join(tempDir, '.llxprt', 'profiles');
161
+ await fs.mkdir(profilesDir, { recursive: true });
162
+ const invalidPath = path.join(profilesDir, 'invalid.json');
163
+ await fs.writeFile(invalidPath, '{ invalid json content', 'utf8');
164
+ await expect(profileManager.loadProfile('invalid')).rejects.toThrow("Profile 'invalid' is corrupted");
165
+ });
166
+ it('should throw error when loading profile with missing required fields', async () => {
167
+ // Create a profile missing required fields
168
+ const profilesDir = path.join(tempDir, '.llxprt', 'profiles');
169
+ await fs.mkdir(profilesDir, { recursive: true });
170
+ const incompletePath = path.join(profilesDir, 'incomplete.json');
171
+ // Missing modelParams and ephemeralSettings
172
+ await fs.writeFile(incompletePath, JSON.stringify({
173
+ version: 1,
174
+ provider: 'openai',
175
+ model: 'gpt-4',
176
+ }), 'utf8');
177
+ await expect(profileManager.loadProfile('incomplete')).rejects.toThrow("Profile 'incomplete' is invalid: missing required fields");
178
+ });
179
+ it('should throw error when loading profile with unsupported version', async () => {
180
+ const profilesDir = path.join(tempDir, '.llxprt', 'profiles');
181
+ await fs.mkdir(profilesDir, { recursive: true });
182
+ const futurePath = path.join(profilesDir, 'future-version.json');
183
+ await fs.writeFile(futurePath, JSON.stringify({
184
+ version: 2, // Unsupported version
185
+ provider: 'openai',
186
+ model: 'gpt-4',
187
+ modelParams: {},
188
+ ephemeralSettings: {},
189
+ }), 'utf8');
190
+ await expect(profileManager.loadProfile('future-version')).rejects.toThrow('unsupported profile version');
191
+ });
192
+ it('should handle empty profile list gracefully', async () => {
193
+ // Don't create any profiles
194
+ const profileList = await profileManager.listProfiles();
195
+ expect(profileList).toEqual([]);
196
+ });
197
+ it('should create profiles directory if it does not exist', async () => {
198
+ // Verify directory doesn't exist initially
199
+ const profilesDir = path.join(tempDir, '.llxprt', 'profiles');
200
+ let dirExists = await fs
201
+ .access(profilesDir)
202
+ .then(() => true)
203
+ .catch(() => false);
204
+ expect(dirExists).toBe(false);
205
+ // Save a profile
206
+ const profile = {
207
+ version: 1,
208
+ provider: 'openai',
209
+ model: 'gpt-4o-mini',
210
+ modelParams: {},
211
+ ephemeralSettings: {},
212
+ };
213
+ await profileManager.saveProfile('test', profile);
214
+ // Verify directory was created
215
+ dirExists = await fs
216
+ .access(profilesDir)
217
+ .then(() => true)
218
+ .catch(() => false);
219
+ expect(dirExists).toBe(true);
220
+ });
221
+ it('should overwrite existing profile when saving with same name', async () => {
222
+ const originalProfile = {
223
+ version: 1,
224
+ provider: 'openai',
225
+ model: 'gpt-4o-mini',
226
+ modelParams: { temperature: 0.5 },
227
+ ephemeralSettings: { 'auth-key': 'original-key' },
228
+ };
229
+ const updatedProfile = {
230
+ version: 1,
231
+ provider: 'anthropic',
232
+ model: 'claude-3-5-haiku-20241022',
233
+ modelParams: { temperature: 0.8 },
234
+ ephemeralSettings: { 'auth-key': 'updated-key' },
235
+ };
236
+ // Save original profile
237
+ await profileManager.saveProfile('overwrite-test', originalProfile);
238
+ // Load and verify original
239
+ let loaded = await profileManager.loadProfile('overwrite-test');
240
+ expect(loaded.provider).toBe('openai');
241
+ expect(loaded.ephemeralSettings['auth-key']).toBe('original-key');
242
+ // Save updated profile with same name
243
+ await profileManager.saveProfile('overwrite-test', updatedProfile);
244
+ // Load and verify update
245
+ loaded = await profileManager.loadProfile('overwrite-test');
246
+ expect(loaded.provider).toBe('anthropic');
247
+ expect(loaded.ephemeralSettings['auth-key']).toBe('updated-key');
248
+ });
249
+ });
250
+ describe('Complex Profile Configurations', () => {
251
+ it('should handle profiles with auth-keyfile references', async () => {
252
+ // Create a temporary keyfile
253
+ const keyfilePath = await createTempKeyfile(tempDir, 'secret-api-key-content');
254
+ const profile = {
255
+ version: 1,
256
+ provider: 'openai',
257
+ model: 'gpt-4',
258
+ modelParams: {
259
+ temperature: 0.7,
260
+ max_tokens: 4096,
261
+ seed: 12345,
262
+ },
263
+ ephemeralSettings: {
264
+ 'auth-keyfile': keyfilePath,
265
+ 'context-limit': 128000,
266
+ 'compression-threshold': 0.85,
267
+ },
268
+ };
269
+ await profileManager.saveProfile('keyfile-profile', profile);
270
+ const loaded = await profileManager.loadProfile('keyfile-profile');
271
+ expect(loaded.ephemeralSettings['auth-keyfile']).toBe(keyfilePath);
272
+ expect(loaded.modelParams.seed).toBe(12345);
273
+ });
274
+ it('should handle profiles with all possible settings', async () => {
275
+ const comprehensiveProfile = {
276
+ version: 1,
277
+ provider: 'azureopenai',
278
+ model: 'gpt-4o-deployment',
279
+ modelParams: {
280
+ temperature: 0.6,
281
+ max_tokens: 8192,
282
+ top_p: 0.9,
283
+ top_k: 50,
284
+ presence_penalty: 0.1,
285
+ frequency_penalty: 0.2,
286
+ seed: 42,
287
+ // Provider-specific params
288
+ logprobs: true,
289
+ top_logprobs: 3,
290
+ },
291
+ ephemeralSettings: {
292
+ 'context-limit': 128000,
293
+ 'compression-threshold': 0.75,
294
+ 'auth-key': 'azure-key-comprehensive',
295
+ 'base-url': 'https://my-deployment.openai.azure.com',
296
+ 'api-version': '2024-06-01',
297
+ 'tool-format': 'azure',
298
+ 'custom-headers': {
299
+ 'X-Organization-ID': 'org-123',
300
+ 'X-Project-ID': 'proj-456',
301
+ 'X-Custom-Tracking': 'enabled',
302
+ },
303
+ },
304
+ };
305
+ await profileManager.saveProfile('comprehensive', comprehensiveProfile);
306
+ const loaded = await profileManager.loadProfile('comprehensive');
307
+ // Verify all fields are preserved
308
+ expect(loaded).toEqual(comprehensiveProfile);
309
+ expect(loaded.modelParams.logprobs).toBe(true);
310
+ expect(loaded.modelParams.top_logprobs).toBe(3);
311
+ expect(loaded.ephemeralSettings['custom-headers']).toEqual({
312
+ 'X-Organization-ID': 'org-123',
313
+ 'X-Project-ID': 'proj-456',
314
+ 'X-Custom-Tracking': 'enabled',
315
+ });
316
+ });
317
+ it('should handle profiles with minimal settings', async () => {
318
+ const minimalProfile = {
319
+ version: 1,
320
+ provider: 'openai',
321
+ model: 'gpt-4o-mini',
322
+ modelParams: {},
323
+ ephemeralSettings: {},
324
+ };
325
+ await profileManager.saveProfile('minimal', minimalProfile);
326
+ const loaded = await profileManager.loadProfile('minimal');
327
+ expect(loaded).toEqual(minimalProfile);
328
+ expect(loaded.modelParams).toEqual({});
329
+ expect(loaded.ephemeralSettings).toEqual({});
330
+ });
331
+ });
332
+ describe('Profile Names and Special Characters', () => {
333
+ it('should handle profile names with special characters', async () => {
334
+ const specialNames = [
335
+ 'profile-with-dashes',
336
+ 'profile_with_underscores',
337
+ 'profile.with.dots',
338
+ 'UPPERCASE_PROFILE',
339
+ 'profile123',
340
+ 'profile-2025-01-15',
341
+ ];
342
+ const baseProfile = {
343
+ version: 1,
344
+ provider: 'openai',
345
+ model: 'gpt-4',
346
+ modelParams: {},
347
+ ephemeralSettings: {},
348
+ };
349
+ // Save profiles with special names
350
+ for (const name of specialNames) {
351
+ await profileManager.saveProfile(name, baseProfile);
352
+ }
353
+ // List and verify all profiles
354
+ const profileList = await profileManager.listProfiles();
355
+ expect(profileList).toHaveLength(specialNames.length);
356
+ for (const name of specialNames) {
357
+ expect(profileList).toContain(name);
358
+ const loaded = await profileManager.loadProfile(name);
359
+ expect(loaded).toEqual(baseProfile);
360
+ }
361
+ });
362
+ });
363
+ });
364
+ //# sourceMappingURL=profile-system.integration.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"profile-system.integration.test.js","sourceRoot":"","sources":["../../../src/integration-tests/profile-system.integration.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Vybestack LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ export {};
@@ -0,0 +1,207 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Vybestack LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import { describe, it, expect, beforeEach, afterEach } from 'vitest';
7
+ import { Config, ProviderManager, } from '@vybestack/llxprt-code-core';
8
+ import { createTempDirectory, cleanupTempDirectory } from './test-utils.js';
9
+ describe('Provider Switching Authentication Isolation', () => {
10
+ let tempDir;
11
+ let config;
12
+ let providerManager;
13
+ beforeEach(async () => {
14
+ tempDir = await createTempDirectory();
15
+ // Create a real Config instance
16
+ config = new Config({
17
+ sessionId: 'test-session',
18
+ targetDir: tempDir,
19
+ debugMode: false,
20
+ cwd: tempDir,
21
+ model: 'test-model',
22
+ });
23
+ // Create a real ProviderManager instance
24
+ providerManager = new ProviderManager();
25
+ config.setProviderManager(providerManager);
26
+ await config.initialize();
27
+ });
28
+ afterEach(async () => {
29
+ await cleanupTempDirectory(tempDir);
30
+ });
31
+ it('should isolate API keys between providers', async () => {
32
+ // Create mock providers with API key tracking
33
+ const providerA = createMockProvider('providerA');
34
+ const providerB = createMockProvider('providerB');
35
+ // Register providers
36
+ providerManager.registerProvider(providerA);
37
+ providerManager.registerProvider(providerB);
38
+ // Set API key for provider A
39
+ providerManager.setActiveProvider('providerA');
40
+ config.setEphemeralSetting('apiKey', 'key-for-provider-a');
41
+ providerA.setApiKey?.('key-for-provider-a');
42
+ // Note: Provider apiKey is internal, we verify through config instead
43
+ expect(config.getEphemeralSetting('apiKey')).toBe('key-for-provider-a');
44
+ // Switch to provider B with different key
45
+ providerManager.setActiveProvider('providerB');
46
+ config.setEphemeralSetting('apiKey', 'key-for-provider-b');
47
+ providerB.setApiKey?.('key-for-provider-b');
48
+ // Note: Provider apiKey is internal, we verify through config instead
49
+ expect(config.getEphemeralSetting('apiKey')).toBe('key-for-provider-b');
50
+ // Switch back to provider A
51
+ providerManager.setActiveProvider('providerA');
52
+ // Note: Provider A's state was cleared
53
+ // The ephemeral setting remains from provider B (no automatic clearing in Config)
54
+ expect(config.getEphemeralSetting('apiKey')).toBe('key-for-provider-b');
55
+ });
56
+ it('should clear ephemeral settings on provider switch', async () => {
57
+ // Create mock providers
58
+ const providerA = createMockProvider('providerA');
59
+ const providerB = createMockProvider('providerB');
60
+ // Register providers
61
+ providerManager.registerProvider(providerA);
62
+ providerManager.registerProvider(providerB);
63
+ // Set ephemeral settings for provider A
64
+ providerManager.setActiveProvider('providerA');
65
+ config.setEphemeralSetting('apiKey', 'test-key-a');
66
+ config.setEphemeralSetting('baseUrl', 'https://api.provider-a.com');
67
+ config.setEphemeralSetting('customSetting', 'value-a');
68
+ // Verify settings are set
69
+ expect(config.getEphemeralSetting('apiKey')).toBe('test-key-a');
70
+ expect(config.getEphemeralSetting('baseUrl')).toBe('https://api.provider-a.com');
71
+ expect(config.getEphemeralSetting('customSetting')).toBe('value-a');
72
+ // Switch to provider B
73
+ providerManager.setActiveProvider('providerB');
74
+ // Manual clearing of ephemeral settings (since Config doesn't auto-clear)
75
+ // In real usage, the CLI would handle this
76
+ const ephemeralSettings = config.getEphemeralSettings();
77
+ Object.keys(ephemeralSettings).forEach((key) => {
78
+ config.setEphemeralSetting(key, undefined);
79
+ });
80
+ // Verify all ephemeral settings are cleared
81
+ expect(config.getEphemeralSetting('apiKey')).toBeUndefined();
82
+ expect(config.getEphemeralSetting('baseUrl')).toBeUndefined();
83
+ expect(config.getEphemeralSetting('customSetting')).toBeUndefined();
84
+ });
85
+ it('should clear model parameters on provider switch', async () => {
86
+ // Create mock providers with model parameter support
87
+ const providerA = createMockProvider('providerA');
88
+ const providerB = createMockProvider('providerB');
89
+ // Register providers
90
+ providerManager.registerProvider(providerA);
91
+ providerManager.registerProvider(providerB);
92
+ // Set model params for provider A
93
+ providerManager.setActiveProvider('providerA');
94
+ const paramsA = {
95
+ temperature: 0.7,
96
+ maxTokens: 1000,
97
+ topP: 0.9,
98
+ };
99
+ providerA.setModelParams?.(paramsA);
100
+ // Verify provider A has params
101
+ expect(providerA.getModelParams?.()).toEqual(paramsA);
102
+ // Switch to provider B
103
+ providerManager.setActiveProvider('providerB');
104
+ // Verify provider A's state is cleared (including model params)
105
+ expect(providerA.getModelParams?.()).toBeUndefined();
106
+ // Set different params for provider B
107
+ const paramsB = {
108
+ temperature: 0.5,
109
+ maxTokens: 2000,
110
+ frequencyPenalty: 0.1,
111
+ };
112
+ providerB.setModelParams?.(paramsB);
113
+ // Verify provider B has its own params
114
+ expect(providerB.getModelParams?.()).toEqual(paramsB);
115
+ // Switch back to provider A
116
+ providerManager.setActiveProvider('providerA');
117
+ // Verify provider B's state is cleared
118
+ expect(providerB.getModelParams?.()).toBeUndefined();
119
+ });
120
+ it('should verify API keys are ephemeral and not persisted', async () => {
121
+ // Create a mock provider
122
+ const provider = createMockProvider('testProvider');
123
+ providerManager.registerProvider(provider);
124
+ // Set as active and add API key
125
+ providerManager.setActiveProvider('testProvider');
126
+ config.setEphemeralSetting('apiKey', 'ephemeral-test-key');
127
+ provider.setApiKey?.('ephemeral-test-key');
128
+ // Verify key is in ephemeral settings
129
+ expect(config.getEphemeralSetting('apiKey')).toBe('ephemeral-test-key');
130
+ // Verify key is NOT in any persistent storage
131
+ // The config object doesn't expose persistent settings directly,
132
+ // but we can verify that ephemeral settings are separate
133
+ const allEphemeralSettings = config.getEphemeralSettings();
134
+ expect(allEphemeralSettings['apiKey']).toBe('ephemeral-test-key');
135
+ // Create a new Config instance to simulate restart
136
+ const newConfig = new Config({
137
+ sessionId: 'new-session',
138
+ targetDir: tempDir,
139
+ debugMode: false,
140
+ cwd: tempDir,
141
+ model: 'test-model',
142
+ });
143
+ await newConfig.initialize();
144
+ // Verify API key is not persisted
145
+ expect(newConfig.getEphemeralSetting('apiKey')).toBeUndefined();
146
+ });
147
+ it('should handle server tools provider separately from active provider', async () => {
148
+ // Create mock providers
149
+ const geminiProvider = createMockProvider('gemini');
150
+ geminiProvider.getServerTools = () => ['web-search'];
151
+ const otherProvider = createMockProvider('other');
152
+ // Register providers
153
+ providerManager.registerProvider(geminiProvider);
154
+ providerManager.registerProvider(otherProvider);
155
+ // Set Gemini as server tools provider
156
+ providerManager.setServerToolsProvider(geminiProvider);
157
+ // Set other provider as active
158
+ providerManager.setActiveProvider('other');
159
+ config.setEphemeralSetting('apiKey', 'other-provider-key');
160
+ otherProvider.setApiKey?.('other-provider-key');
161
+ // Set API key for Gemini (server tools)
162
+ geminiProvider.setApiKey?.('gemini-server-tools-key');
163
+ // Note: Provider apiKeys are internal, authentication is handled internally
164
+ // Switch active provider to Gemini
165
+ providerManager.setActiveProvider('gemini');
166
+ // Note: Provider state management is handled internally
167
+ });
168
+ });
169
+ // Helper function to create a mock provider
170
+ function createMockProvider(name) {
171
+ const provider = {
172
+ name,
173
+ apiKey: undefined,
174
+ modelParams: undefined,
175
+ state: {},
176
+ setApiKey(key) {
177
+ provider.apiKey = key;
178
+ },
179
+ setModelParams(params) {
180
+ provider.modelParams = params;
181
+ },
182
+ getModelParams() {
183
+ return provider.modelParams;
184
+ },
185
+ clearState() {
186
+ provider.apiKey = undefined;
187
+ provider.modelParams = undefined;
188
+ provider.state = {};
189
+ },
190
+ getModels: async () => [
191
+ {
192
+ id: 'test-model',
193
+ name: 'Test Model',
194
+ provider: name,
195
+ supportedToolFormats: [],
196
+ },
197
+ ],
198
+ getDefaultModel: () => 'test-model',
199
+ async *generateChatCompletion() {
200
+ yield { content: 'test response' };
201
+ },
202
+ getServerTools: () => [],
203
+ invokeServerTool: async () => ({ result: 'test' }),
204
+ };
205
+ return provider;
206
+ }
207
+ //# sourceMappingURL=provider-switching.integration.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provider-switching.integration.test.js","sourceRoot":"","sources":["../../../src/integration-tests/provider-switching.integration.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Vybestack LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ export {};