@vfrey/vfrey 0.0.1 → 1.0.0-beta.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (610) hide show
  1. package/LICENSE +33 -0
  2. package/README.md +78 -3
  3. package/accounts.example.json +61 -0
  4. package/accounts.first-run.json +41 -0
  5. package/bin/vfrey.mjs +36 -0
  6. package/integration-tools/README.md +43 -0
  7. package/integration-tools/image/pillow.md +32 -0
  8. package/integration-tools/image/playwright.md +33 -0
  9. package/integration-tools/image/resvg.md +36 -0
  10. package/integration-tools/image/satori.md +36 -0
  11. package/integration-tools/image/sharp.md +38 -0
  12. package/integration-tools/video/blender.md +34 -0
  13. package/integration-tools/video/ffmpeg.md +41 -0
  14. package/integration-tools/video/manim.md +37 -0
  15. package/integration-tools/video/motion-canvas.md +37 -0
  16. package/integration-tools/video/remotion.md +50 -0
  17. package/integration-tools/video/revideo.md +32 -0
  18. package/package.json +74 -6
  19. package/skills/vfrey-orchestrator/SKILL.md +15 -0
  20. package/skills/vfrey-orchestrator/channel-video/SKILL.md +41 -0
  21. package/skills/vfrey-product/SKILL.md +63 -0
  22. package/skills/vfrey-product/examples/concurrency-vs-parallelism/framey/cook-one.svg +14 -0
  23. package/skills/vfrey-product/examples/concurrency-vs-parallelism/framey/cook-two.svg +22 -0
  24. package/skills/vfrey-product/examples/concurrency-vs-parallelism/framey/index.html +70 -0
  25. package/skills/vfrey-product/examples/concurrency-vs-parallelism/remotion/cook-one.svg +14 -0
  26. package/skills/vfrey-product/examples/concurrency-vs-parallelism/remotion/cook-two.svg +22 -0
  27. package/skills/vfrey-product/examples/concurrency-vs-parallelism/remotion/index.tsx +49 -0
  28. package/skills/vfrey-product/examples/concurrency-vs-parallelism/script.json +15 -0
  29. package/skills/vfrey-product/examples/octopus-facts/index.html +60 -0
  30. package/skills/vfrey-product/examples/octopus-facts/octopus.svg +8 -0
  31. package/skills/vfrey-product/examples/octopus-facts/script.json +14 -0
  32. package/skills/vfrey-product/push/SKILL.md +15 -0
  33. package/skills/vfrey-product/scenes/NOTICE +5 -0
  34. package/skills/vfrey-product/scenes/blocks.md +57 -0
  35. package/skills/vfrey-product/scenes/craft.md +118 -0
  36. package/skills/vfrey-product/scenes/motion.md +88 -0
  37. package/src/analytics/dashboard.ts +109 -0
  38. package/src/analytics/index.ts +260 -0
  39. package/src/api/client.ts +361 -0
  40. package/src/api/cloud-files.ts +197 -0
  41. package/src/api/cloud-runs.ts +75 -0
  42. package/src/api/cloud.ts +413 -0
  43. package/src/api/commands.ts +330 -0
  44. package/src/api/config.ts +34 -0
  45. package/src/api/creators.ts +463 -0
  46. package/src/api/credentials.ts +152 -0
  47. package/src/api/mail.ts +333 -0
  48. package/src/api/topics.ts +207 -0
  49. package/src/api/types.ts +273 -0
  50. package/src/cli.ts +468 -0
  51. package/src/cloud/bundle.ts +70 -0
  52. package/src/cloud/cloudrun-executor.ts +237 -0
  53. package/src/cloud/executor.ts +281 -0
  54. package/src/cloud/gcs-sign.ts +76 -0
  55. package/src/cloud/job.ts +106 -0
  56. package/src/cloud/remote-job.ts +67 -0
  57. package/src/cloud/render-job.ts +191 -0
  58. package/src/config.ts +309 -0
  59. package/src/dashboard-link.ts +180 -0
  60. package/src/dashboard-start.ts +103 -0
  61. package/src/desk/channel.ts +64 -0
  62. package/src/desk/cli.ts +216 -0
  63. package/src/desk/creators-route.ts +129 -0
  64. package/src/desk/fonts/JetBrainsMono-OFL.txt +93 -0
  65. package/src/desk/fonts/google-sans-flex-latin.woff2 +0 -0
  66. package/src/desk/fonts/jetbrains-mono-medium.woff2 +0 -0
  67. package/src/desk/http.ts +460 -0
  68. package/src/desk/mail-route.ts +103 -0
  69. package/src/desk/overlay.ts +112 -0
  70. package/src/desk/preview.ts +422 -0
  71. package/src/desk/screens.ts +149 -0
  72. package/src/desk/secrets.ts +143 -0
  73. package/src/desk/series.ts +127 -0
  74. package/src/desk/state.ts +77 -0
  75. package/src/desk/studio-route.ts +119 -0
  76. package/src/desk/tick-runner.ts +66 -0
  77. package/src/desk/tick.ts +56 -0
  78. package/src/desk/topics-route.ts +41 -0
  79. package/src/desk/ui/app.css +505 -0
  80. package/src/desk/ui/app.js +185 -0
  81. package/src/desk/ui/apple-icon.png +0 -0
  82. package/src/desk/ui/components.js +79 -0
  83. package/src/desk/ui/core.js +156 -0
  84. package/src/desk/ui/favicon.ico +0 -0
  85. package/src/desk/ui/icon.svg +1 -0
  86. package/src/desk/ui/icons.js +49 -0
  87. package/src/desk/ui/index.html +41 -0
  88. package/src/desk/ui/metrics-math.d.ts +22 -0
  89. package/src/desk/ui/metrics-math.js +135 -0
  90. package/src/desk/ui/theme.js +5 -0
  91. package/src/desk/ui/views-creators.js +209 -0
  92. package/src/desk/ui/views-keys.js +114 -0
  93. package/src/desk/ui/views-mail.js +188 -0
  94. package/src/desk/ui/views-misc.js +123 -0
  95. package/src/desk/ui/views-review.js +119 -0
  96. package/src/desk/ui/views-runs.js +350 -0
  97. package/src/desk/ui/views-screens.js +163 -0
  98. package/src/desk/ui/views-series.js +318 -0
  99. package/src/desk/ui/views-topics.js +87 -0
  100. package/src/desk/verbs.ts +361 -0
  101. package/src/doctor.ts +212 -0
  102. package/src/drain.ts +14 -0
  103. package/src/engage/index.ts +217 -0
  104. package/src/generate/index.ts +110 -0
  105. package/src/generate/script.ts +152 -0
  106. package/src/generate/title.ts +78 -0
  107. package/src/help.ts +252 -0
  108. package/src/home.ts +45 -0
  109. package/src/llm/client.ts +177 -0
  110. package/src/log.ts +7 -0
  111. package/src/oauth/tokens.ts +189 -0
  112. package/src/oauth/vault.ts +72 -0
  113. package/src/pipeline/review.ts +642 -0
  114. package/src/pipeline/run.ts +443 -0
  115. package/src/pipeline/series-guard.ts +26 -0
  116. package/src/pipeline/source-fetch.ts +69 -0
  117. package/src/pipeline/stages.ts +728 -0
  118. package/src/pipeline/topics-source.ts +90 -0
  119. package/src/product/commands.ts +296 -0
  120. package/src/product/config-file.ts +38 -0
  121. package/src/product/engine-choice.ts +89 -0
  122. package/src/product/engines.ts +103 -0
  123. package/src/product/insights.ts +50 -0
  124. package/src/product/keys.ts +67 -0
  125. package/src/product/paths.ts +18 -0
  126. package/src/product/probes.ts +88 -0
  127. package/src/product/push-flow.ts +90 -0
  128. package/src/product/render-video.ts +21 -0
  129. package/src/product/short.ts +62 -0
  130. package/src/product/update.ts +32 -0
  131. package/src/project/canonical.ts +14 -0
  132. package/src/project/commands.ts +177 -0
  133. package/src/project/dashboard-status.ts +28 -0
  134. package/src/project/discover.ts +19 -0
  135. package/src/project/index-file.ts +73 -0
  136. package/src/project/marker.ts +92 -0
  137. package/src/project/migrate.ts +201 -0
  138. package/src/project/names.ts +27 -0
  139. package/src/project/notice.ts +16 -0
  140. package/src/project/open.ts +88 -0
  141. package/src/project/scaffold.ts +112 -0
  142. package/src/project/templates.ts +42 -0
  143. package/src/project/videos.ts +64 -0
  144. package/src/publish/facebook.ts +91 -0
  145. package/src/publish/index.ts +12 -0
  146. package/src/publish/instagram.ts +97 -0
  147. package/src/publish/rate.ts +62 -0
  148. package/src/publish/session.ts +242 -0
  149. package/src/publish/tiktok.ts +202 -0
  150. package/src/publish/youtube.ts +177 -0
  151. package/src/queue/desk-ops.ts +1170 -0
  152. package/src/queue/seal.ts +3 -0
  153. package/src/queue/store.ts +1006 -0
  154. package/src/remotion/AiLabel.tsx +26 -0
  155. package/src/remotion/Root.tsx +73 -0
  156. package/src/remotion/defaults.ts +26 -0
  157. package/src/remotion/films/claude/ClaudeFilm.tsx +1014 -0
  158. package/src/remotion/films/engine/EngineMark.tsx +17 -0
  159. package/src/remotion/films/rea/ReaShort.tsx +552 -0
  160. package/src/remotion/films/rea/drawings.tsx +907 -0
  161. package/src/remotion/films/rea/timing.ts +144 -0
  162. package/src/remotion/index.ts +4 -0
  163. package/src/remotion/templates/EditorialSplit.tsx +39 -0
  164. package/src/remotion/templates/KineticType.tsx +39 -0
  165. package/src/remotion/templates/SignalBoard.tsx +50 -0
  166. package/src/remotion/timing.ts +22 -0
  167. package/src/render/chrome.ts +78 -0
  168. package/src/render/engine-mark.ts +29 -0
  169. package/src/render/framey-template.ts +130 -0
  170. package/src/render/html-engine.ts +149 -0
  171. package/src/render/node-crypto-stub.ts +11 -0
  172. package/src/render/probe.ts +29 -0
  173. package/src/render/props.ts +17 -0
  174. package/src/render/vertical-short.ts +35 -0
  175. package/src/render/webpack.ts +33 -0
  176. package/src/render/worker.ts +65 -0
  177. package/src/scene/assets/fonts/TitanOne-OFL.txt +94 -0
  178. package/src/scene/assets/fonts/titan-one.woff2 +0 -0
  179. package/src/scene/assets/gsap/LICENSE.txt +8 -0
  180. package/src/scene/assets/gsap/gsap.min.js +11 -0
  181. package/src/scene/audio.ts +54 -0
  182. package/src/scene/blocks/LICENSE +190 -0
  183. package/src/scene/blocks/NOTICE +5 -0
  184. package/src/scene/blocks/bar-chart-race/bar-chart-race.html +585 -0
  185. package/src/scene/blocks/beat-freeze-cut/beat-freeze-cut.html +874 -0
  186. package/src/scene/blocks/camcorder-hud/camcorder-hud.html +164 -0
  187. package/src/scene/blocks/camera-dolly-zoom/camera-dolly-zoom.html +355 -0
  188. package/src/scene/blocks/code-diff/code-diff.html +817 -0
  189. package/src/scene/blocks/code-snippet-apple-terminal-pro/code-snippet-apple-terminal-pro.html +248 -0
  190. package/src/scene/blocks/code-typing/code-typing.html +764 -0
  191. package/src/scene/blocks/data-chart/data-chart.html +452 -0
  192. package/src/scene/blocks/flowchart-vertical/flowchart-vertical.html +454 -0
  193. package/src/scene/blocks/hw-scribble-transition/hw-scribble-transition.html +153 -0
  194. package/src/scene/blocks/index.json +824 -0
  195. package/src/scene/blocks/lt-accent-underline/lt-accent-underline.html +107 -0
  196. package/src/scene/blocks/lt-bold-block/lt-bold-block.html +109 -0
  197. package/src/scene/blocks/lt-clean-bar/lt-clean-bar.html +112 -0
  198. package/src/scene/blocks/lt-dark-card/lt-dark-card.html +111 -0
  199. package/src/scene/blocks/lt-kicker-name/lt-kicker-name.html +114 -0
  200. package/src/scene/blocks/lt-mask-reveal/lt-mask-reveal.html +120 -0
  201. package/src/scene/blocks/lt-neon-border/lt-neon-border.html +391 -0
  202. package/src/scene/blocks/lt-stack-bars/lt-stack-bars.html +109 -0
  203. package/src/scene/blocks/macos-notification/macos-notification.html +194 -0
  204. package/src/scene/blocks/mk-background/mk-background.html +236 -0
  205. package/src/scene/blocks/mk-callout-highlight/mk-callout-highlight.html +183 -0
  206. package/src/scene/blocks/mk-clone-wall-transition/mk-clone-wall-transition.html +226 -0
  207. package/src/scene/blocks/mk-line-graph/mk-line-graph.html +293 -0
  208. package/src/scene/blocks/mk-progress-stat/mk-progress-stat.html +186 -0
  209. package/src/scene/blocks/mk-specs-list/mk-specs-list.html +223 -0
  210. package/src/scene/blocks/news-ticker/news-ticker.html +409 -0
  211. package/src/scene/blocks/organic-light-leak-overlay/organic-light-leak-overlay.html +126 -0
  212. package/src/scene/blocks/oscilloscope-trace/oscilloscope-trace.html +519 -0
  213. package/src/scene/blocks/snow/snow.html +205 -0
  214. package/src/scene/blocks/split-flap-board/split-flap-board.html +347 -0
  215. package/src/scene/blocks/spotify-card/spotify-card.html +294 -0
  216. package/src/scene/blocks/starfield/starfield.html +188 -0
  217. package/src/scene/blocks/thread-message-stack/thread-message-stack.html +239 -0
  218. package/src/scene/blocks/week-in-merges/week-in-merges.html +470 -0
  219. package/src/scene/blocks/x-post/x-post.html +437 -0
  220. package/src/scene/blocks/yt-comment-card/yt-comment-card.html +319 -0
  221. package/src/scene/blocks/yt-lcd-background/yt-lcd-background.html +307 -0
  222. package/src/scene/blocks/yt-prism-title/yt-prism-title.html +205 -0
  223. package/src/scene/blocks.ts +229 -0
  224. package/src/scene/command.ts +272 -0
  225. package/src/scene/figure.ts +181 -0
  226. package/src/scene/glyphs.ts +107 -0
  227. package/src/scene/init.ts +86 -0
  228. package/src/scene/inspect/css-tree.d.ts +6 -0
  229. package/src/scene/inspect/page-scripts.ts +272 -0
  230. package/src/scene/inspect/report.ts +405 -0
  231. package/src/scene/inspect/run.ts +200 -0
  232. package/src/scene/inspect/source.ts +236 -0
  233. package/src/scene/label.ts +131 -0
  234. package/src/scene/net-guard.ts +74 -0
  235. package/src/scene/render.ts +292 -0
  236. package/src/scene/runtime/browser.ts +199 -0
  237. package/src/scene/runtime/core.ts +181 -0
  238. package/src/scene/runtime/react.tsx +115 -0
  239. package/src/scene/runtime/transitions.ts +133 -0
  240. package/src/scene/sanitize.ts +181 -0
  241. package/src/scene/scene.ts +152 -0
  242. package/src/scene/studio-command.ts +48 -0
  243. package/src/scene/studio-skin.ts +59 -0
  244. package/src/scene/studio.ts +337 -0
  245. package/src/scene/supply.ts +111 -0
  246. package/src/scene/timing.ts +288 -0
  247. package/src/scene/transitions/LICENSE +190 -0
  248. package/src/scene/transitions/NOTICE +5 -0
  249. package/src/scene/transitions/SOURCE.json +24 -0
  250. package/src/scene/transitions/transitions.global.js +38 -0
  251. package/src/scene/transitions.ts +26 -0
  252. package/src/service/all-projects.ts +153 -0
  253. package/src/service/commands.ts +256 -0
  254. package/src/service/due.ts +82 -0
  255. package/src/service/lock.ts +101 -0
  256. package/src/service/log-file.ts +56 -0
  257. package/src/service/state.ts +41 -0
  258. package/src/service/units.ts +90 -0
  259. package/src/service/worker.ts +51 -0
  260. package/src/skill-agents.ts +74 -0
  261. package/src/skill-install.ts +334 -0
  262. package/src/sync-write.ts +21 -0
  263. package/src/tick-report.ts +205 -0
  264. package/src/tts.ts +124 -0
  265. package/vendor/@vfrey/contracts/dist/account.d.ts +97 -0
  266. package/vendor/@vfrey/contracts/dist/account.js +27 -0
  267. package/vendor/@vfrey/contracts/dist/checks.d.ts +8 -0
  268. package/vendor/@vfrey/contracts/dist/checks.js +1 -0
  269. package/vendor/@vfrey/contracts/dist/credentials/crypto.d.ts +4 -0
  270. package/vendor/@vfrey/contracts/dist/credentials/crypto.js +38 -0
  271. package/vendor/@vfrey/contracts/dist/domain/advice-persona.d.ts +10 -0
  272. package/vendor/@vfrey/contracts/dist/domain/advice-persona.js +24 -0
  273. package/vendor/@vfrey/contracts/dist/domain/backoff.d.ts +13 -0
  274. package/vendor/@vfrey/contracts/dist/domain/backoff.js +27 -0
  275. package/vendor/@vfrey/contracts/dist/domain/cadence.d.ts +29 -0
  276. package/vendor/@vfrey/contracts/dist/domain/cadence.js +95 -0
  277. package/vendor/@vfrey/contracts/dist/domain/creators.d.ts +146 -0
  278. package/vendor/@vfrey/contracts/dist/domain/creators.js +2 -0
  279. package/vendor/@vfrey/contracts/dist/domain/disclosure.d.ts +127 -0
  280. package/vendor/@vfrey/contracts/dist/domain/disclosure.js +250 -0
  281. package/vendor/@vfrey/contracts/dist/domain/errors.d.ts +34 -0
  282. package/vendor/@vfrey/contracts/dist/domain/errors.js +68 -0
  283. package/vendor/@vfrey/contracts/dist/domain/redact.d.ts +1 -0
  284. package/vendor/@vfrey/contracts/dist/domain/redact.js +21 -0
  285. package/vendor/@vfrey/contracts/dist/domain/revenue.d.ts +13 -0
  286. package/vendor/@vfrey/contracts/dist/domain/revenue.js +16 -0
  287. package/vendor/@vfrey/contracts/dist/domain/safety.d.ts +20 -0
  288. package/vendor/@vfrey/contracts/dist/domain/safety.js +61 -0
  289. package/vendor/@vfrey/contracts/dist/domain/similarity.d.ts +13 -0
  290. package/vendor/@vfrey/contracts/dist/domain/similarity.js +100 -0
  291. package/vendor/@vfrey/contracts/dist/domain/templates.d.ts +18 -0
  292. package/vendor/@vfrey/contracts/dist/domain/templates.js +67 -0
  293. package/vendor/@vfrey/contracts/dist/domain/tiktok-chunks.d.ts +19 -0
  294. package/vendor/@vfrey/contracts/dist/domain/tiktok-chunks.js +52 -0
  295. package/vendor/@vfrey/contracts/dist/domain/topics.d.ts +78 -0
  296. package/vendor/@vfrey/contracts/dist/domain/topics.js +4 -0
  297. package/vendor/@vfrey/contracts/dist/domain/types.d.ts +216 -0
  298. package/vendor/@vfrey/contracts/dist/domain/types.js +1 -0
  299. package/vendor/@vfrey/contracts/dist/domain/variation.d.ts +57 -0
  300. package/vendor/@vfrey/contracts/dist/domain/variation.js +278 -0
  301. package/vendor/@vfrey/contracts/dist/events.d.ts +20 -0
  302. package/vendor/@vfrey/contracts/dist/events.js +1 -0
  303. package/vendor/@vfrey/contracts/dist/http.d.ts +11 -0
  304. package/vendor/@vfrey/contracts/dist/http.js +37 -0
  305. package/vendor/@vfrey/contracts/dist/index.d.ts +22 -0
  306. package/vendor/@vfrey/contracts/dist/index.js +22 -0
  307. package/vendor/@vfrey/contracts/dist/log.d.ts +2 -0
  308. package/vendor/@vfrey/contracts/dist/log.js +10 -0
  309. package/vendor/@vfrey/contracts/dist/mail.d.ts +55 -0
  310. package/vendor/@vfrey/contracts/dist/mail.js +1 -0
  311. package/vendor/@vfrey/contracts/package.json +18 -0
  312. package/vendor/@vfrey/ingest/dist/index.d.ts +41 -0
  313. package/vendor/@vfrey/ingest/dist/index.js +221 -0
  314. package/vendor/@vfrey/ingest/dist/parse.d.ts +5 -0
  315. package/vendor/@vfrey/ingest/dist/parse.js +165 -0
  316. package/vendor/@vfrey/ingest/package.json +21 -0
  317. package/vendor/framey/LICENSE +190 -0
  318. package/vendor/framey/NOTICE +15 -0
  319. package/vendor/framey/SOURCE.json +24 -0
  320. package/vendor/framey/STUDIO-SOURCE.json +9 -0
  321. package/vendor/framey/bin/framey-localize-fonts.mjs +12 -0
  322. package/vendor/framey/bin/framey.mjs +16 -0
  323. package/vendor/framey/dist/add-VMJD5KBS.js +75 -0
  324. package/vendor/framey/dist/animatedGifPrep-QPKGJ6PM.js +43 -0
  325. package/vendor/framey/dist/api.d.ts +211 -0
  326. package/vendor/framey/dist/api.js +76 -0
  327. package/vendor/framey/dist/appHistory-WW56FZTT.js +31 -0
  328. package/vendor/framey/dist/asset-WQKGOELE.js +26 -0
  329. package/vendor/framey/dist/audio-RSJWVWRA.js +1936 -0
  330. package/vendor/framey/dist/batchRender-3HPICDCT.js +366 -0
  331. package/vendor/framey/dist/beats-HL2BDUZI.js +273 -0
  332. package/vendor/framey/dist/benchmark-RWCWHI5Z.js +230 -0
  333. package/vendor/framey/dist/browser-ECYET3Q2.js +206 -0
  334. package/vendor/framey/dist/bundleWithLocalizedFonts-ALYBQEQT.js +52 -0
  335. package/vendor/framey/dist/captureCompositionFrame-4DA6SEH2.js +94 -0
  336. package/vendor/framey/dist/catalog-5JVDEUWK.js +979 -0
  337. package/vendor/framey/dist/catch-up-NEBCL5NO.js +106 -0
  338. package/vendor/framey/dist/check-F5N544ML.js +111 -0
  339. package/vendor/framey/dist/checkBrowser-LZ66CMJG.js +110 -0
  340. package/vendor/framey/dist/chunk-2K7Z2HVP.js +372 -0
  341. package/vendor/framey/dist/chunk-2UZQHDM7.js +323 -0
  342. package/vendor/framey/dist/chunk-2X4PQEYM.js +34 -0
  343. package/vendor/framey/dist/chunk-3422KMTD.js +168 -0
  344. package/vendor/framey/dist/chunk-3FYD4YEK.js +72 -0
  345. package/vendor/framey/dist/chunk-3GXQPCJC.js +682 -0
  346. package/vendor/framey/dist/chunk-3LM6YPBR.js +179 -0
  347. package/vendor/framey/dist/chunk-442JNXRM.js +20 -0
  348. package/vendor/framey/dist/chunk-4BNN5FGX.js +182 -0
  349. package/vendor/framey/dist/chunk-4P7NX5BM.js +11532 -0
  350. package/vendor/framey/dist/chunk-4UMPIPCQ.js +88 -0
  351. package/vendor/framey/dist/chunk-4YYJOFKS.js +28 -0
  352. package/vendor/framey/dist/chunk-54HJ63Q2.js +29 -0
  353. package/vendor/framey/dist/chunk-5ETJX6WM.js +89 -0
  354. package/vendor/framey/dist/chunk-5SG54JRS.js +68 -0
  355. package/vendor/framey/dist/chunk-634HSJ3J.js +58 -0
  356. package/vendor/framey/dist/chunk-66LREXGS.js +48 -0
  357. package/vendor/framey/dist/chunk-6BEFEWFB.js +25 -0
  358. package/vendor/framey/dist/chunk-6BNTGNGD.js +286 -0
  359. package/vendor/framey/dist/chunk-6DDPOHMK.js +140 -0
  360. package/vendor/framey/dist/chunk-6GV5XSOR.js +214 -0
  361. package/vendor/framey/dist/chunk-6JR2XUEE.js +127 -0
  362. package/vendor/framey/dist/chunk-73QVATIM.js +362 -0
  363. package/vendor/framey/dist/chunk-7FMUTGOH.js +279 -0
  364. package/vendor/framey/dist/chunk-7JQFJ6JJ.js +291 -0
  365. package/vendor/framey/dist/chunk-AHPGAESX.js +113 -0
  366. package/vendor/framey/dist/chunk-AHX34EFP.js +15 -0
  367. package/vendor/framey/dist/chunk-AJ5CSAEZ.js +487 -0
  368. package/vendor/framey/dist/chunk-B7RJV74O.js +5047 -0
  369. package/vendor/framey/dist/chunk-BL4U6U52.js +254 -0
  370. package/vendor/framey/dist/chunk-BSQ7XANM.js +210 -0
  371. package/vendor/framey/dist/chunk-BZ56MTDX.js +6 -0
  372. package/vendor/framey/dist/chunk-C5BO7PMT.js +282 -0
  373. package/vendor/framey/dist/chunk-CFUCHO4T.js +358 -0
  374. package/vendor/framey/dist/chunk-CZGHFATT.js +31 -0
  375. package/vendor/framey/dist/chunk-DLA44CMS.js +5649 -0
  376. package/vendor/framey/dist/chunk-DPVXBVLL.js +31292 -0
  377. package/vendor/framey/dist/chunk-DQBY7FRR.js +397 -0
  378. package/vendor/framey/dist/chunk-EAMLBAHA.js +154 -0
  379. package/vendor/framey/dist/chunk-EOVYQ3IG.js +143 -0
  380. package/vendor/framey/dist/chunk-EVMY7IPL.js +612 -0
  381. package/vendor/framey/dist/chunk-FG4BBFZI.js +122 -0
  382. package/vendor/framey/dist/chunk-FI4I7CME.js +56 -0
  383. package/vendor/framey/dist/chunk-FLREUEHW.js +2081 -0
  384. package/vendor/framey/dist/chunk-FUFP7A7S.js +1126 -0
  385. package/vendor/framey/dist/chunk-FV3PIKGH.js +56 -0
  386. package/vendor/framey/dist/chunk-FXMKHHPO.js +123 -0
  387. package/vendor/framey/dist/chunk-GGZAM5VH.js +1187 -0
  388. package/vendor/framey/dist/chunk-GKZEVJIB.js +39 -0
  389. package/vendor/framey/dist/chunk-GMECXFAN.js +57 -0
  390. package/vendor/framey/dist/chunk-GNEFDLFB.js +621 -0
  391. package/vendor/framey/dist/chunk-GPMLSOEG.js +19274 -0
  392. package/vendor/framey/dist/chunk-GPYVT5EE.js +59 -0
  393. package/vendor/framey/dist/chunk-H6IEMZEV.js +40 -0
  394. package/vendor/framey/dist/chunk-HEFQCIXR.js +170 -0
  395. package/vendor/framey/dist/chunk-HFQ4CWHA.js +118 -0
  396. package/vendor/framey/dist/chunk-HPDTCOKE.js +304 -0
  397. package/vendor/framey/dist/chunk-HTUHQKDB.js +548 -0
  398. package/vendor/framey/dist/chunk-HU2SPFNG.js +103 -0
  399. package/vendor/framey/dist/chunk-HVW7ABXD.js +19 -0
  400. package/vendor/framey/dist/chunk-IG7NDKXO.js +26 -0
  401. package/vendor/framey/dist/chunk-II3J3WXK.js +246 -0
  402. package/vendor/framey/dist/chunk-IR35BCLK.js +13 -0
  403. package/vendor/framey/dist/chunk-ISN5GRYI.js +20 -0
  404. package/vendor/framey/dist/chunk-IUONB55J.js +669 -0
  405. package/vendor/framey/dist/chunk-IVSUQR2B.js +161 -0
  406. package/vendor/framey/dist/chunk-IXU6PQSW.js +259 -0
  407. package/vendor/framey/dist/chunk-IZCW2NKT.js +29 -0
  408. package/vendor/framey/dist/chunk-JGXJU5PF.js +68 -0
  409. package/vendor/framey/dist/chunk-JHOCK3DG.js +27 -0
  410. package/vendor/framey/dist/chunk-JVBRJMOP.js +121 -0
  411. package/vendor/framey/dist/chunk-K4MJX7SR.js +17 -0
  412. package/vendor/framey/dist/chunk-K4WKGXRC.js +18 -0
  413. package/vendor/framey/dist/chunk-KGPLIH7B.js +127 -0
  414. package/vendor/framey/dist/chunk-KLIKCX6Q.js +63 -0
  415. package/vendor/framey/dist/chunk-KXTKKBOC.js +61 -0
  416. package/vendor/framey/dist/chunk-KZI44OPA.js +185 -0
  417. package/vendor/framey/dist/chunk-LEKZNRKI.js +45 -0
  418. package/vendor/framey/dist/chunk-LFGJWOVA.js +61 -0
  419. package/vendor/framey/dist/chunk-LLMSX6V6.js +17 -0
  420. package/vendor/framey/dist/chunk-LTGTN2TH.js +195 -0
  421. package/vendor/framey/dist/chunk-M2WBOQ2Q.js +54 -0
  422. package/vendor/framey/dist/chunk-MI5FTLYK.js +399 -0
  423. package/vendor/framey/dist/chunk-MLQP2QUF.js +1809 -0
  424. package/vendor/framey/dist/chunk-MMQ52NIZ.js +956 -0
  425. package/vendor/framey/dist/chunk-ND46XKK3.js +742 -0
  426. package/vendor/framey/dist/chunk-NYEXNSHM.js +504 -0
  427. package/vendor/framey/dist/chunk-O4YRB27L.js +57 -0
  428. package/vendor/framey/dist/chunk-O7BGSQ5F.js +92 -0
  429. package/vendor/framey/dist/chunk-OFQWTKPW.js +117 -0
  430. package/vendor/framey/dist/chunk-P5ZBLXJ6.js +91 -0
  431. package/vendor/framey/dist/chunk-P6LJ4Y32.js +4662 -0
  432. package/vendor/framey/dist/chunk-PKZ7RK5N.js +281 -0
  433. package/vendor/framey/dist/chunk-PURHAXFL.js +15 -0
  434. package/vendor/framey/dist/chunk-Q5X2B5WT.js +29 -0
  435. package/vendor/framey/dist/chunk-QAMKOG67.js +248 -0
  436. package/vendor/framey/dist/chunk-R6YBK4XX.js +514 -0
  437. package/vendor/framey/dist/chunk-RGLQURIX.js +2997 -0
  438. package/vendor/framey/dist/chunk-RNV3DM4S.js +3573 -0
  439. package/vendor/framey/dist/chunk-ROEW726S.js +4638 -0
  440. package/vendor/framey/dist/chunk-RQVDTPGD.js +6 -0
  441. package/vendor/framey/dist/chunk-RVZHGOGR.js +26 -0
  442. package/vendor/framey/dist/chunk-RXATE6FZ.js +385 -0
  443. package/vendor/framey/dist/chunk-S3S4TGEH.js +424 -0
  444. package/vendor/framey/dist/chunk-SDYDNHEE.js +11202 -0
  445. package/vendor/framey/dist/chunk-SSWBU67I.js +173 -0
  446. package/vendor/framey/dist/chunk-ST35C4K6.js +28 -0
  447. package/vendor/framey/dist/chunk-SZNTYTIV.js +990 -0
  448. package/vendor/framey/dist/chunk-T2EUWCJE.js +29 -0
  449. package/vendor/framey/dist/chunk-T6AGUTZJ.js +444 -0
  450. package/vendor/framey/dist/chunk-THJALHFJ.js +11131 -0
  451. package/vendor/framey/dist/chunk-TIQB63MX.js +18128 -0
  452. package/vendor/framey/dist/chunk-U242RTCT.js +134 -0
  453. package/vendor/framey/dist/chunk-UJZREAV6.js +3901 -0
  454. package/vendor/framey/dist/chunk-UMD3V7CU.js +264 -0
  455. package/vendor/framey/dist/chunk-UOFAE5RF.js +42 -0
  456. package/vendor/framey/dist/chunk-UTEIUGAZ.js +29 -0
  457. package/vendor/framey/dist/chunk-VAS6HQX3.js +138 -0
  458. package/vendor/framey/dist/chunk-VC76R6W2.js +27 -0
  459. package/vendor/framey/dist/chunk-VFZ7W5W7.js +226 -0
  460. package/vendor/framey/dist/chunk-VHNLZAE2.js +348 -0
  461. package/vendor/framey/dist/chunk-VMC4WSH5.js +278 -0
  462. package/vendor/framey/dist/chunk-VORQIH64.js +108 -0
  463. package/vendor/framey/dist/chunk-VTXFRIHO.js +186 -0
  464. package/vendor/framey/dist/chunk-W2LGJSEN.js +182 -0
  465. package/vendor/framey/dist/chunk-WKBM7NDG.js +32 -0
  466. package/vendor/framey/dist/chunk-WMQNIQDJ.js +2057 -0
  467. package/vendor/framey/dist/chunk-WN4XZC5F.js +504 -0
  468. package/vendor/framey/dist/chunk-WQ6ZXHFQ.js +133 -0
  469. package/vendor/framey/dist/chunk-X7HBSTCZ.js +53 -0
  470. package/vendor/framey/dist/chunk-X7MTZ4T2.js +6 -0
  471. package/vendor/framey/dist/chunk-XPTOJZJF.js +308 -0
  472. package/vendor/framey/dist/chunk-XT6MXC7A.js +6 -0
  473. package/vendor/framey/dist/chunk-XT7X6QCP.js +6 -0
  474. package/vendor/framey/dist/chunk-XTMDWNEC.js +2820 -0
  475. package/vendor/framey/dist/chunk-XUHOIDKG.js +6 -0
  476. package/vendor/framey/dist/chunk-XX7LTW5Y.js +138 -0
  477. package/vendor/framey/dist/chunk-Y3YGTZEG.js +382 -0
  478. package/vendor/framey/dist/chunk-Y5SBSGN7.js +346 -0
  479. package/vendor/framey/dist/chunk-YCMVI4MZ.js +625 -0
  480. package/vendor/framey/dist/chunk-YOR4CTCE.js +261 -0
  481. package/vendor/framey/dist/chunk-YPRBGITP.js +2748 -0
  482. package/vendor/framey/dist/chunk-ZKDMAOFU.js +32 -0
  483. package/vendor/framey/dist/chunk-ZW6DURPF.js +1318 -0
  484. package/vendor/framey/dist/clean-ZJOGDKDM.js +336 -0
  485. package/vendor/framey/dist/cli.js +439 -0
  486. package/vendor/framey/dist/cloudrun-HGJ3B6ZV.js +767 -0
  487. package/vendor/framey/dist/commands/contrast-audit.browser.js +643 -0
  488. package/vendor/framey/dist/commands/layout-audit.browser.js +2914 -0
  489. package/vendor/framey/dist/commands/motion-sample.browser.js +74 -0
  490. package/vendor/framey/dist/commands/motion-signature.browser.js +475 -0
  491. package/vendor/framey/dist/compare-W7UY3BAZ.js +463 -0
  492. package/vendor/framey/dist/compiler-TM3W6GYF.js +136 -0
  493. package/vendor/framey/dist/component-QF5VGYMU.js +176 -0
  494. package/vendor/framey/dist/compositions-XT3PMNDF.js +238 -0
  495. package/vendor/framey/dist/contactSheet-7W6GYHBQ.js +24 -0
  496. package/vendor/framey/dist/deploy-6FJPWKF2.js +299 -0
  497. package/vendor/framey/dist/destroy-HE2RIPKZ.js +57 -0
  498. package/vendor/framey/dist/deterministicFonts-RADD3BSX.js +50 -0
  499. package/vendor/framey/dist/dist-4S2FGGVY.js +422 -0
  500. package/vendor/framey/dist/dist-BE4B2EZE.js +32 -0
  501. package/vendor/framey/dist/dist-EWXJGN63.js +129 -0
  502. package/vendor/framey/dist/docs-VKIRFEEX.js +131 -0
  503. package/vendor/framey/dist/doctor-2UNJ2G7U.js +74 -0
  504. package/vendor/framey/dist/dom-37K6YOH4.js +14 -0
  505. package/vendor/framey/dist/dotEnv-7PZQTVIM.js +54 -0
  506. package/vendor/framey/dist/events-ACY3P2PA.js +76 -0
  507. package/vendor/framey/dist/events-IHB3B2MK.js +69 -0
  508. package/vendor/framey/dist/ffmpeg-DR5LGGSK.js +63 -0
  509. package/vendor/framey/dist/figma-BODVUPHB.js +63 -0
  510. package/vendor/framey/dist/fontData.generated-NXAOI4GH.js +13 -0
  511. package/vendor/framey/dist/fontLocalizeCli.js +142 -0
  512. package/vendor/framey/dist/gpuPolicy-XLEXORZY.js +49 -0
  513. package/vendor/framey/dist/grade-compare-GAXFQ74C.js +661 -0
  514. package/vendor/framey/dist/gsapParser-IEUSLYDJ.js +2885 -0
  515. package/vendor/framey/dist/gsapParserAcorn-LZJKCFQI.js +30 -0
  516. package/vendor/framey/dist/help-VCB5X2HS.js +184 -0
  517. package/vendor/framey/dist/history-ENGZEVFT.js +471 -0
  518. package/vendor/framey/dist/hyperframe.manifest.json +22 -0
  519. package/vendor/framey/dist/hyperframe.runtime.iife.js +1132 -0
  520. package/vendor/framey/dist/hyperframes-player.global.js +478 -0
  521. package/vendor/framey/dist/hyperframes-slideshow.global.js +148 -0
  522. package/vendor/framey/dist/info-WPCJHBMU.js +182 -0
  523. package/vendor/framey/dist/init-G4WGLYGD.js +1176 -0
  524. package/vendor/framey/dist/inspect-5IQ6CNEQ.js +106 -0
  525. package/vendor/framey/dist/installer-ML4HWUV7.js +40 -0
  526. package/vendor/framey/dist/keyframes-Q6XJO7VW.js +2755 -0
  527. package/vendor/framey/dist/lambda-A7JC74JF.js +468 -0
  528. package/vendor/framey/dist/layout-YET6XNXA.js +95 -0
  529. package/vendor/framey/dist/lint-I7FZN2VJ.js +162 -0
  530. package/vendor/framey/dist/lintProject-PDB3UN72.js +30 -0
  531. package/vendor/framey/dist/manager-CD6LJ7ZN.js +45 -0
  532. package/vendor/framey/dist/manager-WA4F2GST.js +67 -0
  533. package/vendor/framey/dist/media-treatment-BXYS4WVA.js +1030 -0
  534. package/vendor/framey/dist/media-use-LWH3MANK.js +113 -0
  535. package/vendor/framey/dist/models-K363FYM4.js +195 -0
  536. package/vendor/framey/dist/motionShot-GPAVWXLH.js +640 -0
  537. package/vendor/framey/dist/normalize-FASIPBUM.js +24 -0
  538. package/vendor/framey/dist/normalize-audio-VDWYRHN6.js +268 -0
  539. package/vendor/framey/dist/open-E3TB6P6J.js +128 -0
  540. package/vendor/framey/dist/parakeetRunner-UP34UOI2.js +58 -0
  541. package/vendor/framey/dist/pipeline-VXIUYEBU.js +64 -0
  542. package/vendor/framey/dist/play-BUTDQ4DV.js +353 -0
  543. package/vendor/framey/dist/policies-OLDYGFK5.js +309 -0
  544. package/vendor/framey/dist/preflight-2KZ2GWAZ.js +55 -0
  545. package/vendor/framey/dist/present-GXYSM7NX.js +353 -0
  546. package/vendor/framey/dist/preview-EKZ33JOJ.js +1910 -0
  547. package/vendor/framey/dist/producer-SKU5EV3J.js +13 -0
  548. package/vendor/framey/dist/progress-ZWB4Z4ET.js +76 -0
  549. package/vendor/framey/dist/projectConfig-3MZAYVTS.js +60 -0
  550. package/vendor/framey/dist/publication-DTKWNF74.js +33 -0
  551. package/vendor/framey/dist/remove-background-OY5L7XN2.js +265 -0
  552. package/vendor/framey/dist/render-CDV4GDFX.js +187 -0
  553. package/vendor/framey/dist/render-YE5YAMOD.js +2620 -0
  554. package/vendor/framey/dist/render-batch-ZAMFPCLL.js +274 -0
  555. package/vendor/framey/dist/renderSetupWorker.js +120 -0
  556. package/vendor/framey/dist/resolver-D5BIPSEW.js +42 -0
  557. package/vendor/framey/dist/runtimeVersion.js +18 -0
  558. package/vendor/framey/dist/sam-WFZXI4F7.js +23 -0
  559. package/vendor/framey/dist/shaderTransitionWorker.js +44 -0
  560. package/vendor/framey/dist/sherpa-RQWLV7I3.js +79 -0
  561. package/vendor/framey/dist/sherpaWorker.js +84 -0
  562. package/vendor/framey/dist/sites-AMOVABTK.js +54 -0
  563. package/vendor/framey/dist/skill-ZHVLH7KX.js +15 -0
  564. package/vendor/framey/dist/slideshow-SJGK4RQS.js +24 -0
  565. package/vendor/framey/dist/snapshot-TUXL6LBQ.js +1515 -0
  566. package/vendor/framey/dist/src-JHQGB2S6.js +215 -0
  567. package/vendor/framey/dist/src-Z5PGEMXB.js +532 -0
  568. package/vendor/framey/dist/state-B6H3WHCF.js +28 -0
  569. package/vendor/framey/dist/staticProjectServer-DFVZOUGI.js +63 -0
  570. package/vendor/framey/dist/studio/assets/hyperframes-player-DLaKjw0L.js +478 -0
  571. package/vendor/framey/dist/studio/assets/index-BX3KHhGX.js +71 -0
  572. package/vendor/framey/dist/studio/assets/index-CYbvOVp-.css +1 -0
  573. package/vendor/framey/dist/studio/assets/index-Dp3QEUGL.js +402 -0
  574. package/vendor/framey/dist/studio/assets/index-qrTAXbqc.js +531 -0
  575. package/vendor/framey/dist/studio/favicon.svg +14 -0
  576. package/vendor/framey/dist/studio/icons/timeline/audio.svg +7 -0
  577. package/vendor/framey/dist/studio/icons/timeline/captions.svg +5 -0
  578. package/vendor/framey/dist/studio/icons/timeline/composition.svg +12 -0
  579. package/vendor/framey/dist/studio/icons/timeline/image.svg +18 -0
  580. package/vendor/framey/dist/studio/icons/timeline/music.svg +10 -0
  581. package/vendor/framey/dist/studio/icons/timeline/text.svg +3 -0
  582. package/vendor/framey/dist/studio/index.html +23 -0
  583. package/vendor/framey/dist/studio-api-2NECGRMB.js +179 -0
  584. package/vendor/framey/dist/studioSelectionClient-IUUPKUHZ.js +25 -0
  585. package/vendor/framey/dist/studioServer-N2OPUMOQ.js +1569 -0
  586. package/vendor/framey/dist/synthesize-PKTB5ATG.js +183 -0
  587. package/vendor/framey/dist/system-7F3UEHQT.js +27 -0
  588. package/vendor/framey/dist/telemetry-DQGPEKM6.js +145 -0
  589. package/vendor/framey/dist/telemetry-UN55N6U6.js +77 -0
  590. package/vendor/framey/dist/timeline-LHUUMK63.js +1295 -0
  591. package/vendor/framey/dist/tokens-OLECWDFK.js +92 -0
  592. package/vendor/framey/dist/transcribe-O7HQKMIV.js +331 -0
  593. package/vendor/framey/dist/transcribe-UJESPBT5.js +76 -0
  594. package/vendor/framey/dist/tts-YCCQHZD4.js +234 -0
  595. package/vendor/framey/dist/urlDownloader-H2LXLG4U.js +48 -0
  596. package/vendor/framey/dist/usage-HG4WMM7A.js +2167 -0
  597. package/vendor/framey/dist/validate-F2XMN6EV.js +87 -0
  598. package/vendor/framey/dist/vendor/npm/gsap@3.15.0/GSAP-LICENSE.txt +8 -0
  599. package/vendor/framey/dist/vendor/npm/gsap@3.15.0/dist/CustomEase.min.js +11 -0
  600. package/vendor/framey/dist/vendor/npm/gsap@3.15.0/dist/MotionPathPlugin.min.js +11 -0
  601. package/vendor/framey/dist/vendor/npm/gsap@3.15.0/dist/gsap.min.js +11 -0
  602. package/vendor/framey/dist/warmCheck.js +220 -0
  603. package/vendor/framey/dist/warmCheckClient.js +139 -0
  604. package/vendor/framey/dist/workspaceBuildCheck-XYD2YTFW.js +133 -0
  605. package/vendor/framey-player/LICENSE +190 -0
  606. package/vendor/framey-player/NOTICE +16 -0
  607. package/vendor/framey-player/SOURCE.json +6 -0
  608. package/vendor/framey-player/hyperframes-player.global.js +478 -0
  609. package/vendor/framey.pin +1 -0
  610. package/bin/index.js +0 -3
