fix: bound codex supervisor diagnostics
This commit is contained in:
+79
-18
@@ -16,6 +16,8 @@ const supervisorRecentCompletedLimit = 5;
|
||||
const supervisorPromptPreviewChars = 160;
|
||||
const supervisorBodyPreviewChars = 180;
|
||||
const supervisorRecentBodyPreviewChars = 80;
|
||||
const diagnosticsIdPreviewLimit = 12;
|
||||
const diagnosticsReasonPreviewLimit = 6;
|
||||
const steerPromptPreviewChars = 320;
|
||||
const minimaxSubmitModel = "minimax-m2.7";
|
||||
const deepseekSubmitModel = "deepseek-chat";
|
||||
@@ -1013,42 +1015,101 @@ function recommendedActionFromDiagnostics(record: Record<string, unknown>): stri
|
||||
return "none";
|
||||
}
|
||||
|
||||
function boundedUniqueStringList(value: unknown, limit = diagnosticsIdPreviewLimit): { items: string[]; count: number; omitted: number; truncated: boolean } {
|
||||
const all = Array.from(new Set(stringList(value))).sort();
|
||||
const items = all.slice(0, limit);
|
||||
return {
|
||||
items,
|
||||
count: all.length,
|
||||
omitted: Math.max(0, all.length - items.length),
|
||||
truncated: all.length > items.length,
|
||||
};
|
||||
}
|
||||
|
||||
function boundedInlineString(value: unknown, maxChars: number): { text: string | null; chars: number; truncated: boolean; omittedChars: number } {
|
||||
const text = asString(value).replace(/\s+/gu, " ").trim();
|
||||
const truncated = text.length > maxChars;
|
||||
return {
|
||||
text: text.length === 0 ? null : truncated ? text.slice(0, maxChars) : text,
|
||||
chars: text.length,
|
||||
truncated,
|
||||
omittedChars: truncated ? text.length - maxChars : 0,
|
||||
};
|
||||
}
|
||||
|
||||
function compactExecutionDiagnostics(value: unknown): Record<string, unknown> | null {
|
||||
const record = asRecord(value);
|
||||
if (record === null) return null;
|
||||
const heartbeatRiskTaskIds = Array.from(new Set([
|
||||
const fullHeartbeatRiskTaskIds = Array.from(new Set([
|
||||
...stringList(record.heartbeatRiskTaskIds),
|
||||
...stringList(record.heartbeatExpiredTaskIds),
|
||||
...stringList(record.heartbeatMissingTaskIds),
|
||||
...stringList(record.staleRecoveryCandidateTaskIds),
|
||||
])).sort();
|
||||
const databaseActiveTaskIds = boundedUniqueStringList(record.databaseActiveTaskIds);
|
||||
const schedulerActiveTaskIds = boundedUniqueStringList(record.schedulerActiveTaskIds);
|
||||
const activeHeartbeatTaskIds = boundedUniqueStringList(record.activeHeartbeatTaskIds);
|
||||
const heartbeatFreshTaskIds = boundedUniqueStringList(record.heartbeatFreshTaskIds);
|
||||
const heartbeatExpiredTaskIds = boundedUniqueStringList(record.heartbeatExpiredTaskIds);
|
||||
const heartbeatMissingTaskIds = boundedUniqueStringList(record.heartbeatMissingTaskIds);
|
||||
const staleRecoveryCandidateTaskIds = boundedUniqueStringList(record.staleRecoveryCandidateTaskIds);
|
||||
const heartbeatRiskTaskIds = boundedUniqueStringList(fullHeartbeatRiskTaskIds);
|
||||
const traceGapTaskIds = boundedUniqueStringList(record.traceGapTaskIds);
|
||||
const traceGapNotStaleTaskIds = boundedUniqueStringList(record.traceGapNotStaleTaskIds);
|
||||
const allReasons = stringList(record.reasons);
|
||||
const reasons = allReasons.slice(0, diagnosticsReasonPreviewLimit).map((reason) => boundedInlineString(reason, 240).text).filter((reason): reason is string => reason !== null);
|
||||
const livenessSummary = boundedInlineString(record.livenessSummary, 420);
|
||||
const omittedCounts = {
|
||||
databaseActiveTaskIds: databaseActiveTaskIds.omitted,
|
||||
schedulerActiveTaskIds: schedulerActiveTaskIds.omitted,
|
||||
activeHeartbeatTaskIds: activeHeartbeatTaskIds.omitted,
|
||||
heartbeatFreshTaskIds: heartbeatFreshTaskIds.omitted,
|
||||
heartbeatExpiredTaskIds: heartbeatExpiredTaskIds.omitted,
|
||||
heartbeatMissingTaskIds: heartbeatMissingTaskIds.omitted,
|
||||
staleRecoveryCandidateTaskIds: staleRecoveryCandidateTaskIds.omitted,
|
||||
heartbeatRiskTaskIds: heartbeatRiskTaskIds.omitted,
|
||||
traceGapTaskIds: traceGapTaskIds.omitted,
|
||||
traceGapNotStaleTaskIds: traceGapNotStaleTaskIds.omitted,
|
||||
reasons: Math.max(0, allReasons.length - reasons.length),
|
||||
livenessSummaryChars: livenessSummary.omittedChars,
|
||||
};
|
||||
return {
|
||||
state: record.state ?? record.health ?? null,
|
||||
degraded: record.degraded ?? null,
|
||||
splitBrain: record.splitBrain ?? null,
|
||||
splitBrainLive: splitBrainLiveFromDiagnostics(record),
|
||||
effectiveLiveness: effectiveLivenessFromDiagnostics({ ...record, heartbeatRiskTaskIds }),
|
||||
recommendedAction: recommendedActionFromDiagnostics({ ...record, heartbeatRiskTaskIds }),
|
||||
livenessSummary: record.livenessSummary ?? null,
|
||||
effectiveLiveness: effectiveLivenessFromDiagnostics({ ...record, heartbeatRiskTaskIds: fullHeartbeatRiskTaskIds }),
|
||||
recommendedAction: recommendedActionFromDiagnostics({ ...record, heartbeatRiskTaskIds: fullHeartbeatRiskTaskIds }),
|
||||
livenessSummary: livenessSummary.text,
|
||||
livenessSummaryChars: livenessSummary.chars,
|
||||
livenessSummaryTruncated: livenessSummary.truncated,
|
||||
executionStateSource: record.executionStateSource ?? null,
|
||||
controlPlane: record.controlPlane ?? null,
|
||||
databaseActiveTaskCount: record.databaseActiveTaskCount ?? null,
|
||||
databaseActiveTaskIds: record.databaseActiveTaskIds ?? [],
|
||||
controlPlane: boundedInlineString(record.controlPlane, 120).text,
|
||||
databaseActiveTaskCount: record.databaseActiveTaskCount ?? databaseActiveTaskIds.count,
|
||||
databaseActiveTaskIds: databaseActiveTaskIds.items,
|
||||
schedulerActiveRunSlotCount: record.schedulerActiveRunSlotCount ?? null,
|
||||
schedulerActiveTaskIds: record.schedulerActiveTaskIds ?? [],
|
||||
activeHeartbeatTaskIds: record.activeHeartbeatTaskIds ?? [],
|
||||
heartbeatFreshTaskIds: record.heartbeatFreshTaskIds ?? [],
|
||||
heartbeatExpiredTaskIds: record.heartbeatExpiredTaskIds ?? [],
|
||||
heartbeatMissingTaskIds: record.heartbeatMissingTaskIds ?? [],
|
||||
staleRecoveryCandidateTaskIds: record.staleRecoveryCandidateTaskIds ?? [],
|
||||
heartbeatRiskTaskIds,
|
||||
traceGapTaskIds: record.traceGapTaskIds ?? [],
|
||||
traceGapNotStaleTaskIds: record.traceGapNotStaleTaskIds ?? [],
|
||||
schedulerActiveTaskIds: schedulerActiveTaskIds.items,
|
||||
activeHeartbeatCount: record.activeHeartbeatCount ?? activeHeartbeatTaskIds.count,
|
||||
activeHeartbeatTaskIds: activeHeartbeatTaskIds.items,
|
||||
heartbeatFreshTaskIds: heartbeatFreshTaskIds.items,
|
||||
heartbeatExpiredTaskIds: heartbeatExpiredTaskIds.items,
|
||||
heartbeatMissingTaskIds: heartbeatMissingTaskIds.items,
|
||||
staleRecoveryCandidateTaskIds: staleRecoveryCandidateTaskIds.items,
|
||||
heartbeatRiskTaskIds: heartbeatRiskTaskIds.items,
|
||||
traceGapTaskIds: traceGapTaskIds.items,
|
||||
traceGapNotStaleTaskIds: traceGapNotStaleTaskIds.items,
|
||||
lastSchedulerHeartbeatAt: record.lastSchedulerHeartbeatAt ?? null,
|
||||
lastObservedAgentEventAt: record.lastObservedAgentEventAt ?? null,
|
||||
lastPersistedTraceAt: record.lastPersistedTraceAt ?? null,
|
||||
oaPublisher: record.oaPublisher ?? null,
|
||||
reasons: record.reasons ?? [],
|
||||
oaPublisher: previewJson(record.oaPublisher ?? null, { maxDepth: 3, maxArrayItems: 4, maxObjectKeys: 12, maxStringLength: 240 }),
|
||||
reasons,
|
||||
listBudget: {
|
||||
idPreviewLimit: diagnosticsIdPreviewLimit,
|
||||
reasonPreviewLimit: diagnosticsReasonPreviewLimit,
|
||||
truncated: Object.values(omittedCounts).some((count) => count > 0),
|
||||
omittedCounts,
|
||||
rawCommand: "bun scripts/cli.ts microservice proxy code-queue /api/tasks/overview?limit=30 --raw --full",
|
||||
},
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user