diff --git a/src/trx-client/trx-frontend/trx-frontend-http/assets/web/app.js b/src/trx-client/trx-frontend/trx-frontend-http/assets/web/app.js
index 7711227..38b8f88 100644
--- a/src/trx-client/trx-frontend/trx-frontend-http/assets/web/app.js
+++ b/src/trx-client/trx-frontend/trx-frontend-http/assets/web/app.js
@@ -615,6 +615,18 @@ document.querySelector(".tab-bar").addEventListener("click", (e) => {
connect();
+// --- Plugins tab ---
+fetch("/frontends").then(r => r.json()).then(names => {
+ const list = document.getElementById("plugins-list");
+ if (!Array.isArray(names) || names.length === 0) {
+ list.innerHTML = '
No frontends registered
';
+ return;
+ }
+ list.innerHTML = names.map(n => `${n}
`).join("");
+}).catch(err => {
+ console.error("Failed to fetch frontends", err);
+});
+
// --- Signal measurement ---
const sigMeasureBtn = document.getElementById("sig-measure-btn");
const sigClearBtn = document.getElementById("sig-clear-btn");
diff --git a/src/trx-client/trx-frontend/trx-frontend-http/assets/web/index.html b/src/trx-client/trx-frontend/trx-frontend-http/assets/web/index.html
index c4df883..a422739 100644
--- a/src/trx-client/trx-frontend/trx-frontend-http/assets/web/index.html
+++ b/src/trx-client/trx-frontend/trx-frontend-http/assets/web/index.html
@@ -19,6 +19,7 @@
+
@@ -116,6 +117,9 @@
+
| Server | -- |
diff --git a/src/trx-client/trx-frontend/trx-frontend-http/assets/web/style.css b/src/trx-client/trx-frontend/trx-frontend-http/assets/web/style.css
index 3b731f5..bdf4be8 100644
--- a/src/trx-client/trx-frontend/trx-frontend-http/assets/web/style.css
+++ b/src/trx-client/trx-frontend/trx-frontend-http/assets/web/style.css
@@ -157,6 +157,8 @@ small { color: var(--text-muted); }
.about-table td { padding: 0.5rem 0.6rem; border-bottom: 1px solid var(--border); }
.about-table tr:last-child td { border-bottom: none; }
.about-table td:first-child { color: var(--text-muted); width: 40%; }
+.plugin-item { padding: 0.5rem 0.6rem; border-bottom: 1px solid var(--border); color: var(--text); }
+.plugin-item:last-child { border-bottom: none; }
.footer { display: flex; justify-content: space-between; align-items: baseline; margin-top: 1.1rem; }
.full-row { grid-column: 1 / -1; }
.copyright { color: var(--text-muted); font-size: 0.75rem; opacity: 0.7; }
diff --git a/src/trx-client/trx-frontend/trx-frontend-http/src/api.rs b/src/trx-client/trx-frontend/trx-frontend-http/src/api.rs
index 737b65a..6403e2b 100644
--- a/src/trx-client/trx-frontend/trx-frontend-http/src/api.rs
+++ b/src/trx-client/trx-frontend/trx-frontend-http/src/api.rs
@@ -26,6 +26,12 @@ const FAVICON_BYTES: &[u8] = include_bytes!(concat!(
const LOGO_BYTES: &[u8] =
include_bytes!(concat!(env!("CARGO_MANIFEST_DIR"), "/assets/trx-logo.png"));
+#[get("/frontends")]
+pub async fn frontends_api() -> Result {
+ let names = trx_frontend::registered_frontends();
+ Ok(HttpResponse::Ok().json(names))
+}
+
#[get("/status")]
pub async fn status_api(
state: web::Data>,
@@ -229,6 +235,7 @@ pub async fn set_tx_limit(
pub fn configure(cfg: &mut web::ServiceConfig) {
cfg.service(index)
+ .service(frontends_api)
.service(status_api)
.service(events)
.service(toggle_power)
@@ -322,9 +329,17 @@ async fn wait_for_view(mut rx: watch::Receiver) -> Result {
+ if let Some(view) = rx.borrow().snapshot() {
+ return Ok(view);
+ }
+ }
+ _ => break,
}
}