@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.
Files changed (486) hide show
  1. package/README.md +5 -3
  2. package/dist/public/caption.d.ts +206 -183
  3. package/dist/public/composition.d.ts +25 -3
  4. package/dist/public/endpoint-kit.d.ts +24 -2
  5. package/dist/public/generation.d.ts +5 -1
  6. package/dist/public/hyperframes.d.ts +19 -1
  7. package/dist/public/narrative.d.ts +17 -3
  8. package/dist/public/performance.d.ts +1590 -0
  9. package/dist/public/program-space.d.ts +179 -32
  10. package/dist/public/runtime-kit.d.ts +21 -8
  11. package/dist/public/sound.d.ts +822 -0
  12. package/dist/public/speech.d.ts +41 -0
  13. package/dist/public/studio-adapter.d.ts +107 -16
  14. package/dist/public/temporal-markup.d.ts +9 -44
  15. package/dist/public/temporal.d.ts +37 -28
  16. package/dist/public/{semantic-track.d.ts → timeline.d.ts} +62 -49
  17. package/examples/README.md +18 -10
  18. package/examples/minimal-author-package/packages/example-component/preview/preview.svml +19 -12
  19. package/examples/minimal-author-package/packages/example-component/src/component.ts +5 -5
  20. package/examples/minimal-author-package/packages/example-component/src/fragment.ts +3 -5
  21. package/examples/minimal-author-package/packages/example-component/src/manifest.ts +8 -10
  22. package/examples/minimal-author-package/packages/example-component/src/surface.ts +2 -2
  23. package/examples/provider-package/README.md +78 -0
  24. package/examples/provider-package/hypit.runtime.json +12 -0
  25. package/examples/provider-package/packages/provider-images/package.json +11 -0
  26. package/examples/provider-package/packages/provider-images/src/activation.ts +24 -0
  27. package/examples/provider-package/packages/provider-images/src/provider.ts +122 -0
  28. package/examples/provider-package/packages/provider-images/tsconfig.json +9 -0
  29. package/examples/semantic-composition/README.md +6 -0
  30. package/examples/semantic-composition/chat.svml +6 -5
  31. package/examples/semantic-composition/packages/chat-scene/README.md +3 -3
  32. package/examples/semantic-composition/packages/chat-scene/src/activation.ts +18 -21
  33. package/examples/semantic-composition/packages/chat-scene/src/render.ts +4 -4
  34. package/examples/semantic-composition/packages/performance-styles/README.md +42 -0
  35. package/examples/semantic-composition/packages/performance-styles/package.json +25 -0
  36. package/examples/semantic-composition/packages/performance-styles/src/activation.ts +57 -0
  37. package/examples/semantic-composition/packages/performance-styles/src/render.ts +54 -0
  38. package/examples/semantic-composition/packages/performance-styles/src/studio.ts +28 -0
  39. package/examples/semantic-composition/packages/performance-styles/tsconfig.json +18 -0
  40. package/examples/semantic-composition/packages/responsive-explainer/README.md +16 -9
  41. package/examples/semantic-composition/packages/responsive-explainer/src/activation.ts +12 -12
  42. package/examples/semantic-composition/packages/responsive-explainer/src/render.ts +5 -5
  43. package/examples/semantic-composition/packages/sound-styles/README.md +36 -0
  44. package/examples/semantic-composition/packages/sound-styles/package.json +25 -0
  45. package/examples/semantic-composition/packages/sound-styles/src/activation.ts +53 -0
  46. package/examples/semantic-composition/packages/sound-styles/src/render.ts +14 -0
  47. package/examples/semantic-composition/packages/sound-styles/tsconfig.json +18 -0
  48. package/package.json +35 -15
  49. package/packages/audio-track/README.md +20 -13
  50. package/packages/audio-track/package.json +1 -1
  51. package/packages/audio-track/src/component.ts +4 -4
  52. package/packages/audio-track/src/fragment.ts +6 -5
  53. package/packages/audio-track/src/index.ts +1 -1
  54. package/packages/audio-track/src/manifest.ts +17 -16
  55. package/packages/audio-track/src/program.ts +21 -25
  56. package/packages/audio-track/src/surface.ts +19 -18
  57. package/packages/audio-track-studio/README.md +23 -0
  58. package/packages/audio-track-studio/src/index.ts +33 -19
  59. package/packages/author-kit/README.md +1 -1
  60. package/packages/background-removal/README.md +4 -7
  61. package/packages/browser-capture/package.json +1 -1
  62. package/packages/build-result/README.md +69 -0
  63. package/packages/build-result/package.json +2 -1
  64. package/packages/build-result/src/decode.ts +12 -8
  65. package/packages/build-result/src/execution-log.ts +17 -0
  66. package/packages/build-result/src/file-reference.ts +42 -0
  67. package/packages/build-result/src/index.ts +4 -0
  68. package/packages/build-result/src/replace-file-windows.ts +58 -0
  69. package/packages/build-result/src/replace-file.ts +11 -0
  70. package/packages/build-result/src/store.ts +58 -14
  71. package/packages/build-result/src/types.ts +41 -8
  72. package/packages/build-result/src/writer.ts +12 -1
  73. package/packages/build-result-fs/README.md +23 -1
  74. package/packages/build-result-s3/README.md +5 -0
  75. package/packages/build-result-s3/src/repository.ts +23 -5
  76. package/packages/caption/README.md +61 -73
  77. package/packages/caption/package.json +3 -2
  78. package/packages/caption/src/activation.ts +2 -2
  79. package/packages/caption/src/component.ts +20 -5
  80. package/packages/caption/src/display.ts +3 -18
  81. package/packages/caption/src/fragment.ts +3 -7
  82. package/packages/caption/src/index.ts +6 -5
  83. package/packages/caption/src/manifest.ts +29 -46
  84. package/packages/caption/src/style.ts +24 -135
  85. package/packages/caption/src/surface.ts +12 -92
  86. package/packages/caption/src/temporalize.ts +18 -53
  87. package/packages/caption/src/types.ts +8 -35
  88. package/packages/caption/src/visibility.ts +23 -0
  89. package/packages/caption-fine/README.md +31 -11
  90. package/packages/caption-fine/package.json +4 -2
  91. package/packages/caption-fine/src/component.ts +3 -3
  92. package/packages/caption-fine/src/fragment.ts +7 -19
  93. package/packages/caption-fine/src/index.ts +2 -0
  94. package/packages/caption-fine/src/manifest.ts +27 -18
  95. package/packages/caption-fine/src/recipe.ts +7 -0
  96. package/packages/caption-fine/src/render.ts +62 -49
  97. package/packages/caption-fine/src/schedule.ts +39 -35
  98. package/packages/caption-fine/src/style.ts +10 -9
  99. package/packages/caption-fine/src/surface.ts +62 -35
  100. package/packages/caption-fine/src/types.ts +2 -0
  101. package/packages/caption-fine-studio/README.md +24 -2
  102. package/packages/caption-fine-studio/package.json +10 -3
  103. package/packages/caption-fine-studio/src/activation.ts +3 -3
  104. package/packages/caption-fine-studio/src/index.ts +61 -40
  105. package/packages/cli/README.md +81 -3
  106. package/packages/cli/package.json +1 -0
  107. package/packages/cli/src/arguments.ts +39 -15
  108. package/packages/cli/src/build-planning.ts +9 -3
  109. package/packages/cli/src/command.ts +7 -1
  110. package/packages/cli/src/commands/environment.ts +66 -27
  111. package/packages/cli/src/commands/execution.ts +81 -26
  112. package/packages/cli/src/commands/results.ts +7 -11
  113. package/packages/cli/src/index.ts +2 -2
  114. package/packages/cli/src/machine-view.ts +15 -5
  115. package/packages/cli/src/main.ts +38 -42
  116. package/packages/cli/src/observation.ts +7 -1
  117. package/packages/cli/src/output.ts +92 -34
  118. package/packages/cli/src/result-export.ts +22 -13
  119. package/packages/cli/src/run-file.ts +19 -8
  120. package/packages/cli/src/view.ts +64 -18
  121. package/packages/comment-sticker/README.md +3 -3
  122. package/packages/comment-sticker/package.json +1 -1
  123. package/packages/comment-sticker/src/component.ts +4 -4
  124. package/packages/comment-sticker/src/fragment.ts +5 -4
  125. package/packages/comment-sticker/src/manifest.ts +7 -6
  126. package/packages/comment-sticker/src/program.ts +9 -9
  127. package/packages/comment-sticker/src/surface.ts +6 -7
  128. package/packages/comment-sticker-studio/src/index.ts +2 -1
  129. package/packages/compiler-node/src/compiler.ts +1 -0
  130. package/packages/composition/README.md +21 -0
  131. package/packages/composition/src/audio-presentation.ts +44 -0
  132. package/packages/composition/src/index.ts +3 -0
  133. package/packages/composition/src/schema.ts +8 -3
  134. package/packages/composition/src/track.ts +15 -1
  135. package/packages/credential-store-env/README.md +1 -1
  136. package/packages/deck-track/README.md +3 -3
  137. package/packages/deck-track/package.json +1 -1
  138. package/packages/deck-track/src/component.ts +5 -5
  139. package/packages/deck-track/src/fragment.ts +6 -5
  140. package/packages/deck-track/src/lower.ts +12 -12
  141. package/packages/deck-track/src/manifest.ts +8 -7
  142. package/packages/deck-track/src/program.ts +13 -16
  143. package/packages/deck-track/src/surface.ts +9 -10
  144. package/packages/driver-node/src/driver.ts +41 -3
  145. package/packages/elevenlabs-speech/README.md +27 -0
  146. package/packages/{provider-xiaomi-mimo → elevenlabs-speech}/package.json +5 -8
  147. package/packages/elevenlabs-speech/src/activation.ts +26 -0
  148. package/packages/elevenlabs-speech/src/fragment.ts +11 -0
  149. package/packages/elevenlabs-speech/src/index.ts +111 -0
  150. package/packages/elevenlabs-speech/src/surface.ts +167 -0
  151. package/packages/endpoint-kit/README.md +24 -0
  152. package/packages/endpoint-kit/src/index.ts +7 -1
  153. package/packages/estimate/README.md +56 -3
  154. package/packages/estimate/src/program.ts +7 -8
  155. package/packages/film/README.md +12 -7
  156. package/packages/film/package.json +1 -1
  157. package/packages/film/src/component.ts +4 -4
  158. package/packages/film/src/fragment.ts +6 -5
  159. package/packages/film/src/manifest.ts +11 -10
  160. package/packages/film/src/program.ts +5 -5
  161. package/packages/film/src/recipe.ts +2 -1
  162. package/packages/film/src/surface.ts +6 -6
  163. package/packages/film-studio/package.json +1 -1
  164. package/packages/film-studio/src/index.ts +2 -2
  165. package/packages/fishaudio-speech/README.md +33 -0
  166. package/packages/fishaudio-speech/package.json +21 -0
  167. package/packages/fishaudio-speech/src/activation.ts +32 -0
  168. package/packages/fishaudio-speech/src/fragment.ts +11 -0
  169. package/packages/fishaudio-speech/src/index.ts +156 -0
  170. package/packages/fishaudio-speech/src/surface.ts +192 -0
  171. package/packages/fonts-open/README.md +5 -0
  172. package/packages/fonts-open/package.json +5 -1
  173. package/packages/fonts-open/src/studio.ts +21 -0
  174. package/packages/generation/README.md +11 -1
  175. package/packages/generation/src/mapping.ts +28 -30
  176. package/packages/gpt-image/README.md +1 -2
  177. package/packages/grok-imagine/README.md +1 -2
  178. package/packages/hyperframes/README.md +7 -3
  179. package/packages/hyperframes/src/browser-program.ts +11 -2
  180. package/packages/hyperframes/src/document.ts +15 -2
  181. package/packages/interview-emoji-reveal/README.md +4 -4
  182. package/packages/interview-emoji-reveal/package.json +1 -1
  183. package/packages/interview-emoji-reveal/src/component.ts +4 -4
  184. package/packages/interview-emoji-reveal/src/fragment.ts +6 -5
  185. package/packages/interview-emoji-reveal/src/manifest.ts +9 -8
  186. package/packages/interview-emoji-reveal/src/program.ts +14 -14
  187. package/packages/interview-emoji-reveal/src/surface.ts +8 -9
  188. package/packages/media-execution/README.md +7 -3
  189. package/packages/media-execution/src/audio-presentation.ts +23 -0
  190. package/packages/media-execution/src/execute.ts +2 -0
  191. package/packages/media-pipeline/README.md +7 -3
  192. package/packages/media-pipeline/src/audio-plan.ts +4 -1
  193. package/packages/media-pipeline/src/component.ts +16 -2
  194. package/packages/media-pipeline/src/manifest.ts +3 -1
  195. package/packages/media-pipeline/src/types.ts +2 -1
  196. package/packages/media-track/README.md +14 -47
  197. package/packages/media-track/package.json +1 -1
  198. package/packages/media-track/preview/preview.svml +5 -5
  199. package/packages/media-track/src/author.ts +12 -6
  200. package/packages/media-track/src/component.ts +10 -16
  201. package/packages/media-track/src/fragment.ts +8 -7
  202. package/packages/media-track/src/index.ts +3 -1
  203. package/packages/media-track/src/lower.ts +7 -7
  204. package/packages/media-track/src/manifest.ts +16 -38
  205. package/packages/media-track/src/program.ts +62 -67
  206. package/packages/media-track/src/sampling.ts +6 -6
  207. package/packages/media-track/src/sequence.ts +8 -8
  208. package/packages/media-track/src/surface.ts +25 -43
  209. package/packages/media-track-studio/README.md +9 -0
  210. package/packages/media-track-studio/src/index.ts +23 -13
  211. package/packages/mimo-speech/README.md +1 -1
  212. package/packages/minimax-h3/README.md +1 -1
  213. package/packages/nano-banana/README.md +1 -1
  214. package/packages/narrative/README.md +23 -1
  215. package/packages/narrative/src/identity.ts +11 -0
  216. package/packages/narrative/src/index.ts +3 -0
  217. package/packages/narrative/src/schema.ts +28 -27
  218. package/packages/narrative/src/selection.ts +52 -0
  219. package/packages/narrative/src/types.ts +2 -0
  220. package/packages/package-loader-node/README.md +30 -0
  221. package/packages/package-loader-node/package.json +5 -2
  222. package/packages/package-loader-node/src/distribution-resolution.ts +10 -3
  223. package/packages/package-loader-node/src/index.ts +1 -0
  224. package/packages/package-loader-node/src/loader.ts +12 -15
  225. package/packages/package-loader-node/src/location.ts +27 -1
  226. package/packages/package-loader-node/src/module-scope.ts +183 -0
  227. package/packages/package-loader-node/src/types.ts +4 -0
  228. package/packages/performance/README.md +83 -0
  229. package/packages/performance/package.json +30 -0
  230. package/packages/performance/src/activation.ts +11 -0
  231. package/packages/performance/src/component.ts +46 -0
  232. package/packages/performance/src/index.ts +6 -0
  233. package/packages/performance/src/manifest.ts +53 -0
  234. package/packages/{media-track/src/performance.ts → performance/src/media.ts} +9 -10
  235. package/packages/performance/src/program.ts +51 -0
  236. package/packages/performance/src/style.ts +35 -0
  237. package/packages/performance/src/surface.ts +99 -0
  238. package/packages/performance-studio/README.md +25 -0
  239. package/packages/performance-studio/package.json +21 -0
  240. package/packages/performance-studio/src/activation.ts +6 -0
  241. package/packages/performance-studio/src/index.ts +84 -0
  242. package/packages/program-space/README.md +9 -18
  243. package/packages/program-space/src/activation.ts +1 -5
  244. package/packages/program-space/src/index.ts +2 -11
  245. package/packages/program-space/src/surface.ts +1 -20
  246. package/packages/project-context-node/README.md +20 -0
  247. package/packages/project-context-node/package.json +10 -0
  248. package/packages/project-context-node/src/index.ts +3 -0
  249. package/packages/{cli → project-context-node}/src/runtime-selection.ts +7 -2
  250. package/packages/provider-hyperframes-local/README.md +43 -15
  251. package/packages/provider-hyperframes-local/src/activation.ts +4 -3
  252. package/packages/provider-hyperframes-local/src/capture-process.ts +26 -4
  253. package/packages/provider-hyperframes-local/src/capture.ts +96 -26
  254. package/packages/provider-hyperframes-local/src/concurrency.ts +86 -0
  255. package/packages/provider-hyperframes-local/src/opaque-capture.ts +92 -0
  256. package/packages/provider-hyperframes-local/src/options.ts +2 -0
  257. package/packages/provider-hyperframes-local/src/program.ts +6 -3
  258. package/packages/provider-hyperframes-local/src/progress.ts +53 -0
  259. package/packages/provider-hyperframes-local/src/provider.ts +18 -5
  260. package/packages/provider-hyperframes-local/src/render.ts +48 -7
  261. package/packages/provider-hypihub/README.md +48 -17
  262. package/packages/provider-hypihub/package.json +2 -0
  263. package/packages/provider-hypihub/src/mapping.ts +31 -7
  264. package/packages/provider-hypihub/src/oauth.ts +6 -0
  265. package/packages/provider-hypihub/src/provider.ts +25 -13
  266. package/packages/provider-hypihub/src/routes.ts +1 -2
  267. package/packages/provider-hypihub/src/upload.ts +2 -0
  268. package/packages/provider-media-local/README.md +3 -4
  269. package/packages/provider-whisperx-local/README.md +57 -0
  270. package/packages/provider-whisperx-local/src/program.ts +1 -0
  271. package/packages/provider-whisperx-local/src/provider.ts +3 -0
  272. package/packages/ranking/README.md +8 -6
  273. package/packages/ranking/package.json +1 -1
  274. package/packages/ranking/src/component.ts +6 -6
  275. package/packages/ranking/src/fragment.ts +11 -7
  276. package/packages/ranking/src/manifest.ts +21 -14
  277. package/packages/ranking/src/render.ts +33 -35
  278. package/packages/ranking/src/schedule.ts +16 -19
  279. package/packages/ranking/src/surface.ts +12 -13
  280. package/packages/ranking-studio/README.md +29 -0
  281. package/packages/ranking-studio/package.json +8 -3
  282. package/packages/ranking-studio/src/index.ts +71 -12
  283. package/packages/render-hyperframes/README.md +7 -7
  284. package/packages/render-hyperframes/package.json +1 -1
  285. package/packages/render-hyperframes/src/component.ts +11 -1
  286. package/packages/render-hyperframes/src/fragment.ts +7 -4
  287. package/packages/render-hyperframes/src/manifest.ts +4 -4
  288. package/packages/render-hyperframes/src/surface.ts +6 -6
  289. package/packages/runtime/README.md +8 -1
  290. package/packages/runtime/src/catalog.ts +2 -0
  291. package/packages/runtime/src/execution.ts +15 -4
  292. package/packages/runtime/src/index.ts +2 -1
  293. package/packages/runtime/src/log.ts +51 -0
  294. package/packages/runtime/src/types.ts +5 -8
  295. package/packages/runtime-host-node/README.md +30 -0
  296. package/packages/runtime-host-node/package.json +1 -0
  297. package/packages/runtime-host-node/src/index.ts +25 -9
  298. package/packages/runtime-host-node/src/packages.ts +47 -50
  299. package/packages/runtime-kit/README.md +5 -0
  300. package/packages/runtime-kit/src/index.ts +3 -1
  301. package/packages/runtime-local/README.md +111 -4
  302. package/packages/runtime-local/src/config.ts +202 -56
  303. package/packages/runtime-local/src/control.ts +9 -1
  304. package/packages/runtime-local/src/executor.ts +66 -0
  305. package/packages/runtime-local/src/host.ts +37 -17
  306. package/packages/runtime-local/src/log.ts +48 -0
  307. package/packages/runtime-local/src/programs.ts +41 -25
  308. package/packages/runtime-local/src/result-writer.ts +2 -0
  309. package/packages/runtime-local/src/runtime.ts +10 -6
  310. package/packages/runtime-local/src/supervisor.ts +142 -0
  311. package/packages/runtime-local/src/types.ts +9 -2
  312. package/packages/runtime-local/src/worker-process.ts +7 -24
  313. package/packages/runtime-local/src/worker.ts +55 -83
  314. package/packages/screen-overlay/README.md +3 -3
  315. package/packages/screen-overlay/package.json +1 -1
  316. package/packages/screen-overlay/src/component.ts +3 -3
  317. package/packages/screen-overlay/src/fragment.ts +5 -4
  318. package/packages/screen-overlay/src/manifest.ts +7 -6
  319. package/packages/screen-overlay/src/program.ts +9 -9
  320. package/packages/screen-overlay/src/surface.ts +6 -7
  321. package/packages/script/README.md +37 -2
  322. package/packages/script/src/edit.ts +123 -73
  323. package/packages/script/src/lexical.ts +40 -6
  324. package/packages/script/src/manifest.ts +2 -2
  325. package/packages/script/src/narrative.ts +1 -0
  326. package/packages/script/src/parser.ts +36 -8
  327. package/packages/script/src/surface.ts +4 -3
  328. package/packages/script/src/types.ts +5 -1
  329. package/packages/script-studio/package.json +9 -3
  330. package/packages/script-studio/src/index.ts +2 -0
  331. package/packages/script-studio/src/projection.ts +105 -0
  332. package/packages/seedance/README.md +30 -1
  333. package/packages/seedance/src/index.ts +18 -7
  334. package/packages/seedance/src/surface.ts +17 -4
  335. package/packages/seedance-kits/README.md +10 -2
  336. package/packages/seedance-kits/kits/speaker-v1.svs +5 -5
  337. package/packages/seedream/README.md +1 -1
  338. package/packages/sound/README.md +81 -0
  339. package/packages/sound/package.json +25 -0
  340. package/packages/sound/src/activation.ts +11 -0
  341. package/packages/sound/src/component.ts +28 -0
  342. package/packages/sound/src/index.ts +5 -0
  343. package/packages/sound/src/manifest.ts +47 -0
  344. package/packages/sound/src/program.ts +84 -0
  345. package/packages/sound/src/style.ts +34 -0
  346. package/packages/sound/src/surface.ts +90 -0
  347. package/packages/sound-studio/README.md +22 -0
  348. package/packages/sound-studio/package.json +20 -0
  349. package/packages/sound-studio/src/activation.ts +6 -0
  350. package/packages/sound-studio/src/index.ts +74 -0
  351. package/packages/speech/README.md +2 -2
  352. package/packages/speech-alignment/src/align.ts +45 -21
  353. package/packages/speech-alignment/src/local.ts +8 -0
  354. package/packages/speech-alignment/src/locate.ts +1 -1
  355. package/packages/store-sqlite/README.md +7 -0
  356. package/packages/store-sqlite/src/store.ts +84 -83
  357. package/packages/studio/INSPECTOR.md +117 -0
  358. package/packages/studio/README.md +149 -14
  359. package/packages/studio/package.json +8 -7
  360. package/packages/studio/src/build-library.ts +99 -84
  361. package/packages/studio/src/companion-assembly.ts +1 -0
  362. package/packages/studio/src/domain.ts +1 -1
  363. package/packages/studio/src/fallback-companions.ts +3 -3
  364. package/packages/studio/src/feedback-server.ts +51 -0
  365. package/packages/studio/src/feedback-store.ts +66 -0
  366. package/packages/studio/src/feedback.ts +60 -0
  367. package/packages/studio/src/library-media.ts +19 -0
  368. package/packages/studio/src/parameter-values.ts +83 -1
  369. package/packages/studio/src/parameters.ts +132 -43
  370. package/packages/studio/src/preview/render.ts +5 -1
  371. package/packages/studio/src/preview/runtime-shim.ts +49 -3
  372. package/packages/studio/src/programme.ts +14 -30
  373. package/packages/studio/src/server.ts +66 -34
  374. package/packages/studio/src/shared.ts +24 -8
  375. package/packages/studio/src/snapshot.ts +21 -132
  376. package/packages/studio/src/studio-preflight.ts +3 -3
  377. package/packages/studio/src/studio-registry.ts +72 -6
  378. package/packages/studio/src/style.css +342 -190
  379. package/packages/studio/src/temporal-edit.ts +131 -0
  380. package/packages/studio/src/ui/artifact-name.ts +80 -0
  381. package/packages/studio/src/ui/artifact-preview.ts +99 -0
  382. package/packages/studio/src/ui/comments.ts +233 -0
  383. package/packages/studio/src/ui/icons.ts +10 -1
  384. package/packages/studio/src/ui/library.ts +373 -192
  385. package/packages/studio/src/ui/main.ts +291 -110
  386. package/packages/studio/src/ui/material-preview.ts +1 -1
  387. package/packages/studio/src/ui/overlay.ts +31 -26
  388. package/packages/studio/src/ui/scrub-preview.ts +108 -0
  389. package/packages/studio/src/ui/sidebar-panel.ts +31 -0
  390. package/packages/studio/src/ui/stage.ts +188 -9
  391. package/packages/studio/src/ui/timeline.ts +187 -281
  392. package/packages/studio/start.ts +19 -5
  393. package/packages/studio-adapter/README.md +151 -11
  394. package/packages/studio-adapter/src/index.ts +126 -14
  395. package/packages/temporal/README.md +6 -6
  396. package/packages/temporal/package.json +1 -1
  397. package/packages/temporal/src/component.ts +5 -6
  398. package/packages/temporal/src/index.ts +8 -6
  399. package/packages/temporal/src/location.ts +11 -11
  400. package/packages/temporal/src/projection.ts +19 -19
  401. package/packages/temporal/src/rational.ts +4 -4
  402. package/packages/temporal-markup/EDITING.md +183 -0
  403. package/packages/temporal-markup/README.md +31 -11
  404. package/packages/temporal-markup/package.json +1 -1
  405. package/packages/temporal-markup/src/index.ts +20 -25
  406. package/packages/temporal-markup/src/space.ts +10 -41
  407. package/packages/timeline/README.md +31 -0
  408. package/packages/{semantic-track → timeline}/package.json +1 -1
  409. package/packages/timeline/src/activation.ts +8 -0
  410. package/packages/timeline/src/component.ts +24 -0
  411. package/packages/timeline/src/identity.ts +60 -0
  412. package/packages/timeline/src/index.ts +6 -0
  413. package/packages/{semantic-track → timeline}/src/location.ts +20 -20
  414. package/packages/timeline/src/manifest.ts +39 -0
  415. package/packages/{semantic-track → timeline}/src/projection.ts +14 -14
  416. package/packages/timeline/src/types.ts +24 -0
  417. package/packages/timeline-author/README.md +68 -0
  418. package/packages/{speech-track → timeline-author}/package.json +6 -4
  419. package/packages/timeline-author/src/activation.ts +22 -0
  420. package/packages/{speech-track → timeline-author}/src/component.ts +15 -13
  421. package/packages/{speech-track → timeline-author}/src/fragment.ts +14 -23
  422. package/packages/timeline-author/src/index.ts +7 -0
  423. package/packages/timeline-author/src/manifest.ts +78 -0
  424. package/packages/timeline-author/src/program.ts +107 -0
  425. package/packages/timeline-author/src/surface.ts +46 -0
  426. package/packages/timeline-author/src/types.ts +6 -0
  427. package/packages/typography-track/README.md +4 -4
  428. package/packages/typography-track/package.json +1 -1
  429. package/packages/typography-track/src/component.ts +4 -4
  430. package/packages/typography-track/src/fragment.ts +4 -3
  431. package/packages/typography-track/src/manifest.ts +11 -9
  432. package/packages/typography-track/src/program.ts +15 -15
  433. package/packages/typography-track/src/surface.ts +17 -18
  434. package/packages/typography-track-studio/package.json +8 -3
  435. package/packages/typography-track-studio/src/index.ts +5 -1
  436. package/packages/video-cli/README.md +16 -4
  437. package/packages/video-cli/package.json +2 -1
  438. package/packages/video-cli/src/creation.ts +25 -9
  439. package/packages/video-cli/src/index.ts +1 -1
  440. package/packages/video-cli/src/studio-distribution.ts +2 -1
  441. package/packages/volcengine-matting/README.md +3 -3
  442. package/packages/whisperx/README.md +8 -1
  443. package/packages/workspace/src/index.ts +2 -0
  444. package/packages/workspace-fs-node/README.md +4 -1
  445. package/packages/workspace-fs-node/src/workspace.ts +3 -1
  446. package/services/whisperx/README.md +14 -0
  447. package/services/whisperx/pyproject.toml +2 -0
  448. package/services/whisperx/uv.lock +20 -20
  449. package/packages/provider-hyperframes-aws-lambda/README.md +0 -30
  450. package/packages/provider-hyperframes-aws-lambda/package.json +0 -30
  451. package/packages/provider-hyperframes-aws-lambda/src/activation.ts +0 -97
  452. package/packages/provider-hyperframes-aws-lambda/src/client.ts +0 -114
  453. package/packages/provider-hyperframes-aws-lambda/src/index.ts +0 -21
  454. package/packages/provider-hyperframes-aws-lambda/src/provider.ts +0 -522
  455. package/packages/provider-kie/README.md +0 -134
  456. package/packages/provider-kie/package.json +0 -43
  457. package/packages/provider-kie/src/activation.ts +0 -71
  458. package/packages/provider-kie/src/index.ts +0 -10
  459. package/packages/provider-kie/src/mapping.ts +0 -182
  460. package/packages/provider-kie/src/provider.ts +0 -657
  461. package/packages/provider-kie/src/routes.ts +0 -150
  462. package/packages/provider-xiaomi-mimo/README.md +0 -32
  463. package/packages/provider-xiaomi-mimo/src/activation.ts +0 -57
  464. package/packages/provider-xiaomi-mimo/src/index.ts +0 -5
  465. package/packages/provider-xiaomi-mimo/src/provider.ts +0 -214
  466. package/packages/runtime/src/environment.ts +0 -6
  467. package/packages/semantic-track/README.md +0 -21
  468. package/packages/semantic-track/src/activation.ts +0 -8
  469. package/packages/semantic-track/src/component.ts +0 -24
  470. package/packages/semantic-track/src/identity.ts +0 -58
  471. package/packages/semantic-track/src/index.ts +0 -6
  472. package/packages/semantic-track/src/manifest.ts +0 -38
  473. package/packages/semantic-track/src/types.ts +0 -26
  474. package/packages/speech-track/README.md +0 -51
  475. package/packages/speech-track/src/activation.ts +0 -19
  476. package/packages/speech-track/src/index.ts +0 -7
  477. package/packages/speech-track/src/manifest.ts +0 -73
  478. package/packages/speech-track/src/program.ts +0 -64
  479. package/packages/speech-track/src/surface.ts +0 -35
  480. package/packages/speech-track/src/types.ts +0 -6
  481. package/packages/speech-track-studio/README.md +0 -3
  482. package/packages/speech-track-studio/package.json +0 -14
  483. package/packages/speech-track-studio/src/activation.ts +0 -7
  484. package/packages/speech-track-studio/src/index.ts +0 -40
  485. /package/packages/{cli → project-context-node}/src/project-context.ts +0 -0
  486. /package/packages/{speech-track → timeline-author}/preview/Track.png +0 -0
