@vybestack/llxprt-code 0.1.12 → 0.1.13-hotfix1

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 (248) hide show
  1. package/dist/index.js +0 -0
  2. package/dist/package.json +5 -5
  3. package/dist/src/acp/acp.d.ts +208 -0
  4. package/dist/src/acp/acp.js +193 -0
  5. package/dist/src/acp/acp.js.map +1 -0
  6. package/dist/src/acp/acpPeer.d.ts +8 -0
  7. package/dist/src/acp/acpPeer.js +537 -0
  8. package/dist/src/acp/acpPeer.js.map +1 -0
  9. package/dist/src/config/config.d.ts +2 -0
  10. package/dist/src/config/config.js +73 -19
  11. package/dist/src/config/config.js.map +1 -1
  12. package/dist/src/config/extension.d.ts +2 -2
  13. package/dist/src/config/extension.js +21 -16
  14. package/dist/src/config/extension.js.map +1 -1
  15. package/dist/src/config/settings.d.ts +7 -0
  16. package/dist/src/config/settings.js +15 -0
  17. package/dist/src/config/settings.js.map +1 -1
  18. package/dist/src/gemini.js +33 -34
  19. package/dist/src/gemini.js.map +1 -1
  20. package/dist/src/generated/git-commit.d.ts +1 -1
  21. package/dist/src/generated/git-commit.js +1 -1
  22. package/dist/src/nonInteractiveCli.js +36 -3
  23. package/dist/src/nonInteractiveCli.js.map +1 -1
  24. package/dist/src/providers/index.d.ts +1 -7
  25. package/dist/src/providers/index.js +2 -10
  26. package/dist/src/providers/index.js.map +1 -1
  27. package/dist/src/providers/providerConfigUtils.d.ts +1 -2
  28. package/dist/src/providers/providerConfigUtils.js +1 -1
  29. package/dist/src/providers/providerConfigUtils.js.map +1 -1
  30. package/dist/src/providers/providerManagerInstance.d.ts +2 -2
  31. package/dist/src/providers/providerManagerInstance.js +21 -19
  32. package/dist/src/providers/providerManagerInstance.js.map +1 -1
  33. package/dist/src/providers/types.d.ts +1 -9
  34. package/dist/src/providers/types.js +2 -10
  35. package/dist/src/providers/types.js.map +1 -1
  36. package/dist/src/services/CommandService.d.ts +3 -1
  37. package/dist/src/services/CommandService.js +50 -11
  38. package/dist/src/services/CommandService.js.map +1 -1
  39. package/dist/src/ui/App.js +24 -25
  40. package/dist/src/ui/App.js.map +1 -1
  41. package/dist/src/ui/commands/aboutCommand.js +21 -0
  42. package/dist/src/ui/commands/aboutCommand.js.map +1 -1
  43. package/dist/src/ui/commands/baseurlCommand.d.ts +7 -0
  44. package/dist/src/ui/commands/baseurlCommand.js +22 -0
  45. package/dist/src/ui/commands/baseurlCommand.js.map +1 -0
  46. package/dist/src/ui/commands/bugCommand.d.ts +7 -0
  47. package/dist/src/ui/commands/bugCommand.js +61 -0
  48. package/dist/src/ui/commands/bugCommand.js.map +1 -0
  49. package/dist/src/ui/commands/chatCommand.d.ts +7 -0
  50. package/dist/src/ui/commands/chatCommand.js +170 -0
  51. package/dist/src/ui/commands/chatCommand.js.map +1 -0
  52. package/dist/src/ui/commands/clearCommand.js +12 -2
  53. package/dist/src/ui/commands/clearCommand.js.map +1 -1
  54. package/dist/src/ui/commands/compressCommand.d.ts +7 -0
  55. package/dist/src/ui/commands/compressCommand.js +62 -0
  56. package/dist/src/ui/commands/compressCommand.js.map +1 -0
  57. package/dist/src/ui/commands/docsCommand.d.ts +7 -0
  58. package/dist/src/ui/commands/docsCommand.js +29 -0
  59. package/dist/src/ui/commands/docsCommand.js.map +1 -0
  60. package/dist/src/ui/commands/editorCommand.d.ts +7 -0
  61. package/dist/src/ui/commands/editorCommand.js +14 -0
  62. package/dist/src/ui/commands/editorCommand.js.map +1 -0
  63. package/dist/src/ui/commands/extensionsCommand.d.ts +7 -0
  64. package/dist/src/ui/commands/extensionsCommand.js +29 -0
  65. package/dist/src/ui/commands/extensionsCommand.js.map +1 -0
  66. package/dist/src/ui/commands/ideCommand.d.ts +8 -0
  67. package/dist/src/ui/commands/ideCommand.js +123 -0
  68. package/dist/src/ui/commands/ideCommand.js.map +1 -0
  69. package/dist/src/{providers/ProviderAwareContentGenerator.d.ts → ui/commands/keyCommand.d.ts} +2 -1
  70. package/dist/src/ui/commands/keyCommand.js +29 -0
  71. package/dist/src/ui/commands/keyCommand.js.map +1 -0
  72. package/dist/src/ui/commands/keyfileCommand.d.ts +7 -0
  73. package/dist/src/ui/commands/keyfileCommand.js +104 -0
  74. package/dist/src/ui/commands/keyfileCommand.js.map +1 -0
  75. package/dist/src/ui/commands/mcpCommand.d.ts +7 -0
  76. package/dist/src/ui/commands/mcpCommand.js +204 -0
  77. package/dist/src/ui/commands/mcpCommand.js.map +1 -0
  78. package/dist/src/ui/commands/modelCommand.d.ts +7 -0
  79. package/dist/src/ui/commands/modelCommand.js +60 -0
  80. package/dist/src/ui/commands/modelCommand.js.map +1 -0
  81. package/dist/src/ui/commands/providerCommand.d.ts +7 -0
  82. package/dist/src/ui/commands/providerCommand.js +86 -0
  83. package/dist/src/ui/commands/providerCommand.js.map +1 -0
  84. package/dist/src/ui/commands/quitCommand.d.ts +7 -0
  85. package/dist/src/ui/commands/quitCommand.js +32 -0
  86. package/dist/src/ui/commands/quitCommand.js.map +1 -0
  87. package/dist/src/ui/commands/restoreCommand.d.ts +8 -0
  88. package/dist/src/ui/commands/restoreCommand.js +126 -0
  89. package/dist/src/ui/commands/restoreCommand.js.map +1 -0
  90. package/dist/src/ui/commands/statsCommand.d.ts +7 -0
  91. package/dist/src/ui/commands/statsCommand.js +50 -0
  92. package/dist/src/ui/commands/statsCommand.js.map +1 -0
  93. package/dist/src/ui/commands/toolsCommand.d.ts +7 -0
  94. package/dist/src/ui/commands/toolsCommand.js +54 -0
  95. package/dist/src/ui/commands/toolsCommand.js.map +1 -0
  96. package/dist/src/ui/commands/types.d.ts +34 -2
  97. package/dist/src/ui/components/ContextSummaryDisplay.d.ts +6 -1
  98. package/dist/src/ui/components/ContextSummaryDisplay.js +46 -19
  99. package/dist/src/ui/components/ContextSummaryDisplay.js.map +1 -1
  100. package/dist/src/ui/components/Footer.d.ts +0 -1
  101. package/dist/src/ui/components/Footer.js +3 -21
  102. package/dist/src/ui/components/Footer.js.map +1 -1
  103. package/dist/src/ui/components/InputPrompt.js +110 -61
  104. package/dist/src/ui/components/InputPrompt.js.map +1 -1
  105. package/dist/src/ui/components/ProviderModelDialog.d.ts +1 -1
  106. package/dist/src/ui/components/ThemeDialog.js +25 -24
  107. package/dist/src/ui/components/ThemeDialog.js.map +1 -1
  108. package/dist/src/ui/components/messages/ToolGroupMessage.js +3 -1
  109. package/dist/src/ui/components/messages/ToolGroupMessage.js.map +1 -1
  110. package/dist/src/ui/components/shared/MaxSizedBox.js +69 -2
  111. package/dist/src/ui/components/shared/MaxSizedBox.js.map +1 -1
  112. package/dist/src/ui/components/shared/RadioButtonSelect.d.ts +3 -1
  113. package/dist/src/ui/components/shared/RadioButtonSelect.js +60 -10
  114. package/dist/src/ui/components/shared/RadioButtonSelect.js.map +1 -1
  115. package/dist/src/ui/components/shared/text-buffer.js +1 -1
  116. package/dist/src/ui/components/shared/text-buffer.js.map +1 -1
  117. package/dist/src/ui/constants.d.ts +1 -0
  118. package/dist/src/ui/constants.js +1 -0
  119. package/dist/src/ui/constants.js.map +1 -1
  120. package/dist/src/ui/containers/SessionController.js +1 -1
  121. package/dist/src/ui/containers/SessionController.js.map +1 -1
  122. package/dist/src/ui/contexts/OpenAIProviderContext.d.ts +1 -2
  123. package/dist/src/ui/contexts/OpenAIProviderContext.js.map +1 -1
  124. package/dist/src/ui/hooks/shellCommandProcessor.d.ts +1 -1
  125. package/dist/src/ui/hooks/shellCommandProcessor.js +35 -11
  126. package/dist/src/ui/hooks/shellCommandProcessor.js.map +1 -1
  127. package/dist/src/ui/hooks/slashCommandProcessor.d.ts +2 -9
  128. package/dist/src/ui/hooks/slashCommandProcessor.js +83 -622
  129. package/dist/src/ui/hooks/slashCommandProcessor.js.map +1 -1
  130. package/dist/src/ui/hooks/useAuthCommand.js +16 -2
  131. package/dist/src/ui/hooks/useAuthCommand.js.map +1 -1
  132. package/dist/src/ui/hooks/useCompletion.d.ts +1 -0
  133. package/dist/src/ui/hooks/useCompletion.js +21 -2
  134. package/dist/src/ui/hooks/useCompletion.js.map +1 -1
  135. package/dist/src/ui/hooks/useFocus.d.ts +6 -0
  136. package/dist/src/ui/hooks/useFocus.js +41 -0
  137. package/dist/src/ui/hooks/useFocus.js.map +1 -0
  138. package/dist/src/ui/hooks/useGeminiStream.js +34 -2
  139. package/dist/src/ui/hooks/useGeminiStream.js.map +1 -1
  140. package/dist/src/ui/hooks/useOpenAIProviderInfo.d.ts +3 -2
  141. package/dist/src/ui/hooks/useOpenAIProviderInfo.js +5 -4
  142. package/dist/src/ui/hooks/useOpenAIProviderInfo.js.map +1 -1
  143. package/dist/src/ui/hooks/usePrivacySettings.js +5 -5
  144. package/dist/src/ui/hooks/usePrivacySettings.js.map +1 -1
  145. package/dist/src/ui/hooks/useProviderDialog.d.ts +5 -2
  146. package/dist/src/ui/hooks/useProviderDialog.js +55 -3
  147. package/dist/src/ui/hooks/useProviderDialog.js.map +1 -1
  148. package/dist/src/ui/hooks/useProviderModelDialog.d.ts +1 -1
  149. package/dist/src/ui/themes/ansi-light.js +1 -1
  150. package/dist/src/ui/themes/ansi-light.js.map +1 -1
  151. package/dist/src/ui/themes/googlecode.js +1 -1
  152. package/dist/src/ui/themes/googlecode.js.map +1 -1
  153. package/dist/src/ui/themes/xcode.js +1 -1
  154. package/dist/src/ui/themes/xcode.js.map +1 -1
  155. package/dist/src/ui/types.d.ts +10 -0
  156. package/dist/src/ui/types.js.map +1 -1
  157. package/dist/src/ui/utils/updateCheck.js +10 -6
  158. package/dist/src/ui/utils/updateCheck.js.map +1 -1
  159. package/dist/src/utils/userStartupWarnings.js +1 -16
  160. package/dist/src/utils/userStartupWarnings.js.map +1 -1
  161. package/dist/tsconfig.tsbuildinfo +1 -1
  162. package/package.json +5 -5
  163. package/LICENSE +0 -202
  164. package/README.md +0 -256
  165. package/dist/src/providers/IMessage.d.ts +0 -38
  166. package/dist/src/providers/IMessage.js +0 -17
  167. package/dist/src/providers/IMessage.js.map +0 -1
  168. package/dist/src/providers/IModel.d.ts +0 -23
  169. package/dist/src/providers/IModel.js +0 -17
  170. package/dist/src/providers/IModel.js.map +0 -1
  171. package/dist/src/providers/IProvider.d.ts +0 -32
  172. package/dist/src/providers/IProvider.js +0 -17
  173. package/dist/src/providers/IProvider.js.map +0 -1
  174. package/dist/src/providers/ITool.d.ts +0 -23
  175. package/dist/src/providers/ITool.js +0 -17
  176. package/dist/src/providers/ITool.js.map +0 -1
  177. package/dist/src/providers/ProviderAwareContentGenerator.js +0 -9
  178. package/dist/src/providers/ProviderAwareContentGenerator.js.map +0 -1
  179. package/dist/src/providers/ProviderManager.d.ts +0 -19
  180. package/dist/src/providers/ProviderManager.js +0 -63
  181. package/dist/src/providers/ProviderManager.js.map +0 -1
  182. package/dist/src/providers/ProviderManagerAdapter.d.ts +0 -17
  183. package/dist/src/providers/ProviderManagerAdapter.js +0 -113
  184. package/dist/src/providers/ProviderManagerAdapter.js.map +0 -1
  185. package/dist/src/providers/README-qwen3.md +0 -60
  186. package/dist/src/providers/adapters/IStreamAdapter.d.ts +0 -18
  187. package/dist/src/providers/adapters/IStreamAdapter.js +0 -7
  188. package/dist/src/providers/adapters/IStreamAdapter.js.map +0 -1
  189. package/dist/src/providers/anthropic/AnthropicProvider.d.ts +0 -46
  190. package/dist/src/providers/anthropic/AnthropicProvider.js +0 -478
  191. package/dist/src/providers/anthropic/AnthropicProvider.js.map +0 -1
  192. package/dist/src/providers/contentGeneratorProvider.d.ts +0 -13
  193. package/dist/src/providers/contentGeneratorProvider.js +0 -17
  194. package/dist/src/providers/contentGeneratorProvider.js.map +0 -1
  195. package/dist/src/providers/gemini/GeminiProvider.d.ts +0 -72
  196. package/dist/src/providers/gemini/GeminiProvider.js +0 -454
  197. package/dist/src/providers/gemini/GeminiProvider.js.map +0 -1
  198. package/dist/src/providers/integration/TEST_INSTRUCTIONS.md +0 -197
  199. package/dist/src/providers/openai/ConversationCache.d.ts +0 -20
  200. package/dist/src/providers/openai/ConversationCache.js +0 -109
  201. package/dist/src/providers/openai/ConversationCache.js.map +0 -1
  202. package/dist/src/providers/openai/IChatGenerateParams.d.ts +0 -11
  203. package/dist/src/providers/openai/IChatGenerateParams.js +0 -2
  204. package/dist/src/providers/openai/IChatGenerateParams.js.map +0 -1
  205. package/dist/src/providers/openai/OpenAIProvider.d.ts +0 -71
  206. package/dist/src/providers/openai/OpenAIProvider.js +0 -486
  207. package/dist/src/providers/openai/OpenAIProvider.js.map +0 -1
  208. package/dist/src/providers/openai/Qwen3FireworksProvider.d.ts +0 -39
  209. package/dist/src/providers/openai/Qwen3FireworksProvider.js +0 -209
  210. package/dist/src/providers/openai/Qwen3FireworksProvider.js.map +0 -1
  211. package/dist/src/providers/openai/RESPONSES_API_MODELS.d.ts +0 -2
  212. package/dist/src/providers/openai/RESPONSES_API_MODELS.js +0 -14
  213. package/dist/src/providers/openai/RESPONSES_API_MODELS.js.map +0 -1
  214. package/dist/src/providers/openai/buildResponsesRequest.d.ts +0 -67
  215. package/dist/src/providers/openai/buildResponsesRequest.js +0 -144
  216. package/dist/src/providers/openai/buildResponsesRequest.js.map +0 -1
  217. package/dist/src/providers/openai/docs/accessing-provider-info.md +0 -172
  218. package/dist/src/providers/openai/docs/params-mapping.md +0 -91
  219. package/dist/src/providers/openai/docs/qwen3-fireworks.md +0 -47
  220. package/dist/src/providers/openai/docs/responses-api-tool-calls.md +0 -96
  221. package/dist/src/providers/openai/estimateRemoteTokens.d.ts +0 -26
  222. package/dist/src/providers/openai/estimateRemoteTokens.js +0 -75
  223. package/dist/src/providers/openai/estimateRemoteTokens.js.map +0 -1
  224. package/dist/src/providers/openai/getOpenAIProviderInfo.d.ts +0 -46
  225. package/dist/src/providers/openai/getOpenAIProviderInfo.js +0 -74
  226. package/dist/src/providers/openai/getOpenAIProviderInfo.js.map +0 -1
  227. package/dist/src/providers/openai/parseResponsesStream.d.ts +0 -3
  228. package/dist/src/providers/openai/parseResponsesStream.js +0 -444
  229. package/dist/src/providers/openai/parseResponsesStream.js.map +0 -1
  230. package/dist/src/providers/parsers/TextToolCallParser.d.ts +0 -35
  231. package/dist/src/providers/parsers/TextToolCallParser.js +0 -248
  232. package/dist/src/providers/parsers/TextToolCallParser.js.map +0 -1
  233. package/dist/src/providers/tokenizers/AnthropicTokenizer.d.ts +0 -19
  234. package/dist/src/providers/tokenizers/AnthropicTokenizer.js +0 -37
  235. package/dist/src/providers/tokenizers/AnthropicTokenizer.js.map +0 -1
  236. package/dist/src/providers/tokenizers/ITokenizer.d.ts +0 -18
  237. package/dist/src/providers/tokenizers/ITokenizer.js +0 -17
  238. package/dist/src/providers/tokenizers/ITokenizer.js.map +0 -1
  239. package/dist/src/providers/tokenizers/OpenAITokenizer.d.ts +0 -24
  240. package/dist/src/providers/tokenizers/OpenAITokenizer.js +0 -56
  241. package/dist/src/providers/tokenizers/OpenAITokenizer.js.map +0 -1
  242. package/dist/src/tools/IToolFormatter.d.ts +0 -40
  243. package/dist/src/tools/IToolFormatter.js +0 -17
  244. package/dist/src/tools/IToolFormatter.js.map +0 -1
  245. package/dist/src/tools/ToolFormatter.d.ts +0 -45
  246. package/dist/src/tools/ToolFormatter.js +0 -216
  247. package/dist/src/tools/ToolFormatter.js.map +0 -1
  248. package/dist/vybestack-llxprt-code-0.1.12.tgz +0 -0
