feat: persist code agent session facts

This commit is contained in:
Code Queue Review
2026-05-24 00:25:28 +00:00
parent 48dfbf9e7f
commit 0d824eab41
9 changed files with 792 additions and 22 deletions
+39 -3
View File
@@ -281,7 +281,8 @@ export function summarizeCodeAgentPayload(payload, { httpStatus = null, traceId
implementationType: null,
runnerLimitations: [],
codexStdioFeasibility: null,
longLivedSessionGate: null
longLivedSessionGate: null,
conversationFacts: null
};
}
@@ -329,7 +330,8 @@ export function summarizeCodeAgentPayload(payload, { httpStatus = null, traceId
implementationType: stringOrNull(payload.implementationType),
runnerLimitations: summarizeStringList(payload.runnerLimitations),
codexStdioFeasibility: summarizeCodexStdioFeasibility(payload.codexStdioFeasibility),
longLivedSessionGate: summarizeLongLivedSessionGate(payload.longLivedSessionGate)
longLivedSessionGate: summarizeLongLivedSessionGate(payload.longLivedSessionGate),
conversationFacts: summarizeConversationFacts(payload.conversationFacts)
};
}
@@ -357,7 +359,8 @@ export function summarizeCodeAgentPayload(payload, { httpStatus = null, traceId
implementationType: stringOrNull(payload.implementationType),
runnerLimitations: summarizeStringList(payload.runnerLimitations),
codexStdioFeasibility: summarizeCodexStdioFeasibility(payload.codexStdioFeasibility),
longLivedSessionGate: summarizeLongLivedSessionGate(payload.longLivedSessionGate)
longLivedSessionGate: summarizeLongLivedSessionGate(payload.longLivedSessionGate),
conversationFacts: summarizeConversationFacts(payload.conversationFacts)
};
}
@@ -793,6 +796,39 @@ function summarizeSession(value) {
};
}
function summarizeConversationFacts(value) {
if (!value || typeof value !== "object") return null;
return {
conversationId: stringOrNull(value.conversationId),
sessionId: stringOrNull(value.sessionId),
sessionStatus: stringOrNull(value.sessionStatus),
sessionMode: stringOrNull(value.sessionMode),
capabilityLevel: stringOrNull(value.capabilityLevel),
runnerKind: stringOrNull(value.runnerKind),
workspace: stringOrNull(value.workspace),
sandbox: stringOrNull(value.sandbox),
turnCount: typeof value.turnCount === "number" ? value.turnCount : null,
latestTraceId: stringOrNull(value.latestTraceId),
traceIds: Array.isArray(value.traceIds) ? value.traceIds.map(stringOrNull).filter(Boolean).slice(-6) : [],
latestSkills: value.latestSkills && typeof value.latestSkills === "object"
? {
status: stringOrNull(value.latestSkills.status),
count: typeof value.latestSkills.count === "number" ? value.latestSkills.count : null,
totalCount: typeof value.latestSkills.totalCount === "number" ? value.latestSkills.totalCount : null,
names: Array.isArray(value.latestSkills.names) ? value.latestSkills.names.map(stringOrNull).filter(Boolean).slice(0, 8) : []
}
: null,
recentToolCalls: Array.isArray(value.recentToolCalls)
? value.recentToolCalls.map((tool) => ({
name: stringOrNull(tool?.name),
status: stringOrNull(tool?.status)
})).filter((tool) => tool.name || tool.status).slice(-8)
: [],
valuesRedacted: value.valuesRedacted === true,
secretMaterialStored: value.secretMaterialStored === true
};
}
function summarizeCodexStdioFeasibility(value) {
if (!value || typeof value !== "object") return null;
return {