@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,5 @@
1
+ import type { Timeline } from "@hypit/timeline";
1
2
  import { assertProgramSpaceIdentity, programSpaceFrameCount } from "@hypit/program-space";
2
- import type { ProgramSpace } from "@hypit/program-space";
3
3
  import {
4
4
  assertSpatialFrame,
5
5
  assertSpatialPath,
@@ -304,7 +304,7 @@ function append(
304
304
  export function appendProjectedTextItem(
305
305
  set: TypographyTrackSet,
306
306
  header: TypographyTrackHeader,
307
- space: ProgramSpace,
307
+ timeline: Timeline,
308
308
  placement: TextPlacement,
309
309
  spec: TextItemSpec,
310
310
  style: TextStyle,
@@ -312,7 +312,7 @@ export function appendProjectedTextItem(
312
312
  window: ProjectedWindow,
313
313
  ): TypographyTrackSet {
314
314
  assertTextPlacement(placement);
315
- assertTemporalWindowFor(window, { subjectId: spec.id, space });
315
+ assertTemporalWindowFor(window, { subjectId: spec.id, space: timeline });
316
316
  return append(set, header, spec, style, motion, placement.geometry, window);
317
317
  }
318
318
 
@@ -332,18 +332,18 @@ export function sealTypographyTrackProgram(value: TypographyTrackProgram): Typog
332
332
  return programContent(value);
333
333
  }
334
334
 
335
- export function assertTypographyTrackProgramIdentity(program: TypographyTrackProgram, space: ProgramSpace): void {
336
- assertProgramSpaceIdentity(space);
335
+ export function assertTypographyTrackProgramIdentity(program: TypographyTrackProgram, timeline: Timeline): void {
336
+ assertProgramSpaceIdentity(timeline);
337
337
  nonEmpty(program.id, "TypographyTrackProgram id");
338
338
  if (program.items.length === 0) throw new Error("TypographyTrackProgram has no Items.");
339
- const total = programSpaceFrameCount(space);
339
+ const total = programSpaceFrameCount(timeline);
340
340
  const ids = new Set<string>();
341
341
  for (const item of program.items) {
342
342
  nonEmpty(item.id, "Text Item id");
343
343
  if (ids.has(item.id)) throw new Error(`TypographyTrackProgram repeats ${item.id}.`);
344
344
  ids.add(item.id);
345
345
  if (item.span.startFrame < 0 || item.span.endFrameExclusive <= item.span.startFrame || item.span.endFrameExclusive > total) {
346
- throw new Error(`${item.id} is outside ProgramSpace.`);
346
+ throw new Error(`${item.id} is outside Timeline.`);
347
347
  }
348
348
  assertGeometry(item.geometry);
349
349
  assertDocument(item.document, `${item.id} document`);
@@ -556,10 +556,10 @@ function elements(item: TextItem): VisualElement[] {
556
556
  return [root, motion, terminalTextElement(item, "motion", 2)];
557
557
  }
558
558
 
559
- export function renderTypographyTrack(space: ProgramSpace, program: TypographyTrackProgram): VisualTrack {
560
- assertTypographyTrackProgramIdentity(program, space);
559
+ export function renderTypographyTrack(timeline: Timeline, program: TypographyTrackProgram): VisualTrack {
560
+ assertTypographyTrackProgramIdentity(program, timeline);
561
561
  const track = sealVisualTrack({
562
- programSpaceId: space.id,
562
+ programSpaceId: timeline.id,
563
563
  visualIr: "hypit.visual-ir@1",
564
564
  id: program.id,
565
565
  presents: program.items.map((item) => ({
@@ -569,24 +569,24 @@ export function renderTypographyTrack(space: ProgramSpace, program: TypographyTr
569
569
  elements: elements(item),
570
570
  })),
571
571
  });
572
- assertVisualTrackIdentity(track, space);
572
+ assertVisualTrackIdentity(track, timeline);
573
573
  return track;
574
574
  }
575
575
 
576
576
  export function renderTextMaskTrack(
577
- space: ProgramSpace,
577
+ timeline: Timeline,
578
578
  program: TypographyTrackProgram,
579
579
  material: CompositableSurfaceRef,
580
580
  spec: TextMaskSpec,
581
581
  ): VisualTrack {
582
- assertTypographyTrackProgramIdentity(program, space);
582
+ assertTypographyTrackProgramIdentity(program, timeline);
583
583
  assertCompositableSurfaceRef(material);
584
584
  assertTextMaskSpec(spec);
585
585
  if (material.timing.kind !== "still") {
586
586
  throw new Error("Official Text Mask requires one explicit still material Surface; timed materials use an independent package.");
587
587
  }
588
588
  const track = sealVisualTrack({
589
- programSpaceId: space.id,
589
+ programSpaceId: timeline.id,
590
590
  visualIr: "hypit.visual-ir@1",
591
591
  id: spec.id,
592
592
  presents: program.items.map((item) => {
@@ -617,6 +617,6 @@ export function renderTextMaskTrack(
617
617
  };
618
618
  }),
619
619
  });
620
- assertVisualTrackIdentity(track, space);
620
+ assertVisualTrackIdentity(track, timeline);
621
621
  return track;
622
622
  }
@@ -1,5 +1,6 @@
1
- import { createTemporalSpace, resolveTemporalContext } from "@hypit/temporal-markup";
2
- import { programSpaceTypes } from "@hypit/program-space";
1
+ import { timelineTypes } from "@hypit/timeline";
2
+ import { resolveTemporalContext } from "@hypit/temporal-markup";
3
+
3
4
  import { compositionTypes } from "@hypit/composition";
4
5
  import type {
5
6
  VisualColorPaint,
@@ -649,7 +650,7 @@ function createTrackFragment(id: string, items: readonly FragmentItem[]): GraphF
649
650
  }
650
651
  const append = `text:set:append:${String(index + 1).padStart(4, "0")}`;
651
652
  const common = {
652
- set: operation(current), header: input("header"), space: input("space"), placement: operation(bind),
653
+ set: operation(current), header: input("header"), timeline: input("timeline"), placement: operation(bind),
653
654
  spec: item.contentName === undefined ? input(item.specName) : operation(materialized),
654
655
  style: input(item.styleName), motion: input(item.motionName), window: input(item.windowName),
655
656
  };
@@ -658,10 +659,10 @@ function createTrackFragment(id: string, items: readonly FragmentItem[]): GraphF
658
659
  }
659
660
  operations.push(
660
661
  { id: "text:finalize", producer: typographyTrackProducers.finalize, inputs: { header: input("header"), set: operation(current) }, result: { kind: "output", name: "program" } },
661
- { id: "text:render", producer: typographyTrackProducers.render, inputs: { space: input("space"), program: operation("text:finalize") }, result: { kind: "output", name: "track" } },
662
+ { id: "text:render", producer: typographyTrackProducers.render, inputs: { timeline: input("timeline"), program: operation("text:finalize") }, result: { kind: "output", name: "track" } },
662
663
  );
663
664
  const inputEntries = [
664
- { name: "space", type: programSpaceTypes.programSpace },
665
+ { name: "timeline", type: timelineTypes.track },
665
666
  { name: "header", type: typographyTrackTypes.header },
666
667
  ...items.flatMap((item) => [
667
668
  { name: item.geometryName, type: item.placementKind === "point" ? spatialTypes.point : item.placementKind === "area" ? spatialTypes.frame : spatialTypes.path },
@@ -688,10 +689,9 @@ function createTrackFragment(id: string, items: readonly FragmentItem[]): GraphF
688
689
  }
689
690
 
690
691
  export const decodeTypographyTrackSurface: StructuredSurfaceHandler = ({ element, resolveReference }) => {
691
- allowed(element, ["id", "semantic", "space"], ["id"]);
692
+ allowed(element, ["id", "timeline"], ["id"]);
692
693
  const id = text(element, "id");
693
694
  const context = resolveTemporalContext({ element, resolveReference });
694
- const time = createTemporalSpace({ id: id, element, ...context });
695
695
  const headerId = `${id}.__header`;
696
696
  const records: SurfaceRecordDraft[] = [{
697
697
  id: headerId, type: typographyTrackTypes.header,
@@ -699,8 +699,8 @@ export const decodeTypographyTrackSurface: StructuredSurfaceHandler = ({ element
699
699
  }];
700
700
  const defaultMotionId = `${id}.__still-motion`;
701
701
  records.push({ id: defaultMotionId, type: typographyTrackTypes.motion, value: { kind: "inline", value: stillTextMotion(defaultMotionId) }, range: element.range });
702
- const temporalComponents: SurfaceComponentDraft[] = [...time.components];
703
- const temporalFragments: ReturnType<typeof createTemporalWindowProjection>["fragments"][number][] = [...time.fragments];
702
+ const temporalComponents: SurfaceComponentDraft[] = [];
703
+ const temporalFragments: ReturnType<typeof createTemporalWindowProjection>["fragments"][number][] = [];
704
704
  const items: Array<FragmentItem & {
705
705
  readonly geometry: SurfaceResolvedReference;
706
706
  readonly style: SurfaceResolvedReference;
@@ -731,7 +731,7 @@ export const decodeTypographyTrackSurface: StructuredSurfaceHandler = ({ element
731
731
  "id", "content", "placement", "style", "motion", ...temporalWindowAttributeNames,
732
732
  ], ["id", "placement", "style"]);
733
733
  const itemId = text(child, "id");
734
- const temporal = createTemporalWindowProjection({ id: itemId, element: child, ...context, space: time.space, resolveReference });
734
+ const temporal = createTemporalWindowProjection({ id: itemId, element: child, ...context, resolveReference });
735
735
  records.push(...temporal.records); temporalComponents.push(...temporal.components); temporalFragments.push(...temporal.fragments);
736
736
  const placementKind = form.toLowerCase() as "point" | "area" | "path";
737
737
  const geometry = reference(child.attributes.placement, `${child.name}.placement`, placementKind === "point" ? spatialTypes.point : placementKind === "area" ? spatialTypes.frame : spatialTypes.path, resolveReference);
@@ -777,7 +777,7 @@ export const decodeTypographyTrackSurface: StructuredSurfaceHandler = ({ element
777
777
  components: [...temporalComponents, {
778
778
  id, fragment: fragment.id,
779
779
  inputs: {
780
- space: time.space.ref, header: { kind: "record", id: headerId },
780
+ timeline: context.timeline.ref, header: { kind: "record", id: headerId },
781
781
  ...Object.fromEntries(items.flatMap((item) => [
782
782
  [item.geometryName, item.geometry.ref], [item.specName, { kind: "record" as const, id: item.specId }],
783
783
  [item.windowName, item.window],
@@ -794,7 +794,7 @@ export const decodeTypographyTrackSurface: StructuredSurfaceHandler = ({ element
794
794
 
795
795
  function createMaskFragment(id: string): GraphFragment {
796
796
  const inputs = [
797
- { name: "space", type: programSpaceTypes.programSpace },
797
+ { name: "timeline", type: timelineTypes.track },
798
798
  { name: "program", type: typographyTrackTypes.program },
799
799
  { name: "material", type: mediaTypes.compositableSurface },
800
800
  { name: "spec", type: typographyTrackTypes.maskSpec },
@@ -804,7 +804,7 @@ function createMaskFragment(id: string): GraphFragment {
804
804
  operations: [
805
805
  {
806
806
  id: "text-mask:render", producer: typographyTrackProducers.renderMask,
807
- inputs: { space: input("space"), program: input("program"), material: input("material"), spec: input("spec") },
807
+ inputs: { timeline: input("timeline"), program: input("program"), material: input("material"), spec: input("spec") },
808
808
  result: { kind: "output", name: "track" },
809
809
  },
810
810
  ],
@@ -815,11 +815,10 @@ function createMaskFragment(id: string): GraphFragment {
815
815
  }
816
816
 
817
817
  export const decodeTypographyMaskSurface: StructuredSurfaceHandler = ({ element, resolveReference }) => {
818
- allowed(element, ["id", "semantic", "space", "text", "material", "mode", "fit"], ["id", "text", "material"]);
818
+ allowed(element, ["id", "timeline", "text", "material", "mode", "fit"], ["id", "text", "material"]);
819
819
  empty(element);
820
820
  const id = text(element, "id");
821
821
  const context = resolveTemporalContext({ element, resolveReference });
822
- const time = createTemporalSpace({ id: id, element, ...context });
823
822
  const program = reference(element.attributes.text, `${element.name}.text`, typographyTrackTypes.program, resolveReference);
824
823
  const material = reference(element.attributes.material, `${element.name}.material`, mediaTypes.compositableSurface, resolveReference);
825
824
  const specId = `${id}.__spec`;
@@ -831,12 +830,12 @@ export const decodeTypographyMaskSurface: StructuredSurfaceHandler = ({ element,
831
830
  const fragment = createMaskFragment(id);
832
831
  return {
833
832
  records: [{ id: specId, type: typographyTrackTypes.maskSpec, value: { kind: "inline", value: spec }, range: element.range }],
834
- components: [...time.components, {
833
+ components: [{
835
834
  id, fragment: fragment.id,
836
- inputs: { space: time.space.ref, program: program.ref, material: material.ref, spec: { kind: "record", id: specId } },
835
+ inputs: { timeline: context.timeline.ref, program: program.ref, material: material.ref, spec: { kind: "record", id: specId } },
837
836
  outputs: { track: `${id}.track` }, range: element.range,
838
837
  }],
839
- fragments: [...time.fragments, fragment],
838
+ fragments: [fragment],
840
839
  exports: [`${id}.track`],
841
840
  };
842
841
  };
@@ -4,11 +4,16 @@
4
4
  "license": "SEE LICENSE IN LICENSE",
5
5
  "private": true,
6
6
  "type": "module",
7
- "exports": { ".": "./src/index.ts" },
8
- "hypit": { "activation": "./src/activation.ts" },
7
+ "exports": {
8
+ ".": "./src/index.ts"
9
+ },
10
+ "hypit": {
11
+ "activation": "./src/activation.ts"
12
+ },
9
13
  "dependencies": {
10
14
  "@hypit/composition": "workspace:*",
11
15
  "@hypit/studio-adapter": "workspace:*",
12
- "@hypit/typography-track": "workspace:*"
16
+ "@hypit/typography-track": "workspace:*",
17
+ "@hypit/fonts-open": "workspace:*"
13
18
  }
14
19
  }
@@ -1,9 +1,12 @@
1
+ import { openFontStudioFields } from "@hypit/fonts-open/studio";
1
2
  import { typographyTrackMarkupSurfaces, typographyTrackModuleRef, typographyTrackTypes } from "@hypit/typography-track";
2
3
  import type { TypographyTrackProgram } from "@hypit/typography-track";
3
4
  import { compositionTypes } from "@hypit/composition";
4
5
  import type { StudioTrackCompanion, StudioTrackCompanionContext, StudioEntityDraft, StudioInspectorFieldDeclaration } from "@hypit/studio-adapter";
5
6
  import { childEntities, requiredSurfaceValue, temporalLineageFor, temporalSemanticSource, textLayer } from "@hypit/studio-adapter";
6
7
 
8
+ const fontInspector = openFontStudioFields("style");
9
+
7
10
  const typographyProperties = (typographyTrackMarkupSurfaces
8
11
  .find((surface) => surface.name === "style")?.vocabulary.attributes
9
12
  .find((attribute) => attribute.name === "recipe")?.recipe ?? []);
@@ -105,11 +108,12 @@ export const typographyTrackStudioTrackCompanions: readonly StudioTrackCompanion
105
108
  { name: "content" },
106
109
  {
107
110
  name: "style",
111
+ referenced: [fontInspector.binding],
108
112
  recipe: { through: ["recipe"], bindings: typographyProperties.map(({ name }) => ({ name })) },
109
113
  },
110
114
  { name: "motion" },
111
115
  ],
112
- inspector: typographyInspector,
116
+ inspector: [...fontInspector.fields, ...typographyInspector],
113
117
  requiredValues: ["program"], project: projectTypography,
114
118
  lane: { heightPx: 48 },
115
119
  },
@@ -37,14 +37,26 @@ Result or state. It names the Endpoint and its price page before it runs, and wr
37
37
  to the chosen file. `measure` estimates a passage locally:
38
38
 
39
39
  ```bash
40
- hypit transcribe reference.mp4 --to notes/reference.transcript.json [--language en|zh|es]
40
+ hypit transcribe reference.mp4 --to notes/reference.transcript.json --language en
41
41
  hypit measure main.svml --segment hook --language en --pace normal --rounding round
42
42
  ```
43
43
 
44
+ For `transcribe`, set `--language` to the spoken language: `en`, `zh` or `es`. Chinese speech uses `zh`, including
45
+ Chinese speech containing English names; the requested language selects the recognition/alignment
46
+ model, independently of the eventual caption font or script's simplified/traditional characters.
47
+
44
48
  `transcribe` uses the Profile's `whisperx-alignment` Endpoint (after
45
- extracting 16 kHz mono speech audio with ffmpeg). `measure` counts a Segment's pronunciation units at a
46
- delivery policy and prints the seconds to write as the literal `duration`; it opens no Profile and
47
- spends nothing. `--runtime <profile>` names the Profile; otherwise the project's `hypit runtime use`
49
+ extracting 16 kHz mono speech audio with ffmpeg). Direct invocation forwards the Provider's progress
50
+ and diagnostic callbacks; the CLI reports phase changes while waiting, with JSON progress on the
51
+ separate progress stream when supplied. Immediate invocation has no durable remote task receipt and
52
+ does not become resumable merely because it reports progress. `measure` counts a Segment's pronunciation units at a
53
+ delivery policy and prints estimated seconds, the resolved rate, padding and rounding. Choose the
54
+ literal `duration` from that estimate and the intended performance. `measure` opens no Profile and
55
+ spends nothing. It accepts `--pace slow|normal|fast` or `--rate <units/s>`; JSON includes the resolved
56
+ `rate` even when using a named pace. [Estimate](../estimate/README.md#units-and-delivery) explains
57
+ Chinese/English units and choosing a whole-passage density.
58
+
59
+ For `transcribe`, `--runtime <profile>` names the Profile; otherwise the project's `hypit runtime use`
48
60
  selection is read. Anything the Author Graph declares as an output is a Build, however quickly it
49
61
  comes back: pictures, clips and accepted voice references (`@hypit/mimo-speech`) carry the identity of the Source
50
62
  that produced them, so they are declared in the Source and go through `plan` and `build`. To hear a
@@ -20,6 +20,7 @@
20
20
  "@hypit/markup": "workspace:*",
21
21
  "@hypit/model-kit": "workspace:*",
22
22
  "@hypit/package-loader-node": "workspace:*",
23
+ "@hypit/project-context-node": "workspace:*",
23
24
  "@hypit/protocol": "workspace:*",
24
25
  "@hypit/provider-hypihub": "workspace:*",
25
26
  "@hypit/runtime": "workspace:*",
@@ -32,6 +33,6 @@
32
33
  "@hypit/whisperx": "workspace:*",
33
34
  "@hypit/workspace-fs-node": "workspace:*",
34
35
  "@hypit/yt-dlp": "workspace:*",
35
- "sharp": "0.35.3"
36
+ "sharp": "0.35.4"
36
37
  }
37
38
  }
@@ -2,18 +2,20 @@ import { mkdir, mkdtemp, readFile, rm, stat, writeFile } from "node:fs/promises"
2
2
  import { tmpdir } from "node:os";
3
3
  import { dirname, join, resolve } from "node:path";
4
4
 
5
- import { findRuntimeProfile, loadDiscoveredSourcePackages, resolveProjectRoot } from "@hypit/cli";
5
+ import { loadDiscoveredSourcePackages } from "@hypit/cli";
6
+ import { findRuntimeProfile, resolveProjectRoot } from "@hypit/project-context-node";
6
7
  import type { CliIo } from "@hypit/cli";
7
8
  import { MemoryResourceStore } from "@hypit/driver-node";
8
9
  import {
9
10
  countSpeechEstimateUnits,
10
11
  estimateSpeechDuration,
11
12
  resolveSpeechEstimateLanguage,
13
+ resolveSpeechEstimateRate,
12
14
  speechEstimatePolicyFromAttributes,
13
15
  } from "@hypit/estimate";
14
16
  import type { CanonicalValue, CapabilityRef, Need, StoredValue } from "@hypit/protocol";
15
17
  import type { ResourceStore } from "@hypit/runtime";
16
- import type { RuntimeHostCapabilityProvider, RuntimeHostProviderQuery } from "@hypit/runtime-host-node";
18
+ import type { RuntimeHostCapabilityProvider, RuntimeHostProviderQuery, RuntimeInvocationObservation } from "@hypit/runtime-host-node";
17
19
  import { sealSpeechEvidenceAudio } from "@hypit/speech";
18
20
  import { speechEvidenceTypes } from "@hypit/speech-evidence";
19
21
  import type { AlignedTranscriptEvidence } from "@hypit/speech-evidence";
@@ -31,7 +33,7 @@ export type CreationCommand = typeof creationCommands[number];
31
33
  /** The slice of the Runtime host these commands use; tests hand in a fake. */
32
34
  export type CreationHost = {
33
35
  providers(requests: readonly RuntimeHostProviderQuery[]): Promise<readonly RuntimeHostCapabilityProvider[]>;
34
- invoke(need: Need, resources: ResourceStore): Promise<{ readonly value: StoredValue }>;
36
+ invoke(need: Need, resources: ResourceStore, observation?: RuntimeInvocationObservation): Promise<{ readonly value: StoredValue }>;
35
37
  };
36
38
 
37
39
  export type CreationEnvironment = {
@@ -275,8 +277,9 @@ async function transcribe(argv: readonly string[], io: CliIo, environment: Creat
275
277
  const parsed = parseArguments(argv, ["--language", "--to", "--runtime", "--workspace"]);
276
278
  assert(parsed.positionals.length === 1, "transcribe takes exactly one audio or video file");
277
279
  const source = resolve(environment.cwd, parsed.positionals[0]!);
278
- const language = parsed.options.get("--language") ?? "en";
279
- assert(language === "en" || language === "zh" || language === "es", "--language must be en, zh or es");
280
+ const language = parsed.options.get("--language");
281
+ assert(language === "en" || language === "zh" || language === "es",
282
+ "transcribe requires --language en|zh|es for the spoken language (use --language zh for Chinese)");
280
283
  const to = await destination(parsed, environment.cwd);
281
284
  const { profile, host } = await environment.openHost(
282
285
  parsed.options.get("--runtime"),
@@ -295,7 +298,16 @@ async function transcribe(argv: readonly string[], io: CliIo, environment: Creat
295
298
  };
296
299
  const provider = await selectedProvider(host, need, profile);
297
300
  if (!parsed.json) io.write(`Transcribing through ${providerLine(provider)}\n`);
298
- const fulfillment = await host.invoke(need, resources);
301
+ const report = parsed.json ? io.writeProgress : io.writeProgress ?? io.write;
302
+ let previousPhase: string | undefined;
303
+ const fulfillment = await host.invoke(need, resources, {
304
+ reportProgress: async (progress) => {
305
+ if (progress.phase === previousPhase) return;
306
+ previousPhase = progress.phase;
307
+ report?.(` · ${progress.phase}\n`);
308
+ },
309
+ reportDiagnostic: async (diagnostic) => { report?.(` · ${diagnostic.message}\n`); },
310
+ });
299
311
  assert(fulfillment.value.kind === "inline", "the transcript came back by reference");
300
312
  const passages = passagesInSeconds(fulfillment.value.value as unknown as AlignedTranscriptEvidence);
301
313
  const words = passages.reduce((total, passage) => total + passage.words.length, 0);
@@ -382,6 +394,7 @@ async function measure(argv: readonly string[], io: CliIo, environment: Creation
382
394
  }
383
395
  const pace = parsed.options.get("--pace");
384
396
  const rate = parsed.options.get("--rate");
397
+ assert(pace === undefined || rate === undefined, "measure takes either --pace or --rate, not both");
385
398
  const policy = speechEstimatePolicyFromAttributes({
386
399
  language: parsed.options.get("--language") ?? "auto",
387
400
  ...(rate === undefined ? { pace: pace ?? "normal" } : { rate }),
@@ -391,6 +404,7 @@ async function measure(argv: readonly string[], io: CliIo, environment: Creation
391
404
  const language = resolveSpeechEstimateLanguage(text, policy.language);
392
405
  const units = countSpeechEstimateUnits(text, language);
393
406
  const seconds = estimateSpeechDuration(sealText(text), policy);
407
+ const resolvedRate = resolveSpeechEstimateRate(policy, language);
394
408
  const view = {
395
409
  format: "hypit.video-cli-measure@1",
396
410
  ...where,
@@ -398,11 +412,13 @@ async function measure(argv: readonly string[], io: CliIo, environment: Creation
398
412
  units,
399
413
  language,
400
414
  policy,
415
+ rate: resolvedRate,
401
416
  seconds,
402
417
  };
403
418
  if (parsed.json) { io.write(`${JSON.stringify(view, null, 2)}\n`); return; }
404
- const delivery = policy.rate === undefined ? `${policy.pace} pace` : `${policy.rate} units/s`;
405
- io.write(`${seconds}s\n\n ${units} pronunciation units · ${language} · ${delivery} · rounding ${policy.rounding}\n`
419
+ const delivery = `${resolvedRate} units/s${policy.pace === undefined ? "" : ` (${policy.pace})`}`;
420
+ io.write(`${Number(seconds.toFixed(3))}s\n\n ${units} pronunciation units · ${language} · ${delivery}\n`
421
+ + ` padding ${policy.paddingSec ?? 0}s · rounding ${policy.rounding}\n`
406
422
  + ` ${"segment" in where ? `${where.segment} in ${where.source}` : `${text.length} characters`}\n`
407
423
  + " Choose the request duration from this estimate, the intended performance, and the selected model's supported values.\n");
408
424
  }
@@ -416,7 +432,7 @@ export function writeCreationHelp(io: CliIo, topic?: CreationCommand): void {
416
432
  "hypit transcribe",
417
433
  "Establish word times with the whisperx-alignment Endpoint of the selected Runtime Profile.",
418
434
  "",
419
- " hypit transcribe <audio|video> --to <transcript.json> [--language en|zh|es] [--runtime <profile>] [--workspace <project>]",
435
+ " hypit transcribe <audio|video> --to <transcript.json> --language en|zh|es [--runtime <profile>] [--workspace <project>]",
420
436
  "",
421
437
  "Extracts 16 kHz mono speech audio with ffmpeg and writes every word with its start and end in",
422
438
  "seconds. One immediate request; no Build, Result or state.",
@@ -28,7 +28,7 @@ export { runCaptureCli, writeCaptureHelp } from "./capture.js";
28
28
  export { listPackages, listSurfaces, runVocabularyCli, visualSchema, writeVocabularyHelp } from "./vocabulary.js";
29
29
  export type { PackageListing, SurfaceListing } from "./vocabulary.js";
30
30
  /** The project's selected Runtime Profile, read the way `hypit` reads it, for tools that run beside the CLI. */
31
- export { findRuntimeProfile } from "@hypit/cli";
31
+ export { findRuntimeProfile } from "@hypit/project-context-node";
32
32
 
33
33
  export function runVideoCli(
34
34
  argv: readonly string[],
@@ -11,9 +11,10 @@ export const videoStudioCompanionPackages = [
11
11
  "@hypit/deck-track-studio",
12
12
  "@hypit/film-studio",
13
13
  "@hypit/media-track-studio",
14
+ "@hypit/performance-studio",
14
15
  "@hypit/ranking-studio",
15
16
  "@hypit/screen-overlay-studio",
16
17
  "@hypit/script-studio",
17
- "@hypit/speech-track-studio",
18
+ "@hypit/sound-studio",
18
19
  "@hypit/typography-track-studio",
19
20
  ] as const;
@@ -30,20 +30,20 @@ formats. The service's flat-background MP4 option is a different output treatmen
30
30
  This excerpt assumes the performance and Script exist. Normalize keeps the transparent picture
31
31
  and prepares the selected embedded audio on the program clock. WhisperX and semantic alignment
32
32
  associate that prepared performance with the Script. Use `opening-semantic.take` in
33
- [Speech Track](../speech-track/README.md); its screen position and stack order are independent
33
+ [Timeline assembly](../timeline-author/README.md); its screen position and stack order are independent
34
34
  of its role as A-roll.
35
35
 
36
36
  For B-roll, normalize `cutout.video` with `audio="none"` when its sound is unwanted, then use
37
37
  `cutout-media.media` in [Media Track](../media-track/README.md). No SemanticTake is needed for
38
38
  that overlay. Existing transparency can enter Normalize directly.
39
39
 
40
- For example, this alternative uses the existing program's SemanticTrack and an authored Selection:
40
+ For example, this alternative uses the existing program's Timeline and an authored Selection:
41
41
 
42
42
  ```svml
43
43
  <import as="media-track" from="@hypit/media-track@1"/>
44
44
  <pipeline:Normalize id="overlay-media" source={cutout.video} clock={clock}
45
45
  video="primary-moving" audio="none" span-authority="video"/>
46
- <media-track:Track id="overlay" semantic={speech.semantic} canvas={canvas}>
46
+ <media-track:Track id="overlay" timeline={speech.timeline} canvas={canvas}>
47
47
  <media-track:Item media={overlay-media.media} during={story.selection.example}
48
48
  frame={overlay-frame} appearance={look.media.overlay}/>
49
49
  </media-track:Track>
@@ -17,6 +17,13 @@ projects the Take's audio to canonical 16 kHz mono `SpeechEvidenceAudio`; Whispe
17
17
  bytes. A deterministic local alignment then combines the returned evidence with the Segment and
18
18
  emits one self-contained `SemanticTake`.
19
19
 
20
+ For Chinese speech, select `zh` (also `hypit transcribe --language zh` for a reference). WhisperX's
21
+ Chinese alignment emits character-sized words, including letters inside some Latin names. The
22
+ evidence adapter preserves those windows; the local alignment maps them onto Script's units, so
23
+ a complete Latin name can consume several evidence words while neighboring Han characters retain
24
+ their own times. Caption gets its displayed wording and Cue breaks from Script, independently of
25
+ the recognizer's punctuation or simplified/traditional spelling.
26
+
20
27
  When the authored Segment has no Tokens, write the same Surface without `language`. Its start and
21
28
  end Anchors map directly to the prepared media's first and final frame. There are no words to align,
22
29
  so this branch requests no evidence audio and no WhisperX capability:
@@ -26,7 +33,7 @@ so this branch requests no evidence audio and no WhisperX capability:
26
33
  segment={story.segment.pause} media={pause-media.media}/>
27
34
  ```
28
35
 
29
- There is no whole-program WhisperX pass. Speech Track only receives already-semantic Takes and later
36
+ There is no whole-program WhisperX pass. Timeline assembly only receives already-semantic Takes and later
30
37
  translates their local frames when assembling the final ProgramSpace and complete semantic map.
31
38
 
32
39
  `@hypit/provider-hypihub` is the default concrete adapter; it uploads the canonical evidence audio
@@ -9,6 +9,8 @@ import type { BlobRef } from "@hypit/protocol";
9
9
  /** Repeatably openable transfer bytes admitted by the selected Workspace. */
10
10
  export type ArtifactAttachment = {
11
11
  readonly artifact: BlobRef;
12
+ /** Stable external address, when the Workspace supplies a file by reference. */
13
+ readonly location?: string;
12
14
  open(): Awaitable<AsyncIterable<Uint8Array>>;
13
15
  };
14
16
 
@@ -4,7 +4,10 @@ Reference Node filesystem implementation of the host-neutral `Workspace` contrac
4
4
 
5
5
  Every `open()` call creates one isolated compilation session. It canonicalizes real paths, confines
6
6
  local SourceUnit and Source Asset reads to the configured root, rejects symlink escapes, locks each
7
- edge to the first bytes observed and returns defensive Resource attachments.
7
+ Source edge to the first bytes observed and returns defensive Resource attachments. File attachments
8
+ also carry their resolved `file:` URI so Result publication can preserve the external reference.
9
+ The Resource's identity and metadata belong to the compilation session; its file remains a live
10
+ dependency rather than becoming a persistent snapshot.
8
11
 
9
12
  A Host may supply an external Source resolver. One explicit non-relative Source locator can then
10
13
  open a SourceUnit in a separate canonical root; that Source's relative imports and assets remain
@@ -1,3 +1,4 @@
1
+ import { pathToFileURL } from "node:url";
1
2
  import { randomUUID } from "node:crypto";
2
3
  import { createReadStream } from "node:fs";
3
4
  import { readFile, realpath, stat } from "node:fs/promises";
@@ -177,6 +178,7 @@ class NodeFilesystemWorkspaceSession implements WorkspaceSession {
177
178
  if (!this.#attachments.has(attachmentKey)) {
178
179
  this.#attachments.set(attachmentKey, {
179
180
  artifact: { ...artifact },
181
+ location: pathToFileURL(canonical).href,
180
182
  open: () => createReadStream(canonical),
181
183
  });
182
184
  }
@@ -189,7 +191,7 @@ class NodeFilesystemWorkspaceSession implements WorkspaceSession {
189
191
  const byResource = left.artifact.resource.localeCompare(right.artifact.resource);
190
192
  return byResource === 0 ? left.artifact.mediaType.localeCompare(right.artifact.mediaType) : byResource;
191
193
  })
192
- .map((item) => ({ artifact: { ...item.artifact }, open: item.open }));
194
+ .map((item) => ({ ...item, artifact: { ...item.artifact } }));
193
195
  }
194
196
  }
195
197
 
@@ -71,6 +71,14 @@ Configuration is deployment state:
71
71
  The Node Provider must configure the same model, device, compute, batch size, service version and
72
72
  WhisperX version. A mismatch fails before transcription results are accepted.
73
73
 
74
+ ## Package preparation
75
+
76
+ Local package preparation includes `src/**/*.py` in uv's package cache inputs. Updating service code
77
+ therefore rebuilds its small wheel instead of reusing one selected only by an unchanged
78
+ `pyproject.toml`. This leaves dependency and speech-model caches intact. See
79
+ [uv's local dependency caching](https://docs.astral.sh/uv/concepts/cache/#dynamic-metadata).
80
+ This governs package installation; an already running service continues using its loaded code.
81
+
74
82
  ## Queue and concurrency
75
83
 
76
84
  The SVML Runtime Scheduler decides how many WhisperX Needs may enter this Provider lane. One service
@@ -80,3 +88,9 @@ second direct request receives `503 BUSY` instead of entering a hidden service q
80
88
 
81
89
  Run multiple service processes on different devices/ports only when the Runtime registers and
82
90
  locks them as distinct Provider instances.
91
+
92
+ The local Provider reconciles this packaged project through `uv sync` before a cold service start.
93
+ A passing version probe alone cannot establish that same-version checkout edits were installed;
94
+ the declared uv source cache keys decide whether the service wheel needs rebuilding. A healthy
95
+ running service remains untouched. To adopt edited service code, stop that selected helper when idle
96
+ and start it again through its Profile; restarting only the Build Worker does not reinstall Python.
@@ -24,3 +24,5 @@ where = ["src"]
24
24
 
25
25
  [tool.uv]
26
26
  package = true
27
+ # Rebuild this small service wheel when its packaged Python implementation changes.
28
+ cache-keys = [{ file = "pyproject.toml" }, { file = "src/**/*.py" }]
@@ -867,6 +867,23 @@ wheels = [
867
867
  { url = "https://files.pythonhosted.org/packages/a8/af/48ac8483240de756d2438c380746e7130d1c6f75802ef22f3c6d49982787/huggingface_hub-0.36.2-py3-none-any.whl", hash = "sha256:48f0c8eac16145dfce371e9d2d7772854a4f591bcb56c9cf548accf531d54270", size = 566395, upload-time = "2026-02-06T09:24:11.133Z" },
868
868
  ]
869
869
 
870
+ [[package]]
871
+ name = "hypit-whisperx-service"
872
+ version = "0.1.0"
873
+ source = { editable = "." }
874
+ dependencies = [
875
+ { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" },
876
+ { name = "numpy", version = "2.4.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.11.*'" },
877
+ { name = "numpy", version = "2.5.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.12'" },
878
+ { name = "whisperx" },
879
+ ]
880
+
881
+ [package.metadata]
882
+ requires-dist = [
883
+ { name = "numpy", specifier = ">=2.1,<3" },
884
+ { name = "whisperx", specifier = "==3.8.6" },
885
+ ]
886
+
870
887
  [[package]]
871
888
  name = "idna"
872
889
  version = "3.18"
@@ -1410,7 +1427,7 @@ wheels = [
1410
1427
 
1411
1428
  [[package]]
1412
1429
  name = "nltk"
1413
- version = "3.10.2"
1430
+ version = "3.10.3"
1414
1431
  source = { registry = "https://pypi.org/simple" }
1415
1432
  dependencies = [
1416
1433
  { name = "click" },
@@ -1419,9 +1436,9 @@ dependencies = [
1419
1436
  { name = "regex" },
1420
1437
  { name = "tqdm" },
1421
1438
  ]
1422
- sdist = { url = "https://files.pythonhosted.org/packages/72/16/24d639531e73cbc6884fb251d116dfe469df9c595e0dcf24668c54d0e8d3/nltk-3.10.2.tar.gz", hash = "sha256:fcfd80fb77931868cea8357573c79838b8abc609942ef9914d1c9f6070d4645c", size = 3101716, upload-time = "2026-08-05T09:56:20.657Z" }
1439
+ sdist = { url = "https://files.pythonhosted.org/packages/e0/e6/fe51d2bb1a3b446f59c5c8165999a9fee208bc346af90a7cbf7657bc0d75/nltk-3.10.3.tar.gz", hash = "sha256:bb9327a461c3811c2fa4900e03840401f2126adfb30c0072827c433bd2444ea4", size = 5137152, upload-time = "2026-08-12T23:46:37.258Z" }
1423
1440
  wheels = [
1424
- { url = "https://files.pythonhosted.org/packages/1f/2b/bf677eb32ca6684b270c0d19ab133c2271e9f3375997e5a8dd2b08e3152d/nltk-3.10.2-py3-none-any.whl", hash = "sha256:2c7ccacb765c5e26b0cb60fb1b57080af522c6924d12a714a243305ba3637412", size = 1725815, upload-time = "2026-08-05T09:56:09.657Z" },
1441
+ { url = "https://files.pythonhosted.org/packages/b6/6d/ebd2af4640b12168fdf0cb74b6118df2f32a2f62ec7e0c06fbfd80706639/nltk-3.10.3-py3-none-any.whl", hash = "sha256:ff9598a8e20518ee0d557745890cc4435b9578489e2dcbc69c4f81fa060caf7c", size = 1798643, upload-time = "2026-08-12T23:44:13.478Z" },
1425
1442
  ]
1426
1443
 
1427
1444
  [[package]]
@@ -2907,23 +2924,6 @@ wheels = [
2907
2924
  { url = "https://files.pythonhosted.org/packages/e2/22/dbf013a12ec759e54a34a119e9e217435b3f71b2dd5c61a7ade0a25dae87/sqlalchemy-2.0.51-py3-none-any.whl", hash = "sha256:bb024d8b621d0be75f4f44ecc7c950450026e76d66dc8f791bb5331d7fed59d5", size = 1944334, upload-time = "2026-06-15T16:09:22.418Z" },
2908
2925
  ]
2909
2926
 
2910
- [[package]]
2911
- name = "hypit-whisperx-service"
2912
- version = "0.1.0"
2913
- source = { editable = "." }
2914
- dependencies = [
2915
- { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" },
2916
- { name = "numpy", version = "2.4.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.11.*'" },
2917
- { name = "numpy", version = "2.5.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.12'" },
2918
- { name = "whisperx" },
2919
- ]
2920
-
2921
- [package.metadata]
2922
- requires-dist = [
2923
- { name = "numpy", specifier = ">=2.1,<3" },
2924
- { name = "whisperx", specifier = "==3.8.6" },
2925
- ]
2926
-
2927
2927
  [[package]]
2928
2928
  name = "sympy"
2929
2929
  version = "1.14.0"