@machina.ai/cell-cli-core 1.0.13-rc9 → 1.0.17-rc1

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 (312) hide show
  1. package/dist/package.json +4 -3
  2. package/dist/src/code_assist/converter.d.ts +2 -1
  3. package/dist/src/code_assist/converter.js +2 -1
  4. package/dist/src/code_assist/converter.js.map +1 -1
  5. package/dist/src/code_assist/converter.test.js +13 -10
  6. package/dist/src/code_assist/converter.test.js.map +1 -1
  7. package/dist/src/code_assist/oauth2.js +8 -0
  8. package/dist/src/code_assist/oauth2.js.map +1 -1
  9. package/dist/src/code_assist/oauth2.test.js +97 -7
  10. package/dist/src/code_assist/oauth2.test.js.map +1 -1
  11. package/dist/src/code_assist/server.d.ts +2 -2
  12. package/dist/src/code_assist/server.js +4 -4
  13. package/dist/src/code_assist/server.js.map +1 -1
  14. package/dist/src/code_assist/server.test.js +9 -9
  15. package/dist/src/code_assist/server.test.js.map +1 -1
  16. package/dist/src/code_assist/setup.js +1 -1
  17. package/dist/src/code_assist/setup.js.map +1 -1
  18. package/dist/src/code_assist/setup.test.js +2 -2
  19. package/dist/src/code_assist/setup.test.js.map +1 -1
  20. package/dist/src/config/config.d.ts +37 -9
  21. package/dist/src/config/config.js +84 -29
  22. package/dist/src/config/config.js.map +1 -1
  23. package/dist/src/config/config.test.js +95 -24
  24. package/dist/src/config/config.test.js.map +1 -1
  25. package/dist/src/config/flashFallback.test.js +23 -47
  26. package/dist/src/config/flashFallback.test.js.map +1 -1
  27. package/dist/src/config/models.d.ts +1 -0
  28. package/dist/src/config/models.js +1 -0
  29. package/dist/src/config/models.js.map +1 -1
  30. package/dist/src/core/client.d.ts +4 -1
  31. package/dist/src/core/client.js +82 -22
  32. package/dist/src/core/client.js.map +1 -1
  33. package/dist/src/core/client.test.js +188 -38
  34. package/dist/src/core/client.test.js.map +1 -1
  35. package/dist/src/core/contentGenerator.d.ts +2 -2
  36. package/dist/src/core/contentGenerator.js.map +1 -1
  37. package/dist/src/core/coreToolScheduler.d.ts +1 -3
  38. package/dist/src/core/coreToolScheduler.js +25 -16
  39. package/dist/src/core/coreToolScheduler.js.map +1 -1
  40. package/dist/src/core/coreToolScheduler.test.js +76 -1
  41. package/dist/src/core/coreToolScheduler.test.js.map +1 -1
  42. package/dist/src/core/geminiChat.d.ts +2 -1
  43. package/dist/src/core/geminiChat.js +9 -11
  44. package/dist/src/core/geminiChat.js.map +1 -1
  45. package/dist/src/core/geminiChat.test.js +2 -2
  46. package/dist/src/core/geminiChat.test.js.map +1 -1
  47. package/dist/src/core/geminiRequest.js +2 -37
  48. package/dist/src/core/geminiRequest.js.map +1 -1
  49. package/dist/src/core/logger.d.ts +1 -0
  50. package/dist/src/core/logger.js +24 -4
  51. package/dist/src/core/logger.js.map +1 -1
  52. package/dist/src/core/logger.test.js +60 -9
  53. package/dist/src/core/logger.test.js.map +1 -1
  54. package/dist/src/core/nonInteractiveToolExecutor.js +11 -3
  55. package/dist/src/core/nonInteractiveToolExecutor.js.map +1 -1
  56. package/dist/src/core/prompts.js +41 -17
  57. package/dist/src/core/prompts.js.map +1 -1
  58. package/dist/src/core/prompts.test.js +118 -1
  59. package/dist/src/core/prompts.test.js.map +1 -1
  60. package/dist/src/core/tokenLimits.js +1 -0
  61. package/dist/src/core/tokenLimits.js.map +1 -1
  62. package/dist/src/core/turn.d.ts +3 -0
  63. package/dist/src/core/turn.js +3 -0
  64. package/dist/src/core/turn.js.map +1 -1
  65. package/dist/src/ide/detect-ide.d.ts +10 -0
  66. package/dist/src/ide/detect-ide.js +27 -0
  67. package/dist/src/ide/detect-ide.js.map +1 -0
  68. package/dist/src/ide/ide-client.d.ts +40 -0
  69. package/dist/src/ide/ide-client.js +152 -0
  70. package/dist/src/ide/ide-client.js.map +1 -0
  71. package/dist/src/ide/ide-installer.d.ts +14 -0
  72. package/dist/src/ide/ide-installer.js +109 -0
  73. package/dist/src/ide/ide-installer.js.map +1 -0
  74. package/dist/src/ide/ide-installer.test.js +55 -0
  75. package/dist/src/ide/ide-installer.test.js.map +1 -0
  76. package/dist/src/ide/ideContext.d.ts +279 -0
  77. package/dist/src/ide/ideContext.js +102 -0
  78. package/dist/src/ide/ideContext.js.map +1 -0
  79. package/dist/src/ide/ideContext.test.js +265 -0
  80. package/dist/src/ide/ideContext.test.js.map +1 -0
  81. package/dist/src/index.d.ts +11 -1
  82. package/dist/src/index.js +14 -1
  83. package/dist/src/index.js.map +1 -1
  84. package/dist/src/mcp/google-auth-provider.d.ts +23 -0
  85. package/dist/src/mcp/google-auth-provider.js +63 -0
  86. package/dist/src/mcp/google-auth-provider.js.map +1 -0
  87. package/dist/src/mcp/google-auth-provider.test.d.ts +6 -0
  88. package/dist/src/mcp/google-auth-provider.test.js +54 -0
  89. package/dist/src/mcp/google-auth-provider.test.js.map +1 -0
  90. package/dist/src/mcp/oauth-provider.d.ts +5 -1
  91. package/dist/src/mcp/oauth-provider.js +44 -15
  92. package/dist/src/mcp/oauth-provider.js.map +1 -1
  93. package/dist/src/mcp/oauth-provider.test.js +94 -14
  94. package/dist/src/mcp/oauth-provider.test.js.map +1 -1
  95. package/dist/src/mcp/oauth-token-storage.d.ts +3 -1
  96. package/dist/src/mcp/oauth-token-storage.js +3 -1
  97. package/dist/src/mcp/oauth-token-storage.js.map +1 -1
  98. package/dist/src/mcp/oauth-utils.js +2 -2
  99. package/dist/src/mcp/oauth-utils.js.map +1 -1
  100. package/dist/src/mcp/oauth-utils.test.js +1 -1
  101. package/dist/src/mcp/oauth-utils.test.js.map +1 -1
  102. package/dist/src/prompts/mcp-prompts.d.ts +8 -0
  103. package/dist/src/prompts/mcp-prompts.js +13 -0
  104. package/dist/src/prompts/mcp-prompts.js.map +1 -0
  105. package/dist/src/prompts/prompt-registry.d.ts +26 -0
  106. package/dist/src/prompts/prompt-registry.js +47 -0
  107. package/dist/src/prompts/prompt-registry.js.map +1 -0
  108. package/dist/src/services/fileDiscoveryService.test.js +101 -60
  109. package/dist/src/services/fileDiscoveryService.test.js.map +1 -1
  110. package/dist/src/services/gitService.test.js +67 -86
  111. package/dist/src/services/gitService.test.js.map +1 -1
  112. package/dist/src/services/loopDetectionService.d.ts +51 -5
  113. package/dist/src/services/loopDetectionService.js +140 -36
  114. package/dist/src/services/loopDetectionService.js.map +1 -1
  115. package/dist/src/services/loopDetectionService.test.js +105 -99
  116. package/dist/src/services/loopDetectionService.test.js.map +1 -1
  117. package/dist/src/services/shellExecutionService.d.ts +70 -0
  118. package/dist/src/services/shellExecutionService.js +155 -0
  119. package/dist/src/services/shellExecutionService.js.map +1 -0
  120. package/dist/src/services/shellExecutionService.test.d.ts +6 -0
  121. package/dist/src/services/shellExecutionService.test.js +264 -0
  122. package/dist/src/services/shellExecutionService.test.js.map +1 -0
  123. package/dist/src/telemetry/clearcut-logger/clearcut-logger.d.ts +4 -1
  124. package/dist/src/telemetry/clearcut-logger/clearcut-logger.js +97 -34
  125. package/dist/src/telemetry/clearcut-logger/clearcut-logger.js.map +1 -1
  126. package/dist/src/telemetry/clearcut-logger/event-metadata-key.d.ts +6 -1
  127. package/dist/src/telemetry/clearcut-logger/event-metadata-key.js +19 -0
  128. package/dist/src/telemetry/clearcut-logger/event-metadata-key.js.map +1 -1
  129. package/dist/src/telemetry/constants.d.ts +2 -0
  130. package/dist/src/telemetry/constants.js +2 -0
  131. package/dist/src/telemetry/constants.js.map +1 -1
  132. package/dist/src/telemetry/file-exporters.d.ts +28 -0
  133. package/dist/src/telemetry/file-exporters.js +62 -0
  134. package/dist/src/telemetry/file-exporters.js.map +1 -0
  135. package/dist/src/telemetry/index.d.ts +2 -2
  136. package/dist/src/telemetry/index.js +2 -2
  137. package/dist/src/telemetry/index.js.map +1 -1
  138. package/dist/src/telemetry/loggers.d.ts +3 -1
  139. package/dist/src/telemetry/loggers.js +33 -1
  140. package/dist/src/telemetry/loggers.js.map +1 -1
  141. package/dist/src/telemetry/loggers.test.circular.js +2 -0
  142. package/dist/src/telemetry/loggers.test.circular.js.map +1 -1
  143. package/dist/src/telemetry/loggers.test.js +8 -3
  144. package/dist/src/telemetry/loggers.test.js.map +1 -1
  145. package/dist/src/telemetry/sdk.js +17 -6
  146. package/dist/src/telemetry/sdk.js.map +1 -1
  147. package/dist/src/telemetry/telemetry.test.js +2 -0
  148. package/dist/src/telemetry/telemetry.test.js.map +1 -1
  149. package/dist/src/telemetry/types.d.ts +24 -2
  150. package/dist/src/telemetry/types.js +40 -2
  151. package/dist/src/telemetry/types.js.map +1 -1
  152. package/dist/src/telemetry/uiTelemetry.test.js +3 -0
  153. package/dist/src/telemetry/uiTelemetry.test.js.map +1 -1
  154. package/dist/src/test-utils/mockWorkspaceContext.d.ts +13 -0
  155. package/dist/src/test-utils/mockWorkspaceContext.js +24 -0
  156. package/dist/src/test-utils/mockWorkspaceContext.js.map +1 -0
  157. package/dist/src/tools/edit.js +27 -3
  158. package/dist/src/tools/edit.js.map +1 -1
  159. package/dist/src/tools/edit.test.js +104 -1
  160. package/dist/src/tools/edit.test.js.map +1 -1
  161. package/dist/src/tools/glob.js +53 -17
  162. package/dist/src/tools/glob.js.map +1 -1
  163. package/dist/src/tools/glob.test.js +32 -6
  164. package/dist/src/tools/glob.test.js.map +1 -1
  165. package/dist/src/tools/grep.d.ts +1 -1
  166. package/dist/src/tools/grep.js +81 -29
  167. package/dist/src/tools/grep.js.map +1 -1
  168. package/dist/src/tools/grep.test.js +76 -9
  169. package/dist/src/tools/grep.test.js.map +1 -1
  170. package/dist/src/tools/ls.js +4 -3
  171. package/dist/src/tools/ls.js.map +1 -1
  172. package/dist/src/tools/ls.test.d.ts +6 -0
  173. package/dist/src/tools/ls.test.js +356 -0
  174. package/dist/src/tools/ls.test.js.map +1 -0
  175. package/dist/src/tools/mcp-client.d.ts +31 -3
  176. package/dist/src/tools/mcp-client.js +503 -57
  177. package/dist/src/tools/mcp-client.js.map +1 -1
  178. package/dist/src/tools/mcp-client.test.js +133 -7
  179. package/dist/src/tools/mcp-client.test.js.map +1 -1
  180. package/dist/src/tools/mcp-tool.js +104 -45
  181. package/dist/src/tools/mcp-tool.js.map +1 -1
  182. package/dist/src/tools/mcp-tool.test.js +314 -2
  183. package/dist/src/tools/mcp-tool.test.js.map +1 -1
  184. package/dist/src/tools/memoryTool.d.ts +17 -2
  185. package/dist/src/tools/memoryTool.js +130 -13
  186. package/dist/src/tools/memoryTool.js.map +1 -1
  187. package/dist/src/tools/memoryTool.test.js +88 -3
  188. package/dist/src/tools/memoryTool.test.js.map +1 -1
  189. package/dist/src/tools/modifiable-tool.test.js +51 -62
  190. package/dist/src/tools/modifiable-tool.test.js.map +1 -1
  191. package/dist/src/tools/read-file.js +8 -6
  192. package/dist/src/tools/read-file.js.map +1 -1
  193. package/dist/src/tools/read-file.test.js +125 -68
  194. package/dist/src/tools/read-file.test.js.map +1 -1
  195. package/dist/src/tools/read-many-files.d.ts +0 -1
  196. package/dist/src/tools/read-many-files.js +29 -20
  197. package/dist/src/tools/read-many-files.js.map +1 -1
  198. package/dist/src/tools/read-many-files.test.js +35 -2
  199. package/dist/src/tools/read-many-files.test.js.map +1 -1
  200. package/dist/src/tools/shell.d.ts +3 -23
  201. package/dist/src/tools/shell.js +173 -300
  202. package/dist/src/tools/shell.js.map +1 -1
  203. package/dist/src/tools/shell.test.js +278 -384
  204. package/dist/src/tools/shell.test.js.map +1 -1
  205. package/dist/src/tools/tool-error.d.ts +22 -0
  206. package/dist/src/tools/tool-error.js +27 -0
  207. package/dist/src/tools/tool-error.js.map +1 -0
  208. package/dist/src/tools/tool-registry.d.ts +13 -1
  209. package/dist/src/tools/tool-registry.js +46 -2
  210. package/dist/src/tools/tool-registry.js.map +1 -1
  211. package/dist/src/tools/tool-registry.test.js +13 -5
  212. package/dist/src/tools/tool-registry.test.js.map +1 -1
  213. package/dist/src/tools/tools.d.ts +8 -0
  214. package/dist/src/tools/tools.js.map +1 -1
  215. package/dist/src/tools/write-file.js +7 -5
  216. package/dist/src/tools/write-file.js.map +1 -1
  217. package/dist/src/tools/write-file.test.js +56 -2
  218. package/dist/src/tools/write-file.test.js.map +1 -1
  219. package/dist/src/utils/bfsFileSearch.js +51 -27
  220. package/dist/src/utils/bfsFileSearch.js.map +1 -1
  221. package/dist/src/utils/bfsFileSearch.test.js +163 -134
  222. package/dist/src/utils/bfsFileSearch.test.js.map +1 -1
  223. package/dist/src/utils/editCorrector.js +2 -2
  224. package/dist/src/utils/editCorrector.js.map +1 -1
  225. package/dist/src/utils/editor.d.ts +1 -1
  226. package/dist/src/utils/editor.js +9 -0
  227. package/dist/src/utils/editor.js.map +1 -1
  228. package/dist/src/utils/editor.test.js +21 -1
  229. package/dist/src/utils/editor.test.js.map +1 -1
  230. package/dist/src/utils/errorReporting.d.ts +1 -1
  231. package/dist/src/utils/errorReporting.js +2 -2
  232. package/dist/src/utils/errorReporting.js.map +1 -1
  233. package/dist/src/utils/errorReporting.test.js +44 -38
  234. package/dist/src/utils/errorReporting.test.js.map +1 -1
  235. package/dist/src/utils/fileUtils.js +13 -2
  236. package/dist/src/utils/fileUtils.js.map +1 -1
  237. package/dist/src/utils/fileUtils.test.js +42 -1
  238. package/dist/src/utils/fileUtils.test.js.map +1 -1
  239. package/dist/src/utils/flashFallback.integration.test.js +8 -0
  240. package/dist/src/utils/flashFallback.integration.test.js.map +1 -1
  241. package/dist/src/utils/formatters.d.ts +6 -0
  242. package/dist/src/utils/formatters.js +16 -0
  243. package/dist/src/utils/formatters.js.map +1 -0
  244. package/dist/src/utils/getFolderStructure.test.js +11 -13
  245. package/dist/src/utils/getFolderStructure.test.js.map +1 -1
  246. package/dist/src/utils/gitIgnoreParser.js +5 -11
  247. package/dist/src/utils/gitIgnoreParser.js.map +1 -1
  248. package/dist/src/utils/gitIgnoreParser.test.js +58 -61
  249. package/dist/src/utils/gitIgnoreParser.test.js.map +1 -1
  250. package/dist/src/utils/memoryDiscovery.d.ts +1 -1
  251. package/dist/src/utils/memoryDiscovery.js +69 -79
  252. package/dist/src/utils/memoryDiscovery.js.map +1 -1
  253. package/dist/src/utils/memoryDiscovery.test.js +119 -370
  254. package/dist/src/utils/memoryDiscovery.test.js.map +1 -1
  255. package/dist/src/utils/memoryImportProcessor.d.ts +19 -12
  256. package/dist/src/utils/memoryImportProcessor.js +241 -82
  257. package/dist/src/utils/memoryImportProcessor.js.map +1 -1
  258. package/dist/src/utils/memoryImportProcessor.test.js +595 -50
  259. package/dist/src/utils/memoryImportProcessor.test.js.map +1 -1
  260. package/dist/src/utils/nextSpeakerChecker.js +3 -23
  261. package/dist/src/utils/nextSpeakerChecker.js.map +1 -1
  262. package/dist/src/utils/nextSpeakerChecker.test.js +2 -2
  263. package/dist/src/utils/nextSpeakerChecker.test.js.map +1 -1
  264. package/dist/src/utils/partUtils.d.ts +14 -0
  265. package/dist/src/utils/partUtils.js +65 -0
  266. package/dist/src/utils/partUtils.js.map +1 -0
  267. package/dist/src/utils/partUtils.test.d.ts +6 -0
  268. package/dist/src/utils/partUtils.test.js +130 -0
  269. package/dist/src/utils/partUtils.test.js.map +1 -0
  270. package/dist/src/utils/paths.d.ts +11 -2
  271. package/dist/src/utils/paths.js +24 -7
  272. package/dist/src/utils/paths.js.map +1 -1
  273. package/dist/src/utils/paths.test.d.ts +6 -0
  274. package/dist/src/utils/paths.test.js +153 -0
  275. package/dist/src/utils/paths.test.js.map +1 -0
  276. package/dist/src/utils/retry.d.ts +3 -0
  277. package/dist/src/utils/retry.js.map +1 -1
  278. package/dist/src/utils/retry.test.js.map +1 -1
  279. package/dist/src/utils/secure-browser-launcher.d.ts +23 -0
  280. package/dist/src/utils/secure-browser-launcher.js +164 -0
  281. package/dist/src/utils/secure-browser-launcher.js.map +1 -0
  282. package/dist/src/utils/secure-browser-launcher.test.d.ts +6 -0
  283. package/dist/src/utils/secure-browser-launcher.test.js +149 -0
  284. package/dist/src/utils/secure-browser-launcher.test.js.map +1 -0
  285. package/dist/src/utils/shell-utils.d.ts +78 -0
  286. package/dist/src/utils/shell-utils.js +306 -0
  287. package/dist/src/utils/shell-utils.js.map +1 -0
  288. package/dist/src/utils/shell-utils.test.d.ts +6 -0
  289. package/dist/src/utils/shell-utils.test.js +200 -0
  290. package/dist/src/utils/shell-utils.test.js.map +1 -0
  291. package/dist/src/utils/summarizer.js +3 -32
  292. package/dist/src/utils/summarizer.js.map +1 -1
  293. package/dist/src/utils/textUtils.d.ts +13 -0
  294. package/dist/src/utils/textUtils.js +28 -0
  295. package/dist/src/utils/textUtils.js.map +1 -0
  296. package/dist/src/utils/workspaceContext.d.ts +51 -0
  297. package/dist/src/utils/workspaceContext.js +139 -0
  298. package/dist/src/utils/workspaceContext.js.map +1 -0
  299. package/dist/src/utils/workspaceContext.test.d.ts +6 -0
  300. package/dist/src/utils/workspaceContext.test.js +209 -0
  301. package/dist/src/utils/workspaceContext.test.js.map +1 -0
  302. package/dist/tsconfig.tsbuildinfo +1 -1
  303. package/package.json +4 -3
  304. package/dist/src/core/geminiRequest.test.js +0 -72
  305. package/dist/src/core/geminiRequest.test.js.map +0 -1
  306. package/dist/src/services/ideContext.d.ts +0 -178
  307. package/dist/src/services/ideContext.js +0 -105
  308. package/dist/src/services/ideContext.js.map +0 -1
  309. package/dist/src/services/ideContext.test.js +0 -111
  310. package/dist/src/services/ideContext.test.js.map +0 -1
  311. /package/dist/src/{core/geminiRequest.test.d.ts → ide/ide-installer.test.d.ts} +0 -0
  312. /package/dist/src/{services → ide}/ideContext.test.d.ts +0 -0