@@ -1,3 +1,4 @@
1
+ import type { Timeline } from "@hypit/timeline";
1
2
  import { temporalContextAttributeVocabulary } from "@hypit/temporal-markup";
2
3
  import { visualTimedSamplingSchema } from "@hypit/composition";
3
4
  import { readFile } from "node:fs/promises";
@@ -10,9 +11,9 @@ import {
10
11
  mediaTypes,
11
12
  } from "@hypit/media";
12
13
  import { narrativeDependency, narrativeTypes } from "@hypit/narrative";
13
- import { programSpaceDependency, programSpaceTypes } from "@hypit/program-space";
14
+
14
15
  import type { ModuleManifest, ProducerRef, TypeRef, ValueSchema } from "@hypit/protocol";
15
- import { semanticTrackDependency, semanticTrackTypes } from "@hypit/semantic-track";
16
+ import { timelineDependency, timelineTypes } from "@hypit/timeline";
16
17
  import {
17
18
  contentFitSchema,
18
19
  intrinsicExtentSchema,
@@ -48,7 +49,6 @@ export const mediaTrackTypes = {
48
49
  } satisfies Record<string, TypeRef>;
49
50
 
50
51
  export const mediaTrackProducers = {
51
- appendPerformance: { module: mediaTrackModuleRef, name: "append-media-performance" },
52
52
  createLayers: { module: mediaTrackModuleRef, name: "create-media-layer-set" },
53
53
  appendPaintLayer: { module: mediaTrackModuleRef, name: "append-media-paint-layer" },
54
54
  appendStillLayer: { module: mediaTrackModuleRef, name: "append-still-media-layer" },
@@ -256,18 +256,18 @@ export const mediaTrackHeaderSchema: ValueSchema = object({
256
256
 
257
257
  const itemInputs = [
258
258
  { name: "set", type: mediaTrackTypes.set }, { name: "header", type: mediaTrackTypes.header },
259
- { name: "space", type: programSpaceTypes.programSpace }, { name: "canvas", type: spatialTypes.canvas },
259
+ { name: "timeline", type: timelineTypes.track }, { name: "canvas", type: spatialTypes.canvas },
260
260
  { name: "layers", type: mediaTrackTypes.layerSet },
261
261
  { name: "frame", type: spatialTypes.frame }, { name: "spec", type: mediaTrackTypes.itemSpec },
262
262
  { name: "sounds", type: mediaTrackTypes.soundSet }, { name: "window", type: temporalTypes.window },
263
263
  ] as const;
264
264
  const memberInputs = [
265
- { name: "members", type: mediaTrackTypes.memberSet }, { name: "space", type: programSpaceTypes.programSpace }, { name: "layers", type: mediaTrackTypes.layerSet },
265
+ { name: "members", type: mediaTrackTypes.memberSet }, { name: "timeline", type: timelineTypes.track }, { name: "layers", type: mediaTrackTypes.layerSet },
266
266
  { name: "spec", type: mediaTrackTypes.memberSpec }, { name: "activation", type: temporalTypes.instant },
267
267
  ] as const;
268
268
  const sequenceInputs = [
269
269
  { name: "set", type: mediaTrackTypes.set }, { name: "header", type: mediaTrackTypes.header },
270
- { name: "space", type: programSpaceTypes.programSpace }, { name: "canvas", type: spatialTypes.canvas },
270
+ { name: "timeline", type: timelineTypes.track }, { name: "canvas", type: spatialTypes.canvas },
271
271
  { name: "members", type: mediaTrackTypes.memberSet },
272
272
  { name: "frame", type: spatialTypes.frame }, { name: "spec", type: mediaTrackTypes.sequenceSpec },
273
273
  { name: "sounds", type: mediaTrackTypes.soundSet }, { name: "terminal", type: temporalTypes.instant },
@@ -368,7 +368,7 @@ export const mediaTrackMarkupSurfaces = [{
368
368
  temporalTypes.instantSpec, temporalTypes.windowSpec, temporalTypes.instant, temporalTypes.window, mediaTrackTypes.program,
369
369
  compositionTypes.visualTrack, compositionTypes.audioTrack],
370
370
  vocabulary: {
371
- summary: "Show the semantic performance, place independent media Items, and compose replacement Sequences on a shared film time axis and Canvas. Publishes a VisualTrack and, when audio is authored, an AudioTrack.",
371
+ summary: "Show the timeline performance, place independent media Items, and compose replacement Sequences on a shared film time axis and Canvas. Publishes a VisualTrack and, when audio is authored, an AudioTrack.",
372
372
  appearance: "Pictures and layered compositions occupy authored Frames on the Canvas. Each source is scaled and aligned inside its Frame's border and padding; a contain fit can leave space, while cover can crop. Paint and sampled Layers draw in Source order under a shared rectangular, rounded or Path clip, with optional border and shadows. Lifecycle motion moves the framed unit; Sampling pans, zooms or rotates the picture inside it. Each Item has an independent window. A Sequence shares one outer Frame while Members replace its contents through cut, crossfade, push, wipe, cover or page-turn Handoffs. Source playback determines whether moving content covers the whole assigned span. Absolute stack order decides which overlapping unit draws in front.",
373
373
  preview: previewImage("Track.png"),
374
374
  attributes: [
@@ -379,23 +379,6 @@ export const mediaTrackMarkupSurfaces = [{
379
379
  summary: "Chooses the Canvas every Frame on this Track is measured inside." },
380
380
  ],
381
381
  children: [
382
- { tag: "Performance", cardinality: "many",
383
- summary: "Shows the enclosing Track's semantic performance during a chosen interval, preserving each Take's original source position under one frame and continuous motion. Accepts Sampling and Sound children.",
384
- attributes: [
385
- { name: "id", kind: "identifier", required: false,
386
- summary: "Names this presentation; otherwise its identity follows the shared Item/Performance order." },
387
- { name: "frame", kind: "reference", required: true, accepts: [spatialTypes.frame],
388
- summary: "Places the performance picture on the Canvas." },
389
- { name: "appearance", kind: "reference", required: true, accepts: [svsRecipeType],
390
- summary: "Uses the Media fitting, picture styling, frame paint, clipping, border and shadow properties. Source time follows the semantic performance.",
391
- recipe: appearanceRecipeProperties.filter(property => !["playback", "trim-start", "trim-end"].includes(property.name)) },
392
- { name: "motion", kind: "reference", required: false, accepts: [svsRecipeType],
393
- summary: "Moves the whole framed presentation over its Window, across Take boundaries.",
394
- recipe: motionRecipeProperties },
395
- { name: "clip", kind: "reference", required: false, accepts: [spatialTypes.path],
396
- summary: "Clips the presentation to an authored Path." },
397
- ...temporalWindowAttributeVocabulary,
398
- ] },
399
382
  { tag: "Item", cardinality: "many",
400
383
  summary: "One independently timed picture on its own Frame, from a direct source or ordered Paint and Layer children, carrying its own Sampling and Sound children.",
401
384
  attributes: [
@@ -458,19 +441,18 @@ export const mediaTrackMarkupSurfaces = [{
458
441
  example: `<pipeline:Normalize id="cutaway-bags" source={bags-take.video}
459
442
  video="primary-moving" audio="none" span-authority="video" clock={clock}/>
460
443
 
461
- <media-track:Track id="cutaways" semantic={speech.semantic} canvas={vertical}>
462
- <media-track:Performance during="program" frame={full} appearance={recipes.media.presenter}/>
444
+ <media-track:Track id="cutaways" timeline={speech.timeline} canvas={vertical}>
445
+ <media-track:Item media={prepared.media} during="program" frame={full} appearance={recipes.media.clip}/>
463
446
  <media-track:Item id="bags" media={cutaway-bags.media} during={story.selection.bags}
464
447
  frame={full} appearance={recipes.media.cutaway} motion={recipes.motion.cut}/>
465
448
  </media-track:Track>`,
466
449
  notes: [
467
- "A Track requires at least one Performance, Item or Sequence and accepts no text content.",
468
- "Performance and Item use one window form: `during`, `at` with `for`, `until` with `for`, or `start` with `end`. Bind `selection`, `segment` and/or `moment` only when the start/end expressions use them; different endpoints can use different bindings.",
469
- "Performance uses the Track's existing semantic input. `during=\"program\"` shows all its prepared Takes in order; a Segment or Selection shows that interval at the corresponding source positions. Speech Track.audio independently supplies the original sound. Sampling pans, zooms or rotates the fitted picture across the whole selected Window.",
450
+ "A Track requires at least one Item or Sequence and accepts no text content.",
451
+ "Item use one window form: `during`, `at` with `for`, `until` with `for`, or `start` with `end`. Bind `selection`, `segment` and/or `moment` only when the start/end expressions use them; different endpoints can use different bindings.",
470
452
  "A point expression is `program.start`, `program.end`, `selection.start`, `selection.end`, `segment.start`, `segment.end` or `moment.cue`, each optionally offset by `+` or `-` and a duration, or a bare duration read as an absolute position.",
471
453
  "A unit that names a direct source names exactly one of `image`, `media` or `surface`; `extent` is required with `image` and refused otherwise.",
472
454
  "`audio-gain` is refused without selected source audio.",
473
- "`clip` is refused on a Performance, Item or Sequence whose Recipe already states a clip.",
455
+ "`clip` is refused on a Item or Sequence whose Recipe already states a clip.",
474
456
  "An `appearance` or `motion` Recipe is refused when it carries a property outside its own set.",
475
457
  "`playback`, `trim-start` and `trim-end` are refused on durationless still material, and `trim-start` and `trim-end` are written together or not at all.",
476
458
  "An `enter` or an `exit` operator requires its own `enter-frames` or `exit-frames`.",
@@ -575,8 +557,7 @@ export const mediaTrackManifest: ModuleManifest = {
575
557
  artifactDependency,
576
558
  mediaDependency,
577
559
  narrativeDependency,
578
- programSpaceDependency,
579
- semanticTrackDependency,
560
+ timelineDependency,
580
561
  temporalDependency,
581
562
  spatialDependency,
582
563
  compositionDependency,
@@ -606,18 +587,15 @@ export const mediaTrackManifest: ModuleManifest = {
606
587
  { name: mediaTrackProducers.createSounds.name, inputs: [], outputs: [{ name: "sounds", type: mediaTrackTypes.soundSet }], needs: [] },
607
588
  { name: mediaTrackProducers.appendSound.name, inputs: [{ name: "sounds", type: mediaTrackTypes.soundSet }, { name: "source", type: mediaTypes.synchronized }, { name: "spec", type: mediaTrackTypes.soundSpec }], outputs: [{ name: "sounds", type: mediaTrackTypes.soundSet }], needs: [] },
608
589
  { name: mediaTrackProducers.createSet.name, inputs: [], outputs: [{ name: "set", type: mediaTrackTypes.set }], needs: [] },
609
- { name: mediaTrackProducers.appendPerformance.name, inputs: [...itemInputs,
610
- { name: "semantic", type: semanticTrackTypes.track }, { name: "fit", type: spatialTypes.fit },
611
- { name: "sampleSpec", type: mediaTrackTypes.sampleLayerSpec }], outputs: [{ name: "set", type: mediaTrackTypes.set }], needs: [] },
612
590
  { name: mediaTrackProducers.appendItem.name, inputs: itemInputs, outputs: [{ name: "set", type: mediaTrackTypes.set }], needs: [] },
613
591
  { name: mediaTrackProducers.bindItemClipPath.name, inputs: [{ name: "spec", type: mediaTrackTypes.itemSpec }, { name: "path", type: spatialTypes.path }], outputs: [{ name: "spec", type: mediaTrackTypes.itemSpec }], needs: [] },
614
592
  { name: mediaTrackProducers.bindSequenceClipPath.name, inputs: [{ name: "spec", type: mediaTrackTypes.sequenceSpec }, { name: "path", type: spatialTypes.path }], outputs: [{ name: "spec", type: mediaTrackTypes.sequenceSpec }], needs: [] },
615
593
  { name: mediaTrackProducers.createMembers.name, inputs: [], outputs: [{ name: "members", type: mediaTrackTypes.memberSet }], needs: [] },
616
594
  { name: mediaTrackProducers.appendMember.name, inputs: memberInputs, outputs: [{ name: "members", type: mediaTrackTypes.memberSet }], needs: [] },
617
595
  { name: mediaTrackProducers.appendSequence.name, inputs: sequenceInputs, outputs: [{ name: "set", type: mediaTrackTypes.set }], needs: [] },
618
- { name: mediaTrackProducers.finalize.name, inputs: [{ name: "set", type: mediaTrackTypes.set }, { name: "header", type: mediaTrackTypes.header }, { name: "space", type: programSpaceTypes.programSpace }], outputs: [{ name: "program", type: mediaTrackTypes.program }], needs: [] },
619
- { name: mediaTrackProducers.projectVisual.name, inputs: [{ name: "space", type: programSpaceTypes.programSpace }, { name: "program", type: mediaTrackTypes.program }], outputs: [{ name: "track", type: compositionTypes.visualTrack }], needs: [] },
620
- { name: mediaTrackProducers.projectAudio.name, inputs: [{ name: "space", type: programSpaceTypes.programSpace }, { name: "program", type: mediaTrackTypes.program }], outputs: [{ name: "track", type: compositionTypes.audioTrack }], needs: [] },
596
+ { name: mediaTrackProducers.finalize.name, inputs: [{ name: "set", type: mediaTrackTypes.set }, { name: "header", type: mediaTrackTypes.header }, { name: "timeline", type: timelineTypes.track }], outputs: [{ name: "program", type: mediaTrackTypes.program }], needs: [] },
597
+ { name: mediaTrackProducers.projectVisual.name, inputs: [{ name: "timeline", type: timelineTypes.track }, { name: "program", type: mediaTrackTypes.program }], outputs: [{ name: "track", type: compositionTypes.visualTrack }], needs: [] },
598
+ { name: mediaTrackProducers.projectAudio.name, inputs: [{ name: "timeline", type: timelineTypes.track }, { name: "program", type: mediaTrackTypes.program }], outputs: [{ name: "track", type: compositionTypes.audioTrack }], needs: [] },
621
599
  ],
622
600
  };
623
601
 
@@ -1,3 +1,4 @@
1
+ import type { Timeline } from "@hypit/timeline";
1
2
  import {
2
3
  assertAudioTrackIdentity,
3
4
  assertVisualTrackIdentity,
@@ -5,13 +6,7 @@ import {
5
6
  sealVisualTrack,
6
7
  } from "@hypit/composition";
7
8
  import type { AudioClip, AudioTrack, VisualTrack } from "@hypit/composition";
8
- import {
9
- assertProgramSpaceIdentity,
10
- programFrameSampleBoundary,
11
- programSpaceFrameCount,
12
- programSpaceSampleFrames,
13
- } from "@hypit/program-space";
14
- import type { ProgramSpace } from "@hypit/program-space";
9
+ import { assertProgramSpaceIdentity, programFrameSampleBoundary, programSpaceFrameCount, programSpaceSampleFrames } from "@hypit/program-space";
15
10
  import { canonicalize, isResourceId } from "@hypit/protocol";
16
11
  import { assertCanvasSpace, assertSpatialFrame } from "@hypit/spatial";
17
12
  import type { CanvasSpace } from "@hypit/spatial";
@@ -125,7 +120,7 @@ export function assertMediaTrackSet(value: MediaTrackSet): void {
125
120
  function realizedItems(
126
121
  set: MediaTrackSet,
127
122
  header: MediaTrackHeader,
128
- space: ProgramSpace,
123
+ timeline: Timeline,
129
124
  canvas: CanvasSpace,
130
125
  layers: MediaLayerSet,
131
126
  frame: MediaItemProgram["frame"],
@@ -135,13 +130,13 @@ function realizedItems(
135
130
  ): MediaTrackSet {
136
131
  assertMediaTrackSet(set);
137
132
  assertMediaTrackHeader(header);
138
- assertProgramSpaceIdentity(space);
133
+ assertProgramSpaceIdentity(timeline);
139
134
  assertCanvasSpace(canvas);
140
135
  assertMediaLayerSet(layers);
141
136
  assert(layers.layers.length > 0, `Media Item ${spec.id} requires at least one layer.`);
142
137
  assertSpatialFrame(frame);
143
138
  assertMediaItemSpec(spec);
144
- assertTemporalWindowFor(window, { subjectId: spec.id, space });
139
+ assertTemporalWindowFor(window, { subjectId: spec.id, space: timeline });
145
140
  assertMediaSoundSet(sounds);
146
141
  assert(!sounds.sounds.some((sound) => sound.trigger.kind === "handoff"),
147
142
  `Media Item ${spec.id} cannot own a Handoff sound.`);
@@ -177,7 +172,7 @@ function realizedItems(
177
172
  export function appendMediaItem(
178
173
  set: MediaTrackSet,
179
174
  header: MediaTrackHeader,
180
- space: ProgramSpace,
175
+ timeline: Timeline,
181
176
  canvas: CanvasSpace,
182
177
  layers: MediaLayerSet,
183
178
  frame: MediaItemProgram["frame"],
@@ -185,29 +180,29 @@ export function appendMediaItem(
185
180
  sounds: MediaSoundSet,
186
181
  window: ProjectedWindow,
187
182
  ): MediaTrackSet {
188
- return realizedItems(set, header, space, canvas, layers, frame, spec, sounds, window);
183
+ return realizedItems(set, header, timeline, canvas, layers, frame, spec, sounds, window);
189
184
  }
190
185
 
191
- function assertSampleLayerForSpace(layer: MediaSampleLayerProgram, space: ProgramSpace, label: string): void {
186
+ function assertSampleLayerForSpace(layer: MediaSampleLayerProgram, timeline: Timeline, label: string): void {
192
187
  assertMediaVisualSource(layer.source, `${label}.source`);
193
188
  const timing = layer.source.kind === "timed" ? { frameRate: layer.source.frameRate, frameCount: layer.source.frameCount }
194
189
  : layer.source.kind === "surface" && layer.source.surface.timing.kind === "frames"
195
190
  ? layer.source.surface.timing : undefined;
196
191
  if (timing === undefined) return;
197
- assert(timing.frameRate.numerator === space.frameRate.numerator
198
- && timing.frameRate.denominator === space.frameRate.denominator,
199
- `${label} is not normalized to ProgramSpace frame rate.`);
192
+ assert(timing.frameRate.numerator === timeline.frameRate.numerator
193
+ && timing.frameRate.denominator === timeline.frameRate.denominator,
194
+ `${label} is not normalized to Timeline frame rate.`);
200
195
  if (layer.trim !== undefined) assertMediaVisualTrim(layer.trim, timing.frameCount, `${label}.trim`);
201
196
  assert(layer.occupancy !== undefined, `${label} requires occupancy.`);
202
197
  assertMediaVisualOccupancy(layer.occupancy, `${label}.occupancy`);
203
198
  }
204
199
 
205
- function assertItem(item: MediaItemProgram, space: ProgramSpace, label: string): void {
200
+ function assertItem(item: MediaItemProgram, timeline: Timeline, label: string): void {
206
201
  assertMediaIdentity(item.id, `${label}.id`);
207
202
  assertMediaIdentity(item.subjectId, `${label}.subjectId`);
208
203
  assert(Number.isSafeInteger(item.span.startFrame) && Number.isSafeInteger(item.span.endFrameExclusive)
209
204
  && item.span.startFrame >= 0 && item.span.endFrameExclusive > item.span.startFrame
210
- && item.span.endFrameExclusive <= programSpaceFrameCount(space), `${label}.span is invalid.`);
205
+ && item.span.endFrameExclusive <= programSpaceFrameCount(timeline), `${label}.span is invalid.`);
211
206
  assertSpatialFrame(item.frame);
212
207
  assertMediaFramePresentation(item.presentation, `${label}.presentation`);
213
208
  assertMediaLifecycleMotion(item.motion, item.span.endFrameExclusive - item.span.startFrame, `${label}.motion`);
@@ -217,7 +212,7 @@ function assertItem(item: MediaItemProgram, space: ProgramSpace, label: string):
217
212
  assert(item.layers.length > 0, `${label} requires layers.`);
218
213
  const layerSet: MediaLayerSet = { layers: item.layers };
219
214
  assertMediaLayerSet(layerSet);
220
- for (const layer of item.layers) if (layer.kind === "sample") assertSampleLayerForSpace(layer, space, `${label}.${layer.id}`);
215
+ for (const layer of item.layers) if (layer.kind === "sample") assertSampleLayerForSpace(layer, timeline, `${label}.${layer.id}`);
221
216
  if (item.sourceAudio !== undefined) {
222
217
  const selected = item.layers.find((layer) => layer.id === item.sourceAudio!.fromLayer);
223
218
  assert(selected?.kind === "sample" && selected.source.kind === "timed" && selected.source.audio !== undefined,
@@ -230,7 +225,7 @@ function assertItem(item: MediaItemProgram, space: ProgramSpace, label: string):
230
225
  function appendMediaSequenceAtFrame(
231
226
  set: MediaTrackSet,
232
227
  header: MediaTrackHeader,
233
- space: ProgramSpace,
228
+ timeline: Timeline,
234
229
  canvas: CanvasSpace,
235
230
  members: MediaSequenceMemberSet,
236
231
  frame: MediaSequenceProgram["frame"],
@@ -241,7 +236,7 @@ function appendMediaSequenceAtFrame(
241
236
  assertMediaTrackSet(set);
242
237
  assertMediaSequenceMemberSet(members);
243
238
  assertMediaSequenceSpec(spec);
244
- const sequence = resolveMediaSequence(header, space, canvas, members, frame, spec, sounds, terminalFrame);
239
+ const sequence = resolveMediaSequence(header, timeline, canvas, members, frame, spec, sounds, terminalFrame);
245
240
  assert(!set.items.some((item) => item.id === sequence.id)
246
241
  && !set.sequences.some((item) => item.id === sequence.id),
247
242
  `Media Track ${header.id} already contains ${sequence.id}.`);
@@ -251,7 +246,7 @@ function appendMediaSequenceAtFrame(
251
246
  export function appendMediaSequence(
252
247
  set: MediaTrackSet,
253
248
  header: MediaTrackHeader,
254
- space: ProgramSpace,
249
+ timeline: Timeline,
255
250
  canvas: CanvasSpace,
256
251
  members: MediaSequenceMemberSet,
257
252
  frame: MediaSequenceProgram["frame"],
@@ -259,13 +254,13 @@ export function appendMediaSequence(
259
254
  sounds: MediaSoundSet,
260
255
  terminal: TemporalInstant,
261
256
  ): MediaTrackSet {
262
- assertTemporalInstantFor(terminal, { subjectId: spec.id, space });
263
- return appendMediaSequenceAtFrame(set, header, space, canvas, members, frame, spec, sounds, terminal.frame);
257
+ assertTemporalInstantFor(terminal, { subjectId: spec.id, space: timeline });
258
+ return appendMediaSequenceAtFrame(set, header, timeline, canvas, members, frame, spec, sounds, terminal.frame);
264
259
  }
265
260
 
266
- function assertSequence(sequence: MediaSequenceProgram, space: ProgramSpace, label: string): void {
261
+ function assertSequence(sequence: MediaSequenceProgram, timeline: Timeline, label: string): void {
267
262
  assertMediaIdentity(sequence.id, `${label}.id`);
268
- assert(sequence.span.startFrame >= 0 && sequence.span.endFrameExclusive <= programSpaceFrameCount(space)
263
+ assert(sequence.span.startFrame >= 0 && sequence.span.endFrameExclusive <= programSpaceFrameCount(timeline)
269
264
  && sequence.span.endFrameExclusive > sequence.span.startFrame
270
265
  && sequence.terminalFrame === sequence.span.endFrameExclusive, `${label}.span is invalid.`);
271
266
  assertSpatialFrame(sequence.frame);
@@ -288,7 +283,7 @@ function assertSequence(sequence: MediaSequenceProgram, space: ProgramSpace, lab
288
283
  const layerSet: MediaLayerSet = { layers: member.layers };
289
284
  assertMediaLayerSet(layerSet);
290
285
  for (const layer of member.layers) if (layer.kind === "sample") {
291
- assertSampleLayerForSpace(layer, space, `${label}.members.${index}.${layer.id}`);
286
+ assertSampleLayerForSpace(layer, timeline, `${label}.members.${index}.${layer.id}`);
292
287
  }
293
288
  if (member.sourceAudio !== undefined) {
294
289
  const selected = member.layers.find((layer) => layer.id === member.sourceAudio!.fromLayer);
@@ -323,13 +318,13 @@ function normalizeProgram(value: MediaTrackProgram): MediaTrackProgram {
323
318
  };
324
319
  }
325
320
 
326
- export function sealMediaTrackProgram(value: MediaTrackProgram, space: ProgramSpace): MediaTrackProgram {
321
+ export function sealMediaTrackProgram(value: MediaTrackProgram, timeline: Timeline): MediaTrackProgram {
327
322
  const normalized = normalizeProgram(value);
328
- assertMediaTrackProgramIdentity(normalized, space);
323
+ assertMediaTrackProgramIdentity(normalized, timeline);
329
324
  return canonicalize(normalized) as unknown as MediaTrackProgram;
330
325
  }
331
326
 
332
- export function finalizeMediaTrack(set: MediaTrackSet, header: MediaTrackHeader, space: ProgramSpace): MediaTrackProgram {
327
+ export function finalizeMediaTrack(set: MediaTrackSet, header: MediaTrackHeader, timeline: Timeline): MediaTrackProgram {
333
328
  assertMediaTrackSet(set);
334
329
  assertMediaTrackHeader(header);
335
330
  assert(set.items.length + set.sequences.length > 0, "Media Track requires at least one Item or Sequence.");
@@ -338,7 +333,7 @@ export function finalizeMediaTrack(set: MediaTrackSet, header: MediaTrackHeader,
338
333
  id: header.id,
339
334
  items: set.items,
340
335
  sequences: set.sequences,
341
- }, space);
336
+ }, timeline);
342
337
  }
343
338
 
344
339
  export function assertMediaTrackProgram(value: MediaTrackProgram): void {
@@ -347,26 +342,26 @@ export function assertMediaTrackProgram(value: MediaTrackProgram): void {
347
342
  && value.items.length + value.sequences.length > 0, "MediaTrackProgram is empty.");
348
343
  }
349
344
 
350
- export function assertMediaTrackProgramIdentity(value: MediaTrackProgram, space: ProgramSpace): void {
345
+ export function assertMediaTrackProgramIdentity(value: MediaTrackProgram, timeline: Timeline): void {
351
346
  assertMediaTrackProgram(value);
352
- assertProgramSpaceIdentity(space);
347
+ assertProgramSpaceIdentity(timeline);
353
348
  const ids = new Set<string>();
354
349
  for (const item of value.items) {
355
350
  assert(!ids.has(item.id), `MediaTrackProgram repeats ${item.id}.`);
356
351
  ids.add(item.id);
357
- assertItem(item, space, `Media Item ${item.id}`);
352
+ assertItem(item, timeline, `Media Item ${item.id}`);
358
353
  }
359
354
  for (const sequence of value.sequences) {
360
355
  assert(!ids.has(sequence.id), `MediaTrackProgram repeats ${sequence.id}.`);
361
356
  ids.add(sequence.id);
362
- assertSequence(sequence, space, `Media Sequence ${sequence.id}`);
357
+ assertSequence(sequence, timeline, `Media Sequence ${sequence.id}`);
363
358
  }
364
359
  }
365
360
 
366
- export function projectMediaVisualTrack(space: ProgramSpace, program: MediaTrackProgram): VisualTrack {
367
- assertMediaTrackProgramIdentity(program, space);
361
+ export function projectMediaVisualTrack(timeline: Timeline, program: MediaTrackProgram): VisualTrack {
362
+ assertMediaTrackProgramIdentity(program, timeline);
368
363
  const track = sealVisualTrack({
369
- programSpaceId: space.id,
364
+ programSpaceId: timeline.id,
370
365
  visualIr: "hypit.visual-ir@1",
371
366
  id: program.id,
372
367
  presents: [
@@ -375,12 +370,12 @@ export function projectMediaVisualTrack(space: ProgramSpace, program: MediaTrack
375
370
  subjectId: item.subjectId,
376
371
  span: { ...item.span },
377
372
  stacking: { ...item.stacking },
378
- elements: lowerMediaItemElements(item, space),
373
+ elements: lowerMediaItemElements(item, timeline),
379
374
  })),
380
- ...program.sequences.flatMap((sequence) => lowerMediaSequencePresents(sequence, space)),
375
+ ...program.sequences.flatMap((sequence) => lowerMediaSequencePresents(sequence, timeline)),
381
376
  ],
382
377
  });
383
- assertVisualTrackIdentity(track, space);
378
+ assertVisualTrackIdentity(track, timeline);
384
379
  return track;
385
380
  }
386
381
 
@@ -394,7 +389,7 @@ function sourceSampleBoundary(frame: number, frameCount: number, sampleFrames: n
394
389
 
395
390
  function sourceAudioClip(
396
391
  value: Pick<MediaItemProgram, "id" | "subjectId" | "span" | "layers" | "sourceAudio">,
397
- space: ProgramSpace,
392
+ timeline: Timeline,
398
393
  fades: { readonly inSamples: number; readonly outSamples: number } = { inSamples: 0, outSamples: 0 },
399
394
  ): AudioClip | undefined {
400
395
  if (value.sourceAudio === undefined) return undefined;
@@ -409,8 +404,8 @@ function sourceAudioClip(
409
404
  const trim = layer.trim ?? { startFrame: 0, endFrameExclusive: source.frameCount };
410
405
  const sourceStart = sourceSampleBoundary(trim.startFrame, source.frameCount, audio.sampleFrames);
411
406
  const sourceEnd = sourceSampleBoundary(trim.endFrameExclusive, source.frameCount, audio.sampleFrames);
412
- const targetWindowStart = programFrameSampleBoundary(space, value.span.startFrame, 48_000);
413
- const targetWindowEnd = programFrameSampleBoundary(space, value.span.endFrameExclusive, 48_000);
407
+ const targetWindowStart = programFrameSampleBoundary(timeline, value.span.startFrame, 48_000);
408
+ const targetWindowEnd = programFrameSampleBoundary(timeline, value.span.endFrameExclusive, 48_000);
414
409
  const targetFrames = value.span.endFrameExclusive - value.span.startFrame;
415
410
  const sourceFrames = trim.endFrameExclusive - trim.startFrame;
416
411
  let targetStart = targetWindowStart;
@@ -423,10 +418,10 @@ function sourceAudioClip(
423
418
  if (layer.occupancy.mode === "once" || layer.occupancy.mode === "hold") {
424
419
  const playedFrames = Math.min(targetFrames, sourceFrames);
425
420
  if (layer.occupancy.align === "start") {
426
- targetEnd = programFrameSampleBoundary(space, value.span.startFrame + playedFrames, 48_000);
421
+ targetEnd = programFrameSampleBoundary(timeline, value.span.startFrame + playedFrames, 48_000);
427
422
  clipSourceEnd = sourceSampleBoundary(trim.startFrame + playedFrames, source.frameCount, audio.sampleFrames);
428
423
  } else {
429
- targetStart = programFrameSampleBoundary(space, value.span.endFrameExclusive - playedFrames, 48_000);
424
+ targetStart = programFrameSampleBoundary(timeline, value.span.endFrameExclusive - playedFrames, 48_000);
430
425
  clipSourceStart = sourceSampleBoundary(trim.endFrameExclusive - playedFrames, source.frameCount, audio.sampleFrames);
431
426
  }
432
427
  } else if (layer.occupancy.mode === "loop") {
@@ -466,12 +461,12 @@ function soundClip(
466
461
  source: MediaSoundSource,
467
462
  gain: number,
468
463
  point: number,
469
- space: ProgramSpace,
464
+ timeline: Timeline,
470
465
  ): AudioClip {
471
- const total = programSpaceSampleFrames(space, 48_000);
472
- const targetStart = programFrameSampleBoundary(space, point, 48_000);
466
+ const total = programSpaceSampleFrames(timeline, 48_000);
467
+ const targetStart = programFrameSampleBoundary(timeline, point, 48_000);
473
468
  const audible = Math.min(source.sampleFrames, Math.max(0, total - targetStart));
474
- assert(audible > 0, `Media sound ${id} begins outside ProgramSpace.`);
469
+ assert(audible > 0, `Media sound ${id} begins outside Timeline.`);
475
470
  return {
476
471
  id,
477
472
  artifact: structuredClone(source.artifact),
@@ -493,18 +488,18 @@ function soundClip(
493
488
 
494
489
  function edgeSoundClips(
495
490
  value: Pick<MediaItemProgram, "id" | "span" | "motion" | "sounds">,
496
- space: ProgramSpace,
491
+ timeline: Timeline,
497
492
  ): AudioClip[] {
498
493
  return value.sounds.flatMap((sound) => {
499
494
  if (sound.trigger.kind === "handoff") return [];
500
495
  const point = sound.trigger.kind === "enter"
501
496
  ? value.span.startFrame
502
497
  : value.span.endFrameExclusive - (value.motion.exit?.durationFrames ?? 0);
503
- return [soundClip(`${value.id}:${sound.id}`, sound.source, sound.gain, point, space)];
498
+ return [soundClip(`${value.id}:${sound.id}`, sound.source, sound.gain, point, timeline)];
504
499
  });
505
500
  }
506
501
 
507
- function sequenceAudioClips(sequence: MediaSequenceProgram, space: ProgramSpace): AudioClip[] {
502
+ function sequenceAudioClips(sequence: MediaSequenceProgram, timeline: Timeline): AudioClip[] {
508
503
  const sourceClips = sequence.members.flatMap((member, index) => {
509
504
  if (member.sourceAudio === undefined) return [];
510
505
  const incoming = sequence.handoffs[index - 1];
@@ -515,12 +510,12 @@ function sequenceAudioClips(sequence: MediaSequenceProgram, space: ProgramSpace)
515
510
  ? outgoing.span.endFrameExclusive : member.logicalSpan.endFrameExclusive,
516
511
  };
517
512
  const fadeInSamples = incoming?.audio === "crossfade"
518
- ? programFrameSampleBoundary(space, incoming.span.endFrameExclusive, 48_000)
519
- - programFrameSampleBoundary(space, incoming.span.startFrame, 48_000)
513
+ ? programFrameSampleBoundary(timeline, incoming.span.endFrameExclusive, 48_000)
514
+ - programFrameSampleBoundary(timeline, incoming.span.startFrame, 48_000)
520
515
  : 0;
521
516
  const fadeOutSamples = outgoing?.audio === "crossfade"
522
- ? programFrameSampleBoundary(space, outgoing.span.endFrameExclusive, 48_000)
523
- - programFrameSampleBoundary(space, outgoing.span.startFrame, 48_000)
517
+ ? programFrameSampleBoundary(timeline, outgoing.span.endFrameExclusive, 48_000)
518
+ - programFrameSampleBoundary(timeline, outgoing.span.startFrame, 48_000)
524
519
  : 0;
525
520
  const clip = sourceAudioClip({
526
521
  id: `${sequence.id}:${member.id}`,
@@ -528,7 +523,7 @@ function sequenceAudioClips(sequence: MediaSequenceProgram, space: ProgramSpace)
528
523
  span,
529
524
  layers: member.layers,
530
525
  sourceAudio: member.sourceAudio,
531
- }, space, { inSamples: fadeInSamples, outSamples: fadeOutSamples });
526
+ }, timeline, { inSamples: fadeInSamples, outSamples: fadeOutSamples });
532
527
  return clip === undefined ? [] : [clip];
533
528
  });
534
529
  const handoffSounds = sequence.sounds.flatMap((sound) => {
@@ -537,7 +532,7 @@ function sequenceAudioClips(sequence: MediaSequenceProgram, space: ProgramSpace)
537
532
  const handoff = sequence.handoffs.find((candidate) => candidate.id === handoffId)!;
538
533
  return [soundClip(
539
534
  `${sequence.id}:${sound.id}`, sound.source, sound.gain,
540
- sequence.members.find((member) => member.id === handoff.toMemberId)!.activationFrame, space,
535
+ sequence.members.find((member) => member.id === handoff.toMemberId)!.activationFrame, timeline,
541
536
  )];
542
537
  });
543
538
  return [
@@ -547,19 +542,19 @@ function sequenceAudioClips(sequence: MediaSequenceProgram, space: ProgramSpace)
547
542
  span: sequence.span,
548
543
  motion: sequence.motion,
549
544
  sounds: sequence.sounds,
550
- }, space),
545
+ }, timeline),
551
546
  ...handoffSounds,
552
547
  ];
553
548
  }
554
549
 
555
- export function projectMediaAudioTrack(space: ProgramSpace, program: MediaTrackProgram): AudioTrack {
556
- assertMediaTrackProgramIdentity(program, space);
550
+ export function projectMediaAudioTrack(timeline: Timeline, program: MediaTrackProgram): AudioTrack {
551
+ assertMediaTrackProgramIdentity(program, timeline);
557
552
  const clips = program.items.flatMap((item) => {
558
- const source = sourceAudioClip(item, space);
559
- return [...(source === undefined ? [] : [source]), ...edgeSoundClips(item, space)];
560
- }).concat(program.sequences.flatMap((sequence) => sequenceAudioClips(sequence, space)));
553
+ const source = sourceAudioClip(item, timeline);
554
+ return [...(source === undefined ? [] : [source]), ...edgeSoundClips(item, timeline)];
555
+ }).concat(program.sequences.flatMap((sequence) => sequenceAudioClips(sequence, timeline)));
561
556
  assert(clips.length > 0, `Media Program ${program.id} has no explicitly authored audio projection.`);
562
- const track = sealAudioTrack({ programSpaceId: space.id, id: `${program.id}:audio`, clips });
563
- assertAudioTrackIdentity(track, space);
557
+ const track = sealAudioTrack({ programSpaceId: timeline.id, id: `${program.id}:audio`, clips });
558
+ assertAudioTrackIdentity(track, timeline);
564
559
  return track;
565
560
  }
@@ -1,10 +1,10 @@
1
+ import type { Timeline } from "@hypit/timeline";
1
2
  import type {
2
3
  VisualSamplingRational,
3
4
  VisualSamplingSegment,
4
5
  VisualTimedSampling,
5
6
  } from "@hypit/composition";
6
7
  import { assertProgramSpaceIdentity } from "@hypit/program-space";
7
- import type { ProgramSpace } from "@hypit/program-space";
8
8
 
9
9
  import type { MediaVisualOccupancy, MediaVisualTrim } from "./types.js";
10
10
 
@@ -58,21 +58,21 @@ function assertOccupancy(value: MediaVisualOccupancy): void {
58
58
  * frame. This avoids a second, renderer-specific frame quantizer.
59
59
  */
60
60
  export function resolveVisualSampling(input: {
61
- readonly space: ProgramSpace;
61
+ readonly timeline: Timeline;
62
62
  readonly sourceFrameRate: { readonly numerator: number; readonly denominator: number };
63
63
  readonly sourceFrameCount: number;
64
64
  readonly targetFrameCount: number;
65
65
  readonly trim?: MediaVisualTrim;
66
66
  readonly occupancy: MediaVisualOccupancy;
67
67
  }): VisualTimedSampling {
68
- assertProgramSpaceIdentity(input.space);
68
+ assertProgramSpaceIdentity(input.timeline);
69
69
  assert(Number.isSafeInteger(input.sourceFrameCount) && input.sourceFrameCount > 0,
70
70
  "Timed visual source frame count is invalid.");
71
71
  assert(Number.isSafeInteger(input.targetFrameCount) && input.targetFrameCount > 0,
72
72
  "Timed visual target frame count is invalid.");
73
- assert(input.sourceFrameRate.numerator === input.space.frameRate.numerator
74
- && input.sourceFrameRate.denominator === input.space.frameRate.denominator,
75
- "Timed visual source must be normalized to ProgramSpace frame rate before Media authoring.");
73
+ assert(input.sourceFrameRate.numerator === input.timeline.frameRate.numerator
74
+ && input.sourceFrameRate.denominator === input.timeline.frameRate.denominator,
75
+ "Timed visual source must be normalized to Timeline frame rate before Media authoring.");
76
76
  assertOccupancy(input.occupancy);
77
77
  const trim = input.trim ?? { startFrame: 0, endFrameExclusive: input.sourceFrameCount };
78
78
  assert(Number.isSafeInteger(trim.startFrame) && Number.isSafeInteger(trim.endFrameExclusive)
@@ -1,3 +1,4 @@
1
+ import type { Timeline } from "@hypit/timeline";
1
2
  import type {
2
3
  VisualAnimation,
3
4
  VisualEasing,
@@ -5,7 +6,6 @@ import type {
5
6
  VisualStyleDeclaration,
6
7
  } from "@hypit/composition";
7
8
  import { assertProgramSpaceIdentity, programSpaceFrameCount } from "@hypit/program-space";
8
- import type { ProgramSpace } from "@hypit/program-space";
9
9
  import { canonicalize } from "@hypit/protocol";
10
10
  import { assertCanvasSpace, assertSpatialFrame } from "@hypit/spatial";
11
11
  import type { CanvasSpace } from "@hypit/spatial";
@@ -109,12 +109,12 @@ function appendMediaSequenceMemberAtFrame(
109
109
 
110
110
  export function appendMediaSequenceMember(
111
111
  set: MediaSequenceMemberSet,
112
- space: ProgramSpace,
112
+ timeline: Timeline,
113
113
  layers: MediaLayerSet,
114
114
  spec: MediaSequenceMemberSpec,
115
115
  activation: TemporalInstant,
116
116
  ): MediaSequenceMemberSet {
117
- assertTemporalInstantFor(activation, { subjectId: spec.id, space });
117
+ assertTemporalInstantFor(activation, { subjectId: spec.id, space: timeline });
118
118
  return appendMediaSequenceMemberAtFrame(set, layers, spec, activation.frame);
119
119
  }
120
120
 
@@ -180,7 +180,7 @@ function resolvedHandoff(
180
180
 
181
181
  export function resolveMediaSequence(
182
182
  header: MediaTrackHeader,
183
- space: ProgramSpace,
183
+ timeline: Timeline,
184
184
  canvas: CanvasSpace,
185
185
  memberSet: MediaSequenceMemberSet,
186
186
  frame: MediaSequenceProgram["frame"],
@@ -188,7 +188,7 @@ export function resolveMediaSequence(
188
188
  sounds: MediaSoundSet,
189
189
  terminalFrame: number,
190
190
  ): MediaSequenceProgram {
191
- assertProgramSpaceIdentity(space);
191
+ assertProgramSpaceIdentity(timeline);
192
192
  assertCanvasSpace(canvas);
193
193
  assertMediaSequenceMemberSet(memberSet);
194
194
  assertMediaSequenceSpec(spec);
@@ -205,7 +205,7 @@ export function resolveMediaSequence(
205
205
  terminalFrame,
206
206
  triggers: memberSet.members.map((member) => ({ id: member.id, frame: member.activationFrame })),
207
207
  });
208
- assert(terminalFrame <= programSpaceFrameCount(space), `Media Sequence ${spec.id} exits ProgramSpace.`);
208
+ assert(terminalFrame <= programSpaceFrameCount(timeline), `Media Sequence ${spec.id} exits Timeline.`);
209
209
  const handoffs = spec.handoffs.map((handoff, index) => {
210
210
  const from = memberSet.members[index]!;
211
211
  const to = memberSet.members[index + 1]!;
@@ -360,7 +360,7 @@ export function sequenceMemberHandoffAnimation(
360
360
 
361
361
  export function lowerMediaSequencePresents(
362
362
  sequence: MediaSequenceProgram,
363
- space: ProgramSpace,
363
+ timeline: Timeline,
364
364
  ): readonly VisualPresent[] {
365
365
  return sequence.members.map((member, index) => {
366
366
  const incoming = sequence.handoffs[index - 1];
@@ -389,7 +389,7 @@ export function lowerMediaSequencePresents(
389
389
  subjectId: sequence.id,
390
390
  span: { ...item.span },
391
391
  stacking: { ...item.stacking },
392
- elements: lowerMediaItemElements(item, space, {
392
+ elements: lowerMediaItemElements(item, timeline, {
393
393
  includeHandoffWrapper: true,
394
394
  ...(handoffAnimation === undefined ? {} : { handoffAnimation }),
395
395
  lifecycleAnimationOverride: lifecycleAnimationWindow(