@hypit/hypit 0.1.4 → 0.1.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (462) hide show
  1. package/README.md +4 -2
  2. package/dist/public/caption.d.ts +206 -183
  3. package/dist/public/composition.d.ts +25 -3
  4. package/dist/public/endpoint-kit.d.ts +24 -2
  5. package/dist/public/generation.d.ts +5 -1
  6. package/dist/public/hyperframes.d.ts +19 -1
  7. package/dist/public/narrative.d.ts +17 -3
  8. package/dist/public/performance.d.ts +1590 -0
  9. package/dist/public/program-space.d.ts +179 -32
  10. package/dist/public/runtime-kit.d.ts +21 -8
  11. package/dist/public/sound.d.ts +822 -0
  12. package/dist/public/speech.d.ts +41 -0
  13. package/dist/public/studio-adapter.d.ts +77 -15
  14. package/dist/public/temporal-markup.d.ts +9 -44
  15. package/dist/public/temporal.d.ts +37 -28
  16. package/dist/public/{semantic-track.d.ts → timeline.d.ts} +62 -49
  17. package/examples/README.md +18 -10
  18. package/examples/minimal-author-package/packages/example-component/preview/preview.svml +19 -12
  19. package/examples/minimal-author-package/packages/example-component/src/component.ts +5 -5
  20. package/examples/minimal-author-package/packages/example-component/src/fragment.ts +3 -5
  21. package/examples/minimal-author-package/packages/example-component/src/manifest.ts +8 -10
  22. package/examples/minimal-author-package/packages/example-component/src/surface.ts +2 -2
  23. package/examples/provider-package/README.md +78 -0
  24. package/examples/provider-package/hypit.runtime.json +12 -0
  25. package/examples/provider-package/packages/provider-images/package.json +11 -0
  26. package/examples/provider-package/packages/provider-images/src/activation.ts +24 -0
  27. package/examples/provider-package/packages/provider-images/src/provider.ts +122 -0
  28. package/examples/provider-package/packages/provider-images/tsconfig.json +9 -0
  29. package/examples/semantic-composition/README.md +8 -1
  30. package/examples/semantic-composition/chat.svml +6 -5
  31. package/examples/semantic-composition/hypit.runtime.json +1 -1
  32. package/examples/semantic-composition/packages/chat-scene/README.md +3 -3
  33. package/examples/semantic-composition/packages/chat-scene/src/activation.ts +18 -21
  34. package/examples/semantic-composition/packages/chat-scene/src/render.ts +4 -4
  35. package/examples/semantic-composition/packages/performance-styles/README.md +42 -0
  36. package/examples/semantic-composition/packages/performance-styles/package.json +25 -0
  37. package/examples/semantic-composition/packages/performance-styles/src/activation.ts +57 -0
  38. package/examples/semantic-composition/packages/performance-styles/src/render.ts +54 -0
  39. package/examples/semantic-composition/packages/performance-styles/src/studio.ts +28 -0
  40. package/examples/semantic-composition/packages/performance-styles/tsconfig.json +18 -0
  41. package/examples/semantic-composition/packages/responsive-explainer/README.md +16 -9
  42. package/examples/semantic-composition/packages/responsive-explainer/src/activation.ts +12 -12
  43. package/examples/semantic-composition/packages/responsive-explainer/src/render.ts +5 -5
  44. package/examples/semantic-composition/packages/sound-styles/README.md +36 -0
  45. package/examples/semantic-composition/packages/sound-styles/package.json +25 -0
  46. package/examples/semantic-composition/packages/sound-styles/src/activation.ts +53 -0
  47. package/examples/semantic-composition/packages/sound-styles/src/render.ts +14 -0
  48. package/examples/semantic-composition/packages/sound-styles/tsconfig.json +18 -0
  49. package/package.json +35 -15
  50. package/packages/audio-track/README.md +20 -13
  51. package/packages/audio-track/package.json +1 -1
  52. package/packages/audio-track/src/component.ts +4 -4
  53. package/packages/audio-track/src/fragment.ts +6 -5
  54. package/packages/audio-track/src/index.ts +1 -1
  55. package/packages/audio-track/src/manifest.ts +17 -16
  56. package/packages/audio-track/src/program.ts +21 -25
  57. package/packages/audio-track/src/surface.ts +19 -18
  58. package/packages/audio-track-studio/README.md +23 -0
  59. package/packages/audio-track-studio/src/index.ts +28 -17
  60. package/packages/author-kit/README.md +1 -1
  61. package/packages/background-removal/README.md +4 -7
  62. package/packages/browser-capture/package.json +1 -1
  63. package/packages/build-result/README.md +11 -0
  64. package/packages/build-result/src/decode.ts +2 -0
  65. package/packages/build-result/src/execution-log.ts +17 -0
  66. package/packages/build-result/src/index.ts +1 -0
  67. package/packages/build-result/src/store.ts +14 -1
  68. package/packages/build-result/src/types.ts +3 -0
  69. package/packages/build-result-s3/src/repository.ts +4 -0
  70. package/packages/caption/README.md +61 -73
  71. package/packages/caption/package.json +3 -2
  72. package/packages/caption/src/activation.ts +2 -2
  73. package/packages/caption/src/component.ts +20 -5
  74. package/packages/caption/src/display.ts +3 -18
  75. package/packages/caption/src/fragment.ts +3 -7
  76. package/packages/caption/src/index.ts +6 -5
  77. package/packages/caption/src/manifest.ts +29 -46
  78. package/packages/caption/src/style.ts +24 -135
  79. package/packages/caption/src/surface.ts +12 -92
  80. package/packages/caption/src/temporalize.ts +18 -53
  81. package/packages/caption/src/types.ts +8 -35
  82. package/packages/caption/src/visibility.ts +23 -0
  83. package/packages/caption-fine/README.md +21 -9
  84. package/packages/caption-fine/package.json +4 -2
  85. package/packages/caption-fine/src/component.ts +3 -3
  86. package/packages/caption-fine/src/fragment.ts +7 -19
  87. package/packages/caption-fine/src/index.ts +2 -0
  88. package/packages/caption-fine/src/manifest.ts +26 -17
  89. package/packages/caption-fine/src/recipe.ts +7 -0
  90. package/packages/caption-fine/src/render.ts +14 -13
  91. package/packages/caption-fine/src/schedule.ts +39 -35
  92. package/packages/caption-fine/src/style.ts +10 -9
  93. package/packages/caption-fine/src/surface.ts +62 -35
  94. package/packages/caption-fine/src/types.ts +2 -0
  95. package/packages/caption-fine-studio/README.md +24 -2
  96. package/packages/caption-fine-studio/package.json +3 -1
  97. package/packages/caption-fine-studio/src/activation.ts +3 -3
  98. package/packages/caption-fine-studio/src/index.ts +54 -42
  99. package/packages/cli/README.md +57 -4
  100. package/packages/cli/package.json +1 -0
  101. package/packages/cli/src/arguments.ts +25 -6
  102. package/packages/cli/src/build-planning.ts +3 -2
  103. package/packages/cli/src/command.ts +6 -0
  104. package/packages/cli/src/commands/environment.ts +28 -18
  105. package/packages/cli/src/commands/execution.ts +81 -26
  106. package/packages/cli/src/commands/results.ts +7 -11
  107. package/packages/cli/src/index.ts +2 -2
  108. package/packages/cli/src/machine-view.ts +3 -2
  109. package/packages/cli/src/main.ts +34 -42
  110. package/packages/cli/src/observation.ts +7 -1
  111. package/packages/cli/src/output.ts +65 -23
  112. package/packages/cli/src/view.ts +66 -19
  113. package/packages/comment-sticker/README.md +3 -3
  114. package/packages/comment-sticker/package.json +1 -1
  115. package/packages/comment-sticker/src/component.ts +4 -4
  116. package/packages/comment-sticker/src/fragment.ts +5 -4
  117. package/packages/comment-sticker/src/manifest.ts +7 -6
  118. package/packages/comment-sticker/src/program.ts +9 -9
  119. package/packages/comment-sticker/src/surface.ts +6 -7
  120. package/packages/composition/README.md +21 -0
  121. package/packages/composition/src/audio-presentation.ts +44 -0
  122. package/packages/composition/src/index.ts +3 -0
  123. package/packages/composition/src/schema.ts +8 -3
  124. package/packages/composition/src/track.ts +15 -1
  125. package/packages/credential-store-env/README.md +1 -1
  126. package/packages/deck-track/README.md +3 -3
  127. package/packages/deck-track/package.json +1 -1
  128. package/packages/deck-track/src/component.ts +5 -5
  129. package/packages/deck-track/src/fragment.ts +6 -5
  130. package/packages/deck-track/src/lower.ts +12 -12
  131. package/packages/deck-track/src/manifest.ts +8 -7
  132. package/packages/deck-track/src/program.ts +13 -16
  133. package/packages/deck-track/src/surface.ts +9 -10
  134. package/packages/driver-node/src/driver.ts +41 -3
  135. package/packages/elevenlabs-speech/README.md +27 -0
  136. package/packages/{provider-xiaomi-mimo → elevenlabs-speech}/package.json +5 -8
  137. package/packages/elevenlabs-speech/src/activation.ts +26 -0
  138. package/packages/elevenlabs-speech/src/fragment.ts +11 -0
  139. package/packages/elevenlabs-speech/src/index.ts +111 -0
  140. package/packages/elevenlabs-speech/src/surface.ts +167 -0
  141. package/packages/endpoint-kit/README.md +24 -0
  142. package/packages/endpoint-kit/src/index.ts +7 -1
  143. package/packages/film/README.md +12 -7
  144. package/packages/film/package.json +1 -1
  145. package/packages/film/src/component.ts +4 -4
  146. package/packages/film/src/fragment.ts +6 -5
  147. package/packages/film/src/manifest.ts +11 -10
  148. package/packages/film/src/program.ts +5 -5
  149. package/packages/film/src/recipe.ts +2 -1
  150. package/packages/film/src/surface.ts +10 -7
  151. package/packages/film-studio/package.json +1 -1
  152. package/packages/film-studio/src/index.ts +2 -2
  153. package/packages/fishaudio-speech/README.md +33 -0
  154. package/packages/fishaudio-speech/package.json +21 -0
  155. package/packages/fishaudio-speech/src/activation.ts +32 -0
  156. package/packages/fishaudio-speech/src/fragment.ts +11 -0
  157. package/packages/fishaudio-speech/src/index.ts +156 -0
  158. package/packages/fishaudio-speech/src/surface.ts +192 -0
  159. package/packages/generation/README.md +11 -1
  160. package/packages/generation/src/mapping.ts +28 -30
  161. package/packages/gpt-image/README.md +1 -2
  162. package/packages/grok-imagine/README.md +1 -2
  163. package/packages/hyperframes/README.md +7 -3
  164. package/packages/hyperframes/src/browser-program.ts +11 -2
  165. package/packages/hyperframes/src/document.ts +15 -2
  166. package/packages/interview-emoji-reveal/README.md +4 -4
  167. package/packages/interview-emoji-reveal/package.json +1 -1
  168. package/packages/interview-emoji-reveal/src/component.ts +4 -4
  169. package/packages/interview-emoji-reveal/src/fragment.ts +6 -5
  170. package/packages/interview-emoji-reveal/src/manifest.ts +9 -8
  171. package/packages/interview-emoji-reveal/src/program.ts +14 -14
  172. package/packages/interview-emoji-reveal/src/surface.ts +8 -9
  173. package/packages/media-execution/README.md +7 -3
  174. package/packages/media-execution/src/audio-presentation.ts +23 -0
  175. package/packages/media-execution/src/execute.ts +2 -0
  176. package/packages/media-pipeline/README.md +7 -3
  177. package/packages/media-pipeline/src/audio-plan.ts +4 -1
  178. package/packages/media-pipeline/src/component.ts +16 -2
  179. package/packages/media-pipeline/src/manifest.ts +3 -1
  180. package/packages/media-pipeline/src/types.ts +2 -1
  181. package/packages/media-track/README.md +14 -47
  182. package/packages/media-track/package.json +1 -1
  183. package/packages/media-track/preview/preview.svml +5 -5
  184. package/packages/media-track/src/author.ts +12 -6
  185. package/packages/media-track/src/component.ts +10 -16
  186. package/packages/media-track/src/fragment.ts +8 -7
  187. package/packages/media-track/src/index.ts +3 -1
  188. package/packages/media-track/src/lower.ts +7 -7
  189. package/packages/media-track/src/manifest.ts +16 -38
  190. package/packages/media-track/src/program.ts +62 -67
  191. package/packages/media-track/src/sampling.ts +6 -6
  192. package/packages/media-track/src/sequence.ts +8 -8
  193. package/packages/media-track/src/surface.ts +25 -43
  194. package/packages/media-track-studio/README.md +9 -0
  195. package/packages/media-track-studio/src/index.ts +16 -11
  196. package/packages/mimo-speech/README.md +1 -1
  197. package/packages/minimax-h3/README.md +1 -1
  198. package/packages/nano-banana/README.md +1 -1
  199. package/packages/narrative/README.md +23 -1
  200. package/packages/narrative/src/identity.ts +11 -0
  201. package/packages/narrative/src/index.ts +3 -0
  202. package/packages/narrative/src/schema.ts +28 -27
  203. package/packages/narrative/src/selection.ts +52 -0
  204. package/packages/narrative/src/types.ts +2 -0
  205. package/packages/package-loader-node/README.md +30 -0
  206. package/packages/package-loader-node/package.json +5 -2
  207. package/packages/package-loader-node/src/distribution-resolution.ts +10 -3
  208. package/packages/package-loader-node/src/index.ts +1 -0
  209. package/packages/package-loader-node/src/loader.ts +12 -15
  210. package/packages/package-loader-node/src/location.ts +27 -1
  211. package/packages/package-loader-node/src/module-scope.ts +183 -0
  212. package/packages/package-loader-node/src/types.ts +4 -0
  213. package/packages/performance/README.md +83 -0
  214. package/packages/performance/package.json +30 -0
  215. package/packages/performance/src/activation.ts +11 -0
  216. package/packages/performance/src/component.ts +46 -0
  217. package/packages/performance/src/index.ts +6 -0
  218. package/packages/performance/src/manifest.ts +53 -0
  219. package/packages/{media-track/src/performance.ts → performance/src/media.ts} +9 -10
  220. package/packages/performance/src/program.ts +51 -0
  221. package/packages/performance/src/style.ts +35 -0
  222. package/packages/performance/src/surface.ts +99 -0
  223. package/packages/performance-studio/README.md +25 -0
  224. package/packages/performance-studio/package.json +21 -0
  225. package/packages/performance-studio/src/activation.ts +6 -0
  226. package/packages/performance-studio/src/index.ts +84 -0
  227. package/packages/program-space/README.md +9 -18
  228. package/packages/program-space/src/activation.ts +1 -5
  229. package/packages/program-space/src/index.ts +2 -11
  230. package/packages/program-space/src/surface.ts +1 -20
  231. package/packages/project-context-node/README.md +20 -0
  232. package/packages/project-context-node/package.json +10 -0
  233. package/packages/project-context-node/src/index.ts +3 -0
  234. package/packages/{cli → project-context-node}/src/runtime-selection.ts +7 -2
  235. package/packages/provider-hyperframes-local/README.md +43 -15
  236. package/packages/provider-hyperframes-local/src/activation.ts +4 -3
  237. package/packages/provider-hyperframes-local/src/capture-process.ts +26 -4
  238. package/packages/provider-hyperframes-local/src/capture.ts +96 -26
  239. package/packages/provider-hyperframes-local/src/concurrency.ts +86 -0
  240. package/packages/provider-hyperframes-local/src/opaque-capture.ts +92 -0
  241. package/packages/provider-hyperframes-local/src/options.ts +2 -0
  242. package/packages/provider-hyperframes-local/src/program.ts +6 -3
  243. package/packages/provider-hyperframes-local/src/progress.ts +53 -0
  244. package/packages/provider-hyperframes-local/src/provider.ts +18 -5
  245. package/packages/provider-hyperframes-local/src/render.ts +48 -7
  246. package/packages/provider-hypihub/README.md +48 -17
  247. package/packages/provider-hypihub/package.json +2 -0
  248. package/packages/provider-hypihub/src/mapping.ts +31 -7
  249. package/packages/provider-hypihub/src/oauth.ts +6 -0
  250. package/packages/provider-hypihub/src/provider.ts +25 -13
  251. package/packages/provider-hypihub/src/routes.ts +1 -2
  252. package/packages/provider-hypihub/src/upload.ts +2 -0
  253. package/packages/provider-media-local/README.md +3 -4
  254. package/packages/provider-whisperx-local/src/program.ts +1 -0
  255. package/packages/provider-whisperx-local/src/provider.ts +3 -0
  256. package/packages/ranking/README.md +8 -6
  257. package/packages/ranking/package.json +1 -1
  258. package/packages/ranking/src/component.ts +6 -6
  259. package/packages/ranking/src/fragment.ts +11 -7
  260. package/packages/ranking/src/manifest.ts +21 -14
  261. package/packages/ranking/src/render.ts +22 -26
  262. package/packages/ranking/src/schedule.ts +16 -19
  263. package/packages/ranking/src/surface.ts +12 -13
  264. package/packages/ranking-studio/README.md +18 -0
  265. package/packages/ranking-studio/src/index.ts +61 -9
  266. package/packages/render-hyperframes/README.md +7 -7
  267. package/packages/render-hyperframes/package.json +1 -1
  268. package/packages/render-hyperframes/src/component.ts +11 -1
  269. package/packages/render-hyperframes/src/fragment.ts +7 -4
  270. package/packages/render-hyperframes/src/manifest.ts +4 -4
  271. package/packages/render-hyperframes/src/surface.ts +6 -6
  272. package/packages/runtime/README.md +8 -1
  273. package/packages/runtime/src/execution.ts +15 -4
  274. package/packages/runtime/src/index.ts +2 -1
  275. package/packages/runtime/src/log.ts +51 -0
  276. package/packages/runtime/src/types.ts +5 -8
  277. package/packages/runtime-host-node/README.md +30 -0
  278. package/packages/runtime-host-node/package.json +1 -0
  279. package/packages/runtime-host-node/src/index.ts +24 -9
  280. package/packages/runtime-host-node/src/packages.ts +47 -50
  281. package/packages/runtime-kit/README.md +5 -0
  282. package/packages/runtime-kit/src/index.ts +3 -1
  283. package/packages/runtime-local/README.md +109 -4
  284. package/packages/runtime-local/src/config.ts +202 -56
  285. package/packages/runtime-local/src/control.ts +9 -1
  286. package/packages/runtime-local/src/executor.ts +66 -0
  287. package/packages/runtime-local/src/host.ts +37 -17
  288. package/packages/runtime-local/src/log.ts +48 -0
  289. package/packages/runtime-local/src/programs.ts +2 -1
  290. package/packages/runtime-local/src/result-writer.ts +2 -0
  291. package/packages/runtime-local/src/runtime.ts +8 -6
  292. package/packages/runtime-local/src/supervisor.ts +142 -0
  293. package/packages/runtime-local/src/types.ts +9 -2
  294. package/packages/runtime-local/src/worker-process.ts +7 -24
  295. package/packages/runtime-local/src/worker.ts +55 -83
  296. package/packages/screen-overlay/README.md +3 -3
  297. package/packages/screen-overlay/package.json +1 -1
  298. package/packages/screen-overlay/src/component.ts +3 -3
  299. package/packages/screen-overlay/src/fragment.ts +5 -4
  300. package/packages/screen-overlay/src/manifest.ts +7 -6
  301. package/packages/screen-overlay/src/program.ts +9 -9
  302. package/packages/screen-overlay/src/surface.ts +6 -7
  303. package/packages/script/README.md +30 -5
  304. package/packages/script/src/manifest.ts +4 -3
  305. package/packages/script/src/narrative.ts +1 -0
  306. package/packages/script/src/parser.ts +45 -6
  307. package/packages/script/src/surface.ts +4 -3
  308. package/packages/script/src/types.ts +1 -1
  309. package/packages/script-studio/package.json +9 -3
  310. package/packages/script-studio/src/index.ts +2 -0
  311. package/packages/script-studio/src/projection.ts +105 -0
  312. package/packages/seedance/README.md +30 -1
  313. package/packages/seedance/src/index.ts +18 -7
  314. package/packages/seedance/src/surface.ts +17 -4
  315. package/packages/seedance-kits/README.md +7 -1
  316. package/packages/seedream/README.md +1 -1
  317. package/packages/sound/README.md +81 -0
  318. package/packages/sound/package.json +25 -0
  319. package/packages/sound/src/activation.ts +11 -0
  320. package/packages/sound/src/component.ts +28 -0
  321. package/packages/sound/src/index.ts +5 -0
  322. package/packages/sound/src/manifest.ts +47 -0
  323. package/packages/sound/src/program.ts +84 -0
  324. package/packages/sound/src/style.ts +34 -0
  325. package/packages/sound/src/surface.ts +90 -0
  326. package/packages/sound-studio/README.md +22 -0
  327. package/packages/sound-studio/package.json +20 -0
  328. package/packages/sound-studio/src/activation.ts +6 -0
  329. package/packages/sound-studio/src/index.ts +74 -0
  330. package/packages/speech/README.md +2 -2
  331. package/packages/speech-alignment/src/local.ts +8 -0
  332. package/packages/speech-alignment/src/locate.ts +1 -1
  333. package/packages/store-sqlite/README.md +7 -0
  334. package/packages/store-sqlite/src/store.ts +84 -83
  335. package/packages/studio/INSPECTOR.md +15 -2
  336. package/packages/studio/LOCALIZATION.md +98 -0
  337. package/packages/studio/README.md +101 -14
  338. package/packages/studio/locales/en.json +197 -0
  339. package/packages/studio/locales/zh-CN.json +191 -0
  340. package/packages/studio/package.json +8 -7
  341. package/packages/studio/src/companion-assembly.ts +1 -0
  342. package/packages/studio/src/domain.ts +1 -1
  343. package/packages/studio/src/fallback-companions.ts +3 -3
  344. package/packages/studio/src/feedback-server.ts +51 -0
  345. package/packages/studio/src/feedback-store.ts +66 -0
  346. package/packages/studio/src/feedback.ts +60 -0
  347. package/packages/studio/src/localization-node.ts +46 -0
  348. package/packages/studio/src/localization.ts +85 -0
  349. package/packages/studio/src/parameter-values.ts +43 -1
  350. package/packages/studio/src/parameters.ts +114 -24
  351. package/packages/studio/src/preview/render.ts +5 -1
  352. package/packages/studio/src/preview/runtime-shim.ts +49 -3
  353. package/packages/studio/src/programme.ts +14 -30
  354. package/packages/studio/src/server.ts +10 -6
  355. package/packages/studio/src/shared.ts +4 -2
  356. package/packages/studio/src/snapshot.ts +21 -132
  357. package/packages/studio/src/studio-preflight.ts +3 -3
  358. package/packages/studio/src/studio-registry.ts +50 -6
  359. package/packages/studio/src/style.css +223 -50
  360. package/packages/studio/src/ui/artifact-name.ts +8 -6
  361. package/packages/studio/src/ui/artifact-preview.ts +5 -4
  362. package/packages/studio/src/ui/code.ts +17 -16
  363. package/packages/studio/src/ui/comments.ts +234 -0
  364. package/packages/studio/src/ui/dropdown.ts +68 -0
  365. package/packages/studio/src/ui/i18n.ts +109 -0
  366. package/packages/studio/src/ui/icons.ts +6 -0
  367. package/packages/studio/src/ui/library.ts +76 -65
  368. package/packages/studio/src/ui/main.ts +223 -211
  369. package/packages/studio/src/ui/overlay.ts +12 -8
  370. package/packages/studio/src/ui/scrub-preview.ts +110 -0
  371. package/packages/studio/src/ui/stage.ts +93 -29
  372. package/packages/studio/src/ui/timeline.ts +190 -118
  373. package/packages/studio/start.ts +41 -22
  374. package/packages/studio-adapter/README.md +130 -11
  375. package/packages/studio-adapter/src/index.ts +100 -13
  376. package/packages/temporal/README.md +6 -6
  377. package/packages/temporal/package.json +1 -1
  378. package/packages/temporal/src/component.ts +5 -6
  379. package/packages/temporal/src/index.ts +8 -6
  380. package/packages/temporal/src/location.ts +11 -11
  381. package/packages/temporal/src/projection.ts +19 -19
  382. package/packages/temporal/src/rational.ts +4 -4
  383. package/packages/temporal-markup/EDITING.md +2 -2
  384. package/packages/temporal-markup/README.md +27 -11
  385. package/packages/temporal-markup/package.json +1 -1
  386. package/packages/temporal-markup/src/index.ts +20 -25
  387. package/packages/temporal-markup/src/space.ts +10 -41
  388. package/packages/timeline/README.md +31 -0
  389. package/packages/{semantic-track → timeline}/package.json +1 -1
  390. package/packages/timeline/src/activation.ts +8 -0
  391. package/packages/timeline/src/component.ts +24 -0
  392. package/packages/timeline/src/identity.ts +60 -0
  393. package/packages/timeline/src/index.ts +6 -0
  394. package/packages/{semantic-track → timeline}/src/location.ts +20 -20
  395. package/packages/timeline/src/manifest.ts +39 -0
  396. package/packages/{semantic-track → timeline}/src/projection.ts +14 -14
  397. package/packages/timeline/src/types.ts +24 -0
  398. package/packages/timeline-author/README.md +68 -0
  399. package/packages/{speech-track → timeline-author}/package.json +6 -4
  400. package/packages/timeline-author/src/activation.ts +22 -0
  401. package/packages/{speech-track → timeline-author}/src/component.ts +15 -13
  402. package/packages/{speech-track → timeline-author}/src/fragment.ts +14 -23
  403. package/packages/timeline-author/src/index.ts +7 -0
  404. package/packages/timeline-author/src/manifest.ts +78 -0
  405. package/packages/timeline-author/src/program.ts +107 -0
  406. package/packages/timeline-author/src/surface.ts +46 -0
  407. package/packages/timeline-author/src/types.ts +6 -0
  408. package/packages/typography-track/README.md +4 -4
  409. package/packages/typography-track/package.json +1 -1
  410. package/packages/typography-track/src/component.ts +4 -4
  411. package/packages/typography-track/src/fragment.ts +4 -3
  412. package/packages/typography-track/src/manifest.ts +11 -9
  413. package/packages/typography-track/src/program.ts +15 -15
  414. package/packages/typography-track/src/surface.ts +17 -18
  415. package/packages/video-cli/README.md +4 -1
  416. package/packages/video-cli/package.json +2 -1
  417. package/packages/video-cli/src/creation.ts +14 -4
  418. package/packages/video-cli/src/index.ts +1 -1
  419. package/packages/video-cli/src/studio-distribution.ts +2 -1
  420. package/packages/volcengine-matting/README.md +3 -3
  421. package/packages/whisperx/README.md +1 -1
  422. package/services/whisperx/README.md +14 -0
  423. package/services/whisperx/pyproject.toml +2 -0
  424. package/services/whisperx/uv.lock +20 -20
  425. package/packages/provider-hyperframes-aws-lambda/README.md +0 -30
  426. package/packages/provider-hyperframes-aws-lambda/package.json +0 -30
  427. package/packages/provider-hyperframes-aws-lambda/src/activation.ts +0 -97
  428. package/packages/provider-hyperframes-aws-lambda/src/client.ts +0 -114
  429. package/packages/provider-hyperframes-aws-lambda/src/index.ts +0 -21
  430. package/packages/provider-hyperframes-aws-lambda/src/provider.ts +0 -522
  431. package/packages/provider-kie/README.md +0 -134
  432. package/packages/provider-kie/package.json +0 -43
  433. package/packages/provider-kie/src/activation.ts +0 -71
  434. package/packages/provider-kie/src/index.ts +0 -10
  435. package/packages/provider-kie/src/mapping.ts +0 -182
  436. package/packages/provider-kie/src/provider.ts +0 -657
  437. package/packages/provider-kie/src/routes.ts +0 -150
  438. package/packages/provider-xiaomi-mimo/README.md +0 -32
  439. package/packages/provider-xiaomi-mimo/src/activation.ts +0 -57
  440. package/packages/provider-xiaomi-mimo/src/index.ts +0 -5
  441. package/packages/provider-xiaomi-mimo/src/provider.ts +0 -214
  442. package/packages/runtime/src/environment.ts +0 -6
  443. package/packages/semantic-track/README.md +0 -21
  444. package/packages/semantic-track/src/activation.ts +0 -8
  445. package/packages/semantic-track/src/component.ts +0 -24
  446. package/packages/semantic-track/src/identity.ts +0 -58
  447. package/packages/semantic-track/src/index.ts +0 -6
  448. package/packages/semantic-track/src/manifest.ts +0 -38
  449. package/packages/semantic-track/src/types.ts +0 -26
  450. package/packages/speech-track/README.md +0 -51
  451. package/packages/speech-track/src/activation.ts +0 -19
  452. package/packages/speech-track/src/index.ts +0 -7
  453. package/packages/speech-track/src/manifest.ts +0 -73
  454. package/packages/speech-track/src/program.ts +0 -64
  455. package/packages/speech-track/src/surface.ts +0 -35
  456. package/packages/speech-track/src/types.ts +0 -6
  457. package/packages/speech-track-studio/README.md +0 -3
  458. package/packages/speech-track-studio/package.json +0 -14
  459. package/packages/speech-track-studio/src/activation.ts +0 -7
  460. package/packages/speech-track-studio/src/index.ts +0 -40
  461. /package/packages/{cli → project-context-node}/src/project-context.ts +0 -0
  462. /package/packages/{speech-track → timeline-author}/preview/Track.png +0 -0
