"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.loadAddressRouteExpectationsContract = loadAddressRouteExpectationsContract; exports.evaluateAddressRouteExpectation = evaluateAddressRouteExpectation; const fs_1 = __importDefault(require("fs")); const path_1 = __importDefault(require("path")); const EXPECTATIONS_FILE = path_1.default.resolve(__dirname, "..", "..", "..", "..", "docs", "TECH", "address_route_expectations_v1.json"); function toObject(value) { if (!value || typeof value !== "object" || Array.isArray(value)) { return null; } return value; } function toNonEmptyString(value) { if (typeof value !== "string") { return null; } const trimmed = value.trim(); return trimmed.length > 0 ? trimmed : null; } function toStringArray(value) { if (!Array.isArray(value)) { return []; } return value.map((item) => toNonEmptyString(item)).filter((item) => Boolean(item)); } function parseResultModes(value) { const raw = toStringArray(value); return raw.filter((mode) => mode === "heuristic_candidates" || mode === "confirmed_balance"); } function parseEntry(value) { const object = toObject(value); if (!object) { return null; } const intent = toNonEmptyString(object.intent); const expectedSelectedRecipes = toStringArray(object.expected_selected_recipes); if (!intent || expectedSelectedRecipes.length === 0) { return null; } const expectedRequestedResultModes = parseResultModes(object.expected_requested_result_modes); const expectedResultModes = parseResultModes(object.expected_result_modes); return { intent, expected_selected_recipes: expectedSelectedRecipes, ...(expectedRequestedResultModes.length > 0 ? { expected_requested_result_modes: expectedRequestedResultModes } : {}), ...(expectedResultModes.length > 0 ? { expected_result_modes: expectedResultModes } : {}) }; } function loadAddressRouteExpectationsContract() { const raw = fs_1.default.readFileSync(EXPECTATIONS_FILE, "utf-8"); const parsed = JSON.parse(raw); const root = toObject(parsed); if (!root) { throw new Error("address_route_expectations_v1: invalid root payload"); } const schemaVersion = toNonEmptyString(root.schema_version); if (schemaVersion !== "address_route_expectations_v1") { throw new Error(`address_route_expectations_v1: unexpected schema version '${schemaVersion ?? "null"}'`); } const updatedAt = toNonEmptyString(root.updated_at) ?? new Date().toISOString(); const entriesRaw = Array.isArray(root.entries) ? root.entries : []; const entries = entriesRaw.map(parseEntry).filter((entry) => entry !== null); if (entries.length === 0) { throw new Error("address_route_expectations_v1: no valid entries"); } return { schema_version: "address_route_expectations_v1", updated_at: updatedAt, entries }; } function evaluateAddressRouteExpectation(input) { const contract = loadAddressRouteExpectationsContract(); const entry = contract.entries.find((item) => item.intent === input.intent); if (!entry) { return { status: "not_found", reason: "route_expectation_not_defined_for_intent", expected_selected_recipes: [], expected_requested_result_modes: [], expected_result_modes: [] }; } if (input.selectedRecipe && !entry.expected_selected_recipes.includes(input.selectedRecipe)) { return { status: "mismatch", reason: "selected_recipe_mismatch", expected_selected_recipes: entry.expected_selected_recipes, expected_requested_result_modes: entry.expected_requested_result_modes ?? [], expected_result_modes: entry.expected_result_modes ?? [] }; } if (input.requestedResultMode && Array.isArray(entry.expected_requested_result_modes) && entry.expected_requested_result_modes.length > 0 && !entry.expected_requested_result_modes.includes(input.requestedResultMode)) { return { status: "mismatch", reason: "requested_result_mode_mismatch", expected_selected_recipes: entry.expected_selected_recipes, expected_requested_result_modes: entry.expected_requested_result_modes, expected_result_modes: entry.expected_result_modes ?? [] }; } if (input.resultMode && Array.isArray(entry.expected_result_modes) && entry.expected_result_modes.length > 0 && !entry.expected_result_modes.includes(input.resultMode)) { return { status: "mismatch", reason: "result_mode_mismatch", expected_selected_recipes: entry.expected_selected_recipes, expected_requested_result_modes: entry.expected_requested_result_modes ?? [], expected_result_modes: entry.expected_result_modes }; } return { status: "matched", reason: "route_expectation_matched", expected_selected_recipes: entry.expected_selected_recipes, expected_requested_result_modes: entry.expected_requested_result_modes ?? [], expected_result_modes: entry.expected_result_modes ?? [] }; }