NODEDC_1C/llm_normalizer/backend/tests/assistantContinuityPolicy.t...

328 lines
9.5 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import { describe, expect, it } from "vitest";
import {
applyHistoricalPartyCarryoverFilters,
applyOrganizationCarryoverFilters,
applyReferencedEntityCarryover,
applyTemporalCarryoverFilters,
buildRootScopedCarryoverFilters,
hydrateInventoryRootFrameState,
readAddressDebugTemporalScope,
resolveAddressDebugCarryoverFilters,
resolveAddressDebugContextFacts,
resolveAddressDebugAnchorContext,
resolveAssistantOrganizationAuthority
} from "../src/services/assistantContinuityPolicy";
describe("assistantContinuityPolicy organization authority", () => {
it("prefers explicit assistant organization authority over older grounded continuity and merges known organizations once", () => {
const authority = resolveAssistantOrganizationAuthority({
sessionItems: [
{
role: "assistant",
debug: {
execution_lane: "address_query",
answer_grounding_check: { status: "grounded" },
extracted_filters: {
organization: "Org Grounded",
as_of_date: "2020-03-31"
},
detected_intent: "receivables_confirmed_as_of_date"
}
},
{
role: "assistant",
debug: {
execution_lane: "living_chat",
living_chat_selected_organization: "Org Selected",
assistant_active_organization: "Org Selected",
assistant_known_organizations: ["Org Selected", "Org Known"],
living_chat_data_scope_probe_organizations: ["Org Probe"]
}
}
],
sessionKnownOrganizations: ["Org Session"],
lastOrganizationClarificationDebug: {
organization_candidates: ["Org Candidate", "Org Selected"]
}
});
expect(authority.continuitySnapshot.activeOrganization).toBe("Org Grounded");
expect(authority.continuityActiveOrganization).toBe("Org Selected");
expect(authority.selectedOrganization).toBe("Org Selected");
expect(authority.activeOrganization).toBe("Org Selected");
expect(authority.knownOrganizations).toEqual([
"Org Session",
"Org Selected",
"Org Known",
"Org Probe",
"Org Grounded"
]);
expect(authority.organizationClarificationCandidates).toEqual([
"Org Candidate",
"Org Selected",
"Org Session",
"Org Known",
"Org Probe",
"Org Grounded"
]);
expect(authority.organizationClarificationSelectionFromScope).toBe("Org Selected");
});
it("reads item, organization and scoped date from root-frame fallback when direct filters are missing", () => {
const facts = resolveAddressDebugContextFacts({
anchor_type: "item",
anchor_value_resolved: "Рабочая станция",
address_root_frame_context: {
organization: 'ООО "Альтернатива Плюс"',
as_of_date: "2020-03-31"
}
});
expect(facts).toEqual({
item: "Рабочая станция",
organization: 'ООО "Альтернатива Плюс"',
scopedDate: "31.03.2020"
});
});
it("resolves carryover temporal scope and inferred anchor from debug filters when explicit anchor fields are absent", () => {
const debug = {
extracted_filters: {
item: "Рабочая станция",
period_from: "2020-03-01"
},
address_root_frame_context: {
as_of_date: "2020-03-31",
period_to: "2020-03-31"
}
};
expect(readAddressDebugTemporalScope(debug)).toEqual({
asOfDate: "2020-03-31",
periodFrom: "2020-03-01",
periodTo: "2020-03-31"
});
expect(resolveAddressDebugAnchorContext(debug)).toEqual({
anchorType: "item",
anchorValue: "Рабочая станция"
});
});
it("prefers inventory root-frame filters over stale drilldown date scope in carryover filters", () => {
const filters = resolveAddressDebugCarryoverFilters({
detected_intent: "inventory_purchase_documents_for_item",
extracted_filters: {
item: "Workstation",
organization: "Org Alt",
as_of_date: "2021-04-15"
},
address_root_frame_context: {
root_intent: "inventory_on_hand_as_of_date",
root_filters: {
organization: "Org Alt",
warehouse: "Main Warehouse",
as_of_date: "2021-03-31",
period_from: "2021-03-01",
period_to: "2021-03-31"
},
root_anchor_type: "organization",
root_anchor_value: "Org Alt",
current_frame_kind: "inventory_drilldown"
}
});
expect(filters).toEqual({
item: "Workstation",
organization: "Org Alt",
warehouse: "Main Warehouse",
as_of_date: "2021-03-31",
period_from: "2021-03-01",
period_to: "2021-03-31"
});
});
it("hydrates inventory root-frame state from navigation scope and preserves derived current frame kind", () => {
const state = hydrateInventoryRootFrameState(
{
intent: "inventory_on_hand_as_of_date",
filters: {
warehouse: "Main Warehouse"
},
anchorType: "organization",
anchorValue: "Org Alt",
currentFrameKind: null
},
"inventory_purchase_documents_for_item",
"Org Alt",
{
as_of_date: "2021-03-31",
period_from: "2021-03-01",
period_to: "2021-03-31"
},
undefined,
(intent) => String(intent ?? "") === "inventory_purchase_documents_for_item",
(intent) => String(intent ?? "") === "inventory_on_hand_as_of_date"
);
expect(state.currentFrameKind).toBe("inventory_drilldown");
expect(state.inventoryRootFrame).toMatchObject({
currentFrameKind: "inventory_drilldown",
filters: {
organization: "Org Alt",
warehouse: "Main Warehouse",
as_of_date: "2021-03-31",
period_from: "2021-03-01",
period_to: "2021-03-31"
}
});
});
it("builds root-scoped carryover filters with previous date precedence over inventory root frame", () => {
const filters = buildRootScopedCarryoverFilters(
{
organization: "Org Alt",
as_of_date: "2020-03-31",
period_from: "2020-03-01",
period_to: "2020-03-31"
},
{
filters: {
organization: "Org Alt",
warehouse: "Main Warehouse",
as_of_date: "2021-03-31",
period_from: "2021-03-01",
period_to: "2021-03-31"
}
}
);
expect(filters).toEqual({
organization: "Org Alt",
warehouse: "Main Warehouse",
as_of_date: "2020-03-31",
period_from: "2020-03-01",
period_to: "2020-03-31"
});
});
it("applies temporal carryover from navigation scope first and falls back to continuity scope", () => {
const filters = applyTemporalCarryoverFilters(
{
organization: "Org Alt"
},
{
as_of_date: "2021-03-31",
period_from: "2021-03-01"
},
{
asOfDate: "2020-12-31",
periodFrom: "2020-12-01",
periodTo: "2020-12-31"
},
"inventory_purchase_documents_for_item"
);
expect(filters).toEqual({
organization: "Org Alt",
as_of_date: "2021-03-31",
period_from: "2021-03-01",
period_to: "2020-12-31"
});
});
it("does not inject temporal carryover for unrelated intent families", () => {
const filters = applyTemporalCarryoverFilters(
{
organization: "Org Alt"
},
{
as_of_date: "2021-03-31",
period_from: "2021-03-01",
period_to: "2021-03-31"
},
{
asOfDate: "2020-12-31",
periodFrom: "2020-12-01",
periodTo: "2020-12-31"
},
"list_documents_by_counterparty"
);
expect(filters).toEqual({
organization: "Org Alt"
});
});
it("applies organization carryover precedence from historical to shared authority to navigation and clarification", () => {
const filters = applyOrganizationCarryoverFilters(
{},
null,
"Org Authority",
"Org Continuity",
"Org Navigation",
"Org Clarification"
);
expect(filters).toEqual({
organization: "Org Authority"
});
});
it("keeps existing organization and does not overwrite it during organization carryover backfill", () => {
const filters = applyOrganizationCarryoverFilters(
{
organization: "Org Existing"
},
"Org Historical",
"Org Authority",
"Org Continuity",
"Org Navigation",
"Org Clarification"
);
expect(filters).toEqual({
organization: "Org Existing"
});
});
it("backfills historical contract and counterparty only for party-driven follow-up families", () => {
const filters = applyHistoricalPartyCarryoverFilters(
{},
true,
"Contract Legacy",
"Counterparty Legacy"
);
expect(filters).toEqual({
contract: "Contract Legacy",
counterparty: "Counterparty Legacy"
});
});
it("applies referenced entity carryover into filters, anchor, and selection mode", () => {
const carryover = applyReferencedEntityCarryover(
{
organization: "Org Alt"
},
null,
null,
"carry_previous_intent",
{
entityType: "counterparty",
value: "SVK Group"
},
false
);
expect(carryover).toEqual({
previousFilters: {
organization: "Org Alt",
counterparty: "SVK Group"
},
previousAnchorType: "counterparty",
previousAnchorValue: "SVK Group",
followupSelectionMode: "carry_referenced_entity",
resolvedCounterpartyFromDisplay: true
});
});
});