Архитектура: централизовать displayed-entity retarget в continuity policy и убрать dead owner из transition

This commit is contained in:
2026-04-19 12:42:57 +03:00
parent ca91622d62
commit 15662cfe4f
6 changed files with 205 additions and 76 deletions
@@ -2,7 +2,6 @@
import {
applyHistoricalPartyCarryoverFilters,
applyOrganizationCarryoverFilters,
applyReferencedEntityCarryover,
applySelectedItemCarryover,
applyTemporalCarryoverFilters,
buildRootScopedCarryoverFilters,
@@ -13,6 +12,7 @@ import {
readAddressDebugTemporalScope,
resolveAddressDebugCarryoverFilters,
resolveAddressDebugAnchorContext,
resolveDisplayedEntityFollowupRetarget,
resolveAssistantOrganizationAuthority
} from "./assistantContinuityPolicy";
@@ -364,39 +364,6 @@ export function createAssistantTransitionPolicy(deps) {
return null;
}
function resolveDisplayedEntityRetargetIntent(userMessage, entityType) {
const normalized = deps.compactWhitespace(
deps.repairAddressMojibake(String(userMessage ?? "")).toLowerCase()
);
if (!normalized) {
return null;
}
if (entityType === "counterparty") {
if (/(?:договор|контракт)/iu.test(normalized)) {
return "list_contracts_by_counterparty";
}
if (/(?:банк|выписк|плат[её]ж|оплат|statement|payment|wire)/iu.test(normalized)) {
return "bank_operations_by_counterparty";
}
if (/(?:документ|накладн|счет|сч[её]т|акт|реализац|поступл)/iu.test(normalized)) {
return "list_documents_by_counterparty";
}
if (/(?:сколько\s+денег|сколько\s+принес|выручк|сумм[аы]?|оплатил|продаж)/iu.test(normalized)) {
return "customer_revenue_and_payments";
}
return null;
}
if (entityType === "contract") {
if (/(?:банк|выписк|плат[её]ж|оплат|statement|payment|wire)/iu.test(normalized)) {
return "bank_operations_by_contract";
}
if (/(?:документ|накладн|счет|сч[её]т|акт|реализац|поступл)/iu.test(normalized)) {
return "list_documents_by_contract";
}
}
return null;
}
function resolveAddressFollowupCarryoverContext(
userMessage,
items,
@@ -854,25 +821,23 @@ export function createAssistantTransitionPolicy(deps) {
(deps.toNonEmptyString(alternateMessage)
? deps.resolveDisplayedAddressEntityMention(String(alternateMessage ?? ""), displayedEntities)
: null);
if (resolvedEntityFromFollowup && !rootScopedPivot) {
displayedEntityTargetIntent = resolveDisplayedEntityRetargetIntent(
userMessage,
resolvedEntityFromFollowup.entityType
);
}
({
displayedEntityTargetIntent,
previousFilters,
previousAnchorType,
previousAnchorValue: previousAnchor,
followupSelectionMode,
resolvedCounterpartyFromDisplay
} = applyReferencedEntityCarryover(
} = resolveDisplayedEntityFollowupRetarget(
userMessage,
resolvedEntityFromFollowup,
previousFilters,
previousAnchorType,
previousAnchor,
followupSelectionMode,
resolvedEntityFromFollowup,
rootScopedPivot,
deps.compactWhitespace,
deps.repairAddressMojibake,
deps.toNonEmptyString
));
({