@hugpy/video-intelligence-ui 0.1.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/LICENSE +41 -0
- package/assets/sampels/images/bycycle/bd8603bad35d4f179f4d1134d8faf2ee.mp4 +0 -0
- package/assets/sampels/images/bycycle/frame_00000.png +0 -0
- package/assets/sampels/images/bycycle/frame_00001.png +0 -0
- package/assets/sampels/images/bycycle/frame_00002.png +0 -0
- package/assets/sampels/images/bycycle/frame_00003.png +0 -0
- package/assets/sampels/images/bycycle/frame_00004.png +0 -0
- package/assets/sampels/images/bycycle/frame_00005.png +0 -0
- package/assets/sampels/images/forrest/ff23090611b844a6b85c224f388bd542.mp4 +0 -0
- package/assets/sampels/images/forrest/frame_00000.png +0 -0
- package/assets/sampels/images/forrest/frame_00001.png +0 -0
- package/assets/sampels/images/forrest/frame_00002.png +0 -0
- package/assets/sampels/images/forrest/frame_00003.png +0 -0
- package/assets/sampels/images/forrest/frame_00004.png +0 -0
- package/assets/sampels/images/forrest/frame_00005.png +0 -0
- package/assets/sampels/images/shenzo/e1a4fcd623084ab4a986d11c8cd00db8.mp4 +0 -0
- package/assets/sampels/images/shenzo/frame_00000.png +0 -0
- package/assets/sampels/images/shenzo/frame_00001.png +0 -0
- package/assets/sampels/images/shenzo/frame_00002.png +0 -0
- package/assets/sampels/images/shenzo/frame_00003.png +0 -0
- package/assets/sampels/images/shenzo/frame_00004.png +0 -0
- package/assets/sampels/images/shenzo/frame_00005.png +0 -0
- package/assets/sampels/scenes/man.mp4 +0 -0
- package/assets/sampels/scenes/woman.mp4 +0 -0
- package/assets/sampels/studio_movies/caverns/_assembly/contrib_00.mp4 +0 -0
- package/assets/sampels/studio_movies/caverns/movie.json +67 -0
- package/assets/sampels/studio_movies/caverns/movie.mp4 +0 -0
- package/assets/sampels/studio_movies/caverns/segment_00/5eea7770a554fef0c3bdc38f8f38b925dcf75f13c015d423e8eadec47d41bf6b/clip.mp4 +0 -0
- package/assets/sampels/studio_movies/caverns/segment_00/5eea7770a554fef0c3bdc38f8f38b925dcf75f13c015d423e8eadec47d41bf6b/manifest.json +87 -0
- package/assets/sampels/studio_movies/caverns/segment_00/5eea7770a554fef0c3bdc38f8f38b925dcf75f13c015d423e8eadec47d41bf6b/provenance.json +7 -0
- package/assets/sampels/studio_movies/caverns/segment_01/branch.png +0 -0
- package/assets/sampels/studio_movies/keeper-matrix/_assembly/concat_list.txt +2 -0
- package/assets/sampels/studio_movies/keeper-matrix/_assembly/contrib_00.mp4 +0 -0
- package/assets/sampels/studio_movies/keeper-matrix/_assembly/contrib_01.mp4 +0 -0
- package/assets/sampels/studio_movies/keeper-matrix/movie.json +81 -0
- package/assets/sampels/studio_movies/keeper-matrix/movie.mp4 +0 -0
- package/assets/sampels/studio_movies/keeper-matrix/segment_00/64854c6a21d47ce10b23e884e12de448b25bfb0a375d33238dd0bec8056c076d/clip.mp4 +0 -0
- package/assets/sampels/studio_movies/keeper-matrix/segment_00/64854c6a21d47ce10b23e884e12de448b25bfb0a375d33238dd0bec8056c076d/manifest.json +87 -0
- package/assets/sampels/studio_movies/keeper-matrix/segment_00/64854c6a21d47ce10b23e884e12de448b25bfb0a375d33238dd0bec8056c076d/provenance.json +7 -0
- package/assets/sampels/studio_movies/keeper-matrix/segment_01/branch.png +0 -0
- package/assets/sampels/studio_movies/keeper-matrix/segment_01/cc926b44a42b90d7d291a4e50e3859458306c207a17c718086a3466e4049d6c6/clip.mp4 +0 -0
- package/assets/sampels/studio_movies/keeper-matrix/segment_01/cc926b44a42b90d7d291a4e50e3859458306c207a17c718086a3466e4049d6c6/manifest.json +87 -0
- package/assets/sampels/studio_movies/keeper-matrix/segment_01/cc926b44a42b90d7d291a4e50e3859458306c207a17c718086a3466e4049d6c6/provenance.json +7 -0
- package/assets/sampels/videos/a_red_paper_boat_drifting_on_a_calm_pond__gentle_ripples__mo_a62d6c28.mp4 +0 -0
- package/assets/sampels/videos/aurora.mp4 +0 -0
- package/assets/sampels/videos/dark_night.mp4 +0 -0
- package/assets/sampels/videos/fire_and_soul.mp4 +0 -0
- package/assets/sampels/videos/harsh_seas.mp4 +0 -0
- package/entry.tsx +74 -0
- package/index.html +53 -0
- package/package.json +42 -0
- package/src/assets/hugpy-mark.png +0 -0
- package/src/config.ts +676 -0
- package/src/demo/DemoBanner.tsx +54 -0
- package/src/demo/assets/demo-audio.mp3 +0 -0
- package/src/demo/assets/demo-clip.mp4 +0 -0
- package/src/demo/assets/demo-crop.mp4 +0 -0
- package/src/demo/assets/demo-poster.jpg +0 -0
- package/src/demo/assets/frame-1.jpg +0 -0
- package/src/demo/assets/frame-2.jpg +0 -0
- package/src/demo/assets/frame-3.jpg +0 -0
- package/src/demo/assets/frame-4.jpg +0 -0
- package/src/demo/assets/frame-5.jpg +0 -0
- package/src/demo/assets/frame-6.jpg +0 -0
- package/src/demo/assets/gen-1.jpg +0 -0
- package/src/demo/assets/gen-2.jpg +0 -0
- package/src/demo/assets.d.ts +14 -0
- package/src/demo/demo.css +64 -0
- package/src/demo/demoFetch.ts +305 -0
- package/src/demo/fixtures.ts +814 -0
- package/src/demo/index.ts +43 -0
- package/src/demo/mode.ts +81 -0
- package/src/demo/promptAssist.ts +181 -0
- package/src/demo/seed.ts +97 -0
- package/src/nav/BrandMark.css +66 -0
- package/src/nav/BrandMark.tsx +40 -0
- package/src/nav/Navbar.css +13 -0
- package/src/nav/Navbar.tsx +68 -0
- package/src/regions/SpatialRegionEditor.tsx +375 -0
- package/src/regions/TemporalRegionEditor.tsx +485 -0
- package/src/regions/types.ts +85 -0
- package/src/session.ts +85 -0
- package/src/share.ts +77 -0
- package/src/stations/ActivePanel.tsx +55 -0
- package/src/stations/ActiveProcessesStation.tsx +272 -0
- package/src/stations/ActiveProcessesStation.tsx.bak-sessions-20260812 +228 -0
- package/src/stations/AddFileBar.tsx +59 -0
- package/src/stations/AudioCropStation.tsx +157 -0
- package/src/stations/ComfyPanel.tsx +210 -0
- package/src/stations/ComfyStation.tsx +196 -0
- package/src/stations/CondensedKnobStrip.tsx +245 -0
- package/src/stations/ConsolePanel.tsx +82 -0
- package/src/stations/FrameExtractStation.tsx +148 -0
- package/src/stations/GenIdentityBar.tsx +412 -0
- package/src/stations/GenerateStation.tsx +5603 -0
- package/src/stations/GenerateStation.tsx.bak-tester-removal +5170 -0
- package/src/stations/GoalComposer.tsx +139 -0
- package/src/stations/ImageCropStation.tsx +153 -0
- package/src/stations/KnobInfo.tsx +64 -0
- package/src/stations/PlaceholderStation.tsx +26 -0
- package/src/stations/SectionTabs.tsx +276 -0
- package/src/stations/SharePanel.tsx +298 -0
- package/src/stations/SidebarRegistry.tsx +105 -0
- package/src/stations/StationShell.tsx +96 -0
- package/src/stations/StudioClipsStation.tsx +28 -0
- package/src/stations/WorkbenchDrawer.tsx +66 -0
- package/src/stations/WorkbenchSidebar.tsx +1224 -0
- package/src/stations/WorkbenchStation.tsx +91 -0
- package/src/stations/comfyEmbed.ts +79 -0
- package/src/stations/drawerShell.tsx +419 -0
- package/src/stations/ops/AudioCropCore.tsx +218 -0
- package/src/stations/ops/CharacterGroupsPanel.tsx +716 -0
- package/src/stations/ops/FrameExtractCore.tsx +695 -0
- package/src/stations/ops/ImageCropCore.tsx +164 -0
- package/src/stations/ops/VideoCropCore.tsx +193 -0
- package/src/stations/ops/useVideoCropJobs.ts +224 -0
- package/src/stations/pollCaps.ts +87 -0
- package/src/stations/registry.ts +191 -0
- package/src/stations/studio/AngleRingEditor.tsx +159 -0
- package/src/stations/studio/IdentitiesStation.tsx +2455 -0
- package/src/stations/studio/IdentityProfileControls.tsx +262 -0
- package/src/stations/studio/StudioActiveProcesses.tsx +224 -0
- package/src/stations/studio/StudioAssistLogPanel.tsx +220 -0
- package/src/stations/studio/StudioGenerateMode.tsx +29 -0
- package/src/stations/studio/StudioGenerateTab.tsx +2688 -0
- package/src/stations/studio/StudioItemCard.tsx +334 -0
- package/src/stations/studio/StudioLibraryTab.tsx +506 -0
- package/src/stations/studio/StudioMovieComposer.tsx +2875 -0
- package/src/stations/studio/StudioMovieComposer.tsx.bak-sessions-20260812 +2729 -0
- package/src/stations/studio/StudioMovieSessions.tsx +553 -0
- package/src/stations/studio/StudioMovieSessions.tsx.bak-sessions-20260812 +417 -0
- package/src/stations/studio/StudioPlane.tsx +302 -0
- package/src/stations/studio/StudioSplicedRow.tsx +476 -0
- package/src/stations/studio/StudioViewer.tsx +339 -0
- package/src/stations/studio/TurntableViewer.tsx +220 -0
- package/src/stations/studio/movieTimeline.ts +198 -0
- package/src/stations/studio/promptCard.tsx +498 -0
- package/src/stations/studio/studioItem.ts +87 -0
- package/src/stations/studio/studioShared.tsx +821 -0
- package/src/stations/studio/useIdentityProfiles.ts +575 -0
- package/src/stations/studio/useReconstruction.ts +283 -0
- package/src/stations/types.ts +43 -0
- package/src/stations/useAudioCropJobs.ts +202 -0
- package/src/stations/useAudioExtractJob.ts +144 -0
- package/src/stations/useCropJobs.ts +206 -0
- package/src/stations/useFrameJobs.ts +140 -0
- package/src/stations/useGenerateJob.ts +151 -0
- package/src/stations/useGenerateMovieJob.ts +177 -0
- package/src/stations/useGenerateRowJobs.ts +184 -0
- package/src/stations/useGenerateSceneJob.ts +156 -0
- package/src/stations/useGenerateSceneRowJobs.ts +282 -0
- package/src/style/app.css +4974 -0
- package/src/transport/client.ts +262 -0
- package/src/transport/telemetry.ts +97 -0
- package/src/video/DropReceptacle.tsx +122 -0
- package/src/video/PromptAssistButtons.tsx +118 -0
- package/src/video/composerBridge.ts +66 -0
- package/src/video/contract.ts +599 -0
- package/src/video/jobTracker.ts +702 -0
- package/src/video/mediaLibrary.ts +328 -0
- package/src/video/renderCompat.ts +512 -0
- package/src/video/sessionForm.ts +189 -0
- package/src/video/spreadAssist.ts +392 -0
- package/src/video/studioBridge.ts +82 -0
- package/src/video/useMediaJobs.ts +279 -0
- package/src/video/useModels.ts +413 -0
- package/src/video/useMoviePresets.ts +97 -0
- package/src/video/useMovieSessions.ts +292 -0
- package/src/video/usePresets.ts +167 -0
- package/src/video/useProjects.ts +87 -0
- package/src/video/usePromptAssist.ts +394 -0
- package/src/video/useRenderPresets.ts +221 -0
- package/src/video/useStudioAssistLog.ts +266 -0
- package/src/video/useStudioPresets.ts +128 -0
- package/src/video/useWorkerCalls.ts +165 -0
- package/tsconfig.json +17 -0
- package/vite.config.ts +33 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
hugpy — Source-Available License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 putkoff (hugpy.ai). All rights reserved.
|
|
4
|
+
|
|
5
|
+
Permission is granted, free of charge, to use this software ("hugpy") for
|
|
6
|
+
personal and non-commercial purposes, and for time-limited commercial
|
|
7
|
+
evaluation, subject to the following conditions:
|
|
8
|
+
|
|
9
|
+
1. Non-commercial use means use by an individual for personal purposes, or
|
|
10
|
+
use by a non-profit or educational institution for its own internal
|
|
11
|
+
purposes. Any use by, for, or on behalf of a for-profit business or in
|
|
12
|
+
connection with revenue-generating activity is commercial use — including
|
|
13
|
+
internal business use, use in producing goods or services, and use on
|
|
14
|
+
paid engagements.
|
|
15
|
+
|
|
16
|
+
2. Commercial use requires a commercial license from the copyright holder.
|
|
17
|
+
Exception: a business may evaluate the software internally for up to
|
|
18
|
+
thirty (30) days free of charge; continued use after that requires a
|
|
19
|
+
commercial license.
|
|
20
|
+
|
|
21
|
+
3. Redistribution of this software, in source or binary form, modified or
|
|
22
|
+
unmodified, is not permitted without prior written permission from the
|
|
23
|
+
copyright holder. Downloading the software from an official distribution
|
|
24
|
+
channel (PyPI, npm, hugpy.ai) is not redistribution.
|
|
25
|
+
|
|
26
|
+
4. Modification for personal use or internal evaluation is permitted;
|
|
27
|
+
distribution of modified versions is not.
|
|
28
|
+
|
|
29
|
+
5. This notice must be retained in all copies or substantial portions of
|
|
30
|
+
the software.
|
|
31
|
+
|
|
32
|
+
6. Any use outside these terms automatically terminates this license.
|
|
33
|
+
|
|
34
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
35
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
36
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
37
|
+
COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY ARISING
|
|
38
|
+
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
|
39
|
+
IN THE SOFTWARE.
|
|
40
|
+
|
|
41
|
+
For commercial licensing or redistribution permission: https://hugpy.ai
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
{
|
|
2
|
+
"kind": "studio_movie",
|
|
3
|
+
"drift": "still-mode splices condition each segment on ONE frame of its parent \u2014 motion is NOT carried across the splice. A joint's joint_mode='vace_extend' carries motion via VACE-extend (conditioning on the parent's trailing context_frames through the diffusers video+mask extend idiom) instead of a single still. A joint_mode='cut' is a HARD scene cut: no frame carry, the parent plays in full. With movie-level reference_images set (an identity movie) every segment renders id_lock so the subject carries across scene changes even though no pixels do \u2014 on the VACE path the references win the conditioning (an i2v branch still is accepted but unused; it governs only the parent trim).",
|
|
4
|
+
"fps": 24,
|
|
5
|
+
"width": 480,
|
|
6
|
+
"height": 480,
|
|
7
|
+
"vram_budget_gb": null,
|
|
8
|
+
"id_lock": false,
|
|
9
|
+
"reference_images": [],
|
|
10
|
+
"segments": [
|
|
11
|
+
{
|
|
12
|
+
"index": 0,
|
|
13
|
+
"segment_id": "seg_00",
|
|
14
|
+
"parent_segment_id": null,
|
|
15
|
+
"prompt": "In a subterranean cavern bathed in the harsh midday sun, a towering structure dwarfs its surroundings, casting short, sharp black shadows that dance across the cavern's walls. The cavern's natural beauty is accentuated by saturated primaries, creating an intimate and awe-inspiring mood. The shot begins with a sweeping establishing view, capturing the structure's majesty. As the camera slowly pushes in, the structure's intricate details come into focus, each element standing out against the cavern's stark, yet beautiful backdrop. The light, a hard midday sun, highlights the structure's grandeur, making it the focal point of the scene. The palette is saturated primaries, intensifying the cavern's natural colors and the structure's imposing presence. The shot starts from rest, maintaining the intimate mood as the viewer is drawn closer to the structure, experiencing its grandeur through the lens.",
|
|
16
|
+
"capability": "t2v",
|
|
17
|
+
"model_id": "wan2.1-t2v-1.3b",
|
|
18
|
+
"model_source": "movie",
|
|
19
|
+
"seed": 0,
|
|
20
|
+
"branch_frame": null,
|
|
21
|
+
"resolved_branch": null,
|
|
22
|
+
"joint_mode": "still",
|
|
23
|
+
"context_frames": 0,
|
|
24
|
+
"context_drop": 0,
|
|
25
|
+
"vram_budget_gb": 21.6,
|
|
26
|
+
"budget_source": "autofit:ae",
|
|
27
|
+
"clip_path": "/mnt/llm_storage/video_intel/studio_movies/a0a47af626bd471da3c06832f7e4f99d/segment_00/5eea7770a554fef0c3bdc38f8f38b925dcf75f13c015d423e8eadec47d41bf6b/clip.mp4",
|
|
28
|
+
"clip_uri": "/mnt/llm_storage/video_intel/studio_movies/a0a47af626bd471da3c06832f7e4f99d/segment_00/5eea7770a554fef0c3bdc38f8f38b925dcf75f13c015d423e8eadec47d41bf6b/clip.mp4",
|
|
29
|
+
"frames": 81,
|
|
30
|
+
"width": 480,
|
|
31
|
+
"height": 480,
|
|
32
|
+
"duration_s": 3.375,
|
|
33
|
+
"content_hash": "5eea7770a554fef0c3bdc38f8f38b925dcf75f13c015d423e8eadec47d41bf6b",
|
|
34
|
+
"resumed": false,
|
|
35
|
+
"status": "done"
|
|
36
|
+
},
|
|
37
|
+
{
|
|
38
|
+
"index": 1,
|
|
39
|
+
"segment_id": "seg_01",
|
|
40
|
+
"parent_segment_id": "seg_00",
|
|
41
|
+
"prompt": "In a flooded forest, a pair of exhausted hands, their skin slick with water and sweat, complete a delicate task under the unflattering, green fluorescent strip light. The cool teal and slate palette, cool and muted, highlights the hands' strained features. As the camera pulls back, revealing the hands' movements, a towering structure, bathed in harsh midday sun, casts sharp shadows across the flooded forest. The structure's intricate details stand out against the unflattering light, creating an intimate and awe-inspiring mood. The shot begins from rest, maintaining the exhausted and awe-inspiring mood as the viewer is drawn closer to the hands and the structure, experiencing their struggle and the cavern's natural beauty through the lens.",
|
|
42
|
+
"capability": "i2v",
|
|
43
|
+
"model_id": null,
|
|
44
|
+
"model_source": "capability_fallback",
|
|
45
|
+
"pinned_model_id": "wan2.1-t2v-1.3b",
|
|
46
|
+
"model_note": "movie-level pin 'wan2.1-t2v-1.3b' serves t2v, not 'i2v'; this segment resolved a capable model through the studio router instead (the pin still binds the segments it serves)",
|
|
47
|
+
"joint_mode": "still",
|
|
48
|
+
"context_frames": 0,
|
|
49
|
+
"resolved_branch": 80,
|
|
50
|
+
"vram_budget_gb": 21.6,
|
|
51
|
+
"budget_source": "autofit:ae",
|
|
52
|
+
"status": "failed",
|
|
53
|
+
"error": {
|
|
54
|
+
"code": "cancelled",
|
|
55
|
+
"message": "cancelled (render child killed after grace)"
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
],
|
|
59
|
+
"joints": [],
|
|
60
|
+
"assembly": {
|
|
61
|
+
"movie": "movie.mp4",
|
|
62
|
+
"total_frames": 81
|
|
63
|
+
},
|
|
64
|
+
"partial": true,
|
|
65
|
+
"segments_completed": 1,
|
|
66
|
+
"segments_total": 2
|
|
67
|
+
}
|
|
Binary file
|
|
Binary file
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
{
|
|
2
|
+
"adapters": [],
|
|
3
|
+
"capability": "t2v",
|
|
4
|
+
"control_image": "",
|
|
5
|
+
"control_kind": "",
|
|
6
|
+
"controls": [],
|
|
7
|
+
"determinism_class": "seeded_approx",
|
|
8
|
+
"env_snapshot": [
|
|
9
|
+
[
|
|
10
|
+
"STUDIO_ALLOW_UNPINNED",
|
|
11
|
+
"1"
|
|
12
|
+
],
|
|
13
|
+
[
|
|
14
|
+
"STUDIO_LOUDNESS_LUFS",
|
|
15
|
+
"-14.0"
|
|
16
|
+
],
|
|
17
|
+
[
|
|
18
|
+
"STUDIO_MANIFEST_ROOT",
|
|
19
|
+
"/mnt/llm_storage/video_intel/studio/manifests"
|
|
20
|
+
],
|
|
21
|
+
[
|
|
22
|
+
"STUDIO_MASTER_COLORSPACE",
|
|
23
|
+
"rec709"
|
|
24
|
+
],
|
|
25
|
+
[
|
|
26
|
+
"STUDIO_MASTER_FPS",
|
|
27
|
+
"24"
|
|
28
|
+
],
|
|
29
|
+
[
|
|
30
|
+
"STUDIO_MAX_VRAM_GB",
|
|
31
|
+
"24.0"
|
|
32
|
+
],
|
|
33
|
+
[
|
|
34
|
+
"STUDIO_OUTPUT_ROOT",
|
|
35
|
+
"/mnt/llm_storage/video_intel/studio_movies/a0a47af626bd471da3c06832f7e4f99d/segment_00"
|
|
36
|
+
],
|
|
37
|
+
[
|
|
38
|
+
"STUDIO_WEIGHTS_ROOT",
|
|
39
|
+
"/mnt/llm_storage/video_intel/studio/weights"
|
|
40
|
+
]
|
|
41
|
+
],
|
|
42
|
+
"framework": "wan",
|
|
43
|
+
"identity_ids": [],
|
|
44
|
+
"identity_view_hashes": [],
|
|
45
|
+
"model_id": "wan2.1-t2v-1.3b",
|
|
46
|
+
"negative_prompt": "deformed hands, extra fingers, extra limbs, fused faces, warped anatomy, flicker, temporal instability, morphing, blur, low resolution, jpeg artifacts, watermark, text overlay, logo, oversaturation, banding, duplicate subject, changing wardrobe, identity drift, camera shake",
|
|
47
|
+
"precision": "fp16",
|
|
48
|
+
"prompt": "In a subterranean cavern bathed in the harsh midday sun, a towering structure dwarfs its surroundings, casting short, sharp black shadows that dance across the cavern's walls. The cavern's natural beauty is accentuated by saturated primaries, creating an intimate and awe-inspiring mood. The shot begins with a sweeping establishing view, capturing the structure's majesty. As the camera slowly pushes in, the structure's intricate details come into focus, each element standing out against the cavern's stark, yet beautiful backdrop. The light, a hard midday sun, highlights the structure's grandeur, making it the focal point of the scene. The palette is saturated primaries, intensifying the cavern's natural colors and the structure's imposing presence. The shot starts from rest, maintaining the intimate mood as the viewer is drawn closer to the structure, experiencing its grandeur through the lens.",
|
|
49
|
+
"provenance": {
|
|
50
|
+
"c2pa_pending": true,
|
|
51
|
+
"created_at": "2026-08-01T12:31:02.798001+00:00",
|
|
52
|
+
"operator": "hugpy-studio",
|
|
53
|
+
"tool": "hugpy-studio"
|
|
54
|
+
},
|
|
55
|
+
"reference_images": [],
|
|
56
|
+
"render_id": "76e36675e8a04266931c69cb49b41412",
|
|
57
|
+
"requested_frames": null,
|
|
58
|
+
"resolution_ladder": [
|
|
59
|
+
[
|
|
60
|
+
480,
|
|
61
|
+
480,
|
|
62
|
+
24
|
|
63
|
+
]
|
|
64
|
+
],
|
|
65
|
+
"sampler": {
|
|
66
|
+
"cfg": 5.0,
|
|
67
|
+
"sampler": "unipc",
|
|
68
|
+
"scheduler": "flow_match",
|
|
69
|
+
"shift": 3.0,
|
|
70
|
+
"sigmas": [],
|
|
71
|
+
"steps": 32
|
|
72
|
+
},
|
|
73
|
+
"seeds": {
|
|
74
|
+
"chunk_seed_base": null,
|
|
75
|
+
"global_seed": 0,
|
|
76
|
+
"stage_seeds": [
|
|
77
|
+
[
|
|
78
|
+
"base",
|
|
79
|
+
0
|
|
80
|
+
]
|
|
81
|
+
]
|
|
82
|
+
},
|
|
83
|
+
"source_video": "",
|
|
84
|
+
"task": "t2v",
|
|
85
|
+
"vace_context_frames": [],
|
|
86
|
+
"weight_hash": null
|
|
87
|
+
}
|
|
Binary file
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
{
|
|
2
|
+
"kind": "studio_movie",
|
|
3
|
+
"drift": "still-mode splices condition each segment on ONE frame of its parent \u2014 motion is NOT carried across the splice. A joint's joint_mode='vace_extend' carries motion via VACE-extend (conditioning on the parent's trailing context_frames through the diffusers video+mask extend idiom) instead of a single still. A joint_mode='cut' is a HARD scene cut: no frame carry, the parent plays in full. With movie-level reference_images set (an identity movie) every segment renders id_lock so the subject carries across scene changes even though no pixels do \u2014 on the VACE path the references win the conditioning (an i2v branch still is accepted but unused; it governs only the parent trim).",
|
|
4
|
+
"fps": 16,
|
|
5
|
+
"width": 832,
|
|
6
|
+
"height": 480,
|
|
7
|
+
"vram_budget_gb": null,
|
|
8
|
+
"id_lock": false,
|
|
9
|
+
"reference_images": [],
|
|
10
|
+
"segments": [
|
|
11
|
+
{
|
|
12
|
+
"index": 0,
|
|
13
|
+
"segment_id": "seg_00",
|
|
14
|
+
"parent_segment_id": null,
|
|
15
|
+
"prompt": "a small wooden sailboat on a bright blue lake, gentle waves, sunny day",
|
|
16
|
+
"capability": "t2v",
|
|
17
|
+
"model_id": "wan2.1-t2v-1.3b",
|
|
18
|
+
"model_source": "auto",
|
|
19
|
+
"seed": 0,
|
|
20
|
+
"branch_frame": null,
|
|
21
|
+
"resolved_branch": null,
|
|
22
|
+
"joint_mode": "still",
|
|
23
|
+
"context_frames": 0,
|
|
24
|
+
"context_drop": 0,
|
|
25
|
+
"vram_budget_gb": 21.6,
|
|
26
|
+
"budget_source": "autofit:ae",
|
|
27
|
+
"clip_path": "/mnt/llm_storage/video_intel/studio_movies/keeper-matrix/segment_00/64854c6a21d47ce10b23e884e12de448b25bfb0a375d33238dd0bec8056c076d/clip.mp4",
|
|
28
|
+
"clip_uri": "/mnt/llm_storage/video_intel/studio_movies/keeper-matrix/segment_00/64854c6a21d47ce10b23e884e12de448b25bfb0a375d33238dd0bec8056c076d/clip.mp4",
|
|
29
|
+
"frames": 81,
|
|
30
|
+
"width": 832,
|
|
31
|
+
"height": 480,
|
|
32
|
+
"duration_s": 5.0625,
|
|
33
|
+
"content_hash": "64854c6a21d47ce10b23e884e12de448b25bfb0a375d33238dd0bec8056c076d",
|
|
34
|
+
"resumed": false,
|
|
35
|
+
"status": "done"
|
|
36
|
+
},
|
|
37
|
+
{
|
|
38
|
+
"index": 1,
|
|
39
|
+
"segment_id": "seg_01",
|
|
40
|
+
"parent_segment_id": "seg_00",
|
|
41
|
+
"prompt": "the same lake at sunset, boat sailing away",
|
|
42
|
+
"capability": "i2v",
|
|
43
|
+
"model_id": "wan2.1-i2v-14b-720p",
|
|
44
|
+
"model_source": "auto",
|
|
45
|
+
"seed": 1,
|
|
46
|
+
"branch_frame": null,
|
|
47
|
+
"resolved_branch": 80,
|
|
48
|
+
"joint_mode": "still",
|
|
49
|
+
"context_frames": 0,
|
|
50
|
+
"context_drop": 0,
|
|
51
|
+
"vram_budget_gb": 21.6,
|
|
52
|
+
"budget_source": "autofit:ae",
|
|
53
|
+
"clip_path": "/mnt/llm_storage/video_intel/studio_movies/keeper-matrix/segment_01/cc926b44a42b90d7d291a4e50e3859458306c207a17c718086a3466e4049d6c6/clip.mp4",
|
|
54
|
+
"clip_uri": "/mnt/llm_storage/video_intel/studio_movies/keeper-matrix/segment_01/cc926b44a42b90d7d291a4e50e3859458306c207a17c718086a3466e4049d6c6/clip.mp4",
|
|
55
|
+
"frames": 81,
|
|
56
|
+
"width": 832,
|
|
57
|
+
"height": 480,
|
|
58
|
+
"duration_s": 5.0625,
|
|
59
|
+
"content_hash": "cc926b44a42b90d7d291a4e50e3859458306c207a17c718086a3466e4049d6c6",
|
|
60
|
+
"resumed": false,
|
|
61
|
+
"status": "done"
|
|
62
|
+
}
|
|
63
|
+
],
|
|
64
|
+
"joints": [
|
|
65
|
+
{
|
|
66
|
+
"parent_segment_id": "seg_00",
|
|
67
|
+
"child_segment_id": "seg_01",
|
|
68
|
+
"branch_frame": 80,
|
|
69
|
+
"trim_frames": 81,
|
|
70
|
+
"mode": "still",
|
|
71
|
+
"context_frames": null
|
|
72
|
+
}
|
|
73
|
+
],
|
|
74
|
+
"assembly": {
|
|
75
|
+
"movie": "movie.mp4",
|
|
76
|
+
"total_frames": 162
|
|
77
|
+
},
|
|
78
|
+
"partial": false,
|
|
79
|
+
"segments_completed": 2,
|
|
80
|
+
"segments_total": 2
|
|
81
|
+
}
|
|
Binary file
|
|
Binary file
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
{
|
|
2
|
+
"adapters": [],
|
|
3
|
+
"capability": "t2v",
|
|
4
|
+
"control_image": "",
|
|
5
|
+
"control_kind": "",
|
|
6
|
+
"controls": [],
|
|
7
|
+
"determinism_class": "seeded_approx",
|
|
8
|
+
"env_snapshot": [
|
|
9
|
+
[
|
|
10
|
+
"STUDIO_ALLOW_UNPINNED",
|
|
11
|
+
"1"
|
|
12
|
+
],
|
|
13
|
+
[
|
|
14
|
+
"STUDIO_LOUDNESS_LUFS",
|
|
15
|
+
"-14.0"
|
|
16
|
+
],
|
|
17
|
+
[
|
|
18
|
+
"STUDIO_MANIFEST_ROOT",
|
|
19
|
+
"/mnt/llm_storage/video_intel/studio/manifests"
|
|
20
|
+
],
|
|
21
|
+
[
|
|
22
|
+
"STUDIO_MASTER_COLORSPACE",
|
|
23
|
+
"rec709"
|
|
24
|
+
],
|
|
25
|
+
[
|
|
26
|
+
"STUDIO_MASTER_FPS",
|
|
27
|
+
"16"
|
|
28
|
+
],
|
|
29
|
+
[
|
|
30
|
+
"STUDIO_MAX_VRAM_GB",
|
|
31
|
+
"24.0"
|
|
32
|
+
],
|
|
33
|
+
[
|
|
34
|
+
"STUDIO_OUTPUT_ROOT",
|
|
35
|
+
"/mnt/llm_storage/video_intel/studio_movies/keeper-matrix/segment_00"
|
|
36
|
+
],
|
|
37
|
+
[
|
|
38
|
+
"STUDIO_WEIGHTS_ROOT",
|
|
39
|
+
"/mnt/llm_storage/video_intel/studio/weights"
|
|
40
|
+
]
|
|
41
|
+
],
|
|
42
|
+
"framework": "wan",
|
|
43
|
+
"identity_ids": [],
|
|
44
|
+
"identity_view_hashes": [],
|
|
45
|
+
"model_id": "wan2.1-t2v-1.3b",
|
|
46
|
+
"negative_prompt": "",
|
|
47
|
+
"precision": "fp16",
|
|
48
|
+
"prompt": "a small wooden sailboat on a bright blue lake, gentle waves, sunny day",
|
|
49
|
+
"provenance": {
|
|
50
|
+
"c2pa_pending": true,
|
|
51
|
+
"created_at": "2026-08-01T04:39:22.027194+00:00",
|
|
52
|
+
"operator": "hugpy-studio",
|
|
53
|
+
"tool": "hugpy-studio"
|
|
54
|
+
},
|
|
55
|
+
"reference_images": [],
|
|
56
|
+
"render_id": "c3c83e4ea22d4dc5a4b384750abe8358",
|
|
57
|
+
"requested_frames": null,
|
|
58
|
+
"resolution_ladder": [
|
|
59
|
+
[
|
|
60
|
+
832,
|
|
61
|
+
480,
|
|
62
|
+
16
|
|
63
|
+
]
|
|
64
|
+
],
|
|
65
|
+
"sampler": {
|
|
66
|
+
"cfg": 5.0,
|
|
67
|
+
"sampler": "unipc",
|
|
68
|
+
"scheduler": "flow_match",
|
|
69
|
+
"shift": 3.0,
|
|
70
|
+
"sigmas": [],
|
|
71
|
+
"steps": 12
|
|
72
|
+
},
|
|
73
|
+
"seeds": {
|
|
74
|
+
"chunk_seed_base": null,
|
|
75
|
+
"global_seed": 0,
|
|
76
|
+
"stage_seeds": [
|
|
77
|
+
[
|
|
78
|
+
"base",
|
|
79
|
+
0
|
|
80
|
+
]
|
|
81
|
+
]
|
|
82
|
+
},
|
|
83
|
+
"source_video": "",
|
|
84
|
+
"task": "t2v",
|
|
85
|
+
"vace_context_frames": [],
|
|
86
|
+
"weight_hash": null
|
|
87
|
+
}
|
|
Binary file
|
|
Binary file
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
{
|
|
2
|
+
"adapters": [],
|
|
3
|
+
"capability": "i2v",
|
|
4
|
+
"control_image": "",
|
|
5
|
+
"control_kind": "",
|
|
6
|
+
"controls": [],
|
|
7
|
+
"determinism_class": "seeded_approx",
|
|
8
|
+
"env_snapshot": [
|
|
9
|
+
[
|
|
10
|
+
"STUDIO_ALLOW_UNPINNED",
|
|
11
|
+
"1"
|
|
12
|
+
],
|
|
13
|
+
[
|
|
14
|
+
"STUDIO_LOUDNESS_LUFS",
|
|
15
|
+
"-14.0"
|
|
16
|
+
],
|
|
17
|
+
[
|
|
18
|
+
"STUDIO_MANIFEST_ROOT",
|
|
19
|
+
"/mnt/llm_storage/video_intel/studio/manifests"
|
|
20
|
+
],
|
|
21
|
+
[
|
|
22
|
+
"STUDIO_MASTER_COLORSPACE",
|
|
23
|
+
"rec709"
|
|
24
|
+
],
|
|
25
|
+
[
|
|
26
|
+
"STUDIO_MASTER_FPS",
|
|
27
|
+
"16"
|
|
28
|
+
],
|
|
29
|
+
[
|
|
30
|
+
"STUDIO_MAX_VRAM_GB",
|
|
31
|
+
"24.0"
|
|
32
|
+
],
|
|
33
|
+
[
|
|
34
|
+
"STUDIO_OUTPUT_ROOT",
|
|
35
|
+
"/mnt/llm_storage/video_intel/studio_movies/keeper-matrix/segment_01"
|
|
36
|
+
],
|
|
37
|
+
[
|
|
38
|
+
"STUDIO_WEIGHTS_ROOT",
|
|
39
|
+
"/mnt/llm_storage/video_intel/studio/weights"
|
|
40
|
+
]
|
|
41
|
+
],
|
|
42
|
+
"framework": "wan",
|
|
43
|
+
"identity_ids": [],
|
|
44
|
+
"identity_view_hashes": [],
|
|
45
|
+
"model_id": "wan2.1-i2v-14b-720p",
|
|
46
|
+
"negative_prompt": "",
|
|
47
|
+
"precision": "fp8",
|
|
48
|
+
"prompt": "the same lake at sunset, boat sailing away",
|
|
49
|
+
"provenance": {
|
|
50
|
+
"c2pa_pending": true,
|
|
51
|
+
"created_at": "2026-08-01T04:42:21.379531+00:00",
|
|
52
|
+
"operator": "hugpy-studio",
|
|
53
|
+
"tool": "hugpy-studio"
|
|
54
|
+
},
|
|
55
|
+
"reference_images": [],
|
|
56
|
+
"render_id": "4718134b906a42a793e37f87af7475f0",
|
|
57
|
+
"requested_frames": null,
|
|
58
|
+
"resolution_ladder": [
|
|
59
|
+
[
|
|
60
|
+
832,
|
|
61
|
+
480,
|
|
62
|
+
16
|
|
63
|
+
]
|
|
64
|
+
],
|
|
65
|
+
"sampler": {
|
|
66
|
+
"cfg": 5.0,
|
|
67
|
+
"sampler": "unipc",
|
|
68
|
+
"scheduler": "flow_match",
|
|
69
|
+
"shift": 3.0,
|
|
70
|
+
"sigmas": [],
|
|
71
|
+
"steps": 12
|
|
72
|
+
},
|
|
73
|
+
"seeds": {
|
|
74
|
+
"chunk_seed_base": null,
|
|
75
|
+
"global_seed": 1,
|
|
76
|
+
"stage_seeds": [
|
|
77
|
+
[
|
|
78
|
+
"base",
|
|
79
|
+
1
|
|
80
|
+
]
|
|
81
|
+
]
|
|
82
|
+
},
|
|
83
|
+
"source_video": "",
|
|
84
|
+
"task": "i2v",
|
|
85
|
+
"vace_context_frames": [],
|
|
86
|
+
"weight_hash": null
|
|
87
|
+
}
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
package/entry.tsx
ADDED
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
// Standalone bootstrap for the video-intelligence arm. The dev UI links to
|
|
2
|
+
// /video; this mounts the station shell there. A BrowserRouter (basename from
|
|
3
|
+
// the Vite base) is provided because stations are routed tabs.
|
|
4
|
+
import React from "react";
|
|
5
|
+
import { createRoot } from "react-dom/client";
|
|
6
|
+
import { BrowserRouter } from "react-router-dom";
|
|
7
|
+
import { StationShell } from "./src/stations/StationShell";
|
|
8
|
+
import { hugpyConfig } from "./src/config";
|
|
9
|
+
import { startSessionMetering } from "./src/session";
|
|
10
|
+
import { initShare } from "./src/share";
|
|
11
|
+
import { installVideoDemo } from "./src/demo";
|
|
12
|
+
// Sitewide floating Help button. ONE shared framework-free DOM module mounted
|
|
13
|
+
// identically by all four surfaces (main SPA + media/video/fleet arms) — see
|
|
14
|
+
// ../ui_shared/help/helpWidget.js for why it isn't a copied React component.
|
|
15
|
+
import { mountHelpWidget } from "../ui_shared/help/helpWidget";
|
|
16
|
+
import "./src/style/app.css";
|
|
17
|
+
|
|
18
|
+
// k9: lift a `?share=<key>` share-link credential out of the URL (stash + strip)
|
|
19
|
+
// BEFORE any API call, so the very first fetch already carries it. No-op for a
|
|
20
|
+
// normal console session (no key present).
|
|
21
|
+
initShare();
|
|
22
|
+
|
|
23
|
+
// Canned demo (?demo=1): install the fetch shim + seed the library BEFORE
|
|
24
|
+
// anything below can touch the network. No-op outside demo mode.
|
|
25
|
+
installVideoDemo();
|
|
26
|
+
|
|
27
|
+
// Per-session upload lifecycle: heartbeat the server so it keeps this session's
|
|
28
|
+
// uploads, and beacon a wipe on tab close. (No-op in canned demo mode.)
|
|
29
|
+
startSessionMetering();
|
|
30
|
+
|
|
31
|
+
// Contract guard: this arm depends ENTIRELY on the current hugpy API, whose
|
|
32
|
+
// /version reports an integer `api` contract version. Fire-and-forget on boot —
|
|
33
|
+
// never block or delay rendering, and swallow any fetch/parse error.
|
|
34
|
+
const EXPECTED_API_CONTRACT = 1;
|
|
35
|
+
void (async () => {
|
|
36
|
+
try {
|
|
37
|
+
const res = await fetch(`${hugpyConfig.apiBase}/version`, {
|
|
38
|
+
credentials: hugpyConfig.withCredentials ? "include" : "same-origin",
|
|
39
|
+
});
|
|
40
|
+
if (!res.ok) return;
|
|
41
|
+
const body = (await res.json()) as { api?: unknown };
|
|
42
|
+
const api = body?.api;
|
|
43
|
+
if (api !== EXPECTED_API_CONTRACT) {
|
|
44
|
+
console.warn(
|
|
45
|
+
`hugpy API contract mismatch (got ${String(api)}, expected ${EXPECTED_API_CONTRACT})`,
|
|
46
|
+
);
|
|
47
|
+
}
|
|
48
|
+
} catch {
|
|
49
|
+
// swallow: never let the contract check disrupt boot.
|
|
50
|
+
}
|
|
51
|
+
})();
|
|
52
|
+
|
|
53
|
+
const el = document.getElementById("root");
|
|
54
|
+
if (!el) throw new Error("video-intelligence: #root not found");
|
|
55
|
+
|
|
56
|
+
// Router basename must match where the bundle is SERVED, which equals the Vite
|
|
57
|
+
// build base: "/video/" for the in-hugpy build, "/" for a standalone deploy.
|
|
58
|
+
// A mismatched basename makes React-Router render nothing → blank screen.
|
|
59
|
+
const basename = import.meta.env.BASE_URL.replace(/\/$/, "") || "/";
|
|
60
|
+
|
|
61
|
+
// Mounted outside the React tree (its own fixed-position node on <body>), so it
|
|
62
|
+
// is unaffected by station routing and by the arm's Tailwind layout.
|
|
63
|
+
mountHelpWidget({ apiBase: hugpyConfig.apiBase, surface: "studio" });
|
|
64
|
+
|
|
65
|
+
createRoot(el).render(
|
|
66
|
+
<React.StrictMode>
|
|
67
|
+
<BrowserRouter basename={basename}>
|
|
68
|
+
{/* The DemoBanner now lives INSIDE StationShell, directly beneath the nav
|
|
69
|
+
(operator directive 2026-07-21: nav + demo tag = one fixed header
|
|
70
|
+
stack), rather than floating above the whole shell. */}
|
|
71
|
+
<StationShell />
|
|
72
|
+
</BrowserRouter>
|
|
73
|
+
</React.StrictMode>,
|
|
74
|
+
);
|