@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
@@ -0,0 +1,35 @@
1
+ import { sealGraphFragment } from "@hypit/elaborator";
2
+ import type { GraphFragment } from "@hypit/elaborator";
3
+ import { compositionTypes } from "@hypit/composition";
4
+ import { timelineTypes } from "@hypit/timeline";
5
+ import { spatialTypes } from "@hypit/spatial";
6
+ import { temporalTypes } from "@hypit/temporal";
7
+ import { sameType } from "@hypit/protocol";
8
+ import type { SurfaceResolvedReference } from "@hypit/markup";
9
+
10
+ /** Author-time closure: bound references become ordinary graph edges at each Use. */
11
+ export type PerformanceStyle = {
12
+ readonly fragment: GraphFragment;
13
+ readonly bindings: Readonly<Record<string, { readonly type: SurfaceResolvedReference["type"]; readonly ref: SurfaceResolvedReference["ref"] }>>;
14
+ };
15
+ export function performanceStyle(fragment: GraphFragment, bindings: PerformanceStyle["bindings"] = {}): PerformanceStyle {
16
+ fragment = sealGraphFragment(fragment);
17
+ const common = { timeline: timelineTypes.track, canvas: spatialTypes.canvas, window: temporalTypes.window };
18
+ for (const [name, type] of Object.entries(common)) {
19
+ const port = fragment.inputs.find(port => port.name === name);
20
+ if (port === undefined || !sameType(port.type, type)) throw new Error(`Performance Style requires ${name} input.`);
21
+ if (bindings[name] !== undefined) throw new Error(`Performance supplies ${name} at each Use.`);
22
+ }
23
+ for (const port of fragment.inputs) {
24
+ if (port.name in common) continue;
25
+ const binding = bindings[port.name];
26
+ if (binding === undefined || !sameType(port.type, binding.type)) throw new Error(`Performance Style binding ${port.name} has the wrong Type.`);
27
+ }
28
+ for (const name of Object.keys(bindings)) {
29
+ if (!fragment.inputs.some(port => port.name === name)) throw new Error(`Performance Style has unknown binding ${name}.`);
30
+ }
31
+ if (fragment.exports.length !== 1 || fragment.exports[0]?.name !== "visual" || !sameType(fragment.exports[0].type, compositionTypes.visualTrack)) {
32
+ throw new Error("Performance Style must export visual: VisualTrack.");
33
+ }
34
+ return { fragment, bindings: Object.fromEntries(Object.entries(bindings).map(([name, value]) => [name, { ref: value.ref, type: value.type }])) };
35
+ }
@@ -0,0 +1,99 @@
1
+ import { assertAttributes, assertEmptyElement, textAttribute, optionalTextAttribute } from "@hypit/markup";
2
+ import type { StructuredSurfaceHandler, SurfaceResolvedReference, SurfaceRecordDraft, SurfaceComponentDraft, StructuredElement } from "@hypit/markup";
3
+ import { canonicalize, sameType } from "@hypit/protocol";
4
+ import type { TypeRef } from "@hypit/protocol";
5
+ import { sealGraphFragment } from "@hypit/elaborator";
6
+ import type { FragmentOperation } from "@hypit/elaborator";
7
+ import { createTemporalWindowProjection, resolveTemporalContext, temporalWindowAttributeNames } from "@hypit/temporal-markup";
8
+ import { temporalTypes } from "@hypit/temporal";
9
+ import { compositionTypes } from "@hypit/composition";
10
+ import { timelineTypes } from "@hypit/timeline";
11
+ import { spatialTypes } from "@hypit/spatial";
12
+ import { svsRecipeType } from "@hypit/svs";
13
+ import type { SvsRecipe } from "@hypit/svs";
14
+ import { decodeMediaFit, decodeMediaSampleSpec, decodeMediaItemSpec, mediaTrackTypes } from "@hypit/media-track";
15
+ import { performanceStyle } from "./style.js";
16
+ import type { PerformanceStyle } from "./style.js";
17
+ import { performanceTypes, performanceProducers, ordinaryInputs } from "./manifest.js";
18
+
19
+ const input = (name: string) => ({ kind: "fragment-input" as const, name });
20
+ const operation = (id: string) => ({ kind: "fragment-operation" as const, operation: id });
21
+ function reference(element: StructuredElement, name: string, type: TypeRef, resolve: (path: string) => SurfaceResolvedReference | undefined): SurfaceResolvedReference {
22
+ const raw = element.attributes[name];
23
+ if (typeof raw !== "object" || raw.kind !== "reference") throw new Error(`${element.name}.${name} must be a reference.`);
24
+ const found = resolve(raw.path);
25
+ if (found === undefined || !sameType(found.type, type)) throw new Error(`${element.name}.${name} has the wrong Type.`);
26
+ return found;
27
+ }
28
+ function authored<T>(value: SurfaceResolvedReference): T {
29
+ if (value.record?.value.kind !== "inline") throw new Error("A presentation Style or Recipe must be an authored inline value.");
30
+ return value.record.value.value as unknown as T;
31
+ }
32
+ export const ordinaryPerformanceFragment = sealGraphFragment({
33
+ inputs: ordinaryInputs,
34
+ operations: [{ id: "ordinary", producer: performanceProducers.ordinary,
35
+ inputs: Object.fromEntries(ordinaryInputs.map(port => [port.name, input(port.name)])), result: { kind: "output", name: "visual" } }],
36
+ exports: [{ name: "visual", type: compositionTypes.visualTrack, root: operation("ordinary") }],
37
+ });
38
+ export const decodePerformanceStyleSurface: StructuredSurfaceHandler = ({ element, resolveReference }) => {
39
+ assertAttributes(element, ["id", "frame", "appearance"]); assertEmptyElement(element);
40
+ const id = textAttribute(element, "id");
41
+ const frame = reference(element, "frame", spatialTypes.frame, resolveReference);
42
+ const recipe = authored<SvsRecipe>(reference(element, "appearance", svsRecipeType, resolveReference));
43
+ if (["playback", "trim-start", "trim-end"].some(key => recipe.properties[key] !== undefined)) throw new Error("Performance uses Timeline source positions; select its presentation interval on Use.");
44
+ const records: SurfaceRecordDraft[] = [];
45
+ const bind = (name: string, type: TypeRef, value: unknown) => {
46
+ const recordId = `${id}.${name}`;
47
+ records.push({ id: recordId, type, value: { kind: "inline", value: canonicalize(value) }, range: element.range });
48
+ return { ref: { kind: "record" as const, id: recordId }, type };
49
+ };
50
+ const style = performanceStyle(ordinaryPerformanceFragment, {
51
+ frame,
52
+ fit: bind("fit", spatialTypes.fit, decodeMediaFit(recipe)),
53
+ sample: bind("sample", mediaTrackTypes.sampleLayerSpec, decodeMediaSampleSpec(recipe, "content", "timed", undefined, true)),
54
+ spec: bind("spec", mediaTrackTypes.itemSpec, decodeMediaItemSpec(recipe, { id, motion: { sustain: [] } })),
55
+ });
56
+ records.push({ id, type: performanceTypes.style, value: { kind: "inline", value: canonicalize(style) }, range: element.range });
57
+ return { records, components: [], fragments: [] };
58
+ };
59
+
60
+ export const decodePerformanceTrackSurface: StructuredSurfaceHandler = ({ element, resolveReference }) => {
61
+ assertAttributes(element, ["id", "timeline", "canvas"]);
62
+ const id = textAttribute(element, "id"), context = resolveTemporalContext({ element, resolveReference });
63
+ const canvas = reference(element, "canvas", spatialTypes.canvas, resolveReference);
64
+ const records: SurfaceRecordDraft[] = [{ id: `${id}.header`, type: performanceTypes.header, value: { kind: "inline", value: { id } }, range: element.range }];
65
+ const components: SurfaceComponentDraft[] = [];
66
+ const fragments = [] as ReturnType<typeof sealGraphFragment>[];
67
+ const collectorInputs = [{ name: "timeline", type: timelineTypes.track }, { name: "header", type: performanceTypes.header }];
68
+ const bindings: Record<string, SurfaceResolvedReference["ref"]> = { timeline: context.timeline.ref, header: { kind: "record", id: `${id}.header` } };
69
+ const operations: FragmentOperation[] = [{ id: "empty", producer: performanceProducers.create, inputs: {}, result: { kind: "output", name: "set" } }];
70
+ let previous = "empty", index = 0;
71
+ for (const child of element.children) {
72
+ if (child.kind === "text") { if (child.value.trim()) throw new Error("Performance Track accepts Use children."); continue; }
73
+ if (child.name.split(":").at(-1) !== "Use") throw new Error("Performance Track accepts Use children.");
74
+ assertAttributes(child, ["id", "style", ...temporalWindowAttributeNames]); assertEmptyElement(child);
75
+ const useId = optionalTextAttribute(child, "id") ?? `${id}.use.${index + 1}`;
76
+ index += 1;
77
+ const hasTime = temporalWindowAttributeNames.some(name => child.attributes[name] !== undefined);
78
+ const temporal = createTemporalWindowProjection({ id: useId, ...context, resolveReference,
79
+ element: hasTime ? child : { ...child, attributes: { ...child.attributes, during: "program" } } });
80
+ records.push(...temporal.records); components.push(...temporal.components); fragments.push(...temporal.fragments);
81
+ const value = authored<PerformanceStyle>(reference(child, "style", performanceTypes.style, resolveReference));
82
+ const style = performanceStyle(value.fragment, value.bindings);
83
+ fragments.push(style.fragment);
84
+ const visualId = `${useId}.visual`;
85
+ components.push({ id: `${useId}.__style`, fragment: style.fragment.id,
86
+ inputs: { ...Object.fromEntries(Object.entries(style.bindings).map(([key, bound]) => [key, bound.ref])),
87
+ timeline: context.timeline.ref, canvas: canvas.ref, window: temporal.ref }, outputs: { visual: visualId }, range: child.range });
88
+ const suffix = `use-${operations.length}`;
89
+ collectorInputs.push({ name: `${suffix}-window`, type: temporalTypes.window }, { name: `${suffix}-visual`, type: compositionTypes.visualTrack });
90
+ bindings[`${suffix}-window`] = temporal.ref; bindings[`${suffix}-visual`] = { kind: "component-output", component: `${useId}.__style`, output: "visual" };
91
+ operations.push({ id: suffix, producer: performanceProducers.append, inputs: { set: operation(previous), window: input(`${suffix}-window`), visual: input(`${suffix}-visual`) }, result: { kind: "output", name: "set" } });
92
+ previous = suffix;
93
+ }
94
+ operations.push({ id: "resolve", producer: performanceProducers.resolve, inputs: { set: operation(previous), timeline: input("timeline"), header: input("header") }, result: { kind: "output", name: "visual" } });
95
+ const collector = sealGraphFragment({ inputs: collectorInputs, operations, exports: [{ name: "visual", type: compositionTypes.visualTrack, root: operation("resolve") }, { name: "program", type: performanceTypes.set, root: operation(previous) }] });
96
+ fragments.push(collector);
97
+ components.push({ id, fragment: collector.id, inputs: bindings, outputs: { visual: `${id}.visual`, program: `${id}.program` }, range: element.range });
98
+ return { records, components, fragments, exports: [`${id}.visual`, `${id}.program`] };
99
+ };
@@ -0,0 +1,25 @@
1
+ # Performance Studio Companion
2
+
3
+ The Companion contributes one Performance Track with a content area and an internal Uses band:
4
+
5
+ - **Performance** shows the Timeline's placed picture Takes, with source thumbnails. These are available contents, independent of which Use presents or hides them. Audio-only Takes have no picture item.
6
+ - **Uses** shows each authored Style application as a named interval in the bottom label band. Declaration order sets overlap order; selecting an item raises it for editing without changing the authored priority. Covered and empty applications remain available.
7
+
8
+ `performance:Track.program` exports the ordered windows and unresolved visuals. The Companion reads that value instead of reconstructing author rules from the final visibility masks. The Timeline supplies the content lane. Typed temporal values identify each Use's exact author element even when its id was omitted.
9
+
10
+ One Performance label spans the content and Uses band; selection targets a picture Take or a Use.
11
+ A Take shows its Segment and placed frame range. A Use shows its resolved range and Style reference.
12
+ These are small read-only facts within When and How, alongside the editable fields in the same domains.
13
+ The displayed range uses an exclusive end frame.
14
+
15
+ Selecting a Use exposes its ordinary Style's referenced Frame and Media appearance Recipe. Frame edits write to SVML; appearance edits write to SVS. A shared Style or Recipe remains shared. Temporal gestures follow the same Selection/Moment/clock projection and source-writeback path as other components.
16
+
17
+ Project Styles receive the same Use interval and title. Their parameters are contributed through `createStudioCompanionHostFacet({ parameters })`, matching
18
+ the Style's own Module and Surface. The Track opts its `style` reference into this declaration.
19
+ Ordinary Style fields live in their own parameter Companion. See the project
20
+ [performance Styles](../../examples/semantic-composition/packages/performance-styles/README.md) for an example.
21
+
22
+ The internal `bands`, field bindings and content chrome are public Studio Companion declarations. Uses are entities in the same Track; independent child Tracks still use `attachments`. Studio does not recognize Performance names or scene-specific layouts. Caption and Sound can describe their own content and applications through the same interface.
23
+
24
+ Use picture selection follows exact rendered Present ids supplied by Performance. Take content uses
25
+ its Segment identity rather than array position, so reordering Takes preserves selection identity.
@@ -0,0 +1,21 @@
1
+ {
2
+ "name": "@hypit/performance-studio",
3
+ "version": "0.0.0-dev",
4
+ "license": "SEE LICENSE IN LICENSE",
5
+ "private": true,
6
+ "type": "module",
7
+ "exports": {
8
+ ".": "./src/index.ts"
9
+ },
10
+ "hypit": {
11
+ "activation": "./src/activation.ts"
12
+ },
13
+ "dependencies": {
14
+ "@hypit/performance": "workspace:*",
15
+ "@hypit/timeline": "workspace:*",
16
+ "@hypit/temporal": "workspace:*",
17
+ "@hypit/composition": "workspace:*",
18
+ "@hypit/studio-adapter": "workspace:*",
19
+ "@hypit/media-track-studio": "workspace:*"
20
+ }
21
+ }
@@ -0,0 +1,6 @@
1
+ import { createStudioCompanionHostFacet } from "@hypit/studio-adapter";
2
+ import { performanceStudioTrackCompanions, performanceStudioParameterCompanions } from "./index.js";
3
+ export default {
4
+ format: "hypit.node-package@1" as const,
5
+ hostFacets: [createStudioCompanionHostFacet({ tracks: performanceStudioTrackCompanions, parameters: performanceStudioParameterCompanions })],
6
+ };
@@ -0,0 +1,84 @@
1
+ import { performanceModuleRef, performancePresentId } from "@hypit/performance";
2
+ import type { PerformanceSet } from "@hypit/performance";
3
+ import { projectTimelineMedia, timelineTypes } from "@hypit/timeline";
4
+ import type { Timeline } from "@hypit/timeline";
5
+ import { temporalTypes } from "@hypit/temporal";
6
+ import { compositionTypes } from "@hypit/composition";
7
+ import { mediaAppearanceStudioFields } from "@hypit/media-track-studio";
8
+ import { artifactPreview, authoredChildFor, previewLayer, requiredReferencedValue, requiredSurfaceValue, temporalLineageFor, temporalSemanticSource } from "@hypit/studio-adapter";
9
+ import type { StudioTrackCompanion, StudioTrackCompanionContext, StudioEntityDraft, StudioSourceBindingDeclaration } from "@hypit/studio-adapter";
10
+
11
+ const frameFields = ["left", "top", "right", "bottom", "x", "y", "width", "height"];
12
+ const frameBindings: readonly StudioSourceBindingDeclaration[] = frameFields.map(name => ({ name, writable: true }));
13
+ // Ordinary Performance uses Timeline playback. The rest is the same Media appearance vocabulary.
14
+ const playbackFields = new Set(["playback", "trim-start", "trim-end"]);
15
+ const appearanceBindings = mediaAppearanceStudioFields.bindings.filter(field => !playbackFields.has(field.name));
16
+ const appearanceInspector = mediaAppearanceStudioFields.inspector.filter(field =>
17
+ !playbackFields.has(field.binding.slice("appearance.".length)));
18
+
19
+ export function projectPerformance(context: StudioTrackCompanionContext): readonly StudioEntityDraft[] {
20
+ const timeline = requiredReferencedValue(context, "timeline", timelineTypes.track) as Timeline;
21
+ const program = requiredSurfaceValue(context, "program") as PerformanceSet;
22
+ // Source content keeps its own placement. A Use changes its presentation, not its media clock.
23
+ const content: StudioEntityDraft[] = projectTimelineMedia(timeline).flatMap((clip, index) => {
24
+ if (clip.media.visual === undefined) return [];
25
+ return [{
26
+ id: `${context.track.outputRef}:content:${clip.segmentId}`,
27
+ authoredId: clip.segmentId,
28
+ display: { title: clip.segmentId, layers: [previewLayer(artifactPreview("video", clip.media.visual.artifact.resource), "storyboard")] },
29
+ ...clip.span, stackOrder: index,
30
+ inspector: [
31
+ { id: "segment", label: "Segment", domain: "how", section: { id: "content", label: "Content" }, value: clip.segmentId },
32
+ { id: "range", label: "Range", domain: "when", section: { id: "placement", label: "Placement" }, value: `${clip.span.startFrame}–${clip.span.endFrameExclusive}`, unit: "f", summary: "Placed interval; the end frame is exclusive." },
33
+ ],
34
+ presentation: { entity: "performance-content", chrome: "standard" },
35
+ }];
36
+ });
37
+ const uses: StudioEntityDraft[] = program.uses.map((use, index) => {
38
+ const authoredId = use.window.subjectId;
39
+ const child = authoredChildFor(context, authoredId, [temporalTypes.windowSpec]);
40
+ if (child === undefined) throw new Error(`Performance Use ${authoredId} has no author provenance.`);
41
+ const style = child.referenceAttributes.style;
42
+ const temporal = temporalLineageFor(context, authoredId, "window");
43
+ const semantic = temporalSemanticSource(temporal);
44
+ return {
45
+ id: `${context.track.outputRef}:use:${authoredId}`, authoredId,
46
+ display: { title: style ?? authoredId, layers: [] },
47
+ ...use.window.span, stackOrder: index,
48
+ elementRange: child.range,
49
+ ...(temporal === undefined ? {} : { temporal }),
50
+ ...(semantic === undefined ? {} : { markerId: semantic.id }),
51
+ presentation: { entity: "performance-use", chrome: "standard" },
52
+ band: "uses",
53
+ renderIds: use.visual.presents.map(present => performancePresentId(authoredId, present.id)),
54
+ inspector: [{ id: "range", label: "Range", domain: "when", section: { id: "placement", label: "Placement" }, value: `${use.window.span.startFrame}–${use.window.span.endFrameExclusive}`, unit: "f", summary: "Resolved Use interval; the end frame is exclusive. Timeline gestures follow this Use's author timing." }],
55
+ };
56
+ });
57
+ return [...content, ...uses];
58
+ }
59
+
60
+ export const performanceStudioTrackCompanions: readonly StudioTrackCompanion[] = [{
61
+ id: "visual", role: "track",
62
+ output: { type: compositionTypes.visualTrack, surface: "track", modules: [performanceModuleRef] },
63
+ family: "performance", label: "Performance", tone: "blue", icon: "video",
64
+ lane: { heightPx: 60 },
65
+ requiredValues: ["program"],
66
+ bands: [{
67
+ id: "uses", placement: "after", heightPx: 15, display: "label",
68
+ bindings: [{ name: "style", companion: true }],
69
+ inspector: [{ binding: "style", label: "Style", domain: "how", section: { id: "style", label: "Style" }, control: "text", summary: "The referenced Style is shared by every Use that selects it." }],
70
+ }],
71
+ project: projectPerformance,
72
+ }];
73
+
74
+ export const performanceStudioParameterCompanions: readonly import("@hypit/studio-adapter").StudioParameterCompanion[] = [{
75
+ id: "style", match: { module: performanceModuleRef, surface: "style" },
76
+ bindings: [ { name: "frame", referenced: frameBindings },
77
+ { name: "appearance", recipe: { bindings: appearanceBindings } } ],
78
+ inspector: [
79
+ ...frameFields.map(name => ({ binding: `frame.${name}`, label: name[0]!.toUpperCase() + name.slice(1),
80
+ domain: "where" as const, page: { id: "frame", label: "Frame" }, section: { id: "placement", label: "Placement" },
81
+ control: "number" as const, number: { suffixes: ["%", "px"], step: 1 } })),
82
+ ...appearanceInspector,
83
+ ],
84
+ }];
@@ -1,20 +1,11 @@
1
1
  # `@hypit/program-space`
