@vybestack/llxprt-code 0.3.4 → 0.4.1-nightly.250923.fc764b9f

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 (228) hide show
  1. package/README.md +3 -0
  2. package/dist/package.json +7 -6
  3. package/dist/src/auth/anthropic-oauth-provider.d.ts +4 -0
  4. package/dist/src/auth/anthropic-oauth-provider.js +14 -0
  5. package/dist/src/auth/anthropic-oauth-provider.js.map +1 -1
  6. package/dist/src/auth/gemini-oauth-provider.d.ts +7 -1
  7. package/dist/src/auth/gemini-oauth-provider.js +48 -9
  8. package/dist/src/auth/gemini-oauth-provider.js.map +1 -1
  9. package/dist/src/auth/qwen-oauth-provider.d.ts +5 -1
  10. package/dist/src/auth/qwen-oauth-provider.js +6 -0
  11. package/dist/src/auth/qwen-oauth-provider.js.map +1 -1
  12. package/dist/src/commands/extensions/examples/context/LLXPRT.md +8 -0
  13. package/dist/src/commands/extensions/examples/context/llxprt-extension.json +5 -0
  14. package/dist/src/commands/extensions/examples/custom-commands/commands/fs/grep-code.toml +6 -0
  15. package/dist/src/commands/extensions/examples/custom-commands/llxprt-extension.json +4 -0
  16. package/dist/src/commands/extensions/examples/exclude-tools/llxprt-extension.json +5 -0
  17. package/dist/src/commands/extensions/examples/mcp-server/example.d.ts +6 -0
  18. package/dist/src/commands/extensions/examples/mcp-server/example.js +46 -0
  19. package/dist/src/commands/extensions/examples/mcp-server/example.js.map +1 -0
  20. package/dist/src/commands/extensions/examples/mcp-server/example.ts +60 -0
  21. package/dist/src/commands/extensions/examples/mcp-server/llxprt-extension.json +10 -0
  22. package/dist/src/commands/extensions/install.js +35 -7
  23. package/dist/src/commands/extensions/install.js.map +1 -1
  24. package/dist/src/commands/extensions/install.test.js +20 -2
  25. package/dist/src/commands/extensions/install.test.js.map +1 -1
  26. package/dist/src/commands/extensions/link.d.ts +12 -0
  27. package/dist/src/commands/extensions/link.js +37 -0
  28. package/dist/src/commands/extensions/link.js.map +1 -0
  29. package/dist/src/commands/extensions/new.d.ts +7 -0
  30. package/dist/src/commands/extensions/new.js +70 -0
  31. package/dist/src/commands/extensions/new.js.map +1 -0
  32. package/dist/src/commands/extensions/new.test.d.ts +6 -0
  33. package/dist/src/commands/extensions/new.test.js +50 -0
  34. package/dist/src/commands/extensions/new.test.js.map +1 -0
  35. package/dist/src/commands/extensions/update.d.ts +2 -1
  36. package/dist/src/commands/extensions/update.js +40 -13
  37. package/dist/src/commands/extensions/update.js.map +1 -1
  38. package/dist/src/commands/extensions.js +4 -0
  39. package/dist/src/commands/extensions.js.map +1 -1
  40. package/dist/src/commands/mcp/add.js +1 -1
  41. package/dist/src/commands/mcp/add.js.map +1 -1
  42. package/dist/src/commands/mcp/list.js +2 -2
  43. package/dist/src/commands/mcp/list.js.map +1 -1
  44. package/dist/src/commands/mcp/remove.js +1 -1
  45. package/dist/src/commands/mcp/remove.js.map +1 -1
  46. package/dist/src/config/auth.d.ts +1 -1
  47. package/dist/src/config/auth.js +6 -13
  48. package/dist/src/config/auth.js.map +1 -1
  49. package/dist/src/config/auth.test.js +13 -7
  50. package/dist/src/config/auth.test.js.map +1 -1
  51. package/dist/src/config/config.d.ts +4 -1
  52. package/dist/src/config/config.js +47 -23
  53. package/dist/src/config/config.js.map +1 -1
  54. package/dist/src/config/extension.d.ts +8 -5
  55. package/dist/src/config/extension.js +76 -24
  56. package/dist/src/config/extension.js.map +1 -1
  57. package/dist/src/config/keyBindings.d.ts +1 -0
  58. package/dist/src/config/keyBindings.js +6 -25
  59. package/dist/src/config/keyBindings.js.map +1 -1
  60. package/dist/src/config/settings.d.ts +4 -4
  61. package/dist/src/config/settings.js +101 -68
  62. package/dist/src/config/settings.js.map +1 -1
  63. package/dist/src/config/settingsSchema.d.ts +252 -3
  64. package/dist/src/config/settingsSchema.js +248 -3
  65. package/dist/src/config/settingsSchema.js.map +1 -1
  66. package/dist/src/config/trustedFolders.d.ts +14 -3
  67. package/dist/src/config/trustedFolders.js +63 -37
  68. package/dist/src/config/trustedFolders.js.map +1 -1
  69. package/dist/src/config/trustedFolders.test.js +84 -9
  70. package/dist/src/config/trustedFolders.test.js.map +1 -1
  71. package/dist/src/gemini.js +74 -18
  72. package/dist/src/gemini.js.map +1 -1
  73. package/dist/src/gemini.test.js +7 -23
  74. package/dist/src/gemini.test.js.map +1 -1
  75. package/dist/src/generated/git-commit.d.ts +1 -1
  76. package/dist/src/generated/git-commit.js +1 -1
  77. package/dist/src/nonInteractiveCli.js +32 -2
  78. package/dist/src/nonInteractiveCli.js.map +1 -1
  79. package/dist/src/providers/providerManagerInstance.d.ts +2 -1
  80. package/dist/src/providers/providerManagerInstance.js +27 -5
  81. package/dist/src/providers/providerManagerInstance.js.map +1 -1
  82. package/dist/src/services/FileCommandLoader.d.ts +2 -0
  83. package/dist/src/services/FileCommandLoader.js +7 -0
  84. package/dist/src/services/FileCommandLoader.js.map +1 -1
  85. package/dist/src/ui/App.js +104 -52
  86. package/dist/src/ui/App.js.map +1 -1
  87. package/dist/src/ui/commands/directoryCommand.js +1 -1
  88. package/dist/src/ui/commands/directoryCommand.js.map +1 -1
  89. package/dist/src/ui/commands/memoryCommand.js +1 -1
  90. package/dist/src/ui/commands/memoryCommand.js.map +1 -1
  91. package/dist/src/ui/commands/providerCommand.js +21 -8
  92. package/dist/src/ui/commands/providerCommand.js.map +1 -1
  93. package/dist/src/ui/components/AuthDialog.test.js +13 -13
  94. package/dist/src/ui/components/AuthDialog.test.js.map +1 -1
  95. package/dist/src/ui/components/FolderTrustDialog.js +5 -3
  96. package/dist/src/ui/components/FolderTrustDialog.js.map +1 -1
  97. package/dist/src/ui/components/FolderTrustDialog.test.js +21 -6
  98. package/dist/src/ui/components/FolderTrustDialog.test.js.map +1 -1
  99. package/dist/src/ui/components/Footer.d.ts +3 -0
  100. package/dist/src/ui/components/Footer.js +4 -4
  101. package/dist/src/ui/components/Footer.js.map +1 -1
  102. package/dist/src/ui/components/GeminiRespondingSpinner.js +5 -3
  103. package/dist/src/ui/components/GeminiRespondingSpinner.js.map +1 -1
  104. package/dist/src/ui/components/InputPrompt.d.ts +2 -2
  105. package/dist/src/ui/components/InputPrompt.js +35 -25
  106. package/dist/src/ui/components/InputPrompt.js.map +1 -1
  107. package/dist/src/ui/components/MemoryUsageDisplay.js +1 -1
  108. package/dist/src/ui/components/MemoryUsageDisplay.js.map +1 -1
  109. package/dist/src/ui/components/ProQuotaDialog.d.ts +13 -0
  110. package/dist/src/ui/components/ProQuotaDialog.js +22 -0
  111. package/dist/src/ui/components/ProQuotaDialog.js.map +1 -0
  112. package/dist/src/ui/components/ProQuotaDialog.test.d.ts +6 -0
  113. package/dist/src/ui/components/ProQuotaDialog.test.js +57 -0
  114. package/dist/src/ui/components/ProQuotaDialog.test.js.map +1 -0
  115. package/dist/src/ui/components/SettingsDialog.js +4 -6
  116. package/dist/src/ui/components/SettingsDialog.js.map +1 -1
  117. package/dist/src/ui/components/SettingsDialog.test.js +2 -2
  118. package/dist/src/ui/components/SettingsDialog.test.js.map +1 -1
  119. package/dist/src/ui/components/ShellConfirmationDialog.js +7 -1
  120. package/dist/src/ui/components/ShellConfirmationDialog.js.map +1 -1
  121. package/dist/src/ui/components/TodoPanel.js +75 -10
  122. package/dist/src/ui/components/TodoPanel.js.map +1 -1
  123. package/dist/src/ui/components/messages/CompressionMessage.js +1 -1
  124. package/dist/src/ui/components/messages/CompressionMessage.js.map +1 -1
  125. package/dist/src/ui/components/messages/DiffRenderer.js +5 -1
  126. package/dist/src/ui/components/messages/DiffRenderer.js.map +1 -1
  127. package/dist/src/ui/components/messages/GeminiMessage.js +1 -1
  128. package/dist/src/ui/components/messages/GeminiMessage.js.map +1 -1
  129. package/dist/src/ui/components/messages/ToolConfirmationMessage.js +1 -1
  130. package/dist/src/ui/components/messages/ToolConfirmationMessage.js.map +1 -1
  131. package/dist/src/ui/components/messages/ToolConfirmationMessage.test.js +0 -8
  132. package/dist/src/ui/components/messages/ToolConfirmationMessage.test.js.map +1 -1
  133. package/dist/src/ui/components/messages/ToolMessage.js +2 -1
  134. package/dist/src/ui/components/messages/ToolMessage.js.map +1 -1
  135. package/dist/src/ui/components/messages/UserMessage.js +1 -1
  136. package/dist/src/ui/components/messages/UserMessage.js.map +1 -1
  137. package/dist/src/ui/components/shared/MaxSizedBox.js.map +1 -1
  138. package/dist/src/ui/components/shared/RadioButtonSelect.js +1 -1
  139. package/dist/src/ui/components/shared/RadioButtonSelect.js.map +1 -1
  140. package/dist/src/ui/components/shared/RadioButtonSelect.test.js +2 -2
  141. package/dist/src/ui/components/shared/RadioButtonSelect.test.js.map +1 -1
  142. package/dist/src/ui/components/shared/text-buffer.js +35 -51
  143. package/dist/src/ui/components/shared/text-buffer.js.map +1 -1
  144. package/dist/src/ui/constants.d.ts +8 -2
  145. package/dist/src/ui/constants.js +9 -2
  146. package/dist/src/ui/constants.js.map +1 -1
  147. package/dist/src/ui/containers/SessionController.js +1 -1
  148. package/dist/src/ui/containers/SessionController.js.map +1 -1
  149. package/dist/src/ui/containers/SessionController.test.js +1 -0
  150. package/dist/src/ui/containers/SessionController.test.js.map +1 -1
  151. package/dist/src/ui/contexts/KeypressContext.js +255 -42
  152. package/dist/src/ui/contexts/KeypressContext.js.map +1 -1
  153. package/dist/src/ui/contexts/KeypressContext.test.js +115 -1
  154. package/dist/src/ui/contexts/KeypressContext.test.js.map +1 -1
  155. package/dist/src/ui/hooks/slashCommandProcessor.js +3 -1
  156. package/dist/src/ui/hooks/slashCommandProcessor.js.map +1 -1
  157. package/dist/src/ui/hooks/useFolderTrust.js +6 -3
  158. package/dist/src/ui/hooks/useFolderTrust.js.map +1 -1
  159. package/dist/src/ui/hooks/useGeminiStream.d.ts +2 -1
  160. package/dist/src/ui/hooks/useGeminiStream.integration.test.js +1 -1
  161. package/dist/src/ui/hooks/useGeminiStream.integration.test.js.map +1 -1
  162. package/dist/src/ui/hooks/useGeminiStream.js +170 -35
  163. package/dist/src/ui/hooks/useGeminiStream.js.map +1 -1
  164. package/dist/src/ui/hooks/useIdeTrustListener.d.ts +15 -0
  165. package/dist/src/ui/hooks/useIdeTrustListener.js +37 -0
  166. package/dist/src/ui/hooks/useIdeTrustListener.js.map +1 -0
  167. package/dist/src/ui/hooks/useInputHistoryStore.d.ts +19 -0
  168. package/dist/src/ui/hooks/useInputHistoryStore.js +81 -0
  169. package/dist/src/ui/hooks/useInputHistoryStore.js.map +1 -0
  170. package/dist/src/ui/hooks/useInputHistoryStore.test.d.ts +6 -0
  171. package/dist/src/ui/hooks/useInputHistoryStore.test.js +234 -0
  172. package/dist/src/ui/hooks/useInputHistoryStore.test.js.map +1 -0
  173. package/dist/src/ui/hooks/useLoadingIndicator.d.ts +1 -1
  174. package/dist/src/ui/hooks/useLoadingIndicator.js +2 -2
  175. package/dist/src/ui/hooks/useLoadingIndicator.js.map +1 -1
  176. package/dist/src/ui/hooks/useLoadingIndicator.test.d.ts +6 -0
  177. package/dist/src/ui/hooks/useLoadingIndicator.test.js +102 -0
  178. package/dist/src/ui/hooks/useLoadingIndicator.test.js.map +1 -0
  179. package/dist/src/ui/hooks/usePhraseCycler.d.ts +1 -1
  180. package/dist/src/ui/hooks/usePhraseCycler.js +25 -17
  181. package/dist/src/ui/hooks/usePhraseCycler.js.map +1 -1
  182. package/dist/src/ui/hooks/usePrivacySettings.d.ts +1 -1
  183. package/dist/src/ui/hooks/usePrivacySettings.js +20 -13
  184. package/dist/src/ui/hooks/usePrivacySettings.js.map +1 -1
  185. package/dist/src/ui/hooks/usePrivacySettings.test.js +52 -105
  186. package/dist/src/ui/hooks/usePrivacySettings.test.js.map +1 -1
  187. package/dist/src/ui/hooks/useTerminalSize.js +22 -8
  188. package/dist/src/ui/hooks/useTerminalSize.js.map +1 -1
  189. package/dist/src/ui/hooks/useToolScheduler.test.js +57 -70
  190. package/dist/src/ui/hooks/useToolScheduler.test.js.map +1 -1
  191. package/dist/src/ui/keyMatchers.test.js +9 -0
  192. package/dist/src/ui/keyMatchers.test.js.map +1 -1
  193. package/dist/src/ui/textConstants.d.ts +9 -0
  194. package/dist/src/ui/textConstants.js +10 -0
  195. package/dist/src/ui/textConstants.js.map +1 -0
  196. package/dist/src/ui/utils/MarkdownDisplay.test.js +2 -2
  197. package/dist/src/ui/utils/MarkdownDisplay.test.js.map +1 -1
  198. package/dist/src/ui/utils/highlight.d.ts +10 -0
  199. package/dist/src/ui/utils/highlight.js +41 -0
  200. package/dist/src/ui/utils/highlight.js.map +1 -0
  201. package/dist/src/ui/utils/highlight.test.d.ts +6 -0
  202. package/dist/src/ui/utils/highlight.test.js +93 -0
  203. package/dist/src/ui/utils/highlight.test.js.map +1 -0
  204. package/dist/src/ui/utils/platformConstants.d.ts +24 -1
  205. package/dist/src/ui/utils/platformConstants.js +26 -1
  206. package/dist/src/ui/utils/platformConstants.js.map +1 -1
  207. package/dist/src/utils/envVarResolver.d.ts +39 -0
  208. package/dist/src/utils/envVarResolver.js +97 -0
  209. package/dist/src/utils/envVarResolver.js.map +1 -0
  210. package/dist/src/utils/envVarResolver.test.d.ts +6 -0
  211. package/dist/src/utils/envVarResolver.test.js +221 -0
  212. package/dist/src/utils/envVarResolver.test.js.map +1 -0
  213. package/dist/src/utils/errors.d.ts +9 -0
  214. package/dist/src/utils/errors.js +18 -0
  215. package/dist/src/utils/errors.js.map +1 -0
  216. package/dist/src/utils/settingsUtils.js +5 -7
  217. package/dist/src/utils/settingsUtils.js.map +1 -1
  218. package/dist/src/utils/singleSettingSaver.d.ts +7 -0
  219. package/dist/src/utils/singleSettingSaver.js +45 -0
  220. package/dist/src/utils/singleSettingSaver.js.map +1 -0
  221. package/dist/src/utils/userStartupWarnings.d.ts +1 -1
  222. package/dist/src/utils/userStartupWarnings.js +1 -1
  223. package/dist/src/utils/userStartupWarnings.js.map +1 -1
  224. package/dist/src/zed-integration/schema.d.ts +398 -398
  225. package/dist/src/zed-integration/zedIntegration.js +11 -7
  226. package/dist/src/zed-integration/zedIntegration.js.map +1 -1
  227. package/dist/tsconfig.tsbuildinfo +1 -1
  228. package/package.json +7 -6
