@vybestack/llxprt-code-core 0.1.14 → 0.1.16

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 (463) hide show
  1. package/README.md +90 -2
  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.test.d.ts +1 -1
  8. package/dist/src/code_assist/oauth2.test.js +15 -15
  9. package/dist/src/code_assist/oauth2.test.js.map +1 -1
  10. package/dist/src/code_assist/server.d.ts +2 -2
  11. package/dist/src/code_assist/server.js +4 -4
  12. package/dist/src/code_assist/server.js.map +1 -1
  13. package/dist/src/code_assist/server.test.js +9 -9
  14. package/dist/src/code_assist/server.test.js.map +1 -1
  15. package/dist/src/code_assist/setup.js +1 -1
  16. package/dist/src/code_assist/setup.js.map +1 -1
  17. package/dist/src/code_assist/setup.test.js +2 -2
  18. package/dist/src/code_assist/setup.test.js.map +1 -1
  19. package/dist/src/config/config.d.ts +37 -5
  20. package/dist/src/config/config.js +85 -15
  21. package/dist/src/config/config.js.map +1 -1
  22. package/dist/src/config/config.test.js +33 -0
  23. package/dist/src/config/config.test.js.map +1 -1
  24. package/dist/src/config/flashFallback.test.js +23 -47
  25. package/dist/src/config/flashFallback.test.js.map +1 -1
  26. package/dist/src/config/models.d.ts +1 -0
  27. package/dist/src/config/models.js +1 -0
  28. package/dist/src/config/models.js.map +1 -1
  29. package/dist/src/config/profileManager.d.ts +42 -0
  30. package/dist/src/config/profileManager.js +114 -0
  31. package/dist/src/config/profileManager.js.map +1 -0
  32. package/dist/src/core/client.d.ts +15 -1
  33. package/dist/src/core/client.js +161 -45
  34. package/dist/src/core/client.js.map +1 -1
  35. package/dist/src/core/client.test.js +291 -42
  36. package/dist/src/core/client.test.js.map +1 -1
  37. package/dist/src/core/contentGenerator.d.ts +2 -2
  38. package/dist/src/core/contentGenerator.js +2 -7
  39. package/dist/src/core/contentGenerator.js.map +1 -1
  40. package/dist/src/core/contentGenerator.test.js +6 -2
  41. package/dist/src/core/contentGenerator.test.js.map +1 -1
  42. package/dist/src/core/coreToolScheduler.d.ts +1 -3
  43. package/dist/src/core/coreToolScheduler.js +48 -19
  44. package/dist/src/core/coreToolScheduler.js.map +1 -1
  45. package/dist/src/core/coreToolScheduler.test.js +90 -18
  46. package/dist/src/core/coreToolScheduler.test.js.map +1 -1
  47. package/dist/src/core/geminiChat.js +35 -2
  48. package/dist/src/core/geminiChat.js.map +1 -1
  49. package/dist/src/core/geminiChat.test.js +2 -2
  50. package/dist/src/core/geminiChat.test.js.map +1 -1
  51. package/dist/src/core/googleGenAIWrapper.d.ts +21 -0
  52. package/dist/src/core/googleGenAIWrapper.js +36 -0
  53. package/dist/src/core/googleGenAIWrapper.js.map +1 -0
  54. package/dist/src/core/googleGenAIWrapper.test.d.ts +6 -0
  55. package/dist/src/core/googleGenAIWrapper.test.js +104 -0
  56. package/dist/src/core/googleGenAIWrapper.test.js.map +1 -0
  57. package/dist/src/core/logger.d.ts +1 -0
  58. package/dist/src/core/logger.js +22 -8
  59. package/dist/src/core/logger.js.map +1 -1
  60. package/dist/src/core/logger.test.js +60 -9
  61. package/dist/src/core/logger.test.js.map +1 -1
  62. package/dist/src/core/nonInteractiveToolExecutor.js +19 -4
  63. package/dist/src/core/nonInteractiveToolExecutor.js.map +1 -1
  64. package/dist/src/core/nonInteractiveToolExecutor.test.js +8 -3
  65. package/dist/src/core/nonInteractiveToolExecutor.test.js.map +1 -1
  66. package/dist/src/core/prompts-async.test.d.ts +6 -0
  67. package/dist/src/core/prompts-async.test.js +115 -0
  68. package/dist/src/core/prompts-async.test.js.map +1 -0
  69. package/dist/src/core/prompts.d.ts +8 -1
  70. package/dist/src/core/prompts.js +97 -377
  71. package/dist/src/core/prompts.js.map +1 -1
  72. package/dist/src/core/prompts.test.js +46 -192
  73. package/dist/src/core/prompts.test.js.map +1 -1
  74. package/dist/src/core/tokenLimits.d.ts +1 -1
  75. package/dist/src/core/tokenLimits.js +6 -1
  76. package/dist/src/core/tokenLimits.js.map +1 -1
  77. package/dist/src/core/turn.d.ts +5 -1
  78. package/dist/src/core/turn.js +7 -2
  79. package/dist/src/core/turn.js.map +1 -1
  80. package/dist/src/core/turn.test.js +2 -2
  81. package/dist/src/core/turn.test.js.map +1 -1
  82. package/dist/src/ide/detect-ide.d.ts +10 -0
  83. package/dist/src/ide/detect-ide.js +24 -0
  84. package/dist/src/ide/detect-ide.js.map +1 -0
  85. package/dist/src/ide/ide-client.d.ts +19 -7
  86. package/dist/src/ide/ide-client.js +110 -37
  87. package/dist/src/ide/ide-client.js.map +1 -1
  88. package/dist/src/ide/ide-installer.d.ts +15 -0
  89. package/dist/src/ide/ide-installer.js +111 -0
  90. package/dist/src/ide/ide-installer.js.map +1 -0
  91. package/dist/src/ide/ide-installer.test.d.ts +6 -0
  92. package/dist/src/ide/ide-installer.test.js +78 -0
  93. package/dist/src/ide/ide-installer.test.js.map +1 -0
  94. package/dist/src/ide/ideContext.d.ts +212 -107
  95. package/dist/src/ide/ideContext.js +45 -44
  96. package/dist/src/ide/ideContext.js.map +1 -1
  97. package/dist/src/ide/ideContext.test.js +254 -100
  98. package/dist/src/ide/ideContext.test.js.map +1 -1
  99. package/dist/src/index.d.ts +16 -0
  100. package/dist/src/index.js +20 -0
  101. package/dist/src/index.js.map +1 -1
  102. package/dist/src/{providers/IProviderConfig.js → integration-tests/todo-system.test.d.ts} +0 -1
  103. package/dist/src/integration-tests/todo-system.test.js +610 -0
  104. package/dist/src/integration-tests/todo-system.test.js.map +1 -0
  105. package/dist/src/mcp/oauth-provider.d.ts +5 -1
  106. package/dist/src/mcp/oauth-provider.js +39 -14
  107. package/dist/src/mcp/oauth-provider.js.map +1 -1
  108. package/dist/src/mcp/oauth-provider.test.js +11 -10
  109. package/dist/src/mcp/oauth-provider.test.js.map +1 -1
  110. package/dist/src/mcp/oauth-token-storage.d.ts +3 -1
  111. package/dist/src/mcp/oauth-token-storage.js +3 -1
  112. package/dist/src/mcp/oauth-token-storage.js.map +1 -1
  113. package/dist/src/mcp/oauth-utils.js +2 -2
  114. package/dist/src/mcp/oauth-utils.js.map +1 -1
  115. package/dist/src/mcp/oauth-utils.test.js +1 -1
  116. package/dist/src/mcp/oauth-utils.test.js.map +1 -1
  117. package/dist/src/parsers/TextToolCallParser.d.ts +1 -0
  118. package/dist/src/parsers/TextToolCallParser.js +45 -3
  119. package/dist/src/parsers/TextToolCallParser.js.map +1 -1
  120. package/dist/src/parsers/TextToolCallParser.multibyte.test.d.ts +1 -0
  121. package/dist/src/parsers/TextToolCallParser.multibyte.test.js +42 -0
  122. package/dist/src/parsers/TextToolCallParser.multibyte.test.js.map +1 -0
  123. package/dist/src/prompt-config/TemplateEngine.d.ts +35 -0
  124. package/dist/src/prompt-config/TemplateEngine.js +149 -0
  125. package/dist/src/prompt-config/TemplateEngine.js.map +1 -0
  126. package/dist/src/prompt-config/TemplateEngine.test.d.ts +1 -0
  127. package/dist/src/prompt-config/TemplateEngine.test.js +494 -0
  128. package/dist/src/prompt-config/TemplateEngine.test.js.map +1 -0
  129. package/dist/src/prompt-config/defaults/compression.md +58 -0
  130. package/dist/src/prompt-config/defaults/core-defaults.d.ts +5 -0
  131. package/dist/src/prompt-config/defaults/core-defaults.js +332 -0
  132. package/dist/src/prompt-config/defaults/core-defaults.js.map +1 -0
  133. package/dist/src/prompt-config/defaults/core.md +267 -0
  134. package/dist/src/prompt-config/defaults/env/git-repository.md +15 -0
  135. package/dist/src/prompt-config/defaults/env/ide-mode.md +3 -0
  136. package/dist/src/prompt-config/defaults/env/macos-seatbelt.md +3 -0
  137. package/dist/src/prompt-config/defaults/env/outside-of-sandbox.md +3 -0
  138. package/dist/src/prompt-config/defaults/env/sandbox.md +3 -0
  139. package/dist/src/prompt-config/defaults/index.d.ts +14 -0
  140. package/dist/src/prompt-config/defaults/index.js +21 -0
  141. package/dist/src/prompt-config/defaults/index.js.map +1 -0
  142. package/dist/src/prompt-config/defaults/provider-defaults.d.ts +5 -0
  143. package/dist/src/prompt-config/defaults/provider-defaults.js +26 -0
  144. package/dist/src/prompt-config/defaults/provider-defaults.js.map +1 -0
  145. package/dist/src/prompt-config/defaults/providers/gemini/models/gemini-2.5-flash/core.md +10 -0
  146. package/dist/src/prompt-config/defaults/service-defaults.d.ts +5 -0
  147. package/dist/src/prompt-config/defaults/service-defaults.js +52 -0
  148. package/dist/src/prompt-config/defaults/service-defaults.js.map +1 -0
  149. package/dist/src/prompt-config/defaults/tool-defaults.d.ts +5 -0
  150. package/dist/src/prompt-config/defaults/tool-defaults.js +81 -0
  151. package/dist/src/prompt-config/defaults/tool-defaults.js.map +1 -0
  152. package/dist/src/prompt-config/defaults/tools/edit.md +2 -0
  153. package/dist/src/prompt-config/defaults/tools/glob.md +2 -0
  154. package/dist/src/prompt-config/defaults/tools/grep.md +2 -0
  155. package/dist/src/prompt-config/defaults/tools/ls.md +1 -0
  156. package/dist/src/prompt-config/defaults/tools/memory.md +1 -0
  157. package/dist/src/prompt-config/defaults/tools/read-file.md +4 -0
  158. package/dist/src/prompt-config/defaults/tools/read-many-files.md +2 -0
  159. package/dist/src/prompt-config/defaults/tools/shell.md +5 -0
  160. package/dist/src/prompt-config/defaults/tools/todo-read.md +3 -0
  161. package/dist/src/prompt-config/defaults/tools/todo-write.md +50 -0
  162. package/dist/src/prompt-config/defaults/tools/web-fetch.md +3 -0
  163. package/dist/src/prompt-config/defaults/tools/web-search.md +3 -0
  164. package/dist/src/prompt-config/defaults/tools/write-file.md +4 -0
  165. package/dist/src/prompt-config/index.d.ts +16 -0
  166. package/dist/src/prompt-config/index.js +11 -0
  167. package/dist/src/prompt-config/index.js.map +1 -0
  168. package/dist/src/prompt-config/prompt-cache.d.ts +72 -0
  169. package/dist/src/prompt-config/prompt-cache.js +271 -0
  170. package/dist/src/prompt-config/prompt-cache.js.map +1 -0
  171. package/dist/src/prompt-config/prompt-cache.test.d.ts +6 -0
  172. package/dist/src/prompt-config/prompt-cache.test.js +437 -0
  173. package/dist/src/prompt-config/prompt-cache.test.js.map +1 -0
  174. package/dist/src/prompt-config/prompt-installer.d.ts +118 -0
  175. package/dist/src/prompt-config/prompt-installer.js +723 -0
  176. package/dist/src/prompt-config/prompt-installer.js.map +1 -0
  177. package/dist/src/prompt-config/prompt-installer.test.d.ts +7 -0
  178. package/dist/src/prompt-config/prompt-installer.test.js +503 -0
  179. package/dist/src/prompt-config/prompt-installer.test.js.map +1 -0
  180. package/dist/src/prompt-config/prompt-loader.d.ts +49 -0
  181. package/dist/src/prompt-config/prompt-loader.js +331 -0
  182. package/dist/src/prompt-config/prompt-loader.js.map +1 -0
  183. package/dist/src/prompt-config/prompt-loader.test.d.ts +5 -0
  184. package/dist/src/prompt-config/prompt-loader.test.js +413 -0
  185. package/dist/src/prompt-config/prompt-loader.test.js.map +1 -0
  186. package/dist/src/prompt-config/prompt-resolver.d.ts +74 -0
  187. package/dist/src/prompt-config/prompt-resolver.js +600 -0
  188. package/dist/src/prompt-config/prompt-resolver.js.map +1 -0
  189. package/dist/src/prompt-config/prompt-resolver.test.d.ts +1 -0
  190. package/dist/src/prompt-config/prompt-resolver.test.js +529 -0
  191. package/dist/src/prompt-config/prompt-resolver.test.js.map +1 -0
  192. package/dist/src/prompt-config/prompt-service.d.ts +108 -0
  193. package/dist/src/prompt-config/prompt-service.js +435 -0
  194. package/dist/src/prompt-config/prompt-service.js.map +1 -0
  195. package/dist/src/prompt-config/prompt-service.test.d.ts +1 -0
  196. package/dist/src/prompt-config/prompt-service.test.js +811 -0
  197. package/dist/src/prompt-config/prompt-service.test.js.map +1 -0
  198. package/dist/src/prompt-config/types.d.ts +30 -0
  199. package/dist/src/prompt-config/types.js +10 -0
  200. package/dist/src/prompt-config/types.js.map +1 -0
  201. package/dist/src/prompts/mcp-prompts.d.ts +8 -0
  202. package/dist/src/prompts/mcp-prompts.js +13 -0
  203. package/dist/src/prompts/mcp-prompts.js.map +1 -0
  204. package/dist/src/prompts/prompt-registry.d.ts +26 -0
  205. package/dist/src/prompts/prompt-registry.js +47 -0
  206. package/dist/src/prompts/prompt-registry.js.map +1 -0
  207. package/dist/src/providers/IProvider.d.ts +10 -0
  208. package/dist/src/providers/adapters/GeminiCompatibleWrapper.js +24 -9
  209. package/dist/src/providers/adapters/GeminiCompatibleWrapper.js.map +1 -1
  210. package/dist/src/providers/adapters/GeminiCompatibleWrapper.test.js +1 -1
  211. package/dist/src/providers/adapters/GeminiCompatibleWrapper.test.js.map +1 -1
  212. package/dist/src/providers/anthropic/AnthropicProvider.d.ts +14 -1
  213. package/dist/src/providers/anthropic/AnthropicProvider.js +28 -2
  214. package/dist/src/providers/anthropic/AnthropicProvider.js.map +1 -1
  215. package/dist/src/providers/anthropic/AnthropicProvider.modelParams.test.d.ts +1 -0
  216. package/dist/src/providers/anthropic/AnthropicProvider.modelParams.test.js +48 -0
  217. package/dist/src/providers/anthropic/AnthropicProvider.modelParams.test.js.map +1 -0
  218. package/dist/src/providers/anthropic/AnthropicProvider.test.js +2 -1
  219. package/dist/src/providers/anthropic/AnthropicProvider.test.js.map +1 -1
  220. package/dist/src/providers/gemini/GeminiProvider.d.ts +11 -2
  221. package/dist/src/providers/gemini/GeminiProvider.integration.test.js +1 -1
  222. package/dist/src/providers/gemini/GeminiProvider.js +42 -25
  223. package/dist/src/providers/gemini/GeminiProvider.js.map +1 -1
  224. package/dist/src/providers/openai/OpenAIProvider.d.ts +11 -0
  225. package/dist/src/providers/openai/OpenAIProvider.js +141 -24
  226. package/dist/src/providers/openai/OpenAIProvider.js.map +1 -1
  227. package/dist/src/providers/openai/OpenAIProvider.responses.test.js +27 -3
  228. package/dist/src/providers/openai/OpenAIProvider.responses.test.js.map +1 -1
  229. package/dist/src/providers/openai/OpenAIProvider.shouldUseResponses.test.js +2 -1
  230. package/dist/src/providers/openai/OpenAIProvider.shouldUseResponses.test.js.map +1 -1
  231. package/dist/src/providers/openai/OpenAIProvider.test.js +307 -7
  232. package/dist/src/providers/openai/OpenAIProvider.test.js.map +1 -1
  233. package/dist/src/providers/openai/buildResponsesRequest.js +19 -2
  234. package/dist/src/providers/openai/buildResponsesRequest.js.map +1 -1
  235. package/dist/src/providers/test-utils/providerTestConfig.d.ts +21 -0
  236. package/dist/src/providers/test-utils/providerTestConfig.js +23 -0
  237. package/dist/src/providers/test-utils/providerTestConfig.js.map +1 -0
  238. package/dist/src/providers/types/IProviderConfig.d.ts +6 -0
  239. package/dist/src/services/complexity-analyzer.d.ts +92 -0
  240. package/dist/src/services/complexity-analyzer.js +287 -0
  241. package/dist/src/services/complexity-analyzer.js.map +1 -0
  242. package/dist/src/services/fileDiscoveryService.test.js +101 -60
  243. package/dist/src/services/fileDiscoveryService.test.js.map +1 -1
  244. package/dist/src/services/gitService.test.d.ts +1 -1
  245. package/dist/src/services/gitService.test.js +65 -102
  246. package/dist/src/services/gitService.test.js.map +1 -1
  247. package/dist/src/services/index.d.ts +9 -0
  248. package/dist/src/services/index.js +8 -0
  249. package/dist/src/services/index.js.map +1 -0
  250. package/dist/src/services/loopDetectionService.d.ts +12 -0
  251. package/dist/src/services/loopDetectionService.js +62 -12
  252. package/dist/src/services/loopDetectionService.js.map +1 -1
  253. package/dist/src/services/loopDetectionService.test.js +90 -11
  254. package/dist/src/services/loopDetectionService.test.js.map +1 -1
  255. package/dist/src/services/shellExecutionService.d.ts +34 -0
  256. package/dist/src/services/shellExecutionService.js +121 -0
  257. package/dist/src/services/shellExecutionService.js.map +1 -0
  258. package/dist/src/services/shellExecutionService.multibyte.test.d.ts +6 -0
  259. package/dist/src/services/shellExecutionService.multibyte.test.js +72 -0
  260. package/dist/src/services/shellExecutionService.multibyte.test.js.map +1 -0
  261. package/dist/src/services/shellExecutionService.test.d.ts +6 -0
  262. package/dist/src/services/shellExecutionService.test.js +264 -0
  263. package/dist/src/services/shellExecutionService.test.js.map +1 -0
  264. package/dist/src/services/shellExecutionService.windows.multibyte.test.d.ts +6 -0
  265. package/dist/src/services/shellExecutionService.windows.multibyte.test.js +98 -0
  266. package/dist/src/services/shellExecutionService.windows.multibyte.test.js.map +1 -0
  267. package/dist/src/services/shellExecutionService.windows.test.d.ts +6 -0
  268. package/dist/src/services/shellExecutionService.windows.test.js +79 -0
  269. package/dist/src/services/shellExecutionService.windows.test.js.map +1 -0
  270. package/dist/src/services/todo-reminder-service.d.ts +42 -0
  271. package/dist/src/services/todo-reminder-service.js +77 -0
  272. package/dist/src/services/todo-reminder-service.js.map +1 -0
  273. package/dist/src/telemetry/clearcut-logger/clearcut-logger.d.ts +4 -2
  274. package/dist/src/telemetry/clearcut-logger/clearcut-logger.js +81 -34
  275. package/dist/src/telemetry/clearcut-logger/clearcut-logger.js.map +1 -1
  276. package/dist/src/telemetry/clearcut-logger/event-metadata-key.d.ts +6 -1
  277. package/dist/src/telemetry/clearcut-logger/event-metadata-key.js +19 -0
  278. package/dist/src/telemetry/clearcut-logger/event-metadata-key.js.map +1 -1
  279. package/dist/src/telemetry/constants.d.ts +2 -1
  280. package/dist/src/telemetry/constants.js +2 -1
  281. package/dist/src/telemetry/constants.js.map +1 -1
  282. package/dist/src/telemetry/file-exporters.d.ts +2 -2
  283. package/dist/src/telemetry/file-exporters.js +47 -20
  284. package/dist/src/telemetry/file-exporters.js.map +1 -1
  285. package/dist/src/telemetry/index.d.ts +2 -2
  286. package/dist/src/telemetry/index.js +2 -2
  287. package/dist/src/telemetry/index.js.map +1 -1
  288. package/dist/src/telemetry/loggers.d.ts +3 -2
  289. package/dist/src/telemetry/loggers.js +30 -6
  290. package/dist/src/telemetry/loggers.js.map +1 -1
  291. package/dist/src/telemetry/loggers.test.circular.js +2 -0
  292. package/dist/src/telemetry/loggers.test.circular.js.map +1 -1
  293. package/dist/src/telemetry/loggers.test.js +13 -3
  294. package/dist/src/telemetry/loggers.test.js.map +1 -1
  295. package/dist/src/telemetry/sdk.d.ts +1 -1
  296. package/dist/src/telemetry/sdk.js +71 -73
  297. package/dist/src/telemetry/sdk.js.map +1 -1
  298. package/dist/src/telemetry/telemetry.test.js +7 -5
  299. package/dist/src/telemetry/telemetry.test.js.map +1 -1
  300. package/dist/src/telemetry/types.d.ts +19 -4
  301. package/dist/src/telemetry/types.js +30 -4
  302. package/dist/src/telemetry/types.js.map +1 -1
  303. package/dist/src/telemetry/uiTelemetry.test.js +3 -0
  304. package/dist/src/telemetry/uiTelemetry.test.js.map +1 -1
  305. package/dist/src/test-utils/mockWorkspaceContext.d.ts +13 -0
  306. package/dist/src/test-utils/mockWorkspaceContext.js +24 -0
  307. package/dist/src/test-utils/mockWorkspaceContext.js.map +1 -0
  308. package/dist/src/tools/edit.js +29 -4
  309. package/dist/src/tools/edit.js.map +1 -1
  310. package/dist/src/tools/edit.test.js +104 -1
  311. package/dist/src/tools/edit.test.js.map +1 -1
  312. package/dist/src/tools/glob.js +53 -17
  313. package/dist/src/tools/glob.js.map +1 -1
  314. package/dist/src/tools/glob.test.js +32 -6
  315. package/dist/src/tools/glob.test.js.map +1 -1
  316. package/dist/src/tools/grep.d.ts +1 -1
  317. package/dist/src/tools/grep.js +81 -29
  318. package/dist/src/tools/grep.js.map +1 -1
  319. package/dist/src/tools/grep.test.js +76 -9
  320. package/dist/src/tools/grep.test.js.map +1 -1
  321. package/dist/src/tools/ls.js +4 -3
  322. package/dist/src/tools/ls.js.map +1 -1
  323. package/dist/src/tools/ls.test.d.ts +6 -0
  324. package/dist/src/tools/ls.test.js +356 -0
  325. package/dist/src/tools/ls.test.js.map +1 -0
  326. package/dist/src/tools/mcp-client.d.ts +26 -2
  327. package/dist/src/tools/mcp-client.js +72 -24
  328. package/dist/src/tools/mcp-client.js.map +1 -1
  329. package/dist/src/tools/mcp-client.test.js +87 -1
  330. package/dist/src/tools/mcp-client.test.js.map +1 -1
  331. package/dist/src/tools/memoryTool.d.ts +17 -2
  332. package/dist/src/tools/memoryTool.js +130 -13
  333. package/dist/src/tools/memoryTool.js.map +1 -1
  334. package/dist/src/tools/memoryTool.test.js +88 -3
  335. package/dist/src/tools/memoryTool.test.js.map +1 -1
  336. package/dist/src/tools/modifiable-tool.test.js +51 -62
  337. package/dist/src/tools/modifiable-tool.test.js.map +1 -1
  338. package/dist/src/tools/read-file.js +8 -6
  339. package/dist/src/tools/read-file.js.map +1 -1
  340. package/dist/src/tools/read-file.test.js +30 -2
  341. package/dist/src/tools/read-file.test.js.map +1 -1
  342. package/dist/src/tools/read-many-files.js +22 -12
  343. package/dist/src/tools/read-many-files.js.map +1 -1
  344. package/dist/src/tools/read-many-files.test.js +35 -2
  345. package/dist/src/tools/read-many-files.test.js.map +1 -1
  346. package/dist/src/tools/shell.d.ts +8 -3
  347. package/dist/src/tools/shell.js +185 -114
  348. package/dist/src/tools/shell.js.map +1 -1
  349. package/dist/src/tools/shell.multibyte.test.d.ts +6 -0
  350. package/dist/src/tools/shell.multibyte.test.js +74 -0
  351. package/dist/src/tools/shell.multibyte.test.js.map +1 -0
  352. package/dist/src/tools/shell.test.d.ts +1 -1
  353. package/dist/src/tools/shell.test.js +323 -138
  354. package/dist/src/tools/shell.test.js.map +1 -1
  355. package/dist/src/tools/todo-read.d.ts +4 -1
  356. package/dist/src/tools/todo-read.js +136 -20
  357. package/dist/src/tools/todo-read.js.map +1 -1
  358. package/dist/src/tools/todo-read.test.js +10 -6
  359. package/dist/src/tools/todo-read.test.js.map +1 -1
  360. package/dist/src/tools/todo-schemas.d.ts +4 -4
  361. package/dist/src/tools/todo-write.d.ts +3 -0
  362. package/dist/src/tools/todo-write.js +96 -9
  363. package/dist/src/tools/todo-write.js.map +1 -1
  364. package/dist/src/tools/todo-write.test.js +17 -13
  365. package/dist/src/tools/todo-write.test.js.map +1 -1
  366. package/dist/src/tools/tool-context.d.ts +14 -0
  367. package/dist/src/tools/tool-context.js +7 -0
  368. package/dist/src/tools/tool-context.js.map +1 -0
  369. package/dist/src/tools/tool-error.d.ts +22 -0
  370. package/dist/src/tools/tool-error.js +27 -0
  371. package/dist/src/tools/tool-error.js.map +1 -0
  372. package/dist/src/tools/tool-registry.d.ts +4 -1
  373. package/dist/src/tools/tool-registry.js +14 -5
  374. package/dist/src/tools/tool-registry.js.map +1 -1
  375. package/dist/src/tools/tool-registry.test.js +10 -2
  376. package/dist/src/tools/tool-registry.test.js.map +1 -1
  377. package/dist/src/tools/tools.d.ts +16 -1
  378. package/dist/src/tools/tools.js +2 -0
  379. package/dist/src/tools/tools.js.map +1 -1
  380. package/dist/src/tools/web-fetch.js +18 -4
  381. package/dist/src/tools/web-fetch.js.map +1 -1
  382. package/dist/src/tools/write-file.js +5 -3
  383. package/dist/src/tools/write-file.js.map +1 -1
  384. package/dist/src/tools/write-file.test.js +36 -2
  385. package/dist/src/tools/write-file.test.js.map +1 -1
  386. package/dist/src/types/modelParams.d.ts +62 -0
  387. package/dist/src/types/modelParams.js +7 -0
  388. package/dist/src/types/modelParams.js.map +1 -0
  389. package/dist/src/utils/bfsFileSearch.js +51 -27
  390. package/dist/src/utils/bfsFileSearch.js.map +1 -1
  391. package/dist/src/utils/bfsFileSearch.test.js +59 -0
  392. package/dist/src/utils/bfsFileSearch.test.js.map +1 -1
  393. package/dist/src/utils/editCorrector.js +2 -2
  394. package/dist/src/utils/editCorrector.js.map +1 -1
  395. package/dist/src/utils/editor.d.ts +1 -1
  396. package/dist/src/utils/editor.js +9 -0
  397. package/dist/src/utils/editor.js.map +1 -1
  398. package/dist/src/utils/editor.test.js +21 -1
  399. package/dist/src/utils/editor.test.js.map +1 -1
  400. package/dist/src/utils/fileUtils.js +12 -1
  401. package/dist/src/utils/fileUtils.js.map +1 -1
  402. package/dist/src/utils/fileUtils.test.js +29 -1
  403. package/dist/src/utils/fileUtils.test.js.map +1 -1
  404. package/dist/src/utils/flashFallback.integration.test.js +8 -0
  405. package/dist/src/utils/flashFallback.integration.test.js.map +1 -1
  406. package/dist/src/utils/formatters.d.ts +6 -0
  407. package/dist/src/utils/formatters.js +16 -0
  408. package/dist/src/utils/formatters.js.map +1 -0
  409. package/dist/src/utils/memoryDiscovery.d.ts +1 -1
  410. package/dist/src/utils/memoryDiscovery.js +61 -73
  411. package/dist/src/utils/memoryDiscovery.js.map +1 -1
  412. package/dist/src/utils/memoryDiscovery.test.js +4 -3
  413. package/dist/src/utils/memoryDiscovery.test.js.map +1 -1
  414. package/dist/src/utils/memoryImportProcessor.d.ts +19 -12
  415. package/dist/src/utils/memoryImportProcessor.js +241 -82
  416. package/dist/src/utils/memoryImportProcessor.js.map +1 -1
  417. package/dist/src/utils/memoryImportProcessor.test.js +595 -50
  418. package/dist/src/utils/memoryImportProcessor.test.js.map +1 -1
  419. package/dist/src/utils/nextSpeakerChecker.js +12 -27
  420. package/dist/src/utils/nextSpeakerChecker.js.map +1 -1
  421. package/dist/src/utils/nextSpeakerChecker.test.js +8 -4
  422. package/dist/src/utils/nextSpeakerChecker.test.js.map +1 -1
  423. package/dist/src/utils/retry.d.ts +3 -0
  424. package/dist/src/utils/retry.js.map +1 -1
  425. package/dist/src/utils/retry.test.js.map +1 -1
  426. package/dist/src/utils/sanitization.d.ts +20 -0
  427. package/dist/src/utils/sanitization.js +66 -0
  428. package/dist/src/utils/sanitization.js.map +1 -0
  429. package/dist/src/utils/sanitization.test.d.ts +6 -0
  430. package/dist/src/utils/sanitization.test.js +81 -0
  431. package/dist/src/utils/sanitization.test.js.map +1 -0
  432. package/dist/src/utils/secure-browser-launcher.d.ts +23 -0
  433. package/dist/src/utils/secure-browser-launcher.js +164 -0
  434. package/dist/src/utils/secure-browser-launcher.js.map +1 -0
  435. package/dist/src/utils/secure-browser-launcher.test.d.ts +6 -0
  436. package/dist/src/utils/secure-browser-launcher.test.js +149 -0
  437. package/dist/src/utils/secure-browser-launcher.test.js.map +1 -0
  438. package/dist/src/utils/shell-utils.d.ts +37 -3
  439. package/dist/src/utils/shell-utils.js +110 -47
  440. package/dist/src/utils/shell-utils.js.map +1 -1
  441. package/dist/src/utils/shell-utils.test.js +146 -396
  442. package/dist/src/utils/shell-utils.test.js.map +1 -1
  443. package/dist/src/utils/summarizer.js +2 -2
  444. package/dist/src/utils/summarizer.js.map +1 -1
  445. package/dist/src/utils/textUtils.d.ts +13 -0
  446. package/dist/src/utils/textUtils.js +28 -0
  447. package/dist/src/utils/textUtils.js.map +1 -0
  448. package/dist/src/utils/unicodeUtils.d.ts +44 -0
  449. package/dist/src/utils/unicodeUtils.js +93 -0
  450. package/dist/src/utils/unicodeUtils.js.map +1 -0
  451. package/dist/src/utils/unicodeUtils.test.d.ts +6 -0
  452. package/dist/src/utils/unicodeUtils.test.js +120 -0
  453. package/dist/src/utils/unicodeUtils.test.js.map +1 -0
  454. package/dist/src/utils/workspaceContext.d.ts +47 -0
  455. package/dist/src/utils/workspaceContext.js +106 -0
  456. package/dist/src/utils/workspaceContext.js.map +1 -0
  457. package/dist/src/utils/workspaceContext.test.d.ts +6 -0
  458. package/dist/src/utils/workspaceContext.test.js +209 -0
  459. package/dist/src/utils/workspaceContext.test.js.map +1 -0
  460. package/package.json +3 -2
  461. package/dist/src/providers/IProviderConfig.d.ts +0 -31
  462. package/dist/src/providers/IProviderConfig.js.map +0 -1
  463. package/dist/tsconfig.tsbuildinfo +0 -1
