/**
* GMIIE Live Desk UI — last-updated banner, this-week digest, markets ticker, jurisdiction selector.
*/
(function (global) {
const DESK_PAGES = {
home: { desk: 'all', showMarkets: false },
fraud: { desk: 'fraud', showMarkets: false },
legislative: { desk: 'legislative', showMarkets: false },
tracker: { desk: 'all', showMarkets: true },
engine: { desk: 'all', showMarkets: true },
cbdc: { desk: 'cbdc', showMarkets: false },
sports: { desk: 'sports_nil', showMarkets: false },
nil: { desk: 'sports_nil', showMarkets: false },
classroom: { desk: 'all', showMarkets: false },
query: { desk: 'all', showMarkets: false },
};
let jurisdiction = localStorage.getItem('gmiie-jurisdiction') || 'US-FED';
function injectStyles() {
if (document.getElementById('gld-styles')) return;
const s = document.createElement('style');
s.id = 'gld-styles';
s.textContent = `
.gld-live-bar{background:var(--gold-bg,rgba(184,149,58,.1));border-bottom:1px solid var(--gold-bd,rgba(184,149,58,.25));padding:8px 48px;font-family:var(--mono,'JetBrains Mono',monospace);font-size:9px;color:var(--ink2,#444);display:flex;align-items:center;justify-content:space-between;flex-wrap:wrap;gap:8px;}
.gld-live-bar strong{color:var(--gold,#b8953a);}
.gld-jurisdiction{display:flex;align-items:center;gap:6px;flex-wrap:wrap;}
.gld-jurisdiction label{font-weight:700;letter-spacing:.08em;text-transform:uppercase;color:var(--ink3,#777);}
.gld-jurisdiction select{font-family:var(--mono);font-size:9px;padding:4px 8px;border:1px solid var(--rule,#d4c9a8);background:var(--paper,#faf8f3);color:var(--ink,#1a1a1a);}
.gld-week{margin:16px 0;padding:14px;border:1px solid var(--rule,#d4c9a8);background:var(--surface,#ece8dc);}
.gld-week-hd{font-family:var(--mono);font-size:8px;font-weight:700;letter-spacing:.12em;text-transform:uppercase;color:var(--gold,#b8953a);margin-bottom:8px;}
.gld-week ul{margin:0;padding-left:18px;font-size:12px;color:var(--ink2,#444);line-height:1.65;}
.gld-week p.gld-grok{font-size:12px;color:var(--ink,#1a1a1a);margin-top:10px;padding-top:10px;border-top:1px dashed var(--rule,#d4c9a8);font-style:italic;}
.gld-ticker{background:var(--band,#1a1a1a);color:var(--band-ink,rgba(255,255,255,.75));padding:6px 48px;font-family:var(--mono);font-size:8px;display:flex;align-items:center;gap:16px;overflow-x:auto;white-space:nowrap;}
.gld-ticker .gld-tk-lbl{color:var(--gold,#b8953a);font-weight:700;letter-spacing:.1em;flex-shrink:0;}
.gld-ticker .up{color:var(--green,#34d399);}
.gld-ticker .down{color:var(--red,#f87171);}
@media(max-width:768px){.gld-live-bar,.gld-ticker{padding-left:16px;padding-right:16px;}}`;
document.head.appendChild(s);
}
function pageKey() {
return (
document.body.getAttribute('data-gmiie-page') ||
location.pathname.replace(/^\//, '').replace(/\.html$/, '') ||
'home'
);
}
function formatTs(iso, tz) {
if (!iso) return '—';
try {
return new Intl.DateTimeFormat('en-US', {
timeZone: tz || Intl.DateTimeFormat().resolvedOptions().timeZone,
dateStyle: 'medium',
timeStyle: 'short',
}).format(new Date(iso));
} catch {
return new Date(iso).toUTCString();
}
}
function timeoutSignal(ms) {
if (global.AbortSignal && typeof global.AbortSignal.timeout === 'function') {
return global.AbortSignal.timeout(ms);
}
return undefined;
}
function ensureLiveBar() {
if (document.getElementById('gld-live-bar')) return document.getElementById('gld-live-bar');
injectStyles();
const bar = document.createElement('div');
bar.id = 'gld-live-bar';
bar.className = 'gld-live-bar';
bar.innerHTML =
'Loading live desk…' +
'
' +
'
';
const mast =
document.querySelector('.hub-masthead') || document.querySelector('.masthead');
if (mast && mast.parentNode) {
mast.parentNode.insertBefore(bar, mast.nextSibling);
} else {
const troptionsTop = document.querySelector('.troptions-top');
if (troptionsTop && troptionsTop.parentNode) {
troptionsTop.parentNode.insertBefore(bar, troptionsTop.nextSibling);
} else {
document.body.insertBefore(bar, document.body.firstChild);
}
}
const sel = bar.querySelector('#gld-jurisdiction-select');
sel.value = jurisdiction;
sel.addEventListener('change', () => {
jurisdiction = sel.value;
localStorage.setItem('gmiie-jurisdiction', jurisdiction);
loadDigest();
});
return bar;
}
function ensureWeekSection() {
const main = document.querySelector('main');
if (!main || document.getElementById('gld-week')) return null;
const sec = document.createElement('section');
sec.id = 'gld-week';
sec.className = 'gld-week';
sec.innerHTML =
'This week · GMIIE Live Desk
' +
'' +
'';
const intro = main.querySelector('.intro') || main.firstElementChild;
if (intro && intro.nextSibling) {
main.insertBefore(sec, intro.nextSibling);
} else {
main.prepend(sec);
}
return sec;
}
function ensureTicker() {
if (document.getElementById('gld-ticker')) return;
const cfg = DESK_PAGES[pageKey()] || {};
if (!cfg.showMarkets) return;
injectStyles();
const t = document.createElement('div');
t.id = 'gld-ticker';
t.className = 'gld-ticker';
t.innerHTML = 'MarketsLoading…';
const bar = document.getElementById('gld-live-bar');
if (bar && bar.nextSibling) {
bar.parentNode.insertBefore(t, bar.nextSibling);
} else {
const mast = document.querySelector('.masthead');
if (mast) mast.parentNode.insertBefore(t, mast.nextSibling);
}
}
async function loadMarkets() {
const el = document.getElementById('gld-ticker-body');
if (!el) return;
try {
const r = await fetch('/api/gmiie/live/markets', { signal: timeoutSignal(10000) });
const data = r.ok ? await r.json() : null;
if (!data || data.status === 'unavailable' || !data.assets?.length) {
el.textContent = data?.note || 'Markets feed unavailable';
if (data?.fetched_at) el.textContent += ' · last attempt ' + formatTs(data.fetched_at, 'UTC');
return;
}
el.innerHTML = data.assets
.map((a) => {
const ch = a.change_24h_pct;
const cls = ch > 0 ? 'up' : ch < 0 ? 'down' : '';
const sign = ch > 0 ? '+' : '';
return (
'' +
a.symbol +
' $' +
Math.round(a.price_usd).toLocaleString() +
' (' +
sign +
(ch?.toFixed(2) ?? '—') +
'%)'
);
})
.join(' · ');
} catch (_) {
el.textContent = 'Markets feed unavailable';
}
}
async function loadDigest() {
const tz = Intl.DateTimeFormat().resolvedOptions().timeZone;
const url =
'/api/gmiie/live/digest?jurisdiction=' +
encodeURIComponent(jurisdiction) +
'&tz=' +
encodeURIComponent(tz);
try {
const r = await fetch(url, { signal: timeoutSignal(12000) });
if (!r.ok) throw new Error('digest-unavailable');
const data = await r.json();
const upd = document.getElementById('gld-last-updated');
if (upd && data) {
upd.innerHTML =
'Last updated: ' +
formatTs(data.generated_at, data.timezone) +
' · ' +
(data.timezone || tz) +
(data.as_of_date ? ' · As of ' + data.as_of_date : '');
} else if (upd) {
upd.textContent = 'Live desk pending — static snapshot';
}
const pubDate = document.getElementById('pub-date');
if (pubDate && data?.generated_at) {
pubDate.textContent = formatTs(data.generated_at, data.timezone || tz).toUpperCase();
}
const ftGen = document.getElementById('ft-gen');
if (ftGen && data?.generated_at) {
ftGen.textContent = ' · Live desk ' + formatTs(data.generated_at, 'UTC');
}
const list = document.getElementById('gld-week-list');
if (list && data?.this_week?.length) {
list.innerHTML = data.this_week.map((i) => '' + esc(i.text) + '').join('');
} else if (list) {
list.innerHTML =
'Digest pending — static fallback active. Check /api/gmiie/live/status for service health.';
}
const grok = document.getElementById('gld-grok-summary');
if (grok && data?.grok_summary) {
grok.textContent = data.grok_summary;
grok.style.display = 'block';
} else if (grok) {
grok.style.display = 'none';
}
} catch (_) {
fallbackStaticDigest();
}
}
function esc(s) {
const d = document.createElement('div');
d.textContent = s || '';
return d.innerHTML;
}
async function fallbackStaticDigest() {
const list = document.getElementById('gld-week-list');
try {
const r = await fetch('/data/gmiie-daily-digest.json', { signal: timeoutSignal(8000) });
if (!r.ok) throw new Error('static-digest-unavailable');
const data = await r.json();
const upd = document.getElementById('gld-last-updated');
if (upd) {
upd.innerHTML =
'Last updated: ' +
formatTs(data.generated_at, data.timezone) +
' · ' +
(data.timezone || 'UTC') +
' (static fallback)';
}
if (list && data.this_week) {
list.innerHTML = data.this_week.map((i) => '' + esc(i.text) + '').join('');
}
} catch (_) {
const upd = document.getElementById('gld-last-updated');
if (upd) upd.textContent = 'Live desk unavailable — fallback guidance active';
if (list) {
list.innerHTML =
'Live digest is temporarily unavailable. Use Query Console or refresh shortly.';
}
}
}
function init() {
const key = pageKey();
if (!document.body.hasAttribute('data-gmiie-desk')) return;
ensureLiveBar();
if (
[
'home',
'fraud',
'legislative',
'tracker',
'engine',
'cbdc',
'classroom',
'authors',
].includes(key)
) {
ensureWeekSection();
}
ensureTicker();
loadDigest();
loadMarkets();
setInterval(loadMarkets, 4 * 60 * 60 * 1000);
setInterval(loadDigest, 30 * 60 * 1000);
}
if (document.readyState === 'loading') {
document.addEventListener('DOMContentLoaded', init);
} else {
init();
}
global.GMIIELiveDesk = { init, loadDigest, loadMarkets };
})(typeof window !== 'undefined' ? window : globalThis);