@office-ai/aioncli-core 0.2.3 → 0.18.4

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 (1051) hide show
  1. package/dist/index.d.ts +16 -3
  2. package/dist/index.js +15 -3
  3. package/dist/index.js.map +1 -1
  4. package/dist/src/agents/codebase-investigator.d.ts +46 -0
  5. package/dist/src/agents/codebase-investigator.js +132 -0
  6. package/dist/src/agents/codebase-investigator.js.map +1 -0
  7. package/dist/src/agents/codebase-investigator.test.js +35 -0
  8. package/dist/src/agents/codebase-investigator.test.js.map +1 -0
  9. package/dist/src/agents/executor.d.ts +114 -0
  10. package/dist/src/agents/executor.js +779 -0
  11. package/dist/src/agents/executor.js.map +1 -0
  12. package/dist/src/agents/executor.test.js +1362 -0
  13. package/dist/src/agents/executor.test.js.map +1 -0
  14. package/dist/src/agents/invocation.d.ts +46 -0
  15. package/dist/src/agents/invocation.js +102 -0
  16. package/dist/src/agents/invocation.js.map +1 -0
  17. package/dist/src/agents/invocation.test.js +215 -0
  18. package/dist/src/agents/invocation.test.js.map +1 -0
  19. package/dist/src/agents/registry.d.ts +40 -0
  20. package/dist/src/agents/registry.js +105 -0
  21. package/dist/src/agents/registry.js.map +1 -0
  22. package/dist/src/agents/registry.test.d.ts +6 -0
  23. package/dist/src/agents/registry.test.js +160 -0
  24. package/dist/src/agents/registry.test.js.map +1 -0
  25. package/dist/src/agents/schema-utils.d.ts +39 -0
  26. package/dist/src/agents/schema-utils.js +57 -0
  27. package/dist/src/agents/schema-utils.js.map +1 -0
  28. package/dist/src/agents/schema-utils.test.d.ts +6 -0
  29. package/dist/src/agents/schema-utils.test.js +144 -0
  30. package/dist/src/agents/schema-utils.test.js.map +1 -0
  31. package/dist/src/agents/subagent-tool-wrapper.d.ts +38 -0
  32. package/dist/src/agents/subagent-tool-wrapper.js +48 -0
  33. package/dist/src/agents/subagent-tool-wrapper.js.map +1 -0
  34. package/dist/src/agents/subagent-tool-wrapper.test.d.ts +6 -0
  35. package/dist/src/agents/subagent-tool-wrapper.test.js +110 -0
  36. package/dist/src/agents/subagent-tool-wrapper.test.js.map +1 -0
  37. package/dist/src/agents/types.d.ts +146 -0
  38. package/dist/src/agents/types.js +19 -0
  39. package/dist/src/agents/types.js.map +1 -0
  40. package/dist/src/agents/utils.d.ts +15 -0
  41. package/dist/src/agents/utils.js +29 -0
  42. package/dist/src/agents/utils.js.map +1 -0
  43. package/dist/src/agents/utils.test.d.ts +6 -0
  44. package/dist/src/agents/utils.test.js +87 -0
  45. package/dist/src/agents/utils.test.js.map +1 -0
  46. package/dist/src/code_assist/codeAssist.d.ts +6 -3
  47. package/dist/src/code_assist/codeAssist.js +13 -1
  48. package/dist/src/code_assist/codeAssist.js.map +1 -1
  49. package/dist/src/code_assist/codeAssist.test.d.ts +6 -0
  50. package/dist/src/code_assist/codeAssist.test.js +99 -0
  51. package/dist/src/code_assist/codeAssist.test.js.map +1 -0
  52. package/dist/src/code_assist/converter.d.ts +5 -1
  53. package/dist/src/code_assist/converter.js +39 -5
  54. package/dist/src/code_assist/converter.js.map +1 -1
  55. package/dist/src/code_assist/converter.test.js +112 -0
  56. package/dist/src/code_assist/converter.test.js.map +1 -1
  57. package/dist/src/code_assist/experiments/client_metadata.d.ts +12 -0
  58. package/dist/src/code_assist/experiments/client_metadata.js +50 -0
  59. package/dist/src/code_assist/experiments/client_metadata.js.map +1 -0
  60. package/dist/src/code_assist/experiments/client_metadata.test.d.ts +6 -0
  61. package/dist/src/code_assist/experiments/client_metadata.test.js +99 -0
  62. package/dist/src/code_assist/experiments/client_metadata.test.js.map +1 -0
  63. package/dist/src/code_assist/experiments/experiments.d.ts +17 -0
  64. package/dist/src/code_assist/experiments/experiments.js +36 -0
  65. package/dist/src/code_assist/experiments/experiments.js.map +1 -0
  66. package/dist/src/code_assist/experiments/experiments.test.d.ts +6 -0
  67. package/dist/src/code_assist/experiments/experiments.test.js +92 -0
  68. package/dist/src/code_assist/experiments/experiments.test.js.map +1 -0
  69. package/dist/src/code_assist/experiments/flagNames.d.ts +13 -0
  70. package/dist/src/code_assist/experiments/flagNames.js +13 -0
  71. package/dist/src/code_assist/experiments/flagNames.js.map +1 -0
  72. package/dist/src/code_assist/experiments/types.d.ts +35 -0
  73. package/dist/src/code_assist/experiments/types.js +7 -0
  74. package/dist/src/code_assist/experiments/types.js.map +1 -0
  75. package/dist/src/code_assist/oauth-credential-storage.d.ts +25 -0
  76. package/dist/src/code_assist/oauth-credential-storage.js +110 -0
  77. package/dist/src/code_assist/oauth-credential-storage.js.map +1 -0
  78. package/dist/src/code_assist/oauth-credential-storage.test.d.ts +6 -0
  79. package/dist/src/code_assist/oauth-credential-storage.test.js +198 -0
  80. package/dist/src/code_assist/oauth-credential-storage.test.js.map +1 -0
  81. package/dist/src/code_assist/oauth2.d.ts +3 -3
  82. package/dist/src/code_assist/oauth2.js +252 -125
  83. package/dist/src/code_assist/oauth2.js.map +1 -1
  84. package/dist/src/code_assist/oauth2.test.js +788 -350
  85. package/dist/src/code_assist/oauth2.test.js.map +1 -1
  86. package/dist/src/code_assist/server.d.ts +8 -6
  87. package/dist/src/code_assist/server.js +41 -10
  88. package/dist/src/code_assist/server.js.map +1 -1
  89. package/dist/src/code_assist/server.test.js +151 -28
  90. package/dist/src/code_assist/server.test.js.map +1 -1
  91. package/dist/src/code_assist/setup.d.ts +2 -2
  92. package/dist/src/code_assist/setup.js +5 -3
  93. package/dist/src/code_assist/setup.js.map +1 -1
  94. package/dist/src/code_assist/setup.test.js.map +1 -1
  95. package/dist/src/code_assist/types.d.ts +18 -3
  96. package/dist/src/code_assist/types.js.map +1 -1
  97. package/dist/src/commands/extensions.d.ts +7 -0
  98. package/dist/src/commands/extensions.js +9 -0
  99. package/dist/src/commands/extensions.js.map +1 -0
  100. package/dist/src/commands/extensions.test.d.ts +6 -0
  101. package/dist/src/commands/extensions.test.js +19 -0
  102. package/dist/src/commands/extensions.test.js.map +1 -0
  103. package/dist/src/config/config.d.ts +282 -60
  104. package/dist/src/config/config.js +677 -129
  105. package/dist/src/config/config.js.map +1 -1
  106. package/dist/src/config/config.test.js +1020 -146
  107. package/dist/src/config/config.test.js.map +1 -1
  108. package/dist/src/config/constants.d.ts +11 -0
  109. package/dist/src/config/constants.js +16 -0
  110. package/dist/src/config/constants.js.map +1 -0
  111. package/dist/src/config/defaultModelConfigs.d.ts +7 -0
  112. package/dist/src/config/defaultModelConfigs.js +185 -0
  113. package/dist/src/config/defaultModelConfigs.js.map +1 -0
  114. package/dist/src/config/models.d.ts +37 -0
  115. package/dist/src/config/models.js +72 -0
  116. package/dist/src/config/models.js.map +1 -1
  117. package/dist/src/config/models.test.d.ts +6 -0
  118. package/dist/src/config/models.test.js +116 -0
  119. package/dist/src/config/models.test.js.map +1 -0
  120. package/dist/src/config/storage.d.ts +36 -0
  121. package/dist/src/config/storage.js +115 -0
  122. package/dist/src/config/storage.js.map +1 -0
  123. package/dist/src/config/storage.test.d.ts +6 -0
  124. package/dist/src/config/storage.test.js +48 -0
  125. package/dist/src/config/storage.test.js.map +1 -0
  126. package/dist/src/confirmation-bus/index.d.ts +7 -0
  127. package/dist/src/confirmation-bus/index.js +8 -0
  128. package/dist/src/confirmation-bus/index.js.map +1 -0
  129. package/dist/src/confirmation-bus/message-bus.d.ts +18 -0
  130. package/dist/src/confirmation-bus/message-bus.js +87 -0
  131. package/dist/src/confirmation-bus/message-bus.js.map +1 -0
  132. package/dist/src/confirmation-bus/message-bus.test.d.ts +6 -0
  133. package/dist/src/confirmation-bus/message-bus.test.js +170 -0
  134. package/dist/src/confirmation-bus/message-bus.test.js.map +1 -0
  135. package/dist/src/confirmation-bus/types.d.ts +49 -0
  136. package/dist/src/confirmation-bus/types.js +16 -0
  137. package/dist/src/confirmation-bus/types.js.map +1 -0
  138. package/dist/src/core/apiKeyCredentialStorage.d.ts +17 -0
  139. package/dist/src/core/apiKeyCredentialStorage.js +64 -0
  140. package/dist/src/core/apiKeyCredentialStorage.js.map +1 -0
  141. package/dist/src/core/apiKeyCredentialStorage.test.d.ts +6 -0
  142. package/dist/src/core/apiKeyCredentialStorage.test.js +71 -0
  143. package/dist/src/core/apiKeyCredentialStorage.test.js.map +1 -0
  144. package/dist/src/core/baseLlmClient.d.ts +50 -0
  145. package/dist/src/core/baseLlmClient.js +185 -0
  146. package/dist/src/core/baseLlmClient.js.map +1 -0
  147. package/dist/src/core/baseLlmClient.test.d.ts +6 -0
  148. package/dist/src/core/baseLlmClient.test.js +311 -0
  149. package/dist/src/core/baseLlmClient.test.js.map +1 -0
  150. package/dist/src/core/client.d.ts +30 -42
  151. package/dist/src/core/client.js +178 -477
  152. package/dist/src/core/client.js.map +1 -1
  153. package/dist/src/core/client.test.js +739 -617
  154. package/dist/src/core/client.test.js.map +1 -1
  155. package/dist/src/core/contentGenerator.d.ts +7 -6
  156. package/dist/src/core/contentGenerator.js +59 -45
  157. package/dist/src/core/contentGenerator.js.map +1 -1
  158. package/dist/src/core/contentGenerator.test.js +50 -4
  159. package/dist/src/core/contentGenerator.test.js.map +1 -1
  160. package/dist/src/core/coreToolScheduler.d.ts +28 -11
  161. package/dist/src/core/coreToolScheduler.js +493 -161
  162. package/dist/src/core/coreToolScheduler.js.map +1 -1
  163. package/dist/src/core/coreToolScheduler.test.js +995 -163
  164. package/dist/src/core/coreToolScheduler.test.js.map +1 -1
  165. package/dist/src/core/fakeContentGenerator.d.ts +33 -0
  166. package/dist/src/core/fakeContentGenerator.js +58 -0
  167. package/dist/src/core/fakeContentGenerator.js.map +1 -0
  168. package/dist/src/core/fakeContentGenerator.test.d.ts +6 -0
  169. package/dist/src/core/fakeContentGenerator.test.js +127 -0
  170. package/dist/src/core/fakeContentGenerator.test.js.map +1 -0
  171. package/dist/src/core/geminiChat.d.ts +61 -55
  172. package/dist/src/core/geminiChat.js +388 -366
  173. package/dist/src/core/geminiChat.js.map +1 -1
  174. package/dist/src/core/geminiChat.test.js +1600 -355
  175. package/dist/src/core/geminiChat.test.js.map +1 -1
  176. package/dist/src/core/geminiRequest.js +1 -0
  177. package/dist/src/core/geminiRequest.js.map +1 -1
  178. package/dist/src/core/logger.d.ts +11 -4
  179. package/dist/src/core/logger.js +39 -30
  180. package/dist/src/core/logger.js.map +1 -1
  181. package/dist/src/core/logger.test.js +62 -45
  182. package/dist/src/core/logger.test.js.map +1 -1
  183. package/dist/src/core/loggingContentGenerator.d.ts +4 -3
  184. package/dist/src/core/loggingContentGenerator.js +116 -37
  185. package/dist/src/core/loggingContentGenerator.js.map +1 -1
  186. package/dist/src/core/loggingContentGenerator.test.d.ts +6 -0
  187. package/dist/src/core/loggingContentGenerator.test.js +180 -0
  188. package/dist/src/core/loggingContentGenerator.test.js.map +1 -0
  189. package/dist/src/core/nonInteractiveToolExecutor.d.ts +4 -5
  190. package/dist/src/core/nonInteractiveToolExecutor.js +17 -120
  191. package/dist/src/core/nonInteractiveToolExecutor.js.map +1 -1
  192. package/dist/src/core/nonInteractiveToolExecutor.test.js +168 -84
  193. package/dist/src/core/nonInteractiveToolExecutor.test.js.map +1 -1
  194. package/dist/src/core/openaiContentGenerator.d.ts +4 -3
  195. package/dist/src/core/openaiContentGenerator.js +49 -19
  196. package/dist/src/core/openaiContentGenerator.js.map +1 -1
  197. package/dist/src/core/openaiContentGenerator.test.js +1 -0
  198. package/dist/src/core/openaiContentGenerator.test.js.map +1 -1
  199. package/dist/src/core/prompts.d.ts +7 -1
  200. package/dist/src/core/prompts.js +198 -195
  201. package/dist/src/core/prompts.js.map +1 -1
  202. package/dist/src/core/prompts.test.js +172 -104
  203. package/dist/src/core/prompts.test.js.map +1 -1
  204. package/dist/src/core/recordingContentGenerator.d.ts +18 -0
  205. package/dist/src/core/recordingContentGenerator.js +77 -0
  206. package/dist/src/core/recordingContentGenerator.js.map +1 -0
  207. package/dist/src/core/recordingContentGenerator.test.d.ts +6 -0
  208. package/dist/src/core/recordingContentGenerator.test.js +101 -0
  209. package/dist/src/core/recordingContentGenerator.test.js.map +1 -0
  210. package/dist/src/core/subagent.d.ts +24 -18
  211. package/dist/src/core/subagent.js +125 -90
  212. package/dist/src/core/subagent.js.map +1 -1
  213. package/dist/src/core/subagent.test.js +59 -44
  214. package/dist/src/core/subagent.test.js.map +1 -1
  215. package/dist/src/core/tokenLimits.test.d.ts +6 -0
  216. package/dist/src/core/tokenLimits.test.js +26 -0
  217. package/dist/src/core/tokenLimits.test.js.map +1 -0
  218. package/dist/src/core/turn.d.ts +57 -13
  219. package/dist/src/core/turn.js +79 -35
  220. package/dist/src/core/turn.js.map +1 -1
  221. package/dist/src/core/turn.test.js +373 -120
  222. package/dist/src/core/turn.test.js.map +1 -1
  223. package/dist/src/fallback/handler.d.ts +7 -0
  224. package/dist/src/fallback/handler.js +181 -0
  225. package/dist/src/fallback/handler.js.map +1 -0
  226. package/dist/src/fallback/handler.test.d.ts +6 -0
  227. package/dist/src/fallback/handler.test.js +245 -0
  228. package/dist/src/fallback/handler.test.js.map +1 -0
  229. package/dist/src/fallback/types.d.ts +14 -0
  230. package/dist/src/fallback/types.js +7 -0
  231. package/dist/src/fallback/types.js.map +1 -0
  232. package/dist/src/generated/git-commit.d.ts +2 -2
  233. package/dist/src/generated/git-commit.js +2 -2
  234. package/dist/src/generated/git-commit.js.map +1 -1
  235. package/dist/src/hooks/hookAggregator.d.ts +68 -0
  236. package/dist/src/hooks/hookAggregator.js +262 -0
  237. package/dist/src/hooks/hookAggregator.js.map +1 -0
  238. package/dist/src/hooks/hookAggregator.test.d.ts +6 -0
  239. package/dist/src/hooks/hookAggregator.test.js +387 -0
  240. package/dist/src/hooks/hookAggregator.test.js.map +1 -0
  241. package/dist/src/hooks/hookPlanner.d.ts +46 -0
  242. package/dist/src/hooks/hookPlanner.js +108 -0
  243. package/dist/src/hooks/hookPlanner.js.map +1 -0
  244. package/dist/src/hooks/hookPlanner.test.d.ts +6 -0
  245. package/dist/src/hooks/hookPlanner.test.js +255 -0
  246. package/dist/src/hooks/hookPlanner.test.js.map +1 -0
  247. package/dist/src/hooks/hookRegistry.d.ts +87 -0
  248. package/dist/src/hooks/hookRegistry.js +198 -0
  249. package/dist/src/hooks/hookRegistry.js.map +1 -0
  250. package/dist/src/hooks/hookRegistry.test.d.ts +6 -0
  251. package/dist/src/hooks/hookRegistry.test.js +341 -0
  252. package/dist/src/hooks/hookRegistry.test.js.map +1 -0
  253. package/dist/src/hooks/hookRunner.d.ts +42 -0
  254. package/dist/src/hooks/hookRunner.js +272 -0
  255. package/dist/src/hooks/hookRunner.js.map +1 -0
  256. package/dist/src/hooks/hookRunner.test.d.ts +6 -0
  257. package/dist/src/hooks/hookRunner.test.js +468 -0
  258. package/dist/src/hooks/hookRunner.test.js.map +1 -0
  259. package/dist/src/hooks/hookTranslator.d.ts +113 -0
  260. package/dist/src/hooks/hookTranslator.js +232 -0
  261. package/dist/src/hooks/hookTranslator.js.map +1 -0
  262. package/dist/src/hooks/hookTranslator.test.d.ts +6 -0
  263. package/dist/src/hooks/hookTranslator.test.js +192 -0
  264. package/dist/src/hooks/hookTranslator.test.js.map +1 -0
  265. package/dist/src/hooks/types.d.ts +384 -0
  266. package/dist/src/hooks/types.js +284 -0
  267. package/dist/src/hooks/types.js.map +1 -0
  268. package/dist/src/hooks/types.test.d.ts +6 -0
  269. package/dist/src/hooks/types.test.js +313 -0
  270. package/dist/src/hooks/types.test.js.map +1 -0
  271. package/dist/src/ide/constants.d.ts +3 -0
  272. package/dist/src/ide/constants.js +3 -0
  273. package/dist/src/ide/constants.js.map +1 -1
  274. package/dist/src/ide/detect-ide.d.ts +52 -12
  275. package/dist/src/ide/detect-ide.js +51 -65
  276. package/dist/src/ide/detect-ide.js.map +1 -1
  277. package/dist/src/ide/detect-ide.test.js +95 -52
  278. package/dist/src/ide/detect-ide.test.js.map +1 -1
  279. package/dist/src/ide/ide-client.d.ts +72 -24
  280. package/dist/src/ide/ide-client.js +380 -84
  281. package/dist/src/ide/ide-client.js.map +1 -1
  282. package/dist/src/ide/ide-client.test.js +539 -35
  283. package/dist/src/ide/ide-client.test.js.map +1 -1
  284. package/dist/src/ide/ide-installer.d.ts +2 -2
  285. package/dist/src/ide/ide-installer.js +93 -35
  286. package/dist/src/ide/ide-installer.js.map +1 -1
  287. package/dist/src/ide/ide-installer.test.js +157 -26
  288. package/dist/src/ide/ide-installer.test.js.map +1 -1
  289. package/dist/src/ide/ideContext.d.ts +35 -365
  290. package/dist/src/ide/ideContext.js +60 -106
  291. package/dist/src/ide/ideContext.js.map +1 -1
  292. package/dist/src/ide/ideContext.test.js +152 -24
  293. package/dist/src/ide/ideContext.test.js.map +1 -1
  294. package/dist/src/ide/process-utils.d.ts +7 -5
  295. package/dist/src/ide/process-utils.js +108 -67
  296. package/dist/src/ide/process-utils.js.map +1 -1
  297. package/dist/src/ide/process-utils.test.d.ts +6 -0
  298. package/dist/src/ide/process-utils.test.js +151 -0
  299. package/dist/src/ide/process-utils.test.js.map +1 -0
  300. package/dist/src/ide/types.d.ts +486 -0
  301. package/dist/src/ide/types.js +138 -0
  302. package/dist/src/ide/types.js.map +1 -0
  303. package/dist/src/index.d.ts +41 -2
  304. package/dist/src/index.js +44 -2
  305. package/dist/src/index.js.map +1 -1
  306. package/dist/src/mcp/google-auth-provider.d.ts +5 -3
  307. package/dist/src/mcp/google-auth-provider.js +21 -3
  308. package/dist/src/mcp/google-auth-provider.js.map +1 -1
  309. package/dist/src/mcp/google-auth-provider.test.js +42 -9
  310. package/dist/src/mcp/google-auth-provider.test.js.map +1 -1
  311. package/dist/src/mcp/oauth-provider.d.ts +25 -18
  312. package/dist/src/mcp/oauth-provider.js +194 -97
  313. package/dist/src/mcp/oauth-provider.js.map +1 -1
  314. package/dist/src/mcp/oauth-provider.test.js +581 -39
  315. package/dist/src/mcp/oauth-provider.test.js.map +1 -1
  316. package/dist/src/mcp/oauth-token-storage.d.ts +14 -32
  317. package/dist/src/mcp/oauth-token-storage.js +58 -28
  318. package/dist/src/mcp/oauth-token-storage.js.map +1 -1
  319. package/dist/src/mcp/oauth-token-storage.test.js +262 -162
  320. package/dist/src/mcp/oauth-token-storage.test.js.map +1 -1
  321. package/dist/src/mcp/oauth-utils.d.ts +16 -1
  322. package/dist/src/mcp/oauth-utils.js +68 -33
  323. package/dist/src/mcp/oauth-utils.js.map +1 -1
  324. package/dist/src/mcp/oauth-utils.test.js +86 -3
  325. package/dist/src/mcp/oauth-utils.test.js.map +1 -1
  326. package/dist/src/mcp/sa-impersonation-provider.d.ts +27 -0
  327. package/dist/src/mcp/sa-impersonation-provider.js +113 -0
  328. package/dist/src/mcp/sa-impersonation-provider.js.map +1 -0
  329. package/dist/src/mcp/sa-impersonation-provider.test.d.ts +6 -0
  330. package/dist/src/mcp/sa-impersonation-provider.test.js +117 -0
  331. package/dist/src/mcp/sa-impersonation-provider.test.js.map +1 -0
  332. package/dist/src/mcp/token-storage/base-token-storage.d.ts +19 -0
  333. package/dist/src/mcp/token-storage/base-token-storage.js +36 -0
  334. package/dist/src/mcp/token-storage/base-token-storage.js.map +1 -0
  335. package/dist/src/mcp/token-storage/base-token-storage.test.d.ts +6 -0
  336. package/dist/src/mcp/token-storage/base-token-storage.test.js +151 -0
  337. package/dist/src/mcp/token-storage/base-token-storage.test.js.map +1 -0
  338. package/dist/src/mcp/token-storage/file-token-storage.d.ts +24 -0
  339. package/dist/src/mcp/token-storage/file-token-storage.js +145 -0
  340. package/dist/src/mcp/token-storage/file-token-storage.js.map +1 -0
  341. package/dist/src/mcp/token-storage/file-token-storage.test.d.ts +6 -0
  342. package/dist/src/mcp/token-storage/file-token-storage.test.js +238 -0
  343. package/dist/src/mcp/token-storage/file-token-storage.test.js.map +1 -0
  344. package/dist/src/mcp/token-storage/hybrid-token-storage.d.ts +23 -0
  345. package/dist/src/mcp/token-storage/hybrid-token-storage.js +78 -0
  346. package/dist/src/mcp/token-storage/hybrid-token-storage.js.map +1 -0
  347. package/dist/src/mcp/token-storage/hybrid-token-storage.test.d.ts +6 -0
  348. package/dist/src/mcp/token-storage/hybrid-token-storage.test.js +193 -0
  349. package/dist/src/mcp/token-storage/hybrid-token-storage.test.js.map +1 -0
  350. package/dist/src/mcp/token-storage/index.d.ts +11 -0
  351. package/dist/src/mcp/token-storage/index.js +12 -0
  352. package/dist/src/mcp/token-storage/index.js.map +1 -0
  353. package/dist/src/mcp/token-storage/keychain-token-storage.d.ts +35 -0
  354. package/dist/src/mcp/token-storage/keychain-token-storage.js +246 -0
  355. package/dist/src/mcp/token-storage/keychain-token-storage.js.map +1 -0
  356. package/dist/src/mcp/token-storage/keychain-token-storage.test.d.ts +6 -0
  357. package/dist/src/mcp/token-storage/keychain-token-storage.test.js +305 -0
  358. package/dist/src/mcp/token-storage/keychain-token-storage.test.js.map +1 -0
  359. package/dist/src/mcp/token-storage/types.d.ts +44 -0
  360. package/dist/src/mcp/token-storage/types.js +11 -0
  361. package/dist/src/mcp/token-storage/types.js.map +1 -0
  362. package/dist/src/output/json-formatter.d.ts +11 -0
  363. package/dist/src/output/json-formatter.js +30 -0
  364. package/dist/src/output/json-formatter.js.map +1 -0
  365. package/dist/src/output/json-formatter.test.d.ts +6 -0
  366. package/dist/src/output/json-formatter.test.js +266 -0
  367. package/dist/src/output/json-formatter.test.js.map +1 -0
  368. package/dist/src/output/stream-json-formatter.d.ts +32 -0
  369. package/dist/src/output/stream-json-formatter.js +52 -0
  370. package/dist/src/output/stream-json-formatter.js.map +1 -0
  371. package/dist/src/output/stream-json-formatter.test.d.ts +6 -0
  372. package/dist/src/output/stream-json-formatter.test.js +479 -0
  373. package/dist/src/output/stream-json-formatter.test.js.map +1 -0
  374. package/dist/src/output/types.d.ts +82 -0
  375. package/dist/src/output/types.js +22 -0
  376. package/dist/src/output/types.js.map +1 -0
  377. package/dist/src/policy/config.d.ts +31 -0
  378. package/dist/src/policy/config.js +199 -0
  379. package/dist/src/policy/config.js.map +1 -0
  380. package/dist/src/policy/config.test.d.ts +6 -0
  381. package/dist/src/policy/config.test.js +538 -0
  382. package/dist/src/policy/config.test.js.map +1 -0
  383. package/dist/src/policy/index.d.ts +9 -0
  384. package/dist/src/policy/index.js +10 -0
  385. package/dist/src/policy/index.js.map +1 -0
  386. package/dist/src/policy/policies/discovered.toml +8 -0
  387. package/dist/src/policy/policies/read-only.toml +56 -0
  388. package/dist/src/policy/policies/write.toml +73 -0
  389. package/dist/src/policy/policies/yolo.toml +31 -0
  390. package/dist/src/policy/policy-engine.d.ts +39 -0
  391. package/dist/src/policy/policy-engine.js +158 -0
  392. package/dist/src/policy/policy-engine.js.map +1 -0
  393. package/dist/src/policy/policy-engine.test.d.ts +6 -0
  394. package/dist/src/policy/policy-engine.test.js +899 -0
  395. package/dist/src/policy/policy-engine.test.js.map +1 -0
  396. package/dist/src/policy/stable-stringify.d.ts +58 -0
  397. package/dist/src/policy/stable-stringify.js +122 -0
  398. package/dist/src/policy/stable-stringify.js.map +1 -0
  399. package/dist/src/policy/toml-loader.d.ts +47 -0
  400. package/dist/src/policy/toml-loader.js +411 -0
  401. package/dist/src/policy/toml-loader.js.map +1 -0
  402. package/dist/src/policy/toml-loader.test.d.ts +6 -0
  403. package/dist/src/policy/toml-loader.test.js +376 -0
  404. package/dist/src/policy/toml-loader.test.js.map +1 -0
  405. package/dist/src/policy/types.d.ts +130 -0
  406. package/dist/src/policy/types.js +22 -0
  407. package/dist/src/policy/types.js.map +1 -0
  408. package/dist/src/prompts/mcp-prompts.d.ts +2 -2
  409. package/dist/src/prompts/mcp-prompts.test.d.ts +6 -0
  410. package/dist/src/prompts/mcp-prompts.test.js +39 -0
  411. package/dist/src/prompts/mcp-prompts.test.js.map +1 -0
  412. package/dist/src/prompts/prompt-registry.d.ts +1 -1
  413. package/dist/src/prompts/prompt-registry.js +2 -1
  414. package/dist/src/prompts/prompt-registry.js.map +1 -1
  415. package/dist/src/prompts/prompt-registry.test.d.ts +6 -0
  416. package/dist/src/prompts/prompt-registry.test.js +96 -0
  417. package/dist/src/prompts/prompt-registry.test.js.map +1 -0
  418. package/dist/src/routing/modelRouterService.d.ts +23 -0
  419. package/dist/src/routing/modelRouterService.js +85 -0
  420. package/dist/src/routing/modelRouterService.js.map +1 -0
  421. package/dist/src/routing/modelRouterService.test.d.ts +6 -0
  422. package/dist/src/routing/modelRouterService.test.js +160 -0
  423. package/dist/src/routing/modelRouterService.test.js.map +1 -0
  424. package/dist/src/routing/routingStrategy.d.ts +62 -0
  425. package/dist/src/routing/routingStrategy.js +7 -0
  426. package/dist/src/routing/routingStrategy.js.map +1 -0
  427. package/dist/src/routing/strategies/classifierStrategy.d.ts +12 -0
  428. package/dist/src/routing/strategies/classifierStrategy.js +166 -0
  429. package/dist/src/routing/strategies/classifierStrategy.js.map +1 -0
  430. package/dist/src/routing/strategies/classifierStrategy.test.d.ts +6 -0
  431. package/dist/src/routing/strategies/classifierStrategy.test.js +196 -0
  432. package/dist/src/routing/strategies/classifierStrategy.test.js.map +1 -0
  433. package/dist/src/routing/strategies/compositeStrategy.d.ts +26 -0
  434. package/dist/src/routing/strategies/compositeStrategy.js +68 -0
  435. package/dist/src/routing/strategies/compositeStrategy.js.map +1 -0
  436. package/dist/src/routing/strategies/compositeStrategy.test.d.ts +6 -0
  437. package/dist/src/routing/strategies/compositeStrategy.test.js +123 -0
  438. package/dist/src/routing/strategies/compositeStrategy.test.js.map +1 -0
  439. package/dist/src/routing/strategies/defaultStrategy.d.ts +12 -0
  440. package/dist/src/routing/strategies/defaultStrategy.js +20 -0
  441. package/dist/src/routing/strategies/defaultStrategy.js.map +1 -0
  442. package/dist/src/routing/strategies/defaultStrategy.test.d.ts +6 -0
  443. package/dist/src/routing/strategies/defaultStrategy.test.js +26 -0
  444. package/dist/src/routing/strategies/defaultStrategy.test.js.map +1 -0
  445. package/dist/src/routing/strategies/fallbackStrategy.d.ts +12 -0
  446. package/dist/src/routing/strategies/fallbackStrategy.js +25 -0
  447. package/dist/src/routing/strategies/fallbackStrategy.js.map +1 -0
  448. package/dist/src/routing/strategies/fallbackStrategy.test.d.ts +6 -0
  449. package/dist/src/routing/strategies/fallbackStrategy.test.js +59 -0
  450. package/dist/src/routing/strategies/fallbackStrategy.test.js.map +1 -0
  451. package/dist/src/routing/strategies/overrideStrategy.d.ts +15 -0
  452. package/dist/src/routing/strategies/overrideStrategy.js +28 -0
  453. package/dist/src/routing/strategies/overrideStrategy.js.map +1 -0
  454. package/dist/src/routing/strategies/overrideStrategy.test.d.ts +6 -0
  455. package/dist/src/routing/strategies/overrideStrategy.test.js +45 -0
  456. package/dist/src/routing/strategies/overrideStrategy.test.js.map +1 -0
  457. package/dist/src/safety/built-in.d.ts +21 -0
  458. package/dist/src/safety/built-in.js +106 -0
  459. package/dist/src/safety/built-in.js.map +1 -0
  460. package/dist/src/safety/built-in.test.d.ts +6 -0
  461. package/dist/src/safety/built-in.test.js +199 -0
  462. package/dist/src/safety/built-in.test.js.map +1 -0
  463. package/dist/src/safety/checker-runner.d.ts +48 -0
  464. package/dist/src/safety/checker-runner.js +208 -0
  465. package/dist/src/safety/checker-runner.js.map +1 -0
  466. package/dist/src/safety/checker-runner.test.d.ts +6 -0
  467. package/dist/src/safety/checker-runner.test.js +238 -0
  468. package/dist/src/safety/checker-runner.test.js.map +1 -0
  469. package/dist/src/safety/context-builder.d.ts +23 -0
  470. package/dist/src/safety/context-builder.js +47 -0
  471. package/dist/src/safety/context-builder.js.map +1 -0
  472. package/dist/src/safety/context-builder.test.d.ts +6 -0
  473. package/dist/src/safety/context-builder.test.js +49 -0
  474. package/dist/src/safety/context-builder.test.js.map +1 -0
  475. package/dist/src/safety/protocol.d.ts +88 -0
  476. package/dist/src/safety/protocol.js +15 -0
  477. package/dist/src/safety/protocol.js.map +1 -0
  478. package/dist/src/safety/registry.d.ts +26 -0
  479. package/dist/src/safety/registry.js +65 -0
  480. package/dist/src/safety/registry.js.map +1 -0
  481. package/dist/src/safety/registry.test.d.ts +6 -0
  482. package/dist/src/safety/registry.test.js +31 -0
  483. package/dist/src/safety/registry.test.js.map +1 -0
  484. package/dist/src/services/chatCompressionService.d.ts +32 -0
  485. package/dist/src/services/chatCompressionService.js +162 -0
  486. package/dist/src/services/chatCompressionService.js.map +1 -0
  487. package/dist/src/services/chatCompressionService.test.d.ts +6 -0
  488. package/dist/src/services/chatCompressionService.test.js +210 -0
  489. package/dist/src/services/chatCompressionService.test.js.map +1 -0
  490. package/dist/src/services/chatRecordingService.d.ts +10 -15
  491. package/dist/src/services/chatRecordingService.js +43 -29
  492. package/dist/src/services/chatRecordingService.js.map +1 -1
  493. package/dist/src/services/chatRecordingService.test.js +69 -25
  494. package/dist/src/services/chatRecordingService.test.js.map +1 -1
  495. package/dist/src/services/fileDiscoveryService.d.ts +8 -10
  496. package/dist/src/services/fileDiscoveryService.js +31 -53
  497. package/dist/src/services/fileDiscoveryService.js.map +1 -1
  498. package/dist/src/services/fileDiscoveryService.test.js +94 -14
  499. package/dist/src/services/fileDiscoveryService.test.js.map +1 -1
  500. package/dist/src/services/fileSystemService.d.ts +9 -0
  501. package/dist/src/services/fileSystemService.js +12 -1
  502. package/dist/src/services/fileSystemService.js.map +1 -1
  503. package/dist/src/services/fileSystemService.test.js +1 -1
  504. package/dist/src/services/fileSystemService.test.js.map +1 -1
  505. package/dist/src/services/gitService.d.ts +3 -1
  506. package/dist/src/services/gitService.js +30 -24
  507. package/dist/src/services/gitService.js.map +1 -1
  508. package/dist/src/services/gitService.test.js +30 -37
  509. package/dist/src/services/gitService.test.js.map +1 -1
  510. package/dist/src/services/loopDetectionService.d.ts +12 -3
  511. package/dist/src/services/loopDetectionService.js +148 -55
  512. package/dist/src/services/loopDetectionService.js.map +1 -1
  513. package/dist/src/services/loopDetectionService.test.js +280 -21
  514. package/dist/src/services/loopDetectionService.test.js.map +1 -1
  515. package/dist/src/services/modelConfig.golden.test.d.ts +6 -0
  516. package/dist/src/services/modelConfig.golden.test.js +42 -0
  517. package/dist/src/services/modelConfig.golden.test.js.map +1 -0
  518. package/dist/src/services/modelConfig.integration.test.d.ts +6 -0
  519. package/dist/src/services/modelConfig.integration.test.js +247 -0
  520. package/dist/src/services/modelConfig.integration.test.js.map +1 -0
  521. package/dist/src/services/modelConfigService.d.ts +48 -0
  522. package/dist/src/services/modelConfigService.js +151 -0
  523. package/dist/src/services/modelConfigService.js.map +1 -0
  524. package/dist/src/services/modelConfigService.test.d.ts +6 -0
  525. package/dist/src/services/modelConfigService.test.js +531 -0
  526. package/dist/src/services/modelConfigService.test.js.map +1 -0
  527. package/dist/src/services/shellExecutionService.d.ts +37 -2
  528. package/dist/src/services/shellExecutionService.js +361 -67
  529. package/dist/src/services/shellExecutionService.js.map +1 -1
  530. package/dist/src/services/shellExecutionService.test.js +333 -71
  531. package/dist/src/services/shellExecutionService.test.js.map +1 -1
  532. package/dist/src/services/test-data/resolved-aliases.golden.json +202 -0
  533. package/dist/src/telemetry/activity-detector.d.ts +41 -0
  534. package/dist/src/telemetry/activity-detector.js +61 -0
  535. package/dist/src/telemetry/activity-detector.js.map +1 -0
  536. package/dist/src/telemetry/activity-detector.test.d.ts +6 -0
  537. package/dist/src/telemetry/activity-detector.test.js +136 -0
  538. package/dist/src/telemetry/activity-detector.test.js.map +1 -0
  539. package/dist/src/telemetry/activity-monitor.d.ts +116 -0
  540. package/dist/src/telemetry/activity-monitor.js +209 -0
  541. package/dist/src/telemetry/activity-monitor.js.map +1 -0
  542. package/dist/src/telemetry/activity-monitor.test.d.ts +6 -0
  543. package/dist/src/telemetry/activity-monitor.test.js +251 -0
  544. package/dist/src/telemetry/activity-monitor.test.js.map +1 -0
  545. package/dist/src/telemetry/activity-types.d.ts +19 -0
  546. package/dist/src/telemetry/activity-types.js +21 -0
  547. package/dist/src/telemetry/activity-types.js.map +1 -0
  548. package/dist/src/telemetry/clearcut-logger/clearcut-logger.d.ts +53 -5
  549. package/dist/src/telemetry/clearcut-logger/clearcut-logger.js +581 -56
  550. package/dist/src/telemetry/clearcut-logger/clearcut-logger.js.map +1 -1
  551. package/dist/src/telemetry/clearcut-logger/clearcut-logger.test.d.ts +2 -0
  552. package/dist/src/telemetry/clearcut-logger/clearcut-logger.test.js +467 -31
  553. package/dist/src/telemetry/clearcut-logger/clearcut-logger.test.js.map +1 -1
  554. package/dist/src/telemetry/clearcut-logger/event-metadata-key.d.ts +75 -4
  555. package/dist/src/telemetry/clearcut-logger/event-metadata-key.js +182 -6
  556. package/dist/src/telemetry/clearcut-logger/event-metadata-key.js.map +1 -1
  557. package/dist/src/telemetry/config.d.ts +31 -0
  558. package/dist/src/telemetry/config.js +76 -0
  559. package/dist/src/telemetry/config.js.map +1 -0
  560. package/dist/src/telemetry/config.test.d.ts +6 -0
  561. package/dist/src/telemetry/config.test.js +124 -0
  562. package/dist/src/telemetry/config.test.js.map +1 -0
  563. package/dist/src/telemetry/constants.d.ts +0 -18
  564. package/dist/src/telemetry/constants.js +0 -18
  565. package/dist/src/telemetry/constants.js.map +1 -1
  566. package/dist/src/telemetry/file-exporters.d.ts +5 -4
  567. package/dist/src/telemetry/file-exporters.js +1 -1
  568. package/dist/src/telemetry/file-exporters.js.map +1 -1
  569. package/dist/src/telemetry/gcp-exporters.d.ts +34 -0
  570. package/dist/src/telemetry/gcp-exporters.js +116 -0
  571. package/dist/src/telemetry/gcp-exporters.js.map +1 -0
  572. package/dist/src/telemetry/gcp-exporters.test.d.ts +6 -0
  573. package/dist/src/telemetry/gcp-exporters.test.js +318 -0
  574. package/dist/src/telemetry/gcp-exporters.test.js.map +1 -0
  575. package/dist/src/telemetry/high-water-mark-tracker.d.ts +43 -0
  576. package/dist/src/telemetry/high-water-mark-tracker.js +88 -0
  577. package/dist/src/telemetry/high-water-mark-tracker.js.map +1 -0
  578. package/dist/src/telemetry/high-water-mark-tracker.test.d.ts +6 -0
  579. package/dist/src/telemetry/high-water-mark-tracker.test.js +152 -0
  580. package/dist/src/telemetry/high-water-mark-tracker.test.js.map +1 -0
  581. package/dist/src/telemetry/index.d.ts +16 -2
  582. package/dist/src/telemetry/index.js +25 -2
  583. package/dist/src/telemetry/index.js.map +1 -1
  584. package/dist/src/telemetry/loggers.d.ts +25 -3
  585. package/dist/src/telemetry/loggers.js +333 -154
  586. package/dist/src/telemetry/loggers.js.map +1 -1
  587. package/dist/src/telemetry/loggers.test.circular.js +3 -4
  588. package/dist/src/telemetry/loggers.test.circular.js.map +1 -1
  589. package/dist/src/telemetry/loggers.test.js +868 -63
  590. package/dist/src/telemetry/loggers.test.js.map +1 -1
  591. package/dist/src/telemetry/memory-monitor.d.ts +149 -0
  592. package/dist/src/telemetry/memory-monitor.js +335 -0
  593. package/dist/src/telemetry/memory-monitor.js.map +1 -0
  594. package/dist/src/telemetry/memory-monitor.test.d.ts +6 -0
  595. package/dist/src/telemetry/memory-monitor.test.js +472 -0
  596. package/dist/src/telemetry/memory-monitor.test.js.map +1 -0
  597. package/dist/src/telemetry/metrics.d.ts +498 -11
  598. package/dist/src/telemetry/metrics.js +729 -84
  599. package/dist/src/telemetry/metrics.js.map +1 -1
  600. package/dist/src/telemetry/metrics.test.js +964 -101
  601. package/dist/src/telemetry/metrics.test.js.map +1 -1
  602. package/dist/src/telemetry/rate-limiter.d.ts +48 -0
  603. package/dist/src/telemetry/rate-limiter.js +100 -0
  604. package/dist/src/telemetry/rate-limiter.js.map +1 -0
  605. package/dist/src/telemetry/rate-limiter.test.d.ts +6 -0
  606. package/dist/src/telemetry/rate-limiter.test.js +207 -0
  607. package/dist/src/telemetry/rate-limiter.test.js.map +1 -0
  608. package/dist/src/telemetry/sdk.d.ts +1 -1
  609. package/dist/src/telemetry/sdk.js +23 -4
  610. package/dist/src/telemetry/sdk.js.map +1 -1
  611. package/dist/src/telemetry/sdk.test.js +108 -0
  612. package/dist/src/telemetry/sdk.test.js.map +1 -1
  613. package/dist/src/telemetry/semantic.d.ts +82 -0
  614. package/dist/src/telemetry/semantic.js +269 -0
  615. package/dist/src/telemetry/semantic.js.map +1 -0
  616. package/dist/src/telemetry/semantic.test.d.ts +6 -0
  617. package/dist/src/telemetry/semantic.test.js +387 -0
  618. package/dist/src/telemetry/semantic.test.js.map +1 -0
  619. package/dist/src/telemetry/telemetry-utils.d.ts +6 -0
  620. package/dist/src/telemetry/telemetry-utils.js +14 -0
  621. package/dist/src/telemetry/telemetry-utils.js.map +1 -0
  622. package/dist/src/telemetry/telemetry-utils.test.d.ts +6 -0
  623. package/dist/src/telemetry/telemetry-utils.test.js +41 -0
  624. package/dist/src/telemetry/telemetry-utils.test.js.map +1 -0
  625. package/dist/src/telemetry/telemetryAttributes.d.ts +8 -0
  626. package/dist/src/telemetry/telemetryAttributes.js +19 -0
  627. package/dist/src/telemetry/telemetryAttributes.js.map +1 -0
  628. package/dist/src/telemetry/trace.d.ts +46 -0
  629. package/dist/src/telemetry/trace.js +121 -0
  630. package/dist/src/telemetry/trace.js.map +1 -0
  631. package/dist/src/telemetry/types.d.ts +351 -25
  632. package/dist/src/telemetry/types.js +1071 -63
  633. package/dist/src/telemetry/types.js.map +1 -1
  634. package/dist/src/telemetry/uiTelemetry.d.ts +4 -4
  635. package/dist/src/telemetry/uiTelemetry.js +14 -15
  636. package/dist/src/telemetry/uiTelemetry.js.map +1 -1
  637. package/dist/src/telemetry/uiTelemetry.test.js +122 -96
  638. package/dist/src/telemetry/uiTelemetry.test.js.map +1 -1
  639. package/dist/src/test-utils/config.d.ts +3 -2
  640. package/dist/src/test-utils/config.js +1 -1
  641. package/dist/src/test-utils/config.js.map +1 -1
  642. package/dist/src/test-utils/index.d.ts +6 -0
  643. package/dist/src/test-utils/index.js +7 -0
  644. package/dist/src/test-utils/index.js.map +1 -0
  645. package/dist/src/test-utils/mock-tool.d.ts +66 -0
  646. package/dist/src/test-utils/{tools.js → mock-tool.js} +45 -29
  647. package/dist/src/test-utils/mock-tool.js.map +1 -0
  648. package/dist/src/test-utils/mockWorkspaceContext.d.ts +1 -1
  649. package/dist/src/tools/base-tool-invocation.test.d.ts +6 -0
  650. package/dist/src/tools/base-tool-invocation.test.js +85 -0
  651. package/dist/src/tools/base-tool-invocation.test.js.map +1 -0
  652. package/dist/src/tools/diffOptions.d.ts +1 -1
  653. package/dist/src/tools/diffOptions.js +21 -13
  654. package/dist/src/tools/diffOptions.js.map +1 -1
  655. package/dist/src/tools/diffOptions.test.js +58 -22
  656. package/dist/src/tools/diffOptions.test.js.map +1 -1
  657. package/dist/src/tools/edit.d.ts +10 -8
  658. package/dist/src/tools/edit.js +100 -79
  659. package/dist/src/tools/edit.js.map +1 -1
  660. package/dist/src/tools/edit.test.js +429 -163
  661. package/dist/src/tools/edit.test.js.map +1 -1
  662. package/dist/src/tools/glob.d.ts +11 -5
  663. package/dist/src/tools/glob.js +58 -42
  664. package/dist/src/tools/glob.js.map +1 -1
  665. package/dist/src/tools/glob.test.js +249 -166
  666. package/dist/src/tools/glob.test.js.map +1 -1
  667. package/dist/src/tools/grep.d.ts +7 -5
  668. package/dist/src/tools/grep.js +66 -40
  669. package/dist/src/tools/grep.js.map +1 -1
  670. package/dist/src/tools/grep.test.js +41 -15
  671. package/dist/src/tools/grep.test.js.map +1 -1
  672. package/dist/src/tools/ls.d.ts +7 -5
  673. package/dist/src/tools/ls.js +54 -68
  674. package/dist/src/tools/ls.js.map +1 -1
  675. package/dist/src/tools/ls.test.js +150 -293
  676. package/dist/src/tools/ls.test.js.map +1 -1
  677. package/dist/src/tools/mcp-client-manager.d.ts +52 -12
  678. package/dist/src/tools/mcp-client-manager.js +196 -27
  679. package/dist/src/tools/mcp-client-manager.js.map +1 -1
  680. package/dist/src/tools/mcp-client-manager.test.js +139 -13
  681. package/dist/src/tools/mcp-client-manager.test.js.map +1 -1
  682. package/dist/src/tools/mcp-client.d.ts +28 -24
  683. package/dist/src/tools/mcp-client.js +338 -351
  684. package/dist/src/tools/mcp-client.js.map +1 -1
  685. package/dist/src/tools/mcp-client.test.js +380 -193
  686. package/dist/src/tools/mcp-client.test.js.map +1 -1
  687. package/dist/src/tools/mcp-tool.d.ts +11 -5
  688. package/dist/src/tools/mcp-tool.js +66 -17
  689. package/dist/src/tools/mcp-tool.js.map +1 -1
  690. package/dist/src/tools/mcp-tool.test.js +278 -211
  691. package/dist/src/tools/mcp-tool.test.js.map +1 -1
  692. package/dist/src/tools/memoryTool.d.ts +10 -7
  693. package/dist/src/tools/memoryTool.js +28 -49
  694. package/dist/src/tools/memoryTool.js.map +1 -1
  695. package/dist/src/tools/memoryTool.test.js +26 -13
  696. package/dist/src/tools/memoryTool.test.js.map +1 -1
  697. package/dist/src/tools/message-bus-integration.test.d.ts +6 -0
  698. package/dist/src/tools/message-bus-integration.test.js +196 -0
  699. package/dist/src/tools/message-bus-integration.test.js.map +1 -0
  700. package/dist/src/tools/modifiable-tool.d.ts +7 -3
  701. package/dist/src/tools/modifiable-tool.js +41 -19
  702. package/dist/src/tools/modifiable-tool.js.map +1 -1
  703. package/dist/src/tools/modifiable-tool.test.js +70 -35
  704. package/dist/src/tools/modifiable-tool.test.js.map +1 -1
  705. package/dist/src/tools/read-file.d.ts +9 -7
  706. package/dist/src/tools/read-file.js +39 -60
  707. package/dist/src/tools/read-file.js.map +1 -1
  708. package/dist/src/tools/read-file.test.js +103 -36
  709. package/dist/src/tools/read-file.test.js.map +1 -1
  710. package/dist/src/tools/read-many-files.d.ts +9 -14
  711. package/dist/src/tools/read-many-files.js +71 -155
  712. package/dist/src/tools/read-many-files.js.map +1 -1
  713. package/dist/src/tools/read-many-files.test.js +98 -44
  714. package/dist/src/tools/read-many-files.test.js.map +1 -1
  715. package/dist/src/tools/ripGrep.d.ts +73 -0
  716. package/dist/src/tools/ripGrep.js +395 -0
  717. package/dist/src/tools/ripGrep.js.map +1 -0
  718. package/dist/src/tools/ripGrep.test.d.ts +6 -0
  719. package/dist/src/tools/ripGrep.test.js +1305 -0
  720. package/dist/src/tools/ripGrep.test.js.map +1 -0
  721. package/dist/src/tools/shell.d.ts +19 -6
  722. package/dist/src/tools/shell.js +92 -56
  723. package/dist/src/tools/shell.js.map +1 -1
  724. package/dist/src/tools/shell.test.js +176 -103
  725. package/dist/src/tools/shell.test.js.map +1 -1
  726. package/dist/src/tools/smart-edit.d.ts +78 -0
  727. package/dist/src/tools/smart-edit.js +717 -0
  728. package/dist/src/tools/smart-edit.js.map +1 -0
  729. package/dist/src/tools/smart-edit.test.d.ts +6 -0
  730. package/dist/src/tools/smart-edit.test.js +592 -0
  731. package/dist/src/tools/smart-edit.test.js.map +1 -0
  732. package/dist/src/tools/tool-error.d.ts +39 -1
  733. package/dist/src/tools/tool-error.js +54 -0
  734. package/dist/src/tools/tool-error.js.map +1 -1
  735. package/dist/src/tools/tool-names.d.ts +17 -0
  736. package/dist/src/tools/tool-names.js +21 -0
  737. package/dist/src/tools/tool-names.js.map +1 -0
  738. package/dist/src/tools/tool-registry.d.ts +38 -20
  739. package/dist/src/tools/tool-registry.js +134 -77
  740. package/dist/src/tools/tool-registry.js.map +1 -1
  741. package/dist/src/tools/tool-registry.test.js +218 -58
  742. package/dist/src/tools/tool-registry.test.js.map +1 -1
  743. package/dist/src/tools/tools.d.ts +49 -17
  744. package/dist/src/tools/tools.js +150 -8
  745. package/dist/src/tools/tools.js.map +1 -1
  746. package/dist/src/tools/tools.test.js +1 -2
  747. package/dist/src/tools/tools.test.js.map +1 -1
  748. package/dist/src/tools/web-fetch.d.ts +14 -5
  749. package/dist/src/tools/web-fetch.js +90 -44
  750. package/dist/src/tools/web-fetch.js.map +1 -1
  751. package/dist/src/tools/web-fetch.test.js +388 -20
  752. package/dist/src/tools/web-fetch.test.js.map +1 -1
  753. package/dist/src/tools/web-search.d.ts +8 -6
  754. package/dist/src/tools/web-search.js +40 -15
  755. package/dist/src/tools/web-search.js.map +1 -1
  756. package/dist/src/tools/web-search.test.js +75 -1
  757. package/dist/src/tools/web-search.test.js.map +1 -1
  758. package/dist/src/tools/write-file.d.ts +7 -5
  759. package/dist/src/tools/write-file.js +54 -54
  760. package/dist/src/tools/write-file.js.map +1 -1
  761. package/dist/src/tools/write-file.test.js +237 -146
  762. package/dist/src/tools/write-file.test.js.map +1 -1
  763. package/dist/src/tools/write-todos.d.ts +50 -0
  764. package/dist/src/tools/write-todos.js +193 -0
  765. package/dist/src/tools/write-todos.js.map +1 -0
  766. package/dist/src/tools/write-todos.test.d.ts +6 -0
  767. package/dist/src/tools/write-todos.test.js +89 -0
  768. package/dist/src/tools/write-todos.test.js.map +1 -0
  769. package/dist/src/utils/bfsFileSearch.d.ts +2 -2
  770. package/dist/src/utils/bfsFileSearch.js +16 -9
  771. package/dist/src/utils/bfsFileSearch.js.map +1 -1
  772. package/dist/src/utils/bfsFileSearch.test.js +3 -3
  773. package/dist/src/utils/bfsFileSearch.test.js.map +1 -1
  774. package/dist/src/utils/channel.d.ts +19 -0
  775. package/dist/src/utils/channel.js +49 -0
  776. package/dist/src/utils/channel.js.map +1 -0
  777. package/dist/src/utils/channel.test.d.ts +6 -0
  778. package/dist/src/utils/channel.test.js +170 -0
  779. package/dist/src/utils/channel.test.js.map +1 -0
  780. package/dist/src/utils/debugLogger.d.ts +25 -0
  781. package/dist/src/utils/debugLogger.js +33 -0
  782. package/dist/src/utils/debugLogger.js.map +1 -0
  783. package/dist/src/utils/debugLogger.test.d.ts +6 -0
  784. package/dist/src/utils/debugLogger.test.js +69 -0
  785. package/dist/src/utils/debugLogger.test.js.map +1 -0
  786. package/dist/src/utils/delay.d.ts +16 -0
  787. package/dist/src/utils/delay.js +43 -0
  788. package/dist/src/utils/delay.js.map +1 -0
  789. package/dist/src/utils/delay.test.d.ts +6 -0
  790. package/dist/src/utils/delay.test.js +88 -0
  791. package/dist/src/utils/delay.test.js.map +1 -0
  792. package/dist/src/utils/editCorrector.d.ts +9 -8
  793. package/dist/src/utils/editCorrector.js +62 -34
  794. package/dist/src/utils/editCorrector.js.map +1 -1
  795. package/dist/src/utils/editCorrector.test.js +52 -87
  796. package/dist/src/utils/editCorrector.test.js.map +1 -1
  797. package/dist/src/utils/editor.d.ts +4 -2
  798. package/dist/src/utils/editor.js +56 -55
  799. package/dist/src/utils/editor.js.map +1 -1
  800. package/dist/src/utils/editor.test.js +47 -88
  801. package/dist/src/utils/editor.test.js.map +1 -1
  802. package/dist/src/utils/environmentContext.d.ts +3 -2
  803. package/dist/src/utils/environmentContext.js +20 -33
  804. package/dist/src/utils/environmentContext.js.map +1 -1
  805. package/dist/src/utils/environmentContext.test.js +6 -34
  806. package/dist/src/utils/environmentContext.test.js.map +1 -1
  807. package/dist/src/utils/errorParsing.d.ts +1 -1
  808. package/dist/src/utils/errorParsing.js +5 -33
  809. package/dist/src/utils/errorParsing.js.map +1 -1
  810. package/dist/src/utils/errorParsing.test.js +0 -88
  811. package/dist/src/utils/errorParsing.test.js.map +1 -1
  812. package/dist/src/utils/errorReporting.d.ts +1 -1
  813. package/dist/src/utils/errors.d.ts +28 -0
  814. package/dist/src/utils/errors.js +48 -0
  815. package/dist/src/utils/errors.js.map +1 -1
  816. package/dist/src/utils/events.d.ts +121 -0
  817. package/dist/src/utils/events.js +84 -0
  818. package/dist/src/utils/events.js.map +1 -0
  819. package/dist/src/utils/events.test.d.ts +6 -0
  820. package/dist/src/utils/events.test.js +212 -0
  821. package/dist/src/utils/events.test.js.map +1 -0
  822. package/dist/src/utils/extensionLoader.d.ts +86 -0
  823. package/dist/src/utils/extensionLoader.js +208 -0
  824. package/dist/src/utils/extensionLoader.js.map +1 -0
  825. package/dist/src/utils/extensionLoader.test.d.ts +6 -0
  826. package/dist/src/utils/extensionLoader.test.js +154 -0
  827. package/dist/src/utils/extensionLoader.test.js.map +1 -0
  828. package/dist/src/utils/fetch.d.ts +1 -0
  829. package/dist/src/utils/fetch.js +5 -1
  830. package/dist/src/utils/fetch.js.map +1 -1
  831. package/dist/src/utils/fileUtils.d.ts +28 -12
  832. package/dist/src/utils/fileUtils.js +204 -81
  833. package/dist/src/utils/fileUtils.js.map +1 -1
  834. package/dist/src/utils/fileUtils.test.js +426 -82
  835. package/dist/src/utils/fileUtils.test.js.map +1 -1
  836. package/dist/src/utils/filesearch/crawler.d.ts +1 -1
  837. package/dist/src/utils/filesearch/crawler.test.js +2 -2
  838. package/dist/src/utils/filesearch/crawler.test.js.map +1 -1
  839. package/dist/src/utils/filesearch/fileSearch.d.ts +1 -0
  840. package/dist/src/utils/filesearch/fileSearch.js +14 -9
  841. package/dist/src/utils/filesearch/fileSearch.js.map +1 -1
  842. package/dist/src/utils/filesearch/fileSearch.test.js +90 -0
  843. package/dist/src/utils/filesearch/fileSearch.test.js.map +1 -1
  844. package/dist/src/utils/flashFallback.test.d.ts +6 -0
  845. package/dist/src/utils/flashFallback.test.js +103 -0
  846. package/dist/src/utils/flashFallback.test.js.map +1 -0
  847. package/dist/src/utils/formatters.d.ts +1 -0
  848. package/dist/src/utils/formatters.js +2 -1
  849. package/dist/src/utils/formatters.js.map +1 -1
  850. package/dist/src/utils/formatters.test.d.ts +6 -0
  851. package/dist/src/utils/formatters.test.js +26 -0
  852. package/dist/src/utils/formatters.test.js.map +1 -0
  853. package/dist/src/utils/geminiIgnoreParser.d.ts +18 -0
  854. package/dist/src/utils/geminiIgnoreParser.js +61 -0
  855. package/dist/src/utils/geminiIgnoreParser.js.map +1 -0
  856. package/dist/src/utils/geminiIgnoreParser.test.d.ts +6 -0
  857. package/dist/src/utils/geminiIgnoreParser.test.js +50 -0
  858. package/dist/src/utils/geminiIgnoreParser.test.js.map +1 -0
  859. package/dist/src/utils/generateContentResponseUtilities.d.ts +1 -2
  860. package/dist/src/utils/generateContentResponseUtilities.js +1 -13
  861. package/dist/src/utils/generateContentResponseUtilities.js.map +1 -1
  862. package/dist/src/utils/generateContentResponseUtilities.test.js +2 -40
  863. package/dist/src/utils/generateContentResponseUtilities.test.js.map +1 -1
  864. package/dist/src/utils/getFolderStructure.d.ts +2 -2
  865. package/dist/src/utils/getFolderStructure.js +12 -20
  866. package/dist/src/utils/getFolderStructure.js.map +1 -1
  867. package/dist/src/utils/getFolderStructure.test.js +11 -10
  868. package/dist/src/utils/getFolderStructure.test.js.map +1 -1
  869. package/dist/src/utils/gitIgnoreParser.d.ts +7 -8
  870. package/dist/src/utils/gitIgnoreParser.js +145 -36
  871. package/dist/src/utils/gitIgnoreParser.js.map +1 -1
  872. package/dist/src/utils/gitIgnoreParser.test.js +127 -38
  873. package/dist/src/utils/gitIgnoreParser.test.js.map +1 -1
  874. package/dist/src/utils/gitUtils.js +2 -2
  875. package/dist/src/utils/gitUtils.js.map +1 -1
  876. package/dist/src/utils/googleErrors.d.ts +104 -0
  877. package/dist/src/utils/googleErrors.js +152 -0
  878. package/dist/src/utils/googleErrors.js.map +1 -0
  879. package/dist/src/utils/googleErrors.test.d.ts +6 -0
  880. package/dist/src/utils/googleErrors.test.js +301 -0
  881. package/dist/src/utils/googleErrors.test.js.map +1 -0
  882. package/dist/src/utils/googleQuotaErrors.d.ts +37 -0
  883. package/dist/src/utils/googleQuotaErrors.js +157 -0
  884. package/dist/src/utils/googleQuotaErrors.js.map +1 -0
  885. package/dist/src/utils/googleQuotaErrors.test.d.ts +6 -0
  886. package/dist/src/utils/googleQuotaErrors.test.js +311 -0
  887. package/dist/src/utils/googleQuotaErrors.test.js.map +1 -0
  888. package/dist/src/utils/httpErrors.d.ts +18 -0
  889. package/dist/src/utils/httpErrors.js +36 -0
  890. package/dist/src/utils/httpErrors.js.map +1 -0
  891. package/dist/src/utils/ignorePatterns.d.ts +103 -0
  892. package/dist/src/utils/ignorePatterns.js +220 -0
  893. package/dist/src/utils/ignorePatterns.js.map +1 -0
  894. package/dist/src/utils/ignorePatterns.test.d.ts +6 -0
  895. package/dist/src/utils/ignorePatterns.test.js +246 -0
  896. package/dist/src/utils/ignorePatterns.test.js.map +1 -0
  897. package/dist/src/utils/installationManager.d.ts +16 -0
  898. package/dist/src/utils/installationManager.js +51 -0
  899. package/dist/src/utils/installationManager.js.map +1 -0
  900. package/dist/src/utils/installationManager.test.d.ts +6 -0
  901. package/dist/src/utils/installationManager.test.js +85 -0
  902. package/dist/src/utils/installationManager.test.js.map +1 -0
  903. package/dist/src/utils/language-detection.d.ts +6 -0
  904. package/dist/src/utils/language-detection.js +101 -0
  905. package/dist/src/utils/language-detection.js.map +1 -0
  906. package/dist/src/utils/llm-edit-fixer.d.ts +26 -0
  907. package/dist/src/utils/llm-edit-fixer.js +155 -0
  908. package/dist/src/utils/llm-edit-fixer.js.map +1 -0
  909. package/dist/src/utils/llm-edit-fixer.test.d.ts +6 -0
  910. package/dist/src/utils/llm-edit-fixer.test.js +223 -0
  911. package/dist/src/utils/llm-edit-fixer.test.js.map +1 -0
  912. package/dist/src/utils/memoryDiscovery.d.ts +26 -6
  913. package/dist/src/utils/memoryDiscovery.js +239 -40
  914. package/dist/src/utils/memoryDiscovery.js.map +1 -1
  915. package/dist/src/utils/memoryDiscovery.test.js +365 -44
  916. package/dist/src/utils/memoryDiscovery.test.js.map +1 -1
  917. package/dist/src/utils/memoryImportProcessor.js +19 -25
  918. package/dist/src/utils/memoryImportProcessor.js.map +1 -1
  919. package/dist/src/utils/memoryImportProcessor.test.js +24 -155
  920. package/dist/src/utils/memoryImportProcessor.test.js.map +1 -1
  921. package/dist/src/utils/messageInspectors.d.ts +1 -1
  922. package/dist/src/utils/nextSpeakerChecker.d.ts +3 -3
  923. package/dist/src/utils/nextSpeakerChecker.js +10 -4
  924. package/dist/src/utils/nextSpeakerChecker.js.map +1 -1
  925. package/dist/src/utils/nextSpeakerChecker.test.js +85 -66
  926. package/dist/src/utils/nextSpeakerChecker.test.js.map +1 -1
  927. package/dist/src/utils/package.d.ts +12 -0
  928. package/dist/src/utils/package.js +15 -0
  929. package/dist/src/utils/package.js.map +1 -0
  930. package/dist/src/utils/partUtils.d.ts +22 -1
  931. package/dist/src/utils/partUtils.js +68 -0
  932. package/dist/src/utils/partUtils.js.map +1 -1
  933. package/dist/src/utils/partUtils.test.js +112 -1
  934. package/dist/src/utils/partUtils.test.js.map +1 -1
  935. package/dist/src/utils/pathCorrector.d.ts +25 -0
  936. package/dist/src/utils/pathCorrector.js +33 -0
  937. package/dist/src/utils/pathCorrector.js.map +1 -0
  938. package/dist/src/utils/pathCorrector.test.d.ts +6 -0
  939. package/dist/src/utils/pathCorrector.test.js +83 -0
  940. package/dist/src/utils/pathCorrector.test.js.map +1 -0
  941. package/dist/src/utils/pathReader.d.ts +17 -0
  942. package/dist/src/utils/pathReader.js +92 -0
  943. package/dist/src/utils/pathReader.js.map +1 -0
  944. package/dist/src/utils/pathReader.test.d.ts +6 -0
  945. package/dist/src/utils/pathReader.test.js +406 -0
  946. package/dist/src/utils/pathReader.test.js.map +1 -0
  947. package/dist/src/utils/paths.d.ts +1 -18
  948. package/dist/src/utils/paths.js +133 -57
  949. package/dist/src/utils/paths.js.map +1 -1
  950. package/dist/src/utils/paths.test.js +200 -68
  951. package/dist/src/utils/paths.test.js.map +1 -1
  952. package/dist/src/utils/promptIdContext.d.ts +7 -0
  953. package/dist/src/utils/promptIdContext.js +8 -0
  954. package/dist/src/utils/promptIdContext.js.map +1 -0
  955. package/dist/src/utils/quotaErrorDetection.d.ts +1 -3
  956. package/dist/src/utils/quotaErrorDetection.js +0 -46
  957. package/dist/src/utils/quotaErrorDetection.js.map +1 -1
  958. package/dist/src/utils/retry.d.ts +5 -10
  959. package/dist/src/utils/retry.js +114 -197
  960. package/dist/src/utils/retry.js.map +1 -1
  961. package/dist/src/utils/retry.test.js +196 -130
  962. package/dist/src/utils/retry.test.js.map +1 -1
  963. package/dist/src/utils/safeJsonStringify.d.ts +4 -4
  964. package/dist/src/utils/safeJsonStringify.js +31 -7
  965. package/dist/src/utils/safeJsonStringify.js.map +1 -1
  966. package/dist/src/utils/schemaValidator.js +15 -1
  967. package/dist/src/utils/schemaValidator.js.map +1 -1
  968. package/dist/src/utils/schemaValidator.test.d.ts +6 -0
  969. package/dist/src/utils/schemaValidator.test.js +113 -0
  970. package/dist/src/utils/schemaValidator.test.js.map +1 -0
  971. package/dist/src/utils/session.js +1 -1
  972. package/dist/src/utils/session.js.map +1 -1
  973. package/dist/src/utils/shell-utils.d.ts +21 -3
  974. package/dist/src/utils/shell-utils.js +427 -159
  975. package/dist/src/utils/shell-utils.js.map +1 -1
  976. package/dist/src/utils/shell-utils.test.js +250 -59
  977. package/dist/src/utils/shell-utils.test.js.map +1 -1
  978. package/dist/src/utils/stdio.d.ts +32 -0
  979. package/dist/src/utils/stdio.js +85 -0
  980. package/dist/src/utils/stdio.js.map +1 -0
  981. package/dist/src/utils/stdio.test.d.ts +6 -0
  982. package/dist/src/utils/stdio.test.js +47 -0
  983. package/dist/src/utils/stdio.test.js.map +1 -0
  984. package/dist/src/utils/summarizer.d.ts +6 -4
  985. package/dist/src/utils/summarizer.js +8 -9
  986. package/dist/src/utils/summarizer.js.map +1 -1
  987. package/dist/src/utils/summarizer.test.js +32 -12
  988. package/dist/src/utils/summarizer.test.js.map +1 -1
  989. package/dist/src/utils/systemEncoding.js +7 -6
  990. package/dist/src/utils/systemEncoding.js.map +1 -1
  991. package/dist/src/utils/systemEncoding.test.js +4 -3
  992. package/dist/src/utils/systemEncoding.test.js.map +1 -1
  993. package/dist/src/utils/terminal.d.ts +14 -0
  994. package/dist/src/utils/terminal.js +38 -0
  995. package/dist/src/utils/terminal.js.map +1 -0
  996. package/dist/src/utils/terminalSerializer.d.ts +25 -0
  997. package/dist/src/utils/terminalSerializer.js +432 -0
  998. package/dist/src/utils/terminalSerializer.js.map +1 -0
  999. package/dist/src/utils/terminalSerializer.test.d.ts +6 -0
  1000. package/dist/src/utils/terminalSerializer.test.js +176 -0
  1001. package/dist/src/utils/terminalSerializer.test.js.map +1 -0
  1002. package/dist/src/utils/textUtils.d.ts +5 -0
  1003. package/dist/src/utils/textUtils.js +14 -0
  1004. package/dist/src/utils/textUtils.js.map +1 -1
  1005. package/dist/src/utils/textUtils.test.d.ts +6 -0
  1006. package/dist/src/utils/textUtils.test.js +59 -0
  1007. package/dist/src/utils/textUtils.test.js.map +1 -0
  1008. package/dist/src/utils/thoughtUtils.d.ts +21 -0
  1009. package/dist/src/utils/thoughtUtils.js +39 -0
  1010. package/dist/src/utils/thoughtUtils.js.map +1 -0
  1011. package/dist/src/utils/thoughtUtils.test.d.ts +6 -0
  1012. package/dist/src/utils/thoughtUtils.test.js +78 -0
  1013. package/dist/src/utils/thoughtUtils.test.js.map +1 -0
  1014. package/dist/src/utils/tool-utils.d.ts +19 -0
  1015. package/dist/src/utils/tool-utils.js +67 -0
  1016. package/dist/src/utils/tool-utils.js.map +1 -0
  1017. package/dist/src/utils/tool-utils.test.d.ts +6 -0
  1018. package/dist/src/utils/tool-utils.test.js +69 -0
  1019. package/dist/src/utils/tool-utils.test.js.map +1 -0
  1020. package/dist/src/utils/userAccountManager.d.ts +20 -0
  1021. package/dist/src/utils/userAccountManager.js +115 -0
  1022. package/dist/src/utils/userAccountManager.js.map +1 -0
  1023. package/dist/src/utils/userAccountManager.test.d.ts +6 -0
  1024. package/dist/src/utils/{user_account.test.js → userAccountManager.test.js} +41 -36
  1025. package/dist/src/utils/userAccountManager.test.js.map +1 -0
  1026. package/dist/src/utils/workspaceContext.d.ts +4 -3
  1027. package/dist/src/utils/workspaceContext.js +23 -17
  1028. package/dist/src/utils/workspaceContext.js.map +1 -1
  1029. package/dist/src/utils/workspaceContext.test.js +45 -19
  1030. package/dist/src/utils/workspaceContext.test.js.map +1 -1
  1031. package/dist/tsconfig.tsbuildinfo +1 -1
  1032. package/package.json +24 -10
  1033. package/dist/src/core/modelCheck.d.ts +0 -14
  1034. package/dist/src/core/modelCheck.js +0 -62
  1035. package/dist/src/core/modelCheck.js.map +0 -1
  1036. package/dist/src/test-utils/tools.d.ts +0 -44
  1037. package/dist/src/test-utils/tools.js.map +0 -1
  1038. package/dist/src/utils/flashFallback.integration.test.js +0 -118
  1039. package/dist/src/utils/flashFallback.integration.test.js.map +0 -1
  1040. package/dist/src/utils/user_account.d.ts +0 -9
  1041. package/dist/src/utils/user_account.js +0 -109
  1042. package/dist/src/utils/user_account.js.map +0 -1
  1043. package/dist/src/utils/user_account.test.js.map +0 -1
  1044. package/dist/src/utils/user_id.d.ts +0 -11
  1045. package/dist/src/utils/user_id.js +0 -49
  1046. package/dist/src/utils/user_id.js.map +0 -1
  1047. package/dist/src/utils/user_id.test.js +0 -21
  1048. package/dist/src/utils/user_id.test.js.map +0 -1
  1049. /package/dist/src/{utils/flashFallback.integration.test.d.ts → agents/codebase-investigator.test.d.ts} +0 -0
  1050. /package/dist/src/{utils/user_account.test.d.ts → agents/executor.test.d.ts} +0 -0
  1051. /package/dist/src/{utils/user_id.test.d.ts → agents/invocation.test.d.ts} +0 -0
