hyperframes 0.8.179 → 0.8.180

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 (158) hide show
  1. package/dist/{add-2CCBND75.js → add-HUVEWSVU.js} +11 -11
  2. package/dist/{animatedGifPrep-S6XXOOXK.js → animatedGifPrep-V6GJQOEB.js} +5 -5
  3. package/dist/api.js +13 -13
  4. package/dist/{asset-7HOLVSD5.js → asset-ZGQHDMIO.js} +2 -2
  5. package/dist/{assetCataloger-MSAMR77T.js → assetCataloger-MZWCOV6C.js} +5 -5
  6. package/dist/{audio-356GVOLJ.js → audio-XDWHLNIW.js} +11 -11
  7. package/dist/{auth-YHI5VR4X.js → auth-VIV3M7S6.js} +1 -1
  8. package/dist/{autoUpdate-OP345EBV.js → autoUpdate-R32XDL42.js} +2 -2
  9. package/dist/{backgroundChecks-6NVELE25.js → backgroundChecks-A2N6EVCP.js} +3 -3
  10. package/dist/backgroundChecksWorker.js +3 -3
  11. package/dist/{batchRender-OOQYGH5A.js → batchRender-3AYDQRBI.js} +3 -3
  12. package/dist/{beats-DQH5SOHM.js → beats-2O423Z6Q.js} +4 -4
  13. package/dist/{benchmark-2W2NPNLJ.js → benchmark-YXP3PTZP.js} +8 -8
  14. package/dist/{browser-SCM75524.js → browser-M47BNOTJ.js} +3 -3
  15. package/dist/{bundleWithLocalizedFonts-4F6HKLMZ.js → bundleWithLocalizedFonts-GCIHOMIU.js} +2 -2
  16. package/dist/{capture-YRS6SZ6B.js → capture-BT2ZXN5P.js} +8 -8
  17. package/dist/{capture-ZBGAJYVH.js → capture-IV3Y2MT4.js} +2 -2
  18. package/dist/{captureCompositionFrame-Z33NWUED.js → captureCompositionFrame-BMZEKPOU.js} +9 -9
  19. package/dist/{catalog-MOSGL65T.js → catalog-GI6P22KI.js} +11 -11
  20. package/dist/{catch-up-TCAZFTMO.js → catch-up-QS6HUHAO.js} +4 -4
  21. package/dist/{check-QVXSTHZB.js → check-HE5E4Q7Q.js} +32 -32
  22. package/dist/{checkBrowser-NF2CMWYR.js → checkBrowser-BHLYP3YW.js} +28 -28
  23. package/dist/{chunk-WOXRCPJU.js → chunk-2JDLESMS.js} +1 -1
  24. package/dist/{chunk-HU4PBQGJ.js → chunk-2VJNKE7C.js} +1 -1
  25. package/dist/{chunk-5RS2FIZU.js → chunk-3QENZQSL.js} +1 -1
  26. package/dist/{chunk-VI7IQ2QF.js → chunk-3YXTFXT7.js} +7 -7
  27. package/dist/{chunk-PU33GPG4.js → chunk-4IEH6EAC.js} +1 -1
  28. package/dist/{chunk-AEWZDKFS.js → chunk-4J7DHVN2.js} +1 -1
  29. package/dist/{chunk-XX4ZYQR6.js → chunk-55P7GDT6.js} +1 -1
  30. package/dist/{chunk-RJIJWETG.js → chunk-65CLIHK2.js} +1 -1
  31. package/dist/{chunk-NTMCSIQB.js → chunk-7Z6AARJR.js} +2 -2
  32. package/dist/{chunk-ILLFG4RN.js → chunk-A3NFBMYX.js} +3 -3
  33. package/dist/{chunk-A2BB2XQU.js → chunk-AMX53HVX.js} +2 -2
  34. package/dist/{chunk-PLNQW2C6.js → chunk-BAZ5LCR3.js} +1 -1
  35. package/dist/{chunk-TINAVSGR.js → chunk-BI52RNRW.js} +1 -1
  36. package/dist/{chunk-N3U7WHQK.js → chunk-F5VMPELS.js} +5 -5
  37. package/dist/{chunk-MXNKK7HY.js → chunk-FCUTQM2P.js} +3 -3
  38. package/dist/{chunk-JRIXYXG3.js → chunk-G2ZMCNRN.js} +58 -26
  39. package/dist/{chunk-ORM7SJ7K.js → chunk-HFZ4UILX.js} +6 -6
  40. package/dist/{chunk-BGKZ37BC.js → chunk-IWTRHPTP.js} +2 -2
  41. package/dist/{chunk-VCDWVVDV.js → chunk-IZM562YJ.js} +3 -3
  42. package/dist/{chunk-3EJYUZHW.js → chunk-JBCU6NR5.js} +6 -6
  43. package/dist/{chunk-CW3VIQMZ.js → chunk-K3KANDZQ.js} +1 -1
  44. package/dist/{chunk-M5CJQ6EH.js → chunk-K7RGIADJ.js} +1 -1
  45. package/dist/{chunk-UOHQV6AV.js → chunk-KIO3R4QN.js} +1 -1
  46. package/dist/{chunk-DHKYJYOY.js → chunk-KZ3VI5K6.js} +3 -3
  47. package/dist/{chunk-FIAQ4J45.js → chunk-L527FLMV.js} +2 -2
  48. package/dist/{chunk-AHS5QYKF.js → chunk-LBQFLUIY.js} +1 -1
  49. package/dist/{chunk-DLF5KIBL.js → chunk-LL5VQ4WS.js} +2 -2
  50. package/dist/{chunk-F3GML67X.js → chunk-MPWLGNM2.js} +1 -1
  51. package/dist/{chunk-UWPUEI5U.js → chunk-MQOE5RE4.js} +1 -1
  52. package/dist/{chunk-C5XU53VP.js → chunk-NOXGG4C7.js} +9 -9
  53. package/dist/{chunk-Q73AGCTV.js → chunk-NXYBR4QX.js} +10 -10
  54. package/dist/{chunk-YH7VQAKX.js → chunk-OFY6JTZC.js} +2 -2
  55. package/dist/{chunk-BJJ3QF7T.js → chunk-OR5WCFWZ.js} +1 -1
  56. package/dist/{chunk-BNGRVR3Y.js → chunk-Q2ASTBSG.js} +4 -4
  57. package/dist/{chunk-COK5OUBX.js → chunk-R46P7TGY.js} +1 -1
  58. package/dist/{chunk-XSQWXUK2.js → chunk-RGXAN3YU.js} +1 -1
  59. package/dist/{chunk-ZAJO3YCQ.js → chunk-RXQHSGAQ.js} +2 -2
  60. package/dist/{chunk-A3RUVTGB.js → chunk-S3RYRF3W.js} +1 -1
  61. package/dist/{chunk-M2DZX2DP.js → chunk-SEMOZNVE.js} +1 -1
  62. package/dist/{chunk-BW2UQR4A.js → chunk-ST2ARHQ5.js} +5 -5
  63. package/dist/{chunk-AFKVI7FJ.js → chunk-TO6JNTML.js} +1 -1
  64. package/dist/{chunk-52L2L46Q.js → chunk-ULWZYLCV.js} +1 -1
  65. package/dist/{chunk-FTWOVWHR.js → chunk-UVEQLDKB.js} +2 -2
  66. package/dist/{chunk-LBRJKTVY.js → chunk-V6MQP32U.js} +2 -2
  67. package/dist/{chunk-IHWI3KZY.js → chunk-VARUKXOZ.js} +3 -3
  68. package/dist/{chunk-5HZAIPHY.js → chunk-VE3OKVSD.js} +1 -1
  69. package/dist/{chunk-OXP77SHD.js → chunk-VKMP3IVR.js} +1 -1
  70. package/dist/{chunk-VU4JLRNH.js → chunk-W4SLIGGM.js} +2 -25
  71. package/dist/{chunk-32GKQ73S.js → chunk-WUQUR33W.js} +1 -1
  72. package/dist/{chunk-IE6O2VXV.js → chunk-XH262OWN.js} +1 -1
  73. package/dist/{chunk-OINJILMB.js → chunk-XO6CWU7D.js} +1 -1
  74. package/dist/{chunk-MK6D6HVT.js → chunk-Y5APFFMD.js} +1 -1
  75. package/dist/{chunk-LO4DHZLH.js → chunk-ZJPCQBU7.js} +3 -3
  76. package/dist/{clean-SJ2UIDKG.js → clean-TQOW24OF.js} +13 -13
  77. package/dist/cli.js +53 -53
  78. package/dist/{cloud-DH7QGNPZ.js → cloud-7TOVPUMY.js} +4 -4
  79. package/dist/{cloudrun-ZA2ZH2VZ.js → cloudrun-2BKGY53X.js} +4 -4
  80. package/dist/{compare-5JNN5BHX.js → compare-WDV3Q6WC.js} +23 -23
  81. package/dist/{compiler-CQ6OKYT5.js → compiler-U3W6CJW7.js} +2 -2
  82. package/dist/{component-LJQWLOXZ.js → component-U66GBIUO.js} +3 -3
  83. package/dist/{compositions-UILNO2RF.js → compositions-Y63YGLCE.js} +9 -9
  84. package/dist/{delete-WIO2MDPB.js → delete-TBAIAD7M.js} +2 -2
  85. package/dist/{deploy-BUEYC7MP.js → deploy-BIWOSWS3.js} +1 -1
  86. package/dist/{dist-MHJYD5IZ.js → dist-VO7OXOFK.js} +2 -2
  87. package/dist/{doctor-5G2RXBQX.js → doctor-GC4REGB6.js} +9 -9
  88. package/dist/{events-BXODXMJ6.js → events-4NMQVUZR.js} +2 -2
  89. package/dist/{events-2LHNVY2F.js → events-PUUP24FT.js} +3 -3
  90. package/dist/{feedback-57END2CW.js → feedback-BIDXK7TE.js} +6 -6
  91. package/dist/{ffmpeg-64E4VH6W.js → ffmpeg-2VJDEWQQ.js} +5 -5
  92. package/dist/{figma-O5MO4GF5.js → figma-THMXYLMU.js} +3 -3
  93. package/dist/fontLocalizeCli.js +7 -7
  94. package/dist/{get-OEWPJ4HH.js → get-5T4B7ERH.js} +2 -2
  95. package/dist/{gpuPolicy-IGZOHHMX.js → gpuPolicy-GLUATV5I.js} +5 -5
  96. package/dist/{grade-compare-PG2UOMHO.js → grade-compare-2A65YEHZ.js} +24 -24
  97. package/dist/{help-44J4SQTE.js → help-JFBDXFRC.js} +1 -1
  98. package/dist/{history-CUA53AOE.js → history-OJEWFWMS.js} +6 -6
  99. package/dist/hyperframe-runtime.js +54 -54
  100. package/dist/hyperframe.manifest.json +1 -1
  101. package/dist/hyperframe.runtime.iife.js +54 -54
  102. package/dist/hyperframes-player.global.js +1 -1
  103. package/dist/{info-UDXYDQVK.js → info-KJZBU3SZ.js} +7 -7
  104. package/dist/{init-CVT6HLW2.js → init-6V4ELU4Z.js} +25 -25
  105. package/dist/{inspect-6F72RJQG.js → inspect-WGBZZUZU.js} +24 -24
  106. package/dist/{installer-ADKWK4I4.js → installer-EPRSH6QI.js} +4 -4
  107. package/dist/{keyframes-GJ7EEWW2.js → keyframes-57LYKC2M.js} +6 -6
  108. package/dist/{lambda-WFSBYU6U.js → lambda-5P5X2X5E.js} +6 -6
  109. package/dist/{layout-SASENZOG.js → layout-PM2VAUT2.js} +24 -24
  110. package/dist/{lint-JX57B52X.js → lint-DXS6QRYZ.js} +6 -6
  111. package/dist/{list-WG7NTE63.js → list-6IBSX7FU.js} +2 -2
  112. package/dist/{login-3NFLD65G.js → login-RY3PWK44.js} +4 -4
  113. package/dist/{manager-BKHRATMY.js → manager-N3COY6BJ.js} +6 -6
  114. package/dist/{media-treatment-QI5F2SMU.js → media-treatment-3HEZR7ZS.js} +11 -11
  115. package/dist/{models-TXURF3J6.js → models-FEULJWSX.js} +9 -9
  116. package/dist/{motionShot-HRM6NMT4.js → motionShot-BZTEIZEO.js} +12 -12
  117. package/dist/{normalize-audio-IEKL43N4.js → normalize-audio-O4X4LPLK.js} +4 -4
  118. package/dist/{open-GU3I75TB.js → open-H3MX4TI2.js} +11 -11
  119. package/dist/{parakeetRunner-S2QI3PCA.js → parakeetRunner-5ABMPCI6.js} +10 -10
  120. package/dist/{pipeline-OO2MYYIV.js → pipeline-RJ4DOVWX.js} +6 -6
  121. package/dist/{play-VL2WQCT3.js → play-3PBKEZIX.js} +16 -16
  122. package/dist/{preflight-GBPRLIM6.js → preflight-3RABQJT3.js} +6 -6
  123. package/dist/{present-YWSFX5CH.js → present-6SNRG3GI.js} +12 -12
  124. package/dist/{preview-SMG6GXLY.js → preview-LSDFCJ3H.js} +16 -16
  125. package/dist/{producer-67RIQCWZ.js → producer-SUZDRXHJ.js} +1 -1
  126. package/dist/{projectConfig-NQQDEDAK.js → projectConfig-5QCNTGQT.js} +6 -6
  127. package/dist/{publication-7DW4IJPC.js → publication-2QT7VVE2.js} +2 -2
  128. package/dist/{publish-FJKJ74IF.js → publish-53EBL7OO.js} +7 -7
  129. package/dist/{remove-background-HO2NBZCJ.js → remove-background-4G4MX5WK.js} +7 -7
  130. package/dist/{render-5TTZDI5N.js → render-75CRB3BW.js} +3 -3
  131. package/dist/{render-DH4CGGLO.js → render-RXKUYTYI.js} +8 -8
  132. package/dist/{render-MB7PW2YQ.js → render-SKY6FKYB.js} +25 -25
  133. package/dist/{render-batch-4RPH66OX.js → render-batch-CEVWUYBP.js} +3 -3
  134. package/dist/{resolver-UW6NYBJA.js → resolver-4ICE2AT6.js} +4 -4
  135. package/dist/{sherpa-LVXRZGE3.js → sherpa-TMX3WBTM.js} +9 -9
  136. package/dist/{skills-NDWQPEUD.js → skills-MCWFAGIP.js} +5 -5
  137. package/dist/{skillsUpdateCheck-HZVZ3IUU.js → skillsUpdateCheck-NXOI35BW.js} +3 -3
  138. package/dist/{snapshot-MCHWMAPH.js → snapshot-ESZMKQ6J.js} +77 -60
  139. package/dist/{src-E34ZBMAS.js → src-GYYWBQXJ.js} +6 -6
  140. package/dist/{src-XRFOS5LP.js → src-XRTZOBO5.js} +4 -4
  141. package/dist/{staticProjectServer-COEAKTGH.js → staticProjectServer-GYPUQGI7.js} +12 -12
  142. package/dist/studio/assets/{hyperframes-player-C0SyMC21.js → hyperframes-player-1wdLVP-x.js} +1 -1
  143. package/dist/studio/assets/{index-DHUassFP.js → index-CaWPPTQ1.js} +1 -1
  144. package/dist/studio/assets/{index-ueMRyAJ2.js → index-mdtW0Ug-.js} +4 -4
  145. package/dist/studio/index.html +1 -1
  146. package/dist/{studio-api-455XWQPD.js → studio-api-IXGX5ZFI.js} +6 -6
  147. package/dist/{studioServer-XK5N6PIB.js → studioServer-XVGYU6O3.js} +41 -41
  148. package/dist/{telemetry-DD5ZIBOK.js → telemetry-E355EUDZ.js} +3 -3
  149. package/dist/{timeline-MJJEX5CU.js → timeline-VWH6WSD7.js} +14 -14
  150. package/dist/{tokens-AKUZMYRE.js → tokens-IOAVF4UI.js} +2 -2
  151. package/dist/{transcribe-ZQI5P2LH.js → transcribe-EGUXJGD4.js} +14 -14
  152. package/dist/{transcribe-ER7GGF4L.js → transcribe-EJA7OOHH.js} +8 -8
  153. package/dist/{updateCheck-GYFCXFWR.js → updateCheck-U2CVTKPF.js} +2 -2
  154. package/dist/{upgrade-UNWHMZP5.js → upgrade-CWEKQ4JO.js} +2 -2
  155. package/dist/{urlDownloader-QF7EBQC2.js → urlDownloader-DY5BLAFA.js} +4 -4
  156. package/dist/{validate-32CQZFNZ.js → validate-XOMNMKD6.js} +18 -18
  157. package/dist/{video-2KGC3RIQ.js → video-22NN6OEH.js} +5 -5
  158. package/package.json +1 -1
