@machina.ai/cell-cli-core 1.13.0-rc4 → 1.16.0-rc1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (422) hide show
  1. package/dist/index.d.ts +2 -1
  2. package/dist/index.js +2 -1
  3. package/dist/index.js.map +1 -1
  4. package/dist/package.json +1 -1
  5. package/dist/src/agents/codebase-investigator.test.d.ts +6 -0
  6. package/dist/src/agents/codebase-investigator.test.js +35 -0
  7. package/dist/src/agents/codebase-investigator.test.js.map +1 -0
  8. package/dist/src/agents/executor.d.ts +3 -0
  9. package/dist/src/agents/executor.js +21 -0
  10. package/dist/src/agents/executor.js.map +1 -1
  11. package/dist/src/agents/executor.test.js +358 -3
  12. package/dist/src/agents/executor.test.js.map +1 -1
  13. package/dist/src/code_assist/codeAssist.test.d.ts +6 -0
  14. package/dist/src/code_assist/codeAssist.test.js +99 -0
  15. package/dist/src/code_assist/codeAssist.test.js.map +1 -0
  16. package/dist/src/code_assist/experiments/client_metadata.js +2 -1
  17. package/dist/src/code_assist/experiments/client_metadata.js.map +1 -1
  18. package/dist/src/code_assist/experiments/client_metadata.test.d.ts +6 -0
  19. package/dist/src/code_assist/experiments/client_metadata.test.js +99 -0
  20. package/dist/src/code_assist/experiments/client_metadata.test.js.map +1 -0
  21. package/dist/src/code_assist/experiments/experiments.js +2 -2
  22. package/dist/src/code_assist/experiments/experiments.js.map +1 -1
  23. package/dist/src/code_assist/experiments/experiments.test.d.ts +6 -0
  24. package/dist/src/code_assist/experiments/experiments.test.js +92 -0
  25. package/dist/src/code_assist/experiments/experiments.test.js.map +1 -0
  26. package/dist/src/code_assist/experiments/flagNames.d.ts +13 -0
  27. package/dist/src/code_assist/experiments/flagNames.js +13 -0
  28. package/dist/src/code_assist/experiments/flagNames.js.map +1 -0
  29. package/dist/src/code_assist/experiments/types.d.ts +1 -1
  30. package/dist/src/code_assist/oauth-credential-storage.test.js +49 -0
  31. package/dist/src/code_assist/oauth-credential-storage.test.js.map +1 -1
  32. package/dist/src/code_assist/server.js +5 -8
  33. package/dist/src/code_assist/server.js.map +1 -1
  34. package/dist/src/code_assist/server.test.js +109 -28
  35. package/dist/src/code_assist/server.test.js.map +1 -1
  36. package/dist/src/config/config.d.ts +34 -2
  37. package/dist/src/config/config.js +147 -26
  38. package/dist/src/config/config.js.map +1 -1
  39. package/dist/src/config/config.test.js +436 -19
  40. package/dist/src/config/config.test.js.map +1 -1
  41. package/dist/src/config/defaultModelConfigs.d.ts +7 -0
  42. package/dist/src/config/defaultModelConfigs.js +158 -0
  43. package/dist/src/config/defaultModelConfigs.js.map +1 -0
  44. package/dist/src/config/models.d.ts +22 -1
  45. package/dist/src/config/models.js +49 -6
  46. package/dist/src/config/models.js.map +1 -1
  47. package/dist/src/config/models.test.js +71 -10
  48. package/dist/src/config/models.test.js.map +1 -1
  49. package/dist/src/confirmation-bus/message-bus.d.ts +1 -1
  50. package/dist/src/confirmation-bus/message-bus.js +2 -2
  51. package/dist/src/confirmation-bus/message-bus.js.map +1 -1
  52. package/dist/src/confirmation-bus/message-bus.test.js +30 -24
  53. package/dist/src/confirmation-bus/message-bus.test.js.map +1 -1
  54. package/dist/src/confirmation-bus/types.d.ts +1 -0
  55. package/dist/src/core/baseLlmClient.d.ts +4 -8
  56. package/dist/src/core/baseLlmClient.js +3 -8
  57. package/dist/src/core/baseLlmClient.js.map +1 -1
  58. package/dist/src/core/baseLlmClient.test.js +22 -27
  59. package/dist/src/core/baseLlmClient.test.js.map +1 -1
  60. package/dist/src/core/client.d.ts +6 -5
  61. package/dist/src/core/client.js +33 -33
  62. package/dist/src/core/client.js.map +1 -1
  63. package/dist/src/core/client.test.js +40 -22
  64. package/dist/src/core/client.test.js.map +1 -1
  65. package/dist/src/core/coreToolScheduler.js +7 -1
  66. package/dist/src/core/coreToolScheduler.js.map +1 -1
  67. package/dist/src/core/coreToolScheduler.test.js +151 -357
  68. package/dist/src/core/coreToolScheduler.test.js.map +1 -1
  69. package/dist/src/core/geminiChat.d.ts +6 -4
  70. package/dist/src/core/geminiChat.js +106 -29
  71. package/dist/src/core/geminiChat.js.map +1 -1
  72. package/dist/src/core/geminiChat.test.js +317 -16
  73. package/dist/src/core/geminiChat.test.js.map +1 -1
  74. package/dist/src/core/logger.d.ts +7 -2
  75. package/dist/src/core/logger.js +15 -9
  76. package/dist/src/core/logger.js.map +1 -1
  77. package/dist/src/core/logger.test.js +31 -16
  78. package/dist/src/core/logger.test.js.map +1 -1
  79. package/dist/src/core/loggingContentGenerator.test.d.ts +6 -0
  80. package/dist/src/core/loggingContentGenerator.test.js +180 -0
  81. package/dist/src/core/loggingContentGenerator.test.js.map +1 -0
  82. package/dist/src/core/nonInteractiveToolExecutor.test.js +1 -0
  83. package/dist/src/core/nonInteractiveToolExecutor.test.js.map +1 -1
  84. package/dist/src/core/prompts.js +8 -11
  85. package/dist/src/core/prompts.js.map +1 -1
  86. package/dist/src/core/tokenLimits.test.d.ts +6 -0
  87. package/dist/src/core/tokenLimits.test.js +26 -0
  88. package/dist/src/core/tokenLimits.test.js.map +1 -0
  89. package/dist/src/fallback/handler.js +52 -7
  90. package/dist/src/fallback/handler.js.map +1 -1
  91. package/dist/src/fallback/handler.test.js +69 -16
  92. package/dist/src/fallback/handler.test.js.map +1 -1
  93. package/dist/src/fallback/types.d.ts +1 -1
  94. package/dist/src/generated/git-commit.d.ts +2 -2
  95. package/dist/src/generated/git-commit.js +2 -2
  96. package/dist/src/hooks/hookAggregator.d.ts +68 -0
  97. package/dist/src/hooks/hookAggregator.js +262 -0
  98. package/dist/src/hooks/hookAggregator.js.map +1 -0
  99. package/dist/src/hooks/hookAggregator.test.d.ts +6 -0
  100. package/dist/src/hooks/hookAggregator.test.js +387 -0
  101. package/dist/src/hooks/hookAggregator.test.js.map +1 -0
  102. package/dist/src/hooks/hookRunner.d.ts +42 -0
  103. package/dist/src/hooks/hookRunner.js +272 -0
  104. package/dist/src/hooks/hookRunner.js.map +1 -0
  105. package/dist/src/hooks/hookRunner.test.d.ts +6 -0
  106. package/dist/src/hooks/hookRunner.test.js +468 -0
  107. package/dist/src/hooks/hookRunner.test.js.map +1 -0
  108. package/dist/src/hooks/hookTranslator.d.ts +3 -3
  109. package/dist/src/hooks/types.js +1 -1
  110. package/dist/src/hooks/types.js.map +1 -1
  111. package/dist/src/hooks/types.test.js +280 -2
  112. package/dist/src/hooks/types.test.js.map +1 -1
  113. package/dist/src/ide/detect-ide.d.ts +4 -0
  114. package/dist/src/ide/detect-ide.js +6 -1
  115. package/dist/src/ide/detect-ide.js.map +1 -1
  116. package/dist/src/ide/detect-ide.test.js +5 -0
  117. package/dist/src/ide/detect-ide.test.js.map +1 -1
  118. package/dist/src/ide/ide-client.d.ts +3 -1
  119. package/dist/src/ide/ide-client.js +9 -8
  120. package/dist/src/ide/ide-client.js.map +1 -1
  121. package/dist/src/ide/ide-client.test.js +159 -0
  122. package/dist/src/ide/ide-client.test.js.map +1 -1
  123. package/dist/src/ide/ide-installer.js +65 -20
  124. package/dist/src/ide/ide-installer.js.map +1 -1
  125. package/dist/src/ide/ide-installer.test.js +41 -0
  126. package/dist/src/ide/ide-installer.test.js.map +1 -1
  127. package/dist/src/ide/types.d.ts +1 -1
  128. package/dist/src/ide/types.js +1 -1
  129. package/dist/src/index.d.ts +2 -0
  130. package/dist/src/index.js +2 -0
  131. package/dist/src/index.js.map +1 -1
  132. package/dist/src/mcp/google-auth-provider.js +1 -1
  133. package/dist/src/mcp/google-auth-provider.js.map +1 -1
  134. package/dist/src/mcp/mcpLauncher.js +6 -2
  135. package/dist/src/mcp/mcpLauncher.js.map +1 -1
  136. package/dist/src/mcp/oauth-provider.js +2 -2
  137. package/dist/src/mcp/oauth-provider.js.map +1 -1
  138. package/dist/src/mcp/oauth-provider.test.js +177 -0
  139. package/dist/src/mcp/oauth-provider.test.js.map +1 -1
  140. package/dist/src/mcp/sa-impersonation-provider.js +1 -1
  141. package/dist/src/mcp/sa-impersonation-provider.js.map +1 -1
  142. package/dist/src/policy/config.js +3 -1
  143. package/dist/src/policy/config.js.map +1 -1
  144. package/dist/src/policy/config.test.js +135 -1
  145. package/dist/src/policy/config.test.js.map +1 -1
  146. package/dist/src/policy/policies/discovered.toml +8 -0
  147. package/dist/src/policy/policies/write.toml +10 -0
  148. package/dist/src/policy/policy-engine.d.ts +12 -3
  149. package/dist/src/policy/policy-engine.js +71 -9
  150. package/dist/src/policy/policy-engine.js.map +1 -1
  151. package/dist/src/policy/policy-engine.test.js +460 -76
  152. package/dist/src/policy/policy-engine.test.js.map +1 -1
  153. package/dist/src/policy/toml-loader.d.ts +2 -1
  154. package/dist/src/policy/toml-loader.js +103 -6
  155. package/dist/src/policy/toml-loader.js.map +1 -1
  156. package/dist/src/policy/toml-loader.test.js +222 -368
  157. package/dist/src/policy/toml-loader.test.js.map +1 -1
  158. package/dist/src/policy/types.d.ts +65 -0
  159. package/dist/src/policy/types.js +4 -0
  160. package/dist/src/policy/types.js.map +1 -1
  161. package/dist/src/prompts/mcp-prompts.test.d.ts +6 -0
  162. package/dist/src/prompts/mcp-prompts.test.js +40 -0
  163. package/dist/src/prompts/mcp-prompts.test.js.map +1 -0
  164. package/dist/src/prompts/prompt-registry.test.d.ts +6 -0
  165. package/dist/src/prompts/prompt-registry.test.js +111 -0
  166. package/dist/src/prompts/prompt-registry.test.js.map +1 -0
  167. package/dist/src/routing/modelRouterService.js +15 -0
  168. package/dist/src/routing/modelRouterService.js.map +1 -1
  169. package/dist/src/routing/modelRouterService.test.js +62 -0
  170. package/dist/src/routing/modelRouterService.test.js.map +1 -1
  171. package/dist/src/routing/strategies/classifierStrategy.d.ts +1 -1
  172. package/dist/src/routing/strategies/classifierStrategy.js +6 -14
  173. package/dist/src/routing/strategies/classifierStrategy.js.map +1 -1
  174. package/dist/src/routing/strategies/classifierStrategy.test.js +13 -10
  175. package/dist/src/routing/strategies/classifierStrategy.test.js.map +1 -1
  176. package/dist/src/routing/strategies/fallbackStrategy.js +1 -1
  177. package/dist/src/routing/strategies/fallbackStrategy.js.map +1 -1
  178. package/dist/src/routing/strategies/fallbackStrategy.test.js +4 -0
  179. package/dist/src/routing/strategies/fallbackStrategy.test.js.map +1 -1
  180. package/dist/src/routing/strategies/overrideStrategy.js +2 -2
  181. package/dist/src/routing/strategies/overrideStrategy.js.map +1 -1
  182. package/dist/src/routing/strategies/overrideStrategy.test.js +3 -0
  183. package/dist/src/routing/strategies/overrideStrategy.test.js.map +1 -1
  184. package/dist/src/safety/built-in.d.ts +21 -0
  185. package/dist/src/safety/built-in.js +106 -0
  186. package/dist/src/safety/built-in.js.map +1 -0
  187. package/dist/src/safety/built-in.test.d.ts +6 -0
  188. package/dist/src/safety/built-in.test.js +199 -0
  189. package/dist/src/safety/built-in.test.js.map +1 -0
  190. package/dist/src/safety/checker-runner.d.ts +48 -0
  191. package/dist/src/safety/checker-runner.js +208 -0
  192. package/dist/src/safety/checker-runner.js.map +1 -0
  193. package/dist/src/safety/checker-runner.test.d.ts +6 -0
  194. package/dist/src/safety/checker-runner.test.js +238 -0
  195. package/dist/src/safety/checker-runner.test.js.map +1 -0
  196. package/dist/src/safety/context-builder.d.ts +23 -0
  197. package/dist/src/safety/context-builder.js +47 -0
  198. package/dist/src/safety/context-builder.js.map +1 -0
  199. package/dist/src/safety/context-builder.test.d.ts +6 -0
  200. package/dist/src/safety/context-builder.test.js +49 -0
  201. package/dist/src/safety/context-builder.test.js.map +1 -0
  202. package/dist/src/safety/protocol.d.ts +88 -0
  203. package/dist/src/safety/protocol.js +15 -0
  204. package/dist/src/safety/protocol.js.map +1 -0
  205. package/dist/src/safety/registry.d.ts +26 -0
  206. package/dist/src/safety/registry.js +65 -0
  207. package/dist/src/safety/registry.js.map +1 -0
  208. package/dist/src/safety/registry.test.d.ts +6 -0
  209. package/dist/src/safety/registry.test.js +31 -0
  210. package/dist/src/safety/registry.test.js.map +1 -0
  211. package/dist/src/services/chatCompressionService.test.js +1 -0
  212. package/dist/src/services/chatCompressionService.test.js.map +1 -1
  213. package/dist/src/services/gitService.js +1 -1
  214. package/dist/src/services/gitService.js.map +1 -1
  215. package/dist/src/services/gitService.test.js +1 -1
  216. package/dist/src/services/gitService.test.js.map +1 -1
  217. package/dist/src/services/loopDetectionService.d.ts +3 -0
  218. package/dist/src/services/loopDetectionService.js +81 -42
  219. package/dist/src/services/loopDetectionService.js.map +1 -1
  220. package/dist/src/services/loopDetectionService.test.js +101 -1
  221. package/dist/src/services/loopDetectionService.test.js.map +1 -1
  222. package/dist/src/services/modelConfig.golden.test.d.ts +6 -0
  223. package/dist/src/services/modelConfig.golden.test.js +42 -0
  224. package/dist/src/services/modelConfig.golden.test.js.map +1 -0
  225. package/dist/src/services/modelConfig.integration.test.d.ts +6 -0
  226. package/dist/src/services/modelConfig.integration.test.js +213 -0
  227. package/dist/src/services/modelConfig.integration.test.js.map +1 -0
  228. package/dist/src/services/modelConfigService.d.ts +46 -0
  229. package/dist/src/services/modelConfigService.js +146 -0
  230. package/dist/src/services/modelConfigService.js.map +1 -0
  231. package/dist/src/services/modelConfigService.test.d.ts +6 -0
  232. package/dist/src/services/modelConfigService.test.js +509 -0
  233. package/dist/src/services/modelConfigService.test.js.map +1 -0
  234. package/dist/src/services/test-data/resolved-aliases.golden.json +169 -0
  235. package/dist/src/telemetry/clearcut-logger/clearcut-logger.d.ts +11 -9
  236. package/dist/src/telemetry/clearcut-logger/clearcut-logger.js +174 -150
  237. package/dist/src/telemetry/clearcut-logger/clearcut-logger.js.map +1 -1
  238. package/dist/src/telemetry/clearcut-logger/clearcut-logger.test.d.ts +1 -0
  239. package/dist/src/telemetry/clearcut-logger/clearcut-logger.test.js +76 -20
  240. package/dist/src/telemetry/clearcut-logger/clearcut-logger.test.js.map +1 -1
  241. package/dist/src/telemetry/clearcut-logger/event-metadata-key.d.ts +6 -1
  242. package/dist/src/telemetry/clearcut-logger/event-metadata-key.js +18 -5
  243. package/dist/src/telemetry/clearcut-logger/event-metadata-key.js.map +1 -1
  244. package/dist/src/telemetry/index.d.ts +2 -2
  245. package/dist/src/telemetry/index.js +2 -2
  246. package/dist/src/telemetry/index.js.map +1 -1
  247. package/dist/src/telemetry/loggers.d.ts +7 -7
  248. package/dist/src/telemetry/loggers.js +23 -23
  249. package/dist/src/telemetry/loggers.js.map +1 -1
  250. package/dist/src/telemetry/loggers.test.circular.js +0 -1
  251. package/dist/src/telemetry/loggers.test.circular.js.map +1 -1
  252. package/dist/src/telemetry/loggers.test.js +72 -18
  253. package/dist/src/telemetry/loggers.test.js.map +1 -1
  254. package/dist/src/telemetry/metrics.d.ts +8 -4
  255. package/dist/src/telemetry/metrics.js +10 -4
  256. package/dist/src/telemetry/metrics.js.map +1 -1
  257. package/dist/src/telemetry/metrics.test.js +42 -0
  258. package/dist/src/telemetry/metrics.test.js.map +1 -1
  259. package/dist/src/telemetry/telemetryAttributes.js +1 -0
  260. package/dist/src/telemetry/telemetryAttributes.js.map +1 -1
  261. package/dist/src/telemetry/types.d.ts +17 -11
  262. package/dist/src/telemetry/types.js +53 -28
  263. package/dist/src/telemetry/types.js.map +1 -1
  264. package/dist/src/tools/base-tool-invocation.test.d.ts +6 -0
  265. package/dist/src/tools/base-tool-invocation.test.js +85 -0
  266. package/dist/src/tools/base-tool-invocation.test.js.map +1 -0
  267. package/dist/src/tools/edit.d.ts +1 -1
  268. package/dist/src/tools/edit.js +31 -33
  269. package/dist/src/tools/edit.js.map +1 -1
  270. package/dist/src/tools/edit.test.js +31 -20
  271. package/dist/src/tools/edit.test.js.map +1 -1
  272. package/dist/src/tools/glob.d.ts +1 -1
  273. package/dist/src/tools/glob.js +7 -7
  274. package/dist/src/tools/glob.js.map +1 -1
  275. package/dist/src/tools/glob.test.js +20 -17
  276. package/dist/src/tools/glob.test.js.map +1 -1
  277. package/dist/src/tools/grep.d.ts +1 -1
  278. package/dist/src/tools/grep.js +9 -9
  279. package/dist/src/tools/grep.js.map +1 -1
  280. package/dist/src/tools/grep.test.js +15 -12
  281. package/dist/src/tools/grep.test.js.map +1 -1
  282. package/dist/src/tools/ls.d.ts +1 -1
  283. package/dist/src/tools/ls.js +14 -15
  284. package/dist/src/tools/ls.js.map +1 -1
  285. package/dist/src/tools/ls.test.js +32 -33
  286. package/dist/src/tools/ls.test.js.map +1 -1
  287. package/dist/src/tools/mcp-client.js +24 -52
  288. package/dist/src/tools/mcp-client.js.map +1 -1
  289. package/dist/src/tools/mcp-client.test.js +18 -0
  290. package/dist/src/tools/mcp-client.test.js.map +1 -1
  291. package/dist/src/tools/mcp-tool.d.ts +1 -0
  292. package/dist/src/tools/mcp-tool.js +5 -2
  293. package/dist/src/tools/mcp-tool.js.map +1 -1
  294. package/dist/src/tools/memoryTool.js +1 -1
  295. package/dist/src/tools/memoryTool.js.map +1 -1
  296. package/dist/src/tools/memoryTool.test.js +1 -1
  297. package/dist/src/tools/memoryTool.test.js.map +1 -1
  298. package/dist/src/tools/modifiable-tool.d.ts +5 -1
  299. package/dist/src/tools/modifiable-tool.js +34 -13
  300. package/dist/src/tools/modifiable-tool.js.map +1 -1
  301. package/dist/src/tools/modifiable-tool.test.js +56 -22
  302. package/dist/src/tools/modifiable-tool.test.js.map +1 -1
  303. package/dist/src/tools/read-file.d.ts +2 -2
  304. package/dist/src/tools/read-file.js +20 -24
  305. package/dist/src/tools/read-file.js.map +1 -1
  306. package/dist/src/tools/read-file.test.js +63 -51
  307. package/dist/src/tools/read-file.test.js.map +1 -1
  308. package/dist/src/tools/read-many-files.d.ts +2 -9
  309. package/dist/src/tools/read-many-files.js +10 -21
  310. package/dist/src/tools/read-many-files.js.map +1 -1
  311. package/dist/src/tools/read-many-files.test.js +37 -35
  312. package/dist/src/tools/read-many-files.test.js.map +1 -1
  313. package/dist/src/tools/ripGrep.d.ts +25 -8
  314. package/dist/src/tools/ripGrep.js +148 -176
  315. package/dist/src/tools/ripGrep.js.map +1 -1
  316. package/dist/src/tools/ripGrep.test.js +383 -58
  317. package/dist/src/tools/ripGrep.test.js.map +1 -1
  318. package/dist/src/tools/shell.d.ts +1 -1
  319. package/dist/src/tools/shell.js +17 -15
  320. package/dist/src/tools/shell.js.map +1 -1
  321. package/dist/src/tools/shell.test.js +66 -36
  322. package/dist/src/tools/shell.test.js.map +1 -1
  323. package/dist/src/tools/smart-edit.d.ts +6 -1
  324. package/dist/src/tools/smart-edit.js +18 -17
  325. package/dist/src/tools/smart-edit.js.map +1 -1
  326. package/dist/src/tools/smart-edit.test.js +49 -24
  327. package/dist/src/tools/smart-edit.test.js.map +1 -1
  328. package/dist/src/tools/tool-registry.d.ts +29 -4
  329. package/dist/src/tools/tool-registry.js +108 -29
  330. package/dist/src/tools/tool-registry.js.map +1 -1
  331. package/dist/src/tools/tool-registry.test.js +134 -4
  332. package/dist/src/tools/tool-registry.test.js.map +1 -1
  333. package/dist/src/tools/tools.d.ts +2 -1
  334. package/dist/src/tools/tools.js +5 -2
  335. package/dist/src/tools/tools.js.map +1 -1
  336. package/dist/src/tools/web-fetch.js +2 -4
  337. package/dist/src/tools/web-fetch.js.map +1 -1
  338. package/dist/src/tools/web-fetch.test.js +11 -4
  339. package/dist/src/tools/web-fetch.test.js.map +1 -1
  340. package/dist/src/tools/web-search.js +1 -2
  341. package/dist/src/tools/web-search.js.map +1 -1
  342. package/dist/src/tools/web-search.test.js +11 -5
  343. package/dist/src/tools/web-search.test.js.map +1 -1
  344. package/dist/src/tools/write-file.js +31 -31
  345. package/dist/src/tools/write-file.js.map +1 -1
  346. package/dist/src/tools/write-file.test.js +24 -5
  347. package/dist/src/tools/write-file.test.js.map +1 -1
  348. package/dist/src/tools/write-todos.d.ts +29 -0
  349. package/dist/src/tools/write-todos.js +34 -1
  350. package/dist/src/tools/write-todos.js.map +1 -1
  351. package/dist/src/utils/editCorrector.js +4 -15
  352. package/dist/src/utils/editCorrector.js.map +1 -1
  353. package/dist/src/utils/editCorrector.test.js +16 -0
  354. package/dist/src/utils/editCorrector.test.js.map +1 -1
  355. package/dist/src/utils/editor.d.ts +3 -1
  356. package/dist/src/utils/editor.js +18 -1
  357. package/dist/src/utils/editor.js.map +1 -1
  358. package/dist/src/utils/editor.test.js +11 -0
  359. package/dist/src/utils/editor.test.js.map +1 -1
  360. package/dist/src/utils/environmentContext.js +3 -1
  361. package/dist/src/utils/environmentContext.js.map +1 -1
  362. package/dist/src/utils/environmentContext.test.js +6 -0
  363. package/dist/src/utils/environmentContext.test.js.map +1 -1
  364. package/dist/src/utils/events.d.ts +14 -11
  365. package/dist/src/utils/events.js +1 -14
  366. package/dist/src/utils/events.js.map +1 -1
  367. package/dist/src/utils/extensionLoader.d.ts +8 -0
  368. package/dist/src/utils/extensionLoader.js +61 -15
  369. package/dist/src/utils/extensionLoader.js.map +1 -1
  370. package/dist/src/utils/extensionLoader.test.js +83 -19
  371. package/dist/src/utils/extensionLoader.test.js.map +1 -1
  372. package/dist/src/utils/fileUtils.test.js +75 -60
  373. package/dist/src/utils/fileUtils.test.js.map +1 -1
  374. package/dist/src/utils/flashFallback.test.js +2 -2
  375. package/dist/src/utils/flashFallback.test.js.map +1 -1
  376. package/dist/src/utils/googleQuotaErrors.d.ts +2 -1
  377. package/dist/src/utils/googleQuotaErrors.js +20 -12
  378. package/dist/src/utils/googleQuotaErrors.js.map +1 -1
  379. package/dist/src/utils/httpErrors.d.ts +18 -0
  380. package/dist/src/utils/httpErrors.js +36 -0
  381. package/dist/src/utils/httpErrors.js.map +1 -0
  382. package/dist/src/utils/llm-edit-fixer.js +1 -2
  383. package/dist/src/utils/llm-edit-fixer.js.map +1 -1
  384. package/dist/src/utils/llm-edit-fixer.test.js +16 -1
  385. package/dist/src/utils/llm-edit-fixer.test.js.map +1 -1
  386. package/dist/src/utils/memoryDiscovery.d.ts +8 -0
  387. package/dist/src/utils/memoryDiscovery.js +24 -0
  388. package/dist/src/utils/memoryDiscovery.js.map +1 -1
  389. package/dist/src/utils/memoryDiscovery.test.js +43 -1
  390. package/dist/src/utils/memoryDiscovery.test.js.map +1 -1
  391. package/dist/src/utils/nextSpeakerChecker.js +1 -2
  392. package/dist/src/utils/nextSpeakerChecker.js.map +1 -1
  393. package/dist/src/utils/nextSpeakerChecker.test.js +10 -4
  394. package/dist/src/utils/nextSpeakerChecker.test.js.map +1 -1
  395. package/dist/src/utils/pathReader.js +4 -4
  396. package/dist/src/utils/pathReader.js.map +1 -1
  397. package/dist/src/utils/pathReader.test.js +44 -1
  398. package/dist/src/utils/pathReader.test.js.map +1 -1
  399. package/dist/src/utils/paths.d.ts +1 -1
  400. package/dist/src/utils/paths.js +5 -3
  401. package/dist/src/utils/paths.js.map +1 -1
  402. package/dist/src/utils/retry.d.ts +0 -9
  403. package/dist/src/utils/retry.js +24 -28
  404. package/dist/src/utils/retry.js.map +1 -1
  405. package/dist/src/utils/retry.test.js +51 -0
  406. package/dist/src/utils/retry.test.js.map +1 -1
  407. package/dist/src/utils/shell-utils.js +5 -3
  408. package/dist/src/utils/shell-utils.js.map +1 -1
  409. package/dist/src/utils/shell-utils.test.js +9 -9
  410. package/dist/src/utils/shell-utils.test.js.map +1 -1
  411. package/dist/src/utils/summarizer.d.ts +4 -2
  412. package/dist/src/utils/summarizer.js +6 -8
  413. package/dist/src/utils/summarizer.js.map +1 -1
  414. package/dist/src/utils/summarizer.test.js +32 -11
  415. package/dist/src/utils/summarizer.test.js.map +1 -1
  416. package/dist/src/utils/workspaceContext.d.ts +4 -3
  417. package/dist/src/utils/workspaceContext.js +10 -11
  418. package/dist/src/utils/workspaceContext.js.map +1 -1
  419. package/dist/src/utils/workspaceContext.test.js +1 -1
  420. package/dist/src/utils/workspaceContext.test.js.map +1 -1
  421. package/dist/tsconfig.tsbuildinfo +1 -1
  422. package/package.json +1 -1
