@rdmind/rdmind 0.0.15-alpha.0 → 0.0.15-alpha.2

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 (774) hide show
  1. package/dist/package.json +15 -10
  2. package/dist/src/commands/extensions/disable.d.ts +2 -3
  3. package/dist/src/commands/extensions/disable.js +20 -6
  4. package/dist/src/commands/extensions/disable.js.map +1 -1
  5. package/dist/src/commands/extensions/enable.d.ts +2 -3
  6. package/dist/src/commands/extensions/enable.js +21 -10
  7. package/dist/src/commands/extensions/enable.js.map +1 -1
  8. package/dist/src/commands/extensions/examples/context/QWEN.md +8 -0
  9. package/dist/src/commands/extensions/examples/context/qwen-extension.json +4 -0
  10. package/dist/src/commands/extensions/examples/custom-commands/commands/fs/grep-code.toml +6 -0
  11. package/dist/src/commands/extensions/examples/custom-commands/qwen-extension.json +4 -0
  12. package/dist/src/commands/extensions/examples/exclude-tools/qwen-extension.json +5 -0
  13. package/dist/src/commands/extensions/examples/mcp-server/example.ts +60 -0
  14. package/dist/src/commands/extensions/examples/mcp-server/package.json +18 -0
  15. package/dist/src/commands/extensions/examples/mcp-server/qwen-extension.json +11 -0
  16. package/dist/src/commands/extensions/examples/mcp-server/tsconfig.json +13 -0
  17. package/dist/src/commands/extensions/install.d.ts +3 -2
  18. package/dist/src/commands/extensions/install.js +47 -17
  19. package/dist/src/commands/extensions/install.js.map +1 -1
  20. package/dist/src/commands/extensions/install.test.js +86 -9
  21. package/dist/src/commands/extensions/install.test.js.map +1 -1
  22. package/dist/src/commands/extensions/link.d.ts +12 -0
  23. package/dist/src/commands/extensions/link.js +37 -0
  24. package/dist/src/commands/extensions/link.js.map +1 -0
  25. package/dist/src/commands/extensions/list.js +1 -1
  26. package/dist/src/commands/extensions/list.js.map +1 -1
  27. package/dist/src/commands/extensions/new.d.ts +7 -0
  28. package/dist/src/commands/extensions/new.js +90 -0
  29. package/dist/src/commands/extensions/new.js.map +1 -0
  30. package/dist/src/commands/extensions/new.test.js +59 -0
  31. package/dist/src/commands/extensions/new.test.js.map +1 -0
  32. package/dist/src/commands/extensions/uninstall.js +1 -1
  33. package/dist/src/commands/extensions/uninstall.js.map +1 -1
  34. package/dist/src/commands/extensions/uninstall.test.js +2 -2
  35. package/dist/src/commands/extensions/uninstall.test.js.map +1 -1
  36. package/dist/src/commands/extensions/update.d.ts +2 -1
  37. package/dist/src/commands/extensions/update.js +80 -14
  38. package/dist/src/commands/extensions/update.js.map +1 -1
  39. package/dist/src/commands/extensions.js +4 -0
  40. package/dist/src/commands/extensions.js.map +1 -1
  41. package/dist/src/commands/mcp/add.js +6 -1
  42. package/dist/src/commands/mcp/add.js.map +1 -1
  43. package/dist/src/commands/mcp/list.js +4 -3
  44. package/dist/src/commands/mcp/list.js.map +1 -1
  45. package/dist/src/commands/mcp/remove.js +1 -1
  46. package/dist/src/commands/mcp/remove.js.map +1 -1
  47. package/dist/src/config/auth.d.ts +1 -1
  48. package/dist/src/config/auth.js +4 -4
  49. package/dist/src/config/auth.js.map +1 -1
  50. package/dist/src/config/auth.test.js +15 -7
  51. package/dist/src/config/auth.test.js.map +1 -1
  52. package/dist/src/config/config.d.ts +7 -2
  53. package/dist/src/config/config.js +178 -122
  54. package/dist/src/config/config.js.map +1 -1
  55. package/dist/src/config/extension.d.ts +39 -16
  56. package/dist/src/config/extension.js +349 -192
  57. package/dist/src/config/extension.js.map +1 -1
  58. package/dist/src/config/extensions/extensionEnablement.d.ts +47 -0
  59. package/dist/src/config/extensions/extensionEnablement.js +189 -0
  60. package/dist/src/config/extensions/extensionEnablement.js.map +1 -0
  61. package/dist/src/{ui/components/ModelSelectionDialog.test.d.ts → config/extensions/extensionEnablement.test.d.ts} +1 -1
  62. package/dist/src/config/extensions/extensionEnablement.test.js +333 -0
  63. package/dist/src/config/extensions/extensionEnablement.test.js.map +1 -0
  64. package/dist/src/config/extensions/github.d.ts +30 -0
  65. package/dist/src/config/extensions/github.js +322 -0
  66. package/dist/src/config/extensions/github.js.map +1 -0
  67. package/dist/src/config/extensions/github.test.d.ts +6 -0
  68. package/dist/src/config/extensions/github.test.js +334 -0
  69. package/dist/src/config/extensions/github.test.js.map +1 -0
  70. package/dist/src/config/extensions/update.d.ts +19 -0
  71. package/dist/src/config/extensions/update.js +113 -0
  72. package/dist/src/config/extensions/update.js.map +1 -0
  73. package/dist/src/config/extensions/update.test.d.ts +6 -0
  74. package/dist/src/config/extensions/update.test.js +342 -0
  75. package/dist/src/config/extensions/update.test.js.map +1 -0
  76. package/dist/src/config/extensions/variableSchema.d.ts +8 -0
  77. package/dist/src/config/extensions/variableSchema.js +4 -0
  78. package/dist/src/config/extensions/variableSchema.js.map +1 -1
  79. package/dist/src/config/keyBindings.d.ts +5 -1
  80. package/dist/src/config/keyBindings.js +14 -25
  81. package/dist/src/config/keyBindings.js.map +1 -1
  82. package/dist/src/config/settings.d.ts +8 -5
  83. package/dist/src/config/settings.js +178 -275
  84. package/dist/src/config/settings.js.map +1 -1
  85. package/dist/src/config/settingsSchema.d.ts +332 -141
  86. package/dist/src/config/settingsSchema.js +321 -153
  87. package/dist/src/config/settingsSchema.js.map +1 -1
  88. package/dist/src/config/settingsSchema.test.js +64 -57
  89. package/dist/src/config/settingsSchema.test.js.map +1 -1
  90. package/dist/src/config/trustedFolders.d.ts +23 -4
  91. package/dist/src/config/trustedFolders.js +97 -47
  92. package/dist/src/config/trustedFolders.js.map +1 -1
  93. package/dist/src/config/trustedFolders.test.js +196 -20
  94. package/dist/src/config/trustedFolders.test.js.map +1 -1
  95. package/dist/src/core/auth.d.ts +13 -0
  96. package/dist/src/core/auth.js +27 -0
  97. package/dist/src/core/auth.js.map +1 -0
  98. package/dist/src/core/initializer.d.ts +21 -0
  99. package/dist/src/core/initializer.js +33 -0
  100. package/dist/src/core/initializer.js.map +1 -0
  101. package/dist/src/core/theme.d.ts +12 -0
  102. package/dist/src/core/theme.js +20 -0
  103. package/dist/src/core/theme.js.map +1 -0
  104. package/dist/src/gemini.d.ts +3 -2
  105. package/dist/src/gemini.js +156 -128
  106. package/dist/src/gemini.js.map +1 -1
  107. package/dist/src/gemini.test.js +190 -47
  108. package/dist/src/gemini.test.js.map +1 -1
  109. package/dist/src/generated/git-commit.d.ts +2 -2
  110. package/dist/src/generated/git-commit.js +2 -2
  111. package/dist/src/nonInteractiveCli.d.ts +2 -1
  112. package/dist/src/nonInteractiveCli.js +101 -72
  113. package/dist/src/nonInteractiveCli.js.map +1 -1
  114. package/dist/src/nonInteractiveCliCommands.d.ts +17 -0
  115. package/dist/src/nonInteractiveCliCommands.js +79 -0
  116. package/dist/src/nonInteractiveCliCommands.js.map +1 -0
  117. package/dist/src/services/BuiltinCommandLoader.js +1 -1
  118. package/dist/src/services/BuiltinCommandLoader.js.map +1 -1
  119. package/dist/src/services/BuiltinCommandLoader.test.js +30 -18
  120. package/dist/src/services/BuiltinCommandLoader.test.js.map +1 -1
  121. package/dist/src/services/FileCommandLoader.d.ts +2 -0
  122. package/dist/src/services/FileCommandLoader.js +7 -0
  123. package/dist/src/services/FileCommandLoader.js.map +1 -1
  124. package/dist/src/services/McpPromptLoader.js +43 -8
  125. package/dist/src/services/McpPromptLoader.js.map +1 -1
  126. package/dist/src/services/McpPromptLoader.test.js +228 -1
  127. package/dist/src/services/McpPromptLoader.test.js.map +1 -1
  128. package/dist/src/services/prompt-processors/shellProcessor.js +8 -1
  129. package/dist/src/services/prompt-processors/shellProcessor.js.map +1 -1
  130. package/dist/src/test-utils/createExtension.d.ts +15 -0
  131. package/dist/src/test-utils/createExtension.js +25 -0
  132. package/dist/src/test-utils/createExtension.js.map +1 -0
  133. package/dist/src/test-utils/mockCommandContext.js +2 -0
  134. package/dist/src/test-utils/mockCommandContext.js.map +1 -1
  135. package/dist/src/test-utils/render.d.ts +5 -1
  136. package/dist/src/test-utils/render.js +5 -1
  137. package/dist/src/test-utils/render.js.map +1 -1
  138. package/dist/src/ui/App.d.ts +1 -10
  139. package/dist/src/ui/App.js +26 -834
  140. package/dist/src/ui/App.js.map +1 -1
  141. package/dist/src/ui/AppContainer.d.ts +17 -0
  142. package/dist/src/ui/AppContainer.js +1062 -0
  143. package/dist/src/ui/AppContainer.js.map +1 -0
  144. package/dist/src/ui/AppContainer.test.d.ts +6 -0
  145. package/dist/src/ui/AppContainer.test.js +831 -0
  146. package/dist/src/ui/AppContainer.test.js.map +1 -0
  147. package/dist/src/ui/IdeIntegrationNudge.d.ts +2 -2
  148. package/dist/src/ui/IdeIntegrationNudge.js +6 -8
  149. package/dist/src/ui/IdeIntegrationNudge.js.map +1 -1
  150. package/dist/src/ui/{components → auth}/AuthDialog.js +8 -4
  151. package/dist/src/ui/auth/AuthDialog.js.map +1 -0
  152. package/dist/src/ui/auth/AuthDialog.test.d.ts +6 -0
  153. package/dist/src/ui/{components → auth}/AuthDialog.test.js +92 -10
  154. package/dist/src/ui/auth/AuthDialog.test.js.map +1 -0
  155. package/dist/src/ui/{components → auth}/AuthInProgress.js +2 -2
  156. package/dist/src/ui/auth/AuthInProgress.js.map +1 -0
  157. package/dist/src/ui/{hooks/useAuthCommand.d.ts → auth/useAuth.d.ts} +9 -3
  158. package/dist/src/ui/{hooks/useAuthCommand.js → auth/useAuth.js} +49 -14
  159. package/dist/src/ui/auth/useAuth.js.map +1 -0
  160. package/dist/src/ui/commands/aboutCommand.js +9 -3
  161. package/dist/src/ui/commands/aboutCommand.js.map +1 -1
  162. package/dist/src/ui/commands/chatCommand.d.ts +2 -0
  163. package/dist/src/ui/commands/chatCommand.js +93 -3
  164. package/dist/src/ui/commands/chatCommand.js.map +1 -1
  165. package/dist/src/ui/commands/clearCommand.js +1 -1
  166. package/dist/src/ui/commands/clearCommand.js.map +1 -1
  167. package/dist/src/ui/commands/corgiCommand.js +1 -0
  168. package/dist/src/ui/commands/corgiCommand.js.map +1 -1
  169. package/dist/src/ui/commands/directoryCommand.d.ts +1 -0
  170. package/dist/src/ui/commands/directoryCommand.js +156 -4
  171. package/dist/src/ui/commands/directoryCommand.js.map +1 -1
  172. package/dist/src/ui/commands/extensionsCommand.js +92 -15
  173. package/dist/src/ui/commands/extensionsCommand.js.map +1 -1
  174. package/dist/src/ui/commands/ideCommand.d.ts +1 -2
  175. package/dist/src/ui/commands/ideCommand.js +19 -10
  176. package/dist/src/ui/commands/ideCommand.js.map +1 -1
  177. package/dist/src/ui/commands/mcpCommand.js +88 -261
  178. package/dist/src/ui/commands/mcpCommand.js.map +1 -1
  179. package/dist/src/ui/commands/memoryCommand.js +1 -1
  180. package/dist/src/ui/commands/memoryCommand.js.map +1 -1
  181. package/dist/src/ui/commands/modelCommand.js +1 -16
  182. package/dist/src/ui/commands/modelCommand.js.map +1 -1
  183. package/dist/src/ui/commands/modelCommand.test.js +10 -11
  184. package/dist/src/ui/commands/modelCommand.test.js.map +1 -1
  185. package/dist/src/ui/commands/summaryCommand.js +1 -1
  186. package/dist/src/ui/commands/summaryCommand.js.map +1 -1
  187. package/dist/src/ui/commands/toolsCommand.js +10 -24
  188. package/dist/src/ui/commands/toolsCommand.js.map +1 -1
  189. package/dist/src/ui/commands/types.d.ts +7 -2
  190. package/dist/src/ui/commands/types.js +0 -1
  191. package/dist/src/ui/commands/types.js.map +1 -1
  192. package/dist/src/ui/components/AboutBox.js +2 -2
  193. package/dist/src/ui/components/AboutBox.js.map +1 -1
  194. package/dist/src/ui/components/AnsiOutput.d.ts +13 -0
  195. package/dist/src/ui/components/AnsiOutput.js +12 -0
  196. package/dist/src/ui/components/AnsiOutput.js.map +1 -0
  197. package/dist/src/ui/components/AnsiOutput.test.d.ts +6 -0
  198. package/dist/src/ui/components/AnsiOutput.test.js +97 -0
  199. package/dist/src/ui/components/AnsiOutput.test.js.map +1 -0
  200. package/dist/src/ui/components/AppHeader.d.ts +10 -0
  201. package/dist/src/ui/components/AppHeader.js +19 -0
  202. package/dist/src/ui/components/AppHeader.js.map +1 -0
  203. package/dist/src/ui/components/AutoAcceptIndicator.js +5 -5
  204. package/dist/src/ui/components/AutoAcceptIndicator.js.map +1 -1
  205. package/dist/src/ui/components/Composer.d.ts +6 -0
  206. package/dist/src/ui/components/Composer.js +54 -0
  207. package/dist/src/ui/components/Composer.js.map +1 -0
  208. package/dist/src/ui/components/Composer.test.d.ts +6 -0
  209. package/dist/src/ui/components/Composer.test.js +337 -0
  210. package/dist/src/ui/components/Composer.test.js.map +1 -0
  211. package/dist/src/ui/components/ConfigInitDisplay.d.ts +6 -0
  212. package/dist/src/ui/components/ConfigInitDisplay.js +38 -0
  213. package/dist/src/ui/components/ConfigInitDisplay.js.map +1 -0
  214. package/dist/src/ui/components/ConsentPrompt.d.ts +13 -0
  215. package/dist/src/ui/components/ConsentPrompt.js +19 -0
  216. package/dist/src/ui/components/ConsentPrompt.js.map +1 -0
  217. package/dist/src/ui/components/ConsentPrompt.test.d.ts +6 -0
  218. package/dist/src/ui/components/ConsentPrompt.test.js +67 -0
  219. package/dist/src/ui/components/ConsentPrompt.test.js.map +1 -0
  220. package/dist/src/ui/components/ConsoleSummaryDisplay.js +2 -2
  221. package/dist/src/ui/components/ConsoleSummaryDisplay.js.map +1 -1
  222. package/dist/src/ui/components/ContextSummaryDisplay.js +3 -3
  223. package/dist/src/ui/components/ContextSummaryDisplay.js.map +1 -1
  224. package/dist/src/ui/components/ContextUsageDisplay.d.ts +2 -1
  225. package/dist/src/ui/components/ContextUsageDisplay.js +5 -3
  226. package/dist/src/ui/components/ContextUsageDisplay.js.map +1 -1
  227. package/dist/src/ui/components/DebugProfiler.js +2 -2
  228. package/dist/src/ui/components/DebugProfiler.js.map +1 -1
  229. package/dist/src/ui/components/DetailedMessagesDisplay.js +7 -7
  230. package/dist/src/ui/components/DetailedMessagesDisplay.js.map +1 -1
  231. package/dist/src/ui/components/DialogManager.d.ts +12 -0
  232. package/dist/src/ui/components/DialogManager.js +129 -0
  233. package/dist/src/ui/components/DialogManager.js.map +1 -0
  234. package/dist/src/ui/components/EditorSettingsDialog.js +16 -7
  235. package/dist/src/ui/components/EditorSettingsDialog.js.map +1 -1
  236. package/dist/src/ui/components/ExitWarning.d.ts +7 -0
  237. package/dist/src/ui/components/ExitWarning.js +9 -0
  238. package/dist/src/ui/components/ExitWarning.js.map +1 -0
  239. package/dist/src/ui/components/FolderTrustDialog.js +22 -9
  240. package/dist/src/ui/components/FolderTrustDialog.js.map +1 -1
  241. package/dist/src/ui/components/FolderTrustDialog.test.js +37 -12
  242. package/dist/src/ui/components/FolderTrustDialog.test.js.map +1 -1
  243. package/dist/src/ui/components/Footer.d.ts +1 -17
  244. package/dist/src/ui/components/Footer.js +33 -11
  245. package/dist/src/ui/components/Footer.js.map +1 -1
  246. package/dist/src/ui/components/GeminiRespondingSpinner.d.ts +5 -0
  247. package/dist/src/ui/components/GeminiRespondingSpinner.js +7 -2
  248. package/dist/src/ui/components/GeminiRespondingSpinner.js.map +1 -1
  249. package/dist/src/ui/components/Header.js +2 -2
  250. package/dist/src/ui/components/Header.js.map +1 -1
  251. package/dist/src/ui/components/Help.d.ts +1 -1
  252. package/dist/src/ui/components/Help.js +9 -6
  253. package/dist/src/ui/components/Help.js.map +1 -1
  254. package/dist/src/ui/components/Help.test.d.ts +6 -0
  255. package/dist/src/ui/components/Help.test.js +57 -0
  256. package/dist/src/ui/components/Help.test.js.map +1 -0
  257. package/dist/src/ui/components/HistoryItemDisplay.d.ts +5 -4
  258. package/dist/src/ui/components/HistoryItemDisplay.js +13 -4
  259. package/dist/src/ui/components/HistoryItemDisplay.js.map +1 -1
  260. package/dist/src/ui/components/HistoryItemDisplay.test.js +90 -9
  261. package/dist/src/ui/components/HistoryItemDisplay.test.js.map +1 -1
  262. package/dist/src/ui/components/IdeTrustChangeDialog.d.ts +11 -0
  263. package/dist/src/ui/components/IdeTrustChangeDialog.js +32 -0
  264. package/dist/src/ui/components/IdeTrustChangeDialog.js.map +1 -0
  265. package/dist/src/ui/components/IdeTrustChangeDialog.test.d.ts +6 -0
  266. package/dist/src/ui/components/IdeTrustChangeDialog.test.js +57 -0
  267. package/dist/src/ui/components/IdeTrustChangeDialog.test.js.map +1 -0
  268. package/dist/src/ui/components/InputPrompt.d.ts +9 -0
  269. package/dist/src/ui/components/InputPrompt.js +192 -45
  270. package/dist/src/ui/components/InputPrompt.js.map +1 -1
  271. package/dist/src/ui/components/LoadingIndicator.js +2 -2
  272. package/dist/src/ui/components/LoadingIndicator.js.map +1 -1
  273. package/dist/src/ui/components/LoadingIndicator.test.js +4 -0
  274. package/dist/src/ui/components/LoadingIndicator.test.js.map +1 -1
  275. package/dist/src/ui/components/LoopDetectionConfirmation.d.ts +13 -0
  276. package/dist/src/ui/components/LoopDetectionConfirmation.js +37 -0
  277. package/dist/src/ui/components/LoopDetectionConfirmation.js.map +1 -0
  278. package/dist/src/ui/components/LoopDetectionConfirmation.test.d.ts +6 -0
  279. package/dist/src/ui/components/LoopDetectionConfirmation.test.js +28 -0
  280. package/dist/src/ui/components/LoopDetectionConfirmation.test.js.map +1 -0
  281. package/dist/src/ui/components/MainContent.d.ts +6 -0
  282. package/dist/src/ui/components/MainContent.js +28 -0
  283. package/dist/src/ui/components/MainContent.js.map +1 -0
  284. package/dist/src/ui/components/MemoryUsageDisplay.js +6 -4
  285. package/dist/src/ui/components/MemoryUsageDisplay.js.map +1 -1
  286. package/dist/src/ui/components/ModelDialog.d.ts +11 -0
  287. package/dist/src/ui/components/ModelDialog.js +42 -0
  288. package/dist/src/ui/components/ModelDialog.js.map +1 -0
  289. package/dist/src/ui/components/ModelDialog.test.d.ts +6 -0
  290. package/dist/src/ui/components/ModelDialog.test.js +158 -0
  291. package/dist/src/ui/components/ModelDialog.test.js.map +1 -0
  292. package/dist/src/ui/components/ModelStatsDisplay.js +7 -7
  293. package/dist/src/ui/components/ModelStatsDisplay.js.map +1 -1
  294. package/dist/src/ui/components/ModelSwitchDialog.js +3 -0
  295. package/dist/src/ui/components/ModelSwitchDialog.js.map +1 -1
  296. package/dist/src/ui/components/ModelSwitchDialog.test.js +3 -0
  297. package/dist/src/ui/components/ModelSwitchDialog.test.js.map +1 -1
  298. package/dist/src/ui/components/Notifications.d.ts +6 -0
  299. package/dist/src/ui/components/Notifications.js +23 -0
  300. package/dist/src/ui/components/Notifications.js.map +1 -0
  301. package/dist/src/ui/components/OpenAIKeyPrompt.js +63 -39
  302. package/dist/src/ui/components/OpenAIKeyPrompt.js.map +1 -1
  303. package/dist/src/ui/components/OpenAIKeyPrompt.test.js +8 -1
  304. package/dist/src/ui/components/OpenAIKeyPrompt.test.js.map +1 -1
  305. package/dist/src/ui/components/PermissionsModifyTrustDialog.d.ts +13 -0
  306. package/dist/src/ui/components/PermissionsModifyTrustDialog.js +48 -0
  307. package/dist/src/ui/components/PermissionsModifyTrustDialog.js.map +1 -0
  308. package/dist/src/ui/components/PermissionsModifyTrustDialog.test.d.ts +6 -0
  309. package/dist/src/ui/components/PermissionsModifyTrustDialog.test.js +154 -0
  310. package/dist/src/ui/components/PermissionsModifyTrustDialog.test.js.map +1 -0
  311. package/dist/src/ui/components/PrepareLabel.d.ts +5 -5
  312. package/dist/src/ui/components/PrepareLabel.js +67 -11
  313. package/dist/src/ui/components/PrepareLabel.js.map +1 -1
  314. package/dist/src/ui/components/PrepareLabel.test.d.ts +6 -0
  315. package/dist/src/ui/components/PrepareLabel.test.js +71 -0
  316. package/dist/src/ui/components/PrepareLabel.test.js.map +1 -0
  317. package/dist/src/ui/components/ProQuotaDialog.d.ts +13 -0
  318. package/dist/src/ui/components/ProQuotaDialog.js +23 -0
  319. package/dist/src/ui/components/ProQuotaDialog.js.map +1 -0
  320. package/dist/src/ui/components/ProQuotaDialog.test.d.ts +6 -0
  321. package/dist/src/ui/components/ProQuotaDialog.test.js +58 -0
  322. package/dist/src/ui/components/ProQuotaDialog.test.js.map +1 -0
  323. package/dist/src/ui/components/QueuedMessageDisplay.d.ts +9 -0
  324. package/dist/src/ui/components/QueuedMessageDisplay.js +20 -0
  325. package/dist/src/ui/components/QueuedMessageDisplay.js.map +1 -0
  326. package/dist/src/ui/components/QueuedMessageDisplay.test.d.ts +6 -0
  327. package/dist/src/ui/components/QueuedMessageDisplay.test.js +56 -0
  328. package/dist/src/ui/components/QueuedMessageDisplay.test.js.map +1 -0
  329. package/dist/src/ui/components/QuitConfirmationDialog.js +4 -0
  330. package/dist/src/ui/components/QuitConfirmationDialog.js.map +1 -1
  331. package/dist/src/ui/components/QuittingDisplay.d.ts +6 -0
  332. package/dist/src/ui/components/QuittingDisplay.js +20 -0
  333. package/dist/src/ui/components/QuittingDisplay.js.map +1 -0
  334. package/dist/src/ui/components/QwenOAuthProgress.js +5 -4
  335. package/dist/src/ui/components/QwenOAuthProgress.js.map +1 -1
  336. package/dist/src/ui/components/QwenOAuthProgress.test.js +82 -11
  337. package/dist/src/ui/components/QwenOAuthProgress.test.js.map +1 -1
  338. package/dist/src/ui/components/SettingsDialog.d.ts +2 -1
  339. package/dist/src/ui/components/SettingsDialog.js +97 -23
  340. package/dist/src/ui/components/SettingsDialog.js.map +1 -1
  341. package/dist/src/ui/components/SettingsDialog.test.js +474 -84
  342. package/dist/src/ui/components/SettingsDialog.test.js.map +1 -1
  343. package/dist/src/ui/components/ShellConfirmationDialog.js +5 -2
  344. package/dist/src/ui/components/ShellConfirmationDialog.js.map +1 -1
  345. package/dist/src/ui/components/ShellInputPrompt.d.ts +11 -0
  346. package/dist/src/ui/components/ShellInputPrompt.js +36 -0
  347. package/dist/src/ui/components/ShellInputPrompt.js.map +1 -0
  348. package/dist/src/ui/components/ShellModeIndicator.js +2 -2
  349. package/dist/src/ui/components/ShellModeIndicator.js.map +1 -1
  350. package/dist/src/ui/components/ShowMoreLines.js +2 -2
  351. package/dist/src/ui/components/ShowMoreLines.js.map +1 -1
  352. package/dist/src/ui/components/StatsDisplay.js +6 -6
  353. package/dist/src/ui/components/StatsDisplay.js.map +1 -1
  354. package/dist/src/ui/components/SuggestionsDisplay.d.ts +7 -2
  355. package/dist/src/ui/components/SuggestionsDisplay.js +17 -17
  356. package/dist/src/ui/components/SuggestionsDisplay.js.map +1 -1
  357. package/dist/src/ui/components/ThemeDialog.js +14 -29
  358. package/dist/src/ui/components/ThemeDialog.js.map +1 -1
  359. package/dist/src/ui/components/ThemeDialog.test.d.ts +6 -0
  360. package/dist/src/ui/components/ThemeDialog.test.js +75 -0
  361. package/dist/src/ui/components/ThemeDialog.test.js.map +1 -0
  362. package/dist/src/ui/components/Tips.js +2 -2
  363. package/dist/src/ui/components/Tips.js.map +1 -1
  364. package/dist/src/ui/components/ToolStatsDisplay.js +4 -4
  365. package/dist/src/ui/components/ToolStatsDisplay.js.map +1 -1
  366. package/dist/src/ui/components/UpdateNotification.js +2 -2
  367. package/dist/src/ui/components/UpdateNotification.js.map +1 -1
  368. package/dist/src/ui/components/WelcomeBackDialog.js +2 -0
  369. package/dist/src/ui/components/WelcomeBackDialog.js.map +1 -1
  370. package/dist/src/ui/components/WorkspaceMigrationDialog.js +14 -11
  371. package/dist/src/ui/components/WorkspaceMigrationDialog.js.map +1 -1
  372. package/dist/src/ui/components/messages/CompressionMessage.d.ts +1 -2
  373. package/dist/src/ui/components/messages/CompressionMessage.js +37 -8
  374. package/dist/src/ui/components/messages/CompressionMessage.js.map +1 -1
  375. package/dist/src/ui/components/messages/CompressionMessage.test.d.ts +6 -0
  376. package/dist/src/ui/components/messages/CompressionMessage.test.js +160 -0
  377. package/dist/src/ui/components/messages/CompressionMessage.test.js.map +1 -0
  378. package/dist/src/ui/components/messages/DiffRenderer.d.ts +2 -1
  379. package/dist/src/ui/components/messages/DiffRenderer.js +14 -22
  380. package/dist/src/ui/components/messages/DiffRenderer.js.map +1 -1
  381. package/dist/src/ui/components/messages/ErrorMessage.js +2 -2
  382. package/dist/src/ui/components/messages/ErrorMessage.js.map +1 -1
  383. package/dist/src/ui/components/messages/GeminiMessage.js +2 -2
  384. package/dist/src/ui/components/messages/GeminiMessage.js.map +1 -1
  385. package/dist/src/ui/components/messages/InfoMessage.js +2 -2
  386. package/dist/src/ui/components/messages/InfoMessage.js.map +1 -1
  387. package/dist/src/ui/components/messages/ToolConfirmationMessage.js +53 -21
  388. package/dist/src/ui/components/messages/ToolConfirmationMessage.js.map +1 -1
  389. package/dist/src/ui/components/messages/ToolConfirmationMessage.test.js +0 -8
  390. package/dist/src/ui/components/messages/ToolConfirmationMessage.test.js.map +1 -1
  391. package/dist/src/ui/components/messages/ToolGroupMessage.d.ts +3 -2
  392. package/dist/src/ui/components/messages/ToolGroupMessage.js +18 -10
  393. package/dist/src/ui/components/messages/ToolGroupMessage.js.map +1 -1
  394. package/dist/src/ui/components/messages/ToolGroupMessage.test.js +17 -15
  395. package/dist/src/ui/components/messages/ToolGroupMessage.test.js.map +1 -1
  396. package/dist/src/ui/components/messages/ToolMessage.d.ts +3 -1
  397. package/dist/src/ui/components/messages/ToolMessage.js +53 -11
  398. package/dist/src/ui/components/messages/ToolMessage.js.map +1 -1
  399. package/dist/src/ui/components/messages/ToolMessage.test.js +34 -1
  400. package/dist/src/ui/components/messages/ToolMessage.test.js.map +1 -1
  401. package/dist/src/ui/components/messages/UserMessage.js +3 -4
  402. package/dist/src/ui/components/messages/UserMessage.js.map +1 -1
  403. package/dist/src/ui/components/messages/UserShellMessage.js +2 -2
  404. package/dist/src/ui/components/messages/UserShellMessage.js.map +1 -1
  405. package/dist/src/ui/components/messages/WarningMessage.d.ts +11 -0
  406. package/dist/src/ui/components/messages/WarningMessage.js +10 -0
  407. package/dist/src/ui/components/messages/WarningMessage.js.map +1 -0
  408. package/dist/src/ui/components/shared/BaseSelectionList.d.ts +38 -0
  409. package/dist/src/ui/components/shared/BaseSelectionList.js +72 -0
  410. package/dist/src/ui/components/shared/BaseSelectionList.js.map +1 -0
  411. package/dist/src/ui/components/shared/BaseSelectionList.test.d.ts +6 -0
  412. package/dist/src/ui/components/shared/BaseSelectionList.test.js +376 -0
  413. package/dist/src/ui/components/shared/BaseSelectionList.test.js.map +1 -0
  414. package/dist/src/ui/components/shared/DescriptiveRadioButtonSelect.d.ts +35 -0
  415. package/dist/src/ui/components/shared/DescriptiveRadioButtonSelect.js +13 -0
  416. package/dist/src/ui/components/shared/DescriptiveRadioButtonSelect.js.map +1 -0
  417. package/dist/src/ui/components/shared/DescriptiveRadioButtonSelect.test.d.ts +6 -0
  418. package/dist/src/ui/components/shared/DescriptiveRadioButtonSelect.test.js +79 -0
  419. package/dist/src/ui/components/shared/DescriptiveRadioButtonSelect.test.js.map +1 -0
  420. package/dist/src/ui/components/shared/EnumSelector.d.ts +18 -0
  421. package/dist/src/ui/components/shared/EnumSelector.js +44 -0
  422. package/dist/src/ui/components/shared/EnumSelector.js.map +1 -0
  423. package/dist/src/ui/components/shared/EnumSelector.test.d.ts +6 -0
  424. package/dist/src/ui/components/shared/EnumSelector.test.js +70 -0
  425. package/dist/src/ui/components/shared/EnumSelector.test.js.map +1 -0
  426. package/dist/src/ui/components/shared/MaxSizedBox.js +2 -2
  427. package/dist/src/ui/components/shared/MaxSizedBox.js.map +1 -1
  428. package/dist/src/ui/components/shared/RadioButtonSelect.d.ts +2 -3
  429. package/dist/src/ui/components/shared/RadioButtonSelect.js +10 -105
  430. package/dist/src/ui/components/shared/RadioButtonSelect.js.map +1 -1
  431. package/dist/src/ui/components/shared/RadioButtonSelect.test.js +115 -92
  432. package/dist/src/ui/components/shared/RadioButtonSelect.test.js.map +1 -1
  433. package/dist/src/ui/components/shared/ScopeSelector.d.ts +19 -0
  434. package/dist/src/ui/components/shared/ScopeSelector.js +14 -0
  435. package/dist/src/ui/components/shared/ScopeSelector.js.map +1 -0
  436. package/dist/src/ui/components/shared/text-buffer.d.ts +25 -2
  437. package/dist/src/ui/components/shared/text-buffer.js +296 -187
  438. package/dist/src/ui/components/shared/text-buffer.js.map +1 -1
  439. package/dist/src/ui/components/subagents/create/AgentCreationWizard.js +2 -3
  440. package/dist/src/ui/components/subagents/create/AgentCreationWizard.js.map +1 -1
  441. package/dist/src/ui/components/subagents/create/ColorSelector.js +3 -2
  442. package/dist/src/ui/components/subagents/create/ColorSelector.js.map +1 -1
  443. package/dist/src/ui/components/subagents/create/CreationSummary.js +6 -5
  444. package/dist/src/ui/components/subagents/create/CreationSummary.js.map +1 -1
  445. package/dist/src/ui/components/subagents/create/DescriptionInput.js +2 -3
  446. package/dist/src/ui/components/subagents/create/DescriptionInput.js.map +1 -1
  447. package/dist/src/ui/components/subagents/create/GenerationMethodSelector.js +1 -0
  448. package/dist/src/ui/components/subagents/create/GenerationMethodSelector.js.map +1 -1
  449. package/dist/src/ui/components/subagents/create/LocationSelector.js +1 -0
  450. package/dist/src/ui/components/subagents/create/LocationSelector.js.map +1 -1
  451. package/dist/src/ui/components/subagents/create/TextEntryStep.js +2 -2
  452. package/dist/src/ui/components/subagents/create/TextEntryStep.js.map +1 -1
  453. package/dist/src/ui/components/subagents/create/ToolSelector.js +4 -3
  454. package/dist/src/ui/components/subagents/create/ToolSelector.js.map +1 -1
  455. package/dist/src/ui/components/subagents/manage/ActionSelectionStep.js +4 -4
  456. package/dist/src/ui/components/subagents/manage/ActionSelectionStep.js.map +1 -1
  457. package/dist/src/ui/components/subagents/manage/AgentEditStep.js +1 -0
  458. package/dist/src/ui/components/subagents/manage/AgentEditStep.js.map +1 -1
  459. package/dist/src/ui/components/subagents/manage/AgentSelectionStep.js +1 -2
  460. package/dist/src/ui/components/subagents/manage/AgentSelectionStep.js.map +1 -1
  461. package/dist/src/ui/components/subagents/manage/AgentsManagerDialog.js +1 -2
  462. package/dist/src/ui/components/subagents/manage/AgentsManagerDialog.js.map +1 -1
  463. package/dist/src/ui/components/subagents/runtime/AgentExecutionDisplay.js +9 -10
  464. package/dist/src/ui/components/subagents/runtime/AgentExecutionDisplay.js.map +1 -1
  465. package/dist/src/ui/components/views/ExtensionsList.d.ts +6 -0
  466. package/dist/src/ui/components/views/ExtensionsList.js +47 -0
  467. package/dist/src/ui/components/views/ExtensionsList.js.map +1 -0
  468. package/dist/src/ui/components/views/ExtensionsList.test.d.ts +6 -0
  469. package/dist/src/ui/components/views/ExtensionsList.test.js +97 -0
  470. package/dist/src/ui/components/views/ExtensionsList.test.js.map +1 -0
  471. package/dist/src/ui/components/views/McpStatus.d.ts +27 -0
  472. package/dist/src/ui/components/views/McpStatus.js +77 -0
  473. package/dist/src/ui/components/views/McpStatus.js.map +1 -0
  474. package/dist/src/ui/components/views/McpStatus.test.d.ts +6 -0
  475. package/dist/src/ui/components/views/McpStatus.test.js +117 -0
  476. package/dist/src/ui/components/views/McpStatus.test.js.map +1 -0
  477. package/dist/src/ui/components/views/ToolsList.d.ts +14 -0
  478. package/dist/src/ui/components/views/ToolsList.js +7 -0
  479. package/dist/src/ui/components/views/ToolsList.js.map +1 -0
  480. package/dist/src/ui/components/views/ToolsList.test.d.ts +6 -0
  481. package/dist/src/ui/components/views/ToolsList.test.js +45 -0
  482. package/dist/src/ui/components/views/ToolsList.test.js.map +1 -0
  483. package/dist/src/ui/constants.d.ts +1 -0
  484. package/dist/src/ui/constants.js +1 -0
  485. package/dist/src/ui/constants.js.map +1 -1
  486. package/dist/src/ui/contexts/AppContext.d.ts +11 -0
  487. package/dist/src/ui/contexts/AppContext.js +15 -0
  488. package/dist/src/ui/contexts/AppContext.js.map +1 -0
  489. package/dist/src/ui/contexts/ConfigContext.d.ts +9 -0
  490. package/dist/src/ui/contexts/ConfigContext.js +16 -0
  491. package/dist/src/ui/contexts/ConfigContext.js.map +1 -0
  492. package/dist/src/ui/contexts/KeypressContext.d.ts +3 -0
  493. package/dist/src/ui/contexts/KeypressContext.js +309 -44
  494. package/dist/src/ui/contexts/KeypressContext.js.map +1 -1
  495. package/dist/src/ui/contexts/KeypressContext.test.js +288 -2
  496. package/dist/src/ui/contexts/KeypressContext.test.js.map +1 -1
  497. package/dist/src/ui/contexts/SessionContext.d.ts +6 -0
  498. package/dist/src/ui/contexts/SessionContext.js +107 -5
  499. package/dist/src/ui/contexts/SessionContext.js.map +1 -1
  500. package/dist/src/ui/contexts/ShellFocusContext.d.ts +7 -0
  501. package/dist/src/ui/contexts/ShellFocusContext.js +9 -0
  502. package/dist/src/ui/contexts/ShellFocusContext.js.map +1 -0
  503. package/dist/src/ui/contexts/UIActionsContext.d.ts +45 -0
  504. package/dist/src/ui/contexts/UIActionsContext.js +21 -0
  505. package/dist/src/ui/contexts/UIActionsContext.js.map +1 -0
  506. package/dist/src/ui/contexts/UIStateContext.d.ts +117 -0
  507. package/dist/src/ui/contexts/UIStateContext.js +17 -0
  508. package/dist/src/ui/contexts/UIStateContext.js.map +1 -0
  509. package/dist/src/ui/hooks/atCommandProcessor.js +12 -12
  510. package/dist/src/ui/hooks/atCommandProcessor.js.map +1 -1
  511. package/dist/src/ui/hooks/atCommandProcessor.test.js +21 -19
  512. package/dist/src/ui/hooks/atCommandProcessor.test.js.map +1 -1
  513. package/dist/src/ui/hooks/keyToAnsi.d.ts +15 -0
  514. package/dist/src/ui/hooks/keyToAnsi.js +67 -0
  515. package/dist/src/ui/hooks/keyToAnsi.js.map +1 -0
  516. package/dist/src/ui/hooks/shellCommandProcessor.d.ts +2 -1
  517. package/dist/src/ui/hooks/shellCommandProcessor.js +65 -15
  518. package/dist/src/ui/hooks/shellCommandProcessor.js.map +1 -1
  519. package/dist/src/ui/hooks/shellCommandProcessor.test.js +196 -17
  520. package/dist/src/ui/hooks/shellCommandProcessor.test.js.map +1 -1
  521. package/dist/src/ui/hooks/slashCommandProcessor.d.ts +20 -2
  522. package/dist/src/ui/hooks/slashCommandProcessor.js +41 -82
  523. package/dist/src/ui/hooks/slashCommandProcessor.js.map +1 -1
  524. package/dist/src/ui/hooks/useAtCompletion.js +1 -1
  525. package/dist/src/ui/hooks/useAtCompletion.js.map +1 -1
  526. package/dist/src/ui/hooks/useAutoAcceptIndicator.d.ts +3 -2
  527. package/dist/src/ui/hooks/useAutoAcceptIndicator.js +20 -18
  528. package/dist/src/ui/hooks/useAutoAcceptIndicator.js.map +1 -1
  529. package/dist/src/ui/hooks/useAutoAcceptIndicator.test.js +43 -0
  530. package/dist/src/ui/hooks/useAutoAcceptIndicator.test.js.map +1 -1
  531. package/dist/src/ui/hooks/useExtensionUpdates.d.ts +21 -0
  532. package/dist/src/ui/hooks/useExtensionUpdates.js +116 -0
  533. package/dist/src/ui/hooks/useExtensionUpdates.js.map +1 -0
  534. package/dist/src/ui/hooks/useExtensionUpdates.test.d.ts +6 -0
  535. package/dist/src/ui/hooks/useExtensionUpdates.test.js +243 -0
  536. package/dist/src/ui/hooks/useExtensionUpdates.test.js.map +1 -0
  537. package/dist/src/ui/hooks/useFocus.js +10 -0
  538. package/dist/src/ui/hooks/useFocus.js.map +1 -1
  539. package/dist/src/ui/hooks/useFolderTrust.js +6 -10
  540. package/dist/src/ui/hooks/useFolderTrust.js.map +1 -1
  541. package/dist/src/ui/hooks/useGeminiStream.d.ts +14 -3
  542. package/dist/src/ui/hooks/useGeminiStream.js +173 -79
  543. package/dist/src/ui/hooks/useGeminiStream.js.map +1 -1
  544. package/dist/src/ui/hooks/useGitBranchName.js +15 -18
  545. package/dist/src/ui/hooks/useGitBranchName.js.map +1 -1
  546. package/dist/src/ui/hooks/useGitBranchName.test.js +49 -53
  547. package/dist/src/ui/hooks/useGitBranchName.test.js.map +1 -1
  548. package/dist/src/ui/hooks/useIdeTrustListener.d.ts +16 -0
  549. package/dist/src/ui/hooks/useIdeTrustListener.js +65 -0
  550. package/dist/src/ui/hooks/useIdeTrustListener.js.map +1 -0
  551. package/dist/src/ui/hooks/useIdeTrustListener.test.d.ts +6 -0
  552. package/dist/src/ui/hooks/useIdeTrustListener.test.js +183 -0
  553. package/dist/src/ui/hooks/useIdeTrustListener.test.js.map +1 -0
  554. package/dist/src/ui/hooks/useInputHistoryStore.d.ts +19 -0
  555. package/dist/src/ui/hooks/useInputHistoryStore.js +81 -0
  556. package/dist/src/ui/hooks/useInputHistoryStore.js.map +1 -0
  557. package/dist/src/ui/hooks/useInputHistoryStore.test.d.ts +6 -0
  558. package/dist/src/ui/hooks/useInputHistoryStore.test.js +234 -0
  559. package/dist/src/ui/hooks/useInputHistoryStore.test.js.map +1 -0
  560. package/dist/src/ui/hooks/useLoadingIndicator.d.ts +1 -1
  561. package/dist/src/ui/hooks/useLoadingIndicator.js +2 -2
  562. package/dist/src/ui/hooks/useLoadingIndicator.js.map +1 -1
  563. package/dist/src/ui/hooks/useLoadingIndicator.test.js +2 -2
  564. package/dist/src/ui/hooks/useLoadingIndicator.test.js.map +1 -1
  565. package/dist/src/ui/hooks/useMemoryMonitor.d.ts +13 -0
  566. package/dist/src/ui/hooks/useMemoryMonitor.js +28 -0
  567. package/dist/src/ui/hooks/useMemoryMonitor.js.map +1 -0
  568. package/dist/src/ui/hooks/useMemoryMonitor.test.d.ts +6 -0
  569. package/dist/src/ui/hooks/useMemoryMonitor.test.js +57 -0
  570. package/dist/src/ui/hooks/useMemoryMonitor.test.js.map +1 -0
  571. package/dist/src/ui/hooks/useMessageQueue.d.ts +2 -1
  572. package/dist/src/ui/hooks/useMessageQueue.js +5 -3
  573. package/dist/src/ui/hooks/useMessageQueue.js.map +1 -1
  574. package/dist/src/ui/hooks/useMessageQueue.test.js +9 -0
  575. package/dist/src/ui/hooks/useMessageQueue.test.js.map +1 -1
  576. package/dist/src/ui/hooks/useModelCommand.d.ts +12 -0
  577. package/dist/src/ui/hooks/useModelCommand.js +21 -0
  578. package/dist/src/ui/hooks/useModelCommand.js.map +1 -0
  579. package/dist/src/ui/hooks/useModelCommand.test.d.ts +6 -0
  580. package/dist/src/ui/hooks/useModelCommand.test.js +35 -0
  581. package/dist/src/ui/hooks/useModelCommand.test.js.map +1 -0
  582. package/dist/src/ui/hooks/usePermissionsModifyTrust.d.ts +17 -0
  583. package/dist/src/ui/hooks/usePermissionsModifyTrust.js +78 -0
  584. package/dist/src/ui/hooks/usePermissionsModifyTrust.js.map +1 -0
  585. package/dist/src/ui/hooks/usePermissionsModifyTrust.test.d.ts +6 -0
  586. package/dist/src/ui/hooks/usePermissionsModifyTrust.test.js +182 -0
  587. package/dist/src/ui/hooks/usePermissionsModifyTrust.test.js.map +1 -0
  588. package/dist/src/ui/hooks/usePhraseCycler.d.ts +1 -1
  589. package/dist/src/ui/hooks/usePhraseCycler.js +11 -8
  590. package/dist/src/ui/hooks/usePhraseCycler.js.map +1 -1
  591. package/dist/src/ui/hooks/useQuotaAndFallback.d.ts +21 -0
  592. package/dist/src/ui/hooks/useQuotaAndFallback.js +122 -0
  593. package/dist/src/ui/hooks/useQuotaAndFallback.js.map +1 -0
  594. package/dist/src/ui/hooks/useQuotaAndFallback.test.d.ts +6 -0
  595. package/dist/src/ui/hooks/useQuotaAndFallback.test.js +269 -0
  596. package/dist/src/ui/hooks/useQuotaAndFallback.test.js.map +1 -0
  597. package/dist/src/ui/hooks/useReactToolScheduler.d.ts +3 -2
  598. package/dist/src/ui/hooks/useReactToolScheduler.js +23 -17
  599. package/dist/src/ui/hooks/useReactToolScheduler.js.map +1 -1
  600. package/dist/src/ui/hooks/useReverseSearchCompletion.d.ts +1 -1
  601. package/dist/src/ui/hooks/useReverseSearchCompletion.js +67 -20
  602. package/dist/src/ui/hooks/useReverseSearchCompletion.js.map +1 -1
  603. package/dist/src/ui/hooks/useSelectionList.d.ts +34 -0
  604. package/dist/src/ui/hooks/useSelectionList.js +245 -0
  605. package/dist/src/ui/hooks/useSelectionList.js.map +1 -0
  606. package/dist/src/ui/hooks/useSelectionList.test.d.ts +6 -0
  607. package/dist/src/ui/hooks/useSelectionList.test.js +701 -0
  608. package/dist/src/ui/hooks/useSelectionList.test.js.map +1 -0
  609. package/dist/src/ui/hooks/useSlashCompletion.d.ts +1 -1
  610. package/dist/src/ui/hooks/useSlashCompletion.js +281 -67
  611. package/dist/src/ui/hooks/useSlashCompletion.js.map +1 -1
  612. package/dist/src/ui/hooks/useSlashCompletion.test.d.ts +4 -1
  613. package/dist/src/ui/hooks/useSlashCompletion.test.js +390 -65
  614. package/dist/src/ui/hooks/useSlashCompletion.test.js.map +1 -1
  615. package/dist/src/ui/hooks/useStateAndRef.d.ts +1 -1
  616. package/dist/src/ui/hooks/useStateAndRef.js +2 -2
  617. package/dist/src/ui/hooks/useStateAndRef.js.map +1 -1
  618. package/dist/src/ui/hooks/useThemeCommand.d.ts +1 -1
  619. package/dist/src/ui/hooks/useThemeCommand.js +3 -14
  620. package/dist/src/ui/hooks/useThemeCommand.js.map +1 -1
  621. package/dist/src/ui/hooks/useToolScheduler.test.js +64 -291
  622. package/dist/src/ui/hooks/useToolScheduler.test.js.map +1 -1
  623. package/dist/src/ui/hooks/useWelcomeBack.js +2 -2
  624. package/dist/src/ui/hooks/useWelcomeBack.js.map +1 -1
  625. package/dist/src/ui/hooks/useWorkspaceMigration.js +2 -1
  626. package/dist/src/ui/hooks/useWorkspaceMigration.js.map +1 -1
  627. package/dist/src/ui/keyMatchers.test.js +17 -0
  628. package/dist/src/ui/keyMatchers.test.js.map +1 -1
  629. package/dist/src/ui/layouts/DefaultAppLayout.d.ts +9 -0
  630. package/dist/src/ui/layouts/DefaultAppLayout.js +13 -0
  631. package/dist/src/ui/layouts/DefaultAppLayout.js.map +1 -0
  632. package/dist/src/ui/layouts/ScreenReaderAppLayout.d.ts +7 -0
  633. package/dist/src/ui/layouts/ScreenReaderAppLayout.js +14 -0
  634. package/dist/src/ui/layouts/ScreenReaderAppLayout.js.map +1 -0
  635. package/dist/src/ui/models/availableModels.d.ts +3 -0
  636. package/dist/src/ui/models/availableModels.js +27 -3
  637. package/dist/src/ui/models/availableModels.js.map +1 -1
  638. package/dist/src/ui/noninteractive/nonInteractiveUi.d.ts +12 -0
  639. package/dist/src/ui/noninteractive/nonInteractiveUi.js +28 -0
  640. package/dist/src/ui/noninteractive/nonInteractiveUi.js.map +1 -0
  641. package/dist/src/ui/state/extensions.d.ts +42 -0
  642. package/dist/src/ui/state/extensions.js +62 -0
  643. package/dist/src/ui/state/extensions.js.map +1 -0
  644. package/dist/src/ui/themes/ayu.js +1 -1
  645. package/dist/src/ui/themes/dracula.js +2 -2
  646. package/dist/src/ui/themes/github-dark.js +1 -1
  647. package/dist/src/ui/themes/theme.js +19 -19
  648. package/dist/src/ui/themes/theme.js.map +1 -1
  649. package/dist/src/ui/types.d.ts +79 -3
  650. package/dist/src/ui/types.js +14 -0
  651. package/dist/src/ui/types.js.map +1 -1
  652. package/dist/src/ui/utils/CodeColorizer.js +3 -2
  653. package/dist/src/ui/utils/CodeColorizer.js.map +1 -1
  654. package/dist/src/ui/utils/InlineMarkdownRenderer.js +7 -7
  655. package/dist/src/ui/utils/InlineMarkdownRenderer.js.map +1 -1
  656. package/dist/src/ui/utils/MarkdownDisplay.js +11 -11
  657. package/dist/src/ui/utils/MarkdownDisplay.js.map +1 -1
  658. package/dist/src/ui/utils/MarkdownDisplay.test.js +95 -87
  659. package/dist/src/ui/utils/MarkdownDisplay.test.js.map +1 -1
  660. package/dist/src/ui/utils/TableRenderer.js +4 -4
  661. package/dist/src/ui/utils/TableRenderer.js.map +1 -1
  662. package/dist/src/ui/utils/clipboardUtils.js +7 -8
  663. package/dist/src/ui/utils/clipboardUtils.js.map +1 -1
  664. package/dist/src/ui/utils/displayUtils.d.ts +1 -0
  665. package/dist/src/ui/utils/displayUtils.js +7 -4
  666. package/dist/src/ui/utils/displayUtils.js.map +1 -1
  667. package/dist/src/ui/utils/displayUtils.test.js +37 -18
  668. package/dist/src/ui/utils/displayUtils.test.js.map +1 -1
  669. package/dist/src/ui/utils/highlight.d.ts +11 -0
  670. package/dist/src/ui/utils/highlight.js +78 -0
  671. package/dist/src/ui/utils/highlight.js.map +1 -0
  672. package/dist/src/ui/utils/highlight.test.d.ts +6 -0
  673. package/dist/src/ui/utils/highlight.test.js +120 -0
  674. package/dist/src/ui/utils/highlight.test.js.map +1 -0
  675. package/dist/src/ui/utils/kittyProtocolDetector.js +39 -29
  676. package/dist/src/ui/utils/kittyProtocolDetector.js.map +1 -1
  677. package/dist/src/ui/utils/platformConstants.d.ts +24 -1
  678. package/dist/src/ui/utils/platformConstants.js +26 -1
  679. package/dist/src/ui/utils/platformConstants.js.map +1 -1
  680. package/dist/src/ui/utils/textUtils.d.ts +10 -0
  681. package/dist/src/ui/utils/textUtils.js +108 -3
  682. package/dist/src/ui/utils/textUtils.js.map +1 -1
  683. package/dist/src/ui/utils/textUtils.test.d.ts +6 -0
  684. package/dist/src/ui/utils/textUtils.test.js +132 -0
  685. package/dist/src/ui/utils/textUtils.test.js.map +1 -0
  686. package/dist/src/utils/commands.d.ts +20 -0
  687. package/dist/src/utils/commands.js +53 -0
  688. package/dist/src/utils/commands.js.map +1 -0
  689. package/dist/src/utils/commands.test.d.ts +6 -0
  690. package/dist/src/utils/commands.test.js +115 -0
  691. package/dist/src/utils/commands.test.js.map +1 -0
  692. package/dist/src/utils/commentJson.d.ts +9 -0
  693. package/dist/src/utils/commentJson.js +48 -0
  694. package/dist/src/utils/commentJson.js.map +1 -0
  695. package/dist/src/utils/commentJson.test.d.ts +6 -0
  696. package/dist/src/utils/commentJson.test.js +146 -0
  697. package/dist/src/utils/commentJson.test.js.map +1 -0
  698. package/dist/src/utils/deepMerge.d.ts +9 -0
  699. package/dist/src/utils/deepMerge.js +58 -0
  700. package/dist/src/utils/deepMerge.js.map +1 -0
  701. package/dist/src/utils/deepMerge.test.d.ts +6 -0
  702. package/dist/src/utils/deepMerge.test.js +143 -0
  703. package/dist/src/utils/deepMerge.test.js.map +1 -0
  704. package/dist/src/utils/envVarResolver.d.ts +39 -0
  705. package/dist/src/utils/envVarResolver.js +97 -0
  706. package/dist/src/utils/envVarResolver.js.map +1 -0
  707. package/dist/src/utils/envVarResolver.test.d.ts +6 -0
  708. package/dist/src/utils/envVarResolver.test.js +221 -0
  709. package/dist/src/utils/envVarResolver.test.js.map +1 -0
  710. package/dist/src/utils/errors.d.ts +21 -0
  711. package/dist/src/utils/errors.js +93 -0
  712. package/dist/src/utils/errors.js.map +1 -1
  713. package/dist/src/utils/errors.test.d.ts +6 -0
  714. package/dist/src/utils/errors.test.js +303 -0
  715. package/dist/src/utils/errors.test.js.map +1 -0
  716. package/dist/src/utils/events.d.ts +2 -1
  717. package/dist/src/utils/events.js +1 -0
  718. package/dist/src/utils/events.js.map +1 -1
  719. package/dist/src/utils/math.d.ts +13 -0
  720. package/dist/src/utils/math.js +14 -0
  721. package/dist/src/utils/math.js.map +1 -0
  722. package/dist/src/utils/processUtils.d.ts +13 -0
  723. package/dist/src/utils/processUtils.js +18 -0
  724. package/dist/src/utils/processUtils.js.map +1 -0
  725. package/dist/src/utils/processUtils.test.d.ts +6 -0
  726. package/dist/src/utils/processUtils.test.js +20 -0
  727. package/dist/src/utils/processUtils.test.js.map +1 -0
  728. package/dist/src/utils/relaunch.d.ts +7 -0
  729. package/dist/src/utils/relaunch.js +57 -0
  730. package/dist/src/utils/relaunch.js.map +1 -0
  731. package/dist/src/utils/relaunch.test.d.ts +6 -0
  732. package/dist/src/utils/relaunch.test.js +273 -0
  733. package/dist/src/utils/relaunch.test.js.map +1 -0
  734. package/dist/src/utils/sandbox.d.ts +1 -1
  735. package/dist/src/utils/sandbox.js +42 -17
  736. package/dist/src/utils/sandbox.js.map +1 -1
  737. package/dist/src/utils/settingsUtils.d.ts +16 -6
  738. package/dist/src/utils/settingsUtils.js +35 -25
  739. package/dist/src/utils/settingsUtils.js.map +1 -1
  740. package/dist/src/utils/settingsUtils.test.js +455 -158
  741. package/dist/src/utils/settingsUtils.test.js.map +1 -1
  742. package/dist/src/utils/userStartupWarnings.d.ts +1 -1
  743. package/dist/src/utils/userStartupWarnings.js +1 -1
  744. package/dist/src/utils/userStartupWarnings.js.map +1 -1
  745. package/dist/src/utils/windowTitle.d.ts +12 -0
  746. package/dist/src/utils/windowTitle.js +19 -0
  747. package/dist/src/utils/windowTitle.js.map +1 -0
  748. package/dist/src/utils/windowTitle.test.d.ts +6 -0
  749. package/dist/src/utils/windowTitle.test.js +49 -0
  750. package/dist/src/utils/windowTitle.test.js.map +1 -0
  751. package/dist/src/validateNonInterActiveAuth.d.ts +4 -2
  752. package/dist/src/validateNonInterActiveAuth.js +33 -12
  753. package/dist/src/validateNonInterActiveAuth.js.map +1 -1
  754. package/dist/src/zed-integration/fileSystemService.d.ts +1 -0
  755. package/dist/src/zed-integration/fileSystemService.js +3 -0
  756. package/dist/src/zed-integration/fileSystemService.js.map +1 -1
  757. package/dist/src/zed-integration/schema.d.ts +310 -310
  758. package/dist/src/zed-integration/zedIntegration.d.ts +8 -1
  759. package/dist/src/zed-integration/zedIntegration.js +32 -15
  760. package/dist/src/zed-integration/zedIntegration.js.map +1 -1
  761. package/dist/tsconfig.tsbuildinfo +1 -1
  762. package/package.json +15 -10
  763. package/dist/src/ui/components/AuthDialog.js.map +0 -1
  764. package/dist/src/ui/components/AuthDialog.test.js.map +0 -1
  765. package/dist/src/ui/components/AuthInProgress.js.map +0 -1
  766. package/dist/src/ui/components/ModelSelectionDialog.d.ts +0 -14
  767. package/dist/src/ui/components/ModelSelectionDialog.js +0 -26
  768. package/dist/src/ui/components/ModelSelectionDialog.js.map +0 -1
  769. package/dist/src/ui/components/ModelSelectionDialog.test.js +0 -124
  770. package/dist/src/ui/components/ModelSelectionDialog.test.js.map +0 -1
  771. package/dist/src/ui/hooks/useAuthCommand.js.map +0 -1
  772. /package/dist/src/{ui/components/AuthDialog.test.d.ts → commands/extensions/new.test.d.ts} +0 -0
  773. /package/dist/src/ui/{components → auth}/AuthDialog.d.ts +0 -0
  774. /package/dist/src/ui/{components → auth}/AuthInProgress.d.ts +0 -0
