()
| 968 | hint.textContent = 'RuSense UI failed to load: ' + (err && err.message); |
| 969 | hint.classList.remove('hidden'); |
| 970 | } |
| 971 | }); |
| 972 | } |
| 973 | |
| 974 | function initRusense() { |
| 975 | showRusenseSubtab(_rusenseCurrent); |
| 976 | // Reachability hint: /api/v1/status is proxied to the sensing-server. |
| 977 | const hint = document.getElementById('rusense-offline-hint'); |
| 978 | if (hint) { |
| 979 | fetch('/api/v1/status', { cache: 'no-store' }) |
| 980 | .then(r => hint.classList.toggle('hidden', r.ok)) |
| 981 | .catch(() => hint.classList.remove('hidden')); |
| 982 | } |
| 983 | } |
| 984 | |
| 985 | // ── Bundled sensing backend: install / uninstall from the RuSense tab ──────── |
| 986 | let _sensingLogTimer = null; |
| 987 | |
| 988 | function refreshSensingInstallCard() { |
no test coverage detected