@hypit/hypit 0.1.4 → 0.1.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (462) hide show
  1. package/README.md +4 -2
  2. package/dist/public/caption.d.ts +206 -183
  3. package/dist/public/composition.d.ts +25 -3
  4. package/dist/public/endpoint-kit.d.ts +24 -2
  5. package/dist/public/generation.d.ts +5 -1
  6. package/dist/public/hyperframes.d.ts +19 -1
  7. package/dist/public/narrative.d.ts +17 -3
  8. package/dist/public/performance.d.ts +1590 -0
  9. package/dist/public/program-space.d.ts +179 -32
  10. package/dist/public/runtime-kit.d.ts +21 -8
  11. package/dist/public/sound.d.ts +822 -0
  12. package/dist/public/speech.d.ts +41 -0
  13. package/dist/public/studio-adapter.d.ts +77 -15
  14. package/dist/public/temporal-markup.d.ts +9 -44
  15. package/dist/public/temporal.d.ts +37 -28
  16. package/dist/public/{semantic-track.d.ts → timeline.d.ts} +62 -49
  17. package/examples/README.md +18 -10
  18. package/examples/minimal-author-package/packages/example-component/preview/preview.svml +19 -12
  19. package/examples/minimal-author-package/packages/example-component/src/component.ts +5 -5
  20. package/examples/minimal-author-package/packages/example-component/src/fragment.ts +3 -5
  21. package/examples/minimal-author-package/packages/example-component/src/manifest.ts +8 -10
  22. package/examples/minimal-author-package/packages/example-component/src/surface.ts +2 -2
  23. package/examples/provider-package/README.md +78 -0
  24. package/examples/provider-package/hypit.runtime.json +12 -0
  25. package/examples/provider-package/packages/provider-images/package.json +11 -0
  26. package/examples/provider-package/packages/provider-images/src/activation.ts +24 -0
  27. package/examples/provider-package/packages/provider-images/src/provider.ts +122 -0
  28. package/examples/provider-package/packages/provider-images/tsconfig.json +9 -0
  29. package/examples/semantic-composition/README.md +8 -1
  30. package/examples/semantic-composition/chat.svml +6 -5
  31. package/examples/semantic-composition/hypit.runtime.json +1 -1
  32. package/examples/semantic-composition/packages/chat-scene/README.md +3 -3
  33. package/examples/semantic-composition/packages/chat-scene/src/activation.ts +18 -21
  34. package/examples/semantic-composition/packages/chat-scene/src/render.ts +4 -4
  35. package/examples/semantic-composition/packages/performance-styles/README.md +42 -0
  36. package/examples/semantic-composition/packages/performance-styles/package.json +25 -0
  37. package/examples/semantic-composition/packages/performance-styles/src/activation.ts +57 -0
  38. package/examples/semantic-composition/packages/performance-styles/src/render.ts +54 -0
  39. package/examples/semantic-composition/packages/performance-styles/src/studio.ts +28 -0
  40. package/examples/semantic-composition/packages/performance-styles/tsconfig.json +18 -0
  41. package/examples/semantic-composition/packages/responsive-explainer/README.md +16 -9
  42. package/examples/semantic-composition/packages/responsive-explainer/src/activation.ts +12 -12
  43. package/examples/semantic-composition/packages/responsive-explainer/src/render.ts +5 -5
  44. package/examples/semantic-composition/packages/sound-styles/README.md +36 -0
  45. package/examples/semantic-composition/packages/sound-styles/package.json +25 -0
  46. package/examples/semantic-composition/packages/sound-styles/src/activation.ts +53 -0
  47. package/examples/semantic-composition/packages/sound-styles/src/render.ts +14 -0
  48. package/examples/semantic-composition/packages/sound-styles/tsconfig.json +18 -0
  49. package/package.json +35 -15
  50. package/packages/audio-track/README.md +20 -13
  51. package/packages/audio-track/package.json +1 -1
  52. package/packages/audio-track/src/component.ts +4 -4
  53. package/packages/audio-track/src/fragment.ts +6 -5
  54. package/packages/audio-track/src/index.ts +1 -1
  55. package/packages/audio-track/src/manifest.ts +17 -16
  56. package/packages/audio-track/src/program.ts +21 -25
  57. package/packages/audio-track/src/surface.ts +19 -18
  58. package/packages/audio-track-studio/README.md +23 -0
  59. package/packages/audio-track-studio/src/index.ts +28 -17
  60. package/packages/author-kit/README.md +1 -1
  61. package/packages/background-removal/README.md +4 -7
  62. package/packages/browser-capture/package.json +1 -1
  63. package/packages/build-result/README.md +11 -0
  64. package/packages/build-result/src/decode.ts +2 -0
  65. package/packages/build-result/src/execution-log.ts +17 -0
  66. package/packages/build-result/src/index.ts +1 -0
  67. package/packages/build-result/src/store.ts +14 -1
  68. package/packages/build-result/src/types.ts +3 -0
  69. package/packages/build-result-s3/src/repository.ts +4 -0
  70. package/packages/caption/README.md +61 -73
  71. package/packages/caption/package.json +3 -2
  72. package/packages/caption/src/activation.ts +2 -2
  73. package/packages/caption/src/component.ts +20 -5
  74. package/packages/caption/src/display.ts +3 -18
  75. package/packages/caption/src/fragment.ts +3 -7
  76. package/packages/caption/src/index.ts +6 -5
  77. package/packages/caption/src/manifest.ts +29 -46
  78. package/packages/caption/src/style.ts +24 -135
  79. package/packages/caption/src/surface.ts +12 -92
  80. package/packages/caption/src/temporalize.ts +18 -53
  81. package/packages/caption/src/types.ts +8 -35
  82. package/packages/caption/src/visibility.ts +23 -0
  83. package/packages/caption-fine/README.md +21 -9
  84. package/packages/caption-fine/package.json +4 -2
  85. package/packages/caption-fine/src/component.ts +3 -3
  86. package/packages/caption-fine/src/fragment.ts +7 -19
  87. package/packages/caption-fine/src/index.ts +2 -0
  88. package/packages/caption-fine/src/manifest.ts +26 -17
  89. package/packages/caption-fine/src/recipe.ts +7 -0
  90. package/packages/caption-fine/src/render.ts +14 -13
  91. package/packages/caption-fine/src/schedule.ts +39 -35
  92. package/packages/caption-fine/src/style.ts +10 -9
  93. package/packages/caption-fine/src/surface.ts +62 -35
  94. package/packages/caption-fine/src/types.ts +2 -0
  95. package/packages/caption-fine-studio/README.md +24 -2
  96. package/packages/caption-fine-studio/package.json +3 -1
  97. package/packages/caption-fine-studio/src/activation.ts +3 -3
  98. package/packages/caption-fine-studio/src/index.ts +54 -42
  99. package/packages/cli/README.md +57 -4
  100. package/packages/cli/package.json +1 -0
  101. package/packages/cli/src/arguments.ts +25 -6
  102. package/packages/cli/src/build-planning.ts +3 -2
  103. package/packages/cli/src/command.ts +6 -0
  104. package/packages/cli/src/commands/environment.ts +28 -18
  105. package/packages/cli/src/commands/execution.ts +81 -26
  106. package/packages/cli/src/commands/results.ts +7 -11
  107. package/packages/cli/src/index.ts +2 -2
  108. package/packages/cli/src/machine-view.ts +3 -2
  109. package/packages/cli/src/main.ts +34 -42
  110. package/packages/cli/src/observation.ts +7 -1
  111. package/packages/cli/src/output.ts +65 -23
  112. package/packages/cli/src/view.ts +66 -19
  113. package/packages/comment-sticker/README.md +3 -3
  114. package/packages/comment-sticker/package.json +1 -1
  115. package/packages/comment-sticker/src/component.ts +4 -4
  116. package/packages/comment-sticker/src/fragment.ts +5 -4
  117. package/packages/comment-sticker/src/manifest.ts +7 -6
  118. package/packages/comment-sticker/src/program.ts +9 -9
  119. package/packages/comment-sticker/src/surface.ts +6 -7
  120. package/packages/composition/README.md +21 -0
  121. package/packages/composition/src/audio-presentation.ts +44 -0
  122. package/packages/composition/src/index.ts +3 -0
  123. package/packages/composition/src/schema.ts +8 -3
  124. package/packages/composition/src/track.ts +15 -1
  125. package/packages/credential-store-env/README.md +1 -1
  126. package/packages/deck-track/README.md +3 -3
  127. package/packages/deck-track/package.json +1 -1
  128. package/packages/deck-track/src/component.ts +5 -5
  129. package/packages/deck-track/src/fragment.ts +6 -5
  130. package/packages/deck-track/src/lower.ts +12 -12
  131. package/packages/deck-track/src/manifest.ts +8 -7
  132. package/packages/deck-track/src/program.ts +13 -16
  133. package/packages/deck-track/src/surface.ts +9 -10
  134. package/packages/driver-node/src/driver.ts +41 -3
  135. package/packages/elevenlabs-speech/README.md +27 -0
  136. package/packages/{provider-xiaomi-mimo → elevenlabs-speech}/package.json +5 -8
  137. package/packages/elevenlabs-speech/src/activation.ts +26 -0
  138. package/packages/elevenlabs-speech/src/fragment.ts +11 -0
  139. package/packages/elevenlabs-speech/src/index.ts +111 -0
  140. package/packages/elevenlabs-speech/src/surface.ts +167 -0
  141. package/packages/endpoint-kit/README.md +24 -0
  142. package/packages/endpoint-kit/src/index.ts +7 -1
  143. package/packages/film/README.md +12 -7
  144. package/packages/film/package.json +1 -1
  145. package/packages/film/src/component.ts +4 -4
  146. package/packages/film/src/fragment.ts +6 -5
  147. package/packages/film/src/manifest.ts +11 -10
  148. package/packages/film/src/program.ts +5 -5
  149. package/packages/film/src/recipe.ts +2 -1
  150. package/packages/film/src/surface.ts +10 -7
  151. package/packages/film-studio/package.json +1 -1
  152. package/packages/film-studio/src/index.ts +2 -2
  153. package/packages/fishaudio-speech/README.md +33 -0
  154. package/packages/fishaudio-speech/package.json +21 -0
  155. package/packages/fishaudio-speech/src/activation.ts +32 -0
  156. package/packages/fishaudio-speech/src/fragment.ts +11 -0
  157. package/packages/fishaudio-speech/src/index.ts +156 -0
  158. package/packages/fishaudio-speech/src/surface.ts +192 -0
  159. package/packages/generation/README.md +11 -1
  160. package/packages/generation/src/mapping.ts +28 -30
  161. package/packages/gpt-image/README.md +1 -2
  162. package/packages/grok-imagine/README.md +1 -2
  163. package/packages/hyperframes/README.md +7 -3
  164. package/packages/hyperframes/src/browser-program.ts +11 -2
  165. package/packages/hyperframes/src/document.ts +15 -2
  166. package/packages/interview-emoji-reveal/README.md +4 -4
  167. package/packages/interview-emoji-reveal/package.json +1 -1
  168. package/packages/interview-emoji-reveal/src/component.ts +4 -4
  169. package/packages/interview-emoji-reveal/src/fragment.ts +6 -5
  170. package/packages/interview-emoji-reveal/src/manifest.ts +9 -8
  171. package/packages/interview-emoji-reveal/src/program.ts +14 -14
  172. package/packages/interview-emoji-reveal/src/surface.ts +8 -9
  173. package/packages/media-execution/README.md +7 -3
  174. package/packages/media-execution/src/audio-presentation.ts +23 -0
  175. package/packages/media-execution/src/execute.ts +2 -0
  176. package/packages/media-pipeline/README.md +7 -3
  177. package/packages/media-pipeline/src/audio-plan.ts +4 -1
  178. package/packages/media-pipeline/src/component.ts +16 -2
  179. package/packages/media-pipeline/src/manifest.ts +3 -1
  180. package/packages/media-pipeline/src/types.ts +2 -1
  181. package/packages/media-track/README.md +14 -47
  182. package/packages/media-track/package.json +1 -1
  183. package/packages/media-track/preview/preview.svml +5 -5
  184. package/packages/media-track/src/author.ts +12 -6
  185. package/packages/media-track/src/component.ts +10 -16
  186. package/packages/media-track/src/fragment.ts +8 -7
  187. package/packages/media-track/src/index.ts +3 -1
  188. package/packages/media-track/src/lower.ts +7 -7
  189. package/packages/media-track/src/manifest.ts +16 -38
  190. package/packages/media-track/src/program.ts +62 -67
  191. package/packages/media-track/src/sampling.ts +6 -6
  192. package/packages/media-track/src/sequence.ts +8 -8
  193. package/packages/media-track/src/surface.ts +25 -43
  194. package/packages/media-track-studio/README.md +9 -0
  195. package/packages/media-track-studio/src/index.ts +16 -11
  196. package/packages/mimo-speech/README.md +1 -1
  197. package/packages/minimax-h3/README.md +1 -1
  198. package/packages/nano-banana/README.md +1 -1
  199. package/packages/narrative/README.md +23 -1
  200. package/packages/narrative/src/identity.ts +11 -0
  201. package/packages/narrative/src/index.ts +3 -0
  202. package/packages/narrative/src/schema.ts +28 -27
  203. package/packages/narrative/src/selection.ts +52 -0
  204. package/packages/narrative/src/types.ts +2 -0
  205. package/packages/package-loader-node/README.md +30 -0
  206. package/packages/package-loader-node/package.json +5 -2
  207. package/packages/package-loader-node/src/distribution-resolution.ts +10 -3
  208. package/packages/package-loader-node/src/index.ts +1 -0
  209. package/packages/package-loader-node/src/loader.ts +12 -15
  210. package/packages/package-loader-node/src/location.ts +27 -1
  211. package/packages/package-loader-node/src/module-scope.ts +183 -0
  212. package/packages/package-loader-node/src/types.ts +4 -0
  213. package/packages/performance/README.md +83 -0
  214. package/packages/performance/package.json +30 -0
  215. package/packages/performance/src/activation.ts +11 -0
  216. package/packages/performance/src/component.ts +46 -0
  217. package/packages/performance/src/index.ts +6 -0
  218. package/packages/performance/src/manifest.ts +53 -0
  219. package/packages/{media-track/src/performance.ts → performance/src/media.ts} +9 -10
  220. package/packages/performance/src/program.ts +51 -0
  221. package/packages/performance/src/style.ts +35 -0
  222. package/packages/performance/src/surface.ts +99 -0
  223. package/packages/performance-studio/README.md +25 -0
  224. package/packages/performance-studio/package.json +21 -0
  225. package/packages/performance-studio/src/activation.ts +6 -0
  226. package/packages/performance-studio/src/index.ts +84 -0
  227. package/packages/program-space/README.md +9 -18
  228. package/packages/program-space/src/activation.ts +1 -5
  229. package/packages/program-space/src/index.ts +2 -11
  230. package/packages/program-space/src/surface.ts +1 -20
  231. package/packages/project-context-node/README.md +20 -0
  232. package/packages/project-context-node/package.json +10 -0
  233. package/packages/project-context-node/src/index.ts +3 -0
  234. package/packages/{cli → project-context-node}/src/runtime-selection.ts +7 -2
  235. package/packages/provider-hyperframes-local/README.md +43 -15
  236. package/packages/provider-hyperframes-local/src/activation.ts +4 -3
  237. package/packages/provider-hyperframes-local/src/capture-process.ts +26 -4
  238. package/packages/provider-hyperframes-local/src/capture.ts +96 -26
  239. package/packages/provider-hyperframes-local/src/concurrency.ts +86 -0
  240. package/packages/provider-hyperframes-local/src/opaque-capture.ts +92 -0
  241. package/packages/provider-hyperframes-local/src/options.ts +2 -0
  242. package/packages/provider-hyperframes-local/src/program.ts +6 -3
  243. package/packages/provider-hyperframes-local/src/progress.ts +53 -0
  244. package/packages/provider-hyperframes-local/src/provider.ts +18 -5
  245. package/packages/provider-hyperframes-local/src/render.ts +48 -7
  246. package/packages/provider-hypihub/README.md +48 -17
  247. package/packages/provider-hypihub/package.json +2 -0
  248. package/packages/provider-hypihub/src/mapping.ts +31 -7
  249. package/packages/provider-hypihub/src/oauth.ts +6 -0
  250. package/packages/provider-hypihub/src/provider.ts +25 -13
  251. package/packages/provider-hypihub/src/routes.ts +1 -2
  252. package/packages/provider-hypihub/src/upload.ts +2 -0
  253. package/packages/provider-media-local/README.md +3 -4
  254. package/packages/provider-whisperx-local/src/program.ts +1 -0
  255. package/packages/provider-whisperx-local/src/provider.ts +3 -0
  256. package/packages/ranking/README.md +8 -6
  257. package/packages/ranking/package.json +1 -1
  258. package/packages/ranking/src/component.ts +6 -6
  259. package/packages/ranking/src/fragment.ts +11 -7
  260. package/packages/ranking/src/manifest.ts +21 -14
  261. package/packages/ranking/src/render.ts +22 -26
  262. package/packages/ranking/src/schedule.ts +16 -19
  263. package/packages/ranking/src/surface.ts +12 -13
  264. package/packages/ranking-studio/README.md +18 -0
  265. package/packages/ranking-studio/src/index.ts +61 -9
  266. package/packages/render-hyperframes/README.md +7 -7
  267. package/packages/render-hyperframes/package.json +1 -1
  268. package/packages/render-hyperframes/src/component.ts +11 -1
  269. package/packages/render-hyperframes/src/fragment.ts +7 -4
  270. package/packages/render-hyperframes/src/manifest.ts +4 -4
  271. package/packages/render-hyperframes/src/surface.ts +6 -6
  272. package/packages/runtime/README.md +8 -1
  273. package/packages/runtime/src/execution.ts +15 -4
  274. package/packages/runtime/src/index.ts +2 -1
  275. package/packages/runtime/src/log.ts +51 -0
  276. package/packages/runtime/src/types.ts +5 -8
  277. package/packages/runtime-host-node/README.md +30 -0
  278. package/packages/runtime-host-node/package.json +1 -0
  279. package/packages/runtime-host-node/src/index.ts +24 -9
  280. package/packages/runtime-host-node/src/packages.ts +47 -50
  281. package/packages/runtime-kit/README.md +5 -0
  282. package/packages/runtime-kit/src/index.ts +3 -1
  283. package/packages/runtime-local/README.md +109 -4
  284. package/packages/runtime-local/src/config.ts +202 -56
  285. package/packages/runtime-local/src/control.ts +9 -1
  286. package/packages/runtime-local/src/executor.ts +66 -0
  287. package/packages/runtime-local/src/host.ts +37 -17
  288. package/packages/runtime-local/src/log.ts +48 -0
  289. package/packages/runtime-local/src/programs.ts +2 -1
  290. package/packages/runtime-local/src/result-writer.ts +2 -0
  291. package/packages/runtime-local/src/runtime.ts +8 -6
  292. package/packages/runtime-local/src/supervisor.ts +142 -0
  293. package/packages/runtime-local/src/types.ts +9 -2
  294. package/packages/runtime-local/src/worker-process.ts +7 -24
  295. package/packages/runtime-local/src/worker.ts +55 -83
  296. package/packages/screen-overlay/README.md +3 -3
  297. package/packages/screen-overlay/package.json +1 -1
  298. package/packages/screen-overlay/src/component.ts +3 -3
  299. package/packages/screen-overlay/src/fragment.ts +5 -4
  300. package/packages/screen-overlay/src/manifest.ts +7 -6
  301. package/packages/screen-overlay/src/program.ts +9 -9
  302. package/packages/screen-overlay/src/surface.ts +6 -7
  303. package/packages/script/README.md +30 -5
  304. package/packages/script/src/manifest.ts +4 -3
  305. package/packages/script/src/narrative.ts +1 -0
  306. package/packages/script/src/parser.ts +45 -6
  307. package/packages/script/src/surface.ts +4 -3
  308. package/packages/script/src/types.ts +1 -1
  309. package/packages/script-studio/package.json +9 -3
  310. package/packages/script-studio/src/index.ts +2 -0
  311. package/packages/script-studio/src/projection.ts +105 -0
  312. package/packages/seedance/README.md +30 -1
  313. package/packages/seedance/src/index.ts +18 -7
  314. package/packages/seedance/src/surface.ts +17 -4
  315. package/packages/seedance-kits/README.md +7 -1
  316. package/packages/seedream/README.md +1 -1
  317. package/packages/sound/README.md +81 -0
  318. package/packages/sound/package.json +25 -0
  319. package/packages/sound/src/activation.ts +11 -0
  320. package/packages/sound/src/component.ts +28 -0
  321. package/packages/sound/src/index.ts +5 -0
  322. package/packages/sound/src/manifest.ts +47 -0
  323. package/packages/sound/src/program.ts +84 -0
  324. package/packages/sound/src/style.ts +34 -0
  325. package/packages/sound/src/surface.ts +90 -0
  326. package/packages/sound-studio/README.md +22 -0
  327. package/packages/sound-studio/package.json +20 -0
  328. package/packages/sound-studio/src/activation.ts +6 -0
  329. package/packages/sound-studio/src/index.ts +74 -0
  330. package/packages/speech/README.md +2 -2
  331. package/packages/speech-alignment/src/local.ts +8 -0
  332. package/packages/speech-alignment/src/locate.ts +1 -1
  333. package/packages/store-sqlite/README.md +7 -0
  334. package/packages/store-sqlite/src/store.ts +84 -83
  335. package/packages/studio/INSPECTOR.md +15 -2
  336. package/packages/studio/LOCALIZATION.md +98 -0
  337. package/packages/studio/README.md +101 -14
  338. package/packages/studio/locales/en.json +197 -0
  339. package/packages/studio/locales/zh-CN.json +191 -0
  340. package/packages/studio/package.json +8 -7
  341. package/packages/studio/src/companion-assembly.ts +1 -0
  342. package/packages/studio/src/domain.ts +1 -1
  343. package/packages/studio/src/fallback-companions.ts +3 -3
  344. package/packages/studio/src/feedback-server.ts +51 -0
  345. package/packages/studio/src/feedback-store.ts +66 -0
  346. package/packages/studio/src/feedback.ts +60 -0
  347. package/packages/studio/src/localization-node.ts +46 -0
  348. package/packages/studio/src/localization.ts +85 -0
  349. package/packages/studio/src/parameter-values.ts +43 -1
  350. package/packages/studio/src/parameters.ts +114 -24
  351. package/packages/studio/src/preview/render.ts +5 -1
  352. package/packages/studio/src/preview/runtime-shim.ts +49 -3
  353. package/packages/studio/src/programme.ts +14 -30
  354. package/packages/studio/src/server.ts +10 -6
  355. package/packages/studio/src/shared.ts +4 -2
  356. package/packages/studio/src/snapshot.ts +21 -132
  357. package/packages/studio/src/studio-preflight.ts +3 -3
  358. package/packages/studio/src/studio-registry.ts +50 -6
  359. package/packages/studio/src/style.css +223 -50
  360. package/packages/studio/src/ui/artifact-name.ts +8 -6
  361. package/packages/studio/src/ui/artifact-preview.ts +5 -4
  362. package/packages/studio/src/ui/code.ts +17 -16
  363. package/packages/studio/src/ui/comments.ts +234 -0
  364. package/packages/studio/src/ui/dropdown.ts +68 -0
  365. package/packages/studio/src/ui/i18n.ts +109 -0
  366. package/packages/studio/src/ui/icons.ts +6 -0
  367. package/packages/studio/src/ui/library.ts +76 -65
  368. package/packages/studio/src/ui/main.ts +223 -211
  369. package/packages/studio/src/ui/overlay.ts +12 -8
  370. package/packages/studio/src/ui/scrub-preview.ts +110 -0
  371. package/packages/studio/src/ui/stage.ts +93 -29
  372. package/packages/studio/src/ui/timeline.ts +190 -118
  373. package/packages/studio/start.ts +41 -22
  374. package/packages/studio-adapter/README.md +130 -11
  375. package/packages/studio-adapter/src/index.ts +100 -13
  376. package/packages/temporal/README.md +6 -6
  377. package/packages/temporal/package.json +1 -1
  378. package/packages/temporal/src/component.ts +5 -6
  379. package/packages/temporal/src/index.ts +8 -6
  380. package/packages/temporal/src/location.ts +11 -11
  381. package/packages/temporal/src/projection.ts +19 -19
  382. package/packages/temporal/src/rational.ts +4 -4
  383. package/packages/temporal-markup/EDITING.md +2 -2
  384. package/packages/temporal-markup/README.md +27 -11
  385. package/packages/temporal-markup/package.json +1 -1
  386. package/packages/temporal-markup/src/index.ts +20 -25
  387. package/packages/temporal-markup/src/space.ts +10 -41
  388. package/packages/timeline/README.md +31 -0
  389. package/packages/{semantic-track → timeline}/package.json +1 -1
  390. package/packages/timeline/src/activation.ts +8 -0
  391. package/packages/timeline/src/component.ts +24 -0
  392. package/packages/timeline/src/identity.ts +60 -0
  393. package/packages/timeline/src/index.ts +6 -0
  394. package/packages/{semantic-track → timeline}/src/location.ts +20 -20
  395. package/packages/timeline/src/manifest.ts +39 -0
  396. package/packages/{semantic-track → timeline}/src/projection.ts +14 -14
  397. package/packages/timeline/src/types.ts +24 -0
  398. package/packages/timeline-author/README.md +68 -0
  399. package/packages/{speech-track → timeline-author}/package.json +6 -4
  400. package/packages/timeline-author/src/activation.ts +22 -0
  401. package/packages/{speech-track → timeline-author}/src/component.ts +15 -13
  402. package/packages/{speech-track → timeline-author}/src/fragment.ts +14 -23
  403. package/packages/timeline-author/src/index.ts +7 -0
  404. package/packages/timeline-author/src/manifest.ts +78 -0
  405. package/packages/timeline-author/src/program.ts +107 -0
  406. package/packages/timeline-author/src/surface.ts +46 -0
  407. package/packages/timeline-author/src/types.ts +6 -0
  408. package/packages/typography-track/README.md +4 -4
  409. package/packages/typography-track/package.json +1 -1
  410. package/packages/typography-track/src/component.ts +4 -4
  411. package/packages/typography-track/src/fragment.ts +4 -3
  412. package/packages/typography-track/src/manifest.ts +11 -9
  413. package/packages/typography-track/src/program.ts +15 -15
  414. package/packages/typography-track/src/surface.ts +17 -18
  415. package/packages/video-cli/README.md +4 -1
  416. package/packages/video-cli/package.json +2 -1
  417. package/packages/video-cli/src/creation.ts +14 -4
  418. package/packages/video-cli/src/index.ts +1 -1
  419. package/packages/video-cli/src/studio-distribution.ts +2 -1
  420. package/packages/volcengine-matting/README.md +3 -3
  421. package/packages/whisperx/README.md +1 -1
  422. package/services/whisperx/README.md +14 -0
  423. package/services/whisperx/pyproject.toml +2 -0
  424. package/services/whisperx/uv.lock +20 -20
  425. package/packages/provider-hyperframes-aws-lambda/README.md +0 -30
  426. package/packages/provider-hyperframes-aws-lambda/package.json +0 -30
  427. package/packages/provider-hyperframes-aws-lambda/src/activation.ts +0 -97
  428. package/packages/provider-hyperframes-aws-lambda/src/client.ts +0 -114
  429. package/packages/provider-hyperframes-aws-lambda/src/index.ts +0 -21
  430. package/packages/provider-hyperframes-aws-lambda/src/provider.ts +0 -522
  431. package/packages/provider-kie/README.md +0 -134
  432. package/packages/provider-kie/package.json +0 -43
  433. package/packages/provider-kie/src/activation.ts +0 -71
  434. package/packages/provider-kie/src/index.ts +0 -10
  435. package/packages/provider-kie/src/mapping.ts +0 -182
  436. package/packages/provider-kie/src/provider.ts +0 -657
  437. package/packages/provider-kie/src/routes.ts +0 -150
  438. package/packages/provider-xiaomi-mimo/README.md +0 -32
  439. package/packages/provider-xiaomi-mimo/src/activation.ts +0 -57
  440. package/packages/provider-xiaomi-mimo/src/index.ts +0 -5
  441. package/packages/provider-xiaomi-mimo/src/provider.ts +0 -214
  442. package/packages/runtime/src/environment.ts +0 -6
  443. package/packages/semantic-track/README.md +0 -21
  444. package/packages/semantic-track/src/activation.ts +0 -8
  445. package/packages/semantic-track/src/component.ts +0 -24
  446. package/packages/semantic-track/src/identity.ts +0 -58
  447. package/packages/semantic-track/src/index.ts +0 -6
  448. package/packages/semantic-track/src/manifest.ts +0 -38
  449. package/packages/semantic-track/src/types.ts +0 -26
  450. package/packages/speech-track/README.md +0 -51
  451. package/packages/speech-track/src/activation.ts +0 -19
  452. package/packages/speech-track/src/index.ts +0 -7
  453. package/packages/speech-track/src/manifest.ts +0 -73
  454. package/packages/speech-track/src/program.ts +0 -64
  455. package/packages/speech-track/src/surface.ts +0 -35
  456. package/packages/speech-track/src/types.ts +0 -6
  457. package/packages/speech-track-studio/README.md +0 -3
  458. package/packages/speech-track-studio/package.json +0 -14
  459. package/packages/speech-track-studio/src/activation.ts +0 -7
  460. package/packages/speech-track-studio/src/index.ts +0 -40
  461. /package/packages/{cli → project-context-node}/src/project-context.ts +0 -0
  462. /package/packages/{speech-track → timeline-author}/preview/Track.png +0 -0