@@ -1,5 +1,4 @@
1
1
  import { randomUUID } from "node:crypto";
2
- import { setImmediate } from "node:timers/promises";
3
2
  import type { BuildState } from "@hypit/protocol";
4
3
  import type {
5
4
  ResourceStore,
@@ -10,12 +9,13 @@ import type {
10
9
  RuntimePreparation,
11
10
  RuntimeRunnableCommand,
12
11
  ScheduledBuildResult,
13
- RuntimeWorkerRunOptions,
14
12
  } from "@hypit/runtime";
15
13
  import { LocalBuildScheduler } from "@hypit/runtime";
16
14
  import { BuildMachine } from "@hypit/core";
17
15
 
18
16
  type LocalWorkerOptions = {
17
+ readonly executionBuild?: string;
18
+ readonly executionLogs?: import("./log.js").LocalExecutionLogs;
19
19
  readonly stores: {
20
20
  readonly builds: import("@hypit/runtime").BuildStore;
21
21
  readonly operations: import("@hypit/runtime").OperationStore;
@@ -25,7 +25,6 @@ type LocalWorkerOptions = {
25
25
  readonly resourceStore: ResourceStore;
26
26
  readonly resourceStoreForBuild?: (build: string) => ResourceStore;
27
27
  readonly openBuildResultRepository: NonNullable<import("./types.js").CreateLocalRuntimeOptions["openBuildResultRepository"]>;
28
- readonly assertEnvironment?: () => Promise<void> | void;
29
28
  readonly installComponentPackages: (specifiers: readonly string[]) => Promise<void>;
30
29
  readonly resultWriter: import("./types.js").LocalResultWriter;
31
30
  };
@@ -36,28 +35,6 @@ function assert(condition: unknown, message: string): asserts condition {
36
35
  if (!condition) throw new Error(message);
37
36
  }
38
37
 
39
- function positive(value: number, subject: string): number {
40
- assert(Number.isSafeInteger(value) && value > 0, `${subject} must be a positive safe integer`);
41
- return value;
42
- }
43
-
44
- async function pause(ms: number, signal?: AbortSignal): Promise<void> {
45
- if (signal?.aborted === true) throw signal.reason ?? new Error("Worker stopped");
46
- await new Promise<void>((resolve, reject) => {
47
- const done = (): void => {
48
- signal?.removeEventListener("abort", abort);
49
- resolve();
50
- };
51
- const timer = setTimeout(done, ms);
52
- const abort = (): void => {
53
- clearTimeout(timer);
54
- signal?.removeEventListener("abort", abort);
55
- reject(signal?.reason ?? new Error("Worker stopped"));
56
- };
57
- signal?.addEventListener("abort", abort, { once: true });
58
- });
59
- }
60
-
61
38
  /** Shares declared capacity across independently advancing Builds. */
62
39
  class CapacityExecutor implements RuntimeCommandExecutor {
63
40
  readonly #delegate: RuntimeCommandExecutor;
@@ -87,9 +64,13 @@ class CapacityExecutor implements RuntimeCommandExecutor {
87
64
  context: { readonly build: string },
88
65
  ): Promise<RuntimeExecutionResult> {
89
66
  const store = this.#options.stores.executions;
67
+ const recordExecution = this.#options.executionLogs === undefined ? {} : {
68
+ recordExecution: (event: import("@hypit/runtime").ExecutionLogEvent) =>
69
+ this.#options.executionLogs!.record(context.build, descriptor.command.id, event),
70
+ };
90
71
  if (descriptor.capacityMode === "asynchronous") {
91
72
  return await this.#delegate.executeCommand(state, descriptor, {
92
- ...context, releaseOperationCapacity: () => this.#options.stores.execution.releaseCapacity(context.build, descriptor.command.id),
73
+ ...context, ...recordExecution, releaseOperationCapacity: () => this.#options.stores.execution.releaseCapacity(context.build, descriptor.command.id),
93
74
  });
94
75
  }
95
76
  const begun = await store.begin(context.build, descriptor.command.id);
@@ -107,7 +88,10 @@ class CapacityExecutor implements RuntimeCommandExecutor {
107
88
  return { status: "completed", event };
108
89
  }
109
90
  try {
110
- const result = await this.#delegate.executeCommand(state, descriptor, context);
91
+ const result = await this.#delegate.executeCommand(state, descriptor, {
92
+ ...context, ...recordExecution,
93
+ reportProgress: (activity) => store.reportProgress(context.build, descriptor.command.id, activity),
94
+ });
111
95
  assert(result.status === "completed",
112
96
  `Immediate Command ${descriptor.command.id} returned ${result.status}`);
113
97
  await store.complete(context.build, descriptor.command.id, result.event);
@@ -190,11 +174,13 @@ class DurableLocalWorker {
190
174
  readonly #options: LocalWorkerOptions;
191
175
  readonly #executorWithCapacity: CapacityExecutor;
192
176
  readonly #owner = randomUUID();
177
+ readonly #ownedBuilds = new Set<string>();
193
178
  #buildRead = Promise.resolve();
194
179
 
195
180
  constructor(executor: RuntimeCommandExecutor, options: LocalWorkerOptions) {
196
181
  this.#executor = executor;
197
182
  this.#options = options;
183
+ if (options.executionBuild !== undefined) this.#ownedBuilds.add(options.executionBuild);
198
184
  this.#executorWithCapacity = new CapacityExecutor(executor, options, this.#owner);
199
185
  }
200
186
 
@@ -247,7 +233,14 @@ class DurableLocalWorker {
247
233
  }
248
234
  if (execution.stop.cause === "user-cancelled") {
249
235
  for (const operation of await this.#options.stores.operations.list({ build: execution.build })) {
250
- if (operation.status === "pending") await this.#executor.cancelOperation?.(machine.view(), operation);
236
+ if (operation.status === "pending") {
237
+ const cancelled = await this.#executor.cancelOperation?.(machine.view(), operation);
238
+ if (cancelled !== undefined) await this.#options.executionLogs?.record(operation.build, operation.command, {
239
+ endpoint: operation.endpoint, kind: "diagnostic", level: "info",
240
+ message: `Cancellation: ${cancelled.cancellation?.outcome ?? "unsupported"}${
241
+ cancelled.cancellation?.message === undefined ? "" : `; ${cancelled.cancellation.message}`}`,
242
+ });
243
+ }
251
244
  }
252
245
  }
