Skip to content

feat: add Episode Composer UI for continuous multi-scene video - #6233

Merged
atomantic merged 2 commits into
mainfrom
claim/issue-6228
Sep 4, 2026
Merged

feat: add Episode Composer UI for continuous multi-scene video#6233
atomantic merged 2 commits into
mainfrom
claim/issue-6228

Conversation

@atomantic

Copy link
Copy Markdown
Owner

Summary

Test plan

  • cd client && npx vitest run — full client suite green (10312 passed).
  • cd server && npx vitest run — full server suite green.
  • New tests: 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 /lint endpoint.
  • Manually reviewed with a local opencode review pass; findings addressed (stale preview race guard, queue gating during in-flight lint, async import sync, busy-gating on bible editors).

Closes #6228

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.
@atomantic
atomantic merged commit c4d7c8a into main Sep 4, 2026
7 checks passed
@atomantic
atomantic deleted the claim/issue-6228 branch September 4, 2026 09:45
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Episode Composer UI for continuous multi-scene video in MediaGen and FableLoom

1 participant