207 lines
10 KiB
JavaScript
207 lines
10 KiB
JavaScript
"use strict";
|
||
// @ts-nocheck
|
||
Object.defineProperty(exports, "__esModule", { value: true });
|
||
exports.buildInventoryHistoryCapabilityFollowupReply = buildInventoryHistoryCapabilityFollowupReply;
|
||
exports.buildAddressMemoryRecapReply = buildAddressMemoryRecapReply;
|
||
exports.resolveAssistantLivingChatMemoryContext = resolveAssistantLivingChatMemoryContext;
|
||
exports.createAssistantMemoryRecapPolicy = createAssistantMemoryRecapPolicy;
|
||
function formatIsoDateForReply(value) {
|
||
const source = String(value ?? "").trim();
|
||
const match = source.match(/^(\d{4})-(\d{2})-(\d{2})$/);
|
||
if (!match) {
|
||
return null;
|
||
}
|
||
return `${match[3]}.${match[2]}.${match[1]}`;
|
||
}
|
||
function collectMessageSamples(input) {
|
||
const values = [
|
||
input.rawUserMessage,
|
||
input.repairedRawUserMessage,
|
||
input.effectiveAddressUserMessage,
|
||
input.repairedEffectiveAddressUserMessage
|
||
];
|
||
return Array.from(new Set(values
|
||
.map((item) => String(item ?? "").trim())
|
||
.filter((item) => item.length > 0)));
|
||
}
|
||
function hasSignalAcrossSamples(samples, detector) {
|
||
return samples.some((sample) => detector(sample));
|
||
}
|
||
function hasExplicitRecapPromptSignal(samples) {
|
||
return samples.some((sample) => /(?:что\s+мы\s+.*(?:обсуждали|выяснили)|что\s+уже\s+выяснили|что\s+уже\s+поняли|напомни\s+что\s+мы)/iu.test(sample));
|
||
}
|
||
function findLastGroundedInventoryAddressDebug(items) {
|
||
if (!Array.isArray(items)) {
|
||
return null;
|
||
}
|
||
for (let index = items.length - 1; index >= 0; index -= 1) {
|
||
const item = items[index];
|
||
if (!item || item.role !== "assistant" || !item.debug || typeof item.debug !== "object") {
|
||
continue;
|
||
}
|
||
const debug = item.debug;
|
||
const answerGroundingCheck = debug.answer_grounding_check && typeof debug.answer_grounding_check === "object"
|
||
? debug.answer_grounding_check
|
||
: null;
|
||
const groundingStatus = String(answerGroundingCheck?.status ?? "");
|
||
const detectedIntent = String(debug.detected_intent ?? "");
|
||
const capabilityId = String(debug.capability_id ?? "");
|
||
const rootFrameContext = debug.address_root_frame_context && typeof debug.address_root_frame_context === "object"
|
||
? debug.address_root_frame_context
|
||
: null;
|
||
const rootIntent = String(rootFrameContext?.root_intent ?? "");
|
||
const isInventoryContext = detectedIntent === "inventory_on_hand_as_of_date" ||
|
||
capabilityId === "confirmed_inventory_on_hand_as_of_date" ||
|
||
rootIntent === "inventory_on_hand_as_of_date";
|
||
if (groundingStatus === "grounded" && isInventoryContext) {
|
||
return debug;
|
||
}
|
||
}
|
||
return null;
|
||
}
|
||
function findLastAddressDebugWithItem(items) {
|
||
if (!Array.isArray(items)) {
|
||
return null;
|
||
}
|
||
for (let index = items.length - 1; index >= 0; index -= 1) {
|
||
const item = items[index];
|
||
if (!item || item.role !== "assistant" || !item.debug || typeof item.debug !== "object") {
|
||
continue;
|
||
}
|
||
const debug = item.debug;
|
||
if (String(debug.execution_lane ?? "") !== "address_query") {
|
||
continue;
|
||
}
|
||
const extractedFilters = debug.extracted_filters && typeof debug.extracted_filters === "object"
|
||
? debug.extracted_filters
|
||
: null;
|
||
const itemLabel = String(extractedFilters?.item ?? "").trim() ||
|
||
(String(debug.anchor_type ?? "") === "item"
|
||
? String(debug.anchor_value_resolved ?? debug.anchor_value_raw ?? "").trim()
|
||
: "");
|
||
if (itemLabel) {
|
||
return debug;
|
||
}
|
||
}
|
||
return null;
|
||
}
|
||
function findLastAddressDebug(items) {
|
||
if (!Array.isArray(items)) {
|
||
return null;
|
||
}
|
||
for (let index = items.length - 1; index >= 0; index -= 1) {
|
||
const item = items[index];
|
||
if (!item || item.role !== "assistant" || !item.debug || typeof item.debug !== "object") {
|
||
continue;
|
||
}
|
||
if (String(item.debug.execution_lane ?? "") === "address_query") {
|
||
return item.debug;
|
||
}
|
||
}
|
||
return null;
|
||
}
|
||
function buildInventoryHistoryCapabilityFollowupReply(input) {
|
||
const rootFrameContext = input.addressDebug?.address_root_frame_context &&
|
||
typeof input.addressDebug.address_root_frame_context === "object"
|
||
? input.addressDebug.address_root_frame_context
|
||
: null;
|
||
const extractedFilters = input.addressDebug?.extracted_filters && typeof input.addressDebug.extracted_filters === "object"
|
||
? input.addressDebug.extracted_filters
|
||
: null;
|
||
const organization = input.organization ??
|
||
input.toNonEmptyString(rootFrameContext?.organization) ??
|
||
input.toNonEmptyString(extractedFilters?.organization);
|
||
const lastAsOfDate = formatIsoDateForReply(rootFrameContext?.as_of_date) ??
|
||
formatIsoDateForReply(extractedFilters?.as_of_date);
|
||
const organizationPart = organization ? ` по компании «${organization}»` : "";
|
||
const referenceLine = lastAsOfDate
|
||
? `Да, могу. Сейчас мы уже смотрели складской срез${organizationPart} на ${lastAsOfDate}.`
|
||
: `Да, могу показать исторические данные${organizationPart} в этом же складском контуре.`;
|
||
return [
|
||
referenceLine,
|
||
`Могу показать исторические остатки${organizationPart} за нужный месяц, дату или год.`,
|
||
"Например:",
|
||
"- `на март 2020`",
|
||
"- `на июнь 2016`",
|
||
"- `за 2017 год`",
|
||
"- `сравни июнь 2016 с текущим срезом`",
|
||
"Если хочешь, сразу покажу нужный исторический период."
|
||
].join("\n");
|
||
}
|
||
function buildAddressMemoryRecapReply(input) {
|
||
const extractedFilters = input.addressDebug?.extracted_filters && typeof input.addressDebug.extracted_filters === "object"
|
||
? input.addressDebug.extracted_filters
|
||
: null;
|
||
const rootFrameContext = input.addressDebug?.address_root_frame_context &&
|
||
typeof input.addressDebug.address_root_frame_context === "object"
|
||
? input.addressDebug.address_root_frame_context
|
||
: null;
|
||
const item = input.toNonEmptyString(extractedFilters?.item) ??
|
||
(String(input.addressDebug?.anchor_type ?? "") === "item"
|
||
? input.toNonEmptyString(input.addressDebug?.anchor_value_resolved) ??
|
||
input.toNonEmptyString(input.addressDebug?.anchor_value_raw)
|
||
: null);
|
||
const organization = input.organization ??
|
||
input.toNonEmptyString(extractedFilters?.organization) ??
|
||
input.toNonEmptyString(rootFrameContext?.organization);
|
||
const scopedDate = formatIsoDateForReply(extractedFilters?.as_of_date) ??
|
||
formatIsoDateForReply(rootFrameContext?.as_of_date) ??
|
||
formatIsoDateForReply(extractedFilters?.period_to);
|
||
if (item) {
|
||
const datePart = scopedDate ? ` в срезе на ${scopedDate}` : "";
|
||
const organizationPart = organization ? ` по компании «${organization}»` : "";
|
||
return [
|
||
`Да, помню. Мы обсуждали позицию «${item}»${organizationPart}${datePart}.`,
|
||
"Могу продолжить по ней без переписывания сущности: кто поставил, когда купили, по каким документам или кому продали."
|
||
].join(" ");
|
||
}
|
||
if (organization || scopedDate) {
|
||
const organizationPart = organization ? ` по компании «${organization}»` : "";
|
||
const datePart = scopedDate ? ` на ${scopedDate}` : "";
|
||
return [
|
||
`Да, помню. Мы уже смотрели адресный контур${organizationPart}${datePart}.`,
|
||
"Могу кратко напомнить контекст или сразу продолжить следующий шаг по этому же сценарию."
|
||
].join(" ");
|
||
}
|
||
return "Да, помню предыдущий адресный контур. Могу кратко напомнить, что мы уже подтвердили, или сразу продолжить следующий шаг.";
|
||
}
|
||
function resolveAssistantLivingChatMemoryContext(input) {
|
||
const contextualInventoryHistoryCapabilityFollowup = String(input.modeDecisionReason ?? "") === "inventory_history_capability_followup_detected";
|
||
const contextualMemoryRecapFollowup = String(input.modeDecisionReason ?? "") === "memory_recap_followup_detected";
|
||
const sessionItems = Array.isArray(input.sessionItems) ? input.sessionItems : [];
|
||
return {
|
||
contextualInventoryHistoryCapabilityFollowup,
|
||
contextualMemoryRecapFollowup,
|
||
lastGroundedInventoryAddressDebug: contextualInventoryHistoryCapabilityFollowup
|
||
? findLastGroundedInventoryAddressDebug(sessionItems)
|
||
: null,
|
||
lastMemoryAddressDebug: contextualMemoryRecapFollowup
|
||
? findLastAddressDebugWithItem(sessionItems) ?? findLastAddressDebug(sessionItems)
|
||
: null
|
||
};
|
||
}
|
||
function createAssistantMemoryRecapPolicy(deps) {
|
||
function resolveRouteMemorySignals(input) {
|
||
const samples = collectMessageSamples(input);
|
||
const historicalCapabilitySignal = hasSignalAcrossSamples(samples, deps.hasHistoricalCapabilityFollowupSignal);
|
||
const memoryRecapSignal = hasSignalAcrossSamples(samples, deps.hasConversationMemoryRecallFollowupSignal);
|
||
const explicitRecapPromptSignal = hasExplicitRecapPromptSignal(samples);
|
||
return {
|
||
contextualHistoricalCapabilityFollowupDetected: Boolean(input.capabilityMetaQuery &&
|
||
!input.dataScopeMetaQuery &&
|
||
!input.dataRetrievalSignal &&
|
||
historicalCapabilitySignal &&
|
||
deps.isGroundedInventoryContextDebug(input.lastGroundedAddressDebug)),
|
||
contextualMemoryRecapFollowupDetected: Boolean(!input.dataScopeMetaQuery &&
|
||
!input.capabilityMetaQuery &&
|
||
!input.aggregateBusinessAnalyticsSignal &&
|
||
memoryRecapSignal &&
|
||
(explicitRecapPromptSignal || (!input.dataRetrievalSignal && !input.strongDataSignal)) &&
|
||
input.hasPriorAddressDebug)
|
||
};
|
||
}
|
||
return {
|
||
resolveRouteMemorySignals
|
||
};
|
||
}
|