@@ -14,7 +14,7 @@ import {
14
14
  } from "./chunk-AWDFDFI3.js";
15
15
  import {
16
16
  isBlockedNetworkHost
17
- } from "./chunk-VU4JLRNH.js";
17
+ } from "./chunk-W4SLIGGM.js";
18
18
  import {
19
19
  DOMParser,
20
20
  parseHTML
@@ -16,7 +16,7 @@ import {
16
16
  } from "./chunk-5ETJX6WM.js";
17
17
  import {
18
18
  runEnvironmentChecks
19
- } from "./chunk-UWPUEI5U.js";
19
+ } from "./chunk-MQOE5RE4.js";
20
20
  import {
21
21
  getAvailableMemoryMb,
22
22
  getFreeDiskMb,
@@ -32,21 +32,21 @@ import {
32
32
  import {
33
33
  getUpdateMeta,
34
34
  withMeta
35
- } from "./chunk-HU4PBQGJ.js";
35
+ } from "./chunk-2VJNKE7C.js";
36
36
  import {
37
37
  CONFIG_PATH,
38
38
  withFileLock
39
39
  } from "./chunk-XUXGIA7H.js";
40
40
  import {
41
41
  VERSION
42
- } from "./chunk-DLF5KIBL.js";
42
+ } from "./chunk-LL5VQ4WS.js";
43
43
  import {
44
44
  OPTIONAL_PACKAGES,
45
45
  installedOptionalPackageVersion
46
46
  } from "./chunk-3DKN5WKL.js";
