fix: expose stale runner diagnostics

This commit is contained in:
AgentRun Codex
2026-06-11 09:19:43 +08:00
parent f2fe9f1a2b
commit ec62cc70dd
8 changed files with 279 additions and 5 deletions
+31
View File
@@ -183,6 +183,7 @@ function summarizeRunShowResult(run: JsonValue, result: JsonValue, runId: string
action: "runs-show-summary",
run: summarizeRunRecord(jsonRecordValue(run)),
result: summarizeResultEnvelope(resultRecord),
diagnosis: summarizeDiagnosisRecord(jsonRecordValue(resultRecord?.diagnosis)),
terminalClassification: summarizeTerminalClassificationIfPresent(resultRecord),
liveness: summarizeLivenessRecord(jsonRecordValue(resultRecord?.liveness)),
finalResponse: summarizeFinalResponseRecord(jsonRecordValue(resultRecord?.finalResponse)),
@@ -200,6 +201,7 @@ function summarizeCommandShowResult(command: JsonValue, result: JsonValue, runId
action: "commands-show-summary",
command: summarizeCommandRecord(jsonRecordValue(command)),
result: summarizeResultEnvelope(resultRecord),
diagnosis: summarizeDiagnosisRecord(jsonRecordValue(resultRecord?.diagnosis)),
terminalClassification: summarizeTerminalClassificationIfPresent(resultRecord),
liveness: summarizeLivenessRecord(jsonRecordValue(resultRecord?.liveness)),
finalResponse: summarizeFinalResponseRecord(jsonRecordValue(resultRecord?.finalResponse)),
@@ -238,6 +240,23 @@ function summarizeLivenessRecord(record: JsonRecord | null): JsonRecord | null {
};
}
function summarizeDiagnosisRecord(record: JsonRecord | null): JsonRecord | null {
if (!record) return null;
const run = jsonRecordValue(record.run);
const command = jsonRecordValue(record.command);
const runnerJob = jsonRecordValue(record.runnerJob);
const session = jsonRecordValue(record.session);
return {
...withoutFullRecordBytes(compactRecord(record, { keys: ["category", "staleClaimed", "runnerLost", "terminalCommandOpenRun", "evidenceLevel", "providerEvidence", "providerInterruption", "providerInterruptionKnown", "terminalCategory", "terminalStatus", "failureKind", "failureMessage"] })),
run: run ? withoutFullRecordBytes(compactRecord(run, { keys: ["runId", "status", "claimedBy", "leaseExpiresAt", "leaseExpired", "leaseRemainingMs"] })) : null,
command: command ? withoutFullRecordBytes(compactRecord(command, { keys: ["commandId", "state", "terminalStatus", "acknowledgedAt", "updatedAt"] })) : null,
runnerJob: runnerJob ? withoutFullRecordBytes(compactRecord(runnerJob, { keys: ["runnerJobId", "attemptId", "runnerId", "namespace", "jobName", "phase", "terminalStatus", "startedAt", "finishedAt", "logPath"] })) : null,
session: session ? withoutFullRecordBytes(compactRecord(session, { keys: ["sessionId", "sessionRefNull", "sessionPath"] })) : null,
recoveryActions: summarizeRecoveryActions(record.recoveryActions),
valuesPrinted: false,
};
}
function summarizeFinalResponseRecord(record: JsonRecord | null): JsonRecord | null {
if (!record) return null;
return withoutFullRecordBytes(compactRecord(record, { keys: ["seq", "source", "final", "replyAuthority", "textTruncated", "outputTruncated", "text"] }));
@@ -900,8 +919,10 @@ function summarizeSupervisorRecord(record: JsonRecord | null): JsonRecord | null
const lastActivity = jsonRecordValue(record.lastActivity);
const timeoutBudget = jsonRecordValue(record.timeoutBudget);
const terminalClassification = jsonRecordValue(record.terminalClassification);
const diagnosis = jsonRecordValue(record.diagnosis);
return {
...withoutFullRecordBytes(compactRecord(record, { keys: ["phase", "active", "status", "terminalStatus", "failureKind", "runId", "commandId", "lastSeq"] })),
diagnosis: diagnosis ? summarizeDiagnosisRecord(diagnosis) : null,
terminalClassification: terminalClassification ? summarizeTerminalClassification(terminalClassification) : null,
lastActivity: lastActivity ? withoutFullRecordBytes(compactRecord(lastActivity, { keys: ["sourceSeq", "eventId", "activityKind", "type", "status", "toolName", "itemId", "ageMs", "summary"] })) : null,
timeoutBudget: timeoutBudget ? withoutFullRecordBytes(compactRecord(timeoutBudget, { keys: ["state", "timeoutMs", "elapsedMs", "remainingMs", "startedAt", "source"] })) : null,
@@ -943,6 +964,7 @@ function summarizeRunnerJobRecord(record: JsonRecord | null): JsonRecord | null
...compactRecord(record, { keys: ["action", "mutation", "runId", "commandId", "attemptId", "runnerId", "namespace", "jobName"] }),
logPath: stringValue(runner?.logPath),
backendProfile: stringValue(runner?.backendProfile),
diagnosis: summarizeRunnerJobDiagnosis(jsonRecordValue(record.diagnosis)),
jobUid: stringValue(jobIdentity?.uid),
created: kubernetes?.created === true,
warnings: Array.isArray(record.warnings) ? record.warnings.map((item) => boundedSummaryString(typeof item === "string" ? item : JSON.stringify(item), 240)).filter((item): item is string => Boolean(item)) : [],
@@ -951,6 +973,15 @@ function summarizeRunnerJobRecord(record: JsonRecord | null): JsonRecord | null
};
}
function summarizeRunnerJobDiagnosis(record: JsonRecord | null): JsonRecord | null {
if (!record) return null;
return withoutFullRecordBytes({
...compactRecord(record, { keys: ["category", "runnerLostSuspected", "phase", "evidenceLevel", "runId", "commandId", "runnerJobId", "attemptId", "runnerId", "jobName", "namespace", "logPath"] }),
nextActions: summarizeRecoveryActions(record.nextActions),
valuesPrinted: false,
});
}
function summarizeGenericRecord(record: JsonRecord | null): JsonRecord | null {
if (!record) return null;
return compactRecord(record, {