@vybestack/llxprt-code 0.1.20-nightly.250818.90f427f5 → 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,145 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Vybestack LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import { describe, it, expect, beforeEach, vi } from 'vitest';
7
+ import { toolformatCommand } from './toolformatCommand.js';
8
+ import { createMockCommandContext } from '../../test-utils/mockCommandContext.js';
9
+ import { getProviderManager } from '../../providers/providerManagerInstance.js';
10
+ vi.mock('../../providers/providerManagerInstance.js');
11
+ function mockProvider(extra = {}) {
12
+ return {
13
+ name: 'openai',
14
+ getToolFormat: vi.fn().mockReturnValue('openai'),
15
+ setToolFormatOverride: vi.fn(),
16
+ getModels: vi.fn().mockResolvedValue([]),
17
+ generateChatCompletion: vi.fn(),
18
+ getServerTools: vi.fn().mockReturnValue([]),
19
+ invokeServerTool: vi.fn().mockResolvedValue({}),
20
+ ...extra,
21
+ };
22
+ }
23
+ describe('toolformatCommand', () => {
24
+ let mockContext;
25
+ let providerManager;
26
+ let provider;
27
+ let mockSettingsService;
28
+ beforeEach(() => {
29
+ provider = mockProvider();
30
+ providerManager = {
31
+ hasActiveProvider: vi.fn().mockReturnValue(true),
32
+ getActiveProvider: vi.fn().mockReturnValue(provider),
33
+ listProviders: vi.fn().mockReturnValue([]),
34
+ switchProvider: vi.fn(),
35
+ resetAllProviders: vi.fn(),
36
+ };
37
+ getProviderManager.mockReturnValue(providerManager);
38
+ // Mock SettingsService
39
+ mockSettingsService = {
40
+ getSettings: vi.fn().mockResolvedValue({ toolFormat: undefined }),
41
+ updateSettings: vi.fn().mockResolvedValue(undefined),
42
+ };
43
+ mockContext = createMockCommandContext();
44
+ mockContext.services.settings.merged.providerToolFormatOverrides = {
45
+ openai: 'xml',
46
+ };
47
+ mockContext.services.settings.setValue = vi.fn();
48
+ mockContext.services.config = {
49
+ getSettingsService: vi.fn().mockReturnValue(mockSettingsService),
50
+ };
51
+ });
52
+ it('shows current format and persist status if called with no arguments', async () => {
53
+ const result = await toolformatCommand.action(mockContext, '');
54
+ expect(result).toBeDefined();
55
+ expect(result?.type).toBe('message');
56
+ if (result && result.type === 'message') {
57
+ expect(result.content).toContain('Current tool format: openai');
58
+ expect(result.content).toMatch(/auto-detected|manual override/);
59
+ }
60
+ });
61
+ it('clears the override with auto', async () => {
62
+ const result = await toolformatCommand.action(mockContext, 'auto');
63
+ expect(result?.type).toBe('message');
64
+ if (result && result.type === 'message') {
65
+ expect(result.content).toMatch(/override cleared|auto-detection/);
66
+ }
67
+ expect(provider.setToolFormatOverride).toHaveBeenCalledWith(null);
68
+ // Should use SettingsService, not legacy settings
69
+ expect(mockSettingsService.updateSettings).toHaveBeenCalledWith('openai', { toolFormat: 'auto' });
70
+ });
71
+ it('errors for invalid format', async () => {
72
+ const result = await toolformatCommand.action(mockContext, 'notrealformat');
73
+ expect(result?.type).toBe('message');
74
+ if (result && result.type === 'message') {
75
+ expect(result.messageType).toBe('error');
76
+ expect(result.content).toContain('Invalid tool format');
77
+ }
78
+ });
79
+ it('sets a valid override and persists', async () => {
80
+ const result = await toolformatCommand.action(mockContext, 'hermes');
81
+ expect(provider.setToolFormatOverride).toHaveBeenCalledWith('hermes');
82
+ // Should use SettingsService, not legacy settings
83
+ expect(mockSettingsService.updateSettings).toHaveBeenCalledWith('openai', { toolFormat: 'hermes' });
84
+ expect(result?.type).toBe('message');
85
+ if (result && result.type === 'message') {
86
+ expect(result.messageType).toBe('info');
87
+ expect(result.content).toContain("override set to 'hermes'");
88
+ }
89
+ });
90
+ it('shows error if no active provider', async () => {
91
+ providerManager.hasActiveProvider = vi.fn().mockReturnValue(false);
92
+ const result = await toolformatCommand.action(mockContext, 'hermes');
93
+ expect(result?.type).toBe('message');
94
+ if (result && result.type === 'message') {
95
+ expect(result.messageType).toBe('error');
96
+ expect(result.content).toContain('No active provider');
97
+ }
98
+ });
99
+ describe('SettingsService integration', () => {
100
+ it('uses SettingsService when available for setting format', async () => {
101
+ const result = await toolformatCommand.action(mockContext, 'xml');
102
+ expect(mockSettingsService.updateSettings).toHaveBeenCalledWith('openai', { toolFormat: 'xml' });
103
+ expect(result?.type).toBe('message');
104
+ if (result && result.type === 'message') {
105
+ expect(result.messageType).toBe('info');
106
+ expect(result.content).toContain("override set to 'xml'");
107
+ }
108
+ });
109
+ it('uses SettingsService when available for clearing format', async () => {
110
+ const result = await toolformatCommand.action(mockContext, 'auto');
111
+ expect(mockSettingsService.updateSettings).toHaveBeenCalledWith('openai', { toolFormat: 'auto' });
112
+ expect(result?.type).toBe('message');
113
+ if (result && result.type === 'message') {
114
+ expect(result.content).toMatch(/override cleared|auto-detection/);
115
+ }
116
+ });
117
+ it('falls back to legacy settings when SettingsService is not available', async () => {
118
+ // Remove SettingsService
119
+ mockContext.services.config = {
120
+ getSettingsService: vi.fn().mockReturnValue(null),
121
+ };
122
+ const result = await toolformatCommand.action(mockContext, 'hermes');
123
+ expect(mockContext.services.settings.setValue).toHaveBeenCalledWith('User', 'providerToolFormatOverrides', { openai: 'hermes' });
124
+ expect(result?.type).toBe('message');
125
+ if (result && result.type === 'message') {
126
+ expect(result.messageType).toBe('info');
127
+ expect(result.content).toContain("override set to 'hermes'");
128
+ }
129
+ });
130
+ it('handles SettingsService errors gracefully', async () => {
131
+ // Make SettingsService throw an error
132
+ mockSettingsService.updateSettings = vi
133
+ .fn()
134
+ .mockRejectedValue(new Error('Settings update failed'));
135
+ const result = await toolformatCommand.action(mockContext, 'xml');
136
+ expect(result?.type).toBe('message');
137
+ if (result && result.type === 'message') {
138
+ expect(result.messageType).toBe('error');
139
+ expect(result.content).toContain('Failed to set tool format override');
140
+ expect(result.content).toContain('Settings update failed');
141
+ }
142
+ });
143
+ });
144
+ });
145
+ //# sourceMappingURL=toolformatCommand.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"toolformatCommand.test.js","sourceRoot":"","sources":["../../../../src/ui/commands/toolformatCommand.test.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,EAAE,EAAa,MAAM,QAAQ,CAAC;AACzE,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAAE,wBAAwB,EAAE,MAAM,wCAAwC,CAAC;AAClF,OAAO,EAAE,kBAAkB,EAAE,MAAM,4CAA4C,CAAC;AAIhF,EAAE,CAAC,IAAI,CAAC,4CAA4C,CAAC,CAAC;AAEtD,SAAS,YAAY,CAAC,QAA4B,EAAE;IAClD,OAAO;QACL,IAAI,EAAE,QAAQ;QACd,aAAa,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,eAAe,CAAC,QAAQ,CAAC;QAChD,qBAAqB,EAAE,EAAE,CAAC,EAAE,EAAE;QAC9B,SAAS,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,EAAE,CAAC;QACxC,sBAAsB,EAAE,EAAE,CAAC,EAAE,EAAE;QAC/B,cAAc,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,eAAe,CAAC,EAAE,CAAC;QAC3C,gBAAgB,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,EAAE,CAAC;QAC/C,GAAG,KAAK;KACe,CAAC;AAC5B,CAAC;AAED,QAAQ,CAAC,mBAAmB,EAAE,GAAG,EAAE;IACjC,IAAI,WAA2B,CAAC;IAChC,IAAI,eAAiC,CAAC;IACtC,IAAI,QAAmB,CAAC;IACxB,IAAI,mBAA4B,CAAC;IACjC,UAAU,CAAC,GAAG,EAAE;QACd,QAAQ,GAAG,YAAY,EAAE,CAAC;QAC1B,eAAe,GAAG;YAChB,iBAAiB,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,eAAe,CAAC,IAAI,CAAC;YAChD,iBAAiB,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,eAAe,CAAC,QAAQ,CAAC;YACpD,aAAa,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,eAAe,CAAC,EAAE,CAAC;YAC1C,cAAc,EAAE,EAAE,CAAC,EAAE,EAAE;YACvB,iBAAiB,EAAE,EAAE,CAAC,EAAE,EAAE;SACI,CAAC;QAChC,kBAAsC,CAAC,eAAe,CAAC,eAAe,CAAC,CAAC;QAEzE,uBAAuB;QACvB,mBAAmB,GAAG;YACpB,WAAW,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,EAAE,UAAU,EAAE,SAAS,EAAE,CAAC;YACjE,cAAc,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,SAAS,CAAC;SACrD,CAAC;QAEF,WAAW,GAAG,wBAAwB,EAAE,CAAC;QACzC,WAAW,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,2BAA2B,GAAG;YACjE,MAAM,EAAE,KAAK;SACd,CAAC;QACF,WAAW,CAAC,QAAQ,CAAC,QAAQ,CAAC,QAAQ,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;QACjD,WAAW,CAAC,QAAQ,CAAC,MAAM,GAAG;YAC5B,kBAAkB,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,eAAe,CAAC,mBAAmB,CAAC;SACxD,CAAC;IACb,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qEAAqE,EAAE,KAAK,IAAI,EAAE;QACnF,MAAM,MAAM,GAAG,MAAM,iBAAiB,CAAC,MAAO,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;QAChE,MAAM,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE,CAAC;QAC7B,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACrC,IAAI,MAAM,IAAI,MAAM,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;YACxC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,6BAA6B,CAAC,CAAC;YAChE,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,+BAA+B,CAAC,CAAC;QAClE,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+BAA+B,EAAE,KAAK,IAAI,EAAE;QAC7C,MAAM,MAAM,GAAG,MAAM,iBAAiB,CAAC,MAAO,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;QACpE,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACrC,IAAI,MAAM,IAAI,MAAM,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;YACxC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,iCAAiC,CAAC,CAAC;QACpE,CAAC;QACD,MAAM,CAAC,QAAQ,CAAC,qBAAqB,CAAC,CAAC,oBAAoB,CAAC,IAAI,CAAC,CAAC;QAClE,kDAAkD;QAClD,MAAM,CACH,mBAAgD,CAAC,cAAc,CACjE,CAAC,oBAAoB,CAAC,QAAQ,EAAE,EAAE,UAAU,EAAE,MAAM,EAAE,CAAC,CAAC;IAC3D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2BAA2B,EAAE,KAAK,IAAI,EAAE;QACzC,MAAM,MAAM,GAAG,MAAM,iBAAiB,CAAC,MAAO,CAC5C,WAAW,EACX,eAAe,CAChB,CAAC;QACF,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACrC,IAAI,MAAM,IAAI,MAAM,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;YACxC,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACzC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,qBAAqB,CAAC,CAAC;QAC1D,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oCAAoC,EAAE,KAAK,IAAI,EAAE;QAClD,MAAM,MAAM,GAAG,MAAM,iBAAiB,CAAC,MAAO,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC;QACtE,MAAM,CAAC,QAAQ,CAAC,qBAAqB,CAAC,CAAC,oBAAoB,CAAC,QAAQ,CAAC,CAAC;QACtE,kDAAkD;QAClD,MAAM,CACH,mBAAgD,CAAC,cAAc,CACjE,CAAC,oBAAoB,CAAC,QAAQ,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,CAAC,CAAC;QAC3D,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACrC,IAAI,MAAM,IAAI,MAAM,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;YACxC,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACxC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,0BAA0B,CAAC,CAAC;QAC/D,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mCAAmC,EAAE,KAAK,IAAI,EAAE;QACjD,eAAe,CAAC,iBAAiB,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;QACnE,MAAM,MAAM,GAAG,MAAM,iBAAiB,CAAC,MAAO,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC;QACtE,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACrC,IAAI,MAAM,IAAI,MAAM,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;YACxC,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACzC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,oBAAoB,CAAC,CAAC;QACzD,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,6BAA6B,EAAE,GAAG,EAAE;QAC3C,EAAE,CAAC,wDAAwD,EAAE,KAAK,IAAI,EAAE;YACtE,MAAM,MAAM,GAAG,MAAM,iBAAiB,CAAC,MAAO,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;YACnE,MAAM,CACH,mBAAgD,CAAC,cAAc,CACjE,CAAC,oBAAoB,CAAC,QAAQ,EAAE,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC,CAAC;YACxD,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YACrC,IAAI,MAAM,IAAI,MAAM,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;gBACxC,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;gBACxC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,uBAAuB,CAAC,CAAC;YAC5D,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,yDAAyD,EAAE,KAAK,IAAI,EAAE;YACvE,MAAM,MAAM,GAAG,MAAM,iBAAiB,CAAC,MAAO,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;YACpE,MAAM,CACH,mBAAgD,CAAC,cAAc,CACjE,CAAC,oBAAoB,CAAC,QAAQ,EAAE,EAAE,UAAU,EAAE,MAAM,EAAE,CAAC,CAAC;YACzD,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YACrC,IAAI,MAAM,IAAI,MAAM,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;gBACxC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,iCAAiC,CAAC,CAAC;YACpE,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,qEAAqE,EAAE,KAAK,IAAI,EAAE;YACnF,yBAAyB;YACzB,WAAW,CAAC,QAAQ,CAAC,MAAM,GAAG;gBAC5B,kBAAkB,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,eAAe,CAAC,IAAI,CAAC;aACzC,CAAC;YAEX,MAAM,MAAM,GAAG,MAAM,iBAAiB,CAAC,MAAO,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC;YACtE,MAAM,CAAC,WAAW,CAAC,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,oBAAoB,CACjE,MAAM,EACN,6BAA6B,EAC7B,EAAE,MAAM,EAAE,QAAQ,EAAE,CACrB,CAAC;YACF,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YACrC,IAAI,MAAM,IAAI,MAAM,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;gBACxC,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;gBACxC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,0BAA0B,CAAC,CAAC;YAC/D,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,2CAA2C,EAAE,KAAK,IAAI,EAAE;YACzD,sCAAsC;YACrC,mBAAgD,CAAC,cAAc,GAAG,EAAE;iBAClE,EAAE,EAAE;iBACJ,iBAAiB,CAAC,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAC,CAAC;YAE1D,MAAM,MAAM,GAAG,MAAM,iBAAiB,CAAC,MAAO,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;YACnE,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YACrC,IAAI,MAAM,IAAI,MAAM,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;gBACxC,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;gBACzC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,oCAAoC,CAAC,CAAC;gBACvE,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,wBAAwB,CAAC,CAAC;YAC7D,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -85,6 +85,6 @@ export function AuthDialog({ onSelect, settings, initialErrorMessage, }) {
85
85
  onSelect(undefined, SettingScope.User);