253
246
  }
@@ -322,7 +315,13 @@ class DurableLocalWorker {
322
315
  hydrated?.();
323
316
  const actions = await Promise.allSettled(pending.map(async (operation) => {
324
317
  if (operation === undefined) throw new Error(`Build ${execution.build} lost a waiting Operation`);
325
- const result = await this.#executor.advanceOperation!(operation);
318
+ const result = await this.#executor.advanceOperation!(operation, {
319
+ build: operation.build,
320
+ ...(this.#options.executionLogs === undefined ? {} : {
321
+ recordExecution: (event: import("@hypit/runtime").ExecutionLogEvent) =>
322
+ this.#options.executionLogs!.record(operation.build, operation.command, event),
323
+ }),
324
+ });
326
325
  if (result.remoteEnded || result.status !== "pending") {
327
326
  await this.#options.stores.execution.releaseCapacity(execution.build, result.command);
328
327
  }
@@ -380,65 +379,38 @@ class DurableLocalWorker {
380
379
  return finished;
381
380
  }
382
381
 
383
- async runOnce(): Promise<WorkerTurnResult | undefined> {
384
- await this.#options.assertEnvironment?.();
385
- const execution = await this.#options.stores.execution.claim(this.#owner, Date.now());
386
- if (execution === undefined) return undefined;
387
- const [result] = await this.#runClaimed([execution]);
388
- return result;
389
- }
390
-
391
- async run(options: RuntimeWorkerRunOptions): Promise<void> {
392
- positive(options.idlePollMs, "Worker idlePollMs");
393
- const active = new Set<Promise<void>>();
394
- // The Runtime Host admits one Worker process. Any stored turn owner therefore belongs to the
395
- // previous process; clearing it changes no external fact and performs no Result action.
396
- await this.#options.assertEnvironment?.();
397
- await this.#options.stores.execution.reclaimActionCapacity();
398
- await this.#options.stores.execution.reclaimTurns(Date.now());
399
- await this.#options.stores.execution.reclaimResultWrites();
400
- for (const execution of await this.#options.stores.execution.list()) {
401
- if (execution.decision !== undefined && execution.attention === undefined) {
402
- await this.#options.stores.execution.setAttention(execution.build, {
403
- step: "result",
404
- error: "Result writing was interrupted; run `hypit result finish <build-id>`",
405
- });
406
- }
382
+ async runOnce(options: { readonly build?: string; readonly hydrated?: () => void } = {}): Promise<WorkerTurnResult | undefined> {
383
+ const store = this.#options.stores.execution;
384
+ const assigned = this.#options.executionBuild;
385
+ if (assigned !== undefined && options.build !== undefined && options.build !== assigned) {
386
+ throw new Error(`This execution context belongs to Build ${assigned}, not ${options.build}`);
407
387
  }
408
- await options.ready?.();
409
- try {
410
- while (options.signal?.aborted !== true) {
411
- await this.#options.assertEnvironment?.();
412
- while (!Boolean(options.signal?.aborted)) {
413
- const execution = await this.#options.stores.execution.claim(this.#owner, Date.now());
414
- if (execution === undefined) break;
415
- let markHydrated!: () => void;
416
- const hydration = new Promise<void>((resolve) => { markHydrated = resolve; });
417
- let task: Promise<void>;
418
- task = this.#runClaimed([execution], markHydrated)
419
- .then(() => undefined)
420
- .finally(() => active.delete(task));
421
- active.add(task);
422
- // The next Build may execute concurrently, but its persisted snapshot is
423
- // not hydrated until this one has left the single-threaded JSON boundary.
424
- await Promise.race([hydration, task]);
425
- // Awaiting synchronous stores only drains microtasks. Let sockets, timers and
426
- // stop signals run before claiming another piece of ready work.
427
- await setImmediate();
388
+ const selected = options.build ?? assigned;
389
+ for (const build of selected === undefined ? await store.listReady() : [selected]) {
390
+ const current = await store.read(build);
391
+ if (current === undefined || current.decision !== undefined) continue;
392
+ if (current.startedAt !== undefined && !this.#ownedBuilds.has(build)) {
393
+ if (selected === undefined) continue;
394
+ throw new Error(`Build ${build} already belongs to another execution context; create a new Build to continue`);
395
+ }
396
+ const execution = await store.claim(this.#owner, Date.now(), build);
397
+ if (execution === undefined) continue;
398
+ if (!this.#ownedBuilds.has(build)) {
399
+ if (execution.startedAt !== undefined) {
400
+ await store.releaseTurn(build, this.#owner, execution.wakeAt, execution.operationWait);
401
+ throw new Error(`Build ${build} was assigned to another execution context`);
428
402
  }
429
- const idle = new AbortController();
430
- const signal = options.signal === undefined ? idle.signal : AbortSignal.any([idle.signal, options.signal]);
431
- try {
432
- await Promise.race([...active, pause(options.idlePollMs, signal)]);
433
- } catch (error) {
434
- if (!Boolean(options.signal?.aborted)) throw error;
435
- } finally { idle.abort(); }
436
-
403
+ await store.start(build);
404
+ this.#ownedBuilds.add(build);
437
405
  }
438
- } finally {
439
- await Promise.allSettled(active);
406
+ const [result] = await this.#runClaimed([execution], options.hydrated);
407
+ if (result !== undefined && ("outcome" in result || result.decision !== undefined)) this.#ownedBuilds.delete(build);
408
+ return result;
440
409
  }
410
+ return undefined;
441
411
  }
412
+
413
+
442
414
  }
443
415
 
444
416
  export function createDurableLocalWorker(
@@ -1,12 +1,12 @@
1
1
  # `@hypit/screen-overlay`
2
2
 
3
- The Track Surface accepts `semantic={speech.semantic}` or `space={animation}`. Semantic context
4
- resolves Script Selections and Moments; authored space supports clock-based animation. Shared `at`
3
+ The Track Surface accepts `timeline={program.timeline}`. The same Timeline supports authored
4
+ positions and, where prepared Takes supply evidence, Script Selections and Moments. Shared `at`
5
5
  inputs accept a Moment or a time such as `2s`; `at` with `for` produces a Window where required.
6
6
 
7
7
  Official provider-free self-contained screen-paint package.
8
8
 
9
- Every item consumes its typed parameters, explicit Temporal source, CanvasSpace, ProgramSpace,
9
+ Every item consumes its typed parameters, explicit Temporal source, CanvasSpace, Timeline,
10
10
  seed and local frame. Flash, ColorWash, Vignette, ScanLines, DirectionalMatte, WhipVeil,
11
11
  GlitchVeil, Grain, LightLeak, Bokeh and TVStatic lower to ordinary absolute-stack `VisualTrack`
12
12
  Presents. These effects generate their own pixels over the selected interval.
@@ -13,7 +13,7 @@
13
13
  "@hypit/narrative": "workspace:*",
14
14
  "@hypit/protocol": "workspace:*",
15
15
  "@hypit/program-space": "workspace:*",
16
- "@hypit/semantic-track": "workspace:*",
16
+ "@hypit/timeline": "workspace:*",
17
17
  "@hypit/spatial": "workspace:*",
18
18
  "@hypit/temporal": "workspace:*",
19
19
  "@hypit/temporal-markup": "workspace:*",
@@ -1,7 +1,7 @@
1
+ import type { Timeline } from "@hypit/timeline";
1
2
  import type { ComponentPackage } from "@hypit/component-kit";
2
3
  import { canonicalize } from "@hypit/protocol";
3
4
  import type { StoredValue } from "@hypit/protocol";
4
- import type { ProgramSpace } from "@hypit/program-space";
5
5
  import type { CanvasSpace } from "@hypit/spatial";
6
6
  import { screenOverlayProducers, screenOverlayTypes } from "./manifest.js";
7
7
  import { appendProjectedScreenOverlay, assertScreenOverlayProgram, createScreenOverlaySet, finalizeScreenOverlay, renderScreenOverlay } from "./program.js";
@@ -12,9 +12,9 @@ const output = (value: unknown) => ({ kind: "inline" as const, value: canonicali
12
12
  export const screenOverlayComponent = {
13
13
  producers: [
14
14
  { producer: screenOverlayProducers.createSet, handler: () => ({ outputs: { set: output(createScreenOverlaySet()) }, needs: {} }) },
15
- { producer: screenOverlayProducers.appendItem, handler: ({ inputs }) => ({ outputs: { set: output(appendProjectedScreenOverlay(inline<ScreenOverlaySet>(inputs.set?.value, "ScreenOverlaySet"), inline<ScreenOverlayHeader>(inputs.header?.value, "ScreenOverlayHeader"), inline<ProgramSpace>(inputs.space?.value, "ProgramSpace"), inline<ScreenOverlayItemSpec>(inputs.spec?.value, "ScreenOverlayItemSpec"), inline<TemporalWindow>(inputs.window?.value, "TemporalWindow"))) }, needs: {} }) },
15
+ { producer: screenOverlayProducers.appendItem, handler: ({ inputs }) => ({ outputs: { set: output(appendProjectedScreenOverlay(inline<ScreenOverlaySet>(inputs.set?.value, "ScreenOverlaySet"), inline<ScreenOverlayHeader>(inputs.header?.value, "ScreenOverlayHeader"), inline<Timeline>(inputs.timeline?.value, "Timeline"), inline<ScreenOverlayItemSpec>(inputs.spec?.value, "ScreenOverlayItemSpec"), inline<TemporalWindow>(inputs.window?.value, "TemporalWindow"))) }, needs: {} }) },
16
16
  { producer: screenOverlayProducers.finalize, handler: ({ inputs }) => ({ outputs: { program: output(finalizeScreenOverlay(inline<ScreenOverlaySet>(inputs.set?.value, "ScreenOverlaySet"), inline<ScreenOverlayHeader>(inputs.header?.value, "ScreenOverlayHeader"))) }, needs: {} }) },
17
- { producer: screenOverlayProducers.render, handler: ({ inputs }) => ({ outputs: { track: output(renderScreenOverlay(inline<CanvasSpace>(inputs.canvas?.value, "CanvasSpace"), inline<ProgramSpace>(inputs.space?.value, "ProgramSpace"), inline<ScreenOverlayProgram>(inputs.program?.value, "ScreenOverlayProgram"))) }, needs: {} }) },
17
+ { producer: screenOverlayProducers.render, handler: ({ inputs }) => ({ outputs: { track: output(renderScreenOverlay(inline<CanvasSpace>(inputs.canvas?.value, "CanvasSpace"), inline<Timeline>(inputs.timeline?.value, "Timeline"), inline<ScreenOverlayProgram>(inputs.program?.value, "ScreenOverlayProgram"))) }, needs: {} }) },
18
18
  ],
19
19
  validators: [{ type: screenOverlayTypes.program, handler: ({ value }) => assertScreenOverlayProgram(inline<ScreenOverlayProgram>(value, "ScreenOverlayProgram")) }],
20
20
  } satisfies ComponentPackage;
@@ -1,4 +1,5 @@
1
- import { programSpaceTypes } from "@hypit/program-space";
1
+ import { timelineTypes } from "@hypit/timeline";
2
+
2
3
  import { compositionTypes } from "@hypit/composition";
3
4
  import { sealGraphFragment } from "@hypit/elaborator";
4
5
  import type { FragmentOperation } from "@hypit/elaborator";
@@ -22,16 +23,16 @@ export function createScreenOverlayFragment(items: readonly ScreenOverlayFragmen
22
23
  const id = `overlay:set:append:${String(index + 1).padStart(4, "0")}`;
23
24
  operations.push({ id, producer: screenOverlayProducers.appendItem,
24
25
  inputs: { set: operation(current), header: input("header"), spec: input(item.specName),
25
- space: input("space"), window: input(item.windowName) }, result: { kind: "output", name: "set" } });
26
+ timeline: input("timeline"), window: input(item.windowName) }, result: { kind: "output", name: "set" } });
26
27
  current = id;
27
28
  });
28
29
  operations.push(
29
30
  { id: "overlay:program", producer: screenOverlayProducers.finalize, inputs: { set: operation(current), header: input("header") }, result: { kind: "output", name: "program" } },
30
- { id: "overlay:track", producer: screenOverlayProducers.render, inputs: { canvas: input("canvas"), space: input("space"), program: operation("overlay:program") }, result: { kind: "output", name: "track" } },
31
+ { id: "overlay:track", producer: screenOverlayProducers.render, inputs: { canvas: input("canvas"), timeline: input("timeline"), program: operation("overlay:program") }, result: { kind: "output", name: "track" } },
31
32
  );
32
33
  return sealGraphFragment({ inputs: [
33
34
  { name: "canvas", type: spatialTypes.canvas }, { name: "header", type: screenOverlayTypes.header },
34
- { name: "space", type: programSpaceTypes.programSpace }, ...[...types].map(([inputName, type]) => ({ name: inputName, type })),
35
+ { name: "timeline", type: timelineTypes.track }, ...[...types].map(([inputName, type]) => ({ name: inputName, type })),
35
36
  ], operations, exports: [
36
37
  { name: "program", type: screenOverlayTypes.program, root: operation("overlay:program") },
37
38
  { name: "track", type: compositionTypes.visualTrack, root: operation("overlay:track") },
@@ -1,11 +1,12 @@
1
+ import { timelineTypes } from "@hypit/timeline";
1
2
  import { temporalContextAttributeVocabulary } from "@hypit/temporal-markup";
2
3
  import { readFile } from "node:fs/promises";
3
4
 
4
5
  import { compositionDependency, compositionTypes } from "@hypit/composition";
5
6
  import { narrativeDependency } from "@hypit/narrative";
6
- import { programSpaceDependency, programSpaceTypes } from "@hypit/program-space";
7
+
7
8
  import type { ModuleManifest, ProducerRef, TypeRef, ValueSchema } from "@hypit/protocol";
8
- import { semanticTrackDependency } from "@hypit/semantic-track";
9
+ import { timelineDependency } from "@hypit/timeline";
9
10
  import { spatialDependency, spatialTypes } from "@hypit/spatial";
10
11
  import { temporalDependency, temporalTypes } from "@hypit/temporal";
11
12
  import { temporalWindowAttributeVocabulary } from "@hypit/temporal-markup";
@@ -65,7 +66,7 @@ export const screenOverlayHeaderSchema: ValueSchema = object({ id: { schema: str
65
66
  export const screenOverlayItemSpecSchema: ValueSchema = itemSpec;
66
67
  export const screenOverlaySetSchema: ValueSchema = object({ items: { schema: { kind: "array", items: item } } });
67
68
  export const screenOverlayProgramSchema: ValueSchema = object({ id: { schema: string }, items: { schema: { kind: "array", minItems: 1, items: item } } });
68
- const appendInputs = [{ name: "set", type: screenOverlayTypes.set }, { name: "header", type: screenOverlayTypes.header }, { name: "space", type: programSpaceTypes.programSpace }, { name: "spec", type: screenOverlayTypes.itemSpec }, { name: "window", type: temporalTypes.window }] as const;
69
+ const appendInputs = [{ name: "set", type: screenOverlayTypes.set }, { name: "header", type: screenOverlayTypes.header }, { name: "timeline", type: timelineTypes.track }, { name: "spec", type: screenOverlayTypes.itemSpec }, { name: "window", type: temporalTypes.window }] as const;
69
70
 
70
71
  const itemAttributes = [
71
72
  { name: "id", kind: "identifier", required: false,
@@ -269,7 +270,7 @@ export const screenOverlayMarkupSurfaces = [
269
270
  { name: "track", type: compositionTypes.visualTrack,
270
271
  summary: "The rendered overlay, an ordinary peer VisualTrack." },
271
272
  ],
272
- example: `<screen:Track id="effects" semantic={speech.semantic} canvas={vertical}>
273
+ example: `<screen:Track id="effects" timeline={speech.timeline} canvas={vertical}>
273
274
  <screen:Flash during={story.selection.overlay} z="80"
274
275
  color="#ffffff" intensity="0.6" attack="2" hold="2" decay="6"/>
275
276
  </screen:Track>`,
@@ -288,7 +289,7 @@ export const screenOverlayMarkupSurfaces = [
288
289
 
289
290
  export const screenOverlayManifest: ModuleManifest = {
290
291
  format: "hypit.module@1", name: screenOverlayModuleRef.name, version: screenOverlayModuleRef.version,
291
- dependencies: [narrativeDependency, programSpaceDependency, semanticTrackDependency, spatialDependency, temporalDependency, compositionDependency],
292
+ dependencies: [narrativeDependency, timelineDependency, spatialDependency, temporalDependency, compositionDependency],
292
293
  types: [
293
294
  { name: screenOverlayTypes.header.name },
294
295
  { name: screenOverlayTypes.itemSpec.name },
@@ -299,7 +300,7 @@ export const screenOverlayManifest: ModuleManifest = {
299
300
  { name: screenOverlayProducers.createSet.name, inputs: [], outputs: [{ name: "set", type: screenOverlayTypes.set }], needs: [] },
300
301
  { name: screenOverlayProducers.appendItem.name, inputs: [...appendInputs], outputs: [{ name: "set", type: screenOverlayTypes.set }], needs: [] },
301
302
  { name: screenOverlayProducers.finalize.name, inputs: [{ name: "set", type: screenOverlayTypes.set }, { name: "header", type: screenOverlayTypes.header }], outputs: [{ name: "program", type: screenOverlayTypes.program }], needs: [] },
302
- { name: screenOverlayProducers.render.name, inputs: [{ name: "canvas", type: spatialTypes.canvas }, { name: "space", type: programSpaceTypes.programSpace }, { name: "program", type: screenOverlayTypes.program }], outputs: [{ name: "track", type: compositionTypes.visualTrack }], needs: [] },
303
+ { name: screenOverlayProducers.render.name, inputs: [{ name: "canvas", type: spatialTypes.canvas }, { name: "timeline", type: timelineTypes.track }, { name: "program", type: screenOverlayTypes.program }], outputs: [{ name: "track", type: compositionTypes.visualTrack }], needs: [] },
303
304
  ],
304
305
  };
305
306
  export const screenOverlayDependency = { module: screenOverlayModuleRef } as const;
@@ -1,7 +1,7 @@
1
+ import type { Timeline } from "@hypit/timeline";
1
2
  import { assertVisualTrackIdentity, sealVisualTrack } from "@hypit/composition";
2
3
  import type { VisualAnimation, VisualElement, VisualStyleDeclaration, VisualTrack } from "@hypit/composition";
3
4
  import { assertProgramSpaceIdentity } from "@hypit/program-space";
4
- import type { ProgramSpace } from "@hypit/program-space";
5
5
  import { canonicalize } from "@hypit/protocol";
6
6
  import { assertCanvasSpace } from "@hypit/spatial";
7
7
  import type { CanvasSpace } from "@hypit/spatial";
@@ -107,11 +107,11 @@ export function assertScreenOverlaySet(value: ScreenOverlaySet): void {
107
107
  }
108
108
 
109
109
  function realized(
110
- set: ScreenOverlaySet, header: ScreenOverlayHeader, space: ProgramSpace, spec: ScreenOverlayItemSpec,
110
+ set: ScreenOverlaySet, header: ScreenOverlayHeader, timeline: Timeline, spec: ScreenOverlayItemSpec,
111
111
  window: ProjectedWindow,
112
112
  ): ScreenOverlaySet {
113
113
  assertScreenOverlaySet(set); assertScreenOverlayHeader(header); assertScreenOverlayItemSpec(spec);
114
- assertTemporalWindowFor(window, { subjectId: spec.id, space });
114
+ assertTemporalWindowFor(window, { subjectId: spec.id, space: timeline });
115
115
  const addition = {
116
116
  id: window.id,
117
117
  subjectId: spec.id,
@@ -128,11 +128,11 @@ function realized(
128
128
  export function appendProjectedScreenOverlay(
129
129
  set: ScreenOverlaySet,
130
130
  header: ScreenOverlayHeader,
131
- space: ProgramSpace,
131
+ timeline: Timeline,
132
132
  spec: ScreenOverlayItemSpec,
133
133
  window: ProjectedWindow,
134
134
  ): ScreenOverlaySet {
135
- return realized(set, header, space, spec, window);
135
+ return realized(set, header, timeline, spec, window);
136
136
  }
137
137
  export function sealScreenOverlayProgram(value: ScreenOverlayProgram): ScreenOverlayProgram {
138
138
  const normalized = { id: value.id,
@@ -307,15 +307,15 @@ function overlayElements(content: ScreenOverlayComponent, canvas: CanvasSpace, d
307
307
  }
308
308
  }
309
309
 
310
- export function renderScreenOverlay(canvas: CanvasSpace, space: ProgramSpace, program: ScreenOverlayProgram): VisualTrack {
311
- assertCanvasSpace(canvas); assertProgramSpaceIdentity(space); assertScreenOverlayProgram(program);
310
+ export function renderScreenOverlay(canvas: CanvasSpace, timeline: Timeline, program: ScreenOverlayProgram): VisualTrack {
311
+ assertCanvasSpace(canvas); assertProgramSpaceIdentity(timeline); assertScreenOverlayProgram(program);
312
312
  const track = sealVisualTrack({
313
- programSpaceId: space.id, visualIr: "hypit.visual-ir@1", id: program.id,
313
+ programSpaceId: timeline.id, visualIr: "hypit.visual-ir@1", id: program.id,
314
314
  presents: program.items.map((item) => ({
315
315
  id: item.id, subjectId: item.subjectId, span: { ...item.span }, stacking: { ...item.stacking },
316
316
  elements: overlayElements(item.content, canvas, item.span.endFrameExclusive - item.span.startFrame),
317
317
  })),
318
318
  });
319
- assertVisualTrackIdentity(track, space);
319
+ assertVisualTrackIdentity(track, timeline);
320
320
  return track;
321
321
  }
@@ -1,4 +1,4 @@
1
- import { createTemporalSpace, resolveTemporalContext } from "@hypit/temporal-markup";
1
+ import { resolveTemporalContext } from "@hypit/temporal-markup";
2
2
  import { spatialTypes } from "@hypit/spatial";
3
3
  import type { StructuredElement, StructuredSurfaceHandler, SurfaceComponentDraft, SurfaceRecordDraft, SurfaceResolvedReference, MarkupAttributeValue } from "@hypit/markup";
4
4
  import { createTemporalWindowProjection, temporalWindowAttributeNames } from "@hypit/temporal-markup";
@@ -57,16 +57,15 @@ function content(element: StructuredElement): { readonly value: ScreenOverlayCom
57
57
  }
58
58
 
59
59
  export const decodeScreenOverlaySurface: StructuredSurfaceHandler = ({ element, resolveReference }) => {
60
- allowed(element, ["id", "canvas", "semantic"]); const id = text(element, "id");
60
+ allowed(element, ["id", "canvas", "timeline"]); const id = text(element, "id");
61
61
  const canvas = ref(element.attributes.canvas, `${element.name}.canvas`, spatialTypes.canvas, resolveReference);
62
62
  const context = resolveTemporalContext({ element, resolveReference });
63
- const time = createTemporalSpace({ id: id, element, ...context });
64
63
  const headerId = `${id}.header`; const records: SurfaceRecordDraft[] = [{ id: headerId, type: screenOverlayTypes.header,
65
64
  value: { kind: "inline", value: sealScreenOverlayHeader({ id }) }, range: element.range }];
66
- const temporalComponents: SurfaceComponentDraft[] = [...time.components];
67
- const temporalFragments: ReturnType<typeof createTemporalWindowProjection>["fragments"][number][] = [...time.fragments];
65
+ const temporalComponents: SurfaceComponentDraft[] = [];
66
+ const temporalFragments: ReturnType<typeof createTemporalWindowProjection>["fragments"][number][] = [];
68
67
  const fragmentItems: Parameters<typeof createScreenOverlayFragment>[0][number][] = [];
69
- const inputs: Record<string, typeof canvas.ref> = { canvas: canvas.ref, header: { kind: "record", id: headerId }, space: time.space.ref };
68
+ const inputs: Record<string, typeof canvas.ref> = { canvas: canvas.ref, header: { kind: "record", id: headerId }, timeline: context.timeline.ref };
70
69
  let index = 0;
71
70
  for (const child of element.children) {
72
71
  if (child.kind === "text") { if (child.value.trim()) throw new Error(`${element.name} accepts only component children.`); continue; }
@@ -76,7 +75,7 @@ export const decodeScreenOverlaySurface: StructuredSurfaceHandler = ({ element,
76
75
  const itemSpec = sealScreenOverlayItemSpec({
77
76
  id: optionalText(child, "id") ?? `${id}.${decoded.value.kind}.${suffix}`, content: decoded.value,
78
77
  stackingOrder: integer(child, "z") });
79
- const temporal = createTemporalWindowProjection({ id: itemSpec.id, element: child, ...context, space: time.space, resolveReference });
78
+ const temporal = createTemporalWindowProjection({ id: itemSpec.id, element: child, ...context, resolveReference });
80
79
  records.push(...temporal.records); temporalComponents.push(...temporal.components); temporalFragments.push(...temporal.fragments);
81
80
  const specId = `${id}.item.${suffix}.spec`; const specName = `item-${suffix}-spec`;
82
81
  records.push({ id: specId, type: screenOverlayTypes.itemSpec, value: { kind: "inline", value: itemSpec }, range: child.range });
@@ -53,8 +53,8 @@ The Surface exports one full Narrative plus narrow, immutable views:
53
53
  - `script.moment.<id>` is a reusable explicit Moment.
54
54
 
55
55
  `@hypit/caption` projects `script.selection.<id>` or a Role onto complete Caption Alignment Units;
56
- it then joins those units to a SemanticTrack for frame timing. Seedance consumes dialogue `Text`,
57
- Estimate and TTS consume speech `Text`, and Speech Track consumes the Segment excerpt. None imports
56
+ it then joins those units to a Timeline for frame timing. Seedance consumes dialogue `Text`,
57
+ Estimate and TTS consume speech `Text`, and semantic preparation consumes the Segment excerpt. None imports
58
58
  Script's parser AST. Another authoring package may produce the same ordinary Text, Narrative and
59
59
  CaptionDocument contracts.
60
60
 
@@ -64,7 +64,7 @@ CaptionDocument contracts.
64
64
  - **Role Cue**: a speaker turn, written as a bare tag such as `<ALICE>` inside a Segment. The next
65
65
  Role Cue or the Segment close ends that turn.
66
66
  - **Dual Text**: one authored speech span with separate display and spoken projections, written
67
- `<display text | spoken text>`.
67
+ `<display text | spoken text>`. In `<display text|>`, omitted speech inherits the displayed prose.
68
68
  - **Selection marker**: a named semantic range, written `@name ... @/name`.
69
69
  - **Moment marker**: a named semantic point, written `@name!`.
70
70
  - **CaptionDocument**: the Script-owned caption truth; it contains **Display Words**,
@@ -73,11 +73,23 @@ CaptionDocument contracts.
73
73
  `really{emphasis,importance=2,tone=warm}`. Values may be strings, finite numbers or booleans. It
74
74
  becomes `CaptionDisplayWord.attributes`; it is not a Selection and does not carry timing.
75
75
 
76
- Within Dual Text, an unescaped `@` is legal only on the spoken side. The display side is literal; write
77
- `\@` if an at-sign must be shown. An empty display side, such as `< | spoken words>`, keeps the speech
76
+ Within Dual Text, an unescaped `@` belongs to the source of spoken text: the right side when supplied,
77
+ or the shared left side in `<display text|>`. Write `\@` if an at-sign must be shown. An empty display side, such as `< | spoken words>`, keeps the speech
78
78
  tokens and omits them from Caption. `||` is an authored Caption Cue Break and must occur between
79
79
  complete Alignment Units.
80
80
 
81
+ `<组件化|>` is shorthand for `<组件化|组件化>`, using the same exported Caption Alignment Unit.
82
+ It groups the displayed expression without merging its individual speech Tokens or time anchors.
83
+ For example, `把<动效|><组件化|>。|| 之后<直接复用|>。` authors groups inside two Cues.
84
+ Use groups where the expression should be treated together; ordinary prose needs no extra markup.
85
+ Caption Styles choose whether to highlight, reveal or keep the text steady.
86
+
87
+ In a shared side, markers and display attributes do not enter either text projection. Its speech
88
+ Tokens retain offsets into the actually written left-hand text, so Studio can move an anchor inside
89
+ `<组@beat!件化|>` without expanding the shorthand. Attributes still annotate the preceding display
90
+ word, not the whole group. Whitespace-only speech is omitted; a group with no spoken text on either
91
+ side is invalid. This adds no new public value type or protocol version.
92
+
81
93
  ## Segments, turns and Cues are different boundaries
82
94
 
83
95
  A Segment names a structural production passage. It can contain several Role turns and be performed
@@ -157,3 +169,16 @@ distinct boundaries writable.
157
169
  Writeback reparses the result to retain the intended identities and unchanged narrative/caption
158
170
  content. These checks concern authored order, not frame order. A consumer's temporal projection
159
171
  determines whether the resulting Instant or Window is usable.
172
+
173
+ ## Complete authored content and narrow exports
174
+
175
+ The root `story` Record contains the complete Narrative: speech structure, semantic references and
176
+ its CaptionDocument. `story.caption`, `story.selection.<id>`, Segment excerpts and dialogue/speech
177
+ Text outputs remain explicit narrow exports derived from that content. Caption rendering can read
178
+ the document and Timeline. Timed Uses change its presentation; their semantic references are
179
+ projected through the same Timeline as other components. Word attributes remain in the document
180
+ for families that give those words structural visual roles.
181
+
182
+ For content lookup, use the Narrative package's `narrativeTokensForSelection` or
183
+ `narrativeSelectionTokenRange`. These query authored order; Timeline separately locates the same
184
+ anchors in the assembled video. No timestamps or display Styles enter the Script value.
@@ -32,7 +32,7 @@ export const scriptMarkupSurfaces = [
32
32
  text: "The element's own content is the Script body: named Segments holding prose, Role Cues, Dual Text, flat token attributes, and zero-width Selection and Moment markers. It carries no timecode, no media reference and no generation parameter.",
33
33
  ports: [
34
34
  { name: "", type: narrativeType,
35
- summary: "The whole authored Narrative, addressed by the element's own id." },
35
+ summary: "The complete authored Narrative, including speech structure, semantic anchors and its CaptionDocument, addressed by the element's own id." },
36
36
  { name: "segment.<id>", type: narrativeExcerptType,
37
37
  summary: "One Segment as a narrow Excerpt, used to associate a generated Take with that Segment." },
38
38
  { name: "segment.<id>.dialogue", type: textTypes.text,
@@ -40,7 +40,7 @@ export const scriptMarkupSurfaces = [
40
40
  { name: "segment.<id>.speech", type: textTypes.text,
41
41
  summary: "One Segment as pronunciation only, with Role Cue labels dropped." },
42
42
  { name: "caption", type: captionDocumentType,
43
- summary: "The complete Script-owned CaptionDocument: display Words, N:M Alignment Units, Cue breaks and speech correspondence." },
43
+ summary: "The Narrative's CaptionDocument exported as a narrow view: display Words, N:M Alignment Units, Cue breaks and speech correspondence." },
44
44
  { name: "selection.<id>", type: narrativeSelectionType,
45
45
  summary: "One named range over the Narrative, reusable wherever a Selection is read." },
46
46
  { name: "moment.<id>", type: narrativeMomentType,
@@ -64,7 +64,8 @@ export const scriptMarkupSurfaces = [
64
64
  "A Script requires at least one Segment, and natural-language text is refused outside a Segment.",
65
65
  "A Segment is opened by its own lower-case name and closed by that exact name, or written self-closing as `<pause/>`; the name is the Segment id, must be unique within the Script, and `script` is reserved. Segments do not nest.",
66
66
  "A Role Cue such as `<HOST>` is a bare tag inside a Segment with no close; its turn runs until the next Cue or the end of the Segment, and a Cue may not follow unowned speech in the same Segment. Role state resets when the Segment closes.",
67
- "Dual Text is written `<display | speech>`: the left side reaches the caption projection and the right side reaches dialogue and speech. The spoken side must not be empty; the displayed side may be, which speaks a word that is never displayed.",
67
+ "Dual Text is written `<display | speech>`: the left side reaches Caption and the right side reaches dialogue and speech. `<display|>` inherits speech from the displayed prose and forms the same complete alignment unit; its word times remain individual. `<|speech>` speaks without displaying. Both sides empty is invalid.",
68
+ "Inside Dual Text, semantic markers belong to the source of spoken text: the explicit right side, or the shared left side when speech is omitted. Display attributes remain visual metadata and never enter spoken text.",
68
69
  "A flat token attribute follows a complete display token as `{name}` or `{name=value}`; multiple attributes use one comma-separated block. Attributes do not nest, do not carry timing, and never split a Dual Alignment Unit.",
69
70
  "Selection and Moment markers are zero-width, share one name namespace, and may not split a speech token:",
70
71
  [
@@ -180,6 +180,7 @@ export function narrativeMomentValue(moment: ParsedNarrative["moments"][number],
180
180
  export function narrativeValue(parsed: ParsedNarrative, id: string): CanonicalValue {
181
181
  return canonicalize({
182
182
  id,
183
+ caption: captionDocument(parsed, `${id}.caption`, id),
183
184
  segments: parsed.segments.map((segment) => ({
184
185
  id: segment.id,
185
186
  startAnchorId: segment.startAnchorId,