@hypit/hypit 0.1.4 → 0.1.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (462) hide show
  1. package/README.md +4 -2
  2. package/dist/public/caption.d.ts +206 -183
  3. package/dist/public/composition.d.ts +25 -3
  4. package/dist/public/endpoint-kit.d.ts +24 -2
  5. package/dist/public/generation.d.ts +5 -1
  6. package/dist/public/hyperframes.d.ts +19 -1
  7. package/dist/public/narrative.d.ts +17 -3
  8. package/dist/public/performance.d.ts +1590 -0
  9. package/dist/public/program-space.d.ts +179 -32
  10. package/dist/public/runtime-kit.d.ts +21 -8
  11. package/dist/public/sound.d.ts +822 -0
  12. package/dist/public/speech.d.ts +41 -0
  13. package/dist/public/studio-adapter.d.ts +77 -15
  14. package/dist/public/temporal-markup.d.ts +9 -44
  15. package/dist/public/temporal.d.ts +37 -28
  16. package/dist/public/{semantic-track.d.ts → timeline.d.ts} +62 -49
  17. package/examples/README.md +18 -10
  18. package/examples/minimal-author-package/packages/example-component/preview/preview.svml +19 -12
  19. package/examples/minimal-author-package/packages/example-component/src/component.ts +5 -5
  20. package/examples/minimal-author-package/packages/example-component/src/fragment.ts +3 -5
  21. package/examples/minimal-author-package/packages/example-component/src/manifest.ts +8 -10
  22. package/examples/minimal-author-package/packages/example-component/src/surface.ts +2 -2
  23. package/examples/provider-package/README.md +78 -0
  24. package/examples/provider-package/hypit.runtime.json +12 -0
  25. package/examples/provider-package/packages/provider-images/package.json +11 -0
  26. package/examples/provider-package/packages/provider-images/src/activation.ts +24 -0
  27. package/examples/provider-package/packages/provider-images/src/provider.ts +122 -0
  28. package/examples/provider-package/packages/provider-images/tsconfig.json +9 -0
  29. package/examples/semantic-composition/README.md +8 -1
  30. package/examples/semantic-composition/chat.svml +6 -5
  31. package/examples/semantic-composition/hypit.runtime.json +1 -1
  32. package/examples/semantic-composition/packages/chat-scene/README.md +3 -3
  33. package/examples/semantic-composition/packages/chat-scene/src/activation.ts +18 -21
  34. package/examples/semantic-composition/packages/chat-scene/src/render.ts +4 -4
  35. package/examples/semantic-composition/packages/performance-styles/README.md +42 -0
  36. package/examples/semantic-composition/packages/performance-styles/package.json +25 -0
  37. package/examples/semantic-composition/packages/performance-styles/src/activation.ts +57 -0
  38. package/examples/semantic-composition/packages/performance-styles/src/render.ts +54 -0
  39. package/examples/semantic-composition/packages/performance-styles/src/studio.ts +28 -0
  40. package/examples/semantic-composition/packages/performance-styles/tsconfig.json +18 -0
  41. package/examples/semantic-composition/packages/responsive-explainer/README.md +16 -9
  42. package/examples/semantic-composition/packages/responsive-explainer/src/activation.ts +12 -12
  43. package/examples/semantic-composition/packages/responsive-explainer/src/render.ts +5 -5
  44. package/examples/semantic-composition/packages/sound-styles/README.md +36 -0
  45. package/examples/semantic-composition/packages/sound-styles/package.json +25 -0
  46. package/examples/semantic-composition/packages/sound-styles/src/activation.ts +53 -0
  47. package/examples/semantic-composition/packages/sound-styles/src/render.ts +14 -0
  48. package/examples/semantic-composition/packages/sound-styles/tsconfig.json +18 -0
  49. package/package.json +35 -15
  50. package/packages/audio-track/README.md +20 -13
  51. package/packages/audio-track/package.json +1 -1
  52. package/packages/audio-track/src/component.ts +4 -4
  53. package/packages/audio-track/src/fragment.ts +6 -5
  54. package/packages/audio-track/src/index.ts +1 -1
  55. package/packages/audio-track/src/manifest.ts +17 -16
  56. package/packages/audio-track/src/program.ts +21 -25
  57. package/packages/audio-track/src/surface.ts +19 -18
  58. package/packages/audio-track-studio/README.md +23 -0
  59. package/packages/audio-track-studio/src/index.ts +28 -17
  60. package/packages/author-kit/README.md +1 -1
  61. package/packages/background-removal/README.md +4 -7
  62. package/packages/browser-capture/package.json +1 -1
  63. package/packages/build-result/README.md +11 -0
  64. package/packages/build-result/src/decode.ts +2 -0
  65. package/packages/build-result/src/execution-log.ts +17 -0
  66. package/packages/build-result/src/index.ts +1 -0
  67. package/packages/build-result/src/store.ts +14 -1
  68. package/packages/build-result/src/types.ts +3 -0
  69. package/packages/build-result-s3/src/repository.ts +4 -0
  70. package/packages/caption/README.md +61 -73
  71. package/packages/caption/package.json +3 -2
  72. package/packages/caption/src/activation.ts +2 -2
  73. package/packages/caption/src/component.ts +20 -5
  74. package/packages/caption/src/display.ts +3 -18
  75. package/packages/caption/src/fragment.ts +3 -7
  76. package/packages/caption/src/index.ts +6 -5
  77. package/packages/caption/src/manifest.ts +29 -46
  78. package/packages/caption/src/style.ts +24 -135
  79. package/packages/caption/src/surface.ts +12 -92
  80. package/packages/caption/src/temporalize.ts +18 -53
  81. package/packages/caption/src/types.ts +8 -35
  82. package/packages/caption/src/visibility.ts +23 -0
  83. package/packages/caption-fine/README.md +21 -9
  84. package/packages/caption-fine/package.json +4 -2
  85. package/packages/caption-fine/src/component.ts +3 -3
  86. package/packages/caption-fine/src/fragment.ts +7 -19
  87. package/packages/caption-fine/src/index.ts +2 -0
  88. package/packages/caption-fine/src/manifest.ts +26 -17
  89. package/packages/caption-fine/src/recipe.ts +7 -0
  90. package/packages/caption-fine/src/render.ts +14 -13
  91. package/packages/caption-fine/src/schedule.ts +39 -35
  92. package/packages/caption-fine/src/style.ts +10 -9
  93. package/packages/caption-fine/src/surface.ts +62 -35
  94. package/packages/caption-fine/src/types.ts +2 -0
  95. package/packages/caption-fine-studio/README.md +24 -2
  96. package/packages/caption-fine-studio/package.json +3 -1
  97. package/packages/caption-fine-studio/src/activation.ts +3 -3
  98. package/packages/caption-fine-studio/src/index.ts +54 -42
  99. package/packages/cli/README.md +57 -4
  100. package/packages/cli/package.json +1 -0
  101. package/packages/cli/src/arguments.ts +25 -6
  102. package/packages/cli/src/build-planning.ts +3 -2
  103. package/packages/cli/src/command.ts +6 -0
  104. package/packages/cli/src/commands/environment.ts +28 -18
  105. package/packages/cli/src/commands/execution.ts +81 -26
  106. package/packages/cli/src/commands/results.ts +7 -11
  107. package/packages/cli/src/index.ts +2 -2
  108. package/packages/cli/src/machine-view.ts +3 -2
  109. package/packages/cli/src/main.ts +34 -42
  110. package/packages/cli/src/observation.ts +7 -1
  111. package/packages/cli/src/output.ts +65 -23
  112. package/packages/cli/src/view.ts +66 -19
  113. package/packages/comment-sticker/README.md +3 -3
  114. package/packages/comment-sticker/package.json +1 -1
  115. package/packages/comment-sticker/src/component.ts +4 -4
  116. package/packages/comment-sticker/src/fragment.ts +5 -4
  117. package/packages/comment-sticker/src/manifest.ts +7 -6
  118. package/packages/comment-sticker/src/program.ts +9 -9
  119. package/packages/comment-sticker/src/surface.ts +6 -7
  120. package/packages/composition/README.md +21 -0
  121. package/packages/composition/src/audio-presentation.ts +44 -0
  122. package/packages/composition/src/index.ts +3 -0
  123. package/packages/composition/src/schema.ts +8 -3
  124. package/packages/composition/src/track.ts +15 -1
  125. package/packages/credential-store-env/README.md +1 -1
  126. package/packages/deck-track/README.md +3 -3
  127. package/packages/deck-track/package.json +1 -1
  128. package/packages/deck-track/src/component.ts +5 -5
  129. package/packages/deck-track/src/fragment.ts +6 -5
  130. package/packages/deck-track/src/lower.ts +12 -12
  131. package/packages/deck-track/src/manifest.ts +8 -7
  132. package/packages/deck-track/src/program.ts +13 -16
  133. package/packages/deck-track/src/surface.ts +9 -10
  134. package/packages/driver-node/src/driver.ts +41 -3
  135. package/packages/elevenlabs-speech/README.md +27 -0
  136. package/packages/{provider-xiaomi-mimo → elevenlabs-speech}/package.json +5 -8
  137. package/packages/elevenlabs-speech/src/activation.ts +26 -0
  138. package/packages/elevenlabs-speech/src/fragment.ts +11 -0
  139. package/packages/elevenlabs-speech/src/index.ts +111 -0
  140. package/packages/elevenlabs-speech/src/surface.ts +167 -0
  141. package/packages/endpoint-kit/README.md +24 -0
  142. package/packages/endpoint-kit/src/index.ts +7 -1
  143. package/packages/film/README.md +12 -7
  144. package/packages/film/package.json +1 -1
  145. package/packages/film/src/component.ts +4 -4
  146. package/packages/film/src/fragment.ts +6 -5
  147. package/packages/film/src/manifest.ts +11 -10
  148. package/packages/film/src/program.ts +5 -5
  149. package/packages/film/src/recipe.ts +2 -1
  150. package/packages/film/src/surface.ts +10 -7
  151. package/packages/film-studio/package.json +1 -1
  152. package/packages/film-studio/src/index.ts +2 -2
  153. package/packages/fishaudio-speech/README.md +33 -0
  154. package/packages/fishaudio-speech/package.json +21 -0
  155. package/packages/fishaudio-speech/src/activation.ts +32 -0
  156. package/packages/fishaudio-speech/src/fragment.ts +11 -0
  157. package/packages/fishaudio-speech/src/index.ts +156 -0
  158. package/packages/fishaudio-speech/src/surface.ts +192 -0
  159. package/packages/generation/README.md +11 -1
  160. package/packages/generation/src/mapping.ts +28 -30
  161. package/packages/gpt-image/README.md +1 -2
  162. package/packages/grok-imagine/README.md +1 -2
  163. package/packages/hyperframes/README.md +7 -3
  164. package/packages/hyperframes/src/browser-program.ts +11 -2
  165. package/packages/hyperframes/src/document.ts +15 -2
  166. package/packages/interview-emoji-reveal/README.md +4 -4
  167. package/packages/interview-emoji-reveal/package.json +1 -1
  168. package/packages/interview-emoji-reveal/src/component.ts +4 -4
  169. package/packages/interview-emoji-reveal/src/fragment.ts +6 -5
  170. package/packages/interview-emoji-reveal/src/manifest.ts +9 -8
  171. package/packages/interview-emoji-reveal/src/program.ts +14 -14
  172. package/packages/interview-emoji-reveal/src/surface.ts +8 -9
  173. package/packages/media-execution/README.md +7 -3
  174. package/packages/media-execution/src/audio-presentation.ts +23 -0
  175. package/packages/media-execution/src/execute.ts +2 -0
  176. package/packages/media-pipeline/README.md +7 -3
  177. package/packages/media-pipeline/src/audio-plan.ts +4 -1
  178. package/packages/media-pipeline/src/component.ts +16 -2
  179. package/packages/media-pipeline/src/manifest.ts +3 -1
  180. package/packages/media-pipeline/src/types.ts +2 -1
  181. package/packages/media-track/README.md +14 -47
  182. package/packages/media-track/package.json +1 -1
  183. package/packages/media-track/preview/preview.svml +5 -5
  184. package/packages/media-track/src/author.ts +12 -6
  185. package/packages/media-track/src/component.ts +10 -16
  186. package/packages/media-track/src/fragment.ts +8 -7
  187. package/packages/media-track/src/index.ts +3 -1
  188. package/packages/media-track/src/lower.ts +7 -7
  189. package/packages/media-track/src/manifest.ts +16 -38
  190. package/packages/media-track/src/program.ts +62 -67
  191. package/packages/media-track/src/sampling.ts +6 -6
  192. package/packages/media-track/src/sequence.ts +8 -8
  193. package/packages/media-track/src/surface.ts +25 -43
  194. package/packages/media-track-studio/README.md +9 -0
  195. package/packages/media-track-studio/src/index.ts +16 -11
  196. package/packages/mimo-speech/README.md +1 -1
  197. package/packages/minimax-h3/README.md +1 -1
  198. package/packages/nano-banana/README.md +1 -1
  199. package/packages/narrative/README.md +23 -1
  200. package/packages/narrative/src/identity.ts +11 -0
  201. package/packages/narrative/src/index.ts +3 -0
  202. package/packages/narrative/src/schema.ts +28 -27
  203. package/packages/narrative/src/selection.ts +52 -0
  204. package/packages/narrative/src/types.ts +2 -0
  205. package/packages/package-loader-node/README.md +30 -0
  206. package/packages/package-loader-node/package.json +5 -2
  207. package/packages/package-loader-node/src/distribution-resolution.ts +10 -3
  208. package/packages/package-loader-node/src/index.ts +1 -0
  209. package/packages/package-loader-node/src/loader.ts +12 -15
  210. package/packages/package-loader-node/src/location.ts +27 -1
  211. package/packages/package-loader-node/src/module-scope.ts +183 -0
  212. package/packages/package-loader-node/src/types.ts +4 -0
  213. package/packages/performance/README.md +83 -0
  214. package/packages/performance/package.json +30 -0
  215. package/packages/performance/src/activation.ts +11 -0
  216. package/packages/performance/src/component.ts +46 -0
  217. package/packages/performance/src/index.ts +6 -0
  218. package/packages/performance/src/manifest.ts +53 -0
  219. package/packages/{media-track/src/performance.ts → performance/src/media.ts} +9 -10
  220. package/packages/performance/src/program.ts +51 -0
  221. package/packages/performance/src/style.ts +35 -0
  222. package/packages/performance/src/surface.ts +99 -0
  223. package/packages/performance-studio/README.md +25 -0
  224. package/packages/performance-studio/package.json +21 -0
  225. package/packages/performance-studio/src/activation.ts +6 -0
  226. package/packages/performance-studio/src/index.ts +84 -0
  227. package/packages/program-space/README.md +9 -18
  228. package/packages/program-space/src/activation.ts +1 -5
  229. package/packages/program-space/src/index.ts +2 -11
  230. package/packages/program-space/src/surface.ts +1 -20
  231. package/packages/project-context-node/README.md +20 -0
  232. package/packages/project-context-node/package.json +10 -0
  233. package/packages/project-context-node/src/index.ts +3 -0
  234. package/packages/{cli → project-context-node}/src/runtime-selection.ts +7 -2
  235. package/packages/provider-hyperframes-local/README.md +43 -15
  236. package/packages/provider-hyperframes-local/src/activation.ts +4 -3
  237. package/packages/provider-hyperframes-local/src/capture-process.ts +26 -4
  238. package/packages/provider-hyperframes-local/src/capture.ts +96 -26
  239. package/packages/provider-hyperframes-local/src/concurrency.ts +86 -0
  240. package/packages/provider-hyperframes-local/src/opaque-capture.ts +92 -0
  241. package/packages/provider-hyperframes-local/src/options.ts +2 -0
  242. package/packages/provider-hyperframes-local/src/program.ts +6 -3
  243. package/packages/provider-hyperframes-local/src/progress.ts +53 -0
  244. package/packages/provider-hyperframes-local/src/provider.ts +18 -5
  245. package/packages/provider-hyperframes-local/src/render.ts +48 -7
  246. package/packages/provider-hypihub/README.md +48 -17
  247. package/packages/provider-hypihub/package.json +2 -0
  248. package/packages/provider-hypihub/src/mapping.ts +31 -7
  249. package/packages/provider-hypihub/src/oauth.ts +6 -0
  250. package/packages/provider-hypihub/src/provider.ts +25 -13
  251. package/packages/provider-hypihub/src/routes.ts +1 -2
  252. package/packages/provider-hypihub/src/upload.ts +2 -0
  253. package/packages/provider-media-local/README.md +3 -4
  254. package/packages/provider-whisperx-local/src/program.ts +1 -0
  255. package/packages/provider-whisperx-local/src/provider.ts +3 -0
  256. package/packages/ranking/README.md +8 -6
  257. package/packages/ranking/package.json +1 -1
  258. package/packages/ranking/src/component.ts +6 -6
  259. package/packages/ranking/src/fragment.ts +11 -7
  260. package/packages/ranking/src/manifest.ts +21 -14
  261. package/packages/ranking/src/render.ts +22 -26
  262. package/packages/ranking/src/schedule.ts +16 -19
  263. package/packages/ranking/src/surface.ts +12 -13
  264. package/packages/ranking-studio/README.md +18 -0
  265. package/packages/ranking-studio/src/index.ts +61 -9
  266. package/packages/render-hyperframes/README.md +7 -7
  267. package/packages/render-hyperframes/package.json +1 -1
  268. package/packages/render-hyperframes/src/component.ts +11 -1
  269. package/packages/render-hyperframes/src/fragment.ts +7 -4
  270. package/packages/render-hyperframes/src/manifest.ts +4 -4
  271. package/packages/render-hyperframes/src/surface.ts +6 -6
  272. package/packages/runtime/README.md +8 -1
  273. package/packages/runtime/src/execution.ts +15 -4
  274. package/packages/runtime/src/index.ts +2 -1
  275. package/packages/runtime/src/log.ts +51 -0
  276. package/packages/runtime/src/types.ts +5 -8
  277. package/packages/runtime-host-node/README.md +30 -0
  278. package/packages/runtime-host-node/package.json +1 -0
  279. package/packages/runtime-host-node/src/index.ts +24 -9
  280. package/packages/runtime-host-node/src/packages.ts +47 -50
  281. package/packages/runtime-kit/README.md +5 -0
  282. package/packages/runtime-kit/src/index.ts +3 -1
  283. package/packages/runtime-local/README.md +109 -4
  284. package/packages/runtime-local/src/config.ts +202 -56
  285. package/packages/runtime-local/src/control.ts +9 -1
  286. package/packages/runtime-local/src/executor.ts +66 -0
  287. package/packages/runtime-local/src/host.ts +37 -17
  288. package/packages/runtime-local/src/log.ts +48 -0
  289. package/packages/runtime-local/src/programs.ts +2 -1
  290. package/packages/runtime-local/src/result-writer.ts +2 -0
  291. package/packages/runtime-local/src/runtime.ts +8 -6
  292. package/packages/runtime-local/src/supervisor.ts +142 -0
  293. package/packages/runtime-local/src/types.ts +9 -2
  294. package/packages/runtime-local/src/worker-process.ts +7 -24
  295. package/packages/runtime-local/src/worker.ts +55 -83
  296. package/packages/screen-overlay/README.md +3 -3
  297. package/packages/screen-overlay/package.json +1 -1
  298. package/packages/screen-overlay/src/component.ts +3 -3
  299. package/packages/screen-overlay/src/fragment.ts +5 -4
  300. package/packages/screen-overlay/src/manifest.ts +7 -6
  301. package/packages/screen-overlay/src/program.ts +9 -9
  302. package/packages/screen-overlay/src/surface.ts +6 -7
  303. package/packages/script/README.md +30 -5
  304. package/packages/script/src/manifest.ts +4 -3
  305. package/packages/script/src/narrative.ts +1 -0
  306. package/packages/script/src/parser.ts +45 -6
  307. package/packages/script/src/surface.ts +4 -3
  308. package/packages/script/src/types.ts +1 -1
  309. package/packages/script-studio/package.json +9 -3
  310. package/packages/script-studio/src/index.ts +2 -0
  311. package/packages/script-studio/src/projection.ts +105 -0
  312. package/packages/seedance/README.md +30 -1
  313. package/packages/seedance/src/index.ts +18 -7
  314. package/packages/seedance/src/surface.ts +17 -4
  315. package/packages/seedance-kits/README.md +7 -1
  316. package/packages/seedream/README.md +1 -1
  317. package/packages/sound/README.md +81 -0
  318. package/packages/sound/package.json +25 -0
  319. package/packages/sound/src/activation.ts +11 -0
  320. package/packages/sound/src/component.ts +28 -0
  321. package/packages/sound/src/index.ts +5 -0
  322. package/packages/sound/src/manifest.ts +47 -0
  323. package/packages/sound/src/program.ts +84 -0
  324. package/packages/sound/src/style.ts +34 -0
  325. package/packages/sound/src/surface.ts +90 -0
  326. package/packages/sound-studio/README.md +22 -0
  327. package/packages/sound-studio/package.json +20 -0
  328. package/packages/sound-studio/src/activation.ts +6 -0
  329. package/packages/sound-studio/src/index.ts +74 -0
  330. package/packages/speech/README.md +2 -2
  331. package/packages/speech-alignment/src/local.ts +8 -0
  332. package/packages/speech-alignment/src/locate.ts +1 -1
  333. package/packages/store-sqlite/README.md +7 -0
  334. package/packages/store-sqlite/src/store.ts +84 -83
  335. package/packages/studio/INSPECTOR.md +15 -2
  336. package/packages/studio/LOCALIZATION.md +98 -0
  337. package/packages/studio/README.md +101 -14
  338. package/packages/studio/locales/en.json +197 -0
  339. package/packages/studio/locales/zh-CN.json +191 -0
  340. package/packages/studio/package.json +8 -7
  341. package/packages/studio/src/companion-assembly.ts +1 -0
  342. package/packages/studio/src/domain.ts +1 -1
  343. package/packages/studio/src/fallback-companions.ts +3 -3
  344. package/packages/studio/src/feedback-server.ts +51 -0
  345. package/packages/studio/src/feedback-store.ts +66 -0
  346. package/packages/studio/src/feedback.ts +60 -0
  347. package/packages/studio/src/localization-node.ts +46 -0
  348. package/packages/studio/src/localization.ts +85 -0
  349. package/packages/studio/src/parameter-values.ts +43 -1
  350. package/packages/studio/src/parameters.ts +114 -24
  351. package/packages/studio/src/preview/render.ts +5 -1
  352. package/packages/studio/src/preview/runtime-shim.ts +49 -3
  353. package/packages/studio/src/programme.ts +14 -30
  354. package/packages/studio/src/server.ts +10 -6
  355. package/packages/studio/src/shared.ts +4 -2
  356. package/packages/studio/src/snapshot.ts +21 -132
  357. package/packages/studio/src/studio-preflight.ts +3 -3
  358. package/packages/studio/src/studio-registry.ts +50 -6
  359. package/packages/studio/src/style.css +223 -50
  360. package/packages/studio/src/ui/artifact-name.ts +8 -6
  361. package/packages/studio/src/ui/artifact-preview.ts +5 -4
  362. package/packages/studio/src/ui/code.ts +17 -16
  363. package/packages/studio/src/ui/comments.ts +234 -0
  364. package/packages/studio/src/ui/dropdown.ts +68 -0
  365. package/packages/studio/src/ui/i18n.ts +109 -0
  366. package/packages/studio/src/ui/icons.ts +6 -0
  367. package/packages/studio/src/ui/library.ts +76 -65
  368. package/packages/studio/src/ui/main.ts +223 -211
  369. package/packages/studio/src/ui/overlay.ts +12 -8
  370. package/packages/studio/src/ui/scrub-preview.ts +110 -0
  371. package/packages/studio/src/ui/stage.ts +93 -29
  372. package/packages/studio/src/ui/timeline.ts +190 -118
  373. package/packages/studio/start.ts +41 -22
  374. package/packages/studio-adapter/README.md +130 -11
  375. package/packages/studio-adapter/src/index.ts +100 -13
  376. package/packages/temporal/README.md +6 -6
  377. package/packages/temporal/package.json +1 -1
  378. package/packages/temporal/src/component.ts +5 -6
  379. package/packages/temporal/src/index.ts +8 -6
  380. package/packages/temporal/src/location.ts +11 -11
  381. package/packages/temporal/src/projection.ts +19 -19
  382. package/packages/temporal/src/rational.ts +4 -4
  383. package/packages/temporal-markup/EDITING.md +2 -2
  384. package/packages/temporal-markup/README.md +27 -11
  385. package/packages/temporal-markup/package.json +1 -1
  386. package/packages/temporal-markup/src/index.ts +20 -25
  387. package/packages/temporal-markup/src/space.ts +10 -41
  388. package/packages/timeline/README.md +31 -0
  389. package/packages/{semantic-track → timeline}/package.json +1 -1
  390. package/packages/timeline/src/activation.ts +8 -0
  391. package/packages/timeline/src/component.ts +24 -0
  392. package/packages/timeline/src/identity.ts +60 -0
  393. package/packages/timeline/src/index.ts +6 -0
  394. package/packages/{semantic-track → timeline}/src/location.ts +20 -20
  395. package/packages/timeline/src/manifest.ts +39 -0
  396. package/packages/{semantic-track → timeline}/src/projection.ts +14 -14
  397. package/packages/timeline/src/types.ts +24 -0
  398. package/packages/timeline-author/README.md +68 -0
  399. package/packages/{speech-track → timeline-author}/package.json +6 -4
  400. package/packages/timeline-author/src/activation.ts +22 -0
  401. package/packages/{speech-track → timeline-author}/src/component.ts +15 -13
  402. package/packages/{speech-track → timeline-author}/src/fragment.ts +14 -23
  403. package/packages/timeline-author/src/index.ts +7 -0
  404. package/packages/timeline-author/src/manifest.ts +78 -0
  405. package/packages/timeline-author/src/program.ts +107 -0
  406. package/packages/timeline-author/src/surface.ts +46 -0
  407. package/packages/timeline-author/src/types.ts +6 -0
  408. package/packages/typography-track/README.md +4 -4
  409. package/packages/typography-track/package.json +1 -1
  410. package/packages/typography-track/src/component.ts +4 -4
  411. package/packages/typography-track/src/fragment.ts +4 -3
  412. package/packages/typography-track/src/manifest.ts +11 -9
  413. package/packages/typography-track/src/program.ts +15 -15
  414. package/packages/typography-track/src/surface.ts +17 -18
  415. package/packages/video-cli/README.md +4 -1
  416. package/packages/video-cli/package.json +2 -1
  417. package/packages/video-cli/src/creation.ts +14 -4
  418. package/packages/video-cli/src/index.ts +1 -1
  419. package/packages/video-cli/src/studio-distribution.ts +2 -1
  420. package/packages/volcengine-matting/README.md +3 -3
  421. package/packages/whisperx/README.md +1 -1
  422. package/services/whisperx/README.md +14 -0
  423. package/services/whisperx/pyproject.toml +2 -0
  424. package/services/whisperx/uv.lock +20 -20
  425. package/packages/provider-hyperframes-aws-lambda/README.md +0 -30
  426. package/packages/provider-hyperframes-aws-lambda/package.json +0 -30
  427. package/packages/provider-hyperframes-aws-lambda/src/activation.ts +0 -97
  428. package/packages/provider-hyperframes-aws-lambda/src/client.ts +0 -114
  429. package/packages/provider-hyperframes-aws-lambda/src/index.ts +0 -21
  430. package/packages/provider-hyperframes-aws-lambda/src/provider.ts +0 -522
  431. package/packages/provider-kie/README.md +0 -134
  432. package/packages/provider-kie/package.json +0 -43
  433. package/packages/provider-kie/src/activation.ts +0 -71
  434. package/packages/provider-kie/src/index.ts +0 -10
  435. package/packages/provider-kie/src/mapping.ts +0 -182
  436. package/packages/provider-kie/src/provider.ts +0 -657
  437. package/packages/provider-kie/src/routes.ts +0 -150
  438. package/packages/provider-xiaomi-mimo/README.md +0 -32
  439. package/packages/provider-xiaomi-mimo/src/activation.ts +0 -57
  440. package/packages/provider-xiaomi-mimo/src/index.ts +0 -5
  441. package/packages/provider-xiaomi-mimo/src/provider.ts +0 -214
  442. package/packages/runtime/src/environment.ts +0 -6
  443. package/packages/semantic-track/README.md +0 -21
  444. package/packages/semantic-track/src/activation.ts +0 -8
  445. package/packages/semantic-track/src/component.ts +0 -24
  446. package/packages/semantic-track/src/identity.ts +0 -58
  447. package/packages/semantic-track/src/index.ts +0 -6
  448. package/packages/semantic-track/src/manifest.ts +0 -38
  449. package/packages/semantic-track/src/types.ts +0 -26
  450. package/packages/speech-track/README.md +0 -51
  451. package/packages/speech-track/src/activation.ts +0 -19
  452. package/packages/speech-track/src/index.ts +0 -7
  453. package/packages/speech-track/src/manifest.ts +0 -73
  454. package/packages/speech-track/src/program.ts +0 -64
  455. package/packages/speech-track/src/surface.ts +0 -35
  456. package/packages/speech-track/src/types.ts +0 -6
  457. package/packages/speech-track-studio/README.md +0 -3
  458. package/packages/speech-track-studio/package.json +0 -14
  459. package/packages/speech-track-studio/src/activation.ts +0 -7
  460. package/packages/speech-track-studio/src/index.ts +0 -40
  461. /package/packages/{cli → project-context-node}/src/project-context.ts +0 -0
  462. /package/packages/{speech-track → timeline-author}/preview/Track.png +0 -0
