@hypit/hypit 0.1.3 → 0.1.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (486) hide show
  1. package/README.md +5 -3
  2. package/dist/public/caption.d.ts +206 -183
  3. package/dist/public/composition.d.ts +25 -3
  4. package/dist/public/endpoint-kit.d.ts +24 -2
  5. package/dist/public/generation.d.ts +5 -1
  6. package/dist/public/hyperframes.d.ts +19 -1
  7. package/dist/public/narrative.d.ts +17 -3
  8. package/dist/public/performance.d.ts +1590 -0
  9. package/dist/public/program-space.d.ts +179 -32
  10. package/dist/public/runtime-kit.d.ts +21 -8
  11. package/dist/public/sound.d.ts +822 -0
  12. package/dist/public/speech.d.ts +41 -0
  13. package/dist/public/studio-adapter.d.ts +107 -16
  14. package/dist/public/temporal-markup.d.ts +9 -44
  15. package/dist/public/temporal.d.ts +37 -28
  16. package/dist/public/{semantic-track.d.ts → timeline.d.ts} +62 -49
  17. package/examples/README.md +18 -10
  18. package/examples/minimal-author-package/packages/example-component/preview/preview.svml +19 -12
  19. package/examples/minimal-author-package/packages/example-component/src/component.ts +5 -5
  20. package/examples/minimal-author-package/packages/example-component/src/fragment.ts +3 -5
  21. package/examples/minimal-author-package/packages/example-component/src/manifest.ts +8 -10
  22. package/examples/minimal-author-package/packages/example-component/src/surface.ts +2 -2
  23. package/examples/provider-package/README.md +78 -0
  24. package/examples/provider-package/hypit.runtime.json +12 -0
  25. package/examples/provider-package/packages/provider-images/package.json +11 -0
  26. package/examples/provider-package/packages/provider-images/src/activation.ts +24 -0
  27. package/examples/provider-package/packages/provider-images/src/provider.ts +122 -0
  28. package/examples/provider-package/packages/provider-images/tsconfig.json +9 -0
  29. package/examples/semantic-composition/README.md +6 -0
  30. package/examples/semantic-composition/chat.svml +6 -5
  31. package/examples/semantic-composition/packages/chat-scene/README.md +3 -3
  32. package/examples/semantic-composition/packages/chat-scene/src/activation.ts +18 -21
  33. package/examples/semantic-composition/packages/chat-scene/src/render.ts +4 -4
  34. package/examples/semantic-composition/packages/performance-styles/README.md +42 -0
  35. package/examples/semantic-composition/packages/performance-styles/package.json +25 -0
  36. package/examples/semantic-composition/packages/performance-styles/src/activation.ts +57 -0
  37. package/examples/semantic-composition/packages/performance-styles/src/render.ts +54 -0
  38. package/examples/semantic-composition/packages/performance-styles/src/studio.ts +28 -0
  39. package/examples/semantic-composition/packages/performance-styles/tsconfig.json +18 -0
  40. package/examples/semantic-composition/packages/responsive-explainer/README.md +16 -9
  41. package/examples/semantic-composition/packages/responsive-explainer/src/activation.ts +12 -12
  42. package/examples/semantic-composition/packages/responsive-explainer/src/render.ts +5 -5
  43. package/examples/semantic-composition/packages/sound-styles/README.md +36 -0
  44. package/examples/semantic-composition/packages/sound-styles/package.json +25 -0
  45. package/examples/semantic-composition/packages/sound-styles/src/activation.ts +53 -0
  46. package/examples/semantic-composition/packages/sound-styles/src/render.ts +14 -0
  47. package/examples/semantic-composition/packages/sound-styles/tsconfig.json +18 -0
  48. package/package.json +35 -15
  49. package/packages/audio-track/README.md +20 -13
  50. package/packages/audio-track/package.json +1 -1
  51. package/packages/audio-track/src/component.ts +4 -4
  52. package/packages/audio-track/src/fragment.ts +6 -5
  53. package/packages/audio-track/src/index.ts +1 -1
  54. package/packages/audio-track/src/manifest.ts +17 -16
  55. package/packages/audio-track/src/program.ts +21 -25
  56. package/packages/audio-track/src/surface.ts +19 -18
  57. package/packages/audio-track-studio/README.md +23 -0
  58. package/packages/audio-track-studio/src/index.ts +33 -19
  59. package/packages/author-kit/README.md +1 -1
  60. package/packages/background-removal/README.md +4 -7
  61. package/packages/browser-capture/package.json +1 -1
  62. package/packages/build-result/README.md +69 -0
  63. package/packages/build-result/package.json +2 -1
  64. package/packages/build-result/src/decode.ts +12 -8
  65. package/packages/build-result/src/execution-log.ts +17 -0
  66. package/packages/build-result/src/file-reference.ts +42 -0
  67. package/packages/build-result/src/index.ts +4 -0
  68. package/packages/build-result/src/replace-file-windows.ts +58 -0
  69. package/packages/build-result/src/replace-file.ts +11 -0
  70. package/packages/build-result/src/store.ts +58 -14
  71. package/packages/build-result/src/types.ts +41 -8
  72. package/packages/build-result/src/writer.ts +12 -1
  73. package/packages/build-result-fs/README.md +23 -1
  74. package/packages/build-result-s3/README.md +5 -0
  75. package/packages/build-result-s3/src/repository.ts +23 -5
  76. package/packages/caption/README.md +61 -73
  77. package/packages/caption/package.json +3 -2
  78. package/packages/caption/src/activation.ts +2 -2
  79. package/packages/caption/src/component.ts +20 -5
  80. package/packages/caption/src/display.ts +3 -18
  81. package/packages/caption/src/fragment.ts +3 -7
  82. package/packages/caption/src/index.ts +6 -5
  83. package/packages/caption/src/manifest.ts +29 -46
  84. package/packages/caption/src/style.ts +24 -135
  85. package/packages/caption/src/surface.ts +12 -92
  86. package/packages/caption/src/temporalize.ts +18 -53
  87. package/packages/caption/src/types.ts +8 -35
  88. package/packages/caption/src/visibility.ts +23 -0
  89. package/packages/caption-fine/README.md +31 -11
  90. package/packages/caption-fine/package.json +4 -2
  91. package/packages/caption-fine/src/component.ts +3 -3
  92. package/packages/caption-fine/src/fragment.ts +7 -19
  93. package/packages/caption-fine/src/index.ts +2 -0
  94. package/packages/caption-fine/src/manifest.ts +27 -18
  95. package/packages/caption-fine/src/recipe.ts +7 -0
  96. package/packages/caption-fine/src/render.ts +62 -49
  97. package/packages/caption-fine/src/schedule.ts +39 -35
  98. package/packages/caption-fine/src/style.ts +10 -9
  99. package/packages/caption-fine/src/surface.ts +62 -35
  100. package/packages/caption-fine/src/types.ts +2 -0
  101. package/packages/caption-fine-studio/README.md +24 -2
  102. package/packages/caption-fine-studio/package.json +10 -3
  103. package/packages/caption-fine-studio/src/activation.ts +3 -3
  104. package/packages/caption-fine-studio/src/index.ts +61 -40
  105. package/packages/cli/README.md +81 -3
  106. package/packages/cli/package.json +1 -0
  107. package/packages/cli/src/arguments.ts +39 -15
  108. package/packages/cli/src/build-planning.ts +9 -3
  109. package/packages/cli/src/command.ts +7 -1
  110. package/packages/cli/src/commands/environment.ts +66 -27
  111. package/packages/cli/src/commands/execution.ts +81 -26
  112. package/packages/cli/src/commands/results.ts +7 -11
  113. package/packages/cli/src/index.ts +2 -2
  114. package/packages/cli/src/machine-view.ts +15 -5
  115. package/packages/cli/src/main.ts +38 -42
  116. package/packages/cli/src/observation.ts +7 -1
  117. package/packages/cli/src/output.ts +92 -34
  118. package/packages/cli/src/result-export.ts +22 -13
  119. package/packages/cli/src/run-file.ts +19 -8
  120. package/packages/cli/src/view.ts +64 -18
  121. package/packages/comment-sticker/README.md +3 -3
  122. package/packages/comment-sticker/package.json +1 -1
  123. package/packages/comment-sticker/src/component.ts +4 -4
  124. package/packages/comment-sticker/src/fragment.ts +5 -4
  125. package/packages/comment-sticker/src/manifest.ts +7 -6
  126. package/packages/comment-sticker/src/program.ts +9 -9
  127. package/packages/comment-sticker/src/surface.ts +6 -7
  128. package/packages/comment-sticker-studio/src/index.ts +2 -1
  129. package/packages/compiler-node/src/compiler.ts +1 -0
  130. package/packages/composition/README.md +21 -0
  131. package/packages/composition/src/audio-presentation.ts +44 -0
  132. package/packages/composition/src/index.ts +3 -0
  133. package/packages/composition/src/schema.ts +8 -3
  134. package/packages/composition/src/track.ts +15 -1
  135. package/packages/credential-store-env/README.md +1 -1
  136. package/packages/deck-track/README.md +3 -3
  137. package/packages/deck-track/package.json +1 -1
  138. package/packages/deck-track/src/component.ts +5 -5
  139. package/packages/deck-track/src/fragment.ts +6 -5
  140. package/packages/deck-track/src/lower.ts +12 -12
  141. package/packages/deck-track/src/manifest.ts +8 -7
  142. package/packages/deck-track/src/program.ts +13 -16
  143. package/packages/deck-track/src/surface.ts +9 -10
  144. package/packages/driver-node/src/driver.ts +41 -3
  145. package/packages/elevenlabs-speech/README.md +27 -0
  146. package/packages/{provider-xiaomi-mimo → elevenlabs-speech}/package.json +5 -8
  147. package/packages/elevenlabs-speech/src/activation.ts +26 -0
  148. package/packages/elevenlabs-speech/src/fragment.ts +11 -0
  149. package/packages/elevenlabs-speech/src/index.ts +111 -0
  150. package/packages/elevenlabs-speech/src/surface.ts +167 -0
  151. package/packages/endpoint-kit/README.md +24 -0
  152. package/packages/endpoint-kit/src/index.ts +7 -1
  153. package/packages/estimate/README.md +56 -3
  154. package/packages/estimate/src/program.ts +7 -8
  155. package/packages/film/README.md +12 -7
  156. package/packages/film/package.json +1 -1
  157. package/packages/film/src/component.ts +4 -4
  158. package/packages/film/src/fragment.ts +6 -5
  159. package/packages/film/src/manifest.ts +11 -10
  160. package/packages/film/src/program.ts +5 -5
  161. package/packages/film/src/recipe.ts +2 -1
  162. package/packages/film/src/surface.ts +6 -6
  163. package/packages/film-studio/package.json +1 -1
  164. package/packages/film-studio/src/index.ts +2 -2
  165. package/packages/fishaudio-speech/README.md +33 -0
  166. package/packages/fishaudio-speech/package.json +21 -0
  167. package/packages/fishaudio-speech/src/activation.ts +32 -0
  168. package/packages/fishaudio-speech/src/fragment.ts +11 -0
  169. package/packages/fishaudio-speech/src/index.ts +156 -0
  170. package/packages/fishaudio-speech/src/surface.ts +192 -0
  171. package/packages/fonts-open/README.md +5 -0
  172. package/packages/fonts-open/package.json +5 -1
  173. package/packages/fonts-open/src/studio.ts +21 -0
  174. package/packages/generation/README.md +11 -1
  175. package/packages/generation/src/mapping.ts +28 -30
  176. package/packages/gpt-image/README.md +1 -2
  177. package/packages/grok-imagine/README.md +1 -2
  178. package/packages/hyperframes/README.md +7 -3
  179. package/packages/hyperframes/src/browser-program.ts +11 -2
  180. package/packages/hyperframes/src/document.ts +15 -2
  181. package/packages/interview-emoji-reveal/README.md +4 -4
  182. package/packages/interview-emoji-reveal/package.json +1 -1
  183. package/packages/interview-emoji-reveal/src/component.ts +4 -4
  184. package/packages/interview-emoji-reveal/src/fragment.ts +6 -5
  185. package/packages/interview-emoji-reveal/src/manifest.ts +9 -8
  186. package/packages/interview-emoji-reveal/src/program.ts +14 -14
  187. package/packages/interview-emoji-reveal/src/surface.ts +8 -9
  188. package/packages/media-execution/README.md +7 -3
  189. package/packages/media-execution/src/audio-presentation.ts +23 -0
  190. package/packages/media-execution/src/execute.ts +2 -0
  191. package/packages/media-pipeline/README.md +7 -3
  192. package/packages/media-pipeline/src/audio-plan.ts +4 -1
  193. package/packages/media-pipeline/src/component.ts +16 -2
  194. package/packages/media-pipeline/src/manifest.ts +3 -1
  195. package/packages/media-pipeline/src/types.ts +2 -1
  196. package/packages/media-track/README.md +14 -47
  197. package/packages/media-track/package.json +1 -1
  198. package/packages/media-track/preview/preview.svml +5 -5
  199. package/packages/media-track/src/author.ts +12 -6
  200. package/packages/media-track/src/component.ts +10 -16
  201. package/packages/media-track/src/fragment.ts +8 -7
  202. package/packages/media-track/src/index.ts +3 -1
  203. package/packages/media-track/src/lower.ts +7 -7
  204. package/packages/media-track/src/manifest.ts +16 -38
  205. package/packages/media-track/src/program.ts +62 -67
  206. package/packages/media-track/src/sampling.ts +6 -6
  207. package/packages/media-track/src/sequence.ts +8 -8
  208. package/packages/media-track/src/surface.ts +25 -43
  209. package/packages/media-track-studio/README.md +9 -0
  210. package/packages/media-track-studio/src/index.ts +23 -13
  211. package/packages/mimo-speech/README.md +1 -1
  212. package/packages/minimax-h3/README.md +1 -1
  213. package/packages/nano-banana/README.md +1 -1
  214. package/packages/narrative/README.md +23 -1
  215. package/packages/narrative/src/identity.ts +11 -0
  216. package/packages/narrative/src/index.ts +3 -0
  217. package/packages/narrative/src/schema.ts +28 -27
  218. package/packages/narrative/src/selection.ts +52 -0
  219. package/packages/narrative/src/types.ts +2 -0
  220. package/packages/package-loader-node/README.md +30 -0
  221. package/packages/package-loader-node/package.json +5 -2
  222. package/packages/package-loader-node/src/distribution-resolution.ts +10 -3
  223. package/packages/package-loader-node/src/index.ts +1 -0
  224. package/packages/package-loader-node/src/loader.ts +12 -15
  225. package/packages/package-loader-node/src/location.ts +27 -1
  226. package/packages/package-loader-node/src/module-scope.ts +183 -0
  227. package/packages/package-loader-node/src/types.ts +4 -0
  228. package/packages/performance/README.md +83 -0
  229. package/packages/performance/package.json +30 -0
  230. package/packages/performance/src/activation.ts +11 -0
  231. package/packages/performance/src/component.ts +46 -0
  232. package/packages/performance/src/index.ts +6 -0
  233. package/packages/performance/src/manifest.ts +53 -0
  234. package/packages/{media-track/src/performance.ts → performance/src/media.ts} +9 -10
  235. package/packages/performance/src/program.ts +51 -0
  236. package/packages/performance/src/style.ts +35 -0
  237. package/packages/performance/src/surface.ts +99 -0
  238. package/packages/performance-studio/README.md +25 -0
  239. package/packages/performance-studio/package.json +21 -0
  240. package/packages/performance-studio/src/activation.ts +6 -0
  241. package/packages/performance-studio/src/index.ts +84 -0
  242. package/packages/program-space/README.md +9 -18
  243. package/packages/program-space/src/activation.ts +1 -5
  244. package/packages/program-space/src/index.ts +2 -11
  245. package/packages/program-space/src/surface.ts +1 -20
  246. package/packages/project-context-node/README.md +20 -0
  247. package/packages/project-context-node/package.json +10 -0
  248. package/packages/project-context-node/src/index.ts +3 -0
  249. package/packages/{cli → project-context-node}/src/runtime-selection.ts +7 -2
  250. package/packages/provider-hyperframes-local/README.md +43 -15
  251. package/packages/provider-hyperframes-local/src/activation.ts +4 -3
  252. package/packages/provider-hyperframes-local/src/capture-process.ts +26 -4
  253. package/packages/provider-hyperframes-local/src/capture.ts +96 -26
  254. package/packages/provider-hyperframes-local/src/concurrency.ts +86 -0
  255. package/packages/provider-hyperframes-local/src/opaque-capture.ts +92 -0
  256. package/packages/provider-hyperframes-local/src/options.ts +2 -0
  257. package/packages/provider-hyperframes-local/src/program.ts +6 -3
  258. package/packages/provider-hyperframes-local/src/progress.ts +53 -0
  259. package/packages/provider-hyperframes-local/src/provider.ts +18 -5
  260. package/packages/provider-hyperframes-local/src/render.ts +48 -7
  261. package/packages/provider-hypihub/README.md +48 -17
  262. package/packages/provider-hypihub/package.json +2 -0
  263. package/packages/provider-hypihub/src/mapping.ts +31 -7
  264. package/packages/provider-hypihub/src/oauth.ts +6 -0
  265. package/packages/provider-hypihub/src/provider.ts +25 -13
  266. package/packages/provider-hypihub/src/routes.ts +1 -2
  267. package/packages/provider-hypihub/src/upload.ts +2 -0
  268. package/packages/provider-media-local/README.md +3 -4
  269. package/packages/provider-whisperx-local/README.md +57 -0
  270. package/packages/provider-whisperx-local/src/program.ts +1 -0
  271. package/packages/provider-whisperx-local/src/provider.ts +3 -0
  272. package/packages/ranking/README.md +8 -6
  273. package/packages/ranking/package.json +1 -1
  274. package/packages/ranking/src/component.ts +6 -6
  275. package/packages/ranking/src/fragment.ts +11 -7
  276. package/packages/ranking/src/manifest.ts +21 -14
  277. package/packages/ranking/src/render.ts +33 -35
  278. package/packages/ranking/src/schedule.ts +16 -19
  279. package/packages/ranking/src/surface.ts +12 -13
  280. package/packages/ranking-studio/README.md +29 -0
  281. package/packages/ranking-studio/package.json +8 -3
  282. package/packages/ranking-studio/src/index.ts +71 -12
  283. package/packages/render-hyperframes/README.md +7 -7
  284. package/packages/render-hyperframes/package.json +1 -1
  285. package/packages/render-hyperframes/src/component.ts +11 -1
  286. package/packages/render-hyperframes/src/fragment.ts +7 -4
  287. package/packages/render-hyperframes/src/manifest.ts +4 -4
  288. package/packages/render-hyperframes/src/surface.ts +6 -6
  289. package/packages/runtime/README.md +8 -1
  290. package/packages/runtime/src/catalog.ts +2 -0
  291. package/packages/runtime/src/execution.ts +15 -4
  292. package/packages/runtime/src/index.ts +2 -1
  293. package/packages/runtime/src/log.ts +51 -0
  294. package/packages/runtime/src/types.ts +5 -8
  295. package/packages/runtime-host-node/README.md +30 -0
  296. package/packages/runtime-host-node/package.json +1 -0
  297. package/packages/runtime-host-node/src/index.ts +25 -9
  298. package/packages/runtime-host-node/src/packages.ts +47 -50
  299. package/packages/runtime-kit/README.md +5 -0
  300. package/packages/runtime-kit/src/index.ts +3 -1
  301. package/packages/runtime-local/README.md +111 -4
  302. package/packages/runtime-local/src/config.ts +202 -56
  303. package/packages/runtime-local/src/control.ts +9 -1
  304. package/packages/runtime-local/src/executor.ts +66 -0
  305. package/packages/runtime-local/src/host.ts +37 -17
  306. package/packages/runtime-local/src/log.ts +48 -0
  307. package/packages/runtime-local/src/programs.ts +41 -25
  308. package/packages/runtime-local/src/result-writer.ts +2 -0
  309. package/packages/runtime-local/src/runtime.ts +10 -6
  310. package/packages/runtime-local/src/supervisor.ts +142 -0
  311. package/packages/runtime-local/src/types.ts +9 -2
  312. package/packages/runtime-local/src/worker-process.ts +7 -24
  313. package/packages/runtime-local/src/worker.ts +55 -83
  314. package/packages/screen-overlay/README.md +3 -3
  315. package/packages/screen-overlay/package.json +1 -1
  316. package/packages/screen-overlay/src/component.ts +3 -3
  317. package/packages/screen-overlay/src/fragment.ts +5 -4
  318. package/packages/screen-overlay/src/manifest.ts +7 -6
  319. package/packages/screen-overlay/src/program.ts +9 -9
  320. package/packages/screen-overlay/src/surface.ts +6 -7
  321. package/packages/script/README.md +37 -2
  322. package/packages/script/src/edit.ts +123 -73
  323. package/packages/script/src/lexical.ts +40 -6
  324. package/packages/script/src/manifest.ts +2 -2
  325. package/packages/script/src/narrative.ts +1 -0
  326. package/packages/script/src/parser.ts +36 -8
  327. package/packages/script/src/surface.ts +4 -3
  328. package/packages/script/src/types.ts +5 -1
  329. package/packages/script-studio/package.json +9 -3
  330. package/packages/script-studio/src/index.ts +2 -0
  331. package/packages/script-studio/src/projection.ts +105 -0
  332. package/packages/seedance/README.md +30 -1
  333. package/packages/seedance/src/index.ts +18 -7
  334. package/packages/seedance/src/surface.ts +17 -4
  335. package/packages/seedance-kits/README.md +10 -2
  336. package/packages/seedance-kits/kits/speaker-v1.svs +5 -5
  337. package/packages/seedream/README.md +1 -1
  338. package/packages/sound/README.md +81 -0
  339. package/packages/sound/package.json +25 -0
  340. package/packages/sound/src/activation.ts +11 -0
  341. package/packages/sound/src/component.ts +28 -0
  342. package/packages/sound/src/index.ts +5 -0
  343. package/packages/sound/src/manifest.ts +47 -0
  344. package/packages/sound/src/program.ts +84 -0
  345. package/packages/sound/src/style.ts +34 -0
  346. package/packages/sound/src/surface.ts +90 -0
  347. package/packages/sound-studio/README.md +22 -0
  348. package/packages/sound-studio/package.json +20 -0
  349. package/packages/sound-studio/src/activation.ts +6 -0
  350. package/packages/sound-studio/src/index.ts +74 -0
  351. package/packages/speech/README.md +2 -2
  352. package/packages/speech-alignment/src/align.ts +45 -21
  353. package/packages/speech-alignment/src/local.ts +8 -0
  354. package/packages/speech-alignment/src/locate.ts +1 -1
  355. package/packages/store-sqlite/README.md +7 -0
  356. package/packages/store-sqlite/src/store.ts +84 -83
  357. package/packages/studio/INSPECTOR.md +117 -0
  358. package/packages/studio/README.md +149 -14
  359. package/packages/studio/package.json +8 -7
  360. package/packages/studio/src/build-library.ts +99 -84
  361. package/packages/studio/src/companion-assembly.ts +1 -0
  362. package/packages/studio/src/domain.ts +1 -1
  363. package/packages/studio/src/fallback-companions.ts +3 -3
  364. package/packages/studio/src/feedback-server.ts +51 -0
  365. package/packages/studio/src/feedback-store.ts +66 -0
  366. package/packages/studio/src/feedback.ts +60 -0
  367. package/packages/studio/src/library-media.ts +19 -0
  368. package/packages/studio/src/parameter-values.ts +83 -1
  369. package/packages/studio/src/parameters.ts +132 -43
  370. package/packages/studio/src/preview/render.ts +5 -1
  371. package/packages/studio/src/preview/runtime-shim.ts +49 -3
  372. package/packages/studio/src/programme.ts +14 -30
  373. package/packages/studio/src/server.ts +66 -34
  374. package/packages/studio/src/shared.ts +24 -8
  375. package/packages/studio/src/snapshot.ts +21 -132
  376. package/packages/studio/src/studio-preflight.ts +3 -3
  377. package/packages/studio/src/studio-registry.ts +72 -6
  378. package/packages/studio/src/style.css +342 -190
  379. package/packages/studio/src/temporal-edit.ts +131 -0
  380. package/packages/studio/src/ui/artifact-name.ts +80 -0
  381. package/packages/studio/src/ui/artifact-preview.ts +99 -0
  382. package/packages/studio/src/ui/comments.ts +233 -0
  383. package/packages/studio/src/ui/icons.ts +10 -1
  384. package/packages/studio/src/ui/library.ts +373 -192
  385. package/packages/studio/src/ui/main.ts +291 -110
  386. package/packages/studio/src/ui/material-preview.ts +1 -1
  387. package/packages/studio/src/ui/overlay.ts +31 -26
  388. package/packages/studio/src/ui/scrub-preview.ts +108 -0
  389. package/packages/studio/src/ui/sidebar-panel.ts +31 -0
  390. package/packages/studio/src/ui/stage.ts +188 -9
  391. package/packages/studio/src/ui/timeline.ts +187 -281
  392. package/packages/studio/start.ts +19 -5
  393. package/packages/studio-adapter/README.md +151 -11
  394. package/packages/studio-adapter/src/index.ts +126 -14
  395. package/packages/temporal/README.md +6 -6
  396. package/packages/temporal/package.json +1 -1
  397. package/packages/temporal/src/component.ts +5 -6
  398. package/packages/temporal/src/index.ts +8 -6
  399. package/packages/temporal/src/location.ts +11 -11
  400. package/packages/temporal/src/projection.ts +19 -19
  401. package/packages/temporal/src/rational.ts +4 -4
  402. package/packages/temporal-markup/EDITING.md +183 -0
  403. package/packages/temporal-markup/README.md +31 -11
  404. package/packages/temporal-markup/package.json +1 -1
  405. package/packages/temporal-markup/src/index.ts +20 -25
  406. package/packages/temporal-markup/src/space.ts +10 -41
  407. package/packages/timeline/README.md +31 -0
  408. package/packages/{semantic-track → timeline}/package.json +1 -1
  409. package/packages/timeline/src/activation.ts +8 -0
  410. package/packages/timeline/src/component.ts +24 -0
  411. package/packages/timeline/src/identity.ts +60 -0
  412. package/packages/timeline/src/index.ts +6 -0
  413. package/packages/{semantic-track → timeline}/src/location.ts +20 -20
  414. package/packages/timeline/src/manifest.ts +39 -0
  415. package/packages/{semantic-track → timeline}/src/projection.ts +14 -14
  416. package/packages/timeline/src/types.ts +24 -0
  417. package/packages/timeline-author/README.md +68 -0
  418. package/packages/{speech-track → timeline-author}/package.json +6 -4
  419. package/packages/timeline-author/src/activation.ts +22 -0
  420. package/packages/{speech-track → timeline-author}/src/component.ts +15 -13
  421. package/packages/{speech-track → timeline-author}/src/fragment.ts +14 -23
  422. package/packages/timeline-author/src/index.ts +7 -0
  423. package/packages/timeline-author/src/manifest.ts +78 -0
  424. package/packages/timeline-author/src/program.ts +107 -0
  425. package/packages/timeline-author/src/surface.ts +46 -0
  426. package/packages/timeline-author/src/types.ts +6 -0
  427. package/packages/typography-track/README.md +4 -4
  428. package/packages/typography-track/package.json +1 -1
  429. package/packages/typography-track/src/component.ts +4 -4
  430. package/packages/typography-track/src/fragment.ts +4 -3
  431. package/packages/typography-track/src/manifest.ts +11 -9
  432. package/packages/typography-track/src/program.ts +15 -15
  433. package/packages/typography-track/src/surface.ts +17 -18
  434. package/packages/typography-track-studio/package.json +8 -3
  435. package/packages/typography-track-studio/src/index.ts +5 -1
  436. package/packages/video-cli/README.md +16 -4
  437. package/packages/video-cli/package.json +2 -1
  438. package/packages/video-cli/src/creation.ts +25 -9
  439. package/packages/video-cli/src/index.ts +1 -1
  440. package/packages/video-cli/src/studio-distribution.ts +2 -1
  441. package/packages/volcengine-matting/README.md +3 -3
  442. package/packages/whisperx/README.md +8 -1
  443. package/packages/workspace/src/index.ts +2 -0
  444. package/packages/workspace-fs-node/README.md +4 -1
  445. package/packages/workspace-fs-node/src/workspace.ts +3 -1
  446. package/services/whisperx/README.md +14 -0
  447. package/services/whisperx/pyproject.toml +2 -0
  448. package/services/whisperx/uv.lock +20 -20
  449. package/packages/provider-hyperframes-aws-lambda/README.md +0 -30
  450. package/packages/provider-hyperframes-aws-lambda/package.json +0 -30
  451. package/packages/provider-hyperframes-aws-lambda/src/activation.ts +0 -97
  452. package/packages/provider-hyperframes-aws-lambda/src/client.ts +0 -114
  453. package/packages/provider-hyperframes-aws-lambda/src/index.ts +0 -21
  454. package/packages/provider-hyperframes-aws-lambda/src/provider.ts +0 -522
  455. package/packages/provider-kie/README.md +0 -134
  456. package/packages/provider-kie/package.json +0 -43
  457. package/packages/provider-kie/src/activation.ts +0 -71
  458. package/packages/provider-kie/src/index.ts +0 -10
  459. package/packages/provider-kie/src/mapping.ts +0 -182
  460. package/packages/provider-kie/src/provider.ts +0 -657
  461. package/packages/provider-kie/src/routes.ts +0 -150
  462. package/packages/provider-xiaomi-mimo/README.md +0 -32
  463. package/packages/provider-xiaomi-mimo/src/activation.ts +0 -57
  464. package/packages/provider-xiaomi-mimo/src/index.ts +0 -5
  465. package/packages/provider-xiaomi-mimo/src/provider.ts +0 -214
  466. package/packages/runtime/src/environment.ts +0 -6
  467. package/packages/semantic-track/README.md +0 -21
  468. package/packages/semantic-track/src/activation.ts +0 -8
  469. package/packages/semantic-track/src/component.ts +0 -24
  470. package/packages/semantic-track/src/identity.ts +0 -58
  471. package/packages/semantic-track/src/index.ts +0 -6
  472. package/packages/semantic-track/src/manifest.ts +0 -38
  473. package/packages/semantic-track/src/types.ts +0 -26
  474. package/packages/speech-track/README.md +0 -51
  475. package/packages/speech-track/src/activation.ts +0 -19
  476. package/packages/speech-track/src/index.ts +0 -7
  477. package/packages/speech-track/src/manifest.ts +0 -73
  478. package/packages/speech-track/src/program.ts +0 -64
  479. package/packages/speech-track/src/surface.ts +0 -35
  480. package/packages/speech-track/src/types.ts +0 -6
  481. package/packages/speech-track-studio/README.md +0 -3
  482. package/packages/speech-track-studio/package.json +0 -14
  483. package/packages/speech-track-studio/src/activation.ts +0 -7
  484. package/packages/speech-track-studio/src/index.ts +0 -40
  485. /package/packages/{cli → project-context-node}/src/project-context.ts +0 -0
  486. /package/packages/{speech-track → timeline-author}/preview/Track.png +0 -0
