@vfrey/vfrey 0.0.1 → 1.0.0-beta.1

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 (610) hide show
  1. package/LICENSE +33 -0
  2. package/README.md +78 -3
  3. package/accounts.example.json +61 -0
  4. package/accounts.first-run.json +41 -0
  5. package/bin/vfrey.mjs +36 -0
  6. package/integration-tools/README.md +43 -0
  7. package/integration-tools/image/pillow.md +32 -0
  8. package/integration-tools/image/playwright.md +33 -0
  9. package/integration-tools/image/resvg.md +36 -0
  10. package/integration-tools/image/satori.md +36 -0
  11. package/integration-tools/image/sharp.md +38 -0
  12. package/integration-tools/video/blender.md +34 -0
  13. package/integration-tools/video/ffmpeg.md +41 -0
  14. package/integration-tools/video/manim.md +37 -0
  15. package/integration-tools/video/motion-canvas.md +37 -0
  16. package/integration-tools/video/remotion.md +50 -0
  17. package/integration-tools/video/revideo.md +32 -0
  18. package/package.json +74 -6
  19. package/skills/vfrey-orchestrator/SKILL.md +15 -0
  20. package/skills/vfrey-orchestrator/channel-video/SKILL.md +41 -0
  21. package/skills/vfrey-product/SKILL.md +63 -0
  22. package/skills/vfrey-product/examples/concurrency-vs-parallelism/framey/cook-one.svg +14 -0
  23. package/skills/vfrey-product/examples/concurrency-vs-parallelism/framey/cook-two.svg +22 -0
  24. package/skills/vfrey-product/examples/concurrency-vs-parallelism/framey/index.html +70 -0
  25. package/skills/vfrey-product/examples/concurrency-vs-parallelism/remotion/cook-one.svg +14 -0
  26. package/skills/vfrey-product/examples/concurrency-vs-parallelism/remotion/cook-two.svg +22 -0
  27. package/skills/vfrey-product/examples/concurrency-vs-parallelism/remotion/index.tsx +49 -0
  28. package/skills/vfrey-product/examples/concurrency-vs-parallelism/script.json +15 -0
  29. package/skills/vfrey-product/examples/octopus-facts/index.html +60 -0
  30. package/skills/vfrey-product/examples/octopus-facts/octopus.svg +8 -0
  31. package/skills/vfrey-product/examples/octopus-facts/script.json +14 -0
  32. package/skills/vfrey-product/push/SKILL.md +15 -0
  33. package/skills/vfrey-product/scenes/NOTICE +5 -0
  34. package/skills/vfrey-product/scenes/blocks.md +57 -0
  35. package/skills/vfrey-product/scenes/craft.md +118 -0
  36. package/skills/vfrey-product/scenes/motion.md +88 -0
  37. package/src/analytics/dashboard.ts +109 -0
  38. package/src/analytics/index.ts +260 -0
  39. package/src/api/client.ts +361 -0
  40. package/src/api/cloud-files.ts +197 -0
  41. package/src/api/cloud-runs.ts +75 -0
  42. package/src/api/cloud.ts +413 -0
  43. package/src/api/commands.ts +330 -0
  44. package/src/api/config.ts +34 -0
  45. package/src/api/creators.ts +463 -0
  46. package/src/api/credentials.ts +152 -0
  47. package/src/api/mail.ts +333 -0
  48. package/src/api/topics.ts +207 -0
  49. package/src/api/types.ts +273 -0
  50. package/src/cli.ts +468 -0
  51. package/src/cloud/bundle.ts +70 -0
  52. package/src/cloud/cloudrun-executor.ts +237 -0
  53. package/src/cloud/executor.ts +281 -0
  54. package/src/cloud/gcs-sign.ts +76 -0
  55. package/src/cloud/job.ts +106 -0
  56. package/src/cloud/remote-job.ts +67 -0
  57. package/src/cloud/render-job.ts +191 -0
  58. package/src/config.ts +309 -0
  59. package/src/dashboard-link.ts +180 -0
  60. package/src/dashboard-start.ts +103 -0
  61. package/src/desk/channel.ts +64 -0
  62. package/src/desk/cli.ts +216 -0
  63. package/src/desk/creators-route.ts +129 -0
  64. package/src/desk/fonts/JetBrainsMono-OFL.txt +93 -0
  65. package/src/desk/fonts/google-sans-flex-latin.woff2 +0 -0
  66. package/src/desk/fonts/jetbrains-mono-medium.woff2 +0 -0
  67. package/src/desk/http.ts +460 -0
  68. package/src/desk/mail-route.ts +103 -0
  69. package/src/desk/overlay.ts +112 -0
  70. package/src/desk/preview.ts +422 -0
  71. package/src/desk/screens.ts +149 -0
  72. package/src/desk/secrets.ts +143 -0
  73. package/src/desk/series.ts +127 -0
  74. package/src/desk/state.ts +77 -0
  75. package/src/desk/studio-route.ts +119 -0
  76. package/src/desk/tick-runner.ts +66 -0
  77. package/src/desk/tick.ts +56 -0
  78. package/src/desk/topics-route.ts +41 -0
  79. package/src/desk/ui/app.css +505 -0
  80. package/src/desk/ui/app.js +185 -0
  81. package/src/desk/ui/apple-icon.png +0 -0
  82. package/src/desk/ui/components.js +79 -0
  83. package/src/desk/ui/core.js +156 -0
  84. package/src/desk/ui/favicon.ico +0 -0
  85. package/src/desk/ui/icon.svg +1 -0
  86. package/src/desk/ui/icons.js +49 -0
  87. package/src/desk/ui/index.html +41 -0
  88. package/src/desk/ui/metrics-math.d.ts +22 -0
  89. package/src/desk/ui/metrics-math.js +135 -0
  90. package/src/desk/ui/theme.js +5 -0
  91. package/src/desk/ui/views-creators.js +209 -0
  92. package/src/desk/ui/views-keys.js +114 -0
  93. package/src/desk/ui/views-mail.js +188 -0
  94. package/src/desk/ui/views-misc.js +123 -0
  95. package/src/desk/ui/views-review.js +119 -0
  96. package/src/desk/ui/views-runs.js +350 -0
  97. package/src/desk/ui/views-screens.js +163 -0
  98. package/src/desk/ui/views-series.js +318 -0
  99. package/src/desk/ui/views-topics.js +87 -0
  100. package/src/desk/verbs.ts +361 -0
  101. package/src/doctor.ts +212 -0
  102. package/src/drain.ts +14 -0
  103. package/src/engage/index.ts +217 -0
  104. package/src/generate/index.ts +110 -0
  105. package/src/generate/script.ts +152 -0
  106. package/src/generate/title.ts +78 -0
  107. package/src/help.ts +252 -0
  108. package/src/home.ts +45 -0
  109. package/src/llm/client.ts +177 -0
  110. package/src/log.ts +7 -0
  111. package/src/oauth/tokens.ts +189 -0
  112. package/src/oauth/vault.ts +72 -0
  113. package/src/pipeline/review.ts +642 -0
  114. package/src/pipeline/run.ts +443 -0
  115. package/src/pipeline/series-guard.ts +26 -0
  116. package/src/pipeline/source-fetch.ts +69 -0
  117. package/src/pipeline/stages.ts +728 -0
  118. package/src/pipeline/topics-source.ts +90 -0
  119. package/src/product/commands.ts +296 -0
  120. package/src/product/config-file.ts +38 -0
  121. package/src/product/engine-choice.ts +89 -0
  122. package/src/product/engines.ts +103 -0
  123. package/src/product/insights.ts +50 -0
  124. package/src/product/keys.ts +67 -0
  125. package/src/product/paths.ts +18 -0
  126. package/src/product/probes.ts +88 -0
  127. package/src/product/push-flow.ts +90 -0
  128. package/src/product/render-video.ts +21 -0
  129. package/src/product/short.ts +62 -0
  130. package/src/product/update.ts +32 -0
  131. package/src/project/canonical.ts +14 -0
  132. package/src/project/commands.ts +177 -0
  133. package/src/project/dashboard-status.ts +28 -0
  134. package/src/project/discover.ts +19 -0
  135. package/src/project/index-file.ts +73 -0
  136. package/src/project/marker.ts +92 -0
  137. package/src/project/migrate.ts +201 -0
  138. package/src/project/names.ts +27 -0
  139. package/src/project/notice.ts +16 -0
  140. package/src/project/open.ts +88 -0
  141. package/src/project/scaffold.ts +112 -0
  142. package/src/project/templates.ts +42 -0
  143. package/src/project/videos.ts +64 -0
  144. package/src/publish/facebook.ts +91 -0
  145. package/src/publish/index.ts +12 -0
  146. package/src/publish/instagram.ts +97 -0
  147. package/src/publish/rate.ts +62 -0
  148. package/src/publish/session.ts +242 -0
  149. package/src/publish/tiktok.ts +202 -0
  150. package/src/publish/youtube.ts +177 -0
  151. package/src/queue/desk-ops.ts +1170 -0
  152. package/src/queue/seal.ts +3 -0
  153. package/src/queue/store.ts +1006 -0
  154. package/src/remotion/AiLabel.tsx +26 -0
  155. package/src/remotion/Root.tsx +73 -0
  156. package/src/remotion/defaults.ts +26 -0
  157. package/src/remotion/films/claude/ClaudeFilm.tsx +1014 -0
  158. package/src/remotion/films/engine/EngineMark.tsx +17 -0
  159. package/src/remotion/films/rea/ReaShort.tsx +552 -0
  160. package/src/remotion/films/rea/drawings.tsx +907 -0
  161. package/src/remotion/films/rea/timing.ts +144 -0
  162. package/src/remotion/index.ts +4 -0
  163. package/src/remotion/templates/EditorialSplit.tsx +39 -0
  164. package/src/remotion/templates/KineticType.tsx +39 -0
  165. package/src/remotion/templates/SignalBoard.tsx +50 -0
  166. package/src/remotion/timing.ts +22 -0
  167. package/src/render/chrome.ts +78 -0
  168. package/src/render/engine-mark.ts +29 -0
  169. package/src/render/framey-template.ts +130 -0
  170. package/src/render/html-engine.ts +149 -0
  171. package/src/render/node-crypto-stub.ts +11 -0
  172. package/src/render/probe.ts +29 -0
  173. package/src/render/props.ts +17 -0
  174. package/src/render/vertical-short.ts +35 -0
  175. package/src/render/webpack.ts +33 -0
  176. package/src/render/worker.ts +65 -0
  177. package/src/scene/assets/fonts/TitanOne-OFL.txt +94 -0
  178. package/src/scene/assets/fonts/titan-one.woff2 +0 -0
  179. package/src/scene/assets/gsap/LICENSE.txt +8 -0
  180. package/src/scene/assets/gsap/gsap.min.js +11 -0
  181. package/src/scene/audio.ts +54 -0
  182. package/src/scene/blocks/LICENSE +190 -0
  183. package/src/scene/blocks/NOTICE +5 -0
  184. package/src/scene/blocks/bar-chart-race/bar-chart-race.html +585 -0
  185. package/src/scene/blocks/beat-freeze-cut/beat-freeze-cut.html +874 -0
  186. package/src/scene/blocks/camcorder-hud/camcorder-hud.html +164 -0
  187. package/src/scene/blocks/camera-dolly-zoom/camera-dolly-zoom.html +355 -0
  188. package/src/scene/blocks/code-diff/code-diff.html +817 -0
  189. package/src/scene/blocks/code-snippet-apple-terminal-pro/code-snippet-apple-terminal-pro.html +248 -0
  190. package/src/scene/blocks/code-typing/code-typing.html +764 -0
  191. package/src/scene/blocks/data-chart/data-chart.html +452 -0
  192. package/src/scene/blocks/flowchart-vertical/flowchart-vertical.html +454 -0
  193. package/src/scene/blocks/hw-scribble-transition/hw-scribble-transition.html +153 -0
  194. package/src/scene/blocks/index.json +824 -0
  195. package/src/scene/blocks/lt-accent-underline/lt-accent-underline.html +107 -0
  196. package/src/scene/blocks/lt-bold-block/lt-bold-block.html +109 -0
  197. package/src/scene/blocks/lt-clean-bar/lt-clean-bar.html +112 -0
  198. package/src/scene/blocks/lt-dark-card/lt-dark-card.html +111 -0
  199. package/src/scene/blocks/lt-kicker-name/lt-kicker-name.html +114 -0
  200. package/src/scene/blocks/lt-mask-reveal/lt-mask-reveal.html +120 -0
  201. package/src/scene/blocks/lt-neon-border/lt-neon-border.html +391 -0
  202. package/src/scene/blocks/lt-stack-bars/lt-stack-bars.html +109 -0
  203. package/src/scene/blocks/macos-notification/macos-notification.html +194 -0
  204. package/src/scene/blocks/mk-background/mk-background.html +236 -0
  205. package/src/scene/blocks/mk-callout-highlight/mk-callout-highlight.html +183 -0
  206. package/src/scene/blocks/mk-clone-wall-transition/mk-clone-wall-transition.html +226 -0
  207. package/src/scene/blocks/mk-line-graph/mk-line-graph.html +293 -0
  208. package/src/scene/blocks/mk-progress-stat/mk-progress-stat.html +186 -0
  209. package/src/scene/blocks/mk-specs-list/mk-specs-list.html +223 -0
  210. package/src/scene/blocks/news-ticker/news-ticker.html +409 -0
  211. package/src/scene/blocks/organic-light-leak-overlay/organic-light-leak-overlay.html +126 -0
  212. package/src/scene/blocks/oscilloscope-trace/oscilloscope-trace.html +519 -0
  213. package/src/scene/blocks/snow/snow.html +205 -0
  214. package/src/scene/blocks/split-flap-board/split-flap-board.html +347 -0
  215. package/src/scene/blocks/spotify-card/spotify-card.html +294 -0
  216. package/src/scene/blocks/starfield/starfield.html +188 -0
  217. package/src/scene/blocks/thread-message-stack/thread-message-stack.html +239 -0
  218. package/src/scene/blocks/week-in-merges/week-in-merges.html +470 -0
  219. package/src/scene/blocks/x-post/x-post.html +437 -0
  220. package/src/scene/blocks/yt-comment-card/yt-comment-card.html +319 -0
  221. package/src/scene/blocks/yt-lcd-background/yt-lcd-background.html +307 -0
  222. package/src/scene/blocks/yt-prism-title/yt-prism-title.html +205 -0
  223. package/src/scene/blocks.ts +229 -0
  224. package/src/scene/command.ts +272 -0
  225. package/src/scene/figure.ts +181 -0
  226. package/src/scene/glyphs.ts +107 -0
  227. package/src/scene/init.ts +86 -0
  228. package/src/scene/inspect/css-tree.d.ts +6 -0
  229. package/src/scene/inspect/page-scripts.ts +272 -0
  230. package/src/scene/inspect/report.ts +405 -0
  231. package/src/scene/inspect/run.ts +200 -0
  232. package/src/scene/inspect/source.ts +236 -0
  233. package/src/scene/label.ts +131 -0
  234. package/src/scene/net-guard.ts +74 -0
  235. package/src/scene/render.ts +292 -0
  236. package/src/scene/runtime/browser.ts +199 -0
  237. package/src/scene/runtime/core.ts +181 -0
  238. package/src/scene/runtime/react.tsx +115 -0
  239. package/src/scene/runtime/transitions.ts +133 -0
  240. package/src/scene/sanitize.ts +181 -0
  241. package/src/scene/scene.ts +152 -0
  242. package/src/scene/studio-command.ts +48 -0
  243. package/src/scene/studio-skin.ts +59 -0
  244. package/src/scene/studio.ts +337 -0
  245. package/src/scene/supply.ts +111 -0
  246. package/src/scene/timing.ts +288 -0
  247. package/src/scene/transitions/LICENSE +190 -0
  248. package/src/scene/transitions/NOTICE +5 -0
  249. package/src/scene/transitions/SOURCE.json +24 -0
  250. package/src/scene/transitions/transitions.global.js +38 -0
  251. package/src/scene/transitions.ts +26 -0
  252. package/src/service/all-projects.ts +153 -0
  253. package/src/service/commands.ts +256 -0
  254. package/src/service/due.ts +82 -0
  255. package/src/service/lock.ts +101 -0
  256. package/src/service/log-file.ts +56 -0
  257. package/src/service/state.ts +41 -0
  258. package/src/service/units.ts +90 -0
  259. package/src/service/worker.ts +51 -0
  260. package/src/skill-agents.ts +74 -0
  261. package/src/skill-install.ts +334 -0
  262. package/src/sync-write.ts +21 -0
  263. package/src/tick-report.ts +205 -0
  264. package/src/tts.ts +124 -0
  265. package/vendor/@vfrey/contracts/dist/account.d.ts +97 -0
  266. package/vendor/@vfrey/contracts/dist/account.js +27 -0
  267. package/vendor/@vfrey/contracts/dist/checks.d.ts +8 -0
  268. package/vendor/@vfrey/contracts/dist/checks.js +1 -0
  269. package/vendor/@vfrey/contracts/dist/credentials/crypto.d.ts +4 -0
  270. package/vendor/@vfrey/contracts/dist/credentials/crypto.js +38 -0
  271. package/vendor/@vfrey/contracts/dist/domain/advice-persona.d.ts +10 -0
  272. package/vendor/@vfrey/contracts/dist/domain/advice-persona.js +24 -0
  273. package/vendor/@vfrey/contracts/dist/domain/backoff.d.ts +13 -0
  274. package/vendor/@vfrey/contracts/dist/domain/backoff.js +27 -0
  275. package/vendor/@vfrey/contracts/dist/domain/cadence.d.ts +29 -0
  276. package/vendor/@vfrey/contracts/dist/domain/cadence.js +95 -0
  277. package/vendor/@vfrey/contracts/dist/domain/creators.d.ts +146 -0
  278. package/vendor/@vfrey/contracts/dist/domain/creators.js +2 -0
  279. package/vendor/@vfrey/contracts/dist/domain/disclosure.d.ts +127 -0
  280. package/vendor/@vfrey/contracts/dist/domain/disclosure.js +250 -0
  281. package/vendor/@vfrey/contracts/dist/domain/errors.d.ts +34 -0
  282. package/vendor/@vfrey/contracts/dist/domain/errors.js +68 -0
  283. package/vendor/@vfrey/contracts/dist/domain/redact.d.ts +1 -0
  284. package/vendor/@vfrey/contracts/dist/domain/redact.js +21 -0
  285. package/vendor/@vfrey/contracts/dist/domain/revenue.d.ts +13 -0
  286. package/vendor/@vfrey/contracts/dist/domain/revenue.js +16 -0
  287. package/vendor/@vfrey/contracts/dist/domain/safety.d.ts +20 -0
  288. package/vendor/@vfrey/contracts/dist/domain/safety.js +61 -0
  289. package/vendor/@vfrey/contracts/dist/domain/similarity.d.ts +13 -0
  290. package/vendor/@vfrey/contracts/dist/domain/similarity.js +100 -0
  291. package/vendor/@vfrey/contracts/dist/domain/templates.d.ts +18 -0
  292. package/vendor/@vfrey/contracts/dist/domain/templates.js +67 -0
  293. package/vendor/@vfrey/contracts/dist/domain/tiktok-chunks.d.ts +19 -0
  294. package/vendor/@vfrey/contracts/dist/domain/tiktok-chunks.js +52 -0
  295. package/vendor/@vfrey/contracts/dist/domain/topics.d.ts +78 -0
  296. package/vendor/@vfrey/contracts/dist/domain/topics.js +4 -0
  297. package/vendor/@vfrey/contracts/dist/domain/types.d.ts +216 -0
  298. package/vendor/@vfrey/contracts/dist/domain/types.js +1 -0
  299. package/vendor/@vfrey/contracts/dist/domain/variation.d.ts +57 -0
  300. package/vendor/@vfrey/contracts/dist/domain/variation.js +278 -0
  301. package/vendor/@vfrey/contracts/dist/events.d.ts +20 -0
  302. package/vendor/@vfrey/contracts/dist/events.js +1 -0
  303. package/vendor/@vfrey/contracts/dist/http.d.ts +11 -0
  304. package/vendor/@vfrey/contracts/dist/http.js +37 -0
  305. package/vendor/@vfrey/contracts/dist/index.d.ts +22 -0
  306. package/vendor/@vfrey/contracts/dist/index.js +22 -0
  307. package/vendor/@vfrey/contracts/dist/log.d.ts +2 -0
  308. package/vendor/@vfrey/contracts/dist/log.js +10 -0
  309. package/vendor/@vfrey/contracts/dist/mail.d.ts +55 -0
  310. package/vendor/@vfrey/contracts/dist/mail.js +1 -0
  311. package/vendor/@vfrey/contracts/package.json +18 -0
  312. package/vendor/@vfrey/ingest/dist/index.d.ts +41 -0
  313. package/vendor/@vfrey/ingest/dist/index.js +221 -0
  314. package/vendor/@vfrey/ingest/dist/parse.d.ts +5 -0
  315. package/vendor/@vfrey/ingest/dist/parse.js +165 -0
  316. package/vendor/@vfrey/ingest/package.json +21 -0
  317. package/vendor/framey/LICENSE +190 -0
  318. package/vendor/framey/NOTICE +15 -0
  319. package/vendor/framey/SOURCE.json +24 -0
  320. package/vendor/framey/STUDIO-SOURCE.json +9 -0
  321. package/vendor/framey/bin/framey-localize-fonts.mjs +12 -0
  322. package/vendor/framey/bin/framey.mjs +16 -0
  323. package/vendor/framey/dist/add-VMJD5KBS.js +75 -0
  324. package/vendor/framey/dist/animatedGifPrep-QPKGJ6PM.js +43 -0
  325. package/vendor/framey/dist/api.d.ts +211 -0
  326. package/vendor/framey/dist/api.js +76 -0
  327. package/vendor/framey/dist/appHistory-WW56FZTT.js +31 -0
  328. package/vendor/framey/dist/asset-WQKGOELE.js +26 -0
  329. package/vendor/framey/dist/audio-RSJWVWRA.js +1936 -0
  330. package/vendor/framey/dist/batchRender-3HPICDCT.js +366 -0
  331. package/vendor/framey/dist/beats-HL2BDUZI.js +273 -0
  332. package/vendor/framey/dist/benchmark-RWCWHI5Z.js +230 -0
  333. package/vendor/framey/dist/browser-ECYET3Q2.js +206 -0
  334. package/vendor/framey/dist/bundleWithLocalizedFonts-ALYBQEQT.js +52 -0
  335. package/vendor/framey/dist/captureCompositionFrame-4DA6SEH2.js +94 -0
  336. package/vendor/framey/dist/catalog-5JVDEUWK.js +979 -0
  337. package/vendor/framey/dist/catch-up-NEBCL5NO.js +106 -0
  338. package/vendor/framey/dist/check-F5N544ML.js +111 -0
  339. package/vendor/framey/dist/checkBrowser-LZ66CMJG.js +110 -0
  340. package/vendor/framey/dist/chunk-2K7Z2HVP.js +372 -0
  341. package/vendor/framey/dist/chunk-2UZQHDM7.js +323 -0
  342. package/vendor/framey/dist/chunk-2X4PQEYM.js +34 -0
  343. package/vendor/framey/dist/chunk-3422KMTD.js +168 -0
  344. package/vendor/framey/dist/chunk-3FYD4YEK.js +72 -0
  345. package/vendor/framey/dist/chunk-3GXQPCJC.js +682 -0
  346. package/vendor/framey/dist/chunk-3LM6YPBR.js +179 -0
  347. package/vendor/framey/dist/chunk-442JNXRM.js +20 -0
  348. package/vendor/framey/dist/chunk-4BNN5FGX.js +182 -0
  349. package/vendor/framey/dist/chunk-4P7NX5BM.js +11532 -0
  350. package/vendor/framey/dist/chunk-4UMPIPCQ.js +88 -0
  351. package/vendor/framey/dist/chunk-4YYJOFKS.js +28 -0
  352. package/vendor/framey/dist/chunk-54HJ63Q2.js +29 -0
  353. package/vendor/framey/dist/chunk-5ETJX6WM.js +89 -0
  354. package/vendor/framey/dist/chunk-5SG54JRS.js +68 -0
  355. package/vendor/framey/dist/chunk-634HSJ3J.js +58 -0
  356. package/vendor/framey/dist/chunk-66LREXGS.js +48 -0
  357. package/vendor/framey/dist/chunk-6BEFEWFB.js +25 -0
  358. package/vendor/framey/dist/chunk-6BNTGNGD.js +286 -0
  359. package/vendor/framey/dist/chunk-6DDPOHMK.js +140 -0
  360. package/vendor/framey/dist/chunk-6GV5XSOR.js +214 -0
  361. package/vendor/framey/dist/chunk-6JR2XUEE.js +127 -0
  362. package/vendor/framey/dist/chunk-73QVATIM.js +362 -0
  363. package/vendor/framey/dist/chunk-7FMUTGOH.js +279 -0
  364. package/vendor/framey/dist/chunk-7JQFJ6JJ.js +291 -0
  365. package/vendor/framey/dist/chunk-AHPGAESX.js +113 -0
  366. package/vendor/framey/dist/chunk-AHX34EFP.js +15 -0
  367. package/vendor/framey/dist/chunk-AJ5CSAEZ.js +487 -0
  368. package/vendor/framey/dist/chunk-B7RJV74O.js +5047 -0
  369. package/vendor/framey/dist/chunk-BL4U6U52.js +254 -0
  370. package/vendor/framey/dist/chunk-BSQ7XANM.js +210 -0
  371. package/vendor/framey/dist/chunk-BZ56MTDX.js +6 -0
  372. package/vendor/framey/dist/chunk-C5BO7PMT.js +282 -0
  373. package/vendor/framey/dist/chunk-CFUCHO4T.js +358 -0
  374. package/vendor/framey/dist/chunk-CZGHFATT.js +31 -0
  375. package/vendor/framey/dist/chunk-DLA44CMS.js +5649 -0
  376. package/vendor/framey/dist/chunk-DPVXBVLL.js +31292 -0
  377. package/vendor/framey/dist/chunk-DQBY7FRR.js +397 -0
  378. package/vendor/framey/dist/chunk-EAMLBAHA.js +154 -0
  379. package/vendor/framey/dist/chunk-EOVYQ3IG.js +143 -0
  380. package/vendor/framey/dist/chunk-EVMY7IPL.js +612 -0
  381. package/vendor/framey/dist/chunk-FG4BBFZI.js +122 -0
  382. package/vendor/framey/dist/chunk-FI4I7CME.js +56 -0
  383. package/vendor/framey/dist/chunk-FLREUEHW.js +2081 -0
  384. package/vendor/framey/dist/chunk-FUFP7A7S.js +1126 -0
  385. package/vendor/framey/dist/chunk-FV3PIKGH.js +56 -0
  386. package/vendor/framey/dist/chunk-FXMKHHPO.js +123 -0
  387. package/vendor/framey/dist/chunk-GGZAM5VH.js +1187 -0
  388. package/vendor/framey/dist/chunk-GKZEVJIB.js +39 -0
  389. package/vendor/framey/dist/chunk-GMECXFAN.js +57 -0
  390. package/vendor/framey/dist/chunk-GNEFDLFB.js +621 -0
  391. package/vendor/framey/dist/chunk-GPMLSOEG.js +19274 -0
  392. package/vendor/framey/dist/chunk-GPYVT5EE.js +59 -0
  393. package/vendor/framey/dist/chunk-H6IEMZEV.js +40 -0
  394. package/vendor/framey/dist/chunk-HEFQCIXR.js +170 -0
  395. package/vendor/framey/dist/chunk-HFQ4CWHA.js +118 -0
  396. package/vendor/framey/dist/chunk-HPDTCOKE.js +304 -0
  397. package/vendor/framey/dist/chunk-HTUHQKDB.js +548 -0
  398. package/vendor/framey/dist/chunk-HU2SPFNG.js +103 -0
  399. package/vendor/framey/dist/chunk-HVW7ABXD.js +19 -0
  400. package/vendor/framey/dist/chunk-IG7NDKXO.js +26 -0
  401. package/vendor/framey/dist/chunk-II3J3WXK.js +246 -0
  402. package/vendor/framey/dist/chunk-IR35BCLK.js +13 -0
  403. package/vendor/framey/dist/chunk-ISN5GRYI.js +20 -0
  404. package/vendor/framey/dist/chunk-IUONB55J.js +669 -0
  405. package/vendor/framey/dist/chunk-IVSUQR2B.js +161 -0
  406. package/vendor/framey/dist/chunk-IXU6PQSW.js +259 -0
  407. package/vendor/framey/dist/chunk-IZCW2NKT.js +29 -0
  408. package/vendor/framey/dist/chunk-JGXJU5PF.js +68 -0
  409. package/vendor/framey/dist/chunk-JHOCK3DG.js +27 -0
  410. package/vendor/framey/dist/chunk-JVBRJMOP.js +121 -0
  411. package/vendor/framey/dist/chunk-K4MJX7SR.js +17 -0
  412. package/vendor/framey/dist/chunk-K4WKGXRC.js +18 -0
  413. package/vendor/framey/dist/chunk-KGPLIH7B.js +127 -0
  414. package/vendor/framey/dist/chunk-KLIKCX6Q.js +63 -0
  415. package/vendor/framey/dist/chunk-KXTKKBOC.js +61 -0
  416. package/vendor/framey/dist/chunk-KZI44OPA.js +185 -0
  417. package/vendor/framey/dist/chunk-LEKZNRKI.js +45 -0
  418. package/vendor/framey/dist/chunk-LFGJWOVA.js +61 -0
  419. package/vendor/framey/dist/chunk-LLMSX6V6.js +17 -0
  420. package/vendor/framey/dist/chunk-LTGTN2TH.js +195 -0
  421. package/vendor/framey/dist/chunk-M2WBOQ2Q.js +54 -0
  422. package/vendor/framey/dist/chunk-MI5FTLYK.js +399 -0
  423. package/vendor/framey/dist/chunk-MLQP2QUF.js +1809 -0
  424. package/vendor/framey/dist/chunk-MMQ52NIZ.js +956 -0
  425. package/vendor/framey/dist/chunk-ND46XKK3.js +742 -0
  426. package/vendor/framey/dist/chunk-NYEXNSHM.js +504 -0
  427. package/vendor/framey/dist/chunk-O4YRB27L.js +57 -0
  428. package/vendor/framey/dist/chunk-O7BGSQ5F.js +92 -0
  429. package/vendor/framey/dist/chunk-OFQWTKPW.js +117 -0
  430. package/vendor/framey/dist/chunk-P5ZBLXJ6.js +91 -0
  431. package/vendor/framey/dist/chunk-P6LJ4Y32.js +4662 -0
  432. package/vendor/framey/dist/chunk-PKZ7RK5N.js +281 -0
  433. package/vendor/framey/dist/chunk-PURHAXFL.js +15 -0
  434. package/vendor/framey/dist/chunk-Q5X2B5WT.js +29 -0
  435. package/vendor/framey/dist/chunk-QAMKOG67.js +248 -0
  436. package/vendor/framey/dist/chunk-R6YBK4XX.js +514 -0
  437. package/vendor/framey/dist/chunk-RGLQURIX.js +2997 -0
  438. package/vendor/framey/dist/chunk-RNV3DM4S.js +3573 -0
  439. package/vendor/framey/dist/chunk-ROEW726S.js +4638 -0
  440. package/vendor/framey/dist/chunk-RQVDTPGD.js +6 -0
  441. package/vendor/framey/dist/chunk-RVZHGOGR.js +26 -0
  442. package/vendor/framey/dist/chunk-RXATE6FZ.js +385 -0
  443. package/vendor/framey/dist/chunk-S3S4TGEH.js +424 -0
  444. package/vendor/framey/dist/chunk-SDYDNHEE.js +11202 -0
  445. package/vendor/framey/dist/chunk-SSWBU67I.js +173 -0
  446. package/vendor/framey/dist/chunk-ST35C4K6.js +28 -0
  447. package/vendor/framey/dist/chunk-SZNTYTIV.js +990 -0
  448. package/vendor/framey/dist/chunk-T2EUWCJE.js +29 -0
  449. package/vendor/framey/dist/chunk-T6AGUTZJ.js +444 -0
  450. package/vendor/framey/dist/chunk-THJALHFJ.js +11131 -0
  451. package/vendor/framey/dist/chunk-TIQB63MX.js +18128 -0
  452. package/vendor/framey/dist/chunk-U242RTCT.js +134 -0
  453. package/vendor/framey/dist/chunk-UJZREAV6.js +3901 -0
  454. package/vendor/framey/dist/chunk-UMD3V7CU.js +264 -0
  455. package/vendor/framey/dist/chunk-UOFAE5RF.js +42 -0
  456. package/vendor/framey/dist/chunk-UTEIUGAZ.js +29 -0
  457. package/vendor/framey/dist/chunk-VAS6HQX3.js +138 -0
  458. package/vendor/framey/dist/chunk-VC76R6W2.js +27 -0
  459. package/vendor/framey/dist/chunk-VFZ7W5W7.js +226 -0
  460. package/vendor/framey/dist/chunk-VHNLZAE2.js +348 -0
  461. package/vendor/framey/dist/chunk-VMC4WSH5.js +278 -0
  462. package/vendor/framey/dist/chunk-VORQIH64.js +108 -0
  463. package/vendor/framey/dist/chunk-VTXFRIHO.js +186 -0
  464. package/vendor/framey/dist/chunk-W2LGJSEN.js +182 -0
  465. package/vendor/framey/dist/chunk-WKBM7NDG.js +32 -0
  466. package/vendor/framey/dist/chunk-WMQNIQDJ.js +2057 -0
  467. package/vendor/framey/dist/chunk-WN4XZC5F.js +504 -0
  468. package/vendor/framey/dist/chunk-WQ6ZXHFQ.js +133 -0
  469. package/vendor/framey/dist/chunk-X7HBSTCZ.js +53 -0
  470. package/vendor/framey/dist/chunk-X7MTZ4T2.js +6 -0
  471. package/vendor/framey/dist/chunk-XPTOJZJF.js +308 -0
  472. package/vendor/framey/dist/chunk-XT6MXC7A.js +6 -0
  473. package/vendor/framey/dist/chunk-XT7X6QCP.js +6 -0
  474. package/vendor/framey/dist/chunk-XTMDWNEC.js +2820 -0
  475. package/vendor/framey/dist/chunk-XUHOIDKG.js +6 -0
  476. package/vendor/framey/dist/chunk-XX7LTW5Y.js +138 -0
  477. package/vendor/framey/dist/chunk-Y3YGTZEG.js +382 -0
  478. package/vendor/framey/dist/chunk-Y5SBSGN7.js +346 -0
  479. package/vendor/framey/dist/chunk-YCMVI4MZ.js +625 -0
  480. package/vendor/framey/dist/chunk-YOR4CTCE.js +261 -0
  481. package/vendor/framey/dist/chunk-YPRBGITP.js +2748 -0
  482. package/vendor/framey/dist/chunk-ZKDMAOFU.js +32 -0
  483. package/vendor/framey/dist/chunk-ZW6DURPF.js +1318 -0
  484. package/vendor/framey/dist/clean-ZJOGDKDM.js +336 -0
  485. package/vendor/framey/dist/cli.js +439 -0
  486. package/vendor/framey/dist/cloudrun-HGJ3B6ZV.js +767 -0
  487. package/vendor/framey/dist/commands/contrast-audit.browser.js +643 -0
  488. package/vendor/framey/dist/commands/layout-audit.browser.js +2914 -0
  489. package/vendor/framey/dist/commands/motion-sample.browser.js +74 -0
  490. package/vendor/framey/dist/commands/motion-signature.browser.js +475 -0
  491. package/vendor/framey/dist/compare-W7UY3BAZ.js +463 -0
  492. package/vendor/framey/dist/compiler-TM3W6GYF.js +136 -0
  493. package/vendor/framey/dist/component-QF5VGYMU.js +176 -0
  494. package/vendor/framey/dist/compositions-XT3PMNDF.js +238 -0
  495. package/vendor/framey/dist/contactSheet-7W6GYHBQ.js +24 -0
  496. package/vendor/framey/dist/deploy-6FJPWKF2.js +299 -0
  497. package/vendor/framey/dist/destroy-HE2RIPKZ.js +57 -0
  498. package/vendor/framey/dist/deterministicFonts-RADD3BSX.js +50 -0
  499. package/vendor/framey/dist/dist-4S2FGGVY.js +422 -0
  500. package/vendor/framey/dist/dist-BE4B2EZE.js +32 -0
  501. package/vendor/framey/dist/dist-EWXJGN63.js +129 -0
  502. package/vendor/framey/dist/docs-VKIRFEEX.js +131 -0
  503. package/vendor/framey/dist/doctor-2UNJ2G7U.js +74 -0
  504. package/vendor/framey/dist/dom-37K6YOH4.js +14 -0
  505. package/vendor/framey/dist/dotEnv-7PZQTVIM.js +54 -0
  506. package/vendor/framey/dist/events-ACY3P2PA.js +76 -0
  507. package/vendor/framey/dist/events-IHB3B2MK.js +69 -0
  508. package/vendor/framey/dist/ffmpeg-DR5LGGSK.js +63 -0
  509. package/vendor/framey/dist/figma-BODVUPHB.js +63 -0
  510. package/vendor/framey/dist/fontData.generated-NXAOI4GH.js +13 -0
  511. package/vendor/framey/dist/fontLocalizeCli.js +142 -0
  512. package/vendor/framey/dist/gpuPolicy-XLEXORZY.js +49 -0
  513. package/vendor/framey/dist/grade-compare-GAXFQ74C.js +661 -0
  514. package/vendor/framey/dist/gsapParser-IEUSLYDJ.js +2885 -0
  515. package/vendor/framey/dist/gsapParserAcorn-LZJKCFQI.js +30 -0
  516. package/vendor/framey/dist/help-VCB5X2HS.js +184 -0
  517. package/vendor/framey/dist/history-ENGZEVFT.js +471 -0
  518. package/vendor/framey/dist/hyperframe.manifest.json +22 -0
  519. package/vendor/framey/dist/hyperframe.runtime.iife.js +1132 -0
  520. package/vendor/framey/dist/hyperframes-player.global.js +478 -0
  521. package/vendor/framey/dist/hyperframes-slideshow.global.js +148 -0
  522. package/vendor/framey/dist/info-WPCJHBMU.js +182 -0
  523. package/vendor/framey/dist/init-G4WGLYGD.js +1176 -0
  524. package/vendor/framey/dist/inspect-5IQ6CNEQ.js +106 -0
  525. package/vendor/framey/dist/installer-ML4HWUV7.js +40 -0
  526. package/vendor/framey/dist/keyframes-Q6XJO7VW.js +2755 -0
  527. package/vendor/framey/dist/lambda-A7JC74JF.js +468 -0
  528. package/vendor/framey/dist/layout-YET6XNXA.js +95 -0
  529. package/vendor/framey/dist/lint-I7FZN2VJ.js +162 -0
  530. package/vendor/framey/dist/lintProject-PDB3UN72.js +30 -0
  531. package/vendor/framey/dist/manager-CD6LJ7ZN.js +45 -0
  532. package/vendor/framey/dist/manager-WA4F2GST.js +67 -0
  533. package/vendor/framey/dist/media-treatment-BXYS4WVA.js +1030 -0
  534. package/vendor/framey/dist/media-use-LWH3MANK.js +113 -0
  535. package/vendor/framey/dist/models-K363FYM4.js +195 -0
  536. package/vendor/framey/dist/motionShot-GPAVWXLH.js +640 -0
  537. package/vendor/framey/dist/normalize-FASIPBUM.js +24 -0
  538. package/vendor/framey/dist/normalize-audio-VDWYRHN6.js +268 -0
  539. package/vendor/framey/dist/open-E3TB6P6J.js +128 -0
  540. package/vendor/framey/dist/parakeetRunner-UP34UOI2.js +58 -0
  541. package/vendor/framey/dist/pipeline-VXIUYEBU.js +64 -0
  542. package/vendor/framey/dist/play-BUTDQ4DV.js +353 -0
  543. package/vendor/framey/dist/policies-OLDYGFK5.js +309 -0
  544. package/vendor/framey/dist/preflight-2KZ2GWAZ.js +55 -0
  545. package/vendor/framey/dist/present-GXYSM7NX.js +353 -0
  546. package/vendor/framey/dist/preview-EKZ33JOJ.js +1910 -0
  547. package/vendor/framey/dist/producer-SKU5EV3J.js +13 -0
  548. package/vendor/framey/dist/progress-ZWB4Z4ET.js +76 -0
  549. package/vendor/framey/dist/projectConfig-3MZAYVTS.js +60 -0
  550. package/vendor/framey/dist/publication-DTKWNF74.js +33 -0
  551. package/vendor/framey/dist/remove-background-OY5L7XN2.js +265 -0
  552. package/vendor/framey/dist/render-CDV4GDFX.js +187 -0
  553. package/vendor/framey/dist/render-YE5YAMOD.js +2620 -0
  554. package/vendor/framey/dist/render-batch-ZAMFPCLL.js +274 -0
  555. package/vendor/framey/dist/renderSetupWorker.js +120 -0
  556. package/vendor/framey/dist/resolver-D5BIPSEW.js +42 -0
  557. package/vendor/framey/dist/runtimeVersion.js +18 -0
  558. package/vendor/framey/dist/sam-WFZXI4F7.js +23 -0
  559. package/vendor/framey/dist/shaderTransitionWorker.js +44 -0
  560. package/vendor/framey/dist/sherpa-RQWLV7I3.js +79 -0
  561. package/vendor/framey/dist/sherpaWorker.js +84 -0
  562. package/vendor/framey/dist/sites-AMOVABTK.js +54 -0
  563. package/vendor/framey/dist/skill-ZHVLH7KX.js +15 -0
  564. package/vendor/framey/dist/slideshow-SJGK4RQS.js +24 -0
  565. package/vendor/framey/dist/snapshot-TUXL6LBQ.js +1515 -0
  566. package/vendor/framey/dist/src-JHQGB2S6.js +215 -0
  567. package/vendor/framey/dist/src-Z5PGEMXB.js +532 -0
  568. package/vendor/framey/dist/state-B6H3WHCF.js +28 -0
  569. package/vendor/framey/dist/staticProjectServer-DFVZOUGI.js +63 -0
  570. package/vendor/framey/dist/studio/assets/hyperframes-player-DLaKjw0L.js +478 -0
  571. package/vendor/framey/dist/studio/assets/index-BX3KHhGX.js +71 -0
  572. package/vendor/framey/dist/studio/assets/index-CYbvOVp-.css +1 -0
  573. package/vendor/framey/dist/studio/assets/index-Dp3QEUGL.js +402 -0
  574. package/vendor/framey/dist/studio/assets/index-qrTAXbqc.js +531 -0
  575. package/vendor/framey/dist/studio/favicon.svg +14 -0
  576. package/vendor/framey/dist/studio/icons/timeline/audio.svg +7 -0
  577. package/vendor/framey/dist/studio/icons/timeline/captions.svg +5 -0
  578. package/vendor/framey/dist/studio/icons/timeline/composition.svg +12 -0
  579. package/vendor/framey/dist/studio/icons/timeline/image.svg +18 -0
  580. package/vendor/framey/dist/studio/icons/timeline/music.svg +10 -0
  581. package/vendor/framey/dist/studio/icons/timeline/text.svg +3 -0
  582. package/vendor/framey/dist/studio/index.html +23 -0
  583. package/vendor/framey/dist/studio-api-2NECGRMB.js +179 -0
  584. package/vendor/framey/dist/studioSelectionClient-IUUPKUHZ.js +25 -0
  585. package/vendor/framey/dist/studioServer-N2OPUMOQ.js +1569 -0
  586. package/vendor/framey/dist/synthesize-PKTB5ATG.js +183 -0
  587. package/vendor/framey/dist/system-7F3UEHQT.js +27 -0
  588. package/vendor/framey/dist/telemetry-DQGPEKM6.js +145 -0
  589. package/vendor/framey/dist/telemetry-UN55N6U6.js +77 -0
  590. package/vendor/framey/dist/timeline-LHUUMK63.js +1295 -0
  591. package/vendor/framey/dist/tokens-OLECWDFK.js +92 -0
  592. package/vendor/framey/dist/transcribe-O7HQKMIV.js +331 -0
  593. package/vendor/framey/dist/transcribe-UJESPBT5.js +76 -0
  594. package/vendor/framey/dist/tts-YCCQHZD4.js +234 -0
  595. package/vendor/framey/dist/urlDownloader-H2LXLG4U.js +48 -0
  596. package/vendor/framey/dist/usage-HG4WMM7A.js +2167 -0
  597. package/vendor/framey/dist/validate-F2XMN6EV.js +87 -0
  598. package/vendor/framey/dist/vendor/npm/gsap@3.15.0/GSAP-LICENSE.txt +8 -0
  599. package/vendor/framey/dist/vendor/npm/gsap@3.15.0/dist/CustomEase.min.js +11 -0
  600. package/vendor/framey/dist/vendor/npm/gsap@3.15.0/dist/MotionPathPlugin.min.js +11 -0
  601. package/vendor/framey/dist/vendor/npm/gsap@3.15.0/dist/gsap.min.js +11 -0
  602. package/vendor/framey/dist/warmCheck.js +220 -0
  603. package/vendor/framey/dist/warmCheckClient.js +139 -0
  604. package/vendor/framey/dist/workspaceBuildCheck-XYD2YTFW.js +133 -0
  605. package/vendor/framey-player/LICENSE +190 -0
  606. package/vendor/framey-player/NOTICE +16 -0
  607. package/vendor/framey-player/SOURCE.json +6 -0
  608. package/vendor/framey-player/hyperframes-player.global.js +478 -0
  609. package/vendor/framey.pin +1 -0
  610. package/bin/index.js +0 -3
