From b6eafbea50da2deced0500db7cca8a5c9b00bb94 Mon Sep 17 00:00:00 2001 From: alexzms <3036648523@qq.com> Date: Tue, 2 Jun 2026 05:27:30 +0000 Subject: [PATCH] [fix] dreamverse: recover steering after a blocked or failed prompt When a steering prompt is refused by the enhancer (e.g. content-policy) or enhancement fails for all providers, the backend enqueues nothing and won't re-emit prompt_sources_ blocked, leaving the UI stuck on the generating overlay. On prompt/fallback_used and session/error in steering, return to the 'describe the next scene' state, drop the failed scene from the history (steeringFailed), and surface a retry notice; clear the notice on the next submit. --- apps/dreamverse/web/src/app/page.tsx | 2 +- apps/dreamverse/web/src/lib/ws/reducer.ts | 16 ++++++++++++++++ 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/apps/dreamverse/web/src/app/page.tsx b/apps/dreamverse/web/src/app/page.tsx index 3d0fcac98..ec9ac7177 100644 --- a/apps/dreamverse/web/src/app/page.tsx +++ b/apps/dreamverse/web/src/app/page.tsx @@ -1513,7 +1513,7 @@ export default function Page() { activeClipId: shouldUseArchivedPlaybackFallback() ? streamStore.get().activeClipId : "", activePlaybackStartTime: shouldUseArchivedPlaybackFallback() ? streamStore.get().activePlaybackStartTime : 0, }); - sessionStore.patch({ livePromptDraft: "", waitingForSegmentPrompt: false }); + sessionStore.patch({ livePromptDraft: "", waitingForSegmentPrompt: false, sessionNotice: "" }); } function setLivePromptRewriteMode(enabled: boolean) { diff --git a/apps/dreamverse/web/src/lib/ws/reducer.ts b/apps/dreamverse/web/src/lib/ws/reducer.ts index 7de7689bf..efd0e9a0e 100644 --- a/apps/dreamverse/web/src/lib/ws/reducer.ts +++ b/apps/dreamverse/web/src/lib/ws/reducer.ts @@ -99,7 +99,18 @@ export async function applyNormalizedSocketEvent(event: any, context: any): Prom status: "ready_fallback", source: payload.source || "user_raw", text: payload.prompt, + // Steering: this prompt produced no segment — drop it from the scene list. + steeringFailed: true, }); + // Steering recovery: enhancement failed so the backend enqueued nothing AND won't + // re-emit prompt_sources_blocked (its drained flag is still set). Put the user back to + // "describe the next scene" ourselves so the generating overlay clears and they can retry. + if (!uiStore.get().simpleMode && sessionStore.get().manualContinuationMode) { + sessionStore.patch({ + waitingForSegmentPrompt: true, + sessionNotice: "Couldn't continue from that prompt — try rephrasing the next scene.", + }); + } console.warn("[PromptEnhanceFallback] Prompt extension failed for this request."); return; @@ -486,6 +497,11 @@ export async function applyNormalizedSocketEvent(event: any, context: any): Prom preservePlaybackOnClose: false, promptExtensionError: "", sessionNotice: errorMessage, + // Steering: a blocked/failed prompt produced no segment and the backend won't re-emit + // prompt_sources_blocked, so recover the "describe the next scene" state ourselves. + ...(!uiStore.get().simpleMode && sessionStore.get().manualContinuationMode + ? { waitingForSegmentPrompt: true } + : {}), }); rewriteStore.patch({ rewritingSeedPrompts: false,