@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.
- package/LICENSE +33 -0
- package/README.md +78 -3
- package/accounts.example.json +61 -0
- package/accounts.first-run.json +41 -0
- package/bin/vfrey.mjs +36 -0
- package/integration-tools/README.md +43 -0
- package/integration-tools/image/pillow.md +32 -0
- package/integration-tools/image/playwright.md +33 -0
- package/integration-tools/image/resvg.md +36 -0
- package/integration-tools/image/satori.md +36 -0
- package/integration-tools/image/sharp.md +38 -0
- package/integration-tools/video/blender.md +34 -0
- package/integration-tools/video/ffmpeg.md +41 -0
- package/integration-tools/video/manim.md +37 -0
- package/integration-tools/video/motion-canvas.md +37 -0
- package/integration-tools/video/remotion.md +50 -0
- package/integration-tools/video/revideo.md +32 -0
- package/package.json +74 -6
- package/skills/vfrey-orchestrator/SKILL.md +15 -0
- package/skills/vfrey-orchestrator/channel-video/SKILL.md +41 -0
- package/skills/vfrey-product/SKILL.md +63 -0
- package/skills/vfrey-product/examples/concurrency-vs-parallelism/framey/cook-one.svg +14 -0
- package/skills/vfrey-product/examples/concurrency-vs-parallelism/framey/cook-two.svg +22 -0
- package/skills/vfrey-product/examples/concurrency-vs-parallelism/framey/index.html +70 -0
- package/skills/vfrey-product/examples/concurrency-vs-parallelism/remotion/cook-one.svg +14 -0
- package/skills/vfrey-product/examples/concurrency-vs-parallelism/remotion/cook-two.svg +22 -0
- package/skills/vfrey-product/examples/concurrency-vs-parallelism/remotion/index.tsx +49 -0
- package/skills/vfrey-product/examples/concurrency-vs-parallelism/script.json +15 -0
- package/skills/vfrey-product/examples/octopus-facts/index.html +60 -0
- package/skills/vfrey-product/examples/octopus-facts/octopus.svg +8 -0
- package/skills/vfrey-product/examples/octopus-facts/script.json +14 -0
- package/skills/vfrey-product/push/SKILL.md +15 -0
- package/skills/vfrey-product/scenes/NOTICE +5 -0
- package/skills/vfrey-product/scenes/blocks.md +57 -0
- package/skills/vfrey-product/scenes/craft.md +118 -0
- package/skills/vfrey-product/scenes/motion.md +88 -0
- package/src/analytics/dashboard.ts +109 -0
- package/src/analytics/index.ts +260 -0
- package/src/api/client.ts +282 -0
- package/src/api/commands.ts +330 -0
- package/src/api/config.ts +34 -0
- package/src/api/creators.ts +463 -0
- package/src/api/credentials.ts +152 -0
- package/src/api/mail.ts +333 -0
- package/src/api/topics.ts +207 -0
- package/src/api/types.ts +205 -0
- package/src/cli.ts +467 -0
- package/src/cloud/executor.ts +281 -0
- package/src/cloud/job.ts +106 -0
- package/src/cloud/render-job.ts +187 -0
- package/src/config.ts +309 -0
- package/src/dashboard-link.ts +180 -0
- package/src/dashboard-start.ts +103 -0
- package/src/desk/channel.ts +64 -0
- package/src/desk/cli.ts +216 -0
- package/src/desk/creators-route.ts +129 -0
- package/src/desk/fonts/JetBrainsMono-OFL.txt +93 -0
- package/src/desk/fonts/google-sans-flex-latin.woff2 +0 -0
- package/src/desk/fonts/jetbrains-mono-medium.woff2 +0 -0
- package/src/desk/http.ts +460 -0
- package/src/desk/mail-route.ts +103 -0
- package/src/desk/overlay.ts +112 -0
- package/src/desk/preview.ts +422 -0
- package/src/desk/screens.ts +149 -0
- package/src/desk/secrets.ts +143 -0
- package/src/desk/series.ts +127 -0
- package/src/desk/state.ts +77 -0
- package/src/desk/studio-route.ts +119 -0
- package/src/desk/tick-runner.ts +66 -0
- package/src/desk/tick.ts +56 -0
- package/src/desk/topics-route.ts +41 -0
- package/src/desk/ui/app.css +505 -0
- package/src/desk/ui/app.js +185 -0
- package/src/desk/ui/apple-icon.png +0 -0
- package/src/desk/ui/components.js +79 -0
- package/src/desk/ui/core.js +156 -0
- package/src/desk/ui/favicon.ico +0 -0
- package/src/desk/ui/icon.svg +1 -0
- package/src/desk/ui/icons.js +49 -0
- package/src/desk/ui/index.html +41 -0
- package/src/desk/ui/metrics-math.d.ts +22 -0
- package/src/desk/ui/metrics-math.js +135 -0
- package/src/desk/ui/theme.js +5 -0
- package/src/desk/ui/views-creators.js +209 -0
- package/src/desk/ui/views-keys.js +114 -0
- package/src/desk/ui/views-mail.js +188 -0
- package/src/desk/ui/views-misc.js +123 -0
- package/src/desk/ui/views-review.js +119 -0
- package/src/desk/ui/views-runs.js +350 -0
- package/src/desk/ui/views-screens.js +163 -0
- package/src/desk/ui/views-series.js +318 -0
- package/src/desk/ui/views-topics.js +87 -0
- package/src/desk/verbs.ts +361 -0
- package/src/doctor.ts +212 -0
- package/src/drain.ts +14 -0
- package/src/engage/index.ts +217 -0
- package/src/generate/index.ts +110 -0
- package/src/generate/script.ts +152 -0
- package/src/generate/title.ts +78 -0
- package/src/help.ts +233 -0
- package/src/home.ts +45 -0
- package/src/llm/client.ts +177 -0
- package/src/log.ts +7 -0
- package/src/oauth/tokens.ts +189 -0
- package/src/oauth/vault.ts +72 -0
- package/src/pipeline/review.ts +642 -0
- package/src/pipeline/run.ts +443 -0
- package/src/pipeline/series-guard.ts +26 -0
- package/src/pipeline/source-fetch.ts +69 -0
- package/src/pipeline/stages.ts +728 -0
- package/src/pipeline/topics-source.ts +90 -0
- package/src/product/commands.ts +296 -0
- package/src/product/config-file.ts +38 -0
- package/src/product/engine-choice.ts +89 -0
- package/src/product/engines.ts +103 -0
- package/src/product/insights.ts +50 -0
- package/src/product/keys.ts +67 -0
- package/src/product/paths.ts +18 -0
- package/src/product/probes.ts +88 -0
- package/src/product/push-flow.ts +90 -0
- package/src/product/render-video.ts +21 -0
- package/src/product/short.ts +62 -0
- package/src/product/update.ts +32 -0
- package/src/project/canonical.ts +14 -0
- package/src/project/commands.ts +177 -0
- package/src/project/dashboard-status.ts +28 -0
- package/src/project/discover.ts +19 -0
- package/src/project/index-file.ts +73 -0
- package/src/project/marker.ts +87 -0
- package/src/project/migrate.ts +201 -0
- package/src/project/names.ts +27 -0
- package/src/project/notice.ts +16 -0
- package/src/project/open.ts +88 -0
- package/src/project/scaffold.ts +112 -0
- package/src/project/templates.ts +42 -0
- package/src/project/videos.ts +64 -0
- package/src/publish/facebook.ts +91 -0
- package/src/publish/index.ts +12 -0
- package/src/publish/instagram.ts +97 -0
- package/src/publish/rate.ts +62 -0
- package/src/publish/session.ts +242 -0
- package/src/publish/tiktok.ts +202 -0
- package/src/publish/youtube.ts +177 -0
- package/src/queue/desk-ops.ts +1170 -0
- package/src/queue/seal.ts +3 -0
- package/src/queue/store.ts +1006 -0
- package/src/remotion/AiLabel.tsx +26 -0
- package/src/remotion/Root.tsx +73 -0
- package/src/remotion/defaults.ts +26 -0
- package/src/remotion/films/claude/ClaudeFilm.tsx +1014 -0
- package/src/remotion/films/engine/EngineMark.tsx +17 -0
- package/src/remotion/films/rea/ReaShort.tsx +552 -0
- package/src/remotion/films/rea/drawings.tsx +907 -0
- package/src/remotion/films/rea/timing.ts +144 -0
- package/src/remotion/index.ts +4 -0
- package/src/remotion/templates/EditorialSplit.tsx +39 -0
- package/src/remotion/templates/KineticType.tsx +39 -0
- package/src/remotion/templates/SignalBoard.tsx +50 -0
- package/src/remotion/timing.ts +22 -0
- package/src/render/chrome.ts +78 -0
- package/src/render/engine-mark.ts +29 -0
- package/src/render/framey-template.ts +130 -0
- package/src/render/html-engine.ts +149 -0
- package/src/render/node-crypto-stub.ts +11 -0
- package/src/render/probe.ts +29 -0
- package/src/render/props.ts +17 -0
- package/src/render/vertical-short.ts +35 -0
- package/src/render/webpack.ts +33 -0
- package/src/render/worker.ts +65 -0
- package/src/scene/assets/fonts/TitanOne-OFL.txt +94 -0
- package/src/scene/assets/fonts/titan-one.woff2 +0 -0
- package/src/scene/assets/gsap/LICENSE.txt +8 -0
- package/src/scene/assets/gsap/gsap.min.js +11 -0
- package/src/scene/audio.ts +54 -0
- package/src/scene/blocks/LICENSE +190 -0
- package/src/scene/blocks/NOTICE +5 -0
- package/src/scene/blocks/bar-chart-race/bar-chart-race.html +585 -0
- package/src/scene/blocks/beat-freeze-cut/beat-freeze-cut.html +874 -0
- package/src/scene/blocks/camcorder-hud/camcorder-hud.html +164 -0
- package/src/scene/blocks/camera-dolly-zoom/camera-dolly-zoom.html +355 -0
- package/src/scene/blocks/code-diff/code-diff.html +817 -0
- package/src/scene/blocks/code-snippet-apple-terminal-pro/code-snippet-apple-terminal-pro.html +248 -0
- package/src/scene/blocks/code-typing/code-typing.html +764 -0
- package/src/scene/blocks/data-chart/data-chart.html +452 -0
- package/src/scene/blocks/flowchart-vertical/flowchart-vertical.html +454 -0
- package/src/scene/blocks/hw-scribble-transition/hw-scribble-transition.html +153 -0
- package/src/scene/blocks/index.json +824 -0
- package/src/scene/blocks/lt-accent-underline/lt-accent-underline.html +107 -0
- package/src/scene/blocks/lt-bold-block/lt-bold-block.html +109 -0
- package/src/scene/blocks/lt-clean-bar/lt-clean-bar.html +112 -0
- package/src/scene/blocks/lt-dark-card/lt-dark-card.html +111 -0
- package/src/scene/blocks/lt-kicker-name/lt-kicker-name.html +114 -0
- package/src/scene/blocks/lt-mask-reveal/lt-mask-reveal.html +120 -0
- package/src/scene/blocks/lt-neon-border/lt-neon-border.html +391 -0
- package/src/scene/blocks/lt-stack-bars/lt-stack-bars.html +109 -0
- package/src/scene/blocks/macos-notification/macos-notification.html +194 -0
- package/src/scene/blocks/mk-background/mk-background.html +236 -0
- package/src/scene/blocks/mk-callout-highlight/mk-callout-highlight.html +183 -0
- package/src/scene/blocks/mk-clone-wall-transition/mk-clone-wall-transition.html +226 -0
- package/src/scene/blocks/mk-line-graph/mk-line-graph.html +293 -0
- package/src/scene/blocks/mk-progress-stat/mk-progress-stat.html +186 -0
- package/src/scene/blocks/mk-specs-list/mk-specs-list.html +223 -0
- package/src/scene/blocks/news-ticker/news-ticker.html +409 -0
- package/src/scene/blocks/organic-light-leak-overlay/organic-light-leak-overlay.html +126 -0
- package/src/scene/blocks/oscilloscope-trace/oscilloscope-trace.html +519 -0
- package/src/scene/blocks/snow/snow.html +205 -0
- package/src/scene/blocks/split-flap-board/split-flap-board.html +347 -0
- package/src/scene/blocks/spotify-card/spotify-card.html +294 -0
- package/src/scene/blocks/starfield/starfield.html +188 -0
- package/src/scene/blocks/thread-message-stack/thread-message-stack.html +239 -0
- package/src/scene/blocks/week-in-merges/week-in-merges.html +470 -0
- package/src/scene/blocks/x-post/x-post.html +437 -0
- package/src/scene/blocks/yt-comment-card/yt-comment-card.html +319 -0
- package/src/scene/blocks/yt-lcd-background/yt-lcd-background.html +307 -0
- package/src/scene/blocks/yt-prism-title/yt-prism-title.html +205 -0
- package/src/scene/blocks.ts +229 -0
- package/src/scene/command.ts +272 -0
- package/src/scene/figure.ts +181 -0
- package/src/scene/glyphs.ts +107 -0
- package/src/scene/init.ts +86 -0
- package/src/scene/inspect/css-tree.d.ts +6 -0
- package/src/scene/inspect/page-scripts.ts +272 -0
- package/src/scene/inspect/report.ts +405 -0
- package/src/scene/inspect/run.ts +200 -0
- package/src/scene/inspect/source.ts +236 -0
- package/src/scene/label.ts +131 -0
- package/src/scene/net-guard.ts +74 -0
- package/src/scene/render.ts +292 -0
- package/src/scene/runtime/browser.ts +199 -0
- package/src/scene/runtime/core.ts +181 -0
- package/src/scene/runtime/react.tsx +115 -0
- package/src/scene/runtime/transitions.ts +133 -0
- package/src/scene/sanitize.ts +181 -0
- package/src/scene/scene.ts +152 -0
- package/src/scene/studio-command.ts +48 -0
- package/src/scene/studio-skin.ts +59 -0
- package/src/scene/studio.ts +337 -0
- package/src/scene/supply.ts +111 -0
- package/src/scene/timing.ts +288 -0
- package/src/scene/transitions/LICENSE +190 -0
- package/src/scene/transitions/NOTICE +5 -0
- package/src/scene/transitions/SOURCE.json +24 -0
- package/src/scene/transitions/transitions.global.js +38 -0
- package/src/scene/transitions.ts +26 -0
- package/src/service/all-projects.ts +153 -0
- package/src/service/commands.ts +256 -0
- package/src/service/due.ts +82 -0
- package/src/service/lock.ts +101 -0
- package/src/service/log-file.ts +56 -0
- package/src/service/state.ts +41 -0
- package/src/service/units.ts +90 -0
- package/src/service/worker.ts +51 -0
- package/src/skill-agents.ts +74 -0
- package/src/skill-install.ts +334 -0
- package/src/sync-write.ts +21 -0
- package/src/tick-report.ts +205 -0
- package/src/tts.ts +124 -0
- package/vendor/@vfrey/contracts/dist/account.d.ts +97 -0
- package/vendor/@vfrey/contracts/dist/account.js +27 -0
- package/vendor/@vfrey/contracts/dist/checks.d.ts +8 -0
- package/vendor/@vfrey/contracts/dist/checks.js +1 -0
- package/vendor/@vfrey/contracts/dist/credentials/crypto.d.ts +4 -0
- package/vendor/@vfrey/contracts/dist/credentials/crypto.js +38 -0
- package/vendor/@vfrey/contracts/dist/domain/advice-persona.d.ts +10 -0
- package/vendor/@vfrey/contracts/dist/domain/advice-persona.js +24 -0
- package/vendor/@vfrey/contracts/dist/domain/backoff.d.ts +13 -0
- package/vendor/@vfrey/contracts/dist/domain/backoff.js +27 -0
- package/vendor/@vfrey/contracts/dist/domain/cadence.d.ts +29 -0
- package/vendor/@vfrey/contracts/dist/domain/cadence.js +95 -0
- package/vendor/@vfrey/contracts/dist/domain/creators.d.ts +146 -0
- package/vendor/@vfrey/contracts/dist/domain/creators.js +2 -0
- package/vendor/@vfrey/contracts/dist/domain/disclosure.d.ts +127 -0
- package/vendor/@vfrey/contracts/dist/domain/disclosure.js +250 -0
- package/vendor/@vfrey/contracts/dist/domain/errors.d.ts +34 -0
- package/vendor/@vfrey/contracts/dist/domain/errors.js +68 -0
- package/vendor/@vfrey/contracts/dist/domain/redact.d.ts +1 -0
- package/vendor/@vfrey/contracts/dist/domain/redact.js +21 -0
- package/vendor/@vfrey/contracts/dist/domain/revenue.d.ts +13 -0
- package/vendor/@vfrey/contracts/dist/domain/revenue.js +16 -0
- package/vendor/@vfrey/contracts/dist/domain/safety.d.ts +20 -0
- package/vendor/@vfrey/contracts/dist/domain/safety.js +61 -0
- package/vendor/@vfrey/contracts/dist/domain/similarity.d.ts +13 -0
- package/vendor/@vfrey/contracts/dist/domain/similarity.js +100 -0
- package/vendor/@vfrey/contracts/dist/domain/templates.d.ts +18 -0
- package/vendor/@vfrey/contracts/dist/domain/templates.js +67 -0
- package/vendor/@vfrey/contracts/dist/domain/tiktok-chunks.d.ts +19 -0
- package/vendor/@vfrey/contracts/dist/domain/tiktok-chunks.js +52 -0
- package/vendor/@vfrey/contracts/dist/domain/topics.d.ts +78 -0
- package/vendor/@vfrey/contracts/dist/domain/topics.js +4 -0
- package/vendor/@vfrey/contracts/dist/domain/types.d.ts +216 -0
- package/vendor/@vfrey/contracts/dist/domain/types.js +1 -0
- package/vendor/@vfrey/contracts/dist/domain/variation.d.ts +57 -0
- package/vendor/@vfrey/contracts/dist/domain/variation.js +278 -0
- package/vendor/@vfrey/contracts/dist/events.d.ts +20 -0
- package/vendor/@vfrey/contracts/dist/events.js +1 -0
- package/vendor/@vfrey/contracts/dist/http.d.ts +11 -0
- package/vendor/@vfrey/contracts/dist/http.js +37 -0
- package/vendor/@vfrey/contracts/dist/index.d.ts +22 -0
- package/vendor/@vfrey/contracts/dist/index.js +22 -0
- package/vendor/@vfrey/contracts/dist/log.d.ts +2 -0
- package/vendor/@vfrey/contracts/dist/log.js +10 -0
- package/vendor/@vfrey/contracts/dist/mail.d.ts +55 -0
- package/vendor/@vfrey/contracts/dist/mail.js +1 -0
- package/vendor/@vfrey/contracts/package.json +18 -0
- package/vendor/@vfrey/ingest/dist/index.d.ts +41 -0
- package/vendor/@vfrey/ingest/dist/index.js +221 -0
- package/vendor/@vfrey/ingest/dist/parse.d.ts +5 -0
- package/vendor/@vfrey/ingest/dist/parse.js +165 -0
- package/vendor/@vfrey/ingest/package.json +21 -0
- package/vendor/framey/LICENSE +190 -0
- package/vendor/framey/NOTICE +15 -0
- package/vendor/framey/SOURCE.json +24 -0
- package/vendor/framey/STUDIO-SOURCE.json +9 -0
- package/vendor/framey/bin/framey-localize-fonts.mjs +12 -0
- package/vendor/framey/bin/framey.mjs +16 -0
- package/vendor/framey/dist/add-VMJD5KBS.js +75 -0
- package/vendor/framey/dist/animatedGifPrep-QPKGJ6PM.js +43 -0
- package/vendor/framey/dist/api.d.ts +211 -0
- package/vendor/framey/dist/api.js +76 -0
- package/vendor/framey/dist/appHistory-WW56FZTT.js +31 -0
- package/vendor/framey/dist/asset-WQKGOELE.js +26 -0
- package/vendor/framey/dist/audio-RSJWVWRA.js +1936 -0
- package/vendor/framey/dist/batchRender-3HPICDCT.js +366 -0
- package/vendor/framey/dist/beats-HL2BDUZI.js +273 -0
- package/vendor/framey/dist/benchmark-RWCWHI5Z.js +230 -0
- package/vendor/framey/dist/browser-ECYET3Q2.js +206 -0
- package/vendor/framey/dist/bundleWithLocalizedFonts-ALYBQEQT.js +52 -0
- package/vendor/framey/dist/captureCompositionFrame-4DA6SEH2.js +94 -0
- package/vendor/framey/dist/catalog-5JVDEUWK.js +979 -0
- package/vendor/framey/dist/catch-up-NEBCL5NO.js +106 -0
- package/vendor/framey/dist/check-F5N544ML.js +111 -0
- package/vendor/framey/dist/checkBrowser-LZ66CMJG.js +110 -0
- package/vendor/framey/dist/chunk-2K7Z2HVP.js +372 -0
- package/vendor/framey/dist/chunk-2UZQHDM7.js +323 -0
- package/vendor/framey/dist/chunk-2X4PQEYM.js +34 -0
- package/vendor/framey/dist/chunk-3422KMTD.js +168 -0
- package/vendor/framey/dist/chunk-3FYD4YEK.js +72 -0
- package/vendor/framey/dist/chunk-3GXQPCJC.js +682 -0
- package/vendor/framey/dist/chunk-3LM6YPBR.js +179 -0
- package/vendor/framey/dist/chunk-442JNXRM.js +20 -0
- package/vendor/framey/dist/chunk-4BNN5FGX.js +182 -0
- package/vendor/framey/dist/chunk-4P7NX5BM.js +11532 -0
- package/vendor/framey/dist/chunk-4UMPIPCQ.js +88 -0
- package/vendor/framey/dist/chunk-4YYJOFKS.js +28 -0
- package/vendor/framey/dist/chunk-54HJ63Q2.js +29 -0
- package/vendor/framey/dist/chunk-5ETJX6WM.js +89 -0
- package/vendor/framey/dist/chunk-5SG54JRS.js +68 -0
- package/vendor/framey/dist/chunk-634HSJ3J.js +58 -0
- package/vendor/framey/dist/chunk-66LREXGS.js +48 -0
- package/vendor/framey/dist/chunk-6BEFEWFB.js +25 -0
- package/vendor/framey/dist/chunk-6BNTGNGD.js +286 -0
- package/vendor/framey/dist/chunk-6DDPOHMK.js +140 -0
- package/vendor/framey/dist/chunk-6GV5XSOR.js +214 -0
- package/vendor/framey/dist/chunk-6JR2XUEE.js +127 -0
- package/vendor/framey/dist/chunk-73QVATIM.js +362 -0
- package/vendor/framey/dist/chunk-7FMUTGOH.js +279 -0
- package/vendor/framey/dist/chunk-7JQFJ6JJ.js +291 -0
- package/vendor/framey/dist/chunk-AHPGAESX.js +113 -0
- package/vendor/framey/dist/chunk-AHX34EFP.js +15 -0
- package/vendor/framey/dist/chunk-AJ5CSAEZ.js +487 -0
- package/vendor/framey/dist/chunk-B7RJV74O.js +5047 -0
- package/vendor/framey/dist/chunk-BL4U6U52.js +254 -0
- package/vendor/framey/dist/chunk-BSQ7XANM.js +210 -0
- package/vendor/framey/dist/chunk-BZ56MTDX.js +6 -0
- package/vendor/framey/dist/chunk-C5BO7PMT.js +282 -0
- package/vendor/framey/dist/chunk-CFUCHO4T.js +358 -0
- package/vendor/framey/dist/chunk-CZGHFATT.js +31 -0
- package/vendor/framey/dist/chunk-DLA44CMS.js +5649 -0
- package/vendor/framey/dist/chunk-DPVXBVLL.js +31292 -0
- package/vendor/framey/dist/chunk-DQBY7FRR.js +397 -0
- package/vendor/framey/dist/chunk-EAMLBAHA.js +154 -0
- package/vendor/framey/dist/chunk-EOVYQ3IG.js +143 -0
- package/vendor/framey/dist/chunk-EVMY7IPL.js +612 -0
- package/vendor/framey/dist/chunk-FG4BBFZI.js +122 -0
- package/vendor/framey/dist/chunk-FI4I7CME.js +56 -0
- package/vendor/framey/dist/chunk-FLREUEHW.js +2081 -0
- package/vendor/framey/dist/chunk-FUFP7A7S.js +1126 -0
- package/vendor/framey/dist/chunk-FV3PIKGH.js +56 -0
- package/vendor/framey/dist/chunk-FXMKHHPO.js +123 -0
- package/vendor/framey/dist/chunk-GGZAM5VH.js +1187 -0
- package/vendor/framey/dist/chunk-GKZEVJIB.js +39 -0
- package/vendor/framey/dist/chunk-GMECXFAN.js +57 -0
- package/vendor/framey/dist/chunk-GNEFDLFB.js +621 -0
- package/vendor/framey/dist/chunk-GPMLSOEG.js +19274 -0
- package/vendor/framey/dist/chunk-GPYVT5EE.js +59 -0
- package/vendor/framey/dist/chunk-H6IEMZEV.js +40 -0
- package/vendor/framey/dist/chunk-HEFQCIXR.js +170 -0
- package/vendor/framey/dist/chunk-HFQ4CWHA.js +118 -0
- package/vendor/framey/dist/chunk-HPDTCOKE.js +304 -0
- package/vendor/framey/dist/chunk-HTUHQKDB.js +548 -0
- package/vendor/framey/dist/chunk-HU2SPFNG.js +103 -0
- package/vendor/framey/dist/chunk-HVW7ABXD.js +19 -0
- package/vendor/framey/dist/chunk-IG7NDKXO.js +26 -0
- package/vendor/framey/dist/chunk-II3J3WXK.js +246 -0
- package/vendor/framey/dist/chunk-IR35BCLK.js +13 -0
- package/vendor/framey/dist/chunk-ISN5GRYI.js +20 -0
- package/vendor/framey/dist/chunk-IUONB55J.js +669 -0
- package/vendor/framey/dist/chunk-IVSUQR2B.js +161 -0
- package/vendor/framey/dist/chunk-IXU6PQSW.js +259 -0
- package/vendor/framey/dist/chunk-IZCW2NKT.js +29 -0
- package/vendor/framey/dist/chunk-JGXJU5PF.js +68 -0
- package/vendor/framey/dist/chunk-JHOCK3DG.js +27 -0
- package/vendor/framey/dist/chunk-JVBRJMOP.js +121 -0
- package/vendor/framey/dist/chunk-K4MJX7SR.js +17 -0
- package/vendor/framey/dist/chunk-K4WKGXRC.js +18 -0
- package/vendor/framey/dist/chunk-KGPLIH7B.js +127 -0
- package/vendor/framey/dist/chunk-KLIKCX6Q.js +63 -0
- package/vendor/framey/dist/chunk-KXTKKBOC.js +61 -0
- package/vendor/framey/dist/chunk-KZI44OPA.js +185 -0
- package/vendor/framey/dist/chunk-LEKZNRKI.js +45 -0
- package/vendor/framey/dist/chunk-LFGJWOVA.js +61 -0
- package/vendor/framey/dist/chunk-LLMSX6V6.js +17 -0
- package/vendor/framey/dist/chunk-LTGTN2TH.js +195 -0
- package/vendor/framey/dist/chunk-M2WBOQ2Q.js +54 -0
- package/vendor/framey/dist/chunk-MI5FTLYK.js +399 -0
- package/vendor/framey/dist/chunk-MLQP2QUF.js +1809 -0
- package/vendor/framey/dist/chunk-MMQ52NIZ.js +956 -0
- package/vendor/framey/dist/chunk-ND46XKK3.js +742 -0
- package/vendor/framey/dist/chunk-NYEXNSHM.js +504 -0
- package/vendor/framey/dist/chunk-O4YRB27L.js +57 -0
- package/vendor/framey/dist/chunk-O7BGSQ5F.js +92 -0
- package/vendor/framey/dist/chunk-OFQWTKPW.js +117 -0
- package/vendor/framey/dist/chunk-P5ZBLXJ6.js +91 -0
- package/vendor/framey/dist/chunk-P6LJ4Y32.js +4662 -0
- package/vendor/framey/dist/chunk-PKZ7RK5N.js +281 -0
- package/vendor/framey/dist/chunk-PURHAXFL.js +15 -0
- package/vendor/framey/dist/chunk-Q5X2B5WT.js +29 -0
- package/vendor/framey/dist/chunk-QAMKOG67.js +248 -0
- package/vendor/framey/dist/chunk-R6YBK4XX.js +514 -0
- package/vendor/framey/dist/chunk-RGLQURIX.js +2997 -0
- package/vendor/framey/dist/chunk-RNV3DM4S.js +3573 -0
- package/vendor/framey/dist/chunk-ROEW726S.js +4638 -0
- package/vendor/framey/dist/chunk-RQVDTPGD.js +6 -0
- package/vendor/framey/dist/chunk-RVZHGOGR.js +26 -0
- package/vendor/framey/dist/chunk-RXATE6FZ.js +385 -0
- package/vendor/framey/dist/chunk-S3S4TGEH.js +424 -0
- package/vendor/framey/dist/chunk-SDYDNHEE.js +11202 -0
- package/vendor/framey/dist/chunk-SSWBU67I.js +173 -0
- package/vendor/framey/dist/chunk-ST35C4K6.js +28 -0
- package/vendor/framey/dist/chunk-SZNTYTIV.js +990 -0
- package/vendor/framey/dist/chunk-T2EUWCJE.js +29 -0
- package/vendor/framey/dist/chunk-T6AGUTZJ.js +444 -0
- package/vendor/framey/dist/chunk-THJALHFJ.js +11131 -0
- package/vendor/framey/dist/chunk-TIQB63MX.js +18128 -0
- package/vendor/framey/dist/chunk-U242RTCT.js +134 -0
- package/vendor/framey/dist/chunk-UJZREAV6.js +3901 -0
- package/vendor/framey/dist/chunk-UMD3V7CU.js +264 -0
- package/vendor/framey/dist/chunk-UOFAE5RF.js +42 -0
- package/vendor/framey/dist/chunk-UTEIUGAZ.js +29 -0
- package/vendor/framey/dist/chunk-VAS6HQX3.js +138 -0
- package/vendor/framey/dist/chunk-VC76R6W2.js +27 -0
- package/vendor/framey/dist/chunk-VFZ7W5W7.js +226 -0
- package/vendor/framey/dist/chunk-VHNLZAE2.js +348 -0
- package/vendor/framey/dist/chunk-VMC4WSH5.js +278 -0
- package/vendor/framey/dist/chunk-VORQIH64.js +108 -0
- package/vendor/framey/dist/chunk-VTXFRIHO.js +186 -0
- package/vendor/framey/dist/chunk-W2LGJSEN.js +182 -0
- package/vendor/framey/dist/chunk-WKBM7NDG.js +32 -0
- package/vendor/framey/dist/chunk-WMQNIQDJ.js +2057 -0
- package/vendor/framey/dist/chunk-WN4XZC5F.js +504 -0
- package/vendor/framey/dist/chunk-WQ6ZXHFQ.js +133 -0
- package/vendor/framey/dist/chunk-X7HBSTCZ.js +53 -0
- package/vendor/framey/dist/chunk-X7MTZ4T2.js +6 -0
- package/vendor/framey/dist/chunk-XPTOJZJF.js +308 -0
- package/vendor/framey/dist/chunk-XT6MXC7A.js +6 -0
- package/vendor/framey/dist/chunk-XT7X6QCP.js +6 -0
- package/vendor/framey/dist/chunk-XTMDWNEC.js +2820 -0
- package/vendor/framey/dist/chunk-XUHOIDKG.js +6 -0
- package/vendor/framey/dist/chunk-XX7LTW5Y.js +138 -0
- package/vendor/framey/dist/chunk-Y3YGTZEG.js +382 -0
- package/vendor/framey/dist/chunk-Y5SBSGN7.js +346 -0
- package/vendor/framey/dist/chunk-YCMVI4MZ.js +625 -0
- package/vendor/framey/dist/chunk-YOR4CTCE.js +261 -0
- package/vendor/framey/dist/chunk-YPRBGITP.js +2748 -0
- package/vendor/framey/dist/chunk-ZKDMAOFU.js +32 -0
- package/vendor/framey/dist/chunk-ZW6DURPF.js +1318 -0
- package/vendor/framey/dist/clean-ZJOGDKDM.js +336 -0
- package/vendor/framey/dist/cli.js +439 -0
- package/vendor/framey/dist/cloudrun-HGJ3B6ZV.js +767 -0
- package/vendor/framey/dist/commands/contrast-audit.browser.js +643 -0
- package/vendor/framey/dist/commands/layout-audit.browser.js +2914 -0
- package/vendor/framey/dist/commands/motion-sample.browser.js +74 -0
- package/vendor/framey/dist/commands/motion-signature.browser.js +475 -0
- package/vendor/framey/dist/compare-W7UY3BAZ.js +463 -0
- package/vendor/framey/dist/compiler-TM3W6GYF.js +136 -0
- package/vendor/framey/dist/component-QF5VGYMU.js +176 -0
- package/vendor/framey/dist/compositions-XT3PMNDF.js +238 -0
- package/vendor/framey/dist/contactSheet-7W6GYHBQ.js +24 -0
- package/vendor/framey/dist/deploy-6FJPWKF2.js +299 -0
- package/vendor/framey/dist/destroy-HE2RIPKZ.js +57 -0
- package/vendor/framey/dist/deterministicFonts-RADD3BSX.js +50 -0
- package/vendor/framey/dist/dist-4S2FGGVY.js +422 -0
- package/vendor/framey/dist/dist-BE4B2EZE.js +32 -0
- package/vendor/framey/dist/dist-EWXJGN63.js +129 -0
- package/vendor/framey/dist/docs-VKIRFEEX.js +131 -0
- package/vendor/framey/dist/doctor-2UNJ2G7U.js +74 -0
- package/vendor/framey/dist/dom-37K6YOH4.js +14 -0
- package/vendor/framey/dist/dotEnv-7PZQTVIM.js +54 -0
- package/vendor/framey/dist/events-ACY3P2PA.js +76 -0
- package/vendor/framey/dist/events-IHB3B2MK.js +69 -0
- package/vendor/framey/dist/ffmpeg-DR5LGGSK.js +63 -0
- package/vendor/framey/dist/figma-BODVUPHB.js +63 -0
- package/vendor/framey/dist/fontData.generated-NXAOI4GH.js +13 -0
- package/vendor/framey/dist/fontLocalizeCli.js +142 -0
- package/vendor/framey/dist/gpuPolicy-XLEXORZY.js +49 -0
- package/vendor/framey/dist/grade-compare-GAXFQ74C.js +661 -0
- package/vendor/framey/dist/gsapParser-IEUSLYDJ.js +2885 -0
- package/vendor/framey/dist/gsapParserAcorn-LZJKCFQI.js +30 -0
- package/vendor/framey/dist/help-VCB5X2HS.js +184 -0
- package/vendor/framey/dist/history-ENGZEVFT.js +471 -0
- package/vendor/framey/dist/hyperframe.manifest.json +22 -0
- package/vendor/framey/dist/hyperframe.runtime.iife.js +1132 -0
- package/vendor/framey/dist/hyperframes-player.global.js +478 -0
- package/vendor/framey/dist/hyperframes-slideshow.global.js +148 -0
- package/vendor/framey/dist/info-WPCJHBMU.js +182 -0
- package/vendor/framey/dist/init-G4WGLYGD.js +1176 -0
- package/vendor/framey/dist/inspect-5IQ6CNEQ.js +106 -0
- package/vendor/framey/dist/installer-ML4HWUV7.js +40 -0
- package/vendor/framey/dist/keyframes-Q6XJO7VW.js +2755 -0
- package/vendor/framey/dist/lambda-A7JC74JF.js +468 -0
- package/vendor/framey/dist/layout-YET6XNXA.js +95 -0
- package/vendor/framey/dist/lint-I7FZN2VJ.js +162 -0
- package/vendor/framey/dist/lintProject-PDB3UN72.js +30 -0
- package/vendor/framey/dist/manager-CD6LJ7ZN.js +45 -0
- package/vendor/framey/dist/manager-WA4F2GST.js +67 -0
- package/vendor/framey/dist/media-treatment-BXYS4WVA.js +1030 -0
- package/vendor/framey/dist/media-use-LWH3MANK.js +113 -0
- package/vendor/framey/dist/models-K363FYM4.js +195 -0
- package/vendor/framey/dist/motionShot-GPAVWXLH.js +640 -0
- package/vendor/framey/dist/normalize-FASIPBUM.js +24 -0
- package/vendor/framey/dist/normalize-audio-VDWYRHN6.js +268 -0
- package/vendor/framey/dist/open-E3TB6P6J.js +128 -0
- package/vendor/framey/dist/parakeetRunner-UP34UOI2.js +58 -0
- package/vendor/framey/dist/pipeline-VXIUYEBU.js +64 -0
- package/vendor/framey/dist/play-BUTDQ4DV.js +353 -0
- package/vendor/framey/dist/policies-OLDYGFK5.js +309 -0
- package/vendor/framey/dist/preflight-2KZ2GWAZ.js +55 -0
- package/vendor/framey/dist/present-GXYSM7NX.js +353 -0
- package/vendor/framey/dist/preview-EKZ33JOJ.js +1910 -0
- package/vendor/framey/dist/producer-SKU5EV3J.js +13 -0
- package/vendor/framey/dist/progress-ZWB4Z4ET.js +76 -0
- package/vendor/framey/dist/projectConfig-3MZAYVTS.js +60 -0
- package/vendor/framey/dist/publication-DTKWNF74.js +33 -0
- package/vendor/framey/dist/remove-background-OY5L7XN2.js +265 -0
- package/vendor/framey/dist/render-CDV4GDFX.js +187 -0
- package/vendor/framey/dist/render-YE5YAMOD.js +2620 -0
- package/vendor/framey/dist/render-batch-ZAMFPCLL.js +274 -0
- package/vendor/framey/dist/renderSetupWorker.js +120 -0
- package/vendor/framey/dist/resolver-D5BIPSEW.js +42 -0
- package/vendor/framey/dist/runtimeVersion.js +18 -0
- package/vendor/framey/dist/sam-WFZXI4F7.js +23 -0
- package/vendor/framey/dist/shaderTransitionWorker.js +44 -0
- package/vendor/framey/dist/sherpa-RQWLV7I3.js +79 -0
- package/vendor/framey/dist/sherpaWorker.js +84 -0
- package/vendor/framey/dist/sites-AMOVABTK.js +54 -0
- package/vendor/framey/dist/skill-ZHVLH7KX.js +15 -0
- package/vendor/framey/dist/slideshow-SJGK4RQS.js +24 -0
- package/vendor/framey/dist/snapshot-TUXL6LBQ.js +1515 -0
- package/vendor/framey/dist/src-JHQGB2S6.js +215 -0
- package/vendor/framey/dist/src-Z5PGEMXB.js +532 -0
- package/vendor/framey/dist/state-B6H3WHCF.js +28 -0
- package/vendor/framey/dist/staticProjectServer-DFVZOUGI.js +63 -0
- package/vendor/framey/dist/studio/assets/hyperframes-player-DLaKjw0L.js +478 -0
- package/vendor/framey/dist/studio/assets/index-BX3KHhGX.js +71 -0
- package/vendor/framey/dist/studio/assets/index-CYbvOVp-.css +1 -0
- package/vendor/framey/dist/studio/assets/index-Dp3QEUGL.js +402 -0
- package/vendor/framey/dist/studio/assets/index-qrTAXbqc.js +531 -0
- package/vendor/framey/dist/studio/favicon.svg +14 -0
- package/vendor/framey/dist/studio/icons/timeline/audio.svg +7 -0
- package/vendor/framey/dist/studio/icons/timeline/captions.svg +5 -0
- package/vendor/framey/dist/studio/icons/timeline/composition.svg +12 -0
- package/vendor/framey/dist/studio/icons/timeline/image.svg +18 -0
- package/vendor/framey/dist/studio/icons/timeline/music.svg +10 -0
- package/vendor/framey/dist/studio/icons/timeline/text.svg +3 -0
- package/vendor/framey/dist/studio/index.html +23 -0
- package/vendor/framey/dist/studio-api-2NECGRMB.js +179 -0
- package/vendor/framey/dist/studioSelectionClient-IUUPKUHZ.js +25 -0
- package/vendor/framey/dist/studioServer-N2OPUMOQ.js +1569 -0
- package/vendor/framey/dist/synthesize-PKTB5ATG.js +183 -0
- package/vendor/framey/dist/system-7F3UEHQT.js +27 -0
- package/vendor/framey/dist/telemetry-DQGPEKM6.js +145 -0
- package/vendor/framey/dist/telemetry-UN55N6U6.js +77 -0
- package/vendor/framey/dist/timeline-LHUUMK63.js +1295 -0
- package/vendor/framey/dist/tokens-OLECWDFK.js +92 -0
- package/vendor/framey/dist/transcribe-O7HQKMIV.js +331 -0
- package/vendor/framey/dist/transcribe-UJESPBT5.js +76 -0
- package/vendor/framey/dist/tts-YCCQHZD4.js +234 -0
- package/vendor/framey/dist/urlDownloader-H2LXLG4U.js +48 -0
- package/vendor/framey/dist/usage-HG4WMM7A.js +2167 -0
- package/vendor/framey/dist/validate-F2XMN6EV.js +87 -0
- package/vendor/framey/dist/vendor/npm/gsap@3.15.0/GSAP-LICENSE.txt +8 -0
- package/vendor/framey/dist/vendor/npm/gsap@3.15.0/dist/CustomEase.min.js +11 -0
- package/vendor/framey/dist/vendor/npm/gsap@3.15.0/dist/MotionPathPlugin.min.js +11 -0
- package/vendor/framey/dist/vendor/npm/gsap@3.15.0/dist/gsap.min.js +11 -0
- package/vendor/framey/dist/warmCheck.js +220 -0
- package/vendor/framey/dist/warmCheckClient.js +139 -0
- package/vendor/framey/dist/workspaceBuildCheck-XYD2YTFW.js +133 -0
- package/vendor/framey-player/LICENSE +190 -0
- package/vendor/framey-player/NOTICE +16 -0
- package/vendor/framey-player/SOURCE.json +6 -0
- package/vendor/framey-player/hyperframes-player.global.js +478 -0
- package/vendor/framey.pin +1 -0
- 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
|
+
};
|