@hypit/hypit 0.1.3 → 0.1.5
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/README.md +5 -3
- package/dist/public/caption.d.ts +206 -183
- package/dist/public/composition.d.ts +25 -3
- package/dist/public/endpoint-kit.d.ts +24 -2
- package/dist/public/generation.d.ts +5 -1
- package/dist/public/hyperframes.d.ts +19 -1
- package/dist/public/narrative.d.ts +17 -3
- package/dist/public/performance.d.ts +1590 -0
- package/dist/public/program-space.d.ts +179 -32
- package/dist/public/runtime-kit.d.ts +21 -8
- package/dist/public/sound.d.ts +822 -0
- package/dist/public/speech.d.ts +41 -0
- package/dist/public/studio-adapter.d.ts +107 -16
- package/dist/public/temporal-markup.d.ts +9 -44
- package/dist/public/temporal.d.ts +37 -28
- package/dist/public/{semantic-track.d.ts → timeline.d.ts} +62 -49
- package/examples/README.md +18 -10
- package/examples/minimal-author-package/packages/example-component/preview/preview.svml +19 -12
- package/examples/minimal-author-package/packages/example-component/src/component.ts +5 -5
- package/examples/minimal-author-package/packages/example-component/src/fragment.ts +3 -5
- package/examples/minimal-author-package/packages/example-component/src/manifest.ts +8 -10
- package/examples/minimal-author-package/packages/example-component/src/surface.ts +2 -2
- package/examples/provider-package/README.md +78 -0
- package/examples/provider-package/hypit.runtime.json +12 -0
- package/examples/provider-package/packages/provider-images/package.json +11 -0
- package/examples/provider-package/packages/provider-images/src/activation.ts +24 -0
- package/examples/provider-package/packages/provider-images/src/provider.ts +122 -0
- package/examples/provider-package/packages/provider-images/tsconfig.json +9 -0
- package/examples/semantic-composition/README.md +6 -0
- package/examples/semantic-composition/chat.svml +6 -5
- package/examples/semantic-composition/packages/chat-scene/README.md +3 -3
- package/examples/semantic-composition/packages/chat-scene/src/activation.ts +18 -21
- package/examples/semantic-composition/packages/chat-scene/src/render.ts +4 -4
- package/examples/semantic-composition/packages/performance-styles/README.md +42 -0
- package/examples/semantic-composition/packages/performance-styles/package.json +25 -0
- package/examples/semantic-composition/packages/performance-styles/src/activation.ts +57 -0
- package/examples/semantic-composition/packages/performance-styles/src/render.ts +54 -0
- package/examples/semantic-composition/packages/performance-styles/src/studio.ts +28 -0
- package/examples/semantic-composition/packages/performance-styles/tsconfig.json +18 -0
- package/examples/semantic-composition/packages/responsive-explainer/README.md +16 -9
- package/examples/semantic-composition/packages/responsive-explainer/src/activation.ts +12 -12
- package/examples/semantic-composition/packages/responsive-explainer/src/render.ts +5 -5
- package/examples/semantic-composition/packages/sound-styles/README.md +36 -0
- package/examples/semantic-composition/packages/sound-styles/package.json +25 -0
- package/examples/semantic-composition/packages/sound-styles/src/activation.ts +53 -0
- package/examples/semantic-composition/packages/sound-styles/src/render.ts +14 -0
- package/examples/semantic-composition/packages/sound-styles/tsconfig.json +18 -0
- package/package.json +35 -15
- package/packages/audio-track/README.md +20 -13
- package/packages/audio-track/package.json +1 -1
- package/packages/audio-track/src/component.ts +4 -4
- package/packages/audio-track/src/fragment.ts +6 -5
- package/packages/audio-track/src/index.ts +1 -1
- package/packages/audio-track/src/manifest.ts +17 -16
- package/packages/audio-track/src/program.ts +21 -25
- package/packages/audio-track/src/surface.ts +19 -18
- package/packages/audio-track-studio/README.md +23 -0
- package/packages/audio-track-studio/src/index.ts +33 -19
- package/packages/author-kit/README.md +1 -1
- package/packages/background-removal/README.md +4 -7
- package/packages/browser-capture/package.json +1 -1
- package/packages/build-result/README.md +69 -0
- package/packages/build-result/package.json +2 -1
- package/packages/build-result/src/decode.ts +12 -8
- package/packages/build-result/src/execution-log.ts +17 -0
- package/packages/build-result/src/file-reference.ts +42 -0
- package/packages/build-result/src/index.ts +4 -0
- package/packages/build-result/src/replace-file-windows.ts +58 -0
- package/packages/build-result/src/replace-file.ts +11 -0
- package/packages/build-result/src/store.ts +58 -14
- package/packages/build-result/src/types.ts +41 -8
- package/packages/build-result/src/writer.ts +12 -1
- package/packages/build-result-fs/README.md +23 -1
- package/packages/build-result-s3/README.md +5 -0
- package/packages/build-result-s3/src/repository.ts +23 -5
- package/packages/caption/README.md +61 -73
- package/packages/caption/package.json +3 -2
- package/packages/caption/src/activation.ts +2 -2
- package/packages/caption/src/component.ts +20 -5
- package/packages/caption/src/display.ts +3 -18
- package/packages/caption/src/fragment.ts +3 -7
- package/packages/caption/src/index.ts +6 -5
- package/packages/caption/src/manifest.ts +29 -46
- package/packages/caption/src/style.ts +24 -135
- package/packages/caption/src/surface.ts +12 -92
- package/packages/caption/src/temporalize.ts +18 -53
- package/packages/caption/src/types.ts +8 -35
- package/packages/caption/src/visibility.ts +23 -0
- package/packages/caption-fine/README.md +31 -11
- package/packages/caption-fine/package.json +4 -2
- package/packages/caption-fine/src/component.ts +3 -3
- package/packages/caption-fine/src/fragment.ts +7 -19
- package/packages/caption-fine/src/index.ts +2 -0
- package/packages/caption-fine/src/manifest.ts +27 -18
- package/packages/caption-fine/src/recipe.ts +7 -0
- package/packages/caption-fine/src/render.ts +62 -49
- package/packages/caption-fine/src/schedule.ts +39 -35
- package/packages/caption-fine/src/style.ts +10 -9
- package/packages/caption-fine/src/surface.ts +62 -35
- package/packages/caption-fine/src/types.ts +2 -0
- package/packages/caption-fine-studio/README.md +24 -2
- package/packages/caption-fine-studio/package.json +10 -3
- package/packages/caption-fine-studio/src/activation.ts +3 -3
- package/packages/caption-fine-studio/src/index.ts +61 -40
- package/packages/cli/README.md +81 -3
- package/packages/cli/package.json +1 -0
- package/packages/cli/src/arguments.ts +39 -15
- package/packages/cli/src/build-planning.ts +9 -3
- package/packages/cli/src/command.ts +7 -1
- package/packages/cli/src/commands/environment.ts +66 -27
- package/packages/cli/src/commands/execution.ts +81 -26
- package/packages/cli/src/commands/results.ts +7 -11
- package/packages/cli/src/index.ts +2 -2
- package/packages/cli/src/machine-view.ts +15 -5
- package/packages/cli/src/main.ts +38 -42
- package/packages/cli/src/observation.ts +7 -1
- package/packages/cli/src/output.ts +92 -34
- package/packages/cli/src/result-export.ts +22 -13
- package/packages/cli/src/run-file.ts +19 -8
- package/packages/cli/src/view.ts +64 -18
- package/packages/comment-sticker/README.md +3 -3
- package/packages/comment-sticker/package.json +1 -1
- package/packages/comment-sticker/src/component.ts +4 -4
- package/packages/comment-sticker/src/fragment.ts +5 -4
- package/packages/comment-sticker/src/manifest.ts +7 -6
- package/packages/comment-sticker/src/program.ts +9 -9
- package/packages/comment-sticker/src/surface.ts +6 -7
- package/packages/comment-sticker-studio/src/index.ts +2 -1
- package/packages/compiler-node/src/compiler.ts +1 -0
- package/packages/composition/README.md +21 -0
- package/packages/composition/src/audio-presentation.ts +44 -0
- package/packages/composition/src/index.ts +3 -0
- package/packages/composition/src/schema.ts +8 -3
- package/packages/composition/src/track.ts +15 -1
- package/packages/credential-store-env/README.md +1 -1
- package/packages/deck-track/README.md +3 -3
- package/packages/deck-track/package.json +1 -1
- package/packages/deck-track/src/component.ts +5 -5
- package/packages/deck-track/src/fragment.ts +6 -5
- package/packages/deck-track/src/lower.ts +12 -12
- package/packages/deck-track/src/manifest.ts +8 -7
- package/packages/deck-track/src/program.ts +13 -16
- package/packages/deck-track/src/surface.ts +9 -10
- package/packages/driver-node/src/driver.ts +41 -3
- package/packages/elevenlabs-speech/README.md +27 -0
- package/packages/{provider-xiaomi-mimo → elevenlabs-speech}/package.json +5 -8
- package/packages/elevenlabs-speech/src/activation.ts +26 -0
- package/packages/elevenlabs-speech/src/fragment.ts +11 -0
- package/packages/elevenlabs-speech/src/index.ts +111 -0
- package/packages/elevenlabs-speech/src/surface.ts +167 -0
- package/packages/endpoint-kit/README.md +24 -0
- package/packages/endpoint-kit/src/index.ts +7 -1
- package/packages/estimate/README.md +56 -3
- package/packages/estimate/src/program.ts +7 -8
- package/packages/film/README.md +12 -7
- package/packages/film/package.json +1 -1
- package/packages/film/src/component.ts +4 -4
- package/packages/film/src/fragment.ts +6 -5
- package/packages/film/src/manifest.ts +11 -10
- package/packages/film/src/program.ts +5 -5
- package/packages/film/src/recipe.ts +2 -1
- package/packages/film/src/surface.ts +6 -6
- package/packages/film-studio/package.json +1 -1
- package/packages/film-studio/src/index.ts +2 -2
- package/packages/fishaudio-speech/README.md +33 -0
- package/packages/fishaudio-speech/package.json +21 -0
- package/packages/fishaudio-speech/src/activation.ts +32 -0
- package/packages/fishaudio-speech/src/fragment.ts +11 -0
- package/packages/fishaudio-speech/src/index.ts +156 -0
- package/packages/fishaudio-speech/src/surface.ts +192 -0
- package/packages/fonts-open/README.md +5 -0
- package/packages/fonts-open/package.json +5 -1
- package/packages/fonts-open/src/studio.ts +21 -0
- package/packages/generation/README.md +11 -1
- package/packages/generation/src/mapping.ts +28 -30
- package/packages/gpt-image/README.md +1 -2
- package/packages/grok-imagine/README.md +1 -2
- package/packages/hyperframes/README.md +7 -3
- package/packages/hyperframes/src/browser-program.ts +11 -2
- package/packages/hyperframes/src/document.ts +15 -2
- package/packages/interview-emoji-reveal/README.md +4 -4
- package/packages/interview-emoji-reveal/package.json +1 -1
- package/packages/interview-emoji-reveal/src/component.ts +4 -4
- package/packages/interview-emoji-reveal/src/fragment.ts +6 -5
- package/packages/interview-emoji-reveal/src/manifest.ts +9 -8
- package/packages/interview-emoji-reveal/src/program.ts +14 -14
- package/packages/interview-emoji-reveal/src/surface.ts +8 -9
- package/packages/media-execution/README.md +7 -3
- package/packages/media-execution/src/audio-presentation.ts +23 -0
- package/packages/media-execution/src/execute.ts +2 -0
- package/packages/media-pipeline/README.md +7 -3
- package/packages/media-pipeline/src/audio-plan.ts +4 -1
- package/packages/media-pipeline/src/component.ts +16 -2
- package/packages/media-pipeline/src/manifest.ts +3 -1
- package/packages/media-pipeline/src/types.ts +2 -1
- package/packages/media-track/README.md +14 -47
- package/packages/media-track/package.json +1 -1
- package/packages/media-track/preview/preview.svml +5 -5
- package/packages/media-track/src/author.ts +12 -6
- package/packages/media-track/src/component.ts +10 -16
- package/packages/media-track/src/fragment.ts +8 -7
- package/packages/media-track/src/index.ts +3 -1
- package/packages/media-track/src/lower.ts +7 -7
- package/packages/media-track/src/manifest.ts +16 -38
- package/packages/media-track/src/program.ts +62 -67
- package/packages/media-track/src/sampling.ts +6 -6
- package/packages/media-track/src/sequence.ts +8 -8
- package/packages/media-track/src/surface.ts +25 -43
- package/packages/media-track-studio/README.md +9 -0
- package/packages/media-track-studio/src/index.ts +23 -13
- package/packages/mimo-speech/README.md +1 -1
- package/packages/minimax-h3/README.md +1 -1
- package/packages/nano-banana/README.md +1 -1
- package/packages/narrative/README.md +23 -1
- package/packages/narrative/src/identity.ts +11 -0
- package/packages/narrative/src/index.ts +3 -0
- package/packages/narrative/src/schema.ts +28 -27
- package/packages/narrative/src/selection.ts +52 -0
- package/packages/narrative/src/types.ts +2 -0
- package/packages/package-loader-node/README.md +30 -0
- package/packages/package-loader-node/package.json +5 -2
- package/packages/package-loader-node/src/distribution-resolution.ts +10 -3
- package/packages/package-loader-node/src/index.ts +1 -0
- package/packages/package-loader-node/src/loader.ts +12 -15
- package/packages/package-loader-node/src/location.ts +27 -1
- package/packages/package-loader-node/src/module-scope.ts +183 -0
- package/packages/package-loader-node/src/types.ts +4 -0
- package/packages/performance/README.md +83 -0
- package/packages/performance/package.json +30 -0
- package/packages/performance/src/activation.ts +11 -0
- package/packages/performance/src/component.ts +46 -0
- package/packages/performance/src/index.ts +6 -0
- package/packages/performance/src/manifest.ts +53 -0
- package/packages/{media-track/src/performance.ts → performance/src/media.ts} +9 -10
- package/packages/performance/src/program.ts +51 -0
- package/packages/performance/src/style.ts +35 -0
- package/packages/performance/src/surface.ts +99 -0
- package/packages/performance-studio/README.md +25 -0
- package/packages/performance-studio/package.json +21 -0
- package/packages/performance-studio/src/activation.ts +6 -0
- package/packages/performance-studio/src/index.ts +84 -0
- package/packages/program-space/README.md +9 -18
- package/packages/program-space/src/activation.ts +1 -5
- package/packages/program-space/src/index.ts +2 -11
- package/packages/program-space/src/surface.ts +1 -20
- package/packages/project-context-node/README.md +20 -0
- package/packages/project-context-node/package.json +10 -0
- package/packages/project-context-node/src/index.ts +3 -0
- package/packages/{cli → project-context-node}/src/runtime-selection.ts +7 -2
- package/packages/provider-hyperframes-local/README.md +43 -15
- package/packages/provider-hyperframes-local/src/activation.ts +4 -3
- package/packages/provider-hyperframes-local/src/capture-process.ts +26 -4
- package/packages/provider-hyperframes-local/src/capture.ts +96 -26
- package/packages/provider-hyperframes-local/src/concurrency.ts +86 -0
- package/packages/provider-hyperframes-local/src/opaque-capture.ts +92 -0
- package/packages/provider-hyperframes-local/src/options.ts +2 -0
- package/packages/provider-hyperframes-local/src/program.ts +6 -3
- package/packages/provider-hyperframes-local/src/progress.ts +53 -0
- package/packages/provider-hyperframes-local/src/provider.ts +18 -5
- package/packages/provider-hyperframes-local/src/render.ts +48 -7
- package/packages/provider-hypihub/README.md +48 -17
- package/packages/provider-hypihub/package.json +2 -0
- package/packages/provider-hypihub/src/mapping.ts +31 -7
- package/packages/provider-hypihub/src/oauth.ts +6 -0
- package/packages/provider-hypihub/src/provider.ts +25 -13
- package/packages/provider-hypihub/src/routes.ts +1 -2
- package/packages/provider-hypihub/src/upload.ts +2 -0
- package/packages/provider-media-local/README.md +3 -4
- package/packages/provider-whisperx-local/README.md +57 -0
- package/packages/provider-whisperx-local/src/program.ts +1 -0
- package/packages/provider-whisperx-local/src/provider.ts +3 -0
- package/packages/ranking/README.md +8 -6
- package/packages/ranking/package.json +1 -1
- package/packages/ranking/src/component.ts +6 -6
- package/packages/ranking/src/fragment.ts +11 -7
- package/packages/ranking/src/manifest.ts +21 -14
- package/packages/ranking/src/render.ts +33 -35
- package/packages/ranking/src/schedule.ts +16 -19
- package/packages/ranking/src/surface.ts +12 -13
- package/packages/ranking-studio/README.md +29 -0
- package/packages/ranking-studio/package.json +8 -3
- package/packages/ranking-studio/src/index.ts +71 -12
- package/packages/render-hyperframes/README.md +7 -7
- package/packages/render-hyperframes/package.json +1 -1
- package/packages/render-hyperframes/src/component.ts +11 -1
- package/packages/render-hyperframes/src/fragment.ts +7 -4
- package/packages/render-hyperframes/src/manifest.ts +4 -4
- package/packages/render-hyperframes/src/surface.ts +6 -6
- package/packages/runtime/README.md +8 -1
- package/packages/runtime/src/catalog.ts +2 -0
- package/packages/runtime/src/execution.ts +15 -4
- package/packages/runtime/src/index.ts +2 -1
- package/packages/runtime/src/log.ts +51 -0
- package/packages/runtime/src/types.ts +5 -8
- package/packages/runtime-host-node/README.md +30 -0
- package/packages/runtime-host-node/package.json +1 -0
- package/packages/runtime-host-node/src/index.ts +25 -9
- package/packages/runtime-host-node/src/packages.ts +47 -50
- package/packages/runtime-kit/README.md +5 -0
- package/packages/runtime-kit/src/index.ts +3 -1
- package/packages/runtime-local/README.md +111 -4
- package/packages/runtime-local/src/config.ts +202 -56
- package/packages/runtime-local/src/control.ts +9 -1
- package/packages/runtime-local/src/executor.ts +66 -0
- package/packages/runtime-local/src/host.ts +37 -17
- package/packages/runtime-local/src/log.ts +48 -0
- package/packages/runtime-local/src/programs.ts +41 -25
- package/packages/runtime-local/src/result-writer.ts +2 -0
- package/packages/runtime-local/src/runtime.ts +10 -6
- package/packages/runtime-local/src/supervisor.ts +142 -0
- package/packages/runtime-local/src/types.ts +9 -2
- package/packages/runtime-local/src/worker-process.ts +7 -24
- package/packages/runtime-local/src/worker.ts +55 -83
- package/packages/screen-overlay/README.md +3 -3
- package/packages/screen-overlay/package.json +1 -1
- package/packages/screen-overlay/src/component.ts +3 -3
- package/packages/screen-overlay/src/fragment.ts +5 -4
- package/packages/screen-overlay/src/manifest.ts +7 -6
- package/packages/screen-overlay/src/program.ts +9 -9
- package/packages/screen-overlay/src/surface.ts +6 -7
- package/packages/script/README.md +37 -2
- package/packages/script/src/edit.ts +123 -73
- package/packages/script/src/lexical.ts +40 -6
- package/packages/script/src/manifest.ts +2 -2
- package/packages/script/src/narrative.ts +1 -0
- package/packages/script/src/parser.ts +36 -8
- package/packages/script/src/surface.ts +4 -3
- package/packages/script/src/types.ts +5 -1
- package/packages/script-studio/package.json +9 -3
- package/packages/script-studio/src/index.ts +2 -0
- package/packages/script-studio/src/projection.ts +105 -0
- package/packages/seedance/README.md +30 -1
- package/packages/seedance/src/index.ts +18 -7
- package/packages/seedance/src/surface.ts +17 -4
- package/packages/seedance-kits/README.md +10 -2
- package/packages/seedance-kits/kits/speaker-v1.svs +5 -5
- package/packages/seedream/README.md +1 -1
- package/packages/sound/README.md +81 -0
- package/packages/sound/package.json +25 -0
- package/packages/sound/src/activation.ts +11 -0
- package/packages/sound/src/component.ts +28 -0
- package/packages/sound/src/index.ts +5 -0
- package/packages/sound/src/manifest.ts +47 -0
- package/packages/sound/src/program.ts +84 -0
- package/packages/sound/src/style.ts +34 -0
- package/packages/sound/src/surface.ts +90 -0
- package/packages/sound-studio/README.md +22 -0
- package/packages/sound-studio/package.json +20 -0
- package/packages/sound-studio/src/activation.ts +6 -0
- package/packages/sound-studio/src/index.ts +74 -0
- package/packages/speech/README.md +2 -2
- package/packages/speech-alignment/src/align.ts +45 -21
- package/packages/speech-alignment/src/local.ts +8 -0
- package/packages/speech-alignment/src/locate.ts +1 -1
- package/packages/store-sqlite/README.md +7 -0
- package/packages/store-sqlite/src/store.ts +84 -83
- package/packages/studio/INSPECTOR.md +117 -0
- package/packages/studio/README.md +149 -14
- package/packages/studio/package.json +8 -7
- package/packages/studio/src/build-library.ts +99 -84
- package/packages/studio/src/companion-assembly.ts +1 -0
- package/packages/studio/src/domain.ts +1 -1
- package/packages/studio/src/fallback-companions.ts +3 -3
- package/packages/studio/src/feedback-server.ts +51 -0
- package/packages/studio/src/feedback-store.ts +66 -0
- package/packages/studio/src/feedback.ts +60 -0
- package/packages/studio/src/library-media.ts +19 -0
- package/packages/studio/src/parameter-values.ts +83 -1
- package/packages/studio/src/parameters.ts +132 -43
- package/packages/studio/src/preview/render.ts +5 -1
- package/packages/studio/src/preview/runtime-shim.ts +49 -3
- package/packages/studio/src/programme.ts +14 -30
- package/packages/studio/src/server.ts +66 -34
- package/packages/studio/src/shared.ts +24 -8
- package/packages/studio/src/snapshot.ts +21 -132
- package/packages/studio/src/studio-preflight.ts +3 -3
- package/packages/studio/src/studio-registry.ts +72 -6
- package/packages/studio/src/style.css +342 -190
- package/packages/studio/src/temporal-edit.ts +131 -0
- package/packages/studio/src/ui/artifact-name.ts +80 -0
- package/packages/studio/src/ui/artifact-preview.ts +99 -0
- package/packages/studio/src/ui/comments.ts +233 -0
- package/packages/studio/src/ui/icons.ts +10 -1
- package/packages/studio/src/ui/library.ts +373 -192
- package/packages/studio/src/ui/main.ts +291 -110
- package/packages/studio/src/ui/material-preview.ts +1 -1
- package/packages/studio/src/ui/overlay.ts +31 -26
- package/packages/studio/src/ui/scrub-preview.ts +108 -0
- package/packages/studio/src/ui/sidebar-panel.ts +31 -0
- package/packages/studio/src/ui/stage.ts +188 -9
- package/packages/studio/src/ui/timeline.ts +187 -281
- package/packages/studio/start.ts +19 -5
- package/packages/studio-adapter/README.md +151 -11
- package/packages/studio-adapter/src/index.ts +126 -14
- package/packages/temporal/README.md +6 -6
- package/packages/temporal/package.json +1 -1
- package/packages/temporal/src/component.ts +5 -6
- package/packages/temporal/src/index.ts +8 -6
- package/packages/temporal/src/location.ts +11 -11
- package/packages/temporal/src/projection.ts +19 -19
- package/packages/temporal/src/rational.ts +4 -4
- package/packages/temporal-markup/EDITING.md +183 -0
- package/packages/temporal-markup/README.md +31 -11
- package/packages/temporal-markup/package.json +1 -1
- package/packages/temporal-markup/src/index.ts +20 -25
- package/packages/temporal-markup/src/space.ts +10 -41
- package/packages/timeline/README.md +31 -0
- package/packages/{semantic-track → timeline}/package.json +1 -1
- package/packages/timeline/src/activation.ts +8 -0
- package/packages/timeline/src/component.ts +24 -0
- package/packages/timeline/src/identity.ts +60 -0
- package/packages/timeline/src/index.ts +6 -0
- package/packages/{semantic-track → timeline}/src/location.ts +20 -20
- package/packages/timeline/src/manifest.ts +39 -0
- package/packages/{semantic-track → timeline}/src/projection.ts +14 -14
- package/packages/timeline/src/types.ts +24 -0
- package/packages/timeline-author/README.md +68 -0
- package/packages/{speech-track → timeline-author}/package.json +6 -4
- package/packages/timeline-author/src/activation.ts +22 -0
- package/packages/{speech-track → timeline-author}/src/component.ts +15 -13
- package/packages/{speech-track → timeline-author}/src/fragment.ts +14 -23
- package/packages/timeline-author/src/index.ts +7 -0
- package/packages/timeline-author/src/manifest.ts +78 -0
- package/packages/timeline-author/src/program.ts +107 -0
- package/packages/timeline-author/src/surface.ts +46 -0
- package/packages/timeline-author/src/types.ts +6 -0
- package/packages/typography-track/README.md +4 -4
- package/packages/typography-track/package.json +1 -1
- package/packages/typography-track/src/component.ts +4 -4
- package/packages/typography-track/src/fragment.ts +4 -3
- package/packages/typography-track/src/manifest.ts +11 -9
- package/packages/typography-track/src/program.ts +15 -15
- package/packages/typography-track/src/surface.ts +17 -18
- package/packages/typography-track-studio/package.json +8 -3
- package/packages/typography-track-studio/src/index.ts +5 -1
- package/packages/video-cli/README.md +16 -4
- package/packages/video-cli/package.json +2 -1
- package/packages/video-cli/src/creation.ts +25 -9
- package/packages/video-cli/src/index.ts +1 -1
- package/packages/video-cli/src/studio-distribution.ts +2 -1
- package/packages/volcengine-matting/README.md +3 -3
- package/packages/whisperx/README.md +8 -1
- package/packages/workspace/src/index.ts +2 -0
- package/packages/workspace-fs-node/README.md +4 -1
- package/packages/workspace-fs-node/src/workspace.ts +3 -1
- package/services/whisperx/README.md +14 -0
- package/services/whisperx/pyproject.toml +2 -0
- package/services/whisperx/uv.lock +20 -20
- package/packages/provider-hyperframes-aws-lambda/README.md +0 -30
- package/packages/provider-hyperframes-aws-lambda/package.json +0 -30
- package/packages/provider-hyperframes-aws-lambda/src/activation.ts +0 -97
- package/packages/provider-hyperframes-aws-lambda/src/client.ts +0 -114
- package/packages/provider-hyperframes-aws-lambda/src/index.ts +0 -21
- package/packages/provider-hyperframes-aws-lambda/src/provider.ts +0 -522
- package/packages/provider-kie/README.md +0 -134
- package/packages/provider-kie/package.json +0 -43
- package/packages/provider-kie/src/activation.ts +0 -71
- package/packages/provider-kie/src/index.ts +0 -10
- package/packages/provider-kie/src/mapping.ts +0 -182
- package/packages/provider-kie/src/provider.ts +0 -657
- package/packages/provider-kie/src/routes.ts +0 -150
- package/packages/provider-xiaomi-mimo/README.md +0 -32
- package/packages/provider-xiaomi-mimo/src/activation.ts +0 -57
- package/packages/provider-xiaomi-mimo/src/index.ts +0 -5
- package/packages/provider-xiaomi-mimo/src/provider.ts +0 -214
- package/packages/runtime/src/environment.ts +0 -6
- package/packages/semantic-track/README.md +0 -21
- package/packages/semantic-track/src/activation.ts +0 -8
- package/packages/semantic-track/src/component.ts +0 -24
- package/packages/semantic-track/src/identity.ts +0 -58
- package/packages/semantic-track/src/index.ts +0 -6
- package/packages/semantic-track/src/manifest.ts +0 -38
- package/packages/semantic-track/src/types.ts +0 -26
- package/packages/speech-track/README.md +0 -51
- package/packages/speech-track/src/activation.ts +0 -19
- package/packages/speech-track/src/index.ts +0 -7
- package/packages/speech-track/src/manifest.ts +0 -73
- package/packages/speech-track/src/program.ts +0 -64
- package/packages/speech-track/src/surface.ts +0 -35
- package/packages/speech-track/src/types.ts +0 -6
- package/packages/speech-track-studio/README.md +0 -3
- package/packages/speech-track-studio/package.json +0 -14
- package/packages/speech-track-studio/src/activation.ts +0 -7
- package/packages/speech-track-studio/src/index.ts +0 -40
- /package/packages/{cli → project-context-node}/src/project-context.ts +0 -0
- /package/packages/{speech-track → timeline-author}/preview/Track.png +0 -0
package/packages/cli/src/view.ts
CHANGED
|
@@ -46,15 +46,27 @@ export type CliBuildResultView = {
|
|
|
46
46
|
readonly targets: readonly string[];
|
|
47
47
|
readonly omittedTargets?: number;
|
|
48
48
|
readonly outputs: readonly CliOutputView[];
|
|
49
|
+
readonly outputCount: number;
|
|
50
|
+
/** Available Outputs outside the selected inspection scope. */
|
|
51
|
+
readonly otherOutputCount?: number;
|
|
49
52
|
readonly omittedOutputs?: number;
|
|
50
53
|
readonly failure?: string;
|
|
51
|
-
readonly operations?: BuildResultManifest["operations"]
|
|
54
|
+
readonly operations?: readonly Pick<NonNullable<BuildResultManifest["operations"]>[number],
|
|
55
|
+
"endpoint" | "status" | "receipt" | "failure">[];
|
|
56
|
+
readonly executionLog?: BuildResultManifest["executionLog"];
|
|
52
57
|
readonly omittedOperations?: number;
|
|
53
58
|
};
|
|
54
59
|
|
|
55
60
|
export type CliBuildStatusView = {
|
|
56
61
|
readonly id: string;
|
|
57
62
|
readonly title?: string;
|
|
63
|
+
readonly targets?: readonly string[];
|
|
64
|
+
readonly failure?: string;
|
|
65
|
+
readonly commands?: readonly {
|
|
66
|
+
readonly id?: string;
|
|
67
|
+
readonly endpoint: string;
|
|
68
|
+
readonly progress: NonNullable<BuildView["commands"]>[number]["progress"];
|
|
69
|
+
}[];
|
|
58
70
|
readonly work: {
|
|
59
71
|
readonly state: "unknown" | "submitting" | "working" | "done";
|
|
60
72
|
readonly outcome?: "complete" | "failed" | "cancelled";
|
|
@@ -68,6 +80,7 @@ export type CliBuildStatusView = {
|
|
|
68
80
|
};
|
|
69
81
|
readonly attention?: { readonly message: string; readonly action?: string };
|
|
70
82
|
readonly operations?: readonly {
|
|
83
|
+
readonly count?: number;
|
|
71
84
|
readonly id?: string;
|
|
72
85
|
readonly receipt?: { readonly id: string; readonly url?: string };
|
|
73
86
|
readonly endpoint: string;
|
|
@@ -127,8 +140,8 @@ function orderedOutputNames(manifest: BuildResultManifest): readonly string[] {
|
|
|
127
140
|
const highlighted = new Set(manifest.highlightedOutputs ?? []);
|
|
128
141
|
const targets = new Set(manifest.targets);
|
|
129
142
|
return names.sort((left, right) => {
|
|
130
|
-
const leftRank =
|
|
131
|
-
const rightRank =
|
|
143
|
+
const leftRank = targets.has(left) ? 0 : highlighted.has(left) ? 1 : 2;
|
|
144
|
+
const rightRank = targets.has(right) ? 0 : highlighted.has(right) ? 1 : 2;
|
|
132
145
|
return leftRank - rightRank || left.localeCompare(right);
|
|
133
146
|
});
|
|
134
147
|
}
|
|
@@ -146,7 +159,6 @@ export function buildStatusView(options: {
|
|
|
146
159
|
readonly result?: BuildResultManifest;
|
|
147
160
|
readonly resultReadError?: string;
|
|
148
161
|
readonly verbose?: boolean;
|
|
149
|
-
readonly operationLimit?: number;
|
|
150
162
|
}): CliBuildStatusView {
|
|
151
163
|
const resultState = options.resultReadError !== undefined
|
|
152
164
|
? "unavailable" as const
|
|
@@ -154,6 +166,15 @@ export function buildStatusView(options: {
|
|
|
154
166
|
const issue = options.runtime?.issue;
|
|
155
167
|
return {
|
|
156
168
|
id: options.id,
|
|
169
|
+
...((options.runtime?.targets ?? options.result?.targets) === undefined ? {} : {
|
|
170
|
+
targets: options.runtime?.targets ?? options.result!.targets,
|
|
171
|
+
}),
|
|
172
|
+
...((options.result?.failure ?? options.runtime?.stop?.reason) === undefined ? {} : {
|
|
173
|
+
failure: options.result?.failure ?? options.runtime!.stop!.reason,
|
|
174
|
+
}),
|
|
175
|
+
...(options.runtime?.commands?.length ? { commands: options.runtime.commands.map((command) => ({
|
|
176
|
+
...(options.verbose ? { id: command.id } : {}), endpoint: command.endpoint, progress: command.progress,
|
|
177
|
+
})) } : {}),
|
|
157
178
|
...(options.result?.title === undefined ? {} : { title: options.result.title }),
|
|
158
179
|
work: {
|
|
159
180
|
state: workState(options.runtime, options.result),
|
|
@@ -176,13 +197,12 @@ export function buildStatusView(options: {
|
|
|
176
197
|
}
|
|
177
198
|
: { message: options.resultReadError! },
|
|
178
199
|
}),
|
|
179
|
-
...(
|
|
180
|
-
operations: (options.runtime?.operations ?? options.result?.operations ?? [])
|
|
200
|
+
...((options.runtime?.operations ?? options.result?.operations ?? []).some((item) => item.status !== "completed") ? {
|
|
201
|
+
operations: groupOperationViews((options.runtime?.operations ?? options.result?.operations ?? [])
|
|
181
202
|
.filter((item) => item.status !== "completed")
|
|
182
|
-
.slice(0, options.operationLimit ?? 20)
|
|
183
203
|
.map((item) => ({
|
|
184
|
-
...("operation" in item ? { id: item.operation } : item.id === undefined ? {} : { id: item.id }),
|
|
185
|
-
...(item.receipt === undefined ? {} : { receipt: item.receipt }),
|
|
204
|
+
...(!options.verbose ? {} : "operation" in item ? { id: item.operation } : item.id === undefined ? {} : { id: item.id }),
|
|
205
|
+
...(item.receipt === undefined || (!options.verbose && item.failure === undefined) ? {} : { receipt: item.receipt }),
|
|
186
206
|
endpoint: item.endpoint,
|
|
187
207
|
state: item.status,
|
|
188
208
|
...(item.progress === undefined ? {} : { progress: item.progress }),
|
|
@@ -190,23 +210,43 @@ export function buildStatusView(options: {
|
|
|
190
210
|
code: item.failure.code,
|
|
191
211
|
message: item.failure.message,
|
|
192
212
|
} }),
|
|
193
|
-
})),
|
|
194
|
-
}),
|
|
213
|
+
})), options.verbose === true),
|
|
214
|
+
} : {}),
|
|
195
215
|
};
|
|
196
216
|
}
|
|
197
217
|
|
|
218
|
+
function groupOperationViews(
|
|
219
|
+
operations: NonNullable<CliBuildStatusView["operations"]>,
|
|
220
|
+
verbose: boolean,
|
|
221
|
+
): NonNullable<CliBuildStatusView["operations"]> {
|
|
222
|
+
if (verbose) return operations;
|
|
223
|
+
const groups = new Map<string, { view: typeof operations[number]; count: number }>();
|
|
224
|
+
for (const operation of operations) {
|
|
225
|
+
const key = JSON.stringify(operation);
|
|
226
|
+
const existing = groups.get(key);
|
|
227
|
+
if (existing !== undefined) existing.count += 1;
|
|
228
|
+
else groups.set(key, { view: operation, count: 1 });
|
|
229
|
+
}
|
|
230
|
+
return [...groups.values()].map(({ view, count }) => count === 1 ? view : { ...view, count });
|
|
231
|
+
}
|
|
232
|
+
|
|
198
233
|
export async function buildResultView(
|
|
199
234
|
repository: BuildResultRepository,
|
|
200
235
|
manifest: BuildResultManifest,
|
|
201
|
-
options: { readonly projectRoot: string; readonly output?: string; readonly limit: number },
|
|
236
|
+
options: { readonly projectRoot: string; readonly output?: string; readonly limit: number; readonly verbose?: boolean },
|
|
202
237
|
): Promise<CliBuildResultView> {
|
|
203
238
|
if (options.output !== undefined && manifest.outputs[options.output] === undefined) {
|
|
204
239
|
throw new Error(`Build Result ${manifest.id} has no public Output ${options.output}`);
|
|
205
240
|
}
|
|
206
|
-
const
|
|
207
|
-
const
|
|
241
|
+
const available = orderedOutputNames(manifest);
|
|
242
|
+
const allNames = options.output !== undefined ? [options.output] : options.verbose ? available
|
|
243
|
+
: available.filter((name) => manifest.targets.includes(name) || manifest.highlightedOutputs?.includes(name));
|
|
244
|
+
const selected = options.verbose ? allNames.slice(0, options.limit) : allNames;
|
|
208
245
|
const outputs = await Promise.all(selected.map(async (name) =>
|
|
209
246
|
await outputView(repository, manifest, name)));
|
|
247
|
+
const operations = options.verbose ? manifest.operations ?? []
|
|
248
|
+
: (manifest.operations ?? []).filter((item) => item.failure !== undefined);
|
|
249
|
+
const selectedOperations = options.verbose ? operations.slice(0, options.limit) : operations;
|
|
210
250
|
return {
|
|
211
251
|
id: manifest.id,
|
|
212
252
|
...(manifest.title === undefined ? {} : { title: manifest.title }),
|
|
@@ -217,12 +257,18 @@ export async function buildResultView(
|
|
|
217
257
|
source: projectPath(manifest.source.path, options.projectRoot),
|
|
218
258
|
...(manifest.run === undefined ? {} : { run: projectPath(manifest.run.path, options.projectRoot) }),
|
|
219
259
|
targetCount: manifest.targets.length,
|
|
220
|
-
targets: manifest.targets
|
|
221
|
-
|
|
260
|
+
targets: manifest.targets,
|
|
261
|
+
outputCount: available.length,
|
|
222
262
|
outputs,
|
|
263
|
+
...(available.length === allNames.length ? {} : { otherOutputCount: available.length - allNames.length }),
|
|
223
264
|
...(selected.length === allNames.length ? {} : { omittedOutputs: allNames.length - selected.length }),
|
|
224
265
|
...(manifest.failure === undefined ? {} : { failure: manifest.failure }),
|
|
225
|
-
...(manifest.
|
|
226
|
-
...(
|
|
266
|
+
...(manifest.executionLog === undefined ? {} : { executionLog: manifest.executionLog }),
|
|
267
|
+
...(selectedOperations.length === 0 ? {} : { operations: selectedOperations.map((item) => options.verbose ? item : ({
|
|
268
|
+
endpoint: item.endpoint, status: item.status,
|
|
269
|
+
...(item.receipt === undefined ? {} : { receipt: item.receipt }),
|
|
270
|
+
...(item.failure === undefined ? {} : { failure: item.failure }),
|
|
271
|
+
})) }),
|
|
272
|
+
...(selectedOperations.length === operations.length ? {} : { omittedOperations: operations.length - selectedOperations.length }),
|
|
227
273
|
};
|
|
228
274
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
# `@hypit/comment-sticker`
|
|
2
2
|
|
|
3
|
-
The Track Surface accepts `
|
|
4
|
-
|
|
3
|
+
The Track Surface accepts `timeline={program.timeline}`. The same Timeline supports authored
|
|
4
|
+
positions and, where prepared Takes supply evidence, Script Selections and Moments. Shared `at`
|
|
5
5
|
inputs accept a Moment or a time such as `2s`; `at` with `for` produces a Window where required.
|
|
6
6
|
|
|
7
7
|
An author package for timed social-comment cards. It publishes an ordinary `VisualTrack` containing
|
|
@@ -21,7 +21,7 @@ The author surface keeps the three independent concerns visible:
|
|
|
21
21
|
|
|
22
22
|
<comment:Style id="social-comment" recipe={styles.comment} font={fonts.ui}/>
|
|
23
23
|
|
|
24
|
-
<comment:Track id="comments" canvas={video.canvas}
|
|
24
|
+
<comment:Track id="comments" canvas={video.canvas} timeline={speech.timeline}>
|
|
25
25
|
<comment:Sticker
|
|
26
26
|
id="opening-comment"
|
|
27
27
|
comment={comment-copy}
|
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
"@hypit/narrative": "workspace:*",
|
|
16
16
|
"@hypit/protocol": "workspace:*",
|
|
17
17
|
"@hypit/program-space": "workspace:*",
|
|
18
|
-
"@hypit/
|
|
18
|
+
"@hypit/timeline": "workspace:*",
|
|
19
19
|
"@hypit/spatial": "workspace:*",
|
|
20
20
|
"@hypit/svs": "workspace:*",
|
|
21
21
|
"@hypit/temporal": "workspace:*",
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
+
import type { Timeline } from "@hypit/timeline";
|
|
1
2
|
import type { ComponentPackage, ProducerHandlerContext } from "@hypit/component-kit";
|
|
2
3
|
import { canonicalize } from "@hypit/protocol";
|
|
3
4
|
import type { BlobRef, StoredValue } from "@hypit/protocol";
|
|
4
|
-
import type { ProgramSpace } from "@hypit/program-space";
|
|
5
5
|
import type { CanvasSpace, SpatialFrame } from "@hypit/spatial";
|
|
6
6
|
import type { Text } from "@hypit/text";
|
|
7
7
|
|
|
@@ -28,7 +28,7 @@ function common(inputs: Record<string, { readonly value: StoredValue } | undefin
|
|
|
28
28
|
return {
|
|
29
29
|
set: inline<CommentStickerSet>(inputs.set?.value, "CommentStickerSet"),
|
|
30
30
|
header: inline<CommentStickerHeader>(inputs.header?.value, "CommentStickerHeader"),
|
|
31
|
-
|
|
31
|
+
timeline: inline<Timeline>(inputs.timeline?.value, "Timeline"),
|
|
32
32
|
frame: inline<SpatialFrame>(inputs.frame?.value, "SpatialFrame"),
|
|
33
33
|
style: inline<CommentStickerStyle>(inputs.style?.value, "CommentStickerStyle"),
|
|
34
34
|
spec: inline<CommentStickerItemSpec>(inputs.spec?.value, "CommentStickerItemSpec"),
|
|
@@ -69,7 +69,7 @@ export const commentStickerComponent = {
|
|
|
69
69
|
handler: ({ inputs }: ProducerHandlerContext) => {
|
|
70
70
|
const values = common(inputs);
|
|
71
71
|
return { outputs: { set: output(appendProjectedCommentSticker(
|
|
72
|
-
values.set, values.header, values.
|
|
72
|
+
values.set, values.header, values.timeline, values.frame, values.style, values.spec, values.content, values.window,
|
|
73
73
|
avatar ? inline<BlobRef>(inputs.avatar?.value, "Comment Sticker avatar") : undefined,
|
|
74
74
|
)) }, needs: {} };
|
|
75
75
|
},
|
|
@@ -85,7 +85,7 @@ export const commentStickerComponent = {
|
|
|
85
85
|
producer: commentStickerProducers.render,
|
|
86
86
|
handler: ({ inputs }) => ({ outputs: { track: output(renderCommentSticker(
|
|
87
87
|
inline<CanvasSpace>(inputs.canvas?.value, "CanvasSpace"),
|
|
88
|
-
inline<
|
|
88
|
+
inline<Timeline>(inputs.timeline?.value, "Timeline"),
|
|
89
89
|
inline<CommentStickerProgram>(inputs.program?.value, "CommentStickerProgram"),
|
|
90
90
|
)) }, needs: {} }),
|
|
91
91
|
},
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { timelineTypes } from "@hypit/timeline";
|
|
2
|
+
|
|
2
3
|
import { artifactTypes } from "@hypit/artifact";
|
|
3
4
|
import { compositionTypes } from "@hypit/composition";
|
|
4
5
|
import { sealGraphFragment } from "@hypit/elaborator";
|
|
@@ -82,7 +83,7 @@ export function createCommentStickerFragment(items: readonly CommentStickerFragm
|
|
|
82
83
|
inputs: {
|
|
83
84
|
set: operation(current),
|
|
84
85
|
header: input("header"),
|
|
85
|
-
|
|
86
|
+
timeline: input("timeline"),
|
|
86
87
|
frame: input(item.frameName),
|
|
87
88
|
style: input(item.styleName),
|
|
88
89
|
window: input(item.windowName),
|
|
@@ -104,7 +105,7 @@ export function createCommentStickerFragment(items: readonly CommentStickerFragm
|
|
|
104
105
|
{
|
|
105
106
|
id: "comment:track",
|
|
106
107
|
producer: commentStickerProducers.render,
|
|
107
|
-
inputs: { canvas: input("canvas"),
|
|
108
|
+
inputs: { canvas: input("canvas"), timeline: input("timeline"), program: operation("comment:program") },
|
|
108
109
|
result: { kind: "output", name: "track" },
|
|
109
110
|
},
|
|
110
111
|
);
|
|
@@ -112,7 +113,7 @@ export function createCommentStickerFragment(items: readonly CommentStickerFragm
|
|
|
112
113
|
inputs: [
|
|
113
114
|
{ name: "canvas", type: spatialTypes.canvas },
|
|
114
115
|
{ name: "header", type: commentStickerTypes.header },
|
|
115
|
-
{ name: "
|
|
116
|
+
{ name: "timeline", type: timelineTypes.track },
|
|
116
117
|
...[...types].map(([inputName, type]) => ({ name: inputName, type })),
|
|
117
118
|
],
|
|
118
119
|
operations,
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { timelineTypes } from "@hypit/timeline";
|
|
1
2
|
import { temporalContextAttributeVocabulary } from "@hypit/temporal-markup";
|
|
2
3
|
import { readFile } from "node:fs/promises";
|
|
3
4
|
|
|
@@ -5,9 +6,9 @@ import { artifactDependency, artifactTypes } from "@hypit/artifact";
|
|
|
5
6
|
import { compositionDependency, compositionTypes } from "@hypit/composition";
|
|
6
7
|
import { fontArtifactSchema, mediaDependency, mediaTypes } from "@hypit/media";
|
|
7
8
|
import { narrativeDependency } from "@hypit/narrative";
|
|
8
|
-
|
|
9
|
+
|
|
9
10
|
import type { ModuleManifest, ProducerRef, TypeRef, ValueSchema } from "@hypit/protocol";
|
|
10
|
-
import {
|
|
11
|
+
import { timelineDependency } from "@hypit/timeline";
|
|
11
12
|
import { spatialDependency, spatialFrameSchema, spatialTypes } from "@hypit/spatial";
|
|
12
13
|
import { svsRecipeType } from "@hypit/svs";
|
|
13
14
|
import { temporalDependency, temporalTypes } from "@hypit/temporal";
|
|
@@ -134,7 +135,7 @@ export const commentStickerProgramSchema: ValueSchema = object({
|
|
|
134
135
|
});
|
|
135
136
|
const appendInputs = [
|
|
136
137
|
{ name: "set", type: commentStickerTypes.set }, { name: "header", type: commentStickerTypes.header },
|
|
137
|
-
{ name: "
|
|
138
|
+
{ name: "timeline", type: timelineTypes.track },
|
|
138
139
|
{ name: "frame", type: spatialTypes.frame }, { name: "style", type: commentStickerTypes.style },
|
|
139
140
|
{ name: "spec", type: commentStickerTypes.itemSpec },
|
|
140
141
|
{ name: "content", type: commentStickerTypes.content }, { name: "window", type: temporalTypes.window },
|
|
@@ -311,7 +312,7 @@ export const commentStickerMarkupSurfaces = [
|
|
|
311
312
|
summary: "That Program rendered as one VisualTrack." },
|
|
312
313
|
],
|
|
313
314
|
example: `
|
|
314
|
-
<comment:Track id="comments" canvas={vertical}
|
|
315
|
+
<comment:Track id="comments" canvas={vertical} timeline={speech.timeline}>
|
|
315
316
|
<comment:Sticker id="one" frame={comment-frame} style={social} avatar={viewer-avatar}
|
|
316
317
|
author="@viewer" meta="Featured" during={story.selection.reaction}>
|
|
317
318
|
Wait, it pinned the caption to the word, not the second.
|
|
@@ -334,7 +335,7 @@ export const commentStickerManifest: ModuleManifest = {
|
|
|
334
335
|
format: "hypit.module@1",
|
|
335
336
|
name: commentStickerModuleRef.name,
|
|
336
337
|
version: commentStickerModuleRef.version,
|
|
337
|
-
dependencies: [artifactDependency, narrativeDependency,
|
|
338
|
+
dependencies: [artifactDependency, narrativeDependency, timelineDependency, spatialDependency, temporalDependency, mediaDependency, compositionDependency, textDependency],
|
|
338
339
|
types: [
|
|
339
340
|
{ name: commentStickerTypes.header.name },
|
|
340
341
|
{ name: commentStickerTypes.style.name },
|
|
@@ -366,7 +367,7 @@ export const commentStickerManifest: ModuleManifest = {
|
|
|
366
367
|
needs: [],
|
|
367
368
|
})),
|
|
368
369
|
{ name: commentStickerProducers.finalize.name, inputs: [{ name: "set", type: commentStickerTypes.set }, { name: "header", type: commentStickerTypes.header }], outputs: [{ name: "program", type: commentStickerTypes.program }], needs: [] },
|
|
369
|
-
{ name: commentStickerProducers.render.name, inputs: [{ name: "canvas", type: spatialTypes.canvas }, { name: "
|
|
370
|
+
{ name: commentStickerProducers.render.name, inputs: [{ name: "canvas", type: spatialTypes.canvas }, { name: "timeline", type: timelineTypes.track }, { name: "program", type: commentStickerTypes.program }], outputs: [{ name: "track", type: compositionTypes.visualTrack }], needs: [] },
|
|
370
371
|
],
|
|
371
372
|
};
|
|
372
373
|
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { Timeline } from "@hypit/timeline";
|
|
1
2
|
import {
|
|
2
3
|
assertVisualTrackIdentity,
|
|
3
4
|
sealVisualTrack,
|
|
@@ -12,7 +13,6 @@ import type {
|
|
|
12
13
|
} from "@hypit/composition";
|
|
13
14
|
import { assertFontArtifactRef } from "@hypit/media";
|
|
14
15
|
import { assertProgramSpaceIdentity } from "@hypit/program-space";
|
|
15
|
-
import type { ProgramSpace } from "@hypit/program-space";
|
|
16
16
|
import { canonicalize, isResourceId } from "@hypit/protocol";
|
|
17
17
|
import type { BlobRef } from "@hypit/protocol";
|
|
18
18
|
import { assertCanvasSpace, assertSpatialFrame } from "@hypit/spatial";
|
|
@@ -195,7 +195,7 @@ export function assertCommentStickerSet(value: CommentStickerSet): void {
|
|
|
195
195
|
function realized(
|
|
196
196
|
set: CommentStickerSet,
|
|
197
197
|
header: CommentStickerHeader,
|
|
198
|
-
|
|
198
|
+
timeline: Timeline,
|
|
199
199
|
frame: SpatialFrame,
|
|
200
200
|
style: CommentStickerStyle,
|
|
201
201
|
spec: CommentStickerItemSpec,
|
|
@@ -229,7 +229,7 @@ function realized(
|
|
|
229
229
|
export function appendProjectedCommentSticker(
|
|
230
230
|
set: CommentStickerSet,
|
|
231
231
|
header: CommentStickerHeader,
|
|
232
|
-
|
|
232
|
+
timeline: Timeline,
|
|
233
233
|
frame: SpatialFrame,
|
|
234
234
|
style: CommentStickerStyle,
|
|
235
235
|
spec: CommentStickerItemSpec,
|
|
@@ -237,8 +237,8 @@ export function appendProjectedCommentSticker(
|
|
|
237
237
|
window: ProjectedWindow,
|
|
238
238
|
avatar?: BlobRef,
|
|
239
239
|
): CommentStickerSet {
|
|
240
|
-
assertTemporalWindowFor(window, { subjectId: spec.id, space });
|
|
241
|
-
return realized(set, header,
|
|
240
|
+
assertTemporalWindowFor(window, { subjectId: spec.id, space: timeline });
|
|
241
|
+
return realized(set, header, timeline, frame, style, spec, content, window, avatar);
|
|
242
242
|
}
|
|
243
243
|
|
|
244
244
|
export function assertCommentStickerProgram(value: CommentStickerProgram): void {
|
|
@@ -589,12 +589,12 @@ function stickerElements(item: CommentStickerItemProgram): readonly VisualElemen
|
|
|
589
589
|
return elements;
|
|
590
590
|
}
|
|
591
591
|
|
|
592
|
-
export function renderCommentSticker(canvas: CanvasSpace,
|
|
592
|
+
export function renderCommentSticker(canvas: CanvasSpace, timeline: Timeline, program: CommentStickerProgram): VisualTrack {
|
|
593
593
|
assertCanvasSpace(canvas);
|
|
594
|
-
assertProgramSpaceIdentity(
|
|
594
|
+
assertProgramSpaceIdentity(timeline);
|
|
595
595
|
assertCommentStickerProgram(program);
|
|
596
596
|
const track = sealVisualTrack({
|
|
597
|
-
programSpaceId:
|
|
597
|
+
programSpaceId: timeline.id,
|
|
598
598
|
visualIr: "hypit.visual-ir@1",
|
|
599
599
|
id: program.id,
|
|
600
600
|
presents: program.items.map((item) => ({
|
|
@@ -605,6 +605,6 @@ export function renderCommentSticker(canvas: CanvasSpace, space: ProgramSpace, p
|
|
|
605
605
|
elements: stickerElements(item),
|
|
606
606
|
})),
|
|
607
607
|
});
|
|
608
|
-
assertVisualTrackIdentity(track,
|
|
608
|
+
assertVisualTrackIdentity(track, timeline);
|
|
609
609
|
return track;
|
|
610
610
|
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { resolveTemporalContext } from "@hypit/temporal-markup";
|
|
2
2
|
import { artifactTypes } from "@hypit/artifact";
|
|
3
3
|
import { mediaTypes } from "@hypit/media";
|
|
4
4
|
import type { FontStackRef } from "@hypit/media";
|
|
@@ -88,11 +88,10 @@ export const decodeCommentStickerStyleSurface: StructuredSurfaceHandler = ({ ele
|
|
|
88
88
|
};
|
|
89
89
|
|
|
90
90
|
export const decodeCommentStickerTrackSurface: StructuredSurfaceHandler = ({ element, resolveReference }) => {
|
|
91
|
-
allowed(element, ["id", "canvas", "
|
|
91
|
+
allowed(element, ["id", "canvas", "timeline"], ["id", "canvas", "timeline"]);
|
|
92
92
|
const id = text(element, "id");
|
|
93
93
|
const canvas = reference(element.attributes.canvas, `${element.name}.canvas`, spatialTypes.canvas, resolveReference);
|
|
94
94
|
const context = resolveTemporalContext({ element, resolveReference });
|
|
95
|
-
const time = createTemporalSpace({ id: id, element, ...context });
|
|
96
95
|
const headerId = `${id}.__header`;
|
|
97
96
|
const records: SurfaceRecordDraft[] = [{
|
|
98
97
|
id: headerId,
|
|
@@ -100,9 +99,9 @@ export const decodeCommentStickerTrackSurface: StructuredSurfaceHandler = ({ ele
|
|
|
100
99
|
value: { kind: "inline", value: sealCommentStickerHeader({ id }) },
|
|
101
100
|
range: element.range,
|
|
102
101
|
}];
|
|
103
|
-
const temporalComponents: SurfaceComponentDraft[] = [
|
|
104
|
-
const temporalFragments: ReturnType<typeof createTemporalWindowProjection>["fragments"][number][] = [
|
|
105
|
-
const inputs: Record<string, typeof canvas.ref> = { canvas: canvas.ref, header: { kind: "record", id: headerId },
|
|
102
|
+
const temporalComponents: SurfaceComponentDraft[] = [];
|
|
103
|
+
const temporalFragments: ReturnType<typeof createTemporalWindowProjection>["fragments"][number][] = [];
|
|
104
|
+
const inputs: Record<string, typeof canvas.ref> = { canvas: canvas.ref, header: { kind: "record", id: headerId }, timeline: context.timeline.ref };
|
|
106
105
|
const items: Parameters<typeof createCommentStickerFragment>[0][number][] = [];
|
|
107
106
|
for (const child of element.children) {
|
|
108
107
|
if (child.kind === "text") {
|
|
@@ -113,7 +112,7 @@ export const decodeCommentStickerTrackSurface: StructuredSurfaceHandler = ({ ele
|
|
|
113
112
|
if (child.children.some((node) => node.kind === "element")) throw new Error(`${child.name} accepts plain comment text only.`);
|
|
114
113
|
allowed(child, ["id", "comment", "frame", "style", "avatar", "author", "header", "meta", ...TIMING], ["id", "frame", "style"]);
|
|
115
114
|
const itemId = text(child, "id");
|
|
116
|
-
const temporal = createTemporalWindowProjection({ id: itemId, element: child, ...context,
|
|
115
|
+
const temporal = createTemporalWindowProjection({ id: itemId, element: child, ...context, resolveReference });
|
|
117
116
|
records.push(...temporal.records); temporalComponents.push(...temporal.components); temporalFragments.push(...temporal.fragments);
|
|
118
117
|
const suffix = String(items.length + 1).padStart(4, "0");
|
|
119
118
|
const frame = reference(child.attributes.frame, `${child.name}.frame`, spatialTypes.frame, resolveReference);
|
|
@@ -117,12 +117,13 @@ export const commentStickerStudioTrackCompanions: readonly StudioTrackCompanion[
|
|
|
117
117
|
inspector: [
|
|
118
118
|
...frameParameters.filter(({ writable }) => writable === true).map(({ name }) => ({
|
|
119
119
|
binding: `frame.${name}`, label: title(name), domain: "where" as const,
|
|
120
|
-
page: { id: "frame", label: "Frame" }, section: { id: "frame", label: "Frame" }, control: "
|
|
120
|
+
page: { id: "frame", label: "Frame" }, section: { id: "frame", label: "Frame" }, control: "number" as const, number: { suffixes: ["%", "px"], step: 1 },
|
|
121
121
|
})),
|
|
122
122
|
...commentInspector,
|
|
123
123
|
...["comment", "author", "header", "meta"].map((binding) => ({
|
|
124
124
|
binding, label: title(binding), domain: "how" as const,
|
|
125
125
|
page: { id: "copy", label: "Copy" }, section: { id: "copy", label: "Copy" }, control: "text" as const,
|
|
126
|
+
...(binding === "comment" ? { multiline: true } : {}),
|
|
126
127
|
})),
|
|
127
128
|
],
|
|
128
129
|
requiredValues: ["program"], project: projectComments,
|
|
@@ -51,6 +51,7 @@ export function mergeAttachments(groups: readonly (readonly ArtifactAttachment[]
|
|
|
51
51
|
merged.set(key, {
|
|
52
52
|
artifact: { ...item.artifact },
|
|
53
53
|
open: item.open,
|
|
54
|
+
...(item.location === undefined ? {} : { location: item.location }),
|
|
54
55
|
});
|
|
55
56
|
}
|
|
56
57
|
return [...merged.values()]
|
|
@@ -51,3 +51,24 @@ A Composition carries its id, Canvas with clear color, and peer Tracks. The Trac
|
|
|
51
51
|
ProgramSpace identity; assembly and rendering receive the corresponding time domain separately.
|
|
52
52
|
`@hypit/film` is one author-facing way to assemble it;
|
|
53
53
|
`@hypit/render-hyperframes` consumes it to produce a video.
|
|
54
|
+
|
|
55
|
+
### Visibility without a new playback origin
|
|
56
|
+
|
|
57
|
+
A VisualPresent may supply `visibility`, an ordered list of non-overlapping subranges in program
|
|
58
|
+
frames, all inside its `span`. Omission means the full span; an empty list means never visible.
|
|
59
|
+
`span` continues to define local animation and media-sampling time. This permits rule overrides or
|
|
60
|
+
other partial visibility without cutting a program into restarted copies. HyperFrames applies the
|
|
61
|
+
visibility independently when seeking; custom HTML and typed media keep their original clocks.
|
|
62
|
+
|
|
63
|
+
## Audio presentation on the program clock
|
|
64
|
+
|
|
65
|
+
AudioClip optionally carries `gainEnvelope: { sample, gain }[]` and
|
|
66
|
+
`audibility: { startSample, endSampleExclusive }[]`. Both use absolute 48 kHz program samples.
|
|
67
|
+
Envelope points have strictly increasing sample positions and interpolate linearly, holding the
|
|
68
|
+
outer endpoint gains. They multiply the existing Clip gain and fades. Audible subranges are ordered,
|
|
69
|
+
disjoint and inside the original target; omission means the whole target, an empty list means silence.
|
|
70
|
+
`audioEnvelopeGainAt` evaluates the envelope; `assertAudioPresentation` checks these values.
|
|
71
|
+
|
|
72
|
+
Original target and source sampling remain intact when presentation is partially hidden. Range
|
|
73
|
+
rendering applies envelopes and masks before cropping. These fields express generic sound behavior;
|
|
74
|
+
source selection and Style/Use precedence belong to author components such as Sound.
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/** Gain and audibility are measured on the complete 48 kHz program clock. */
|
|
2
|
+
export type AudioSampleSpan = { readonly startSample: number; readonly endSampleExclusive: number };
|
|
3
|
+
export type AudioGainPoint = { readonly sample: number; readonly gain: number };
|
|
4
|
+
export type AudioPresentation = {
|
|
5
|
+
/** Linear interpolation; hold the first/last gain outside the supplied points. */
|
|
6
|
+
readonly gainEnvelope?: readonly AudioGainPoint[];
|
|
7
|
+
/** Half-open audible regions; omission means the complete target, [] means silence. */
|
|
8
|
+
readonly audibility?: readonly AudioSampleSpan[];
|
|
9
|
+
};
|
|
10
|
+
|
|
11
|
+
export function assertAudioPresentation(value: AudioPresentation, target: AudioSampleSpan,
|
|
12
|
+
totalSamples = Number.MAX_SAFE_INTEGER): void {
|
|
13
|
+
if (value.gainEnvelope !== undefined) {
|
|
14
|
+
if (!Array.isArray(value.gainEnvelope) || value.gainEnvelope.length === 0) throw new Error("Audio gain envelope needs points.");
|
|
15
|
+
let previous = -1;
|
|
16
|
+
for (const point of value.gainEnvelope) {
|
|
17
|
+
if (!Number.isSafeInteger(point.sample) || point.sample <= previous || point.sample > totalSamples
|
|
18
|
+
|| !Number.isFinite(point.gain) || point.gain < 0 || point.gain > 64) throw new Error("Audio gain envelope point is invalid.");
|
|
19
|
+
previous = point.sample;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
if (value.audibility !== undefined) {
|
|
23
|
+
if (!Array.isArray(value.audibility)) throw new Error("Audio audibility must be sample intervals.");
|
|
24
|
+
let previous = target.startSample;
|
|
25
|
+
for (const span of value.audibility) {
|
|
26
|
+
if (!Number.isSafeInteger(span.startSample) || span.startSample < previous
|
|
27
|
+
|| !Number.isSafeInteger(span.endSampleExclusive) || span.endSampleExclusive <= span.startSample
|
|
28
|
+
|| span.endSampleExclusive > target.endSampleExclusive) throw new Error("Audio audibility is outside its target or overlaps.");
|
|
29
|
+
previous = span.endSampleExclusive;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
export function audioEnvelopeGainAt(points: readonly AudioGainPoint[] | undefined, sample: number): number {
|
|
35
|
+
if (points === undefined) return 1;
|
|
36
|
+
const first = points[0];
|
|
37
|
+
if (first === undefined) throw new Error("Audio gain envelope needs points.");
|
|
38
|
+
if (sample <= first.sample) return first.gain;
|
|
39
|
+
for (let index = 1; index < points.length; index++) {
|
|
40
|
+
const left = points[index - 1]!, right = points[index]!;
|
|
41
|
+
if (sample <= right.sample) return left.gain + (right.gain - left.gain) * (sample - left.sample) / (right.sample - left.sample);
|
|
42
|
+
}
|
|
43
|
+
return points.at(-1)!.gain;
|
|
44
|
+
}
|
|
@@ -16,3 +16,6 @@ export {
|
|
|
16
16
|
export { assertAudioTrackIdentity, assertCompositionIdentity, assertVisualTrackIdentity, sealAudioTrack, sealComposition, sealVisualTrack } from "./track.js";
|
|
17
17
|
export { animatableLocalStyles } from "./track.js";
|
|
18
18
|
export type * from "./track.js";
|
|
19
|
+
|
|
20
|
+
export * from "./audio-presentation.js";
|
|
21
|
+
export { audioSampleSpanSchema, audioGainEnvelopeSchema } from "./schema.js";
|
|
@@ -170,13 +170,16 @@ export const visualSurfaceSchema: ValueSchema = object({ ...base, kind: { schema
|
|
|
170
170
|
export const visualProgramSchema: ValueSchema = object({ ...base, kind: { schema: { kind: "literal", value: "program" } }, program: { schema: object({ format: { schema: string }, payload: { schema: object({}, true) }, artifacts: { schema: { kind: "array", items: mediaBlobRef } } }) } });
|
|
171
171
|
export const visualElementSchema: ValueSchema = { kind: "oneOf", variants: [visualBoxSchema, visualMaskSchema, visualTextSchema, textFlowElement, pathTextElement, visualImageSchema, visualVideoSchema, visualSurfaceSchema, visualProgramSchema] };
|
|
172
172
|
const span = object({ startFrame: { schema: integer }, endFrameExclusive: { schema: integer } });
|
|
173
|
-
const present = object({ id: { schema: string }, span: { schema: span }, stacking: { schema: object({ order: { schema: signedInteger }, tieBreak: { schema: string } }) }, elements: { schema: { kind: "array", minItems: 1, items: visualElementSchema } } });
|
|
173
|
+
const present = object({ id: { schema: string }, subjectId: { schema: string, optional: true }, span: { schema: span }, visibility: { schema: { kind: "array", items: span }, optional: true }, stacking: { schema: object({ order: { schema: signedInteger }, tieBreak: { schema: string } }) }, elements: { schema: { kind: "array", minItems: 1, items: visualElementSchema } } });
|
|
174
174
|
export const visualTrackSchema: ValueSchema = object({ kind: { schema: { kind: "literal", value: "visual" } }, programSpaceId: { schema: string }, visualIr: { schema: { kind: "literal", value: VISUAL_IR_V1 } }, id: { schema: string }, presents: { schema: { kind: "array", items: present } } });
|
|
175
|
-
const
|
|
175
|
+
export const audioSampleSpanSchema = object({ startSample: { schema: integer }, endSampleExclusive: { schema: { kind: "number", integer: true, minimum: 1 } } });
|
|
176
|
+
export const audioGainEnvelopeSchema: ValueSchema = { kind: "array", minItems: 1, items: object({
|
|
177
|
+
sample: { schema: integer }, gain: { schema: { kind: "number", minimum: 0, maximum: 64 } },
|
|
178
|
+
}) };
|
|
176
179
|
const audioClip = object({
|
|
177
180
|
id: { schema: string },
|
|
178
181
|
artifact: { schema: audioBlobRef },
|
|
179
|
-
target: { schema:
|
|
182
|
+
target: { schema: audioSampleSpanSchema },
|
|
180
183
|
source: { schema: object({
|
|
181
184
|
sampleFrames: { schema: { kind: "number", integer: true, minimum: 1 } },
|
|
182
185
|
startSample: { schema: integer },
|
|
@@ -189,6 +192,8 @@ const audioClip = object({
|
|
|
189
192
|
gain: { schema: { kind: "number", minimum: 0, maximum: 64 } },
|
|
190
193
|
fadeInSamples: { schema: integer },
|
|
191
194
|
fadeOutSamples: { schema: integer },
|
|
195
|
+
gainEnvelope: { schema: audioGainEnvelopeSchema, optional: true },
|
|
196
|
+
audibility: { schema: { kind: "array", items: audioSampleSpanSchema }, optional: true },
|
|
192
197
|
});
|
|
193
198
|
export const audioTrackSchema: ValueSchema = object({ kind: { schema: { kind: "literal", value: "audio" } }, programSpaceId: { schema: string }, id: { schema: string }, clips: { schema: { kind: "array", items: audioClip } } });
|
|
194
199
|
export const compositionSchema: ValueSchema = object({ id: { schema: string }, canvas: { schema: object({ width: { schema: integer }, height: { schema: integer }, clearColor: { schema: string } }) }, tracks: { schema: { kind: "array", items: { kind: "oneOf", variants: [visualTrackSchema, audioTrackSchema] } } } });
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import { assertAudioPresentation } from "./audio-presentation.js";
|
|
2
|
+
import type { AudioPresentation } from "./audio-presentation.js";
|
|
1
3
|
import { canonicalStringify, isResourceId } from "@hypit/protocol";
|
|
2
4
|
import type { BlobRef, CanonicalValue } from "@hypit/protocol";
|
|
3
5
|
|
|
@@ -361,6 +363,8 @@ export type VisualPresent = {
|
|
|
361
363
|
/** Optional domain entity implemented by this renderer Present. */
|
|
362
364
|
readonly subjectId?: string;
|
|
363
365
|
readonly span: FrameSpan;
|
|
366
|
+
/** Optional visible subranges in program frames; span remains the animation and sampling origin. */
|
|
367
|
+
readonly visibility?: readonly FrameSpan[];
|
|
364
368
|
/** Absolute paint position for this Present, not for its authoring Track. */
|
|
365
369
|
readonly stacking: {
|
|
366
370
|
readonly order: number;
|
|
@@ -380,7 +384,7 @@ export type VisualTrack = {
|
|
|
380
384
|
readonly presents: readonly VisualPresent[];
|
|
381
385
|
};
|
|
382
386
|
|
|
383
|
-
export type AudioClip = {
|
|
387
|
+
export type AudioClip = AudioPresentation & {
|
|
384
388
|
readonly id: string;
|
|
385
389
|
/** Optional domain entity implemented by this renderer Clip. */
|
|
386
390
|
readonly subjectId?: string;
|
|
@@ -935,6 +939,12 @@ function assertPresent(present: VisualPresent, programSpace: ProgramSpace | unde
|
|
|
935
939
|
assertNonEmpty(present.id, `${trackId} Present id`);
|
|
936
940
|
if (present.subjectId !== undefined) assertNonEmpty(present.subjectId, `${trackId}.${present.id} subjectId`);
|
|
937
941
|
assertFrameSpan(present.span, totalFrames, `${trackId}.${present.id}.span`);
|
|
942
|
+
let previousEnd = present.span.startFrame;
|
|
943
|
+
for (const span of present.visibility ?? []) {
|
|
944
|
+
assertFrameSpan(span, present.span.endFrameExclusive, `${trackId}.${present.id}.visibility`);
|
|
945
|
+
if (span.startFrame < previousEnd) throw new Error(`${trackId}.${present.id} visibility must be ordered within its span.`);
|
|
946
|
+
previousEnd = span.endFrameExclusive;
|
|
947
|
+
}
|
|
938
948
|
assertNonEmpty(present.stacking.tieBreak, `${trackId}.${present.id} stacking tieBreak`);
|
|
939
949
|
if (!Number.isSafeInteger(present.stacking.order)) {
|
|
940
950
|
throw new Error(`${trackId}.${present.id} has invalid stacking order.`);
|
|
@@ -1236,6 +1246,7 @@ function visualTrackContent(value: Omit<VisualTrack, "kind">): VisualTrack {
|
|
|
1236
1246
|
id: present.id,
|
|
1237
1247
|
...(present.subjectId === undefined ? {} : { subjectId: present.subjectId }),
|
|
1238
1248
|
span: { ...present.span },
|
|
1249
|
+
...(present.visibility === undefined ? {} : { visibility: present.visibility.map(span => ({ ...span })) }),
|
|
1239
1250
|
stacking: { ...present.stacking },
|
|
1240
1251
|
elements: [...present.elements].map(normalizeElement).sort((a, b) => a.order - b.order || a.id.localeCompare(b.id)),
|
|
1241
1252
|
}))
|
|
@@ -1263,6 +1274,8 @@ function audioTrackContent(value: Omit<AudioTrack, "kind">): AudioTrack {
|
|
|
1263
1274
|
gain: clip.gain,
|
|
1264
1275
|
fadeInSamples: clip.fadeInSamples,
|
|
1265
1276
|
fadeOutSamples: clip.fadeOutSamples,
|
|
1277
|
+
...(clip.gainEnvelope === undefined ? {} : { gainEnvelope: clip.gainEnvelope.map(point => ({ ...point })) }),
|
|
1278
|
+
...(clip.audibility === undefined ? {} : { audibility: clip.audibility.map(span => ({ ...span })) }),
|
|
1266
1279
|
}))
|
|
1267
1280
|
.sort((a, b) => a.target.startSample - b.target.startSample || a.id.localeCompare(b.id)),
|
|
1268
1281
|
};
|
|
@@ -1337,6 +1350,7 @@ export function assertAudioTrackIdentity(track: AudioTrack, programSpace?: Progr
|
|
|
1337
1350
|
if (!Number.isFinite(clip.gain) || clip.gain < 0 || clip.gain > 64) {
|
|
1338
1351
|
throw new Error(`${track.id}.${clip.id} gain is invalid.`);
|
|
1339
1352
|
}
|
|
1353
|
+
assertAudioPresentation(clip, clip.target, totalSamples);
|
|
1340
1354
|
const targetLength = clip.target.endSampleExclusive - clip.target.startSample;
|
|
1341
1355
|
if (!Number.isSafeInteger(clip.fadeInSamples) || clip.fadeInSamples < 0 || clip.fadeInSamples > targetLength
|
|
1342
1356
|
|| !Number.isSafeInteger(clip.fadeOutSamples) || clip.fadeOutSamples < 0
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
Read-only `CredentialStore` backed by explicitly named environment variables.
|
|
4
4
|
|
|
5
5
|
```ts
|
|
6
|
-
credentialRef("env", "
|
|
6
|
+
credentialRef("env", "IMAGE_API_KEY")
|
|
7
7
|
```
|
|
8
8
|
|
|
9
9
|
It resolves only the requested key when an Endpoint needs it. It never enumerates or serializes the
|