import { describe, expect, it } from "vitest"; import type { AssistantRequirement, UnifiedRetrievalResult } from "../src/types/assistant"; import { buildAssistantEvidenceBundleContractV1 } from "../src/services/assistantOrchestrationContracts"; import { assembleAssistantContractsBundleV1 } from "../src/services/assistantContractsBundleAssembler"; function buildRequirement(): AssistantRequirement { return { requirement_id: "R1", source_fragment_id: "F1", requirement_text: "req1", subject_tokens: ["account_60.01"], status: "covered", route: "hybrid_store_plus_live" }; } function buildRetrieval(input?: Partial): UnifiedRetrievalResult { return { fragment_id: "F1", requirement_ids: ["R1"], route: "hybrid_store_plus_live", status: "ok", result_type: "summary", items: [], summary: {}, evidence: [], why_included: [], selection_reason: [], risk_factors: [], business_interpretation: [], confidence: "medium", limitations: [], errors: [], ...input }; } describe("assistant contracts bundle assembler", () => { it("assembles query/execution/coverage contracts with outcome class", () => { const retrievalResults = [buildRetrieval({ status: "ok" })]; const bundle = assembleAssistantContractsBundleV1({ userMessage: "проверь хвосты по 60.01", normalizedQuestion: "проверь хвосты по 60.01", normalized: { schema_version: "normalized_query_v2_0_2", user_message_raw: "проверь хвосты по 60.01", message_in_scope: true, scope_confidence: "high", contains_multiple_tasks: false, fragments: [{ fragment_id: "F1" }], discarded_fragments: [], global_notes: { needs_clarification: false, clarification_reason: null } } as any, routeSummary: { mode: "deterministic_v2", message_in_scope: true, scope_confidence: "high", planner: { total_fragments: 1, in_scope_fragments: 1, out_of_scope_fragments: 0, discarded_fragments: 0, contains_multiple_tasks: false }, decisions: [], fallback: { type: "none", message: null } }, droppedIntentSegments: [], analysisContext: { as_of_date: "2020-07-31", period_from: null, period_to: null, source: "eval_analysis_date", snapshot_mode: "auto" }, executionPlan: [ { fragment_id: "F1", requirement_ids: ["R1"], route: "hybrid_store_plus_live", should_execute: true, no_route_reason: null, clarification_reason: null } ], requirements: [buildRequirement()], evidenceBundleContractV1: buildAssistantEvidenceBundleContractV1({ retrievalCalls: [{ route: "hybrid_store_plus_live" }], retrievalResults }), replyType: "factual_with_explanation", coverageReport: { requirements_total: 1, requirements_covered: 1, requirements_uncovered: [], requirements_partially_covered: [], clarification_needed_for: [], out_of_scope_requirements: [] }, grounding: { status: "grounded", route_subject_match: true, missing_requirements: [], reasons: [], why_included_summary: [], selection_reason_summary: [] }, retrievalResults }); expect(bundle.queryFrameContractV1.schema_version).toBe("assistant_query_frame_v1"); expect(bundle.executionPlanContractV1.schema_version).toBe("assistant_execution_plan_v1"); expect(bundle.coverageContractV1.schema_version).toBe("assistant_coverage_contract_v1"); expect(bundle.outcomeClassV1).toBe("FULLY_ANSWERED"); expect(bundle.assistantOrchestrationContractsV1.evidence_bundle.schema_version).toBe("assistant_evidence_bundle_v1"); }); });