2
2
 
3
- The time and frame domain shared by a compiled film. ProgramSpace contains `id`, `durationSec` and
4
- `frameRate`. Script identity belongs to semantic data; the physical film clock also serves animation
5
- with no speech or source media.
6
-
7
- For spoken work, SemanticTrack projects the selected performance's real duration and frame rate.
8
- For authored animation, `Space` declares them directly:
9
-
10
- ```svml
11
- <import as="time" from="@hypit/program-space@1"/>
12
- <time:Space id="animation" frame-rate="30" duration="8s"/>
13
- ```
14
-
15
- `duration` accepts seconds, milliseconds or frames (`8s`, `8000ms`, `240f`); the result must end on an
16
- exact frame boundary. The rate may be rational, such as `30000/1001`. `Space` publishes an ordinary
17
- inline ProgramSpace value and performs no media generation.
18
-
19
- `Clock` is the duration-free frame-rate input for media normalization. A clock does not prescribe
20
- how long a performance will be; its actual normalized material establishes that later.
3
+ `ProgramClock` supplies a positive rational frame rate before material exists. The `Clock` Surface
4
+ publishes it for normalization and Timeline assembly; the same Clock Surface is available from
5
+ `@hypit/timeline-author`.
6
+
7
+ `ProgramSpace` is the lightweight physical range consumed by rendering: `id`, `durationSec` and
8
+ `frameRate`. Its positive duration ends on an exact frame boundary. The Timeline projects this
9
+ view, whether it contains speaking Takes, wordless media, gaps or no Takes at all. Authors declare
10
+ that complete work through [Timeline](../timeline-author/README.md), then components obtain the
11
+ range and any semantic evidence they need. The range itself carries no media or word table.
@@ -1,6 +1,6 @@
1
1
  import { createMarkupSurfaceHostFacet } from "@hypit/markup";
