fix: add web-probe finding drilldown (#733)

Co-authored-by: Codex <codex@noreply.local>
This commit is contained in:
Lyon
2026-06-23 11:14:01 +08:00
committed by GitHub
parent 9a3c71ee6d
commit ab03ead39d
2 changed files with 144 additions and 14 deletions
@@ -1541,6 +1541,42 @@ async function sampleOnePage(targetPage, { reason, groupSeq, pageRole, targetPag
const title = element.getAttribute("title") || "";
return tag === "button" || role === "button" || //u.test(aria) || //u.test(title);
};
const stableMessageText = (element) => {
const bodySelectors = [
".message-markdown.message-text",
".message-text",
"[data-message-body]",
"[data-testid='message-body']",
"[data-testid*='message-text' i]",
"[data-testid*='final-response' i]"
];
const parts = [];
for (const selector of bodySelectors) {
for (const candidate of Array.from(element.querySelectorAll(selector))) {
if (!visible(candidate)) continue;
const text = trim(candidate.textContent || "", 1200);
if (text && !parts.includes(text)) parts.push(text);
}
}
if (parts.length > 0) return parts.join(" ");
const clone = element.cloneNode(true);
for (const selector of [
".message-duration-meta",
".message-activity-meta",
".api-error-diagnostic",
"[class*='diagnostic' i]",
"[class*='trace' i]",
"[data-trace-id]",
"[data-testid*='trace' i]",
"[data-testid*='event' i]",
"[role='status']",
"[role='alert']",
"button"
]) {
for (const child of Array.from(clone.querySelectorAll(selector))) child.remove();
}
return trim(clone.textContent || "", 1200);
};
const summarize = (selector, limit) => Array.from(document.querySelectorAll(selector)).filter(visible).slice(-limit).map((element, index) => {
const rect = element.getBoundingClientRect();
return {
@@ -1557,6 +1593,22 @@ async function sampleOnePage(targetPage, { reason, groupSeq, pageRole, targetPag
rect: { x: Math.round(rect.x), y: Math.round(rect.y), width: Math.round(rect.width), height: Math.round(rect.height) },
};
});
const summarizeMessages = (selector, limit) => Array.from(document.querySelectorAll(selector)).filter(visible).slice(-limit).map((element, index) => {
const rect = element.getBoundingClientRect();
return {
index,
tag: element.tagName.toLowerCase(),
testId: element.getAttribute("data-testid"),
role: element.getAttribute("role"),
status: element.getAttribute("data-status") || element.getAttribute("aria-busy") || null,
sessionId: element.getAttribute("data-session-id") || null,
messageId: element.getAttribute("data-message-id") || element.getAttribute("id") || null,
traceId: element.getAttribute("data-trace-id") || null,
turnId: element.getAttribute("data-turn-id") || null,
text: stableMessageText(element),
rect: { x: Math.round(rect.x), y: Math.round(rect.y), width: Math.round(rect.width), height: Math.round(rect.height) },
};
});
const resourceTimingSample = (entry) => ({
name: entry.name.split(/[?#]/u)[0].slice(0, 240),
initiatorType: entry.initiatorType,
@@ -1592,7 +1644,7 @@ async function sampleOnePage(targetPage, { reason, groupSeq, pageRole, targetPag
const messageSelector = 'article.message-card, .message-card[data-message-id], article[data-message-id]';
const traceSelector = '[data-testid*="trace" i], [class*="trace" i], [data-trace-id], [data-testid*="event" i]';
const diagnosticSelector = '.api-error-diagnostic, [class*="api-error-diagnostic" i], [class*="message-diagnostic" i], [class*="projection-diagnostic" i], [data-testid="api-error-diagnostic" i], [data-testid="error-diagnostic" i], [data-testid*="diagnostic" i], [role="alert"], [aria-live="assertive"]';
const messages = summarize(messageSelector, 20);
const messages = summarizeMessages(messageSelector, 20);
const traceRows = summarize(traceSelector, 30);
const loadings = collectLoadingNodes();
const sessionRail = collectSessionRailTitles();
@@ -4714,8 +4766,11 @@ function detectCrossPageProjectionDiffs(samples) {
const controlZero = detectTerminalZeroElapsed([control]).length > 0;
const observerZero = detectTerminalZeroElapsed([observer]).length > 0;
const sameSession = (control.routeSessionId || control.activeSessionId || null) && (control.routeSessionId || control.activeSessionId || null) === (observer.routeSessionId || observer.activeSessionId || null);
const projectionDivergent = sameSession && (missingInObserver.length > 0 || Math.abs(controlMessages - observerMessages) > 0 || controlZero !== observerZero || digestMessageTexts(control) !== digestMessageTexts(observer));
const traceVisibilityDivergent = sameSession && !projectionDivergent && Math.abs(controlTraceRows - observerTraceRows) > 0;
const controlMessageDigest = digestMessageTexts(control);
const observerMessageDigest = digestMessageTexts(observer);
const messageTextDigestDiff = controlMessageDigest !== observerMessageDigest;
const projectionDivergent = sameSession && (Math.abs(controlMessages - observerMessages) > 0 || controlZero !== observerZero || messageTextDigestDiff);
const traceVisibilityDivergent = sameSession && !projectionDivergent && (missingInObserver.length > 0 || Math.abs(controlTraceRows - observerTraceRows) > 0);
if (!projectionDivergent && !traceVisibilityDivergent) continue;
rows.push({
sampleGroupSeq,
@@ -4727,7 +4782,10 @@ function detectCrossPageProjectionDiffs(samples) {
observerMessageCount: observerMessages,
controlTraceRowCount: controlTraceRows,
observerTraceRowCount: observerTraceRows,
terminalZeroElapsedDiff: controlZero !== observerZero
terminalZeroElapsedDiff: controlZero !== observerZero,
messageTextDigestDiff,
controlMessageDigest,
observerMessageDigest
});
}
return rows;
@@ -4779,8 +4837,11 @@ function detectAdjacentCrossPageProjectionDiffs(samples) {
const controlZero = detectTerminalZeroElapsed([control]).length > 0;
const observerZero = detectTerminalZeroElapsed([observer]).length > 0;
const missingInObserver = [...visibleTraceIds(control)].filter((item) => !visibleTraceIds(observer).has(item));
const projectionDivergent = missingInObserver.length > 0 || controlMessages !== observerMessages || controlZero !== observerZero || digestMessageTexts(control) !== digestMessageTexts(observer);
const traceVisibilityDivergent = !projectionDivergent && controlTraceRows !== observerTraceRows;
const controlMessageDigest = digestMessageTexts(control);
const observerMessageDigest = digestMessageTexts(observer);
const messageTextDigestDiff = controlMessageDigest !== observerMessageDigest;
const projectionDivergent = controlMessages !== observerMessages || controlZero !== observerZero || messageTextDigestDiff;
const traceVisibilityDivergent = !projectionDivergent && (missingInObserver.length > 0 || controlTraceRows !== observerTraceRows);
if (!projectionDivergent && !traceVisibilityDivergent) continue;
rows.push({
sampleGroupSeq: control.sampleGroupSeq ?? observer.sampleGroupSeq ?? null,
@@ -4793,7 +4854,10 @@ function detectAdjacentCrossPageProjectionDiffs(samples) {
observerMessageCount: observerMessages,
controlTraceRowCount: controlTraceRows,
observerTraceRowCount: observerTraceRows,
terminalZeroElapsedDiff: controlZero !== observerZero
terminalZeroElapsedDiff: controlZero !== observerZero,
messageTextDigestDiff,
controlMessageDigest,
observerMessageDigest
});
}
return rows;