@hypit/hypit 0.1.3 → 0.1.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (486) hide show
  1. package/README.md +5 -3
  2. package/dist/public/caption.d.ts +206 -183
  3. package/dist/public/composition.d.ts +25 -3
  4. package/dist/public/endpoint-kit.d.ts +24 -2
  5. package/dist/public/generation.d.ts +5 -1
  6. package/dist/public/hyperframes.d.ts +19 -1
  7. package/dist/public/narrative.d.ts +17 -3
  8. package/dist/public/performance.d.ts +1590 -0
  9. package/dist/public/program-space.d.ts +179 -32
  10. package/dist/public/runtime-kit.d.ts +21 -8
  11. package/dist/public/sound.d.ts +822 -0
  12. package/dist/public/speech.d.ts +41 -0
  13. package/dist/public/studio-adapter.d.ts +107 -16
  14. package/dist/public/temporal-markup.d.ts +9 -44
  15. package/dist/public/temporal.d.ts +37 -28
  16. package/dist/public/{semantic-track.d.ts → timeline.d.ts} +62 -49
  17. package/examples/README.md +18 -10
  18. package/examples/minimal-author-package/packages/example-component/preview/preview.svml +19 -12
  19. package/examples/minimal-author-package/packages/example-component/src/component.ts +5 -5
  20. package/examples/minimal-author-package/packages/example-component/src/fragment.ts +3 -5
  21. package/examples/minimal-author-package/packages/example-component/src/manifest.ts +8 -10
  22. package/examples/minimal-author-package/packages/example-component/src/surface.ts +2 -2
  23. package/examples/provider-package/README.md +78 -0
  24. package/examples/provider-package/hypit.runtime.json +12 -0
  25. package/examples/provider-package/packages/provider-images/package.json +11 -0
  26. package/examples/provider-package/packages/provider-images/src/activation.ts +24 -0
  27. package/examples/provider-package/packages/provider-images/src/provider.ts +122 -0
  28. package/examples/provider-package/packages/provider-images/tsconfig.json +9 -0
  29. package/examples/semantic-composition/README.md +6 -0
  30. package/examples/semantic-composition/chat.svml +6 -5
  31. package/examples/semantic-composition/packages/chat-scene/README.md +3 -3
  32. package/examples/semantic-composition/packages/chat-scene/src/activation.ts +18 -21
  33. package/examples/semantic-composition/packages/chat-scene/src/render.ts +4 -4
  34. package/examples/semantic-composition/packages/performance-styles/README.md +42 -0
  35. package/examples/semantic-composition/packages/performance-styles/package.json +25 -0
  36. package/examples/semantic-composition/packages/performance-styles/src/activation.ts +57 -0
  37. package/examples/semantic-composition/packages/performance-styles/src/render.ts +54 -0
  38. package/examples/semantic-composition/packages/performance-styles/src/studio.ts +28 -0
  39. package/examples/semantic-composition/packages/performance-styles/tsconfig.json +18 -0
  40. package/examples/semantic-composition/packages/responsive-explainer/README.md +16 -9
  41. package/examples/semantic-composition/packages/responsive-explainer/src/activation.ts +12 -12
  42. package/examples/semantic-composition/packages/responsive-explainer/src/render.ts +5 -5
  43. package/examples/semantic-composition/packages/sound-styles/README.md +36 -0
  44. package/examples/semantic-composition/packages/sound-styles/package.json +25 -0
  45. package/examples/semantic-composition/packages/sound-styles/src/activation.ts +53 -0
  46. package/examples/semantic-composition/packages/sound-styles/src/render.ts +14 -0
  47. package/examples/semantic-composition/packages/sound-styles/tsconfig.json +18 -0
  48. package/package.json +35 -15
  49. package/packages/audio-track/README.md +20 -13
  50. package/packages/audio-track/package.json +1 -1
  51. package/packages/audio-track/src/component.ts +4 -4
  52. package/packages/audio-track/src/fragment.ts +6 -5
  53. package/packages/audio-track/src/index.ts +1 -1
  54. package/packages/audio-track/src/manifest.ts +17 -16
  55. package/packages/audio-track/src/program.ts +21 -25
  56. package/packages/audio-track/src/surface.ts +19 -18
  57. package/packages/audio-track-studio/README.md +23 -0
  58. package/packages/audio-track-studio/src/index.ts +33 -19
  59. package/packages/author-kit/README.md +1 -1
  60. package/packages/background-removal/README.md +4 -7
  61. package/packages/browser-capture/package.json +1 -1
  62. package/packages/build-result/README.md +69 -0
  63. package/packages/build-result/package.json +2 -1
  64. package/packages/build-result/src/decode.ts +12 -8
  65. package/packages/build-result/src/execution-log.ts +17 -0
  66. package/packages/build-result/src/file-reference.ts +42 -0
  67. package/packages/build-result/src/index.ts +4 -0
  68. package/packages/build-result/src/replace-file-windows.ts +58 -0
  69. package/packages/build-result/src/replace-file.ts +11 -0
  70. package/packages/build-result/src/store.ts +58 -14
  71. package/packages/build-result/src/types.ts +41 -8
  72. package/packages/build-result/src/writer.ts +12 -1
  73. package/packages/build-result-fs/README.md +23 -1
  74. package/packages/build-result-s3/README.md +5 -0
  75. package/packages/build-result-s3/src/repository.ts +23 -5
  76. package/packages/caption/README.md +61 -73
  77. package/packages/caption/package.json +3 -2
  78. package/packages/caption/src/activation.ts +2 -2
  79. package/packages/caption/src/component.ts +20 -5
  80. package/packages/caption/src/display.ts +3 -18
  81. package/packages/caption/src/fragment.ts +3 -7
  82. package/packages/caption/src/index.ts +6 -5
  83. package/packages/caption/src/manifest.ts +29 -46
  84. package/packages/caption/src/style.ts +24 -135
  85. package/packages/caption/src/surface.ts +12 -92
  86. package/packages/caption/src/temporalize.ts +18 -53
  87. package/packages/caption/src/types.ts +8 -35
  88. package/packages/caption/src/visibility.ts +23 -0
  89. package/packages/caption-fine/README.md +31 -11
  90. package/packages/caption-fine/package.json +4 -2
  91. package/packages/caption-fine/src/component.ts +3 -3
  92. package/packages/caption-fine/src/fragment.ts +7 -19
  93. package/packages/caption-fine/src/index.ts +2 -0
  94. package/packages/caption-fine/src/manifest.ts +27 -18
  95. package/packages/caption-fine/src/recipe.ts +7 -0
  96. package/packages/caption-fine/src/render.ts +62 -49
  97. package/packages/caption-fine/src/schedule.ts +39 -35
  98. package/packages/caption-fine/src/style.ts +10 -9
  99. package/packages/caption-fine/src/surface.ts +62 -35
  100. package/packages/caption-fine/src/types.ts +2 -0
  101. package/packages/caption-fine-studio/README.md +24 -2
  102. package/packages/caption-fine-studio/package.json +10 -3
  103. package/packages/caption-fine-studio/src/activation.ts +3 -3
  104. package/packages/caption-fine-studio/src/index.ts +61 -40
  105. package/packages/cli/README.md +81 -3
  106. package/packages/cli/package.json +1 -0
  107. package/packages/cli/src/arguments.ts +39 -15
  108. package/packages/cli/src/build-planning.ts +9 -3
  109. package/packages/cli/src/command.ts +7 -1
  110. package/packages/cli/src/commands/environment.ts +66 -27
  111. package/packages/cli/src/commands/execution.ts +81 -26
  112. package/packages/cli/src/commands/results.ts +7 -11
  113. package/packages/cli/src/index.ts +2 -2
  114. package/packages/cli/src/machine-view.ts +15 -5
  115. package/packages/cli/src/main.ts +38 -42
  116. package/packages/cli/src/observation.ts +7 -1
  117. package/packages/cli/src/output.ts +92 -34
  118. package/packages/cli/src/result-export.ts +22 -13
  119. package/packages/cli/src/run-file.ts +19 -8
  120. package/packages/cli/src/view.ts +64 -18
  121. package/packages/comment-sticker/README.md +3 -3
  122. package/packages/comment-sticker/package.json +1 -1
  123. package/packages/comment-sticker/src/component.ts +4 -4
  124. package/packages/comment-sticker/src/fragment.ts +5 -4
  125. package/packages/comment-sticker/src/manifest.ts +7 -6
  126. package/packages/comment-sticker/src/program.ts +9 -9
  127. package/packages/comment-sticker/src/surface.ts +6 -7
  128. package/packages/comment-sticker-studio/src/index.ts +2 -1
  129. package/packages/compiler-node/src/compiler.ts +1 -0
  130. package/packages/composition/README.md +21 -0
  131. package/packages/composition/src/audio-presentation.ts +44 -0
  132. package/packages/composition/src/index.ts +3 -0
  133. package/packages/composition/src/schema.ts +8 -3
  134. package/packages/composition/src/track.ts +15 -1
  135. package/packages/credential-store-env/README.md +1 -1
  136. package/packages/deck-track/README.md +3 -3
  137. package/packages/deck-track/package.json +1 -1
  138. package/packages/deck-track/src/component.ts +5 -5
  139. package/packages/deck-track/src/fragment.ts +6 -5
  140. package/packages/deck-track/src/lower.ts +12 -12
  141. package/packages/deck-track/src/manifest.ts +8 -7
  142. package/packages/deck-track/src/program.ts +13 -16
  143. package/packages/deck-track/src/surface.ts +9 -10
  144. package/packages/driver-node/src/driver.ts +41 -3
  145. package/packages/elevenlabs-speech/README.md +27 -0
  146. package/packages/{provider-xiaomi-mimo → elevenlabs-speech}/package.json +5 -8
  147. package/packages/elevenlabs-speech/src/activation.ts +26 -0
  148. package/packages/elevenlabs-speech/src/fragment.ts +11 -0
  149. package/packages/elevenlabs-speech/src/index.ts +111 -0
  150. package/packages/elevenlabs-speech/src/surface.ts +167 -0
  151. package/packages/endpoint-kit/README.md +24 -0
  152. package/packages/endpoint-kit/src/index.ts +7 -1
  153. package/packages/estimate/README.md +56 -3
  154. package/packages/estimate/src/program.ts +7 -8
  155. package/packages/film/README.md +12 -7
  156. package/packages/film/package.json +1 -1
  157. package/packages/film/src/component.ts +4 -4
  158. package/packages/film/src/fragment.ts +6 -5
  159. package/packages/film/src/manifest.ts +11 -10
  160. package/packages/film/src/program.ts +5 -5
  161. package/packages/film/src/recipe.ts +2 -1
  162. package/packages/film/src/surface.ts +6 -6
  163. package/packages/film-studio/package.json +1 -1
  164. package/packages/film-studio/src/index.ts +2 -2
  165. package/packages/fishaudio-speech/README.md +33 -0
  166. package/packages/fishaudio-speech/package.json +21 -0
  167. package/packages/fishaudio-speech/src/activation.ts +32 -0
  168. package/packages/fishaudio-speech/src/fragment.ts +11 -0
  169. package/packages/fishaudio-speech/src/index.ts +156 -0
  170. package/packages/fishaudio-speech/src/surface.ts +192 -0
  171. package/packages/fonts-open/README.md +5 -0
  172. package/packages/fonts-open/package.json +5 -1
  173. package/packages/fonts-open/src/studio.ts +21 -0
  174. package/packages/generation/README.md +11 -1
  175. package/packages/generation/src/mapping.ts +28 -30
  176. package/packages/gpt-image/README.md +1 -2
  177. package/packages/grok-imagine/README.md +1 -2
  178. package/packages/hyperframes/README.md +7 -3
  179. package/packages/hyperframes/src/browser-program.ts +11 -2
  180. package/packages/hyperframes/src/document.ts +15 -2
  181. package/packages/interview-emoji-reveal/README.md +4 -4
  182. package/packages/interview-emoji-reveal/package.json +1 -1
  183. package/packages/interview-emoji-reveal/src/component.ts +4 -4
  184. package/packages/interview-emoji-reveal/src/fragment.ts +6 -5
  185. package/packages/interview-emoji-reveal/src/manifest.ts +9 -8
  186. package/packages/interview-emoji-reveal/src/program.ts +14 -14
  187. package/packages/interview-emoji-reveal/src/surface.ts +8 -9
  188. package/packages/media-execution/README.md +7 -3
  189. package/packages/media-execution/src/audio-presentation.ts +23 -0
  190. package/packages/media-execution/src/execute.ts +2 -0
  191. package/packages/media-pipeline/README.md +7 -3
  192. package/packages/media-pipeline/src/audio-plan.ts +4 -1
  193. package/packages/media-pipeline/src/component.ts +16 -2
  194. package/packages/media-pipeline/src/manifest.ts +3 -1
  195. package/packages/media-pipeline/src/types.ts +2 -1
  196. package/packages/media-track/README.md +14 -47
  197. package/packages/media-track/package.json +1 -1
  198. package/packages/media-track/preview/preview.svml +5 -5
  199. package/packages/media-track/src/author.ts +12 -6
  200. package/packages/media-track/src/component.ts +10 -16
  201. package/packages/media-track/src/fragment.ts +8 -7
  202. package/packages/media-track/src/index.ts +3 -1
  203. package/packages/media-track/src/lower.ts +7 -7
  204. package/packages/media-track/src/manifest.ts +16 -38
  205. package/packages/media-track/src/program.ts +62 -67
  206. package/packages/media-track/src/sampling.ts +6 -6
  207. package/packages/media-track/src/sequence.ts +8 -8
  208. package/packages/media-track/src/surface.ts +25 -43
  209. package/packages/media-track-studio/README.md +9 -0
  210. package/packages/media-track-studio/src/index.ts +23 -13
  211. package/packages/mimo-speech/README.md +1 -1
  212. package/packages/minimax-h3/README.md +1 -1
  213. package/packages/nano-banana/README.md +1 -1
  214. package/packages/narrative/README.md +23 -1
  215. package/packages/narrative/src/identity.ts +11 -0
  216. package/packages/narrative/src/index.ts +3 -0
  217. package/packages/narrative/src/schema.ts +28 -27
  218. package/packages/narrative/src/selection.ts +52 -0
  219. package/packages/narrative/src/types.ts +2 -0
  220. package/packages/package-loader-node/README.md +30 -0
  221. package/packages/package-loader-node/package.json +5 -2
  222. package/packages/package-loader-node/src/distribution-resolution.ts +10 -3
  223. package/packages/package-loader-node/src/index.ts +1 -0
  224. package/packages/package-loader-node/src/loader.ts +12 -15
  225. package/packages/package-loader-node/src/location.ts +27 -1
  226. package/packages/package-loader-node/src/module-scope.ts +183 -0
  227. package/packages/package-loader-node/src/types.ts +4 -0
  228. package/packages/performance/README.md +83 -0
  229. package/packages/performance/package.json +30 -0
  230. package/packages/performance/src/activation.ts +11 -0
  231. package/packages/performance/src/component.ts +46 -0
  232. package/packages/performance/src/index.ts +6 -0
  233. package/packages/performance/src/manifest.ts +53 -0
  234. package/packages/{media-track/src/performance.ts → performance/src/media.ts} +9 -10
  235. package/packages/performance/src/program.ts +51 -0
  236. package/packages/performance/src/style.ts +35 -0
  237. package/packages/performance/src/surface.ts +99 -0
  238. package/packages/performance-studio/README.md +25 -0
  239. package/packages/performance-studio/package.json +21 -0
  240. package/packages/performance-studio/src/activation.ts +6 -0
  241. package/packages/performance-studio/src/index.ts +84 -0
  242. package/packages/program-space/README.md +9 -18
  243. package/packages/program-space/src/activation.ts +1 -5
  244. package/packages/program-space/src/index.ts +2 -11
  245. package/packages/program-space/src/surface.ts +1 -20
  246. package/packages/project-context-node/README.md +20 -0
  247. package/packages/project-context-node/package.json +10 -0
  248. package/packages/project-context-node/src/index.ts +3 -0
  249. package/packages/{cli → project-context-node}/src/runtime-selection.ts +7 -2
  250. package/packages/provider-hyperframes-local/README.md +43 -15
  251. package/packages/provider-hyperframes-local/src/activation.ts +4 -3
  252. package/packages/provider-hyperframes-local/src/capture-process.ts +26 -4
  253. package/packages/provider-hyperframes-local/src/capture.ts +96 -26
  254. package/packages/provider-hyperframes-local/src/concurrency.ts +86 -0
  255. package/packages/provider-hyperframes-local/src/opaque-capture.ts +92 -0
  256. package/packages/provider-hyperframes-local/src/options.ts +2 -0
  257. package/packages/provider-hyperframes-local/src/program.ts +6 -3
  258. package/packages/provider-hyperframes-local/src/progress.ts +53 -0
  259. package/packages/provider-hyperframes-local/src/provider.ts +18 -5
  260. package/packages/provider-hyperframes-local/src/render.ts +48 -7
  261. package/packages/provider-hypihub/README.md +48 -17
  262. package/packages/provider-hypihub/package.json +2 -0
  263. package/packages/provider-hypihub/src/mapping.ts +31 -7
  264. package/packages/provider-hypihub/src/oauth.ts +6 -0
  265. package/packages/provider-hypihub/src/provider.ts +25 -13
  266. package/packages/provider-hypihub/src/routes.ts +1 -2
  267. package/packages/provider-hypihub/src/upload.ts +2 -0
  268. package/packages/provider-media-local/README.md +3 -4
  269. package/packages/provider-whisperx-local/README.md +57 -0
  270. package/packages/provider-whisperx-local/src/program.ts +1 -0
  271. package/packages/provider-whisperx-local/src/provider.ts +3 -0
  272. package/packages/ranking/README.md +8 -6
  273. package/packages/ranking/package.json +1 -1
  274. package/packages/ranking/src/component.ts +6 -6
  275. package/packages/ranking/src/fragment.ts +11 -7
  276. package/packages/ranking/src/manifest.ts +21 -14
  277. package/packages/ranking/src/render.ts +33 -35
  278. package/packages/ranking/src/schedule.ts +16 -19
  279. package/packages/ranking/src/surface.ts +12 -13
  280. package/packages/ranking-studio/README.md +29 -0
  281. package/packages/ranking-studio/package.json +8 -3
  282. package/packages/ranking-studio/src/index.ts +71 -12
  283. package/packages/render-hyperframes/README.md +7 -7
  284. package/packages/render-hyperframes/package.json +1 -1
  285. package/packages/render-hyperframes/src/component.ts +11 -1
  286. package/packages/render-hyperframes/src/fragment.ts +7 -4
  287. package/packages/render-hyperframes/src/manifest.ts +4 -4
  288. package/packages/render-hyperframes/src/surface.ts +6 -6
  289. package/packages/runtime/README.md +8 -1
  290. package/packages/runtime/src/catalog.ts +2 -0
  291. package/packages/runtime/src/execution.ts +15 -4
  292. package/packages/runtime/src/index.ts +2 -1
  293. package/packages/runtime/src/log.ts +51 -0
  294. package/packages/runtime/src/types.ts +5 -8
  295. package/packages/runtime-host-node/README.md +30 -0
  296. package/packages/runtime-host-node/package.json +1 -0
  297. package/packages/runtime-host-node/src/index.ts +25 -9
  298. package/packages/runtime-host-node/src/packages.ts +47 -50
  299. package/packages/runtime-kit/README.md +5 -0
  300. package/packages/runtime-kit/src/index.ts +3 -1
  301. package/packages/runtime-local/README.md +111 -4
  302. package/packages/runtime-local/src/config.ts +202 -56
  303. package/packages/runtime-local/src/control.ts +9 -1
  304. package/packages/runtime-local/src/executor.ts +66 -0
  305. package/packages/runtime-local/src/host.ts +37 -17
  306. package/packages/runtime-local/src/log.ts +48 -0
  307. package/packages/runtime-local/src/programs.ts +41 -25
  308. package/packages/runtime-local/src/result-writer.ts +2 -0
  309. package/packages/runtime-local/src/runtime.ts +10 -6
  310. package/packages/runtime-local/src/supervisor.ts +142 -0
  311. package/packages/runtime-local/src/types.ts +9 -2
  312. package/packages/runtime-local/src/worker-process.ts +7 -24
  313. package/packages/runtime-local/src/worker.ts +55 -83
  314. package/packages/screen-overlay/README.md +3 -3
  315. package/packages/screen-overlay/package.json +1 -1
  316. package/packages/screen-overlay/src/component.ts +3 -3
  317. package/packages/screen-overlay/src/fragment.ts +5 -4
  318. package/packages/screen-overlay/src/manifest.ts +7 -6
  319. package/packages/screen-overlay/src/program.ts +9 -9
  320. package/packages/screen-overlay/src/surface.ts +6 -7
  321. package/packages/script/README.md +37 -2
  322. package/packages/script/src/edit.ts +123 -73
  323. package/packages/script/src/lexical.ts +40 -6
  324. package/packages/script/src/manifest.ts +2 -2
  325. package/packages/script/src/narrative.ts +1 -0
  326. package/packages/script/src/parser.ts +36 -8
  327. package/packages/script/src/surface.ts +4 -3
  328. package/packages/script/src/types.ts +5 -1
  329. package/packages/script-studio/package.json +9 -3
  330. package/packages/script-studio/src/index.ts +2 -0
  331. package/packages/script-studio/src/projection.ts +105 -0
  332. package/packages/seedance/README.md +30 -1
  333. package/packages/seedance/src/index.ts +18 -7
  334. package/packages/seedance/src/surface.ts +17 -4
  335. package/packages/seedance-kits/README.md +10 -2
  336. package/packages/seedance-kits/kits/speaker-v1.svs +5 -5
  337. package/packages/seedream/README.md +1 -1
  338. package/packages/sound/README.md +81 -0
  339. package/packages/sound/package.json +25 -0
  340. package/packages/sound/src/activation.ts +11 -0
  341. package/packages/sound/src/component.ts +28 -0
  342. package/packages/sound/src/index.ts +5 -0
  343. package/packages/sound/src/manifest.ts +47 -0
  344. package/packages/sound/src/program.ts +84 -0
  345. package/packages/sound/src/style.ts +34 -0
  346. package/packages/sound/src/surface.ts +90 -0
  347. package/packages/sound-studio/README.md +22 -0
  348. package/packages/sound-studio/package.json +20 -0
  349. package/packages/sound-studio/src/activation.ts +6 -0
  350. package/packages/sound-studio/src/index.ts +74 -0
  351. package/packages/speech/README.md +2 -2
  352. package/packages/speech-alignment/src/align.ts +45 -21
  353. package/packages/speech-alignment/src/local.ts +8 -0
  354. package/packages/speech-alignment/src/locate.ts +1 -1
  355. package/packages/store-sqlite/README.md +7 -0
  356. package/packages/store-sqlite/src/store.ts +84 -83
  357. package/packages/studio/INSPECTOR.md +117 -0
  358. package/packages/studio/README.md +149 -14
  359. package/packages/studio/package.json +8 -7
  360. package/packages/studio/src/build-library.ts +99 -84
  361. package/packages/studio/src/companion-assembly.ts +1 -0
  362. package/packages/studio/src/domain.ts +1 -1
  363. package/packages/studio/src/fallback-companions.ts +3 -3
  364. package/packages/studio/src/feedback-server.ts +51 -0
  365. package/packages/studio/src/feedback-store.ts +66 -0
  366. package/packages/studio/src/feedback.ts +60 -0
  367. package/packages/studio/src/library-media.ts +19 -0
  368. package/packages/studio/src/parameter-values.ts +83 -1
  369. package/packages/studio/src/parameters.ts +132 -43
  370. package/packages/studio/src/preview/render.ts +5 -1
  371. package/packages/studio/src/preview/runtime-shim.ts +49 -3
  372. package/packages/studio/src/programme.ts +14 -30
  373. package/packages/studio/src/server.ts +66 -34
  374. package/packages/studio/src/shared.ts +24 -8
  375. package/packages/studio/src/snapshot.ts +21 -132
  376. package/packages/studio/src/studio-preflight.ts +3 -3
  377. package/packages/studio/src/studio-registry.ts +72 -6
  378. package/packages/studio/src/style.css +342 -190
  379. package/packages/studio/src/temporal-edit.ts +131 -0
  380. package/packages/studio/src/ui/artifact-name.ts +80 -0
  381. package/packages/studio/src/ui/artifact-preview.ts +99 -0
  382. package/packages/studio/src/ui/comments.ts +233 -0
  383. package/packages/studio/src/ui/icons.ts +10 -1
  384. package/packages/studio/src/ui/library.ts +373 -192
  385. package/packages/studio/src/ui/main.ts +291 -110
  386. package/packages/studio/src/ui/material-preview.ts +1 -1
  387. package/packages/studio/src/ui/overlay.ts +31 -26
  388. package/packages/studio/src/ui/scrub-preview.ts +108 -0
  389. package/packages/studio/src/ui/sidebar-panel.ts +31 -0
  390. package/packages/studio/src/ui/stage.ts +188 -9
  391. package/packages/studio/src/ui/timeline.ts +187 -281
  392. package/packages/studio/start.ts +19 -5
  393. package/packages/studio-adapter/README.md +151 -11
  394. package/packages/studio-adapter/src/index.ts +126 -14
  395. package/packages/temporal/README.md +6 -6
  396. package/packages/temporal/package.json +1 -1
  397. package/packages/temporal/src/component.ts +5 -6
  398. package/packages/temporal/src/index.ts +8 -6
  399. package/packages/temporal/src/location.ts +11 -11
  400. package/packages/temporal/src/projection.ts +19 -19
  401. package/packages/temporal/src/rational.ts +4 -4
  402. package/packages/temporal-markup/EDITING.md +183 -0
  403. package/packages/temporal-markup/README.md +31 -11
  404. package/packages/temporal-markup/package.json +1 -1
  405. package/packages/temporal-markup/src/index.ts +20 -25
  406. package/packages/temporal-markup/src/space.ts +10 -41
  407. package/packages/timeline/README.md +31 -0
  408. package/packages/{semantic-track → timeline}/package.json +1 -1
  409. package/packages/timeline/src/activation.ts +8 -0
  410. package/packages/timeline/src/component.ts +24 -0
  411. package/packages/timeline/src/identity.ts +60 -0
  412. package/packages/timeline/src/index.ts +6 -0
  413. package/packages/{semantic-track → timeline}/src/location.ts +20 -20
  414. package/packages/timeline/src/manifest.ts +39 -0
  415. package/packages/{semantic-track → timeline}/src/projection.ts +14 -14
  416. package/packages/timeline/src/types.ts +24 -0
  417. package/packages/timeline-author/README.md +68 -0
  418. package/packages/{speech-track → timeline-author}/package.json +6 -4
  419. package/packages/timeline-author/src/activation.ts +22 -0
  420. package/packages/{speech-track → timeline-author}/src/component.ts +15 -13
  421. package/packages/{speech-track → timeline-author}/src/fragment.ts +14 -23
  422. package/packages/timeline-author/src/index.ts +7 -0
  423. package/packages/timeline-author/src/manifest.ts +78 -0
  424. package/packages/timeline-author/src/program.ts +107 -0
  425. package/packages/timeline-author/src/surface.ts +46 -0
  426. package/packages/timeline-author/src/types.ts +6 -0
  427. package/packages/typography-track/README.md +4 -4
  428. package/packages/typography-track/package.json +1 -1
  429. package/packages/typography-track/src/component.ts +4 -4
  430. package/packages/typography-track/src/fragment.ts +4 -3
  431. package/packages/typography-track/src/manifest.ts +11 -9
  432. package/packages/typography-track/src/program.ts +15 -15
  433. package/packages/typography-track/src/surface.ts +17 -18
  434. package/packages/typography-track-studio/package.json +8 -3
  435. package/packages/typography-track-studio/src/index.ts +5 -1
  436. package/packages/video-cli/README.md +16 -4
  437. package/packages/video-cli/package.json +2 -1
  438. package/packages/video-cli/src/creation.ts +25 -9
  439. package/packages/video-cli/src/index.ts +1 -1
  440. package/packages/video-cli/src/studio-distribution.ts +2 -1
  441. package/packages/volcengine-matting/README.md +3 -3
  442. package/packages/whisperx/README.md +8 -1
  443. package/packages/workspace/src/index.ts +2 -0
  444. package/packages/workspace-fs-node/README.md +4 -1
  445. package/packages/workspace-fs-node/src/workspace.ts +3 -1
  446. package/services/whisperx/README.md +14 -0
  447. package/services/whisperx/pyproject.toml +2 -0
  448. package/services/whisperx/uv.lock +20 -20
  449. package/packages/provider-hyperframes-aws-lambda/README.md +0 -30
  450. package/packages/provider-hyperframes-aws-lambda/package.json +0 -30
  451. package/packages/provider-hyperframes-aws-lambda/src/activation.ts +0 -97
  452. package/packages/provider-hyperframes-aws-lambda/src/client.ts +0 -114
  453. package/packages/provider-hyperframes-aws-lambda/src/index.ts +0 -21
  454. package/packages/provider-hyperframes-aws-lambda/src/provider.ts +0 -522
  455. package/packages/provider-kie/README.md +0 -134
  456. package/packages/provider-kie/package.json +0 -43
  457. package/packages/provider-kie/src/activation.ts +0 -71
  458. package/packages/provider-kie/src/index.ts +0 -10
  459. package/packages/provider-kie/src/mapping.ts +0 -182
  460. package/packages/provider-kie/src/provider.ts +0 -657
  461. package/packages/provider-kie/src/routes.ts +0 -150
  462. package/packages/provider-xiaomi-mimo/README.md +0 -32
  463. package/packages/provider-xiaomi-mimo/src/activation.ts +0 -57
  464. package/packages/provider-xiaomi-mimo/src/index.ts +0 -5
  465. package/packages/provider-xiaomi-mimo/src/provider.ts +0 -214
  466. package/packages/runtime/src/environment.ts +0 -6
  467. package/packages/semantic-track/README.md +0 -21
  468. package/packages/semantic-track/src/activation.ts +0 -8
  469. package/packages/semantic-track/src/component.ts +0 -24
  470. package/packages/semantic-track/src/identity.ts +0 -58
  471. package/packages/semantic-track/src/index.ts +0 -6
  472. package/packages/semantic-track/src/manifest.ts +0 -38
  473. package/packages/semantic-track/src/types.ts +0 -26
  474. package/packages/speech-track/README.md +0 -51
  475. package/packages/speech-track/src/activation.ts +0 -19
  476. package/packages/speech-track/src/index.ts +0 -7
  477. package/packages/speech-track/src/manifest.ts +0 -73
  478. package/packages/speech-track/src/program.ts +0 -64
  479. package/packages/speech-track/src/surface.ts +0 -35
  480. package/packages/speech-track/src/types.ts +0 -6
  481. package/packages/speech-track-studio/README.md +0 -3
  482. package/packages/speech-track-studio/package.json +0 -14
  483. package/packages/speech-track-studio/src/activation.ts +0 -7
  484. package/packages/speech-track-studio/src/index.ts +0 -40
  485. /package/packages/{cli → project-context-node}/src/project-context.ts +0 -0
  486. /package/packages/{speech-track → timeline-author}/preview/Track.png +0 -0
