@vybestack/llxprt-code-core 0.1.18-nightly.250808.f9b79d74 → 0.1.18-nightly.250812.12fa8ad2

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 (563) hide show
  1. package/README.md +49 -2
  2. package/dist/index.d.ts +6 -0
  3. package/dist/index.js +5 -0
  4. package/dist/index.js.map +1 -1
  5. package/dist/src/auth/anthropic-device-flow.d.ts +53 -0
  6. package/dist/src/auth/anthropic-device-flow.js +208 -0
  7. package/dist/src/auth/anthropic-device-flow.js.map +1 -0
  8. package/dist/src/auth/precedence.d.ts +55 -0
  9. package/dist/src/auth/precedence.js +211 -0
  10. package/dist/src/auth/precedence.js.map +1 -0
  11. package/dist/src/auth/qwen-device-flow.d.ts +45 -0
  12. package/dist/src/auth/qwen-device-flow.js +179 -0
  13. package/dist/src/auth/qwen-device-flow.js.map +1 -0
  14. package/dist/src/auth/token-store.d.ts +66 -0
  15. package/dist/src/auth/token-store.js +151 -0
  16. package/dist/src/auth/token-store.js.map +1 -0
  17. package/dist/src/auth/types.d.ts +130 -0
  18. package/dist/src/auth/types.js +60 -0
  19. package/dist/src/auth/types.js.map +1 -0
  20. package/dist/src/code_assist/converter.d.ts +2 -1
  21. package/dist/src/code_assist/converter.js +1 -1
  22. package/dist/src/code_assist/converter.js.map +1 -1
  23. package/dist/src/code_assist/oauth2.js +2 -1
  24. package/dist/src/code_assist/oauth2.js.map +1 -1
  25. package/dist/src/config/config.d.ts +78 -3
  26. package/dist/src/config/config.js +159 -6
  27. package/dist/src/config/config.js.map +1 -1
  28. package/dist/src/config/endpoints.d.ts +60 -0
  29. package/dist/src/config/endpoints.js +126 -0
  30. package/dist/src/config/endpoints.js.map +1 -0
  31. package/dist/src/config/profileManager.d.ts +14 -4
  32. package/dist/src/config/profileManager.js +90 -11
  33. package/dist/src/config/profileManager.js.map +1 -1
  34. package/dist/src/core/client.js +16 -16
  35. package/dist/src/core/client.js.map +1 -1
  36. package/dist/src/core/contentGenerator.d.ts +4 -1
  37. package/dist/src/core/contentGenerator.js +3 -0
  38. package/dist/src/core/contentGenerator.js.map +1 -1
  39. package/dist/src/core/logger.d.ts +1 -0
  40. package/dist/src/core/logger.js +18 -0
  41. package/dist/src/core/logger.js.map +1 -1
  42. package/dist/src/core/loggingContentGenerator.d.ts +24 -0
  43. package/dist/src/core/loggingContentGenerator.js +89 -0
  44. package/dist/src/core/loggingContentGenerator.js.map +1 -0
  45. package/dist/src/core/nonInteractiveToolExecutor.js +17 -0
  46. package/dist/src/core/nonInteractiveToolExecutor.js.map +1 -1
  47. package/dist/src/core/subagent.js +12 -10
  48. package/dist/src/core/subagent.js.map +1 -1
  49. package/dist/src/ide/ide-client.d.ts +2 -2
  50. package/dist/src/ide/ide-client.js +56 -18
  51. package/dist/src/ide/ide-client.js.map +1 -1
  52. package/dist/src/index.d.ts +11 -0
  53. package/dist/src/index.js +12 -0
  54. package/dist/src/index.js.map +1 -1
  55. package/dist/src/providers/BaseProvider.d.ts +149 -0
  56. package/dist/src/providers/BaseProvider.js +315 -0
  57. package/dist/src/providers/BaseProvider.js.map +1 -0
  58. package/dist/src/providers/IProvider.d.ts +1 -0
  59. package/dist/src/providers/IProviderManager.d.ts +5 -0
  60. package/dist/src/providers/LoggingProviderWrapper.d.ts +54 -0
  61. package/dist/src/providers/LoggingProviderWrapper.js +350 -0
  62. package/dist/src/providers/LoggingProviderWrapper.js.map +1 -0
  63. package/dist/src/providers/ProviderManager.d.ts +20 -1
  64. package/dist/src/providers/ProviderManager.js +236 -14
  65. package/dist/src/providers/ProviderManager.js.map +1 -1
  66. package/dist/src/providers/anthropic/AnthropicProvider.d.ts +20 -6
  67. package/dist/src/providers/anthropic/AnthropicProvider.js +172 -26
  68. package/dist/src/providers/anthropic/AnthropicProvider.js.map +1 -1
  69. package/dist/src/providers/gemini/GeminiProvider.d.ts +16 -7
  70. package/dist/src/providers/gemini/GeminiProvider.js +163 -148
  71. package/dist/src/providers/gemini/GeminiProvider.js.map +1 -1
  72. package/dist/src/providers/logging/ProviderContentExtractor.d.ts +27 -0
  73. package/dist/src/providers/logging/ProviderContentExtractor.js +198 -0
  74. package/dist/src/providers/logging/ProviderContentExtractor.js.map +1 -0
  75. package/dist/src/providers/logging/ProviderPerformanceTracker.d.ts +43 -0
  76. package/dist/src/providers/logging/ProviderPerformanceTracker.js +98 -0
  77. package/dist/src/providers/logging/ProviderPerformanceTracker.js.map +1 -0
  78. package/dist/src/providers/openai/OpenAIProvider.d.ts +53 -6
  79. package/dist/src/providers/openai/OpenAIProvider.js +373 -40
  80. package/dist/src/providers/openai/OpenAIProvider.js.map +1 -1
  81. package/dist/src/providers/openai/RESPONSES_API_MODELS.d.ts +1 -1
  82. package/dist/src/providers/openai/RESPONSES_API_MODELS.js +1 -0
  83. package/dist/src/providers/openai/RESPONSES_API_MODELS.js.map +1 -1
  84. package/dist/src/providers/openai/syntheticToolResponses.d.ts +52 -0
  85. package/dist/src/providers/openai/syntheticToolResponses.js +129 -0
  86. package/dist/src/providers/openai/syntheticToolResponses.js.map +1 -0
  87. package/dist/src/providers/types.d.ts +47 -0
  88. package/dist/src/services/git-stats-service.d.ts +32 -0
  89. package/dist/src/services/git-stats-service.js +22 -0
  90. package/dist/src/services/git-stats-service.js.map +1 -0
  91. package/dist/src/services/loopDetectionService.js +10 -6
  92. package/dist/src/services/loopDetectionService.js.map +1 -1
  93. package/dist/src/services/shellExecutionService.js +44 -8
  94. package/dist/src/services/shellExecutionService.js.map +1 -1
  95. package/dist/src/settings/SettingsService.d.ts +32 -0
  96. package/dist/src/settings/SettingsService.js +204 -0
  97. package/dist/src/settings/SettingsService.js.map +1 -0
  98. package/dist/src/settings/settingsServiceInstance.d.ts +12 -0
  99. package/dist/src/settings/settingsServiceInstance.js +24 -0
  100. package/dist/src/settings/settingsServiceInstance.js.map +1 -0
  101. package/dist/src/settings/types.d.ts +141 -0
  102. package/dist/src/settings/types.js +5 -0
  103. package/dist/src/settings/types.js.map +1 -0
  104. package/dist/src/storage/ConversationFileWriter.d.ts +16 -0
  105. package/dist/src/storage/ConversationFileWriter.js +69 -0
  106. package/dist/src/storage/ConversationFileWriter.js.map +1 -0
  107. package/dist/src/telemetry/clearcut-logger/clearcut-logger.d.ts +8 -0
  108. package/dist/src/telemetry/clearcut-logger/clearcut-logger.js +56 -3
  109. package/dist/src/telemetry/clearcut-logger/clearcut-logger.js.map +1 -1
  110. package/dist/src/telemetry/clearcut-logger/event-metadata-key.d.ts +5 -1
  111. package/dist/src/telemetry/clearcut-logger/event-metadata-key.js +11 -0
  112. package/dist/src/telemetry/clearcut-logger/event-metadata-key.js.map +1 -1
  113. package/dist/src/telemetry/constants.d.ts +5 -0
  114. package/dist/src/telemetry/constants.js +5 -0
  115. package/dist/src/telemetry/constants.js.map +1 -1
  116. package/dist/src/telemetry/loggers.d.ts +5 -1
  117. package/dist/src/telemetry/loggers.js +87 -1
  118. package/dist/src/telemetry/loggers.js.map +1 -1
  119. package/dist/src/telemetry/metrics.d.ts +2 -1
  120. package/dist/src/telemetry/metrics.js +7 -1
  121. package/dist/src/telemetry/metrics.js.map +1 -1
  122. package/dist/src/telemetry/tool-call-decision.d.ts +13 -0
  123. package/dist/src/telemetry/tool-call-decision.js +29 -0
  124. package/dist/src/telemetry/tool-call-decision.js.map +1 -0
  125. package/dist/src/telemetry/types.d.ts +56 -1
  126. package/dist/src/telemetry/types.js +123 -0
  127. package/dist/src/telemetry/types.js.map +1 -1
  128. package/dist/src/telemetry/uiTelemetry.d.ts +2 -1
  129. package/dist/src/telemetry/uiTelemetry.js +1 -1
  130. package/dist/src/telemetry/uiTelemetry.js.map +1 -1
  131. package/dist/src/tools/diffOptions.d.ts +2 -0
  132. package/dist/src/tools/diffOptions.js +28 -0
  133. package/dist/src/tools/diffOptions.js.map +1 -1
  134. package/dist/src/tools/edit.d.ts +8 -32
  135. package/dist/src/tools/edit.js +153 -136
  136. package/dist/src/tools/edit.js.map +1 -1
  137. package/dist/src/tools/glob.d.ts +3 -10
  138. package/dist/src/tools/glob.js +97 -99
  139. package/dist/src/tools/glob.js.map +1 -1
  140. package/dist/src/tools/grep.d.ts +3 -35
  141. package/dist/src/tools/grep.js +117 -88
  142. package/dist/src/tools/grep.js.map +1 -1
  143. package/dist/src/tools/mcp-client.d.ts +4 -3
  144. package/dist/src/tools/mcp-client.js +23 -6
  145. package/dist/src/tools/mcp-client.js.map +1 -1
  146. package/dist/src/tools/read-file.js +37 -9
  147. package/dist/src/tools/read-file.js.map +1 -1
  148. package/dist/src/tools/todo-pause.d.ts +22 -0
  149. package/dist/src/tools/todo-pause.js +93 -0
  150. package/dist/src/tools/todo-pause.js.map +1 -0
  151. package/dist/src/tools/tool-error.d.ts +4 -0
  152. package/dist/src/tools/tool-error.js +4 -0
  153. package/dist/src/tools/tool-error.js.map +1 -1
  154. package/dist/src/tools/tool-registry.js +3 -3
  155. package/dist/src/tools/tool-registry.js.map +1 -1
  156. package/dist/src/tools/tools.d.ts +18 -0
  157. package/dist/src/tools/tools.js +15 -0
  158. package/dist/src/tools/tools.js.map +1 -1
  159. package/dist/src/tools/write-file.d.ts +4 -0
  160. package/dist/src/tools/write-file.js +90 -16
  161. package/dist/src/tools/write-file.js.map +1 -1
  162. package/dist/src/types/modelParams.d.ts +2 -0
  163. package/dist/src/utils/environmentContext.js +1 -1
  164. package/dist/src/utils/errors.d.ts +3 -0
  165. package/dist/src/utils/errors.js +6 -0
  166. package/dist/src/utils/errors.js.map +1 -1
  167. package/dist/src/utils/fileUtils.d.ts +7 -0
  168. package/dist/src/utils/fileUtils.js +9 -0
  169. package/dist/src/utils/fileUtils.js.map +1 -1
  170. package/dist/src/utils/filesearch/fileSearch.d.ts +1 -0
  171. package/dist/src/utils/filesearch/fileSearch.js +27 -19
  172. package/dist/src/utils/filesearch/fileSearch.js.map +1 -1
  173. package/package.json +4 -2
  174. package/dist/src/code_assist/converter.test.d.ts +0 -6
  175. package/dist/src/code_assist/converter.test.js +0 -232
  176. package/dist/src/code_assist/converter.test.js.map +0 -1
  177. package/dist/src/code_assist/oauth2.test.d.ts +0 -6
  178. package/dist/src/code_assist/oauth2.test.js +0 -370
  179. package/dist/src/code_assist/oauth2.test.js.map +0 -1
  180. package/dist/src/code_assist/server.test.d.ts +0 -6
  181. package/dist/src/code_assist/server.test.js +0 -131
  182. package/dist/src/code_assist/server.test.js.map +0 -1
  183. package/dist/src/code_assist/setup.test.d.ts +0 -6
  184. package/dist/src/code_assist/setup.test.js +0 -65
  185. package/dist/src/code_assist/setup.test.js.map +0 -1
  186. package/dist/src/config/config.alwaysAllow.test.d.ts +0 -6
  187. package/dist/src/config/config.alwaysAllow.test.js +0 -84
  188. package/dist/src/config/config.alwaysAllow.test.js.map +0 -1
  189. package/dist/src/config/config.test.d.ts +0 -6
  190. package/dist/src/config/config.test.js +0 -361
  191. package/dist/src/config/config.test.js.map +0 -1
  192. package/dist/src/config/flashFallback.test.d.ts +0 -6
  193. package/dist/src/config/flashFallback.test.js +0 -91
  194. package/dist/src/config/flashFallback.test.js.map +0 -1
  195. package/dist/src/core/client.test.d.ts +0 -6
  196. package/dist/src/core/client.test.js +0 -1317
  197. package/dist/src/core/client.test.js.map +0 -1
  198. package/dist/src/core/contentGenerator.test.d.ts +0 -6
  199. package/dist/src/core/contentGenerator.test.js +0 -103
  200. package/dist/src/core/contentGenerator.test.js.map +0 -1
  201. package/dist/src/core/coreToolScheduler.test.d.ts +0 -6
  202. package/dist/src/core/coreToolScheduler.test.js +0 -637
  203. package/dist/src/core/coreToolScheduler.test.js.map +0 -1
  204. package/dist/src/core/geminiChat.test.d.ts +0 -6
  205. package/dist/src/core/geminiChat.test.js +0 -425
  206. package/dist/src/core/geminiChat.test.js.map +0 -1
  207. package/dist/src/core/googleGenAIWrapper.test.d.ts +0 -6
  208. package/dist/src/core/googleGenAIWrapper.test.js +0 -104
  209. package/dist/src/core/googleGenAIWrapper.test.js.map +0 -1
  210. package/dist/src/core/logger.test.d.ts +0 -6
  211. package/dist/src/core/logger.test.js +0 -438
  212. package/dist/src/core/logger.test.js.map +0 -1
  213. package/dist/src/core/nonInteractiveToolExecutor.test.d.ts +0 -6
  214. package/dist/src/core/nonInteractiveToolExecutor.test.js +0 -165
  215. package/dist/src/core/nonInteractiveToolExecutor.test.js.map +0 -1
  216. package/dist/src/core/prompts-async.test.d.ts +0 -6
  217. package/dist/src/core/prompts-async.test.js +0 -115
  218. package/dist/src/core/prompts-async.test.js.map +0 -1
  219. package/dist/src/core/prompts.test.d.ts +0 -6
  220. package/dist/src/core/prompts.test.js +0 -68
  221. package/dist/src/core/prompts.test.js.map +0 -1
  222. package/dist/src/core/subagent.test.d.ts +0 -6
  223. package/dist/src/core/subagent.test.js +0 -519
  224. package/dist/src/core/subagent.test.js.map +0 -1
  225. package/dist/src/core/tokenLimits.test.d.ts +0 -6
  226. package/dist/src/core/tokenLimits.test.js +0 -66
  227. package/dist/src/core/tokenLimits.test.js.map +0 -1
  228. package/dist/src/core/turn.test.d.ts +0 -6
  229. package/dist/src/core/turn.test.js +0 -366
  230. package/dist/src/core/turn.test.js.map +0 -1
  231. package/dist/src/hooks/tool-render-suppression-hook.test.d.ts +0 -6
  232. package/dist/src/hooks/tool-render-suppression-hook.test.js +0 -59
  233. package/dist/src/hooks/tool-render-suppression-hook.test.js.map +0 -1
  234. package/dist/src/ide/ide-installer.test.d.ts +0 -6
  235. package/dist/src/ide/ide-installer.test.js +0 -55
  236. package/dist/src/ide/ide-installer.test.js.map +0 -1
  237. package/dist/src/ide/ideContext.test.d.ts +0 -6
  238. package/dist/src/ide/ideContext.test.js +0 -265
  239. package/dist/src/ide/ideContext.test.js.map +0 -1
  240. package/dist/src/index.test.d.ts +0 -6
  241. package/dist/src/index.test.js +0 -12
  242. package/dist/src/index.test.js.map +0 -1
  243. package/dist/src/integration-tests/todo-system.test.d.ts +0 -6
  244. package/dist/src/integration-tests/todo-system.test.js +0 -46
  245. package/dist/src/integration-tests/todo-system.test.js.map +0 -1
  246. package/dist/src/mcp/google-auth-provider.test.d.ts +0 -6
  247. package/dist/src/mcp/google-auth-provider.test.js +0 -54
  248. package/dist/src/mcp/google-auth-provider.test.js.map +0 -1
  249. package/dist/src/mcp/oauth-provider.test.d.ts +0 -6
  250. package/dist/src/mcp/oauth-provider.test.js +0 -602
  251. package/dist/src/mcp/oauth-provider.test.js.map +0 -1
  252. package/dist/src/mcp/oauth-token-storage.test.d.ts +0 -6
  253. package/dist/src/mcp/oauth-token-storage.test.js +0 -205
  254. package/dist/src/mcp/oauth-token-storage.test.js.map +0 -1
  255. package/dist/src/mcp/oauth-utils.test.d.ts +0 -6
  256. package/dist/src/mcp/oauth-utils.test.js +0 -144
  257. package/dist/src/mcp/oauth-utils.test.js.map +0 -1
  258. package/dist/src/parsers/TextToolCallParser.multibyte.test.d.ts +0 -1
  259. package/dist/src/parsers/TextToolCallParser.multibyte.test.js +0 -42
  260. package/dist/src/parsers/TextToolCallParser.multibyte.test.js.map +0 -1
  261. package/dist/src/parsers/TextToolCallParser.test.d.ts +0 -1
  262. package/dist/src/parsers/TextToolCallParser.test.js +0 -225
  263. package/dist/src/parsers/TextToolCallParser.test.js.map +0 -1
  264. package/dist/src/prompt-config/TemplateEngine.test.d.ts +0 -1
  265. package/dist/src/prompt-config/TemplateEngine.test.js +0 -494
  266. package/dist/src/prompt-config/TemplateEngine.test.js.map +0 -1
  267. package/dist/src/prompt-config/prompt-cache.test.d.ts +0 -6
  268. package/dist/src/prompt-config/prompt-cache.test.js +0 -437
  269. package/dist/src/prompt-config/prompt-cache.test.js.map +0 -1
  270. package/dist/src/prompt-config/prompt-installer.test.d.ts +0 -7
  271. package/dist/src/prompt-config/prompt-installer.test.js +0 -503
  272. package/dist/src/prompt-config/prompt-installer.test.js.map +0 -1
  273. package/dist/src/prompt-config/prompt-loader.test.d.ts +0 -5
  274. package/dist/src/prompt-config/prompt-loader.test.js +0 -413
  275. package/dist/src/prompt-config/prompt-loader.test.js.map +0 -1
  276. package/dist/src/prompt-config/prompt-resolver.test.d.ts +0 -1
  277. package/dist/src/prompt-config/prompt-resolver.test.js +0 -529
  278. package/dist/src/prompt-config/prompt-resolver.test.js.map +0 -1
  279. package/dist/src/prompt-config/prompt-service.test.d.ts +0 -1
  280. package/dist/src/prompt-config/prompt-service.test.js +0 -811
  281. package/dist/src/prompt-config/prompt-service.test.js.map +0 -1
  282. package/dist/src/providers/ProviderManager.gemini-switch.test.d.ts +0 -6
  283. package/dist/src/providers/ProviderManager.gemini-switch.test.js +0 -57
  284. package/dist/src/providers/ProviderManager.gemini-switch.test.js.map +0 -1
  285. package/dist/src/providers/ProviderManager.test.d.ts +0 -6
  286. package/dist/src/providers/ProviderManager.test.js +0 -284
  287. package/dist/src/providers/ProviderManager.test.js.map +0 -1
  288. package/dist/src/providers/adapters/GeminiCompatibleWrapper.test.d.ts +0 -6
  289. package/dist/src/providers/adapters/GeminiCompatibleWrapper.test.js +0 -273
  290. package/dist/src/providers/adapters/GeminiCompatibleWrapper.test.js.map +0 -1
  291. package/dist/src/providers/anthropic/AnthropicProvider.modelParams.test.d.ts +0 -1
  292. package/dist/src/providers/anthropic/AnthropicProvider.modelParams.test.js +0 -48
  293. package/dist/src/providers/anthropic/AnthropicProvider.modelParams.test.js.map +0 -1
  294. package/dist/src/providers/anthropic/AnthropicProvider.test.d.ts +0 -1
  295. package/dist/src/providers/anthropic/AnthropicProvider.test.js +0 -487
  296. package/dist/src/providers/anthropic/AnthropicProvider.test.js.map +0 -1
  297. package/dist/src/providers/gemini/GeminiProvider.integration.test.d.ts +0 -6
  298. package/dist/src/providers/gemini/GeminiProvider.integration.test.js +0 -126
  299. package/dist/src/providers/gemini/GeminiProvider.integration.test.js.map +0 -1
  300. package/dist/src/providers/gemini/GeminiProvider.test.d.ts +0 -6
  301. package/dist/src/providers/gemini/GeminiProvider.test.js +0 -136
  302. package/dist/src/providers/gemini/GeminiProvider.test.js.map +0 -1
  303. package/dist/src/providers/integration/multi-provider.integration.test.d.ts +0 -6
  304. package/dist/src/providers/integration/multi-provider.integration.test.js +0 -292
  305. package/dist/src/providers/integration/multi-provider.integration.test.js.map +0 -1
  306. package/dist/src/providers/openai/ConversationCache.accumTokens.test.d.ts +0 -1
  307. package/dist/src/providers/openai/ConversationCache.accumTokens.test.js +0 -97
  308. package/dist/src/providers/openai/ConversationCache.accumTokens.test.js.map +0 -1
  309. package/dist/src/providers/openai/ConversationCache.test.d.ts +0 -1
  310. package/dist/src/providers/openai/ConversationCache.test.js +0 -113
  311. package/dist/src/providers/openai/ConversationCache.test.js.map +0 -1
  312. package/dist/src/providers/openai/OpenAIProvider.callResponses.stateless.test.d.ts +0 -1
  313. package/dist/src/providers/openai/OpenAIProvider.callResponses.stateless.test.js +0 -189
  314. package/dist/src/providers/openai/OpenAIProvider.callResponses.stateless.test.js.map +0 -1
  315. package/dist/src/providers/openai/OpenAIProvider.integration.test.d.ts +0 -6
  316. package/dist/src/providers/openai/OpenAIProvider.integration.test.js +0 -125
  317. package/dist/src/providers/openai/OpenAIProvider.integration.test.js.map +0 -1
  318. package/dist/src/providers/openai/OpenAIProvider.responses.test.d.ts +0 -1
  319. package/dist/src/providers/openai/OpenAIProvider.responses.test.js +0 -350
  320. package/dist/src/providers/openai/OpenAIProvider.responses.test.js.map +0 -1
  321. package/dist/src/providers/openai/OpenAIProvider.responsesIntegration.test.d.ts +0 -1
  322. package/dist/src/providers/openai/OpenAIProvider.responsesIntegration.test.js +0 -213
  323. package/dist/src/providers/openai/OpenAIProvider.responsesIntegration.test.js.map +0 -1
  324. package/dist/src/providers/openai/OpenAIProvider.shouldUseResponses.test.d.ts +0 -1
  325. package/dist/src/providers/openai/OpenAIProvider.shouldUseResponses.test.js +0 -59
  326. package/dist/src/providers/openai/OpenAIProvider.shouldUseResponses.test.js.map +0 -1
  327. package/dist/src/providers/openai/OpenAIProvider.stateful.integration.test.d.ts +0 -6
  328. package/dist/src/providers/openai/OpenAIProvider.stateful.integration.test.js +0 -105
  329. package/dist/src/providers/openai/OpenAIProvider.stateful.integration.test.js.map +0 -1
  330. package/dist/src/providers/openai/OpenAIProvider.switch.test.d.ts +0 -1
  331. package/dist/src/providers/openai/OpenAIProvider.switch.test.js +0 -256
  332. package/dist/src/providers/openai/OpenAIProvider.switch.test.js.map +0 -1
  333. package/dist/src/providers/openai/OpenAIProvider.test.d.ts +0 -16
  334. package/dist/src/providers/openai/OpenAIProvider.test.js +0 -620
  335. package/dist/src/providers/openai/OpenAIProvider.test.js.map +0 -1
  336. package/dist/src/providers/openai/ResponsesContextTrim.integration.test.d.ts +0 -1
  337. package/dist/src/providers/openai/ResponsesContextTrim.integration.test.js +0 -210
  338. package/dist/src/providers/openai/ResponsesContextTrim.integration.test.js.map +0 -1
  339. package/dist/src/providers/openai/__tests__/formatArrayResponse.test.d.ts +0 -1
  340. package/dist/src/providers/openai/__tests__/formatArrayResponse.test.js +0 -65
  341. package/dist/src/providers/openai/__tests__/formatArrayResponse.test.js.map +0 -1
  342. package/dist/src/providers/openai/buildResponsesRequest.stripToolCalls.test.d.ts +0 -1
  343. package/dist/src/providers/openai/buildResponsesRequest.stripToolCalls.test.js +0 -129
  344. package/dist/src/providers/openai/buildResponsesRequest.stripToolCalls.test.js.map +0 -1
  345. package/dist/src/providers/openai/buildResponsesRequest.test.d.ts +0 -1
  346. package/dist/src/providers/openai/buildResponsesRequest.test.js +0 -406
  347. package/dist/src/providers/openai/buildResponsesRequest.test.js.map +0 -1
  348. package/dist/src/providers/openai/buildResponsesRequest.undefined.test.d.ts +0 -1
  349. package/dist/src/providers/openai/buildResponsesRequest.undefined.test.js +0 -50
  350. package/dist/src/providers/openai/buildResponsesRequest.undefined.test.js.map +0 -1
  351. package/dist/src/providers/openai/estimateRemoteTokens.test.d.ts +0 -1
  352. package/dist/src/providers/openai/estimateRemoteTokens.test.js +0 -125
  353. package/dist/src/providers/openai/estimateRemoteTokens.test.js.map +0 -1
  354. package/dist/src/providers/openai/parseResponsesStream.responsesToolCalls.test.d.ts +0 -1
  355. package/dist/src/providers/openai/parseResponsesStream.responsesToolCalls.test.js +0 -192
  356. package/dist/src/providers/openai/parseResponsesStream.responsesToolCalls.test.js.map +0 -1
  357. package/dist/src/providers/openai/parseResponsesStream.test.d.ts +0 -1
  358. package/dist/src/providers/openai/parseResponsesStream.test.js +0 -151
  359. package/dist/src/providers/openai/parseResponsesStream.test.js.map +0 -1
  360. package/dist/src/services/fileDiscoveryService.test.d.ts +0 -6
  361. package/dist/src/services/fileDiscoveryService.test.js +0 -143
  362. package/dist/src/services/fileDiscoveryService.test.js.map +0 -1
  363. package/dist/src/services/gitService.test.d.ts +0 -6
  364. package/dist/src/services/gitService.test.js +0 -209
  365. package/dist/src/services/gitService.test.js.map +0 -1
  366. package/dist/src/services/loopDetectionService.test.d.ts +0 -6
  367. package/dist/src/services/loopDetectionService.test.js +0 -345
  368. package/dist/src/services/loopDetectionService.test.js.map +0 -1
  369. package/dist/src/services/shellExecutionService.multibyte.test.d.ts +0 -6
  370. package/dist/src/services/shellExecutionService.multibyte.test.js +0 -72
  371. package/dist/src/services/shellExecutionService.multibyte.test.js.map +0 -1
  372. package/dist/src/services/shellExecutionService.test.d.ts +0 -6
  373. package/dist/src/services/shellExecutionService.test.js +0 -272
  374. package/dist/src/services/shellExecutionService.test.js.map +0 -1
  375. package/dist/src/services/shellExecutionService.windows.multibyte.test.d.ts +0 -6
  376. package/dist/src/services/shellExecutionService.windows.multibyte.test.js +0 -98
  377. package/dist/src/services/shellExecutionService.windows.multibyte.test.js.map +0 -1
  378. package/dist/src/services/shellExecutionService.windows.test.d.ts +0 -6
  379. package/dist/src/services/shellExecutionService.windows.test.js +0 -79
  380. package/dist/src/services/shellExecutionService.windows.test.js.map +0 -1
  381. package/dist/src/services/tool-call-tracker-service.test.d.ts +0 -6
  382. package/dist/src/services/tool-call-tracker-service.test.js +0 -99
  383. package/dist/src/services/tool-call-tracker-service.test.js.map +0 -1
  384. package/dist/src/telemetry/loggers.test.d.ts +0 -6
  385. package/dist/src/telemetry/loggers.test.js +0 -572
  386. package/dist/src/telemetry/loggers.test.js.map +0 -1
  387. package/dist/src/telemetry/metrics.test.d.ts +0 -6
  388. package/dist/src/telemetry/metrics.test.js +0 -162
  389. package/dist/src/telemetry/metrics.test.js.map +0 -1
  390. package/dist/src/telemetry/telemetry.test.d.ts +0 -6
  391. package/dist/src/telemetry/telemetry.test.js +0 -54
  392. package/dist/src/telemetry/telemetry.test.js.map +0 -1
  393. package/dist/src/telemetry/uiTelemetry.test.d.ts +0 -6
  394. package/dist/src/telemetry/uiTelemetry.test.js +0 -517
  395. package/dist/src/telemetry/uiTelemetry.test.js.map +0 -1
  396. package/dist/src/tools/ToolFormatter.test.d.ts +0 -16
  397. package/dist/src/tools/ToolFormatter.test.js +0 -349
  398. package/dist/src/tools/ToolFormatter.test.js.map +0 -1
  399. package/dist/src/tools/ToolFormatter.toResponsesTool.test.d.ts +0 -1
  400. package/dist/src/tools/ToolFormatter.toResponsesTool.test.js +0 -241
  401. package/dist/src/tools/ToolFormatter.toResponsesTool.test.js.map +0 -1
  402. package/dist/src/tools/edit.test.d.ts +0 -6
  403. package/dist/src/tools/edit.test.js +0 -663
  404. package/dist/src/tools/edit.test.js.map +0 -1
  405. package/dist/src/tools/glob.test.d.ts +0 -6
  406. package/dist/src/tools/glob.test.js +0 -321
  407. package/dist/src/tools/glob.test.js.map +0 -1
  408. package/dist/src/tools/grep.test.d.ts +0 -6
  409. package/dist/src/tools/grep.test.js +0 -258
  410. package/dist/src/tools/grep.test.js.map +0 -1
  411. package/dist/src/tools/ls.test.d.ts +0 -6
  412. package/dist/src/tools/ls.test.js +0 -357
  413. package/dist/src/tools/ls.test.js.map +0 -1
  414. package/dist/src/tools/mcp-client.test.d.ts +0 -6
  415. package/dist/src/tools/mcp-client.test.js +0 -575
  416. package/dist/src/tools/mcp-client.test.js.map +0 -1
  417. package/dist/src/tools/mcp-tool.test.d.ts +0 -6
  418. package/dist/src/tools/mcp-tool.test.js +0 -501
  419. package/dist/src/tools/mcp-tool.test.js.map +0 -1
  420. package/dist/src/tools/memoryTool.test.d.ts +0 -6
  421. package/dist/src/tools/memoryTool.test.js +0 -266
  422. package/dist/src/tools/memoryTool.test.js.map +0 -1
  423. package/dist/src/tools/modifiable-tool.test.d.ts +0 -6
  424. package/dist/src/tools/modifiable-tool.test.js +0 -193
  425. package/dist/src/tools/modifiable-tool.test.js.map +0 -1
  426. package/dist/src/tools/read-file.test.d.ts +0 -6
  427. package/dist/src/tools/read-file.test.js +0 -313
  428. package/dist/src/tools/read-file.test.js.map +0 -1
  429. package/dist/src/tools/read-many-files.test.d.ts +0 -6
  430. package/dist/src/tools/read-many-files.test.js +0 -644
  431. package/dist/src/tools/read-many-files.test.js.map +0 -1
  432. package/dist/src/tools/shell.multibyte.test.d.ts +0 -6
  433. package/dist/src/tools/shell.multibyte.test.js +0 -75
  434. package/dist/src/tools/shell.multibyte.test.js.map +0 -1
  435. package/dist/src/tools/shell.test.d.ts +0 -6
  436. package/dist/src/tools/shell.test.js +0 -350
  437. package/dist/src/tools/shell.test.js.map +0 -1
  438. package/dist/src/tools/todo-read.test.d.ts +0 -6
  439. package/dist/src/tools/todo-read.test.js +0 -162
  440. package/dist/src/tools/todo-read.test.js.map +0 -1
  441. package/dist/src/tools/todo-schemas.test.d.ts +0 -6
  442. package/dist/src/tools/todo-schemas.test.js +0 -341
  443. package/dist/src/tools/todo-schemas.test.js.map +0 -1
  444. package/dist/src/tools/todo-store.test.d.ts +0 -6
  445. package/dist/src/tools/todo-store.test.js +0 -169
  446. package/dist/src/tools/todo-store.test.js.map +0 -1
  447. package/dist/src/tools/todo-write.test.d.ts +0 -6
  448. package/dist/src/tools/todo-write.test.js +0 -226
  449. package/dist/src/tools/todo-write.test.js.map +0 -1
  450. package/dist/src/tools/tool-registry.test.d.ts +0 -6
  451. package/dist/src/tools/tool-registry.test.js +0 -468
  452. package/dist/src/tools/tool-registry.test.js.map +0 -1
  453. package/dist/src/tools/tools.test.d.ts +0 -6
  454. package/dist/src/tools/tools.test.js +0 -117
  455. package/dist/src/tools/tools.test.js.map +0 -1
  456. package/dist/src/tools/web-fetch.integration.test.d.ts +0 -6
  457. package/dist/src/tools/web-fetch.integration.test.js +0 -532
  458. package/dist/src/tools/web-fetch.integration.test.js.map +0 -1
  459. package/dist/src/tools/web-search.test.d.ts +0 -6
  460. package/dist/src/tools/web-search.test.js +0 -229
  461. package/dist/src/tools/web-search.test.js.map +0 -1
  462. package/dist/src/tools/write-file.test.d.ts +0 -6
  463. package/dist/src/tools/write-file.test.js +0 -464
  464. package/dist/src/tools/write-file.test.js.map +0 -1
  465. package/dist/src/utils/bfsFileSearch.test.d.ts +0 -6
  466. package/dist/src/utils/bfsFileSearch.test.js +0 -191
  467. package/dist/src/utils/bfsFileSearch.test.js.map +0 -1
  468. package/dist/src/utils/editCorrector.test.d.ts +0 -6
  469. package/dist/src/utils/editCorrector.test.js +0 -564
  470. package/dist/src/utils/editCorrector.test.js.map +0 -1
  471. package/dist/src/utils/editor.test.d.ts +0 -6
  472. package/dist/src/utils/editor.test.js +0 -445
  473. package/dist/src/utils/editor.test.js.map +0 -1
  474. package/dist/src/utils/environmentContext.test.d.ts +0 -6
  475. package/dist/src/utils/environmentContext.test.js +0 -139
  476. package/dist/src/utils/environmentContext.test.js.map +0 -1
  477. package/dist/src/utils/errorReporting.test.d.ts +0 -6
  478. package/dist/src/utils/errorReporting.test.js +0 -130
  479. package/dist/src/utils/errorReporting.test.js.map +0 -1
  480. package/dist/src/utils/fileUtils.test.d.ts +0 -6
  481. package/dist/src/utils/fileUtils.test.js +0 -363
  482. package/dist/src/utils/fileUtils.test.js.map +0 -1
  483. package/dist/src/utils/filesearch/crawlCache.test.d.ts +0 -6
  484. package/dist/src/utils/filesearch/crawlCache.test.js +0 -103
  485. package/dist/src/utils/filesearch/crawlCache.test.js.map +0 -1
  486. package/dist/src/utils/filesearch/fileSearch.test.d.ts +0 -6
  487. package/dist/src/utils/filesearch/fileSearch.test.js +0 -654
  488. package/dist/src/utils/filesearch/fileSearch.test.js.map +0 -1
  489. package/dist/src/utils/filesearch/ignore.test.d.ts +0 -6
  490. package/dist/src/utils/filesearch/ignore.test.js +0 -57
  491. package/dist/src/utils/filesearch/ignore.test.js.map +0 -1
  492. package/dist/src/utils/filesearch/result-cache.test.d.ts +0 -6
  493. package/dist/src/utils/filesearch/result-cache.test.js +0 -47
  494. package/dist/src/utils/filesearch/result-cache.test.js.map +0 -1
  495. package/dist/src/utils/flashFallback.integration.test.d.ts +0 -6
  496. package/dist/src/utils/flashFallback.integration.test.js +0 -120
  497. package/dist/src/utils/flashFallback.integration.test.js.map +0 -1
  498. package/dist/src/utils/generateContentResponseUtilities.test.d.ts +0 -6
  499. package/dist/src/utils/generateContentResponseUtilities.test.js +0 -273
  500. package/dist/src/utils/generateContentResponseUtilities.test.js.map +0 -1
  501. package/dist/src/utils/getFolderStructure.test.d.ts +0 -6
  502. package/dist/src/utils/getFolderStructure.test.js +0 -282
  503. package/dist/src/utils/getFolderStructure.test.js.map +0 -1
  504. package/dist/src/utils/gitIgnoreParser.test.d.ts +0 -6
  505. package/dist/src/utils/gitIgnoreParser.test.js +0 -154
  506. package/dist/src/utils/gitIgnoreParser.test.js.map +0 -1
  507. package/dist/src/utils/memoryDiscovery.test.d.ts +0 -6
  508. package/dist/src/utils/memoryDiscovery.test.js +0 -181
  509. package/dist/src/utils/memoryDiscovery.test.js.map +0 -1
  510. package/dist/src/utils/memoryImportProcessor.test.d.ts +0 -6
  511. package/dist/src/utils/memoryImportProcessor.test.js +0 -715
  512. package/dist/src/utils/memoryImportProcessor.test.js.map +0 -1
  513. package/dist/src/utils/nextSpeakerChecker.test.d.ts +0 -6
  514. package/dist/src/utils/nextSpeakerChecker.test.js +0 -172
  515. package/dist/src/utils/nextSpeakerChecker.test.js.map +0 -1
  516. package/dist/src/utils/partUtils.test.d.ts +0 -6
  517. package/dist/src/utils/partUtils.test.js +0 -130
  518. package/dist/src/utils/partUtils.test.js.map +0 -1
  519. package/dist/src/utils/paths.test.d.ts +0 -6
  520. package/dist/src/utils/paths.test.js +0 -153
  521. package/dist/src/utils/paths.test.js.map +0 -1
  522. package/dist/src/utils/retry.test.d.ts +0 -6
  523. package/dist/src/utils/retry.test.js +0 -322
  524. package/dist/src/utils/retry.test.js.map +0 -1
  525. package/dist/src/utils/safeJsonStringify.test.d.ts +0 -6
  526. package/dist/src/utils/safeJsonStringify.test.js +0 -61
  527. package/dist/src/utils/safeJsonStringify.test.js.map +0 -1
  528. package/dist/src/utils/sanitization.test.d.ts +0 -6
  529. package/dist/src/utils/sanitization.test.js +0 -81
  530. package/dist/src/utils/sanitization.test.js.map +0 -1
  531. package/dist/src/utils/schemaValidator.test.d.ts +0 -6
  532. package/dist/src/utils/schemaValidator.test.js +0 -146
  533. package/dist/src/utils/schemaValidator.test.js.map +0 -1
  534. package/dist/src/utils/secure-browser-launcher.test.d.ts +0 -6
  535. package/dist/src/utils/secure-browser-launcher.test.js +0 -149
  536. package/dist/src/utils/secure-browser-launcher.test.js.map +0 -1
  537. package/dist/src/utils/shell-utils.shellReplacement.test.d.ts +0 -6
  538. package/dist/src/utils/shell-utils.shellReplacement.test.js +0 -149
  539. package/dist/src/utils/shell-utils.shellReplacement.test.js.map +0 -1
  540. package/dist/src/utils/shell-utils.test.d.ts +0 -6
  541. package/dist/src/utils/shell-utils.test.js +0 -200
  542. package/dist/src/utils/shell-utils.test.js.map +0 -1
  543. package/dist/src/utils/summarizer.test.d.ts +0 -6
  544. package/dist/src/utils/summarizer.test.js +0 -131
  545. package/dist/src/utils/summarizer.test.js.map +0 -1
  546. package/dist/src/utils/systemEncoding.test.d.ts +0 -6
  547. package/dist/src/utils/systemEncoding.test.js +0 -368
  548. package/dist/src/utils/systemEncoding.test.js.map +0 -1
  549. package/dist/src/utils/toolOutputLimiter.test.d.ts +0 -6
  550. package/dist/src/utils/toolOutputLimiter.test.js +0 -164
  551. package/dist/src/utils/toolOutputLimiter.test.js.map +0 -1
  552. package/dist/src/utils/unicodeUtils.test.d.ts +0 -6
  553. package/dist/src/utils/unicodeUtils.test.js +0 -120
  554. package/dist/src/utils/unicodeUtils.test.js.map +0 -1
  555. package/dist/src/utils/user_account.test.d.ts +0 -6
  556. package/dist/src/utils/user_account.test.js +0 -153
  557. package/dist/src/utils/user_account.test.js.map +0 -1
  558. package/dist/src/utils/user_id.test.d.ts +0 -6
  559. package/dist/src/utils/user_id.test.js +0 -21
  560. package/dist/src/utils/user_id.test.js.map +0 -1
  561. package/dist/src/utils/workspaceContext.test.d.ts +0 -6
  562. package/dist/src/utils/workspaceContext.test.js +0 -209
  563. package/dist/src/utils/workspaceContext.test.js.map +0 -1
