@hyperframes/studio-server 0.8.176 → 0.8.178

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.
@@ -3,7 +3,7 @@ import {
3
3
  mkdirWithinProject,
4
4
  pinProjectRecord,
5
5
  realFilePath
6
- } from "./chunk-K56J3CL7.js";
6
+ } from "./chunk-QF7MFJJU.js";
7
7
 
8
8
  // src/history/projectHistory.ts
9
9
  import { randomUUID as randomUUID7 } from "crypto";
@@ -258,7 +258,7 @@ import { createHash as createHash2 } from "crypto";
258
258
  import { lstatSync, readFileSync as readFileSync3, readdirSync } from "fs";
259
259
  import { extname, isAbsolute as isAbsolute2, relative as relative2, resolve as resolve2, sep as sep2 } from "path";
260
260
  import { isAtomicTempPath } from "@hyperframes/core/atomic-file";
261
- import { PREVIEW_IGNORED_DIRS } from "@hyperframes/core/project-folders";
261
+ import { isProjectIgnoredDir } from "@hyperframes/core/project-folders";
262
262
  var SIGNATURE_TEXT_EXTENSIONS = /* @__PURE__ */ new Set([
263
263
  ".cjs",
264
264
  ".css",
@@ -284,7 +284,7 @@ function affectsProjectSignature(projectDir, changedPath) {
284
284
  if (isRenderOutput(projectDir, changedPath, readRenderOutputsOrNone(projectDir))) return false;
285
285
  const segments = relativePath.split(sep2);
286
286
  if (STUDIO_SIGNATURE_MANIFEST_PATHS.includes(segments.join("/"))) return true;
287
- return !segments.some((segment) => PREVIEW_IGNORED_DIRS.has(segment));
287
+ return !segments.some(isProjectIgnoredDir);
288
288
  }
289
289
  var projectSignatureCache = /* @__PURE__ */ new Map();
290
290
  var COARSEST_FILE_TIME_TICK_MS = 2e3;
@@ -295,7 +295,7 @@ function isPathWithin(parentDir, childPath) {
295
295
  function isTextContentEligible(file, size) {
296
296
  return SIGNATURE_TEXT_EXTENSIONS.has(extname(file).toLowerCase()) && size <= MAX_SIGNATURE_TEXT_BYTES;
297
297
  }
298
- var isSkippedEntry = (entry) => PREVIEW_IGNORED_DIRS.has(entry) || isAtomicTempPath(entry);
298
+ var isSkippedEntry = (entry) => isProjectIgnoredDir(entry) || isAtomicTempPath(entry);
299
299
  function signatureEntryStat(projectDir, entry, file, outputs) {
300
300
  if (isSkippedEntry(entry) || !isPathWithin(projectDir, file)) return null;
301
301
  if (isRenderOutput(projectDir, file, outputs)) return null;
@@ -1,14 +1,14 @@
1
1
  import {
2
2
  PROXY_PARAMS_VERSION,
3
3
  resolveProxy
4
- } from "./chunk-XRUVTG5G.js";
4
+ } from "./chunk-QFJR3NIL.js";
5
5
  import {
6
6
  createMediaCodecProbeCache,
7
7
  proxyVariantFor,
8
8
  recordProxyPrewarm,
9
9
  scanProjectMediaCodecMap,
10
10
  shouldPrewarmProxy
11
- } from "./chunk-EZMTFRUX.js";
11
+ } from "./chunk-E3VGIAMJ.js";
12
12
 
13
13
  // src/helpers/mediaProxyPreview.ts
14
14
  import { resolve } from "path";
@@ -24,7 +24,7 @@ function proxyEtagSalt(raw, box) {
24
24
  if (raw === void 0) return "";
25
25
  return `:proxy:${raw}:${PROXY_PARAMS_VERSION}${box ? `:${formatPreviewProxyBox(box)}` : ""}`;
26
26
  }
27
- async function injectMediaCodecMapIntoHtml(html, projectDir, htmlSources, probeCache, prewarm = true) {
27
+ async function injectMediaCodecMapIntoHtml(html, projectDir, htmlSources, probeCache, prewarm = true, signal) {
28
28
  let map;
29
29
  try {
30
30
  map = await scanProjectMediaCodecMap(
@@ -42,7 +42,9 @@ async function injectMediaCodecMapIntoHtml(html, projectDir, htmlSources, probeC
42
42
  resolveProxy(
43
43
  projectDir,
44
44
  resolve(projectDir, rootRelativePathname.replace(/^\/+/, "")),
45
- proxyVariantFor(facts)
45
+ proxyVariantFor(facts),
46
+ void 0,
47
+ { signal }
46
48
  ).catch(() => {
47
49
  });
48
50
  }
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  realpath
3
- } from "./chunk-K56J3CL7.js";
3
+ } from "./chunk-QF7MFJJU.js";
4
4
 
5
5
  // src/helpers/mediaCodecMap.ts
6
6
  import { scanHtmlOpeningTags, decodeAuthoredAttribute } from "@hyperframes/parsers";
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  resolveWithinProject
3
- } from "./chunk-K56J3CL7.js";
3
+ } from "./chunk-QF7MFJJU.js";
4
4
 
5
5
  // src/helpers/loudness.ts
6
6
  import { execFile } from "child_process";
@@ -2,7 +2,7 @@ import {
2
2
  isInHiddenOrVendorDir,
3
3
  mkdirWithinProject,
4
4
  walkDir
5
- } from "./chunk-K56J3CL7.js";
5
+ } from "./chunk-QF7MFJJU.js";
6
6
 
7
7
  // src/helpers/hfIdPersist.ts
8
8
  import { stampHfIdsInPlace } from "@hyperframes/parsers/hf-ids";
@@ -9,6 +9,7 @@ import {
9
9
  import { basename, dirname, isAbsolute, join, relative, sep } from "path";
10
10
  import { readdirSync } from "fs";
11
11
  import { realpath, resolveWithinProject as resolveInProject } from "@hyperframes/core/safe-path";
12
+ import { RENDER_TEMP_DIR } from "@hyperframes/core/project-folders";
12
13
  import {
13
14
  folderGone,
14
15
  isProjectRootMissing,
@@ -80,7 +81,8 @@ function walkDir(dir, prefix = "") {
80
81
  const files = [];
81
82
  for (const entry of entries) {
82
83
  const rel = prefix ? `${prefix}/${entry.name}` : entry.name;
83
- if (IGNORE_DIRS.has(entry.name) || shouldIgnoreDir(rel)) continue;
84
+ if (IGNORE_DIRS.has(entry.name) || RENDER_TEMP_DIR.test(entry.name) || shouldIgnoreDir(rel))
85
+ continue;
84
86
  if (entry.isDirectory()) {
85
87
  files.push(...walkDir(join(dir, entry.name), rel));
86
88
  } else {
@@ -2,12 +2,12 @@ import {
2
2
  PROXY_VARIANT_CONFIG,
3
3
  probeFirstFrameColour,
4
4
  probeMediaMetadata
5
- } from "./chunk-EZMTFRUX.js";
5
+ } from "./chunk-E3VGIAMJ.js";
6
6
  import {
7
7
  mkdirWithinProject,
8
8
  realProjectRoot,
9
9
  realpath
10
- } from "./chunk-K56J3CL7.js";
10
+ } from "./chunk-QF7MFJJU.js";
11
11
 
12
12
  // src/helpers/proxyTranscoder.ts
13
13
  import { spawn } from "child_process";
@@ -239,7 +239,7 @@ function getProxyCachePath(projectDir, absoluteSourcePath, variant = "h264", box
239
239
  }
240
240
  var ProxyDroppedError = class extends ProxyTranscodeError {
241
241
  constructor() {
242
- super("media proxy copy dropped: every caller left before it started", null, "");
242
+ super("media proxy copy dropped: every caller left", null, "");
243
243
  this.name = "ProxyDroppedError";
244
244
  }
245
245
  };
@@ -292,7 +292,13 @@ function prioritize(job) {
292
292
  }
293
293
  function leave(job) {
294
294
  job.callers--;
295
- if (job.callers === 0) job.queued?.drop();
295
+ if (job.callers > 0) return;
296
+ if (job.queued) {
297
+ job.queued.drop();
298
+ return;
299
+ }
300
+ forget(job);
301
+ job.abandoned.abort();
296
302
  }
297
303
  var inFlight = /* @__PURE__ */ new Map();
298
304
  function forget(job) {
@@ -365,7 +371,7 @@ function stderrReason(stderrTail) {
365
371
  const line = errorLines.at(-1) ?? lines.at(-1);
366
372
  return line ? `: ${line.replace(/[.!]+$/, "")}` : "";
367
373
  }
368
- async function runFfmpeg(sourcePath, outputPath, variant, box) {
374
+ async function runFfmpeg(sourcePath, outputPath, variant, box, signal) {
369
375
  const metadata = await probeMediaMetadata(sourcePath);
370
376
  const ffmpegPath = findFfBinary("ffmpeg", { configuredMustExist: true });
371
377
  if (!ffmpegPath) {
@@ -436,10 +442,12 @@ async function runFfmpeg(sourcePath, outputPath, variant, box) {
436
442
  "libopus"
437
443
  ];
438
444
  const args = [...commonArgs, ...variant === "vp8" ? vp8Args : h264Args, outputPath];
445
+ signal.throwIfAborted();
439
446
  const proc = spawn(ffmpegPath, args, {
440
447
  stdio: ["ignore", "ignore", "pipe"],
441
448
  timeout: TRANSCODE_TIMEOUT_MS,
442
449
  killSignal: "SIGKILL",
450
+ signal,
443
451
  windowsHide: true
444
452
  });
445
453
  let stderrTail = "";
@@ -447,15 +455,16 @@ async function runFfmpeg(sourcePath, outputPath, variant, box) {
447
455
  stderrTail = (stderrTail + chunk.toString()).slice(-STDERR_TAIL_MAX_CHARS);
448
456
  });
449
457
  proc.on("error", (err) => {
458
+ if (signal.aborted) return;
450
459
  reject(new FfmpegUnavailableError(`failed to spawn ffmpeg: ${err.message}`, stderrTail));
451
460
  });
452
- proc.on("close", (code, signal) => {
461
+ proc.on("close", (code, signal2) => {
453
462
  if (code === 0) {
454
463
  resolvePromise();
455
- } else if (signal) {
464
+ } else if (signal2) {
456
465
  reject(
457
466
  new ProxyTranscodeError(
458
- `ffmpeg killed by ${signal} (timeout ${TRANSCODE_TIMEOUT_MS}ms or external kill)`,
467
+ `ffmpeg killed by ${signal2} (timeout ${TRANSCODE_TIMEOUT_MS}ms or external kill)`,
459
468
  null,
460
469
  stderrTail
461
470
  )
@@ -480,7 +489,7 @@ async function transcodeToCache(job, projectDir, absoluteSourcePath, cachePath,
480
489
  mkdirWithinProject(projectDir, cacheDir);
481
490
  const tempPath = join2(cacheDir, `.tmp-${randomUUID()}-${basename(cachePath)}`);
482
491
  try {
483
- await runFfmpeg(absoluteSourcePath, tempPath, variant, box);
492
+ await runFfmpeg(absoluteSourcePath, tempPath, variant, box, job.abandoned.signal);
484
493
  renameSync(tempPath, cachePath);
485
494
  maintainProxyCache(cacheDir);
486
495
  return cachePath;
@@ -521,7 +530,8 @@ async function resolveProxy(projectDir, absoluteSourcePath, variant = "h264", bo
521
530
  const job = {
522
531
  cachePath,
523
532
  priority: options.priority === true,
524
- callers: 0
533
+ callers: 0,
534
+ abandoned: new AbortController()
525
535
  };
526
536
  const promise = transcodeToCache(
527
537
  job,
@@ -531,7 +541,9 @@ async function resolveProxy(projectDir, absoluteSourcePath, variant = "h264", bo
531
541
  variant,
532
542
  box
533
543
  ).catch((err) => {
534
- if (!(err instanceof ProxyDroppedError)) rememberFailure(cachePath, err);
544
+ if (!(err instanceof ProxyDroppedError) && !job.abandoned.signal.aborted) {
545
+ rememberFailure(cachePath, err);
546
+ }
535
547
  throw err;
536
548
  }).finally(() => {
537
549
  forget(job);
@@ -2,8 +2,8 @@ import {
2
2
  isCompositionSource,
3
3
  stampFileHfIds,
4
4
  stampProjectHfIds
5
- } from "../chunk-47NKWXAA.js";
6
- import "../chunk-K56J3CL7.js";
5
+ } from "../chunk-FJBJJURY.js";
6
+ import "../chunk-QF7MFJJU.js";
7
7
  import "../chunk-SVQFE44C.js";
8
8
  import "../chunk-L3HJVTQE.js";
9
9
  export {
@@ -11,8 +11,8 @@ import {
11
11
  requiredFfmpeg,
12
12
  resolveLocalAudioPath,
13
13
  updateAudioVolume
14
- } from "../chunk-KR3B6IJC.js";
15
- import "../chunk-K56J3CL7.js";
14
+ } from "../chunk-ERQWOZ7E.js";
15
+ import "../chunk-QF7MFJJU.js";
16
16
  import "../chunk-SVQFE44C.js";
17
17
  import "../chunk-L3HJVTQE.js";
18
18
  export {
@@ -13,8 +13,8 @@ import {
13
13
  resolveProxyVariantRequest,
14
14
  scanProjectMediaCodecMap,
15
15
  shouldPrewarmProxy
16
- } from "../chunk-EZMTFRUX.js";
17
- import "../chunk-K56J3CL7.js";
16
+ } from "../chunk-E3VGIAMJ.js";
17
+ import "../chunk-QF7MFJJU.js";
18
18
  import "../chunk-SVQFE44C.js";
19
19
  import "../chunk-L3HJVTQE.js";
20
20
  export {
@@ -1,5 +1,5 @@
1
1
  import '@hyperframes/core';
2
- export { a as PreviewApiAdapter, P as PreviewDocumentStore, i as injectMediaCodecMap, f as injectMediaCodecMapIntoHtml, g as isAutoProxyEnabled, p as proxyEtagSalt, r as resolvePreviewMediaCodecProbeCache } from '../mediaProxyPreview-6bL5skob.js';
2
+ export { a as PreviewApiAdapter, P as PreviewDocumentStore, i as injectMediaCodecMap, f as injectMediaCodecMapIntoHtml, g as isAutoProxyEnabled, p as proxyEtagSalt, r as resolvePreviewMediaCodecProbeCache } from '../mediaProxyPreview-DIAid9-k.js';
3
3
  import './mediaCodecMap.js';
4
4
  import '@hyperframes/parsers';
5
5
  import '@hyperframes/core/compiler';
@@ -4,10 +4,10 @@ import {
4
4
  isAutoProxyEnabled,
5
5
  proxyEtagSalt,
6
6
  resolvePreviewMediaCodecProbeCache
7
- } from "../chunk-KJZ6WB6Z.js";
8
- import "../chunk-XRUVTG5G.js";
9
- import "../chunk-EZMTFRUX.js";
10
- import "../chunk-K56J3CL7.js";
7
+ } from "../chunk-7L3DUCM3.js";
8
+ import "../chunk-QFJR3NIL.js";
9
+ import "../chunk-E3VGIAMJ.js";
10
+ import "../chunk-QF7MFJJU.js";
11
11
  import "../chunk-SVQFE44C.js";
12
12
  import "../chunk-L3HJVTQE.js";
13
13
  export {
@@ -7,9 +7,9 @@ import { ProxyVariant } from './mediaCodecMap.js';
7
7
  * project routes (U3/U4) to serve a `?hf-proxy=` request; never used on
8
8
  * the render path (render always sees the original file).
9
9
  *
10
- * A started ffmpeg child is never killed for one caller: every caller of a cache
11
- * key shares it (in-flight dedupe below). A caller's `signal` only detaches that
12
- * caller, and drops the copy while it is still queued with no caller left.
10
+ * Every caller of a cache key shares one ffmpeg child (in-flight dedupe below). A
11
+ * caller's `signal` detaches that caller; once no caller is left, the copy is
12
+ * dropped from the queue or its ffmpeg is killed.
13
13
  */
14
14
  declare const PROXY_PARAMS_VERSION = "v5";
15
15
  declare const CACHE_DIR_NAME = ".transcode-cache";
@@ -16,9 +16,9 @@ import {
16
16
  resolveProxies,
17
17
  resolveProxy,
18
18
  waitForProxy
19
- } from "../chunk-XRUVTG5G.js";
20
- import "../chunk-EZMTFRUX.js";
21
- import "../chunk-K56J3CL7.js";
19
+ } from "../chunk-QFJR3NIL.js";
20
+ import "../chunk-E3VGIAMJ.js";
21
+ import "../chunk-QF7MFJJU.js";
22
22
  import "../chunk-SVQFE44C.js";
23
23
  import "../chunk-L3HJVTQE.js";
24
24
  export {
@@ -13,7 +13,7 @@ import {
13
13
  realpath,
14
14
  resolveWithinProject,
15
15
  walkDir
16
- } from "../chunk-K56J3CL7.js";
16
+ } from "../chunk-QF7MFJJU.js";
17
17
  import "../chunk-SVQFE44C.js";
18
18
  import "../chunk-L3HJVTQE.js";
19
19
  export {
@@ -20,8 +20,8 @@ import {
20
20
  recordRenderSuccess,
21
21
  registerRenderOutput,
22
22
  retainSnapshotOutput
23
- } from "../chunk-GG4AS4RK.js";
24
- import "../chunk-K56J3CL7.js";
23
+ } from "../chunk-6PE5OD32.js";
24
+ import "../chunk-QF7MFJJU.js";
25
25
  import "../chunk-SVQFE44C.js";
26
26
  import "../chunk-L3HJVTQE.js";
27
27
  export {
package/dist/index.d.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  import { Hono } from 'hono';
2
- import { S as StudioApiAdapter, P as PreviewDocumentStore, M as MediaProcessingJobState } from './mediaProxyPreview-6bL5skob.js';
3
- export { L as LintResult, a as PreviewApiAdapter, R as RenderJobState, b as ResolvedProject, c as StudioSelectionResponse, d as StudioSelectionSnapshot, e as StudioSelectionTextField } from './mediaProxyPreview-6bL5skob.js';
2
+ import { S as StudioApiAdapter, P as PreviewDocumentStore, M as MediaProcessingJobState } from './mediaProxyPreview-DIAid9-k.js';
3
+ export { L as LintResult, a as PreviewApiAdapter, R as RenderJobState, b as ResolvedProject, c as StudioSelectionResponse, d as StudioSelectionSnapshot, e as StudioSelectionTextField } from './mediaProxyPreview-DIAid9-k.js';
4
4
  export { C as ClosedWindow, D as DEFAULT_HISTORY_ROOT, S as HISTORY_START, H as HistoryClosedError, a as HistoryEntry, b as HistoryEntrySide, c as HistoryFileChange, d as HistoryListItem, e as HistoryResult, f as HistoryTarget, g as HistoryWho, h as HistoryWindow, M as MAX_WINDOW_IDLE_MS, P as ProjectHistory, i as ProjectHistoryOptions, j as ProjectHistoryView, U as UNDO_MODES, k as UndoMode, o as openProjectHistory, r as readProjectHistory } from './projectHistory-ByC9sa3X.js';
5
5
  export { ArtifactCapture, ArtifactInput, ArtifactRecord, HistoryBusyError, HistoryIdError, ProjectHistoryRecord, PrunedHistory, RenderRecord, VideoState, artifactDirectory, beginArtifactCapture, finishSnapshotRun, forgetRecordedArtifacts, historyCache, listProjectHistories, pruneGoneProjectHistories, recordArtifact, recordArtifacts, recordRenderSuccess, registerRenderOutput, retainSnapshotOutput } from './history/index.js';
6
6
  export { CACHE_DIR_NAME as PROXY_CACHE_DIR_NAME } from './helpers/proxyTranscoder.js';
@@ -39,10 +39,8 @@ declare const STUDIO_SIGNATURE_MANIFEST_PATHS: readonly [".hyperframes/studio-ma
39
39
  * preview, so an unfiltered watcher discards the memo on roughly every request of
40
40
  * the one workload the memo exists for.
41
41
  *
42
- * Note this is not `WATCHER_EXCLUDED_DIRS`, which is character-identical but
43
- * excludes all of `.hyperframes/` — the signature deliberately reads two manifest
44
- * files from inside it, so filtering with that set would stop motion-state saves
45
- * from ever invalidating.
42
+ * The watcher shares `isProjectIgnoredDir` but drops all of `.hyperframes/`; the two
43
+ * manifest files read from inside it are let through first so motion-state saves invalidate.
46
44
  *
47
45
  * Every segment is tested, not just the parents, so a directory event on an
48
46
  * excluded dir itself (`unlinkDir .thumbnails`) is filtered too. The cost is that
package/dist/index.js CHANGED
@@ -21,7 +21,7 @@ import {
21
21
  import {
22
22
  isCompositionSource,
23
23
  stampProjectHfIds
24
- } from "./chunk-47NKWXAA.js";
24
+ } from "./chunk-FJBJJURY.js";
25
25
  import {
26
26
  parseEncoderOptions
27
27
  } from "./chunk-GR4TX52A.js";
@@ -60,7 +60,7 @@ import {
60
60
  resolveProjectSignature,
61
61
  retainSnapshotOutput,
62
62
  settledFileTag
63
- } from "./chunk-GG4AS4RK.js";
63
+ } from "./chunk-6PE5OD32.js";
64
64
  import {
65
65
  clearElementScreenshotIsolation,
66
66
  getElementScreenshotClip
@@ -74,13 +74,13 @@ import {
74
74
  requestedProjectPath,
75
75
  requiredFfmpeg,
76
76
  resolveLocalAudioPath
77
- } from "./chunk-KR3B6IJC.js";
77
+ } from "./chunk-ERQWOZ7E.js";
78
78
  import {
79
79
  injectMediaCodecMap,
80
80
  isAutoProxyEnabled,
81
81
  proxyEtagSalt,
82
82
  resolvePreviewMediaCodecProbeCache
83
- } from "./chunk-KJZ6WB6Z.js";
83
+ } from "./chunk-7L3DUCM3.js";
84
84
  import {
85
85
  CACHE_DIR_NAME,
86
86
  PROXY_PENDING_RETRY_AFTER_SECONDS,
@@ -91,7 +91,7 @@ import {
91
91
  proxyActivityMark,
92
92
  resolveProxy,
93
93
  waitForProxy
94
- } from "./chunk-XRUVTG5G.js";
94
+ } from "./chunk-QFJR3NIL.js";
95
95
  import {
96
96
  PROXY_VARIANT_CONFIG,
97
97
  decideMediaProxyEligibility,
@@ -100,7 +100,7 @@ import {
100
100
  probeMediaMetadata,
101
101
  recordProxyRequest,
102
102
  resolveProxyVariantRequest
103
- } from "./chunk-EZMTFRUX.js";
103
+ } from "./chunk-E3VGIAMJ.js";
104
104
  import {
105
105
  folderGone,
106
106
  isInHiddenOrVendorDir,
@@ -114,7 +114,7 @@ import {
114
114
  realpath,
115
115
  resolveWithinProject,
116
116
  walkDir
117
- } from "./chunk-K56J3CL7.js";
117
+ } from "./chunk-QF7MFJJU.js";
118
118
  import {
119
119
  STUDIO_MANUAL_EDITS_PATH,
120
120
  createStudioManualEditsRenderBodyScript,
@@ -297,7 +297,9 @@ declare function proxyEtagSalt(raw: string | undefined, box?: PreviewProxyBox):
297
297
  * Empty maps leave HTML untouched, preserving the normal no-hostile-media
298
298
  * preview path. On-demand proxy requests enforce the same eligibility gate.
299
299
  */
300
- declare function injectMediaCodecMapIntoHtml(html: string, projectDir: string, htmlSources: HtmlSourceLike[], probeCache?: MediaCodecProbeCache, prewarm?: boolean): Promise<string>;
300
+ declare function injectMediaCodecMapIntoHtml(html: string, projectDir: string, htmlSources: HtmlSourceLike[], probeCache?: MediaCodecProbeCache, prewarm?: boolean,
301
+ /** Aborting it stops the pre-warms nobody else waits for. */
302
+ signal?: AbortSignal): Promise<string>;
301
303
  /**
302
304
  * Adapter-aware wrapper used by the studio preview routes: skipped entirely
303
305
  * (no scan, no injection) when auto-proxy is off for this adapter.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hyperframes/studio-server",
3
- "version": "0.8.176",
3
+ "version": "0.8.178",
4
4
  "repository": {
5
5
  "type": "git",
6
6
  "url": "https://github.com/heygen-com/hyperframes",
@@ -85,8 +85,8 @@
85
85
  "postcss": "^8.5.8",
86
86
  "postcss-selector-parser": "^7.1.2",
87
87
  "sharp": "^0.35.0",
88
- "@hyperframes/parsers": "0.8.176",
89
- "@hyperframes/core": "0.8.176"
88
+ "@hyperframes/core": "0.8.178",
89
+ "@hyperframes/parsers": "0.8.178"
90
90
  },
91
91
  "devDependencies": {
92
92
  "@types/node": "^25.0.10",