@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
@@ -3,119 +3,115 @@
3
3
  * Copyright 2025 Google LLC
4
4
  * SPDX-License-Identifier: Apache-2.0
5
5
  */
6
- import { fileURLToPath } from 'url';
7
- import { IDEConnectionStatus } from '@vybestack/llxprt-code-core';
6
+ import { IDEConnectionStatus, getIdeDisplayName, getIdeInstaller, } from '@vybestack/llxprt-code-core';
8
7
  import { CommandKind, } from './types.js';
9
- import * as child_process from 'child_process';
10
- import * as process from 'process';
11
- import { glob } from 'glob';
12
- import * as path from 'path';
13
- const VSCODE_COMMAND = process.platform === 'win32' ? 'code.cmd' : 'code';
14
- const VSCODE_COMPANION_EXTENSION_FOLDER = 'vscode-ide-companion';
15
- function isVSCodeInstalled() {
16
- try {
17
- child_process.execSync(process.platform === 'win32'
18
- ? `where.exe ${VSCODE_COMMAND}`
19
- : `command -v ${VSCODE_COMMAND}`, { stdio: 'ignore' });
20
- return true;
21
- }
22
- catch {
23
- return false;
24
- }
25
- }
8
+ import { SettingScope } from '../../config/settings.js';
26
9
  export const ideCommand = (config) => {
27
- if (!config?.getIdeMode()) {
10
+ if (!config?.getIdeModeFeature()) {
28
11
  return null;
29
12
  }
30
- return {
13
+ const currentIDE = config.getIdeClient()?.getCurrentIde();
14
+ if (!currentIDE) {
15
+ return null;
16
+ }
17
+ const ideSlashCommand = {
31
18
  name: 'ide',
32
19
  description: 'manage IDE integration',
33
20
  kind: CommandKind.BUILT_IN,
34
- subCommands: [
35
- {
36
- name: 'status',
37
- description: 'check status of IDE integration',
38
- kind: CommandKind.BUILT_IN,
39
- action: (_context) => {
40
- const connection = config.getIdeClient()?.getConnectionStatus();
41
- switch (connection?.status) {
42
- case IDEConnectionStatus.Connected:
43
- return {
44
- type: 'message',
45
- messageType: 'info',
46
- content: `🟢 Connected`,
47
- };
48
- case IDEConnectionStatus.Connecting:
49
- return {
50
- type: 'message',
51
- messageType: 'info',
52
- content: `🟡 Connecting...`,
53
- };
54
- default: {
55
- let content = `🔴 Disconnected`;
56
- if (connection?.details) {
57
- content += `: ${connection.details}`;
58
- }
59
- return {
60
- type: 'message',
61
- messageType: 'error',
62
- content,
63
- };
64
- }
65
- }
66
- },
67
- },
68
- {
69
- name: 'install',
70
- description: 'install required VS Code companion extension',
71
- kind: CommandKind.BUILT_IN,
72
- action: async (context) => {
73
- if (!isVSCodeInstalled()) {
74
- context.ui.addItem({
75
- type: 'error',
76
- text: `VS Code command-line tool "${VSCODE_COMMAND}" not found in your PATH.`,
77
- }, Date.now());
78
- return;
79
- }
80
- const bundleDir = path.dirname(fileURLToPath(import.meta.url));
81
- // The VSIX file is copied to the bundle directory as part of the build.
82
- let vsixFiles = glob.sync(path.join(bundleDir, '*.vsix'));
83
- if (vsixFiles.length === 0) {
84
- // If the VSIX file is not in the bundle, it might be a dev
85
- // environment running with `npm start`. Look for it in the original
86
- // package location, relative to the bundle dir.
87
- const devPath = path.join(bundleDir, '..', '..', '..', '..', '..', VSCODE_COMPANION_EXTENSION_FOLDER, '*.vsix');
88
- vsixFiles = glob.sync(devPath);
89
- }
90
- if (vsixFiles.length === 0) {
91
- context.ui.addItem({
92
- type: 'error',
93
- text: 'Could not find the required VS Code companion extension. Please file a bug via /bug.',
94
- }, Date.now());
95
- return;
96
- }
97
- const vsixPath = vsixFiles[0];
98
- const command = `${VSCODE_COMMAND} --install-extension ${vsixPath} --force`;
99
- context.ui.addItem({
100
- type: 'info',
101
- text: `Installing VS Code companion extension...`,
102
- }, Date.now());
103
- try {
104
- child_process.execSync(command, { stdio: 'pipe' });
105
- context.ui.addItem({
106
- type: 'info',
107
- text: 'VS Code companion extension installed successfully. Restart llxprt in a fresh terminal window.',
108
- }, Date.now());
109
- }
110
- catch (_error) {
111
- context.ui.addItem({
112
- type: 'error',
113
- text: `Failed to install VS Code companion extension.`,
114
- }, Date.now());
21
+ subCommands: [],
22
+ };
23
+ const statusCommand = {
24
+ name: 'status',
25
+ description: 'check status of IDE integration',
26
+ kind: CommandKind.BUILT_IN,
27
+ action: (_context) => {
28
+ const connection = config.getIdeClient()?.getConnectionStatus();
29
+ switch (connection?.status) {
30
+ case IDEConnectionStatus.Connected:
31
+ return {
32
+ type: 'message',
33
+ messageType: 'info',
34
+ content: `🟢 Connected`,
35
+ };
36
+ case IDEConnectionStatus.Connecting:
37
+ return {
38
+ type: 'message',
39
+ messageType: 'info',
40
+ content: `🟡 Connecting...`,
41
+ };
42
+ default: {
43
+ let content = `🔴 Disconnected`;
44
+ if (connection?.details) {
45
+ content += `: ${connection.details}`;
115
46
  }
116
- },
117
- },
118
- ],
47
+ return {
48
+ type: 'message',
49
+ messageType: 'error',
50
+ content,
51
+ };
52
+ }
53
+ }
54
+ },
55
+ };
56
+ const installCommand = {
57
+ name: 'install',
58
+ description: `install required IDE companion ${getIdeDisplayName(currentIDE)} extension `,
59
+ kind: CommandKind.BUILT_IN,
60
+ action: async (context) => {
61
+ const installer = getIdeInstaller(currentIDE);
62
+ if (!installer) {
63
+ context.ui.addItem({
64
+ type: 'error',
65
+ text: 'No installer available for your configured IDE.',
66
+ }, Date.now());
67
+ return;
68
+ }
69
+ context.ui.addItem({
70
+ type: 'info',
71
+ text: `Installing IDE companion extension...`,
72
+ }, Date.now());
73
+ const result = await installer.install();
74
+ context.ui.addItem({
75
+ type: result.success ? 'info' : 'error',
76
+ text: result.message,
77
+ }, Date.now());
78
+ },
79
+ };
80
+ const enableCommand = {
81
+ name: 'enable',
82
+ description: 'enable IDE integration',
83
+ kind: CommandKind.BUILT_IN,
84
+ action: async (context) => {
85
+ context.services.settings.setValue(SettingScope.User, 'ideMode', true);
86
+ config.setIdeMode(true);
87
+ config.setIdeClientConnected();
88
+ },
119
89
  };
90
+ const disableCommand = {
91
+ name: 'disable',
92
+ description: 'disable IDE integration',
93
+ kind: CommandKind.BUILT_IN,
94
+ action: async (context) => {
95
+ context.services.settings.setValue(SettingScope.User, 'ideMode', false);
96
+ config.setIdeMode(false);
97
+ config.setIdeClientDisconnected();
98
+ },
99
+ };
100
+ const ideModeEnabled = config.getIdeMode();
101
+ if (ideModeEnabled) {
102
+ ideSlashCommand.subCommands = [
103
+ disableCommand,
104
+ statusCommand,
105
+ installCommand,
106
+ ];
107
+ }
108
+ else {
109
+ ideSlashCommand.subCommands = [
110
+ enableCommand,
111
+ statusCommand,
112
+ installCommand,
113
+ ];
114
+ }
115
+ return ideSlashCommand;
120
116
  };
121
117
  //# sourceMappingURL=ideCommand.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ideCommand.js","sourceRoot":"","sources":["../../../../src/ui/commands/ideCommand.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ideCommand.js","sourceRoot":"","sources":["../../../../src/ui/commands/ideCommand.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import { SlashCommand } from './types.js';
7
+ export declare const initCommand: SlashCommand;
@@ -0,0 +1,108 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import * as fs from 'fs';
7
+ import * as path from 'path';
8
+ import * as os from 'os';
9
+ import { CommandKind, } from './types.js';
10
+ import { PromptService } from '@vybestack/llxprt-code-core';
11
+ /**
12
+ * Get the init command prompt from the prompt service
13
+ */
14
+ async function getInitCommandPrompt() {
15
+ try {
16
+ const baseDir = process.env.LLXPRT_PROMPTS_DIR ||
17
+ path.join(os.homedir(), '.llxprt', 'prompts');
18
+ const promptService = new PromptService({
19
+ baseDir,
20
+ debugMode: process.env.DEBUG === 'true',
21
+ });
22
+ await promptService.initialize();
23
+ try {
24
+ return await promptService.loadPrompt('commands/init-command.md');
25
+ }
26
+ catch (error) {
27
+ console.warn('Failed to load init command prompt from file, using fallback:', error);
28
+ }
29
+ }
30
+ catch (error) {
31
+ console.warn('Failed to initialize prompt service, using fallback:', error);
32
+ }
33
+ // Fallback to hardcoded prompt
34
+ return getFallbackInitCommandPrompt();
35
+ }
36
+ /**
37
+ * Fallback prompt if the prompt service is not available
38
+ */
39
+ function getFallbackInitCommandPrompt() {
40
+ return `You are an AI agent that brings the power of multiple LLM providers directly into the terminal. Your task is to analyze the current directory and generate a comprehensive LLXPRT.md file to be used as instructional context for future interactions.
41
+
42
+ **Analysis Process:**
43
+
44
+ 1. **Initial Exploration:**
45
+ * Start by listing the files and directories to get a high-level overview of the structure.
46
+ * Read the README file (e.g., \`README.md\`, \`README.txt\`) if it exists. This is often the best place to start.
47
+
48
+ 2. **Iterative Deep Dive (up to 10 files):**
49
+ * Based on your initial findings, select a few files that seem most important (e.g., configuration files, main source files, documentation).
50
+ * Read them. As you learn more, refine your understanding and decide which files to read next. You don't need to decide all 10 files at once. Let your discoveries guide your exploration.
51
+
52
+ 3. **Identify Project Type:**
53
+ * **Code Project:** Look for clues like \`package.json\`, \`requirements.txt\`, \`pom.xml\`, \`go.mod\`, \`Cargo.toml\`, \`build.gradle\`, or a \`src\` directory. If you find them, this is likely a software project.
54
+ * **Non-Code Project:** If you don't find code-related files, this might be a directory for documentation, research papers, notes, or something else.
55
+
56
+ **LLXPRT.md Content Generation:**
57
+
58
+ **For a Code Project:**
59
+
60
+ * **Project Overview:** Write a clear and concise summary of the project's purpose, main technologies, and architecture.
61
+ * **Building and Running:** Document the key commands for building, running, and testing the project. Infer these from the files you've read (e.g., \`scripts\` in \`package.json\`, \`Makefile\`, etc.). If you can't find explicit commands, provide a placeholder with a TODO.
62
+ * **Development Conventions:** Describe any coding styles, testing practices, or contribution guidelines you can infer from the codebase.
63
+
64
+ **For a Non-Code Project:**
65
+
66
+ * **Directory Overview:** Describe the purpose and contents of the directory. What is it for? What kind of information does it hold?
67
+ * **Key Files:** List the most important files and briefly explain what they contain.
68
+ * **Usage:** Explain how the contents of this directory are intended to be used.
69
+
70
+ **Final Output:**
71
+
72
+ Write the complete content to the \`LLXPRT.md\` file. The output must be well-formatted Markdown.`;
73
+ }
74
+ export const initCommand = {
75
+ name: 'init',
76
+ description: 'Analyzes the project and creates a tailored LLXPRT.md file.',
77
+ kind: CommandKind.BUILT_IN,
78
+ action: async (context, _args) => {
79
+ if (!context.services.config) {
80
+ return {
81
+ type: 'message',
82
+ messageType: 'error',
83
+ content: 'Configuration not available.',
84
+ };
85
+ }
86
+ const targetDir = context.services.config.getTargetDir();
87
+ const llxprtMdPath = path.join(targetDir, 'LLXPRT.md');
88
+ if (fs.existsSync(llxprtMdPath)) {
89
+ return {
90
+ type: 'message',
91
+ messageType: 'info',
92
+ content: 'A LLXPRT.md file already exists in this directory. No changes were made.',
93
+ };
94
+ }
95
+ // Create an empty LLXPRT.md file
96
+ fs.writeFileSync(llxprtMdPath, '', 'utf8');
97
+ context.ui.addItem({
98
+ type: 'info',
99
+ text: 'Empty LLXPRT.md created. Now analyzing the project to populate it.',
100
+ }, Date.now());
101
+ const initPrompt = await getInitCommandPrompt();
102
+ return {
103
+ type: 'submit_prompt',
104
+ content: initPrompt,
105
+ };
106
+ },
107
+ };
108
+ //# sourceMappingURL=initCommand.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"initCommand.js","sourceRoot":"","sources":["../../../../src/ui/commands/initCommand.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,EAIL,WAAW,GACZ,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAE5D;;GAEG;AACH,KAAK,UAAU,oBAAoB;IACjC,IAAI,CAAC;QACH,MAAM,OAAO,GACX,OAAO,CAAC,GAAG,CAAC,kBAAkB;YAC9B,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;QAChD,MAAM,aAAa,GAAG,IAAI,aAAa,CAAC;YACtC,OAAO;YACP,SAAS,EAAE,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,MAAM;SACxC,CAAC,CAAC;QACH,MAAM,aAAa,CAAC,UAAU,EAAE,CAAC;QAEjC,IAAI,CAAC;YACH,OAAO,MAAM,aAAa,CAAC,UAAU,CAAC,0BAA0B,CAAC,CAAC;QACpE,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,IAAI,CACV,+DAA+D,EAC/D,KAAK,CACN,CAAC;QACJ,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,IAAI,CAAC,sDAAsD,EAAE,KAAK,CAAC,CAAC;IAC9E,CAAC;IAED,+BAA+B;IAC/B,OAAO,4BAA4B,EAAE,CAAC;AACxC,CAAC;AAED;;GAEG;AACH,SAAS,4BAA4B;IACnC,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kGAgCyF,CAAC;AACnG,CAAC;AAED,MAAM,CAAC,MAAM,WAAW,GAAiB;IACvC,IAAI,EAAE,MAAM;IACZ,WAAW,EAAE,6DAA6D;IAC1E,IAAI,EAAE,WAAW,CAAC,QAAQ;IAC1B,MAAM,EAAE,KAAK,EACX,OAAuB,EACvB,KAAa,EACsB,EAAE;QACrC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC;YAC7B,OAAO;gBACL,IAAI,EAAE,SAAS;gBACf,WAAW,EAAE,OAAO;gBACpB,OAAO,EAAE,8BAA8B;aACxC,CAAC;QACJ,CAAC;QACD,MAAM,SAAS,GAAG,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,YAAY,EAAE,CAAC;QACzD,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;QAEvD,IAAI,EAAE,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;YAChC,OAAO;gBACL,IAAI,EAAE,SAAS;gBACf,WAAW,EAAE,MAAM;gBACnB,OAAO,EACL,0EAA0E;aAC7E,CAAC;QACJ,CAAC;QAED,iCAAiC;QACjC,EAAE,CAAC,aAAa,CAAC,YAAY,EAAE,EAAE,EAAE,MAAM,CAAC,CAAC;QAE3C,OAAO,CAAC,EAAE,CAAC,OAAO,CAChB;YACE,IAAI,EAAE,MAAM;YACZ,IAAI,EAAE,oEAAoE;SAC3E,EACD,IAAI,CAAC,GAAG,EAAE,CACX,CAAC;QAEF,MAAM,UAAU,GAAG,MAAM,oBAAoB,EAAE,CAAC;QAEhD,OAAO;YACL,IAAI,EAAE,eAAe;YACrB,OAAO,EAAE,UAAU;SACpB,CAAC;IACJ,CAAC;CACF,CAAC"}
@@ -4,28 +4,92 @@
4
4
  * SPDX-License-Identifier: Apache-2.0
5
5
  */
6
6
  import { CommandKind, } from './types.js';
7
- import { getProviderManager } from '../../providers/providerManagerInstance.js';
8
- import { setProviderApiKey } from '../../providers/providerConfigUtils.js';
7
+ import { AuthType } from '@vybestack/llxprt-code-core';
9
8
  export const keyCommand = {
10
9
  name: 'key',
11
10
  description: 'set or remove API key for the current provider',
12
11
  kind: CommandKind.BUILT_IN,
13
12
  action: async (context, args) => {
14
- const providerManager = getProviderManager();
13
+ const config = context.services.config;
14
+ if (!config) {
15
+ return {
16
+ type: 'message',
17
+ messageType: 'error',
18
+ content: 'No configuration available',
19
+ };
20
+ }
21
+ const providerManager = config.getProviderManager();
22
+ if (!providerManager) {
23
+ return {
24
+ type: 'message',
25
+ messageType: 'error',
26
+ content: 'No provider manager available',
27
+ };
28
+ }
29
+ const activeProvider = providerManager.getActiveProvider();
30
+ const providerName = activeProvider.name;
15
31
  const apiKey = args?.trim();
16
- const result = await setProviderApiKey(providerManager, context.services.settings, apiKey, context.services.config ?? undefined);
17
- // Trigger payment mode check if available and successful
18
- if (result.success) {
32
+ // If no key provided or 'none', remove the key
33
+ if (!apiKey || apiKey.toLowerCase() === 'none') {
34
+ // Clear the API key
35
+ if (activeProvider.setApiKey) {
36
+ activeProvider.setApiKey('');
37
+ config.setEphemeralSetting('auth-key', undefined);
38
+ // If this is the Gemini provider, we might need to switch auth mode
39
+ const requiresAuthRefresh = providerName === 'gemini';
40
+ if (requiresAuthRefresh) {
41
+ await config.refreshAuth(AuthType.LOGIN_WITH_GOOGLE);
42
+ }
43
+ const isPaidMode = activeProvider.isPaidMode?.() ?? true;
44
+ const paymentMessage = !isPaidMode && providerName === 'gemini'
45
+ ? '\n✅ You are now in FREE MODE - using OAuth authentication'
46
+ : '';
47
+ return {
48
+ type: 'message',
49
+ messageType: 'info',
50
+ content: `API key removed for provider '${providerName}'${paymentMessage}`,
51
+ };
52
+ }
53
+ else {
54
+ return {
55
+ type: 'message',
56
+ messageType: 'error',
57
+ content: `Provider '${providerName}' does not support API key updates`,
58
+ };
59
+ }
60
+ }
61
+ // Set the API key
62
+ if (activeProvider.setApiKey) {
63
+ activeProvider.setApiKey(apiKey);
64
+ config.setEphemeralSetting('auth-key', apiKey);
65
+ // If this is the Gemini provider, we need to refresh auth to use API key mode
66
+ const requiresAuthRefresh = providerName === 'gemini';
67
+ if (requiresAuthRefresh) {
68
+ await config.refreshAuth(AuthType.USE_GEMINI);
69
+ }
70
+ // Check if we're now in paid mode
71
+ const isPaidMode = activeProvider.isPaidMode?.() ?? true;
72
+ const paymentWarning = isPaidMode
73
+ ? '\n⚠️ You are now in PAID MODE - API usage will be charged to your account'
74
+ : '';
75
+ // Trigger payment mode check if available
19
76
  const extendedContext = context;
20
77
  if (extendedContext.checkPaymentModeChange) {
21
78
  setTimeout(extendedContext.checkPaymentModeChange, 100);
22
79
  }
80
+ return {
81
+ type: 'message',
82
+ messageType: 'info',
83
+ content: `API key updated for provider '${providerName}'${paymentWarning}`,
84
+ };
85
+ }
86
+ else {
87
+ return {
88
+ type: 'message',
89
+ messageType: 'error',
90
+ content: `Provider '${providerName}' does not support API key updates`,
91
+ };
23
92
  }
24
- return {
25
- type: 'message',
26
- messageType: result.success ? 'info' : 'error',
27
- content: result.message,
28
- };
29
93
  },
30
94
  };
31
95
  //# sourceMappingURL=keyCommand.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"keyCommand.js","sourceRoot":"","sources":["../../../../src/ui/commands/keyCommand.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAIL,WAAW,GACZ,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,kBAAkB,EAAE,MAAM,4CAA4C,CAAC;AAChF,OAAO,EAAE,iBAAiB,EAAE,MAAM,wCAAwC,CAAC;AAE3E,MAAM,CAAC,MAAM,UAAU,GAAiB;IACtC,IAAI,EAAE,KAAK;IACX,WAAW,EAAE,gDAAgD;IAC7D,IAAI,EAAE,WAAW,CAAC,QAAQ;IAC1B,MAAM,EAAE,KAAK,EACX,OAAuB,EACvB,IAAY,EACkB,EAAE;QAChC,MAAM,eAAe,GAAG,kBAAkB,EAAE,CAAC;QAC7C,MAAM,MAAM,GAAG,IAAI,EAAE,IAAI,EAAE,CAAC;QAE5B,MAAM,MAAM,GAAG,MAAM,iBAAiB,CACpC,eAAe,EACf,OAAO,CAAC,QAAQ,CAAC,QAAQ,EACzB,MAAM,EACN,OAAO,CAAC,QAAQ,CAAC,MAAM,IAAI,SAAS,CACrC,CAAC;QAEF,yDAAyD;QACzD,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;YACnB,MAAM,eAAe,GAAG,OAEvB,CAAC;YACF,IAAI,eAAe,CAAC,sBAAsB,EAAE,CAAC;gBAC3C,UAAU,CAAC,eAAe,CAAC,sBAAsB,EAAE,GAAG,CAAC,CAAC;YAC1D,CAAC;QACH,CAAC;QAED,OAAO;YACL,IAAI,EAAE,SAAS;YACf,WAAW,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO;YAC9C,OAAO,EAAE,MAAM,CAAC,OAAO;SACxB,CAAC;IACJ,CAAC;CACF,CAAC"}
1
+ {"version":3,"file":"keyCommand.js","sourceRoot":"","sources":["../../../../src/ui/commands/keyCommand.ts"],"names":[],"mappings":"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"}
@@ -5,7 +5,6 @@
5
5
  */
6
6
  import { CommandKind, } from './types.js';
7
7
  import { getProviderManager } from '../../providers/providerManagerInstance.js';
8
- import { setProviderApiKeyFromFile } from '../../providers/providerConfigUtils.js';
9
8
  import { promises as fs } from 'fs';
10
9
  import path from 'path';
11
10
  import { homedir } from 'os';
@@ -79,20 +78,62 @@ export const keyfileCommand = {
79
78
  };
80
79
  }
81
80
  }
82
- // Set new keyfile path
83
- const result = await setProviderApiKeyFromFile(providerManager, context.services.settings, filePath, context.services.config ?? undefined);
84
- // Trigger payment mode check if available and successful
85
- if (result.success) {
86
- const extendedContext = context;
87
- if (extendedContext.checkPaymentModeChange) {
88
- setTimeout(extendedContext.checkPaymentModeChange, 100);
81
+ // Verify keyfile exists and read the key
82
+ try {
83
+ const resolvedPath = filePath.replace(/^~/, homedir());
84
+ // Check if file exists
85
+ await fs.access(resolvedPath);
86
+ // Read the key to set it on the provider
87
+ const apiKey = (await fs.readFile(resolvedPath, 'utf-8')).trim();
88
+ if (!apiKey) {
89
+ return {
90
+ type: 'message',
91
+ messageType: 'error',
92
+ content: 'The specified file is empty',
93
+ };
94
+ }
95
+ // Set API key on provider
96
+ const activeProvider = providerManager.getActiveProvider();
97
+ const providerName = activeProvider.name;
98
+ if (activeProvider.setApiKey) {
99
+ activeProvider.setApiKey(apiKey);
100
+ // Store the keyfile PATH in ephemeral settings, not the key itself
101
+ if (context.services.config) {
102
+ context.services.config.setEphemeralSetting('auth-keyfile', filePath);
103
+ // Remove any stored auth-key since we're using keyfile
104
+ context.services.config.setEphemeralSetting('auth-key', undefined);
105
+ }
106
+ // Check if we're now in paid mode
107
+ const isPaidMode = activeProvider.isPaidMode?.() ?? true;
108
+ const paymentWarning = isPaidMode
109
+ ? '\n⚠️ You are now in PAID MODE - API usage will be charged to your account'
110
+ : '';
111
+ // Trigger payment mode check if available
112
+ const extendedContext = context;
113
+ if (extendedContext.checkPaymentModeChange) {
114
+ setTimeout(extendedContext.checkPaymentModeChange, 100);
115
+ }
116
+ return {
117
+ type: 'message',
118
+ messageType: 'info',
119
+ content: `API key loaded from ${resolvedPath} for provider '${providerName}'${paymentWarning}`,
120
+ };
121
+ }
122
+ else {
123
+ return {
124
+ type: 'message',
125
+ messageType: 'error',
126
+ content: `Provider '${providerName}' does not support API key updates`,
127
+ };
89
128
  }
90
129
  }
91
- return {
92
- type: 'message',
93
- messageType: result.success ? 'info' : 'error',
94
- content: result.message,
95
- };
130
+ catch (error) {
131
+ return {
132
+ type: 'message',
133
+ messageType: 'error',
134
+ content: `Failed to load keyfile: ${error instanceof Error ? error.message : String(error)}`,
135
+ };
136
+ }
96
137
  }
97
138
  catch (error) {
98
139
  return {
@@ -1 +1 @@
1
- {"version":3,"file":"keyfileCommand.js","sourceRoot":"","sources":["../../../../src/ui/commands/keyfileCommand.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"keyfileCommand.js","sourceRoot":"","sources":["../../../../src/ui/commands/keyfileCommand.ts"],"names":[],"mappings":"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"}