@hugpy/video-intelligence-ui 0.1.0 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +1 -3
- package/src/config.ts +36 -0
- package/src/demo/assets/generate/cinema-cavern/movie.mp4 +0 -0
- package/src/demo/assets/generate/cinema-cavern/seg_00.mp4 +0 -0
- package/src/demo/assets/generate/clips/cat-lounge.mp4 +0 -0
- package/src/demo/assets/generate/clips/drone-city.mp4 +0 -0
- package/src/demo/assets/generate/clips/paper-sails.mp4 +0 -0
- package/src/demo/assets/generate/movie-galaxy/movie.mp4 +0 -0
- package/src/demo/assets/generate/movie-galaxy/seg_00.mp4 +0 -0
- package/src/demo/assets/generate/movie-galaxy/seg_01.mp4 +0 -0
- package/src/demo/assets/generate/movie-galaxy/seg_02.mp4 +0 -0
- package/src/demo/assets/generate/movie-galaxy/seg_03.mp4 +0 -0
- package/src/demo/assets/generate/movie-medow/movie.mp4 +0 -0
- package/src/demo/assets/generate/movie-medow/seg_00.mp4 +0 -0
- package/src/demo/assets/generate/movie-medow/seg_01.mp4 +0 -0
- package/src/demo/assets/generate/scene-desert/frame_00000.png +0 -0
- package/src/demo/assets/generate/scene-desert/frame_00001.png +0 -0
- package/src/demo/assets/generate/scene-desert/frame_00002.png +0 -0
- package/src/demo/assets/generate/scene-desert/frame_00003.png +0 -0
- package/src/demo/assets/generate/scene-desert/frame_00004.png +0 -0
- package/src/demo/assets/generate/scene-desert/frame_00005.png +0 -0
- package/src/demo/assets/generate/scene-desert/scene.mp4 +0 -0
- package/src/demo/assets/generate/scene-vintage/frame_00000.png +0 -0
- package/src/demo/assets/generate/scene-vintage/frame_00001.png +0 -0
- package/src/demo/assets/generate/scene-vintage/frame_00002.png +0 -0
- package/src/demo/assets/generate/scene-vintage/frame_00003.png +0 -0
- package/src/demo/assets/generate/scene-vintage/frame_00004.png +0 -0
- package/src/demo/assets/generate/scene-vintage/frame_00005.png +0 -0
- package/src/demo/assets/generate/scene-vintage/scene.mp4 +0 -0
- package/src/demo/assets/generate2/s0.png +0 -0
- package/src/demo/assets/generate2/s1.png +0 -0
- package/src/demo/assets/generate2/s10.png +0 -0
- package/src/demo/assets/generate2/s11.png +0 -0
- package/src/demo/assets/generate2/s12.png +0 -0
- package/src/demo/assets/generate2/s13.png +0 -0
- package/src/demo/assets/generate2/s14.png +0 -0
- package/src/demo/assets/generate2/s15.png +0 -0
- package/src/demo/assets/generate2/s16.png +0 -0
- package/src/demo/assets/generate2/s17.png +0 -0
- package/src/demo/assets/generate2/s18.png +0 -0
- package/src/demo/assets/generate2/s19.png +0 -0
- package/src/demo/assets/generate2/s2.png +0 -0
- package/src/demo/assets/generate2/s20.png +0 -0
- package/src/demo/assets/generate2/s21.mp4 +0 -0
- package/src/demo/assets/generate2/s22.mp4 +0 -0
- package/src/demo/assets/generate2/s23.mp4 +0 -0
- package/src/demo/assets/generate2/s24.mp4 +0 -0
- package/src/demo/assets/generate2/s25.mp4 +0 -0
- package/src/demo/assets/generate2/s26.mp4 +0 -0
- package/src/demo/assets/generate2/s27.mp4 +0 -0
- package/src/demo/assets/generate2/s28.mp4 +0 -0
- package/src/demo/assets/generate2/s29.mp4 +0 -0
- package/src/demo/assets/generate2/s3.png +0 -0
- package/src/demo/assets/generate2/s30.mp4 +0 -0
- package/src/demo/assets/generate2/s4.png +0 -0
- package/src/demo/assets/generate2/s5.png +0 -0
- package/src/demo/assets/generate2/s6.png +0 -0
- package/src/demo/assets/generate2/s7.png +0 -0
- package/src/demo/assets/generate2/s8.png +0 -0
- package/src/demo/assets/generate2/s9.png +0 -0
- package/src/demo/demoFetch.ts +126 -3
- package/src/demo/fixtures.ts +72 -4
- package/src/demo/promptAssist.ts +25 -0
- package/src/demo/sampleData.ts +960 -0
- package/src/demo/sampleSets.ts +172 -0
- package/src/stations/ActiveProcessesStation.tsx +18 -3
- package/src/stations/GenerateStation.tsx +1031 -364
- package/src/stations/GoalComposer.tsx +9 -1
- package/src/stations/ScriptFirstStation.tsx +1081 -0
- package/src/stations/ToksPanel.tsx +188 -0
- package/src/stations/WorkbenchDrawer.tsx +4 -3
- package/src/stations/WorkbenchSidebar.tsx +60 -12
- package/src/stations/oracle/DagPanel.tsx +391 -0
- package/src/stations/oracle/OracleStation.tsx +304 -0
- package/src/stations/oracle/SpatialTab.tsx +185 -0
- package/src/stations/oracle/StewardPanel.tsx +165 -0
- package/src/stations/oracle/oracle.css +467 -0
- package/src/stations/oracle/oracleShared.tsx +160 -0
- package/src/stations/oracle/oracleTypes.ts +304 -0
- package/src/stations/oracle/useOracle.ts +560 -0
- package/src/stations/registry.ts +37 -0
- package/src/stations/scriptFirst.css +350 -0
- package/src/stations/studio/IdentitiesStation.tsx +219 -292
- package/src/stations/studio/IdentityCreatePanel.tsx +390 -0
- package/src/stations/studio/StudioGenerateTab.tsx +162 -6
- package/src/stations/studio/StudioMovieComposer.tsx +763 -318
- package/src/stations/studio/{StudioMovieComposer.tsx.bak-sessions-20260812 → StudioMovieComposer.tsx.bak-declutter-20260813} +350 -48
- package/src/stations/studio/StudioPlane.tsx +35 -3
- package/src/stations/studio/StudioViewer.tsx +116 -14
- package/src/stations/studio/coordinationBadge.tsx +206 -0
- package/src/stations/studio/identityUpload.ts +66 -0
- package/src/stations/studio/promptCard.tsx +362 -59
- package/src/stations/studio/useIdentityCreateJob.ts +184 -0
- package/src/stations/studio/useIdentityProfiles.ts +66 -0
- package/src/stations/useScriptFirstRun.ts +596 -0
- package/src/style/app.css +176 -0
- package/src/video/LengthRow.tsx +189 -0
- package/src/video/LibraryGroups.tsx +81 -0
- package/src/video/UnnamedWarn.tsx +146 -0
- package/src/video/coordinationReport.ts +266 -0
- package/src/video/jobClock.ts +104 -0
- package/src/video/spreadAssist.ts +26 -0
- package/src/video/useMediaJobs.ts +26 -0
- package/src/video/useOperatorHistory.ts +105 -0
- package/src/video/useToks.ts +193 -0
- package/src/stations/ActiveProcessesStation.tsx.bak-sessions-20260812 +0 -228
- package/src/stations/GenerateStation.tsx.bak-tester-removal +0 -5170
- package/src/stations/studio/StudioMovieSessions.tsx.bak-sessions-20260812 +0 -417
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
// PRE-RENDERED SAMPLE SETS for the canned /video/generate demo (2026-08-13).
|
|
2
|
+
//
|
|
3
|
+
// The operator's ruling: the demo must NEVER touch a GPU or a model — every
|
|
4
|
+
// "render" is a pre-rendered sample, and the ✨ Generate prompt button hands
|
|
5
|
+
// out the REAL prompts that produced those samples, per section. Source of
|
|
6
|
+
// truth: /mnt/llm_storage/video_intel/generate-samples (each render dir now
|
|
7
|
+
// carries prompt.txt + manifest.json, reconstructed from media_jobs.db where
|
|
8
|
+
// the renders originally shipped without them). A curated ~8 MB subset is
|
|
9
|
+
// bundled here; the full set stays on the share.
|
|
10
|
+
//
|
|
11
|
+
// THE COUPLING CONTRACT (what makes the demo read as real):
|
|
12
|
+
// ✨ assist (mode "generate") → assistPrompt(section) ARMS a sample set and
|
|
13
|
+
// returns its prompt; the next enqueue for that section CONSUMES the armed
|
|
14
|
+
// set, so the media that "renders" is the media that prompt actually made.
|
|
15
|
+
// Generating without assist just round-robins the sets. Selection happens
|
|
16
|
+
// at ENQUEUE (stored on the job) so repeated polls stay stable.
|
|
17
|
+
//
|
|
18
|
+
// Honest exclusions: renders whose real prompt was operator keyboard-mash
|
|
19
|
+
// ("asdasd") keep their on-disk manifest but are not showcased in the assist
|
|
20
|
+
// bank — the demo only advertises prompts worth reading.
|
|
21
|
+
|
|
22
|
+
import type { MediaRef } from "../video/contract";
|
|
23
|
+
|
|
24
|
+
// scene: desert roads (job 187ac900…, sd-turbo, 6 frames @512)
|
|
25
|
+
import sdF0 from "./assets/generate/scene-desert/frame_00000.png";
|
|
26
|
+
import sdF1 from "./assets/generate/scene-desert/frame_00001.png";
|
|
27
|
+
import sdF2 from "./assets/generate/scene-desert/frame_00002.png";
|
|
28
|
+
import sdF3 from "./assets/generate/scene-desert/frame_00003.png";
|
|
29
|
+
import sdF4 from "./assets/generate/scene-desert/frame_00004.png";
|
|
30
|
+
import sdF5 from "./assets/generate/scene-desert/frame_00005.png";
|
|
31
|
+
import sdClip from "./assets/generate/scene-desert/scene.mp4";
|
|
32
|
+
// scene: vintage frames (job 69a7bbcf…) — render showcased, prompt not
|
|
33
|
+
import svF0 from "./assets/generate/scene-vintage/frame_00000.png";
|
|
34
|
+
import svF1 from "./assets/generate/scene-vintage/frame_00001.png";
|
|
35
|
+
import svF2 from "./assets/generate/scene-vintage/frame_00002.png";
|
|
36
|
+
import svClip from "./assets/generate/scene-vintage/scene.mp4";
|
|
37
|
+
// movie: sunny meadow (job 5ca10b84…, 2 goals) + swirling galaxy (1eed0b95…, 4 goals)
|
|
38
|
+
import mmSeg0 from "./assets/generate/movie-medow/seg_00.mp4";
|
|
39
|
+
import mmSeg1 from "./assets/generate/movie-medow/seg_01.mp4";
|
|
40
|
+
import mmMovie from "./assets/generate/movie-medow/movie.mp4";
|
|
41
|
+
import mgSeg0 from "./assets/generate/movie-galaxy/seg_00.mp4";
|
|
42
|
+
import mgSeg1 from "./assets/generate/movie-galaxy/seg_01.mp4";
|
|
43
|
+
import mgSeg2 from "./assets/generate/movie-galaxy/seg_02.mp4";
|
|
44
|
+
import mgSeg3 from "./assets/generate/movie-galaxy/seg_03.mp4";
|
|
45
|
+
import mgMovie from "./assets/generate/movie-galaxy/movie.mp4";
|
|
46
|
+
// clips (studio i2v manifests carry the prompts)
|
|
47
|
+
import clCat from "./assets/generate/clips/cat-lounge.mp4";
|
|
48
|
+
import clDrone from "./assets/generate/clips/drone-city.mp4";
|
|
49
|
+
import clSails from "./assets/generate/clips/paper-sails.mp4";
|
|
50
|
+
// cinema: dank cavern (movie.json segment prompts; seg_01 was a branch-only
|
|
51
|
+
// render, so the set is segment_00 + the assembled movie LAST)
|
|
52
|
+
import ccSeg0 from "./assets/generate/cinema-cavern/seg_00.mp4";
|
|
53
|
+
import ccMovie from "./assets/generate/cinema-cavern/movie.mp4";
|
|
54
|
+
|
|
55
|
+
function img(id: string, uri: string): MediaRef {
|
|
56
|
+
return { asset_id: id, kind: "image", uri, mime: "image/png",
|
|
57
|
+
width: 512, height: 512, duration_s: null, fps_native: null,
|
|
58
|
+
sample_rate: null, channels: null };
|
|
59
|
+
}
|
|
60
|
+
function vid(id: string, uri: string, dur = 4.0): MediaRef {
|
|
61
|
+
return { asset_id: id, kind: "video", uri, mime: "video/mp4",
|
|
62
|
+
width: 512, height: 512, duration_s: dur, fps_native: 6,
|
|
63
|
+
sample_rate: null, channels: null };
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
export type SectionKind = "image" | "scene" | "movie" | "clip" | "cinema";
|
|
67
|
+
|
|
68
|
+
export interface SampleSet {
|
|
69
|
+
title: string;
|
|
70
|
+
/** The REAL prompt(s) that produced this render (joined for the assist). */
|
|
71
|
+
prompt: string;
|
|
72
|
+
/** Contract-ordered outputs (frames first, assembled clip/movie LAST). */
|
|
73
|
+
outputs: MediaRef[];
|
|
74
|
+
/** Showcased by ✨ generate? (false = render-only; prompt was junk/empty) */
|
|
75
|
+
showcase: boolean;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
const DESERT_PROMPT =
|
|
79
|
+
"this is the first scene in view. its california and the air is crisp\n\n" +
|
|
80
|
+
"the last frame needs to be the gentlment in the left side having walked allwthe way across";
|
|
81
|
+
|
|
82
|
+
export const SAMPLE_SETS: Record<SectionKind, SampleSet[]> = {
|
|
83
|
+
image: [
|
|
84
|
+
{ title: "california crisp", prompt: "this is the first scene in view. its california and the air is crisp",
|
|
85
|
+
outputs: [img("gs-img-desert", sdF0)], showcase: true },
|
|
86
|
+
{ title: "meadow still", prompt: "a sunny green meadow with wildflowers",
|
|
87
|
+
outputs: [img("gs-img-vintage", svF0)], showcase: true },
|
|
88
|
+
],
|
|
89
|
+
scene: [
|
|
90
|
+
{ title: "desert roads", prompt: DESERT_PROMPT,
|
|
91
|
+
outputs: [img("gs-sd-0", sdF0), img("gs-sd-1", sdF1), img("gs-sd-2", sdF2),
|
|
92
|
+
img("gs-sd-3", sdF3), img("gs-sd-4", sdF4), img("gs-sd-5", sdF5),
|
|
93
|
+
vid("gs-sd-clip", sdClip)], showcase: true },
|
|
94
|
+
{ title: "vintage frames", prompt: "asdasd",
|
|
95
|
+
outputs: [img("gs-sv-0", svF0), img("gs-sv-1", svF1), img("gs-sv-2", svF2),
|
|
96
|
+
vid("gs-sv-clip", svClip)], showcase: false },
|
|
97
|
+
],
|
|
98
|
+
movie: [
|
|
99
|
+
{ title: "sunny meadow", prompt:
|
|
100
|
+
"a sunny green meadow with wildflowers\n\nthe same meadow at golden sunset, warm light",
|
|
101
|
+
outputs: [vid("gs-mm-0", mmSeg0), vid("gs-mm-1", mmSeg1),
|
|
102
|
+
vid("gs-mm-movie", mmMovie, 8.0)], showcase: true },
|
|
103
|
+
{ title: "swirling galaxy", prompt:
|
|
104
|
+
"a vast spiral galaxy in deep space, distant wide view, scattered stars\n\n" +
|
|
105
|
+
"zooming toward a glowing blue and purple nebula, cosmic dust\n\n" +
|
|
106
|
+
"a closer view of swirling cosmic gas clouds and brilliant clustered stars\n\n" +
|
|
107
|
+
"a single radiant star filling the frame, blinding light, lens flare",
|
|
108
|
+
outputs: [vid("gs-mg-0", mgSeg0), vid("gs-mg-1", mgSeg1), vid("gs-mg-2", mgSeg2),
|
|
109
|
+
vid("gs-mg-3", mgSeg3), vid("gs-mg-movie", mgMovie, 16.0)], showcase: true },
|
|
110
|
+
],
|
|
111
|
+
clip: [
|
|
112
|
+
{ title: "cat lounge", prompt: "a cat",
|
|
113
|
+
outputs: [vid("gs-cl-cat", clCat)], showcase: true },
|
|
114
|
+
{ title: "drone over city lights", prompt: "the same glowing night city, camera slowly orbiting",
|
|
115
|
+
outputs: [vid("gs-cl-drone", clDrone)], showcase: true },
|
|
116
|
+
{ title: "paper sails", prompt: "",
|
|
117
|
+
outputs: [vid("gs-cl-sails", clSails)], showcase: false },
|
|
118
|
+
],
|
|
119
|
+
cinema: [
|
|
120
|
+
{ title: "dank cavern", prompt:
|
|
121
|
+
"In a subterranean cavern bathed in the harsh midday sun, a towering structure " +
|
|
122
|
+
"dwarfs its surroundings, casting short, sharp black shadows that dance across " +
|
|
123
|
+
"the cavern's walls. The shot begins with a sweeping establishing view; as the " +
|
|
124
|
+
"camera slowly pushes in, the structure's intricate details come into focus.",
|
|
125
|
+
outputs: [vid("gs-cc-0", ccSeg0), vid("gs-cc-movie", ccMovie, 10.0)], showcase: true },
|
|
126
|
+
],
|
|
127
|
+
};
|
|
128
|
+
|
|
129
|
+
// ── the assist⇄enqueue coupling ─────────────────────────────────────────────
|
|
130
|
+
const cursors: Record<SectionKind, number> = {
|
|
131
|
+
image: 0, scene: 0, movie: 0, clip: 0, cinema: 0,
|
|
132
|
+
};
|
|
133
|
+
const armed: Partial<Record<SectionKind, SampleSet>> = {};
|
|
134
|
+
|
|
135
|
+
function showcased(kind: SectionKind): SampleSet[] {
|
|
136
|
+
const all = SAMPLE_SETS[kind];
|
|
137
|
+
const s = all.filter((x) => x.showcase);
|
|
138
|
+
return s.length ? s : all;
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
/** ✨ generate: arm the next showcased set for `kind` and return its prompt. */
|
|
142
|
+
export function assistPrompt(kind: SectionKind): string {
|
|
143
|
+
const sets = showcased(kind);
|
|
144
|
+
const set = sets[cursors[kind] % sets.length];
|
|
145
|
+
cursors[kind] = (cursors[kind] + 1) % sets.length;
|
|
146
|
+
armed[kind] = set;
|
|
147
|
+
return set.prompt;
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
let rr: Record<SectionKind, number> = { image: 0, scene: 0, movie: 0, clip: 0, cinema: 0 };
|
|
151
|
+
|
|
152
|
+
/** Enqueue-time selection: the armed set if ✨ ran, else round-robin. */
|
|
153
|
+
export function takeSet(kind: SectionKind): SampleSet {
|
|
154
|
+
const a = armed[kind];
|
|
155
|
+
if (a) { delete armed[kind]; return a; }
|
|
156
|
+
const sets = showcased(kind);
|
|
157
|
+
const set = sets[rr[kind] % sets.length];
|
|
158
|
+
rr[kind] = (rr[kind] + 1) % sets.length;
|
|
159
|
+
return set;
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
/** Map an assist/job context kind onto a sample section. */
|
|
163
|
+
export function sectionFor(kind: string): SectionKind {
|
|
164
|
+
if (kind === "image" || kind === "scene" || kind === "movie" || kind === "clip" || kind === "cinema")
|
|
165
|
+
return kind;
|
|
166
|
+
if (kind === "generate_image") return "image";
|
|
167
|
+
if (kind === "generate_scene") return "scene";
|
|
168
|
+
if (kind === "generate_movie") return "movie";
|
|
169
|
+
if (kind === "studio_i2v") return "clip";
|
|
170
|
+
if (kind === "generate_studio_movie") return "cinema";
|
|
171
|
+
return "scene";
|
|
172
|
+
}
|
|
@@ -32,11 +32,13 @@ import {
|
|
|
32
32
|
placementLine,
|
|
33
33
|
isExternal,
|
|
34
34
|
reservedGib,
|
|
35
|
-
elapsedSince,
|
|
36
35
|
progressLabel,
|
|
37
36
|
latestEvent,
|
|
38
37
|
type MediaJob,
|
|
39
38
|
} from "../video/useMediaJobs";
|
|
39
|
+
// k117 — the honest clock/stage helpers. Kept OUT of this component so the
|
|
40
|
+
// studio's Sessions sections (which reuse JobRow) get the same fix for free.
|
|
41
|
+
import { jobClockParts, jobStageLabel, terminalAtStage } from "../video/jobClock";
|
|
40
42
|
|
|
41
43
|
function PhaseChip({ job }: { job: MediaJob }) {
|
|
42
44
|
if (job.phase === "awaiting_capacity") {
|
|
@@ -129,8 +131,21 @@ export function JobRow({
|
|
|
129
131
|
</span>
|
|
130
132
|
) : null}
|
|
131
133
|
{gib ? <span>· {gib}</span> : null}
|
|
132
|
-
{
|
|
133
|
-
|
|
134
|
+
{/* k117: the stage label and the clock, told honestly. A TERMINAL row
|
|
135
|
+
says what it ENDED as (with the stage it was in as a parenthetical)
|
|
136
|
+
and shows its FROZEN duration; a live row shows time-in-stage and
|
|
137
|
+
queue-wait as separate chips. Both come from the server's lifecycle
|
|
138
|
+
fields — nothing here counts off the browser clock, which is what
|
|
139
|
+
made a 9.4s render read as "946m · archiving". */}
|
|
140
|
+
{jobStageLabel(j) ? <span>· {jobStageLabel(j)}</span> : null}
|
|
141
|
+
{terminalAtStage(j) ? (
|
|
142
|
+
<span className="vi-knob-hint" title="the stage it was in when it ended">
|
|
143
|
+
(in {terminalAtStage(j)})
|
|
144
|
+
</span>
|
|
145
|
+
) : null}
|
|
146
|
+
{jobClockParts(j).map((part) => (
|
|
147
|
+
<span key={part}>· {part}</span>
|
|
148
|
+
))}
|
|
134
149
|
</div>
|
|
135
150
|
<ProgressBar job={j} />
|
|
136
151
|
{event ? <p className="vi-job-latest">{event}</p> : null}
|