diff --git a/frontend/src/app/api/rectification/agent/route.ts b/frontend/src/app/api/rectification/agent/route.ts index dac11234..a8ad5872 100644 --- a/frontend/src/app/api/rectification/agent/route.ts +++ b/frontend/src/app/api/rectification/agent/route.ts @@ -15,7 +15,6 @@ import { applyCollectFocusDenial, ensureNonTerminalTurnExit, persistNextInterviewIfIdle, - persistCollectSpokenAssistantIfNew, } from "@/lib/rectification-agentic/v9/answer-choice"; import { mapRectificationRpcError } from "@/lib/rectification-agentic/v9/case-service"; import { CHOICE_ACTION, STOP_ACTION } from "@/lib/rectification-agentic/v9/choice-action"; @@ -671,14 +670,12 @@ export async function POST(request: Request) { send({ type: "error", message: "生时校正暂时不可用,请稍后重试。" }); } else { if (action === "message") { - let idleHostNarration: string | null = null; try { const idle = await persistNextInterviewIfIdle({ accounting: accounting as never, userId, caseId, }); - idleHostNarration = idle.hostNarration; } catch (error) { console.warn( `[rectification-v9] persist next interview after turn failed case=${caseId} reason=${error instanceof Error ? error.name : "Unknown"}`, @@ -690,29 +687,11 @@ export async function POST(request: Request) { userId, caseId, }); - idleHostNarration = exit.hostNarration ?? idleHostNarration; } catch (error) { console.warn( `[rectification-v9] nonterminal turn exit repair failed case=${caseId} reason=${error instanceof Error ? error.name : "Unknown"}`, ); } - try { - const fallback = await persistCollectSpokenAssistantIfNew({ - accounting: accounting as never, - userId, - caseId, - requestId: crypto.randomUUID(), - answerText: result.answerText, - previousFocusId: result.previousFocusId, - alreadyEmitted: result.collectSpokenEmitted, - hostNarration: idleHostNarration, - }); - if (fallback) send({ type: "answer.delta", text: fallback }); - } catch (error) { - console.warn( - `[rectification-v9] collect spoken visibility fallback failed case=${caseId} reason=${error instanceof Error ? error.name : "Unknown"}`, - ); - } } send({ type: "done", emitted: true }); } diff --git a/frontend/src/lib/rectification-agentic/v9/agent-run.ts b/frontend/src/lib/rectification-agentic/v9/agent-run.ts index 56e5c80b..d760baf4 100644 --- a/frontend/src/lib/rectification-agentic/v9/agent-run.ts +++ b/frontend/src/lib/rectification-agentic/v9/agent-run.ts @@ -47,18 +47,6 @@ import { createStepAnswerState, flushStepAnswerOnStreamFinish, } from "./step-answer"; -import { - bindSpokenToOpenQuestion, - CHOICE_CARD_CONTINUATION_ACK, - composeRectificationTurnNarration, - openQuestionPromptFromToolResult, - publicNarrationDtoFromDossier, -} from "./turn-narration"; -import { isSafeCollectSpokenPrompt } from "./spoken-answer"; -import { - collectSpokenPromptForNewFocus, - composeCollectSpokenAssistantText, -} from "./turn-decision"; import { defaultMessageOrigin, isRectificationMessageOrigin, @@ -660,7 +648,6 @@ export async function runV9AgentTurn(options: V9AgentRunOptions): Promise | null = null; const stepAnswer = createStepAnswerState(); - let persistedPrompt: string | null = null; let spokenRaw = ""; let visibleEmitted = ""; @@ -685,31 +672,6 @@ export async function runV9AgentTurn(options: V9AgentRunOptions): Promise => { - if (collectSpokenEmitted) return; - try { - const latest = await loadV9CaseDossier(accounting, userId, caseId); - const fromFocus = collectSpokenPromptForNewFocus({ - previousFocusId, - focus: latest.conversationSummary.activeFocus, - }); - const prompt = fromFocus && isSafeCollectSpokenPrompt(fromFocus) ? fromFocus : null; - if (!prompt) return; - const { composed, delta } = composeCollectSpokenAssistantText(answerText, prompt); - if (!delta) return; - if (!answerText.trim()) { - await emitVisibleSpoken(composed); - } else { - answerText = composed; - answerDeltas.push(delta); - await emit({ type: "answer.delta", text: delta }); - } - collectSpokenEmitted = true; - } catch { - // Visibility fallback must not fail the turn. - } - }; - const publishSpokenStep = async (pieces: readonly string[], live = false) => { const joined = pieces.join(""); if (!joined) return; @@ -717,11 +679,7 @@ export async function runV9AgentTurn(options: V9AgentRunOptions): Promise { @@ -759,9 +717,6 @@ export async function runV9AgentTurn(options: V9AgentRunOptions): Promise => { - if (!persistedPrompt) { - try { - const latest = await loadV9CaseDossier(accounting, userId, caseId); - persistedPrompt = publicNarrationDtoFromDossier(latest).nextQuestion; - } catch { - // Keep whatever prompt the tool result already stamped. - } - } - if (!persistedPrompt) return false; - const bound = bindSpokenToOpenQuestion(spokenRaw || answerText, persistedPrompt); - if (bound.trim()) { - await emitVisibleSpoken(bound); - return true; - } - if (visibleEmitted.trim() && visibleEmitted !== CHOICE_CARD_CONTINUATION_ACK) { - await emitVisibleSpoken(CHOICE_CARD_CONTINUATION_ACK); - return true; - } - if (answerText.trim()) return true; - await emitVisibleSpoken(CHOICE_CARD_CONTINUATION_ACK); - return true; - }; - const discriminatorInvariant = async (): Promise<{ ok: true } | { ok: false; errorCode: string }> => { try { const latest = await loadV9CaseDossier(accounting, userId, caseId); @@ -924,20 +855,10 @@ export async function runV9AgentTurn(options: V9AgentRunOptions): Promise