@hypit/hypit 0.1.4 → 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 (449) 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 +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 +32 -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 +28 -17
  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 +11 -0
  63. package/packages/build-result/src/decode.ts +2 -0
  64. package/packages/build-result/src/execution-log.ts +17 -0
  65. package/packages/build-result/src/index.ts +1 -0
  66. package/packages/build-result/src/store.ts +14 -1
  67. package/packages/build-result/src/types.ts +3 -0
  68. package/packages/build-result-s3/src/repository.ts +4 -0
  69. package/packages/caption/README.md +61 -73
  70. package/packages/caption/package.json +3 -2
  71. package/packages/caption/src/activation.ts +2 -2
  72. package/packages/caption/src/component.ts +20 -5
  73. package/packages/caption/src/display.ts +3 -18
  74. package/packages/caption/src/fragment.ts +3 -7
  75. package/packages/caption/src/index.ts +6 -5
  76. package/packages/caption/src/manifest.ts +29 -46
  77. package/packages/caption/src/style.ts +24 -135
  78. package/packages/caption/src/surface.ts +12 -92
  79. package/packages/caption/src/temporalize.ts +18 -53
  80. package/packages/caption/src/types.ts +8 -35
  81. package/packages/caption/src/visibility.ts +23 -0
  82. package/packages/caption-fine/README.md +14 -9
  83. package/packages/caption-fine/package.json +4 -2
  84. package/packages/caption-fine/src/component.ts +3 -3
  85. package/packages/caption-fine/src/fragment.ts +7 -19
  86. package/packages/caption-fine/src/index.ts +2 -0
  87. package/packages/caption-fine/src/manifest.ts +26 -17
  88. package/packages/caption-fine/src/recipe.ts +7 -0
  89. package/packages/caption-fine/src/render.ts +14 -13
  90. package/packages/caption-fine/src/schedule.ts +39 -35
  91. package/packages/caption-fine/src/style.ts +10 -9
  92. package/packages/caption-fine/src/surface.ts +62 -35
  93. package/packages/caption-fine/src/types.ts +2 -0
  94. package/packages/caption-fine-studio/README.md +24 -2
  95. package/packages/caption-fine-studio/package.json +3 -1
  96. package/packages/caption-fine-studio/src/activation.ts +3 -3
  97. package/packages/caption-fine-studio/src/index.ts +54 -42
  98. package/packages/cli/README.md +57 -4
  99. package/packages/cli/package.json +1 -0
  100. package/packages/cli/src/arguments.ts +25 -6
  101. package/packages/cli/src/build-planning.ts +3 -2
  102. package/packages/cli/src/command.ts +6 -0
  103. package/packages/cli/src/commands/environment.ts +28 -18
  104. package/packages/cli/src/commands/execution.ts +81 -26
  105. package/packages/cli/src/commands/results.ts +7 -11
  106. package/packages/cli/src/index.ts +2 -2
  107. package/packages/cli/src/machine-view.ts +3 -2
  108. package/packages/cli/src/main.ts +34 -42
  109. package/packages/cli/src/observation.ts +7 -1
  110. package/packages/cli/src/output.ts +65 -23
  111. package/packages/cli/src/view.ts +64 -18
  112. package/packages/comment-sticker/README.md +3 -3
  113. package/packages/comment-sticker/package.json +1 -1
  114. package/packages/comment-sticker/src/component.ts +4 -4
  115. package/packages/comment-sticker/src/fragment.ts +5 -4
  116. package/packages/comment-sticker/src/manifest.ts +7 -6
  117. package/packages/comment-sticker/src/program.ts +9 -9
  118. package/packages/comment-sticker/src/surface.ts +6 -7
  119. package/packages/composition/README.md +21 -0
  120. package/packages/composition/src/audio-presentation.ts +44 -0
  121. package/packages/composition/src/index.ts +3 -0
  122. package/packages/composition/src/schema.ts +8 -3
  123. package/packages/composition/src/track.ts +15 -1
  124. package/packages/credential-store-env/README.md +1 -1
  125. package/packages/deck-track/README.md +3 -3
  126. package/packages/deck-track/package.json +1 -1
  127. package/packages/deck-track/src/component.ts +5 -5
  128. package/packages/deck-track/src/fragment.ts +6 -5
  129. package/packages/deck-track/src/lower.ts +12 -12
  130. package/packages/deck-track/src/manifest.ts +8 -7
  131. package/packages/deck-track/src/program.ts +13 -16
  132. package/packages/deck-track/src/surface.ts +9 -10
  133. package/packages/driver-node/src/driver.ts +41 -3
  134. package/packages/elevenlabs-speech/README.md +27 -0
  135. package/packages/{provider-xiaomi-mimo → elevenlabs-speech}/package.json +5 -8
  136. package/packages/elevenlabs-speech/src/activation.ts +26 -0
  137. package/packages/elevenlabs-speech/src/fragment.ts +11 -0
  138. package/packages/elevenlabs-speech/src/index.ts +111 -0
  139. package/packages/elevenlabs-speech/src/surface.ts +167 -0
  140. package/packages/endpoint-kit/README.md +24 -0
  141. package/packages/endpoint-kit/src/index.ts +7 -1
  142. package/packages/film/README.md +12 -7
  143. package/packages/film/package.json +1 -1
  144. package/packages/film/src/component.ts +4 -4
  145. package/packages/film/src/fragment.ts +6 -5
  146. package/packages/film/src/manifest.ts +11 -10
  147. package/packages/film/src/program.ts +5 -5
  148. package/packages/film/src/recipe.ts +2 -1
  149. package/packages/film/src/surface.ts +6 -6
  150. package/packages/film-studio/package.json +1 -1
  151. package/packages/film-studio/src/index.ts +2 -2
  152. package/packages/fishaudio-speech/README.md +33 -0
  153. package/packages/fishaudio-speech/package.json +21 -0
  154. package/packages/fishaudio-speech/src/activation.ts +32 -0
  155. package/packages/fishaudio-speech/src/fragment.ts +11 -0
  156. package/packages/fishaudio-speech/src/index.ts +156 -0
  157. package/packages/fishaudio-speech/src/surface.ts +192 -0
  158. package/packages/generation/README.md +11 -1
  159. package/packages/generation/src/mapping.ts +28 -30
  160. package/packages/gpt-image/README.md +1 -2
  161. package/packages/grok-imagine/README.md +1 -2
  162. package/packages/hyperframes/README.md +7 -3
  163. package/packages/hyperframes/src/browser-program.ts +11 -2
  164. package/packages/hyperframes/src/document.ts +15 -2
  165. package/packages/interview-emoji-reveal/README.md +4 -4
  166. package/packages/interview-emoji-reveal/package.json +1 -1
  167. package/packages/interview-emoji-reveal/src/component.ts +4 -4
  168. package/packages/interview-emoji-reveal/src/fragment.ts +6 -5
  169. package/packages/interview-emoji-reveal/src/manifest.ts +9 -8
  170. package/packages/interview-emoji-reveal/src/program.ts +14 -14
  171. package/packages/interview-emoji-reveal/src/surface.ts +8 -9
  172. package/packages/media-execution/README.md +7 -3
  173. package/packages/media-execution/src/audio-presentation.ts +23 -0
  174. package/packages/media-execution/src/execute.ts +2 -0
  175. package/packages/media-pipeline/README.md +7 -3
  176. package/packages/media-pipeline/src/audio-plan.ts +4 -1
  177. package/packages/media-pipeline/src/component.ts +16 -2
  178. package/packages/media-pipeline/src/manifest.ts +3 -1
  179. package/packages/media-pipeline/src/types.ts +2 -1
  180. package/packages/media-track/README.md +14 -47
  181. package/packages/media-track/package.json +1 -1
  182. package/packages/media-track/preview/preview.svml +5 -5
  183. package/packages/media-track/src/author.ts +12 -6
  184. package/packages/media-track/src/component.ts +10 -16
  185. package/packages/media-track/src/fragment.ts +8 -7
  186. package/packages/media-track/src/index.ts +3 -1
  187. package/packages/media-track/src/lower.ts +7 -7
  188. package/packages/media-track/src/manifest.ts +16 -38
  189. package/packages/media-track/src/program.ts +62 -67
  190. package/packages/media-track/src/sampling.ts +6 -6
  191. package/packages/media-track/src/sequence.ts +8 -8
  192. package/packages/media-track/src/surface.ts +25 -43
  193. package/packages/media-track-studio/README.md +9 -0
  194. package/packages/media-track-studio/src/index.ts +16 -11
  195. package/packages/mimo-speech/README.md +1 -1
  196. package/packages/minimax-h3/README.md +1 -1
  197. package/packages/nano-banana/README.md +1 -1
  198. package/packages/narrative/README.md +23 -1
  199. package/packages/narrative/src/identity.ts +11 -0
  200. package/packages/narrative/src/index.ts +3 -0
  201. package/packages/narrative/src/schema.ts +28 -27
  202. package/packages/narrative/src/selection.ts +52 -0
  203. package/packages/narrative/src/types.ts +2 -0
  204. package/packages/package-loader-node/README.md +30 -0
  205. package/packages/package-loader-node/package.json +5 -2
  206. package/packages/package-loader-node/src/distribution-resolution.ts +10 -3
  207. package/packages/package-loader-node/src/index.ts +1 -0
  208. package/packages/package-loader-node/src/loader.ts +12 -15
  209. package/packages/package-loader-node/src/location.ts +27 -1
  210. package/packages/package-loader-node/src/module-scope.ts +183 -0
  211. package/packages/package-loader-node/src/types.ts +4 -0
  212. package/packages/performance/README.md +83 -0
  213. package/packages/performance/package.json +30 -0
  214. package/packages/performance/src/activation.ts +11 -0
  215. package/packages/performance/src/component.ts +46 -0
  216. package/packages/performance/src/index.ts +6 -0
  217. package/packages/performance/src/manifest.ts +53 -0
  218. package/packages/{media-track/src/performance.ts → performance/src/media.ts} +9 -10
  219. package/packages/performance/src/program.ts +51 -0
  220. package/packages/performance/src/style.ts +35 -0
  221. package/packages/performance/src/surface.ts +99 -0
  222. package/packages/performance-studio/README.md +25 -0
  223. package/packages/performance-studio/package.json +21 -0
  224. package/packages/performance-studio/src/activation.ts +6 -0
  225. package/packages/performance-studio/src/index.ts +84 -0
  226. package/packages/program-space/README.md +9 -18
  227. package/packages/program-space/src/activation.ts +1 -5
  228. package/packages/program-space/src/index.ts +2 -11
  229. package/packages/program-space/src/surface.ts +1 -20
  230. package/packages/project-context-node/README.md +20 -0
  231. package/packages/project-context-node/package.json +10 -0
  232. package/packages/project-context-node/src/index.ts +3 -0
  233. package/packages/{cli → project-context-node}/src/runtime-selection.ts +7 -2
  234. package/packages/provider-hyperframes-local/README.md +43 -15
  235. package/packages/provider-hyperframes-local/src/activation.ts +4 -3
  236. package/packages/provider-hyperframes-local/src/capture-process.ts +26 -4
  237. package/packages/provider-hyperframes-local/src/capture.ts +96 -26
  238. package/packages/provider-hyperframes-local/src/concurrency.ts +86 -0
  239. package/packages/provider-hyperframes-local/src/opaque-capture.ts +92 -0
  240. package/packages/provider-hyperframes-local/src/options.ts +2 -0
  241. package/packages/provider-hyperframes-local/src/program.ts +6 -3
  242. package/packages/provider-hyperframes-local/src/progress.ts +53 -0
  243. package/packages/provider-hyperframes-local/src/provider.ts +18 -5
  244. package/packages/provider-hyperframes-local/src/render.ts +48 -7
  245. package/packages/provider-hypihub/README.md +48 -17
  246. package/packages/provider-hypihub/package.json +2 -0
  247. package/packages/provider-hypihub/src/mapping.ts +31 -7
  248. package/packages/provider-hypihub/src/oauth.ts +6 -0
  249. package/packages/provider-hypihub/src/provider.ts +25 -13
  250. package/packages/provider-hypihub/src/routes.ts +1 -2
  251. package/packages/provider-hypihub/src/upload.ts +2 -0
  252. package/packages/provider-media-local/README.md +3 -4
  253. package/packages/provider-whisperx-local/src/program.ts +1 -0
  254. package/packages/provider-whisperx-local/src/provider.ts +3 -0
  255. package/packages/ranking/README.md +8 -6
  256. package/packages/ranking/package.json +1 -1
  257. package/packages/ranking/src/component.ts +6 -6
  258. package/packages/ranking/src/fragment.ts +11 -7
  259. package/packages/ranking/src/manifest.ts +21 -14
  260. package/packages/ranking/src/render.ts +22 -26
  261. package/packages/ranking/src/schedule.ts +16 -19
  262. package/packages/ranking/src/surface.ts +12 -13
  263. package/packages/ranking-studio/README.md +18 -0
  264. package/packages/ranking-studio/src/index.ts +61 -9
  265. package/packages/render-hyperframes/README.md +7 -7
  266. package/packages/render-hyperframes/package.json +1 -1
  267. package/packages/render-hyperframes/src/component.ts +11 -1
  268. package/packages/render-hyperframes/src/fragment.ts +7 -4
  269. package/packages/render-hyperframes/src/manifest.ts +4 -4
  270. package/packages/render-hyperframes/src/surface.ts +6 -6
  271. package/packages/runtime/README.md +8 -1
  272. package/packages/runtime/src/execution.ts +15 -4
  273. package/packages/runtime/src/index.ts +2 -1
  274. package/packages/runtime/src/log.ts +51 -0
  275. package/packages/runtime/src/types.ts +5 -8
  276. package/packages/runtime-host-node/README.md +30 -0
  277. package/packages/runtime-host-node/package.json +1 -0
  278. package/packages/runtime-host-node/src/index.ts +24 -9
  279. package/packages/runtime-host-node/src/packages.ts +47 -50
  280. package/packages/runtime-kit/README.md +5 -0
  281. package/packages/runtime-kit/src/index.ts +3 -1
  282. package/packages/runtime-local/README.md +92 -4
  283. package/packages/runtime-local/src/config.ts +202 -56
  284. package/packages/runtime-local/src/control.ts +9 -1
  285. package/packages/runtime-local/src/executor.ts +66 -0
  286. package/packages/runtime-local/src/host.ts +37 -17
  287. package/packages/runtime-local/src/log.ts +48 -0
  288. package/packages/runtime-local/src/programs.ts +2 -1
  289. package/packages/runtime-local/src/result-writer.ts +2 -0
  290. package/packages/runtime-local/src/runtime.ts +8 -6
  291. package/packages/runtime-local/src/supervisor.ts +142 -0
  292. package/packages/runtime-local/src/types.ts +9 -2
  293. package/packages/runtime-local/src/worker-process.ts +7 -24
  294. package/packages/runtime-local/src/worker.ts +55 -83
  295. package/packages/screen-overlay/README.md +3 -3
  296. package/packages/screen-overlay/package.json +1 -1
  297. package/packages/screen-overlay/src/component.ts +3 -3
  298. package/packages/screen-overlay/src/fragment.ts +5 -4
  299. package/packages/screen-overlay/src/manifest.ts +7 -6
  300. package/packages/screen-overlay/src/program.ts +9 -9
  301. package/packages/screen-overlay/src/surface.ts +6 -7
  302. package/packages/script/README.md +15 -2
  303. package/packages/script/src/manifest.ts +2 -2
  304. package/packages/script/src/narrative.ts +1 -0
  305. package/packages/script/src/surface.ts +4 -3
  306. package/packages/script/src/types.ts +1 -1
  307. package/packages/script-studio/package.json +9 -3
  308. package/packages/script-studio/src/index.ts +2 -0
  309. package/packages/script-studio/src/projection.ts +105 -0
  310. package/packages/seedance/README.md +30 -1
  311. package/packages/seedance/src/index.ts +18 -7
  312. package/packages/seedance/src/surface.ts +17 -4
  313. package/packages/seedance-kits/README.md +7 -1
  314. package/packages/seedream/README.md +1 -1
  315. package/packages/sound/README.md +81 -0
  316. package/packages/sound/package.json +25 -0
  317. package/packages/sound/src/activation.ts +11 -0
  318. package/packages/sound/src/component.ts +28 -0
  319. package/packages/sound/src/index.ts +5 -0
  320. package/packages/sound/src/manifest.ts +47 -0
  321. package/packages/sound/src/program.ts +84 -0
  322. package/packages/sound/src/style.ts +34 -0
  323. package/packages/sound/src/surface.ts +90 -0
  324. package/packages/sound-studio/README.md +22 -0
  325. package/packages/sound-studio/package.json +20 -0
  326. package/packages/sound-studio/src/activation.ts +6 -0
  327. package/packages/sound-studio/src/index.ts +74 -0
  328. package/packages/speech/README.md +2 -2
  329. package/packages/speech-alignment/src/local.ts +8 -0
  330. package/packages/speech-alignment/src/locate.ts +1 -1
  331. package/packages/store-sqlite/README.md +7 -0
  332. package/packages/store-sqlite/src/store.ts +84 -83
  333. package/packages/studio/INSPECTOR.md +15 -2
  334. package/packages/studio/README.md +88 -14
  335. package/packages/studio/package.json +8 -7
  336. package/packages/studio/src/companion-assembly.ts +1 -0
  337. package/packages/studio/src/domain.ts +1 -1
  338. package/packages/studio/src/fallback-companions.ts +3 -3
  339. package/packages/studio/src/feedback-server.ts +51 -0
  340. package/packages/studio/src/feedback-store.ts +66 -0
  341. package/packages/studio/src/feedback.ts +60 -0
  342. package/packages/studio/src/parameter-values.ts +43 -1
  343. package/packages/studio/src/parameters.ts +114 -24
  344. package/packages/studio/src/preview/render.ts +5 -1
  345. package/packages/studio/src/preview/runtime-shim.ts +49 -3
  346. package/packages/studio/src/programme.ts +14 -30
  347. package/packages/studio/src/server.ts +10 -6
  348. package/packages/studio/src/shared.ts +4 -2
  349. package/packages/studio/src/snapshot.ts +21 -132
  350. package/packages/studio/src/studio-preflight.ts +3 -3
  351. package/packages/studio/src/studio-registry.ts +50 -6
  352. package/packages/studio/src/style.css +209 -48
  353. package/packages/studio/src/ui/comments.ts +233 -0
  354. package/packages/studio/src/ui/icons.ts +5 -0
  355. package/packages/studio/src/ui/main.ts +145 -86
  356. package/packages/studio/src/ui/overlay.ts +12 -8
  357. package/packages/studio/src/ui/scrub-preview.ts +108 -0
  358. package/packages/studio/src/ui/stage.ts +67 -4
  359. package/packages/studio/src/ui/timeline.ts +177 -108
  360. package/packages/studio/start.ts +4 -2
  361. package/packages/studio-adapter/README.md +130 -11
  362. package/packages/studio-adapter/src/index.ts +100 -13
  363. package/packages/temporal/README.md +6 -6
  364. package/packages/temporal/package.json +1 -1
  365. package/packages/temporal/src/component.ts +5 -6
  366. package/packages/temporal/src/index.ts +8 -6
  367. package/packages/temporal/src/location.ts +11 -11
  368. package/packages/temporal/src/projection.ts +19 -19
  369. package/packages/temporal/src/rational.ts +4 -4
  370. package/packages/temporal-markup/EDITING.md +2 -2
  371. package/packages/temporal-markup/README.md +27 -11
  372. package/packages/temporal-markup/package.json +1 -1
  373. package/packages/temporal-markup/src/index.ts +20 -25
  374. package/packages/temporal-markup/src/space.ts +10 -41
  375. package/packages/timeline/README.md +31 -0
  376. package/packages/{semantic-track → timeline}/package.json +1 -1
  377. package/packages/timeline/src/activation.ts +8 -0
  378. package/packages/timeline/src/component.ts +24 -0
  379. package/packages/timeline/src/identity.ts +60 -0
  380. package/packages/timeline/src/index.ts +6 -0
  381. package/packages/{semantic-track → timeline}/src/location.ts +20 -20
  382. package/packages/timeline/src/manifest.ts +39 -0
  383. package/packages/{semantic-track → timeline}/src/projection.ts +14 -14
  384. package/packages/timeline/src/types.ts +24 -0
  385. package/packages/timeline-author/README.md +68 -0
  386. package/packages/{speech-track → timeline-author}/package.json +6 -4
  387. package/packages/timeline-author/src/activation.ts +22 -0
  388. package/packages/{speech-track → timeline-author}/src/component.ts +15 -13
  389. package/packages/{speech-track → timeline-author}/src/fragment.ts +14 -23
  390. package/packages/timeline-author/src/index.ts +7 -0
  391. package/packages/timeline-author/src/manifest.ts +78 -0
  392. package/packages/timeline-author/src/program.ts +107 -0
  393. package/packages/timeline-author/src/surface.ts +46 -0
  394. package/packages/timeline-author/src/types.ts +6 -0
  395. package/packages/typography-track/README.md +4 -4
  396. package/packages/typography-track/package.json +1 -1
  397. package/packages/typography-track/src/component.ts +4 -4
  398. package/packages/typography-track/src/fragment.ts +4 -3
  399. package/packages/typography-track/src/manifest.ts +11 -9
  400. package/packages/typography-track/src/program.ts +15 -15
  401. package/packages/typography-track/src/surface.ts +17 -18
  402. package/packages/video-cli/README.md +4 -1
  403. package/packages/video-cli/package.json +2 -1
  404. package/packages/video-cli/src/creation.ts +14 -4
  405. package/packages/video-cli/src/index.ts +1 -1
  406. package/packages/video-cli/src/studio-distribution.ts +2 -1
  407. package/packages/volcengine-matting/README.md +3 -3
  408. package/packages/whisperx/README.md +1 -1
  409. package/services/whisperx/README.md +14 -0
  410. package/services/whisperx/pyproject.toml +2 -0
  411. package/services/whisperx/uv.lock +20 -20
  412. package/packages/provider-hyperframes-aws-lambda/README.md +0 -30
  413. package/packages/provider-hyperframes-aws-lambda/package.json +0 -30
  414. package/packages/provider-hyperframes-aws-lambda/src/activation.ts +0 -97
  415. package/packages/provider-hyperframes-aws-lambda/src/client.ts +0 -114
  416. package/packages/provider-hyperframes-aws-lambda/src/index.ts +0 -21
  417. package/packages/provider-hyperframes-aws-lambda/src/provider.ts +0 -522
  418. package/packages/provider-kie/README.md +0 -134
  419. package/packages/provider-kie/package.json +0 -43
  420. package/packages/provider-kie/src/activation.ts +0 -71
  421. package/packages/provider-kie/src/index.ts +0 -10
  422. package/packages/provider-kie/src/mapping.ts +0 -182
  423. package/packages/provider-kie/src/provider.ts +0 -657
  424. package/packages/provider-kie/src/routes.ts +0 -150
  425. package/packages/provider-xiaomi-mimo/README.md +0 -32
  426. package/packages/provider-xiaomi-mimo/src/activation.ts +0 -57
  427. package/packages/provider-xiaomi-mimo/src/index.ts +0 -5
  428. package/packages/provider-xiaomi-mimo/src/provider.ts +0 -214
  429. package/packages/runtime/src/environment.ts +0 -6
  430. package/packages/semantic-track/README.md +0 -21
  431. package/packages/semantic-track/src/activation.ts +0 -8
  432. package/packages/semantic-track/src/component.ts +0 -24
  433. package/packages/semantic-track/src/identity.ts +0 -58
  434. package/packages/semantic-track/src/index.ts +0 -6
  435. package/packages/semantic-track/src/manifest.ts +0 -38
  436. package/packages/semantic-track/src/types.ts +0 -26
  437. package/packages/speech-track/README.md +0 -51
  438. package/packages/speech-track/src/activation.ts +0 -19
  439. package/packages/speech-track/src/index.ts +0 -7
  440. package/packages/speech-track/src/manifest.ts +0 -73
  441. package/packages/speech-track/src/program.ts +0 -64
  442. package/packages/speech-track/src/surface.ts +0 -35
  443. package/packages/speech-track/src/types.ts +0 -6
  444. package/packages/speech-track-studio/README.md +0 -3
  445. package/packages/speech-track-studio/package.json +0 -14
  446. package/packages/speech-track-studio/src/activation.ts +0 -7
  447. package/packages/speech-track-studio/src/index.ts +0 -40
  448. /package/packages/{cli → project-context-node}/src/project-context.ts +0 -0
  449. /package/packages/{speech-track → timeline-author}/preview/Track.png +0 -0
