ГЛОБАЛЬНЫЙ РЕФАКТОРИНГ АРХИТЕКТУРЫ - Рефакторинг этапов 2.30: вынос ветки tool_gate_skip + chat fallback из assistantService в отдельный runtime-адаптер, чтобы в сервисе остался только orchestration flow.

This commit is contained in:
2026-04-10 20:52:04 +03:00
parent 3531f7ddfe
commit 353cbc1763
16 changed files with 1706 additions and 405 deletions
@@ -0,0 +1,148 @@
import type { AssistantMessageResponsePayload, AssistantReplyType } from "../types/assistant";
import type { NormalizeResponsePayload, RouteHintSummary } from "../types/normalizer";
import type { InvestigationStateWithProblemUnits } from "../types/stage2ProblemUnits";
import {
runAssistantDeepTurnPackagingRuntime,
type AssistantDeepTurnPackagingRuntimeInput,
type AssistantDeepTurnPackagingRuntimeOutput
} from "./assistantDeepTurnPackagingRuntimeAdapter";
import {
finalizeAssistantDeepTurn,
type FinalizeAssistantDeepTurnInput
} from "./assistantDeepTurnFinalizeRuntimeAdapter";
type CompositionLike = {
reply_type: AssistantReplyType;
[key: string]: unknown;
};
export interface RunAssistantDeepTurnResponseRuntimeInput {
featureInvestigationStateV1: boolean;
featureContractsV11: boolean;
featureAnswerPolicyV11: 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: unknown[];
requirementExtractionRequirements: unknown[];
coverageEvaluationRequirements: unknown[];
coverageReport: unknown;
groundingCheck: unknown;
retrievalCalls: unknown[];
retrievalResultsRaw: unknown[];
retrievalResults: unknown[];
questionTypeClass: string;
companyAnchors: unknown;
runtimeAnalysisContext: unknown;
businessScopeResolution: unknown;
temporalGuard: unknown;
polarityAudit: unknown;
claimAnchorAudit: unknown;
targetedEvidenceAudit: unknown;
evidenceAdmissibilityGateAudit: unknown;
rbpLiveRouteAudit: unknown;
faLiveRouteAudit: unknown;
groundedAnswerEligibilityGuard: unknown;
followupStateUsage: unknown;
followupApplied: boolean;
composition: CompositionLike;
previousInvestigationState: InvestigationStateWithProblemUnits | null | undefined;
addressRuntimeMetaForDeep: unknown;
extractDroppedIntentSegments: (normalizedPayload: NormalizeResponsePayload["normalized"]) => string[];
buildDebugRoutes: (routeSummary: RouteHintSummary | null) => Array<Record<string, unknown>>;
extractExecutionState: (normalizedPayload: NormalizeResponsePayload["normalized"]) => unknown[];
sanitizeReply: (value: string, fallback?: string) => string;
persistInvestigationState: (sessionId: string, snapshot: InvestigationStateWithProblemUnits) => void;
messageIdFactory: () => string;
appendItem: FinalizeAssistantDeepTurnInput["appendItem"];
getSession: FinalizeAssistantDeepTurnInput["getSession"];
persistSession: FinalizeAssistantDeepTurnInput["persistSession"];
cloneConversation: FinalizeAssistantDeepTurnInput["cloneConversation"];
logEvent: FinalizeAssistantDeepTurnInput["logEvent"];
runPackagingRuntime?: (
input: AssistantDeepTurnPackagingRuntimeInput
) => AssistantDeepTurnPackagingRuntimeOutput;
runFinalizeDeepTurn?: (input: FinalizeAssistantDeepTurnInput) => { response: AssistantMessageResponsePayload };
}
export interface RunAssistantDeepTurnResponseRuntimeOutput {
response: AssistantMessageResponsePayload;
debug: Record<string, unknown>;
}
export function runAssistantDeepTurnResponseRuntime(
input: RunAssistantDeepTurnResponseRuntimeInput
): RunAssistantDeepTurnResponseRuntimeOutput {
const runPackagingRuntimeSafe = input.runPackagingRuntime ?? runAssistantDeepTurnPackagingRuntime;
const runFinalizeDeepTurnSafe = input.runFinalizeDeepTurn ?? finalizeAssistantDeepTurn;
const packagingRuntime = runPackagingRuntimeSafe({
featureInvestigationStateV1: input.featureInvestigationStateV1,
sessionId: input.sessionId,
questionId: input.questionId,
userMessage: input.userMessage,
normalized: input.normalized,
normalizedQuestion: input.normalizedQuestion,
routeSummary: input.routeSummary,
executionPlan: input.executionPlan as any,
requirementExtractionRequirements: input.requirementExtractionRequirements as any,
coverageEvaluationRequirements: input.coverageEvaluationRequirements as any,
coverageReport: input.coverageReport as any,
groundingCheck: input.groundingCheck as any,
retrievalCalls: input.retrievalCalls as any,
retrievalResultsRaw: input.retrievalResultsRaw as any,
retrievalResults: input.retrievalResults as any,
questionTypeClass: input.questionTypeClass,
companyAnchors: input.companyAnchors,
runtimeAnalysisContext: input.runtimeAnalysisContext as any,
businessScopeResolution: input.businessScopeResolution as any,
temporalGuard: input.temporalGuard as any,
polarityAudit: input.polarityAudit as any,
claimAnchorAudit: input.claimAnchorAudit as any,
targetedEvidenceAudit: input.targetedEvidenceAudit as any,
evidenceAdmissibilityGateAudit: input.evidenceAdmissibilityGateAudit as any,
rbpLiveRouteAudit: input.rbpLiveRouteAudit as any,
faLiveRouteAudit: input.faLiveRouteAudit as any,
groundedAnswerEligibilityGuard: input.groundedAnswerEligibilityGuard as any,
followupStateUsage: input.followupStateUsage as any,
followupApplied: input.followupApplied,
composition: input.composition as any,
featureContractsV11: input.featureContractsV11,
featureAnswerPolicyV11: input.featureAnswerPolicyV11,
previousInvestigationState: input.previousInvestigationState ?? null,
addressRuntimeMetaForDeep: input.addressRuntimeMetaForDeep as any,
extractDroppedIntentSegments: input.extractDroppedIntentSegments,
buildDebugRoutes: input.buildDebugRoutes,
extractExecutionState: input.extractExecutionState,
sanitizeReply: input.sanitizeReply,
persistInvestigationState: input.persistInvestigationState,
messageIdFactory: input.messageIdFactory
});
const finalization = runFinalizeDeepTurnSafe({
sessionId: input.sessionId,
assistantReply: packagingRuntime.safeAssistantReply,
replyType: input.composition.reply_type,
assistantItem: packagingRuntime.assistantItem,
debug: packagingRuntime.debug,
deepAnalysisLogDetails: packagingRuntime.deepAnalysisLogDetails,
appendItem: input.appendItem,
getSession: input.getSession,
persistSession: input.persistSession,
cloneConversation: input.cloneConversation,
logEvent: input.logEvent
});
return {
response: finalization.response,
debug: packagingRuntime.debug
};
}