@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.
Files changed (462) hide show
  1. package/README.md +4 -2
  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 +77 -15
  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 +8 -1
  30. package/examples/semantic-composition/chat.svml +6 -5
  31. package/examples/semantic-composition/hypit.runtime.json +1 -1
  32. package/examples/semantic-composition/packages/chat-scene/README.md +3 -3
  33. package/examples/semantic-composition/packages/chat-scene/src/activation.ts +18 -21
  34. package/examples/semantic-composition/packages/chat-scene/src/render.ts +4 -4
  35. package/examples/semantic-composition/packages/performance-styles/README.md +42 -0
  36. package/examples/semantic-composition/packages/performance-styles/package.json +25 -0
  37. package/examples/semantic-composition/packages/performance-styles/src/activation.ts +57 -0
  38. package/examples/semantic-composition/packages/performance-styles/src/render.ts +54 -0
  39. package/examples/semantic-composition/packages/performance-styles/src/studio.ts +28 -0
  40. package/examples/semantic-composition/packages/performance-styles/tsconfig.json +18 -0
  41. package/examples/semantic-composition/packages/responsive-explainer/README.md +16 -9
  42. package/examples/semantic-composition/packages/responsive-explainer/src/activation.ts +12 -12
  43. package/examples/semantic-composition/packages/responsive-explainer/src/render.ts +5 -5
  44. package/examples/semantic-composition/packages/sound-styles/README.md +36 -0
  45. package/examples/semantic-composition/packages/sound-styles/package.json +25 -0
  46. package/examples/semantic-composition/packages/sound-styles/src/activation.ts +53 -0
  47. package/examples/semantic-composition/packages/sound-styles/src/render.ts +14 -0
  48. package/examples/semantic-composition/packages/sound-styles/tsconfig.json +18 -0
  49. package/package.json +35 -15
  50. package/packages/audio-track/README.md +20 -13
  51. package/packages/audio-track/package.json +1 -1
  52. package/packages/audio-track/src/component.ts +4 -4
  53. package/packages/audio-track/src/fragment.ts +6 -5
  54. package/packages/audio-track/src/index.ts +1 -1
  55. package/packages/audio-track/src/manifest.ts +17 -16
  56. package/packages/audio-track/src/program.ts +21 -25
  57. package/packages/audio-track/src/surface.ts +19 -18
  58. package/packages/audio-track-studio/README.md +23 -0
  59. package/packages/audio-track-studio/src/index.ts +28 -17
  60. package/packages/author-kit/README.md +1 -1
  61. package/packages/background-removal/README.md +4 -7
  62. package/packages/browser-capture/package.json +1 -1
  63. package/packages/build-result/README.md +11 -0
  64. package/packages/build-result/src/decode.ts +2 -0
  65. package/packages/build-result/src/execution-log.ts +17 -0
  66. package/packages/build-result/src/index.ts +1 -0
  67. package/packages/build-result/src/store.ts +14 -1
  68. package/packages/build-result/src/types.ts +3 -0
  69. package/packages/build-result-s3/src/repository.ts +4 -0
  70. package/packages/caption/README.md +61 -73
  71. package/packages/caption/package.json +3 -2
  72. package/packages/caption/src/activation.ts +2 -2
  73. package/packages/caption/src/component.ts +20 -5
  74. package/packages/caption/src/display.ts +3 -18
  75. package/packages/caption/src/fragment.ts +3 -7
  76. package/packages/caption/src/index.ts +6 -5
  77. package/packages/caption/src/manifest.ts +29 -46
  78. package/packages/caption/src/style.ts +24 -135
  79. package/packages/caption/src/surface.ts +12 -92
  80. package/packages/caption/src/temporalize.ts +18 -53
  81. package/packages/caption/src/types.ts +8 -35
  82. package/packages/caption/src/visibility.ts +23 -0
  83. package/packages/caption-fine/README.md +21 -9
  84. package/packages/caption-fine/package.json +4 -2
  85. package/packages/caption-fine/src/component.ts +3 -3
  86. package/packages/caption-fine/src/fragment.ts +7 -19
  87. package/packages/caption-fine/src/index.ts +2 -0
  88. package/packages/caption-fine/src/manifest.ts +26 -17
  89. package/packages/caption-fine/src/recipe.ts +7 -0
  90. package/packages/caption-fine/src/render.ts +14 -13
  91. package/packages/caption-fine/src/schedule.ts +39 -35
  92. package/packages/caption-fine/src/style.ts +10 -9
  93. package/packages/caption-fine/src/surface.ts +62 -35
  94. package/packages/caption-fine/src/types.ts +2 -0
  95. package/packages/caption-fine-studio/README.md +24 -2
  96. package/packages/caption-fine-studio/package.json +3 -1
  97. package/packages/caption-fine-studio/src/activation.ts +3 -3
  98. package/packages/caption-fine-studio/src/index.ts +54 -42
  99. package/packages/cli/README.md +57 -4
  100. package/packages/cli/package.json +1 -0
  101. package/packages/cli/src/arguments.ts +25 -6
  102. package/packages/cli/src/build-planning.ts +3 -2
  103. package/packages/cli/src/command.ts +6 -0
  104. package/packages/cli/src/commands/environment.ts +28 -18
  105. package/packages/cli/src/commands/execution.ts +81 -26
  106. package/packages/cli/src/commands/results.ts +7 -11
  107. package/packages/cli/src/index.ts +2 -2
  108. package/packages/cli/src/machine-view.ts +3 -2
  109. package/packages/cli/src/main.ts +34 -42
  110. package/packages/cli/src/observation.ts +7 -1
  111. package/packages/cli/src/output.ts +65 -23
  112. package/packages/cli/src/view.ts +66 -19
  113. package/packages/comment-sticker/README.md +3 -3
  114. package/packages/comment-sticker/package.json +1 -1
  115. package/packages/comment-sticker/src/component.ts +4 -4
  116. package/packages/comment-sticker/src/fragment.ts +5 -4
  117. package/packages/comment-sticker/src/manifest.ts +7 -6
  118. package/packages/comment-sticker/src/program.ts +9 -9
  119. package/packages/comment-sticker/src/surface.ts +6 -7
  120. package/packages/composition/README.md +21 -0
  121. package/packages/composition/src/audio-presentation.ts +44 -0
  122. package/packages/composition/src/index.ts +3 -0
  123. package/packages/composition/src/schema.ts +8 -3
  124. package/packages/composition/src/track.ts +15 -1
  125. package/packages/credential-store-env/README.md +1 -1
  126. package/packages/deck-track/README.md +3 -3
  127. package/packages/deck-track/package.json +1 -1
  128. package/packages/deck-track/src/component.ts +5 -5
  129. package/packages/deck-track/src/fragment.ts +6 -5
  130. package/packages/deck-track/src/lower.ts +12 -12
  131. package/packages/deck-track/src/manifest.ts +8 -7
  132. package/packages/deck-track/src/program.ts +13 -16
  133. package/packages/deck-track/src/surface.ts +9 -10
  134. package/packages/driver-node/src/driver.ts +41 -3
  135. package/packages/elevenlabs-speech/README.md +27 -0
  136. package/packages/{provider-xiaomi-mimo → elevenlabs-speech}/package.json +5 -8
  137. package/packages/elevenlabs-speech/src/activation.ts +26 -0
  138. package/packages/elevenlabs-speech/src/fragment.ts +11 -0
  139. package/packages/elevenlabs-speech/src/index.ts +111 -0
  140. package/packages/elevenlabs-speech/src/surface.ts +167 -0
  141. package/packages/endpoint-kit/README.md +24 -0
  142. package/packages/endpoint-kit/src/index.ts +7 -1
  143. package/packages/film/README.md +12 -7
  144. package/packages/film/package.json +1 -1
  145. package/packages/film/src/component.ts +4 -4
  146. package/packages/film/src/fragment.ts +6 -5
  147. package/packages/film/src/manifest.ts +11 -10
  148. package/packages/film/src/program.ts +5 -5
  149. package/packages/film/src/recipe.ts +2 -1
  150. package/packages/film/src/surface.ts +10 -7
  151. package/packages/film-studio/package.json +1 -1
  152. package/packages/film-studio/src/index.ts +2 -2
  153. package/packages/fishaudio-speech/README.md +33 -0
  154. package/packages/fishaudio-speech/package.json +21 -0
  155. package/packages/fishaudio-speech/src/activation.ts +32 -0
  156. package/packages/fishaudio-speech/src/fragment.ts +11 -0
  157. package/packages/fishaudio-speech/src/index.ts +156 -0
  158. package/packages/fishaudio-speech/src/surface.ts +192 -0
  159. package/packages/generation/README.md +11 -1
  160. package/packages/generation/src/mapping.ts +28 -30
  161. package/packages/gpt-image/README.md +1 -2
  162. package/packages/grok-imagine/README.md +1 -2
  163. package/packages/hyperframes/README.md +7 -3
  164. package/packages/hyperframes/src/browser-program.ts +11 -2
  165. package/packages/hyperframes/src/document.ts +15 -2
  166. package/packages/interview-emoji-reveal/README.md +4 -4
  167. package/packages/interview-emoji-reveal/package.json +1 -1
  168. package/packages/interview-emoji-reveal/src/component.ts +4 -4
  169. package/packages/interview-emoji-reveal/src/fragment.ts +6 -5
  170. package/packages/interview-emoji-reveal/src/manifest.ts +9 -8
  171. package/packages/interview-emoji-reveal/src/program.ts +14 -14
  172. package/packages/interview-emoji-reveal/src/surface.ts +8 -9
  173. package/packages/media-execution/README.md +7 -3
  174. package/packages/media-execution/src/audio-presentation.ts +23 -0
  175. package/packages/media-execution/src/execute.ts +2 -0
  176. package/packages/media-pipeline/README.md +7 -3
  177. package/packages/media-pipeline/src/audio-plan.ts +4 -1
  178. package/packages/media-pipeline/src/component.ts +16 -2
  179. package/packages/media-pipeline/src/manifest.ts +3 -1
  180. package/packages/media-pipeline/src/types.ts +2 -1
  181. package/packages/media-track/README.md +14 -47
  182. package/packages/media-track/package.json +1 -1
  183. package/packages/media-track/preview/preview.svml +5 -5
  184. package/packages/media-track/src/author.ts +12 -6
  185. package/packages/media-track/src/component.ts +10 -16
  186. package/packages/media-track/src/fragment.ts +8 -7
  187. package/packages/media-track/src/index.ts +3 -1
  188. package/packages/media-track/src/lower.ts +7 -7
  189. package/packages/media-track/src/manifest.ts +16 -38
  190. package/packages/media-track/src/program.ts +62 -67
  191. package/packages/media-track/src/sampling.ts +6 -6
  192. package/packages/media-track/src/sequence.ts +8 -8
  193. package/packages/media-track/src/surface.ts +25 -43
  194. package/packages/media-track-studio/README.md +9 -0
  195. package/packages/media-track-studio/src/index.ts +16 -11
  196. package/packages/mimo-speech/README.md +1 -1
  197. package/packages/minimax-h3/README.md +1 -1
  198. package/packages/nano-banana/README.md +1 -1
  199. package/packages/narrative/README.md +23 -1
  200. package/packages/narrative/src/identity.ts +11 -0
  201. package/packages/narrative/src/index.ts +3 -0
  202. package/packages/narrative/src/schema.ts +28 -27
  203. package/packages/narrative/src/selection.ts +52 -0
  204. package/packages/narrative/src/types.ts +2 -0
  205. package/packages/package-loader-node/README.md +30 -0
  206. package/packages/package-loader-node/package.json +5 -2
  207. package/packages/package-loader-node/src/distribution-resolution.ts +10 -3
  208. package/packages/package-loader-node/src/index.ts +1 -0
  209. package/packages/package-loader-node/src/loader.ts +12 -15
  210. package/packages/package-loader-node/src/location.ts +27 -1
  211. package/packages/package-loader-node/src/module-scope.ts +183 -0
  212. package/packages/package-loader-node/src/types.ts +4 -0
  213. package/packages/performance/README.md +83 -0
  214. package/packages/performance/package.json +30 -0
  215. package/packages/performance/src/activation.ts +11 -0
  216. package/packages/performance/src/component.ts +46 -0
  217. package/packages/performance/src/index.ts +6 -0
  218. package/packages/performance/src/manifest.ts +53 -0
  219. package/packages/{media-track/src/performance.ts → performance/src/media.ts} +9 -10
  220. package/packages/performance/src/program.ts +51 -0
  221. package/packages/performance/src/style.ts +35 -0
  222. package/packages/performance/src/surface.ts +99 -0
  223. package/packages/performance-studio/README.md +25 -0
  224. package/packages/performance-studio/package.json +21 -0
  225. package/packages/performance-studio/src/activation.ts +6 -0
  226. package/packages/performance-studio/src/index.ts +84 -0
  227. package/packages/program-space/README.md +9 -18
  228. package/packages/program-space/src/activation.ts +1 -5
  229. package/packages/program-space/src/index.ts +2 -11
  230. package/packages/program-space/src/surface.ts +1 -20
  231. package/packages/project-context-node/README.md +20 -0
  232. package/packages/project-context-node/package.json +10 -0
  233. package/packages/project-context-node/src/index.ts +3 -0
  234. package/packages/{cli → project-context-node}/src/runtime-selection.ts +7 -2
  235. package/packages/provider-hyperframes-local/README.md +43 -15
  236. package/packages/provider-hyperframes-local/src/activation.ts +4 -3
  237. package/packages/provider-hyperframes-local/src/capture-process.ts +26 -4
  238. package/packages/provider-hyperframes-local/src/capture.ts +96 -26
  239. package/packages/provider-hyperframes-local/src/concurrency.ts +86 -0
  240. package/packages/provider-hyperframes-local/src/opaque-capture.ts +92 -0
  241. package/packages/provider-hyperframes-local/src/options.ts +2 -0
  242. package/packages/provider-hyperframes-local/src/program.ts +6 -3
  243. package/packages/provider-hyperframes-local/src/progress.ts +53 -0
  244. package/packages/provider-hyperframes-local/src/provider.ts +18 -5
  245. package/packages/provider-hyperframes-local/src/render.ts +48 -7
  246. package/packages/provider-hypihub/README.md +48 -17
  247. package/packages/provider-hypihub/package.json +2 -0
  248. package/packages/provider-hypihub/src/mapping.ts +31 -7
  249. package/packages/provider-hypihub/src/oauth.ts +6 -0
  250. package/packages/provider-hypihub/src/provider.ts +25 -13
  251. package/packages/provider-hypihub/src/routes.ts +1 -2
  252. package/packages/provider-hypihub/src/upload.ts +2 -0
  253. package/packages/provider-media-local/README.md +3 -4
  254. package/packages/provider-whisperx-local/src/program.ts +1 -0
  255. package/packages/provider-whisperx-local/src/provider.ts +3 -0
  256. package/packages/ranking/README.md +8 -6
  257. package/packages/ranking/package.json +1 -1
  258. package/packages/ranking/src/component.ts +6 -6
  259. package/packages/ranking/src/fragment.ts +11 -7
  260. package/packages/ranking/src/manifest.ts +21 -14
  261. package/packages/ranking/src/render.ts +22 -26
  262. package/packages/ranking/src/schedule.ts +16 -19
  263. package/packages/ranking/src/surface.ts +12 -13
  264. package/packages/ranking-studio/README.md +18 -0
  265. package/packages/ranking-studio/src/index.ts +61 -9
  266. package/packages/render-hyperframes/README.md +7 -7
  267. package/packages/render-hyperframes/package.json +1 -1
  268. package/packages/render-hyperframes/src/component.ts +11 -1
  269. package/packages/render-hyperframes/src/fragment.ts +7 -4
  270. package/packages/render-hyperframes/src/manifest.ts +4 -4
  271. package/packages/render-hyperframes/src/surface.ts +6 -6
  272. package/packages/runtime/README.md +8 -1
  273. package/packages/runtime/src/execution.ts +15 -4
  274. package/packages/runtime/src/index.ts +2 -1
  275. package/packages/runtime/src/log.ts +51 -0
  276. package/packages/runtime/src/types.ts +5 -8
  277. package/packages/runtime-host-node/README.md +30 -0
  278. package/packages/runtime-host-node/package.json +1 -0
  279. package/packages/runtime-host-node/src/index.ts +24 -9
  280. package/packages/runtime-host-node/src/packages.ts +47 -50
  281. package/packages/runtime-kit/README.md +5 -0
  282. package/packages/runtime-kit/src/index.ts +3 -1
  283. package/packages/runtime-local/README.md +109 -4
  284. package/packages/runtime-local/src/config.ts +202 -56
  285. package/packages/runtime-local/src/control.ts +9 -1
  286. package/packages/runtime-local/src/executor.ts +66 -0
  287. package/packages/runtime-local/src/host.ts +37 -17
  288. package/packages/runtime-local/src/log.ts +48 -0
  289. package/packages/runtime-local/src/programs.ts +2 -1
  290. package/packages/runtime-local/src/result-writer.ts +2 -0
  291. package/packages/runtime-local/src/runtime.ts +8 -6
  292. package/packages/runtime-local/src/supervisor.ts +142 -0
  293. package/packages/runtime-local/src/types.ts +9 -2
  294. package/packages/runtime-local/src/worker-process.ts +7 -24
  295. package/packages/runtime-local/src/worker.ts +55 -83
  296. package/packages/screen-overlay/README.md +3 -3
  297. package/packages/screen-overlay/package.json +1 -1
  298. package/packages/screen-overlay/src/component.ts +3 -3
  299. package/packages/screen-overlay/src/fragment.ts +5 -4
  300. package/packages/screen-overlay/src/manifest.ts +7 -6
  301. package/packages/screen-overlay/src/program.ts +9 -9
  302. package/packages/screen-overlay/src/surface.ts +6 -7
  303. package/packages/script/README.md +30 -5
  304. package/packages/script/src/manifest.ts +4 -3
  305. package/packages/script/src/narrative.ts +1 -0
  306. package/packages/script/src/parser.ts +45 -6
  307. package/packages/script/src/surface.ts +4 -3
  308. package/packages/script/src/types.ts +1 -1
  309. package/packages/script-studio/package.json +9 -3
  310. package/packages/script-studio/src/index.ts +2 -0
  311. package/packages/script-studio/src/projection.ts +105 -0
  312. package/packages/seedance/README.md +30 -1
  313. package/packages/seedance/src/index.ts +18 -7
  314. package/packages/seedance/src/surface.ts +17 -4
  315. package/packages/seedance-kits/README.md +7 -1
  316. package/packages/seedream/README.md +1 -1
  317. package/packages/sound/README.md +81 -0
  318. package/packages/sound/package.json +25 -0
  319. package/packages/sound/src/activation.ts +11 -0
  320. package/packages/sound/src/component.ts +28 -0
  321. package/packages/sound/src/index.ts +5 -0
  322. package/packages/sound/src/manifest.ts +47 -0
  323. package/packages/sound/src/program.ts +84 -0
  324. package/packages/sound/src/style.ts +34 -0
  325. package/packages/sound/src/surface.ts +90 -0
  326. package/packages/sound-studio/README.md +22 -0
  327. package/packages/sound-studio/package.json +20 -0
  328. package/packages/sound-studio/src/activation.ts +6 -0
  329. package/packages/sound-studio/src/index.ts +74 -0
  330. package/packages/speech/README.md +2 -2
  331. package/packages/speech-alignment/src/local.ts +8 -0
  332. package/packages/speech-alignment/src/locate.ts +1 -1
  333. package/packages/store-sqlite/README.md +7 -0
  334. package/packages/store-sqlite/src/store.ts +84 -83
  335. package/packages/studio/INSPECTOR.md +15 -2
  336. package/packages/studio/LOCALIZATION.md +98 -0
  337. package/packages/studio/README.md +101 -14
  338. package/packages/studio/locales/en.json +197 -0
  339. package/packages/studio/locales/zh-CN.json +191 -0
  340. package/packages/studio/package.json +8 -7
  341. package/packages/studio/src/companion-assembly.ts +1 -0
  342. package/packages/studio/src/domain.ts +1 -1
  343. package/packages/studio/src/fallback-companions.ts +3 -3
  344. package/packages/studio/src/feedback-server.ts +51 -0
  345. package/packages/studio/src/feedback-store.ts +66 -0
  346. package/packages/studio/src/feedback.ts +60 -0
  347. package/packages/studio/src/localization-node.ts +46 -0
  348. package/packages/studio/src/localization.ts +85 -0
  349. package/packages/studio/src/parameter-values.ts +43 -1
  350. package/packages/studio/src/parameters.ts +114 -24
  351. package/packages/studio/src/preview/render.ts +5 -1
  352. package/packages/studio/src/preview/runtime-shim.ts +49 -3
  353. package/packages/studio/src/programme.ts +14 -30
  354. package/packages/studio/src/server.ts +10 -6
  355. package/packages/studio/src/shared.ts +4 -2
  356. package/packages/studio/src/snapshot.ts +21 -132
  357. package/packages/studio/src/studio-preflight.ts +3 -3
  358. package/packages/studio/src/studio-registry.ts +50 -6
  359. package/packages/studio/src/style.css +223 -50
  360. package/packages/studio/src/ui/artifact-name.ts +8 -6
  361. package/packages/studio/src/ui/artifact-preview.ts +5 -4
  362. package/packages/studio/src/ui/code.ts +17 -16
  363. package/packages/studio/src/ui/comments.ts +234 -0
  364. package/packages/studio/src/ui/dropdown.ts +68 -0
  365. package/packages/studio/src/ui/i18n.ts +109 -0
  366. package/packages/studio/src/ui/icons.ts +6 -0
  367. package/packages/studio/src/ui/library.ts +76 -65
  368. package/packages/studio/src/ui/main.ts +223 -211
  369. package/packages/studio/src/ui/overlay.ts +12 -8
  370. package/packages/studio/src/ui/scrub-preview.ts +110 -0
  371. package/packages/studio/src/ui/stage.ts +93 -29
  372. package/packages/studio/src/ui/timeline.ts +190 -118
  373. package/packages/studio/start.ts +41 -22
  374. package/packages/studio-adapter/README.md +130 -11
  375. package/packages/studio-adapter/src/index.ts +100 -13
  376. package/packages/temporal/README.md +6 -6
  377. package/packages/temporal/package.json +1 -1
  378. package/packages/temporal/src/component.ts +5 -6
  379. package/packages/temporal/src/index.ts +8 -6
  380. package/packages/temporal/src/location.ts +11 -11
  381. package/packages/temporal/src/projection.ts +19 -19
  382. package/packages/temporal/src/rational.ts +4 -4
  383. package/packages/temporal-markup/EDITING.md +2 -2
  384. package/packages/temporal-markup/README.md +27 -11
  385. package/packages/temporal-markup/package.json +1 -1
  386. package/packages/temporal-markup/src/index.ts +20 -25
  387. package/packages/temporal-markup/src/space.ts +10 -41
  388. package/packages/timeline/README.md +31 -0
  389. package/packages/{semantic-track → timeline}/package.json +1 -1
  390. package/packages/timeline/src/activation.ts +8 -0
  391. package/packages/timeline/src/component.ts +24 -0
  392. package/packages/timeline/src/identity.ts +60 -0
  393. package/packages/timeline/src/index.ts +6 -0
  394. package/packages/{semantic-track → timeline}/src/location.ts +20 -20
  395. package/packages/timeline/src/manifest.ts +39 -0
  396. package/packages/{semantic-track → timeline}/src/projection.ts +14 -14
  397. package/packages/timeline/src/types.ts +24 -0
  398. package/packages/timeline-author/README.md +68 -0
  399. package/packages/{speech-track → timeline-author}/package.json +6 -4
  400. package/packages/timeline-author/src/activation.ts +22 -0
  401. package/packages/{speech-track → timeline-author}/src/component.ts +15 -13
  402. package/packages/{speech-track → timeline-author}/src/fragment.ts +14 -23
  403. package/packages/timeline-author/src/index.ts +7 -0
  404. package/packages/timeline-author/src/manifest.ts +78 -0
  405. package/packages/timeline-author/src/program.ts +107 -0
  406. package/packages/timeline-author/src/surface.ts +46 -0
  407. package/packages/timeline-author/src/types.ts +6 -0
  408. package/packages/typography-track/README.md +4 -4
  409. package/packages/typography-track/package.json +1 -1
  410. package/packages/typography-track/src/component.ts +4 -4
  411. package/packages/typography-track/src/fragment.ts +4 -3
  412. package/packages/typography-track/src/manifest.ts +11 -9
  413. package/packages/typography-track/src/program.ts +15 -15
  414. package/packages/typography-track/src/surface.ts +17 -18
  415. package/packages/video-cli/README.md +4 -1
  416. package/packages/video-cli/package.json +2 -1
  417. package/packages/video-cli/src/creation.ts +14 -4
  418. package/packages/video-cli/src/index.ts +1 -1
  419. package/packages/video-cli/src/studio-distribution.ts +2 -1
  420. package/packages/volcengine-matting/README.md +3 -3
  421. package/packages/whisperx/README.md +1 -1
  422. package/services/whisperx/README.md +14 -0
  423. package/services/whisperx/pyproject.toml +2 -0
  424. package/services/whisperx/uv.lock +20 -20
  425. package/packages/provider-hyperframes-aws-lambda/README.md +0 -30
  426. package/packages/provider-hyperframes-aws-lambda/package.json +0 -30
  427. package/packages/provider-hyperframes-aws-lambda/src/activation.ts +0 -97
  428. package/packages/provider-hyperframes-aws-lambda/src/client.ts +0 -114
  429. package/packages/provider-hyperframes-aws-lambda/src/index.ts +0 -21
  430. package/packages/provider-hyperframes-aws-lambda/src/provider.ts +0 -522
  431. package/packages/provider-kie/README.md +0 -134
  432. package/packages/provider-kie/package.json +0 -43
  433. package/packages/provider-kie/src/activation.ts +0 -71
  434. package/packages/provider-kie/src/index.ts +0 -10
  435. package/packages/provider-kie/src/mapping.ts +0 -182
  436. package/packages/provider-kie/src/provider.ts +0 -657
  437. package/packages/provider-kie/src/routes.ts +0 -150
  438. package/packages/provider-xiaomi-mimo/README.md +0 -32
  439. package/packages/provider-xiaomi-mimo/src/activation.ts +0 -57
  440. package/packages/provider-xiaomi-mimo/src/index.ts +0 -5
  441. package/packages/provider-xiaomi-mimo/src/provider.ts +0 -214
  442. package/packages/runtime/src/environment.ts +0 -6
  443. package/packages/semantic-track/README.md +0 -21
  444. package/packages/semantic-track/src/activation.ts +0 -8
  445. package/packages/semantic-track/src/component.ts +0 -24
  446. package/packages/semantic-track/src/identity.ts +0 -58
  447. package/packages/semantic-track/src/index.ts +0 -6
  448. package/packages/semantic-track/src/manifest.ts +0 -38
  449. package/packages/semantic-track/src/types.ts +0 -26
  450. package/packages/speech-track/README.md +0 -51
  451. package/packages/speech-track/src/activation.ts +0 -19
  452. package/packages/speech-track/src/index.ts +0 -7
  453. package/packages/speech-track/src/manifest.ts +0 -73
  454. package/packages/speech-track/src/program.ts +0 -64
  455. package/packages/speech-track/src/surface.ts +0 -35
  456. package/packages/speech-track/src/types.ts +0 -6
  457. package/packages/speech-track-studio/README.md +0 -3
  458. package/packages/speech-track-studio/package.json +0 -14
  459. package/packages/speech-track-studio/src/activation.ts +0 -7
  460. package/packages/speech-track-studio/src/index.ts +0 -40
  461. /package/packages/{cli → project-context-node}/src/project-context.ts +0 -0
  462. /package/packages/{speech-track → timeline-author}/preview/Track.png +0 -0