@@ -1,3 +1,4 @@
1
+ import { t, uiDate, uiLabel, uiAttribute, uiText, uiAttr, type Message } from "./i18n.js";
1
2
  import type {
2
3
  StudioArtifactView,
3
4
  StudioLibraryView,
@@ -38,19 +39,19 @@ function formatBytes(value: number): string {
38
39
  return `${(value / 1_000_000_000).toFixed(1)} GB`;
39
40
  }
40
41
 
41
- const date = new Intl.DateTimeFormat(undefined, {
42
- month: "short",
43
- day: "numeric",
44
- hour: "2-digit",
45
- minute: "2-digit",
46
- });
42
+ function localizedSidebarItem(input: { label: Message; icon: string; selected: boolean; select(): void }): HTMLButtonElement {
43
+ const button = sidebarItem(input);
44
+ uiAttr(button, "title", input.label);
45
+ uiAttr(button, "aria-label", input.label);
46
+ return button;
47
+ }
47
48
 
48
- function emptyState(iconName: string, title: string, detail: string): HTMLElement {
49
+ function emptyState(iconName: string, title: Message, detail: Message): HTMLElement {
49
50
  const node = document.createElement("div");
50
51
  node.className = "library-empty";
51
52
  node.innerHTML = `<span class="library-empty-icon">${icon(iconName)}</span><strong></strong><p></p>`;
52
- node.querySelector("strong")!.textContent = title;
53
- node.querySelector("p")!.textContent = detail;
53
+ uiText(node.querySelector("strong")!, title);
54
+ uiText(node.querySelector("p")!, detail);
54
55
  return node;
55
56
  }
56
57
 
@@ -77,9 +78,9 @@ function taskCard(task: StudioTaskView, selected: boolean, select: () => void, s
77
78
  node.dataset.taskId = task.id;
78
79
  const source = task.run ?? task.source;
79
80
  const title = task.title ?? stem(source);
80
- const statuses: Record<StudioTaskView["status"], string> = {
81
- queued: "Queued", running: "Running", waiting: "Waiting", complete: "Completed",
82
- failed: "Failed", cancelled: "Cancelled", "saving-result": "Saving", attention: "Needs attention",
81
+ const statuses: Record<StudioTaskView["status"], Message> = {
82
+ queued: "common.queued", running: "common.running", waiting: "common.waiting", complete: "common.completed",
83
+ failed: "common.failed", cancelled: "common.cancelled", "saving-result": "common.saving", attention: "common.needs-attention",
83
84
  };
84
85
  node.innerHTML = `
85
86
  <div class="task-state" aria-hidden="true">${icon(task.ongoing ? "when" : task.status === "complete" ? "check" : task.status === "failed" ? "alert" : "tasks")}</div>
@@ -89,18 +90,24 @@ function taskCard(task: StudioTaskView, selected: boolean, select: () => void, s
89
90
  <div class="task-progress" data-progress></div>
90
91
  <div class="task-detail" data-detail></div>
91
92
  </div>
92
- <button type="button" class="task-open" aria-label="View task media" title="View media">${icon("arrowRight")}</button>`;
93
+ <button type="button" class="task-open" ${uiAttribute("aria-label", "library.view-task-media")} ${uiAttribute("title", "library.view-media")}>${icon("arrowRight")}</button>`;
93
94
  const name = node.querySelector<HTMLButtonElement>(".task-name")!;
94
95
  name.textContent = title;
95
96
  name.addEventListener("click", (event) => { event.stopPropagation(); select(); });
96
- node.querySelector<HTMLElement>(".task-status")!.textContent = statuses[task.status];
97
+ uiText(node.querySelector<HTMLElement>(".task-status")!, statuses[task.status]);
97
98
  const time = node.querySelector("time")!;
98
99
  time.dateTime = new Date(task.createdAt).toISOString();
99
- time.textContent = date.format(task.createdAt);
100
+ uiDate(time, task.createdAt);
100
101
  const progress = task.ongoing ? taskProgress(task) : undefined;
101
102
  const progressNode = node.querySelector<HTMLElement>("[data-progress]")!;
102
103
  if (progress === undefined) progressNode.remove();
103
- else { progressNode.textContent = progress; progressNode.title = progress; }
104
+ else {
105
+ progressNode.textContent = progress; progressNode.title = progress;
106
+ if (!task.operations.some(operation => operation.status === "pending" && operation.phase !== undefined) && task.requests !== undefined) {
107
+ uiText(progressNode, "tasks.progress", task.requests);
108
+ uiAttr(progressNode, "title", "tasks.progress", task.requests);
109
+ }
110
+ }
104
111
  const detailNode = node.querySelector<HTMLElement>("[data-detail]")!;
105
112
  if (task.detail === undefined) detailNode.remove();
106
113
  else {
@@ -109,10 +116,10 @@ function taskCard(task: StudioTaskView, selected: boolean, select: () => void, s
109
116
  message.textContent = task.detail;
110
117
  detailNode.append(message);
111
118
  const copy = document.createElement("button");
112
- copy.type = "button"; copy.className = "task-copy-error"; copy.textContent = "Copy error";
119
+ copy.type = "button"; copy.className = "task-copy-error"; uiText(copy, "tasks.copy-error");
113
120
  copy.addEventListener("click", (event) => {
114
121
  event.stopPropagation();
115
- void navigator.clipboard.writeText(task.detail!).then(() => { copy.textContent = "Copied"; }, () => { copy.textContent = "Select the text to copy"; });
122
+ void navigator.clipboard.writeText(task.detail!).then(() => { uiText(copy, "common.copied"); }, () => { uiText(copy, "tasks.copy-manually"); });
116
123
  });
117
124
  detailNode.append(copy);
118
125
  detailNode.addEventListener("click", (event) => { event.stopPropagation(); if (!node.classList.contains("selected")) select(); });
@@ -122,11 +129,11 @@ function taskCard(task: StudioTaskView, selected: boolean, select: () => void, s
122
129
  return node;
123
130
  }
124
131
 
125
- function artifactKind(mediaType: string): { readonly label: string; readonly icon: string } {
126
- if (mediaType.startsWith("video/")) return { label: "Video", icon: "video" };
127
- if (mediaType.startsWith("image/")) return { label: "Image", icon: "image" };
128
- if (mediaType.startsWith("audio/")) return { label: "Audio", icon: "waveform" };
129
- return { label: "Data", icon: "code" };
132
+ function artifactKind(mediaType: string): { readonly label: Message; readonly icon: string } {
133
+ if (mediaType.startsWith("video/")) return { label: "library.video", icon: "video" };
134
+ if (mediaType.startsWith("image/")) return { label: "library.image", icon: "image" };
135
+ if (mediaType.startsWith("audio/")) return { label: "library.audio", icon: "waveform" };
136
+ return { label: "library.data", icon: "code" };
130
137
  }
131
138
 
132
139
  function sizeThumbnail(media: HTMLElement, width: number, height: number): void {
@@ -140,7 +147,7 @@ function artifactCard(artifact: StudioArtifactView, open: (artifact: StudioArtif
140
147
  const kind = artifactKind(artifact.mediaType);
141
148
  const link = document.createElement("div");
142
149
  link.tabIndex = 0;
143
- link.className = `artifact-card artifact-${kind.label.toLowerCase()}${artifact.highlighted ? " artifact-highlighted" : ""}`;
150
+ link.className = `artifact-card artifact-${artifact.mediaType.split("/")[0]}${artifact.highlighted ? " artifact-highlighted" : ""}`;
144
151
  const query = new URLSearchParams({
145
152
  build: artifact.build,
146
153
  output: artifact.output,
@@ -158,10 +165,10 @@ function artifactCard(artifact: StudioArtifactView, open: (artifact: StudioArtif
158
165
  <span class="artifact-glyph">${icon(kind.icon)}</span>
159
166
  <span class="artifact-type"></span>
160
167
  </div>`;
161
- link.querySelector<HTMLElement>(".artifact-type")!.textContent = kind.label;
168
+ uiText(link.querySelector<HTMLElement>(".artifact-type")!, kind.label);
162
169
  const preview = link.querySelector<HTMLElement>(".artifact-preview")!;
163
170
  preview.setAttribute("role", "button");
164
- preview.setAttribute("aria-label", `Preview ${title}`);
171
+ uiAttr(preview, "aria-label", "library.preview-name", { name: title });
165
172
  preview.addEventListener("click", () => open(artifact));
166
173
  const name = createArtifactName({
167
174
  name: title,
@@ -173,11 +180,11 @@ function artifactCard(artifact: StudioArtifactView, open: (artifact: StudioArtif
173
180
  body: JSON.stringify({ build: artifact.build, output: artifact.output, displayName }),
174
181
  });
175
182
  const result = await response.json() as { displayName?: string; error?: string };
176
- if (!response.ok || typeof result.displayName !== "string") throw new Error(result.error ?? "Could not save the name");
183
+ if (!response.ok || typeof result.displayName !== "string") throw new Error(result.error ?? t("library.name-failed"));
177
184
  artifact = { ...artifact, displayName: result.displayName };
178
185
  link.dataset.displayName = result.displayName;
179
186
  renamed(artifact);
180
- preview.setAttribute("aria-label", `Preview ${result.displayName}`);
187
+ uiAttr(preview, "aria-label", "library.preview-name", { name: result.displayName });
181
188
  preview.title = [result.displayName, ...preview.title.split("\n").slice(1)].join("\n");
182
189
  return result.displayName;
183
190
  },
@@ -191,7 +198,7 @@ function artifactCard(artifact: StudioArtifactView, open: (artifact: StudioArtif
191
198
  if (artifact.mediaType.startsWith("image/")) {
192
199
  const image = document.createElement("img");
193
200
  image.addEventListener("load", () => sizeThumbnail(image, image.naturalWidth, image.naturalHeight));
194
- image.addEventListener("error", () => { link.classList.add("preview-unavailable"); link.querySelector<HTMLElement>(".artifact-type")!.textContent = "Preview unavailable"; });
201
+ image.addEventListener("error", () => { link.classList.add("preview-unavailable"); uiText(link.querySelector<HTMLElement>(".artifact-type")!, "library.preview-unavailable"); });
195
202
  image.src = href;
196
203
  image.alt = "";
197
204
  image.loading = "lazy";
@@ -204,11 +211,11 @@ function artifactCard(artifact: StudioArtifactView, open: (artifact: StudioArtif
204
211
  video.dataset.previewSource = href;
205
212
  video.setAttribute("aria-hidden", "true");
206
213
  const label = link.querySelector<HTMLElement>(".artifact-type")!;
207
- label.textContent = "Video · Loading preview";
214
+ uiText(label, "library.video-loading-preview");
208
215
  const ready = () => {
209
216
  if (video.readyState < 2 || video.seeking) return;
210
217
  video.classList.add("is-ready");
211
- label.textContent = "Video";
218
+ uiText(label, "library.video");
212
219
  };
213
220
  video.addEventListener("loadedmetadata", () => {
214
221
  sizeThumbnail(video, video.videoWidth, video.videoHeight);
@@ -216,7 +223,7 @@ function artifactCard(artifact: StudioArtifactView, open: (artifact: StudioArtif
216
223
  }, { once: true });
217
224
  video.addEventListener("loadeddata", ready);
218
225
  video.addEventListener("seeked", ready);
219
- video.addEventListener("error", () => { label.textContent = "Preview unavailable"; link.classList.add("preview-unavailable"); });
226
+ video.addEventListener("error", () => { uiText(label, "library.preview-unavailable"); link.classList.add("preview-unavailable"); });
220
227
  link.querySelector<HTMLElement>(".artifact-preview")!.prepend(video);
221
228
  } else if (artifact.mediaType.startsWith("audio/")) {
222
229
  const waveform = document.createElement("img");
@@ -229,7 +236,7 @@ function artifactCard(artifact: StudioArtifactView, open: (artifact: StudioArtif
229
236
  title,
230
237
  artifact.mediaType,
231
238
  formatBytes(artifact.size),
232
- date.format(artifact.createdAt),
239
+ new Date(artifact.createdAt).toLocaleString(),
233
240
  artifact.ownerBuild === undefined ? artifact.filePath : `${artifact.ownerBuild}/${artifact.filePath}`,
234
241
  ...artifact.origins.map((origin) => `${origin.run ?? origin.source} · ${origin.build} · ${origin.output}`),
235
242
  artifact.buildNote,
@@ -241,15 +248,15 @@ export function createLibraryPane(code: CodePane, openArtifact: (artifact: Studi
241
248
  const element = document.createElement("section");
242
249
  element.className = "library";
243
250
  element.innerHTML = `
244
- <div class="library-tabs" role="tablist" aria-label="Studio library">
251
+ <div class="library-tabs" role="tablist" ${uiAttribute("aria-label", "library.studio-library")}>
245
252
  <button type="button" class="library-tab active" data-library-tab="source" role="tab" aria-selected="true">
246
- <span>${icon("code")}</span><strong>Source</strong>
253
+ <span>${icon("code")}</span><strong>${uiLabel("library.source")}</strong>
247
254
  </button>
248
255
  <button type="button" class="library-tab" data-library-tab="tasks" role="tab" aria-selected="false">
249
- <span>${icon("tasks")}</span><strong>Tasks</strong>
256
+ <span>${icon("tasks")}</span><strong>${uiLabel("library.tasks")}</strong>
250
257
  </button>
251
258
  <button type="button" class="library-tab" data-library-tab="artifacts" role="tab" aria-selected="false">
252
- <span>${icon("results")}</span><strong>Artifacts</strong>
259
+ <span>${icon("results")}</span><strong>${uiLabel("library.artifacts")}</strong>
253
260
  </button>
254
261
  </div>
255
262
  <section class="library-view active" data-library-view="source">
@@ -258,19 +265,22 @@ export function createLibraryPane(code: CodePane, openArtifact: (artifact: Studi
258
265
  <section class="library-view" data-library-view="artifacts">
259
266
  </section>`;
260
267
 
261
- const sourcePanel = createSidebarPanel("panel", "Referenced source files");
268
+ const sourcePanel = createSidebarPanel("panel", "library.referenced-source-files");
269
+ uiAttr(sourcePanel.navigation, "aria-label", "library.referenced-source-files");
262
270
  sourcePanel.toolbar.append(code.toolbar);
263
271
  sourcePanel.content.classList.add("source-code");
264
272
  sourcePanel.content.append(code.element);
265
273
  element.querySelector('[data-library-view="source"]')!.append(sourcePanel.element);
266
- const taskPanel = createSidebarPanel("panel", "Task categories");
267
- taskPanel.toolbar.innerHTML = `<span class="code-location" data-task-heading>All tasks</span><div class="task-context" data-task-context hidden></div>
268
- <button type="button" class="library-refresh" data-library-refresh aria-label="Refresh tasks" title="Refresh">${icon("refresh")}</button>`;
274
+ const taskPanel = createSidebarPanel("panel", "library.task-categories");
275
+ uiAttr(taskPanel.navigation, "aria-label", "library.task-categories");
276
+ taskPanel.toolbar.innerHTML = `<span class="code-location" data-task-heading>${uiLabel("library.all-tasks")}</span><div class="task-context" data-task-context hidden></div>
277
+ <button type="button" class="library-refresh" data-library-refresh ${uiAttribute("aria-label", "library.refresh-tasks")} ${uiAttribute("title", "common.refresh")}>${icon("refresh")}</button>`;
269
278
  taskPanel.content.innerHTML = `<div class="media-status" data-library-status="tasks" role="status" hidden></div><div class="task-list" data-task-list></div>`;
270
279
  element.querySelector('[data-library-view="tasks"]')!.append(taskPanel.element);
271
- const mediaPanel = createSidebarPanel("panel", "Media categories");
272
- mediaPanel.toolbar.innerHTML = `<span class="code-location" data-media-heading>All media</span><div class="task-context" data-task-context hidden></div>
273
- <button type="button" class="library-refresh" data-library-refresh aria-label="Refresh media" title="Refresh">${icon("refresh")}</button>`;
280
+ const mediaPanel = createSidebarPanel("panel", "library.media-categories");
281
+ uiAttr(mediaPanel.navigation, "aria-label", "library.media-categories");
282
+ mediaPanel.toolbar.innerHTML = `<span class="code-location" data-media-heading>${uiLabel("library.all-media")}</span><div class="task-context" data-task-context hidden></div>
283
+ <button type="button" class="library-refresh" data-library-refresh ${uiAttribute("aria-label", "library.refresh-media")} ${uiAttribute("title", "common.refresh")}>${icon("refresh")}</button>`;
274
284
  mediaPanel.content.innerHTML = `<div class="media-status" data-library-status="artifacts" role="status" hidden></div><div class="artifact-grid" data-artifact-grid></div>`;
275
285
  element.querySelector('[data-library-view="artifacts"]')!.append(mediaPanel.element);
276
286
  const sourceList = sourcePanel.navigation;
@@ -300,7 +310,7 @@ export function createLibraryPane(code: CodePane, openArtifact: (artifact: Studi
300
310
  node.className = "library-continuation";
301
311
  node.dataset.moreSection = section;
302
312
  node.dataset.before = cursor;
303
- node.textContent = "Loading more";
313
+ uiText(node, "library.loading-more");
304
314
  return node;
305
315
  };
306
316
  const selectArtifact = (id: string | undefined): void => {
@@ -367,7 +377,7 @@ export function createLibraryPane(code: CodePane, openArtifact: (artifact: Studi
367
377
  back.type = "button"; back.className = "task-context-name";
368
378
  back.innerHTML = "<span></span>";
369
379
  back.querySelector("span")!.textContent = task.title ?? stem(task.run ?? task.source);
370
- back.title = `${task.title ?? stem(task.run ?? task.source)} · Return to task`;
380
+ uiAttr(back, "title", "library.task-return", { name: task.title ?? stem(task.run ?? task.source) });
371
381
  back.addEventListener("click", () => {
372
382
  taskFilter = "all";
373
383
  switchTo("tasks", false);
@@ -376,7 +386,7 @@ export function createLibraryPane(code: CodePane, openArtifact: (artifact: Studi
376
386
  });
377
387
  const clear = document.createElement("button");
378
388
  clear.type = "button"; clear.className = "task-context-clear";
379
- clear.innerHTML = icon("close"); clear.title = "Clear task filter"; clear.setAttribute("aria-label", clear.title);
389
+ clear.innerHTML = icon("close"); uiAttr(clear, "title", "library.clear-task-filter"); uiAttr(clear, "aria-label", "library.clear-task-filter");
380
390
  clear.addEventListener("click", () => {
381
391
  selectedTask = undefined; delete libraries.artifacts; renderTaskContext(); renderTasks();
382
392
  if (active === "artifacts") { renderArtifacts(); void refresh("artifacts"); }
@@ -389,11 +399,12 @@ export function createLibraryPane(code: CodePane, openArtifact: (artifact: Studi
389
399
  for (const node of Array.from(taskList.querySelectorAll("[data-more-section]"))) morePages.unobserve(node);
390
400
  const library = libraries.tasks;
391
401
  const tasks = library?.tasks ?? [];
392
- const filters = [["all", "All tasks", "component"], ["ongoing", "In progress", "when"], ["finished", "Finished", "check"]] as const;
402
+ const filters = [["all", "library.all-tasks", "component"], ["ongoing", "library.in-progress", "when"], ["finished", "library.finished", "check"]] as const;
393
403
  const heading = taskPanel.toolbar.querySelector<HTMLElement>("[data-task-heading]")!;
394
- heading.textContent = filters.find(([id]) => id === taskFilter)![1];
395
- heading.title = library?.runtime === undefined ? "Saved project Results · no Runtime selected" : library.runtime;
396
- taskPanel.navigation.replaceChildren(...filters.map(([id, label, mark]) => sidebarItem({
404
+ uiText(heading, filters.find(([id]) => id === taskFilter)![1]);
405
+ if (library?.runtime === undefined) uiAttr(heading, "title", "tasks.saved-only");
406
+ else { heading.removeAttribute("data-ui-title"); heading.title = library.runtime; }
407
+ taskPanel.navigation.replaceChildren(...filters.map(([id, label, mark]) => localizedSidebarItem({
397
408
  label, icon: mark, selected: id === taskFilter,
398
409
  select: () => { taskFilter = id; taskList.scrollTop = 0; renderTasks(); },
399
410
  })));
@@ -413,10 +424,10 @@ export function createLibraryPane(code: CodePane, openArtifact: (artifact: Studi
413
424
  () => selectTask(task), () => { selectTask(task); switchTo("artifacts"); }));
414
425
  renderTaskContext();
415
426
  if (tasksToShow.length === 0) entries.push(emptyState("tasks",
416
- library === undefined && request !== undefined ? "Loading tasks" : taskFilter === "ongoing" ? "No tasks in progress" : "No tasks here",
427
+ library === undefined && request !== undefined ? "library.loading-tasks" : taskFilter === "ongoing" ? "library.no-tasks-in-progress" : "library.no-tasks-here",
417
428
  taskFilter === "ongoing" && library?.runtime === undefined
418
- ? "No Runtime is selected. Saved tasks are available under Finished."
419
- : "Refresh to read the latest task status."));
429
+ ? "tasks.no-runtime"
430
+ : "tasks.refresh-hint"));
420
431
  // Runtime activity is returned in full on the first page. Older pages contain Results only.
421
432
  if (taskFilter !== "ongoing" && library?.next !== undefined) entries.push(continuation("tasks", library.next));
422
433
  taskList.replaceChildren(...entries);
@@ -429,12 +440,12 @@ export function createLibraryPane(code: CodePane, openArtifact: (artifact: Studi
429
440
  const cards = new Map(Array.from(artifactGrid.querySelectorAll<HTMLElement>("[data-artifact-id]"), (card) => [card.dataset.artifactId!, card]));
430
441
  const library = libraries.artifacts;
431
442
  const artifacts = library?.artifacts ?? [];
432
- const filters = [["all", "All media", "component"], ["video", "Videos", "video"], ["image", "Images", "image"], ["audio", "Audio", "waveform"]] as const;
443
+ const filters = [["all", "library.all-media", "component"], ["video", "library.videos", "video"], ["image", "library.images", "image"], ["audio", "library.audio", "waveform"]] as const;
433
444
  const heading = mediaPanel.toolbar.querySelector<HTMLElement>("[data-media-heading]")!;
434
- heading.textContent = filters.find(([id]) => id === artifactFilter)?.[1] ?? "All media";
435
- heading.title = "Media category";
445
+ uiText(heading, filters.find(([id]) => id === artifactFilter)?.[1] ?? "library.all-media");
446
+ uiAttr(heading, "title", "library.media-category");
436
447
  renderTaskContext();
437
- artifactFilters.replaceChildren(...filters.map(([id, label, mark]) => sidebarItem({
448
+ artifactFilters.replaceChildren(...filters.map(([id, label, mark]) => localizedSidebarItem({
438
449
  label, icon: mark, selected: id === artifactFilter,
439
450
  select: () => {
440
451
  artifactFilter = id;
@@ -466,8 +477,8 @@ export function createLibraryPane(code: CodePane, openArtifact: (artifact: Studi
466
477
  if (video !== null) { video.removeAttribute("src"); video.load(); }
467
478
  }
468
479
  if (shown.length === 0) entries.push(emptyState("results",
469
- library === undefined && request !== undefined ? "Loading media" : artifactFilter === "all" ? "No media" : `No ${artifactFilter} files`,
470
- "Images, videos and audio published as file Outputs appear here, including those from ongoing Builds."));
480
+ library === undefined && request !== undefined ? "library.loading-media" : artifactFilter === "all" ? "library.no-media" : "library.no-files-in-this-category",
481
+ "library.media-hint"));
471
482
  if (library?.next !== undefined) entries.push(continuation("artifacts", library.next));
472
483
  artifactGrid.replaceChildren(...entries);
473
484
  selectArtifact(selectedArtifact);
@@ -497,7 +508,7 @@ export function createLibraryPane(code: CodePane, openArtifact: (artifact: Studi
497
508
  const controller = new AbortController();
498
509
  request = controller;
499
510
  const status = element.querySelector<HTMLElement>(`[data-library-status="${section}"]`)!;
500
- status.textContent = "Refreshing…";
511
+ uiText(status, "library.refreshing");
501
512
  status.hidden = true;
502
513
  element.classList.add("is-refreshing");
503
514
  try {
@@ -507,7 +518,7 @@ export function createLibraryPane(code: CodePane, openArtifact: (artifact: Studi
507
518
  if (section === "artifacts" && selectedTask !== undefined) query.set("build", selectedTask.id);
508
519
  const response = await fetch(`/__studio/library?${query.toString()}`, { signal: controller.signal });
509
520
  const value = await response.json() as StudioLibraryView | { readonly error: string };
510
- if (!response.ok || "error" in value) throw new Error("error" in value ? value.error : "Library unavailable");
521
+ if (!response.ok || "error" in value) throw new Error("error" in value ? value.error : t("library.unavailable"));
511
522
  if (controller.signal.aborted) return;
512
523
  const previous = libraries[section];
513
524
  if (before === undefined || previous === undefined) libraries[section] = value;
@@ -522,18 +533,18 @@ export function createLibraryPane(code: CodePane, openArtifact: (artifact: Studi
522
533
  }
523
534
  if (section === "tasks") renderTasks();
524
535
  else renderArtifacts();
525
- status.textContent = `Updated ${new Date().toLocaleTimeString()}`;
536
+ uiText(status, "library.updated", { time: new Date().toLocaleTimeString() });
526
537
  } catch (error) {
527
538
  if (!controller.signal.aborted) {
528
539
  const detail = error instanceof Error ? error.message : String(error);
529
540
  status.hidden = false;
530
- status.textContent = `Refresh failed: ${detail}${libraries[section] === undefined ? "" : " · Previous view retained"}`;
541
+ uiText(status, libraries[section] === undefined ? "library.refresh-failed" : "library.refresh-failed-retained", { detail });
531
542
  }
532
543
  } finally {
533
544
  if (request === controller) {
534
545
  request = undefined;
535
546
  element.classList.remove("is-refreshing");
536
- if (controller.signal.aborted) status.textContent = "Refresh interrupted";
547
+ if (controller.signal.aborted) uiText(status, "library.refresh-interrupted");
537
548
  }
538
549
  }
539
550
  };