@google/gemini-cli-core 0.1.21 → 0.1.22

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 (205) hide show
  1. package/README.md +26 -28
  2. package/dist/src/code_assist/converter.d.ts +1 -0
  3. package/dist/src/code_assist/converter.js +1 -0
  4. package/dist/src/code_assist/converter.js.map +1 -1
  5. package/dist/src/code_assist/oauth2.d.ts +1 -0
  6. package/dist/src/code_assist/oauth2.js +37 -20
  7. package/dist/src/code_assist/oauth2.js.map +1 -1
  8. package/dist/src/code_assist/oauth2.test.js +51 -8
  9. package/dist/src/code_assist/oauth2.test.js.map +1 -1
  10. package/dist/src/code_assist/server.js +1 -1
  11. package/dist/src/code_assist/server.js.map +1 -1
  12. package/dist/src/code_assist/setup.js +1 -1
  13. package/dist/src/code_assist/setup.js.map +1 -1
  14. package/dist/src/code_assist/setup.test.js +14 -8
  15. package/dist/src/code_assist/setup.test.js.map +1 -1
  16. package/dist/src/config/config.d.ts +2 -0
  17. package/dist/src/config/config.js +7 -6
  18. package/dist/src/config/config.js.map +1 -1
  19. package/dist/src/config/config.test.js +22 -0
  20. package/dist/src/config/config.test.js.map +1 -1
  21. package/dist/src/core/client.d.ts +4 -11
  22. package/dist/src/core/client.js +46 -28
  23. package/dist/src/core/client.js.map +1 -1
  24. package/dist/src/core/client.test.js +294 -0
  25. package/dist/src/core/client.test.js.map +1 -1
  26. package/dist/src/core/contentGenerator.js +19 -9
  27. package/dist/src/core/contentGenerator.js.map +1 -1
  28. package/dist/src/core/contentGenerator.test.js +39 -15
  29. package/dist/src/core/contentGenerator.test.js.map +1 -1
  30. package/dist/src/core/coreToolScheduler.js +6 -2
  31. package/dist/src/core/coreToolScheduler.js.map +1 -1
  32. package/dist/src/core/coreToolScheduler.test.js +46 -63
  33. package/dist/src/core/coreToolScheduler.test.js.map +1 -1
  34. package/dist/src/core/logger.d.ts +22 -1
  35. package/dist/src/core/logger.js +103 -17
  36. package/dist/src/core/logger.js.map +1 -1
  37. package/dist/src/core/logger.test.js +86 -20
  38. package/dist/src/core/logger.test.js.map +1 -1
  39. package/dist/src/core/nonInteractiveToolExecutor.js +1 -1
  40. package/dist/src/core/nonInteractiveToolExecutor.js.map +1 -1
  41. package/dist/src/core/nonInteractiveToolExecutor.test.js +79 -36
  42. package/dist/src/core/nonInteractiveToolExecutor.test.js.map +1 -1
  43. package/dist/src/core/prompts.js +4 -4
  44. package/dist/src/core/prompts.js.map +1 -1
  45. package/dist/src/generated/git-commit.d.ts +7 -0
  46. package/dist/src/generated/git-commit.js +10 -0
  47. package/dist/src/generated/git-commit.js.map +1 -0
  48. package/dist/src/ide/constants.d.ts +6 -0
  49. package/dist/src/ide/constants.js +7 -0
  50. package/dist/src/ide/constants.js.map +1 -0
  51. package/dist/src/ide/detect-ide.js +8 -8
  52. package/dist/src/ide/detect-ide.js.map +1 -1
  53. package/dist/src/ide/ide-client.d.ts +5 -1
  54. package/dist/src/ide/ide-client.js +57 -21
  55. package/dist/src/ide/ide-client.js.map +1 -1
  56. package/dist/src/ide/ide-client.test.d.ts +6 -0
  57. package/dist/src/ide/ide-client.test.js +43 -0
  58. package/dist/src/ide/ide-client.test.js.map +1 -0
  59. package/dist/src/ide/ide-installer.js +5 -4
  60. package/dist/src/ide/ide-installer.js.map +1 -1
  61. package/dist/src/ide/ideContext.d.ts +6 -6
  62. package/dist/src/ide/process-utils.d.ts +14 -0
  63. package/dist/src/ide/process-utils.js +57 -0
  64. package/dist/src/ide/process-utils.js.map +1 -0
  65. package/dist/src/index.d.ts +1 -0
  66. package/dist/src/index.js +1 -0
  67. package/dist/src/index.js.map +1 -1
  68. package/dist/src/mcp/oauth-provider.js +176 -58
  69. package/dist/src/mcp/oauth-provider.js.map +1 -1
  70. package/dist/src/mcp/oauth-provider.test.js +132 -62
  71. package/dist/src/mcp/oauth-provider.test.js.map +1 -1
  72. package/dist/src/mcp/oauth-utils.d.ts +3 -1
  73. package/dist/src/mcp/oauth-utils.js +50 -12
  74. package/dist/src/mcp/oauth-utils.js.map +1 -1
  75. package/dist/src/mcp/oauth-utils.test.js +17 -2
  76. package/dist/src/mcp/oauth-utils.test.js.map +1 -1
  77. package/dist/src/services/loopDetectionService.js +5 -5
  78. package/dist/src/services/loopDetectionService.js.map +1 -1
  79. package/dist/src/services/shellExecutionService.test.js +13 -3
  80. package/dist/src/services/shellExecutionService.test.js.map +1 -1
  81. package/dist/src/telemetry/clearcut-logger/clearcut-logger.d.ts +22 -4
  82. package/dist/src/telemetry/clearcut-logger/clearcut-logger.js +60 -34
  83. package/dist/src/telemetry/clearcut-logger/clearcut-logger.js.map +1 -1
  84. package/dist/src/telemetry/clearcut-logger/clearcut-logger.test.d.ts +11 -0
  85. package/dist/src/telemetry/clearcut-logger/clearcut-logger.test.js +91 -39
  86. package/dist/src/telemetry/clearcut-logger/clearcut-logger.test.js.map +1 -1
  87. package/dist/src/telemetry/clearcut-logger/event-metadata-key.d.ts +5 -2
  88. package/dist/src/telemetry/clearcut-logger/event-metadata-key.js +10 -11
  89. package/dist/src/telemetry/clearcut-logger/event-metadata-key.js.map +1 -1
  90. package/dist/src/telemetry/constants.d.ts +1 -0
  91. package/dist/src/telemetry/constants.js +1 -0
  92. package/dist/src/telemetry/constants.js.map +1 -1
  93. package/dist/src/telemetry/index.d.ts +2 -2
  94. package/dist/src/telemetry/index.js +2 -2
  95. package/dist/src/telemetry/index.js.map +1 -1
  96. package/dist/src/telemetry/integration.test.circular.js +1 -0
  97. package/dist/src/telemetry/integration.test.circular.js.map +1 -1
  98. package/dist/src/telemetry/loggers.d.ts +2 -1
  99. package/dist/src/telemetry/loggers.js +22 -4
  100. package/dist/src/telemetry/loggers.js.map +1 -1
  101. package/dist/src/telemetry/loggers.test.js +27 -2
  102. package/dist/src/telemetry/loggers.test.js.map +1 -1
  103. package/dist/src/telemetry/metrics.d.ts +4 -0
  104. package/dist/src/telemetry/metrics.js +21 -8
  105. package/dist/src/telemetry/metrics.js.map +1 -1
  106. package/dist/src/telemetry/metrics.test.js +31 -1
  107. package/dist/src/telemetry/metrics.test.js.map +1 -1
  108. package/dist/src/telemetry/sdk.js +64 -36
  109. package/dist/src/telemetry/sdk.js.map +1 -1
  110. package/dist/src/telemetry/sdk.test.d.ts +6 -0
  111. package/dist/src/telemetry/sdk.test.js +82 -0
  112. package/dist/src/telemetry/sdk.test.js.map +1 -0
  113. package/dist/src/telemetry/types.d.ts +8 -1
  114. package/dist/src/telemetry/types.js +8 -0
  115. package/dist/src/telemetry/types.js.map +1 -1
  116. package/dist/src/test-utils/tools.d.ts +21 -6
  117. package/dist/src/test-utils/tools.js +77 -12
  118. package/dist/src/test-utils/tools.js.map +1 -1
  119. package/dist/src/tools/mcp-client.js +40 -10
  120. package/dist/src/tools/mcp-client.js.map +1 -1
  121. package/dist/src/tools/mcp-client.test.js +31 -1
  122. package/dist/src/tools/mcp-client.test.js.map +1 -1
  123. package/dist/src/tools/mcp-tool.js +21 -3
  124. package/dist/src/tools/mcp-tool.js.map +1 -1
  125. package/dist/src/tools/mcp-tool.test.js +57 -0
  126. package/dist/src/tools/mcp-tool.test.js.map +1 -1
  127. package/dist/src/tools/shell.js +25 -8
  128. package/dist/src/tools/shell.js.map +1 -1
  129. package/dist/src/tools/shell.test.js +12 -0
  130. package/dist/src/tools/shell.test.js.map +1 -1
  131. package/dist/src/tools/tool-error.d.ts +1 -0
  132. package/dist/src/tools/tool-error.js +1 -0
  133. package/dist/src/tools/tool-error.js.map +1 -1
  134. package/dist/src/tools/tool-registry.d.ts +3 -3
  135. package/dist/src/tools/tool-registry.js +45 -30
  136. package/dist/src/tools/tool-registry.js.map +1 -1
  137. package/dist/src/tools/tools.d.ts +14 -73
  138. package/dist/src/tools/tools.js +52 -108
  139. package/dist/src/tools/tools.js.map +1 -1
  140. package/dist/src/tools/tools.test.js +91 -2
  141. package/dist/src/tools/tools.test.js.map +1 -1
  142. package/dist/src/tools/web-search.d.ts +4 -5
  143. package/dist/src/tools/web-search.js +51 -50
  144. package/dist/src/tools/web-search.js.map +1 -1
  145. package/dist/src/tools/web-search.test.d.ts +6 -0
  146. package/dist/src/tools/web-search.test.js +139 -0
  147. package/dist/src/tools/web-search.test.js.map +1 -0
  148. package/dist/src/tools/write-file.d.ts +15 -11
  149. package/dist/src/tools/write-file.js +133 -144
  150. package/dist/src/tools/write-file.js.map +1 -1
  151. package/dist/src/tools/write-file.test.js +57 -88
  152. package/dist/src/tools/write-file.test.js.map +1 -1
  153. package/dist/src/utils/browser.js +4 -3
  154. package/dist/src/utils/browser.js.map +1 -1
  155. package/dist/src/utils/editCorrector.js +13 -13
  156. package/dist/src/utils/editCorrector.js.map +1 -1
  157. package/dist/src/utils/editor.js +1 -1
  158. package/dist/src/utils/editor.js.map +1 -1
  159. package/dist/src/utils/editor.test.js +10 -10
  160. package/dist/src/utils/editor.test.js.map +1 -1
  161. package/dist/src/utils/filesearch/crawler.d.ts +15 -0
  162. package/dist/src/utils/filesearch/crawler.js +50 -0
  163. package/dist/src/utils/filesearch/crawler.js.map +1 -0
  164. package/dist/src/utils/filesearch/crawler.test.d.ts +6 -0
  165. package/dist/src/utils/filesearch/crawler.test.js +468 -0
  166. package/dist/src/utils/filesearch/crawler.test.js.map +1 -0
  167. package/dist/src/utils/filesearch/fileSearch.d.ts +9 -53
  168. package/dist/src/utils/filesearch/fileSearch.js +62 -117
  169. package/dist/src/utils/filesearch/fileSearch.js.map +1 -1
  170. package/dist/src/utils/filesearch/fileSearch.test.js +95 -197
  171. package/dist/src/utils/filesearch/fileSearch.test.js.map +1 -1
  172. package/dist/src/utils/filesearch/ignore.d.ts +7 -0
  173. package/dist/src/utils/filesearch/ignore.js +25 -0
  174. package/dist/src/utils/filesearch/ignore.js.map +1 -1
  175. package/dist/src/utils/filesearch/ignore.test.js +89 -2
  176. package/dist/src/utils/filesearch/ignore.test.js.map +1 -1
  177. package/dist/src/utils/memoryDiscovery.js +3 -3
  178. package/dist/src/utils/memoryDiscovery.js.map +1 -1
  179. package/dist/src/utils/memoryDiscovery.test.js +3 -2
  180. package/dist/src/utils/memoryDiscovery.test.js.map +1 -1
  181. package/dist/src/utils/memoryImportProcessor.js +2 -6
  182. package/dist/src/utils/memoryImportProcessor.js.map +1 -1
  183. package/dist/src/utils/paths.d.ts +7 -0
  184. package/dist/src/utils/paths.js +15 -0
  185. package/dist/src/utils/paths.js.map +1 -1
  186. package/dist/src/utils/paths.test.js +74 -2
  187. package/dist/src/utils/paths.test.js.map +1 -1
  188. package/dist/src/utils/secure-browser-launcher.js +4 -3
  189. package/dist/src/utils/secure-browser-launcher.js.map +1 -1
  190. package/dist/src/utils/shell-utils.d.ts +39 -0
  191. package/dist/src/utils/shell-utils.js +72 -2
  192. package/dist/src/utils/shell-utils.js.map +1 -1
  193. package/dist/src/utils/shell-utils.test.js +132 -4
  194. package/dist/src/utils/shell-utils.test.js.map +1 -1
  195. package/dist/src/utils/systemEncoding.js +1 -1
  196. package/dist/src/utils/systemEncoding.js.map +1 -1
  197. package/dist/src/utils/systemEncoding.test.js +23 -23
  198. package/dist/src/utils/systemEncoding.test.js.map +1 -1
  199. package/dist/src/utils/workspaceContext.d.ts +22 -7
  200. package/dist/src/utils/workspaceContext.js +81 -55
  201. package/dist/src/utils/workspaceContext.js.map +1 -1
  202. package/dist/src/utils/workspaceContext.test.js +221 -137
  203. package/dist/src/utils/workspaceContext.test.js.map +1 -1
  204. package/dist/tsconfig.tsbuildinfo +1 -1
  205. package/package.json +4 -1
