@didim365/agent-cli 0.1.1 → 0.1.3

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 (1091) hide show
  1. package/dist/package.json +5 -2
  2. package/dist/src/config/settingsSchema.d.ts +85 -0
  3. package/dist/src/config/settingsSchema.js +85 -0
  4. package/dist/src/config/settingsSchema.js.map +1 -1
  5. package/dist/src/core/initializer.js +42 -3
  6. package/dist/src/core/initializer.js.map +1 -1
  7. package/dist/src/gemini.d.ts +6 -0
  8. package/dist/src/gemini.js +79 -5
  9. package/dist/src/gemini.js.map +1 -1
  10. package/dist/src/generated/git-commit.d.ts +1 -1
  11. package/dist/src/generated/git-commit.js +1 -1
  12. package/dist/src/test-utils/render.js +9 -0
  13. package/dist/src/test-utils/render.js.map +1 -1
  14. package/dist/src/ui/AppContainer.js +182 -9
  15. package/dist/src/ui/AppContainer.js.map +1 -1
  16. package/dist/src/ui/auth/ApiAuthDialog.d.ts +3 -1
  17. package/dist/src/ui/auth/ApiAuthDialog.js +7 -5
  18. package/dist/src/ui/auth/ApiAuthDialog.js.map +1 -1
  19. package/dist/src/ui/auth/AuthDialog.d.ts +3 -1
  20. package/dist/src/ui/auth/AuthDialog.js +6 -6
  21. package/dist/src/ui/auth/AuthDialog.js.map +1 -1
  22. package/dist/src/ui/auth/ProviderSelectDialog.d.ts +15 -0
  23. package/dist/src/ui/auth/ProviderSelectDialog.js +39 -0
  24. package/dist/src/ui/auth/ProviderSelectDialog.js.map +1 -0
  25. package/dist/src/ui/auth/SlmConfigDialog.d.ts +21 -0
  26. package/dist/src/ui/auth/SlmConfigDialog.js +170 -0
  27. package/dist/src/ui/auth/SlmConfigDialog.js.map +1 -0
  28. package/dist/src/ui/auth/VertexConfigDialog.d.ts +18 -0
  29. package/dist/src/ui/auth/VertexConfigDialog.js +97 -0
  30. package/dist/src/ui/auth/VertexConfigDialog.js.map +1 -0
  31. package/dist/src/ui/auth/providerMetadata.d.ts +38 -0
  32. package/dist/src/ui/auth/providerMetadata.js +71 -0
  33. package/dist/src/ui/auth/providerMetadata.js.map +1 -0
  34. package/dist/src/ui/auth/useAuth.d.ts +3 -0
  35. package/dist/src/ui/auth/useAuth.js +243 -39
  36. package/dist/src/ui/auth/useAuth.js.map +1 -1
  37. package/dist/src/ui/commands/authCommand.js +18 -1
  38. package/dist/src/ui/commands/authCommand.js.map +1 -1
  39. package/dist/src/ui/commands/initCommand.js +1 -1
  40. package/dist/src/ui/commands/initCommand.js.map +1 -1
  41. package/dist/src/ui/commands/rewindCommand.js.map +1 -1
  42. package/dist/src/ui/components/ContextSummaryDisplay.js.map +1 -1
  43. package/dist/src/ui/components/DialogManager.js +27 -2
  44. package/dist/src/ui/components/DialogManager.js.map +1 -1
  45. package/dist/src/ui/components/InputPrompt.js +1 -1
  46. package/dist/src/ui/components/InputPrompt.js.map +1 -1
  47. package/dist/src/ui/contexts/UIActionsContext.d.ts +14 -0
  48. package/dist/src/ui/contexts/UIActionsContext.js.map +1 -1
  49. package/dist/src/ui/contexts/UIStateContext.d.ts +4 -0
  50. package/dist/src/ui/contexts/UIStateContext.js.map +1 -1
  51. package/dist/src/ui/hooks/useRewind.js.map +1 -1
  52. package/dist/src/ui/types.d.ts +4 -1
  53. package/dist/src/ui/types.js +6 -0
  54. package/dist/src/ui/types.js.map +1 -1
  55. package/dist/src/ui/utils/mouse.js +1 -1
  56. package/dist/src/ui/utils/mouse.js.map +1 -1
  57. package/dist/src/ui/utils/rewindFileOps.js.map +1 -1
  58. package/package.json +6 -3
  59. package/dist/src/commands/extensions/configure.test.d.ts +0 -1
  60. package/dist/src/commands/extensions/configure.test.js +0 -197
  61. package/dist/src/commands/extensions/configure.test.js.map +0 -1
  62. package/dist/src/commands/extensions/disable.test.d.ts +0 -6
  63. package/dist/src/commands/extensions/disable.test.js +0 -169
  64. package/dist/src/commands/extensions/disable.test.js.map +0 -1
  65. package/dist/src/commands/extensions/enable.test.d.ts +0 -6
  66. package/dist/src/commands/extensions/enable.test.js +0 -199
  67. package/dist/src/commands/extensions/enable.test.js.map +0 -1
  68. package/dist/src/commands/extensions/install.test.d.ts +0 -6
  69. package/dist/src/commands/extensions/install.test.js +0 -140
  70. package/dist/src/commands/extensions/install.test.js.map +0 -1
  71. package/dist/src/commands/extensions/link.test.d.ts +0 -6
  72. package/dist/src/commands/extensions/link.test.js +0 -137
  73. package/dist/src/commands/extensions/link.test.js.map +0 -1
  74. package/dist/src/commands/extensions/list.test.d.ts +0 -6
  75. package/dist/src/commands/extensions/list.test.js +0 -148
  76. package/dist/src/commands/extensions/list.test.js.map +0 -1
  77. package/dist/src/commands/extensions/new.test.d.ts +0 -6
  78. package/dist/src/commands/extensions/new.test.js +0 -62
  79. package/dist/src/commands/extensions/new.test.js.map +0 -1
  80. package/dist/src/commands/extensions/uninstall.test.d.ts +0 -6
  81. package/dist/src/commands/extensions/uninstall.test.js +0 -199
  82. package/dist/src/commands/extensions/uninstall.test.js.map +0 -1
  83. package/dist/src/commands/extensions/update.test.d.ts +0 -6
  84. package/dist/src/commands/extensions/update.test.js +0 -170
  85. package/dist/src/commands/extensions/update.test.js.map +0 -1
  86. package/dist/src/commands/extensions/validate.test.d.ts +0 -6
  87. package/dist/src/commands/extensions/validate.test.js +0 -96
  88. package/dist/src/commands/extensions/validate.test.js.map +0 -1
  89. package/dist/src/commands/extensions.test.d.ts +0 -6
  90. package/dist/src/commands/extensions.test.js +0 -67
  91. package/dist/src/commands/extensions.test.js.map +0 -1
  92. package/dist/src/commands/hooks/migrate.test.d.ts +0 -6
  93. package/dist/src/commands/hooks/migrate.test.js +0 -388
  94. package/dist/src/commands/hooks/migrate.test.js.map +0 -1
  95. package/dist/src/commands/mcp/add.test.d.ts +0 -6
  96. package/dist/src/commands/mcp/add.test.js +0 -274
  97. package/dist/src/commands/mcp/add.test.js.map +0 -1
  98. package/dist/src/commands/mcp/list.test.d.ts +0 -6
  99. package/dist/src/commands/mcp/list.test.js +0 -150
  100. package/dist/src/commands/mcp/list.test.js.map +0 -1
  101. package/dist/src/commands/mcp/remove.test.d.ts +0 -6
  102. package/dist/src/commands/mcp/remove.test.js +0 -189
  103. package/dist/src/commands/mcp/remove.test.js.map +0 -1
  104. package/dist/src/commands/mcp.test.d.ts +0 -6
  105. package/dist/src/commands/mcp.test.js +0 -65
  106. package/dist/src/commands/mcp.test.js.map +0 -1
  107. package/dist/src/commands/skills/disable.test.d.ts +0 -6
  108. package/dist/src/commands/skills/disable.test.js +0 -96
  109. package/dist/src/commands/skills/disable.test.js.map +0 -1
  110. package/dist/src/commands/skills/enable.test.d.ts +0 -6
  111. package/dist/src/commands/skills/enable.test.js +0 -107
  112. package/dist/src/commands/skills/enable.test.js.map +0 -1
  113. package/dist/src/commands/skills/install.test.d.ts +0 -6
  114. package/dist/src/commands/skills/install.test.js +0 -95
  115. package/dist/src/commands/skills/install.test.js.map +0 -1
  116. package/dist/src/commands/skills/list.test.d.ts +0 -6
  117. package/dist/src/commands/skills/list.test.js +0 -136
  118. package/dist/src/commands/skills/list.test.js.map +0 -1
  119. package/dist/src/commands/skills/uninstall.test.d.ts +0 -6
  120. package/dist/src/commands/skills/uninstall.test.js +0 -61
  121. package/dist/src/commands/skills/uninstall.test.js.map +0 -1
  122. package/dist/src/commands/skills.test.d.ts +0 -6
  123. package/dist/src/commands/skills.test.js +0 -49
  124. package/dist/src/commands/skills.test.js.map +0 -1
  125. package/dist/src/commands/utils.test.d.ts +0 -6
  126. package/dist/src/commands/utils.test.js +0 -35
  127. package/dist/src/commands/utils.test.js.map +0 -1
  128. package/dist/src/config/auth.test.d.ts +0 -6
  129. package/dist/src/config/auth.test.js +0 -89
  130. package/dist/src/config/auth.test.js.map +0 -1
  131. package/dist/src/config/config.integration.test.d.ts +0 -6
  132. package/dist/src/config/config.integration.test.js +0 -205
  133. package/dist/src/config/config.integration.test.js.map +0 -1
  134. package/dist/src/config/config.test.d.ts +0 -6
  135. package/dist/src/config/config.test.js +0 -2413
  136. package/dist/src/config/config.test.js.map +0 -1
  137. package/dist/src/config/extension-manager-agents.test.d.ts +0 -6
  138. package/dist/src/config/extension-manager-agents.test.js +0 -114
  139. package/dist/src/config/extension-manager-agents.test.js.map +0 -1
  140. package/dist/src/config/extension-manager-scope.test.d.ts +0 -6
  141. package/dist/src/config/extension-manager-scope.test.js +0 -153
  142. package/dist/src/config/extension-manager-scope.test.js.map +0 -1
  143. package/dist/src/config/extension-manager-skills.test.d.ts +0 -6
  144. package/dist/src/config/extension-manager-skills.test.js +0 -148
  145. package/dist/src/config/extension-manager-skills.test.js.map +0 -1
  146. package/dist/src/config/extension.test.d.ts +0 -6
  147. package/dist/src/config/extension.test.js +0 -1671
  148. package/dist/src/config/extension.test.js.map +0 -1
  149. package/dist/src/config/extensions/consent.test.d.ts +0 -6
  150. package/dist/src/config/extensions/consent.test.js +0 -280
  151. package/dist/src/config/extensions/consent.test.js.map +0 -1
  152. package/dist/src/config/extensions/extensionEnablement.test.d.ts +0 -6
  153. package/dist/src/config/extensions/extensionEnablement.test.js +0 -404
  154. package/dist/src/config/extensions/extensionEnablement.test.js.map +0 -1
  155. package/dist/src/config/extensions/extensionSettings.test.d.ts +0 -6
  156. package/dist/src/config/extensions/extensionSettings.test.js +0 -493
  157. package/dist/src/config/extensions/extensionSettings.test.js.map +0 -1
  158. package/dist/src/config/extensions/extensionUpdates.test.d.ts +0 -6
  159. package/dist/src/config/extensions/extensionUpdates.test.js +0 -230
  160. package/dist/src/config/extensions/extensionUpdates.test.js.map +0 -1
  161. package/dist/src/config/extensions/github.test.d.ts +0 -6
  162. package/dist/src/config/extensions/github.test.js +0 -441
  163. package/dist/src/config/extensions/github.test.js.map +0 -1
  164. package/dist/src/config/extensions/github_fetch.test.d.ts +0 -6
  165. package/dist/src/config/extensions/github_fetch.test.js +0 -169
  166. package/dist/src/config/extensions/github_fetch.test.js.map +0 -1
  167. package/dist/src/config/extensions/storage.test.d.ts +0 -6
  168. package/dist/src/config/extensions/storage.test.js +0 -64
  169. package/dist/src/config/extensions/storage.test.js.map +0 -1
  170. package/dist/src/config/extensions/update.test.d.ts +0 -6
  171. package/dist/src/config/extensions/update.test.js +0 -231
  172. package/dist/src/config/extensions/update.test.js.map +0 -1
  173. package/dist/src/config/extensions/variables.test.d.ts +0 -6
  174. package/dist/src/config/extensions/variables.test.js +0 -103
  175. package/dist/src/config/extensions/variables.test.js.map +0 -1
  176. package/dist/src/config/keyBindings.test.d.ts +0 -6
  177. package/dist/src/config/keyBindings.test.js +0 -108
  178. package/dist/src/config/keyBindings.test.js.map +0 -1
  179. package/dist/src/config/mcp/mcpServerEnablement.test.d.ts +0 -6
  180. package/dist/src/config/mcp/mcpServerEnablement.test.js +0 -147
  181. package/dist/src/config/mcp/mcpServerEnablement.test.js.map +0 -1
  182. package/dist/src/config/policy-engine.integration.test.d.ts +0 -6
  183. package/dist/src/config/policy-engine.integration.test.js +0 -353
  184. package/dist/src/config/policy-engine.integration.test.js.map +0 -1
  185. package/dist/src/config/sandboxConfig.test.d.ts +0 -6
  186. package/dist/src/config/sandboxConfig.test.js +0 -184
  187. package/dist/src/config/sandboxConfig.test.js.map +0 -1
  188. package/dist/src/config/settingPaths.test.d.ts +0 -6
  189. package/dist/src/config/settingPaths.test.js +0 -22
  190. package/dist/src/config/settingPaths.test.js.map +0 -1
  191. package/dist/src/config/settings-validation.test.d.ts +0 -6
  192. package/dist/src/config/settings-validation.test.js +0 -370
  193. package/dist/src/config/settings-validation.test.js.map +0 -1
  194. package/dist/src/config/settings.test.d.ts +0 -6
  195. package/dist/src/config/settings.test.js +0 -1822
  196. package/dist/src/config/settings.test.js.map +0 -1
  197. package/dist/src/config/settingsSchema.test.d.ts +0 -6
  198. package/dist/src/config/settingsSchema.test.js +0 -309
  199. package/dist/src/config/settingsSchema.test.js.map +0 -1
  200. package/dist/src/config/settings_repro.test.d.ts +0 -6
  201. package/dist/src/config/settings_repro.test.js +0 -166
  202. package/dist/src/config/settings_repro.test.js.map +0 -1
  203. package/dist/src/config/settings_validation_warning.test.d.ts +0 -6
  204. package/dist/src/config/settings_validation_warning.test.js +0 -123
  205. package/dist/src/config/settings_validation_warning.test.js.map +0 -1
  206. package/dist/src/config/skills-backward-compatibility.test.d.ts +0 -6
  207. package/dist/src/config/skills-backward-compatibility.test.js +0 -99
  208. package/dist/src/config/skills-backward-compatibility.test.js.map +0 -1
  209. package/dist/src/config/trustedFolders.test.d.ts +0 -6
  210. package/dist/src/config/trustedFolders.test.js +0 -385
  211. package/dist/src/config/trustedFolders.test.js.map +0 -1
  212. package/dist/src/core/auth.test.d.ts +0 -6
  213. package/dist/src/core/auth.test.js +0 -47
  214. package/dist/src/core/auth.test.js.map +0 -1
  215. package/dist/src/core/initializer.test.d.ts +0 -6
  216. package/dist/src/core/initializer.test.js +0 -101
  217. package/dist/src/core/initializer.test.js.map +0 -1
  218. package/dist/src/core/theme.test.d.ts +0 -6
  219. package/dist/src/core/theme.test.js +0 -46
  220. package/dist/src/core/theme.test.js.map +0 -1
  221. package/dist/src/deferred.test.d.ts +0 -6
  222. package/dist/src/deferred.test.js +0 -164
  223. package/dist/src/deferred.test.js.map +0 -1
  224. package/dist/src/gemini.test.d.ts +0 -6
  225. package/dist/src/gemini.test.js +0 -1334
  226. package/dist/src/gemini.test.js.map +0 -1
  227. package/dist/src/gemini_cleanup.test.d.ts +0 -6
  228. package/dist/src/gemini_cleanup.test.js +0 -208
  229. package/dist/src/gemini_cleanup.test.js.map +0 -1
  230. package/dist/src/nonInteractiveCli.test.d.ts +0 -6
  231. package/dist/src/nonInteractiveCli.test.js +0 -1687
  232. package/dist/src/nonInteractiveCli.test.js.map +0 -1
  233. package/dist/src/services/BuiltinCommandLoader.test.d.ts +0 -6
  234. package/dist/src/services/BuiltinCommandLoader.test.js +0 -254
  235. package/dist/src/services/BuiltinCommandLoader.test.js.map +0 -1
  236. package/dist/src/services/CommandService.test.d.ts +0 -6
  237. package/dist/src/services/CommandService.test.js +0 -234
  238. package/dist/src/services/CommandService.test.js.map +0 -1
  239. package/dist/src/services/FileCommandLoader.test.d.ts +0 -6
  240. package/dist/src/services/FileCommandLoader.test.js +0 -1102
  241. package/dist/src/services/FileCommandLoader.test.js.map +0 -1
  242. package/dist/src/services/McpPromptLoader.test.d.ts +0 -6
  243. package/dist/src/services/McpPromptLoader.test.js +0 -411
  244. package/dist/src/services/McpPromptLoader.test.js.map +0 -1
  245. package/dist/src/services/prompt-processors/argumentProcessor.test.d.ts +0 -6
  246. package/dist/src/services/prompt-processors/argumentProcessor.test.js +0 -40
  247. package/dist/src/services/prompt-processors/argumentProcessor.test.js.map +0 -1
  248. package/dist/src/services/prompt-processors/atFileProcessor.test.d.ts +0 -6
  249. package/dist/src/services/prompt-processors/atFileProcessor.test.js +0 -174
  250. package/dist/src/services/prompt-processors/atFileProcessor.test.js.map +0 -1
  251. package/dist/src/services/prompt-processors/injectionParser.test.d.ts +0 -6
  252. package/dist/src/services/prompt-processors/injectionParser.test.js +0 -189
  253. package/dist/src/services/prompt-processors/injectionParser.test.js.map +0 -1
  254. package/dist/src/services/prompt-processors/shellProcessor.test.d.ts +0 -6
  255. package/dist/src/services/prompt-processors/shellProcessor.test.js +0 -514
  256. package/dist/src/services/prompt-processors/shellProcessor.test.js.map +0 -1
  257. package/dist/src/test-utils/mockCommandContext.test.d.ts +0 -6
  258. package/dist/src/test-utils/mockCommandContext.test.js +0 -51
  259. package/dist/src/test-utils/mockCommandContext.test.js.map +0 -1
  260. package/dist/src/test-utils/render.test.d.ts +0 -6
  261. package/dist/src/test-utils/render.test.js +0 -79
  262. package/dist/src/test-utils/render.test.js.map +0 -1
  263. package/dist/src/ui/App.test.d.ts +0 -6
  264. package/dist/src/ui/App.test.js +0 -218
  265. package/dist/src/ui/App.test.js.map +0 -1
  266. package/dist/src/ui/AppContainer.test.d.ts +0 -6
  267. package/dist/src/ui/AppContainer.test.js +0 -2072
  268. package/dist/src/ui/AppContainer.test.js.map +0 -1
  269. package/dist/src/ui/IdeIntegrationNudge.test.d.ts +0 -6
  270. package/dist/src/ui/IdeIntegrationNudge.test.js +0 -158
  271. package/dist/src/ui/IdeIntegrationNudge.test.js.map +0 -1
  272. package/dist/src/ui/auth/ApiAuthDialog.test.d.ts +0 -6
  273. package/dist/src/ui/auth/ApiAuthDialog.test.js +0 -109
  274. package/dist/src/ui/auth/ApiAuthDialog.test.js.map +0 -1
  275. package/dist/src/ui/auth/AuthDialog.test.d.ts +0 -6
  276. package/dist/src/ui/auth/AuthDialog.test.js +0 -309
  277. package/dist/src/ui/auth/AuthDialog.test.js.map +0 -1
  278. package/dist/src/ui/auth/AuthInProgress.test.d.ts +0 -6
  279. package/dist/src/ui/auth/AuthInProgress.test.js +0 -81
  280. package/dist/src/ui/auth/AuthInProgress.test.js.map +0 -1
  281. package/dist/src/ui/auth/LoginWithGoogleRestartDialog.test.d.ts +0 -6
  282. package/dist/src/ui/auth/LoginWithGoogleRestartDialog.test.js +0 -66
  283. package/dist/src/ui/auth/LoginWithGoogleRestartDialog.test.js.map +0 -1
  284. package/dist/src/ui/auth/useAuth.test.d.ts +0 -6
  285. package/dist/src/ui/auth/useAuth.test.js +0 -189
  286. package/dist/src/ui/auth/useAuth.test.js.map +0 -1
  287. package/dist/src/ui/commands/aboutCommand.test.d.ts +0 -6
  288. package/dist/src/ui/commands/aboutCommand.test.js +0 -143
  289. package/dist/src/ui/commands/aboutCommand.test.js.map +0 -1
  290. package/dist/src/ui/commands/agentsCommand.test.d.ts +0 -6
  291. package/dist/src/ui/commands/agentsCommand.test.js +0 -344
  292. package/dist/src/ui/commands/agentsCommand.test.js.map +0 -1
  293. package/dist/src/ui/commands/authCommand.test.d.ts +0 -6
  294. package/dist/src/ui/commands/authCommand.test.js +0 -98
  295. package/dist/src/ui/commands/authCommand.test.js.map +0 -1
  296. package/dist/src/ui/commands/bugCommand.test.d.ts +0 -6
  297. package/dist/src/ui/commands/bugCommand.test.js +0 -186
  298. package/dist/src/ui/commands/bugCommand.test.js.map +0 -1
  299. package/dist/src/ui/commands/chatCommand.test.d.ts +0 -6
  300. package/dist/src/ui/commands/chatCommand.test.js +0 -620
  301. package/dist/src/ui/commands/chatCommand.test.js.map +0 -1
  302. package/dist/src/ui/commands/clearCommand.test.d.ts +0 -6
  303. package/dist/src/ui/commands/clearCommand.test.js +0 -87
  304. package/dist/src/ui/commands/clearCommand.test.js.map +0 -1
  305. package/dist/src/ui/commands/compressCommand.test.d.ts +0 -6
  306. package/dist/src/ui/commands/compressCommand.test.js +0 -98
  307. package/dist/src/ui/commands/compressCommand.test.js.map +0 -1
  308. package/dist/src/ui/commands/copyCommand.test.d.ts +0 -6
  309. package/dist/src/ui/commands/copyCommand.test.js +0 -242
  310. package/dist/src/ui/commands/copyCommand.test.js.map +0 -1
  311. package/dist/src/ui/commands/corgiCommand.test.d.ts +0 -6
  312. package/dist/src/ui/commands/corgiCommand.test.js +0 -28
  313. package/dist/src/ui/commands/corgiCommand.test.js.map +0 -1
  314. package/dist/src/ui/commands/directoryCommand.test.d.ts +0 -6
  315. package/dist/src/ui/commands/directoryCommand.test.js +0 -353
  316. package/dist/src/ui/commands/directoryCommand.test.js.map +0 -1
  317. package/dist/src/ui/commands/docsCommand.test.d.ts +0 -6
  318. package/dist/src/ui/commands/docsCommand.test.js +0 -72
  319. package/dist/src/ui/commands/docsCommand.test.js.map +0 -1
  320. package/dist/src/ui/commands/editorCommand.test.d.ts +0 -6
  321. package/dist/src/ui/commands/editorCommand.test.js +0 -27
  322. package/dist/src/ui/commands/editorCommand.test.js.map +0 -1
  323. package/dist/src/ui/commands/extensionsCommand.test.d.ts +0 -6
  324. package/dist/src/ui/commands/extensionsCommand.test.js +0 -778
  325. package/dist/src/ui/commands/extensionsCommand.test.js.map +0 -1
  326. package/dist/src/ui/commands/helpCommand.test.d.ts +0 -6
  327. package/dist/src/ui/commands/helpCommand.test.js +0 -42
  328. package/dist/src/ui/commands/helpCommand.test.js.map +0 -1
  329. package/dist/src/ui/commands/hooksCommand.test.d.ts +0 -6
  330. package/dist/src/ui/commands/hooksCommand.test.js +0 -572
  331. package/dist/src/ui/commands/hooksCommand.test.js.map +0 -1
  332. package/dist/src/ui/commands/ideCommand.test.d.ts +0 -6
  333. package/dist/src/ui/commands/ideCommand.test.js +0 -203
  334. package/dist/src/ui/commands/ideCommand.test.js.map +0 -1
  335. package/dist/src/ui/commands/initCommand.test.d.ts +0 -6
  336. package/dist/src/ui/commands/initCommand.test.js +0 -84
  337. package/dist/src/ui/commands/initCommand.test.js.map +0 -1
  338. package/dist/src/ui/commands/mcpCommand.test.d.ts +0 -6
  339. package/dist/src/ui/commands/mcpCommand.test.js +0 -189
  340. package/dist/src/ui/commands/mcpCommand.test.js.map +0 -1
  341. package/dist/src/ui/commands/memoryCommand.test.d.ts +0 -6
  342. package/dist/src/ui/commands/memoryCommand.test.js +0 -350
  343. package/dist/src/ui/commands/memoryCommand.test.js.map +0 -1
  344. package/dist/src/ui/commands/modelCommand.test.d.ts +0 -6
  345. package/dist/src/ui/commands/modelCommand.test.js +0 -41
  346. package/dist/src/ui/commands/modelCommand.test.js.map +0 -1
  347. package/dist/src/ui/commands/permissionsCommand.test.d.ts +0 -6
  348. package/dist/src/ui/commands/permissionsCommand.test.js +0 -86
  349. package/dist/src/ui/commands/permissionsCommand.test.js.map +0 -1
  350. package/dist/src/ui/commands/policiesCommand.test.d.ts +0 -6
  351. package/dist/src/ui/commands/policiesCommand.test.js +0 -87
  352. package/dist/src/ui/commands/policiesCommand.test.js.map +0 -1
  353. package/dist/src/ui/commands/privacyCommand.test.d.ts +0 -6
  354. package/dist/src/ui/commands/privacyCommand.test.js +0 -32
  355. package/dist/src/ui/commands/privacyCommand.test.js.map +0 -1
  356. package/dist/src/ui/commands/quitCommand.test.d.ts +0 -6
  357. package/dist/src/ui/commands/quitCommand.test.js +0 -50
  358. package/dist/src/ui/commands/quitCommand.test.js.map +0 -1
  359. package/dist/src/ui/commands/restoreCommand.test.d.ts +0 -6
  360. package/dist/src/ui/commands/restoreCommand.test.js +0 -190
  361. package/dist/src/ui/commands/restoreCommand.test.js.map +0 -1
  362. package/dist/src/ui/commands/rewindCommand.test.d.ts +0 -6
  363. package/dist/src/ui/commands/rewindCommand.test.js +0 -242
  364. package/dist/src/ui/commands/rewindCommand.test.js.map +0 -1
  365. package/dist/src/ui/commands/settingsCommand.test.d.ts +0 -6
  366. package/dist/src/ui/commands/settingsCommand.test.js +0 -30
  367. package/dist/src/ui/commands/settingsCommand.test.js.map +0 -1
  368. package/dist/src/ui/commands/setupGithubCommand.test.d.ts +0 -6
  369. package/dist/src/ui/commands/setupGithubCommand.test.js +0 -238
  370. package/dist/src/ui/commands/setupGithubCommand.test.js.map +0 -1
  371. package/dist/src/ui/commands/skillsCommand.test.d.ts +0 -6
  372. package/dist/src/ui/commands/skillsCommand.test.js +0 -426
  373. package/dist/src/ui/commands/skillsCommand.test.js.map +0 -1
  374. package/dist/src/ui/commands/statsCommand.test.d.ts +0 -6
  375. package/dist/src/ui/commands/statsCommand.test.js +0 -70
  376. package/dist/src/ui/commands/statsCommand.test.js.map +0 -1
  377. package/dist/src/ui/commands/terminalSetupCommand.test.d.ts +0 -6
  378. package/dist/src/ui/commands/terminalSetupCommand.test.js +0 -66
  379. package/dist/src/ui/commands/terminalSetupCommand.test.js.map +0 -1
  380. package/dist/src/ui/commands/themeCommand.test.d.ts +0 -6
  381. package/dist/src/ui/commands/themeCommand.test.js +0 -32
  382. package/dist/src/ui/commands/themeCommand.test.js.map +0 -1
  383. package/dist/src/ui/commands/toolsCommand.test.d.ts +0 -6
  384. package/dist/src/ui/commands/toolsCommand.test.js +0 -100
  385. package/dist/src/ui/commands/toolsCommand.test.js.map +0 -1
  386. package/dist/src/ui/components/AboutBox.test.d.ts +0 -6
  387. package/dist/src/ui/components/AboutBox.test.js +0 -59
  388. package/dist/src/ui/components/AboutBox.test.js.map +0 -1
  389. package/dist/src/ui/components/AdminSettingsChangedDialog.test.d.ts +0 -6
  390. package/dist/src/ui/components/AdminSettingsChangedDialog.test.js +0 -43
  391. package/dist/src/ui/components/AdminSettingsChangedDialog.test.js.map +0 -1
  392. package/dist/src/ui/components/AgentConfigDialog.test.d.ts +0 -6
  393. package/dist/src/ui/components/AgentConfigDialog.test.js +0 -241
  394. package/dist/src/ui/components/AgentConfigDialog.test.js.map +0 -1
  395. package/dist/src/ui/components/AlternateBufferQuittingDisplay.test.d.ts +0 -6
  396. package/dist/src/ui/components/AlternateBufferQuittingDisplay.test.js +0 -190
  397. package/dist/src/ui/components/AlternateBufferQuittingDisplay.test.js.map +0 -1
  398. package/dist/src/ui/components/AnsiOutput.test.d.ts +0 -6
  399. package/dist/src/ui/components/AnsiOutput.test.js +0 -92
  400. package/dist/src/ui/components/AnsiOutput.test.js.map +0 -1
  401. package/dist/src/ui/components/AppHeader.test.d.ts +0 -6
  402. package/dist/src/ui/components/AppHeader.test.js +0 -225
  403. package/dist/src/ui/components/AppHeader.test.js.map +0 -1
  404. package/dist/src/ui/components/ApprovalModeIndicator.test.d.ts +0 -6
  405. package/dist/src/ui/components/ApprovalModeIndicator.test.js +0 -37
  406. package/dist/src/ui/components/ApprovalModeIndicator.test.js.map +0 -1
  407. package/dist/src/ui/components/AskUserDialog.test.d.ts +0 -6
  408. package/dist/src/ui/components/AskUserDialog.test.js +0 -598
  409. package/dist/src/ui/components/AskUserDialog.test.js.map +0 -1
  410. package/dist/src/ui/components/Banner.test.d.ts +0 -6
  411. package/dist/src/ui/components/Banner.test.js +0 -24
  412. package/dist/src/ui/components/Banner.test.js.map +0 -1
  413. package/dist/src/ui/components/CliSpinner.test.d.ts +0 -6
  414. package/dist/src/ui/components/CliSpinner.test.js +0 -28
  415. package/dist/src/ui/components/CliSpinner.test.js.map +0 -1
  416. package/dist/src/ui/components/Composer.test.d.ts +0 -6
  417. package/dist/src/ui/components/Composer.test.js +0 -383
  418. package/dist/src/ui/components/Composer.test.js.map +0 -1
  419. package/dist/src/ui/components/ConfigInitDisplay.test.d.ts +0 -6
  420. package/dist/src/ui/components/ConfigInitDisplay.test.js +0 -117
  421. package/dist/src/ui/components/ConfigInitDisplay.test.js.map +0 -1
  422. package/dist/src/ui/components/ConsentPrompt.test.d.ts +0 -6
  423. package/dist/src/ui/components/ConsentPrompt.test.js +0 -77
  424. package/dist/src/ui/components/ConsentPrompt.test.js.map +0 -1
  425. package/dist/src/ui/components/ConsoleSummaryDisplay.test.d.ts +0 -6
  426. package/dist/src/ui/components/ConsoleSummaryDisplay.test.js +0 -26
  427. package/dist/src/ui/components/ConsoleSummaryDisplay.test.js.map +0 -1
  428. package/dist/src/ui/components/ContextSummaryDisplay.test.d.ts +0 -6
  429. package/dist/src/ui/components/ContextSummaryDisplay.test.js +0 -102
  430. package/dist/src/ui/components/ContextSummaryDisplay.test.js.map +0 -1
  431. package/dist/src/ui/components/ContextUsageDisplay.test.d.ts +0 -6
  432. package/dist/src/ui/components/ContextUsageDisplay.test.js +0 -43
  433. package/dist/src/ui/components/ContextUsageDisplay.test.js.map +0 -1
  434. package/dist/src/ui/components/CopyModeWarning.test.d.ts +0 -6
  435. package/dist/src/ui/components/CopyModeWarning.test.js +0 -33
  436. package/dist/src/ui/components/CopyModeWarning.test.js.map +0 -1
  437. package/dist/src/ui/components/DebugProfiler.test.d.ts +0 -6
  438. package/dist/src/ui/components/DebugProfiler.test.js +0 -229
  439. package/dist/src/ui/components/DebugProfiler.test.js.map +0 -1
  440. package/dist/src/ui/components/DetailedMessagesDisplay.test.d.ts +0 -6
  441. package/dist/src/ui/components/DetailedMessagesDisplay.test.js +0 -39
  442. package/dist/src/ui/components/DetailedMessagesDisplay.test.js.map +0 -1
  443. package/dist/src/ui/components/DialogManager.test.d.ts +0 -6
  444. package/dist/src/ui/components/DialogManager.test.js +0 -177
  445. package/dist/src/ui/components/DialogManager.test.js.map +0 -1
  446. package/dist/src/ui/components/EditorSettingsDialog.test.d.ts +0 -6
  447. package/dist/src/ui/components/EditorSettingsDialog.test.js +0 -119
  448. package/dist/src/ui/components/EditorSettingsDialog.test.js.map +0 -1
  449. package/dist/src/ui/components/ExitWarning.test.d.ts +0 -6
  450. package/dist/src/ui/components/ExitWarning.test.js +0 -54
  451. package/dist/src/ui/components/ExitWarning.test.js.map +0 -1
  452. package/dist/src/ui/components/FolderTrustDialog.test.d.ts +0 -6
  453. package/dist/src/ui/components/FolderTrustDialog.test.js +0 -102
  454. package/dist/src/ui/components/FolderTrustDialog.test.js.map +0 -1
  455. package/dist/src/ui/components/Footer.test.d.ts +0 -6
  456. package/dist/src/ui/components/Footer.test.js +0 -321
  457. package/dist/src/ui/components/Footer.test.js.map +0 -1
  458. package/dist/src/ui/components/GeminiRespondingSpinner.test.d.ts +0 -6
  459. package/dist/src/ui/components/GeminiRespondingSpinner.test.js +0 -61
  460. package/dist/src/ui/components/GeminiRespondingSpinner.test.js.map +0 -1
  461. package/dist/src/ui/components/GradientRegression.test.d.ts +0 -6
  462. package/dist/src/ui/components/GradientRegression.test.js +0 -105
  463. package/dist/src/ui/components/GradientRegression.test.js.map +0 -1
  464. package/dist/src/ui/components/Header.test.d.ts +0 -6
  465. package/dist/src/ui/components/Header.test.js +0 -147
  466. package/dist/src/ui/components/Header.test.js.map +0 -1
  467. package/dist/src/ui/components/Help.test.d.ts +0 -6
  468. package/dist/src/ui/components/Help.test.js +0 -67
  469. package/dist/src/ui/components/Help.test.js.map +0 -1
  470. package/dist/src/ui/components/HistoryItemDisplay.test.d.ts +0 -6
  471. package/dist/src/ui/components/HistoryItemDisplay.test.js +0 -207
  472. package/dist/src/ui/components/HistoryItemDisplay.test.js.map +0 -1
  473. package/dist/src/ui/components/HookStatusDisplay.test.d.ts +0 -6
  474. package/dist/src/ui/components/HookStatusDisplay.test.js +0 -51
  475. package/dist/src/ui/components/HookStatusDisplay.test.js.map +0 -1
  476. package/dist/src/ui/components/IdeTrustChangeDialog.test.d.ts +0 -6
  477. package/dist/src/ui/components/IdeTrustChangeDialog.test.js +0 -58
  478. package/dist/src/ui/components/IdeTrustChangeDialog.test.js.map +0 -1
  479. package/dist/src/ui/components/InputPrompt.test.d.ts +0 -6
  480. package/dist/src/ui/components/InputPrompt.test.js +0 -2596
  481. package/dist/src/ui/components/InputPrompt.test.js.map +0 -1
  482. package/dist/src/ui/components/LoadingIndicator.test.d.ts +0 -6
  483. package/dist/src/ui/components/LoadingIndicator.test.js +0 -207
  484. package/dist/src/ui/components/LoadingIndicator.test.js.map +0 -1
  485. package/dist/src/ui/components/LogoutConfirmationDialog.test.d.ts +0 -6
  486. package/dist/src/ui/components/LogoutConfirmationDialog.test.js +0 -59
  487. package/dist/src/ui/components/LogoutConfirmationDialog.test.js.map +0 -1
  488. package/dist/src/ui/components/LoopDetectionConfirmation.test.d.ts +0 -6
  489. package/dist/src/ui/components/LoopDetectionConfirmation.test.js +0 -25
  490. package/dist/src/ui/components/LoopDetectionConfirmation.test.js.map +0 -1
  491. package/dist/src/ui/components/MainContent.test.d.ts +0 -6
  492. package/dist/src/ui/components/MainContent.test.js +0 -83
  493. package/dist/src/ui/components/MainContent.test.js.map +0 -1
  494. package/dist/src/ui/components/MemoryUsageDisplay.test.d.ts +0 -6
  495. package/dist/src/ui/components/MemoryUsageDisplay.test.js +0 -49
  496. package/dist/src/ui/components/MemoryUsageDisplay.test.js.map +0 -1
  497. package/dist/src/ui/components/ModelDialog.test.d.ts +0 -6
  498. package/dist/src/ui/components/ModelDialog.test.js +0 -197
  499. package/dist/src/ui/components/ModelDialog.test.js.map +0 -1
  500. package/dist/src/ui/components/ModelStatsDisplay.test.d.ts +0 -6
  501. package/dist/src/ui/components/ModelStatsDisplay.test.js +0 -343
  502. package/dist/src/ui/components/ModelStatsDisplay.test.js.map +0 -1
  503. package/dist/src/ui/components/MultiFolderTrustDialog.test.d.ts +0 -6
  504. package/dist/src/ui/components/MultiFolderTrustDialog.test.js +0 -162
  505. package/dist/src/ui/components/MultiFolderTrustDialog.test.js.map +0 -1
  506. package/dist/src/ui/components/NewAgentsNotification.test.d.ts +0 -6
  507. package/dist/src/ui/components/NewAgentsNotification.test.js +0 -48
  508. package/dist/src/ui/components/NewAgentsNotification.test.js.map +0 -1
  509. package/dist/src/ui/components/Notifications.test.d.ts +0 -6
  510. package/dist/src/ui/components/Notifications.test.js +0 -164
  511. package/dist/src/ui/components/Notifications.test.js.map +0 -1
  512. package/dist/src/ui/components/PermissionsModifyTrustDialog.test.d.ts +0 -6
  513. package/dist/src/ui/components/PermissionsModifyTrustDialog.test.js +0 -162
  514. package/dist/src/ui/components/PermissionsModifyTrustDialog.test.js.map +0 -1
  515. package/dist/src/ui/components/ProQuotaDialog.test.d.ts +0 -6
  516. package/dist/src/ui/components/ProQuotaDialog.test.js +0 -191
  517. package/dist/src/ui/components/ProQuotaDialog.test.js.map +0 -1
  518. package/dist/src/ui/components/QueuedMessageDisplay.test.d.ts +0 -6
  519. package/dist/src/ui/components/QueuedMessageDisplay.test.js +0 -65
  520. package/dist/src/ui/components/QueuedMessageDisplay.test.js.map +0 -1
  521. package/dist/src/ui/components/QuittingDisplay.test.d.ts +0 -6
  522. package/dist/src/ui/components/QuittingDisplay.test.js +0 -49
  523. package/dist/src/ui/components/QuittingDisplay.test.js.map +0 -1
  524. package/dist/src/ui/components/RawMarkdownIndicator.test.d.ts +0 -6
  525. package/dist/src/ui/components/RawMarkdownIndicator.test.js +0 -34
  526. package/dist/src/ui/components/RawMarkdownIndicator.test.js.map +0 -1
  527. package/dist/src/ui/components/RewindConfirmation.test.d.ts +0 -6
  528. package/dist/src/ui/components/RewindConfirmation.test.js +0 -53
  529. package/dist/src/ui/components/RewindConfirmation.test.js.map +0 -1
  530. package/dist/src/ui/components/RewindViewer.test.d.ts +0 -6
  531. package/dist/src/ui/components/RewindViewer.test.js +0 -241
  532. package/dist/src/ui/components/RewindViewer.test.js.map +0 -1
  533. package/dist/src/ui/components/SessionBrowser.test.d.ts +0 -6
  534. package/dist/src/ui/components/SessionBrowser.test.js +0 -256
  535. package/dist/src/ui/components/SessionBrowser.test.js.map +0 -1
  536. package/dist/src/ui/components/SessionSummaryDisplay.test.d.ts +0 -6
  537. package/dist/src/ui/components/SessionSummaryDisplay.test.js +0 -75
  538. package/dist/src/ui/components/SessionSummaryDisplay.test.js.map +0 -1
  539. package/dist/src/ui/components/SettingsDialog.test.d.ts +0 -6
  540. package/dist/src/ui/components/SettingsDialog.test.js +0 -1150
  541. package/dist/src/ui/components/SettingsDialog.test.js.map +0 -1
  542. package/dist/src/ui/components/ShellInputPrompt.test.d.ts +0 -6
  543. package/dist/src/ui/components/ShellInputPrompt.test.js +0 -91
  544. package/dist/src/ui/components/ShellInputPrompt.test.js.map +0 -1
  545. package/dist/src/ui/components/ShellModeIndicator.test.d.ts +0 -6
  546. package/dist/src/ui/components/ShellModeIndicator.test.js +0 -17
  547. package/dist/src/ui/components/ShellModeIndicator.test.js.map +0 -1
  548. package/dist/src/ui/components/ShowMoreLines.test.d.ts +0 -6
  549. package/dist/src/ui/components/ShowMoreLines.test.js +0 -40
  550. package/dist/src/ui/components/ShowMoreLines.test.js.map +0 -1
  551. package/dist/src/ui/components/StatsDisplay.test.d.ts +0 -6
  552. package/dist/src/ui/components/StatsDisplay.test.js +0 -438
  553. package/dist/src/ui/components/StatsDisplay.test.js.map +0 -1
  554. package/dist/src/ui/components/StatusDisplay.test.d.ts +0 -6
  555. package/dist/src/ui/components/StatusDisplay.test.js +0 -155
  556. package/dist/src/ui/components/StatusDisplay.test.js.map +0 -1
  557. package/dist/src/ui/components/StickyHeader.test.d.ts +0 -6
  558. package/dist/src/ui/components/StickyHeader.test.js +0 -17
  559. package/dist/src/ui/components/StickyHeader.test.js.map +0 -1
  560. package/dist/src/ui/components/SuggestionsDisplay.test.d.ts +0 -6
  561. package/dist/src/ui/components/SuggestionsDisplay.test.js +0 -56
  562. package/dist/src/ui/components/SuggestionsDisplay.test.js.map +0 -1
  563. package/dist/src/ui/components/Table.test.d.ts +0 -6
  564. package/dist/src/ui/components/Table.test.js +0 -53
  565. package/dist/src/ui/components/Table.test.js.map +0 -1
  566. package/dist/src/ui/components/ThemeDialog.test.d.ts +0 -6
  567. package/dist/src/ui/components/ThemeDialog.test.js +0 -167
  568. package/dist/src/ui/components/ThemeDialog.test.js.map +0 -1
  569. package/dist/src/ui/components/ThemedGradient.test.d.ts +0 -6
  570. package/dist/src/ui/components/ThemedGradient.test.js +0 -30
  571. package/dist/src/ui/components/ThemedGradient.test.js.map +0 -1
  572. package/dist/src/ui/components/Tips.test.d.ts +0 -6
  573. package/dist/src/ui/components/Tips.test.js +0 -23
  574. package/dist/src/ui/components/Tips.test.js.map +0 -1
  575. package/dist/src/ui/components/ToolConfirmationQueue.test.d.ts +0 -6
  576. package/dist/src/ui/components/ToolConfirmationQueue.test.js +0 -71
  577. package/dist/src/ui/components/ToolConfirmationQueue.test.js.map +0 -1
  578. package/dist/src/ui/components/ToolStatsDisplay.test.d.ts +0 -6
  579. package/dist/src/ui/components/ToolStatsDisplay.test.js +0 -227
  580. package/dist/src/ui/components/ToolStatsDisplay.test.js.map +0 -1
  581. package/dist/src/ui/components/UpdateNotification.test.d.ts +0 -6
  582. package/dist/src/ui/components/UpdateNotification.test.js +0 -16
  583. package/dist/src/ui/components/UpdateNotification.test.js.map +0 -1
  584. package/dist/src/ui/components/ValidationDialog.test.d.ts +0 -6
  585. package/dist/src/ui/components/ValidationDialog.test.js +0 -153
  586. package/dist/src/ui/components/ValidationDialog.test.js.map +0 -1
  587. package/dist/src/ui/components/messages/CompressionMessage.test.d.ts +0 -6
  588. package/dist/src/ui/components/messages/CompressionMessage.test.js +0 -191
  589. package/dist/src/ui/components/messages/CompressionMessage.test.js.map +0 -1
  590. package/dist/src/ui/components/messages/DiffRenderer.test.d.ts +0 -6
  591. package/dist/src/ui/components/messages/DiffRenderer.test.js +0 -240
  592. package/dist/src/ui/components/messages/DiffRenderer.test.js.map +0 -1
  593. package/dist/src/ui/components/messages/ErrorMessage.test.d.ts +0 -6
  594. package/dist/src/ui/components/messages/ErrorMessage.test.js +0 -23
  595. package/dist/src/ui/components/messages/ErrorMessage.test.js.map +0 -1
  596. package/dist/src/ui/components/messages/GeminiMessage.test.d.ts +0 -6
  597. package/dist/src/ui/components/messages/GeminiMessage.test.js +0 -35
  598. package/dist/src/ui/components/messages/GeminiMessage.test.js.map +0 -1
  599. package/dist/src/ui/components/messages/InfoMessage.test.d.ts +0 -6
  600. package/dist/src/ui/components/messages/InfoMessage.test.js +0 -28
  601. package/dist/src/ui/components/messages/InfoMessage.test.js.map +0 -1
  602. package/dist/src/ui/components/messages/RedirectionConfirmation.test.d.ts +0 -6
  603. package/dist/src/ui/components/messages/RedirectionConfirmation.test.js +0 -33
  604. package/dist/src/ui/components/messages/RedirectionConfirmation.test.js.map +0 -1
  605. package/dist/src/ui/components/messages/ShellToolMessage.test.d.ts +0 -6
  606. package/dist/src/ui/components/messages/ShellToolMessage.test.js +0 -123
  607. package/dist/src/ui/components/messages/ShellToolMessage.test.js.map +0 -1
  608. package/dist/src/ui/components/messages/Todo.test.d.ts +0 -6
  609. package/dist/src/ui/components/messages/Todo.test.js +0 -114
  610. package/dist/src/ui/components/messages/Todo.test.js.map +0 -1
  611. package/dist/src/ui/components/messages/ToolConfirmationMessage.test.d.ts +0 -6
  612. package/dist/src/ui/components/messages/ToolConfirmationMessage.test.js +0 -232
  613. package/dist/src/ui/components/messages/ToolConfirmationMessage.test.js.map +0 -1
  614. package/dist/src/ui/components/messages/ToolGroupMessage.test.d.ts +0 -6
  615. package/dist/src/ui/components/messages/ToolGroupMessage.test.js +0 -529
  616. package/dist/src/ui/components/messages/ToolGroupMessage.test.js.map +0 -1
  617. package/dist/src/ui/components/messages/ToolMessage.test.d.ts +0 -6
  618. package/dist/src/ui/components/messages/ToolMessage.test.js +0 -217
  619. package/dist/src/ui/components/messages/ToolMessage.test.js.map +0 -1
  620. package/dist/src/ui/components/messages/ToolMessageFocusHint.test.d.ts +0 -6
  621. package/dist/src/ui/components/messages/ToolMessageFocusHint.test.js +0 -89
  622. package/dist/src/ui/components/messages/ToolMessageFocusHint.test.js.map +0 -1
  623. package/dist/src/ui/components/messages/ToolMessageRawMarkdown.test.d.ts +0 -6
  624. package/dist/src/ui/components/messages/ToolMessageRawMarkdown.test.js +0 -62
  625. package/dist/src/ui/components/messages/ToolMessageRawMarkdown.test.js.map +0 -1
  626. package/dist/src/ui/components/messages/ToolResultDisplay.test.d.ts +0 -6
  627. package/dist/src/ui/components/messages/ToolResultDisplay.test.js +0 -114
  628. package/dist/src/ui/components/messages/ToolResultDisplay.test.js.map +0 -1
  629. package/dist/src/ui/components/messages/ToolStickyHeaderRegression.test.d.ts +0 -6
  630. package/dist/src/ui/components/messages/ToolStickyHeaderRegression.test.js +0 -134
  631. package/dist/src/ui/components/messages/ToolStickyHeaderRegression.test.js.map +0 -1
  632. package/dist/src/ui/components/messages/UserMessage.test.d.ts +0 -6
  633. package/dist/src/ui/components/messages/UserMessage.test.js +0 -32
  634. package/dist/src/ui/components/messages/UserMessage.test.js.map +0 -1
  635. package/dist/src/ui/components/messages/WarningMessage.test.d.ts +0 -6
  636. package/dist/src/ui/components/messages/WarningMessage.test.js +0 -23
  637. package/dist/src/ui/components/messages/WarningMessage.test.js.map +0 -1
  638. package/dist/src/ui/components/shared/BaseSelectionList.test.d.ts +0 -6
  639. package/dist/src/ui/components/shared/BaseSelectionList.test.js +0 -386
  640. package/dist/src/ui/components/shared/BaseSelectionList.test.js.map +0 -1
  641. package/dist/src/ui/components/shared/BaseSettingsDialog.test.d.ts +0 -6
  642. package/dist/src/ui/components/shared/BaseSettingsDialog.test.js +0 -434
  643. package/dist/src/ui/components/shared/BaseSettingsDialog.test.js.map +0 -1
  644. package/dist/src/ui/components/shared/DescriptiveRadioButtonSelect.test.d.ts +0 -6
  645. package/dist/src/ui/components/shared/DescriptiveRadioButtonSelect.test.js +0 -79
  646. package/dist/src/ui/components/shared/DescriptiveRadioButtonSelect.test.js.map +0 -1
  647. package/dist/src/ui/components/shared/EnumSelector.test.d.ts +0 -6
  648. package/dist/src/ui/components/shared/EnumSelector.test.js +0 -70
  649. package/dist/src/ui/components/shared/EnumSelector.test.js.map +0 -1
  650. package/dist/src/ui/components/shared/ExpandableText.test.d.ts +0 -6
  651. package/dist/src/ui/components/shared/ExpandableText.test.js +0 -88
  652. package/dist/src/ui/components/shared/ExpandableText.test.js.map +0 -1
  653. package/dist/src/ui/components/shared/HalfLinePaddedBox.test.d.ts +0 -6
  654. package/dist/src/ui/components/shared/HalfLinePaddedBox.test.js +0 -34
  655. package/dist/src/ui/components/shared/HalfLinePaddedBox.test.js.map +0 -1
  656. package/dist/src/ui/components/shared/MaxSizedBox.test.d.ts +0 -6
  657. package/dist/src/ui/components/shared/MaxSizedBox.test.js +0 -90
  658. package/dist/src/ui/components/shared/MaxSizedBox.test.js.map +0 -1
  659. package/dist/src/ui/components/shared/RadioButtonSelect.test.d.ts +0 -6
  660. package/dist/src/ui/components/shared/RadioButtonSelect.test.js +0 -134
  661. package/dist/src/ui/components/shared/RadioButtonSelect.test.js.map +0 -1
  662. package/dist/src/ui/components/shared/Scrollable.test.d.ts +0 -6
  663. package/dist/src/ui/components/shared/Scrollable.test.js +0 -74
  664. package/dist/src/ui/components/shared/Scrollable.test.js.map +0 -1
  665. package/dist/src/ui/components/shared/ScrollableList.test.d.ts +0 -6
  666. package/dist/src/ui/components/shared/ScrollableList.test.js +0 -241
  667. package/dist/src/ui/components/shared/ScrollableList.test.js.map +0 -1
  668. package/dist/src/ui/components/shared/TabHeader.test.d.ts +0 -6
  669. package/dist/src/ui/components/shared/TabHeader.test.js +0 -106
  670. package/dist/src/ui/components/shared/TabHeader.test.js.map +0 -1
  671. package/dist/src/ui/components/shared/TextInput.test.d.ts +0 -6
  672. package/dist/src/ui/components/shared/TextInput.test.js +0 -242
  673. package/dist/src/ui/components/shared/TextInput.test.js.map +0 -1
  674. package/dist/src/ui/components/shared/VirtualizedList.test.d.ts +0 -6
  675. package/dist/src/ui/components/shared/VirtualizedList.test.js +0 -171
  676. package/dist/src/ui/components/shared/VirtualizedList.test.js.map +0 -1
  677. package/dist/src/ui/components/shared/performance.test.d.ts +0 -1
  678. package/dist/src/ui/components/shared/performance.test.js +0 -67
  679. package/dist/src/ui/components/shared/performance.test.js.map +0 -1
  680. package/dist/src/ui/components/shared/text-buffer.test.d.ts +0 -6
  681. package/dist/src/ui/components/shared/text-buffer.test.js +0 -2490
  682. package/dist/src/ui/components/shared/text-buffer.test.js.map +0 -1
  683. package/dist/src/ui/components/shared/vim-buffer-actions.test.d.ts +0 -6
  684. package/dist/src/ui/components/shared/vim-buffer-actions.test.js +0 -964
  685. package/dist/src/ui/components/shared/vim-buffer-actions.test.js.map +0 -1
  686. package/dist/src/ui/components/views/ChatList.test.d.ts +0 -6
  687. package/dist/src/ui/components/views/ChatList.test.js +0 -45
  688. package/dist/src/ui/components/views/ChatList.test.js.map +0 -1
  689. package/dist/src/ui/components/views/ExtensionsList.test.d.ts +0 -6
  690. package/dist/src/ui/components/views/ExtensionsList.test.js +0 -148
  691. package/dist/src/ui/components/views/ExtensionsList.test.js.map +0 -1
  692. package/dist/src/ui/components/views/McpStatus.test.d.ts +0 -6
  693. package/dist/src/ui/components/views/McpStatus.test.js +0 -153
  694. package/dist/src/ui/components/views/McpStatus.test.js.map +0 -1
  695. package/dist/src/ui/components/views/SkillsList.test.d.ts +0 -6
  696. package/dist/src/ui/components/views/SkillsList.test.js +0 -97
  697. package/dist/src/ui/components/views/SkillsList.test.js.map +0 -1
  698. package/dist/src/ui/components/views/ToolsList.test.d.ts +0 -6
  699. package/dist/src/ui/components/views/ToolsList.test.js +0 -45
  700. package/dist/src/ui/components/views/ToolsList.test.js.map +0 -1
  701. package/dist/src/ui/contexts/KeypressContext.test.d.ts +0 -6
  702. package/dist/src/ui/contexts/KeypressContext.test.js +0 -957
  703. package/dist/src/ui/contexts/KeypressContext.test.js.map +0 -1
  704. package/dist/src/ui/contexts/MouseContext.test.d.ts +0 -6
  705. package/dist/src/ui/contexts/MouseContext.test.js +0 -198
  706. package/dist/src/ui/contexts/MouseContext.test.js.map +0 -1
  707. package/dist/src/ui/contexts/ScrollProvider.drag.test.d.ts +0 -6
  708. package/dist/src/ui/contexts/ScrollProvider.drag.test.js +0 -319
  709. package/dist/src/ui/contexts/ScrollProvider.drag.test.js.map +0 -1
  710. package/dist/src/ui/contexts/ScrollProvider.test.d.ts +0 -6
  711. package/dist/src/ui/contexts/ScrollProvider.test.js +0 -377
  712. package/dist/src/ui/contexts/ScrollProvider.test.js.map +0 -1
  713. package/dist/src/ui/contexts/SessionContext.test.d.ts +0 -6
  714. package/dist/src/ui/contexts/SessionContext.test.js +0 -198
  715. package/dist/src/ui/contexts/SessionContext.test.js.map +0 -1
  716. package/dist/src/ui/contexts/ToolActionsContext.test.d.ts +0 -6
  717. package/dist/src/ui/contexts/ToolActionsContext.test.js +0 -166
  718. package/dist/src/ui/contexts/ToolActionsContext.test.js.map +0 -1
  719. package/dist/src/ui/hooks/atCommandProcessor.test.d.ts +0 -6
  720. package/dist/src/ui/hooks/atCommandProcessor.test.js +0 -1032
  721. package/dist/src/ui/hooks/atCommandProcessor.test.js.map +0 -1
  722. package/dist/src/ui/hooks/atCommandProcessor_agents.test.d.ts +0 -6
  723. package/dist/src/ui/hooks/atCommandProcessor_agents.test.js +0 -183
  724. package/dist/src/ui/hooks/atCommandProcessor_agents.test.js.map +0 -1
  725. package/dist/src/ui/hooks/shellCommandProcessor.test.d.ts +0 -6
  726. package/dist/src/ui/hooks/shellCommandProcessor.test.js +0 -521
  727. package/dist/src/ui/hooks/shellCommandProcessor.test.js.map +0 -1
  728. package/dist/src/ui/hooks/slashCommandProcessor.test.d.ts +0 -6
  729. package/dist/src/ui/hooks/slashCommandProcessor.test.js +0 -796
  730. package/dist/src/ui/hooks/slashCommandProcessor.test.js.map +0 -1
  731. package/dist/src/ui/hooks/toolMapping.test.d.ts +0 -6
  732. package/dist/src/ui/hooks/toolMapping.test.js +0 -209
  733. package/dist/src/ui/hooks/toolMapping.test.js.map +0 -1
  734. package/dist/src/ui/hooks/useAnimatedScrollbar.test.d.ts +0 -6
  735. package/dist/src/ui/hooks/useAnimatedScrollbar.test.js +0 -85
  736. package/dist/src/ui/hooks/useAnimatedScrollbar.test.js.map +0 -1
  737. package/dist/src/ui/hooks/useApprovalModeIndicator.test.d.ts +0 -6
  738. package/dist/src/ui/hooks/useApprovalModeIndicator.test.js +0 -435
  739. package/dist/src/ui/hooks/useApprovalModeIndicator.test.js.map +0 -1
  740. package/dist/src/ui/hooks/useAtCompletion.test.d.ts +0 -6
  741. package/dist/src/ui/hooks/useAtCompletion.test.js +0 -417
  742. package/dist/src/ui/hooks/useAtCompletion.test.js.map +0 -1
  743. package/dist/src/ui/hooks/useAtCompletion_agents.test.d.ts +0 -6
  744. package/dist/src/ui/hooks/useAtCompletion_agents.test.js +0 -87
  745. package/dist/src/ui/hooks/useAtCompletion_agents.test.js.map +0 -1
  746. package/dist/src/ui/hooks/useBanner.test.d.ts +0 -6
  747. package/dist/src/ui/hooks/useBanner.test.js +0 -92
  748. package/dist/src/ui/hooks/useBanner.test.js.map +0 -1
  749. package/dist/src/ui/hooks/useBatchedScroll.test.d.ts +0 -6
  750. package/dist/src/ui/hooks/useBatchedScroll.test.js +0 -62
  751. package/dist/src/ui/hooks/useBatchedScroll.test.js.map +0 -1
  752. package/dist/src/ui/hooks/useCommandCompletion.test.d.ts +0 -6
  753. package/dist/src/ui/hooks/useCommandCompletion.test.js +0 -462
  754. package/dist/src/ui/hooks/useCommandCompletion.test.js.map +0 -1
  755. package/dist/src/ui/hooks/useConsoleMessages.test.d.ts +0 -6
  756. package/dist/src/ui/hooks/useConsoleMessages.test.js +0 -159
  757. package/dist/src/ui/hooks/useConsoleMessages.test.js.map +0 -1
  758. package/dist/src/ui/hooks/useEditorSettings.test.d.ts +0 -6
  759. package/dist/src/ui/hooks/useEditorSettings.test.js +0 -179
  760. package/dist/src/ui/hooks/useEditorSettings.test.js.map +0 -1
  761. package/dist/src/ui/hooks/useExtensionUpdates.test.d.ts +0 -6
  762. package/dist/src/ui/hooks/useExtensionUpdates.test.js +0 -279
  763. package/dist/src/ui/hooks/useExtensionUpdates.test.js.map +0 -1
  764. package/dist/src/ui/hooks/useFlickerDetector.test.d.ts +0 -6
  765. package/dist/src/ui/hooks/useFlickerDetector.test.js +0 -106
  766. package/dist/src/ui/hooks/useFlickerDetector.test.js.map +0 -1
  767. package/dist/src/ui/hooks/useFocus.test.d.ts +0 -6
  768. package/dist/src/ui/hooks/useFocus.test.js +0 -131
  769. package/dist/src/ui/hooks/useFocus.test.js.map +0 -1
  770. package/dist/src/ui/hooks/useFolderTrust.test.d.ts +0 -6
  771. package/dist/src/ui/hooks/useFolderTrust.test.js +0 -218
  772. package/dist/src/ui/hooks/useFolderTrust.test.js.map +0 -1
  773. package/dist/src/ui/hooks/useGeminiStream.test.d.ts +0 -6
  774. package/dist/src/ui/hooks/useGeminiStream.test.js +0 -2149
  775. package/dist/src/ui/hooks/useGeminiStream.test.js.map +0 -1
  776. package/dist/src/ui/hooks/useGitBranchName.test.d.ts +0 -6
  777. package/dist/src/ui/hooks/useGitBranchName.test.js +0 -183
  778. package/dist/src/ui/hooks/useGitBranchName.test.js.map +0 -1
  779. package/dist/src/ui/hooks/useHistoryManager.test.d.ts +0 -6
  780. package/dist/src/ui/hooks/useHistoryManager.test.js +0 -188
  781. package/dist/src/ui/hooks/useHistoryManager.test.js.map +0 -1
  782. package/dist/src/ui/hooks/useHookDisplayState.test.d.ts +0 -6
  783. package/dist/src/ui/hooks/useHookDisplayState.test.js +0 -180
  784. package/dist/src/ui/hooks/useHookDisplayState.test.js.map +0 -1
  785. package/dist/src/ui/hooks/useIdeTrustListener.test.d.ts +0 -6
  786. package/dist/src/ui/hooks/useIdeTrustListener.test.js +0 -214
  787. package/dist/src/ui/hooks/useIdeTrustListener.test.js.map +0 -1
  788. package/dist/src/ui/hooks/useIncludeDirsTrust.test.d.ts +0 -6
  789. package/dist/src/ui/hooks/useIncludeDirsTrust.test.js +0 -172
  790. package/dist/src/ui/hooks/useIncludeDirsTrust.test.js.map +0 -1
  791. package/dist/src/ui/hooks/useInputHistory.test.d.ts +0 -6
  792. package/dist/src/ui/hooks/useInputHistory.test.js +0 -208
  793. package/dist/src/ui/hooks/useInputHistory.test.js.map +0 -1
  794. package/dist/src/ui/hooks/useInputHistoryStore.test.d.ts +0 -6
  795. package/dist/src/ui/hooks/useInputHistoryStore.test.js +0 -238
  796. package/dist/src/ui/hooks/useInputHistoryStore.test.js.map +0 -1
  797. package/dist/src/ui/hooks/useKeypress.test.d.ts +0 -6
  798. package/dist/src/ui/hooks/useKeypress.test.js +0 -205
  799. package/dist/src/ui/hooks/useKeypress.test.js.map +0 -1
  800. package/dist/src/ui/hooks/useLoadingIndicator.test.d.ts +0 -6
  801. package/dist/src/ui/hooks/useLoadingIndicator.test.js +0 -145
  802. package/dist/src/ui/hooks/useLoadingIndicator.test.js.map +0 -1
  803. package/dist/src/ui/hooks/useMcpStatus.test.d.ts +0 -6
  804. package/dist/src/ui/hooks/useMcpStatus.test.js +0 -69
  805. package/dist/src/ui/hooks/useMcpStatus.test.js.map +0 -1
  806. package/dist/src/ui/hooks/useMemoryMonitor.test.d.ts +0 -6
  807. package/dist/src/ui/hooks/useMemoryMonitor.test.js +0 -62
  808. package/dist/src/ui/hooks/useMemoryMonitor.test.js.map +0 -1
  809. package/dist/src/ui/hooks/useMessageQueue.test.d.ts +0 -6
  810. package/dist/src/ui/hooks/useMessageQueue.test.js +0 -327
  811. package/dist/src/ui/hooks/useMessageQueue.test.js.map +0 -1
  812. package/dist/src/ui/hooks/useModelCommand.test.d.ts +0 -6
  813. package/dist/src/ui/hooks/useModelCommand.test.js +0 -45
  814. package/dist/src/ui/hooks/useModelCommand.test.js.map +0 -1
  815. package/dist/src/ui/hooks/useMouse.test.d.ts +0 -6
  816. package/dist/src/ui/hooks/useMouse.test.js +0 -57
  817. package/dist/src/ui/hooks/useMouse.test.js.map +0 -1
  818. package/dist/src/ui/hooks/useMouseClick.test.d.ts +0 -6
  819. package/dist/src/ui/hooks/useMouseClick.test.js +0 -59
  820. package/dist/src/ui/hooks/useMouseClick.test.js.map +0 -1
  821. package/dist/src/ui/hooks/useMouseDoubleClick.test.d.ts +0 -6
  822. package/dist/src/ui/hooks/useMouseDoubleClick.test.js +0 -125
  823. package/dist/src/ui/hooks/useMouseDoubleClick.test.js.map +0 -1
  824. package/dist/src/ui/hooks/usePermissionsModifyTrust.test.d.ts +0 -6
  825. package/dist/src/ui/hooks/usePermissionsModifyTrust.test.js +0 -291
  826. package/dist/src/ui/hooks/usePermissionsModifyTrust.test.js.map +0 -1
  827. package/dist/src/ui/hooks/usePhraseCycler.test.d.ts +0 -6
  828. package/dist/src/ui/hooks/usePhraseCycler.test.js +0 -208
  829. package/dist/src/ui/hooks/usePhraseCycler.test.js.map +0 -1
  830. package/dist/src/ui/hooks/usePrivacySettings.test.d.ts +0 -6
  831. package/dist/src/ui/hooks/usePrivacySettings.test.js +0 -104
  832. package/dist/src/ui/hooks/usePrivacySettings.test.js.map +0 -1
  833. package/dist/src/ui/hooks/useQuotaAndFallback.test.d.ts +0 -6
  834. package/dist/src/ui/hooks/useQuotaAndFallback.test.js +0 -477
  835. package/dist/src/ui/hooks/useQuotaAndFallback.test.js.map +0 -1
  836. package/dist/src/ui/hooks/useReactToolScheduler.test.d.ts +0 -6
  837. package/dist/src/ui/hooks/useReactToolScheduler.test.js +0 -58
  838. package/dist/src/ui/hooks/useReactToolScheduler.test.js.map +0 -1
  839. package/dist/src/ui/hooks/useReverseSearchCompletion.test.d.ts +0 -6
  840. package/dist/src/ui/hooks/useReverseSearchCompletion.test.js +0 -169
  841. package/dist/src/ui/hooks/useReverseSearchCompletion.test.js.map +0 -1
  842. package/dist/src/ui/hooks/useRewind.test.d.ts +0 -6
  843. package/dist/src/ui/hooks/useRewind.test.js +0 -100
  844. package/dist/src/ui/hooks/useRewind.test.js.map +0 -1
  845. package/dist/src/ui/hooks/useSelectionList.test.d.ts +0 -6
  846. package/dist/src/ui/hooks/useSelectionList.test.js +0 -848
  847. package/dist/src/ui/hooks/useSelectionList.test.js.map +0 -1
  848. package/dist/src/ui/hooks/useSessionBrowser.test.d.ts +0 -6
  849. package/dist/src/ui/hooks/useSessionBrowser.test.js +0 -203
  850. package/dist/src/ui/hooks/useSessionBrowser.test.js.map +0 -1
  851. package/dist/src/ui/hooks/useSessionResume.test.d.ts +0 -6
  852. package/dist/src/ui/hooks/useSessionResume.test.js +0 -336
  853. package/dist/src/ui/hooks/useSessionResume.test.js.map +0 -1
  854. package/dist/src/ui/hooks/useShellHistory.test.d.ts +0 -6
  855. package/dist/src/ui/hooks/useShellHistory.test.js +0 -223
  856. package/dist/src/ui/hooks/useShellHistory.test.js.map +0 -1
  857. package/dist/src/ui/hooks/useShellInactivityStatus.test.d.ts +0 -6
  858. package/dist/src/ui/hooks/useShellInactivityStatus.test.js +0 -84
  859. package/dist/src/ui/hooks/useShellInactivityStatus.test.js.map +0 -1
  860. package/dist/src/ui/hooks/useSlashCompletion.test.d.ts +0 -9
  861. package/dist/src/ui/hooks/useSlashCompletion.test.js +0 -845
  862. package/dist/src/ui/hooks/useSlashCompletion.test.js.map +0 -1
  863. package/dist/src/ui/hooks/useSnowfall.test.d.ts +0 -6
  864. package/dist/src/ui/hooks/useSnowfall.test.js +0 -88
  865. package/dist/src/ui/hooks/useSnowfall.test.js.map +0 -1
  866. package/dist/src/ui/hooks/useTabbedNavigation.test.d.ts +0 -6
  867. package/dist/src/ui/hooks/useTabbedNavigation.test.js +0 -187
  868. package/dist/src/ui/hooks/useTabbedNavigation.test.js.map +0 -1
  869. package/dist/src/ui/hooks/useTimer.test.d.ts +0 -6
  870. package/dist/src/ui/hooks/useTimer.test.js +0 -119
  871. package/dist/src/ui/hooks/useTimer.test.js.map +0 -1
  872. package/dist/src/ui/hooks/useTips.test.d.ts +0 -6
  873. package/dist/src/ui/hooks/useTips.test.js +0 -33
  874. package/dist/src/ui/hooks/useTips.test.js.map +0 -1
  875. package/dist/src/ui/hooks/useToolExecutionScheduler.test.d.ts +0 -6
  876. package/dist/src/ui/hooks/useToolExecutionScheduler.test.js +0 -376
  877. package/dist/src/ui/hooks/useToolExecutionScheduler.test.js.map +0 -1
  878. package/dist/src/ui/hooks/useToolScheduler.test.d.ts +0 -6
  879. package/dist/src/ui/hooks/useToolScheduler.test.js +0 -881
  880. package/dist/src/ui/hooks/useToolScheduler.test.js.map +0 -1
  881. package/dist/src/ui/hooks/useToolSchedulerFacade.test.d.ts +0 -6
  882. package/dist/src/ui/hooks/useToolSchedulerFacade.test.js +0 -45
  883. package/dist/src/ui/hooks/useToolSchedulerFacade.test.js.map +0 -1
  884. package/dist/src/ui/hooks/useTurnActivityMonitor.test.d.ts +0 -6
  885. package/dist/src/ui/hooks/useTurnActivityMonitor.test.js +0 -97
  886. package/dist/src/ui/hooks/useTurnActivityMonitor.test.js.map +0 -1
  887. package/dist/src/ui/hooks/vim.test.d.ts +0 -6
  888. package/dist/src/ui/hooks/vim.test.js +0 -1384
  889. package/dist/src/ui/hooks/vim.test.js.map +0 -1
  890. package/dist/src/ui/keyMatchers.test.d.ts +0 -6
  891. package/dist/src/ui/keyMatchers.test.js +0 -386
  892. package/dist/src/ui/keyMatchers.test.js.map +0 -1
  893. package/dist/src/ui/privacy/CloudFreePrivacyNotice.test.d.ts +0 -6
  894. package/dist/src/ui/privacy/CloudFreePrivacyNotice.test.js +0 -121
  895. package/dist/src/ui/privacy/CloudFreePrivacyNotice.test.js.map +0 -1
  896. package/dist/src/ui/privacy/CloudPaidPrivacyNotice.test.d.ts +0 -6
  897. package/dist/src/ui/privacy/CloudPaidPrivacyNotice.test.js +0 -34
  898. package/dist/src/ui/privacy/CloudPaidPrivacyNotice.test.js.map +0 -1
  899. package/dist/src/ui/privacy/GeminiPrivacyNotice.test.d.ts +0 -6
  900. package/dist/src/ui/privacy/GeminiPrivacyNotice.test.js +0 -34
  901. package/dist/src/ui/privacy/GeminiPrivacyNotice.test.js.map +0 -1
  902. package/dist/src/ui/privacy/PrivacyNotice.test.d.ts +0 -6
  903. package/dist/src/ui/privacy/PrivacyNotice.test.js +0 -62
  904. package/dist/src/ui/privacy/PrivacyNotice.test.js.map +0 -1
  905. package/dist/src/ui/state/extensions.test.d.ts +0 -6
  906. package/dist/src/ui/state/extensions.test.js +0 -219
  907. package/dist/src/ui/state/extensions.test.js.map +0 -1
  908. package/dist/src/ui/themes/color-utils.test.d.ts +0 -6
  909. package/dist/src/ui/themes/color-utils.test.js +0 -245
  910. package/dist/src/ui/themes/color-utils.test.js.map +0 -1
  911. package/dist/src/ui/themes/theme-manager.test.d.ts +0 -6
  912. package/dist/src/ui/themes/theme-manager.test.js +0 -150
  913. package/dist/src/ui/themes/theme-manager.test.js.map +0 -1
  914. package/dist/src/ui/themes/theme.test.d.ts +0 -6
  915. package/dist/src/ui/themes/theme.test.js +0 -174
  916. package/dist/src/ui/themes/theme.test.js.map +0 -1
  917. package/dist/src/ui/utils/CodeColorizer.test.d.ts +0 -6
  918. package/dist/src/ui/utils/CodeColorizer.test.js +0 -38
  919. package/dist/src/ui/utils/CodeColorizer.test.js.map +0 -1
  920. package/dist/src/ui/utils/InlineMarkdownRenderer.test.d.ts +0 -6
  921. package/dist/src/ui/utils/InlineMarkdownRenderer.test.js +0 -21
  922. package/dist/src/ui/utils/InlineMarkdownRenderer.test.js.map +0 -1
  923. package/dist/src/ui/utils/MarkdownDisplay.test.d.ts +0 -6
  924. package/dist/src/ui/utils/MarkdownDisplay.test.js +0 -159
  925. package/dist/src/ui/utils/MarkdownDisplay.test.js.map +0 -1
  926. package/dist/src/ui/utils/clipboardUtils.test.d.ts +0 -6
  927. package/dist/src/ui/utils/clipboardUtils.test.js +0 -359
  928. package/dist/src/ui/utils/clipboardUtils.test.js.map +0 -1
  929. package/dist/src/ui/utils/clipboardUtils.windows.test.d.ts +0 -6
  930. package/dist/src/ui/utils/clipboardUtils.windows.test.js +0 -55
  931. package/dist/src/ui/utils/clipboardUtils.windows.test.js.map +0 -1
  932. package/dist/src/ui/utils/commandUtils.test.d.ts +0 -6
  933. package/dist/src/ui/utils/commandUtils.test.js +0 -479
  934. package/dist/src/ui/utils/commandUtils.test.js.map +0 -1
  935. package/dist/src/ui/utils/computeStats.test.d.ts +0 -6
  936. package/dist/src/ui/utils/computeStats.test.js +0 -271
  937. package/dist/src/ui/utils/computeStats.test.js.map +0 -1
  938. package/dist/src/ui/utils/directoryUtils.test.d.ts +0 -6
  939. package/dist/src/ui/utils/directoryUtils.test.js +0 -244
  940. package/dist/src/ui/utils/directoryUtils.test.js.map +0 -1
  941. package/dist/src/ui/utils/displayUtils.test.d.ts +0 -6
  942. package/dist/src/ui/utils/displayUtils.test.js +0 -61
  943. package/dist/src/ui/utils/displayUtils.test.js.map +0 -1
  944. package/dist/src/ui/utils/formatters.test.d.ts +0 -6
  945. package/dist/src/ui/utils/formatters.test.js +0 -124
  946. package/dist/src/ui/utils/formatters.test.js.map +0 -1
  947. package/dist/src/ui/utils/highlight.test.d.ts +0 -6
  948. package/dist/src/ui/utils/highlight.test.js +0 -198
  949. package/dist/src/ui/utils/highlight.test.js.map +0 -1
  950. package/dist/src/ui/utils/input.test.d.ts +0 -6
  951. package/dist/src/ui/utils/input.test.js +0 -44
  952. package/dist/src/ui/utils/input.test.js.map +0 -1
  953. package/dist/src/ui/utils/markdownUtilities.test.d.ts +0 -6
  954. package/dist/src/ui/utils/markdownUtilities.test.js +0 -42
  955. package/dist/src/ui/utils/markdownUtilities.test.js.map +0 -1
  956. package/dist/src/ui/utils/mouse.test.d.ts +0 -6
  957. package/dist/src/ui/utils/mouse.test.js +0 -136
  958. package/dist/src/ui/utils/mouse.test.js.map +0 -1
  959. package/dist/src/ui/utils/rewindFileOps.test.d.ts +0 -6
  960. package/dist/src/ui/utils/rewindFileOps.test.js +0 -375
  961. package/dist/src/ui/utils/rewindFileOps.test.js.map +0 -1
  962. package/dist/src/ui/utils/terminalCapabilityManager.test.d.ts +0 -6
  963. package/dist/src/ui/utils/terminalCapabilityManager.test.js +0 -220
  964. package/dist/src/ui/utils/terminalCapabilityManager.test.js.map +0 -1
  965. package/dist/src/ui/utils/terminalSetup.test.d.ts +0 -6
  966. package/dist/src/ui/utils/terminalSetup.test.js +0 -147
  967. package/dist/src/ui/utils/terminalSetup.test.js.map +0 -1
  968. package/dist/src/ui/utils/terminalUtils.test.d.ts +0 -6
  969. package/dist/src/ui/utils/terminalUtils.test.js +0 -40
  970. package/dist/src/ui/utils/terminalUtils.test.js.map +0 -1
  971. package/dist/src/ui/utils/textOutput.test.d.ts +0 -6
  972. package/dist/src/ui/utils/textOutput.test.js +0 -79
  973. package/dist/src/ui/utils/textOutput.test.js.map +0 -1
  974. package/dist/src/ui/utils/textUtils.test.d.ts +0 -6
  975. package/dist/src/ui/utils/textUtils.test.js +0 -168
  976. package/dist/src/ui/utils/textUtils.test.js.map +0 -1
  977. package/dist/src/ui/utils/ui-sizing.test.d.ts +0 -6
  978. package/dist/src/ui/utils/ui-sizing.test.js +0 -38
  979. package/dist/src/ui/utils/ui-sizing.test.js.map +0 -1
  980. package/dist/src/ui/utils/updateCheck.test.d.ts +0 -6
  981. package/dist/src/ui/utils/updateCheck.test.js +0 -134
  982. package/dist/src/ui/utils/updateCheck.test.js.map +0 -1
  983. package/dist/src/utils/agentUtils.test.d.ts +0 -6
  984. package/dist/src/utils/agentUtils.test.js +0 -121
  985. package/dist/src/utils/agentUtils.test.js.map +0 -1
  986. package/dist/src/utils/checks.test.d.ts +0 -6
  987. package/dist/src/utils/checks.test.js +0 -29
  988. package/dist/src/utils/checks.test.js.map +0 -1
  989. package/dist/src/utils/cleanup.test.d.ts +0 -6
  990. package/dist/src/utils/cleanup.test.js +0 -92
  991. package/dist/src/utils/cleanup.test.js.map +0 -1
  992. package/dist/src/utils/commands.test.d.ts +0 -6
  993. package/dist/src/utils/commands.test.js +0 -115
  994. package/dist/src/utils/commands.test.js.map +0 -1
  995. package/dist/src/utils/commentJson.test.d.ts +0 -6
  996. package/dist/src/utils/commentJson.test.js +0 -308
  997. package/dist/src/utils/commentJson.test.js.map +0 -1
  998. package/dist/src/utils/deepMerge.test.d.ts +0 -6
  999. package/dist/src/utils/deepMerge.test.js +0 -201
  1000. package/dist/src/utils/deepMerge.test.js.map +0 -1
  1001. package/dist/src/utils/dialogScopeUtils.test.d.ts +0 -6
  1002. package/dist/src/utils/dialogScopeUtils.test.js +0 -81
  1003. package/dist/src/utils/dialogScopeUtils.test.js.map +0 -1
  1004. package/dist/src/utils/envVarResolver.test.d.ts +0 -6
  1005. package/dist/src/utils/envVarResolver.test.js +0 -221
  1006. package/dist/src/utils/envVarResolver.test.js.map +0 -1
  1007. package/dist/src/utils/errors.test.d.ts +0 -6
  1008. package/dist/src/utils/errors.test.js +0 -435
  1009. package/dist/src/utils/errors.test.js.map +0 -1
  1010. package/dist/src/utils/events.test.d.ts +0 -6
  1011. package/dist/src/utils/events.test.js +0 -24
  1012. package/dist/src/utils/events.test.js.map +0 -1
  1013. package/dist/src/utils/gitUtils.test.d.ts +0 -6
  1014. package/dist/src/utils/gitUtils.test.js +0 -113
  1015. package/dist/src/utils/gitUtils.test.js.map +0 -1
  1016. package/dist/src/utils/handleAutoUpdate.test.d.ts +0 -6
  1017. package/dist/src/utils/handleAutoUpdate.test.js +0 -310
  1018. package/dist/src/utils/handleAutoUpdate.test.js.map +0 -1
  1019. package/dist/src/utils/installationInfo.test.d.ts +0 -6
  1020. package/dist/src/utils/installationInfo.test.js +0 -296
  1021. package/dist/src/utils/installationInfo.test.js.map +0 -1
  1022. package/dist/src/utils/jsonoutput.test.d.ts +0 -6
  1023. package/dist/src/utils/jsonoutput.test.js +0 -74
  1024. package/dist/src/utils/jsonoutput.test.js.map +0 -1
  1025. package/dist/src/utils/math.test.d.ts +0 -6
  1026. package/dist/src/utils/math.test.js +0 -23
  1027. package/dist/src/utils/math.test.js.map +0 -1
  1028. package/dist/src/utils/persistentState.test.d.ts +0 -6
  1029. package/dist/src/utils/persistentState.test.js +0 -68
  1030. package/dist/src/utils/persistentState.test.js.map +0 -1
  1031. package/dist/src/utils/processUtils.test.d.ts +0 -6
  1032. package/dist/src/utils/processUtils.test.js +0 -20
  1033. package/dist/src/utils/processUtils.test.js.map +0 -1
  1034. package/dist/src/utils/readStdin.test.d.ts +0 -6
  1035. package/dist/src/utils/readStdin.test.js +0 -117
  1036. package/dist/src/utils/readStdin.test.js.map +0 -1
  1037. package/dist/src/utils/readStdin_safety.test.d.ts +0 -6
  1038. package/dist/src/utils/readStdin_safety.test.js +0 -68
  1039. package/dist/src/utils/readStdin_safety.test.js.map +0 -1
  1040. package/dist/src/utils/relaunch.test.d.ts +0 -6
  1041. package/dist/src/utils/relaunch.test.js +0 -279
  1042. package/dist/src/utils/relaunch.test.js.map +0 -1
  1043. package/dist/src/utils/resolvePath.test.d.ts +0 -6
  1044. package/dist/src/utils/resolvePath.test.js +0 -34
  1045. package/dist/src/utils/resolvePath.test.js.map +0 -1
  1046. package/dist/src/utils/sandbox.test.d.ts +0 -6
  1047. package/dist/src/utils/sandbox.test.js +0 -314
  1048. package/dist/src/utils/sandbox.test.js.map +0 -1
  1049. package/dist/src/utils/sandboxUtils.test.d.ts +0 -6
  1050. package/dist/src/utils/sandboxUtils.test.js +0 -122
  1051. package/dist/src/utils/sandboxUtils.test.js.map +0 -1
  1052. package/dist/src/utils/sessionCleanup.integration.test.d.ts +0 -6
  1053. package/dist/src/utils/sessionCleanup.integration.test.js +0 -182
  1054. package/dist/src/utils/sessionCleanup.integration.test.js.map +0 -1
  1055. package/dist/src/utils/sessionCleanup.test.d.ts +0 -6
  1056. package/dist/src/utils/sessionCleanup.test.js +0 -1298
  1057. package/dist/src/utils/sessionCleanup.test.js.map +0 -1
  1058. package/dist/src/utils/sessionUtils.test.d.ts +0 -6
  1059. package/dist/src/utils/sessionUtils.test.js +0 -503
  1060. package/dist/src/utils/sessionUtils.test.js.map +0 -1
  1061. package/dist/src/utils/sessions.test.d.ts +0 -6
  1062. package/dist/src/utils/sessions.test.js +0 -581
  1063. package/dist/src/utils/sessions.test.js.map +0 -1
  1064. package/dist/src/utils/settingsUtils.test.d.ts +0 -6
  1065. package/dist/src/utils/settingsUtils.test.js +0 -808
  1066. package/dist/src/utils/settingsUtils.test.js.map +0 -1
  1067. package/dist/src/utils/skillUtils.test.d.ts +0 -6
  1068. package/dist/src/utils/skillUtils.test.js +0 -70
  1069. package/dist/src/utils/skillUtils.test.js.map +0 -1
  1070. package/dist/src/utils/startupWarnings.test.d.ts +0 -6
  1071. package/dist/src/utils/startupWarnings.test.js +0 -61
  1072. package/dist/src/utils/startupWarnings.test.js.map +0 -1
  1073. package/dist/src/utils/updateEventEmitter.test.d.ts +0 -6
  1074. package/dist/src/utils/updateEventEmitter.test.js +0 -18
  1075. package/dist/src/utils/updateEventEmitter.test.js.map +0 -1
  1076. package/dist/src/utils/userStartupWarnings.test.d.ts +0 -6
  1077. package/dist/src/utils/userStartupWarnings.test.js +0 -98
  1078. package/dist/src/utils/userStartupWarnings.test.js.map +0 -1
  1079. package/dist/src/utils/windowTitle.test.d.ts +0 -6
  1080. package/dist/src/utils/windowTitle.test.js +0 -216
  1081. package/dist/src/utils/windowTitle.test.js.map +0 -1
  1082. package/dist/src/validateNonInterActiveAuth.test.d.ts +0 -6
  1083. package/dist/src/validateNonInterActiveAuth.test.js +0 -319
  1084. package/dist/src/validateNonInterActiveAuth.test.js.map +0 -1
  1085. package/dist/src/zed-integration/fileSystemService.test.d.ts +0 -6
  1086. package/dist/src/zed-integration/fileSystemService.test.js +0 -88
  1087. package/dist/src/zed-integration/fileSystemService.test.js.map +0 -1
  1088. package/dist/src/zed-integration/zedIntegration.test.d.ts +0 -6
  1089. package/dist/src/zed-integration/zedIntegration.test.js +0 -625
  1090. package/dist/src/zed-integration/zedIntegration.test.js.map +0 -1
  1091. package/dist/tsconfig.tsbuildinfo +0 -1
