@google/gemini-cli-core 0.0.77777772 → 0.0.77777774

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 (291) hide show
  1. package/README.md +108 -71
  2. package/dist/index.d.ts +3 -1
  3. package/dist/index.js +2 -1
  4. package/dist/index.js.map +1 -1
  5. package/dist/src/agents/codebase-investigator.d.ts +46 -0
  6. package/dist/src/agents/codebase-investigator.js +136 -0
  7. package/dist/src/agents/codebase-investigator.js.map +1 -0
  8. package/dist/src/agents/executor.d.ts +92 -0
  9. package/dist/src/agents/executor.js +579 -0
  10. package/dist/src/agents/executor.js.map +1 -0
  11. package/dist/src/agents/executor.test.d.ts +6 -0
  12. package/dist/src/agents/executor.test.js +595 -0
  13. package/dist/src/agents/executor.test.js.map +1 -0
  14. package/dist/src/agents/invocation.d.ts +46 -0
  15. package/dist/src/agents/invocation.js +102 -0
  16. package/dist/src/agents/invocation.js.map +1 -0
  17. package/dist/src/agents/invocation.test.d.ts +6 -0
  18. package/dist/src/agents/invocation.test.js +215 -0
  19. package/dist/src/agents/invocation.test.js.map +1 -0
  20. package/dist/src/agents/registry.d.ts +36 -0
  21. package/dist/src/agents/registry.js +60 -0
  22. package/dist/src/agents/registry.js.map +1 -0
  23. package/dist/src/agents/registry.test.d.ts +6 -0
  24. package/dist/src/agents/registry.test.js +146 -0
  25. package/dist/src/agents/registry.test.js.map +1 -0
  26. package/dist/src/agents/schema-utils.d.ts +39 -0
  27. package/dist/src/agents/schema-utils.js +57 -0
  28. package/dist/src/agents/schema-utils.js.map +1 -0
  29. package/dist/src/agents/schema-utils.test.d.ts +6 -0
  30. package/dist/src/agents/schema-utils.test.js +144 -0
  31. package/dist/src/agents/schema-utils.test.js.map +1 -0
  32. package/dist/src/agents/subagent-tool-wrapper.d.ts +38 -0
  33. package/dist/src/agents/subagent-tool-wrapper.js +48 -0
  34. package/dist/src/agents/subagent-tool-wrapper.js.map +1 -0
  35. package/dist/src/agents/subagent-tool-wrapper.test.d.ts +6 -0
  36. package/dist/src/agents/subagent-tool-wrapper.test.js +112 -0
  37. package/dist/src/agents/subagent-tool-wrapper.test.js.map +1 -0
  38. package/dist/src/agents/types.d.ts +145 -0
  39. package/dist/src/agents/types.js +18 -0
  40. package/dist/src/agents/types.js.map +1 -0
  41. package/dist/src/agents/utils.d.ts +15 -0
  42. package/dist/src/agents/utils.js +29 -0
  43. package/dist/src/agents/utils.js.map +1 -0
  44. package/dist/src/agents/utils.test.d.ts +6 -0
  45. package/dist/src/agents/utils.test.js +87 -0
  46. package/dist/src/agents/utils.test.js.map +1 -0
  47. package/dist/src/code_assist/oauth-credential-storage.js +1 -1
  48. package/dist/src/code_assist/oauth-credential-storage.js.map +1 -1
  49. package/dist/src/code_assist/oauth2.test.js +14 -13
  50. package/dist/src/code_assist/oauth2.test.js.map +1 -1
  51. package/dist/src/code_assist/setup.js +4 -2
  52. package/dist/src/code_assist/setup.js.map +1 -1
  53. package/dist/src/config/config.d.ts +37 -11
  54. package/dist/src/config/config.js +77 -18
  55. package/dist/src/config/config.js.map +1 -1
  56. package/dist/src/config/config.test.js +88 -3
  57. package/dist/src/config/config.test.js.map +1 -1
  58. package/dist/src/config/storage.d.ts +0 -1
  59. package/dist/src/config/storage.js +2 -2
  60. package/dist/src/config/storage.js.map +1 -1
  61. package/dist/src/config/storage.test.js +7 -6
  62. package/dist/src/config/storage.test.js.map +1 -1
  63. package/dist/src/core/baseLlmClient.js +19 -21
  64. package/dist/src/core/baseLlmClient.js.map +1 -1
  65. package/dist/src/core/baseLlmClient.test.js +57 -17
  66. package/dist/src/core/baseLlmClient.test.js.map +1 -1
  67. package/dist/src/core/client.d.ts +3 -1
  68. package/dist/src/core/client.js +68 -46
  69. package/dist/src/core/client.js.map +1 -1
  70. package/dist/src/core/client.test.js +385 -95
  71. package/dist/src/core/client.test.js.map +1 -1
  72. package/dist/src/core/contentGenerator.js +3 -1
  73. package/dist/src/core/contentGenerator.js.map +1 -1
  74. package/dist/src/core/coreToolScheduler.js +12 -12
  75. package/dist/src/core/coreToolScheduler.js.map +1 -1
  76. package/dist/src/core/coreToolScheduler.test.js +260 -23
  77. package/dist/src/core/coreToolScheduler.test.js.map +1 -1
  78. package/dist/src/core/geminiChat.d.ts +7 -11
  79. package/dist/src/core/geminiChat.js +31 -74
  80. package/dist/src/core/geminiChat.js.map +1 -1
  81. package/dist/src/core/geminiChat.test.js +60 -229
  82. package/dist/src/core/geminiChat.test.js.map +1 -1
  83. package/dist/src/core/logger.test.js +2 -2
  84. package/dist/src/core/logger.test.js.map +1 -1
  85. package/dist/src/core/nonInteractiveToolExecutor.test.js +11 -11
  86. package/dist/src/core/nonInteractiveToolExecutor.test.js.map +1 -1
  87. package/dist/src/core/prompts.d.ts +2 -1
  88. package/dist/src/core/prompts.js +91 -17
  89. package/dist/src/core/prompts.js.map +1 -1
  90. package/dist/src/core/prompts.test.js +78 -29
  91. package/dist/src/core/prompts.test.js.map +1 -1
  92. package/dist/src/core/turn.d.ts +14 -2
  93. package/dist/src/core/turn.js +12 -1
  94. package/dist/src/core/turn.js.map +1 -1
  95. package/dist/src/core/turn.test.js +14 -2
  96. package/dist/src/core/turn.test.js.map +1 -1
  97. package/dist/src/generated/git-commit.d.ts +2 -2
  98. package/dist/src/generated/git-commit.js +2 -2
  99. package/dist/src/ide/detect-ide.d.ts +1 -0
  100. package/dist/src/ide/detect-ide.js +4 -1
  101. package/dist/src/ide/detect-ide.js.map +1 -1
  102. package/dist/src/ide/detect-ide.test.js +11 -0
  103. package/dist/src/ide/detect-ide.test.js.map +1 -1
  104. package/dist/src/ide/ide-client.js +3 -3
  105. package/dist/src/ide/ide-client.test.js +4 -4
  106. package/dist/src/ide/ide-installer.js +1 -1
  107. package/dist/src/ide/ide-installer.js.map +1 -1
  108. package/dist/src/ide/ide-installer.test.js +13 -1
  109. package/dist/src/ide/ide-installer.test.js.map +1 -1
  110. package/dist/src/index.d.ts +1 -0
  111. package/dist/src/index.js +1 -0
  112. package/dist/src/index.js.map +1 -1
  113. package/dist/src/mcp/sa-impersonation-provider.d.ts +33 -0
  114. package/dist/src/mcp/sa-impersonation-provider.js +130 -0
  115. package/dist/src/mcp/sa-impersonation-provider.js.map +1 -0
  116. package/dist/src/mcp/sa-impersonation-provider.test.d.ts +6 -0
  117. package/dist/src/mcp/sa-impersonation-provider.test.js +117 -0
  118. package/dist/src/mcp/sa-impersonation-provider.test.js.map +1 -0
  119. package/dist/src/mcp/token-storage/file-token-storage.js +2 -1
  120. package/dist/src/mcp/token-storage/file-token-storage.js.map +1 -1
  121. package/dist/src/mcp/token-storage/file-token-storage.test.js +4 -3
  122. package/dist/src/mcp/token-storage/file-token-storage.test.js.map +1 -1
  123. package/dist/src/services/chatRecordingService.d.ts +2 -1
  124. package/dist/src/services/chatRecordingService.js +2 -1
  125. package/dist/src/services/chatRecordingService.js.map +1 -1
  126. package/dist/src/services/fileSystemService.d.ts +9 -0
  127. package/dist/src/services/fileSystemService.js +11 -0
  128. package/dist/src/services/fileSystemService.js.map +1 -1
  129. package/dist/src/services/shellExecutionService.d.ts +3 -0
  130. package/dist/src/services/shellExecutionService.js +165 -49
  131. package/dist/src/services/shellExecutionService.js.map +1 -1
  132. package/dist/src/services/shellExecutionService.test.js +74 -5
  133. package/dist/src/services/shellExecutionService.test.js.map +1 -1
  134. package/dist/src/telemetry/clearcut-logger/clearcut-logger.d.ts +14 -2
  135. package/dist/src/telemetry/clearcut-logger/clearcut-logger.js +119 -12
  136. package/dist/src/telemetry/clearcut-logger/clearcut-logger.js.map +1 -1
  137. package/dist/src/telemetry/clearcut-logger/clearcut-logger.test.js +99 -1
  138. package/dist/src/telemetry/clearcut-logger/clearcut-logger.test.js.map +1 -1
  139. package/dist/src/telemetry/clearcut-logger/event-metadata-key.d.ts +13 -3
  140. package/dist/src/telemetry/clearcut-logger/event-metadata-key.js +32 -5
  141. package/dist/src/telemetry/clearcut-logger/event-metadata-key.js.map +1 -1
  142. package/dist/src/telemetry/constants.d.ts +0 -52
  143. package/dist/src/telemetry/constants.js +0 -54
  144. package/dist/src/telemetry/constants.js.map +1 -1
  145. package/dist/src/telemetry/index.d.ts +5 -3
  146. package/dist/src/telemetry/index.js +11 -4
  147. package/dist/src/telemetry/index.js.map +1 -1
  148. package/dist/src/telemetry/loggers.d.ts +8 -2
  149. package/dist/src/telemetry/loggers.js +187 -288
  150. package/dist/src/telemetry/loggers.js.map +1 -1
  151. package/dist/src/telemetry/loggers.test.circular.js +3 -3
  152. package/dist/src/telemetry/loggers.test.circular.js.map +1 -1
  153. package/dist/src/telemetry/loggers.test.js +232 -13
  154. package/dist/src/telemetry/loggers.test.js.map +1 -1
  155. package/dist/src/telemetry/memory-monitor.d.ts +149 -0
  156. package/dist/src/telemetry/memory-monitor.js +335 -0
  157. package/dist/src/telemetry/memory-monitor.js.map +1 -0
  158. package/dist/src/telemetry/memory-monitor.test.d.ts +6 -0
  159. package/dist/src/telemetry/memory-monitor.test.js +472 -0
  160. package/dist/src/telemetry/memory-monitor.test.js.map +1 -0
  161. package/dist/src/telemetry/metrics.d.ts +406 -20
  162. package/dist/src/telemetry/metrics.js +479 -235
  163. package/dist/src/telemetry/metrics.js.map +1 -1
  164. package/dist/src/telemetry/metrics.test.js +551 -55
  165. package/dist/src/telemetry/metrics.test.js.map +1 -1
  166. package/dist/src/telemetry/telemetryAttributes.d.ts +8 -0
  167. package/dist/src/telemetry/telemetryAttributes.js +18 -0
  168. package/dist/src/telemetry/telemetryAttributes.js.map +1 -0
  169. package/dist/src/telemetry/types.d.ts +150 -3
  170. package/dist/src/telemetry/types.js +664 -33
  171. package/dist/src/telemetry/types.js.map +1 -1
  172. package/dist/src/telemetry/uiTelemetry.d.ts +1 -1
  173. package/dist/src/telemetry/uiTelemetry.js +1 -1
  174. package/dist/src/telemetry/uiTelemetry.js.map +1 -1
  175. package/dist/src/telemetry/uiTelemetry.test.js +3 -3
  176. package/dist/src/telemetry/uiTelemetry.test.js.map +1 -1
  177. package/dist/src/test-utils/mock-tool.d.ts +28 -3
  178. package/dist/src/test-utils/mock-tool.js +71 -1
  179. package/dist/src/test-utils/mock-tool.js.map +1 -1
  180. package/dist/src/tools/glob.js +2 -1
  181. package/dist/src/tools/glob.js.map +1 -1
  182. package/dist/src/tools/mcp-client.d.ts +3 -2
  183. package/dist/src/tools/mcp-client.js +45 -33
  184. package/dist/src/tools/mcp-client.js.map +1 -1
  185. package/dist/src/tools/mcp-client.test.js +168 -5
  186. package/dist/src/tools/mcp-client.test.js.map +1 -1
  187. package/dist/src/tools/memoryTool.d.ts +1 -1
  188. package/dist/src/tools/memoryTool.js +1 -2
  189. package/dist/src/tools/memoryTool.js.map +1 -1
  190. package/dist/src/tools/memoryTool.test.js +9 -8
  191. package/dist/src/tools/memoryTool.test.js.map +1 -1
  192. package/dist/src/tools/shell.js +2 -2
  193. package/dist/src/tools/shell.js.map +1 -1
  194. package/dist/src/tools/shell.test.js +1 -1
  195. package/dist/src/tools/shell.test.js.map +1 -1
  196. package/dist/src/tools/smart-edit.d.ts +1 -1
  197. package/dist/src/tools/smart-edit.js +114 -10
  198. package/dist/src/tools/smart-edit.js.map +1 -1
  199. package/dist/src/tools/smart-edit.test.js +91 -29
  200. package/dist/src/tools/smart-edit.test.js.map +1 -1
  201. package/dist/src/tools/tool-error.d.ts +21 -0
  202. package/dist/src/tools/tool-error.js +27 -0
  203. package/dist/src/tools/tool-error.js.map +1 -1
  204. package/dist/src/tools/tool-names.d.ts +9 -0
  205. package/dist/src/tools/tool-names.js +18 -0
  206. package/dist/src/tools/tool-names.js.map +1 -0
  207. package/dist/src/tools/tool-registry.test.js +10 -10
  208. package/dist/src/tools/tool-registry.test.js.map +1 -1
  209. package/dist/src/tools/web-fetch.js +3 -0
  210. package/dist/src/tools/web-fetch.js.map +1 -1
  211. package/dist/src/tools/web-fetch.test.js +44 -0
  212. package/dist/src/tools/web-fetch.test.js.map +1 -1
  213. package/dist/src/tools/web-search.js +2 -1
  214. package/dist/src/tools/web-search.js.map +1 -1
  215. package/dist/src/tools/write-file.js +2 -1
  216. package/dist/src/tools/write-file.js.map +1 -1
  217. package/dist/src/tools/write-todos.d.ts +1 -1
  218. package/dist/src/tools/write-todos.js +4 -3
  219. package/dist/src/tools/write-todos.js.map +1 -1
  220. package/dist/src/utils/editCorrector.js +2 -2
  221. package/dist/src/utils/editCorrector.js.map +1 -1
  222. package/dist/src/utils/editor.js +1 -0
  223. package/dist/src/utils/editor.js.map +1 -1
  224. package/dist/src/utils/editor.test.js +1 -0
  225. package/dist/src/utils/editor.test.js.map +1 -1
  226. package/dist/src/utils/errorParsing.d.ts +1 -1
  227. package/dist/src/utils/errorParsing.js +5 -33
  228. package/dist/src/utils/errorParsing.js.map +1 -1
  229. package/dist/src/utils/errorParsing.test.js +0 -88
  230. package/dist/src/utils/errorParsing.test.js.map +1 -1
  231. package/dist/src/utils/flashFallback.test.js +26 -45
  232. package/dist/src/utils/flashFallback.test.js.map +1 -1
  233. package/dist/src/utils/formatters.d.ts +1 -0
  234. package/dist/src/utils/formatters.js +2 -1
  235. package/dist/src/utils/formatters.js.map +1 -1
  236. package/dist/src/utils/formatters.test.d.ts +6 -0
  237. package/dist/src/utils/formatters.test.js +26 -0
  238. package/dist/src/utils/formatters.test.js.map +1 -0
  239. package/dist/src/utils/getFolderStructure.test.js +7 -6
  240. package/dist/src/utils/getFolderStructure.test.js.map +1 -1
  241. package/dist/src/utils/googleErrors.d.ts +104 -0
  242. package/dist/src/utils/googleErrors.js +108 -0
  243. package/dist/src/utils/googleErrors.js.map +1 -0
  244. package/dist/src/utils/googleErrors.test.d.ts +6 -0
  245. package/dist/src/utils/googleErrors.test.js +212 -0
  246. package/dist/src/utils/googleErrors.test.js.map +1 -0
  247. package/dist/src/utils/googleQuotaErrors.d.ts +35 -0
  248. package/dist/src/utils/googleQuotaErrors.js +108 -0
  249. package/dist/src/utils/googleQuotaErrors.js.map +1 -0
  250. package/dist/src/utils/googleQuotaErrors.test.d.ts +6 -0
  251. package/dist/src/utils/googleQuotaErrors.test.js +189 -0
  252. package/dist/src/utils/googleQuotaErrors.test.js.map +1 -0
  253. package/dist/src/utils/installationManager.test.js +2 -1
  254. package/dist/src/utils/installationManager.test.js.map +1 -1
  255. package/dist/src/utils/llm-edit-fixer.js +13 -4
  256. package/dist/src/utils/llm-edit-fixer.js.map +1 -1
  257. package/dist/src/utils/llm-edit-fixer.test.js +81 -0
  258. package/dist/src/utils/llm-edit-fixer.test.js.map +1 -1
  259. package/dist/src/utils/memoryDiscovery.d.ts +1 -0
  260. package/dist/src/utils/memoryDiscovery.js +2 -1
  261. package/dist/src/utils/memoryDiscovery.js.map +1 -1
  262. package/dist/src/utils/memoryDiscovery.test.js +99 -21
  263. package/dist/src/utils/memoryDiscovery.test.js.map +1 -1
  264. package/dist/src/utils/memoryImportProcessor.js +13 -20
  265. package/dist/src/utils/memoryImportProcessor.js.map +1 -1
  266. package/dist/src/utils/memoryImportProcessor.test.js +14 -0
  267. package/dist/src/utils/memoryImportProcessor.test.js.map +1 -1
  268. package/dist/src/utils/pathCorrector.d.ts +25 -0
  269. package/dist/src/utils/pathCorrector.js +33 -0
  270. package/dist/src/utils/pathCorrector.js.map +1 -0
  271. package/dist/src/utils/pathCorrector.test.d.ts +6 -0
  272. package/dist/src/utils/pathCorrector.test.js +83 -0
  273. package/dist/src/utils/pathCorrector.test.js.map +1 -0
  274. package/dist/src/utils/quotaErrorDetection.d.ts +0 -2
  275. package/dist/src/utils/quotaErrorDetection.js +0 -46
  276. package/dist/src/utils/quotaErrorDetection.js.map +1 -1
  277. package/dist/src/utils/retry.d.ts +3 -1
  278. package/dist/src/utils/retry.js +53 -161
  279. package/dist/src/utils/retry.js.map +1 -1
  280. package/dist/src/utils/retry.test.js +90 -149
  281. package/dist/src/utils/retry.test.js.map +1 -1
  282. package/dist/src/utils/terminalSerializer.d.ts +1 -4
  283. package/dist/src/utils/terminalSerializer.js +3 -3
  284. package/dist/src/utils/terminalSerializer.js.map +1 -1
  285. package/dist/src/utils/userAccountManager.test.js +2 -1
  286. package/dist/src/utils/userAccountManager.test.js.map +1 -1
  287. package/dist/tsconfig.tsbuildinfo +1 -1
  288. package/package.json +1 -1
  289. package/dist/src/test-utils/tools.d.ts +0 -45
  290. package/dist/src/test-utils/tools.js +0 -105
  291. package/dist/src/test-utils/tools.js.map +0 -1
