ГЛОБАЛЬНЫЙ РЕФАКТОРИНГ АРХИТЕКТУРЫ - Рефакторинг этапов

This commit is contained in:
2026-04-11 00:40:18 +03:00
parent 90d529f79b
commit f1e621fccc
6 changed files with 712 additions and 229 deletions
+82 -114
View File
@@ -66,6 +66,7 @@ const assistantAddressAttemptRuntimeAdapter_1 = __importStar(require("./assistan
const assistantCoverageGrounding_1 = __importStar(require("./assistantCoverageGrounding"));
const assistantDeepTurnAttemptRuntimeAdapter_1 = __importStar(require("./assistantDeepTurnAttemptRuntimeAdapter"));
const assistantTurnAttemptRuntimeAdapter_1 = __importStar(require("./assistantTurnAttemptRuntimeAdapter"));
const assistantTurnRuntimeInputBuilder_1 = __importStar(require("./assistantTurnRuntimeInputBuilder"));
const assistantUserTurnBootstrapRuntimeAdapter_1 = __importStar(require("./assistantUserTurnBootstrapRuntimeAdapter"));
const assistantQueryPlanning_1 = __importStar(require("./assistantQueryPlanning"));
const iconv_lite_1 = __importDefault(require("iconv-lite"));
@@ -4370,123 +4371,90 @@ class AssistantService {
return this.sessions.getSession(sessionId);
}
async handleMessage(payload) {
const turnRuntimeDeps = {
ensureSession: (targetSessionId) => this.sessions.ensureSession(targetSessionId),
appendItem: (targetSessionId, item) => this.sessions.appendItem(targetSessionId, item),
getSession: (targetSessionId) => this.sessions.getSession(targetSessionId),
persistSession: (sessionState) => this.sessionLogger.persistSession(sessionState),
setInvestigationState: (targetSessionId, snapshot) => this.sessions.setInvestigationState(targetSessionId, snapshot),
normalize: (normalizePayload) => this.normalizerService.normalize(normalizePayload),
executeRouteRuntime: (route, fragmentText, options) => this.dataLayer.executeRouteRuntime(route, fragmentText, options),
tryAddressQueryHandle: (laneMessageUsed, options) => this.addressQueryService.tryHandle(laneMessageUsed, options),
chatClient: this.chatClient,
messageIdFactory: () => `msg-${(0, nanoid_1.nanoid)(10)}`,
nowIso: () => new Date().toISOString(),
defaultApiKey: process.env.OPENAI_API_KEY ?? "",
logEvent: (runtimePayload) => (0, log_1.logJson)(runtimePayload),
featureAssistantAddressQueryV1: config_1.FEATURE_ASSISTANT_ADDRESS_QUERY_V1,
featureAddressLlmPredecomposeV1: config_1.FEATURE_ASSISTANT_ADDRESS_QUERY_LLM_PREDECOMPOSE_V1,
featureInvestigationStateV1: config_1.FEATURE_ASSISTANT_INVESTIGATION_STATE_V1,
featureStateFollowupBindingV1: config_1.FEATURE_ASSISTANT_STATE_FOLLOWUP_BINDING_V1,
featureContractsV11: config_1.FEATURE_ASSISTANT_CONTRACTS_V11,
featureAnswerPolicyV11: config_1.FEATURE_ASSISTANT_ANSWER_POLICY_V11,
featureProblemCentricAnswerV1: config_1.FEATURE_ASSISTANT_PROBLEM_CENTRIC_ANSWER_V1,
featureLifecycleAnswerV1: config_1.FEATURE_ASSISTANT_LIFECYCLE_ANSWER_V1,
defaultModel: config_1.DEFAULT_MODEL,
defaultBaseUrl: config_1.DEFAULT_OPENAI_BASE_URL,
compactWhitespace,
repairAddressMojibake,
resolveRuntimeAnalysisContext,
runAddressLlmPreDecompose: async (runtimePayload, runtimeUserMessage) => runAddressLlmPreDecompose(this.normalizerService, runtimePayload, runtimeUserMessage),
buildAddressLlmPredecomposeContractV1: predecomposeContract_1.buildAddressLlmPredecomposeContractV1,
sanitizeAddressMessageForFallback,
toNonEmptyString,
resolveAddressFollowupCarryoverContext,
resolveAssistantOrchestrationDecision,
buildAddressDialogContinuationContractV2,
mergeFollowupContextWithOrganizationScope,
isRetryableAddressLimitedResult,
mergeKnownOrganizations,
hasAssistantDataScopeMetaQuestionSignal,
shouldHandleAsAssistantCapabilityMetaQuery,
hasDestructiveDataActionSignal,
hasDangerOrCoercionSignal,
hasOperationalAdminActionRequestSignal,
hasOrganizationFactLookupSignal,
hasOrganizationFactFollowupSignal,
shouldEmitOrganizationSelectionReply,
hasAssistantCapabilityQuestionSignal,
resolveDataScopeProbe: () => resolveAssistantDataScopeProbe(),
applyScriptGuard: (chatText, runtimeUserMessage) => applyLivingChatScriptGuard(chatText, runtimeUserMessage),
applyGroundingGuard: (guardInput) => applyLivingChatGroundingGuard(guardInput),
buildAssistantSafetyRefusalReply,
buildAssistantDataScopeContractReply,
buildAssistantOrganizationFactBoundaryReply,
buildAssistantDataScopeSelectionReply,
buildAssistantOperationalBoundaryReply,
buildAssistantCapabilityContractReply,
loadAssistantCanonExcerpt: assistantCanon_1.loadAssistantCanonExcerpt,
sanitizeOutgoingAssistantText,
buildAddressDebugPayload,
buildAddressFollowupOffer,
buildFollowupStateBinding,
resolveBusinessScopeAlignment,
inferP0DomainFromMessage,
resolveBusinessScopeFromLiveContext,
extractRequirements,
toExecutionPlan,
enforceRbpLiveRoutePlan,
enforceFaLiveRoutePlan,
mapNoRouteReason,
buildSkippedResult,
evaluateCoverage,
checkGrounding,
collectRbpLiveRouteAudit,
collectFaLiveRouteAudit,
hasExplicitPeriodAnchorFromNormalized,
extractDroppedIntentSegments: (normalizedPayload) => extractDiscardedIntentSegments(normalizedPayload),
toDebugRoutes: (routeSummary) => toDebugRoutes(routeSummary),
extractExecutionState
};
const turnRuntime = await (0, assistantTurnAttemptRuntimeAdapter_1.runAssistantTurnAttemptRuntime)({
payload,
runUserTurnBootstrapRuntime: (runtimePayload) => (0, assistantUserTurnBootstrapRuntimeAdapter_1.runAssistantUserTurnBootstrapRuntime)({
payload: runtimePayload,
ensureSession: (targetSessionId) => this.sessions.ensureSession(targetSessionId),
appendItem: (targetSessionId, item) => this.sessions.appendItem(targetSessionId, item),
getSession: (targetSessionId) => this.sessions.getSession(targetSessionId),
persistSession: (sessionState) => this.sessionLogger.persistSession(sessionState),
compactWhitespace,
repairAddressMojibake,
resolveRuntimeAnalysisContext,
messageIdFactory: () => `msg-${(0, nanoid_1.nanoid)(10)}`,
nowIso: () => new Date().toISOString()
}),
runUserTurnBootstrapRuntime: (runtimePayload) => (0, assistantUserTurnBootstrapRuntimeAdapter_1.runAssistantUserTurnBootstrapRuntime)((0, assistantTurnRuntimeInputBuilder_1.buildAssistantUserTurnBootstrapRuntimeInput)(runtimePayload, turnRuntimeDeps)),
resolveSessionOrganizationScopeContext: (runtimeUserMessage, sessionItems) => resolveSessionOrganizationScopeContext(runtimeUserMessage, sessionItems),
runAddressAttemptRuntime: async (runtimeInput) => (0, assistantAddressAttemptRuntimeAdapter_1.runAssistantAddressAttemptRuntime)({
featureAssistantAddressQueryV1: config_1.FEATURE_ASSISTANT_ADDRESS_QUERY_V1,
sessionId: runtimeInput.sessionId,
userMessage: runtimeInput.userMessage,
sessionItems: runtimeInput.sessionItems,
payload: runtimeInput.payload,
sessionScope: {
knownOrganizations: runtimeInput.sessionOrganizationScope.knownOrganizations,
selectedOrganization: runtimeInput.sessionOrganizationScope.selectedOrganization,
activeOrganization: runtimeInput.sessionOrganizationScope.activeOrganization
},
featureAddressLlmPredecomposeV1: config_1.FEATURE_ASSISTANT_ADDRESS_QUERY_LLM_PREDECOMPOSE_V1,
runAddressLlmPreDecompose: async () => runAddressLlmPreDecompose(this.normalizerService, runtimeInput.payload, runtimeInput.userMessage),
buildAddressLlmPredecomposeContractV1: predecomposeContract_1.buildAddressLlmPredecomposeContractV1,
sanitizeAddressMessageForFallback,
toNonEmptyString,
resolveAddressFollowupCarryoverContext,
resolveAssistantOrchestrationDecision,
buildAddressDialogContinuationContractV2,
runtimeAnalysisContextAsOfDate: runtimeInput.runtimeAnalysisContext.as_of_date,
compactWhitespace,
mergeFollowupContextWithOrganizationScope,
runAddressQueryTryHandle: (laneMessageUsed, options) => this.addressQueryService.tryHandle(laneMessageUsed, options),
isRetryableAddressLimitedResult,
mergeKnownOrganizations,
hasAssistantDataScopeMetaQuestionSignal,
shouldHandleAsAssistantCapabilityMetaQuery,
hasDestructiveDataActionSignal,
hasDangerOrCoercionSignal,
hasOperationalAdminActionRequestSignal,
hasOrganizationFactLookupSignal,
hasOrganizationFactFollowupSignal,
shouldEmitOrganizationSelectionReply,
hasAssistantCapabilityQuestionSignal,
resolveDataScopeProbe: () => resolveAssistantDataScopeProbe(),
applyScriptGuard: (chatText, runtimeUserMessage) => applyLivingChatScriptGuard(chatText, runtimeUserMessage),
applyGroundingGuard: (guardInput) => applyLivingChatGroundingGuard(guardInput),
buildAssistantSafetyRefusalReply,
buildAssistantDataScopeContractReply,
buildAssistantOrganizationFactBoundaryReply,
buildAssistantDataScopeSelectionReply,
buildAssistantOperationalBoundaryReply,
buildAssistantCapabilityContractReply,
chatClient: this.chatClient,
loadAssistantCanonExcerpt: assistantCanon_1.loadAssistantCanonExcerpt,
sanitizeOutgoingAssistantText,
defaultModel: config_1.DEFAULT_MODEL,
defaultBaseUrl: config_1.DEFAULT_OPENAI_BASE_URL,
defaultApiKey: process.env.OPENAI_API_KEY ?? "",
buildAddressDebugPayload,
buildAddressFollowupOffer,
appendItem: (targetSessionId, item) => this.sessions.appendItem(targetSessionId, item),
getSession: (targetSessionId) => this.sessions.getSession(targetSessionId),
persistSession: (sessionState) => this.sessionLogger.persistSession(sessionState),
cloneConversation: (items) => cloneItems(items),
logEvent: (runtimePayload) => (0, log_1.logJson)(runtimePayload),
messageIdFactory: () => `msg-${(0, nanoid_1.nanoid)(10)}`,
nowIso: () => new Date().toISOString()
}),
runDeepTurnAttemptRuntime: async (runtimeInput) => (0, assistantDeepTurnAttemptRuntimeAdapter_1.runAssistantDeepTurnAttemptRuntime)({
sessionId: runtimeInput.sessionId,
questionId: runtimeInput.questionId,
userMessage: runtimeInput.userMessage,
payload: runtimeInput.payload,
runtimeAnalysisContext: runtimeInput.runtimeAnalysisContext,
sessionInvestigationState: runtimeInput.sessionInvestigationState,
addressRuntimeMetaForDeep: runtimeInput.addressRuntimeMetaForDeep,
featureInvestigationStateV1: config_1.FEATURE_ASSISTANT_INVESTIGATION_STATE_V1,
featureStateFollowupBindingV1: config_1.FEATURE_ASSISTANT_STATE_FOLLOWUP_BINDING_V1,
featureContractsV11: config_1.FEATURE_ASSISTANT_CONTRACTS_V11,
featureAnswerPolicyV11: config_1.FEATURE_ASSISTANT_ANSWER_POLICY_V11,
featureProblemCentricAnswerV1: config_1.FEATURE_ASSISTANT_PROBLEM_CENTRIC_ANSWER_V1,
featureLifecycleAnswerV1: config_1.FEATURE_ASSISTANT_LIFECYCLE_ANSWER_V1,
buildFollowupStateBinding,
normalize: (normalizePayload) => this.normalizerService.normalize(normalizePayload),
resolveBusinessScopeAlignment,
inferP0DomainFromMessage,
resolveBusinessScopeFromLiveContext,
extractRequirements,
toExecutionPlan,
enforceRbpLiveRoutePlan,
enforceFaLiveRoutePlan,
executeRouteRuntime: (route, fragmentText, options) => this.dataLayer.executeRouteRuntime(route, fragmentText, options),
mapNoRouteReason,
buildSkippedResult,
evaluateCoverage,
checkGrounding,
collectRbpLiveRouteAudit,
collectFaLiveRouteAudit,
hasExplicitPeriodAnchor: (normalizedPayload) => hasExplicitPeriodAnchorFromNormalized(normalizedPayload),
extractDroppedIntentSegments: (normalizedPayload) => extractDiscardedIntentSegments(normalizedPayload),
buildDebugRoutes: (routeSummary) => toDebugRoutes(routeSummary),
extractExecutionState: (normalizedPayload) => extractExecutionState(normalizedPayload),
sanitizeReply: (value, fallback) => sanitizeOutgoingAssistantText(value, fallback),
persistInvestigationState: (targetSessionId, snapshot) => this.sessions.setInvestigationState(targetSessionId, snapshot),
messageIdFactory: () => `msg-${(0, nanoid_1.nanoid)(10)}`,
appendItem: (targetSessionId, item) => this.sessions.appendItem(targetSessionId, item),
getSession: (targetSessionId) => this.sessions.getSession(targetSessionId),
persistSession: (sessionState) => this.sessionLogger.persistSession(sessionState),
cloneConversation: (items) => cloneItems(items),
logEvent: (runtimePayload) => (0, log_1.logJson)(runtimePayload)
})
runAddressAttemptRuntime: async (runtimeInput) => (0, assistantAddressAttemptRuntimeAdapter_1.runAssistantAddressAttemptRuntime)((0, assistantTurnRuntimeInputBuilder_1.buildAssistantAddressAttemptRuntimeInput)(runtimeInput, turnRuntimeDeps)),
runDeepTurnAttemptRuntime: async (runtimeInput) => (0, assistantDeepTurnAttemptRuntimeAdapter_1.runAssistantDeepTurnAttemptRuntime)((0, assistantTurnRuntimeInputBuilder_1.buildAssistantDeepTurnAttemptRuntimeInput)(runtimeInput, turnRuntimeDeps))
});
return turnRuntime.response;
}
@@ -0,0 +1,125 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.buildAssistantUserTurnBootstrapRuntimeInput = buildAssistantUserTurnBootstrapRuntimeInput;
exports.buildAssistantAddressAttemptRuntimeInput = buildAssistantAddressAttemptRuntimeInput;
exports.buildAssistantDeepTurnAttemptRuntimeInput = buildAssistantDeepTurnAttemptRuntimeInput;
function buildAssistantUserTurnBootstrapRuntimeInput(payload, deps) {
return {
payload,
ensureSession: deps.ensureSession,
appendItem: deps.appendItem,
getSession: deps.getSession,
persistSession: deps.persistSession,
compactWhitespace: deps.compactWhitespace,
repairAddressMojibake: deps.repairAddressMojibake,
resolveRuntimeAnalysisContext: deps.resolveRuntimeAnalysisContext,
messageIdFactory: deps.messageIdFactory,
nowIso: deps.nowIso
};
}
function buildAssistantAddressAttemptRuntimeInput(runtimeInput, deps) {
return {
featureAssistantAddressQueryV1: deps.featureAssistantAddressQueryV1,
sessionId: runtimeInput.sessionId,
userMessage: runtimeInput.userMessage,
sessionItems: runtimeInput.sessionItems,
payload: runtimeInput.payload,
sessionScope: {
knownOrganizations: runtimeInput.sessionOrganizationScope.knownOrganizations,
selectedOrganization: runtimeInput.sessionOrganizationScope.selectedOrganization,
activeOrganization: runtimeInput.sessionOrganizationScope.activeOrganization
},
featureAddressLlmPredecomposeV1: deps.featureAddressLlmPredecomposeV1,
runAddressLlmPreDecompose: async () => deps.runAddressLlmPreDecompose(runtimeInput.payload, runtimeInput.userMessage),
buildAddressLlmPredecomposeContractV1: deps.buildAddressLlmPredecomposeContractV1,
sanitizeAddressMessageForFallback: deps.sanitizeAddressMessageForFallback,
toNonEmptyString: deps.toNonEmptyString,
resolveAddressFollowupCarryoverContext: deps.resolveAddressFollowupCarryoverContext,
resolveAssistantOrchestrationDecision: deps.resolveAssistantOrchestrationDecision,
buildAddressDialogContinuationContractV2: deps.buildAddressDialogContinuationContractV2,
runtimeAnalysisContextAsOfDate: runtimeInput.runtimeAnalysisContext.as_of_date,
compactWhitespace: deps.compactWhitespace,
mergeFollowupContextWithOrganizationScope: deps.mergeFollowupContextWithOrganizationScope,
runAddressQueryTryHandle: deps.tryAddressQueryHandle,
isRetryableAddressLimitedResult: deps.isRetryableAddressLimitedResult,
mergeKnownOrganizations: deps.mergeKnownOrganizations,
hasAssistantDataScopeMetaQuestionSignal: deps.hasAssistantDataScopeMetaQuestionSignal,
shouldHandleAsAssistantCapabilityMetaQuery: deps.shouldHandleAsAssistantCapabilityMetaQuery,
hasDestructiveDataActionSignal: deps.hasDestructiveDataActionSignal,
hasDangerOrCoercionSignal: deps.hasDangerOrCoercionSignal,
hasOperationalAdminActionRequestSignal: deps.hasOperationalAdminActionRequestSignal,
hasOrganizationFactLookupSignal: deps.hasOrganizationFactLookupSignal,
hasOrganizationFactFollowupSignal: deps.hasOrganizationFactFollowupSignal,
shouldEmitOrganizationSelectionReply: deps.shouldEmitOrganizationSelectionReply,
hasAssistantCapabilityQuestionSignal: deps.hasAssistantCapabilityQuestionSignal,
resolveDataScopeProbe: deps.resolveDataScopeProbe,
applyScriptGuard: deps.applyScriptGuard,
applyGroundingGuard: deps.applyGroundingGuard,
buildAssistantSafetyRefusalReply: deps.buildAssistantSafetyRefusalReply,
buildAssistantDataScopeContractReply: deps.buildAssistantDataScopeContractReply,
buildAssistantOrganizationFactBoundaryReply: deps.buildAssistantOrganizationFactBoundaryReply,
buildAssistantDataScopeSelectionReply: deps.buildAssistantDataScopeSelectionReply,
buildAssistantOperationalBoundaryReply: deps.buildAssistantOperationalBoundaryReply,
buildAssistantCapabilityContractReply: deps.buildAssistantCapabilityContractReply,
chatClient: deps.chatClient,
loadAssistantCanonExcerpt: deps.loadAssistantCanonExcerpt,
sanitizeOutgoingAssistantText: deps.sanitizeOutgoingAssistantText,
defaultModel: deps.defaultModel,
defaultBaseUrl: deps.defaultBaseUrl,
defaultApiKey: deps.defaultApiKey,
buildAddressDebugPayload: deps.buildAddressDebugPayload,
buildAddressFollowupOffer: deps.buildAddressFollowupOffer,
appendItem: deps.appendItem,
getSession: deps.getSession,
persistSession: deps.persistSession,
cloneConversation: (items) => items.map((item) => ({ ...item })),
logEvent: deps.logEvent,
messageIdFactory: deps.messageIdFactory,
nowIso: deps.nowIso
};
}
function buildAssistantDeepTurnAttemptRuntimeInput(runtimeInput, deps) {
return {
sessionId: runtimeInput.sessionId,
questionId: runtimeInput.questionId,
userMessage: runtimeInput.userMessage,
payload: runtimeInput.payload,
runtimeAnalysisContext: runtimeInput.runtimeAnalysisContext,
sessionInvestigationState: runtimeInput.sessionInvestigationState,
addressRuntimeMetaForDeep: runtimeInput.addressRuntimeMetaForDeep,
featureInvestigationStateV1: deps.featureInvestigationStateV1,
featureStateFollowupBindingV1: deps.featureStateFollowupBindingV1,
featureContractsV11: deps.featureContractsV11,
featureAnswerPolicyV11: deps.featureAnswerPolicyV11,
featureProblemCentricAnswerV1: deps.featureProblemCentricAnswerV1,
featureLifecycleAnswerV1: deps.featureLifecycleAnswerV1,
buildFollowupStateBinding: deps.buildFollowupStateBinding,
normalize: deps.normalize,
resolveBusinessScopeAlignment: deps.resolveBusinessScopeAlignment,
inferP0DomainFromMessage: deps.inferP0DomainFromMessage,
resolveBusinessScopeFromLiveContext: deps.resolveBusinessScopeFromLiveContext,
extractRequirements: deps.extractRequirements,
toExecutionPlan: deps.toExecutionPlan,
enforceRbpLiveRoutePlan: deps.enforceRbpLiveRoutePlan,
enforceFaLiveRoutePlan: deps.enforceFaLiveRoutePlan,
executeRouteRuntime: deps.executeRouteRuntime,
mapNoRouteReason: deps.mapNoRouteReason,
buildSkippedResult: deps.buildSkippedResult,
evaluateCoverage: deps.evaluateCoverage,
checkGrounding: deps.checkGrounding,
collectRbpLiveRouteAudit: deps.collectRbpLiveRouteAudit,
collectFaLiveRouteAudit: deps.collectFaLiveRouteAudit,
hasExplicitPeriodAnchor: deps.hasExplicitPeriodAnchorFromNormalized,
extractDroppedIntentSegments: deps.extractDroppedIntentSegments,
buildDebugRoutes: deps.toDebugRoutes,
extractExecutionState: deps.extractExecutionState,
sanitizeReply: deps.sanitizeOutgoingAssistantText,
persistInvestigationState: deps.setInvestigationState,
messageIdFactory: deps.messageIdFactory,
appendItem: deps.appendItem,
getSession: deps.getSession,
persistSession: deps.persistSession,
cloneConversation: (items) => items.map((item) => ({ ...item })),
logEvent: deps.logEvent
};
}