diff --git a/web/src/app/home/add-extension/page.tsx b/web/src/app/home/add-extension/page.tsx
index fa82a922..9804018c 100644
--- a/web/src/app/home/add-extension/page.tsx
+++ b/web/src/app/home/add-extension/page.tsx
@@ -151,6 +151,14 @@ function AddExtensionContent() {
const navigate = useNavigate();
const [searchParams, setSearchParams] = useSearchParams();
const { refreshPlugins, refreshMCPServers, refreshSkills } = useSidebarData();
+
+ // Localized label for an extension type, used in the install dialog.
+ const extensionTypeLabel = (type: string) =>
+ type === 'mcp'
+ ? t('market.typeMCP')
+ : type === 'skill'
+ ? t('market.typeSkill')
+ : t('market.typePlugin');
const {
addTask,
setSelectedTaskId,
@@ -271,15 +279,26 @@ function AddExtensionContent() {
useEffect(() => {
const onComplete = (_taskId: number, success: boolean) => {
if (success) {
- toast.success(t('plugins.installSuccess'));
+ toast.success(t('addExtension.installSuccess'));
+ // Refresh every sidebar extension list so the newly-installed
+ // plugin / MCP / skill shows up immediately, regardless of type.
refreshPlugins();
+ refreshMCPServers();
+ refreshSkills();
}
};
registerOnTaskComplete(onComplete);
return () => {
unregisterOnTaskComplete(onComplete);
};
- }, [registerOnTaskComplete, unregisterOnTaskComplete, refreshPlugins, t]);
+ }, [
+ registerOnTaskComplete,
+ unregisterOnTaskComplete,
+ refreshPlugins,
+ refreshMCPServers,
+ refreshSkills,
+ t,
+ ]);
const handleInstallPlugin = useCallback(async (plugin: PluginV4) => {
setInstallInfo({
@@ -1189,22 +1208,50 @@ function AddExtensionContent() {
- {installInfo.plugin_version - ? t('plugins.askConfirm', { - name: installInfo.plugin_name, - version: installInfo.plugin_version, - }) - : t('plugins.askConfirmNoVersion', { - name: installInfo.plugin_name, - })} +
+ {t('addExtension.installConfirm', { + type: extensionTypeLabel(installExtensionType), + name: installInfo.plugin_name, + })}
+