hyperframes 0.8.118 → 0.8.120

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 (160) hide show
  1. package/dist/{add-3S6KP4AK.js → add-SYG3UXKX.js} +14 -14
  2. package/dist/{animatedGifPrep-Q43TI2YV.js → animatedGifPrep-RH5AEVNX.js} +5 -5
  3. package/dist/{asset-EMLJLATM.js → asset-P6K7U3L6.js} +2 -2
  4. package/dist/{assetCataloger-Y23LGNYN.js → assetCataloger-QX37JS5D.js} +2 -2
  5. package/dist/{auth-4Z7VZPCZ.js → auth-TCX6TGIH.js} +4 -4
  6. package/dist/{autoUpdate-PGW6OY5X.js → autoUpdate-YGT7MYDU.js} +2 -2
  7. package/dist/{backgroundChecks-O6QYKWTF.js → backgroundChecks-CCDNX6P2.js} +3 -3
  8. package/dist/backgroundChecksWorker.js +3 -3
  9. package/dist/{batchRender-TEZOU3YE.js → batchRender-BBBUJETN.js} +3 -3
  10. package/dist/{beats-APZ6AZGK.js → beats-HNU6TRID.js} +13 -13
  11. package/dist/{benchmark-F5L6KI64.js → benchmark-UEMJYRLY.js} +11 -11
  12. package/dist/{browser-Y5BMYRTQ.js → browser-CZJK4WQR.js} +8 -8
  13. package/dist/{bundleWithLocalizedFonts-GSZWNYEA.js → bundleWithLocalizedFonts-ZLXYM43M.js} +2 -2
  14. package/dist/{capture-ZBBG543M.js → capture-4WXKXCCV.js} +8 -8
  15. package/dist/{capture-K4HV4DA6.js → capture-6NN3YJBF.js} +2 -2
  16. package/dist/{catalog-H2NX2XRP.js → catalog-G3C7EIL3.js} +14 -14
  17. package/dist/{check-CCUKKQ2W.js → check-KTYPDNJD.js} +33 -33
  18. package/dist/{checkBrowser-VGS4QPIS.js → checkBrowser-MJAN5LSM.js} +31 -31
  19. package/dist/{chunk-I47W3MA3.js → chunk-2WKWEB4T.js} +1 -1
  20. package/dist/{chunk-QJ3ODWQ3.js → chunk-4IWDF5OL.js} +4 -4
  21. package/dist/{chunk-GCARCDLC.js → chunk-4PTKEI2C.js} +1 -1
  22. package/dist/{chunk-7CXLMMUA.js → chunk-5IABQ7OX.js} +1 -1
  23. package/dist/{chunk-XJOUFF2F.js → chunk-6A332WKF.js} +11 -11
  24. package/dist/{chunk-D6YMMYSZ.js → chunk-6ZX3YCCU.js} +21 -21
  25. package/dist/{chunk-BYYKHP54.js → chunk-7N3IODU7.js} +1 -1
  26. package/dist/{chunk-WXQLHFXI.js → chunk-A45JNRYR.js} +1 -1
  27. package/dist/{chunk-YO6TVUAJ.js → chunk-B3MQEZBK.js} +1 -1
  28. package/dist/{chunk-R6BVKVII.js → chunk-BKQXLO55.js} +1 -1
  29. package/dist/{chunk-PSGDNMM6.js → chunk-BXCMXMJQ.js} +1 -1
  30. package/dist/{chunk-XI77IJXJ.js → chunk-CK2YS3E3.js} +5 -5
  31. package/dist/{chunk-KUTZBSIW.js → chunk-DL347PC3.js} +2 -2
  32. package/dist/{chunk-SVUKHYTG.js → chunk-EFC3DCJL.js} +1 -1
  33. package/dist/{chunk-WEATBQTR.js → chunk-EOVYQ3IG.js} +21 -1
  34. package/dist/{chunk-TOS2MNWW.js → chunk-FNX7RJIJ.js} +2 -2
  35. package/dist/{chunk-K4SAACM7.js → chunk-GVJMAHXQ.js} +2 -2
  36. package/dist/{chunk-DNXD7TOA.js → chunk-I465DBM6.js} +27 -12
  37. package/dist/chunk-IGLEPPTN.js +24 -0
  38. package/dist/{chunk-FQ4EMFVL.js → chunk-IJ2O4BLJ.js} +3 -3
  39. package/dist/{chunk-DA5FLVIF.js → chunk-IUBZ3DSO.js} +2 -2
  40. package/dist/{chunk-MVWXSRY6.js → chunk-JH556Q42.js} +69 -21
  41. package/dist/{chunk-CNQ565U6.js → chunk-KWABBJYI.js} +2 -2
  42. package/dist/{chunk-TLDEZQG2.js → chunk-LHU6KXWL.js} +1 -1
  43. package/dist/{chunk-JR27ESBU.js → chunk-LIPKCOYU.js} +2 -2
  44. package/dist/{chunk-DI6EGQVC.js → chunk-LJXFGHPO.js} +3 -3
  45. package/dist/{chunk-HONQFJNH.js → chunk-LP3KFEVQ.js} +92 -43
  46. package/dist/{chunk-PXHMTKFZ.js → chunk-NP5P2A2K.js} +2 -2
  47. package/dist/{chunk-N7PX6IO4.js → chunk-OI3IIR2X.js} +1 -1
  48. package/dist/{chunk-PDAPLJXH.js → chunk-OLFFCC2D.js} +1 -1
  49. package/dist/{chunk-GCPMAZQ2.js → chunk-OV62R47Q.js} +1 -1
  50. package/dist/{chunk-5AREBP56.js → chunk-OWMGDQBZ.js} +1 -1
  51. package/dist/{chunk-MWCROBLZ.js → chunk-PCL5KCT7.js} +8 -8
  52. package/dist/{chunk-OTCO5QAK.js → chunk-PPTHGZTG.js} +1 -1
  53. package/dist/{chunk-W4UNEYYH.js → chunk-QWD3NM22.js} +1 -1
  54. package/dist/chunk-SHB5VDMH.js +51 -0
  55. package/dist/chunk-SHLFJFPM.js +3541 -0
  56. package/dist/{chunk-ZRXUZ2NU.js → chunk-SVI32JAG.js} +3 -3
  57. package/dist/{chunk-UCKAUBNA.js → chunk-TOOQJPUJ.js} +5 -5
  58. package/dist/{chunk-U7FPFCI7.js → chunk-U3CILSBM.js} +1 -1
  59. package/dist/{chunk-JPRW4XXE.js → chunk-U7AMFQ6G.js} +1 -1
  60. package/dist/{chunk-FEUS6YMC.js → chunk-UDYR6TIQ.js} +7 -7
  61. package/dist/{chunk-KDI2GPBM.js → chunk-UOKW7DPN.js} +1 -1
  62. package/dist/{chunk-XJTER22X.js → chunk-V2VNJNX6.js} +1 -1
  63. package/dist/{chunk-PZ3SCTYJ.js → chunk-V5T6IA7D.js} +1 -1
  64. package/dist/{chunk-MNC2KEC6.js → chunk-WJP3UOB3.js} +1 -1
  65. package/dist/{chunk-Y523LGYR.js → chunk-WMCV6DHA.js} +2 -2
  66. package/dist/{chunk-FWZHAEIF.js → chunk-XUNOKLEJ.js} +3 -3
  67. package/dist/{chunk-RLYTIMTS.js → chunk-Y6W4DVPS.js} +4 -37
  68. package/dist/{chunk-LR4O57S2.js → chunk-YV5INYEM.js} +11 -11
  69. package/dist/{chunk-RZAXPDIT.js → chunk-ZTZ7NCJT.js} +1 -1
  70. package/dist/{clean-WWCCHAD6.js → clean-AGTDSSLO.js} +18 -18
  71. package/dist/cli.js +52 -70
  72. package/dist/{cloud-EAJRM253.js → cloud-TIKQ43CO.js} +4 -4
  73. package/dist/{cloudrun-6Q2EJYVH.js → cloudrun-OQLPEWGP.js} +3 -3
  74. package/dist/{compare-XQ6ZW7VX.js → compare-2B7W2HXM.js} +29 -29
  75. package/dist/{compiler-66K2RT7V.js → compiler-GPUSYMA6.js} +2 -2
  76. package/dist/{component-55HRN5XR.js → component-ZQIN33DC.js} +3 -3
  77. package/dist/{compositions-GHHXSBHE.js → compositions-D6JAIKFJ.js} +10 -10
  78. package/dist/{delete-EM7MGX3J.js → delete-UWZ6BBQI.js} +7 -6
  79. package/dist/{deterministicFonts-O7BTFDJU.js → deterministicFonts-ITMUXWD2.js} +2 -2
  80. package/dist/{dist-5CN37P7P.js → dist-NP53GO3N.js} +2 -2
  81. package/dist/{doctor-DQDHQZXD.js → doctor-LHUS7OQG.js} +9 -9
  82. package/dist/dotEnv-AI4SYVTX.js +39 -0
  83. package/dist/{events-Y6SCC5LR.js → events-CNSBSROB.js} +7 -7
  84. package/dist/{events-SQRZ2NYO.js → events-EA2PNDU6.js} +8 -8
  85. package/dist/{feedback-R5KCVSR5.js → feedback-RAOT4ZX6.js} +41 -17
  86. package/dist/{figma-6CHD45P2.js → figma-HHALPQPX.js} +3 -3
  87. package/dist/fontLocalizeCli.js +9 -9
  88. package/dist/{get-3T52JGUQ.js → get-2VHYWD5M.js} +7 -6
  89. package/dist/{gpuPolicy-AXT3ZIXS.js → gpuPolicy-WWBLJO6C.js} +5 -5
  90. package/dist/{grade-compare-SPWLJSY2.js → grade-compare-ZKYGIKRN.js} +25 -25
  91. package/dist/{help-ZR5MP5UU.js → help-YXXIXAVR.js} +1 -1
  92. package/dist/{history-F2MOFF25.js → history-IFZM4MIB.js} +18 -18
  93. package/dist/hyperframe-runtime.js +53 -53
  94. package/dist/hyperframe.manifest.json +1 -1
  95. package/dist/hyperframe.runtime.iife.js +53 -53
  96. package/dist/hyperframes-player.global.js +1 -1
  97. package/dist/{info-BH6XM6PU.js → info-6TZU6FRJ.js} +10 -10
  98. package/dist/{init-TFQQ54JU.js → init-5DPNU4VR.js} +21 -21
  99. package/dist/{inspect-GL35XBUV.js → inspect-LASYMXFA.js} +26 -26
  100. package/dist/{installer-CJS2BO3E.js → installer-EUT2OZTH.js} +4 -4
  101. package/dist/{keyframes-6WRSQWF3.js → keyframes-BS6D4QMB.js} +11 -11
  102. package/dist/{lambda-GWFX55EE.js → lambda-AHKA33RE.js} +4 -4
  103. package/dist/{layout-Q7GJFMWL.js → layout-HMJ5I362.js} +26 -26
  104. package/dist/{lint-AGVDEHRD.js → lint-E2DTFSA5.js} +13 -13
  105. package/dist/{list-P56UBPBI.js → list-C3CXWSEA.js} +7 -6
  106. package/dist/{login-DGA2JL24.js → login-W276LNGF.js} +6 -6
  107. package/dist/{logout-HJQT42RL.js → logout-Q654A3SI.js} +2 -2
  108. package/dist/{media-treatment-HX2PRGEN.js → media-treatment-XECAXDZD.js} +13 -13
  109. package/dist/{models-LM3OQBZK.js → models-6YWOFGV2.js} +8 -8
  110. package/dist/{motionShot-RFT7CMBB.js → motionShot-TNMJ2TNL.js} +10 -10
  111. package/dist/{normalize-audio-E3RFEHHI.js → normalize-audio-JTK53ZDZ.js} +13 -13
  112. package/dist/{pipeline-HDOQRVOB.js → pipeline-HYULUMEV.js} +5 -5
  113. package/dist/{play-2GTIXCRQ.js → play-PAJQYG2D.js} +29 -29
  114. package/dist/{preflight-UDMLHFS5.js → preflight-KJHZ46FX.js} +6 -6
  115. package/dist/{present-LF2OM7BN.js → present-TMFT5KD6.js} +18 -18
  116. package/dist/{preview-FBW5SEQD.js → preview-4HHLUOFB.js} +26 -26
  117. package/dist/{producer-X4YXKWD5.js → producer-6WPA3U6C.js} +1 -1
  118. package/dist/{projectConfig-ST22CO2D.js → projectConfig-A4DXJF4P.js} +6 -6
  119. package/dist/{publication-FZY2NLGL.js → publication-QY2H23JU.js} +2 -2
  120. package/dist/{publish-CI3UZKGR.js → publish-6RRDDVPK.js} +39 -33
  121. package/dist/{refresh-IK6LUV5Z.js → refresh-K24ETHMA.js} +2 -2
  122. package/dist/{remove-background-ZBSZ3HAG.js → remove-background-O2J7EVEN.js} +6 -6
  123. package/dist/{render-ECICJRKC.js → render-N4HBJR46.js} +27 -27
  124. package/dist/{render-PT5KRN5E.js → render-QUQJP5PP.js} +3 -3
  125. package/dist/{render-JKL6KFIS.js → render-WFBNU2KD.js} +21 -20
  126. package/dist/{render-batch-S4MKBU4I.js → render-batch-OS4UEZA4.js} +3 -3
  127. package/dist/{renderCancellation-4X2JXB54.js → renderCancellation-RWWLGOOD.js} +5 -5
  128. package/dist/{resolver-IAWRYTA6.js → resolver-IM46W362.js} +4 -4
  129. package/dist/{sherpa-CL4LNREK.js → sherpa-GCD3QEO6.js} +10 -10
  130. package/dist/{skills-F4ZESP7J.js → skills-D4HKC2WV.js} +10 -10
  131. package/dist/{skillsUpdateCheck-VRWBVQRX.js → skillsUpdateCheck-IPJRWH4Z.js} +3 -3
  132. package/dist/{snapshot-ORYO5ZGK.js → snapshot-A7BIVQUX.js} +31 -31
  133. package/dist/{src-HJYZAMBR.js → src-POL5BSEV.js} +8 -8
  134. package/dist/{src-5DVUT7WJ.js → src-QOQJLFDK.js} +4 -4
  135. package/dist/{staticProjectServer-PHOMSVUD.js → staticProjectServer-BM2TZYJY.js} +14 -14
  136. package/dist/{status-AOAHP4RA.js → status-I7R2ATRZ.js} +7 -7
  137. package/dist/studio/assets/{hyperframes-player-CnpIuNRl.js → hyperframes-player-i4gqkhjz.js} +1 -1
  138. package/dist/studio/assets/{index-BZ23-h1_.js → index-C7LHDM18.js} +1 -1
  139. package/dist/studio/assets/{index-B4SbAADe.js → index-Ce3Lr-Gt.js} +174 -174
  140. package/dist/studio/assets/{index-FeRU6G3G.js → index-uWOhRqxe.js} +1 -1
  141. package/dist/studio/index.d.ts +5 -1
  142. package/dist/studio/index.html +1 -1
  143. package/dist/studio/index.js +72 -87
  144. package/dist/studio/index.js.map +1 -1
  145. package/dist/{studio-api-HAY3XELJ.js → studio-api-GWTH7IPD.js} +8 -8
  146. package/dist/{studioServer-VZYT5MYF.js → studioServer-KB3KCVSZ.js} +40 -40
  147. package/dist/{system-U22WZ4QS.js → system-QUFWS7NN.js} +5 -5
  148. package/dist/{telemetry-CLPATL2D.js → telemetry-5WHZVQFM.js} +8 -8
  149. package/dist/{timeline-5GFZ3VTQ.js → timeline-KM5YF4WX.js} +18 -18
  150. package/dist/{tokens-MZZ4FLYN.js → tokens-VUPKFWHG.js} +2 -2
  151. package/dist/{transcribe-C6JZ3YM4.js → transcribe-4IJPHM33.js} +11 -11
  152. package/dist/{transcribe-FIRUSTL7.js → transcribe-E7RAUZ2W.js} +6 -6
  153. package/dist/{updateCheck-WOW7SP7I.js → updateCheck-JY2WCSMC.js} +2 -2
  154. package/dist/{upgrade-I54CASRP.js → upgrade-QWBPPGTJ.js} +2 -2
  155. package/dist/{urlDownloader-BK3MFIPW.js → urlDownloader-5FUUYAOT.js} +4 -4
  156. package/dist/{validate-IZNFBUOL.js → validate-5LJ6TDCF.js} +15 -15
  157. package/dist/{video-3JQY7QPM.js → video-RTC4AXZB.js} +5 -5
  158. package/package.json +1 -1
  159. package/dist/chunk-L6TT37IY.js +0 -3541
  160. package/dist/{chunk-AIYKVE4Y.js → chunk-2GKO3X7F.js} +3 -3