@@ -1,1671 +0,0 @@
1
- /**
2
- * @license
3
- * Copyright 2025 Google LLC
4
- * SPDX-License-Identifier: Apache-2.0
5
- */
6
- import { vi, describe, it, expect, beforeEach, afterEach, afterAll, } from 'vitest';
7
- import * as fs from 'node:fs';
8
- import * as os from 'node:os';
9
- import * as path from 'node:path';
10
- import { ExtensionUninstallEvent, ExtensionDisableEvent, ExtensionEnableEvent, KeychainTokenStorage, loadAgentsFromDirectory, loadSkillsFromDir, DEFAULT_CONTEXT_FILENAME, } from '@didim365/agent-cli-core';
11
- import { loadSettings, createTestMergedSettings, SettingScope, } from './settings.js';
12
- import { isWorkspaceTrusted, resetTrustedFoldersForTesting, } from './trustedFolders.js';
13
- import { createExtension } from '../test-utils/createExtension.js';
14
- import { ExtensionEnablementManager } from './extensions/extensionEnablement.js';
15
- import { join } from 'node:path';
16
- import { EXTENSIONS_CONFIG_FILENAME, EXTENSIONS_DIRECTORY_NAME, INSTALL_METADATA_FILENAME, } from './extensions/variables.js';
17
- import { hashValue, ExtensionManager } from './extension-manager.js';
18
- import { ExtensionStorage } from './extensions/storage.js';
19
- import { INSTALL_WARNING_MESSAGE } from './extensions/consent.js';
20
- const mockGit = {
21
- clone: vi.fn(),
22
- getRemotes: vi.fn(),
23
- fetch: vi.fn(),
24
- checkout: vi.fn(),
25
- listRemote: vi.fn(),
26
- revparse: vi.fn(),
27
- // Not a part of the actual API, but we need to use this to do the correct
28
- // file system interactions.
29
- path: vi.fn(),
30
- };
31
- const mockDownloadFromGithubRelease = vi.hoisted(() => vi.fn());
32
- vi.mock('./extensions/github.js', async (importOriginal) => {
33
- const original = await importOriginal();
34
- return {
35
- ...original,
36
- downloadFromGitHubRelease: mockDownloadFromGithubRelease,
37
- };
38
- });
39
- vi.mock('simple-git', () => ({
40
- simpleGit: vi.fn((path) => {
41
- mockGit.path.mockReturnValue(path);
42
- return mockGit;
43
- }),
44
- }));
45
- const mockHomedir = vi.hoisted(() => vi.fn(() => '/tmp/mock-home'));
46
- vi.mock('os', async (importOriginal) => {
47
- const mockedOs = await importOriginal();
48
- return {
49
- ...mockedOs,
50
- homedir: mockHomedir,
51
- };
52
- });
53
- vi.mock('./trustedFolders.js', async (importOriginal) => {
54
- const actual = await importOriginal();
55
- return {
56
- ...actual,
57
- isWorkspaceTrusted: vi.fn(),
58
- };
59
- });
60
- const mockLogExtensionEnable = vi.hoisted(() => vi.fn());
61
- const mockLogExtensionInstallEvent = vi.hoisted(() => vi.fn());
62
- const mockLogExtensionUninstall = vi.hoisted(() => vi.fn());
63
- const mockLogExtensionUpdateEvent = vi.hoisted(() => vi.fn());
64
- const mockLogExtensionDisable = vi.hoisted(() => vi.fn());
65
- vi.mock('@didim365/agent-cli-core', async (importOriginal) => {
66
- const actual = await importOriginal();
67
- return {
68
- ...actual,
69
- logExtensionEnable: mockLogExtensionEnable,
70
- logExtensionInstallEvent: mockLogExtensionInstallEvent,
71
- logExtensionUninstall: mockLogExtensionUninstall,
72
- logExtensionUpdateEvent: mockLogExtensionUpdateEvent,
73
- logExtensionDisable: mockLogExtensionDisable,
74
- homedir: mockHomedir,
75
- ExtensionEnableEvent: vi.fn(),
76
- ExtensionInstallEvent: vi.fn(),
77
- ExtensionUninstallEvent: vi.fn(),
78
- ExtensionDisableEvent: vi.fn(),
79
- KeychainTokenStorage: vi.fn().mockImplementation(() => ({
80
- getSecret: vi.fn(),
81
- setSecret: vi.fn(),
82
- deleteSecret: vi.fn(),
83
- listSecrets: vi.fn(),
84
- isAvailable: vi.fn().mockResolvedValue(true),
85
- })),
86
- loadAgentsFromDirectory: vi
87
- .fn()
88
- .mockImplementation(async () => ({ agents: [], errors: [] })),
89
- loadSkillsFromDir: vi.fn().mockImplementation(async () => []),
90
- };
91
- });
92
- vi.mock('child_process', async (importOriginal) => {
93
- const actual = await importOriginal();
94
- return {
95
- ...actual,
96
- execSync: vi.fn(),
97
- };
98
- });
99
- describe('extension tests', () => {
100
- let tempHomeDir;
101
- let tempWorkspaceDir;
102
- let userExtensionsDir;
103
- let extensionManager;
104
- let mockRequestConsent;
105
- let mockPromptForSettings;
106
- let mockKeychainStorage;
107
- let keychainData;
108
- beforeEach(() => {
109
- vi.clearAllMocks();
110
- keychainData = {};
111
- mockKeychainStorage = {
112
- getSecret: vi
113
- .fn()
114
- .mockImplementation(async (key) => keychainData[key] || null),
115
- setSecret: vi
116
- .fn()
117
- .mockImplementation(async (key, value) => {
118
- keychainData[key] = value;
119
- }),
120
- deleteSecret: vi.fn().mockImplementation(async (key) => {
121
- delete keychainData[key];
122
- }),
123
- listSecrets: vi
124
- .fn()
125
- .mockImplementation(async () => Object.keys(keychainData)),
126
- isAvailable: vi.fn().mockResolvedValue(true),
127
- };
128
- KeychainTokenStorage.mockImplementation(() => mockKeychainStorage);
129
- vi.mocked(loadAgentsFromDirectory).mockResolvedValue({
130
- agents: [],
131
- errors: [],
132
- });
133
- vi.mocked(loadSkillsFromDir).mockResolvedValue([]);
134
- tempHomeDir = fs.mkdtempSync(path.join(os.tmpdir(), 'gemini-cli-test-home-'));
135
- tempWorkspaceDir = fs.mkdtempSync(path.join(tempHomeDir, 'gemini-cli-test-workspace-'));
136
- userExtensionsDir = path.join(tempHomeDir, EXTENSIONS_DIRECTORY_NAME);
137
- mockRequestConsent = vi.fn();
138
- mockRequestConsent.mockResolvedValue(true);
139
- mockPromptForSettings = vi.fn();
140
- mockPromptForSettings.mockResolvedValue('');
141
- fs.mkdirSync(userExtensionsDir, { recursive: true });
142
- vi.mocked(os.homedir).mockReturnValue(tempHomeDir);
143
- vi.mocked(isWorkspaceTrusted).mockReturnValue({
144
- isTrusted: true,
145
- source: undefined,
146
- });
147
- vi.spyOn(process, 'cwd').mockReturnValue(tempWorkspaceDir);
148
- const settings = loadSettings(tempWorkspaceDir).merged;
149
- settings.experimental.extensionConfig = true;
150
- extensionManager = new ExtensionManager({
151
- workspaceDir: tempWorkspaceDir,
152
- requestConsent: mockRequestConsent,
153
- requestSetting: mockPromptForSettings,
154
- settings,
155
- });
156
- resetTrustedFoldersForTesting();
157
- });
158
- afterEach(() => {
159
- fs.rmSync(tempHomeDir, { recursive: true, force: true });
160
- fs.rmSync(tempWorkspaceDir, { recursive: true, force: true });
161
- vi.restoreAllMocks();
162
- });
163
- describe('loadExtensions', () => {
164
- it('should include extension path in loaded extension', async () => {
165
- const extensionDir = path.join(userExtensionsDir, 'test-extension');
166
- fs.mkdirSync(extensionDir, { recursive: true });
167
- createExtension({
168
- extensionsDir: userExtensionsDir,
169
- name: 'test-extension',
170
- version: '1.0.0',
171
- });
172
- const extensions = await extensionManager.loadExtensions();
173
- expect(extensions).toHaveLength(1);
174
- expect(extensions[0].path).toBe(extensionDir);
175
- expect(extensions[0].name).toBe('test-extension');
176
- });
177
- it('should load context file path when GEMINI.md is present', async () => {
178
- createExtension({
179
- extensionsDir: userExtensionsDir,
180
- name: 'ext1',
181
- version: '1.0.0',
182
- addContextFile: true,
183
- });
184
- createExtension({
185
- extensionsDir: userExtensionsDir,
186
- name: 'ext2',
187
- version: '2.0.0',
188
- });
189
- const extensions = await extensionManager.loadExtensions();
190
- expect(extensions).toHaveLength(2);
191
- const ext1 = extensions.find((e) => e.name === 'ext1');
192
- const ext2 = extensions.find((e) => e.name === 'ext2');
193
- expect(ext1?.contextFiles).toEqual([
194
- path.join(userExtensionsDir, 'ext1', 'GEMINI.md'),
195
- ]);
196
- expect(ext2?.contextFiles).toEqual([]);
197
- });
198
- it('should load context file path from the extension config', async () => {
199
- createExtension({
200
- extensionsDir: userExtensionsDir,
201
- name: 'ext1',
202
- version: '1.0.0',
203
- addContextFile: false,
204
- contextFileName: 'my-context-file.md',
205
- });
206
- const extensions = await extensionManager.loadExtensions();
207
- expect(extensions).toHaveLength(1);
208
- const ext1 = extensions.find((e) => e.name === 'ext1');
209
- expect(ext1?.contextFiles).toEqual([
210
- path.join(userExtensionsDir, 'ext1', 'my-context-file.md'),
211
- ]);
212
- });
213
- it('should load only AGENTS.md when both AGENTS.md and GEMINI.md exist (first-found fallback)', async () => {
214
- const extDir = createExtension({
215
- extensionsDir: userExtensionsDir,
216
- name: 'ext1',
217
- version: '1.0.0',
218
- addContextFile: false, // Don't auto-create GEMINI.md
219
- contextFileName: undefined, // No custom contextFileName
220
- });
221
- // Manually create both files
222
- fs.writeFileSync(path.join(extDir, DEFAULT_CONTEXT_FILENAME), 'agents context');
223
- fs.writeFileSync(path.join(extDir, 'GEMINI.md'), 'gemini context');
224
- const extensions = await extensionManager.loadExtensions();
225
- expect(extensions).toHaveLength(1);
226
- const ext1 = extensions.find((e) => e.name === 'ext1');
227
- // Should load only AGENTS.md (first found in fallback chain)
228
- expect(ext1?.contextFiles).toEqual([
229
- path.join(userExtensionsDir, 'ext1', DEFAULT_CONTEXT_FILENAME),
230
- ]);
231
- expect(ext1?.contextFiles).toHaveLength(1);
232
- });
233
- it('should load GEMINI.md when only GEMINI.md exists (fallback works)', async () => {
234
- const extDir = createExtension({
235
- extensionsDir: userExtensionsDir,
236
- name: 'ext2',
237
- version: '1.0.0',
238
- addContextFile: false,
239
- contextFileName: undefined,
240
- });
241
- // Only create GEMINI.md (legacy extension)
242
- fs.writeFileSync(path.join(extDir, 'GEMINI.md'), 'gemini context');
243
- const extensions = await extensionManager.loadExtensions();
244
- expect(extensions).toHaveLength(1);
245
- const ext2 = extensions.find((e) => e.name === 'ext2');
246
- // Should load GEMINI.md (fallback in chain)
247
- expect(ext2?.contextFiles).toEqual([
248
- path.join(userExtensionsDir, 'ext2', 'GEMINI.md'),
249
- ]);
250
- });
251
- it('should load AGENTS.md when only AGENTS.md exists (primary path)', async () => {
252
- const extDir = createExtension({
253
- extensionsDir: userExtensionsDir,
254
- name: 'ext3',
255
- version: '1.0.0',
256
- addContextFile: false,
257
- contextFileName: undefined,
258
- });
259
- // Only create AGENTS.md
260
- fs.writeFileSync(path.join(extDir, DEFAULT_CONTEXT_FILENAME), 'agents context');
261
- const extensions = await extensionManager.loadExtensions();
262
- expect(extensions).toHaveLength(1);
263
- const ext3 = extensions.find((e) => e.name === 'ext3');
264
- // Should load AGENTS.md (primary)
265
- expect(ext3?.contextFiles).toEqual([
266
- path.join(userExtensionsDir, 'ext3', DEFAULT_CONTEXT_FILENAME),
267
- ]);
268
- });
269
- it('should annotate disabled extensions', async () => {
270
- createExtension({
271
- extensionsDir: userExtensionsDir,
272
- name: 'disabled-extension',
273
- version: '1.0.0',
274
- });
275
- createExtension({
276
- extensionsDir: userExtensionsDir,
277
- name: 'enabled-extension',
278
- version: '2.0.0',
279
- });
280
- await extensionManager.loadExtensions();
281
- await extensionManager.disableExtension('disabled-extension', SettingScope.User);
282
- const extensions = extensionManager.getExtensions();
283
- expect(extensions).toHaveLength(2);
284
- expect(extensions[0].name).toBe('disabled-extension');
285
- expect(extensions[0].isActive).toBe(false);
286
- expect(extensions[1].name).toBe('enabled-extension');
287
- expect(extensions[1].isActive).toBe(true);
288
- });
289
- it('should hydrate variables', async () => {
290
- createExtension({
291
- extensionsDir: userExtensionsDir,
292
- name: 'test-extension',
293
- version: '1.0.0',
294
- addContextFile: false,
295
- contextFileName: undefined,
296
- mcpServers: {
297
- 'test-server': {
298
- cwd: '${extensionPath}${/}server',
299
- },
300
- },
301
- });
302
- const extensions = await extensionManager.loadExtensions();
303
- expect(extensions).toHaveLength(1);
304
- const expectedCwd = path.join(userExtensionsDir, 'test-extension', 'server');
305
- expect(extensions[0].mcpServers?.['test-server'].cwd).toBe(expectedCwd);
306
- });
307
- it('should load a linked extension correctly', async () => {
308
- const sourceExtDir = createExtension({
309
- extensionsDir: tempWorkspaceDir,
310
- name: 'my-linked-extension',
311
- version: '1.0.0',
312
- contextFileName: 'context.md',
313
- });
314
- fs.writeFileSync(path.join(sourceExtDir, 'context.md'), 'linked context');
315
- await extensionManager.loadExtensions();
316
- const extension = await extensionManager.installOrUpdateExtension({
317
- source: sourceExtDir,
318
- type: 'link',
319
- });
320
- expect(extension.name).toEqual('my-linked-extension');
321
- const extensions = extensionManager.getExtensions();
322
- expect(extensions).toHaveLength(1);
323
- const linkedExt = extensions[0];
324
- expect(linkedExt.name).toBe('my-linked-extension');
325
- expect(linkedExt.path).toBe(sourceExtDir);
326
- expect(linkedExt.installMetadata).toEqual({
327
- source: sourceExtDir,
328
- type: 'link',
329
- });
330
- expect(linkedExt.contextFiles).toEqual([
331
- path.join(sourceExtDir, 'context.md'),
332
- ]);
333
- });
334
- it('should hydrate ${extensionPath} correctly for linked extensions', async () => {
335
- const sourceExtDir = createExtension({
336
- extensionsDir: tempWorkspaceDir,
337
- name: 'my-linked-extension-with-path',
338
- version: '1.0.0',
339
- mcpServers: {
340
- 'test-server': {
341
- command: 'node',
342
- args: ['${extensionPath}${/}server${/}index.js'],
343
- cwd: '${extensionPath}${/}server',
344
- },
345
- },
346
- });
347
- await extensionManager.loadExtensions();
348
- await extensionManager.installOrUpdateExtension({
349
- source: sourceExtDir,
350
- type: 'link',
351
- });
352
- const extensions = extensionManager.getExtensions();
353
- expect(extensions).toHaveLength(1);
354
- expect(extensions[0].mcpServers?.['test-server'].cwd).toBe(path.join(sourceExtDir, 'server'));
355
- expect(extensions[0].mcpServers?.['test-server'].args).toEqual([
356
- path.join(sourceExtDir, 'server', 'index.js'),
357
- ]);
358
- });
359
- it('should resolve environment variables in extension configuration', async () => {
360
- process.env['TEST_API_KEY'] = 'test-api-key-123';
361
- process.env['TEST_DB_URL'] = 'postgresql://localhost:5432/testdb';
362
- try {
363
- const userExtensionsDir = path.join(tempHomeDir, EXTENSIONS_DIRECTORY_NAME);
364
- fs.mkdirSync(userExtensionsDir, { recursive: true });
365
- const extDir = path.join(userExtensionsDir, 'test-extension');
366
- fs.mkdirSync(extDir);
367
- // Write config to a separate file for clarity and good practices
368
- const configPath = path.join(extDir, EXTENSIONS_CONFIG_FILENAME);
369
- const extensionConfig = {
370
- name: 'test-extension',
371
- version: '1.0.0',
372
- mcpServers: {
373
- 'test-server': {
374
- command: 'node',
375
- args: ['server.js'],
376
- env: {
377
- API_KEY: '$TEST_API_KEY',
378
- DATABASE_URL: '${TEST_DB_URL}',
379
- STATIC_VALUE: 'no-substitution',
380
- },
381
- },
382
- },
383
- };
384
- fs.writeFileSync(configPath, JSON.stringify(extensionConfig));
385
- const extensions = await extensionManager.loadExtensions();
386
- expect(extensions).toHaveLength(1);
387
- const extension = extensions[0];
388
- expect(extension.name).toBe('test-extension');
389
- expect(extension.mcpServers).toBeDefined();
390
- const serverConfig = extension.mcpServers?.['test-server'];
391
- expect(serverConfig).toBeDefined();
392
- expect(serverConfig?.env).toBeDefined();
393
- expect(serverConfig?.env?.['API_KEY']).toBe('test-api-key-123');
394
- expect(serverConfig?.env?.['DATABASE_URL']).toBe('postgresql://localhost:5432/testdb');
395
- expect(serverConfig?.env?.['STATIC_VALUE']).toBe('no-substitution');
396
- }
397
- finally {
398
- delete process.env['TEST_API_KEY'];
399
- delete process.env['TEST_DB_URL'];
400
- }
401
- });
402
- it('should resolve environment variables from an extension .env file', async () => {
403
- const extDir = createExtension({
404
- extensionsDir: userExtensionsDir,
405
- name: 'test-extension',
406
- version: '1.0.0',
407
- mcpServers: {
408
- 'test-server': {
409
- command: 'node',
410
- args: ['server.js'],
411
- env: {
412
- API_KEY: '$MY_API_KEY',
413
- STATIC_VALUE: 'no-substitution',
414
- },
415
- },
416
- },
417
- settings: [
418
- {
419
- name: 'My API Key',
420
- description: 'API key for testing.',
421
- envVar: 'MY_API_KEY',
422
- },
423
- ],
424
- });
425
- const envFilePath = path.join(extDir, '.env');
426
- fs.writeFileSync(envFilePath, 'MY_API_KEY=test-key-from-file\n');
427
- const extensions = await extensionManager.loadExtensions();
428
- expect(extensions).toHaveLength(1);
429
- const extension = extensions[0];
430
- const serverConfig = extension.mcpServers['test-server'];
431
- expect(serverConfig.env).toBeDefined();
432
- expect(serverConfig.env['API_KEY']).toBe('test-key-from-file');
433
- expect(serverConfig.env['STATIC_VALUE']).toBe('no-substitution');
434
- });
435
- it('should handle missing environment variables gracefully', async () => {
436
- const userExtensionsDir = path.join(tempHomeDir, EXTENSIONS_DIRECTORY_NAME);
437
- fs.mkdirSync(userExtensionsDir, { recursive: true });
438
- const extDir = path.join(userExtensionsDir, 'test-extension');
439
- fs.mkdirSync(extDir);
440
- const extensionConfig = {
441
- name: 'test-extension',
442
- version: '1.0.0',
443
- mcpServers: {
444
- 'test-server': {
445
- command: 'node',
446
- args: ['server.js'],
447
- env: {
448
- MISSING_VAR: '$UNDEFINED_ENV_VAR',
449
- MISSING_VAR_BRACES: '${ALSO_UNDEFINED}',
450
- },
451
- },
452
- },
453
- };
454
- fs.writeFileSync(path.join(extDir, EXTENSIONS_CONFIG_FILENAME), JSON.stringify(extensionConfig));
455
- const extensions = await extensionManager.loadExtensions();
456
- expect(extensions).toHaveLength(1);
457
- const extension = extensions[0];
458
- const serverConfig = extension.mcpServers['test-server'];
459
- expect(serverConfig.env).toBeDefined();
460
- expect(serverConfig.env['MISSING_VAR']).toBe('$UNDEFINED_ENV_VAR');
461
- expect(serverConfig.env['MISSING_VAR_BRACES']).toBe('${ALSO_UNDEFINED}');
462
- });
463
- it('should skip extensions with invalid JSON and log a warning', async () => {
464
- const consoleSpy = vi
465
- .spyOn(console, 'error')
466
- .mockImplementation(() => { });
467
- // Good extension
468
- createExtension({
469
- extensionsDir: userExtensionsDir,
470
- name: 'good-ext',
471
- version: '1.0.0',
472
- });
473
- // Bad extension
474
- const badExtDir = path.join(userExtensionsDir, 'bad-ext');
475
- fs.mkdirSync(badExtDir);
476
- const badConfigPath = path.join(badExtDir, EXTENSIONS_CONFIG_FILENAME);
477
- fs.writeFileSync(badConfigPath, '{ "name": "bad-ext"'); // Malformed
478
- const extensions = await extensionManager.loadExtensions();
479
- expect(extensions).toHaveLength(1);
480
- expect(extensions[0].name).toBe('good-ext');
481
- expect(consoleSpy).toHaveBeenCalledExactlyOnceWith(expect.stringContaining(`Warning: Skipping extension in ${badExtDir}: Failed to load extension config from ${badConfigPath}`));
482
- consoleSpy.mockRestore();
483
- });
484
- it('should skip extensions with missing name and log a warning', async () => {
485
- const consoleSpy = vi
486
- .spyOn(console, 'error')
487
- .mockImplementation(() => { });
488
- // Good extension
489
- createExtension({
490
- extensionsDir: userExtensionsDir,
491
- name: 'good-ext',
492
- version: '1.0.0',
493
- });
494
- // Bad extension
495
- const badExtDir = path.join(userExtensionsDir, 'bad-ext-no-name');
496
- fs.mkdirSync(badExtDir);
497
- const badConfigPath = path.join(badExtDir, EXTENSIONS_CONFIG_FILENAME);
498
- fs.writeFileSync(badConfigPath, JSON.stringify({ version: '1.0.0' }));
499
- const extensions = await extensionManager.loadExtensions();
500
- expect(extensions).toHaveLength(1);
501
- expect(extensions[0].name).toBe('good-ext');
502
- expect(consoleSpy).toHaveBeenCalledExactlyOnceWith(expect.stringContaining(`Warning: Skipping extension in ${badExtDir}: Failed to load extension config from ${badConfigPath}: Invalid configuration in ${badConfigPath}: missing "name"`));
503
- consoleSpy.mockRestore();
504
- });
505
- it('should filter trust out of mcp servers', async () => {
506
- createExtension({
507
- extensionsDir: userExtensionsDir,
508
- name: 'test-extension',
509
- version: '1.0.0',
510
- mcpServers: {
511
- 'test-server': {
512
- command: 'node',
513
- args: ['server.js'],
514
- trust: true,
515
- },
516
- },
517
- });
518
- const extensions = await extensionManager.loadExtensions();
519
- expect(extensions).toHaveLength(1);
520
- expect(extensions[0].mcpServers?.['test-server'].trust).toBeUndefined();
521
- });
522
- it('should throw an error for invalid extension names', async () => {
523
- const consoleSpy = vi
524
- .spyOn(console, 'error')
525
- .mockImplementation(() => { });
526
- createExtension({
527
- extensionsDir: userExtensionsDir,
528
- name: 'bad_name',
529
- version: '1.0.0',
530
- });
531
- const extensions = await extensionManager.loadExtensions();
532
- const extension = extensions.find((e) => e.name === 'bad_name');
533
- expect(extension).toBeUndefined();
534
- expect(consoleSpy).toHaveBeenCalledWith(expect.stringContaining('Invalid extension name: "bad_name"'));
535
- consoleSpy.mockRestore();
536
- });
537
- it('should not load github extensions if blockGitExtensions is set', async () => {
538
- createExtension({
539
- extensionsDir: userExtensionsDir,
540
- name: 'my-ext',
541
- version: '1.0.0',
542
- installMetadata: {
543
- type: 'git',
544
- source: 'http://somehost.com/foo/bar',
545
- },
546
- });
547
- const blockGitExtensionsSetting = createTestMergedSettings({
548
- security: { blockGitExtensions: true },
549
- });
550
- extensionManager = new ExtensionManager({
551
- workspaceDir: tempWorkspaceDir,
552
- requestConsent: mockRequestConsent,
553
- requestSetting: mockPromptForSettings,
554
- settings: blockGitExtensionsSetting,
555
- });
556
- const extensions = await extensionManager.loadExtensions();
557
- const extension = extensions.find((e) => e.name === 'my-ext');
558
- expect(extension).toBeUndefined();
559
- });
560
- it('should not load any extensions if admin.extensions.enabled is false', async () => {
561
- createExtension({
562
- extensionsDir: userExtensionsDir,
563
- name: 'test-extension',
564
- version: '1.0.0',
565
- });
566
- const loadedSettings = loadSettings(tempWorkspaceDir).merged;
567
- loadedSettings.admin.extensions.enabled = false;
568
- extensionManager = new ExtensionManager({
569
- workspaceDir: tempWorkspaceDir,
570
- requestConsent: mockRequestConsent,
571
- requestSetting: mockPromptForSettings,
572
- settings: loadedSettings,
573
- });
574
- const extensions = await extensionManager.loadExtensions();
575
- expect(extensions).toEqual([]);
576
- });
577
- it('should not load mcpServers if admin.mcp.enabled is false', async () => {
578
- createExtension({
579
- extensionsDir: userExtensionsDir,
580
- name: 'test-extension',
581
- version: '1.0.0',
582
- mcpServers: {
583
- 'test-server': { command: 'echo', args: ['hello'] },
584
- },
585
- });
586
- const loadedSettings = loadSettings(tempWorkspaceDir).merged;
587
- loadedSettings.admin.mcp.enabled = false;
588
- extensionManager = new ExtensionManager({
589
- workspaceDir: tempWorkspaceDir,
590
- requestConsent: mockRequestConsent,
591
- requestSetting: mockPromptForSettings,
592
- settings: loadedSettings,
593
- });
594
- const extensions = await extensionManager.loadExtensions();
595
- expect(extensions).toHaveLength(1);
596
- expect(extensions[0].mcpServers).toBeUndefined();
597
- });
598
- it('should load mcpServers if admin.mcp.enabled is true', async () => {
599
- createExtension({
600
- extensionsDir: userExtensionsDir,
601
- name: 'test-extension',
602
- version: '1.0.0',
603
- mcpServers: {
604
- 'test-server': { command: 'echo', args: ['hello'] },
605
- },
606
- });
607
- const loadedSettings = loadSettings(tempWorkspaceDir).merged;
608
- loadedSettings.admin.mcp.enabled = true;
609
- extensionManager = new ExtensionManager({
610
- workspaceDir: tempWorkspaceDir,
611
- requestConsent: mockRequestConsent,
612
- requestSetting: mockPromptForSettings,
613
- settings: loadedSettings,
614
- });
615
- const extensions = await extensionManager.loadExtensions();
616
- expect(extensions).toHaveLength(1);
617
- expect(extensions[0].mcpServers).toEqual({
618
- 'test-server': { command: 'echo', args: ['hello'] },
619
- });
620
- });
621
- describe('id generation', () => {
622
- it.each([
623
- {
624
- description: 'should generate id from source for non-github git urls',
625
- installMetadata: {
626
- type: 'git',
627
- source: 'http://somehost.com/foo/bar',
628
- },
629
- expectedIdSource: 'http://somehost.com/foo/bar',
630
- },
631
- {
632
- description: 'should generate id from owner/repo for github http urls',
633
- installMetadata: {
634
- type: 'git',
635
- source: 'http://github.com/foo/bar',
636
- },
637
- expectedIdSource: 'https://github.com/foo/bar',
638
- },
639
- {
640
- description: 'should generate id from owner/repo for github ssh urls',
641
- installMetadata: {
642
- type: 'git',
643
- source: 'git@github.com:foo/bar',
644
- },
645
- expectedIdSource: 'https://github.com/foo/bar',
646
- },
647
- {
648
- description: 'should generate id from source for github-release extension',
649
- installMetadata: {
650
- type: 'github-release',
651
- source: 'https://github.com/foo/bar',
652
- },
653
- expectedIdSource: 'https://github.com/foo/bar',
654
- },
655
- {
656
- description: 'should generate id from the original source for local extension',
657
- installMetadata: {
658
- type: 'local',
659
- source: '/some/path',
660
- },
661
- expectedIdSource: '/some/path',
662
- },
663
- ])('$description', async ({ installMetadata, expectedIdSource }) => {
664
- createExtension({
665
- extensionsDir: userExtensionsDir,
666
- name: 'my-ext',
667
- version: '1.0.0',
668
- installMetadata,
669
- });
670
- const extensions = await extensionManager.loadExtensions();
671
- const extension = extensions.find((e) => e.name === 'my-ext');
672
- expect(extension?.id).toBe(hashValue(expectedIdSource));
673
- });
674
- it('should generate id from the original source for linked extensions', async () => {
675
- const extDevelopmentDir = path.join(tempHomeDir, 'local_extensions');
676
- const actualExtensionDir = createExtension({
677
- extensionsDir: extDevelopmentDir,
678
- name: 'link-ext-name',
679
- version: '1.0.0',
680
- });
681
- await extensionManager.loadExtensions();
682
- await extensionManager.installOrUpdateExtension({
683
- type: 'link',
684
- source: actualExtensionDir,
685
- });
686
- const extension = extensionManager
687
- .getExtensions()
688
- .find((e) => e.name === 'link-ext-name');
689
- expect(extension?.id).toBe(hashValue(actualExtensionDir));
690
- });
691
- it('should generate id from name for extension with no install metadata', async () => {
692
- createExtension({
693
- extensionsDir: userExtensionsDir,
694
- name: 'no-meta-name',
695
- version: '1.0.0',
696
- });
697
- const extensions = await extensionManager.loadExtensions();
698
- const extension = extensions.find((e) => e.name === 'no-meta-name');
699
- expect(extension?.id).toBe(hashValue('no-meta-name'));
700
- });
701
- it('should load extension hooks and hydrate variables', async () => {
702
- const extDir = createExtension({
703
- extensionsDir: userExtensionsDir,
704
- name: 'hook-extension',
705
- version: '1.0.0',
706
- });
707
- const hooksDir = path.join(extDir, 'hooks');
708
- fs.mkdirSync(hooksDir);
709
- const hooksConfig = {
710
- enabled: false,
711
- hooks: {
712
- BeforeTool: [
713
- {
714
- matcher: '.*',
715
- hooks: [
716
- {
717
- type: 'command',
718
- command: 'echo ${extensionPath}',
719
- },
720
- ],
721
- },
722
- ],
723
- },
724
- };
725
- fs.writeFileSync(path.join(hooksDir, 'hooks.json'), JSON.stringify(hooksConfig));
726
- const settings = loadSettings(tempWorkspaceDir).merged;
727
- settings.hooksConfig.enabled = true;
728
- extensionManager = new ExtensionManager({
729
- workspaceDir: tempWorkspaceDir,
730
- requestConsent: mockRequestConsent,
731
- requestSetting: mockPromptForSettings,
732
- settings,
733
- });
734
- const extensions = await extensionManager.loadExtensions();
735
- expect(extensions).toHaveLength(1);
736
- const extension = extensions[0];
737
- expect(extension.hooks).toBeDefined();
738
- expect(extension.hooks?.BeforeTool).toHaveLength(1);
739
- expect(extension.hooks?.BeforeTool?.[0].hooks[0].command).toBe(`echo ${extDir}`);
740
- });
741
- it('should not load hooks if hooks.enabled is false', async () => {
742
- const extDir = createExtension({
743
- extensionsDir: userExtensionsDir,
744
- name: 'hook-extension-disabled',
745
- version: '1.0.0',
746
- });
747
- const hooksDir = path.join(extDir, 'hooks');
748
- fs.mkdirSync(hooksDir);
749
- fs.writeFileSync(path.join(hooksDir, 'hooks.json'), JSON.stringify({ hooks: { BeforeTool: [] }, enabled: false }));
750
- const settings = loadSettings(tempWorkspaceDir).merged;
751
- settings.hooksConfig.enabled = false;
752
- extensionManager = new ExtensionManager({
753
- workspaceDir: tempWorkspaceDir,
754
- requestConsent: mockRequestConsent,
755
- requestSetting: mockPromptForSettings,
756
- settings,
757
- });
758
- const extensions = await extensionManager.loadExtensions();
759
- expect(extensions).toHaveLength(1);
760
- expect(extensions[0].hooks).toBeUndefined();
761
- });
762
- it('should warn about hooks during installation', async () => {
763
- const requestConsentSpy = vi.fn().mockResolvedValue(true);
764
- extensionManager.setRequestConsent(requestConsentSpy);
765
- const sourceExtDir = path.join(tempWorkspaceDir, 'hook-extension-source');
766
- fs.mkdirSync(sourceExtDir, { recursive: true });
767
- const hooksDir = path.join(sourceExtDir, 'hooks');
768
- fs.mkdirSync(hooksDir);
769
- fs.writeFileSync(path.join(hooksDir, 'hooks.json'), JSON.stringify({ hooks: {} }));
770
- fs.writeFileSync(path.join(sourceExtDir, 'gemini-extension.json'), JSON.stringify({
771
- name: 'hook-extension-install',
772
- version: '1.0.0',
773
- }));
774
- await extensionManager.loadExtensions();
775
- await extensionManager.installOrUpdateExtension({
776
- source: sourceExtDir,
777
- type: 'local',
778
- });
779
- expect(requestConsentSpy).toHaveBeenCalledWith(expect.stringContaining('⚠️ This extension contains Hooks'));
780
- });
781
- });
782
- });
783
- describe('installExtension', () => {
784
- it('should install an extension from a local path', async () => {
785
- const sourceExtDir = createExtension({
786
- extensionsDir: tempHomeDir,
787
- name: 'my-local-extension',
788
- version: '1.0.0',
789
- });
790
- const targetExtDir = path.join(userExtensionsDir, 'my-local-extension');
791
- const metadataPath = path.join(targetExtDir, INSTALL_METADATA_FILENAME);
792
- await extensionManager.loadExtensions();
793
- await extensionManager.installOrUpdateExtension({
794
- source: sourceExtDir,
795
- type: 'local',
796
- });
797
- expect(fs.existsSync(targetExtDir)).toBe(true);
798
- expect(fs.existsSync(metadataPath)).toBe(true);
799
- const metadata = JSON.parse(fs.readFileSync(metadataPath, 'utf-8'));
800
- expect(metadata).toEqual({
801
- source: sourceExtDir,
802
- type: 'local',
803
- });
804
- fs.rmSync(targetExtDir, { recursive: true, force: true });
805
- });
806
- it('should throw an error if the extension already exists', async () => {
807
- const sourceExtDir = createExtension({
808
- extensionsDir: tempHomeDir,
809
- name: 'my-local-extension',
810
- version: '1.0.0',
811
- });
812
- await extensionManager.loadExtensions();
813
- await extensionManager.installOrUpdateExtension({
814
- source: sourceExtDir,
815
- type: 'local',
816
- });
817
- await expect(extensionManager.installOrUpdateExtension({
818
- source: sourceExtDir,
819
- type: 'local',
820
- })).rejects.toThrow('Extension "my-local-extension" is already installed. Please uninstall it first.');
821
- });
822
- it('should throw an error and cleanup if gemini-extension.json is missing', async () => {
823
- const sourceExtDir = path.join(tempHomeDir, 'bad-extension');
824
- fs.mkdirSync(sourceExtDir, { recursive: true });
825
- const configPath = path.join(sourceExtDir, EXTENSIONS_CONFIG_FILENAME);
826
- await expect(extensionManager.installOrUpdateExtension({
827
- source: sourceExtDir,
828
- type: 'local',
829
- })).rejects.toThrow(`Configuration file not found at ${configPath}`);
830
- const targetExtDir = path.join(userExtensionsDir, 'bad-extension');
831
- expect(fs.existsSync(targetExtDir)).toBe(false);
832
- });
833
- it('should throw an error for invalid JSON in gemini-extension.json', async () => {
834
- const sourceExtDir = path.join(tempHomeDir, 'bad-json-ext');
835
- fs.mkdirSync(sourceExtDir, { recursive: true });
836
- const configPath = path.join(sourceExtDir, EXTENSIONS_CONFIG_FILENAME);
837
- fs.writeFileSync(configPath, '{ "name": "bad-json", "version": "1.0.0"'); // Malformed JSON
838
- await expect(extensionManager.installOrUpdateExtension({
839
- source: sourceExtDir,
840
- type: 'local',
841
- })).rejects.toThrow(new RegExp(`^Failed to load extension config from ${configPath.replace(/\\/g, '\\\\')}`));
842
- });
843
- it('should throw an error for missing name in gemini-extension.json', async () => {
844
- const sourceExtDir = createExtension({
845
- extensionsDir: tempHomeDir,
846
- name: 'missing-name-ext',
847
- version: '1.0.0',
848
- });
849
- const configPath = path.join(sourceExtDir, EXTENSIONS_CONFIG_FILENAME);
850
- // Overwrite with invalid config
851
- fs.writeFileSync(configPath, JSON.stringify({ version: '1.0.0' }));
852
- await expect(extensionManager.installOrUpdateExtension({
853
- source: sourceExtDir,
854
- type: 'local',
855
- })).rejects.toThrow(`Invalid configuration in ${configPath}: missing "name"`);
856
- });
857
- it('should install an extension from a git URL', async () => {
858
- const gitUrl = 'https://somehost.com/somerepo.git';
859
- const extensionName = 'some-extension';
860
- const targetExtDir = path.join(userExtensionsDir, extensionName);
861
- const metadataPath = path.join(targetExtDir, INSTALL_METADATA_FILENAME);
862
- mockGit.clone.mockImplementation(async (_, destination) => {
863
- fs.mkdirSync(path.join(mockGit.path(), destination), {
864
- recursive: true,
865
- });
866
- fs.writeFileSync(path.join(mockGit.path(), destination, EXTENSIONS_CONFIG_FILENAME), JSON.stringify({ name: extensionName, version: '1.0.0' }));
867
- });
868
- mockGit.getRemotes.mockResolvedValue([{ name: 'origin' }]);
869
- mockDownloadFromGithubRelease.mockResolvedValue({
870
- success: false,
871
- failureReason: 'no release data',
872
- type: 'github-release',
873
- });
874
- await extensionManager.loadExtensions();
875
- await extensionManager.installOrUpdateExtension({
876
- source: gitUrl,
877
- type: 'git',
878
- });
879
- expect(fs.existsSync(targetExtDir)).toBe(true);
880
- expect(fs.existsSync(metadataPath)).toBe(true);
881
- const metadata = JSON.parse(fs.readFileSync(metadataPath, 'utf-8'));
882
- expect(metadata).toEqual({
883
- source: gitUrl,
884
- type: 'git',
885
- });
886
- });
887
- it('should install a linked extension', async () => {
888
- const sourceExtDir = createExtension({
889
- extensionsDir: tempHomeDir,
890
- name: 'my-linked-extension',
891
- version: '1.0.0',
892
- });
893
- const targetExtDir = path.join(userExtensionsDir, 'my-linked-extension');
894
- const metadataPath = path.join(targetExtDir, INSTALL_METADATA_FILENAME);
895
- const configPath = path.join(targetExtDir, EXTENSIONS_CONFIG_FILENAME);
896
- await extensionManager.loadExtensions();
897
- await extensionManager.installOrUpdateExtension({
898
- source: sourceExtDir,
899
- type: 'link',
900
- });
901
- expect(fs.existsSync(targetExtDir)).toBe(true);
902
- expect(fs.existsSync(metadataPath)).toBe(true);
903
- expect(fs.existsSync(configPath)).toBe(false);
904
- const metadata = JSON.parse(fs.readFileSync(metadataPath, 'utf-8'));
905
- expect(metadata).toEqual({
906
- source: sourceExtDir,
907
- type: 'link',
908
- });
909
- fs.rmSync(targetExtDir, { recursive: true, force: true });
910
- });
911
- it('should not install a github extension if blockGitExtensions is set', async () => {
912
- const gitUrl = 'https://somehost.com/somerepo.git';
913
- const blockGitExtensionsSetting = createTestMergedSettings({
914
- security: { blockGitExtensions: true },
915
- });
916
- extensionManager = new ExtensionManager({
917
- workspaceDir: tempWorkspaceDir,
918
- requestConsent: mockRequestConsent,
919
- requestSetting: mockPromptForSettings,
920
- settings: blockGitExtensionsSetting,
921
- });
922
- await extensionManager.loadExtensions();
923
- await expect(extensionManager.installOrUpdateExtension({
924
- source: gitUrl,
925
- type: 'git',
926
- })).rejects.toThrow('Installing extensions from remote sources is disallowed by your current settings.');
927
- });
928
- it('should prompt for trust if workspace is not trusted', async () => {
929
- vi.mocked(isWorkspaceTrusted).mockReturnValue({
930
- isTrusted: false,
931
- source: undefined,
932
- });
933
- const sourceExtDir = createExtension({
934
- extensionsDir: tempHomeDir,
935
- name: 'my-local-extension',
936
- version: '1.0.0',
937
- });
938
- await extensionManager.loadExtensions();
939
- await extensionManager.installOrUpdateExtension({
940
- source: sourceExtDir,
941
- type: 'local',
942
- });
943
- expect(mockRequestConsent).toHaveBeenCalledWith(`The current workspace at "${tempWorkspaceDir}" is not trusted. Do you want to trust this workspace to install extensions?`);
944
- });
945
- it('should not install if user denies trust', async () => {
946
- vi.mocked(isWorkspaceTrusted).mockReturnValue({
947
- isTrusted: false,
948
- source: undefined,
949
- });
950
- mockRequestConsent.mockImplementation(async (message) => {
951
- if (message.includes('is not trusted. Do you want to trust this workspace to install extensions?')) {
952
- return false;
953
- }
954
- return true;
955
- });
956
- const sourceExtDir = createExtension({
957
- extensionsDir: tempHomeDir,
958
- name: 'my-local-extension',
959
- version: '1.0.0',
960
- });
961
- await extensionManager.loadExtensions();
962
- await expect(extensionManager.installOrUpdateExtension({
963
- source: sourceExtDir,
964
- type: 'local',
965
- })).rejects.toThrow(`Could not install extension because the current workspace at ${tempWorkspaceDir} is not trusted.`);
966
- });
967
- it('should add the workspace to trusted folders if user consents', async () => {
968
- const trustedFoldersPath = path.join(tempHomeDir, '.gemini', 'trustedFolders.json');
969
- vi.mocked(isWorkspaceTrusted).mockReturnValue({
970
- isTrusted: false,
971
- source: undefined,
972
- });
973
- const sourceExtDir = createExtension({
974
- extensionsDir: tempHomeDir,
975
- name: 'my-local-extension',
976
- version: '1.0.0',
977
- });
978
- await extensionManager.loadExtensions();
979
- await extensionManager.installOrUpdateExtension({
980
- source: sourceExtDir,
981
- type: 'local',
982
- });
983
- expect(fs.existsSync(trustedFoldersPath)).toBe(true);
984
- const trustedFolders = JSON.parse(fs.readFileSync(trustedFoldersPath, 'utf-8'));
985
- expect(trustedFolders[tempWorkspaceDir]).toBe('TRUST_FOLDER');
986
- });
987
- describe.each([true, false])('with previous extension config: %s', (isUpdate) => {
988
- let sourceExtDir;
989
- beforeEach(async () => {
990
- sourceExtDir = createExtension({
991
- extensionsDir: tempHomeDir,
992
- name: 'my-local-extension',
993
- version: '1.1.0',
994
- });
995
- await extensionManager.loadExtensions();
996
- if (isUpdate) {
997
- await extensionManager.installOrUpdateExtension({
998
- source: sourceExtDir,
999
- type: 'local',
1000
- });
1001
- }
1002
- // Clears out any calls to mocks from the above function calls.
1003
- vi.clearAllMocks();
1004
- });
1005
- it(`should log an ${isUpdate ? 'update' : 'install'} event to clearcut on success`, async () => {
1006
- await extensionManager.installOrUpdateExtension({ source: sourceExtDir, type: 'local' }, isUpdate
1007
- ? {
1008
- name: 'my-local-extension',
1009
- version: '1.0.0',
1010
- }
1011
- : undefined);
1012
- if (isUpdate) {
1013
- expect(mockLogExtensionUpdateEvent).toHaveBeenCalled();
1014
- expect(mockLogExtensionInstallEvent).not.toHaveBeenCalled();
1015
- }
1016
- else {
1017
- expect(mockLogExtensionInstallEvent).toHaveBeenCalled();
1018
- expect(mockLogExtensionUpdateEvent).not.toHaveBeenCalled();
1019
- }
1020
- });
1021
- it(`should ${isUpdate ? 'not ' : ''} alter the extension enablement configuration`, async () => {
1022
- const enablementManager = new ExtensionEnablementManager();
1023
- enablementManager.enable('my-local-extension', true, '/some/scope');
1024
- await extensionManager.installOrUpdateExtension({ source: sourceExtDir, type: 'local' }, isUpdate
1025
- ? {
1026
- name: 'my-local-extension',
1027
- version: '1.0.0',
1028
- }
1029
- : undefined);
1030
- const config = enablementManager.readConfig()['my-local-extension'];
1031
- if (isUpdate) {
1032
- expect(config).not.toBeUndefined();
1033
- expect(config.overrides).toContain('/some/scope/*');
1034
- }
1035
- else {
1036
- expect(config).not.toContain('/some/scope/*');
1037
- }
1038
- });
1039
- });
1040
- it('should show users information on their ansi escaped mcp servers when installing', async () => {
1041
- const sourceExtDir = createExtension({
1042
- extensionsDir: tempHomeDir,
1043
- name: 'my-local-extension',
1044
- version: '1.0.0',
1045
- mcpServers: {
1046
- 'test-server': {
1047
- command: 'node dobadthing \u001b[12D\u001b[K',
1048
- args: ['server.js'],
1049
- description: 'a local mcp server',
1050
- },
1051
- 'test-server-2': {
1052
- description: 'a remote mcp server',
1053
- httpUrl: 'https://google.com',
1054
- },
1055
- },
1056
- });
1057
- await extensionManager.loadExtensions();
1058
- await expect(extensionManager.installOrUpdateExtension({
1059
- source: sourceExtDir,
1060
- type: 'local',
1061
- })).resolves.toMatchObject({
1062
- name: 'my-local-extension',
1063
- });
1064
- expect(mockRequestConsent).toHaveBeenCalledWith(`Installing extension "my-local-extension".
1065
- This extension will run the following MCP servers:
1066
- * test-server (local): node dobadthing \\u001b[12D\\u001b[K server.js
1067
- * test-server-2 (remote): https://google.com
1068
-
1069
- ${INSTALL_WARNING_MESSAGE}`);
1070
- });
1071
- it('should continue installation if user accepts prompt for local extension with mcp servers', async () => {
1072
- const sourceExtDir = createExtension({
1073
- extensionsDir: tempHomeDir,
1074
- name: 'my-local-extension',
1075
- version: '1.0.0',
1076
- mcpServers: {
1077
- 'test-server': {
1078
- command: 'node',
1079
- args: ['server.js'],
1080
- },
1081
- },
1082
- });
1083
- await extensionManager.loadExtensions();
1084
- await expect(extensionManager.installOrUpdateExtension({
1085
- source: sourceExtDir,
1086
- type: 'local',
1087
- })).resolves.toMatchObject({ name: 'my-local-extension' });
1088
- });
1089
- it('should cancel installation if user declines prompt for local extension with mcp servers', async () => {
1090
- const sourceExtDir = createExtension({
1091
- extensionsDir: tempHomeDir,
1092
- name: 'my-local-extension',
1093
- version: '1.0.0',
1094
- mcpServers: {
1095
- 'test-server': {
1096
- command: 'node',
1097
- args: ['server.js'],
1098
- },
1099
- },
1100
- });
1101
- mockRequestConsent.mockResolvedValue(false);
1102
- await extensionManager.loadExtensions();
1103
- await expect(extensionManager.installOrUpdateExtension({
1104
- source: sourceExtDir,
1105
- type: 'local',
1106
- })).rejects.toThrow('Installation cancelled for "my-local-extension".');
1107
- });
1108
- it('should save the autoUpdate flag to the install metadata', async () => {
1109
- const sourceExtDir = createExtension({
1110
- extensionsDir: tempHomeDir,
1111
- name: 'my-local-extension',
1112
- version: '1.0.0',
1113
- });
1114
- const targetExtDir = path.join(userExtensionsDir, 'my-local-extension');
1115
- const metadataPath = path.join(targetExtDir, INSTALL_METADATA_FILENAME);
1116
- await extensionManager.loadExtensions();
1117
- await extensionManager.installOrUpdateExtension({
1118
- source: sourceExtDir,
1119
- type: 'local',
1120
- autoUpdate: true,
1121
- });
1122
- expect(fs.existsSync(targetExtDir)).toBe(true);
1123
- expect(fs.existsSync(metadataPath)).toBe(true);
1124
- const metadata = JSON.parse(fs.readFileSync(metadataPath, 'utf-8'));
1125
- expect(metadata).toEqual({
1126
- source: sourceExtDir,
1127
- type: 'local',
1128
- autoUpdate: true,
1129
- });
1130
- fs.rmSync(targetExtDir, { recursive: true, force: true });
1131
- });
1132
- it('should ignore consent flow if not required', async () => {
1133
- const sourceExtDir = createExtension({
1134
- extensionsDir: tempHomeDir,
1135
- name: 'my-local-extension',
1136
- version: '1.0.0',
1137
- mcpServers: {
1138
- 'test-server': {
1139
- command: 'node',
1140
- args: ['server.js'],
1141
- },
1142
- },
1143
- });
1144
- await extensionManager.loadExtensions();
1145
- // Install it with hard coded consent first.
1146
- await extensionManager.installOrUpdateExtension({
1147
- source: sourceExtDir,
1148
- type: 'local',
1149
- });
1150
- expect(mockRequestConsent).toHaveBeenCalledOnce();
1151
- // Now update it without changing anything.
1152
- await expect(extensionManager.installOrUpdateExtension({ source: sourceExtDir, type: 'local' },
1153
- // Provide its own existing config as the previous config.
1154
- await extensionManager.loadExtensionConfig(sourceExtDir))).resolves.toMatchObject({ name: 'my-local-extension' });
1155
- // Still only called once
1156
- expect(mockRequestConsent).toHaveBeenCalledOnce();
1157
- });
1158
- it('should prompt for settings if promptForSettings', async () => {
1159
- const sourceExtDir = createExtension({
1160
- extensionsDir: tempHomeDir,
1161
- name: 'my-local-extension',
1162
- version: '1.0.0',
1163
- settings: [
1164
- {
1165
- name: 'API Key',
1166
- description: 'Your API key for the service.',
1167
- envVar: 'MY_API_KEY',
1168
- },
1169
- ],
1170
- });
1171
- await extensionManager.loadExtensions();
1172
- await extensionManager.installOrUpdateExtension({
1173
- source: sourceExtDir,
1174
- type: 'local',
1175
- });
1176
- expect(mockPromptForSettings).toHaveBeenCalled();
1177
- });
1178
- it('should not prompt for settings if promptForSettings is false', async () => {
1179
- const sourceExtDir = createExtension({
1180
- extensionsDir: tempHomeDir,
1181
- name: 'my-local-extension',
1182
- version: '1.0.0',
1183
- settings: [
1184
- {
1185
- name: 'API Key',
1186
- description: 'Your API key for the service.',
1187
- envVar: 'MY_API_KEY',
1188
- },
1189
- ],
1190
- });
1191
- extensionManager = new ExtensionManager({
1192
- workspaceDir: tempWorkspaceDir,
1193
- requestConsent: mockRequestConsent,
1194
- requestSetting: null,
1195
- settings: loadSettings(tempWorkspaceDir).merged,
1196
- });
1197
- await extensionManager.loadExtensions();
1198
- await extensionManager.installOrUpdateExtension({
1199
- source: sourceExtDir,
1200
- type: 'local',
1201
- });
1202
- });
1203
- it('should only prompt for new settings on update, and preserve old settings', async () => {
1204
- // 1. Create and install the "old" version of the extension.
1205
- const oldSourceExtDir = createExtension({
1206
- extensionsDir: tempHomeDir, // Create it in a temp location first
1207
- name: 'my-local-extension',
1208
- version: '1.0.0',
1209
- settings: [
1210
- {
1211
- name: 'API Key',
1212
- description: 'Your API key for the service.',
1213
- envVar: 'MY_API_KEY',
1214
- },
1215
- ],
1216
- });
1217
- mockPromptForSettings.mockResolvedValueOnce('old-api-key');
1218
- await extensionManager.loadExtensions();
1219
- // Install it so it exists in the userExtensionsDir
1220
- await extensionManager.installOrUpdateExtension({
1221
- source: oldSourceExtDir,
1222
- type: 'local',
1223
- });
1224
- const envPath = new ExtensionStorage('my-local-extension').getEnvFilePath();
1225
- expect(fs.existsSync(envPath)).toBe(true);
1226
- let envContent = fs.readFileSync(envPath, 'utf-8');
1227
- expect(envContent).toContain('MY_API_KEY=old-api-key');
1228
- expect(mockPromptForSettings).toHaveBeenCalledTimes(1);
1229
- // 2. Create the "new" version of the extension in a new source directory.
1230
- const newSourceExtDir = createExtension({
1231
- extensionsDir: path.join(tempHomeDir, 'new-source'), // Another temp location
1232
- name: 'my-local-extension', // Same name
1233
- version: '1.1.0', // New version
1234
- settings: [
1235
- {
1236
- name: 'API Key',
1237
- description: 'Your API key for the service.',
1238
- envVar: 'MY_API_KEY',
1239
- },
1240
- {
1241
- name: 'New Setting',
1242
- description: 'A new setting.',
1243
- envVar: 'NEW_SETTING',
1244
- },
1245
- ],
1246
- });
1247
- const previousExtensionConfig = await extensionManager.loadExtensionConfig(path.join(userExtensionsDir, 'my-local-extension'));
1248
- mockPromptForSettings.mockResolvedValueOnce('new-setting-value');
1249
- // 3. Call installOrUpdateExtension to perform the update.
1250
- await extensionManager.installOrUpdateExtension({ source: newSourceExtDir, type: 'local' }, previousExtensionConfig);
1251
- expect(mockPromptForSettings).toHaveBeenCalledTimes(2);
1252
- expect(mockPromptForSettings).toHaveBeenCalledWith(expect.objectContaining({ name: 'New Setting' }));
1253
- expect(fs.existsSync(envPath)).toBe(true);
1254
- envContent = fs.readFileSync(envPath, 'utf-8');
1255
- expect(envContent).toContain('MY_API_KEY=old-api-key');
1256
- expect(envContent).toContain('NEW_SETTING=new-setting-value');
1257
- });
1258
- it('should auto-update if settings have changed', async () => {
1259
- // 1. Install initial version with autoUpdate: true
1260
- const oldSourceExtDir = createExtension({
1261
- extensionsDir: tempHomeDir,
1262
- name: 'my-auto-update-ext',
1263
- version: '1.0.0',
1264
- settings: [
1265
- {
1266
- name: 'OLD_SETTING',
1267
- envVar: 'OLD_SETTING',
1268
- description: 'An old setting',
1269
- },
1270
- ],
1271
- });
1272
- await extensionManager.loadExtensions();
1273
- await extensionManager.installOrUpdateExtension({
1274
- source: oldSourceExtDir,
1275
- type: 'local',
1276
- autoUpdate: true,
1277
- });
1278
- // 2. Create new version with different settings
1279
- const extensionDir = createExtension({
1280
- extensionsDir: tempHomeDir,
1281
- name: 'my-auto-update-ext',
1282
- version: '1.1.0',
1283
- settings: [
1284
- {
1285
- name: 'NEW_SETTING',
1286
- envVar: 'NEW_SETTING',
1287
- description: 'A new setting',
1288
- },
1289
- ],
1290
- });
1291
- const previousExtensionConfig = await extensionManager.loadExtensionConfig(path.join(userExtensionsDir, 'my-auto-update-ext'));
1292
- // 3. Attempt to update and assert it fails
1293
- const updatedExtension = await extensionManager.installOrUpdateExtension({
1294
- source: extensionDir,
1295
- type: 'local',
1296
- autoUpdate: true,
1297
- }, previousExtensionConfig);
1298
- expect(updatedExtension.version).toBe('1.1.0');
1299
- expect(extensionManager.getExtensions()[0].version).toBe('1.1.0');
1300
- });
1301
- it('should throw an error for invalid extension names', async () => {
1302
- const sourceExtDir = createExtension({
1303
- extensionsDir: tempHomeDir,
1304
- name: 'bad_name',
1305
- version: '1.0.0',
1306
- });
1307
- await expect(extensionManager.installOrUpdateExtension({
1308
- source: sourceExtDir,
1309
- type: 'local',
1310
- })).rejects.toThrow('Invalid extension name: "bad_name"');
1311
- });
1312
- describe('installing from github', () => {
1313
- const gitUrl = 'https://github.com/google/gemini-test-extension.git';
1314
- const extensionName = 'gemini-test-extension';
1315
- beforeEach(() => {
1316
- // Mock the git clone behavior for github installs that fallback to it.
1317
- mockGit.clone.mockImplementation(async (_, destination) => {
1318
- fs.mkdirSync(path.join(mockGit.path(), destination), {
1319
- recursive: true,
1320
- });
1321
- fs.writeFileSync(path.join(mockGit.path(), destination, EXTENSIONS_CONFIG_FILENAME), JSON.stringify({ name: extensionName, version: '1.0.0' }));
1322
- });
1323
- mockGit.getRemotes.mockResolvedValue([{ name: 'origin' }]);
1324
- });
1325
- afterEach(() => {
1326
- vi.restoreAllMocks();
1327
- });
1328
- it('should install from a github release successfully', async () => {
1329
- const targetExtDir = path.join(userExtensionsDir, extensionName);
1330
- mockDownloadFromGithubRelease.mockResolvedValue({
1331
- success: true,
1332
- tagName: 'v1.0.0',
1333
- type: 'github-release',
1334
- });
1335
- const tempDir = path.join(tempHomeDir, 'temp-ext');
1336
- fs.mkdirSync(tempDir, { recursive: true });
1337
- createExtension({
1338
- extensionsDir: tempDir,
1339
- name: extensionName,
1340
- version: '1.0.0',
1341
- });
1342
- vi.spyOn(ExtensionStorage, 'createTmpDir').mockResolvedValue(join(tempDir, extensionName));
1343
- await extensionManager.loadExtensions();
1344
- await extensionManager.installOrUpdateExtension({
1345
- source: gitUrl,
1346
- type: 'github-release',
1347
- });
1348
- expect(fs.existsSync(targetExtDir)).toBe(true);
1349
- const metadataPath = path.join(targetExtDir, INSTALL_METADATA_FILENAME);
1350
- expect(fs.existsSync(metadataPath)).toBe(true);
1351
- const metadata = JSON.parse(fs.readFileSync(metadataPath, 'utf-8'));
1352
- expect(metadata).toEqual({
1353
- source: gitUrl,
1354
- type: 'github-release',
1355
- releaseTag: 'v1.0.0',
1356
- });
1357
- });
1358
- it('should fallback to git clone if github release download fails and user consents', async () => {
1359
- mockDownloadFromGithubRelease.mockResolvedValue({
1360
- success: false,
1361
- failureReason: 'failed to download asset',
1362
- errorMessage: 'download failed',
1363
- type: 'github-release',
1364
- });
1365
- await extensionManager.loadExtensions();
1366
- await extensionManager.installOrUpdateExtension({ source: gitUrl, type: 'github-release' });
1367
- // It gets called once to ask for a git clone, and once to consent to
1368
- // the actual extension features.
1369
- expect(mockRequestConsent).toHaveBeenCalledTimes(2);
1370
- expect(mockRequestConsent).toHaveBeenCalledWith(expect.stringContaining('Would you like to attempt to install via "git clone" instead?'));
1371
- expect(mockGit.clone).toHaveBeenCalled();
1372
- const metadataPath = path.join(userExtensionsDir, extensionName, INSTALL_METADATA_FILENAME);
1373
- const metadata = JSON.parse(fs.readFileSync(metadataPath, 'utf-8'));
1374
- expect(metadata.type).toBe('git');
1375
- });
1376
- it('should throw an error if github release download fails and user denies consent', async () => {
1377
- mockDownloadFromGithubRelease.mockResolvedValue({
1378
- success: false,
1379
- errorMessage: 'download failed',
1380
- type: 'github-release',
1381
- });
1382
- mockRequestConsent.mockResolvedValue(false);
1383
- await extensionManager.loadExtensions();
1384
- await expect(extensionManager.installOrUpdateExtension({
1385
- source: gitUrl,
1386
- type: 'github-release',
1387
- })).rejects.toThrow(`Failed to install extension ${gitUrl}: download failed`);
1388
- expect(mockRequestConsent).toHaveBeenCalledExactlyOnceWith(expect.stringContaining('Would you like to attempt to install via "git clone" instead?'));
1389
- expect(mockGit.clone).not.toHaveBeenCalled();
1390
- });
1391
- it('should fallback to git clone without consent if no release data is found on first install', async () => {
1392
- mockDownloadFromGithubRelease.mockResolvedValue({
1393
- success: false,
1394
- failureReason: 'no release data',
1395
- type: 'github-release',
1396
- });
1397
- await extensionManager.loadExtensions();
1398
- await extensionManager.installOrUpdateExtension({
1399
- source: gitUrl,
1400
- type: 'git',
1401
- });
1402
- // We should not see the request to use git clone, this is a repo that
1403
- // has no github releases so it is the only install method.
1404
- expect(mockRequestConsent).toHaveBeenCalledExactlyOnceWith(expect.stringContaining('Installing extension "gemini-test-extension"'));
1405
- expect(mockGit.clone).toHaveBeenCalled();
1406
- const metadataPath = path.join(userExtensionsDir, extensionName, INSTALL_METADATA_FILENAME);
1407
- const metadata = JSON.parse(fs.readFileSync(metadataPath, 'utf-8'));
1408
- expect(metadata.type).toBe('git');
1409
- });
1410
- it('should ask for consent if no release data is found for an existing github-release extension', async () => {
1411
- mockDownloadFromGithubRelease.mockResolvedValue({
1412
- success: false,
1413
- failureReason: 'no release data',
1414
- errorMessage: 'No release data found',
1415
- type: 'github-release',
1416
- });
1417
- await extensionManager.loadExtensions();
1418
- await extensionManager.installOrUpdateExtension({ source: gitUrl, type: 'github-release' });
1419
- expect(mockRequestConsent).toHaveBeenCalledWith(expect.stringContaining('Would you like to attempt to install via "git clone" instead?'));
1420
- expect(mockGit.clone).toHaveBeenCalled();
1421
- });
1422
- });
1423
- });
1424
- describe('uninstallExtension', () => {
1425
- it('should uninstall an extension by name', async () => {
1426
- const sourceExtDir = createExtension({
1427
- extensionsDir: userExtensionsDir,
1428
- name: 'my-local-extension',
1429
- version: '1.0.0',
1430
- });
1431
- await extensionManager.loadExtensions();
1432
- await extensionManager.uninstallExtension('my-local-extension', false);
1433
- expect(fs.existsSync(sourceExtDir)).toBe(false);
1434
- });
1435
- it('should uninstall an extension by name and retain existing extensions', async () => {
1436
- const sourceExtDir = createExtension({
1437
- extensionsDir: userExtensionsDir,
1438
- name: 'my-local-extension',
1439
- version: '1.0.0',
1440
- });
1441
- const otherExtDir = createExtension({
1442
- extensionsDir: userExtensionsDir,
1443
- name: 'other-extension',
1444
- version: '1.0.0',
1445
- });
1446
- await extensionManager.loadExtensions();
1447
- await extensionManager.uninstallExtension('my-local-extension', false);
1448
- expect(fs.existsSync(sourceExtDir)).toBe(false);
1449
- expect(extensionManager.getExtensions()).toHaveLength(1);
1450
- expect(fs.existsSync(otherExtDir)).toBe(true);
1451
- });
1452
- it('should uninstall an extension on non-matching extension directory name', async () => {
1453
- // Create an extension with a name that differs from the directory name.
1454
- const sourceExtDir = createExtension({
1455
- extensionsDir: userExtensionsDir,
1456
- name: 'My-Local-Extension',
1457
- version: '1.0.0',
1458
- });
1459
- const newSourceExtDir = path.join(userExtensionsDir, 'my-local-extension');
1460
- fs.renameSync(sourceExtDir, newSourceExtDir);
1461
- const otherExtDir = createExtension({
1462
- extensionsDir: userExtensionsDir,
1463
- name: 'other-extension',
1464
- version: '1.0.0',
1465
- });
1466
- await extensionManager.loadExtensions();
1467
- await extensionManager.uninstallExtension('my-local-extension', false);
1468
- expect(fs.existsSync(sourceExtDir)).toBe(false);
1469
- expect(fs.existsSync(newSourceExtDir)).toBe(false);
1470
- expect(extensionManager.getExtensions()).toHaveLength(1);
1471
- expect(fs.existsSync(otherExtDir)).toBe(true);
1472
- });
1473
- it('should throw an error if the extension does not exist', async () => {
1474
- await extensionManager.loadExtensions();
1475
- await expect(extensionManager.uninstallExtension('nonexistent-extension', false)).rejects.toThrow('Extension not found.');
1476
- });
1477
- describe.each([true, false])('with isUpdate: %s', (isUpdate) => {
1478
- it(`should ${isUpdate ? 'not ' : ''}log uninstall event`, async () => {
1479
- createExtension({
1480
- extensionsDir: userExtensionsDir,
1481
- name: 'my-local-extension',
1482
- version: '1.0.0',
1483
- installMetadata: {
1484
- source: userExtensionsDir,
1485
- type: 'local',
1486
- },
1487
- });
1488
- await extensionManager.loadExtensions();
1489
- await extensionManager.uninstallExtension('my-local-extension', isUpdate);
1490
- if (isUpdate) {
1491
- expect(mockLogExtensionUninstall).not.toHaveBeenCalled();
1492
- expect(ExtensionUninstallEvent).not.toHaveBeenCalled();
1493
- }
1494
- else {
1495
- expect(mockLogExtensionUninstall).toHaveBeenCalled();
1496
- expect(ExtensionUninstallEvent).toHaveBeenCalledWith('my-local-extension', hashValue('my-local-extension'), hashValue(userExtensionsDir), 'success');
1497
- }
1498
- });
1499
- it(`should ${isUpdate ? 'not ' : ''} alter the extension enablement configuration`, async () => {
1500
- createExtension({
1501
- extensionsDir: userExtensionsDir,
1502
- name: 'test-extension',
1503
- version: '1.0.0',
1504
- });
1505
- const enablementManager = new ExtensionEnablementManager();
1506
- enablementManager.enable('test-extension', true, '/some/scope');
1507
- await extensionManager.loadExtensions();
1508
- await extensionManager.uninstallExtension('test-extension', isUpdate);
1509
- const config = enablementManager.readConfig()['test-extension'];
1510
- if (isUpdate) {
1511
- expect(config).not.toBeUndefined();
1512
- expect(config.overrides).toEqual(['/some/scope/*']);
1513
- }
1514
- else {
1515
- expect(config).toBeUndefined();
1516
- }
1517
- });
1518
- });
1519
- it('should uninstall an extension by its source URL', async () => {
1520
- const gitUrl = 'https://github.com/google/gemini-sql-extension.git';
1521
- const sourceExtDir = createExtension({
1522
- extensionsDir: userExtensionsDir,
1523
- name: 'gemini-sql-extension',
1524
- version: '1.0.0',
1525
- installMetadata: {
1526
- source: gitUrl,
1527
- type: 'git',
1528
- },
1529
- });
1530
- await extensionManager.loadExtensions();
1531
- await extensionManager.uninstallExtension(gitUrl, false);
1532
- expect(fs.existsSync(sourceExtDir)).toBe(false);
1533
- expect(mockLogExtensionUninstall).toHaveBeenCalled();
1534
- expect(ExtensionUninstallEvent).toHaveBeenCalledWith('gemini-sql-extension', hashValue('gemini-sql-extension'), hashValue('https://github.com/google/gemini-sql-extension'), 'success');
1535
- });
1536
- it('should fail to uninstall by URL if an extension has no install metadata', async () => {
1537
- createExtension({
1538
- extensionsDir: userExtensionsDir,
1539
- name: 'no-metadata-extension',
1540
- version: '1.0.0',
1541
- // No installMetadata provided
1542
- });
1543
- await extensionManager.loadExtensions();
1544
- await expect(extensionManager.uninstallExtension('https://github.com/google/no-metadata-extension', false)).rejects.toThrow('Extension not found.');
1545
- });
1546
- });
1547
- describe('disableExtension', () => {
1548
- it('should disable an extension at the user scope', async () => {
1549
- createExtension({
1550
- extensionsDir: userExtensionsDir,
1551
- name: 'my-extension',
1552
- version: '1.0.0',
1553
- });
1554
- await extensionManager.loadExtensions();
1555
- await extensionManager.disableExtension('my-extension', SettingScope.User);
1556
- expect(isEnabled({
1557
- name: 'my-extension',
1558
- enabledForPath: tempWorkspaceDir,
1559
- })).toBe(false);
1560
- });
1561
- it('should disable an extension at the workspace scope', async () => {
1562
- createExtension({
1563
- extensionsDir: userExtensionsDir,
1564
- name: 'my-extension',
1565
- version: '1.0.0',
1566
- });
1567
- await extensionManager.loadExtensions();
1568
- await extensionManager.disableExtension('my-extension', SettingScope.Workspace);
1569
- expect(isEnabled({
1570
- name: 'my-extension',
1571
- enabledForPath: tempHomeDir,
1572
- })).toBe(true);
1573
- expect(isEnabled({
1574
- name: 'my-extension',
1575
- enabledForPath: tempWorkspaceDir,
1576
- })).toBe(false);
1577
- });
1578
- it('should handle disabling the same extension twice', async () => {
1579
- createExtension({
1580
- extensionsDir: userExtensionsDir,
1581
- name: 'my-extension',
1582
- version: '1.0.0',
1583
- });
1584
- await extensionManager.loadExtensions();
1585
- await extensionManager.disableExtension('my-extension', SettingScope.User);
1586
- await extensionManager.disableExtension('my-extension', SettingScope.User);
1587
- expect(isEnabled({
1588
- name: 'my-extension',
1589
- enabledForPath: tempWorkspaceDir,
1590
- })).toBe(false);
1591
- });
1592
- it('should throw an error if you request system scope', async () => {
1593
- await expect(async () => extensionManager.disableExtension('my-extension', SettingScope.System)).rejects.toThrow('System and SystemDefaults scopes are not supported.');
1594
- });
1595
- it('should log a disable event', async () => {
1596
- createExtension({
1597
- extensionsDir: userExtensionsDir,
1598
- name: 'ext1',
1599
- version: '1.0.0',
1600
- installMetadata: {
1601
- source: userExtensionsDir,
1602
- type: 'local',
1603
- },
1604
- });
1605
- await extensionManager.loadExtensions();
1606
- await extensionManager.disableExtension('ext1', SettingScope.Workspace);
1607
- expect(mockLogExtensionDisable).toHaveBeenCalled();
1608
- expect(ExtensionDisableEvent).toHaveBeenCalledWith('ext1', hashValue('ext1'), hashValue(userExtensionsDir), SettingScope.Workspace);
1609
- });
1610
- });
1611
- describe('enableExtension', () => {
1612
- afterAll(() => {
1613
- vi.restoreAllMocks();
1614
- });
1615
- const getActiveExtensions = () => {
1616
- const extensions = extensionManager.getExtensions();
1617
- return extensions.filter((e) => e.isActive);
1618
- };
1619
- it('should enable an extension at the user scope', async () => {
1620
- createExtension({
1621
- extensionsDir: userExtensionsDir,
1622
- name: 'ext1',
1623
- version: '1.0.0',
1624
- });
1625
- await extensionManager.loadExtensions();
1626
- await extensionManager.disableExtension('ext1', SettingScope.User);
1627
- let activeExtensions = getActiveExtensions();
1628
- expect(activeExtensions).toHaveLength(0);
1629
- await extensionManager.enableExtension('ext1', SettingScope.User);
1630
- activeExtensions = getActiveExtensions();
1631
- expect(activeExtensions).toHaveLength(1);
1632
- expect(activeExtensions[0].name).toBe('ext1');
1633
- });
1634
- it('should enable an extension at the workspace scope', async () => {
1635
- createExtension({
1636
- extensionsDir: userExtensionsDir,
1637
- name: 'ext1',
1638
- version: '1.0.0',
1639
- });
1640
- await extensionManager.loadExtensions();
1641
- await extensionManager.disableExtension('ext1', SettingScope.Workspace);
1642
- let activeExtensions = getActiveExtensions();
1643
- expect(activeExtensions).toHaveLength(0);
1644
- await extensionManager.enableExtension('ext1', SettingScope.Workspace);
1645
- activeExtensions = getActiveExtensions();
1646
- expect(activeExtensions).toHaveLength(1);
1647
- expect(activeExtensions[0].name).toBe('ext1');
1648
- });
1649
- it('should log an enable event', async () => {
1650
- createExtension({
1651
- extensionsDir: userExtensionsDir,
1652
- name: 'ext1',
1653
- version: '1.0.0',
1654
- installMetadata: {
1655
- source: userExtensionsDir,
1656
- type: 'local',
1657
- },
1658
- });
1659
- await extensionManager.loadExtensions();
1660
- await extensionManager.disableExtension('ext1', SettingScope.Workspace);
1661
- await extensionManager.enableExtension('ext1', SettingScope.Workspace);
1662
- expect(mockLogExtensionEnable).toHaveBeenCalled();
1663
- expect(ExtensionEnableEvent).toHaveBeenCalledWith('ext1', hashValue('ext1'), hashValue(userExtensionsDir), SettingScope.Workspace);
1664
- });
1665
- });
1666
- });
1667
- function isEnabled(options) {
1668
- const manager = new ExtensionEnablementManager();
1669
- return manager.isEnabled(options.name, options.enabledForPath);
1670
- }
1671
- //# sourceMappingURL=extension.test.js.map