mbproxy: replace status page with a live SignalR web dashboard

The single auto-refreshing zero-JS status page gave operators a 25-column
wall and no way to drill into one connection. This adds a Bootstrap fleet
dashboard (filterable/sortable KPI table) and a per-PLC detail page with a
real-time debug view of raw PLC-side BCD vs. decoded client-side values,
streamed live over a SignalR feed. The debug view is fed by an on-demand
per-tag value capture, armed only while a detail page is open. All assets
(Bootstrap, SignalR client, fonts) are embedded so the UI works unchanged
on firewalled networks; GET /status.json is untouched for scrapers.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
Joseph Doherty
2026-05-15 10:40:21 -04:00
parent b330faff03
commit e719dd51c1
49 changed files with 3539 additions and 424 deletions
@@ -190,6 +190,28 @@ public sealed class MbproxyOptionsBindingTests
string.Join("; ", result.Failures ?? []));
}
// -------------------------------------------------------------------------
// Test 7 — AdminPushIntervalMs (SignalR dashboard push cadence)
// -------------------------------------------------------------------------
[Fact]
public void MbproxyOptionsBinding_AdminPushIntervalMs_DefaultsTo1000()
{
var options = BindOptions(new Dictionary<string, string?>());
options.AdminPushIntervalMs.ShouldBe(1000);
}
[Fact]
public void MbproxyOptionsBinding_AdminPushIntervalMs_BindsConfiguredValue()
{
var options = BindOptions(new Dictionary<string, string?>
{
["Mbproxy:AdminPushIntervalMs"] = "250",
});
options.AdminPushIntervalMs.ShouldBe(250);
}
/// <summary>
/// Resolves an <c>install/</c> file by walking up from the test assembly directory.
/// Works from both the Windows dev box and the Linux test box.