hermes: show activity during dashboard bootstrap
This commit is contained in:
parent
ece8b009f8
commit
7d284871e8
@ -837,6 +837,44 @@ function replaceOnce(source, before, after, label) {
|
||||
return source.replace(before, after);
|
||||
}
|
||||
|
||||
// The dashboard bundle takes a few seconds to hydrate on slower clients. A
|
||||
// resumed worker must announce that it is connecting instead of exposing an
|
||||
// unexplained black terminal canvas during that interval.
|
||||
{
|
||||
const path = "/opt/hermes/web/index.html";
|
||||
let source = fs.readFileSync(path, "utf8");
|
||||
source = replaceOnce(
|
||||
source,
|
||||
' <body>\n <div id="root"></div>',
|
||||
` <body>
|
||||
<div
|
||||
id="hermes-resume-bootstrap"
|
||||
role="status"
|
||||
aria-live="polite"
|
||||
aria-busy="true"
|
||||
hidden
|
||||
style="position:fixed;inset:0;z-index:2147483647;display:flex;align-items:center;justify-content:center;background:#000;color:#f4f0df;font:14px/1.5 ui-monospace,monospace;text-align:center"
|
||||
>
|
||||
<div>
|
||||
<strong style="display:block;margin-bottom:8px">Opening Hermes worker activity…</strong>
|
||||
<span>Connecting to the accessible, durable transcript.</span>
|
||||
</div>
|
||||
</div>
|
||||
<script>
|
||||
(() => {
|
||||
const params = new URLSearchParams(window.location.search);
|
||||
const loading = document.getElementById("hermes-resume-bootstrap");
|
||||
if (loading && window.location.pathname === "/chat" && params.has("resume")) {
|
||||
loading.hidden = false;
|
||||
}
|
||||
})();
|
||||
</script>
|
||||
<div id="root"></div>`,
|
||||
"resumed activity bootstrap",
|
||||
);
|
||||
fs.writeFileSync(path, source);
|
||||
}
|
||||
|
||||
// A WebGL context can be discarded while a browser tab sleeps or loses its
|
||||
// GPU process. xterm's canvas renderer is fast enough for this single PTY and
|
||||
// can be repainted deterministically from the server-side replay buffer.
|
||||
|
||||
@ -158,6 +158,12 @@ export function SessionActivityPanel({
|
||||
const scrollRef = useRef<HTMLDivElement | null>(null);
|
||||
const stickToBottom = useRef(true);
|
||||
|
||||
useEffect(() => {
|
||||
// index.html exposes an immediate, screen-reader-visible loading state for
|
||||
// resumed links. Remove it only after this durable transcript has mounted.
|
||||
document.getElementById("hermes-resume-bootstrap")?.remove();
|
||||
}, []);
|
||||
|
||||
const load = useCallback(async () => {
|
||||
if (requestRunning.current) return;
|
||||
requestRunning.current = true;
|
||||
|
||||
@ -4,7 +4,7 @@ kind: Kustomization
|
||||
namespace: hermes
|
||||
images:
|
||||
- name: registry.bstein.dev/bstein/hermes-agent
|
||||
digest: sha256:de9463fab178916ff9c880af2f8dae7ffc77585e3f7b73e15f5369454ce0f3dd
|
||||
digest: sha256:8a4a33df755607f69bc8803181cc8d38edf65330343ec8bf94ac5e24ba8d5e58
|
||||
resources:
|
||||
- namespace.yaml
|
||||
- vault-serviceaccount.yaml
|
||||
|
||||
@ -199,6 +199,12 @@ def test_gateway_image_honors_ui_model_and_caps_reasoning():
|
||||
assert "visibleLimit)," in activity
|
||||
assert "function displayText(value: unknown)" in activity
|
||||
assert "open && (" in activity
|
||||
assert 'document.getElementById("hermes-resume-bootstrap")?.remove()' in activity
|
||||
assert 'id="hermes-resume-bootstrap"' in dockerfile
|
||||
assert 'role="status"' in dockerfile
|
||||
assert 'aria-busy="true"' in dockerfile
|
||||
assert "Opening Hermes worker activity…" in dockerfile
|
||||
assert 'params.has("resume")' in dockerfile
|
||||
assert "Open Telegram setup" in dockerfile
|
||||
|
||||
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user