@@ -0,0 +1,105 @@
1
+ import { narrativeTypes } from "@hypit/narrative";
2
+ import { sameType } from "@hypit/protocol";
3
+ import type { StudioScriptProjectionInput, StudioScriptProjection } from "@hypit/studio-adapter";
4
+
5
+ type NarrativeValue = {
6
+ readonly id?: string;
7
+ readonly segments?: readonly {
8
+ readonly id: string;
9
+ readonly startAnchorId: string;
10
+ readonly endAnchorId: string;
11
+ }[];
12
+ readonly tokens?: readonly {
13
+ readonly id: string;
14
+ readonly segmentId: string;
15
+ readonly startAnchorId: string;
16
+ readonly endAnchorId: string;
17
+ readonly text: string;
18
+ }[];
19
+ readonly selections?: readonly {
20
+ readonly id: string;
21
+ readonly startAnchorId: string;
22
+ readonly endAnchorId: string;
23
+ }[];
24
+ readonly moments?: readonly {
25
+ readonly id: string;
26
+ readonly anchorId: string;
27
+ }[];
28
+ readonly semanticIndex?: {
29
+ readonly anchors?: readonly {
30
+ readonly id: string;
31
+ readonly kind: "program-start" | "segment-start" | "segment-end" | "token-start" | "token-end" | "program-end";
32
+ readonly segmentId?: string;
33
+ readonly tokenId?: string;
34
+ }[];
35
+ };
36
+ };
37
+
38
+ export function projectScriptTimeline(input: StudioScriptProjectionInput): StudioScriptProjection {
39
+ const records = input.values.filter((item) =>
40
+ sameType(item.type, narrativeTypes.narrative)
41
+ && (item.value as NarrativeValue).id === input.source.narrativeId);
42
+ if (records.length > 1) {
43
+ throw new Error(`Studio Narrative id ${input.source.narrativeId} resolves to more than one authored value.`);
44
+ }
45
+ const record = records[0];
46
+ const narrative = record?.value as NarrativeValue | undefined;
47
+ if (narrative === undefined) throw new Error("Studio Narrative is not an inline authored value.");
48
+
49
+ const segmentRanges = new Map((input.source.segments ?? []).map((item) => [item.id, item.range]));
50
+ const tokenRanges = new Map((input.source.tokens ?? []).map((item) => [item.id, item.range]));
51
+ const frame = (id: string): number | undefined => input.anchors.get(id);
52
+
53
+ const segments = (narrative.segments ?? []).flatMap((segment) => {
54
+ const startFrame = frame(segment.startAnchorId);
55
+ const endFrame = frame(segment.endAnchorId);
56
+ if (startFrame === undefined || endFrame === undefined) return [];
57
+ return [{
58
+ id: segment.id,
59
+ startFrame,
60
+ endFrameExclusive: Math.max(startFrame + 1, endFrame),
61
+ ...(segmentRanges.has(segment.id) ? { range: segmentRanges.get(segment.id)! } : {}),
62
+ }];
63
+ });
64
+ const tokens = (narrative.tokens ?? []).flatMap((token) => {
65
+ const startFrame = frame(token.startAnchorId);
66
+ const endFrame = frame(token.endAnchorId);
67
+ if (startFrame === undefined || endFrame === undefined) return [];
68
+ return [{
69
+ id: token.id,
70
+ segmentId: token.segmentId,
71
+ text: token.text,
72
+ startFrame,
73
+ endFrameExclusive: Math.max(startFrame + 1, endFrame),
74
+ ...(tokenRanges.has(token.id) ? { range: tokenRanges.get(token.id)! } : {}),
75
+ }];
76
+ });
77
+ const anchors = (narrative.semanticIndex?.anchors ?? []).flatMap((anchor) => {
78
+ const at = frame(anchor.id);
79
+ if (at === undefined) return [];
80
+ return [{
81
+ id: anchor.id,
82
+ kind: anchor.kind,
83
+ frame: at,
84
+ ...(anchor.segmentId === undefined ? {} : { segmentId: anchor.segmentId }),
85
+ ...(anchor.tokenId === undefined ? {} : { tokenId: anchor.tokenId }),
86
+ }];
87
+ });
88
+ const selections = (narrative.selections ?? []).flatMap((selection) => {
89
+ const startFrame = frame(selection.startAnchorId);
90
+ const endFrameExclusive = frame(selection.endAnchorId);
91
+ if (startFrame === undefined || endFrameExclusive === undefined || endFrameExclusive <= startFrame) return [];
92
+ return [{
93
+ id: selection.id,
94
+ startAnchorId: selection.startAnchorId,
95
+ endAnchorId: selection.endAnchorId,
96
+ startFrame,
97
+ endFrameExclusive,
98
+ }];
99
+ });
100
+ const moments = (narrative.moments ?? []).flatMap((moment) => {
101
+ const at = frame(moment.anchorId);
102
+ return at === undefined ? [] : [{ id: moment.id, anchorId: moment.anchorId, frame: at }];
103
+ });
104
+ return { anchors, segments, tokens, selections, moments };
105
+ }
@@ -1,7 +1,7 @@
1
1
  # `@hypit/seedance`