@@ -3,6 +3,7 @@
3
3
  * Copyright 2025 Vybestack LLC
4
4
  * SPDX-License-Identifier: Apache-2.0
5
5
  */
6
+ import type { Settings } from './settings.js';
6
7
  export declare const TRUSTED_FOLDERS_FILENAME = "trustedFolders.json";
7
8
  export declare const SETTINGS_DIRECTORY_NAME = ".llxprt";
8
9
  export declare const USER_SETTINGS_DIR: string;
@@ -25,12 +26,22 @@ export interface TrustedFoldersFile {
25
26
  path: string;
26
27
  }
27
28
  export declare class LoadedTrustedFolders {
28
- user: TrustedFoldersFile;
29
- errors: TrustedFoldersError[];
29
+ readonly user: TrustedFoldersFile;
30
+ readonly errors: TrustedFoldersError[];
30
31
  constructor(user: TrustedFoldersFile, errors: TrustedFoldersError[]);
31
32
  get rules(): TrustRule[];
33
+ /**
34
+ * Returns true or false if the path should be "trusted". This function
35
+ * should only be invoked when the folder trust setting is active.
36
+ *
37
+ * @param location path
38
+ * @returns
39
+ */
40
+ isPathTrusted(location: string): boolean | undefined;
32
41
  setValue(path: string, trustLevel: TrustLevel): void;
33
42
  }
