From 551c8ef1451ca47aa246d6bea553a4532e8127a6 Mon Sep 17 00:00:00 2001 From: pavel Date: Wed, 25 Feb 2026 16:45:05 +0100 Subject: [PATCH 01/44] p --- .forgejo/workflows/pipeline.yaml | 2 -- 1 file changed, 2 deletions(-) diff --git a/.forgejo/workflows/pipeline.yaml b/.forgejo/workflows/pipeline.yaml index 998698a..7dde8b9 100644 --- a/.forgejo/workflows/pipeline.yaml +++ b/.forgejo/workflows/pipeline.yaml @@ -11,8 +11,6 @@ jobs: with: node-version: 24 - uses: actions/checkout@v6 - - name: Install packaging deps (Linux + Windows cross-build) - run: sudo apt-get update && sudo apt-get install -y rpm wine64 nsis - run: npm ci - run: npm run dist:linux - run: npm run dist:win From a286eca3f049d488d3457ecafbf1cd2d71793e35 Mon Sep 17 00:00:00 2001 From: pavel Date: Wed, 25 Feb 2026 16:46:50 +0100 Subject: [PATCH 02/44] l --- package-lock.json | 1870 +++++++++++++++++++++++++++------------------ 1 file changed, 1126 insertions(+), 744 deletions(-) diff --git a/package-lock.json b/package-lock.json index 7ec9775..7efcf1c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,7 +9,7 @@ "version": "0.1.0", "devDependencies": { "electron": "^34.5.8", - "electron-builder": "^26.8.1" + "electron-builder": "^25.1.8" } }, "node_modules/@develar/schema-utils": { @@ -79,60 +79,6 @@ "node": "*" } }, - "node_modules/@electron/fuses": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/@electron/fuses/-/fuses-1.8.0.tgz", - "integrity": "sha512-zx0EIq78WlY/lBb1uXlziZmDZI4ubcCXIMJ4uGjXzZW0nS19TjSPeXPAjzzTmKQlJUZm0SbmZhPKP7tuQ1SsEw==", - "dev": true, - "license": "MIT", - "dependencies": { - "chalk": "^4.1.1", - "fs-extra": "^9.0.1", - "minimist": "^1.2.5" - }, - "bin": { - "electron-fuses": "dist/bin.js" - } - }, - "node_modules/@electron/fuses/node_modules/fs-extra": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "at-least-node": "^1.0.0", - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@electron/fuses/node_modules/jsonfile": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz", - "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", - "dev": true, - "license": "MIT", - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/@electron/fuses/node_modules/universalify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 10.0.0" - } - }, "node_modules/@electron/get": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/@electron/get/-/get-2.0.3.tgz", @@ -210,9 +156,9 @@ } }, "node_modules/@electron/osx-sign": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/@electron/osx-sign/-/osx-sign-1.3.3.tgz", - "integrity": "sha512-KZ8mhXvWv2rIEgMbWZ4y33bDHyUKMXnx4M0sTyPNK/vcB81ImdeY9Ggdqy0SWbMDgmbqyQ+phgejh6V3R2QuSg==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@electron/osx-sign/-/osx-sign-1.3.1.tgz", + "integrity": "sha512-BAfviURMHpmb1Yb50YbCxnOY0wfwaLXH5KJ4+80zS0gUkzDX3ec23naTlEqKsN+PwYn+a1cCzM7BJ4Wcd3sGzw==", "dev": true, "license": "BSD-2-Clause", "dependencies": { @@ -283,31 +229,60 @@ } }, "node_modules/@electron/rebuild": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/@electron/rebuild/-/rebuild-4.0.3.tgz", - "integrity": "sha512-u9vpTHRMkOYCs/1FLiSVAFZ7FbjsXK+bQuzviJZa+lG7BHZl1nz52/IcGvwa3sk80/fc3llutBkbCq10Vh8WQA==", + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/@electron/rebuild/-/rebuild-3.6.1.tgz", + "integrity": "sha512-f6596ZHpEq/YskUd8emYvOUne89ij8mQgjYFA5ru25QwbrRO+t1SImofdDv7kKOuWCmVOuU5tvfkbgGxIl3E/w==", "dev": true, "license": "MIT", "dependencies": { "@malept/cross-spawn-promise": "^2.0.0", + "chalk": "^4.0.0", "debug": "^4.1.1", "detect-libc": "^2.0.1", + "fs-extra": "^10.0.0", "got": "^11.7.0", - "graceful-fs": "^4.2.11", - "node-abi": "^4.2.0", - "node-api-version": "^0.2.1", - "node-gyp": "^11.2.0", + "node-abi": "^3.45.0", + "node-api-version": "^0.2.0", + "node-gyp": "^9.0.0", "ora": "^5.1.0", "read-binary-file-arch": "^1.0.6", "semver": "^7.3.5", - "tar": "^7.5.6", + "tar": "^6.0.5", "yargs": "^17.0.1" }, "bin": { "electron-rebuild": "lib/cli.js" }, "engines": { - "node": ">=22.12.0" + "node": ">=12.13.0" + } + }, + "node_modules/@electron/rebuild/node_modules/fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@electron/rebuild/node_modules/jsonfile": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz", + "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", + "dev": true, + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" } }, "node_modules/@electron/rebuild/node_modules/semver": { @@ -323,14 +298,24 @@ "node": ">=10" } }, + "node_modules/@electron/rebuild/node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, "node_modules/@electron/universal": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@electron/universal/-/universal-2.0.3.tgz", - "integrity": "sha512-Wn9sPYIVFRFl5HmwMJkARCCf7rqK/EurkfQ/rJZ14mHP3iYTjZSIOSVonEAnhWeAXwtw7zOekGRlc6yTtZ0t+g==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@electron/universal/-/universal-2.0.1.tgz", + "integrity": "sha512-fKpv9kg4SPmt+hY7SVBnIYULE9QJl8L3sCfcBsnqbJwwBwAeTLokJ9TRt9y7bK0JAzIW2y78TVVjvnQEms/yyA==", "dev": true, "license": "MIT", "dependencies": { - "@electron/asar": "^3.3.1", + "@electron/asar": "^3.2.7", "@malept/cross-spawn-promise": "^2.0.0", "debug": "^4.3.1", "dir-compare": "^4.2.0", @@ -396,71 +381,12 @@ "node": ">= 10.0.0" } }, - "node_modules/@electron/windows-sign": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@electron/windows-sign/-/windows-sign-1.2.2.tgz", - "integrity": "sha512-dfZeox66AvdPtb2lD8OsIIQh12Tp0GNCRUDfBHIKGpbmopZto2/A8nSpYYLoedPIHpqkeblZ/k8OV0Gy7PYuyQ==", + "node_modules/@gar/promisify": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@gar/promisify/-/promisify-1.1.3.tgz", + "integrity": "sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==", "dev": true, - "license": "BSD-2-Clause", - "optional": true, - "peer": true, - "dependencies": { - "cross-dirname": "^0.1.0", - "debug": "^4.3.4", - "fs-extra": "^11.1.1", - "minimist": "^1.2.8", - "postject": "^1.0.0-alpha.6" - }, - "bin": { - "electron-windows-sign": "bin/electron-windows-sign.js" - }, - "engines": { - "node": ">=14.14" - } - }, - "node_modules/@electron/windows-sign/node_modules/fs-extra": { - "version": "11.3.3", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.3.tgz", - "integrity": "sha512-VWSRii4t0AFm6ixFFmLLx1t7wS1gh+ckoa84aOeapGum0h+EZd1EhEumSB+ZdDLnEPuucsVB9oB7cxJHap6Afg==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=14.14" - } - }, - "node_modules/@electron/windows-sign/node_modules/jsonfile": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz", - "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/@electron/windows-sign/node_modules/universalify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "engines": { - "node": ">= 10.0.0" - } + "license": "MIT" }, "node_modules/@isaacs/cliui": { "version": "8.0.2", @@ -565,19 +491,6 @@ "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/@isaacs/fs-minipass": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@isaacs/fs-minipass/-/fs-minipass-4.0.1.tgz", - "integrity": "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==", - "dev": true, - "license": "ISC", - "dependencies": { - "minipass": "^7.0.4" - }, - "engines": { - "node": ">=18.0.0" - } - }, "node_modules/@malept/cross-spawn-promise": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/@malept/cross-spawn-promise/-/cross-spawn-promise-2.0.0.tgz", @@ -656,41 +569,18 @@ "node": ">= 10.0.0" } }, - "node_modules/@npmcli/agent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@npmcli/agent/-/agent-3.0.0.tgz", - "integrity": "sha512-S79NdEgDQd/NGCay6TCoVzXSj74skRZIKJcpJjC5lOq34SZzyI6MqtiiWoiVWoVrTcGjNeC4ipbh1VIHlpfF5Q==", - "dev": true, - "license": "ISC", - "dependencies": { - "agent-base": "^7.1.0", - "http-proxy-agent": "^7.0.0", - "https-proxy-agent": "^7.0.1", - "lru-cache": "^10.0.1", - "socks-proxy-agent": "^8.0.3" - }, - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/@npmcli/agent/node_modules/lru-cache": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", - "dev": true, - "license": "ISC" - }, "node_modules/@npmcli/fs": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-4.0.0.tgz", - "integrity": "sha512-/xGlezI6xfGO9NwuJlnwz/K14qD1kCSAGtacBHnGzeAIuJGazcp45KP5NuyARXoKb7cwulAGWVsbeSxdG/cb0Q==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-2.1.2.tgz", + "integrity": "sha512-yOJKRvohFOaLqipNtwYB9WugyZKhC/DZC4VYPmpaCzDBrA8YpK3qHZ8/HGscMnE4GqbkLNuVcCnxkeQEdGt6LQ==", "dev": true, "license": "ISC", "dependencies": { + "@gar/promisify": "^1.1.3", "semver": "^7.3.5" }, "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, "node_modules/@npmcli/fs/node_modules/semver": { @@ -706,6 +596,21 @@ "node": ">=10" } }, + "node_modules/@npmcli/move-file": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-2.0.1.tgz", + "integrity": "sha512-mJd2Z5TjYWq/ttPLLGqArdtnC74J6bOzg4rMDnN+p1xTacZ2yPRCk2y0oSWQtygLR9YVQXgOcONrwtnk3JupxQ==", + "deprecated": "This functionality has been moved to @npmcli/fs", + "dev": true, + "license": "MIT", + "dependencies": { + "mkdirp": "^1.0.4", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, "node_modules/@pkgjs/parseargs": { "version": "0.11.0", "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", @@ -743,6 +648,16 @@ "node": ">=10" } }, + "node_modules/@tootallnate/once": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", + "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, "node_modules/@types/cacheable-request": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.3.tgz", @@ -869,14 +784,11 @@ "license": "MIT" }, "node_modules/abbrev": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-3.0.1.tgz", - "integrity": "sha512-AO2ac6pjRB3SJmGJo+v5/aK6Omggp6fsLrs6wN9bd35ulu4cCwaAU9+7ZhXjeqHVkaHThLuzH0nZr0YpCDhygg==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", "dev": true, - "license": "ISC", - "engines": { - "node": "^18.17.0 || >=20.5.0" - } + "license": "ISC" }, "node_modules/agent-base": { "version": "7.1.4", @@ -888,6 +800,33 @@ "node": ">= 14" } }, + "node_modules/agentkeepalive": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.6.0.tgz", + "integrity": "sha512-kja8j7PjmncONqaTsB8fQ+wE2mSU2DJ9D4XKoJ5PFWIdRMa6SLSN1ff4mOr4jCbfRSsxR4keIiySJU0N9T5hIQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "humanize-ms": "^1.2.1" + }, + "engines": { + "node": ">= 8.0.0" + } + }, + "node_modules/aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "dev": true, + "license": "MIT", + "dependencies": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/ajv": { "version": "6.14.0", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.14.0.tgz", @@ -942,125 +881,58 @@ } }, "node_modules/app-builder-bin": { - "version": "5.0.0-alpha.12", - "resolved": "https://registry.npmjs.org/app-builder-bin/-/app-builder-bin-5.0.0-alpha.12.tgz", - "integrity": "sha512-j87o0j6LqPL3QRr8yid6c+Tt5gC7xNfYo6uQIQkorAC6MpeayVMZrEDzKmJJ/Hlv7EnOQpaRm53k6ktDYZyB6w==", + "version": "5.0.0-alpha.10", + "resolved": "https://registry.npmjs.org/app-builder-bin/-/app-builder-bin-5.0.0-alpha.10.tgz", + "integrity": "sha512-Ev4jj3D7Bo+O0GPD2NMvJl+PGiBAfS7pUGawntBNpCbxtpncfUixqFj9z9Jme7V7s3LBGqsWZZP54fxBX3JKJw==", "dev": true, "license": "MIT" }, "node_modules/app-builder-lib": { - "version": "26.8.1", - "resolved": "https://registry.npmjs.org/app-builder-lib/-/app-builder-lib-26.8.1.tgz", - "integrity": "sha512-p0Im/Dx5C4tmz8QEE1Yn4MkuPC8PrnlRneMhWJj7BBXQfNTJUshM/bp3lusdEsDbvvfJZpXWnYesgSLvwtM2Zw==", + "version": "25.1.8", + "resolved": "https://registry.npmjs.org/app-builder-lib/-/app-builder-lib-25.1.8.tgz", + "integrity": "sha512-pCqe7dfsQFBABC1jeKZXQWhGcCPF3rPCXDdfqVKjIeWBcXzyC1iOWZdfFhGl+S9MyE/k//DFmC6FzuGAUudNDg==", "dev": true, "license": "MIT", "dependencies": { "@develar/schema-utils": "~2.6.5", - "@electron/asar": "3.4.1", - "@electron/fuses": "^1.8.0", - "@electron/get": "^3.0.0", "@electron/notarize": "2.5.0", - "@electron/osx-sign": "1.3.3", - "@electron/rebuild": "^4.0.3", - "@electron/universal": "2.0.3", + "@electron/osx-sign": "1.3.1", + "@electron/rebuild": "3.6.1", + "@electron/universal": "2.0.1", "@malept/flatpak-bundler": "^0.4.0", "@types/fs-extra": "9.0.13", "async-exit-hook": "^2.0.1", - "builder-util": "26.8.1", - "builder-util-runtime": "9.5.1", + "bluebird-lst": "^1.0.9", + "builder-util": "25.1.7", + "builder-util-runtime": "9.2.10", "chromium-pickle-js": "^0.2.0", - "ci-info": "4.3.1", + "config-file-ts": "0.2.8-rc1", "debug": "^4.3.4", "dotenv": "^16.4.5", "dotenv-expand": "^11.0.6", "ejs": "^3.1.8", - "electron-publish": "26.8.1", + "electron-publish": "25.1.7", + "form-data": "^4.0.0", "fs-extra": "^10.1.0", "hosted-git-info": "^4.1.0", + "is-ci": "^3.0.0", "isbinaryfile": "^5.0.0", - "jiti": "^2.4.2", "js-yaml": "^4.1.0", "json5": "^2.2.3", "lazy-val": "^1.0.5", - "minimatch": "^10.0.3", - "plist": "3.1.0", - "proper-lockfile": "^4.1.2", + "minimatch": "^10.0.0", "resedit": "^1.7.0", - "semver": "~7.7.3", - "tar": "^7.5.7", - "temp-file": "^3.4.0", - "tiny-async-pool": "1.3.0", - "which": "^5.0.0" + "sanitize-filename": "^1.6.3", + "semver": "^7.3.8", + "tar": "^6.1.12", + "temp-file": "^3.4.0" }, "engines": { "node": ">=14.0.0" }, "peerDependencies": { - "dmg-builder": "26.8.1", - "electron-builder-squirrel-windows": "26.8.1" - } - }, - "node_modules/app-builder-lib/node_modules/@electron/get": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@electron/get/-/get-3.1.0.tgz", - "integrity": "sha512-F+nKc0xW+kVbBRhFzaMgPy3KwmuNTYX1fx6+FxxoSnNgwYX6LD7AKBTWkU0MQ6IBoe7dz069CNkR673sPAgkCQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "^4.1.1", - "env-paths": "^2.2.0", - "fs-extra": "^8.1.0", - "got": "^11.8.5", - "progress": "^2.0.3", - "semver": "^6.2.0", - "sumchecker": "^3.0.1" - }, - "engines": { - "node": ">=14" - }, - "optionalDependencies": { - "global-agent": "^3.0.0" - } - }, - "node_modules/app-builder-lib/node_modules/@electron/get/node_modules/fs-extra": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", - "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", - "dev": true, - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - }, - "engines": { - "node": ">=6 <7 || >=8" - } - }, - "node_modules/app-builder-lib/node_modules/@electron/get/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/app-builder-lib/node_modules/ci-info": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.3.1.tgz", - "integrity": "sha512-Wdy2Igu8OcBpI2pZePZ5oWjPC38tmDVx5WKUXKwlLYkA0ozo85sLsLvkBbBn/sZaSCMFOGZJ14fvW9t5/d7kdA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/sibiraj-s" - } - ], - "license": "MIT", - "engines": { - "node": ">=8" + "dmg-builder": "25.1.8", + "electron-builder-squirrel-windows": "25.1.8" } }, "node_modules/app-builder-lib/node_modules/fs-extra": { @@ -1078,7 +950,7 @@ "node": ">=12" } }, - "node_modules/app-builder-lib/node_modules/fs-extra/node_modules/jsonfile": { + "node_modules/app-builder-lib/node_modules/jsonfile": { "version": "6.2.0", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz", "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", @@ -1091,16 +963,6 @@ "graceful-fs": "^4.1.6" } }, - "node_modules/app-builder-lib/node_modules/fs-extra/node_modules/universalify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 10.0.0" - } - }, "node_modules/app-builder-lib/node_modules/semver": { "version": "7.7.4", "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", @@ -1114,6 +976,117 @@ "node": ">=10" } }, + "node_modules/app-builder-lib/node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/aproba": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.1.0.tgz", + "integrity": "sha512-tLIEcj5GuR2RSTnxNKdkK0dJ/GrC7P38sUkiDmDuHfsHmbagTFAxDVIBltoklXEVIQ/f14IL8IMJ5pn9Hez1Ew==", + "dev": true, + "license": "ISC" + }, + "node_modules/archiver": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/archiver/-/archiver-5.3.2.tgz", + "integrity": "sha512-+25nxyyznAXF7Nef3y0EbBeqmGZgeN/BxHX29Rs39djAfaFalmQ89SE6CWyDCHzGL0yt/ycBtNOmGTW0FyGWNw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "archiver-utils": "^2.1.0", + "async": "^3.2.4", + "buffer-crc32": "^0.2.1", + "readable-stream": "^3.6.0", + "readdir-glob": "^1.1.2", + "tar-stream": "^2.2.0", + "zip-stream": "^4.1.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/archiver-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-2.1.0.tgz", + "integrity": "sha512-bEL/yUb/fNNiNTuUz979Z0Yg5L+LzLxGJz8x79lYmR54fmTIb6ob/hNQgkQnIUDWIFjZVQwl9Xs356I6BAMHfw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "glob": "^7.1.4", + "graceful-fs": "^4.2.0", + "lazystream": "^1.0.0", + "lodash.defaults": "^4.2.0", + "lodash.difference": "^4.5.0", + "lodash.flatten": "^4.4.0", + "lodash.isplainobject": "^4.0.6", + "lodash.union": "^4.6.0", + "normalize-path": "^3.0.0", + "readable-stream": "^2.0.0" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/archiver-utils/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "license": "MIT", + "peer": true, + "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" + } + }, + "node_modules/archiver-utils/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/archiver-utils/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/are-we-there-yet": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-3.0.1.tgz", + "integrity": "sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg==", + "deprecated": "This package is no longer supported.", + "dev": true, + "license": "ISC", + "dependencies": { + "delegates": "^1.0.0", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, "node_modules/argparse": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", @@ -1220,6 +1193,23 @@ "readable-stream": "^3.4.0" } }, + "node_modules/bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", + "dev": true, + "license": "MIT" + }, + "node_modules/bluebird-lst": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/bluebird-lst/-/bluebird-lst-1.0.9.tgz", + "integrity": "sha512-7B1Rtx82hjnSD4PGLAjVWeYH3tHAcVUmChh85a3lltKQm6FresXh9ErQo6oAv6CqxttczC3/kEg8SY5NluPuUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "bluebird": "^3.5.5" + } + }, "node_modules/boolean": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/boolean/-/boolean-3.2.0.tgz", @@ -1285,34 +1275,34 @@ "license": "MIT" }, "node_modules/builder-util": { - "version": "26.8.1", - "resolved": "https://registry.npmjs.org/builder-util/-/builder-util-26.8.1.tgz", - "integrity": "sha512-pm1lTYbGyc90DHgCDO7eo8Rl4EqKLciayNbZqGziqnH9jrlKe8ZANGdityLZU+pJh16dfzjAx2xQq9McuIPEtw==", + "version": "25.1.7", + "resolved": "https://registry.npmjs.org/builder-util/-/builder-util-25.1.7.tgz", + "integrity": "sha512-7jPjzBwEGRbwNcep0gGNpLXG9P94VA3CPAZQCzxkFXiV2GMQKlziMbY//rXPI7WKfhsvGgFXjTcXdBEwgXw9ww==", "dev": true, "license": "MIT", "dependencies": { "@types/debug": "^4.1.6", "7zip-bin": "~5.2.0", - "app-builder-bin": "5.0.0-alpha.12", - "builder-util-runtime": "9.5.1", + "app-builder-bin": "5.0.0-alpha.10", + "bluebird-lst": "^1.0.9", + "builder-util-runtime": "9.2.10", "chalk": "^4.1.2", - "cross-spawn": "^7.0.6", + "cross-spawn": "^7.0.3", "debug": "^4.3.4", "fs-extra": "^10.1.0", "http-proxy-agent": "^7.0.0", "https-proxy-agent": "^7.0.0", + "is-ci": "^3.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" + "temp-file": "^3.4.0" } }, "node_modules/builder-util-runtime": { - "version": "9.5.1", - "resolved": "https://registry.npmjs.org/builder-util-runtime/-/builder-util-runtime-9.5.1.tgz", - "integrity": "sha512-qt41tMfgHTllhResqM5DcnHyDIWNgzHvuY2jDcYP9iaGpkWxTUzV6GQjDeLnlR1/DtdlcsWQbA7sByMpmJFTLQ==", + "version": "9.2.10", + "resolved": "https://registry.npmjs.org/builder-util-runtime/-/builder-util-runtime-9.2.10.tgz", + "integrity": "sha512-6p/gfG1RJSQeIbz8TK5aPNkoztgY1q5TgmGFMAXcY8itsGW6Y2ld1ALsZ5UJn8rog7hKF3zHx5iQbNQ8uLcRlw==", "dev": true, "license": "MIT", "dependencies": { @@ -1362,72 +1352,94 @@ } }, "node_modules/cacache": { - "version": "19.0.1", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-19.0.1.tgz", - "integrity": "sha512-hdsUxulXCi5STId78vRVYEtDAjq99ICAUktLTeTYsLoTE6Z8dS0c8pWNCxwdrk9YfJeobDZc2Y186hD/5ZQgFQ==", + "version": "16.1.3", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-16.1.3.tgz", + "integrity": "sha512-/+Emcj9DAXxX4cwlLmRI9c166RuL3w30zp4R7Joiv2cQTtTtA+jeuCAjH3ZlGnYS3tKENSrKhAzVVP9GVyzeYQ==", "dev": true, "license": "ISC", "dependencies": { - "@npmcli/fs": "^4.0.0", - "fs-minipass": "^3.0.0", - "glob": "^10.2.2", - "lru-cache": "^10.0.1", - "minipass": "^7.0.3", - "minipass-collect": "^2.0.1", + "@npmcli/fs": "^2.1.0", + "@npmcli/move-file": "^2.0.0", + "chownr": "^2.0.0", + "fs-minipass": "^2.1.0", + "glob": "^8.0.1", + "infer-owner": "^1.0.4", + "lru-cache": "^7.7.1", + "minipass": "^3.1.6", + "minipass-collect": "^1.0.2", "minipass-flush": "^1.0.5", "minipass-pipeline": "^1.2.4", - "p-map": "^7.0.2", - "ssri": "^12.0.0", - "tar": "^7.4.3", - "unique-filename": "^4.0.0" + "mkdirp": "^1.0.4", + "p-map": "^4.0.0", + "promise-inflight": "^1.0.1", + "rimraf": "^3.0.2", + "ssri": "^9.0.0", + "tar": "^6.1.11", + "unique-filename": "^2.0.0" }, "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/cacache/node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/cacache/node_modules/brace-expansion": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" } }, "node_modules/cacache/node_modules/glob": { - "version": "10.5.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz", - "integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", + "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", "dev": true, "license": "ISC", "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^3.1.2", - "minimatch": "^9.0.4", - "minipass": "^7.1.2", - "package-json-from-dist": "^1.0.0", - "path-scurry": "^1.11.1" + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" }, - "bin": { - "glob": "dist/esm/bin.mjs" + "engines": { + "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, "node_modules/cacache/node_modules/lru-cache": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", "dev": true, - "license": "ISC" + "license": "ISC", + "engines": { + "node": ">=12" + } }, "node_modules/cacache/node_modules/minimatch": { - "version": "9.0.7", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.7.tgz", - "integrity": "sha512-MOwgjc8tfrpn5QQEvjijjmDVtMw2oL88ugTevzxQnzRLm6l3fVEF2gzU0kYeYYKD8C66+IdGX6peJ4MyUlUnPg==", + "version": "5.1.8", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.8.tgz", + "integrity": "sha512-7RN35vit8DeBclkofOVmBY0eDAZZQd1HzmukRdSyz95CRh8FT54eqnbj0krQr3mrHR6sfRyYkyhwBWjoV5uqlQ==", "dev": true, "license": "ISC", "dependencies": { - "brace-expansion": "^5.0.2" + "brace-expansion": "^2.0.1" }, "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "node": ">=10" } }, "node_modules/cacheable-lookup": { @@ -1491,13 +1503,13 @@ } }, "node_modules/chownr": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz", - "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", "dev": true, - "license": "BlueOak-1.0.0", + "license": "ISC", "engines": { - "node": ">=18" + "node": ">=10" } }, "node_modules/chromium-pickle-js": { @@ -1508,9 +1520,9 @@ "license": "MIT" }, "node_modules/ci-info": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.4.0.tgz", - "integrity": "sha512-77PSwercCZU2Fc4sX94eF8k8Pxte6JAwL4/ICZLFjJLqegs7kCuAsqqj/70NQF6TvDpgFjkubQB2FW2ZZddvQg==", + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", + "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", "dev": true, "funding": [ { @@ -1523,6 +1535,16 @@ "node": ">=8" } }, + "node_modules/clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/cli-cursor": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", @@ -1625,6 +1647,16 @@ "dev": true, "license": "MIT" }, + "node_modules/color-support": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", + "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", + "dev": true, + "license": "ISC", + "bin": { + "color-support": "bin.js" + } + }, "node_modules/combined-stream": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", @@ -1658,6 +1690,23 @@ "node": ">=0.10.0" } }, + "node_modules/compress-commons": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-4.1.2.tgz", + "integrity": "sha512-D3uMHtGc/fcO1Gt1/L7i1e33VOvD4A9hfQLP+6ewd+BvG/gQ84Yh4oftEhAdjSMgBgwGL+jsppT7JYNpo6MHHg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "buffer-crc32": "^0.2.13", + "crc32-stream": "^4.0.2", + "normalize-path": "^3.0.0", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">= 10" + } + }, "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", @@ -1665,13 +1714,78 @@ "dev": true, "license": "MIT" }, + "node_modules/config-file-ts": { + "version": "0.2.8-rc1", + "resolved": "https://registry.npmjs.org/config-file-ts/-/config-file-ts-0.2.8-rc1.tgz", + "integrity": "sha512-GtNECbVI82bT4RiDIzBSVuTKoSHufnU7Ce7/42bkWZJZFLjmDF2WBpVsvRkhKCfKBnTBb3qZrBwPpFBU/Myvhg==", + "dev": true, + "license": "MIT", + "dependencies": { + "glob": "^10.3.12", + "typescript": "^5.4.3" + } + }, + "node_modules/config-file-ts/node_modules/glob": { + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz", + "integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", + "dev": true, + "license": "ISC", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/config-file-ts/node_modules/minimatch": { + "version": "9.0.7", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.7.tgz", + "integrity": "sha512-MOwgjc8tfrpn5QQEvjijjmDVtMw2oL88ugTevzxQnzRLm6l3fVEF2gzU0kYeYYKD8C66+IdGX6peJ4MyUlUnPg==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^5.0.2" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/config-file-ts/node_modules/minipass": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz", + "integrity": "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==", + "dev": true, + "license": "ISC" + }, "node_modules/core-util-is": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==", "dev": true, - "license": "MIT", - "optional": true + "license": "MIT" }, "node_modules/crc": { "version": "3.8.0", @@ -1684,14 +1798,34 @@ "buffer": "^5.1.0" } }, - "node_modules/cross-dirname": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/cross-dirname/-/cross-dirname-0.1.0.tgz", - "integrity": "sha512-+R08/oI0nl3vfPcqftZRpytksBXDzOUveBq/NBVx0sUp1axwzPQrKinNx5yd5sxPu8j1wIy8AfnVQ+5eFdha6Q==", + "node_modules/crc-32": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz", + "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==", + "dev": true, + "license": "Apache-2.0", + "peer": true, + "bin": { + "crc32": "bin/crc32.njs" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/crc32-stream": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-4.0.3.tgz", + "integrity": "sha512-NT7w2JVU7DFroFdYkeq8cywxrgjPHWkdX1wjpRQXPX5Asews3tA+Ght6lddQO5Mkumffp3X7GEqku3epj2toIw==", "dev": true, "license": "MIT", - "optional": true, - "peer": true + "peer": true, + "dependencies": { + "crc-32": "^1.2.0", + "readable-stream": "^3.4.0" + }, + "engines": { + "node": ">= 10" + } }, "node_modules/cross-spawn": { "version": "7.0.6", @@ -1708,29 +1842,6 @@ "node": ">= 8" } }, - "node_modules/cross-spawn/node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true, - "license": "ISC" - }, - "node_modules/cross-spawn/node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "license": "ISC", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, "node_modules/debug": { "version": "4.4.3", "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", @@ -1849,6 +1960,13 @@ "node": ">=0.4.0" } }, + "node_modules/delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==", + "dev": true, + "license": "MIT" + }, "node_modules/detect-libc": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", @@ -1910,14 +2028,15 @@ } }, "node_modules/dmg-builder": { - "version": "26.8.1", - "resolved": "https://registry.npmjs.org/dmg-builder/-/dmg-builder-26.8.1.tgz", - "integrity": "sha512-glMJgnTreo8CFINujtAhCgN96QAqApDMZ8Vl1r8f0QT8QprvC1UCltV4CcWj20YoIyLZx6IUskaJZ0NV8fokcg==", + "version": "25.1.8", + "resolved": "https://registry.npmjs.org/dmg-builder/-/dmg-builder-25.1.8.tgz", + "integrity": "sha512-NoXo6Liy2heSklTI5OIZbCgXC1RzrDQsZkeEwXhdOro3FT1VBOvbubvscdPnjVuQ4AMwwv61oaH96AbiYg9EnQ==", "dev": true, "license": "MIT", "dependencies": { - "app-builder-lib": "26.8.1", - "builder-util": "26.8.1", + "app-builder-lib": "25.1.8", + "builder-util": "25.1.7", + "builder-util-runtime": "9.2.10", "fs-extra": "^10.1.0", "iconv-lite": "^0.6.2", "js-yaml": "^4.1.0" @@ -2078,19 +2197,19 @@ } }, "node_modules/electron-builder": { - "version": "26.8.1", - "resolved": "https://registry.npmjs.org/electron-builder/-/electron-builder-26.8.1.tgz", - "integrity": "sha512-uWhx1r74NGpCagG0ULs/P9Nqv2nsoo+7eo4fLUOB8L8MdWltq9odW/uuLXMFCDGnPafknYLZgjNX0ZIFRzOQAw==", + "version": "25.1.8", + "resolved": "https://registry.npmjs.org/electron-builder/-/electron-builder-25.1.8.tgz", + "integrity": "sha512-poRgAtUHHOnlzZnc9PK4nzG53xh74wj2Jy7jkTrqZ0MWPoHGh1M2+C//hGeYdA+4K8w4yiVCNYoLXF7ySj2Wig==", "dev": true, "license": "MIT", "dependencies": { - "app-builder-lib": "26.8.1", - "builder-util": "26.8.1", - "builder-util-runtime": "9.5.1", + "app-builder-lib": "25.1.8", + "builder-util": "25.1.7", + "builder-util-runtime": "9.2.10", "chalk": "^4.1.2", - "ci-info": "^4.2.0", - "dmg-builder": "26.8.1", + "dmg-builder": "25.1.8", "fs-extra": "^10.1.0", + "is-ci": "^3.0.0", "lazy-val": "^1.0.5", "simple-update-notifier": "2.0.0", "yargs": "^17.6.2" @@ -2104,16 +2223,58 @@ } }, "node_modules/electron-builder-squirrel-windows": { - "version": "26.8.1", - "resolved": "https://registry.npmjs.org/electron-builder-squirrel-windows/-/electron-builder-squirrel-windows-26.8.1.tgz", - "integrity": "sha512-o288fIdgPLHA76eDrFADHPoo7VyGkDCYbLV1GzndaMSAVBoZrGvM9m2IehdcVMzdAZJ2eV9bgyissQXHv5tGzA==", + "version": "25.1.8", + "resolved": "https://registry.npmjs.org/electron-builder-squirrel-windows/-/electron-builder-squirrel-windows-25.1.8.tgz", + "integrity": "sha512-2ntkJ+9+0GFP6nAISiMabKt6eqBB0kX1QqHNWFWAXgi0VULKGisM46luRFpIBiU3u/TDmhZMM8tzvo2Abn3ayg==", "dev": true, "license": "MIT", "peer": true, "dependencies": { - "app-builder-lib": "26.8.1", - "builder-util": "26.8.1", - "electron-winstaller": "5.4.0" + "app-builder-lib": "25.1.8", + "archiver": "^5.3.1", + "builder-util": "25.1.7", + "fs-extra": "^10.1.0" + } + }, + "node_modules/electron-builder-squirrel-windows/node_modules/fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/electron-builder-squirrel-windows/node_modules/jsonfile": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz", + "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/electron-builder-squirrel-windows/node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">= 10.0.0" } }, "node_modules/electron-builder/node_modules/fs-extra": { @@ -2155,17 +2316,16 @@ } }, "node_modules/electron-publish": { - "version": "26.8.1", - "resolved": "https://registry.npmjs.org/electron-publish/-/electron-publish-26.8.1.tgz", - "integrity": "sha512-q+jrSTIh/Cv4eGZa7oVR+grEJo/FoLMYBAnSL5GCtqwUpr1T+VgKB/dn1pnzxIxqD8S/jP1yilT9VrwCqINR4w==", + "version": "25.1.7", + "resolved": "https://registry.npmjs.org/electron-publish/-/electron-publish-25.1.7.tgz", + "integrity": "sha512-+jbTkR9m39eDBMP4gfbqglDd6UvBC7RLh5Y0MhFSsc6UkGHj9Vj9TWobxevHYMMqmoujL11ZLjfPpMX+Pt6YEg==", "dev": true, "license": "MIT", "dependencies": { "@types/fs-extra": "^9.0.11", - "builder-util": "26.8.1", - "builder-util-runtime": "9.5.1", + "builder-util": "25.1.7", + "builder-util-runtime": "9.2.10", "chalk": "^4.1.2", - "form-data": "^4.0.5", "fs-extra": "^10.1.0", "lazy-val": "^1.0.5", "mime": "^2.5.2" @@ -2209,44 +2369,6 @@ "node": ">= 10.0.0" } }, - "node_modules/electron-winstaller": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/electron-winstaller/-/electron-winstaller-5.4.0.tgz", - "integrity": "sha512-bO3y10YikuUwUuDUQRM4KfwNkKhnpVO7IPdbsrejwN9/AABJzzTQ4GeHwyzNSrVO+tEH3/Np255a3sVZpZDjvg==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@electron/asar": "^3.2.1", - "debug": "^4.1.1", - "fs-extra": "^7.0.1", - "lodash": "^4.17.21", - "temp": "^0.9.0" - }, - "engines": { - "node": ">=8.0.0" - }, - "optionalDependencies": { - "@electron/windows-sign": "^1.1.2" - } - }, - "node_modules/electron-winstaller/node_modules/fs-extra": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", - "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "graceful-fs": "^4.1.2", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - }, - "engines": { - "node": ">=6 <7 || >=8" - } - }, "node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", @@ -2436,24 +2558,6 @@ "pend": "~1.2.0" } }, - "node_modules/fdir": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", - "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "picomatch": "^3 || ^4" - }, - "peerDependenciesMeta": { - "picomatch": { - "optional": true - } - } - }, "node_modules/filelist": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.5.tgz", @@ -2514,6 +2618,14 @@ "node": ">= 6" } }, + "node_modules/fs-constants": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", + "dev": true, + "license": "MIT", + "peer": true + }, "node_modules/fs-extra": { "version": "8.1.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", @@ -2530,16 +2642,16 @@ } }, "node_modules/fs-minipass": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-3.0.3.tgz", - "integrity": "sha512-XUBA9XClHbnJWSfBzjkm6RvPsyg3sryZt06BEQoXcF7EK/xpGaQYJgQKDJSUH5SGZ76Y7pFx1QBnXz09rU5Fbw==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", "dev": true, "license": "ISC", "dependencies": { - "minipass": "^7.0.3" + "minipass": "^3.0.0" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": ">= 8" } }, "node_modules/fs.realpath": { @@ -2559,6 +2671,27 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/gauge": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-4.0.4.tgz", + "integrity": "sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==", + "deprecated": "This package is no longer supported.", + "dev": true, + "license": "ISC", + "dependencies": { + "aproba": "^1.0.3 || ^2.0.0", + "color-support": "^1.1.3", + "console-control-strings": "^1.1.0", + "has-unicode": "^2.0.1", + "signal-exit": "^3.0.7", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "wide-align": "^1.1.5" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, "node_modules/get-caller-file": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", @@ -2827,6 +2960,13 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==", + "dev": true, + "license": "ISC" + }, "node_modules/hasown": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", @@ -2902,6 +3042,16 @@ "node": ">= 14" } }, + "node_modules/humanize-ms": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", + "integrity": "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.0.0" + } + }, "node_modules/iconv-corefoundation": { "version": "1.1.7", "resolved": "https://registry.npmjs.org/iconv-corefoundation/-/iconv-corefoundation-1.1.7.tgz", @@ -2964,6 +3114,23 @@ "node": ">=0.8.19" } }, + "node_modules/indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/infer-owner": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", + "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==", + "dev": true, + "license": "ISC" + }, "node_modules/inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", @@ -2993,6 +3160,19 @@ "node": ">= 12" } }, + "node_modules/is-ci": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-3.0.1.tgz", + "integrity": "sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ci-info": "^3.2.0" + }, + "bin": { + "is-ci": "bin.js" + } + }, "node_modules/is-fullwidth-code-point": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", @@ -3013,6 +3193,13 @@ "node": ">=8" } }, + "node_modules/is-lambda": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz", + "integrity": "sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==", + "dev": true, + "license": "MIT" + }, "node_modules/is-unicode-supported": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", @@ -3026,6 +3213,14 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true, + "license": "MIT", + "peer": true + }, "node_modules/isbinaryfile": { "version": "5.0.7", "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-5.0.7.tgz", @@ -3040,14 +3235,11 @@ } }, "node_modules/isexe": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.5.tgz", - "integrity": "sha512-6B3tLtFqtQS4ekarvLVMZ+X+VlvQekbe4taUkf/rhVO3d/h0M2rfARm/pXLcPEsjjMsFgrFgSrhQIxcSVrBz8w==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", "dev": true, - "license": "BlueOak-1.0.0", - "engines": { - "node": ">=18" - } + "license": "ISC" }, "node_modules/jackspeak": { "version": "3.4.3", @@ -3083,16 +3275,6 @@ "node": ">=10" } }, - "node_modules/jiti": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.6.1.tgz", - "integrity": "sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==", - "dev": true, - "license": "MIT", - "bin": { - "jiti": "lib/jiti-cli.mjs" - } - }, "node_modules/js-yaml": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", @@ -3168,6 +3350,56 @@ "dev": true, "license": "MIT" }, + "node_modules/lazystream": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.1.tgz", + "integrity": "sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "readable-stream": "^2.0.5" + }, + "engines": { + "node": ">= 0.6.3" + } + }, + "node_modules/lazystream/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "license": "MIT", + "peer": true, + "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" + } + }, + "node_modules/lazystream/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/lazystream/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, "node_modules/lodash": { "version": "4.17.23", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.23.tgz", @@ -3175,6 +3407,46 @@ "dev": true, "license": "MIT" }, + "node_modules/lodash.defaults": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz", + "integrity": "sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/lodash.difference": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.difference/-/lodash.difference-4.5.0.tgz", + "integrity": "sha512-dS2j+W26TQ7taQBGN8Lbbq04ssV3emRw4NY58WErlTO29pIqS0HmoT5aJ9+TUQ1N3G+JOZSji4eugsWwGp9yPA==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/lodash.flatten": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz", + "integrity": "sha512-C5N2Z3DgnnKr0LOpv/hKCgKdb7ZZwafIrsesve6lmzvZIRZRGaZ/l6Q8+2W7NaT+ZwO3fFlSCzCzrDCFdJfZ4g==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/lodash.union": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.union/-/lodash.union-4.6.0.tgz", + "integrity": "sha512-c4pB2CdGrGdjMKYLA+XiRDO7Y0PRQbm/Gzg8qMj+QH+pFVAoTp5sBpO0odL3FjoPCGjK96p6qsP+yQoiLoOBcw==", + "dev": true, + "license": "MIT", + "peer": true + }, "node_modules/log-symbols": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", @@ -3216,26 +3488,83 @@ } }, "node_modules/make-fetch-happen": { - "version": "14.0.3", - "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-14.0.3.tgz", - "integrity": "sha512-QMjGbFTP0blj97EeidG5hk/QhKQ3T4ICckQGLgz38QF7Vgbk6e6FTARN8KhKxyBbWn8R0HU+bnw8aSoFPD4qtQ==", + "version": "10.2.1", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-10.2.1.tgz", + "integrity": "sha512-NgOPbRiaQM10DYXvN3/hhGVI2M5MtITFryzBGxHM5p4wnFxsVCbxkrBrDsk+EZ5OB4jEOT7AjDxtdF+KVEFT7w==", "dev": true, "license": "ISC", "dependencies": { - "@npmcli/agent": "^3.0.0", - "cacache": "^19.0.1", - "http-cache-semantics": "^4.1.1", - "minipass": "^7.0.2", - "minipass-fetch": "^4.0.0", + "agentkeepalive": "^4.2.1", + "cacache": "^16.1.0", + "http-cache-semantics": "^4.1.0", + "http-proxy-agent": "^5.0.0", + "https-proxy-agent": "^5.0.0", + "is-lambda": "^1.0.1", + "lru-cache": "^7.7.1", + "minipass": "^3.1.6", + "minipass-collect": "^1.0.2", + "minipass-fetch": "^2.0.3", "minipass-flush": "^1.0.5", "minipass-pipeline": "^1.2.4", - "negotiator": "^1.0.0", - "proc-log": "^5.0.0", + "negotiator": "^0.6.3", "promise-retry": "^2.0.1", - "ssri": "^12.0.0" + "socks-proxy-agent": "^7.0.0", + "ssri": "^9.0.0" }, "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/make-fetch-happen/node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/make-fetch-happen/node_modules/http-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", + "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@tootallnate/once": "2", + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/make-fetch-happen/node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/make-fetch-happen/node_modules/lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=12" } }, "node_modules/matcher": { @@ -3345,41 +3674,44 @@ } }, "node_modules/minipass": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz", - "integrity": "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==", - "dev": true, - "license": "BlueOak-1.0.0", - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "node_modules/minipass-collect": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-2.0.1.tgz", - "integrity": "sha512-D7V8PO9oaz7PWGLbCACuI1qEOsq7UKfLotx/C0Aet43fCUB/wfQ7DYeq2oR/svFJGYDHPr38SHATeaj/ZoKHKw==", + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", "dev": true, "license": "ISC", "dependencies": { - "minipass": "^7.0.3" + "yallist": "^4.0.0" }, "engines": { - "node": ">=16 || 14 >=14.17" + "node": ">=8" + } + }, + "node_modules/minipass-collect": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz", + "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", + "dev": true, + "license": "ISC", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" } }, "node_modules/minipass-fetch": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-4.0.1.tgz", - "integrity": "sha512-j7U11C5HXigVuutxebFadoYBbd7VSdZWggSe64NVdvWNBqGAiXPL2QVCehjmw7lY1oF9gOllYbORh+hiNgfPgQ==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-2.1.2.tgz", + "integrity": "sha512-LT49Zi2/WMROHYoqGgdlQIZh8mLPZmOrN2NdJjMXxYe4nkN6FUyuPuOAOedNJDrx0IRGg9+4guZewtp8hE6TxA==", "dev": true, "license": "MIT", "dependencies": { - "minipass": "^7.0.3", + "minipass": "^3.1.6", "minipass-sized": "^1.0.3", - "minizlib": "^3.0.1" + "minizlib": "^2.1.2" }, "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" }, "optionalDependencies": { "encoding": "^0.1.13" @@ -3398,19 +3730,6 @@ "node": ">= 8" } }, - "node_modules/minipass-flush/node_modules/minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "dev": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/minipass-pipeline": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", @@ -3424,19 +3743,6 @@ "node": ">=8" } }, - "node_modules/minipass-pipeline/node_modules/minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "dev": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/minipass-sized": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz", @@ -3450,44 +3756,31 @@ "node": ">=8" } }, - "node_modules/minipass-sized/node_modules/minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "node_modules/minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", "dev": true, - "license": "ISC", + "license": "MIT", "dependencies": { + "minipass": "^3.0.0", "yallist": "^4.0.0" }, "engines": { - "node": ">=8" - } - }, - "node_modules/minizlib": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.1.0.tgz", - "integrity": "sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==", - "dev": true, - "license": "MIT", - "dependencies": { - "minipass": "^7.1.2" - }, - "engines": { - "node": ">= 18" + "node": ">= 8" } }, "node_modules/mkdirp": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", - "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", "dev": true, "license": "MIT", - "peer": true, - "dependencies": { - "minimist": "^1.2.6" - }, "bin": { "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" } }, "node_modules/ms": { @@ -3498,9 +3791,9 @@ "license": "MIT" }, "node_modules/negotiator": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz", - "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==", + "version": "0.6.4", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.4.tgz", + "integrity": "sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==", "dev": true, "license": "MIT", "engines": { @@ -3508,16 +3801,16 @@ } }, "node_modules/node-abi": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-4.26.0.tgz", - "integrity": "sha512-8QwIZqikRvDIkXS2S93LjzhsSPJuIbfaMETWH+Bx8oOT9Sa9UsUtBFQlc3gBNd1+QINjaTloitXr1W3dQLi9Iw==", + "version": "3.87.0", + "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.87.0.tgz", + "integrity": "sha512-+CGM1L1CgmtheLcBuleyYOn7NWPVu0s0EJH2C4puxgEZb9h8QpR9G2dBfZJOAUhi7VQxuBPMd0hiISWcTyiYyQ==", "dev": true, "license": "MIT", "dependencies": { - "semver": "^7.6.3" + "semver": "^7.3.5" }, "engines": { - "node": ">=22.12.0" + "node": ">=10" } }, "node_modules/node-abi/node_modules/semver": { @@ -3565,28 +3858,29 @@ } }, "node_modules/node-gyp": { - "version": "11.5.0", - "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-11.5.0.tgz", - "integrity": "sha512-ra7Kvlhxn5V9Slyus0ygMa2h+UqExPqUIkfk7Pc8QTLT956JLSy51uWFwHtIYy0vI8cB4BDhc/S03+880My/LQ==", + "version": "9.4.1", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-9.4.1.tgz", + "integrity": "sha512-OQkWKbjQKbGkMf/xqI1jjy3oCTgMKJac58G2+bjZb3fza6gW2YrCSdMQYaoTb70crvE//Gngr4f0AgVHmqHvBQ==", "dev": true, "license": "MIT", "dependencies": { "env-paths": "^2.2.0", "exponential-backoff": "^3.1.1", + "glob": "^7.1.4", "graceful-fs": "^4.2.6", - "make-fetch-happen": "^14.0.3", - "nopt": "^8.0.0", - "proc-log": "^5.0.0", + "make-fetch-happen": "^10.0.3", + "nopt": "^6.0.0", + "npmlog": "^6.0.0", + "rimraf": "^3.0.2", "semver": "^7.3.5", - "tar": "^7.4.3", - "tinyglobby": "^0.2.12", - "which": "^5.0.0" + "tar": "^6.1.2", + "which": "^2.0.2" }, "bin": { "node-gyp": "bin/node-gyp.js" }, "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": "^12.13 || ^14.13 || >=16" } }, "node_modules/node-gyp/node_modules/semver": { @@ -3603,19 +3897,30 @@ } }, "node_modules/nopt": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-8.1.0.tgz", - "integrity": "sha512-ieGu42u/Qsa4TFktmaKEwM6MQH0pOWnaB3htzh0JRtx84+Mebc0cbZYN5bC+6WTZ4+77xrL9Pn5m7CV6VIkV7A==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-6.0.0.tgz", + "integrity": "sha512-ZwLpbTgdhuZUnZzjd7nb1ZV+4DoiC6/sfiVKok72ym/4Tlf+DFdlHYmT2JPmcNNWV6Pi3SDf1kT+A4r9RTuT9g==", "dev": true, "license": "ISC", "dependencies": { - "abbrev": "^3.0.0" + "abbrev": "^1.0.0" }, "bin": { "nopt": "bin/nopt.js" }, "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=0.10.0" } }, "node_modules/normalize-url": { @@ -3631,6 +3936,23 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/npmlog": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-6.0.2.tgz", + "integrity": "sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg==", + "deprecated": "This package is no longer supported.", + "dev": true, + "license": "ISC", + "dependencies": { + "are-we-there-yet": "^3.0.0", + "console-control-strings": "^1.1.0", + "gauge": "^4.0.3", + "set-blocking": "^2.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, "node_modules/object-keys": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", @@ -3719,13 +4041,16 @@ } }, "node_modules/p-map": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-7.0.4.tgz", - "integrity": "sha512-tkAQEw8ysMzmkhgw8k+1U/iPhWNhykKnSk4Rd5zLoPJCuJaGRPo6YposrZgaxHKzDHdDWWZvE/Sk7hsL2X/CpQ==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", "dev": true, "license": "MIT", + "dependencies": { + "aggregate-error": "^3.0.0" + }, "engines": { - "node": ">=18" + "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -3782,6 +4107,16 @@ "dev": true, "license": "ISC" }, + "node_modules/path-scurry/node_modules/minipass": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz", + "integrity": "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, "node_modules/pe-library": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/pe-library/-/pe-library-0.4.1.tgz", @@ -3811,19 +4146,6 @@ "dev": true, "license": "ISC" }, - "node_modules/picomatch": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, "node_modules/plist": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/plist/-/plist-3.1.0.tgz", @@ -3839,45 +4161,13 @@ "node": ">=10.4.0" } }, - "node_modules/postject": { - "version": "1.0.0-alpha.6", - "resolved": "https://registry.npmjs.org/postject/-/postject-1.0.0-alpha.6.tgz", - "integrity": "sha512-b9Eb8h2eVqNE8edvKdwqkrY6O7kAwmI8kcnBv1NScolYJbo59XUF0noFq+lxbC1yN20bmC0WBEbDC5H/7ASb0A==", + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", "dev": true, "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "commander": "^9.4.0" - }, - "bin": { - "postject": "dist/cli.js" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/postject/node_modules/commander": { - "version": "9.5.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-9.5.0.tgz", - "integrity": "sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "engines": { - "node": "^12.20.0 || >=14" - } - }, - "node_modules/proc-log": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-5.0.0.tgz", - "integrity": "sha512-Azwzvl90HaF0aCz1JrDdXQykFakSSNPaPoiZ9fm5qJIMHioDZEi7OAdRwSm6rSoPtY3Qutnm3L7ogmg3dc+wbQ==", - "dev": true, - "license": "ISC", - "engines": { - "node": "^18.17.0 || >=20.5.0" - } + "peer": true }, "node_modules/progress": { "version": "2.0.3", @@ -3889,6 +4179,13 @@ "node": ">=0.4.0" } }, + "node_modules/promise-inflight": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", + "integrity": "sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==", + "dev": true, + "license": "ISC" + }, "node_modules/promise-retry": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", @@ -3903,18 +4200,6 @@ "node": ">=10" } }, - "node_modules/proper-lockfile": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/proper-lockfile/-/proper-lockfile-4.1.2.tgz", - "integrity": "sha512-TjNPblN4BwAWMXU8s9AEz4JmQxnD1NNL7bNOY/AKUzyamc379FWASUhc/K1pL2noVb+XmZKLL68cjzLsiOAMaA==", - "dev": true, - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.2.4", - "retry": "^0.12.0", - "signal-exit": "^3.0.2" - } - }, "node_modules/pump": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.3.tgz", @@ -3977,6 +4262,50 @@ "node": ">= 6" } }, + "node_modules/readdir-glob": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/readdir-glob/-/readdir-glob-1.1.3.tgz", + "integrity": "sha512-v05I2k7xN8zXvPD9N+z/uhXPaj0sUFCe2rcWZIpBsqxfP7xXFQ0tipAd/wjj1YxWyWtUS5IDJpOG82JKt2EAVA==", + "dev": true, + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "minimatch": "^5.1.0" + } + }, + "node_modules/readdir-glob/node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/readdir-glob/node_modules/brace-expansion": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/readdir-glob/node_modules/minimatch": { + "version": "5.1.8", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.8.tgz", + "integrity": "sha512-7RN35vit8DeBclkofOVmBY0eDAZZQd1HzmukRdSyz95CRh8FT54eqnbj0krQr3mrHR6sfRyYkyhwBWjoV5uqlQ==", + "dev": true, + "license": "ISC", + "peer": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", @@ -4050,18 +4379,20 @@ } }, "node_modules/rimraf": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", - "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", "deprecated": "Rimraf versions prior to v4 are no longer supported", "dev": true, "license": "ISC", - "peer": true, "dependencies": { "glob": "^7.1.3" }, "bin": { "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, "node_modules/roarr": { @@ -4166,6 +4497,13 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", + "dev": true, + "license": "ISC" + }, "node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", @@ -4265,18 +4603,31 @@ } }, "node_modules/socks-proxy-agent": { - "version": "8.0.5", - "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.5.tgz", - "integrity": "sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-7.0.0.tgz", + "integrity": "sha512-Fgl0YPZ902wEsAyiQ+idGd1A7rSFx/ayC1CQVMw5P+EQx2V0SgpGtf6OKFhVjPflPUl9YMmEOnmfjCdMUsygww==", "dev": true, "license": "MIT", "dependencies": { - "agent-base": "^7.1.2", - "debug": "^4.3.4", - "socks": "^2.8.3" + "agent-base": "^6.0.2", + "debug": "^4.3.3", + "socks": "^2.6.2" }, "engines": { - "node": ">= 14" + "node": ">= 10" + } + }, + "node_modules/socks-proxy-agent/node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" } }, "node_modules/source-map": { @@ -4309,16 +4660,16 @@ "optional": true }, "node_modules/ssri": { - "version": "12.0.0", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-12.0.0.tgz", - "integrity": "sha512-S7iGNosepx9RadX82oimUkvr0Ct7IjJbEbs4mJcTxst8um95J3sDYU1RBEOvdu6oL1Wek2ODI5i4MAw+dZ6cAQ==", + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-9.0.1.tgz", + "integrity": "sha512-o57Wcn66jMQvfHG1FlYbWeZWW/dHZhJXjpIcTfXldXEk5nz5lStPo3mK0OJQfGR3RbZUlbISexbljkJzuEj/8Q==", "dev": true, "license": "ISC", "dependencies": { - "minipass": "^7.0.3" + "minipass": "^3.1.1" }, "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, "node_modules/stat-mode": { @@ -4426,45 +4777,50 @@ } }, "node_modules/tar": { - "version": "7.5.9", - "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.9.tgz", - "integrity": "sha512-BTLcK0xsDh2+PUe9F6c2TlRp4zOOBMTkoQHQIWSIzI0R7KG46uEwq4OPk2W7bZcprBMsuaeFsqwYr7pjh6CuHg==", + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz", + "integrity": "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==", + "deprecated": "Old versions of tar are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", "dev": true, - "license": "BlueOak-1.0.0", + "license": "ISC", "dependencies": { - "@isaacs/fs-minipass": "^4.0.0", - "chownr": "^3.0.0", - "minipass": "^7.1.2", - "minizlib": "^3.1.0", - "yallist": "^5.0.0" + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^5.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" }, "engines": { - "node": ">=18" + "node": ">=10" } }, - "node_modules/tar/node_modules/yallist": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz", - "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==", - "dev": true, - "license": "BlueOak-1.0.0", - "engines": { - "node": ">=18" - } - }, - "node_modules/temp": { - "version": "0.9.4", - "resolved": "https://registry.npmjs.org/temp/-/temp-0.9.4.tgz", - "integrity": "sha512-yYrrsWnrXMcdsnu/7YMYAofM1ktpL5By7vZhf15CrXijWWrEYZks5AXBudalfSWJLlnen/QUJUB5aoB0kqZUGA==", + "node_modules/tar-stream": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", + "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", "dev": true, "license": "MIT", "peer": true, "dependencies": { - "mkdirp": "^0.5.1", - "rimraf": "~2.6.2" + "bl": "^4.0.3", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" }, "engines": { - "node": ">=6.0.0" + "node": ">=6" + } + }, + "node_modules/tar/node_modules/minipass": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=8" } }, "node_modules/temp-file": { @@ -4516,43 +4872,6 @@ "node": ">= 10.0.0" } }, - "node_modules/tiny-async-pool": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/tiny-async-pool/-/tiny-async-pool-1.3.0.tgz", - "integrity": "sha512-01EAw5EDrcVrdgyCLgoSPvqznC0sVxDSVeiOz09FUpjh71G79VCqneOr+xvt7T1r76CF6ZZfPjHorN2+d+3mqA==", - "dev": true, - "license": "MIT", - "dependencies": { - "semver": "^5.5.0" - } - }, - "node_modules/tiny-async-pool/node_modules/semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/tinyglobby": { - "version": "0.2.15", - "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", - "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "fdir": "^6.5.0", - "picomatch": "^4.0.3" - }, - "engines": { - "node": ">=12.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/SuperchupuDev" - } - }, "node_modules/tmp": { "version": "0.2.5", "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.5.tgz", @@ -4597,6 +4916,20 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/typescript": { + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, "node_modules/undici-types": { "version": "6.21.0", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", @@ -4605,29 +4938,29 @@ "license": "MIT" }, "node_modules/unique-filename": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-4.0.0.tgz", - "integrity": "sha512-XSnEewXmQ+veP7xX2dS5Q4yZAvO40cBN2MWkJ7D/6sW4Dg6wYBNwM1Vrnz1FhH5AdeLIlUXRI9e28z1YZi71NQ==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-2.0.1.tgz", + "integrity": "sha512-ODWHtkkdx3IAR+veKxFV+VBkUMcN+FaqzUUd7IZzt+0zhDZFPFxhlqwPF3YQvMHx1TD0tdgYl+kuPnJ8E6ql7A==", "dev": true, "license": "ISC", "dependencies": { - "unique-slug": "^5.0.0" + "unique-slug": "^3.0.0" }, "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, "node_modules/unique-slug": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-5.0.0.tgz", - "integrity": "sha512-9OdaqO5kwqR+1kVgHAhsp5vPNU0hnxRa26rBFNfNgM7M6pNtgzeBn3s/xbyCQL3dcjzOatcef6UUHpB/6MaETg==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-3.0.0.tgz", + "integrity": "sha512-8EyMynh679x/0gqE9fT9oilG+qEt+ibFyqjuVTsZn1+CMxH+XLlpvr2UZx4nVcCwTpx81nICr2JQFkM+HPLq4w==", "dev": true, "license": "ISC", "dependencies": { "imurmurhash": "^0.1.4" }, "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, "node_modules/universalify": { @@ -4691,19 +5024,29 @@ } }, "node_modules/which": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/which/-/which-5.0.0.tgz", - "integrity": "sha512-JEdGzHwwkrbWoGOlIHqQ5gtprKGOenpDHpxE9zVR1bWbOtYRyPPHMe9FaP6x61CmNaTThSkb0DAJte5jD+DmzQ==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "dev": true, "license": "ISC", "dependencies": { - "isexe": "^3.1.1" + "isexe": "^2.0.0" }, "bin": { - "node-which": "bin/which.js" + "node-which": "bin/node-which" }, "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": ">= 8" + } + }, + "node_modules/wide-align": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", + "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^1.0.2 || 2 || 3 || 4" } }, "node_modules/wrap-ansi": { @@ -4829,6 +5172,45 @@ "funding": { "url": "https://github.com/sponsors/sindresorhus" } + }, + "node_modules/zip-stream": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-4.1.1.tgz", + "integrity": "sha512-9qv4rlDiopXg4E69k+vMHjNN63YFMe9sZMrdlvKnCjlCRWeCBswPPMPUfx+ipsAWq1LXHe70RcbaHdJJpS6hyQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "archiver-utils": "^3.0.4", + "compress-commons": "^4.1.2", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/zip-stream/node_modules/archiver-utils": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-3.0.4.tgz", + "integrity": "sha512-KVgf4XQVrTjhyWmx6cte4RxonPLR9onExufI1jhvw/MQ4BB6IsZD5gT8Lq+u/+pRkWna/6JoHpiQioaqFP5Rzw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "glob": "^7.2.3", + "graceful-fs": "^4.2.0", + "lazystream": "^1.0.0", + "lodash.defaults": "^4.2.0", + "lodash.difference": "^4.5.0", + "lodash.flatten": "^4.4.0", + "lodash.isplainobject": "^4.0.6", + "lodash.union": "^4.6.0", + "normalize-path": "^3.0.0", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">= 10" + } } } } From 1bfb5f7d0da9455509e9fe2ee79f2fb0d0aa166d Mon Sep 17 00:00:00 2001 From: pavel Date: Wed, 25 Feb 2026 16:52:40 +0100 Subject: [PATCH 03/44] a --- package.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/package.json b/package.json index 573be5c..244965c 100644 --- a/package.json +++ b/package.json @@ -8,9 +8,9 @@ "scripts": { "start": "electron .", "dev": "electron .", - "dist": "electron-builder", - "dist:linux": "electron-builder --linux", - "dist:win": "electron-builder --win" + "dist": "electron-builder --publish never", + "dist:linux": "electron-builder --linux --publish never", + "dist:win": "electron-builder --win --publish never" }, "build": { "appId": "me.flegr.chattz", From 1a6d7bf2196ebbc9dc5b4b36fd6cc37dffd7e7db Mon Sep 17 00:00:00 2001 From: pavel Date: Wed, 25 Feb 2026 16:56:33 +0100 Subject: [PATCH 04/44] jj --- package.json | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/package.json b/package.json index 244965c..bd50d6c 100644 --- a/package.json +++ b/package.json @@ -4,6 +4,10 @@ "description": "Electron frontend for Chattz", "author": "Pavel Flegr ", "homepage": "https://discord.flegr.me", + "repository": { + "type": "git", + "url": "https://git.flegr.me/pavel/discord.git" + }, "main": "main.js", "scripts": { "start": "electron .", @@ -25,6 +29,13 @@ "nsis" ] }, + "publish": [ + { + "provider": "generic", + "url": "https://discord.flegr.me/static/installers", + "channel": "latest" + } + ], "files": [ "main.js", "package.json", From babbb33f69abee654c59db2bc31de6d4ebdb5b68 Mon Sep 17 00:00:00 2001 From: pavel Date: Wed, 25 Feb 2026 17:17:39 +0100 Subject: [PATCH 05/44] g --- .forgejo/workflows/pipeline.yaml | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/.forgejo/workflows/pipeline.yaml b/.forgejo/workflows/pipeline.yaml index 7dde8b9..30aa0d7 100644 --- a/.forgejo/workflows/pipeline.yaml +++ b/.forgejo/workflows/pipeline.yaml @@ -13,7 +13,12 @@ jobs: - uses: actions/checkout@v6 - run: npm ci - run: npm run dist:linux - - run: npm run dist:win + - name: Build Windows installer with 32-bit Wine prefix + run: | + export WINEARCH=win32 + export WINEPREFIX="$HOME/.wine32" + wineboot -u + npm run dist:win - name: Copy installers into static folder run: | mkdir -p static/installers From e954433289bb658825a8fd867cf97fd3f643d1d5 Mon Sep 17 00:00:00 2001 From: pavel Date: Wed, 25 Feb 2026 18:29:19 +0100 Subject: [PATCH 06/44] dnn3 --- desktop/app.js | 85 +++++- desktop/index.html | 3 +- .../vendor/deepfilternet3-noise-filter.esm.js | 249 ++++++++++++++++++ static/app.js | 85 +++++- static/index.html | 1 + .../vendor/deepfilternet3-noise-filter.esm.js | 249 ++++++++++++++++++ 6 files changed, 665 insertions(+), 7 deletions(-) create mode 100644 desktop/vendor/deepfilternet3-noise-filter.esm.js create mode 100644 static/vendor/deepfilternet3-noise-filter.esm.js diff --git a/desktop/app.js b/desktop/app.js index 490f680..25bc725 100644 --- a/desktop/app.js +++ b/desktop/app.js @@ -23,6 +23,10 @@ const state = { muted: false, sharingVideo: false, sharingScreen: false, + noiseFilterMode: 'deepfilter', + activeNoiseFilter: 'off', + deepFilterProcessor: null, + deepFilterModule: null, viewMode: 'chat', // 'chat' or 'video' iceServers: [{ urls: "stun:stun.l.google.com:19302" }], }, @@ -114,6 +118,7 @@ const el = { vcChannelName: document.getElementById("vc-channel-name"), voiceVideoBtn: document.getElementById("voice-video-btn"), voiceScreenBtn: document.getElementById("voice-screen-btn"), + voiceFilterBtn: document.getElementById("voice-filter-btn"), voiceMuteBtn: document.getElementById("voice-mute-btn"), voiceLeaveBtn: document.getElementById("voice-leave-btn"), videoGrid: document.getElementById("video-grid"), @@ -703,6 +708,10 @@ function shouldInitiateOffer(peerId) { } function stopAndClearAudioPipeline() { + if (state.voice.deepFilterProcessor) { + state.voice.deepFilterProcessor.destroy(); + state.voice.deepFilterProcessor = null; + } if (state.voice.localStream) { for (const track of state.voice.localStream.getTracks()) track.stop(); } @@ -715,6 +724,8 @@ function stopAndClearAudioPipeline() { state.voice.localStream = null; state.voice.rawStream = null; state.voice.audioContext = null; + state.voice.activeNoiseFilter = 'off'; + updateVoiceFilterButton(); } function stopAndClearVideoPipeline() { @@ -786,11 +797,34 @@ async function buildAudioPipeline(rawStream) { const ctx = new AudioContext(); state.voice.audioContext = ctx; const source = ctx.createMediaStreamSource(rawStream); + let processedSource = source; + state.voice.activeNoiseFilter = 'off'; + + if (state.voice.noiseFilterMode === 'deepfilter') { + try { + const deepFilter = await getDeepFilterModule(); + const processor = new deepFilter.DeepFilterNet3Core({ + sampleRate: 48000, + noiseReductionLevel: 70, + }); + await processor.initialize(); + const workletNode = await processor.createAudioWorkletNode(ctx); + processor.setNoiseSuppressionEnabled(true); + state.voice.deepFilterProcessor = processor; + source.connect(workletNode); + processedSource = workletNode; + state.voice.activeNoiseFilter = 'deepfilter'; + } catch (err) { + console.warn("DeepFilterNet3 unavailable, falling back to raw mic audio", err); + state.voice.activeNoiseFilter = 'off'; + } + } + updateVoiceFilterButton(); // Metering/Speaking detection const analyser = ctx.createAnalyser(); analyser.fftSize = 512; - source.connect(analyser); + processedSource.connect(analyser); const dataArray = new Uint8Array(analyser.frequencyBinCount); let localIsSpeaking = false; @@ -833,17 +867,60 @@ async function buildAudioPipeline(rawStream) { checkVolume(); const destination = ctx.createMediaStreamDestination(); - source.connect(destination); + processedSource.connect(destination); return destination.stream; } +function resolveDeepFilterModuleUrl() { + if (location.protocol === 'file:') { + return new URL('vendor/deepfilternet3-noise-filter.esm.js', location.href).toString(); + } + return '/static/vendor/deepfilternet3-noise-filter.esm.js'; +} + +async function getDeepFilterModule() { + if (state.voice.deepFilterModule) return state.voice.deepFilterModule; + const moduleUrl = resolveDeepFilterModuleUrl(); + state.voice.deepFilterModule = await import(moduleUrl); + return state.voice.deepFilterModule; +} + +function updateVoiceFilterButton() { + if (!el.voiceFilterBtn) return; + const requestedMode = state.voice.noiseFilterMode === 'deepfilter' ? 'DeepFilterNet3' : 'Off'; + const activeMode = state.voice.activeNoiseFilter === 'deepfilter' ? 'DeepFilterNet3' : 'Off'; + const activeSuffix = requestedMode === activeMode ? '' : ` (active: ${activeMode})`; + el.voiceFilterBtn.title = `Noise Filter: ${requestedMode}${activeSuffix}`; + el.voiceFilterBtn.innerHTML = state.voice.noiseFilterMode === 'deepfilter' + ? '' + : ''; + el.voiceFilterBtn.style.color = state.voice.noiseFilterMode === 'deepfilter' + ? 'var(--green)' + : 'var(--text-muted)'; + lucide.createIcons(); +} + +async function toggleNoiseFilter() { + state.voice.noiseFilterMode = state.voice.noiseFilterMode === 'deepfilter' ? 'off' : 'deepfilter'; + updateVoiceFilterButton(); + if (!state.voice.joinedChannelId) return; + + try { + await leaveVoice(); + await joinVoice(); + } catch (err) { + console.error("failed to rejoin voice after filter change", err); + } +} + async function createLocalVoiceStream() { + const useDeepFilter = state.voice.noiseFilterMode === 'deepfilter'; const constraints = { audio: { channelCount: 1, sampleRate: 48000, echoCancellation: true, - noiseSuppression: true, + noiseSuppression: !useDeepFilter, autoGainControl: false, }, video: false, @@ -1455,8 +1532,10 @@ async function init() { el.voiceVideoBtn.onclick = toggleVideo; el.voiceScreenBtn.onclick = toggleScreenShare; + if (el.voiceFilterBtn) el.voiceFilterBtn.onclick = toggleNoiseFilter; el.voiceMuteBtn.onclick = toggleMute; el.voiceLeaveBtn.onclick = leaveVoice; + updateVoiceFilterButton(); el.addSoundBtn.onclick = () => { el.soundModal.classList.remove("hidden"); diff --git a/desktop/index.html b/desktop/index.html index c58c23d..c92f049 100644 --- a/desktop/index.html +++ b/desktop/index.html @@ -91,6 +91,7 @@
+
@@ -263,4 +264,4 @@ - \ No newline at end of file + diff --git a/desktop/vendor/deepfilternet3-noise-filter.esm.js b/desktop/vendor/deepfilternet3-noise-filter.esm.js new file mode 100644 index 0000000..7ad3ee9 --- /dev/null +++ b/desktop/vendor/deepfilternet3-noise-filter.esm.js @@ -0,0 +1,249 @@ +class AssetLoader { + constructor(config = {}) { + this.cdnUrl = config.cdnUrl ?? 'https://cdn.mezon.ai/AI/models/datas/noise_suppression/deepfilternet3'; + } + getCdnUrl(relativePath) { + return `${this.cdnUrl}/${relativePath}`; + } + getAssetUrls() { + return { + wasm: this.getCdnUrl('v2/pkg/df_bg.wasm'), + model: this.getCdnUrl('v2/models/DeepFilterNet3_onnx.tar.gz') + }; + } + async fetchAsset(url) { + const response = await fetch(url); + if (!response.ok) { + throw new Error(`Failed to fetch asset: ${response.statusText}`); + } + return response.arrayBuffer(); + } +} +let defaultLoader = null; +function getAssetLoader(config) { + if (!defaultLoader || config) { + defaultLoader = new AssetLoader(config); + } + return defaultLoader; +} + +/** + * Creates a worklet module URL from inline code string + * This approach works with all bundlers without special configuration + */ +async function createWorkletModule(audioContext, workletCode) { + const blob = new Blob([workletCode], { type: 'application/javascript' }); + const blobUrl = URL.createObjectURL(blob); + await audioContext.audioWorklet.addModule(blobUrl); +} + +const WorkletMessageTypes = { + SET_SUPPRESSION_LEVEL: 'SET_SUPPRESSION_LEVEL', + SET_BYPASS: 'SET_BYPASS' +}; + +var workletCode = "(function () {\n 'use strict';\n\n let wasm;\n\n const heap = new Array(128).fill(undefined);\n\n heap.push(undefined, null, true, false);\n\n function getObject(idx) { return heap[idx]; }\n\n let heap_next = heap.length;\n\n function dropObject(idx) {\n if (idx < 132) return;\n heap[idx] = heap_next;\n heap_next = idx;\n }\n\n function takeObject(idx) {\n const ret = getObject(idx);\n dropObject(idx);\n return ret;\n }\n\n const cachedTextDecoder = (typeof TextDecoder !== 'undefined' ? new TextDecoder('utf-8', { ignoreBOM: true, fatal: true }) : { decode: () => { throw Error('TextDecoder not available') } } );\n\n if (typeof TextDecoder !== 'undefined') { cachedTextDecoder.decode(); }\n let cachedUint8Memory0 = null;\n\n function getUint8Memory0() {\n if (cachedUint8Memory0 === null || cachedUint8Memory0.byteLength === 0) {\n cachedUint8Memory0 = new Uint8Array(wasm.memory.buffer);\n }\n return cachedUint8Memory0;\n }\n\n function getStringFromWasm0(ptr, len) {\n ptr = ptr >>> 0;\n return cachedTextDecoder.decode(getUint8Memory0().subarray(ptr, ptr + len));\n }\n\n function addHeapObject(obj) {\n if (heap_next === heap.length) heap.push(heap.length + 1);\n const idx = heap_next;\n heap_next = heap[idx];\n\n heap[idx] = obj;\n return idx;\n }\n /**\n * Set DeepFilterNet attenuation limit.\n *\n * Args:\n * - lim_db: New attenuation limit in dB.\n * @param {number} st\n * @param {number} lim_db\n */\n function df_set_atten_lim(st, lim_db) {\n wasm.df_set_atten_lim(st, lim_db);\n }\n\n /**\n * Get DeepFilterNet frame size in samples.\n * @param {number} st\n * @returns {number}\n */\n function df_get_frame_length(st) {\n const ret = wasm.df_get_frame_length(st);\n return ret >>> 0;\n }\n\n let WASM_VECTOR_LEN = 0;\n\n function passArray8ToWasm0(arg, malloc) {\n const ptr = malloc(arg.length * 1, 1) >>> 0;\n getUint8Memory0().set(arg, ptr / 1);\n WASM_VECTOR_LEN = arg.length;\n return ptr;\n }\n /**\n * Create a DeepFilterNet Model\n *\n * Args:\n * - path: File path to a DeepFilterNet tar.gz onnx model\n * - atten_lim: Attenuation limit in dB.\n *\n * Returns:\n * - DF state doing the full processing: stft, DNN noise reduction, istft.\n * @param {Uint8Array} model_bytes\n * @param {number} atten_lim\n * @returns {number}\n */\n function df_create(model_bytes, atten_lim) {\n const ptr0 = passArray8ToWasm0(model_bytes, wasm.__wbindgen_malloc);\n const len0 = WASM_VECTOR_LEN;\n const ret = wasm.df_create(ptr0, len0, atten_lim);\n return ret >>> 0;\n }\n\n let cachedFloat32Memory0 = null;\n\n function getFloat32Memory0() {\n if (cachedFloat32Memory0 === null || cachedFloat32Memory0.byteLength === 0) {\n cachedFloat32Memory0 = new Float32Array(wasm.memory.buffer);\n }\n return cachedFloat32Memory0;\n }\n\n function passArrayF32ToWasm0(arg, malloc) {\n const ptr = malloc(arg.length * 4, 4) >>> 0;\n getFloat32Memory0().set(arg, ptr / 4);\n WASM_VECTOR_LEN = arg.length;\n return ptr;\n }\n /**\n * Processes a chunk of samples.\n *\n * Args:\n * - df_state: Created via df_create()\n * - input: Input buffer of length df_get_frame_length()\n * - output: Output buffer of length df_get_frame_length()\n *\n * Returns:\n * - Local SNR of the current frame.\n * @param {number} st\n * @param {Float32Array} input\n * @returns {Float32Array}\n */\n function df_process_frame(st, input) {\n const ptr0 = passArrayF32ToWasm0(input, wasm.__wbindgen_malloc);\n const len0 = WASM_VECTOR_LEN;\n const ret = wasm.df_process_frame(st, ptr0, len0);\n return takeObject(ret);\n }\n\n function handleError(f, args) {\n try {\n return f.apply(this, args);\n } catch (e) {\n wasm.__wbindgen_exn_store(addHeapObject(e));\n }\n }\n\n (typeof FinalizationRegistry === 'undefined')\n ? { }\n : new FinalizationRegistry(ptr => wasm.__wbg_dfstate_free(ptr >>> 0));\n\n function __wbg_get_imports() {\n const imports = {};\n imports.wbg = {};\n imports.wbg.__wbindgen_object_drop_ref = function(arg0) {\n takeObject(arg0);\n };\n imports.wbg.__wbg_crypto_566d7465cdbb6b7a = function(arg0) {\n const ret = getObject(arg0).crypto;\n return addHeapObject(ret);\n };\n imports.wbg.__wbindgen_is_object = function(arg0) {\n const val = getObject(arg0);\n const ret = typeof(val) === 'object' && val !== null;\n return ret;\n };\n imports.wbg.__wbg_process_dc09a8c7d59982f6 = function(arg0) {\n const ret = getObject(arg0).process;\n return addHeapObject(ret);\n };\n imports.wbg.__wbg_versions_d98c6400c6ca2bd8 = function(arg0) {\n const ret = getObject(arg0).versions;\n return addHeapObject(ret);\n };\n imports.wbg.__wbg_node_caaf83d002149bd5 = function(arg0) {\n const ret = getObject(arg0).node;\n return addHeapObject(ret);\n };\n imports.wbg.__wbindgen_is_string = function(arg0) {\n const ret = typeof(getObject(arg0)) === 'string';\n return ret;\n };\n imports.wbg.__wbg_require_94a9da52636aacbf = function() { return handleError(function () {\n const ret = module.require;\n return addHeapObject(ret);\n }, arguments) };\n imports.wbg.__wbindgen_is_function = function(arg0) {\n const ret = typeof(getObject(arg0)) === 'function';\n return ret;\n };\n imports.wbg.__wbindgen_string_new = function(arg0, arg1) {\n const ret = getStringFromWasm0(arg0, arg1);\n return addHeapObject(ret);\n };\n imports.wbg.__wbg_msCrypto_0b84745e9245cdf6 = function(arg0) {\n const ret = getObject(arg0).msCrypto;\n return addHeapObject(ret);\n };\n imports.wbg.__wbg_randomFillSync_290977693942bf03 = function() { return handleError(function (arg0, arg1) {\n getObject(arg0).randomFillSync(takeObject(arg1));\n }, arguments) };\n imports.wbg.__wbg_getRandomValues_260cc23a41afad9a = function() { return handleError(function (arg0, arg1) {\n getObject(arg0).getRandomValues(getObject(arg1));\n }, arguments) };\n imports.wbg.__wbg_newnoargs_e258087cd0daa0ea = function(arg0, arg1) {\n const ret = new Function(getStringFromWasm0(arg0, arg1));\n return addHeapObject(ret);\n };\n imports.wbg.__wbg_new_63b92bc8671ed464 = function(arg0) {\n const ret = new Uint8Array(getObject(arg0));\n return addHeapObject(ret);\n };\n imports.wbg.__wbg_new_9efabd6b6d2ce46d = function(arg0) {\n const ret = new Float32Array(getObject(arg0));\n return addHeapObject(ret);\n };\n imports.wbg.__wbg_buffer_12d079cc21e14bdb = function(arg0) {\n const ret = getObject(arg0).buffer;\n return addHeapObject(ret);\n };\n imports.wbg.__wbg_newwithbyteoffsetandlength_aa4a17c33a06e5cb = function(arg0, arg1, arg2) {\n const ret = new Uint8Array(getObject(arg0), arg1 >>> 0, arg2 >>> 0);\n return addHeapObject(ret);\n };\n imports.wbg.__wbg_newwithlength_e9b4878cebadb3d3 = function(arg0) {\n const ret = new Uint8Array(arg0 >>> 0);\n return addHeapObject(ret);\n };\n imports.wbg.__wbg_set_a47bac70306a19a7 = function(arg0, arg1, arg2) {\n getObject(arg0).set(getObject(arg1), arg2 >>> 0);\n };\n imports.wbg.__wbg_subarray_a1f73cd4b5b42fe1 = function(arg0, arg1, arg2) {\n const ret = getObject(arg0).subarray(arg1 >>> 0, arg2 >>> 0);\n return addHeapObject(ret);\n };\n imports.wbg.__wbg_newwithbyteoffsetandlength_4a659d079a1650e0 = function(arg0, arg1, arg2) {\n const ret = new Float32Array(getObject(arg0), arg1 >>> 0, arg2 >>> 0);\n return addHeapObject(ret);\n };\n imports.wbg.__wbg_self_ce0dbfc45cf2f5be = function() { return handleError(function () {\n const ret = self.self;\n return addHeapObject(ret);\n }, arguments) };\n imports.wbg.__wbg_window_c6fb939a7f436783 = function() { return handleError(function () {\n const ret = window.window;\n return addHeapObject(ret);\n }, arguments) };\n imports.wbg.__wbg_globalThis_d1e6af4856ba331b = function() { return handleError(function () {\n const ret = globalThis.globalThis;\n return addHeapObject(ret);\n }, arguments) };\n imports.wbg.__wbg_global_207b558942527489 = function() { return handleError(function () {\n const ret = global.global;\n return addHeapObject(ret);\n }, arguments) };\n imports.wbg.__wbindgen_is_undefined = function(arg0) {\n const ret = getObject(arg0) === undefined;\n return ret;\n };\n imports.wbg.__wbg_call_27c0f87801dedf93 = function() { return handleError(function (arg0, arg1) {\n const ret = getObject(arg0).call(getObject(arg1));\n return addHeapObject(ret);\n }, arguments) };\n imports.wbg.__wbindgen_object_clone_ref = function(arg0) {\n const ret = getObject(arg0);\n return addHeapObject(ret);\n };\n imports.wbg.__wbg_call_b3ca7c6051f9bec1 = function() { return handleError(function (arg0, arg1, arg2) {\n const ret = getObject(arg0).call(getObject(arg1), getObject(arg2));\n return addHeapObject(ret);\n }, arguments) };\n imports.wbg.__wbindgen_memory = function() {\n const ret = wasm.memory;\n return addHeapObject(ret);\n };\n imports.wbg.__wbindgen_throw = function(arg0, arg1) {\n throw new Error(getStringFromWasm0(arg0, arg1));\n };\n\n return imports;\n }\n\n function __wbg_finalize_init(instance, module) {\n wasm = instance.exports;\n cachedFloat32Memory0 = null;\n cachedUint8Memory0 = null;\n\n\n return wasm;\n }\n\n function initSync(module) {\n if (wasm !== undefined) return wasm;\n\n const imports = __wbg_get_imports();\n\n if (!(module instanceof WebAssembly.Module)) {\n module = new WebAssembly.Module(module);\n }\n\n const instance = new WebAssembly.Instance(module, imports);\n\n return __wbg_finalize_init(instance);\n }\n\n const WorkletMessageTypes = {\n SET_SUPPRESSION_LEVEL: 'SET_SUPPRESSION_LEVEL',\n SET_BYPASS: 'SET_BYPASS'\n };\n\n class DeepFilterAudioProcessor extends AudioWorkletProcessor {\n constructor(options) {\n super();\n this.dfModel = null;\n this.inputWritePos = 0;\n this.inputReadPos = 0;\n this.outputWritePos = 0;\n this.outputReadPos = 0;\n this.bypass = false;\n this.isInitialized = false;\n this.tempFrame = null;\n this.bufferSize = 8192;\n this.inputBuffer = new Float32Array(this.bufferSize);\n this.outputBuffer = new Float32Array(this.bufferSize);\n try {\n // Initialize WASM from pre-compiled module\n initSync(options.processorOptions.wasmModule);\n const modelBytes = new Uint8Array(options.processorOptions.modelBytes);\n const handle = df_create(modelBytes, options.processorOptions.suppressionLevel ?? 50);\n const frameLength = df_get_frame_length(handle);\n this.dfModel = { handle, frameLength };\n this.bufferSize = frameLength * 4;\n this.inputBuffer = new Float32Array(this.bufferSize);\n this.outputBuffer = new Float32Array(this.bufferSize);\n // Pre-allocate temp frame buffer for processing\n this.tempFrame = new Float32Array(frameLength);\n this.isInitialized = true;\n this.port.onmessage = (event) => {\n this.handleMessage(event.data);\n };\n }\n catch (error) {\n console.error('Failed to initialize DeepFilter in AudioWorklet:', error);\n this.isInitialized = false;\n }\n }\n handleMessage(data) {\n switch (data.type) {\n case WorkletMessageTypes.SET_SUPPRESSION_LEVEL:\n if (this.dfModel && typeof data.value === 'number') {\n const level = Math.max(0, Math.min(100, Math.floor(data.value)));\n df_set_atten_lim(this.dfModel.handle, level);\n }\n break;\n case WorkletMessageTypes.SET_BYPASS:\n this.bypass = Boolean(data.value);\n break;\n }\n }\n getInputAvailable() {\n return (this.inputWritePos - this.inputReadPos + this.bufferSize) % this.bufferSize;\n }\n getOutputAvailable() {\n return (this.outputWritePos - this.outputReadPos + this.bufferSize) % this.bufferSize;\n }\n process(inputList, outputList) {\n const sourceLimit = Math.min(inputList.length, outputList.length);\n const input = inputList[0]?.[0];\n if (!input) {\n return true;\n }\n // Passthrough mode - copy input to all output channels\n if (!this.isInitialized || !this.dfModel || this.bypass || !this.tempFrame) {\n for (let inputNum = 0; inputNum < sourceLimit; inputNum++) {\n const output = outputList[inputNum];\n const channelCount = output.length;\n for (let channelNum = 0; channelNum < channelCount; channelNum++) {\n output[channelNum].set(input);\n }\n }\n return true;\n }\n // Write input to ring buffer\n for (let i = 0; i < input.length; i++) {\n this.inputBuffer[this.inputWritePos] = input[i];\n this.inputWritePos = (this.inputWritePos + 1) % this.bufferSize;\n }\n const frameLength = this.dfModel.frameLength;\n while (this.getInputAvailable() >= frameLength) {\n // Extract frame from ring buffer\n for (let i = 0; i < frameLength; i++) {\n this.tempFrame[i] = this.inputBuffer[this.inputReadPos];\n this.inputReadPos = (this.inputReadPos + 1) % this.bufferSize;\n }\n const processed = df_process_frame(this.dfModel.handle, this.tempFrame);\n // Write to output ring buffer\n for (let i = 0; i < processed.length; i++) {\n this.outputBuffer[this.outputWritePos] = processed[i];\n this.outputWritePos = (this.outputWritePos + 1) % this.bufferSize;\n }\n }\n const outputAvailable = this.getOutputAvailable();\n if (outputAvailable >= 128) {\n for (let inputNum = 0; inputNum < sourceLimit; inputNum++) {\n const output = outputList[inputNum];\n const channelCount = output.length;\n for (let channelNum = 0; channelNum < channelCount; channelNum++) {\n const outputChannel = output[channelNum];\n let readPos = this.outputReadPos;\n for (let i = 0; i < 128; i++) {\n outputChannel[i] = this.outputBuffer[readPos];\n readPos = (readPos + 1) % this.bufferSize;\n }\n }\n }\n this.outputReadPos = (this.outputReadPos + 128) % this.bufferSize;\n }\n return true;\n }\n }\n registerProcessor('deepfilter-audio-processor', DeepFilterAudioProcessor);\n\n})();\n"; + +class DeepFilterNet3Core { + constructor(config = {}) { + this.assets = null; + this.workletNode = null; + this.isInitialized = false; + this.bypassEnabled = false; + this.config = { + sampleRate: config.sampleRate ?? 48000, + noiseReductionLevel: config.noiseReductionLevel ?? 50, + assetConfig: config.assetConfig + }; + this.assetLoader = getAssetLoader(config.assetConfig); + } + async initialize() { + if (this.isInitialized) + return; + // Fetch and compile WASM on main thread + const assetUrls = this.assetLoader.getAssetUrls(); + const [wasmBytes, modelBytes] = await Promise.all([ + this.assetLoader.fetchAsset(assetUrls.wasm), + this.assetLoader.fetchAsset(assetUrls.model) + ]); + // Compile WASM module + const wasmModule = await WebAssembly.compile(wasmBytes); + this.assets = { wasmModule, modelBytes }; + this.isInitialized = true; + } + async createAudioWorkletNode(audioContext) { + this.ensureInitialized(); + if (!this.assets) { + throw new Error('Assets not loaded'); + } + await createWorkletModule(audioContext, workletCode); + this.workletNode = new AudioWorkletNode(audioContext, 'deepfilter-audio-processor', { + processorOptions: { + wasmModule: this.assets.wasmModule, + modelBytes: this.assets.modelBytes, + suppressionLevel: this.config.noiseReductionLevel + } + }); + return this.workletNode; + } + setSuppressionLevel(level) { + if (!this.workletNode || typeof level !== 'number' || isNaN(level)) + return; + const clampedLevel = Math.max(0, Math.min(100, Math.floor(level))); + this.workletNode.port.postMessage({ + type: WorkletMessageTypes.SET_SUPPRESSION_LEVEL, + value: clampedLevel + }); + } + destroy() { + if (!this.isInitialized) + return; + if (this.workletNode) { + this.workletNode.disconnect(); + this.workletNode = null; + } + this.assets = null; + this.isInitialized = false; + } + isReady() { + return this.isInitialized && this.workletNode !== null; + } + setNoiseSuppressionEnabled(enabled) { + if (!this.workletNode) + return; + this.bypassEnabled = !enabled; + this.workletNode.port.postMessage({ + type: WorkletMessageTypes.SET_BYPASS, + value: !enabled + }); + } + isNoiseSuppressionEnabled() { + return !this.bypassEnabled; + } + ensureInitialized() { + if (!this.isInitialized) { + throw new Error('Processor not initialized. Call initialize() first.'); + } + } +} + +class DeepFilterNoiseFilterProcessor { + constructor(options = {}) { + this.name = 'deepfilternet3-noise-filter'; + this.audioContext = null; + this.sourceNode = null; + this.workletNode = null; + this.destination = null; + this.enabled = true; + this.init = async (opts) => { + const track = opts.track ?? opts.mediaStreamTrack; + if (!track) { + throw new Error('DeepFilterNoiseFilterProcessor.init: missing MediaStreamTrack'); + } + this.originalTrack = track; + await this.ensureGraph(); + }; + this.restart = async (opts) => { + const track = opts.track ?? opts.mediaStreamTrack; + if (track) { + this.originalTrack = track; + } + await this.ensureGraph(); + }; + this.setEnabled = async (enable) => { + this.enabled = enable; + this.processor.setNoiseSuppressionEnabled(enable); + return this.enabled; + }; + this.suspend = async () => { + if (this.audioContext && this.audioContext.state === 'running') { + await this.audioContext.suspend(); + } + }; + this.resume = async () => { + if (this.audioContext && this.audioContext.state === 'suspended') { + await this.audioContext.resume(); + } + }; + this.destroy = async () => { + await this.teardownGraph(); + this.processor.destroy(); + }; + const cfg = { + sampleRate: options.sampleRate ?? 48000, + noiseReductionLevel: options.noiseReductionLevel ?? 80, + assetConfig: options.assetConfig + }; + this.enabled = options.enabled ?? true; + this.processor = new DeepFilterNet3Core(cfg); + } + static isSupported() { + return typeof AudioContext !== 'undefined' && typeof WebAssembly !== 'undefined'; + } + setSuppressionLevel(level) { + this.processor.setSuppressionLevel(level); + } + isEnabled() { + return this.enabled; + } + isNoiseSuppressionEnabled() { + return this.processor.isNoiseSuppressionEnabled(); + } + async ensureGraph() { + if (!this.originalTrack) { + throw new Error('No source track'); + } + this.audioContext ?? (this.audioContext = new AudioContext({ sampleRate: 48000 })); + if (this.audioContext.state !== 'running') { + try { + await this.audioContext.resume(); + } + catch { + // Ignore resume errors + } + } + await this.processor.initialize(); + if (!this.workletNode) { + const node = await this.processor.createAudioWorkletNode(this.audioContext); + this.workletNode = node; + } + if (!this.destination) { + this.destination = this.audioContext.createMediaStreamDestination(); + this.processedTrack = this.destination.stream.getAudioTracks()[0]; + } + if (this.sourceNode) { + this.sourceNode.disconnect(); + } + this.sourceNode = this.audioContext.createMediaStreamSource(new MediaStream([this.originalTrack])); + this.sourceNode.connect(this.workletNode).connect(this.destination); + await this.setEnabled(this.enabled); + } + async teardownGraph() { + try { + if (this.workletNode) { + this.workletNode.disconnect(); + this.workletNode = null; + } + if (this.sourceNode) { + this.sourceNode.disconnect(); + this.sourceNode = null; + } + if (this.destination) { + this.destination.disconnect(); + this.destination = null; + } + if (this.audioContext) { + void this.audioContext.close(); + this.audioContext = null; + } + } + catch { + // Ignore disconnect errors + } + } +} +function DeepFilterNoiseFilter(options) { + return new DeepFilterNoiseFilterProcessor(options); +} + +export { AssetLoader, DeepFilterNet3Core, DeepFilterNoiseFilter, DeepFilterNoiseFilterProcessor, getAssetLoader }; diff --git a/static/app.js b/static/app.js index 4fc0cc5..c57db68 100644 --- a/static/app.js +++ b/static/app.js @@ -23,6 +23,10 @@ const state = { muted: false, sharingVideo: false, sharingScreen: false, + noiseFilterMode: 'deepfilter', + activeNoiseFilter: 'off', + deepFilterProcessor: null, + deepFilterModule: null, viewMode: 'chat', // 'chat' or 'video' iceServers: [{ urls: "stun:stun.l.google.com:19302" }], }, @@ -70,6 +74,7 @@ const el = { vcChannelName: document.getElementById("vc-channel-name"), voiceVideoBtn: document.getElementById("voice-video-btn"), voiceScreenBtn: document.getElementById("voice-screen-btn"), + voiceFilterBtn: document.getElementById("voice-filter-btn"), voiceMuteBtn: document.getElementById("voice-mute-btn"), voiceLeaveBtn: document.getElementById("voice-leave-btn"), videoGrid: document.getElementById("video-grid"), @@ -651,6 +656,10 @@ function shouldInitiateOffer(peerId) { } function stopAndClearAudioPipeline() { + if (state.voice.deepFilterProcessor) { + state.voice.deepFilterProcessor.destroy(); + state.voice.deepFilterProcessor = null; + } if (state.voice.localStream) { for (const track of state.voice.localStream.getTracks()) track.stop(); } @@ -663,6 +672,8 @@ function stopAndClearAudioPipeline() { state.voice.localStream = null; state.voice.rawStream = null; state.voice.audioContext = null; + state.voice.activeNoiseFilter = 'off'; + updateVoiceFilterButton(); } function stopAndClearVideoPipeline() { @@ -730,15 +741,80 @@ function renderVideo(peerId, displayName, stream, source) { videoEl.srcObject = stream; } +function resolveDeepFilterModuleUrl() { + if (location.protocol === 'file:') { + return new URL('vendor/deepfilternet3-noise-filter.esm.js', location.href).toString(); + } + return '/static/vendor/deepfilternet3-noise-filter.esm.js'; +} + +async function getDeepFilterModule() { + if (state.voice.deepFilterModule) return state.voice.deepFilterModule; + const moduleUrl = resolveDeepFilterModuleUrl(); + state.voice.deepFilterModule = await import(moduleUrl); + return state.voice.deepFilterModule; +} + +function updateVoiceFilterButton() { + if (!el.voiceFilterBtn) return; + const requestedMode = state.voice.noiseFilterMode === 'deepfilter' ? 'DeepFilterNet3' : 'Off'; + const activeMode = state.voice.activeNoiseFilter === 'deepfilter' ? 'DeepFilterNet3' : 'Off'; + const activeSuffix = requestedMode === activeMode ? '' : ` (active: ${activeMode})`; + el.voiceFilterBtn.title = `Noise Filter: ${requestedMode}${activeSuffix}`; + el.voiceFilterBtn.innerHTML = state.voice.noiseFilterMode === 'deepfilter' + ? '' + : ''; + el.voiceFilterBtn.style.color = state.voice.noiseFilterMode === 'deepfilter' + ? 'var(--green)' + : 'var(--text-muted)'; + lucide.createIcons(); +} + +async function toggleNoiseFilter() { + state.voice.noiseFilterMode = state.voice.noiseFilterMode === 'deepfilter' ? 'off' : 'deepfilter'; + updateVoiceFilterButton(); + if (!state.voice.joinedChannelId) return; + + try { + await leaveVoice(); + await joinVoice(); + } catch (err) { + console.error("failed to rejoin voice after filter change", err); + } +} + async function buildAudioPipeline(rawStream) { const ctx = new AudioContext(); state.voice.audioContext = ctx; const source = ctx.createMediaStreamSource(rawStream); + let processedSource = source; + state.voice.activeNoiseFilter = 'off'; + + if (state.voice.noiseFilterMode === 'deepfilter') { + try { + const deepFilter = await getDeepFilterModule(); + const processor = new deepFilter.DeepFilterNet3Core({ + sampleRate: 48000, + noiseReductionLevel: 70, + }); + await processor.initialize(); + const workletNode = await processor.createAudioWorkletNode(ctx); + processor.setNoiseSuppressionEnabled(true); + state.voice.deepFilterProcessor = processor; + source.connect(workletNode); + processedSource = workletNode; + state.voice.activeNoiseFilter = 'deepfilter'; + } catch (err) { + console.warn("DeepFilterNet3 unavailable, falling back to raw mic audio", err); + state.voice.activeNoiseFilter = 'off'; + } + } + updateVoiceFilterButton(); // Metering/Speaking detection const analyser = ctx.createAnalyser(); analyser.fftSize = 512; - source.connect(analyser); + processedSource.connect(analyser); const dataArray = new Uint8Array(analyser.frequencyBinCount); let localIsSpeaking = false; @@ -781,17 +857,18 @@ async function buildAudioPipeline(rawStream) { checkVolume(); const destination = ctx.createMediaStreamDestination(); - source.connect(destination); + processedSource.connect(destination); return destination.stream; } async function createLocalVoiceStream() { + const useDeepFilter = state.voice.noiseFilterMode === 'deepfilter'; const constraints = { audio: { channelCount: 1, sampleRate: 48000, echoCancellation: true, - noiseSuppression: true, + noiseSuppression: !useDeepFilter, autoGainControl: false, }, video: false, @@ -1398,8 +1475,10 @@ async function init() { el.voiceVideoBtn.onclick = toggleVideo; el.voiceScreenBtn.onclick = toggleScreenShare; + if (el.voiceFilterBtn) el.voiceFilterBtn.onclick = toggleNoiseFilter; el.voiceMuteBtn.onclick = toggleMute; el.voiceLeaveBtn.onclick = leaveVoice; + updateVoiceFilterButton(); el.addSoundBtn.onclick = () => { el.soundModal.classList.remove("hidden"); diff --git a/static/index.html b/static/index.html index de07abc..c520115 100644 --- a/static/index.html +++ b/static/index.html @@ -96,6 +96,7 @@
+
diff --git a/static/vendor/deepfilternet3-noise-filter.esm.js b/static/vendor/deepfilternet3-noise-filter.esm.js new file mode 100644 index 0000000..7ad3ee9 --- /dev/null +++ b/static/vendor/deepfilternet3-noise-filter.esm.js @@ -0,0 +1,249 @@ +class AssetLoader { + constructor(config = {}) { + this.cdnUrl = config.cdnUrl ?? 'https://cdn.mezon.ai/AI/models/datas/noise_suppression/deepfilternet3'; + } + getCdnUrl(relativePath) { + return `${this.cdnUrl}/${relativePath}`; + } + getAssetUrls() { + return { + wasm: this.getCdnUrl('v2/pkg/df_bg.wasm'), + model: this.getCdnUrl('v2/models/DeepFilterNet3_onnx.tar.gz') + }; + } + async fetchAsset(url) { + const response = await fetch(url); + if (!response.ok) { + throw new Error(`Failed to fetch asset: ${response.statusText}`); + } + return response.arrayBuffer(); + } +} +let defaultLoader = null; +function getAssetLoader(config) { + if (!defaultLoader || config) { + defaultLoader = new AssetLoader(config); + } + return defaultLoader; +} + +/** + * Creates a worklet module URL from inline code string + * This approach works with all bundlers without special configuration + */ +async function createWorkletModule(audioContext, workletCode) { + const blob = new Blob([workletCode], { type: 'application/javascript' }); + const blobUrl = URL.createObjectURL(blob); + await audioContext.audioWorklet.addModule(blobUrl); +} + +const WorkletMessageTypes = { + SET_SUPPRESSION_LEVEL: 'SET_SUPPRESSION_LEVEL', + SET_BYPASS: 'SET_BYPASS' +}; + +var workletCode = "(function () {\n 'use strict';\n\n let wasm;\n\n const heap = new Array(128).fill(undefined);\n\n heap.push(undefined, null, true, false);\n\n function getObject(idx) { return heap[idx]; }\n\n let heap_next = heap.length;\n\n function dropObject(idx) {\n if (idx < 132) return;\n heap[idx] = heap_next;\n heap_next = idx;\n }\n\n function takeObject(idx) {\n const ret = getObject(idx);\n dropObject(idx);\n return ret;\n }\n\n const cachedTextDecoder = (typeof TextDecoder !== 'undefined' ? new TextDecoder('utf-8', { ignoreBOM: true, fatal: true }) : { decode: () => { throw Error('TextDecoder not available') } } );\n\n if (typeof TextDecoder !== 'undefined') { cachedTextDecoder.decode(); }\n let cachedUint8Memory0 = null;\n\n function getUint8Memory0() {\n if (cachedUint8Memory0 === null || cachedUint8Memory0.byteLength === 0) {\n cachedUint8Memory0 = new Uint8Array(wasm.memory.buffer);\n }\n return cachedUint8Memory0;\n }\n\n function getStringFromWasm0(ptr, len) {\n ptr = ptr >>> 0;\n return cachedTextDecoder.decode(getUint8Memory0().subarray(ptr, ptr + len));\n }\n\n function addHeapObject(obj) {\n if (heap_next === heap.length) heap.push(heap.length + 1);\n const idx = heap_next;\n heap_next = heap[idx];\n\n heap[idx] = obj;\n return idx;\n }\n /**\n * Set DeepFilterNet attenuation limit.\n *\n * Args:\n * - lim_db: New attenuation limit in dB.\n * @param {number} st\n * @param {number} lim_db\n */\n function df_set_atten_lim(st, lim_db) {\n wasm.df_set_atten_lim(st, lim_db);\n }\n\n /**\n * Get DeepFilterNet frame size in samples.\n * @param {number} st\n * @returns {number}\n */\n function df_get_frame_length(st) {\n const ret = wasm.df_get_frame_length(st);\n return ret >>> 0;\n }\n\n let WASM_VECTOR_LEN = 0;\n\n function passArray8ToWasm0(arg, malloc) {\n const ptr = malloc(arg.length * 1, 1) >>> 0;\n getUint8Memory0().set(arg, ptr / 1);\n WASM_VECTOR_LEN = arg.length;\n return ptr;\n }\n /**\n * Create a DeepFilterNet Model\n *\n * Args:\n * - path: File path to a DeepFilterNet tar.gz onnx model\n * - atten_lim: Attenuation limit in dB.\n *\n * Returns:\n * - DF state doing the full processing: stft, DNN noise reduction, istft.\n * @param {Uint8Array} model_bytes\n * @param {number} atten_lim\n * @returns {number}\n */\n function df_create(model_bytes, atten_lim) {\n const ptr0 = passArray8ToWasm0(model_bytes, wasm.__wbindgen_malloc);\n const len0 = WASM_VECTOR_LEN;\n const ret = wasm.df_create(ptr0, len0, atten_lim);\n return ret >>> 0;\n }\n\n let cachedFloat32Memory0 = null;\n\n function getFloat32Memory0() {\n if (cachedFloat32Memory0 === null || cachedFloat32Memory0.byteLength === 0) {\n cachedFloat32Memory0 = new Float32Array(wasm.memory.buffer);\n }\n return cachedFloat32Memory0;\n }\n\n function passArrayF32ToWasm0(arg, malloc) {\n const ptr = malloc(arg.length * 4, 4) >>> 0;\n getFloat32Memory0().set(arg, ptr / 4);\n WASM_VECTOR_LEN = arg.length;\n return ptr;\n }\n /**\n * Processes a chunk of samples.\n *\n * Args:\n * - df_state: Created via df_create()\n * - input: Input buffer of length df_get_frame_length()\n * - output: Output buffer of length df_get_frame_length()\n *\n * Returns:\n * - Local SNR of the current frame.\n * @param {number} st\n * @param {Float32Array} input\n * @returns {Float32Array}\n */\n function df_process_frame(st, input) {\n const ptr0 = passArrayF32ToWasm0(input, wasm.__wbindgen_malloc);\n const len0 = WASM_VECTOR_LEN;\n const ret = wasm.df_process_frame(st, ptr0, len0);\n return takeObject(ret);\n }\n\n function handleError(f, args) {\n try {\n return f.apply(this, args);\n } catch (e) {\n wasm.__wbindgen_exn_store(addHeapObject(e));\n }\n }\n\n (typeof FinalizationRegistry === 'undefined')\n ? { }\n : new FinalizationRegistry(ptr => wasm.__wbg_dfstate_free(ptr >>> 0));\n\n function __wbg_get_imports() {\n const imports = {};\n imports.wbg = {};\n imports.wbg.__wbindgen_object_drop_ref = function(arg0) {\n takeObject(arg0);\n };\n imports.wbg.__wbg_crypto_566d7465cdbb6b7a = function(arg0) {\n const ret = getObject(arg0).crypto;\n return addHeapObject(ret);\n };\n imports.wbg.__wbindgen_is_object = function(arg0) {\n const val = getObject(arg0);\n const ret = typeof(val) === 'object' && val !== null;\n return ret;\n };\n imports.wbg.__wbg_process_dc09a8c7d59982f6 = function(arg0) {\n const ret = getObject(arg0).process;\n return addHeapObject(ret);\n };\n imports.wbg.__wbg_versions_d98c6400c6ca2bd8 = function(arg0) {\n const ret = getObject(arg0).versions;\n return addHeapObject(ret);\n };\n imports.wbg.__wbg_node_caaf83d002149bd5 = function(arg0) {\n const ret = getObject(arg0).node;\n return addHeapObject(ret);\n };\n imports.wbg.__wbindgen_is_string = function(arg0) {\n const ret = typeof(getObject(arg0)) === 'string';\n return ret;\n };\n imports.wbg.__wbg_require_94a9da52636aacbf = function() { return handleError(function () {\n const ret = module.require;\n return addHeapObject(ret);\n }, arguments) };\n imports.wbg.__wbindgen_is_function = function(arg0) {\n const ret = typeof(getObject(arg0)) === 'function';\n return ret;\n };\n imports.wbg.__wbindgen_string_new = function(arg0, arg1) {\n const ret = getStringFromWasm0(arg0, arg1);\n return addHeapObject(ret);\n };\n imports.wbg.__wbg_msCrypto_0b84745e9245cdf6 = function(arg0) {\n const ret = getObject(arg0).msCrypto;\n return addHeapObject(ret);\n };\n imports.wbg.__wbg_randomFillSync_290977693942bf03 = function() { return handleError(function (arg0, arg1) {\n getObject(arg0).randomFillSync(takeObject(arg1));\n }, arguments) };\n imports.wbg.__wbg_getRandomValues_260cc23a41afad9a = function() { return handleError(function (arg0, arg1) {\n getObject(arg0).getRandomValues(getObject(arg1));\n }, arguments) };\n imports.wbg.__wbg_newnoargs_e258087cd0daa0ea = function(arg0, arg1) {\n const ret = new Function(getStringFromWasm0(arg0, arg1));\n return addHeapObject(ret);\n };\n imports.wbg.__wbg_new_63b92bc8671ed464 = function(arg0) {\n const ret = new Uint8Array(getObject(arg0));\n return addHeapObject(ret);\n };\n imports.wbg.__wbg_new_9efabd6b6d2ce46d = function(arg0) {\n const ret = new Float32Array(getObject(arg0));\n return addHeapObject(ret);\n };\n imports.wbg.__wbg_buffer_12d079cc21e14bdb = function(arg0) {\n const ret = getObject(arg0).buffer;\n return addHeapObject(ret);\n };\n imports.wbg.__wbg_newwithbyteoffsetandlength_aa4a17c33a06e5cb = function(arg0, arg1, arg2) {\n const ret = new Uint8Array(getObject(arg0), arg1 >>> 0, arg2 >>> 0);\n return addHeapObject(ret);\n };\n imports.wbg.__wbg_newwithlength_e9b4878cebadb3d3 = function(arg0) {\n const ret = new Uint8Array(arg0 >>> 0);\n return addHeapObject(ret);\n };\n imports.wbg.__wbg_set_a47bac70306a19a7 = function(arg0, arg1, arg2) {\n getObject(arg0).set(getObject(arg1), arg2 >>> 0);\n };\n imports.wbg.__wbg_subarray_a1f73cd4b5b42fe1 = function(arg0, arg1, arg2) {\n const ret = getObject(arg0).subarray(arg1 >>> 0, arg2 >>> 0);\n return addHeapObject(ret);\n };\n imports.wbg.__wbg_newwithbyteoffsetandlength_4a659d079a1650e0 = function(arg0, arg1, arg2) {\n const ret = new Float32Array(getObject(arg0), arg1 >>> 0, arg2 >>> 0);\n return addHeapObject(ret);\n };\n imports.wbg.__wbg_self_ce0dbfc45cf2f5be = function() { return handleError(function () {\n const ret = self.self;\n return addHeapObject(ret);\n }, arguments) };\n imports.wbg.__wbg_window_c6fb939a7f436783 = function() { return handleError(function () {\n const ret = window.window;\n return addHeapObject(ret);\n }, arguments) };\n imports.wbg.__wbg_globalThis_d1e6af4856ba331b = function() { return handleError(function () {\n const ret = globalThis.globalThis;\n return addHeapObject(ret);\n }, arguments) };\n imports.wbg.__wbg_global_207b558942527489 = function() { return handleError(function () {\n const ret = global.global;\n return addHeapObject(ret);\n }, arguments) };\n imports.wbg.__wbindgen_is_undefined = function(arg0) {\n const ret = getObject(arg0) === undefined;\n return ret;\n };\n imports.wbg.__wbg_call_27c0f87801dedf93 = function() { return handleError(function (arg0, arg1) {\n const ret = getObject(arg0).call(getObject(arg1));\n return addHeapObject(ret);\n }, arguments) };\n imports.wbg.__wbindgen_object_clone_ref = function(arg0) {\n const ret = getObject(arg0);\n return addHeapObject(ret);\n };\n imports.wbg.__wbg_call_b3ca7c6051f9bec1 = function() { return handleError(function (arg0, arg1, arg2) {\n const ret = getObject(arg0).call(getObject(arg1), getObject(arg2));\n return addHeapObject(ret);\n }, arguments) };\n imports.wbg.__wbindgen_memory = function() {\n const ret = wasm.memory;\n return addHeapObject(ret);\n };\n imports.wbg.__wbindgen_throw = function(arg0, arg1) {\n throw new Error(getStringFromWasm0(arg0, arg1));\n };\n\n return imports;\n }\n\n function __wbg_finalize_init(instance, module) {\n wasm = instance.exports;\n cachedFloat32Memory0 = null;\n cachedUint8Memory0 = null;\n\n\n return wasm;\n }\n\n function initSync(module) {\n if (wasm !== undefined) return wasm;\n\n const imports = __wbg_get_imports();\n\n if (!(module instanceof WebAssembly.Module)) {\n module = new WebAssembly.Module(module);\n }\n\n const instance = new WebAssembly.Instance(module, imports);\n\n return __wbg_finalize_init(instance);\n }\n\n const WorkletMessageTypes = {\n SET_SUPPRESSION_LEVEL: 'SET_SUPPRESSION_LEVEL',\n SET_BYPASS: 'SET_BYPASS'\n };\n\n class DeepFilterAudioProcessor extends AudioWorkletProcessor {\n constructor(options) {\n super();\n this.dfModel = null;\n this.inputWritePos = 0;\n this.inputReadPos = 0;\n this.outputWritePos = 0;\n this.outputReadPos = 0;\n this.bypass = false;\n this.isInitialized = false;\n this.tempFrame = null;\n this.bufferSize = 8192;\n this.inputBuffer = new Float32Array(this.bufferSize);\n this.outputBuffer = new Float32Array(this.bufferSize);\n try {\n // Initialize WASM from pre-compiled module\n initSync(options.processorOptions.wasmModule);\n const modelBytes = new Uint8Array(options.processorOptions.modelBytes);\n const handle = df_create(modelBytes, options.processorOptions.suppressionLevel ?? 50);\n const frameLength = df_get_frame_length(handle);\n this.dfModel = { handle, frameLength };\n this.bufferSize = frameLength * 4;\n this.inputBuffer = new Float32Array(this.bufferSize);\n this.outputBuffer = new Float32Array(this.bufferSize);\n // Pre-allocate temp frame buffer for processing\n this.tempFrame = new Float32Array(frameLength);\n this.isInitialized = true;\n this.port.onmessage = (event) => {\n this.handleMessage(event.data);\n };\n }\n catch (error) {\n console.error('Failed to initialize DeepFilter in AudioWorklet:', error);\n this.isInitialized = false;\n }\n }\n handleMessage(data) {\n switch (data.type) {\n case WorkletMessageTypes.SET_SUPPRESSION_LEVEL:\n if (this.dfModel && typeof data.value === 'number') {\n const level = Math.max(0, Math.min(100, Math.floor(data.value)));\n df_set_atten_lim(this.dfModel.handle, level);\n }\n break;\n case WorkletMessageTypes.SET_BYPASS:\n this.bypass = Boolean(data.value);\n break;\n }\n }\n getInputAvailable() {\n return (this.inputWritePos - this.inputReadPos + this.bufferSize) % this.bufferSize;\n }\n getOutputAvailable() {\n return (this.outputWritePos - this.outputReadPos + this.bufferSize) % this.bufferSize;\n }\n process(inputList, outputList) {\n const sourceLimit = Math.min(inputList.length, outputList.length);\n const input = inputList[0]?.[0];\n if (!input) {\n return true;\n }\n // Passthrough mode - copy input to all output channels\n if (!this.isInitialized || !this.dfModel || this.bypass || !this.tempFrame) {\n for (let inputNum = 0; inputNum < sourceLimit; inputNum++) {\n const output = outputList[inputNum];\n const channelCount = output.length;\n for (let channelNum = 0; channelNum < channelCount; channelNum++) {\n output[channelNum].set(input);\n }\n }\n return true;\n }\n // Write input to ring buffer\n for (let i = 0; i < input.length; i++) {\n this.inputBuffer[this.inputWritePos] = input[i];\n this.inputWritePos = (this.inputWritePos + 1) % this.bufferSize;\n }\n const frameLength = this.dfModel.frameLength;\n while (this.getInputAvailable() >= frameLength) {\n // Extract frame from ring buffer\n for (let i = 0; i < frameLength; i++) {\n this.tempFrame[i] = this.inputBuffer[this.inputReadPos];\n this.inputReadPos = (this.inputReadPos + 1) % this.bufferSize;\n }\n const processed = df_process_frame(this.dfModel.handle, this.tempFrame);\n // Write to output ring buffer\n for (let i = 0; i < processed.length; i++) {\n this.outputBuffer[this.outputWritePos] = processed[i];\n this.outputWritePos = (this.outputWritePos + 1) % this.bufferSize;\n }\n }\n const outputAvailable = this.getOutputAvailable();\n if (outputAvailable >= 128) {\n for (let inputNum = 0; inputNum < sourceLimit; inputNum++) {\n const output = outputList[inputNum];\n const channelCount = output.length;\n for (let channelNum = 0; channelNum < channelCount; channelNum++) {\n const outputChannel = output[channelNum];\n let readPos = this.outputReadPos;\n for (let i = 0; i < 128; i++) {\n outputChannel[i] = this.outputBuffer[readPos];\n readPos = (readPos + 1) % this.bufferSize;\n }\n }\n }\n this.outputReadPos = (this.outputReadPos + 128) % this.bufferSize;\n }\n return true;\n }\n }\n registerProcessor('deepfilter-audio-processor', DeepFilterAudioProcessor);\n\n})();\n"; + +class DeepFilterNet3Core { + constructor(config = {}) { + this.assets = null; + this.workletNode = null; + this.isInitialized = false; + this.bypassEnabled = false; + this.config = { + sampleRate: config.sampleRate ?? 48000, + noiseReductionLevel: config.noiseReductionLevel ?? 50, + assetConfig: config.assetConfig + }; + this.assetLoader = getAssetLoader(config.assetConfig); + } + async initialize() { + if (this.isInitialized) + return; + // Fetch and compile WASM on main thread + const assetUrls = this.assetLoader.getAssetUrls(); + const [wasmBytes, modelBytes] = await Promise.all([ + this.assetLoader.fetchAsset(assetUrls.wasm), + this.assetLoader.fetchAsset(assetUrls.model) + ]); + // Compile WASM module + const wasmModule = await WebAssembly.compile(wasmBytes); + this.assets = { wasmModule, modelBytes }; + this.isInitialized = true; + } + async createAudioWorkletNode(audioContext) { + this.ensureInitialized(); + if (!this.assets) { + throw new Error('Assets not loaded'); + } + await createWorkletModule(audioContext, workletCode); + this.workletNode = new AudioWorkletNode(audioContext, 'deepfilter-audio-processor', { + processorOptions: { + wasmModule: this.assets.wasmModule, + modelBytes: this.assets.modelBytes, + suppressionLevel: this.config.noiseReductionLevel + } + }); + return this.workletNode; + } + setSuppressionLevel(level) { + if (!this.workletNode || typeof level !== 'number' || isNaN(level)) + return; + const clampedLevel = Math.max(0, Math.min(100, Math.floor(level))); + this.workletNode.port.postMessage({ + type: WorkletMessageTypes.SET_SUPPRESSION_LEVEL, + value: clampedLevel + }); + } + destroy() { + if (!this.isInitialized) + return; + if (this.workletNode) { + this.workletNode.disconnect(); + this.workletNode = null; + } + this.assets = null; + this.isInitialized = false; + } + isReady() { + return this.isInitialized && this.workletNode !== null; + } + setNoiseSuppressionEnabled(enabled) { + if (!this.workletNode) + return; + this.bypassEnabled = !enabled; + this.workletNode.port.postMessage({ + type: WorkletMessageTypes.SET_BYPASS, + value: !enabled + }); + } + isNoiseSuppressionEnabled() { + return !this.bypassEnabled; + } + ensureInitialized() { + if (!this.isInitialized) { + throw new Error('Processor not initialized. Call initialize() first.'); + } + } +} + +class DeepFilterNoiseFilterProcessor { + constructor(options = {}) { + this.name = 'deepfilternet3-noise-filter'; + this.audioContext = null; + this.sourceNode = null; + this.workletNode = null; + this.destination = null; + this.enabled = true; + this.init = async (opts) => { + const track = opts.track ?? opts.mediaStreamTrack; + if (!track) { + throw new Error('DeepFilterNoiseFilterProcessor.init: missing MediaStreamTrack'); + } + this.originalTrack = track; + await this.ensureGraph(); + }; + this.restart = async (opts) => { + const track = opts.track ?? opts.mediaStreamTrack; + if (track) { + this.originalTrack = track; + } + await this.ensureGraph(); + }; + this.setEnabled = async (enable) => { + this.enabled = enable; + this.processor.setNoiseSuppressionEnabled(enable); + return this.enabled; + }; + this.suspend = async () => { + if (this.audioContext && this.audioContext.state === 'running') { + await this.audioContext.suspend(); + } + }; + this.resume = async () => { + if (this.audioContext && this.audioContext.state === 'suspended') { + await this.audioContext.resume(); + } + }; + this.destroy = async () => { + await this.teardownGraph(); + this.processor.destroy(); + }; + const cfg = { + sampleRate: options.sampleRate ?? 48000, + noiseReductionLevel: options.noiseReductionLevel ?? 80, + assetConfig: options.assetConfig + }; + this.enabled = options.enabled ?? true; + this.processor = new DeepFilterNet3Core(cfg); + } + static isSupported() { + return typeof AudioContext !== 'undefined' && typeof WebAssembly !== 'undefined'; + } + setSuppressionLevel(level) { + this.processor.setSuppressionLevel(level); + } + isEnabled() { + return this.enabled; + } + isNoiseSuppressionEnabled() { + return this.processor.isNoiseSuppressionEnabled(); + } + async ensureGraph() { + if (!this.originalTrack) { + throw new Error('No source track'); + } + this.audioContext ?? (this.audioContext = new AudioContext({ sampleRate: 48000 })); + if (this.audioContext.state !== 'running') { + try { + await this.audioContext.resume(); + } + catch { + // Ignore resume errors + } + } + await this.processor.initialize(); + if (!this.workletNode) { + const node = await this.processor.createAudioWorkletNode(this.audioContext); + this.workletNode = node; + } + if (!this.destination) { + this.destination = this.audioContext.createMediaStreamDestination(); + this.processedTrack = this.destination.stream.getAudioTracks()[0]; + } + if (this.sourceNode) { + this.sourceNode.disconnect(); + } + this.sourceNode = this.audioContext.createMediaStreamSource(new MediaStream([this.originalTrack])); + this.sourceNode.connect(this.workletNode).connect(this.destination); + await this.setEnabled(this.enabled); + } + async teardownGraph() { + try { + if (this.workletNode) { + this.workletNode.disconnect(); + this.workletNode = null; + } + if (this.sourceNode) { + this.sourceNode.disconnect(); + this.sourceNode = null; + } + if (this.destination) { + this.destination.disconnect(); + this.destination = null; + } + if (this.audioContext) { + void this.audioContext.close(); + this.audioContext = null; + } + } + catch { + // Ignore disconnect errors + } + } +} +function DeepFilterNoiseFilter(options) { + return new DeepFilterNoiseFilterProcessor(options); +} + +export { AssetLoader, DeepFilterNet3Core, DeepFilterNoiseFilter, DeepFilterNoiseFilterProcessor, getAssetLoader }; From 4d1bea502a1e900271044f0b3526196be99ecd91 Mon Sep 17 00:00:00 2001 From: pavel Date: Wed, 25 Feb 2026 18:42:28 +0100 Subject: [PATCH 07/44] dfn --- desktop/app.js | 34 ---------------------------------- desktop/index.html | 1 - static/app.js | 33 --------------------------------- static/index.html | 1 - 4 files changed, 69 deletions(-) diff --git a/desktop/app.js b/desktop/app.js index 25bc725..cc42f0d 100644 --- a/desktop/app.js +++ b/desktop/app.js @@ -118,7 +118,6 @@ const el = { vcChannelName: document.getElementById("vc-channel-name"), voiceVideoBtn: document.getElementById("voice-video-btn"), voiceScreenBtn: document.getElementById("voice-screen-btn"), - voiceFilterBtn: document.getElementById("voice-filter-btn"), voiceMuteBtn: document.getElementById("voice-mute-btn"), voiceLeaveBtn: document.getElementById("voice-leave-btn"), videoGrid: document.getElementById("video-grid"), @@ -725,7 +724,6 @@ function stopAndClearAudioPipeline() { state.voice.rawStream = null; state.voice.audioContext = null; state.voice.activeNoiseFilter = 'off'; - updateVoiceFilterButton(); } function stopAndClearVideoPipeline() { @@ -819,8 +817,6 @@ async function buildAudioPipeline(rawStream) { state.voice.activeNoiseFilter = 'off'; } } - updateVoiceFilterButton(); - // Metering/Speaking detection const analyser = ctx.createAnalyser(); analyser.fftSize = 512; @@ -885,34 +881,6 @@ async function getDeepFilterModule() { return state.voice.deepFilterModule; } -function updateVoiceFilterButton() { - if (!el.voiceFilterBtn) return; - const requestedMode = state.voice.noiseFilterMode === 'deepfilter' ? 'DeepFilterNet3' : 'Off'; - const activeMode = state.voice.activeNoiseFilter === 'deepfilter' ? 'DeepFilterNet3' : 'Off'; - const activeSuffix = requestedMode === activeMode ? '' : ` (active: ${activeMode})`; - el.voiceFilterBtn.title = `Noise Filter: ${requestedMode}${activeSuffix}`; - el.voiceFilterBtn.innerHTML = state.voice.noiseFilterMode === 'deepfilter' - ? '' - : ''; - el.voiceFilterBtn.style.color = state.voice.noiseFilterMode === 'deepfilter' - ? 'var(--green)' - : 'var(--text-muted)'; - lucide.createIcons(); -} - -async function toggleNoiseFilter() { - state.voice.noiseFilterMode = state.voice.noiseFilterMode === 'deepfilter' ? 'off' : 'deepfilter'; - updateVoiceFilterButton(); - if (!state.voice.joinedChannelId) return; - - try { - await leaveVoice(); - await joinVoice(); - } catch (err) { - console.error("failed to rejoin voice after filter change", err); - } -} - async function createLocalVoiceStream() { const useDeepFilter = state.voice.noiseFilterMode === 'deepfilter'; const constraints = { @@ -1532,10 +1500,8 @@ async function init() { el.voiceVideoBtn.onclick = toggleVideo; el.voiceScreenBtn.onclick = toggleScreenShare; - if (el.voiceFilterBtn) el.voiceFilterBtn.onclick = toggleNoiseFilter; el.voiceMuteBtn.onclick = toggleMute; el.voiceLeaveBtn.onclick = leaveVoice; - updateVoiceFilterButton(); el.addSoundBtn.onclick = () => { el.soundModal.classList.remove("hidden"); diff --git a/desktop/index.html b/desktop/index.html index c92f049..2bd8957 100644 --- a/desktop/index.html +++ b/desktop/index.html @@ -91,7 +91,6 @@
-
diff --git a/static/app.js b/static/app.js index c57db68..9abc973 100644 --- a/static/app.js +++ b/static/app.js @@ -74,7 +74,6 @@ const el = { vcChannelName: document.getElementById("vc-channel-name"), voiceVideoBtn: document.getElementById("voice-video-btn"), voiceScreenBtn: document.getElementById("voice-screen-btn"), - voiceFilterBtn: document.getElementById("voice-filter-btn"), voiceMuteBtn: document.getElementById("voice-mute-btn"), voiceLeaveBtn: document.getElementById("voice-leave-btn"), videoGrid: document.getElementById("video-grid"), @@ -673,7 +672,6 @@ function stopAndClearAudioPipeline() { state.voice.rawStream = null; state.voice.audioContext = null; state.voice.activeNoiseFilter = 'off'; - updateVoiceFilterButton(); } function stopAndClearVideoPipeline() { @@ -755,34 +753,6 @@ async function getDeepFilterModule() { return state.voice.deepFilterModule; } -function updateVoiceFilterButton() { - if (!el.voiceFilterBtn) return; - const requestedMode = state.voice.noiseFilterMode === 'deepfilter' ? 'DeepFilterNet3' : 'Off'; - const activeMode = state.voice.activeNoiseFilter === 'deepfilter' ? 'DeepFilterNet3' : 'Off'; - const activeSuffix = requestedMode === activeMode ? '' : ` (active: ${activeMode})`; - el.voiceFilterBtn.title = `Noise Filter: ${requestedMode}${activeSuffix}`; - el.voiceFilterBtn.innerHTML = state.voice.noiseFilterMode === 'deepfilter' - ? '' - : ''; - el.voiceFilterBtn.style.color = state.voice.noiseFilterMode === 'deepfilter' - ? 'var(--green)' - : 'var(--text-muted)'; - lucide.createIcons(); -} - -async function toggleNoiseFilter() { - state.voice.noiseFilterMode = state.voice.noiseFilterMode === 'deepfilter' ? 'off' : 'deepfilter'; - updateVoiceFilterButton(); - if (!state.voice.joinedChannelId) return; - - try { - await leaveVoice(); - await joinVoice(); - } catch (err) { - console.error("failed to rejoin voice after filter change", err); - } -} - async function buildAudioPipeline(rawStream) { const ctx = new AudioContext(); state.voice.audioContext = ctx; @@ -809,7 +779,6 @@ async function buildAudioPipeline(rawStream) { state.voice.activeNoiseFilter = 'off'; } } - updateVoiceFilterButton(); // Metering/Speaking detection const analyser = ctx.createAnalyser(); @@ -1475,10 +1444,8 @@ async function init() { el.voiceVideoBtn.onclick = toggleVideo; el.voiceScreenBtn.onclick = toggleScreenShare; - if (el.voiceFilterBtn) el.voiceFilterBtn.onclick = toggleNoiseFilter; el.voiceMuteBtn.onclick = toggleMute; el.voiceLeaveBtn.onclick = leaveVoice; - updateVoiceFilterButton(); el.addSoundBtn.onclick = () => { el.soundModal.classList.remove("hidden"); diff --git a/static/index.html b/static/index.html index c520115..de07abc 100644 --- a/static/index.html +++ b/static/index.html @@ -96,7 +96,6 @@
-
From 72a10ad32b3dcc59bd08bcb4a9bb0549916a8702 Mon Sep 17 00:00:00 2001 From: pavel Date: Wed, 25 Feb 2026 18:46:24 +0100 Subject: [PATCH 08/44] activity --- desktop/app.js | 55 ++++++++++++++++++++++++++++++++++++-------------- static/app.js | 55 ++++++++++++++++++++++++++++++++++++-------------- 2 files changed, 80 insertions(+), 30 deletions(-) diff --git a/desktop/app.js b/desktop/app.js index cc42f0d..483ae11 100644 --- a/desktop/app.js +++ b/desktop/app.js @@ -817,31 +817,56 @@ async function buildAudioPipeline(rawStream) { state.voice.activeNoiseFilter = 'off'; } } - // Metering/Speaking detection + // Metering/Speaking detection with adaptive threshold and hysteresis. const analyser = ctx.createAnalyser(); - analyser.fftSize = 512; + analyser.fftSize = 1024; processedSource.connect(analyser); - const dataArray = new Uint8Array(analyser.frequencyBinCount); + const timeData = new Float32Array(analyser.fftSize); let localIsSpeaking = false; - let speakCounter = 0; + let speechFrames = 0; + let silenceFrames = 0; + let noiseFloor = 0.004; + let levelEma = 0; const checkVolume = () => { if (!state.voice.audioContext || state.voice.audioContext.state === 'closed') return; - analyser.getByteFrequencyData(dataArray); - let sum = 0; - for (let i = 0; i < dataArray.length; i++) sum += dataArray[i]; - const avg = sum / dataArray.length; - const isCurrentlySpeaking = avg > 30; // Calibrated for normal speech + analyser.getFloatTimeDomainData(timeData); - if (isCurrentlySpeaking) { - speakCounter = Math.min(speakCounter + 1, 5); - } else { - speakCounter = Math.max(speakCounter - 1, 0); + let sumSquares = 0; + let peak = 0; + for (let i = 0; i < timeData.length; i++) { + const v = timeData[i]; + sumSquares += v * v; + const abs = Math.abs(v); + if (abs > peak) peak = abs; } - const newSpeakingState = speakCounter >= 2; + const rms = Math.sqrt(sumSquares / timeData.length); + const level = Math.max(rms, peak * 0.5); + levelEma = levelEma * 0.75 + level * 0.25; + + if (!localIsSpeaking) { + // Learn room noise slowly while idle. + noiseFloor = noiseFloor * 0.98 + levelEma * 0.02; + } else { + // Do not let noise floor jump up while speaking. + noiseFloor = Math.min(noiseFloor, levelEma); + } + + const startThreshold = Math.max(noiseFloor * 2.2, 0.010); + const stopThreshold = Math.max(noiseFloor * 1.5, 0.006); + + if (levelEma > startThreshold) { + speechFrames = Math.min(speechFrames + 1, 8); + silenceFrames = 0; + } else if (levelEma < stopThreshold) { + silenceFrames = Math.min(silenceFrames + 1, 8); + speechFrames = Math.max(speechFrames - 1, 0); + } + + const newSpeakingState = localIsSpeaking ? silenceFrames < 3 : speechFrames >= 2; if (newSpeakingState !== localIsSpeaking) { localIsSpeaking = newSpeakingState; @@ -858,7 +883,7 @@ async function buildAudioPipeline(rawStream) { myVideo.parentElement.classList.toggle('speaking', localIsSpeaking); } } - setTimeout(checkVolume, 100); + setTimeout(checkVolume, 60); }; checkVolume(); diff --git a/static/app.js b/static/app.js index 9abc973..fa7f533 100644 --- a/static/app.js +++ b/static/app.js @@ -780,31 +780,56 @@ async function buildAudioPipeline(rawStream) { } } - // Metering/Speaking detection + // Metering/Speaking detection with adaptive threshold and hysteresis. const analyser = ctx.createAnalyser(); - analyser.fftSize = 512; + analyser.fftSize = 1024; processedSource.connect(analyser); - const dataArray = new Uint8Array(analyser.frequencyBinCount); + const timeData = new Float32Array(analyser.fftSize); let localIsSpeaking = false; - let speakCounter = 0; + let speechFrames = 0; + let silenceFrames = 0; + let noiseFloor = 0.004; + let levelEma = 0; const checkVolume = () => { if (!state.voice.audioContext || state.voice.audioContext.state === 'closed') return; - analyser.getByteFrequencyData(dataArray); - let sum = 0; - for (let i = 0; i < dataArray.length; i++) sum += dataArray[i]; - const avg = sum / dataArray.length; - const isCurrentlySpeaking = avg > 30; // Calibrated for normal speech + analyser.getFloatTimeDomainData(timeData); - if (isCurrentlySpeaking) { - speakCounter = Math.min(speakCounter + 1, 5); - } else { - speakCounter = Math.max(speakCounter - 1, 0); + let sumSquares = 0; + let peak = 0; + for (let i = 0; i < timeData.length; i++) { + const v = timeData[i]; + sumSquares += v * v; + const abs = Math.abs(v); + if (abs > peak) peak = abs; } - const newSpeakingState = speakCounter >= 2; + const rms = Math.sqrt(sumSquares / timeData.length); + const level = Math.max(rms, peak * 0.5); + levelEma = levelEma * 0.75 + level * 0.25; + + if (!localIsSpeaking) { + // Learn room noise slowly while idle. + noiseFloor = noiseFloor * 0.98 + levelEma * 0.02; + } else { + // Do not let noise floor jump up while speaking. + noiseFloor = Math.min(noiseFloor, levelEma); + } + + const startThreshold = Math.max(noiseFloor * 2.2, 0.010); + const stopThreshold = Math.max(noiseFloor * 1.5, 0.006); + + if (levelEma > startThreshold) { + speechFrames = Math.min(speechFrames + 1, 8); + silenceFrames = 0; + } else if (levelEma < stopThreshold) { + silenceFrames = Math.min(silenceFrames + 1, 8); + speechFrames = Math.max(speechFrames - 1, 0); + } + + const newSpeakingState = localIsSpeaking ? silenceFrames < 3 : speechFrames >= 2; if (newSpeakingState !== localIsSpeaking) { localIsSpeaking = newSpeakingState; @@ -821,7 +846,7 @@ async function buildAudioPipeline(rawStream) { myVideo.parentElement.classList.toggle('speaking', localIsSpeaking); } } - setTimeout(checkVolume, 100); + setTimeout(checkVolume, 60); }; checkVolume(); From b7416c7c2b37c5e62e336b9dcbf0f065c9b8acde Mon Sep 17 00:00:00 2001 From: pavel Date: Wed, 25 Feb 2026 19:41:33 +0100 Subject: [PATCH 09/44] fix --- desktop/app.js | 28 +++++++++++++++++++++++----- static/app.js | 28 +++++++++++++++++++++++----- 2 files changed, 46 insertions(+), 10 deletions(-) diff --git a/desktop/app.js b/desktop/app.js index 483ae11..9f38df5 100644 --- a/desktop/app.js +++ b/desktop/app.js @@ -822,7 +822,8 @@ async function buildAudioPipeline(rawStream) { analyser.fftSize = 1024; processedSource.connect(analyser); - const timeData = new Float32Array(analyser.fftSize); + const supportsFloatTimeDomain = typeof analyser.getFloatTimeDomainData === 'function'; + const timeData = supportsFloatTimeDomain ? new Float32Array(analyser.fftSize) : new Uint8Array(analyser.fftSize); let localIsSpeaking = false; let speechFrames = 0; let silenceFrames = 0; @@ -832,12 +833,23 @@ async function buildAudioPipeline(rawStream) { const checkVolume = () => { if (!state.voice.audioContext || state.voice.audioContext.state === 'closed') return; - analyser.getFloatTimeDomainData(timeData); + try { + if (supportsFloatTimeDomain) { + analyser.getFloatTimeDomainData(timeData); + } else { + analyser.getByteTimeDomainData(timeData); + } + } catch (err) { + setTimeout(checkVolume, 60); + return; + } let sumSquares = 0; let peak = 0; for (let i = 0; i < timeData.length; i++) { - const v = timeData[i]; + const v = supportsFloatTimeDomain + ? timeData[i] + : (timeData[i] - 128) / 128; sumSquares += v * v; const abs = Math.abs(v); if (abs > peak) peak = abs; @@ -919,7 +931,13 @@ async function createLocalVoiceStream() { video: false, }; const rawStream = await navigator.mediaDevices.getUserMedia(constraints); - const localStream = await buildAudioPipeline(rawStream); + let localStream = rawStream; + try { + localStream = await buildAudioPipeline(rawStream); + } catch (err) { + console.warn('voice audio pipeline failed, using raw mic stream', err); + state.voice.activeNoiseFilter = 'off'; + } state.voice.rawStream = rawStream; state.voice.localStream = localStream; if (state.voice.muted) { @@ -1067,7 +1085,7 @@ async function joinVoice() { try { await createLocalVoiceStream(); } catch (err) { - console.error("microphone denied", err); + console.error('failed to initialize local voice stream', err); return; } diff --git a/static/app.js b/static/app.js index fa7f533..0295176 100644 --- a/static/app.js +++ b/static/app.js @@ -785,7 +785,8 @@ async function buildAudioPipeline(rawStream) { analyser.fftSize = 1024; processedSource.connect(analyser); - const timeData = new Float32Array(analyser.fftSize); + const supportsFloatTimeDomain = typeof analyser.getFloatTimeDomainData === 'function'; + const timeData = supportsFloatTimeDomain ? new Float32Array(analyser.fftSize) : new Uint8Array(analyser.fftSize); let localIsSpeaking = false; let speechFrames = 0; let silenceFrames = 0; @@ -795,12 +796,23 @@ async function buildAudioPipeline(rawStream) { const checkVolume = () => { if (!state.voice.audioContext || state.voice.audioContext.state === 'closed') return; - analyser.getFloatTimeDomainData(timeData); + try { + if (supportsFloatTimeDomain) { + analyser.getFloatTimeDomainData(timeData); + } else { + analyser.getByteTimeDomainData(timeData); + } + } catch (err) { + setTimeout(checkVolume, 60); + return; + } let sumSquares = 0; let peak = 0; for (let i = 0; i < timeData.length; i++) { - const v = timeData[i]; + const v = supportsFloatTimeDomain + ? timeData[i] + : (timeData[i] - 128) / 128; sumSquares += v * v; const abs = Math.abs(v); if (abs > peak) peak = abs; @@ -868,7 +880,13 @@ async function createLocalVoiceStream() { video: false, }; const rawStream = await navigator.mediaDevices.getUserMedia(constraints); - const localStream = await buildAudioPipeline(rawStream); + let localStream = rawStream; + try { + localStream = await buildAudioPipeline(rawStream); + } catch (err) { + console.warn('voice audio pipeline failed, using raw mic stream', err); + state.voice.activeNoiseFilter = 'off'; + } state.voice.rawStream = rawStream; state.voice.localStream = localStream; if (state.voice.muted) { @@ -1016,7 +1034,7 @@ async function joinVoice() { try { await createLocalVoiceStream(); } catch (err) { - console.error("microphone denied", err); + console.error('failed to initialize local voice stream', err); return; } From 539e2a4ab8d07d06e48152403d1b38b6d0c6becd Mon Sep 17 00:00:00 2001 From: pavel Date: Wed, 25 Feb 2026 19:50:05 +0100 Subject: [PATCH 10/44] fix --- desktop/app.js | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/desktop/app.js b/desktop/app.js index 9f38df5..530bc53 100644 --- a/desktop/app.js +++ b/desktop/app.js @@ -23,7 +23,7 @@ const state = { muted: false, sharingVideo: false, sharingScreen: false, - noiseFilterMode: 'deepfilter', + noiseFilterMode: 'off', activeNoiseFilter: 'off', deepFilterProcessor: null, deepFilterModule: null, @@ -805,8 +805,15 @@ async function buildAudioPipeline(rawStream) { sampleRate: 48000, noiseReductionLevel: 70, }); - await processor.initialize(); - const workletNode = await processor.createAudioWorkletNode(ctx); + const timeoutMs = 2500; + const withTimeout = (promise, label) => + Promise.race([ + promise, + new Promise((_, reject) => setTimeout(() => reject(new Error(`${label} timed out`)), timeoutMs)), + ]); + + await withTimeout(processor.initialize(), "DeepFilter initialize"); + const workletNode = await withTimeout(processor.createAudioWorkletNode(ctx), "DeepFilter worklet"); processor.setNoiseSuppressionEnabled(true); state.voice.deepFilterProcessor = processor; source.connect(workletNode); From 6f9c24ac606725c78ad0b31ab772d6268a117f98 Mon Sep 17 00:00:00 2001 From: pavel Date: Wed, 25 Feb 2026 19:50:10 +0100 Subject: [PATCH 11/44] a --- static/app.js | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/static/app.js b/static/app.js index 0295176..bad7f22 100644 --- a/static/app.js +++ b/static/app.js @@ -23,7 +23,7 @@ const state = { muted: false, sharingVideo: false, sharingScreen: false, - noiseFilterMode: 'deepfilter', + noiseFilterMode: 'off', activeNoiseFilter: 'off', deepFilterProcessor: null, deepFilterModule: null, @@ -767,8 +767,15 @@ async function buildAudioPipeline(rawStream) { sampleRate: 48000, noiseReductionLevel: 70, }); - await processor.initialize(); - const workletNode = await processor.createAudioWorkletNode(ctx); + const timeoutMs = 2500; + const withTimeout = (promise, label) => + Promise.race([ + promise, + new Promise((_, reject) => setTimeout(() => reject(new Error(`${label} timed out`)), timeoutMs)), + ]); + + await withTimeout(processor.initialize(), "DeepFilter initialize"); + const workletNode = await withTimeout(processor.createAudioWorkletNode(ctx), "DeepFilter worklet"); processor.setNoiseSuppressionEnabled(true); state.voice.deepFilterProcessor = processor; source.connect(workletNode); From 270785a21f5ef8fadd029c455bfeaa317fd6e0fa Mon Sep 17 00:00:00 2001 From: pavel Date: Thu, 26 Feb 2026 00:13:15 +0100 Subject: [PATCH 12/44] fiiix --- desktop/app.js | 166 ++++++++++++++++++++++++++---------- desktop/index.html | 2 +- static/app.js | 203 ++++++++++++++++++++++++++++++--------------- static/index.html | 2 +- 4 files changed, 256 insertions(+), 117 deletions(-) diff --git a/desktop/app.js b/desktop/app.js index 530bc53..7dc4d8f 100644 --- a/desktop/app.js +++ b/desktop/app.js @@ -23,8 +23,6 @@ const state = { muted: false, sharingVideo: false, sharingScreen: false, - noiseFilterMode: 'off', - activeNoiseFilter: 'off', deepFilterProcessor: null, deepFilterModule: null, viewMode: 'chat', // 'chat' or 'video' @@ -388,7 +386,12 @@ function renderChannels() { renderDMs(); updateView(); updateHeaderLabels(); - joinVoice(); + try { + await joinVoice(); + } catch (err) { + console.error("joinVoice failed from channel click", err); + alert(`Voice join failed: ${err?.message || err}`); + } } if (window.innerWidth <= 768) closeMobileMenus(); }; @@ -723,7 +726,6 @@ function stopAndClearAudioPipeline() { state.voice.localStream = null; state.voice.rawStream = null; state.voice.audioContext = null; - state.voice.activeNoiseFilter = 'off'; } function stopAndClearVideoPipeline() { @@ -796,34 +798,25 @@ async function buildAudioPipeline(rawStream) { state.voice.audioContext = ctx; const source = ctx.createMediaStreamSource(rawStream); let processedSource = source; - state.voice.activeNoiseFilter = 'off'; - if (state.voice.noiseFilterMode === 'deepfilter') { - try { - const deepFilter = await getDeepFilterModule(); - const processor = new deepFilter.DeepFilterNet3Core({ - sampleRate: 48000, - noiseReductionLevel: 70, - }); - const timeoutMs = 2500; - const withTimeout = (promise, label) => - Promise.race([ - promise, - new Promise((_, reject) => setTimeout(() => reject(new Error(`${label} timed out`)), timeoutMs)), - ]); - - await withTimeout(processor.initialize(), "DeepFilter initialize"); - const workletNode = await withTimeout(processor.createAudioWorkletNode(ctx), "DeepFilter worklet"); - processor.setNoiseSuppressionEnabled(true); - state.voice.deepFilterProcessor = processor; - source.connect(workletNode); - processedSource = workletNode; - state.voice.activeNoiseFilter = 'deepfilter'; - } catch (err) { - console.warn("DeepFilterNet3 unavailable, falling back to raw mic audio", err); - state.voice.activeNoiseFilter = 'off'; - } + try { + const deepFilter = await getDeepFilterModule(); + const processor = new deepFilter.DeepFilterNet3Core({ + sampleRate: 48000, + noiseReductionLevel: 70, + }); + await processor.initialize(); + const workletNode = await processor.createAudioWorkletNode(ctx); + processor.setNoiseSuppressionEnabled(true); + source.connect(workletNode); + processedSource = workletNode; + state.voice.deepFilterProcessor = processor; + console.info('DeepFilterNet3 enabled'); + } catch (err) { + console.warn('DeepFilterNet3 unavailable, falling back to raw mic audio', err); + state.voice.deepFilterProcessor = null; } + // Metering/Speaking detection with adaptive threshold and hysteresis. const analyser = ctx.createAnalyser(); analyser.fftSize = 1024; @@ -913,7 +906,7 @@ async function buildAudioPipeline(rawStream) { function resolveDeepFilterModuleUrl() { if (location.protocol === 'file:') { - return new URL('vendor/deepfilternet3-noise-filter.esm.js', location.href).toString(); + return new URL('./vendor/deepfilternet3-noise-filter.esm.js', location.href).toString(); } return '/static/vendor/deepfilternet3-noise-filter.esm.js'; } @@ -926,13 +919,12 @@ async function getDeepFilterModule() { } async function createLocalVoiceStream() { - const useDeepFilter = state.voice.noiseFilterMode === 'deepfilter'; const constraints = { audio: { channelCount: 1, sampleRate: 48000, echoCancellation: true, - noiseSuppression: !useDeepFilter, + noiseSuppression: false, autoGainControl: false, }, video: false, @@ -943,8 +935,7 @@ async function createLocalVoiceStream() { localStream = await buildAudioPipeline(rawStream); } catch (err) { console.warn('voice audio pipeline failed, using raw mic stream', err); - state.voice.activeNoiseFilter = 'off'; - } + } state.voice.rawStream = rawStream; state.voice.localStream = localStream; if (state.voice.muted) { @@ -1049,6 +1040,26 @@ function ensurePeerConnection(peerId) { return pc; } +async function attachLocalAudioToPeerConnections() { + if (!state.voice.localStream) return; + const localTrack = state.voice.localStream.getAudioTracks()[0]; + if (!localTrack) return; + + await Promise.all( + Array.from(state.voice.peerConnections.values()).map(async (pc) => { + const audioTransceiver = pc.getTransceivers().find((t) => t.receiver?.track?.kind === 'audio'); + if (audioTransceiver?.sender) { + await audioTransceiver.sender.replaceTrack(localTrack); + if (audioTransceiver.direction === 'recvonly') { + audioTransceiver.direction = 'sendrecv'; + } + } else { + pc.addTrack(localTrack, state.voice.localStream); + } + }) + ); +} + async function handleSignal(fromPeerId, kind, data) { const pc = ensurePeerConnection(fromPeerId); @@ -1084,25 +1095,71 @@ async function handleSignal(fromPeerId, kind, data) { } async function joinVoice() { - if (!state.selectedVoiceChannelId) return; - if (state.voice.joinedChannelId === state.selectedVoiceChannelId) return; - - await leaveVoice(); - - try { - await createLocalVoiceStream(); - } catch (err) { - console.error('failed to initialize local voice stream', err); + if (!state.selectedVoiceChannelId) { + alert('No voice channel selected.'); + return; + } + if (state.voice.joinedChannelId === state.selectedVoiceChannelId && + state.voice.ws && + state.voice.ws.readyState === WebSocket.OPEN) { return; } + await leaveVoice(); + + el.voiceConnection.classList.remove('hidden'); + el.vcChannelName.textContent = 'Connecting...'; + const ws = new WebSocket(getVoiceWsUrl(state.selectedVoiceChannelId)); + const currentWs = ws; + let wsOpened = false; + let micUnavailable = false; + state.voice.ws = ws; state.voice.joinedChannelId = state.selectedVoiceChannelId; + // Start mic setup in parallel so channel join is not blocked by device init. + createLocalVoiceStream() + .then(async () => { + if (state.voice.ws !== currentWs) { + stopAndClearAudioPipeline(); + return; + } + try { + await attachLocalAudioToPeerConnections(); + } catch (err) { + console.warn('failed to attach local audio to existing peer connections', err); + } + }) + .catch((err) => { + micUnavailable = true; + console.warn('failed to initialize local voice stream, joining as listen-only', err); + state.voice.localStream = null; + state.voice.rawStream = null; + if (state.voice.audioContext) { + state.voice.audioContext.close().catch(() => { }); + state.voice.audioContext = null; + } + }); + + const connectTimer = setTimeout(() => { + if (!wsOpened && state.voice.ws === currentWs) { + console.error('voice websocket connect timeout'); + try { currentWs.close(); } catch (_) { } + el.vcChannelName.textContent = 'Connection timeout'; + alert('Could not connect to voice channel (timeout). Please try again.'); + } + }, 5000); + ws.onopen = () => { + if (state.voice.ws !== currentWs) return; + wsOpened = true; + clearTimeout(connectTimer); const channel = state.channels.find(c => c.id === state.selectedVoiceChannelId); el.vcChannelName.textContent = channel ? channel.name : "Voice"; + if (micUnavailable) { + console.warn('Voice joined in listen-only mode because microphone is unavailable.'); + } el.voiceConnection.classList.remove("hidden"); el.soundboard.classList.remove("hidden"); playSound('join'); @@ -1111,6 +1168,7 @@ async function joinVoice() { }; ws.onmessage = async (event) => { + if (state.voice.ws !== currentWs) return; const msg = JSON.parse(event.data); if (msg.type === "peers") { for (const peer of msg.peers) { @@ -1153,8 +1211,24 @@ async function joinVoice() { refreshVoicePresence().catch(() => { }); }; - ws.onclose = () => { - el.voiceConnection.classList.add("hidden"); + ws.onerror = (event) => { + if (state.voice.ws !== currentWs) return; + console.error('voice websocket error', event); + el.vcChannelName.textContent = 'Connection failed'; + }; + + ws.onclose = (event) => { + if (state.voice.ws !== currentWs) return; + clearTimeout(connectTimer); + if (!wsOpened) { + console.error('voice websocket closed before open', event.code, event.reason); + const code = event && typeof event.code === 'number' ? event.code : 'unknown'; + el.vcChannelName.textContent = `Connection failed (${code})`; + alert(`Voice connection failed (code ${code}).`); + } + if (wsOpened) { + el.voiceConnection.classList.add("hidden"); + } el.soundboard.classList.add("hidden"); for (const pc of state.voice.peerConnections.values()) pc.close(); state.voice.peerConnections.clear(); diff --git a/desktop/index.html b/desktop/index.html index 2bd8957..28521c9 100644 --- a/desktop/index.html +++ b/desktop/index.html @@ -260,7 +260,7 @@ - + diff --git a/static/app.js b/static/app.js index bad7f22..0996318 100644 --- a/static/app.js +++ b/static/app.js @@ -23,8 +23,6 @@ const state = { muted: false, sharingVideo: false, sharingScreen: false, - noiseFilterMode: 'off', - activeNoiseFilter: 'off', deepFilterProcessor: null, deepFilterModule: null, viewMode: 'chat', // 'chat' or 'video' @@ -341,7 +339,12 @@ function renderChannels() { renderDMs(); updateView(); updateHeaderLabels(); - joinVoice(); + try { + await joinVoice(); + } catch (err) { + console.error("joinVoice failed from channel click", err); + alert(`Voice join failed: ${err?.message || err}`); + } } if (window.innerWidth <= 768) closeMobileMenus(); }; @@ -671,7 +674,6 @@ function stopAndClearAudioPipeline() { state.voice.localStream = null; state.voice.rawStream = null; state.voice.audioContext = null; - state.voice.activeNoiseFilter = 'off'; } function stopAndClearVideoPipeline() { @@ -739,52 +741,28 @@ function renderVideo(peerId, displayName, stream, source) { videoEl.srcObject = stream; } -function resolveDeepFilterModuleUrl() { - if (location.protocol === 'file:') { - return new URL('vendor/deepfilternet3-noise-filter.esm.js', location.href).toString(); - } - return '/static/vendor/deepfilternet3-noise-filter.esm.js'; -} - -async function getDeepFilterModule() { - if (state.voice.deepFilterModule) return state.voice.deepFilterModule; - const moduleUrl = resolveDeepFilterModuleUrl(); - state.voice.deepFilterModule = await import(moduleUrl); - return state.voice.deepFilterModule; -} - async function buildAudioPipeline(rawStream) { const ctx = new AudioContext(); state.voice.audioContext = ctx; const source = ctx.createMediaStreamSource(rawStream); let processedSource = source; - state.voice.activeNoiseFilter = 'off'; - if (state.voice.noiseFilterMode === 'deepfilter') { - try { - const deepFilter = await getDeepFilterModule(); - const processor = new deepFilter.DeepFilterNet3Core({ - sampleRate: 48000, - noiseReductionLevel: 70, - }); - const timeoutMs = 2500; - const withTimeout = (promise, label) => - Promise.race([ - promise, - new Promise((_, reject) => setTimeout(() => reject(new Error(`${label} timed out`)), timeoutMs)), - ]); - - await withTimeout(processor.initialize(), "DeepFilter initialize"); - const workletNode = await withTimeout(processor.createAudioWorkletNode(ctx), "DeepFilter worklet"); - processor.setNoiseSuppressionEnabled(true); - state.voice.deepFilterProcessor = processor; - source.connect(workletNode); - processedSource = workletNode; - state.voice.activeNoiseFilter = 'deepfilter'; - } catch (err) { - console.warn("DeepFilterNet3 unavailable, falling back to raw mic audio", err); - state.voice.activeNoiseFilter = 'off'; - } + try { + const deepFilter = await getDeepFilterModule(); + const processor = new deepFilter.DeepFilterNet3Core({ + sampleRate: 48000, + noiseReductionLevel: 70, + }); + await processor.initialize(); + const workletNode = await processor.createAudioWorkletNode(ctx); + processor.setNoiseSuppressionEnabled(true); + source.connect(workletNode); + processedSource = workletNode; + state.voice.deepFilterProcessor = processor; + console.info('DeepFilterNet3 enabled'); + } catch (err) { + console.warn('DeepFilterNet3 unavailable, falling back to raw mic audio', err); + state.voice.deepFilterProcessor = null; } // Metering/Speaking detection with adaptive threshold and hysteresis. @@ -803,7 +781,7 @@ async function buildAudioPipeline(rawStream) { const checkVolume = () => { if (!state.voice.audioContext || state.voice.audioContext.state === 'closed') return; - try { + try { if (supportsFloatTimeDomain) { analyser.getFloatTimeDomainData(timeData); } else { @@ -817,9 +795,7 @@ async function buildAudioPipeline(rawStream) { let sumSquares = 0; let peak = 0; for (let i = 0; i < timeData.length; i++) { - const v = supportsFloatTimeDomain - ? timeData[i] - : (timeData[i] - 128) / 128; + const v = supportsFloatTimeDomain ? timeData[i] : (timeData[i] - 128) / 128; sumSquares += v * v; const abs = Math.abs(v); if (abs > peak) peak = abs; @@ -830,10 +806,8 @@ async function buildAudioPipeline(rawStream) { levelEma = levelEma * 0.75 + level * 0.25; if (!localIsSpeaking) { - // Learn room noise slowly while idle. noiseFloor = noiseFloor * 0.98 + levelEma * 0.02; } else { - // Do not let noise floor jump up while speaking. noiseFloor = Math.min(noiseFloor, levelEma); } @@ -849,21 +823,17 @@ async function buildAudioPipeline(rawStream) { } const newSpeakingState = localIsSpeaking ? silenceFrames < 3 : speechFrames >= 2; - if (newSpeakingState !== localIsSpeaking) { localIsSpeaking = newSpeakingState; if (state.voice.ws && state.voice.ws.readyState === WebSocket.OPEN) { state.voice.ws.send(JSON.stringify({ type: 'set_speaking_status', is_speaking: localIsSpeaking })); } - // Local UI update state.voicePresence.get(state.selectedVoiceChannelId)?.forEach(p => { if (p.user_id === state.me.id) p.is_speaking = localIsSpeaking; }); renderChannels(); const myVideo = document.getElementById(`video-${state.me.id}-camera`) || document.getElementById(`video-${state.me.id}-screen`); - if (myVideo) { - myVideo.parentElement.classList.toggle('speaking', localIsSpeaking); - } + if (myVideo) myVideo.parentElement.classList.toggle('speaking', localIsSpeaking); } setTimeout(checkVolume, 60); }; @@ -874,14 +844,27 @@ async function buildAudioPipeline(rawStream) { return destination.stream; } +function resolveDeepFilterModuleUrl() { + if (location.protocol === 'file:') { + return new URL('./vendor/deepfilternet3-noise-filter.esm.js', location.href).toString(); + } + return '/static/vendor/deepfilternet3-noise-filter.esm.js'; +} + +async function getDeepFilterModule() { + if (state.voice.deepFilterModule) return state.voice.deepFilterModule; + const moduleUrl = resolveDeepFilterModuleUrl(); + state.voice.deepFilterModule = await import(moduleUrl); + return state.voice.deepFilterModule; +} + async function createLocalVoiceStream() { - const useDeepFilter = state.voice.noiseFilterMode === 'deepfilter'; const constraints = { audio: { channelCount: 1, sampleRate: 48000, echoCancellation: true, - noiseSuppression: !useDeepFilter, + noiseSuppression: false, autoGainControl: false, }, video: false, @@ -892,7 +875,6 @@ async function createLocalVoiceStream() { localStream = await buildAudioPipeline(rawStream); } catch (err) { console.warn('voice audio pipeline failed, using raw mic stream', err); - state.voice.activeNoiseFilter = 'off'; } state.voice.rawStream = rawStream; state.voice.localStream = localStream; @@ -998,6 +980,26 @@ function ensurePeerConnection(peerId) { return pc; } +async function attachLocalAudioToPeerConnections() { + if (!state.voice.localStream) return; + const localTrack = state.voice.localStream.getAudioTracks()[0]; + if (!localTrack) return; + + await Promise.all( + Array.from(state.voice.peerConnections.values()).map(async (pc) => { + const audioTransceiver = pc.getTransceivers().find((t) => t.receiver?.track?.kind === 'audio'); + if (audioTransceiver?.sender) { + await audioTransceiver.sender.replaceTrack(localTrack); + if (audioTransceiver.direction === 'recvonly') { + audioTransceiver.direction = 'sendrecv'; + } + } else { + pc.addTrack(localTrack, state.voice.localStream); + } + }) + ); +} + async function handleSignal(fromPeerId, kind, data) { const pc = ensurePeerConnection(fromPeerId); @@ -1033,25 +1035,71 @@ async function handleSignal(fromPeerId, kind, data) { } async function joinVoice() { - if (!state.selectedVoiceChannelId) return; - if (state.voice.joinedChannelId === state.selectedVoiceChannelId) return; - - await leaveVoice(); - - try { - await createLocalVoiceStream(); - } catch (err) { - console.error('failed to initialize local voice stream', err); + if (!state.selectedVoiceChannelId) { + alert('No voice channel selected.'); + return; + } + if (state.voice.joinedChannelId === state.selectedVoiceChannelId && + state.voice.ws && + state.voice.ws.readyState === WebSocket.OPEN) { return; } + await leaveVoice(); + + el.voiceConnection.classList.remove('hidden'); + el.vcChannelName.textContent = 'Connecting...'; + const ws = new WebSocket(getVoiceWsUrl(state.selectedVoiceChannelId)); + const currentWs = ws; + let wsOpened = false; + let micUnavailable = false; + state.voice.ws = ws; state.voice.joinedChannelId = state.selectedVoiceChannelId; + // Start mic setup in parallel so channel join is not blocked by device init. + createLocalVoiceStream() + .then(async () => { + if (state.voice.ws !== currentWs) { + stopAndClearAudioPipeline(); + return; + } + try { + await attachLocalAudioToPeerConnections(); + } catch (err) { + console.warn('failed to attach local audio to existing peer connections', err); + } + }) + .catch((err) => { + micUnavailable = true; + console.warn('failed to initialize local voice stream, joining as listen-only', err); + state.voice.localStream = null; + state.voice.rawStream = null; + if (state.voice.audioContext) { + state.voice.audioContext.close().catch(() => { }); + state.voice.audioContext = null; + } + }); + + const connectTimer = setTimeout(() => { + if (!wsOpened && state.voice.ws === currentWs) { + console.error('voice websocket connect timeout'); + try { currentWs.close(); } catch (_) { } + el.vcChannelName.textContent = 'Connection timeout'; + alert('Could not connect to voice channel (timeout). Please try again.'); + } + }, 5000); + ws.onopen = () => { + if (state.voice.ws !== currentWs) return; + wsOpened = true; + clearTimeout(connectTimer); const channel = state.channels.find(c => c.id === state.selectedVoiceChannelId); el.vcChannelName.textContent = channel ? channel.name : "Voice"; + if (micUnavailable) { + console.warn('Voice joined in listen-only mode because microphone is unavailable.'); + } el.voiceConnection.classList.remove("hidden"); el.soundboard.classList.remove("hidden"); playSound('join'); @@ -1060,6 +1108,7 @@ async function joinVoice() { }; ws.onmessage = async (event) => { + if (state.voice.ws !== currentWs) return; const msg = JSON.parse(event.data); if (msg.type === "peers") { for (const peer of msg.peers) { @@ -1102,8 +1151,24 @@ async function joinVoice() { refreshVoicePresence().catch(() => { }); }; - ws.onclose = () => { - el.voiceConnection.classList.add("hidden"); + ws.onerror = (event) => { + if (state.voice.ws !== currentWs) return; + console.error('voice websocket error', event); + el.vcChannelName.textContent = 'Connection failed'; + }; + + ws.onclose = (event) => { + if (state.voice.ws !== currentWs) return; + clearTimeout(connectTimer); + if (!wsOpened) { + console.error('voice websocket closed before open', event.code, event.reason); + const code = event && typeof event.code === 'number' ? event.code : 'unknown'; + el.vcChannelName.textContent = `Connection failed (${code})`; + alert(`Voice connection failed (code ${code}).`); + } + if (wsOpened) { + el.voiceConnection.classList.add("hidden"); + } el.soundboard.classList.add("hidden"); for (const pc of state.voice.peerConnections.values()) pc.close(); state.voice.peerConnections.clear(); diff --git a/static/index.html b/static/index.html index de07abc..939922b 100644 --- a/static/index.html +++ b/static/index.html @@ -265,7 +265,7 @@ - + From ac0570b82ccf7cae7507d938071737f86e960a67 Mon Sep 17 00:00:00 2001 From: pavel Date: Thu, 26 Feb 2026 00:20:51 +0100 Subject: [PATCH 13/44] yes --- desktop/app.js | 10 ++++++++++ .../v2/models/DeepFilterNet3_onnx.tar.gz | Bin 0 -> 7983136 bytes .../vendor/deepfilternet3/v2/pkg/df_bg.wasm | Bin 0 -> 9205296 bytes static/app.js | 10 ++++++++++ static/index.html | 2 +- .../v2/models/DeepFilterNet3_onnx.tar.gz | Bin 0 -> 7983136 bytes .../vendor/deepfilternet3/v2/pkg/df_bg.wasm | Bin 0 -> 9205296 bytes 7 files changed, 21 insertions(+), 1 deletion(-) create mode 100644 desktop/vendor/deepfilternet3/v2/models/DeepFilterNet3_onnx.tar.gz create mode 100644 desktop/vendor/deepfilternet3/v2/pkg/df_bg.wasm create mode 100644 static/vendor/deepfilternet3/v2/models/DeepFilterNet3_onnx.tar.gz create mode 100644 static/vendor/deepfilternet3/v2/pkg/df_bg.wasm diff --git a/desktop/app.js b/desktop/app.js index 7dc4d8f..5900b47 100644 --- a/desktop/app.js +++ b/desktop/app.js @@ -804,6 +804,9 @@ async function buildAudioPipeline(rawStream) { const processor = new deepFilter.DeepFilterNet3Core({ sampleRate: 48000, noiseReductionLevel: 70, + assetConfig: { + cdnUrl: resolveDeepFilterAssetsBaseUrl(), + }, }); await processor.initialize(); const workletNode = await processor.createAudioWorkletNode(ctx); @@ -911,6 +914,13 @@ function resolveDeepFilterModuleUrl() { return '/static/vendor/deepfilternet3-noise-filter.esm.js'; } +function resolveDeepFilterAssetsBaseUrl() { + if (location.protocol === 'file:') { + return new URL('./vendor/deepfilternet3', location.href).toString(); + } + return '/static/vendor/deepfilternet3'; +} + async function getDeepFilterModule() { if (state.voice.deepFilterModule) return state.voice.deepFilterModule; const moduleUrl = resolveDeepFilterModuleUrl(); diff --git a/desktop/vendor/deepfilternet3/v2/models/DeepFilterNet3_onnx.tar.gz b/desktop/vendor/deepfilternet3/v2/models/DeepFilterNet3_onnx.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..1c4f4ffe1015fbb4541433cf291234ca32338871 GIT binary patch literal 7983136 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%0D(95|lEIlK{>c}NnncNIT%8TK8 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