Compare commits
1 Commits
main
...
claude/iss
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
eb083d3937 |
@@ -88,6 +88,7 @@
|
|||||||
</div>
|
</div>
|
||||||
<div class="status-line">AGENTS: <span id="agent-count">0</span></div>
|
<div class="status-line">AGENTS: <span id="agent-count">0</span></div>
|
||||||
<button id="retry-btn">Retry connection</button>
|
<button id="retry-btn">Retry connection</button>
|
||||||
|
<a id="fallback-link" href="/api/ui" style="display:none; margin-top:6px; color:#8a7f6a; font-size:0.7rem;">Open API dashboard →</a>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!-- Reject unknown sub-paths: only /world/ is valid -->
|
<!-- Reject unknown sub-paths: only /world/ is valid -->
|
||||||
@@ -99,6 +100,24 @@
|
|||||||
}
|
}
|
||||||
})();
|
})();
|
||||||
</script>
|
</script>
|
||||||
|
<!-- Fallback: if main.js fails to load, don't leave user on INITIALIZING forever -->
|
||||||
|
<script>
|
||||||
|
(function() {
|
||||||
|
var INIT_TIMEOUT_MS = 8000;
|
||||||
|
window.__workshopBooted = false;
|
||||||
|
setTimeout(function() {
|
||||||
|
if (window.__workshopBooted) return;
|
||||||
|
var dot = document.getElementById('status-dot');
|
||||||
|
var text = document.getElementById('status-text');
|
||||||
|
var btn = document.getElementById('retry-btn');
|
||||||
|
var fallback = document.getElementById('fallback-link');
|
||||||
|
if (dot) { dot.className = 'dot offline'; }
|
||||||
|
if (text) { text.textContent = 'WORKSHOP UNREACHABLE'; }
|
||||||
|
if (btn) { btn.style.display = 'block'; }
|
||||||
|
if (fallback) { fallback.style.display = 'block'; }
|
||||||
|
}, INIT_TIMEOUT_MS);
|
||||||
|
})();
|
||||||
|
</script>
|
||||||
<!-- Three.js scene will mount to #scene -->
|
<!-- Three.js scene will mount to #scene -->
|
||||||
<script type="module" src="main.js"></script>
|
<script type="module" src="main.js"></script>
|
||||||
</body>
|
</body>
|
||||||
|
|||||||
@@ -23,8 +23,12 @@ const dom = {
|
|||||||
text: document.getElementById('status-text'),
|
text: document.getElementById('status-text'),
|
||||||
agents: document.getElementById('agent-count'),
|
agents: document.getElementById('agent-count'),
|
||||||
retryBtn: document.getElementById('retry-btn'),
|
retryBtn: document.getElementById('retry-btn'),
|
||||||
|
fallback: document.getElementById('fallback-link'),
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// Signal to inline fallback script that main.js loaded successfully
|
||||||
|
window.__workshopBooted = true;
|
||||||
|
|
||||||
let ws = null;
|
let ws = null;
|
||||||
let autoRetries = 0;
|
let autoRetries = 0;
|
||||||
let connectTimer = null;
|
let connectTimer = null;
|
||||||
@@ -32,7 +36,9 @@ let connectTimer = null;
|
|||||||
function setStatus(state, message) {
|
function setStatus(state, message) {
|
||||||
dom.dot.className = 'dot ' + state;
|
dom.dot.className = 'dot ' + state;
|
||||||
dom.text.textContent = message;
|
dom.text.textContent = message;
|
||||||
dom.retryBtn.style.display = state === Status.OFFLINE ? 'block' : 'none';
|
var isOffline = state === Status.OFFLINE;
|
||||||
|
dom.retryBtn.style.display = isOffline ? 'block' : 'none';
|
||||||
|
if (dom.fallback) dom.fallback.style.display = isOffline ? 'block' : 'none';
|
||||||
}
|
}
|
||||||
|
|
||||||
function setAgentCount(n) {
|
function setAgentCount(n) {
|
||||||
@@ -105,7 +111,7 @@ function onFail() {
|
|||||||
setStatus(Status.CONNECTING, 'RETRYING (' + autoRetries + '/' + MAX_AUTO_RETRIES + ')\u2026');
|
setStatus(Status.CONNECTING, 'RETRYING (' + autoRetries + '/' + MAX_AUTO_RETRIES + ')\u2026');
|
||||||
setTimeout(connect, RETRY_DELAY_MS);
|
setTimeout(connect, RETRY_DELAY_MS);
|
||||||
} else {
|
} else {
|
||||||
setStatus(Status.OFFLINE, 'OFFLINE \u2014 backend unreachable');
|
setStatus(Status.OFFLINE, 'WORKSHOP OFFLINE');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user