47
47
  import {
48
48
  resolveExtractCacheDir
49
- } from "./chunk-VU4JLRNH.js";
49
+ } from "./chunk-W4SLIGGM.js";
50
50
  import {
51
51
  normalizeErrorMessage
52
52
  } from "./chunk-KNU5COPB.js";
@@ -232,7 +232,7 @@ function checkEnvironment() {
232
232
  return { ok: true, detail: parts.join(" \xB7 ") };
233
233
  }
234
234
  async function checkWhisper() {
235
- const { findWhisper, getInstallInstructions } = await import("./manager-BKHRATMY.js");
235
+ const { findWhisper, getInstallInstructions } = await import("./manager-N3COY6BJ.js");
236
236
  const result = findWhisper();
237
237
  if (result) {
238
238
  return { ok: true, detail: result.executablePath };
@@ -21,13 +21,13 @@ import {
21
21
  emitWords,
22
22
  getPreparedWavDurationSeconds,
23
23
  prepareWav
24
- } from "./chunk-DHKYJYOY.js";
24
+ } from "./chunk-KZ3VI5K6.js";
25
25
  import {
26
26
  stoppedByCancelSignal
27
- } from "./chunk-XSQWXUK2.js";
27
+ } from "./chunk-RGXAN3YU.js";
28
28
  import {
29
29
  verifies
30
- } from "./chunk-M2DZX2DP.js";
30
+ } from "./chunk-SEMOZNVE.js";
31
31
  import {
32
32
  PARAKEET_MODEL_LABEL,
33
33
  SHERPA_ERROR_PREFIX,
@@ -23,7 +23,7 @@ import {
23
23
  EncoderInterruptedError,
24
24
  encoderFailureError,
25
25
  prepareAnimatedGifInputs
26
- } from "./chunk-FIAQ4J45.js";
26
+ } from "./chunk-L527FLMV.js";
27
27
  import {
28
28
  BROWSER_GPU_NOT_SOFTWARE,
29
29
  CaptureFailure,
@@ -152,7 +152,7 @@ import {
152
152
  validateEngineConfigSnapshot,
153
153
  verifyDiskDrawElementSamples,
154
154
  writeCapturedFrame
155
- } from "./chunk-VU4JLRNH.js";
155
+ } from "./chunk-W4SLIGGM.js";
156
156
  import {
157
157
  assignBundledRuntimeCompositionIds,
158
158
  buildVariablesByCompScript,
@@ -165,7 +165,7 @@ import {
165
165
  isTemplateEntry,
166
166
  parsesAsScript,
167
167
  prepareFlattenedInnerRoot
168
- } from "./chunk-PU33GPG4.js";
168
+ } from "./chunk-4IEH6EAC.js";
169
169
  import {
170
170
  LOW_MEMORY_TOTAL_MB_THRESHOLD,
171
171
  getCgroupMemoryLimitMb,
@@ -191,7 +191,7 @@ import {
191
191
  resolveAbsoluteMediaStartSeconds,
192
192
  resolveAuthoredTimingWindow,
193
193
  toFps
194
- } from "./chunk-AHS5QYKF.js";
194
+ } from "./chunk-LBQFLUIY.js";
195
195
  import {
196
196
  COMPOSITION_SOURCE_URL,
197
197
  HF_COLOR_GRADING_ATTR,
@@ -219,7 +219,7 @@ import {
219
219
  shouldClampResolvedMediaDuration,
220
220
  sourceTimeAt,
221
221
  styleElementsFor
222
- } from "./chunk-PLNQW2C6.js";
222
+ } from "./chunk-BAZ5LCR3.js";
223
223
  import {
224
224
  MAX_AUDIO_GAIN
225
225
  } from "./chunk-UJKQWGFF.js";
