@vybestack/llxprt-code 0.1.18 → 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/README.md +1 -0
- package/dist/package.json +6 -4
- package/dist/src/acp/acpPeer.js +72 -64
- package/dist/src/acp/acpPeer.js.map +1 -1
- package/dist/src/commands/mcp/add.d.ts +7 -0
- package/dist/src/commands/mcp/add.js +155 -0
- package/dist/src/commands/mcp/add.js.map +1 -0
- package/dist/src/commands/mcp/list.d.ts +8 -0
- package/dist/src/commands/mcp/list.js +110 -0
- package/dist/src/commands/mcp/list.js.map +1 -0
- package/dist/src/commands/mcp/remove.d.ts +7 -0
- package/dist/src/commands/mcp/remove.js +44 -0
- package/dist/src/commands/mcp/remove.js.map +1 -0
- package/dist/src/commands/mcp.d.ts +7 -0
- package/dist/src/commands/mcp.js +23 -0
- package/dist/src/commands/mcp.js.map +1 -0
- package/dist/src/config/auth.js +5 -0
- package/dist/src/config/auth.js.map +1 -1
- package/dist/src/config/config.js +80 -37
- 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 +7 -1
- package/dist/src/config/settings.js +20 -4
- package/dist/src/config/settings.js.map +1 -1
- package/dist/src/gemini.js +12 -109
- 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 +0 -1
- package/dist/src/nonInteractiveCli.js.map +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 +7 -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 +111 -35
- package/dist/src/ui/App.js.map +1 -1
- package/dist/src/ui/IdeIntegrationNudge.d.ts +14 -0
- package/dist/src/ui/IdeIntegrationNudge.js +32 -0
- package/dist/src/ui/IdeIntegrationNudge.js.map +1 -0
- 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/diagnosticsCommand.js +9 -1
- package/dist/src/ui/commands/diagnosticsCommand.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/mcpCommand.js.map +1 -1
- 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/profileCommand.js +1 -0
- package/dist/src/ui/commands/profileCommand.js.map +1 -1
- package/dist/src/ui/commands/setCommand.js +2 -0
- package/dist/src/ui/commands/setCommand.js.map +1 -1
- package/dist/src/ui/commands/setupGithubCommand.js +90 -26
- package/dist/src/ui/commands/setupGithubCommand.js.map +1 -1
- package/dist/src/ui/commands/toolsCommand.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/AuthInProgress.js +3 -3
- package/dist/src/ui/components/AuthInProgress.js.map +1 -1
- package/dist/src/ui/components/ContextUsageDisplay.d.ts +10 -0
- package/dist/src/ui/components/ContextUsageDisplay.js +27 -0
- package/dist/src/ui/components/ContextUsageDisplay.js.map +1 -0
- 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 +132 -15
- 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.d.ts +11 -0
- package/dist/src/ui/components/TodoPanel.js +206 -0
- package/dist/src/ui/components/TodoPanel.js.map +1 -0
- package/dist/src/ui/components/ToolsDialog.d.ts +2 -2
- package/dist/src/ui/components/messages/ToolConfirmationMessage.js +116 -16
- package/dist/src/ui/components/messages/ToolConfirmationMessage.js.map +1 -1
- package/dist/src/ui/components/messages/ToolGroupMessage.js +36 -8
- package/dist/src/ui/components/messages/ToolGroupMessage.js.map +1 -1
- package/dist/src/ui/components/todo-utils.d.ts +16 -0
- package/dist/src/ui/components/todo-utils.js +41 -0
- package/dist/src/ui/components/todo-utils.js.map +1 -0
- 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/contexts/TodoContext.d.ts +15 -0
- package/dist/src/ui/contexts/TodoContext.js +18 -0
- package/dist/src/ui/contexts/TodoContext.js.map +1 -0
- package/dist/src/ui/contexts/TodoProvider.d.ts +7 -0
- package/dist/src/ui/contexts/TodoProvider.js +62 -0
- package/dist/src/ui/contexts/TodoProvider.js.map +1 -0
- package/dist/src/ui/contexts/ToolCallContext.d.ts +19 -0
- package/dist/src/ui/contexts/ToolCallContext.js +13 -0
- package/dist/src/ui/contexts/ToolCallContext.js.map +1 -0
- package/dist/src/ui/contexts/ToolCallProvider.d.ts +12 -0
- package/dist/src/ui/contexts/ToolCallProvider.js +62 -0
- package/dist/src/ui/contexts/ToolCallProvider.js.map +1 -0
- package/dist/src/ui/hooks/atCommandProcessor.js +28 -4
- 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/useAtCompletion.d.ts +23 -0
- package/dist/src/ui/hooks/useAtCompletion.js +180 -0
- package/dist/src/ui/hooks/useAtCompletion.js.map +1 -0
- 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.d.ts +1 -1
- package/dist/src/ui/hooks/useGeminiStream.js +16 -4
- package/dist/src/ui/hooks/useGeminiStream.js.map +1 -1
- package/dist/src/ui/hooks/useReactToolScheduler.js +12 -12
- package/dist/src/ui/hooks/useReactToolScheduler.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/hooks/useToolsDialog.d.ts +2 -2
- package/dist/src/ui/hooks/useToolsDialog.js.map +1 -1
- 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/types.d.ts +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/ConsolePatcher.d.ts +1 -0
- package/dist/src/ui/utils/ConsolePatcher.js +3 -0
- package/dist/src/ui/utils/ConsolePatcher.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/commandUtils.d.ts +1 -0
- package/dist/src/ui/utils/commandUtils.js +22 -1
- package/dist/src/ui/utils/commandUtils.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/gitUtils.d.ts +21 -1
- package/dist/src/utils/gitUtils.js +70 -3
- package/dist/src/utils/gitUtils.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 +430 -401
- package/dist/src/utils/sandbox.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +6 -4
- package/dist/src/ui/components/IDEContextDetailDisplay.d.ts +0 -12
- package/dist/src/ui/components/IDEContextDetailDisplay.js +0 -17
- package/dist/src/ui/components/IDEContextDetailDisplay.js.map +0 -1
@@ -0,0 +1,412 @@
|
|
1
|
+
/**
|
2
|
+
* @license
|
3
|
+
* Copyright 2025 Vybestack LLC
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
5
|
+
*/
|
6
|
+
export class ConversationDataRedactor {
|
7
|
+
redactionConfig;
|
8
|
+
redactionPatterns;
|
9
|
+
constructor(config) {
|
10
|
+
this.redactionConfig = {
|
11
|
+
redactApiKeys: true,
|
12
|
+
redactCredentials: true,
|
13
|
+
redactFilePaths: false,
|
14
|
+
redactUrls: false,
|
15
|
+
redactEmails: false,
|
16
|
+
redactPersonalInfo: false,
|
17
|
+
...config,
|
18
|
+
};
|
19
|
+
this.redactionPatterns = this.initializeRedactionPatterns();
|
20
|
+
}
|
21
|
+
/**
|
22
|
+
* Redact sensitive data from a conversation message
|
23
|
+
*/
|
24
|
+
redactMessage(message, providerName) {
|
25
|
+
if (!this.shouldRedact()) {
|
26
|
+
return message;
|
27
|
+
}
|
28
|
+
const redactedMessage = { ...message };
|
29
|
+
// Content is always a string in IMessage
|
30
|
+
redactedMessage.content = this.redactContent(redactedMessage.content, providerName);
|
31
|
+
// Redact tool_calls if present
|
32
|
+
if (redactedMessage.tool_calls) {
|
33
|
+
redactedMessage.tool_calls = redactedMessage.tool_calls.map((call) => ({
|
34
|
+
...call,
|
35
|
+
function: {
|
36
|
+
...call.function,
|
37
|
+
arguments: this.redactContent(call.function.arguments, providerName),
|
38
|
+
},
|
39
|
+
}));
|
40
|
+
}
|
41
|
+
return redactedMessage;
|
42
|
+
}
|
43
|
+
/**
|
44
|
+
* Redact sensitive data from tool definitions
|
45
|
+
*/
|
46
|
+
redactToolCall(tool) {
|
47
|
+
if (!this.shouldRedact()) {
|
48
|
+
return tool;
|
49
|
+
}
|
50
|
+
const redactedTool = { ...tool };
|
51
|
+
// Handle both ITool interface and test format
|
52
|
+
if (redactedTool.function &&
|
53
|
+
redactedTool.function.parameters &&
|
54
|
+
tool.function.name) {
|
55
|
+
redactedTool.function.parameters = this.redactToolParameters(redactedTool.function.parameters, tool.function.name);
|
56
|
+
}
|
57
|
+
else if (redactedTool.parameters &&
|
58
|
+
tool.name) {
|
59
|
+
// Handle test format that doesn't match ITool interface
|
60
|
+
redactedTool.parameters =
|
61
|
+
this.redactToolParameters(redactedTool.parameters, tool.name);
|
62
|
+
}
|
63
|
+
return redactedTool;
|
64
|
+
}
|
65
|
+
/**
|
66
|
+
* Redact sensitive data from response content
|
67
|
+
*/
|
68
|
+
redactResponseContent(content, providerName) {
|
69
|
+
if (!this.shouldRedact()) {
|
70
|
+
return content;
|
71
|
+
}
|
72
|
+
return this.redactContent(content, providerName);
|
73
|
+
}
|
74
|
+
/**
|
75
|
+
* Redact entire conversation consistently
|
76
|
+
*/
|
77
|
+
redactConversation(messages, providerName) {
|
78
|
+
return messages.map((message) => this.redactMessage(message, providerName));
|
79
|
+
}
|
80
|
+
/**
|
81
|
+
* Redact API keys from content based on provider
|
82
|
+
*/
|
83
|
+
redactApiKeys(content, providerName) {
|
84
|
+
let redacted = content;
|
85
|
+
// Apply provider-specific and global API key patterns
|
86
|
+
const providerPatterns = this.redactionPatterns.get(providerName) || [];
|
87
|
+
const globalPatterns = this.redactionPatterns.get('global') || [];
|
88
|
+
[...providerPatterns, ...globalPatterns].forEach((pattern) => {
|
89
|
+
if (pattern.enabled && pattern.name.includes('api_key')) {
|
90
|
+
redacted = redacted.replace(pattern.pattern, pattern.replacement);
|
91
|
+
}
|
92
|
+
});
|
93
|
+
return redacted;
|
94
|
+
}
|
95
|
+
/**
|
96
|
+
* Redact sensitive file paths
|
97
|
+
*/
|
98
|
+
redactSensitivePaths(content) {
|
99
|
+
if (!this.redactionConfig.redactFilePaths) {
|
100
|
+
return content;
|
101
|
+
}
|
102
|
+
let redacted = content;
|
103
|
+
// SSH keys and certificates
|
104
|
+
redacted = redacted.replace(/\/[^"\s]*\.ssh\/[^"\s]*/g, '[REDACTED-SSH-PATH]');
|
105
|
+
redacted = redacted.replace(/\/[^"\s]*\/id_rsa[^"\s]*/g, '[REDACTED-SSH-KEY-PATH]');
|
106
|
+
// Environment files
|
107
|
+
redacted = redacted.replace(/\/[^"\s]*\.env[^"\s]*/g, '[REDACTED-ENV-FILE]');
|
108
|
+
// Configuration directories
|
109
|
+
redacted = redacted.replace(/\/home\/[^/\s"]+/g, '[REDACTED-HOME-DIR]');
|
110
|
+
redacted = redacted.replace(/\/Users\/[^/\s"]+/g, '[REDACTED-USER-DIR]');
|
111
|
+
return redacted;
|
112
|
+
}
|
113
|
+
/**
|
114
|
+
* Redact personal identifiable information
|
115
|
+
*/
|
116
|
+
redactPersonalInfo(content) {
|
117
|
+
if (!this.redactionConfig.redactPersonalInfo) {
|
118
|
+
return content;
|
119
|
+
}
|
120
|
+
let redacted = content;
|
121
|
+
// Email addresses
|
122
|
+
redacted = redacted.replace(/[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}/g, '[REDACTED-EMAIL]');
|
123
|
+
// Phone numbers (basic patterns)
|
124
|
+
redacted = redacted.replace(/\b\d{3}-\d{3}-\d{4}\b/g, '[REDACTED-PHONE]');
|
125
|
+
redacted = redacted.replace(/\b\(\d{3}\)\s?\d{3}-\d{4}\b/g, '[REDACTED-PHONE]');
|
126
|
+
// Credit card numbers (basic pattern)
|
127
|
+
redacted = redacted.replace(/\b\d{4}[-\s]?\d{4}[-\s]?\d{4}[-\s]?\d{4}\b/g, '[REDACTED-CC-NUMBER]');
|
128
|
+
return redacted;
|
129
|
+
}
|
130
|
+
shouldRedact() {
|
131
|
+
// Check if any redaction is enabled
|
132
|
+
return Object.values(this.redactionConfig).some((value) => value === true);
|
133
|
+
}
|
134
|
+
redactContent(content, providerName) {
|
135
|
+
let redacted = content;
|
136
|
+
// Apply provider-specific patterns
|
137
|
+
const providerPatterns = this.redactionPatterns.get(providerName) || [];
|
138
|
+
for (const pattern of providerPatterns) {
|
139
|
+
if (pattern.enabled) {
|
140
|
+
redacted = redacted.replace(pattern.pattern, pattern.replacement);
|
141
|
+
}
|
142
|
+
}
|
143
|
+
// Apply global patterns
|
144
|
+
const globalPatterns = this.redactionPatterns.get('global') || [];
|
145
|
+
for (const pattern of globalPatterns) {
|
146
|
+
if (pattern.enabled) {
|
147
|
+
redacted = redacted.replace(pattern.pattern, pattern.replacement);
|
148
|
+
}
|
149
|
+
}
|
150
|
+
return redacted;
|
151
|
+
}
|
152
|
+
redactContentPart(part, providerName) {
|
153
|
+
const redactedPart = { ...part };
|
154
|
+
if (typeof part === 'object' && part !== null) {
|
155
|
+
const partObj = part;
|
156
|
+
if (partObj.text && typeof partObj.text === 'string') {
|
157
|
+
redactedPart.text = this.redactContent(partObj.text, providerName);
|
158
|
+
}
|
159
|
+
if (partObj.functionCall) {
|
160
|
+
const funcCall = partObj.functionCall;
|
161
|
+
redactedPart.functionCall = {
|
162
|
+
...funcCall,
|
163
|
+
args: this.redactToolParameters(funcCall.args, funcCall.name),
|
164
|
+
};
|
165
|
+
}
|
166
|
+
}
|
167
|
+
return redactedPart;
|
168
|
+
}
|
169
|
+
redactToolParameters(params, toolName) {
|
170
|
+
if (!params || typeof params !== 'object') {
|
171
|
+
return params;
|
172
|
+
}
|
173
|
+
const redacted = { ...params };
|
174
|
+
// Apply tool-specific redaction rules
|
175
|
+
switch (toolName) {
|
176
|
+
case 'read_file':
|
177
|
+
case 'write_file':
|
178
|
+
case 'list_files':
|
179
|
+
if (redacted.file_path &&
|
180
|
+
typeof redacted.file_path === 'string' &&
|
181
|
+
this.redactionConfig.redactFilePaths) {
|
182
|
+
redacted.file_path = this.redactFilePath(redacted.file_path);
|
183
|
+
}
|
184
|
+
break;
|
185
|
+
case 'run_command':
|
186
|
+
case 'shell':
|
187
|
+
if (redacted.command && typeof redacted.command === 'string') {
|
188
|
+
redacted.command = this.redactShellCommand(redacted.command);
|
189
|
+
}
|
190
|
+
break;
|
191
|
+
case 'web_search':
|
192
|
+
case 'fetch_url':
|
193
|
+
if (redacted.url &&
|
194
|
+
typeof redacted.url === 'string' &&
|
195
|
+
this.redactionConfig.redactUrls) {
|
196
|
+
redacted.url = this.redactUrl(redacted.url);
|
197
|
+
}
|
198
|
+
break;
|
199
|
+
default:
|
200
|
+
// No specific redaction for this tool
|
201
|
+
break;
|
202
|
+
}
|
203
|
+
// Apply general parameter redaction
|
204
|
+
for (const [key, value] of Object.entries(redacted)) {
|
205
|
+
if (typeof value === 'string') {
|
206
|
+
redacted[key] = this.redactContent(value, 'global');
|
207
|
+
}
|
208
|
+
}
|
209
|
+
return redacted;
|
210
|
+
}
|
211
|
+
redactFilePath(path) {
|
212
|
+
// Redact sensitive file paths
|
213
|
+
const sensitivePatterns = [
|
214
|
+
{
|
215
|
+
pattern: /\/home\/[^/]+\/\.ssh\/[^/]+/g,
|
216
|
+
replacement: '[REDACTED-SSH-KEY-PATH]',
|
217
|
+
},
|
218
|
+
{
|
219
|
+
pattern: /\/home\/[^/]+\/\.aws\/[^/]+/g,
|
220
|
+
replacement: '[REDACTED-AWS-CONFIG-PATH]',
|
221
|
+
},
|
222
|
+
{
|
223
|
+
pattern: /\/home\/[^/]+\/\.docker\/[^/]+/g,
|
224
|
+
replacement: '[REDACTED-DOCKER-CONFIG-PATH]',
|
225
|
+
},
|
226
|
+
{
|
227
|
+
pattern: /\/Users\/[^/]+\/\.ssh\/[^/]+/g,
|
228
|
+
replacement: '[REDACTED-SSH-KEY-PATH]',
|
229
|
+
},
|
230
|
+
{
|
231
|
+
pattern: /\/Users\/[^/]+\/\.aws\/[^/]+/g,
|
232
|
+
replacement: '[REDACTED-AWS-CONFIG-PATH]',
|
233
|
+
},
|
234
|
+
{ pattern: /.*\.env.*$/g, replacement: '[REDACTED-SENSITIVE-PATH]' },
|
235
|
+
{ pattern: /.*secret.*$/gi, replacement: '[REDACTED-SENSITIVE-PATH]' },
|
236
|
+
{ pattern: /.*key.*$/gi, replacement: '[REDACTED-SENSITIVE-PATH]' },
|
237
|
+
];
|
238
|
+
let redacted = path;
|
239
|
+
for (const { pattern, replacement } of sensitivePatterns) {
|
240
|
+
redacted = redacted.replace(pattern, replacement);
|
241
|
+
}
|
242
|
+
return redacted;
|
243
|
+
}
|
244
|
+
redactShellCommand(command) {
|
245
|
+
// Redact potentially sensitive shell commands
|
246
|
+
let redacted = command;
|
247
|
+
// Redact export statements with sensitive values
|
248
|
+
redacted = redacted.replace(/export\s+[A-Z_]+\s*=\s*['"]\s*sk-[a-zA-Z0-9]+\s*['"]/g, 'export [REDACTED-API-KEY]');
|
249
|
+
redacted = redacted.replace(/export\s+[A-Z_]+\s*=\s*['"]\s*[a-zA-Z0-9+/]+=*\s*['"]/g, 'export [REDACTED-TOKEN]');
|
250
|
+
// Redact curl commands with authorization headers
|
251
|
+
redacted = redacted.replace(/curl\s+.*-H\s+['"]Authorization:\s*Bearer\s+[^'"]+['"]/g, 'curl [REDACTED-AUTH-HEADER]');
|
252
|
+
return redacted;
|
253
|
+
}
|
254
|
+
redactUrl(url) {
|
255
|
+
// Redact sensitive parts of URLs while preserving structure
|
256
|
+
try {
|
257
|
+
const urlObj = new URL(url);
|
258
|
+
// Redact query parameters that might contain sensitive data
|
259
|
+
const sensitiveParams = [
|
260
|
+
'key',
|
261
|
+
'token',
|
262
|
+
'auth',
|
263
|
+
'password',
|
264
|
+
'secret',
|
265
|
+
'api_key',
|
266
|
+
];
|
267
|
+
for (const param of sensitiveParams) {
|
268
|
+
if (urlObj.searchParams.has(param)) {
|
269
|
+
urlObj.searchParams.set(param, '[REDACTED]');
|
270
|
+
}
|
271
|
+
}
|
272
|
+
return urlObj.toString();
|
273
|
+
}
|
274
|
+
catch {
|
275
|
+
// If URL parsing fails, apply pattern-based redaction
|
276
|
+
return url.replace(/[?&](key|token|auth|password|secret|api_key)=[^&]*/g, '$1=[REDACTED]');
|
277
|
+
}
|
278
|
+
}
|
279
|
+
initializeRedactionPatterns() {
|
280
|
+
const patterns = new Map();
|
281
|
+
// Global patterns
|
282
|
+
patterns.set('global', [
|
283
|
+
{
|
284
|
+
name: 'api_keys',
|
285
|
+
pattern: /sk-[a-zA-Z0-9]{32,}/g,
|
286
|
+
replacement: '[REDACTED-API-KEY]',
|
287
|
+
enabled: this.redactionConfig.redactApiKeys,
|
288
|
+
},
|
289
|
+
{
|
290
|
+
name: 'email_addresses',
|
291
|
+
pattern: /\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,}\b/g,
|
292
|
+
replacement: '[REDACTED-EMAIL]',
|
293
|
+
enabled: this.redactionConfig.redactEmails,
|
294
|
+
},
|
295
|
+
{
|
296
|
+
name: 'passwords',
|
297
|
+
pattern: /(?:password|pwd|pass)[=:\s]+[^\s\n\r]+/gi,
|
298
|
+
replacement: 'password=[REDACTED]',
|
299
|
+
enabled: this.redactionConfig.redactCredentials,
|
300
|
+
},
|
301
|
+
{
|
302
|
+
name: 'generic_api_keys',
|
303
|
+
pattern: /api[_-]?key["\s]*[:=]["\s]*[a-zA-Z0-9-_]{16,}/gi,
|
304
|
+
replacement: 'api_key: "[REDACTED-API-KEY]"',
|
305
|
+
enabled: this.redactionConfig.redactApiKeys,
|
306
|
+
},
|
307
|
+
{
|
308
|
+
name: 'bearer_tokens',
|
309
|
+
pattern: /bearer [a-zA-Z0-9-_.]{16,}/gi,
|
310
|
+
replacement: 'bearer [REDACTED-BEARER-TOKEN]',
|
311
|
+
enabled: this.redactionConfig.redactCredentials,
|
312
|
+
},
|
313
|
+
]);
|
314
|
+
// OpenAI-specific patterns
|
315
|
+
patterns.set('openai', [
|
316
|
+
{
|
317
|
+
name: 'openai_api_keys',
|
318
|
+
pattern: /sk-[a-zA-Z0-9]{40,51}/g,
|
319
|
+
replacement: '[REDACTED-OPENAI-KEY]',
|
320
|
+
enabled: this.redactionConfig.redactApiKeys,
|
321
|
+
},
|
322
|
+
{
|
323
|
+
name: 'openai_project_keys',
|
324
|
+
pattern: /sk-proj-[a-zA-Z0-9]{48}/g,
|
325
|
+
replacement: '[REDACTED-OPENAI-PROJECT-KEY]',
|
326
|
+
enabled: this.redactionConfig.redactApiKeys,
|
327
|
+
},
|
328
|
+
{
|
329
|
+
name: 'openai_org_ids',
|
330
|
+
pattern: /org-[a-zA-Z0-9]{24}/g,
|
331
|
+
replacement: '[REDACTED-ORG-ID]',
|
332
|
+
enabled: this.redactionConfig.redactCredentials,
|
333
|
+
},
|
334
|
+
]);
|
335
|
+
// Anthropic-specific patterns
|
336
|
+
patterns.set('anthropic', [
|
337
|
+
{
|
338
|
+
name: 'anthropic_api_keys',
|
339
|
+
pattern: /sk-ant-[a-zA-Z0-9\-_]{95}/g,
|
340
|
+
replacement: '[REDACTED-ANTHROPIC-KEY]',
|
341
|
+
enabled: this.redactionConfig.redactApiKeys,
|
342
|
+
},
|
343
|
+
]);
|
344
|
+
// Gemini/Google-specific patterns
|
345
|
+
patterns.set('gemini', [
|
346
|
+
{
|
347
|
+
name: 'google_api_keys',
|
348
|
+
pattern: /AIza[0-9A-Za-z\-_]{35}/g,
|
349
|
+
replacement: '[REDACTED-GOOGLE-KEY]',
|
350
|
+
enabled: this.redactionConfig.redactApiKeys,
|
351
|
+
},
|
352
|
+
{
|
353
|
+
name: 'google_tokens',
|
354
|
+
pattern: /ya29\.[0-9A-Za-z\-_]+/g,
|
355
|
+
replacement: '[REDACTED-GOOGLE-TOKEN]',
|
356
|
+
enabled: this.redactionConfig.redactCredentials,
|
357
|
+
},
|
358
|
+
]);
|
359
|
+
return patterns;
|
360
|
+
}
|
361
|
+
isPatternEnabled(patternName) {
|
362
|
+
switch (patternName) {
|
363
|
+
case 'api_keys':
|
364
|
+
case 'generic_api_keys':
|
365
|
+
case 'openai_api_keys':
|
366
|
+
case 'openai_project_keys':
|
367
|
+
case 'anthropic_api_keys':
|
368
|
+
case 'google_api_keys':
|
369
|
+
return this.redactionConfig.redactApiKeys;
|
370
|
+
case 'email_addresses':
|
371
|
+
return this.redactionConfig.redactEmails;
|
372
|
+
case 'passwords':
|
373
|
+
case 'bearer_tokens':
|
374
|
+
case 'openai_org_ids':
|
375
|
+
case 'google_tokens':
|
376
|
+
return this.redactionConfig.redactCredentials;
|
377
|
+
default:
|
378
|
+
return true;
|
379
|
+
}
|
380
|
+
}
|
381
|
+
/**
|
382
|
+
* Update redaction configuration
|
383
|
+
*/
|
384
|
+
updateConfig(config) {
|
385
|
+
this.redactionConfig = { ...this.redactionConfig, ...config };
|
386
|
+
this.redactionPatterns = this.initializeRedactionPatterns();
|
387
|
+
}
|
388
|
+
/**
|
389
|
+
* Get current redaction statistics
|
390
|
+
*/
|
391
|
+
getRedactionStats(content, providerName) {
|
392
|
+
const stats = {
|
393
|
+
totalRedactions: 0,
|
394
|
+
redactionsByType: {},
|
395
|
+
};
|
396
|
+
const patterns = [
|
397
|
+
...(this.redactionPatterns.get('global') || []),
|
398
|
+
...(this.redactionPatterns.get(providerName) || []),
|
399
|
+
];
|
400
|
+
for (const pattern of patterns) {
|
401
|
+
if (pattern.enabled) {
|
402
|
+
const matches = content.match(pattern.pattern);
|
403
|
+
if (matches) {
|
404
|
+
stats.totalRedactions += matches.length;
|
405
|
+
stats.redactionsByType[pattern.name] = matches.length;
|
406
|
+
}
|
407
|
+
}
|
408
|
+
}
|
409
|
+
return stats;
|
410
|
+
}
|
411
|
+
}
|
412
|
+
//# sourceMappingURL=ConversationDataRedactor.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"ConversationDataRedactor.js","sourceRoot":"","sources":["../../../../src/utils/privacy/ConversationDataRedactor.ts"],"names":[],"mappings":"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"}
|
@@ -0,0 +1,58 @@
|
|
1
|
+
/**
|
2
|
+
* @license
|
3
|
+
* Copyright 2025 Vybestack LLC
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
5
|
+
*/
|
6
|
+
import { ConversationDataRedactor, RedactionConfig } from './ConversationDataRedactor.js';
|
7
|
+
export interface PrivacyConfig {
|
8
|
+
getConversationLoggingEnabled(): boolean;
|
9
|
+
getResponseLoggingEnabled(): boolean;
|
10
|
+
getTelemetryLogPromptsEnabled(): boolean;
|
11
|
+
getTelemetryTarget(): 'local' | 'remote' | string;
|
12
|
+
getConversationLogPath(): string;
|
13
|
+
getConversationRetentionDays(): number;
|
14
|
+
getMaxConversationsStored(): number;
|
15
|
+
getRedactionConfig(): RedactionConfig;
|
16
|
+
getTelemetrySettings(): {
|
17
|
+
remoteConsentGiven?: boolean;
|
18
|
+
[key: string]: unknown;
|
19
|
+
};
|
20
|
+
}
|
21
|
+
export declare class PrivacyManager {
|
22
|
+
private redactor;
|
23
|
+
private config;
|
24
|
+
constructor(config: PrivacyConfig);
|
25
|
+
/**
|
26
|
+
* Check if conversation logging is permitted based on privacy settings
|
27
|
+
*/
|
28
|
+
isLoggingPermitted(): boolean;
|
29
|
+
/**
|
30
|
+
* Get appropriate redactor for current privacy settings
|
31
|
+
*/
|
32
|
+
getRedactor(): ConversationDataRedactor;
|
33
|
+
/**
|
34
|
+
* Validate privacy compliance for conversation data
|
35
|
+
*/
|
36
|
+
validatePrivacyCompliance(conversationData: unknown): PrivacyValidationResult;
|
37
|
+
/**
|
38
|
+
* Generate privacy disclosure for user consent
|
39
|
+
*/
|
40
|
+
generatePrivacyDisclosure(): PrivacyDisclosure;
|
41
|
+
private hasRemoteConsent;
|
42
|
+
private getDataCollectionDescription;
|
43
|
+
private getStorageDescription;
|
44
|
+
private getRetentionDescription;
|
45
|
+
private getRedactionDescription;
|
46
|
+
private getUserRightsDescription;
|
47
|
+
}
|
48
|
+
export interface PrivacyValidationResult {
|
49
|
+
isCompliant: boolean;
|
50
|
+
violations: string[];
|
51
|
+
}
|
52
|
+
export interface PrivacyDisclosure {
|
53
|
+
dataCollected: string[];
|
54
|
+
storageLocation: string;
|
55
|
+
retentionPolicy: string;
|
56
|
+
redactionPolicy: string;
|
57
|
+
userRights: string[];
|
58
|
+
}
|
@@ -0,0 +1,133 @@
|
|
1
|
+
/**
|
2
|
+
* @license
|
3
|
+
* Copyright 2025 Vybestack LLC
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
5
|
+
*/
|
6
|
+
import { ConversationDataRedactor, } from './ConversationDataRedactor.js';
|
7
|
+
export class PrivacyManager {
|
8
|
+
redactor;
|
9
|
+
config;
|
10
|
+
constructor(config) {
|
11
|
+
this.config = config;
|
12
|
+
this.redactor = new ConversationDataRedactor(config.getRedactionConfig());
|
13
|
+
}
|
14
|
+
/**
|
15
|
+
* Check if conversation logging is permitted based on privacy settings
|
16
|
+
*/
|
17
|
+
isLoggingPermitted() {
|
18
|
+
// Must be explicitly enabled
|
19
|
+
if (!this.config.getConversationLoggingEnabled()) {
|
20
|
+
return false;
|
21
|
+
}
|
22
|
+
// Check for privacy constraints
|
23
|
+
if (this.config.getTelemetryTarget() === 'remote' &&
|
24
|
+
!this.hasRemoteConsent()) {
|
25
|
+
return false;
|
26
|
+
}
|
27
|
+
return true;
|
28
|
+
}
|
29
|
+
/**
|
30
|
+
* Get appropriate redactor for current privacy settings
|
31
|
+
*/
|
32
|
+
getRedactor() {
|
33
|
+
// Update redactor config in case settings changed
|
34
|
+
this.redactor.updateConfig(this.config.getRedactionConfig());
|
35
|
+
return this.redactor;
|
36
|
+
}
|
37
|
+
/**
|
38
|
+
* Validate privacy compliance for conversation data
|
39
|
+
*/
|
40
|
+
validatePrivacyCompliance(conversationData) {
|
41
|
+
const result = {
|
42
|
+
isCompliant: true,
|
43
|
+
violations: [],
|
44
|
+
};
|
45
|
+
// Check for sensitive data that should have been redacted
|
46
|
+
if (typeof conversationData === 'string') {
|
47
|
+
const stats = this.redactor.getRedactionStats(conversationData, 'global');
|
48
|
+
if (stats.totalRedactions > 0) {
|
49
|
+
result.isCompliant = false;
|
50
|
+
result.violations.push(`Found ${stats.totalRedactions} instances of sensitive data`);
|
51
|
+
}
|
52
|
+
}
|
53
|
+
return result;
|
54
|
+
}
|
55
|
+
/**
|
56
|
+
* Generate privacy disclosure for user consent
|
57
|
+
*/
|
58
|
+
generatePrivacyDisclosure() {
|
59
|
+
return {
|
60
|
+
dataCollected: this.getDataCollectionDescription(),
|
61
|
+
storageLocation: this.getStorageDescription(),
|
62
|
+
retentionPolicy: this.getRetentionDescription(),
|
63
|
+
redactionPolicy: this.getRedactionDescription(),
|
64
|
+
userRights: this.getUserRightsDescription(),
|
65
|
+
};
|
66
|
+
}
|
67
|
+
hasRemoteConsent() {
|
68
|
+
// Check if user has explicitly consented to remote data transmission
|
69
|
+
return this.config.getTelemetrySettings().remoteConsentGiven ?? false;
|
70
|
+
}
|
71
|
+
getDataCollectionDescription() {
|
72
|
+
const collected = [];
|
73
|
+
if (this.config.getConversationLoggingEnabled()) {
|
74
|
+
collected.push('Conversation messages (with redaction)');
|
75
|
+
}
|
76
|
+
if (this.config.getResponseLoggingEnabled()) {
|
77
|
+
collected.push('AI response content (with redaction)');
|
78
|
+
}
|
79
|
+
if (this.config.getTelemetryLogPromptsEnabled()) {
|
80
|
+
collected.push('User prompts (with redaction)');
|
81
|
+
}
|
82
|
+
collected.push('Provider usage metadata');
|
83
|
+
collected.push('Tool call information');
|
84
|
+
collected.push('Performance metrics');
|
85
|
+
return collected;
|
86
|
+
}
|
87
|
+
getStorageDescription() {
|
88
|
+
const target = this.config.getTelemetryTarget();
|
89
|
+
switch (target) {
|
90
|
+
case 'local':
|
91
|
+
return `Data stored locally on your machine at ${this.config.getConversationLogPath()}`;
|
92
|
+
case 'remote':
|
93
|
+
return 'Data transmitted to configured remote telemetry service';
|
94
|
+
default:
|
95
|
+
return 'Data stored according to your telemetry configuration';
|
96
|
+
}
|
97
|
+
}
|
98
|
+
getRetentionDescription() {
|
99
|
+
const days = this.config.getConversationRetentionDays();
|
100
|
+
const maxConversations = this.config.getMaxConversationsStored();
|
101
|
+
return `Data retained for ${days} days or up to ${maxConversations} conversations, whichever comes first`;
|
102
|
+
}
|
103
|
+
getRedactionDescription() {
|
104
|
+
const config = this.config.getRedactionConfig();
|
105
|
+
const redactions = [];
|
106
|
+
if (config.redactApiKeys)
|
107
|
+
redactions.push('API keys and tokens');
|
108
|
+
if (config.redactCredentials)
|
109
|
+
redactions.push('Passwords and credentials');
|
110
|
+
if (config.redactEmails)
|
111
|
+
redactions.push('Email addresses');
|
112
|
+
if (config.redactFilePaths)
|
113
|
+
redactions.push('File system paths');
|
114
|
+
if (config.redactUrls)
|
115
|
+
redactions.push('URLs with sensitive parameters');
|
116
|
+
if (config.redactPersonalInfo)
|
117
|
+
redactions.push('Personal identifiable information');
|
118
|
+
if (redactions.length === 0) {
|
119
|
+
return 'No automatic redaction enabled';
|
120
|
+
}
|
121
|
+
return `Automatic redaction of: ${redactions.join(', ')}`;
|
122
|
+
}
|
123
|
+
getUserRightsDescription() {
|
124
|
+
return [
|
125
|
+
'You can disable conversation logging at any time',
|
126
|
+
'You can view and export your conversation data',
|
127
|
+
'You can delete stored conversation data',
|
128
|
+
'You control what types of data are redacted',
|
129
|
+
'Local data remains on your machine unless explicitly shared',
|
130
|
+
];
|
131
|
+
}
|
132
|
+
}
|
133
|
+
//# sourceMappingURL=PrivacyManager.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"PrivacyManager.js","sourceRoot":"","sources":["../../../../src/utils/privacy/PrivacyManager.ts"],"names":[],"mappings":"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"}
|