34
43
  export declare function loadTrustedFolders(): LoadedTrustedFolders;
35
44
  export declare function saveTrustedFolders(trustedFoldersFile: TrustedFoldersFile): void;
36
- export declare function isWorkspaceTrusted(): boolean | undefined;
45
+ /** Is folder trust feature enabled per the current applied settings */
46
+ export declare function isFolderTrustEnabled(settings: Settings): boolean;
47
+ export declare function isWorkspaceTrusted(settings: Settings): boolean | undefined;
@@ -3,10 +3,10 @@
3
3
  * Copyright 2025 Vybestack LLC
4
4
  * SPDX-License-Identifier: Apache-2.0
5
5
  */
6
- import * as fs from 'fs';
7
- import * as path from 'path';
8
- import { homedir } from 'os';
9
- import { getErrorMessage, isWithinRoot } from '@vybestack/llxprt-code-core';
6
+ import * as fs from 'node:fs';
7
+ import * as path from 'node:path';
8
+ import { homedir } from 'node:os';
9
+ import { getErrorMessage, isWithinRoot, getIdeTrust, } from '@vybestack/llxprt-code-core';
10
10
  import stripJsonComments from 'strip-json-comments';
11
11
  export const TRUSTED_FOLDERS_FILENAME = 'trustedFolders.json';
12
12
  export const SETTINGS_DIRECTORY_NAME = '.llxprt';
@@ -31,6 +31,44 @@ export class LoadedTrustedFolders {
31
31
  trustLevel,
32
32
  }));
33
33
  }
34
+ /**
35
+ * Returns true or false if the path should be "trusted". This function
36
+ * should only be invoked when the folder trust setting is active.
37
+ *
38
+ * @param location path
39
+ * @returns
40
+ */
41
+ isPathTrusted(location) {
42
+ const trustedPaths = [];
43
+ const untrustedPaths = [];
44
+ for (const rule of this.rules) {
45
+ switch (rule.trustLevel) {
46
+ case TrustLevel.TRUST_FOLDER:
47
+ trustedPaths.push(rule.path);
48
+ break;
49
+ case TrustLevel.TRUST_PARENT:
50
+ trustedPaths.push(path.dirname(rule.path));
51
+ break;
52
+ case TrustLevel.DO_NOT_TRUST:
53
+ untrustedPaths.push(rule.path);
54
+ break;
55
+ default:
56
+ // Do nothing for unknown trust levels.
57
+ break;
58
+ }
59
+ }
60
+ for (const trustedPath of trustedPaths) {
61
+ if (isWithinRoot(location, trustedPath)) {
62
+ return true;
63
+ }
64
+ }
65
+ for (const untrustedPath of untrustedPaths) {
66
+ if (path.normalize(location) === path.normalize(untrustedPath)) {
67
+ return false;
68
+ }
69
+ }
70
+ return undefined;
71
+ }
34
72
  setValue(path, trustLevel) {
35
73
  this.user.config[path] = trustLevel;
36
74
  saveTrustedFolders(this.user);
@@ -65,48 +103,36 @@ export function saveTrustedFolders(trustedFoldersFile) {
65
103
  if (!fs.existsSync(dirPath)) {
66
104
  fs.mkdirSync(dirPath, { recursive: true });
67
105
  }
68
- fs.writeFileSync(trustedFoldersFile.path, JSON.stringify(trustedFoldersFile.config, null, 2), 'utf-8');
106
+ fs.writeFileSync(trustedFoldersFile.path, JSON.stringify(trustedFoldersFile.config, null, 2), { encoding: 'utf-8', mode: 0o600 });
69
107
  }
70
108
  catch (error) {
71
109
  console.error('Error saving trusted folders file:', error);
72
110
  }
73
111
  }