@@ -4,23 +4,50 @@
4
4
  * SPDX-License-Identifier: Apache-2.0
5
5
  */
6
6
  import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
7
+ // Mock prompts module before imports
8
+ vi.mock('./prompts.js', () => ({
9
+ getCoreSystemPromptAsync: vi
10
+ .fn()
11
+ .mockResolvedValue('Test system instruction'),
12
+ getCompressionPrompt: vi.fn().mockReturnValue('Test compression prompt'),
13
+ initializePromptSystem: vi.fn().mockResolvedValue(undefined),
14
+ }));
7
15
  import { GoogleGenAI, } from '@google/genai';
8
16
  import { findIndexAfterFraction, GeminiClient } from './client.js';
9
- import { AuthType } from './contentGenerator.js';
17
+ import { getCoreSystemPromptAsync } from './prompts.js';
18
+ import { AuthType, } from './contentGenerator.js';
10
19
  import { Config } from '../config/config.js';
11
20
  import { GeminiEventType, Turn } from './turn.js';
12
- import { getCoreSystemPrompt } from './prompts.js';
13
21
  import { DEFAULT_GEMINI_FLASH_MODEL } from '../config/models.js';
14
22
  import { FileDiscoveryService } from '../services/fileDiscoveryService.js';
15
23
  import { setSimulate429 } from '../utils/testUtils.js';
