"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.buildAssistantAnswerStructureV11 = buildAssistantAnswerStructureV11; const config_1 = require("../config"); const stage1Contracts_1 = require("../types/stage1Contracts"); const EVIDENCE_LIMITATION_REASON_CODE_SET = new Set([ "snapshot_only", "heuristic_inference", "missing_mechanism", "weak_source_mapping", "insufficient_detail", "unknown" ]); function summarizeUnique(values, limit = 6) { return Array.from(new Set(values.map((item) => String(item ?? "").trim()).filter(Boolean))).slice(0, limit); } function isEvidenceLimitationReasonCode(value) { return EVIDENCE_LIMITATION_REASON_CODE_SET.has(value); } function firstNonEmptyLine(text) { const line = String(text ?? "") .split("\n") .map((item) => item.trim()) .find((item) => item.length > 0); return (line ?? String(text ?? "")).slice(0, 220); } function buildClaimEvidenceLinks(retrievalResults) { const byClaim = new Map(); for (const result of retrievalResults) { for (const evidence of result.evidence) { const claimRef = String(evidence.claim_ref ?? "").trim(); if (!claimRef) { continue; } const evidenceId = String(evidence.evidence_id ?? "").trim(); if (!evidenceId) { continue; } const current = byClaim.get(claimRef) ?? []; current.push(evidenceId); byClaim.set(claimRef, current); } } return Array.from(byClaim.entries()) .slice(0, 10) .map(([claimRef, evidenceIds]) => ({ claim_ref: claimRef, evidence_ids: summarizeUnique(evidenceIds, 10) })); } function buildAssistantAnswerStructureV11(input) { const evidenceIds = summarizeUnique(input.retrievalResults.flatMap((item) => item.evidence.map((evidence) => evidence.evidence_id)), 10); const mechanismNotes = summarizeUnique(input.retrievalResults.flatMap((item) => item.evidence .map((evidence) => evidence.mechanism_note) .filter((note) => typeof note === "string" && note.trim().length > 0)), 6); const sourceRefs = summarizeUnique(input.retrievalResults.flatMap((item) => item.evidence .map((evidence) => evidence.source_ref?.canonical_ref) .filter((value) => typeof value === "string" && value.trim().length > 0)), 8); const limitationReasonCodes = summarizeUnique(input.retrievalResults.flatMap((item) => item.evidence.flatMap((evidence) => { const code = evidence.limitation?.reason_code; return typeof code === "string" && code.trim().length > 0 ? [code] : []; })), 8).filter(isEvidenceLimitationReasonCode); const claimEvidenceLinks = buildClaimEvidenceLinks(input.retrievalResults); const limitations = summarizeUnique([...input.retrievalResults.flatMap((item) => item.limitations), ...input.groundingCheck.reasons], 8); const clarificationQuestions = input.coverageReport.clarification_needed_for.map((item) => `Уточните требование ${item}.`); const recommendedActions = summarizeUnique([ ...input.coverageReport.requirements_uncovered.map((item) => `Проверить непокрытое требование ${item}.`), ...input.coverageReport.requirements_partially_covered.map((item) => `Доуточнить частично покрытое требование ${item}.`) ], 6); const mechanismStatus = mechanismNotes.length === 0 ? "unresolved" : limitationReasonCodes.includes("missing_mechanism") || limitationReasonCodes.includes("heuristic_inference") ? "limited" : "grounded"; const enableEvidenceEnrichment = input.options?.enableEvidenceEnrichment ?? config_1.FEATURE_ASSISTANT_EVIDENCE_ENRICHMENT_V1; return { schema_version: stage1Contracts_1.ANSWER_STRUCTURE_SCHEMA_VERSION, answer_summary: firstNonEmptyLine(input.assistantReply), direct_answer: input.assistantReply, mechanism_block: { status: mechanismStatus, mechanism_notes: mechanismNotes, limitation_reason_codes: limitationReasonCodes }, evidence_block: { evidence_ids: evidenceIds, source_refs: sourceRefs, mechanism_notes: mechanismNotes, coverage_note: input.coverageReport.requirements_total === input.coverageReport.requirements_covered ? "coverage_full_or_near_full" : "coverage_partial_or_limited", ...(enableEvidenceEnrichment && claimEvidenceLinks.length > 0 ? { claim_evidence_links: claimEvidenceLinks } : {}) }, uncertainty_block: { open_uncertainties: input.groundingCheck.missing_requirements, limitations }, next_step_block: { recommended_actions: recommendedActions, clarification_questions: clarificationQuestions } }; }