2
2
 
3
3
  Exact Seedance author model module. It owns the request schema and exactly three invocation Surfaces;
4
- it does not contain KIE credentials, HTTP code, queues, runtime routing or usage-specific Prompt assembly.
4
+ it does not contain service credentials, HTTP code, queues, runtime routing or usage-specific Prompt assembly.
5
5
 
6
6
  The three model invocation shapes are deliberately separate:
7
7
 
@@ -17,3 +17,32 @@ generic Text Template or third-party author module can feed them without becomin
17
17
  the author's literal, in whole seconds inside the model's declared range; measure the spoken line first
18
18
  with `hypit measure` and write the number here. Nothing in the graph computes it, so a Build plan is
19
19
  complete before it starts.
20
+
21
+ ## Visual reference metadata
22
+
23
+ Declare whether each image or video contains a person/avatar reference, including an AI-generated
24
+ human likeness. This describes the supplied material, independently of the prompt's requested action:
25
+
26
+ ```xml
27
+ <seedance:ReferenceVideo id="dance" model="mini" prompt={direction} duration="8">
28
+ <seedance:Reference image={presenter.image} person-reference="true"/>
29
+ <seedance:Reference video={motion.video} person-reference="true"/>
30
+ <seedance:Reference image={room.image} person-reference="false"/>
31
+ </seedance:ReferenceVideo>
32
+ ```
33
+
34
+ `person-reference` is optional, accepts literal `true` or `false`, and applies to image/video, not
35
+ voice audio. Omission carries no classification; it is distinct from explicitly declaring false.
36
+ Inspect the actual reference when deciding the value. For `FrameVideo`, use
37
+ `first-frame-person-reference` and `last-frame-person-reference` beside their respective frame
38
+ inputs. A last-frame classification requires a last-frame input.
39
+
40
+ The model's media ports carry this as `fields.personReference`. Providers interpret it through their
41
+ service's media handling; it is not a prompt sentence or a Core-level identity. HypiHub sends it as
42
+ `is_person_reference` when uploading the file, then uses the returned URL in the ordinary video
43
+ request. A project Provider maps it according to its own API.
44
+
45
+ Video references can carry motion or camera behavior while image references carry the target
46
+ appearance. Request duration and reference-clip duration are different limits. Check the selected
47
+ Endpoint's reference duration and media limits when choosing an excerpt; the author's output duration
48
+ alone does not validate the input clip.
@@ -19,14 +19,16 @@ export type SeedanceModel = typeof seedanceModels[number];
19
19
 
