@vybestack/llxprt-code 0.1.14 → 0.1.16

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 (238) hide show
  1. package/README.md +90 -2
  2. package/dist/package.json +4 -5
  3. package/dist/src/config/config.d.ts +4 -1
  4. package/dist/src/config/config.js +151 -54
  5. package/dist/src/config/config.js.map +1 -1
  6. package/dist/src/config/extension.d.ts +1 -0
  7. package/dist/src/config/extension.js +4 -0
  8. package/dist/src/config/extension.js.map +1 -1
  9. package/dist/src/config/settings.d.ts +13 -3
  10. package/dist/src/config/settings.js +84 -23
  11. package/dist/src/config/settings.js.map +1 -1
  12. package/dist/src/gemini.d.ts +3 -0
  13. package/dist/src/gemini.js +212 -36
  14. package/dist/src/gemini.js.map +1 -1
  15. package/dist/src/generated/git-commit.d.ts +1 -1
  16. package/dist/src/generated/git-commit.js +1 -1
  17. package/dist/src/generated/git-commit.js.map +1 -1
  18. package/dist/src/integration-tests/GITHUB_ACTIONS_README.md +41 -0
  19. package/dist/src/integration-tests/test-utils.d.ts +68 -0
  20. package/dist/src/integration-tests/test-utils.js +167 -0
  21. package/dist/src/integration-tests/test-utils.js.map +1 -0
  22. package/dist/src/nonInteractiveCli.js +24 -66
  23. package/dist/src/nonInteractiveCli.js.map +1 -1
  24. package/dist/src/providers/IFileSystem.d.ts +42 -0
  25. package/dist/src/providers/IFileSystem.js +46 -0
  26. package/dist/src/providers/IFileSystem.js.map +1 -0
  27. package/dist/src/providers/providerConfigUtils.d.ts +0 -4
  28. package/dist/src/providers/providerConfigUtils.js +21 -52
  29. package/dist/src/providers/providerConfigUtils.js.map +1 -1
  30. package/dist/src/providers/providerManagerInstance.d.ts +6 -1
  31. package/dist/src/providers/providerManagerInstance.js +117 -82
  32. package/dist/src/providers/providerManagerInstance.js.map +1 -1
  33. package/dist/src/services/BuiltinCommandLoader.js +13 -0
  34. package/dist/src/services/BuiltinCommandLoader.js.map +1 -1
  35. package/dist/src/services/CommandService.d.ts +8 -4
  36. package/dist/src/services/CommandService.js +24 -8
  37. package/dist/src/services/CommandService.js.map +1 -1
  38. package/dist/src/services/FileCommandLoader.d.ts +15 -3
  39. package/dist/src/services/FileCommandLoader.js +94 -42
  40. package/dist/src/services/FileCommandLoader.js.map +1 -1
  41. package/dist/src/services/McpPromptLoader.d.ts +25 -0
  42. package/dist/src/services/McpPromptLoader.js +192 -0
  43. package/dist/src/services/McpPromptLoader.js.map +1 -0
  44. package/dist/src/services/prompt-processors/shellProcessor.d.ts +32 -0
  45. package/dist/src/services/prompt-processors/shellProcessor.js +77 -0
  46. package/dist/src/services/prompt-processors/shellProcessor.js.map +1 -0
  47. package/dist/src/services/prompt-processors/types.d.ts +4 -0
  48. package/dist/src/services/prompt-processors/types.js +4 -0
  49. package/dist/src/services/prompt-processors/types.js.map +1 -1
  50. package/dist/src/ui/App.js +325 -195
  51. package/dist/src/ui/App.js.map +1 -1
  52. package/dist/src/ui/commands/aboutCommand.js +2 -5
  53. package/dist/src/ui/commands/aboutCommand.js.map +1 -1
  54. package/dist/src/ui/commands/baseurlCommand.js +54 -9
  55. package/dist/src/ui/commands/baseurlCommand.js.map +1 -1
  56. package/dist/src/ui/commands/chatCommand.js +39 -1
  57. package/dist/src/ui/commands/chatCommand.js.map +1 -1
  58. package/dist/src/ui/commands/diagnosticsCommand.d.ts +10 -0
  59. package/dist/src/ui/commands/diagnosticsCommand.js +122 -0
  60. package/dist/src/ui/commands/diagnosticsCommand.js.map +1 -0
  61. package/dist/src/ui/commands/directoryCommand.d.ts +8 -0
  62. package/dist/src/ui/commands/directoryCommand.js +116 -0
  63. package/dist/src/ui/commands/directoryCommand.js.map +1 -0
  64. package/dist/src/ui/commands/ideCommand.js +101 -105
  65. package/dist/src/ui/commands/ideCommand.js.map +1 -1
  66. package/dist/src/ui/commands/initCommand.d.ts +7 -0
  67. package/dist/src/ui/commands/initCommand.js +108 -0
  68. package/dist/src/ui/commands/initCommand.js.map +1 -0
  69. package/dist/src/ui/commands/keyCommand.js +75 -11
  70. package/dist/src/ui/commands/keyCommand.js.map +1 -1
  71. package/dist/src/ui/commands/keyfileCommand.js +54 -13
  72. package/dist/src/ui/commands/keyfileCommand.js.map +1 -1
  73. package/dist/src/ui/commands/mcpCommand.js +53 -8
  74. package/dist/src/ui/commands/mcpCommand.js.map +1 -1
  75. package/dist/src/ui/commands/memoryCommand.js +2 -1
  76. package/dist/src/ui/commands/memoryCommand.js.map +1 -1
  77. package/dist/src/ui/commands/modelCommand.js +2 -5
  78. package/dist/src/ui/commands/modelCommand.js.map +1 -1
  79. package/dist/src/ui/commands/profileCommand.d.ts +10 -0
  80. package/dist/src/ui/commands/profileCommand.js +592 -0
  81. package/dist/src/ui/commands/profileCommand.js.map +1 -0
  82. package/dist/src/ui/commands/providerCommand.js +46 -3
  83. package/dist/src/ui/commands/providerCommand.js.map +1 -1
  84. package/dist/src/ui/commands/setCommand.d.ts +7 -0
  85. package/dist/src/ui/commands/setCommand.js +431 -0
  86. package/dist/src/ui/commands/setCommand.js.map +1 -0
  87. package/dist/src/ui/commands/setupGithubCommand.d.ts +7 -0
  88. package/dist/src/ui/commands/setupGithubCommand.js +49 -0
  89. package/dist/src/ui/commands/setupGithubCommand.js.map +1 -0
  90. package/dist/src/ui/commands/types.d.ts +23 -4
  91. package/dist/src/ui/commands/types.js +1 -0
  92. package/dist/src/ui/commands/types.js.map +1 -1
  93. package/dist/src/ui/commands/vimCommand.js +0 -7
  94. package/dist/src/ui/commands/vimCommand.js.map +1 -1
  95. package/dist/src/ui/components/ContextSummaryDisplay.d.ts +3 -3
  96. package/dist/src/ui/components/ContextSummaryDisplay.js +8 -8
  97. package/dist/src/ui/components/ContextSummaryDisplay.js.map +1 -1
  98. package/dist/src/ui/components/DebugProfiler.d.ts +6 -0
  99. package/dist/src/ui/components/DebugProfiler.js +26 -0
  100. package/dist/src/ui/components/DebugProfiler.js.map +1 -0
  101. package/dist/src/ui/components/Footer.d.ts +2 -0
  102. package/dist/src/ui/components/Footer.js +5 -4
  103. package/dist/src/ui/components/Footer.js.map +1 -1
  104. package/dist/src/ui/components/Header.js +1 -1
  105. package/dist/src/ui/components/Header.js.map +1 -1
  106. package/dist/src/ui/components/Help.js +2 -2
  107. package/dist/src/ui/components/Help.js.map +1 -1
  108. package/dist/src/ui/components/IDEContextDetailDisplay.d.ts +5 -4
  109. package/dist/src/ui/components/IDEContextDetailDisplay.js +6 -8
  110. package/dist/src/ui/components/IDEContextDetailDisplay.js.map +1 -1
  111. package/dist/src/ui/components/InputPrompt.d.ts +2 -0
  112. package/dist/src/ui/components/InputPrompt.js +128 -13
  113. package/dist/src/ui/components/InputPrompt.js.map +1 -1
  114. package/dist/src/ui/components/LoadProfileDialog.d.ts +13 -0
  115. package/dist/src/ui/components/LoadProfileDialog.js +57 -0
  116. package/dist/src/ui/components/LoadProfileDialog.js.map +1 -0
  117. package/dist/src/ui/components/PrepareLabel.d.ts +15 -0
  118. package/dist/src/ui/components/PrepareLabel.js +16 -0
  119. package/dist/src/ui/components/PrepareLabel.js.map +1 -0
  120. package/dist/src/ui/components/ProviderModelDialog.js +75 -28
  121. package/dist/src/ui/components/ProviderModelDialog.js.map +1 -1
  122. package/dist/src/ui/components/SecureKeyInput.d.ts +15 -0
  123. package/dist/src/ui/components/SecureKeyInput.js +58 -0
  124. package/dist/src/ui/components/SecureKeyInput.js.map +1 -0
  125. package/dist/src/ui/components/ShellConfirmationDialog.d.ts +15 -0
  126. package/dist/src/ui/components/ShellConfirmationDialog.js +45 -0
  127. package/dist/src/ui/components/ShellConfirmationDialog.js.map +1 -0
  128. package/dist/src/ui/components/SuggestionsDisplay.d.ts +1 -0
  129. package/dist/src/ui/components/SuggestionsDisplay.js +3 -3
  130. package/dist/src/ui/components/SuggestionsDisplay.js.map +1 -1
  131. package/dist/src/ui/components/Tips.js +1 -1
  132. package/dist/src/ui/components/Tips.js.map +1 -1
  133. package/dist/src/ui/components/messages/ToolConfirmationMessage.js +15 -4
  134. package/dist/src/ui/components/messages/ToolConfirmationMessage.js.map +1 -1
  135. package/dist/src/ui/components/messages/UserMessage.js +4 -1
  136. package/dist/src/ui/components/messages/UserMessage.js.map +1 -1
  137. package/dist/src/ui/components/shared/text-buffer.d.ts +270 -2
  138. package/dist/src/ui/components/shared/text-buffer.js +410 -70
  139. package/dist/src/ui/components/shared/text-buffer.js.map +1 -1
  140. package/dist/src/ui/components/shared/vim-buffer-actions.d.ts +72 -0
  141. package/dist/src/ui/components/shared/vim-buffer-actions.js +565 -0
  142. package/dist/src/ui/components/shared/vim-buffer-actions.js.map +1 -0
  143. package/dist/src/ui/containers/SessionController.js +14 -15
  144. package/dist/src/ui/containers/SessionController.js.map +1 -1
  145. package/dist/src/ui/contexts/VimModeContext.js +2 -2
  146. package/dist/src/ui/contexts/VimModeContext.js.map +1 -1
  147. package/dist/src/ui/editors/editorSettingsManager.js +2 -0
  148. package/dist/src/ui/editors/editorSettingsManager.js.map +1 -1
  149. package/dist/src/ui/hooks/atCommandProcessor.js +56 -48
  150. package/dist/src/ui/hooks/atCommandProcessor.js.map +1 -1
  151. package/dist/src/ui/hooks/shellCommandProcessor.d.ts +1 -0
  152. package/dist/src/ui/hooks/shellCommandProcessor.js +139 -200
  153. package/dist/src/ui/hooks/shellCommandProcessor.js.map +1 -1
  154. package/dist/src/ui/hooks/slashCommandProcessor.d.ts +7 -3
  155. package/dist/src/ui/hooks/slashCommandProcessor.js +219 -130
  156. package/dist/src/ui/hooks/slashCommandProcessor.js.map +1 -1
  157. package/dist/src/ui/hooks/useAuthCommand.js +9 -0
  158. package/dist/src/ui/hooks/useAuthCommand.js.map +1 -1
  159. package/dist/src/ui/hooks/useCompletion.d.ts +5 -5
  160. package/dist/src/ui/hooks/useCompletion.js +7 -402
  161. package/dist/src/ui/hooks/useCompletion.js.map +1 -1
  162. package/dist/src/ui/hooks/useConsoleMessages.js +53 -37
  163. package/dist/src/ui/hooks/useConsoleMessages.js.map +1 -1
  164. package/dist/src/ui/hooks/useGeminiStream.js +58 -12
  165. package/dist/src/ui/hooks/useGeminiStream.js.map +1 -1
  166. package/dist/src/ui/hooks/useKeypress.js +5 -2
  167. package/dist/src/ui/hooks/useKeypress.js.map +1 -1
  168. package/dist/src/ui/hooks/useLoadProfileDialog.d.ts +27 -0
  169. package/dist/src/ui/hooks/useLoadProfileDialog.js +138 -0
  170. package/dist/src/ui/hooks/useLoadProfileDialog.js.map +1 -0
  171. package/dist/src/ui/hooks/useReactToolScheduler.js +0 -1
  172. package/dist/src/ui/hooks/useReactToolScheduler.js.map +1 -1
  173. package/dist/src/ui/hooks/useReverseSearchCompletion.d.ts +19 -0
  174. package/dist/src/ui/hooks/useReverseSearchCompletion.js +54 -0
  175. package/dist/src/ui/hooks/useReverseSearchCompletion.js.map +1 -0
  176. package/dist/src/ui/hooks/useShellHistory.d.ts +1 -0
  177. package/dist/src/ui/hooks/useShellHistory.js +30 -7
  178. package/dist/src/ui/hooks/useShellHistory.js.map +1 -1
  179. package/dist/src/ui/hooks/useSlashCompletion.d.ts +24 -0
  180. package/dist/src/ui/hooks/useSlashCompletion.js +451 -0
  181. package/dist/src/ui/hooks/useSlashCompletion.js.map +1 -0
  182. package/dist/src/ui/hooks/vim.d.ts +28 -0
  183. package/dist/src/ui/hooks/vim.js +630 -0
  184. package/dist/src/ui/hooks/vim.js.map +1 -0
  185. package/dist/src/ui/reducers/appReducer.d.ts +3 -2
  186. package/dist/src/ui/reducers/appReducer.js +1 -0
  187. package/dist/src/ui/reducers/appReducer.js.map +1 -1
  188. package/dist/src/ui/themes/theme-manager.js +10 -1
  189. package/dist/src/ui/themes/theme-manager.js.map +1 -1
  190. package/dist/src/ui/themes/theme.d.ts +1 -0
  191. package/dist/src/ui/themes/theme.js +19 -4
  192. package/dist/src/ui/themes/theme.js.map +1 -1
  193. package/dist/src/ui/utils/renderLoopDetector.js +3 -3
  194. package/dist/src/ui/utils/renderLoopDetector.js.map +1 -1
  195. package/dist/src/ui/utils/secureInputHandler.d.ts +46 -0
  196. package/dist/src/ui/utils/secureInputHandler.js +128 -0
  197. package/dist/src/ui/utils/secureInputHandler.js.map +1 -0
  198. package/dist/src/ui/utils/textUtils.d.ts +0 -8
  199. package/dist/src/ui/utils/textUtils.js +0 -22
  200. package/dist/src/ui/utils/textUtils.js.map +1 -1
  201. package/dist/src/ui/utils/updateCheck.d.ts +7 -1
  202. package/dist/src/ui/utils/updateCheck.js +59 -25
  203. package/dist/src/ui/utils/updateCheck.js.map +1 -1
  204. package/dist/src/utils/events.d.ts +11 -0
  205. package/dist/src/utils/events.js +13 -0
  206. package/dist/src/utils/events.js.map +1 -0
  207. package/dist/src/utils/gitUtils.d.ts +10 -0
  208. package/dist/src/utils/gitUtils.js +24 -0
  209. package/dist/src/utils/gitUtils.js.map +1 -0
  210. package/dist/src/utils/handleAutoUpdate.d.ts +11 -0
  211. package/dist/src/utils/handleAutoUpdate.js +101 -0
  212. package/dist/src/utils/handleAutoUpdate.js.map +1 -0
  213. package/dist/src/utils/installationInfo.d.ts +23 -0
  214. package/dist/src/utils/installationInfo.js +154 -0
  215. package/dist/src/utils/installationInfo.js.map +1 -0
  216. package/dist/src/utils/sandbox-macos-permissive-closed.sb +6 -0
  217. package/dist/src/utils/sandbox-macos-permissive-open.sb +6 -0
  218. package/dist/src/utils/sandbox-macos-permissive-proxied.sb +6 -0
  219. package/dist/src/utils/sandbox-macos-restrictive-closed.sb +6 -0
  220. package/dist/src/utils/sandbox-macos-restrictive-open.sb +6 -0
  221. package/dist/src/utils/sandbox-macos-restrictive-proxied.sb +6 -0
  222. package/dist/src/utils/sandbox.d.ts +2 -2
  223. package/dist/src/utils/sandbox.js +35 -11
  224. package/dist/src/utils/sandbox.js.map +1 -1
  225. package/dist/src/utils/spawnWrapper.d.ts +7 -0
  226. package/dist/src/utils/spawnWrapper.js +8 -0
  227. package/dist/src/utils/spawnWrapper.js.map +1 -0
  228. package/dist/src/utils/updateEventEmitter.d.ts +11 -0
  229. package/dist/src/utils/updateEventEmitter.js +12 -0
  230. package/dist/src/utils/updateEventEmitter.js.map +1 -0
  231. package/dist/src/validateNonInterActiveAuth.d.ts +2 -1
  232. package/dist/src/validateNonInterActiveAuth.js +31 -5
  233. package/dist/src/validateNonInterActiveAuth.js.map +1 -1
  234. package/dist/tsconfig.tsbuildinfo +1 -1
  235. package/package.json +4 -5
  236. package/dist/src/providers/enhanceConfigWithProviders.d.ts +0 -12
  237. package/dist/src/providers/enhanceConfigWithProviders.js +0 -16
  238. package/dist/src/providers/enhanceConfigWithProviders.js.map +0 -1
