@hyperframes/engine 0.8.153 → 0.8.155
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/services/browserManager.d.ts +2 -0
- package/dist/services/browserManager.js +50 -16
- package/dist/services/parallelCoordinator.d.ts +1 -5
- package/dist/services/parallelCoordinator.js +6 -13
- package/dist/services/videoFrameExtractor.js +1 -1
- package/dist/services/wslHost.d.ts +24 -0
- package/dist/services/wslHost.js +89 -0
- package/dist/utils/sdrCaptureColor.d.ts +1 -1
- package/dist/utils/sdrCaptureColor.js +1 -1
- package/package.json +7 -3
|
@@ -6,6 +6,7 @@
|
|
|
6
6
|
*/
|
|
7
7
|
import type { Browser, LaunchOptions, Page, PuppeteerNode } from "puppeteer-core";
|
|
8
8
|
import { type EngineConfig } from "../config.js";
|
|
9
|
+
import { type WslHostFacts } from "./wslHost.js";
|
|
9
10
|
import { type BrowserLaunchFingerprint, type BrowserLease, type CaptureMode } from "./browserLeasePool.js";
|
|
10
11
|
export { BrowserLeasePool } from "./browserLeasePool.js";
|
|
11
12
|
export type { BrowserLaunchFingerprint, BrowserLease, BrowserPoolState, CaptureMode, } from "./browserLeasePool.js";
|
|
@@ -23,6 +24,7 @@ interface GpuProbeOptions {
|
|
|
23
24
|
browserTimeout?: number;
|
|
24
25
|
platform?: NodeJS.Platform;
|
|
25
26
|
probeLifecycle?: GpuProbeLifecycle;
|
|
27
|
+
wslHost?: WslHostFacts;
|
|
26
28
|
}
|
|
27
29
|
export type AcquiredBrowser = BrowserLease;
|
|
28
30
|
/**
|
|
@@ -13,6 +13,7 @@ import { homedir } from "os";
|
|
|
13
13
|
import { chromeMajorCeiling, exceedsChromeCeiling } from "./chromeHostCeiling.js";
|
|
14
14
|
import { DEFAULT_CONFIG } from "../config.js";
|
|
15
15
|
import { getSystemTotalMb, LOW_MEMORY_TOTAL_MB_THRESHOLD } from "./systemMemory.js";
|
|
16
|
+
import { describeWslGpuAccess } from "./wslHost.js";
|
|
16
17
|
import { BrowserLeasePool, } from "./browserLeasePool.js";
|
|
17
18
|
export { BrowserLeasePool } from "./browserLeasePool.js";
|
|
18
19
|
let _puppeteer;
|
|
@@ -366,6 +367,7 @@ let _autoBrowserGpuModeCache;
|
|
|
366
367
|
export function _resetAutoBrowserGpuModeCacheForTests() {
|
|
367
368
|
_autoBrowserGpuModeCache = undefined;
|
|
368
369
|
_unverifiedHardwareGpuWarned = false;
|
|
370
|
+
_wslSoftwareNoteLogged = false;
|
|
369
371
|
}
|
|
370
372
|
async function getPuppeteerOrNull() {
|
|
371
373
|
try {
|
|
@@ -418,13 +420,19 @@ async function probeAutoBrowserGpuMode(options) {
|
|
|
418
420
|
});
|
|
419
421
|
const resolved = resolveWebGlProbeMode(info);
|
|
420
422
|
logResolvedBrowserGpuMode(resolved, describeWebGlProbe(info));
|
|
421
|
-
|
|
423
|
+
if (resolved === "hardware")
|
|
424
|
+
return { mode: "hardware" };
|
|
425
|
+
return { mode: "software", cause: "no-gpu", ...wslAccess(options) };
|
|
422
426
|
}
|
|
423
427
|
catch (err) {
|
|
424
428
|
logResolvedBrowserGpuMode("software", formatProbeFailure(err));
|
|
425
|
-
return { mode: "software", cause: "probe-error" };
|
|
429
|
+
return { mode: "software", cause: "probe-error", ...wslAccess(options) };
|
|
426
430
|
}
|
|
427
431
|
}
|
|
432
|
+
function wslAccess(options) {
|
|
433
|
+
const lines = describeWslGpuAccess(options.wslHost);
|
|
434
|
+
return lines ? { wslAccess: lines } : {};
|
|
435
|
+
}
|
|
428
436
|
/**
|
|
429
437
|
* Resolve `browserGpuMode` to a concrete `"software" | "hardware"` answer.
|
|
430
438
|
*
|
|
@@ -455,15 +463,22 @@ export function resolveBrowserGpuMode(mode, options = {}) {
|
|
|
455
463
|
if (mode === "software")
|
|
456
464
|
return Promise.resolve(mode);
|
|
457
465
|
_autoBrowserGpuModeCache ??= probeAutoBrowserGpuMode(options);
|
|
458
|
-
if (mode === "auto")
|
|
459
|
-
return _autoBrowserGpuModeCache.then((probed) =>
|
|
466
|
+
if (mode === "auto") {
|
|
467
|
+
return _autoBrowserGpuModeCache.then((probed) => {
|
|
468
|
+
if (probed.mode === "software" && probed.wslAccess && !_wslSoftwareNoteLogged) {
|
|
469
|
+
_wslSoftwareNoteLogged = true;
|
|
470
|
+
console.error(buildWslSoftwareNote(probed));
|
|
471
|
+
}
|
|
472
|
+
return probed.mode;
|
|
473
|
+
});
|
|
474
|
+
}
|
|
460
475
|
return _autoBrowserGpuModeCache.then((probed) => {
|
|
461
476
|
// Warn once per cache lifetime, not once per caller: `createCaptureSession`
|
|
462
477
|
// resolves the mode for the probe browser AND every parallel worker, so
|
|
463
478
|
// an un-deduplicated warning prints N+1 times and buries itself.
|
|
464
479
|
if (probed.mode === "software" && !_unverifiedHardwareGpuWarned) {
|
|
465
480
|
_unverifiedHardwareGpuWarned = true;
|
|
466
|
-
console.warn(buildUnverifiedHardwareGpuWarning(options.platform ?? process.platform, probed
|
|
481
|
+
console.warn(buildUnverifiedHardwareGpuWarning(options.platform ?? process.platform, probed));
|
|
467
482
|
}
|
|
468
483
|
return "hardware";
|
|
469
484
|
});
|
|
@@ -473,6 +488,19 @@ export function resolveBrowserGpuMode(mode, options = {}) {
|
|
|
473
488
|
* cache lifetime (re-armed by `_resetAutoBrowserGpuModeCacheForTests`).
|
|
474
489
|
*/
|
|
475
490
|
let _unverifiedHardwareGpuWarned = false;
|
|
491
|
+
let _wslSoftwareNoteLogged = false;
|
|
492
|
+
/** Auto mode under WSL selected software: say so, with what we checked. */
|
|
493
|
+
function buildWslSoftwareNote({ cause, wslAccess = [] }) {
|
|
494
|
+
const check = cause === "probe-error"
|
|
495
|
+
? "the GPU check could not finish (see the probe line above)"
|
|
496
|
+
: "the GPU check found no hardware GPU";
|
|
497
|
+
return [
|
|
498
|
+
`[hyperframes] WSL: ${check}, so this render uses software WebGL (SwiftShader) and runs ` +
|
|
499
|
+
"at CPU speed.",
|
|
500
|
+
...wslAccess,
|
|
501
|
+
" Pass --no-browser-gpu to skip the GPU check and render in software.",
|
|
502
|
+
].join("\n");
|
|
503
|
+
}
|
|
476
504
|
/**
|
|
477
505
|
* Warning text for "you asked for hardware GPU and we could not confirm it".
|
|
478
506
|
*
|
|
@@ -482,7 +510,7 @@ let _unverifiedHardwareGpuWarned = false;
|
|
|
482
510
|
* at `--gpus all` would send them chasing a phantom while their Chrome
|
|
483
511
|
* install is the actual fault.
|
|
484
512
|
*/
|
|
485
|
-
function buildUnverifiedHardwareGpuWarning(platform, cause) {
|
|
513
|
+
function buildUnverifiedHardwareGpuWarning(platform, { cause, wslAccess }) {
|
|
486
514
|
if (cause === "probe-error") {
|
|
487
515
|
return ("[hyperframes] browserGpuMode=hardware was requested, but the GPU probe could not run, " +
|
|
488
516
|
"so hardware acceleration is UNVERIFIED. If Chrome falls back to software WebGL the " +
|
|
@@ -491,19 +519,25 @@ function buildUnverifiedHardwareGpuWarning(platform, cause) {
|
|
|
491
519
|
"`browserGpuMode probe → software (probe failed ...)` line above for the underlying " +
|
|
492
520
|
"error, which usually means Chrome could not launch (bad HYPERFRAMES_BROWSER_PATH, " +
|
|
493
521
|
"missing shared libraries, or a denied sandbox) rather than a GPU problem.\n" +
|
|
494
|
-
" Run `hyperframes doctor` to check the Chrome install."
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
|
|
522
|
+
" Run `hyperframes doctor` to check the Chrome install." +
|
|
523
|
+
(wslAccess
|
|
524
|
+
? ["", " Under WSL, a GPU path that is slow to start or unreachable can also cause it:"]
|
|
525
|
+
.concat(wslAccess)
|
|
526
|
+
.join("\n")
|
|
527
|
+
: ""));
|
|
528
|
+
}
|
|
529
|
+
const remediation = wslAccess?.join("\n") ??
|
|
530
|
+
(platform === "linux"
|
|
531
|
+
? " Inside Docker, the container needs GPU passthrough: `--gpus all` with the NVIDIA " +
|
|
532
|
+
"Container Toolkit installed, or `--device /dev/dri` for Mesa/AMD/Intel. The image " +
|
|
533
|
+
"also needs the matching userspace driver + libEGL. Verify with " +
|
|
534
|
+
"`hyperframes render --browser-gpu` and watch for this warning disappearing."
|
|
535
|
+
: " Check that the host exposes a GPU to this process and that the graphics drivers " +
|
|
536
|
+
"are installed.");
|
|
503
537
|
return ("[hyperframes] browserGpuMode=hardware was requested, but the WebGL probe found no " +
|
|
504
538
|
"hardware GPU, so Chrome will silently fall back to software WebGL and the capture will " +
|
|
505
539
|
"run at CPU speed. Honouring the explicit request anyway.\n" +
|
|
506
|
-
|
|
540
|
+
`${remediation}\n` +
|
|
507
541
|
" Pass --no-browser-gpu to select deterministic SwiftShader instead of waiting on a " +
|
|
508
542
|
"hardware path that is not there.");
|
|
509
543
|
}
|
|
@@ -76,12 +76,8 @@ export interface WorkerSizingConfig extends Partial<Pick<EngineConfig, "concurre
|
|
|
76
76
|
}
|
|
77
77
|
type WorkerBrowserPoolDecision = {
|
|
78
78
|
parallel?: boolean;
|
|
79
|
-
platform: NodeJS.Platform;
|
|
80
|
-
forceScreenshot?: boolean;
|
|
81
|
-
deviceScaleFactor?: number;
|
|
82
|
-
headlessShellPath?: string;
|
|
83
79
|
};
|
|
84
|
-
export declare function shouldDisableBrowserPoolForParallelWorker({ parallel,
|
|
80
|
+
export declare function shouldDisableBrowserPoolForParallelWorker({ parallel, }: WorkerBrowserPoolDecision): boolean;
|
|
85
81
|
export declare function selectWorkerDiagnostics(lines: readonly string[], maxLines?: number): string[];
|
|
86
82
|
/**
|
|
87
83
|
* Expected frame count for a worker task, honoring its stride. Contiguous
|
|
@@ -51,12 +51,11 @@ function defaultSafeMaxWorkers() {
|
|
|
51
51
|
return Math.max(6, Math.min(16, Math.floor(cpus().length / 8)));
|
|
52
52
|
}
|
|
53
53
|
const MIN_FRAMES_PER_WORKER = 30;
|
|
54
|
-
//
|
|
55
|
-
//
|
|
56
|
-
//
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
return Boolean(parallel && platform === "linux" && headlessShellPath && (deviceScaleFactor ?? 1) <= 1);
|
|
54
|
+
// Every parallel worker gets its own browser: pages in one browser share six
|
|
55
|
+
// connections to the file server, which a media-heavy page holds (#5548), and
|
|
56
|
+
// sharing also crashes BeginFrame and serializes screenshots.
|
|
57
|
+
export function shouldDisableBrowserPoolForParallelWorker({ parallel, }) {
|
|
58
|
+
return Boolean(parallel);
|
|
60
59
|
}
|
|
61
60
|
export function selectWorkerDiagnostics(lines, maxLines = MAX_WORKER_DIAGNOSTIC_LINES) {
|
|
62
61
|
return lines
|
|
@@ -555,13 +554,7 @@ async function executeWorkerTask(task, serverUrl, captureOptions, createBeforeCa
|
|
|
555
554
|
mkdirSync(task.outputDir, { recursive: true });
|
|
556
555
|
let session = null;
|
|
557
556
|
let perf;
|
|
558
|
-
const needsSeparateBrowsers = shouldDisableBrowserPoolForParallelWorker({
|
|
559
|
-
parallel,
|
|
560
|
-
platform: process.platform,
|
|
561
|
-
forceScreenshot: config?.forceScreenshot,
|
|
562
|
-
deviceScaleFactor: captureOptions.deviceScaleFactor,
|
|
563
|
-
headlessShellPath: resolveHeadlessShellPath(config),
|
|
564
|
-
});
|
|
557
|
+
const needsSeparateBrowsers = shouldDisableBrowserPoolForParallelWorker({ parallel });
|
|
565
558
|
const workerConfig = needsSeparateBrowsers
|
|
566
559
|
? { ...config, enableBrowserPool: false }
|
|
567
560
|
: config;
|
|
@@ -114,7 +114,7 @@ const SDR_TO_HDR_COLORSPACE_FILTER = "colorspace=all=bt2020:iall=bt709:range=tv"
|
|
|
114
114
|
const HDR_TO_SDR_ZSCALE_TRANSFORM_KEY = "hdr2sdr-hable-srgb";
|
|
115
115
|
const HDR_TO_SDR_VIDEOTOOLBOX_TRANSFORM_KEY = "hdr2sdr-videotoolbox-hdr";
|
|
116
116
|
const SDR_CANVAS_PASSTHROUGH_FILTER = "setparams=color_primaries=bt709:color_trc=iec61966-2-1";
|
|
117
|
-
const SDR_JPEG_AS_BT601_FULL_RANGE_FILTER = "scale=flags=neighbor,format=gbrp,scale=out_color_matrix=bt601:out_range=pc:flags=neighbor,format=yuv420p";
|
|
117
|
+
const SDR_JPEG_AS_BT601_FULL_RANGE_FILTER = "scale=flags=neighbor+accurate_rnd,format=gbrp,scale=out_color_matrix=bt601:out_range=pc:flags=neighbor,format=yuv420p";
|
|
118
118
|
let warnedMissingZscale = false;
|
|
119
119
|
async function toneMapsWithZscale() {
|
|
120
120
|
return process.platform !== "darwin" || isFfmpegFilterAvailable("zscale");
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* WSL host detection and what we can check about its GPU path when Chrome's
|
|
3
|
+
* GPU probe does not confirm a hardware GPU (heygen-com/hyperframes#5548).
|
|
4
|
+
*/
|
|
5
|
+
export type RenderNodeAccess = {
|
|
6
|
+
state: "missing" | "read-write";
|
|
7
|
+
} | {
|
|
8
|
+
state: "denied";
|
|
9
|
+
group: string;
|
|
10
|
+
userInGroup: boolean;
|
|
11
|
+
};
|
|
12
|
+
/** The host facts these checks read; tests pass a fake. */
|
|
13
|
+
export interface WslHostFacts {
|
|
14
|
+
platform: NodeJS.Platform;
|
|
15
|
+
release: string;
|
|
16
|
+
readProcVersion(): string;
|
|
17
|
+
renderNodeAccess(path: string): RenderNodeAccess;
|
|
18
|
+
}
|
|
19
|
+
export declare function detectWsl(host?: WslHostFacts): boolean;
|
|
20
|
+
/**
|
|
21
|
+
* Indented lines saying what we checked on the WSL GPU path and what to try,
|
|
22
|
+
* or null outside WSL. Says nothing about the render mode: callers own that.
|
|
23
|
+
*/
|
|
24
|
+
export declare function describeWslGpuAccess(host?: WslHostFacts): string[] | null;
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* WSL host detection and what we can check about its GPU path when Chrome's
|
|
3
|
+
* GPU probe does not confirm a hardware GPU (heygen-com/hyperframes#5548).
|
|
4
|
+
*/
|
|
5
|
+
import { accessSync, constants, existsSync, readFileSync, statSync } from "node:fs";
|
|
6
|
+
import { platform, release } from "node:os";
|
|
7
|
+
function groupName(gid) {
|
|
8
|
+
try {
|
|
9
|
+
const line = readFileSync("/etc/group", "utf-8")
|
|
10
|
+
.split("\n")
|
|
11
|
+
.find((entry) => entry.split(":")[2] === String(gid));
|
|
12
|
+
return line?.split(":")[0] || String(gid);
|
|
13
|
+
}
|
|
14
|
+
catch {
|
|
15
|
+
return String(gid);
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
const realHost = {
|
|
19
|
+
get platform() {
|
|
20
|
+
return platform();
|
|
21
|
+
},
|
|
22
|
+
get release() {
|
|
23
|
+
return release();
|
|
24
|
+
},
|
|
25
|
+
readProcVersion: () => readFileSync("/proc/version", "utf-8"),
|
|
26
|
+
renderNodeAccess: (path) => {
|
|
27
|
+
if (!existsSync(path))
|
|
28
|
+
return { state: "missing" };
|
|
29
|
+
try {
|
|
30
|
+
accessSync(path, constants.R_OK | constants.W_OK);
|
|
31
|
+
return { state: "read-write" };
|
|
32
|
+
}
|
|
33
|
+
catch {
|
|
34
|
+
const gid = statSync(path, { throwIfNoEntry: false })?.gid ?? -1;
|
|
35
|
+
return {
|
|
36
|
+
state: "denied",
|
|
37
|
+
group: groupName(gid),
|
|
38
|
+
userInGroup: process.getgroups?.().includes(gid) ?? false,
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
},
|
|
42
|
+
};
|
|
43
|
+
export function detectWsl(host = realHost) {
|
|
44
|
+
if (host.platform !== "linux")
|
|
45
|
+
return false;
|
|
46
|
+
try {
|
|
47
|
+
const osRelease = host.release.toLowerCase();
|
|
48
|
+
if (osRelease.includes("microsoft") || osRelease.includes("wsl"))
|
|
49
|
+
return true;
|
|
50
|
+
const procVersion = host.readProcVersion().toLowerCase();
|
|
51
|
+
return procVersion.includes("microsoft") || procVersion.includes("wsl");
|
|
52
|
+
}
|
|
53
|
+
catch {
|
|
54
|
+
return false;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
const RENDER_NODE = "/dev/dri/renderD128";
|
|
58
|
+
const NATIVE_WINDOWS = "render from native Windows (project copied to a Windows drive, run from PowerShell), " +
|
|
59
|
+
"where Chrome uses the GPU through Direct3D.";
|
|
60
|
+
/**
|
|
61
|
+
* Indented lines saying what we checked on the WSL GPU path and what to try,
|
|
62
|
+
* or null outside WSL. Says nothing about the render mode: callers own that.
|
|
63
|
+
*/
|
|
64
|
+
export function describeWslGpuAccess(host = realHost) {
|
|
65
|
+
if (!detectWsl(host))
|
|
66
|
+
return null;
|
|
67
|
+
const access = host.renderNodeAccess(RENDER_NODE);
|
|
68
|
+
if (access.state === "denied" && !access.userInGroup) {
|
|
69
|
+
return [
|
|
70
|
+
` Your Linux user cannot read and write ${RENDER_NODE} and is not in its group ` +
|
|
71
|
+
`("${access.group}"), which can stop Mesa from reaching the GPU.`,
|
|
72
|
+
` Fix: run \`sudo usermod -aG ${access.group} $USER\`, then \`wsl --shutdown\` from ` +
|
|
73
|
+
"Windows, reopen WSL and render again.",
|
|
74
|
+
` Or ${NATIVE_WINDOWS}`,
|
|
75
|
+
];
|
|
76
|
+
}
|
|
77
|
+
if (access.state === "denied") {
|
|
78
|
+
return [
|
|
79
|
+
` Your Linux user is in the "${access.group}" group but still cannot read and write ` +
|
|
80
|
+
`${RENDER_NODE}; check its permissions with \`ls -l ${RENDER_NODE}\`.`,
|
|
81
|
+
` Or ${NATIVE_WINDOWS}`,
|
|
82
|
+
];
|
|
83
|
+
}
|
|
84
|
+
const seen = access.state === "missing" ? "does not exist" : "is readable and writable";
|
|
85
|
+
return [
|
|
86
|
+
` ${RENDER_NODE} ${seen}, so file permissions are not the cause.`,
|
|
87
|
+
` To use the GPU, ${NATIVE_WINDOWS}`,
|
|
88
|
+
];
|
|
89
|
+
}
|
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
export declare const SDR_RGB_TO_BT709_FILTER = "scale=out_color_matrix=bt709:out_range=tv:flags=neighbor";
|
|
2
|
-
export declare const SDR_CAPTURE_TO_BT709_FILTER = "scale=in_color_matrix=bt601:in_range=pc:flags=neighbor,format=gbrp,scale=out_color_matrix=bt709:out_range=tv:flags=neighbor";
|
|
2
|
+
export declare const SDR_CAPTURE_TO_BT709_FILTER = "scale=in_color_matrix=bt601:in_range=pc:flags=neighbor+accurate_rnd,format=gbrp,scale=out_color_matrix=bt709:out_range=tv:flags=neighbor";
|
|
3
3
|
export declare const SDR_RGB_TO_TAGGED_BT709_FILTER = "scale=out_color_matrix=bt709:out_range=tv:flags=neighbor,setparams=color_primaries=bt709:color_trc=bt709:colorspace=bt709:range=tv";
|
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
export const SDR_RGB_TO_BT709_FILTER = "scale=out_color_matrix=bt709:out_range=tv:flags=neighbor";
|
|
2
|
-
export const SDR_CAPTURE_TO_BT709_FILTER = `scale=in_color_matrix=bt601:in_range=pc:flags=neighbor,format=gbrp,${SDR_RGB_TO_BT709_FILTER}`;
|
|
2
|
+
export const SDR_CAPTURE_TO_BT709_FILTER = `scale=in_color_matrix=bt601:in_range=pc:flags=neighbor+accurate_rnd,format=gbrp,${SDR_RGB_TO_BT709_FILTER}`;
|
|
3
3
|
export const SDR_RGB_TO_TAGGED_BT709_FILTER = `${SDR_RGB_TO_BT709_FILTER},setparams=color_primaries=bt709:color_trc=bt709:colorspace=bt709:range=tv`;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@hyperframes/engine",
|
|
3
|
-
"version": "0.8.
|
|
3
|
+
"version": "0.8.155",
|
|
4
4
|
"description": "Seekable web page to video rendering engine (Puppeteer + FFmpeg)",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -31,6 +31,10 @@
|
|
|
31
31
|
"import": "./dist/services/systemMemory.js",
|
|
32
32
|
"types": "./dist/services/systemMemory.d.ts"
|
|
33
33
|
},
|
|
34
|
+
"./wsl-host": {
|
|
35
|
+
"import": "./dist/services/wslHost.js",
|
|
36
|
+
"types": "./dist/services/wslHost.d.ts"
|
|
37
|
+
},
|
|
34
38
|
"./shader-transitions": {
|
|
35
39
|
"import": "./dist/utils/shaderTransitions.js",
|
|
36
40
|
"types": "./dist/utils/shaderTransitions.d.ts"
|
|
@@ -46,8 +50,8 @@
|
|
|
46
50
|
"linkedom": "^0.18.12",
|
|
47
51
|
"puppeteer": "^25.8.0",
|
|
48
52
|
"puppeteer-core": "^25.8.0",
|
|
49
|
-
"@hyperframes/core": "^0.8.
|
|
50
|
-
"@hyperframes/parsers": "^0.8.
|
|
53
|
+
"@hyperframes/core": "^0.8.155",
|
|
54
|
+
"@hyperframes/parsers": "^0.8.155"
|
|
51
55
|
},
|
|
52
56
|
"devDependencies": {
|
|
53
57
|
"@types/node": "^25.0.10",
|