@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,767 @@
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
+ parseOutputResolutionFlag
9
+ } from "./chunk-ST35C4K6.js";
10
+ import {
11
+ isMissingPackageError,
12
+ missingPackageMessage
13
+ } from "./chunk-RVZHGOGR.js";
14
+ import {
15
+ reportVariableIssues,
16
+ resolveVariablesArg,
17
+ validateVariablesAgainstProject
18
+ } from "./chunk-EAMLBAHA.js";
19
+ import {
20
+ defaultCloudFps
21
+ } from "./chunk-KXTKKBOC.js";
22
+ import "./chunk-P5ZBLXJ6.js";
23
+ import "./chunk-442JNXRM.js";
24
+ import {
25
+ defineCommand
26
+ } from "./chunk-S3S4TGEH.js";
27
+ import {
28
+ c
29
+ } from "./chunk-VORQIH64.js";
30
+ import {
31
+ failCommand
32
+ } from "./chunk-JVBRJMOP.js";
33
+ import {
34
+ DISTRIBUTED_FPS,
35
+ isDistributedFps
36
+ } from "./chunk-DLA44CMS.js";
37
+ import "./chunk-UJZREAV6.js";
38
+ import "./chunk-VC76R6W2.js";
39
+ import "./chunk-X7HBSTCZ.js";
40
+ import "./chunk-B7RJV74O.js";
41
+ import "./chunk-DPVXBVLL.js";
42
+ import "./chunk-OFQWTKPW.js";
43
+ import "./chunk-634HSJ3J.js";
44
+ import "./chunk-FXMKHHPO.js";
45
+ import "./chunk-RQVDTPGD.js";
46
+ import {
47
+ normalizeErrorMessage
48
+ } from "./chunk-T2EUWCJE.js";
49
+ import "./chunk-MMQ52NIZ.js";
50
+ import "./chunk-BSQ7XANM.js";
51
+ import "./chunk-SDYDNHEE.js";
52
+ import "./chunk-RXATE6FZ.js";
53
+ import "./chunk-3422KMTD.js";
54
+ import "./chunk-M2WBOQ2Q.js";
55
+
56
+ // src/commands/cloudrun.ts
57
+ import { spawnSync } from "child_process";
58
+ import { existsSync, mkdirSync, readFileSync, writeFileSync } from "fs";
59
+ import { homedir } from "os";
60
+ import { join, resolve } from "path";
61
+ var examples = [
62
+ ["Deploy the Cloud Run render stack", "framey cloudrun deploy --project my-gcp-project"],
63
+ [
64
+ "Render a composition on the deployed stack",
65
+ "framey cloudrun render ./my-project --width 1920 --height 1080 --wait"
66
+ ],
67
+ [
68
+ "Render a personalised template with variables",
69
+ `framey cloudrun render ./my-template --width 1920 --height 1080 --variables '{"title":"Hello Alice"}'`
70
+ ],
71
+ [
72
+ "Supersample a 1080p composition to 4K",
73
+ "framey cloudrun render ./my-project --width 1920 --height 1080 --output-resolution 4k --wait"
74
+ ],
75
+ [
76
+ "Batch-render N personalised videos from a JSONL file",
77
+ "framey cloudrun render-batch ./my-template --batch ./users.jsonl --width 1920 --height 1080 --max-concurrent 10"
78
+ ],
79
+ ["Check progress for a started render", "framey cloudrun progress <executionName>"],
80
+ ["Pre-upload a project so renders share the upload", "framey cloudrun sites create ./my-project"],
81
+ ["Tear the stack down", "framey cloudrun destroy --project my-gcp-project"]
82
+ ];
83
+ var HELP = `
84
+ ${c.bold("framey cloudrun")} ${c.dim("<subcommand> [args]")}
85
+
86
+ Deploy + drive distributed video renders on Google Cloud Run + Workflows.
87
+
88
+ ${c.bold("SUBCOMMANDS:")}
89
+ ${c.accent("deploy")} ${c.dim("Build the image + apply the Terraform module (Cloud Run + Workflows + GCS)")}
90
+ ${c.accent("sites create")} ${c.dim("Tar + upload a project to GCS (reusable across renders)")}
91
+ ${c.accent("render")} ${c.dim("Start a distributed render (returns an execution name)")}
92
+ ${c.accent("render-batch")} ${c.dim("Fan out N personalised renders from a JSONL batch file")}
93
+ ${c.accent("progress")} ${c.dim("Print progress + cost for an in-flight or finished render")}
94
+ ${c.accent("destroy")} ${c.dim("Tear the stack down")}
95
+
96
+ ${c.bold("FIRST RUN:")}
97
+ ${c.accent("framey cloudrun deploy --project my-gcp-project")}
98
+ ${c.accent("framey cloudrun render ./my-project --width 1920 --height 1080 --wait")}
99
+
100
+ ${c.bold("REQUIREMENTS:")}
101
+ \u2022 gcloud authenticated; the target project must have billing enabled
102
+ \u2022 terraform (>= 1.5) and docker / Cloud Build access on PATH
103
+ `;
104
+ var cloudRunAdapterPromise;
105
+ function loadCloudRunAdapter() {
106
+ cloudRunAdapterPromise ??= Promise.all([
107
+ import("@framey/gcp-cloud-run/sdk"),
108
+ import("@framey/gcp-cloud-run/terraform")
109
+ ]).then(([sdk, terraform]) => ({ ...sdk, ...terraform }));
110
+ return cloudRunAdapterPromise;
111
+ }
112
+ function isMissingCloudRunAdapterError(error) {
113
+ return isMissingPackageError(error, "@framey/gcp-cloud-run");
114
+ }
115
+ function missingCloudRunAdapterMessage(subcommand) {
116
+ return missingPackageMessage("@framey/gcp-cloud-run", `framey cloudrun ${subcommand}`);
117
+ }
118
+ var cloudrun_default = defineCommand({
119
+ meta: { name: "cloudrun", description: "Deploy and drive renders on Google Cloud Run" },
120
+ args: {
121
+ subcommand: {
122
+ type: "positional",
123
+ required: false,
124
+ description: "deploy | sites | render | render-batch | progress | destroy"
125
+ },
126
+ target: {
127
+ type: "positional",
128
+ required: false,
129
+ description: "Subcommand positional (project dir, execution name, sites verb)"
130
+ },
131
+ extra: {
132
+ type: "positional",
133
+ required: false,
134
+ description: "Extra positional (e.g. `sites create <projectDir>`)"
135
+ },
136
+ // Stack identity
137
+ project: {
138
+ type: "string",
139
+ description: "GCP project id (required for deploy/destroy; cached after deploy)"
140
+ },
141
+ region: { type: "string", description: "GCP region (default: us-central1)" },
142
+ image: {
143
+ type: "string",
144
+ description: "Container image for the render service (deploy). If unset, deploy builds it via Cloud Build."
145
+ },
146
+ repo: {
147
+ type: "string",
148
+ description: "Artifact Registry repo for the built image (default: hyperframes)"
149
+ },
150
+ // Machine sizing / scaling (deploy). Omitted flags keep the Terraform
151
+ // module defaults (4 vCPU / 16Gi / 100 instances / 3600s).
152
+ cpu: { type: "string", description: "vCPU per Cloud Run instance: 1 | 2 | 4 | 8 (deploy)" },
153
+ memory: { type: "string", description: "Memory per instance, e.g. 16Gi | 32Gi (deploy)" },
154
+ "max-instances": {
155
+ type: "string",
156
+ description: "Max Cloud Run instances = render fan-out ceiling (deploy)"
157
+ },
158
+ timeout: {
159
+ type: "string",
160
+ description: "Per-request timeout in seconds, max 3600 (deploy)"
161
+ },
162
+ // sites / render
163
+ "site-id": { type: "string", description: "Explicit site id (overrides content hash)" },
164
+ width: { type: "string", description: "Render width in pixels" },
165
+ height: { type: "string", description: "Render height in pixels" },
166
+ fps: { type: "string", description: `Render fps (${DISTRIBUTED_FPS.join(" | ")})` },
167
+ format: { type: "string", description: "mp4 | mov | png-sequence | webm (default: mp4)" },
168
+ codec: { type: "string", description: "h264 | h265 (mp4 only)" },
169
+ quality: { type: "string", description: "draft | standard | high" },
170
+ "chunk-size": { type: "string", description: "Frames per chunk" },
171
+ "max-parallel-chunks": { type: "string", description: "Max concurrent chunks" },
172
+ "target-chunk-frames": {
173
+ type: "string",
174
+ description: "Cap per-chunk frames; auto-adds chunks (up to --max-parallel-chunks) to keep each under this. Ignored if --chunk-size is set."
175
+ },
176
+ "output-resolution": {
177
+ type: "string",
178
+ description: "Output resolution preset that engages Chrome deviceScaleFactor supersampling (e.g. 4k, 1080p, landscape-4k). The composition's authored data-width/data-height is supersampled to the target without changing layout."
179
+ },
180
+ variables: {
181
+ type: "string",
182
+ description: `JSON object of composition variable values, e.g. --variables '{"title":"Hi"}'`
183
+ },
184
+ "variables-file": { type: "string", description: "Path to a JSON file of variable values" },
185
+ "strict-variables": {
186
+ type: "boolean",
187
+ description: "Fail the render if any --variables key is undeclared or mistyped vs the composition's data-composition-variables. Without it, mismatches are warnings.",
188
+ default: false
189
+ },
190
+ batch: {
191
+ type: "string",
192
+ description: 'Path to a JSONL batch file for `render-batch`. Each line: {"outputKey":"...","variables":{...}}'
193
+ },
194
+ "max-concurrent": {
195
+ type: "string",
196
+ description: "Max in-flight executions for `render-batch` (default: 50)."
197
+ },
198
+ "dry-run": {
199
+ type: "boolean",
200
+ description: "For `render-batch`: parse the batch file and print the manifest without starting any execution.",
201
+ default: false
202
+ },
203
+ "render-id": {
204
+ type: "string",
205
+ description: "Client render id / GCS prefix (default: hf-render-<uuid>)"
206
+ },
207
+ "output-key": {
208
+ type: "string",
209
+ description: "Final output GCS key (default: renders/<renderId>/output.<ext>)"
210
+ },
211
+ wait: { type: "boolean", description: "Block until the render finishes" },
212
+ "wait-interval-ms": {
213
+ type: "string",
214
+ description: "Poll cadence in ms when --wait is set (default: 5000)"
215
+ },
216
+ json: { type: "boolean", description: "Emit machine-readable JSON" }
217
+ },
218
+ // fallow-ignore-next-line complexity
219
+ async run({ args }) {
220
+ const subcommand = args.subcommand;
221
+ if (!subcommand) {
222
+ console.log(HELP);
223
+ return;
224
+ }
225
+ const verbsNeedingAdapter = /* @__PURE__ */ new Set([
226
+ "deploy",
227
+ "sites",
228
+ "render",
229
+ "render-batch",
230
+ "progress",
231
+ "destroy"
232
+ ]);
233
+ if (verbsNeedingAdapter.has(subcommand)) {
234
+ try {
235
+ await loadCloudRunAdapter();
236
+ } catch (error) {
237
+ if (isMissingCloudRunAdapterError(error)) {
238
+ console.error(missingCloudRunAdapterMessage(subcommand));
239
+ failCommand();
240
+ }
241
+ throw error;
242
+ }
243
+ }
244
+ switch (subcommand) {
245
+ case "deploy":
246
+ return runDeploy(args);
247
+ case "sites":
248
+ return runSites(args);
249
+ case "render":
250
+ return runRender(args);
251
+ case "render-batch":
252
+ return runRenderBatch(args);
253
+ case "progress":
254
+ return runProgress(args);
255
+ case "destroy":
256
+ return runDestroy(args);
257
+ default:
258
+ console.error(`${c.error("Unknown subcommand:")} ${subcommand}
259
+ ${HELP}`);
260
+ failCommand();
261
+ }
262
+ }
263
+ });
264
+ function stateDir() {
265
+ return join(homedir(), ".hyperframes");
266
+ }
267
+ function statePath() {
268
+ return join(stateDir(), "cloudrun-state.json");
269
+ }
270
+ function writeState(state) {
271
+ mkdirSync(stateDir(), { recursive: true });
272
+ writeFileSync(statePath(), JSON.stringify(state, null, 2));
273
+ }
274
+ function readState(args) {
275
+ const overrides = {
276
+ projectId: args.project,
277
+ region: args.region
278
+ };
279
+ let base = {};
280
+ if (existsSync(statePath())) {
281
+ try {
282
+ base = JSON.parse(readFileSync(statePath(), "utf8"));
283
+ } catch {
284
+ }
285
+ }
286
+ const merged = { ...base, ...stripUndefined(overrides) };
287
+ const missing = ["projectId", "region", "bucketName", "serviceUrl", "workflowId"].filter((k) => !merged[k]);
288
+ if (missing.length > 0) {
289
+ console.error(
290
+ `[cloudrun] missing stack coordinates: ${missing.join(", ")}. Run \`framey cloudrun deploy --project <id>\` first, or pass them as flags.`
291
+ );
292
+ failCommand();
293
+ }
294
+ return merged;
295
+ }
296
+ function stripUndefined(o) {
297
+ return Object.fromEntries(Object.entries(o).filter(([, v]) => v != null));
298
+ }
299
+ function run(cmd, cmdArgs, opts = {}) {
300
+ const res = spawnSync(cmd, cmdArgs, { stdio: "inherit", cwd: opts.cwd });
301
+ if (res.status !== 0) {
302
+ throw new Error(`[cloudrun] \`${cmd} ${cmdArgs.join(" ")}\` exited with ${res.status}`);
303
+ }
304
+ }
305
+ function capture(cmd, cmdArgs, opts = {}) {
306
+ const res = spawnSync(cmd, cmdArgs, { encoding: "utf8", cwd: opts.cwd });
307
+ if (res.status !== 0) {
308
+ throw new Error(`[cloudrun] \`${cmd} ${cmdArgs.join(" ")}\` failed: ${res.stderr}`);
309
+ }
310
+ return res.stdout.trim();
311
+ }
312
+ async function runDeploy(args) {
313
+ const project = args.project;
314
+ if (!project) {
315
+ console.error("[cloudrun deploy] --project <gcp-project-id> is required.");
316
+ failCommand();
317
+ }
318
+ const region = args.region ?? "us-central1";
319
+ const repo = args.repo ?? "hyperframes";
320
+ const { getTerraformModuleDir } = await loadCloudRunAdapter();
321
+ const tfDir = getTerraformModuleDir();
322
+ const repoRoot = findRepoRoot(tfDir);
323
+ console.log(`\u2192 Enabling required APIs on ${project}`);
324
+ run("gcloud", [
325
+ "services",
326
+ "enable",
327
+ "run.googleapis.com",
328
+ "workflows.googleapis.com",
329
+ "workflowexecutions.googleapis.com",
330
+ "artifactregistry.googleapis.com",
331
+ "cloudbuild.googleapis.com",
332
+ "monitoring.googleapis.com",
333
+ "--project",
334
+ project
335
+ ]);
336
+ let image = args.image;
337
+ if (!image) {
338
+ if (!repoRoot) {
339
+ console.error(
340
+ "[cloudrun deploy] --image is required when not running from a hyperframes checkout (no Dockerfile context found)."
341
+ );
342
+ failCommand();
343
+ }
344
+ const exists = spawnSync("gcloud", [
345
+ "artifacts",
346
+ "repositories",
347
+ "describe",
348
+ repo,
349
+ "--location",
350
+ region,
351
+ "--project",
352
+ project
353
+ ]).status === 0;
354
+ if (!exists) {
355
+ run("gcloud", [
356
+ "artifacts",
357
+ "repositories",
358
+ "create",
359
+ repo,
360
+ "--repository-format",
361
+ "docker",
362
+ "--location",
363
+ region,
364
+ "--project",
365
+ project
366
+ ]);
367
+ }
368
+ const tag = (/* @__PURE__ */ new Date()).toISOString().replace(/[^0-9]/g, "").slice(0, 14);
369
+ image = `${region}-docker.pkg.dev/${project}/${repo}/hyperframes-render:${tag}`;
370
+ console.log(`\u2192 Building + pushing ${image} via Cloud Build`);
371
+ run("gcloud", [
372
+ "builds",
373
+ "submit",
374
+ repoRoot,
375
+ "--project",
376
+ project,
377
+ "--timeout",
378
+ "3600s",
379
+ "--config",
380
+ writeCloudBuildConfig(image)
381
+ ]);
382
+ }
383
+ console.log("\u2192 terraform apply");
384
+ run("terraform", ["init", "-input=false"], { cwd: tfDir });
385
+ run(
386
+ "terraform",
387
+ ["apply", "-input=false", "-auto-approve", ...machineVars(args, project, region, image)],
388
+ { cwd: tfDir }
389
+ );
390
+ const state = {
391
+ projectId: project,
392
+ region,
393
+ bucketName: capture("terraform", ["output", "-raw", "render_bucket_name"], { cwd: tfDir }),
394
+ serviceUrl: capture("terraform", ["output", "-raw", "service_url"], { cwd: tfDir }),
395
+ workflowId: capture("terraform", ["output", "-raw", "workflow_name"], { cwd: tfDir })
396
+ };
397
+ writeState(state);
398
+ console.log(`${c.accent("\u2713 deployed.")} bucket=${state.bucketName} workflow=${state.workflowId}`);
399
+ console.log(` service=${state.serviceUrl}`);
400
+ console.log(
401
+ ` Next: ${c.accent("framey cloudrun render ./my-project --width 1920 --height 1080 --wait")}`
402
+ );
403
+ }
404
+ function machineVars(args, project, region, image) {
405
+ const vars = [
406
+ "-var",
407
+ `project_id=${project}`,
408
+ "-var",
409
+ `region=${region}`,
410
+ "-var",
411
+ `image=${image}`
412
+ ];
413
+ const cpu = args.cpu;
414
+ const memory = args.memory;
415
+ const maxInstances = parsePositiveInt(args["max-instances"], "--max-instances");
416
+ const timeout = parsePositiveInt(args.timeout, "--timeout");
417
+ if (cpu) vars.push("-var", `cpu=${cpu}`);
418
+ if (memory) vars.push("-var", `memory=${memory}`);
419
+ if (maxInstances !== void 0) vars.push("-var", `max_instances=${maxInstances}`);
420
+ if (timeout !== void 0) vars.push("-var", `request_timeout_seconds=${timeout}`);
421
+ return vars;
422
+ }
423
+ function findRepoRoot(tfDir) {
424
+ const candidate = resolve(tfDir, "..", "..", "..");
425
+ if (existsSync(join(candidate, "packages", "gcp-cloud-run", "Dockerfile"))) return candidate;
426
+ return null;
427
+ }
428
+ function writeCloudBuildConfig(image) {
429
+ const cfgPath = join(stateDir(), "cloudrun-cloudbuild.yaml");
430
+ mkdirSync(stateDir(), { recursive: true });
431
+ writeFileSync(
432
+ cfgPath,
433
+ [
434
+ "steps:",
435
+ "- name: gcr.io/cloud-builders/docker",
436
+ ` args: ["build","-f","packages/gcp-cloud-run/Dockerfile","-t","${image}","."]`,
437
+ `images: ["${image}"]`,
438
+ "timeout: 3600s",
439
+ ""
440
+ ].join("\n")
441
+ );
442
+ return cfgPath;
443
+ }
444
+ async function runSites(args) {
445
+ if (args.target !== "create") {
446
+ console.error(
447
+ `[cloudrun sites] unknown verb "${String(args.target)}". Only "create" is supported.`
448
+ );
449
+ failCommand();
450
+ }
451
+ const projectDir = args.extra;
452
+ if (!projectDir) {
453
+ console.error("[cloudrun sites create] usage: framey cloudrun sites create <projectDir>");
454
+ failCommand();
455
+ }
456
+ const state = readState(args);
457
+ const { deploySite } = await loadCloudRunAdapter();
458
+ const handle = await deploySite({
459
+ projectDir: resolve(projectDir),
460
+ bucketName: state.bucketName,
461
+ siteId: args["site-id"]
462
+ });
463
+ if (args.json) {
464
+ console.log(JSON.stringify(handle, null, 2));
465
+ } else {
466
+ console.log(
467
+ `${handle.uploaded ? c.accent("\u2713 uploaded") : c.dim("\u2022 already present")} site=${handle.siteId} (${handle.bytes} bytes)
468
+ ${handle.projectGcsUri}`
469
+ );
470
+ }
471
+ }
472
+ function resolveCloudRunFps(args, projectDir, command) {
473
+ const fps = parseIntFlag(args.fps) ?? defaultCloudFps(projectDir);
474
+ if (isDistributedFps(fps)) return fps;
475
+ console.error(
476
+ `[cloudrun ${command}] --fps must be one of ${DISTRIBUTED_FPS.join(", ")}; got ${fps}.`
477
+ );
478
+ failCommand();
479
+ }
480
+ async function runRender(args) {
481
+ const projectDir = args.target;
482
+ if (!projectDir) {
483
+ console.error(
484
+ "[cloudrun render] usage: framey cloudrun render <projectDir> --width <px> --height <px>"
485
+ );
486
+ failCommand();
487
+ }
488
+ const width = parsePositiveInt(args.width, "--width");
489
+ const height = parsePositiveInt(args.height, "--height");
490
+ if (width === void 0 || height === void 0) {
491
+ console.error("[cloudrun render] --width and --height are required.");
492
+ failCommand();
493
+ }
494
+ const fps = resolveCloudRunFps(args, projectDir, "render");
495
+ const state = readState(args);
496
+ const variables = resolveAndValidateVariables(args, resolve(projectDir));
497
+ const config = buildRenderConfig(args, fps, width, height, variables);
498
+ const { renderToCloudRun, getRenderProgress } = await loadCloudRunAdapter();
499
+ const handle = await renderToCloudRun({
500
+ projectDir: resolve(projectDir),
501
+ config,
502
+ bucketName: state.bucketName,
503
+ projectId: state.projectId,
504
+ location: state.region,
505
+ workflowId: state.workflowId,
506
+ serviceUrl: state.serviceUrl,
507
+ renderId: args["render-id"],
508
+ outputKey: args["output-key"]
509
+ });
510
+ if (!args.wait) {
511
+ if (args.json) console.log(JSON.stringify(handle, null, 2));
512
+ else {
513
+ console.log(`${c.accent("\u2713 render started")} renderId=${handle.renderId}`);
514
+ console.log(` output \u2192 ${handle.outputGcsUri}`);
515
+ console.log(` progress: ${c.accent(`framey cloudrun progress ${handle.executionName}`)}`);
516
+ }
517
+ return;
518
+ }
519
+ const intervalMs = parsePositiveInt(args["wait-interval-ms"], "--wait-interval-ms") ?? 5e3;
520
+ let progress = await getRenderProgress({ executionName: handle.executionName });
521
+ while (progress.status === "running") {
522
+ await new Promise((r) => setTimeout(r, intervalMs));
523
+ progress = await getRenderProgress({ executionName: handle.executionName });
524
+ if (!args.json) process.stdout.write(`\r status=${progress.status} `);
525
+ }
526
+ if (!args.json) process.stdout.write("\n");
527
+ if (args.json) {
528
+ console.log(JSON.stringify(progress, null, 2));
529
+ } else if (progress.status === "succeeded") {
530
+ console.log(
531
+ `${c.accent("\u2713 done.")} ${progress.outputFile?.gcsUri} (${progress.costs.displayCost})`
532
+ );
533
+ } else {
534
+ console.error(`${c.error("\u2717 render " + progress.status)}`);
535
+ for (const e of progress.errors) console.error(` ${e.state}: ${e.cause}`);
536
+ failCommand();
537
+ }
538
+ }
539
+ async function runProgress(args) {
540
+ const executionName = args.target;
541
+ if (!executionName) {
542
+ console.error("[cloudrun progress] usage: framey cloudrun progress <executionName>");
543
+ failCommand();
544
+ }
545
+ const { getRenderProgress } = await loadCloudRunAdapter();
546
+ const progress = await getRenderProgress({ executionName });
547
+ if (args.json) {
548
+ console.log(JSON.stringify(progress, null, 2));
549
+ return;
550
+ }
551
+ console.log(`status=${progress.status} progress=${(progress.overallProgress * 100).toFixed(0)}%`);
552
+ if (progress.totalFrames)
553
+ console.log(`frames=${progress.framesRendered}/${progress.totalFrames}`);
554
+ if (progress.outputFile) console.log(`output=${progress.outputFile.gcsUri}`);
555
+ console.log(`cost=${progress.costs.displayCost}`);
556
+ for (const e of progress.errors) console.error(` error ${e.state}: ${e.cause}`);
557
+ }
558
+ var DEFAULT_BATCH_MAX_CONCURRENT = 50;
559
+ async function runRenderBatch(args) {
560
+ const projectDir = args.target;
561
+ const batchPath = args.batch;
562
+ if (!projectDir || !batchPath) {
563
+ console.error(
564
+ "[cloudrun render-batch] usage: framey cloudrun render-batch <projectDir> --batch <file.jsonl> --width <px> --height <px>"
565
+ );
566
+ failCommand();
567
+ }
568
+ const width = parsePositiveInt(args.width, "--width");
569
+ const height = parsePositiveInt(args.height, "--height");
570
+ if (width === void 0 || height === void 0) {
571
+ console.error("[cloudrun render-batch] --width and --height are required.");
572
+ failCommand();
573
+ }
574
+ const fps = resolveCloudRunFps(args, projectDir, "render-batch");
575
+ if (!existsSync(resolve(batchPath))) {
576
+ console.error(`[cloudrun render-batch] batch file not found: ${batchPath}`);
577
+ failCommand();
578
+ }
579
+ const entries = parseBatchFile(resolve(batchPath));
580
+ if (entries.length === 0) {
581
+ console.error("[cloudrun render-batch] batch file has no entries.");
582
+ failCommand();
583
+ }
584
+ const dryRun = Boolean(args["dry-run"]);
585
+ if (dryRun) {
586
+ const manifest = entries.map((e, i) => ({
587
+ line: i + 1,
588
+ outputKey: e.outputKey,
589
+ status: "would-start"
590
+ }));
591
+ console.log(JSON.stringify(manifest, null, 2));
592
+ return;
593
+ }
594
+ const state = readState(args);
595
+ const maxConcurrent = parsePositiveInt(args["max-concurrent"], "--max-concurrent") ?? DEFAULT_BATCH_MAX_CONCURRENT;
596
+ const { deploySite, renderToCloudRun } = await loadCloudRunAdapter();
597
+ const siteHandle = await deploySite({
598
+ projectDir: resolve(projectDir),
599
+ bucketName: state.bucketName,
600
+ siteId: args["site-id"]
601
+ });
602
+ const results = [];
603
+ for (let i = 0; i < entries.length; i += maxConcurrent) {
604
+ const wave = entries.slice(i, i + maxConcurrent);
605
+ const settled = await Promise.all(
606
+ wave.map(async (entry) => {
607
+ try {
608
+ const config = buildRenderConfig(args, fps, width, height, entry.variables);
609
+ const handle = await renderToCloudRun({
610
+ siteHandle,
611
+ config,
612
+ bucketName: state.bucketName,
613
+ projectId: state.projectId,
614
+ location: state.region,
615
+ workflowId: state.workflowId,
616
+ serviceUrl: state.serviceUrl,
617
+ outputKey: entry.outputKey
618
+ });
619
+ return { outputKey: entry.outputKey, executionName: handle.executionName };
620
+ } catch (err) {
621
+ return {
622
+ outputKey: entry.outputKey,
623
+ error: normalizeErrorMessage(err)
624
+ };
625
+ }
626
+ })
627
+ );
628
+ results.push(...settled);
629
+ }
630
+ const failed = results.filter((r) => r.error);
631
+ if (args.json) {
632
+ console.log(JSON.stringify(results, null, 2));
633
+ } else {
634
+ console.log(
635
+ `${c.accent("\u2713 started")} ${results.length - failed.length}/${results.length} renders`
636
+ );
637
+ for (const r of failed) console.error(` \u2717 ${r.outputKey}: ${r.error}`);
638
+ }
639
+ if (failed.length > 0) failCommand();
640
+ }
641
+ function parseBatchFile(path) {
642
+ const lines = readFileSync(path, "utf8").split(/\r?\n/);
643
+ const entries = [];
644
+ lines.forEach((line, idx) => {
645
+ const trimmed = line.trim();
646
+ if (!trimmed) return;
647
+ let parsed;
648
+ try {
649
+ parsed = JSON.parse(trimmed);
650
+ } catch {
651
+ console.error(`[cloudrun render-batch] line ${idx + 1}: not valid JSON`);
652
+ failCommand();
653
+ }
654
+ if (!parsed || typeof parsed !== "object" || typeof parsed.outputKey !== "string") {
655
+ console.error(
656
+ `[cloudrun render-batch] line ${idx + 1}: must be an object with a string "outputKey"`
657
+ );
658
+ failCommand();
659
+ }
660
+ entries.push(parsed);
661
+ });
662
+ return entries;
663
+ }
664
+ async function runDestroy(args) {
665
+ const { getTerraformModuleDir } = await loadCloudRunAdapter();
666
+ const tfDir = getTerraformModuleDir();
667
+ const state = existsSync(statePath()) ? JSON.parse(readFileSync(statePath(), "utf8")) : {};
668
+ const project = args.project ?? state.projectId;
669
+ const region = args.region ?? state.region ?? "us-central1";
670
+ const image = args.image ?? "unused:latest";
671
+ if (!project) {
672
+ console.error("[cloudrun destroy] --project is required (or deploy first to cache it).");
673
+ failCommand();
674
+ }
675
+ const vars = [
676
+ "-var",
677
+ `project_id=${project}`,
678
+ "-var",
679
+ `region=${region}`,
680
+ "-var",
681
+ `image=${image}`,
682
+ "-var",
683
+ "bucket_force_destroy=true"
684
+ ];
685
+ console.log("\u2192 terraform destroy");
686
+ run("terraform", ["init", "-input=false"], { cwd: tfDir });
687
+ try {
688
+ run("terraform", ["apply", "-input=false", "-auto-approve", ...vars], { cwd: tfDir });
689
+ } catch {
690
+ }
691
+ run("terraform", ["destroy", "-input=false", "-auto-approve", ...vars], { cwd: tfDir });
692
+ console.log(`${c.accent("\u2713 destroyed.")}`);
693
+ }
694
+ function buildRenderConfig(args, fps, width, height, variables) {
695
+ const { outputResolution, outputResolutionAspectAgnostic } = parseOutputResolution(
696
+ args["output-resolution"]
697
+ );
698
+ return stripUndefined({
699
+ fps,
700
+ width,
701
+ height,
702
+ format: parseFormat(args.format),
703
+ codec: parseCodec(args.codec),
704
+ quality: parseQuality(args.quality),
705
+ chunkSize: parsePositiveInt(args["chunk-size"], "--chunk-size"),
706
+ maxParallelChunks: parsePositiveInt(args["max-parallel-chunks"], "--max-parallel-chunks"),
707
+ targetChunkFrames: parsePositiveInt(args["target-chunk-frames"], "--target-chunk-frames"),
708
+ outputResolution,
709
+ // Set only when true so the wire shape stays sparse for the common
710
+ // canonical-preset path (matches how the flag flows through
711
+ // `SerializableDistributedRenderConfig` from every other emitter).
712
+ outputResolutionAspectAgnostic: outputResolutionAspectAgnostic ? true : void 0,
713
+ variables
714
+ });
715
+ }
716
+ function resolveAndValidateVariables(args, projectDir) {
717
+ const variables = resolveVariablesArg(
718
+ args.variables,
719
+ args["variables-file"]
720
+ );
721
+ if (variables && Object.keys(variables).length > 0) {
722
+ const indexPath = join(projectDir, "index.html");
723
+ if (existsSync(indexPath)) {
724
+ const issues = validateVariablesAgainstProject(indexPath, variables);
725
+ reportVariableIssues(issues, {
726
+ strict: Boolean(args["strict-variables"]),
727
+ quiet: Boolean(args.json)
728
+ });
729
+ }
730
+ }
731
+ return variables;
732
+ }
733
+ function parseOutputResolution(raw) {
734
+ return parseOutputResolutionFlag(raw, { surfaceLabel: "[cloudrun render]" });
735
+ }
736
+ function parseIntFlag(raw) {
737
+ if (raw === void 0 || raw === null || raw === "") return void 0;
738
+ const n = Number.parseInt(String(raw), 10);
739
+ return Number.isFinite(n) ? n : void 0;
740
+ }
741
+ function parsePositiveInt(raw, flagName) {
742
+ const n = parseIntFlag(raw);
743
+ if (n === void 0) return void 0;
744
+ if (!Number.isInteger(n) || n < 1) {
745
+ throw new Error(`[cloudrun] ${flagName} must be a positive integer; got ${n}`);
746
+ }
747
+ return n;
748
+ }
749
+ function parseEnum(raw, allowed, errorPrefix, defaultValue) {
750
+ if (raw === void 0 || raw === null || raw === "") return defaultValue;
751
+ const s = String(raw);
752
+ if (allowed.includes(s)) return s;
753
+ throw new Error(`${errorPrefix} must be ${allowed.join("|")}; got ${s}`);
754
+ }
755
+ var FORMATS = ["mp4", "mov", "png-sequence", "webm"];
756
+ var CODECS = ["h264", "h265"];
757
+ var QUALITIES = ["draft", "standard", "high"];
758
+ var parseFormat = (raw) => parseEnum(raw, FORMATS, "[cloudrun render] --format", "mp4");
759
+ var parseCodec = (raw) => parseEnum(raw, CODECS, "[cloudrun render] --codec", void 0);
760
+ var parseQuality = (raw) => parseEnum(raw, QUALITIES, "[cloudrun render] --quality", void 0);
761
+ export {
762
+ buildRenderConfig,
763
+ cloudrun_default as default,
764
+ examples,
765
+ isMissingCloudRunAdapterError,
766
+ missingCloudRunAdapterMessage
767
+ };