86
86
  }
87
87
  }, { isActive: true });
88
- return (_jsxs(Box, { borderStyle: "round", borderColor: Colors.Gray, flexDirection: "column", padding: 1, width: "100%", children: [_jsx(Text, { bold: true, children: "OAuth Authentication" }), _jsx(Box, { marginTop: 1, children: _jsx(Text, { children: "Select an OAuth provider to authenticate:" }) }), _jsx(Box, { marginTop: 1, children: _jsx(Text, { dimColor: true, children: "Note: You can also use API keys via /key, /keyfile, --key, --keyfile, or environment variables" }) }), _jsx(Box, { marginTop: 1, children: _jsx(RadioButtonSelect, { items: items, initialIndex: safeInitialIndex, onSelect: handleAuthSelect, isFocused: true }) }), errorMessage && (_jsx(Box, { marginTop: 1, children: _jsx(Text, { color: Colors.AccentRed, children: errorMessage }) })), _jsx(Box, { marginTop: 1, children: _jsx(Text, { color: Colors.Gray, children: "(Use Enter to select, ESC to close)" }) }), _jsx(Box, { marginTop: 1, children: _jsx(Text, { children: "Terms of Services and Privacy Notice for Gemini CLI" }) }), _jsx(Box, { marginTop: 1, children: _jsx(Text, { color: Colors.AccentBlue, children: 'https://github.com/acoliver/llxprt-code/blob/main/docs/tos-privacy.md' }) })] }));
88
+ return (_jsxs(Box, { borderStyle: "round", borderColor: Colors.Gray, flexDirection: "column", padding: 1, width: "100%", children: [_jsx(Text, { bold: true, children: "OAuth Authentication" }), _jsx(Box, { marginTop: 1, children: _jsx(Text, { children: "Select an OAuth provider to authenticate:" }) }), _jsx(Box, { marginTop: 1, children: _jsx(Text, { dimColor: true, children: "Note: You can also use API keys via /key, /keyfile, --key, --keyfile, or environment variables" }) }), _jsx(Box, { marginTop: 1, children: _jsx(RadioButtonSelect, { items: items, initialIndex: safeInitialIndex, onSelect: handleAuthSelect }) }), errorMessage && (_jsx(Box, { marginTop: 1, children: _jsx(Text, { color: Colors.AccentRed, children: errorMessage }) })), _jsx(Box, { marginTop: 1, children: _jsx(Text, { color: Colors.Gray, children: "(Use Enter to select, ESC to close)" }) }), _jsx(Box, { marginTop: 1, children: _jsx(Text, { children: "Terms of Services and Privacy Notice for Gemini CLI" }) }), _jsx(Box, { marginTop: 1, children: _jsx(Text, { color: Colors.AccentBlue, children: 'https://github.com/acoliver/llxprt-code/blob/main/docs/tos-privacy.md' }) })] }));
89
89
  }
