@google/gemini-cli-core 0.1.13 → 0.1.15-nightly.250731.0c6f7884

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 (304) hide show
  1. package/README.md +50 -1
  2. package/dist/google-gemini-cli-core-0.1.15.tgz +0 -0
  3. package/dist/src/code_assist/codeAssist.js +2 -2
  4. package/dist/src/code_assist/codeAssist.js.map +1 -1
  5. package/dist/src/code_assist/oauth2.js +9 -2
  6. package/dist/src/code_assist/oauth2.js.map +1 -1
  7. package/dist/src/code_assist/oauth2.test.js +99 -7
  8. package/dist/src/code_assist/oauth2.test.js.map +1 -1
  9. package/dist/src/code_assist/server.d.ts +4 -6
  10. package/dist/src/code_assist/server.js +4 -69
  11. package/dist/src/code_assist/server.js.map +1 -1
  12. package/dist/src/code_assist/setup.d.ts +6 -1
  13. package/dist/src/code_assist/setup.js +4 -1
  14. package/dist/src/code_assist/setup.js.map +1 -1
  15. package/dist/src/code_assist/setup.test.js +4 -1
  16. package/dist/src/code_assist/setup.test.js.map +1 -1
  17. package/dist/src/code_assist/types.d.ts +2 -2
  18. package/dist/src/config/config.d.ts +43 -11
  19. package/dist/src/config/config.js +79 -27
  20. package/dist/src/config/config.js.map +1 -1
  21. package/dist/src/config/config.test.js +34 -23
  22. package/dist/src/config/config.test.js.map +1 -1
  23. package/dist/src/config/flashFallback.test.js +24 -48
  24. package/dist/src/config/flashFallback.test.js.map +1 -1
  25. package/dist/src/config/models.d.ts +1 -0
  26. package/dist/src/config/models.js +1 -0
  27. package/dist/src/config/models.js.map +1 -1
  28. package/dist/src/core/client.d.ts +5 -2
  29. package/dist/src/core/client.js +64 -22
  30. package/dist/src/core/client.js.map +1 -1
  31. package/dist/src/core/client.test.js +199 -2
  32. package/dist/src/core/client.test.js.map +1 -1
  33. package/dist/src/core/contentGenerator.d.ts +1 -1
  34. package/dist/src/core/contentGenerator.js +1 -1
  35. package/dist/src/core/contentGenerator.js.map +1 -1
  36. package/dist/src/core/coreToolScheduler.d.ts +1 -3
  37. package/dist/src/core/coreToolScheduler.js +1 -3
  38. package/dist/src/core/coreToolScheduler.js.map +1 -1
  39. package/dist/src/core/coreToolScheduler.test.js +76 -1
  40. package/dist/src/core/coreToolScheduler.test.js.map +1 -1
  41. package/dist/src/core/geminiChat.d.ts +4 -3
  42. package/dist/src/core/geminiChat.js +9 -11
  43. package/dist/src/core/geminiChat.js.map +1 -1
  44. package/dist/src/core/geminiRequest.js +2 -37
  45. package/dist/src/core/geminiRequest.js.map +1 -1
  46. package/dist/src/core/logger.d.ts +1 -0
  47. package/dist/src/core/logger.js +24 -4
  48. package/dist/src/core/logger.js.map +1 -1
  49. package/dist/src/core/logger.test.js +61 -10
  50. package/dist/src/core/logger.test.js.map +1 -1
  51. package/dist/src/core/nonInteractiveToolExecutor.test.js +5 -5
  52. package/dist/src/core/prompts.js +43 -19
  53. package/dist/src/core/prompts.js.map +1 -1
  54. package/dist/src/core/prompts.test.js +121 -4
  55. package/dist/src/core/prompts.test.js.map +1 -1
  56. package/dist/src/core/tokenLimits.js +1 -0
  57. package/dist/src/core/tokenLimits.js.map +1 -1
  58. package/dist/src/core/turn.d.ts +7 -2
  59. package/dist/src/core/turn.js +9 -0
  60. package/dist/src/core/turn.js.map +1 -1
  61. package/dist/src/core/turn.test.js +129 -0
  62. package/dist/src/core/turn.test.js.map +1 -1
  63. package/dist/src/ide/detect-ide.d.ts +10 -0
  64. package/dist/src/ide/detect-ide.js +24 -0
  65. package/dist/src/ide/detect-ide.js.map +1 -0
  66. package/dist/src/ide/ide-client.d.ts +40 -0
  67. package/dist/src/ide/ide-client.js +152 -0
  68. package/dist/src/ide/ide-client.js.map +1 -0
  69. package/dist/src/ide/ide-installer.d.ts +15 -0
  70. package/dist/src/ide/ide-installer.js +111 -0
  71. package/dist/src/ide/ide-installer.js.map +1 -0
  72. package/dist/src/ide/ide-installer.test.js +78 -0
  73. package/dist/src/ide/ide-installer.test.js.map +1 -0
  74. package/dist/src/ide/ideContext.d.ts +279 -0
  75. package/dist/src/ide/ideContext.js +102 -0
  76. package/dist/src/ide/ideContext.js.map +1 -0
  77. package/dist/src/ide/ideContext.test.js +265 -0
  78. package/dist/src/ide/ideContext.test.js.map +1 -0
  79. package/dist/src/index.d.ts +11 -1
  80. package/dist/src/index.js +14 -1
  81. package/dist/src/index.js.map +1 -1
  82. package/dist/src/mcp/google-auth-provider.d.ts +23 -0
  83. package/dist/src/mcp/google-auth-provider.js +63 -0
  84. package/dist/src/mcp/google-auth-provider.js.map +1 -0
  85. package/dist/src/mcp/google-auth-provider.test.d.ts +6 -0
  86. package/dist/src/mcp/google-auth-provider.test.js +54 -0
  87. package/dist/src/mcp/google-auth-provider.test.js.map +1 -0
  88. package/dist/src/mcp/oauth-provider.d.ts +5 -1
  89. package/dist/src/mcp/oauth-provider.js +36 -11
  90. package/dist/src/mcp/oauth-provider.js.map +1 -1
  91. package/dist/src/mcp/oauth-provider.test.js +2 -2
  92. package/dist/src/mcp/oauth-provider.test.js.map +1 -1
  93. package/dist/src/mcp/oauth-token-storage.d.ts +3 -1
  94. package/dist/src/mcp/oauth-token-storage.js +3 -1
  95. package/dist/src/mcp/oauth-token-storage.js.map +1 -1
  96. package/dist/src/mcp/oauth-utils.js +2 -2
  97. package/dist/src/mcp/oauth-utils.js.map +1 -1
  98. package/dist/src/mcp/oauth-utils.test.js +1 -1
  99. package/dist/src/mcp/oauth-utils.test.js.map +1 -1
  100. package/dist/src/prompts/mcp-prompts.d.ts +8 -0
  101. package/dist/src/prompts/mcp-prompts.js +13 -0
  102. package/dist/src/prompts/mcp-prompts.js.map +1 -0
  103. package/dist/src/prompts/prompt-registry.d.ts +26 -0
  104. package/dist/src/prompts/prompt-registry.js +47 -0
  105. package/dist/src/prompts/prompt-registry.js.map +1 -0
  106. package/dist/src/services/fileDiscoveryService.test.js +101 -60
  107. package/dist/src/services/fileDiscoveryService.test.js.map +1 -1
  108. package/dist/src/services/gitService.test.js +67 -86
  109. package/dist/src/services/gitService.test.js.map +1 -1
  110. package/dist/src/services/loopDetectionService.d.ts +51 -5
  111. package/dist/src/services/loopDetectionService.js +140 -36
  112. package/dist/src/services/loopDetectionService.js.map +1 -1
  113. package/dist/src/services/loopDetectionService.test.js +105 -99
  114. package/dist/src/services/loopDetectionService.test.js.map +1 -1
  115. package/dist/src/services/shellExecutionService.d.ts +70 -0
  116. package/dist/src/services/shellExecutionService.js +152 -0
  117. package/dist/src/services/shellExecutionService.js.map +1 -0
  118. package/dist/src/services/shellExecutionService.test.d.ts +6 -0
  119. package/dist/src/services/shellExecutionService.test.js +258 -0
  120. package/dist/src/services/shellExecutionService.test.js.map +1 -0
  121. package/dist/src/telemetry/clearcut-logger/clearcut-logger.d.ts +3 -1
  122. package/dist/src/telemetry/clearcut-logger/clearcut-logger.js +75 -33
  123. package/dist/src/telemetry/clearcut-logger/clearcut-logger.js.map +1 -1
  124. package/dist/src/telemetry/clearcut-logger/event-metadata-key.d.ts +3 -1
  125. package/dist/src/telemetry/clearcut-logger/event-metadata-key.js +7 -0
  126. package/dist/src/telemetry/clearcut-logger/event-metadata-key.js.map +1 -1
  127. package/dist/src/telemetry/constants.d.ts +2 -0
  128. package/dist/src/telemetry/constants.js +2 -0
  129. package/dist/src/telemetry/constants.js.map +1 -1
  130. package/dist/src/telemetry/file-exporters.d.ts +28 -0
  131. package/dist/src/telemetry/file-exporters.js +62 -0
  132. package/dist/src/telemetry/file-exporters.js.map +1 -0
  133. package/dist/src/telemetry/index.d.ts +2 -2
  134. package/dist/src/telemetry/index.js +2 -2
  135. package/dist/src/telemetry/index.js.map +1 -1
  136. package/dist/src/telemetry/loggers.d.ts +3 -1
  137. package/dist/src/telemetry/loggers.js +33 -1
  138. package/dist/src/telemetry/loggers.js.map +1 -1
  139. package/dist/src/telemetry/sdk.js +17 -6
  140. package/dist/src/telemetry/sdk.js.map +1 -1
  141. package/dist/src/telemetry/telemetry.test.js +2 -0
  142. package/dist/src/telemetry/telemetry.test.js.map +1 -1
  143. package/dist/src/telemetry/types.d.ts +16 -2
  144. package/dist/src/telemetry/types.js +25 -1
  145. package/dist/src/telemetry/types.js.map +1 -1
  146. package/dist/src/test-utils/mockWorkspaceContext.d.ts +13 -0
  147. package/dist/src/test-utils/mockWorkspaceContext.js +24 -0
  148. package/dist/src/test-utils/mockWorkspaceContext.js.map +1 -0
  149. package/dist/src/tools/edit.js +14 -7
  150. package/dist/src/tools/edit.js.map +1 -1
  151. package/dist/src/tools/edit.test.js +37 -1
  152. package/dist/src/tools/edit.test.js.map +1 -1
  153. package/dist/src/tools/glob.js +53 -17
  154. package/dist/src/tools/glob.js.map +1 -1
  155. package/dist/src/tools/glob.test.js +32 -6
  156. package/dist/src/tools/glob.test.js.map +1 -1
  157. package/dist/src/tools/grep.d.ts +1 -1
  158. package/dist/src/tools/grep.js +81 -29
  159. package/dist/src/tools/grep.js.map +1 -1
  160. package/dist/src/tools/grep.test.js +77 -10
  161. package/dist/src/tools/grep.test.js.map +1 -1
  162. package/dist/src/tools/ls.d.ts +5 -2
  163. package/dist/src/tools/ls.js +43 -13
  164. package/dist/src/tools/ls.js.map +1 -1
  165. package/dist/src/tools/ls.test.d.ts +6 -0
  166. package/dist/src/tools/ls.test.js +356 -0
  167. package/dist/src/tools/ls.test.js.map +1 -0
  168. package/dist/src/tools/mcp-client.d.ts +31 -3
  169. package/dist/src/tools/mcp-client.js +467 -38
  170. package/dist/src/tools/mcp-client.js.map +1 -1
  171. package/dist/src/tools/mcp-client.test.js +99 -7
  172. package/dist/src/tools/mcp-client.test.js.map +1 -1
  173. package/dist/src/tools/mcp-tool.js +1 -1
  174. package/dist/src/tools/mcp-tool.js.map +1 -1
  175. package/dist/src/tools/mcp-tool.test.js +34 -0
  176. package/dist/src/tools/mcp-tool.test.js.map +1 -1
  177. package/dist/src/tools/memoryTool.d.ts +17 -2
  178. package/dist/src/tools/memoryTool.js +130 -13
  179. package/dist/src/tools/memoryTool.js.map +1 -1
  180. package/dist/src/tools/memoryTool.test.js +88 -3
  181. package/dist/src/tools/memoryTool.test.js.map +1 -1
  182. package/dist/src/tools/modifiable-tool.test.js +51 -62
  183. package/dist/src/tools/modifiable-tool.test.js.map +1 -1
  184. package/dist/src/tools/read-file.js +8 -6
  185. package/dist/src/tools/read-file.js.map +1 -1
  186. package/dist/src/tools/read-file.test.js +125 -68
  187. package/dist/src/tools/read-file.test.js.map +1 -1
  188. package/dist/src/tools/read-many-files.d.ts +5 -3
  189. package/dist/src/tools/read-many-files.js +83 -33
  190. package/dist/src/tools/read-many-files.js.map +1 -1
  191. package/dist/src/tools/read-many-files.test.js +40 -4
  192. package/dist/src/tools/read-many-files.test.js.map +1 -1
  193. package/dist/src/tools/shell.d.ts +3 -23
  194. package/dist/src/tools/shell.js +173 -300
  195. package/dist/src/tools/shell.js.map +1 -1
  196. package/dist/src/tools/shell.test.js +278 -384
  197. package/dist/src/tools/shell.test.js.map +1 -1
  198. package/dist/src/tools/tool-registry.d.ts +13 -1
  199. package/dist/src/tools/tool-registry.js +46 -2
  200. package/dist/src/tools/tool-registry.js.map +1 -1
  201. package/dist/src/tools/tool-registry.test.js +13 -5
  202. package/dist/src/tools/tool-registry.test.js.map +1 -1
  203. package/dist/src/tools/write-file.js +5 -3
  204. package/dist/src/tools/write-file.js.map +1 -1
  205. package/dist/src/tools/write-file.test.js +36 -2
  206. package/dist/src/tools/write-file.test.js.map +1 -1
  207. package/dist/src/utils/bfsFileSearch.d.ts +2 -0
  208. package/dist/src/utils/bfsFileSearch.js +51 -24
  209. package/dist/src/utils/bfsFileSearch.js.map +1 -1
  210. package/dist/src/utils/bfsFileSearch.test.js +163 -103
  211. package/dist/src/utils/bfsFileSearch.test.js.map +1 -1
  212. package/dist/src/utils/editCorrector.js +4 -4
  213. package/dist/src/utils/editCorrector.js.map +1 -1
  214. package/dist/src/utils/editCorrector.test.js +1 -1
  215. package/dist/src/utils/editor.js +16 -10
  216. package/dist/src/utils/editor.js.map +1 -1
  217. package/dist/src/utils/editor.test.js +128 -28
  218. package/dist/src/utils/editor.test.js.map +1 -1
  219. package/dist/src/utils/errorReporting.d.ts +1 -1
  220. package/dist/src/utils/errorReporting.js +2 -2
  221. package/dist/src/utils/errorReporting.js.map +1 -1
  222. package/dist/src/utils/errorReporting.test.js +44 -38
  223. package/dist/src/utils/errorReporting.test.js.map +1 -1
  224. package/dist/src/utils/fileUtils.d.ts +4 -4
  225. package/dist/src/utils/fileUtils.js +31 -15
  226. package/dist/src/utils/fileUtils.js.map +1 -1
  227. package/dist/src/utils/fileUtils.test.js +37 -37
  228. package/dist/src/utils/fileUtils.test.js.map +1 -1
  229. package/dist/src/utils/flashFallback.integration.test.js +8 -0
  230. package/dist/src/utils/flashFallback.integration.test.js.map +1 -1
  231. package/dist/src/utils/formatters.d.ts +6 -0
  232. package/dist/src/utils/formatters.js +16 -0
  233. package/dist/src/utils/formatters.js.map +1 -0
  234. package/dist/src/utils/getFolderStructure.d.ts +3 -2
  235. package/dist/src/utils/getFolderStructure.js +27 -28
  236. package/dist/src/utils/getFolderStructure.js.map +1 -1
  237. package/dist/src/utils/getFolderStructure.test.js +169 -187
  238. package/dist/src/utils/getFolderStructure.test.js.map +1 -1
  239. package/dist/src/utils/gitIgnoreParser.js +4 -7
  240. package/dist/src/utils/gitIgnoreParser.js.map +1 -1
  241. package/dist/src/utils/gitIgnoreParser.test.js +70 -61
  242. package/dist/src/utils/gitIgnoreParser.test.js.map +1 -1
  243. package/dist/src/utils/memoryDiscovery.d.ts +2 -1
  244. package/dist/src/utils/memoryDiscovery.js +11 -5
  245. package/dist/src/utils/memoryDiscovery.js.map +1 -1
  246. package/dist/src/utils/memoryDiscovery.test.js +160 -371
  247. package/dist/src/utils/memoryDiscovery.test.js.map +1 -1
  248. package/dist/src/utils/nextSpeakerChecker.js +2 -2
  249. package/dist/src/utils/nextSpeakerChecker.js.map +1 -1
  250. package/dist/src/utils/nextSpeakerChecker.test.js +2 -2
  251. package/dist/src/utils/nextSpeakerChecker.test.js.map +1 -1
  252. package/dist/src/utils/partUtils.d.ts +14 -0
  253. package/dist/src/utils/partUtils.js +65 -0
  254. package/dist/src/utils/partUtils.js.map +1 -0
  255. package/dist/src/utils/partUtils.test.d.ts +6 -0
  256. package/dist/src/utils/partUtils.test.js +130 -0
  257. package/dist/src/utils/partUtils.test.js.map +1 -0
  258. package/dist/src/utils/paths.d.ts +11 -0
  259. package/dist/src/utils/paths.js +17 -1
  260. package/dist/src/utils/paths.js.map +1 -1
  261. package/dist/src/utils/quotaErrorDetection.js +0 -2
  262. package/dist/src/utils/quotaErrorDetection.js.map +1 -1
  263. package/dist/src/utils/retry.d.ts +3 -0
  264. package/dist/src/utils/retry.js +1 -1
  265. package/dist/src/utils/retry.js.map +1 -1
  266. package/dist/src/utils/retry.test.js.map +1 -1
  267. package/dist/src/utils/schemaValidator.d.ts +1 -1
  268. package/dist/src/utils/schemaValidator.js +6 -3
  269. package/dist/src/utils/schemaValidator.js.map +1 -1
  270. package/dist/src/utils/shell-utils.d.ts +78 -0
  271. package/dist/src/utils/shell-utils.js +306 -0
  272. package/dist/src/utils/shell-utils.js.map +1 -0
  273. package/dist/src/utils/shell-utils.test.d.ts +6 -0
  274. package/dist/src/utils/shell-utils.test.js +200 -0
  275. package/dist/src/utils/shell-utils.test.js.map +1 -0
  276. package/dist/src/utils/summarizer.js +1 -30
  277. package/dist/src/utils/summarizer.js.map +1 -1
  278. package/dist/src/utils/systemEncoding.d.ts +40 -0
  279. package/dist/src/utils/systemEncoding.js +149 -0
  280. package/dist/src/utils/systemEncoding.js.map +1 -0
  281. package/dist/src/utils/systemEncoding.test.d.ts +6 -0
  282. package/dist/src/utils/systemEncoding.test.js +368 -0
  283. package/dist/src/utils/systemEncoding.test.js.map +1 -0
  284. package/dist/src/utils/textUtils.d.ts +13 -0
  285. package/dist/src/utils/textUtils.js +28 -0
  286. package/dist/src/utils/textUtils.js.map +1 -0
  287. package/dist/src/utils/workspaceContext.d.ts +47 -0
  288. package/dist/src/utils/workspaceContext.js +106 -0
  289. package/dist/src/utils/workspaceContext.js.map +1 -0
  290. package/dist/src/utils/workspaceContext.test.d.ts +6 -0
  291. package/dist/src/utils/workspaceContext.test.js +209 -0
  292. package/dist/src/utils/workspaceContext.test.js.map +1 -0
  293. package/dist/tsconfig.tsbuildinfo +1 -1
  294. package/package.json +2 -1
  295. package/dist/google-gemini-cli-core-0.1.12.tgz +0 -0
  296. package/dist/src/core/geminiRequest.test.js +0 -72
  297. package/dist/src/core/geminiRequest.test.js.map +0 -1
  298. package/dist/src/services/ideContext.d.ts +0 -126
  299. package/dist/src/services/ideContext.js +0 -98
  300. package/dist/src/services/ideContext.js.map +0 -1
  301. package/dist/src/services/ideContext.test.js +0 -111
  302. package/dist/src/services/ideContext.test.js.map +0 -1
  303. /package/dist/src/{core/geminiRequest.test.d.ts → ide/ide-installer.test.d.ts} +0 -0
  304. /package/dist/src/{services → ide}/ideContext.test.d.ts +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"systemEncoding.test.js","sourceRoot":"","sources":["../../../src/utils/systemEncoding.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ /**
7
+ * Checks if a Buffer is likely binary by testing for the presence of a NULL byte.
8
+ * The presence of a NULL byte is a strong indicator that the data is not plain text.
9
+ * @param data The Buffer to check.
10
+ * @param sampleSize The number of bytes from the start of the buffer to test.
11
+ * @returns True if a NULL byte is found, false otherwise.
12
+ */
13
+ export declare function isBinary(data: Buffer | null | undefined, sampleSize?: number): boolean;
@@ -0,0 +1,28 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ /**
7
+ * Checks if a Buffer is likely binary by testing for the presence of a NULL byte.
8
+ * The presence of a NULL byte is a strong indicator that the data is not plain text.
9
+ * @param data The Buffer to check.
10
+ * @param sampleSize The number of bytes from the start of the buffer to test.
11
+ * @returns True if a NULL byte is found, false otherwise.
12
+ */
13
+ export function isBinary(data, sampleSize = 512) {
14
+ if (!data) {
15
+ return false;
16
+ }
17
+ const sample = data.length > sampleSize ? data.subarray(0, sampleSize) : data;
18
+ for (const byte of sample) {
19
+ // The presence of a NULL byte (0x00) is one of the most reliable
20
+ // indicators of a binary file. Text files should not contain them.
21
+ if (byte === 0) {
22
+ return true;
23
+ }
24
+ }
25
+ // If no NULL bytes were found in the sample, we assume it's text.
26
+ return false;
27
+ }
28
+ //# sourceMappingURL=textUtils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"textUtils.js","sourceRoot":"","sources":["../../../src/utils/textUtils.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH;;;;;;GAMG;AACH,MAAM,UAAU,QAAQ,CACtB,IAA+B,EAC/B,UAAU,GAAG,GAAG;IAEhB,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,GAAG,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAE9E,KAAK,MAAM,IAAI,IAAI,MAAM,EAAE,CAAC;QAC1B,iEAAiE;QACjE,mEAAmE;QACnE,IAAI,IAAI,KAAK,CAAC,EAAE,CAAC;YACf,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAED,kEAAkE;IAClE,OAAO,KAAK,CAAC;AACf,CAAC"}
@@ -0,0 +1,47 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ /**
7
+ * WorkspaceContext manages multiple workspace directories and validates paths
8
+ * against them. This allows the CLI to operate on files from multiple directories
9
+ * in a single session.
10
+ */
11
+ export declare class WorkspaceContext {
12
+ private directories;
13
+ /**
14
+ * Creates a new WorkspaceContext with the given initial directory and optional additional directories.
15
+ * @param initialDirectory The initial working directory (usually cwd)
16
+ * @param additionalDirectories Optional array of additional directories to include
17
+ */
18
+ constructor(initialDirectory: string, additionalDirectories?: string[]);
19
+ /**
20
+ * Adds a directory to the workspace.
21
+ * @param directory The directory path to add (can be relative or absolute)
22
+ * @param basePath Optional base path for resolving relative paths (defaults to cwd)
23
+ */
24
+ addDirectory(directory: string, basePath?: string): void;
25
+ /**
26
+ * Internal method to add a directory with validation.
27
+ */
28
+ private addDirectoryInternal;
29
+ /**
30
+ * Gets a copy of all workspace directories.
31
+ * @returns Array of absolute directory paths
32
+ */
33
+ getDirectories(): readonly string[];
34
+ /**
35
+ * Checks if a given path is within any of the workspace directories.
36
+ * @param pathToCheck The path to validate
37
+ * @returns True if the path is within the workspace, false otherwise
38
+ */
39
+ isPathWithinWorkspace(pathToCheck: string): boolean;
40
+ /**
41
+ * Checks if a path is within a given root directory.
42
+ * @param pathToCheck The absolute path to check
43
+ * @param rootDirectory The absolute root directory
44
+ * @returns True if the path is within the root directory, false otherwise
45
+ */
46
+ private isPathWithinRoot;
47
+ }
@@ -0,0 +1,106 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import * as fs from 'fs';
7
+ import * as path from 'path';
8
+ /**
9
+ * WorkspaceContext manages multiple workspace directories and validates paths
10
+ * against them. This allows the CLI to operate on files from multiple directories
11
+ * in a single session.
12
+ */
13
+ export class WorkspaceContext {
14
+ directories;
15
+ /**
16
+ * Creates a new WorkspaceContext with the given initial directory and optional additional directories.
17
+ * @param initialDirectory The initial working directory (usually cwd)
18
+ * @param additionalDirectories Optional array of additional directories to include
19
+ */
20
+ constructor(initialDirectory, additionalDirectories = []) {
21
+ this.directories = new Set();
22
+ this.addDirectoryInternal(initialDirectory);
23
+ for (const dir of additionalDirectories) {
24
+ this.addDirectoryInternal(dir);
25
+ }
26
+ }
27
+ /**
28
+ * Adds a directory to the workspace.
29
+ * @param directory The directory path to add (can be relative or absolute)
30
+ * @param basePath Optional base path for resolving relative paths (defaults to cwd)
31
+ */
32
+ addDirectory(directory, basePath = process.cwd()) {
33
+ this.addDirectoryInternal(directory, basePath);
34
+ }
35
+ /**
36
+ * Internal method to add a directory with validation.
37
+ */
38
+ addDirectoryInternal(directory, basePath = process.cwd()) {
39
+ const absolutePath = path.isAbsolute(directory)
40
+ ? directory
41
+ : path.resolve(basePath, directory);
42
+ if (!fs.existsSync(absolutePath)) {
43
+ throw new Error(`Directory does not exist: ${absolutePath}`);
44
+ }
45
+ const stats = fs.statSync(absolutePath);
46
+ if (!stats.isDirectory()) {
47
+ throw new Error(`Path is not a directory: ${absolutePath}`);
48
+ }
49
+ let realPath;
50
+ try {
51
+ realPath = fs.realpathSync(absolutePath);
52
+ }
53
+ catch (_error) {
54
+ throw new Error(`Failed to resolve path: ${absolutePath}`);
55
+ }
56
+ this.directories.add(realPath);
57
+ }
58
+ /**
59
+ * Gets a copy of all workspace directories.
60
+ * @returns Array of absolute directory paths
61
+ */
62
+ getDirectories() {
63
+ return Array.from(this.directories);
64
+ }
65
+ /**
66
+ * Checks if a given path is within any of the workspace directories.
67
+ * @param pathToCheck The path to validate
68
+ * @returns True if the path is within the workspace, false otherwise
69
+ */
70
+ isPathWithinWorkspace(pathToCheck) {
71
+ try {
72
+ const absolutePath = path.resolve(pathToCheck);
73
+ let resolvedPath = absolutePath;
74
+ if (fs.existsSync(absolutePath)) {
75
+ try {
76
+ resolvedPath = fs.realpathSync(absolutePath);
77
+ }
78
+ catch (_error) {
79
+ return false;
80
+ }
81
+ }
82
+ for (const dir of this.directories) {
83
+ if (this.isPathWithinRoot(resolvedPath, dir)) {
84
+ return true;
85
+ }
86
+ }
87
+ return false;
88
+ }
89
+ catch (_error) {
90
+ return false;
91
+ }
92
+ }
93
+ /**
94
+ * Checks if a path is within a given root directory.
95
+ * @param pathToCheck The absolute path to check
96
+ * @param rootDirectory The absolute root directory
97
+ * @returns True if the path is within the root directory, false otherwise
98
+ */
99
+ isPathWithinRoot(pathToCheck, rootDirectory) {
100
+ const relative = path.relative(rootDirectory, pathToCheck);
101
+ return (!relative.startsWith(`..${path.sep}`) &&
102
+ relative !== '..' &&
103
+ !path.isAbsolute(relative));
104
+ }
105
+ }
106
+ //# sourceMappingURL=workspaceContext.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workspaceContext.js","sourceRoot":"","sources":["../../../src/utils/workspaceContext.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ export {};
@@ -0,0 +1,209 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import { describe, it, expect, beforeEach, vi } from 'vitest';
7
+ import * as fs from 'fs';
8
+ import * as path from 'path';
9
+ 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');
19
+ 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
+ });
47
+ });
48
+ describe('initialization', () => {
49
+ it('should initialize with a single directory (cwd)', () => {
50
+ workspaceContext = new WorkspaceContext(mockCwd);
51
+ const directories = workspaceContext.getDirectories();
52
+ expect(directories).toHaveLength(1);
53
+ expect(directories[0]).toBe(mockCwd);
54
+ });
55
+ 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]);
60
+ const directories = workspaceContext.getDirectories();
61
+ expect(directories).toContain(absolutePath);
62
+ });
63
+ it('should reject non-existent directories', () => {
64
+ expect(() => {
65
+ new WorkspaceContext(mockCwd, [mockNonExistentDir]);
66
+ }).toThrow('Directory does not exist');
67
+ });
68
+ it('should handle empty initialization', () => {
69
+ workspaceContext = new WorkspaceContext(mockCwd, []);
70
+ const directories = workspaceContext.getDirectories();
71
+ expect(directories).toHaveLength(1);
72
+ expect(directories[0]).toBe(mockCwd);
73
+ });
74
+ });
75
+ describe('adding directories', () => {
76
+ beforeEach(() => {
77
+ workspaceContext = new WorkspaceContext(mockCwd);
78
+ });
79
+ it('should add valid directories', () => {
80
+ workspaceContext.addDirectory(mockExistingDir);
81
+ const directories = workspaceContext.getDirectories();
82
+ expect(directories).toHaveLength(2);
83
+ expect(directories).toContain(mockExistingDir);
84
+ });
85
+ 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);
88
+ const directories = workspaceContext.getDirectories();
89
+ expect(directories).toContain(mockExistingDir);
90
+ });
91
+ it('should reject non-existent directories', () => {
92
+ expect(() => {
93
+ workspaceContext.addDirectory(mockNonExistentDir);
94
+ }).toThrow('Directory does not exist');
95
+ });
96
+ it('should prevent duplicate directories', () => {
97
+ workspaceContext.addDirectory(mockExistingDir);
98
+ workspaceContext.addDirectory(mockExistingDir);
99
+ const directories = workspaceContext.getDirectories();
100
+ expect(directories.filter((d) => d === mockExistingDir)).toHaveLength(1);
101
+ });
102
+ it('should handle symbolic links correctly', () => {
103
+ workspaceContext.addDirectory(mockSymlinkDir);
104
+ const directories = workspaceContext.getDirectories();
105
+ expect(directories).toContain(mockRealPath);
106
+ expect(directories).not.toContain(mockSymlinkDir);
107
+ });
108
+ });
109
+ describe('path validation', () => {
110
+ beforeEach(() => {
111
+ workspaceContext = new WorkspaceContext(mockCwd, [mockExistingDir]);
112
+ });
113
+ 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');
116
+ expect(workspaceContext.isPathWithinWorkspace(validPath1)).toBe(true);
117
+ expect(workspaceContext.isPathWithinWorkspace(validPath2)).toBe(true);
118
+ });
119
+ it('should reject paths outside workspace', () => {
120
+ const invalidPath = path.resolve(path.dirname(mockCwd), 'outside-workspace', 'file.txt');
121
+ expect(workspaceContext.isPathWithinWorkspace(invalidPath)).toBe(false);
122
+ });
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);
134
+ });
135
+ it('should handle nested directories correctly', () => {
136
+ const nestedPath = path.join(mockCwd, 'deeply', 'nested', 'path', 'file.txt');
137
+ expect(workspaceContext.isPathWithinWorkspace(nestedPath)).toBe(true);
138
+ });
139
+ it('should handle edge cases (root, parent references)', () => {
140
+ const rootPath = '/';
141
+ const parentPath = path.dirname(mockCwd);
142
+ expect(workspaceContext.isPathWithinWorkspace(rootPath)).toBe(false);
143
+ expect(workspaceContext.isPathWithinWorkspace(parentPath)).toBe(false);
144
+ });
145
+ 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
149
+ expect(workspaceContext.isPathWithinWorkspace(nonExistentPath)).toBe(true);
150
+ });
151
+ });
152
+ describe('getDirectories', () => {
153
+ it('should return a copy of directories array', () => {
154
+ workspaceContext = new WorkspaceContext(mockCwd);
155
+ const dirs1 = workspaceContext.getDirectories();
156
+ 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);
206
+ });
207
+ });
208
+ });
209
+ //# sourceMappingURL=workspaceContext.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workspaceContext.test.js","sourceRoot":"","sources":["../../../src/utils/workspaceContext.test.ts"],"names":[],"mappings":"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"}