import { nanoid } from "nanoid"; import type { AssistantConversationItem, AssistantDebugPayload, AssistantRequirement, AnswerGroundingCheck, RequirementCoverageReport, UnifiedRetrievalResult } from "../types/assistant"; import type { NormalizeResponsePayload, RouteHintSummary } from "../types/normalizer"; import type { InvestigationStateWithProblemUnits } from "../types/stage2ProblemUnits"; import type { AssistantDeepTurnInputBuilderArgs } from "./assistantDeepTurnInputBuilder"; import { buildAssistantDeepTurnPackagingInput } from "./assistantDeepTurnInputBuilder"; import { assembleAssistantDeepTurnPackaging } from "./assistantDeepTurnPackaging"; import type { AssistantAnalysisContextForContract, AssistantRuntimeAnalysisContextForPrePackaging } from "./assistantDeepTurnPrePackagingContext"; import { buildAssistantDeepTurnPrePackagingContext } from "./assistantDeepTurnPrePackagingContext"; import { buildAssistantInvestigationStateSnapshot, persistAssistantInvestigationStateSnapshot } from "./assistantInvestigationStateRuntimeAdapter"; type AssistantDeepTurnCompositionForPackaging = AssistantDeepTurnInputBuilderArgs["composition"] & { assistant_reply: string; }; export interface AssistantDeepTurnPackagingRuntimeInput { featureInvestigationStateV1: boolean; sessionId: string; questionId: string; userMessage: string; normalized: { trace_id: string; prompt_version: string; schema_version: string; normalized: NormalizeResponsePayload["normalized"]; }; normalizedQuestion: string; routeSummary: RouteHintSummary | null; executionPlan: AssistantDeepTurnInputBuilderArgs["executionPlan"]; requirementExtractionRequirements: AssistantRequirement[]; coverageEvaluationRequirements: AssistantRequirement[]; coverageReport: RequirementCoverageReport; groundingCheck: AnswerGroundingCheck; retrievalCalls: Array>; retrievalResultsRaw: unknown[]; retrievalResults: UnifiedRetrievalResult[]; questionTypeClass: string; companyAnchors: unknown; runtimeAnalysisContext: AssistantDeepTurnInputBuilderArgs["runtimeAnalysisContext"]; businessScopeResolution: AssistantDeepTurnInputBuilderArgs["businessScopeResolution"]; temporalGuard: Record; polarityAudit: Record; claimAnchorAudit: Record; targetedEvidenceAudit: unknown; evidenceAdmissibilityGateAudit: unknown; rbpLiveRouteAudit: unknown | null; faLiveRouteAudit: unknown | null; groundedAnswerEligibilityGuard: Record; followupStateUsage?: unknown; followupApplied: boolean; composition: AssistantDeepTurnCompositionForPackaging; featureContractsV11: boolean; featureAnswerPolicyV11: boolean; previousInvestigationState: InvestigationStateWithProblemUnits | null | undefined; addressRuntimeMetaForDeep: | { attempted?: boolean; applied?: boolean; reason?: string | null; provider?: string | null; fallbackRuleHit?: string | null; toolGateDecision?: string | null; toolGateReason?: string | null; predecomposeContract?: unknown; orchestrationContract?: unknown; } | null | undefined; extractDroppedIntentSegments: (normalizedPayload: NormalizeResponsePayload["normalized"]) => string[]; buildDebugRoutes: (routeSummary: RouteHintSummary | null) => Array>; extractExecutionState: (normalizedPayload: NormalizeResponsePayload["normalized"]) => unknown; sanitizeReply: (value: string, fallback?: string) => string; persistInvestigationState: (sessionId: string, snapshot: InvestigationStateWithProblemUnits) => void; nowIso?: () => string; messageIdFactory?: () => string; buildPrePackagingContextFn?: typeof buildAssistantDeepTurnPrePackagingContext; buildInvestigationStateSnapshotFn?: typeof buildAssistantInvestigationStateSnapshot; persistInvestigationStateSnapshotFn?: typeof persistAssistantInvestigationStateSnapshot; buildDeepTurnPackagingInputFn?: typeof buildAssistantDeepTurnPackagingInput; assembleDeepTurnPackagingFn?: typeof assembleAssistantDeepTurnPackaging; } export interface AssistantDeepTurnPackagingRuntimeOutput { messageId: string; investigationStateSnapshot: InvestigationStateWithProblemUnits | null; droppedIntentSegments: string[]; analysisContextForContract: AssistantAnalysisContextForContract | null; routesForDebug: Array>; resolvedExecutionState: unknown; safeAssistantReplyBase: string; safeAssistantReply: string; debug: AssistantDebugPayload; assistantItem: AssistantConversationItem; deepAnalysisLogDetails: Record; } export function runAssistantDeepTurnPackagingRuntime( input: AssistantDeepTurnPackagingRuntimeInput ): AssistantDeepTurnPackagingRuntimeOutput { const buildPrePackagingContextSafe = input.buildPrePackagingContextFn ?? buildAssistantDeepTurnPrePackagingContext; const buildInvestigationStateSnapshotSafe = input.buildInvestigationStateSnapshotFn ?? buildAssistantInvestigationStateSnapshot; const persistInvestigationStateSnapshotSafe = input.persistInvestigationStateSnapshotFn ?? persistAssistantInvestigationStateSnapshot; const buildDeepTurnPackagingInputSafe = input.buildDeepTurnPackagingInputFn ?? buildAssistantDeepTurnPackagingInput; const assembleDeepTurnPackagingSafe = input.assembleDeepTurnPackagingFn ?? assembleAssistantDeepTurnPackaging; const deepTurnPrePackagingContext = buildPrePackagingContextSafe({ normalizedPayload: input.normalized.normalized, routeSummary: input.routeSummary, runtimeAnalysisContext: input.runtimeAnalysisContext as AssistantRuntimeAnalysisContextForPrePackaging, assistantReply: input.composition.assistant_reply, extractDroppedIntentSegments: input.extractDroppedIntentSegments, buildDebugRoutes: input.buildDebugRoutes, extractExecutionState: input.extractExecutionState, sanitizeReply: input.sanitizeReply }); const investigationStateSnapshot = buildInvestigationStateSnapshotSafe({ featureEnabled: input.featureInvestigationStateV1, previousState: input.previousInvestigationState, timestamp: input.nowIso ? input.nowIso() : new Date().toISOString(), questionId: input.questionId, userMessage: input.userMessage, routeSummary: input.routeSummary, requirements: input.coverageEvaluationRequirements, coverageReport: input.coverageReport, retrievalResults: input.retrievalResults, replyType: input.composition.reply_type, followupApplied: input.followupApplied }); persistInvestigationStateSnapshotSafe({ featureEnabled: input.featureInvestigationStateV1, sessionId: input.sessionId, snapshot: investigationStateSnapshot, persist: input.persistInvestigationState }); const messageId = input.messageIdFactory ? input.messageIdFactory() : `msg-${nanoid(10)}`; const deepTurnPackagingInput = buildDeepTurnPackagingInputSafe({ sessionId: input.sessionId, messageId, userMessage: input.userMessage, normalized: input.normalized, normalizedQuestion: input.normalizedQuestion, routeSummary: input.routeSummary, droppedIntentSegments: deepTurnPrePackagingContext.droppedIntentSegments, analysisContextForContract: deepTurnPrePackagingContext.analysisContextForContract, executionPlan: input.executionPlan, requirementExtractionRequirements: input.requirementExtractionRequirements, coverageEvaluationRequirements: input.coverageEvaluationRequirements, coverageReport: input.coverageReport, groundingCheck: input.groundingCheck, retrievalCalls: input.retrievalCalls, retrievalResultsRaw: input.retrievalResultsRaw, retrievalResults: input.retrievalResults, routesForDebug: deepTurnPrePackagingContext.routesForDebug, resolvedExecutionState: deepTurnPrePackagingContext.resolvedExecutionState, questionTypeClass: input.questionTypeClass, companyAnchors: input.companyAnchors, runtimeAnalysisContext: input.runtimeAnalysisContext, businessScopeResolution: input.businessScopeResolution, temporalGuard: input.temporalGuard, polarityAudit: input.polarityAudit, claimAnchorAudit: input.claimAnchorAudit, targetedEvidenceAudit: input.targetedEvidenceAudit, evidenceAdmissibilityGateAudit: input.evidenceAdmissibilityGateAudit, rbpLiveRouteAudit: input.rbpLiveRouteAudit, faLiveRouteAudit: input.faLiveRouteAudit, groundedAnswerEligibilityGuard: input.groundedAnswerEligibilityGuard, followupStateUsage: input.followupStateUsage, composition: { reply_type: input.composition.reply_type, fallback_type: input.composition.fallback_type, answer_structure_v11: input.composition.answer_structure_v11, problem_centric_answer_applied: input.composition.problem_centric_answer_applied, problem_units_used_count: input.composition.problem_units_used_count, problem_answer_mode: input.composition.problem_answer_mode, problem_unit_ids_used: input.composition.problem_unit_ids_used }, safeAssistantReplyBase: deepTurnPrePackagingContext.safeAssistantReplyBase, featureContractsV11: input.featureContractsV11, featureAnswerPolicyV11: input.featureAnswerPolicyV11, investigationStateSnapshot, addressRuntimeMetaForDeep: input.addressRuntimeMetaForDeep }); const deepTurnPackaging = assembleDeepTurnPackagingSafe(deepTurnPackagingInput); return { messageId, investigationStateSnapshot, droppedIntentSegments: deepTurnPrePackagingContext.droppedIntentSegments, analysisContextForContract: deepTurnPrePackagingContext.analysisContextForContract, routesForDebug: deepTurnPrePackagingContext.routesForDebug, resolvedExecutionState: deepTurnPrePackagingContext.resolvedExecutionState, safeAssistantReplyBase: deepTurnPrePackagingContext.safeAssistantReplyBase, safeAssistantReply: deepTurnPackaging.deepAnswerArtifacts.safeAssistantReply, debug: deepTurnPackaging.debug, assistantItem: deepTurnPackaging.assistantItem, deepAnalysisLogDetails: deepTurnPackaging.deepAnalysisLogDetails }; }