@@ -1,438 +0,0 @@
1
- /**
2
- * @license
3
- * Copyright 2025 Google LLC
4
- * SPDX-License-Identifier: Apache-2.0
5
- */
6
- import { describe, it, expect, vi, beforeEach, afterEach, afterAll, } from 'vitest';
7
- import { Logger, MessageSenderType } from './logger.js';
8
- import { promises as fs } from 'node:fs';
9
- import path from 'node:path';
10
- import crypto from 'node:crypto';
11
- import os from 'node:os';
12
- const LLXPRT_DIR_NAME = '.llxprt';
13
- const TMP_DIR_NAME = 'tmp';
14
- const LOG_FILE_NAME = 'logs.json';
15
- const CHECKPOINT_FILE_NAME = 'checkpoint.json';
16
- const projectDir = process.cwd();
17
- const hash = crypto.createHash('sha256').update(projectDir).digest('hex');
18
- const TEST_LLXPRT_DIR = path.join(os.homedir(), LLXPRT_DIR_NAME, TMP_DIR_NAME, hash);
19
- const TEST_LOG_FILE_PATH = path.join(TEST_LLXPRT_DIR, LOG_FILE_NAME);
20
- const TEST_CHECKPOINT_FILE_PATH = path.join(TEST_LLXPRT_DIR, CHECKPOINT_FILE_NAME);
21
- async function cleanupLogAndCheckpointFiles() {
22
- try {
23
- await fs.rm(TEST_LLXPRT_DIR, { recursive: true, force: true });
24
- }
25
- catch (_error) {
26
- // Ignore errors, as the directory may not exist, which is fine.
27
- }
28
- }
29
- async function readLogFile() {
30
- try {
31
- const content = await fs.readFile(TEST_LOG_FILE_PATH, 'utf-8');
32
- return JSON.parse(content);
33
- }
34
- catch (error) {
35
- if (error.code === 'ENOENT') {
36
- return [];
37
- }
38
- throw error;
39
- }
40
- }
41
- vi.mock('../utils/session.js', () => ({
42
- sessionId: 'test-session-id',
43
- }));
44
- describe('Logger', () => {
45
- let logger;
46
- const testSessionId = 'test-session-id';
47
- beforeEach(async () => {
48
- vi.resetAllMocks();
49
- vi.useFakeTimers();
50
- vi.setSystemTime(new Date('2025-01-01T12:00:00.000Z'));
51
- // Clean up before the test
52
- await cleanupLogAndCheckpointFiles();
53
- // Ensure the directory exists for the test
54
- await fs.mkdir(TEST_LLXPRT_DIR, { recursive: true });
55
- logger = new Logger(testSessionId);
56
- await logger.initialize();
57
- });
58
- afterEach(async () => {
59
- if (logger) {
60
- logger.close();
61
- }
62
- // Clean up after the test
63
- await cleanupLogAndCheckpointFiles();
64
- vi.useRealTimers();
65
- vi.restoreAllMocks();
66
- });
67
- afterAll(async () => {
68
- // Final cleanup
69
- await cleanupLogAndCheckpointFiles();
70
- });
71
- describe('initialize', () => {
72
- it('should create .llxprt directory and an empty log file if none exist', async () => {
73
- const dirExists = await fs
74
- .access(TEST_LLXPRT_DIR)
75
- .then(() => true)
76
- .catch(() => false);
77
- expect(dirExists).toBe(true);
78
- const fileExists = await fs
79
- .access(TEST_LOG_FILE_PATH)
80
- .then(() => true)
81
- .catch(() => false);
82
- expect(fileExists).toBe(true);
83
- const logContent = await readLogFile();
84
- expect(logContent).toEqual([]);
85
- });
86
- it('should load existing logs and set correct messageId for the current session', async () => {
87
- const currentSessionId = 'session-123';
88
- const anotherSessionId = 'session-456';
89
- const existingLogs = [
90
- {
91
- sessionId: currentSessionId,
92
- messageId: 0,
93
- timestamp: new Date('2025-01-01T10:00:05.000Z').toISOString(),
94
- type: MessageSenderType.USER,
95
- message: 'Msg1',
96
- },
97
- {
98
- sessionId: anotherSessionId,
99
- messageId: 5,
100
- timestamp: new Date('2025-01-01T09:00:00.000Z').toISOString(),
101
- type: MessageSenderType.USER,
102
- message: 'OldMsg',
103
- },
104
- {
105
- sessionId: currentSessionId,
106
- messageId: 1,
107
- timestamp: new Date('2025-01-01T10:00:10.000Z').toISOString(),
108
- type: MessageSenderType.USER,
109
- message: 'Msg2',
110
- },
111
- ];
112
- await fs.writeFile(TEST_LOG_FILE_PATH, JSON.stringify(existingLogs, null, 2));
113
- const newLogger = new Logger(currentSessionId);
114
- await newLogger.initialize();
115
- expect(newLogger['messageId']).toBe(2);
116
- expect(newLogger['logs']).toEqual(existingLogs);
117
- newLogger.close();
118
- });
119
- it('should set messageId to 0 for a new session if log file exists but has no logs for current session', async () => {
120
- const existingLogs = [
121
- {
122
- sessionId: 'some-other-session',
123
- messageId: 5,
124
- timestamp: new Date().toISOString(),
125
- type: MessageSenderType.USER,
126
- message: 'OldMsg',
127
- },
128
- ];
129
- await fs.writeFile(TEST_LOG_FILE_PATH, JSON.stringify(existingLogs, null, 2));
130
- const newLogger = new Logger('a-new-session');
131
- await newLogger.initialize();
132
- expect(newLogger['messageId']).toBe(0);
133
- newLogger.close();
134
- });
135
- it('should be idempotent', async () => {
136
- await logger.logMessage(MessageSenderType.USER, 'test message');
137
- const initialMessageId = logger['messageId'];
138
- const initialLogCount = logger['logs'].length;
139
- await logger.initialize(); // Second call should not change state
140
- expect(logger['messageId']).toBe(initialMessageId);
141
- expect(logger['logs'].length).toBe(initialLogCount);
142
- const logsFromFile = await readLogFile();
143
- expect(logsFromFile.length).toBe(1);
144
- });
145
- it('should handle invalid JSON in log file by backing it up and starting fresh', async () => {
146
- await fs.writeFile(TEST_LOG_FILE_PATH, 'invalid json');
147
- const consoleDebugSpy = vi
148
- .spyOn(console, 'debug')
149
- .mockImplementation(() => { });
150
- const newLogger = new Logger(testSessionId);
151
- await newLogger.initialize();
152
- expect(consoleDebugSpy).toHaveBeenCalledWith(expect.stringContaining('Invalid JSON in log file'), expect.any(SyntaxError));
153
- const logContent = await readLogFile();
154
- expect(logContent).toEqual([]);
155
- const dirContents = await fs.readdir(TEST_LLXPRT_DIR);
156
- expect(dirContents.some((f) => f.startsWith(LOG_FILE_NAME + '.invalid_json') && f.endsWith('.bak'))).toBe(true);
157
- newLogger.close();
158
- });
159
- it('should handle non-array JSON in log file by backing it up and starting fresh', async () => {
160
- await fs.writeFile(TEST_LOG_FILE_PATH, JSON.stringify({ not: 'an array' }));
161
- const consoleDebugSpy = vi
162
- .spyOn(console, 'debug')
163
- .mockImplementation(() => { });
164
- const newLogger = new Logger(testSessionId);
165
- await newLogger.initialize();
166
- expect(consoleDebugSpy).toHaveBeenCalledWith(`Log file at ${TEST_LOG_FILE_PATH} is not a valid JSON array. Starting with empty logs.`);
167
- const logContent = await readLogFile();
168
- expect(logContent).toEqual([]);
169
- const dirContents = await fs.readdir(TEST_LLXPRT_DIR);
170
- expect(dirContents.some((f) => f.startsWith(LOG_FILE_NAME + '.malformed_array') &&
171
- f.endsWith('.bak'))).toBe(true);
172
- newLogger.close();
173
- });
174
- });
175
- describe('logMessage', () => {
176
- it('should append a message to the log file and update in-memory logs', async () => {
177
- await logger.logMessage(MessageSenderType.USER, 'Hello, world!');
178
- const logsFromFile = await readLogFile();
179
- expect(logsFromFile.length).toBe(1);
180
- expect(logsFromFile[0]).toMatchObject({
181
- sessionId: testSessionId,
182
- messageId: 0,
183
- type: MessageSenderType.USER,
184
- message: 'Hello, world!',
185
- timestamp: new Date('2025-01-01T12:00:00.000Z').toISOString(),
186
- });
187
- expect(logger['logs'].length).toBe(1);
188
- expect(logger['logs'][0]).toEqual(logsFromFile[0]);
189
- expect(logger['messageId']).toBe(1);
190
- });
191
- it('should correctly increment messageId for subsequent messages in the same session', async () => {
192
- await logger.logMessage(MessageSenderType.USER, 'First');
193
- vi.advanceTimersByTime(1000);
194
- await logger.logMessage(MessageSenderType.USER, 'Second');
195
- const logs = await readLogFile();
196
- expect(logs.length).toBe(2);
197
- expect(logs[0].messageId).toBe(0);
198
- expect(logs[1].messageId).toBe(1);
199
- expect(logs[1].timestamp).not.toBe(logs[0].timestamp);
200
- expect(logger['messageId']).toBe(2);
201
- });
202
- it('should handle logger not initialized', async () => {
203
- const uninitializedLogger = new Logger(testSessionId);
204
- uninitializedLogger.close(); // Ensure it's treated as uninitialized
205
- const consoleDebugSpy = vi
206
- .spyOn(console, 'debug')
207
- .mockImplementation(() => { });
208
- await uninitializedLogger.logMessage(MessageSenderType.USER, 'test');
209
- expect(consoleDebugSpy).toHaveBeenCalledWith('Logger not initialized or session ID missing. Cannot log message.');
210
- expect((await readLogFile()).length).toBe(0);
211
- uninitializedLogger.close();
212
- });
213
- it('should simulate concurrent writes from different logger instances to the same file', async () => {
214
- const concurrentSessionId = 'concurrent-session';
215
- const logger1 = new Logger(concurrentSessionId);
216
- await logger1.initialize();
217
- const logger2 = new Logger(concurrentSessionId);
218
- await logger2.initialize();
219
- expect(logger2['sessionId']).toEqual(logger1['sessionId']);
220
- await logger1.logMessage(MessageSenderType.USER, 'L1M1');
221
- vi.advanceTimersByTime(10);
222
- await logger2.logMessage(MessageSenderType.USER, 'L2M1');
223
- vi.advanceTimersByTime(10);
224
- await logger1.logMessage(MessageSenderType.USER, 'L1M2');
225
- vi.advanceTimersByTime(10);
226
- await logger2.logMessage(MessageSenderType.USER, 'L2M2');
227
- const logsFromFile = await readLogFile();
228
- expect(logsFromFile.length).toBe(4);
229
- const messageIdsInFile = logsFromFile
230
- .map((log) => log.messageId)
231
- .sort((a, b) => a - b);
232
- expect(messageIdsInFile).toEqual([0, 1, 2, 3]);
233
- const messagesInFile = logsFromFile
234
- .sort((a, b) => a.messageId - b.messageId)
235
- .map((l) => l.message);
236
- expect(messagesInFile).toEqual(['L1M1', 'L2M1', 'L1M2', 'L2M2']);
237
- // Check internal state (next messageId each logger would use for that session)
238
- expect(logger1['messageId']).toBe(3);
239
- expect(logger2['messageId']).toBe(4);
240
- logger1.close();
241
- logger2.close();
242
- });
243
- it('should not throw, not increment messageId, and log error if writing to file fails', async () => {
244
- vi.spyOn(fs, 'writeFile').mockRejectedValueOnce(new Error('Disk full'));
245
- const consoleDebugSpy = vi
246
- .spyOn(console, 'debug')
247
- .mockImplementation(() => { });
248
- const initialMessageId = logger['messageId'];
249
- const initialLogCount = logger['logs'].length;
250
- await logger.logMessage(MessageSenderType.USER, 'test fail write');
251
- expect(consoleDebugSpy).toHaveBeenCalledWith('Error writing to log file:', expect.any(Error));
252
- expect(logger['messageId']).toBe(initialMessageId); // Not incremented
253
- expect(logger['logs'].length).toBe(initialLogCount); // Log not added to in-memory cache
254
- });
255
- });
256
- describe('getPreviousUserMessages', () => {
257
- it('should retrieve all user messages from logs, sorted newest first', async () => {
258
- const loggerSort = new Logger('session-1');
259
- await loggerSort.initialize();
260
- await loggerSort.logMessage(MessageSenderType.USER, 'S1M0_ts100000');
261
- vi.advanceTimersByTime(1000);
262
- await loggerSort.logMessage(MessageSenderType.USER, 'S1M1_ts101000');
263
- vi.advanceTimersByTime(1000);
264
- // Switch to a different session to log
265
- const loggerSort2 = new Logger('session-2');
266
- await loggerSort2.initialize();
267
- await loggerSort2.logMessage(MessageSenderType.USER, 'S2M0_ts102000');
268
- vi.advanceTimersByTime(1000);
269
- await loggerSort2.logMessage('model', 'S2_Model_ts103000');
270
- vi.advanceTimersByTime(1000);
271
- await loggerSort2.logMessage(MessageSenderType.USER, 'S2M1_ts104000');
272
- loggerSort.close();
273
- loggerSort2.close();
274
- const finalLogger = new Logger('final-session');
275
- await finalLogger.initialize();
276
- const messages = await finalLogger.getPreviousUserMessages();
277
- expect(messages).toEqual([
278
- 'S2M1_ts104000',
279
- 'S2M0_ts102000',
280
- 'S1M1_ts101000',
281
- 'S1M0_ts100000',
282
- ]);
283
- finalLogger.close();
284
- });
285
- it('should return empty array if no user messages exist', async () => {
286
- await logger.logMessage('system', 'System boot');
287
- const messages = await logger.getPreviousUserMessages();
288
- expect(messages).toEqual([]);
289
- });
290
- it('should return empty array if logger not initialized', async () => {
291
- const uninitializedLogger = new Logger(testSessionId);
292
- uninitializedLogger.close();
293
- const messages = await uninitializedLogger.getPreviousUserMessages();
294
- expect(messages).toEqual([]);
295
- uninitializedLogger.close();
296
- });
297
- });
298
- describe('saveCheckpoint', () => {
299
- const conversation = [
300
- { role: 'user', parts: [{ text: 'Hello' }] },
301
- { role: 'model', parts: [{ text: 'Hi there' }] },
302
- ];
303
- it.each([
304
- { tag: 'test-tag', sanitizedTag: 'test-tag' },
305
- { tag: 'invalid/?*!', sanitizedTag: 'invalid' },
306
- { tag: '/?*!', sanitizedTag: 'default' },
307
- { tag: '../../secret', sanitizedTag: 'secret' },
308
- ])('should save a checkpoint', async ({ tag, sanitizedTag }) => {
309
- await logger.saveCheckpoint(conversation, tag);
310
- const taggedFilePath = path.join(TEST_LLXPRT_DIR, `checkpoint-${sanitizedTag}.json`);
311
- const fileContent = await fs.readFile(taggedFilePath, 'utf-8');
312
- expect(JSON.parse(fileContent)).toEqual({ history: conversation });
313
- });
314
- it('should not throw if logger is not initialized', async () => {
315
- const uninitializedLogger = new Logger(testSessionId);
316
- uninitializedLogger.close();
317
- const consoleErrorSpy = vi
318
- .spyOn(console, 'error')
319
- .mockImplementation(() => { });
320
- await expect(uninitializedLogger.saveCheckpoint(conversation, 'tag')).resolves.not.toThrow();
321
- expect(consoleErrorSpy).toHaveBeenCalledWith('Logger not initialized or checkpoint file path not set. Cannot save a checkpoint.');
322
- });
323
- });
324
- describe('loadCheckpoint', () => {
325
- const conversation = [
326
- { role: 'user', parts: [{ text: 'Hello' }] },
327
- { role: 'model', parts: [{ text: 'Hi there' }] },
328
- ];
329
- beforeEach(async () => {
330
- await fs.writeFile(TEST_CHECKPOINT_FILE_PATH, JSON.stringify(conversation, null, 2));
331
- });
332
- it.each([
333
- { tag: 'load-tag', sanitizedTag: 'load-tag' },
334
- { tag: 'inv/load?*!', sanitizedTag: 'invload' },
335
- { tag: '/?*!', sanitizedTag: 'default' },
336
- { tag: '../../secret', sanitizedTag: 'secret' },
337
- ])('should load from a checkpoint', async ({ tag, sanitizedTag }) => {
338
- const taggedConversation = [
339
- ...conversation,
340
- { role: 'user', parts: [{ text: 'hello' }] },
341
- ];
342
- const taggedFilePath = path.join(TEST_LLXPRT_DIR, `checkpoint-${sanitizedTag}.json`);
343
- await fs.writeFile(taggedFilePath, JSON.stringify(taggedConversation, null, 2));
344
- const loaded = await logger.loadCheckpoint(tag);
345
- expect(loaded).toEqual({ history: taggedConversation });
346
- });
347
- it('should return an empty array if a tagged checkpoint file does not exist', async () => {
348
- const loaded = await logger.loadCheckpoint('non-existent-tag');
349
- expect(loaded).toEqual({ history: [] });
350
- });
351
- it('should return an empty array if the checkpoint file does not exist', async () => {
352
- await fs.unlink(TEST_CHECKPOINT_FILE_PATH); // Ensure it's gone
353
- const loaded = await logger.loadCheckpoint('missing');
354
- expect(loaded).toEqual({ history: [] });
355
- });
356
- it('should return an empty array if the file contains invalid JSON', async () => {
357
- const tag = 'invalid-json-tag';
358
- const taggedFilePath = path.join(TEST_LLXPRT_DIR, `checkpoint-${tag}.json`);
359
- await fs.writeFile(taggedFilePath, 'invalid json');
360
- const consoleErrorSpy = vi
361
- .spyOn(console, 'error')
362
- .mockImplementation(() => { });
363
- const loadedCheckpoint = await logger.loadCheckpoint(tag);
364
- expect(loadedCheckpoint).toEqual({ history: [] });
365
- expect(consoleErrorSpy).toHaveBeenCalledWith(expect.stringContaining('Failed to read or parse checkpoint file'), expect.any(Error));
366
- });
367
- it('should return an empty array if logger is not initialized', async () => {
368
- const uninitializedLogger = new Logger(testSessionId);
369
- uninitializedLogger.close();
370
- const consoleErrorSpy = vi
371
- .spyOn(console, 'error')
372
- .mockImplementation(() => { });
373
- const loadedCheckpoint = await uninitializedLogger.loadCheckpoint('tag');
374
- expect(loadedCheckpoint).toEqual({ history: [] });
375
- expect(consoleErrorSpy).toHaveBeenCalledWith('Logger not initialized or checkpoint file path not set. Cannot load checkpoint.');
376
- });
377
- });
378
- describe('deleteCheckpoint', () => {
379
- const conversation = [
380
- { role: 'user', parts: [{ text: 'Content to be deleted' }] },
381
- ];
382
- const tag = 'delete-me';
383
- let taggedFilePath;
384
- beforeEach(async () => {
385
- taggedFilePath = path.join(TEST_LLXPRT_DIR, `checkpoint-${tag}.json`);
386
- // Create a file to be deleted
387
- await fs.writeFile(taggedFilePath, JSON.stringify(conversation));
388
- });
389
- it('should delete the specified checkpoint file and return true', async () => {
390
- const result = await logger.deleteCheckpoint(tag);
391
- expect(result).toBe(true);
392
- // Verify the file is actually gone
393
- await expect(fs.access(taggedFilePath)).rejects.toThrow(/ENOENT/);
394
- });
395
- it('should return false if the checkpoint file does not exist', async () => {
396
- const result = await logger.deleteCheckpoint('non-existent-tag');
397
- expect(result).toBe(false);
398
- });
399
- it('should re-throw an error if file deletion fails for reasons other than not existing', async () => {
400
- // Simulate a different error (e.g., permission denied)
401
- vi.spyOn(fs, 'unlink').mockRejectedValueOnce(new Error('EACCES: permission denied'));
402
- const consoleErrorSpy = vi
403
- .spyOn(console, 'error')
404
- .mockImplementation(() => { });
405
- await expect(logger.deleteCheckpoint(tag)).rejects.toThrow('EACCES: permission denied');
406
- expect(consoleErrorSpy).toHaveBeenCalledWith(`Failed to delete checkpoint file ${taggedFilePath}:`, expect.any(Error));
407
- });
408
- it('should return false if logger is not initialized', async () => {
409
- const uninitializedLogger = new Logger(testSessionId);
410
- uninitializedLogger.close();
411
- const consoleErrorSpy = vi
412
- .spyOn(console, 'error')
413
- .mockImplementation(() => { });
414
- const result = await uninitializedLogger.deleteCheckpoint(tag);
415
- expect(result).toBe(false);
416
- expect(consoleErrorSpy).toHaveBeenCalledWith('Logger not initialized or checkpoint file path not set. Cannot delete checkpoint.');
417
- });
418
- });
419
- describe('close', () => {
420
- it('should reset logger state', async () => {
421
- await logger.logMessage(MessageSenderType.USER, 'A message');
422
- logger.close();
423
- const consoleDebugSpy = vi
424
- .spyOn(console, 'debug')
425
- .mockImplementation(() => { });
426
- await logger.logMessage(MessageSenderType.USER, 'Another message');
427
- expect(consoleDebugSpy).toHaveBeenCalledWith('Logger not initialized or session ID missing. Cannot log message.');
428
- const messages = await logger.getPreviousUserMessages();
429
- expect(messages).toEqual([]);
430
- expect(logger['initialized']).toBe(false);
431
- expect(logger['logFilePath']).toBeUndefined();
432
- expect(logger['logs']).toEqual([]);
433
- expect(logger['sessionId']).toBeUndefined();
434
- expect(logger['messageId']).toBe(0);
435
- });
436
- });
437
- });
438
- //# sourceMappingURL=logger.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"logger.test.js","sourceRoot":"","sources":["../../../src/core/logger.test.ts"],"names":[],"mappings":"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"}
@@ -1,6 +0,0 @@
1
- /**
2
- * @license
3
- * Copyright 2025 Google LLC
4
- * SPDX-License-Identifier: Apache-2.0
5
- */
6
- export {};
@@ -1,165 +0,0 @@
1
- /**
2
- * @license
3
- * Copyright 2025 Google LLC
4
- * SPDX-License-Identifier: Apache-2.0
5
- */
6
- import { describe, it, expect, vi, beforeEach } from 'vitest';
7
- import { executeToolCall } from './nonInteractiveToolExecutor.js';
8
- import { ToolErrorType, } from '../index.js';
9
- import { MockTool } from '../test-utils/tools.js';
10
- const mockConfig = {
11
- getSessionId: () => 'test-session-id',
12
- getUsageStatisticsEnabled: () => true,
13
- getDebugMode: () => false,
14
- };
15
- describe('executeToolCall', () => {
16
- let mockToolRegistry;
17
- let mockTool;
18
- let abortController;
19
- beforeEach(() => {
20
- mockTool = new MockTool();
21
- mockToolRegistry = {
22
- getTool: vi.fn(),
23
- // Add other ToolRegistry methods if needed, or use a more complete mock
24
- };
25
- abortController = new AbortController();
26
- });
27
- it('should execute a tool successfully', async () => {
28
- const request = {
29
- callId: 'call1',
30
- name: 'testTool',
31
- args: { param1: 'value1' },
32
- isClientInitiated: false,
33
- prompt_id: 'prompt-id-1',
34
- };
35
- const toolResult = {
36
- llmContent: 'Tool executed successfully',
37
- returnDisplay: 'Success!',
38
- };
39
- vi.mocked(mockToolRegistry.getTool).mockReturnValue(mockTool);
40
- vi.spyOn(mockTool, 'buildAndExecute').mockResolvedValue(toolResult);
41
- const response = await executeToolCall(mockConfig, request, mockToolRegistry, abortController.signal);
42
- expect(mockToolRegistry.getTool).toHaveBeenCalledWith('testTool', {
43
- sessionId: 'test-session-id',
44
- });
45
- expect(mockTool.buildAndExecute).toHaveBeenCalledWith(request.args, abortController.signal);
46
- expect(response.callId).toBe('call1');
47
- expect(response.error).toBeUndefined();
48
- expect(response.resultDisplay).toBe('Success!');
49
- expect(response.responseParts).toEqual({
50
- functionResponse: {
51
- name: 'testTool',
52
- id: 'call1',
53
- response: { output: 'Tool executed successfully' },
54
- },
55
- });
56
- });
57
- it('should return an error if tool is not found', async () => {
58
- const request = {
59
- callId: 'call2',
60
- name: 'nonexistentTool',
61
- args: {},
62
- isClientInitiated: false,
63
- prompt_id: 'prompt-id-2',
64
- };
65
- vi.mocked(mockToolRegistry.getTool).mockReturnValue(undefined);
66
- const response = await executeToolCall(mockConfig, request, mockToolRegistry, abortController.signal);
67
- expect(response.callId).toBe('call2');
68
- expect(response.error).toBeInstanceOf(Error);
69
- expect(response.error?.message).toBe('Tool "nonexistentTool" not found in registry.');
70
- expect(response.errorType).toBe(ToolErrorType.TOOL_NOT_REGISTERED);
71
- expect(response.resultDisplay).toBe('Tool "nonexistentTool" not found in registry.');
72
- expect(response.responseParts).toEqual({
73
- functionResponse: {
74
- name: 'nonexistentTool',
75
- id: 'call2',
76
- response: { error: 'Tool "nonexistentTool" not found in registry.' },
77
- },
78
- });
79
- });
80
- it('should return an error if tool execution fails', async () => {
81
- const request = {
82
- callId: 'call3',
83
- name: 'testTool',
84
- args: { param1: 'value1' },
85
- isClientInitiated: false,
86
- prompt_id: 'prompt-id-3',
87
- };
88
- const executionError = new Error('Tool execution failed');
89
- vi.mocked(mockToolRegistry.getTool).mockReturnValue(mockTool);
90
- vi.spyOn(mockTool, 'buildAndExecute').mockRejectedValue(executionError);
91
- const response = await executeToolCall(mockConfig, request, mockToolRegistry, abortController.signal);
92
- expect(response.callId).toBe('call3');
93
- expect(response.error).toBeInstanceOf(Error);
94
- expect(response.error?.message).toBe('Tool execution failed');
95
- expect(response.errorType).toBe(ToolErrorType.UNHANDLED_EXCEPTION);
96
- expect(response.resultDisplay).toBe('Tool execution failed');
97
- expect(response.responseParts).toEqual({
98
- functionResponse: {
99
- name: 'testTool',
100
- id: 'call3',
101
- response: { error: 'Tool execution failed' },
102
- },
103
- });
104
- });
105
- it('should handle cancellation during tool execution', async () => {
106
- const request = {
107
- callId: 'call4',
108
- name: 'testTool',
109
- args: { param1: 'value1' },
110
- isClientInitiated: false,
111
- prompt_id: 'prompt-id-4',
112
- };
113
- const cancellationError = new Error('Operation cancelled');
114
- vi.mocked(mockToolRegistry.getTool).mockReturnValue(mockTool);
115
- vi.spyOn(mockTool, 'buildAndExecute').mockImplementation(async (_args, signal) => {
116
- if (signal?.aborted) {
117
- return Promise.reject(cancellationError);
118
- }
119
- return new Promise((_resolve, reject) => {
120
- signal?.addEventListener('abort', () => {
121
- reject(cancellationError);
122
- });
123
- // Simulate work that might happen if not aborted immediately
124
- const timeoutId = setTimeout(() => reject(new Error('Should have been cancelled if not aborted prior')), 100);
125
- signal?.addEventListener('abort', () => clearTimeout(timeoutId));
126
- });
127
- });
128
- abortController.abort(); // Abort before calling
129
- const response = await executeToolCall(mockConfig, request, mockToolRegistry, abortController.signal);
130
- expect(response.callId).toBe('call4');
131
- expect(response.error?.message).toBe(cancellationError.message);
132
- expect(response.resultDisplay).toBe('Operation cancelled');
133
- });
134
- it('should correctly format llmContent with inlineData', async () => {
135
- const request = {
136
- callId: 'call5',
137
- name: 'testTool',
138
- args: {},
139
- isClientInitiated: false,
140
- prompt_id: 'prompt-id-5',
141
- };
142
- const imageDataPart = {
143
- inlineData: { mimeType: 'image/png', data: 'base64data' },
144
- };
145
- const toolResult = {
146
- llmContent: [imageDataPart],
147
- returnDisplay: 'Image processed',
148
- };
149
- vi.mocked(mockToolRegistry.getTool).mockReturnValue(mockTool);
150
- vi.spyOn(mockTool, 'buildAndExecute').mockResolvedValue(toolResult);
151
- const response = await executeToolCall(mockConfig, request, mockToolRegistry, abortController.signal);
152
- expect(response.resultDisplay).toBe('Image processed');
153
- expect(response.responseParts).toEqual({
154
- functionResponse: {
155
- name: 'testTool',
156
- id: 'call5',
157
- response: {
158
- output: 'Binary content of type image/png was processed.',
159
- binaryContent: imageDataPart,
160
- },
161
- },
162
- });
163
- });
164
- });
165
- //# sourceMappingURL=nonInteractiveToolExecutor.test.js.map