@@ -13476,6 +13476,7 @@ var FFMPEG_VERSION_MISMATCH = "FFMPEG_VERSION_MISMATCH";
13476
13476
  var PLAN_HASH_MISMATCH = "PLAN_HASH_MISMATCH";
13477
13477
  var MISSING_PLAN_ARTIFACT = "MISSING_PLAN_ARTIFACT";
13478
13478
  var CHUNK_INDEX_OUT_OF_RANGE = "CHUNK_INDEX_OUT_OF_RANGE";
13479
+ var CHUNK_FRAME_RANGE_INVALID = "CHUNK_FRAME_RANGE_INVALID";
13479
13480
  var MISSING_RUNTIME_ENV_SNAPSHOT = "MISSING_RUNTIME_ENV_SNAPSHOT";
13480
13481
  var RenderChunkValidationError = class extends Error {
13481
13482
  code;
@@ -13727,7 +13728,8 @@ var DISTRIBUTED_RENDER_CAPABILITIES = Object.freeze({
13727
13728
  accepts: Object.freeze([PLAN_PROTOCOL_V1, PLAN_PROTOCOL_V2]),
13728
13729
  acceptsLegacyV1WithoutDescriptor: true
13729
13730
  })
13730
- })
13731
+ }),
13732
+ chunkFrameRange: true
13731
13733
  });
