// intelligence → signals (trade signal cards) // depends on: app.js, intel-shared.js async function loadSignals() { let data; try { data = await api("/admin/api/intelligence/signals"); } catch (_) { data = []; } const grid = document.getElementById("intel-signals-grid"); const empty = document.getElementById("intel-signals-empty"); if (!data || data.length === 0) { grid.innerHTML = ""; empty.style.display = ""; return; } empty.style.display = "none"; grid.innerHTML = data.map(s => { const firstSentence = (s.summary || "").split(/\.\s+/)[0].replace(/\.$/, "") + "."; const ts = s.generated_at ? s.generated_at.slice(0, 16).replace("T", " ") : "—"; let drivers = []; let risks = []; let predIds = []; try { drivers = JSON.parse(s.key_drivers || "[]"); } catch (_) {} try { risks = JSON.parse(s.risk_factors || "[]"); } catch (_) {} try { predIds = JSON.parse(s.supporting_prediction_ids || "[]"); } catch (_) {} const driverItems = drivers.map(d => `
  • ${escapeHtml(d)}
  • `).join(""); const riskItems = risks.map(r => `
  • ${escapeHtml(r)}
  • `).join(""); return `
    ${escapeHtml(s.company_name)}
    ${escapeHtml(s.ticker)}
    ${s.signal}
    conf: ${escapeHtml(s.confidence)} risk: ${escapeHtml(s.risk_level)} ${escapeHtml(s.timeframe)}
    ${escapeHtml(firstSentence)}
    Generated ${ts}
    Summary

    ${escapeHtml(s.summary || "—")}

    ${driverItems ? `
    Key drivers
      ${driverItems}
    ` : ""} ${riskItems ? `
    Risk factors
      ${riskItems}
    ` : ""}
    Data used

    ${predIds.length} predictions  ·  window: 90 days

    `; }).join(""); } function toggleSignalCard(companyId) { const card = document.getElementById(`signal-card-${companyId}`); if (card) card.classList.toggle("expanded"); } async function regenerateSignal(ev, companyId) { ev.stopPropagation(); try { await api(`/admin/api/intelligence/signals/${companyId}`, { method: "DELETE" }); toast("Signal cleared — worker will regenerate on next cycle"); const card = document.getElementById(`signal-card-${companyId}`); if (card) card.remove(); const grid = document.getElementById("intel-signals-grid"); if (!grid.children.length) { document.getElementById("intel-signals-empty").style.display = ""; } } catch (_) { toast("Failed to clear signal", true); } } document.addEventListener("DOMContentLoaded", async () => { const ok = await loadIntelStatsRow(); if (!ok) return; loadSignals(); });