20
20
  const ASPECT_RATIOS = ["1:1", "4:3", "3:4", "16:9", "9:16", "21:9", "adaptive"] as const;
21
21
 
22
+ const PERSON_REFERENCE_FIELDS = [{ name: "personReference", value: { kind: "boolean" }, optional: true }] as const;
23
+
22
24
  const SEEDANCE_25_DURATIONS = [-1, ...Array.from({ length: 27 }, (_item, index) => index + 4)] as const;
23
25
 
24
26
  /**
25
27
  * Exact Seedance model inputs. Provider wire names are deliberately absent:
26
- * KIE, Volcengine or another service maps these ports independently.
28
+ * Each service maps these ports independently.
27
29
  *
28
30
  * Seedance 2.5 is not treated as an alias for a Seedance 2 variant. Its public
29
- * KIE contract widens prompt/reference capacities and duration independently,
31
+ * request definition widens prompt/reference capacities and duration independently,
30
32
  * so it receives its own exact Capability while reusing the same three author
31
33
  * Surfaces.
32
34
  */
@@ -37,11 +39,11 @@ function seedancePortTable(model: SeedanceModel): GenerationPortTable {
37
39
  result: "video",
38
40
  ports: [
39
41
  { name: "prompt", value: { kind: "text", maxChars: is25 ? 30_000 : 20_000 }, minItems: 1, maxItems: 1 },
40
- { name: "referenceImage", value: { kind: "media", accepts: ["image"] }, minItems: 0, maxItems: is25 ? 30 : 9 },
41
- { name: "referenceVideo", value: { kind: "media", accepts: ["video"] }, minItems: 0, maxItems: is25 ? 10 : 3 },
42
+ { name: "referenceImage", value: { kind: "media", accepts: ["image"], itemFields: PERSON_REFERENCE_FIELDS }, minItems: 0, maxItems: is25 ? 30 : 9 },
43
+ { name: "referenceVideo", value: { kind: "media", accepts: ["video"], itemFields: PERSON_REFERENCE_FIELDS }, minItems: 0, maxItems: is25 ? 10 : 3 },
42
44
  { name: "referenceAudio", value: { kind: "media", accepts: ["audio"] }, minItems: 0, maxItems: is25 ? 10 : 3 },
43
- { name: "firstFrame", value: { kind: "media", accepts: ["image"] }, minItems: 0, maxItems: 1 },
44
- { name: "lastFrame", value: { kind: "media", accepts: ["image"] }, minItems: 0, maxItems: 1 },
45
+ { name: "firstFrame", value: { kind: "media", accepts: ["image"], itemFields: PERSON_REFERENCE_FIELDS }, minItems: 0, maxItems: 1 },
46
+ { name: "lastFrame", value: { kind: "media", accepts: ["image"], itemFields: PERSON_REFERENCE_FIELDS }, minItems: 0, maxItems: 1 },
45
47
  {
46
48
  name: "resolution",
47
49
  value: {
@@ -174,6 +176,11 @@ const seedanceCommonAttributes: readonly SurfaceAttributeVocabulary[] = [
174
176
  },
175
177
  ];
176
178
 
179
+ const personReferenceAttribute = (name: string): SurfaceAttributeVocabulary => ({
180
+ name, kind: "literal", required: false, values: ["true", "false"],
181
+ summary: "Declares whether this visual input contains a person/avatar reference, including an AI-generated human likeness. Omission leaves it unclassified.",
182
+ });
183
+
177
184
  const seedanceVideoPort: readonly SurfacePortVocabulary[] = [{
178
185
  name: "video",
179
186
  type: artifactTypes.blob,
@@ -229,6 +236,8 @@ export const seedanceMarkupSurfaces = [
229
236
  summary: "Generates one video with an exact Seedance model from a Text prompt and the images the video opens and closes on.",
230
237
  attributes: [
231
238
  ...seedanceCommonAttributes,
239
+ personReferenceAttribute("first-frame-person-reference"),
240
+ personReferenceAttribute("last-frame-person-reference"),
232
241
  {
233
242
  name: "first-frame",
234
243
  kind: "reference",
@@ -268,6 +277,7 @@ export const seedanceMarkupSurfaces = [
268
277
  cardinality: "many",
269
278
  summary: "Attaches one Artifact as a reference through exactly one of its `image`, `video` or `audio` references.",
270
279
  attributes: [
280
+ personReferenceAttribute("person-reference"),
271
281
  {
272
282
  name: "image",
273
283
  kind: "reference",
@@ -301,12 +311,13 @@ export const seedanceMarkupSurfaces = [
301
311
  aspect-ratio="9:16"
302
312
  generate-audio="true"
303
313
  >
304
- <seedance:Reference image={presenter-clean}/>
314
+ <seedance:Reference image={presenter-clean} person-reference="true"/>
305
315
  <seedance:Reference audio={presenter-voice}/>
306
316
  </seedance:ReferenceVideo>`,
307
317
  notes: [
308
318
  ...seedanceSettingNotes,
309
319
  "The element requires at least one `Reference` child, and the model's port limits cap how many of each role it accepts.",
320
+ "`person-reference` applies to image/video references; voice audio carries no visual classification. The Provider transports the declared fact according to its API.",
310
321
  "A `Reference` carries exactly one of `image`, `video` or `audio`, and is empty.",
311
322
  ],
312
323
  },
@@ -28,6 +28,7 @@ type MediaInput = {
28
28
  readonly port: "referenceImage" | "referenceVideo" | "referenceAudio" | "firstFrame" | "lastFrame";
29
29
  readonly role: GenerationMediaRole;
30
30
  readonly source: SurfaceResolvedReference;
31
+ readonly fields?: { readonly personReference: boolean };
31
32
  };
32
33
 
33
34
  function localName(value: string): string {
@@ -142,6 +143,11 @@ function booleanAttribute(element: StructuredElement, name: string, fallback: bo
142
143
  throw new Error(`${element.name}.${name} must be true or false`);
143
144
  }
144
145
 
146
+ function personReferenceFields(element: StructuredElement, name: string) {
147
+ return element.attributes[name] === undefined ? undefined
148
+ : { personReference: booleanAttribute(element, name, false) };
149
+ }
150
+
145
151
  function enumeratedPort(table: GenerationPortTable, name: string): readonly (string | number)[] {
146
152
  const port = generationPort(table, name);
147
153
  if (port.value.kind !== "enum") throw new Error(`${table.model} port ${name} is not enumerated`);
@@ -204,12 +210,15 @@ function referenceInputs(
204
210
  continue;
205
211
  }
206
212
  if (localName(child.name) !== "Reference") throw new Error(`${element.name} accepts only Reference children`);
207
- attributes(child, [], accepted);
213
+ attributes(child, [], [...accepted, "person-reference"]);
208
214
  empty(child);
209
215
  const kinds = accepted.filter((kind) => child.attributes[kind] !== undefined);
210
216
  if (kinds.length !== 1) throw new Error(`${child.name} requires exactly one of ${accepted.join(", ")}`);
211
217
  const role = kinds[0]!;
218
+ const fields = personReferenceFields(child, "person-reference");
219
+ if (role === "audio" && fields !== undefined) throw new Error(`${child.name}.person-reference applies to image or video, not audio`);
212
220
  result.push({
221
+ ...(fields === undefined ? {} : { fields }),
213
222
  role,
214
223
  port: REFERENCE_PORTS[role],
215
224
  source: mediaReference(resolved(child, role, resolveReference), role, `${child.name}.${role}`),
@@ -230,10 +239,14 @@ function frameInputs(
230
239
  resolveReference: (path: string) => SurfaceResolvedReference | undefined,
231
240
  ): MediaInput[] {
232
241
  const first = mediaReference(resolved(element, "first-frame", resolveReference), "image", `${element.name}.first-frame`);
233
- const result: MediaInput[] = [{ port: "firstFrame", role: "image", source: first }];
242
+ const firstFields = personReferenceFields(element, "first-frame-person-reference");
243
+ const result: MediaInput[] = [{ port: "firstFrame", role: "image", source: first, ...(firstFields === undefined ? {} : { fields: firstFields }) }];
244
+ const lastFields = personReferenceFields(element, "last-frame-person-reference");
245
+ if (lastFields !== undefined && element.attributes["last-frame"] === undefined) throw new Error(`${element.name}.last-frame-person-reference requires last-frame`);
234
246
  if (element.attributes["last-frame"] !== undefined) {
235
247
  result.push({
236
248
  port: "lastFrame",
249
+ ...(lastFields === undefined ? {} : { fields: lastFields }),
237
250
  role: "image",
238
251
  source: mediaReference(resolved(element, "last-frame", resolveReference), "image", `${element.name}.last-frame`),
239
252
  });
@@ -266,7 +279,7 @@ function assembleMedia(
266
279
  type: binding.type,
267
280
  value: {
268
281
  kind: "inline",
269
- value: sealGenerationMediaBinding(port as GenerationMediaPort, { role: value.role }) as unknown as CanonicalValue,
282
+ value: sealGenerationMediaBinding(port as GenerationMediaPort, { role: value.role, ...(value.fields === undefined ? {} : { fields: value.fields }) }) as unknown as CanonicalValue,
270
283
  },
271
284
  range,
272
285
  });
@@ -330,7 +343,7 @@ export const decodeSeedanceTextVideoSurface: StructuredSurfaceHandler = ({ eleme
330
343
  };
331
344
 
332
345
  export const decodeSeedanceFrameVideoSurface: StructuredSurfaceHandler = ({ element, resolveReference }) => {
333
- attributes(element, ["id", "model", "prompt", "duration", "first-frame"], [...COMMON_OPTIONAL, "last-frame"]);
346
+ attributes(element, ["id", "model", "prompt", "duration", "first-frame"], [...COMMON_OPTIONAL, "last-frame", "first-frame-person-reference", "last-frame-person-reference"]);
334
347
  empty(element);
335
348
  const selected = modelSelection(element);
336
349
  const promptSource = resolved(element, "prompt", resolveReference);
@@ -44,7 +44,7 @@ Speaker uses the same graph vocabulary. The Kit assumes `@image1` is the visible
44
44
  <seedance:ReferenceVideo id="hook-take" model="mini"
45
45
  prompt={hook-prompt} duration="8"
46
46
  resolution="720p" aspect-ratio="9:16" generate-audio="true">
47
- <seedance:Reference image={presenter}/>
47
+ <seedance:Reference image={presenter} person-reference="true"/>
48
48
  <seedance:Reference audio={voice}/>
49
49
  </seedance:ReferenceVideo>
50
50
  ```
@@ -153,3 +153,9 @@ Avoid exaggerated reactions or constantly moving every person simply to prevent
153
153
  For a multi-scene B-roll montage, `story` can name the references in scene order and give each a small
154
154
  action. Choose an edit language compatible with cuts. “Continuous within each scene” and “one
155
155
  continuous shot for the whole montage” ask for different results.
156
+
157
+ Visual input classification belongs to the Seedance Reference, separately from Kit text. The
158
+ [Seedance author package](../seedance/README.md#visual-reference-metadata) explains `person-reference`
159
+ and its frame variants. The Kit supplies direction; the actual reference edges supply media and
160
+ metadata. For movement-led work, a reference video can carry the motion while the text explains what
161
+ to preserve and change.
@@ -4,7 +4,7 @@ Exact author/compute contracts and package-owned author Surfaces for Seedream im
4
4
 
5
5
  The two modes are separate Surfaces and project the primary result to an ordinary image Artifact.
6
6
  This package defines what the author requested, not where it runs: API translation, credentials,
7
- retry and queue behavior belong to a selected Runtime Endpoint such as `@hypit/provider-kie`.
7
+ retry and queue behavior belong to a selected Runtime Endpoint selected in the Runtime Profile.
8
8
 
9
9
  The modes stay explicit in the source:
10
10
 
@@ -0,0 +1,81 @@
1
+ # Sound
2
+
3
+ Sound presents audio already placed on a Timeline. Audio Track takes independent material such as
4
+ music and effects. Sound obtains existing sources and playback positions from Timeline and chooses
5
+ how they are heard. Visual Performance and Caption remain independent presentations.
6
+
7
+ ```svml
8
+ <import as="sound" from="@hypit/sound@1"/>
9
+ <sound:Style id="normal"/>
10
+ <sound:Style id="fade-in" gain="0" end-gain="1"/>
11
+ <sound:Style id="silent" gain="0"/>
12
+ <sound:Track id="voice" timeline={program.timeline}>
13
+ <sound:Use style={normal}/>
14
+ <sound:Use at="0f" for="2s" style={fade-in}/>
15
+ <sound:Use during={story.selection.demonstration} style={silent}/>
16
+ </sound:Track>
17
+ ```
18
+
19
+ Include `voice.audio` in Film to hear this presentation. Timeline exports `.timeline`, retaining
20
+ the material for consumers; Sound selects and presents its audio explicitly.
21
+
22
+ Sound also exports `.program`: the ordered Use windows and their audio presentations before
23
+ coverage is resolved. The Studio Companion consumes this value to keep silent and covered Uses
24
+ available for editing. `.audio` remains the effective arrangement for Film.
25
+
26
+ ## Two separate choices
27
+
28
+ The last declared matching Use selects the complete presentation locally. No selector means the
29
+ whole Timeline. No matching Use contributes no sound; an empty winning Style remains silent.
30
+ Later Uses can restore sound inside an earlier silent interval. Separate Sound Tracks can coexist.
31
+
32
+ Within the ordinary Style, the last Timeline-declared active source with audio wins. Declaration
33
+ order is independent of start-time order. A video-only Take supplies no sound candidate; a recorded
34
+ silent audio source is still a source. Gaps and zero-Take Timelines have no sound to present. When a
35
+ later source ends, an earlier still-active source resumes at its current source position.
36
+
37
+ `gain` and `end-gain` are linear amplitude multipliers from 0 to 64. `gain` defaults to 1 and
38
+ `end-gain` defaults to `gain`. They describe a linear ramp over the original Use Window. Equal values
39
+ produce constant gain; zero produces silence. Changing the Window changes the ramp duration.
40
+ The interval's right endpoint describes the gain reached at the boundary, while sample coverage is
41
+ half-open. Matching adjacent Style endpoints is an authoring choice.
42
+
43
+ ## Time and continuity
44
+
45
+ Use accepts shared `during`, `at` + `for`, `until` + `for`, and `start` + `end`, including independently
46
+ bound `start-source` / `end-source`. A source role and a time endpoint are distinct inputs.
47
+
48
+ A Use starting at program second 7 does not restart a Take placed at second 5: its sound is already
49
+ at source second 2. A partially overridden Use keeps its original gain-ramp progress. Resolution
50
+ intersects audible subranges and preserves original Clip targets, sampling and envelopes. The same
51
+ holds for a partial audio render. Sound does not move Takes, change words or retime semantic anchors.
52
+
53
+ ## Write a project Style
54
+
55
+ The public TypeScript entry is `@hypit/hypit/sound`.
56
+ `soundStyle(fragment, bindings)` creates an authored Style. Its fragment takes `timeline` and
57
+ `window`, plus explicitly bound family inputs, and exports `audio: AudioTrack`. Bound references
58
+ become ordinary graph edges at each Use. The fragment may produce an empty Track, one source or
59
+ multiple sources; the renderer consumes the resulting ordinary AudioTrack.
60
+
61
+ `ordinarySound(timeline, window, { gain, endGain })` supplies ordinary last-source presentation.
62
+ `sourceSound(timeline, window, segment, { gain, endGain })` selects one explicit Narrative Segment,
63
+ retaining its existing source and target positions. A known Segment without audio returns an empty
64
+ Track; a foreign or unknown Segment is an error. Neither helper invents sound outside source coverage.
65
+ A family can publish richer program-sample `gainEnvelope` points through the common AudioClip data.
66
+
67
+ The [project crossfade example](../../examples/semantic-composition/packages/sound-styles/README.md)
68
+ binds `outgoing` and `incoming` independently. Its two gains move in opposite directions across the
69
+ Use Window. There is no transition-mode registry or automatic source pairing. Other families can
70
+ own different curves or source combinations through the same fragment interface.
71
+
72
+ ## Rendering boundary
73
+
74
+ [Composition](../composition/README.md) owns generic AudioClip presentation fields: optional
75
+ `gainEnvelope` points and `audibility` subranges, both on the complete 48 kHz program clock. Sound
76
+ resolves Uses into those values. The media pipeline preserves them; the execution package applies
77
+ them per sample after source playback and existing fades, before render-range cropping.
78
+
79
+ The [Sound Companion](../sound-studio/README.md) presents placed audio content and authored Uses.
80
+ Studio playback consumes the same gain envelopes, audible regions and fades through its generic
81
+ AudioTrack player.
@@ -0,0 +1,25 @@
1
+ {
2
+ "name": "@hypit/sound",
3
+ "version": "0.0.0-dev",
4
+ "license": "SEE LICENSE IN LICENSE",
5
+ "private": true,
6
+ "type": "module",
7
+ "exports": {
8
+ ".": "./src/index.ts"
9
+ },
10
+ "hypit": {
11
+ "activation": "./src/activation.ts"
12
+ },
13
+ "dependencies": {
14
+ "@hypit/component-kit": "workspace:*",
15
+ "@hypit/composition": "workspace:*",
16
+ "@hypit/elaborator": "workspace:*",
17
+ "@hypit/markup": "workspace:*",
18
+ "@hypit/narrative": "workspace:*",
19
+ "@hypit/program-space": "workspace:*",
20
+ "@hypit/protocol": "workspace:*",
21
+ "@hypit/temporal": "workspace:*",
22
+ "@hypit/temporal-markup": "workspace:*",
23
+ "@hypit/timeline": "workspace:*"
24
+ }
25
+ }
@@ -0,0 +1,11 @@
1
+ import { createMarkupSurfaceHostFacet } from "@hypit/markup";
2
+ import { soundManifest, soundModuleRef, soundMarkupSurfaces } from "./manifest.js";
3
+ import { soundComponent } from "./component.js";
4
+ import { decodeSoundStyleSurface, decodeSoundTrackSurface } from "./surface.js";
5
+ export const hypitPackage = {
6
+ format: "hypit.node-package@1" as const,
7
+ modules: [{ manifest: soundManifest }], components: [soundComponent],
8
+ hostFacets: soundMarkupSurfaces.map(declaration => createMarkupSurfaceHostFacet({ module: soundModuleRef, declaration,
9
+ handler: declaration.name === "style" ? decodeSoundStyleSurface : decodeSoundTrackSurface })),
10
+ };
11
+ export default hypitPackage;
@@ -0,0 +1,28 @@
1
+ import { canonicalize } from "@hypit/protocol";
2
+ import type { StoredValue } from "@hypit/protocol";
3
+ import type { ComponentPackage } from "@hypit/component-kit";
4
+ import type { Timeline } from "@hypit/timeline";
5
+ import type { AudioTrack } from "@hypit/composition";
6
+ import type { TemporalWindow } from "@hypit/temporal";
7
+ import { ordinarySound, appendSoundUse, resolveSound } from "./program.js";
8
+ import type { SoundSet, SoundGain } from "./program.js";
9
+ import { soundProducers } from "./manifest.js";
10
+ function inline<T>(value: StoredValue | undefined): T {
11
+ if (value?.kind !== "inline") throw new Error("Sound input must be inline.");
12
+ return value.value as unknown as T;
13
+ }
14
+ const output = (value: unknown) => ({ kind: "inline" as const, value: canonicalize(value) });
15
+ export const soundComponent: ComponentPackage = {
16
+ producers: [
17
+ { producer: soundProducers.create, handler: () => ({ outputs: { set: output({ uses: [] }) }, needs: {} }) },
18
+ { producer: soundProducers.append, handler: ({ inputs }) => ({ outputs: { set: output(appendSoundUse(
19
+ inline<SoundSet>(inputs.set?.value), inline<TemporalWindow>(inputs.window?.value), inline<AudioTrack>(inputs.audio?.value),
20
+ )) }, needs: {} }) },
21
+ { producer: soundProducers.resolve, handler: ({ inputs }) => ({ outputs: { audio: output(resolveSound(
22
+ inline<Timeline>(inputs.timeline?.value), inline<{ id: string }>(inputs.header?.value).id, inline<SoundSet>(inputs.set?.value),
23
+ )) }, needs: {} }) },
24
+ { producer: soundProducers.ordinary, handler: ({ inputs }) => ({ outputs: { audio: output(ordinarySound(
25
+ inline<Timeline>(inputs.timeline?.value), inline<TemporalWindow>(inputs.window?.value), inline<SoundGain>(inputs.spec?.value),
26
+ )) }, needs: {} }) },
27
+ ],
28
+ };
@@ -0,0 +1,5 @@
1
+ export * from "./style.js";
2
+ export * from "./program.js";
3
+ export * from "./component.js";
4
+ export * from "./surface.js";
5
+ export * from "./manifest.js";
@@ -0,0 +1,47 @@
1
+ import { compositionDependency, compositionTypes } from "@hypit/composition";
2
+ import { timelineDependency, timelineTypes } from "@hypit/timeline";
3
+ import { temporalDependency, temporalTypes } from "@hypit/temporal";
4
+ import { temporalWindowAttributeVocabulary } from "@hypit/temporal-markup";
5
+ import type { ModuleManifest, ProducerRef, TypeRef } from "@hypit/protocol";
6
+
7
+ export const soundModuleRef = { name: "@hypit/sound", version: "1" } as const;
8
+ export const soundTypes = Object.fromEntries(["Style", "Set", "Header", "Gain"].map(name => [name.toLowerCase(), { module: soundModuleRef, name: `Sound${name}` }])) as Record<"style" | "set" | "header" | "gain", TypeRef>;
9
+ export const soundProducers = Object.fromEntries(["create", "append", "resolve", "ordinary"].map(name => [name, { module: soundModuleRef, name }])) as Record<"create" | "append" | "resolve" | "ordinary", ProducerRef>;
10
+ export const ordinaryInputs = [
11
+ { name: "timeline", type: timelineTypes.track }, { name: "window", type: temporalTypes.window },
12
+ { name: "spec", type: soundTypes.gain },
13
+ ];
14
+ export const soundManifest: ModuleManifest = {
15
+ format: "hypit.module@1", ...soundModuleRef,
16
+ dependencies: [compositionDependency, timelineDependency, temporalDependency],
17
+ types: Object.values(soundTypes).map(type => ({ name: type.name })), capabilities: [],
18
+ producers: [
19
+ { name: "create", inputs: [], outputs: [{ name: "set", type: soundTypes.set }], needs: [] },
20
+ { name: "append", inputs: [{ name: "set", type: soundTypes.set }, { name: "window", type: temporalTypes.window }, { name: "audio", type: compositionTypes.audioTrack }], outputs: [{ name: "set", type: soundTypes.set }], needs: [] },
21
+ { name: "resolve", inputs: [{ name: "set", type: soundTypes.set }, { name: "timeline", type: timelineTypes.track }, { name: "header", type: soundTypes.header }], outputs: [{ name: "audio", type: compositionTypes.audioTrack }], needs: [] },
22
+ { name: "ordinary", inputs: ordinaryInputs, outputs: [{ name: "audio", type: compositionTypes.audioTrack }], needs: [] },
23
+ ],
24
+ };
25
+ export const soundMarkupSurfaces = [
26
+ { name: "style", tag: "Style", mode: "structured", outputs: [soundTypes.style, soundTypes.gain], vocabulary: {
27
+ summary: "Presents existing Timeline sound, choosing the last declared active audio source. Gain may change linearly across each Use.",
28
+ example: `<sound:Style id="fade-in" gain="0" end-gain="1"/>`,
29
+ attributes: [
30
+ { name: "id", kind: "identifier", required: true, summary: "Style name." },
31
+ { name: "gain", kind: "literal", required: false, summary: "Linear gain at the beginning of a Use; defaults to 1. Zero silences the presentation." },
32
+ { name: "end-gain", kind: "literal", required: false, summary: "Linear gain at the end of a Use; defaults to gain. The original Use interval owns the ramp." },
33
+ ],
34
+ } },
35
+ { name: "track", tag: "Track", mode: "structured", outputs: [compositionTypes.audioTrack, soundTypes.set, soundTypes.header, temporalTypes.instantSpec, temporalTypes.windowSpec, temporalTypes.instant, temporalTypes.window], vocabulary: {
36
+ summary: "Presents Timeline sound through ordered Uses. Later Uses replace earlier presentation locally without restarting source playback or gain curves.",
37
+ example: `<sound:Track id="voice" timeline={program.timeline}><sound:Use style={normal}/><sound:Use at="0f" for="2s" style={fade-in}/></sound:Track>`,
38
+ attributes: [
39
+ { name: "id", kind: "identifier", required: true, summary: "Sound presentation name." },
40
+ { name: "timeline", kind: "reference", required: true, accepts: [timelineTypes.track], summary: "Complete film time and placed sources." },
41
+ ], children: [{ tag: "Use", cardinality: "many", summary: "Last matching Use wins, including silence. No time selector covers the complete Timeline.", attributes: [
42
+ { name: "id", kind: "identifier", required: false, summary: "Optional occurrence identity." },
43
+ { name: "style", kind: "reference", required: true, accepts: [soundTypes.style], summary: "Ordinary or project-authored sound Style. Explicit source bindings belong to the Style." },
44
+ ...temporalWindowAttributeVocabulary,
45
+ ] }],
46
+ } },
47
+ ] as const;
@@ -0,0 +1,84 @@
1
+ import { sealAudioTrack, assertAudioTrackIdentity } from "@hypit/composition";
2
+ import type { AudioTrack, AudioClip, AudioSampleSpan, AudioGainPoint } from "@hypit/composition";
3
+ import { assertTemporalWindowFor } from "@hypit/temporal";
4
+ import type { TemporalWindow } from "@hypit/temporal";
5
+ import { projectTimelineAudio } from "@hypit/timeline";
6
+ import type { Timeline } from "@hypit/timeline";
7
+ import type { NarrativeExcerpt } from "@hypit/narrative";
8
+ import { programFrameSampleBoundary } from "@hypit/program-space";
9
+
10
+ export type SoundUse = { readonly window: TemporalWindow; readonly audio: AudioTrack };
11
+ export type SoundSet = { readonly uses: readonly SoundUse[] };
12
+ export type SoundGain = { readonly gain: number; readonly endGain: number };
13
+
14
+ export function soundWindow(timeline: Timeline, window: TemporalWindow): AudioSampleSpan {
15
+ assertTemporalWindowFor(window, { subjectId: window.subjectId, space: timeline });
16
+ return { startSample: programFrameSampleBoundary(timeline, window.span.startFrame, 48000),
17
+ endSampleExclusive: programFrameSampleBoundary(timeline, window.span.endFrameExclusive, 48000) };
18
+ }
19
+ export function intersectAudioSpans(left: readonly AudioSampleSpan[], right: readonly AudioSampleSpan[]): AudioSampleSpan[] {
20
+ return left.flatMap(a => right.flatMap(b => {
21
+ const startSample = Math.max(a.startSample, b.startSample), endSampleExclusive = Math.min(a.endSampleExclusive, b.endSampleExclusive);
22
+ return endSampleExclusive > startSample ? [{ startSample, endSampleExclusive }] : [];
23
+ }));
24
+ }
25
+ function subtract(spans: readonly AudioSampleSpan[], cut: AudioSampleSpan): AudioSampleSpan[] {
26
+ return spans.flatMap(span => {
27
+ if (cut.endSampleExclusive <= span.startSample || cut.startSample >= span.endSampleExclusive) return [span];
28
+ return [
29
+ ...(cut.startSample > span.startSample ? [{ startSample: span.startSample, endSampleExclusive: cut.startSample }] : []),
30
+ ...(cut.endSampleExclusive < span.endSampleExclusive ? [{ startSample: cut.endSampleExclusive, endSampleExclusive: span.endSampleExclusive }] : []),
31
+ ];
32
+ });
33
+ }
34
+ function envelope(span: AudioSampleSpan, gain: SoundGain): readonly AudioGainPoint[] {
35
+ if (![gain.gain, gain.endGain].every(value => Number.isFinite(value) && value >= 0 && value <= 64)) throw new Error("Sound gain must be from 0 to 64.");
36
+ return [{ sample: span.startSample, gain: gain.gain }, { sample: span.endSampleExclusive, gain: gain.endGain }];
37
+ }
38
+ const unity = { gain: 1, endGain: 1 };
39
+
40
+ /** Default source choice is declaration order, independently of the order of Use rules. */
41
+ export function ordinarySound(timeline: Timeline, window: TemporalWindow, gain: SoundGain = unity): AudioTrack {
42
+ const span = soundWindow(timeline, window), gainEnvelope = envelope(span, gain);
43
+ const sources = new Map(projectTimelineAudio(timeline).clips.map(clip => [clip.id, clip]));
44
+ const clips = timeline.items.flatMap(item => { const clip = sources.get(item.take.segment.segmentId); return clip ? [clip] : []; });
45
+ const result: AudioClip[] = [];
46
+ for (const [index, clip] of clips.entries()) {
47
+ let audibility = intersectAudioSpans([span], [clip.target]);
48
+ for (const later of clips.slice(index + 1)) audibility = subtract(audibility, later.target);
49
+ if (audibility.length && (gain.gain !== 0 || gain.endGain !== 0)) result.push({ ...clip, gainEnvelope, audibility });
50
+ }
51
+ return sealAudioTrack({ id: window.subjectId, programSpaceId: timeline.id, clips: result });
52
+ }
53
+
54
+ /** Explicit source selection for project Styles, with its original placement/sampling retained. */
55
+ export function sourceSound(timeline: Timeline, window: TemporalWindow, segment: NarrativeExcerpt, gain: SoundGain = unity): AudioTrack {
56
+ if (segment.kind !== "segment" || segment.narrativeId !== timeline.narrativeId) throw new Error("Sound source must be a Segment of this Timeline's Narrative.");
57
+ if (!timeline.items.some(item => item.take.segment.segmentId === segment.id)) throw new Error(`Unknown Sound Segment ${segment.id}.`);
58
+ const span = soundWindow(timeline, window), gainEnvelope = envelope(span, gain);
59
+ const clip = projectTimelineAudio(timeline).clips.find(clip => clip.id === segment.id);
60
+ const audibility = clip ? intersectAudioSpans([span], [clip.target]) : [];
61
+ return sealAudioTrack({ id: `${window.subjectId}:${segment.id}`, programSpaceId: timeline.id,
62
+ clips: clip && audibility.length && (gain.gain !== 0 || gain.endGain !== 0) ? [{ ...clip, gainEnvelope, audibility }] : [] });
63
+ }
64
+ export function appendSoundUse(set: SoundSet, window: TemporalWindow, audio: AudioTrack): SoundSet {
65
+ assertAudioTrackIdentity(audio);
66
+ if (audio.programSpaceId !== window.start.source.spaceId) throw new Error("Sound Use and audio belong to different Timelines.");
67
+ return { uses: [...set.uses, { window, audio }] };
68
+ }
69
+ /** Resolve presentation coverage without changing original targets, source clocks or envelopes. */
70
+ export function resolveSound(timeline: Timeline, id: string, set: SoundSet): AudioTrack {
71
+ const windows = set.uses.map(use => { assertAudioTrackIdentity(use.audio, timeline); return soundWindow(timeline, use.window); });
72
+ const clips: AudioClip[] = [];
73
+ for (const [index, use] of set.uses.entries()) {
74
+ let active = [windows[index]!];
75
+ for (const cut of windows.slice(index + 1)) active = subtract(active, cut);
76
+ for (const clip of use.audio.clips) {
77
+ const audibility = intersectAudioSpans(active, clip.audibility ?? [clip.target]);
78
+ if (audibility.length) clips.push({ ...clip, id: `${index + 1}:${clip.id}`, audibility });
79
+ }
80
+ }
81
+ const result = sealAudioTrack({ id, programSpaceId: timeline.id, clips });
82
+ assertAudioTrackIdentity(result, timeline);
83
+ return result;
84
+ }