@vfrey/vfrey 0.0.1 → 1.0.0-beta.0

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 (603) 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 +282 -0
  40. package/src/api/commands.ts +330 -0
  41. package/src/api/config.ts +34 -0
  42. package/src/api/creators.ts +463 -0
  43. package/src/api/credentials.ts +152 -0
  44. package/src/api/mail.ts +333 -0
  45. package/src/api/topics.ts +207 -0
  46. package/src/api/types.ts +205 -0
  47. package/src/cli.ts +467 -0
  48. package/src/cloud/executor.ts +281 -0
  49. package/src/cloud/job.ts +106 -0
  50. package/src/cloud/render-job.ts +187 -0
  51. package/src/config.ts +309 -0
  52. package/src/dashboard-link.ts +180 -0
  53. package/src/dashboard-start.ts +103 -0
  54. package/src/desk/channel.ts +64 -0
  55. package/src/desk/cli.ts +216 -0
  56. package/src/desk/creators-route.ts +129 -0
  57. package/src/desk/fonts/JetBrainsMono-OFL.txt +93 -0
  58. package/src/desk/fonts/google-sans-flex-latin.woff2 +0 -0
  59. package/src/desk/fonts/jetbrains-mono-medium.woff2 +0 -0
  60. package/src/desk/http.ts +460 -0
  61. package/src/desk/mail-route.ts +103 -0
  62. package/src/desk/overlay.ts +112 -0
  63. package/src/desk/preview.ts +422 -0
  64. package/src/desk/screens.ts +149 -0
  65. package/src/desk/secrets.ts +143 -0
  66. package/src/desk/series.ts +127 -0
  67. package/src/desk/state.ts +77 -0
  68. package/src/desk/studio-route.ts +119 -0
  69. package/src/desk/tick-runner.ts +66 -0
  70. package/src/desk/tick.ts +56 -0
  71. package/src/desk/topics-route.ts +41 -0
  72. package/src/desk/ui/app.css +505 -0
  73. package/src/desk/ui/app.js +185 -0
  74. package/src/desk/ui/apple-icon.png +0 -0
  75. package/src/desk/ui/components.js +79 -0
  76. package/src/desk/ui/core.js +156 -0
  77. package/src/desk/ui/favicon.ico +0 -0
  78. package/src/desk/ui/icon.svg +1 -0
  79. package/src/desk/ui/icons.js +49 -0
  80. package/src/desk/ui/index.html +41 -0
  81. package/src/desk/ui/metrics-math.d.ts +22 -0
  82. package/src/desk/ui/metrics-math.js +135 -0
  83. package/src/desk/ui/theme.js +5 -0
  84. package/src/desk/ui/views-creators.js +209 -0
  85. package/src/desk/ui/views-keys.js +114 -0
  86. package/src/desk/ui/views-mail.js +188 -0
  87. package/src/desk/ui/views-misc.js +123 -0
  88. package/src/desk/ui/views-review.js +119 -0
  89. package/src/desk/ui/views-runs.js +350 -0
  90. package/src/desk/ui/views-screens.js +163 -0
  91. package/src/desk/ui/views-series.js +318 -0
  92. package/src/desk/ui/views-topics.js +87 -0
  93. package/src/desk/verbs.ts +361 -0
  94. package/src/doctor.ts +212 -0
  95. package/src/drain.ts +14 -0
  96. package/src/engage/index.ts +217 -0
  97. package/src/generate/index.ts +110 -0
  98. package/src/generate/script.ts +152 -0
  99. package/src/generate/title.ts +78 -0
  100. package/src/help.ts +233 -0
  101. package/src/home.ts +45 -0
  102. package/src/llm/client.ts +177 -0
  103. package/src/log.ts +7 -0
  104. package/src/oauth/tokens.ts +189 -0
  105. package/src/oauth/vault.ts +72 -0
  106. package/src/pipeline/review.ts +642 -0
  107. package/src/pipeline/run.ts +443 -0
  108. package/src/pipeline/series-guard.ts +26 -0
  109. package/src/pipeline/source-fetch.ts +69 -0
  110. package/src/pipeline/stages.ts +728 -0
  111. package/src/pipeline/topics-source.ts +90 -0
  112. package/src/product/commands.ts +296 -0
  113. package/src/product/config-file.ts +38 -0
  114. package/src/product/engine-choice.ts +89 -0
  115. package/src/product/engines.ts +103 -0
  116. package/src/product/insights.ts +50 -0
  117. package/src/product/keys.ts +67 -0
  118. package/src/product/paths.ts +18 -0
  119. package/src/product/probes.ts +88 -0
  120. package/src/product/push-flow.ts +90 -0
  121. package/src/product/render-video.ts +21 -0
  122. package/src/product/short.ts +62 -0
  123. package/src/product/update.ts +32 -0
  124. package/src/project/canonical.ts +14 -0
  125. package/src/project/commands.ts +177 -0
  126. package/src/project/dashboard-status.ts +28 -0
  127. package/src/project/discover.ts +19 -0
  128. package/src/project/index-file.ts +73 -0
  129. package/src/project/marker.ts +87 -0
  130. package/src/project/migrate.ts +201 -0
  131. package/src/project/names.ts +27 -0
  132. package/src/project/notice.ts +16 -0
  133. package/src/project/open.ts +88 -0
  134. package/src/project/scaffold.ts +112 -0
  135. package/src/project/templates.ts +42 -0
  136. package/src/project/videos.ts +64 -0
  137. package/src/publish/facebook.ts +91 -0
  138. package/src/publish/index.ts +12 -0
  139. package/src/publish/instagram.ts +97 -0
  140. package/src/publish/rate.ts +62 -0
  141. package/src/publish/session.ts +242 -0
  142. package/src/publish/tiktok.ts +202 -0
  143. package/src/publish/youtube.ts +177 -0
  144. package/src/queue/desk-ops.ts +1170 -0
  145. package/src/queue/seal.ts +3 -0
  146. package/src/queue/store.ts +1006 -0
  147. package/src/remotion/AiLabel.tsx +26 -0
  148. package/src/remotion/Root.tsx +73 -0
  149. package/src/remotion/defaults.ts +26 -0
  150. package/src/remotion/films/claude/ClaudeFilm.tsx +1014 -0
  151. package/src/remotion/films/engine/EngineMark.tsx +17 -0
  152. package/src/remotion/films/rea/ReaShort.tsx +552 -0
  153. package/src/remotion/films/rea/drawings.tsx +907 -0
  154. package/src/remotion/films/rea/timing.ts +144 -0
  155. package/src/remotion/index.ts +4 -0
  156. package/src/remotion/templates/EditorialSplit.tsx +39 -0
  157. package/src/remotion/templates/KineticType.tsx +39 -0
  158. package/src/remotion/templates/SignalBoard.tsx +50 -0
  159. package/src/remotion/timing.ts +22 -0
  160. package/src/render/chrome.ts +78 -0
  161. package/src/render/engine-mark.ts +29 -0
  162. package/src/render/framey-template.ts +130 -0
  163. package/src/render/html-engine.ts +149 -0
  164. package/src/render/node-crypto-stub.ts +11 -0
  165. package/src/render/probe.ts +29 -0
  166. package/src/render/props.ts +17 -0
  167. package/src/render/vertical-short.ts +35 -0
  168. package/src/render/webpack.ts +33 -0
  169. package/src/render/worker.ts +65 -0
  170. package/src/scene/assets/fonts/TitanOne-OFL.txt +94 -0
  171. package/src/scene/assets/fonts/titan-one.woff2 +0 -0
  172. package/src/scene/assets/gsap/LICENSE.txt +8 -0
  173. package/src/scene/assets/gsap/gsap.min.js +11 -0
  174. package/src/scene/audio.ts +54 -0
  175. package/src/scene/blocks/LICENSE +190 -0
  176. package/src/scene/blocks/NOTICE +5 -0
  177. package/src/scene/blocks/bar-chart-race/bar-chart-race.html +585 -0
  178. package/src/scene/blocks/beat-freeze-cut/beat-freeze-cut.html +874 -0
  179. package/src/scene/blocks/camcorder-hud/camcorder-hud.html +164 -0
  180. package/src/scene/blocks/camera-dolly-zoom/camera-dolly-zoom.html +355 -0
  181. package/src/scene/blocks/code-diff/code-diff.html +817 -0
  182. package/src/scene/blocks/code-snippet-apple-terminal-pro/code-snippet-apple-terminal-pro.html +248 -0
  183. package/src/scene/blocks/code-typing/code-typing.html +764 -0
  184. package/src/scene/blocks/data-chart/data-chart.html +452 -0
  185. package/src/scene/blocks/flowchart-vertical/flowchart-vertical.html +454 -0
  186. package/src/scene/blocks/hw-scribble-transition/hw-scribble-transition.html +153 -0
  187. package/src/scene/blocks/index.json +824 -0
  188. package/src/scene/blocks/lt-accent-underline/lt-accent-underline.html +107 -0
  189. package/src/scene/blocks/lt-bold-block/lt-bold-block.html +109 -0
  190. package/src/scene/blocks/lt-clean-bar/lt-clean-bar.html +112 -0
  191. package/src/scene/blocks/lt-dark-card/lt-dark-card.html +111 -0
  192. package/src/scene/blocks/lt-kicker-name/lt-kicker-name.html +114 -0
  193. package/src/scene/blocks/lt-mask-reveal/lt-mask-reveal.html +120 -0
  194. package/src/scene/blocks/lt-neon-border/lt-neon-border.html +391 -0
  195. package/src/scene/blocks/lt-stack-bars/lt-stack-bars.html +109 -0
  196. package/src/scene/blocks/macos-notification/macos-notification.html +194 -0
  197. package/src/scene/blocks/mk-background/mk-background.html +236 -0
  198. package/src/scene/blocks/mk-callout-highlight/mk-callout-highlight.html +183 -0
  199. package/src/scene/blocks/mk-clone-wall-transition/mk-clone-wall-transition.html +226 -0
  200. package/src/scene/blocks/mk-line-graph/mk-line-graph.html +293 -0
  201. package/src/scene/blocks/mk-progress-stat/mk-progress-stat.html +186 -0
  202. package/src/scene/blocks/mk-specs-list/mk-specs-list.html +223 -0
  203. package/src/scene/blocks/news-ticker/news-ticker.html +409 -0
  204. package/src/scene/blocks/organic-light-leak-overlay/organic-light-leak-overlay.html +126 -0
  205. package/src/scene/blocks/oscilloscope-trace/oscilloscope-trace.html +519 -0
  206. package/src/scene/blocks/snow/snow.html +205 -0
  207. package/src/scene/blocks/split-flap-board/split-flap-board.html +347 -0
  208. package/src/scene/blocks/spotify-card/spotify-card.html +294 -0
  209. package/src/scene/blocks/starfield/starfield.html +188 -0
  210. package/src/scene/blocks/thread-message-stack/thread-message-stack.html +239 -0
  211. package/src/scene/blocks/week-in-merges/week-in-merges.html +470 -0
  212. package/src/scene/blocks/x-post/x-post.html +437 -0
  213. package/src/scene/blocks/yt-comment-card/yt-comment-card.html +319 -0
  214. package/src/scene/blocks/yt-lcd-background/yt-lcd-background.html +307 -0
  215. package/src/scene/blocks/yt-prism-title/yt-prism-title.html +205 -0
  216. package/src/scene/blocks.ts +229 -0
  217. package/src/scene/command.ts +272 -0
  218. package/src/scene/figure.ts +181 -0
  219. package/src/scene/glyphs.ts +107 -0
  220. package/src/scene/init.ts +86 -0
  221. package/src/scene/inspect/css-tree.d.ts +6 -0
  222. package/src/scene/inspect/page-scripts.ts +272 -0
  223. package/src/scene/inspect/report.ts +405 -0
  224. package/src/scene/inspect/run.ts +200 -0
  225. package/src/scene/inspect/source.ts +236 -0
  226. package/src/scene/label.ts +131 -0
  227. package/src/scene/net-guard.ts +74 -0
  228. package/src/scene/render.ts +292 -0
  229. package/src/scene/runtime/browser.ts +199 -0
  230. package/src/scene/runtime/core.ts +181 -0
  231. package/src/scene/runtime/react.tsx +115 -0
  232. package/src/scene/runtime/transitions.ts +133 -0
  233. package/src/scene/sanitize.ts +181 -0
  234. package/src/scene/scene.ts +152 -0
  235. package/src/scene/studio-command.ts +48 -0
  236. package/src/scene/studio-skin.ts +59 -0
  237. package/src/scene/studio.ts +337 -0
  238. package/src/scene/supply.ts +111 -0
  239. package/src/scene/timing.ts +288 -0
  240. package/src/scene/transitions/LICENSE +190 -0
  241. package/src/scene/transitions/NOTICE +5 -0
  242. package/src/scene/transitions/SOURCE.json +24 -0
  243. package/src/scene/transitions/transitions.global.js +38 -0
  244. package/src/scene/transitions.ts +26 -0
  245. package/src/service/all-projects.ts +153 -0
  246. package/src/service/commands.ts +256 -0
  247. package/src/service/due.ts +82 -0
  248. package/src/service/lock.ts +101 -0
  249. package/src/service/log-file.ts +56 -0
  250. package/src/service/state.ts +41 -0
  251. package/src/service/units.ts +90 -0
  252. package/src/service/worker.ts +51 -0
  253. package/src/skill-agents.ts +74 -0
  254. package/src/skill-install.ts +334 -0
  255. package/src/sync-write.ts +21 -0
  256. package/src/tick-report.ts +205 -0
  257. package/src/tts.ts +124 -0
  258. package/vendor/@vfrey/contracts/dist/account.d.ts +97 -0
  259. package/vendor/@vfrey/contracts/dist/account.js +27 -0
  260. package/vendor/@vfrey/contracts/dist/checks.d.ts +8 -0
  261. package/vendor/@vfrey/contracts/dist/checks.js +1 -0
  262. package/vendor/@vfrey/contracts/dist/credentials/crypto.d.ts +4 -0
  263. package/vendor/@vfrey/contracts/dist/credentials/crypto.js +38 -0
  264. package/vendor/@vfrey/contracts/dist/domain/advice-persona.d.ts +10 -0
  265. package/vendor/@vfrey/contracts/dist/domain/advice-persona.js +24 -0
  266. package/vendor/@vfrey/contracts/dist/domain/backoff.d.ts +13 -0
  267. package/vendor/@vfrey/contracts/dist/domain/backoff.js +27 -0
  268. package/vendor/@vfrey/contracts/dist/domain/cadence.d.ts +29 -0
  269. package/vendor/@vfrey/contracts/dist/domain/cadence.js +95 -0
  270. package/vendor/@vfrey/contracts/dist/domain/creators.d.ts +146 -0
  271. package/vendor/@vfrey/contracts/dist/domain/creators.js +2 -0
  272. package/vendor/@vfrey/contracts/dist/domain/disclosure.d.ts +127 -0
  273. package/vendor/@vfrey/contracts/dist/domain/disclosure.js +250 -0
  274. package/vendor/@vfrey/contracts/dist/domain/errors.d.ts +34 -0
  275. package/vendor/@vfrey/contracts/dist/domain/errors.js +68 -0
  276. package/vendor/@vfrey/contracts/dist/domain/redact.d.ts +1 -0
  277. package/vendor/@vfrey/contracts/dist/domain/redact.js +21 -0
  278. package/vendor/@vfrey/contracts/dist/domain/revenue.d.ts +13 -0
  279. package/vendor/@vfrey/contracts/dist/domain/revenue.js +16 -0
  280. package/vendor/@vfrey/contracts/dist/domain/safety.d.ts +20 -0
  281. package/vendor/@vfrey/contracts/dist/domain/safety.js +61 -0
  282. package/vendor/@vfrey/contracts/dist/domain/similarity.d.ts +13 -0
  283. package/vendor/@vfrey/contracts/dist/domain/similarity.js +100 -0
  284. package/vendor/@vfrey/contracts/dist/domain/templates.d.ts +18 -0
  285. package/vendor/@vfrey/contracts/dist/domain/templates.js +67 -0
  286. package/vendor/@vfrey/contracts/dist/domain/tiktok-chunks.d.ts +19 -0
  287. package/vendor/@vfrey/contracts/dist/domain/tiktok-chunks.js +52 -0
  288. package/vendor/@vfrey/contracts/dist/domain/topics.d.ts +78 -0
  289. package/vendor/@vfrey/contracts/dist/domain/topics.js +4 -0
  290. package/vendor/@vfrey/contracts/dist/domain/types.d.ts +216 -0
  291. package/vendor/@vfrey/contracts/dist/domain/types.js +1 -0
  292. package/vendor/@vfrey/contracts/dist/domain/variation.d.ts +57 -0
  293. package/vendor/@vfrey/contracts/dist/domain/variation.js +278 -0
  294. package/vendor/@vfrey/contracts/dist/events.d.ts +20 -0
  295. package/vendor/@vfrey/contracts/dist/events.js +1 -0
  296. package/vendor/@vfrey/contracts/dist/http.d.ts +11 -0
  297. package/vendor/@vfrey/contracts/dist/http.js +37 -0
  298. package/vendor/@vfrey/contracts/dist/index.d.ts +22 -0
  299. package/vendor/@vfrey/contracts/dist/index.js +22 -0
  300. package/vendor/@vfrey/contracts/dist/log.d.ts +2 -0
  301. package/vendor/@vfrey/contracts/dist/log.js +10 -0
  302. package/vendor/@vfrey/contracts/dist/mail.d.ts +55 -0
  303. package/vendor/@vfrey/contracts/dist/mail.js +1 -0
  304. package/vendor/@vfrey/contracts/package.json +18 -0
  305. package/vendor/@vfrey/ingest/dist/index.d.ts +41 -0
  306. package/vendor/@vfrey/ingest/dist/index.js +221 -0
  307. package/vendor/@vfrey/ingest/dist/parse.d.ts +5 -0
  308. package/vendor/@vfrey/ingest/dist/parse.js +165 -0
  309. package/vendor/@vfrey/ingest/package.json +21 -0
  310. package/vendor/framey/LICENSE +190 -0
  311. package/vendor/framey/NOTICE +15 -0
  312. package/vendor/framey/SOURCE.json +24 -0
  313. package/vendor/framey/STUDIO-SOURCE.json +9 -0
  314. package/vendor/framey/bin/framey-localize-fonts.mjs +12 -0
  315. package/vendor/framey/bin/framey.mjs +16 -0
  316. package/vendor/framey/dist/add-VMJD5KBS.js +75 -0
  317. package/vendor/framey/dist/animatedGifPrep-QPKGJ6PM.js +43 -0
  318. package/vendor/framey/dist/api.d.ts +211 -0
  319. package/vendor/framey/dist/api.js +76 -0
  320. package/vendor/framey/dist/appHistory-WW56FZTT.js +31 -0
  321. package/vendor/framey/dist/asset-WQKGOELE.js +26 -0
  322. package/vendor/framey/dist/audio-RSJWVWRA.js +1936 -0
  323. package/vendor/framey/dist/batchRender-3HPICDCT.js +366 -0
  324. package/vendor/framey/dist/beats-HL2BDUZI.js +273 -0
  325. package/vendor/framey/dist/benchmark-RWCWHI5Z.js +230 -0
  326. package/vendor/framey/dist/browser-ECYET3Q2.js +206 -0
  327. package/vendor/framey/dist/bundleWithLocalizedFonts-ALYBQEQT.js +52 -0
  328. package/vendor/framey/dist/captureCompositionFrame-4DA6SEH2.js +94 -0
  329. package/vendor/framey/dist/catalog-5JVDEUWK.js +979 -0
  330. package/vendor/framey/dist/catch-up-NEBCL5NO.js +106 -0
  331. package/vendor/framey/dist/check-F5N544ML.js +111 -0
  332. package/vendor/framey/dist/checkBrowser-LZ66CMJG.js +110 -0
  333. package/vendor/framey/dist/chunk-2K7Z2HVP.js +372 -0
  334. package/vendor/framey/dist/chunk-2UZQHDM7.js +323 -0
  335. package/vendor/framey/dist/chunk-2X4PQEYM.js +34 -0
  336. package/vendor/framey/dist/chunk-3422KMTD.js +168 -0
  337. package/vendor/framey/dist/chunk-3FYD4YEK.js +72 -0
  338. package/vendor/framey/dist/chunk-3GXQPCJC.js +682 -0
  339. package/vendor/framey/dist/chunk-3LM6YPBR.js +179 -0
  340. package/vendor/framey/dist/chunk-442JNXRM.js +20 -0
  341. package/vendor/framey/dist/chunk-4BNN5FGX.js +182 -0
  342. package/vendor/framey/dist/chunk-4P7NX5BM.js +11532 -0
  343. package/vendor/framey/dist/chunk-4UMPIPCQ.js +88 -0
  344. package/vendor/framey/dist/chunk-4YYJOFKS.js +28 -0
  345. package/vendor/framey/dist/chunk-54HJ63Q2.js +29 -0
  346. package/vendor/framey/dist/chunk-5ETJX6WM.js +89 -0
  347. package/vendor/framey/dist/chunk-5SG54JRS.js +68 -0
  348. package/vendor/framey/dist/chunk-634HSJ3J.js +58 -0
  349. package/vendor/framey/dist/chunk-66LREXGS.js +48 -0
  350. package/vendor/framey/dist/chunk-6BEFEWFB.js +25 -0
  351. package/vendor/framey/dist/chunk-6BNTGNGD.js +286 -0
  352. package/vendor/framey/dist/chunk-6DDPOHMK.js +140 -0
  353. package/vendor/framey/dist/chunk-6GV5XSOR.js +214 -0
  354. package/vendor/framey/dist/chunk-6JR2XUEE.js +127 -0
  355. package/vendor/framey/dist/chunk-73QVATIM.js +362 -0
  356. package/vendor/framey/dist/chunk-7FMUTGOH.js +279 -0
  357. package/vendor/framey/dist/chunk-7JQFJ6JJ.js +291 -0
  358. package/vendor/framey/dist/chunk-AHPGAESX.js +113 -0
  359. package/vendor/framey/dist/chunk-AHX34EFP.js +15 -0
  360. package/vendor/framey/dist/chunk-AJ5CSAEZ.js +487 -0
  361. package/vendor/framey/dist/chunk-B7RJV74O.js +5047 -0
  362. package/vendor/framey/dist/chunk-BL4U6U52.js +254 -0
  363. package/vendor/framey/dist/chunk-BSQ7XANM.js +210 -0
  364. package/vendor/framey/dist/chunk-BZ56MTDX.js +6 -0
  365. package/vendor/framey/dist/chunk-C5BO7PMT.js +282 -0
  366. package/vendor/framey/dist/chunk-CFUCHO4T.js +358 -0
  367. package/vendor/framey/dist/chunk-CZGHFATT.js +31 -0
  368. package/vendor/framey/dist/chunk-DLA44CMS.js +5649 -0
  369. package/vendor/framey/dist/chunk-DPVXBVLL.js +31292 -0
  370. package/vendor/framey/dist/chunk-DQBY7FRR.js +397 -0
  371. package/vendor/framey/dist/chunk-EAMLBAHA.js +154 -0
  372. package/vendor/framey/dist/chunk-EOVYQ3IG.js +143 -0
  373. package/vendor/framey/dist/chunk-EVMY7IPL.js +612 -0
  374. package/vendor/framey/dist/chunk-FG4BBFZI.js +122 -0
  375. package/vendor/framey/dist/chunk-FI4I7CME.js +56 -0
  376. package/vendor/framey/dist/chunk-FLREUEHW.js +2081 -0
  377. package/vendor/framey/dist/chunk-FUFP7A7S.js +1126 -0
  378. package/vendor/framey/dist/chunk-FV3PIKGH.js +56 -0
  379. package/vendor/framey/dist/chunk-FXMKHHPO.js +123 -0
  380. package/vendor/framey/dist/chunk-GGZAM5VH.js +1187 -0
  381. package/vendor/framey/dist/chunk-GKZEVJIB.js +39 -0
  382. package/vendor/framey/dist/chunk-GMECXFAN.js +57 -0
  383. package/vendor/framey/dist/chunk-GNEFDLFB.js +621 -0
  384. package/vendor/framey/dist/chunk-GPMLSOEG.js +19274 -0
  385. package/vendor/framey/dist/chunk-GPYVT5EE.js +59 -0
  386. package/vendor/framey/dist/chunk-H6IEMZEV.js +40 -0
  387. package/vendor/framey/dist/chunk-HEFQCIXR.js +170 -0
  388. package/vendor/framey/dist/chunk-HFQ4CWHA.js +118 -0
  389. package/vendor/framey/dist/chunk-HPDTCOKE.js +304 -0
  390. package/vendor/framey/dist/chunk-HTUHQKDB.js +548 -0
  391. package/vendor/framey/dist/chunk-HU2SPFNG.js +103 -0
  392. package/vendor/framey/dist/chunk-HVW7ABXD.js +19 -0
  393. package/vendor/framey/dist/chunk-IG7NDKXO.js +26 -0
  394. package/vendor/framey/dist/chunk-II3J3WXK.js +246 -0
  395. package/vendor/framey/dist/chunk-IR35BCLK.js +13 -0
  396. package/vendor/framey/dist/chunk-ISN5GRYI.js +20 -0
  397. package/vendor/framey/dist/chunk-IUONB55J.js +669 -0
  398. package/vendor/framey/dist/chunk-IVSUQR2B.js +161 -0
  399. package/vendor/framey/dist/chunk-IXU6PQSW.js +259 -0
  400. package/vendor/framey/dist/chunk-IZCW2NKT.js +29 -0
  401. package/vendor/framey/dist/chunk-JGXJU5PF.js +68 -0
  402. package/vendor/framey/dist/chunk-JHOCK3DG.js +27 -0
  403. package/vendor/framey/dist/chunk-JVBRJMOP.js +121 -0
  404. package/vendor/framey/dist/chunk-K4MJX7SR.js +17 -0
  405. package/vendor/framey/dist/chunk-K4WKGXRC.js +18 -0
  406. package/vendor/framey/dist/chunk-KGPLIH7B.js +127 -0
  407. package/vendor/framey/dist/chunk-KLIKCX6Q.js +63 -0
  408. package/vendor/framey/dist/chunk-KXTKKBOC.js +61 -0
  409. package/vendor/framey/dist/chunk-KZI44OPA.js +185 -0
  410. package/vendor/framey/dist/chunk-LEKZNRKI.js +45 -0
  411. package/vendor/framey/dist/chunk-LFGJWOVA.js +61 -0
  412. package/vendor/framey/dist/chunk-LLMSX6V6.js +17 -0
  413. package/vendor/framey/dist/chunk-LTGTN2TH.js +195 -0
  414. package/vendor/framey/dist/chunk-M2WBOQ2Q.js +54 -0
  415. package/vendor/framey/dist/chunk-MI5FTLYK.js +399 -0
  416. package/vendor/framey/dist/chunk-MLQP2QUF.js +1809 -0
  417. package/vendor/framey/dist/chunk-MMQ52NIZ.js +956 -0
  418. package/vendor/framey/dist/chunk-ND46XKK3.js +742 -0
  419. package/vendor/framey/dist/chunk-NYEXNSHM.js +504 -0
  420. package/vendor/framey/dist/chunk-O4YRB27L.js +57 -0
  421. package/vendor/framey/dist/chunk-O7BGSQ5F.js +92 -0
  422. package/vendor/framey/dist/chunk-OFQWTKPW.js +117 -0
  423. package/vendor/framey/dist/chunk-P5ZBLXJ6.js +91 -0
  424. package/vendor/framey/dist/chunk-P6LJ4Y32.js +4662 -0
  425. package/vendor/framey/dist/chunk-PKZ7RK5N.js +281 -0
  426. package/vendor/framey/dist/chunk-PURHAXFL.js +15 -0
  427. package/vendor/framey/dist/chunk-Q5X2B5WT.js +29 -0
  428. package/vendor/framey/dist/chunk-QAMKOG67.js +248 -0
  429. package/vendor/framey/dist/chunk-R6YBK4XX.js +514 -0
  430. package/vendor/framey/dist/chunk-RGLQURIX.js +2997 -0
  431. package/vendor/framey/dist/chunk-RNV3DM4S.js +3573 -0
  432. package/vendor/framey/dist/chunk-ROEW726S.js +4638 -0
  433. package/vendor/framey/dist/chunk-RQVDTPGD.js +6 -0
  434. package/vendor/framey/dist/chunk-RVZHGOGR.js +26 -0
  435. package/vendor/framey/dist/chunk-RXATE6FZ.js +385 -0
  436. package/vendor/framey/dist/chunk-S3S4TGEH.js +424 -0
  437. package/vendor/framey/dist/chunk-SDYDNHEE.js +11202 -0
  438. package/vendor/framey/dist/chunk-SSWBU67I.js +173 -0
  439. package/vendor/framey/dist/chunk-ST35C4K6.js +28 -0
  440. package/vendor/framey/dist/chunk-SZNTYTIV.js +990 -0
  441. package/vendor/framey/dist/chunk-T2EUWCJE.js +29 -0
  442. package/vendor/framey/dist/chunk-T6AGUTZJ.js +444 -0
  443. package/vendor/framey/dist/chunk-THJALHFJ.js +11131 -0
  444. package/vendor/framey/dist/chunk-TIQB63MX.js +18128 -0
  445. package/vendor/framey/dist/chunk-U242RTCT.js +134 -0
  446. package/vendor/framey/dist/chunk-UJZREAV6.js +3901 -0
  447. package/vendor/framey/dist/chunk-UMD3V7CU.js +264 -0
  448. package/vendor/framey/dist/chunk-UOFAE5RF.js +42 -0
  449. package/vendor/framey/dist/chunk-UTEIUGAZ.js +29 -0
  450. package/vendor/framey/dist/chunk-VAS6HQX3.js +138 -0
  451. package/vendor/framey/dist/chunk-VC76R6W2.js +27 -0
  452. package/vendor/framey/dist/chunk-VFZ7W5W7.js +226 -0
  453. package/vendor/framey/dist/chunk-VHNLZAE2.js +348 -0
  454. package/vendor/framey/dist/chunk-VMC4WSH5.js +278 -0
  455. package/vendor/framey/dist/chunk-VORQIH64.js +108 -0
  456. package/vendor/framey/dist/chunk-VTXFRIHO.js +186 -0
  457. package/vendor/framey/dist/chunk-W2LGJSEN.js +182 -0
  458. package/vendor/framey/dist/chunk-WKBM7NDG.js +32 -0
  459. package/vendor/framey/dist/chunk-WMQNIQDJ.js +2057 -0
  460. package/vendor/framey/dist/chunk-WN4XZC5F.js +504 -0
  461. package/vendor/framey/dist/chunk-WQ6ZXHFQ.js +133 -0
  462. package/vendor/framey/dist/chunk-X7HBSTCZ.js +53 -0
  463. package/vendor/framey/dist/chunk-X7MTZ4T2.js +6 -0
  464. package/vendor/framey/dist/chunk-XPTOJZJF.js +308 -0
  465. package/vendor/framey/dist/chunk-XT6MXC7A.js +6 -0
  466. package/vendor/framey/dist/chunk-XT7X6QCP.js +6 -0
  467. package/vendor/framey/dist/chunk-XTMDWNEC.js +2820 -0
  468. package/vendor/framey/dist/chunk-XUHOIDKG.js +6 -0
  469. package/vendor/framey/dist/chunk-XX7LTW5Y.js +138 -0
  470. package/vendor/framey/dist/chunk-Y3YGTZEG.js +382 -0
  471. package/vendor/framey/dist/chunk-Y5SBSGN7.js +346 -0
  472. package/vendor/framey/dist/chunk-YCMVI4MZ.js +625 -0
  473. package/vendor/framey/dist/chunk-YOR4CTCE.js +261 -0
  474. package/vendor/framey/dist/chunk-YPRBGITP.js +2748 -0
  475. package/vendor/framey/dist/chunk-ZKDMAOFU.js +32 -0
  476. package/vendor/framey/dist/chunk-ZW6DURPF.js +1318 -0
  477. package/vendor/framey/dist/clean-ZJOGDKDM.js +336 -0
  478. package/vendor/framey/dist/cli.js +439 -0
  479. package/vendor/framey/dist/cloudrun-HGJ3B6ZV.js +767 -0
  480. package/vendor/framey/dist/commands/contrast-audit.browser.js +643 -0
  481. package/vendor/framey/dist/commands/layout-audit.browser.js +2914 -0
  482. package/vendor/framey/dist/commands/motion-sample.browser.js +74 -0
  483. package/vendor/framey/dist/commands/motion-signature.browser.js +475 -0
  484. package/vendor/framey/dist/compare-W7UY3BAZ.js +463 -0
  485. package/vendor/framey/dist/compiler-TM3W6GYF.js +136 -0
  486. package/vendor/framey/dist/component-QF5VGYMU.js +176 -0
  487. package/vendor/framey/dist/compositions-XT3PMNDF.js +238 -0
  488. package/vendor/framey/dist/contactSheet-7W6GYHBQ.js +24 -0
  489. package/vendor/framey/dist/deploy-6FJPWKF2.js +299 -0
  490. package/vendor/framey/dist/destroy-HE2RIPKZ.js +57 -0
  491. package/vendor/framey/dist/deterministicFonts-RADD3BSX.js +50 -0
  492. package/vendor/framey/dist/dist-4S2FGGVY.js +422 -0
  493. package/vendor/framey/dist/dist-BE4B2EZE.js +32 -0
  494. package/vendor/framey/dist/dist-EWXJGN63.js +129 -0
  495. package/vendor/framey/dist/docs-VKIRFEEX.js +131 -0
  496. package/vendor/framey/dist/doctor-2UNJ2G7U.js +74 -0
  497. package/vendor/framey/dist/dom-37K6YOH4.js +14 -0
  498. package/vendor/framey/dist/dotEnv-7PZQTVIM.js +54 -0
  499. package/vendor/framey/dist/events-ACY3P2PA.js +76 -0
  500. package/vendor/framey/dist/events-IHB3B2MK.js +69 -0
  501. package/vendor/framey/dist/ffmpeg-DR5LGGSK.js +63 -0
  502. package/vendor/framey/dist/figma-BODVUPHB.js +63 -0
  503. package/vendor/framey/dist/fontData.generated-NXAOI4GH.js +13 -0
  504. package/vendor/framey/dist/fontLocalizeCli.js +142 -0
  505. package/vendor/framey/dist/gpuPolicy-XLEXORZY.js +49 -0
  506. package/vendor/framey/dist/grade-compare-GAXFQ74C.js +661 -0
  507. package/vendor/framey/dist/gsapParser-IEUSLYDJ.js +2885 -0
  508. package/vendor/framey/dist/gsapParserAcorn-LZJKCFQI.js +30 -0
  509. package/vendor/framey/dist/help-VCB5X2HS.js +184 -0
  510. package/vendor/framey/dist/history-ENGZEVFT.js +471 -0
  511. package/vendor/framey/dist/hyperframe.manifest.json +22 -0
  512. package/vendor/framey/dist/hyperframe.runtime.iife.js +1132 -0
  513. package/vendor/framey/dist/hyperframes-player.global.js +478 -0
  514. package/vendor/framey/dist/hyperframes-slideshow.global.js +148 -0
  515. package/vendor/framey/dist/info-WPCJHBMU.js +182 -0
  516. package/vendor/framey/dist/init-G4WGLYGD.js +1176 -0
  517. package/vendor/framey/dist/inspect-5IQ6CNEQ.js +106 -0
  518. package/vendor/framey/dist/installer-ML4HWUV7.js +40 -0
  519. package/vendor/framey/dist/keyframes-Q6XJO7VW.js +2755 -0
  520. package/vendor/framey/dist/lambda-A7JC74JF.js +468 -0
  521. package/vendor/framey/dist/layout-YET6XNXA.js +95 -0
  522. package/vendor/framey/dist/lint-I7FZN2VJ.js +162 -0
  523. package/vendor/framey/dist/lintProject-PDB3UN72.js +30 -0
  524. package/vendor/framey/dist/manager-CD6LJ7ZN.js +45 -0
  525. package/vendor/framey/dist/manager-WA4F2GST.js +67 -0
  526. package/vendor/framey/dist/media-treatment-BXYS4WVA.js +1030 -0
  527. package/vendor/framey/dist/media-use-LWH3MANK.js +113 -0
  528. package/vendor/framey/dist/models-K363FYM4.js +195 -0
  529. package/vendor/framey/dist/motionShot-GPAVWXLH.js +640 -0
  530. package/vendor/framey/dist/normalize-FASIPBUM.js +24 -0
  531. package/vendor/framey/dist/normalize-audio-VDWYRHN6.js +268 -0
  532. package/vendor/framey/dist/open-E3TB6P6J.js +128 -0
  533. package/vendor/framey/dist/parakeetRunner-UP34UOI2.js +58 -0
  534. package/vendor/framey/dist/pipeline-VXIUYEBU.js +64 -0
  535. package/vendor/framey/dist/play-BUTDQ4DV.js +353 -0
  536. package/vendor/framey/dist/policies-OLDYGFK5.js +309 -0
  537. package/vendor/framey/dist/preflight-2KZ2GWAZ.js +55 -0
  538. package/vendor/framey/dist/present-GXYSM7NX.js +353 -0
  539. package/vendor/framey/dist/preview-EKZ33JOJ.js +1910 -0
  540. package/vendor/framey/dist/producer-SKU5EV3J.js +13 -0
  541. package/vendor/framey/dist/progress-ZWB4Z4ET.js +76 -0
  542. package/vendor/framey/dist/projectConfig-3MZAYVTS.js +60 -0
  543. package/vendor/framey/dist/publication-DTKWNF74.js +33 -0
  544. package/vendor/framey/dist/remove-background-OY5L7XN2.js +265 -0
  545. package/vendor/framey/dist/render-CDV4GDFX.js +187 -0
  546. package/vendor/framey/dist/render-YE5YAMOD.js +2620 -0
  547. package/vendor/framey/dist/render-batch-ZAMFPCLL.js +274 -0
  548. package/vendor/framey/dist/renderSetupWorker.js +120 -0
  549. package/vendor/framey/dist/resolver-D5BIPSEW.js +42 -0
  550. package/vendor/framey/dist/runtimeVersion.js +18 -0
  551. package/vendor/framey/dist/sam-WFZXI4F7.js +23 -0
  552. package/vendor/framey/dist/shaderTransitionWorker.js +44 -0
  553. package/vendor/framey/dist/sherpa-RQWLV7I3.js +79 -0
  554. package/vendor/framey/dist/sherpaWorker.js +84 -0
  555. package/vendor/framey/dist/sites-AMOVABTK.js +54 -0
  556. package/vendor/framey/dist/skill-ZHVLH7KX.js +15 -0
  557. package/vendor/framey/dist/slideshow-SJGK4RQS.js +24 -0
  558. package/vendor/framey/dist/snapshot-TUXL6LBQ.js +1515 -0
  559. package/vendor/framey/dist/src-JHQGB2S6.js +215 -0
  560. package/vendor/framey/dist/src-Z5PGEMXB.js +532 -0
  561. package/vendor/framey/dist/state-B6H3WHCF.js +28 -0
  562. package/vendor/framey/dist/staticProjectServer-DFVZOUGI.js +63 -0
  563. package/vendor/framey/dist/studio/assets/hyperframes-player-DLaKjw0L.js +478 -0
  564. package/vendor/framey/dist/studio/assets/index-BX3KHhGX.js +71 -0
  565. package/vendor/framey/dist/studio/assets/index-CYbvOVp-.css +1 -0
  566. package/vendor/framey/dist/studio/assets/index-Dp3QEUGL.js +402 -0
  567. package/vendor/framey/dist/studio/assets/index-qrTAXbqc.js +531 -0
  568. package/vendor/framey/dist/studio/favicon.svg +14 -0
  569. package/vendor/framey/dist/studio/icons/timeline/audio.svg +7 -0
  570. package/vendor/framey/dist/studio/icons/timeline/captions.svg +5 -0
  571. package/vendor/framey/dist/studio/icons/timeline/composition.svg +12 -0
  572. package/vendor/framey/dist/studio/icons/timeline/image.svg +18 -0
  573. package/vendor/framey/dist/studio/icons/timeline/music.svg +10 -0
  574. package/vendor/framey/dist/studio/icons/timeline/text.svg +3 -0
  575. package/vendor/framey/dist/studio/index.html +23 -0
  576. package/vendor/framey/dist/studio-api-2NECGRMB.js +179 -0
  577. package/vendor/framey/dist/studioSelectionClient-IUUPKUHZ.js +25 -0
  578. package/vendor/framey/dist/studioServer-N2OPUMOQ.js +1569 -0
  579. package/vendor/framey/dist/synthesize-PKTB5ATG.js +183 -0
  580. package/vendor/framey/dist/system-7F3UEHQT.js +27 -0
  581. package/vendor/framey/dist/telemetry-DQGPEKM6.js +145 -0
  582. package/vendor/framey/dist/telemetry-UN55N6U6.js +77 -0
  583. package/vendor/framey/dist/timeline-LHUUMK63.js +1295 -0
  584. package/vendor/framey/dist/tokens-OLECWDFK.js +92 -0
  585. package/vendor/framey/dist/transcribe-O7HQKMIV.js +331 -0
  586. package/vendor/framey/dist/transcribe-UJESPBT5.js +76 -0
  587. package/vendor/framey/dist/tts-YCCQHZD4.js +234 -0
  588. package/vendor/framey/dist/urlDownloader-H2LXLG4U.js +48 -0
  589. package/vendor/framey/dist/usage-HG4WMM7A.js +2167 -0
  590. package/vendor/framey/dist/validate-F2XMN6EV.js +87 -0
  591. package/vendor/framey/dist/vendor/npm/gsap@3.15.0/GSAP-LICENSE.txt +8 -0
  592. package/vendor/framey/dist/vendor/npm/gsap@3.15.0/dist/CustomEase.min.js +11 -0
  593. package/vendor/framey/dist/vendor/npm/gsap@3.15.0/dist/MotionPathPlugin.min.js +11 -0
  594. package/vendor/framey/dist/vendor/npm/gsap@3.15.0/dist/gsap.min.js +11 -0
  595. package/vendor/framey/dist/warmCheck.js +220 -0
  596. package/vendor/framey/dist/warmCheckClient.js +139 -0
  597. package/vendor/framey/dist/workspaceBuildCheck-XYD2YTFW.js +133 -0
  598. package/vendor/framey-player/LICENSE +190 -0
  599. package/vendor/framey-player/NOTICE +16 -0
  600. package/vendor/framey-player/SOURCE.json +6 -0
  601. package/vendor/framey-player/hyperframes-player.global.js +478 -0
  602. package/vendor/framey.pin +1 -0
  603. package/bin/index.js +0 -3