@@ -0,0 +1,204 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import { DiscoveredMCPTool, getMCPDiscoveryState, getMCPServerStatus, MCPDiscoveryState, MCPServerStatus, } from '@vybestack/llxprt-code-core';
7
+ import open from 'open';
8
+ const COLOR_GREEN = '\u001b[32m';
9
+ const COLOR_YELLOW = '\u001b[33m';
10
+ const COLOR_CYAN = '\u001b[36m';
11
+ const RESET_COLOR = '\u001b[0m';
12
+ const getMcpStatus = async (context, showDescriptions, showSchema, showTips = false) => {
13
+ const { config } = context.services;
14
+ if (!config) {
15
+ return {
16
+ type: 'message',
17
+ messageType: 'error',
18
+ content: 'Config not loaded.',
19
+ };
20
+ }
21
+ const toolRegistry = await config.getToolRegistry();
22
+ if (!toolRegistry) {
23
+ return {
24
+ type: 'message',
25
+ messageType: 'error',
26
+ content: 'Could not retrieve tool registry.',
27
+ };
28
+ }
29
+ const mcpServers = config.getMcpServers() || {};
30
+ const serverNames = Object.keys(mcpServers);
31
+ const blockedMcpServers = config.getBlockedMcpServers() || [];
32
+ if (serverNames.length === 0 && blockedMcpServers.length === 0) {
33
+ const docsUrl = 'https://goo.gle/gemini-cli-docs-mcp';
34
+ if (process.env.SANDBOX && process.env.SANDBOX !== 'sandbox-exec') {
35
+ return {
36
+ type: 'message',
37
+ messageType: 'info',
38
+ content: `No MCP servers configured. Please open the following URL in your browser to view documentation:\n${docsUrl}`,
39
+ };
40
+ }
41
+ else {
42
+ // Open the URL in the browser
43
+ await open(docsUrl);
44
+ return {
45
+ type: 'message',
46
+ messageType: 'info',
47
+ content: `No MCP servers configured. Opening documentation in your browser: ${docsUrl}`,
48
+ };
49
+ }
50
+ }
51
+ // Check if any servers are still connecting
52
+ const connectingServers = serverNames.filter((name) => getMCPServerStatus(name) === MCPServerStatus.CONNECTING);
53
+ const discoveryState = getMCPDiscoveryState();
54
+ let message = '';
55
+ // Add overall discovery status message if needed
56
+ if (discoveryState === MCPDiscoveryState.IN_PROGRESS ||
57
+ connectingServers.length > 0) {
58
+ message += `${COLOR_YELLOW}⏳ MCP servers are starting up (${connectingServers.length} initializing)...${RESET_COLOR}\n`;
59
+ message += `${COLOR_CYAN}Note: First startup may take longer. Tool availability will update automatically.${RESET_COLOR}\n\n`;
60
+ }
61
+ message += 'Configured MCP servers:\n\n';
62
+ const allTools = toolRegistry.getAllTools();
63
+ for (const serverName of serverNames) {
64
+ const serverTools = allTools.filter((tool) => tool instanceof DiscoveredMCPTool && tool.serverName === serverName);
65
+ const status = getMCPServerStatus(serverName);
66
+ // Add status indicator with descriptive text
67
+ let statusIndicator = '';
68
+ let statusText = '';
69
+ switch (status) {
70
+ case MCPServerStatus.CONNECTED:
71
+ statusIndicator = '🟢';
72
+ statusText = 'Ready';
73
+ break;
74
+ case MCPServerStatus.CONNECTING:
75
+ statusIndicator = '🔄';
76
+ statusText = 'Starting... (first startup may take longer)';
77
+ break;
78
+ case MCPServerStatus.DISCONNECTED:
79
+ default:
80
+ statusIndicator = '🔴';
81
+ statusText = 'Disconnected';
82
+ break;
83
+ }
84
+ // Get server description if available
85
+ const server = mcpServers[serverName];
86
+ let serverDisplayName = serverName;
87
+ if (server.extensionName) {
88
+ serverDisplayName += ` (from ${server.extensionName})`;
89
+ }
90
+ // Format server header with bold formatting and status
91
+ message += `${statusIndicator} \u001b[1m${serverDisplayName}\u001b[0m - ${statusText}`;
92
+ // Add tool count with conditional messaging
93
+ if (status === MCPServerStatus.CONNECTED) {
94
+ message += ` (${serverTools.length} tools)`;
95
+ }
96
+ else if (status === MCPServerStatus.CONNECTING) {
97
+ message += ` (tools will appear when ready)`;
98
+ }
99
+ else {
100
+ message += ` (${serverTools.length} tools cached)`;
101
+ }
102
+ // Add server description with proper handling of multi-line descriptions
103
+ if (showDescriptions && server?.description) {
104
+ const descLines = server.description.trim().split('\n');
105
+ if (descLines) {
106
+ message += ':\n';
107
+ for (const descLine of descLines) {
108
+ message += ` ${COLOR_GREEN}${descLine}${RESET_COLOR}\n`;
109
+ }
110
+ }
111
+ else {
112
+ message += '\n';
113
+ }
114
+ }
115
+ else {
116
+ message += '\n';
117
+ }
118
+ // Reset formatting after server entry
119
+ message += RESET_COLOR;
120
+ if (serverTools.length > 0) {
121
+ serverTools.forEach((tool) => {
122
+ if (showDescriptions && tool.description) {
123
+ // Format tool name in cyan using simple ANSI cyan color
124
+ message += ` - ${COLOR_CYAN}${tool.name}${RESET_COLOR}`;
125
+ // Handle multi-line descriptions by properly indenting and preserving formatting
126
+ const descLines = tool.description.trim().split('\n');
127
+ if (descLines) {
128
+ message += ':\n';
129
+ for (const descLine of descLines) {
130
+ message += ` ${COLOR_GREEN}${descLine}${RESET_COLOR}\n`;
131
+ }
132
+ }
133
+ else {
134
+ message += '\n';
135
+ }
136
+ // Reset is handled inline with each line now
137
+ }
138
+ else {
139
+ // Use cyan color for the tool name even when not showing descriptions
140
+ message += ` - ${COLOR_CYAN}${tool.name}${RESET_COLOR}\n`;
141
+ }
142
+ const parameters = tool.schema.parametersJsonSchema ?? tool.schema.parameters;
143
+ if (showSchema && parameters) {
144
+ // Prefix the parameters in cyan
145
+ message += ` ${COLOR_CYAN}Parameters:${RESET_COLOR}\n`;
146
+ const paramsLines = JSON.stringify(parameters, null, 2)
147
+ .trim()
148
+ .split('\n');
149
+ if (paramsLines) {
150
+ for (const paramsLine of paramsLines) {
151
+ message += ` ${COLOR_GREEN}${paramsLine}${RESET_COLOR}\n`;
152
+ }
153
+ }
154
+ }
155
+ });
156
+ }
157
+ else {
158
+ message += ' No tools available\n';
159
+ }
160
+ message += '\n';
161
+ }
162
+ for (const server of blockedMcpServers) {
163
+ let serverDisplayName = server.name;
164
+ if (server.extensionName) {
165
+ serverDisplayName += ` (from ${server.extensionName})`;
166
+ }
167
+ message += `🔴 \u001b[1m${serverDisplayName}\u001b[0m - Blocked\n\n`;
168
+ }
169
+ // Add helpful tips when no arguments are provided
170
+ if (showTips) {
171
+ message += '\n';
172
+ message += `${COLOR_CYAN}💡 Tips:${RESET_COLOR}\n`;
173
+ message += ` • Use ${COLOR_CYAN}/mcp desc${RESET_COLOR} to show server and tool descriptions\n`;
174
+ message += ` • Use ${COLOR_CYAN}/mcp schema${RESET_COLOR} to show tool parameter schemas\n`;
175
+ message += ` • Use ${COLOR_CYAN}/mcp nodesc${RESET_COLOR} to hide descriptions\n`;
176
+ message += ` • Press ${COLOR_CYAN}Ctrl+T${RESET_COLOR} to toggle tool descriptions on/off\n`;
177
+ message += '\n';
178
+ }
179
+ // Make sure to reset any ANSI formatting at the end to prevent it from affecting the terminal
180
+ message += RESET_COLOR;
181
+ return {
182
+ type: 'message',
183
+ messageType: 'info',
184
+ content: message,
185
+ };
186
+ };
187
+ export const mcpCommand = {
188
+ name: 'mcp',
189
+ description: 'list configured MCP servers and tools',
190
+ action: async (context, args) => {
191
+ const lowerCaseArgs = args.toLowerCase().split(/\s+/).filter(Boolean);
192
+ const hasDesc = lowerCaseArgs.includes('desc') || lowerCaseArgs.includes('descriptions');
193
+ const hasNodesc = lowerCaseArgs.includes('nodesc') ||
194
+ lowerCaseArgs.includes('nodescriptions');
195
+ const showSchema = lowerCaseArgs.includes('schema');
196
+ // Show descriptions if `desc` or `schema` is present,
197
+ // but `nodesc` takes precedence and disables them.
198
+ const showDescriptions = !hasNodesc && (hasDesc || showSchema);
199
+ // Show tips only when no arguments are provided
200
+ const showTips = lowerCaseArgs.length === 0;
201
+ return getMcpStatus(context, showDescriptions, showSchema, showTips);
202
+ },
203
+ };
204
+ //# sourceMappingURL=mcpCommand.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcpCommand.js","sourceRoot":"","sources":["../../../../src/ui/commands/mcpCommand.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAOH,OAAO,EACL,iBAAiB,EACjB,oBAAoB,EACpB,kBAAkB,EAClB,iBAAiB,EACjB,eAAe,GAChB,MAAM,6BAA6B,CAAC;AACrC,OAAO,IAAI,MAAM,MAAM,CAAC;AAExB,MAAM,WAAW,GAAG,YAAY,CAAC;AACjC,MAAM,YAAY,GAAG,YAAY,CAAC;AAClC,MAAM,UAAU,GAAG,YAAY,CAAC;AAChC,MAAM,WAAW,GAAG,WAAW,CAAC;AAEhC,MAAM,YAAY,GAAG,KAAK,EACxB,OAAuB,EACvB,gBAAyB,EACzB,UAAmB,EACnB,WAAoB,KAAK,EACU,EAAE;IACrC,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,QAAQ,CAAC;IACpC,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO;YACL,IAAI,EAAE,SAAS;YACf,WAAW,EAAE,OAAO;YACpB,OAAO,EAAE,oBAAoB;SAC9B,CAAC;IACJ,CAAC;IAED,MAAM,YAAY,GAAG,MAAM,MAAM,CAAC,eAAe,EAAE,CAAC;IACpD,IAAI,CAAC,YAAY,EAAE,CAAC;QAClB,OAAO;YACL,IAAI,EAAE,SAAS;YACf,WAAW,EAAE,OAAO;YACpB,OAAO,EAAE,mCAAmC;SAC7C,CAAC;IACJ,CAAC;IAED,MAAM,UAAU,GAAG,MAAM,CAAC,aAAa,EAAE,IAAI,EAAE,CAAC;IAChD,MAAM,WAAW,GAAG,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IAC5C,MAAM,iBAAiB,GAAG,MAAM,CAAC,oBAAoB,EAAE,IAAI,EAAE,CAAC;IAE9D,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,IAAI,iBAAiB,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC/D,MAAM,OAAO,GAAG,qCAAqC,CAAC;QACtD,IAAI,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,OAAO,CAAC,GAAG,CAAC,OAAO,KAAK,cAAc,EAAE,CAAC;YAClE,OAAO;gBACL,IAAI,EAAE,SAAS;gBACf,WAAW,EAAE,MAAM;gBACnB,OAAO,EAAE,oGAAoG,OAAO,EAAE;aACvH,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,8BAA8B;YAC9B,MAAM,IAAI,CAAC,OAAO,CAAC,CAAC;YACpB,OAAO;gBACL,IAAI,EAAE,SAAS;gBACf,WAAW,EAAE,MAAM;gBACnB,OAAO,EAAE,qEAAqE,OAAO,EAAE;aACxF,CAAC;QACJ,CAAC;IACH,CAAC;IAED,4CAA4C;IAC5C,MAAM,iBAAiB,GAAG,WAAW,CAAC,MAAM,CAC1C,CAAC,IAAI,EAAE,EAAE,CAAC,kBAAkB,CAAC,IAAI,CAAC,KAAK,eAAe,CAAC,UAAU,CAClE,CAAC;IACF,MAAM,cAAc,GAAG,oBAAoB,EAAE,CAAC;IAE9C,IAAI,OAAO,GAAG,EAAE,CAAC;IAEjB,iDAAiD;IACjD,IACE,cAAc,KAAK,iBAAiB,CAAC,WAAW;QAChD,iBAAiB,CAAC,MAAM,GAAG,CAAC,EAC5B,CAAC;QACD,OAAO,IAAI,GAAG,YAAY,kCAAkC,iBAAiB,CAAC,MAAM,oBAAoB,WAAW,IAAI,CAAC;QACxH,OAAO,IAAI,GAAG,UAAU,oFAAoF,WAAW,MAAM,CAAC;IAChI,CAAC;IAED,OAAO,IAAI,6BAA6B,CAAC;IAEzC,MAAM,QAAQ,GAAG,YAAY,CAAC,WAAW,EAAE,CAAC;IAC5C,KAAK,MAAM,UAAU,IAAI,WAAW,EAAE,CAAC;QACrC,MAAM,WAAW,GAAG,QAAQ,CAAC,MAAM,CACjC,CAAC,IAAI,EAAE,EAAE,CACP,IAAI,YAAY,iBAAiB,IAAI,IAAI,CAAC,UAAU,KAAK,UAAU,CAC/C,CAAC;QAEzB,MAAM,MAAM,GAAG,kBAAkB,CAAC,UAAU,CAAC,CAAC;QAE9C,6CAA6C;QAC7C,IAAI,eAAe,GAAG,EAAE,CAAC;QACzB,IAAI,UAAU,GAAG,EAAE,CAAC;QACpB,QAAQ,MAAM,EAAE,CAAC;YACf,KAAK,eAAe,CAAC,SAAS;gBAC5B,eAAe,GAAG,IAAI,CAAC;gBACvB,UAAU,GAAG,OAAO,CAAC;gBACrB,MAAM;YACR,KAAK,eAAe,CAAC,UAAU;gBAC7B,eAAe,GAAG,IAAI,CAAC;gBACvB,UAAU,GAAG,6CAA6C,CAAC;gBAC3D,MAAM;YACR,KAAK,eAAe,CAAC,YAAY,CAAC;YAClC;gBACE,eAAe,GAAG,IAAI,CAAC;gBACvB,UAAU,GAAG,cAAc,CAAC;gBAC5B,MAAM;QACV,CAAC;QAED,sCAAsC;QACtC,MAAM,MAAM,GAAG,UAAU,CAAC,UAAU,CAAC,CAAC;QACtC,IAAI,iBAAiB,GAAG,UAAU,CAAC;QACnC,IAAI,MAAM,CAAC,aAAa,EAAE,CAAC;YACzB,iBAAiB,IAAI,UAAU,MAAM,CAAC,aAAa,GAAG,CAAC;QACzD,CAAC;QAED,uDAAuD;QACvD,OAAO,IAAI,GAAG,eAAe,aAAa,iBAAiB,eAAe,UAAU,EAAE,CAAC;QAEvF,4CAA4C;QAC5C,IAAI,MAAM,KAAK,eAAe,CAAC,SAAS,EAAE,CAAC;YACzC,OAAO,IAAI,KAAK,WAAW,CAAC,MAAM,SAAS,CAAC;QAC9C,CAAC;aAAM,IAAI,MAAM,KAAK,eAAe,CAAC,UAAU,EAAE,CAAC;YACjD,OAAO,IAAI,iCAAiC,CAAC;QAC/C,CAAC;aAAM,CAAC;YACN,OAAO,IAAI,KAAK,WAAW,CAAC,MAAM,gBAAgB,CAAC;QACrD,CAAC;QAED,yEAAyE;QACzE,IAAI,gBAAgB,IAAI,MAAM,EAAE,WAAW,EAAE,CAAC;YAC5C,MAAM,SAAS,GAAG,MAAM,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YACxD,IAAI,SAAS,EAAE,CAAC;gBACd,OAAO,IAAI,KAAK,CAAC;gBACjB,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;oBACjC,OAAO,IAAI,OAAO,WAAW,GAAG,QAAQ,GAAG,WAAW,IAAI,CAAC;gBAC7D,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,OAAO,IAAI,IAAI,CAAC;YAClB,CAAC;QACH,CAAC;aAAM,CAAC;YACN,OAAO,IAAI,IAAI,CAAC;QAClB,CAAC;QAED,sCAAsC;QACtC,OAAO,IAAI,WAAW,CAAC;QAEvB,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC3B,WAAW,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE;gBAC3B,IAAI,gBAAgB,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;oBACzC,wDAAwD;oBACxD,OAAO,IAAI,OAAO,UAAU,GAAG,IAAI,CAAC,IAAI,GAAG,WAAW,EAAE,CAAC;oBAEzD,iFAAiF;oBACjF,MAAM,SAAS,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;oBACtD,IAAI,SAAS,EAAE,CAAC;wBACd,OAAO,IAAI,KAAK,CAAC;wBACjB,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;4BACjC,OAAO,IAAI,SAAS,WAAW,GAAG,QAAQ,GAAG,WAAW,IAAI,CAAC;wBAC/D,CAAC;oBACH,CAAC;yBAAM,CAAC;wBACN,OAAO,IAAI,IAAI,CAAC;oBAClB,CAAC;oBACD,6CAA6C;gBAC/C,CAAC;qBAAM,CAAC;oBACN,sEAAsE;oBACtE,OAAO,IAAI,OAAO,UAAU,GAAG,IAAI,CAAC,IAAI,GAAG,WAAW,IAAI,CAAC;gBAC7D,CAAC;gBACD,MAAM,UAAU,GACd,IAAI,CAAC,MAAM,CAAC,oBAAoB,IAAI,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC;gBAC7D,IAAI,UAAU,IAAI,UAAU,EAAE,CAAC;oBAC7B,gCAAgC;oBAChC,OAAO,IAAI,OAAO,UAAU,cAAc,WAAW,IAAI,CAAC;oBAE1D,MAAM,WAAW,GAAG,IAAI,CAAC,SAAS,CAAC,UAAU,EAAE,IAAI,EAAE,CAAC,CAAC;yBACpD,IAAI,EAAE;yBACN,KAAK,CAAC,IAAI,CAAC,CAAC;oBACf,IAAI,WAAW,EAAE,CAAC;wBAChB,KAAK,MAAM,UAAU,IAAI,WAAW,EAAE,CAAC;4BACrC,OAAO,IAAI,SAAS,WAAW,GAAG,UAAU,GAAG,WAAW,IAAI,CAAC;wBACjE,CAAC;oBACH,CAAC;gBACH,CAAC;YACH,CAAC,CAAC,CAAC;QACL,CAAC;aAAM,CAAC;YACN,OAAO,IAAI,wBAAwB,CAAC;QACtC,CAAC;QACD,OAAO,IAAI,IAAI,CAAC;IAClB,CAAC;IAED,KAAK,MAAM,MAAM,IAAI,iBAAiB,EAAE,CAAC;QACvC,IAAI,iBAAiB,GAAG,MAAM,CAAC,IAAI,CAAC;QACpC,IAAI,MAAM,CAAC,aAAa,EAAE,CAAC;YACzB,iBAAiB,IAAI,UAAU,MAAM,CAAC,aAAa,GAAG,CAAC;QACzD,CAAC;QACD,OAAO,IAAI,eAAe,iBAAiB,yBAAyB,CAAC;IACvE,CAAC;IAED,kDAAkD;IAClD,IAAI,QAAQ,EAAE,CAAC;QACb,OAAO,IAAI,IAAI,CAAC;QAChB,OAAO,IAAI,GAAG,UAAU,WAAW,WAAW,IAAI,CAAC;QACnD,OAAO,IAAI,WAAW,UAAU,YAAY,WAAW,yCAAyC,CAAC;QACjG,OAAO,IAAI,WAAW,UAAU,cAAc,WAAW,mCAAmC,CAAC;QAC7F,OAAO,IAAI,WAAW,UAAU,cAAc,WAAW,yBAAyB,CAAC;QACnF,OAAO,IAAI,aAAa,UAAU,SAAS,WAAW,uCAAuC,CAAC;QAC9F,OAAO,IAAI,IAAI,CAAC;IAClB,CAAC;IAED,8FAA8F;IAC9F,OAAO,IAAI,WAAW,CAAC;IAEvB,OAAO;QACL,IAAI,EAAE,SAAS;QACf,WAAW,EAAE,MAAM;QACnB,OAAO,EAAE,OAAO;KACjB,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,UAAU,GAAiB;IACtC,IAAI,EAAE,KAAK;IACX,WAAW,EAAE,uCAAuC;IACpD,MAAM,EAAE,KAAK,EAAE,OAAuB,EAAE,IAAY,EAAE,EAAE;QACtD,MAAM,aAAa,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAEtE,MAAM,OAAO,GACX,aAAa,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,aAAa,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC;QAC3E,MAAM,SAAS,GACb,aAAa,CAAC,QAAQ,CAAC,QAAQ,CAAC;YAChC,aAAa,CAAC,QAAQ,CAAC,gBAAgB,CAAC,CAAC;QAC3C,MAAM,UAAU,GAAG,aAAa,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;QAEpD,sDAAsD;QACtD,mDAAmD;QACnD,MAAM,gBAAgB,GAAG,CAAC,SAAS,IAAI,CAAC,OAAO,IAAI,UAAU,CAAC,CAAC;QAE/D,gDAAgD;QAChD,MAAM,QAAQ,GAAG,aAAa,CAAC,MAAM,KAAK,CAAC,CAAC;QAE5C,OAAO,YAAY,CAAC,OAAO,EAAE,gBAAgB,EAAE,UAAU,EAAE,QAAQ,CAAC,CAAC;IACvE,CAAC;CACF,CAAC"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Vybestack LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import { SlashCommand } from './types.js';
7
+ export declare const modelCommand: SlashCommand;
@@ -0,0 +1,60 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Vybestack LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import { getProviderManager } from '../../providers/providerManagerInstance.js';
7
+ import { SettingScope } from '../../config/settings.js';
8
+ export const modelCommand = {
9
+ name: 'model',
10
+ description: 'select or switch model',
11
+ action: async (context, args) => {
12
+ const modelName = args?.trim();
13
+ const providerManager = getProviderManager();
14
+ // Always use provider model dialog if no model specified
15
+ if (!modelName) {
16
+ return {
17
+ type: 'dialog',
18
+ dialog: 'providerModel',
19
+ };
20
+ }
21
+ // Switch model in provider
22
+ try {
23
+ const activeProvider = providerManager.getActiveProvider();
24
+ const currentModel = activeProvider.getCurrentModel
25
+ ? activeProvider.getCurrentModel()
26
+ : 'unknown';
27
+ if (activeProvider.setModel) {
28
+ activeProvider.setModel(modelName);
29
+ // Keep config model in sync so /about shows correct model
30
+ if (context.services.config) {
31
+ context.services.config.setModel(modelName);
32
+ }
33
+ // Persist model selection to user settings
34
+ if (context.services.settings) {
35
+ context.services.settings.setValue(SettingScope.User, 'defaultModel', modelName);
36
+ }
37
+ return {
38
+ type: 'message',
39
+ messageType: 'info',
40
+ content: `Switched from ${currentModel} to ${modelName} in provider '${activeProvider.name}'`,
41
+ };
42
+ }
43
+ else {
44
+ return {
45
+ type: 'message',
46
+ messageType: 'error',
47
+ content: `Provider '${activeProvider.name}' does not support model switching`,
48
+ };
49
+ }
50
+ }
51
+ catch (error) {
52
+ return {
53
+ type: 'message',
54
+ messageType: 'error',
55
+ content: `Failed to switch model: ${error instanceof Error ? error.message : String(error)}`,
56
+ };
57
+ }
58
+ },
59
+ };
60
+ //# sourceMappingURL=modelCommand.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"modelCommand.js","sourceRoot":"","sources":["../../../../src/ui/commands/modelCommand.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAQH,OAAO,EAAE,kBAAkB,EAAE,MAAM,4CAA4C,CAAC;AAChF,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAExD,MAAM,CAAC,MAAM,YAAY,GAAiB;IACxC,IAAI,EAAE,OAAO;IACb,WAAW,EAAE,wBAAwB;IACrC,MAAM,EAAE,KAAK,EACX,OAAuB,EACvB,IAAY,EACkD,EAAE;QAChE,MAAM,SAAS,GAAG,IAAI,EAAE,IAAI,EAAE,CAAC;QAC/B,MAAM,eAAe,GAAG,kBAAkB,EAAE,CAAC;QAE7C,yDAAyD;QACzD,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,OAAO;gBACL,IAAI,EAAE,QAAQ;gBACd,MAAM,EAAE,eAAe;aACxB,CAAC;QACJ,CAAC;QAED,2BAA2B;QAC3B,IAAI,CAAC;YACH,MAAM,cAAc,GAAG,eAAe,CAAC,iBAAiB,EAAE,CAAC;YAC3D,MAAM,YAAY,GAAG,cAAc,CAAC,eAAe;gBACjD,CAAC,CAAC,cAAc,CAAC,eAAe,EAAE;gBAClC,CAAC,CAAC,SAAS,CAAC;YAEd,IAAI,cAAc,CAAC,QAAQ,EAAE,CAAC;gBAC5B,cAAc,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;gBACnC,0DAA0D;gBAC1D,IAAI,OAAO,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC;oBAC5B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;gBAC9C,CAAC;gBAED,2CAA2C;gBAC3C,IAAI,OAAO,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC;oBAC9B,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAChC,YAAY,CAAC,IAAI,EACjB,cAAc,EACd,SAAS,CACV,CAAC;gBACJ,CAAC;gBAED,OAAO;oBACL,IAAI,EAAE,SAAS;oBACf,WAAW,EAAE,MAAM;oBACnB,OAAO,EAAE,iBAAiB,YAAY,OAAO,SAAS,iBAAiB,cAAc,CAAC,IAAI,GAAG;iBAC9F,CAAC;YACJ,CAAC;iBAAM,CAAC;gBACN,OAAO;oBACL,IAAI,EAAE,SAAS;oBACf,WAAW,EAAE,OAAO;oBACpB,OAAO,EAAE,aAAa,cAAc,CAAC,IAAI,oCAAoC;iBAC9E,CAAC;YACJ,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO;gBACL,IAAI,EAAE,SAAS;gBACf,WAAW,EAAE,OAAO;gBACpB,OAAO,EAAE,2BAA2B,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE;aAC7F,CAAC;QACJ,CAAC;IACH,CAAC;CACF,CAAC"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Vybestack LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import { SlashCommand } from './types.js';
7
+ export declare const providerCommand: SlashCommand;
@@ -0,0 +1,86 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Vybestack LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import { getProviderManager } from '../../providers/providerManagerInstance.js';
7
+ import { MessageType } from '../types.js';
8
+ import { AuthType } from '@vybestack/llxprt-code-core';
9
+ export const providerCommand = {
10
+ name: 'provider',
11
+ description: 'switch between different AI providers (openai, anthropic, etc.)',
12
+ action: async (context, args) => {
13
+ const providerManager = getProviderManager();
14
+ const providerName = args?.trim();
15
+ if (!providerName) {
16
+ // Open interactive provider selection dialog
17
+ return {
18
+ type: 'dialog',
19
+ dialog: 'provider',
20
+ };
21
+ }
22
+ try {
23
+ const currentProvider = providerManager.getActiveProviderName();
24
+ // Handle switching to same provider
25
+ if (providerName === currentProvider) {
26
+ return {
27
+ type: 'message',
28
+ messageType: 'info',
29
+ content: `Already using provider: ${currentProvider}`,
30
+ };
31
+ }
32
+ const fromProvider = currentProvider || 'none';
33
+ // Use conversion context to track available models
34
+ // const conversionContextJSON = {
35
+ // availableModels: await providerManager.getAllAvailableModels(),
36
+ // };
37
+ // Switch provider first (this will clear state from ALL providers)
38
+ providerManager.setActiveProvider(providerName);
39
+ // Update config if available
40
+ if (context.services.config) {
41
+ // Ensure provider manager is set on config
42
+ context.services.config.setProviderManager(providerManager);
43
+ // Update model to match the new provider's default
44
+ const newModel = providerManager.getActiveProvider().getCurrentModel?.() || '';
45
+ context.services.config.setModel(newModel);
46
+ // Clear conversation history BEFORE switching to prevent tool call ID mismatches
47
+ const geminiClient = context.services.config.getGeminiClient();
48
+ if (geminiClient && geminiClient.isInitialized()) {
49
+ await geminiClient.resetChat();
50
+ }
51
+ // Keep the current auth type - auth only affects GeminiProvider internally
52
+ const currentAuthType = context.services.config.getContentGeneratorConfig()?.authType ||
53
+ AuthType.LOGIN_WITH_GOOGLE;
54
+ // Refresh auth to ensure provider manager is attached
55
+ await context.services.config.refreshAuth(currentAuthType);
56
+ // Show info about API key if needed for non-Gemini providers
57
+ if (providerName !== 'gemini') {
58
+ context.ui.addItem({
59
+ type: MessageType.INFO,
60
+ text: `Switched to ${providerName}. Use /key to set API key if needed.`,
61
+ }, Date.now());
62
+ }
63
+ // Clear UI history to prevent tool call ID mismatches
64
+ context.ui.clear();
65
+ }
66
+ // Trigger payment mode check if available
67
+ const extendedContext = context;
68
+ if (extendedContext.checkPaymentModeChange) {
69
+ setTimeout(() => extendedContext.checkPaymentModeChange(fromProvider), 100);
70
+ }
71
+ return {
72
+ type: 'message',
73
+ messageType: 'info',
74
+ content: `Switched from ${fromProvider} to ${providerName}`,
75
+ };
76
+ }
77
+ catch (error) {
78
+ return {
79
+ type: 'message',
80
+ messageType: 'error',
81
+ content: `Failed to switch provider: ${error instanceof Error ? error.message : String(error)}`,
82
+ };
83
+ }
84
+ },
85
+ };
86
+ //# sourceMappingURL=providerCommand.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"providerCommand.js","sourceRoot":"","sources":["../../../../src/ui/commands/providerCommand.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 { type SlashCommand } from './types.js';
7
+ export declare const quitCommand: SlashCommand;
@@ -0,0 +1,32 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import { formatDuration } from '../utils/formatters.js';
7
+ export const quitCommand = {
8
+ name: 'quit',
9
+ altName: 'exit',
10
+ description: 'exit the cli',
11
+ action: (context) => {
12
+ const now = Date.now();
13
+ const { sessionStartTime } = context.session.stats;
14
+ const wallDuration = now - sessionStartTime.getTime();
15
+ return {
16
+ type: 'quit',
17
+ messages: [
18
+ {
19
+ type: 'user',
20
+ text: `/quit`, // Keep it consistent, even if /exit was used
21
+ id: now - 1,
22
+ },
23
+ {
24
+ type: 'quit',
25
+ duration: formatDuration(wallDuration),
26
+ id: now,
27
+ },
28
+ ],
29
+ };
30
+ },
31
+ };
32
+ //# sourceMappingURL=quitCommand.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"quitCommand.js","sourceRoot":"","sources":["../../../../src/ui/commands/quitCommand.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAGxD,MAAM,CAAC,MAAM,WAAW,GAAiB;IACvC,IAAI,EAAE,MAAM;IACZ,OAAO,EAAE,MAAM;IACf,WAAW,EAAE,cAAc;IAC3B,MAAM,EAAE,CAAC,OAAO,EAAE,EAAE;QAClB,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,MAAM,EAAE,gBAAgB,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC;QACnD,MAAM,YAAY,GAAG,GAAG,GAAG,gBAAgB,CAAC,OAAO,EAAE,CAAC;QAEtD,OAAO;YACL,IAAI,EAAE,MAAM;YACZ,QAAQ,EAAE;gBACR;oBACE,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,OAAO,EAAE,6CAA6C;oBAC5D,EAAE,EAAE,GAAG,GAAG,CAAC;iBACZ;gBACD;oBACE,IAAI,EAAE,MAAM;oBACZ,QAAQ,EAAE,cAAc,CAAC,YAAY,CAAC;oBACtC,EAAE,EAAE,GAAG;iBACR;aACF;SACF,CAAC;IACJ,CAAC;CACF,CAAC"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import { type SlashCommand } from './types.js';
7
+ import { Config } from '@vybestack/llxprt-code-core';
8
+ export declare const restoreCommand: (config: Config | null) => SlashCommand | null;
@@ -0,0 +1,126 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import * as fs from 'fs/promises';
7
+ import path from 'path';
8
+ async function restoreAction(context, args) {
9
+ const { services, ui } = context;
10
+ const { config, git: gitService } = services;
11
+ const { addItem, loadHistory } = ui;
12
+ const checkpointDir = config?.getProjectTempDir()
13
+ ? path.join(config.getProjectTempDir(), 'checkpoints')
14
+ : undefined;
15
+ if (!checkpointDir) {
16
+ return {
17
+ type: 'message',
18
+ messageType: 'error',
19
+ content: 'Could not determine the .gemini directory path.',
20
+ };
21
+ }
22
+ try {
23
+ // Ensure the directory exists before trying to read it.
24
+ await fs.mkdir(checkpointDir, { recursive: true });
25
+ const files = await fs.readdir(checkpointDir);
26
+ const jsonFiles = files.filter((file) => file.endsWith('.json'));
27
+ if (!args) {
28
+ if (jsonFiles.length === 0) {
29
+ return {
30
+ type: 'message',
31
+ messageType: 'info',
32
+ content: 'No restorable tool calls found.',
33
+ };
34
+ }
35
+ const truncatedFiles = jsonFiles.map((file) => {
36
+ const components = file.split('.');
37
+ if (components.length <= 1) {
38
+ return file;
39
+ }
40
+ components.pop();
41
+ return components.join('.');
42
+ });
43
+ const fileList = truncatedFiles.join('\n');
44
+ return {
45
+ type: 'message',
46
+ messageType: 'info',
47
+ content: `Available tool calls to restore:\n\n${fileList}`,
48
+ };
49
+ }
50
+ const selectedFile = args.endsWith('.json') ? args : `${args}.json`;
51
+ if (!jsonFiles.includes(selectedFile)) {
52
+ return {
53
+ type: 'message',
54
+ messageType: 'error',
55
+ content: `File not found: ${selectedFile}`,
56
+ };
57
+ }
58
+ const filePath = path.join(checkpointDir, selectedFile);
59
+ const data = await fs.readFile(filePath, 'utf-8');
60
+ const toolCallData = JSON.parse(data);
61
+ if (toolCallData.history) {
62
+ if (!loadHistory) {
63
+ // This should not happen
64
+ return {
65
+ type: 'message',
66
+ messageType: 'error',
67
+ content: 'loadHistory function is not available.',
68
+ };
69
+ }
70
+ loadHistory(toolCallData.history);
71
+ }
72
+ if (toolCallData.clientHistory) {
73
+ await config?.getGeminiClient()?.setHistory(toolCallData.clientHistory);
74
+ }
75
+ if (toolCallData.commitHash) {
76
+ await gitService?.restoreProjectFromSnapshot(toolCallData.commitHash);
77
+ addItem({
78
+ type: 'info',
79
+ text: 'Restored project to the state before the tool call.',
80
+ }, Date.now());
81
+ }
82
+ return {
83
+ type: 'tool',
84
+ toolName: toolCallData.toolCall.name,
85
+ toolArgs: toolCallData.toolCall.args,
86
+ };
87
+ }
88
+ catch (error) {
89
+ return {
90
+ type: 'message',
91
+ messageType: 'error',
92
+ content: `Could not read restorable tool calls. This is the error: ${error}`,
93
+ };
94
+ }
95
+ }
96
+ async function completion(context, _partialArg) {
97
+ const { services } = context;
98
+ const { config } = services;
99
+ const checkpointDir = config?.getProjectTempDir()
100
+ ? path.join(config.getProjectTempDir(), 'checkpoints')
101
+ : undefined;
102
+ if (!checkpointDir) {
103
+ return [];
104
+ }
105
+ try {
106
+ const files = await fs.readdir(checkpointDir);
107
+ return files
108
+ .filter((file) => file.endsWith('.json'))
109
+ .map((file) => file.replace('.json', ''));
110
+ }
111
+ catch (_err) {
112
+ return [];
113
+ }
114
+ }
115
+ export const restoreCommand = (config) => {
116
+ if (!config?.getCheckpointingEnabled()) {
117
+ return null;
118
+ }
119
+ return {
120
+ name: 'restore',
121
+ description: 'Restore a tool call. This will reset the conversation and file history to the state it was in when the tool call was suggested',
122
+ action: restoreAction,
123
+ completion,
124
+ };
125
+ };
126
+ //# sourceMappingURL=restoreCommand.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"restoreCommand.js","sourceRoot":"","sources":["../../../../src/ui/commands/restoreCommand.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 { type SlashCommand } from './types.js';
7
+ export declare const statsCommand: SlashCommand;
@@ -0,0 +1,50 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import { MessageType } from '../types.js';
7
+ import { formatDuration } from '../utils/formatters.js';
8
+ export const statsCommand = {
9
+ name: 'stats',
10
+ altName: 'usage',
11
+ description: 'check session stats. Usage: /stats [model|tools]',
12
+ action: (context) => {
13
+ const now = new Date();
14
+ const { sessionStartTime } = context.session.stats;
15
+ if (!sessionStartTime) {
16
+ context.ui.addItem({
17
+ type: MessageType.ERROR,
18
+ text: 'Session start time is unavailable, cannot calculate stats.',
19
+ }, Date.now());
20
+ return;
21
+ }
22
+ const wallDuration = now.getTime() - sessionStartTime.getTime();
23
+ const statsItem = {
24
+ type: MessageType.STATS,
25
+ duration: formatDuration(wallDuration),
26
+ };
27
+ context.ui.addItem(statsItem, Date.now());
28
+ },
29
+ subCommands: [
30
+ {
31
+ name: 'model',
32
+ description: 'Show model-specific usage statistics.',
33
+ action: (context) => {
34
+ context.ui.addItem({
35
+ type: MessageType.MODEL_STATS,
36
+ }, Date.now());
37
+ },
38
+ },
39
+ {
40
+ name: 'tools',
41
+ description: 'Show tool-specific usage statistics.',
42
+ action: (context) => {
43
+ context.ui.addItem({
44
+ type: MessageType.TOOL_STATS,
45
+ }, Date.now());
46
+ },
47
+ },
48
+ ],
49
+ };
50
+ //# sourceMappingURL=statsCommand.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"statsCommand.js","sourceRoot":"","sources":["../../../../src/ui/commands/statsCommand.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,WAAW,EAAoB,MAAM,aAAa,CAAC;AAC5D,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAGxD,MAAM,CAAC,MAAM,YAAY,GAAiB;IACxC,IAAI,EAAE,OAAO;IACb,OAAO,EAAE,OAAO;IAChB,WAAW,EAAE,kDAAkD;IAC/D,MAAM,EAAE,CAAC,OAAuB,EAAE,EAAE;QAClC,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,MAAM,EAAE,gBAAgB,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC;QACnD,IAAI,CAAC,gBAAgB,EAAE,CAAC;YACtB,OAAO,CAAC,EAAE,CAAC,OAAO,CAChB;gBACE,IAAI,EAAE,WAAW,CAAC,KAAK;gBACvB,IAAI,EAAE,4DAA4D;aACnE,EACD,IAAI,CAAC,GAAG,EAAE,CACX,CAAC;YACF,OAAO;QACT,CAAC;QACD,MAAM,YAAY,GAAG,GAAG,CAAC,OAAO,EAAE,GAAG,gBAAgB,CAAC,OAAO,EAAE,CAAC;QAEhE,MAAM,SAAS,GAAqB;YAClC,IAAI,EAAE,WAAW,CAAC,KAAK;YACvB,QAAQ,EAAE,cAAc,CAAC,YAAY,CAAC;SACvC,CAAC;QAEF,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;IAC5C,CAAC;IACD,WAAW,EAAE;QACX;YACE,IAAI,EAAE,OAAO;YACb,WAAW,EAAE,uCAAuC;YACpD,MAAM,EAAE,CAAC,OAAuB,EAAE,EAAE;gBAClC,OAAO,CAAC,EAAE,CAAC,OAAO,CAChB;oBACE,IAAI,EAAE,WAAW,CAAC,WAAW;iBAC9B,EACD,IAAI,CAAC,GAAG,EAAE,CACX,CAAC;YACJ,CAAC;SACF;QACD;YACE,IAAI,EAAE,OAAO;YACb,WAAW,EAAE,sCAAsC;YACnD,MAAM,EAAE,CAAC,OAAuB,EAAE,EAAE;gBAClC,OAAO,CAAC,EAAE,CAAC,OAAO,CAChB;oBACE,IAAI,EAAE,WAAW,CAAC,UAAU;iBAC7B,EACD,IAAI,CAAC,GAAG,EAAE,CACX,CAAC;YACJ,CAAC;SACF;KACF;CACF,CAAC"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import { type SlashCommand } from './types.js';
7
+ export declare const toolsCommand: SlashCommand;