diff --git a/internal/gateway/ui/index.html b/internal/gateway/ui/index.html
index f320636..e40f114 100644
--- a/internal/gateway/ui/index.html
+++ b/internal/gateway/ui/index.html
@@ -5052,18 +5052,26 @@
}
/* ---------- boot ---------- */
+ // refresh renders one tab.
+ //
+ // The plugin-element re-mount is applied HERE, once, rather than at the end
+ // of each renderer: seven pages assign their pane's innerHTML wholesale,
+ // and a per-page call is one more place to forget.
function refresh(tab) {
- if (tab === "status") return renderStatus();
- if (tab === "chat") return renderChat();
- if (tab === "keys") return renderKeys();
- if (tab === "sort") return renderSort();
- if (tab === "sources") return renderSources();
- if (tab === "adapters") return renderAdapters();
- if (tab === "plugins") return renderPlugins();
+ const done = () => remountPluginElements();
+ if (tab === "status") return renderStatus().then(done, done);
+ if (tab === "chat") return renderChat().then(done, done);
+ if (tab === "keys") return renderKeys().then(done, done);
+ if (tab === "sort") return renderSort().then(done, done);
+ if (tab === "sources") return renderSources().then(done, done);
+ if (tab === "adapters") return renderAdapters().then(done, done);
+ if (tab === "plugins") return renderPlugins().then(done, done);
// A page contributed by a plugin has no renderer here: its