@@ -0,0 +1,59 @@
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
+ VERSION
9
+ } from "./chunk-AHX34EFP.js";
10
+
11
+ // src/registry/compatibility.ts
12
+ import { compareVersions } from "compare-versions";
13
+ var DEV_VERSION = "0.0.0-dev";
14
+ function checkRegistryItemCompatibility(item, currentCliVersion = VERSION) {
15
+ const warnings = [];
16
+ if (item.deprecated) {
17
+ warnings.push(`Registry item "${item.name}" is deprecated: ${item.deprecated}`);
18
+ }
19
+ const minCliVersion = item.minCliVersion?.trim();
20
+ if (!minCliVersion || currentCliVersion === DEV_VERSION) {
21
+ return { warnings };
22
+ }
23
+ try {
24
+ if (compareVersions(currentCliVersion, minCliVersion) >= 0) {
25
+ return { warnings };
26
+ }
27
+ } catch {
28
+ return {
29
+ warnings,
30
+ error: `Registry item "${item.name}" declares invalid minCliVersion "${minCliVersion}".`
31
+ };
32
+ }
33
+ return {
34
+ warnings,
35
+ error: `Registry item "${item.name}" requires framey >= ${minCliVersion} (current: ${currentCliVersion}). Rebuild Framey from a newer checkout to add it.`
36
+ };
37
+ }
38
+ var RegistryCompatibilityError = class extends Error {
39
+ constructor(message) {
40
+ super(message);
41
+ this.name = "RegistryCompatibilityError";
42
+ }
43
+ };
44
+ function gateRegistryItemsCompatibility(items, currentCliVersion = VERSION) {
45
+ const warnings = [];
46
+ for (const item of items) {
47
+ const result = checkRegistryItemCompatibility(item, currentCliVersion);
48
+ if (result.error) {
49
+ throw new RegistryCompatibilityError(result.error);
50
+ }
51
+ warnings.push(...result.warnings);
52
+ }
53
+ return warnings;
54
+ }
55
+
56
+ export {
57
+ RegistryCompatibilityError,
58
+ gateRegistryItemsCompatibility
59
+ };
@@ -0,0 +1,40 @@
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
+ findCompositionDimensions
9
+ } from "./chunk-LEKZNRKI.js";
10
+ import {
11
+ c
12
+ } from "./chunk-VORQIH64.js";
13
+
14
+ // src/commands/lambda/_dimensions.ts
15
+ import { readFileSync } from "fs";
16
+ import { join } from "path";
17
+ function warnOnDimensionMismatch(args) {
18
+ if (args.quiet) return;
19
+ if (args.outputResolution) return;
20
+ let html;
21
+ try {
22
+ html = readFileSync(join(args.projectDir, "index.html"), "utf-8");
23
+ } catch {
24
+ return;
25
+ }
26
+ const composition = findCompositionDimensions(html);
27
+ if (!composition) return;
28
+ if (composition.width === args.cliWidth && composition.height === args.cliHeight) return;
29
+ console.warn(
30
+ c.warn(
31
+ `--width/--height (${args.cliWidth}\xD7${args.cliHeight}) disagrees with the composition's data-width/data-height (${composition.width}\xD7${composition.height}). The runtime lays out the page at the composition's authored dimensions, so your output will be ${composition.width}\xD7${composition.height}, not ${args.cliWidth}\xD7${args.cliHeight}.
32
+ To supersample to a higher resolution, pass --output-resolution (e.g. \`--output-resolution=4k\`).
33
+ To truly change layout dimensions, edit the composition's data-width/data-height in index.html.`
34
+ )
35
+ );
36
+ }
37
+
38
+ export {
39
+ warnOnDimensionMismatch
40
+ };
@@ -0,0 +1,170 @@
1
+ import { createRequire as __hf_createRequire } from "node:module";
2
+ import { fileURLToPath as __hf_fileURLToPath } from "node:url";
3
+ import { dirname as __hf_dirname } from "node:path";
4
+ var require = __hf_createRequire(import.meta.url);
5
+ var __filename = __hf_fileURLToPath(import.meta.url);
6
+ var __dirname = __hf_dirname(__filename);
7
+
8
+ // src/commands/lambda/sam.ts
9
+ import { execFileSync, spawnSync } from "child_process";
10
+ import { existsSync } from "fs";
11
+ import { join } from "path";
12
+ function assertSamAvailable() {
13
+ try {
14
+ execFileSync("sam", ["--version"], { stdio: "ignore" });
15
+ } catch {
16
+ throw new Error(
17
+ "`sam` CLI not found on PATH. Install AWS SAM CLI from https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/install-sam-cli.html and retry."
18
+ );
19
+ }
20
+ }
21
+ function assertAwsCliAvailable() {
22
+ try {
23
+ execFileSync("aws", ["--version"], { stdio: "ignore" });
24
+ } catch {
25
+ throw new Error(
26
+ "`aws` CLI not found on PATH. Install from https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html and configure credentials before retrying."
27
+ );
28
+ }
29
+ }
30
+ function locateSamTemplate(repoRoot) {
31
+ const candidate = join(repoRoot, "examples", "aws-lambda", "template.yaml");
32
+ if (!existsSync(candidate)) {
33
+ throw new Error(
34
+ `[lambda] SAM template not found at ${candidate}. \`framey lambda deploy\` needs a Framey repo checkout: run it from one, or set HYPERFRAMES_REPO_ROOT to point at one.`
35
+ );
36
+ }
37
+ return candidate;
38
+ }
39
+ function parseReservedConcurrency(raw) {
40
+ if (raw === void 0 || raw === null || raw === "") return void 0;
41
+ if (raw === "none") return -1;
42
+ const n = Number(raw);
43
+ if (!Number.isInteger(n) || n < 1) {
44
+ throw new Error(
45
+ `[lambda] --concurrency must be a positive integer or "none"; got ${String(raw)}`
46
+ );
47
+ }
48
+ return n;
49
+ }
50
+ function samDeploy(opts) {
51
+ assertSamAvailable();
52
+ const paramOverrides = [
53
+ `ChromeSource=${opts.chromeSource ?? "sparticuz"}`,
54
+ // Always sent: omitted, SAM's UsePreviousValue would keep a video function the user dropped.
55
+ `VideoImageUri=${opts.videoImageUri ?? '""'}`
56
+ ];
57
+ if (opts.reservedConcurrency !== void 0) {
58
+ paramOverrides.push(`ReservedConcurrency=${opts.reservedConcurrency}`);
59
+ }
60
+ if (opts.lambdaMemoryMb !== void 0) {
61
+ paramOverrides.push(`LambdaMemoryMb=${opts.lambdaMemoryMb}`);
62
+ }
63
+ const args = [
64
+ "deploy",
65
+ "--stack-name",
66
+ opts.stackName,
67
+ "--region",
68
+ opts.region,
69
+ "--resolve-s3",
70
+ "--capabilities",
71
+ "CAPABILITY_IAM",
72
+ "--no-confirm-changeset",
73
+ "--no-fail-on-empty-changeset",
74
+ "--parameter-overrides",
75
+ ...paramOverrides
76
+ ];
77
+ if (opts.awsProfile) {
78
+ args.push("--profile", opts.awsProfile);
79
+ }
80
+ const result = spawnSync("sam", args, { cwd: opts.samDir, stdio: opts.stdio ?? "inherit" });
81
+ if (result.status !== 0) {
82
+ throw new Error(
83
+ `[lambda] sam deploy exited with code ${result.status ?? "unknown"}
84
+ If a prior attempt left a stack in ROLLBACK_COMPLETE, CloudFormation can't reuse it. Delete it before retrying:
85
+ aws cloudformation delete-stack --stack-name aws-sam-cli-managed-default --region ${opts.region}
86
+ aws cloudformation delete-stack --stack-name ${opts.stackName} --region ${opts.region}
87
+ (the first is SAM's managed artifacts stack from --resolve-s3; the second is the render stack).`
88
+ );
89
+ }
90
+ }
91
+ function samDelete(opts) {
92
+ assertSamAvailable();
93
+ const args = ["delete", "--stack-name", opts.stackName, "--region", opts.region, "--no-prompts"];
94
+ if (opts.awsProfile) {
95
+ args.push("--profile", opts.awsProfile);
96
+ }
97
+ const result = spawnSync("sam", args, { cwd: opts.samDir, stdio: opts.stdio ?? "inherit" });
98
+ if (result.status !== 0) {
99
+ throw new Error(`[lambda] sam delete exited with code ${result.status ?? "unknown"}`);
100
+ }
101
+ }
102
+ function fetchStackOutputs(opts) {
103
+ assertAwsCliAvailable();
104
+ const args = [
105
+ "cloudformation",
106
+ "describe-stacks",
107
+ "--stack-name",
108
+ opts.stackName,
109
+ "--region",
110
+ opts.region,
111
+ "--query",
112
+ "Stacks[0]",
113
+ "--output",
114
+ "json"
115
+ ];
116
+ if (opts.awsProfile) {
117
+ args.unshift("--profile", opts.awsProfile);
118
+ }
119
+ const out = execFileSync("aws", args, { encoding: "utf-8" });
120
+ const stack = JSON.parse(out);
121
+ const byKey = new Map((stack.Outputs ?? []).map((o) => [o.OutputKey, o.OutputValue]));
122
+ const reserved = Number(
123
+ stack.Parameters?.find((p) => p.ParameterKey === "ReservedConcurrency")?.ParameterValue
124
+ );
125
+ const bucketName = byKey.get("RenderBucketName");
126
+ const functionName = byKey.get("RenderFunctionArn");
127
+ const stateMachineArn = byKey.get("RenderStateMachineArn");
128
+ if (!bucketName || !functionName || !stateMachineArn) {
129
+ throw new Error(
130
+ `[lambda] stack ${opts.stackName} is missing one of RenderBucketName/RenderFunctionArn/RenderStateMachineArn. Got keys: ${[...byKey.keys()].join(", ")}`
131
+ );
132
+ }
133
+ return {
134
+ bucketName,
135
+ // RenderFunctionArn is the full ARN; the Lambda function name is the
136
+ // last colon-segment, which downstream `getRenderProgress` calls use
137
+ // for cost math + CloudWatch lookups.
138
+ functionName: functionName.split(":").pop() ?? functionName,
139
+ stateMachineArn,
140
+ reservedConcurrency: reserved > 0 ? reserved : void 0,
141
+ videoFunctionName: byKey.get("VideoFunctionArn")?.split(":").pop()
142
+ };
143
+ }
144
+ function deleteEcrRepository(opts) {
145
+ assertAwsCliAvailable();
146
+ const args = [
147
+ "ecr",
148
+ "delete-repository",
149
+ "--repository-name",
150
+ opts.repositoryName,
151
+ "--force",
152
+ "--region",
153
+ opts.region
154
+ ];
155
+ if (opts.awsProfile) args.push("--profile", opts.awsProfile);
156
+ const result = spawnSync("aws", args, { encoding: "utf-8" });
157
+ if (result.status === 0 || result.stderr?.includes("RepositoryNotFoundException")) return;
158
+ throw new Error(
159
+ `[lambda] aws ecr delete-repository ${opts.repositoryName} exited with code ${result.status ?? "unknown"}: ${result.stderr ?? ""}`
160
+ );
161
+ }
162
+
163
+ export {
164
+ locateSamTemplate,
165
+ parseReservedConcurrency,
166
+ samDeploy,
167
+ samDelete,
168
+ fetchStackOutputs,
169
+ deleteEcrRepository
170
+ };
@@ -0,0 +1,118 @@
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
+ setHostHandlesSigint
9
+ } from "./chunk-TIQB63MX.js";
10
+ import {
11
+ processAncestorSnapshot,
12
+ processIdentity,
13
+ processParentPid
14
+ } from "./chunk-LTGTN2TH.js";
15
+ import {
16
+ processIsAlive
17
+ } from "./chunk-KGPLIH7B.js";
18
+
19
+ // src/utils/renderCancellation.ts
20
+ var RENDER_CANCELLATION_SIGNALS = [
21
+ "SIGINT",
22
+ "SIGTERM",
23
+ "SIGHUP"
24
+ ];
25
+ function stoppedByCancelSignal(stop) {
26
+ if (stop.code || stop.killed || stop.error) return false;
27
+ return RENDER_CANCELLATION_SIGNALS.some((signal) => signal === stop.signal);
28
+ }
29
+ function captureAncestors(pid, lookupParentPid, lookupIdentity, isAlive) {
30
+ const ancestors = [];
31
+ const visited = /* @__PURE__ */ new Set([pid]);
32
+ let current = pid;
33
+ for (let depth = 0; depth < 64; depth++) {
34
+ const parent = lookupParentPid(current);
35
+ if (parent === null || parent <= 1 || visited.has(parent)) break;
36
+ visited.add(parent);
37
+ if (!isAlive(parent)) break;
38
+ const identity = lookupIdentity(parent);
39
+ if (identity === null) break;
40
+ ancestors.push({ pid: parent, identity });
41
+ current = parent;
42
+ }
43
+ return ancestors;
44
+ }
45
+ function captureRenderAncestors(options, platform, pid, lookupIdentity, isAlive) {
46
+ if (options.detached ?? process.env.HYPERFRAMES_RENDER_DETACHED === "1") return [];
47
+ if (platform !== "linux" && options.parentPid === void 0 && options.identity === void 0) {
48
+ return (options.ancestorSnapshot ?? processAncestorSnapshot)(pid);
49
+ }
50
+ return captureAncestors(pid, options.parentPid ?? processParentPid, lookupIdentity, isAlive);
51
+ }
52
+ function installSignalHandlers(detached, signalTarget, abort) {
53
+ const signalHandlers = /* @__PURE__ */ new Map();
54
+ const handledSignals = detached ? RENDER_CANCELLATION_SIGNALS.filter((signal) => signal !== "SIGHUP") : RENDER_CANCELLATION_SIGNALS;
55
+ for (const signal of handledSignals) {
56
+ const handler = () => abort(`render_cancelled_by_${signal.toLowerCase()}`);
57
+ signalHandlers.set(signal, handler);
58
+ signalTarget.on(signal, handler);
59
+ }
60
+ return signalHandlers;
61
+ }
62
+ function createRenderCancellationScope(options = {}) {
63
+ const controller = new AbortController();
64
+ const signalTarget = options.signalTarget ?? process;
65
+ const abort = (reason) => {
66
+ if (!controller.signal.aborted) controller.abort(new Error(reason));
67
+ };
68
+ const detached = options.detached ?? process.env.HYPERFRAMES_RENDER_DETACHED === "1";
69
+ const signalHandlers = installSignalHandlers(detached, signalTarget, abort);
70
+ setHostHandlesSigint(true);
71
+ const lookupIdentity = options.identity ?? processIdentity;
72
+ const isAlive = options.isAlive ?? processIsAlive;
73
+ const platform = options.platform ?? process.platform;
74
+ const pid = options.pid ?? process.pid;
75
+ const ancestors = captureRenderAncestors(options, platform, pid, lookupIdentity, isAlive);
76
+ const checkAncestorLiveness = () => {
77
+ for (const ancestor of ancestors) {
78
+ if (!isAlive(ancestor.pid)) {
79
+ abort("render_cancelled_parent_exited");
80
+ return false;
81
+ }
82
+ }
83
+ return true;
84
+ };
85
+ const checkAncestors = () => {
86
+ if (!checkAncestorLiveness()) return;
87
+ if (platform !== "linux") return;
88
+ for (const ancestor of ancestors) {
89
+ const currentIdentity = lookupIdentity(ancestor.pid);
90
+ if (currentIdentity !== null && currentIdentity !== ancestor.identity) {
91
+ abort("render_cancelled_parent_exited");
92
+ return;
93
+ }
94
+ }
95
+ };
96
+ const defaultPollIntervalMs = ancestors.length > 0 && platform === "linux" ? 250 : 2e3;
97
+ const watchdogTimer = setInterval(
98
+ platform === "linux" ? checkAncestors : () => void checkAncestorLiveness(),
99
+ options.parentPollIntervalMs ?? defaultPollIntervalMs
100
+ );
101
+ let disposed = false;
102
+ return {
103
+ signal: controller.signal,
104
+ checkAncestors,
105
+ dispose: () => {
106
+ if (disposed) return;
107
+ disposed = true;
108
+ if (watchdogTimer !== void 0) clearInterval(watchdogTimer);
109
+ for (const [signal, handler] of signalHandlers) signalTarget.off(signal, handler);
110
+ setHostHandlesSigint(false);
111
+ }
112
+ };
113
+ }
114
+
115
+ export {
116
+ stoppedByCancelSignal,
117
+ createRenderCancellationScope
118
+ };
@@ -0,0 +1,304 @@
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
+ downloadFile
9
+ } from "./chunk-WQ6ZXHFQ.js";
10
+ import {
11
+ findFFmpeg
12
+ } from "./chunk-UMD3V7CU.js";
13
+ import {
14
+ stoppableExecFile
15
+ } from "./chunk-HU2SPFNG.js";
16
+
17
+ // src/whisper/manager.ts
18
+ import { execFileSync } from "child_process";
19
+ import { existsSync, mkdirSync, readdirSync, renameSync, rmSync, statSync as statSync2 } from "fs";
20
+ import { homedir, platform } from "os";
21
+ import { join } from "path";
22
+
23
+ // src/whisper/modelFile.ts
24
+ import { createHash } from "crypto";
25
+ import { createReadStream, statSync } from "fs";
26
+ async function sha256File(path) {
27
+ const hash = createHash("sha256");
28
+ for await (const chunk of createReadStream(path)) hash.update(chunk);
29
+ return hash.digest("hex");
30
+ }
31
+ async function verifies(path, file) {
32
+ if (statSync(path, { throwIfNoEntry: false })?.size !== file.bytes) return false;
33
+ return await sha256File(path) === file.sha256;
34
+ }
35
+
36
+ // src/whisper/manager.ts
37
+ var MODELS_DIR = join(homedir(), ".cache", "hyperframes", "whisper", "models");
38
+ var DEFAULT_MODEL = "small.en";
39
+ var WhisperUnavailableError = class extends Error {
40
+ code = "WHISPER_UNAVAILABLE";
41
+ constructor(message) {
42
+ super(message);
43
+ this.name = "WhisperUnavailableError";
44
+ }
45
+ };
46
+ function isWhisperUnavailable(err) {
47
+ if (err instanceof WhisperUnavailableError) return true;
48
+ return err instanceof Error && "code" in err && err.code === "WHISPER_UNAVAILABLE";
49
+ }
50
+ var MODEL_REVISION = "5359861c739e955e79d9a303bcbc70fb988958b1";
51
+ function getModelUrl(model) {
52
+ return `https://huggingface.co/ggerganov/whisper.cpp/resolve/${MODEL_REVISION}/ggml-${model}.bin`;
53
+ }
54
+ var pinned = (model, bytes, sha256) => [
55
+ model,
56
+ { name: `ggml-${model}.bin`, bytes, sha256 }
57
+ ];
58
+ var PINNED_MODELS = new Map([
59
+ pinned("tiny", 77691713, "be07e048e1e599ad46341c8d2a135645097a538221678b7acdd1b1919c6e1b21"),
60
+ pinned("tiny.en", 77704715, "921e4cf8686fdd993dcd081a5da5b6c365bfde1162e72b08d75ac75289920b1f"),
61
+ pinned("base", 147951465, "60ed5bc3dd14eea856493d334349b405782ddcaf0028d4b5df4088345fba2efe"),
62
+ pinned(
63
+ "base.en",
64
+ 147964211,
65
+ "a03779c86df3323075f5e796cb2ce5029f00ec8869eee3fdfb897afe36c6d002"
66
+ ),
67
+ pinned("small", 487601967, "1be3a9b2063867b937e64e2ec7483364a79917e157fa98c5d94b5c1fffea987b"),
68
+ pinned(
69
+ "small.en",
70
+ 487614201,
71
+ "c6138d6d58ecc8322097e0f987c32f1be8bb0a18532a3f88f734d1bbf9c41e5d"
72
+ ),
73
+ pinned(
74
+ "medium",
75
+ 1533763059,
76
+ "6c14d5adee5f86394037b4e4e8b59f1673b6cee10e3cf0b11bbdbee79c156208"
77
+ ),
78
+ pinned(
79
+ "medium.en",
80
+ 1533774781,
81
+ "cc37e93478338ec7700281a7ac30a10128929eb8f427dda2e865faa8f6da4356"
82
+ ),
83
+ pinned(
84
+ "large-v1",
85
+ 3094623691,
86
+ "7d99f41a10525d0206bddadd86760181fa920438b6b33237e3118ff6c83bb53d"
87
+ ),
88
+ pinned(
89
+ "large-v2",
90
+ 3094623691,
91
+ "9a423fe4d40c82774b6af34115b8b935f34152246eb19e80e376071d3f999487"
92
+ ),
93
+ pinned(
94
+ "large-v3",
95
+ 3095033483,
96
+ "64d182b440b98d5203c4f9bd541544d84c605196c4f7b845dfa11fb23594d1e2"
97
+ ),
98
+ pinned(
99
+ "large-v3-turbo",
100
+ 1624555275,
101
+ "1fc70f774d38eb169993ac391eea357ef47c88757ef72ee5943879b7e8e2bc69"
102
+ )
103
+ ]);
104
+ function pinnedWhisperModel(model) {
105
+ return PINNED_MODELS.get(model);
106
+ }
107
+ function whichBinary(name) {
108
+ try {
109
+ const cmd = process.platform === "win32" ? "where" : "which";
110
+ const output = execFileSync(cmd, [name], {
111
+ encoding: "utf-8",
112
+ stdio: ["pipe", "pipe", "pipe"],
113
+ timeout: 5e3
114
+ });
115
+ const first = output.split(/\r?\n/).map((s) => s.trim()).find(Boolean);
116
+ return first || void 0;
117
+ } catch {
118
+ return void 0;
119
+ }
120
+ }
121
+ function findFromEnv() {
122
+ const envPath = process.env["HYPERFRAMES_WHISPER_PATH"];
123
+ if (envPath && existsSync(envPath)) {
124
+ return { executablePath: envPath, source: "env" };
125
+ }
126
+ return void 0;
127
+ }
128
+ function findFromSystem() {
129
+ const path = whichBinary("whisper-cli");
130
+ if (path) return { executablePath: path, source: "system" };
131
+ if (platform() === "darwin") {
132
+ for (const p of ["/opt/homebrew/bin/whisper-cli", "/usr/local/bin/whisper-cli"]) {
133
+ if (existsSync(p)) return { executablePath: p, source: "system" };
134
+ }
135
+ }
136
+ return void 0;
137
+ }
138
+ var BUILD_DIR = join(homedir(), ".cache", "hyperframes", "whisper", "whisper.cpp");
139
+ var WHISPER_REPO = "https://github.com/ggml-org/whisper.cpp.git";
140
+ function findBuiltBinary() {
141
+ for (const p of [
142
+ join(BUILD_DIR, "build", "bin", "whisper-cli"),
143
+ join(BUILD_DIR, "build", "whisper-cli")
144
+ ]) {
145
+ if (existsSync(p)) return { executablePath: p, source: "build" };
146
+ }
147
+ return void 0;
148
+ }
149
+ async function buildFromSource(onProgress, signal) {
150
+ if (existsSync(BUILD_DIR) && !findBuiltBinary()) {
151
+ rmSync(BUILD_DIR, { recursive: true, force: true });
152
+ }
153
+ if (!existsSync(BUILD_DIR)) {
154
+ onProgress?.("Downloading whisper.cpp...");
155
+ mkdirSync(join(homedir(), ".cache", "hyperframes", "whisper"), {
156
+ recursive: true
157
+ });
158
+ await stoppableExecFile("git", ["clone", "--depth", "1", WHISPER_REPO, BUILD_DIR], {
159
+ stdio: "ignore",
160
+ timeout: 6e4,
161
+ env: { ...process.env, GIT_TERMINAL_PROMPT: "0" },
162
+ signal
163
+ });
164
+ }
165
+ onProgress?.("Building whisper.cpp (this may take a minute)...");
166
+ try {
167
+ await stoppableExecFile("cmake", ["-B", "build"], {
168
+ cwd: BUILD_DIR,
169
+ stdio: ["pipe", "pipe", "pipe"],
170
+ timeout: 12e4,
171
+ signal
172
+ });
173
+ await stoppableExecFile("cmake", ["--build", "build", "--config", "Release", "-j"], {
174
+ cwd: BUILD_DIR,
175
+ stdio: ["pipe", "pipe", "pipe"],
176
+ timeout: 3e5,
177
+ signal
178
+ });
179
+ } catch (err) {
180
+ let detail = "";
181
+ if (err && typeof err === "object" && "stderr" in err) {
182
+ const stderr = String(err.stderr).trim();
183
+ if (stderr) detail = `
184
+ ${stderr.slice(-500)}`;
185
+ }
186
+ rmSync(BUILD_DIR, { recursive: true, force: true });
187
+ throw new Error(
188
+ `whisper-cpp build failed. Ensure cmake and a C compiler are installed.${detail}`
189
+ );
190
+ }
191
+ const result = findBuiltBinary();
192
+ if (!result) throw new Error("Build completed but whisper-cli not found");
193
+ return result;
194
+ }
195
+ function findWhisper() {
196
+ return findFromEnv() ?? findFromSystem() ?? findBuiltBinary();
197
+ }
198
+ function listWhisperModels() {
199
+ if (!existsSync(MODELS_DIR)) return [];
200
+ return readdirSync(MODELS_DIR).flatMap((file) => {
201
+ const model = /^ggml-(.+)\.bin$/.exec(file)?.[1];
202
+ const path = join(MODELS_DIR, file);
203
+ return model && existsSync(path) ? [{ model, path }] : [];
204
+ }).sort((a, b) => a.model.localeCompare(b.model));
205
+ }
206
+ function getInstallInstructions() {
207
+ if (platform() === "darwin") {
208
+ return "brew install whisper-cpp";
209
+ }
210
+ if (platform() === "linux") {
211
+ return "Build from source: https://github.com/ggml-org/whisper.cpp#building (requires cmake and a C compiler)";
212
+ }
213
+ if (platform() === "win32") {
214
+ return "Build with cmake: https://github.com/ggml-org/whisper.cpp#building";
215
+ }
216
+ return "See https://github.com/ggml-org/whisper.cpp#building";
217
+ }
218
+ function hasBrew() {
219
+ return whichBinary("brew") !== void 0;
220
+ }
221
+ function hasGit() {
222
+ return whichBinary("git") !== void 0;
223
+ }
224
+ function hasCmake() {
225
+ return whichBinary("cmake") !== void 0;
226
+ }
227
+ async function ensureWhisper(options) {
228
+ const signal = options?.signal;
229
+ const existing = findWhisper();
230
+ if (existing) return existing;
231
+ if (options?.installRuntime === false) {
232
+ throw new WhisperUnavailableError(
233
+ "whisper-cpp not found; runtime installation is disabled by --no-runtime-install."
234
+ );
235
+ }
236
+ if (platform() === "darwin" && hasBrew()) {
237
+ options?.onProgress?.("Installing whisper-cpp via Homebrew...");
238
+ try {
239
+ await stoppableExecFile("brew", ["install", "whisper-cpp"], {
240
+ stdio: "ignore",
241
+ timeout: 3e5,
242
+ signal
243
+ });
244
+ const installed = findFromSystem();
245
+ if (installed) return { ...installed, source: "brew" };
246
+ } catch {
247
+ }
248
+ signal?.throwIfAborted();
249
+ }
250
+ if (hasGit() && hasCmake()) {
251
+ try {
252
+ return await buildFromSource(options?.onProgress, signal);
253
+ } catch {
254
+ }
255
+ signal?.throwIfAborted();
256
+ }
257
+ throw new WhisperUnavailableError(`whisper-cpp not found. Install: ${getInstallInstructions()}`);
258
+ }
259
+ async function ensureModel(model = DEFAULT_MODEL, options) {
260
+ const modelPath = join(MODELS_DIR, `ggml-${model}.bin`);
261
+ const pin = PINNED_MODELS.get(model);
262
+ const cachedBytes = statSync2(modelPath, { throwIfNoEntry: false })?.size;
263
+ if (cachedBytes !== void 0 && (!pin || cachedBytes === pin.bytes)) return modelPath;
264
+ mkdirSync(MODELS_DIR, { recursive: true });
265
+ rmSync(modelPath, { force: true });
266
+ options?.onProgress?.(
267
+ cachedBytes === void 0 ? `Downloading model ${model}...` : `Model ${model} is incomplete; downloading it again...`
268
+ );
269
+ const downloaded = `${modelPath}.${process.pid}.download`;
270
+ try {
271
+ await downloadFile(getModelUrl(model), downloaded, {
272
+ signal: options?.signal,
273
+ onProgress: options?.onDownloadProgress
274
+ });
275
+ if (pin && !await verifies(downloaded, pin)) {
276
+ throw new Error(
277
+ `${pin.name} did not match its pinned size and sha256, so it was discarded. Re-run to retry.`
278
+ );
279
+ }
280
+ renameSync(downloaded, modelPath);
281
+ } finally {
282
+ rmSync(downloaded, { force: true });
283
+ }
284
+ return modelPath;
285
+ }
286
+ function hasFFmpeg() {
287
+ return findFFmpeg() !== void 0;
288
+ }
289
+
290
+ export {
291
+ sha256File,
292
+ verifies,
293
+ MODELS_DIR,
294
+ DEFAULT_MODEL,
295
+ WhisperUnavailableError,
296
+ isWhisperUnavailable,
297
+ pinnedWhisperModel,
298
+ findWhisper,
299
+ listWhisperModels,
300
+ getInstallInstructions,
301
+ ensureWhisper,
302
+ ensureModel,
303
+ hasFFmpeg
304
+ };