NODEDC_1C/llm_normalizer/backend/dist/services/addressRouteExpectations.js

129 lines
5.4 KiB
JavaScript

"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 ?? []
};
}