"use client"; import { useCallback, useState } from "react"; import { api } from "@/lib/api/client"; import type { ClarifyDecisionVM } from "./clarify"; // 澄清预检结论为「放行」(直接去 refine,不反问)——后端 error/前端异常时的确定性回退。 const PROCEED: ClarifyDecisionVM = { needClarification: false, questions: [] }; export type ClarifyStatus = "idle" | "checking" | "asking" | "proceed" | "error"; export interface UseClarify { status: ClarifyStatus; // status=asking 时的待答问题(含选项);其它时为 null。 decision: ClarifyDecisionVM | null; // 预检:调 refine/clarify 端点,返回 VM 供调用方同步分支。失败=放行(needClarification=false),不阻塞润色。 check: ( projectId: string, chapterNo: number, segment: string, instruction: string, ) => Promise; reset: () => void; } // 后端 snake_case ClarifyDecision → 前端 camelCase VM(不信任外部数据,全部显式取值 + 默认)。 function toVM(data: { need_clarification?: boolean; questions?: { question?: string; options?: { label?: string; value?: string }[]; allow_free_text?: boolean; }[]; verification?: string | null; }): ClarifyDecisionVM { return { needClarification: Boolean(data.need_clarification), questions: (data.questions ?? []).map((q) => ({ question: q.question ?? "", options: (q.options ?? []).map((o) => ({ label: o.label ?? "", value: o.value ?? "", })), allowFreeText: Boolean(q.allow_free_text), })), verification: data.verification ?? undefined, }; } // AI 反问澄清预检(WFW-9 M1,路线A 两阶段之「问题」阶段)。 // 「再沟通」意见含糊/极短时先调独立非流式端点让 AI 反问;needClarification=false 或失败=放行去既有 refine。 export function useClarify(): UseClarify { const [status, setStatus] = useState("idle"); const [decision, setDecision] = useState(null); const check = useCallback( async (projectId, chapterNo, segment, instruction) => { setStatus("checking"); try { const { data, error } = await api.POST( "/projects/{project_id}/chapters/{chapter_no}/refine/clarify", { params: { path: { project_id: projectId, chapter_no: chapterNo } }, body: { segment, instruction }, }, ); if (error || !data) { setStatus("proceed"); setDecision(null); return PROCEED; } const vm = toVM(data); if (vm.needClarification && vm.questions.length > 0) { setStatus("asking"); setDecision(vm); } else { setStatus("proceed"); setDecision(null); } return vm; } catch { setStatus("proceed"); setDecision(null); return PROCEED; } }, [], ); const reset = useCallback((): void => { setStatus("idle"); setDecision(null); }, []); return { status, decision, check, reset }; }