@@ -1,657 +0,0 @@
1
- import { requestDeadline } from "@hypit/runtime-kit";
2
- import type {
3
- AsyncEndpoint,
4
- EndpointPollContext,
5
- EndpointPricingReader,
6
- EndpointStartContext,
7
- EndpointOutcome,
8
- } from "@hypit/endpoint-kit";
9
- import {
10
- canonicalize,
11
- } from "@hypit/protocol";
12
- import type {
13
- BlobRef,
14
- CanonicalValue,
15
- ResourceId,
16
- } from "@hypit/protocol";
17
- import {
18
- defineEndpointPackage,
19
- wakeAfter,
20
- } from "@hypit/endpoint-kit";
21
- import { credentialRef, isStreamingResourceStore } from "@hypit/runtime";
22
- import type { ResourceStore, CredentialRef } from "@hypit/runtime";
23
-
24
- import {
25
- kieRouteForCapability,
26
- kieRoutes,
27
- verifyKieRoutes,
28
- } from "./routes.js";
29
- import type { KieTaskRequest } from "./routes.js";
30
-
31
- export const kieProviderModuleRef = { name: "@hypit/provider-kie", version: "1" } as const;
32
-
33
- type Fetch = typeof globalThis.fetch;
34
-
35
- export type CreateKieProviderOptions = {
36
- readonly instance?: string;
37
- readonly pool?: string;
38
- readonly apiBaseUrl?: string;
39
- readonly uploadBaseUrl?: string;
40
- readonly apiKey?: CredentialRef;
41
- /** Total in-flight capacity shared by every KIE lane. */
42
- readonly defaultConcurrency?: number;
43
- /** Optional KIE lane limits keyed by capability name, for example seedance-2.5. */
44
- readonly capabilityConcurrency?: Readonly<Record<string, number>>;
45
- readonly pollIntervalMs?: number;
46
- readonly actionLimits?: import("@hypit/endpoint-kit").EndpointActionLimits;
47
- readonly requestTimeoutMs?: number;
48
- readonly maxOperationMs?: number;
49
- readonly maxArtifactBytes?: number;
50
- readonly fetch?: Fetch;
51
- readonly now?: () => number;
52
- };
53
-
54
- type KieHandle = {
55
- readonly taskId: string;
56
- readonly routeKey: string;
57
- readonly startedAt: number;
58
- };
59
-
60
- class KieError extends Error {
61
- readonly code: string;
62
- readonly status: number | undefined;
63
-
64
- constructor(code: string, message: string, options: { readonly status?: number } = {}) {
65
- super(message);
66
- this.name = "KieError";
67
- this.code = code;
68
- this.status = options.status;
69
- }
70
- }
71
-
72
- function assert(condition: unknown, message: string): asserts condition {
73
- if (!condition) throw new Error(message);
74
- }
75
-
76
- function positiveInteger(value: number, subject: string): number {
77
- assert(Number.isSafeInteger(value) && value > 0, `${subject} must be a positive safe integer`);
78
- return value;
79
- }
80
-
81
- function nonNegativeInteger(value: number, subject: string): number {
82
- assert(Number.isSafeInteger(value) && value >= 0, `${subject} must be a non-negative safe integer`);
83
- return value;
84
- }
85
-
86
- function baseUrl(value: string, subject: string): string {
87
- const url = new URL(value);
88
- assert(url.protocol === "https:" || url.hostname === "localhost", `${subject} must use HTTPS or localhost`);
89
- return url.href.replace(/\/$/u, "");
90
- }
91
-
92
- function object(value: unknown, subject: string): Record<string, unknown> {
93
- if (value === null || typeof value !== "object" || Array.isArray(value)) throw new KieError("KIE_INVALID_RESPONSE", `${subject} is not an object`);
94
- return value as Record<string, unknown>;
95
- }
96
-
97
- function secret(context: EndpointStartContext | EndpointPollContext): string {
98
- const value = context.credentials.apiKey?.secret;
99
- if (value === undefined || value.length === 0) throw new KieError("KIE_MISSING_CREDENTIAL", "KIE API key is unavailable");
100
- return value;
101
- }
102
-
103
- function mediaExtension(mediaType: string): string {
104
- const known: Readonly<Record<string, string>> = {
105
- "image/jpeg": "jpg",
106
- "image/png": "png",
107
- "image/webp": "webp",
108
- "video/mp4": "mp4",
109
- "video/quicktime": "mov",
110
- "audio/mpeg": "mp3",
111
- "audio/wav": "wav",
112
- "audio/x-wav": "wav",
113
- };
114
- return known[mediaType] ?? "bin";
115
- }
116
-
117
- type KieClientOptions = {
118
- readonly apiBaseUrl: string;
119
- readonly uploadBaseUrl: string;
120
- readonly requestTimeoutMs: number;
121
- readonly maxArtifactBytes: number;
122
- readonly fetch: Fetch;
123
- };
124
-
125
- class KieClient {
126
- readonly #options: KieClientOptions;
127
- readonly #pricingRecords = new Map<string, Promise<readonly Record<string, unknown>[]>>();
128
-
129
- constructor(options: KieClientOptions) {
130
- this.#options = options;
131
- }
132
-
133
- async #open(url: string, init: RequestInit): Promise<{
134
- readonly response: Response;
135
- readonly wait: <T>(work: Promise<T>) => Promise<T>;
136
- readonly finish: () => void;
137
- }> {
138
- const deadline = requestDeadline(this.#options.requestTimeoutMs, () => new KieError("KIE_REQUEST_TIMEOUT", "KIE request timed out"));
139
- const { wait, finish } = deadline;
140
- try {
141
- const response = await wait(this.#options.fetch(url, { ...init, signal: deadline.signal }));
142
- return { response, wait, finish };
143
- } catch (error) {
144
- finish();
145
- if (error instanceof KieError) throw error;
146
- throw new KieError("KIE_NETWORK_ERROR", error instanceof Error ? error.message : "KIE network request failed");
147
- }
148
- }
149
-
150
- async #json(url: string, init: RequestInit): Promise<Record<string, unknown>> {
151
- const opened = await this.#open(url, init);
152
- try {
153
- const response = opened.response;
154
- if (!response.ok) {
155
- throw new KieError("KIE_HTTP_ERROR", `KIE returned HTTP ${response.status}`, { status: response.status });
156
- }
157
- const limit = 2_000_000;
158
- const reader = response.body?.getReader();
159
- let text: string;
160
- if (reader === undefined) {
161
- const bytes = new Uint8Array(await opened.wait(response.arrayBuffer()));
162
- if (bytes.byteLength > limit) throw new KieError("KIE_RESPONSE_TOO_LARGE", "KIE JSON response is too large");
163
- text = new TextDecoder().decode(bytes);
164
- } else {
165
- const decoder = new TextDecoder();
166
- let size = 0;
167
- let decoded = "";
168
- try {
169
- while (true) {
170
- const item = await opened.wait(reader.read());
171
- if (item.done) break;
172
- size += item.value.byteLength;
173
- if (size > limit) {
174
- await reader.cancel();
175
- throw new KieError("KIE_RESPONSE_TOO_LARGE", "KIE JSON response is too large");
176
- }
177
- decoded += decoder.decode(item.value, { stream: true });
178
- }
179
- text = decoded + decoder.decode();
180
- } finally {
181
- reader.releaseLock();
182
- }
183
- }
184
- try {
185
- return object(JSON.parse(text), "KIE response");
186
- } catch (error) {
187
- if (error instanceof KieError) throw error;
188
- throw new KieError("KIE_INVALID_JSON", "KIE returned invalid JSON");
189
- }
190
- } catch (error) {
191
- if (error instanceof KieError) throw error;
192
- throw new KieError("KIE_NETWORK_ERROR", error instanceof Error ? error.message : "KIE network request failed");
193
- } finally {
194
- opened.finish();
195
- }
196
- }
197
-
198
- get pricingSource(): string {
199
- return `${this.#options.apiBaseUrl}/client/v1/model-pricing/page`;
200
- }
201
-
202
- async pricingRecords(model: string): Promise<readonly Record<string, unknown>[]> {
203
- let pending = this.#pricingRecords.get(model);
204
- if (pending === undefined) {
205
- pending = (async () => {
206
- const records: Record<string, unknown>[] = [];
207
- let page = 1;
208
- let pages = 1;
209
- while (page <= pages) {
210
- const response = await this.#json(this.pricingSource, {
211
- method: "POST",
212
- headers: { "content-type": "application/json" },
213
- body: JSON.stringify({ pageNum: page, pageSize: 100, modelDescription: model, interfaceType: "" }),
214
- });
215
- assert(response.code === 200, "KIE pricing service rejected the rate-card request");
216
- const data = object(response.data, "KIE pricing data");
217
- assert(Array.isArray(data.records), "KIE pricing data contains no records array");
218
- for (const value of data.records) records.push(object(value, "KIE pricing record"));
219
- const reportedPages = data.pages;
220
- assert(typeof reportedPages === "number" && Number.isSafeInteger(reportedPages)
221
- && reportedPages >= 0 && reportedPages <= 100, "KIE pricing page count is invalid");
222
- pages = reportedPages;
223
- page += 1;
224
- }
225
- return records;
226
- })();
227
- this.#pricingRecords.set(model, pending);
228
- }
229
- return await pending;
230
- }
231
-
232
- async upload(artifact: BlobRef, resources: ResourceStore, apiKey: string): Promise<string> {
233
- if (artifact.size > this.#options.maxArtifactBytes) {
234
- throw new KieError("KIE_ARTIFACT_TOO_LARGE", `Artifact ${artifact.resource} exceeds the configured KIE upload limit`);
235
- }
236
- const fileName = `${artifact.resource}.${mediaExtension(artifact.mediaType)}`;
237
- const boundary = `hypit-${artifact.resource}`;
238
- const encode = (value: string) => new TextEncoder().encode(value);
239
- const fileHead = encode(
240
- `--${boundary}\r\nContent-Disposition: form-data; name="file"; filename="${fileName}"\r\n`
241
- + `Content-Type: ${artifact.mediaType}\r\n\r\n`,
242
- );
243
- const fields = encode(
244
- `\r\n--${boundary}\r\nContent-Disposition: form-data; name="uploadPath"\r\n\r\nhypit/resources`
245
- + `\r\n--${boundary}\r\nContent-Disposition: form-data; name="fileName"\r\n\r\n${fileName}`
246
- + `\r\n--${boundary}--\r\n`,
247
- );
248
- const source = isStreamingResourceStore(resources)
249
- ? await resources.open(artifact.resource)
250
- : await resources.get(artifact.resource).then((bytes) => bytes === undefined
251
- ? undefined
252
- : (async function* () { yield bytes; })());
253
- if (source === undefined) {
254
- throw new KieError("KIE_ARTIFACT_MISSING", `Artifact ${artifact.resource} is unavailable`);
255
- }
256
- const maximum = this.#options.maxArtifactBytes;
257
- const multipart = (async function* () {
258
- yield fileHead;
259
- let size = 0;
260
- for await (const chunk of source) {
261
- size += chunk.byteLength;
262
- if (size > artifact.size || size > maximum) {
263
- throw new KieError("KIE_ARTIFACT_SIZE_MISMATCH", `Artifact ${artifact.resource} size differs`);
264
- }
265
- yield chunk;
266
- }
267
- if (size !== artifact.size) {
268
- throw new KieError("KIE_ARTIFACT_SIZE_MISMATCH", `Artifact ${artifact.resource} size differs`);
269
- }
270
- yield fields;
271
- })();
272
- let response: Record<string, unknown>;
273
- try {
274
- response = await this.#json(`${this.#options.uploadBaseUrl}/api/file-stream-upload`, {
275
- method: "POST",
276
- headers: {
277
- authorization: `Bearer ${apiKey}`,
278
- "content-type": `multipart/form-data; boundary=${boundary}`,
279
- "content-length": String(fileHead.byteLength + artifact.size + fields.byteLength),
280
- },
281
- body: multipart as unknown as BodyInit,
282
- duplex: "half",
283
- } as RequestInit & { duplex: "half" });
284
- } catch (error) {
285
- if (error instanceof KieError) {
286
- throw new KieError("KIE_UPLOAD_FAILED", error.message, {
287
- ...(error.status === undefined ? {} : { status: error.status }),
288
- });
289
- }
290
- throw error;
291
- }
292
- const data = object(response.data, "KIE upload data");
293
- const url = typeof data.downloadUrl === "string" ? data.downloadUrl
294
- : typeof data.fileUrl === "string" ? data.fileUrl : undefined;
295
- if (url === undefined || new URL(url).protocol !== "https:") {
296
- throw new KieError("KIE_UPLOAD_INVALID", "KIE upload returned no HTTPS URL");
297
- }
298
- return url;
299
- }
300
-
301
- async createTask(task: KieTaskRequest, apiKey: string): Promise<string> {
302
- let response: Record<string, unknown>;
303
- try {
304
- response = await this.#json(`${this.#options.apiBaseUrl}/api/v1/jobs/createTask`, {
305
- method: "POST",
306
- headers: {
307
- authorization: `Bearer ${apiKey}`,
308
- "content-type": "application/json",
309
- },
310
- body: JSON.stringify({ model: task.model, input: task.input }),
311
- });
312
- if (response.code !== undefined && response.code !== 200) {
313
- const vendorMessage = typeof response.msg === "string" && response.msg.length > 0
314
- ? response.msg.slice(0, 500) : "KIE rejected createTask";
315
- throw new KieError(
316
- "KIE_SUBMISSION_REJECTED",
317
- `${vendorMessage} (KIE code ${String(response.code).slice(0, 100)})`,
318
- );
319
- }
320
- } catch (error) {
321
- if (error instanceof KieError) {
322
- if (error.code === "KIE_SUBMISSION_REJECTED") throw error;
323
- if (error.status === 429) {
324
- throw new KieError("KIE_RATE_LIMITED", "KIE createTask was rate limited", { status: 429 });
325
- }
326
- if (error.status !== undefined && error.status >= 400 && error.status < 500) {
327
- throw new KieError("KIE_SUBMISSION_REJECTED", error.message, { status: error.status });
328
- }
329
- throw new KieError("KIE_SUBMISSION_FAILED", error.message,
330
- error.status === undefined ? {} : { status: error.status });
331
- }
332
- throw error;
333
- }
334
- const data = object(response.data, "KIE createTask data");
335
- if (typeof data.taskId !== "string" || data.taskId.length === 0) {
336
- throw new KieError("KIE_SUBMISSION_INVALID", "KIE createTask returned no taskId");
337
- }
338
- return data.taskId;
339
- }
340
-
341
- async taskInfo(taskId: string, apiKey: string): Promise<Record<string, unknown>> {
342
- const response = await this.#json(
343
- `${this.#options.apiBaseUrl}/api/v1/jobs/recordInfo?taskId=${encodeURIComponent(taskId)}`,
344
- { method: "GET", headers: { authorization: `Bearer ${apiKey}` } },
345
- );
346
- return object(response.data, "KIE task data");
347
- }
348
-
349
- async #downloadUrl(original: string, apiKey: string): Promise<string> {
350
- const response = await this.#json(`${this.#options.apiBaseUrl}/api/v1/common/download-url`, {
351
- method: "POST",
352
- headers: {
353
- authorization: `Bearer ${apiKey}`,
354
- "content-type": "application/json",
355
- },
356
- body: JSON.stringify({ url: original }),
357
- });
358
- if (typeof response.data !== "string" || new URL(response.data).protocol !== "https:") {
359
- throw new KieError("KIE_DOWNLOAD_URL_INVALID", "KIE returned no HTTPS download URL");
360
- }
361
- return response.data;
362
- }
363
-
364
- async download(original: string, expected: "image" | "video", apiKey: string): Promise<{
365
- chunks: AsyncIterable<Uint8Array>;
366
- mediaType: string;
367
- }> {
368
- const url = await this.#downloadUrl(original, apiKey);
369
- const opened = await this.#open(url, { method: "GET" });
370
- let handedOff = false;
371
- try {
372
- const response = opened.response;
373
- if (!response.ok) throw new KieError("KIE_DOWNLOAD_FAILED", `KIE artifact download returned HTTP ${response.status}`);
374
- const declared = Number(response.headers.get("content-length"));
375
- if (Number.isFinite(declared) && declared > this.#options.maxArtifactBytes) {
376
- throw new KieError("KIE_ARTIFACT_TOO_LARGE", "KIE result exceeds the configured artifact limit");
377
- }
378
- const header = response.headers.get("content-type")?.split(";", 1)[0]?.trim().toLowerCase();
379
- const fallback = expected === "image" ? "image/png" : "video/mp4";
380
- const mediaType = header === undefined || header === "application/octet-stream" ? fallback : header;
381
- if (!mediaType.startsWith(`${expected}/`)) {
382
- throw new KieError("KIE_RESULT_MEDIA_MISMATCH", `KIE returned ${mediaType} for ${expected} generation`);
383
- }
384
- const maximum = this.#options.maxArtifactBytes;
385
- const finish = opened.finish;
386
- const chunks = response.body === null
387
- ? (async function* () {
388
- try {
389
- const bytes = new Uint8Array(await opened.wait(response.arrayBuffer()));
390
- if (bytes.byteLength > maximum) throw new KieError("KIE_ARTIFACT_TOO_LARGE", "KIE result is too large");
391
- yield bytes;
392
- } catch (error) {
393
- if (error instanceof KieError) throw error;
394
- throw new KieError("KIE_NETWORK_ERROR", error instanceof Error ? error.message : "KIE result download failed");
395
- } finally {
396
- finish();
397
- }
398
- })()
399
- : (async function* () {
400
- const reader = response.body!.getReader();
401
- let size = 0;
402
- try {
403
- while (true) {
404
- const item = await opened.wait(reader.read());
405
- if (item.done) break;
406
- size += item.value.byteLength;
407
- if (size > maximum) {
408
- await reader.cancel();
409
- throw new KieError("KIE_ARTIFACT_TOO_LARGE", "KIE result is too large");
410
- }
411
- yield item.value;
412
- }
413
- } catch (error) {
414
- if (error instanceof KieError) throw error;
415
- throw new KieError("KIE_NETWORK_ERROR", error instanceof Error ? error.message : "KIE result download failed");
416
- } finally {
417
- reader.releaseLock();
418
- finish();
419
- }
420
- })();
421
- handedOff = true;
422
- return { chunks, mediaType };
423
- } finally {
424
- if (!handedOff) opened.finish();
425
- }
426
- }
427
- }
428
-
429
- function kiePricingReader(client: KieClient): EndpointPricingReader {
430
- return async ({ request }) => {
431
- const route = kieRouteForCapability(request.capability);
432
- if (route === undefined) return [];
433
- const selectedModel = route.selectModel(request);
434
- const records = await client.pricingRecords(selectedModel);
435
- if (records.length === 0) return [];
436
- const lines = records.map((record) => {
437
- if (typeof record.modelDescription !== "string" || typeof record.creditUnit !== "string") return undefined;
438
- const value = (item: unknown) => typeof item === "string" || typeof item === "number" ? String(item) : undefined;
439
- const usd = value(record.usdPrice);
440
- const credits = value(record.creditPrice);
441
- if (usd === undefined && credits === undefined) return undefined;
442
- const amounts = [usd === undefined ? undefined : `USD ${usd}`, credits === undefined ? undefined : `${credits} credits`];
443
- return `${record.modelDescription}: ${amounts.filter((item) => item !== undefined).join("; ")} (${record.creditUnit})`;
444
- });
445
- return [{
446
- source: client.pricingSource,
447
- data: canonicalize({ model: selectedModel, records }),
448
- ...(lines.every((line) => line !== undefined) ? { summary: lines.join("\n") } : {}),
449
- }];
450
- };
451
- }
452
-
453
- function resultUrls(data: Record<string, unknown>): string[] {
454
- let result: unknown = data.resultJson;
455
- if (typeof result === "string") {
456
- try { result = JSON.parse(result); } catch { throw new KieError("KIE_RESULT_INVALID", "KIE resultJson is invalid JSON"); }
457
- }
458
- const value = object(result, "KIE resultJson");
459
- const candidate = value.resultUrls ?? value.result_urls ?? value.urls;
460
- if (!Array.isArray(candidate) || candidate.length === 0 || candidate.some((item) => typeof item !== "string")) {
461
- throw new KieError("KIE_RESULT_MISSING", "KIE successful task returned no result URLs");
462
- }
463
- return candidate.map((item) => {
464
- const url = new URL(item as string);
465
- if (url.protocol !== "https:") throw new KieError("KIE_RESULT_URL_INVALID", "KIE result URL must use HTTPS");
466
- return url.href;
467
- });
468
- }
469
-
470
- function readHandle(value: CanonicalValue | undefined, context: EndpointPollContext): KieHandle {
471
- if (value === undefined) {
472
- throw new KieError(
473
- "KIE_SUBMISSION_HANDLE_MISSING",
474
- "KIE Operation has no task handle",
475
- );
476
- }
477
- const handle = object(value, "KIE handle") as unknown as KieHandle;
478
- const route = kieRouteForCapability(context.need.capability);
479
- if (typeof handle.taskId !== "string"
480
- || route === undefined
481
- || handle.routeKey !== route.key
482
- || !Number.isSafeInteger(handle.startedAt)) {
483
- throw new KieError("KIE_HANDLE_INVALID", "KIE handle does not match the current Need");
484
- }
485
- return handle;
486
- }
487
-
488
- function endpoint(options: {
489
- readonly client: KieClient;
490
- readonly pollIntervalMs: number;
491
- readonly maxOperationMs: number;
492
- readonly now: () => number;
493
- }): AsyncEndpoint {
494
- const failure = (error: unknown): EndpointOutcome => {
495
- const known = error instanceof KieError ? error : new KieError("KIE_INTERNAL_ERROR", error instanceof Error ? error.message : String(error));
496
- return {
497
- status: "failed",
498
- failure: {
499
- code: known.code,
500
- message: known.message,
501
- },
502
- };
503
- };
504
- return {
505
- async start(context) {
506
- try {
507
- const route = kieRouteForCapability(context.need.capability);
508
- if (route === undefined) throw new KieError("KIE_UNSUPPORTED_CAPABILITY", "KIE does not implement this exact capability");
509
- const key = secret(context);
510
- const uploaded = new Map<ResourceId, Promise<string>>();
511
- const resolve = (artifact: BlobRef): Promise<string> => {
512
- const existing = uploaded.get(artifact.resource);
513
- if (existing !== undefined) return existing;
514
- const promise = options.client.upload(artifact, context.resources, key);
515
- uploaded.set(artifact.resource, promise);
516
- return promise;
517
- };
518
- const task = await route.compile(context.need.constraints, resolve);
519
- const taskId = await options.client.createTask(task, key);
520
- const handle: KieHandle = {
521
- taskId,
522
- routeKey: route.key,
523
- startedAt: options.now(),
524
- };
525
- const receipt = { id: taskId };
526
- await context.checkpoint?.({ handle: canonicalize(handle), receipt });
527
- return { ...wakeAfter(canonicalize(handle), options.pollIntervalMs, options.now(), { phase: "submitted" }), receipt };
528
- } catch (error) {
529
- return failure(error);
530
- }
531
- },
532
- async poll(context) {
533
- let handle: KieHandle;
534
- try {
535
- handle = readHandle(context.handle, context);
536
- } catch (error) {
537
- throw error;
538
- }
539
- try {
540
- const route = kieRouteForCapability(context.need.capability);
541
- if (route === undefined || route.key !== handle.routeKey) {
542
- throw new KieError("KIE_HANDLE_INVALID", "KIE handle capability differs");
543
- }
544
- if (options.now() - handle.startedAt >= options.maxOperationMs) {
545
- throw new KieError("KIE_OPERATION_TIMEOUT", "KIE task exceeded its operation deadline");
546
- }
547
- const key = secret(context);
548
- const data = await options.client.taskInfo(handle.taskId, key);
549
- const state = data.state;
550
- if (state === "waiting" || state === "queuing" || state === "generating") {
551
- return wakeAfter(canonicalize(handle), options.pollIntervalMs, options.now(), {
552
- phase: state,
553
- });
554
- }
555
- if (state === "fail") {
556
- const vendorCode = typeof data.failCode === "string" && data.failCode.length > 0 ? data.failCode : "unknown";
557
- const vendorMessage = typeof data.failMsg === "string" && data.failMsg.length > 0
558
- ? data.failMsg.slice(0, 500) : "KIE task failed";
559
- throw new KieError("KIE_TASK_FAILED", `${vendorMessage} (${vendorCode})`);
560
- }
561
- if (state !== "success") throw new KieError("KIE_TASK_STATE_INVALID", "KIE returned an unknown task state");
562
- const urls = resultUrls(data);
563
- if (urls.length > route.maxResults) throw new KieError("KIE_RESULT_COUNT_EXCEEDED", "KIE returned too many result artifacts");
564
- return { status: "ready", handle: canonicalize({ ...handle, urls }), receipt: { id: handle.taskId } };
565
- } catch (error) {
566
- return failure(error);
567
- }
568
- },
569
- async collect(context) {
570
- readHandle(context.handle, context);
571
- const route = kieRouteForCapability(context.need.capability)!;
572
- const raw = object(context.handle, "KIE handle");
573
- const urls = raw.urls;
574
- if (!Array.isArray(urls) || !urls.every((url) => typeof url === "string")) throw new KieError("KIE_HANDLE_INVALID", "KIE collection has no artifact addresses");
575
- const key = secret(context);
576
- const artifacts: BlobRef[] = [];
577
- for (const url of urls) {
578
- const downloaded = await options.client.download(url, route.media, key);
579
- if (isStreamingResourceStore(context.resources)) {
580
- artifacts.push(await context.resources.putStream(downloaded.chunks, downloaded.mediaType));
581
- } else {
582
- const chunks: Uint8Array[] = [];
583
- let size = 0;
584
- for await (const chunk of downloaded.chunks) {
585
- chunks.push(Uint8Array.from(chunk));
586
- size += chunk.byteLength;
587
- }
588
- const bytes = new Uint8Array(size);
589
- let offset = 0;
590
- for (const chunk of chunks) {
591
- bytes.set(chunk, offset);
592
- offset += chunk.byteLength;
593
- }
594
- artifacts.push(await context.resources.put(bytes, downloaded.mediaType));
595
- }
596
- }
597
- const result = route.packageResult(artifacts);
598
- return {
599
- status: "completed",
600
- result: { value: result },
601
- };
602
- },
603
-
604
- };
605
- }
606
-
607
- export function createKieProvider(config: CreateKieProviderOptions) {
608
- verifyKieRoutes();
609
- const capacityNames = new Set(kieRoutes.map((route) => route.capability.name));
610
- const capabilityConcurrency = Object.fromEntries(Object.entries(config.capabilityConcurrency ?? {}).map(([capability, limit]) => {
611
- if (!capacityNames.has(capability)) throw new Error(`unknown KIE capacity ${capability}`);
612
- return [capability, positiveInteger(limit, `${capability} capabilityConcurrency`)];
613
- }));
614
- const apiBaseUrl = baseUrl(config.apiBaseUrl ?? "https://api.kie.ai", "apiBaseUrl");
615
- const uploadBaseUrl = baseUrl(config.uploadBaseUrl ?? "https://kieai.redpandaai.co", "uploadBaseUrl");
616
- const pollIntervalMs = nonNegativeInteger(config.pollIntervalMs ?? 3_000, "pollIntervalMs");
617
- const requestTimeoutMs = positiveInteger(config.requestTimeoutMs ?? 30_000, "requestTimeoutMs");
618
- const maxOperationMs = positiveInteger(config.maxOperationMs ?? 20 * 60_000, "maxOperationMs");
619
- const maxArtifactBytes = positiveInteger(config.maxArtifactBytes ?? 512 * 1024 * 1024, "maxArtifactBytes");
620
- const now = config.now ?? Date.now;
621
- const client = new KieClient({
622
- apiBaseUrl,
623
- uploadBaseUrl,
624
- requestTimeoutMs,
625
- maxArtifactBytes,
626
- fetch: config.fetch ?? globalThis.fetch,
627
- });
628
- const providerEndpoint = endpoint({
629
- client,
630
- pollIntervalMs,
631
- maxOperationMs,
632
- now,
633
- });
634
- return defineEndpointPackage({
635
- module: kieProviderModuleRef,
636
- facet: "market",
637
- instance: config.instance ?? "kie.default",
638
- pool: config.pool ?? config.instance ?? "kie.default",
639
- pricing: { kind: "page", url: "https://kie.ai/pricing" },
640
- readPricing: kiePricingReader(client),
641
- credentials: { apiKey: config.apiKey ?? credentialRef("env", "KIE_API_KEY") },
642
- credentialInputs: { apiKey: { label: "KIE API key" } },
643
- defaultConcurrency: config.defaultConcurrency ?? 10,
644
- ...(config.actionLimits === undefined ? {} : { actionLimits: config.actionLimits }),
645
- capabilities: kieRoutes.map((route) => ({
646
- capability: route.capability,
647
- returns: route.returns,
648
- capacity: route.capability.name,
649
- ...(capabilityConcurrency[route.capability.name] === undefined
650
- ? {}
651
- : { maxConcurrency: capabilityConcurrency[route.capability.name] }),
652
- lifecycle: "asynchronous" as const,
653
- endpoint: providerEndpoint,
654
- ...(route.supports === undefined ? {} : { supports: route.supports }),
655
- })),
656
- });
657
- }