@@ -0,0 +1,24 @@
1
+ import { createRequire as __hf_createRequire } from "node:module";
2
+ import { fileURLToPath as __hf_fileURLToPath } from "node:url";
3
+ import { dirname as __hf_dirname } from "node:path";
4
+ var require = __hf_createRequire(import.meta.url);
5
+ var __filename = __hf_fileURLToPath(import.meta.url);
6
+ var __dirname = __hf_dirname(__filename);
7
+
8
+ // src/utils/feedbackSource.ts
9
+ var SOURCES = ["person", "agent"];
10
+ function parseFeedbackSource(raw) {
11
+ if (raw === void 0) return void 0;
12
+ const source = raw.trim();
13
+ return SOURCES.includes(source) ? source : null;
14
+ }
15
+ var FEEDBACK_EMAIL_ENV = "HYPERFRAMES_FEEDBACK_EMAIL";
16
+ function feedbackEmail(env = process.env) {
17
+ return env[FEEDBACK_EMAIL_ENV]?.trim() || void 0;
18
+ }
19
+
20
+ export {
21
+ parseFeedbackSource,
22
+ FEEDBACK_EMAIL_ENV,
23
+ feedbackEmail
24
+ };
@@ -8,16 +8,16 @@ import {
8
8
  flush,
9
9
  shouldTrack,
10
10
  trackEvent
11
- } from "./chunk-DI6EGQVC.js";
11
+ } from "./chunk-LJXFGHPO.js";
12
12
  import {
13
13
  getPowerState
14
- } from "./chunk-JPRW4XXE.js";
14
+ } from "./chunk-U7AMFQ6G.js";
15
15
  import {
16
16
  CliRuntimeError
17
17
  } from "./chunk-PBN6GBJE.js";
