ГЛОБАЛЬНЫЙ РЕФАКТОРИНГ АРХИТЕКТУРЫ - Рефакторинг этапов 2.85 - 2.88 - Убран последний as any из backend/src и довел тип debug до конца цепочки deep-turn

This commit is contained in:
2026-04-11 10:58:28 +03:00
parent dedf193542
commit 966be04af9
19 changed files with 485 additions and 159 deletions
@@ -10,6 +10,88 @@ exports.buildAssistantDeepTurnAnalysisRuntimeInput = buildAssistantDeepTurnAnaly
const companyAnchorResolver_1 = require("./companyAnchorResolver");
const assistantRuntimeGuards_1 = require("./assistantRuntimeGuards");
const assistantClaimBoundEvidence_1 = require("./assistantClaimBoundEvidence");
const KNOWN_GUARD_DOMAINS = [
"settlements_60_62",
"vat_document_register_book",
"month_close_costs_20_44",
"fixed_asset_amortization"
];
function toRecordObject(value) {
if (!value || typeof value !== "object" || Array.isArray(value)) {
return null;
}
return value;
}
function toStringArray(value) {
if (!Array.isArray(value)) {
return [];
}
return value
.map((item) => (typeof item === "string" ? item.trim() : ""))
.filter((item) => item.length > 0);
}
function toCompanyAnchorSet(value) {
const source = toRecordObject(value);
if (!source) {
return null;
}
return {
contract_numbers: toStringArray(source.contract_numbers),
document_numbers: toStringArray(source.document_numbers),
dates: toStringArray(source.dates),
amounts: toStringArray(source.amounts),
accounts: toStringArray(source.accounts),
periods: toStringArray(source.periods),
document_types: toStringArray(source.document_types),
all: toStringArray(source.all)
};
}
function toClaimBoundPrimaryPeriod(value) {
const source = toRecordObject(value);
if (!source) {
return null;
}
const from = typeof source.from === "string" ? source.from.trim() : "";
const to = typeof source.to === "string" ? source.to.trim() : "";
const granularity = source.granularity === "day" || source.granularity === "month" ? source.granularity : null;
if (!from || !to || !granularity) {
return null;
}
return {
from,
to,
granularity
};
}
function normalizeFocusDomainForGuards(value) {
const normalized = typeof value === "string" ? value.trim() : "";
if (!normalized) {
return null;
}
if (KNOWN_GUARD_DOMAINS.includes(normalized)) {
return normalized;
}
return null;
}
const resolveTemporalGuardAdapter = (input) => (0, assistantRuntimeGuards_1.resolveTemporalGuard)({
userMessage: input.userMessage,
normalized: input.normalized,
companyAnchors: toCompanyAnchorSet(input.companyAnchors),
analysisContext: input.analysisContext
});
const resolveDomainPolarityGuardAdapter = (input) => (0, assistantRuntimeGuards_1.resolveDomainPolarityGuard)({
userMessage: input.userMessage,
companyAnchors: toCompanyAnchorSet(input.companyAnchors),
focusDomainHint: input.focusDomainHint
});
const resolveClaimBoundAnchorsAdapter = (input) => (0, assistantClaimBoundEvidence_1.resolveClaimBoundAnchors)({
userMessage: input.userMessage,
companyAnchors: toCompanyAnchorSet(input.companyAnchors),
focusDomainHint: input.focusDomainHint,
primaryPeriod: toClaimBoundPrimaryPeriod(input.primaryPeriod)
});
const applyTemporalHintToExecutionPlanAdapter = (executionPlan, temporalGuard) => (0, assistantRuntimeGuards_1.applyTemporalHintToExecutionPlan)(executionPlan, temporalGuard);
const applyPolarityHintToExecutionPlanAdapter = (executionPlan, domainPolarityGuardInitial) => (0, assistantRuntimeGuards_1.applyPolarityHintToExecutionPlan)(executionPlan, domainPolarityGuardInitial);
function buildAssistantDeepTurnContextRuntimeInput(input) {
return {
userMessage: input.userMessage,
@@ -20,9 +102,9 @@ function buildAssistantDeepTurnContextRuntimeInput(input) {
resolveCompanyAnchors: companyAnchorResolver_1.resolveCompanyAnchors,
resolveBusinessScopeAlignment: input.resolveBusinessScopeAlignment,
inferP0DomainFromMessage: input.inferP0DomainFromMessage,
resolveTemporalGuard: assistantRuntimeGuards_1.resolveTemporalGuard,
resolveDomainPolarityGuard: assistantRuntimeGuards_1.resolveDomainPolarityGuard,
resolveClaimBoundAnchors: assistantClaimBoundEvidence_1.resolveClaimBoundAnchors,
resolveTemporalGuard: resolveTemporalGuardAdapter,
resolveDomainPolarityGuard: resolveDomainPolarityGuardAdapter,
resolveClaimBoundAnchors: resolveClaimBoundAnchorsAdapter,
resolveBusinessScopeFromLiveContext: input.resolveBusinessScopeFromLiveContext
};
}
@@ -38,8 +120,8 @@ function buildAssistantDeepTurnExecutionPlanRuntimeInput(input, runtime) {
toExecutionPlan: input.toExecutionPlan,
enforceRbpLiveRoutePlan: input.enforceRbpLiveRoutePlan,
enforceFaLiveRoutePlan: input.enforceFaLiveRoutePlan,
applyTemporalHintToExecutionPlan: assistantRuntimeGuards_1.applyTemporalHintToExecutionPlan,
applyPolarityHintToExecutionPlan: assistantRuntimeGuards_1.applyPolarityHintToExecutionPlan
applyTemporalHintToExecutionPlan: applyTemporalHintToExecutionPlanAdapter,
applyPolarityHintToExecutionPlan: applyPolarityHintToExecutionPlanAdapter
};
}
function buildAssistantDeepTurnRetrievalRuntimeInput(input, runtime) {
@@ -57,8 +139,8 @@ function buildAssistantDeepTurnGuardRuntimeInput(runtime) {
domainPolarityGuardInitial: runtime.domainPolarityGuardInitial,
claimAnchorAudit: runtime.claimAnchorAudit,
temporalGuard: runtime.temporalGuard,
focusDomainForGuards: runtime.focusDomainForGuards,
companyAnchors: runtime.companyAnchors,
focusDomainForGuards: normalizeFocusDomainForGuards(runtime.focusDomainForGuards),
companyAnchors: toCompanyAnchorSet(runtime.companyAnchors),
userMessage: runtime.userMessage
};
}
@@ -72,7 +154,7 @@ function buildAssistantDeepTurnGroundingRuntimeInput(input, runtime) {
normalizedPayload: input.normalizedPayload,
userMessage: input.userMessage,
requirementExtraction: runtime.requirementExtraction,
extractRequirements: input.extractRequirements,
extractRequirements: (routeSummary, normalized, userMessage) => input.extractRequirements(routeSummary, normalized ?? null, userMessage),
evaluateCoverage: input.evaluateCoverage,
checkGrounding: input.checkGrounding,
temporalGuard: runtime.temporalGuard,
@@ -106,8 +188,28 @@ function buildAssistantDeepTurnCompositionRuntimeInput(input, runtime) {
function buildAssistantDeepTurnAnalysisRuntimeInput(input) {
return {
userMessage: input.userMessage,
runContextRuntime: () => input.runDeepTurnContextRuntimeSafe(buildAssistantDeepTurnContextRuntimeInput(input)),
runExecutionPlanRuntime: (runtime) => input.runDeepTurnPlanRuntimeSafe(buildAssistantDeepTurnExecutionPlanRuntimeInput(input, runtime)),
runContextRuntime: () => {
const runtime = input.runDeepTurnContextRuntimeSafe(buildAssistantDeepTurnContextRuntimeInput(input));
return {
companyAnchors: toCompanyAnchorSet(runtime.companyAnchors),
focusDomainForGuards: normalizeFocusDomainForGuards(runtime.focusDomainForGuards),
temporalGuard: runtime.temporalGuard,
domainPolarityGuardInitial: runtime.domainPolarityGuardInitial,
claimAnchorAudit: runtime.claimAnchorAudit,
businessScopeResolution: runtime.businessScopeResolution,
resolvedRouteSummary: runtime.resolvedRouteSummary,
liveTemporalHint: runtime.liveTemporalHint
};
},
runExecutionPlanRuntime: (runtime) => {
const output = input.runDeepTurnPlanRuntimeSafe(buildAssistantDeepTurnExecutionPlanRuntimeInput(input, runtime));
return {
requirementExtraction: output.requirementExtraction,
executionPlan: output.executionPlan,
rbpRoutePlanEnforcement: output.rbpRoutePlanEnforcement,
faRoutePlanEnforcement: output.faRoutePlanEnforcement
};
},
runRetrievalRuntime: (runtime) => input.runDeepTurnRetrievalRuntimeSafe(buildAssistantDeepTurnRetrievalRuntimeInput(input, runtime)),
runGuardRuntime: (runtime) => input.runDeepTurnGuardRuntimeSafe(buildAssistantDeepTurnGuardRuntimeInput(runtime)),
runGroundingRuntime: (runtime) => input.runDeepTurnGroundingRuntimeSafe(buildAssistantDeepTurnGroundingRuntimeInput(input, runtime)),
@@ -3,6 +3,30 @@ Object.defineProperty(exports, "__esModule", { value: true });
exports.buildAssistantDeepTurnComposition = buildAssistantDeepTurnComposition;
const questionTypeResolver_1 = require("./questionTypeResolver");
const answerComposer_1 = require("./answerComposer");
function toStringArray(value) {
if (!Array.isArray(value)) {
return [];
}
return value
.map((item) => (typeof item === "string" ? item.trim() : ""))
.filter((item) => item.length > 0);
}
function normalizeCompanyAnchorSet(value) {
if (!value || typeof value !== "object" || Array.isArray(value)) {
return null;
}
const source = value;
return {
contract_numbers: toStringArray(source.contract_numbers),
document_numbers: toStringArray(source.document_numbers),
dates: toStringArray(source.dates),
amounts: toStringArray(source.amounts),
accounts: toStringArray(source.accounts),
periods: toStringArray(source.periods),
document_types: toStringArray(source.document_types),
all: toStringArray(source.all)
};
}
function buildAssistantDeepTurnComposition(input) {
const resolveQuestionTypeSafe = input.resolveQuestionTypeFn ?? questionTypeResolver_1.resolveQuestionType;
const composeAssistantAnswerSafe = input.composeAssistantAnswerFn ?? answerComposer_1.composeAssistantAnswer;
@@ -11,7 +35,7 @@ function buildAssistantDeepTurnComposition(input) {
? input.investigationState?.followup_context?.active_domain ?? input.investigationState?.focus.domain ?? null
: null;
const questionTypeClass = resolveQuestionTypeSafe(input.userMessage);
const companyAnchorSet = input.companyAnchors;
const companyAnchorSet = normalizeCompanyAnchorSet(input.companyAnchors);
const hasPeriodInCompanyAnchors = (Array.isArray(companyAnchorSet?.dates) && companyAnchorSet.dates.some((item) => String(item ?? "").trim().length > 0)) ||
(Array.isArray(companyAnchorSet?.periods) && companyAnchorSet.periods.some((item) => String(item ?? "").trim().length > 0));
const normalizationPeriodExplicit = input.hasExplicitPeriodAnchor(input.normalizedPayload) || hasPeriodInCompanyAnchors;
@@ -24,7 +48,7 @@ function buildAssistantDeepTurnComposition(input) {
groundingCheck: input.groundingCheck,
focusDomainHint,
questionTypeHint: questionTypeClass,
companyAnchors: input.companyAnchors,
companyAnchors: companyAnchorSet,
normalizationPeriodExplicit,
enableAnswerPolicyV11: input.featureAnswerPolicyV11,
enableProblemCentricAnswerV1: input.featureProblemCentricAnswerV1,
@@ -5,8 +5,8 @@ const assistantOrchestrationRuntimeAdapter_1 = require("./assistantOrchestration
const assistantDeepTurnGuardRuntimeAdapter_1 = require("./assistantDeepTurnGuardRuntimeAdapter");
function runAssistantDeepTurnGroundingRuntime(input) {
const runCoverageGroundingPipelineSafe = input.runCoverageGroundingPipelineFn ?? assistantOrchestrationRuntimeAdapter_1.runAssistantCoverageGroundingPipeline;
const applyGroundingEligibilitySafe = input.applyGroundingEligibilityFn ??
((payload) => (0, assistantDeepTurnGuardRuntimeAdapter_1.applyAssistantDeepTurnGroundingEligibility)(payload));
const applyGroundingEligibilityDefault = (payload) => (0, assistantDeepTurnGuardRuntimeAdapter_1.applyAssistantDeepTurnGroundingEligibility)(payload);
const applyGroundingEligibilitySafe = input.applyGroundingEligibilityFn ?? applyGroundingEligibilityDefault;
const rbpLiveRouteAudit = input.collectRbpLiveRouteAudit({
claimType: input.claimType,
retrievalResults: input.retrievalResults,
@@ -83,7 +83,7 @@ function assembleAssistantDeepTurnPackaging(input) {
text: deepAnswerArtifacts.safeAssistantReply,
replyType: input.composition.reply_type,
traceId: input.normalized.trace_id,
debug: debug
debug
});
const deepAnalysisLogDetails = (0, assistantMessageLogAssembler_1.buildDeepAnalysisProcessedLogDetails)({
sessionId: input.sessionId,
@@ -391,25 +391,26 @@ function normalizeEvidenceItems(fragmentId, requirementIds, route, value) {
});
}
function normalizeRetrievalResult(fragmentId, requirementIds, route, raw) {
const items = normalizeObjectArray(raw.items);
const summary = normalizeSummary(raw.summary);
const evidence = normalizeEvidenceItems(fragmentId, requirementIds, route, raw.evidence);
const rawResult = toObject(raw) ?? {};
const items = normalizeObjectArray(rawResult.items);
const summary = normalizeSummary(rawResult.summary);
const evidence = normalizeEvidenceItems(fragmentId, requirementIds, route, rawResult.evidence);
const baseResult = {
fragment_id: fragmentId,
requirement_ids: requirementIds,
route,
status: normalizeStatus(raw.status),
result_type: normalizeResultType(raw.result_type),
status: normalizeStatus(rawResult.status),
result_type: normalizeResultType(rawResult.result_type),
items,
summary,
evidence,
why_included: normalizeStringArray(raw.why_included),
selection_reason: normalizeStringArray(raw.selection_reason),
risk_factors: normalizeStringArray(raw.risk_factors),
business_interpretation: normalizeStringArray(raw.business_interpretation),
confidence: normalizeConfidence(raw.confidence),
limitations: normalizeStringArray(raw.limitations),
errors: normalizeErrors(raw.errors)
why_included: normalizeStringArray(rawResult.why_included),
selection_reason: normalizeStringArray(rawResult.selection_reason),
risk_factors: normalizeStringArray(rawResult.risk_factors),
business_interpretation: normalizeStringArray(rawResult.business_interpretation),
confidence: normalizeConfidence(rawResult.confidence),
limitations: normalizeStringArray(rawResult.limitations),
errors: normalizeErrors(rawResult.errors)
};
if (!config_1.FEATURE_ASSISTANT_PROBLEM_UNITS_V1) {
return baseResult;