@@ -1,5 +1,7 @@
1
+ import { preserveExecutionLog } from "@hypit/build-result";
1
2
  import type {
2
3
  BuildResultFileRef,
4
+ ExternalFileAccess,
3
5
  BuildResultFileRange,
4
6
  BuildResultFinish,
5
7
  BuildResultManifest,
@@ -22,6 +24,8 @@ import {
22
24
  encodeBuildResultManifest,
23
25
  normalizeBuildResultForwards,
24
26
  syncBuildResultOutputs,
27
+ currentFileReference,
28
+ localExternalFiles,
25
29
  } from "@hypit/build-result";
26
30
  import { assertOrderedBuildId, buildIdCreatedAt } from "@hypit/protocol";
27
31
 
@@ -31,6 +35,7 @@ import type { AwsBuildResultS3ClientOptions, BuildResultS3Client } from "./clien
31
35
  export type S3BuildResultRepositoryOptions = AwsBuildResultS3ClientOptions & {
32
36
  readonly prefix?: string;
33
37
  readonly client?: BuildResultS3Client;
38
+ readonly externalFiles?: ExternalFileAccess;
34
39
  };
35
40
 
36
41
  function assert(condition: unknown, message: string): asserts condition {
@@ -102,6 +107,7 @@ class S3BuildResultWriter implements BuildResultWriter {
102
107
  },
103
108
  },
104
109
  });
