fix(web-probe): focus analysis after latest new session (#833)

Co-authored-by: Codex <codex@noreply.local>
This commit is contained in:
Lyon
2026-06-24 16:59:38 +08:00
committed by GitHub
parent b366bffe93
commit 71c73da1bc
2 changed files with 42 additions and 10 deletions
@@ -2116,15 +2116,18 @@ const reportJsonPath = path.join(analysisDir, "report.json");
const reportMdPath = path.join(analysisDir, "report.md");
const jsonlReadIssues = [];
const sourceSamples = await readJsonl(dataFile("samples.jsonl"), { compact: compactSampleForAnalysis, tail: analyzeTailSamples });
const samples = sourceSamples;
const sampleWindow = sampleTimeWindow(samples, 60_000);
const relatedJsonlTailLimit = analyzeTailSamples > 0 ? Math.max(1200, analyzeTailSamples * 50) : 0;
const smallJsonlTailLimit = analyzeTailSamples > 0 ? Math.max(500, analyzeTailSamples * 8) : 0;
const control = filterRowsByTimeWindow(await readJsonl(dataFile("control.jsonl"), { tail: relatedJsonlTailLimit }), sampleWindow);
const network = filterRowsByTimeWindow(await readJsonl(dataFile("network.jsonl"), { tail: relatedJsonlTailLimit }), sampleWindow);
const consoleEvents = filterRowsByTimeWindow(await readJsonl(dataFile("console.jsonl"), { tail: smallJsonlTailLimit }), sampleWindow);
const errors = filterRowsByTimeWindow(await readJsonl(dataFile("errors.jsonl"), { tail: smallJsonlTailLimit }), sampleWindow);
const artifacts = filterRowsByTimeWindow(await readJsonl(dataFile("artifacts.jsonl"), { tail: smallJsonlTailLimit }), sampleWindow);
const sourceSampleWindow = sampleTimeWindow(sourceSamples, 60_000);
const sourceControl = filterRowsByTimeWindow(await readJsonl(dataFile("control.jsonl"), { tail: relatedJsonlTailLimit }), sourceSampleWindow);
const analysisFocus = analysisFocusFromControl(sourceControl);
const samples = applyAnalysisFocus(sourceSamples, analysisFocus);
const sampleWindow = sampleTimeWindow(samples, 60_000);
const control = applyAnalysisFocus(filterRowsByTimeWindow(sourceControl, sampleWindow), analysisFocus, 1000);
const network = applyAnalysisFocus(filterRowsByTimeWindow(await readJsonl(dataFile("network.jsonl"), { tail: relatedJsonlTailLimit }), sampleWindow), analysisFocus);
const consoleEvents = applyAnalysisFocus(filterRowsByTimeWindow(await readJsonl(dataFile("console.jsonl"), { tail: smallJsonlTailLimit }), sampleWindow), analysisFocus);
const errors = applyAnalysisFocus(filterRowsByTimeWindow(await readJsonl(dataFile("errors.jsonl"), { tail: smallJsonlTailLimit }), sampleWindow), analysisFocus);
const artifacts = applyAnalysisFocus(filterRowsByTimeWindow(await readJsonl(dataFile("artifacts.jsonl"), { tail: smallJsonlTailLimit }), sampleWindow), analysisFocus);
const manifest = await readJson(path.join(stateDir, "manifest.json"));
const heartbeat = await readJson(path.join(stateDir, "heartbeat.json"));
@@ -2185,7 +2188,7 @@ const report = {
command: "web-probe-observe analyze",
generatedAt: new Date().toISOString(),
stateDir,
jsonlScope: { mode: archivePrefix ? "archive" : "current", archivePrefix: archivePrefix || null, dataDir, analyzeTailSamples, sourceSampleCount: sourceSamples.length, effectiveSampleCount: samples.length, sampleWindow, valuesRedacted: true },
jsonlScope: { mode: archivePrefix ? "archive" : "current", archivePrefix: archivePrefix || null, dataDir, analyzeTailSamples, sourceSampleCount: sourceSamples.length, effectiveSampleCount: samples.length, sampleWindow, focus: analysisFocus, valuesRedacted: true },
alertThresholds,
manifest: compactManifest(manifest),
heartbeat: compactHeartbeat(heartbeat),
@@ -2601,6 +2604,33 @@ function filterRowsByTimeWindow(rows, window) {
});
}
function analysisFocusFromControl(control) {
const completedNewSessions = (Array.isArray(control) ? control : [])
.filter((item) => item?.type === "newSession" && item?.phase === "completed" && Number.isFinite(Date.parse(String(item.ts || ""))))
.sort((a, b) => Date.parse(String(a.ts || "")) - Date.parse(String(b.ts || "")));
const latest = completedNewSessions.at(-1) ?? null;
if (!latest) return { mode: "all", reason: "no-new-session-command", startAt: null, startMs: null, commandId: null, valuesRedacted: true };
const startMs = Date.parse(String(latest.ts));
return {
mode: "after-new-session",
reason: "latest-completed-new-session",
startAt: new Date(startMs).toISOString(),
startMs,
commandId: latest.commandId ?? null,
valuesRedacted: true
};
}
function applyAnalysisFocus(rows, focus, graceMs = 0) {
if (!focus || !Number.isFinite(focus.startMs)) return rows;
const minMs = focus.startMs - Math.max(0, Number(graceMs) || 0);
return (Array.isArray(rows) ? rows : []).filter((item) => {
const value = item && (item.ts || item.observedAt || item.startedAt || item.finishedAt || item.createdAt || item.updatedAt);
const ms = Date.parse(String(value || ""));
return Number.isFinite(ms) ? ms >= minMs : true;
});
}
function compactSampleForAnalysis(sample) {
if (!sample || typeof sample !== "object") return sample;
return {