.agents/skills/bootstrap-fastvideo-private-fork/: temporary setup skill for cloninggit@github.com:hao-ai-lab/FastVideo-internal.gitatwill/rebase-nbvinto../FastVideo-internal, then runninguv sync --extra server.- Prefer the bundled script in that skill instead of inventing a new private FastVideo bootstrap flow.
Current paths:
apps/dreamverse/web/: Next.js frontend, client-side stores, websocket event reduction, prompt-window editing, devtools UI.apps/dreamverse/dreamverse/: current Python FastAPI runtime, websocket protocol, prompt enhancement, prompt rewrite orchestration, GPU worker lifecycle.apps/dreamverse/dreamverse/tests/: backend unit and integration-oriented tests.apps/dreamverse/dreamverse/benchmarks/: prompt-provider latency/token benchmarking scripts.
Planned paths during the OSS reorg:
controller/: local control plane for provider credentials, compute lifecycle, and proxying.runtime/: eventual rename ofapps/dreamverse/dreamverse/once the controller/runtime split is stable.providers/: provider adapters for local, Runpod, and Modal.
Important rule:
- Until the split lands, treat
apps/dreamverse/dreamverse/as the authoritative runtime and keep provider orchestration out ofapps/dreamverse/web.
Dreamverse is moving toward a three-part local-first architecture.
- Frontend owns local UI state, drafts, inspection tools, and user-triggered actions.
- Controller will own local-only credentials, compute provisioning, runtime lifecycle, and HTTP/websocket proxying.
- Runtime owns generation sessions, prompt rewrite, prompt safety, and websocket semantics.
The browser should only talk to the local Dreamverse process, never directly to Modal or Runpod.
The runtime in apps/dreamverse/dreamverse/ is responsible for:
- websocket session lifecycle on
/ws - queueing, GPU assignment, worker startup, and stream chunk emission
- seed prompt memory and the active prompt window used for generation
- prompt enhancement and prompt rewrite execution
- prompt safety checks
- persistence and reload of prompt system prompt files
- curated preset append/read routes in devtools mode
- health and readiness endpoints
Relevant files:
apps/dreamverse/dreamverse/main.py: websocket protocol, session state machine, REST routesapps/dreamverse/dreamverse/gpu_pool.py: FastVideo-backed generation workersapps/dreamverse/dreamverse/prompt_enhancer.py: provider clients, prompt enhancement, rewrite executionapps/dreamverse/dreamverse/rewrite_prompt_payload.py: canonical rewrite request body formatapps/dreamverse/dreamverse/config.py: prompt file paths, provider configuration, runtime flags
The frontend in apps/dreamverse/web/ is responsible for:
- collecting user input and deciding whether to send raw prompts or rewrite requests
- maintaining client-side stores for session, prompt-window, stream, rewrite, and UI state
- rendering prompt history, playback state, devtools controls, and rewrite inspection
- building the prompt-window snapshot sent with rewrite requests
- reducing websocket events into UI state
- showing compute status and controller-driven errors once the controller lands
Relevant files:
apps/dreamverse/web/src/app/page.tsx: main orchestration, websocket connect/send pathsapps/dreamverse/web/src/lib/ws/reducer.ts: applies normalized websocket events to storesapps/dreamverse/web/src/stores/promptWindow.ts: prompt window and preset/editor stateapps/dreamverse/web/src/stores/rewrite.ts: rewrite activity timeline and flagsapps/dreamverse/web/src/lib/prompts/promptWindowSnapshot.ts: rewrite snapshot normalization and padding
The future local controller should own:
- local-only provider credential loading and storage
- provider selection
- runtime provisioning, reuse, shutdown, and health checks
- proxying frontend HTTP and websocket traffic to the active runtime
- surfacing provisioning, ready, failed, and idle states to the frontend
- durable local settings that should survive ephemeral remote runtimes
The controller should not own:
- prompt rewrite logic
- seed prompt memory
- generation queue semantics
- websocket event schemas
Prompt rewrite is a shared flow with a strict ownership split.
Frontend responsibilities:
- decide when a user action should trigger
rewrite_seed_promptsinstead ofappend_prompt - send
rewrite_instructionand a snapshot of the current prompt window - pad the rewrite snapshot to the runtime-expected segment count using
buildRewritePromptWindowSnapshotFromPrompts(...) - show rewrite activity and raw LLM output in local inspection UI
Runtime responsibilities:
- validate and normalize
prompt_window_prompts - choose the rewrite system prompt and provider/model/temperature
- build the canonical LLM request body in
apps/dreamverse/dreamverse/rewrite_prompt_payload.py - run the rewrite through
PromptEnhancer.rewrite_prompt_sequence(...) - apply safety filtering to rewritten prompts
- replace the authoritative seed prompt memory when rewrite succeeds
- emit
seed_prompts_updatedandrewrite_seed_prompts_complete
Controller responsibilities:
- proxy the request and response
- surface runtime availability and provider lifecycle failures
Important rule:
- The frontend may suggest the prompt window to rewrite, but the runtime owns the actual rewritten rollout and the authoritative prompt window after acceptance.
There are two runtime rewrite modes:
- edit existing rollout: when
prompt_window_promptsis non-empty, rewrite the current rollout while preserving segment count and ordering - new rollout: when the prompt window is empty but there is a
rewrite_instruction, generate a fresh rollout
The frontend should not emulate runtime rewrite behavior locally. It should prepare the snapshot, send it, and display the result.
- Frontend owns editable drafts, selected preset UI, and prompt-window inspection state.
- Runtime owns the active seed prompt memory used for actual generation.
- After any runtime event with reason
rewrite, the frontend must replace its prompt window from the server payload instead of keeping a locally-derived version.
Prompt config editing is runtime-owned persistence with frontend-owned forms today.
- Frontend loads and edits drafts through
/prompt-system-config. - Runtime reads and writes prompt files and reloads runtime prompt config.
Curated presets follow the same pattern:
- frontend submits append requests and may update local UI optimistically from the response
- runtime persists the JSON file and resolves overlay vs fallback file paths
During the controller reorg, avoid moving durable user settings into ephemeral remote runtimes. Controller-owned local persistence is preferred for anything that must survive provider restarts.
- Do not move rewrite logic into the frontend or controller.
- Do not make the frontend the source of truth for the generated prompt window after rewrite.
- If you change websocket message types or payload fields in
apps/dreamverse/dreamverse/main.py, update the reducer inapps/dreamverse/web/src/lib/ws/reducer.tsin the same change. - If you change rewrite request shape, update both
apps/dreamverse/web/src/lib/prompts/promptWindowSnapshot.tsandapps/dreamverse/dreamverse/rewrite_prompt_payload.py. - If you add controller-managed status or error payloads, keep them separate from runtime websocket events unless there is a strong reason to merge them.
- If you change prompt file paths or devtools persistence, update
apps/dreamverse/dreamverse/, the frontend devtools UI, and any controller-owned local persistence logic together. - Keep provider adapters focused on runtime lifecycle and reachability, not on prompt or session semantics.