Replace the flat menu (Dashboard, Audit, Validate, Burn, Benchmark, Tasks, Tools) with a numbered progression that guides engineers through a logical acceptance workflow: Dashboard (landing) → 1. Audit → 2. Check → 3. Load → 4. Speed → 5. Endurance → 6. Tools → 7. Settings Key changes: - layout.go: numbered nav labels, new hrefs, Tasks removed from nav and replaced with a persistent sidebar badge (polls /api/tasks every 5 s, highlights amber when tasks are active) - server.go: 301 redirects from /validate→/check, /burn→/load, /benchmark→/speed for backward compatibility - pages.go: dispatch cases for all new routes; old routes kept as fallbacks - page_validate.go: add renderCheck() — non-destructive check page with validate-mode tests only (no stress toggle, no targeted-stress/ targeted-power/pulse cards) - page_burn.go: add renderLoad() wrapper; update scope alert to reference /check instead of /validate - page_benchmark.go: add renderSpeed() (performance focus) and renderEndurance() (stability/overnight focus) wrappers - page_settings.go: new Settings page with blackbox logging toggle, NVIDIA driver reset, and build info - server_test.go: update five tests to use new route names and content expectations Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
78 lines
3.1 KiB
Go
78 lines
3.1 KiB
Go
package webui
|
|
|
|
import "html"
|
|
|
|
func renderSettings(opts HandlerOptions) string {
|
|
version := opts.BuildLabel
|
|
if version == "" {
|
|
version = "dev"
|
|
}
|
|
return `<div class="grid2">
|
|
|
|
<div class="card">
|
|
<div class="card-head">Blackbox Logging</div>
|
|
<div class="card-body">
|
|
<p style="font-size:13px;color:var(--muted);margin-bottom:14px">Continuous hardware monitoring that writes a rolling log of sensor readings to the export directory. Useful for capturing thermal or power anomalies during long runs.</p>
|
|
<div style="display:flex;gap:8px;align-items:center">
|
|
<button class="btn btn-primary btn-sm" onclick="blackboxToggle('enable')">Enable</button>
|
|
<button class="btn btn-secondary btn-sm" onclick="blackboxToggle('disable')">Disable</button>
|
|
<span id="blackbox-status" style="font-size:12px;color:var(--muted)">Loading...</span>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="card">
|
|
<div class="card-head">NVIDIA Recovery</div>
|
|
<div class="card-body">
|
|
<p style="font-size:13px;color:var(--muted);margin-bottom:14px">Reset NVIDIA GPU driver state. Use when <code>nvidia-smi</code> reports errors or GPUs appear stuck after a failed test.</p>
|
|
<div style="display:flex;gap:8px;align-items:center">
|
|
<button class="btn btn-danger btn-sm" onclick="nvidiaReset()">Reset NVIDIA Driver</button>
|
|
<span id="nvidia-reset-status" style="font-size:12px;color:var(--muted)"></span>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
</div>
|
|
|
|
<div class="card" style="margin-top:0">
|
|
<div class="card-head">Build Info</div>
|
|
<div class="card-body">
|
|
<table style="width:auto">
|
|
<tbody>
|
|
<tr><td style="color:var(--muted);padding-right:24px">Version</td><td>` + html.EscapeString(version) + `</td></tr>
|
|
<tr><td style="color:var(--muted);padding-right:24px">Title</td><td>` + html.EscapeString(opts.Title) + `</td></tr>
|
|
</tbody>
|
|
</table>
|
|
</div>
|
|
</div>
|
|
|
|
<script>
|
|
(function() {
|
|
fetch('/api/blackbox/status', {cache:'no-store'}).then(r => r.json()).then(d => {
|
|
var el = document.getElementById('blackbox-status');
|
|
if (el) el.textContent = d.enabled ? 'Enabled' : 'Disabled';
|
|
}).catch(() => {
|
|
var el = document.getElementById('blackbox-status');
|
|
if (el) el.textContent = 'Status unavailable';
|
|
});
|
|
})();
|
|
function blackboxToggle(action) {
|
|
var el = document.getElementById('blackbox-status');
|
|
if (el) el.textContent = 'Updating...';
|
|
fetch('/api/blackbox/' + action, {method:'POST', cache:'no-store'})
|
|
.then(r => r.json())
|
|
.then(d => { if (el) el.textContent = d.enabled ? 'Enabled' : 'Disabled'; })
|
|
.catch(err => { if (el) el.textContent = 'Error: ' + err.message; });
|
|
}
|
|
function nvidiaReset() {
|
|
var el = document.getElementById('nvidia-reset-status');
|
|
if (!confirm('Reset NVIDIA driver? This will interrupt any running GPU tasks.')) return;
|
|
if (el) el.textContent = 'Resetting...';
|
|
fetch('/api/gpu/nvidia-reset', {method:'POST', cache:'no-store'})
|
|
.then(r => r.json())
|
|
.then(d => { if (el) el.textContent = d.error ? ('Error: ' + d.error) : 'Done — driver reset.'; })
|
|
.catch(err => { if (el) el.textContent = 'Error: ' + err.message; });
|
|
}
|
|
</script>`
|
|
}
|