@@ -3,430 +3,179 @@
3
3
  * Copyright 2025 Google LLC
4
4
  * SPDX-License-Identifier: Apache-2.0
5
5
  */
6
- import { vi, describe, it, expect, beforeEach } from 'vitest';
6
+ import { vi, describe, it, expect, beforeEach, afterEach } from 'vitest';
7
7
  import * as fsPromises from 'fs/promises';
8
8
  import * as os from 'os';
9
9
  import * as path from 'path';
10
10
  import { loadServerHierarchicalMemory } from './memoryDiscovery.js';
11
- import { GEMINI_CONFIG_DIR, setGeminiMdFilename, getCurrentGeminiMdFilename, DEFAULT_CONTEXT_FILENAME, } from '../tools/memoryTool.js';
11
+ import { GEMINI_CONFIG_DIR, setGeminiMdFilename, DEFAULT_CONTEXT_FILENAME, } from '../tools/memoryTool.js';
12
12
  import { FileDiscoveryService } from '../services/fileDiscoveryService.js';
13
- const ORIGINAL_GEMINI_MD_FILENAME_CONST_FOR_TEST = DEFAULT_CONTEXT_FILENAME;
14
- // Mock the entire fs/promises module
15
- vi.mock('fs/promises');
16
- // Mock the parts of fsSync we might use (like constants or existsSync if needed)
17
- vi.mock('fs', async (importOriginal) => {
18
- const actual = await importOriginal();
13
+ vi.mock('os', async (importOriginal) => {
14
+ const actualOs = await importOriginal();
19
15
  return {
20
- ...actual, // Spread actual to get all exports, including Stats and Dirent if they are classes/constructors
21
- constants: { ...actual.constants }, // Preserve constants
16
+ ...actualOs,
17
+ homedir: vi.fn(),
22
18
  };
23
19
  });
24
- vi.mock('os');
25
20
  describe('loadServerHierarchicalMemory', () => {
26
- const mockFs = fsPromises;
27
- const mockOs = os;
28
- const CWD = '/test/project/src';
29
- const PROJECT_ROOT = '/test/project';
30
- const USER_HOME = '/test/userhome';
31
- let GLOBAL_GEMINI_DIR;
32
- let GLOBAL_GEMINI_FILE; // Defined in beforeEach
33
- const fileService = new FileDiscoveryService(PROJECT_ROOT);
34
- beforeEach(() => {
21
+ let testRootDir;
22
+ let cwd;
23
+ let projectRoot;
24
+ let homedir;
25
+ async function createEmptyDir(fullPath) {
26
+ await fsPromises.mkdir(fullPath, { recursive: true });
27
+ return fullPath;
28
+ }
29
+ async function createTestFile(fullPath, fileContents) {
30
+ await fsPromises.mkdir(path.dirname(fullPath), { recursive: true });
31
+ await fsPromises.writeFile(fullPath, fileContents);
32
+ return path.resolve(testRootDir, fullPath);
33
+ }
34
+ beforeEach(async () => {
35
+ testRootDir = await fsPromises.mkdtemp(path.join(os.tmpdir(), 'folder-structure-test-'));
35
36
  vi.resetAllMocks();
36
37
  // Set environment variables to indicate test environment
37
38
  process.env.NODE_ENV = 'test';
38
39
  process.env.VITEST = 'true';
39
- setGeminiMdFilename(DEFAULT_CONTEXT_FILENAME); // Use defined const
40
- mockOs.homedir.mockReturnValue(USER_HOME);
41
- // Define these here to use potentially reset/updated values from imports
42
- GLOBAL_GEMINI_DIR = path.join(USER_HOME, GEMINI_CONFIG_DIR);
43
- GLOBAL_GEMINI_FILE = path.join(GLOBAL_GEMINI_DIR, getCurrentGeminiMdFilename());
44
- mockFs.stat.mockRejectedValue(new Error('File not found'));
45
- mockFs.readdir.mockResolvedValue([]);
46
- mockFs.readFile.mockRejectedValue(new Error('File not found'));
47
- mockFs.access.mockRejectedValue(new Error('File not found'));
40
+ projectRoot = await createEmptyDir(path.join(testRootDir, 'project'));
41
+ cwd = await createEmptyDir(path.join(projectRoot, 'src'));
42
+ homedir = await createEmptyDir(path.join(testRootDir, 'userhome'));
43
+ vi.mocked(os.homedir).mockReturnValue(homedir);
44
+ });
45
+ afterEach(async () => {
46
+ // Some tests set this to a different value.
47
+ setGeminiMdFilename(DEFAULT_CONTEXT_FILENAME);
48
+ // Clean up the temporary directory to prevent resource leaks.
49
+ await fsPromises.rm(testRootDir, { recursive: true, force: true });
48
50
  });
49
51
  it('should return empty memory and count if no context files are found', async () => {
50
- const { memoryContent, fileCount } = await loadServerHierarchicalMemory(CWD, false, fileService);
51
- expect(memoryContent).toBe('');
52
- expect(fileCount).toBe(0);
52
+ const result = await loadServerHierarchicalMemory(cwd, [], false, new FileDiscoveryService(projectRoot));
53
+ expect(result).toEqual({
54
+ memoryContent: '',
55
+ fileCount: 0,
56
+ });
53
57
  });
54
58
  it('should load only the global context file if present and others are not (default filename)', async () => {
55
- const globalDefaultFile = path.join(GLOBAL_GEMINI_DIR, DEFAULT_CONTEXT_FILENAME);
56
- mockFs.access.mockImplementation(async (p) => {
57
- if (p === globalDefaultFile) {
58
- return undefined;
59
- }
60
- throw new Error('File not found');
59
+ const defaultContextFile = await createTestFile(path.join(homedir, GEMINI_CONFIG_DIR, DEFAULT_CONTEXT_FILENAME), 'default context content');
60
+ const result = await loadServerHierarchicalMemory(cwd, [], false, new FileDiscoveryService(projectRoot));
61
+ expect(result).toEqual({
62
+ memoryContent: `--- Context from: ${path.relative(cwd, defaultContextFile)} ---\ndefault context content\n--- End of Context from: ${path.relative(cwd, defaultContextFile)} ---`,
63
+ fileCount: 1,
61
64
  });
62
- mockFs.readFile.mockImplementation(async (p) => {
63
- if (p === globalDefaultFile) {
64
- return 'Global memory content';
65
- }
66
- throw new Error('File not found');
67
- });
68
- const { memoryContent, fileCount } = await loadServerHierarchicalMemory(CWD, false, fileService);
69
- expect(memoryContent).toBe(`--- Context from: ${path.relative(CWD, globalDefaultFile)} ---\nGlobal memory content\n--- End of Context from: ${path.relative(CWD, globalDefaultFile)} ---`);
70
- expect(fileCount).toBe(1);
71
- expect(mockFs.readFile).toHaveBeenCalledWith(globalDefaultFile, 'utf-8');
72
65
  });
73
66
  it('should load only the global custom context file if present and filename is changed', async () => {
74
67
  const customFilename = 'CUSTOM_AGENTS.md';
75
68
  setGeminiMdFilename(customFilename);
76
- const globalCustomFile = path.join(GLOBAL_GEMINI_DIR, customFilename);
77
- mockFs.access.mockImplementation(async (p) => {
78
- if (p === globalCustomFile) {
79
- return undefined;
80
- }
81
- throw new Error('File not found');
82
- });
83
- mockFs.readFile.mockImplementation(async (p) => {
84
- if (p === globalCustomFile) {
85
- return 'Global custom memory';
86
- }
87
- throw new Error('File not found');
69
+ const customContextFile = await createTestFile(path.join(homedir, GEMINI_CONFIG_DIR, customFilename), 'custom context content');
70
+ const result = await loadServerHierarchicalMemory(cwd, [], false, new FileDiscoveryService(projectRoot));
71
+ expect(result).toEqual({
72
+ memoryContent: `--- Context from: ${path.relative(cwd, customContextFile)} ---\ncustom context content\n--- End of Context from: ${path.relative(cwd, customContextFile)} ---`,
73
+ fileCount: 1,
88
74
  });
89
- const { memoryContent, fileCount } = await loadServerHierarchicalMemory(CWD, false, fileService);
90
- expect(memoryContent).toBe(`--- Context from: ${path.relative(CWD, globalCustomFile)} ---\nGlobal custom memory\n--- End of Context from: ${path.relative(CWD, globalCustomFile)} ---`);
91
- expect(fileCount).toBe(1);
92
- expect(mockFs.readFile).toHaveBeenCalledWith(globalCustomFile, 'utf-8');
93
75
  });
94
76
  it('should load context files by upward traversal with custom filename', async () => {
95
77
  const customFilename = 'PROJECT_CONTEXT.md';
96
78
  setGeminiMdFilename(customFilename);
97
- const projectRootCustomFile = path.join(PROJECT_ROOT, customFilename);
98
- const srcCustomFile = path.join(CWD, customFilename);
99
- mockFs.stat.mockImplementation(async (p) => {
100
- if (p === path.join(PROJECT_ROOT, '.git')) {
101
- return { isDirectory: () => true };
102
- }
103
- throw new Error('File not found');
79
+ const projectContextFile = await createTestFile(path.join(projectRoot, customFilename), 'project context content');
80
+ const cwdContextFile = await createTestFile(path.join(cwd, customFilename), 'cwd context content');
81
+ const result = await loadServerHierarchicalMemory(cwd, [], false, new FileDiscoveryService(projectRoot));
82
+ expect(result).toEqual({
83
+ memoryContent: `--- Context from: ${path.relative(cwd, projectContextFile)} ---\nproject context content\n--- End of Context from: ${path.relative(cwd, projectContextFile)} ---\n\n--- Context from: ${path.relative(cwd, cwdContextFile)} ---\ncwd context content\n--- End of Context from: ${path.relative(cwd, cwdContextFile)} ---`,
84
+ fileCount: 2,
104
85
  });
105
- mockFs.access.mockImplementation(async (p) => {
106
- if (p === projectRootCustomFile || p === srcCustomFile) {
107
- return undefined;
108
- }
109
- throw new Error('File not found');
110
- });
111
- mockFs.readFile.mockImplementation(async (p) => {
112
- if (p === projectRootCustomFile) {
113
- return 'Project root custom memory';
114
- }
115
- if (p === srcCustomFile) {
116
- return 'Src directory custom memory';
117
- }
118
- throw new Error('File not found');
119
- });
120
- const { memoryContent, fileCount } = await loadServerHierarchicalMemory(CWD, false, fileService);
121
- const expectedContent = `--- Context from: ${path.relative(CWD, projectRootCustomFile)} ---\nProject root custom memory\n--- End of Context from: ${path.relative(CWD, projectRootCustomFile)} ---\n\n` +
122
- `--- Context from: ${customFilename} ---\nSrc directory custom memory\n--- End of Context from: ${customFilename} ---`;
123
- expect(memoryContent).toBe(expectedContent);
124
- expect(fileCount).toBe(2);
125
- expect(mockFs.readFile).toHaveBeenCalledWith(projectRootCustomFile, 'utf-8');
126
- expect(mockFs.readFile).toHaveBeenCalledWith(srcCustomFile, 'utf-8');
127
86
  });
128
87
  it('should load context files by downward traversal with custom filename', async () => {
129
88
  const customFilename = 'LOCAL_CONTEXT.md';
130
89
  setGeminiMdFilename(customFilename);
131
- const subDir = path.join(CWD, 'subdir');
132
- const subDirCustomFile = path.join(subDir, customFilename);
133
- const cwdCustomFile = path.join(CWD, customFilename);
134
- mockFs.access.mockImplementation(async (p) => {
135
- if (p === cwdCustomFile || p === subDirCustomFile)
136
- return undefined;
137
- throw new Error('File not found');
90
+ await createTestFile(path.join(cwd, 'subdir', customFilename), 'Subdir custom memory');
91
+ await createTestFile(path.join(cwd, customFilename), 'CWD custom memory');
92
+ const result = await loadServerHierarchicalMemory(cwd, [], false, new FileDiscoveryService(projectRoot));
93
+ expect(result).toEqual({
94
+ memoryContent: `--- Context from: ${customFilename} ---\nCWD custom memory\n--- End of Context from: ${customFilename} ---\n\n--- Context from: ${path.join('subdir', customFilename)} ---\nSubdir custom memory\n--- End of Context from: ${path.join('subdir', customFilename)} ---`,
95
+ fileCount: 2,
138
96
  });
139
- mockFs.readFile.mockImplementation(async (p) => {
140
- if (p === cwdCustomFile)
141
- return 'CWD custom memory';
142
- if (p === subDirCustomFile)
143
- return 'Subdir custom memory';
144
- throw new Error('File not found');
145
- });
146
- mockFs.readdir.mockImplementation((async (p) => {
147
- if (p === CWD) {
148
- return [
149
- {
150
- name: customFilename,
151
- isFile: () => true,
152
- isDirectory: () => false,
153
- },
154
- {
155
- name: 'subdir',
156
- isFile: () => false,
157
- isDirectory: () => true,
158
- },
159
- ];
160
- }
161
- if (p === subDir) {
162
- return [
163
- {
164
- name: customFilename,
165
- isFile: () => true,
166
- isDirectory: () => false,
167
- },
168
- ];
169
- }
170
- return [];
171
- }));
172
- const { memoryContent, fileCount } = await loadServerHierarchicalMemory(CWD, false, fileService);
173
- const expectedContent = `--- Context from: ${customFilename} ---\nCWD custom memory\n--- End of Context from: ${customFilename} ---\n\n` +
174
- `--- Context from: ${path.join('subdir', customFilename)} ---\nSubdir custom memory\n--- End of Context from: ${path.join('subdir', customFilename)} ---`;
175
- expect(memoryContent).toBe(expectedContent);
176
- expect(fileCount).toBe(2);
177
97
  });
178
98
  it('should load ORIGINAL_GEMINI_MD_FILENAME files by upward traversal from CWD to project root', async () => {
179
- const projectRootGeminiFile = path.join(PROJECT_ROOT, ORIGINAL_GEMINI_MD_FILENAME_CONST_FOR_TEST);
180
- const srcGeminiFile = path.join(CWD, ORIGINAL_GEMINI_MD_FILENAME_CONST_FOR_TEST);
181
- mockFs.stat.mockImplementation(async (p) => {
182
- if (p === path.join(PROJECT_ROOT, '.git')) {
183
- return { isDirectory: () => true };
184
- }
185
- throw new Error('File not found');
186
- });
187
- mockFs.access.mockImplementation(async (p) => {
188
- if (p === projectRootGeminiFile || p === srcGeminiFile) {
189
- return undefined;
190
- }
191
- throw new Error('File not found');
99
+ const projectRootGeminiFile = await createTestFile(path.join(projectRoot, DEFAULT_CONTEXT_FILENAME), 'Project root memory');
100
+ const srcGeminiFile = await createTestFile(path.join(cwd, DEFAULT_CONTEXT_FILENAME), 'Src directory memory');
101
+ const result = await loadServerHierarchicalMemory(cwd, [], false, new FileDiscoveryService(projectRoot));
102
+ expect(result).toEqual({
103
+ memoryContent: `--- Context from: ${path.relative(cwd, projectRootGeminiFile)} ---\nProject root memory\n--- End of Context from: ${path.relative(cwd, projectRootGeminiFile)} ---\n\n--- Context from: ${path.relative(cwd, srcGeminiFile)} ---\nSrc directory memory\n--- End of Context from: ${path.relative(cwd, srcGeminiFile)} ---`,
104
+ fileCount: 2,
192
105
  });
193
- mockFs.readFile.mockImplementation(async (p) => {
194
- if (p === projectRootGeminiFile) {
195
- return 'Project root memory';
196
- }
197
- if (p === srcGeminiFile) {
198
- return 'Src directory memory';
199
- }
200
- throw new Error('File not found');
201
- });
202
- const { memoryContent, fileCount } = await loadServerHierarchicalMemory(CWD, false, fileService);
203
- const expectedContent = `--- Context from: ${path.relative(CWD, projectRootGeminiFile)} ---\nProject root memory\n--- End of Context from: ${path.relative(CWD, projectRootGeminiFile)} ---\n\n` +
204
- `--- Context from: ${ORIGINAL_GEMINI_MD_FILENAME_CONST_FOR_TEST} ---\nSrc directory memory\n--- End of Context from: ${ORIGINAL_GEMINI_MD_FILENAME_CONST_FOR_TEST} ---`;
205
- expect(memoryContent).toBe(expectedContent);
206
- expect(fileCount).toBe(2);
207
- expect(mockFs.readFile).toHaveBeenCalledWith(projectRootGeminiFile, 'utf-8');
208
- expect(mockFs.readFile).toHaveBeenCalledWith(srcGeminiFile, 'utf-8');
209
106
  });
210
107
  it('should load ORIGINAL_GEMINI_MD_FILENAME files by downward traversal from CWD', async () => {
211
- const subDir = path.join(CWD, 'subdir');
212
- const subDirGeminiFile = path.join(subDir, ORIGINAL_GEMINI_MD_FILENAME_CONST_FOR_TEST);
213
- const cwdGeminiFile = path.join(CWD, ORIGINAL_GEMINI_MD_FILENAME_CONST_FOR_TEST);
214
- mockFs.access.mockImplementation(async (p) => {
215
- if (p === cwdGeminiFile || p === subDirGeminiFile)
216
- return undefined;
217
- throw new Error('File not found');
218
- });
219
- mockFs.readFile.mockImplementation(async (p) => {
220
- if (p === cwdGeminiFile)
221
- return 'CWD memory';
222
- if (p === subDirGeminiFile)
223
- return 'Subdir memory';
224
- throw new Error('File not found');
108
+ await createTestFile(path.join(cwd, 'subdir', DEFAULT_CONTEXT_FILENAME), 'Subdir memory');
109
+ await createTestFile(path.join(cwd, DEFAULT_CONTEXT_FILENAME), 'CWD memory');
110
+ const result = await loadServerHierarchicalMemory(cwd, [], false, new FileDiscoveryService(projectRoot));
111
+ expect(result).toEqual({
112
+ memoryContent: `--- Context from: ${DEFAULT_CONTEXT_FILENAME} ---\nCWD memory\n--- End of Context from: ${DEFAULT_CONTEXT_FILENAME} ---\n\n--- Context from: ${path.join('subdir', DEFAULT_CONTEXT_FILENAME)} ---\nSubdir memory\n--- End of Context from: ${path.join('subdir', DEFAULT_CONTEXT_FILENAME)} ---`,
113
+ fileCount: 2,
225
114
  });
226
- mockFs.readdir.mockImplementation((async (p) => {
227
- if (p === CWD) {
228
- return [
229
- {
230
- name: ORIGINAL_GEMINI_MD_FILENAME_CONST_FOR_TEST,
231
- isFile: () => true,
232
- isDirectory: () => false,
233
- },
234
- {
235
- name: 'subdir',
236
- isFile: () => false,
237
- isDirectory: () => true,
238
- },
239
- ];
240
- }
241
- if (p === subDir) {
242
- return [
243
- {
244
- name: ORIGINAL_GEMINI_MD_FILENAME_CONST_FOR_TEST,
245
- isFile: () => true,
246
- isDirectory: () => false,
247
- },
248
- ];
249
- }
250
- return [];
251
- }));
252
- const { memoryContent, fileCount } = await loadServerHierarchicalMemory(CWD, false, fileService);
253
- const expectedContent = `--- Context from: ${ORIGINAL_GEMINI_MD_FILENAME_CONST_FOR_TEST} ---\nCWD memory\n--- End of Context from: ${ORIGINAL_GEMINI_MD_FILENAME_CONST_FOR_TEST} ---\n\n` +
254
- `--- Context from: ${path.join('subdir', ORIGINAL_GEMINI_MD_FILENAME_CONST_FOR_TEST)} ---\nSubdir memory\n--- End of Context from: ${path.join('subdir', ORIGINAL_GEMINI_MD_FILENAME_CONST_FOR_TEST)} ---`;
255
- expect(memoryContent).toBe(expectedContent);
256
- expect(fileCount).toBe(2);
257
115
  });
258
116
  it('should load and correctly order global, upward, and downward ORIGINAL_GEMINI_MD_FILENAME files', async () => {
259
- setGeminiMdFilename(ORIGINAL_GEMINI_MD_FILENAME_CONST_FOR_TEST); // Explicitly set for this test
260
- const globalFileToUse = path.join(GLOBAL_GEMINI_DIR, ORIGINAL_GEMINI_MD_FILENAME_CONST_FOR_TEST);
261
- const projectParentDir = path.dirname(PROJECT_ROOT);
262
- const projectParentGeminiFile = path.join(projectParentDir, ORIGINAL_GEMINI_MD_FILENAME_CONST_FOR_TEST);
263
- const projectRootGeminiFile = path.join(PROJECT_ROOT, ORIGINAL_GEMINI_MD_FILENAME_CONST_FOR_TEST);
264
- const cwdGeminiFile = path.join(CWD, ORIGINAL_GEMINI_MD_FILENAME_CONST_FOR_TEST);
265
- const subDir = path.join(CWD, 'sub');
266
- const subDirGeminiFile = path.join(subDir, ORIGINAL_GEMINI_MD_FILENAME_CONST_FOR_TEST);
267
- mockFs.stat.mockImplementation(async (p) => {
268
- if (p === path.join(PROJECT_ROOT, '.git')) {
269
- return { isDirectory: () => true };
270
- }
271
- else if (p === path.join(PROJECT_ROOT, '.gemini')) {
272
- return { isDirectory: () => true };
273
- }
274
- throw new Error('File not found');
275
- });
276
- mockFs.access.mockImplementation(async (p) => {
277
- if (p === globalFileToUse || // Use the dynamically set global file path
278
- p === projectParentGeminiFile ||
279
- p === projectRootGeminiFile ||
280
- p === cwdGeminiFile ||
281
- p === subDirGeminiFile) {
282
- return undefined;
283
- }
284
- throw new Error('File not found');
285
- });
286
- mockFs.readFile.mockImplementation(async (p) => {
287
- if (p === globalFileToUse)
288
- return 'Global memory'; // Use the dynamically set global file path
289
- if (p === projectParentGeminiFile)
290
- return 'Project parent memory';
291
- if (p === projectRootGeminiFile)
292
- return 'Project root memory';
293
- if (p === cwdGeminiFile)
294
- return 'CWD memory';
295
- if (p === subDirGeminiFile)
296
- return 'Subdir memory';
297
- throw new Error('File not found');
117
+ const defaultContextFile = await createTestFile(path.join(homedir, GEMINI_CONFIG_DIR, DEFAULT_CONTEXT_FILENAME), 'default context content');
118
+ const rootGeminiFile = await createTestFile(path.join(testRootDir, DEFAULT_CONTEXT_FILENAME), 'Project parent memory');
119
+ const projectRootGeminiFile = await createTestFile(path.join(projectRoot, DEFAULT_CONTEXT_FILENAME), 'Project root memory');
120
+ const cwdGeminiFile = await createTestFile(path.join(cwd, DEFAULT_CONTEXT_FILENAME), 'CWD memory');
121
+ const subDirGeminiFile = await createTestFile(path.join(cwd, 'sub', DEFAULT_CONTEXT_FILENAME), 'Subdir memory');
122
+ const result = await loadServerHierarchicalMemory(cwd, [], false, new FileDiscoveryService(projectRoot));
123
+ expect(result).toEqual({
124
+ memoryContent: `--- Context from: ${path.relative(cwd, defaultContextFile)} ---\ndefault context content\n--- End of Context from: ${path.relative(cwd, defaultContextFile)} ---\n\n--- Context from: ${path.relative(cwd, rootGeminiFile)} ---\nProject parent memory\n--- End of Context from: ${path.relative(cwd, rootGeminiFile)} ---\n\n--- Context from: ${path.relative(cwd, projectRootGeminiFile)} ---\nProject root memory\n--- End of Context from: ${path.relative(cwd, projectRootGeminiFile)} ---\n\n--- Context from: ${path.relative(cwd, cwdGeminiFile)} ---\nCWD memory\n--- End of Context from: ${path.relative(cwd, cwdGeminiFile)} ---\n\n--- Context from: ${path.relative(cwd, subDirGeminiFile)} ---\nSubdir memory\n--- End of Context from: ${path.relative(cwd, subDirGeminiFile)} ---`,
125
+ fileCount: 5,
298
126
  });
299
- mockFs.readdir.mockImplementation((async (p) => {
300
- if (p === CWD) {
301
- return [
302
- {
303
- name: 'sub',
304
- isFile: () => false,
305
- isDirectory: () => true,
306
- },
307
- ];
308
- }
309
- if (p === subDir) {
310
- return [
311
- {
312
- name: ORIGINAL_GEMINI_MD_FILENAME_CONST_FOR_TEST,
313
- isFile: () => true,
314
- isDirectory: () => false,
315
- },
316
- ];
317
- }
318
- return [];
319
- }));
320
- const { memoryContent, fileCount } = await loadServerHierarchicalMemory(CWD, false, fileService);
321
- const relPathGlobal = path.relative(CWD, GLOBAL_GEMINI_FILE);
322
- const relPathProjectParent = path.relative(CWD, projectParentGeminiFile);
323
- const relPathProjectRoot = path.relative(CWD, projectRootGeminiFile);
324
- const relPathCwd = ORIGINAL_GEMINI_MD_FILENAME_CONST_FOR_TEST;
325
- const relPathSubDir = path.join('sub', ORIGINAL_GEMINI_MD_FILENAME_CONST_FOR_TEST);
326
- const expectedContent = [
327
- `--- Context from: ${relPathGlobal} ---\nGlobal memory\n--- End of Context from: ${relPathGlobal} ---`,
328
- `--- Context from: ${relPathProjectParent} ---\nProject parent memory\n--- End of Context from: ${relPathProjectParent} ---`,
329
- `--- Context from: ${relPathProjectRoot} ---\nProject root memory\n--- End of Context from: ${relPathProjectRoot} ---`,
330
- `--- Context from: ${relPathCwd} ---\nCWD memory\n--- End of Context from: ${relPathCwd} ---`,
331
- `--- Context from: ${relPathSubDir} ---\nSubdir memory\n--- End of Context from: ${relPathSubDir} ---`,
332
- ].join('\n\n');
333
- expect(memoryContent).toBe(expectedContent);
334
- expect(fileCount).toBe(5);
335
127
  });
336
128
  it('should ignore specified directories during downward scan', async () => {
337
- const ignoredDir = path.join(CWD, 'node_modules');
338
- const ignoredDirGeminiFile = path.join(ignoredDir, ORIGINAL_GEMINI_MD_FILENAME_CONST_FOR_TEST); // Corrected
339
- const regularSubDir = path.join(CWD, 'my_code');
340
- const regularSubDirGeminiFile = path.join(regularSubDir, ORIGINAL_GEMINI_MD_FILENAME_CONST_FOR_TEST);
341
- mockFs.access.mockImplementation(async (p) => {
342
- if (p === regularSubDirGeminiFile)
343
- return undefined;
344
- if (p === ignoredDirGeminiFile)
345
- throw new Error('Should not access ignored file');
346
- throw new Error('File not found');
129
+ await createEmptyDir(path.join(projectRoot, '.git'));
130
+ await createTestFile(path.join(projectRoot, '.gitignore'), 'node_modules');
131
+ await createTestFile(path.join(cwd, 'node_modules', DEFAULT_CONTEXT_FILENAME), 'Ignored memory');
132
+ const regularSubDirGeminiFile = await createTestFile(path.join(cwd, 'my_code', DEFAULT_CONTEXT_FILENAME), 'My code memory');
133
+ const result = await loadServerHierarchicalMemory(cwd, [], false, new FileDiscoveryService(projectRoot), [], 'tree', {
134
+ respectGitIgnore: true,
135
+ respectGeminiIgnore: true,
136
+ }, 200);
137
+ expect(result).toEqual({
138
+ memoryContent: `--- Context from: ${path.relative(cwd, regularSubDirGeminiFile)} ---\nMy code memory\n--- End of Context from: ${path.relative(cwd, regularSubDirGeminiFile)} ---`,
139
+ fileCount: 1,
347
140
  });
348
- mockFs.readFile.mockImplementation(async (p) => {
349
- if (p === regularSubDirGeminiFile)
350
- return 'My code memory';
351
- throw new Error('File not found');
352
- });
353
- mockFs.readdir.mockImplementation((async (p) => {
354
- if (p === CWD) {
355
- return [
356
- {
357
- name: 'node_modules',
358
- isFile: () => false,
359
- isDirectory: () => true,
360
- },
361
- {
362
- name: 'my_code',
363
- isFile: () => false,
364
- isDirectory: () => true,
365
- },
366
- ];
367
- }
368
- if (p === regularSubDir) {
369
- return [
370
- {
371
- name: ORIGINAL_GEMINI_MD_FILENAME_CONST_FOR_TEST,
372
- isFile: () => true,
373
- isDirectory: () => false,
374
- },
375
- ];
376
- }
377
- if (p === ignoredDir) {
378
- return [];
379
- }
380
- return [];
381
- }));
382
- const { memoryContent, fileCount } = await loadServerHierarchicalMemory(CWD, false, fileService);
383
- const expectedContent = `--- Context from: ${path.join('my_code', ORIGINAL_GEMINI_MD_FILENAME_CONST_FOR_TEST)} ---\nMy code memory\n--- End of Context from: ${path.join('my_code', ORIGINAL_GEMINI_MD_FILENAME_CONST_FOR_TEST)} ---`;
384
- expect(memoryContent).toBe(expectedContent);
385
- expect(fileCount).toBe(1);
386
- expect(mockFs.readFile).not.toHaveBeenCalledWith(ignoredDirGeminiFile, 'utf-8');
387
141
  });
388
- it('should respect MAX_DIRECTORIES_TO_SCAN_FOR_MEMORY during downward scan', async () => {
142
+ it('should respect the maxDirs parameter during downward scan', async () => {
389
143
  const consoleDebugSpy = vi
390
144
  .spyOn(console, 'debug')
391
145
  .mockImplementation(() => { });
392
- const dirNames = [];
393
- for (let i = 0; i < 250; i++) {
394
- dirNames.push({
395
- name: `deep_dir_${i}`,
396
- isFile: () => false,
397
- isDirectory: () => true,
398
- });
146
+ for (let i = 0; i < 100; i++) {
147
+ await createEmptyDir(path.join(cwd, `deep_dir_${i}`));
399
148
  }
400
- mockFs.readdir.mockImplementation((async (p) => {
401
- if (p === CWD)
402
- return dirNames;
403
- if (p.toString().startsWith(path.join(CWD, 'deep_dir_')))
404
- return [];
405
- return [];
406
- }));
407
- mockFs.access.mockRejectedValue(new Error('not found'));
408
- await loadServerHierarchicalMemory(CWD, true, fileService);
409
- expect(consoleDebugSpy).toHaveBeenCalledWith(expect.stringContaining('[DEBUG] [BfsFileSearch]'), expect.stringContaining('Scanning [200/200]:'));
410
- consoleDebugSpy.mockRestore();
149
+ // Pass the custom limit directly to the function
150
+ await loadServerHierarchicalMemory(cwd, [], true, new FileDiscoveryService(projectRoot), [], 'tree', // importFormat
151
+ {
152
+ respectGitIgnore: true,
153
+ respectGeminiIgnore: true,
154
+ }, 50);
155
+ expect(consoleDebugSpy).toHaveBeenCalledWith(expect.stringContaining('[DEBUG] [BfsFileSearch]'), expect.stringContaining('Scanning [50/50]:'));
156
+ vi.mocked(console.debug).mockRestore();
157
+ const result = await loadServerHierarchicalMemory(cwd, [], false, new FileDiscoveryService(projectRoot));
158
+ expect(result).toEqual({
159
+ memoryContent: '',
160
+ fileCount: 0,
161
+ });
411
162
  });
412
163
  it('should load extension context file paths', async () => {
413
- const extensionFilePath = '/test/extensions/ext1/GEMINI.md';
414
- mockFs.access.mockImplementation(async (p) => {
415
- if (p === extensionFilePath) {
416
- return undefined;
417
- }
418
- throw new Error('File not found');
164
+ const extensionFilePath = await createTestFile(path.join(testRootDir, 'extensions/ext1/GEMINI.md'), 'Extension memory content');
165
+ const result = await loadServerHierarchicalMemory(cwd, [], false, new FileDiscoveryService(projectRoot), [extensionFilePath]);
166
+ expect(result).toEqual({
167
+ memoryContent: `--- Context from: ${path.relative(cwd, extensionFilePath)} ---\nExtension memory content\n--- End of Context from: ${path.relative(cwd, extensionFilePath)} ---`,
168
+ fileCount: 1,
419
169
  });
420
- mockFs.readFile.mockImplementation(async (p) => {
421
- if (p === extensionFilePath) {
422
- return 'Extension memory content';
423
- }
424
- throw new Error('File not found');
170
+ });
171
+ it('should load memory from included directories', async () => {
172
+ const includedDir = await createEmptyDir(path.join(testRootDir, 'included'));
173
+ const includedFile = await createTestFile(path.join(includedDir, DEFAULT_CONTEXT_FILENAME), 'included directory memory');
174
+ const result = await loadServerHierarchicalMemory(cwd, [includedDir], false, new FileDiscoveryService(projectRoot));
175
+ expect(result).toEqual({
176
+ memoryContent: `--- Context from: ${path.relative(cwd, includedFile)} ---\nincluded directory memory\n--- End of Context from: ${path.relative(cwd, includedFile)} ---`,
177
+ fileCount: 1,
425
178
  });
426
- const { memoryContent, fileCount } = await loadServerHierarchicalMemory(CWD, false, fileService, [extensionFilePath]);
427
- expect(memoryContent).toBe(`--- Context from: ${path.relative(CWD, extensionFilePath)} ---\nExtension memory content\n--- End of Context from: ${path.relative(CWD, extensionFilePath)} ---`);
428
- expect(fileCount).toBe(1);
429
- expect(mockFs.readFile).toHaveBeenCalledWith(extensionFilePath, 'utf-8');
430
179
  });
431
180
  });
432
181
  //# sourceMappingURL=memoryDiscovery.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"memoryDiscovery.test.js","sourceRoot":"","sources":["../../../src/utils/memoryDiscovery.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"memoryDiscovery.test.js","sourceRoot":"","sources":["../../../src/utils/memoryDiscovery.test.ts"],"names":[],"mappings":"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"}