merge: node-pty -> @homebridge fork migration
This commit is contained in:
@@ -50,6 +50,7 @@
|
||||
},
|
||||
"pnpm": {
|
||||
"onlyBuiltDependencies": [
|
||||
"@homebridge/node-pty-prebuilt-multiarch",
|
||||
"electron",
|
||||
"esbuild",
|
||||
"koffi",
|
||||
|
||||
@@ -170,11 +170,15 @@ dist/
|
||||
**Important:** When distributing or moving the binary, ensure the `client/` and `runtime/` directories are copied alongside it. Terminal functionality will gracefully degrade (return HTTP 503) if runtime assets are missing — the dashboard will continue to work but terminal sessions won't be available.
|
||||
|
||||
**How it works:**
|
||||
When the dashboard starts from a Bun-compiled binary, it attempts to set up native module resolution so `node-pty` can find its platform-specific `.node` files. This involves:
|
||||
1. Copying native assets to a temp directory (`/tmp/kb-bunfs-<pid>/kb/prebuilds/<platform>/`)
|
||||
When the dashboard starts from a Bun-compiled binary, it attempts to set up native module resolution so `@homebridge/node-pty-prebuilt-multiarch` (aliased as `node-pty`) can find its platform-specific `.node` file. This involves:
|
||||
1. Copying the staged `pty.node` from `runtime/<platform>/` to a temp directory (`/tmp/fn-bunfs-<pid>/fn/prebuilds/<platform>/`)
|
||||
2. Attempting to create a symlink at `/$bunfs/root` pointing to the temp directory (Unix platforms)
|
||||
3. If the symlink can't be created (e.g., macOS permissions), pre-loading the native module via `process.dlopen()`
|
||||
|
||||
During the build (`bun run build.ts`), native assets are sourced from:
|
||||
- **Host platform**: `node_modules/node-pty/build/Release/pty.node` (placed by `prebuild-install` at install time)
|
||||
- **Linux cross-compile targets**: `node_modules/node-pty/prebuilds/linux-<arch>/node.abi<N>.node` (bundled in the fork's npm tarball)
|
||||
|
||||
If all resolution methods fail, terminal creation gracefully returns `null`, which the HTTP layer converts to a 503 Service Unavailable response.
|
||||
|
||||
**Cross-compilation:** Native assets are staged per-platform during build. When cross-compiling, only the target platform's assets are included. PTY functionality requires running on a platform with matching native assets.
|
||||
|
||||
@@ -19,7 +19,8 @@
|
||||
*/
|
||||
|
||||
import { join, dirname } from "node:path";
|
||||
import { cpSync, mkdirSync, existsSync, rmSync, writeFileSync } from "node:fs";
|
||||
import { cpSync, mkdirSync, existsSync, rmSync, writeFileSync, readdirSync } from "node:fs";
|
||||
import { createRequire } from "node:module";
|
||||
|
||||
const cliRoot = dirname(new URL(import.meta.url).pathname);
|
||||
const workspaceRoot = join(cliRoot, "..", "..");
|
||||
@@ -30,8 +31,56 @@ const runtimeDir = join(outDir, "runtime");
|
||||
const entryPoint = join(cliRoot, "src", "bin.ts");
|
||||
|
||||
// ── Native module asset paths ─────────────────────────────────────────
|
||||
// node-pty prebuilds location in pnpm workspace
|
||||
const nodePtyRoot = join(workspaceRoot, "node_modules", ".pnpm", "node-pty@1.1.0", "node_modules", "node-pty");
|
||||
// Resolve the @homebridge/node-pty-prebuilt-multiarch install root dynamically.
|
||||
// The package is aliased as "node-pty" in package.json of @fusion/dashboard.
|
||||
// We must create the require from the dashboard package location so Node resolves
|
||||
// node-pty via the dashboard's node_modules (where the alias is installed).
|
||||
const dashboardPkgDir = join(workspaceRoot, "packages", "dashboard");
|
||||
const _require = createRequire(join(dashboardPkgDir, "package.json"));
|
||||
let nodePtyRoot: string;
|
||||
try {
|
||||
const pkgJsonPath = _require.resolve("node-pty/package.json");
|
||||
nodePtyRoot = dirname(pkgJsonPath);
|
||||
console.log(` node-pty resolved to: ${nodePtyRoot}`);
|
||||
} catch {
|
||||
// Fallback: check pnpm's shared node_modules
|
||||
const fallback = join(workspaceRoot, "node_modules", ".pnpm", "node_modules", "node-pty");
|
||||
if (existsSync(fallback)) {
|
||||
nodePtyRoot = fallback;
|
||||
console.log(` node-pty fallback resolved to: ${nodePtyRoot}`);
|
||||
} else {
|
||||
// Last resort: rely on pnpm symlink structure
|
||||
nodePtyRoot = join(dashboardPkgDir, "node_modules", "node-pty");
|
||||
console.log(` node-pty last-resort resolved to: ${nodePtyRoot}`);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Pick the highest ABI .node file from a prebuilds/<plat-arch>/ directory
|
||||
* that is <= the host Node.js ABI, returning its full path (or null).
|
||||
* The fork names files like: node.abi115.node, node.abi115.musl.node
|
||||
* We want the non-musl version (glibc) for cross-compile targets.
|
||||
*/
|
||||
function pickHighestAbiNode(prebuildDir: string, targetAbi: number): string | null {
|
||||
let files: string[];
|
||||
try {
|
||||
files = readdirSync(prebuildDir);
|
||||
} catch {
|
||||
return null;
|
||||
}
|
||||
// Match node.abi<N>.node (non-musl)
|
||||
const abiRe = /^node\.abi(\d+)\.node$/;
|
||||
let best: { abi: number; file: string } | null = null;
|
||||
for (const f of files) {
|
||||
const m = abiRe.exec(f);
|
||||
if (!m) continue;
|
||||
const abi = parseInt(m[1], 10);
|
||||
if (abi <= targetAbi && (!best || abi > best.abi)) {
|
||||
best = { abi, file: f };
|
||||
}
|
||||
}
|
||||
return best ? join(prebuildDir, best.file) : null;
|
||||
}
|
||||
|
||||
// ── Supported cross-compilation targets ───────────────────────────────
|
||||
const SUPPORTED_TARGETS = [
|
||||
@@ -155,56 +204,101 @@ function ensureClientAssets(): ClientAssetMode {
|
||||
|
||||
// ── Copy native terminal assets for a specific target ─────────────────
|
||||
/**
|
||||
* Stage node-pty native assets for the given target platform.
|
||||
* Stage @homebridge/node-pty-prebuilt-multiarch native assets for the given target.
|
||||
* Assets are placed in dist/runtime/<platform-arch>/ alongside client/.
|
||||
*
|
||||
* For each target, we copy:
|
||||
* - prebuilds/<platform>-<arch>/pty.node (the native binary)
|
||||
* - prebuilds/<platform>-<arch>/spawn-helper (Unix helper, if exists)
|
||||
*
|
||||
* This ensures the standalone binary can find these assets at runtime
|
||||
* without relying on the original node_modules structure.
|
||||
*
|
||||
* The fork ships two layouts:
|
||||
* - build/Release/pty.node — placed here by `prebuild-install` at install time
|
||||
* (present on the HOST platform only)
|
||||
* - prebuilds/linux-<arch>/node.abi<N>.node — bundled inside the npm tarball
|
||||
* (present for Linux targets on any host)
|
||||
*
|
||||
* Strategy per target:
|
||||
* - Host (no --target flag): use build/Release/pty.node + build/Release/spawn-helper
|
||||
* - bun-linux-x64/arm64: use prebuilds/linux-<arch>/node.abi<N>.node (highest ≤ host ABI)
|
||||
* - bun-darwin-x64/arm64: prebuilds not bundled; warn and skip (cross-compile unsupported)
|
||||
* - bun-windows-x64: prebuilds not bundled; warn and skip
|
||||
*/
|
||||
function copyNativeAssets(target?: BunTarget) {
|
||||
function copyNativeAssets(target?: BunTarget): boolean {
|
||||
const prebuildName = target ? targetToPrebuildName(target) : hostPrebuildName();
|
||||
const srcPrebuildDir = join(nodePtyRoot, "prebuilds", prebuildName);
|
||||
|
||||
if (!existsSync(srcPrebuildDir)) {
|
||||
console.warn(` ⚠ No prebuilds found for ${prebuildName} at ${srcPrebuildDir}`);
|
||||
return false;
|
||||
}
|
||||
|
||||
const destDir = join(runtimeDir, prebuildName);
|
||||
|
||||
|
||||
try {
|
||||
// Clean and recreate
|
||||
// Clean and recreate dest
|
||||
if (existsSync(destDir)) {
|
||||
rmSync(destDir, { recursive: true, force: true });
|
||||
}
|
||||
mkdirSync(destDir, { recursive: true });
|
||||
|
||||
// Copy pty.node (required)
|
||||
const ptyNodeSrc = join(srcPrebuildDir, "pty.node");
|
||||
const ptyNodeDest = join(destDir, "pty.node");
|
||||
if (existsSync(ptyNodeSrc)) {
|
||||
cpSync(ptyNodeSrc, ptyNodeDest);
|
||||
console.log(` → ${destDir}/pty.node`);
|
||||
// ── Determine source pty.node ─────────────────────────────────────
|
||||
let ptyNodeSrc: string | null = null;
|
||||
let spawnHelperSrc: string | null = null;
|
||||
|
||||
if (!target) {
|
||||
// HOST build: use the prebuild-install output in build/Release/
|
||||
const releaseDir = join(nodePtyRoot, "build", "Release");
|
||||
const candidate = join(releaseDir, "pty.node");
|
||||
if (existsSync(candidate)) {
|
||||
ptyNodeSrc = candidate;
|
||||
const helper = join(releaseDir, "spawn-helper");
|
||||
if (existsSync(helper)) spawnHelperSrc = helper;
|
||||
} else {
|
||||
// Fallback: maybe prebuilds/<plat-arch>/ exists (older fork layout or manually extracted)
|
||||
const prebuildDir = join(nodePtyRoot, "prebuilds", prebuildName);
|
||||
const hostAbi = parseInt(process.versions.modules, 10);
|
||||
ptyNodeSrc = pickHighestAbiNode(prebuildDir, hostAbi);
|
||||
if (!ptyNodeSrc && existsSync(join(prebuildDir, "pty.node"))) {
|
||||
// Some layouts ship pty.node directly (shouldn't happen with this fork, but guard)
|
||||
ptyNodeSrc = join(prebuildDir, "pty.node");
|
||||
}
|
||||
const helper = join(prebuildDir, "spawn-helper");
|
||||
if (existsSync(helper)) spawnHelperSrc = helper;
|
||||
}
|
||||
} else if (target.startsWith("bun-linux-")) {
|
||||
// Linux cross-compile: use the pre-bundled prebuilds/ in the npm tarball
|
||||
const [, , arch] = target.split("-") as [string, string, string]; // bun-linux-<arch>
|
||||
// Bun's arm64 → arm64, but armv7 is "arm" in prebuilds
|
||||
const linuxArch = arch === "arm64" ? "arm64" : arch === "x64" ? "x64" : arch;
|
||||
const prebuildDir = join(nodePtyRoot, "prebuilds", `linux-${linuxArch}`);
|
||||
const hostAbi = parseInt(process.versions.modules, 10);
|
||||
ptyNodeSrc = pickHighestAbiNode(prebuildDir, hostAbi);
|
||||
if (ptyNodeSrc) {
|
||||
const helper = join(prebuildDir, "spawn-helper");
|
||||
if (existsSync(helper)) spawnHelperSrc = helper;
|
||||
}
|
||||
} else {
|
||||
console.warn(` ⚠ pty.node not found for ${prebuildName}`);
|
||||
// darwin or windows cross-compile: prebuilds are NOT bundled in the tarball.
|
||||
// They are only present in build/Release/ after prebuild-install runs on that host.
|
||||
// Warn and skip rather than erroring — the binary will start but terminal won't work.
|
||||
console.warn(
|
||||
` WARNING: Cross-compiling for ${target} from ${hostPrebuildName()}. ` +
|
||||
`The @homebridge/node-pty-prebuilt-multiarch package only bundles Linux prebuilds in the npm tarball. ` +
|
||||
`Darwin/Windows prebuilds are downloaded by prebuild-install at install time on the target host. ` +
|
||||
`Terminal functionality will be unavailable in this cross-compiled build.`
|
||||
);
|
||||
return false;
|
||||
}
|
||||
|
||||
// Copy spawn-helper if it exists (Unix platforms)
|
||||
const spawnHelperSrc = join(srcPrebuildDir, "spawn-helper");
|
||||
if (existsSync(spawnHelperSrc)) {
|
||||
const spawnHelperDest = join(destDir, "spawn-helper");
|
||||
cpSync(spawnHelperSrc, spawnHelperDest);
|
||||
if (!ptyNodeSrc) {
|
||||
console.warn(` WARNING: No pty.node found for target ${prebuildName}. Terminal will be unavailable.`);
|
||||
console.warn(` Looked in: ${join(nodePtyRoot, "build", "Release")} and ${join(nodePtyRoot, "prebuilds", prebuildName)}`);
|
||||
return false;
|
||||
}
|
||||
|
||||
// Copy pty.node (renamed to stable "pty.node" so native-patch.ts can find it)
|
||||
const ptyNodeDest = join(destDir, "pty.node");
|
||||
cpSync(ptyNodeSrc, ptyNodeDest);
|
||||
console.log(` → ${destDir}/pty.node (from ${ptyNodeSrc})`);
|
||||
|
||||
// Copy spawn-helper if available (Unix platforms)
|
||||
if (spawnHelperSrc) {
|
||||
cpSync(spawnHelperSrc, join(destDir, "spawn-helper"));
|
||||
console.log(` → ${destDir}/spawn-helper`);
|
||||
}
|
||||
|
||||
return true;
|
||||
} catch (err) {
|
||||
console.error(` ✗ Failed to copy native assets for ${prebuildName}:`, err);
|
||||
console.error(` ERROR: Failed to copy native assets for ${prebuildName}:`, err);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -811,7 +811,7 @@ Plugin management endpoints with multi-project scoping support via `projectId` q
|
||||
|
||||
- **Frontend**: React + Vite, TypeScript, xterm.js for terminal emulation, CSS custom properties for theming
|
||||
- **Backend**: Express server with REST API, badge WebSocket at `/api/ws`, terminal WebSocket at `/api/terminal/ws`, and Server-Sent Events (SSE) for task/log updates
|
||||
- **Terminal**: node-pty for PTY spawning, WebSocket for bidirectional I/O
|
||||
- **Terminal**: @homebridge/node-pty-prebuilt-multiarch (aliased as node-pty) for PTY spawning, WebSocket for bidirectional I/O
|
||||
- **Badge Updates**: `useBadgeWebSocket()` shares a single browser socket and subscribes per visible GitHub-linked task card
|
||||
- **State Management**: Custom hooks with EventSource for real-time task updates plus a dedicated WebSocket store for badge snapshots
|
||||
- **Git Integration**: Server-side git command execution with validation
|
||||
|
||||
@@ -36,8 +36,7 @@
|
||||
"build:client": "vite build",
|
||||
"dev": "pnpm build && pnpm typecheck && pnpm dev:serve",
|
||||
"dev:serve": "vite dev",
|
||||
"postinstall": "chmod +x node_modules/.pnpm/node-pty*/node_modules/node-pty/prebuilds/darwin-*/spawn-helper node_modules/.pnpm/node-pty*/node_modules/node-pty/prebuilds/darwin-*/*.node 2>/dev/null || true",
|
||||
"test": "vitest run --silent=passed-only --reporter=dot --exclude '**/build-output.test.ts'",
|
||||
"test": "vitest run --silent=passed-only --reporter=dot --exclude '**/build-output.test.ts'",
|
||||
"test:build": "vitest run --silent=passed-only --reporter=dot app/__tests__/build-output.test.ts",
|
||||
"typecheck": "tsc --noEmit && tsc --noEmit -p tsconfig.app.json"
|
||||
},
|
||||
@@ -64,7 +63,7 @@
|
||||
"ioredis": "^5.6.0",
|
||||
"lucide-react": "^1.7.0",
|
||||
"multer": "^2.1.1",
|
||||
"node-pty": "^1.1.0-beta22",
|
||||
"node-pty": "npm:@homebridge/node-pty-prebuilt-multiarch@^0.13.1",
|
||||
"react": "^19.0.0",
|
||||
"react-dom": "^19.0.0",
|
||||
"react-markdown": "^10.1.0",
|
||||
|
||||
@@ -44,8 +44,23 @@ function getNativePrebuildName(): string {
|
||||
function findInstalledNodePtyNativeDir(): string | null {
|
||||
try {
|
||||
const packageJsonPath = require.resolve("node-pty/package.json");
|
||||
const nativeDir = join(dirname(packageJsonPath), "prebuilds", getNativePrebuildName());
|
||||
return fs.existsSync(join(nativeDir, "pty.node")) ? nativeDir : null;
|
||||
const pkgRoot = dirname(packageJsonPath);
|
||||
|
||||
// @homebridge/node-pty-prebuilt-multiarch (aliased as node-pty) places the binary
|
||||
// in build/Release/pty.node after prebuild-install runs at install time.
|
||||
// Prefer this location as it is the fork's standard output path.
|
||||
const releaseDir = join(pkgRoot, "build", "Release");
|
||||
if (fs.existsSync(join(releaseDir, "pty.node"))) {
|
||||
return releaseDir;
|
||||
}
|
||||
|
||||
// Fallback: check the old prebuilds/<plat-arch>/ layout (upstream node-pty style).
|
||||
const prebuildDir = join(pkgRoot, "prebuilds", getNativePrebuildName());
|
||||
if (fs.existsSync(join(prebuildDir, "pty.node"))) {
|
||||
return prebuildDir;
|
||||
}
|
||||
|
||||
return null;
|
||||
} catch {
|
||||
return null;
|
||||
}
|
||||
|
||||
80
packages/dashboard/src/types/node-pty/index.d.ts
vendored
Normal file
80
packages/dashboard/src/types/node-pty/index.d.ts
vendored
Normal file
@@ -0,0 +1,80 @@
|
||||
/**
|
||||
* Type shim for the `node-pty` import specifier.
|
||||
*
|
||||
* The runtime package is @homebridge/node-pty-prebuilt-multiarch, aliased as
|
||||
* "node-pty" in package.json. Its bundled typings use `declare module
|
||||
* '@homebridge/node-pty-prebuilt-multiarch'` which TypeScript cannot resolve
|
||||
* via the npm alias alone. This shim re-declares the module under the `node-pty`
|
||||
* specifier so all source imports of `"node-pty"` resolve correctly.
|
||||
*
|
||||
* API surface matches node-pty 0.10.x / @homebridge/node-pty-prebuilt-multiarch 0.13.x.
|
||||
*/
|
||||
declare module "node-pty" {
|
||||
/**
|
||||
* An object that can be disposed via a dispose function.
|
||||
*/
|
||||
export interface IDisposable {
|
||||
dispose(): void;
|
||||
}
|
||||
|
||||
/**
|
||||
* An event that can be listened to.
|
||||
* @returns an IDisposable to stop listening.
|
||||
*/
|
||||
export interface IEvent<T> {
|
||||
(listener: (e: T) => unknown): IDisposable;
|
||||
}
|
||||
|
||||
export interface IBasePtyForkOptions {
|
||||
name?: string;
|
||||
cols?: number;
|
||||
rows?: number;
|
||||
cwd?: string;
|
||||
env?: { [key: string]: string | undefined };
|
||||
encoding?: string | null;
|
||||
handleFlowControl?: boolean;
|
||||
flowControlPause?: string;
|
||||
flowControlResume?: string;
|
||||
}
|
||||
|
||||
export interface IPtyForkOptions extends IBasePtyForkOptions {
|
||||
uid?: number;
|
||||
gid?: number;
|
||||
}
|
||||
|
||||
export interface IWindowsPtyForkOptions extends IBasePtyForkOptions {
|
||||
useConpty?: boolean;
|
||||
useConptyDll?: boolean;
|
||||
conptyInheritCursor?: boolean;
|
||||
}
|
||||
|
||||
/**
|
||||
* An interface representing a pseudoterminal.
|
||||
*/
|
||||
export interface IPty {
|
||||
readonly pid: number;
|
||||
readonly cols: number;
|
||||
readonly rows: number;
|
||||
readonly process: string;
|
||||
handleFlowControl: boolean;
|
||||
readonly onData: IEvent<string>;
|
||||
readonly onExit: IEvent<{ exitCode: number; signal?: number }>;
|
||||
resize(columns: number, rows: number): void;
|
||||
on(event: "data", listener: (data: string) => void): void;
|
||||
on(event: "exit", listener: (exitCode: number, signal?: number) => void): void;
|
||||
clear(): void;
|
||||
write(data: string): void;
|
||||
kill(signal?: string): void;
|
||||
pause(): void;
|
||||
resume(): void;
|
||||
}
|
||||
|
||||
/**
|
||||
* Forks a process as a pseudoterminal.
|
||||
*/
|
||||
export function spawn(
|
||||
file: string,
|
||||
args: string[] | string,
|
||||
options: IPtyForkOptions | IWindowsPtyForkOptions,
|
||||
): IPty;
|
||||
}
|
||||
@@ -6,7 +6,10 @@
|
||||
"moduleResolution": "bundler",
|
||||
"module": "ESNext",
|
||||
"noEmit": true,
|
||||
"types": ["vitest/globals", "@testing-library/jest-dom", "node", "vite/client"]
|
||||
"types": ["vitest/globals", "@testing-library/jest-dom", "node", "vite/client"],
|
||||
"paths": {
|
||||
"node-pty": ["./src/types/node-pty/index.d.ts"]
|
||||
}
|
||||
},
|
||||
"include": ["app/**/*"],
|
||||
"exclude": ["app/**/*.test.ts", "app/**/*.test.tsx", "app/**/__tests__/**/*"]
|
||||
|
||||
@@ -6,7 +6,8 @@
|
||||
"jsx": "react-jsx",
|
||||
"types": ["node", "vitest/globals", "@testing-library/jest-dom"],
|
||||
"paths": {
|
||||
"@fusion/test-utils": ["../core/src/__test-utils__/workspace.ts"]
|
||||
"@fusion/test-utils": ["../core/src/__test-utils__/workspace.ts"],
|
||||
"node-pty": ["./src/types/node-pty/index.d.ts"]
|
||||
}
|
||||
},
|
||||
"include": ["src/**/*"],
|
||||
|
||||
151
pnpm-lock.yaml
generated
151
pnpm-lock.yaml
generated
@@ -209,8 +209,8 @@ importers:
|
||||
specifier: ^2.1.1
|
||||
version: 2.1.1
|
||||
node-pty:
|
||||
specifier: ^1.1.0-beta22
|
||||
version: 1.1.0
|
||||
specifier: npm:@homebridge/node-pty-prebuilt-multiarch@^0.13.1
|
||||
version: '@homebridge/node-pty-prebuilt-multiarch@0.13.1'
|
||||
react:
|
||||
specifier: ^19.0.0
|
||||
version: 19.2.4
|
||||
@@ -1567,6 +1567,10 @@ packages:
|
||||
'@modelcontextprotocol/sdk':
|
||||
optional: true
|
||||
|
||||
'@homebridge/node-pty-prebuilt-multiarch@0.13.1':
|
||||
resolution: {integrity: sha512-ccQ60nMcbEGrQh0U9E6x0ajW9qJNeazpcM/9CH6J8leyNtJgb+gu24WTBAfBUVeO486ZhscnaxLEITI2HXwhow==}
|
||||
engines: {node: '>=18.0.0 <25.0.0'}
|
||||
|
||||
'@hono/node-server@1.19.12':
|
||||
resolution: {integrity: sha512-txsUW4SQ1iilgE0l9/e9VQWmELXifEFvmdA1j6WFh/aFPj99hIntrSsq/if0UWyGVkmrRPKA1wCeP+UCr1B9Uw==}
|
||||
engines: {node: '>=18.14.1'}
|
||||
@@ -3202,6 +3206,9 @@ packages:
|
||||
resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==}
|
||||
engines: {node: '>= 14.16.0'}
|
||||
|
||||
chownr@1.1.4:
|
||||
resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==}
|
||||
|
||||
chownr@3.0.0:
|
||||
resolution: {integrity: sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==}
|
||||
engines: {node: '>=18'}
|
||||
@@ -3431,6 +3438,10 @@ packages:
|
||||
resolution: {integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==}
|
||||
engines: {node: '>=6'}
|
||||
|
||||
deep-extend@0.6.0:
|
||||
resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==}
|
||||
engines: {node: '>=4.0.0'}
|
||||
|
||||
deep-is@0.1.4:
|
||||
resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==}
|
||||
|
||||
@@ -3750,6 +3761,10 @@ packages:
|
||||
resolution: {integrity: sha512-CRT1WTyuQoD771GW56XEZFQ/ZoSfWid1alKGDYMmkt2yl8UXrVR4pspqWNEcqKvVIzg6PAltWjxcSSPrboA4iA==}
|
||||
engines: {node: '>=18.0.0'}
|
||||
|
||||
expand-template@2.0.3:
|
||||
resolution: {integrity: sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==}
|
||||
engines: {node: '>=6'}
|
||||
|
||||
expect-type@1.3.0:
|
||||
resolution: {integrity: sha512-knvyeauYhqjOYvQ66MznSMs83wmHrCycNEN6Ao+2AeYEfxUIkuiVxdEa1qlGEPK+We3n0THiDciYSsCcgW/DoA==}
|
||||
engines: {node: '>=12.0.0'}
|
||||
@@ -3891,6 +3906,9 @@ packages:
|
||||
resolution: {integrity: sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==}
|
||||
engines: {node: '>= 0.8'}
|
||||
|
||||
fs-constants@1.0.0:
|
||||
resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==}
|
||||
|
||||
fs-extra@10.1.0:
|
||||
resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==}
|
||||
engines: {node: '>=12'}
|
||||
@@ -3965,6 +3983,9 @@ packages:
|
||||
resolution: {integrity: sha512-b1O07XYq8eRuVzBNgJLstU6FYc1tS6wnMtF1I1D9lE8LxZSOGZ7LhxN54yPP6mGw5f2CkXY2BQUL9Fx41qvcIg==}
|
||||
engines: {node: '>= 14'}
|
||||
|
||||
github-from-package@0.0.0:
|
||||
resolution: {integrity: sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==}
|
||||
|
||||
glob-parent@5.1.2:
|
||||
resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==}
|
||||
engines: {node: '>= 6'}
|
||||
@@ -4141,6 +4162,9 @@ packages:
|
||||
inherits@2.0.4:
|
||||
resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==}
|
||||
|
||||
ini@1.3.8:
|
||||
resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==}
|
||||
|
||||
ini@4.1.3:
|
||||
resolution: {integrity: sha512-X7rqawQBvfdjS10YU1y1YVreA3SsLrW9dX2CewP2EbBJM4ypVNLDkO5y04gejPwKIY9lR+7r9gn3rFPt/kmWFg==}
|
||||
engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0}
|
||||
@@ -4784,6 +4808,9 @@ packages:
|
||||
resolution: {integrity: sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==}
|
||||
engines: {node: '>= 18'}
|
||||
|
||||
mkdirp-classic@0.5.3:
|
||||
resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==}
|
||||
|
||||
mkdirp@0.5.6:
|
||||
resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==}
|
||||
hasBin: true
|
||||
@@ -4814,6 +4841,9 @@ packages:
|
||||
engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
|
||||
hasBin: true
|
||||
|
||||
napi-build-utils@2.0.0:
|
||||
resolution: {integrity: sha512-GEbrYkbfF7MoNaoh2iGG84Mnf/WZfB0GdGEsM8wz7Expx/LlWf5U8t9nvJKXSp3qr5IsEbK04cBGhol/KwOsWA==}
|
||||
|
||||
native-run@2.0.3:
|
||||
resolution: {integrity: sha512-U1PllBuzW5d1gfan+88L+Hky2eZx+9gv3Pf6rNBxKbORxi7boHzqiA6QFGSnqMem4j0A9tZ08NMIs5+0m/VS1Q==}
|
||||
engines: {node: '>=16.0.0'}
|
||||
@@ -4830,6 +4860,10 @@ packages:
|
||||
resolution: {integrity: sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==}
|
||||
engines: {node: '>= 0.4.0'}
|
||||
|
||||
node-abi@3.89.0:
|
||||
resolution: {integrity: sha512-6u9UwL0HlAl21+agMN3YAMXcKByMqwGx+pq+P76vii5f7hTPtKDp08/H9py6DY+cfDw7kQNTGEj/rly3IgbNQA==}
|
||||
engines: {node: '>=10'}
|
||||
|
||||
node-abi@4.28.0:
|
||||
resolution: {integrity: sha512-Qfp5XZL1cJDOabOT8H5gnqMTmM4NjvYzHp4I/Kt/Sl76OVkOBBHRFlPspGV0hYvMoqQsypFjT/Yp7Km0beXW9g==}
|
||||
engines: {node: '>=22.12.0'}
|
||||
@@ -4857,9 +4891,6 @@ packages:
|
||||
engines: {node: ^18.17.0 || >=20.5.0}
|
||||
hasBin: true
|
||||
|
||||
node-pty@1.1.0:
|
||||
resolution: {integrity: sha512-20JqtutY6JPXTUnL0ij1uad7Qe1baT46lyolh2sSENDd4sTzKZ4nmAFkeAARDKwmlLjPx6XKRlwRUxwjOy+lUg==}
|
||||
|
||||
node-releases@2.0.36:
|
||||
resolution: {integrity: sha512-TdC8FSgHz8Mwtw9g5L4gR/Sh9XhSP/0DEkQxfEFXOpiul5IiHgHan2VhYYb6agDSfp4KuvltmGApc8HMgUrIkA==}
|
||||
|
||||
@@ -5116,6 +5147,12 @@ packages:
|
||||
engines: {node: '>=14.0.0'}
|
||||
hasBin: true
|
||||
|
||||
prebuild-install@7.1.3:
|
||||
resolution: {integrity: sha512-8Mf2cbV7x1cXPUILADGI3wuhfqWvtiLA1iclTDbFRZkgRQS0NqsPZphna9V+HyTEadheuPmjaJMsbzKQFOzLug==}
|
||||
engines: {node: '>=10'}
|
||||
deprecated: No longer maintained. Please contact the author of the relevant native addon; alternatives are available.
|
||||
hasBin: true
|
||||
|
||||
prelude-ls@1.2.1:
|
||||
resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==}
|
||||
engines: {node: '>= 0.8.0'}
|
||||
@@ -5202,6 +5239,10 @@ packages:
|
||||
resolution: {integrity: sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA==}
|
||||
engines: {node: '>= 0.10'}
|
||||
|
||||
rc@1.2.8:
|
||||
resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==}
|
||||
hasBin: true
|
||||
|
||||
react-dom@19.2.4:
|
||||
resolution: {integrity: sha512-AXJdLo8kgMbimY95O2aKQqsz2iWi9jMgKJhRBAxECE4IFxfcazB2LmzloIoibJI3C12IlY20+KFaLv+71bUJeQ==}
|
||||
peerDependencies:
|
||||
@@ -5450,6 +5491,12 @@ packages:
|
||||
resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==}
|
||||
engines: {node: '>=14'}
|
||||
|
||||
simple-concat@1.0.1:
|
||||
resolution: {integrity: sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==}
|
||||
|
||||
simple-get@4.0.1:
|
||||
resolution: {integrity: sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==}
|
||||
|
||||
simple-swizzle@0.2.4:
|
||||
resolution: {integrity: sha512-nAu1WFPQSMNr2Zn9PGSZK9AGn4t/y97lEm+MXTtUDwfP0ksAIX4nO+6ruD9Jwut4C49SB1Ws+fbXsm/yScWOHw==}
|
||||
|
||||
@@ -5592,6 +5639,10 @@ packages:
|
||||
resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==}
|
||||
engines: {node: '>=8'}
|
||||
|
||||
strip-json-comments@2.0.1:
|
||||
resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==}
|
||||
engines: {node: '>=0.10.0'}
|
||||
|
||||
strip-json-comments@3.1.1:
|
||||
resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==}
|
||||
engines: {node: '>=8'}
|
||||
@@ -5638,6 +5689,13 @@ packages:
|
||||
resolution: {integrity: sha512-yEFYrVhod+hdNyx7g5Bnkkb0G6si8HJurOoOEgC8B/O0uXLHlaey/65KRv6cuWBNhBgHKAROVpc7QyYqE5gFng==}
|
||||
engines: {node: '>=20'}
|
||||
|
||||
tar-fs@2.1.4:
|
||||
resolution: {integrity: sha512-mDAjwmZdh7LTT6pNleZ05Yt65HC3E+NiQzl672vQG38jIrehtJk/J3mNwIg+vShQPcLF/LV7CMnDW6vjj6sfYQ==}
|
||||
|
||||
tar-stream@2.2.0:
|
||||
resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==}
|
||||
engines: {node: '>=6'}
|
||||
|
||||
tar-stream@3.1.8:
|
||||
resolution: {integrity: sha512-U6QpVRyCGHva435KoNWy9PRoi2IFYCgtEhq9nmrPPpbRacPs9IH4aJ3gbrFC8dPcXvdSZ4XXfXT5Fshbp2MtlQ==}
|
||||
|
||||
@@ -5797,6 +5855,9 @@ packages:
|
||||
engines: {node: '>=18.0.0'}
|
||||
hasBin: true
|
||||
|
||||
tunnel-agent@0.6.0:
|
||||
resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==}
|
||||
|
||||
type-check@0.4.0:
|
||||
resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==}
|
||||
engines: {node: '>= 0.8.0'}
|
||||
@@ -7776,6 +7837,11 @@ snapshots:
|
||||
- supports-color
|
||||
- utf-8-validate
|
||||
|
||||
'@homebridge/node-pty-prebuilt-multiarch@0.13.1':
|
||||
dependencies:
|
||||
node-addon-api: 7.1.1
|
||||
prebuild-install: 7.1.3
|
||||
|
||||
'@hono/node-server@1.19.12(hono@4.12.9)':
|
||||
dependencies:
|
||||
hono: 4.12.9
|
||||
@@ -9941,6 +10007,8 @@ snapshots:
|
||||
dependencies:
|
||||
readdirp: 4.1.2
|
||||
|
||||
chownr@1.1.4: {}
|
||||
|
||||
chownr@3.0.0: {}
|
||||
|
||||
chromium-pickle-js@0.2.0: {}
|
||||
@@ -10144,6 +10212,8 @@ snapshots:
|
||||
|
||||
deep-eql@5.0.2: {}
|
||||
|
||||
deep-extend@0.6.0: {}
|
||||
|
||||
deep-is@0.1.4: {}
|
||||
|
||||
defaults@1.0.4:
|
||||
@@ -10562,6 +10632,8 @@ snapshots:
|
||||
dependencies:
|
||||
eventsource-parser: 3.0.6
|
||||
|
||||
expand-template@2.0.3: {}
|
||||
|
||||
expect-type@1.3.0: {}
|
||||
|
||||
exponential-backoff@3.1.3: {}
|
||||
@@ -10753,6 +10825,8 @@ snapshots:
|
||||
|
||||
fresh@2.0.0: {}
|
||||
|
||||
fs-constants@1.0.0: {}
|
||||
|
||||
fs-extra@10.1.0:
|
||||
dependencies:
|
||||
graceful-fs: 4.2.11
|
||||
@@ -10851,6 +10925,8 @@ snapshots:
|
||||
transitivePeerDependencies:
|
||||
- supports-color
|
||||
|
||||
github-from-package@0.0.0: {}
|
||||
|
||||
glob-parent@5.1.2:
|
||||
dependencies:
|
||||
is-glob: 4.0.3
|
||||
@@ -11073,6 +11149,8 @@ snapshots:
|
||||
|
||||
inherits@2.0.4: {}
|
||||
|
||||
ini@1.3.8: {}
|
||||
|
||||
ini@4.1.3: {}
|
||||
|
||||
ink-spinner@5.0.0(ink@6.8.0(@types/react@19.2.14)(react@19.2.4))(react@19.2.4):
|
||||
@@ -11895,6 +11973,8 @@ snapshots:
|
||||
dependencies:
|
||||
minipass: 7.1.3
|
||||
|
||||
mkdirp-classic@0.5.3: {}
|
||||
|
||||
mkdirp@0.5.6:
|
||||
dependencies:
|
||||
minimist: 1.2.8
|
||||
@@ -11930,6 +12010,8 @@ snapshots:
|
||||
|
||||
nanoid@3.3.11: {}
|
||||
|
||||
napi-build-utils@2.0.0: {}
|
||||
|
||||
native-run@2.0.3:
|
||||
dependencies:
|
||||
'@ionic/utils-fs': 3.1.7
|
||||
@@ -11952,6 +12034,10 @@ snapshots:
|
||||
|
||||
netmask@2.0.2: {}
|
||||
|
||||
node-abi@3.89.0:
|
||||
dependencies:
|
||||
semver: 7.7.4
|
||||
|
||||
node-abi@4.28.0:
|
||||
dependencies:
|
||||
semver: 7.7.4
|
||||
@@ -11988,10 +12074,6 @@ snapshots:
|
||||
transitivePeerDependencies:
|
||||
- supports-color
|
||||
|
||||
node-pty@1.1.0:
|
||||
dependencies:
|
||||
node-addon-api: 7.1.1
|
||||
|
||||
node-releases@2.0.36: {}
|
||||
|
||||
nopt@8.1.0:
|
||||
@@ -12225,6 +12307,21 @@ snapshots:
|
||||
commander: 9.5.0
|
||||
optional: true
|
||||
|
||||
prebuild-install@7.1.3:
|
||||
dependencies:
|
||||
detect-libc: 2.1.2
|
||||
expand-template: 2.0.3
|
||||
github-from-package: 0.0.0
|
||||
minimist: 1.2.8
|
||||
mkdirp-classic: 0.5.3
|
||||
napi-build-utils: 2.0.0
|
||||
node-abi: 3.89.0
|
||||
pump: 3.0.4
|
||||
rc: 1.2.8
|
||||
simple-get: 4.0.1
|
||||
tar-fs: 2.1.4
|
||||
tunnel-agent: 0.6.0
|
||||
|
||||
prelude-ls@1.2.1: {}
|
||||
|
||||
prettier@2.8.8: {}
|
||||
@@ -12322,6 +12419,13 @@ snapshots:
|
||||
iconv-lite: 0.7.2
|
||||
unpipe: 1.0.0
|
||||
|
||||
rc@1.2.8:
|
||||
dependencies:
|
||||
deep-extend: 0.6.0
|
||||
ini: 1.3.8
|
||||
minimist: 1.2.8
|
||||
strip-json-comments: 2.0.1
|
||||
|
||||
react-dom@19.2.4(react@19.2.4):
|
||||
dependencies:
|
||||
react: 19.2.4
|
||||
@@ -12671,6 +12775,14 @@ snapshots:
|
||||
|
||||
signal-exit@4.1.0: {}
|
||||
|
||||
simple-concat@1.0.1: {}
|
||||
|
||||
simple-get@4.0.1:
|
||||
dependencies:
|
||||
decompress-response: 6.0.0
|
||||
once: 1.4.0
|
||||
simple-concat: 1.0.1
|
||||
|
||||
simple-swizzle@0.2.4:
|
||||
dependencies:
|
||||
is-arrayish: 0.3.4
|
||||
@@ -12820,6 +12932,8 @@ snapshots:
|
||||
dependencies:
|
||||
min-indent: 1.0.1
|
||||
|
||||
strip-json-comments@2.0.1: {}
|
||||
|
||||
strip-json-comments@3.1.1: {}
|
||||
|
||||
strip-literal@3.1.0:
|
||||
@@ -12868,6 +12982,21 @@ snapshots:
|
||||
|
||||
tagged-tag@1.0.0: {}
|
||||
|
||||
tar-fs@2.1.4:
|
||||
dependencies:
|
||||
chownr: 1.1.4
|
||||
mkdirp-classic: 0.5.3
|
||||
pump: 3.0.4
|
||||
tar-stream: 2.2.0
|
||||
|
||||
tar-stream@2.2.0:
|
||||
dependencies:
|
||||
bl: 4.1.0
|
||||
end-of-stream: 1.4.5
|
||||
fs-constants: 1.0.0
|
||||
inherits: 2.0.4
|
||||
readable-stream: 3.6.2
|
||||
|
||||
tar-stream@3.1.8:
|
||||
dependencies:
|
||||
b4a: 1.8.0
|
||||
@@ -13042,6 +13171,10 @@ snapshots:
|
||||
optionalDependencies:
|
||||
fsevents: 2.3.3
|
||||
|
||||
tunnel-agent@0.6.0:
|
||||
dependencies:
|
||||
safe-buffer: 5.2.1
|
||||
|
||||
type-check@0.4.0:
|
||||
dependencies:
|
||||
prelude-ls: 1.2.1
|
||||
|
||||
Reference in New Issue
Block a user