АДРЕСНЫЙ РЕЖИМ -ADDRESS:Шаг 0 (Pre-Prod Rails): Предпродакшн-постановка ADDRESS Query V1 на рельсы референсный домен, nightly-автоматизация и подтверждённый global gate (102/102 + 25/25)

This commit is contained in:
2026-04-02 17:53:43 +03:00
parent 4cb9fc7021
commit 53716e548e
113 changed files with 89499 additions and 549 deletions
@@ -168,7 +168,7 @@ function hasAny(text: string, patterns: string[]): boolean {
function hasCompactAccountCodeToken(text: string): boolean {
// Match compact account tokens like 60.01 / 62, while avoiding date fragments.
return /(?<![\d-])\d{2}(?:[.,]\d{1,2})(?![\d-])/u.test(text);
return /(?<![\d-])\d{2}(?:[.,]\d{1,2})?(?![\d-])/u.test(text);
}
function hasDocumentsFormingBalanceSignal(text: string): boolean {
@@ -221,7 +221,22 @@ function hasAccountBalanceSignal(text: string): boolean {
text.includes("скока") ||
text.includes("сколько") ||
/на\s+конец/u.test(text);
return hasAccountLexeme && hasBalanceLexeme;
if (hasAccountLexeme && hasBalanceLexeme) {
return true;
}
const hasAsOfStyleDate =
/\b(19|20)\d{2}[./-](0?[1-9]|1[0-2])(?:[./-](0?[1-9]|[12]\d|3[01]))\b/u.test(text) ||
/(?:на\s+ту\s+же\s+дат[ауеы]|same\s+date|the\s+same\s+date)/iu.test(text);
const hasFollowupBalanceVerb = /(?:вернись|вернуться|вернуть|back|return)/iu.test(text);
return hasAccountLexeme && hasAsOfStyleDate && hasFollowupBalanceVerb;
}
function hasDocumentsByAccountDrilldownSignal(text: string): boolean {
const hasAccountLexeme = hasAccountNumberAnchor(text) || hasCompactAccountCodeToken(text);
const hasDocLexeme = /(?:документ|док(?:и|ам|ах|ов|а)?|docs?|documents?)/iu.test(text);
const hasDrilldownVerb = /(?:раскрой|раскры|разлож|разверн|документами|по\s+документ)/iu.test(text);
const hasSameDate = /(?:на\s+ту\s+же\s+дат[ауеы]|same\s+date|the\s+same\s+date)/iu.test(text);
return hasAccountLexeme && hasDocLexeme && (hasDrilldownVerb || hasSameDate);
}
function hasOpenContractsListSignal(text: string): boolean {
@@ -265,6 +280,13 @@ function isLikelyCounterpartyToken(rawToken: string): boolean {
"документ",
"документы",
"документов",
"документами",
"документу",
"документе",
"документа",
"документах",
"докам",
"доками",
"банк",
"банковские",
"операции",
@@ -292,7 +314,13 @@ function isLikelyCounterpartyToken(rawToken: string): boolean {
"ёпт",
"епта",
"нах",
"нахуй"
"нахуй",
"связанным",
"связанные",
"связанных",
"связанному",
"related",
"linked"
]);
return !stopWords.has(token);
}
@@ -534,6 +562,14 @@ export function resolveAddressIntent(userMessage: string): AddressIntentResoluti
};
}
if (hasDocumentsByAccountDrilldownSignal(text)) {
return {
intent: "documents_forming_balance",
confidence: "medium",
reasons: ["documents_by_account_drilldown_signal_detected"]
};
}
if (hasOpenContractsListSignal(text)) {
return {
intent: "list_open_contracts",