dashboard: hide forge links instead of guessing <hostname>:3000

Adds services.hyperhive.forge.publicUrl (defaults to the gateway vhost
URL when behindGateway=true, null otherwise). HIVE_FORGE_PUBLIC_URL is
now sourced from it instead of hardcoding https://${forge.domain}
whenever behindGateway is on.

The 4 frontend call sites that built a forge link from
state.forge_public_url now hide the link when that's absent, rather
than guessing http://<browser-hostname>:3000 — a guess that's only
correct by accident once the operator isn't on plain localhost. Fixes
the dashboard H0M3 tile, per-agent-row forge links + agent menu, the
approval-queue PR link, and the per-agent page's own meta-nav forge
link (found during this pass, same defect, not in the original
3-site inventory).

Docs + doc-comments updated to match.
This commit is contained in:
iris 2026-08-03 00:30:22 +02:00 committed by mara
commit 3512e4b019
10 changed files with 96 additions and 42 deletions

View file

@ -1230,10 +1230,13 @@ window.marked = marked;
const metaLinks = $('meta-links');
if (metaLinks && Array.isArray(s.links)) {
metaLinks.replaceChildren();
// Prefer forge_public_url from state (set when the gateway serves
// forge at its sub-domain); fall back to :3000 for local-dev.
const forgeBase = s.forge_public_url || `http://${window.location.hostname}:3000`;
// s.forge_public_url (set from services.hyperhive.forge.publicUrl)
// or falsy — never guessed from "<hostname>:3000". A forge-kind
// link is skipped entirely below when there's no public URL to
// point it at.
const forgeBase = s.forge_public_url || null;
s.links.forEach((lnk, i) => {
if (lnk.kind === 'forge' && !forgeBase) return;
const href = lnk.kind === 'forge' ? forgeBase + (lnk.url || '')
: lnk.kind === 'external' ? (lnk.url || '')
: /* container */ (lnk.url || '');