@@ -4,7 +4,11 @@
4
4
  * SPDX-License-Identifier: Apache-2.0
5
5
  */
6
6
  import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
7
- import { Config, ApprovalMode, DEFAULT_FILE_FILTERING_OPTIONS, } from './config.js';
7
+ import { Config, DEFAULT_FILE_FILTERING_OPTIONS } from './config.js';
8
+ import { ExperimentFlags } from '../code_assist/experiments/flagNames.js';
9
+ import { debugLogger } from '../utils/debugLogger.js';
10
+ import { ApprovalMode } from '../policy/types.js';
11
+ import { HookType, HookEventName } from '../hooks/types.js';
8
12
  import * as path from 'node:path';
9
13
  import { setGeminiMdFilename as mockSetGeminiMdFilename } from '../tools/memoryTool.js';
10
14
  import { DEFAULT_TELEMETRY_TARGET, DEFAULT_OTLP_ENDPOINT, } from '../telemetry/index.js';
@@ -19,6 +23,15 @@ import { RipGrepTool, canUseRipgrep } from '../tools/ripGrep.js';
19
23
  import { logRipgrepFallback } from '../telemetry/loggers.js';
20
24
  import { RipgrepFallbackEvent } from '../telemetry/types.js';
21
25
  import { ToolRegistry } from '../tools/tool-registry.js';
