NODEDC_1C/llm_normalizer/backend/dist/services/assistantAddressLaneRespons...

262 lines
13 KiB
JavaScript

"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.runAssistantAddressLaneResponseRuntime = runAssistantAddressLaneResponseRuntime;
const assistantAddressTurnFinalizeRuntimeAdapter_1 = require("./assistantAddressTurnFinalizeRuntimeAdapter");
const assistantCapabilityBindingResponseGuard_1 = require("./assistantCapabilityBindingResponseGuard");
const assistantCapabilityRuntimeBindingAdapter_1 = require("./assistantCapabilityRuntimeBindingAdapter");
const assistantMcpDiscoveryDebugAttachment_1 = require("./assistantMcpDiscoveryDebugAttachment");
const assistantMcpDiscoveryResponsePolicy_1 = require("./assistantMcpDiscoveryResponsePolicy");
const assistantRuntimeContractResolver_1 = require("./assistantRuntimeContractResolver");
const assistantStateTransitionRuntimeAdapter_1 = require("./assistantStateTransitionRuntimeAdapter");
const assistantTruthAnswerPolicyRuntimeAdapter_1 = require("./assistantTruthAnswerPolicyRuntimeAdapter");
function toRecordObject(value) {
if (!value || typeof value !== "object") {
return null;
}
return value;
}
function toNullableString(value) {
if (typeof value !== "string") {
return null;
}
const trimmed = value.trim();
return trimmed.length > 0 ? trimmed : null;
}
function toNullableBoolean(value) {
if (typeof value === "boolean") {
return value;
}
return undefined;
}
function normalizeAddressReplyType(value) {
return value === "factual" || value === "partial_coverage" ? value : "partial_coverage";
}
function normalizeAddressLaneDebug(value) {
return (toRecordObject(value) ?? {});
}
function normalizeCarryoverMeta(value) {
const source = toRecordObject(value);
if (!source) {
return null;
}
const followupContext = toRecordObject(source.followupContext);
const previousAddressIntent = toNullableString(source.previousAddressIntent) ??
toNullableString(followupContext?.previous_intent);
const previousAddressAnchor = toNullableString(source.previousAddressAnchor) ??
toNullableString(followupContext?.previous_anchor);
if (!previousAddressIntent && !previousAddressAnchor) {
return null;
}
return {
previousAddressIntent,
previousAddressAnchor
};
}
function normalizeLlmPreDecomposeMeta(value) {
const source = toRecordObject(value);
if (!source) {
return null;
}
const dialogContinuationContractRaw = toRecordObject(source.dialogContinuationContract);
const addressRetryAuditRaw = toRecordObject(source.addressRetryAudit);
const predecomposeContractRaw = toRecordObject(source.predecomposeContract);
const predecomposePeriodRaw = toRecordObject(predecomposeContractRaw?.period);
const semanticExtractionContractRaw = toRecordObject(source.semanticExtractionContract);
const normalized = {};
const attempted = toNullableBoolean(source.attempted);
if (attempted !== undefined)
normalized.attempted = attempted;
const applied = toNullableBoolean(source.applied);
if (applied !== undefined)
normalized.applied = applied;
const provider = toNullableString(source.provider);
if (provider)
normalized.provider = provider;
const traceId = toNullableString(source.traceId);
if (traceId)
normalized.traceId = traceId;
const reason = toNullableString(source.reason);
if (reason)
normalized.reason = reason;
const fallbackRuleHit = toNullableString(source.fallbackRuleHit);
if (fallbackRuleHit)
normalized.fallbackRuleHit = fallbackRuleHit;
const sanitizedUserMessage = toNullableString(source.sanitizedUserMessage);
if (sanitizedUserMessage)
normalized.sanitizedUserMessage = sanitizedUserMessage;
const toolGateDecision = toNullableString(source.toolGateDecision);
if (toolGateDecision)
normalized.toolGateDecision = toolGateDecision;
const toolGateReason = toNullableString(source.toolGateReason);
if (toolGateReason)
normalized.toolGateReason = toolGateReason;
if (dialogContinuationContractRaw) {
const decision = toNullableString(dialogContinuationContractRaw.decision);
const targetIntent = toNullableString(dialogContinuationContractRaw.target_intent);
if (decision || targetIntent) {
normalized.dialogContinuationContract = {
decision,
target_intent: targetIntent
};
}
}
if (addressRetryAuditRaw) {
const retryAttempted = toNullableBoolean(addressRetryAuditRaw.attempted);
const retryReason = toNullableString(addressRetryAuditRaw.reason);
const initialLimitedCategory = toNullableString(addressRetryAuditRaw.initial_limited_category);
const retryResultCategory = toNullableString(addressRetryAuditRaw.retry_result_category);
if (retryAttempted !== undefined ||
retryReason ||
initialLimitedCategory ||
retryResultCategory) {
normalized.addressRetryAudit = {
attempted: retryAttempted,
reason: retryReason,
initial_limited_category: initialLimitedCategory,
retry_result_category: retryResultCategory
};
}
}
if (predecomposeContractRaw) {
const intent = toNullableString(predecomposeContractRaw.intent);
const aggregationProfile = toNullableString(predecomposeContractRaw.aggregation_profile);
const periodScope = toNullableString(predecomposePeriodRaw?.scope);
if (intent || aggregationProfile || periodScope) {
normalized.predecomposeContract = {
intent,
aggregation_profile: aggregationProfile,
period: periodScope ? { scope: periodScope } : null
};
}
}
if (semanticExtractionContractRaw) {
const valid = toNullableBoolean(semanticExtractionContractRaw.valid);
const quality = toNullableString(semanticExtractionContractRaw.quality);
const applyCanonicalRecommended = toNullableBoolean(semanticExtractionContractRaw.apply_canonical_recommended);
const reasonCodes = Array.isArray(semanticExtractionContractRaw.reason_codes)
? semanticExtractionContractRaw.reason_codes
.map((item) => toNullableString(item))
.filter((item) => Boolean(item))
: [];
if (valid !== undefined || quality || applyCanonicalRecommended !== undefined || reasonCodes.length > 0) {
normalized.semanticExtractionContract = {
valid: valid ?? null,
quality,
apply_canonical_recommended: applyCanonicalRecommended ?? null,
reason_codes: reasonCodes
};
}
}
const hasUsefulField = Object.values(normalized).some((item) => item !== undefined && item !== null);
return hasUsefulField ? normalized : null;
}
function runAssistantAddressLaneResponseRuntime(input) {
const finalizeAddressTurnSafe = input.finalizeAddressTurn ?? assistantAddressTurnFinalizeRuntimeAdapter_1.finalizeAssistantAddressTurn;
const safeAddressReply = input.sanitizeOutgoingAssistantText(input.addressLane.reply_text);
const debug = input.buildAddressDebugPayload(input.addressLane.debug, input.llmPreDecomposeMeta);
const followupOffer = input.buildAddressFollowupOffer(debug);
if (followupOffer) {
debug.address_followup_offer = followupOffer;
}
const laneOrganizationCandidates = Array.isArray(input.addressLane.debug?.organization_candidates)
? input.addressLane.debug.organization_candidates
: [];
const debugKnownOrganizations = input.mergeKnownOrganizations([
...input.knownOrganizations,
...laneOrganizationCandidates
]);
const debugFilters = debug?.extracted_filters && typeof debug.extracted_filters === "object"
? debug.extracted_filters
: null;
const debugActiveOrganization = input.toNonEmptyString(debugFilters?.organization) ??
input.toNonEmptyString(input.activeOrganization);
const followupContextSource = input.carryoverMeta?.followupContext && typeof input.carryoverMeta.followupContext === "object"
? input.carryoverMeta.followupContext
: null;
if (debugKnownOrganizations.length > 0) {
debug.assistant_known_organizations = debugKnownOrganizations;
}
if (debugActiveOrganization) {
debug.assistant_active_organization = debugActiveOrganization;
}
const rootIntent = input.toNonEmptyString(followupContextSource?.root_intent);
const currentFrameKind = input.toNonEmptyString(followupContextSource?.current_frame_kind);
const rootFilters = followupContextSource?.root_filters && typeof followupContextSource.root_filters === "object"
? followupContextSource.root_filters
: null;
if (rootIntent || currentFrameKind) {
debug.address_root_frame_context = {
root_intent: rootIntent,
current_frame_kind: currentFrameKind,
organization: input.toNonEmptyString(rootFilters?.organization),
as_of_date: input.toNonEmptyString(rootFilters?.as_of_date),
period_from: input.toNonEmptyString(rootFilters?.period_from),
period_to: input.toNonEmptyString(rootFilters?.period_to)
};
}
const debugWithRuntimeContracts = (0, assistantRuntimeContractResolver_1.attachAssistantRuntimeContractShadow)(debug, {
userMessage: input.userMessage,
addressRuntimeMeta: input.llmPreDecomposeMeta
});
const debugWithTruthAnswerPolicy = (0, assistantTruthAnswerPolicyRuntimeAdapter_1.attachAssistantTruthAnswerPolicy)(debugWithRuntimeContracts, {
addressRuntimeMeta: input.llmPreDecomposeMeta,
replyType: normalizeAddressReplyType(input.addressLane.reply_type)
});
const debugWithStateTransition = (0, assistantStateTransitionRuntimeAdapter_1.attachAssistantStateTransition)(debugWithTruthAnswerPolicy, {
addressRuntimeMeta: input.llmPreDecomposeMeta,
replyType: normalizeAddressReplyType(input.addressLane.reply_type)
});
const debugWithCapabilityBinding = (0, assistantCapabilityRuntimeBindingAdapter_1.attachAssistantCapabilityRuntimeBinding)(debugWithStateTransition, {
addressRuntimeMeta: input.llmPreDecomposeMeta,
replyType: normalizeAddressReplyType(input.addressLane.reply_type)
});
const debugWithMcpDiscovery = (0, assistantMcpDiscoveryDebugAttachment_1.attachAssistantMcpDiscoveryDebug)(debugWithCapabilityBinding, {
addressRuntimeMeta: input.llmPreDecomposeMeta
});
const guardedResponse = (0, assistantCapabilityBindingResponseGuard_1.applyAssistantCapabilityBindingResponseGuard)({
assistantReply: safeAddressReply,
replyType: normalizeAddressReplyType(input.addressLane.reply_type),
capabilityBinding: debugWithMcpDiscovery.assistant_capability_binding_v1
});
const debugWithResponseGuard = {
...debugWithMcpDiscovery,
capability_binding_response_guard: guardedResponse.audit
};
const mcpDiscoveryResponsePolicy = (0, assistantMcpDiscoveryResponsePolicy_1.applyAssistantMcpDiscoveryResponsePolicy)({
currentReply: guardedResponse.assistantReply,
currentReplySource: "address_query_runtime_v1",
addressRuntimeMeta: debugWithResponseGuard
});
const finalAssistantReply = mcpDiscoveryResponsePolicy.applied
? mcpDiscoveryResponsePolicy.reply_text
: guardedResponse.assistantReply;
const finalReplyType = mcpDiscoveryResponsePolicy.applied ? "partial_coverage" : guardedResponse.replyType;
const finalDebug = {
...debugWithResponseGuard,
mcp_discovery_response_policy_v1: mcpDiscoveryResponsePolicy,
mcp_discovery_response_candidate_v1: mcpDiscoveryResponsePolicy.candidate,
mcp_discovery_response_applied: mcpDiscoveryResponsePolicy.applied
};
const finalization = finalizeAddressTurnSafe({
sessionId: input.sessionId,
userMessage: input.userMessage,
effectiveAddressUserMessage: input.effectiveAddressUserMessage,
assistantReply: finalAssistantReply,
replyType: finalReplyType,
addressLaneDebug: normalizeAddressLaneDebug(input.addressLane.debug),
debug: finalDebug,
carryoverMeta: normalizeCarryoverMeta(input.carryoverMeta),
llmPreDecomposeMeta: normalizeLlmPreDecomposeMeta(input.llmPreDecomposeMeta),
appendItem: input.appendItem,
getSession: input.getSession,
persistSession: input.persistSession,
cloneConversation: input.cloneConversation,
logEvent: input.logEvent,
messageIdFactory: input.messageIdFactory
});
return {
response: finalization.response,
debug: finalDebug
};
}