90
90
  //# sourceMappingURL=AuthDialog.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"AuthDialog.js","sourceRoot":"","sources":["../../../../src/ui/components/AuthDialog.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"AuthDialog.js","sourceRoot":"","sources":["../../../../src/ui/components/AuthDialog.tsx"],"names":[],"mappings":"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"}
@@ -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,252 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ /**
3
+ * @license
4
+ * Copyright 2025 Google LLC
5
+ * SPDX-License-Identifier: Apache-2.0
6
+ */
7
+ import { render } from 'ink-testing-library';
8
+ import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
9
+ import { AuthDialog } from './AuthDialog.js';
10
+ import { LoadedSettings, SettingScope } from '../../config/settings.js';
11
+ import { AuthType } from '@vybestack/llxprt-code-core';
12
+ describe('AuthDialog', () => {
13
+ const wait = (ms = 50) => new Promise((resolve) => setTimeout(resolve, ms));
14
+ let originalEnv;
15
+ beforeEach(() => {
16
+ originalEnv = { ...process.env };
17
+ process.env.GEMINI_API_KEY = '';
18
+ process.env.GEMINI_DEFAULT_AUTH_TYPE = '';
19
+ vi.clearAllMocks();
20
+ });
21
+ afterEach(() => {
22
+ process.env = originalEnv;
23
+ });
24
+ it('should show an error if the initial auth type is invalid', () => {
25
+ process.env.GEMINI_API_KEY = '';
26
+ const settings = new LoadedSettings({
27
+ settings: { customThemes: {}, mcpServers: {} },
28
+ path: '',
29
+ }, {
30
+ settings: {
31
+ selectedAuthType: AuthType.USE_GEMINI,
32
+ },
33
+ path: '',
34
+ }, {
35
+ settings: { customThemes: {}, mcpServers: {} },
36
+ path: '',
37
+ }, []);
38
+ const mockOnSelect = vi.fn();
39
+ const { lastFrame } = render(_jsx(AuthDialog, { onSelect: mockOnSelect, settings: settings, initialErrorMessage: "GEMINI_API_KEY environment variable not found" }));
40
+ expect(lastFrame()).toContain('GEMINI_API_KEY environment variable not found');
41
+ });
42
+ describe('GEMINI_API_KEY environment variable', () => {
43
+ it('should show OAuth dialog even when GEMINI_API_KEY is set', () => {
44
+ process.env.GEMINI_API_KEY = 'foobar';
45
+ const settings = new LoadedSettings({
46
+ settings: {
47
+ selectedAuthType: undefined,
48
+ customThemes: {},
49
+ mcpServers: {},
50
+ },
51
+ path: '',
52
+ }, {
53
+ settings: { customThemes: {}, mcpServers: {} },
54
+ path: '',
55
+ }, {
56
+ settings: { customThemes: {}, mcpServers: {} },
57
+ path: '',
58
+ }, []);
59
+ const mockOnSelect = vi.fn();
60
+ const { lastFrame } = render(_jsx(AuthDialog, { onSelect: mockOnSelect, settings: settings }));
61
+ // OAuth-only dialog shows regardless of API key presence
62
+ expect(lastFrame()).toContain('OAuth Authentication');
63
+ expect(lastFrame()).toContain('Gemini (Google OAuth)');
64
+ expect(lastFrame()).toContain('Qwen (OAuth)');
65
+ });
66
+ it('should show OAuth options regardless of GEMINI_DEFAULT_AUTH_TYPE', () => {
67
+ process.env.GEMINI_API_KEY = 'foobar';
68
+ process.env.GEMINI_DEFAULT_AUTH_TYPE = AuthType.LOGIN_WITH_GOOGLE;
69
+ const settings = new LoadedSettings({
70
+ settings: {
71
+ selectedAuthType: undefined,
72
+ customThemes: {},
73
+ mcpServers: {},
74
+ },
75
+ path: '',
76
+ }, {
77
+ settings: { customThemes: {}, mcpServers: {} },
78
+ path: '',
79
+ }, {
80
+ settings: { customThemes: {}, mcpServers: {} },
81
+ path: '',
82
+ }, []);
83
+ const { lastFrame } = render(_jsx(AuthDialog, { onSelect: vi.fn(), settings: settings }));
84
+ // OAuth-only implementation doesn't show API key messages
85
+ expect(lastFrame()).not.toContain('Existing API key detected (GEMINI_API_KEY)');
86
+ expect(lastFrame()).toContain('OAuth Authentication');
87
+ });
88
+ it('should show OAuth dialog even when GEMINI_DEFAULT_AUTH_TYPE is set to use api key', () => {
89
+ process.env.GEMINI_API_KEY = 'foobar';
90
+ process.env.GEMINI_DEFAULT_AUTH_TYPE = AuthType.USE_GEMINI;
91
+ const settings = new LoadedSettings({
92
+ settings: {
93
+ selectedAuthType: undefined,
94
+ customThemes: {},
95
+ mcpServers: {},
96
+ },
97
+ path: '',
98
+ }, {
99
+ settings: { customThemes: {}, mcpServers: {} },
100
+ path: '',
101
+ }, {
102
+ settings: { customThemes: {}, mcpServers: {} },
103
+ path: '',
104
+ }, []);
105
+ const { lastFrame } = render(_jsx(AuthDialog, { onSelect: vi.fn(), settings: settings }));
106
+ // OAuth-only dialog shows, API key message not shown
107
+ expect(lastFrame()).not.toContain('Existing API key detected (GEMINI_API_KEY)');
108
+ expect(lastFrame()).toContain('OAuth Authentication');
109
+ expect(lastFrame()).toContain('Note: You can also use API keys');
110
+ });
111
+ });
112
+ describe('GEMINI_DEFAULT_AUTH_TYPE environment variable', () => {
113
+ it('should select the auth type specified by GEMINI_DEFAULT_AUTH_TYPE', () => {
114
+ process.env.GEMINI_DEFAULT_AUTH_TYPE = AuthType.LOGIN_WITH_GOOGLE;
115
+ const settings = new LoadedSettings({
116
+ settings: {
117
+ selectedAuthType: undefined,
118
+ customThemes: {},
119
+ mcpServers: {},
120
+ },
121
+ path: '',
122
+ }, {
123
+ settings: { customThemes: {}, mcpServers: {} },
124
+ path: '',
125
+ }, {
126
+ settings: { customThemes: {}, mcpServers: {} },
127
+ path: '',
128
+ }, []);
129
+ const { lastFrame } = render(_jsx(AuthDialog, { onSelect: vi.fn(), settings: settings }));
130
+ // OAuth-only implementation always shows first option selected by default
131
+ expect(lastFrame()).toContain('[*]1. Gemini (Google OAuth)');
132
+ });
133
+ it('should fall back to default if GEMINI_DEFAULT_AUTH_TYPE is not set', () => {
134
+ const settings = new LoadedSettings({
135
+ settings: {
136
+ selectedAuthType: undefined,
137
+ customThemes: {},
138
+ mcpServers: {},
139
+ },
140
+ path: '',
141
+ }, {
142
+ settings: { customThemes: {}, mcpServers: {} },
143
+ path: '',
144
+ }, {
145
+ settings: { customThemes: {}, mcpServers: {} },
146
+ path: '',
147
+ }, []);
148
+ const { lastFrame } = render(_jsx(AuthDialog, { onSelect: vi.fn(), settings: settings }));
149
+ // OAuth-only implementation defaults to Gemini OAuth
150
+ expect(lastFrame()).toContain('[*]1. Gemini (Google OAuth)');
151
+ });
152
+ it('should show an error and fall back to default if GEMINI_DEFAULT_AUTH_TYPE is invalid', () => {
153
+ process.env.GEMINI_DEFAULT_AUTH_TYPE = 'invalid-auth-type';
154
+ const settings = new LoadedSettings({
155
+ settings: {
156
+ selectedAuthType: undefined,
157
+ customThemes: {},
158
+ mcpServers: {},
159
+ },
160
+ path: '',
161
+ }, {
162
+ settings: { customThemes: {}, mcpServers: {} },
163
+ path: '',
164
+ }, {
165
+ settings: { customThemes: {}, mcpServers: {} },
166
+ path: '',
167
+ }, []);
168
+ const { lastFrame } = render(_jsx(AuthDialog, { onSelect: vi.fn(), settings: settings }));
169
+ // OAuth-only implementation doesn't validate GEMINI_DEFAULT_AUTH_TYPE anymore
170
+ expect(lastFrame()).not.toContain('Invalid value for GEMINI_DEFAULT_AUTH_TYPE');
171
+ // OAuth-only implementation defaults to Gemini OAuth
172
+ expect(lastFrame()).toContain('[*]1. Gemini (Google OAuth)');
173
+ });
174
+ });
175
+ it('should close dialog when ESC is pressed', async () => {
176
+ const onSelect = vi.fn();
177
+ const settings = new LoadedSettings({
178
+ settings: { customThemes: {}, mcpServers: {} },
179
+ path: '',
180
+ }, {
181
+ settings: {
182
+ selectedAuthType: undefined,
183
+ customThemes: {},
184
+ mcpServers: {},
185
+ },
186
+ path: '',
187
+ }, {
188
+ settings: { customThemes: {}, mcpServers: {} },
189
+ path: '',
190
+ }, []);
191
+ const { stdin, unmount } = render(_jsx(AuthDialog, { onSelect: onSelect, settings: settings }));
192
+ await wait();
193
+ // Simulate pressing escape key
194
+ stdin.write('\u001b'); // ESC key
195
+ await wait();
196
+ // Should call onSelect with undefined to close the dialog
197
+ expect(onSelect).toHaveBeenCalledWith(undefined, 'User');
198
+ unmount();
199
+ });
200
+ it('should close dialog even with an error message when ESC is pressed', async () => {
201
+ const onSelect = vi.fn();
202
+ const settings = new LoadedSettings({
203
+ settings: { customThemes: {}, mcpServers: {} },
204
+ path: '',
205
+ }, {
206
+ settings: {
207
+ selectedAuthType: undefined,
208
+ customThemes: {},
209
+ mcpServers: {},
210
+ },
211
+ path: '',
212
+ }, {
213
+ settings: { customThemes: {}, mcpServers: {} },
214
+ path: '',
215
+ }, []);
216
+ const { lastFrame, stdin, unmount } = render(_jsx(AuthDialog, { onSelect: onSelect, settings: settings, initialErrorMessage: "Initial error" }));
217
+ await wait();
218
+ expect(lastFrame()).toContain('Initial error');
219
+ // Simulate pressing escape key
220
+ stdin.write('\u001b'); // ESC key
221
+ await wait();
222
+ // Should call onSelect with undefined to close the dialog
223
+ expect(onSelect).toHaveBeenCalledWith(undefined, 'User');
224
+ unmount();
225
+ });
226
+ it('should allow exiting when auth method is already selected', async () => {
227
+ const onSelect = vi.fn();
228
+ const settings = new LoadedSettings({
229
+ settings: { customThemes: {}, mcpServers: {} },
230
+ path: '',
231
+ }, {
232
+ settings: {
233
+ selectedAuthType: AuthType.USE_GEMINI,
234
+ customThemes: {},
235
+ mcpServers: {},
236
+ },
237
+ path: '',
238
+ }, {
239
+ settings: { customThemes: {}, mcpServers: {} },
240
+ path: '',
241
+ }, []);
242
+ const { stdin, unmount } = render(_jsx(AuthDialog, { onSelect: onSelect, settings: settings }));
243
+ await wait();
244
+ // Simulate pressing escape key
245
+ stdin.write('\u001b'); // ESC key
246
+ await wait();
247
+ // Should call onSelect with undefined to exit
248
+ expect(onSelect).toHaveBeenCalledWith(undefined, SettingScope.User);
249
+ unmount();
250
+ });
251
+ });
252
+ //# sourceMappingURL=AuthDialog.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AuthDialog.test.js","sourceRoot":"","sources":["../../../../src/ui/components/AuthDialog.test.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,89 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { render } from 'ink-testing-library';
3
+ import { describe, it, expect, vi, beforeEach } from 'vitest';
4
+ import { Footer } from './Footer.js';
5
+ import { getProviderManager } from '../../providers/providerManagerInstance.js';
6
+ import { OpenAIProvider, ProviderManager, } from '@vybestack/llxprt-code-core';
7
+ // Mock the provider manager
8
+ vi.mock('../../providers/providerManagerInstance.js', () => ({
9
+ getProviderManager: vi.fn(),
10
+ }));
11
+ describe('ContextIndicator UI', () => {
12
+ let mockProvider;
13
+ let mockProviderManager;
14
+ beforeEach(() => {
15
+ // Create mock OpenAI provider
16
+ mockProvider = {
17
+ estimateContextUsage: vi.fn(),
18
+ };
19
+ // Make it an instance of OpenAIProvider for instanceof check
20
+ Object.setPrototypeOf(mockProvider, OpenAIProvider.prototype);
21
+ // Create a real ProviderManager instance and mock its methods
22
+ mockProviderManager = new ProviderManager();
23
+ // Mock the methods we need
24
+ vi.spyOn(mockProviderManager, 'hasActiveProvider').mockReturnValue(true);
25
+ vi.spyOn(mockProviderManager, 'getActiveProvider').mockReturnValue(mockProvider);
26
+ vi.mocked(getProviderManager).mockReturnValue(mockProviderManager);
27
+ });
28
+ it('should display context percentage without remote tokens', () => {
29
+ const { lastFrame } = render(_jsx(Footer, { model: "gpt-4o", targetDir: "/test/dir", debugMode: false, debugMessage: "", errorCount: 0, showErrorDetails: false, promptTokenCount: 1000, nightly: false }));
30
+ // Should show context in new format: Ctx: 1.0k/128k
31
+ expect(lastFrame()).toContain('Ctx: 1.0k/128k');
32
+ });
33
+ it('should display context percentage when using OpenAI', () => {
34
+ // Mock the context estimation
35
+ mockProvider.estimateContextUsage.mockReturnValue({
36
+ totalTokens: 52000,
37
+ remoteTokens: 50000,
38
+ promptTokens: 2000,
39
+ maxTokens: 128000,
40
+ contextUsedPercent: 40.625,
41
+ tokensRemaining: 76000,
42
+ });
43
+ const { lastFrame } = render(_jsx(Footer, { model: "gpt-4o", targetDir: "/test/dir", debugMode: false, debugMessage: "", errorCount: 0, showErrorDetails: false, promptTokenCount: 1000, nightly: false }));
44
+ // Should show context in new format: Ctx: 1.0k/128k
45
+ expect(lastFrame()).toContain('Ctx: 1.0k/128k');
46
+ });
47
+ it('should handle high token usage', () => {
48
+ // Mock near-limit context usage
49
+ mockProvider.estimateContextUsage.mockReturnValue({
50
+ totalTokens: 120000,
51
+ remoteTokens: 115000,
52
+ promptTokens: 5000,
53
+ maxTokens: 128000,
54
+ contextUsedPercent: 93.75,
55
+ tokensRemaining: 8000,
56
+ });
57
+ const { lastFrame } = render(_jsx(Footer, { model: "gpt-4o", targetDir: "/test/dir", debugMode: false, debugMessage: "", errorCount: 0, showErrorDetails: false, promptTokenCount: 1000, nightly: false }));
58
+ // Should show context in new format: Ctx: 1.0k/128k
59
+ expect(lastFrame()).toContain('Ctx: 1.0k/128k');
60
+ });
61
+ it('should fallback to local calculation on error', () => {
62
+ // Make estimateContextUsage throw an error
63
+ mockProvider.estimateContextUsage.mockImplementation(() => {
64
+ throw new Error('API error');
65
+ });
66
+ const { lastFrame } = render(_jsx(Footer, { model: "gpt-4o", targetDir: "/test/dir", debugMode: false, debugMessage: "", errorCount: 0, showErrorDetails: false, promptTokenCount: 1000, nightly: false }));
67
+ // Should fallback to local calculation in new format
68
+ expect(lastFrame()).toContain('Ctx: 1.0k/128k');
69
+ expect(lastFrame()).not.toContain('remote');
70
+ });
71
+ it('should handle non-OpenAI providers', () => {
72
+ // Mock a non-OpenAI provider
73
+ vi.mocked(mockProviderManager.getActiveProvider).mockReturnValue({
74
+ name: 'anthropic',
75
+ });
76
+ const { lastFrame } = render(_jsx(Footer, { model: "claude-3-opus", targetDir: "/test/dir", debugMode: false, debugMessage: "", errorCount: 0, showErrorDetails: false, promptTokenCount: 1000, nightly: false }));
77
+ // Should use local calculation for non-OpenAI providers in new format
78
+ expect(lastFrame()).toContain('Ctx: 1.0k/1049k');
79
+ expect(lastFrame()).not.toContain('remote');
80
+ });
81
+ it('should handle missing conversation context', () => {
82
+ const { lastFrame } = render(_jsx(Footer, { model: "gpt-4o", targetDir: "/test/dir", debugMode: false, debugMessage: "", errorCount: 0, showErrorDetails: false, promptTokenCount: 1000, nightly: false }));
83
+ // Should not attempt to get remote context
84
+ expect(mockProvider.estimateContextUsage).not.toHaveBeenCalled();
85
+ expect(lastFrame()).toContain('Ctx: 1.0k/128k');
86
+ expect(lastFrame()).not.toContain('remote');
87
+ });
88
+ });
89
+ //# sourceMappingURL=ContextIndicator.ui.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ContextIndicator.ui.test.js","sourceRoot":"","sources":["../../../../src/ui/components/ContextIndicator.ui.test.tsx"],"names":[],"mappings":"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"}
@@ -15,7 +15,7 @@ export const ContextSummaryDisplay = ({ activeFile: _activeFile, llxprtMdFileCou
15
15
  if (openFileCount === 0) {
16
16
  return '';
17
17
  }
18
- return `${openFileCount} open file${openFileCount > 1 ? 's' : ''} (ctrl+e to view)`;
18
+ return `${openFileCount} open file${openFileCount > 1 ? 's' : ''} (ctrl+g to view)`;
19
19
  })();
20
20
  const geminiMdText = (() => {
21
21
  if (llxprtMdFileCount === 0) {
@@ -0,0 +1,6 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ export {};