@vybestack/llxprt-code 0.1.18-nightly.250807.306d1939 → 0.1.18-nightly.250811.b0db22c6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (250) hide show
  1. package/README.md +1 -0
  2. package/dist/package.json +6 -4
  3. package/dist/src/acp/acpPeer.js +72 -64
  4. package/dist/src/acp/acpPeer.js.map +1 -1
  5. package/dist/src/auth/gemini-oauth-provider.d.ts +15 -0
  6. package/dist/src/auth/gemini-oauth-provider.js +33 -0
  7. package/dist/src/auth/gemini-oauth-provider.js.map +1 -0
  8. package/dist/src/auth/oauth-manager.d.ts +103 -0
  9. package/dist/src/auth/oauth-manager.js +326 -0
  10. package/dist/src/auth/oauth-manager.js.map +1 -0
  11. package/dist/src/auth/oauth-manager.spec.d.ts +6 -0
  12. package/dist/src/auth/oauth-manager.spec.js +523 -0
  13. package/dist/src/auth/oauth-manager.spec.js.map +1 -0
  14. package/dist/src/auth/qwen-oauth-provider.d.ts +14 -0
  15. package/dist/src/auth/qwen-oauth-provider.js +75 -0
  16. package/dist/src/auth/qwen-oauth-provider.js.map +1 -0
  17. package/dist/src/auth/types.d.ts +7 -0
  18. package/dist/src/auth/types.js +7 -0
  19. package/dist/src/auth/types.js.map +1 -0
  20. package/dist/src/commands/mcp/add.d.ts +7 -0
  21. package/dist/src/commands/mcp/add.js +155 -0
  22. package/dist/src/commands/mcp/add.js.map +1 -0
  23. package/dist/src/commands/mcp/list.d.ts +8 -0
  24. package/dist/src/commands/mcp/list.js +110 -0
  25. package/dist/src/commands/mcp/list.js.map +1 -0
  26. package/dist/src/commands/mcp/remove.d.ts +7 -0
  27. package/dist/src/commands/mcp/remove.js +44 -0
  28. package/dist/src/commands/mcp/remove.js.map +1 -0
  29. package/dist/src/commands/mcp.d.ts +7 -0
  30. package/dist/src/commands/mcp.js +23 -0
  31. package/dist/src/commands/mcp.js.map +1 -0
  32. package/dist/src/config/auth.js +9 -0
  33. package/dist/src/config/auth.js.map +1 -1
  34. package/dist/src/config/config.js +100 -43
  35. package/dist/src/config/config.js.map +1 -1
  36. package/dist/src/config/keyBindings.d.ts +66 -0
  37. package/dist/src/config/keyBindings.js +136 -0
  38. package/dist/src/config/keyBindings.js.map +1 -0
  39. package/dist/src/config/settings.d.ts +3 -56
  40. package/dist/src/config/settings.js +20 -4
  41. package/dist/src/config/settings.js.map +1 -1
  42. package/dist/src/config/settingsSchema.d.ts +587 -0
  43. package/dist/src/config/settingsSchema.js +565 -0
  44. package/dist/src/config/settingsSchema.js.map +1 -0
  45. package/dist/src/gemini.js +12 -109
  46. package/dist/src/gemini.js.map +1 -1
  47. package/dist/src/generated/git-commit.d.ts +1 -1
  48. package/dist/src/generated/git-commit.js +1 -1
  49. package/dist/src/nonInteractiveCli.js +0 -1
  50. package/dist/src/nonInteractiveCli.js.map +1 -1
  51. package/dist/src/providers/logging/git-stats-service-impl.d.ts +19 -0
  52. package/dist/src/providers/logging/git-stats-service-impl.js +25 -0
  53. package/dist/src/providers/logging/git-stats-service-impl.js.map +1 -0
  54. package/dist/src/providers/logging/git-stats.d.ts +43 -0
  55. package/dist/src/providers/logging/git-stats.js +137 -0
  56. package/dist/src/providers/logging/git-stats.js.map +1 -0
  57. package/dist/src/providers/providerManagerInstance.js +42 -4
  58. package/dist/src/providers/providerManagerInstance.js.map +1 -1
  59. package/dist/src/services/BuiltinCommandLoader.js +4 -0
  60. package/dist/src/services/BuiltinCommandLoader.js.map +1 -1
  61. package/dist/src/services/todo-continuation/todoContinuationService.d.ts +172 -0
  62. package/dist/src/services/todo-continuation/todoContinuationService.js +387 -0
  63. package/dist/src/services/todo-continuation/todoContinuationService.js.map +1 -0
  64. package/dist/src/services/todo-continuation/todoContinuationService.spec.d.ts +6 -0
  65. package/dist/src/services/todo-continuation/todoContinuationService.spec.js +385 -0
  66. package/dist/src/services/todo-continuation/todoContinuationService.spec.js.map +1 -0
  67. package/dist/src/ui/App.js +123 -37
  68. package/dist/src/ui/App.js.map +1 -1
  69. package/dist/src/ui/IdeIntegrationNudge.d.ts +14 -0
  70. package/dist/src/ui/IdeIntegrationNudge.js +32 -0
  71. package/dist/src/ui/IdeIntegrationNudge.js.map +1 -0
  72. package/dist/src/ui/colors.d.ts +5 -0
  73. package/dist/src/ui/colors.js +51 -0
  74. package/dist/src/ui/colors.js.map +1 -1
  75. package/dist/src/ui/commands/authCommand.d.ts +11 -1
  76. package/dist/src/ui/commands/authCommand.js +143 -48
  77. package/dist/src/ui/commands/authCommand.js.map +1 -1
  78. package/dist/src/ui/commands/chatCommand.js +16 -0
  79. package/dist/src/ui/commands/chatCommand.js.map +1 -1
  80. package/dist/src/ui/commands/diagnosticsCommand.js +9 -1
  81. package/dist/src/ui/commands/diagnosticsCommand.js.map +1 -1
  82. package/dist/src/ui/commands/ideCommand.js +67 -31
  83. package/dist/src/ui/commands/ideCommand.js.map +1 -1
  84. package/dist/src/ui/commands/keyfileCommand.js +15 -12
  85. package/dist/src/ui/commands/keyfileCommand.js.map +1 -1
  86. package/dist/src/ui/commands/loggingCommand.d.ts +15 -0
  87. package/dist/src/ui/commands/loggingCommand.js +421 -0
  88. package/dist/src/ui/commands/loggingCommand.js.map +1 -0
  89. package/dist/src/ui/commands/mcpCommand.js.map +1 -1
  90. package/dist/src/ui/commands/privacyCommand.d.ts +3 -0
  91. package/dist/src/ui/commands/privacyCommand.js +6 -3
  92. package/dist/src/ui/commands/privacyCommand.js.map +1 -1
  93. package/dist/src/ui/commands/profileCommand.js +1 -0
  94. package/dist/src/ui/commands/profileCommand.js.map +1 -1
  95. package/dist/src/ui/commands/setCommand.js +2 -0
  96. package/dist/src/ui/commands/setCommand.js.map +1 -1
  97. package/dist/src/ui/commands/settingsCommand.d.ts +7 -0
  98. package/dist/src/ui/commands/settingsCommand.js +16 -0
  99. package/dist/src/ui/commands/settingsCommand.js.map +1 -0
  100. package/dist/src/ui/commands/setupGithubCommand.js +90 -26
  101. package/dist/src/ui/commands/setupGithubCommand.js.map +1 -1
  102. package/dist/src/ui/commands/toolsCommand.js.map +1 -1
  103. package/dist/src/ui/commands/types.d.ts +14 -2
  104. package/dist/src/ui/commands/types.js.map +1 -1
  105. package/dist/src/ui/components/AuthDialog.js +13 -56
  106. package/dist/src/ui/components/AuthDialog.js.map +1 -1
  107. package/dist/src/ui/components/AuthInProgress.js +3 -3
  108. package/dist/src/ui/components/AuthInProgress.js.map +1 -1
  109. package/dist/src/ui/components/ContextUsageDisplay.d.ts +10 -0
  110. package/dist/src/ui/components/ContextUsageDisplay.js +27 -0
  111. package/dist/src/ui/components/ContextUsageDisplay.js.map +1 -0
  112. package/dist/src/ui/components/FolderTrustDialog.d.ts +16 -0
  113. package/dist/src/ui/components/FolderTrustDialog.js +38 -0
  114. package/dist/src/ui/components/FolderTrustDialog.js.map +1 -0
  115. package/dist/src/ui/components/Footer.js +132 -15
  116. package/dist/src/ui/components/Footer.js.map +1 -1
  117. package/dist/src/ui/components/InputPrompt.d.ts +1 -0
  118. package/dist/src/ui/components/InputPrompt.js +87 -31
  119. package/dist/src/ui/components/InputPrompt.js.map +1 -1
  120. package/dist/src/ui/components/LoggingDialog.d.ts +37 -0
  121. package/dist/src/ui/components/LoggingDialog.js +155 -0
  122. package/dist/src/ui/components/LoggingDialog.js.map +1 -0
  123. package/dist/src/ui/components/MemoryUsageDisplay.js +6 -4
  124. package/dist/src/ui/components/MemoryUsageDisplay.js.map +1 -1
  125. package/dist/src/ui/components/ProviderDialog.js +100 -26
  126. package/dist/src/ui/components/ProviderDialog.js.map +1 -1
  127. package/dist/src/ui/components/ProviderModelDialog.js +99 -27
  128. package/dist/src/ui/components/ProviderModelDialog.js.map +1 -1
  129. package/dist/src/ui/components/SettingsDialog.d.ts +14 -0
  130. package/dist/src/ui/components/SettingsDialog.js +247 -0
  131. package/dist/src/ui/components/SettingsDialog.js.map +1 -0
  132. package/dist/src/ui/components/ThemeDialog.js +4 -15
  133. package/dist/src/ui/components/ThemeDialog.js.map +1 -1
  134. package/dist/src/ui/components/TodoPanel.d.ts +11 -0
  135. package/dist/src/ui/components/TodoPanel.js +206 -0
  136. package/dist/src/ui/components/TodoPanel.js.map +1 -0
  137. package/dist/src/ui/components/ToolsDialog.d.ts +2 -2
  138. package/dist/src/ui/components/messages/ToolConfirmationMessage.js +116 -16
  139. package/dist/src/ui/components/messages/ToolConfirmationMessage.js.map +1 -1
  140. package/dist/src/ui/components/messages/ToolGroupMessage.js +36 -8
  141. package/dist/src/ui/components/messages/ToolGroupMessage.js.map +1 -1
  142. package/dist/src/ui/components/todo-utils.d.ts +16 -0
  143. package/dist/src/ui/components/todo-utils.js +41 -0
  144. package/dist/src/ui/components/todo-utils.js.map +1 -0
  145. package/dist/src/ui/contexts/SettingsContext.d.ts +9 -0
  146. package/dist/src/ui/contexts/SettingsContext.js +15 -0
  147. package/dist/src/ui/contexts/SettingsContext.js.map +1 -0
  148. package/dist/src/ui/contexts/TodoContext.d.ts +15 -0
  149. package/dist/src/ui/contexts/TodoContext.js +18 -0
  150. package/dist/src/ui/contexts/TodoContext.js.map +1 -0
  151. package/dist/src/ui/contexts/TodoProvider.d.ts +7 -0
  152. package/dist/src/ui/contexts/TodoProvider.js +62 -0
  153. package/dist/src/ui/contexts/TodoProvider.js.map +1 -0
  154. package/dist/src/ui/contexts/ToolCallContext.d.ts +19 -0
  155. package/dist/src/ui/contexts/ToolCallContext.js +13 -0
  156. package/dist/src/ui/contexts/ToolCallContext.js.map +1 -0
  157. package/dist/src/ui/contexts/ToolCallProvider.d.ts +12 -0
  158. package/dist/src/ui/contexts/ToolCallProvider.js +62 -0
  159. package/dist/src/ui/contexts/ToolCallProvider.js.map +1 -0
  160. package/dist/src/ui/hooks/atCommandProcessor.js +28 -4
  161. package/dist/src/ui/hooks/atCommandProcessor.js.map +1 -1
  162. package/dist/src/ui/hooks/slashCommandProcessor.d.ts +6 -2
  163. package/dist/src/ui/hooks/slashCommandProcessor.js +142 -113
  164. package/dist/src/ui/hooks/slashCommandProcessor.js.map +1 -1
  165. package/dist/src/ui/hooks/useAtCompletion.d.ts +23 -0
  166. package/dist/src/ui/hooks/useAtCompletion.js +180 -0
  167. package/dist/src/ui/hooks/useAtCompletion.js.map +1 -0
  168. package/dist/src/ui/hooks/useAuthCommand.js +14 -0
  169. package/dist/src/ui/hooks/useAuthCommand.js.map +1 -1
  170. package/dist/src/ui/hooks/useConsoleMessages.js +7 -0
  171. package/dist/src/ui/hooks/useConsoleMessages.js.map +1 -1
  172. package/dist/src/ui/hooks/useFolderTrust.d.ts +11 -0
  173. package/dist/src/ui/hooks/useFolderTrust.js +22 -0
  174. package/dist/src/ui/hooks/useFolderTrust.js.map +1 -0
  175. package/dist/src/ui/hooks/useGeminiStream.d.ts +1 -1
  176. package/dist/src/ui/hooks/useGeminiStream.js +16 -4
  177. package/dist/src/ui/hooks/useGeminiStream.js.map +1 -1
  178. package/dist/src/ui/hooks/useReactToolScheduler.js +12 -12
  179. package/dist/src/ui/hooks/useReactToolScheduler.js.map +1 -1
  180. package/dist/src/ui/hooks/useResponsive.d.ts +14 -0
  181. package/dist/src/ui/hooks/useResponsive.js +19 -0
  182. package/dist/src/ui/hooks/useResponsive.js.map +1 -0
  183. package/dist/src/ui/hooks/useSettingsCommand.d.ts +10 -0
  184. package/dist/src/ui/hooks/useSettingsCommand.js +21 -0
  185. package/dist/src/ui/hooks/useSettingsCommand.js.map +1 -0
  186. package/dist/src/ui/hooks/useTodoContinuation.d.ts +31 -0
  187. package/dist/src/ui/hooks/useTodoContinuation.js +148 -0
  188. package/dist/src/ui/hooks/useTodoContinuation.js.map +1 -0
  189. package/dist/src/ui/hooks/useTodoContinuation.spec.d.ts +6 -0
  190. package/dist/src/ui/hooks/useTodoContinuation.spec.js +378 -0
  191. package/dist/src/ui/hooks/useTodoContinuation.spec.js.map +1 -0
  192. package/dist/src/ui/hooks/useToolsDialog.d.ts +2 -2
  193. package/dist/src/ui/hooks/useToolsDialog.js.map +1 -1
  194. package/dist/src/ui/keyMatchers.d.ts +26 -0
  195. package/dist/src/ui/keyMatchers.js +68 -0
  196. package/dist/src/ui/keyMatchers.js.map +1 -0
  197. package/dist/src/ui/privacy/PrivacyNotice.js +10 -4
  198. package/dist/src/ui/privacy/PrivacyNotice.js.map +1 -1
  199. package/dist/src/ui/themes/semantic-resolver.d.ts +12 -0
  200. package/dist/src/ui/themes/semantic-resolver.js +32 -0
  201. package/dist/src/ui/themes/semantic-resolver.js.map +1 -0
  202. package/dist/src/ui/themes/semantic-tokens.d.ts +52 -0
  203. package/dist/src/ui/themes/semantic-tokens.js +7 -0
  204. package/dist/src/ui/themes/semantic-tokens.js.map +1 -0
  205. package/dist/src/ui/themes/theme-compat.d.ts +34 -0
  206. package/dist/src/ui/themes/theme-compat.js +65 -0
  207. package/dist/src/ui/themes/theme-compat.js.map +1 -0
  208. package/dist/src/ui/themes/theme-manager.d.ts +8 -0
  209. package/dist/src/ui/themes/theme-manager.js +18 -0
  210. package/dist/src/ui/themes/theme-manager.js.map +1 -1
  211. package/dist/src/ui/types.d.ts +1 -1
  212. package/dist/src/ui/utils/CodeColorizer.d.ts +2 -1
  213. package/dist/src/ui/utils/CodeColorizer.js +4 -3
  214. package/dist/src/ui/utils/CodeColorizer.js.map +1 -1
  215. package/dist/src/ui/utils/ConsolePatcher.d.ts +1 -0
  216. package/dist/src/ui/utils/ConsolePatcher.js +3 -0
  217. package/dist/src/ui/utils/ConsolePatcher.js.map +1 -1
  218. package/dist/src/ui/utils/MarkdownDisplay.js +4 -2
  219. package/dist/src/ui/utils/MarkdownDisplay.js.map +1 -1
  220. package/dist/src/ui/utils/commandUtils.d.ts +1 -0
  221. package/dist/src/ui/utils/commandUtils.js +22 -1
  222. package/dist/src/ui/utils/commandUtils.js.map +1 -1
  223. package/dist/src/ui/utils/responsive.d.ts +16 -0
  224. package/dist/src/ui/utils/responsive.js +111 -0
  225. package/dist/src/ui/utils/responsive.js.map +1 -0
  226. package/dist/src/utils/cleanup.d.ts +2 -2
  227. package/dist/src/utils/cleanup.js +2 -2
  228. package/dist/src/utils/cleanup.js.map +1 -1
  229. package/dist/src/utils/dialogScopeUtils.d.ts +31 -0
  230. package/dist/src/utils/dialogScopeUtils.js +48 -0
  231. package/dist/src/utils/dialogScopeUtils.js.map +1 -0
  232. package/dist/src/utils/gitUtils.d.ts +21 -1
  233. package/dist/src/utils/gitUtils.js +70 -3
  234. package/dist/src/utils/gitUtils.js.map +1 -1
  235. package/dist/src/utils/privacy/ConversationDataRedactor.d.ts +75 -0
  236. package/dist/src/utils/privacy/ConversationDataRedactor.js +412 -0
  237. package/dist/src/utils/privacy/ConversationDataRedactor.js.map +1 -0
  238. package/dist/src/utils/privacy/PrivacyManager.d.ts +58 -0
  239. package/dist/src/utils/privacy/PrivacyManager.js +133 -0
  240. package/dist/src/utils/privacy/PrivacyManager.js.map +1 -0
  241. package/dist/src/utils/sandbox.js +430 -401
  242. package/dist/src/utils/sandbox.js.map +1 -1
  243. package/dist/src/utils/settingsUtils.d.ts +126 -0
  244. package/dist/src/utils/settingsUtils.js +327 -0
  245. package/dist/src/utils/settingsUtils.js.map +1 -0
  246. package/dist/tsconfig.tsbuildinfo +1 -1
  247. package/package.json +6 -4
  248. package/dist/src/ui/components/IDEContextDetailDisplay.d.ts +0 -12
  249. package/dist/src/ui/components/IDEContextDetailDisplay.js +0 -17
  250. 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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"}