@@ -0,0 +1,472 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import { describe, it, expect, beforeEach, afterEach, vi } from 'vitest';
7
+ import v8 from 'node:v8';
8
+ import process from 'node:process';
9
+ import { MemoryMonitor, initializeMemoryMonitor, getMemoryMonitor, recordCurrentMemoryUsage, startGlobalMemoryMonitoring, stopGlobalMemoryMonitoring, _resetGlobalMemoryMonitorForTests, } from './memory-monitor.js';
10
+ import { recordMemoryUsage, isPerformanceMonitoringActive } from './metrics.js';
11
+ import { HighWaterMarkTracker } from './high-water-mark-tracker.js';
12
+ import { RateLimiter } from './rate-limiter.js';
13
+ // Mock dependencies
14
+ vi.mock('./metrics.js', () => ({
15
+ recordMemoryUsage: vi.fn(),
16
+ isPerformanceMonitoringActive: vi.fn(),
17
+ MemoryMetricType: {
18
+ HEAP_USED: 'heap_used',
19
+ HEAP_TOTAL: 'heap_total',
20
+ EXTERNAL: 'external',
21
+ RSS: 'rss',
22
+ },
23
+ }));
24
+ // Mock Node.js modules
25
+ vi.mock('node:v8', () => ({
26
+ default: {
27
+ getHeapStatistics: vi.fn(),
28
+ getHeapSpaceStatistics: vi.fn(),
29
+ },
30
+ }));
31
+ vi.mock('node:process', () => ({
32
+ default: {
33
+ memoryUsage: vi.fn(),
34
+ cpuUsage: vi.fn(),
35
+ uptime: vi.fn(),
36
+ },
37
+ }));
38
+ const mockRecordMemoryUsage = vi.mocked(recordMemoryUsage);
39
+ const mockIsPerformanceMonitoringActive = vi.mocked(isPerformanceMonitoringActive);
40
+ const mockV8GetHeapStatistics = vi.mocked(v8.getHeapStatistics);
41
+ const mockV8GetHeapSpaceStatistics = vi.mocked(v8.getHeapSpaceStatistics);
42
+ const mockProcessMemoryUsage = vi.mocked(process.memoryUsage);
43
+ const mockProcessCpuUsage = vi.mocked(process.cpuUsage);
44
+ const mockProcessUptime = vi.mocked(process.uptime);
45
+ // Mock config object
46
+ const mockConfig = {
47
+ getSessionId: () => 'test-session-id',
48
+ getTelemetryEnabled: () => true,
49
+ };
50
+ // Test data
51
+ const mockMemoryUsage = {
52
+ heapUsed: 15728640, // ~15MB
53
+ heapTotal: 31457280, // ~30MB
54
+ external: 2097152, // ~2MB
55
+ rss: 41943040, // ~40MB
56
+ arrayBuffers: 1048576, // ~1MB
57
+ };
58
+ const mockHeapStatistics = {
59
+ heap_size_limit: 536870912, // ~512MB
60
+ total_heap_size: 31457280,
61
+ total_heap_size_executable: 4194304, // ~4MB
62
+ total_physical_size: 31457280,
63
+ total_available_size: 1000000000, // ~1GB
64
+ used_heap_size: 15728640,
65
+ malloced_memory: 8192,
66
+ peak_malloced_memory: 16384,
67
+ does_zap_garbage: 0,
68
+ number_of_native_contexts: 1,
69
+ number_of_detached_contexts: 0,
70
+ total_global_handles_size: 8192,
71
+ used_global_handles_size: 4096,
72
+ external_memory: 2097152,
73
+ };
74
+ const mockHeapSpaceStatistics = [
75
+ {
76
+ space_name: 'new_space',
77
+ space_size: 8388608,
78
+ space_used_size: 4194304,
79
+ space_available_size: 4194304,
80
+ physical_space_size: 8388608,
81
+ },
82
+ {
83
+ space_name: 'old_space',
84
+ space_size: 16777216,
85
+ space_used_size: 8388608,
86
+ space_available_size: 8388608,
87
+ physical_space_size: 16777216,
88
+ },
89
+ ];
90
+ const mockCpuUsage = {
91
+ user: 1000000, // 1 second
92
+ system: 500000, // 0.5 seconds
93
+ };
94
+ describe('MemoryMonitor', () => {
95
+ beforeEach(() => {
96
+ vi.useFakeTimers();
97
+ vi.setSystemTime(new Date('2025-01-01T00:00:00.000Z'));
98
+ // Setup default mocks
99
+ mockIsPerformanceMonitoringActive.mockReturnValue(true);
100
+ mockProcessMemoryUsage.mockReturnValue(mockMemoryUsage);
101
+ mockV8GetHeapStatistics.mockReturnValue(mockHeapStatistics);
102
+ mockV8GetHeapSpaceStatistics.mockReturnValue(mockHeapSpaceStatistics);
103
+ mockProcessCpuUsage.mockReturnValue(mockCpuUsage);
104
+ mockProcessUptime.mockReturnValue(123.456);
105
+ });
106
+ afterEach(() => {
107
+ vi.restoreAllMocks();
108
+ vi.useRealTimers();
109
+ _resetGlobalMemoryMonitorForTests();
110
+ });
111
+ describe('MemoryMonitor Class', () => {
112
+ describe('constructor', () => {
113
+ it('should create a new MemoryMonitor instance without config to avoid multi-session attribution', () => {
114
+ const monitor = new MemoryMonitor();
115
+ expect(monitor).toBeInstanceOf(MemoryMonitor);
116
+ });
117
+ });
118
+ describe('takeSnapshot', () => {
119
+ it('should take a memory snapshot and record metrics when performance monitoring is active', () => {
120
+ const monitor = new MemoryMonitor();
121
+ const snapshot = monitor.takeSnapshot('test_context', mockConfig);
122
+ expect(snapshot).toEqual({
123
+ timestamp: Date.now(),
124
+ heapUsed: mockMemoryUsage.heapUsed,
125
+ heapTotal: mockMemoryUsage.heapTotal,
126
+ external: mockMemoryUsage.external,
127
+ rss: mockMemoryUsage.rss,
128
+ arrayBuffers: mockMemoryUsage.arrayBuffers,
129
+ heapSizeLimit: mockHeapStatistics.heap_size_limit,
130
+ });
131
+ // Verify metrics were recorded
132
+ expect(mockRecordMemoryUsage).toHaveBeenCalledWith(mockConfig, mockMemoryUsage.heapUsed, {
133
+ memory_type: 'heap_used',
134
+ component: 'test_context',
135
+ });
136
+ expect(mockRecordMemoryUsage).toHaveBeenCalledWith(mockConfig, mockMemoryUsage.heapTotal, {
137
+ memory_type: 'heap_total',
138
+ component: 'test_context',
139
+ });
140
+ expect(mockRecordMemoryUsage).toHaveBeenCalledWith(mockConfig, mockMemoryUsage.external, {
141
+ memory_type: 'external',
142
+ component: 'test_context',
143
+ });
144
+ expect(mockRecordMemoryUsage).toHaveBeenCalledWith(mockConfig, mockMemoryUsage.rss, {
145
+ memory_type: 'rss',
146
+ component: 'test_context',
147
+ });
148
+ });
149
+ it('should not record metrics when performance monitoring is inactive', () => {
150
+ mockIsPerformanceMonitoringActive.mockReturnValue(false);
151
+ const monitor = new MemoryMonitor();
152
+ const snapshot = monitor.takeSnapshot('test_context', mockConfig);
153
+ expect(snapshot).toEqual({
154
+ timestamp: Date.now(),
155
+ heapUsed: mockMemoryUsage.heapUsed,
156
+ heapTotal: mockMemoryUsage.heapTotal,
157
+ external: mockMemoryUsage.external,
158
+ rss: mockMemoryUsage.rss,
159
+ arrayBuffers: mockMemoryUsage.arrayBuffers,
160
+ heapSizeLimit: mockHeapStatistics.heap_size_limit,
161
+ });
162
+ // Verify no metrics were recorded
163
+ expect(mockRecordMemoryUsage).not.toHaveBeenCalled();
164
+ });
165
+ });
166
+ describe('getCurrentMemoryUsage', () => {
167
+ it('should return current memory usage without recording metrics', () => {
168
+ const monitor = new MemoryMonitor();
169
+ const usage = monitor.getCurrentMemoryUsage();
170
+ expect(usage).toEqual({
171
+ timestamp: Date.now(),
172
+ heapUsed: mockMemoryUsage.heapUsed,
173
+ heapTotal: mockMemoryUsage.heapTotal,
174
+ external: mockMemoryUsage.external,
175
+ rss: mockMemoryUsage.rss,
176
+ arrayBuffers: mockMemoryUsage.arrayBuffers,
177
+ heapSizeLimit: mockHeapStatistics.heap_size_limit,
178
+ });
179
+ // Verify no metrics were recorded
180
+ expect(mockRecordMemoryUsage).not.toHaveBeenCalled();
181
+ });
182
+ });
183
+ describe('start and stop', () => {
184
+ it('should start and stop memory monitoring with proper lifecycle', () => {
185
+ const monitor = new MemoryMonitor();
186
+ const intervalMs = 1000;
187
+ // Start monitoring
188
+ monitor.start(mockConfig, intervalMs);
189
+ // Verify initial snapshot was taken
190
+ expect(mockRecordMemoryUsage).toHaveBeenCalledWith(mockConfig, mockMemoryUsage.heapUsed, {
191
+ memory_type: 'heap_used',
192
+ component: 'monitoring_start',
193
+ });
194
+ // Fast-forward time to trigger periodic snapshot
195
+ vi.advanceTimersByTime(intervalMs);
196
+ // Verify monitoring_start snapshot was taken (multiple metrics)
197
+ expect(mockRecordMemoryUsage).toHaveBeenCalledWith(mockConfig, expect.any(Number), {
198
+ memory_type: 'heap_used',
199
+ component: 'monitoring_start',
200
+ });
201
+ // Stop monitoring
202
+ monitor.stop(mockConfig);
203
+ // Verify final snapshot was taken
204
+ expect(mockRecordMemoryUsage).toHaveBeenCalledWith(mockConfig, mockMemoryUsage.heapUsed, {
205
+ memory_type: 'heap_used',
206
+ component: 'monitoring_stop',
207
+ });
208
+ });
209
+ it('should not start monitoring when performance monitoring is inactive', () => {
210
+ mockIsPerformanceMonitoringActive.mockReturnValue(false);
211
+ const monitor = new MemoryMonitor();
212
+ monitor.start(mockConfig, 1000);
213
+ // Verify no snapshots were taken
214
+ expect(mockRecordMemoryUsage).not.toHaveBeenCalled();
215
+ });
216
+ it('should not start monitoring when already running', () => {
217
+ const monitor = new MemoryMonitor();
218
+ // Start monitoring twice
219
+ monitor.start(mockConfig, 1000);
220
+ const initialCallCount = mockRecordMemoryUsage.mock.calls.length;
221
+ monitor.start(mockConfig, 1000);
222
+ // Verify no additional snapshots were taken
223
+ expect(mockRecordMemoryUsage).toHaveBeenCalledTimes(initialCallCount);
224
+ });
225
+ it('should handle stop when not running', () => {
226
+ const monitor = new MemoryMonitor();
227
+ // Should not throw error
228
+ expect(() => monitor.stop(mockConfig)).not.toThrow();
229
+ });
230
+ it('should stop without taking final snapshot when no config provided', () => {
231
+ const monitor = new MemoryMonitor();
232
+ monitor.start(mockConfig, 1000);
233
+ const callsBeforeStop = mockRecordMemoryUsage.mock.calls.length;
234
+ monitor.stop(); // No config provided
235
+ // Verify no final snapshot was taken
236
+ expect(mockRecordMemoryUsage).toHaveBeenCalledTimes(callsBeforeStop);
237
+ });
238
+ it('should periodically cleanup tracker state to prevent growth', () => {
239
+ const trackerCleanupSpy = vi.spyOn(HighWaterMarkTracker.prototype, 'cleanup');
240
+ const rateLimiterCleanupSpy = vi.spyOn(RateLimiter.prototype, 'cleanup');
241
+ const monitor = new MemoryMonitor();
242
+ monitor.start(mockConfig, 1000);
243
+ trackerCleanupSpy.mockClear();
244
+ rateLimiterCleanupSpy.mockClear();
245
+ // Advance timers beyond the cleanup interval (15 minutes) to trigger cleanup
246
+ vi.advanceTimersByTime(16 * 60 * 1000);
247
+ expect(trackerCleanupSpy).toHaveBeenCalled();
248
+ expect(rateLimiterCleanupSpy).toHaveBeenCalled();
249
+ monitor.stop(mockConfig);
250
+ trackerCleanupSpy.mockRestore();
251
+ rateLimiterCleanupSpy.mockRestore();
252
+ });
253
+ });
254
+ describe('getMemoryGrowth', () => {
255
+ it('should calculate memory growth between snapshots', () => {
256
+ const monitor = new MemoryMonitor();
257
+ // Take initial snapshot
258
+ monitor.takeSnapshot('initial', mockConfig);
259
+ // Change memory usage
260
+ const newMemoryUsage = {
261
+ ...mockMemoryUsage,
262
+ heapUsed: mockMemoryUsage.heapUsed + 1048576, // +1MB
263
+ rss: mockMemoryUsage.rss + 2097152, // +2MB
264
+ };
265
+ mockProcessMemoryUsage.mockReturnValue(newMemoryUsage);
266
+ const growth = monitor.getMemoryGrowth();
267
+ expect(growth).toEqual({
268
+ heapUsed: 1048576,
269
+ heapTotal: 0,
270
+ external: 0,
271
+ rss: 2097152,
272
+ arrayBuffers: 0,
273
+ });
274
+ });
275
+ it('should return null when no previous snapshot exists', () => {
276
+ const monitor = new MemoryMonitor();
277
+ const growth = monitor.getMemoryGrowth();
278
+ expect(growth).toBeNull();
279
+ });
280
+ });
281
+ describe('checkMemoryThreshold', () => {
282
+ it('should return true when memory usage exceeds threshold', () => {
283
+ const monitor = new MemoryMonitor();
284
+ const thresholdMB = 10; // 10MB threshold
285
+ const exceeds = monitor.checkMemoryThreshold(thresholdMB);
286
+ expect(exceeds).toBe(true); // heapUsed is ~15MB
287
+ });
288
+ it('should return false when memory usage is below threshold', () => {
289
+ const monitor = new MemoryMonitor();
290
+ const thresholdMB = 20; // 20MB threshold
291
+ const exceeds = monitor.checkMemoryThreshold(thresholdMB);
292
+ expect(exceeds).toBe(false); // heapUsed is ~15MB
293
+ });
294
+ });
295
+ describe('getMemoryUsageSummary', () => {
296
+ it('should return memory usage summary in MB with proper rounding', () => {
297
+ const monitor = new MemoryMonitor();
298
+ const summary = monitor.getMemoryUsageSummary();
299
+ expect(summary).toEqual({
300
+ heapUsedMB: 15.0, // 15728640 bytes = 15MB
301
+ heapTotalMB: 30.0, // 31457280 bytes = 30MB
302
+ externalMB: 2.0, // 2097152 bytes = 2MB
303
+ rssMB: 40.0, // 41943040 bytes = 40MB
304
+ heapSizeLimitMB: 512.0, // 536870912 bytes = 512MB
305
+ });
306
+ });
307
+ });
308
+ describe('getHeapStatistics', () => {
309
+ it('should return V8 heap statistics', () => {
310
+ const monitor = new MemoryMonitor();
311
+ const stats = monitor.getHeapStatistics();
312
+ expect(stats).toBe(mockHeapStatistics);
313
+ expect(mockV8GetHeapStatistics).toHaveBeenCalled();
314
+ });
315
+ });
316
+ describe('getHeapSpaceStatistics', () => {
317
+ it('should return V8 heap space statistics', () => {
318
+ const monitor = new MemoryMonitor();
319
+ const stats = monitor.getHeapSpaceStatistics();
320
+ expect(stats).toBe(mockHeapSpaceStatistics);
321
+ expect(mockV8GetHeapSpaceStatistics).toHaveBeenCalled();
322
+ });
323
+ });
324
+ describe('getProcessMetrics', () => {
325
+ it('should return process CPU and memory metrics', () => {
326
+ const monitor = new MemoryMonitor();
327
+ const metrics = monitor.getProcessMetrics();
328
+ expect(metrics).toEqual({
329
+ cpuUsage: mockCpuUsage,
330
+ memoryUsage: mockMemoryUsage,
331
+ uptime: 123.456,
332
+ });
333
+ });
334
+ });
335
+ describe('recordComponentMemoryUsage', () => {
336
+ it('should record memory usage for specific component', () => {
337
+ const monitor = new MemoryMonitor();
338
+ const snapshot = monitor.recordComponentMemoryUsage(mockConfig, 'test_component');
339
+ expect(snapshot).toEqual({
340
+ timestamp: Date.now(),
341
+ heapUsed: mockMemoryUsage.heapUsed,
342
+ heapTotal: mockMemoryUsage.heapTotal,
343
+ external: mockMemoryUsage.external,
344
+ rss: mockMemoryUsage.rss,
345
+ arrayBuffers: mockMemoryUsage.arrayBuffers,
346
+ heapSizeLimit: mockHeapStatistics.heap_size_limit,
347
+ });
348
+ expect(mockRecordMemoryUsage).toHaveBeenCalledWith(mockConfig, mockMemoryUsage.heapUsed, {
349
+ memory_type: 'heap_used',
350
+ component: 'test_component',
351
+ });
352
+ });
353
+ it('should record memory usage for component with operation', () => {
354
+ const monitor = new MemoryMonitor();
355
+ monitor.recordComponentMemoryUsage(mockConfig, 'test_component', 'test_operation');
356
+ expect(mockRecordMemoryUsage).toHaveBeenCalledWith(mockConfig, mockMemoryUsage.heapUsed, {
357
+ memory_type: 'heap_used',
358
+ component: 'test_component_test_operation',
359
+ });
360
+ });
361
+ });
362
+ describe('destroy', () => {
363
+ it('should stop monitoring and cleanup resources', () => {
364
+ const monitor = new MemoryMonitor();
365
+ monitor.start(mockConfig, 1000);
366
+ monitor.destroy();
367
+ // Fast-forward time to ensure no more periodic snapshots
368
+ const callsBeforeDestroy = mockRecordMemoryUsage.mock.calls.length;
369
+ vi.advanceTimersByTime(2000);
370
+ expect(mockRecordMemoryUsage).toHaveBeenCalledTimes(callsBeforeDestroy);
371
+ });
372
+ });
373
+ });
374
+ describe('Global Memory Monitor Functions', () => {
375
+ describe('initializeMemoryMonitor', () => {
376
+ it('should create singleton instance', () => {
377
+ const monitor1 = initializeMemoryMonitor();
378
+ const monitor2 = initializeMemoryMonitor();
379
+ expect(monitor1).toBe(monitor2);
380
+ expect(monitor1).toBeInstanceOf(MemoryMonitor);
381
+ });
382
+ });
383
+ describe('getMemoryMonitor', () => {
384
+ it('should return null when not initialized', () => {
385
+ _resetGlobalMemoryMonitorForTests();
386
+ expect(getMemoryMonitor()).toBeNull();
387
+ });
388
+ it('should return initialized monitor', () => {
389
+ const initialized = initializeMemoryMonitor();
390
+ const retrieved = getMemoryMonitor();
391
+ expect(retrieved).toBe(initialized);
392
+ });
393
+ });
394
+ describe('recordCurrentMemoryUsage', () => {
395
+ it('should initialize monitor and take snapshot', () => {
396
+ const snapshot = recordCurrentMemoryUsage(mockConfig, 'test_context');
397
+ expect(snapshot).toEqual({
398
+ timestamp: Date.now(),
399
+ heapUsed: mockMemoryUsage.heapUsed,
400
+ heapTotal: mockMemoryUsage.heapTotal,
401
+ external: mockMemoryUsage.external,
402
+ rss: mockMemoryUsage.rss,
403
+ arrayBuffers: mockMemoryUsage.arrayBuffers,
404
+ heapSizeLimit: mockHeapStatistics.heap_size_limit,
405
+ });
406
+ expect(mockRecordMemoryUsage).toHaveBeenCalledWith(mockConfig, mockMemoryUsage.heapUsed, {
407
+ memory_type: 'heap_used',
408
+ component: 'test_context',
409
+ });
410
+ });
411
+ });
412
+ describe('startGlobalMemoryMonitoring', () => {
413
+ it('should initialize and start global monitoring', () => {
414
+ startGlobalMemoryMonitoring(mockConfig, 1000);
415
+ // Verify initial snapshot
416
+ expect(mockRecordMemoryUsage).toHaveBeenCalledWith(mockConfig, mockMemoryUsage.heapUsed, {
417
+ memory_type: 'heap_used',
418
+ component: 'monitoring_start',
419
+ });
420
+ // Fast-forward and verify monitoring snapshot
421
+ vi.advanceTimersByTime(1000);
422
+ expect(mockRecordMemoryUsage).toHaveBeenCalledWith(mockConfig, expect.any(Number), {
423
+ memory_type: 'heap_used',
424
+ component: 'monitoring_start',
425
+ });
426
+ });
427
+ });
428
+ describe('stopGlobalMemoryMonitoring', () => {
429
+ it('should stop global monitoring when monitor exists', () => {
430
+ startGlobalMemoryMonitoring(mockConfig, 1000);
431
+ stopGlobalMemoryMonitoring(mockConfig);
432
+ // Verify final snapshot
433
+ expect(mockRecordMemoryUsage).toHaveBeenCalledWith(mockConfig, mockMemoryUsage.heapUsed, {
434
+ memory_type: 'heap_used',
435
+ component: 'monitoring_stop',
436
+ });
437
+ // Verify no more periodic snapshots
438
+ const callsAfterStop = mockRecordMemoryUsage.mock.calls.length;
439
+ vi.advanceTimersByTime(2000);
440
+ expect(mockRecordMemoryUsage.mock.calls.length).toBe(callsAfterStop);
441
+ });
442
+ it('should handle stop when no global monitor exists', () => {
443
+ expect(() => stopGlobalMemoryMonitoring(mockConfig)).not.toThrow();
444
+ });
445
+ });
446
+ });
447
+ describe('Error Scenarios', () => {
448
+ it('should handle process.memoryUsage() errors gracefully', () => {
449
+ mockProcessMemoryUsage.mockImplementation(() => {
450
+ throw new Error('Memory access error');
451
+ });
452
+ const monitor = new MemoryMonitor();
453
+ expect(() => monitor.getCurrentMemoryUsage()).toThrow('Memory access error');
454
+ });
455
+ it('should handle v8.getHeapStatistics() errors gracefully', () => {
456
+ mockV8GetHeapStatistics.mockImplementation(() => {
457
+ throw new Error('Heap statistics error');
458
+ });
459
+ const monitor = new MemoryMonitor();
460
+ expect(() => monitor.getCurrentMemoryUsage()).toThrow('Heap statistics error');
461
+ });
462
+ it('should handle metric recording errors gracefully', () => {
463
+ mockRecordMemoryUsage.mockImplementation(() => {
464
+ throw new Error('Metric recording error');
465
+ });
466
+ const monitor = new MemoryMonitor();
467
+ // Should propagate error if metric recording fails
468
+ expect(() => monitor.takeSnapshot('test', mockConfig)).toThrow('Metric recording error');
469
+ });
470
+ });
471
+ });
472
+ //# sourceMappingURL=memory-monitor.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory-monitor.test.js","sourceRoot":"","sources":["../../../src/telemetry/memory-monitor.test.ts"],"names":[],"mappings":"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"}