feat: add Episode Composer UI for continuous multi-scene video - #6233
Merged
Conversation
Adds client/src/components/videoGen/EpisodeComposer.jsx: a multi-scene episode authoring surface surfaced in MediaGen (VideoGen page, "Episode" button) and reachable from FableLoom's story settings drawer. Users write scenes/dialogue and a bible (style/cast/location descriptors), get a live beat-by-beat preview (camera cuts, speaker tags, slot-lock descriptor reuse, per-beat lint status) via a new debounced POST /api/continuous-video/lint (compose+lint without submitting, #6226's hard-cut linter), assign camera framings for continuing beats, then queue the episode against the #6227 orchestrator and watch progress over its SSE stream. FableLoom entry point best-effort imports an episode's scene nodes as draft scenes (client/src/lib/episodeSceneImport.js) — lossy on purpose, always left user-editable, since there's no existing scene-export API to extend.
- Ignore a stale preview response if a newer edit already started a later lint request (request-generation counter). - Gate Queue episode on !previewLoading too, so editing a passing draft into a failing one can't queue against the stale old preview. - Apply a FableLoom scene import that arrives after mount — VideoGen's getLoom() fetch resolves after EpisodeComposer's initial render, so the lazy useState initializer never saw it. - Clear the FableLoom import state when the composer closes, so a later open with no loomId/episodeId doesn't inherit a stale import. - Default a new cast/location bible entry's id to '' instead of a throwaway uuid, so an untouched id field can't silently become the bible key. - Disable the Cast/Locations editors while queuing/streaming, matching the scene editor's busy-gating. - Tighten the teleplay cue-line length regex to match its 60-char guard.
4 tasks
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
client/src/components/videoGen/EpisodeComposer.jsx: a multi-scene episode authoring surface, surfaced in MediaGen (VideoGen page's new "Episode" button) and reachable from FableLoom's story settings drawer.POST /api/continuous-video/lintroute (compose+lint without submitting, reusing Deterministic video-prompt linter for continuous episode clips #6226's hard-cut linter and Continuous video orchestrator: coordinate chained episode clip generation #6227's compiler).client/src/lib/episodeSceneImport.js) — lossy on purpose, always left user-editable, since there's no existing scene-export API to extend.Test plan
cd client && npx vitest run— full client suite green (10312 passed).cd server && npx vitest run— full server suite green.EpisodeComposer.test.jsx(beat preview rendering, lint-failure display, queue gating/save-gating + SSE progress, async FableLoom-import-after-mount),episodeSceneImport.test.js, and server route tests for the new/lintendpoint.opencodereview pass; findings addressed (stale preview race guard, queue gating during in-flight lint, async import sync, busy-gating on bible editors).Closes #6228