@@ -3,15 +3,26 @@
3
3
  * Copyright 2025 Google LLC
4
4
  * SPDX-License-Identifier: Apache-2.0
5
5
  */
6
- import { describe, it, expect, vi, beforeEach } from 'vitest';
7
- import { Config } from './config.js';
8
- import * as path from 'path';
6
+ import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
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';
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';
11
15
  import { AuthType, createContentGeneratorConfig, } from '../core/contentGenerator.js';
12
16
  import { GeminiClient } from '../core/client.js';
13
17
  import { GitService } from '../services/gitService.js';
14
- import { ClearcutLogger } from '../telemetry/clearcut-logger/clearcut-logger.js';
18
+ import { ShellTool } from '../tools/shell.js';
19
+ import { ReadFileTool } from '../tools/read-file.js';
20
+ import { GrepTool } from '../tools/grep.js';
21
+ import { RipGrepTool, canUseRipgrep } from '../tools/ripGrep.js';
22
+ import { logRipgrepFallback } from '../telemetry/loggers.js';
23
+ import { RipgrepFallbackEvent } from '../telemetry/types.js';
24
+ import { ToolRegistry } from '../tools/tool-registry.js';
25
+ import { DEFAULT_MODEL_CONFIGS } from './defaultModelConfigs.js';
15
26
  vi.mock('fs', async (importOriginal) => {
16
27
  const actual = await importOriginal();
17
28
  return {
@@ -28,6 +39,7 @@ vi.mock('../tools/tool-registry', () => {
28
39
  const ToolRegistryMock = vi.fn();
29
40
  ToolRegistryMock.prototype.registerTool = vi.fn();
30
41
  ToolRegistryMock.prototype.discoverAllTools = vi.fn();
42
+ ToolRegistryMock.prototype.sortTools = vi.fn();
31
43
  ToolRegistryMock.prototype.getAllTools = vi.fn(() => []); // Mock methods if needed
32
44
  ToolRegistryMock.prototype.getTool = vi.fn();
33
45
  ToolRegistryMock.prototype.getFunctionDeclarations = vi.fn(() => []);
@@ -39,7 +51,12 @@ vi.mock('../utils/memoryDiscovery.js', () => ({
39
51
  // Mock individual tools if their constructors are complex or have side effects
40
52
  vi.mock('../tools/ls');
41
53
  vi.mock('../tools/read-file');
42
- vi.mock('../tools/grep');
54
+ vi.mock('../tools/grep.js');
55
+ vi.mock('../tools/ripGrep.js', () => ({
56
+ canUseRipgrep: vi.fn(),
57
+ RipGrepTool: class MockRipGrepTool {
58
+ },
59
+ }));
43
60
  vi.mock('../tools/glob');
44
61
  vi.mock('../tools/edit');
45
62
  vi.mock('../tools/shell');
@@ -51,18 +68,13 @@ vi.mock('../tools/memoryTool', () => ({
51
68
  setGeminiMdFilename: vi.fn(),
52
69
  getCurrentGeminiMdFilename: vi.fn(() => 'GEMINI.md'), // Mock the original filename
53
70
  DEFAULT_CONTEXT_FILENAME: 'GEMINI.md',
54
- GEMINI_CONFIG_DIR: '.gemini',
71
+ GEMINI_DIR: '.gemini',
55
72
  }));
56
- vi.mock('../core/contentGenerator.js', async (importOriginal) => {
57
- const actual = await importOriginal();
58
- return {
59
- ...actual,
60
- createContentGeneratorConfig: vi.fn(),
61
- };
62
- });
73
+ vi.mock('../core/contentGenerator.js');
63
74
  vi.mock('../core/client.js', () => ({
64
75
  GeminiClient: vi.fn().mockImplementation(() => ({
65
76
  initialize: vi.fn().mockResolvedValue(undefined),
77
+ stripThoughtsFromHistory: vi.fn(),
66
78
  })),
67
79
  }));
68
80
  vi.mock('../telemetry/index.js', async (importOriginal) => {
@@ -70,6 +82,16 @@ vi.mock('../telemetry/index.js', async (importOriginal) => {
70
82
  return {
71
83
  ...actual,
72
84
  initializeTelemetry: vi.fn(),
85
+ uiTelemetryService: {
86
+ getLastPromptTokenCount: vi.fn(),
87
+ },
88
+ };
89
+ });
90
+ vi.mock('../telemetry/loggers.js', async (importOriginal) => {
91
+ const actual = await importOriginal();
92
+ return {
93
+ ...actual,
94
+ logRipgrepFallback: vi.fn(),
73
95
  };
74
96
  });
75
97
  vi.mock('../services/gitService.js', () => {
@@ -77,6 +99,48 @@ vi.mock('../services/gitService.js', () => {
77
99
  GitServiceMock.prototype.initialize = vi.fn();
78
100
  return { GitService: GitServiceMock };
79
101
  });
102
+ vi.mock('../ide/ide-client.js', () => ({
103
+ IdeClient: {
104
+ getInstance: vi.fn().mockResolvedValue({
105
+ getConnectionStatus: vi.fn(),
106
+ initialize: vi.fn(),
107
+ shutdown: vi.fn(),
108
+ }),
109
+ },
110
+ }));
111
+ vi.mock('../agents/registry.js', () => {
112
+ const AgentRegistryMock = vi.fn();
113
+ AgentRegistryMock.prototype.initialize = vi.fn();
114
+ AgentRegistryMock.prototype.getAllDefinitions = vi.fn(() => []);
115
+ AgentRegistryMock.prototype.getDefinition = vi.fn();
116
+ return { AgentRegistry: AgentRegistryMock };
117
+ });
118
+ vi.mock('../agents/subagent-tool-wrapper.js', () => ({
119
+ SubagentToolWrapper: vi.fn(),
120
+ }));
121
+ const mockCoreEvents = vi.hoisted(() => ({
122
+ emitFeedback: vi.fn(),
123
+ emitModelChanged: vi.fn(),
124
+ emitConsoleLog: vi.fn(),
125
+ }));
126
+ const mockSetGlobalProxy = vi.hoisted(() => vi.fn());
127
+ vi.mock('../utils/events.js', () => ({
128
+ coreEvents: mockCoreEvents,
129
+ }));
130
+ vi.mock('../utils/fetch.js', () => ({
131
+ setGlobalProxy: mockSetGlobalProxy,
132
+ }));
133
+ import { BaseLlmClient } from '../core/baseLlmClient.js';
134
+ import { tokenLimit } from '../core/tokenLimits.js';
135
+ import { uiTelemetryService } from '../telemetry/index.js';
136
+ import { getCodeAssistServer } from '../code_assist/codeAssist.js';
137
+ import { getExperiments } from '../code_assist/experiments/experiments.js';
138
+ vi.mock('../core/baseLlmClient.js');
139
+ vi.mock('../core/tokenLimits.js', () => ({
140
+ tokenLimit: vi.fn(),
141
+ }));
142
+ vi.mock('../code_assist/codeAssist.js');
143
+ vi.mock('../code_assist/experiments/experiments.js');
80
144
  describe('Server Config (config.ts)', () => {
81
145
  const MODEL = 'gemini-pro';
82
146
  const SANDBOX = {
@@ -86,7 +150,6 @@ describe('Server Config (config.ts)', () => {
86
150
  const TARGET_DIR = '/path/to/target';
87
151
  const DEBUG_MODE = false;
88
152
  const QUESTION = 'test question';
89
- const FULL_CONTEXT = false;
90
153
  const USER_MEMORY = 'Test User Memory';
91
154
  const TELEMETRY_SETTINGS = { enabled: false };
92
155
  const EMBEDDING_MODEL = 'gemini-embedding';
@@ -98,7 +161,6 @@ describe('Server Config (config.ts)', () => {
98
161
  targetDir: TARGET_DIR,
99
162
  debugMode: DEBUG_MODE,
100
163
  question: QUESTION,
101
- fullContext: FULL_CONTEXT,
102
164
  userMemory: USER_MEMORY,
103
165
  telemetry: TELEMETRY_SETTINGS,
104
166
  sessionId: SESSION_ID,
@@ -108,7 +170,6 @@ describe('Server Config (config.ts)', () => {
108
170
  beforeEach(() => {
109
171
  // Reset mocks if necessary
110
172
  vi.clearAllMocks();
111
- vi.spyOn(ClearcutLogger.prototype, 'logStartSessionEvent').mockImplementation(() => undefined);
112
173
  });
113
174
  describe('initialize', () => {
114
175
  it('should throw an error if checkpointing is enabled and GitService fails', async () => {
@@ -137,149 +198,185 @@ describe('Server Config (config.ts)', () => {
137
198
  await expect(config.initialize()).resolves.toBeUndefined();
138
199
  await expect(config.initialize()).rejects.toThrow('Config was already initialized');
139
200
  });
201
+ describe('getCompressionThreshold', () => {
202
+ it('should return the local compression threshold if it is set', async () => {
203
+ const config = new Config({
204
+ ...baseParams,
205
+ compressionThreshold: 0.5,
206
+ });
207
+ expect(await config.getCompressionThreshold()).toBe(0.5);
208
+ });
209
+ it('should return the remote experiment threshold if it is a positive number', async () => {
210
+ const config = new Config({
211
+ ...baseParams,
212
+ experiments: {
213
+ flags: {
214
+ [ExperimentFlags.CONTEXT_COMPRESSION_THRESHOLD]: {
215
+ floatValue: 0.8,
216
+ },
217
+ },
218
+ },
219
+ });
220
+ expect(await config.getCompressionThreshold()).toBe(0.8);
221
+ });
222
+ it('should return undefined if the remote experiment threshold is 0', async () => {
223
+ const config = new Config({
224
+ ...baseParams,
225
+ experiments: {
226
+ flags: {
227
+ [ExperimentFlags.CONTEXT_COMPRESSION_THRESHOLD]: {
228
+ floatValue: 0.0,
229
+ },
230
+ },
231
+ },
232
+ });
233
+ expect(await config.getCompressionThreshold()).toBeUndefined();
234
+ });
235
+ it('should return undefined if there are no experiments', async () => {
236
+ const config = new Config(baseParams);
237
+ expect(await config.getCompressionThreshold()).toBeUndefined();
238
+ });
239
+ });
240
+ describe('getUserCaching', () => {
241
+ it('should return the remote experiment flag when available', async () => {
242
+ const config = new Config({
243
+ ...baseParams,
244
+ experiments: {
245
+ flags: {
246
+ [ExperimentFlags.USER_CACHING]: {
247
+ boolValue: true,
248
+ },
249
+ },
250
+ experimentIds: [],
251
+ },
252
+ });
253
+ expect(await config.getUserCaching()).toBe(true);
254
+ });
255
+ it('should return false when the remote flag is false', async () => {
256
+ const config = new Config({
257
+ ...baseParams,
258
+ experiments: {
259
+ flags: {
260
+ [ExperimentFlags.USER_CACHING]: {
261
+ boolValue: false,
262
+ },
263
+ },
264
+ experimentIds: [],
265
+ },
266
+ });
267
+ expect(await config.getUserCaching()).toBe(false);
268
+ });
269
+ it('should return undefined if there are no experiments', async () => {
270
+ const config = new Config(baseParams);
271
+ expect(await config.getUserCaching()).toBeUndefined();
272
+ });
273
+ });
140
274
  });
141
275
  describe('refreshAuth', () => {
142
276
  it('should refresh auth and update config', async () => {
143
277
  const config = new Config(baseParams);
144
278
  const authType = AuthType.USE_GEMINI;
145
- const newModel = 'gemini-flash';
146
279
  const mockContentConfig = {
147
- model: newModel,
148
280
  apiKey: 'test-key',
149
281
  };
150
- createContentGeneratorConfig.mockReturnValue(mockContentConfig);
282
+ vi.mocked(createContentGeneratorConfig).mockResolvedValue(mockContentConfig);
151
283
  // Set fallback mode to true to ensure it gets reset
152
284
  config.setFallbackMode(true);
153
285
  expect(config.isInFallbackMode()).toBe(true);
154
286
  await config.refreshAuth(authType);
155
287
  expect(createContentGeneratorConfig).toHaveBeenCalledWith(config, authType);
156
- // Verify that contentGeneratorConfig is updated with the new model
288
+ // Verify that contentGeneratorConfig is updated
157
289
  expect(config.getContentGeneratorConfig()).toEqual(mockContentConfig);
158
- expect(config.getContentGeneratorConfig().model).toBe(newModel);
159
- expect(config.getModel()).toBe(newModel); // getModel() should return the updated model
160
290
  expect(GeminiClient).toHaveBeenCalledWith(config);
161
291
  // Verify that fallback mode is reset
162
292
  expect(config.isInFallbackMode()).toBe(false);
163
293
  });
164
- it('should preserve conversation history when refreshing auth', async () => {
294
+ it('should strip thoughts when switching from GenAI to Vertex', async () => {
165
295
  const config = new Config(baseParams);
166
- const authType = AuthType.USE_GEMINI;
167
- const mockContentConfig = {
168
- model: 'gemini-pro',
169
- apiKey: 'test-key',
170
- };
171
- createContentGeneratorConfig.mockReturnValue(mockContentConfig);
172
- // Mock the existing client with some history
173
- const mockExistingHistory = [
174
- { role: 'user', parts: [{ text: 'Hello' }] },
175
- { role: 'model', parts: [{ text: 'Hi there!' }] },
176
- { role: 'user', parts: [{ text: 'How are you?' }] },
177
- ];
178
- const mockExistingClient = {
179
- isInitialized: vi.fn().mockReturnValue(true),
180
- getHistory: vi.fn().mockReturnValue(mockExistingHistory),
181
- };
182
- const mockNewClient = {
183
- isInitialized: vi.fn().mockReturnValue(true),
184
- getHistory: vi.fn().mockReturnValue([]),
185
- setHistory: vi.fn(),
186
- initialize: vi.fn().mockResolvedValue(undefined),
187
- };
188
- // Set the existing client
189
- config.geminiClient = mockExistingClient;
190
- GeminiClient.mockImplementation(() => mockNewClient);
191
- await config.refreshAuth(authType);
192
- // Verify that existing history was retrieved
193
- expect(mockExistingClient.getHistory).toHaveBeenCalled();
194
- // Verify that new client was created and initialized
195
- expect(GeminiClient).toHaveBeenCalledWith(config);
196
- expect(mockNewClient.initialize).toHaveBeenCalledWith(mockContentConfig);
197
- // Verify that history was restored to the new client
198
- expect(mockNewClient.setHistory).toHaveBeenCalledWith(mockExistingHistory, { stripThoughts: false });
296
+ vi.mocked(createContentGeneratorConfig).mockImplementation(async (_, authType) => ({ authType }));
297
+ await config.refreshAuth(AuthType.USE_GEMINI);
298
+ await config.refreshAuth(AuthType.LOGIN_WITH_GOOGLE);
299
+ expect(config.getGeminiClient().stripThoughtsFromHistory).toHaveBeenCalledWith();
199
300
  });
200
- it('should handle case when no existing client is initialized', async () => {
301
+ it('should strip thoughts when switching from GenAI to Vertex AI', async () => {
201
302
  const config = new Config(baseParams);
202
- const authType = AuthType.USE_GEMINI;
203
- const mockContentConfig = {
204
- model: 'gemini-pro',
205
- apiKey: 'test-key',
206
- };
207
- createContentGeneratorConfig.mockReturnValue(mockContentConfig);
208
- const mockNewClient = {
209
- isInitialized: vi.fn().mockReturnValue(true),
210
- getHistory: vi.fn().mockReturnValue([]),
211
- setHistory: vi.fn(),
212
- initialize: vi.fn().mockResolvedValue(undefined),
213
- };
214
- // No existing client
215
- config.geminiClient = null;
216
- GeminiClient.mockImplementation(() => mockNewClient);
217
- await config.refreshAuth(authType);
218
- // Verify that new client was created and initialized
219
- expect(GeminiClient).toHaveBeenCalledWith(config);
220
- expect(mockNewClient.initialize).toHaveBeenCalledWith(mockContentConfig);
221
- // Verify that setHistory was not called since there was no existing history
222
- expect(mockNewClient.setHistory).not.toHaveBeenCalled();
303
+ vi.mocked(createContentGeneratorConfig).mockImplementation(async (_, authType) => ({ authType }));
304
+ await config.refreshAuth(AuthType.USE_GEMINI);
305
+ await config.refreshAuth(AuthType.USE_VERTEX_AI);
306
+ expect(config.getGeminiClient().stripThoughtsFromHistory).toHaveBeenCalledWith();
223
307
  });
224
- it('should strip thoughts when switching from GenAI to Vertex', async () => {
308
+ it('should not strip thoughts when switching from Vertex to GenAI', async () => {
225
309
  const config = new Config(baseParams);
226
- const mockContentConfig = {
227
- model: 'gemini-pro',
228
- apiKey: 'test-key',
229
- authType: AuthType.USE_GEMINI,
230
- };
231
- config.contentGeneratorConfig = mockContentConfig;
232
- createContentGeneratorConfig.mockReturnValue({
233
- ...mockContentConfig,
234
- authType: AuthType.LOGIN_WITH_GOOGLE,
235
- });
236
- const mockExistingHistory = [
237
- { role: 'user', parts: [{ text: 'Hello' }] },
238
- ];
239
- const mockExistingClient = {
240
- isInitialized: vi.fn().mockReturnValue(true),
241
- getHistory: vi.fn().mockReturnValue(mockExistingHistory),
242
- };
243
- const mockNewClient = {
244
- isInitialized: vi.fn().mockReturnValue(true),
245
- getHistory: vi.fn().mockReturnValue([]),
246
- setHistory: vi.fn(),
247
- initialize: vi.fn().mockResolvedValue(undefined),
248
- };
249
- config.geminiClient = mockExistingClient;
250
- GeminiClient.mockImplementation(() => mockNewClient);
310
+ vi.mocked(createContentGeneratorConfig).mockImplementation(async (_, authType) => ({ authType }));
311
+ await config.refreshAuth(AuthType.USE_VERTEX_AI);
312
+ await config.refreshAuth(AuthType.USE_GEMINI);
313
+ expect(config.getGeminiClient().stripThoughtsFromHistory).not.toHaveBeenCalledWith();
314
+ });
315
+ });
316
+ describe('Preview Features Logic in refreshAuth', () => {
317
+ beforeEach(() => {
318
+ // Set up default mock behavior for these functions before each test
319
+ vi.mocked(getCodeAssistServer).mockReturnValue(undefined);
320
+ vi.mocked(getExperiments).mockResolvedValue({
321
+ flags: {},
322
+ experimentIds: [],
323
+ });
324
+ });
325
+ it('should enable preview features for Google auth when remote flag is true', async () => {
326
+ // Override the default mock for this specific test
327
+ vi.mocked(getCodeAssistServer).mockReturnValue({}); // Simulate Google auth by returning a truthy value
328
+ vi.mocked(getExperiments).mockResolvedValue({
329
+ flags: {
330
+ [ExperimentFlags.ENABLE_PREVIEW]: { boolValue: true },
331
+ },
332
+ experimentIds: [],
333
+ });
334
+ const config = new Config({ ...baseParams, previewFeatures: undefined });
251
335
  await config.refreshAuth(AuthType.LOGIN_WITH_GOOGLE);
252
- expect(mockNewClient.setHistory).toHaveBeenCalledWith(mockExistingHistory, { stripThoughts: true });
336
+ expect(config.getPreviewFeatures()).toBe(true);
253
337
  });
254
- it('should not strip thoughts when switching from Vertex to GenAI', async () => {
255
- const config = new Config(baseParams);
256
- const mockContentConfig = {
257
- model: 'gemini-pro',
258
- apiKey: 'test-key',
259
- authType: AuthType.LOGIN_WITH_GOOGLE,
260
- };
261
- config.contentGeneratorConfig = mockContentConfig;
262
- createContentGeneratorConfig.mockReturnValue({
263
- ...mockContentConfig,
264
- authType: AuthType.USE_GEMINI,
265
- });
266
- const mockExistingHistory = [
267
- { role: 'user', parts: [{ text: 'Hello' }] },
268
- ];
269
- const mockExistingClient = {
270
- isInitialized: vi.fn().mockReturnValue(true),
271
- getHistory: vi.fn().mockReturnValue(mockExistingHistory),
272
- };
273
- const mockNewClient = {
274
- isInitialized: vi.fn().mockReturnValue(true),
275
- getHistory: vi.fn().mockReturnValue([]),
276
- setHistory: vi.fn(),
277
- initialize: vi.fn().mockResolvedValue(undefined),
278
- };
279
- config.geminiClient = mockExistingClient;
280
- GeminiClient.mockImplementation(() => mockNewClient);
338
+ it('should disable preview features for Google auth when remote flag is false', async () => {
339
+ // Override the default mock
340
+ vi.mocked(getCodeAssistServer).mockReturnValue({});
341
+ vi.mocked(getExperiments).mockResolvedValue({
342
+ flags: {
343
+ [ExperimentFlags.ENABLE_PREVIEW]: { boolValue: false },
344
+ },
345
+ experimentIds: [],
346
+ });
347
+ const config = new Config({ ...baseParams, previewFeatures: undefined });
348
+ await config.refreshAuth(AuthType.LOGIN_WITH_GOOGLE);
349
+ expect(config.getPreviewFeatures()).toBe(undefined);
350
+ });
351
+ it('should disable preview features for Google auth when remote flag is missing', async () => {
352
+ // Override the default mock for getCodeAssistServer, the getExperiments mock is already correct
353
+ vi.mocked(getCodeAssistServer).mockReturnValue({});
354
+ const config = new Config({ ...baseParams, previewFeatures: undefined });
355
+ await config.refreshAuth(AuthType.LOGIN_WITH_GOOGLE);
356
+ expect(config.getPreviewFeatures()).toBe(undefined);
357
+ });
358
+ it('should not change preview features or model if it is already set to true', async () => {
359
+ const initialModel = 'some-other-model';
360
+ const config = new Config({
361
+ ...baseParams,
362
+ previewFeatures: true,
363
+ model: initialModel,
364
+ });
365
+ // It doesn't matter which auth method we use here, the logic should exit early
366
+ await config.refreshAuth(AuthType.USE_GEMINI);
367
+ expect(config.getPreviewFeatures()).toBe(true);
368
+ expect(config.getModel()).toBe(initialModel);
369
+ });
370
+ it('should not change preview features or model if it is already set to false', async () => {
371
+ const initialModel = 'some-other-model';
372
+ const config = new Config({
373
+ ...baseParams,
374
+ previewFeatures: false,
375
+ model: initialModel,
376
+ });
281
377
  await config.refreshAuth(AuthType.USE_GEMINI);
282
- expect(mockNewClient.setHistory).toHaveBeenCalledWith(mockExistingHistory, { stripThoughts: false });
378
+ expect(config.getPreviewFeatures()).toBe(false);
379
+ expect(config.getModel()).toBe(initialModel);
283
380
  });
284
381
  });
285
382
  it('Config constructor should store userMemory correctly', () => {
@@ -309,7 +406,7 @@ describe('Server Config (config.ts)', () => {
309
406
  });
310
407
  it('should set default file filtering settings when not provided', () => {
311
408
  const config = new Config(baseParams);
312
- expect(config.getFileFilteringRespectGitIgnore()).toBe(true);
409
+ expect(config.getFileFilteringRespectGitIgnore()).toBe(DEFAULT_FILE_FILTERING_OPTIONS.respectGitIgnore);
313
410
  });
314
411
  it('should set custom file filtering settings when provided', () => {
315
412
  const paramsWithFileFiltering = {
@@ -322,7 +419,7 @@ describe('Server Config (config.ts)', () => {
322
419
  expect(config.getFileFilteringRespectGitIgnore()).toBe(false);
323
420
  });
324
421
  it('should initialize WorkspaceContext with includeDirectories', () => {
325
- const includeDirectories = ['/path/to/dir1', '/path/to/dir2'];
422
+ const includeDirectories = ['dir1', 'dir2'];
326
423
  const paramsWithIncludeDirs = {
327
424
  ...baseParams,
328
425
  includeDirectories,
@@ -330,11 +427,11 @@ describe('Server Config (config.ts)', () => {
330
427
  const config = new Config(paramsWithIncludeDirs);
331
428
  const workspaceContext = config.getWorkspaceContext();
332
429
  const directories = workspaceContext.getDirectories();
333
- // Should include the target directory plus the included directories
334
- expect(directories).toHaveLength(3);
430
+ // Should include only the target directory initially
431
+ expect(directories).toHaveLength(1);
335
432
  expect(directories).toContain(path.resolve(baseParams.targetDir));
336
- expect(directories).toContain('/path/to/dir1');
337
- expect(directories).toContain('/path/to/dir2');
433
+ // The other directories should be in the pending list
434
+ expect(config.getPendingIncludeDirectories()).toEqual(includeDirectories);
338
435
  });
339
436
  it('Config constructor should set telemetry to true when provided as true', () => {
340
437
  const paramsWithTelemetry = {
@@ -358,6 +455,30 @@ describe('Server Config (config.ts)', () => {
358
455
  const config = new Config(paramsWithoutTelemetry);
359
456
  expect(config.getTelemetryEnabled()).toBe(TELEMETRY_SETTINGS.enabled);
360
457
  });
458
+ it('Config constructor should set telemetry useCollector to true when provided', () => {
459
+ const paramsWithTelemetry = {
460
+ ...baseParams,
461
+ telemetry: { enabled: true, useCollector: true },
462
+ };
463
+ const config = new Config(paramsWithTelemetry);
464
+ expect(config.getTelemetryUseCollector()).toBe(true);
465
+ });
466
+ it('Config constructor should set telemetry useCollector to false when provided', () => {
467
+ const paramsWithTelemetry = {
468
+ ...baseParams,
469
+ telemetry: { enabled: true, useCollector: false },
470
+ };
471
+ const config = new Config(paramsWithTelemetry);
472
+ expect(config.getTelemetryUseCollector()).toBe(false);
473
+ });
474
+ it('Config constructor should default telemetry useCollector to false if not provided', () => {
475
+ const paramsWithTelemetry = {
476
+ ...baseParams,
477
+ telemetry: { enabled: true },
478
+ };
479
+ const config = new Config(paramsWithTelemetry);
480
+ expect(config.getTelemetryUseCollector()).toBe(false);
481
+ });
361
482
  it('should have a getFileService method that returns FileDiscoveryService', () => {
362
483
  const config = new Config(baseParams);
363
484
  const fileService = config.getFileService();
@@ -378,13 +499,6 @@ describe('Server Config (config.ts)', () => {
378
499
  });
379
500
  expect(config.getUsageStatisticsEnabled()).toBe(enabled);
380
501
  });
381
- it('logs the session start event', () => {
382
- new Config({
383
- ...baseParams,
384
- usageStatisticsEnabled: true,
385
- });
386
- expect(ClearcutLogger.prototype.logStartSessionEvent).toHaveBeenCalledOnce();
387
- });
388
502
  });
389
503
  describe('Telemetry Settings', () => {
390
504
  it('should return default telemetry target if not provided', () => {
@@ -469,5 +583,765 @@ describe('Server Config (config.ts)', () => {
469
583
  expect(config.getTelemetryOtlpProtocol()).toBe('grpc');
470
584
  });
471
585
  });
586
+ describe('UseRipgrep Configuration', () => {
587
+ it('should default useRipgrep to true when not provided', () => {
588
+ const config = new Config(baseParams);
589
+ expect(config.getUseRipgrep()).toBe(true);
590
+ });
591
+ it('should set useRipgrep to false when provided as false', () => {
592
+ const paramsWithRipgrep = {
593
+ ...baseParams,
594
+ useRipgrep: false,
595
+ };
596
+ const config = new Config(paramsWithRipgrep);
597
+ expect(config.getUseRipgrep()).toBe(false);
598
+ });
599
+ it('should set useRipgrep to true when explicitly provided as true', () => {
600
+ const paramsWithRipgrep = {
601
+ ...baseParams,
602
+ useRipgrep: true,
603
+ };
604
+ const config = new Config(paramsWithRipgrep);
605
+ expect(config.getUseRipgrep()).toBe(true);
606
+ });
607
+ it('should default useRipgrep to true when undefined', () => {
608
+ const paramsWithUndefinedRipgrep = {
609
+ ...baseParams,
610
+ useRipgrep: undefined,
611
+ };
612
+ const config = new Config(paramsWithUndefinedRipgrep);
613
+ expect(config.getUseRipgrep()).toBe(true);
614
+ });
615
+ });
616
+ describe('Model Router with Auth', () => {
617
+ it('should disable model router by default for oauth-personal', async () => {
618
+ const config = new Config({
619
+ ...baseParams,
620
+ useModelRouter: true,
621
+ });
622
+ await config.refreshAuth(AuthType.LOGIN_WITH_GOOGLE);
623
+ expect(config.getUseModelRouter()).toBe(true);
624
+ });
625
+ it('should enable model router by default for other auth types', async () => {
626
+ const config = new Config({
627
+ ...baseParams,
628
+ useModelRouter: true,
629
+ });
630
+ await config.refreshAuth(AuthType.USE_GEMINI);
631
+ expect(config.getUseModelRouter()).toBe(true);
632
+ });
633
+ it('should disable model router for specified auth type', async () => {
634
+ const config = new Config({
635
+ ...baseParams,
636
+ useModelRouter: true,
637
+ disableModelRouterForAuth: [AuthType.USE_GEMINI],
638
+ });
639
+ await config.refreshAuth(AuthType.USE_GEMINI);
640
+ expect(config.getUseModelRouter()).toBe(false);
641
+ });
642
+ it('should enable model router for other auth type', async () => {
643
+ const config = new Config({
644
+ ...baseParams,
645
+ useModelRouter: true,
646
+ disableModelRouterForAuth: [],
647
+ });
648
+ await config.refreshAuth(AuthType.LOGIN_WITH_GOOGLE);
649
+ expect(config.getUseModelRouter()).toBe(true);
650
+ });
651
+ it('should keep model router disabled when useModelRouter is false', async () => {
652
+ const config = new Config({
653
+ ...baseParams,
654
+ useModelRouter: false,
655
+ disableModelRouterForAuth: [AuthType.USE_GEMINI],
656
+ });
657
+ await config.refreshAuth(AuthType.LOGIN_WITH_GOOGLE);
658
+ expect(config.getUseModelRouter()).toBe(false);
659
+ });
660
+ it('should keep the user-chosen model after refreshAuth, even when model router is disabled for the auth type', async () => {
661
+ const config = new Config({
662
+ ...baseParams,
663
+ useModelRouter: true,
664
+ disableModelRouterForAuth: [AuthType.USE_GEMINI],
665
+ });
666
+ const chosenModel = 'gemini-1.5-pro-latest';
667
+ config.setModel(chosenModel);
668
+ await config.refreshAuth(AuthType.USE_GEMINI);
669
+ expect(config.getUseModelRouter()).toBe(false);
670
+ expect(config.getModel()).toBe(chosenModel);
671
+ });
672
+ it('should keep the user-chosen model after refreshAuth, when model router is enabled for the auth type', async () => {
673
+ const config = new Config({
674
+ ...baseParams,
675
+ useModelRouter: true,
676
+ disableModelRouterForAuth: [AuthType.USE_GEMINI],
677
+ });
678
+ const chosenModel = 'gemini-1.5-pro-latest';
679
+ config.setModel(chosenModel);
680
+ await config.refreshAuth(AuthType.LOGIN_WITH_GOOGLE);
681
+ expect(config.getUseModelRouter()).toBe(true);
682
+ expect(config.getModel()).toBe(chosenModel);
683
+ });
684
+ it('should NOT switch to auto model if cli provides specific model, even if router is enabled', async () => {
685
+ const config = new Config({
686
+ ...baseParams,
687
+ useModelRouter: true,
688
+ model: 'gemini-flash-latest',
689
+ });
690
+ await config.refreshAuth(AuthType.LOGIN_WITH_GOOGLE);
691
+ expect(config.getUseModelRouter()).toBe(true);
692
+ expect(config.getModel()).toBe('gemini-flash-latest');
693
+ });
694
+ });
695
+ describe('ContinueOnFailedApiCall Configuration', () => {
696
+ it('should default continueOnFailedApiCall to false when not provided', () => {
697
+ const config = new Config(baseParams);
698
+ expect(config.getContinueOnFailedApiCall()).toBe(true);
699
+ });
700
+ it('should set continueOnFailedApiCall to true when provided as true', () => {
701
+ const paramsWithContinueOnFailedApiCall = {
702
+ ...baseParams,
703
+ continueOnFailedApiCall: true,
704
+ };
705
+ const config = new Config(paramsWithContinueOnFailedApiCall);
706
+ expect(config.getContinueOnFailedApiCall()).toBe(true);
707
+ });
708
+ it('should set continueOnFailedApiCall to false when explicitly provided as false', () => {
709
+ const paramsWithContinueOnFailedApiCall = {
710
+ ...baseParams,
711
+ continueOnFailedApiCall: false,
712
+ };
713
+ const config = new Config(paramsWithContinueOnFailedApiCall);
714
+ expect(config.getContinueOnFailedApiCall()).toBe(false);
715
+ });
716
+ });
717
+ describe('createToolRegistry', () => {
718
+ it('should register a tool if coreTools contains an argument-specific pattern', async () => {
719
+ const params = {
720
+ ...baseParams,
721
+ coreTools: ['ShellTool(git status)'],
722
+ };
723
+ const config = new Config(params);
724
+ await config.initialize();
725
+ // The ToolRegistry class is mocked, so we can inspect its prototype's methods.
726
+ const registerToolMock = (await vi.importMock('../tools/tool-registry')).ToolRegistry.prototype.registerTool;
727
+ // Check that registerTool was called for ShellTool
728
+ const wasShellToolRegistered = registerToolMock.mock.calls.some((call) => call[0] instanceof vi.mocked(ShellTool));
729
+ expect(wasShellToolRegistered).toBe(true);
730
+ // Check that registerTool was NOT called for ReadFileTool
731
+ const wasReadFileToolRegistered = registerToolMock.mock.calls.some((call) => call[0] instanceof vi.mocked(ReadFileTool));
732
+ expect(wasReadFileToolRegistered).toBe(false);
733
+ });
734
+ it('should register subagents as tools when codebaseInvestigatorSettings.enabled is true', async () => {
735
+ const params = {
736
+ ...baseParams,
737
+ codebaseInvestigatorSettings: { enabled: true },
738
+ };
739
+ const config = new Config(params);
740
+ const mockAgentDefinition = {
741
+ name: 'codebase-investigator',
742
+ description: 'Agent 1',
743
+ instructions: 'Inst 1',
744
+ };
745
+ const AgentRegistryMock = (await vi.importMock('../agents/registry.js')).AgentRegistry;
746
+ AgentRegistryMock.prototype.getDefinition.mockReturnValue(mockAgentDefinition);
747
+ const SubagentToolWrapperMock = (await vi.importMock('../agents/subagent-tool-wrapper.js')).SubagentToolWrapper;
748
+ await config.initialize();
749
+ const registerToolMock = (await vi.importMock('../tools/tool-registry')).ToolRegistry.prototype.registerTool;
750
+ expect(SubagentToolWrapperMock).toHaveBeenCalledTimes(1);
751
+ expect(SubagentToolWrapperMock).toHaveBeenCalledWith(mockAgentDefinition, config, undefined);
752
+ const calls = registerToolMock.mock.calls;
753
+ const registeredWrappers = calls.filter((call) => call[0] instanceof SubagentToolWrapperMock);
754
+ expect(registeredWrappers).toHaveLength(1);
755
+ });
756
+ it('should not register subagents as tools when codebaseInvestigatorSettings.enabled is false', async () => {
757
+ const params = {
758
+ ...baseParams,
759
+ codebaseInvestigatorSettings: { enabled: false },
760
+ };
761
+ const config = new Config(params);
762
+ const SubagentToolWrapperMock = (await vi.importMock('../agents/subagent-tool-wrapper.js')).SubagentToolWrapper;
763
+ await config.initialize();
764
+ expect(SubagentToolWrapperMock).not.toHaveBeenCalled();
765
+ });
766
+ describe('with minified tool class names', () => {
767
+ beforeEach(() => {
768
+ Object.defineProperty(vi.mocked(ShellTool).prototype.constructor, 'name', {
769
+ value: '_ShellTool',
770
+ configurable: true,
771
+ });
772
+ });
773
+ afterEach(() => {
774
+ Object.defineProperty(vi.mocked(ShellTool).prototype.constructor, 'name', {
775
+ value: 'ShellTool',
776
+ });
777
+ });
778
+ it('should register a tool if coreTools contains the non-minified class name', async () => {
779
+ const params = {
780
+ ...baseParams,
781
+ coreTools: ['ShellTool'],
782
+ };
783
+ const config = new Config(params);
784
+ await config.initialize();
785
+ const registerToolMock = (await vi.importMock('../tools/tool-registry')).ToolRegistry.prototype.registerTool;
786
+ const wasShellToolRegistered = registerToolMock.mock.calls.some((call) => call[0] instanceof vi.mocked(ShellTool));
787
+ expect(wasShellToolRegistered).toBe(true);
788
+ });
789
+ it('should register a tool if coreTools contains an argument-specific pattern with the non-minified class name', async () => {
790
+ const params = {
791
+ ...baseParams,
792
+ coreTools: ['ShellTool(git status)'],
793
+ };
794
+ const config = new Config(params);
795
+ await config.initialize();
796
+ const registerToolMock = (await vi.importMock('../tools/tool-registry')).ToolRegistry.prototype.registerTool;
797
+ const wasShellToolRegistered = registerToolMock.mock.calls.some((call) => call[0] instanceof vi.mocked(ShellTool));
798
+ expect(wasShellToolRegistered).toBe(true);
799
+ });
800
+ });
801
+ });
802
+ describe('getTruncateToolOutputThreshold', () => {
803
+ beforeEach(() => {
804
+ vi.clearAllMocks();
805
+ });
806
+ it('should return the calculated threshold when it is smaller than the default', () => {
807
+ const config = new Config(baseParams);
808
+ vi.mocked(tokenLimit).mockReturnValue(32000);
809
+ vi.mocked(uiTelemetryService.getLastPromptTokenCount).mockReturnValue(1000);
810
+ // 4 * (32000 - 1000) = 4 * 31000 = 124000
811
+ // default is 4_000_000
812
+ expect(config.getTruncateToolOutputThreshold()).toBe(124000);
813
+ });
814
+ it('should return the default threshold when the calculated value is larger', () => {
815
+ const config = new Config(baseParams);
816
+ vi.mocked(tokenLimit).mockReturnValue(2_000_000);
817
+ vi.mocked(uiTelemetryService.getLastPromptTokenCount).mockReturnValue(500_000);
818
+ // 4 * (2_000_000 - 500_000) = 4 * 1_500_000 = 6_000_000
819
+ // default is 4_000_000
820
+ expect(config.getTruncateToolOutputThreshold()).toBe(4_000_000);
821
+ });
822
+ it('should use a custom truncateToolOutputThreshold if provided', () => {
823
+ const customParams = {
824
+ ...baseParams,
825
+ truncateToolOutputThreshold: 50000,
826
+ };
827
+ const config = new Config(customParams);
828
+ vi.mocked(tokenLimit).mockReturnValue(8000);
829
+ vi.mocked(uiTelemetryService.getLastPromptTokenCount).mockReturnValue(2000);
830
+ // 4 * (8000 - 2000) = 4 * 6000 = 24000
831
+ // custom threshold is 50000
832
+ expect(config.getTruncateToolOutputThreshold()).toBe(24000);
833
+ vi.mocked(tokenLimit).mockReturnValue(32000);
834
+ vi.mocked(uiTelemetryService.getLastPromptTokenCount).mockReturnValue(1000);
835
+ // 4 * (32000 - 1000) = 124000
836
+ // custom threshold is 50000
837
+ expect(config.getTruncateToolOutputThreshold()).toBe(50000);
838
+ });
839
+ });
840
+ describe('Proxy Configuration Error Handling', () => {
841
+ beforeEach(() => {
842
+ vi.clearAllMocks();
843
+ });
844
+ it('should call setGlobalProxy when proxy is configured', () => {
845
+ const paramsWithProxy = {
846
+ ...baseParams,
847
+ proxy: 'http://proxy.example.com:8080',
848
+ };
849
+ new Config(paramsWithProxy);
850
+ expect(mockSetGlobalProxy).toHaveBeenCalledWith('http://proxy.example.com:8080');
851
+ });
852
+ it('should not call setGlobalProxy when proxy is not configured', () => {
853
+ new Config(baseParams);
854
+ expect(mockSetGlobalProxy).not.toHaveBeenCalled();
855
+ });
856
+ it('should emit error feedback when setGlobalProxy throws an error', () => {
857
+ const proxyError = new Error('Invalid proxy URL');
858
+ mockSetGlobalProxy.mockImplementation(() => {
859
+ throw proxyError;
860
+ });
861
+ const paramsWithProxy = {
862
+ ...baseParams,
863
+ proxy: 'invalid-proxy',
864
+ };
865
+ new Config(paramsWithProxy);
866
+ expect(mockCoreEvents.emitFeedback).toHaveBeenCalledWith('error', 'Invalid proxy configuration detected. Check debug drawer for more details (F12)', proxyError);
867
+ });
868
+ it('should not emit error feedback when setGlobalProxy succeeds', () => {
869
+ mockSetGlobalProxy.mockImplementation(() => {
870
+ // Success - no error thrown
871
+ });
872
+ const paramsWithProxy = {
873
+ ...baseParams,
874
+ proxy: 'http://proxy.example.com:8080',
875
+ };
876
+ new Config(paramsWithProxy);
877
+ expect(mockCoreEvents.emitFeedback).not.toHaveBeenCalled();
878
+ });
879
+ });
880
+ });
881
+ describe('setApprovalMode with folder trust', () => {
882
+ const baseParams = {
883
+ sessionId: 'test',
884
+ targetDir: '.',
885
+ debugMode: false,
886
+ model: 'test-model',
887
+ cwd: '.',
888
+ };
889
+ it('should throw an error when setting YOLO mode in an untrusted folder', () => {
890
+ const config = new Config(baseParams);
891
+ vi.spyOn(config, 'isTrustedFolder').mockReturnValue(false);
892
+ expect(() => config.setApprovalMode(ApprovalMode.YOLO)).toThrow('Cannot enable privileged approval modes in an untrusted folder.');
893
+ });
894
+ it('should throw an error when setting AUTO_EDIT mode in an untrusted folder', () => {
895
+ const config = new Config(baseParams);
896
+ vi.spyOn(config, 'isTrustedFolder').mockReturnValue(false);
897
+ expect(() => config.setApprovalMode(ApprovalMode.AUTO_EDIT)).toThrow('Cannot enable privileged approval modes in an untrusted folder.');
898
+ });
899
+ it('should NOT throw an error when setting DEFAULT mode in an untrusted folder', () => {
900
+ const config = new Config(baseParams);
901
+ vi.spyOn(config, 'isTrustedFolder').mockReturnValue(false);
902
+ expect(() => config.setApprovalMode(ApprovalMode.DEFAULT)).not.toThrow();
903
+ });
904
+ it('should NOT throw an error when setting any mode in a trusted folder', () => {
905
+ const config = new Config(baseParams);
906
+ vi.spyOn(config, 'isTrustedFolder').mockReturnValue(true);
907
+ expect(() => config.setApprovalMode(ApprovalMode.YOLO)).not.toThrow();
908
+ expect(() => config.setApprovalMode(ApprovalMode.AUTO_EDIT)).not.toThrow();
909
+ expect(() => config.setApprovalMode(ApprovalMode.DEFAULT)).not.toThrow();
910
+ });
911
+ it('should NOT throw an error when setting any mode if trustedFolder is undefined', () => {
912
+ const config = new Config(baseParams);
913
+ vi.spyOn(config, 'isTrustedFolder').mockReturnValue(true); // isTrustedFolder defaults to true
914
+ expect(() => config.setApprovalMode(ApprovalMode.YOLO)).not.toThrow();
915
+ expect(() => config.setApprovalMode(ApprovalMode.AUTO_EDIT)).not.toThrow();
916
+ expect(() => config.setApprovalMode(ApprovalMode.DEFAULT)).not.toThrow();
917
+ });
918
+ describe('registerCoreTools', () => {
919
+ beforeEach(() => {
920
+ vi.clearAllMocks();
921
+ });
922
+ it('should register RipGrepTool when useRipgrep is true and it is available', async () => {
923
+ canUseRipgrep.mockResolvedValue(true);
924
+ const config = new Config({ ...baseParams, useRipgrep: true });
925
+ await config.initialize();
926
+ const calls = ToolRegistry.prototype.registerTool.mock.calls;
927
+ const wasRipGrepRegistered = calls.some((call) => call[0] instanceof vi.mocked(RipGrepTool));
928
+ const wasGrepRegistered = calls.some((call) => call[0] instanceof vi.mocked(GrepTool));
929
+ expect(wasRipGrepRegistered).toBe(true);
930
+ expect(wasGrepRegistered).toBe(false);
931
+ expect(logRipgrepFallback).not.toHaveBeenCalled();
932
+ });
933
+ it('should register GrepTool as a fallback when useRipgrep is true but it is not available', async () => {
934
+ canUseRipgrep.mockResolvedValue(false);
935
+ const config = new Config({ ...baseParams, useRipgrep: true });
936
+ await config.initialize();
937
+ const calls = ToolRegistry.prototype.registerTool.mock.calls;
938
+ const wasRipGrepRegistered = calls.some((call) => call[0] instanceof vi.mocked(RipGrepTool));
939
+ const wasGrepRegistered = calls.some((call) => call[0] instanceof vi.mocked(GrepTool));
940
+ expect(wasRipGrepRegistered).toBe(false);
941
+ expect(wasGrepRegistered).toBe(true);
942
+ expect(logRipgrepFallback).toHaveBeenCalledWith(config, expect.any(RipgrepFallbackEvent));
943
+ const event = logRipgrepFallback.mock.calls[0][1];
944
+ expect(event.error).toBeUndefined();
945
+ });
946
+ it('should register GrepTool as a fallback when canUseRipgrep throws an error', async () => {
947
+ const error = new Error('ripGrep check failed');
948
+ canUseRipgrep.mockRejectedValue(error);
949
+ const config = new Config({ ...baseParams, useRipgrep: true });
950
+ await config.initialize();
951
+ const calls = ToolRegistry.prototype.registerTool.mock.calls;
952
+ const wasRipGrepRegistered = calls.some((call) => call[0] instanceof vi.mocked(RipGrepTool));
953
+ const wasGrepRegistered = calls.some((call) => call[0] instanceof vi.mocked(GrepTool));
954
+ expect(wasRipGrepRegistered).toBe(false);
955
+ expect(wasGrepRegistered).toBe(true);
956
+ expect(logRipgrepFallback).toHaveBeenCalledWith(config, expect.any(RipgrepFallbackEvent));
957
+ const event = logRipgrepFallback.mock.calls[0][1];
958
+ expect(event.error).toBe(String(error));
959
+ });
960
+ it('should register GrepTool when useRipgrep is false', async () => {
961
+ const config = new Config({ ...baseParams, useRipgrep: false });
962
+ await config.initialize();
963
+ const calls = ToolRegistry.prototype.registerTool.mock.calls;
964
+ const wasRipGrepRegistered = calls.some((call) => call[0] instanceof vi.mocked(RipGrepTool));
965
+ const wasGrepRegistered = calls.some((call) => call[0] instanceof vi.mocked(GrepTool));
966
+ expect(wasRipGrepRegistered).toBe(false);
967
+ expect(wasGrepRegistered).toBe(true);
968
+ expect(canUseRipgrep).not.toHaveBeenCalled();
969
+ expect(logRipgrepFallback).not.toHaveBeenCalled();
970
+ });
971
+ });
972
+ });
973
+ describe('isYoloModeDisabled', () => {
974
+ const baseParams = {
975
+ sessionId: 'test',
976
+ targetDir: '.',
977
+ debugMode: false,
978
+ model: 'test-model',
979
+ cwd: '.',
980
+ };
981
+ it('should return false when yolo mode is not disabled and folder is trusted', () => {
982
+ const config = new Config(baseParams);
983
+ vi.spyOn(config, 'isTrustedFolder').mockReturnValue(true);
984
+ expect(config.isYoloModeDisabled()).toBe(false);
985
+ });
986
+ it('should return true when yolo mode is disabled by parameter', () => {
987
+ const config = new Config({ ...baseParams, disableYoloMode: true });
988
+ vi.spyOn(config, 'isTrustedFolder').mockReturnValue(true);
989
+ expect(config.isYoloModeDisabled()).toBe(true);
990
+ });
991
+ it('should return true when folder is untrusted', () => {
992
+ const config = new Config(baseParams);
993
+ vi.spyOn(config, 'isTrustedFolder').mockReturnValue(false);
994
+ expect(config.isYoloModeDisabled()).toBe(true);
995
+ });
996
+ it('should return true when yolo is disabled and folder is untrusted', () => {
997
+ const config = new Config({ ...baseParams, disableYoloMode: true });
998
+ vi.spyOn(config, 'isTrustedFolder').mockReturnValue(false);
999
+ expect(config.isYoloModeDisabled()).toBe(true);
1000
+ });
1001
+ });
1002
+ describe('BaseLlmClient Lifecycle', () => {
1003
+ const MODEL = 'gemini-pro';
1004
+ const SANDBOX = {
1005
+ command: 'docker',
1006
+ image: 'gemini-cli-sandbox',
1007
+ };
1008
+ const TARGET_DIR = '/path/to/target';
1009
+ const DEBUG_MODE = false;
1010
+ const QUESTION = 'test question';
1011
+ const USER_MEMORY = 'Test User Memory';
1012
+ const TELEMETRY_SETTINGS = { enabled: false };
1013
+ const EMBEDDING_MODEL = 'gemini-embedding';
1014
+ const SESSION_ID = 'test-session-id';
1015
+ const baseParams = {
1016
+ cwd: '/tmp',
1017
+ embeddingModel: EMBEDDING_MODEL,
1018
+ sandbox: SANDBOX,
1019
+ targetDir: TARGET_DIR,
1020
+ debugMode: DEBUG_MODE,
1021
+ question: QUESTION,
1022
+ userMemory: USER_MEMORY,
1023
+ telemetry: TELEMETRY_SETTINGS,
1024
+ sessionId: SESSION_ID,
1025
+ model: MODEL,
1026
+ usageStatisticsEnabled: false,
1027
+ };
1028
+ it('should throw an error if getBaseLlmClient is called before refreshAuth', () => {
1029
+ const config = new Config(baseParams);
1030
+ expect(() => config.getBaseLlmClient()).toThrow('BaseLlmClient not initialized. Ensure authentication has occurred and ContentGenerator is ready.');
1031
+ });
1032
+ it('should successfully initialize BaseLlmClient after refreshAuth is called', async () => {
1033
+ const config = new Config(baseParams);
1034
+ const authType = AuthType.USE_GEMINI;
1035
+ const mockContentConfig = { model: 'gemini-flash', apiKey: 'test-key' };
1036
+ vi.mocked(createContentGeneratorConfig).mockResolvedValue(mockContentConfig);
1037
+ await config.refreshAuth(authType);
1038
+ // Should not throw
1039
+ const llmService = config.getBaseLlmClient();
1040
+ expect(llmService).toBeDefined();
1041
+ expect(BaseLlmClient).toHaveBeenCalledWith(config.getContentGenerator(), config);
1042
+ });
1043
+ });
1044
+ describe('Generation Config Merging (HACK)', () => {
1045
+ const MODEL = 'gemini-pro';
1046
+ const SANDBOX = {
1047
+ command: 'docker',
1048
+ image: 'gemini-cli-sandbox',
1049
+ };
1050
+ const TARGET_DIR = '/path/to/target';
1051
+ const DEBUG_MODE = false;
1052
+ const QUESTION = 'test question';
1053
+ const USER_MEMORY = 'Test User Memory';
1054
+ const TELEMETRY_SETTINGS = { enabled: false };
1055
+ const EMBEDDING_MODEL = 'gemini-embedding';
1056
+ const SESSION_ID = 'test-session-id';
1057
+ const baseParams = {
1058
+ cwd: '/tmp',
1059
+ embeddingModel: EMBEDDING_MODEL,
1060
+ sandbox: SANDBOX,
1061
+ targetDir: TARGET_DIR,
1062
+ debugMode: DEBUG_MODE,
1063
+ question: QUESTION,
1064
+ userMemory: USER_MEMORY,
1065
+ telemetry: TELEMETRY_SETTINGS,
1066
+ sessionId: SESSION_ID,
1067
+ model: MODEL,
1068
+ usageStatisticsEnabled: false,
1069
+ };
1070
+ it('should merge default aliases when user provides only overrides', () => {
1071
+ const userOverrides = [
1072
+ {
1073
+ match: { model: 'test-model' },
1074
+ modelConfig: { generateContentConfig: { temperature: 0.1 } },
1075
+ },
1076
+ ];
1077
+ const params = {
1078
+ ...baseParams,
1079
+ modelConfigServiceConfig: {
1080
+ overrides: userOverrides,
1081
+ },
1082
+ };
1083
+ const config = new Config(params);
1084
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
1085
+ const serviceConfig = config.modelConfigService.config;
1086
+ // Assert that the default aliases are present
1087
+ expect(serviceConfig.aliases).toEqual(DEFAULT_MODEL_CONFIGS.aliases);
1088
+ // Assert that the user's overrides are present
1089
+ expect(serviceConfig.overrides).toEqual(userOverrides);
1090
+ });
1091
+ it('should use user-provided aliases if they exist', () => {
1092
+ const userAliases = {
1093
+ 'my-alias': {
1094
+ modelConfig: { model: 'my-model' },
1095
+ },
1096
+ };
1097
+ const params = {
1098
+ ...baseParams,
1099
+ modelConfigServiceConfig: {
1100
+ aliases: userAliases,
1101
+ },
1102
+ };
1103
+ const config = new Config(params);
1104
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
1105
+ const serviceConfig = config.modelConfigService.config;
1106
+ // Assert that the user's aliases are used, not the defaults
1107
+ expect(serviceConfig.aliases).toEqual(userAliases);
1108
+ });
1109
+ it('should use default generation config if none is provided', () => {
1110
+ const params = { ...baseParams };
1111
+ const config = new Config(params);
1112
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
1113
+ const serviceConfig = config.modelConfigService.config;
1114
+ // Assert that the full default config is used
1115
+ expect(serviceConfig).toEqual(DEFAULT_MODEL_CONFIGS);
1116
+ });
1117
+ });
1118
+ describe('Config getHooks', () => {
1119
+ const baseParams = {
1120
+ cwd: '/tmp',
1121
+ targetDir: '/path/to/target',
1122
+ debugMode: false,
1123
+ sessionId: 'test-session-id',
1124
+ model: 'gemini-pro',
1125
+ usageStatisticsEnabled: false,
1126
+ };
1127
+ it('should return undefined when no hooks are provided', () => {
1128
+ const config = new Config(baseParams);
1129
+ expect(config.getHooks()).toBeUndefined();
1130
+ });
1131
+ it('should return empty object when empty hooks are provided', () => {
1132
+ const configWithEmptyHooks = new Config({
1133
+ ...baseParams,
1134
+ hooks: {},
1135
+ });
1136
+ expect(configWithEmptyHooks.getHooks()).toEqual({});
1137
+ });
1138
+ it('should return the hooks configuration when provided', () => {
1139
+ const mockHooks = {
1140
+ [HookEventName.BeforeTool]: [
1141
+ {
1142
+ matcher: 'write_file',
1143
+ hooks: [
1144
+ {
1145
+ type: HookType.Command,
1146
+ command: 'echo "test hook"',
1147
+ timeout: 5000,
1148
+ },
1149
+ ],
1150
+ },
1151
+ ],
1152
+ [HookEventName.AfterTool]: [
1153
+ {
1154
+ hooks: [
1155
+ {
1156
+ type: HookType.Command,
1157
+ command: './hooks/after-tool.sh',
1158
+ timeout: 10000,
1159
+ },
1160
+ ],
1161
+ },
1162
+ ],
1163
+ };
1164
+ const config = new Config({
1165
+ ...baseParams,
1166
+ hooks: mockHooks,
1167
+ });
1168
+ const retrievedHooks = config.getHooks();
1169
+ expect(retrievedHooks).toEqual(mockHooks);
1170
+ expect(retrievedHooks).toBe(mockHooks); // Should return the same reference
1171
+ });
1172
+ it('should return hooks with all supported event types', () => {
1173
+ const allEventHooks = {
1174
+ [HookEventName.BeforeAgent]: [
1175
+ { hooks: [{ type: HookType.Command, command: 'test1' }] },
1176
+ ],
1177
+ [HookEventName.AfterAgent]: [
1178
+ { hooks: [{ type: HookType.Command, command: 'test2' }] },
1179
+ ],
1180
+ [HookEventName.BeforeTool]: [
1181
+ { hooks: [{ type: HookType.Command, command: 'test3' }] },
1182
+ ],
1183
+ [HookEventName.AfterTool]: [
1184
+ { hooks: [{ type: HookType.Command, command: 'test4' }] },
1185
+ ],
1186
+ [HookEventName.BeforeModel]: [
1187
+ { hooks: [{ type: HookType.Command, command: 'test5' }] },
1188
+ ],
1189
+ [HookEventName.AfterModel]: [
1190
+ { hooks: [{ type: HookType.Command, command: 'test6' }] },
1191
+ ],
1192
+ [HookEventName.BeforeToolSelection]: [
1193
+ { hooks: [{ type: HookType.Command, command: 'test7' }] },
1194
+ ],
1195
+ [HookEventName.Notification]: [
1196
+ { hooks: [{ type: HookType.Command, command: 'test8' }] },
1197
+ ],
1198
+ [HookEventName.SessionStart]: [
1199
+ { hooks: [{ type: HookType.Command, command: 'test9' }] },
1200
+ ],
1201
+ [HookEventName.SessionEnd]: [
1202
+ { hooks: [{ type: HookType.Command, command: 'test10' }] },
1203
+ ],
1204
+ [HookEventName.PreCompress]: [
1205
+ { hooks: [{ type: HookType.Command, command: 'test11' }] },
1206
+ ],
1207
+ };
1208
+ const config = new Config({
1209
+ ...baseParams,
1210
+ hooks: allEventHooks,
1211
+ });
1212
+ const retrievedHooks = config.getHooks();
1213
+ expect(retrievedHooks).toEqual(allEventHooks);
1214
+ expect(Object.keys(retrievedHooks)).toHaveLength(11); // All hook event types
1215
+ });
1216
+ describe('setModel', () => {
1217
+ it('should allow setting a pro (any) model and disable fallback mode', () => {
1218
+ const config = new Config(baseParams);
1219
+ config.setFallbackMode(true);
1220
+ expect(config.isInFallbackMode()).toBe(true);
1221
+ const proModel = 'gemini-2.5-pro';
1222
+ config.setModel(proModel);
1223
+ expect(config.getModel()).toBe(proModel);
1224
+ expect(config.isInFallbackMode()).toBe(false);
1225
+ expect(mockCoreEvents.emitModelChanged).toHaveBeenCalledWith(proModel);
1226
+ });
1227
+ it('should allow setting auto model from non-auto model and disable fallback mode', () => {
1228
+ const config = new Config(baseParams);
1229
+ config.setFallbackMode(true);
1230
+ expect(config.isInFallbackMode()).toBe(true);
1231
+ config.setModel('auto');
1232
+ expect(config.getModel()).toBe('auto');
1233
+ expect(config.isInFallbackMode()).toBe(false);
1234
+ expect(mockCoreEvents.emitModelChanged).toHaveBeenCalledWith('auto');
1235
+ });
1236
+ it('should allow setting auto model from auto model if it is in the fallback mode', () => {
1237
+ const config = new Config({
1238
+ cwd: '/tmp',
1239
+ targetDir: '/path/to/target',
1240
+ debugMode: false,
1241
+ sessionId: 'test-session-id',
1242
+ model: 'auto',
1243
+ usageStatisticsEnabled: false,
1244
+ });
1245
+ config.setFallbackMode(true);
1246
+ expect(config.isInFallbackMode()).toBe(true);
1247
+ config.setModel('auto');
1248
+ expect(config.getModel()).toBe('auto');
1249
+ expect(config.isInFallbackMode()).toBe(false);
1250
+ expect(mockCoreEvents.emitModelChanged).toHaveBeenCalledWith('auto');
1251
+ });
1252
+ });
1253
+ });
1254
+ describe('Config getExperiments', () => {
1255
+ const baseParams = {
1256
+ cwd: '/tmp',
1257
+ targetDir: '/path/to/target',
1258
+ debugMode: false,
1259
+ sessionId: 'test-session-id',
1260
+ model: 'gemini-pro',
1261
+ usageStatisticsEnabled: false,
1262
+ };
1263
+ it('should return undefined when no experiments are provided', () => {
1264
+ const config = new Config(baseParams);
1265
+ expect(config.getExperiments()).toBeUndefined();
1266
+ });
1267
+ it('should return empty object when empty experiments are provided', () => {
1268
+ const configWithEmptyExps = new Config({
1269
+ ...baseParams,
1270
+ experiments: { flags: {}, experimentIds: [] },
1271
+ });
1272
+ expect(configWithEmptyExps.getExperiments()).toEqual({
1273
+ flags: {},
1274
+ experimentIds: [],
1275
+ });
1276
+ });
1277
+ it('should return the experiments configuration when provided', () => {
1278
+ const mockExps = {
1279
+ flags: {
1280
+ testFlag: { boolValue: true },
1281
+ },
1282
+ experimentIds: [],
1283
+ };
1284
+ const config = new Config({
1285
+ ...baseParams,
1286
+ experiments: mockExps,
1287
+ });
1288
+ const retrievedExps = config.getExperiments();
1289
+ expect(retrievedExps).toEqual(mockExps);
1290
+ expect(retrievedExps).toBe(mockExps); // Should return the same reference
1291
+ });
1292
+ });
1293
+ describe('Config setExperiments logging', () => {
1294
+ const baseParams = {
1295
+ cwd: '/tmp',
1296
+ targetDir: '/path/to/target',
1297
+ debugMode: false,
1298
+ sessionId: 'test-session-id',
1299
+ model: 'gemini-pro',
1300
+ usageStatisticsEnabled: false,
1301
+ };
1302
+ it('logs a sorted, non-truncated summary of experiments when they are set', () => {
1303
+ const config = new Config(baseParams);
1304
+ const debugSpy = vi
1305
+ .spyOn(debugLogger, 'debug')
1306
+ .mockImplementation(() => { });
1307
+ const experiments = {
1308
+ flags: {
1309
+ ZetaFlag: {
1310
+ boolValue: true,
1311
+ stringValue: 'zeta',
1312
+ int32ListValue: { values: [1, 2] },
1313
+ },
1314
+ AlphaFlag: {
1315
+ boolValue: false,
1316
+ stringValue: 'alpha',
1317
+ stringListValue: { values: ['a', 'b', 'c'] },
1318
+ },
1319
+ MiddleFlag: {
1320
+ // Intentionally sparse to ensure undefined values are omitted
1321
+ floatValue: 0.42,
1322
+ int32ListValue: { values: [] },
1323
+ },
1324
+ },
1325
+ experimentIds: [101, 99],
1326
+ };
1327
+ config.setExperiments(experiments);
1328
+ const logCall = debugSpy.mock.calls.find(([message]) => message === 'Experiments loaded');
1329
+ expect(logCall).toBeDefined();
1330
+ const loggedSummary = logCall?.[1];
1331
+ expect(typeof loggedSummary).toBe('string');
1332
+ expect(loggedSummary).toContain('experimentIds');
1333
+ expect(loggedSummary).toContain('101');
1334
+ expect(loggedSummary).toContain('AlphaFlag');
1335
+ expect(loggedSummary).toContain('ZetaFlag');
1336
+ const alphaIndex = loggedSummary.indexOf('AlphaFlag');
1337
+ const zetaIndex = loggedSummary.indexOf('ZetaFlag');
1338
+ expect(alphaIndex).toBeGreaterThan(-1);
1339
+ expect(zetaIndex).toBeGreaterThan(-1);
1340
+ expect(alphaIndex).toBeLessThan(zetaIndex);
1341
+ expect(loggedSummary).toContain('\n');
1342
+ expect(loggedSummary).not.toContain('stringListLength: 0');
1343
+ expect(loggedSummary).not.toContain('int32ListLength: 0');
1344
+ debugSpy.mockRestore();
1345
+ });
472
1346
  });
473
1347
  //# sourceMappingURL=config.test.js.map