@vybestack/llxprt-code 0.1.19-alpha → 0.1.19-beta
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/package.json +3 -3
- package/dist/src/config/auth.js +5 -0
- package/dist/src/config/auth.js.map +1 -1
- package/dist/src/config/config.js +32 -24
- package/dist/src/config/config.js.map +1 -1
- package/dist/src/config/keyBindings.d.ts +64 -0
- package/dist/src/config/keyBindings.js +137 -0
- package/dist/src/config/keyBindings.js.map +1 -0
- package/dist/src/config/settings.d.ts +1 -0
- package/dist/src/config/settings.js.map +1 -1
- package/dist/src/gemini.js +9 -2
- 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/providers/logging/git-stats-service-impl.d.ts +19 -0
- package/dist/src/providers/logging/git-stats-service-impl.js +25 -0
- package/dist/src/providers/logging/git-stats-service-impl.js.map +1 -0
- package/dist/src/providers/logging/git-stats.d.ts +43 -0
- package/dist/src/providers/logging/git-stats.js +137 -0
- package/dist/src/providers/logging/git-stats.js.map +1 -0
- package/dist/src/providers/providerManagerInstance.js +4 -0
- package/dist/src/providers/providerManagerInstance.js.map +1 -1
- package/dist/src/services/BuiltinCommandLoader.js +2 -0
- package/dist/src/services/BuiltinCommandLoader.js.map +1 -1
- package/dist/src/services/todo-continuation/todoContinuationService.d.ts +172 -0
- package/dist/src/services/todo-continuation/todoContinuationService.js +387 -0
- package/dist/src/services/todo-continuation/todoContinuationService.js.map +1 -0
- package/dist/src/services/todo-continuation/todoContinuationService.spec.d.ts +6 -0
- package/dist/src/services/todo-continuation/todoContinuationService.spec.js +385 -0
- package/dist/src/services/todo-continuation/todoContinuationService.spec.js.map +1 -0
- package/dist/src/ui/App.js +61 -25
- package/dist/src/ui/App.js.map +1 -1
- package/dist/src/ui/colors.d.ts +5 -0
- package/dist/src/ui/colors.js +51 -0
- package/dist/src/ui/colors.js.map +1 -1
- package/dist/src/ui/commands/chatCommand.js +16 -0
- package/dist/src/ui/commands/chatCommand.js.map +1 -1
- package/dist/src/ui/commands/ideCommand.js +67 -31
- package/dist/src/ui/commands/ideCommand.js.map +1 -1
- package/dist/src/ui/commands/loggingCommand.d.ts +15 -0
- package/dist/src/ui/commands/loggingCommand.js +421 -0
- package/dist/src/ui/commands/loggingCommand.js.map +1 -0
- package/dist/src/ui/commands/privacyCommand.d.ts +3 -0
- package/dist/src/ui/commands/privacyCommand.js +6 -3
- package/dist/src/ui/commands/privacyCommand.js.map +1 -1
- package/dist/src/ui/commands/types.d.ts +14 -2
- package/dist/src/ui/commands/types.js.map +1 -1
- package/dist/src/ui/components/ContextUsageDisplay.js +14 -2
- package/dist/src/ui/components/ContextUsageDisplay.js.map +1 -1
- package/dist/src/ui/components/FolderTrustDialog.d.ts +16 -0
- package/dist/src/ui/components/FolderTrustDialog.js +38 -0
- package/dist/src/ui/components/FolderTrustDialog.js.map +1 -0
- package/dist/src/ui/components/Footer.d.ts +0 -1
- package/dist/src/ui/components/Footer.js +136 -16
- package/dist/src/ui/components/Footer.js.map +1 -1
- package/dist/src/ui/components/InputPrompt.js +32 -28
- package/dist/src/ui/components/InputPrompt.js.map +1 -1
- package/dist/src/ui/components/LoggingDialog.d.ts +37 -0
- package/dist/src/ui/components/LoggingDialog.js +155 -0
- package/dist/src/ui/components/LoggingDialog.js.map +1 -0
- package/dist/src/ui/components/MemoryUsageDisplay.js +6 -4
- package/dist/src/ui/components/MemoryUsageDisplay.js.map +1 -1
- package/dist/src/ui/components/ProviderDialog.js +100 -26
- package/dist/src/ui/components/ProviderDialog.js.map +1 -1
- package/dist/src/ui/components/ProviderModelDialog.js +99 -27
- package/dist/src/ui/components/ProviderModelDialog.js.map +1 -1
- package/dist/src/ui/components/TodoPanel.js +93 -18
- package/dist/src/ui/components/TodoPanel.js.map +1 -1
- package/dist/src/ui/components/messages/ToolConfirmationMessage.js +85 -7
- package/dist/src/ui/components/messages/ToolConfirmationMessage.js.map +1 -1
- package/dist/src/ui/contexts/SettingsContext.d.ts +9 -0
- package/dist/src/ui/contexts/SettingsContext.js +15 -0
- package/dist/src/ui/contexts/SettingsContext.js.map +1 -0
- package/dist/src/ui/hooks/atCommandProcessor.js +21 -0
- package/dist/src/ui/hooks/atCommandProcessor.js.map +1 -1
- package/dist/src/ui/hooks/slashCommandProcessor.d.ts +5 -1
- package/dist/src/ui/hooks/slashCommandProcessor.js +137 -112
- package/dist/src/ui/hooks/slashCommandProcessor.js.map +1 -1
- package/dist/src/ui/hooks/useConsoleMessages.js +7 -0
- package/dist/src/ui/hooks/useConsoleMessages.js.map +1 -1
- package/dist/src/ui/hooks/useFolderTrust.d.ts +11 -0
- package/dist/src/ui/hooks/useFolderTrust.js +22 -0
- package/dist/src/ui/hooks/useFolderTrust.js.map +1 -0
- package/dist/src/ui/hooks/useGeminiStream.js +14 -3
- package/dist/src/ui/hooks/useGeminiStream.js.map +1 -1
- package/dist/src/ui/hooks/useResponsive.d.ts +14 -0
- package/dist/src/ui/hooks/useResponsive.js +19 -0
- package/dist/src/ui/hooks/useResponsive.js.map +1 -0
- package/dist/src/ui/hooks/useTodoContinuation.d.ts +31 -0
- package/dist/src/ui/hooks/useTodoContinuation.js +148 -0
- package/dist/src/ui/hooks/useTodoContinuation.js.map +1 -0
- package/dist/src/ui/hooks/useTodoContinuation.spec.d.ts +6 -0
- package/dist/src/ui/hooks/useTodoContinuation.spec.js +378 -0
- package/dist/src/ui/hooks/useTodoContinuation.spec.js.map +1 -0
- package/dist/src/ui/keyMatchers.d.ts +26 -0
- package/dist/src/ui/keyMatchers.js +68 -0
- package/dist/src/ui/keyMatchers.js.map +1 -0
- package/dist/src/ui/privacy/PrivacyNotice.js +10 -4
- package/dist/src/ui/privacy/PrivacyNotice.js.map +1 -1
- package/dist/src/ui/themes/semantic-resolver.d.ts +12 -0
- package/dist/src/ui/themes/semantic-resolver.js +32 -0
- package/dist/src/ui/themes/semantic-resolver.js.map +1 -0
- package/dist/src/ui/themes/semantic-tokens.d.ts +52 -0
- package/dist/src/ui/themes/semantic-tokens.js +7 -0
- package/dist/src/ui/themes/semantic-tokens.js.map +1 -0
- package/dist/src/ui/themes/theme-compat.d.ts +34 -0
- package/dist/src/ui/themes/theme-compat.js +65 -0
- package/dist/src/ui/themes/theme-compat.js.map +1 -0
- package/dist/src/ui/themes/theme-manager.d.ts +8 -0
- package/dist/src/ui/themes/theme-manager.js +18 -0
- package/dist/src/ui/themes/theme-manager.js.map +1 -1
- package/dist/src/ui/utils/CodeColorizer.d.ts +2 -1
- package/dist/src/ui/utils/CodeColorizer.js +4 -3
- package/dist/src/ui/utils/CodeColorizer.js.map +1 -1
- package/dist/src/ui/utils/MarkdownDisplay.js +4 -2
- package/dist/src/ui/utils/MarkdownDisplay.js.map +1 -1
- package/dist/src/ui/utils/responsive.d.ts +16 -0
- package/dist/src/ui/utils/responsive.js +111 -0
- package/dist/src/ui/utils/responsive.js.map +1 -0
- package/dist/src/utils/cleanup.d.ts +2 -2
- package/dist/src/utils/cleanup.js +2 -2
- package/dist/src/utils/cleanup.js.map +1 -1
- package/dist/src/utils/privacy/ConversationDataRedactor.d.ts +75 -0
- package/dist/src/utils/privacy/ConversationDataRedactor.js +412 -0
- package/dist/src/utils/privacy/ConversationDataRedactor.js.map +1 -0
- package/dist/src/utils/privacy/PrivacyManager.d.ts +58 -0
- package/dist/src/utils/privacy/PrivacyManager.js +133 -0
- package/dist/src/utils/privacy/PrivacyManager.js.map +1 -0
- package/dist/src/utils/sandbox.js +10 -0
- package/dist/src/utils/sandbox.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +3 -3
- package/dist/src/ui/components/IDEContextDetailDisplay.d.ts +0 -12
- package/dist/src/ui/components/IDEContextDetailDisplay.js +0 -30
- package/dist/src/ui/components/IDEContextDetailDisplay.js.map +0 -1
@@ -0,0 +1,421 @@
|
|
1
|
+
/**
|
2
|
+
* @license
|
3
|
+
* Copyright 2025 Vybestack LLC
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
5
|
+
*/
|
6
|
+
import { CommandKind, } from './types.js';
|
7
|
+
import { SettingScope } from '../../config/settings.js';
|
8
|
+
import * as fs from 'fs/promises';
|
9
|
+
import * as path from 'path';
|
10
|
+
import * as os from 'os';
|
11
|
+
function isLogEntry(obj) {
|
12
|
+
return (typeof obj === 'object' &&
|
13
|
+
obj !== null &&
|
14
|
+
'timestamp' in obj &&
|
15
|
+
'type' in obj &&
|
16
|
+
'provider' in obj &&
|
17
|
+
typeof obj.timestamp === 'string' &&
|
18
|
+
typeof obj.type === 'string' &&
|
19
|
+
typeof obj.provider === 'string');
|
20
|
+
}
|
21
|
+
export async function handleLoggingCommand(args, context) {
|
22
|
+
const subcommand = args[0];
|
23
|
+
switch (subcommand) {
|
24
|
+
case 'status':
|
25
|
+
return handleLoggingStatus(context);
|
26
|
+
case 'enable':
|
27
|
+
return handleEnableLogging(args.slice(1), context);
|
28
|
+
case 'disable':
|
29
|
+
return handleDisableLogging(context);
|
30
|
+
case 'redaction':
|
31
|
+
return handleRedactionSettings(args.slice(1), context);
|
32
|
+
case 'show':
|
33
|
+
return handleShowLogs(args.slice(1), context);
|
34
|
+
default:
|
35
|
+
return {
|
36
|
+
type: 'message',
|
37
|
+
messageType: 'error',
|
38
|
+
content: `Unknown logging subcommand: ${subcommand}. Available: status, enable, disable, redaction, show`,
|
39
|
+
};
|
40
|
+
}
|
41
|
+
}
|
42
|
+
async function handleLoggingStatus(context) {
|
43
|
+
// Read directly from settings, not from cached Config
|
44
|
+
const isLoggingEnabled = context.settings.merged.telemetry?.logConversations ?? false;
|
45
|
+
const status = `Conversation Logging: ${isLoggingEnabled ? 'Enabled' : 'Disabled'}`;
|
46
|
+
return {
|
47
|
+
type: 'message',
|
48
|
+
messageType: 'info',
|
49
|
+
content: status,
|
50
|
+
};
|
51
|
+
}
|
52
|
+
async function handleEnableLogging(_args, context) {
|
53
|
+
// Enable conversation logging through settings
|
54
|
+
const currentTelemetry = context.settings.merged.telemetry || {};
|
55
|
+
context.settings.setValue(SettingScope.User, 'telemetry', {
|
56
|
+
...currentTelemetry,
|
57
|
+
logConversations: true,
|
58
|
+
});
|
59
|
+
// Update the Config to reflect the new setting
|
60
|
+
context.config.updateTelemetrySettings({
|
61
|
+
...context.config.getTelemetrySettings(),
|
62
|
+
logConversations: true,
|
63
|
+
});
|
64
|
+
return {
|
65
|
+
type: 'message',
|
66
|
+
messageType: 'info',
|
67
|
+
content: 'Conversation logging enabled. Data stored locally only.',
|
68
|
+
};
|
69
|
+
}
|
70
|
+
async function handleDisableLogging(context) {
|
71
|
+
const currentTelemetry = context.settings.merged.telemetry || {};
|
72
|
+
context.settings.setValue(SettingScope.User, 'telemetry', {
|
73
|
+
...currentTelemetry,
|
74
|
+
logConversations: false,
|
75
|
+
});
|
76
|
+
// Update the Config to reflect the new setting
|
77
|
+
context.config.updateTelemetrySettings({
|
78
|
+
...context.config.getTelemetrySettings(),
|
79
|
+
logConversations: false,
|
80
|
+
});
|
81
|
+
return {
|
82
|
+
type: 'message',
|
83
|
+
messageType: 'info',
|
84
|
+
content: 'Conversation logging disabled. No conversation data will be collected.',
|
85
|
+
};
|
86
|
+
}
|
87
|
+
async function handleShowLogs(args, context) {
|
88
|
+
// Parse number of lines from args (default to 50)
|
89
|
+
const numLines = args[0] ? parseInt(args[0], 10) : 50;
|
90
|
+
if (isNaN(numLines) || numLines < 1) {
|
91
|
+
return {
|
92
|
+
type: 'message',
|
93
|
+
messageType: 'error',
|
94
|
+
content: 'Invalid number of lines. Please provide a positive number.',
|
95
|
+
};
|
96
|
+
}
|
97
|
+
// Get the log path from config
|
98
|
+
const logPath = context.config.getConversationLogPath();
|
99
|
+
const expandedPath = logPath.replace('~', os.homedir());
|
100
|
+
try {
|
101
|
+
// Find all log files
|
102
|
+
const files = await fs.readdir(expandedPath);
|
103
|
+
const logFiles = files
|
104
|
+
.filter((file) => file.endsWith('.jsonl'))
|
105
|
+
.sort()
|
106
|
+
.reverse();
|
107
|
+
if (logFiles.length === 0) {
|
108
|
+
return {
|
109
|
+
type: 'dialog',
|
110
|
+
dialog: 'logging',
|
111
|
+
dialogData: { entries: [] },
|
112
|
+
};
|
113
|
+
}
|
114
|
+
// Read and parse log entries from all recent files
|
115
|
+
const allEntries = [];
|
116
|
+
let remainingLines = numLines;
|
117
|
+
for (const logFile of logFiles) {
|
118
|
+
if (remainingLines <= 0)
|
119
|
+
break;
|
120
|
+
const filePath = path.join(expandedPath, logFile);
|
121
|
+
const content = await fs.readFile(filePath, 'utf-8');
|
122
|
+
const lines = content.split('\n').filter((line) => line.trim());
|
123
|
+
// Read from the end of the file
|
124
|
+
const startIndex = Math.max(0, lines.length - remainingLines);
|
125
|
+
const fileLines = lines.slice(startIndex);
|
126
|
+
for (const line of fileLines) {
|
127
|
+
try {
|
128
|
+
const parsed = JSON.parse(line);
|
129
|
+
allEntries.push(parsed);
|
130
|
+
}
|
131
|
+
catch {
|
132
|
+
// Skip invalid JSON lines
|
133
|
+
}
|
134
|
+
}
|
135
|
+
remainingLines -= fileLines.length;
|
136
|
+
}
|
137
|
+
// Return dialog with entries
|
138
|
+
return {
|
139
|
+
type: 'dialog',
|
140
|
+
dialog: 'logging',
|
141
|
+
dialogData: { entries: allEntries.slice(-numLines) },
|
142
|
+
};
|
143
|
+
}
|
144
|
+
catch (error) {
|
145
|
+
if (error.code === 'ENOENT') {
|
146
|
+
return {
|
147
|
+
type: 'message',
|
148
|
+
messageType: 'error',
|
149
|
+
content: `Log directory not found: ${logPath}\nCreating directory and starting logging...`,
|
150
|
+
};
|
151
|
+
}
|
152
|
+
return {
|
153
|
+
type: 'message',
|
154
|
+
messageType: 'error',
|
155
|
+
content: `Error reading logs: ${error instanceof Error ? error.message : String(error)}`,
|
156
|
+
};
|
157
|
+
}
|
158
|
+
}
|
159
|
+
async function handleRedactionSettings(args, context) {
|
160
|
+
if (args.length === 0) {
|
161
|
+
// Show current redaction settings
|
162
|
+
const redactionConfig = context.config.getRedactionConfig();
|
163
|
+
const settings = [
|
164
|
+
'Current Redaction Settings:',
|
165
|
+
` • API Keys: ${redactionConfig.redactApiKeys ? 'Enabled' : 'Disabled'}`,
|
166
|
+
` • Credentials: ${redactionConfig.redactCredentials ? 'Enabled' : 'Disabled'}`,
|
167
|
+
` • File Paths: ${redactionConfig.redactFilePaths ? 'Enabled' : 'Disabled'}`,
|
168
|
+
` • URLs: ${redactionConfig.redactUrls ? 'Enabled' : 'Disabled'}`,
|
169
|
+
` • Email Addresses: ${redactionConfig.redactEmails ? 'Enabled' : 'Disabled'}`,
|
170
|
+
` • Personal Info: ${redactionConfig.redactPersonalInfo ? 'Enabled' : 'Disabled'}`,
|
171
|
+
'',
|
172
|
+
'To modify settings:',
|
173
|
+
' /logging redaction --api-keys=false',
|
174
|
+
' /logging redaction --file-paths=true',
|
175
|
+
].join('\n');
|
176
|
+
return {
|
177
|
+
type: 'message',
|
178
|
+
messageType: 'info',
|
179
|
+
content: settings,
|
180
|
+
};
|
181
|
+
}
|
182
|
+
// Parse redaction setting changes
|
183
|
+
const updates = {};
|
184
|
+
for (const arg of args) {
|
185
|
+
const [key, value] = arg.replace('--', '').split('=');
|
186
|
+
const boolValue = value === 'true';
|
187
|
+
switch (key) {
|
188
|
+
case 'api-keys':
|
189
|
+
updates.redactSensitiveData = boolValue; // Maps to existing setting
|
190
|
+
break;
|
191
|
+
case 'credentials':
|
192
|
+
updates.redactSensitiveData = boolValue; // Maps to existing setting
|
193
|
+
break;
|
194
|
+
case 'file-paths':
|
195
|
+
updates.redactFilePaths = boolValue;
|
196
|
+
break;
|
197
|
+
case 'urls':
|
198
|
+
updates.redactUrls = boolValue;
|
199
|
+
break;
|
200
|
+
case 'emails':
|
201
|
+
updates.redactEmails = boolValue;
|
202
|
+
break;
|
203
|
+
case 'personal-info':
|
204
|
+
updates.redactPersonalInfo = boolValue;
|
205
|
+
break;
|
206
|
+
default:
|
207
|
+
// Unknown key, ignore
|
208
|
+
break;
|
209
|
+
}
|
210
|
+
}
|
211
|
+
if (Object.keys(updates).length === 0) {
|
212
|
+
return {
|
213
|
+
type: 'message',
|
214
|
+
messageType: 'error',
|
215
|
+
content: 'No valid redaction settings provided. Use format: --api-keys=true',
|
216
|
+
};
|
217
|
+
}
|
218
|
+
// Update telemetry settings
|
219
|
+
const currentTelemetry = context.settings.merged.telemetry || {};
|
220
|
+
context.settings.setValue(SettingScope.User, 'telemetry', {
|
221
|
+
...currentTelemetry,
|
222
|
+
...updates,
|
223
|
+
});
|
224
|
+
const changes = Object.entries(updates)
|
225
|
+
.map(([key, value]) => ` • ${key}: ${value ? 'enabled' : 'disabled'}`)
|
226
|
+
.join('\n');
|
227
|
+
return {
|
228
|
+
type: 'message',
|
229
|
+
messageType: 'info',
|
230
|
+
content: `Redaction settings updated:\n${changes}`,
|
231
|
+
};
|
232
|
+
}
|
233
|
+
// Subcommands for logging
|
234
|
+
const statusCommand = {
|
235
|
+
name: 'status',
|
236
|
+
description: 'show current logging status',
|
237
|
+
kind: CommandKind.BUILT_IN,
|
238
|
+
action: async (context) => {
|
239
|
+
if (!context.services.config) {
|
240
|
+
context.ui.addItem({
|
241
|
+
type: 'error',
|
242
|
+
text: 'Configuration not available',
|
243
|
+
}, Date.now());
|
244
|
+
return;
|
245
|
+
}
|
246
|
+
const result = await handleLoggingStatus({
|
247
|
+
config: context.services.config,
|
248
|
+
settings: context.services.settings,
|
249
|
+
});
|
250
|
+
if (result.type === 'message') {
|
251
|
+
context.ui.addItem({
|
252
|
+
type: result.messageType,
|
253
|
+
text: result.content,
|
254
|
+
}, Date.now());
|
255
|
+
}
|
256
|
+
},
|
257
|
+
};
|
258
|
+
const enableCommand = {
|
259
|
+
name: 'enable',
|
260
|
+
description: 'enable conversation logging',
|
261
|
+
kind: CommandKind.BUILT_IN,
|
262
|
+
action: async (context, args) => {
|
263
|
+
if (!context.services.config) {
|
264
|
+
context.ui.addItem({
|
265
|
+
type: 'error',
|
266
|
+
text: 'Configuration not available',
|
267
|
+
}, Date.now());
|
268
|
+
return;
|
269
|
+
}
|
270
|
+
const argsArray = args ? args.split(/\s+/) : [];
|
271
|
+
const result = await handleEnableLogging(argsArray, {
|
272
|
+
config: context.services.config,
|
273
|
+
settings: context.services.settings,
|
274
|
+
});
|
275
|
+
if (result.type === 'message') {
|
276
|
+
context.ui.addItem({
|
277
|
+
type: result.messageType,
|
278
|
+
text: result.content,
|
279
|
+
}, Date.now());
|
280
|
+
}
|
281
|
+
},
|
282
|
+
};
|
283
|
+
const disableCommand = {
|
284
|
+
name: 'disable',
|
285
|
+
description: 'disable conversation logging',
|
286
|
+
kind: CommandKind.BUILT_IN,
|
287
|
+
action: async (context) => {
|
288
|
+
if (!context.services.config) {
|
289
|
+
context.ui.addItem({
|
290
|
+
type: 'error',
|
291
|
+
text: 'Configuration not available',
|
292
|
+
}, Date.now());
|
293
|
+
return;
|
294
|
+
}
|
295
|
+
const result = await handleDisableLogging({
|
296
|
+
config: context.services.config,
|
297
|
+
settings: context.services.settings,
|
298
|
+
});
|
299
|
+
if (result.type === 'message') {
|
300
|
+
context.ui.addItem({
|
301
|
+
type: result.messageType,
|
302
|
+
text: result.content,
|
303
|
+
}, Date.now());
|
304
|
+
}
|
305
|
+
},
|
306
|
+
};
|
307
|
+
const redactionCommand = {
|
308
|
+
name: 'redaction',
|
309
|
+
description: 'configure data redaction settings',
|
310
|
+
kind: CommandKind.BUILT_IN,
|
311
|
+
action: async (context, args) => {
|
312
|
+
if (!context.services.config) {
|
313
|
+
context.ui.addItem({
|
314
|
+
type: 'error',
|
315
|
+
text: 'Configuration not available',
|
316
|
+
}, Date.now());
|
317
|
+
return;
|
318
|
+
}
|
319
|
+
const argsArray = args ? args.split(/\s+/) : [];
|
320
|
+
const result = await handleRedactionSettings(argsArray, {
|
321
|
+
config: context.services.config,
|
322
|
+
settings: context.services.settings,
|
323
|
+
});
|
324
|
+
if (result.type === 'message') {
|
325
|
+
context.ui.addItem({
|
326
|
+
type: result.messageType,
|
327
|
+
text: result.content,
|
328
|
+
}, Date.now());
|
329
|
+
}
|
330
|
+
},
|
331
|
+
};
|
332
|
+
const showCommand = {
|
333
|
+
name: 'show',
|
334
|
+
description: 'show last N lines from conversation log (default 50)',
|
335
|
+
kind: CommandKind.BUILT_IN,
|
336
|
+
action: async (context, args) => {
|
337
|
+
if (!context.services.config) {
|
338
|
+
context.ui.addItem({
|
339
|
+
type: 'error',
|
340
|
+
text: 'Configuration not available',
|
341
|
+
}, Date.now());
|
342
|
+
return;
|
343
|
+
}
|
344
|
+
const argsArray = args ? args.split(/\s+/) : [];
|
345
|
+
const result = await handleShowLogs(argsArray, {
|
346
|
+
config: context.services.config,
|
347
|
+
settings: context.services.settings,
|
348
|
+
});
|
349
|
+
if (result.type === 'message') {
|
350
|
+
context.ui.addItem({
|
351
|
+
type: result.messageType,
|
352
|
+
text: result.content,
|
353
|
+
}, Date.now());
|
354
|
+
}
|
355
|
+
else if (result.type === 'dialog') {
|
356
|
+
// Format the log entries as text for now until dialog system is implemented
|
357
|
+
const entries = result.dialogData?.entries || [];
|
358
|
+
if (entries.length === 0) {
|
359
|
+
context.ui.addItem({
|
360
|
+
type: 'info',
|
361
|
+
text: 'No log entries found',
|
362
|
+
}, Date.now());
|
363
|
+
}
|
364
|
+
else {
|
365
|
+
// Format entries for display
|
366
|
+
const formattedEntries = entries
|
367
|
+
.filter(isLogEntry)
|
368
|
+
.map((entry, index) => {
|
369
|
+
const timestamp = new Date(entry.timestamp).toLocaleTimeString();
|
370
|
+
const typeIcon = entry.type === 'request' ? '→' : '←';
|
371
|
+
let content = '';
|
372
|
+
if (entry.type === 'request' && entry.messages) {
|
373
|
+
const lastMessage = entry.messages[entry.messages.length - 1];
|
374
|
+
if (lastMessage) {
|
375
|
+
content = lastMessage.content.substring(0, 100);
|
376
|
+
if (lastMessage.content.length > 100)
|
377
|
+
content += '...';
|
378
|
+
}
|
379
|
+
}
|
380
|
+
else if (entry.type === 'response' && entry.response) {
|
381
|
+
content = entry.response.substring(0, 100);
|
382
|
+
if (entry.response.length > 100)
|
383
|
+
content += '...';
|
384
|
+
}
|
385
|
+
return `[${index + 1}] ${timestamp} ${typeIcon} ${entry.provider}: ${content}`;
|
386
|
+
})
|
387
|
+
.join('\n');
|
388
|
+
context.ui.addItem({
|
389
|
+
type: 'info',
|
390
|
+
text: `Conversation Logs (${entries.length} entries):\n${'─'.repeat(60)}\n${formattedEntries}\n${'─'.repeat(60)}`,
|
391
|
+
}, Date.now());
|
392
|
+
}
|
393
|
+
return;
|
394
|
+
}
|
395
|
+
},
|
396
|
+
};
|
397
|
+
// Main logging command with subcommands
|
398
|
+
export const loggingCommand = {
|
399
|
+
name: 'logging',
|
400
|
+
description: 'manage conversation logging settings',
|
401
|
+
kind: CommandKind.BUILT_IN,
|
402
|
+
subCommands: [
|
403
|
+
statusCommand,
|
404
|
+
enableCommand,
|
405
|
+
disableCommand,
|
406
|
+
redactionCommand,
|
407
|
+
showCommand,
|
408
|
+
],
|
409
|
+
action: async (context, args) => {
|
410
|
+
// Default action shows status when no subcommand provided
|
411
|
+
if (!args || args.trim() === '') {
|
412
|
+
return statusCommand.action(context, '');
|
413
|
+
}
|
414
|
+
// If args provided but no subcommand matched, show help
|
415
|
+
context.ui.addItem({
|
416
|
+
type: 'info',
|
417
|
+
text: 'Available logging commands:\n status - show current status\n enable - enable logging\n disable - disable logging\n redaction - configure redaction\n show [N] - show last N lines from log (default 50)',
|
418
|
+
}, Date.now());
|
419
|
+
},
|
420
|
+
};
|
421
|
+
//# sourceMappingURL=loggingCommand.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"loggingCommand.js","sourceRoot":"","sources":["../../../../src/ui/commands/loggingCommand.ts"],"names":[],"mappings":"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"}
|
@@ -3,12 +3,15 @@
|
|
3
3
|
* Copyright 2025 Google LLC
|
4
4
|
* SPDX-License-Identifier: Apache-2.0
|
5
5
|
*/
|
6
|
-
import { CommandKind } from './types.js';
|
6
|
+
import { CommandKind, } from './types.js';
|
7
|
+
/**
|
8
|
+
* Privacy command - shows Google's privacy disclosure for the Gemini API
|
9
|
+
*/
|
7
10
|
export const privacyCommand = {
|
8
11
|
name: 'privacy',
|
9
|
-
description: '
|
12
|
+
description: 'view Gemini API privacy disclosure and terms',
|
10
13
|
kind: CommandKind.BUILT_IN,
|
11
|
-
action: () => ({
|
14
|
+
action: async (_context) => ({
|
12
15
|
type: 'dialog',
|
13
16
|
dialog: 'privacy',
|
14
17
|
}),
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"privacyCommand.js","sourceRoot":"","sources":["../../../../src/ui/commands/privacyCommand.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,
|
1
|
+
{"version":3,"file":"privacyCommand.js","sourceRoot":"","sources":["../../../../src/ui/commands/privacyCommand.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EACL,WAAW,GAIZ,MAAM,YAAY,CAAC;AAEpB;;GAEG;AACH,MAAM,CAAC,MAAM,cAAc,GAAiB;IAC1C,IAAI,EAAE,SAAS;IACf,WAAW,EAAE,8CAA8C;IAC3D,IAAI,EAAE,WAAW,CAAC,QAAQ;IAC1B,MAAM,EAAE,KAAK,EACX,QAAwB,EACS,EAAE,CAAC,CAAC;QACrC,IAAI,EAAE,QAAQ;QACd,MAAM,EAAE,SAAS;KAClB,CAAC;CACH,CAAC"}
|
@@ -3,6 +3,7 @@
|
|
3
3
|
* Copyright 2025 Google LLC
|
4
4
|
* SPDX-License-Identifier: Apache-2.0
|
5
5
|
*/
|
6
|
+
import { type ReactNode } from 'react';
|
6
7
|
import { Content } from '@google/genai';
|
7
8
|
import { HistoryItemWithoutId } from '../types.js';
|
8
9
|
import { Config, GitService, Logger } from '@vybestack/llxprt-code-core';
|
@@ -64,6 +65,7 @@ export interface CommandContext {
|
|
64
65
|
/** A transient list of shell commands the user has approved for this session. */
|
65
66
|
sessionShellAllowlist: Set<string>;
|
66
67
|
};
|
68
|
+
overwriteConfirmed?: boolean;
|
67
69
|
}
|
68
70
|
/**
|
69
71
|
* The return type for a command action that results in scheduling a tool call.
|
@@ -92,7 +94,8 @@ export interface MessageActionReturn {
|
|
92
94
|
*/
|
93
95
|
export interface OpenDialogActionReturn {
|
94
96
|
type: 'dialog';
|
95
|
-
dialog: 'help' | 'auth' | 'theme' | 'loadProfile' | 'editor' | 'privacy' | 'provider' | 'providerModel' | 'tools';
|
97
|
+
dialog: 'help' | 'auth' | 'theme' | 'loadProfile' | 'editor' | 'privacy' | 'provider' | 'providerModel' | 'tools' | 'logging';
|
98
|
+
dialogData?: unknown;
|
96
99
|
}
|
97
100
|
/**
|
98
101
|
* The return type for a command action that results in replacing
|
@@ -124,7 +127,16 @@ export interface ConfirmShellCommandsActionReturn {
|
|
124
127
|
raw: string;
|
125
128
|
};
|
126
129
|
}
|
127
|
-
export
|
130
|
+
export interface ConfirmActionReturn {
|
131
|
+
type: 'confirm_action';
|
132
|
+
/** The React node to display as the confirmation prompt. */
|
133
|
+
prompt: ReactNode;
|
134
|
+
/** The original invocation context to be re-run after confirmation. */
|
135
|
+
originalInvocation: {
|
136
|
+
raw: string;
|
137
|
+
};
|
138
|
+
}
|
139
|
+
export type SlashCommandActionReturn = ToolActionReturn | MessageActionReturn | QuitActionReturn | OpenDialogActionReturn | LoadHistoryActionReturn | SubmitPromptActionReturn | ConfirmShellCommandsActionReturn | ConfirmActionReturn;
|
128
140
|
export declare enum CommandKind {
|
129
141
|
BUILT_IN = "built-in",
|
130
142
|
FILE = "file",
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../src/ui/commands/types.ts"],"names":[],"mappings":"AAAA;;;;GAIG;
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../src/ui/commands/types.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AA4KH,MAAM,CAAN,IAAY,WAIX;AAJD,WAAY,WAAW;IACrB,oCAAqB,CAAA;IACrB,4BAAa,CAAA;IACb,wCAAyB,CAAA;AAC3B,CAAC,EAJW,WAAW,KAAX,WAAW,QAItB"}
|
@@ -5,11 +5,23 @@ import { jsxs as _jsxs } from "react/jsx-runtime";
|
|
5
5
|
* SPDX-License-Identifier: Apache-2.0
|
6
6
|
*/
|
7
7
|
import { Text } from 'ink';
|
8
|
-
import {
|
8
|
+
import { SemanticColors } from '../colors.js';
|
9
9
|
import { tokenLimit } from '@vybestack/llxprt-code-core';
|
10
10
|
export const ContextUsageDisplay = ({ promptTokenCount, model, contextLimit, }) => {
|
11
11
|
const limit = tokenLimit(model, contextLimit);
|
12
12
|
const percentage = promptTokenCount / limit;
|
13
|
-
|
13
|
+
const remainingPercentage = (1 - percentage) * 100;
|
14
|
+
// Use semantic colors based on how much context is left
|
15
|
+
let color;
|
16
|
+
if (remainingPercentage < 10) {
|
17
|
+
color = SemanticColors.status.error; // Very low context
|
18
|
+
}
|
19
|
+
else if (remainingPercentage < 25) {
|
20
|
+
color = SemanticColors.status.warning; // Low context
|
21
|
+
}
|
22
|
+
else {
|
23
|
+
color = SemanticColors.text.secondary; // Normal context
|
24
|
+
}
|
25
|
+
return (_jsxs(Text, { color: color, children: ["(", remainingPercentage.toFixed(0), "% context left)"] }));
|
14
26
|
};
|
15
27
|
//# sourceMappingURL=ContextUsageDisplay.js.map
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"ContextUsageDisplay.js","sourceRoot":"","sources":["../../../../src/ui/components/ContextUsageDisplay.tsx"],"names":[],"mappings":";AAAA;;;;GAIG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAC3B,OAAO,EAAE,
|
1
|
+
{"version":3,"file":"ContextUsageDisplay.js","sourceRoot":"","sources":["../../../../src/ui/components/ContextUsageDisplay.tsx"],"names":[],"mappings":";AAAA;;;;GAIG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAC3B,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAC;AAEzD,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,EAClC,gBAAgB,EAChB,KAAK,EACL,YAAY,GAKb,EAAE,EAAE;IACH,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,EAAE,YAAY,CAAC,CAAC;IAC9C,MAAM,UAAU,GAAG,gBAAgB,GAAG,KAAK,CAAC;IAC5C,MAAM,mBAAmB,GAAG,CAAC,CAAC,GAAG,UAAU,CAAC,GAAG,GAAG,CAAC;IAEnD,wDAAwD;IACxD,IAAI,KAAa,CAAC;IAClB,IAAI,mBAAmB,GAAG,EAAE,EAAE,CAAC;QAC7B,KAAK,GAAG,cAAc,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,mBAAmB;IAC1D,CAAC;SAAM,IAAI,mBAAmB,GAAG,EAAE,EAAE,CAAC;QACpC,KAAK,GAAG,cAAc,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,cAAc;IACvD,CAAC;SAAM,CAAC;QACN,KAAK,GAAG,cAAc,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,iBAAiB;IAC1D,CAAC;IAED,OAAO,CACL,MAAC,IAAI,IAAC,KAAK,EAAE,KAAK,kBAAI,mBAAmB,CAAC,OAAO,CAAC,CAAC,CAAC,uBAAuB,CAC5E,CAAC;AACJ,CAAC,CAAC"}
|
@@ -0,0 +1,16 @@
|
|
1
|
+
/**
|
2
|
+
* @license
|
3
|
+
* Copyright 2025 Google LLC
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
5
|
+
*/
|
6
|
+
import React from 'react';
|
7
|
+
export declare enum FolderTrustChoice {
|
8
|
+
TRUST_FOLDER = "trust_folder",
|
9
|
+
TRUST_PARENT = "trust_parent",
|
10
|
+
DO_NOT_TRUST = "do_not_trust"
|
11
|
+
}
|
12
|
+
interface FolderTrustDialogProps {
|
13
|
+
onSelect: (choice: FolderTrustChoice) => void;
|
14
|
+
}
|
15
|
+
export declare const FolderTrustDialog: React.FC<FolderTrustDialogProps>;
|
16
|
+
export {};
|
@@ -0,0 +1,38 @@
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
2
|
+
/**
|
3
|
+
* @license
|
4
|
+
* Copyright 2025 Google LLC
|
5
|
+
* SPDX-License-Identifier: Apache-2.0
|
6
|
+
*/
|
7
|
+
import { Box, Text, useInput } from 'ink';
|
8
|
+
import { Colors } from '../colors.js';
|
9
|
+
import { RadioButtonSelect, } from './shared/RadioButtonSelect.js';
|
10
|
+
export var FolderTrustChoice;
|
11
|
+
(function (FolderTrustChoice) {
|
12
|
+
FolderTrustChoice["TRUST_FOLDER"] = "trust_folder";
|
13
|
+
FolderTrustChoice["TRUST_PARENT"] = "trust_parent";
|
14
|
+
FolderTrustChoice["DO_NOT_TRUST"] = "do_not_trust";
|
15
|
+
})(FolderTrustChoice || (FolderTrustChoice = {}));
|
16
|
+
export const FolderTrustDialog = ({ onSelect, }) => {
|
17
|
+
useInput((_, key) => {
|
18
|
+
if (key.escape) {
|
19
|
+
onSelect(FolderTrustChoice.DO_NOT_TRUST);
|
20
|
+
}
|
21
|
+
});
|
22
|
+
const options = [
|
23
|
+
{
|
24
|
+
label: 'Trust folder',
|
25
|
+
value: FolderTrustChoice.TRUST_FOLDER,
|
26
|
+
},
|
27
|
+
{
|
28
|
+
label: 'Trust parent folder',
|
29
|
+
value: FolderTrustChoice.TRUST_PARENT,
|
30
|
+
},
|
31
|
+
{
|
32
|
+
label: "Don't trust (esc)",
|
33
|
+
value: FolderTrustChoice.DO_NOT_TRUST,
|
34
|
+
},
|
35
|
+
];
|
36
|
+
return (_jsxs(Box, { flexDirection: "column", borderStyle: "round", borderColor: Colors.AccentYellow, padding: 1, width: "100%", marginLeft: 1, children: [_jsxs(Box, { flexDirection: "column", marginBottom: 1, children: [_jsx(Text, { bold: true, children: "Do you trust this folder?" }), _jsx(Text, { children: "Trusting a folder allows Gemini to execute commands it suggests. This is a security feature to prevent accidental execution in untrusted directories." })] }), _jsx(RadioButtonSelect, { items: options, onSelect: onSelect, isFocused: true })] }));
|
37
|
+
};
|
38
|
+
//# sourceMappingURL=FolderTrustDialog.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"FolderTrustDialog.js","sourceRoot":"","sources":["../../../../src/ui/components/FolderTrustDialog.tsx"],"names":[],"mappings":";AAAA;;;;GAIG;AAEH,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,KAAK,CAAC;AAE1C,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AACtC,OAAO,EACL,iBAAiB,GAElB,MAAM,+BAA+B,CAAC;AAEvC,MAAM,CAAN,IAAY,iBAIX;AAJD,WAAY,iBAAiB;IAC3B,kDAA6B,CAAA;IAC7B,kDAA6B,CAAA;IAC7B,kDAA6B,CAAA;AAC/B,CAAC,EAJW,iBAAiB,KAAjB,iBAAiB,QAI5B;AAMD,MAAM,CAAC,MAAM,iBAAiB,GAAqC,CAAC,EAClE,QAAQ,GACT,EAAE,EAAE;IACH,QAAQ,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,EAAE;QAClB,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC;YACf,QAAQ,CAAC,iBAAiB,CAAC,YAAY,CAAC,CAAC;QAC3C,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,MAAM,OAAO,GAA8C;QACzD;YACE,KAAK,EAAE,cAAc;YACrB,KAAK,EAAE,iBAAiB,CAAC,YAAY;SACtC;QACD;YACE,KAAK,EAAE,qBAAqB;YAC5B,KAAK,EAAE,iBAAiB,CAAC,YAAY;SACtC;QACD;YACE,KAAK,EAAE,mBAAmB;YAC1B,KAAK,EAAE,iBAAiB,CAAC,YAAY;SACtC;KACF,CAAC;IAEF,OAAO,CACL,MAAC,GAAG,IACF,aAAa,EAAC,QAAQ,EACtB,WAAW,EAAC,OAAO,EACnB,WAAW,EAAE,MAAM,CAAC,YAAY,EAChC,OAAO,EAAE,CAAC,EACV,KAAK,EAAC,MAAM,EACZ,UAAU,EAAE,CAAC,aAEb,MAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,EAAC,YAAY,EAAE,CAAC,aACzC,KAAC,IAAI,IAAC,IAAI,gDAAiC,EAC3C,KAAC,IAAI,wKAIE,IACH,EAEN,KAAC,iBAAiB,IAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,SAAS,SAAG,IAC/D,CACP,CAAC;AACJ,CAAC,CAAC"}
|