History

Distribute platform binaries via optionalDependencies (#488)

* Distribute platform binaries via optionalDependencies The npm wrapper used to download the matching platform binary from GitHub Releases in a postinstall step. That broke `bun i -g executor` two ways: bun blocks postinstalls by default, and the launcher's `#!/usr/bin/env node` shebang fails outright on machines without node. Mirror the pattern opencode and the esbuild/swc family use: - Each per-platform package (executor-linux-x64, executor-darwin-arm64, ...) is published to npm with `os`/`cpu` fields. The wrapper lists them all under `optionalDependencies`, so npm/bun's filtering only fetches the matching one. - The launcher walks parent `node_modules` for the platform package and execs its binary, with a glibc/musl preference chain on Linux. - Postinstall is a fast-path: it hardlinks the resolved binary to `bin/.executor` so subsequent launches skip the walk. It always exits 0 — failures are non-fatal because the launcher does the same walk at runtime, which also covers the bun-blocks-postinstalls case. - The legacy `bin/runtime/` lookup is kept as a fallback so the pkg.pr.new preview wrapper (which downloads per-PR builds from R2) keeps working unchanged. - `publish` now ships every platform package in parallel before the wrapper, so optionalDependencies always resolve to packages that exist on npm. For the no-node-at-all case (e.g. `bun i -g` without node installed), add `scripts/install.sh`: a POSIX installer that downloads the matching release tarball/zip into `~/.executor/bin` and PATH-appends. Same pattern opencode uses for its curl-installer path. Smoke test rewritten to exercise the new flow: build wrapper + current-platform package, set up the install layout `<root>/executor/node_modules/executor-<plat>-<arch>`, run the launcher, boot `executor web`, and verify the bundled UI serves. * install.sh: drop dead bin/ branch, the tarball is flat * Drop postinstall, async signal forwarding, remove secure-exec Codex-style cleanups on top of the optionalDependencies switch: - Drop the postinstall script entirely. The launcher already does the same require.resolve at runtime, so the bin/.executor cache only saves ~1ms per launch and adds surface area. Also removes the bun-blocks- postinstalls failure mode — there's no postinstall to block. - Switch the launcher from spawnSync to async spawn with explicit forwarding of SIGINT/SIGTERM/SIGHUP, so Ctrl-C reaches the binary cleanly during long-running commands like `executor web`. - Detect bun vs npm in the launcher and tell the user the right reinstall command if the platform binary is missing. Remove secure-exec, which is no longer used: - @executor-js/runtime-secure-exec had zero consumers in the codebase (only its own tests imported it). Delete the package, drop its entry from .changeset/config.json. - Remove resolveSecureExecV8 and secureExecBundlePlugin from build.ts; the binary no longer copies a secure-exec-v8 sidecar or runs the esbuild plugin that inlined @secure-exec/nodejs polyfills + bridge code. - Drop the secure-exec mention from main.ts's PATH-augmentation comment and from install.sh's sidecar comment.

Rhys Sullivan committed 6 months ago

Commit c0f618f1 parent 5d586d912 files · +544 −1393Browse files

Unified · Split

12 files
  1. .changeset/config.json +0 −1
  2. apps/cli/src/build.ts +108 −301
  3. apps/cli/src/main.ts +2 −1
  4. bun.lock +1 −266
  5. packages/kernel/runtime-secure-exec/CHANGELOG.md +0 −1
  6. packages/kernel/runtime-secure-exec/package.json +0 −26
  7. packages/kernel/runtime-secure-exec/src/index.test.ts +0 −160
  8. packages/kernel/runtime-secure-exec/src/index.ts +0 −442
  9. packages/kernel/runtime-secure-exec/tsconfig.json +0 −23
  10. packages/kernel/runtime-secure-exec/vitest.config.ts +0 −8
  11. scripts/install.sh +285 −0
  12. tests/release-bootstrap-smoke.test.ts +148 −164
.changeset/config.json+0−1
@@ -32,7 +32,6 @@ · 31 unmodified lines
3232 "@executor-js/runtime-deno-subprocess",
3333 "@executor-js/marketing",
3434 "@executor-js/runtime-dynamic-worker",
35− "@executor-js/runtime-secure-exec",
3635 "@executor-js/storage-postgres",
3736 "@executor-js/plugin-workos-vault",
3837 "@executor-js/example-promise-sdk"
apps/cli/src/build.ts+108−301
@@ -106,33 +106,6 @@ const binaryName = (t: Target) => (t.os === "win32" ? "executor.exe" : "executor · 105 unmodified lines
106106 const isCurrentPlatform = (t: Target) =>
107107 t.os === process.platform && t.arch === process.arch && !t.abi;
108108
109−/** Resolve the platform-specific secure-exec-v8 binary for a given target. */
110−const resolveSecureExecV8 = (t: Target): string | null => {
111− const platformMap: Record<string, string> = {
112− "darwin-arm64": "@secure-exec/v8-darwin-arm64",
113− "darwin-x64": "@secure-exec/v8-darwin-x64",
114− "linux-arm64": "@secure-exec/v8-linux-arm64-gnu",
115− "linux-x64": "@secure-exec/v8-linux-x64-gnu",
116− };
117− const key = `${t.os}-${t.arch}`;
118− const pkg = platformMap[key];
119− if (!pkg) return null;
120− try {
121− // Resolve from @secure-exec/v8 which has these as optional deps
122− const req = createRequire(join(repoRoot, "node_modules", "secure-exec", "package.json"));
123− const pkgJson = req.resolve(`${pkg}/package.json`);
124− return join(dirname(pkgJson), "secure-exec-v8");
125− } catch {
126− // Try bun's flat node_modules layout
127− const bunPath = join(
128− repoRoot,
129− `node_modules/.bun/${pkg.replace("/", "+")}@0.2.1/node_modules/${pkg}/secure-exec-v8`,
130− );
131− if (existsSync(bunPath)) return bunPath;
132− return null;
133− }
134−};
135−
136109 /**
137110 * Resolve the platform-specific @napi-rs/keyring native binding for a target.
138111 *
@@ -260,102 +233,6 @@ const createEmbeddedMigrationsSource = async () => { · 121 unmodified lines
260233 ].join("\n");
261234 };
262235
263−// ---------------------------------------------------------------------------
264−// Bun.build plugin for @secure-exec bundling issues
265−// ---------------------------------------------------------------------------
266−
267−/**
268− * Plugin that fixes two issues with @secure-exec in compiled binaries:
269− *
270− * 1. node-stdlib-browser / web-streams-polyfill eagerly call require.resolve()
271− * at import time, which fails in bunfs. We stub these out since our code
272− * never uses the polyfill functions.
273− *
274− * 2. bridge-loader.js reads bridge.js from disk via fs.readFileSync using
275− * __dirname. In a compiled binary __dirname points into bunfs where the
276− * file doesn't exist. We replace bridge-loader with a version that embeds
277− * bridge.js content directly.
278− */
279−const secureExecBundlePlugin = async (): Promise<import("bun").BunPlugin> => {
280− // Read files at build time so we can inline them into the compiled binary.
281− // bridge.js is loaded via fs.readFileSync at runtime, which fails in bunfs.
282− // bridgeAttach comes from @secure-exec/core's generated isolate-runtime.
283− const secureExecNodejs = join(
284− repoRoot,
285− "node_modules/.bun/@secure-exec+nodejs@0.2.1/node_modules/@secure-exec/nodejs",
286− );
287− const secureExecCore = join(
288− repoRoot,
289− "node_modules/.bun/@secure-exec+core@0.2.1/node_modules/@secure-exec/core",
290− );
291− const bridgeCode = await Bun.file(join(secureExecNodejs, "dist/bridge.js")).text();
292− const isolateRuntime = await import(join(secureExecCore, "dist/generated/isolate-runtime.js"));
293− const bridgeAttachCode = isolateRuntime.ISOLATE_RUNTIME_SOURCES.bridgeAttach;
294− const polyfillCodeMap = (await import(join(secureExecCore, "dist/generated/polyfills.js")))
295− .POLYFILL_CODE_MAP as Record<string, string>;
296−
297− return {
298− name: "secure-exec-bundle-fixes",
299− setup(build) {
300− // Stub polyfill modules that fail at import time in compiled binaries
301− const stubTargets = /node-stdlib-browser|web-streams-polyfill/;
302− build.onResolve({ filter: stubTargets }, (args) => ({
303− path: args.path,
304− namespace: "stub",
305− }));
306− // Replace @secure-exec/nodejs polyfills (which use node-stdlib-browser + esbuild
307− // at runtime) with a shim that serves from pre-bundled POLYFILL_CODE_MAP.
308− build.onResolve({ filter: /polyfills/ }, (args) => {
309− if (
310− args.importer.includes("@secure-exec/nodejs") ||
311− args.importer.includes("@secure-exec+nodejs")
312− ) {
313− return { path: args.path, namespace: "polyfills-shim" };
314− }
315− });
316− build.onLoad({ filter: /.*/, namespace: "polyfills-shim" }, () => ({
317− contents: `
318−const POLYFILL_CODE_MAP = ${JSON.stringify(polyfillCodeMap)};
319−const polyfillCache = new Map();
320−export default {};
321−export async function bundlePolyfill(moduleName) {
322− const cached = polyfillCache.get(moduleName);
323− if (cached) return cached;
324− const code = POLYFILL_CODE_MAP[moduleName];
325− if (!code) throw new Error("No polyfill available for module: " + moduleName);
326− polyfillCache.set(moduleName, code);
327− return code;
328−}
329−export function getAvailableStdlib() { return Object.keys(POLYFILL_CODE_MAP); }
330−export function hasPolyfill(name) { return name.replace(/^node:/, "") in POLYFILL_CODE_MAP; }
331−export async function prebundleAllPolyfills() { return { ...POLYFILL_CODE_MAP }; }
332− `,
333− loader: "js",
334− }));
335− build.onLoad({ filter: /.*/, namespace: "stub" }, () => ({
336− contents: "export default {};",
337− loader: "js",
338− }));
339−
340− // Replace bridge-loader with pre-read content
341− build.onResolve({ filter: /bridge-loader/ }, (args) => {
342− if (args.importer.includes("secure-exec")) {
343− return { path: args.path, namespace: "bridge" };
344− }
345− });
346− build.onLoad({ filter: /.*/, namespace: "bridge" }, () => ({
347− contents: `
348−const bridgeCode = ${JSON.stringify(bridgeCode)};
349−const bridgeAttachCode = ${JSON.stringify(bridgeAttachCode)};
350−export function getRawBridgeCode() { return bridgeCode; }
351−export function getBridgeAttachCode() { return bridgeAttachCode; }
352− `,
353− loader: "js",
354− }));
355− },
356− };
357−};
358−
359236 // ---------------------------------------------------------------------------
360237 // Build platform binaries
361238 // ---------------------------------------------------------------------------
@@ -372,10 +249,9 @@ const buildBinaries = async (targets: Target[], mode: BuildMode) => { · 10 unmodified lines
372249 await rm(distDir, { recursive: true, force: true });
373250
374251 // Cross-platform builds need every target's optional native packages
375− // (e.g. @napi-rs/keyring-darwin-arm64, @secure-exec/v8-win32-x64) so we
376− // can copy the right .node / binary next to each target's executor.
377− // `bun install --frozen-lockfile --cpu=* --os=*` extracts them all
378− // without modifying the lockfile.
252+ // (e.g. @napi-rs/keyring-darwin-arm64) so we can copy the right .node next
253+ // to each target's executor. `bun install --frozen-lockfile --cpu=* --os=*`
254+ // extracts them all without modifying the lockfile.
379255 const needsCrossPlatform = targets.some((t) => !isCurrentPlatform(t));
380256 if (needsCrossPlatform) {
381257 console.log("Installing optional native deps for all platforms...");
@@ -414,20 +290,11 @@ const buildBinaries = async (targets: Target[], mode: BuildMode) => { · 32 unmodified lines
414290 target: bunTarget(target),
415291 outfile: join(binDir, binaryName(target)),
416292 },
417− plugins: [await secureExecBundlePlugin()],
418293 });
419294
420295 // Copy QuickJS WASM next to binary — loaded at runtime by the server
421296 await cp(quickJsWasmPath, join(binDir, "emscripten-module.wasm"));
422297
423− // Copy secure-exec-v8 binary next to executor — needed for code execution
424− const secureExecBin = resolveSecureExecV8(target);
425− if (secureExecBin && existsSync(secureExecBin)) {
426− const destName = target.os === "win32" ? "secure-exec-v8.exe" : "secure-exec-v8";
427− await cp(secureExecBin, join(binDir, destName));
428− await chmod(join(binDir, destName), 0o755);
429− }
430−
431298 // Copy @napi-rs/keyring native binding next to executor — bun --compile
432299 // doesn't bundle .node files, so the loader needs to find it on disk
433300 // via NAPI_RS_NATIVE_LIBRARY_PATH (set in main.ts).
@@ -444,16 +311,23 @@ const buildBinaries = async (targets: Target[], mode: BuildMode) => { · 10 unmodified lines
444311 console.log(` OK: ${version.trim()}`);
445312 }
446313
447− // Platform package.json
314+ // Platform package.json. No `bin` field on purpose — the wrapper's
315+ // launcher walks node_modules to locate `bin/executor` directly. Adding
316+ // a bin here would race with the wrapper for the global `executor`
317+ // entry under flat installs.
448318 await writeFile(
449319 join(outDir, "package.json"),
450320 JSON.stringify(
451321 {
452322 name,
453323 version: meta.version,
324+ description: `${meta.description} (${name})`,
454325 os: [target.os],
455326 cpu: [target.arch],
456− bin: { executor: `bin/${binaryName(target)}` },
327+ homepage: meta.homepage,
328+ bugs: meta.bugs,
329+ repository: meta.repository,
330+ license: meta.license,
457331 },
458332 null,
459333 2,
@@ -481,14 +355,14 @@ const buildWrapperPackage = async (binaries: Record<string, string>) => { · 21 unmodified lines
481355
482356 await mkdir(binDir, { recursive: true });
483357
484− // Node.js shim that spawns the downloaded platform binary
358+ // Node.js launcher — resolves the platform binary via require.resolve
359+ // against optionalDependencies and execs it. No postinstall: the binary
360+ // ships as an os/cpu-filtered optional dep, the launcher resolves it at
361+ // runtime. This works whether or not the package manager runs postinstalls
362+ // (bun blocks them by default).
485363 await writeFile(join(binDir, "executor"), NODE_SHIM);
486364 await chmod(join(binDir, "executor"), 0o755);
487365
488− // Postinstall downloads the matching release asset from GitHub Releases
489− await writeFile(join(wrapperDir, "postinstall.cjs"), POSTINSTALL_SCRIPT);
490−
491− // Package.json
492366 await writeFile(
493367 join(wrapperDir, "package.json"),
494368 JSON.stringify(
@@ -502,9 +376,9 @@ const buildWrapperPackage = async (binaries: Record<string, string>) => { · 7 unmodified lines
502376 repository: meta.repository,
503377 license: meta.license,
504378 bin: { executor: "bin/executor" },
505− scripts: {
506− postinstall: "node ./postinstall.cjs",
507− },
379+ // Per-platform compiled binaries. npm/bun install only the entry
380+ // matching the current os/cpu; everything else is a no-op.
381+ optionalDependencies: binaries,
508382 engines: {
509383 node: ">=20",
510384 },
@@ -514,7 +388,6 @@ const buildWrapperPackage = async (binaries: Record<string, string>) => { · 3 unmodified lines
514388 ) + "\n",
515389 );
516390
517− // README
518391 const readmePath = join(repoRoot, "README.md");
519392 if (existsSync(readmePath)) {
520393 await cp(readmePath, join(wrapperDir, "README.md"));
@@ -522,7 +395,7 @@ const buildWrapperPackage = async (binaries: Record<string, string>) => { · 1 unmodified line
522395
523396 console.log(`\nWrapper package: ${wrapperDir}`);
524397 console.log(` ${meta.name}@${meta.version}`);
525− console.log(` release assets: ${Object.keys(binaries).join(", ")}`);
398+ console.log(` optionalDependencies: ${Object.keys(binaries).join(", ")}`);
526399 };
527400
528401 // ---------------------------------------------------------------------------
@@ -669,9 +542,20 @@ const publishPackedPackage = async (pkgDir: string, channel: string) => { · 140 unmodified lines
669542 const publish = async (channel: string) => {
670543 const meta = await readMetadata();
671544
672− // Publish only the wrapper npm package. Platform binaries are distributed via GitHub release assets.
545+ // Publish per-platform packages first so the wrapper's
546+ // optionalDependencies resolve to packages that already exist on npm
547+ // by the time anyone installs the wrapper.
548+ const platformDirs: string[] = [];
549+ for (const entry of new Bun.Glob("executor-*/package.json").scanSync({ cwd: distDir })) {
550+ platformDirs.push(join(distDir, dirname(entry)));
551+ }
552+ platformDirs.sort();
553+
554+ console.log(`Publishing ${platformDirs.length} platform package(s)...`);
555+ await Promise.all(platformDirs.map((dir) => publishPackedPackage(dir, channel)));
556+
673557 const wrapperDir = join(distDir, meta.name);
674− console.log(`Publishing ${wrapperDir}...`);
558+ console.log(`Publishing wrapper ${wrapperDir}...`);
675559 await publishPackedPackage(wrapperDir, channel);
676560 };
677561
@@ -707,107 +591,48 @@ const createReleaseAssets = async () => { · 29 unmodified lines
707591 };
708592
709593 // ---------------------------------------------------------------------------
710−// Node.js shim — finds the right platform binary and spawns it
594+// Node.js launcher — resolves the platform binary shipped as an
595+// optionalDependency and execs it. Resolution order:
596+// 1. EXECUTOR_BIN_PATH override
597+// 2. require.resolve("executor-<platform>-<arch>/package.json")
598+// 3. bin/runtime/<binary> (preview wrapper compat — pkg.pr.new previews
599+// download the binary here at install time instead of via
600+// optionalDependencies)
601+//
602+// Signals (SIGINT/SIGTERM/SIGHUP) are forwarded to the child so long-running
603+// commands like `executor web` shut down cleanly under Ctrl-C.
711604 // ---------------------------------------------------------------------------
712605
713606 const NODE_SHIM = `#!/usr/bin/env node
714607 const childProcess = require("child_process");
715608 const fs = require("fs");
716609 const path = require("path");
610+const os = require("os");
717611
718−function run(target) {
719− const result = childProcess.spawnSync(target, process.argv.slice(2), { stdio: "inherit" });
720− if (result.error) {
721− console.error(result.error.message);
722− process.exit(1);
723− }
724− process.exit(typeof result.status === "number" ? result.status : 0);
725−}
726−
727−if (process.env.EXECUTOR_BIN_PATH) run(process.env.EXECUTOR_BIN_PATH);
728−
729−const scriptDir = path.dirname(fs.realpathSync(__filename));
730−const binary = process.platform === "win32" ? "executor.exe" : "executor";
731−const runtimeBinary = path.join(scriptDir, "runtime", binary);
732−const legacyCached = path.join(scriptDir, process.platform === "win32" ? ".executor.exe" : ".executor");
733−
734−const resolveInstalledBinary = () => {
735− if (fs.existsSync(runtimeBinary)) {
736− return runtimeBinary;
737− }
738− if (fs.existsSync(legacyCached)) {
739− return legacyCached;
740− }
741− return null;
742−};
743−
744−const installIfNeeded = () => {
745− const existing = resolveInstalledBinary();
746− if (existing) {
747− return existing;
748− }
749−
750− const installer = path.resolve(scriptDir, "..", "postinstall.cjs");
751− if (!fs.existsSync(installer)) {
752− return null;
753− }
754−
755− console.error("executor binary is missing; downloading release asset...");
756− const result = childProcess.spawnSync(process.execPath, [installer], {
757− stdio: "inherit",
758− env: process.env,
612+function spawnAndExit(target) {
613+ const child = childProcess.spawn(target, process.argv.slice(2), { stdio: "inherit" });
614+ child.on("error", (err) => { console.error(err.message); process.exit(1); });
615+ const forward = (signal) => { if (!child.killed) { try { child.kill(signal); } catch {} } };
616+ ["SIGINT", "SIGTERM", "SIGHUP"].forEach((sig) => process.on(sig, () => forward(sig)));
617+ child.on("exit", (code, signal) => {
618+ if (signal) process.kill(process.pid, signal);
619+ else process.exit(typeof code === "number" ? code : 0);
759620 });
760−
761− if (result.error) {
762− console.error(result.error.message);
763− process.exit(1);
764− }
765−
766− if (typeof result.status === "number" && result.status !== 0) {
767− process.exit(result.status);
768− }
769−
770− return resolveInstalledBinary();
771−};
772−
773−const installedBinary = installIfNeeded();
774−if (!installedBinary) {
775− console.error("executor binary is missing. Reinstall the package or run 'npm rebuild executor'.");
776− process.exit(1);
777621 }
778622
779−run(installedBinary);
780−`;
781−
782−// ---------------------------------------------------------------------------
783−// Postinstall — hardlink/copy the platform binary for fast startup
784−// ---------------------------------------------------------------------------
785−
786−const POSTINSTALL_SCRIPT = `#!/usr/bin/env node
787−const childProcess = require("child_process");
788−const fs = require("fs");
789−const path = require("path");
790−const os = require("os");
791−
792−const packageDir = path.dirname(fs.realpathSync(__filename));
793−const binDir = path.join(packageDir, "bin");
794−const runtimeDir = path.join(binDir, "runtime");
795−const packageJson = JSON.parse(fs.readFileSync(path.join(packageDir, "package.json"), "utf8"));
623+if (process.env.EXECUTOR_BIN_PATH) {
624+ spawnAndExit(process.env.EXECUTOR_BIN_PATH);
625+ return;
626+}
796627
797−const repositoryUrl = typeof packageJson.repository === "string"
798− ? packageJson.repository
799− : packageJson.repository && packageJson.repository.url;
800−const githubBase = String(packageJson.homepage || repositoryUrl || "https://github.com/RhysSullivan/executor")
801− .replace(/^git[+]/, "")
802− .replace(/.git$/, "");
803−const version = packageJson.version;
628+const isWin = process.platform === "win32";
629+const binary = isWin ? "executor.exe" : "executor";
804630
631+// Package names use "windows" (not "win32") to match what the build script emits.
805632 const platformMap = { darwin: "darwin", linux: "linux", win32: "windows" };
633+const archMap = { x64: "x64", arm64: "arm64" };
806634 const platform = platformMap[os.platform()] || os.platform();
807−const arch = os.arch() === "arm64" ? "arm64" : "x64";
808−const binary = platform === "windows" ? "executor.exe" : "executor";
809−const cachedBinary = path.join(runtimeDir, binary);
810−const legacyCachedBinary = path.join(binDir, platform === "windows" ? ".executor.exe" : ".executor");
635+const arch = archMap[os.arch()] || os.arch();
811636
812637 const isMusl = (() => {
813638 if (platform !== "linux") return false;
@@ -819,79 +644,61 @@ const isMusl = (() => { · 5 unmodified lines
819644 return false;
820645 })();
821646
822−const assetBase = (() => {
647+// Candidate package names in preference order. On linux a system might match
648+// glibc or musl; try musl first if detected, glibc first otherwise.
649+const candidates = (() => {
823650 const base = "executor-" + platform + "-" + arch;
824− if (platform === "linux" && isMusl) return base + "-musl";
825− return base;
826−})();
827−const archiveName = platform === "linux" ? assetBase + ".tar.gz" : assetBase + ".zip";
828−const downloadUrl = githubBase + "/releases/download/v" + version + "/" + archiveName;
829−const archivePath = path.join(packageDir, archiveName);
830−
831−const run = (command, args) => {
832− const result = childProcess.spawnSync(command, args, { stdio: "inherit" });
833− if (result.error) throw result.error;
834− if (typeof result.status === "number" && result.status !== 0) {
835− throw new Error(command + " exited with code " + result.status);
836− }
837−};
838−
839−const download = async () => {
840− const response = await fetch(downloadUrl, { redirect: "follow" });
841− if (!response.ok) {
842− throw new Error("Failed to download " + downloadUrl + " (status " + response.status + ")");
843− }
844− const arrayBuffer = await response.arrayBuffer();
845− fs.writeFileSync(archivePath, Buffer.from(arrayBuffer));
846−};
847−
848−const extract = () => {
849− fs.mkdirSync(binDir, { recursive: true });
850− fs.rmSync(runtimeDir, { recursive: true, force: true });
851− fs.mkdirSync(runtimeDir, { recursive: true });
852−
853651 if (platform === "linux") {
854− run("tar", ["-xzf", archivePath, "-C", runtimeDir]);
855− return;
856− }
857−
858− if (platform === "darwin") {
859− run("unzip", ["-o", archivePath, "-d", runtimeDir]);
860− return;
652+ return isMusl ? [base + "-musl", base] : [base, base + "-musl"];
861653 }
654+ return [base];
655+})();
862656
863− const psCommand = [
864− "$ErrorActionPreference = 'Stop'",
865− "Expand-Archive -LiteralPath '" + archivePath.replace(/'/g, "''") + "' -DestinationPath '" + runtimeDir.replace(/'/g, "''") + "' -Force",
866− ].join("; ");
867− const psArgs = ["-NoLogo", "-NoProfile", "-Command", psCommand];
868− // Prefer pwsh (PowerShell 7+) which reliably has Expand-Archive; fall back to powershell.exe
869− const pwshResult = childProcess.spawnSync("pwsh", psArgs, { stdio: "inherit" });
870− if (pwshResult.error || (typeof pwshResult.status === "number" && pwshResult.status !== 0)) {
871− run("powershell.exe", psArgs);
657+function detectPackageManager() {
658+ const ua = process.env.npm_config_user_agent || "";
659+ if (/\\bbun\\//.test(ua)) return "bun";
660+ const execPath = process.env.npm_execpath || "";
661+ if (execPath.includes("bun")) return "bun";
662+ if (__dirname.includes(".bun/install/global") || __dirname.includes(".bun\\\\install\\\\global")) {
663+ return "bun";
872664 }
873−};
665+ return ua ? "npm" : null;
666+}
874667
875−(async () => {
668+for (const name of candidates) {
876669 try {
877− await download();
878− extract();
879−
880− if (!fs.existsSync(cachedBinary)) {
881− throw new Error("Expected extracted binary at " + cachedBinary);
882− }
883−
884− if (fs.existsSync(legacyCachedBinary)) {
885− fs.unlinkSync(legacyCachedBinary);
670+ const pkgJson = require.resolve(name + "/package.json");
671+ const candidate = path.join(path.dirname(pkgJson), "bin", binary);
672+ if (fs.existsSync(candidate)) {
673+ spawnAndExit(candidate);
674+ return;
886675 }
887− if (platform !== "windows") fs.chmodSync(cachedBinary, 0o755);
888− fs.rmSync(archivePath, { force: true });
889− console.log("executor: installed " + assetBase + " from GitHub Releases");
890− } catch (error) {
891− console.error("executor postinstall failed:", error && error.message ? error.message : error);
892− process.exit(1);
676+ } catch {
677+ // package not installed for this platform; try next candidate
893678 }
894−})();
679+}
680+
681+// Preview wrapper compat: pkg.pr.new previews download the platform binary
682+// to bin/runtime/ rather than via optionalDependencies.
683+const scriptDir = path.dirname(fs.realpathSync(__filename));
684+const previewBinary = path.join(scriptDir, "runtime", binary);
685+if (fs.existsSync(previewBinary)) {
686+ spawnAndExit(previewBinary);
687+ return;
688+}
689+
690+const pm = detectPackageManager();
691+const reinstall = pm === "bun"
692+ ? "bun install -g executor"
693+ : pm === "npm"
694+ ? "npm install -g executor"
695+ : "reinstall executor";
696+console.error(
697+ "executor: could not locate a platform binary for " + os.platform() + "-" + os.arch() + ".\\n" +
698+ "Tried optionalDependencies: " + candidates.map((n) => '"' + n + '"').join(", ") + "\\n" +
699+ "To fix: " + reinstall
700+);
701+process.exit(1);
895702 `;
896703
897704 // ---------------------------------------------------------------------------
apps/cli/src/main.ts+2−1
@@ -1,6 +1,7 @@
1−// Ensure binaries next to the executor (e.g. secure-exec-v8) are on $PATH
21 import { randomUUID } from "node:crypto";
32 import { dirname, join, resolve } from "node:path";
3+// Make sibling binaries (if any are added later) discoverable on $PATH so
4+// child processes spawned without an absolute path still find them.
45 const execDir = dirname(process.execPath);
56 if (process.env.PATH && !process.env.PATH.includes(execDir)) {
67 process.env.PATH = `${execDir}:${process.env.PATH}`;
bun.lock+1−266
@@ -519,21 +519,6 @@ · 518 unmodified lines
519519 "vitest": "catalog:",
520520 },
521521 },
522− "packages/kernel/runtime-secure-exec": {
523− "name": "@executor-js/runtime-secure-exec",
524− "version": "0.0.3",
525− "dependencies": {
526− "@executor-js/codemode-core": "workspace:*",
527− "effect": "catalog:",
528− "secure-exec": "^0.2.1",
529− },
530− "devDependencies": {
531− "@effect/vitest": "catalog:",
532− "@types/node": "catalog:",
533− "bun-types": "catalog:",
534− "vitest": "catalog:",
535− },
536− },
537522 "packages/plugins/example": {
538523 "name": "@executor-js/plugin-example",
539524 "version": "0.0.1",
@@ -1009,18 +994,6 @@ · 469 unmodified lines
1009994
1010995 "@capsizecss/unpack": ["@capsizecss/unpack@4.0.0", "", { "dependencies": { "fontkitten": "^1.0.0" } }, "sha512-VERIM64vtTP1C4mxQ5thVT9fK0apjPFobqybMtA1UdUujWka24ERHbRHFGmpbbhp73MhV+KSsHQH9C6uOTdEQA=="],
1011996
1012− "@cbor-extract/cbor-extract-darwin-arm64": ["@cbor-extract/cbor-extract-darwin-arm64@2.2.2", "", { "os": "darwin", "cpu": "arm64" }, "sha512-ZKZ/F8US7JR92J4DMct6cLW/Y66o2K576+zjlEN/MevH70bFIsB10wkZEQPLzl2oNh2SMGy55xpJ9JoBRl5DOA=="],
1013−
1014− "@cbor-extract/cbor-extract-darwin-x64": ["@cbor-extract/cbor-extract-darwin-x64@2.2.2", "", { "os": "darwin", "cpu": "x64" }, "sha512-32b1mgc+P61Js+KW9VZv/c+xRw5EfmOcPx990JbCBSkYJFY0l25VinvyyWfl+3KjibQmAcYwmyzKF9J4DyKP/Q=="],
1015−
1016− "@cbor-extract/cbor-extract-linux-arm": ["@cbor-extract/cbor-extract-linux-arm@2.2.2", "", { "os": "linux", "cpu": "arm" }, "sha512-tNg0za41TpQfkhWjptD+0gSD2fggMiDCSacuIeELyb2xZhr7PrhPe5h66Jc67B/5dmpIhI2QOUtv4SBsricyYQ=="],
1017−
1018− "@cbor-extract/cbor-extract-linux-arm64": ["@cbor-extract/cbor-extract-linux-arm64@2.2.2", "", { "os": "linux", "cpu": "arm64" }, "sha512-wfqgzqCAy/Vn8i6WVIh7qZd0DdBFaWBjPdB6ma+Wihcjv0gHqD/mw3ouVv7kbbUNrab6dKEx/w3xQZEdeXIlzg=="],
1019−
1020− "@cbor-extract/cbor-extract-linux-x64": ["@cbor-extract/cbor-extract-linux-x64@2.2.2", "", { "os": "linux", "cpu": "x64" }, "sha512-rpiLnVEsqtPJ+mXTdx1rfz4RtUGYIUg2rUAZgd1KjiC1SehYUSkJN7Yh+aVfSjvCGtVP0/bfkQkXpPXKbmSUaA=="],
1021−
1022− "@cbor-extract/cbor-extract-win32-x64": ["@cbor-extract/cbor-extract-win32-x64@2.2.2", "", { "os": "win32", "cpu": "x64" }, "sha512-dI+9P7cfWxkTQ+oE+7Aa6onEn92PHgfWXZivjNheCRmTBDBf2fx6RyTi0cmgpYLnD1KLZK9ZYrMxaPZ4oiXhGA=="],
1023−
1024997 "@cfworker/json-schema": ["@cfworker/json-schema@4.1.1", "", {}, "sha512-gAmrUZSGtKc3AiBL71iNWxDsyUC5uMaKKGdvzYsBoTW/xi42JQHl7eKV2OYzCUqvc+D2RCcf7EXY2iCyFIk6og=="],
1025998
1026999 "@changesets/apply-release-plan": ["@changesets/apply-release-plan@7.1.0", "", { "dependencies": { "@changesets/config": "^3.1.3", "@changesets/get-version-range-type": "^0.4.0", "@changesets/git": "^3.0.4", "@changesets/should-skip-package": "^0.1.2", "@changesets/types": "^6.1.0", "@manypkg/get-packages": "^1.1.3", "detect-indent": "^6.0.0", "fs-extra": "^7.0.1", "lodash.startcase": "^4.4.0", "outdent": "^0.5.0", "prettier": "^2.7.1", "resolve-from": "^5.0.0", "semver": "^7.5.3" } }, "sha512-yq8ML3YS7koKQ/9bk1PqO0HMzApIFNwjlwCnwFEXMzNe8NpzeeYYKCmnhWJGkN8g7E51MnWaSbqRcTcdIxUgnQ=="],
@@ -1287,8 +1260,6 @@ · 260 unmodified lines
12871260
12881261 "@executor-js/runtime-quickjs": ["@executor-js/runtime-quickjs@workspace:packages/kernel/runtime-quickjs"],
12891262
1290− "@executor-js/runtime-secure-exec": ["@executor-js/runtime-secure-exec@workspace:packages/kernel/runtime-secure-exec"],
1291−
12921263 "@executor-js/sdk": ["@executor-js/sdk@workspace:packages/core/sdk"],
12931264
12941265 "@executor-js/storage-core": ["@executor-js/storage-core@workspace:packages/core/storage-core"],
@@ -2053,20 +2024,6 @@ · 758 unmodified lines
20532024
20542025 "@sec-ant/readable-stream": ["@sec-ant/readable-stream@0.4.1", "", {}, "sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg=="],
20552026
2056− "@secure-exec/core": ["@secure-exec/core@0.2.1", "", { "dependencies": { "better-sqlite3": "^12.8.0" } }, "sha512-HsnUv6gClpMA1BBRmX86j30TKTZtgJC/fO1tVavr7IpM2zNKbHU8LgSlBd7mv2SNy02ImTmU/GnQ3aYB4NSbEg=="],
2057−
2058− "@secure-exec/nodejs": ["@secure-exec/nodejs@0.2.1", "", { "dependencies": { "@secure-exec/core": "0.2.1", "@secure-exec/v8": "0.2.1", "cbor-x": "^1.6.4", "cjs-module-lexer": "^2.1.0", "es-module-lexer": "^1.7.0", "esbuild": "^0.27.1", "node-stdlib-browser": "^1.3.1", "web-streams-polyfill": "^4.2.0" } }, "sha512-UJMJqVFxexlHJV0Q9nWURvrz6GElj8673DDOOFln6FHR6JS+9SaSU3eISrN158DuNC3SFi4rgjb/scKnK4YOYQ=="],
2059−
2060− "@secure-exec/v8": ["@secure-exec/v8@0.2.1", "", { "dependencies": { "cbor-x": "^1.6.4" }, "optionalDependencies": { "@secure-exec/v8-darwin-arm64": "0.2.1", "@secure-exec/v8-darwin-x64": "0.2.1", "@secure-exec/v8-linux-arm64-gnu": "0.2.1", "@secure-exec/v8-linux-x64-gnu": "0.2.1" } }, "sha512-ye/seCqzvyMGnvyP+AO7RkVMR/lE3x9m0D2PfmiAXA457R78ZmOFmZ6v+JlJG2vv3LM30KsSXTUhwpG+Teh0hw=="],
2061−
2062− "@secure-exec/v8-darwin-arm64": ["@secure-exec/v8-darwin-arm64@0.2.1", "", { "os": "darwin", "cpu": "arm64" }, "sha512-gEWhMHzUpLwzuBNAD0lVkZXE8wFlWMLp4IOZ+56FYwOW/C+m07cYxuW4TjHyPqZ+vPm3IkoaMqqH5yT9VhjX/Q=="],
2063−
2064− "@secure-exec/v8-darwin-x64": ["@secure-exec/v8-darwin-x64@0.2.1", "", { "os": "darwin", "cpu": "x64" }, "sha512-H2Z5K+Cq+fn/kxjGvhJzepnNFWG6qNdyhZybVWGr5bAAZoSz/Qkad4WnXcurWU+880tKDtnf19LHBXrg7zewNQ=="],
2065−
2066− "@secure-exec/v8-linux-arm64-gnu": ["@secure-exec/v8-linux-arm64-gnu@0.2.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-14subGhVV/gW35mYYm7Gv1Keeex7PxIgQfoKji/JH7wYyDuarP6kgaES0nJw+JXVkxEVud52c+kbcIjIggqCEw=="],
2067−
2068− "@secure-exec/v8-linux-x64-gnu": ["@secure-exec/v8-linux-x64-gnu@0.2.1", "", { "os": "linux", "cpu": "x64" }, "sha512-Az4s+vUf+78vWtsC7rTn/jQc6WKJafAdt2YpEjB4Gnu+sX+FFTIst1hRV4gJonbRyJdy6SW+OQ6DZatmwczorQ=="],
2069−
20702027 "@sentry-internal/browser-utils": ["@sentry-internal/browser-utils@10.48.0", "", { "dependencies": { "@sentry/core": "10.48.0" } }, "sha512-SCiTLBXzugFKxev6NoKYBIhQoDk0gUh0AVVVepCBqfCJiWBG01Zvv0R5tCVohr4cWRllkQ8mlBdNQd/I7s9tdA=="],
20712028
20722029 "@sentry-internal/feedback": ["@sentry-internal/feedback@10.48.0", "", { "dependencies": { "@sentry/core": "10.48.0" } }, "sha512-tGkEyOM1HDS9qebDphUMEnyk3qq/50AnuTBiFmMJyjNzowylVGmRRk0sr3xkmbVHCDXQCiYnDmSVlJ2x4SDMrQ=="],
@@ -2435,10 +2392,6 @@ · 362 unmodified lines
24352392
24362393 "array-union": ["array-union@2.1.0", "", {}, "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw=="],
24372394
2438− "asn1.js": ["asn1.js@4.10.1", "", { "dependencies": { "bn.js": "^4.0.0", "inherits": "^2.0.1", "minimalistic-assert": "^1.0.0" } }, "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw=="],
2439−
2440− "assert": ["assert@2.1.0", "", { "dependencies": { "call-bind": "^1.0.2", "is-nan": "^1.3.2", "object-is": "^1.1.5", "object.assign": "^4.1.4", "util": "^0.12.5" } }, "sha512-eLHpSK/Y4nhMJ07gDaAzoX/XAKS8PSaojml3M0DM4JpV1LAi5JOJ/p6H/XWrl8L+DzVEvVCW1z3vWAaB9oTsQw=="],
2441−
24422395 "assert-plus": ["assert-plus@1.0.0", "", {}, "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw=="],
24432396
24442397 "assertion-error": ["assertion-error@2.0.1", "", {}, "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA=="],
@@ -2469,8 +2422,6 @@ · 24 unmodified lines
24692422
24702423 "autumn-js": ["autumn-js@1.2.8", "", { "dependencies": { "query-string": "^9.2.2", "rou3": "^0.6.1", "zod": "^4.0.0" }, "peerDependencies": { "better-auth": "^1.3.17", "better-call": "^1.0.12", "express": "^5.2.1", "hono": "^4.0.0", "next": "^14.0.0 || ^15.0.0", "react": "^18.0.0 || ^19.0.0" }, "optionalPeers": ["better-auth", "better-call", "express", "hono", "next", "react"] }, "sha512-N1DIlfC2CCxQN//po6I5+wULkw28PhNxW4tzLGWn48H3r6M1bP+DkuFtMeeD24vZZ3J8ajqUjPEJE6L6JoLiRw=="],
24712424
2472− "available-typed-arrays": ["available-typed-arrays@1.0.7", "", { "dependencies": { "possible-typed-array-names": "^1.0.0" } }, "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ=="],
2473−
24742425 "axios": ["axios@1.15.0", "", { "dependencies": { "follow-redirects": "^1.15.11", "form-data": "^4.0.5", "proxy-from-env": "^2.1.0" } }, "sha512-wWyJDlAatxk30ZJer+GeCWS209sA42X+N5jU2jy6oHTp7ufw8uzUTVFBX9+wTfAlhiJXGS0Bq7X6efruWjuK9Q=="],
24752426
24762427 "axobject-query": ["axobject-query@4.1.0", "", {}, "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ=="],
@@ -2501,8 +2452,6 @@ · 24 unmodified lines
25012452
25022453 "blake3-wasm": ["blake3-wasm@2.1.5", "", {}, "sha512-F1+K8EbfOZE49dtoPtmxUQrpXaBIl3ICvasLh+nJta0xkz+9kF/7uet9fLnwKqhDrmj6g+6K3Tw9yQPUg2ka5g=="],
25032454
2504− "bn.js": ["bn.js@5.2.3", "", {}, "sha512-EAcmnPkxpntVL+DS7bO1zhcZNvCkxqtkd0ZY53h06GNQ3DEkkGZ/gKgmDv6DdZQGj9BgfSPKtJJ7Dp1GPP8f7w=="],
2505−
25062455 "body-parser": ["body-parser@2.2.2", "", { "dependencies": { "bytes": "^3.1.2", "content-type": "^1.0.5", "debug": "^4.4.3", "http-errors": "^2.0.0", "iconv-lite": "^0.7.0", "on-finished": "^2.4.1", "qs": "^6.14.1", "raw-body": "^3.0.1", "type-is": "^2.0.1" } }, "sha512-oP5VkATKlNwcgvxi0vM0p/D3n2C3EReYVX+DNYs5TjZFn/oQt2j+4sVJtSMr18pdRr8wjTcBl6LoV+FUwzPmNA=="],
25072456
25082457 "boolbase": ["boolbase@1.0.0", "", {}, "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww=="],
@@ -2513,22 +2462,6 @@ · 4 unmodified lines
25132462
25142463 "braces": ["braces@3.0.3", "", { "dependencies": { "fill-range": "^7.1.1" } }, "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA=="],
25152464
2516− "brorand": ["brorand@1.1.0", "", {}, "sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w=="],
2517−
2518− "browser-resolve": ["browser-resolve@2.0.0", "", { "dependencies": { "resolve": "^1.17.0" } }, "sha512-7sWsQlYL2rGLy2IWm8WL8DCTJvYLc/qlOnsakDac87SOoCd16WLsaAMdCiAqsTNHIe+SXfaqyxyo6THoWqs8WQ=="],
2519−
2520− "browserify-aes": ["browserify-aes@1.2.0", "", { "dependencies": { "buffer-xor": "^1.0.3", "cipher-base": "^1.0.0", "create-hash": "^1.1.0", "evp_bytestokey": "^1.0.3", "inherits": "^2.0.1", "safe-buffer": "^5.0.1" } }, "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA=="],
2521−
2522− "browserify-cipher": ["browserify-cipher@1.0.1", "", { "dependencies": { "browserify-aes": "^1.0.4", "browserify-des": "^1.0.0", "evp_bytestokey": "^1.0.0" } }, "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w=="],
2523−
2524− "browserify-des": ["browserify-des@1.0.2", "", { "dependencies": { "cipher-base": "^1.0.1", "des.js": "^1.0.0", "inherits": "^2.0.1", "safe-buffer": "^5.1.2" } }, "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A=="],
2525−
2526− "browserify-rsa": ["browserify-rsa@4.1.1", "", { "dependencies": { "bn.js": "^5.2.1", "randombytes": "^2.1.0", "safe-buffer": "^5.2.1" } }, "sha512-YBjSAiTqM04ZVei6sXighu679a3SqWORA3qZTEqZImnlkDIFtKc6pNutpjyZ8RJTjQtuYfeetkxM11GwoYXMIQ=="],
2527−
2528− "browserify-sign": ["browserify-sign@4.2.5", "", { "dependencies": { "bn.js": "^5.2.2", "browserify-rsa": "^4.1.1", "create-hash": "^1.2.0", "create-hmac": "^1.1.7", "elliptic": "^6.6.1", "inherits": "^2.0.4", "parse-asn1": "^5.1.9", "readable-stream": "^2.3.8", "safe-buffer": "^5.2.1" } }, "sha512-C2AUdAJg6rlM2W5QMp2Q4KGQMVBwR1lIimTsUnutJ8bMpW5B52pGpR2gEnNBNwijumDo5FojQ0L9JrXA8m4YEw=="],
2529−
2530− "browserify-zlib": ["browserify-zlib@0.2.0", "", { "dependencies": { "pako": "~1.0.5" } }, "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA=="],
2531−
25322465 "browserslist": ["browserslist@4.28.2", "", { "dependencies": { "baseline-browser-mapping": "^2.10.12", "caniuse-lite": "^1.0.30001782", "electron-to-chromium": "^1.5.328", "node-releases": "^2.0.36", "update-browserslist-db": "^1.2.3" }, "bin": { "browserslist": "cli.js" } }, "sha512-48xSriZYYg+8qXna9kwqjIVzuQxi+KYWp2+5nCYnYKPTr0LvD89Jqk2Or5ogxz0NUMfIjhh2lIUX/LyX9B4oIg=="],
25332466
25342467 "buffer": ["buffer@5.7.1", "", { "dependencies": { "base64-js": "^1.3.1", "ieee754": "^1.1.13" } }, "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ=="],
@@ -2539,14 +2472,10 @@ · 4 unmodified lines
25392472
25402473 "buffer-from": ["buffer-from@1.1.2", "", {}, "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ=="],
25412474
2542− "buffer-xor": ["buffer-xor@1.0.3", "", {}, "sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ=="],
2543−
25442475 "builder-util": ["builder-util@26.8.1", "", { "dependencies": { "7zip-bin": "~5.2.0", "@types/debug": "^4.1.6", "app-builder-bin": "5.0.0-alpha.12", "builder-util-runtime": "9.5.1", "chalk": "^4.1.2", "cross-spawn": "^7.0.6", "debug": "^4.3.4", "fs-extra": "^10.1.0", "http-proxy-agent": "^7.0.0", "https-proxy-agent": "^7.0.0", "js-yaml": "^4.1.0", "sanitize-filename": "^1.6.3", "source-map-support": "^0.5.19", "stat-mode": "^1.0.0", "temp-file": "^3.4.0", "tiny-async-pool": "1.3.0" } }, "sha512-pm1lTYbGyc90DHgCDO7eo8Rl4EqKLciayNbZqGziqnH9jrlKe8ZANGdityLZU+pJh16dfzjAx2xQq9McuIPEtw=="],
25452476
25462477 "builder-util-runtime": ["builder-util-runtime@9.5.1", "", { "dependencies": { "debug": "^4.3.4", "sax": "^1.2.4" } }, "sha512-qt41tMfgHTllhResqM5DcnHyDIWNgzHvuY2jDcYP9iaGpkWxTUzV6GQjDeLnlR1/DtdlcsWQbA7sByMpmJFTLQ=="],
25472478
2548− "builtin-status-codes": ["builtin-status-codes@3.0.0", "", {}, "sha512-HpGFw18DgFWlncDfjTa2rcQ4W88O1mC8e8yZ2AvQY5KDaktSTwo+KRf6nHK6FRI5FyRyb/5T6+TSxfP7QyGsmQ=="],
2549−
25502479 "bun-types": ["bun-types@1.3.12", "", { "dependencies": { "@types/node": "*" } }, "sha512-HqOLj5PoFajAQciOMRiIZGNoKxDJSr6qigAttOX40vJuSp6DN/CxWp9s3C1Xwm4oH7ybueITwiaOcWXoYVoRkA=="],
25512480
25522481 "bundle-name": ["bundle-name@4.1.0", "", { "dependencies": { "run-applescript": "^7.0.0" } }, "sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q=="],
@@ -2563,8 +2492,6 @@ · 10 unmodified lines
25632492
25642493 "cacheable-request": ["cacheable-request@7.0.4", "", { "dependencies": { "clone-response": "^1.0.2", "get-stream": "^5.1.0", "http-cache-semantics": "^4.0.0", "keyv": "^4.0.0", "lowercase-keys": "^2.0.0", "normalize-url": "^6.0.1", "responselike": "^2.0.0" } }, "sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg=="],
25652494
2566− "call-bind": ["call-bind@1.0.9", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.2", "es-define-property": "^1.0.1", "get-intrinsic": "^1.3.0", "set-function-length": "^1.2.2" } }, "sha512-a/hy+pNsFUTR+Iz8TCJvXudKVLAnz/DyeSUo10I5yvFDQJBFU2s9uqQpoSrJlroHUKoKqzg+epxyP9lqFdzfBQ=="],
2567−
25682495 "call-bind-apply-helpers": ["call-bind-apply-helpers@1.0.2", "", { "dependencies": { "es-errors": "^1.3.0", "function-bind": "^1.1.2" } }, "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ=="],
25692496
25702497 "call-bound": ["call-bound@1.0.4", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.2", "get-intrinsic": "^1.3.0" } }, "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg=="],
@@ -2573,10 +2500,6 @@ · 2 unmodified lines
25732500
25742501 "caniuse-lite": ["caniuse-lite@1.0.30001788", "", {}, "sha512-6q8HFp+lOQtcf7wBK+uEenxymVWkGKkjFpCvw5W25cmMwEDU45p1xQFBQv8JDlMMry7eNxyBaR+qxgmTUZkIRQ=="],
25752502
2576− "cbor-extract": ["cbor-extract@2.2.2", "", { "dependencies": { "node-gyp-build-optional-packages": "5.1.1" }, "optionalDependencies": { "@cbor-extract/cbor-extract-darwin-arm64": "2.2.2", "@cbor-extract/cbor-extract-darwin-x64": "2.2.2", "@cbor-extract/cbor-extract-linux-arm": "2.2.2", "@cbor-extract/cbor-extract-linux-arm64": "2.2.2", "@cbor-extract/cbor-extract-linux-x64": "2.2.2", "@cbor-extract/cbor-extract-win32-x64": "2.2.2" }, "bin": { "download-cbor-prebuilds": "bin/download-prebuilds.js" } }, "sha512-hlSxxI9XO2yQfe9g6msd3g4xCfDqK5T5P0fRMLuaLHhxn4ViPrm+a+MUfhrvH2W962RGxcBwEGzLQyjbDG1gng=="],
2577−
2578− "cbor-x": ["cbor-x@1.6.4", "", { "optionalDependencies": { "cbor-extract": "^2.2.2" } }, "sha512-UGKHjp6RHC6QuZ2yy5LCKm7MojM4716DwoSaqwQpaH4DvZvbBTGcoDNTiG9Y2lByXZYFEs9WRkS5tLl96IrF1Q=="],
2579−
25802503 "ccount": ["ccount@2.0.1", "", {}, "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg=="],
25812504
25822505 "cfonts": ["cfonts@3.3.1", "", { "dependencies": { "supports-color": "^8", "window-size": "^1" }, "bin": { "cfonts": "bin/index.js" } }, "sha512-ZGEmN3W9mViWEDjsuPo4nK4h39sfh6YtoneFYp9WLPI/rw8BaSSrfQC6jkrGW3JMvV3ZnExJB/AEqXc/nHYxkw=="],
@@ -2613,8 +2536,6 @@ · 30 unmodified lines
26132536
26142537 "ci-info": ["ci-info@4.4.0", "", {}, "sha512-77PSwercCZU2Fc4sX94eF8k8Pxte6JAwL4/ICZLFjJLqegs7kCuAsqqj/70NQF6TvDpgFjkubQB2FW2ZZddvQg=="],
26152538
2616− "cipher-base": ["cipher-base@1.0.7", "", { "dependencies": { "inherits": "^2.0.4", "safe-buffer": "^5.2.1", "to-buffer": "^1.2.2" } }, "sha512-Mz9QMT5fJe7bKI7MH31UilT5cEK5EHHRCccw/YRFsRY47AuNgaV6HY3rscp0/I4Q+tTW/5zoqpSeRRI54TkDWA=="],
2617−
26182539 "cjs-module-lexer": ["cjs-module-lexer@1.4.3", "", {}, "sha512-9z8TZaGM1pfswYeXrUpzPrkx8UnWYdhJclsiYMm6x/w5+nN+8Tf/LnAgfLGQCm59qAOxU8WwHEq2vNwF6i4j+Q=="],
26192540
26202541 "class-variance-authority": ["class-variance-authority@0.7.1", "", { "dependencies": { "clsx": "^2.1.1" } }, "sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg=="],
@@ -2679,10 +2600,6 @@ · 58 unmodified lines
26792600
26802601 "consola": ["consola@3.4.2", "", {}, "sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA=="],
26812602
2682− "console-browserify": ["console-browserify@1.2.0", "", {}, "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA=="],
2683−
2684− "constants-browserify": ["constants-browserify@1.0.0", "", {}, "sha512-xFxOwqIzR/e1k1gLiWEophSCMqXcwVHIH7akf7b/vxcUeGunlj3hvZaaqxwHsTgn+IndtkQJgSztIDWeumWJDQ=="],
2685−
26862603 "content-disposition": ["content-disposition@1.1.0", "", {}, "sha512-5jRCH9Z/+DRP7rkvY83B+yGIGX96OYdJmzngqnw2SBSxqCFPd0w2km3s5iawpGX8krnwSGmF0FW5Nhr0Hfai3g=="],
26872604
26882605 "content-type": ["content-type@1.0.5", "", {}, "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA=="],
@@ -2711,14 +2628,6 @@ · 22 unmodified lines
27112628
27122629 "crc": ["crc@3.8.0", "", { "dependencies": { "buffer": "^5.1.0" } }, "sha512-iX3mfgcTMIq3ZKLIsVFAbv7+Mc10kxabAGQb8HvjA1o3T1PIYprbakQ65d3I+2HGHt6nSKkM9PYjgoJO2KcFBQ=="],
27132630
2714− "create-ecdh": ["create-ecdh@4.0.4", "", { "dependencies": { "bn.js": "^4.1.0", "elliptic": "^6.5.3" } }, "sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A=="],
2715−
2716− "create-hash": ["create-hash@1.2.0", "", { "dependencies": { "cipher-base": "^1.0.1", "inherits": "^2.0.1", "md5.js": "^1.3.4", "ripemd160": "^2.0.1", "sha.js": "^2.4.0" } }, "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg=="],
2717−
2718− "create-hmac": ["create-hmac@1.1.7", "", { "dependencies": { "cipher-base": "^1.0.3", "create-hash": "^1.1.0", "inherits": "^2.0.1", "ripemd160": "^2.0.0", "safe-buffer": "^5.0.1", "sha.js": "^2.4.8" } }, "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg=="],
2719−
2720− "create-require": ["create-require@1.1.1", "", {}, "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ=="],
2721−
27222631 "cron-schedule": ["cron-schedule@6.0.0", "", {}, "sha512-BoZaseYGXOo5j5HUwTaegIog3JJbuH4BbrY9A1ArLjXpy+RWb3mV28F/9Gv1dDA7E2L8kngWva4NWisnLTyfgQ=="],
27232632
27242633 "cross-dirname": ["cross-dirname@0.1.0", "", {}, "sha512-+R08/oI0nl3vfPcqftZRpytksBXDzOUveBq/NBVx0sUp1axwzPQrKinNx5yd5sxPu8j1wIy8AfnVQ+5eFdha6Q=="],
@@ -2727,8 +2636,6 @@ · 2 unmodified lines
27272636
27282637 "crossws": ["crossws@0.3.5", "", { "dependencies": { "uncrypto": "^0.1.3" } }, "sha512-ojKiDvcmByhwa8YYqbQI/hg7MEU0NC03+pSdEq4ZUnZR9xXpwk7E43SMNGkn+JxJGPFtNvQ48+vV2p+P1ml5PA=="],
27292638
2730− "crypto-browserify": ["crypto-browserify@3.12.1", "", { "dependencies": { "browserify-cipher": "^1.0.1", "browserify-sign": "^4.2.3", "create-ecdh": "^4.0.4", "create-hash": "^1.2.0", "create-hmac": "^1.1.7", "diffie-hellman": "^5.0.3", "hash-base": "~3.0.4", "inherits": "^2.0.4", "pbkdf2": "^3.1.2", "public-encrypt": "^4.0.3", "randombytes": "^2.1.0", "randomfill": "^1.0.4" } }, "sha512-r4ESw/IlusD17lgQi1O20Fa3qNnsckR126TdUuBgAu7GBYSIPvdNyONd3Zrxh0xCwA4+6w/TDArBPsMvhur+KQ=="],
2731−
27322639 "crypto-random-string": ["crypto-random-string@4.0.0", "", { "dependencies": { "type-fest": "^1.0.1" } }, "sha512-x8dy3RnvYdlUcPOjkEHqozhiwzKNSq7GcPuXFbnyMOCHxX8V3OgIg/pYuabl2sbUPfIJaeAQB7PMOK8DFIdoRA=="],
27332640
27342641 "css-select": ["css-select@5.2.2", "", { "dependencies": { "boolbase": "^1.0.0", "css-what": "^6.1.0", "domhandler": "^5.0.2", "domutils": "^3.0.1", "nth-check": "^2.0.1" } }, "sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw=="],
@@ -2861,8 +2768,6 @@ · 126 unmodified lines
28612768
28622769 "dequal": ["dequal@2.0.3", "", {}, "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA=="],
28632770
2864− "des.js": ["des.js@1.1.0", "", { "dependencies": { "inherits": "^2.0.1", "minimalistic-assert": "^1.0.0" } }, "sha512-r17GxjhUCjSRy8aiJpr8/UadFIzMzJGexI3Nmz4ADi9LYSFx4gTBp80+NaX/YsXWWLhpZ7v/v/ubEc/bCNfKwg=="],
2865−
28662771 "destr": ["destr@2.0.5", "", {}, "sha512-ugFTXCtDZunbzasqBxrK93Ik/DRYsO6S/fedkWEMKqt04xZ4csmnmwGDBAb07QWNaGMAmnTIemsYZCksjATwsA=="],
28672772
28682773 "detect-indent": ["detect-indent@6.1.0", "", {}, "sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA=="],
@@ -2879,8 +2784,6 @@ · 10 unmodified lines
28792784
28802785 "diff": ["diff@8.0.4", "", {}, "sha512-DPi0FmjiSU5EvQV0++GFDOJ9ASQUVFh5kD+OzOnYdi7n3Wpm9hWWGfB/O2blfHcMVTL5WkQXSnRiK9makhrcnw=="],
28812786
2882− "diffie-hellman": ["diffie-hellman@5.0.3", "", { "dependencies": { "bn.js": "^4.1.0", "miller-rabin": "^4.0.0", "randombytes": "^2.0.0" } }, "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg=="],
2883−
28842787 "dir-compare": ["dir-compare@4.2.0", "", { "dependencies": { "minimatch": "^3.0.5", "p-limit": "^3.1.0 " } }, "sha512-2xMCmOoMrdQIPHdsTawECdNPwlVFB9zGcz3kuhmBO6U3oU+UQjsue0i8ayLKpgBcm+hcXPMVSGUN9d+pvJ6+VQ=="],
28852788
28862789 "dir-glob": ["dir-glob@3.0.1", "", { "dependencies": { "path-type": "^4.0.0" } }, "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA=="],
@@ -2893,8 +2796,6 @@ · 6 unmodified lines
28932796
28942797 "dom-serializer": ["dom-serializer@2.0.0", "", { "dependencies": { "domelementtype": "^2.3.0", "domhandler": "^5.0.2", "entities": "^4.2.0" } }, "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg=="],
28952798
2896− "domain-browser": ["domain-browser@4.22.0", "", {}, "sha512-IGBwjF7tNk3cwypFNH/7bfzBcgSCbaMOD3GsaY1AU/JRrnHnYgEM0+9kQt52iZxjNsjBtJYtao146V+f8jFZNw=="],
2897−
28982799 "domelementtype": ["domelementtype@2.3.0", "", {}, "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw=="],
28992800
29002801 "domhandler": ["domhandler@5.0.3", "", { "dependencies": { "domelementtype": "^2.3.0" } }, "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w=="],
@@ -2939,8 +2840,6 @@ · 38 unmodified lines
29392840
29402841 "electron-winstaller": ["electron-winstaller@5.4.0", "", { "dependencies": { "@electron/asar": "^3.2.1", "debug": "^4.1.1", "fs-extra": "^7.0.1", "lodash": "^4.17.21", "temp": "^0.9.0" }, "optionalDependencies": { "@electron/windows-sign": "^1.1.2" } }, "sha512-bO3y10YikuUwUuDUQRM4KfwNkKhnpVO7IPdbsrejwN9/AABJzzTQ4GeHwyzNSrVO+tEH3/Np255a3sVZpZDjvg=="],
29412842
2942− "elliptic": ["elliptic@6.6.1", "", { "dependencies": { "bn.js": "^4.11.9", "brorand": "^1.1.0", "hash.js": "^1.0.0", "hmac-drbg": "^1.0.1", "inherits": "^2.0.4", "minimalistic-assert": "^1.0.1", "minimalistic-crypto-utils": "^1.0.1" } }, "sha512-RaddvvMatK2LJHqFJ+YA4WysVN5Ita9E35botqIYspQ4TkRAlCicdzKOjlyv/1Za5RyTNn7di//eEV0uTAfe3g=="],
2943−
29442843 "embla-carousel": ["embla-carousel@8.6.0", "", {}, "sha512-SjWyZBHJPbqxHOzckOfo8lHisEaJWmwd23XppYFYVh10bU66/Pn5tkVkbkCMZVdbUE5eTCI2nD8OyIP4Z+uwkA=="],
29452844
29462845 "embla-carousel-react": ["embla-carousel-react@8.6.0", "", { "dependencies": { "embla-carousel": "8.6.0", "embla-carousel-reactive-utils": "8.6.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.1 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" } }, "sha512-0/PjqU7geVmo6F734pmPqpyHqiM99olvyecY7zdweCw+6tKEXnrE90pBiBbMMU8s5tICemzpQ3hi5EpxzGW+JA=="],
@@ -3025,14 +2924,10 @@ · 78 unmodified lines
30252924
30262925 "eventemitter3": ["eventemitter3@5.0.4", "", {}, "sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw=="],
30272926
3028− "events": ["events@3.3.0", "", {}, "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q=="],
3029−
30302927 "eventsource": ["eventsource@3.0.7", "", { "dependencies": { "eventsource-parser": "^3.0.1" } }, "sha512-CRT1WTyuQoD771GW56XEZFQ/ZoSfWid1alKGDYMmkt2yl8UXrVR4pspqWNEcqKvVIzg6PAltWjxcSSPrboA4iA=="],
30312928
30322929 "eventsource-parser": ["eventsource-parser@3.0.6", "", {}, "sha512-Vo1ab+QXPzZ4tCa8SwIHJFaSzy4R6SHf7BY79rFBDf0idraZWAkYrDjDj8uWaSm3S2TK+hJ7/t1CEmZ7jXw+pg=="],
30332930
3034− "evp_bytestokey": ["evp_bytestokey@1.0.3", "", { "dependencies": { "md5.js": "^1.3.4", "safe-buffer": "^5.1.1" } }, "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA=="],
3035−
30362931 "execa": ["execa@9.6.1", "", { "dependencies": { "@sindresorhus/merge-streams": "^4.0.0", "cross-spawn": "^7.0.6", "figures": "^6.1.0", "get-stream": "^9.0.0", "human-signals": "^8.0.1", "is-plain-obj": "^4.1.0", "is-stream": "^4.0.1", "npm-run-path": "^6.0.0", "pretty-ms": "^9.2.0", "signal-exit": "^4.1.0", "strip-final-newline": "^4.0.0", "yoctocolors": "^2.1.1" } }, "sha512-9Be3ZoN4LmYR90tUoVu2te2BsbzHfhJyfEiAVfz7N5/zv+jduIfLrV2xdQXOHbaD6KgpGdO9PRPM1Y4Q9QkPkA=="],
30372932
30382933 "executor": ["executor@workspace:apps/cli"],
@@ -3115,8 +3010,6 @@ · 76 unmodified lines
31153010
31163011 "fontkitten": ["fontkitten@1.0.3", "", { "dependencies": { "tiny-inflate": "^1.0.3" } }, "sha512-Wp1zXWPVUPBmfoa3Cqc9ctaKuzKAV6uLstRqlR56kSjplf5uAce+qeyYym7F+PHbGTk+tCEdkCW6RD7DX/gBZw=="],
31173012
3118− "for-each": ["for-each@0.3.5", "", { "dependencies": { "is-callable": "^1.2.7" } }, "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg=="],
3119−
31203013 "for-in": ["for-in@1.0.2", "", {}, "sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ=="],
31213014
31223015 "foreground-child": ["foreground-child@3.3.1", "", { "dependencies": { "cross-spawn": "^7.0.6", "signal-exit": "^4.0.1" } }, "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw=="],
@@ -3145,8 +3038,6 @@ · 22 unmodified lines
31453038
31463039 "function-bind": ["function-bind@1.1.2", "", {}, "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA=="],
31473040
3148− "generator-function": ["generator-function@2.0.1", "", {}, "sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g=="],
3149−
31503041 "gensync": ["gensync@1.0.0-beta.2", "", {}, "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg=="],
31513042
31523043 "get-caller-file": ["get-caller-file@2.0.5", "", {}, "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg=="],
@@ -3201,10 +3092,6 @@ · 48 unmodified lines
32013092
32023093 "has-tostringtag": ["has-tostringtag@1.0.2", "", { "dependencies": { "has-symbols": "^1.0.3" } }, "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw=="],
32033094
3204− "hash-base": ["hash-base@3.0.5", "", { "dependencies": { "inherits": "^2.0.4", "safe-buffer": "^5.2.1" } }, "sha512-vXm0l45VbcHEVlTCzs8M+s0VeYsB2lnlAaThoLKGXr3bE/VWDOelNUnycUPEhKEaXARL2TEFjBOyUiM6+55KBg=="],
3205−
3206− "hash.js": ["hash.js@1.1.7", "", { "dependencies": { "inherits": "^2.0.3", "minimalistic-assert": "^1.0.1" } }, "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA=="],
3207−
32083095 "hasown": ["hasown@2.0.2", "", { "dependencies": { "function-bind": "^1.1.2" } }, "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ=="],
32093096
32103097 "hast-util-from-dom": ["hast-util-from-dom@5.0.1", "", { "dependencies": { "@types/hast": "^3.0.0", "hastscript": "^9.0.0", "web-namespaces": "^2.0.0" } }, "sha512-N+LqofjR2zuzTjCPzyDUdSshy4Ma6li7p/c3pA78uTwzFgENbgbUrm2ugwsOdcjI1muO+o6Dgzp9p8WHtn/39Q=="],
@@ -3237,8 +3124,6 @@ · 26 unmodified lines
32373124
32383125 "hastscript": ["hastscript@9.0.1", "", { "dependencies": { "@types/hast": "^3.0.0", "comma-separated-tokens": "^2.0.0", "hast-util-parse-selector": "^4.0.0", "property-information": "^7.0.0", "space-separated-tokens": "^2.0.0" } }, "sha512-g7df9rMFX/SPi34tyGCyUBREQoKkapwdY/T04Qn9TDWfHhAYt4/I0gMVirzK5wEzeUqIjEB+LXC/ypb7Aqno5w=="],
32393126
3240− "hmac-drbg": ["hmac-drbg@1.0.1", "", { "dependencies": { "hash.js": "^1.0.3", "minimalistic-assert": "^1.0.0", "minimalistic-crypto-utils": "^1.0.1" } }, "sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg=="],
3241−
32423127 "hoist-non-react-statics": ["hoist-non-react-statics@3.3.2", "", { "dependencies": { "react-is": "^16.7.0" } }, "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw=="],
32433128
32443129 "hono": ["hono@4.12.14", "", {}, "sha512-am5zfg3yu6sqn5yjKBNqhnTX7Cv+m00ox+7jbaKkrLMRJ4rAdldd1xPd/JzbBWspqaQv6RSTrgFN95EsfhC+7w=="],
@@ -3261,8 +3146,6 @@ · 16 unmodified lines
32613146
32623147 "http2-wrapper": ["http2-wrapper@1.0.3", "", { "dependencies": { "quick-lru": "^5.1.1", "resolve-alpn": "^1.0.0" } }, "sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg=="],
32633148
3264− "https-browserify": ["https-browserify@1.0.0", "", {}, "sha512-J+FkSdyD+0mA0N+81tMotaRMfSL9SGi+xpD3T6YApKsc3bGSXJlfXri3VyFOeYkfLRQisDk1W+jIFFKBeUBbBg=="],
3265−
32663149 "https-proxy-agent": ["https-proxy-agent@7.0.6", "", { "dependencies": { "agent-base": "^7.1.2", "debug": "4" } }, "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw=="],
32673150
32683151 "human-id": ["human-id@4.1.3", "", { "bin": { "human-id": "dist/cli.js" } }, "sha512-tsYlhAYpjCKa//8rXZ9DqKEawhPoSytweBC2eNvcaDK+57RZLHGqNs3PZTQO6yekLFSuvA6AlnAfrw1uBvtb+Q=="],
@@ -3335,16 +3218,12 @@ · 66 unmodified lines
33353218
33363219 "is-alphanumerical": ["is-alphanumerical@2.0.1", "", { "dependencies": { "is-alphabetical": "^2.0.0", "is-decimal": "^2.0.0" } }, "sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw=="],
33373220
3338− "is-arguments": ["is-arguments@1.2.0", "", { "dependencies": { "call-bound": "^1.0.2", "has-tostringtag": "^1.0.2" } }, "sha512-7bVbi0huj/wrIAOzb8U1aszg9kdi3KN/CyU19CTI7tAoZYEZoL9yCDXpbXN+uPsuWnP02cyug1gleqq+TU+YCA=="],
3339−
33403221 "is-arrayish": ["is-arrayish@0.2.1", "", {}, "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg=="],
33413222
33423223 "is-binary-path": ["is-binary-path@2.1.0", "", { "dependencies": { "binary-extensions": "^2.0.0" } }, "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw=="],
33433224
33443225 "is-buffer": ["is-buffer@1.1.6", "", {}, "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w=="],
33453226
3346− "is-callable": ["is-callable@1.2.7", "", {}, "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA=="],
3347−
33483227 "is-core-module": ["is-core-module@2.16.1", "", { "dependencies": { "hasown": "^2.0.2" } }, "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w=="],
33493228
33503229 "is-data-descriptor": ["is-data-descriptor@1.0.1", "", { "dependencies": { "hasown": "^2.0.0" } }, "sha512-bc4NlCDiCr28U4aEsQ3Qs2491gVq4V8G7MQyws968ImqjKuYtTJXrl7Vq7jsN7Ly/C3xj5KWFrY7sHNeDkAzXw=="],
@@ -3361,8 +3240,6 @@ · 10 unmodified lines
33613240
33623241 "is-fullwidth-code-point": ["is-fullwidth-code-point@5.1.0", "", { "dependencies": { "get-east-asian-width": "^1.3.1" } }, "sha512-5XHYaSyiqADb4RnZ1Bdad6cPp8Toise4TzEjcOYDHZkTCbKgiUl7WTUCpNWHuxmDt91wnsZBc9xinNzopv3JMQ=="],
33633242
3364− "is-generator-function": ["is-generator-function@1.1.2", "", { "dependencies": { "call-bound": "^1.0.4", "generator-function": "^2.0.0", "get-proto": "^1.0.1", "has-tostringtag": "^1.0.2", "safe-regex-test": "^1.1.0" } }, "sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA=="],
3365−
33663243 "is-glob": ["is-glob@4.0.3", "", { "dependencies": { "is-extglob": "^2.1.1" } }, "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg=="],
33673244
33683245 "is-hexadecimal": ["is-hexadecimal@2.0.1", "", {}, "sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg=="],
@@ -3375,8 +3252,6 @@ · 6 unmodified lines
33753252
33763253 "is-mobile": ["is-mobile@5.0.0", "", {}, "sha512-Tz/yndySvLAEXh+Uk8liFCxOwVH6YutuR74utvOcu7I9Di+DwM0mtdPVZNaVvvBUM2OXxne/NhOs1zAO7riusQ=="],
33773254
3378− "is-nan": ["is-nan@1.3.2", "", { "dependencies": { "call-bind": "^1.0.0", "define-properties": "^1.1.3" } }, "sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w=="],
3379−
33803255 "is-number": ["is-number@3.0.0", "", { "dependencies": { "kind-of": "^3.0.2" } }, "sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg=="],
33813256
33823257 "is-plain-obj": ["is-plain-obj@4.1.0", "", {}, "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg=="],
@@ -3385,14 +3260,10 @@ · 2 unmodified lines
33853260
33863261 "is-promise": ["is-promise@4.0.0", "", {}, "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ=="],
33873262
3388− "is-regex": ["is-regex@1.2.1", "", { "dependencies": { "call-bound": "^1.0.2", "gopd": "^1.2.0", "has-tostringtag": "^1.0.2", "hasown": "^2.0.2" } }, "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g=="],
3389−
33903263 "is-stream": ["is-stream@4.0.1", "", {}, "sha512-Dnz92NInDqYckGEUJv689RbRiTSEHCQ7wOVeALbkOz999YpqT46yMRIGtSNl2iCL1waAZSx40+h59NV/EwzV/A=="],
33913264
33923265 "is-subdir": ["is-subdir@1.2.0", "", { "dependencies": { "better-path-resolve": "1.0.0" } }, "sha512-2AT6j+gXe/1ueqbW6fLZJiIw3F8iXGJtt0yDrZaBhAZEG1raiTxKWU+IPqMCzQAXOUCKdA4UDMgacKH25XG2Cw=="],
33933266
3394− "is-typed-array": ["is-typed-array@1.1.15", "", { "dependencies": { "which-typed-array": "^1.1.16" } }, "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ=="],
3395−
33963267 "is-unicode-supported": ["is-unicode-supported@2.1.0", "", {}, "sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ=="],
33973268
33983269 "is-wayland": ["is-wayland@0.1.0", "", {}, "sha512-QkbMsWkIfkrzOPxenwye0h56iAXirZYHG9eHVPb22fO9y+wPbaX/CHacOWBa/I++4ohTcByimhM1/nyCsH8KNA=="],
@@ -3403,8 +3274,6 @@ · 4 unmodified lines
34033274
34043275 "is64bit": ["is64bit@2.0.0", "", { "dependencies": { "system-architecture": "^0.1.0" } }, "sha512-jv+8jaWCl0g2lSBkNSVXdzfBA0npK1HGC2KtWM9FumFRoGS94g3NbCCLVnCYHLjp4GrW2KZeeSTMo5ddtznmGw=="],
34053276
3406− "isarray": ["isarray@1.0.0", "", {}, "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ=="],
3407−
34083277 "isbinaryfile": ["isbinaryfile@5.0.7", "", {}, "sha512-gnWD14Jh3FzS3CPhF0AxNOJ8CxqeblPTADzI38r0wt8ZyQl5edpy75myt08EG2oKvpyiqSqsx+Wkz9vtkbTqYQ=="],
34093278
34103279 "isbot": ["isbot@5.1.38", "", {}, "sha512-Cus2702JamTNMEY4zTP+TShgq/3qzjvGcBC4XMOV45BLaxD4iUFENkqu7ZhFeSzwNsCSZLjnGlihDQznnpnEEA=="],
@@ -3413,8 +3282,6 @@ · 2 unmodified lines
34133282
34143283 "isobject": ["isobject@3.0.1", "", {}, "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg=="],
34153284
3416− "isomorphic-timers-promises": ["isomorphic-timers-promises@1.0.1", "", {}, "sha512-u4sej9B1LPSxTGKB/HiuzvEQnXH0ECYkSVQU39koSwmFAxhlEAFl9RdTvLv4TOTQUgBS5O3O5fwUxk6byBZ+IQ=="],
3417−
34183285 "jackspeak": ["jackspeak@3.4.3", "", { "dependencies": { "@isaacs/cliui": "^8.0.2" }, "optionalDependencies": { "@pkgjs/parseargs": "^0.11.0" } }, "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw=="],
34193286
34203287 "jake": ["jake@10.9.4", "", { "dependencies": { "async": "^3.2.6", "filelist": "^1.0.4", "picocolors": "^1.1.1" }, "bin": { "jake": "bin/cli.js" } }, "sha512-wpHYzhxiVQL+IV05BLE2Xn34zW1S223hvjtqk0+gsPrwd/8JNLXJgZZM/iPFsYc1xyphF+6M6EvdE5E9MBGkDA=="],
@@ -3583,8 +3450,6 @@ · 162 unmodified lines
35833450
35843451 "math-intrinsics": ["math-intrinsics@1.1.0", "", {}, "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g=="],
35853452
3586− "md5.js": ["md5.js@1.3.5", "", { "dependencies": { "hash-base": "^3.0.0", "inherits": "^2.0.1", "safe-buffer": "^5.1.2" } }, "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg=="],
3587−
35883453 "mdast-util-definitions": ["mdast-util-definitions@6.0.0", "", { "dependencies": { "@types/mdast": "^4.0.0", "@types/unist": "^3.0.0", "unist-util-visit": "^5.0.0" } }, "sha512-scTllyX6pnYNZH/AIp/0ePz6s4cZtARxImwoPJ7kS42n+MnVsI4XbnG6d4ibehRIldYMWM2LD7ImQblVhUejVQ=="],
35893454
35903455 "mdast-util-find-and-replace": ["mdast-util-find-and-replace@3.0.2", "", { "dependencies": { "@types/mdast": "^4.0.0", "escape-string-regexp": "^5.0.0", "unist-util-is": "^6.0.0", "unist-util-visit-parents": "^6.0.0" } }, "sha512-Tmd1Vg/m3Xz43afeNxDIhWRtFZgM2VLyaf4vSTYwudTyeuTneoL3qtWMA5jeLyz/O1vDJmmV4QuScFCA2tBPwg=="],
@@ -3715,8 +3580,6 @@ · 124 unmodified lines
37153580
37163581 "micromatch": ["micromatch@4.0.8", "", { "dependencies": { "braces": "^3.0.3", "picomatch": "^2.3.1" } }, "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA=="],
37173582
3718− "miller-rabin": ["miller-rabin@4.0.1", "", { "dependencies": { "bn.js": "^4.0.0", "brorand": "^1.0.1" }, "bin": { "miller-rabin": "bin/miller-rabin" } }, "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA=="],
3719−
37203583 "mime": ["mime@4.1.0", "", { "bin": { "mime": "bin/cli.js" } }, "sha512-X5ju04+cAzsojXKes0B/S4tcYtFAJ6tTMuSPBEn9CPGlrWr8Fiw7qYeLT0XyH80HSoAoqWCaz+MWKh22P7G1cw=="],
37213584
37223585 "mime-db": ["mime-db@1.54.0", "", {}, "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ=="],
@@ -3733,10 +3596,6 @@ · 10 unmodified lines
37333596
37343597 "miniflare": ["miniflare@4.20260424.0", "", { "dependencies": { "@cspotcode/source-map-support": "0.8.1", "sharp": "^0.34.5", "undici": "7.24.8", "workerd": "1.20260424.1", "ws": "8.18.0", "youch": "4.1.0-beta.10" }, "bin": { "miniflare": "bootstrap.js" } }, "sha512-B6MKBBd5TJ19daUc3Ae9rWctn1nDA/VCXykXfCsp9fTxyfGxnZY27tJs1caxgE9MWEMMKGbGHouqVtgKbKGxmw=="],
37353598
3736− "minimalistic-assert": ["minimalistic-assert@1.0.1", "", {}, "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A=="],
3737−
3738− "minimalistic-crypto-utils": ["minimalistic-crypto-utils@1.0.1", "", {}, "sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg=="],
3739−
37403599 "minimatch": ["minimatch@10.2.5", "", { "dependencies": { "brace-expansion": "^5.0.5" } }, "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg=="],
37413600
37423601 "minimist": ["minimist@1.2.8", "", {}, "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA=="],
@@ -3811,8 +3670,6 @@ · 68 unmodified lines
38113670
38123671 "node-releases": ["node-releases@2.0.37", "", {}, "sha512-1h5gKZCF+pO/o3Iqt5Jp7wc9rH3eJJ0+nh/CIoiRwjRxde/hAHyLPXYN4V3CqKAbiZPSeJFSWHmJsbkicta0Eg=="],
38133672
3814− "node-stdlib-browser": ["node-stdlib-browser@1.3.1", "", { "dependencies": { "assert": "^2.0.0", "browser-resolve": "^2.0.0", "browserify-zlib": "^0.2.0", "buffer": "^5.7.1", "console-browserify": "^1.1.0", "constants-browserify": "^1.0.0", "create-require": "^1.1.1", "crypto-browserify": "^3.12.1", "domain-browser": "4.22.0", "events": "^3.0.0", "https-browserify": "^1.0.0", "isomorphic-timers-promises": "^1.0.1", "os-browserify": "^0.3.0", "path-browserify": "^1.0.1", "pkg-dir": "^5.0.0", "process": "^0.11.10", "punycode": "^1.4.1", "querystring-es3": "^0.2.1", "readable-stream": "^3.6.0", "stream-browserify": "^3.0.0", "stream-http": "^3.2.0", "string_decoder": "^1.0.0", "timers-browserify": "^2.0.4", "tty-browserify": "0.0.1", "url": "^0.11.4", "util": "^0.12.4", "vm-browserify": "^1.0.1" } }, "sha512-X75ZN8DCLftGM5iKwoYLA3rjnrAEs97MkzvSd4q2746Tgpg8b8XWiBGiBG4ZpgcAqBgtgPHTiAc8ZMCvZuikDw=="],
3815−
38163673 "nopt": ["nopt@8.1.0", "", { "dependencies": { "abbrev": "^3.0.0" }, "bin": { "nopt": "bin/nopt.js" } }, "sha512-ieGu42u/Qsa4TFktmaKEwM6MQH0pOWnaB3htzh0JRtx84+Mebc0cbZYN5bC+6WTZ4+77xrL9Pn5m7CV6VIkV7A=="],
38173674
38183675 "normalize-path": ["normalize-path@3.0.0", "", {}, "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA=="],
@@ -3833,12 +3690,8 @@ · 14 unmodified lines
38333690
38343691 "object-inspect": ["object-inspect@1.13.4", "", {}, "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew=="],
38353692
3836− "object-is": ["object-is@1.1.6", "", { "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1" } }, "sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q=="],
3837−
38383693 "object-keys": ["object-keys@1.1.1", "", {}, "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA=="],
38393694
3840− "object.assign": ["object.assign@4.1.7", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.3", "define-properties": "^1.2.1", "es-object-atoms": "^1.0.0", "has-symbols": "^1.1.0", "object-keys": "^1.1.1" } }, "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw=="],
3841−
38423695 "obug": ["obug@2.1.1", "", {}, "sha512-uTqF9MuPraAQ+IsnPf366RG4cP9RtUi7MLO1N3KEc+wb0a6yKpeL0lmk2IB1jY5KHPAlTc6T/JRdC/YqxHNwkQ=="],
38433696
38443697 "ofetch": ["ofetch@1.5.1", "", { "dependencies": { "destr": "^2.0.5", "node-fetch-native": "^1.6.7", "ufo": "^1.6.1" } }, "sha512-2W4oUZlVaqAPAil6FUg/difl6YhqhUR7x2eZY4bQCko22UXg3hptq9KLQdqFClV+Wu85UX7hNtdGTngi/1BxcA=="],
@@ -3863,8 +3716,6 @@ · 18 unmodified lines
38633716
38643717 "ora": ["ora@8.2.0", "", { "dependencies": { "chalk": "^5.3.0", "cli-cursor": "^5.0.0", "cli-spinners": "^2.9.2", "is-interactive": "^2.0.0", "is-unicode-supported": "^2.0.0", "log-symbols": "^6.0.0", "stdin-discarder": "^0.2.2", "string-width": "^7.2.0", "strip-ansi": "^7.1.0" } }, "sha512-weP+BZ8MVNnlCm8c0Qdc1WSWq4Qn7I+9CJGm7Qali6g44e/PUzbjNqJX5NJ9ljlNMosfJvg1fKEGILklK9cwnw=="],
38653718
3866− "os-browserify": ["os-browserify@0.3.0", "", {}, "sha512-gjcpUc3clBf9+210TRaDWbf+rZZZEshZ+DlXMRCeAjp0xhTrnQsKHypIy1J3d5hKdUzj69t708EHtU8P6bUn0A=="],
3867−
38683719 "outdent": ["outdent@0.5.0", "", {}, "sha512-/jHxFIzoMXdqPzTaCpFzAAWhpkSjZPF4Vsn6jAfNpmbH/ymsmd7Qc6VE9BGn0L6YMj6uwpQLxCECpus4ukKS9Q=="],
38693720
38703721 "oxc-parser": ["oxc-parser@0.121.0", "", { "dependencies": { "@oxc-project/types": "^0.121.0" }, "optionalDependencies": { "@oxc-parser/binding-android-arm-eabi": "0.121.0", "@oxc-parser/binding-android-arm64": "0.121.0", "@oxc-parser/binding-darwin-arm64": "0.121.0", "@oxc-parser/binding-darwin-x64": "0.121.0", "@oxc-parser/binding-freebsd-x64": "0.121.0", "@oxc-parser/binding-linux-arm-gnueabihf": "0.121.0", "@oxc-parser/binding-linux-arm-musleabihf": "0.121.0", "@oxc-parser/binding-linux-arm64-gnu": "0.121.0", "@oxc-parser/binding-linux-arm64-musl": "0.121.0", "@oxc-parser/binding-linux-ppc64-gnu": "0.121.0", "@oxc-parser/binding-linux-riscv64-gnu": "0.121.0", "@oxc-parser/binding-linux-riscv64-musl": "0.121.0", "@oxc-parser/binding-linux-s390x-gnu": "0.121.0", "@oxc-parser/binding-linux-x64-gnu": "0.121.0", "@oxc-parser/binding-linux-x64-musl": "0.121.0", "@oxc-parser/binding-openharmony-arm64": "0.121.0", "@oxc-parser/binding-wasm32-wasi": "0.121.0", "@oxc-parser/binding-win32-arm64-msvc": "0.121.0", "@oxc-parser/binding-win32-ia32-msvc": "0.121.0", "@oxc-parser/binding-win32-x64-msvc": "0.121.0" } }, "sha512-ek9o58+SCv6AV7nchiAcUJy1DNE2CC5WRdBcO0mF+W4oRjNQfPO7b3pLjTHSFECpHkKGOZSQxx3hk8viIL5YCg=="],
@@ -3895,12 +3746,8 @@ · 24 unmodified lines
38953746
38963747 "package-manager-detector": ["package-manager-detector@0.2.11", "", { "dependencies": { "quansync": "^0.2.7" } }, "sha512-BEnLolu+yuz22S56CU1SUKq3XC3PkwD5wv4ikR4MfGvnRVcmzXR9DwSlW2fEamyTPyXHomBJRzgapeuBvRNzJQ=="],
38973748
3898− "pako": ["pako@1.0.11", "", {}, "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw=="],
3899−
39003749 "parent-module": ["parent-module@1.0.1", "", { "dependencies": { "callsites": "^3.0.0" } }, "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g=="],
39013750
3902− "parse-asn1": ["parse-asn1@5.1.9", "", { "dependencies": { "asn1.js": "^4.10.1", "browserify-aes": "^1.2.0", "evp_bytestokey": "^1.0.3", "pbkdf2": "^3.1.5", "safe-buffer": "^5.2.1" } }, "sha512-fIYNuZ/HastSb80baGOuPRo1O9cf4baWw5WsAp7dBuUzeTD/BoaG8sVTdlPFksBE2lF21dN+A1AnrpIjSWqHHg=="],
3903−
39043751 "parse-entities": ["parse-entities@4.0.2", "", { "dependencies": { "@types/unist": "^2.0.0", "character-entities-legacy": "^3.0.0", "character-reference-invalid": "^2.0.0", "decode-named-character-reference": "^1.0.0", "is-alphanumerical": "^2.0.0", "is-decimal": "^2.0.0", "is-hexadecimal": "^2.0.0" } }, "sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw=="],
39053752
39063753 "parse-json": ["parse-json@5.2.0", "", { "dependencies": { "@babel/code-frame": "^7.0.0", "error-ex": "^1.3.1", "json-parse-even-better-errors": "^2.3.0", "lines-and-columns": "^1.1.6" } }, "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg=="],
@@ -3923,8 +3770,6 @@ · 16 unmodified lines
39233770
39243771 "patch-console": ["patch-console@2.0.0", "", {}, "sha512-0YNdUceMdaQwoKce1gatDScmMo5pu/tfABfnzEqeG0gtTmd7mh/WcwgUjtAeOU7N8nFFlbQBnFK2gXW5fGvmMA=="],
39253772
3926− "path-browserify": ["path-browserify@1.0.1", "", {}, "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g=="],
3927−
39283773 "path-data-parser": ["path-data-parser@0.1.0", "", {}, "sha512-NOnmBpt5Y2RWbuv0LMzsayp3lVylAHLPUTut412ZA3l+C4uw4ZVkQbjShYCQ8TCpUMdPapr4YjUqLYD6v68j+w=="],
39293774
39303775 "path-exists": ["path-exists@4.0.0", "", {}, "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w=="],
@@ -3943,8 +3788,6 @@ · 12 unmodified lines
39433788
39443789 "pathe": ["pathe@2.0.3", "", {}, "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w=="],
39453790
3946− "pbkdf2": ["pbkdf2@3.1.5", "", { "dependencies": { "create-hash": "^1.2.0", "create-hmac": "^1.1.7", "ripemd160": "^2.0.3", "safe-buffer": "^5.2.1", "sha.js": "^2.4.12", "to-buffer": "^1.2.1" } }, "sha512-Q3CG/cYvCO1ye4QKkuH7EXxs3VC/rI1/trd+qX2+PolbaKG0H+bgcZzrTt96mMyRtejk+JMCiLUn3y29W8qmFQ=="],
3947−
39483791 "pe-library": ["pe-library@0.4.1", "", {}, "sha512-eRWB5LBz7PpDu4PUlwT0PhnQfTQJlDDdPa35urV4Osrm0t0AqQFGn+UIkU3klZvwJ8KPO3VbBFsXquA6p6kqZw=="],
39493792
39503793 "pend": ["pend@1.2.0", "", {}, "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg=="],
@@ -3961,8 +3804,6 @@ · 10 unmodified lines
39613804
39623805 "pkce-challenge": ["pkce-challenge@5.0.1", "", {}, "sha512-wQ0b/W4Fr01qtpHlqSqspcj3EhBvimsdh0KlHhH8HRZnMsEa0ea2fTULOXOS9ccQr3om+GcGRk4e+isrZWV8qQ=="],
39633806
3964− "pkg-dir": ["pkg-dir@5.0.0", "", { "dependencies": { "find-up": "^5.0.0" } }, "sha512-NPE8TDbzl/3YQYY7CSS228s3g2ollTFnc+Qi3tqmqJp9Vg2ovUpixcJEo2HJScN2Ez+kEaal6y70c0ehqJBJeA=="],
3965−
39663807 "pkg-types": ["pkg-types@1.3.1", "", { "dependencies": { "confbox": "^0.1.8", "mlly": "^1.7.4", "pathe": "^2.0.1" } }, "sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ=="],
39673808
39683809 "plist": ["plist@3.1.0", "", { "dependencies": { "@xmldom/xmldom": "^0.8.8", "base64-js": "^1.5.1", "xmlbuilder": "^15.1.1" } }, "sha512-uysumyrvkUX0rX/dEVqt8gC3sTBzd4zoWfLeS29nb53imdaXVvLINYXTI2GNqzaMuvacNx4uJQ8+b3zXR0pkgQ=="],
@@ -3973,8 +3814,6 @@ · 4 unmodified lines
39733814
39743815 "polished": ["polished@4.3.1", "", { "dependencies": { "@babel/runtime": "^7.17.8" } }, "sha512-OBatVyC/N7SCW/FaDHrSd+vn0o5cS855TOmYi4OkdWUMSJCET/xip//ch8xGUvtr3i44X9LVyWwQlRMTN3pwSA=="],
39753816
3976− "possible-typed-array-names": ["possible-typed-array-names@1.1.0", "", {}, "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg=="],
3977−
39783817 "postcss": ["postcss@8.5.10", "", { "dependencies": { "nanoid": "^3.3.11", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" } }, "sha512-pMMHxBOZKFU6HgAZ4eyGnwXF/EvPGGqUr0MnZ5+99485wwW41kW91A4LOGxSHhgugZmSChL5AlElNdwlNgcnLQ=="],
39793818
39803819 "postcss-load-config": ["postcss-load-config@6.0.1", "", { "dependencies": { "lilconfig": "^3.1.1" }, "peerDependencies": { "jiti": ">=1.21.0", "postcss": ">=8.0.9", "tsx": "^4.8.1", "yaml": "^2.4.2" }, "optionalPeers": ["jiti", "postcss", "tsx", "yaml"] }, "sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g=="],
@@ -3999,10 +3838,6 @@ · 18 unmodified lines
39993838
40003839 "proc-log": ["proc-log@5.0.0", "", {}, "sha512-Azwzvl90HaF0aCz1JrDdXQykFakSSNPaPoiZ9fm5qJIMHioDZEi7OAdRwSm6rSoPtY3Qutnm3L7ogmg3dc+wbQ=="],
40013840
4002− "process": ["process@0.11.10", "", {}, "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A=="],
4003−
4004− "process-nextick-args": ["process-nextick-args@2.0.1", "", {}, "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag=="],
4005−
40063841 "progress": ["progress@2.0.3", "", {}, "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA=="],
40073842
40083843 "promise-retry": ["promise-retry@2.0.1", "", { "dependencies": { "err-code": "^2.0.2", "retry": "^0.12.0" } }, "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g=="],
@@ -4021,11 +3856,9 @@ · 12 unmodified lines
40213856
40223857 "proxy-from-env": ["proxy-from-env@2.1.0", "", {}, "sha512-cJ+oHTW1VAEa8cJslgmUZrc+sjRKgAKl3Zyse6+PV38hZe/V6Z14TbCuXcan9F9ghlz4QrFr2c92TNF82UkYHA=="],
40233858
4024− "public-encrypt": ["public-encrypt@4.0.3", "", { "dependencies": { "bn.js": "^4.1.0", "browserify-rsa": "^4.0.0", "create-hash": "^1.1.0", "parse-asn1": "^5.0.0", "randombytes": "^2.0.1", "safe-buffer": "^5.1.2" } }, "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q=="],
4025−
40263859 "pump": ["pump@3.0.4", "", { "dependencies": { "end-of-stream": "^1.1.0", "once": "^1.3.1" } }, "sha512-VS7sjc6KR7e1ukRFhQSY5LM2uBWAUPiOPa/A3mkKmiMwSmRFUITt0xuj+/lesgnCv+dPIEYlkzrcyXgquIHMcA=="],
40273860
4028− "punycode": ["punycode@1.4.1", "", {}, "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ=="],
3861+ "punycode": ["punycode@2.3.1", "", {}, "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg=="],
40293862
40303863 "pure-rand": ["pure-rand@8.4.0", "", {}, "sha512-IoM8YF/jY0hiugFo/wOWqfmarlE6J0wc6fDK1PhftMk7MGhVZl88sZimmqBBFomLOCSmcCCpsfj7wXASCpvK9A=="],
40313864
@@ -4037,8 +3870,6 @@ · 5 unmodified lines
40373870
40383871 "query-string": ["query-string@9.3.1", "", { "dependencies": { "decode-uri-component": "^0.4.1", "filter-obj": "^5.1.0", "split-on-first": "^3.0.0" } }, "sha512-5fBfMOcDi5SA9qj5jZhWAcTtDfKF5WFdd2uD9nVNlbxVv1baq65aALy6qofpNEGELHvisjjasxQp7BlM9gvMzw=="],
40393872
4040− "querystring-es3": ["querystring-es3@0.2.1", "", {}, "sha512-773xhDQnZBMFobEiztv8LIl70ch5MSF/jUQVlhwFyBILqq96anmoctVIYz+ZRp0qbCKATTn6ev02M3r7Ga5vqA=="],
4041−
40423873 "queue-microtask": ["queue-microtask@1.2.3", "", {}, "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A=="],
40433874
40443875 "quick-lru": ["quick-lru@5.1.1", "", {}, "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA=="],
@@ -4051,10 +3882,6 @@ · 6 unmodified lines
40513882
40523883 "radix3": ["radix3@1.1.2", "", {}, "sha512-b484I/7b8rDEdSDKckSSBA8knMpcdsXudlE/LNL639wFoHKwLbEkQFZHWEYwDC0wa0FKUcCY+GAF73Z7wxNVFA=="],
40533884
4054− "randombytes": ["randombytes@2.1.0", "", { "dependencies": { "safe-buffer": "^5.1.0" } }, "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ=="],
4055−
4056− "randomfill": ["randomfill@1.0.4", "", { "dependencies": { "randombytes": "^2.0.5", "safe-buffer": "^5.1.0" } }, "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw=="],
4057−
40583885 "range-parser": ["range-parser@1.2.1", "", {}, "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg=="],
40593886
40603887 "raw-body": ["raw-body@3.0.2", "", { "dependencies": { "bytes": "~3.1.2", "http-errors": "~2.0.1", "iconv-lite": "~0.7.0", "unpipe": "~1.0.0" } }, "sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA=="],
@@ -4239,8 +4066,6 @@ · 178 unmodified lines
42394066
42404067 "rimraf": ["rimraf@2.6.3", "", { "dependencies": { "glob": "^7.1.3" }, "bin": { "rimraf": "./bin.js" } }, "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA=="],
42414068
4242− "ripemd160": ["ripemd160@2.0.3", "", { "dependencies": { "hash-base": "^3.1.2", "inherits": "^2.0.4" } }, "sha512-5Di9UC0+8h1L6ZD2d7awM7E/T4uA1fJRlx6zk/NvdCCVEoAnFqvHmCuNeIKoCeIixBX/q8uM+6ycDvF8woqosA=="],
4243−
42444069 "roarr": ["roarr@2.15.4", "", { "dependencies": { "boolean": "^3.0.1", "detect-node": "^2.0.4", "globalthis": "^1.0.1", "json-stringify-safe": "^5.0.1", "semver-compare": "^1.0.0", "sprintf-js": "^1.1.2" } }, "sha512-CHhPh+UNHD2GTXNYhPWLnU8ONHdI+5DI+4EYIAOaiD63rHeYlZvyh8P+in5999TTSFgUYuKUAjzRI4mdh/p+2A=="],
42454070
42464071 "robust-predicates": ["robust-predicates@3.0.3", "", {}, "sha512-NS3levdsRIUOmiJ8FZWCP7LG3QpJyrs/TE0Zpf1yvZu8cAJJ6QMW92H1c7kWpdIHo8RvmLxN/o2JXTKHp74lUA=="],
@@ -4269,8 +4094,6 @@ · 22 unmodified lines
42694094
42704095 "safe-buffer": ["safe-buffer@5.2.1", "", {}, "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="],
42714096
4272− "safe-regex-test": ["safe-regex-test@1.1.0", "", { "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", "is-regex": "^1.2.1" } }, "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw=="],
4273−
42744097 "safer-buffer": ["safer-buffer@2.1.2", "", {}, "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="],
42754098
42764099 "sanitize-filename": ["sanitize-filename@1.6.4", "", { "dependencies": { "truncate-utf8-bytes": "^1.0.0" } }, "sha512-9ZyI08PsvdQl2r/bBIGubpVdR3RR9sY6RDiWFPreA21C/EFlQhmgo20UZlNjZMMZNubusLhAQozkA0Od5J21Eg=="],
@@ -4283,8 +4106,6 @@ · 6 unmodified lines
42834106
42844107 "scroll-into-view-if-needed": ["scroll-into-view-if-needed@3.1.0", "", { "dependencies": { "compute-scroll-into-view": "^3.0.2" } }, "sha512-49oNpRjWRvnU8NyGVmUaYG4jtTkNonFZI86MmGRDqBphEK2EXT9gdEUoQPZhuBM8yWHxCWbobltqYO5M4XrUvQ=="],
42854108
4286− "secure-exec": ["secure-exec@0.2.1", "", { "dependencies": { "@secure-exec/core": "0.2.1", "@secure-exec/nodejs": "0.2.1" } }, "sha512-oaQDzTPDSCOckYC8G0PimIqzEVxY6sYEvcx0fMGsRR/Wl4wkFVHaZgQ3kc2DHWysV6WHWt5g1AXc/6seafO2XQ=="],
4287−
42884109 "semver": ["semver@7.7.4", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA=="],
42894110
42904111 "semver-compare": ["semver-compare@1.0.0", "", {}, "sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow=="],
@@ -4299,16 +4120,10 @@ · 8 unmodified lines
42994120
43004121 "serve-static": ["serve-static@2.2.1", "", { "dependencies": { "encodeurl": "^2.0.0", "escape-html": "^1.0.3", "parseurl": "^1.3.3", "send": "^1.2.0" } }, "sha512-xRXBn0pPqQTVQiC8wyQrKs2MOlX24zQ0POGaj0kultvoOCstBQM5yvOhAVSUwOMjQtTvsPWoNCHfPGwaaQJhTw=="],
43014122
4302− "set-function-length": ["set-function-length@1.2.2", "", { "dependencies": { "define-data-property": "^1.1.4", "es-errors": "^1.3.0", "function-bind": "^1.1.2", "get-intrinsic": "^1.2.4", "gopd": "^1.0.1", "has-property-descriptors": "^1.0.2" } }, "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg=="],
4303−
43044123 "set-value": ["set-value@2.0.1", "", { "dependencies": { "extend-shallow": "^2.0.1", "is-extendable": "^0.1.1", "is-plain-object": "^2.0.3", "split-string": "^3.0.1" } }, "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw=="],
43054124
4306− "setimmediate": ["setimmediate@1.0.5", "", {}, "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA=="],
4307−
43084125 "setprototypeof": ["setprototypeof@1.2.0", "", {}, "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw=="],
43094126
4310− "sha.js": ["sha.js@2.4.12", "", { "dependencies": { "inherits": "^2.0.4", "safe-buffer": "^5.2.1", "to-buffer": "^1.2.0" }, "bin": { "sha.js": "bin.js" } }, "sha512-8LzC5+bvI45BjpfXU8V5fdU2mfeKiQe1D1gIMn7XUlF3OTUrpdJpPPH4EMAnF0DsHHdSZqCdSss5qCmJKuiO3w=="],
4311−
43124127 "sharp": ["sharp@0.34.5", "", { "dependencies": { "@img/colour": "^1.0.0", "detect-libc": "^2.1.2", "semver": "^7.7.3" }, "optionalDependencies": { "@img/sharp-darwin-arm64": "0.34.5", "@img/sharp-darwin-x64": "0.34.5", "@img/sharp-libvips-darwin-arm64": "1.2.4", "@img/sharp-libvips-darwin-x64": "1.2.4", "@img/sharp-libvips-linux-arm": "1.2.4", "@img/sharp-libvips-linux-arm64": "1.2.4", "@img/sharp-libvips-linux-ppc64": "1.2.4", "@img/sharp-libvips-linux-riscv64": "1.2.4", "@img/sharp-libvips-linux-s390x": "1.2.4", "@img/sharp-libvips-linux-x64": "1.2.4", "@img/sharp-libvips-linuxmusl-arm64": "1.2.4", "@img/sharp-libvips-linuxmusl-x64": "1.2.4", "@img/sharp-linux-arm": "0.34.5", "@img/sharp-linux-arm64": "0.34.5", "@img/sharp-linux-ppc64": "0.34.5", "@img/sharp-linux-riscv64": "0.34.5", "@img/sharp-linux-s390x": "0.34.5", "@img/sharp-linux-x64": "0.34.5", "@img/sharp-linuxmusl-arm64": "0.34.5", "@img/sharp-linuxmusl-x64": "0.34.5", "@img/sharp-wasm32": "0.34.5", "@img/sharp-win32-arm64": "0.34.5", "@img/sharp-win32-ia32": "0.34.5", "@img/sharp-win32-x64": "0.34.5" } }, "sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg=="],
43134128
43144129 "shebang-command": ["shebang-command@2.0.0", "", { "dependencies": { "shebang-regex": "^3.0.0" } }, "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA=="],
@@ -4389,10 +4204,6 @@ · 74 unmodified lines
43894204
43904205 "stdin-discarder": ["stdin-discarder@0.2.2", "", {}, "sha512-UhDfHmA92YAlNnCfhmq0VeNL5bDbiZGg7sZ2IvPsXubGkiNa9EC+tUTsjBRsYUAz87btI6/1wf4XoVvQ3uRnmQ=="],
43914206
4392− "stream-browserify": ["stream-browserify@3.0.0", "", { "dependencies": { "inherits": "~2.0.4", "readable-stream": "^3.5.0" } }, "sha512-H73RAHsVBapbim0tU2JwwOiXUj+fikfiaoYAKHF3VJfA0pe2BCzkhAHBlLG6REzE+2WNZcxOXjK7lkso+9euLA=="],
4393−
4394− "stream-http": ["stream-http@3.2.0", "", { "dependencies": { "builtin-status-codes": "^3.0.0", "inherits": "^2.0.4", "readable-stream": "^3.6.0", "xtend": "^4.0.2" } }, "sha512-Oq1bLqisTyK3TSCXpPbT4sdeYNdmyZJv1LxpEm2vu1ZhK89kSE5YXwZc3cWk0MagGaKriBh9mCFbVGtO+vY29A=="],
4395−
43964207 "streamdown": ["streamdown@2.5.0", "", { "dependencies": { "clsx": "^2.1.1", "hast-util-to-jsx-runtime": "^2.3.6", "html-url-attributes": "^3.0.1", "marked": "^17.0.1", "mermaid": "^11.12.2", "rehype-harden": "^1.1.8", "rehype-raw": "^7.0.0", "rehype-sanitize": "^6.0.0", "remark-gfm": "^4.0.1", "remark-parse": "^11.0.0", "remark-rehype": "^11.1.2", "remend": "1.3.0", "tailwind-merge": "^3.4.0", "unified": "^11.0.5", "unist-util-visit": "^5.0.0", "unist-util-visit-parents": "^6.0.0" }, "peerDependencies": { "react": "^18.0.0 || ^19.0.0", "react-dom": "^18.0.0 || ^19.0.0" } }, "sha512-/tTnURfIOxZK/pqJAxsfCvETG/XCJHoWnk3jq9xLcuz6CSpnjjuxSRBTTL4PKGhxiZQf0lqPxGhImdpwcZ2XwA=="],
43974208
43984209 "string-convert": ["string-convert@0.2.1", "", {}, "sha512-u/1tdPl4yQnPBjnVrmdLo9gtuLvELKsAoRapekWggdiQNvvvum+jYF329d84NAa660KQw7pB2n36KrIKVoXa3A=="],
@@ -4471,8 +4282,6 @@ · 72 unmodified lines
44714282
44724283 "throttle-debounce": ["throttle-debounce@5.0.2", "", {}, "sha512-B71/4oyj61iNH0KeCamLuE2rmKuTO5byTOSVwECM5FA7TiAiAW+UqTKZ9ERueC4qvgSttUhdmq1mXC3kJqGX7A=="],
44734284
4474− "timers-browserify": ["timers-browserify@2.0.12", "", { "dependencies": { "setimmediate": "^1.0.4" } }, "sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ=="],
4475−
44764285 "tiny-async-pool": ["tiny-async-pool@1.3.0", "", { "dependencies": { "semver": "^5.5.0" } }, "sha512-01EAw5EDrcVrdgyCLgoSPvqznC0sVxDSVeiOz09FUpjh71G79VCqneOr+xvt7T1r76CF6ZZfPjHorN2+d+3mqA=="],
44774286
44784287 "tiny-inflate": ["tiny-inflate@1.0.3", "", {}, "sha512-pkY1fj1cKHb2seWDy0B16HeWyczlJA9/WW3u3c4z/NiWDsO3DOU5D7nhTLE9CF0yXv/QZFY7sEJmj24dK+Rrqw=="],
@@ -4499,8 +4308,6 @@ · 20 unmodified lines
44994308
45004309 "tmp-promise": ["tmp-promise@3.0.3", "", { "dependencies": { "tmp": "^0.2.0" } }, "sha512-RwM7MoPojPxsOBYnyd2hy0bxtIlVrihNs9pj5SUvY8Zz1sQcQG2tG1hSr8PDxfgEB8RNKDhqbIlroIarSNDNsQ=="],
45014310
4502− "to-buffer": ["to-buffer@1.2.2", "", { "dependencies": { "isarray": "^2.0.5", "safe-buffer": "^5.2.1", "typed-array-buffer": "^1.0.3" } }, "sha512-db0E3UJjcFhpDhAF4tLo03oli3pwl3dbnzXOUIlRKrp+ldk/VUxzpWYZENsw2SZiuBjHAk7DfB0VU7NKdpb6sw=="],
4503−
45044311 "to-regex-range": ["to-regex-range@5.0.1", "", { "dependencies": { "is-number": "^7.0.0" } }, "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ=="],
45054312
45064313 "to-rotated": ["to-rotated@1.0.0", "", {}, "sha512-KsEID8AfgUy+pxVRLsWp0VzCa69wxzUDZnzGbyIST/bcgcrMvTYoFBX/QORH4YApoD89EDuUovx4BTdpOn319Q=="],
@@ -4533,8 +4340,6 @@ · 26 unmodified lines
45334340
45344341 "tsx": ["tsx@4.21.0", "", { "dependencies": { "esbuild": "~0.27.0", "get-tsconfig": "^4.7.5" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "bin": { "tsx": "dist/cli.mjs" } }, "sha512-5C1sg4USs1lfG0GFb2RLXsdpXqBSEhAaA/0kPL01wxzpMqLILNxIxIOKiILz+cdg/pLnOUxFYOR5yhHU666wbw=="],
45354342
4536− "tty-browserify": ["tty-browserify@0.0.1", "", {}, "sha512-C3TaO7K81YvjCgQH9Q1S3R3P3BtN3RIM8n+OvX4il1K1zgE8ZhI0op7kClgkxtutIE8hQrcrHBXvIheqKUUCxw=="],
4537−
45384343 "tunnel-agent": ["tunnel-agent@0.6.0", "", { "dependencies": { "safe-buffer": "^5.0.1" } }, "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w=="],
45394344
45404345 "turbo": ["turbo@2.9.6", "", { "optionalDependencies": { "@turbo/darwin-64": "2.9.6", "@turbo/darwin-arm64": "2.9.6", "@turbo/linux-64": "2.9.6", "@turbo/linux-arm64": "2.9.6", "@turbo/windows-64": "2.9.6", "@turbo/windows-arm64": "2.9.6" }, "bin": { "turbo": "bin/turbo" } }, "sha512-+v2QJey7ZUeUiuigkU+uFfklvNUyPI2VO2vBpMYJA+a1hKFLFiKtUYlRHdb3P9CrAvMzi0upbjI4WT+zKtqkBg=="],
@@ -4543,8 +4348,6 @@ · 2 unmodified lines
45434348
45444349 "type-is": ["type-is@2.0.1", "", { "dependencies": { "content-type": "^1.0.5", "media-typer": "^1.1.0", "mime-types": "^3.0.0" } }, "sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw=="],
45454350
4546− "typed-array-buffer": ["typed-array-buffer@1.0.3", "", { "dependencies": { "call-bound": "^1.0.3", "es-errors": "^1.3.0", "is-typed-array": "^1.1.14" } }, "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw=="],
4547−
45484351 "typescript": ["typescript@5.9.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw=="],
45494352
45504353 "ufo": ["ufo@1.6.3", "", {}, "sha512-yDJTmhydvl5lJzBmy/hyOAA0d+aqCBuwl818haVdYCRrWV84o7YyeVm4QlVHStqNrrJSTb6jKuFAVqAFsr+K3Q=="],
@@ -4607,8 +4410,6 @@ · 56 unmodified lines
46074410
46084411 "uri-js": ["uri-js@4.4.1", "", { "dependencies": { "punycode": "^2.1.0" } }, "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg=="],
46094412
4610− "url": ["url@0.11.4", "", { "dependencies": { "punycode": "^1.4.1", "qs": "^6.12.3" } }, "sha512-oCwdVC7mTuWiPyjLUz/COz5TLk6wgp0RCsN+wHZ2Ekneac9w8uuV0njcbbie2ME+Vs+d6duwmYuR3HgQXs1fOg=="],
4611−
46124413 "url-join": ["url-join@5.0.0", "", {}, "sha512-n2huDr9h9yzd6exQVnH/jU5mr+Pfx08LRXXZhkLLetAMESRj+anQsTAh940iMrIetKAmry9coFuZQ2jY8/p3WA=="],
46134414
46144415 "use-callback-ref": ["use-callback-ref@1.3.3", "", { "dependencies": { "tslib": "^2.0.0" }, "peerDependencies": { "@types/react": "*", "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-jQL3lRnocaFtu3V00JToYz/4QkNWswxijDaCVNZRiRTO3HQDLsdu1ZtmIUvV4yPp+rvWm5j0y0TG/S61cuijTg=="],
@@ -4621,8 +4422,6 @@ · 6 unmodified lines
46214422
46224423 "utf8-byte-length": ["utf8-byte-length@1.0.5", "", {}, "sha512-Xn0w3MtiQ6zoz2vFyUVruaCL53O/DwUvkEeOvj+uulMm0BkUGYWmBYVyElqZaSLhY6ZD0ulfU3aBra2aVT4xfA=="],
46234424
4624− "util": ["util@0.12.5", "", { "dependencies": { "inherits": "^2.0.3", "is-arguments": "^1.0.4", "is-generator-function": "^1.0.7", "is-typed-array": "^1.1.3", "which-typed-array": "^1.1.2" } }, "sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA=="],
4625−
46264425 "util-deprecate": ["util-deprecate@1.0.2", "", {}, "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw=="],
46274426
46284427 "uuid": ["uuid@13.0.0", "", { "bin": { "uuid": "dist-node/bin/uuid" } }, "sha512-XQegIaBTVUjSHliKqcnFqYypAd4S+WCYt5NIeRs6w/UAry7z8Y9j5ZwRRL4kzq9U3sD6v+85er9FvkEaBpji2w=="],
@@ -4651,8 +4450,6 @@ · 22 unmodified lines
46514450
46524451 "vitest": ["vitest@4.1.5", "", { "dependencies": { "@vitest/expect": "4.1.5", "@vitest/mocker": "4.1.5", "@vitest/pretty-format": "4.1.5", "@vitest/runner": "4.1.5", "@vitest/snapshot": "4.1.5", "@vitest/spy": "4.1.5", "@vitest/utils": "4.1.5", "es-module-lexer": "^2.0.0", "expect-type": "^1.3.0", "magic-string": "^0.30.21", "obug": "^2.1.1", "pathe": "^2.0.3", "picomatch": "^4.0.3", "std-env": "^4.0.0-rc.1", "tinybench": "^2.9.0", "tinyexec": "^1.0.2", "tinyglobby": "^0.2.15", "tinyrainbow": "^3.1.0", "vite": "^6.0.0 || ^7.0.0 || ^8.0.0", "why-is-node-running": "^2.3.0" }, "peerDependencies": { "@edge-runtime/vm": "*", "@opentelemetry/api": "^1.9.0", "@types/node": "^20.0.0 || ^22.0.0 || >=24.0.0", "@vitest/browser-playwright": "4.1.5", "@vitest/browser-preview": "4.1.5", "@vitest/browser-webdriverio": "4.1.5", "@vitest/coverage-istanbul": "4.1.5", "@vitest/coverage-v8": "4.1.5", "@vitest/ui": "4.1.5", "happy-dom": "*", "jsdom": "*" }, "optionalPeers": ["@edge-runtime/vm", "@opentelemetry/api", "@types/node", "@vitest/browser-playwright", "@vitest/browser-preview", "@vitest/browser-webdriverio", "@vitest/coverage-istanbul", "@vitest/coverage-v8", "@vitest/ui", "happy-dom", "jsdom"], "bin": { "vitest": "vitest.mjs" } }, "sha512-9Xx1v3/ih3m9hN+SbfkUyy0JAs72ap3r7joc87XL6jwF0jGg6mFBvQ1SrwaX+h8BlkX6Hz9shdd1uo6AF+ZGpg=="],
46534452
4654− "vm-browserify": ["vm-browserify@1.1.2", "", {}, "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ=="],
4655−
46564453 "vscode-jsonrpc": ["vscode-jsonrpc@8.2.0", "", {}, "sha512-C+r0eKJUIfiDIfwJhria30+TYWPtuHJXHtI7J0YlOmKAo7ogxP20T0zxB7HZQIFhIyvoBPwWskjxrvAtfjyZfA=="],
46574454
46584455 "vscode-languageserver": ["vscode-languageserver@9.0.1", "", { "dependencies": { "vscode-languageserver-protocol": "3.17.5" }, "bin": { "installServerIntoExtension": "bin/installServerIntoExtension" } }, "sha512-woByF3PDpkHFUreUa7Hos7+pUWdeWMXRd26+ZX2A8cFx6v/JPTtd4/uN0/jB6XQHYaOlHbio03NTHCqrgG5n7g=="],
@@ -4671,8 +4468,6 @@ · 12 unmodified lines
46714468
46724469 "web-namespaces": ["web-namespaces@2.0.1", "", {}, "sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ=="],
46734470
4674− "web-streams-polyfill": ["web-streams-polyfill@4.2.0", "", {}, "sha512-0rYDzGOh9EZpig92umN5g5D/9A1Kff7k0/mzPSSCY8jEQeYkgRMoY7LhbXtUCWzLCMX0TUE9aoHkjFNB7D9pfA=="],
4675−
46764471 "web-vitals": ["web-vitals@5.2.0", "", {}, "sha512-i2z98bEmaCqSDiHEDu+gHl/dmR4Q+TxFmG3/13KkMO+o8UxQzCqWaDRCiLgEa41nlO4VpXSI0ASa1xWmO9sBlA=="],
46774472
46784473 "webpack-virtual-modules": ["webpack-virtual-modules@0.6.2", "", {}, "sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ=="],
@@ -4687,8 +4482,6 @@ · 8 unmodified lines
46874482
46884483 "which-pm-runs": ["which-pm-runs@1.1.0", "", {}, "sha512-n1brCuqClxfFfq/Rb0ICg9giSZqCS+pLtccdag6C2HyufBrh3fBOiy9nb6ggRMvWOVH5GrdJskj5iGTZNxd7SA=="],
46894484
4690− "which-typed-array": ["which-typed-array@1.1.20", "", { "dependencies": { "available-typed-arrays": "^1.0.7", "call-bind": "^1.0.8", "call-bound": "^1.0.4", "for-each": "^0.3.5", "get-proto": "^1.0.1", "gopd": "^1.2.0", "has-tostringtag": "^1.0.2" } }, "sha512-LYfpUkmqwl0h9A2HL09Mms427Q1RZWuOHsukfVcKRq9q95iQxdw0ix1JQrqbcDR9PH1QDwf5Qo8OZb5lksZ8Xg=="],
4691−
46924485 "why-is-node-running": ["why-is-node-running@2.3.0", "", { "dependencies": { "siginfo": "^2.0.0", "stackback": "0.0.2" }, "bin": { "why-is-node-running": "cli.js" } }, "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w=="],
46934486
46944487 "widest-line": ["widest-line@6.0.0", "", { "dependencies": { "string-width": "^8.1.0" } }, "sha512-U89AsyEeAsyoF0zVJBkG9zBgekjgjK7yk9sje3F4IQpXBJ10TF6ByLlIfjMhcmHMJgHZI4KHt4rdNfktzxIAMA=="],
@@ -4713,8 +4506,6 @@ · 18 unmodified lines
47134506
47144507 "xmlbuilder2": ["xmlbuilder2@4.0.3", "", { "dependencies": { "@oozcitak/dom": "^2.0.2", "@oozcitak/infra": "^2.0.2", "@oozcitak/util": "^10.0.0", "js-yaml": "^4.1.1" } }, "sha512-bx8Q1STctnNaaDymWnkfQLKofs0mGNN7rLLapJlGuV3VlvegD7Ls4ggMjE3aUSWItCCzU0PEv45lI87iSigiCA=="],
47154508
4716− "xtend": ["xtend@4.0.2", "", {}, "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ=="],
4717−
47184509 "xxhash-wasm": ["xxhash-wasm@1.1.0", "", {}, "sha512-147y/6YNh+tlp6nd/2pWq38i9h6mz/EuQ6njIrmW8D1BS5nCqs0P6DG+m6zTGnNz5I+uhZ0SHxBs9BsPrwcKDA=="],
47194510
47204511 "y18n": ["y18n@5.0.8", "", {}, "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA=="],
@@ -5019,12 +4810,6 @@ · 298 unmodified lines
50194810
50204811 "@rollup/pluginutils/estree-walker": ["estree-walker@2.0.2", "", {}, "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w=="],
50214812
5022− "@secure-exec/core/better-sqlite3": ["better-sqlite3@12.9.0", "", { "dependencies": { "bindings": "^1.5.0", "prebuild-install": "^7.1.1" } }, "sha512-wqUv4Gm3toFpHDQmaKD4QhZm3g1DjUBI0yzS4UBl6lElUmXFYdTQmmEDpAFa5o8FiFiymURypEnfVHzILKaxqQ=="],
5023−
5024− "@secure-exec/nodejs/cjs-module-lexer": ["cjs-module-lexer@2.2.0", "", {}, "sha512-4bHTS2YuzUvtoLjdy+98ykbNB5jS0+07EvFNXerqZQJ89F7DI6ET7OQo/HJuW6K0aVsKA9hj9/RVb2kQVOrPDQ=="],
5025−
5026− "@secure-exec/nodejs/es-module-lexer": ["es-module-lexer@1.7.0", "", {}, "sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA=="],
5027−
50284813 "@tailwindcss/oxide-wasm32-wasi/@emnapi/core": ["@emnapi/core@1.9.2", "", { "dependencies": { "@emnapi/wasi-threads": "1.2.1", "tslib": "^2.4.0" }, "bundled": true }, "sha512-UC+ZhH3XtczQYfOlu3lNEkdW/p4dsJ1r/bP7H8+rhao3TTTMO1ATq/4DdIi23XuGoFY+Cz0JmCbdVl0hz9jZcA=="],
50294814
50304815 "@tailwindcss/oxide-wasm32-wasi/@emnapi/runtime": ["@emnapi/runtime@1.9.2", "", { "dependencies": { "tslib": "^2.4.0" }, "bundled": true }, "sha512-3U4+MIWHImeyu1wnmVygh5WlgfYDtyf0k8AbLhMFxOipihf6nrWC4syIm/SwEeec0mNSafiiNnMJwbza/Is6Lw=="],
@@ -5081,16 +4866,12 @@ · 50 unmodified lines
50814866
50824867 "app-builder-lib/which": ["which@5.0.0", "", { "dependencies": { "isexe": "^3.1.1" }, "bin": { "node-which": "bin/which.js" } }, "sha512-JEdGzHwwkrbWoGOlIHqQ5gtprKGOenpDHpxE9zVR1bWbOtYRyPPHMe9FaP6x61CmNaTThSkb0DAJte5jD+DmzQ=="],
50834868
5084− "asn1.js/bn.js": ["bn.js@4.12.3", "", {}, "sha512-fGTi3gxV/23FTYdAoUtLYp6qySe2KE3teyZitipKNRuVYcBkoP/bB3guXN/XVKUe9mxCHXnc9C4ocyz8OmgN0g=="],
5085−
50864869 "astro/package-manager-detector": ["package-manager-detector@1.6.0", "", {}, "sha512-61A5ThoTiDG/C8s8UMZwSorAGwMJ0ERVGj2OjoW5pAalsNOg15+iQiPzrLJ4jhZ1HJzmC2PIHT2oEiH3R5fzNA=="],
50874870
50884871 "astro/vite": ["vite@7.3.2", "", { "dependencies": { "esbuild": "^0.27.0", "fdir": "^6.5.0", "picomatch": "^4.0.3", "postcss": "^8.5.6", "rollup": "^4.43.0", "tinyglobby": "^0.2.15" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "peerDependencies": { "@types/node": "^20.19.0 || >=22.12.0", "jiti": ">=1.21.0", "less": "^4.0.0", "lightningcss": "^1.21.0", "sass": "^1.70.0", "sass-embedded": "^1.70.0", "stylus": ">=0.54.8", "sugarss": "^5.0.0", "terser": "^5.16.0", "tsx": "^4.8.1", "yaml": "^2.4.2" }, "optionalPeers": ["@types/node", "jiti", "less", "lightningcss", "sass", "sass-embedded", "stylus", "sugarss", "terser", "tsx", "yaml"], "bin": { "vite": "bin/vite.js" } }, "sha512-Bby3NOsna2jsjfLVOHKes8sGwgl4TT0E6vvpYgnAYDIF/tie7MRaFthmKuHx1NSXjiTueXH3do80FMQgvEktRg=="],
50894872
50904873 "atmn/commander": ["commander@14.0.3", "", {}, "sha512-H+y0Jo/T1RZ9qPP4Eh1pkcQcLRglraJaSLoyOtHxu6AapkjWVCy2Sit1QQ4x3Dng8qDlSsZEet7g5Pq06MvTgw=="],
50914874
5092− "browserify-sign/readable-stream": ["readable-stream@2.3.8", "", { "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", "isarray": "~1.0.0", "process-nextick-args": "~2.0.0", "safe-buffer": "~5.1.1", "string_decoder": "~1.1.1", "util-deprecate": "~1.0.1" } }, "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA=="],
5093−
50944875 "builder-util/chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="],
50954876
50964877 "builder-util/fs-extra": ["fs-extra@10.1.0", "", { "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", "universalify": "^2.0.0" } }, "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ=="],
@@ -5103,8 +4884,6 @@ · 6 unmodified lines
51034884
51044885 "cacache/p-map": ["p-map@7.0.4", "", {}, "sha512-tkAQEw8ysMzmkhgw8k+1U/iPhWNhykKnSk4Rd5zLoPJCuJaGRPo6YposrZgaxHKzDHdDWWZvE/Sk7hsL2X/CpQ=="],
51054886
5106− "cbor-extract/node-gyp-build-optional-packages": ["node-gyp-build-optional-packages@5.1.1", "", { "dependencies": { "detect-libc": "^2.0.1" }, "bin": { "node-gyp-build-optional-packages": "bin.js", "node-gyp-build-optional-packages-test": "build-test.js", "node-gyp-build-optional-packages-optional": "optional.js" } }, "sha512-+P72GAjVAbTxjjwUmwjVrqrdZROD4nf8KgpBoDxqXXTiYZZt/ud60dE5yvCSr9lRO8e8yv6kgJIC0K0PfZFVQw=="],
5107−
51084887 "cheerio/undici": ["undici@7.25.0", "", {}, "sha512-xXnp4kTyor2Zq+J1FfPI6Eq3ew5h6Vl0F/8d9XU5zZQf1tX9s2Su1/3PiMmUANFULpmksxkClamIZcaUqryHsQ=="],
51094888
51104889 "cliui/string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="],
@@ -5117,8 +4896,6 @@ · 6 unmodified lines
51174896
51184897 "cosmiconfig/yaml": ["yaml@1.10.3", "", {}, "sha512-vIYeF1u3CjlhAFekPPAk2h/Kv4T3mAkMox5OymRiJQB0spDP10LHvt+K7G9Ny6NuuMAb25/6n1qyUjAcGNf/AA=="],
51194898
5120− "create-ecdh/bn.js": ["bn.js@4.12.3", "", {}, "sha512-fGTi3gxV/23FTYdAoUtLYp6qySe2KE3teyZitipKNRuVYcBkoP/bB3guXN/XVKUe9mxCHXnc9C4ocyz8OmgN0g=="],
5121−
51224899 "crypto-random-string/type-fest": ["type-fest@1.4.0", "", {}, "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA=="],
51234900
51244901 "csso/css-tree": ["css-tree@2.2.1", "", { "dependencies": { "mdn-data": "2.0.28", "source-map-js": "^1.0.1" } }, "sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA=="],
@@ -5133,8 +4910,6 @@ · 8 unmodified lines
51334910
51344911 "d3-sankey/d3-shape": ["d3-shape@1.3.7", "", { "dependencies": { "d3-path": "1" } }, "sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw=="],
51354912
5136− "diffie-hellman/bn.js": ["bn.js@4.12.3", "", {}, "sha512-fGTi3gxV/23FTYdAoUtLYp6qySe2KE3teyZitipKNRuVYcBkoP/bB3guXN/XVKUe9mxCHXnc9C4ocyz8OmgN0g=="],
5137−
51384913 "dir-compare/minimatch": ["minimatch@3.1.5", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w=="],
51394914
51404915 "dir-compare/p-limit": ["p-limit@3.1.0", "", { "dependencies": { "yocto-queue": "^0.1.0" } }, "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ=="],
@@ -5163,8 +4938,6 @@ · 22 unmodified lines
51634938
51644939 "electron-publish/mime": ["mime@2.6.0", "", { "bin": { "mime": "cli.js" } }, "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg=="],
51654940
5166− "elliptic/bn.js": ["bn.js@4.12.3", "", {}, "sha512-fGTi3gxV/23FTYdAoUtLYp6qySe2KE3teyZitipKNRuVYcBkoP/bB3guXN/XVKUe9mxCHXnc9C4ocyz8OmgN0g=="],
5167−
51684941 "encoding/iconv-lite": ["iconv-lite@0.6.3", "", { "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" } }, "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw=="],
51694942
51704943 "encoding-sniffer/iconv-lite": ["iconv-lite@0.6.3", "", { "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" } }, "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw=="],
@@ -5211,8 +4984,6 @@ · 40 unmodified lines
52114984
52124985 "matcher/escape-string-regexp": ["escape-string-regexp@4.0.0", "", {}, "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA=="],
52134986
5214− "md5.js/hash-base": ["hash-base@3.1.2", "", { "dependencies": { "inherits": "^2.0.4", "readable-stream": "^2.3.8", "safe-buffer": "^5.2.1", "to-buffer": "^1.2.1" } }, "sha512-Bb33KbowVTIj5s7Ked1OsqHUeCpz//tPwR+E2zJgJKo9Z5XolZ9b6bdUgjmYlwnWhoOQKoTd1TYToZGn5mAYOg=="],
5215−
52164987 "mdast-util-find-and-replace/escape-string-regexp": ["escape-string-regexp@5.0.0", "", {}, "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw=="],
52174988
52184989 "mermaid/marked": ["marked@16.4.2", "", { "bin": { "marked": "bin/marked.js" } }, "sha512-TI3V8YYWvkVf3KJe1dRkpnjs68JUPyEa5vjKrp1XEEJUAOaQc+Qj+L1qWbPd0SJuAdQkFU0h73sXXqwDYxsiDA=="],
@@ -5221,8 +4992,6 @@ · 2 unmodified lines
52214992
52224993 "micromatch/picomatch": ["picomatch@2.3.2", "", {}, "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA=="],
52234994
5224− "miller-rabin/bn.js": ["bn.js@4.12.3", "", {}, "sha512-fGTi3gxV/23FTYdAoUtLYp6qySe2KE3teyZitipKNRuVYcBkoP/bB3guXN/XVKUe9mxCHXnc9C4ocyz8OmgN0g=="],
5225−
52264995 "mimetext/mime-types": ["mime-types@2.1.35", "", { "dependencies": { "mime-db": "1.52.0" } }, "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw=="],
52274996
52284997 "miniflare/undici": ["undici@7.24.8", "", {}, "sha512-6KQ/+QxK49Z/p3HO6E5ZCZWNnCasyZLa5ExaVYyvPxUwKtbCPMKELJOqh7EqOle0t9cH/7d2TaaTRRa6Nhs4YQ=="],
@@ -5255,8 +5024,6 @@ · 26 unmodified lines
52555024
52565025 "path-scurry/lru-cache": ["lru-cache@10.4.3", "", {}, "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ=="],
52575026
5258− "pkg-dir/find-up": ["find-up@5.0.0", "", { "dependencies": { "locate-path": "^6.0.0", "path-exists": "^4.0.0" } }, "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng=="],
5259−
52605027 "postcss/nanoid": ["nanoid@3.3.11", "", { "bin": { "nanoid": "bin/nanoid.cjs" } }, "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w=="],
52615028
52625029 "posthog-js/@opentelemetry/api-logs": ["@opentelemetry/api-logs@0.208.0", "", { "dependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-CjruKY9V6NMssL/T1kAFgzosF1v9o6oeN+aX5JB/C/xPNtmgIJqcXHG7fA82Ou1zCpWGl4lROQUKwUNE1pMCyg=="],
@@ -5273,8 +5040,6 @@ · 10 unmodified lines
52735040
52745041 "protobufjs/@types/node": ["@types/node@25.6.0", "", { "dependencies": { "undici-types": "~7.19.0" } }, "sha512-+qIYRKdNYJwY3vRCZMdJbPLJAtGjQBudzZzdzwQYkEPQd+PJGixUL5QfvCLDaULoLv+RhT3LDkwEfKaAkgSmNQ=="],
52755042
5276− "public-encrypt/bn.js": ["bn.js@4.12.3", "", {}, "sha512-fGTi3gxV/23FTYdAoUtLYp6qySe2KE3teyZitipKNRuVYcBkoP/bB3guXN/XVKUe9mxCHXnc9C4ocyz8OmgN0g=="],
5277−
52785043 "radix-ui/@radix-ui/react-primitive": ["@radix-ui/react-primitive@2.1.3", "", { "dependencies": { "@radix-ui/react-slot": "1.2.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ=="],
52795044
52805045 "rc/ini": ["ini@1.3.8", "", {}, "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew=="],
@@ -5289,8 +5054,6 @@ · 8 unmodified lines
52895054
52905055 "restore-cursor/signal-exit": ["signal-exit@3.0.7", "", {}, "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ=="],
52915056
5292− "ripemd160/hash-base": ["hash-base@3.1.2", "", { "dependencies": { "inherits": "^2.0.4", "readable-stream": "^2.3.8", "safe-buffer": "^5.2.1", "to-buffer": "^1.2.1" } }, "sha512-Bb33KbowVTIj5s7Ked1OsqHUeCpz//tPwR+E2zJgJKo9Z5XolZ9b6bdUgjmYlwnWhoOQKoTd1TYToZGn5mAYOg=="],
5293−
52945057 "rolldown/@oxc-project/types": ["@oxc-project/types@0.124.0", "", {}, "sha512-VBFWMTBvHxS11Z5Lvlr3IWgrwhMTXV+Md+EQF0Xf60+wAdsGFTBx7X7K/hP4pi8N7dcm1RvcHwDxZ16Qx8keUg=="],
52955058
52965059 "rolldown/@rolldown/pluginutils": ["@rolldown/pluginutils@1.0.0-rc.15", "", {}, "sha512-UromN0peaE53IaBRe9W7CjrZgXl90fqGpK+mIZbA3qSTeYqg3pqpROBdIPvOG3F5ereDHNwoHBI2e50n1BDr1g=="],
@@ -5327,16 +5090,12 @@ · 30 unmodified lines
53275090
53285091 "tiny-async-pool/semver": ["semver@5.7.2", "", { "bin": { "semver": "bin/semver" } }, "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g=="],
53295092
5330− "to-buffer/isarray": ["isarray@2.0.5", "", {}, "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw=="],
5331−
53325093 "to-regex-range/is-number": ["is-number@7.0.0", "", {}, "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng=="],
53335094
53345095 "tsup/tinyexec": ["tinyexec@0.3.2", "", {}, "sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA=="],
53355096
53365097 "unstorage/chokidar": ["chokidar@5.0.0", "", { "dependencies": { "readdirp": "^5.0.0" } }, "sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw=="],
53375098
5338− "uri-js/punycode": ["punycode@2.3.1", "", {}, "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg=="],
5339−
53405099 "whatwg-encoding/iconv-lite": ["iconv-lite@0.6.3", "", { "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" } }, "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw=="],
53415100
53425101 "wrangler/esbuild": ["esbuild@0.27.3", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.27.3", "@esbuild/android-arm": "0.27.3", "@esbuild/android-arm64": "0.27.3", "@esbuild/android-x64": "0.27.3", "@esbuild/darwin-arm64": "0.27.3", "@esbuild/darwin-x64": "0.27.3", "@esbuild/freebsd-arm64": "0.27.3", "@esbuild/freebsd-x64": "0.27.3", "@esbuild/linux-arm": "0.27.3", "@esbuild/linux-arm64": "0.27.3", "@esbuild/linux-ia32": "0.27.3", "@esbuild/linux-loong64": "0.27.3", "@esbuild/linux-mips64el": "0.27.3", "@esbuild/linux-ppc64": "0.27.3", "@esbuild/linux-riscv64": "0.27.3", "@esbuild/linux-s390x": "0.27.3", "@esbuild/linux-x64": "0.27.3", "@esbuild/netbsd-arm64": "0.27.3", "@esbuild/netbsd-x64": "0.27.3", "@esbuild/openbsd-arm64": "0.27.3", "@esbuild/openbsd-x64": "0.27.3", "@esbuild/openharmony-arm64": "0.27.3", "@esbuild/sunos-x64": "0.27.3", "@esbuild/win32-arm64": "0.27.3", "@esbuild/win32-ia32": "0.27.3", "@esbuild/win32-x64": "0.27.3" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-8VwMnyGCONIs6cWue2IdpHxHnAjzxnw2Zr7MkVxB2vjmQ2ivqGFb4LEG3SMnv0Gb2F/G/2yA8zUaiL1gywDCCg=="],
@@ -5585,10 +5344,6 @@ · 242 unmodified lines
55855344
55865345 "app-builder-lib/which/isexe": ["isexe@3.1.5", "", {}, "sha512-6B3tLtFqtQS4ekarvLVMZ+X+VlvQekbe4taUkf/rhVO3d/h0M2rfARm/pXLcPEsjjMsFgrFgSrhQIxcSVrBz8w=="],
55875346
5588− "browserify-sign/readable-stream/safe-buffer": ["safe-buffer@5.1.2", "", {}, "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="],
5589−
5590− "browserify-sign/readable-stream/string_decoder": ["string_decoder@1.1.1", "", { "dependencies": { "safe-buffer": "~5.1.0" } }, "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg=="],
5591−
55925347 "builder-util/chalk/ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="],
55935348
55945349 "builder-util/chalk/supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="],
@@ -5711,8 +5466,6 @@ · 116 unmodified lines
57115466
57125467 "ink-confirm-input/ink-text-input/chalk": ["chalk@3.0.0", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg=="],
57135468
5714− "md5.js/hash-base/readable-stream": ["readable-stream@2.3.8", "", { "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", "isarray": "~1.0.0", "process-nextick-args": "~2.0.0", "safe-buffer": "~5.1.1", "string_decoder": "~1.1.1", "util-deprecate": "~1.0.1" } }, "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA=="],
5715−
57165469 "mimetext/mime-types/mime-db": ["mime-db@1.52.0", "", {}, "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg=="],
57175470
57185471 "minipass-flush/minipass/yallist": ["yallist@4.0.0", "", {}, "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="],
@@ -5729,8 +5482,6 @@ · 10 unmodified lines
57295482
57305483 "ora/strip-ansi/ansi-regex": ["ansi-regex@6.2.2", "", {}, "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg=="],
57315484
5732− "pkg-dir/find-up/locate-path": ["locate-path@6.0.0", "", { "dependencies": { "p-locate": "^5.0.0" } }, "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw=="],
5733−
57345485 "posthog-js/@opentelemetry/exporter-logs-otlp-http/@opentelemetry/core": ["@opentelemetry/core@2.2.0", "", { "dependencies": { "@opentelemetry/semantic-conventions": "^1.29.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-FuabnnUm8LflnieVxs6eP7Z383hgQU4W1e3KJS6aOG3RxWxcHyBxH8fDMHNgu/gFx/M2jvTOW/4/PHhLz6bjWw=="],
57355486
57365487 "posthog-js/@opentelemetry/exporter-logs-otlp-http/@opentelemetry/otlp-exporter-base": ["@opentelemetry/otlp-exporter-base@0.208.0", "", { "dependencies": { "@opentelemetry/core": "2.2.0", "@opentelemetry/otlp-transformer": "0.208.0" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-gMd39gIfVb2OgxldxUtOwGJYSH8P1kVFFlJLuut32L6KgUC4gl1dMhn+YC2mGn0bDOiQYSk/uHOdSjuKp58vvA=="],
@@ -5745,8 +5496,6 @@ · 8 unmodified lines
57455496
57465497 "read-yaml-file/js-yaml/argparse": ["argparse@1.0.10", "", { "dependencies": { "sprintf-js": "~1.0.2" } }, "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg=="],
57475498
5748− "ripemd160/hash-base/readable-stream": ["readable-stream@2.3.8", "", { "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", "isarray": "~1.0.0", "process-nextick-args": "~2.0.0", "safe-buffer": "~5.1.1", "string_decoder": "~1.1.1", "util-deprecate": "~1.0.1" } }, "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA=="],
5749−
57505499 "run-jxa/execa/get-stream": ["get-stream@6.0.1", "", {}, "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg=="],
57515500
57525501 "run-jxa/execa/human-signals": ["human-signals@2.1.0", "", {}, "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw=="],
@@ -5999,14 +5748,8 @@ · 246 unmodified lines
59995748
60005749 "ink-confirm-input/ink-text-input/chalk/supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="],
60015750
6002− "md5.js/hash-base/readable-stream/safe-buffer": ["safe-buffer@5.1.2", "", {}, "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="],
6003−
6004− "md5.js/hash-base/readable-stream/string_decoder": ["string_decoder@1.1.1", "", { "dependencies": { "safe-buffer": "~5.1.0" } }, "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg=="],
6005−
60065751 "ora/cli-cursor/restore-cursor/onetime": ["onetime@7.0.0", "", { "dependencies": { "mimic-function": "^5.0.0" } }, "sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ=="],
60075752
6008− "pkg-dir/find-up/locate-path/p-locate": ["p-locate@5.0.0", "", { "dependencies": { "p-limit": "^3.0.2" } }, "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw=="],
6009−
60105753 "posthog-js/@opentelemetry/exporter-logs-otlp-http/@opentelemetry/otlp-transformer/@opentelemetry/resources": ["@opentelemetry/resources@2.2.0", "", { "dependencies": { "@opentelemetry/core": "2.2.0", "@opentelemetry/semantic-conventions": "^1.29.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.3.0 <1.10.0" } }, "sha512-1pNQf/JazQTMA0BiO5NINUzH0cbLbbl7mntLa4aJNmCCXSj0q03T5ZXXL0zw4G55TjdL9Tz32cznGClf+8zr5A=="],
60115754
60125755 "posthog-js/@opentelemetry/exporter-logs-otlp-http/@opentelemetry/otlp-transformer/@opentelemetry/sdk-metrics": ["@opentelemetry/sdk-metrics@2.2.0", "", { "dependencies": { "@opentelemetry/core": "2.2.0", "@opentelemetry/resources": "2.2.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.9.0 <1.10.0" } }, "sha512-G5KYP6+VJMZzpGipQw7Giif48h6SGQ2PFKEYCybeXJsOCB4fp8azqMAAzE5lnnHK3ZVwYQrgmFbsUJO/zOnwGw=="],
@@ -6015,10 +5758,6 @@ · 2 unmodified lines
60155758
60165759 "read-yaml-file/js-yaml/argparse/sprintf-js": ["sprintf-js@1.0.3", "", {}, "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g=="],
60175760
6018− "ripemd160/hash-base/readable-stream/safe-buffer": ["safe-buffer@5.1.2", "", {}, "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="],
6019−
6020− "ripemd160/hash-base/readable-stream/string_decoder": ["string_decoder@1.1.1", "", { "dependencies": { "safe-buffer": "~5.1.0" } }, "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg=="],
6021−
60225761 "@electron/rebuild/ora/cli-cursor/restore-cursor/signal-exit": ["signal-exit@3.0.7", "", {}, "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ=="],
60235762
60245763 "@executor-js/runtime-dynamic-worker/@cloudflare/vitest-pool-workers/miniflare/workerd/@cloudflare/workerd-darwin-64": ["@cloudflare/workerd-darwin-64@1.20260415.1", "", { "os": "darwin", "cpu": "x64" }, "sha512-dsxaKsQm3LnPGNPEdsRv09QN3Y4DqCw7kX5j6noKqbAtro2jTr95sVlYM1jUxZ5FkOl1f7SXgaKKB9t5H5Nkbg=="],
@@ -6046,9 +5785,5 @@ · 21 unmodified lines
60465785 "agents/yargs/string-width/strip-ansi/ansi-regex": ["ansi-regex@6.2.2", "", {}, "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg=="],
60475786
60485787 "cacache/glob/minimatch/brace-expansion/balanced-match": ["balanced-match@1.0.2", "", {}, "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="],
6049−
6050− "pkg-dir/find-up/locate-path/p-locate/p-limit": ["p-limit@3.1.0", "", { "dependencies": { "yocto-queue": "^0.1.0" } }, "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ=="],
6051−
6052− "pkg-dir/find-up/locate-path/p-locate/p-limit/yocto-queue": ["yocto-queue@0.1.0", "", {}, "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q=="],
60535788 }
60545789 }
packages/kernel/runtime-secure-exec/CHANGELOG.md+0−1
@@ -1 +0,0 @@
1−# @executor-js/runtime-secure-exec
packages/kernel/runtime-secure-exec/package.json+0−26
@@ -1,26 +0,0 @@
1−{
2− "name": "@executor-js/runtime-secure-exec",
3− "version": "0.0.3",
4− "private": true,
5− "type": "module",
6− "exports": {
7− ".": "./src/index.ts"
8− },
9− "scripts": {
10− "typecheck": "tsgo --noEmit",
11− "test": "vitest run",
12− "test:watch": "vitest",
13− "typecheck:slow": "bunx tsc --noEmit -p tsconfig.json"
14− },
15− "dependencies": {
16− "@executor-js/codemode-core": "workspace:*",
17− "effect": "catalog:",
18− "secure-exec": "^0.2.1"
19− },
20− "devDependencies": {
21− "@effect/vitest": "catalog:",
22− "@types/node": "catalog:",
23− "bun-types": "catalog:",
24− "vitest": "catalog:"
25− }
26−}
packages/kernel/runtime-secure-exec/src/index.test.ts+0−160
@@ -1,160 +0,0 @@
1−import { describe, expect, it } from "@effect/vitest";
2−import { assertInclude } from "@effect/vitest/utils";
3−import * as Data from "effect/Data";
4−import * as Effect from "effect/Effect";
5−
6−import type { SandboxToolInvoker } from "@executor-js/codemode-core";
7−import { makeSecureExecExecutor } from "./index";
8−
9−class UnknownToolError extends Data.TaggedError("UnknownToolError")<{
10− readonly path: string;
11−}> {}
12−
13−class ToolHandlerError extends Data.TaggedError("ToolHandlerError")<{
14− readonly path: string;
15− readonly cause: unknown;
16−}> {
17− override get message() {
18− return this.cause instanceof Error ? this.cause.message : String(this.cause);
19− }
20−}
21−
22−const makeTestInvoker = (
23− handlers: Record<string, (args: unknown) => unknown | Promise<unknown>>,
24−): SandboxToolInvoker => ({
25− invoke: ({ path, args }) => {
26− const handler = handlers[path];
27− if (!handler) {
28− return Effect.fail(new UnknownToolError({ path }));
29− }
30− return Effect.tryPromise({
31− try: () => Promise.resolve(handler(args)),
32− catch: (cause) => new ToolHandlerError({ path, cause }),
33− });
34− },
35−});
36−
37−const executor = makeSecureExecExecutor({ timeoutMs: 5_000 });
38−
39−// secure-exec-v8 does not ship a Windows binary — skip on win32
40−describe.skipIf(process.platform === "win32")("secure-exec executor", () => {
41− it.effect("runs plain code", () =>
42− Effect.gen(function* () {
43− const result = yield* executor.execute("return 1 + 2", makeTestInvoker({}));
44−
45− expect(result.result).toBe(3);
46− expect(result.error).toBeUndefined();
47− }),
48− );
49−
50− it.effect("recovers prose-wrapped fenced async arrow input", () =>
51− Effect.gen(function* () {
52− const result = yield* executor.execute(
53− ["Use this snippet.", "", "```ts", "async () => 42", "```"].join("\n"),
54− makeTestInvoker({}),
55− );
56−
57− expect(result.result).toBe(42);
58− expect(result.error).toBeUndefined();
59− }),
60− );
61−
62− it.effect("invokes a tool and returns its result", () =>
63− Effect.gen(function* () {
64− const invoker = makeTestInvoker({
65− "math.add": (args) => {
66− const { a, b } = args as { a: number; b: number };
67− return { sum: a + b };
68− },
69− });
70−
71− const result = yield* executor.execute(
72− `
73− const out = await tools.math.add({ a: 7, b: 5 });
74− return out.sum;
75− `,
76− invoker,
77− );
78−
79− expect(result.error).toBeUndefined();
80− expect(result.result).toBe(12);
81− }),
82− );
83−
84− it.effect("captures console output as logs", () =>
85− Effect.gen(function* () {
86− const result = yield* executor.execute(
87− `
88− console.log("hello");
89− console.warn("warn");
90− return "done";
91− `,
92− makeTestInvoker({}),
93− );
94−
95− expect(result.error).toBeUndefined();
96− expect(result.result).toBe("done");
97− expect(result.logs).toContainEqual("[log] hello");
98− expect(result.logs).toContainEqual("[warn] warn");
99− }),
100− );
101−
102− it.effect("supports async arrow-function source input", () =>
103− Effect.gen(function* () {
104− const result = yield* executor.execute(
105− `
106− async () => {
107− return 42;
108− }
109− `,
110− makeTestInvoker({}),
111− );
112−
113− expect(result.error).toBeUndefined();
114− expect(result.result).toBe(42);
115− }),
116− );
117−
118− it.effect("supports catching tool invocation failures in user code", () =>
119− Effect.gen(function* () {
120− const invoker = makeTestInvoker({
121− "db.query": () => {
122− throw new Error("connection refused");
123− },
124− });
125−
126− const result = yield* executor.execute(
127− `
128− try {
129− await tools.db.query({ sql: "SELECT 1" });
130− return "unexpected";
131− } catch (e) {
132− return "caught: " + e.message;
133− }
134− `,
135− invoker,
136− );
137−
138− expect(result.error).toBeUndefined();
139− expect(result.result).toContain("caught:");
140− expect(result.result).toContain("connection refused");
141− }),
142− );
143−
144− it.live("enforces timeout", () =>
145− Effect.gen(function* () {
146− const shortTimeoutExecutor = makeSecureExecExecutor({ timeoutMs: 150 });
147−
148− const result = yield* shortTimeoutExecutor.execute(
149− `
150− await new Promise((resolve) => setTimeout(resolve, 10_000));
151− return "done";
152− `,
153− makeTestInvoker({}),
154− );
155−
156− expect(result.result).toBeNull();
157− assertInclude(result.error, "timed out");
158− }),
159− );
160−});
packages/kernel/runtime-secure-exec/src/index.ts+0−442
@@ -1,442 +0,0 @@
1−import {
2− recoverExecutionBody,
3− type CodeExecutor,
4− type ExecuteResult,
5− type SandboxToolInvoker,
6−} from "@executor-js/codemode-core";
7−import * as Cause from "effect/Cause";
8−import * as Data from "effect/Data";
9−import * as Duration from "effect/Duration";
10−import * as Effect from "effect/Effect";
11−import { allowAll, createInMemoryFileSystem, createKernel, createNodeRuntime } from "secure-exec";
12−
13−export type SecureExecExecutorOptions = {
14− timeoutMs?: number;
15− memoryLimitMb?: number;
16−};
17−
18−const formatUnknownMessage = (cause: unknown): string => {
19− if (cause instanceof Error) {
20− const message = cause.message.trim();
21− return message.length > 0 ? message : cause.name;
22− }
23−
24− if (typeof cause === "string") {
25− return cause;
26− }
27−
28− if (
29− typeof cause === "object" &&
30− cause !== null &&
31− "message" in cause &&
32− typeof cause.message === "string"
33− ) {
34− const message = cause.message.trim();
35− if (message.length > 0) return message;
36− }
37−
38− if (typeof cause === "object" && cause !== null) {
39− try {
40− return JSON.stringify(cause);
41− } catch {
42− return String(cause);
43− }
44− }
45−
46− return String(cause);
47−};
48−
49−const formatCauseMessage = (cause: Cause.Cause<unknown>): string =>
50− formatUnknownMessage(Cause.squash(cause));
51−
52−class SecureExecExecutionError extends Data.TaggedError("SecureExecExecutionError")<{
53− readonly operation: string;
54− readonly cause: unknown;
55−}> {
56− override get message() {
57− return `${this.operation}: ${formatUnknownMessage(this.cause)}`;
58− }
59−}
60−
61−const DEFAULT_TIMEOUT_MS = 5 * 60_000;
62−const DEFAULT_MEMORY_LIMIT_MB = 128;
63−const TEXT_ENCODER = new TextEncoder();
64−
65−const serializeJson = (value: unknown): string | undefined => {
66− if (typeof value === "undefined") return undefined;
67− try {
68− return JSON.stringify(value);
69− } catch (cause) {
70− throw new Error(
71− `Value is not JSON serializable: ${cause instanceof Error ? cause.message : String(cause)}`,
72− );
73− }
74−};
75−
76−const IPC_RESULT_PREFIX = "@@executor-result@@";
77−
78−const timeoutMessage = (timeoutMs: number): string =>
79− `Secure-exec execution timed out after ${timeoutMs}ms`;
80−
81−type ToolSuccessEnvelope = {
82− readonly ok: true;
83− readonly value?: string;
84−};
85−
86−type ToolErrorEnvelope = {
87− readonly ok: false;
88− readonly error: string;
89−};
90−
91−type ToolEnvelope = ToolSuccessEnvelope | ToolErrorEnvelope;
92−
93−type RuntimePromiseRunner = <A, E>(effect: Effect.Effect<A, E, never>) => Promise<A>;
94−
95−type SecureExecKernel = ReturnType<typeof createKernel>;
96−
97−type KernelProcess = {
98− readonly exitCode: number | null;
99− wait(): Promise<number>;
100− kill(signal?: number): void;
101−};
102−
103−type ProcessOutcome =
104− | {
105− readonly _tag: "Exited";
106− readonly exitCode: number;
107− }
108− | {
109− readonly _tag: "TimedOut";
110− };
111−
112−type ProcessOutput = {
113− readonly stdout: string;
114− readonly stderr: string;
115− readonly outcome: ProcessOutcome;
116−};
117−
118−const wrapSync = <A>(operation: string, fn: () => A): Effect.Effect<A, SecureExecExecutionError> =>
119− Effect.try({
120− try: fn,
121− catch: (cause) => new SecureExecExecutionError({ operation, cause }),
122− }).pipe(Effect.withSpan(`secure_exec.${operation}`));
123−
124−const wrap = <A>(
125− operation: string,
126− fn: () => Promise<A>,
127−): Effect.Effect<A, SecureExecExecutionError> =>
128− Effect.tryPromise({
129− try: fn,
130− catch: (cause) => new SecureExecExecutionError({ operation, cause }),
131− }).pipe(Effect.withSpan(`secure_exec.${operation}`));
132−
133−const use = <T, A>(
134− operation: string,
135− client: T,
136− fn: (client: T) => Promise<A>,
137−): Effect.Effect<A, SecureExecExecutionError> => wrap(operation, () => fn(client));
138−
139−const useSync = <T, A>(
140− operation: string,
141− client: T,
142− fn: (client: T) => A,
143−): Effect.Effect<A, SecureExecExecutionError> => wrapSync(operation, () => fn(client));
144−
145−const encodeToolEnvelope = (envelope: ToolEnvelope): string => {
146− try {
147− return JSON.stringify(envelope);
148− } catch (cause) {
149− return JSON.stringify({
150− ok: false,
151− error: `Tool envelope serialization failed: ${formatUnknownMessage(cause)}`,
152− } satisfies ToolErrorEnvelope);
153− }
154−};
155−
156−const parseToolArgs = (argsJson: unknown): Effect.Effect<unknown, SecureExecExecutionError> =>
157− typeof argsJson === "string"
158− ? wrapSync("tool.parse_args", () => JSON.parse(argsJson))
159− : Effect.void;
160−
161−const invokeToolBinding = (
162− toolInvoker: SandboxToolInvoker,
163− path: unknown,
164− argsJson: unknown,
165−): Effect.Effect<string, never> =>
166− Effect.gen(function* () {
167− const toolPath = String(path);
168− const args = yield* parseToolArgs(argsJson);
169−
170− const envelope = yield* toolInvoker.invoke({ path: toolPath, args }).pipe(
171− Effect.flatMap((value) =>
172− wrapSync("tool.serialize_result", () => ({
173− ok: true as const,
174− value: serializeJson(value),
175− })),
176− ),
177− Effect.catchCause((cause) =>
178− Effect.succeed<ToolErrorEnvelope>({
179− ok: false,
180− error: formatCauseMessage(cause),
181− }),
182− ),
183− );
184−
185− return encodeToolEnvelope(envelope);
186− }).pipe(
187− Effect.catchCause((cause) =>
188− Effect.succeed(
189− encodeToolEnvelope({
190− ok: false,
191− error: formatCauseMessage(cause),
192− }),
193− ),
194− ),
195− );
196−
197−const buildExecutionSource = (code: string): string => {
198− const body = recoverExecutionBody(code);
199−
200− // Tool invocation uses async bindings via SecureExec.bindings.__invokeTool.
201− // Console methods use SecureExec.bindings.__log for structured log capture.
202− return `
203−"use strict";
204−
205−const __invokeTool = SecureExec.bindings.invokeTool;
206−const __log = SecureExec.bindings.emitLog;
207−
208−const __formatLogArg = (value) => {
209− if (typeof value === 'string') return value;
210− try { return JSON.stringify(value); } catch { return String(value); }
211−};
212−const __formatLogLine = (args) => args.map(__formatLogArg).join(' ');
213−
214−const __makeToolsProxy = (path = []) => new Proxy(() => undefined, {
215− get(_target, prop) {
216− if (prop === 'then' || typeof prop === 'symbol') return undefined;
217− return __makeToolsProxy([...path, String(prop)]);
218− },
219− apply(_target, _thisArg, args) {
220− const toolPath = path.join('.');
221− if (!toolPath) throw new Error('Tool path missing in invocation');
222− const argsJson = args[0] !== undefined ? JSON.stringify(args[0]) : undefined;
223− return Promise.resolve(__invokeTool(toolPath, argsJson))
224− .then((raw) => {
225− const envelope = JSON.parse(raw);
226− if (!envelope.ok) throw new Error(envelope.error || 'Tool invocation failed');
227− return envelope.value === undefined ? undefined : JSON.parse(envelope.value);
228− });
229− },
230−});
231−const tools = __makeToolsProxy();
232−
233−const console = {
234− log: (...args) => __log('log', __formatLogLine(args)),
235− warn: (...args) => __log('warn', __formatLogLine(args)),
236− error: (...args) => __log('error', __formatLogLine(args)),
237− info: (...args) => __log('info', __formatLogLine(args)),
238− debug: (...args) => __log('debug', __formatLogLine(args)),
239−};
240−
241−try {
242− const v = await (async () => {
243− ${body}
244− })();
245− if (v !== undefined) process.stdout.write(${JSON.stringify(IPC_RESULT_PREFIX)} + JSON.stringify(v) + '\\n');
246−} catch (e) {
247− const msg = e && typeof e === 'object' ? (e.stack || e.message || String(e)) : String(e);
248− process.stderr.write(msg + '\\n');
249− process.exitCode = 1;
250−}
251−`.trim();
252−};
253−
254−const acquireScopedKernel = (
255− source: string,
256− memoryLimitMb: number,
257− toolInvoker: SandboxToolInvoker,
258− logs: string[],
259− runPromise: RuntimePromiseRunner,
260−) =>
261− Effect.gen(function* () {
262− const vfs = createInMemoryFileSystem();
263− yield* use("vfs.write_entry", vfs, (fs) =>
264− fs.writeFile("/entry.mjs", TEXT_ENCODER.encode(source)),
265− );
266−
267− const kernel = createKernel({
268− filesystem: vfs,
269− permissions: allowAll,
270− });
271−
272− yield* Effect.addFinalizer(() =>
273− use("kernel.dispose", kernel, (k) => k.dispose()).pipe(Effect.orDie),
274− );
275−
276− yield* use("kernel.mount_runtime", kernel, (k) =>
277− k.mount(
278− createNodeRuntime({
279− memoryLimit: memoryLimitMb,
280− permissions: allowAll,
281− bindings: {
282− invokeTool: (path: unknown, argsJson: unknown) =>
283− runPromise(invokeToolBinding(toolInvoker, path, argsJson)),
284− emitLog: (level: unknown, line: unknown) => {
285− logs.push(`[${String(level)}] ${String(line)}`);
286− },
287− },
288− }),
289− ),
290− );
291−
292− return kernel;
293− });
294−
295−const waitForProcess = (
296− proc: KernelProcess,
297− timeoutMs: number,
298−): Effect.Effect<ProcessOutcome, SecureExecExecutionError> =>
299− use("process.wait", proc, (p) => p.wait()).pipe(
300− Effect.map(
301− (exitCode): ProcessOutcome => ({
302− _tag: "Exited",
303− exitCode,
304− }),
305− ),
306− Effect.timeoutOrElse({
307− duration: Duration.millis(timeoutMs),
308− orElse: () =>
309− useSync("process.kill_on_timeout", proc, (p) => {
310− p.kill(9);
311− return { _tag: "TimedOut" as const };
312− }),
313− }),
314− );
315−
316−const runEntryProcess = (
317− kernel: SecureExecKernel,
318− timeoutMs: number,
319−): Effect.Effect<ProcessOutput, SecureExecExecutionError> =>
320− Effect.gen(function* () {
321− let stdout = "";
322− let stderr = "";
323− const stdoutDecoder = new TextDecoder();
324− const stderrDecoder = new TextDecoder();
325−
326− const proc = yield* useSync("process.spawn", kernel, (k) =>
327− k.spawn("node", ["/entry.mjs"], {
328− onStdout: (data: Uint8Array) => {
329− stdout += stdoutDecoder.decode(data, { stream: true });
330− },
331− onStderr: (data: Uint8Array) => {
332− stderr += stderrDecoder.decode(data, { stream: true });
333− },
334− }),
335− );
336−
337− const outcome = yield* waitForProcess(proc, timeoutMs).pipe(
338− Effect.ensuring(
339− useSync("process.ensure_killed", proc, (p) => {
340− if (p.exitCode === null) {
341− p.kill(9);
342− }
343− }).pipe(Effect.orDie),
344− ),
345− );
346−
347− stdout += stdoutDecoder.decode();
348− stderr += stderrDecoder.decode();
349−
350− return {
351− stdout,
352− stderr,
353− outcome,
354− };
355− });
356−
357−const parseResultFromStdout = (stdout: string): unknown => {
358− for (const line of stdout.split("\n")) {
359− if (!line.startsWith(IPC_RESULT_PREFIX)) continue;
360− const payload = line.slice(IPC_RESULT_PREFIX.length);
361− try {
362− return JSON.parse(payload);
363− } catch {
364− return payload;
365− }
366− }
367− return null;
368−};
369−
370−const evaluateInSecureExec = (
371− options: SecureExecExecutorOptions,
372− code: string,
373− toolInvoker: SandboxToolInvoker,
374−): Effect.Effect<ExecuteResult, never> => {
375− const timeoutMs = Math.max(100, options.timeoutMs ?? DEFAULT_TIMEOUT_MS);
376− const memoryLimitMb = options.memoryLimitMb ?? DEFAULT_MEMORY_LIMIT_MB;
377− const logs: string[] = [];
378−
379− return Effect.gen(function* () {
380− const context = yield* Effect.context<never>();
381− const runPromise: RuntimePromiseRunner = Effect.runPromiseWith(context);
382− const source = buildExecutionSource(code);
383−
384− const processOutput = yield* Effect.scoped(
385− Effect.gen(function* () {
386− const kernel = yield* acquireScopedKernel(
387− source,
388− memoryLimitMb,
389− toolInvoker,
390− logs,
391− runPromise,
392− );
393− return yield* runEntryProcess(kernel, timeoutMs);
394− }),
395− );
396−
397− if (processOutput.outcome._tag === "TimedOut") {
398− return {
399− result: null,
400− error: timeoutMessage(timeoutMs),
401− logs,
402− } satisfies ExecuteResult;
403− }
404−
405− if (processOutput.outcome.exitCode !== 0) {
406− const errorOutput = processOutput.stderr.trim() || processOutput.stdout.trim();
407−
408− return {
409− result: null,
410− error: errorOutput || `Process exited with code ${processOutput.outcome.exitCode}`,
411− logs,
412− } satisfies ExecuteResult;
413− }
414−
415− return {
416− result: parseResultFromStdout(processOutput.stdout),
417− logs,
418− } satisfies ExecuteResult;
419− }).pipe(
420− Effect.catchTag("SecureExecExecutionError", (error) =>
421− Effect.succeed<ExecuteResult>({
422− result: null,
423− error: error.message,
424− logs,
425− }),
426− ),
427− Effect.catchCause((cause) =>
428− Effect.succeed<ExecuteResult>({
429− result: null,
430− error: formatCauseMessage(cause),
431− logs,
432− }),
433− ),
434− );
435−};
436−
437−export const makeSecureExecExecutor = (
438− options: SecureExecExecutorOptions = {},
439−): CodeExecutor<never> => ({
440− execute: (code: string, toolInvoker: SandboxToolInvoker) =>
441− evaluateInSecureExec(options, code, toolInvoker),
442−});
packages/kernel/runtime-secure-exec/tsconfig.json+0−23
@@ -1,23 +0,0 @@
1−{
2− "compilerOptions": {
3− "target": "ES2022",
4− "module": "ESNext",
5− "moduleResolution": "Bundler",
6− "strict": true,
7− "skipLibCheck": true,
8− "noEmit": true,
9− "lib": ["ES2022"],
10− "types": ["bun-types", "node"],
11− "noUnusedLocals": true,
12− "noImplicitOverride": true,
13− "plugins": [
14− {
15− "name": "@effect/language-service",
16− "diagnosticSeverity": {
17− "globalErrorInEffectCatch": "off"
18− }
19− }
20− ]
21− },
22− "include": ["src/**/*.ts"]
23−}
packages/kernel/runtime-secure-exec/vitest.config.ts+0−8
@@ -1,8 +0,0 @@
1−import { defineConfig } from "vitest/config";
2−
3−export default defineConfig({
4− test: {
5− include: ["src/**/*.test.ts"],
6− testTimeout: 30_000,
7− },
8−});
scripts/install.sh+285−0
@@ -0,0 +1,285 @@
1+#!/usr/bin/env bash
2+set -euo pipefail
3+APP=executor
4+REPO=RhysSullivan/executor
5+
6+MUTED='\033[0;2m'
7+RED='\033[0;31m'
8+ORANGE='\033[38;5;214m'
9+NC='\033[0m'
10+
11+usage() {
12+ cat <<EOF
13+Executor installer
14+
15+Usage: install.sh [options]
16+
17+Options:
18+ -h, --help Display this help message
19+ -v, --version <version> Install a specific version (e.g. 1.4.12)
20+ -b, --binary <path> Install from a local binary instead of downloading
21+ --no-modify-path Don't modify shell config files (.zshrc, .bashrc, etc.)
22+
23+Examples:
24+ curl -fsSL https://raw.githubusercontent.com/${REPO}/main/scripts/install.sh | bash
25+ curl -fsSL https://raw.githubusercontent.com/${REPO}/main/scripts/install.sh | bash -s -- --version 1.4.12
26+ ./install.sh --binary /path/to/executor
27+EOF
28+}
29+
30+requested_version=${VERSION:-}
31+no_modify_path=false
32+binary_path=""
33+
34+while [[ $# -gt 0 ]]; do
35+ case "$1" in
36+ -h|--help)
37+ usage
38+ exit 0
39+ ;;
40+ -v|--version)
41+ if [[ -n "${2:-}" ]]; then
42+ requested_version="$2"
43+ shift 2
44+ else
45+ echo -e "${RED}Error: --version requires a version argument${NC}" >&2
46+ exit 1
47+ fi
48+ ;;
49+ -b|--binary)
50+ if [[ -n "${2:-}" ]]; then
51+ binary_path="$2"
52+ shift 2
53+ else
54+ echo -e "${RED}Error: --binary requires a path argument${NC}" >&2
55+ exit 1
56+ fi
57+ ;;
58+ --no-modify-path)
59+ no_modify_path=true
60+ shift
61+ ;;
62+ *)
63+ echo -e "${ORANGE}Warning: Unknown option '$1'${NC}" >&2
64+ shift
65+ ;;
66+ esac
67+done
68+
69+INSTALL_DIR="${EXECUTOR_INSTALL_DIR:-$HOME/.executor/bin}"
70+mkdir -p "$INSTALL_DIR"
71+
72+print_message() {
73+ local level=$1 message=$2 color=""
74+ case "$level" in
75+ info) color="${NC}" ;;
76+ warning) color="${ORANGE}" ;;
77+ error) color="${RED}" ;;
78+ esac
79+ echo -e "${color}${message}${NC}"
80+}
81+
82+if [[ -n "$binary_path" ]]; then
83+ if [[ ! -f "$binary_path" ]]; then
84+ print_message error "Error: binary not found at $binary_path"
85+ exit 1
86+ fi
87+ specific_version="local"
88+else
89+ raw_os=$(uname -s)
90+ case "$raw_os" in
91+ Darwin*) os="darwin" ;;
92+ Linux*) os="linux" ;;
93+ MINGW*|MSYS*|CYGWIN*) os="windows" ;;
94+ *)
95+ print_message error "Unsupported OS: $raw_os"
96+ exit 1
97+ ;;
98+ esac
99+
100+ arch=$(uname -m)
101+ case "$arch" in
102+ aarch64|arm64) arch="arm64" ;;
103+ x86_64|amd64) arch="x64" ;;
104+ *)
105+ print_message error "Unsupported architecture: $arch"
106+ exit 1
107+ ;;
108+ esac
109+
110+ # Apple Silicon under Rosetta reports x64 — install the native arm64 build.
111+ if [[ "$os" == "darwin" && "$arch" == "x64" ]]; then
112+ if [[ "$(sysctl -n sysctl.proc_translated 2>/dev/null || echo 0)" == "1" ]]; then
113+ arch="arm64"
114+ fi
115+ fi
116+
117+ is_musl=false
118+ if [[ "$os" == "linux" ]]; then
119+ if [[ -f /etc/alpine-release ]]; then
120+ is_musl=true
121+ elif command -v ldd >/dev/null 2>&1 && ldd --version 2>&1 | grep -qi musl; then
122+ is_musl=true
123+ fi
124+ fi
125+
126+ target="${os}-${arch}"
127+ if [[ "$is_musl" == "true" ]]; then
128+ target="${target}-musl"
129+ fi
130+
131+ archive_ext=".zip"
132+ if [[ "$os" == "linux" ]]; then
133+ archive_ext=".tar.gz"
134+ fi
135+
136+ filename="${APP}-${target}${archive_ext}"
137+
138+ if [[ "$os" == "linux" ]]; then
139+ if ! command -v tar >/dev/null 2>&1; then
140+ print_message error "Error: 'tar' is required but not installed."
141+ exit 1
142+ fi
143+ else
144+ if ! command -v unzip >/dev/null 2>&1; then
145+ print_message error "Error: 'unzip' is required but not installed."
146+ exit 1
147+ fi
148+ fi
149+
150+ if [[ -z "$requested_version" ]]; then
151+ url="https://github.com/${REPO}/releases/latest/download/${filename}"
152+ specific_version=$(
153+ curl -s "https://api.github.com/repos/${REPO}/releases/latest" \
154+ | sed -n 's/.*"tag_name": *"v\([^"]*\)".*/\1/p'
155+ )
156+ if [[ -z "$specific_version" ]]; then
157+ print_message error "Failed to fetch latest version metadata"
158+ exit 1
159+ fi
160+ else
161+ requested_version="${requested_version#v}"
162+ url="https://github.com/${REPO}/releases/download/v${requested_version}/${filename}"
163+ specific_version="$requested_version"
164+
165+ http_status=$(curl -sI -o /dev/null -w "%{http_code}" \
166+ "https://github.com/${REPO}/releases/tag/v${requested_version}")
167+ if [[ "$http_status" == "404" ]]; then
168+ print_message error "Error: release v${requested_version} not found"
169+ print_message info "${MUTED}Available releases: https://github.com/${REPO}/releases${NC}"
170+ exit 1
171+ fi
172+ fi
173+fi
174+
175+check_existing_version() {
176+ if command -v executor >/dev/null 2>&1; then
177+ local installed
178+ installed=$(executor --version 2>/dev/null || echo "")
179+ if [[ "$installed" == "$specific_version" ]]; then
180+ print_message info "${MUTED}Version ${NC}${specific_version}${MUTED} already installed${NC}"
181+ exit 0
182+ fi
183+ print_message info "${MUTED}Replacing installed version ${NC}${installed}"
184+ fi
185+}
186+
187+download_and_install() {
188+ print_message info "\n${MUTED}Installing ${NC}${APP} ${MUTED}version: ${NC}${specific_version}"
189+ local tmp_dir="${TMPDIR:-/tmp}/${APP}_install_$$"
190+ mkdir -p "$tmp_dir"
191+
192+ curl -# -L -o "${tmp_dir}/${filename}" "$url"
193+
194+ if [[ "$os" == "linux" ]]; then
195+ tar -xzf "${tmp_dir}/${filename}" -C "$tmp_dir"
196+ else
197+ unzip -q "${tmp_dir}/${filename}" -d "$tmp_dir"
198+ fi
199+
200+ # The archive is flat — the binary plus sidecars (emscripten-module.wasm,
201+ # keyring.node) sit at the root. Copy them all into INSTALL_DIR so the
202+ # binary's relative-path lookups still resolve.
203+ rm -f "${tmp_dir}/${filename}"
204+ cp -R "${tmp_dir}/." "${INSTALL_DIR}/"
205+
206+ chmod 755 "${INSTALL_DIR}/${APP}"
207+ rm -rf "$tmp_dir"
208+}
209+
210+install_from_binary() {
211+ print_message info "\n${MUTED}Installing ${NC}${APP} ${MUTED}from: ${NC}${binary_path}"
212+ cp "$binary_path" "${INSTALL_DIR}/${APP}"
213+ chmod 755 "${INSTALL_DIR}/${APP}"
214+}
215+
216+if [[ -n "$binary_path" ]]; then
217+ install_from_binary
218+else
219+ check_existing_version
220+ download_and_install
221+fi
222+
223+add_to_path() {
224+ local config_file=$1 command=$2
225+ if grep -Fxq "$command" "$config_file"; then
226+ print_message info "${MUTED}Already in ${NC}${config_file}"
227+ elif [[ -w "$config_file" ]]; then
228+ echo -e "\n# executor" >> "$config_file"
229+ echo "$command" >> "$config_file"
230+ print_message info "${MUTED}Added ${NC}${APP} ${MUTED}to \$PATH in ${NC}${config_file}"
231+ else
232+ print_message warning "Manually add to ${config_file}:"
233+ print_message info " $command"
234+ fi
235+}
236+
237+XDG_CONFIG_HOME="${XDG_CONFIG_HOME:-$HOME/.config}"
238+current_shell=$(basename "${SHELL:-bash}")
239+
240+case "$current_shell" in
241+ fish)
242+ config_files="$HOME/.config/fish/config.fish"
243+ ;;
244+ zsh)
245+ config_files="${ZDOTDIR:-$HOME}/.zshrc ${ZDOTDIR:-$HOME}/.zshenv $XDG_CONFIG_HOME/zsh/.zshrc $XDG_CONFIG_HOME/zsh/.zshenv"
246+ ;;
247+ bash)
248+ config_files="$HOME/.bashrc $HOME/.bash_profile $HOME/.profile $XDG_CONFIG_HOME/bash/.bashrc $XDG_CONFIG_HOME/bash/.bash_profile"
249+ ;;
250+ *)
251+ config_files="$HOME/.bashrc $HOME/.bash_profile $XDG_CONFIG_HOME/bash/.bashrc $XDG_CONFIG_HOME/bash/.bash_profile"
252+ ;;
253+esac
254+
255+if [[ "$no_modify_path" != "true" ]]; then
256+ config_file=""
257+ for file in $config_files; do
258+ if [[ -f "$file" ]]; then
259+ config_file=$file
260+ break
261+ fi
262+ done
263+
264+ if [[ -z "$config_file" ]]; then
265+ print_message warning "No config file found for ${current_shell}. Add manually:"
266+ print_message info " export PATH=${INSTALL_DIR}:\$PATH"
267+ elif [[ ":$PATH:" != *":$INSTALL_DIR:"* ]]; then
268+ case "$current_shell" in
269+ fish) add_to_path "$config_file" "fish_add_path $INSTALL_DIR" ;;
270+ *) add_to_path "$config_file" "export PATH=$INSTALL_DIR:\$PATH" ;;
271+ esac
272+ fi
273+fi
274+
275+if [[ -n "${GITHUB_ACTIONS-}" && "${GITHUB_ACTIONS}" == "true" ]]; then
276+ echo "$INSTALL_DIR" >> "$GITHUB_PATH"
277+ print_message info "${MUTED}Added ${NC}${INSTALL_DIR}${MUTED} to \$GITHUB_PATH${NC}"
278+fi
279+
280+print_message info ""
281+print_message info "${MUTED}Installed ${NC}${APP} ${MUTED}to ${NC}${INSTALL_DIR}/${APP}"
282+print_message info ""
283+print_message info "${MUTED}Get started:${NC}"
284+print_message info " ${APP} web"
285+print_message info ""
tests/release-bootstrap-smoke.test.ts+148−164
@@ -1,9 +1,9 @@
11 import { describe, expect, it } from "@effect/vitest";
22 import { spawn } from "node:child_process";
33 import { createServer } from "node:http";
4−import { mkdtemp, readFile, readdir, rm, cp, writeFile } from "node:fs/promises";
4+import { mkdtemp, mkdir, readFile, rm, cp } from "node:fs/promises";
55 import { tmpdir } from "node:os";
6−import { basename, join, resolve } from "node:path";
6+import { join, resolve } from "node:path";
77 import { fileURLToPath } from "node:url";
88
99 type CommandResult = {
@@ -61,7 +61,7 @@ const listen = async (server: ReturnType<typeof createServer>): Promise<number> · 51 unmodified lines
6161 server.listen(0, "127.0.0.1", () => {
6262 const address = server.address();
6363 if (!address || typeof address === "string") {
64− reject(new Error("Failed to resolve local release server address"));
64+ reject(new Error("Failed to resolve server address"));
6565 return;
6666 }
6767 resolvePort(address.port);
@@ -79,186 +79,170 @@ const closeServer = async (server: ReturnType<typeof createServer>): Promise<voi · 11 unmodified lines
7979 });
8080 });
8181
82+const platformName = process.platform === "win32" ? "win32" : process.platform;
83+const archName = process.arch;
84+const currentPlatformPackage = `executor-${platformName}-${archName}`;
8285 const currentRuntimeBinaryName = process.platform === "win32" ? "executor.exe" : "executor";
8386 const isSupportedPlatform =
8487 ["darwin", "linux", "win32"].includes(process.platform) &&
8588 ["x64", "arm64"].includes(process.arch);
8689
8790 describe("release bootstrap smoke", () => {
88− it("fresh wrapper install bootstraps locally hosted release assets and stays runnable", async () => {
89− if (!isSupportedPlatform) {
90− return;
91− }
92−
93− const build = await runCommand("bun", ["run", "src/build.ts", "binary", "--single"], cliRoot);
94− expect(build.exitCode, build.stderr || build.stdout).toBe(0);
95−
96− const assets = await runCommand("bun", ["run", "src/build.ts", "release-assets"], cliRoot);
97− expect(assets.exitCode, assets.stderr || assets.stdout).toBe(0);
98−
99− const wrapperDir = join(distDir, "executor");
100− const assetNames = (await readdir(distDir))
101− .filter((entry) => /^executor-.*\.(?:tar\.gz|zip)$/.test(entry))
102− .sort();
103−
104− expect(assetNames, `expected one current-platform asset in ${distDir}`).toHaveLength(1);
105−
106− const assetName = assetNames[0]!;
107− const assetPath = join(distDir, assetName);
108− const tempRoot = await mkdtemp(join(tmpdir(), "executor-release-bootstrap-"));
109− const installedPackageDir = join(tempRoot, "executor");
110− const dataDir = join(tempRoot, "data");
111−
112− await cp(wrapperDir, installedPackageDir, { recursive: true });
113−
114− const originalPackageJson = JSON.parse(
115− await readFile(join(installedPackageDir, "package.json"), "utf8"),
116− ) as { version: string; homepage?: string };
117−
118− const assetRoute = `/releases/download/v${originalPackageJson.version}/${assetName}`;
119− const server = createServer(async (request, response) => {
120− if (request.url !== assetRoute) {
121− response.statusCode = 404;
122− response.end("not found");
91+ it(
92+ "wrapper resolves the platform binary from optionalDependencies and stays runnable",
93+ async () => {
94+ if (!isSupportedPlatform) {
12395 return;
12496 }
12597
126− const body = await readFile(assetPath);
127− response.statusCode = 200;
128− response.setHeader("content-length", String(body.byteLength));
129− response.end(body);
130− });
131−
132− try {
133− const port = await listen(server);
134− const packageJsonPath = join(installedPackageDir, "package.json");
135− await writeFile(
136− packageJsonPath,
137− JSON.stringify(
138− {
139− ...originalPackageJson,
140− homepage: `http://127.0.0.1:${port}`,
141− },
142− null,
143− 2,
144− ) + "\n",
145− );
146−
147− const firstRun = await runCommand(
148− process.execPath,
149− [join(installedPackageDir, "bin", "executor"), "--help"],
150− installedPackageDir,
151− );
152− const combinedOutput = `${firstRun.stdout}\n${firstRun.stderr}`;
153−
154− expect(firstRun.exitCode, combinedOutput).toBe(0);
155− expect(combinedOutput).toContain("downloading release asset");
156− expect(combinedOutput).toContain(
157− `installed ${basename(assetName, ".zip").replace(/\.tar\.gz$/, "")}`,
98+ const build = await runCommand(
99+ "bun",
100+ ["run", "src/build.ts", "binary", "--single"],
101+ cliRoot,
158102 );
159− expect(combinedOutput).not.toContain("core_bg.wasm");
160− expect(combinedOutput).not.toContain("ENOENT");
161−
162− const installedBinaryPath = join(
163− installedPackageDir,
164− "bin",
165− "runtime",
166− currentRuntimeBinaryName,
103+ expect(build.exitCode, build.stderr || build.stdout).toBe(0);
104+
105+ const wrapperDir = join(distDir, "executor");
106+ const platformDir = join(distDir, currentPlatformPackage);
107+
108+ // Simulate the install layout npm/bun produces:
109+ // <root>/executor/ <- wrapper (bin, postinstall, package.json)
110+ // <root>/executor/node_modules/executor-<plat>-<arch>/ <- platform package
111+ const tempRoot = await mkdtemp(join(tmpdir(), "executor-optdeps-bootstrap-"));
112+ const installedWrapperDir = join(tempRoot, "executor");
113+ const installedPlatformDir = join(
114+ installedWrapperDir,
115+ "node_modules",
116+ currentPlatformPackage,
167117 );
168− const installedBinaryStat = await readFile(installedBinaryPath);
169− expect(installedBinaryStat.byteLength).toBeGreaterThan(0);
118+ const dataDir = join(tempRoot, "data");
170119
171− const probeServer = createServer((_, response) => {
172− response.statusCode = 204;
173− response.end();
174− });
175− const webPort = await listen(probeServer);
176− await closeServer(probeServer);
120+ await cp(wrapperDir, installedWrapperDir, { recursive: true });
121+ await mkdir(join(installedWrapperDir, "node_modules"), { recursive: true });
122+ await cp(platformDir, installedPlatformDir, { recursive: true });
177123
178− const webProcess = spawn(
179− process.execPath,
180− [join(installedPackageDir, "bin", "executor"), "web", "--port", String(webPort)],
181− {
182− cwd: installedPackageDir,
183− env: {
184− ...process.env,
185− EXECUTOR_DATA_DIR: dataDir,
124+ try {
125+ const firstRun = await runCommand(
126+ process.execPath,
127+ [join(installedWrapperDir, "bin", "executor"), "--help"],
128+ installedWrapperDir,
129+ );
130+ const combined = `${firstRun.stdout}\n${firstRun.stderr}`;
131+ expect(firstRun.exitCode, combined).toBe(0);
132+ expect(combined).not.toContain("could not locate a platform binary");
133+ expect(combined).not.toContain("ENOENT");
134+
135+ // The platform binary lives under node_modules/<platform-pkg>/bin/.
136+ const platformBinaryPath = join(
137+ installedPlatformDir,
138+ "bin",
139+ currentRuntimeBinaryName,
140+ );
141+ const platformBinaryStat = await readFile(platformBinaryPath);
142+ expect(platformBinaryStat.byteLength).toBeGreaterThan(0);
143+
144+ // Boot the web command and check that the bundled web UI serves.
145+ const probeServer = createServer((_, response) => {
146+ response.statusCode = 204;
147+ response.end();
148+ });
149+ const webPort = await listen(probeServer);
150+ await closeServer(probeServer);
151+
152+ const webProcess = spawn(
153+ process.execPath,
154+ [
155+ join(installedWrapperDir, "bin", "executor"),
156+ "web",
157+ "--port",
158+ String(webPort),
159+ ],
160+ {
161+ cwd: installedWrapperDir,
162+ env: {
163+ ...process.env,
164+ EXECUTOR_DATA_DIR: dataDir,
165+ },
166+ stdio: ["ignore", "pipe", "pipe"],
186167 },
187− stdio: ["ignore", "pipe", "pipe"],
188− },
189− );
190−
191− let webStdout = "";
192− let webStderr = "";
193− webProcess.stdout.setEncoding("utf8");
194− webProcess.stdout.on("data", (chunk) => {
195− webStdout += chunk;
196− });
197− webProcess.stderr.setEncoding("utf8");
198− webProcess.stderr.on("data", (chunk) => {
199− webStderr += chunk;
200− });
168+ );
201169
202− try {
203− const deadline = Date.now() + 30_000;
204− let rootResponse: Response | null = null;
205− while (Date.now() < deadline) {
206− await new Promise((resolveDelay) => setTimeout(resolveDelay, 250));
207− try {
208− rootResponse = await fetch(`http://127.0.0.1:${webPort}/`);
209− if (rootResponse.ok) {
210− break;
170+ let webStdout = "";
171+ let webStderr = "";
172+ webProcess.stdout.setEncoding("utf8");
173+ webProcess.stdout.on("data", (chunk) => {
174+ webStdout += chunk;
175+ });
176+ webProcess.stderr.setEncoding("utf8");
177+ webProcess.stderr.on("data", (chunk) => {
178+ webStderr += chunk;
179+ });
180+
181+ try {
182+ const deadline = Date.now() + 30_000;
183+ let rootResponse: Response | null = null;
184+ while (Date.now() < deadline) {
185+ await new Promise((resolveDelay) => setTimeout(resolveDelay, 250));
186+ try {
187+ rootResponse = await fetch(`http://127.0.0.1:${webPort}/`);
188+ if (rootResponse.ok) {
189+ break;
190+ }
191+ } catch {
192+ // keep polling until the server is ready
211193 }
212− } catch {
213− // keep polling until the server is ready
214194 }
215− }
216−
217− expect(rootResponse, `${webStdout}\n${webStderr}`).not.toBeNull();
218− expect(rootResponse!.status, `${webStdout}\n${webStderr}`).toBe(200);
219− const rootHtml = await rootResponse!.text();
220− expect(rootHtml.toLowerCase()).toContain("<html");
221−
222− const assetJs = rootHtml.match(/src="([^"]+\.js)"/)?.[1];
223− const assetCss = rootHtml.match(/href="([^"]+\.css)"/)?.[1];
224− expect(assetJs, rootHtml).toBeDefined();
225− expect(assetCss, rootHtml).toBeDefined();
226195
227− const assetJsResponse = await fetch(`http://127.0.0.1:${webPort}${assetJs}`);
228− expect(assetJsResponse.status, `${webStdout}\n${webStderr}`).toBe(200);
229−
230− const assetCssResponse = await fetch(`http://127.0.0.1:${webPort}${assetCss}`);
231− expect(assetCssResponse.status, `${webStdout}\n${webStderr}`).toBe(200);
232−
233− const docsResponse = await fetch(`http://127.0.0.1:${webPort}/docs`);
234− expect(docsResponse.status, `${webStdout}\n${webStderr}`).toBe(200);
235−
236− const secondRun = await runCommand(
237− process.execPath,
238− [join(installedPackageDir, "bin", "executor"), "--help"],
239− installedPackageDir,
240− );
241− const secondCombinedOutput = `${secondRun.stdout}\n${secondRun.stderr}`;
242−
243− expect(secondRun.exitCode, secondCombinedOutput).toBe(0);
244− expect(secondCombinedOutput).not.toContain("downloading release asset");
245− } finally {
246− webProcess.kill("SIGTERM");
247− await Promise.race([
248− new Promise((resolveClose) => webProcess.once("close", () => resolveClose(undefined))),
249− new Promise((resolveClose) => setTimeout(resolveClose, 5_000)),
250− ]);
251− if (webProcess.exitCode === null) {
252− if (process.platform === "win32") {
253− webProcess.kill();
254− } else {
255− webProcess.kill("SIGKILL");
196+ expect(rootResponse, `${webStdout}\n${webStderr}`).not.toBeNull();
197+ expect(rootResponse!.status, `${webStdout}\n${webStderr}`).toBe(200);
198+ const rootHtml = await rootResponse!.text();
199+ expect(rootHtml.toLowerCase()).toContain("<html");
200+
201+ const assetJs = rootHtml.match(/src="([^"]+\.js)"/)?.[1];
202+ const assetCss = rootHtml.match(/href="([^"]+\.css)"/)?.[1];
203+ expect(assetJs, rootHtml).toBeDefined();
204+ expect(assetCss, rootHtml).toBeDefined();
205+
206+ const assetJsResponse = await fetch(`http://127.0.0.1:${webPort}${assetJs}`);
207+ expect(assetJsResponse.status, `${webStdout}\n${webStderr}`).toBe(200);
208+
209+ const assetCssResponse = await fetch(`http://127.0.0.1:${webPort}${assetCss}`);
210+ expect(assetCssResponse.status, `${webStdout}\n${webStderr}`).toBe(200);
211+
212+ const docsResponse = await fetch(`http://127.0.0.1:${webPort}/docs`);
213+ expect(docsResponse.status, `${webStdout}\n${webStderr}`).toBe(200);
214+
215+ // Sanity: a second invocation still works (the cache shouldn't
216+ // break anything if it was created).
217+ const secondRun = await runCommand(
218+ process.execPath,
219+ [join(installedWrapperDir, "bin", "executor"), "--help"],
220+ installedWrapperDir,
221+ );
222+ expect(
223+ secondRun.exitCode,
224+ `${secondRun.stdout}\n${secondRun.stderr}`,
225+ ).toBe(0);
226+ } finally {
227+ webProcess.kill("SIGTERM");
228+ await Promise.race([
229+ new Promise((resolveClose) =>
230+ webProcess.once("close", () => resolveClose(undefined)),
231+ ),
232+ new Promise((resolveClose) => setTimeout(resolveClose, 5_000)),
233+ ]);
234+ if (webProcess.exitCode === null) {
235+ if (process.platform === "win32") {
236+ webProcess.kill();
237+ } else {
238+ webProcess.kill("SIGKILL");
239+ }
256240 }
257241 }
242+ } finally {
243+ await rm(tempRoot, { recursive: true, force: true });
258244 }
259− } finally {
260− await closeServer(server);
261− await rm(tempRoot, { recursive: true, force: true });
262− }
263− }, 180_000);
245+ },
246+ 180_000,
247+ );
264248 });