feat: persist rectification analysis traces

This commit is contained in:
Jesse_Chen
2026-07-30 03:15:06 +08:00
parent 29374ded2a
commit ee10fb4d8a
19 changed files with 1084 additions and 32 deletions
@@ -1,4 +1,4 @@
import type { AgentRun, CandidateFeatureSnapshot, DiagnosticsSummary, PublicMessage, ValidatedDecision } from "../rectification-agent/contracts.ts";
import type { AgentRun, CandidateFeatureSnapshot, DiagnosticsSummary, StoredPublicMessage, ValidatedDecision } from "../rectification-agent/contracts.ts";
import type {
LifeEventRevision,
PendingEvidence,
@@ -20,7 +20,7 @@ export function createRectificationV4MemoryStore(): RectificationV4Store & {
readonly diagnostics: Map<string, DiagnosticsSummary>;
readonly featureSnapshots: Map<string, CandidateFeatureSnapshot>;
readonly agentRuns: Map<string, AgentRun>;
readonly publicMessages: Map<string, PublicMessage>;
readonly publicMessages: Map<string, StoredPublicMessage>;
readonly validatedDecisions: Map<string, ValidatedDecision>;
readonly pendingEvidence: Map<string, PendingEvidence>;
} {
@@ -32,7 +32,7 @@ export function createRectificationV4MemoryStore(): RectificationV4Store & {
const diagnostics = new Map<string, DiagnosticsSummary>();
const featureSnapshots = new Map<string, CandidateFeatureSnapshot>();
const agentRuns = new Map<string, AgentRun>();
const publicMessages = new Map<string, PublicMessage>();
const publicMessages = new Map<string, StoredPublicMessage>();
const validatedDecisions = new Map<string, ValidatedDecision>();
const pendingEvidence = new Map<string, PendingEvidence>();
@@ -69,6 +69,13 @@ export function createRectificationV4MemoryStore(): RectificationV4Store & {
.filter((turn) => turn.caseId === caseId)
.sort((left, right) => left.caseVersion - right.caseVersion || left.createdAt.localeCompare(right.createdAt));
},
async loadAnalysisMessages(userId, caseId) {
owned(userId, caseId);
return [...jobs.values()]
.filter((job) => job.caseId === caseId && publicMessages.get(job.id)?.analysisTrace)
.sort((left, right) => turns.get(left.turnId)!.caseVersion - turns.get(right.turnId)!.caseVersion)
.map((job) => ({ sourceTurnId: job.turnId, trace: publicMessages.get(job.id)!.analysisTrace! }));
},
async loadLatestValidatedDecision(userId, caseId) {
const caseValue = cases.get(caseId);
if (!caseValue || caseValue.userId !== userId) return null;