@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
@@ -5,7 +5,6 @@ import type {
5
5
  StudioInspectorFieldDeclaration,
6
6
  StudioSourceBinding,
7
7
  StudioSourceBindingDeclaration,
8
- StudioParameterControl,
9
8
  StudioRecipeReferenceBindingDeclaration,
10
9
  StudioEntityDraft,
11
10
  StudioEditSource,
@@ -17,6 +16,11 @@ import type {
17
16
  StudioTimelineGesture,
18
17
  } from "@hypit/studio-adapter";
19
18
  import { parseSvs } from "@hypit/svs";
19
+ import { parseOpeningTag } from "@hypit/markup";
20
+ import { parameterControlForSchema, parameterRecordSchema } from "./parameter-values.js";
21
+ import type { CanonicalValue } from "@hypit/protocol";
22
+
23
+ import type { StudioCompanionRegistry } from "./studio-registry.js";
20
24
 
21
25
  import type { Range } from "./shared.js";
22
26
  import type { Placement } from "./observe.js";
@@ -30,6 +34,7 @@ export type StudioSourceFile = {
30
34
  };
31
35
 
32
36
  type AuthorElement = {
37
+ readonly range: Range;
33
38
  readonly authorElement?: string;
34
39
  readonly authorEndpoints: Readonly<Record<string, string>>;
35
40
  readonly id?: string;
@@ -48,6 +53,7 @@ function authoredElements(placements: readonly Placement[]): readonly AuthorElem
48
53
  ...(placement.authorElement === undefined ? {} : { authorElement: placement.authorElement }),
49
54
  authorEndpoints: placement.authorEndpoints ?? {},
50
55
  ...(placement.id === undefined ? {} : { id: placement.id }),
56
+ range: placement.range,
51
57
  sourcePath: placement.sourcePath,
52
58
  attributes: placement.attributes,
53
59
  references: placement.referenceAttributes,
@@ -60,6 +66,7 @@ function authoredElements(placements: readonly Placement[]): readonly AuthorElem
60
66
  ...(child.authorElement === undefined ? {} : { authorElement: child.authorElement }),
61
67
  authorEndpoints: child.authorEndpoints ?? {},
62
68
  ...(child.id === undefined ? {} : { id: child.id }),
69
+ range: child.range,
63
70
  sourcePath: child.sourcePath,
64
71
  attributes: child.attributes,
65
72
  references: child.referenceAttributes,
@@ -175,7 +182,8 @@ function recipeParameters(input: {
175
182
  return input.recipe.bindings.flatMap((declaration): readonly StudioSourceBinding[] => {
176
183
  const property = recipe.properties.find((candidate) => candidate.name === declaration.name);
177
184
  if (property === undefined) {
178
- if (declaration.fallback === undefined) return [];
185
+ const fallback = typeof declaration.fallback === "function" ? declaration.fallback(recipe.value.properties) : declaration.fallback;
186
+ if (fallback === undefined) return [];
179
187
  const close = recipe.range.end - 1;
180
188
  const lineStart = Math.max(source.text.lastIndexOf("\n", close - 1), source.text.lastIndexOf("\r", close - 1)) + 1;
181
189
  const closeIndent = source.text.slice(lineStart, close);
@@ -189,7 +197,7 @@ function recipeParameters(input: {
189
197
  id: `${input.draft.id}:${input.referenceName}:${declaration.name}`,
190
198
  binding: `${input.referenceName}.${declaration.name}`,
191
199
  name: declaration.name,
192
- value: declaration.fallback,
200
+ value: fallback,
193
201
  ...(declaration.schema === undefined ? {} : { schema: declaration.schema }),
194
202
  language: "svs" as const,
195
203
  writable: declaration.writable ?? true,
@@ -220,6 +228,57 @@ function recipeParameters(input: {
220
228
  });
221
229
  }
222
230
 
231
+ function attributeGroup(file: StudioSourceFile, target: AuthorElement, draft: StudioEntityDraft,
232
+ declaration: StudioSourceBindingDeclaration, binding: string, root: string): readonly StudioSourceBinding[] {
233
+ if (declaration.schema === undefined) throw new Error(`Attribute group ${binding} needs a schema.`);
234
+ const tag = parseOpeningTag({ name: file.path, text: file.text }, target.range.start);
235
+ const sourceRange = { start: target.range.start, end: tag.end };
236
+ const preimage = file.text.slice(sourceRange.start, sourceRange.end);
237
+ const opening = /^<[\w:.-]+/u.exec(preimage);
238
+ if (!opening) throw new Error(`Cannot locate opening tag for ${binding}.`);
239
+ const fallback = typeof declaration.fallback === "function" ? declaration.fallback(target.attributes) : declaration.fallback;
240
+ const value: Record<string, CanonicalValue> = fallback !== null && typeof fallback === "object" && !Array.isArray(fallback) ? { ...(fallback as Readonly<Record<string, CanonicalValue>>) } : {};
241
+ const ranges: Record<string, Range | null> = {};
242
+ let writable = declaration.writable === true;
243
+ for (const name of declaration.attributes!) {
244
+ const range = target.attributeValueRanges[name];
245
+ ranges[name] = null;
246
+ if (range === undefined) continue;
247
+ if (target.references[name] !== undefined) { writable = false; value[name] = target.references[name]!; continue; }
248
+ value[name] = target.attributes[name] ?? target.references[name] ?? "";
249
+ const before = file.text.slice(target.range.start, range.start);
250
+ const escaped = name.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
251
+ const prefix = new RegExp(`\\s+${escaped}\\s*=\\s*["']$`, "u").exec(before);
252
+ if (!prefix) throw new Error(`Cannot locate scalar attribute ${name}.`);
253
+ ranges[name] = { start: prefix.index, end: range.end - target.range.start + 1 };
254
+ }
255
+ const schema = parameterRecordSchema(declaration.schema, value);
256
+ for (const [name, held] of Object.entries(value)) {
257
+ if (target.references[name] !== undefined || typeof held !== "string") continue;
258
+ const kind = schema?.fields[name]?.schema.kind;
259
+ if (kind === "number" && held.trim() !== "") value[name] = Number(held);
260
+ if (kind === "boolean" && (held === "true" || held === "false")) value[name] = held === "true";
261
+ }
262
+ return [{ id: `${draft.id}:${binding}`, binding, name: declaration.name, value, schema: declaration.schema,
263
+ language: file.language, writable, source: { path: relative(root, sourceAbsolute(root, target.sourcePath)),
264
+ range: sourceRange, preimage }, attributes: { insertionOffset: opening[0].length, ranges } }];
265
+ }
266
+
267
+ function omittedAttribute(file: StudioSourceFile, target: AuthorElement, draft: StudioEntityDraft,
268
+ declaration: StudioSourceBindingDeclaration, binding: string, root: string): readonly StudioSourceBinding[] {
269
+ const value = typeof declaration.fallback === "function" ? declaration.fallback(target.attributes) : declaration.fallback;
270
+ if (value === undefined) return [];
271
+ const tag = /^<[\w:.-]+/u.exec(file.text.slice(target.range.start));
272
+ if (tag === null) throw new Error(`Cannot locate opening tag for ${binding}.`);
273
+ const at = target.range.start + tag[0].length;
274
+ return [{ id: `${draft.id}:${binding}`, binding, name: declaration.name, value,
275
+ ...(declaration.schema === undefined ? {} : { schema: declaration.schema }),
276
+ language: file.language, writable: declaration.writable === true,
277
+ source: { path: relative(root, sourceAbsolute(root, target.sourcePath)),
278
+ range: { start: at, end: at }, preimage: "", prefix: ` ${declaration.name}="`, suffix: '"' },
279
+ }];
280
+ }
281
+
223
282
  function referencedParameters(input: {
224
283
  readonly root: string;
225
284
  readonly files: readonly StudioSourceFile[];
@@ -238,16 +297,25 @@ function referencedParameters(input: {
238
297
  const file = sourceFor(input.root, target.sourcePath, input.files);
239
298
  if (file === undefined) return [];
240
299
  return input.declarations.flatMap((declaration) => {
300
+ if (declaration.attributes) return attributeGroup(file, target, input.draft, declaration, `${input.referenceName}.${declaration.name}`, input.root);
241
301
  const nestedPath = target.references[declaration.name];
242
- const nested = nestedPath === undefined || declaration.referenced === undefined ? [] : referencedParameters({
302
+ const referenced = nestedPath === undefined || declaration.referenced === undefined ? [] : referencedParameters({
243
303
  root: input.root, files: input.files, draft: input.draft, placements: input.placements,
244
304
  referenceName: `${input.referenceName}.${declaration.name}`,
245
305
  referencePath: nestedPath,
246
306
  ...(target.resolvedReferences[declaration.name] === undefined ? {} : { referenceRef: target.resolvedReferences[declaration.name] }),
247
307
  declarations: declaration.referenced,
248
308
  });
309
+ const recipe = nestedPath === undefined || declaration.recipe === undefined ? [] : recipeParameters({
310
+ root: input.root, files: input.files, draft: input.draft, placements: input.placements,
311
+ current: file, referenceName: `${input.referenceName}.${declaration.name}`,
312
+ referencePath: nestedPath,
313
+ ...(target.resolvedReferences[declaration.name] === undefined ? {} : { referenceRef: target.resolvedReferences[declaration.name] }), recipe: declaration.recipe,
314
+ through: declaration.recipe.through ?? [],
315
+ });
316
+ const nested = [...referenced, ...recipe];
249
317
  const range = target.attributeValueRanges[declaration.name];
250
- if (range === undefined) return nested;
318
+ if (range === undefined) return [...omittedAttribute(file, target, input.draft, declaration, `${input.referenceName}.${declaration.name}`, input.root), ...nested];
251
319
  const preimage = file.text.slice(range.start, range.end);
252
320
  const reference = target.references[declaration.name];
253
321
  const value = reference === undefined ? (target.attributes[declaration.name] ?? preimage) : reference;
@@ -288,6 +356,37 @@ function parameterReference(
288
356
  return ref === undefined ? { path } : { path, ref };
289
357
  }
290
358
 
359
+ /** Resolve only references opted into by the consuming Companion. */
360
+ export function composeParameterDeclarations(input: {
361
+ readonly placement: StudioPlacement | undefined;
362
+ readonly draft: StudioEntityDraft;
363
+ readonly placements: readonly Placement[];
364
+ readonly registry: StudioCompanionRegistry;
365
+ readonly bindings: readonly StudioSourceBindingDeclaration[];
366
+ readonly inspector: readonly StudioInspectorFieldDeclaration[];
367
+ }): { bindings: readonly StudioSourceBindingDeclaration[]; inspector: readonly StudioInspectorFieldDeclaration[] } {
368
+ const inspector = [...input.inspector];
369
+ const element = input.placement === undefined ? undefined : elementFor(input.placement, input.draft);
370
+ const expand = (declarations: readonly StudioSourceBindingDeclaration[], owner: AuthorElement | undefined,
371
+ prefix: string, seen: ReadonlySet<string>): readonly StudioSourceBindingDeclaration[] => declarations.map(declaration => {
372
+ const path = prefix ? `${prefix}.${declaration.name}` : declaration.name;
373
+ const reference = prefix ? owner?.references[declaration.name] : input.draft.parameterReferences?.[declaration.name] ?? owner?.references[declaration.name];
374
+ const resolved = !prefix && input.draft.parameterReferences?.[declaration.name] !== undefined ? undefined : owner?.resolvedReferences[declaration.name];
375
+ const target = input.placements.find(candidate => resolved !== undefined
376
+ ? candidate.records.includes(resolved) || candidate.outputs.includes(resolved)
377
+ : candidate.id === reference && candidate.sourcePath === owner?.sourcePath);
378
+ const companion = declaration.companion && target !== undefined
379
+ ? input.registry.parameterCompanionFor(target.module, target.surface) : undefined;
380
+ const key = target?.authorElement ?? `${target?.sourcePath}:${target?.range.start}`;
381
+ if (companion !== undefined && seen.has(key)) throw new Error(`Circular Studio parameter reference at ${path}.`);
382
+ if (companion !== undefined) inspector.push(...companion.inspector.map(field => ({ ...field, binding: `${path}.${field.binding}` })));
383
+ const next = target === undefined ? undefined : elementFor(target, { ...input.draft, authoredId: target.id ?? "", elementRange: target.range });
384
+ const nested = [...(declaration.referenced ?? []), ...(companion?.bindings ?? [])];
385
+ return { ...declaration, referenced: expand(nested, next, path, new Set([...seen, key])) };
386
+ });
387
+ return { bindings: expand(input.bindings, element, "", new Set()), inspector };
388
+ }
389
+
291
390
  /**
292
391
  * Expose only attributes a package explicitly registered. The source range is
293
392
  * still discovered by the generic markup frontend, while the meaning and
@@ -310,8 +409,9 @@ export function sourceBindingsForDraft(input: {
310
409
 
311
410
  const direct = input.declarations.flatMap((declaration) => {
312
411
  const name = declaration.name;
412
+ if (declaration.attributes) return attributeGroup(file, element, input.draft, declaration, name, input.root);
313
413
  const range = element.attributeValueRanges[name];
314
- if (range === undefined) return [];
414
+ if (range === undefined) return omittedAttribute(file, element, input.draft, declaration, name, input.root);
315
415
  const preimage = file.text.slice(range.start, range.end);
316
416
  const reference = element.references[name];
317
417
  const value = reference === undefined
@@ -372,29 +472,17 @@ export function sourceBindingsForDraft(input: {
372
472
  return [...direct, ...recipes];
373
473
  }
374
474
 
375
- function controlForSchema(schema: StudioSourceBinding["schema"]): StudioParameterControl | undefined {
376
- if (schema === undefined) return undefined;
377
- if (schema.kind === "boolean") return "boolean";
378
- if (schema.kind === "number") return "number";
379
- if (schema.kind === "string") return schema.enum === undefined
380
- ? schema.format === "color" ? "color" : "text"
381
- : "select";
382
- if (schema.kind === "array") return "list";
383
- if (schema.kind === "object") return "record";
384
- return undefined;
385
- }
386
-
387
- /** Resolve the Companion's visible field table against real writable bindings. */
475
+ /** Resolve the Companion's visible field table against real bindings and entity facts. */
388
476
  export function inspectorFieldsForBindings(
389
477
  draft: StudioEntityDraft,
390
478
  bindings: readonly StudioSourceBinding[],
391
479
  declarations: readonly StudioInspectorFieldDeclaration[],
392
480
  ): readonly StudioInspectorField[] {
393
481
  const byBinding = new Map(bindings.map((binding) => [binding.binding, binding] as const));
394
- return declarations.flatMap((declaration): readonly StudioInspectorField[] => {
482
+ const fields = declarations.flatMap((declaration): readonly StudioInspectorField[] => {
395
483
  const binding = byBinding.get(declaration.binding);
396
- if (binding === undefined || !binding.writable) return [];
397
- const control = declaration.control ?? controlForSchema(binding.schema);
484
+ if (binding === undefined) return [];
485
+ const control = declaration.control ?? (binding.attributes ? "record" : parameterControlForSchema(binding.schema));
398
486
  if (control === undefined) {
399
487
  throw new Error(`Studio Inspector binding ${declaration.binding} has neither a control nor a supported public schema.`);
400
488
  }
@@ -408,10 +496,12 @@ export function inspectorFieldsForBindings(
408
496
  ...(declaration.options !== undefined || schemaOptions === undefined
409
497
  ? {}
410
498
  : { options: schemaOptions }),
411
- language: binding.language,
412
- source: binding.source,
499
+ ...(binding.writable ? { edit: { language: binding.language, source: binding.source, ...(binding.attributes ? { attributes: binding.attributes } : {}) } } : {}),
413
500
  }];
414
501
  });
502
+ return [...fields, ...(draft.inspector ?? []).map((fact): StudioInspectorField => ({
503
+ ...fact, id: `${draft.id}:inspector:fact:${fact.id}`, control: "text",
504
+ }))];
415
505
  }
416
506
 
417
507
  /** Runtime authority, rather than a Companion allowlist, makes timing fields writable. */
@@ -45,7 +45,11 @@ export function renderPreview(input: RenderInput): string {
45
45
  data-loop="${clip.source.loop}"
46
46
  data-phase="${clip.source.phaseSample / 48_000}"
47
47
  data-playback-rate="${clip.playbackRate}"
48
- data-gain="${clip.gain}"></audio>`;
48
+ data-gain="${clip.gain}"
49
+ data-presentation="${encodeURIComponent(JSON.stringify({
50
+ gainEnvelope: clip.gainEnvelope, audibility: clip.audibility,
51
+ fadeInSamples: clip.fadeInSamples, fadeOutSamples: clip.fadeOutSamples,
52
+ }))}"></audio>`;
49
53
  }).join("");
50
54
  return injectRuntimeShim(html, audio);
51
55
  }
@@ -1,3 +1,5 @@
1
+ import { audioEnvelopeGainAt } from "@hypit/composition";
2
+
1
3
  /**
2
4
  * Studio's frame driver for a compiled HyperFrames document.
3
5
  *
@@ -48,6 +50,7 @@ function shim(): string {
48
50
  rate: parseFloat(element.getAttribute('data-playback-rate') || '1') || 1
49
51
  });
50
52
  }
53
+ var audioContext;
51
54
  var programmeAudio = [];
52
55
  for (var element of document.querySelectorAll('.hypit-studio-audio')) {
53
56
  programmeAudio.push({
@@ -59,10 +62,51 @@ function shim(): string {
59
62
  loop: element.getAttribute('data-loop') === 'true',
60
63
  phase: parseFloat(element.getAttribute('data-phase') || '0') || 0,
61
64
  rate: parseFloat(element.getAttribute('data-playback-rate') || '1') || 1,
62
- gain: parseFloat(element.getAttribute('data-gain') || '1') || 1
65
+ gain: Number(element.getAttribute('data-gain') ?? '1'),
66
+ presentation: JSON.parse(decodeURIComponent(element.getAttribute('data-presentation') || '%7B%7D'))
63
67
  });
64
68
  }
65
69
 
70
+ function scheduleEnvelope(param, points, sample, now) {
71
+ param.cancelScheduledValues(now);
72
+ param.setValueAtTime(audioEnvelopeGainAt(points, sample), now);
73
+ for (var point of points || []) {
74
+ if (point.sample > sample) param.linearRampToValueAtTime(point.gain, now + (point.sample - sample) / 48000);
75
+ }
76
+ }
77
+
78
+ // Each factor has its own GainNode so intersecting ramps multiply exactly.
79
+ // These are the same absolute-sample envelopes consumed by the render mixer.
80
+ function placeAudioGain(record, seconds) {
81
+ if (!record.nodes) {
82
+ var source = audioContext.createMediaElementSource(record.element);
83
+ record.nodes = Array.from({ length: 5 }, function () { return audioContext.createGain(); });
84
+ var previous = source;
85
+ for (var node of record.nodes) { previous.connect(node); previous = node; }
86
+ previous.connect(audioContext.destination);
87
+ record.element.volume = 1;
88
+ }
89
+ var sample = seconds * 48000;
90
+ var now = audioContext.currentTime;
91
+ var p = record.presentation;
92
+ var start = record.start * 48000, end = (record.start + record.duration) * 48000;
93
+ record.nodes[0].gain.setValueAtTime(record.gain, now);
94
+ scheduleEnvelope(record.nodes[1].gain, p.gainEnvelope, sample, now);
95
+ scheduleEnvelope(record.nodes[2].gain, p.fadeInSamples > 0
96
+ ? [{ sample: start, gain: 0 }, { sample: start + p.fadeInSamples, gain: 1 }] : undefined, sample, now);
97
+ scheduleEnvelope(record.nodes[3].gain, p.fadeOutSamples > 0
98
+ ? [{ sample: end - p.fadeOutSamples, gain: 1 }, { sample: end, gain: 0 }] : undefined, sample, now);
99
+ var gate = record.nodes[4].gain;
100
+ gate.cancelScheduledValues(now);
101
+ gate.setValueAtTime(p.audibility === undefined || p.audibility.some(function (span) {
102
+ return sample >= span.startSample && sample < span.endSampleExclusive;
103
+ }) ? 1 : 0, now);
104
+ for (var span of p.audibility || []) {
105
+ if (span.startSample > sample) gate.setValueAtTime(1, now + (span.startSample - sample) / 48000);
106
+ if (span.endSampleExclusive > sample) gate.setValueAtTime(0, now + (span.endSampleExclusive - sample) / 48000);
107
+ }
108
+ }
109
+
66
110
  function seekDecoded(element, target) {
67
111
  if (Math.abs(element.currentTime - target) < 0.0005 && element.readyState >= 2) return Promise.resolve();
68
112
  return new Promise(function (resolve) {
@@ -148,7 +192,7 @@ function shim(): string {
148
192
  } else {
149
193
  if (Math.abs(element.currentTime - target) > 0.08) element.currentTime = target;
150
194
  element.playbackRate = record.rate;
151
- element.volume = Math.max(0, Math.min(1, record.gain));
195
+ placeAudioGain(record, currentSeconds + frameSeconds / 2);
152
196
  if (element.paused) {
153
197
  var started = element.play();
154
198
  if (started) started.catch(function () {});
@@ -169,6 +213,8 @@ function shim(): string {
169
213
  };
170
214
  window.__hypitPlayFrame = function (frame) {
171
215
  playing = true;
216
+ if (programmeAudio.length && !audioContext) audioContext = new AudioContext();
217
+ if (audioContext && audioContext.state === 'suspended') audioContext.resume();
172
218
  return apply(frame / fps, false);
173
219
  };
174
220
  window.__hypitFrameReady = apply(0, true);
@@ -178,7 +224,7 @@ function shim(): string {
178
224
  }
179
225
 
180
226
  export function injectRuntimeShim(html: string, audio = ""): string {
181
- const script = audio + shim();
227
+ const script = audio + shim().replace("(function () {", `(function () {\n${audioEnvelopeGainAt.toString()}`);
182
228
  const at = html.lastIndexOf("</body>");
183
229
  return at < 0 ? html + script : html.slice(0, at) + script + html.slice(at);
184
230
  }
@@ -4,13 +4,13 @@ import { sameType } from "@hypit/protocol";
4
4
  import type { Composition } from "@hypit/composition";
5
5
  import { compositionTypes } from "@hypit/composition";
6
6
  import {
7
- projectSemanticProgramSpace,
7
+ projectTimelineSpace,
8
8
  semanticAnchorFrames,
9
- semanticTrackSpans,
10
- } from "@hypit/semantic-track";
11
- import type { SemanticTrack } from "@hypit/semantic-track";
12
- import { semanticTrackTypes } from "@hypit/semantic-track";
13
- import { assertProgramSpaceIdentity, programSpaceTypes } from "@hypit/program-space";
9
+ timelineSpans,
10
+ } from "@hypit/timeline";
11
+ import type { Timeline } from "@hypit/timeline";
12
+ import { timelineTypes } from "@hypit/timeline";
13
+ import { assertProgramSpaceIdentity } from "@hypit/program-space";
14
14
  import type { ProgramSpace } from "@hypit/program-space";
15
15
  import type { StudioResolvedTrack, StudioTemporalBinding } from "@hypit/studio-adapter";
16
16
  import type { RuntimeHostTransientExecution } from "@hypit/runtime-host-node";
@@ -36,7 +36,6 @@ export type Preview = {
36
36
  readonly values: ReadonlyMap<string, unknown>;
37
37
  readonly temporalBindings: ReadonlyMap<string, readonly StudioTemporalBinding[]>;
38
38
  readonly composition: Composition;
39
- readonly timing: "measured" | "authored";
40
39
  readonly narrativeId?: string;
41
40
  readonly timingOutput?: { readonly name: string; readonly ref: string };
42
41
  readonly timingCandidateId?: string;
@@ -173,11 +172,11 @@ export async function preview(input: {
173
172
  const timingType = timingOutput?.typeRef ?? timingRecord?.type;
174
173
  const timingValue = selectedValue(executed.state, input.timeRef);
175
174
  if (timingValue?.kind !== "inline" || timingType === undefined) throw new Error("Studio requires a resolved film time source.");
176
- const semantic = sameType(timingType, semanticTrackTypes.track) ? timingValue.value as unknown as SemanticTrack : undefined;
177
- if (semantic === undefined && !sameType(timingType, programSpaceTypes.programSpace)) throw new Error("Unsupported Studio time source.");
178
- const spans = semantic === undefined ? [] : semanticTrackSpans(semantic);
179
- const anchors = semantic === undefined ? new Map<string, number>() : semanticAnchorFrames(semantic);
180
- const space = semantic === undefined ? timingValue.value as unknown as ProgramSpace : projectSemanticProgramSpace(semantic);
175
+ if (!sameType(timingType, timelineTypes.track)) throw new Error("Studio requires the declared Timeline.");
176
+ const semantic = timingValue.value as unknown as Timeline;
177
+ const spans = timelineSpans(semantic);
178
+ const anchors = semanticAnchorFrames(semantic);
179
+ const space = projectTimelineSpace(semantic);
181
180
  assertProgramSpaceIdentity(space);
182
181
  const rate = space.frameRate;
183
182
  const compositionValue = selectedValue(executed.state, input.compositionRef);
@@ -227,22 +226,8 @@ export async function preview(input: {
227
226
  const stored = selectedValue(executed.state, target.ref);
228
227
  if (stored?.kind === "inline") values.set(target.ref, stored.value);
229
228
  }
230
- // Author Records are already deterministic inline values from this exact
231
- // compilation. Studio Track Companions may need them to name a resolved projection
232
- // (for example Caption cue text); exposing them here avoids recomputing the
233
- // domain value or turning a Record into a fake graph target.
234
- for (const placement of input.source.observations.placements) {
235
- for (const value of placement.values) {
236
- const suffixes = [`::record::${value.id}`, `::output::${value.id}`];
237
- for (const reference of input.projections.flatMap((projection) => projection.trace.references)) {
238
- if (suffixes.some((suffix) => reference.ref.endsWith(suffix))) values.set(reference.ref, value.value);
239
- }
240
- }
241
- }
242
- // Script is a raw Surface, so its inline Records are not among the structured
243
- // element observations above. They are still ordinary Author values from
244
- // the same compilation and are needed to turn Caption atom ids back into the
245
- // text the author actually sees.
229
+ // Author records from this compilation already carry exact qualified references.
230
+ // Expose referenced inline values to Companions without guessing their owner by suffix.
246
231
  for (const record of input.source.compiled.program.records) {
247
232
  if (record.value.kind !== "inline") continue;
248
233
  if (input.projections.some((projection) => projection.trace.references
@@ -257,8 +242,7 @@ export async function preview(input: {
257
242
  values,
258
243
  temporalBindings,
259
244
  composition,
260
- timing: semantic === undefined ? "authored" : "measured",
261
- ...(semantic === undefined ? {} : { narrativeId: semantic.narrativeId }),
245
+ ...(semantic.narrativeId === undefined ? {} : { narrativeId: semantic.narrativeId }),
262
246
  timingOutput: { name: timingOutput?.name ?? space.id, ref: input.timeRef },
263
247
  ...(timingCandidateId === undefined ? {} : { timingCandidateId }),
264
248
  timingCandidateOrigin: timingCandidateId === undefined ? "source" : "run",
@@ -15,7 +15,7 @@ import type { ServedFile } from "./compile.js";
15
15
  import type { StudioDomain } from "./domain.js";
16
16
  import type { StudioCompanionRegistry } from "./studio-registry.js";
17
17
  import { loadStudioRun } from "./run.js";
18
- import { parameterAuthorValue, parameterOption, serializeParameterValue, validateParameterValue } from "./parameter-values.js";
18
+ import { parameterAuthorValue, parameterOption, serializeParameterValue, serializeAttributeGroup, validateParameterValue } from "./parameter-values.js";
19
19
  import { readStudioSession } from "./session.js";
20
20
  import type { Range, StudioFailure, StudioLibraryRequest, StudioLibraryView, StudioMutation, StudioSnapshot } from "./shared.js";
21
21
  import { createStudioStoryboard } from "./storyboard.js";
@@ -402,7 +402,7 @@ export function studioPlugin(options: StudioPluginOptions): Plugin {
402
402
  if (mutation.type === "timeline.adjust") return timelinePatches(mutation);
403
403
  const clip = currentClip(mutation.entityId);
404
404
  const parameter = clip.inspector.find((candidate) => candidate.id === mutation.parameterId);
405
- if (parameter === undefined) {
405
+ if (parameter?.edit === undefined) {
406
406
  throw new Error(`Entity ${mutation.entityId} has no writable parameter ${mutation.parameterId}.`);
407
407
  }
408
408
  const authorValue = parameterAuthorValue(parameter, mutation.value);
@@ -420,10 +420,14 @@ export function studioPlugin(options: StudioPluginOptions): Plugin {
420
420
  throw new Error(`${parameter.label} does not accept ${mutation.value}.`);
421
421
  }
422
422
  if (parameter.control === "color") validateParameterValue(authorValue, { kind: "string", format: "color" }, parameter.label);
423
- const encoded = serializeParameterValue(authorValue, parameter.language);
424
- const replacement = `${parameter.source.prefix ?? ""}${encoded}${parameter.source.suffix ?? ""}`;
425
- return replacement === parameter.source.preimage ? [] : [{
426
- ...parameter.source,
423
+ if (parameter.edit.attributes) {
424
+ const replacement = serializeAttributeGroup(parameter, authorValue);
425
+ return replacement === parameter.edit.source.preimage ? [] : [{ ...parameter.edit.source, replacement }];
426
+ }
427
+ const encoded = serializeParameterValue(authorValue, parameter.edit.language);
428
+ const replacement = `${parameter.edit.source.prefix ?? ""}${encoded}${parameter.edit.source.suffix ?? ""}`;
429
+ return replacement === parameter.edit.source.preimage ? [] : [{
430
+ ...parameter.edit.source,
427
431
  replacement,
428
432
  }];
429
433
  };
@@ -9,6 +9,7 @@ import type {
9
9
  StudioIcon,
10
10
  StudioEditHandle,
11
11
  StudioLaneDescription,
12
+ StudioTrackBand,
12
13
  StudioMaterialPreview,
13
14
  StudioInspectorField,
14
15
  StudioInspectorDomain,
@@ -63,6 +64,7 @@ export type StudioTrackBinding = {
63
64
  readonly companion: string;
64
65
  /** Studio-local partition key for an attached projection. */
65
66
  readonly attachmentId?: string;
67
+ readonly bands?: readonly Omit<StudioTrackBand, "bindings" | "inspector">[];
66
68
  readonly lane: StudioLaneDescription;
67
69
  readonly authoredTag?: string;
68
70
  readonly references: readonly { readonly name: string; readonly type: string }[];
@@ -95,6 +97,8 @@ export type Clip = {
95
97
  readonly presentId?: string;
96
98
  /** The authored id this Present is named after, when it names one. */
97
99
  readonly authoredId: string;
100
+ readonly selectionGroup?: string;
101
+ readonly band?: string;
98
102
  /** The Script marker that placed it, when something said put it there. */
99
103
  readonly markerId?: string;
100
104
  readonly display: StudioEntityDisplay;
@@ -281,8 +285,6 @@ export type StudioSnapshot = {
281
285
  /** The Tracks, compiled into the document the renderer photographs. */
282
286
  readonly preview: { readonly kind: "hyperframes"; readonly srcdoc: string };
283
287
  readonly provenance: {
284
- /** Where the timeline came from. The frame domain always shares its source. */
285
- readonly timing: "measured" | "authored";
286
288
  readonly picture: "resolved";
287
289
  /** What the badges above are standing for, in one sentence. */
288
290
  readonly note: string;