110
+ if (!updated.changed) return manifest;
105
111
  await this.#repository.writeWriter(this.#build, updated.writer);
106
112
  await this.#repository.writeManifest(this.#build, updated.manifest);
107
113
  return updated.manifest;
@@ -115,10 +121,13 @@ class S3BuildResultWriter implements BuildResultWriter {
115
121
  await this.#repository.deleteWriter(this.#build);
116
122
  return manifest;
117
123
  }
124
+ const executionLog = await preserveExecutionLog(input.executionLog,
125
+ async (path, chunks, mediaType) => await this.#repository.writeFile(this.#build, path, chunks, mediaType));
118
126
  const now = Date.now();
119
127
  const updated: BuildResultManifest = {
120
128
  ...manifest,
121
129
  outcome: input.outcome,
130
+ ...(executionLog === undefined ? {} : { executionLog }),
122
131
  ...(input.operations === undefined ? {} : { operations: input.operations }),
123
132
  finishedAt: manifest.finishedAt ?? now,
124
133
  ...(input.failure === undefined ? {} : { failure: input.failure }),
@@ -132,10 +141,12 @@ class S3BuildResultWriter implements BuildResultWriter {
132
141
  export class S3BuildResultRepository implements BuildResultRepository {
133
142
  readonly #client: BuildResultS3Client;
134
143
  readonly #prefix: string;
144
+ readonly #externalFiles: ExternalFileAccess;
135
145
 
136
146
  constructor(options: S3BuildResultRepositoryOptions) {
137
147
  assert(options.bucket.trim().length > 0, "S3 Build Result bucket must not be empty");
138
148
  this.#prefix = normalizePrefix(options.prefix);
149
+ this.#externalFiles = options.externalFiles ?? localExternalFiles;
139
150
  this.#client = options.client ?? new AwsBuildResultS3Client(options);
140
151
  }
141
152
 
@@ -194,6 +205,7 @@ export class S3BuildResultRepository implements BuildResultRepository {
194
205
  resources: {},
195
206
  values: {},
196
207
  publishedOutputs: seed.publishedOutputs,
208
+ ...(seed.resourceReferences === undefined ? {} : { resourceReferences: seed.resourceReferences }),
197
209
  forwards,
198
210
  });
199
211
  await this.writeManifest(seed.id, manifest);
@@ -285,8 +297,9 @@ export class S3BuildResultRepository implements BuildResultRepository {
285
297
  currentOutput = entry.value.output;
286
298
  continue;
287
299
  }
288
- return entry.value.kind === "build-file"
289
- ? { type: entry.type, kind: "resource", size: entry.value.size, mediaType: entry.value.mediaType }
300
+ const file = entry.value.kind === "external-file" ? await currentFileReference(entry.value, this.#externalFiles) : entry.value;
301
+ return file.kind === "build-file" || file.kind === "external-file"
302
+ ? { type: entry.type, kind: "resource", size: file.size, mediaType: file.mediaType }
290
303
  : entry.value.kind === "value"
291
304
  ? { type: entry.type, kind: "composite" }
292
305
  : { type: entry.type, kind: "scalar" };
@@ -324,29 +337,34 @@ export class S3BuildResultRepository implements BuildResultRepository {
324
337
  };
325
338
  }
326
339
  const terminalKind = (entry.value as { readonly kind?: unknown }).kind;
327
- assert(terminalKind === "build-file" || terminalKind === "inline",
340
+ assert(terminalKind === "build-file" || terminalKind === "external-file" || terminalKind === "inline",
328
341
  `Build ${currentBuild} Output ${currentOutput} has unsupported Result value kind ${String(terminalKind)}`);
329
342
  return {
330
343
  build: currentBuild,
331
344
  output: currentOutput,
332
345
  type: entry.type,
333
- value: entry.value,
346
+ value: entry.value.kind === "external-file" ? await currentFileReference(entry.value, this.#externalFiles) : entry.value,
334
347
  };
335
348
  }
336
349
  }
337
350
 
351
+ async describeFile(_build: string, file: BuildResultFileRef): Promise<BuildResultFileRef> {
352
+ return await currentFileReference(file, this.#externalFiles);
353
+ }
354
+
338
355
  async openFile(
339
356
  build: string,
340
357
  file: BuildResultFileRef,
341
358
  range?: BuildResultFileRange,
342
359
  ): Promise<AsyncIterable<Uint8Array> | undefined> {
360
+ if (file.kind === "external-file") return await this.#externalFiles.open(file.uri, range);
343
361
  if (range !== undefined) {
344
362
  assert(Number.isSafeInteger(range.start) && range.start >= 0, "Build Result file range start is invalid");
345
363
  assert(Number.isSafeInteger(range.endExclusive) && range.endExclusive > range.start,
346
364
  "Build Result file range end is invalid");
347
365
  assert(range.endExclusive <= file.size, "Build Result file range exceeds the declared file size");
348
366
  }
349
- return await this.#client.open(this.#key(build, file.path), range);
367
+ return await this.#client.open(this.#key(file.build ?? build, file.path), range);
350
368
  }
351
369
 
352
370
  /** Verify that the configured bucket/prefix can be listed without loading Result history. */
@@ -1,77 +1,65 @@
1
1
  # `@hypit/caption`
2
2
 
3
- External components use `@hypit/hypit/caption` from their `@hypit/hypit` development dependency. The package
4
- owns the types and helpers below; Source imports retain the `@hypit/caption@1` Module identity.
5
-
6
-
7
- The deterministic Caption contract. Script emits one `CaptionDocument` containing display words,
8
- N:M alignment units and authored `||` cue breaks. Caption applies Styles to complete units selected
9
- by a Role or a semantic Selection, then joins those units to a `SemanticTrack` for frame timing.
10
-
11
- ```xml
12
- <caption:Program id="captions" document={story.caption} narrative={story} default={plain}>
13
- <caption:Use role="HOST" style={impact}/>
14
- <caption:Use selection={story.selection.emphasis} style={plain}/>
15
- <caption:Use attribute="emphasis" style={keyword}/>
16
- </caption:Program>
3
+ External components import `@hypit/hypit/caption`. Source uses the `@hypit/caption@1` Module
4
+ identity for shared declarations such as `Hidden`.
5
+
6
+ Caption has two independent structures: Script organizes displayed words into Cues, and timed Uses
7
+ choose how those Cues appear. A Use may begin inside a Cue. It changes presentation without changing
8
+ that Cue's text or restarting its word timing.
9
+
10
+ `CaptionDocument` owns displayed words, display/pronunciation associations, word attributes and `||`
11
+ breaks. `Timeline` owns placed Takes and measured word times. `temporalizeCaptionDocument(document,
12
+ timeline)` joins their identities and returns `TimedCaptionProjection`: complete Cues with original
13
+ unit times. Segment, speaking-turn and explicit Cue boundaries organize this content. No Style is
14
+ needed for this operation. Unplaced material contributes no Cue.
15
+
16
+ A rendering family's Track accepts `document`, `timeline` and ordered `Use` children. Fine provides:
17
+
18
+ ```svml
19
+ <caption:Hidden id="hidden"/>
20
+ <caption-fine:Track id="captions" document={story.caption} timeline={film.timeline}>
21
+ <caption-fine:Use style={plain}/>
22
+ <caption-fine:Use role="GUEST" style={guest}/>
23
+ <caption-fine:Use during={story.selection.demo} style={hidden}/>
24
+ <caption-fine:Use at={story.moment.key} for="2s" style={impact}/>
25
+ </caption-fine:Track>
17
26
  ```
18
27
 
19
- There is no planner, model call or frame range in this authoring contract. A Selection is projected
20
- to complete alignment units before timing; a Selection that cuts through an N:M unit is rejected.
21
- Script-native word attributes are resolved separately as local word Style runs and do not create
22
- another timing source. They are part of the common Caption contract for structural Caption families;
23
- `@hypit/caption-fine` deliberately rejects them because Fine requires one uniform token rule per Cue.
24
-
25
- `TimedCaptionProjection` is intentionally not a `TemporalWindow` collection. Cue timing is a
26
- read-only projection of token evidence, not an author-controlled placement window. It nevertheless
27
- carries the exact `spaceId`, `narrativeId` and `documentId`, so another SemanticTrack or Script cannot
28
- be substituted silently.
29
-
30
- ## Extending with another rendering family
31
-
32
- The common public values are defined in [types.ts](src/types.ts), with exports in
33
- [index.ts](src/index.ts). A family supplies:
34
-
35
- - a Style decoder producing `CaptionStyleIntent` with its own `rendering.family` and validated
36
- `rendering.parameters`;
37
- - an optional family schedule Type and deterministic scheduling Producer;
38
- - a rendering Producer returning the ordinary `VisualTrack` Type;
39
- - a Surface/Fragment connecting the common document, program and timing to those Producers.
40
-
41
- `caption:Program` remains the common author Surface. `Use` selects exactly one of `role`, `selection`
42
- or `attribute`; `Mute` selects a Role or Selection. For Role/Selection applications, the last matching
43
- `Use` in Source order selects the complete Style for each unit. It replaces the previous choice
44
- without merging Style parameters. A Selection can cover a phrase, a whole Segment, several Segments
45
- or the program through its structural anchors; there is no separate Segment selector.
46
-
47
- Word attributes produce separate `wordRuns`. Conflicting Styles on the same attributed word are
48
- rejected; these runs do not use the Role/Selection override rule. A family chooses whether and how
49
- it supports word-specific runs.
50
-
51
- Mute applications combine their selected unit ids independently of Style order. They suppress those
52
- display words, preserving the speech and semantic timeline. Visible lead and tail still belong to
53
- the family schedule, so muting a word is not a time-based mask of every neighboring Cue.
54
-
55
- Reuse `captionProducers.temporalizeDocument` with inputs `document`, `semantic` and `program`, or the
56
- corresponding exported timing Fragment. It emits a `TimedCaptionProjection` whose Cues contain
57
- `styleId`, `startFrame`, `endFrameExclusive` and measured `units`. Each unit carries `unitId` and its
58
- own boundaries. Recover display Words and their associations from the same `CaptionDocument`; do
59
- not infer N:M timing by evenly dividing a Cue or splitting its rendered string.
60
-
61
- Scheduling may derive visible intervals while preserving those measured boundaries. Use
62
- `assertCaptionProgramForDocument`, `assertTimedCaptionProjection` and, for visible scheduling,
63
- `applyCaptionMute` as appropriate. Retain `spaceId`, `narrativeId` and `documentId` in a schedule so
64
- the renderer can check its inputs. The renderer should consume that schedule without silently
65
- changing Cue grouping, lead or tail again.
66
-
67
- `@hypit/caption-fine` provides a working example in its `src/fragment.ts`, `src/schedule.ts` and
68
- `src/render.ts`: one shared timing join, then family schedule and render operations. A new structural
69
- family replaces Fine's uniform-word layout and parameters, not the common speech truth. Its own
70
- Manifest, activation and vocabulary belong to the project package; no change to this common package
71
- is required merely to add a new visual family.
72
-
73
- That family can render a standalone Caption Track or coordinate caption text with graphics in a
74
- shared scene. Its output uses ordinary VisualTrack elements or a renderer program with explicit
75
- resources. Caption retains the authored words and their semantic relationship while the component
76
- owns the visual boundary. The Program does not automatically route different families to different
77
- renderers; choose the implementing component and its coverage explicitly.
28
+ Time attributes come from `@hypit/temporal-markup`: `during`, `at`/`for`, `until`/`for`, and
29
+ `start`/`end`, including semantic references and explicit frame/second expressions. Omitted time
30
+ attributes mean the whole Timeline. `role` filters content independently of time. Later matching
31
+ Uses replace earlier presentation inside their windows, including a Hidden Style. Separate Tracks
32
+ remain independent and can intentionally display simultaneous captions.
33
+
34
+ ## Rendering-family extension
35
+
36
+ A family owns its Style, schedule, renderer and Track Surface. It can use ordinary VisualTrack
37
+ objects or an explicit browser program; no central renderer dispatch is required.
38
+
39
+ The public helpers and Types are in [index.ts](src/index.ts):
40
+
41
+ - `CaptionStyleIntent` carries a family identifier and parameters, or `rendering: null` for Hidden.
42
+ - `CaptionProgram` is the Track's internal collection of ordered, resolved Uses and referenced Styles.
43
+ It is not a separate author element. `create-caption-uses` and `append-caption-use` assemble it from
44
+ typed Windows. The Track may export it for its Companion, like Performance and Sound.
45
+ - `captionUseVisibility(program, index, role, envelope)` intersects a Cue envelope with a Use and
46
+ subtracts later matching windows. Hidden participates even though it renders nothing.
47
+ - `captionProducers.temporalizeDocument` takes only `document` and `timeline`. Its output retains
48
+ `spaceId`, `narrativeId`, `documentId`, Cue identities and measured alignment-unit boundaries.
49
+
50
+ Derive layout and animation from complete Cue content and original timing. Apply Use coverage as a
51
+ visibility mask. Fine keeps the original Present span and element animations, with separate
52
+ `visibility` intervals; changing or briefly hiding a Style does not restart karaoke, typing or motion.
53
+ A family may define lead/tail and handoff behavior, but its resulting visibility stays inside the
54
+ winning Use window. Empty content produces no drawing.
55
+
56
+ Word attributes remain on `CaptionDocument.words`. A structural family can interpret an explicit
57
+ attribute as a keyword role while retaining complete display/alignment units. Time selection does
58
+ not split `<display|speech>` text, and elapsed Cue progress is not a replacement for word timing.
59
+ The content query helpers for Role, Selection and attributes remain available for components that
60
+ actually need authored word subsets; those queries do not define the Use time language.
61
+
62
+ See Fine's [Surface](../caption-fine/src/surface.ts), [schedule](../caption-fine/src/schedule.ts) and
63
+ [renderer](../caption-fine/src/render.ts) for a concrete implementation. New family behavior belongs
64
+ in its own project package. The selected family interprets its own Styles; mixed-family dispatch,
65
+ when useful, is an explicit component responsibility.
@@ -15,8 +15,9 @@
15
15
  "@hypit/elaborator": "workspace:*",
16
16
  "@hypit/narrative": "workspace:*",
17
17
  "@hypit/protocol": "workspace:*",
18
- "@hypit/semantic-track": "workspace:*",
19
- "@hypit/markup": "workspace:*"
18
+ "@hypit/timeline": "workspace:*",
19
+ "@hypit/markup": "workspace:*",
20
+ "@hypit/temporal": "workspace:*"
20
21
  },
21
22
  "devDependencies": {
22
23
  "@hypit/program-space": "workspace:*",
@@ -1,7 +1,7 @@
1
1
  import { createMarkupSurfaceHostFacet } from "@hypit/markup";
2
2
  import {
3
3
  captionComponent, captionManifest, captionModuleRef,
4
- decodeCaptionProgramSurface,
4
+ decodeHiddenCaptionStyleSurface,
5
5
  captionMarkupSurfaces,
6
6
  } from "./index.js";
7
7
 
@@ -11,7 +11,7 @@ export const hypitPackage = {
11
11
  components: [captionComponent],
12
12
  hostFacets: [
13
13
  createMarkupSurfaceHostFacet({ module: captionModuleRef,
14
- declaration: captionMarkupSurfaces.find((item) => item.name === "program")!, handler: decodeCaptionProgramSurface }),
14
+ declaration: captionMarkupSurfaces.find((item) => item.name === "hidden")!, handler: decodeHiddenCaptionStyleSurface }),
15
15
  ],
16
16
  };
17
17
  export default hypitPackage;
@@ -1,11 +1,12 @@
1
+ import type { TemporalWindow } from "@hypit/temporal";
1
2
  import type { ComponentPackage } from "@hypit/component-kit";
2
3
  import type { CaptionDocument } from "@hypit/narrative";
3
- import type { SemanticTrack } from "@hypit/semantic-track";
4
+ import type { Timeline } from "@hypit/timeline";
4
5
  import type { StoredValue } from "@hypit/protocol";
5
6
  import { canonicalize } from "@hypit/protocol";
6
7
 
7
8
  import { captionProducers, captionTypes } from "./manifest.js";
8
- import { assertCaptionProgram } from "./style.js";
9
+ import { appendCaptionUse, assertCaptionProgram, assertCaptionStyle } from "./style.js";
9
10
  import { assertTimedCaptionProjection, temporalizeCaptionDocument } from "./temporalize.js";
10
11
  import type { CaptionProgram, CaptionStyleIntent, TimedCaptionProjection } from "./types.js";
11
12
 
@@ -16,12 +17,26 @@ function inline<T>(value: StoredValue | undefined, subject: string): T {
16
17
 
17
18
  export const captionComponent = {
18
19
  producers: [{
20
+ producer: captionProducers.create,
21
+ handler: ({ inputs }) => ({ outputs: { program: { kind: "inline", value: canonicalize({
22
+ id: inline<{id:string}>(inputs.header?.value, "CaptionTrackSpec").id,
23
+ documentId: inline<CaptionDocument>(inputs.document?.value, "CaptionDocument").id,
24
+ styles: [], uses: [],
25
+ }) } }, needs: {} }),
26
+ }, {
27
+ producer: captionProducers.append,
28
+ handler: ({ inputs }) => ({ outputs: { program: { kind: "inline", value: canonicalize(appendCaptionUse(
29
+ inline<CaptionProgram>(inputs.program?.value, "CaptionProgram"),
30
+ inline<TemporalWindow>(inputs.window?.value, "TemporalWindow"),
31
+ inline<CaptionStyleIntent>(inputs.style?.value, "CaptionStyle"),
32
+ inline<{role?:string}>(inputs.filter?.value, "CaptionContentFilter").role,
33
+ )) } }, needs: {} }),
34
+ }, {
19
35
  producer: captionProducers.temporalizeDocument,
20
36
  handler: ({ inputs }) => ({
21
37
  outputs: { caption: { kind: "inline", value: canonicalize(temporalizeCaptionDocument(
22
38
  inline<CaptionDocument>(inputs.document?.value, "CaptionDocument"),
23
- inline<SemanticTrack>(inputs.semantic?.value, "SemanticTrack"),
24
- inline<CaptionProgram>(inputs.program?.value, "CaptionProgram"),
39
+ inline<Timeline>(inputs.timeline?.value, "Timeline"),
25
40
  )) } },
26
41
  needs: {},
27
42
  }),
@@ -30,7 +45,7 @@ export const captionComponent = {
30
45
  { type: captionTypes.style, handler: ({ value }) => {
31
46
  if (value.kind !== "inline") throw new Error("CaptionStyle must be inline");
32
47
  const style = value.value as CaptionStyleIntent;
33
- if (!style.id || !style.rendering?.family) throw new Error("CaptionStyle is invalid");
48
+ assertCaptionStyle(style);
34
49
  } },
35
50
  { type: captionTypes.program, handler: ({ value }) => assertCaptionProgram(inline<CaptionProgram>(value, "CaptionProgram")) },
36
51
  { type: captionTypes.timedProjection, handler: ({ value }) => assertTimedCaptionProjection(inline<TimedCaptionProjection>(value, "TimedCaptionProjection")) },
@@ -1,3 +1,4 @@
1
+ import { narrativeSelectionTokenRange } from "@hypit/narrative";
1
2
  import type { CaptionDocument, Narrative, NarrativeSelection } from "@hypit/narrative";
2
3
 
3
4
  function assert(condition: unknown, message: string): asserts condition {
@@ -38,30 +39,14 @@ export type CaptionUnitSubset = {
38
39
  readonly unitIds: readonly string[];
39
40
  };
40
41
 
41
- function tokenBoundary(narrative: Narrative, anchorId: string, owner: string): number {
42
- const anchor = narrative.semanticIndex.anchors.find((candidate) => candidate.id === anchorId);
43
- if (anchor === undefined) throw new Error(`${owner} names unknown semantic anchor ${anchorId}`);
44
- if (anchor.kind === "program-start") return 0;
45
- if (anchor.kind === "program-end") return narrative.tokens.length;
46
- const segment = narrative.segments.find((candidate) => candidate.id === anchor.segmentId);
47
- if (segment === undefined) throw new Error(`${owner} names an anchor outside its Segment`);
48
- if (anchor.kind === "segment-start") return segment.tokenStart;
49
- if (anchor.kind === "segment-end") return segment.tokenEndExclusive;
50
- const tokenIndex = narrative.tokens.findIndex((token) => token.id === anchor.tokenId);
51
- if (tokenIndex < 0) throw new Error(`${owner} names an anchor without a Narrative token`);
52
- return anchor.kind === "token-start" ? tokenIndex : tokenIndex + 1;
53
- }
54
-
55
42
  /** Project a semantic Selection to complete authored N:M Caption units. */
56
43
  export function captionUnitsForSelection(
57
- document: CaptionDocument,
58
44
  narrative: Narrative,
59
45
  selection: NarrativeSelection,
60
46
  ): CaptionUnitSubset {
47
+ const document = narrative.caption;
61
48
  assertCaptionDocument(document);
62
- const start = tokenBoundary(narrative, selection.startAnchorId, `Selection ${selection.id}`);
63
- const end = tokenBoundary(narrative, selection.endAnchorId, `Selection ${selection.id}`);
64
- assert(end >= start, `Selection ${selection.id} is backwards`);
49
+ const { tokenStart: start, tokenEndExclusive: end } = narrativeSelectionTokenRange(narrative, selection);
65
50
  const tokenPositions = new Map(narrative.tokens.map((token, index) => [token.id, index]));
66
51
  const unitIds: string[] = [];
67
52
  for (const unit of document.units) {
@@ -1,5 +1,5 @@
1
1
  import { narrativeTypes } from "@hypit/narrative";
2
- import { semanticTrackTypes } from "@hypit/semantic-track";
2
+ import { timelineTypes } from "@hypit/timeline";
3
3
  import { sealGraphFragment } from "@hypit/elaborator";
4
4
 
5
5
  import { captionProducers, captionTypes } from "./manifest.js";
@@ -10,17 +10,13 @@ const operation = (id: string) => ({ kind: "fragment-operation" as const, operat
10
10
  export const captionTimingFragment = sealGraphFragment({
11
11
  inputs: [
12
12
  { name: "document", type: narrativeTypes.captionDocument },
13
- { name: "semantic", type: semanticTrackTypes.track },
14
- { name: "program", type: captionTypes.program },
13
+ { name: "timeline", type: timelineTypes.track },
15
14
  ],
16
15
  operations: [{
17
16
  id: "temporalize-caption-document",
18
17
  producer: captionProducers.temporalizeDocument,
19
- inputs: { document: input("document"), semantic: input("semantic"), program: input("program") },
18
+ inputs: { document: input("document"), timeline: input("timeline") },
20
19
  result: { kind: "output", name: "caption" },
21
20
  }],
22
21
  exports: [{ name: "caption", type: captionTypes.timedProjection, root: operation("temporalize-caption-document") }],
23
22
  });
24
-
25
- /** Kept as the fragment's public name for callers that only know the old export. */
26
- export const plannedCaptionTimingFragment = captionTimingFragment;
@@ -8,7 +8,7 @@ export {
8
8
  export type { CaptionUnitSubset } from "./display.js";
9
9
  export { captionWordsForAttribute } from "./display.js";
10
10
  export { captionComponent } from "./component.js";
11
- export { captionTimingFragment, plannedCaptionTimingFragment } from "./fragment.js";
11
+ export { captionTimingFragment } from "./fragment.js";
12
12
  export {
13
13
  captionProgramSchema,
14
14
  captionStyleSchema,
@@ -19,15 +19,16 @@ export {
19
19
  captionProducers,
20
20
  captionTypes,
21
21
  } from "./manifest.js";
22
- export { decodeCaptionProgramSurface } from "./surface.js";
22
+ export { decodeHiddenCaptionStyleSurface } from "./surface.js";
23
23
  export {
24
24
  assertCaptionProgram,
25
25
  assertCaptionProgramForDocument,
26
26
  assertCaptionStyle,
27
- resolveCaptionProgram,
27
+ appendCaptionUse,
28
28
  sealCaptionProgram,
29
29
  sealCaptionStyle,
30
30
  } from "./style.js";
31
- export type { CaptionMuteApplication, CaptionStyleApplication, CaptionWordStyleApplication } from "./style.js";
32
- export { applyCaptionMute, assertTimedCaptionProjection, temporalizeCaptionDocument } from "./temporalize.js";
31
+ export { assertTimedCaptionProjection, temporalizeCaptionDocument } from "./temporalize.js";
33
32
  export type * from "./types.js";
33
+
34
+ export { captionUseVisibility } from "./visibility.js";
@@ -1,12 +1,17 @@
1
+ import { temporalDependency, temporalTypes, temporalWindowSchema } from "@hypit/temporal";
1
2
  import { narrativeDependency, narrativeTypes } from "@hypit/narrative";
2
- import { semanticTrackDependency, semanticTrackTypes } from "@hypit/semantic-track";
3
+ import { timelineDependency, timelineTypes } from "@hypit/timeline";
3
4
  import type { ModuleManifest, ProducerRef, TypeRef, ValueSchema } from "@hypit/protocol";
4
5
 
5
6
  export const captionModuleRef = { name: "@hypit/caption", version: "1" } as const;
6
7
  export const captionProducers = {
8
+ create: { module: captionModuleRef, name: "create-caption-uses" },
9
+ append: { module: captionModuleRef, name: "append-caption-use" },
7
10
  temporalizeDocument: { module: captionModuleRef, name: "temporalize-caption-document" },
8
11
  } satisfies Record<string, ProducerRef>;
9
12
  export const captionTypes = {
13
+ header: { module: captionModuleRef, name: "CaptionTrackSpec" },
14
+ filter: { module: captionModuleRef, name: "CaptionContentFilter" },
10
15
  style: { module: captionModuleRef, name: "CaptionStyle" },
11
16
  program: { module: captionModuleRef, name: "CaptionProgram" },
12
17
  timedProjection: { module: captionModuleRef, name: "TimedCaptionProjection" },
@@ -17,21 +22,17 @@ const integer = { kind: "number", integer: true, minimum: 0 } as const;
17
22
  const object = (fields: Readonly<Record<string, { readonly schema: ValueSchema; readonly optional?: boolean }>>): ValueSchema => ({ kind: "object", fields });
18
23
  export const captionStyleSchema: ValueSchema = object({
19
24
  id: { schema: string },
20
- rendering: { schema: object({
25
+ rendering: { schema: { kind: "oneOf", variants: [{ kind: "null" }, object({
21
26
  family: { schema: string },
22
27
  parameters: { schema: { kind: "object", fields: {}, allowUnknown: true } },
23
- }) },
28
+ })] } },
24
29
  });
25
30
  export const captionProgramSchema: ValueSchema = object({
26
31
  id: { schema: string }, documentId: { schema: string },
27
- styles: { schema: { kind: "array", minItems: 1, items: captionStyleSchema } },
28
- runs: { schema: { kind: "array", minItems: 1, items: object({
29
- id: { schema: string }, styleId: { schema: string }, unitIds: { schema: { kind: "array", minItems: 1, items: string } },
32
+ styles: { schema: { kind: "array", items: captionStyleSchema } },
33
+ uses: { schema: { kind: "array", items: object({
34
+ window: { schema: temporalWindowSchema }, styleId: { schema: string }, role: { schema: string, optional: true },
30
35
  }) } },
31
- wordRuns: { schema: { kind: "array", items: object({
32
- id: { schema: string }, styleId: { schema: string }, wordIds: { schema: { kind: "array", minItems: 1, items: string } },
33
- }) } },
34
- mutedUnitIds: { schema: { kind: "array", items: string } },
35
36
  });
36
37
  const timedUnit = object({ unitId: { schema: string }, startFrame: { schema: integer }, endFrameExclusive: { schema: integer } });
37
38
  export const timedCaptionProjectionSchema: ValueSchema = object({
@@ -39,58 +40,40 @@ export const timedCaptionProjectionSchema: ValueSchema = object({
39
40
  narrativeId: { schema: string },
40
41
  documentId: { schema: string },
41
42
  cues: { schema: { kind: "array", items: object({
42
- id: { schema: string }, styleId: { schema: string }, startFrame: { schema: integer }, endFrameExclusive: { schema: integer },
43
+ id: { schema: string }, startFrame: { schema: integer }, endFrameExclusive: { schema: integer },
43
44
  units: { schema: { kind: "array", minItems: 1, items: timedUnit } },
44
45
  }) } },
45
46
  });
46
47
 
47
48
  export const captionMarkupSurfaces = [{
48
- name: "program", tag: "Program", mode: "structured", outputs: [captionTypes.program],
49
+ name: "hidden", tag: "Hidden", mode: "structured", outputs: [captionTypes.style],
49
50
  vocabulary: {
50
- summary: "Assigns rendering Styles to the Script-owned CaptionDocument using authored semantic selections.",
51
- attributes: [
52
- { name: "id", kind: "identifier", required: true, summary: "Names the CaptionProgram." },
53
- { name: "document", kind: "reference", required: true, accepts: [narrativeTypes.captionDocument], summary: "The complete Script-owned CaptionDocument." },
54
- { name: "narrative", kind: "reference", required: true, accepts: [narrativeTypes.narrative], summary: "The semantic anchor universe used to project selections." },
55
- { name: "default", kind: "reference", required: true, accepts: [captionTypes.style], summary: "The default Style." },
56
- ],
57
- children: [
58
- { tag: "Use", cardinality: "many", summary: "Applies a complete Style by Role or semantic Selection, or supplies a word-attribute Style for a supporting family.", attributes: [
59
- { name: "style", kind: "reference", required: true, accepts: [captionTypes.style], summary: "The Style to apply." },
60
- { name: "role", kind: "literal", required: false, summary: "Selects all Caption units authored for this Role." },
61
- { name: "selection", kind: "reference", required: false, accepts: [narrativeTypes.selection], summary: "Selects complete Caption units contained by a semantic Selection." },
62
- { name: "attribute", kind: "literal", required: false, summary: "Selects display words carrying this Script-native attribute." },
63
- ] },
64
- { tag: "Mute", cardinality: "many", summary: "Hides selected complete Caption units.", attributes: [
65
- { name: "role", kind: "literal", required: false, summary: "Selects all Caption units authored for this Role." },
66
- { name: "selection", kind: "reference", required: false, accepts: [narrativeTypes.selection], summary: "Selects complete Caption units contained by a semantic Selection." },
67
- ] },
68
- ],
69
- example: `<caption:Program id="captions" document={story.caption} narrative={story} default={plain}>
70
- <caption:Use role="GUEST" style={guest}/>
71
- <caption:Use selection={story.selection.answer} style={answer}/>
72
- <caption:Mute selection={story.selection.demonstration}/>
73
- </caption:Program>`,
74
- notes: [
75
- "Use selects exactly one of role, selection or attribute; Mute selects exactly one of role or selection.",
76
- "For Role and Selection applications, the last matching Use in Source order selects the complete Style; properties are not merged.",
77
- "Selections may cover a phrase, a whole Segment, several Segments or the program, preserving complete display/pronunciation units.",
78
- "All Mute selections hide their words independently of Style order. They do not mute audio; the family still controls neighboring Cue lead and tail.",
79
- "Word-attribute runs are separate from Role/Selection overrides and require a family that implements them; Fine does not. Conflicting Styles on one attributed word are rejected.",
80
- ],
51
+ summary: "Declares a Caption Style that contributes no rendering when selected by Use.",
52
+ attributes: [{ name: "id", kind: "identifier", required: true, summary: "Names the hidden Style." }],
53
+ example: '<caption:Hidden id="hidden"/>',
54
+ notes: ["Hidden is a complete Style choice; it uses ordinary Use precedence and changes no speech or semantic anchors."],
81
55
  },
82
56
  }] as const;
83
57
 
84
58
  export const captionManifest: ModuleManifest = {
85
59
  format: "hypit.module@1", name: captionModuleRef.name, version: captionModuleRef.version,
86
- dependencies: [narrativeDependency, semanticTrackDependency], types: [
60
+ dependencies: [narrativeDependency, timelineDependency, temporalDependency], types: [
61
+ { name: captionTypes.header.name }, { name: captionTypes.filter.name },
87
62
  { name: captionTypes.style.name }, { name: captionTypes.program.name }, { name: captionTypes.timedProjection.name },
88
63
  ], capabilities: [], producers: [{
64
+ name: captionProducers.create.name,
65
+ inputs: [{ name: "document", type: narrativeTypes.captionDocument }, { name: "header", type: captionTypes.header }],
66
+ outputs: [{ name: "program", type: captionTypes.program }], needs: [],
67
+ }, {
68
+ name: captionProducers.append.name,
69
+ inputs: [{ name: "program", type: captionTypes.program }, { name: "window", type: temporalTypes.window },
70
+ { name: "style", type: captionTypes.style }, { name: "filter", type: captionTypes.filter }],
71
+ outputs: [{ name: "program", type: captionTypes.program }], needs: [],
72
+ }, {
89
73
  name: captionProducers.temporalizeDocument.name,
90
74
  inputs: [
91
75
  { name: "document", type: narrativeTypes.captionDocument },
92
- { name: "semantic", type: semanticTrackTypes.track },
93
- { name: "program", type: captionTypes.program },
76
+ { name: "timeline", type: timelineTypes.track },
94
77
  ],
95
78
  outputs: [{ name: "caption", type: captionTypes.timedProjection }], needs: [],
96
79
  }],