207 lines
6.8 KiB
JavaScript
207 lines
6.8 KiB
JavaScript
(function () {
|
|
"use strict";
|
|
|
|
var endpoint = "/api/cortex-os/runtime-health";
|
|
var states = ["healthy", "degraded", "unavailable", "unknown", "loading", "error", "redacted"];
|
|
|
|
if (window.__cortexOsRuntimeHealthLoaded) {
|
|
return;
|
|
}
|
|
window.__cortexOsRuntimeHealthLoaded = true;
|
|
|
|
function ensurePanel() {
|
|
var panel = document.querySelector("[data-cortex-os-runtime-health]");
|
|
if (panel) {
|
|
return panel;
|
|
}
|
|
|
|
panel = document.createElement("section");
|
|
panel.className = "cortex-os-runtime-health";
|
|
panel.setAttribute("data-cortex-os-runtime-health", "true");
|
|
panel.setAttribute("data-state", "loading");
|
|
|
|
var title = document.createElement("h2");
|
|
title.setAttribute("data-role", "headline");
|
|
title.textContent = "Cortex OS Runtime Health";
|
|
|
|
var badge = document.createElement("span");
|
|
badge.className = "cortex-os-runtime-health__badge";
|
|
badge.setAttribute("data-role", "status");
|
|
badge.textContent = "loading";
|
|
|
|
var summary = document.createElement("p");
|
|
summary.className = "cortex-os-runtime-health__summary";
|
|
summary.setAttribute("data-role", "summary");
|
|
summary.textContent = "Checking Runtime Health.";
|
|
|
|
var list = document.createElement("dl");
|
|
list.className = "cortex-os-runtime-health__signals";
|
|
list.setAttribute("data-role", "signals");
|
|
|
|
var details = document.createElement("section");
|
|
details.className = "cortex-os-runtime-health__details";
|
|
details.setAttribute("data-role", "details");
|
|
|
|
panel.appendChild(title);
|
|
panel.appendChild(badge);
|
|
panel.appendChild(summary);
|
|
panel.appendChild(list);
|
|
panel.appendChild(details);
|
|
|
|
var target = document.querySelector("main.main");
|
|
if (!target) {
|
|
return panel;
|
|
}
|
|
target.appendChild(panel);
|
|
return panel;
|
|
}
|
|
|
|
function setState(panel, state, headline, detail, signals, payloadDetails) {
|
|
var nextState = states.indexOf(state) >= 0 ? state : "unknown";
|
|
panel.setAttribute("data-state", nextState);
|
|
panel.querySelector("[data-role='headline']").textContent = headline || "Runtime Health";
|
|
panel.querySelector("[data-role='status']").textContent = nextState;
|
|
panel.querySelector("[data-role='summary']").textContent = detail || "redacted";
|
|
renderSignals(panel.querySelector("[data-role='signals']"), signals || []);
|
|
renderDetails(panel.querySelector("[data-role='details']"), payloadDetails || {});
|
|
}
|
|
|
|
function renderSignals(list, signals) {
|
|
list.textContent = "";
|
|
signals.slice(0, 3).forEach(function (signal) {
|
|
var name = document.createElement("dt");
|
|
var value = document.createElement("dd");
|
|
name.textContent = signal.signal_id || "redacted";
|
|
value.textContent = signal.state || "unknown";
|
|
if (signal.summary) {
|
|
value.setAttribute("title", signal.summary);
|
|
}
|
|
list.appendChild(name);
|
|
list.appendChild(value);
|
|
});
|
|
}
|
|
|
|
function renderKeyValues(container, title, rows) {
|
|
var group = document.createElement("section");
|
|
group.className = "cortex-os-runtime-health__detail-group";
|
|
|
|
var heading = document.createElement("h3");
|
|
heading.textContent = title;
|
|
group.appendChild(heading);
|
|
|
|
var list = document.createElement("dl");
|
|
list.className = "cortex-os-runtime-health__detail-list";
|
|
rows.forEach(function (row) {
|
|
var key = document.createElement("dt");
|
|
var value = document.createElement("dd");
|
|
key.textContent = row.key || "redacted";
|
|
value.textContent = row.value || "redacted";
|
|
list.appendChild(key);
|
|
list.appendChild(value);
|
|
});
|
|
group.appendChild(list);
|
|
container.appendChild(group);
|
|
}
|
|
|
|
function renderDetails(container, detail) {
|
|
container.textContent = "";
|
|
var signals = detail.signals || [];
|
|
var warnings = detail.warnings || [];
|
|
var redactions = detail.redactions || [];
|
|
var sourceTrace = detail.source_trace || [];
|
|
var authority = detail.authority || {};
|
|
var allAuthorityDenied = Object.keys(authority).every(function (key) {
|
|
return authority[key] === false;
|
|
});
|
|
|
|
renderKeyValues(container, "Signals", signals.slice(0, 3).map(function (signal) {
|
|
return {
|
|
key: signal.signal_id || "redacted",
|
|
value: (signal.state || "unknown") + " | " + (signal.redacted ? "redacted" : "visible") + " | " + (signal.summary || "redacted")
|
|
};
|
|
}));
|
|
renderKeyValues(container, "Warnings", warnings.slice(0, 3).map(function (warning) {
|
|
return {
|
|
key: warning.code || "redacted",
|
|
value: warning.message || "redacted"
|
|
};
|
|
}));
|
|
renderKeyValues(container, "Redactions", redactions.slice(0, 4).map(function (redaction) {
|
|
return {
|
|
key: redaction.reason_code || "redacted",
|
|
value: redaction.label || "redacted"
|
|
};
|
|
}));
|
|
renderKeyValues(container, "Source Trace", sourceTrace.slice(0, 3).map(function (source) {
|
|
return {
|
|
key: source.source_kind || "redacted",
|
|
value: source.label || "redacted"
|
|
};
|
|
}));
|
|
renderKeyValues(container, "Authority", [{
|
|
key: "all denied",
|
|
value: allAuthorityDenied ? "true" : "review required"
|
|
}]);
|
|
}
|
|
|
|
function renderPayload(panel, payload) {
|
|
if (!payload || payload.ok !== true || !payload.result) {
|
|
setState(panel, "error", "Runtime Health is unavailable.", "Runtime Health is unavailable.", []);
|
|
return;
|
|
}
|
|
var displaySummary = payload.result.display_summary || {};
|
|
setState(
|
|
panel,
|
|
payload.result.status,
|
|
displaySummary.headline,
|
|
displaySummary.detail,
|
|
payload.result.signals,
|
|
{
|
|
signals: payload.result.signals,
|
|
warnings: payload.result.warnings,
|
|
redactions: payload.result.redactions,
|
|
source_trace: payload.result.source_trace,
|
|
authority: payload.result.authority
|
|
}
|
|
);
|
|
}
|
|
|
|
function loadRuntimeHealth() {
|
|
var panel = ensurePanel();
|
|
setState(panel, "loading", "Cortex OS Runtime Health", "Checking Runtime Health.", []);
|
|
|
|
fetch(endpoint, {
|
|
method: "GET",
|
|
headers: { Accept: "application/json" },
|
|
credentials: "same-origin",
|
|
cache: "no-store"
|
|
})
|
|
.then(function (response) {
|
|
if (!response.ok) {
|
|
throw new Error("runtime-health-unavailable");
|
|
}
|
|
return response.json();
|
|
})
|
|
.then(function (payload) {
|
|
renderPayload(panel, payload);
|
|
})
|
|
.catch(function () {
|
|
setState(panel, "error", "Runtime Health is unavailable.", "Runtime Health is unavailable.", []);
|
|
});
|
|
}
|
|
|
|
function handlePanelSwitch(event) {
|
|
var detail = (event && event.detail) || {};
|
|
if (detail.name === "cortex-os") {
|
|
loadRuntimeHealth();
|
|
}
|
|
}
|
|
|
|
window.addEventListener("svrnty:panel-switch", handlePanelSwitch);
|
|
|
|
var main = document.querySelector("main.main");
|
|
if (main && main.classList.contains("svrnty-showing-cortex-os")) {
|
|
loadRuntimeHealth();
|
|
}
|
|
})();
|