@@ -3,17 +3,21 @@
3
3
  * Copyright 2025 Google LLC
4
4
  * SPDX-License-Identifier: Apache-2.0
5
5
  */
6
- import { Storage } from '@rdmind/rdmind-core';
6
+ import { QWEN_DIR, Storage, Config, ExtensionInstallEvent, ExtensionUninstallEvent, ExtensionDisableEvent, ExtensionEnableEvent, logExtensionEnable, logExtensionInstallEvent, logExtensionUninstall, logExtensionDisable, } from '@rdmind/rdmind-core';
7
7
  import * as fs from 'node:fs';
8
8
  import * as path from 'node:path';
9
9
  import * as os from 'node:os';
10
- import { simpleGit } from 'simple-git';
11
10
  import { SettingScope, loadSettings } from '../config/settings.js';
12
11
  import { getErrorMessage } from '../utils/errors.js';
13
12
  import { recursivelyHydrateStrings } from './extensions/variables.js';
14
- export const EXTENSIONS_DIRECTORY_NAME = path.join('.rdmind', 'extensions');
13
+ import { isWorkspaceTrusted } from './trustedFolders.js';
14
+ import { resolveEnvVarsInObject } from '../utils/envVarResolver.js';
15
+ import { randomUUID } from 'node:crypto';
16
+ import { cloneFromGit, downloadFromGitHubRelease, } from './extensions/github.js';
17
+ import { ExtensionEnablementManager } from './extensions/extensionEnablement.js';
18
+ import chalk from 'chalk';
19
+ export const EXTENSIONS_DIRECTORY_NAME = path.join(QWEN_DIR, 'extensions');
15
20
  export const EXTENSIONS_CONFIG_FILENAME = 'rdmind-extension.json';