16
24
  import { tokenLimit } from './tokenLimits.js';
17
25
  import { ideContext } from '../ide/ideContext.js';
26
+ import { ComplexityAnalyzer } from '../services/complexity-analyzer.js';
27
+ import { TodoReminderService } from '../services/todo-reminder-service.js';
18
28
  // --- Mocks ---
19
29
  const mockChatCreateFn = vi.fn();
20
30
  const mockGenerateContentFn = vi.fn();
21
31
  const mockEmbedContentFn = vi.fn();
22
32
  const mockTurnRunFn = vi.fn();
23
33
  vi.mock('@google/genai');
34
+ vi.mock('../services/complexity-analyzer.js', () => ({
35
+ ComplexityAnalyzer: vi.fn().mockImplementation(() => ({
36
+ analyzeComplexity: vi.fn().mockReturnValue({
37
+ complexityScore: 0.2,
38
+ isComplex: false,
39
+ detectedTasks: [],
40
+ sequentialIndicators: [],
41
+ questionCount: 0,
42
+ shouldSuggestTodos: false,
43
+ }),
44
+ })),
45
+ }));
46
+ vi.mock('../services/todo-reminder-service.js', () => ({
47
+ TodoReminderService: vi.fn().mockImplementation(() => ({
48
+ getComplexTaskSuggestion: vi.fn(),
49
+ })),
50
+ }));
24
51
  vi.mock('./turn', () => {
25
52
  // Define a mock class that has the same shape as the real Turn
26
53
  class MockTurn {
@@ -41,14 +68,10 @@ vi.mock('./turn', () => {
41
68
  };
42
69
  });
43
70
  vi.mock('../config/config.js');
44
- vi.mock('./prompts');
45
71
  vi.mock('../utils/getFolderStructure', () => ({
46
72
  getFolderStructure: vi.fn().mockResolvedValue('Mock Folder Structure'),
47
73
  }));
48
74
  vi.mock('../utils/errorReporting', () => ({ reportError: vi.fn() }));
49
- vi.mock('../utils/nextSpeakerChecker', () => ({
50
- checkNextSpeaker: vi.fn().mockResolvedValue(null),
51
- }));
52
75
  vi.mock('../utils/generateContentResponseUtilities', () => ({
53
76
  getResponseText: (result) => result.candidates?.[0]?.content?.parts?.map((part) => part.text).join('') ||
54
77
  undefined,
@@ -112,6 +135,22 @@ describe('Gemini Client (client.ts)', () => {
112
135
  let client;
113
136
  beforeEach(async () => {
114
137
  vi.resetAllMocks();
138
+ // Re-setup prompts mocks after reset
139
+ vi.mocked(getCoreSystemPromptAsync).mockResolvedValue('Test system instruction');
140
+ // Re-setup mocks after reset
141
+ vi.mocked(ComplexityAnalyzer).mockImplementation(() => ({
142
+ analyzeComplexity: vi.fn().mockReturnValue({
143
+ complexityScore: 0.2,
144
+ isComplex: false,
145
+ detectedTasks: [],
146
+ sequentialIndicators: [],
147
+ questionCount: 0,
148
+ shouldSuggestTodos: false,
149
+ }),
150
+ }));
151
+ vi.mocked(TodoReminderService).mockImplementation(() => ({
152
+ getComplexTaskSuggestion: vi.fn(),
153
+ }));
115
154
  // Disable 429 simulation for tests
116
155
  setSimulate429(false);
117
156
  // Set up the mock for GoogleGenAI constructor and its methods
@@ -172,14 +211,26 @@ describe('Gemini Client (client.ts)', () => {
172
211
  setQuotaErrorOccurred: vi.fn(),
173
212
  getNoBrowser: vi.fn().mockReturnValue(false),
174
213
  getUsageStatisticsEnabled: vi.fn().mockReturnValue(true),
175
- getIdeMode: vi.fn().mockReturnValue(false),
214
+ getIdeModeFeature: vi.fn().mockReturnValue(false),
215
+ getIdeMode: vi.fn().mockReturnValue(true),
216
+ getWorkspaceContext: vi.fn().mockReturnValue({
217
+ getDirectories: vi.fn().mockReturnValue(['/test/dir']),
218
+ }),
176
219
  getGeminiClient: vi.fn(),
177
220
  getDebugMode: vi.fn().mockReturnValue(false),
221
+ setFallbackMode: vi.fn(),
222
+ getComplexityAnalyzerSettings: vi.fn().mockReturnValue({
223
+ complexityThreshold: 0.6,
224
+ minTasksForSuggestion: 3,
225
+ suggestionCooldownMs: 300000,
226
+ }),
178
227
  };
179
228
  MockedConfig.mockImplementation(() => mockConfigObject);
180
229
  // We can instantiate the client here since Config is mocked
181
230
  // and the constructor will use the mocked GoogleGenAI
182
- const mockConfig = new Config({});
231
+ const mockConfig = new Config({
232
+ sessionId: 'test-session-id',
233
+ });
183
234
  client = new GeminiClient(mockConfig);
184
235
  await client.initialize(contentGeneratorConfig);
185
236
  // Update the mock to return the client
@@ -308,12 +359,12 @@ describe('Gemini Client (client.ts)', () => {
308
359
  model: 'test-model',
309
360
  config: {
310
361
  abortSignal,
311
- systemInstruction: getCoreSystemPrompt(''),
362
+ systemInstruction: 'Test system instruction',
312
363
  temperature: 0.5,
313
364
  topP: 1,
314
365
  },
315
366
  contents,
316
- });
367
+ }, 'test-session-id');
317
368
  });
318
369
  });
319
370
  describe('generateJson', () => {
@@ -321,20 +372,45 @@ describe('Gemini Client (client.ts)', () => {
321
372
  const contents = [{ role: 'user', parts: [{ text: 'hello' }] }];
322
373
  const schema = { type: 'string' };
323
374
  const abortSignal = new AbortController().signal;
324
- // Mock countTokens
375
+ // Mock lazyInitialize to prevent it from overriding our mock
376
+ client['lazyInitialize'] = vi.fn().mockResolvedValue(undefined);
377
+ // Track the arguments manually
378
+ let capturedRequest;
379
+ let capturedPromptId;
325
380
  const mockGenerator = {
326
381
  countTokens: vi.fn().mockResolvedValue({ totalTokens: 1 }),
327
- generateContent: mockGenerateContentFn,
382
+ generateContent: vi.fn(async (request, promptId) => {
383
+ capturedRequest = request;
384
+ capturedPromptId = promptId;
385
+ return {
386
+ candidates: [
387
+ {
388
+ content: {
389
+ parts: [{ text: '{"key": "value"}' }],
390
+ },
391
+ },
392
+ ],
393
+ };
394
+ }),
328
395
  generateContentStream: vi.fn(),
329
396
  embedContent: vi.fn(),
330
397
  };
331
398
  client['contentGenerator'] = mockGenerator;
332
- await client.generateJson(contents, schema, abortSignal);
333
- expect(mockGenerateContentFn).toHaveBeenCalledWith({
399
+ try {
400
+ await client.generateJson(contents, schema, abortSignal);
401
+ }
402
+ catch (error) {
403
+ console.error('Error in generateJson:', error);
404
+ throw error;
405
+ }
406
+ // Check the captured arguments
407
+ expect(capturedRequest).toBeDefined();
408
+ expect(capturedPromptId).toBe('test-session-id');
409
+ expect(capturedRequest).toMatchObject({
334
410
  model: 'test-model', // Should use current model from config
335
411
  config: {
336
412
  abortSignal,
337
- systemInstruction: getCoreSystemPrompt(''),
413
+ systemInstruction: 'Test system instruction',
338
414
  temperature: 0,
339
415
  topP: 1,
340
416
  responseSchema: schema,
@@ -349,17 +425,37 @@ describe('Gemini Client (client.ts)', () => {
349
425
  const abortSignal = new AbortController().signal;
350
426
  const customModel = 'custom-json-model';
351
427
  const customConfig = { temperature: 0.9, topK: 20 };
428
+ // Mock lazyInitialize to prevent it from overriding our mock
429
+ client['lazyInitialize'] = vi.fn().mockResolvedValue(undefined);
430
+ // Track the arguments manually
431
+ let capturedRequest;
432
+ let capturedPromptId;
352
433
  const mockGenerator = {
353
434
  countTokens: vi.fn().mockResolvedValue({ totalTokens: 1 }),
354
- generateContent: mockGenerateContentFn,
435
+ generateContent: vi.fn(async (request, promptId) => {
436
+ capturedRequest = request;
437
+ capturedPromptId = promptId;
438
+ return {
439
+ candidates: [
440
+ {
441
+ content: {
442
+ parts: [{ text: '{"key": "value"}' }],
443
+ },
444
+ },
445
+ ],
446
+ };
447
+ }),
355
448
  };
356
449
  client['contentGenerator'] = mockGenerator;
357
450
  await client.generateJson(contents, schema, abortSignal, customModel, customConfig);
358
- expect(mockGenerateContentFn).toHaveBeenCalledWith({
451
+ // Check the captured arguments
452
+ expect(capturedRequest).toBeDefined();
453
+ expect(capturedPromptId).toBe('test-session-id');
454
+ expect(capturedRequest).toMatchObject({
359
455
  model: customModel,
360
456
  config: {
361
457
  abortSignal,
362
- systemInstruction: getCoreSystemPrompt(''),
458
+ systemInstruction: 'Test system instruction',
363
459
  temperature: 0.9,
364
460
  topP: 1, // from default
365
461
  topK: 20,
@@ -585,18 +681,114 @@ describe('Gemini Client (client.ts)', () => {
585
681
  });
586
682
  });
587
683
  describe('sendMessageStream', () => {
588
- it('should include IDE context when ideMode is enabled', async () => {
684
+ it('should include IDE context when ideModeFeature is enabled', async () => {
589
685
  // Arrange
590
- vi.mocked(ideContext.getOpenFilesContext).mockReturnValue({
591
- activeFile: '/path/to/active/file.ts',
592
- selectedText: 'hello',
593
- cursor: { line: 5, character: 10 },
594
- recentOpenFiles: [
595
- { filePath: '/path/to/recent/file1.ts', timestamp: Date.now() },
596
- { filePath: '/path/to/recent/file2.ts', timestamp: Date.now() },
597
- ],
686
+ vi.mocked(ideContext.getIdeContext).mockReturnValue({
687
+ workspaceState: {
688
+ openFiles: [
689
+ {
690
+ path: '/path/to/active/file.ts',
691
+ timestamp: Date.now(),
692
+ isActive: true,
693
+ selectedText: 'hello',
694
+ cursor: { line: 5, character: 10 },
695
+ },
696
+ {
697
+ path: '/path/to/recent/file1.ts',
698
+ timestamp: Date.now(),
699
+ },
700
+ {
701
+ path: '/path/to/recent/file2.ts',
702
+ timestamp: Date.now(),
703
+ },
704
+ ],
705
+ },
706
+ });
707
+ vi.spyOn(client['config'], 'getIdeModeFeature').mockReturnValue(true);
708
+ const mockStream = (async function* () {
709
+ yield { type: 'content', value: 'Hello' };
710
+ })();
711
+ mockTurnRunFn.mockReturnValue(mockStream);
712
+ const mockChat = {
713
+ addHistory: vi.fn(),
714
+ getHistory: vi.fn().mockReturnValue([]),
715
+ };
716
+ client['chat'] = mockChat;
717
+ const mockGenerator = {
718
+ countTokens: vi.fn().mockResolvedValue({ totalTokens: 0 }),
719
+ generateContent: mockGenerateContentFn,
720
+ };
721
+ client['contentGenerator'] = mockGenerator;
722
+ const initialRequest = [{ text: 'Hi' }];
723
+ // Act
724
+ const stream = client.sendMessageStream(initialRequest, new AbortController().signal, 'prompt-id-ide');
725
+ for await (const _ of stream) {
726
+ // consume stream
727
+ }
728
+ // Assert
729
+ expect(ideContext.getIdeContext).toHaveBeenCalled();
730
+ const expectedContext = `
731
+ This is the file that the user is looking at:
732
+ - Path: /path/to/active/file.ts
733
+ This is the cursor position in the file:
734
+ - Cursor Position: Line 5, Character 10
735
+ This is the selected text in the file:
736
+ - hello
737
+ Here are some other files the user has open, with the most recent at the top:
738
+ - /path/to/recent/file1.ts
739
+ - /path/to/recent/file2.ts
740
+ `.trim();
741
+ const expectedRequest = [{ text: expectedContext }, ...initialRequest];
742
+ expect(mockTurnRunFn).toHaveBeenCalledWith(expectedRequest, expect.any(Object));
743
+ });
744
+ it('should not add context if ideModeFeature is enabled but no open files', async () => {
745
+ // Arrange
746
+ vi.mocked(ideContext.getIdeContext).mockReturnValue({
747
+ workspaceState: {
748
+ openFiles: [],
749
+ },
750
+ });
751
+ vi.spyOn(client['config'], 'getIdeModeFeature').mockReturnValue(true);
752
+ const mockStream = (async function* () {
753
+ yield { type: 'content', value: 'Hello' };
754
+ })();
755
+ mockTurnRunFn.mockReturnValue(mockStream);
756
+ const mockChat = {
757
+ addHistory: vi.fn(),
758
+ getHistory: vi.fn().mockReturnValue([]),
759
+ };
760
+ client['chat'] = mockChat;
761
+ const mockGenerator = {
762
+ countTokens: vi.fn().mockResolvedValue({ totalTokens: 0 }),
763
+ generateContent: mockGenerateContentFn,
764
+ };
765
+ client['contentGenerator'] = mockGenerator;
766
+ const initialRequest = [{ text: 'Hi' }];
767
+ // Act
768
+ const stream = client.sendMessageStream(initialRequest, new AbortController().signal, 'prompt-id-ide');
769
+ for await (const _ of stream) {
770
+ // consume stream
771
+ }
772
+ // Assert
773
+ expect(ideContext.getIdeContext).toHaveBeenCalled();
774
+ expect(mockTurnRunFn).toHaveBeenCalledWith(initialRequest, expect.any(Object));
775
+ });
776
+ it('should add context if ideModeFeature is enabled and there is one active file', async () => {
777
+ // Arrange
778
+ vi.mocked(ideContext.getIdeContext).mockReturnValue({
779
+ workspaceState: {
780
+ openFiles: [
781
+ {
782
+ path: '/path/to/active/file.ts',
783
+ timestamp: Date.now(),
784
+ isActive: true,
785
+ selectedText: 'hello',
786
+ cursor: { line: 5, character: 10 },
787
+ },
788
+ ],
789
+ },
598
790
  });
599
- vi.spyOn(client['config'], 'getIdeMode').mockReturnValue(true);
791
+ vi.spyOn(client['config'], 'getIdeModeFeature').mockReturnValue(true);
600
792
  const mockStream = (async function* () {
601
793
  yield { type: 'content', value: 'Hello' };
602
794
  })();
@@ -618,15 +810,59 @@ describe('Gemini Client (client.ts)', () => {
618
810
  // consume stream
619
811
  }
620
812
  // Assert
621
- expect(ideContext.getOpenFilesContext).toHaveBeenCalled();
813
+ expect(ideContext.getIdeContext).toHaveBeenCalled();
622
814
  const expectedContext = `
623
- This is the file that the user was most recently looking at:
815
+ This is the file that the user is looking at:
624
816
  - Path: /path/to/active/file.ts
625
817
  This is the cursor position in the file:
626
818
  - Cursor Position: Line 5, Character 10
627
- This is the selected text in the active file:
819
+ This is the selected text in the file:
628
820
  - hello
629
- Here are files the user has recently opened, with the most recent at the top:
821
+ `.trim();
822
+ const expectedRequest = [{ text: expectedContext }, ...initialRequest];
823
+ expect(mockTurnRunFn).toHaveBeenCalledWith(expectedRequest, expect.any(Object));
824
+ });
825
+ it('should add context if ideModeFeature is enabled and there are open files but no active file', async () => {
826
+ // Arrange
827
+ vi.mocked(ideContext.getIdeContext).mockReturnValue({
828
+ workspaceState: {
829
+ openFiles: [
830
+ {
831
+ path: '/path/to/recent/file1.ts',
832
+ timestamp: Date.now(),
833
+ },
834
+ {
835
+ path: '/path/to/recent/file2.ts',
836
+ timestamp: Date.now(),
837
+ },
838
+ ],
839
+ },
840
+ });
841
+ vi.spyOn(client['config'], 'getIdeModeFeature').mockReturnValue(true);
842
+ const mockStream = (async function* () {
843
+ yield { type: 'content', value: 'Hello' };
844
+ })();
845
+ mockTurnRunFn.mockReturnValue(mockStream);
846
+ const mockChat = {
847
+ addHistory: vi.fn(),
848
+ getHistory: vi.fn().mockReturnValue([]),
849
+ };
850
+ client['chat'] = mockChat;
851
+ const mockGenerator = {
852
+ countTokens: vi.fn().mockResolvedValue({ totalTokens: 0 }),
853
+ generateContent: mockGenerateContentFn,
854
+ };
855
+ client['contentGenerator'] = mockGenerator;
856
+ const initialRequest = [{ text: 'Hi' }];
857
+ // Act
858
+ const stream = client.sendMessageStream(initialRequest, new AbortController().signal, 'prompt-id-ide');
859
+ for await (const _ of stream) {
860
+ // consume stream
861
+ }
862
+ // Assert
863
+ expect(ideContext.getIdeContext).toHaveBeenCalled();
864
+ const expectedContext = `
865
+ Here are some files the user has open, with the most recent at the top:
630
866
  - /path/to/recent/file1.ts
631
867
  - /path/to/recent/file2.ts
632
868
  `.trim();
@@ -665,7 +901,7 @@ Here are files the user has recently opened, with the most recent at the top:
665
901
  // Assert
666
902
  expect(finalResult).toBeInstanceOf(Turn);
667
903
  });
668
- it('should stop infinite loop after MAX_TURNS when nextSpeaker always returns model', async () => {
904
+ it.skip('should stop infinite loop after MAX_TURNS when nextSpeaker always returns model', async () => {
669
905
  // Get the mocked checkNextSpeaker function and configure it to trigger infinite loop
670
906
  const { checkNextSpeaker } = await import('../utils/nextSpeakerChecker.js');
671
907
  const mockCheckNextSpeaker = vi.mocked(checkNextSpeaker);
@@ -673,6 +909,16 @@ Here are files the user has recently opened, with the most recent at the top:
673
909
  next_speaker: 'model',
674
910
  reasoning: 'Test case - always continue',
675
911
  });
912
+ // Mock provider manager to return 'gemini' provider
913
+ const mockProviderManager = {
914
+ getActiveProviderName: vi.fn().mockReturnValue('gemini'),
915
+ getActiveProvider: vi.fn().mockReturnValue(null),
916
+ };
917
+ const mockContentGenConfig = {
918
+ model: 'test-model',
919
+ providerManager: mockProviderManager,
920
+ };
921
+ vi.spyOn(client['config'], 'getContentGeneratorConfig').mockReturnValue(mockContentGenConfig);
676
922
  // Mock Turn to have no pending tool calls (which would allow nextSpeaker check)
677
923
  const mockStream = (async function* () {
678
924
  yield { type: 'content', value: 'Continue...' };
@@ -771,7 +1017,7 @@ Here are files the user has recently opened, with the most recent at the top:
771
1017
  expect(events).toEqual([{ type: GeminiEventType.MaxSessionTurns }]);
772
1018
  expect(mockTurnRunFn).toHaveBeenCalledTimes(MAX_SESSION_TURNS);
773
1019
  });
774
- it('should respect MAX_TURNS limit even when turns parameter is set to a large value', async () => {
1020
+ it.skip('should respect MAX_TURNS limit even when turns parameter is set to a large value', async () => {
775
1021
  // This test verifies that the infinite loop protection works even when
776
1022
  // someone tries to bypass it by calling with a very large turns value
777
1023
  // Get the mocked checkNextSpeaker function and configure it to trigger infinite loop
@@ -866,15 +1112,17 @@ Here are files the user has recently opened, with the most recent at the top:
866
1112
  // Verify the mock was called
867
1113
  expect(mockContentGeneratorGenerateContent).toHaveBeenCalledTimes(1);
868
1114
  // Get the actual call arguments
869
- const actualCall = mockContentGeneratorGenerateContent.mock.calls[0][0];
1115
+ const actualCall = mockContentGeneratorGenerateContent.mock.calls[0];
870
1116
  // Assert on the model specifically
871
- expect(actualCall.model).toBe(currentModel);
872
- expect(actualCall.model).not.toBe(initialModel);
1117
+ expect(actualCall[0].model).toBe(currentModel);
1118
+ expect(actualCall[0].model).not.toBe(initialModel);
873
1119
  // Verify other expected properties exist
874
- expect(actualCall).toHaveProperty('contents', contents);
875
- expect(actualCall).toHaveProperty('config');
876
- expect(actualCall.config).toHaveProperty('abortSignal');
877
- expect(actualCall.config).toHaveProperty('systemInstruction');
1120
+ expect(actualCall[0]).toHaveProperty('contents', contents);
1121
+ expect(actualCall[0]).toHaveProperty('config');
1122
+ expect(actualCall[0].config).toHaveProperty('abortSignal');
1123
+ expect(actualCall[0].config).toHaveProperty('systemInstruction');
1124
+ // Verify prompt_id was passed
1125
+ expect(actualCall[1]).toBe('test-session-id');
878
1126
  });
879
1127
  });
880
1128
  describe('tryCompressChat model usage', () => {
@@ -928,7 +1176,8 @@ Here are files the user has recently opened, with the most recent at the top:
928
1176
  const fallbackModel = DEFAULT_GEMINI_FLASH_MODEL;
929
1177
  // mock config been changed
930
1178
  const currentModel = initialModel + '-changed';
931
- vi.spyOn(client['config'], 'getModel').mockReturnValueOnce(currentModel);
1179
+ const getModelSpy = vi.spyOn(client['config'], 'getModel');
1180
+ getModelSpy.mockReturnValue(currentModel);
932
1181
  const mockFallbackHandler = vi.fn().mockResolvedValue(true);
933
1182
  client['config'].flashFallbackHandler = mockFallbackHandler;
934
1183
  client['config'].setModel = vi.fn();