26
+ import { DEFAULT_MODEL_CONFIGS } from './defaultModelConfigs.js';
27
+ const mockCoreEvents = vi.hoisted(() => ({
28
+ emit: vi.fn(),
29
+ emitFeedback: vi.fn(),
30
+ emitModelChanged: vi.fn(),
31
+ }));
32
+ vi.mock('../utils/events.js', () => ({
33
+ coreEvents: mockCoreEvents,
34
+ }));
22
35
  vi.mock('fs', async (importOriginal) => {
23
36
  const actual = await importOriginal();
24
37
  return {
@@ -35,6 +48,7 @@ vi.mock('../tools/tool-registry', () => {
35
48
  const ToolRegistryMock = vi.fn();
36
49
  ToolRegistryMock.prototype.registerTool = vi.fn();
37
50
  ToolRegistryMock.prototype.discoverAllTools = vi.fn();
51
+ ToolRegistryMock.prototype.sortTools = vi.fn();
38
52
  ToolRegistryMock.prototype.getAllTools = vi.fn(() => []); // Mock methods if needed
39
53
  ToolRegistryMock.prototype.getTool = vi.fn();
40
54
  ToolRegistryMock.prototype.getFunctionDeclarations = vi.fn(() => []);
@@ -121,10 +135,14 @@ vi.mock('../agents/subagent-tool-wrapper.js', () => ({
121
135
  import { BaseLlmClient } from '../core/baseLlmClient.js';
122
136
  import { tokenLimit } from '../core/tokenLimits.js';
123
137
  import { uiTelemetryService } from '../telemetry/index.js';
138
+ import { getCodeAssistServer } from '../code_assist/codeAssist.js';
139
+ import { getExperiments } from '../code_assist/experiments/experiments.js';
124
140
  vi.mock('../core/baseLlmClient.js');
125
141
  vi.mock('../core/tokenLimits.js', () => ({
126
142
  tokenLimit: vi.fn(),
127
143
  }));
144
+ vi.mock('../code_assist/codeAssist.js');
145
+ vi.mock('../code_assist/experiments/experiments.js');
128
146
  describe('Server Config (config.ts)', () => {
129
147
  const MODEL = 'gemini-pro';
130
148
  const SANDBOX = {
@@ -197,7 +215,7 @@ describe('Server Config (config.ts)', () => {
197
215
  ...baseParams,
198
216
  experiments: {
199
217
  flags: {
200
- GeminiCLIContextCompression__threshold_fraction: {
218
+ [ExperimentFlags.CONTEXT_COMPRESSION_THRESHOLD]: {
201
219
  floatValue: 0.8,
202
220
  },
203
221
  },
@@ -210,7 +228,7 @@ describe('Server Config (config.ts)', () => {
210
228
  ...baseParams,
211
229
  experiments: {
212
230
  flags: {
213
- GeminiCLIContextCompression__threshold_fraction: {
231
+ [ExperimentFlags.CONTEXT_COMPRESSION_THRESHOLD]: {
214
232
  floatValue: 0.0,
215
233
  },
216
234
  },
@@ -222,6 +240,40 @@ describe('Server Config (config.ts)', () => {
222
240
  const config = new Config(baseParams);
223
241
  expect(await config.getCompressionThreshold()).toBeUndefined();
224
242
  });
243
+ describe('getUserCaching', () => {
244
+ it('should return the remote experiment flag when available', async () => {
245
+ const config = new Config({
246
+ ...baseParams,
247
+ experiments: {
248
+ flags: {
249
+ [ExperimentFlags.USER_CACHING]: {
250
+ boolValue: true,
251
+ },
252
+ },
253
+ experimentIds: [],
254
+ },
255
+ });
256
+ expect(await config.getUserCaching()).toBe(true);
257
+ });
258
+ it('should return false when the remote flag is false', async () => {
259
+ const config = new Config({
260
+ ...baseParams,
261
+ experiments: {
262
+ flags: {
263
+ [ExperimentFlags.USER_CACHING]: {
264
+ boolValue: false,
265
+ },
266
+ },
267
+ experimentIds: [],
268
+ },
269
+ });
270
+ expect(await config.getUserCaching()).toBe(false);
271
+ });
272
+ it('should return undefined if there are no experiments', async () => {
273
+ const config = new Config(baseParams);
274
+ expect(await config.getUserCaching()).toBeUndefined();
275
+ });
276
+ });
225
277
  });
226
278
  describe('refreshAuth', () => {
227
279
  it('should refresh auth and update config', async () => {
@@ -255,6 +307,13 @@ describe('Server Config (config.ts)', () => {
255
307
  await config.refreshAuth(AuthType.LOGIN_WITH_GOOGLE, vi.fn());
256
308
  expect(config.getGeminiClient().stripThoughtsFromHistory).toHaveBeenCalledWith();
257
309
  });
310
+ it('should strip thoughts when switching from GenAI to Vertex AI', async () => {
311
+ const config = new Config(baseParams);
312
+ vi.mocked(createContentGeneratorConfig).mockImplementation(async (_, authType) => ({ authType }));
313
+ await config.refreshAuth(AuthType.USE_GEMINI);
314
+ await config.refreshAuth(AuthType.USE_VERTEX_AI);
315
+ expect(config.getGeminiClient().stripThoughtsFromHistory).toHaveBeenCalledWith();
316
+ });
258
317
  it('should not strip thoughts when switching from Vertex to GenAI', async () => {
259
318
  const config = new Config(baseParams);
260
319
  vi.mocked(createContentGeneratorConfig).mockImplementation(async (_, authType) => Promise.resolve({
@@ -265,6 +324,72 @@ describe('Server Config (config.ts)', () => {
265
324
  expect(config.getGeminiClient().stripThoughtsFromHistory).not.toHaveBeenCalledWith();
266
325
  });
267
326
  });
327
+ describe('Preview Features Logic in refreshAuth', () => {
328
+ beforeEach(() => {
329
+ // Set up default mock behavior for these functions before each test
330
+ vi.mocked(getCodeAssistServer).mockReturnValue(undefined);
331
+ vi.mocked(getExperiments).mockResolvedValue({
332
+ flags: {},
333
+ experimentIds: [],
334
+ });
335
+ });
336
+ it('should enable preview features for Google auth when remote flag is true', async () => {
337
+ // Override the default mock for this specific test
338
+ vi.mocked(getCodeAssistServer).mockReturnValue({}); // Simulate Google auth by returning a truthy value
339
+ vi.mocked(getExperiments).mockResolvedValue({
340
+ flags: {
341
+ [ExperimentFlags.ENABLE_PREVIEW]: { boolValue: true },
342
+ },
343
+ experimentIds: [],
344
+ });
345
+ const config = new Config({ ...baseParams, previewFeatures: undefined });
346
+ await config.refreshAuth(AuthType.LOGIN_WITH_GOOGLE);
347
+ expect(config.getPreviewFeatures()).toBe(true);
348
+ });
349
+ it('should disable preview features for Google auth when remote flag is false', async () => {
350
+ // Override the default mock
351
+ vi.mocked(getCodeAssistServer).mockReturnValue({});
352
+ vi.mocked(getExperiments).mockResolvedValue({
353
+ flags: {
354
+ [ExperimentFlags.ENABLE_PREVIEW]: { boolValue: false },
355
+ },
356
+ experimentIds: [],
357
+ });
358
+ const config = new Config({ ...baseParams, previewFeatures: undefined });
359
+ await config.refreshAuth(AuthType.LOGIN_WITH_GOOGLE);
360
+ expect(config.getPreviewFeatures()).toBe(undefined);
361
+ });
362
+ it('should disable preview features for Google auth when remote flag is missing', async () => {
363
+ // Override the default mock for getCodeAssistServer, the getExperiments mock is already correct
364
+ vi.mocked(getCodeAssistServer).mockReturnValue({});
365
+ const config = new Config({ ...baseParams, previewFeatures: undefined });
366
+ await config.refreshAuth(AuthType.LOGIN_WITH_GOOGLE);
367
+ expect(config.getPreviewFeatures()).toBe(undefined);
368
+ });
369
+ it('should not change preview features or model if it is already set to true', async () => {
370
+ const initialModel = 'some-other-model';
371
+ const config = new Config({
372
+ ...baseParams,
373
+ previewFeatures: true,
374
+ model: initialModel,
375
+ });
376
+ // It doesn't matter which auth method we use here, the logic should exit early
377
+ await config.refreshAuth(AuthType.USE_GEMINI);
378
+ expect(config.getPreviewFeatures()).toBe(true);
379
+ expect(config.getModel()).toBe(initialModel);
380
+ });
381
+ it('should not change preview features or model if it is already set to false', async () => {
382
+ const initialModel = 'some-other-model';
383
+ const config = new Config({
384
+ ...baseParams,
385
+ previewFeatures: false,
386
+ model: initialModel,
387
+ });
388
+ await config.refreshAuth(AuthType.USE_GEMINI);
389
+ expect(config.getPreviewFeatures()).toBe(false);
390
+ expect(config.getModel()).toBe(initialModel);
391
+ });
392
+ });
268
393
  it('Config constructor should store userMemory correctly', () => {
269
394
  const config = new Config(baseParams);
270
395
  expect(config.getUserMemory()).toBe(USER_MEMORY);
@@ -305,7 +430,8 @@ describe('Server Config (config.ts)', () => {
305
430
  expect(config.getFileFilteringRespectGitIgnore()).toBe(false);
306
431
  });
307
432
  it('should initialize WorkspaceContext with includeDirectories', () => {
308
- const includeDirectories = ['/path/to/dir1', '/path/to/dir2'];
433
+ const resolved = path.resolve(baseParams.targetDir);
434
+ const includeDirectories = ['dir1', 'dir2'];
309
435
  const paramsWithIncludeDirs = {
310
436
  ...baseParams,
311
437
  includeDirectories,
@@ -315,9 +441,9 @@ describe('Server Config (config.ts)', () => {
315
441
  const directories = workspaceContext.getDirectories();
316
442
  // Should include the target directory plus the included directories
317
443
  expect(directories).toHaveLength(3);
318
- expect(directories).toContain(path.resolve(baseParams.targetDir));
319
- expect(directories).toContain('/path/to/dir1');
320
- expect(directories).toContain('/path/to/dir2');
444
+ expect(directories).toContain(resolved);
445
+ expect(directories).toContain(path.join(resolved, 'dir1'));
446
+ expect(directories).toContain(path.join(resolved, 'dir2'));
321
447
  });
322
448
  it('Config constructor should set telemetry to true when provided as true', () => {
323
449
  const paramsWithTelemetry = {
@@ -674,18 +800,6 @@ describe('Server Config (config.ts)', () => {
674
800
  const wasShellToolRegistered = registerToolMock.mock.calls.some((call) => call[0] instanceof vi.mocked(ShellTool));
675
801
  expect(wasShellToolRegistered).toBe(true);
676
802
  });
677
- it('should not register a tool if excludeTools contains the non-minified class name', async () => {
678
- const params = {
679
- ...baseParams,
680
- coreTools: undefined, // all tools enabled by default
681
- excludeTools: ['ShellTool'],
682
- };
683
- const config = new Config(params);
684
- await config.initialize();
685
- const registerToolMock = (await vi.importMock('../tools/tool-registry')).ToolRegistry.prototype.registerTool;
686
- const wasShellToolRegistered = registerToolMock.mock.calls.some((call) => call[0] instanceof vi.mocked(ShellTool));
687
- expect(wasShellToolRegistered).toBe(false);
688
- });
689
803
  it('should register a tool if coreTools contains an argument-specific pattern with the non-minified class name', async () => {
690
804
  const params = {
691
805
  ...baseParams,
@@ -872,4 +986,307 @@ describe('BaseLlmClient Lifecycle', () => {
872
986
  expect(BaseLlmClient).toHaveBeenCalledWith(config.getContentGenerator(), config);
873
987
  });
874
988
  });
989
+ describe('Generation Config Merging (HACK)', () => {
990
+ const MODEL = 'gemini-pro';
991
+ const SANDBOX = {
992
+ command: 'docker',
993
+ image: 'gemini-cli-sandbox',
994
+ };
995
+ const TARGET_DIR = '/path/to/target';
996
+ const DEBUG_MODE = false;
997
+ const QUESTION = 'test question';
998
+ const USER_MEMORY = 'Test User Memory';
999
+ const TELEMETRY_SETTINGS = { enabled: false };
1000
+ const EMBEDDING_MODEL = 'gemini-embedding';
1001
+ const SESSION_ID = 'test-session-id';
1002
+ const baseParams = {
1003
+ cwd: '/tmp',
1004
+ embeddingModel: EMBEDDING_MODEL,
1005
+ sandbox: SANDBOX,
1006
+ targetDir: TARGET_DIR,
1007
+ debugMode: DEBUG_MODE,
1008
+ question: QUESTION,
1009
+ userMemory: USER_MEMORY,
1010
+ telemetry: TELEMETRY_SETTINGS,
1011
+ sessionId: SESSION_ID,
1012
+ model: MODEL,
1013
+ usageStatisticsEnabled: false,
1014
+ };
1015
+ it('should merge default aliases when user provides only overrides', () => {
1016
+ const userOverrides = [
1017
+ {
1018
+ match: { model: 'test-model' },
1019
+ modelConfig: { generateContentConfig: { temperature: 0.1 } },
1020
+ },
1021
+ ];
1022
+ const params = {
1023
+ ...baseParams,
1024
+ modelConfigServiceConfig: {
1025
+ overrides: userOverrides,
1026
+ },
1027
+ };
1028
+ const config = new Config(params);
1029
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
1030
+ const serviceConfig = config.modelConfigService.config;
1031
+ // Assert that the default aliases are present
1032
+ expect(serviceConfig.aliases).toEqual(DEFAULT_MODEL_CONFIGS.aliases);
1033
+ // Assert that the user's overrides are present
1034
+ expect(serviceConfig.overrides).toEqual(userOverrides);
1035
+ });
1036
+ it('should use user-provided aliases if they exist', () => {
1037
+ const userAliases = {
1038
+ 'my-alias': {
1039
+ modelConfig: { model: 'my-model' },
1040
+ },
1041
+ };
1042
+ const params = {
1043
+ ...baseParams,
1044
+ modelConfigServiceConfig: {
1045
+ aliases: userAliases,
1046
+ },
1047
+ };
1048
+ const config = new Config(params);
1049
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
1050
+ const serviceConfig = config.modelConfigService.config;
1051
+ // Assert that the user's aliases are used, not the defaults
1052
+ expect(serviceConfig.aliases).toEqual(userAliases);
1053
+ });
1054
+ it('should use default generation config if none is provided', () => {
1055
+ const params = { ...baseParams };
1056
+ const config = new Config(params);
1057
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
1058
+ const serviceConfig = config.modelConfigService.config;
1059
+ // Assert that the full default config is used
1060
+ expect(serviceConfig).toEqual(DEFAULT_MODEL_CONFIGS);
1061
+ });
1062
+ });
1063
+ describe('Config getHooks', () => {
1064
+ const baseParams = {
1065
+ cwd: '/tmp',
1066
+ targetDir: '/path/to/target',
1067
+ debugMode: false,
1068
+ sessionId: 'test-session-id',
1069
+ model: 'gemini-pro',
1070
+ usageStatisticsEnabled: false,
1071
+ };
1072
+ it('should return undefined when no hooks are provided', () => {
1073
+ const config = new Config(baseParams);
1074
+ expect(config.getHooks()).toBeUndefined();
1075
+ });
1076
+ it('should return empty object when empty hooks are provided', () => {
1077
+ const configWithEmptyHooks = new Config({
1078
+ ...baseParams,
1079
+ hooks: {},
1080
+ });
1081
+ expect(configWithEmptyHooks.getHooks()).toEqual({});
1082
+ });
1083
+ it('should return the hooks configuration when provided', () => {
1084
+ const mockHooks = {
1085
+ [HookEventName.BeforeTool]: [
1086
+ {
1087
+ matcher: 'write_file',
1088
+ hooks: [
1089
+ {
1090
+ type: HookType.Command,
1091
+ command: 'echo "test hook"',
1092
+ timeout: 5000,
1093
+ },
1094
+ ],
1095
+ },
1096
+ ],
1097
+ [HookEventName.AfterTool]: [
1098
+ {
1099
+ hooks: [
1100
+ {
1101
+ type: HookType.Command,
1102
+ command: './hooks/after-tool.sh',
1103
+ timeout: 10000,
1104
+ },
1105
+ ],
1106
+ },
1107
+ ],
1108
+ };
1109
+ const config = new Config({
1110
+ ...baseParams,
1111
+ hooks: mockHooks,
1112
+ });
1113
+ const retrievedHooks = config.getHooks();
1114
+ expect(retrievedHooks).toEqual(mockHooks);
1115
+ expect(retrievedHooks).toBe(mockHooks); // Should return the same reference
1116
+ });
1117
+ it('should return hooks with all supported event types', () => {
1118
+ const allEventHooks = {
1119
+ [HookEventName.BeforeAgent]: [
1120
+ { hooks: [{ type: HookType.Command, command: 'test1' }] },
1121
+ ],
1122
+ [HookEventName.AfterAgent]: [
1123
+ { hooks: [{ type: HookType.Command, command: 'test2' }] },
1124
+ ],
1125
+ [HookEventName.BeforeTool]: [
1126
+ { hooks: [{ type: HookType.Command, command: 'test3' }] },
1127
+ ],
1128
+ [HookEventName.AfterTool]: [
1129
+ { hooks: [{ type: HookType.Command, command: 'test4' }] },
1130
+ ],
1131
+ [HookEventName.BeforeModel]: [
1132
+ { hooks: [{ type: HookType.Command, command: 'test5' }] },
1133
+ ],
1134
+ [HookEventName.AfterModel]: [
1135
+ { hooks: [{ type: HookType.Command, command: 'test6' }] },
1136
+ ],
1137
+ [HookEventName.BeforeToolSelection]: [
1138
+ { hooks: [{ type: HookType.Command, command: 'test7' }] },
1139
+ ],
1140
+ [HookEventName.Notification]: [
1141
+ { hooks: [{ type: HookType.Command, command: 'test8' }] },
1142
+ ],
1143
+ [HookEventName.SessionStart]: [
1144
+ { hooks: [{ type: HookType.Command, command: 'test9' }] },
1145
+ ],
1146
+ [HookEventName.SessionEnd]: [
1147
+ { hooks: [{ type: HookType.Command, command: 'test10' }] },
1148
+ ],
1149
+ [HookEventName.PreCompress]: [
1150
+ { hooks: [{ type: HookType.Command, command: 'test11' }] },
1151
+ ],
1152
+ };
1153
+ const config = new Config({
1154
+ ...baseParams,
1155
+ hooks: allEventHooks,
1156
+ });
1157
+ const retrievedHooks = config.getHooks();
1158
+ expect(retrievedHooks).toEqual(allEventHooks);
1159
+ expect(Object.keys(retrievedHooks)).toHaveLength(11); // All hook event types
1160
+ });
1161
+ describe('setModel', () => {
1162
+ it('should allow setting a pro (any) model and disable fallback mode', () => {
1163
+ const config = new Config(baseParams);
1164
+ config.setFallbackMode(true);
1165
+ expect(config.isInFallbackMode()).toBe(true);
1166
+ const proModel = 'gemini-2.5-pro';
1167
+ config.setModel(proModel);
1168
+ expect(config.getModel()).toBe(proModel);
1169
+ expect(config.isInFallbackMode()).toBe(false);
1170
+ expect(mockCoreEvents.emitModelChanged).toHaveBeenCalledWith(proModel);
1171
+ });
1172
+ it('should allow setting auto model from non-auto model and disable fallback mode', () => {
1173
+ const config = new Config(baseParams);
1174
+ config.setFallbackMode(true);
1175
+ expect(config.isInFallbackMode()).toBe(true);
1176
+ config.setModel('auto');
1177
+ expect(config.getModel()).toBe('auto');
1178
+ expect(config.isInFallbackMode()).toBe(false);
1179
+ expect(mockCoreEvents.emitModelChanged).toHaveBeenCalledWith('auto');
1180
+ });
1181
+ it('should allow setting auto model from auto model if it is in the fallback mode', () => {
1182
+ const config = new Config({
1183
+ cwd: '/tmp',
1184
+ targetDir: '/path/to/target',
1185
+ debugMode: false,
1186
+ sessionId: 'test-session-id',
1187
+ model: 'auto',
1188
+ usageStatisticsEnabled: false,
1189
+ });
1190
+ config.setFallbackMode(true);
1191
+ expect(config.isInFallbackMode()).toBe(true);
1192
+ config.setModel('auto');
1193
+ expect(config.getModel()).toBe('auto');
1194
+ expect(config.isInFallbackMode()).toBe(false);
1195
+ expect(mockCoreEvents.emitModelChanged).toHaveBeenCalledWith('auto');
1196
+ });
1197
+ });
1198
+ });
1199
+ describe('Config getExperiments', () => {
1200
+ const baseParams = {
1201
+ cwd: '/tmp',
1202
+ targetDir: '/path/to/target',
1203
+ debugMode: false,
1204
+ sessionId: 'test-session-id',
1205
+ model: 'gemini-pro',
1206
+ usageStatisticsEnabled: false,
1207
+ };
1208
+ it('should return undefined when no experiments are provided', () => {
1209
+ const config = new Config(baseParams);
1210
+ expect(config.getExperiments()).toBeUndefined();
1211
+ });
1212
+ it('should return empty object when empty experiments are provided', () => {
1213
+ const configWithEmptyExps = new Config({
1214
+ ...baseParams,
1215
+ experiments: { flags: {}, experimentIds: [] },
1216
+ });
1217
+ expect(configWithEmptyExps.getExperiments()).toEqual({
1218
+ flags: {},
1219
+ experimentIds: [],
1220
+ });
1221
+ });
1222
+ it('should return the experiments configuration when provided', () => {
1223
+ const mockExps = {
1224
+ flags: {
1225
+ testFlag: { boolValue: true },
1226
+ },
1227
+ experimentIds: [],
1228
+ };
1229
+ const config = new Config({
1230
+ ...baseParams,
1231
+ experiments: mockExps,
1232
+ });
1233
+ const retrievedExps = config.getExperiments();
1234
+ expect(retrievedExps).toEqual(mockExps);
1235
+ expect(retrievedExps).toBe(mockExps); // Should return the same reference
1236
+ });
1237
+ });
1238
+ describe('Config setExperiments logging', () => {
1239
+ const baseParams = {
1240
+ cwd: '/tmp',
1241
+ targetDir: '/path/to/target',
1242
+ debugMode: false,
1243
+ sessionId: 'test-session-id',
1244
+ model: 'gemini-pro',
1245
+ usageStatisticsEnabled: false,
1246
+ };
1247
+ it('logs a sorted, non-truncated summary of experiments when they are set', () => {
1248
+ const config = new Config(baseParams);
1249
+ const debugSpy = vi
1250
+ .spyOn(debugLogger, 'debug')
1251
+ .mockImplementation(() => { });
1252
+ const experiments = {
1253
+ flags: {
1254
+ ZetaFlag: {
1255
+ boolValue: true,
1256
+ stringValue: 'zeta',
1257
+ int32ListValue: { values: [1, 2] },
1258
+ },
1259
+ AlphaFlag: {
1260
+ boolValue: false,
1261
+ stringValue: 'alpha',
1262
+ stringListValue: { values: ['a', 'b', 'c'] },
1263
+ },
1264
+ MiddleFlag: {
1265
+ // Intentionally sparse to ensure undefined values are omitted
1266
+ floatValue: 0.42,
1267
+ int32ListValue: { values: [] },
1268
+ },
1269
+ },
1270
+ experimentIds: [101, 99],
1271
+ };
1272
+ config.setExperiments(experiments);
1273
+ const logCall = debugSpy.mock.calls.find(([message]) => message === 'Experiments loaded');
1274
+ expect(logCall).toBeDefined();
1275
+ const loggedSummary = logCall?.[1];
1276
+ expect(typeof loggedSummary).toBe('string');
1277
+ expect(loggedSummary).toContain('experimentIds');
1278
+ expect(loggedSummary).toContain('101');
1279
+ expect(loggedSummary).toContain('AlphaFlag');
1280
+ expect(loggedSummary).toContain('ZetaFlag');
1281
+ const alphaIndex = loggedSummary.indexOf('AlphaFlag');
1282
+ const zetaIndex = loggedSummary.indexOf('ZetaFlag');
1283
+ expect(alphaIndex).toBeGreaterThan(-1);
1284
+ expect(zetaIndex).toBeGreaterThan(-1);
1285
+ expect(alphaIndex).toBeLessThan(zetaIndex);
1286
+ expect(loggedSummary).toContain('\n');
1287
+ expect(loggedSummary).not.toContain('stringListLength: 0');
1288
+ expect(loggedSummary).not.toContain('int32ListLength: 0');
1289
+ debugSpy.mockRestore();
1290
+ });
1291
+ });
875
1292
  //# sourceMappingURL=config.test.js.map