"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.ASSISTANT_MCP_DISCOVERY_DATA_NEED_GRAPH_SCHEMA_VERSION = void 0; exports.buildAssistantMcpDiscoveryDataNeedGraph = buildAssistantMcpDiscoveryDataNeedGraph; exports.ASSISTANT_MCP_DISCOVERY_DATA_NEED_GRAPH_SCHEMA_VERSION = "assistant_data_need_graph_v1"; function toNonEmptyString(value) { if (value === null || value === undefined) { return null; } const text = String(value).trim(); return text.length > 0 ? text : null; } function lower(value) { return String(value ?? "").trim().toLowerCase(); } function normalizeReasonCode(value) { const normalized = value .trim() .replace(/[^\p{L}\p{N}_.:-]+/gu, "_") .replace(/^_+|_+$/g, "") .toLowerCase(); return normalized.length > 0 ? normalized.slice(0, 120) : null; } function pushReason(target, value) { const normalized = normalizeReasonCode(value); if (normalized && !target.includes(normalized)) { target.push(normalized); } } function pushUnique(target, value) { const text = toNonEmptyString(value); if (text && !target.includes(text)) { target.push(text); } } function businessFactFamilyFor(input) { const combined = `${input.semanticDataNeed} ${input.domain} ${input.action} ${input.unsupported}`.trim(); if (combined.includes("metadata lane clarification")) { return "schema_surface"; } if (combined.includes("metadata")) { return "schema_surface"; } if (combined.includes("entity discovery") || combined.includes("entity_resolution")) { return "entity_grounding"; } if (combined.includes("lifecycle") || combined.includes("activity")) { return "activity_lifecycle"; } if (combined.includes("movement")) { return "movement_evidence"; } if (combined.includes("document")) { return "document_evidence"; } if (combined.includes("value-flow") || combined.includes("turnover") || combined.includes("payout") || combined.includes("net")) { return "value_flow"; } return null; } function aggregationNeedFor(axis) { if (!axis) { return null; } if (axis === "month") { return "by_month"; } return `by_${axis}`; } function timeScopeNeedFor(input) { if (input.explicitDateScope) { return "explicit_period"; } if (input.family === "value_flow" || input.family === "movement_evidence" || input.family === "document_evidence") { return "period_required"; } if (input.family === "activity_lifecycle") { return "open_activity_window"; } return null; } function comparisonNeedFor(action) { if (action === "net_value_flow") { return "incoming_vs_outgoing"; } return null; } function allowsOpenScopeWithoutSubject(input) { if (input.family !== "value_flow") { return false; } return Boolean(input.rankingNeed || input.comparisonNeed === "incoming_vs_outgoing"); } function rankingNeedFromRawUtterance(value) { const text = lower(value); if (!text) { return null; } if (/(?:\btop[-\s]?\d+\b|\btop\b|топ[-\s]?\d+|топ\b|сам(?:ый|ая|ое|ые)\b|больше\s+всего|наибол[её]е|highest|largest|most)/iu.test(text)) { return "top_desc"; } if (/(?:меньше\s+всего|наимен[ьш]е|lowest|smallest|least)/iu.test(text)) { return "bottom_asc"; } return null; } function proofExpectationFor(input) { if (input.clarificationGaps.length > 0) { return "clarification_required"; } if (input.family === "schema_surface") { return "schema_surface"; } if (input.family === "entity_grounding") { return "entity_grounding"; } if (input.family === "activity_lifecycle") { return "bounded_inference"; } return "coverage_checked_fact"; } function decompositionCandidatesFor(input) { const result = []; if (input.family === "schema_surface") { pushUnique(result, "inspect_metadata_surface"); return result; } if (input.family === "entity_grounding") { pushUnique(result, "search_business_entity"); pushUnique(result, "resolve_entity_reference"); pushUnique(result, "probe_coverage"); return result; } if (input.family === "value_flow") { if (input.rankingNeed && input.openScopeWithoutSubject) { pushUnique(result, "collect_scoped_movements"); pushUnique(result, "aggregate_ranked_axis_values"); pushUnique(result, "probe_coverage"); return result; } if (input.comparisonNeed === "incoming_vs_outgoing" && input.openScopeWithoutSubject) { pushUnique(result, "collect_incoming_movements"); pushUnique(result, "collect_outgoing_movements"); if (input.aggregationNeed === "by_month") { pushUnique(result, "aggregate_by_month"); } pushUnique(result, "probe_coverage"); return result; } pushUnique(result, "resolve_entity_reference"); if (input.action === "net_value_flow") { pushUnique(result, "collect_incoming_movements"); pushUnique(result, "collect_outgoing_movements"); } else { pushUnique(result, "collect_scoped_movements"); } pushUnique(result, input.aggregationNeed === "by_month" ? "aggregate_by_month" : "aggregate_checked_amounts"); pushUnique(result, "probe_coverage"); return result; } if (input.family === "movement_evidence") { pushUnique(result, "resolve_entity_reference"); pushUnique(result, "fetch_scoped_movements"); pushUnique(result, "probe_coverage"); return result; } if (input.family === "document_evidence") { pushUnique(result, "resolve_entity_reference"); pushUnique(result, "fetch_scoped_documents"); pushUnique(result, "probe_coverage"); return result; } if (input.family === "activity_lifecycle") { pushUnique(result, "resolve_entity_reference"); pushUnique(result, "fetch_supporting_documents"); pushUnique(result, "probe_coverage"); pushUnique(result, "explain_evidence_basis"); } return result; } function forbiddenOverclaimFlagsFor(family) { const result = ["no_raw_model_claims"]; if (family === "schema_surface") { pushUnique(result, "no_fake_schema_surface"); } if (family === "entity_grounding") { pushUnique(result, "no_unresolved_entity_claim"); } if (family === "activity_lifecycle") { pushUnique(result, "no_legal_age_claim_without_evidence"); } if (family === "value_flow" || family === "movement_evidence" || family === "document_evidence") { pushUnique(result, "no_unchecked_fact_totals"); } return result; } function buildAssistantMcpDiscoveryDataNeedGraph(input) { const semanticDataNeed = lower(input.semanticDataNeed); const turnMeaning = input.turnMeaning ?? null; const domain = lower(turnMeaning?.asked_domain_family); const action = lower(turnMeaning?.asked_action_family); const unsupported = lower(turnMeaning?.unsupported_but_understood_family); const rawUtterance = lower(input.rawUtterance); const aggregationAxis = lower(turnMeaning?.asked_aggregation_axis); const explicitDateScope = toNonEmptyString(turnMeaning?.explicit_date_scope); const subjectCandidates = (turnMeaning?.explicit_entity_candidates ?? []) .map((item) => toNonEmptyString(item)) .filter((item) => Boolean(item)); const businessFactFamily = businessFactFamilyFor({ semanticDataNeed, domain, action, unsupported }); const aggregationNeed = aggregationNeedFor(aggregationAxis); const comparisonNeed = comparisonNeedFor(action); const rankingNeed = rankingNeedFromRawUtterance(rawUtterance); const openScopeWithoutSubject = subjectCandidates.length === 0 && allowsOpenScopeWithoutSubject({ family: businessFactFamily, comparisonNeed, rankingNeed }); const clarificationGaps = []; if (unsupported === "metadata_lane_choice_clarification" || action === "resolve_next_lane") { pushUnique(clarificationGaps, "lane_family_choice"); } if (subjectCandidates.length === 0 && businessFactFamily !== "schema_surface" && !openScopeWithoutSubject) { pushUnique(clarificationGaps, "subject"); } const timeScopeNeed = timeScopeNeedFor({ family: businessFactFamily, explicitDateScope }); if (timeScopeNeed === "period_required" && !explicitDateScope) { pushUnique(clarificationGaps, "period"); } const decompositionCandidates = decompositionCandidatesFor({ family: businessFactFamily, action, aggregationNeed, comparisonNeed, rankingNeed, openScopeWithoutSubject }); const reasonCodes = []; pushReason(reasonCodes, "data_need_graph_built"); if (businessFactFamily) { pushReason(reasonCodes, `data_need_graph_family_${businessFactFamily}`); } else { pushReason(reasonCodes, "data_need_graph_family_unknown"); } if (aggregationNeed) { pushReason(reasonCodes, `data_need_graph_aggregation_${aggregationNeed}`); } if (rankingNeed) { pushReason(reasonCodes, `data_need_graph_ranking_${rankingNeed}`); } if (comparisonNeed) { pushReason(reasonCodes, `data_need_graph_comparison_${comparisonNeed}`); } if (clarificationGaps.length > 0) { pushReason(reasonCodes, "data_need_graph_has_clarification_gaps"); } return { schema_version: exports.ASSISTANT_MCP_DISCOVERY_DATA_NEED_GRAPH_SCHEMA_VERSION, policy_owner: "assistantMcpDiscoveryDataNeedGraph", subject_candidates: subjectCandidates, business_fact_family: businessFactFamily, action_family: toNonEmptyString(turnMeaning?.asked_action_family), aggregation_need: aggregationNeed, time_scope_need: timeScopeNeed, comparison_need: comparisonNeed, ranking_need: rankingNeed, proof_expectation: proofExpectationFor({ family: businessFactFamily, clarificationGaps }), clarification_gaps: clarificationGaps, decomposition_candidates: decompositionCandidates, forbidden_overclaim_flags: forbiddenOverclaimFlagsFor(businessFactFamily), reason_codes: reasonCodes }; }