import { describe, expect, it } from "vitest"; import { createAssistantTurnMeaningPolicy } from "../src/services/assistantTurnMeaningPolicy"; import { resolveAddressIntent } from "../src/services/addressIntentResolver"; function buildPolicy() { return createAssistantTurnMeaningPolicy({ compactWhitespace: (value: string) => String(value ?? "").replace(/\s+/g, " ").trim(), repairAddressMojibake: (value: string) => value, resolveAddressIntent, toNonEmptyString: (value: unknown) => { if (value === null || value === undefined) { return null; } const text = String(value).trim(); return text.length > 0 ? text : null; } }); } describe("assistantTurnMeaningPolicy", () => { it("recovers a supported receivables intent from light current-turn typo noise", () => { const policy = buildPolicy(); const meaning = policy.resolveAssistantTurnMeaning({ rawUserMessage: "\u043a\u0442\u043e \u043d\u0430\u043c\u0441 \u0434\u043e\u043b\u0436\u0435\u043d \u0434\u0435\u043d\u0435\u0433 \u043d\u0430 \u0441\u0435\u0433\u043e\u0434\u043d\u044f" }); expect(meaning.schema_version).toBe("assistant_turn_meaning_v1"); expect(meaning.explicit_intent_candidate).toBe("receivables_confirmed_as_of_date"); expect(meaning.asked_domain_family).toBe("receivables"); expect(meaning.carryover_budget).toBe("matching_family_only"); expect(meaning.stale_replay_forbidden).toBe(false); }); it("promotes specific counterparty turnover to the supported revenue intent", () => { const policy = buildPolicy(); const meaning = policy.resolveAssistantTurnMeaning({ rawUserMessage: "\u043a\u0430\u043a\u043e\u0439 \u043e\u0431\u043e\u0440\u043e\u0442 \u0431\u044b\u043b \u0441\u0432\u043a" }); expect(meaning.explicit_intent_candidate).toBe("customer_revenue_and_payments"); expect(meaning.asked_domain_family).toBe("counterparty"); expect(meaning.asked_action_family).toBe("counterparty_value_or_turnover"); expect(meaning.unsupported_but_understood_family).toBeNull(); expect(meaning.stale_replay_forbidden).toBe(false); expect(meaning.carryover_budget).toBe("matching_family_only"); expect(meaning.explicit_entity_candidates).toEqual([ { type: "counterparty", value: "\u0441\u0432\u043a", source: "current_turn_loose_entity_tail" } ]); }); });