@vybestack/llxprt-code 0.1.12 → 0.1.13-nightly.250727.2261021c
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.
- package/dist/index.js +0 -0
- package/dist/package.json +5 -5
- package/dist/src/acp/acp.d.ts +208 -0
- package/dist/src/acp/acp.js +193 -0
- package/dist/src/acp/acp.js.map +1 -0
- package/dist/src/acp/acpPeer.d.ts +8 -0
- package/dist/src/acp/acpPeer.js +537 -0
- package/dist/src/acp/acpPeer.js.map +1 -0
- package/dist/src/config/config.d.ts +2 -0
- package/dist/src/config/config.js +73 -19
- package/dist/src/config/config.js.map +1 -1
- package/dist/src/config/extension.d.ts +2 -2
- package/dist/src/config/extension.js +21 -16
- package/dist/src/config/extension.js.map +1 -1
- package/dist/src/config/settings.d.ts +7 -0
- package/dist/src/config/settings.js +15 -0
- package/dist/src/config/settings.js.map +1 -1
- package/dist/src/gemini.js +33 -34
- package/dist/src/gemini.js.map +1 -1
- package/dist/src/generated/git-commit.d.ts +1 -1
- package/dist/src/generated/git-commit.js +1 -1
- package/dist/src/nonInteractiveCli.js +36 -3
- package/dist/src/nonInteractiveCli.js.map +1 -1
- package/dist/src/providers/index.d.ts +1 -7
- package/dist/src/providers/index.js +2 -10
- package/dist/src/providers/index.js.map +1 -1
- package/dist/src/providers/providerConfigUtils.d.ts +1 -2
- package/dist/src/providers/providerConfigUtils.js +1 -1
- package/dist/src/providers/providerConfigUtils.js.map +1 -1
- package/dist/src/providers/providerManagerInstance.d.ts +2 -2
- package/dist/src/providers/providerManagerInstance.js +21 -19
- package/dist/src/providers/providerManagerInstance.js.map +1 -1
- package/dist/src/providers/types.d.ts +1 -9
- package/dist/src/providers/types.js +2 -10
- package/dist/src/providers/types.js.map +1 -1
- package/dist/src/services/CommandService.d.ts +3 -1
- package/dist/src/services/CommandService.js +50 -11
- package/dist/src/services/CommandService.js.map +1 -1
- package/dist/src/ui/App.js +24 -25
- package/dist/src/ui/App.js.map +1 -1
- package/dist/src/ui/commands/aboutCommand.js +21 -0
- package/dist/src/ui/commands/aboutCommand.js.map +1 -1
- package/dist/src/ui/commands/baseurlCommand.d.ts +7 -0
- package/dist/src/ui/commands/baseurlCommand.js +22 -0
- package/dist/src/ui/commands/baseurlCommand.js.map +1 -0
- package/dist/src/ui/commands/bugCommand.d.ts +7 -0
- package/dist/src/ui/commands/bugCommand.js +61 -0
- package/dist/src/ui/commands/bugCommand.js.map +1 -0
- package/dist/src/ui/commands/chatCommand.d.ts +7 -0
- package/dist/src/ui/commands/chatCommand.js +170 -0
- package/dist/src/ui/commands/chatCommand.js.map +1 -0
- package/dist/src/ui/commands/clearCommand.js +12 -2
- package/dist/src/ui/commands/clearCommand.js.map +1 -1
- package/dist/src/ui/commands/compressCommand.d.ts +7 -0
- package/dist/src/ui/commands/compressCommand.js +62 -0
- package/dist/src/ui/commands/compressCommand.js.map +1 -0
- package/dist/src/ui/commands/docsCommand.d.ts +7 -0
- package/dist/src/ui/commands/docsCommand.js +29 -0
- package/dist/src/ui/commands/docsCommand.js.map +1 -0
- package/dist/src/ui/commands/editorCommand.d.ts +7 -0
- package/dist/src/ui/commands/editorCommand.js +14 -0
- package/dist/src/ui/commands/editorCommand.js.map +1 -0
- package/dist/src/ui/commands/extensionsCommand.d.ts +7 -0
- package/dist/src/ui/commands/extensionsCommand.js +29 -0
- package/dist/src/ui/commands/extensionsCommand.js.map +1 -0
- package/dist/src/ui/commands/ideCommand.d.ts +8 -0
- package/dist/src/ui/commands/ideCommand.js +123 -0
- package/dist/src/ui/commands/ideCommand.js.map +1 -0
- package/dist/src/{providers/ProviderAwareContentGenerator.d.ts → ui/commands/keyCommand.d.ts} +2 -1
- package/dist/src/ui/commands/keyCommand.js +29 -0
- package/dist/src/ui/commands/keyCommand.js.map +1 -0
- package/dist/src/ui/commands/keyfileCommand.d.ts +7 -0
- package/dist/src/ui/commands/keyfileCommand.js +104 -0
- package/dist/src/ui/commands/keyfileCommand.js.map +1 -0
- package/dist/src/ui/commands/mcpCommand.d.ts +7 -0
- package/dist/src/ui/commands/mcpCommand.js +204 -0
- package/dist/src/ui/commands/mcpCommand.js.map +1 -0
- package/dist/src/ui/commands/modelCommand.d.ts +7 -0
- package/dist/src/ui/commands/modelCommand.js +60 -0
- package/dist/src/ui/commands/modelCommand.js.map +1 -0
- package/dist/src/ui/commands/providerCommand.d.ts +7 -0
- package/dist/src/ui/commands/providerCommand.js +86 -0
- package/dist/src/ui/commands/providerCommand.js.map +1 -0
- package/dist/src/ui/commands/quitCommand.d.ts +7 -0
- package/dist/src/ui/commands/quitCommand.js +32 -0
- package/dist/src/ui/commands/quitCommand.js.map +1 -0
- package/dist/src/ui/commands/restoreCommand.d.ts +8 -0
- package/dist/src/ui/commands/restoreCommand.js +126 -0
- package/dist/src/ui/commands/restoreCommand.js.map +1 -0
- package/dist/src/ui/commands/statsCommand.d.ts +7 -0
- package/dist/src/ui/commands/statsCommand.js +50 -0
- package/dist/src/ui/commands/statsCommand.js.map +1 -0
- package/dist/src/ui/commands/toolsCommand.d.ts +7 -0
- package/dist/src/ui/commands/toolsCommand.js +54 -0
- package/dist/src/ui/commands/toolsCommand.js.map +1 -0
- package/dist/src/ui/commands/types.d.ts +34 -2
- package/dist/src/ui/components/ContextSummaryDisplay.d.ts +6 -1
- package/dist/src/ui/components/ContextSummaryDisplay.js +46 -19
- package/dist/src/ui/components/ContextSummaryDisplay.js.map +1 -1
- package/dist/src/ui/components/Footer.d.ts +0 -1
- package/dist/src/ui/components/Footer.js +3 -21
- package/dist/src/ui/components/Footer.js.map +1 -1
- package/dist/src/ui/components/InputPrompt.js +110 -61
- package/dist/src/ui/components/InputPrompt.js.map +1 -1
- package/dist/src/ui/components/ProviderModelDialog.d.ts +1 -1
- package/dist/src/ui/components/ThemeDialog.js +25 -24
- package/dist/src/ui/components/ThemeDialog.js.map +1 -1
- package/dist/src/ui/components/messages/ToolGroupMessage.js +3 -1
- package/dist/src/ui/components/messages/ToolGroupMessage.js.map +1 -1
- package/dist/src/ui/components/shared/MaxSizedBox.js +69 -2
- package/dist/src/ui/components/shared/MaxSizedBox.js.map +1 -1
- package/dist/src/ui/components/shared/RadioButtonSelect.d.ts +3 -1
- package/dist/src/ui/components/shared/RadioButtonSelect.js +60 -10
- package/dist/src/ui/components/shared/RadioButtonSelect.js.map +1 -1
- package/dist/src/ui/components/shared/text-buffer.js +1 -1
- package/dist/src/ui/components/shared/text-buffer.js.map +1 -1
- package/dist/src/ui/constants.d.ts +1 -0
- package/dist/src/ui/constants.js +1 -0
- package/dist/src/ui/constants.js.map +1 -1
- package/dist/src/ui/containers/SessionController.js +1 -1
- package/dist/src/ui/containers/SessionController.js.map +1 -1
- package/dist/src/ui/contexts/OpenAIProviderContext.d.ts +1 -2
- package/dist/src/ui/contexts/OpenAIProviderContext.js.map +1 -1
- package/dist/src/ui/hooks/shellCommandProcessor.d.ts +1 -1
- package/dist/src/ui/hooks/shellCommandProcessor.js +35 -11
- package/dist/src/ui/hooks/shellCommandProcessor.js.map +1 -1
- package/dist/src/ui/hooks/slashCommandProcessor.d.ts +2 -9
- package/dist/src/ui/hooks/slashCommandProcessor.js +83 -622
- package/dist/src/ui/hooks/slashCommandProcessor.js.map +1 -1
- package/dist/src/ui/hooks/useAuthCommand.js +16 -2
- package/dist/src/ui/hooks/useAuthCommand.js.map +1 -1
- package/dist/src/ui/hooks/useCompletion.d.ts +1 -0
- package/dist/src/ui/hooks/useCompletion.js +21 -2
- package/dist/src/ui/hooks/useCompletion.js.map +1 -1
- package/dist/src/ui/hooks/useFocus.d.ts +6 -0
- package/dist/src/ui/hooks/useFocus.js +41 -0
- package/dist/src/ui/hooks/useFocus.js.map +1 -0
- package/dist/src/ui/hooks/useGeminiStream.js +34 -2
- package/dist/src/ui/hooks/useGeminiStream.js.map +1 -1
- package/dist/src/ui/hooks/useOpenAIProviderInfo.d.ts +3 -2
- package/dist/src/ui/hooks/useOpenAIProviderInfo.js +5 -4
- package/dist/src/ui/hooks/useOpenAIProviderInfo.js.map +1 -1
- package/dist/src/ui/hooks/usePrivacySettings.js +5 -5
- package/dist/src/ui/hooks/usePrivacySettings.js.map +1 -1
- package/dist/src/ui/hooks/useProviderDialog.d.ts +5 -2
- package/dist/src/ui/hooks/useProviderDialog.js +55 -3
- package/dist/src/ui/hooks/useProviderDialog.js.map +1 -1
- package/dist/src/ui/hooks/useProviderModelDialog.d.ts +1 -1
- package/dist/src/ui/themes/ansi-light.js +1 -1
- package/dist/src/ui/themes/ansi-light.js.map +1 -1
- package/dist/src/ui/themes/googlecode.js +1 -1
- package/dist/src/ui/themes/googlecode.js.map +1 -1
- package/dist/src/ui/themes/xcode.js +1 -1
- package/dist/src/ui/themes/xcode.js.map +1 -1
- package/dist/src/ui/types.d.ts +10 -0
- package/dist/src/ui/types.js.map +1 -1
- package/dist/src/ui/utils/updateCheck.js +10 -6
- package/dist/src/ui/utils/updateCheck.js.map +1 -1
- package/dist/src/utils/userStartupWarnings.js +1 -16
- package/dist/src/utils/userStartupWarnings.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +5 -5
- package/dist/src/providers/IMessage.d.ts +0 -38
- package/dist/src/providers/IMessage.js +0 -17
- package/dist/src/providers/IMessage.js.map +0 -1
- package/dist/src/providers/IModel.d.ts +0 -23
- package/dist/src/providers/IModel.js +0 -17
- package/dist/src/providers/IModel.js.map +0 -1
- package/dist/src/providers/IProvider.d.ts +0 -32
- package/dist/src/providers/IProvider.js +0 -17
- package/dist/src/providers/IProvider.js.map +0 -1
- package/dist/src/providers/ITool.d.ts +0 -23
- package/dist/src/providers/ITool.js +0 -17
- package/dist/src/providers/ITool.js.map +0 -1
- package/dist/src/providers/ProviderAwareContentGenerator.js +0 -9
- package/dist/src/providers/ProviderAwareContentGenerator.js.map +0 -1
- package/dist/src/providers/ProviderManager.d.ts +0 -19
- package/dist/src/providers/ProviderManager.js +0 -63
- package/dist/src/providers/ProviderManager.js.map +0 -1
- package/dist/src/providers/ProviderManagerAdapter.d.ts +0 -17
- package/dist/src/providers/ProviderManagerAdapter.js +0 -113
- package/dist/src/providers/ProviderManagerAdapter.js.map +0 -1
- package/dist/src/providers/README-qwen3.md +0 -60
- package/dist/src/providers/adapters/IStreamAdapter.d.ts +0 -18
- package/dist/src/providers/adapters/IStreamAdapter.js +0 -7
- package/dist/src/providers/adapters/IStreamAdapter.js.map +0 -1
- package/dist/src/providers/anthropic/AnthropicProvider.d.ts +0 -46
- package/dist/src/providers/anthropic/AnthropicProvider.js +0 -478
- package/dist/src/providers/anthropic/AnthropicProvider.js.map +0 -1
- package/dist/src/providers/contentGeneratorProvider.d.ts +0 -13
- package/dist/src/providers/contentGeneratorProvider.js +0 -17
- package/dist/src/providers/contentGeneratorProvider.js.map +0 -1
- package/dist/src/providers/gemini/GeminiProvider.d.ts +0 -72
- package/dist/src/providers/gemini/GeminiProvider.js +0 -454
- package/dist/src/providers/gemini/GeminiProvider.js.map +0 -1
- package/dist/src/providers/integration/TEST_INSTRUCTIONS.md +0 -197
- package/dist/src/providers/openai/ConversationCache.d.ts +0 -20
- package/dist/src/providers/openai/ConversationCache.js +0 -109
- package/dist/src/providers/openai/ConversationCache.js.map +0 -1
- package/dist/src/providers/openai/IChatGenerateParams.d.ts +0 -11
- package/dist/src/providers/openai/IChatGenerateParams.js +0 -2
- package/dist/src/providers/openai/IChatGenerateParams.js.map +0 -1
- package/dist/src/providers/openai/OpenAIProvider.d.ts +0 -71
- package/dist/src/providers/openai/OpenAIProvider.js +0 -486
- package/dist/src/providers/openai/OpenAIProvider.js.map +0 -1
- package/dist/src/providers/openai/Qwen3FireworksProvider.d.ts +0 -39
- package/dist/src/providers/openai/Qwen3FireworksProvider.js +0 -209
- package/dist/src/providers/openai/Qwen3FireworksProvider.js.map +0 -1
- package/dist/src/providers/openai/RESPONSES_API_MODELS.d.ts +0 -2
- package/dist/src/providers/openai/RESPONSES_API_MODELS.js +0 -14
- package/dist/src/providers/openai/RESPONSES_API_MODELS.js.map +0 -1
- package/dist/src/providers/openai/buildResponsesRequest.d.ts +0 -67
- package/dist/src/providers/openai/buildResponsesRequest.js +0 -144
- package/dist/src/providers/openai/buildResponsesRequest.js.map +0 -1
- package/dist/src/providers/openai/docs/accessing-provider-info.md +0 -172
- package/dist/src/providers/openai/docs/params-mapping.md +0 -91
- package/dist/src/providers/openai/docs/qwen3-fireworks.md +0 -47
- package/dist/src/providers/openai/docs/responses-api-tool-calls.md +0 -96
- package/dist/src/providers/openai/estimateRemoteTokens.d.ts +0 -26
- package/dist/src/providers/openai/estimateRemoteTokens.js +0 -75
- package/dist/src/providers/openai/estimateRemoteTokens.js.map +0 -1
- package/dist/src/providers/openai/getOpenAIProviderInfo.d.ts +0 -46
- package/dist/src/providers/openai/getOpenAIProviderInfo.js +0 -74
- package/dist/src/providers/openai/getOpenAIProviderInfo.js.map +0 -1
- package/dist/src/providers/openai/parseResponsesStream.d.ts +0 -3
- package/dist/src/providers/openai/parseResponsesStream.js +0 -444
- package/dist/src/providers/openai/parseResponsesStream.js.map +0 -1
- package/dist/src/providers/parsers/TextToolCallParser.d.ts +0 -35
- package/dist/src/providers/parsers/TextToolCallParser.js +0 -248
- package/dist/src/providers/parsers/TextToolCallParser.js.map +0 -1
- package/dist/src/providers/tokenizers/AnthropicTokenizer.d.ts +0 -19
- package/dist/src/providers/tokenizers/AnthropicTokenizer.js +0 -37
- package/dist/src/providers/tokenizers/AnthropicTokenizer.js.map +0 -1
- package/dist/src/providers/tokenizers/ITokenizer.d.ts +0 -18
- package/dist/src/providers/tokenizers/ITokenizer.js +0 -17
- package/dist/src/providers/tokenizers/ITokenizer.js.map +0 -1
- package/dist/src/providers/tokenizers/OpenAITokenizer.d.ts +0 -24
- package/dist/src/providers/tokenizers/OpenAITokenizer.js +0 -56
- package/dist/src/providers/tokenizers/OpenAITokenizer.js.map +0 -1
- package/dist/src/tools/IToolFormatter.d.ts +0 -40
- package/dist/src/tools/IToolFormatter.js +0 -17
- package/dist/src/tools/IToolFormatter.js.map +0 -1
- package/dist/src/tools/ToolFormatter.d.ts +0 -45
- package/dist/src/tools/ToolFormatter.js +0 -216
- package/dist/src/tools/ToolFormatter.js.map +0 -1
- 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":"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"}
|
@@ -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,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,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,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"}
|