@@ -15,10 +15,6 @@ export interface ProviderConfigResult {
15
15
  * Sets or removes the API key for the active provider
16
16
  */
17
17
  export declare function setProviderApiKey(providerManager: ProviderManager, settings: LoadedSettings, apiKey: string | undefined, config?: Config): Promise<ProviderConfigResult>;
18
- /**
19
- * Sets the API key from a file for the active provider
20
- */
21
- export declare function setProviderApiKeyFromFile(providerManager: ProviderManager, settings: LoadedSettings, filePath: string, config?: Config): Promise<ProviderConfigResult>;
22
18
  /**
23
19
  * Sets or clears the base URL for the active provider
24
20
  */
@@ -3,10 +3,20 @@
3
3
  * Copyright 2025 Google LLC
4
4
  * SPDX-License-Identifier: Apache-2.0
5
5
  */
6
- import { readFile } from 'node:fs/promises';
7
- import { homedir } from 'node:os';
8
- import { AuthType } from '@vybestack/llxprt-code-core';
9
- import { SettingScope } from '../config/settings.js';
6
+ import { AuthType, sanitizeForByteString, needsSanitization, } from '@vybestack/llxprt-code-core';
7
+ /**
8
+ * Sanitizes API keys to remove problematic characters that cause ByteString errors.
9
+ * This handles cases where API key files have encoding issues or contain
10
+ * Unicode replacement characters (U+FFFD).
11
+ */
12
+ function sanitizeApiKey(key) {
13
+ const sanitized = sanitizeForByteString(key);
14
+ if (needsSanitization(key)) {
15
+ console.warn('[ProviderConfig] API key contained non-ASCII or control characters that were removed. ' +
16
+ 'Please check your API key file encoding (should be UTF-8 without BOM).');
17
+ }
18
+ return sanitized;
19
+ }
10
20
  /**
11
21
  * Sets or removes the API key for the active provider
12
22
  */
@@ -21,10 +31,7 @@ export async function setProviderApiKey(providerManager, settings, apiKey, confi
21
31
  // Clear the API key
22
32
  if (activeProvider.setApiKey) {
23
33
  activeProvider.setApiKey('');
24
- // Remove from settings
25
- const currentKeys = settings.merged.providerApiKeys || {};
26
- delete currentKeys[providerName];
27
- settings.setValue(SettingScope.User, 'providerApiKeys', currentKeys);
34
+ // Don't need to remove from settings as we no longer save API keys there
28
35
  // If this is the Gemini provider, we might need to switch auth mode
29
36
  const requiresAuthRefresh = providerName === 'gemini' && !!config;
30
37
  if (requiresAuthRefresh && config) {
@@ -49,13 +56,11 @@ export async function setProviderApiKey(providerManager, settings, apiKey, confi
49
56
  };
50
57
  }
51
58
  }
52
- // Update the provider's API key
59
+ // Update the provider's API key (sanitized)
53
60
  if (activeProvider.setApiKey) {
54
- activeProvider.setApiKey(apiKey);
55
- // Save to settings
56
- const currentKeys = settings.merged.providerApiKeys || {};
57
- currentKeys[providerName] = apiKey;
58
- settings.setValue(SettingScope.User, 'providerApiKeys', currentKeys);
61
+ const sanitizedKey = sanitizeApiKey(apiKey);
62
+ activeProvider.setApiKey(sanitizedKey);
63
+ // Don't save API keys to settings - they should only be in profiles or ephemeral
59
64
  // If this is the Gemini provider, we need to refresh auth to use API key mode
60
65
  const requiresAuthRefresh = providerName === 'gemini' && !!config;
61
66
  if (requiresAuthRefresh && config) {
@@ -87,36 +92,6 @@ export async function setProviderApiKey(providerManager, settings, apiKey, confi
87
92
  };
88
93
  }
89
94
  }
90
- /**
91
- * Sets the API key from a file for the active provider
92
- */
93
- export async function setProviderApiKeyFromFile(providerManager, settings, filePath, config) {
94
- try {
95
- // Resolve ~ to home directory
96
- const resolvedPath = filePath.replace(/^~/, homedir());
97
- // Read the API key from file
98
- const apiKey = (await readFile(resolvedPath, 'utf-8')).trim();
99
- if (!apiKey) {
100
- return {
101
- success: false,
102
- message: 'The specified file is empty',
103
- };
104
- }
105
- // Use the setProviderApiKey function to handle the actual key setting
106
- const result = await setProviderApiKey(providerManager, settings, apiKey, config);
107
- // Modify the message to indicate it was loaded from a file
108
- if (result.success && result.message.includes('API key updated')) {
109
- result.message = result.message.replace('API key updated', `API key loaded from ${resolvedPath}`);
110
- }
111
- return result;
112
- }
113
- catch (error) {
114
- return {
115
- success: false,
116
- message: `Failed to process keyfile: ${error instanceof Error ? error.message : String(error)}`,
117
- };
118
- }
119
- }
120
95
  /**
121
96
  * Sets or clears the base URL for the active provider
122
97
  */
@@ -128,10 +103,7 @@ export async function setProviderBaseUrl(providerManager, settings, baseUrl) {
128
103
  // Clear base URL to provider default
129
104
  if (activeProvider.setBaseUrl) {
130
105
  activeProvider.setBaseUrl(undefined);
131
- // Remove from settings
132
- const currentUrls = settings.merged.providerBaseUrls || {};
133
- delete currentUrls[providerName];
134
- settings.setValue(SettingScope.User, 'providerBaseUrls', currentUrls);
106
+ // Don't need to remove from settings as we no longer save base URLs there
135
107
  return {
136
108
  success: true,
137
109
  message: `Base URL cleared, provider '${providerName}' now uses default URL`,
@@ -147,10 +119,7 @@ export async function setProviderBaseUrl(providerManager, settings, baseUrl) {
147
119
  // Update the provider's base URL
148
120
  if (activeProvider.setBaseUrl) {
149
121
  activeProvider.setBaseUrl(baseUrl);
150
- // Save to settings
151
- const currentUrls = settings.merged.providerBaseUrls || {};
152
- currentUrls[providerName] = baseUrl;
153
- settings.setValue(SettingScope.User, 'providerBaseUrls', currentUrls);
122
+ // Don't save base URLs to settings - they should only be in profiles or ephemeral
154
123
  return {
155
124
  success: true,
156
125
  message: `Base URL updated to '${baseUrl}' for provider '${providerName}'`,
@@ -1 +1 @@
1
- {"version":3,"file":"providerConfigUtils.js","sourceRoot":"","sources":["../../../src/providers/providerConfigUtils.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"providerConfigUtils.js","sourceRoot":"","sources":["../../../src/providers/providerConfigUtils.ts"],"names":[],"mappings":"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"}
@@ -4,6 +4,11 @@
4
4
  * SPDX-License-Identifier: Apache-2.0
5
5
  */
6
6
  import { Config, ProviderManager } from '@vybestack/llxprt-code-core';
7
- export declare function getProviderManager(config?: Config): ProviderManager;
7
+ import { IFileSystem } from './IFileSystem.js';
8
+ /**
9
+ * Set a custom file system implementation (mainly for testing).
10
+ */
11
+ export declare function setFileSystem(fs: IFileSystem): void;
12
+ export declare function getProviderManager(config?: Config, allowBrowserEnvironment?: boolean): ProviderManager;
8
13
  export declare function resetProviderManager(): void;
9
14
  export { getProviderManager as providerManager };
@@ -3,109 +3,144 @@
3
3
  * Copyright 2025 Vybestack LLC
4
4
  * SPDX-License-Identifier: Apache-2.0
5
5
  */
6
- import { ProviderManager, OpenAIProvider, AnthropicProvider, GeminiProvider, } from '@vybestack/llxprt-code-core';
7
- import { readFileSync, existsSync } from 'fs';
6
+ import { ProviderManager, OpenAIProvider, AnthropicProvider, GeminiProvider, sanitizeForByteString, needsSanitization, } from '@vybestack/llxprt-code-core';
7
+ import { NodeFileSystem } from './IFileSystem.js';
8
8
  import { homedir } from 'os';
9
9
  import { join } from 'path';
10
10
  import { USER_SETTINGS_PATH } from '../config/settings.js';
11
11
  import stripJsonComments from 'strip-json-comments';
12
+ /**
13
+ * Sanitizes API keys to remove problematic characters that cause ByteString errors.
14
+ * This handles cases where API key files have encoding issues or contain
15
+ * Unicode replacement characters (U+FFFD).
16
+ */
17
+ function sanitizeApiKey(key) {
18
+ const sanitized = sanitizeForByteString(key);
19
+ if (needsSanitization(key)) {
20
+ console.warn('[ProviderManager] API key contained non-ASCII or control characters that were removed. ' +
21
+ 'Please check your API key file encoding (should be UTF-8 without BOM).');
22
+ }
23
+ return sanitized;
24
+ }
12
25
  let providerManagerInstance = null;
13
- export function getProviderManager(config) {
26
+ let fileSystemInstance = null;
27
+ /**
28
+ * Set a custom file system implementation (mainly for testing).
29
+ */
30
+ export function setFileSystem(fs) {
31
+ fileSystemInstance = fs;
32
+ }
33
+ /**
34
+ * Get the file system implementation to use.
35
+ */
36
+ function getFileSystem() {
37
+ if (!fileSystemInstance) {
38
+ fileSystemInstance = new NodeFileSystem();
39
+ }
40
+ return fileSystemInstance;
41
+ }
42
+ export function getProviderManager(config, allowBrowserEnvironment = false) {
14
43
  if (!providerManagerInstance) {
15
44
  providerManagerInstance = new ProviderManager();
16
- // Only auto-initialize providers when not in test environment
17
- if (process.env.NODE_ENV !== 'test') {
18
- // Load user settings to check for saved API keys
19
- let savedApiKeys = {};
20
- let userSettings;
21
- try {
22
- if (existsSync(USER_SETTINGS_PATH)) {
23
- const userContent = readFileSync(USER_SETTINGS_PATH, 'utf-8');
24
- userSettings = JSON.parse(stripJsonComments(userContent));
25
- savedApiKeys = userSettings.providerApiKeys || {};
26
- }
27
- }
28
- catch (_error) {
29
- // Failed to load user settings, that's OK
45
+ const fs = getFileSystem();
46
+ // Load user settings
47
+ let userSettings;
48
+ try {
49
+ if (fs.existsSync(USER_SETTINGS_PATH)) {
50
+ const userContent = fs.readFileSync(USER_SETTINGS_PATH, 'utf-8');
51
+ userSettings = JSON.parse(stripJsonComments(userContent));
30
52
  }
31
- // Register GeminiProvider
32
- const geminiProvider = new GeminiProvider();
33
- // Set initial model from settings if available
34
- if (userSettings?.defaultModel) {
35
- geminiProvider.setModel(userSettings.defaultModel);
36
- }
37
- if (config) {
38
- geminiProvider.setConfig(config);
39
- }
40
- providerManagerInstance.registerProvider(geminiProvider);
41
- // Configure Gemini auth with priority: keyfile > key > oauth
42
- // First check for saved API key
43
- if (savedApiKeys.gemini) {
44
- geminiProvider.setApiKey(savedApiKeys.gemini);
45
- }
46
- // Then check for keyfile
47
- else {
48
- try {
49
- const keyfilePath = join(homedir(), '.google_key');
50
- const geminiApiKey = readFileSync(keyfilePath, 'utf-8').trim();
51
- if (geminiApiKey) {
52
- geminiProvider.setApiKey(geminiApiKey);
53
- }
54
- }
55
- catch (_error) {
56
- // No Google keyfile available, that's OK - will use OAuth if available
53
+ }
54
+ catch (_error) {
55
+ // Failed to load user settings, that's OK
56
+ }
57
+ // Always register GeminiProvider
58
+ const geminiProvider = new GeminiProvider(undefined, undefined, config);
59
+ if (config) {
60
+ geminiProvider.setConfig(config);
61
+ }
62
+ providerManagerInstance.registerProvider(geminiProvider);
63
+ // Configure Gemini auth - check for keyfile only
64
+ try {
65
+ const keyfilePath = join(homedir(), '.google_key');
66
+ if (fs.existsSync(keyfilePath)) {
67
+ const geminiApiKey = fs.readFileSync(keyfilePath, 'utf-8').trim();
68
+ if (geminiApiKey) {
69
+ geminiProvider.setApiKey(sanitizeApiKey(geminiApiKey));
57
70
  }
58
71
  }
59
- // Initialize with OpenAI provider if API key is available
60
- // Priority: CLI /key (in settings) > Environment variable > keyfile
61
- let openaiApiKey = savedApiKeys.openai;
62
- if (!openaiApiKey) {
63
- openaiApiKey = process.env.OPENAI_API_KEY;
64
- }
65
- if (!openaiApiKey) {
66
- try {
67
- const apiKeyPath = join(homedir(), '.openai_key');
68
- openaiApiKey = readFileSync(apiKeyPath, 'utf-8').trim();
69
- }
70
- catch (_error) {
71
- // No OpenAI keyfile available, that's OK
72
+ }
73
+ catch (_error) {
74
+ // No Google keyfile available, that's OK - will use OAuth if available
75
+ }
76
+ // Always register OpenAI provider
77
+ // Priority: Environment variable > keyfile (skip keyfile in test)
78
+ let openaiApiKey;
79
+ if (process.env.OPENAI_API_KEY) {
80
+ openaiApiKey = sanitizeApiKey(process.env.OPENAI_API_KEY);
81
+ }
82
+ if (!openaiApiKey) {
83
+ try {
84
+ const apiKeyPath = join(homedir(), '.openai_key');
85
+ if (fs.existsSync(apiKeyPath)) {
86
+ const rawKey = fs.readFileSync(apiKeyPath, 'utf-8').trim();
87
+ openaiApiKey = sanitizeApiKey(rawKey);
72
88
  }
73
89
  }
74
- const openaiBaseUrl = process.env.OPENAI_BASE_URL;
75
- if (process.env.DEBUG || process.env.VERBOSE) {
76
- console.log('[ProviderManager] Initializing OpenAI provider with:', {
77
- hasApiKey: !!openaiApiKey,
78
- baseUrl: openaiBaseUrl || 'default',
79
- });
80
- }
81
- const openaiProvider = new OpenAIProvider(openaiApiKey || '', openaiBaseUrl, userSettings);
82
- providerManagerInstance.registerProvider(openaiProvider);
83
- // OpenAI provider registered
84
- // Initialize with Anthropic provider if API key is available
85
- // Priority: CLI /key (in settings) > Environment variable > keyfile
86
- let anthropicApiKey = savedApiKeys.anthropic;
87
- if (!anthropicApiKey) {
88
- anthropicApiKey = process.env.ANTHROPIC_API_KEY;
90
+ catch (_error) {
91
+ // No OpenAI keyfile available, that's OK
89
92
  }
90
- if (!anthropicApiKey) {
91
- try {
92
- const apiKeyPath = join(homedir(), '.anthropic_key');
93
- anthropicApiKey = readFileSync(apiKeyPath, 'utf-8').trim();
94
- }
95
- catch (_error) {
96
- // No Anthropic keyfile available, that's OK
93
+ }
94
+ const openaiBaseUrl = process.env.OPENAI_BASE_URL;
95
+ if (process.env.DEBUG || process.env.VERBOSE) {
96
+ console.log('[ProviderManager] Initializing OpenAI provider with:', {
97
+ hasApiKey: !!openaiApiKey,
98
+ baseUrl: openaiBaseUrl || 'default',
99
+ });
100
+ }
101
+ // Create provider config from user settings
102
+ const openaiProviderConfig = {
103
+ enableTextToolCallParsing: userSettings?.enableTextToolCallParsing,
104
+ textToolCallModels: userSettings?.textToolCallModels,
105
+ providerToolFormatOverrides: userSettings?.providerToolFormatOverrides,
106
+ openaiResponsesEnabled: userSettings?.openaiResponsesEnabled,
107
+ allowBrowserEnvironment,
108
+ };
109
+ const openaiProvider = new OpenAIProvider(openaiApiKey || '', openaiBaseUrl, openaiProviderConfig);
110
+ providerManagerInstance.registerProvider(openaiProvider);
111
+ // Always register Anthropic provider
112
+ // Priority: Environment variable > keyfile (skip keyfile in test)
113
+ let anthropicApiKey;
114
+ if (process.env.ANTHROPIC_API_KEY) {
115
+ anthropicApiKey = sanitizeApiKey(process.env.ANTHROPIC_API_KEY);
116
+ }
117
+ if (!anthropicApiKey) {
118
+ try {
119
+ const apiKeyPath = join(homedir(), '.anthropic_key');
120
+ if (fs.existsSync(apiKeyPath)) {
121
+ const rawKey = fs.readFileSync(apiKeyPath, 'utf-8').trim();
122
+ anthropicApiKey = sanitizeApiKey(rawKey);
97
123
  }
98
124
  }
99
- const anthropicBaseUrl = process.env.ANTHROPIC_BASE_URL;
100
- const anthropicProvider = new AnthropicProvider(anthropicApiKey || '', anthropicBaseUrl);
101
- providerManagerInstance.registerProvider(anthropicProvider);
102
- // Anthropic provider registered
125
+ catch (_error) {
126
+ // No Anthropic keyfile available, that's OK
127
+ }
103
128
  }
129
+ const anthropicBaseUrl = process.env.ANTHROPIC_BASE_URL;
130
+ // Create provider config from user settings
131
+ const anthropicProviderConfig = {
132
+ allowBrowserEnvironment,
133
+ };
134
+ const anthropicProvider = new AnthropicProvider(anthropicApiKey || '', anthropicBaseUrl, anthropicProviderConfig);
135
+ providerManagerInstance.registerProvider(anthropicProvider);
136
+ // Set default provider to gemini
137
+ providerManagerInstance.setActiveProvider('gemini');
104
138
  }
105
139
  return providerManagerInstance;
106
140
  }
107
141
  export function resetProviderManager() {
108
142
  providerManagerInstance = null;
143
+ fileSystemInstance = null;
109
144
  }
110
145
  export { getProviderManager as providerManager };
111
146
  //# sourceMappingURL=providerManagerInstance.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"providerManagerInstance.js","sourceRoot":"","sources":["../../../src/providers/providerManagerInstance.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"providerManagerInstance.js","sourceRoot":"","sources":["../../../src/providers/providerManagerInstance.ts"],"names":[],"mappings":"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"}
@@ -11,10 +11,12 @@ import { clearCommand } from '../ui/commands/clearCommand.js';
11
11
  import { compressCommand } from '../ui/commands/compressCommand.js';
12
12
  import { copyCommand } from '../ui/commands/copyCommand.js';
13
13
  import { docsCommand } from '../ui/commands/docsCommand.js';
14
+ import { directoryCommand } from '../ui/commands/directoryCommand.js';
14
15
  import { editorCommand } from '../ui/commands/editorCommand.js';
15
16
  import { extensionsCommand } from '../ui/commands/extensionsCommand.js';
16
17
  import { helpCommand } from '../ui/commands/helpCommand.js';
17
18
  import { ideCommand } from '../ui/commands/ideCommand.js';
19
+ import { initCommand } from '../ui/commands/initCommand.js';
18
20
  import { mcpCommand } from '../ui/commands/mcpCommand.js';
19
21
  import { memoryCommand } from '../ui/commands/memoryCommand.js';
20
22
  import { privacyCommand } from '../ui/commands/privacyCommand.js';
@@ -30,6 +32,11 @@ import { keyCommand } from '../ui/commands/keyCommand.js';
30
32
  import { keyfileCommand } from '../ui/commands/keyfileCommand.js';
31
33
  import { baseurlCommand } from '../ui/commands/baseurlCommand.js';
32
34
  import { toolformatCommand } from '../ui/commands/toolformatCommand.js';
35
+ import { setupGithubCommand } from '../ui/commands/setupGithubCommand.js';
36
+ import { setCommand } from '../ui/commands/setCommand.js';
37
+ import { profileCommand } from '../ui/commands/profileCommand.js';
38
+ import { diagnosticsCommand } from '../ui/commands/diagnosticsCommand.js';
39
+ import { isGitHubRepository } from '../utils/gitUtils.js';
33
40
  /**
34
41
  * Loads the core, hard-coded slash commands that are an integral part
35
42
  * of the Gemini CLI application.
@@ -56,10 +63,12 @@ export class BuiltinCommandLoader {
56
63
  compressCommand,
57
64
  copyCommand,
58
65
  docsCommand,
66
+ directoryCommand,
59
67
  editorCommand,
60
68
  extensionsCommand,
61
69
  helpCommand,
62
70
  ideCommand(this.config),
71
+ initCommand,
63
72
  mcpCommand,
64
73
  memoryCommand,
65
74
  privacyCommand,
@@ -75,6 +84,10 @@ export class BuiltinCommandLoader {
75
84
  keyfileCommand,
76
85
  baseurlCommand,
77
86
  toolformatCommand,
87
+ setCommand,
88
+ profileCommand,
89
+ diagnosticsCommand,
90
+ ...(isGitHubRepository() ? [setupGithubCommand] : []),
78
91
  ];
79
92
  return allDefinitions.filter((cmd) => cmd !== null);
80
93
  }
@@ -1 +1 @@
1
- {"version":3,"file":"BuiltinCommandLoader.js","sourceRoot":"","sources":["../../../src/services/BuiltinCommandLoader.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH,OAAO,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAC;AAC9D,OAAO,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAC;AAC5D,OAAO,EAAE,UAAU,EAAE,MAAM,8BAA8B,CAAC;AAC1D,OAAO,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAC;AAC5D,OAAO,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAC;AAC9D,OAAO,EAAE,eAAe,EAAE,MAAM,mCAAmC,CAAC;AACpE,OAAO,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAC;AAC5D,OAAO,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAC;AAC5D,OAAO,EAAE,aAAa,EAAE,MAAM,iCAAiC,CAAC;AAChE,OAAO,EAAE,iBAAiB,EAAE,MAAM,qCAAqC,CAAC;AACxE,OAAO,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAC;AAC5D,OAAO,EAAE,UAAU,EAAE,MAAM,8BAA8B,CAAC;AAC1D,OAAO,EAAE,UAAU,EAAE,MAAM,8BAA8B,CAAC;AAC1D,OAAO,EAAE,aAAa,EAAE,MAAM,iCAAiC,CAAC;AAChE,OAAO,EAAE,cAAc,EAAE,MAAM,kCAAkC,CAAC;AAClE,OAAO,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAC;AAC5D,OAAO,EAAE,cAAc,EAAE,MAAM,kCAAkC,CAAC;AAClE,OAAO,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAC;AAC9D,OAAO,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAC;AAC9D,OAAO,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAC;AAC9D,OAAO,EAAE,UAAU,EAAE,MAAM,8BAA8B,CAAC;AAC1D,OAAO,EAAE,eAAe,EAAE,MAAM,mCAAmC,CAAC;AACpE,OAAO,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAC;AAC9D,OAAO,EAAE,UAAU,EAAE,MAAM,8BAA8B,CAAC;AAC1D,OAAO,EAAE,cAAc,EAAE,MAAM,kCAAkC,CAAC;AAClE,OAAO,EAAE,cAAc,EAAE,MAAM,kCAAkC,CAAC;AAClE,OAAO,EAAE,iBAAiB,EAAE,MAAM,qCAAqC,CAAC;AAExE;;;GAGG;AACH,MAAM,OAAO,oBAAoB;IACX;IAApB,YAAoB,MAAqB;QAArB,WAAM,GAAN,MAAM,CAAe;IAAG,CAAC;IAE7C;;;;;;OAMG;IACH,KAAK,CAAC,YAAY,CAAC,OAAoB;QACrC,MAAM,cAAc,GAA+B;YACjD,YAAY;YACZ,WAAW;YACX,UAAU;YACV,WAAW;YACX,YAAY;YACZ,eAAe;YACf,WAAW;YACX,WAAW;YACX,aAAa;YACb,iBAAiB;YACjB,WAAW;YACX,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC;YACvB,UAAU;YACV,aAAa;YACb,cAAc;YACd,WAAW;YACX,cAAc,CAAC,IAAI,CAAC,MAAM,CAAC;YAC3B,YAAY;YACZ,YAAY;YACZ,YAAY;YACZ,UAAU;YACV,eAAe;YACf,YAAY;YACZ,UAAU;YACV,cAAc;YACd,cAAc;YACd,iBAAiB;SAClB,CAAC;QAEF,OAAO,cAAc,CAAC,MAAM,CAAC,CAAC,GAAG,EAAuB,EAAE,CAAC,GAAG,KAAK,IAAI,CAAC,CAAC;IAC3E,CAAC;CACF"}
1
+ {"version":3,"file":"BuiltinCommandLoader.js","sourceRoot":"","sources":["../../../src/services/BuiltinCommandLoader.ts"],"names":[],"mappings":"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"}
@@ -28,13 +28,17 @@ export declare class CommandService {
28
28
  *
29
29
  * This factory method orchestrates the entire command loading process. It
30
30
  * runs all provided loaders in parallel, aggregates their results, handles
31
- * name conflicts by letting the last-loaded command win, and then returns a
31
+ * name conflicts for extension commands by renaming them, and then returns a
32
32
  * fully constructed `CommandService` instance.
33
33
  *
34
+ * Conflict resolution:
35
+ * - Extension commands that conflict with existing commands are renamed to
36
+ * `extensionName.commandName`
37
+ * - Non-extension commands (built-in, user, project) override earlier commands
38
+ * with the same name based on loader order
39
+ *
34
40
  * @param loaders An array of objects that conform to the `ICommandLoader`
35
- * interface. The order of loaders is significant: if multiple loaders
36
- * provide a command with the same name, the command from the loader that
37
- * appears later in the array will take precedence.
41
+ * interface. Built-in commands should come first, followed by FileCommandLoader.
38
42
  * @param signal An AbortSignal to cancel the loading process.
39
43
  * @returns A promise that resolves to a new, fully initialized `CommandService` instance.
40
44
  */
@@ -28,13 +28,17 @@ export class CommandService {
28
28
  *
29
29
  * This factory method orchestrates the entire command loading process. It
30
30
  * runs all provided loaders in parallel, aggregates their results, handles
31
- * name conflicts by letting the last-loaded command win, and then returns a
31
+ * name conflicts for extension commands by renaming them, and then returns a
32
32
  * fully constructed `CommandService` instance.
33
33
  *
34
+ * Conflict resolution:
35
+ * - Extension commands that conflict with existing commands are renamed to
36
+ * `extensionName.commandName`
37
+ * - Non-extension commands (built-in, user, project) override earlier commands
38
+ * with the same name based on loader order
39
+ *
34
40
  * @param loaders An array of objects that conform to the `ICommandLoader`
35
- * interface. The order of loaders is significant: if multiple loaders
36
- * provide a command with the same name, the command from the loader that
37
- * appears later in the array will take precedence.
41
+ * interface. Built-in commands should come first, followed by FileCommandLoader.
38
42
  * @param signal An AbortSignal to cancel the loading process.
39
43
  * @returns A promise that resolves to a new, fully initialized `CommandService` instance.
40
44
  */
@@ -49,12 +53,24 @@ export class CommandService {
49
53
  console.debug('A command loader failed:', result.reason);
50
54
  }
51
55
  }
52
- // De-duplicate commands using a Map. The last one found with a given name wins.
53
- // This creates a natural override system based on the order of the loaders
54
- // passed to the constructor.
55
56
  const commandMap = new Map();
56
57
  for (const cmd of allCommands) {
57
- commandMap.set(cmd.name, cmd);
58
+ let finalName = cmd.name;
59
+ // Extension commands get renamed if they conflict with existing commands
60
+ if (cmd.extensionName && commandMap.has(cmd.name)) {
61
+ let renamedName = `${cmd.extensionName}.${cmd.name}`;
62
+ let suffix = 1;
63
+ // Keep trying until we find a name that doesn't conflict
64
+ while (commandMap.has(renamedName)) {
65
+ renamedName = `${cmd.extensionName}.${cmd.name}${suffix}`;
66
+ suffix++;
67
+ }
68
+ finalName = renamedName;
69
+ }
70
+ commandMap.set(finalName, {
71
+ ...cmd,
72
+ name: finalName,
73
+ });
58
74
  }
59
75
  const finalCommands = Object.freeze(Array.from(commandMap.values()));
60
76
  return new CommandService(finalCommands);
@@ -1 +1 @@
1
- {"version":3,"file":"CommandService.js","sourceRoot":"","sources":["../../../src/services/CommandService.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH;;;;;;;;;;GAUG;AACH,MAAM,OAAO,cAAc;IAKY;IAJrC;;;OAGG;IACH,YAAqC,QAAiC;QAAjC,aAAQ,GAAR,QAAQ,CAAyB;IAAG,CAAC;IAE1E;;;;;;;;;;;;;;OAcG;IACH,MAAM,CAAC,KAAK,CAAC,MAAM,CACjB,OAAyB,EACzB,MAAmB;QAEnB,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,UAAU,CACtC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CACrD,CAAC;QAEF,MAAM,WAAW,GAAmB,EAAE,CAAC;QACvC,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;YAC7B,IAAI,MAAM,CAAC,MAAM,KAAK,WAAW,EAAE,CAAC;gBAClC,WAAW,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;YACpC,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,KAAK,CAAC,0BAA0B,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;YAC3D,CAAC;QACH,CAAC;QAED,gFAAgF;QAChF,2EAA2E;QAC3E,6BAA6B;QAC7B,MAAM,UAAU,GAAG,IAAI,GAAG,EAAwB,CAAC;QACnD,KAAK,MAAM,GAAG,IAAI,WAAW,EAAE,CAAC;YAC9B,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;QAChC,CAAC;QAED,MAAM,aAAa,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QACrE,OAAO,IAAI,cAAc,CAAC,aAAa,CAAC,CAAC;IAC3C,CAAC;IAED;;;;;;;OAOG;IACH,WAAW;QACT,OAAO,IAAI,CAAC,QAAQ,CAAC;IACvB,CAAC;CACF"}
1
+ {"version":3,"file":"CommandService.js","sourceRoot":"","sources":["../../../src/services/CommandService.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH;;;;;;;;;;GAUG;AACH,MAAM,OAAO,cAAc;IAKY;IAJrC;;;OAGG;IACH,YAAqC,QAAiC;QAAjC,aAAQ,GAAR,QAAQ,CAAyB;IAAG,CAAC;IAE1E;;;;;;;;;;;;;;;;;;OAkBG;IACH,MAAM,CAAC,KAAK,CAAC,MAAM,CACjB,OAAyB,EACzB,MAAmB;QAEnB,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,UAAU,CACtC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CACrD,CAAC;QAEF,MAAM,WAAW,GAAmB,EAAE,CAAC;QACvC,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;YAC7B,IAAI,MAAM,CAAC,MAAM,KAAK,WAAW,EAAE,CAAC;gBAClC,WAAW,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;YACpC,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,KAAK,CAAC,0BAA0B,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;YAC3D,CAAC;QACH,CAAC;QAED,MAAM,UAAU,GAAG,IAAI,GAAG,EAAwB,CAAC;QACnD,KAAK,MAAM,GAAG,IAAI,WAAW,EAAE,CAAC;YAC9B,IAAI,SAAS,GAAG,GAAG,CAAC,IAAI,CAAC;YAEzB,yEAAyE;YACzE,IAAI,GAAG,CAAC,aAAa,IAAI,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;gBAClD,IAAI,WAAW,GAAG,GAAG,GAAG,CAAC,aAAa,IAAI,GAAG,CAAC,IAAI,EAAE,CAAC;gBACrD,IAAI,MAAM,GAAG,CAAC,CAAC;gBAEf,yDAAyD;gBACzD,OAAO,UAAU,CAAC,GAAG,CAAC,WAAW,CAAC,EAAE,CAAC;oBACnC,WAAW,GAAG,GAAG,GAAG,CAAC,aAAa,IAAI,GAAG,CAAC,IAAI,GAAG,MAAM,EAAE,CAAC;oBAC1D,MAAM,EAAE,CAAC;gBACX,CAAC;gBAED,SAAS,GAAG,WAAW,CAAC;YAC1B,CAAC;YAED,UAAU,CAAC,GAAG,CAAC,SAAS,EAAE;gBACxB,GAAG,GAAG;gBACN,IAAI,EAAE,SAAS;aAChB,CAAC,CAAC;QACL,CAAC;QAED,MAAM,aAAa,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QACrE,OAAO,IAAI,cAAc,CAAC,aAAa,CAAC,CAAC;IAC3C,CAAC;IAED;;;;;;;OAOG;IACH,WAAW;QACT,OAAO,IAAI,CAAC,QAAQ,CAAC;IACvB,CAAC;CACF"}
@@ -21,16 +21,28 @@ export declare class FileCommandLoader implements ICommandLoader {
21
21
  private readonly projectRoot;
22
22
  constructor(config: Config | null);
23
23
  /**
24
- * Loads all commands, applying the precedence rule where project-level
25
- * commands override user-level commands with the same name.
24
+ * Loads all commands from user, project, and extension directories.
25
+ * Returns commands in order: user project extensions (alphabetically).
26
+ *
27
+ * Order is important for conflict resolution in CommandService:
28
+ * - User/project commands (without extensionName) use "last wins" strategy
29
+ * - Extension commands (with extensionName) get renamed if conflicts exist
30
+ *
26
31
  * @param signal An AbortSignal to cancel the loading process.
27
- * @returns A promise that resolves to an array of loaded SlashCommands.
32
+ * @returns A promise that resolves to an array of all loaded SlashCommands.
28
33
  */
29
34
  loadCommands(signal: AbortSignal): Promise<SlashCommand[]>;
35
+ /**
36
+ * Get all command directories in order for loading.
37
+ * User commands → Project commands → Extension commands
38
+ * This order ensures extension commands can detect all conflicts.
39
+ */
40
+ private getCommandDirectories;
30
41
  /**
31
42
  * Parses a single .toml file and transforms it into a SlashCommand object.
32
43
  * @param filePath The absolute path to the .toml file.
33
44
  * @param baseDir The root command directory for name calculation.
45
+ * @param extensionName Optional extension name to prefix commands with.
34
46
  * @returns A promise resolving to a SlashCommand, or null if the file is invalid.
35
47
  */
36
48
  private parseAndAdaptFile;