@@ -0,0 +1,504 @@
1
+ import { createRequire as __hf_createRequire } from "node:module";
2
+ import { fileURLToPath as __hf_fileURLToPath } from "node:url";
3
+ import { dirname as __hf_dirname } from "node:path";
4
+ var require = __hf_createRequire(import.meta.url);
5
+ var __filename = __hf_fileURLToPath(import.meta.url);
6
+ var __dirname = __hf_dirname(__filename);
7
+ import {
8
+ printDeprecationNotice,
9
+ withMeta
10
+ } from "./chunk-O4YRB27L.js";
11
+ import {
12
+ resolveProject
13
+ } from "./chunk-O7BGSQ5F.js";
14
+ import {
15
+ installPageFunctionGuard,
16
+ launchManagedBrowser,
17
+ resolveCliChromeGpuMode,
18
+ resolveManagedGpuMode,
19
+ seekCompositionTimeline,
20
+ waitForRuntimeReady
21
+ } from "./chunk-SZNTYTIV.js";
22
+ import {
23
+ pageNavigationTimeoutMs
24
+ } from "./chunk-YOR4CTCE.js";
25
+ import {
26
+ resolveCompositionViewportFromHtml
27
+ } from "./chunk-LEKZNRKI.js";
28
+ import {
29
+ defineCommand
30
+ } from "./chunk-S3S4TGEH.js";
31
+ import {
32
+ c
33
+ } from "./chunk-VORQIH64.js";
34
+ import {
35
+ failCommand,
36
+ setCommandExitCode
37
+ } from "./chunk-JVBRJMOP.js";
38
+ import {
39
+ resolveNaturalMediaTimelineDuration
40
+ } from "./chunk-UJZREAV6.js";
41
+ import {
42
+ normalizeErrorMessage
43
+ } from "./chunk-T2EUWCJE.js";
44
+ import {
45
+ decodeWellFormedEscapes
46
+ } from "./chunk-BSQ7XANM.js";
47
+
48
+ // src/commands/validate.ts
49
+ import { existsSync, mkdtempSync, readFileSync, rmSync } from "fs";
50
+ import { tmpdir } from "os";
51
+ import { join, dirname } from "path";
52
+ import { fileURLToPath } from "url";
53
+ var __filename = fileURLToPath(import.meta.url);
54
+ var __dirname = dirname(__filename);
55
+ var CONTRAST_SAMPLES = 5;
56
+ var SEEK_SETTLE_MS = 150;
57
+ var PREFERRED_SEEK_TARGET_WAIT_MS = 500;
58
+ var MEDIA_EXTENSIONS = /\.(aac|flac|m4a|mov|mp3|mp4|oga|ogg|wav|webm)$/i;
59
+ function navigationTimeoutHint(err, navTimeoutMs) {
60
+ const msg = err instanceof Error ? err.message : String(err);
61
+ if (!/navigation timeout/i.test(msg)) return null;
62
+ return new Error(
63
+ `Page navigation timed out after ${navTimeoutMs}ms. A blocking external <script> (e.g. GSAP loaded from a CDN) can delay page load past this budget, which render shares. Vendor the script locally (recommended for deterministic renders), or re-run with a longer --timeout or PRODUCER_PAGE_NAVIGATION_TIMEOUT_MS.`
64
+ );
65
+ }
66
+ function shouldIgnoreRequestFailure(url, errorText, resourceType) {
67
+ if (errorText === "net::ERR_ABORTED" && isOptionalCaptionOverridesRequest(url)) return true;
68
+ if (errorText !== "net::ERR_ABORTED") return false;
69
+ if (resourceType === "media") return true;
70
+ try {
71
+ return MEDIA_EXTENSIONS.test(new URL(url).pathname);
72
+ } catch {
73
+ return false;
74
+ }
75
+ }
76
+ function projectPathOfUrl(url) {
77
+ return decodeWellFormedEscapes(new URL(url).pathname).replace(/^\//, "");
78
+ }
79
+ function shouldIgnoreHttpError(url, status) {
80
+ return status === 404 && isOptionalCaptionOverridesRequest(url);
81
+ }
82
+ function isOptionalCaptionOverridesRequest(url) {
83
+ try {
84
+ return new URL(url).pathname === "/caption-overrides.json";
85
+ } catch {
86
+ return false;
87
+ }
88
+ }
89
+ async function getCompositionDuration(page) {
90
+ return page.evaluate(() => {
91
+ if (window.__hf?.duration && window.__hf.duration > 0) return window.__hf.duration;
92
+ const root = document.querySelector("[data-composition-id][data-duration]");
93
+ return root ? parseFloat(root.getAttribute("data-duration") ?? "0") : 0;
94
+ });
95
+ }
96
+ function raceMediaReady(el, deadlineMs) {
97
+ if (Number.isFinite(el.duration) && el.duration > 0) return Promise.resolve();
98
+ return new Promise((resolve) => {
99
+ const onReady = () => {
100
+ el.removeEventListener("loadedmetadata", onReady);
101
+ el.removeEventListener("error", onReady);
102
+ clearTimeout(timer);
103
+ resolve();
104
+ };
105
+ el.addEventListener("loadedmetadata", onReady, { once: true });
106
+ el.addEventListener("error", onReady, { once: true });
107
+ const timer = setTimeout(onReady, Math.max(0, deadlineMs - Date.now()));
108
+ });
109
+ }
110
+ async function auditClipDurations(page, analyzeClipMediaFit, extraWaitMs) {
111
+ const clips = await page.evaluate(async (maxWaitMs) => {
112
+ const nodes = Array.from(
113
+ document.querySelectorAll("audio[data-duration]")
114
+ );
115
+ const deadline = Date.now() + maxWaitMs;
116
+ const reads = /* @__PURE__ */ new Map();
117
+ await Promise.all(
118
+ nodes.map((el) => {
119
+ if (Number.isFinite(el.duration) && el.duration > 0) return Promise.resolve();
120
+ const probe = new Audio();
121
+ probe.preload = "metadata";
122
+ probe.src = el.currentSrc || el.src || el.querySelector("source")?.src || "";
123
+ reads.set(el, probe);
124
+ return new Promise((resolve) => {
125
+ const cleanup = () => {
126
+ for (const target of [el, probe]) {
127
+ target.removeEventListener("loadedmetadata", onReady);
128
+ target.removeEventListener("error", onReady);
129
+ }
130
+ clearTimeout(timer);
131
+ };
132
+ const onReady = () => {
133
+ cleanup();
134
+ resolve();
135
+ };
136
+ for (const target of [el, probe]) {
137
+ target.addEventListener("loadedmetadata", onReady, { once: true });
138
+ target.addEventListener("error", onReady, { once: true });
139
+ }
140
+ const timer = setTimeout(onReady, Math.max(0, deadline - Date.now()));
141
+ });
142
+ })
143
+ );
144
+ const rows = [];
145
+ for (const el of nodes) {
146
+ const slot = parseFloat(el.getAttribute("data-duration") ?? "");
147
+ if (!(slot > 0)) continue;
148
+ rows.push({
149
+ id: el.id || el.getAttribute("src") || `(${el.tagName.toLowerCase()})`,
150
+ kind: el.tagName === "AUDIO" ? "Audio" : "Video",
151
+ slot,
152
+ attributes: {
153
+ "data-media-start": el.getAttribute("data-media-start"),
154
+ "data-playback-start": el.getAttribute("data-playback-start"),
155
+ "data-playback-rate": el.getAttribute("data-playback-rate"),
156
+ "data-automation": el.getAttribute("data-automation")
157
+ },
158
+ duration: Number.isFinite(el.duration) ? el.duration : reads.get(el)?.duration ?? Number.NaN,
159
+ loop: el.loop || el.getAttribute("data-loop") === "true"
160
+ });
161
+ }
162
+ return rows;
163
+ }, extraWaitMs);
164
+ const warnings = [];
165
+ const unreadable = [];
166
+ for (const clip of clips) {
167
+ if (!Number.isFinite(clip.duration) || clip.duration <= 0) {
168
+ unreadable.push(clip.id);
169
+ continue;
170
+ }
171
+ const mediaSeconds = resolveNaturalMediaTimelineDuration(
172
+ { getAttribute: (name) => clip.attributes[name] ?? null },
173
+ clip.duration
174
+ );
175
+ if (mediaSeconds === null) continue;
176
+ const fit = analyzeClipMediaFit({ slotSeconds: clip.slot, mediaSeconds, loop: clip.loop });
177
+ if (!fit) continue;
178
+ warnings.push({
179
+ level: "warning",
180
+ text: `${clip.kind} "${clip.id}" is ${mediaSeconds.toFixed(2)}s but its slot (data-duration) is ${clip.slot.toFixed(2)}s \u2014 the slot is shortened to the media length when rendered. Set data-duration to ~${mediaSeconds.toFixed(2)}s if that isn't intended.`
181
+ });
182
+ }
183
+ if (unreadable.length > 0) {
184
+ warnings.push({
185
+ level: "warning",
186
+ text: `Could not read the duration of ${unreadable.length} media element(s) within the validate timeout (${unreadable.join(", ")}); their slot vs. source fit was not checked. Re-run with a longer --timeout if the source is slow to load.`
187
+ });
188
+ }
189
+ return warnings;
190
+ }
191
+ async function runContrastAudit(page) {
192
+ const duration = await getCompositionDuration(page);
193
+ if (duration <= 0) return [];
194
+ await page.addScriptTag({ content: loadContrastAuditScript() });
195
+ const results = [];
196
+ for (let i = 0; i < CONTRAST_SAMPLES; i++) {
197
+ const t = +((i + 0.5) / CONTRAST_SAMPLES * duration).toFixed(3);
198
+ await seekCompositionTimeline(page, t, {
199
+ fallbackToBridgeAndTimelines: true,
200
+ waitForPreferredSeekTargetMs: PREFERRED_SEEK_TARGET_WAIT_MS,
201
+ animationFrameSettle: "none",
202
+ settleMs: SEEK_SETTLE_MS
203
+ });
204
+ try {
205
+ const candidates = await page.evaluate(
206
+ () => typeof window.__contrastAuditPrepare === "function" ? window.__contrastAuditPrepare() : []
207
+ );
208
+ const screenshot = await page.screenshot({
209
+ encoding: "base64",
210
+ type: "png",
211
+ omitBackground: true
212
+ });
213
+ const entries = await page.evaluate(
214
+ (b64, time, cands) => typeof window.__contrastAuditFinish === "function" ? window.__contrastAuditFinish(
215
+ b64,
216
+ time,
217
+ cands
218
+ ) : [],
219
+ screenshot,
220
+ t,
221
+ candidates
222
+ );
223
+ results.push(...entries);
224
+ } finally {
225
+ await page.evaluate(() => {
226
+ const restore = window.__contrastAuditRestoreIfPending;
227
+ if (typeof restore === "function") restore();
228
+ });
229
+ }
230
+ }
231
+ return results;
232
+ }
233
+ function loadContrastAuditScript() {
234
+ const candidates = [
235
+ join(__dirname, "contrast-audit.browser.js"),
236
+ join(__dirname, "commands", "contrast-audit.browser.js")
237
+ ];
238
+ for (const candidate of candidates) {
239
+ if (existsSync(candidate)) return readFileSync(candidate, "utf-8");
240
+ }
241
+ throw new Error("Missing contrast audit browser script");
242
+ }
243
+ function extractCompositionErrorsFromLint(lintResult) {
244
+ return lintResult.results.flatMap((r) => r.result.findings).filter((f) => f.code === "missing_or_empty_sub_composition" && f.severity === "error").map((f) => ({ level: "error", text: f.message }));
245
+ }
246
+ async function localizeRemoteAssets(html) {
247
+ let dir;
248
+ try {
249
+ const { loadProducer } = await import("./producer-SKU5EV3J.js");
250
+ const { localizeRemoteMediaSources, localizeRemoteImageSources, localizeRemoteFontFaces } = await loadProducer();
251
+ dir = mkdtempSync(join(tmpdir(), "hf-validate-assets-"));
252
+ const assetDir = dir;
253
+ const media = await localizeRemoteMediaSources(html, assetDir);
254
+ const images = await localizeRemoteImageSources(media.html, assetDir);
255
+ const fonts = await localizeRemoteFontFaces(images.html, assetDir);
256
+ const count = media.remoteMediaAssets.size + images.remoteMediaAssets.size + fonts.remoteMediaAssets.size;
257
+ return {
258
+ html: fonts.html,
259
+ assetRoots: count > 0 ? [assetDir] : [],
260
+ cleanup: () => rmSync(assetDir, { recursive: true, force: true })
261
+ };
262
+ } catch {
263
+ if (dir) rmSync(dir, { recursive: true, force: true });
264
+ return { html, assetRoots: [], cleanup: () => {
265
+ } };
266
+ }
267
+ }
268
+ async function validateInBrowser(project, opts) {
269
+ const projectDir = project.dir;
270
+ const { bundleToSingleHtml } = await import("./compiler-TM3W6GYF.js");
271
+ const { ensureBrowser } = await import("./manager-CD6LJ7ZN.js");
272
+ const { serveStaticProjectHtml } = await import("./staticProjectServer-DFVZOUGI.js");
273
+ const { lintProject } = await import("./lintProject-PDB3UN72.js");
274
+ const lintResult = await lintProject(projectDir);
275
+ const compositionErrors = extractCompositionErrorsFromLint(lintResult);
276
+ const html = await bundleToSingleHtml(projectDir);
277
+ const localized = await localizeRemoteAssets(html);
278
+ const server = await serveStaticProjectHtml(
279
+ projectDir,
280
+ localized.html,
281
+ void 0,
282
+ localized.assetRoots
283
+ ).catch((err) => {
284
+ localized.cleanup();
285
+ throw err;
286
+ });
287
+ const errors = [...compositionErrors];
288
+ const warnings = [];
289
+ let contrast;
290
+ const viewport = resolveCompositionViewportFromHtml(html);
291
+ try {
292
+ const browser = await ensureBrowser();
293
+ const puppeteer = await import("puppeteer-core");
294
+ const { buildChromeArgs, analyzeClipMediaFit } = await import("./src-Z5PGEMXB.js");
295
+ const requestedGpuMode = resolveCliChromeGpuMode();
296
+ const { assertWebGpuAdapterAvailable, compositionRequiresWebGpu, resolveLocalWebGpu } = await import("./gpuPolicy-XLEXORZY.js");
297
+ const resolvedGpuMode = await resolveManagedGpuMode(requestedGpuMode, browser.executablePath);
298
+ const requiresWebGpu = compositionRequiresWebGpu(html);
299
+ const { gpuConfig, softwareWebGpu } = resolveLocalWebGpu(resolvedGpuMode, requiresWebGpu);
300
+ const chromeBrowser = await launchManagedBrowser(puppeteer.default, {
301
+ headless: true,
302
+ executablePath: browser.executablePath,
303
+ args: buildChromeArgs({ ...viewport, captureMode: "screenshot", requiresWebGpu }, gpuConfig)
304
+ });
305
+ try {
306
+ const page = await chromeBrowser.newPage();
307
+ await installPageFunctionGuard(page);
308
+ await page.setViewport(viewport);
309
+ page.on("console", (msg) => {
310
+ const type = msg.type();
311
+ const loc = msg.location();
312
+ const text = msg.text();
313
+ if (type === "error") {
314
+ if (text.startsWith("Failed to load resource")) return;
315
+ errors.push({ level: "error", text, url: loc.url, line: loc.lineNumber });
316
+ } else if (type === "warn") {
317
+ warnings.push({ level: "warning", text, url: loc.url, line: loc.lineNumber });
318
+ }
319
+ });
320
+ page.on("pageerror", (err) => {
321
+ const text = normalizeErrorMessage(err);
322
+ if (text.includes("Unexpected token '<'") || text.includes("Unexpected token '&lt;'"))
323
+ return;
324
+ errors.push({ level: "error", text });
325
+ });
326
+ page.on("requestfailed", (req) => {
327
+ const url = req.url();
328
+ if (url.includes("favicon") || url.startsWith("data:")) return;
329
+ const failureText = req.failure()?.errorText;
330
+ if (shouldIgnoreRequestFailure(url, failureText, req.resourceType())) return;
331
+ const path = projectPathOfUrl(url);
332
+ errors.push({
333
+ level: "error",
334
+ text: `Failed to load ${path}: ${failureText ?? "net::ERR_FAILED"}`,
335
+ url
336
+ });
337
+ });
338
+ page.on("response", (res) => {
339
+ if (res.status() >= 400) {
340
+ const url = res.url();
341
+ if (url.includes("favicon")) return;
342
+ if (shouldIgnoreHttpError(url, res.status())) return;
343
+ const path = projectPathOfUrl(url);
344
+ errors.push({ level: "error", text: `${res.status()} loading ${path}`, url });
345
+ }
346
+ });
347
+ const navTimeoutMs = pageNavigationTimeoutMs(opts.timeout);
348
+ try {
349
+ await page.goto(server.url, { waitUntil: "domcontentloaded", timeout: navTimeoutMs });
350
+ } catch (err) {
351
+ const hinted = navigationTimeoutHint(err, navTimeoutMs);
352
+ if (hinted) throw hinted;
353
+ throw err;
354
+ }
355
+ await assertWebGpuAdapterAvailable(page, requiresWebGpu, softwareWebGpu);
356
+ await waitForRuntimeReady(page, opts.timeout ?? 3e3);
357
+ await new Promise((r) => setTimeout(r, opts.timeout ?? 3e3));
358
+ for (const w of await auditClipDurations(page, analyzeClipMediaFit, opts.timeout ?? 3e3)) {
359
+ warnings.push(w);
360
+ }
361
+ if (opts.contrast) {
362
+ contrast = await runContrastAudit(page);
363
+ }
364
+ } finally {
365
+ await chromeBrowser.close().catch(() => {
366
+ });
367
+ }
368
+ } finally {
369
+ await server.close();
370
+ localized.cleanup();
371
+ }
372
+ return { errors, warnings, contrast };
373
+ }
374
+ function printContrastFailures(failures) {
375
+ console.log();
376
+ console.log(` ${c.warn("\u26A0")} WCAG AA contrast warnings (${failures.length}):`);
377
+ for (const cf of failures) {
378
+ const threshold = cf.large ? "3" : "4.5";
379
+ console.log(
380
+ ` ${c.warn("\xB7")} ${cf.selector} ${c.dim(`"${cf.text}"`)} \u2014 ${c.warn(cf.ratio + ":1")} ${c.dim(`(need ${threshold}:1, t=${cf.time}s)`)}`
381
+ );
382
+ }
383
+ }
384
+ function emitJsonReport(errors, warnings, contrast, contrastFailures) {
385
+ console.log(
386
+ JSON.stringify(
387
+ withMeta(
388
+ {
389
+ ok: errors.length === 0,
390
+ errors,
391
+ warnings,
392
+ contrast,
393
+ contrastFailures: contrastFailures.length
394
+ },
395
+ { deprecated: true }
396
+ ),
397
+ null,
398
+ 2
399
+ )
400
+ );
401
+ }
402
+ function formatConsoleEntry(prefix, e) {
403
+ return ` ${prefix} ${e.text}${e.line ? c.dim(` (line ${e.line})`) : ""}`;
404
+ }
405
+ function formatTotals(errors, warnings, contrastFailures) {
406
+ const parts = [`${errors.length} error(s)`, `${warnings.length} warning(s)`];
407
+ if (contrastFailures.length > 0) parts.push(`${contrastFailures.length} contrast warning(s)`);
408
+ return parts.join(", ");
409
+ }
410
+ function emitTextReport(errors, warnings, contrastFailures, contrastPassed) {
411
+ const hasIssues = errors.length > 0 || warnings.length > 0 || contrastFailures.length > 0;
412
+ if (!hasIssues) {
413
+ const suffix = contrastPassed.length > 0 ? ` \xB7 ${contrastPassed.length} text elements pass WCAG AA` : "";
414
+ console.log(`${c.success("\u25C7")} No console errors${suffix}`);
415
+ return;
416
+ }
417
+ console.log();
418
+ for (const e of errors) console.log(formatConsoleEntry(c.error("\u2717"), e));
419
+ for (const w of warnings) console.log(formatConsoleEntry(c.warn("\u26A0"), w));
420
+ if (contrastFailures.length > 0) printContrastFailures(contrastFailures);
421
+ console.log();
422
+ console.log(`${c.accent("\u25C7")} ${formatTotals(errors, warnings, contrastFailures)}`);
423
+ }
424
+ function emitFailureReport(message, asJson) {
425
+ if (asJson) {
426
+ console.log(
427
+ JSON.stringify(
428
+ withMeta({ ok: false, error: message, errors: [], warnings: [] }, { deprecated: true }),
429
+ null,
430
+ 2
431
+ )
432
+ );
433
+ return;
434
+ }
435
+ console.error(`${c.error("\u2717")} ${message}`);
436
+ }
437
+ var validate_default = defineCommand({
438
+ meta: {
439
+ name: "validate",
440
+ description: `Load a composition in headless Chrome and report console errors (deprecated, use check)
441
+
442
+ Examples:
443
+ framey validate
444
+ framey validate ./my-project
445
+ framey validate --json
446
+ framey validate --timeout 5000`
447
+ },
448
+ args: {
449
+ dir: { type: "positional", description: "Project directory", required: false },
450
+ json: { type: "boolean", description: "Output as JSON", default: false },
451
+ contrast: {
452
+ type: "boolean",
453
+ description: "WCAG contrast audit (enabled by default)",
454
+ default: true
455
+ },
456
+ timeout: {
457
+ type: "string",
458
+ description: "Ms to wait for scripts to settle and media to load (default: 3000). Also raises the page-navigation budget above its 10s floor when a slow external <script> needs longer.",
459
+ default: "3000"
460
+ }
461
+ },
462
+ async run({ args }) {
463
+ printDeprecationNotice("validate");
464
+ const project = resolveProject(args.dir);
465
+ const timeout = parseInt(args.timeout, 10) || 3e3;
466
+ const useContrast = args.contrast ?? true;
467
+ const asJson = Boolean(args.json);
468
+ if (!asJson) {
469
+ console.log(`${c.accent("\u25C6")} Validating ${c.accent(project.name)} in headless Chrome`);
470
+ }
471
+ try {
472
+ const result = await validateInBrowser(project, { timeout, contrast: useContrast });
473
+ const exitCode = printValidationResult(result, asJson);
474
+ setCommandExitCode(exitCode);
475
+ return;
476
+ } catch (err) {
477
+ const message = normalizeErrorMessage(err);
478
+ emitFailureReport(message, asJson);
479
+ failCommand();
480
+ }
481
+ }
482
+ });
483
+ function printValidationResult(result, asJson) {
484
+ const { errors, warnings, contrast } = result;
485
+ const contrastFailures = (contrast ?? []).filter((e) => !e.wcagAA);
486
+ const contrastPassed = (contrast ?? []).filter((e) => e.wcagAA);
487
+ if (asJson) {
488
+ emitJsonReport(errors, warnings, contrast, contrastFailures);
489
+ } else {
490
+ emitTextReport(errors, warnings, contrastFailures, contrastPassed);
491
+ }
492
+ return errors.length > 0 ? 1 : 0;
493
+ }
494
+
495
+ export {
496
+ navigationTimeoutHint,
497
+ shouldIgnoreRequestFailure,
498
+ projectPathOfUrl,
499
+ shouldIgnoreHttpError,
500
+ raceMediaReady,
501
+ auditClipDurations,
502
+ extractCompositionErrorsFromLint,
503
+ validate_default
504
+ };
@@ -0,0 +1,133 @@
1
+ import { createRequire as __hf_createRequire } from "node:module";
2
+ import { fileURLToPath as __hf_fileURLToPath } from "node:url";
3
+ import { dirname as __hf_dirname } from "node:path";
4
+ var require = __hf_createRequire(import.meta.url);
5
+ var __filename = __hf_fileURLToPath(import.meta.url);
6
+ var __dirname = __hf_dirname(__filename);
7
+
8
+ // src/utils/download.ts
9
+ import { randomUUID } from "crypto";
10
+ import { createWriteStream, renameSync, unlinkSync } from "fs";
11
+ import { get as httpsGet } from "https";
12
+ import { Transform } from "stream";
13
+ import { pipeline } from "stream/promises";
14
+ var DEFAULT_DOWNLOAD_TIMEOUT_MS = 3e4;
15
+ var REDIRECT_CODES = /* @__PURE__ */ new Set([301, 302, 303, 307, 308]);
16
+ function redirectTarget(location, from) {
17
+ return new URL(location, from).toString();
18
+ }
19
+ var MAX_REDIRECTS = 10;
20
+ function removePartialFile(path) {
21
+ try {
22
+ unlinkSync(path);
23
+ } catch {
24
+ }
25
+ }
26
+ function measureDownload(options, contentLength) {
27
+ const length = Number(contentLength);
28
+ const totalBytes = Number.isSafeInteger(length) && length >= 0 ? length : null;
29
+ let receivedBytes = 0;
30
+ let reportedAt = Date.now();
31
+ options.onProgress?.(0, totalBytes);
32
+ const stream = new Transform({
33
+ transform(chunk, _encoding, callback) {
34
+ receivedBytes += chunk.byteLength;
35
+ if (options.maxBytes !== void 0 && receivedBytes > options.maxBytes) {
36
+ callback(new Error(`Download exceeded ${options.maxBytes} bytes`));
37
+ return;
38
+ }
39
+ const now = Date.now();
40
+ if (now - reportedAt >= 100) {
41
+ options.onProgress?.(receivedBytes, totalBytes);
42
+ reportedAt = now;
43
+ }
44
+ callback(null, chunk);
45
+ }
46
+ });
47
+ return { stream, complete: () => options.onProgress?.(receivedBytes, totalBytes) };
48
+ }
49
+ function getUrl(url, signal, onResponse) {
50
+ return signal ? httpsGet(url, { signal }, onResponse) : httpsGet(url, onResponse);
51
+ }
52
+ function downloadFile(url, dest, options = {}) {
53
+ const tmp = `${dest}.${process.pid}.${randomUUID()}.tmp`;
54
+ const timeoutMs = options.timeoutMs ?? DEFAULT_DOWNLOAD_TIMEOUT_MS;
55
+ return new Promise((resolve, reject) => {
56
+ const follow = (u, hops = 0) => {
57
+ let activeResponse;
58
+ let responseDiscarded = false;
59
+ let responsePipelineStarted = false;
60
+ let requestError;
61
+ let request;
62
+ try {
63
+ request = getUrl(u, options.signal, (res) => {
64
+ activeResponse = res;
65
+ if (res.statusCode && REDIRECT_CODES.has(res.statusCode)) {
66
+ const location = res.headers.location;
67
+ if (location) {
68
+ responseDiscarded = true;
69
+ res.destroy();
70
+ if (hops >= MAX_REDIRECTS) {
71
+ removePartialFile(tmp);
72
+ reject(
73
+ new Error(
74
+ `Download failed: more than ${MAX_REDIRECTS} redirects from ${url.split("?")[0]}`
75
+ )
76
+ );
77
+ return;
78
+ }
79
+ try {
80
+ follow(redirectTarget(location, u), hops + 1);
81
+ } catch (error) {
82
+ removePartialFile(tmp);
83
+ reject(error);
84
+ }
85
+ return;
86
+ }
87
+ }
88
+ if (res.statusCode !== 200) {
89
+ responseDiscarded = true;
90
+ res.destroy();
91
+ removePartialFile(tmp);
92
+ reject(new Error(`Download failed: HTTP ${res.statusCode}`));
93
+ return;
94
+ }
95
+ const meter = measureDownload(options, res.headers["content-length"]);
96
+ const file = createWriteStream(tmp);
97
+ responsePipelineStarted = true;
98
+ const transfer = pipeline(res, meter.stream, file);
99
+ transfer.then(() => {
100
+ renameSync(tmp, dest);
101
+ meter.complete();
102
+ resolve();
103
+ }).catch((err) => {
104
+ removePartialFile(tmp);
105
+ reject(requestError ?? err);
106
+ });
107
+ });
108
+ } catch (error) {
109
+ removePartialFile(tmp);
110
+ reject(error);
111
+ return;
112
+ }
113
+ request.setTimeout(timeoutMs, () => {
114
+ request.destroy(new Error(`Download timed out after ${timeoutMs}ms`));
115
+ });
116
+ request.on("error", (err) => {
117
+ if (responseDiscarded) return;
118
+ if (responsePipelineStarted) {
119
+ requestError = err;
120
+ activeResponse?.destroy(err);
121
+ return;
122
+ }
123
+ removePartialFile(tmp);
124
+ reject(err);
125
+ });
126
+ };
127
+ follow(url);
128
+ });
129
+ }
130
+
131
+ export {
132
+ downloadFile
133
+ };
@@ -0,0 +1,53 @@
1
+ import { createRequire as __hf_createRequire } from "node:module";
2
+ import { fileURLToPath as __hf_fileURLToPath } from "node:url";
3
+ import { dirname as __hf_dirname } from "node:path";
4
+ var require = __hf_createRequire(import.meta.url);
5
+ var __filename = __hf_fileURLToPath(import.meta.url);
6
+ var __dirname = __hf_dirname(__filename);
7
+
8
+ // ../core/dist/audibleVideo.js
9
+ var AUDIBLE_VIDEO_QUALIFIER = ':not([muted]):is(:not([data-has-audio]),[data-has-audio="true"])';
10
+ var AUDIBLE_MEDIA_SELECTOR = `audio[data-start], video[data-start]${AUDIBLE_VIDEO_QUALIFIER}`;
11
+ function isAudibleVideoElement(el) {
12
+ if (el.tagName.toLowerCase() !== "video" || el.hasAttribute("muted"))
13
+ return false;
14
+ const declared = el.getAttribute("data-has-audio");
15
+ return declared === null || declared === "true";
16
+ }
17
+ function audibleVideoNeedsWebAudio(fields) {
18
+ return (fields.volume ?? 1) > 1 || Boolean(fields.fxChain || fields.automation || fields.audioGroup || fields.masterChain);
19
+ }
20
+
21
+ // ../core/dist/audioGain.js
22
+ var MAX_AUDIO_GAIN_DB = 12;
23
+ function audioDbToGain(db) {
24
+ return 10 ** (db / 20);
25
+ }
26
+ var MAX_AUDIO_GAIN = audioDbToGain(MAX_AUDIO_GAIN_DB);
27
+ function clampAudioGain(value) {
28
+ if (!Number.isFinite(value))
29
+ return 1;
30
+ return Math.max(0, Math.min(MAX_AUDIO_GAIN, value));
31
+ }
32
+ function gainTimesLane(gain, lane) {
33
+ return clampAudioGain(gain * lane);
34
+ }
35
+ function clipGain(volume, tweened) {
36
+ return tweened ? 1 : clampAudioGain(volume);
37
+ }
38
+ function formatAudioGain(gain) {
39
+ return clampAudioGain(gain).toFixed(6).replace(/\.?0+$/, "");
40
+ }
41
+
42
+ export {
43
+ MAX_AUDIO_GAIN_DB,
44
+ MAX_AUDIO_GAIN,
45
+ clampAudioGain,
46
+ gainTimesLane,
47
+ clipGain,
48
+ formatAudioGain,
49
+ AUDIBLE_VIDEO_QUALIFIER,
50
+ AUDIBLE_MEDIA_SELECTOR,
51
+ isAudibleVideoElement,
52
+ audibleVideoNeedsWebAudio
53
+ };
@@ -0,0 +1,6 @@
1
+ import { createRequire as __hf_createRequire } from "node:module";
2
+ import { fileURLToPath as __hf_fileURLToPath } from "node:url";
3
+ import { dirname as __hf_dirname } from "node:path";
4
+ var require = __hf_createRequire(import.meta.url);
5
+ var __filename = __hf_fileURLToPath(import.meta.url);
6
+ var __dirname = __hf_dirname(__filename);