@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
@@ -13,6 +13,7 @@ vi.mock('../telemetry/loggers.js', () => ({
13
13
  }));
14
14
  const TOOL_CALL_LOOP_THRESHOLD = 5;
15
15
  const CONTENT_LOOP_THRESHOLD = 10;
16
+ const CONTENT_CHUNK_SIZE = 50;
16
17
  describe('LoopDetectionService', () => {
17
18
  let service;
18
19
  let mockConfig;
@@ -37,6 +38,14 @@ describe('LoopDetectionService', () => {
37
38
  type: GeminiEventType.Content,
38
39
  value: content,
39
40
  });
41
+ const createRepetitiveContent = (id, length) => {
42
+ const baseString = `This is a unique sentence, id=${id}. `;
43
+ let content = '';
44
+ while (content.length < length) {
45
+ content += baseString;
46
+ }
47
+ return content.slice(0, length);
48
+ };
40
49
  describe('Tool Call Loop Detection', () => {
41
50
  it(`should not detect a loop for fewer than TOOL_CALL_LOOP_THRESHOLD identical calls`, () => {
42
51
  const event = createToolCallRequestEvent('testTool', { param: 'value' });
@@ -59,7 +68,7 @@ describe('LoopDetectionService', () => {
59
68
  service.addAndCheck(event);
60
69
  }
61
70
  expect(service.addAndCheck(event)).toBe(true);
62
- expect(loggers.logLoopDetected).toHaveBeenCalledTimes(2);
71
+ expect(loggers.logLoopDetected).toHaveBeenCalledTimes(1);
63
72
  });
64
73
  it('should not detect a loop for different tool calls', () => {
65
74
  const event1 = createToolCallRequestEvent('testTool', {
@@ -96,125 +105,122 @@ describe('LoopDetectionService', () => {
96
105
  });
97
106
  });
98
107
  describe('Content Loop Detection', () => {
99
- it(`should not detect a loop for fewer than CONTENT_LOOP_THRESHOLD identical content strings`, () => {
100
- const event = createContentEvent('This is a test sentence.');
101
- for (let i = 0; i < CONTENT_LOOP_THRESHOLD - 1; i++) {
102
- expect(service.addAndCheck(event)).toBe(false);
108
+ const generateRandomString = (length) => {
109
+ let result = '';
110
+ const characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
111
+ const charactersLength = characters.length;
112
+ for (let i = 0; i < length; i++) {
113
+ result += characters.charAt(Math.floor(Math.random() * charactersLength));
114
+ }
115
+ return result;
116
+ };
117
+ it('should not detect a loop for random content', () => {
118
+ service.reset('');
119
+ for (let i = 0; i < 1000; i++) {
120
+ const content = generateRandomString(10);
121
+ const isLoop = service.addAndCheck(createContentEvent(content));
122
+ expect(isLoop).toBe(false);
103
123
  }
104
124
  expect(loggers.logLoopDetected).not.toHaveBeenCalled();
105
125
  });
106
- it(`should detect a loop on the CONTENT_LOOP_THRESHOLD-th identical content string`, () => {
107
- const event = createContentEvent('This is a test sentence.');
108
- for (let i = 0; i < CONTENT_LOOP_THRESHOLD - 1; i++) {
109
- service.addAndCheck(event);
126
+ it('should detect a loop when a chunk of content repeats consecutively', () => {
127
+ service.reset('');
128
+ const repeatedContent = createRepetitiveContent(1, CONTENT_CHUNK_SIZE);
129
+ let isLoop = false;
130
+ for (let i = 0; i < CONTENT_LOOP_THRESHOLD; i++) {
131
+ isLoop = service.addAndCheck(createContentEvent(repeatedContent));
110
132
  }
111
- expect(service.addAndCheck(event)).toBe(true);
133
+ expect(isLoop).toBe(true);
112
134
  expect(loggers.logLoopDetected).toHaveBeenCalledTimes(1);
113
135
  });
114
- it('should not detect a loop for different content strings', () => {
115
- const event1 = createContentEvent('Sentence A');
116
- const event2 = createContentEvent('Sentence B');
117
- for (let i = 0; i < CONTENT_LOOP_THRESHOLD - 2; i++) {
118
- expect(service.addAndCheck(event1)).toBe(false);
119
- expect(service.addAndCheck(event2)).toBe(false);
136
+ it('should not detect a loop if repetitions are very far apart', () => {
137
+ service.reset('');
138
+ const repeatedContent = createRepetitiveContent(1, CONTENT_CHUNK_SIZE);
139
+ const fillerContent = generateRandomString(500);
140
+ let isLoop = false;
141
+ for (let i = 0; i < CONTENT_LOOP_THRESHOLD; i++) {
142
+ isLoop = service.addAndCheck(createContentEvent(repeatedContent));
143
+ isLoop = service.addAndCheck(createContentEvent(fillerContent));
120
144
  }
145
+ expect(isLoop).toBe(false);
121
146
  expect(loggers.logLoopDetected).not.toHaveBeenCalled();
122
147
  });
123
148
  });
124
- describe('Sentence Extraction and Punctuation', () => {
125
- it('should not check for loops when content has no sentence-ending punctuation', () => {
126
- const eventNoPunct = createContentEvent('This has no punctuation');
127
- expect(service.addAndCheck(eventNoPunct)).toBe(false);
128
- const eventWithPunct = createContentEvent('This has punctuation!');
129
- expect(service.addAndCheck(eventWithPunct)).toBe(false);
130
- });
131
- it('should not treat function calls or method calls as sentence endings', () => {
132
- // These should not trigger sentence detection, so repeating them many times should never cause a loop
133
- for (let i = 0; i < CONTENT_LOOP_THRESHOLD + 2; i++) {
134
- expect(service.addAndCheck(createContentEvent('console.log()'))).toBe(false);
135
- }
136
- service.reset();
137
- for (let i = 0; i < CONTENT_LOOP_THRESHOLD + 2; i++) {
138
- expect(service.addAndCheck(createContentEvent('obj.method()'))).toBe(false);
149
+ describe('Content Loop Detection with Code Blocks', () => {
150
+ it('should not detect a loop when repetitive content is inside a code block', () => {
151
+ service.reset('');
152
+ const repeatedContent = createRepetitiveContent(1, CONTENT_CHUNK_SIZE);
153
+ service.addAndCheck(createContentEvent('```\n'));
154
+ for (let i = 0; i < CONTENT_LOOP_THRESHOLD; i++) {
155
+ const isLoop = service.addAndCheck(createContentEvent(repeatedContent));
156
+ expect(isLoop).toBe(false);
139
157
  }
140
- service.reset();
141
- for (let i = 0; i < CONTENT_LOOP_THRESHOLD + 2; i++) {
142
- expect(service.addAndCheck(createContentEvent('arr.filter().map()'))).toBe(false);
143
- }
144
- service.reset();
145
- for (let i = 0; i < CONTENT_LOOP_THRESHOLD + 2; i++) {
146
- expect(service.addAndCheck(createContentEvent('if (condition) { return true; }'))).toBe(false);
147
- }
148
- });
149
- it('should correctly identify actual sentence endings and trigger loop detection', () => {
150
- // These should trigger sentence detection, so repeating them should eventually cause a loop
151
- for (let i = 0; i < CONTENT_LOOP_THRESHOLD - 1; i++) {
152
- expect(service.addAndCheck(createContentEvent('This is a sentence.'))).toBe(false);
153
- }
154
- expect(service.addAndCheck(createContentEvent('This is a sentence.'))).toBe(true);
155
- service.reset();
156
- for (let i = 0; i < CONTENT_LOOP_THRESHOLD - 1; i++) {
157
- expect(service.addAndCheck(createContentEvent('Is this a question? '))).toBe(false);
158
- }
159
- expect(service.addAndCheck(createContentEvent('Is this a question? '))).toBe(true);
160
- service.reset();
161
- for (let i = 0; i < CONTENT_LOOP_THRESHOLD - 1; i++) {
162
- expect(service.addAndCheck(createContentEvent('What excitement!\n'))).toBe(false);
163
- }
164
- expect(service.addAndCheck(createContentEvent('What excitement!\n'))).toBe(true);
158
+ const isLoop = service.addAndCheck(createContentEvent('\n```'));
159
+ expect(isLoop).toBe(false);
160
+ expect(loggers.logLoopDetected).not.toHaveBeenCalled();
165
161
  });
166
- it('should handle content with mixed punctuation', () => {
167
- service.addAndCheck(createContentEvent('Question?'));
168
- service.addAndCheck(createContentEvent('Exclamation!'));
169
- service.addAndCheck(createContentEvent('Period.'));
170
- // Repeat one of them multiple times
171
- for (let i = 0; i < CONTENT_LOOP_THRESHOLD - 1; i++) {
172
- service.addAndCheck(createContentEvent('Period.'));
162
+ it('should detect a loop when repetitive content is outside a code block', () => {
163
+ service.reset('');
164
+ const repeatedContent = createRepetitiveContent(1, CONTENT_CHUNK_SIZE);
165
+ service.addAndCheck(createContentEvent('```'));
166
+ service.addAndCheck(createContentEvent('\nsome code\n'));
167
+ service.addAndCheck(createContentEvent('```'));
168
+ let isLoop = false;
169
+ for (let i = 0; i < CONTENT_LOOP_THRESHOLD; i++) {
170
+ isLoop = service.addAndCheck(createContentEvent(repeatedContent));
173
171
  }
174
- expect(service.addAndCheck(createContentEvent('Period.'))).toBe(true);
172
+ expect(isLoop).toBe(true);
173
+ expect(loggers.logLoopDetected).toHaveBeenCalledTimes(1);
175
174
  });
176
- it('should handle empty sentences after trimming', () => {
177
- service.addAndCheck(createContentEvent(' .'));
178
- expect(service.addAndCheck(createContentEvent('Normal sentence.'))).toBe(false);
175
+ it('should handle content with multiple code blocks and no loops', () => {
176
+ service.reset('');
177
+ service.addAndCheck(createContentEvent('```\ncode1\n```'));
178
+ service.addAndCheck(createContentEvent('\nsome text\n'));
179
+ const isLoop = service.addAndCheck(createContentEvent('```\ncode2\n```'));
180
+ expect(isLoop).toBe(false);
181
+ expect(loggers.logLoopDetected).not.toHaveBeenCalled();
179
182
  });
180
- it('should require at least two sentences for loop detection', () => {
181
- const event = createContentEvent('Only one sentence.');
182
- expect(service.addAndCheck(event)).toBe(false);
183
- // Even repeating the same single sentence shouldn't trigger detection
184
- for (let i = 0; i < 5; i++) {
185
- expect(service.addAndCheck(event)).toBe(false);
183
+ it('should handle content with mixed code blocks and looping text', () => {
184
+ service.reset('');
185
+ const repeatedContent = createRepetitiveContent(1, CONTENT_CHUNK_SIZE);
186
+ service.addAndCheck(createContentEvent('```'));
187
+ service.addAndCheck(createContentEvent('\ncode1\n'));
188
+ service.addAndCheck(createContentEvent('```'));
189
+ let isLoop = false;
190
+ for (let i = 0; i < CONTENT_LOOP_THRESHOLD; i++) {
191
+ isLoop = service.addAndCheck(createContentEvent(repeatedContent));
186
192
  }
193
+ expect(isLoop).toBe(true);
194
+ expect(loggers.logLoopDetected).toHaveBeenCalledTimes(1);
187
195
  });
188
- });
189
- describe('Performance Optimizations', () => {
190
- it('should cache sentence extraction and only re-extract when content grows significantly', () => {
191
- // Add initial content
192
- service.addAndCheck(createContentEvent('First sentence.'));
193
- service.addAndCheck(createContentEvent('Second sentence.'));
194
- // Add small amounts of content (shouldn't trigger re-extraction)
195
- for (let i = 0; i < 10; i++) {
196
- service.addAndCheck(createContentEvent('X'));
196
+ it('should not detect a loop for a long code block with some repeating tokens', () => {
197
+ service.reset('');
198
+ const repeatingTokens = 'for (let i = 0; i < 10; i++) { console.log(i); }';
199
+ service.addAndCheck(createContentEvent('```\n'));
200
+ for (let i = 0; i < 20; i++) {
201
+ const isLoop = service.addAndCheck(createContentEvent(repeatingTokens));
202
+ expect(isLoop).toBe(false);
197
203
  }
198
- service.addAndCheck(createContentEvent('.'));
199
- // Should still work correctly
200
- expect(service.addAndCheck(createContentEvent('Test.'))).toBe(false);
201
- });
202
- it('should re-extract sentences when content grows by more than 100 characters', () => {
203
- service.addAndCheck(createContentEvent('Initial sentence.'));
204
- // Add enough content to trigger re-extraction
205
- const longContent = 'X'.repeat(101);
206
- service.addAndCheck(createContentEvent(longContent + '.'));
207
- // Should work correctly after re-extraction
208
- expect(service.addAndCheck(createContentEvent('Test.'))).toBe(false);
204
+ const isLoop = service.addAndCheck(createContentEvent('\n```'));
205
+ expect(isLoop).toBe(false);
206
+ expect(loggers.logLoopDetected).not.toHaveBeenCalled();
209
207
  });
210
- it('should use indexOf for efficient counting instead of regex', () => {
211
- const repeatedSentence = 'This is a repeated sentence.';
212
- // Build up content with the sentence repeated
208
+ it('should reset tracking when a code fence is found', () => {
209
+ service.reset('');
210
+ const repeatedContent = createRepetitiveContent(1, CONTENT_CHUNK_SIZE);
213
211
  for (let i = 0; i < CONTENT_LOOP_THRESHOLD - 1; i++) {
214
- service.addAndCheck(createContentEvent(repeatedSentence));
212
+ service.addAndCheck(createContentEvent(repeatedContent));
215
213
  }
216
- // The threshold should be reached
217
- expect(service.addAndCheck(createContentEvent(repeatedSentence))).toBe(true);
214
+ // This should not trigger a loop because of the reset
215
+ service.addAndCheck(createContentEvent('```'));
216
+ // We are now in a code block, so loop detection should be off.
217
+ // Let's add the repeated content again, it should not trigger a loop.
218
+ let isLoop = false;
219
+ for (let i = 0; i < CONTENT_LOOP_THRESHOLD; i++) {
220
+ isLoop = service.addAndCheck(createContentEvent(repeatedContent));
221
+ expect(isLoop).toBe(false);
222
+ }
223
+ expect(loggers.logLoopDetected).not.toHaveBeenCalled();
218
224
  });
219
225
  });
220
226
  describe('Edge Cases', () => {
@@ -1 +1 @@
1
- {"version":3,"file":"loopDetectionService.test.js","sourceRoot":"","sources":["../../../src/services/loopDetectionService.test.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAGzE,OAAO,EACL,eAAe,GAIhB,MAAM,iBAAiB,CAAC;AACzB,OAAO,KAAK,OAAO,MAAM,yBAAyB,CAAC;AACnD,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AACjD,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AAEjE,EAAE,CAAC,IAAI,CAAC,yBAAyB,EAAE,GAAG,EAAE,CAAC,CAAC;IACxC,eAAe,EAAE,EAAE,CAAC,EAAE,EAAE;CACzB,CAAC,CAAC,CAAC;AAEJ,MAAM,wBAAwB,GAAG,CAAC,CAAC;AACnC,MAAM,sBAAsB,GAAG,EAAE,CAAC;AAElC,QAAQ,CAAC,sBAAsB,EAAE,GAAG,EAAE;IACpC,IAAI,OAA6B,CAAC;IAClC,IAAI,UAAkB,CAAC;IAEvB,UAAU,CAAC,GAAG,EAAE;QACd,UAAU,GAAG;YACX,mBAAmB,EAAE,GAAG,EAAE,CAAC,IAAI;SACX,CAAC;QACvB,OAAO,GAAG,IAAI,oBAAoB,CAAC,UAAU,CAAC,CAAC;QAC/C,EAAE,CAAC,aAAa,EAAE,CAAC;IACrB,CAAC,CAAC,CAAC;IAEH,MAAM,0BAA0B,GAAG,CACjC,IAAY,EACZ,IAA6B,EACK,EAAE,CAAC,CAAC;QACtC,IAAI,EAAE,eAAe,CAAC,eAAe;QACrC,KAAK,EAAE;YACL,IAAI;YACJ,IAAI;YACJ,MAAM,EAAE,SAAS;YACjB,iBAAiB,EAAE,KAAK;YACxB,SAAS,EAAE,gBAAgB;SAC5B;KACF,CAAC,CAAC;IAEH,MAAM,kBAAkB,GAAG,CAAC,OAAe,EAA4B,EAAE,CAAC,CAAC;QACzE,IAAI,EAAE,eAAe,CAAC,OAAO;QAC7B,KAAK,EAAE,OAAO;KACf,CAAC,CAAC;IAEH,QAAQ,CAAC,0BAA0B,EAAE,GAAG,EAAE;QACxC,EAAE,CAAC,kFAAkF,EAAE,GAAG,EAAE;YAC1F,MAAM,KAAK,GAAG,0BAA0B,CAAC,UAAU,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC;YACzE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,wBAAwB,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;gBACtD,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACjD,CAAC;YACD,MAAM,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;QACzD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,wEAAwE,EAAE,GAAG,EAAE;YAChF,MAAM,KAAK,GAAG,0BAA0B,CAAC,UAAU,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC;YACzE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,wBAAwB,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;gBACtD,OAAO,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;YAC7B,CAAC;YACD,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC9C,MAAM,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;QAC3D,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,oDAAoD,EAAE,GAAG,EAAE;YAC5D,MAAM,KAAK,GAAG,0BAA0B,CAAC,UAAU,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC;YACzE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,wBAAwB,EAAE,CAAC,EAAE,EAAE,CAAC;gBAClD,OAAO,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;YAC7B,CAAC;YACD,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC9C,MAAM,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;QAC3D,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,mDAAmD,EAAE,GAAG,EAAE;YAC3D,MAAM,MAAM,GAAG,0BAA0B,CAAC,UAAU,EAAE;gBACpD,KAAK,EAAE,QAAQ;aAChB,CAAC,CAAC;YACH,MAAM,MAAM,GAAG,0BAA0B,CAAC,UAAU,EAAE;gBACpD,KAAK,EAAE,QAAQ;aAChB,CAAC,CAAC;YACH,MAAM,MAAM,GAAG,0BAA0B,CAAC,aAAa,EAAE;gBACvD,KAAK,EAAE,QAAQ;aAChB,CAAC,CAAC;YAEH,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,wBAAwB,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;gBACtD,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBAChD,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBAChD,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAClD,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,0DAA0D,EAAE,GAAG,EAAE;YAClE,MAAM,aAAa,GAAG,0BAA0B,CAAC,UAAU,EAAE;gBAC3D,KAAK,EAAE,OAAO;aACf,CAAC,CAAC;YACH,MAAM,UAAU,GAAG;gBACjB,IAAI,EAAE,SAAS;aACsB,CAAC;YAExC,uCAAuC;YACvC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,wBAAwB,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;gBACtD,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACzD,CAAC;YAED,8BAA8B;YAC9B,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAEpD,oEAAoE;YACpE,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACtD,MAAM,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;QAC3D,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,wBAAwB,EAAE,GAAG,EAAE;QACtC,EAAE,CAAC,0FAA0F,EAAE,GAAG,EAAE;YAClG,MAAM,KAAK,GAAG,kBAAkB,CAAC,0BAA0B,CAAC,CAAC;YAC7D,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,sBAAsB,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;gBACpD,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACjD,CAAC;YACD,MAAM,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;QACzD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,gFAAgF,EAAE,GAAG,EAAE;YACxF,MAAM,KAAK,GAAG,kBAAkB,CAAC,0BAA0B,CAAC,CAAC;YAC7D,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,sBAAsB,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;gBACpD,OAAO,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;YAC7B,CAAC;YACD,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC9C,MAAM,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;QAC3D,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,wDAAwD,EAAE,GAAG,EAAE;YAChE,MAAM,MAAM,GAAG,kBAAkB,CAAC,YAAY,CAAC,CAAC;YAChD,MAAM,MAAM,GAAG,kBAAkB,CAAC,YAAY,CAAC,CAAC;YAChD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,sBAAsB,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;gBACpD,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBAChD,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAClD,CAAC;YACD,MAAM,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;QACzD,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,qCAAqC,EAAE,GAAG,EAAE;QACnD,EAAE,CAAC,4EAA4E,EAAE,GAAG,EAAE;YACpF,MAAM,YAAY,GAAG,kBAAkB,CAAC,yBAAyB,CAAC,CAAC;YACnE,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAEtD,MAAM,cAAc,GAAG,kBAAkB,CAAC,uBAAuB,CAAC,CAAC;YACnE,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC1D,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,qEAAqE,EAAE,GAAG,EAAE;YAC7E,sGAAsG;YACtG,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,sBAAsB,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;gBACpD,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,kBAAkB,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,IAAI,CACnE,KAAK,CACN,CAAC;YACJ,CAAC;YAED,OAAO,CAAC,KAAK,EAAE,CAAC;YAChB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,sBAAsB,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;gBACpD,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,kBAAkB,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,IAAI,CAClE,KAAK,CACN,CAAC;YACJ,CAAC;YAED,OAAO,CAAC,KAAK,EAAE,CAAC;YAChB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,sBAAsB,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;gBACpD,MAAM,CACJ,OAAO,CAAC,WAAW,CAAC,kBAAkB,CAAC,oBAAoB,CAAC,CAAC,CAC9D,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAChB,CAAC;YAED,OAAO,CAAC,KAAK,EAAE,CAAC;YAChB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,sBAAsB,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;gBACpD,MAAM,CACJ,OAAO,CAAC,WAAW,CACjB,kBAAkB,CAAC,iCAAiC,CAAC,CACtD,CACF,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAChB,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,8EAA8E,EAAE,GAAG,EAAE;YACtF,4FAA4F;YAC5F,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,sBAAsB,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;gBACpD,MAAM,CACJ,OAAO,CAAC,WAAW,CAAC,kBAAkB,CAAC,qBAAqB,CAAC,CAAC,CAC/D,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAChB,CAAC;YACD,MAAM,CACJ,OAAO,CAAC,WAAW,CAAC,kBAAkB,CAAC,qBAAqB,CAAC,CAAC,CAC/D,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAEb,OAAO,CAAC,KAAK,EAAE,CAAC;YAChB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,sBAAsB,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;gBACpD,MAAM,CACJ,OAAO,CAAC,WAAW,CAAC,kBAAkB,CAAC,sBAAsB,CAAC,CAAC,CAChE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAChB,CAAC;YACD,MAAM,CACJ,OAAO,CAAC,WAAW,CAAC,kBAAkB,CAAC,sBAAsB,CAAC,CAAC,CAChE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAEb,OAAO,CAAC,KAAK,EAAE,CAAC;YAChB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,sBAAsB,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;gBACpD,MAAM,CACJ,OAAO,CAAC,WAAW,CAAC,kBAAkB,CAAC,oBAAoB,CAAC,CAAC,CAC9D,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAChB,CAAC;YACD,MAAM,CACJ,OAAO,CAAC,WAAW,CAAC,kBAAkB,CAAC,oBAAoB,CAAC,CAAC,CAC9D,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACf,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,8CAA8C,EAAE,GAAG,EAAE;YACtD,OAAO,CAAC,WAAW,CAAC,kBAAkB,CAAC,WAAW,CAAC,CAAC,CAAC;YACrD,OAAO,CAAC,WAAW,CAAC,kBAAkB,CAAC,cAAc,CAAC,CAAC,CAAC;YACxD,OAAO,CAAC,WAAW,CAAC,kBAAkB,CAAC,SAAS,CAAC,CAAC,CAAC;YAEnD,oCAAoC;YACpC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,sBAAsB,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;gBACpD,OAAO,CAAC,WAAW,CAAC,kBAAkB,CAAC,SAAS,CAAC,CAAC,CAAC;YACrD,CAAC;YACD,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,kBAAkB,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACxE,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,8CAA8C,EAAE,GAAG,EAAE;YACtD,OAAO,CAAC,WAAW,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC,CAAC;YAChD,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,kBAAkB,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC,IAAI,CACtE,KAAK,CACN,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,0DAA0D,EAAE,GAAG,EAAE;YAClE,MAAM,KAAK,GAAG,kBAAkB,CAAC,oBAAoB,CAAC,CAAC;YACvD,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAE/C,sEAAsE;YACtE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC3B,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACjD,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,2BAA2B,EAAE,GAAG,EAAE;QACzC,EAAE,CAAC,uFAAuF,EAAE,GAAG,EAAE;YAC/F,sBAAsB;YACtB,OAAO,CAAC,WAAW,CAAC,kBAAkB,CAAC,iBAAiB,CAAC,CAAC,CAAC;YAC3D,OAAO,CAAC,WAAW,CAAC,kBAAkB,CAAC,kBAAkB,CAAC,CAAC,CAAC;YAE5D,iEAAiE;YACjE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC5B,OAAO,CAAC,WAAW,CAAC,kBAAkB,CAAC,GAAG,CAAC,CAAC,CAAC;YAC/C,CAAC;YACD,OAAO,CAAC,WAAW,CAAC,kBAAkB,CAAC,GAAG,CAAC,CAAC,CAAC;YAE7C,8BAA8B;YAC9B,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACvE,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,4EAA4E,EAAE,GAAG,EAAE;YACpF,OAAO,CAAC,WAAW,CAAC,kBAAkB,CAAC,mBAAmB,CAAC,CAAC,CAAC;YAE7D,8CAA8C;YAC9C,MAAM,WAAW,GAAG,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YACpC,OAAO,CAAC,WAAW,CAAC,kBAAkB,CAAC,WAAW,GAAG,GAAG,CAAC,CAAC,CAAC;YAE3D,4CAA4C;YAC5C,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACvE,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,4DAA4D,EAAE,GAAG,EAAE;YACpE,MAAM,gBAAgB,GAAG,8BAA8B,CAAC;YAExD,8CAA8C;YAC9C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,sBAAsB,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;gBACpD,OAAO,CAAC,WAAW,CAAC,kBAAkB,CAAC,gBAAgB,CAAC,CAAC,CAAC;YAC5D,CAAC;YAED,kCAAkC;YAClC,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,kBAAkB,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,IAAI,CACpE,IAAI,CACL,CAAC;QACJ,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,YAAY,EAAE,GAAG,EAAE;QAC1B,EAAE,CAAC,6BAA6B,EAAE,GAAG,EAAE;YACrC,MAAM,KAAK,GAAG,kBAAkB,CAAC,EAAE,CAAC,CAAC;YACrC,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACjD,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,qBAAqB,EAAE,GAAG,EAAE;QACnC,EAAE,CAAC,sCAAsC,EAAE,GAAG,EAAE;YAC9C,MAAM,YAAY,GAAG,kBAAkB,CAAC,eAAe,CAAC,CAAC;YACzD,MAAM,SAAS,GAAG,0BAA0B,CAAC,UAAU,EAAE;gBACvD,KAAK,EAAE,OAAO;aACf,CAAC,CAAC;YACH,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC3B,OAAO,CAAC,WAAW,CAAC,YAAY,CAAC,CAAC;YACpC,CAAC;YAED,OAAO,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC;YAE/B,qBAAqB;YACrB,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,kBAAkB,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,IAAI,CACpE,KAAK,CACN,CAAC;QACJ,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,kBAAkB,EAAE,GAAG,EAAE;QAChC,EAAE,CAAC,+CAA+C,EAAE,GAAG,EAAE;YACvD,MAAM,UAAU,GAAG;gBACjB,IAAI,EAAE,iBAAiB;aACc,CAAC;YACxC,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACpD,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACtD,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,iCAAiC,EAAE,GAAG,EAAE;IAC/C,IAAI,OAA6B,CAAC;IAClC,IAAI,UAAkB,CAAC;IACvB,IAAI,gBAA8B,CAAC;IACnC,IAAI,eAAgC,CAAC;IAErC,UAAU,CAAC,GAAG,EAAE;QACd,gBAAgB,GAAG;YACjB,UAAU,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,eAAe,CAAC,EAAE,CAAC;YACvC,YAAY,EAAE,EAAE,CAAC,EAAE,EAAE;SACK,CAAC;QAE7B,UAAU,GAAG;YACX,eAAe,EAAE,GAAG,EAAE,CAAC,gBAAgB;YACvC,YAAY,EAAE,GAAG,EAAE,CAAC,KAAK;YACzB,mBAAmB,EAAE,GAAG,EAAE,CAAC,IAAI;SACX,CAAC;QAEvB,OAAO,GAAG,IAAI,oBAAoB,CAAC,UAAU,CAAC,CAAC;QAC/C,eAAe,GAAG,IAAI,eAAe,EAAE,CAAC;QACxC,EAAE,CAAC,aAAa,EAAE,CAAC;IACrB,CAAC,CAAC,CAAC;IAEH,SAAS,CAAC,GAAG,EAAE;QACb,EAAE,CAAC,eAAe,EAAE,CAAC;IACvB,CAAC,CAAC,CAAC;IAEH,MAAM,YAAY,GAAG,KAAK,EAAE,KAAa,EAAE,EAAE;QAC3C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC;YAC/B,MAAM,OAAO,CAAC,WAAW,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC;QACpD,CAAC;IACH,CAAC,CAAC;IAEF,EAAE,CAAC,2DAA2D,EAAE,KAAK,IAAI,EAAE;QACzE,MAAM,YAAY,CAAC,EAAE,CAAC,CAAC;QACvB,MAAM,CAAC,gBAAgB,CAAC,YAAY,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;IAC/D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2CAA2C,EAAE,KAAK,IAAI,EAAE;QACzD,gBAAgB,CAAC,YAAY,GAAG,EAAE;aAC/B,EAAE,EAAE;aACJ,iBAAiB,CAAC,EAAE,UAAU,EAAE,GAAG,EAAE,CAAC,CAAC;QAC1C,MAAM,YAAY,CAAC,EAAE,CAAC,CAAC;QACvB,MAAM,CAAC,gBAAgB,CAAC,YAAY,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;IACjE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wDAAwD,EAAE,KAAK,IAAI,EAAE;QACtE,yBAAyB;QACzB,gBAAgB,CAAC,YAAY,GAAG,EAAE;aAC/B,EAAE,EAAE;aACJ,iBAAiB,CAAC,EAAE,UAAU,EAAE,IAAI,EAAE,SAAS,EAAE,oBAAoB,EAAE,CAAC,CAAC;QAC5E,MAAM,YAAY,CAAC,EAAE,CAAC,CAAC;QACvB,MAAM,CAAC,gBAAgB,CAAC,YAAY,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;QAE/D,wDAAwD;QACxD,wFAAwF;QACxF,MAAM,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,qBAAqB;QAE5C,gBAAgB,CAAC,YAAY,GAAG,EAAE;aAC/B,EAAE,EAAE;aACJ,iBAAiB,CAAC,EAAE,UAAU,EAAE,IAAI,EAAE,SAAS,EAAE,oBAAoB,EAAE,CAAC,CAAC;QAC5E,MAAM,WAAW,GAAG,MAAM,OAAO,CAAC,WAAW,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC,kBAAkB;QAEzF,MAAM,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC/B,MAAM,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC,oBAAoB,CAClD,UAAU,EACV,MAAM,CAAC,gBAAgB,CAAC;YACtB,YAAY,EAAE,eAAe;YAC7B,SAAS,EAAE,QAAQ,CAAC,iBAAiB;SACtC,CAAC,CACH,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iDAAiD,EAAE,KAAK,IAAI,EAAE;QAC/D,gBAAgB,CAAC,YAAY,GAAG,EAAE;aAC/B,EAAE,EAAE;aACJ,iBAAiB,CAAC,EAAE,UAAU,EAAE,GAAG,EAAE,SAAS,EAAE,YAAY,EAAE,CAAC,CAAC;QACnE,MAAM,YAAY,CAAC,EAAE,CAAC,CAAC;QACvB,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,WAAW,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC;QACjE,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC3B,MAAM,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;IACzD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sDAAsD,EAAE,KAAK,IAAI,EAAE;QACpE,uEAAuE;QACvE,gBAAgB,CAAC,YAAY,GAAG,EAAE;aAC/B,EAAE,EAAE;aACJ,iBAAiB,CAAC,EAAE,UAAU,EAAE,GAAG,EAAE,CAAC,CAAC;QAC1C,MAAM,YAAY,CAAC,EAAE,CAAC,CAAC,CAAC,yBAAyB;QACjD,MAAM,CAAC,gBAAgB,CAAC,YAAY,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;QAE/D,MAAM,YAAY,CAAC,EAAE,CAAC,CAAC,CAAC,qBAAqB;QAC7C,MAAM,CAAC,gBAAgB,CAAC,YAAY,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;QAE/D,MAAM,OAAO,CAAC,WAAW,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC,UAAU;QAC7D,MAAM,CAAC,gBAAgB,CAAC,YAAY,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;IACjE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mDAAmD,EAAE,KAAK,IAAI,EAAE;QACjE,gBAAgB,CAAC,YAAY,GAAG,EAAE;aAC/B,EAAE,EAAE;aACJ,iBAAiB,CAAC,IAAI,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC;QAC7C,MAAM,YAAY,CAAC,EAAE,CAAC,CAAC;QACvB,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,WAAW,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC;QACjE,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC3B,MAAM,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;IACzD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"loopDetectionService.test.js","sourceRoot":"","sources":["../../../src/services/loopDetectionService.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,70 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ /** A structured result from a shell command execution. */
7
+ export interface ShellExecutionResult {
8
+ /** The raw, unprocessed output buffer. */
9
+ rawOutput: Buffer;
10
+ /** The combined, decoded stdout and stderr as a string. */
11
+ output: string;
12
+ /** The decoded stdout as a string. */
13
+ stdout: string;
14
+ /** The decoded stderr as a string. */
15
+ stderr: string;
16
+ /** The process exit code, or null if terminated by a signal. */
17
+ exitCode: number | null;
18
+ /** The signal that terminated the process, if any. */
19
+ signal: NodeJS.Signals | null;
20
+ /** An error object if the process failed to spawn. */
21
+ error: Error | null;
22
+ /** A boolean indicating if the command was aborted by the user. */
23
+ aborted: boolean;
24
+ /** The process ID of the spawned shell. */
25
+ pid: number | undefined;
26
+ }
27
+ /** A handle for an ongoing shell execution. */
28
+ export interface ShellExecutionHandle {
29
+ /** The process ID of the spawned shell. */
30
+ pid: number | undefined;
31
+ /** A promise that resolves with the complete execution result. */
32
+ result: Promise<ShellExecutionResult>;
33
+ }
34
+ /**
35
+ * Describes a structured event emitted during shell command execution.
36
+ */
37
+ export type ShellOutputEvent = {
38
+ /** The event contains a chunk of output data. */
39
+ type: 'data';
40
+ /** The stream from which the data originated. */
41
+ stream: 'stdout' | 'stderr';
42
+ /** The decoded string chunk. */
43
+ chunk: string;
44
+ } | {
45
+ /** Signals that the output stream has been identified as binary. */
46
+ type: 'binary_detected';
47
+ } | {
48
+ /** Provides progress updates for a binary stream. */
49
+ type: 'binary_progress';
50
+ /** The total number of bytes received so far. */
51
+ bytesReceived: number;
52
+ };
53
+ /**
54
+ * A centralized service for executing shell commands with robust process
55
+ * management, cross-platform compatibility, and streaming output capabilities.
56
+ *
57
+ */
58
+ export declare class ShellExecutionService {
59
+ /**
60
+ * Executes a shell command using `spawn`, capturing all output and lifecycle events.
61
+ *
62
+ * @param commandToExecute The exact command string to run.
63
+ * @param cwd The working directory to execute the command in.
64
+ * @param onOutputEvent A callback for streaming structured events about the execution, including data chunks and status updates.
65
+ * @param abortSignal An AbortSignal to terminate the process and its children.
66
+ * @returns An object containing the process ID (pid) and a promise that
67
+ * resolves with the complete execution result.
68
+ */
69
+ static execute(commandToExecute: string, cwd: string, onOutputEvent: (event: ShellOutputEvent) => void, abortSignal: AbortSignal): ShellExecutionHandle;
70
+ }
@@ -0,0 +1,155 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import { spawn } from 'child_process';
7
+ import { TextDecoder } from 'util';
8
+ import os from 'os';
9
+ import stripAnsi from 'strip-ansi';
10
+ import { getCachedEncodingForBuffer } from '../utils/systemEncoding.js';
11
+ import { isBinary } from '../utils/textUtils.js';
12
+ const SIGKILL_TIMEOUT_MS = 200;
13
+ /**
14
+ * A centralized service for executing shell commands with robust process
15
+ * management, cross-platform compatibility, and streaming output capabilities.
16
+ *
17
+ */
18
+ export class ShellExecutionService {
19
+ /**
20
+ * Executes a shell command using `spawn`, capturing all output and lifecycle events.
21
+ *
22
+ * @param commandToExecute The exact command string to run.
23
+ * @param cwd The working directory to execute the command in.
24
+ * @param onOutputEvent A callback for streaming structured events about the execution, including data chunks and status updates.
25
+ * @param abortSignal An AbortSignal to terminate the process and its children.
26
+ * @returns An object containing the process ID (pid) and a promise that
27
+ * resolves with the complete execution result.
28
+ */
29
+ static execute(commandToExecute, cwd, onOutputEvent, abortSignal) {
30
+ const isWindows = os.platform() === 'win32';
31
+ const child = spawn(commandToExecute, [], {
32
+ cwd,
33
+ stdio: ['ignore', 'pipe', 'pipe'],
34
+ // Use bash unless in Windows (since it doesn't support bash).
35
+ // For windows, just use the default.
36
+ shell: isWindows ? true : 'bash',
37
+ // Use process groups on non-Windows for robust killing.
38
+ // Windows process termination is handled by `taskkill /t`.
39
+ detached: !isWindows,
40
+ env: {
41
+ ...process.env,
42
+ GEMINI_CLI: '1',
43
+ },
44
+ });
45
+ const result = new Promise((resolve) => {
46
+ // Use decoders to handle multi-byte characters safely (for streaming output).
47
+ let stdoutDecoder = null;
48
+ let stderrDecoder = null;
49
+ let stdout = '';
50
+ let stderr = '';
51
+ const outputChunks = [];
52
+ let error = null;
53
+ let exited = false;
54
+ let isStreamingRawContent = true;
55
+ const MAX_SNIFF_SIZE = 4096;
56
+ let sniffedBytes = 0;
57
+ const handleOutput = (data, stream) => {
58
+ if (!stdoutDecoder || !stderrDecoder) {
59
+ const encoding = getCachedEncodingForBuffer(data);
60
+ try {
61
+ stdoutDecoder = new TextDecoder(encoding);
62
+ stderrDecoder = new TextDecoder(encoding);
63
+ }
64
+ catch {
65
+ // If the encoding is not supported, fall back to utf-8.
66
+ // This can happen on some platforms for certain encodings like 'utf-32le'.
67
+ stdoutDecoder = new TextDecoder('utf-8');
68
+ stderrDecoder = new TextDecoder('utf-8');
69
+ }
70
+ }
71
+ outputChunks.push(data);
72
+ // Binary detection logic. This only runs until we've made a determination.
73
+ if (isStreamingRawContent && sniffedBytes < MAX_SNIFF_SIZE) {
74
+ const sniffBuffer = Buffer.concat(outputChunks.slice(0, 20));
75
+ sniffedBytes = sniffBuffer.length;
76
+ if (isBinary(sniffBuffer)) {
77
+ // Change state to stop streaming raw content.
78
+ isStreamingRawContent = false;
79
+ onOutputEvent({ type: 'binary_detected' });
80
+ }
81
+ }
82
+ const decodedChunk = stream === 'stdout'
83
+ ? stdoutDecoder.decode(data, { stream: true })
84
+ : stderrDecoder.decode(data, { stream: true });
85
+ const strippedChunk = stripAnsi(decodedChunk);
86
+ if (stream === 'stdout') {
87
+ stdout += strippedChunk;
88
+ }
89
+ else {
90
+ stderr += strippedChunk;
91
+ }
92
+ if (isStreamingRawContent) {
93
+ onOutputEvent({ type: 'data', stream, chunk: strippedChunk });
94
+ }
95
+ else {
96
+ const totalBytes = outputChunks.reduce((sum, chunk) => sum + chunk.length, 0);
97
+ onOutputEvent({ type: 'binary_progress', bytesReceived: totalBytes });
98
+ }
99
+ };
100
+ child.stdout.on('data', (data) => handleOutput(data, 'stdout'));
101
+ child.stderr.on('data', (data) => handleOutput(data, 'stderr'));
102
+ child.on('error', (err) => {
103
+ error = err;
104
+ });
105
+ const abortHandler = async () => {
106
+ if (child.pid && !exited) {
107
+ if (isWindows) {
108
+ spawn('taskkill', ['/pid', child.pid.toString(), '/f', '/t']);
109
+ }
110
+ else {
111
+ try {
112
+ // Kill the entire process group (negative PID).
113
+ // SIGTERM first, then SIGKILL if it doesn't die.
114
+ process.kill(-child.pid, 'SIGTERM');
115
+ await new Promise((res) => setTimeout(res, SIGKILL_TIMEOUT_MS));
116
+ if (!exited) {
117
+ process.kill(-child.pid, 'SIGKILL');
118
+ }
119
+ }
120
+ catch (_e) {
121
+ // Fall back to killing just the main process if group kill fails.
122
+ if (!exited)
123
+ child.kill('SIGKILL');
124
+ }
125
+ }
126
+ }
127
+ };
128
+ abortSignal.addEventListener('abort', abortHandler, { once: true });
129
+ child.on('exit', (code, signal) => {
130
+ exited = true;
131
+ abortSignal.removeEventListener('abort', abortHandler);
132
+ if (stdoutDecoder) {
133
+ stdout += stripAnsi(stdoutDecoder.decode());
134
+ }
135
+ if (stderrDecoder) {
136
+ stderr += stripAnsi(stderrDecoder.decode());
137
+ }
138
+ const finalBuffer = Buffer.concat(outputChunks);
139
+ resolve({
140
+ rawOutput: finalBuffer,
141
+ output: stdout + (stderr ? `\n${stderr}` : ''),
142
+ stdout,
143
+ stderr,
144
+ exitCode: code,
145
+ signal,
146
+ error,
147
+ aborted: abortSignal.aborted,
148
+ pid: child.pid,
149
+ });
150
+ });
151
+ });
152
+ return { pid: child.pid, result };
153
+ }
154
+ }
155
+ //# sourceMappingURL=shellExecutionService.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shellExecutionService.js","sourceRoot":"","sources":["../../../src/services/shellExecutionService.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 {};