@@ -0,0 +1,1030 @@
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
+ readOptionalString
9
+ } from "./chunk-ZKDMAOFU.js";
10
+ import {
11
+ findFFmpeg,
12
+ findFFprobe,
13
+ getFFmpegInstallHint
14
+ } from "./chunk-UMD3V7CU.js";
15
+ import {
16
+ withMeta
17
+ } from "./chunk-O4YRB27L.js";
18
+ import {
19
+ resolveProject
20
+ } from "./chunk-O7BGSQ5F.js";
21
+ import {
22
+ isHTMLElement,
23
+ parseSourceDocument
24
+ } from "./chunk-IUONB55J.js";
25
+ import "./chunk-6JR2XUEE.js";
26
+ import "./chunk-P5ZBLXJ6.js";
27
+ import "./chunk-GNEFDLFB.js";
28
+ import "./chunk-2UZQHDM7.js";
29
+ import "./chunk-NYEXNSHM.js";
30
+ import {
31
+ defineCommand
32
+ } from "./chunk-S3S4TGEH.js";
33
+ import "./chunk-54HJ63Q2.js";
34
+ import "./chunk-ISN5GRYI.js";
35
+ import {
36
+ c
37
+ } from "./chunk-VORQIH64.js";
38
+ import {
39
+ failCommand
40
+ } from "./chunk-JVBRJMOP.js";
41
+ import "./chunk-TIQB63MX.js";
42
+ import "./chunk-IZCW2NKT.js";
43
+ import {
44
+ ensureHfIds
45
+ } from "./chunk-RNV3DM4S.js";
46
+ import "./chunk-DLA44CMS.js";
47
+ import {
48
+ HF_COLOR_GRADING_ATTR,
49
+ HF_COLOR_GRADING_HUE_CURVE_KEYS,
50
+ getHfColorGradingCapabilities,
51
+ hasHfColorGradingAuthoredValues,
52
+ normalizeHfColorGrading,
53
+ serializeHfColorGrading
54
+ } from "./chunk-UJZREAV6.js";
55
+ import "./chunk-VC76R6W2.js";
56
+ import "./chunk-X7HBSTCZ.js";
57
+ import "./chunk-B7RJV74O.js";
58
+ import "./chunk-DPVXBVLL.js";
59
+ import "./chunk-OFQWTKPW.js";
60
+ import "./chunk-634HSJ3J.js";
61
+ import "./chunk-FXMKHHPO.js";
62
+ import "./chunk-RQVDTPGD.js";
63
+ import "./chunk-AHX34EFP.js";
64
+ import "./chunk-BL4U6U52.js";
65
+ import {
66
+ normalizeErrorMessage
67
+ } from "./chunk-T2EUWCJE.js";
68
+ import "./chunk-T6AGUTZJ.js";
69
+ import "./chunk-XT6MXC7A.js";
70
+ import "./chunk-K4MJX7SR.js";
71
+ import "./chunk-4UMPIPCQ.js";
72
+ import {
73
+ lintHyperframeHtml
74
+ } from "./chunk-4P7NX5BM.js";
75
+ import "./chunk-VAS6HQX3.js";
76
+ import {
77
+ cleanAssetUrl,
78
+ isRemoteOrInlineUrl,
79
+ resolveAuthoredAssetFile
80
+ } from "./chunk-6BNTGNGD.js";
81
+ import "./chunk-CZGHFATT.js";
82
+ import "./chunk-PKZ7RK5N.js";
83
+ import "./chunk-W2LGJSEN.js";
84
+ import {
85
+ COLOR_GRADING_SOURCE_TAGS,
86
+ isColorGradingVariableRef,
87
+ validateColorGradingContract
88
+ } from "./chunk-MMQ52NIZ.js";
89
+ import {
90
+ isPathInside
91
+ } from "./chunk-BSQ7XANM.js";
92
+ import {
93
+ parseHTML
94
+ } from "./chunk-SDYDNHEE.js";
95
+ import "./chunk-RXATE6FZ.js";
96
+ import "./chunk-3422KMTD.js";
97
+ import "./chunk-KGPLIH7B.js";
98
+ import "./chunk-3GXQPCJC.js";
99
+ import "./chunk-M2WBOQ2Q.js";
100
+
101
+ // src/commands/media-treatment.ts
102
+ import { existsSync, readFileSync, writeFileSync } from "fs";
103
+ import { relative, resolve } from "path";
104
+
105
+ // ../core/dist/mediaGradeAnalyzer.js
106
+ import { execFileSync } from "child_process";
107
+ import { basename, extname } from "path";
108
+ var IMAGE_EXTENSIONS = /* @__PURE__ */ new Set([
109
+ ".jpg",
110
+ ".jpeg",
111
+ ".png",
112
+ ".webp",
113
+ ".gif",
114
+ ".bmp",
115
+ ".tif",
116
+ ".tiff"
117
+ ]);
118
+ var SAMPLE_FRAMES = 5;
119
+ var DEFAULT_TIMEOUT_MS = 15e3;
120
+ var ADJUST_LIMITS = {
121
+ exposure: { min: -2, max: 2 },
122
+ contrast: { min: -1, max: 1 },
123
+ whites: { min: -1, max: 1 },
124
+ blacks: { min: -1, max: 1 },
125
+ temperature: { min: -1, max: 1 },
126
+ tint: { min: -1, max: 1 }
127
+ };
128
+ function clamp(value, key) {
129
+ const limit = ADJUST_LIMITS[key];
130
+ if (!Number.isFinite(value))
131
+ return 0;
132
+ return Math.min(limit.max, Math.max(limit.min, value));
133
+ }
134
+ function round(value) {
135
+ const rounded = Math.round(value * 1e3) / 1e3;
136
+ return Object.is(rounded, -0) ? 0 : rounded;
137
+ }
138
+ function average(values) {
139
+ return values.reduce((sum, value) => sum + value, 0) / Math.max(1, values.length);
140
+ }
141
+ function isRecord(value) {
142
+ return typeof value === "object" && value !== null && !Array.isArray(value);
143
+ }
144
+ function asRecord(value) {
145
+ return isRecord(value) ? value : {};
146
+ }
147
+ function probeMedia(mediaPath, ffprobePath) {
148
+ try {
149
+ const raw = execFileSync(ffprobePath, [
150
+ "-v",
151
+ "error",
152
+ "-select_streams",
153
+ "v:0",
154
+ "-show_entries",
155
+ "stream=color_space,color_transfer,color_primaries,pix_fmt,duration:format=duration",
156
+ "-of",
157
+ "json",
158
+ "--",
159
+ mediaPath
160
+ ], { encoding: "utf8", timeout: 5e3, stdio: ["ignore", "pipe", "pipe"], windowsHide: true });
161
+ const parsed = asRecord(JSON.parse(raw));
162
+ const streams = Array.isArray(parsed.streams) ? parsed.streams : [];
163
+ const stream = asRecord(streams[0]);
164
+ const format = asRecord(parsed.format);
165
+ const duration = Number(stream.duration ?? format.duration);
166
+ const text = (key) => {
167
+ const value = stream[key];
168
+ return typeof value === "string" && value ? value : "unknown";
169
+ };
170
+ return {
171
+ duration: Number.isFinite(duration) && duration > 0 ? duration : null,
172
+ colorSpace: text("color_space"),
173
+ transfer: text("color_transfer"),
174
+ primaries: text("color_primaries"),
175
+ pixelFormat: text("pix_fmt")
176
+ };
177
+ } catch {
178
+ return {
179
+ duration: null,
180
+ colorSpace: "unknown",
181
+ transfer: "unknown",
182
+ primaries: "unknown",
183
+ pixelFormat: "unknown"
184
+ };
185
+ }
186
+ }
187
+ function parseMediaTreatmentSignalStats(raw) {
188
+ const frames = [];
189
+ let current = null;
190
+ for (const line of raw.split(/\r?\n/)) {
191
+ const frame = line.match(/^frame:\d.*pts_time:([+-]?(?:\d+(?:\.\d+)?|\.\d+))/);
192
+ if (frame?.[1]) {
193
+ if (current)
194
+ frames.push(current);
195
+ current = { ptsTime: Number(frame[1]) };
196
+ continue;
197
+ }
198
+ const stat = line.match(/lavfi\.signalstats\.([A-Z]+)=([+-]?(?:\d+(?:\.\d+)?|\.\d+))/);
199
+ if (!stat?.[1] || !stat[2])
200
+ continue;
201
+ current ??= {};
202
+ current[stat[1]] = Number(stat[2]);
203
+ }
204
+ if (current)
205
+ frames.push(current);
206
+ return frames.filter((frame) => Number.isFinite(frame.YMIN) && Number.isFinite(frame.YLOW) && Number.isFinite(frame.YAVG) && Number.isFinite(frame.YHIGH) && Number.isFinite(frame.YMAX) && Number.isFinite(frame.UAVG) && Number.isFinite(frame.VAVG));
207
+ }
208
+ function summarizeFrames(frames) {
209
+ if (frames.length === 0)
210
+ throw new Error("FFmpeg returned no analyzable video frames");
211
+ const values = (key) => frames.map((frame) => Number(frame[key]));
212
+ return {
213
+ frames: frames.length,
214
+ yMin: Math.min(...values("YMIN")),
215
+ yLow: average(values("YLOW")),
216
+ yAvg: average(values("YAVG")),
217
+ yHigh: average(values("YHIGH")),
218
+ yMax: Math.max(...values("YMAX")),
219
+ uAvg: average(values("UAVG")),
220
+ vAvg: average(values("VAVG")),
221
+ satAvg: average(frames.map((frame) => frame.SATAVG ?? 0)),
222
+ shadowClipRisk: average(frames.map((frame) => Number(frame.YLOW) <= 16 ? 1 : 0)),
223
+ highlightClipRisk: average(frames.map((frame) => Number(frame.YHIGH) >= 235 ? 1 : 0))
224
+ };
225
+ }
226
+ function suggestedExposure(normalizedAverage, yLow, yHigh) {
227
+ if (normalizedAverage < 0.28 && yHigh / 255 < 0.65) {
228
+ return clamp((0.32 - normalizedAverage) * 1.2, "exposure");
229
+ }
230
+ if (normalizedAverage > 0.72 && yLow / 255 > 0.3) {
231
+ return clamp((0.68 - normalizedAverage) * 1.2, "exposure");
232
+ }
233
+ return 0;
234
+ }
235
+ function suggestedTemperature(uAverage, vAverage) {
236
+ const chromaWarmth = (vAverage - 128 + (128 - uAverage)) / 128;
237
+ return Math.abs(chromaWarmth) >= 0.08 ? clamp(-chromaWarmth * 0.25, "temperature") : 0;
238
+ }
239
+ function suggestedTint(uAverage, vAverage) {
240
+ const cast = uAverage + vAverage - 256;
241
+ return Math.abs(cast) >= 10 ? clamp(-cast / 512, "tint") : 0;
242
+ }
243
+ function statsToAdjust(stats) {
244
+ const yMin = Number(stats.yMin);
245
+ const yLow = Number(stats.yLow ?? stats.yMin);
246
+ const yMax = Number(stats.yMax);
247
+ const yHigh = Number(stats.yHigh ?? stats.yMax);
248
+ const yAvg = Number(stats.yAvg);
249
+ const uAvg = Number(stats.uAvg);
250
+ const vAvg = Number(stats.vAvg);
251
+ const shadowClipRisk = Number(stats.shadowClipRisk ?? (yLow <= 16 ? 1 : 0));
252
+ const highlightClipRisk = Number(stats.highlightClipRisk ?? (yHigh >= 235 ? 1 : 0));
253
+ const percentileSpread = (yHigh - yLow) / 255;
254
+ const normalizedAverage = yAvg / 255;
255
+ const contrast = percentileSpread < 0.35 ? clamp((0.35 - percentileSpread) * 0.4, "contrast") : 0;
256
+ return {
257
+ adjust: {
258
+ exposure: round(suggestedExposure(normalizedAverage, yLow, yHigh)),
259
+ contrast: round(contrast),
260
+ blacks: round(clamp(shadowClipRisk * 0.08, "blacks")),
261
+ whites: round(clamp(-highlightClipRisk * 0.08, "whites")),
262
+ temperature: round(suggestedTemperature(uAvg, vAvg)),
263
+ tint: round(suggestedTint(uAvg, vAvg))
264
+ },
265
+ measured: {
266
+ frames: Number(stats.frames ?? 1),
267
+ yMin: round(yMin),
268
+ yLow: round(yLow),
269
+ yAvg: round(yAvg),
270
+ yHigh: round(yHigh),
271
+ yMax: round(yMax),
272
+ uAvg: round(uAvg),
273
+ vAvg: round(vAvg),
274
+ satAvg: round(Number(stats.satAvg ?? 0)),
275
+ shadowClipRisk: round(shadowClipRisk),
276
+ highlightClipRisk: round(highlightClipRisk)
277
+ }
278
+ };
279
+ }
280
+ function summarizeMediaTreatmentAnalysis(probe, frames) {
281
+ const result = statsToAdjust(summarizeFrames(frames));
282
+ const hdr = ["smpte2084", "arib-std-b67"].includes(probe.transfer);
283
+ const diagnosis = [];
284
+ if (result.measured.shadowClipRisk > 0) {
285
+ diagnosis.push("sampled frames contain deep or clipped shadows");
286
+ }
287
+ if (result.measured.highlightClipRisk > 0) {
288
+ diagnosis.push("sampled frames contain bright or clipped highlights");
289
+ }
290
+ if (diagnosis.length === 0)
291
+ diagnosis.push("no obvious technical imbalance in sampled frames");
292
+ const warnings = [];
293
+ if (hdr)
294
+ warnings.push("HDR transfer detected; the realtime treatment path is SDR/Rec.709.");
295
+ if (probe.colorSpace === "unknown" || probe.transfer === "unknown") {
296
+ warnings.push("Source color metadata is incomplete; camera LOG cannot be identified reliably from container metadata alone.");
297
+ }
298
+ return {
299
+ ...result,
300
+ source: {
301
+ colorSpace: probe.colorSpace,
302
+ transfer: probe.transfer,
303
+ primaries: probe.primaries,
304
+ pixelFormat: probe.pixelFormat,
305
+ hdr,
306
+ log: "unknown"
307
+ },
308
+ diagnosis,
309
+ warnings
310
+ };
311
+ }
312
+ function analyzeMediaGrade(mediaPath, options = {}) {
313
+ const ffmpegPath = options.ffmpegPath ?? "ffmpeg";
314
+ const ffprobePath = options.ffprobePath ?? "ffprobe";
315
+ try {
316
+ const probe = probeMedia(mediaPath, ffprobePath);
317
+ const isImage = IMAGE_EXTENSIONS.has(extname(mediaPath).toLowerCase());
318
+ const fps = !isImage && probe.duration ? Math.max(0.1, Math.min(2, SAMPLE_FRAMES / probe.duration)) : null;
319
+ const filters = [
320
+ fps ? `fps=${fps.toFixed(4)}` : null,
321
+ "format=yuv444p",
322
+ "signalstats",
323
+ "metadata=print:file=-"
324
+ ].filter(Boolean).join(",");
325
+ const raw = execFileSync(ffmpegPath, [
326
+ "-hide_banner",
327
+ "-nostdin",
328
+ "-v",
329
+ "error",
330
+ "-i",
331
+ mediaPath,
332
+ "-vf",
333
+ filters,
334
+ "-frames:v",
335
+ String(SAMPLE_FRAMES),
336
+ "-f",
337
+ "null",
338
+ "-"
339
+ ], {
340
+ encoding: "utf8",
341
+ timeout: Number(process.env.HYPERFRAMES_ANALYZE_TIMEOUT_MS) || DEFAULT_TIMEOUT_MS,
342
+ stdio: ["ignore", "pipe", "pipe"],
343
+ windowsHide: true
344
+ });
345
+ return summarizeMediaTreatmentAnalysis(probe, parseMediaTreatmentSignalStats(raw));
346
+ } catch (error) {
347
+ const message = error instanceof Error ? error.message : String(error);
348
+ throw new Error(`grade analysis failed for ${mediaPath}: ${message}`);
349
+ }
350
+ }
351
+
352
+ // src/commands/media-treatment-analysis.ts
353
+ function analyzeMediaTreatment(mediaPath) {
354
+ const ffmpegPath = findFFmpeg();
355
+ const ffprobePath = findFFprobe();
356
+ if (!ffmpegPath || !ffprobePath) {
357
+ throw new Error(`FFmpeg and ffprobe are required. ${getFFmpegInstallHint()}`);
358
+ }
359
+ const analysis = analyzeMediaGrade(mediaPath, { ffmpegPath, ffprobePath });
360
+ const { adjust, ...evidence } = analysis;
361
+ return { ...evidence, suggestedPatch: { adjust } };
362
+ }
363
+
364
+ // src/commands/media-treatment.ts
365
+ function getMediaTreatmentCapabilityOverview() {
366
+ const capabilities = getHfColorGradingCapabilities();
367
+ const family = (id, label, description) => ({
368
+ id,
369
+ label,
370
+ description
371
+ });
372
+ return {
373
+ version: capabilities.version,
374
+ targetTags: capabilities.targetTags,
375
+ colorSpace: capabilities.colorSpace,
376
+ example: capabilities.example,
377
+ families: [
378
+ family("correction", "Adjust", "Fix exposure, tonal balance, color casts, and saturation."),
379
+ family(
380
+ "grading",
381
+ "Color Grading",
382
+ "Shape tonal color with wheels, RGB and hue curves, and selective HSL correction."
383
+ ),
384
+ family(
385
+ "presets",
386
+ "Presets",
387
+ "Apply a tested starting point, then tune only when the source or intent requires it."
388
+ ),
389
+ family("finishing", "Finish", "Shape vignette and deterministic film grain."),
390
+ ...capabilities.effectFamilies,
391
+ family(
392
+ "palettes",
393
+ "Palettes",
394
+ "Reusable two-to-six-color palettes for compatible art effects."
395
+ ),
396
+ family(
397
+ "animation",
398
+ "Animation",
399
+ "Seek-safe CSS properties that registered GSAP timelines may animate."
400
+ ),
401
+ family("lut", "Custom LUT", "Apply a user-owned 3D .cube LUT."),
402
+ {
403
+ id: "overlays",
404
+ label: "Overlays",
405
+ description: "Install authored HUD, light-leak, flash, or freeze-frame overlay blocks.",
406
+ owner: "registry"
407
+ }
408
+ ],
409
+ discovery: {
410
+ detail: "Use --capability <family-or-item> for exact controls and examples.",
411
+ full: "Use --all only for tooling or exhaustive inspection."
412
+ }
413
+ };
414
+ }
415
+ function getMediaTreatmentCapabilityDetail(id) {
416
+ const capabilities = getHfColorGradingCapabilities();
417
+ const animation = (path) => {
418
+ const property = capabilities.animatable.find((candidate) => candidate.path === path);
419
+ if (!property) return null;
420
+ return {
421
+ property,
422
+ initial: `style="${property.name}: <start>"`,
423
+ tween: `timeline.to("<selector>", { "${property.name}": <end>, duration: <seconds> })`,
424
+ rules: [
425
+ "Once set (inline, in a stylesheet or on a parent), the property overrides the payload's value for this control: set it only on media you animate, starting at the tween's first value.",
426
+ "Use finite keyframes on a paused timeline registered in window.__timelines.",
427
+ "Do not use a frame-zero set, timers, random values, or onUpdate callbacks."
428
+ ]
429
+ };
430
+ };
431
+ const effect = capabilities.effects.find(({ key }) => key === id);
432
+ if (effect) {
433
+ return {
434
+ id,
435
+ family: effect.family,
436
+ label: effect.label,
437
+ description: effect.description,
438
+ renderLane: effect.renderLane,
439
+ supportsPalette: effect.supportsPalette,
440
+ apply: { effects: effect.apply },
441
+ controls: effect.controls,
442
+ animation: animation(`effects.${id}`)
443
+ };
444
+ }
445
+ const effectFamily = capabilities.effectFamilies.find((family) => family.id === id);
446
+ if (effectFamily) {
447
+ return {
448
+ ...effectFamily,
449
+ effects: capabilities.effects.filter((candidate) => candidate.family === id).map((candidate) => ({
450
+ id: candidate.key,
451
+ label: candidate.label,
452
+ description: candidate.description,
453
+ renderLane: candidate.renderLane,
454
+ supportsPalette: candidate.supportsPalette,
455
+ animatable: capabilities.animatable.some(
456
+ ({ path }) => path === `effects.${candidate.key}`
457
+ )
458
+ }))
459
+ };
460
+ }
461
+ const adjustment = capabilities.adjust.find(({ key }) => key === id);
462
+ if (adjustment) {
463
+ return {
464
+ id,
465
+ family: "correction",
466
+ description: `Adjust ${id} within the canonical correction range.`,
467
+ control: adjustment,
468
+ apply: { adjust: { [id]: adjustment.identity } },
469
+ animation: animation(`adjust.${id}`)
470
+ };
471
+ }
472
+ const finishing = capabilities.details.find(({ key }) => key === id);
473
+ if (finishing) {
474
+ return {
475
+ id,
476
+ family: "finishing",
477
+ description: `Adjust ${id} within the canonical finishing range.`,
478
+ control: finishing,
479
+ apply: { details: { [id]: finishing.identity } }
480
+ };
481
+ }
482
+ const preset = capabilities.presets.find((candidate) => candidate.id === id);
483
+ if (preset) {
484
+ return {
485
+ id: preset.id,
486
+ label: preset.label,
487
+ description: "Tested built-in media preset.",
488
+ apply: { preset: preset.id, intensity: preset.intensity }
489
+ };
490
+ }
491
+ const palette = capabilities.palettes.find((candidate) => candidate.id === id);
492
+ if (palette) return { ...palette, apply: { palette: palette.colors } };
493
+ const details = {
494
+ grading: {
495
+ id,
496
+ description: "Shape media after primary correction with wheels, curves, HSL secondaries, and an optional user-owned LUT.",
497
+ order: [
498
+ "adjust",
499
+ "wheels",
500
+ "curves",
501
+ "hueCurves",
502
+ "secondaries",
503
+ "lut",
504
+ "details",
505
+ "effects"
506
+ ],
507
+ discover: ["wheels", "curves", "hue-curves", "secondary", "scopes", "lut"]
508
+ },
509
+ correction: {
510
+ id,
511
+ description: "Fix exposure, tonal balance, color casts, and saturation.",
512
+ controls: capabilities.adjust,
513
+ apply: { adjust: capabilities.example.adjust }
514
+ },
515
+ wheels: {
516
+ id,
517
+ description: "Shadow, midtone, and highlight color wheels.",
518
+ contract: capabilities.wheels,
519
+ apply: {
520
+ wheels: {
521
+ shadows: { hue: 205, amount: 0.08, level: 0 },
522
+ highlights: { hue: 35, amount: 0.06, level: 0 }
523
+ }
524
+ }
525
+ },
526
+ curves: {
527
+ id,
528
+ description: "Master and per-channel curves using normalized [input, output] points.",
529
+ contract: capabilities.curves,
530
+ apply: {
531
+ curves: {
532
+ master: [
533
+ [0, 0],
534
+ [0.25, 0.2],
535
+ [0.75, 0.82],
536
+ [1, 1]
537
+ ]
538
+ }
539
+ }
540
+ },
541
+ "hue-curves": {
542
+ id,
543
+ description: "Hue-selective curves using [hueDegrees, delta] points.",
544
+ contract: capabilities.hueCurves,
545
+ apply: {
546
+ hueCurves: {
547
+ hueVsSaturation: [
548
+ [180, 0],
549
+ [210, 0.15],
550
+ [240, 0]
551
+ ]
552
+ }
553
+ }
554
+ },
555
+ secondary: {
556
+ id,
557
+ description: "Up to four ordered HSL selections with bounded color correction.",
558
+ contract: capabilities.secondaries,
559
+ apply: {
560
+ secondaries: [
561
+ {
562
+ key: {
563
+ hue: { center: 215, range: 25, softness: 10 },
564
+ saturation: { min: 0.2, max: 1, softness: 0.08 },
565
+ luma: { min: 0.1, max: 0.9, softness: 0.08 }
566
+ },
567
+ correction: { saturation: 0.15, luma: 0.03 }
568
+ }
569
+ ]
570
+ }
571
+ },
572
+ scopes: {
573
+ id,
574
+ description: "Deterministic source measurements for agent decisions; visual scopes remain a Studio display.",
575
+ command: "framey media-treatment --file compositions/scene.html --selector '#hero' --analyze --json",
576
+ output: [
577
+ "source color metadata and HDR/LOG warnings",
578
+ "luma percentile and clipping evidence",
579
+ "bounded suggested primary correction"
580
+ ]
581
+ },
582
+ presets: {
583
+ id,
584
+ description: "Tested starting points for color and stylized media effects.",
585
+ presets: capabilities.presets
586
+ },
587
+ finishing: {
588
+ id,
589
+ description: "Vignette and deterministic film-grain controls.",
590
+ controls: capabilities.details,
591
+ apply: { details: capabilities.example.details }
592
+ },
593
+ palettes: {
594
+ id,
595
+ description: "Named palettes plus the custom palette contract.",
596
+ contract: capabilities.palette,
597
+ palettes: capabilities.palettes
598
+ },
599
+ animation: {
600
+ id,
601
+ description: "Seek-safe CSS properties for registered GSAP timelines.",
602
+ properties: capabilities.animatable
603
+ },
604
+ lut: {
605
+ id,
606
+ description: "User-owned 3D .cube LUT support.",
607
+ contract: capabilities.lut
608
+ },
609
+ overlays: {
610
+ id,
611
+ description: "Authored overlay blocks owned by the Framey Registry.",
612
+ discover: "framey catalog",
613
+ apply: "framey add <overlay> --dir <project> --no-clipboard --json"
614
+ }
615
+ };
616
+ const detail = Object.hasOwn(details, id) ? Reflect.get(details, id) : void 0;
617
+ if (detail) return detail;
618
+ const families = [...Object.keys(details), ...capabilities.effectFamilies.map((f) => f.id)];
619
+ throw new Error(
620
+ `Unknown media-treatment capability: ${id}. Available areas: ${families.join(", ")}.`
621
+ );
622
+ }
623
+ var examples = [
624
+ [
625
+ "Discover the complete treatment surface without loading every control",
626
+ `framey media-treatment --capabilities --json`
627
+ ],
628
+ ["Inspect one relevant effect in detail", `framey media-treatment --capability kuwahara --json`],
629
+ [
630
+ "Inspect the exhaustive machine-readable catalog",
631
+ `framey media-treatment --capabilities --all --json`
632
+ ],
633
+ [
634
+ "Apply a resolved treatment to one media element",
635
+ `framey media-treatment --selector '#hero' --grading '{"preset":"skin-soft","intensity":0.6}' --apply`
636
+ ],
637
+ [
638
+ "Preview the exact mutation without writing",
639
+ `framey media-treatment --file compositions/scene.html --selector 'video' --grading '{"preset":"warm-daylight"}' --dry-run --json`
640
+ ],
641
+ [
642
+ "Measure one local media source before choosing a correction",
643
+ `framey media-treatment --selector '#hero' --analyze --json`
644
+ ],
645
+ ["Remove a treatment", `framey media-treatment --selector '#hero' --clear`]
646
+ ];
647
+ function parseSourceDocument2(source) {
648
+ if (/<!doctype|<html[\s>]/i.test(source)) return parseHTML(source).document;
649
+ return parseHTML(`<!DOCTYPE html><html><body>${source}</body></html>`).document;
650
+ }
651
+ function assertKnownGradingShape(value) {
652
+ const issue = validateColorGradingContract(value)[0];
653
+ if (issue) {
654
+ const hint = issue.hint ? ` ${issue.hint}` : "";
655
+ throw new Error(`Invalid color-grading ${issue.path}: ${issue.message}.${hint}`);
656
+ }
657
+ }
658
+ function containsColorGradingVariableRef(value) {
659
+ if (isColorGradingVariableRef(value)) return true;
660
+ if (Array.isArray(value)) return value.some(containsColorGradingVariableRef);
661
+ if (typeof value !== "object" || value === null) return false;
662
+ return Object.values(value).some(containsColorGradingVariableRef);
663
+ }
664
+ function isRecord2(value) {
665
+ return typeof value === "object" && value !== null && !Array.isArray(value);
666
+ }
667
+ function parseStoredGrading(raw) {
668
+ if (raw === null) return null;
669
+ try {
670
+ return JSON.parse(raw);
671
+ } catch {
672
+ return raw;
673
+ }
674
+ }
675
+ function mergeGradingPatch(current, patch) {
676
+ if (!isRecord2(current) || !isRecord2(patch)) return patch;
677
+ const merged = { ...current };
678
+ for (const [key, value] of Object.entries(patch)) {
679
+ merged[key] = isRecord2(value) && isRecord2(merged[key]) ? mergeGradingPatch(merged[key], value) : value;
680
+ }
681
+ return merged;
682
+ }
683
+ function withoutEmptyHueCurves(grading) {
684
+ if (!isRecord2(grading) || !isRecord2(grading.hueCurves)) return grading;
685
+ const hueCurves = Object.fromEntries(
686
+ Object.entries(grading.hueCurves).filter(
687
+ ([key, curve]) => !HF_COLOR_GRADING_HUE_CURVE_KEYS.some((knownKey) => knownKey === key) || !Array.isArray(curve) || curve.length > 0
688
+ )
689
+ );
690
+ return { ...grading, hueCurves };
691
+ }
692
+ function serializeGradingPatch(before, patch) {
693
+ assertKnownGradingShape(patch);
694
+ if (isColorGradingVariableRef(before) && isRecord2(patch)) {
695
+ throw new Error("Cannot merge a grading patch into an unresolved whole-grade variable");
696
+ }
697
+ const current = typeof before === "string" && !isColorGradingVariableRef(before) ? { preset: before } : withoutEmptyHueCurves(before);
698
+ const grading = mergeGradingPatch(current, patch);
699
+ assertKnownGradingShape(grading);
700
+ if (containsColorGradingVariableRef(grading)) {
701
+ return typeof grading === "string" ? grading.trim() : JSON.stringify(grading);
702
+ }
703
+ const normalized = normalizeHfColorGrading(grading);
704
+ if (!normalized) throw new Error("--grading must be valid Framey color-grading JSON");
705
+ return hasHfColorGradingAuthoredValues(normalized) ? serializeHfColorGrading(normalized) : null;
706
+ }
707
+ function queryIncludingTemplates(root, selector) {
708
+ const matches = Array.from(root.querySelectorAll(selector));
709
+ if (matches.length > 0) return matches;
710
+ for (const template of root.querySelectorAll("template")) {
711
+ const nested = queryIncludingTemplates(template, selector);
712
+ if (nested.length > 0) return nested;
713
+ }
714
+ return [];
715
+ }
716
+ function selectMediaElements(document, selector, selectorIndex) {
717
+ let matches;
718
+ try {
719
+ matches = queryIncludingTemplates(document, selector);
720
+ } catch {
721
+ throw new Error(`Invalid selector: ${selector}`);
722
+ }
723
+ if (matches.length === 0) throw new Error(`Selector did not match: ${selector}`);
724
+ if (selectorIndex !== void 0 && !matches[selectorIndex]) {
725
+ throw new Error(`--selector-index ${selectorIndex} is outside ${matches.length} matches`);
726
+ }
727
+ const indexes = selectorIndex === void 0 ? matches.keys() : [selectorIndex];
728
+ return Array.from(indexes, (index) => {
729
+ const element = matches[index];
730
+ const tag = element.tagName.toLowerCase();
731
+ if (!COLOR_GRADING_SOURCE_TAGS.includes(tag)) {
732
+ throw new Error(
733
+ `Color grading requires a <video>, <img> or <canvas>; selector matched <${tag}>`
734
+ );
735
+ }
736
+ if (!isHTMLElement(element)) {
737
+ throw new Error(`Color grading requires an HTML <${tag}>; selector matched one inside <svg>`);
738
+ }
739
+ return { element, selectorIndex: index, tag };
740
+ });
741
+ }
742
+ function selectMediaElement(source, selector, selectorIndex) {
743
+ const targets = selectMediaElements(parseSourceDocument2(source), selector, selectorIndex);
744
+ if (targets.length > 1) {
745
+ throw new Error(
746
+ `Selector matched ${targets.length} elements; use a unique selector or --selector-index`
747
+ );
748
+ }
749
+ return targets[0];
750
+ }
751
+ function applyMediaTreatmentToHtml(source, options) {
752
+ const { document, wrappedFragment } = parseSourceDocument(source);
753
+ const targets = selectMediaElements(document, options.selector, options.selectorIndex).map(
754
+ ({ element, selectorIndex, tag }) => {
755
+ const current = element.getAttribute(HF_COLOR_GRADING_ATTR);
756
+ const before = parseStoredGrading(current);
757
+ const value = options.clear ? null : serializeGradingPatch(before, options.grading);
758
+ const changed2 = current !== value;
759
+ if (changed2) {
760
+ if (value === null) element.removeAttribute(HF_COLOR_GRADING_ATTR);
761
+ else element.setAttribute(HF_COLOR_GRADING_ATTR, value);
762
+ }
763
+ return { selectorIndex, tag, changed: changed2, value, before, after: parseStoredGrading(value) };
764
+ }
765
+ );
766
+ const changed = targets.some((target) => target.changed);
767
+ const serialized = wrappedFragment ? document.body.innerHTML || "" : document.toString();
768
+ const html = changed ? ensureHfIds(serialized) : source;
769
+ const first = targets[0];
770
+ return {
771
+ html,
772
+ changed,
773
+ tag: first.tag,
774
+ value: first.value,
775
+ before: first.before,
776
+ after: first.after,
777
+ targets
778
+ };
779
+ }
780
+ function parseSelectorIndex(raw) {
781
+ if (raw === void 0) return void 0;
782
+ const value = Number(raw);
783
+ if (!Number.isInteger(value) || value < 0) {
784
+ throw new Error("--selector-index must be a non-negative integer");
785
+ }
786
+ return value;
787
+ }
788
+ function mediaSourceForElement(element) {
789
+ const src = element.getAttribute("src") ?? (element.tagName.toLowerCase() === "video" ? element.querySelector("source")?.getAttribute("src") : null);
790
+ if (!src) throw new Error("Selected media has no analyzable src");
791
+ return src;
792
+ }
793
+ function resolveMediaTreatmentSource(projectDir, compositionFile, source) {
794
+ const sourceUrl = source.trim();
795
+ if (!sourceUrl) throw new Error("Selected media has no analyzable local src");
796
+ if (isRemoteOrInlineUrl(sourceUrl)) {
797
+ throw new Error(
798
+ "Media analysis requires a local project asset; freeze remote media with media-use first"
799
+ );
800
+ }
801
+ if (!cleanAssetUrl(sourceUrl)) throw new Error("Selected media has no analyzable local src");
802
+ const file = resolveAuthoredAssetFile(projectDir, compositionFile, sourceUrl);
803
+ if (!file) throw new Error(`Media file not found: ${source}`);
804
+ return file;
805
+ }
806
+ function parseGrading(raw, apply, clear, dryRun) {
807
+ if (clear) {
808
+ if (raw !== void 0 || apply) {
809
+ throw new Error("Use either --apply with --grading or --clear, not both");
810
+ }
811
+ return void 0;
812
+ }
813
+ if (!apply && !dryRun) {
814
+ if (raw !== void 0) throw new Error("--grading requires --apply or --dry-run");
815
+ throw new Error("Use --apply with --grading <json> or --clear");
816
+ }
817
+ if (raw === void 0) throw new Error("--apply requires --grading <json>");
818
+ try {
819
+ return JSON.parse(raw);
820
+ } catch (error) {
821
+ throw new Error(`Could not parse --grading JSON: ${normalizeErrorMessage(error)}`);
822
+ }
823
+ }
824
+ function mutationVerb(action, changed, dryRun) {
825
+ if (dryRun) return `Would ${action}`;
826
+ if (!changed) return action === "apply" ? "Already applied" : "Already clear";
827
+ return action === "apply" ? "Applied" : "Cleared";
828
+ }
829
+ function runCapabilityQuery(args) {
830
+ const capability = readOptionalString(args.capability);
831
+ const hasMutationOption = [
832
+ readOptionalString(args.selector),
833
+ readOptionalString(args.grading),
834
+ args.clear,
835
+ args["dry-run"],
836
+ args.apply,
837
+ args.analyze
838
+ ].some(Boolean);
839
+ if (hasMutationOption) throw new Error("--capabilities cannot be combined with mutation options");
840
+ if (args.all === true && capability)
841
+ throw new Error("Use either --all or --capability, not both");
842
+ let capabilities = getMediaTreatmentCapabilityOverview();
843
+ if (args.all === true) capabilities = getHfColorGradingCapabilities();
844
+ else if (capability) capabilities = getMediaTreatmentCapabilityDetail(capability);
845
+ console.log(JSON.stringify(withMeta({ ok: true, capabilities }), null, 2));
846
+ }
847
+ function resolveMutationFile(args) {
848
+ const project = resolveProject(readOptionalString(args.project));
849
+ const fileArg = readOptionalString(args.file) ?? "index.html";
850
+ const filePath = resolve(project.dir, fileArg);
851
+ if (!isPathInside(filePath, project.dir) || !filePath.toLowerCase().endsWith(".html")) {
852
+ throw new Error("--file must be an HTML file inside the project");
853
+ }
854
+ if (!existsSync(filePath)) throw new Error(`Composition file not found: ${fileArg}`);
855
+ return { project, filePath };
856
+ }
857
+ function analyzeTarget(args) {
858
+ const { project, filePath } = resolveMutationFile(args);
859
+ const selector = readOptionalString(args.selector);
860
+ if (!selector) throw new Error("--selector is required");
861
+ if (readOptionalString(args.grading) || args.clear === true || args.apply === true || args["dry-run"] === true) {
862
+ throw new Error("--analyze cannot be combined with mutation options");
863
+ }
864
+ const selectorIndex = parseSelectorIndex(readOptionalString(args["selector-index"]));
865
+ const { element, tag } = selectMediaElement(
866
+ readFileSync(filePath, "utf8"),
867
+ selector,
868
+ selectorIndex
869
+ );
870
+ const source = mediaSourceForElement(element);
871
+ const compositionFile = relative(project.dir, filePath).split("\\").join("/");
872
+ const mediaPath = resolveMediaTreatmentSource(project.dir, compositionFile, source);
873
+ return {
874
+ ok: true,
875
+ action: "analyze",
876
+ file: compositionFile || "index.html",
877
+ selector,
878
+ selectorIndex: selectorIndex ?? 0,
879
+ tag,
880
+ media: source,
881
+ ...analyzeMediaTreatment(mediaPath)
882
+ };
883
+ }
884
+ async function prepareMutation(args) {
885
+ const { project, filePath } = resolveMutationFile(args);
886
+ const selector = readOptionalString(args.selector);
887
+ if (!selector) throw new Error("--selector is required");
888
+ const clear = args.clear === true;
889
+ const apply = args.apply === true;
890
+ const dryRun = args["dry-run"] === true;
891
+ const selectorIndex = parseSelectorIndex(readOptionalString(args["selector-index"]));
892
+ const result = applyMediaTreatmentToHtml(readFileSync(filePath, "utf8"), {
893
+ selector,
894
+ selectorIndex,
895
+ grading: parseGrading(readOptionalString(args.grading), apply, clear, dryRun),
896
+ clear
897
+ });
898
+ const lintResult = await lintHyperframeHtml(result.html);
899
+ const findings = lintResult.findings.filter(({ code }) => code.startsWith("color_grading_"));
900
+ const lint = { ok: findings.every(({ severity }) => severity !== "error"), findings };
901
+ if (result.changed && !dryRun) writeFileSync(filePath, result.html);
902
+ const action = result.targets.every(({ value }) => value === null) ? "clear" : "apply";
903
+ return {
904
+ action,
905
+ result,
906
+ selector,
907
+ payload: {
908
+ ok: true,
909
+ action,
910
+ file: relative(project.dir, filePath) || "index.html",
911
+ selector,
912
+ count: result.targets.length,
913
+ ...result.targets.length === 1 ? {
914
+ selectorIndex: result.targets[0].selectorIndex,
915
+ tag: result.tag,
916
+ before: result.before,
917
+ after: result.after,
918
+ value: result.value
919
+ } : { targets: result.targets },
920
+ changed: result.changed,
921
+ dryRun,
922
+ attribute: HF_COLOR_GRADING_ATTR,
923
+ lint
924
+ }
925
+ };
926
+ }
927
+ function isCapabilityQuery(args) {
928
+ return args.capabilities === true || Boolean(readOptionalString(args.capability)) || args.all === true;
929
+ }
930
+ function printAnalysis(args) {
931
+ const result = analyzeTarget(args);
932
+ if (args.json === true) {
933
+ console.log(JSON.stringify(withMeta(result), null, 2));
934
+ return;
935
+ }
936
+ console.log(`${c.success("\u25C7")} Analyzed ${c.accent(result.selector)}`);
937
+ for (const diagnosis of result.diagnosis) console.log(` ${diagnosis}`);
938
+ for (const warning of result.warnings) console.log(` ${c.warn(warning)}`);
939
+ console.log(` suggested patch: ${JSON.stringify(result.suggestedPatch)}`);
940
+ }
941
+ async function printMutation(args) {
942
+ const { action, result, selector, payload } = await prepareMutation(args);
943
+ if (args.json === true) {
944
+ console.log(JSON.stringify(withMeta(payload), null, 2));
945
+ return;
946
+ }
947
+ const verb = mutationVerb(action, result.changed, payload.dryRun);
948
+ const changedCount = result.targets.filter(({ changed }) => changed).length;
949
+ const count = result.targets.length > 1 ? ` (${changedCount} of ${result.targets.length} elements ${payload.dryRun ? "would change" : "changed"})` : "";
950
+ console.log(`${c.success("\u25C7")} ${verb} media treatment on ${c.accent(selector)}${count}`);
951
+ }
952
+ function printFailure(error, json) {
953
+ const message = normalizeErrorMessage(error);
954
+ if (json) console.log(JSON.stringify(withMeta({ ok: false, error: message })));
955
+ else console.error(`${c.error("\u2717")} ${message}`);
956
+ failCommand(1, error);
957
+ }
958
+ var mediaTreatmentCommand = defineCommand({
959
+ meta: {
960
+ name: "media-treatment",
961
+ description: "Discover, apply, or clear deterministic media treatments"
962
+ },
963
+ args: {
964
+ capabilities: {
965
+ type: "boolean",
966
+ description: "Print a concise agent-readable capability overview",
967
+ default: false
968
+ },
969
+ capability: {
970
+ type: "string",
971
+ description: "Inspect one family, control, effect, preset, or palette"
972
+ },
973
+ all: {
974
+ type: "boolean",
975
+ description: "Print the exhaustive capability catalog",
976
+ default: false
977
+ },
978
+ project: { type: "string", description: "Project directory (default: cwd)" },
979
+ file: {
980
+ type: "string",
981
+ description: "Composition file relative to project (default: index.html)"
982
+ },
983
+ selector: {
984
+ type: "string",
985
+ description: "CSS selector; every matched <img> or <video> gets the patch"
986
+ },
987
+ "selector-index": {
988
+ type: "string",
989
+ description: "Zero-based match index to patch only one of several matches"
990
+ },
991
+ grading: { type: "string", description: "Canonical color-grading JSON patch" },
992
+ apply: {
993
+ type: "boolean",
994
+ description: "Apply the validated grading patch (explicit agent form)",
995
+ default: false
996
+ },
997
+ analyze: {
998
+ type: "boolean",
999
+ description: "Measure selected local media and suggest a bounded primary correction",
1000
+ default: false
1001
+ },
1002
+ clear: { type: "boolean", description: "Remove color grading from the target", default: false },
1003
+ "dry-run": {
1004
+ type: "boolean",
1005
+ description: "Preview the normalized grading attribute and color-grading lint verdict without writing",
1006
+ default: false
1007
+ },
1008
+ json: { type: "boolean", description: "Output an agent-friendly JSON result", default: false }
1009
+ },
1010
+ async run({ args }) {
1011
+ try {
1012
+ if (isCapabilityQuery(args)) return runCapabilityQuery(args);
1013
+ if (args.analyze === true) {
1014
+ printAnalysis(args);
1015
+ return;
1016
+ }
1017
+ await printMutation(args);
1018
+ } catch (error) {
1019
+ printFailure(error, args.json === true);
1020
+ }
1021
+ }
1022
+ });
1023
+ export {
1024
+ applyMediaTreatmentToHtml,
1025
+ examples,
1026
+ getMediaTreatmentCapabilityDetail,
1027
+ getMediaTreatmentCapabilityOverview,
1028
+ mediaTreatmentCommand,
1029
+ resolveMediaTreatmentSource
1030
+ };