fix: scope sentinel checks to selected run
This commit is contained in:
@@ -2241,9 +2241,11 @@ const dom = await page.evaluate(async () => {
|
||||
const trendTooltip = document.querySelector("[data-monitor-trend-tooltip='true']");
|
||||
const timeline = document.querySelector("[data-monitor-timeline='true']");
|
||||
const workspace = document.querySelector("[data-monitor-independent-scroll='true']");
|
||||
const panes = Array.from(document.querySelectorAll(".workspace-grid .pane"));
|
||||
const checksPanel = document.querySelector("[data-monitor-checks='true']");
|
||||
const panes = Array.from(document.querySelectorAll(".workspace-grid .pane, [data-monitor-checks='true']"));
|
||||
const detailPane = document.querySelector(".workspace-grid .pane-detail");
|
||||
const detailHeader = document.querySelector("#monitor-web-root > div > section.workspace-grid > main > div.pane-header");
|
||||
const detailHeader = detailPane?.querySelector(".pane-header");
|
||||
const checksHeader = checksPanel?.querySelector(".pane-header");
|
||||
const internalTextPattern = /水合|投影|Trace|trace|Shell|API|DOM|Console|console|Runner|runner|JSONL|steer|facts|分页|HTTP|http|requestfailed|pageerror|Final Response|Code Agent|web-probe|observe|analyzer|终态/u;
|
||||
const cards = Array.from(document.querySelectorAll(".finding-card")).slice(0, 8).map((card) => ({
|
||||
code: String(card.querySelector(".check-code")?.textContent || "").trim(),
|
||||
@@ -2281,6 +2283,63 @@ const dom = await page.evaluate(async () => {
|
||||
total: errorSampleCount(latestCounts) + warningSampleCount(latestCounts),
|
||||
allSamples: allSampleCount(latestCounts),
|
||||
};
|
||||
const latestDetailPayload = latestRunCounts.runId
|
||||
? await fetch("/api/runs/" + encodeURIComponent(latestRunCounts.runId), { cache: "no-store" }).then((item) => item.json()).catch(() => null)
|
||||
: null;
|
||||
const latestDetailRows = Array.isArray(latestDetailPayload?.findings) ? latestDetailPayload.findings : [];
|
||||
const rowSeverity = (row) => {
|
||||
const raw = String(row?.maxSeverity || row?.checkLevel || row?.severity || row?.level || "").toLowerCase();
|
||||
if (["red", "critical", "error", "blocked", "failed"].includes(raw)) return "red";
|
||||
if (["warning", "warn", "amber"].includes(raw)) return "warning";
|
||||
if (["info", "notice"].includes(raw)) return "info";
|
||||
return "healthy";
|
||||
};
|
||||
const sampleCount = (row) => Number.isFinite(Number(row?.count)) ? Number(row.count) : 1;
|
||||
const summarizeRows = (rows) => {
|
||||
const errorRows = rows.filter((row) => rowSeverity(row) === "red");
|
||||
const warningRows = rows.filter((row) => rowSeverity(row) === "warning");
|
||||
const sum = (items) => items.reduce((total, row) => total + sampleCount(row), 0);
|
||||
return {
|
||||
typeCount: rows.length,
|
||||
alertTypeCount: errorRows.length + warningRows.length,
|
||||
errorSamples: sum(errorRows),
|
||||
warningSamples: sum(warningRows),
|
||||
alertSamples: sum(errorRows) + sum(warningRows),
|
||||
};
|
||||
};
|
||||
const latestDetailSummary = summarizeRows(latestDetailRows);
|
||||
const workspaceRect = workspace?.getBoundingClientRect();
|
||||
const checksRect = checksPanel?.getBoundingClientRect();
|
||||
const checkScope = {
|
||||
present: Boolean(checksPanel),
|
||||
scope: checksPanel?.getAttribute("data-check-scope") || null,
|
||||
runId: checksPanel?.getAttribute("data-check-run-id") || null,
|
||||
typeCount: numberValue(checksPanel?.getAttribute("data-check-type-count")),
|
||||
alertTypeCount: numberValue(checksPanel?.getAttribute("data-check-alert-type-count")),
|
||||
errorSamples: numberValue(checksPanel?.getAttribute("data-check-error-samples")),
|
||||
warningSamples: numberValue(checksPanel?.getAttribute("data-check-warning-samples")),
|
||||
alertSamples: numberValue(checksPanel?.getAttribute("data-check-alert-samples")),
|
||||
visibleCardCount: document.querySelectorAll(".finding-list .finding-card").length,
|
||||
visibleAlertSamples: numberValue(checksPanel?.getAttribute("data-visible-check-alert-samples")),
|
||||
matchesLatestRun: false,
|
||||
matchesRunDetail: false,
|
||||
belowWorkspace: Boolean(workspaceRect && checksRect && checksRect.top >= workspaceRect.bottom - 2),
|
||||
fullWidth: Boolean(workspaceRect && checksRect && checksRect.width >= workspaceRect.width - 2),
|
||||
};
|
||||
checkScope.matchesLatestRun = checkScope.present === true
|
||||
&& checkScope.scope === "run"
|
||||
&& checkScope.runId === latestRunCounts.runId
|
||||
&& checkScope.errorSamples === latestRunCounts.error
|
||||
&& checkScope.warningSamples === latestRunCounts.warning
|
||||
&& checkScope.alertSamples === latestRunCounts.total;
|
||||
checkScope.matchesRunDetail = checkScope.present === true
|
||||
&& checkScope.typeCount === latestDetailSummary.typeCount
|
||||
&& checkScope.alertTypeCount === latestDetailSummary.alertTypeCount
|
||||
&& checkScope.errorSamples === latestDetailSummary.errorSamples
|
||||
&& checkScope.warningSamples === latestDetailSummary.warningSamples
|
||||
&& checkScope.alertSamples === latestDetailSummary.alertSamples
|
||||
&& checkScope.visibleCardCount === latestDetailSummary.alertTypeCount
|
||||
&& checkScope.visibleAlertSamples === latestDetailSummary.alertSamples;
|
||||
const overviewCounts = overviewPayload?.severityCounts && typeof overviewPayload.severityCounts === "object" && !Array.isArray(overviewPayload.severityCounts)
|
||||
? overviewPayload.severityCounts
|
||||
: {};
|
||||
@@ -2349,6 +2408,8 @@ const dom = await page.evaluate(async () => {
|
||||
trendPanelText: text("#trend-heading"),
|
||||
chartCounts,
|
||||
latestRunCounts,
|
||||
latestDetailSummary,
|
||||
checkScope,
|
||||
overviewSamples,
|
||||
scopeLabels: {
|
||||
latestPointLegend: legendTexts.some((item) => item.includes("最新点")),
|
||||
@@ -2366,6 +2427,7 @@ const dom = await page.evaluate(async () => {
|
||||
return style.overflowY === "auto" || style.overflowY === "scroll";
|
||||
}),
|
||||
stickyHeader: stickyHeaderSummary(detailPane, detailHeader),
|
||||
stickyChecksHeader: stickyHeaderSummary(checksPanel, checksHeader),
|
||||
},
|
||||
layout: {
|
||||
viewport,
|
||||
@@ -2428,6 +2490,10 @@ const ok = !navigationError
|
||||
&& dom.trendCurve === true
|
||||
&& dom.chartCounts?.ok === true
|
||||
&& dom.chartCounts?.matchesLatestRun === true
|
||||
&& dom.checkScope?.matchesLatestRun === true
|
||||
&& dom.checkScope?.matchesRunDetail === true
|
||||
&& dom.checkScope?.belowWorkspace === true
|
||||
&& dom.checkScope?.fullWidth === true
|
||||
&& dom.scopeLabels?.latestPointLegend === true
|
||||
&& dom.scopeLabels?.historicalSamples === true
|
||||
&& (dom.trendDotCount === 0 || (dom.trendTooltip?.visible === true && dom.trendTooltip?.hasValues === true && dom.trendTooltip?.hasTime === true))
|
||||
@@ -2438,6 +2504,9 @@ const ok = !navigationError
|
||||
&& dom.scrollModel?.stickyHeader?.present === true
|
||||
&& dom.scrollModel?.stickyHeader?.coversScroll === true
|
||||
&& dom.scrollModel?.stickyHeader?.backgroundOpaque === true
|
||||
&& dom.scrollModel?.stickyChecksHeader?.present === true
|
||||
&& dom.scrollModel?.stickyChecksHeader?.coversScroll === true
|
||||
&& dom.scrollModel?.stickyChecksHeader?.backgroundOpaque === true
|
||||
&& dom.layout?.horizontalOverflow !== true
|
||||
&& pageErrors.length === 0;
|
||||
|
||||
@@ -4727,6 +4796,8 @@ function renderDashboardResult(result: Record<string, unknown>): string {
|
||||
const layout = record(dom.layout);
|
||||
const chartCounts = record(dom.chartCounts);
|
||||
const latestRunCounts = record(dom.latestRunCounts);
|
||||
const latestDetailSummary = record(dom.latestDetailSummary);
|
||||
const checkScope = record(dom.checkScope);
|
||||
const overviewSamples = record(dom.overviewSamples);
|
||||
const screenshot = record(result.screenshot);
|
||||
const remote = record(result.remote);
|
||||
@@ -4771,6 +4842,25 @@ function renderDashboardResult(result: Record<string, unknown>): string {
|
||||
overviewSamples.warning ?? "-",
|
||||
]]),
|
||||
"",
|
||||
table(["CHECK_SCOPE", "CHECK_RUN", "CHECK_TYPES", "CHECK_ALERT_TYPES", "CHECK_ERR", "CHECK_WARN", "CHECK_TOTAL", "CHECK_MATCH_LATEST", "CHECK_MATCH_DETAIL"], [[
|
||||
checkScope.scope ?? "-",
|
||||
checkScope.runId ?? "-",
|
||||
`${checkScope.typeCount ?? "-"}/${latestDetailSummary.typeCount ?? "-"}`,
|
||||
`${checkScope.alertTypeCount ?? "-"}/${latestDetailSummary.alertTypeCount ?? "-"}`,
|
||||
checkScope.errorSamples ?? "-",
|
||||
checkScope.warningSamples ?? "-",
|
||||
checkScope.alertSamples ?? "-",
|
||||
checkScope.matchesLatestRun ?? "-",
|
||||
checkScope.matchesRunDetail ?? "-",
|
||||
]]),
|
||||
"",
|
||||
table(["CHECK_VISIBLE", "CHECK_VISIBLE_ALERT", "BELOW_WORKSPACE", "FULL_WIDTH"], [[
|
||||
checkScope.visibleCardCount ?? "-",
|
||||
checkScope.visibleAlertSamples ?? "-",
|
||||
checkScope.belowWorkspace ?? "-",
|
||||
checkScope.fullWidth ?? "-",
|
||||
]]),
|
||||
"",
|
||||
table(["VIEWPORT", "DOC", "H_OVERFLOW", "OVERFLOW_COUNT"], [[
|
||||
result.viewport,
|
||||
`${record(layout.documentSize).width ?? "-"}x${record(layout.documentSize).height ?? "-"}`,
|
||||
|
||||
Reference in New Issue
Block a user