@@ -1,4 +1,5 @@
1
- import { programSpaceTypes } from "@hypit/program-space";
1
+ import { timelineTypes } from "@hypit/timeline";
2
+
2
3
  import { artifactTypes } from "@hypit/artifact";
3
4
  import { compositionTypes } from "@hypit/composition";
4
5
  import { sealGraphFragment } from "@hypit/elaborator";
@@ -14,7 +15,7 @@ const operation = (id: string) => ({ kind: "fragment-operation" as const, operat
14
15
  export const stillMediaTrackFragment = sealGraphFragment({
15
16
  inputs: [
16
17
  { name: "header", type: mediaTrackTypes.header },
17
- { name: "space", type: programSpaceTypes.programSpace },
18
+ { name: "timeline", type: timelineTypes.track },
18
19
  { name: "canvas", type: spatialTypes.canvas },
19
20
  { name: "source", type: artifactTypes.blob },
20
21
  { name: "extent", type: spatialTypes.extent },
@@ -32,14 +33,14 @@ export const stillMediaTrackFragment = sealGraphFragment({
32
33
  { id: "set", producer: mediaTrackProducers.createSet, inputs: {}, result: { kind: "output", name: "set" } },
33
34
  { id: "sounds", producer: mediaTrackProducers.createSounds, inputs: {}, result: { kind: "output", name: "sounds" } },
34
35
  { id: "append", producer: mediaTrackProducers.appendItem, inputs: {
35
- set: operation("set"), header: input("header"), space: input("space"), canvas: input("canvas"), layers: operation("sample"),
36
+ set: operation("set"), header: input("header"), timeline: input("timeline"), canvas: input("canvas"), layers: operation("sample"),
36
37
  frame: input("frame"), spec: input("item-spec"), sounds: operation("sounds"), window: input("window"),
37
38
  }, result: { kind: "output", name: "set" } },
38
39
  { id: "finalize", producer: mediaTrackProducers.finalize, inputs: {
39
- set: operation("append"), header: input("header"), space: input("space"),
40
+ set: operation("append"), header: input("header"), timeline: input("timeline"),
40
41
  }, result: { kind: "output", name: "program" } },
41
42
  { id: "visual", producer: mediaTrackProducers.projectVisual, inputs: {
42
- space: input("space"), program: operation("finalize"),
43
+ timeline: input("timeline"), program: operation("finalize"),
43
44
  }, result: { kind: "output", name: "track" } },
44
45
  ],
45
46
  exports: [
@@ -49,9 +50,9 @@ export const stillMediaTrackFragment = sealGraphFragment({
49
50
  });
50
51
 
51
52
  export const renderMediaTrackFragment = sealGraphFragment({
52
- inputs: [{ name: "space", type: programSpaceTypes.programSpace }, { name: "program", type: mediaTrackTypes.program }],
53
+ inputs: [{ name: "timeline", type: timelineTypes.track }, { name: "program", type: mediaTrackTypes.program }],
53
54
  operations: [
54
- { id: "visual", producer: mediaTrackProducers.projectVisual, inputs: { space: input("space"), program: input("program") }, result: { kind: "output", name: "track" } },
55
+ { id: "visual", producer: mediaTrackProducers.projectVisual, inputs: { timeline: input("timeline"), program: input("program") }, result: { kind: "output", name: "track" } },
55
56
  ],
56
57
  exports: [{ name: "track", type: compositionTypes.visualTrack, root: operation("visual") }],
57
58
  });
@@ -1,6 +1,7 @@
1
1
  export { mediaTrackComponent } from "./component.js";
2
2
  export {
3
3
  decodeMediaFit,
4
+ decodeMediaItemSpec,
4
5
  decodeMediaFramePaint,
5
6
  decodeMediaMotion,
6
7
  decodeMediaPresentation,
@@ -46,7 +47,6 @@ export {
46
47
  } from "./sounds.js";
47
48
  export { appendMediaItem, appendMediaSequence, bindMediaItemClipPath, bindMediaSequenceClipPath, assertMediaItemSpec, assertMediaTrackHeader, assertMediaTrackProgram, assertMediaTrackProgramIdentity, assertMediaTrackSet, createMediaTrackSet, finalizeMediaTrack, projectMediaAudioTrack, projectMediaVisualTrack, sealMediaItemSpec, sealMediaTrackHeader, sealMediaTrackProgram } from "./program.js";
48
49
  export { resolveVisualSampling } from "./sampling.js";
49
- export { appendMediaPerformance } from "./performance.js";
50
50
  export { decodeMediaSamplingKeyframe, decodeMediaTrackSurface } from "./surface.js";
51
51
  export {
52
52
  appendMediaSequenceMember,
@@ -63,3 +63,5 @@ export {
63
63
  sequenceMemberHandoffAnimation,
64
64
  } from "./sequence.js";
65
65
  export type * from "./types.js";
66
+
67
+ export { mediaAppearanceDefaults } from "./author.js";
@@ -1,10 +1,10 @@
1
+ import type { Timeline } from "@hypit/timeline";
1
2
  import type {
2
3
  VisualAnimation,
3
4
  VisualElement,
4
5
  VisualStyleDeclaration,
5
6
  VisualTimedSampling,
6
7
  } from "@hypit/composition";
7
- import type { ProgramSpace } from "@hypit/program-space";
8
8
  import { fitContent } from "@hypit/spatial";
9
9
  import type { SpatialFrame, SpatialPath } from "@hypit/spatial";
10
10
 
@@ -133,7 +133,7 @@ function sampleElements(
133
133
  item: MediaItemProgram,
134
134
  parent: string,
135
135
  order: { value: number },
136
- space: ProgramSpace,
136
+ timeline: Timeline,
137
137
  samplingOverrides: Readonly<Record<string, VisualTimedSampling>>,
138
138
  samplingAnimationOverrides: Readonly<Record<string, VisualAnimation | null>>,
139
139
  ): VisualElement[] {
@@ -209,7 +209,7 @@ function sampleElements(
209
209
  }];
210
210
  }
211
211
  const sampling = samplingOverrides[layer.id] ?? layer.sampling ?? resolveVisualSampling({
212
- space,
212
+ timeline,
213
213
  sourceFrameRate: sourceTiming.frameRate,
214
214
  sourceFrameCount: sourceTiming.frameCount,
215
215
  targetFrameCount: durationFrames,
@@ -244,12 +244,12 @@ function layerElements(
244
244
  item: MediaItemProgram,
245
245
  parent: string,
246
246
  order: { value: number },
247
- space: ProgramSpace,
247
+ timeline: Timeline,
248
248
  samplingOverrides: Readonly<Record<string, VisualTimedSampling>>,
249
249
  samplingAnimationOverrides: Readonly<Record<string, VisualAnimation | null>>,
250
250
  ): VisualElement[] {
251
251
  if (layer.kind === "sample") {
252
- return sampleElements(layer, item, parent, order, space, samplingOverrides, samplingAnimationOverrides);
252
+ return sampleElements(layer, item, parent, order, timeline, samplingOverrides, samplingAnimationOverrides);
253
253
  }
254
254
  return [{
255
255
  id: layer.id,
@@ -271,7 +271,7 @@ function layerElements(
271
271
  /** Lower one independent Item through the fixed wrapper stack from the Media spec. */
272
272
  export function lowerMediaItemElements(
273
273
  item: MediaItemProgram,
274
- space: ProgramSpace,
274
+ timeline: Timeline,
275
275
  options: {
276
276
  readonly includeHandoffWrapper?: boolean;
277
277
  readonly handoffAnimation?: VisualAnimation;
@@ -326,7 +326,7 @@ export function lowerMediaItemElements(
326
326
  item,
327
327
  frame,
328
328
  order,
329
- space,
329
+ timeline,
330
330
  options.samplingOverrides ?? {},
331
331
  options.samplingAnimationOverrides ?? {},
332
332
  ));
@@ -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
  }