@@ -3,206 +3,290 @@
3
3
  * Copyright 2025 Google LLC
4
4
  * SPDX-License-Identifier: Apache-2.0
5
5
  */
6
- import { describe, it, expect, beforeEach, vi } from 'vitest';
6
+ import { describe, it, expect, beforeEach, afterEach, vi } from 'vitest';
7
7
  import * as fs from 'fs';
8
+ import * as os from 'os';
8
9
  import * as path from 'path';
9
10
  import { WorkspaceContext } from './workspaceContext.js';
10
- vi.mock('fs');
11
- describe('WorkspaceContext', () => {
12
- let workspaceContext;
13
- // Use path module to create platform-agnostic paths
14
- const mockCwd = path.resolve(path.sep, 'home', 'user', 'project');
15
- const mockExistingDir = path.resolve(path.sep, 'home', 'user', 'other-project');
16
- const mockNonExistentDir = path.resolve(path.sep, 'home', 'user', 'does-not-exist');
17
- const mockSymlinkDir = path.resolve(path.sep, 'home', 'user', 'symlink');
18
- const mockRealPath = path.resolve(path.sep, 'home', 'user', 'real-directory');
11
+ describe('WorkspaceContext with real filesystem', () => {
12
+ let tempDir;
13
+ let cwd;
14
+ let otherDir;
19
15
  beforeEach(() => {
20
- vi.resetAllMocks();
21
- // Mock fs.existsSync
22
- vi.mocked(fs.existsSync).mockImplementation((path) => {
23
- const pathStr = path.toString();
24
- return (pathStr === mockCwd ||
25
- pathStr === mockExistingDir ||
26
- pathStr === mockSymlinkDir ||
27
- pathStr === mockRealPath);
28
- });
29
- // Mock fs.statSync
30
- vi.mocked(fs.statSync).mockImplementation((path) => {
31
- const pathStr = path.toString();
32
- if (pathStr === mockNonExistentDir) {
33
- throw new Error('ENOENT');
34
- }
35
- return {
36
- isDirectory: () => true,
37
- };
38
- });
39
- // Mock fs.realpathSync
40
- vi.mocked(fs.realpathSync).mockImplementation((path) => {
41
- const pathStr = path.toString();
42
- if (pathStr === mockSymlinkDir) {
43
- return mockRealPath;
44
- }
45
- return pathStr;
46
- });
16
+ // os.tmpdir() can return a path using a symlink (this is standard on macOS)
17
+ // Use fs.realpathSync to fully resolve the absolute path.
18
+ tempDir = fs.realpathSync(fs.mkdtempSync(path.join(os.tmpdir(), 'workspace-context-test-')));
19
+ cwd = path.join(tempDir, 'project');
20
+ otherDir = path.join(tempDir, 'other-project');
21
+ fs.mkdirSync(cwd, { recursive: true });
22
+ fs.mkdirSync(otherDir, { recursive: true });
23
+ });
24
+ afterEach(() => {
25
+ fs.rmSync(tempDir, { recursive: true, force: true });
47
26
  });
48
27
  describe('initialization', () => {
49
28
  it('should initialize with a single directory (cwd)', () => {
50
- workspaceContext = new WorkspaceContext(mockCwd);
29
+ const workspaceContext = new WorkspaceContext(cwd);
51
30
  const directories = workspaceContext.getDirectories();
52
- expect(directories).toHaveLength(1);
53
- expect(directories[0]).toBe(mockCwd);
31
+ expect(directories).toEqual([cwd]);
54
32
  });
55
33
  it('should validate and resolve directories to absolute paths', () => {
56
- const absolutePath = path.join(mockCwd, 'subdir');
57
- vi.mocked(fs.existsSync).mockImplementation((p) => p === mockCwd || p === absolutePath);
58
- vi.mocked(fs.realpathSync).mockImplementation((p) => p.toString());
59
- workspaceContext = new WorkspaceContext(mockCwd, [absolutePath]);
34
+ const workspaceContext = new WorkspaceContext(cwd, [otherDir]);
60
35
  const directories = workspaceContext.getDirectories();
61
- expect(directories).toContain(absolutePath);
36
+ expect(directories).toEqual([cwd, otherDir]);
62
37
  });
63
38
  it('should reject non-existent directories', () => {
39
+ const nonExistentDir = path.join(tempDir, 'does-not-exist');
64
40
  expect(() => {
65
- new WorkspaceContext(mockCwd, [mockNonExistentDir]);
41
+ new WorkspaceContext(cwd, [nonExistentDir]);
66
42
  }).toThrow('Directory does not exist');
67
43
  });
68
44
  it('should handle empty initialization', () => {
69
- workspaceContext = new WorkspaceContext(mockCwd, []);
45
+ const workspaceContext = new WorkspaceContext(cwd, []);
70
46
  const directories = workspaceContext.getDirectories();
71
47
  expect(directories).toHaveLength(1);
72
- expect(directories[0]).toBe(mockCwd);
48
+ expect(fs.realpathSync(directories[0])).toBe(cwd);
73
49
  });
74
50
  });
75
51
  describe('adding directories', () => {
76
- beforeEach(() => {
77
- workspaceContext = new WorkspaceContext(mockCwd);
78
- });
79
52
  it('should add valid directories', () => {
80
- workspaceContext.addDirectory(mockExistingDir);
53
+ const workspaceContext = new WorkspaceContext(cwd);
54
+ workspaceContext.addDirectory(otherDir);
81
55
  const directories = workspaceContext.getDirectories();
82
- expect(directories).toHaveLength(2);
83
- expect(directories).toContain(mockExistingDir);
56
+ expect(directories).toEqual([cwd, otherDir]);
84
57
  });
85
58
  it('should resolve relative paths to absolute', () => {
86
- // Since we can't mock path.resolve, we'll test with absolute paths
87
- workspaceContext.addDirectory(mockExistingDir);
59
+ const workspaceContext = new WorkspaceContext(cwd);
60
+ const relativePath = path.relative(cwd, otherDir);
61
+ workspaceContext.addDirectory(relativePath, cwd);
88
62
  const directories = workspaceContext.getDirectories();
89
- expect(directories).toContain(mockExistingDir);
63
+ expect(directories).toEqual([cwd, otherDir]);
90
64
  });
91
65
  it('should reject non-existent directories', () => {
66
+ const nonExistentDir = path.join(tempDir, 'does-not-exist');
67
+ const workspaceContext = new WorkspaceContext(cwd);
92
68
  expect(() => {
93
- workspaceContext.addDirectory(mockNonExistentDir);
69
+ workspaceContext.addDirectory(nonExistentDir);
94
70
  }).toThrow('Directory does not exist');
95
71
  });
96
72
  it('should prevent duplicate directories', () => {
97
- workspaceContext.addDirectory(mockExistingDir);
98
- workspaceContext.addDirectory(mockExistingDir);
73
+ const workspaceContext = new WorkspaceContext(cwd);
74
+ workspaceContext.addDirectory(otherDir);
75
+ workspaceContext.addDirectory(otherDir);
99
76
  const directories = workspaceContext.getDirectories();
100
- expect(directories.filter((d) => d === mockExistingDir)).toHaveLength(1);
77
+ expect(directories).toHaveLength(2);
101
78
  });
102
79
  it('should handle symbolic links correctly', () => {
103
- workspaceContext.addDirectory(mockSymlinkDir);
80
+ const realDir = path.join(tempDir, 'real');
81
+ fs.mkdirSync(realDir, { recursive: true });
82
+ const symlinkDir = path.join(tempDir, 'symlink-to-real');
83
+ fs.symlinkSync(realDir, symlinkDir, 'dir');
84
+ const workspaceContext = new WorkspaceContext(cwd);
85
+ workspaceContext.addDirectory(symlinkDir);
104
86
  const directories = workspaceContext.getDirectories();
105
- expect(directories).toContain(mockRealPath);
106
- expect(directories).not.toContain(mockSymlinkDir);
87
+ expect(directories).toEqual([cwd, realDir]);
107
88
  });
108
89
  });
109
90
  describe('path validation', () => {
110
- beforeEach(() => {
111
- workspaceContext = new WorkspaceContext(mockCwd, [mockExistingDir]);
112
- });
113
91
  it('should accept paths within workspace directories', () => {
114
- const validPath1 = path.join(mockCwd, 'src', 'file.ts');
115
- const validPath2 = path.join(mockExistingDir, 'lib', 'module.js');
92
+ const workspaceContext = new WorkspaceContext(cwd, [otherDir]);
93
+ const validPath1 = path.join(cwd, 'src', 'file.ts');
94
+ const validPath2 = path.join(otherDir, 'lib', 'module.js');
95
+ fs.mkdirSync(path.dirname(validPath1), { recursive: true });
96
+ fs.writeFileSync(validPath1, 'content');
97
+ fs.mkdirSync(path.dirname(validPath2), { recursive: true });
98
+ fs.writeFileSync(validPath2, 'content');
99
+ expect(workspaceContext.isPathWithinWorkspace(validPath1)).toBe(true);
100
+ expect(workspaceContext.isPathWithinWorkspace(validPath2)).toBe(true);
101
+ });
102
+ it('should accept non-existent paths within workspace directories', () => {
103
+ const workspaceContext = new WorkspaceContext(cwd, [otherDir]);
104
+ const validPath1 = path.join(cwd, 'src', 'file.ts');
105
+ const validPath2 = path.join(otherDir, 'lib', 'module.js');
116
106
  expect(workspaceContext.isPathWithinWorkspace(validPath1)).toBe(true);
117
107
  expect(workspaceContext.isPathWithinWorkspace(validPath2)).toBe(true);
118
108
  });
119
109
  it('should reject paths outside workspace', () => {
120
- const invalidPath = path.resolve(path.dirname(mockCwd), 'outside-workspace', 'file.txt');
110
+ const workspaceContext = new WorkspaceContext(cwd, [otherDir]);
111
+ const invalidPath = path.join(tempDir, 'outside-workspace', 'file.txt');
121
112
  expect(workspaceContext.isPathWithinWorkspace(invalidPath)).toBe(false);
122
113
  });
123
- it('should resolve symbolic links before validation', () => {
124
- const symlinkPath = path.join(mockCwd, 'symlink-file');
125
- const realPath = path.join(mockCwd, 'real-file');
126
- vi.mocked(fs.existsSync).mockReturnValue(true);
127
- vi.mocked(fs.realpathSync).mockImplementation((p) => {
128
- if (p === symlinkPath) {
129
- return realPath;
130
- }
131
- return p.toString();
132
- });
133
- expect(workspaceContext.isPathWithinWorkspace(symlinkPath)).toBe(true);
114
+ it('should reject non-existent paths outside workspace', () => {
115
+ const workspaceContext = new WorkspaceContext(cwd, [otherDir]);
116
+ const invalidPath = path.join(tempDir, 'outside-workspace', 'file.txt');
117
+ expect(workspaceContext.isPathWithinWorkspace(invalidPath)).toBe(false);
134
118
  });
135
119
  it('should handle nested directories correctly', () => {
136
- const nestedPath = path.join(mockCwd, 'deeply', 'nested', 'path', 'file.txt');
120
+ const workspaceContext = new WorkspaceContext(cwd, [otherDir]);
121
+ const nestedPath = path.join(cwd, 'deeply', 'nested', 'path', 'file.txt');
137
122
  expect(workspaceContext.isPathWithinWorkspace(nestedPath)).toBe(true);
138
123
  });
139
124
  it('should handle edge cases (root, parent references)', () => {
140
- const rootPath = '/';
141
- const parentPath = path.dirname(mockCwd);
125
+ const workspaceContext = new WorkspaceContext(cwd, [otherDir]);
126
+ const rootPath = path.parse(tempDir).root;
127
+ const parentPath = path.dirname(cwd);
142
128
  expect(workspaceContext.isPathWithinWorkspace(rootPath)).toBe(false);
143
129
  expect(workspaceContext.isPathWithinWorkspace(parentPath)).toBe(false);
144
130
  });
145
131
  it('should handle non-existent paths correctly', () => {
146
- const nonExistentPath = path.join(mockCwd, 'does-not-exist.txt');
147
- vi.mocked(fs.existsSync).mockImplementation((p) => p !== nonExistentPath);
148
- // Should still validate based on path structure
132
+ const workspaceContext = new WorkspaceContext(cwd, [otherDir]);
133
+ const nonExistentPath = path.join(cwd, 'does-not-exist.txt');
149
134
  expect(workspaceContext.isPathWithinWorkspace(nonExistentPath)).toBe(true);
150
135
  });
136
+ describe('with symbolic link', () => {
137
+ describe('in the workspace', () => {
138
+ let realDir;
139
+ let symlinkDir;
140
+ beforeEach(() => {
141
+ realDir = path.join(cwd, 'real-dir');
142
+ fs.mkdirSync(realDir, { recursive: true });
143
+ symlinkDir = path.join(cwd, 'symlink-file');
144
+ fs.symlinkSync(realDir, symlinkDir, 'dir');
145
+ });
146
+ it('should accept dir paths', () => {
147
+ const workspaceContext = new WorkspaceContext(cwd);
148
+ expect(workspaceContext.isPathWithinWorkspace(symlinkDir)).toBe(true);
149
+ });
150
+ it('should accept non-existent paths', () => {
151
+ const filePath = path.join(symlinkDir, 'does-not-exist.txt');
152
+ const workspaceContext = new WorkspaceContext(cwd);
153
+ expect(workspaceContext.isPathWithinWorkspace(filePath)).toBe(true);
154
+ });
155
+ it('should accept non-existent deep paths', () => {
156
+ const filePath = path.join(symlinkDir, 'deep', 'does-not-exist.txt');
157
+ const workspaceContext = new WorkspaceContext(cwd);
158
+ expect(workspaceContext.isPathWithinWorkspace(filePath)).toBe(true);
159
+ });
160
+ });
161
+ describe('outside the workspace', () => {
162
+ let realDir;
163
+ let symlinkDir;
164
+ beforeEach(() => {
165
+ realDir = path.join(tempDir, 'real-dir');
166
+ fs.mkdirSync(realDir, { recursive: true });
167
+ symlinkDir = path.join(cwd, 'symlink-file');
168
+ fs.symlinkSync(realDir, symlinkDir, 'dir');
169
+ });
170
+ it('should reject dir paths', () => {
171
+ const workspaceContext = new WorkspaceContext(cwd);
172
+ expect(workspaceContext.isPathWithinWorkspace(symlinkDir)).toBe(false);
173
+ });
174
+ it('should reject non-existent paths', () => {
175
+ const filePath = path.join(symlinkDir, 'does-not-exist.txt');
176
+ const workspaceContext = new WorkspaceContext(cwd);
177
+ expect(workspaceContext.isPathWithinWorkspace(filePath)).toBe(false);
178
+ });
179
+ it('should reject non-existent deep paths', () => {
180
+ const filePath = path.join(symlinkDir, 'deep', 'does-not-exist.txt');
181
+ const workspaceContext = new WorkspaceContext(cwd);
182
+ expect(workspaceContext.isPathWithinWorkspace(filePath)).toBe(false);
183
+ });
184
+ it('should reject partially non-existent deep paths', () => {
185
+ const deepDir = path.join(symlinkDir, 'deep');
186
+ fs.mkdirSync(deepDir, { recursive: true });
187
+ const filePath = path.join(deepDir, 'does-not-exist.txt');
188
+ const workspaceContext = new WorkspaceContext(cwd);
189
+ expect(workspaceContext.isPathWithinWorkspace(filePath)).toBe(false);
190
+ });
191
+ });
192
+ it('should reject symbolic file links outside the workspace', () => {
193
+ const realFile = path.join(tempDir, 'real-file.txt');
194
+ fs.writeFileSync(realFile, 'content');
195
+ const symlinkFile = path.join(cwd, 'symlink-to-real-file');
196
+ fs.symlinkSync(realFile, symlinkFile, 'file');
197
+ const workspaceContext = new WorkspaceContext(cwd);
198
+ expect(workspaceContext.isPathWithinWorkspace(symlinkFile)).toBe(false);
199
+ });
200
+ it('should reject non-existent symbolic file links outside the workspace', () => {
201
+ const realFile = path.join(tempDir, 'real-file.txt');
202
+ const symlinkFile = path.join(cwd, 'symlink-to-real-file');
203
+ fs.symlinkSync(realFile, symlinkFile, 'file');
204
+ const workspaceContext = new WorkspaceContext(cwd);
205
+ expect(workspaceContext.isPathWithinWorkspace(symlinkFile)).toBe(false);
206
+ });
207
+ it('should handle circular symlinks gracefully', () => {
208
+ const workspaceContext = new WorkspaceContext(cwd);
209
+ const linkA = path.join(cwd, 'link-a');
210
+ const linkB = path.join(cwd, 'link-b');
211
+ // Create a circular dependency: linkA -> linkB -> linkA
212
+ fs.symlinkSync(linkB, linkA, 'dir');
213
+ fs.symlinkSync(linkA, linkB, 'dir');
214
+ // fs.realpathSync should throw ELOOP, and isPathWithinWorkspace should
215
+ // handle it gracefully and return false.
216
+ expect(workspaceContext.isPathWithinWorkspace(linkA)).toBe(false);
217
+ expect(workspaceContext.isPathWithinWorkspace(linkB)).toBe(false);
218
+ });
219
+ });
220
+ });
221
+ describe('onDirectoriesChanged', () => {
222
+ it('should call listener when adding a directory', () => {
223
+ const workspaceContext = new WorkspaceContext(cwd);
224
+ const listener = vi.fn();
225
+ workspaceContext.onDirectoriesChanged(listener);
226
+ workspaceContext.addDirectory(otherDir);
227
+ expect(listener).toHaveBeenCalledOnce();
228
+ });
229
+ it('should not call listener when adding a duplicate directory', () => {
230
+ const workspaceContext = new WorkspaceContext(cwd);
231
+ workspaceContext.addDirectory(otherDir);
232
+ const listener = vi.fn();
233
+ workspaceContext.onDirectoriesChanged(listener);
234
+ workspaceContext.addDirectory(otherDir);
235
+ expect(listener).not.toHaveBeenCalled();
236
+ });
237
+ it('should call listener when setting different directories', () => {
238
+ const workspaceContext = new WorkspaceContext(cwd);
239
+ const listener = vi.fn();
240
+ workspaceContext.onDirectoriesChanged(listener);
241
+ workspaceContext.setDirectories([otherDir]);
242
+ expect(listener).toHaveBeenCalledOnce();
243
+ });
244
+ it('should not call listener when setting same directories', () => {
245
+ const workspaceContext = new WorkspaceContext(cwd);
246
+ const listener = vi.fn();
247
+ workspaceContext.onDirectoriesChanged(listener);
248
+ workspaceContext.setDirectories([cwd]);
249
+ expect(listener).not.toHaveBeenCalled();
250
+ });
251
+ it('should support multiple listeners', () => {
252
+ const workspaceContext = new WorkspaceContext(cwd);
253
+ const listener1 = vi.fn();
254
+ const listener2 = vi.fn();
255
+ workspaceContext.onDirectoriesChanged(listener1);
256
+ workspaceContext.onDirectoriesChanged(listener2);
257
+ workspaceContext.addDirectory(otherDir);
258
+ expect(listener1).toHaveBeenCalledOnce();
259
+ expect(listener2).toHaveBeenCalledOnce();
260
+ });
261
+ it('should allow unsubscribing a listener', () => {
262
+ const workspaceContext = new WorkspaceContext(cwd);
263
+ const listener = vi.fn();
264
+ const unsubscribe = workspaceContext.onDirectoriesChanged(listener);
265
+ unsubscribe();
266
+ workspaceContext.addDirectory(otherDir);
267
+ expect(listener).not.toHaveBeenCalled();
268
+ });
269
+ it('should not fail if a listener throws an error', () => {
270
+ const workspaceContext = new WorkspaceContext(cwd);
271
+ const errorListener = () => {
272
+ throw new Error('test error');
273
+ };
274
+ const listener = vi.fn();
275
+ workspaceContext.onDirectoriesChanged(errorListener);
276
+ workspaceContext.onDirectoriesChanged(listener);
277
+ expect(() => {
278
+ workspaceContext.addDirectory(otherDir);
279
+ }).not.toThrow();
280
+ expect(listener).toHaveBeenCalledOnce();
281
+ });
151
282
  });
152
283
  describe('getDirectories', () => {
153
284
  it('should return a copy of directories array', () => {
154
- workspaceContext = new WorkspaceContext(mockCwd);
285
+ const workspaceContext = new WorkspaceContext(cwd);
155
286
  const dirs1 = workspaceContext.getDirectories();
156
287
  const dirs2 = workspaceContext.getDirectories();
157
- expect(dirs1).not.toBe(dirs2); // Different array instances
158
- expect(dirs1).toEqual(dirs2); // Same content
159
- });
160
- });
161
- describe('symbolic link security', () => {
162
- beforeEach(() => {
163
- workspaceContext = new WorkspaceContext(mockCwd);
164
- });
165
- it('should follow symlinks but validate resolved path', () => {
166
- const symlinkInsideWorkspace = path.join(mockCwd, 'link-to-subdir');
167
- const resolvedInsideWorkspace = path.join(mockCwd, 'subdir');
168
- vi.mocked(fs.existsSync).mockReturnValue(true);
169
- vi.mocked(fs.realpathSync).mockImplementation((p) => {
170
- if (p === symlinkInsideWorkspace) {
171
- return resolvedInsideWorkspace;
172
- }
173
- return p.toString();
174
- });
175
- expect(workspaceContext.isPathWithinWorkspace(symlinkInsideWorkspace)).toBe(true);
176
- });
177
- it('should prevent sandbox escape via symlinks', () => {
178
- const symlinkEscape = path.join(mockCwd, 'escape-link');
179
- const resolvedOutside = path.resolve(mockCwd, '..', 'outside-file');
180
- vi.mocked(fs.existsSync).mockImplementation((p) => {
181
- const pathStr = p.toString();
182
- return (pathStr === symlinkEscape ||
183
- pathStr === resolvedOutside ||
184
- pathStr === mockCwd);
185
- });
186
- vi.mocked(fs.realpathSync).mockImplementation((p) => {
187
- if (p.toString() === symlinkEscape) {
188
- return resolvedOutside;
189
- }
190
- return p.toString();
191
- });
192
- vi.mocked(fs.statSync).mockImplementation((p) => ({
193
- isDirectory: () => p.toString() !== resolvedOutside,
194
- }));
195
- workspaceContext = new WorkspaceContext(mockCwd);
196
- expect(workspaceContext.isPathWithinWorkspace(symlinkEscape)).toBe(false);
197
- });
198
- it('should handle circular symlinks', () => {
199
- const circularLink = path.join(mockCwd, 'circular');
200
- vi.mocked(fs.existsSync).mockReturnValue(true);
201
- vi.mocked(fs.realpathSync).mockImplementation(() => {
202
- throw new Error('ELOOP: too many symbolic links encountered');
203
- });
204
- // Should handle the error gracefully
205
- expect(workspaceContext.isPathWithinWorkspace(circularLink)).toBe(false);
288
+ expect(dirs1).not.toBe(dirs2);
289
+ expect(dirs1).toEqual(dirs2);
206
290
  });
207
291
  });
208
292
  });
@@ -1 +1 @@
1
- {"version":3,"file":"workspaceContext.test.js","sourceRoot":"","sources":["../../../src/utils/workspaceContext.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"workspaceContext.test.js","sourceRoot":"","sources":["../../../src/utils/workspaceContext.test.ts"],"names":[],"mappings":"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"}