import type { AssistantDebugRouteRecord, AssistantExecutionStateRecord, AssistantFallbackType, AssistantProblemAnswerMode, AssistantReplyType, AssistantRequirement, UnifiedRetrievalResult, AnswerGroundingCheck, FaLiveRouteAuditDebug, RbpLiveRouteAuditDebug, RequirementCoverageReport } from "../types/assistant"; import type { AnswerStructureV11 } from "../types/stage1Contracts"; import type { InvestigationStateWithProblemUnits } from "../types/stage2ProblemUnits"; import type { ClaimBoundAnchorAudit, TargetedEvidenceAcquisitionAudit } from "./assistantClaimBoundEvidence"; import type { AssistantContractsBundleV1 } from "./assistantContractsBundleAssembler"; import type { AssistantOutcomeClassV1 } from "./assistantOrchestrationContracts"; import type { AssistantFollowupUsage } from "./assistantFollowupUsage"; import type { CompanyAnchorSet } from "./companyAnchorResolver"; import type { AssistantRetrievalCallRecord, AssistantRetrievalRawResultRecord } from "./assistantDeepTurnRetrievalRuntimeAdapter"; import type { DomainPolarityGuardAudit, EvidenceAdmissibilityAudit, GroundedAnswerEligibilityAudit, TemporalGuardAudit } from "./assistantRuntimeGuards"; import { buildStage4AnswerContractAuditV1 } from "./assistantStage4AnswerContractAudit"; export interface DeepAnalysisMessageLogDetailsInput { sessionId: string; messageId: string; userMessage: string; normalizerOutput: unknown; executionPlan: Array>; resolvedExecutionState: AssistantExecutionStateRecord[]; routes: AssistantDebugRouteRecord[]; retrievalCalls: AssistantRetrievalCallRecord[]; retrievalResultsRaw: AssistantRetrievalRawResultRecord[]; retrievalResultsNormalized: UnifiedRetrievalResult[]; requirementsExtracted: AssistantRequirement[]; coverageReport: RequirementCoverageReport; groundingCheck: AnswerGroundingCheck; replyType: AssistantReplyType; droppedIntentSegments: string[]; questionTypeClass: string; companyAnchors: CompanyAnchorSet | null; runtimeAnalysisContext: { active: boolean; as_of_date: string | null; period_from: string | null; period_to: string | null; source: string | null; snapshot_mode: "auto" | "force_snapshot" | "force_live"; }; businessScopeResolution: { business_scope_raw?: string[]; business_scope_resolved?: string[]; company_grounding_applied?: boolean; scope_resolution_reason?: string[]; }; temporalGuard: TemporalGuardAudit; polarityAudit: DomainPolarityGuardAudit; claimAnchorAudit: ClaimBoundAnchorAudit; targetedEvidenceAudit: TargetedEvidenceAcquisitionAudit; evidenceAdmissibilityGateAudit: EvidenceAdmissibilityAudit; rbpLiveRouteAudit: RbpLiveRouteAuditDebug | null; faLiveRouteAudit: FaLiveRouteAuditDebug | null; groundedAnswerEligibilityGuard: GroundedAnswerEligibilityAudit; followupStateUsage: AssistantFollowupUsage | null; compositionDebug: { problem_centric_answer_applied?: boolean; problem_units_used_count?: number; problem_answer_mode?: AssistantProblemAnswerMode; problem_unit_ids_used?: string[]; fallback_type?: AssistantFallbackType; }; outcomeClassV1: AssistantOutcomeClassV1; assistantOrchestrationContractsV1: AssistantContractsBundleV1["assistantOrchestrationContractsV1"]; answerStructureV11: AnswerStructureV11 | null; investigationStateSnapshot: InvestigationStateWithProblemUnits | null; assistantReply: string; traceId: string; } function toAnalysisContext(input: DeepAnalysisMessageLogDetailsInput["runtimeAnalysisContext"]): Record | null { if (!input.active) { return null; } return { as_of_date: input.as_of_date, period_from: input.period_from, period_to: input.period_to, source: input.source, snapshot_mode: input.snapshot_mode }; } function resolveCoverageStatus(coverageReport: RequirementCoverageReport): "full" | "partial_or_limited" { return coverageReport.requirements_total === coverageReport.requirements_covered && coverageReport.requirements_uncovered.length === 0 && coverageReport.requirements_partially_covered.length === 0 ? "full" : "partial_or_limited"; } export type DeepAnalysisLogDetails = Record; export function buildDeepAnalysisProcessedLogDetails(input: DeepAnalysisMessageLogDetailsInput): DeepAnalysisLogDetails { const analysisContext = toAnalysisContext(input.runtimeAnalysisContext); const answerContractStage4Audit = buildStage4AnswerContractAuditV1(input.assistantReply); return { session_id: input.sessionId, message_id: input.messageId, user_message: input.userMessage, normalizer_output: input.normalizerOutput, execution_plan: input.executionPlan, resolved_execution_state: input.resolvedExecutionState, routes: input.routes, retrieval_calls: input.retrievalCalls, retrieval_results_raw: input.retrievalResultsRaw, retrieval_results_normalized: input.retrievalResultsNormalized, requirements_extracted: input.requirementsExtracted, requirements_total: input.coverageReport.requirements_total, requirements_covered: input.coverageReport.requirements_covered, requirements_uncovered: input.coverageReport.requirements_uncovered, coverage_status: resolveCoverageStatus(input.coverageReport), answer_grounding_status: input.groundingCheck.status, reply_semantic_type: input.replyType, why_included_summary: input.groundingCheck.why_included_summary, selection_reason_summary: input.groundingCheck.selection_reason_summary, route_subject_match: input.groundingCheck.route_subject_match, clarification_target: input.coverageReport.clarification_needed_for, dropped_intent_segments: input.droppedIntentSegments, question_type_class: input.questionTypeClass, company_anchors: input.companyAnchors, analysis_context_applied: input.runtimeAnalysisContext.active, analysis_context: analysisContext, business_scope_raw: input.businessScopeResolution.business_scope_raw, business_scope_resolved: input.businessScopeResolution.business_scope_resolved, company_grounding_applied: input.businessScopeResolution.company_grounding_applied, scope_resolution_reason: input.businessScopeResolution.scope_resolution_reason, company_scope_resolution_reason: input.businessScopeResolution.scope_resolution_reason, raw_time_anchor: input.temporalGuard.raw_time_anchor, raw_time_scope: input.temporalGuard.raw_time_scope, resolved_time_anchor: input.temporalGuard.resolved_time_anchor, resolved_primary_period: input.temporalGuard.resolved_primary_period, effective_primary_period: input.temporalGuard.effective_primary_period, temporal_guard_input: input.temporalGuard.temporal_guard_input, temporal_alignment_status: input.temporalGuard.temporal_alignment_status, temporal_resolution_source: input.temporalGuard.temporal_resolution_source, temporal_guard_basis: input.temporalGuard.temporal_guard_basis, temporal_guard_applied: input.temporalGuard.temporal_guard_applied, temporal_guard_outcome: input.temporalGuard.temporal_guard_outcome, temporal_guard: input.temporalGuard, raw_numeric_tokens: input.polarityAudit.raw_numeric_tokens, classified_numeric_tokens: input.polarityAudit.classified_numeric_tokens, rejected_as_non_accounts: input.polarityAudit.rejected_as_non_accounts, resolved_account_anchors: input.polarityAudit.resolved_account_anchors, domain_polarity_guard: input.polarityAudit, claim_anchor_audit: input.claimAnchorAudit, settlement_role: input.claimAnchorAudit.settlement_role ?? null, settlement_role_resolution_reason: input.claimAnchorAudit.settlement_role_resolution_reason ?? [], polarity_resolution_status: input.claimAnchorAudit.polarity_resolution_status ?? "not_applicable", targeted_evidence_acquisition: input.targetedEvidenceAudit, evidence_admissibility_gate: input.evidenceAdmissibilityGateAudit, ...(input.rbpLiveRouteAudit ? { rbp_live_route_audit: input.rbpLiveRouteAudit } : {}), ...(input.faLiveRouteAudit ? { fa_live_route_audit: input.faLiveRouteAudit } : {}), eligibility_time_basis: input.groundedAnswerEligibilityGuard.eligibility_time_basis, grounded_answer_eligibility_guard: input.groundedAnswerEligibilityGuard, ...(input.followupStateUsage ? { followup_state_usage: input.followupStateUsage } : {}), problem_centric_answer_applied: input.compositionDebug.problem_centric_answer_applied ?? false, problem_units_used_count: input.compositionDebug.problem_units_used_count ?? 0, problem_answer_mode: input.compositionDebug.problem_answer_mode ?? "stage1_policy_v11", ...(Array.isArray(input.compositionDebug.problem_unit_ids_used) && input.compositionDebug.problem_unit_ids_used.length > 0 ? { problem_unit_ids_used: input.compositionDebug.problem_unit_ids_used } : {}), assistant_outcome_class_v1: input.outcomeClassV1, assistant_orchestration_contracts_v1: input.assistantOrchestrationContractsV1, answer_contract_stage4_v1: answerContractStage4Audit, answer_structure_v11: input.answerStructureV11, investigation_state_snapshot: input.investigationStateSnapshot, fallback_type: input.compositionDebug.fallback_type, assistant_reply: input.assistantReply, reply_type: input.replyType, trace_id: input.traceId }; }