74
- export function isWorkspaceTrusted() {
75
- const { rules, errors } = loadTrustedFolders();
76
- if (errors.length > 0) {
77
- for (const error of errors) {
112
+ /** Is folder trust feature enabled per the current applied settings */
113
+ export function isFolderTrustEnabled(settings) {
114
+ // In llxprt, we use flat settings structure
115
+ const folderTrustSetting = settings.folderTrust ?? false;
116
+ return folderTrustSetting;
117
+ }
118
+ function getWorkspaceTrustFromLocalConfig() {
119
+ const folders = loadTrustedFolders();
120
+ if (folders.errors.length > 0) {
121
+ for (const error of folders.errors) {
78
122
  console.error(`Error loading trusted folders config from ${error.path}: ${error.message}`);
79
123
  }
80
124
  }
81
- const trustedPaths = [];
82
- const untrustedPaths = [];
83
- for (const rule of rules) {
84
- switch (rule.trustLevel) {
85
- case TrustLevel.TRUST_FOLDER:
86
- trustedPaths.push(rule.path);
87
- break;
88
- case TrustLevel.TRUST_PARENT:
89
- trustedPaths.push(path.dirname(rule.path));
90
- break;
91
- case TrustLevel.DO_NOT_TRUST:
92
- untrustedPaths.push(rule.path);
93
- break;
94
- default:
95
- // Do nothing for unknown trust levels.
96
- break;
97
- }
98
- }
99
- const cwd = process.cwd();
100
- for (const trustedPath of trustedPaths) {
101
- if (isWithinRoot(cwd, trustedPath)) {
102
- return true;
103
- }
125
+ return folders.isPathTrusted(process.cwd());
126
+ }
127
+ export function isWorkspaceTrusted(settings) {
128
+ if (!isFolderTrustEnabled(settings)) {
129
+ return true;
104
130
  }
105
- for (const untrustedPath of untrustedPaths) {
106
- if (path.normalize(cwd) === path.normalize(untrustedPath)) {
107
- return false;
108
- }
131
+ const ideTrust = getIdeTrust();
132
+ if (ideTrust !== undefined) {
133
+ return ideTrust;
109
134
  }
110
- return undefined;
135
+ // Fall back to the local user configuration
136
+ return getWorkspaceTrustFromLocalConfig();
111
137
  }
112
138
  //# sourceMappingURL=trustedFolders.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"trustedFolders.js","sourceRoot":"","sources":["../../../src/config/trustedFolders.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"trustedFolders.js","sourceRoot":"","sources":["../../../src/config/trustedFolders.ts"],"names":[],"mappings":"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"}
@@ -53,6 +53,40 @@ describe('Trusted Folders Loading', () => {
53
53
  expect(rules).toEqual([]);
54
54
  expect(errors).toEqual([]);
55
55
  });
56
+ describe('isPathTrusted', () => {
57
+ function setup({ config = {} } = {}) {
58
+ mockFsExistsSync.mockImplementation((p) => p === USER_TRUSTED_FOLDERS_PATH);
59
+ fs.readFileSync.mockImplementation((p) => {
60
+ if (p === USER_TRUSTED_FOLDERS_PATH)
61
+ return JSON.stringify(config);
62
+ return '{}';
63
+ });
64
+ const folders = loadTrustedFolders();
65
+ return { folders };
66
+ }
67
+ it('provides a method to determine if a path is trusted', () => {
68
+ const { folders } = setup({
69
+ config: {
70
+ './myfolder': TrustLevel.TRUST_FOLDER,
71
+ '/trustedparent/trustme': TrustLevel.TRUST_PARENT,
72
+ '/user/folder': TrustLevel.TRUST_FOLDER,
73
+ '/secret': TrustLevel.DO_NOT_TRUST,
74
+ '/secret/publickeys': TrustLevel.TRUST_FOLDER,
75
+ },
76
+ });
77
+ expect(folders.isPathTrusted('/secret')).toBe(false);
78
+ expect(folders.isPathTrusted('/user/folder')).toBe(true);
79
+ expect(folders.isPathTrusted('/secret/publickeys/public.pem')).toBe(true);
80
+ expect(folders.isPathTrusted('/user/folder/harhar')).toBe(true);
81
+ expect(folders.isPathTrusted('myfolder/somefile.jpg')).toBe(true);
82
+ expect(folders.isPathTrusted('/trustedparent/someotherfolder')).toBe(true);
83
+ expect(folders.isPathTrusted('/trustedparent/trustme')).toBe(true);
84
+ // No explicit rule covers this file
85
+ expect(folders.isPathTrusted('/secret/bankaccounts.json')).toBe(undefined);
86
+ expect(folders.isPathTrusted('/secret/mine/privatekey.pem')).toBe(undefined);
87
+ expect(folders.isPathTrusted('/user/someotherfolder')).toBe(undefined);
88
+ });
89
+ });
56
90
  it('should load user rules if only user file exists', () => {
57
91
  const userPath = USER_TRUSTED_FOLDERS_PATH;
58
92
  mockFsExistsSync.mockImplementation((p) => p === userPath);
@@ -88,12 +122,15 @@ describe('Trusted Folders Loading', () => {
88
122
  const loadedFolders = loadTrustedFolders();
89
123
  loadedFolders.setValue('/new/path', TrustLevel.TRUST_FOLDER);
90
124
  expect(loadedFolders.user.config['/new/path']).toBe(TrustLevel.TRUST_FOLDER);
91
- expect(mockFsWriteFileSync).toHaveBeenCalledWith(USER_TRUSTED_FOLDERS_PATH, JSON.stringify({ '/new/path': TrustLevel.TRUST_FOLDER }, null, 2), 'utf-8');
125
+ expect(mockFsWriteFileSync).toHaveBeenCalledWith(USER_TRUSTED_FOLDERS_PATH, JSON.stringify({ '/new/path': TrustLevel.TRUST_FOLDER }, null, 2), { encoding: 'utf-8', mode: 0o600 });
92
126
  });
93
127
  });
94
128
  describe('isWorkspaceTrusted', () => {
95
129
  let mockCwd;
96
130
  const mockRules = {};
131
+ const mockSettings = {
132
+ folderTrust: true,
133
+ };
97
134
  beforeEach(() => {
98
135
  vi.spyOn(process, 'cwd').mockImplementation(() => mockCwd);
99
136
  vi.spyOn(fs, 'readFileSync').mockImplementation((p) => {
@@ -112,45 +149,83 @@ describe('isWorkspaceTrusted', () => {
112
149
  it('should return true for a directly trusted folder', () => {
113
150
  mockCwd = '/home/user/projectA';
114
151
  mockRules['/home/user/projectA'] = TrustLevel.TRUST_FOLDER;
115
- expect(isWorkspaceTrusted()).toBe(true);
152
+ expect(isWorkspaceTrusted(mockSettings)).toBe(true);
116
153
  });
117
154
  it('should return true for a child of a trusted folder', () => {
118
155
  mockCwd = '/home/user/projectA/src';
119
156
  mockRules['/home/user/projectA'] = TrustLevel.TRUST_FOLDER;
120
- expect(isWorkspaceTrusted()).toBe(true);
157
+ expect(isWorkspaceTrusted(mockSettings)).toBe(true);
121
158
  });
122
159
  it('should return true for a child of a trusted parent folder', () => {
123
160
  mockCwd = '/home/user/projectB';
124
161
  mockRules['/home/user/projectB/somefile.txt'] = TrustLevel.TRUST_PARENT;
125
- expect(isWorkspaceTrusted()).toBe(true);
162
+ expect(isWorkspaceTrusted(mockSettings)).toBe(true);
126
163
  });
127
164
  it('should return false for a directly untrusted folder', () => {
128
165
  mockCwd = '/home/user/untrusted';
129
166
  mockRules['/home/user/untrusted'] = TrustLevel.DO_NOT_TRUST;
130
- expect(isWorkspaceTrusted()).toBe(false);
167
+ expect(isWorkspaceTrusted(mockSettings)).toBe(false);
131
168
  });
132
169
  it('should return undefined for a child of an untrusted folder', () => {
133
170
  mockCwd = '/home/user/untrusted/src';
134
171
  mockRules['/home/user/untrusted'] = TrustLevel.DO_NOT_TRUST;
135
- expect(isWorkspaceTrusted()).toBeUndefined();
172
+ expect(isWorkspaceTrusted(mockSettings)).toBeUndefined();
136
173
  });
137
174
  it('should return undefined when no rules match', () => {
138
175
  mockCwd = '/home/user/other';
139
176
  mockRules['/home/user/projectA'] = TrustLevel.TRUST_FOLDER;
140
177
  mockRules['/home/user/untrusted'] = TrustLevel.DO_NOT_TRUST;
141
- expect(isWorkspaceTrusted()).toBeUndefined();
178
+ expect(isWorkspaceTrusted(mockSettings)).toBeUndefined();
142
179
  });
143
180
  it('should prioritize trust over distrust', () => {
144
181
  mockCwd = '/home/user/projectA/untrusted';
145
182
  mockRules['/home/user/projectA'] = TrustLevel.TRUST_FOLDER;
146
183
  mockRules['/home/user/projectA/untrusted'] = TrustLevel.DO_NOT_TRUST;
147
- expect(isWorkspaceTrusted()).toBe(true);
184
+ expect(isWorkspaceTrusted(mockSettings)).toBe(true);
148
185
  });
149
186
  it('should handle path normalization', () => {
150
187
  mockCwd = '/home/user/projectA';
151
188
  mockRules[`/home/user/../user/${path.basename('/home/user/projectA')}`] =
152
189
  TrustLevel.TRUST_FOLDER;
153
- expect(isWorkspaceTrusted()).toBe(true);
190
+ expect(isWorkspaceTrusted(mockSettings)).toBe(true);
191
+ });
192
+ });
193
+ import { getIdeTrust } from '@vybestack/llxprt-code-core';
194
+ vi.mock('@vybestack/llxprt-code-core', async (importOriginal) => {
195
+ const actual = await importOriginal();
196
+ return {
197
+ ...actual,
198
+ getIdeTrust: vi.fn(),
199
+ };
200
+ });
201
+ describe('isWorkspaceTrusted with IDE override', () => {
202
+ const mockSettings = {
203
+ folderTrust: true,
204
+ };
205
+ it('should return true when ideTrust is true, ignoring config', () => {
206
+ vi.mocked(getIdeTrust).mockReturnValue(true);
207
+ // Even if config says don't trust, ideTrust should win.
208
+ vi.spyOn(fs, 'readFileSync').mockReturnValue(JSON.stringify({ [process.cwd()]: TrustLevel.DO_NOT_TRUST }));
209
+ expect(isWorkspaceTrusted(mockSettings)).toBe(true);
210
+ });
211
+ it('should return false when ideTrust is false, ignoring config', () => {
212
+ vi.mocked(getIdeTrust).mockReturnValue(false);
213
+ // Even if config says trust, ideTrust should win.
214
+ vi.spyOn(fs, 'readFileSync').mockReturnValue(JSON.stringify({ [process.cwd()]: TrustLevel.TRUST_FOLDER }));
215
+ expect(isWorkspaceTrusted(mockSettings)).toBe(false);
216
+ });
217
+ it('should fall back to config when ideTrust is undefined', () => {
218
+ vi.mocked(getIdeTrust).mockReturnValue(undefined);
219
+ vi.spyOn(fs, 'existsSync').mockReturnValue(true);
220
+ vi.spyOn(fs, 'readFileSync').mockReturnValue(JSON.stringify({ [process.cwd()]: TrustLevel.TRUST_FOLDER }));
221
+ expect(isWorkspaceTrusted(mockSettings)).toBe(true);
222
+ });
223
+ it('should always return true if folderTrust setting is disabled', () => {
224
+ const settings = {
225
+ folderTrust: false,
226
+ };
227
+ vi.mocked(getIdeTrust).mockReturnValue(false);
228
+ expect(isWorkspaceTrusted(settings)).toBe(true);
154
229
  });
155
230
  });
156
231
  //# sourceMappingURL=trustedFolders.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"trustedFolders.test.js","sourceRoot":"","sources":["../../../src/config/trustedFolders.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"trustedFolders.test.js","sourceRoot":"","sources":["../../../src/config/trustedFolders.test.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,mBAAmB;AACnB,OAAO,KAAK,QAAQ,MAAM,IAAI,CAAC;AAC/B,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,cAAc,EAAE,EAAE;IACrC,MAAM,QAAQ,GAAG,MAAM,cAAc,EAAmB,CAAC;IACzD,OAAO;QACL,GAAG,QAAQ;QACX,OAAO,EAAE,EAAE,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,iBAAiB,CAAC;QACvC,QAAQ,EAAE,EAAE,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC;KAC/B,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,OAAO,EACL,QAAQ,EACR,EAAE,EACF,MAAM,EACN,EAAE,EACF,UAAU,EACV,SAAS,GAGV,MAAM,QAAQ,CAAC;AAChB,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,iBAAiB,MAAM,qBAAqB,CAAC;AACpD,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAE7B,OAAO,EACL,kBAAkB,EAClB,yBAAyB,EACzB,UAAU,EACV,kBAAkB,GACnB,MAAM,qBAAqB,CAAC;AAG7B,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,cAAc,EAAE,EAAE;IACrC,MAAM,QAAQ,GAAG,MAAM,cAAc,EAAa,CAAC;IACnD,OAAO;QACL,GAAG,QAAQ;QACX,UAAU,EAAE,EAAE,CAAC,EAAE,EAAE;QACnB,YAAY,EAAE,EAAE,CAAC,EAAE,EAAE;QACrB,aAAa,EAAE,EAAE,CAAC,EAAE,EAAE;QACtB,SAAS,EAAE,EAAE,CAAC,EAAE,EAAE;KACnB,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,EAAE,CAAC,IAAI,CAAC,qBAAqB,EAAE,GAAG,EAAE,CAAC,CAAC;IACpC,OAAO,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC;CACrC,CAAC,CAAC,CAAC;AAEJ,QAAQ,CAAC,yBAAyB,EAAE,GAAG,EAAE;IACvC,IAAI,gBAA8C,CAAC;IACnD,IAAI,qBAAuD,CAAC;IAC5D,IAAI,mBAAoD,CAAC;IAEzD,UAAU,CAAC,GAAG,EAAE;QACd,EAAE,CAAC,aAAa,EAAE,CAAC;QACnB,gBAAgB,GAAG,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC;QAC5C,qBAAqB,GAAG,EAAE,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC;QACrD,mBAAmB,GAAG,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,aAAa,CAAC,CAAC;QAClD,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,eAAe,CAAC,iBAAiB,CAAC,CAAC;QAC9D,qBAAyC,CAAC,kBAAkB,CAC3D,CAAC,UAAkB,EAAE,EAAE,CAAC,UAAU,CACnC,CAAC;QACD,gBAAyB,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;QACjD,EAAE,CAAC,YAAqB,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;IAClD,CAAC,CAAC,CAAC;IAEH,SAAS,CAAC,GAAG,EAAE;QACb,EAAE,CAAC,eAAe,EAAE,CAAC;IACvB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2CAA2C,EAAE,GAAG,EAAE;QACnD,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,kBAAkB,EAAE,CAAC;QAC/C,MAAM,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QAC1B,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IAC7B,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,eAAe,EAAE,GAAG,EAAE;QAC7B,SAAS,KAAK,CAAC,EAAE,MAAM,GAAG,EAAgC,KAAK,EAAE;YAC9D,gBAAyB,CAAC,kBAAkB,CAC3C,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,yBAAyB,CACvC,CAAC;YACD,EAAE,CAAC,YAAqB,CAAC,kBAAkB,CAAC,CAAC,CAAC,EAAE,EAAE;gBACjD,IAAI,CAAC,KAAK,yBAAyB;oBAAE,OAAO,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;gBACnE,OAAO,IAAI,CAAC;YACd,CAAC,CAAC,CAAC;YAEH,MAAM,OAAO,GAAG,kBAAkB,EAAE,CAAC;YAErC,OAAO,EAAE,OAAO,EAAE,CAAC;QACrB,CAAC;QAED,EAAE,CAAC,qDAAqD,EAAE,GAAG,EAAE;YAC7D,MAAM,EAAE,OAAO,EAAE,GAAG,KAAK,CAAC;gBACxB,MAAM,EAAE;oBACN,YAAY,EAAE,UAAU,CAAC,YAAY;oBACrC,wBAAwB,EAAE,UAAU,CAAC,YAAY;oBACjD,cAAc,EAAE,UAAU,CAAC,YAAY;oBACvC,SAAS,EAAE,UAAU,CAAC,YAAY;oBAClC,oBAAoB,EAAE,UAAU,CAAC,YAAY;iBAC9C;aACF,CAAC,CAAC;YACH,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACrD,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACzD,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC,+BAA+B,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC1E,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC,qBAAqB,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAChE,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC,uBAAuB,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAClE,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC,gCAAgC,CAAC,CAAC,CAAC,IAAI,CAClE,IAAI,CACL,CAAC;YACF,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC,wBAAwB,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAEnE,oCAAoC;YACpC,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC,2BAA2B,CAAC,CAAC,CAAC,IAAI,CAC7D,SAAS,CACV,CAAC;YACF,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC,6BAA6B,CAAC,CAAC,CAAC,IAAI,CAC/D,SAAS,CACV,CAAC;YACF,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC,uBAAuB,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACzE,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iDAAiD,EAAE,GAAG,EAAE;QACzD,MAAM,QAAQ,GAAG,yBAAyB,CAAC;QAC1C,gBAAyB,CAAC,kBAAkB,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,QAAQ,CAAC,CAAC;QACrE,MAAM,WAAW,GAAG;YAClB,cAAc,EAAE,UAAU,CAAC,YAAY;SACxC,CAAC;QACD,EAAE,CAAC,YAAqB,CAAC,kBAAkB,CAAC,CAAC,CAAC,EAAE,EAAE;YACjD,IAAI,CAAC,KAAK,QAAQ;gBAAE,OAAO,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;YACvD,OAAO,IAAI,CAAC;QACd,CAAC,CAAC,CAAC;QAEH,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,kBAAkB,EAAE,CAAC;QAC/C,MAAM,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC;YACpB,EAAE,IAAI,EAAE,cAAc,EAAE,UAAU,EAAE,UAAU,CAAC,YAAY,EAAE;SAC9D,CAAC,CAAC;QACH,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IAC7B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8CAA8C,EAAE,GAAG,EAAE;QACtD,MAAM,QAAQ,GAAG,yBAAyB,CAAC;QAC1C,gBAAyB,CAAC,kBAAkB,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,QAAQ,CAAC,CAAC;QACpE,EAAE,CAAC,YAAqB,CAAC,kBAAkB,CAAC,CAAC,CAAC,EAAE,EAAE;YACjD,IAAI,CAAC,KAAK,QAAQ;gBAAE,OAAO,cAAc,CAAC;YAC1C,OAAO,IAAI,CAAC;QACd,CAAC,CAAC,CAAC;QAEH,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,kBAAkB,EAAE,CAAC;QAC/C,MAAM,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QAC1B,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC9B,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACtC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,kBAAkB,CAAC,CAAC;IAC1D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oDAAoD,EAAE,GAAG,EAAE;QAC5D,MAAM,aAAa,GAAG,kBAAkB,EAAE,CAAC;QAC3C,aAAa,CAAC,QAAQ,CAAC,WAAW,EAAE,UAAU,CAAC,YAAY,CAAC,CAAC;QAE7D,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CACjD,UAAU,CAAC,YAAY,CACxB,CAAC;QACF,MAAM,CAAC,mBAAmB,CAAC,CAAC,oBAAoB,CAC9C,yBAAyB,EACzB,IAAI,CAAC,SAAS,CAAC,EAAE,WAAW,EAAE,UAAU,CAAC,YAAY,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,EACjE,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,CACnC,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,oBAAoB,EAAE,GAAG,EAAE;IAClC,IAAI,OAAe,CAAC;IACpB,MAAM,SAAS,GAA+B,EAAE,CAAC;IACjD,MAAM,YAAY,GAAa;QAC7B,WAAW,EAAE,IAAI;KACN,CAAC;IAEd,UAAU,CAAC,GAAG,EAAE;QACd,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,kBAAkB,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,CAAC;QAC3D,EAAE,CAAC,KAAK,CAAC,EAAE,EAAE,cAAc,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,EAAE,EAAE;YACpD,IAAI,CAAC,KAAK,yBAAyB,EAAE,CAAC;gBACpC,OAAO,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;YACnC,CAAC;YACD,OAAO,IAAI,CAAC;QACd,CAAC,CAAC,CAAC;QACH,EAAE,CAAC,KAAK,CAAC,EAAE,EAAE,YAAY,CAAC,CAAC,kBAAkB,CAC3C,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,yBAAyB,CACvC,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,SAAS,CAAC,GAAG,EAAE;QACb,EAAE,CAAC,eAAe,EAAE,CAAC;QACrB,mBAAmB;QACnB,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,OAAO,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;IACjE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kDAAkD,EAAE,GAAG,EAAE;QAC1D,OAAO,GAAG,qBAAqB,CAAC;QAChC,SAAS,CAAC,qBAAqB,CAAC,GAAG,UAAU,CAAC,YAAY,CAAC;QAC3D,MAAM,CAAC,kBAAkB,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACtD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oDAAoD,EAAE,GAAG,EAAE;QAC5D,OAAO,GAAG,yBAAyB,CAAC;QACpC,SAAS,CAAC,qBAAqB,CAAC,GAAG,UAAU,CAAC,YAAY,CAAC;QAC3D,MAAM,CAAC,kBAAkB,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACtD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2DAA2D,EAAE,GAAG,EAAE;QACnE,OAAO,GAAG,qBAAqB,CAAC;QAChC,SAAS,CAAC,kCAAkC,CAAC,GAAG,UAAU,CAAC,YAAY,CAAC;QACxE,MAAM,CAAC,kBAAkB,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACtD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qDAAqD,EAAE,GAAG,EAAE;QAC7D,OAAO,GAAG,sBAAsB,CAAC;QACjC,SAAS,CAAC,sBAAsB,CAAC,GAAG,UAAU,CAAC,YAAY,CAAC;QAC5D,MAAM,CAAC,kBAAkB,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACvD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4DAA4D,EAAE,GAAG,EAAE;QACpE,OAAO,GAAG,0BAA0B,CAAC;QACrC,SAAS,CAAC,sBAAsB,CAAC,GAAG,UAAU,CAAC,YAAY,CAAC;QAC5D,MAAM,CAAC,kBAAkB,CAAC,YAAY,CAAC,CAAC,CAAC,aAAa,EAAE,CAAC;IAC3D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6CAA6C,EAAE,GAAG,EAAE;QACrD,OAAO,GAAG,kBAAkB,CAAC;QAC7B,SAAS,CAAC,qBAAqB,CAAC,GAAG,UAAU,CAAC,YAAY,CAAC;QAC3D,SAAS,CAAC,sBAAsB,CAAC,GAAG,UAAU,CAAC,YAAY,CAAC;QAC5D,MAAM,CAAC,kBAAkB,CAAC,YAAY,CAAC,CAAC,CAAC,aAAa,EAAE,CAAC;IAC3D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uCAAuC,EAAE,GAAG,EAAE;QAC/C,OAAO,GAAG,+BAA+B,CAAC;QAC1C,SAAS,CAAC,qBAAqB,CAAC,GAAG,UAAU,CAAC,YAAY,CAAC;QAC3D,SAAS,CAAC,+BAA+B,CAAC,GAAG,UAAU,CAAC,YAAY,CAAC;QACrE,MAAM,CAAC,kBAAkB,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACtD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kCAAkC,EAAE,GAAG,EAAE;QAC1C,OAAO,GAAG,qBAAqB,CAAC;QAChC,SAAS,CAAC,sBAAsB,IAAI,CAAC,QAAQ,CAAC,qBAAqB,CAAC,EAAE,CAAC;YACrE,UAAU,CAAC,YAAY,CAAC;QAC1B,MAAM,CAAC,kBAAkB,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACtD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAE1D,EAAE,CAAC,IAAI,CAAC,6BAA6B,EAAE,KAAK,EAAE,cAAc,EAAE,EAAE;IAC9D,MAAM,MAAM,GAAG,MAAM,cAAc,EAA2B,CAAC;IAC/D,OAAO;QACL,GAAG,MAAM;QACT,WAAW,EAAE,EAAE,CAAC,EAAE,EAAE;KACrB,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,sCAAsC,EAAE,GAAG,EAAE;IACpD,MAAM,YAAY,GAAa;QAC7B,WAAW,EAAE,IAAI;KACN,CAAC;IAEd,EAAE,CAAC,2DAA2D,EAAE,GAAG,EAAE;QACnE,EAAE,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;QAC7C,wDAAwD;QACxD,EAAE,CAAC,KAAK,CAAC,EAAE,EAAE,cAAc,CAAC,CAAC,eAAe,CAC1C,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,EAAE,UAAU,CAAC,YAAY,EAAE,CAAC,CAC7D,CAAC;QACF,MAAM,CAAC,kBAAkB,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACtD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6DAA6D,EAAE,GAAG,EAAE;QACrE,EAAE,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;QAC9C,kDAAkD;QAClD,EAAE,CAAC,KAAK,CAAC,EAAE,EAAE,cAAc,CAAC,CAAC,eAAe,CAC1C,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,EAAE,UAAU,CAAC,YAAY,EAAE,CAAC,CAC7D,CAAC;QACF,MAAM,CAAC,kBAAkB,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACvD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uDAAuD,EAAE,GAAG,EAAE;QAC/D,EAAE,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC;QAClD,EAAE,CAAC,KAAK,CAAC,EAAE,EAAE,YAAY,CAAC,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;QACjD,EAAE,CAAC,KAAK,CAAC,EAAE,EAAE,cAAc,CAAC,CAAC,eAAe,CAC1C,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,EAAE,UAAU,CAAC,YAAY,EAAE,CAAC,CAC7D,CAAC;QACF,MAAM,CAAC,kBAAkB,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACtD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8DAA8D,EAAE,GAAG,EAAE;QACtE,MAAM,QAAQ,GAAa;YACzB,WAAW,EAAE,KAAK;SACP,CAAC;QACd,EAAE,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;QAC9C,MAAM,CAAC,kBAAkB,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAClD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -1,11 +1,12 @@
1
- import { jsx as _jsx } from "react/jsx-runtime";
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  /**
3
3
  * @license
4
4
  * Copyright 2025 Vybestack LLC
5
5
  * SPDX-License-Identifier: Apache-2.0
6
6
  */
7
- import React from 'react';
8
- import { render } from 'ink';
7
+ import React, { useState, useEffect } from 'react';
8
+ import { render, Box, Text } from 'ink';
9
+ import Spinner from 'ink-spinner';
9
10
  import { AppWrapper } from './ui/App.js';
10
11
  import { ErrorBoundary } from './ui/components/ErrorBoundary.js';
11
12
  import { loadCliConfig, parseArguments } from './config/config.js';
@@ -19,7 +20,7 @@ import { spawn } from 'node:child_process';
19
20
  import { start_sandbox } from './utils/sandbox.js';
20
21
  import chalk from 'chalk';
21
22
  import { loadSettings, SettingScope, } from './config/settings.js';
22
- import { getSettingsService, sessionId, AuthType, getOauthClient, setGitStatsService, FatalConfigError,
23
+ import { getSettingsService, sessionId, AuthType, getOauthClient, setGitStatsService, FatalConfigError, uiTelemetryService,
23
24
  // IDE connection logging removed - telemetry disabled in llxprt
24
25
  } from '@vybestack/llxprt-code-core';
25
26
  import { themeManager } from './ui/themes/theme-manager.js';
@@ -28,7 +29,7 @@ import { getUserStartupWarnings } from './utils/userStartupWarnings.js';
28
29
  import { ConsolePatcher } from './ui/utils/ConsolePatcher.js';
29
30
  import { runNonInteractive } from './nonInteractiveCli.js';
30
31
  import { loadExtensions } from './config/extension.js';
31
- import { cleanupCheckpoints, registerCleanup } from './utils/cleanup.js';
32
+ import { cleanupCheckpoints, registerCleanup, runExitCleanup, } from './utils/cleanup.js';
32
33
  import { getCliVersion } from './utils/version.js';
33
34
  import { validateAuthMethod } from './config/auth.js';
34
35
  import { setMaxSizedBoxDebugging } from './ui/components/shared/MaxSizedBox.js';
@@ -41,6 +42,7 @@ import { handleAutoUpdate } from './utils/handleAutoUpdate.js';
41
42
  import { GitStatsServiceImpl } from './providers/logging/git-stats-service-impl.js';
42
43
  import { appEvents, AppEvent } from './utils/events.js';
43
44
  import { SettingsContext } from './ui/contexts/SettingsContext.js';
45
+ import { writeFileSync } from 'node:fs';
44
46
  export function validateDnsResolutionOrder(order) {
45
47
  const defaultValue = 'ipv4first';
46
48
  if (order === undefined) {
@@ -83,6 +85,26 @@ async function relaunchWithAdditionalArgs(additionalArgs) {
83
85
  await new Promise((resolve) => child.on('close', resolve));
84
86
  process.exit(0);
85
87
  }
88
+ const InitializingComponent = ({ initialTotal }) => {
89
+ const [total, setTotal] = useState(initialTotal);
90
+ const [connected, setConnected] = useState(0);
91
+ useEffect(() => {
92
+ const onStart = ({ count }) => setTotal(count);
93
+ const onChange = () => {
94
+ setConnected((val) => val + 1);
95
+ };
96
+ appEvents.on('mcp-servers-discovery-start', onStart);
97
+ appEvents.on('mcp-server-connected', onChange);
98
+ appEvents.on('mcp-server-error', onChange);
99
+ return () => {
100
+ appEvents.off('mcp-servers-discovery-start', onStart);
101
+ appEvents.off('mcp-server-connected', onChange);
102
+ appEvents.off('mcp-server-error', onChange);
103
+ };
104
+ }, []);
105
+ const message = `Connecting to MCP servers... (${connected}/${total})`;
106
+ return (_jsx(Box, { children: _jsxs(Text, { children: [_jsx(Spinner, {}), " ", message] }) }));
107
+ };
86
108
  import { runZedIntegration } from './zed-integration/zedIntegration.js';
87
109
  import { existsSync, mkdirSync } from 'fs';
88
110
  import { homedir } from 'os';
@@ -162,7 +184,25 @@ export async function main() {
162
184
  const workspaceRoot = process.cwd();
163
185
  const settings = loadSettings(workspaceRoot);
164
186
  const argv = await parseArguments(settings.merged);
187
+ const hasPipedInput = !process.stdin.isTTY;
188
+ let cachedStdinData = null;
189
+ let stdinWasRead = false;
190
+ const readStdinOnce = async () => {
191
+ if (!stdinWasRead) {
192
+ stdinWasRead = true;
193
+ cachedStdinData = await readStdin();
194
+ }
195
+ return cachedStdinData ?? '';
196
+ };
197
+ const questionFromArgs = argv.promptInteractive || argv.prompt || (argv.promptWords || []).join(' ');
165
198
  await cleanupCheckpoints();
199
+ if (hasPipedInput) {
200
+ const stdinSnapshot = await readStdinOnce();
201
+ if (!stdinSnapshot && !questionFromArgs) {
202
+ console.error(`No input provided via stdin. Input can be provided by piping data into gemini or using the --prompt option.`);
203
+ process.exit(1);
204
+ }
205
+ }
166
206
  if (settings.errors.length > 0) {
167
207
  const errorMessages = settings.errors.map((error) => `Error in ${error.path}: ${error.message}`);
168
208
  throw new FatalConfigError(`${errorMessages.join('\n')}\nPlease fix the configuration file(s) and try again.`);
@@ -176,6 +216,12 @@ export async function main() {
176
216
  }
177
217
  const extensions = loadExtensions(workspaceRoot);
178
218
  const config = await loadCliConfig(settings.merged, extensions, sessionId, argv);
219
+ if (argv.sessionSummary) {
220
+ registerCleanup(() => {
221
+ const metrics = uiTelemetryService.getMetrics();
222
+ writeFileSync(argv.sessionSummary, JSON.stringify({ sessionMetrics: metrics }, null, 2));
223
+ });
224
+ }
179
225
  const consolePatcher = new ConsolePatcher({
180
226
  stderr: true,
181
227
  debugMode: config.getDebugMode(),
@@ -217,15 +263,22 @@ export async function main() {
217
263
  settings.setValue(SettingScope.User, 'selectedAuthType', AuthType.USE_NONE);
218
264
  }
219
265
  }
220
- // Empty key causes issues with the GoogleGenAI package.
221
- if (process.env['GEMINI_API_KEY']?.trim() === '') {
222
- delete process.env['GEMINI_API_KEY'];
223
- }
224
- if (process.env['GOOGLE_API_KEY']?.trim() === '') {
225
- delete process.env['GOOGLE_API_KEY'];
226
- }
227
266
  setMaxSizedBoxDebugging(config.getDebugMode());
267
+ const mcpServers = config.getMcpServers();
268
+ const mcpServersCount = mcpServers ? Object.keys(mcpServers).length : 0;
269
+ let spinnerInstance;
270
+ if (typeof config.isInteractive === 'function' &&
271
+ config.isInteractive() &&
272
+ mcpServersCount > 0) {
273
+ spinnerInstance = render(_jsx(InitializingComponent, { initialTotal: mcpServersCount }));
274
+ }
228
275
  await config.initialize();
276
+ if (spinnerInstance) {
277
+ // Small UX detail to show the completion message for a bit before unmounting.
278
+ await new Promise((f) => setTimeout(f, 100));
279
+ spinnerInstance.clear();
280
+ spinnerInstance.unmount();
281
+ }
229
282
  if (config.getIdeMode()) {
230
283
  const ideClient = config.getIdeClient();
231
284
  if (ideClient) {
@@ -448,8 +501,8 @@ export async function main() {
448
501
  }
449
502
  }
450
503
  let stdinData = '';
451
- if (!process.stdin.isTTY) {
452
- stdinData = await readStdin();
504
+ if (hasPipedInput) {
505
+ stdinData = await readStdinOnce();
453
506
  }
454
507
  // This function is a copy of the one from sandbox.ts
455
508
  // It is moved here to decouple sandbox.ts from the CLI's argument structure.
@@ -515,16 +568,17 @@ export async function main() {
515
568
  // Check if a provider is already active on startup
516
569
  providerManager.getActiveProvider();
517
570
  // Render UI, passing necessary config values. Check that there is no command line question.
518
- if (config.isInteractive()) {
571
+ if (typeof config.isInteractive === 'function' && config.isInteractive()) {
519
572
  await startInteractiveUI(config, settings, startupWarnings, workspaceRoot);
520
573
  return;
521
574
  }
522
575
  // If not a TTY, read from stdin
523
576
  // This is for cases where the user pipes input directly into the command
524
- if (!process.stdin.isTTY) {
525
- const stdinData = await readStdin();
577
+ if (hasPipedInput) {
578
+ const stdinData = await readStdinOnce();
526
579
  if (stdinData) {
527
- input = `${stdinData}\n\n${input}`;
580
+ const existingInput = input ? `${input}` : '';
581
+ input = `${stdinData}\n\n${existingInput}`;
528
582
  }
529
583
  }
530
584
  if (!input) {
@@ -534,6 +588,8 @@ export async function main() {
534
588
  const prompt_id = Math.random().toString(16).slice(2);
535
589
  const nonInteractiveConfig = await validateNonInteractiveAuth(settings.merged.selectedAuthType, settings.merged.useExternalAuth, config);
536
590
  await runNonInteractive(nonInteractiveConfig, input, prompt_id);
591
+ // Call cleanup before process.exit, which causes cleanup to not run
592
+ await runExitCleanup();
537
593
  process.exit(0);
538
594
  }
539
595
  function setWindowTitle(title, settings) {