13732
13734
  function getDistributedRenderCapabilities() {
13733
13735
  return DISTRIBUTED_RENDER_CAPABILITIES;
@@ -14441,6 +14443,18 @@ function audioCutForChunk(grid, chunks, index, fps) {
14441
14443
  const durationSeconds = end === grid.packetCount ? null : cutSeconds(end) - (seekSeconds ?? 0);
14442
14444
  return { seekSeconds, durationSeconds, firstPacket: first, packetCount: end - first };
14443
14445
  }
14446
+ function chunksWithSubRange(chunks, index, range) {
14447
+ const slice = chunks[index];
14448
+ const parts = [
14449
+ { startFrame: slice.startFrame, endFrame: range.startFrame },
14450
+ range,
14451
+ { startFrame: range.endFrame, endFrame: slice.endFrame }
14452
+ ].filter((part) => part.endFrame > part.startFrame);
14453
+ const split = [...chunks.slice(0, index), ...parts, ...chunks.slice(index + 1)].map(
14454
+ (chunk, i) => ({ index: i, startFrame: chunk.startFrame, endFrame: chunk.endFrame })
14455
+ );
14456
+ return { chunks: split, index: range.startFrame > slice.startFrame ? index + 1 : index };
14457
+ }
14444
14458
  async function probeAacPacketGrid(audioPath) {
14445
14459
  const probe = await runFfprobeJson([
14446
14460
  "-v",
@@ -15195,7 +15209,7 @@ async function buildLocalExecutionPlan(projectDir, config, executionPlanDir, opt
15195
15209
  if (probeResult.fileServer) closeFileServerSafely(probeResult.fileServer, "plan", log);
15196
15210
  if (probeResult.probeSession) {
15197
15211
  try {
15198
- const { closeCaptureSession: closeCaptureSession2 } = await import("./src-XRFOS5LP.js");
15212
+ const { closeCaptureSession: closeCaptureSession2 } = await import("./src-XRTZOBO5.js");
15199
15213
  await closeCaptureSession2(probeResult.probeSession);
15200
15214
  } catch (err) {
15201
15215
  log.warn("[plan] probe session close failed", {
@@ -16789,7 +16803,7 @@ function startServer(options = {}) {
16789
16803
  });
16790
16804
  async function shutdown(signal) {
16791
16805
  log.info(`Received ${signal}, shutting down`);
16792
- const { drainBrowserPool } = await import("./src-XRFOS5LP.js");
16806
+ const { drainBrowserPool } = await import("./src-XRTZOBO5.js");
16793
16807
  await drainBrowserPool().catch(() => {
16794
16808
  });
16795
16809
  const handle = await Promise.race([
@@ -17729,11 +17743,12 @@ function cfrRateControlArgs(locked) {
17729
17743
  }
17730
17744
  return ["-preset", preset.preset, "-crf", String(locked.crf ?? preset.quality)];
17731
17745
  }
17732
- async function assemble(planDir, chunkPaths, audioPath, outputPath, options) {
17746
+ async function assemble(planDir, chunkOutputs, audioPath, outputPath, options) {
17733
17747
  const start = Date.now();
17734
17748
  const log = options?.logger ?? defaultLogger;
17735
17749
  const cfr = options?.cfr === true;
17736
- const plan2 = readAssemblePlan(planDir, chunkPaths);
17750
+ const plan2 = readAssemblePlan(planDir, chunkOutputs);
17751
+ const chunkPaths = chunkOutputs.flat();
17737
17752
  if (plan2.dimensions.format === "png-sequence") {
17738
17753
  return mergePngFrameDirs(chunkPaths, outputPath, plan2.totalFrames, audioPath, start);
17739
17754
  }
@@ -17816,7 +17831,12 @@ function readAssemblePlan(planDir, chunkPaths) {
17816
17831
  `[assemble] chunkPaths length (${chunkPaths.length}) does not match chunks.json length (${chunks.length}). Adapters must pass one path per chunk, ordered by index.`
17817
17832
  );
17818
17833
  }
17819
- for (const path of chunkPaths) {
17834
+ for (const [index, entry] of chunkPaths.entries()) {
17835
+ if (typeof entry !== "string" && entry.length === 0) {
17836
+ throw new Error(`[assemble] chunk ${index} has an empty list of parts`);
17837
+ }
17838
+ }
17839
+ for (const path of chunkPaths.flat()) {
17820
17840
  if (!existsSync26(path)) {
17821
17841
  throw new Error(`[assemble] chunk path does not exist: ${path}`);
17822
17842
  }
@@ -18019,6 +18039,17 @@ function validatePlanVideosForChunk(value) {
18019
18039
  );
18020
18040
  }
18021
18041
  }
18042
+ function resolveChunkFrameRange(slice, chunkIndex, frameRange) {
18043
+ if (frameRange === void 0) return { startFrame: slice.startFrame, endFrame: slice.endFrame };
18044
+ const { startFrame, endFrame } = frameRange;
18045
+ if (!Number.isSafeInteger(startFrame) || !Number.isSafeInteger(endFrame) || startFrame < slice.startFrame || endFrame > slice.endFrame || endFrame <= startFrame) {
18046
+ throw new RenderChunkValidationError(
18047
+ CHUNK_FRAME_RANGE_INVALID,
18048
+ `[renderChunk] frameRange ${JSON.stringify(frameRange)} must be a non-empty integer range inside chunk ${chunkIndex}'s slice [${slice.startFrame}, ${slice.endFrame})`
18049
+ );
18050
+ }
18051
+ return { startFrame, endFrame };
18052
+ }
18022
18053
  var distributedCaptureSessionDependencies = {
18023
18054
  createCaptureSession,
18024
18055
  assertSwiftShader,
@@ -18089,7 +18120,7 @@ function resolveLockedVp9CpuUsed(lockedEncoder) {
18089
18120
  if (lockedEncoder.encoder !== "libvpx-vp9-software") return void 0;
18090
18121
  return lockedEncoder.vp9CpuUsed ?? LEGACY_DISTRIBUTED_VP9_CPU_USED;
18091
18122
  }
18092
- async function renderChunk(planDir, chunkIndex, outputChunkPath) {
18123
+ async function renderChunk(planDir, chunkIndex, outputChunkPath, options) {
18093
18124
  const start = Date.now();
18094
18125
  const log = defaultLogger;
18095
18126
  const planJsonPath = join41(planDir, "plan.json");
@@ -18143,13 +18174,15 @@ async function renderChunk(planDir, chunkIndex, outputChunkPath) {
18143
18174
  if (slice === void 0) {
18144
18175
  throw new RenderChunkValidationError(CHUNK_INDEX_OUT_OF_RANGE, "[renderChunk] missing slice");
18145
18176
  }
18146
- const framesInChunk = slice.endFrame - slice.startFrame;
18147
- if (framesInChunk <= 0) {
18177
+ const sliceFrames = slice.endFrame - slice.startFrame;
18178
+ if (sliceFrames <= 0) {
18148
18179
  throw new RenderChunkValidationError(
18149
18180
  CHUNK_INDEX_OUT_OF_RANGE,
18150
- `[renderChunk] chunk ${chunkIndex} has non-positive frame count: ${framesInChunk}`
18181
+ `[renderChunk] chunk ${chunkIndex} has non-positive frame count: ${sliceFrames}`
18151
18182
  );
18152
18183
  }
18184
+ const range = resolveChunkFrameRange(slice, chunkIndex, options?.frameRange);
18185
+ const framesInChunk = range.endFrame - range.startFrame;
18153
18186
  const compiledDir = join41(planDir, "compiled");
18154
18187
  if (!existsSync27(compiledDir)) {
18155
18188
  throw new RenderChunkValidationError(
@@ -18214,10 +18247,7 @@ async function renderChunk(planDir, chunkIndex, outputChunkPath) {
18214
18247
  const deferredVideoFrames = planVideos ? await extractDeferredVideoFramesForChunk({
18215
18248
  planDir,
18216
18249
  planVideos,
18217
- frames: Array.from(
18218
- { length: slice.endFrame - slice.startFrame },
18219
- (_, i) => slice.startFrame + i
18220
- ),
18250
+ frames: Array.from({ length: framesInChunk }, (_, i) => range.startFrame + i),
18221
18251
  fps: { num: plan2.dimensions.fpsNum, den: plan2.dimensions.fpsDen },
18222
18252
  outputRoot: videoFramesDir,
18223
18253
  cfg,
@@ -18373,7 +18403,7 @@ async function renderChunk(planDir, chunkIndex, outputChunkPath) {
18373
18403
  abortSignal: void 0,
18374
18404
  assertNotAborted: () => {
18375
18405
  },
18376
- frameRange: { startFrame: slice.startFrame, endFrame: slice.endFrame }
18406
+ frameRange: range
18377
18407
  });
18378
18408
  const observedModes = new Set(capturePerfs.map((perf) => perf.captureMode));
18379
18409
  if (observedModes.size !== 1 || ![...observedModes].every(isCaptureMode)) {
@@ -18467,12 +18497,13 @@ async function renderChunk(planDir, chunkIndex, outputChunkPath) {
18467
18497
  });
18468
18498
  if (encoder.chunksCarryAudio) {
18469
18499
  const audioScratchPath = `${outputChunkPath}.audio.m4a`;
18500
+ const audioChunks = options?.frameRange ? chunksWithSubRange(chunks, chunkIndex, range) : { chunks, index: chunkIndex };
18470
18501
  await muxChunkWithAudio({
18471
18502
  videoPath: videoOnlyPath,
18472
18503
  audioPath: chunkAudioSource(planDir, chunkIndex, audioScratchPath),
18473
18504
  outputPath: outputChunkPath,
18474
- chunks,
18475
- chunkIndex,
18505
+ chunks: audioChunks.chunks,
18506
+ chunkIndex: audioChunks.index,
18476
18507
  fps: { num: plan2.dimensions.fpsNum, den: plan2.dimensions.fpsDen },
18477
18508
  timeoutMs: cfg.ffmpegProcessTimeout
18478
18509
  });
@@ -18501,8 +18532,8 @@ async function renderChunk(planDir, chunkIndex, outputChunkPath) {
18501
18532
  const perfPayload = {
18502
18533
  planHash: plan2.planHash,
18503
18534
  chunkIndex,
18504
- startFrame: slice.startFrame,
18505
- endFrame: slice.endFrame,
18535
+ startFrame: range.startFrame,
18536
+ endFrame: range.endFrame,
18506
18537
  framesEncoded,
18507
18538
  durationMs,
18508
18539
  planHashMs,
@@ -18531,6 +18562,7 @@ async function renderChunk(planDir, chunkIndex, outputChunkPath) {
18531
18562
  outputPath: outputChunkPath,
18532
18563
  outputKind,
18533
18564
  framesEncoded,
18565
+ frameRange: range,
18534
18566
  sha256,
18535
18567
  durationMs,
18536
18568
  planHashMs,
@@ -18547,12 +18579,12 @@ async function renderChunk(planDir, chunkIndex, outputChunkPath) {
18547
18579
  }
18548
18580
 
18549
18581
  // ../producer/src/services/distributed/planV2Execution.ts
18550
- async function renderChunkV2(planV2Dir, chunkIndex, outputChunkPath) {
18582
+ async function renderChunkV2(planV2Dir, chunkIndex, outputChunkPath, options) {
18551
18583
  const workRoot = mkdtempSync9(join42(tmpdir5(), "hf-plan-v2-chunk-"));
18552
18584
  const materializedPlanDir = join42(workRoot, "plan");
18553
18585
  try {
18554
18586
  materializePlanV2Target(planV2Dir, { role: "chunk", chunkIndex }, materializedPlanDir);
18555
- return await renderChunk(materializedPlanDir, chunkIndex, outputChunkPath);
18587
+ return await renderChunk(materializedPlanDir, chunkIndex, outputChunkPath, options);
18556
18588
  } finally {
18557
18589
  rmSync16(workRoot, { recursive: true, force: true });
18558
18590
  }
@@ -12,25 +12,25 @@ import {
12
12
  launchManagedBrowser,
13
13
  resolveManagedGpuMode,
14
14
  rethrowAfterBrowserCleanup
15
- } from "./chunk-52L2L46Q.js";
15
+ } from "./chunk-ULWZYLCV.js";
16
16
  import {
17
17
  pageNavigationTimeoutMs,
18
18
  windowsChromeCrashRemediation
19
- } from "./chunk-LO4DHZLH.js";
19
+ } from "./chunk-ZJPCQBU7.js";
20
20
  import {
21
21
  oneProcessOverPipe
22
22
  } from "./chunk-BRHI7EIA.js";
23
23
  import {
24
24
  resolveLocalBrowserGpuMode,
25
25
  resolveLocalWebGpu
26
- } from "./chunk-A2BB2XQU.js";
26
+ } from "./chunk-AMX53HVX.js";
27
27
  import {
28
28
  c
29
29
  } from "./chunk-ZTZA4UWZ.js";
30
30
  import {
31
31
  assertWebGpuAdapterAvailable,
32
32
  compositionRequiresWebGpu
33
- } from "./chunk-VU4JLRNH.js";
33
+ } from "./chunk-W4SLIGGM.js";
34
34
  import {
35
35
  normalizeErrorMessage
36
36
  } from "./chunk-KNU5COPB.js";
@@ -176,7 +176,7 @@ async function installPageFunctionGuard(page) {
176
176
  async function openSettledCompositionPage(html, url, options) {
177
177
  const viewport = resolveCompositionViewportFromHtml(html);
178
178
  const requiresWebGpu = compositionRequiresWebGpu(html);
179
- const answer = (await import("./staticProjectServer-COEAKTGH.js")).inProcessAnswer(url);
179
+ const answer = (await import("./staticProjectServer-GYPUQGI7.js")).inProcessAnswer(url);
180
180
  const noListen = answer !== void 0;
181
181
  let chromeBrowser;
182
182
  try {
@@ -203,7 +203,7 @@ async function launchCompositionBrowser(html, noListen, options) {
203
203
  const { ensureBrowser, findSystemBrowser } = await import("./manager-V2QCCPOJ.js");
204
204
  const browser = await ensureBrowser({ signal: options.signal });
205
205
  const puppeteer = await import("puppeteer-core");
206
- const { buildChromeArgs } = await import("./src-XRFOS5LP.js");
206
+ const { buildChromeArgs } = await import("./src-XRTZOBO5.js");
207
207
  const requestedGpuMode = options.browserGpuMode ?? resolveCliChromeGpuMode();
208
208
  const requiresWebGpu = compositionRequiresWebGpu(html);
209
209
  let softwareWebGpu = false;
@@ -12,12 +12,12 @@ import {
12
12
  ensureHfIds,
13
13
  mintHfId,
14
14
  walkCompositionDescendants
15
- } from "./chunk-PU33GPG4.js";
15
+ } from "./chunk-4IEH6EAC.js";
16
16
  import {
17
17
  isAllowedHtmlAttribute,
18
18
  isSafeAttributeValue,
19
19
  sanitizeRichTextChildren
20
- } from "./chunk-AHS5QYKF.js";
20
+ } from "./chunk-LBQFLUIY.js";
21
21
  import {
22
22
  decodedUrlPath,
23
23
  removeElementWithGsapCascade
@@ -7,7 +7,7 @@ var __dirname = __hf_dirname(__filename);
7
7
  import {
8
8
  getMimeType,
9
9
  injectMediaCodecMapIntoHtml
10
- } from "./chunk-3EJYUZHW.js";
10
+ } from "./chunk-JBCU6NR5.js";
11
11
  import {
12
12
  PROXY_VARIANT_CONFIG,
13
13
  ProxyCapacityError,
@@ -18,10 +18,10 @@ import {
18
18
  recordProxyRequest,
19
19
  resolveProxy,
20
20
  resolveProxyVariantRequest
21
- } from "./chunk-UOHQV6AV.js";
21
+ } from "./chunk-KIO3R4QN.js";
22
22
  import {
23
23
  resolveAutoProxy
24
- } from "./chunk-IE6O2VXV.js";
24
+ } from "./chunk-XH262OWN.js";
25
25
  import {
26
26
  decodeWellFormedEscapes
27
27
  } from "./chunk-BSQ7XANM.js";
@@ -19,7 +19,7 @@ import {
19
19
  splitElementInHtml,
20
20
  unwrapElementsFromHtml,
21
21
  wrapElementsInHtml
22
- } from "./chunk-BGKZ37BC.js";
22
+ } from "./chunk-IWTRHPTP.js";
23
23
  import {
24
24
  DEFAULT_TARGET_LUFS,
25
25
  absoluteLoudnessPlan,
@@ -54,7 +54,7 @@ import {
54
54
  scanProjectMediaCodecMap,
55
55
  shouldPrewarmProxy,
56
56
  waitForProxy
57
- } from "./chunk-UOHQV6AV.js";
57
+ } from "./chunk-KIO3R4QN.js";
58
58
  import {
59
59
  HistoryBusyError,
60
60
  MAX_WINDOW_IDLE_MS,
@@ -105,7 +105,7 @@ import {
105
105
  addScenePartsManifest,
106
106
  ensureHfIds,
107
107
  stampHfIdsInPlace
108
- } from "./chunk-PU33GPG4.js";
108
+ } from "./chunk-4IEH6EAC.js";
109
109
  import {
110
110
  PREVIEW_PROXY_BOX_PARAM,
111
111
  formatPreviewProxyBox,
@@ -114,7 +114,7 @@ import {
114
114
  motionPathPluginUrl,
115
115
  parseFps,
116
116
  parsePreviewProxyBox
117
- } from "./chunk-AHS5QYKF.js";
117
+ } from "./chunk-LBQFLUIY.js";
118
118
  import {
119
119
  AFTER_FONTS_SCRIPT_TYPE,
120
120
  RUNTIME_BOOTSTRAP_ATTR,
@@ -128,7 +128,7 @@ import {
128
128
  resolveRateSpec,
129
129
  sourceTimeAt,
130
130
  stripEmbeddedRuntimeScripts
131
- } from "./chunk-PLNQW2C6.js";
131
+ } from "./chunk-BAZ5LCR3.js";
132
132
  import {
133
133
  HTML_ATTRIBUTE_ENTITIES,
134
134
  MagicString,
@@ -5499,7 +5499,7 @@ async function prepareGsapMutationScript(c, res, firstMutation) {
5499
5499
  let block = extractGsapScriptBlock(html);
5500
5500
  if (!block && (firstMutation.type === "add" || firstMutation.type === "add-with-keyframes")) {
5501
5501
  const compId = html.match(/data-composition-id="([^"]+)"/)?.[1] ?? "main";
5502
- const { GSAP_CDN } = await import("./dist-MHJYD5IZ.js");
5502
+ const { GSAP_CDN } = await import("./dist-VO7OXOFK.js");
5503
5503
  const bootstrap = [
5504
5504
  `<script src="${GSAP_CDN}"></script>`,
5505
5505
  "<script>",
@@ -7,7 +7,7 @@ var __dirname = __hf_dirname(__filename);
7
7
 
8
8
  // src/utils/producer.ts
9
9
  async function loadProducer() {
10
- return await import("./src-E34ZBMAS.js");
10
+ return await import("./src-GYYWBQXJ.js");
11
11
  }
12
12
 
13
13
  export {
@@ -29,7 +29,7 @@ import {
29
29
  } from "./chunk-XUXGIA7H.js";
30
30
  import {
31
31
  VERSION
32
- } from "./chunk-DLF5KIBL.js";
32
+ } from "./chunk-LL5VQ4WS.js";
33
33
  import {
34
34
  CANARIES,
35
35
  canaryEnvVar,
@@ -9,7 +9,7 @@ import {
9
9
  formatPreviewProxyBox,
10
10
  hdrToSdrToneMapFilter,
11
11
  parseFirstFrameColour
12
- } from "./chunk-AHS5QYKF.js";
12
+ } from "./chunk-LBQFLUIY.js";
13
13
  import {
14
14
  decodeAuthoredAttribute,
15
15
  scanHtmlOpeningTags
@@ -6,7 +6,7 @@ var __filename = __hf_fileURLToPath(import.meta.url);
6
6
  var __dirname = __hf_dirname(__filename);
7
7
  import {
8
8
  stoppedByCancelSignal
9
- } from "./chunk-XSQWXUK2.js";
9
+ } from "./chunk-RGXAN3YU.js";
10
10
  import {
11
11
  DEFAULT_MODEL,
12
12
  ensureModel,
@@ -14,12 +14,12 @@ import {
14
14
  hasFFmpeg,
15
15
  pinnedWhisperModel,
16
16
  sha256File
17
- } from "./chunk-M2DZX2DP.js";
17
+ } from "./chunk-SEMOZNVE.js";
18
18
  import {
19
19
  findFFmpeg,
20
20
  findFFprobe,
21
21
  getFFmpegInstallHint
22
- } from "./chunk-5RS2FIZU.js";
22
+ } from "./chunk-3QENZQSL.js";
23
23
  import {
24
24
  findWavChunk
25
25
  } from "./chunk-UOFAE5RF.js";
@@ -8,10 +8,10 @@ import {
8
8
  DEFAULT_VP9_CPU_USED,
9
9
  isHttpUrl,
10
10
  runFfmpeg
11
- } from "./chunk-VU4JLRNH.js";
11
+ } from "./chunk-W4SLIGGM.js";
12
12
  import {
13
13
  parseAnimatedGifMetadata
14
- } from "./chunk-AHS5QYKF.js";
14
+ } from "./chunk-LBQFLUIY.js";
15
15
  import {
16
16
  parseHTML
17
17
  } from "./chunk-SDYDNHEE.js";
@@ -9,7 +9,7 @@ import {
9
9
  parseStrictFiniteTimingNumber,
10
10
  resolveNaturalMediaTimelineDuration,
11
11
  resolveTimedImageDurationSeconds
12
- } from "./chunk-PLNQW2C6.js";
12
+ } from "./chunk-BAZ5LCR3.js";
13
13
  import {
14
14
  CANVAS_DIMENSIONS,
15
15
  isCompositionElement,
@@ -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.179" : "0.0.0-dev";
10
- var PRODUCER_VERSION = true ? "0.8.179" : "0.0.0-dev";
9
+ var VERSION = true ? "0.8.180" : "0.0.0-dev";
10
+ var PRODUCER_VERSION = true ? "0.8.180" : "0.0.0-dev";
11
11
 
12
12
  export {
13
13
  VERSION,
@@ -10,7 +10,7 @@ import {
10
10
  isDevice,
11
11
  isQuality,
12
12
  render
13
- } from "./chunk-IHWI3KZY.js";
13
+ } from "./chunk-VARUKXOZ.js";
14
14
 
15
15
  // src/api/removeBackground.ts
16
16
  import { resolve } from "path";
@@ -18,7 +18,7 @@ import {
18
18
  distroLabel,
19
19
  getFFmpegInstallHint,
20
20
  parseLddMissingLibs
21
- } from "./chunk-5RS2FIZU.js";
21
+ } from "./chunk-3QENZQSL.js";
22
22
  import {
23
23
  runCancellableProcess
24
24
  } from "./chunk-D3ZWBHZP.js";
@@ -6,25 +6,25 @@ var __filename = __hf_fileURLToPath(import.meta.url);
6
6
  var __dirname = __hf_dirname(__filename);
7
7
  import {
8
8
  resolveProject
9
- } from "./chunk-XX4ZYQR6.js";
9
+ } from "./chunk-55P7GDT6.js";
10
10
  import {
11
11
  serveStaticProjectHtml
12
- } from "./chunk-VCDWVVDV.js";
12
+ } from "./chunk-IZM562YJ.js";
13
13
  import {
14
14
  AUDIT_SEEK_OPTIONS,
15
15
  installPageFunctionGuard,
16
16
  seekCompositionTimeline,
17
17
  waitForCompositionFonts,
18
18
  waitForRuntimeReady
19
- } from "./chunk-ORM7SJ7K.js";
19
+ } from "./chunk-HFZ4UILX.js";
20
20
  import {
21
21
  gotoWhenSent,
22
22
  launchManagedBrowser,
23
23
  resolveManagedGpuMode
24
- } from "./chunk-52L2L46Q.js";
24
+ } from "./chunk-ULWZYLCV.js";
25
25
  import {
26
26
  pageNavigationTimeoutMs
27
- } from "./chunk-LO4DHZLH.js";
27
+ } from "./chunk-ZJPCQBU7.js";
28
28
  import {
29
29
  defineCommand
30
30
  } from "./chunk-S3S4TGEH.js";
@@ -38,7 +38,7 @@ import {
38
38
  import {
39
39
  printDeprecationNotice,
40
40
  withMeta
41
- } from "./chunk-HU4PBQGJ.js";
41
+ } from "./chunk-2VJNKE7C.js";
42
42
  import {
43
43
  normalizeErrorMessage
44
44
  } from "./chunk-KNU5COPB.js";
@@ -709,7 +709,7 @@ async function collectTweenBoundaries(page) {
709
709
  });
710
710
  }
711
711
  async function bundleProjectHtml(projectDir) {
712
- const { bundleToSingleHtml } = await import("./compiler-CQ6OKYT5.js");
712
+ const { bundleToSingleHtml } = await import("./compiler-U3W6CJW7.js");
713
713
  return bundleToSingleHtml(projectDir);
714
714
  }
715
715
  async function alignViewportToComposition(page, url) {
@@ -728,13 +728,13 @@ async function alignViewportToComposition(page, url) {
728
728
  async function runLayoutAudit(projectDir, opts) {
729
729
  const { ensureBrowser } = await import("./manager-V2QCCPOJ.js");
730
730
  const puppeteer = await import("puppeteer-core");
731
- const { buildChromeArgs } = await import("./src-XRFOS5LP.js");
731
+ const { buildChromeArgs } = await import("./src-XRTZOBO5.js");
732
732
  const {
733
733
  assertWebGpuAdapterAvailable,
734
734
  compositionRequiresWebGpu,
735
735
  resolveLocalBrowserGpuMode,
736
736
  resolveLocalWebGpu
737
- } = await import("./gpuPolicy-IGZOHHMX.js");
737
+ } = await import("./gpuPolicy-GLUATV5I.js");
738
738
  const html = await bundleProjectHtml(projectDir);
739
739
  const server = await serveStaticProjectHtml(
740
740
  projectDir,