16
- export const EXTENSIONS_CONFIG_FILENAME_OLD = 'gemini-extension.json';
17
21
  export const INSTALL_METADATA_FILENAME = '.rdmind-extension-install.json';
18
22
  export class ExtensionStorage {
19
23
  extensionName;
@@ -35,12 +39,16 @@ export class ExtensionStorage {
35
39
  }
36
40
  }
37
41
  export function getWorkspaceExtensions(workspaceDir) {
42
+ // If the workspace dir is the user extensions dir, there are no workspace extensions.
43
+ if (path.resolve(workspaceDir) === path.resolve(os.homedir())) {
44
+ return [];
45
+ }
38
46
  return loadExtensionsFromDir(workspaceDir);
39
47
  }
40
- async function copyExtension(source, destination) {
48
+ export async function copyExtension(source, destination) {
41
49
  await fs.promises.cp(source, destination, { recursive: true });
42
50
  }
43
- export async function performWorkspaceExtensionMigration(extensions) {
51
+ export async function performWorkspaceExtensionMigration(extensions, requestConsent) {
44
52
  const failedInstallNames = [];
45
53
  for (const extension of extensions) {
46
54
  try {
@@ -48,7 +56,7 @@ export async function performWorkspaceExtensionMigration(extensions) {
48
56
  source: extension.path,
49
57
  type: 'local',
50
58
  };
51
- await installExtension(installMetadata);
59
+ await installExtension(installMetadata, requestConsent);
52
60
  }
53
61
  catch (_) {
54
62
  failedInstallNames.push(extension.config.name);
@@ -56,17 +64,31 @@ export async function performWorkspaceExtensionMigration(extensions) {
56
64
  }
57
65
  return failedInstallNames;
58
66
  }
59
- export function loadExtensions(workspaceDir) {
67
+ function getTelemetryConfig(cwd) {
68
+ const settings = loadSettings(cwd);
69
+ const config = new Config({
70
+ telemetry: settings.merged.telemetry,
71
+ interactive: false,
72
+ sessionId: randomUUID(),
73
+ targetDir: cwd,
74
+ cwd,
75
+ model: '',
76
+ debugMode: false,
77
+ });
78
+ return config;
79
+ }
80
+ export function loadExtensions(extensionEnablementManager, workspaceDir = process.cwd()) {
60
81
  const settings = loadSettings(workspaceDir).merged;
61
- const disabledExtensions = settings.extensions?.disabled ?? [];
62
82
  const allExtensions = [...loadUserExtensions()];
63
- if (!settings.experimental?.extensionManagement) {
83
+ if ((isWorkspaceTrusted(settings) ?? true) &&
84
+ // Default management setting to true
85
+ !(settings.experimental?.extensionManagement ?? true)) {
64
86
  allExtensions.push(...getWorkspaceExtensions(workspaceDir));
65
87
  }
66
88
  const uniqueExtensions = new Map();
67
89
  for (const extension of allExtensions) {
68
90
  if (!uniqueExtensions.has(extension.config.name) &&
69
- !disabledExtensions.includes(extension.config.name)) {
91
+ extensionEnablementManager.isEnabled(extension.config.name, workspaceDir)) {
70
92
  uniqueExtensions.set(extension.config.name, extension);
71
93
  }
72
94
  }
@@ -91,54 +113,74 @@ export function loadExtensionsFromDir(dir) {
91
113
  const extensions = [];
92
114
  for (const subdir of fs.readdirSync(extensionsDir)) {
93
115
  const extensionDir = path.join(extensionsDir, subdir);
94
- const extension = loadExtension(extensionDir);
116
+ const extension = loadExtension({ extensionDir, workspaceDir: dir });
95
117
  if (extension != null) {
96
118
  extensions.push(extension);
97
119
  }
98
120
  }
99
121
  return extensions;
100
122
  }
101
- export function loadExtension(extensionDir) {
123
+ export function loadExtension(context) {
124
+ const { extensionDir, workspaceDir } = context;
102
125
  if (!fs.statSync(extensionDir).isDirectory()) {
103
- console.error(`Warning: unexpected file ${extensionDir} in extensions directory.`);
104
126
  return null;
105
127
  }
106
- let configFilePath = path.join(extensionDir, EXTENSIONS_CONFIG_FILENAME);
107
- if (!fs.existsSync(configFilePath)) {
108
- const oldConfigFilePath = path.join(extensionDir, EXTENSIONS_CONFIG_FILENAME_OLD);
109
- if (!fs.existsSync(oldConfigFilePath)) {
110
- console.error(`Warning: extension directory ${extensionDir} does not contain a config file ${configFilePath}.`);
111
- return null;
112
- }
113
- configFilePath = oldConfigFilePath;
128
+ const installMetadata = loadInstallMetadata(extensionDir);
129
+ let effectiveExtensionPath = extensionDir;
130
+ if (installMetadata?.type === 'link') {
131
+ effectiveExtensionPath = installMetadata.source;
114
132
  }
115
133
  try {
116
- const configContent = fs.readFileSync(configFilePath, 'utf-8');
117
- const config = recursivelyHydrateStrings(JSON.parse(configContent), {
118
- extensionPath: extensionDir,
119
- '/': path.sep,
120
- pathSeparator: path.sep,
134
+ let config = loadExtensionConfig({
135
+ extensionDir: effectiveExtensionPath,
136
+ workspaceDir,
121
137
  });
122
- if (!config.name || !config.version) {
123
- console.error(`Invalid extension config in ${configFilePath}: missing name or version.`);
124
- return null;
138
+ config = resolveEnvVarsInObject(config);
139
+ if (config.mcpServers) {
140
+ config.mcpServers = Object.fromEntries(Object.entries(config.mcpServers).map(([key, value]) => [
141
+ key,
142
+ filterMcpConfig(value),
143
+ ]));
125
144
  }
126
145
  const contextFiles = getContextFileNames(config)
127
- .map((contextFileName) => path.join(extensionDir, contextFileName))
146
+ .map((contextFileName) => path.join(effectiveExtensionPath, contextFileName))
128
147
  .filter((contextFilePath) => fs.existsSync(contextFilePath));
129
148
  return {
130
- path: extensionDir,
149
+ path: effectiveExtensionPath,
131
150
  config,
132
151
  contextFiles,
133
- installMetadata: loadInstallMetadata(extensionDir),
152
+ installMetadata,
134
153
  };
135
154
  }
136
155
  catch (e) {
137
- console.error(`Warning: error parsing extension config in ${configFilePath}: ${getErrorMessage(e)}`);
156
+ console.error(`Warning: Skipping extension in ${effectiveExtensionPath}: ${getErrorMessage(e)}`);
138
157
  return null;
139
158
  }
140
159
  }
141
- function loadInstallMetadata(extensionDir) {
160
+ export function loadExtensionByName(name, workspaceDir = process.cwd()) {
161
+ const userExtensionsDir = ExtensionStorage.getUserExtensionsDir();
162
+ if (!fs.existsSync(userExtensionsDir)) {
163
+ return null;
164
+ }
165
+ for (const subdir of fs.readdirSync(userExtensionsDir)) {
166
+ const extensionDir = path.join(userExtensionsDir, subdir);
167
+ if (!fs.statSync(extensionDir).isDirectory()) {
168
+ continue;
169
+ }
170
+ const extension = loadExtension({ extensionDir, workspaceDir });
171
+ if (extension &&
172
+ extension.config.name.toLowerCase() === name.toLowerCase()) {
173
+ return extension;
174
+ }
175
+ }
176
+ return null;
177
+ }
178
+ function filterMcpConfig(original) {
179
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
180
+ const { trust, ...rest } = original;
181
+ return Object.freeze(rest);
182
+ }
183
+ export function loadInstallMetadata(extensionDir) {
142
184
  const metadataFilePath = path.join(extensionDir, INSTALL_METADATA_FILENAME);
143
185
  try {
144
186
  const configContent = fs.readFileSync(metadataFilePath, 'utf-8');
@@ -160,130 +202,287 @@ function getContextFileNames(config) {
160
202
  }
161
203
  /**
162
204
  * Returns an annotated list of extensions. If an extension is listed in enabledExtensionNames, it will be active.
163
- * If enabledExtensionNames is empty, an extension is active unless it is in list of disabled extensions in settings.
205
+ * If enabledExtensionNames is empty, an extension is active unless it is disabled.
164
206
  * @param extensions The base list of extensions.
165
207
  * @param enabledExtensionNames The names of explicitly enabled extensions.
166
208
  * @param workspaceDir The current workspace directory.
167
209
  */
168
- export function annotateActiveExtensions(extensions, enabledExtensionNames, workspaceDir) {
169
- const settings = loadSettings(workspaceDir).merged;
170
- const disabledExtensions = settings.extensions?.disabled ?? [];
171
- const annotatedExtensions = [];
172
- if (enabledExtensionNames.length === 0) {
173
- return extensions.map((extension) => ({
174
- name: extension.config.name,
175
- version: extension.config.version,
176
- isActive: !disabledExtensions.includes(extension.config.name),
177
- path: extension.path,
178
- }));
179
- }
180
- const lowerCaseEnabledExtensions = new Set(enabledExtensionNames.map((e) => e.trim().toLowerCase()));
181
- if (lowerCaseEnabledExtensions.size === 1 &&
182
- lowerCaseEnabledExtensions.has('none')) {
183
- return extensions.map((extension) => ({
184
- name: extension.config.name,
185
- version: extension.config.version,
186
- isActive: false,
187
- path: extension.path,
188
- }));
189
- }
190
- const notFoundNames = new Set(lowerCaseEnabledExtensions);
191
- for (const extension of extensions) {
192
- const lowerCaseName = extension.config.name.toLowerCase();
193
- const isActive = lowerCaseEnabledExtensions.has(lowerCaseName);
194
- if (isActive) {
195
- notFoundNames.delete(lowerCaseName);
196
- }
197
- annotatedExtensions.push({
198
- name: extension.config.name,
199
- version: extension.config.version,
200
- isActive,
201
- path: extension.path,
210
+ export function annotateActiveExtensions(extensions, workspaceDir, manager) {
211
+ manager.validateExtensionOverrides(extensions);
212
+ return extensions.map((extension) => ({
213
+ name: extension.config.name,
214
+ version: extension.config.version,
215
+ isActive: manager.isEnabled(extension.config.name, workspaceDir),
216
+ path: extension.path,
217
+ installMetadata: extension.installMetadata,
218
+ }));
219
+ }
220
+ /**
221
+ * Requests consent from the user to perform an action, by reading a Y/n
222
+ * character from stdin.
223
+ *
224
+ * This should not be called from interactive mode as it will break the CLI.
225
+ *
226
+ * @param consentDescription The description of the thing they will be consenting to.
227
+ * @returns boolean, whether they consented or not.
228
+ */
229
+ export async function requestConsentNonInteractive(consentDescription) {
230
+ console.info(consentDescription);
231
+ const result = await promptForConsentNonInteractive('Do you want to continue? [Y/n]: ');
232
+ return result;
233
+ }
234
+ /**
235
+ * Requests consent from the user to perform an action, in interactive mode.
236
+ *
237
+ * This should not be called from non-interactive mode as it will not work.
238
+ *
239
+ * @param consentDescription The description of the thing they will be consenting to.
240
+ * @param setExtensionUpdateConfirmationRequest A function to actually add a prompt to the UI.
241
+ * @returns boolean, whether they consented or not.
242
+ */
243
+ export async function requestConsentInteractive(consentDescription, addExtensionUpdateConfirmationRequest) {
244
+ return await promptForConsentInteractive(consentDescription + '\n\nDo you want to continue?', addExtensionUpdateConfirmationRequest);
245
+ }
246
+ /**
247
+ * Asks users a prompt and awaits for a y/n response on stdin.
248
+ *
249
+ * This should not be called from interactive mode as it will break the CLI.
250
+ *
251
+ * @param prompt A yes/no prompt to ask the user
252
+ * @returns Whether or not the user answers 'y' (yes). Defaults to 'yes' on enter.
253
+ */
254
+ async function promptForConsentNonInteractive(prompt) {
255
+ const readline = await import('node:readline');
256
+ const rl = readline.createInterface({
257
+ input: process.stdin,
258
+ output: process.stdout,
259
+ });
260
+ return new Promise((resolve) => {
261
+ rl.question(prompt, (answer) => {
262
+ rl.close();
263
+ resolve(['y', ''].includes(answer.trim().toLowerCase()));
202
264
  });
203
- }
204
- for (const requestedName of notFoundNames) {
205
- console.error(`Extension not found: ${requestedName}`);
206
- }
207
- return annotatedExtensions;
265
+ });
208
266
  }
209
267
  /**
210
- * Clones a Git repository to a specified local path.
211
- * @param gitUrl The Git URL to clone.
212
- * @param destination The destination path to clone the repository to.
268
+ * Asks users an interactive yes/no prompt.
269
+ *
270
+ * This should not be called from non-interactive mode as it will break the CLI.
271
+ *
272
+ * @param prompt A markdown prompt to ask the user
273
+ * @param setExtensionUpdateConfirmationRequest Function to update the UI state with the confirmation request.
274
+ * @returns Whether or not the user answers yes.
213
275
  */
214
- async function cloneFromGit(gitUrl, destination) {
276
+ async function promptForConsentInteractive(prompt, addExtensionUpdateConfirmationRequest) {
277
+ return await new Promise((resolve) => {
278
+ addExtensionUpdateConfirmationRequest({
279
+ prompt,
280
+ onConfirm: (resolvedConfirmed) => {
281
+ resolve(resolvedConfirmed);
282
+ },
283
+ });
284
+ });
285
+ }
286
+ export async function installExtension(installMetadata, requestConsent, cwd = process.cwd(), previousExtensionConfig) {
287
+ const telemetryConfig = getTelemetryConfig(cwd);
288
+ let newExtensionConfig = null;
289
+ let localSourcePath;
215
290
  try {
216
- // TODO(chrstnb): Download the archive instead to avoid unnecessary .git info.
217
- await simpleGit().clone(gitUrl, destination, ['--depth', '1']);
291
+ const settings = loadSettings(cwd).merged;
292
+ if (!isWorkspaceTrusted(settings)) {
293
+ throw new Error(`Could not install extension from untrusted folder at ${installMetadata.source}`);
294
+ }
295
+ const extensionsDir = ExtensionStorage.getUserExtensionsDir();
296
+ await fs.promises.mkdir(extensionsDir, { recursive: true });
297
+ if (!path.isAbsolute(installMetadata.source) &&
298
+ (installMetadata.type === 'local' || installMetadata.type === 'link')) {
299
+ installMetadata.source = path.resolve(cwd, installMetadata.source);
300
+ }
301
+ let tempDir;
302
+ if (installMetadata.type === 'git' ||
303
+ installMetadata.type === 'github-release') {
304
+ tempDir = await ExtensionStorage.createTmpDir();
305
+ try {
306
+ const result = await downloadFromGitHubRelease(installMetadata, tempDir);
307
+ installMetadata.type = result.type;
308
+ installMetadata.releaseTag = result.tagName;
309
+ }
310
+ catch (_error) {
311
+ await cloneFromGit(installMetadata, tempDir);
312
+ installMetadata.type = 'git';
313
+ }
314
+ localSourcePath = tempDir;
315
+ }
316
+ else if (installMetadata.type === 'local' ||
317
+ installMetadata.type === 'link') {
318
+ localSourcePath = installMetadata.source;
319
+ }
320
+ else {
321
+ throw new Error(`Unsupported install type: ${installMetadata.type}`);
322
+ }
323
+ try {
324
+ newExtensionConfig = loadExtensionConfig({
325
+ extensionDir: localSourcePath,
326
+ workspaceDir: cwd,
327
+ });
328
+ const newExtensionName = newExtensionConfig.name;
329
+ const extensionStorage = new ExtensionStorage(newExtensionName);
330
+ const destinationPath = extensionStorage.getExtensionDir();
331
+ const installedExtensions = loadUserExtensions();
332
+ if (installedExtensions.some((installed) => installed.config.name === newExtensionName)) {
333
+ throw new Error(`Extension "${newExtensionName}" is already installed. Please uninstall it first.`);
334
+ }
335
+ await maybeRequestConsentOrFail(newExtensionConfig, requestConsent, previousExtensionConfig);
336
+ await fs.promises.mkdir(destinationPath, { recursive: true });
337
+ if (installMetadata.type === 'local' ||
338
+ installMetadata.type === 'git' ||
339
+ installMetadata.type === 'github-release') {
340
+ await copyExtension(localSourcePath, destinationPath);
341
+ }
342
+ const metadataString = JSON.stringify(installMetadata, null, 2);
343
+ const metadataPath = path.join(destinationPath, INSTALL_METADATA_FILENAME);
344
+ await fs.promises.writeFile(metadataPath, metadataString);
345
+ }
346
+ finally {
347
+ if (tempDir) {
348
+ await fs.promises.rm(tempDir, { recursive: true, force: true });
349
+ }
350
+ }
351
+ logExtensionInstallEvent(telemetryConfig, new ExtensionInstallEvent(newExtensionConfig.name, newExtensionConfig.version, installMetadata.source, 'success'));
352
+ enableExtension(newExtensionConfig.name, SettingScope.User);
353
+ return newExtensionConfig.name;
218
354
  }
219
355
  catch (error) {
220
- throw new Error(`Failed to clone Git repository from ${gitUrl}`, {
221
- cause: error,
222
- });
356
+ // Attempt to load config from the source path even if installation fails
357
+ // to get the name and version for logging.
358
+ if (!newExtensionConfig && localSourcePath) {
359
+ try {
360
+ newExtensionConfig = loadExtensionConfig({
361
+ extensionDir: localSourcePath,
362
+ workspaceDir: cwd,
363
+ });
364
+ }
365
+ catch {
366
+ // Ignore error, this is just for logging.
367
+ }
368
+ }
369
+ logExtensionInstallEvent(telemetryConfig, new ExtensionInstallEvent(newExtensionConfig?.name ?? '', newExtensionConfig?.version ?? '', installMetadata.source, 'error'));
370
+ throw error;
223
371
  }
224
372
  }
225
- export async function installExtension(installMetadata, cwd = process.cwd()) {
226
- const extensionsDir = ExtensionStorage.getUserExtensionsDir();
227
- await fs.promises.mkdir(extensionsDir, { recursive: true });
228
- // Convert relative paths to absolute paths for the metadata file.
229
- if (installMetadata.type === 'local' &&
230
- !path.isAbsolute(installMetadata.source)) {
231
- installMetadata.source = path.resolve(cwd, installMetadata.source);
373
+ /**
374
+ * Builds a consent string for installing an extension based on it's
375
+ * extensionConfig.
376
+ */
377
+ function extensionConsentString(extensionConfig) {
378
+ const output = [];
379
+ const mcpServerEntries = Object.entries(extensionConfig.mcpServers || {});
380
+ output.push(`Installing extension "${extensionConfig.name}".`);
381
+ output.push('**Extensions may introduce unexpected behavior. Ensure you have investigated the extension source and trust the author.**');
382
+ if (mcpServerEntries.length) {
383
+ output.push('This extension will run the following MCP servers:');
384
+ for (const [key, mcpServer] of mcpServerEntries) {
385
+ const isLocal = !!mcpServer.command;
386
+ const source = mcpServer.httpUrl ??
387
+ `${mcpServer.command || ''}${mcpServer.args ? ' ' + mcpServer.args.join(' ') : ''}`;
388
+ output.push(` * ${key} (${isLocal ? 'local' : 'remote'}): ${source}`);
389
+ }
232
390
  }
233
- let localSourcePath;
234
- let tempDir;
235
- if (installMetadata.type === 'git') {
236
- tempDir = await ExtensionStorage.createTmpDir();
237
- await cloneFromGit(installMetadata.source, tempDir);
238
- localSourcePath = tempDir;
391
+ if (extensionConfig.contextFileName) {
392
+ output.push(`This extension will append info to your gemini.md context using ${extensionConfig.contextFileName}`);
239
393
  }
240
- else {
241
- localSourcePath = installMetadata.source;
394
+ if (extensionConfig.excludeTools) {
395
+ output.push(`This extension will exclude the following core tools: ${extensionConfig.excludeTools}`);
242
396
  }
243
- let newExtensionName;
244
- try {
245
- const newExtension = loadExtension(localSourcePath);
246
- if (!newExtension) {
247
- throw new Error(`Invalid extension at ${installMetadata.source}. Please make sure it has a valid rdmind-extension.json file.`);
248
- }
249
- // ~/.rdmind/extensions/{ExtensionConfig.name}.
250
- newExtensionName = newExtension.config.name;
251
- const extensionStorage = new ExtensionStorage(newExtensionName);
252
- const destinationPath = extensionStorage.getExtensionDir();
253
- const installedExtensions = loadUserExtensions();
254
- if (installedExtensions.some((installed) => installed.config.name === newExtensionName)) {
255
- throw new Error(`Extension "${newExtensionName}" is already installed. Please uninstall it first.`);
397
+ return output.join('\n');
398
+ }
399
+ /**
400
+ * Requests consent from the user to install an extension (extensionConfig), if
401
+ * there is any difference between the consent string for `extensionConfig` and
402
+ * `previousExtensionConfig`.
403
+ *
404
+ * Always requests consent if previousExtensionConfig is null.
405
+ *
406
+ * Throws if the user does not consent.
407
+ */
408
+ async function maybeRequestConsentOrFail(extensionConfig, requestConsent, previousExtensionConfig) {
409
+ const extensionConsent = extensionConsentString(extensionConfig);
410
+ if (previousExtensionConfig) {
411
+ const previousExtensionConsent = extensionConsentString(previousExtensionConfig);
412
+ if (previousExtensionConsent === extensionConsent) {
413
+ return;
256
414
  }
257
- await copyExtension(localSourcePath, destinationPath);
258
- const metadataString = JSON.stringify(installMetadata, null, 2);
259
- const metadataPath = path.join(destinationPath, INSTALL_METADATA_FILENAME);
260
- await fs.promises.writeFile(metadataPath, metadataString);
261
- }
262
- finally {
263
- if (tempDir) {
264
- await fs.promises.rm(tempDir, { recursive: true, force: true });
415
+ }
416
+ if (!(await requestConsent(extensionConsent))) {
417
+ throw new Error(`Installation cancelled for "${extensionConfig.name}".`);
418
+ }
419
+ }
420
+ export function validateName(name) {
421
+ if (!/^[a-zA-Z0-9-]+$/.test(name)) {
422
+ throw new Error(`Invalid extension name: "${name}". Only letters (a-z, A-Z), numbers (0-9), and dashes (-) are allowed.`);
423
+ }
424
+ }
425
+ export function loadExtensionConfig(context) {
426
+ const { extensionDir, workspaceDir } = context;
427
+ const configFilePath = path.join(extensionDir, EXTENSIONS_CONFIG_FILENAME);
428
+ if (!fs.existsSync(configFilePath)) {
429
+ throw new Error(`Configuration file not found at ${configFilePath}`);
430
+ }
431
+ try {
432
+ const configContent = fs.readFileSync(configFilePath, 'utf-8');
433
+ const config = recursivelyHydrateStrings(JSON.parse(configContent), {
434
+ extensionPath: extensionDir,
435
+ workspacePath: workspaceDir,
436
+ '/': path.sep,
437
+ pathSeparator: path.sep,
438
+ });
439
+ if (!config.name || !config.version) {
440
+ throw new Error(`Invalid configuration in ${configFilePath}: missing ${!config.name ? '"name"' : '"version"'}`);
265
441
  }
442
+ validateName(config.name);
443
+ return config;
444
+ }
445
+ catch (e) {
446
+ throw new Error(`Failed to load extension config from ${configFilePath}: ${getErrorMessage(e)}`);
266
447
  }
267
- return newExtensionName;
268
448
  }
269
- export async function uninstallExtension(extensionName, cwd = process.cwd()) {
449
+ export async function uninstallExtension(extensionIdentifier, cwd = process.cwd()) {
450
+ const telemetryConfig = getTelemetryConfig(cwd);
270
451
  const installedExtensions = loadUserExtensions();
271
- if (!installedExtensions.some((installed) => installed.config.name === extensionName)) {
272
- throw new Error(`Extension "${extensionName}" not found.`);
273
- }
274
- removeFromDisabledExtensions(extensionName, [SettingScope.User, SettingScope.Workspace], cwd);
452
+ const extensionName = installedExtensions.find((installed) => installed.config.name.toLowerCase() ===
453
+ extensionIdentifier.toLowerCase() ||
454
+ installed.installMetadata?.source.toLowerCase() ===
455
+ extensionIdentifier.toLowerCase())?.config.name;
456
+ if (!extensionName) {
457
+ throw new Error(`Extension not found.`);
458
+ }
459
+ const manager = new ExtensionEnablementManager(ExtensionStorage.getUserExtensionsDir(), [extensionName]);
460
+ manager.remove(extensionName);
275
461
  const storage = new ExtensionStorage(extensionName);
276
- return await fs.promises.rm(storage.getExtensionDir(), {
462
+ await fs.promises.rm(storage.getExtensionDir(), {
277
463
  recursive: true,
278
464
  force: true,
279
465
  });
466
+ logExtensionUninstall(telemetryConfig, new ExtensionUninstallEvent(extensionName, 'success'));
280
467
  }
281
- export function toOutputString(extension) {
282
- let output = `${extension.config.name} (${extension.config.version})`;
468
+ export function toOutputString(extension, workspaceDir) {
469
+ const manager = new ExtensionEnablementManager(ExtensionStorage.getUserExtensionsDir());
470
+ const userEnabled = manager.isEnabled(extension.config.name, os.homedir());
471
+ const workspaceEnabled = manager.isEnabled(extension.config.name, workspaceDir);
472
+ const status = workspaceEnabled ? chalk.green('✓') : chalk.red('✗');
473
+ let output = `${status} ${extension.config.name} (${extension.config.version})`;
283
474
  output += `\n Path: ${extension.path}`;
284
475
  if (extension.installMetadata) {
285
- output += `\n Source: ${extension.installMetadata.source}`;
476
+ output += `\n Source: ${extension.installMetadata.source} (Type: ${extension.installMetadata.type})`;
477
+ if (extension.installMetadata.ref) {
478
+ output += `\n Ref: ${extension.installMetadata.ref}`;
479
+ }
480
+ if (extension.installMetadata.releaseTag) {
481
+ output += `\n Release tag: ${extension.installMetadata.releaseTag}`;
482
+ }
286
483
  }
484
+ output += `\n Enabled (User): ${userEnabled}`;
485
+ output += `\n Enabled (Workspace): ${workspaceEnabled}`;
287
486
  if (extension.contextFiles.length > 0) {
288
487
  output += `\n Context files:`;
289
488
  extension.contextFiles.forEach((contextFile) => {
@@ -304,74 +503,32 @@ export function toOutputString(extension) {
304
503
  }
305
504
  return output;
306
505
  }
307
- export async function updateExtension(extensionName, cwd = process.cwd()) {
308
- const installedExtensions = loadUserExtensions();
309
- const extension = installedExtensions.find((installed) => installed.config.name === extensionName);
310
- if (!extension) {
311
- throw new Error(`Extension "${extensionName}" not found. Run gemini extensions list to see available extensions.`);
312
- }
313
- if (!extension.installMetadata) {
314
- throw new Error(`Extension cannot be updated because it is missing the .rdmind-extension.install.json file. To update manually, uninstall and then reinstall the updated version.`);
315
- }
316
- const originalVersion = extension.config.version;
317
- const tempDir = await ExtensionStorage.createTmpDir();
318
- try {
319
- await copyExtension(extension.path, tempDir);
320
- await uninstallExtension(extensionName, cwd);
321
- await installExtension(extension.installMetadata, cwd);
322
- const updatedExtension = loadExtension(extension.path);
323
- if (!updatedExtension) {
324
- throw new Error('Updated extension not found after installation.');
325
- }
326
- const updatedVersion = updatedExtension.config.version;
327
- return {
328
- originalVersion,
329
- updatedVersion,
330
- };
331
- }
332
- catch (e) {
333
- console.error(`Error updating extension, rolling back. ${getErrorMessage(e)}`);
334
- await copyExtension(tempDir, extension.path);
335
- throw e;
336
- }
337
- finally {
338
- await fs.promises.rm(tempDir, { recursive: true, force: true });
339
- }
340
- }
341
506
  export function disableExtension(name, scope, cwd = process.cwd()) {
507
+ const config = getTelemetryConfig(cwd);
342
508
  if (scope === SettingScope.System || scope === SettingScope.SystemDefaults) {
343
509
  throw new Error('System and SystemDefaults scopes are not supported.');
344
510
  }
345
- const settings = loadSettings(cwd);
346
- const settingsFile = settings.forScope(scope);
347
- const extensionSettings = settingsFile.settings.extensions || {
348
- disabled: [],
349
- };
350
- const disabledExtensions = extensionSettings.disabled || [];
351
- if (!disabledExtensions.includes(name)) {
352
- disabledExtensions.push(name);
353
- extensionSettings.disabled = disabledExtensions;
354
- settings.setValue(scope, 'extensions', extensionSettings);
511
+ const extension = loadExtensionByName(name, cwd);
512
+ if (!extension) {
513
+ throw new Error(`Extension with name ${name} does not exist.`);
355
514
  }
515
+ const manager = new ExtensionEnablementManager(ExtensionStorage.getUserExtensionsDir(), [name]);
516
+ const scopePath = scope === SettingScope.Workspace ? cwd : os.homedir();
517
+ manager.disable(name, true, scopePath);
518
+ logExtensionDisable(config, new ExtensionDisableEvent(name, scope));
356
519
  }
357
- export function enableExtension(name, scopes) {
358
- removeFromDisabledExtensions(name, scopes);
359
- }
360
- /**
361
- * Removes an extension from the list of disabled extensions.
362
- * @param name The name of the extension to remove.
363
- * @param scope The scopes to remove the name from.
364
- */
365
- function removeFromDisabledExtensions(name, scopes, cwd = process.cwd()) {
366
- const settings = loadSettings(cwd);
367
- for (const scope of scopes) {
368
- const settingsFile = settings.forScope(scope);
369
- const extensionSettings = settingsFile.settings.extensions || {
370
- disabled: [],
371
- };
372
- const disabledExtensions = extensionSettings.disabled || [];
373
- extensionSettings.disabled = disabledExtensions.filter((extension) => extension !== name);
374
- settings.setValue(scope, 'extensions', extensionSettings);
520
+ export function enableExtension(name, scope, cwd = process.cwd()) {
521
+ if (scope === SettingScope.System || scope === SettingScope.SystemDefaults) {
522
+ throw new Error('System and SystemDefaults scopes are not supported.');
523
+ }
524
+ const extension = loadExtensionByName(name, cwd);
525
+ if (!extension) {
526
+ throw new Error(`Extension with name ${name} does not exist.`);
375
527
  }
528
+ const manager = new ExtensionEnablementManager(ExtensionStorage.getUserExtensionsDir());
529
+ const scopePath = scope === SettingScope.Workspace ? cwd : os.homedir();
530
+ manager.enable(name, true, scopePath);
531
+ const config = getTelemetryConfig(cwd);
532
+ logExtensionEnable(config, new ExtensionEnableEvent(name, scope));
376
533
  }
377
534
  //# sourceMappingURL=extension.js.map