18
18
  import {
19
19
  redactTelemetryString
20
- } from "./chunk-I47W3MA3.js";
20
+ } from "./chunk-2WKWEB4T.js";
21
21
  import {
22
22
  readConfig
23
23
  } from "./chunk-XUXGIA7H.js";
@@ -22,7 +22,7 @@ import {
22
22
  renderFrameIdForRenderId,
23
23
  resolveAuthoredTimingWindow,
24
24
  toFps
25
- } from "./chunk-I47W3MA3.js";
25
+ } from "./chunk-2WKWEB4T.js";
26
26
  import {
27
27
  AUDIO_GROUP_RENDER_ID_ATTR,
28
28
  COLOR_GRADING_SOURCE_HIDDEN_ATTR,
@@ -52,7 +52,7 @@ import {
52
52
  shiftRateLane,
53
53
  sourceTimeAt,
54
54
  timeAtSourceTime
55
- } from "./chunk-L6TT37IY.js";
55
+ } from "./chunk-SHLFJFPM.js";
56
56
  import {
57
57
  chromeMajorCeiling,
58
58
  exceedsChromeCeiling
@@ -4,10 +4,15 @@ import { dirname as __hf_dirname } from "node:path";
4
4
  var require = __hf_createRequire(import.meta.url);
5
5
  var __filename = __hf_fileURLToPath(import.meta.url);
6
6
  var __dirname = __hf_dirname(__filename);
7
+ import {
8
+ refreshIfNeeded
9
+ } from "./chunk-SHB5VDMH.js";
7
10
  import {
8
11
  buildAuthHeaders,
12
+ isAuthError,
13
+ isTokenExpired,
9
14
  tryResolveCredential
10
- } from "./chunk-DNXD7TOA.js";
15
+ } from "./chunk-I465DBM6.js";
11
16
  import {
12
17
  CSS_URL_RE,
13
18
  isNonRelativeUrl,
@@ -191,6 +196,36 @@ function getUploadHeaders(data, uploadUrl, contentType, archiveByteLength) {
191
196
  async function readJson(response) {
192
197
  return response.clone().json().catch(() => null);
193
198
  }
199
+ var CredentialRejectedError = class extends Error {
200
+ };
201
+ async function metadataRequestError(response, fallback) {
202
+ const message = await readErrorMessage(response, fallback);
203
+ return response.status === 401 ? new CredentialRejectedError(message) : new Error(message);
204
+ }
205
+ var LOGIN_EXPIRED = "Your login expired. Run hyperframes auth login, then publish again.";
206
+ var LOGIN_CHANGED = "Your login changed during publish. Run publish again.";
207
+ var API_KEY_ENV_VAR = { env: "HEYGEN_API_KEY", env_alias: "HYPERFRAMES_API_KEY" };
208
+ function rejectedCredentialMessage(credential) {
209
+ if (credential.type === "api_key" && (credential.source === "env" || credential.source === "env_alias")) {
210
+ return `${API_KEY_ENV_VAR[credential.source]} was rejected. Fix or unset it, then publish again.`;
211
+ }
212
+ return LOGIN_EXPIRED;
213
+ }
214
+ async function resolvePublishCredential(checked) {
215
+ try {
216
+ const credential = checked === void 0 ? await tryResolveCredential() : checked;
217
+ if (!credential) return null;
218
+ const expired = credential.type === "oauth" && isTokenExpired(credential.expires_at, /* @__PURE__ */ new Date());
219
+ if (expired && !credential.refresh_token) throw new Error(LOGIN_EXPIRED);
220
+ return await refreshIfNeeded(expired ? { ...credential, refreshable: true } : credential);
221
+ } catch (error) {
222
+ if (isAuthError(error) && (error.code === "REFRESH_FAILED" || error.code === "LOGIN_EXPIRED")) {
223
+ throw new Error(LOGIN_EXPIRED);
224
+ }
225
+ if (isAuthError(error) && error.code === "LOGIN_CHANGED") throw new Error(LOGIN_CHANGED);
226
+ throw error;
227
+ }
228
+ }
194
229
  async function readErrorMessage(response, fallback) {
195
230
  const contentType = response.headers.get("content-type") || "";
196
231
  if (contentType.includes("application/json")) {
@@ -477,7 +512,7 @@ async function publishProjectArchiveDirect(apiBaseUrl, title, archive, isPublic,
477
512
  const payload = await readJson(response);
478
513
  const publishedProject = parsePublishedProjectResponse(payload);
479
514
  if (!response.ok || !publishedProject) {
480
- throw new Error(await readErrorMessage(response, "Failed to publish project"));
515
+ throw await metadataRequestError(response, "Failed to publish project");
481
516
  }
482
517
  return publishedProject;
483
518
  }
@@ -526,7 +561,7 @@ async function publishProjectArchiveStaged(apiBaseUrl, title, archive, isPublic,
526
561
  const uploadPayload = await readJson(uploadResponse);
527
562
  const stagedUpload = parseStagedUploadResponse(uploadPayload, archive.buffer.byteLength);
528
563
  if (!uploadResponse.ok || !stagedUpload) {
529
- throw new Error(await readErrorMessage(uploadResponse, "Failed to prepare project upload"));
564
+ throw await metadataRequestError(uploadResponse, "Failed to prepare project upload");
530
565
  }
531
566
  await uploadArchiveToPresignedUrl(stagedUpload, archive);
532
567
  const completeResponse = await fetchForPublish(
@@ -551,7 +586,7 @@ async function publishProjectArchiveStaged(apiBaseUrl, title, archive, isPublic,
551
586
  const completePayload = await readJson(completeResponse);
552
587
  const publishedProject = parsePublishedProjectResponse(completePayload);
553
588
  if (!completeResponse.ok || !publishedProject) {
554
- throw new Error(await readErrorMessage(completeResponse, "Failed to publish project"));
589
+ throw await metadataRequestError(completeResponse, "Failed to publish project");
555
590
  }
556
591
  return publishedProject;
557
592
  }
@@ -560,27 +595,38 @@ async function publishProjectArchive(projectDir, opts = {}) {
560
595
  const title = basename(projectDir);
561
596
  const archive = opts.archive ?? createPublishArchive(projectDir);
562
597
  const apiBaseUrl = getPublishApiBaseUrl();
563
- const credential = await tryResolveCredential();
598
+ const credential = await resolvePublishCredential(opts.credential);
564
599
  const authHeaders = credential ? buildAuthHeaders(credential) : {};
565
600
  const projectId = credential ? opts.projectId : void 0;
566
601
  const spaceId = credential ? opts.spaceId : void 0;
567
602
  const metadataHeaders = spaceId ? { ...authHeaders, "x-space-id": spaceId } : authHeaders;
568
- const result = await publishProjectArchiveStaged(
569
- apiBaseUrl,
570
- title,
571
- archive,
572
- isPublic,
573
- metadataHeaders,
574
- projectId
575
- ) ?? await publishProjectArchiveDirect(
576
- apiBaseUrl,
577
- title,
578
- archive,
579
- isPublic,
580
- metadataHeaders,
581
- projectId
582
- );
583
- if (credential) {
603
+ let result;
604
+ try {
605
+ result = await publishProjectArchiveStaged(
606
+ apiBaseUrl,
607
+ title,
608
+ archive,
609
+ isPublic,
610
+ metadataHeaders,
611
+ projectId
612
+ ) ?? await publishProjectArchiveDirect(
613
+ apiBaseUrl,
614
+ title,
615
+ archive,
616
+ isPublic,
617
+ metadataHeaders,
618
+ projectId
619
+ );
620
+ if (credential?.type === "oauth" && !result.claimed) {
621
+ throw new CredentialRejectedError("unclaimed publish");
622
+ }
623
+ } catch (error) {
624
+ if (error instanceof CredentialRejectedError && credential) {
625
+ throw new Error(rejectedCredentialMessage(credential));
626
+ }
627
+ throw error;
628
+ }
629
+ if (result.claimed) {
584
630
  writeProjectLink(projectDir, { projectId: result.projectId, url: result.url });
585
631
  }
586
632
  return result;
@@ -591,6 +637,8 @@ export {
591
637
  ensureProjectId,
592
638
  readTeamProject,
593
639
  writeTeamProject,
640
+ API_KEY_ENV_VAR,
641
+ resolvePublishCredential,
594
642
  rewriteHtmlAttributes,
595
643
  buildPublishFileMap,
596
644
  zipPublishFileMap,
@@ -16,7 +16,7 @@ import {
16
16
  import {
17
17
  DEFAULT_VP9_CPU_USED,
18
18
  renderProvenanceArgs
19
- } from "./chunk-DA5FLVIF.js";
19
+ } from "./chunk-IUBZ3DSO.js";
20
20
  import {
21
21
  loadOptionalPackage
22
22
  } from "./chunk-XT5P4QMO.js";
@@ -202,7 +202,7 @@ function inferInputKind(inputPath) {
202
202
  }
203
203
  async function probeMedia(inputPath) {
204
204
  const isImage = inferInputKind(inputPath) === "image";
205
- const engine = await import("./src-5DVUT7WJ.js");
205
+ const engine = await import("./src-QOQJLFDK.js");
206
206
  const meta = await engine.extractMediaMetadata(inputPath);
207
207
  if (isImage) {
208
208
  return { width: meta.width, height: meta.height, fps: 0, frameCount: 1 };
@@ -19,7 +19,7 @@ import {
19
19
  import {
20
20
  formatVariableValidationIssue,
21
21
  validateVariables
22
- } from "./chunk-I47W3MA3.js";
22
+ } from "./chunk-2WKWEB4T.js";
23
23
  import {
24
24
  extractCompositionMetadata
25
25
  } from "./chunk-FSLYPQ5Z.js";
@@ -6,8 +6,8 @@ var __filename = __hf_fileURLToPath(import.meta.url);
6
6
  var __dirname = __hf_dirname(__filename);
7
7
 
8
8
  // src/version.ts
9
- var VERSION = true ? "0.8.118" : "0.0.0-dev";
10
- var PRODUCER_VERSION = true ? "0.8.118" : "0.0.0-dev";
9
+ var VERSION = true ? "0.8.120" : "0.0.0-dev";
10
+ var PRODUCER_VERSION = true ? "0.8.120" : "0.0.0-dev";
11
11
 
12
12
  export {
13
13
  VERSION,
@@ -12,7 +12,7 @@ import {
12
12
  } from "./chunk-ZTZA4UWZ.js";
13
13
  import {
14
14
  getSystemMeta
15
- } from "./chunk-JPRW4XXE.js";
15
+ } from "./chunk-U7AMFQ6G.js";
16
16
  import {
17
17
  getInvocationId
18
18
  } from "./chunk-54HJ63Q2.js";
@@ -23,7 +23,7 @@ import {
23
23
  evaluateCanary,
24
24
  findCanary,
25
25
  parseCanaryOverride
26
- } from "./chunk-I47W3MA3.js";
26
+ } from "./chunk-2WKWEB4T.js";
27
27
  import {
28
28
  hostAnswers
29
29
  } from "./chunk-K4WIOZFP.js";
@@ -37,7 +37,7 @@ import {
37
37
  } from "./chunk-XUXGIA7H.js";
38
38
  import {
39
39
  VERSION
40
- } from "./chunk-JR27ESBU.js";
40
+ } from "./chunk-LIPKCOYU.js";
41
41
 
42
42
  // src/telemetry/transport.ts
43
43
  import { spawn } from "child_process";
@@ -9,6 +9,7 @@ import {
9
9
  dedupeClonedCompositionId,
10
10
  findTargetElement,
11
11
  isHTMLElement,
12
+ nextUniqueId,
12
13
  parseSourceDocument,
13
14
  patchElementInHtml,
14
15
  probeElementInSource,
@@ -20,20 +21,20 @@ import {
20
21
  splitElementInHtml,
21
22
  unwrapElementsFromHtml,
22
23
  wrapElementsInHtml
23
- } from "./chunk-D6YMMYSZ.js";
24
+ } from "./chunk-6ZX3YCCU.js";
24
25
  import {
25
26
  atomicTempPath,
26
27
  createFileAtomically,
27
28
  isAtomicTempPath,
28
29
  replaceFileAtomically
29
- } from "./chunk-WEATBQTR.js";
30
+ } from "./chunk-EOVYQ3IG.js";
30
31
  import {
31
32
  DEFAULT_TARGET_LUFS,
32
33
  absoluteLoudnessPlan,
33
34
  measureAudio,
34
35
  requiredFfmpeg,
35
36
  resolveLocalAudioPath
36
- } from "./chunk-R6BVKVII.js";
37
+ } from "./chunk-BKQXLO55.js";
37
38
  import {
38
39
  PROXY_PARAMS_VERSION,
39
40
  PROXY_PENDING_RETRY_AFTER_SECONDS,
@@ -59,7 +60,7 @@ import {
59
60
  shouldPrewarmProxy,
60
61
  waitForProxy,
61
62
  walkDir
62
- } from "./chunk-5AREBP56.js";
63
+ } from "./chunk-OWMGDQBZ.js";
63
64
  import {
64
65
  findTimelineScript,
65
66
  parseGsapScriptAcorn
@@ -80,7 +81,7 @@ import {
80
81
  motionPathPluginUrl,
81
82
  parseFps,
82
83
  sameInstant
83
- } from "./chunk-I47W3MA3.js";
84
+ } from "./chunk-2WKWEB4T.js";
84
85
  import {
85
86
  MagicString,
86
87
  VALID_CANVAS_RESOLUTIONS,
@@ -89,7 +90,7 @@ import {
89
90
  import {
90
91
  addScenePartsManifest,
91
92
  ensureHfIds
92
- } from "./chunk-7CXLMMUA.js";
93
+ } from "./chunk-5IABQ7OX.js";
93
94
  import {
94
95
  findStartTags,
95
96
  injectScriptsIntoHtml,
@@ -99,7 +100,7 @@ import {
99
100
  resolveRateSpec,
100
101
  sourceTimeAt,
101
102
  stripEmbeddedRuntimeScripts
102
- } from "./chunk-L6TT37IY.js";
103
+ } from "./chunk-SHLFJFPM.js";
103
104
  import {
104
105
  ProjectRootMissingError,
105
106
  folderGone,
@@ -5226,18 +5227,18 @@ import { createHash as createHash32 } from "crypto";
5226
5227
  import { existsSync as existsSync7, readFileSync as readFileSync10, statSync as statSync7 } from "fs";
5227
5228
  import { join as join12, resolve as resolve52 } from "path";
5228
5229
  import { execFile } from "child_process";
5229
- import { closeSync as closeSync32, openSync as openSync32, readFileSync as readFileSync11, rmSync as rmSync5, statSync as statSync8 } from "fs";
5230
- import { dirname as dirname52, join as join13, relative as relative4, sep as sep22 } from "path";
5230
+ import { readFileSync as readFileSync11, rmSync as rmSync5, statSync as statSync8 } from "fs";
5231
+ import { basename as basename22, dirname as dirname52, join as join13, relative as relative4, sep as sep22 } from "path";
5231
5232
  import { createHash as createHash5, randomBytes } from "crypto";
5232
5233
  import { existsSync as existsSync8 } from "fs";
5233
5234
  import { existsSync as existsSync9, readFileSync as readFileSync12, statSync as statSync9 } from "fs";
5234
5235
  import { join as join14, resolve as resolve6 } from "path";
5235
5236
  import { execFile as execFile2, spawn as spawn2 } from "child_process";
5236
5237
  import { promisify } from "util";
5237
- import { closeSync as closeSync4, constants as constants3, fstatSync as fstatSync3, openSync as openSync4, readSync } from "fs";
5238
+ import { closeSync as closeSync32, constants as constants3, fstatSync as fstatSync3, openSync as openSync32, readSync } from "fs";
5238
5239
  import { streamSSE as streamSSE2 } from "hono/streaming";
5239
5240
  import { existsSync as existsSync10 } from "fs";
5240
- import { basename as basename22, dirname as dirname6, extname as extname2, join as join15, posix } from "path";
5241
+ import { basename as basename3, dirname as dirname6, extname as extname2, join as join15, posix } from "path";
5241
5242
  import { existsSync as existsSync11, readFileSync as readFileSync13 } from "fs";
5242
5243
  import { homedir as homedir2 } from "os";
5243
5244
  import { join as join16 } from "path";
@@ -6021,6 +6022,21 @@ function foldElementPatches(originalContent, patches) {
6021
6022
  return { content, matched };
6022
6023
  }
6023
6024
  var PATCH_CONFLICT_ATTEMPTS = 3;
6025
+ var ID_ATTRIBUTE = /[\s"'/]id\s*=\s*(?=(?:"([^"]*)"|'([^']*)'|([^\s"'=<>`]+)))/gi;
6026
+ function projectHtmlIds(projectDir) {
6027
+ const ids = /* @__PURE__ */ new Set();
6028
+ for (const rel of walkDir(projectDir)) {
6029
+ if (!rel.endsWith(".html") || isInHiddenOrVendorDir(rel)) continue;
6030
+ let html;
6031
+ try {
6032
+ html = readFileSync32(join52(projectDir, rel), "utf-8");
6033
+ } catch {
6034
+ continue;
6035
+ }
6036
+ for (const m of html.matchAll(ID_ATTRIBUTE)) ids.add(m[1] ?? m[2] ?? m[3] ?? "");
6037
+ }
6038
+ return ids;
6039
+ }
6024
6040
  function commitElementPatchBatches(projectDir, batches, writeFile2 = (path, content) => replaceFileAtomically(path, content, statSync32(path).mode), requestToken) {
6025
6041
  for (let attempt = 1; ; attempt += 1) {
6026
6042
  try {
@@ -6568,7 +6584,7 @@ async function prepareGsapMutationScript(c, res, firstMutation) {
6568
6584
  let block = extractGsapScriptBlock(html);
6569
6585
  if (!block && (firstMutation.type === "add" || firstMutation.type === "add-with-keyframes")) {
6570
6586
  const compId = html.match(/data-composition-id="([^"]+)"/)?.[1] ?? "main";
6571
- const { GSAP_CDN } = await import("./dist-5CN37P7P.js");
6587
+ const { GSAP_CDN } = await import("./dist-NP53GO3N.js");
6572
6588
  const bootstrap = [
6573
6589
  `<script src="${GSAP_CDN}"></script>`,
6574
6590
  "<script>",
@@ -7912,7 +7928,13 @@ function registerFileRoutes(api, adapter) {
7912
7928
  } catch {
7913
7929
  return c.json({ error: "not found" }, 404);
7914
7930
  }
7915
- const element = patchElementInHtml(originalContent, parsed.target, parsed.body.operations);
7931
+ const takenIds = parsed.body.operations.some((op) => op.type === "ensure-id") ? projectHtmlIds(ctx.project.dir) : void 0;
7932
+ const element = patchElementInHtml(
7933
+ originalContent,
7934
+ parsed.target,
7935
+ parsed.body.operations,
7936
+ takenIds
7937
+ );
7916
7938
  const { matched } = element;
7917
7939
  const patched = matched && isStudioFontFaceCss(fontFaceCss) ? ensureStudioFontFaceCss(element.html, fontFaceCss) : element.html;
7918
7940
  if (patched === originalContent) {
@@ -7922,6 +7944,7 @@ function registerFileRoutes(api, adapter) {
7922
7944
  ok: true,
7923
7945
  changed: false,
7924
7946
  matched,
7947
+ elementId: element.elementId,
7925
7948
  content: originalContent,
7926
7949
  path: ctx.filePath,
7927
7950
  version: version2
@@ -7945,6 +7968,7 @@ function registerFileRoutes(api, adapter) {
7945
7968
  ok: true,
7946
7969
  changed: true,
7947
7970
  matched,
7971
+ elementId: element.elementId,
7948
7972
  content: patched,
7949
7973
  path: ctx.filePath,
7950
7974
  version,
@@ -9830,7 +9854,22 @@ function freezeFrameMediaTime(input) {
9830
9854
  return input.mediaStart + sourceTimeAt(rate, Math.max(0, input.playhead - input.clipStart));
9831
9855
  }
9832
9856
  function freezeExtractArgs(src, mediaTime, output) {
9833
- return ["-y", "-ss", String(round3(mediaTime)), "-i", src, "-frames:v", "1", output];
9857
+ return [
9858
+ "-y",
9859
+ "-ss",
9860
+ String(round3(mediaTime)),
9861
+ "-i",
9862
+ src,
9863
+ "-frames:v",
9864
+ "1",
9865
+ "-c:v",
9866
+ "png",
9867
+ "-f",
9868
+ "image2",
9869
+ "-update",
9870
+ "1",
9871
+ output
9872
+ ];
9834
9873
  }
9835
9874
  var randomStillToken = () => randomBytes(4).toString("hex");
9836
9875
  function freezeStillFileName(clipId, playhead, token = randomStillToken()) {
@@ -9869,11 +9908,6 @@ function spans(el, time) {
9869
9908
  if (start === null || duration === null) return false;
9870
9909
  return time > start + EPSILON && time < start + duration - EPSILON;
9871
9910
  }
9872
- function uniqueId(document2, base) {
9873
- let id = base;
9874
- for (let n = 2; document2.getElementById(id); n++) id = `${base}-${n}`;
9875
- return id;
9876
- }
9877
9911
  function shiftTracks(document2, tracks, from, by) {
9878
9912
  for (const el of document2.querySelectorAll("[data-start]")) {
9879
9913
  if (el.hasAttribute("data-composition-id") || !tracks.has(trackOf(el))) continue;
@@ -9957,7 +9991,7 @@ function applyFreezeFrameToHtml(html, input) {
9957
9991
  shiftTracks(document2, tracks, input.playhead, hold);
9958
9992
  const leftHalf = findTargetElement(document2, input.target);
9959
9993
  if (!leftHalf?.parentElement) return null;
9960
- const freezeId = uniqueId(document2, `${video.getAttribute("id") || "clip"}-freeze`);
9994
+ const freezeId = nextUniqueId(document2, `${video.getAttribute("id") || "clip"}-freeze`);
9961
9995
  const still = buildStill(document2, leftHalf, {
9962
9996
  id: freezeId,
9963
9997
  imageSrc: input.imageSrc,
@@ -10001,15 +10035,38 @@ function readExpected(absPath, expectedVersion) {
10001
10035
  }
10002
10036
  return fileContentVersion(content) === expectedVersion ? { content } : { error: "file conflict", status: 409 };
10003
10037
  }
10004
- function claimStillNameBeforeExtracting(path) {
10038
+ function readFrame(path) {
10005
10039
  try {
10006
- closeSync32(openSync32(path, "wx"));
10040
+ return readFileSync11(path);
10041
+ } catch (error) {
10042
+ if (error.code === "ENOENT") return null;
10043
+ throw error;
10044
+ }
10045
+ }
10046
+ function publishStill(path, frame) {
10047
+ try {
10048
+ createFileAtomically(path, frame);
10007
10049
  return true;
10008
10050
  } catch (error) {
10009
10051
  if (error.code === "EEXIST") return false;
10010
10052
  throw error;
10011
10053
  }
10012
10054
  }
10055
+ async function extractThenPublishWhole(extract, mediaPath, mediaTime, imagePath) {
10056
+ const unseenByHistory = atomicTempPath(imagePath);
10057
+ try {
10058
+ const extracted = await extract(freezeExtractArgs(mediaPath, mediaTime, unseenByHistory));
10059
+ const frame = extracted.ok ? readFrame(unseenByHistory) : null;
10060
+ if (!frame?.length) {
10061
+ const reason = extracted.ok ? "no frame at this time" : extracted.error ?? "ffmpeg failed";
10062
+ return { error: `Could not extract the frame: ${reason}`, status: 500 };
10063
+ }
10064
+ if (publishStill(imagePath, frame)) return null;
10065
+ return { error: `freeze still already exists: ${basename22(imagePath)}`, status: 409 };
10066
+ } finally {
10067
+ rmSync5(unseenByHistory, { force: true });
10068
+ }
10069
+ }
10013
10070
  async function extractStill(projectDir, absPath, source, playhead, tools) {
10014
10071
  const fileDir = dirname52(absPath);
10015
10072
  const mediaPath = pinWithinProject(projectDir, relative4(projectDir, join13(fileDir, source.src)));
@@ -10021,15 +10078,13 @@ async function extractStill(projectDir, absPath, source, playhead, tools) {
10021
10078
  if (!imagePath || dirname52(imagePath) !== freezeDir) {
10022
10079
  return { error: `forbidden freeze path: ${fileName}`, status: 403 };
10023
10080
  }
10024
- if (!claimStillNameBeforeExtracting(imagePath))
10025
- return { error: `freeze still already exists: ${fileName}`, status: 409 };
10026
- const extracted = await tools.extract(freezeExtractArgs(mediaPath, source.mediaTime, imagePath));
10027
- const partialOrNoFrame = !extracted.ok || statSync8(imagePath).size === 0;
10028
- if (partialOrNoFrame) {
10029
- rmSync5(imagePath, { force: true });
10030
- const reason = extracted.ok ? "no frame at this time" : extracted.error ?? "ffmpeg failed";
10031
- return { error: `Could not extract the frame: ${reason}`, status: 500 };
10032
- }
10081
+ const failed = await extractThenPublishWhole(
10082
+ tools.extract,
10083
+ mediaPath,
10084
+ source.mediaTime,
10085
+ imagePath
10086
+ );
10087
+ if (failed) return failed;
10033
10088
  const depth = relative4(projectDir, fileDir).split(sep22).filter(Boolean).length;
10034
10089
  const stillPath = `${FREEZE_DIR.join("/")}/${fileName}`;
10035
10090
  return { imageSrc: `${"../".repeat(depth)}${stillPath}`, stillPath, imagePath };
@@ -10400,7 +10455,7 @@ function registerFontRoutes(api) {
10400
10455
  if (!located) return c.json({ error: "font not found" }, 404);
10401
10456
  let fd;
10402
10457
  try {
10403
- fd = openSync4(located.path, constants3.O_RDONLY | constants3.O_NOFOLLOW);
10458
+ fd = openSync32(located.path, constants3.O_RDONLY | constants3.O_NOFOLLOW);
10404
10459
  } catch {
10405
10460
  return c.json({ error: "font file not accessible" }, 404);
10406
10461
  }
@@ -10422,7 +10477,7 @@ function registerFontRoutes(api) {
10422
10477
  } catch {
10423
10478
  return c.json({ error: "failed to read font file" }, 500);
10424
10479
  } finally {
10425
- closeSync4(fd);
10480
+ closeSync32(fd);
10426
10481
  }
10427
10482
  });
10428
10483
  }
@@ -10580,7 +10635,7 @@ function containsNullByte(path) {
10580
10635
  return path.includes("\0");
10581
10636
  }
10582
10637
  function slugFileBase(path) {
10583
- const name = basename22(path, extname2(path)).replace(/[^a-zA-Z0-9._-]+/g, "-").replace(/^-+|-+$/g, "");
10638
+ const name = basename3(path, extname2(path)).replace(/[^a-zA-Z0-9._-]+/g, "-").replace(/^-+|-+$/g, "");
10584
10639
  return name || "media";
10585
10640
  }
10586
10641
  function uniqueAssetPath(projectDir, assetPath, taken) {
@@ -10967,23 +11022,17 @@ function duplicateElementInHtml(source, target, newId, at) {
10967
11022
  if (duration === null || numericAttribute(element, "data-start") === null) {
10968
11023
  return { html: source, matched: false, newId: null };
10969
11024
  }
10970
- const uniqueId2 = nextUniqueId(document2, newId);
11025
+ const uniqueId = nextUniqueId(document2, newId);
10971
11026
  rippleElements(document2, element, at, duration, track);
10972
11027
  const clone = element.cloneNode(true);
10973
11028
  if (!isHTMLElement(clone)) return { html: source, matched: false, newId: null };
10974
- clone.setAttribute("id", uniqueId2);
11029
+ clone.setAttribute("id", uniqueId);
10975
11030
  dedupeClonedCompositionId(document2, clone);
10976
11031
  stripStableIds(clone);
10977
11032
  clone.setAttribute("data-start", String(at));
10978
11033
  element.parentElement.insertBefore(clone, element.nextSibling);
10979
11034
  const html = wrappedFragment ? document2.body.innerHTML || "" : document2.toString();
10980
- return { html: ensureHfIds(html), matched: true, newId: uniqueId2 };
10981
- }
10982
- function nextUniqueId(document2, newId) {
10983
- let uniqueId2 = newId;
10984
- let suffix = 2;
10985
- while (document2.getElementById(uniqueId2)) uniqueId2 = `${newId}-${suffix++}`;
10986
- return uniqueId2;
11035
+ return { html: ensureHfIds(html), matched: true, newId: uniqueId };
10987
11036
  }
10988
11037
  function rippleElements(document2, element, at, duration, track) {
10989
11038
  for (const candidate of Array.from(document2.querySelectorAll("[data-start][data-duration]"))) {
@@ -20,7 +20,7 @@ import {
20
20
  typeDirPath,
21
21
  updateRecord,
22
22
  withFigmaErrors
23
- } from "./chunk-KDI2GPBM.js";
23
+ } from "./chunk-UOKW7DPN.js";
24
24
  import {
25
25
  defineCommand
26
26
  } from "./chunk-S3S4TGEH.js";
@@ -221,7 +221,7 @@ var asset_default = defineCommand({
221
221
  rendered > 0 ? `(${results.length} nodes, ${rendered} rendered in 1 figma request)` : `(${results.length} nodes, all reused from cache \u2014 no figma request)`
222
222
  );
223
223
  }
224
- const { trackFigmaImport } = await import("./telemetry-CLPATL2D.js");
224
+ const { trackFigmaImport } = await import("./telemetry-5WHZVQFM.js");
225
225
  trackFigmaImport({
226
226
  phase: "asset",
227
227
  reused: results.every((r) => r.reused),
@@ -6,7 +6,7 @@ var __filename = __hf_fileURLToPath(import.meta.url);
6
6
  var __dirname = __hf_dirname(__filename);
7
7
  import {
8
8
  resolveCaptureBrowserGpuMode
9
- } from "./chunk-PZ3SCTYJ.js";
9
+ } from "./chunk-V5T6IA7D.js";
10
10
  import {
11
11
  requestCliExit
12
12
  } from "./chunk-PBN6GBJE.js";
@@ -15,7 +15,7 @@ import {
15
15
  } from "./chunk-PBN6GBJE.js";
16
16
  import {
17
17
  parseFps
18
- } from "./chunk-I47W3MA3.js";
18
+ } from "./chunk-2WKWEB4T.js";
19
19
 
20
20
  // src/utils/renderArgs.ts
21
21
  import { readFileSync } from "fs";
@@ -13,7 +13,7 @@ import {
13
13
  } from "./chunk-TVCRUG2S.js";
14
14
  import {
15
15
  getFreeDiskMb
16
- } from "./chunk-JPRW4XXE.js";
16
+ } from "./chunk-U7AMFQ6G.js";
17
17
  import {
18
18
  ensureBrowser,
19
19
  findBrowser
@@ -8,7 +8,7 @@ import {
8
8
  firstFrameColourArgs,
9
9
  hdrToSdrToneMapFilter,
10
10
  parseFirstFrameColour
11
- } from "./chunk-I47W3MA3.js";
11
+ } from "./chunk-2WKWEB4T.js";
12
12
  import {
13
13
  mkdirWithinProject,
14
14
  realProjectRoot,