2
2
 
3
- import { decodeClockSurface, decodeSpaceSurface } from "./surface.js";
3
+ import { decodeClockSurface } from "./surface.js";
4
4
  import { programSpaceManifest, programSpaceMarkupSurfaces, programSpaceModuleRef } from "./index.js";
5
5
 
6
6
  export const hypitPackage = {
@@ -10,10 +10,6 @@ export const hypitPackage = {
10
10
  module: programSpaceModuleRef,
11
11
  declaration: programSpaceMarkupSurfaces.find((item) => item.name === "clock")!,
12
12
  handler: decodeClockSurface,
13
- }), createMarkupSurfaceHostFacet({
14
- module: programSpaceModuleRef,
15
- declaration: programSpaceMarkupSurfaces.find((item) => item.name === "space")!,
16
- handler: decodeSpaceSurface,
17
13
  })],
18
14
  };
19
15
  export default hypitPackage;
@@ -40,17 +40,6 @@ export const programSpaceManifest: ModuleManifest = {
40
40
  export const programSpaceDependency = { module: programSpaceModuleRef } as const;
41
41
  export const programSpaceMarkupSurfaces = [
42
42
  { name: "clock", tag: "Clock", mode: "structured", outputs: [programSpaceTypes.clock] },
43
- { name: "space", tag: "Space", mode: "structured", outputs: [programSpaceTypes.programSpace],
44
- vocabulary: {
45
- summary: "Declares a film's frame rate and authored duration, for animation whose timing is directed without a performance.",
46
- attributes: [
47
- { name: "id", kind: "identifier", required: true, summary: "Names the shared film time axis." },
48
- { name: "frame-rate", kind: "literal", required: true, summary: "Frames per second, such as 30 or 30000/1001." },
49
- { name: "duration", kind: "literal", required: true, summary: "Total duration in seconds, milliseconds or frames, such as 8s or 240f; ends on a frame boundary." },
50
- ],
51
- example: '<time:Space id="animation" frame-rate="30" duration="8s"/>',
52
- },
53
- },
54
43
  ] as const;
55
44
 
56
45
  export function sealProgramClock(value: ProgramClock): ProgramClock {
@@ -105,3 +94,5 @@ export function assertProgramSpaceIdentity(programSpace: ProgramSpace): void {
105
94
  }
106
95
  programSpaceFrameCount(programSpace);
107
96
  }
97
+
98
+ export { decodeClockSurface } from "./surface.js";
@@ -5,7 +5,7 @@ import {
5
5
  type StructuredSurfaceHandler,
6
6
  } from "@hypit/markup";
7
7
 
8
- import { assertProgramSpaceIdentity, programSpaceTypes, sealProgramClock, type ProgramClock } from "./index.js";
8
+ import { programSpaceTypes, sealProgramClock, type ProgramClock } from "./index.js";
9
9
 
10
10
  function frameRate(element: StructuredElement): ProgramClock["frameRate"] {
11
11
  const value = text(element, "frame-rate");
@@ -34,22 +34,3 @@ export const decodeClockSurface: StructuredSurfaceHandler = ({ element }) => {
34
34
  fragments: [],
35
35
  };
36
36
  };
37
-
38
- export const decodeSpaceSurface: StructuredSurfaceHandler = ({ element }) => {
39
- const expected = ["duration", "frame-rate", "id"];
40
- if (Object.keys(element.attributes).sort().join("\0") !== expected.join("\0")) {
41
- throw new Error(`${element.name} requires exactly id, frame-rate and duration.`);
42
- }
43
- empty(element);
44
- const id = text(element, "id");
45
- const rate = frameRate(element);
46
- const duration = text(element, "duration");
47
- const match = /^(\d+(?:\.\d+)?)(s|ms|f)$/u.exec(duration);
48
- if (match === null) throw new Error(`${element.name}.duration must be a duration such as 8s, 8000ms or 240f.`);
49
- const value = Number(match[1]);
50
- const durationSec = match[2] === "f" ? value * rate.denominator / rate.numerator
51
- : match[2] === "ms" ? value / 1000 : value;
52
- const space = { id, durationSec, frameRate: rate };
53
- assertProgramSpaceIdentity(space);
54
- return { records: [{ id, type: programSpaceTypes.programSpace, value: { kind: "inline", value: space }, range: element.range }], components: [], fragments: [] };
55
- };
@@ -0,0 +1,20 @@
1
+ # `@hypit/project-context-node`
2
+
3
+ Shared project and Runtime selection for Node entrypoints: CLI, Studio and creation tools.
4
+ This package resolves locations and reads or explicitly changes the project's Runtime pointer.
5
+ It does not load Providers, install programs, inspect credentials or select services.
6
+
7
+ 1. `resolveProjectRoot({ workspaceRoot?, cwd? })` uses the explicit Workspace, otherwise the nearest
8
+ `package.json` above cwd, otherwise cwd itself. Source and Run filenames do not choose the project.
9
+ 2. `findRuntimeProfile(projectRoot)` reads only that project's `.hypit/runtime` file and resolves its
10
+ path relative to the project. An entrypoint's explicit `--runtime` overrides this read for that invocation.
11
+ 3. The selected Runtime implementation interprets the Profile, including `dataRoot`, Credentials,
12
+ Providers and capability bindings. This package does not interpret its contents.
13
+
14
+ `selectRuntimeProfile(projectRoot, profile)` writes the explicit choice; `clearRuntimeProfile` removes
15
+ only that pointer. A directory occupying the pointer path is reported without replacing it. Runtime
16
+ working data belongs at the Profile's separate `dataRoot`.
17
+
18
+ Project packages, the installed Distribution and machine-managed executables have different owners.
19
+ The Distribution supplies code; it does not supply a second project environment. Provider adapters
20
+ resolve their executable configuration and report availability through the Runtime's existing ports.
@@ -0,0 +1,10 @@
1
+ {
2
+ "name": "@hypit/project-context-node",
3
+ "version": "0.0.0-dev",
4
+ "license": "SEE LICENSE IN LICENSE",
5
+ "private": true,
6
+ "type": "module",
7
+ "exports": {
8
+ ".": "./src/index.ts"
9
+ }
10
+ }
@@ -0,0 +1,3 @@
1
+ export { resolveProjectRoot, resolvePackageRoot } from "./project-context.js";
2
+ export { findRuntimeProfile, selectRuntimeProfile, clearRuntimeProfile } from "./runtime-selection.js";
3
+ export type { RuntimeProfileSelection } from "./runtime-selection.js";
@@ -1,4 +1,4 @@
1
- import { mkdir, readFile, realpath, unlink, writeFile } from "node:fs/promises";
1
+ import { mkdir, readFile, realpath, stat, unlink, writeFile } from "node:fs/promises";
2
2
  import { relative, resolve } from "node:path";
3
3
 
4
4
  const stateDirectoryName = ".hypit";
@@ -24,6 +24,10 @@ async function readSelectionFile(projectRoot: string): Promise<{
24
24
  const root = resolve(projectRoot);
25
25
  const selectionFile = resolve(root, stateDirectoryName, selectionFileName);
26
26
  try {
27
+ if (!(await stat(selectionFile)).isFile()) {
28
+ throw new Error(`Runtime selection must be a file: ${selectionFile}; this path is occupied by a directory. `
29
+ + "Move that directory and update its configuration before running hypit runtime use <profile>.");
30
+ }
27
31
  return {
28
32
  projectRoot: root,
29
33
  selectionFile,
@@ -36,7 +40,7 @@ async function readSelectionFile(projectRoot: string): Promise<{
36
40
  }
37
41
 
38
42
  /**
39
- * Remember one Runtime Profile for a project. This is local CLI context, not
43
+ * Remember one Runtime Profile for a project. This is project execution context, not
40
44
  * Author Source, Run Source, package selection or Core state.
41
45
  */
42
46
  export async function selectRuntimeProfile(projectRoot: string, profile: string): Promise<RuntimeProfileSelection> {
@@ -50,6 +54,7 @@ export async function selectRuntimeProfile(projectRoot: string, profile: string)
50
54
  } catch (error) {
51
55
  if (errorCode(error) !== "EEXIST") throw error;
52
56
  }
57
+ await readSelectionFile(root);
53
58
  const stored = relative(root, selectedProfile) || ".";
54
59
  await writeFile(selectionFile, `${stored}\n`, "utf8");
55
60
  return { profile: selectedProfile, projectRoot: root, selectionFile };
@@ -9,24 +9,32 @@ content identity or hidden output metadata.
9
9
 
10
10
  Normalized transparent videos displayed by Media or project components use the ordinary video path.
11
11
  The engine decodes them to PNG frames with alpha, then Chrome blends them with lower layers and
12
- the authored Canvas background. PNG is the intermediate capture format; it does not ask to erase
13
- the Film's background. The returned MP4 contains the completed composition.
12
+ the authored Canvas background. Final frames use fast PNG encoding after Chrome has composited
13
+ the image onto an opaque canvas (black beneath the authored background). This trades intermediate
14
+ compression effort for speed without JPEG frame compression. Source alpha, CSS filters, canvas and
15
+ WebGL remain part of the browser composition. The returned MP4 contains the completed composition.
14
16
 
15
17
  Runtime configuration separates work size from shared capacity:
16
18
 
17
19
  - `defaultConcurrency` limits whole render requests admitted by the Endpoint's Runtime capacity resource.
18
20
  - Optional `browserCapacity` limits Chrome slots shared by all render Needs in the same `pool`.
19
- Each Need reserves its actual worker count atomically with the whole-request slot. A request larger
20
- than this budget reports a configuration error; it does not silently reduce the requested workers.
21
+ Each Need reserves its fixed count or automatic ceiling atomically with the whole-request slot.
22
+ An explicit count larger than this budget reports a configuration error. Auto fits its ceiling
23
+ to the shared budget before admission.
21
24
  Both reservations last for the whole Need, including preparation and final encoding. Closing one
22
25
  Chrome early does not release part of that reservation. Without `browserCapacity`, admission uses
23
26
  the whole-request limit alone.
24
27
  - `workers` controls independent Chrome processes inside one admitted render. Explicit counts are
25
- honored, capped only by selected frame count. `auto` uses half the available CPU parallelism,
26
- bounded to 1–4 workers.
28
+ honored, capped only by selected frame count. `auto` starts below its ceiling, then compares useful
29
+ capture batches before adding another browser. Insufficient benefit or falling throughput retires
30
+ surplus browsers between batches. Completed frames are retained; there is no calibration render.
31
+ - Optional `maxWorkers` sets the automatic ceiling. Without it, the Provider leaves two CPU slots
32
+ and half the machine/container memory for other work, budgeting about 1.5 GiB per Chrome process.
33
+ Auto also caps the reservation to the number of roughly one-second batches in the selected range.
27
34
 
28
35
  The Runtime Profile configures these controls through the Provider because they are deployment policy.
29
- `auto` is resolved when the Provider is activated, so admission and execution use the same count. It never
36
+ The automatic ceiling is fixed at activation, and range sizing is identical in admission and execution.
37
+ Actual concurrency adapts inside that reservation; it is not a machine-wide history or performance database. It never
30
38
  renders program audio; `@hypit/provider-media-local` separately prepares `TimelineAudio` and muxes
31
39
  the final media.
32
40
 
@@ -48,11 +56,16 @@ For a Runtime Profile, place `pool` on the Endpoint entry and these Provider set
48
56
  This configuration admits one 4-worker request at a time under its 6-browser budget even though
49
57
  the whole-request limit is 2. Two 4-worker requests would need 8 browser slots. Choose budgets from
50
58
  the actual machine and shared workloads; the example is not an automatic tuning recommendation.
51
- Reload the Runtime Worker after changing its Profile and restart Studio if it uses that Profile.
59
+ New Builds use the edited Provider configuration; active Builds retain their selected configuration.
60
+ Restart Studio if its existing session needs to load the edited Profile.
52
61
 
53
62
  `browserGpu` picks Chrome's rasterizer and defaults to `hardware`. Set `software` without a usable
54
63
  GPU, or `auto` to let the engine decide. Capture uses screenshots and independent browser processes;
55
- the CLI's automatic worker and drawElement policies do not override the count.
64
+ the CLI's automatic worker and drawElement policies do not override the count. The opaque screenshot
65
+ adapter uses the engine's public session, video injector and page seek protocol plus Chrome CDP.
66
+ It waits for seek completion, dynamic images/fonts and the page compositor before capturing PNGs.
67
+ The pinned engine couples its PNG session setup to transparent export, so this adapter initializes
68
+ an opaque session and chooses PNG separately at capture. It does not patch engine methods or files.
56
69
 
57
70
  The Runtime Adapter also declares one managed browser program. `programs up` invokes the pinned
58
71
  HyperFrames CLI's `browser ensure`; its probe resolves and starts that browser and checks
@@ -71,8 +84,12 @@ const visual = await renderHyperframesVisual(
71
84
 
72
85
  Omit `range` for the complete document. Ranges are zero-based and half-open on the original
73
86
  programme clock. At 30 fps, `[240, 360)` returns 120 frames covering seconds 8–12.
74
- `onProgress` reports preparation, worker ranges, browser PIDs, completion and elapsed time to direct
75
- executor callers. The Runtime Provider does not currently forward these events as Build progress.
87
+ `onProgress` reports resource staging, source decoding, the requested range, per-worker frame counts, browser PIDs,
88
+ encoding, storage and elapsed time to direct executor callers. The Provider reduces parallel worker
89
+ events to a single phase and aggregate count through `context.reportProgress`. CLI status and follow
90
+ display that activity without `--verbose`. Counter writes are coalesced to about once per second;
91
+ phase changes and completed counts are reported promptly. Local activity belongs to the running
92
+ Command, not a remote Operation or a repeatedly rewritten Result manifest.
76
93
  `processTimeoutMs` defaults to 30 minutes and starts one deadline before resource preparation. It
77
94
  covers resource reads, Surface validation, rendering and output storage. `signal` can end the same
78
95
  execution earlier. ResourceStore I/O and Surface probes receive the cancellation signal; a custom
@@ -95,10 +112,13 @@ cleanup. A completed worker closes its Chrome immediately.
95
112
  One call stages the HTML and every declared asset once. Typed Surface validation includes a complete
96
113
  decoded-frame count, even for a short render interval. The renderer then finds source-frame windows
97
114
  needed by that interval, merges overlapping windows, and extracts them one source/window at a time.
98
- Decoded PNGs are shared by all workers in this call. Each worker initializes its own page and captures
99
- its assigned frames at their original absolute times. Output numbering starts at zero; final H.264
100
- encoding runs once after all workers finish. More workers parallelize capture, while staging,
101
- validation, source extraction and final encoding still contribute their own cost.
115
+ Decoded PNGs are shared by all workers in this call. Each worker initializes its own page, then takes
116
+ short contiguous frame batches from the render's in-memory queue. A free worker can continue with
117
+ another batch instead of waiting for a worker assigned a more expensive passage. Batches span at
118
+ most about one second and preserve the original absolute frame times. Output numbering starts at
119
+ zero; final H.264 encoding runs once after all workers finish. This division is internal to one
120
+ render call; it does not create or resume Builds. Extra workers help only while aggregate throughput
121
+ improves. Staging, validation, source extraction and final encoding still contribute their own cost.
102
122
 
103
123
  Each call has its own temporary directory, local server port and Chrome processes. Separate renders
104
124
  do not share staged files or decoded PNGs. Exact compiler sampling markers retain loops, holds and
@@ -127,3 +147,11 @@ Direct `renderHyperframesVisual()` calls do not enter Runtime's shared admission
127
147
 
128
148
  The current package executes trusted official code in a local process. It is not a sandbox for
129
149
  untrusted documents or community renderer implementations.
150
+
151
+ Provider calls forward renderer diagnostics through `context.reportDiagnostic`. The initial record
152
+ states the frame count, worker policy/ceiling, capture path, quality, GPU mode and selected encoder.
153
+ Phase timings, concurrency changes and per-worker seek/preparation/PNG totals are recorded once
154
+ per phase, decision or finished worker. Disposable capture-process
155
+ stdout/stderr are streamed as diagnostics and drained before the call returns; existing output limits
156
+ still apply. Phase changes cover preparation, decoding, browser startup, capture, encoding and storage.
157
+ `hypit logs <build-id>` retains those records after temporary rendering files have been removed.
@@ -21,7 +21,7 @@ const localHyperframesRuntimeAdapter = createRuntimeEndpointAdapterFacet({
21
21
  if (context.pool === undefined) throw new Error("local HyperFrames Provider Pool is required");
22
22
  const config = runtimeConfigObject(context.config, "local HyperFrames");
23
23
  runtimeConfigExact(config, [
24
- "nodePath", "hyperframesCliPath", "ffprobePath", "ffmpegPath", "workers", "quality", "browserGpu",
24
+ "nodePath", "hyperframesCliPath", "ffprobePath", "ffmpegPath", "workers", "maxWorkers", "quality", "browserGpu",
25
25
  "defaultConcurrency", "browserCapacity", "initializationTimeoutMs", "frameTimeoutMs", "processTimeoutMs", "maxProcessOutputBytes", "maxRenderedBytes",
26
26
  ], "local HyperFrames");
27
27
  runtimeConfigString(config.nodePath, "HyperFrames nodePath");
@@ -43,11 +43,12 @@ const localHyperframesRuntimeAdapter = createRuntimeEndpointAdapterFacet({
43
43
  const configuredCli = runtimeConfigString(config.hyperframesCliPath, "HyperFrames hyperframesCliPath");
44
44
  const configuredFfprobe = runtimeConfigString(config.ffprobePath, "HyperFrames ffprobePath");
45
45
  const nodePath = resolveRuntimeExecutable(context.dataRoot, configuredNode ?? process.execPath);
46
- const hyperframesCliPath = resolveRuntimeExecutable(context.dataRoot, configuredCli ?? defaultHyperframesCliPath());
46
+ const hyperframesCliPath = () => resolveRuntimeExecutable(context.dataRoot, configuredCli ?? defaultHyperframesCliPath());
47
47
  const configuredFfmpeg = runtimeConfigString(config.ffmpegPath, "HyperFrames ffmpegPath");
48
48
  const ffmpegPath = resolveRuntimeExecutable(context.dataRoot, configuredFfmpeg ?? "ffmpeg");
49
49
  const ffprobePath = resolveRuntimeExecutable(context.dataRoot, configuredFfprobe ?? "ffprobe");
50
50
  const defaultConcurrency = runtimeConfigPositiveInteger(config.defaultConcurrency, "HyperFrames defaultConcurrency");
51
+ const maxWorkers = runtimeConfigPositiveInteger(config.maxWorkers, "HyperFrames maxWorkers");
51
52
  const browserCapacity = runtimeConfigPositiveInteger(config.browserCapacity, "HyperFrames browserCapacity");
52
53
  const initializationTimeoutMs = runtimeConfigPositiveInteger(config.initializationTimeoutMs, "HyperFrames initializationTimeoutMs");
53
54
  const frameTimeoutMs = runtimeConfigPositiveInteger(config.frameTimeoutMs, "HyperFrames frameTimeoutMs");
@@ -59,10 +60,10 @@ const localHyperframesRuntimeAdapter = createRuntimeEndpointAdapterFacet({
59
60
  instance: context.instance,
60
61
  pool: context.pool,
61
62
  nodePath,
62
- hyperframesCliPath,
63
63
  ffprobePath,
64
64
  ffmpegPath,
65
65
  ...(workers === undefined ? {} : { workers: workers as HyperframesWorkers }),
66
+ ...(maxWorkers === undefined ? {} : { maxWorkers }),
66
67
  ...(quality === undefined ? {} : { quality: quality as HyperframesQuality }),
67
68
  ...(browserGpu === undefined ? {} : { browserGpu: browserGpu as HyperframesBrowserGpu }),
68
69
  ...(defaultConcurrency === undefined ? {} : { defaultConcurrency }),