import { z } from "zod"; import { guardGeneralNoBirthTimeOutput, guardPreciseTimingOutput, } from "./timing-output-guard.ts"; export const consultationBirthTimeModeSchema = z.enum([ "verified_chart", "unverified_birth_time", "declared_birth_window", "general_no_birth_time", ]); export type ConsultationBirthTimeMode = z.infer; export type NatalMinuteConsultationMode = Extract< ConsultationBirthTimeMode, "verified_chart" | "unverified_birth_time" >; export const UNVERIFIED_BIRTH_TIME_NOTICE = "使用未校正填报时间;分钟敏感结论的置信度已降低。"; export function isNatalMinuteConsultationMode( mode: ConsultationBirthTimeMode, ): mode is NatalMinuteConsultationMode { return mode === "verified_chart" || mode === "unverified_birth_time"; } export function shouldRunBirthChartWorkflow(mode: ConsultationBirthTimeMode): boolean { return isNatalMinuteConsultationMode(mode); } export function shouldRunDeclaredWindowWorkflow(mode: ConsultationBirthTimeMode): boolean { return mode === "declared_birth_window"; } export function applyBirthTimeModeToWorkflowContext< T extends { consumer_context: { answer_policy: Record; [key: string]: unknown; }; [key: string]: unknown; }, >(context: T, mode: ConsultationBirthTimeMode): T { if (mode !== "unverified_birth_time") return context; return { ...context, consumer_context: { ...context.consumer_context, answer_policy: { ...context.consumer_context.answer_policy, birth_time_confidence: "unverified_reported_time", candidate_is_confirmed: false, }, }, }; } /** * Server-side output boundary. Timing and guarantee filtering remains active * without inserting a rectification warning into every answer. */ export function createBirthTimeModeOutputGuard( mode: ConsultationBirthTimeMode, canAnswerPreciseTiming: boolean, ): (text: string) => string { return (text) => { if (mode === "general_no_birth_time") return guardGeneralNoBirthTimeOutput(text); if (mode === "declared_birth_window" || !canAnswerPreciseTiming) { return guardPreciseTimingOutput(text); } return text; }; }