@hypit/hypit 0.1.4 → 0.1.6
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 +4 -2
- 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 +77 -15
- 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 +8 -1
- package/examples/semantic-composition/chat.svml +6 -5
- package/examples/semantic-composition/hypit.runtime.json +1 -1
- 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 +28 -17
- 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 +11 -0
- package/packages/build-result/src/decode.ts +2 -0
- package/packages/build-result/src/execution-log.ts +17 -0
- package/packages/build-result/src/index.ts +1 -0
- package/packages/build-result/src/store.ts +14 -1
- package/packages/build-result/src/types.ts +3 -0
- package/packages/build-result-s3/src/repository.ts +4 -0
- 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 +21 -9
- 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 +26 -17
- package/packages/caption-fine/src/recipe.ts +7 -0
- package/packages/caption-fine/src/render.ts +14 -13
- 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 +3 -1
- package/packages/caption-fine-studio/src/activation.ts +3 -3
- package/packages/caption-fine-studio/src/index.ts +54 -42
- package/packages/cli/README.md +57 -4
- package/packages/cli/package.json +1 -0
- package/packages/cli/src/arguments.ts +25 -6
- package/packages/cli/src/build-planning.ts +3 -2
- package/packages/cli/src/command.ts +6 -0
- package/packages/cli/src/commands/environment.ts +28 -18
- 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 +3 -2
- package/packages/cli/src/main.ts +34 -42
- package/packages/cli/src/observation.ts +7 -1
- package/packages/cli/src/output.ts +65 -23
- package/packages/cli/src/view.ts +66 -19
- 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/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/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 +10 -7
- 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/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 +16 -11
- 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/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 +22 -26
- package/packages/ranking/src/schedule.ts +16 -19
- package/packages/ranking/src/surface.ts +12 -13
- package/packages/ranking-studio/README.md +18 -0
- package/packages/ranking-studio/src/index.ts +61 -9
- 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/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 +24 -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 +109 -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 +2 -1
- package/packages/runtime-local/src/result-writer.ts +2 -0
- package/packages/runtime-local/src/runtime.ts +8 -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 +30 -5
- package/packages/script/src/manifest.ts +4 -3
- package/packages/script/src/narrative.ts +1 -0
- package/packages/script/src/parser.ts +45 -6
- package/packages/script/src/surface.ts +4 -3
- package/packages/script/src/types.ts +1 -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 +7 -1
- 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/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 +15 -2
- package/packages/studio/LOCALIZATION.md +98 -0
- package/packages/studio/README.md +101 -14
- package/packages/studio/locales/en.json +197 -0
- package/packages/studio/locales/zh-CN.json +191 -0
- package/packages/studio/package.json +8 -7
- 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/localization-node.ts +46 -0
- package/packages/studio/src/localization.ts +85 -0
- package/packages/studio/src/parameter-values.ts +43 -1
- package/packages/studio/src/parameters.ts +114 -24
- 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 +10 -6
- package/packages/studio/src/shared.ts +4 -2
- package/packages/studio/src/snapshot.ts +21 -132
- package/packages/studio/src/studio-preflight.ts +3 -3
- package/packages/studio/src/studio-registry.ts +50 -6
- package/packages/studio/src/style.css +223 -50
- package/packages/studio/src/ui/artifact-name.ts +8 -6
- package/packages/studio/src/ui/artifact-preview.ts +5 -4
- package/packages/studio/src/ui/code.ts +17 -16
- package/packages/studio/src/ui/comments.ts +234 -0
- package/packages/studio/src/ui/dropdown.ts +68 -0
- package/packages/studio/src/ui/i18n.ts +109 -0
- package/packages/studio/src/ui/icons.ts +6 -0
- package/packages/studio/src/ui/library.ts +76 -65
- package/packages/studio/src/ui/main.ts +223 -211
- package/packages/studio/src/ui/overlay.ts +12 -8
- package/packages/studio/src/ui/scrub-preview.ts +110 -0
- package/packages/studio/src/ui/stage.ts +93 -29
- package/packages/studio/src/ui/timeline.ts +190 -118
- package/packages/studio/start.ts +41 -22
- package/packages/studio-adapter/README.md +130 -11
- package/packages/studio-adapter/src/index.ts +100 -13
- 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 +2 -2
- package/packages/temporal-markup/README.md +27 -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/video-cli/README.md +4 -1
- package/packages/video-cli/package.json +2 -1
- package/packages/video-cli/src/creation.ts +14 -4
- 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 +1 -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
|
@@ -2,7 +2,7 @@ import { captionProducers, captionTypes } from "@hypit/caption";
|
|
|
2
2
|
import { compositionTypes } from "@hypit/composition";
|
|
3
3
|
import { sealGraphFragment } from "@hypit/elaborator";
|
|
4
4
|
import { narrativeTypes } from "@hypit/narrative";
|
|
5
|
-
import {
|
|
5
|
+
import { timelineTypes } from "@hypit/timeline";
|
|
6
6
|
import { spatialTypes } from "@hypit/spatial";
|
|
7
7
|
|
|
8
8
|
import { captionFineProducers, captionFineTypes } from "./manifest.js";
|
|
@@ -14,21 +14,15 @@ const operation = (id: string) => ({ kind: "fragment-operation" as const, operat
|
|
|
14
14
|
export const fineCaptionTrackFragment = sealGraphFragment({
|
|
15
15
|
inputs: [
|
|
16
16
|
{ name: "document", type: narrativeTypes.captionDocument },
|
|
17
|
-
{ name: "
|
|
17
|
+
{ name: "timeline", type: timelineTypes.track },
|
|
18
18
|
{ name: "program", type: captionTypes.program },
|
|
19
19
|
],
|
|
20
20
|
operations: [
|
|
21
|
-
{
|
|
22
|
-
id: "caption:space",
|
|
23
|
-
producer: semanticTrackProducers.projectProgramSpace,
|
|
24
|
-
inputs: { track: input("semantic") },
|
|
25
|
-
result: { kind: "output", name: "space" },
|
|
26
|
-
},
|
|
27
21
|
{
|
|
28
22
|
id: "caption:temporalize-document",
|
|
29
23
|
producer: captionProducers.temporalizeDocument,
|
|
30
24
|
inputs: {
|
|
31
|
-
document: input("document"),
|
|
25
|
+
document: input("document"), timeline: input("timeline"),
|
|
32
26
|
},
|
|
33
27
|
result: { kind: "output", name: "caption" },
|
|
34
28
|
},
|
|
@@ -45,7 +39,7 @@ export const fineCaptionTrackFragment = sealGraphFragment({
|
|
|
45
39
|
producer: captionFineProducers.render,
|
|
46
40
|
inputs: {
|
|
47
41
|
schedule: operation("caption-fine:schedule"), program: input("program"),
|
|
48
|
-
document: input("document"),
|
|
42
|
+
document: input("document"), timeline: input("timeline"),
|
|
49
43
|
},
|
|
50
44
|
result: { kind: "output", name: "track" },
|
|
51
45
|
},
|
|
@@ -68,22 +62,16 @@ export const fineCaptionTrackFragment = sealGraphFragment({
|
|
|
68
62
|
export const fineCaptionRegionTrackFragment = sealGraphFragment({
|
|
69
63
|
inputs: [
|
|
70
64
|
{ name: "document", type: narrativeTypes.captionDocument },
|
|
71
|
-
{ name: "
|
|
65
|
+
{ name: "timeline", type: timelineTypes.track },
|
|
72
66
|
{ name: "program", type: captionTypes.program },
|
|
73
67
|
{ name: "regions", type: spatialTypes.regionTimeline },
|
|
74
68
|
],
|
|
75
69
|
operations: [
|
|
76
|
-
{
|
|
77
|
-
id: "caption:space",
|
|
78
|
-
producer: semanticTrackProducers.projectProgramSpace,
|
|
79
|
-
inputs: { track: input("semantic") },
|
|
80
|
-
result: { kind: "output", name: "space" },
|
|
81
|
-
},
|
|
82
70
|
{
|
|
83
71
|
id: "caption:temporalize-document",
|
|
84
72
|
producer: captionProducers.temporalizeDocument,
|
|
85
73
|
inputs: {
|
|
86
|
-
document: input("document"),
|
|
74
|
+
document: input("document"), timeline: input("timeline"),
|
|
87
75
|
},
|
|
88
76
|
result: { kind: "output", name: "caption" },
|
|
89
77
|
},
|
|
@@ -100,7 +88,7 @@ export const fineCaptionRegionTrackFragment = sealGraphFragment({
|
|
|
100
88
|
producer: captionFineProducers.renderWithRegions,
|
|
101
89
|
inputs: {
|
|
102
90
|
schedule: operation("caption-fine:schedule"), program: input("program"),
|
|
103
|
-
document: input("document"),
|
|
91
|
+
document: input("document"), timeline: input("timeline"), regions: input("regions"),
|
|
104
92
|
},
|
|
105
93
|
result: { kind: "output", name: "track" },
|
|
106
94
|
},
|
|
@@ -1,12 +1,15 @@
|
|
|
1
|
+
import { temporalDependency, temporalTypes } from "@hypit/temporal";
|
|
2
|
+
import { temporalWindowAttributeVocabulary } from "@hypit/temporal-markup";
|
|
3
|
+
import type { Timeline } from "@hypit/timeline";
|
|
1
4
|
import { readFile } from "node:fs/promises";
|
|
2
5
|
|
|
3
6
|
import { captionManifest, captionModuleRef, captionTypes } from "@hypit/caption";
|
|
4
7
|
import { compositionDependency, compositionTypes } from "@hypit/composition";
|
|
5
8
|
import { mediaDependency, mediaTypes } from "@hypit/media";
|
|
6
9
|
import { narrativeDependency, narrativeTypes } from "@hypit/narrative";
|
|
7
|
-
|
|
10
|
+
|
|
8
11
|
import type { ModuleManifest, ProducerRef } from "@hypit/protocol";
|
|
9
|
-
import {
|
|
12
|
+
import { timelineDependency, timelineTypes } from "@hypit/timeline";
|
|
10
13
|
import { spatialDependency, spatialTypes } from "@hypit/spatial";
|
|
11
14
|
import { svsRecipeType } from "@hypit/svs";
|
|
12
15
|
|
|
@@ -35,7 +38,7 @@ export const captionFineMarkupSurfaces = [
|
|
|
35
38
|
summary: "Resolves one SVS Recipe and one exact font stack into a complete fine-grained Caption Style.",
|
|
36
39
|
attributes: [
|
|
37
40
|
{ name: "id", kind: "identifier", required: true,
|
|
38
|
-
summary: "Names this Style so a
|
|
41
|
+
summary: "Names this Style so a timed Use can select it." },
|
|
39
42
|
{ name: "recipe", kind: "reference", required: true, accepts: [svsRecipeType],
|
|
40
43
|
summary: "Chooses the Recipe that carries Cue geometry, Paint and local motion.",
|
|
41
44
|
recipe: [
|
|
@@ -295,9 +298,9 @@ export const captionFineMarkupSurfaces = [
|
|
|
295
298
|
},
|
|
296
299
|
},
|
|
297
300
|
{
|
|
298
|
-
name: "track", tag: "Track", mode: "structured", outputs: [captionFineTypes.schedule, compositionTypes.visualTrack],
|
|
301
|
+
name: "track", tag: "Track", mode: "structured", outputs: [captionFineTypes.schedule, compositionTypes.visualTrack, captionTypes.program, captionTypes.timedProjection, captionTypes.header, captionTypes.filter, temporalTypes.instantSpec, temporalTypes.windowSpec, temporalTypes.instant, temporalTypes.window],
|
|
299
302
|
vocabulary: {
|
|
300
|
-
summary: "Joins the authored CaptionDocument against the
|
|
303
|
+
summary: "Joins the authored CaptionDocument against the Timeline and renders it as one ordinary peer VisualTrack.",
|
|
301
304
|
appearance: "One block of caption text wrapped into lines inside a rounded Cue box, placed at a Recipe-chosen point on the Canvas and spanning a fraction of its width. Cues follow the speech one after another, each arriving and leaving with its own motion, and the Words of a Cue either stand there together from its first Frame or uncover as they are spoken. As the speech advances, the Word being spoken, or every Word up to it, is repainted in the active Paint, snapping at the Word boundary or sweeping across the glyphs, and it may take a rule beneath it, a rounded highlight capsule behind it and a brief pop at the moment it becomes the spoken one. That capsule either stands alone on each Atom or grows as one continuous run over everything already read, following the Words across line breaks.\n\nEvery Cue uses the ordered exact font stack its Style names, with fallback faces supplying glyphs for other scripts. Emphasis varies by timed unit through the active Paint. Lines follow the common flow, so a line cannot be given a separate face, colour or weight of its own. A caption whose lines are set in different typefaces is outside what this Track can draw.",
|
|
302
305
|
preview: previewImage("Track.png"),
|
|
303
306
|
attributes: [
|
|
@@ -305,23 +308,30 @@ export const captionFineMarkupSurfaces = [
|
|
|
305
308
|
summary: "Names this Track so its rendered output can be placed in a Film." },
|
|
306
309
|
{ name: "document", kind: "reference", required: true, accepts: [narrativeTypes.captionDocument],
|
|
307
310
|
summary: "Chooses the Script-owned CaptionDocument." },
|
|
308
|
-
{ name: "
|
|
309
|
-
summary: "Chooses the continuous
|
|
310
|
-
{ name: "program", kind: "reference", required: true, accepts: [captionTypes.program],
|
|
311
|
-
summary: "Chooses the Style assignment that decides which Style each run is rendered in." },
|
|
311
|
+
{ name: "timeline", kind: "reference", required: true, accepts: [timelineTypes.track],
|
|
312
|
+
summary: "Chooses the continuous Timeline whose Word anchors give every Cue its time." },
|
|
312
313
|
{ name: "regions", kind: "reference", required: false, accepts: [spatialTypes.regionTimeline],
|
|
313
314
|
summary: "Optionally follows external, frame-exact regions whose ids equal Script Roles, placing a Cue at its measured speaker region's top center and hiding it on null Frames." },
|
|
314
315
|
],
|
|
316
|
+
children: [{ tag: "Use", cardinality: "many", summary: "Presents complete Cues inside a time window. Later matching Uses replace earlier ones.", attributes: [
|
|
317
|
+
{ name: "id", kind: "identifier", required: false, summary: "Optional occurrence identity." },
|
|
318
|
+
{ name: "style", kind: "reference", required: true, accepts: [captionTypes.style], summary: "Complete Caption Style, including Hidden." },
|
|
319
|
+
{ name: "role", kind: "literal", required: false, summary: "Optional speaker filter, independent of the time window." },
|
|
320
|
+
...temporalWindowAttributeVocabulary,
|
|
321
|
+
] }],
|
|
315
322
|
ports: [
|
|
316
323
|
{ name: "schedule", type: captionFineTypes.schedule,
|
|
317
324
|
summary: "The visible Cue schedule consumed by the renderer and other declared tools." },
|
|
318
325
|
{ name: "track", type: compositionTypes.visualTrack,
|
|
319
326
|
summary: "The rendered Caption as one self-contained VisualTrack." },
|
|
320
327
|
],
|
|
321
|
-
example: `<caption-fine:Track id="captions" document={story.caption}
|
|
328
|
+
example: `<caption-fine:Track id="captions" document={story.caption} timeline={speech.timeline}>
|
|
329
|
+
<caption-fine:Use style={primary-caption}/>
|
|
330
|
+
<caption-fine:Use during={story.selection.answer} style={answer-caption}/>
|
|
331
|
+
</caption-fine:Track>`,
|
|
322
332
|
notes: [
|
|
323
|
-
"
|
|
324
|
-
"
|
|
333
|
+
"Use without time attributes covers the whole Timeline. Role filters content without changing the window.",
|
|
334
|
+
"Script Cue breaks organize text; Use windows change presentation without cutting Cues or restarting word timing. A hidden Use still replaces earlier presentation.",
|
|
325
335
|
"Without regions, Recipe x/y placement is unchanged. With regions, a measured region overrides x/y for that Frame; a null Frame on that Role track hides the Cue, while a missing Role track retains authored x/y.",
|
|
326
336
|
"The tracked point replaces Recipe x/y while width and the Recipe anchor still decide the Caption box geometry; anchor-x=center and anchor-y=bottom place the box immediately above the measured region.",
|
|
327
337
|
],
|
|
@@ -339,9 +349,8 @@ export const captionFineManifest: ModuleManifest = {
|
|
|
339
349
|
compositionDependency,
|
|
340
350
|
mediaDependency,
|
|
341
351
|
narrativeDependency,
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
spatialDependency,
|
|
352
|
+
timelineDependency,
|
|
353
|
+
spatialDependency, temporalDependency,
|
|
345
354
|
],
|
|
346
355
|
types: [{ name: captionFineTypes.schedule.name }],
|
|
347
356
|
capabilities: [],
|
|
@@ -362,7 +371,7 @@ export const captionFineManifest: ModuleManifest = {
|
|
|
362
371
|
{ name: "schedule", type: captionFineTypes.schedule },
|
|
363
372
|
{ name: "program", type: captionTypes.program },
|
|
364
373
|
{ name: "document", type: narrativeTypes.captionDocument },
|
|
365
|
-
{ name: "
|
|
374
|
+
{ name: "timeline", type: timelineTypes.track },
|
|
366
375
|
],
|
|
367
376
|
outputs: [{ name: "track", type: compositionTypes.visualTrack }],
|
|
368
377
|
needs: [],
|
|
@@ -373,7 +382,7 @@ export const captionFineManifest: ModuleManifest = {
|
|
|
373
382
|
{ name: "schedule", type: captionFineTypes.schedule },
|
|
374
383
|
{ name: "program", type: captionTypes.program },
|
|
375
384
|
{ name: "document", type: narrativeTypes.captionDocument },
|
|
376
|
-
{ name: "
|
|
385
|
+
{ name: "timeline", type: timelineTypes.track },
|
|
377
386
|
{ name: "regions", type: spatialTypes.regionTimeline },
|
|
378
387
|
],
|
|
379
388
|
outputs: [{ name: "track", type: compositionTypes.visualTrack }],
|
|
@@ -118,3 +118,10 @@ export const fineCaptionRecipeSchema: ValueSchema = {
|
|
|
118
118
|
required.has(name) ? { schema: schemaFor(name) } : { schema: schemaFor(name), optional: true },
|
|
119
119
|
])),
|
|
120
120
|
};
|
|
121
|
+
|
|
122
|
+
/** Static authored defaults; dependent paint values retain their decoder relationships. */
|
|
123
|
+
export const fineCaptionEditableDefaults = {
|
|
124
|
+
opacity: 1, "stroke-width": 0, "shadow-opacity": 0, "glow-opacity": 0,
|
|
125
|
+
karaoke: "off", "karaoke-transition": "step", "active-box": "off",
|
|
126
|
+
"underline": "off", "active-underline": "off",
|
|
127
|
+
} as const;
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { Timeline } from "@hypit/timeline";
|
|
1
2
|
import { assertCaptionProgramForDocument } from "@hypit/caption";
|
|
2
3
|
import type { CaptionProgram } from "@hypit/caption";
|
|
3
4
|
import { assertVisualTrackIdentity, sealVisualTrack } from "@hypit/composition";
|
|
@@ -14,7 +15,6 @@ import type {
|
|
|
14
15
|
} from "@hypit/composition";
|
|
15
16
|
import type { CaptionAlignmentUnit, CaptionDocument } from "@hypit/narrative";
|
|
16
17
|
import { assertProgramSpaceIdentity, programSpaceFrameCount } from "@hypit/program-space";
|
|
17
|
-
import type { ProgramSpace } from "@hypit/program-space";
|
|
18
18
|
import { assertSpatialRegionTimeline } from "@hypit/spatial";
|
|
19
19
|
import type { CanvasSpace, SpatialFrame, SpatialRegionTimeline } from "@hypit/spatial";
|
|
20
20
|
|
|
@@ -639,7 +639,7 @@ function structuralRowCount(
|
|
|
639
639
|
|
|
640
640
|
/**
|
|
641
641
|
* Acoustic Word windows may overlap. Preserve those measurements in the
|
|
642
|
-
*
|
|
642
|
+
* Timeline, but give every current-only visual state one unambiguous
|
|
643
643
|
* owner: as soon as the next authored unit starts, the previous one stops.
|
|
644
644
|
*/
|
|
645
645
|
function exclusiveActivationFrames(
|
|
@@ -1069,33 +1069,32 @@ export function renderFineCaption(
|
|
|
1069
1069
|
schedule: FineCaptionSchedule,
|
|
1070
1070
|
program: CaptionProgram,
|
|
1071
1071
|
document: CaptionDocument,
|
|
1072
|
-
|
|
1072
|
+
timeline: Timeline,
|
|
1073
1073
|
regions?: SpatialRegionTimeline,
|
|
1074
1074
|
): VisualTrack {
|
|
1075
1075
|
assertFineCaptionSchedule(schedule);
|
|
1076
1076
|
assertCaptionProgramForDocument(program, document);
|
|
1077
1077
|
if (schedule.documentId !== document.id) throw new Error("Fine Caption received another CaptionDocument");
|
|
1078
|
-
|
|
1079
|
-
|
|
1080
|
-
|
|
1081
|
-
|
|
1082
|
-
if (schedule.spaceId !== space.id || schedule.narrativeId !== document.narrativeId) {
|
|
1083
|
-
throw new Error("Fine Caption inputs belong to different ProgramSpaces or Narratives");
|
|
1078
|
+
|
|
1079
|
+
assertProgramSpaceIdentity(timeline);
|
|
1080
|
+
if (schedule.spaceId !== timeline.id || schedule.narrativeId !== document.narrativeId) {
|
|
1081
|
+
throw new Error("Fine Caption inputs belong to different Timelines or Narratives");
|
|
1084
1082
|
}
|
|
1085
1083
|
const styles = new Map(program.styles.map((style) => [style.id, style]));
|
|
1086
1084
|
const wordText = new Map(document.words.map((word) => [word.id, word.text]));
|
|
1087
1085
|
const atomById = new Map(document.units.map((atom) => [atom.id, atom]));
|
|
1088
1086
|
for (const style of styles.values()) {
|
|
1087
|
+
if (style.rendering === null) continue;
|
|
1089
1088
|
if (style.rendering.family !== FINE_CAPTION_FAMILY) {
|
|
1090
1089
|
throw new Error(`Fine Caption cannot render Style family ${style.rendering.family}`);
|
|
1091
1090
|
}
|
|
1092
1091
|
assertFineCaptionParameters(style.rendering.parameters as unknown as FineCaptionParameters);
|
|
1093
1092
|
}
|
|
1094
|
-
const totalFrames = programSpaceFrameCount(
|
|
1093
|
+
const totalFrames = programSpaceFrameCount(timeline);
|
|
1095
1094
|
const regionTracks = regions === undefined ? undefined : (() => {
|
|
1096
1095
|
assertSpatialRegionTimeline(regions);
|
|
1097
1096
|
if (regions.frameCount !== totalFrames) {
|
|
1098
|
-
throw new Error(`Fine Caption regions cover ${regions.frameCount} Frames but
|
|
1097
|
+
throw new Error(`Fine Caption regions cover ${regions.frameCount} Frames but Timeline has ${totalFrames}`);
|
|
1099
1098
|
}
|
|
1100
1099
|
return new Map(regions.tracks.map((track) => [track.id, track]));
|
|
1101
1100
|
})();
|
|
@@ -1105,6 +1104,7 @@ export function renderFineCaption(
|
|
|
1105
1104
|
const resolvedAtoms = atoms.map((atom) => atom!);
|
|
1106
1105
|
const style = styles.get(cue.styleId);
|
|
1107
1106
|
if (style === undefined) throw new Error(`Fine Caption Cue ${cue.id} references unknown Style ${cue.styleId}`);
|
|
1107
|
+
if (style.rendering === null) return [];
|
|
1108
1108
|
const parameters = style.rendering.parameters as unknown as FineCaptionParameters;
|
|
1109
1109
|
const startFrame = Math.max(0, cue.visibleStartFrame);
|
|
1110
1110
|
const measuredEnd = Math.min(totalFrames, cue.visibleEndFrameExclusive);
|
|
@@ -1130,16 +1130,17 @@ export function renderFineCaption(
|
|
|
1130
1130
|
return [{
|
|
1131
1131
|
id: cue.id,
|
|
1132
1132
|
span: { startFrame, endFrameExclusive },
|
|
1133
|
+
visibility: cue.visibility,
|
|
1133
1134
|
stacking: { order: parameters.stackingOrder, tieBreak: `${program.id}:${cue.id}` },
|
|
1134
1135
|
elements: cueElements(resolvedAtoms, atomFrames, parameters, wordText, durationFrames, cue.styleId, trackedPlacement),
|
|
1135
1136
|
}];
|
|
1136
1137
|
});
|
|
1137
1138
|
const track = sealVisualTrack({
|
|
1138
|
-
programSpaceId:
|
|
1139
|
+
programSpaceId: timeline.id,
|
|
1139
1140
|
visualIr: "hypit.visual-ir@1",
|
|
1140
1141
|
id: program.id,
|
|
1141
1142
|
presents,
|
|
1142
1143
|
});
|
|
1143
|
-
assertVisualTrackIdentity(track,
|
|
1144
|
+
assertVisualTrackIdentity(track, timeline);
|
|
1144
1145
|
return track;
|
|
1145
1146
|
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { assertCaptionProgramForDocument, assertTimedCaptionProjection, captionUseVisibility } from "@hypit/caption";
|
|
2
2
|
import type { CaptionProgram, TimedCaptionProjection } from "@hypit/caption";
|
|
3
3
|
import type { CaptionDocument } from "@hypit/narrative";
|
|
4
4
|
|
|
@@ -27,13 +27,11 @@ export function scheduleFineCaption(
|
|
|
27
27
|
if (projection.narrativeId !== document.narrativeId) {
|
|
28
28
|
throw new Error("Fine Caption Schedule received a CaptionDocument from another Narrative");
|
|
29
29
|
}
|
|
30
|
-
if (program.wordRuns.length !== 0) {
|
|
31
|
-
throw new Error("Fine Caption accepts one uniform token rule and cannot consume word-specific Style runs");
|
|
32
|
-
}
|
|
33
|
-
const visibleProjection = applyCaptionMute(projection, program, document);
|
|
34
|
-
|
|
35
30
|
const parameters = new Map<string, FineCaptionParameters>();
|
|
31
|
+
const activeStyles = new Set(program.uses.map(use => use.styleId));
|
|
36
32
|
for (const style of program.styles) {
|
|
33
|
+
if (!activeStyles.has(style.id)) continue;
|
|
34
|
+
if (style.rendering === null) continue;
|
|
37
35
|
if (style.rendering.family !== FINE_CAPTION_FAMILY) {
|
|
38
36
|
throw new Error(`Fine Caption cannot schedule Style family ${style.rendering.family}`);
|
|
39
37
|
}
|
|
@@ -42,39 +40,41 @@ export function scheduleFineCaption(
|
|
|
42
40
|
parameters.set(style.id, value);
|
|
43
41
|
}
|
|
44
42
|
|
|
45
|
-
const
|
|
46
|
-
const style = parameters.get(cue.styleId);
|
|
47
|
-
if (style === undefined) throw new Error(`Fine Caption Cue ${cue.id} references unknown Style ${cue.styleId}`);
|
|
48
|
-
const visibleStartFrame = Math.max(0, cue.startFrame - style.timing.leadFrames);
|
|
49
|
-
const visibleEndFrameExclusive = cue.endFrameExclusive + style.timing.tailFrames;
|
|
50
|
-
return {
|
|
51
|
-
id: cue.id,
|
|
52
|
-
styleId: cue.styleId,
|
|
53
|
-
semanticStartFrame: cue.startFrame,
|
|
54
|
-
semanticEndFrameExclusive: cue.endFrameExclusive,
|
|
55
|
-
visibleStartFrame,
|
|
56
|
-
visibleEndFrameExclusive,
|
|
57
|
-
units: cue.units,
|
|
58
|
-
};
|
|
59
|
-
});
|
|
60
|
-
|
|
43
|
+
const units = new Map(document.units.map(unit => [unit.id, unit]));
|
|
61
44
|
const cues: FineCaptionScheduledCue[] = [];
|
|
62
|
-
for (const
|
|
63
|
-
|
|
64
|
-
const
|
|
65
|
-
if (
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
45
|
+
for (const [index, use] of program.uses.entries()) {
|
|
46
|
+
if (use.window.start.source.spaceId !== projection.spaceId) throw new Error("Caption Use belongs to another Timeline");
|
|
47
|
+
const style = parameters.get(use.styleId);
|
|
48
|
+
if (style === undefined) continue; // Hidden still participates in coverage below.
|
|
49
|
+
const desired = projection.cues.filter(cue => use.role === undefined || units.get(cue.units[0]!.unitId)?.role === use.role).map((cue): FineCaptionScheduledCue => ({
|
|
50
|
+
id: `${use.window.subjectId}:${cue.id}`, cueId: cue.id, styleId: use.styleId,
|
|
51
|
+
semanticStartFrame: cue.startFrame, semanticEndFrameExclusive: cue.endFrameExclusive,
|
|
52
|
+
visibleStartFrame: Math.max(0, cue.startFrame - style.timing.leadFrames),
|
|
53
|
+
visibleEndFrameExclusive: cue.endFrameExclusive + style.timing.tailFrames,
|
|
54
|
+
units: cue.units, visibility: [],
|
|
55
|
+
}));
|
|
56
|
+
// Resolve each speaker's ordinary Cue handoff before masking by Use windows.
|
|
57
|
+
desired.sort((a, b) => a.semanticStartFrame - b.semanticStartFrame);
|
|
58
|
+
const previousByRole = new Map<string | undefined, number>();
|
|
59
|
+
const envelopes: FineCaptionScheduledCue[] = [];
|
|
60
|
+
for (const wanted of desired) {
|
|
61
|
+
let cue = wanted;
|
|
62
|
+
const role = units.get(cue.units[0]!.unitId)?.role;
|
|
63
|
+
const previousIndex = previousByRole.get(role);
|
|
64
|
+
const previous = previousIndex === undefined ? undefined : envelopes[previousIndex];
|
|
65
|
+
if (previous !== undefined && style.timing.handoff === "cut" && previous.semanticEndFrameExclusive <= cue.semanticStartFrame) {
|
|
66
|
+
const previousEnd = Math.max(previous.semanticEndFrameExclusive, Math.min(previous.visibleEndFrameExclusive, cue.semanticStartFrame));
|
|
67
|
+
envelopes[previousIndex!] = { ...previous, visibleEndFrameExclusive: previousEnd };
|
|
74
68
|
cue = { ...cue, visibleStartFrame: Math.min(cue.semanticStartFrame, Math.max(cue.visibleStartFrame, previousEnd)) };
|
|
75
69
|
}
|
|
70
|
+
previousByRole.set(role, envelopes.length);
|
|
71
|
+
envelopes.push(cue);
|
|
72
|
+
}
|
|
73
|
+
for (const cue of envelopes) {
|
|
74
|
+
const role = units.get(cue.units[0]!.unitId)?.role;
|
|
75
|
+
const visibility = captionUseVisibility(program, index, role, { startFrame: cue.visibleStartFrame, endFrameExclusive: cue.visibleEndFrameExclusive });
|
|
76
|
+
if (visibility.length) cues.push({ ...cue, visibility });
|
|
76
77
|
}
|
|
77
|
-
cues.push(cue);
|
|
78
78
|
}
|
|
79
79
|
|
|
80
80
|
const ids = new Set<string>();
|
|
@@ -110,6 +110,10 @@ export function assertFineCaptionSchedule(value: FineCaptionSchedule): void {
|
|
|
110
110
|
throw new Error("Fine Caption Schedule contains an invalid Cue");
|
|
111
111
|
}
|
|
112
112
|
ids.add(cue.id);
|
|
113
|
+
if (!cue.cueId || cue.visibility.length === 0 || cue.visibility.some(span =>
|
|
114
|
+
!Number.isSafeInteger(span.startFrame) || !Number.isSafeInteger(span.endFrameExclusive)
|
|
115
|
+
|| span.startFrame < cue.visibleStartFrame || span.endFrameExclusive > cue.visibleEndFrameExclusive
|
|
116
|
+
|| span.endFrameExclusive <= span.startFrame)) throw new Error("Fine Caption visibility is invalid");
|
|
113
117
|
for (const [label, frame] of [
|
|
114
118
|
["semantic start", cue.semanticStartFrame],
|
|
115
119
|
["semantic end", cue.semanticEndFrameExclusive],
|
|
@@ -8,6 +8,7 @@ import type { SvsRecipe } from "@hypit/svs";
|
|
|
8
8
|
import type { FineCaptionGlyphPaint, FineCaptionParameters } from "./types.js";
|
|
9
9
|
import {
|
|
10
10
|
fineCaptionOneShotMotions,
|
|
11
|
+
fineCaptionEditableDefaults,
|
|
11
12
|
fineCaptionOptionalRecipeProperties,
|
|
12
13
|
fineCaptionRequiredRecipeProperties,
|
|
13
14
|
} from "./recipe.js";
|
|
@@ -104,14 +105,14 @@ function glyphPaint(recipe: SvsRecipe, prefix: "" | "active-", base?: FineCaptio
|
|
|
104
105
|
return {
|
|
105
106
|
fill: color(recipe, `${prefix}fill`, prefix === "active-" ? "#FFD54A" : base?.fill),
|
|
106
107
|
...(gradient === undefined ? {} : { gradient }),
|
|
107
|
-
opacity: number(recipe, `${prefix}opacity`, base?.opacity ??
|
|
108
|
+
opacity: number(recipe, `${prefix}opacity`, base?.opacity ?? fineCaptionEditableDefaults.opacity),
|
|
108
109
|
stroke: {
|
|
109
110
|
color: color(recipe, `${prefix}stroke-color`, baseStroke?.color ?? "#000000"),
|
|
110
|
-
widthPx: number(recipe, `${prefix}stroke-width`, baseStroke?.widthPx ??
|
|
111
|
+
widthPx: number(recipe, `${prefix}stroke-width`, baseStroke?.widthPx ?? fineCaptionEditableDefaults["stroke-width"]),
|
|
111
112
|
},
|
|
112
113
|
shadow: {
|
|
113
114
|
color: color(recipe, `${prefix}shadow-color`, baseShadow?.color ?? "#000000"),
|
|
114
|
-
opacity: number(recipe, `${prefix}shadow-opacity`, baseShadow?.opacity ??
|
|
115
|
+
opacity: number(recipe, `${prefix}shadow-opacity`, baseShadow?.opacity ?? fineCaptionEditableDefaults["shadow-opacity"]),
|
|
115
116
|
offsetXPx: number(recipe, `${prefix}shadow-x`, baseShadow?.offsetXPx ?? 0),
|
|
116
117
|
offsetYPx: number(recipe, `${prefix}shadow-y`, baseShadow?.offsetYPx ?? 0),
|
|
117
118
|
blurPx: number(recipe, `${prefix}shadow-blur`, baseShadow?.blurPx ?? 0),
|
|
@@ -125,7 +126,7 @@ function glyphPaint(recipe: SvsRecipe, prefix: "" | "active-", base?: FineCaptio
|
|
|
125
126
|
},
|
|
126
127
|
glow: {
|
|
127
128
|
color: color(recipe, `${prefix}glow-color`, baseGlow?.color ?? "#FFFFFF"),
|
|
128
|
-
opacity: number(recipe, `${prefix}glow-opacity`, baseGlow?.opacity ??
|
|
129
|
+
opacity: number(recipe, `${prefix}glow-opacity`, baseGlow?.opacity ?? fineCaptionEditableDefaults["glow-opacity"]),
|
|
129
130
|
blurPx: number(recipe, `${prefix}glow-blur`, baseGlow?.blurPx ?? 0),
|
|
130
131
|
spreadPx: number(recipe, `${prefix}glow-spread`, baseGlow?.spreadPx ?? 0),
|
|
131
132
|
},
|
|
@@ -216,13 +217,13 @@ export function fineCaptionParameters(
|
|
|
216
217
|
basePaint,
|
|
217
218
|
activePaint: glyphPaint(recipe, "active-", basePaint),
|
|
218
219
|
underline: {
|
|
219
|
-
mode: choice(recipe, "underline", ["off", "always"] as const, "
|
|
220
|
+
mode: choice(recipe, "underline", ["off", "always"] as const, fineCaptionEditableDefaults["underline"]),
|
|
220
221
|
color: color(recipe, "underline-color", basePaint.fill),
|
|
221
222
|
thicknessPx: number(recipe, "underline-thickness", 2),
|
|
222
223
|
offsetPx: number(recipe, "underline-offset", 4),
|
|
223
224
|
},
|
|
224
225
|
activeUnderline: {
|
|
225
|
-
mode: choice(recipe, "active-underline", ["off", "current", "trail"] as const, "
|
|
226
|
+
mode: choice(recipe, "active-underline", ["off", "current", "trail"] as const, fineCaptionEditableDefaults["active-underline"]),
|
|
226
227
|
color: color(recipe, "active-underline-color", "#FFD54A"),
|
|
227
228
|
thicknessPx: number(recipe, "active-underline-thickness", 3),
|
|
228
229
|
offsetPx: number(recipe, "active-underline-offset", 4),
|
|
@@ -244,11 +245,11 @@ export function fineCaptionParameters(
|
|
|
244
245
|
},
|
|
245
246
|
},
|
|
246
247
|
karaoke: {
|
|
247
|
-
mode: choice(recipe, "karaoke", ["off", "current", "trail"] as const, "
|
|
248
|
-
transition: choice(recipe, "karaoke-transition", ["step", "wipe"] as const, "
|
|
248
|
+
mode: choice(recipe, "karaoke", ["off", "current", "trail"] as const, fineCaptionEditableDefaults["karaoke"]),
|
|
249
|
+
transition: choice(recipe, "karaoke-transition", ["step", "wipe"] as const, fineCaptionEditableDefaults["karaoke-transition"]),
|
|
249
250
|
},
|
|
250
251
|
activeBox: {
|
|
251
|
-
mode: choice(recipe, "active-box", ["off", "current", "trail"] as const, "
|
|
252
|
+
mode: choice(recipe, "active-box", ["off", "current", "trail"] as const, fineCaptionEditableDefaults["active-box"]),
|
|
252
253
|
continuity: choice(recipe, "active-box-continuity", ["isolated", "joined"] as const, "isolated"),
|
|
253
254
|
background: color(recipe, "active-box-background", "#FFD54A"),
|
|
254
255
|
borderColor: color(recipe, "active-box-border-color", "#00000000"),
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import { captionTypes } from "@hypit/caption";
|
|
1
|
+
import { captionTypes, captionProducers } from "@hypit/caption";
|
|
2
2
|
import { assertFontArtifactRef, assertFontStackRef, mediaTypes } from "@hypit/media";
|
|
3
3
|
import type { FontArtifactRef, FontStackRef } from "@hypit/media";
|
|
4
4
|
import { narrativeTypes } from "@hypit/narrative";
|
|
5
|
-
import {
|
|
5
|
+
import { timelineTypes } from "@hypit/timeline";
|
|
6
6
|
import { spatialTypes } from "@hypit/spatial";
|
|
7
7
|
import { svsRecipeType } from "@hypit/svs";
|
|
8
8
|
import type { SvsRecipe } from "@hypit/svs";
|
|
@@ -13,7 +13,16 @@ import type {
|
|
|
13
13
|
MarkupAttributeValue,
|
|
14
14
|
} from "@hypit/markup";
|
|
15
15
|
|
|
16
|
-
import {
|
|
16
|
+
import { sealGraphFragment } from "@hypit/elaborator";
|
|
17
|
+
import type { FragmentOperation } from "@hypit/elaborator";
|
|
18
|
+
import type { SurfaceRecordDraft, SurfaceComponentDraft } from "@hypit/markup";
|
|
19
|
+
import { assertEmptyElement, optionalTextAttribute } from "@hypit/markup";
|
|
20
|
+
import { createTemporalWindowProjection, resolveTemporalContext, temporalWindowAttributeNames } from "@hypit/temporal-markup";
|
|
21
|
+
import { temporalTypes } from "@hypit/temporal";
|
|
22
|
+
import { compositionTypes } from "@hypit/composition";
|
|
23
|
+
import { captionFineProducers, captionFineTypes } from "./manifest.js";
|
|
24
|
+
const input = (name: string) => ({ kind: "fragment-input" as const, name });
|
|
25
|
+
const operation = (id: string) => ({ kind: "fragment-operation" as const, operation: id });
|
|
17
26
|
import { fineCaptionStyle } from "./style.js";
|
|
18
27
|
|
|
19
28
|
function sameType(left: SurfaceResolvedReference["type"], right: SurfaceResolvedReference["type"]): boolean {
|
|
@@ -114,39 +123,57 @@ export const decodeFineCaptionStyleSurface: StructuredSurfaceHandler = ({ elemen
|
|
|
114
123
|
};
|
|
115
124
|
|
|
116
125
|
export const decodeFineCaptionTrackSurface: StructuredSurfaceHandler = ({ element, resolveReference }) => {
|
|
117
|
-
attributes(element, ["id", "document", "
|
|
118
|
-
if (element.children.some((child) => child.kind === "element" || child.value.trim())) {
|
|
119
|
-
throw new Error(`${element.name} does not accept children`);
|
|
120
|
-
}
|
|
126
|
+
attributes(element, ["id", "document", "timeline"], ["regions"]);
|
|
121
127
|
const id = stringAttribute(element, "id");
|
|
122
128
|
const document = reference(element, "document", narrativeTypes.captionDocument, resolveReference);
|
|
123
|
-
const
|
|
124
|
-
const
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
129
|
+
const context = resolveTemporalContext({ element, resolveReference });
|
|
130
|
+
const regions = element.attributes.regions === undefined ? undefined : reference(element, "regions", spatialTypes.regionTimeline, resolveReference);
|
|
131
|
+
const records: SurfaceRecordDraft[] = [{ id: `${id}.header`, type: captionTypes.header,
|
|
132
|
+
value: { kind: "inline", value: { id } }, range: element.range }];
|
|
133
|
+
const components: SurfaceComponentDraft[] = [];
|
|
134
|
+
const fragments: ReturnType<typeof sealGraphFragment>[] = [];
|
|
135
|
+
const inputs: { name: string; type: SurfaceResolvedReference["type"] }[] = [{ name: "document", type: narrativeTypes.captionDocument }, { name: "timeline", type: timelineTypes.track }, { name: "header", type: captionTypes.header }];
|
|
136
|
+
const bindings: Record<string, SurfaceResolvedReference["ref"]> = { document: document.ref, timeline: context.timeline.ref, header: { kind: "record", id: `${id}.header` } };
|
|
137
|
+
const operations: FragmentOperation[] = [{ id: "create", producer: captionProducers.create,
|
|
138
|
+
inputs: { document: input("document"), header: input("header") }, result: { kind: "output", name: "program" } }];
|
|
139
|
+
let previous = "create", index = 0;
|
|
140
|
+
for (const child of element.children) {
|
|
141
|
+
if (child.kind === "text") { if (child.value.trim()) throw new Error("Caption Track accepts Use children."); continue; }
|
|
142
|
+
if (localName(child.name) !== "Use") throw new Error("Caption Track accepts Use children.");
|
|
143
|
+
attributes(child, ["style"], ["id", "role", ...temporalWindowAttributeNames]);
|
|
144
|
+
assertEmptyElement(child);
|
|
145
|
+
index += 1;
|
|
146
|
+
const useId = optionalTextAttribute(child, "id") ?? `${id}.use.${index}`;
|
|
147
|
+
const hasTime = temporalWindowAttributeNames.some(name => child.attributes[name] !== undefined);
|
|
148
|
+
const temporal = createTemporalWindowProjection({ id: useId, ...context, resolveReference,
|
|
149
|
+
element: hasTime ? child : { ...child, attributes: { ...child.attributes, during: "program" } } });
|
|
150
|
+
records.push(...temporal.records); components.push(...temporal.components); fragments.push(...temporal.fragments);
|
|
151
|
+
const style = reference(child, "style", captionTypes.style, resolveReference);
|
|
152
|
+
const role = optionalTextAttribute(child, "role");
|
|
153
|
+
const filterId = `${useId}.filter`;
|
|
154
|
+
records.push({ id: filterId, type: captionTypes.filter, value: { kind: "inline", value: role === undefined ? {} : { role } }, range: child.range });
|
|
155
|
+
const key = `use-${index}`;
|
|
156
|
+
inputs.push({ name: `${key}-window`, type: temporalTypes.window }, { name: `${key}-style`, type: captionTypes.style }, { name: `${key}-filter`, type: captionTypes.filter });
|
|
157
|
+
bindings[`${key}-window`] = temporal.ref; bindings[`${key}-style`] = style.ref; bindings[`${key}-filter`] = { kind: "record", id: filterId };
|
|
158
|
+
operations.push({ id: key, producer: captionProducers.append,
|
|
159
|
+
inputs: { program: operation(previous), window: input(`${key}-window`), style: input(`${key}-style`), filter: input(`${key}-filter`) }, result: { kind: "output", name: "program" } });
|
|
160
|
+
previous = key;
|
|
138
161
|
}
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
}
|
|
150
|
-
|
|
151
|
-
};
|
|
162
|
+
operations.push({ id: "content", producer: captionProducers.temporalizeDocument,
|
|
163
|
+
inputs: { document: input("document"), timeline: input("timeline") }, result: { kind: "output", name: "caption" } });
|
|
164
|
+
operations.push({ id: "schedule", producer: captionFineProducers.schedule,
|
|
165
|
+
inputs: { caption: operation("content"), document: input("document"), program: operation(previous) }, result: { kind: "output", name: "schedule" } });
|
|
166
|
+
if (regions !== undefined) { inputs.push({ name: "regions", type: spatialTypes.regionTimeline }); bindings.regions = regions.ref; }
|
|
167
|
+
operations.push({ id: "render", producer: regions === undefined ? captionFineProducers.render : captionFineProducers.renderWithRegions,
|
|
168
|
+
inputs: { schedule: operation("schedule"), document: input("document"), timeline: input("timeline"), program: operation(previous), ...(regions === undefined ? {} : { regions: input("regions") }) }, result: { kind: "output", name: "track" } });
|
|
169
|
+
const collector = sealGraphFragment({ inputs, operations, exports: [
|
|
170
|
+
{ name: "content", type: captionTypes.timedProjection, root: operation("content") },
|
|
171
|
+
{ name: "program", type: captionTypes.program, root: operation(previous) },
|
|
172
|
+
{ name: "schedule", type: captionFineTypes.schedule, root: operation("schedule") },
|
|
173
|
+
{ name: "track", type: compositionTypes.visualTrack, root: operation("render") },
|
|
174
|
+
] });
|
|
175
|
+
fragments.push(collector);
|
|
176
|
+
components.push({ id, fragment: collector.id, inputs: bindings,
|
|
177
|
+
outputs: { content: `${id}.content`, program: `${id}.program`, schedule: `${id}.schedule`, track: `${id}.track` }, range: element.range });
|
|
178
|
+
return { records, components, fragments, exports: [`${id}.content`, `${id}.program`, `${id}.schedule`, `${id}.track`] };
|
|
152
179
|
};
|
|
@@ -173,6 +173,8 @@ export type FineCaptionParameters = {
|
|
|
173
173
|
};
|
|
174
174
|
|
|
175
175
|
export type FineCaptionScheduledCue = {
|
|
176
|
+
readonly cueId: string;
|
|
177
|
+
readonly visibility: readonly { readonly startFrame: number; readonly endFrameExclusive: number }[];
|
|
176
178
|
readonly id: string;
|
|
177
179
|
readonly styleId: string;
|
|
178
180
|
readonly semanticStartFrame: number;
|
|
@@ -1,3 +1,25 @@
|
|
|
1
|
-
#
|
|
1
|
+
# Caption Fine Studio Companion
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
One Caption Track contains Cue blocks and a bottom Uses band declared through the public ABI.
|
|
4
|
+
Each Cue has a numbered title such as `#15` and complete subtitle text in its body.
|
|
5
|
+
Cue ids remain the underlying identities; the number is a display label. Cues retain their measured
|
|
6
|
+
times, including content currently hidden by a Use. Their read-only Range describes the content, independently of its visual treatment.
|
|
7
|
+
|
|
8
|
+
The Uses band shows each authored Window once, with its Style name. A whole-Timeline Use remains one
|
|
9
|
+
block across Segment changes and gaps. Hidden and overridden Uses stay selectable. The Companion
|
|
10
|
+
reads the Track's `content`, `schedule` and `program` exports; it never reconstructs author windows
|
|
11
|
+
from the rendered words.
|
|
12
|
+
|
|
13
|
+
Use entities retain the actual child Source range and standard Temporal lineage. Timeline gestures
|
|
14
|
+
therefore use the same writeback rules as Performance and Sound. Selecting a Use exposes its
|
|
15
|
+
referenced Style's font and Recipe fields. Shared Styles remain shared; changing a time window
|
|
16
|
+
changes presentation without editing Script Cue breaks.
|
|
17
|
+
|
|
18
|
+
Studio owns Track bands, block chrome, overlap selection and generic Inspector controls. This Companion owns
|
|
19
|
+
Caption facts, field grouping and Source bindings. Content, Uses and their renderer stay independent
|
|
20
|
+
of central Studio domain logic.
|
|
21
|
+
|
|
22
|
+
Fine Style parameters are a separate `parameters` Companion matched to the Fine Style Surface.
|
|
23
|
+
The Use band opts its `style` reference into the selected object's Companion. Custom Styles can
|
|
24
|
+
provide their own field table through their project package. Supported omitted defaults appear
|
|
25
|
+
in the Inspector and are inserted into the owning Recipe only when edited.
|