@@ -2,7 +2,7 @@ import { captionProducers, captionTypes } from "@hypit/caption";
2
2
  import { compositionTypes } from "@hypit/composition";
3
3
  import { sealGraphFragment } from "@hypit/elaborator";
4
4
  import { narrativeTypes } from "@hypit/narrative";
5
- import { semanticTrackProducers, semanticTrackTypes } from "@hypit/semantic-track";
5
+ import { timelineTypes } from "@hypit/timeline";
6
6
  import { spatialTypes } from "@hypit/spatial";
7
7
 
8
8
  import { captionFineProducers, captionFineTypes } from "./manifest.js";
@@ -14,21 +14,15 @@ const operation = (id: string) => ({ kind: "fragment-operation" as const, operat
14
14
  export const fineCaptionTrackFragment = sealGraphFragment({
15
15
  inputs: [
16
16
  { name: "document", type: narrativeTypes.captionDocument },
17
- { name: "semantic", type: semanticTrackTypes.track },
17
+ { name: "timeline", type: timelineTypes.track },
18
18
  { name: "program", type: captionTypes.program },
19
19
  ],
20
20
  operations: [
21
- {
22
- id: "caption:space",
23
- producer: semanticTrackProducers.projectProgramSpace,
24
- inputs: { track: input("semantic") },
25
- result: { kind: "output", name: "space" },
26
- },
27
21
  {
28
22
  id: "caption:temporalize-document",
29
23
  producer: captionProducers.temporalizeDocument,
30
24
  inputs: {
31
- document: input("document"), semantic: input("semantic"), program: input("program"),
25
+ document: input("document"), timeline: input("timeline"),
32
26
  },
33
27
  result: { kind: "output", name: "caption" },
34
28
  },
@@ -45,7 +39,7 @@ export const fineCaptionTrackFragment = sealGraphFragment({
45
39
  producer: captionFineProducers.render,
46
40
  inputs: {
47
41
  schedule: operation("caption-fine:schedule"), program: input("program"),
48
- document: input("document"), space: operation("caption:space"),
42
+ document: input("document"), timeline: input("timeline"),
49
43
  },
50
44
  result: { kind: "output", name: "track" },
51
45
  },
@@ -68,22 +62,16 @@ export const fineCaptionTrackFragment = sealGraphFragment({
68
62
  export const fineCaptionRegionTrackFragment = sealGraphFragment({
69
63
  inputs: [
70
64
  { name: "document", type: narrativeTypes.captionDocument },
71
- { name: "semantic", type: semanticTrackTypes.track },
65
+ { name: "timeline", type: timelineTypes.track },
72
66
  { name: "program", type: captionTypes.program },
73
67
  { name: "regions", type: spatialTypes.regionTimeline },
74
68
  ],
75
69
  operations: [
76
- {
77
- id: "caption:space",
78
- producer: semanticTrackProducers.projectProgramSpace,
79
- inputs: { track: input("semantic") },
80
- result: { kind: "output", name: "space" },
81
- },
82
70
  {
83
71
  id: "caption:temporalize-document",
84
72
  producer: captionProducers.temporalizeDocument,
85
73
  inputs: {
86
- document: input("document"), semantic: input("semantic"), program: input("program"),
74
+ document: input("document"), timeline: input("timeline"),
87
75
  },
88
76
  result: { kind: "output", name: "caption" },
89
77
  },
@@ -100,7 +88,7 @@ export const fineCaptionRegionTrackFragment = sealGraphFragment({
100
88
  producer: captionFineProducers.renderWithRegions,
101
89
  inputs: {
102
90
  schedule: operation("caption-fine:schedule"), program: input("program"),
103
- document: input("document"), space: operation("caption:space"), regions: input("regions"),
91
+ document: input("document"), timeline: input("timeline"), regions: input("regions"),
104
92
  },
105
93
  result: { kind: "output", name: "track" },
106
94
  },
@@ -17,3 +17,5 @@ export {
17
17
  } from "./style.js";
18
18
  export { decodeFineCaptionStyleSurface, decodeFineCaptionTrackSurface } from "./surface.js";
19
19
  export type * from "./types.js";
20
+
21
+ export { fineCaptionEditableDefaults } from "./recipe.js";
@@ -1,12 +1,15 @@
1
+ import { temporalDependency, temporalTypes } from "@hypit/temporal";
2
+ import { temporalWindowAttributeVocabulary } from "@hypit/temporal-markup";
3
+ import type { Timeline } from "@hypit/timeline";
1
4
  import { readFile } from "node:fs/promises";
2
5
 
3
6
  import { captionManifest, captionModuleRef, captionTypes } from "@hypit/caption";
4
7
  import { compositionDependency, compositionTypes } from "@hypit/composition";
5
8
  import { mediaDependency, mediaTypes } from "@hypit/media";
6
9
  import { narrativeDependency, narrativeTypes } from "@hypit/narrative";
7
- import { programSpaceDependency, programSpaceTypes } from "@hypit/program-space";
10
+
8
11
  import type { ModuleManifest, ProducerRef } from "@hypit/protocol";
9
- import { semanticTrackDependency, semanticTrackTypes } from "@hypit/semantic-track";
12
+ import { timelineDependency, timelineTypes } from "@hypit/timeline";
10
13
  import { spatialDependency, spatialTypes } from "@hypit/spatial";
11
14
  import { svsRecipeType } from "@hypit/svs";
12
15
 
@@ -35,7 +38,7 @@ export const captionFineMarkupSurfaces = [
35
38
  summary: "Resolves one SVS Recipe and one exact font stack into a complete fine-grained Caption Style.",
36
39
  attributes: [
37
40
  { name: "id", kind: "identifier", required: true,
38
- summary: "Names this Style so a Caption Program can assign it." },
41
+ summary: "Names this Style so a timed Use can select it." },
39
42
  { name: "recipe", kind: "reference", required: true, accepts: [svsRecipeType],
40
43
  summary: "Chooses the Recipe that carries Cue geometry, Paint and local motion.",
41
44
  recipe: [
@@ -295,9 +298,9 @@ export const captionFineMarkupSurfaces = [
295
298
  },
296
299
  },
297
300
  {
298
- name: "track", tag: "Track", mode: "structured", outputs: [captionFineTypes.schedule, compositionTypes.visualTrack],
301
+ name: "track", tag: "Track", mode: "structured", outputs: [captionFineTypes.schedule, compositionTypes.visualTrack, captionTypes.program, captionTypes.timedProjection, captionTypes.header, captionTypes.filter, temporalTypes.instantSpec, temporalTypes.windowSpec, temporalTypes.instant, temporalTypes.window],
299
302
  vocabulary: {
300
- summary: "Joins the authored CaptionDocument against the SemanticTrack and renders it as one ordinary peer VisualTrack.",
303
+ summary: "Joins the authored CaptionDocument against the Timeline and renders it as one ordinary peer VisualTrack.",
301
304
  appearance: "One block of caption text wrapped into lines inside a rounded Cue box, placed at a Recipe-chosen point on the Canvas and spanning a fraction of its width. Cues follow the speech one after another, each arriving and leaving with its own motion, and the Words of a Cue either stand there together from its first Frame or uncover as they are spoken. As the speech advances, the Word being spoken, or every Word up to it, is repainted in the active Paint, snapping at the Word boundary or sweeping across the glyphs, and it may take a rule beneath it, a rounded highlight capsule behind it and a brief pop at the moment it becomes the spoken one. That capsule either stands alone on each Atom or grows as one continuous run over everything already read, following the Words across line breaks.\n\nEvery Cue uses the ordered exact font stack its Style names, with fallback faces supplying glyphs for other scripts. Emphasis varies by timed unit through the active Paint. Lines follow the common flow, so a line cannot be given a separate face, colour or weight of its own. A caption whose lines are set in different typefaces is outside what this Track can draw.",
302
305
  preview: previewImage("Track.png"),
303
306
  attributes: [
@@ -305,23 +308,30 @@ export const captionFineMarkupSurfaces = [
305
308
  summary: "Names this Track so its rendered output can be placed in a Film." },
306
309
  { name: "document", kind: "reference", required: true, accepts: [narrativeTypes.captionDocument],
307
310
  summary: "Chooses the Script-owned CaptionDocument." },
308
- { name: "semantic", kind: "reference", required: true, accepts: [semanticTrackTypes.track],
309
- summary: "Chooses the continuous SemanticTrack whose Word anchors give every Cue its time." },
310
- { name: "program", kind: "reference", required: true, accepts: [captionTypes.program],
311
- summary: "Chooses the Style assignment that decides which Style each run is rendered in." },
311
+ { name: "timeline", kind: "reference", required: true, accepts: [timelineTypes.track],
312
+ summary: "Chooses the continuous Timeline whose Word anchors give every Cue its time." },
312
313
  { name: "regions", kind: "reference", required: false, accepts: [spatialTypes.regionTimeline],
313
314
  summary: "Optionally follows external, frame-exact regions whose ids equal Script Roles, placing a Cue at its measured speaker region's top center and hiding it on null Frames." },
314
315
  ],
316
+ children: [{ tag: "Use", cardinality: "many", summary: "Presents complete Cues inside a time window. Later matching Uses replace earlier ones.", attributes: [
317
+ { name: "id", kind: "identifier", required: false, summary: "Optional occurrence identity." },
318
+ { name: "style", kind: "reference", required: true, accepts: [captionTypes.style], summary: "Complete Caption Style, including Hidden." },
319
+ { name: "role", kind: "literal", required: false, summary: "Optional speaker filter, independent of the time window." },
320
+ ...temporalWindowAttributeVocabulary,
321
+ ] }],
315
322
  ports: [
316
323
  { name: "schedule", type: captionFineTypes.schedule,
317
324
  summary: "The visible Cue schedule consumed by the renderer and other declared tools." },
318
325
  { name: "track", type: compositionTypes.visualTrack,
319
326
  summary: "The rendered Caption as one self-contained VisualTrack." },
320
327
  ],
321
- example: `<caption-fine:Track id="captions" document={story.caption} semantic={speech.semantic} program={caption-program}/>`,
328
+ example: `<caption-fine:Track id="captions" document={story.caption} timeline={speech.timeline}>
329
+ <caption-fine:Use style={primary-caption}/>
330
+ <caption-fine:Use during={story.selection.answer} style={answer-caption}/>
331
+ </caption-fine:Track>`,
322
332
  notes: [
323
- "The element is empty; it accepts no children and no text.",
324
- "One Track renders the Program's default Style and every ordered replacement together.",
333
+ "Use without time attributes covers the whole Timeline. Role filters content without changing the window.",
334
+ "Script Cue breaks organize text; Use windows change presentation without cutting Cues or restarting word timing. A hidden Use still replaces earlier presentation.",
325
335
  "Without regions, Recipe x/y placement is unchanged. With regions, a measured region overrides x/y for that Frame; a null Frame on that Role track hides the Cue, while a missing Role track retains authored x/y.",
326
336
  "The tracked point replaces Recipe x/y while width and the Recipe anchor still decide the Caption box geometry; anchor-x=center and anchor-y=bottom place the box immediately above the measured region.",
327
337
  ],
@@ -339,9 +349,8 @@ export const captionFineManifest: ModuleManifest = {
339
349
  compositionDependency,
340
350
  mediaDependency,
341
351
  narrativeDependency,
342
- programSpaceDependency,
343
- semanticTrackDependency,
344
- spatialDependency,
352
+ timelineDependency,
353
+ spatialDependency, temporalDependency,
345
354
  ],
346
355
  types: [{ name: captionFineTypes.schedule.name }],
347
356
  capabilities: [],
@@ -362,7 +371,7 @@ export const captionFineManifest: ModuleManifest = {
362
371
  { name: "schedule", type: captionFineTypes.schedule },
363
372
  { name: "program", type: captionTypes.program },
364
373
  { name: "document", type: narrativeTypes.captionDocument },
365
- { name: "space", type: programSpaceTypes.programSpace },
374
+ { name: "timeline", type: timelineTypes.track },
366
375
  ],
367
376
  outputs: [{ name: "track", type: compositionTypes.visualTrack }],
368
377
  needs: [],
@@ -373,7 +382,7 @@ export const captionFineManifest: ModuleManifest = {
373
382
  { name: "schedule", type: captionFineTypes.schedule },
374
383
  { name: "program", type: captionTypes.program },
375
384
  { name: "document", type: narrativeTypes.captionDocument },
376
- { name: "space", type: programSpaceTypes.programSpace },
385
+ { name: "timeline", type: timelineTypes.track },
377
386
  { name: "regions", type: spatialTypes.regionTimeline },
378
387
  ],
379
388
  outputs: [{ name: "track", type: compositionTypes.visualTrack }],
@@ -118,3 +118,10 @@ export const fineCaptionRecipeSchema: ValueSchema = {
118
118
  required.has(name) ? { schema: schemaFor(name) } : { schema: schemaFor(name), optional: true },
119
119
  ])),
120
120
  };
121
+
122
+ /** Static authored defaults; dependent paint values retain their decoder relationships. */
123
+ export const fineCaptionEditableDefaults = {
124
+ opacity: 1, "stroke-width": 0, "shadow-opacity": 0, "glow-opacity": 0,
125
+ karaoke: "off", "karaoke-transition": "step", "active-box": "off",
126
+ "underline": "off", "active-underline": "off",
127
+ } as const;
@@ -1,3 +1,4 @@
1
+ import type { Timeline } from "@hypit/timeline";
1
2
  import { assertCaptionProgramForDocument } from "@hypit/caption";
2
3
  import type { CaptionProgram } from "@hypit/caption";
3
4
  import { assertVisualTrackIdentity, sealVisualTrack } from "@hypit/composition";
@@ -14,7 +15,6 @@ import type {
14
15
  } from "@hypit/composition";
15
16
  import type { CaptionAlignmentUnit, CaptionDocument } from "@hypit/narrative";
16
17
  import { assertProgramSpaceIdentity, programSpaceFrameCount } from "@hypit/program-space";
17
- import type { ProgramSpace } from "@hypit/program-space";
18
18
  import { assertSpatialRegionTimeline } from "@hypit/spatial";
19
19
  import type { CanvasSpace, SpatialFrame, SpatialRegionTimeline } from "@hypit/spatial";
20
20
 
@@ -639,7 +639,7 @@ function structuralRowCount(
639
639
 
640
640
  /**
641
641
  * Acoustic Word windows may overlap. Preserve those measurements in the
642
- * SemanticTrack, but give every current-only visual state one unambiguous
642
+ * Timeline, but give every current-only visual state one unambiguous
643
643
  * owner: as soon as the next authored unit starts, the previous one stops.
644
644
  */
645
645
  function exclusiveActivationFrames(
@@ -1069,33 +1069,32 @@ export function renderFineCaption(
1069
1069
  schedule: FineCaptionSchedule,
1070
1070
  program: CaptionProgram,
1071
1071
  document: CaptionDocument,
1072
- space: ProgramSpace,
1072
+ timeline: Timeline,
1073
1073
  regions?: SpatialRegionTimeline,
1074
1074
  ): VisualTrack {
1075
1075
  assertFineCaptionSchedule(schedule);
1076
1076
  assertCaptionProgramForDocument(program, document);
1077
1077
  if (schedule.documentId !== document.id) throw new Error("Fine Caption received another CaptionDocument");
1078
- if (program.wordRuns.length !== 0) {
1079
- throw new Error("Fine Caption accepts one uniform token rule and cannot consume word-specific Style runs");
1080
- }
1081
- assertProgramSpaceIdentity(space);
1082
- if (schedule.spaceId !== space.id || schedule.narrativeId !== document.narrativeId) {
1083
- throw new Error("Fine Caption inputs belong to different ProgramSpaces or Narratives");
1078
+
1079
+ assertProgramSpaceIdentity(timeline);
1080
+ if (schedule.spaceId !== timeline.id || schedule.narrativeId !== document.narrativeId) {
1081
+ throw new Error("Fine Caption inputs belong to different Timelines or Narratives");
1084
1082
  }
1085
1083
  const styles = new Map(program.styles.map((style) => [style.id, style]));
1086
1084
  const wordText = new Map(document.words.map((word) => [word.id, word.text]));
1087
1085
  const atomById = new Map(document.units.map((atom) => [atom.id, atom]));
1088
1086
  for (const style of styles.values()) {
1087
+ if (style.rendering === null) continue;
1089
1088
  if (style.rendering.family !== FINE_CAPTION_FAMILY) {
1090
1089
  throw new Error(`Fine Caption cannot render Style family ${style.rendering.family}`);
1091
1090
  }
1092
1091
  assertFineCaptionParameters(style.rendering.parameters as unknown as FineCaptionParameters);
1093
1092
  }
1094
- const totalFrames = programSpaceFrameCount(space);
1093
+ const totalFrames = programSpaceFrameCount(timeline);
1095
1094
  const regionTracks = regions === undefined ? undefined : (() => {
1096
1095
  assertSpatialRegionTimeline(regions);
1097
1096
  if (regions.frameCount !== totalFrames) {
1098
- throw new Error(`Fine Caption regions cover ${regions.frameCount} Frames but ProgramSpace has ${totalFrames}`);
1097
+ throw new Error(`Fine Caption regions cover ${regions.frameCount} Frames but Timeline has ${totalFrames}`);
1099
1098
  }
1100
1099
  return new Map(regions.tracks.map((track) => [track.id, track]));
1101
1100
  })();
@@ -1105,6 +1104,7 @@ export function renderFineCaption(
1105
1104
  const resolvedAtoms = atoms.map((atom) => atom!);
1106
1105
  const style = styles.get(cue.styleId);
1107
1106
  if (style === undefined) throw new Error(`Fine Caption Cue ${cue.id} references unknown Style ${cue.styleId}`);
1107
+ if (style.rendering === null) return [];
1108
1108
  const parameters = style.rendering.parameters as unknown as FineCaptionParameters;
1109
1109
  const startFrame = Math.max(0, cue.visibleStartFrame);
1110
1110
  const measuredEnd = Math.min(totalFrames, cue.visibleEndFrameExclusive);
@@ -1130,16 +1130,17 @@ export function renderFineCaption(
1130
1130
  return [{
1131
1131
  id: cue.id,
1132
1132
  span: { startFrame, endFrameExclusive },
1133
+ visibility: cue.visibility,
1133
1134
  stacking: { order: parameters.stackingOrder, tieBreak: `${program.id}:${cue.id}` },
1134
1135
  elements: cueElements(resolvedAtoms, atomFrames, parameters, wordText, durationFrames, cue.styleId, trackedPlacement),
1135
1136
  }];
1136
1137
  });
1137
1138
  const track = sealVisualTrack({
1138
- programSpaceId: space.id,
1139
+ programSpaceId: timeline.id,
1139
1140
  visualIr: "hypit.visual-ir@1",
1140
1141
  id: program.id,
1141
1142
  presents,
1142
1143
  });
1143
- assertVisualTrackIdentity(track, space);
1144
+ assertVisualTrackIdentity(track, timeline);
1144
1145
  return track;
1145
1146
  }
@@ -1,4 +1,4 @@
1
- import { applyCaptionMute, assertCaptionProgramForDocument, assertTimedCaptionProjection } from "@hypit/caption";
1
+ import { assertCaptionProgramForDocument, assertTimedCaptionProjection, captionUseVisibility } from "@hypit/caption";
2
2
  import type { CaptionProgram, TimedCaptionProjection } from "@hypit/caption";
3
3
  import type { CaptionDocument } from "@hypit/narrative";
4
4
 
@@ -27,13 +27,11 @@ export function scheduleFineCaption(
27
27
  if (projection.narrativeId !== document.narrativeId) {
28
28
  throw new Error("Fine Caption Schedule received a CaptionDocument from another Narrative");
29
29
  }
30
- if (program.wordRuns.length !== 0) {
31
- throw new Error("Fine Caption accepts one uniform token rule and cannot consume word-specific Style runs");
32
- }
33
- const visibleProjection = applyCaptionMute(projection, program, document);
34
-
35
30
  const parameters = new Map<string, FineCaptionParameters>();
31
+ const activeStyles = new Set(program.uses.map(use => use.styleId));
36
32
  for (const style of program.styles) {
33
+ if (!activeStyles.has(style.id)) continue;
34
+ if (style.rendering === null) continue;
37
35
  if (style.rendering.family !== FINE_CAPTION_FAMILY) {
38
36
  throw new Error(`Fine Caption cannot schedule Style family ${style.rendering.family}`);
39
37
  }
@@ -42,39 +40,41 @@ export function scheduleFineCaption(
42
40
  parameters.set(style.id, value);
43
41
  }
44
42
 
45
- const desired = visibleProjection.cues.map((cue): FineCaptionScheduledCue => {
46
- const style = parameters.get(cue.styleId);
47
- if (style === undefined) throw new Error(`Fine Caption Cue ${cue.id} references unknown Style ${cue.styleId}`);
48
- const visibleStartFrame = Math.max(0, cue.startFrame - style.timing.leadFrames);
49
- const visibleEndFrameExclusive = cue.endFrameExclusive + style.timing.tailFrames;
50
- return {
51
- id: cue.id,
52
- styleId: cue.styleId,
53
- semanticStartFrame: cue.startFrame,
54
- semanticEndFrameExclusive: cue.endFrameExclusive,
55
- visibleStartFrame,
56
- visibleEndFrameExclusive,
57
- units: cue.units,
58
- };
59
- });
60
-
43
+ const units = new Map(document.units.map(unit => [unit.id, unit]));
61
44
  const cues: FineCaptionScheduledCue[] = [];
62
- for (const wanted of desired) {
63
- let cue = wanted;
64
- const previous = cues.at(-1);
65
- if (previous !== undefined) {
66
- const previousStyle = parameters.get(previous.styleId)!;
67
- const currentStyle = parameters.get(cue.styleId)!;
68
- if (previousStyle.timing.handoff === "cut" || currentStyle.timing.handoff === "cut") {
69
- const previousEnd = Math.max(
70
- previous.semanticEndFrameExclusive,
71
- Math.min(previous.visibleEndFrameExclusive, cue.semanticStartFrame),
72
- );
73
- cues[cues.length - 1] = { ...previous, visibleEndFrameExclusive: previousEnd };
45
+ for (const [index, use] of program.uses.entries()) {
46
+ if (use.window.start.source.spaceId !== projection.spaceId) throw new Error("Caption Use belongs to another Timeline");
47
+ const style = parameters.get(use.styleId);
48
+ if (style === undefined) continue; // Hidden still participates in coverage below.
49
+ const desired = projection.cues.filter(cue => use.role === undefined || units.get(cue.units[0]!.unitId)?.role === use.role).map((cue): FineCaptionScheduledCue => ({
50
+ id: `${use.window.subjectId}:${cue.id}`, cueId: cue.id, styleId: use.styleId,
51
+ semanticStartFrame: cue.startFrame, semanticEndFrameExclusive: cue.endFrameExclusive,
52
+ visibleStartFrame: Math.max(0, cue.startFrame - style.timing.leadFrames),
53
+ visibleEndFrameExclusive: cue.endFrameExclusive + style.timing.tailFrames,
54
+ units: cue.units, visibility: [],
55
+ }));
56
+ // Resolve each speaker's ordinary Cue handoff before masking by Use windows.
57
+ desired.sort((a, b) => a.semanticStartFrame - b.semanticStartFrame);
58
+ const previousByRole = new Map<string | undefined, number>();
59
+ const envelopes: FineCaptionScheduledCue[] = [];
60
+ for (const wanted of desired) {
61
+ let cue = wanted;
62
+ const role = units.get(cue.units[0]!.unitId)?.role;
63
+ const previousIndex = previousByRole.get(role);
64
+ const previous = previousIndex === undefined ? undefined : envelopes[previousIndex];
65
+ if (previous !== undefined && style.timing.handoff === "cut" && previous.semanticEndFrameExclusive <= cue.semanticStartFrame) {
66
+ const previousEnd = Math.max(previous.semanticEndFrameExclusive, Math.min(previous.visibleEndFrameExclusive, cue.semanticStartFrame));
67
+ envelopes[previousIndex!] = { ...previous, visibleEndFrameExclusive: previousEnd };
74
68
  cue = { ...cue, visibleStartFrame: Math.min(cue.semanticStartFrame, Math.max(cue.visibleStartFrame, previousEnd)) };
75
69
  }
70
+ previousByRole.set(role, envelopes.length);
71
+ envelopes.push(cue);
72
+ }
73
+ for (const cue of envelopes) {
74
+ const role = units.get(cue.units[0]!.unitId)?.role;
75
+ const visibility = captionUseVisibility(program, index, role, { startFrame: cue.visibleStartFrame, endFrameExclusive: cue.visibleEndFrameExclusive });
76
+ if (visibility.length) cues.push({ ...cue, visibility });
76
77
  }
77
- cues.push(cue);
78
78
  }
79
79
 
80
80
  const ids = new Set<string>();
@@ -110,6 +110,10 @@ export function assertFineCaptionSchedule(value: FineCaptionSchedule): void {
110
110
  throw new Error("Fine Caption Schedule contains an invalid Cue");
111
111
  }
112
112
  ids.add(cue.id);
113
+ if (!cue.cueId || cue.visibility.length === 0 || cue.visibility.some(span =>
114
+ !Number.isSafeInteger(span.startFrame) || !Number.isSafeInteger(span.endFrameExclusive)
115
+ || span.startFrame < cue.visibleStartFrame || span.endFrameExclusive > cue.visibleEndFrameExclusive
116
+ || span.endFrameExclusive <= span.startFrame)) throw new Error("Fine Caption visibility is invalid");
113
117
  for (const [label, frame] of [
114
118
  ["semantic start", cue.semanticStartFrame],
115
119
  ["semantic end", cue.semanticEndFrameExclusive],
@@ -8,6 +8,7 @@ import type { SvsRecipe } from "@hypit/svs";
8
8
  import type { FineCaptionGlyphPaint, FineCaptionParameters } from "./types.js";
9
9
  import {
10
10
  fineCaptionOneShotMotions,
11
+ fineCaptionEditableDefaults,
11
12
  fineCaptionOptionalRecipeProperties,
12
13
  fineCaptionRequiredRecipeProperties,
13
14
  } from "./recipe.js";
@@ -104,14 +105,14 @@ function glyphPaint(recipe: SvsRecipe, prefix: "" | "active-", base?: FineCaptio
104
105
  return {
105
106
  fill: color(recipe, `${prefix}fill`, prefix === "active-" ? "#FFD54A" : base?.fill),
106
107
  ...(gradient === undefined ? {} : { gradient }),
107
- opacity: number(recipe, `${prefix}opacity`, base?.opacity ?? 1),
108
+ opacity: number(recipe, `${prefix}opacity`, base?.opacity ?? fineCaptionEditableDefaults.opacity),
108
109
  stroke: {
109
110
  color: color(recipe, `${prefix}stroke-color`, baseStroke?.color ?? "#000000"),
110
- widthPx: number(recipe, `${prefix}stroke-width`, baseStroke?.widthPx ?? 0),
111
+ widthPx: number(recipe, `${prefix}stroke-width`, baseStroke?.widthPx ?? fineCaptionEditableDefaults["stroke-width"]),
111
112
  },
112
113
  shadow: {
113
114
  color: color(recipe, `${prefix}shadow-color`, baseShadow?.color ?? "#000000"),
114
- opacity: number(recipe, `${prefix}shadow-opacity`, baseShadow?.opacity ?? 0),
115
+ opacity: number(recipe, `${prefix}shadow-opacity`, baseShadow?.opacity ?? fineCaptionEditableDefaults["shadow-opacity"]),
115
116
  offsetXPx: number(recipe, `${prefix}shadow-x`, baseShadow?.offsetXPx ?? 0),
116
117
  offsetYPx: number(recipe, `${prefix}shadow-y`, baseShadow?.offsetYPx ?? 0),
117
118
  blurPx: number(recipe, `${prefix}shadow-blur`, baseShadow?.blurPx ?? 0),
@@ -125,7 +126,7 @@ function glyphPaint(recipe: SvsRecipe, prefix: "" | "active-", base?: FineCaptio
125
126
  },
126
127
  glow: {
127
128
  color: color(recipe, `${prefix}glow-color`, baseGlow?.color ?? "#FFFFFF"),
128
- opacity: number(recipe, `${prefix}glow-opacity`, baseGlow?.opacity ?? 0),
129
+ opacity: number(recipe, `${prefix}glow-opacity`, baseGlow?.opacity ?? fineCaptionEditableDefaults["glow-opacity"]),
129
130
  blurPx: number(recipe, `${prefix}glow-blur`, baseGlow?.blurPx ?? 0),
130
131
  spreadPx: number(recipe, `${prefix}glow-spread`, baseGlow?.spreadPx ?? 0),
131
132
  },
@@ -216,13 +217,13 @@ export function fineCaptionParameters(
216
217
  basePaint,
217
218
  activePaint: glyphPaint(recipe, "active-", basePaint),
218
219
  underline: {
219
- mode: choice(recipe, "underline", ["off", "always"] as const, "off"),
220
+ mode: choice(recipe, "underline", ["off", "always"] as const, fineCaptionEditableDefaults["underline"]),
220
221
  color: color(recipe, "underline-color", basePaint.fill),
221
222
  thicknessPx: number(recipe, "underline-thickness", 2),
222
223
  offsetPx: number(recipe, "underline-offset", 4),
223
224
  },
224
225
  activeUnderline: {
225
- mode: choice(recipe, "active-underline", ["off", "current", "trail"] as const, "off"),
226
+ mode: choice(recipe, "active-underline", ["off", "current", "trail"] as const, fineCaptionEditableDefaults["active-underline"]),
226
227
  color: color(recipe, "active-underline-color", "#FFD54A"),
227
228
  thicknessPx: number(recipe, "active-underline-thickness", 3),
228
229
  offsetPx: number(recipe, "active-underline-offset", 4),
@@ -244,11 +245,11 @@ export function fineCaptionParameters(
244
245
  },
245
246
  },
246
247
  karaoke: {
247
- mode: choice(recipe, "karaoke", ["off", "current", "trail"] as const, "off"),
248
- transition: choice(recipe, "karaoke-transition", ["step", "wipe"] as const, "step"),
248
+ mode: choice(recipe, "karaoke", ["off", "current", "trail"] as const, fineCaptionEditableDefaults["karaoke"]),
249
+ transition: choice(recipe, "karaoke-transition", ["step", "wipe"] as const, fineCaptionEditableDefaults["karaoke-transition"]),
249
250
  },
250
251
  activeBox: {
251
- mode: choice(recipe, "active-box", ["off", "current", "trail"] as const, "off"),
252
+ mode: choice(recipe, "active-box", ["off", "current", "trail"] as const, fineCaptionEditableDefaults["active-box"]),
252
253
  continuity: choice(recipe, "active-box-continuity", ["isolated", "joined"] as const, "isolated"),
253
254
  background: color(recipe, "active-box-background", "#FFD54A"),
254
255
  borderColor: color(recipe, "active-box-border-color", "#00000000"),
@@ -1,8 +1,8 @@
1
- import { captionTypes } from "@hypit/caption";
1
+ import { captionTypes, captionProducers } from "@hypit/caption";
2
2
  import { assertFontArtifactRef, assertFontStackRef, mediaTypes } from "@hypit/media";
3
3
  import type { FontArtifactRef, FontStackRef } from "@hypit/media";
4
4
  import { narrativeTypes } from "@hypit/narrative";
5
- import { semanticTrackTypes } from "@hypit/semantic-track";
5
+ import { timelineTypes } from "@hypit/timeline";
6
6
  import { spatialTypes } from "@hypit/spatial";
7
7
  import { svsRecipeType } from "@hypit/svs";
8
8
  import type { SvsRecipe } from "@hypit/svs";
@@ -13,7 +13,16 @@ import type {
13
13
  MarkupAttributeValue,
14
14
  } from "@hypit/markup";
15
15
 
16
- import { fineCaptionRegionTrackFragment, fineCaptionTrackFragment } from "./fragment.js";
16
+ import { sealGraphFragment } from "@hypit/elaborator";
17
+ import type { FragmentOperation } from "@hypit/elaborator";
18
+ import type { SurfaceRecordDraft, SurfaceComponentDraft } from "@hypit/markup";
19
+ import { assertEmptyElement, optionalTextAttribute } from "@hypit/markup";
20
+ import { createTemporalWindowProjection, resolveTemporalContext, temporalWindowAttributeNames } from "@hypit/temporal-markup";
21
+ import { temporalTypes } from "@hypit/temporal";
22
+ import { compositionTypes } from "@hypit/composition";
23
+ import { captionFineProducers, captionFineTypes } from "./manifest.js";
24
+ const input = (name: string) => ({ kind: "fragment-input" as const, name });
25
+ const operation = (id: string) => ({ kind: "fragment-operation" as const, operation: id });
17
26
  import { fineCaptionStyle } from "./style.js";
18
27
 
19
28
  function sameType(left: SurfaceResolvedReference["type"], right: SurfaceResolvedReference["type"]): boolean {
@@ -114,39 +123,57 @@ export const decodeFineCaptionStyleSurface: StructuredSurfaceHandler = ({ elemen
114
123
  };
115
124
 
116
125
  export const decodeFineCaptionTrackSurface: StructuredSurfaceHandler = ({ element, resolveReference }) => {
117
- attributes(element, ["id", "document", "semantic", "program"], ["regions"]);
118
- if (element.children.some((child) => child.kind === "element" || child.value.trim())) {
119
- throw new Error(`${element.name} does not accept children`);
120
- }
126
+ attributes(element, ["id", "document", "timeline"], ["regions"]);
121
127
  const id = stringAttribute(element, "id");
122
128
  const document = reference(element, "document", narrativeTypes.captionDocument, resolveReference);
123
- const semantic = reference(element, "semantic", semanticTrackTypes.track, resolveReference);
124
- const program = reference(element, "program", captionTypes.program, resolveReference);
125
- if (element.attributes.regions !== undefined) {
126
- const regions = reference(element, "regions", spatialTypes.regionTimeline, resolveReference);
127
- return {
128
- records: [],
129
- components: [{
130
- id,
131
- fragment: fineCaptionRegionTrackFragment.id,
132
- inputs: { document: document.ref, semantic: semantic.ref, program: program.ref, regions: regions.ref },
133
- outputs: { schedule: `${id}.schedule`, track: `${id}.track` },
134
- range: element.range,
135
- }],
136
- fragments: [fineCaptionRegionTrackFragment],
137
- };
129
+ const context = resolveTemporalContext({ element, resolveReference });
130
+ const regions = element.attributes.regions === undefined ? undefined : reference(element, "regions", spatialTypes.regionTimeline, resolveReference);
131
+ const records: SurfaceRecordDraft[] = [{ id: `${id}.header`, type: captionTypes.header,
132
+ value: { kind: "inline", value: { id } }, range: element.range }];
133
+ const components: SurfaceComponentDraft[] = [];
134
+ const fragments: ReturnType<typeof sealGraphFragment>[] = [];
135
+ const inputs: { name: string; type: SurfaceResolvedReference["type"] }[] = [{ name: "document", type: narrativeTypes.captionDocument }, { name: "timeline", type: timelineTypes.track }, { name: "header", type: captionTypes.header }];
136
+ const bindings: Record<string, SurfaceResolvedReference["ref"]> = { document: document.ref, timeline: context.timeline.ref, header: { kind: "record", id: `${id}.header` } };
137
+ const operations: FragmentOperation[] = [{ id: "create", producer: captionProducers.create,
138
+ inputs: { document: input("document"), header: input("header") }, result: { kind: "output", name: "program" } }];
139
+ let previous = "create", index = 0;
140
+ for (const child of element.children) {
141
+ if (child.kind === "text") { if (child.value.trim()) throw new Error("Caption Track accepts Use children."); continue; }
142
+ if (localName(child.name) !== "Use") throw new Error("Caption Track accepts Use children.");
143
+ attributes(child, ["style"], ["id", "role", ...temporalWindowAttributeNames]);
144
+ assertEmptyElement(child);
145
+ index += 1;
146
+ const useId = optionalTextAttribute(child, "id") ?? `${id}.use.${index}`;
147
+ const hasTime = temporalWindowAttributeNames.some(name => child.attributes[name] !== undefined);
148
+ const temporal = createTemporalWindowProjection({ id: useId, ...context, resolveReference,
149
+ element: hasTime ? child : { ...child, attributes: { ...child.attributes, during: "program" } } });
150
+ records.push(...temporal.records); components.push(...temporal.components); fragments.push(...temporal.fragments);
151
+ const style = reference(child, "style", captionTypes.style, resolveReference);
152
+ const role = optionalTextAttribute(child, "role");
153
+ const filterId = `${useId}.filter`;
154
+ records.push({ id: filterId, type: captionTypes.filter, value: { kind: "inline", value: role === undefined ? {} : { role } }, range: child.range });
155
+ const key = `use-${index}`;
156
+ inputs.push({ name: `${key}-window`, type: temporalTypes.window }, { name: `${key}-style`, type: captionTypes.style }, { name: `${key}-filter`, type: captionTypes.filter });
157
+ bindings[`${key}-window`] = temporal.ref; bindings[`${key}-style`] = style.ref; bindings[`${key}-filter`] = { kind: "record", id: filterId };
158
+ operations.push({ id: key, producer: captionProducers.append,
159
+ inputs: { program: operation(previous), window: input(`${key}-window`), style: input(`${key}-style`), filter: input(`${key}-filter`) }, result: { kind: "output", name: "program" } });
160
+ previous = key;
138
161
  }
139
- return {
140
- records: [],
141
- components: [{
142
- id,
143
- fragment: fineCaptionTrackFragment.id,
144
- inputs: {
145
- document: document.ref, semantic: semantic.ref, program: program.ref,
146
- },
147
- outputs: { schedule: `${id}.schedule`, track: `${id}.track` },
148
- range: element.range,
149
- }],
150
- fragments: [fineCaptionTrackFragment],
151
- };
162
+ operations.push({ id: "content", producer: captionProducers.temporalizeDocument,
163
+ inputs: { document: input("document"), timeline: input("timeline") }, result: { kind: "output", name: "caption" } });
164
+ operations.push({ id: "schedule", producer: captionFineProducers.schedule,
165
+ inputs: { caption: operation("content"), document: input("document"), program: operation(previous) }, result: { kind: "output", name: "schedule" } });
166
+ if (regions !== undefined) { inputs.push({ name: "regions", type: spatialTypes.regionTimeline }); bindings.regions = regions.ref; }
167
+ operations.push({ id: "render", producer: regions === undefined ? captionFineProducers.render : captionFineProducers.renderWithRegions,
168
+ inputs: { schedule: operation("schedule"), document: input("document"), timeline: input("timeline"), program: operation(previous), ...(regions === undefined ? {} : { regions: input("regions") }) }, result: { kind: "output", name: "track" } });
169
+ const collector = sealGraphFragment({ inputs, operations, exports: [
170
+ { name: "content", type: captionTypes.timedProjection, root: operation("content") },
171
+ { name: "program", type: captionTypes.program, root: operation(previous) },
172
+ { name: "schedule", type: captionFineTypes.schedule, root: operation("schedule") },
173
+ { name: "track", type: compositionTypes.visualTrack, root: operation("render") },
174
+ ] });
175
+ fragments.push(collector);
176
+ components.push({ id, fragment: collector.id, inputs: bindings,
177
+ outputs: { content: `${id}.content`, program: `${id}.program`, schedule: `${id}.schedule`, track: `${id}.track` }, range: element.range });
178
+ return { records, components, fragments, exports: [`${id}.content`, `${id}.program`, `${id}.schedule`, `${id}.track`] };
152
179
  };
@@ -173,6 +173,8 @@ export type FineCaptionParameters = {
173
173
  };
174
174
 
175
175
  export type FineCaptionScheduledCue = {
176
+ readonly cueId: string;
177
+ readonly visibility: readonly { readonly startFrame: number; readonly endFrameExclusive: number }[];
176
178
  readonly id: string;
177
179
  readonly styleId: string;
178
180
  readonly semanticStartFrame: number;
@@ -1,3 +1,25 @@
1
- # `@hypit/caption-fine-studio`
1
+ # Caption Fine Studio Companion
2
2
 
3
- Hypit Studio Companion for `@hypit/caption-fine`. It projects the public Caption Schedule and owns the Inspector layout.
3
+ One Caption Track contains Cue blocks and a bottom Uses band declared through the public ABI.
4
+ Each Cue has a numbered title such as `#15` and complete subtitle text in its body.
5
+ Cue ids remain the underlying identities; the number is a display label. Cues retain their measured
6
+ times, including content currently hidden by a Use. Their read-only Range describes the content, independently of its visual treatment.
7
+
8
+ The Uses band shows each authored Window once, with its Style name. A whole-Timeline Use remains one
9
+ block across Segment changes and gaps. Hidden and overridden Uses stay selectable. The Companion
10
+ reads the Track's `content`, `schedule` and `program` exports; it never reconstructs author windows
11
+ from the rendered words.
12
+
13
+ Use entities retain the actual child Source range and standard Temporal lineage. Timeline gestures
14
+ therefore use the same writeback rules as Performance and Sound. Selecting a Use exposes its
15
+ referenced Style's font and Recipe fields. Shared Styles remain shared; changing a time window
16
+ changes presentation without editing Script Cue breaks.
17
+
18
+ Studio owns Track bands, block chrome, overlap selection and generic Inspector controls. This Companion owns
19
+ Caption facts, field grouping and Source bindings. Content, Uses and their renderer stay independent
20
+ of central Studio domain logic.
21
+
22
+ Fine Style parameters are a separate `parameters` Companion matched to the Fine Style Surface.
23
+ The Use band opts its `style` reference into the selected object's Companion. Custom Styles can
24
+ provide their own field table through their project package. Supported omitted defaults appear
25
+ in the Inspector and are inserted into the owning Recipe only when edited.