Files
Jyotisha/frontend/src/lib/consultation-birth-time-mode.ts
T
Jesse_Chen eeee0e49af fix(web): narrow natal-minute consultation mode for the production build
BUG-341 added declared_birth_window, but the natal-minute helper still returned boolean, so next build could not pass that mode into serverChartFromProfile.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-21 20:37:44 +08:00

75 lines
2.2 KiB
TypeScript

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<typeof consultationBirthTimeModeSchema>;
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<string, unknown>;
[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;
};
}